Enlightenment CVS committal

Author  : englebass
Project : e17
Module  : libs/efreet

Dir     : e17/libs/efreet/src/lib


Modified Files:
        efreet_utils.c efreet_utils.h 


Log Message:
Create category lists while scanning for .desktop files.

===================================================================
RCS file: /cvs/e/e17/libs/efreet/src/lib/efreet_utils.c,v
retrieving revision 1.38
retrieving revision 1.39
diff -u -3 -r1.38 -r1.39
--- efreet_utils.c      28 May 2007 10:35:12 -0000      1.38
+++ efreet_utils.c      3 Jun 2007 18:07:23 -0000       1.39
@@ -66,8 +66,6 @@
 static void efreet_util_cache_search_comment_glob(void *value, void *data);
 
 static int  efreet_util_glob_match(const char *str, const char *glob);
-static void efreet_util_cache_search_categories(void *value, void *data);
-static void efreet_util_cache_search_category(void *value, void *data);
 
 static void efreet_util_monitor(const char *path, const char *file_id, int 
priority);
 static void efreet_util_monitor_cb(void *data, Ecore_File_Monitor *monitor,
@@ -75,10 +73,14 @@
 static void efreet_util_monitor_free(void *data);
 static void efreet_util_menus_find_helper(Ecore_List *menus, const char 
*config_dir);
 
+static void efreet_util_desktops_by_category_add(Efreet_Desktop *desktop);
+static void efreet_util_desktops_by_category_remove(Efreet_Desktop *desktop);
+
 static Ecore_Hash *desktop_by_file_id = NULL;
 static Ecore_Hash *file_id_by_desktop_path = NULL;
+static Ecore_Hash *desktops_by_category = NULL;
 
-static Ecore_Idler *idler = NULL;
+static Ecore_Idler       *idler = NULL;
 static Efreet_Cache_Fill *fill = NULL;
 
 static Ecore_List *monitors = NULL;
@@ -102,10 +104,15 @@
     desktop_by_file_id = ecore_hash_new(ecore_str_hash, ecore_str_compare);
     ecore_hash_set_free_key(desktop_by_file_id, 
ECORE_FREE_CB(ecore_string_release));
     ecore_hash_set_free_value(desktop_by_file_id, free);
+
     file_id_by_desktop_path = ecore_hash_new(ecore_str_hash, 
ecore_str_compare);
     ecore_hash_set_free_key(file_id_by_desktop_path, 
ECORE_FREE_CB(ecore_string_release));
     ecore_hash_set_free_value(file_id_by_desktop_path, 
ECORE_FREE_CB(ecore_string_release));
 
+    desktops_by_category = ecore_hash_new(ecore_str_hash, ecore_str_compare);
+    ecore_hash_set_free_key(desktops_by_category, 
ECORE_FREE_CB(ecore_string_release));
+    ecore_hash_set_free_value(desktops_by_category, 
ECORE_FREE_CB(ecore_list_destroy));
+
     monitors = ecore_list_new();
     ecore_list_set_free_cb(monitors, efreet_util_monitor_free);
 
@@ -152,6 +159,9 @@
     IF_FREE_HASH(file_id_by_desktop_path);
 
     IF_FREE_LIST(monitors);
+
+    IF_FREE_HASH(desktops_by_category);
+
     return init;
 }
 
@@ -299,7 +309,9 @@
         ud = NEW(Efreet_Util_Desktop, 1);
         ud->priority = priority;
         ud->desktop = desktop;
+
         ecore_hash_set(desktop_by_file_id, (void 
*)ecore_string_instance(file_id), ud);
+        efreet_util_desktops_by_category_add(desktop);
 
         ev = NEW(Efreet_Event_Desktop_Change, 1);
         ev->current = desktop;
@@ -415,15 +427,7 @@
 Ecore_List *
 efreet_util_desktop_categories_list()
 {
-    Efreet_Cache_Search_List search;
-    // XXX this list could be build as the cache is filled. for now we run 
through the cache each time this is called
-
-    search.list = ecore_list_new();
-    ecore_list_set_free_cb(search.list, ECORE_FREE_CB(ecore_string_release));
-    ecore_hash_for_each_node(desktop_by_file_id, 
efreet_util_cache_search_categories, &search);
-
-    if (ecore_list_is_empty(search.list)) IF_FREE_LIST(search.list);
-    return search.list;
+    return ecore_hash_keys(desktops_by_category);
 }
 
 /**
@@ -431,19 +435,10 @@
  * @param category the category name
  * @return a list of desktops
  */
-Ecore_List *
+const Ecore_List *
 efreet_util_desktop_category_list(const char *category)
 {
-    Efreet_Cache_Search_List search;
-
-    search.list = ecore_list_new();
-    search.what = ecore_string_instance(category);
-
-    ecore_hash_for_each_node(desktop_by_file_id, 
efreet_util_cache_search_category, &search);
-    ecore_string_release(search.what);
-
-    if (ecore_list_is_empty(search.list)) IF_FREE_LIST(search.list);
-    return search.list;
+    return ecore_hash_get(desktops_by_category, category);
 
 }
 
@@ -566,6 +561,8 @@
         ud->desktop = desktop;
 
         ecore_hash_set(desktop_by_file_id, (void 
*)ecore_string_instance(file_id), ud);
+        efreet_util_desktops_by_category_add(desktop);
+
         if (event)
         {
             Efreet_Event_Desktop_Change *ev;
@@ -578,6 +575,9 @@
     }
     else if (priority < ud->priority)
     {
+        efreet_util_desktops_by_category_remove(ud->desktop);
+        efreet_util_desktops_by_category_add(desktop);
+
         if (event)
         {
             Efreet_Event_Desktop_Change *ev;
@@ -612,6 +612,7 @@
         Efreet_Event_Desktop_Change *ev;
 
         ecore_hash_remove(desktop_by_file_id, file_id);
+        efreet_util_desktops_by_category_remove(ud->desktop);
 
         ev = NEW(Efreet_Event_Desktop_Change, 1);
         ev->current = ud->desktop;
@@ -646,6 +647,9 @@
 
         if (ud->priority < priority) return;
 
+        efreet_util_desktops_by_category_remove(ud->desktop);
+        efreet_util_desktops_by_category_add(desktop);
+
         ev = NEW(Efreet_Event_Desktop_Change, 1);
         ev->current = desktop;
         ev->previous = ud->desktop;
@@ -661,7 +665,10 @@
         ud = NEW(Efreet_Util_Desktop, 1);
         ud->priority = priority;
         ud->desktop = desktop;
+
         ecore_hash_set(desktop_by_file_id, (void 
*)ecore_string_instance(file_id), ud);
+        efreet_util_desktops_by_category_remove(ud->desktop);
+        efreet_util_desktops_by_category_add(desktop);
 
         ev = NEW(Efreet_Event_Desktop_Change, 1);
         ev->current = desktop;
@@ -861,48 +868,6 @@
 }
 
 static void
-efreet_util_cache_search_categories(void *value, void *data)
-{
-    Ecore_Hash_Node          *node;
-    Efreet_Cache_Search_List *search;
-    Efreet_Util_Desktop      *ud;
-    const char               *category;
-
-    node = value;
-    search = data;
-    ud = node->value;
-
-    if (!ud->desktop->categories) return;
-    ecore_list_goto_first(ud->desktop->categories);
-    while ((category = ecore_list_next(ud->desktop->categories)))
-    {
-        if (!ecore_list_goto(search->list, category))
-            ecore_list_append(search->list, (void 
*)ecore_string_instance(category));
-    }
-}
-
-static void
-efreet_util_cache_search_category(void *value, void *data)
-{
-    Ecore_Hash_Node          *node;
-    Efreet_Cache_Search_List *search;
-    Efreet_Util_Desktop      *ud;
-    const char               *category;
-
-    node = value;
-    search = data;
-    ud = node->value;
-
-    if (!ud->desktop->categories) return;
-    ecore_list_goto_first(ud->desktop->categories);
-    while ((category = ecore_list_next(ud->desktop->categories)))
-    {
-        if (category == search->what)
-            ecore_list_append(search->list, ud->desktop);
-    }
-}
-
-static void
 efreet_util_monitor(const char *path, const char *file_id, int priority)
 {
     Efreet_Monitor *em;
@@ -1028,4 +993,50 @@
         ecore_list_append(menus, strdup(fbuf));
     }
     closedir(files);
+}
+
+static void
+efreet_util_desktops_by_category_add(Efreet_Desktop *desktop)
+{
+    const char *category;
+
+    if (!desktop->categories) return;
+
+    ecore_list_goto_first(desktop->categories);
+    while ((category = ecore_list_next(desktop->categories)))
+    {
+        Ecore_List *list;
+        list = ecore_hash_get(desktops_by_category, category);
+        if (!list)
+        {
+            list = ecore_list_new();
+            ecore_hash_set(desktops_by_category, 
+                    (void *)ecore_string_instance(category), list);
+        }
+        if (!ecore_list_goto(list, desktop))
+            ecore_list_append(list, desktop);
+    }
+}
+
+static void
+efreet_util_desktops_by_category_remove(Efreet_Desktop *desktop)
+{
+    const char *category;
+
+    if (!desktop->categories) return;
+
+    ecore_list_goto_first(desktop->categories);
+    while ((category = ecore_list_next(desktop->categories)))
+    {
+        Ecore_List *list;
+        list = ecore_hash_get(desktops_by_category, category);
+        if (!list) continue;
+        if (ecore_list_goto(list, desktop))
+            ecore_list_remove(list);
+        if (ecore_list_is_empty(list))
+        {
+            ecore_hash_remove(desktops_by_category, category);
+            ecore_list_destroy(list);
+        }
+    }
 }
===================================================================
RCS file: /cvs/e/e17/libs/efreet/src/lib/efreet_utils.h,v
retrieving revision 1.20
retrieving revision 1.21
diff -u -3 -r1.20 -r1.21
--- efreet_utils.h      15 Apr 2007 07:24:03 -0000      1.20
+++ efreet_utils.h      3 Jun 2007 18:07:23 -0000       1.21
@@ -38,8 +38,8 @@
 Ecore_List     *efreet_util_desktop_generic_name_glob_list(const char *glob);
 Ecore_List     *efreet_util_desktop_comment_glob_list(const char *glob);
 
-Ecore_List     *efreet_util_desktop_categories_list();
-Ecore_List     *efreet_util_desktop_category_list(const char *category);
+Ecore_List       *efreet_util_desktop_categories_list();
+const Ecore_List *efreet_util_desktop_category_list(const char *category);
 
 Ecore_List *efreet_util_menus_find();
 extern int EFREET_EVENT_DESKTOP_LIST_CHANGE;



-------------------------------------------------------------------------
This SF.net email is sponsored by DB2 Express
Download DB2 Express C - the FREE version of DB2 express and take
control of your XML. No limits. Just data. Click to get it now.
http://sourceforge.net/powerbar/db2/
_______________________________________________
enlightenment-cvs mailing list
enlightenment-cvs@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/enlightenment-cvs

Reply via email to