Enlightenment CVS committal

Author  : rbdpngn
Project : e17
Module  : libs/ewl

Dir     : e17/libs/ewl/src/lib


Modified Files:
        ewl_fileselector.c ewl_fileselector.h 


Log Message:
Add a directory filter field to match separately from files.
Simplified directory and file list building.
Fixed some memleaks in the fileselector.

===================================================================
RCS file: /cvsroot/enlightenment/e17/libs/ewl/src/lib/ewl_fileselector.c,v
retrieving revision 1.11
retrieving revision 1.12
diff -u -3 -r1.11 -r1.12
--- ewl_fileselector.c  28 Mar 2005 07:04:28 -0000      1.11
+++ ewl_fileselector.c  27 Apr 2005 14:01:27 -0000      1.12
@@ -19,12 +19,15 @@
 static char *ewl_fileselector_path_home_get(void);
 static char *ewl_fileselector_size_string_get(off_t st_size);
 static char *ewl_fileselector_perm_string_get(mode_t st_mode);
-static void ewl_fileselector_file_list_get(char *path, char *filter, 
+static void ewl_fileselector_file_list_get(char *path, char *filter,
+                                          char *dfilter,
                                           Ecore_List *flist,
                                           Ecore_List *dlist);
 static void ewl_fileselector_path_setup(Ewl_Fileselector *fs, char *path);
 static void ewl_fileselector_show_cb(Ewl_Widget *entry, void *ev_data,
                                        void *user_data);
+static void ewl_fileselector_destroy_cb(Ewl_Widget *entry, void *ev_data,
+                                       void *user_data);
 static void ewl_fileselector_dir_data_cleanup_cb(Ewl_Widget *entry, 
                                        void *ev_data, void *user_data);
 static void ewl_fileselector_file_data_cleanup_cb(Ewl_Widget *entry, 
@@ -87,6 +90,8 @@
                                   EWL_FLAG_FILL_HFILL);
        ewl_callback_append(w, EWL_CALLBACK_SHOW,
                            ewl_fileselector_show_cb, NULL);
+       ewl_callback_append(w, EWL_CALLBACK_DESTROY,
+                           ewl_fileselector_destroy_cb, NULL);
 
 
        /* The entry for the current directory */
@@ -204,6 +209,7 @@
                ewl_widget_show(hbox);
        }
 
+       fs->dfilter = strdup("^[^\\.][^$]");
        tmp = getenv("HOME");
        fs->path = strdup((tmp ? tmp : "/"));
 
@@ -405,10 +411,11 @@
        return perm;
 }
 
-static void ewl_fileselector_file_list_get(char *path, char *filter, 
-                               Ecore_List * flist, Ecore_List * dlist)
+static void ewl_fileselector_file_list_get(char *path, char *filter,
+                               char *dfilter, Ecore_List * flist,
+                               Ecore_List * dlist)
 {
-       regex_t preg;
+       regex_t freg, dreg;
        Ewl_Fileselector_Data *d;
        struct dirent *lecture;
        DIR *rep;
@@ -418,10 +425,15 @@
        int len;
 
        if (filter) {
-               if (regcomp(&preg, filter, REG_NOSUB | REG_EXTENDED))
+               if (regcomp(&freg, filter, REG_NOSUB | REG_EXTENDED))
                        filter = NULL;
        }
 
+       if (dfilter) {
+               if (regcomp(&dreg, dfilter, REG_NOSUB | REG_EXTENDED))
+                       dfilter = NULL;
+       }
+
        /* Check if path is finished by a / and add it if there's none */
        if (path[strlen(path) - 1] == '/')
                path2 = strdup(path);
@@ -438,49 +450,64 @@
                DRETURN(DLEVEL_STABLE);
        }
 
+       /* Loop over all listings in the directory to build both lists */
        while ((lecture = readdir(rep))) {
                int match = 0;
+               Ecore_List *add = NULL;
+               regex_t *reg;
 
-               if (!(strcmp(lecture->d_name, "..")))
-                       match = 1;
-               else if (strcmp(lecture->d_name, ".")) {
-                       if (filter && !regexec(&preg, lecture->d_name, 0,
-                                               NULL, 0))
-                               match = 1;
+               /* Skip over the simple case early */
+               if (!strcmp(lecture->d_name,"..") && !strcmp(path,"/"))
+                       continue;
+
+               /* Setup a ful path copy to the listing */
+               len = strlen(path2) + strlen(lecture->d_name) + 1;
+               name = (char *) malloc(sizeof(char) * len);
+               memcpy(name, path2, strlen(path2));
+               memcpy(name + strlen(path2),
+                      lecture->d_name, strlen(lecture->d_name));
+               name[len - 1] = '\0';
+
+               /* Set to NULL before determining the type of the listing */
+               reg = NULL;
+               if (stat(name, &buf) == 0) {
+                       /* Determine the file or directory match */
+                       if (S_ISDIR(buf.st_mode) && dlist) {
+                               add = dlist;
+                               if (dfilter)
+                                       reg = &dreg;
+                       }
+                       else {
+                               add = flist;
+                               if (filter)
+                                       reg = &freg;
+                       }
                }
 
-               if (match) {
-                       len = strlen(path2) + strlen(lecture->d_name) + 1;
-                       name = (char *) malloc(sizeof(char) * len);
-                       memcpy(name, path2, strlen(path2));
-                       memcpy(name + strlen(path2),
-                              lecture->d_name, strlen(lecture->d_name));
-                       name[len - 1] = '\0';
-                       if(!strcmp(lecture->d_name,"..")&&!strcmp(path,"/"))
-                               continue;
-                       if (stat(name, &buf) == 0) {
-                               if (S_ISDIR(buf.st_mode) && dlist) {
-                                       d = 
ewl_fileselector_data_new(lecture->d_name,
-                                                           buf.st_size,
-                                                           buf.st_mtime,
-                                                           buf.st_mode);
-                                       ecore_list_append(dlist, d);
-                               } else if (flist) {
-                                       d = 
ewl_fileselector_data_new(lecture->d_name,
-                                                           buf.st_size,
-                                                           buf.st_mtime,
-                                                           buf.st_mode);
-                                       ecore_list_append(flist, d);
-                               }
-                       }
+               /* Determine if this item should be listed */
+               if (!strcmp(lecture->d_name, ".."))
+                       match = 1;
+               else if (reg && !regexec(reg, lecture->d_name, 0, NULL, 0))
+                       match = 1;
 
-                       free(name);
+               /* File matches so add it to the listing */
+               if (match && add) {
+                       d = ewl_fileselector_data_new(lecture->d_name,
+                                                     buf.st_size,
+                                                     buf.st_mtime,
+                                                     buf.st_mode);
+                       ecore_list_append(add, d);
                }
+
+               free(name);
        }
-       closedir(rep);
 
+       /* Clean up temporary variables */
+       closedir(rep);
        if (filter)
-               regfree(&preg);
+               regfree(&freg);
+       if (dfilter)
+               regfree(&dreg);
        free(path2);
 
        return;
@@ -498,6 +525,16 @@
 }
 
 void
+ewl_fileselector_destroy_cb(Ewl_Widget * w, void *ev_data __UNUSED__,
+                                       void *user_data __UNUSED__)
+{
+       Ewl_Fileselector *fs = EWL_FILESELECTOR(w);
+       IF_FREE(fs->path);
+       IF_FREE(fs->file);
+       IF_FREE(fs->dfilter);
+}
+
+void
 ewl_fileselector_tooltip_destroy_cb(Ewl_Widget *w __UNUSED__,
                                        void *ev_data __UNUSED__,
                                        void *user_data)
@@ -602,7 +639,7 @@
 
        files = ecore_list_new();
        dirs = ecore_list_new();
-       ewl_fileselector_file_list_get(path2, filter, files, dirs);
+       ewl_fileselector_file_list_get(path2, filter, fs->dfilter, files, dirs);
 
        parent_win = EWL_WIDGET(ewl_embed_widget_find(EWL_WIDGET(fs)));
        cont = ewl_container_redirect_get(EWL_CONTAINER(parent_win));
===================================================================
RCS file: /cvsroot/enlightenment/e17/libs/ewl/src/lib/ewl_fileselector.h,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -3 -r1.6 -r1.7
--- ewl_fileselector.h  17 Mar 2005 05:48:09 -0000      1.6
+++ ewl_fileselector.h  27 Apr 2005 14:01:28 -0000      1.7
@@ -45,8 +45,9 @@
        Ewl_Widget    *entry_file;
        Ewl_Widget    *entry_filter;
   
-       char          *path;  /* current fileselector path */
-       char          *file;  /* current selected item in the fileselector */
+       char          *path;    /* current fileselector path */
+       char          *file;    /* current selected item in the fileselector */
+       char          *dfilter; /* current filter to apply to directories */
 };
 
 




-------------------------------------------------------
SF.Net email is sponsored by: Tell us your software development plans!
Take this survey and enter to win a one-year sub to SourceForge.net
Plus IDC's 2005 look-ahead and a copy of this survey
Click here to start!  http://www.idcswdc.com/cgi-bin/survey?id=105hix
_______________________________________________
enlightenment-cvs mailing list
enlightenment-cvs@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/enlightenment-cvs

Reply via email to