Enlightenment CVS committal

Author  : englebass
Project : e17
Module  : libs/efreet

Dir     : e17/libs/efreet/src/lib


Modified Files:
        efreet_icon.c 


Log Message:
Make the icon cache work for efreet_icon_list_find.

===================================================================
RCS file: /cvs/e/e17/libs/efreet/src/lib/efreet_icon.c,v
retrieving revision 1.34
retrieving revision 1.35
diff -u -3 -r1.34 -r1.35
--- efreet_icon.c       14 Aug 2008 16:59:41 -0000      1.34
+++ efreet_icon.c       14 Aug 2008 19:47:48 -0000      1.35
@@ -4,11 +4,10 @@
 
 static char *efreet_icon_deprecated_user_dir = NULL;
 static char *efreet_icon_user_dir = NULL;
-static Ecore_Hash *efreet_icon_dirs_cached = NULL;
 static Ecore_Hash *efreet_icon_themes = NULL;
-Ecore_List *efreet_icon_extensions = NULL;
+static Ecore_List *efreet_icon_extensions = NULL;
 static Ecore_List *efreet_extra_icon_dirs = NULL;
-static Ecore_List *efreet_icon_cache = NULL;
+static Ecore_Hash *efreet_icon_cache = NULL;
 
 static int efreet_icon_init_count = 0;
 
@@ -75,8 +74,10 @@
                                                         const char *dir);
 
 static int efreet_icon_cache_find(Efreet_Icon_Cache *value, const char *key);
-static void efreet_icon_cache_flush(void);
+static void efreet_icon_cache_flush(Ecore_List *list);
 static void efreet_icon_cache_free(Efreet_Icon_Cache *value);
+static char *efreet_icon_cache_check(Efreet_Icon_Theme *theme, const char 
*icon, const char *size);
+static void efreet_icon_cache_add(Efreet_Icon_Theme *theme, const char *icon, 
const char *size, const char *value);
 
 /**
  * @internal
@@ -112,8 +113,8 @@
                             ECORE_FREE_CB(efreet_icon_theme_free));
         efreet_extra_icon_dirs = ecore_list_new();
 
-        efreet_icon_cache = ecore_list_new();
-        ecore_list_free_cb_set(efreet_icon_cache, 
ECORE_FREE_CB(efreet_icon_cache_free));
+        efreet_icon_cache = ecore_hash_new(ecore_direct_hash, 
ecore_direct_compare);
+        ecore_hash_free_value_cb_set(efreet_icon_cache, 
ECORE_FREE_CB(ecore_list_destroy));
     }
 
     return 1;
@@ -135,10 +136,9 @@
 
     IF_FREE_LIST(efreet_icon_extensions);
     IF_FREE_HASH(efreet_icon_themes);
-    IF_FREE_HASH(efreet_icon_dirs_cached);
     IF_FREE_LIST(efreet_extra_icon_dirs);
 
-    IF_FREE_LIST(efreet_icon_cache);
+    IF_FREE_HASH(efreet_icon_cache);
 
     ecore_shutdown();
     efreet_icon_init_count = 0;
@@ -333,33 +333,9 @@
 EAPI char *
 efreet_icon_path_find(const char *theme_name, const char *icon, const char 
*size)
 {
-    struct stat st;
     char *value = NULL;
-    char key[4096];
-    Efreet_Icon_Cache *cache;
     Efreet_Icon_Theme *theme;
 
-    snprintf(key, sizeof(key), "%s %s %s", theme_name, icon, size);
-    cache = ecore_list_find(efreet_icon_cache, 
ECORE_COMPARE_CB(efreet_icon_cache_find), key);
-    if (cache)
-    {
-        ecore_list_remove(efreet_icon_cache);
-        if (!cache->path)
-        {
-            if (ecore_time_get() < (cache->lasttime + 5))
-            {
-                ecore_list_prepend(efreet_icon_cache, cache);
-                return NULL;
-            }
-        }
-        else if (!stat(cache->path, &st) && st.st_mtime == cache->lasttime)
-        {
-            ecore_list_prepend(efreet_icon_cache, cache);
-            return strdup(cache->path);
-        }
-        efreet_icon_cache_free(cache);
-    }
-
     theme = efreet_icon_find_theme_check(theme_name);
 
 #ifdef SLOPPY_SPEC
@@ -377,20 +353,9 @@
     /* we didn't find the icon in the theme or in the inherited directories
      * then just look for a non theme icon
      */
-    if (!value) value = efreet_icon_fallback_icon(icon);
-
-    cache = NEW(Efreet_Icon_Cache, 1);
-    cache->key = strdup(key);
-    if ((value) && !stat(value, &st))
-    {
-        cache->path = strdup(value);
-        cache->lasttime = st.st_mtime;
-    }
-    else
-        cache->lasttime = ecore_time_get();
-    ecore_list_prepend(efreet_icon_cache, cache);
-    efreet_icon_cache_flush();
+    if (!value || (value == (void *)-1)) value = 
efreet_icon_fallback_icon(icon);
 
+    if (value == (void *)-1) value = NULL;
     return value;
 }
 
@@ -436,16 +401,18 @@
     /* we didn't find the icons in the theme or in the inherited directories
      * then just look for a non theme icon
      */
-    if (!value)
+    if (!value || (value == (void *)-1))
     {
         ecore_list_first_goto(icons);
         while ((icon = ecore_list_next(icons)))
         {
-            if ((value = efreet_icon_fallback_icon(icon)))
+            value = efreet_icon_fallback_icon(icon);
+            if (value && (value != (void *)-1))
                 break;
         }
     }
 
+    if (value == (void *)-1) value = NULL;
     return value;
 }
 
@@ -502,7 +469,7 @@
             if ((!parent_theme) || (parent_theme == theme)) continue;
 
             value = efreet_icon_find_helper(parent_theme, icon, size);
-            if (value) break;
+            if (value && (value != (void *)-1)) break;
         }
     }
     /* if this isn't the hicolor theme, and we have no other fallbacks
@@ -547,7 +514,7 @@
     value = efreet_icon_lookup_icon(theme, icon, size);
 
     /* we didin't find the image check the inherited themes */
-    if (!value)
+    if (!value || (value == (void *)-1))
         value = efreet_icon_find_fallback(theme, icon, size);
 
     recurse--;
@@ -582,7 +549,7 @@
 
             value = efreet_icon_list_find_helper(parent_theme,
                                                         icons, size);
-            if (value) break;
+            if (value && (value != (void *)-1)) break;
         }
     }
 
@@ -631,12 +598,13 @@
     ecore_list_first_goto(icons);
     while ((icon = ecore_list_next(icons)))
     {
-        if ((value = efreet_icon_lookup_icon(theme, icon, size)))
+        value = efreet_icon_lookup_icon(theme, icon, size);
+        if (value && (value != (void *)-1))
             break;
     }
 
     /* we didn't find the image check the inherited themes */
-    if (!value)
+    if (!value || (value == (void *)-1))
         value = efreet_icon_list_find_fallback(theme, icons, size);
 
     recurse--;
@@ -664,6 +632,8 @@
     if (!theme || (theme->paths.count == 0) || !icon_name || !size)
         return NULL;
 
+    icon = efreet_icon_cache_check(theme, icon_name, size);
+    if (icon) return icon;
     real_size = atoi(size);
 
     /* search for allowed size == requested size */
@@ -673,7 +643,11 @@
         if (!efreet_icon_directory_size_match(dir, real_size)) continue;
         icon = efreet_icon_lookup_directory(theme, dir,
                                             icon_name);
-        if (icon) return icon;
+        if (icon)
+        {
+            efreet_icon_cache_add(theme, icon_name, size, icon);
+            return icon;
+        }
     }
 
     /* search for any icon that matches */
@@ -695,6 +669,7 @@
         }
     }
 
+    efreet_icon_cache_add(theme, icon_name, size, icon);
     return icon;
 }
 
@@ -806,6 +781,8 @@
     char *icon;
 
     if (!icon_name) return NULL;
+    icon = efreet_icon_cache_check(NULL, icon_name, NULL);
+    if (icon) return icon;
 
     icon = 
efreet_icon_fallback_dir_scan(efreet_icon_deprecated_user_dir_get(), icon_name);
     if (!icon)
@@ -820,7 +797,11 @@
         while ((dir = ecore_list_next(efreet_extra_icon_dirs)))
         {
             icon = efreet_icon_fallback_dir_scan(dir, icon_name);
-            if (icon) return icon;
+            if (icon)
+            {
+                efreet_icon_cache_add(NULL, icon_name, NULL, icon);
+                return icon;
+            }
         }
 
         xdg_dirs = efreet_data_dirs_get();
@@ -829,12 +810,17 @@
         {
             snprintf(path, PATH_MAX, "%s/icons", dir);
             icon = efreet_icon_fallback_dir_scan(path, icon_name);
-            if (icon) return icon;
+            if (icon)
+            {
+                efreet_icon_cache_add(NULL, icon_name, NULL, icon);
+                return icon;
+            }
         }
 
         icon = efreet_icon_fallback_dir_scan("/usr/share/pixmaps", icon_name);
     }
 
+    efreet_icon_cache_add(NULL, icon_name, NULL, icon);
     return icon;
 }
 
@@ -1212,6 +1198,7 @@
                 break;
         }
     }
+    theme->last_cache_check = new_check;
 }
 
 /**
@@ -1230,8 +1217,7 @@
     /* have we modified this directory since our last cache check? */
     if (stat(dir, &buf) || (buf.st_mtime > theme->last_cache_check))
     {
-        if (efreet_icon_dirs_cached)
-            ecore_hash_remove(efreet_icon_dirs_cached, dir);
+        ecore_hash_remove(efreet_icon_cache, theme);
         return 0;
     }
 
@@ -1564,17 +1550,17 @@
 }
 
 static void
-efreet_icon_cache_flush(void)
+efreet_icon_cache_flush(Ecore_List *list)
 {
     /* TODO:
      * * Dynamic cache size
      * * Maybe add references to cache, so that we sort on how often a value 
is used
      */
-    while (ecore_list_count(efreet_icon_cache) > 100)
+    while (ecore_list_count(list) > 100)
     {
         Efreet_Icon_Cache *cache;
 
-        cache = ecore_list_last_remove(efreet_icon_cache);
+        cache = ecore_list_last_remove(list);
         efreet_icon_cache_free(cache);
     }
 }
@@ -1587,4 +1573,71 @@
     IF_FREE(value->key);
     IF_FREE(value->path);
     free(value);
+}
+
+static char *
+efreet_icon_cache_check(Efreet_Icon_Theme *theme, const char *icon, const char 
*size)
+{
+    Ecore_List *list;
+    Efreet_Icon_Cache *cache;
+    char key[4096];
+    struct stat st;
+
+    list = ecore_hash_get(efreet_icon_cache, theme);
+    if (!list)
+    {
+        list = ecore_list_new();
+        ecore_list_free_cb_set(list, ECORE_FREE_CB(efreet_icon_cache_free));
+        ecore_hash_set(efreet_icon_cache, theme, list);
+        return NULL;
+    }
+
+    snprintf(key, sizeof(key), "%s %s", icon, size);
+    cache = ecore_list_find(list, ECORE_COMPARE_CB(efreet_icon_cache_find), 
key);
+    if (cache)
+    {
+        ecore_list_remove(list);
+        if (!cache->path)
+        {
+            ecore_list_prepend(list, cache);
+            return (void *)-1;
+        }
+        else if (!stat(cache->path, &st) && st.st_mtime == cache->lasttime)
+        {
+            ecore_list_prepend(list, cache);
+            return strdup(cache->path);
+        }
+        efreet_icon_cache_free(cache);
+    }
+    return NULL;
+}
+
+static void
+efreet_icon_cache_add(Efreet_Icon_Theme *theme, const char *icon, const char 
*size, const char *value)
+{
+    Ecore_List *list;
+    Efreet_Icon_Cache *cache;
+    char key[4096];
+    struct stat st;
+
+    list = ecore_hash_get(efreet_icon_cache, theme);
+    if (!list)
+    {
+        list = ecore_list_new();
+        ecore_list_free_cb_set(list, ECORE_FREE_CB(efreet_icon_cache_free));
+        ecore_hash_set(efreet_icon_cache, theme, list);
+    }
+
+    snprintf(key, sizeof(key), "%s %s", icon, size);
+    cache = NEW(Efreet_Icon_Cache, 1);
+    cache->key = strdup(key);
+    if ((value) && !stat(value, &st))
+    {
+        cache->path = strdup(value);
+        cache->lasttime = st.st_mtime;
+    }
+    else
+        cache->lasttime = ecore_time_get();
+    ecore_list_prepend(list, cache);
+    efreet_icon_cache_flush(list);
 }



-------------------------------------------------------------------------
This SF.Net email is sponsored by the Moblin Your Move Developer's challenge
Build the coolest Linux based applications with Moblin SDK & win great prizes
Grand prize is a trip for two to an Open Source event anywhere in the world
http://moblin-contest.org/redirect.php?banner_id=100&url=/
_______________________________________________
enlightenment-cvs mailing list
enlightenment-cvs@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/enlightenment-cvs

Reply via email to