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
[email protected]
https://lists.sourceforge.net/lists/listinfo/enlightenment-cvs