Enlightenment CVS committal

Author  : raster
Project : e17
Module  : apps/e

Dir     : e17/apps/e/src/bin


Modified Files:
        e_exebuf.c e_main.c 


Log Message:


lord of the caches: fellowship of the exe cache file. how to get what is most
likely an up-to-date list of all executables in $PATH as fast as possible and
then in the background build a new list from files and if this list does not
match the cached list once built, throw away the old cache file and write out
a new one. :) this should be about the best of all worlds - instaant exebuf
appearance and storing previously discovered info as well as never hanging
"solid". there is a chance the data you have is incomplete or out of date -
but thats better than the wm just hanging there for 10 seconds while disk IO
thrashes.

===================================================================
RCS file: /cvsroot/enlightenment/e17/apps/e/src/bin/e_exebuf.c,v
retrieving revision 1.13
retrieving revision 1.14
diff -u -3 -r1.13 -r1.14
--- e_exebuf.c  6 Feb 2006 03:43:50 -0000       1.13
+++ e_exebuf.c  6 Feb 2006 08:06:18 -0000       1.14
@@ -16,6 +16,19 @@
    char        *file;
 };
 
+typedef struct _E_Exe E_Exe;
+typedef struct _E_Exe_List E_Exe_List;
+
+struct _E_Exe
+{
+   char *path;
+};
+
+struct _E_Exe_List
+{
+   Evas_List *list;
+};
+
 static void _e_exebuf_exe_free(E_Exebuf_Exe *exe);
 static void _e_exebuf_matches_clear(void);
 static int _e_exebuf_cb_sort_eap(void *data1, void *data2);
@@ -41,6 +54,8 @@
 static int _e_exebuf_idler(void *data);
 
 /* local subsystem globals */
+static E_Config_DD *exelist_exe_edd = NULL;
+static E_Config_DD *exelist_edd = NULL;
 static E_Popup *exebuf = NULL;
 static Evas_Object *bg_object = NULL;
 static Evas_Object *icon_object = NULL;
@@ -54,6 +69,7 @@
 static Evas_List *exe_path = NULL;
 static DIR       *exe_dir = NULL;
 static Evas_List *exe_list = NULL;
+static Evas_List *exe_list2 = NULL;
 static Ecore_Idler *exe_list_idler = NULL;
 static Evas_List *exes = NULL;
 static Evas_List *eaps = NULL;
@@ -78,12 +94,28 @@
 EAPI int
 e_exebuf_init(void)
 {
+   exelist_exe_edd = E_CONFIG_DD_NEW("E_Exe", E_Exe);
+#undef T
+#undef D
+#define T E_Exe
+#define D exelist_exe_edd
+   E_CONFIG_VAL(D, T, path, STR);
+   
+   exelist_edd = E_CONFIG_DD_NEW("E_Exe_List", E_Exe_List);
+#undef T
+#undef D
+#define T E_Exe_List
+#define D exelist_edd
+   E_CONFIG_LIST(D, T, list, exelist_exe_edd);
+   
    return 1;
 }
 
 EAPI int
 e_exebuf_shutdown(void)
 {
+   E_CONFIG_DD_FREE(exelist_edd);
+   E_CONFIG_DD_FREE(exelist_exe_edd);
    e_exebuf_hide();
    return 1;
 }
@@ -95,6 +127,7 @@
    int x, y, w, h;
    Evas_Coord mw, mh;
    char *path, *p, *last;
+   E_Exe_List *el;
    
    E_OBJECT_CHECK_RETURN(zone, 0);
    E_OBJECT_TYPE_CHECK_RETURN(zone, E_ZONE_TYPE, 0);
@@ -184,6 +217,21 @@
      (handlers, ecore_event_handler_add
       (ECORE_X_EVENT_MOUSE_WHEEL, _e_exebuf_cb_mouse_wheel, NULL));
 
+   el = e_config_domain_load("exebuf_exelist_cache", exelist_edd);
+   if (el)
+     {
+       while (el->list)
+         {
+            E_Exe *ee;
+            
+            ee = el->list->data;
+            exe_list = evas_list_append(exe_list, strdup(ee->path));
+            evas_stringshare_del(ee->path);
+            free(ee);
+            el->list = evas_list_remove_list(el->list, el->list);
+         }
+       free(el);
+     }
    path = getenv("PATH");
    if (path)
      {
@@ -268,6 +316,11 @@
        free(exe_list->data);
        exe_list = evas_list_remove_list(exe_list, exe_list);
      }
+   while (exe_list2)
+     {
+       free(exe_list2->data);
+       exe_list2 = evas_list_remove_list(exe_list2, exe_list2);
+     }
    which_list = NO_LIST;
    exe_sel = NULL;
 }
@@ -1061,6 +1114,57 @@
    /* no more path items left - stop scanning */
    if (!exe_path)
      {
+       Evas_List *l, *l2;
+       E_Exe_List *el;
+       E_Exe *ee;
+       int different = 0;
+       
+       /* FIXME: check theat they match or not */
+       for (l = exe_list, l2 = exe_list2; l && l2; l = l->next, l2 = l2->next)
+         {
+            if (strcmp(l->data, l2->data))
+              {
+                 different = 1;
+                 break;
+              }
+         }
+       if ((l) || (l2)) different = 1;
+       if (exe_list2)
+         {
+            while (exe_list)
+              {
+                 free(exe_list->data);
+                 exe_list = evas_list_remove_list(exe_list, exe_list);
+              }
+            exe_list = exe_list2;
+            exe_list2 = NULL;
+         }
+       if (different)
+         {
+            el = calloc(1, sizeof(E_Exe_List));
+            if (el)
+              {
+                 el->list = NULL;
+                 for (l = exe_list; l; l = l->next)
+                   {
+                      ee = malloc(sizeof(E_Exe));
+                      if (ee)
+                        {
+                           ee->path = evas_stringshare_add(l->data);
+                           el->list = evas_list_append(el->list, ee);
+                        }
+                   }
+                 e_config_domain_save("exebuf_exelist_cache", exelist_edd, el);
+                 while (el->list)
+                   {
+                      ee = el->list->data;
+                      evas_stringshare_del(ee->path);
+                      free(ee);
+                      el->list = evas_list_remove_list(el->list, el->list);
+                   }
+                 free(el);
+              }
+         }
        exe_list_idler = NULL;
        return 0;
      }
@@ -1084,7 +1188,12 @@
                  if ((stat(buf, &st) == 0) &&
                      ((!S_ISDIR(st.st_mode)) &&
                       (!access(buf, X_OK))))
-                   exe_list = evas_list_append(exe_list, strdup(buf));
+                   {
+                      if (!exe_list)
+                        exe_list = evas_list_append(exe_list, strdup(buf));
+                      else
+                        exe_list2 = evas_list_append(exe_list2, strdup(buf));
+                   }
               }
          }
        else
===================================================================
RCS file: /cvsroot/enlightenment/e17/apps/e/src/bin/e_main.c,v
retrieving revision 1.147
retrieving revision 1.148
diff -u -3 -r1.147 -r1.148
--- e_main.c    5 Feb 2006 08:17:40 -0000       1.147
+++ e_main.c    6 Feb 2006 08:06:18 -0000       1.148
@@ -616,6 +616,13 @@
        _e_main_shutdown(-1);
      }
    _e_main_shutdown_push(e_shelf_shutdown);
+   /* setup exebuf */
+   if (!e_exebuf_init())
+     {
+       e_error_message_show(_("Enlightenment cannot set up its exebuf 
system."));
+       _e_main_shutdown(-1);
+     }
+   _e_main_shutdown_push(e_exebuf_shutdown);
 
    if (ipc_failed)
      e_error_dialog_show(_("Enlightenment IPC setup error!"),




-------------------------------------------------------
This SF.net email is sponsored by: Splunk Inc. Do you grep through log files
for problems?  Stop!  Download the new AJAX search engine that makes
searching your log files as easy as surfing the  web.  DOWNLOAD SPLUNK!
http://sel.as-us.falkag.net/sel?cmd=lnk&kid=103432&bid=230486&dat=121642
_______________________________________________
enlightenment-cvs mailing list
enlightenment-cvs@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/enlightenment-cvs

Reply via email to