diff --git a/legacy/efreet/src/lib/Makefile.am b/legacy/efreet/src/lib/Makefile.am index f94a398992..72ba741886 100644 --- a/legacy/efreet/src/lib/Makefile.am +++ b/legacy/efreet/src/lib/Makefile.am @@ -31,6 +31,7 @@ efreet_utils.c \ efreet_uri.c \ efreet_private.h \ efreet_xml.h \ +efreet_cache.c \ $(EFREETHEADERS) libefreet_la_SOURCES = \ diff --git a/legacy/efreet/src/lib/efreet_cache.c b/legacy/efreet/src/lib/efreet_cache.c new file mode 100644 index 0000000000..fedc19b55b --- /dev/null +++ b/legacy/efreet/src/lib/efreet_cache.c @@ -0,0 +1,55 @@ +/* vim: set sw=4 ts=4 sts=4 et: */ +#include "Efreet.h" +#include "efreet_private.h" + +/* FIXME: need a mmaped hash file that apps can share */ + +static Eina_Hash *icon_cache = NULL; + +static void +path_free(const char *path) +{ + if (path == NON_EXISTING) return; + eina_stringshare_del(path); +} + +static void +icon_cache_add(void) +{ + if (icon_cache) return; + icon_cache = eina_hash_string_superfast_new(EINA_FREE_CB(path_free)); +} + +void +efreet_cache_clear(void) +{ + if (!icon_cache) return; + IF_FREE_HASH(icon_cache); + icon_cache = NULL; +} + +const char * +efreet_icon_hash_get(const char *theme_name, const char *icon, int size) +{ + const char *file; + char buf[4096]; + + if (!icon_cache) return NULL; + snprintf(buf, sizeof(buf), "%s/::/%s/::/%i", theme_name, icon, size); + file = eina_hash_find(icon_cache, buf); + return file; +} + +void +efreet_icon_hash_put(const char *theme_name, const char *icon, int size, const char *file) +{ + char buf[4096]; + + icon_cache_add(); + if (!icon_cache) return; + snprintf(buf, sizeof(buf), "%s/::/%s/::/%i", theme_name, icon, size); + if (file == NON_EXISTING) + eina_hash_add(icon_cache, buf, (void *)NON_EXISTING); + else if (file) + eina_hash_add(icon_cache, buf, (void *)eina_stringshare_add(file)); +} diff --git a/legacy/efreet/src/lib/efreet_icon.c b/legacy/efreet/src/lib/efreet_icon.c index 59440e1868..5b95662e9a 100644 --- a/legacy/efreet/src/lib/efreet_icon.c +++ b/legacy/efreet/src/lib/efreet_icon.c @@ -2,8 +2,6 @@ #include "Efreet.h" #include "efreet_private.h" -#define NON_EXISTING (void *)-1 - static char *efreet_icon_deprecated_user_dir = NULL; static char *efreet_icon_user_dir = NULL; static Eina_Hash *efreet_icon_themes = NULL; @@ -346,6 +344,11 @@ efreet_icon_path_find(const char *theme_name, const char *icon, unsigned int siz char *value = NULL; Efreet_Icon_Theme *theme; + if ((value = efreet_icon_hash_get(theme_name, icon, size)) != NULL) + { + if (value == NON_EXISTING) return NULL; + return strdup(value); + } theme = efreet_icon_find_theme_check(theme_name); #ifdef SLOPPY_SPEC @@ -365,6 +368,8 @@ efreet_icon_path_find(const char *theme_name, const char *icon, unsigned int siz */ if (!value || (value == NON_EXISTING)) value = efreet_icon_fallback_icon(icon); + efreet_icon_hash_put(theme_name, icon, size, value); + if (value == NON_EXISTING) value = NULL; return value; } diff --git a/legacy/efreet/src/lib/efreet_private.h b/legacy/efreet/src/lib/efreet_private.h index b2546b62af..38d81da22e 100644 --- a/legacy/efreet/src/lib/efreet_private.h +++ b/legacy/efreet/src/lib/efreet_private.h @@ -198,6 +198,12 @@ size_t efreet_array_cat(char *buffer, size_t size, const char *strs[]); const char *efreet_desktop_environment_get(void); +#define NON_EXISTING (void *)-1 + +void efreet_cache_clear(void); +const char *efreet_icon_hash_get(const char *theme_name, const char *icon, int size); +void efreet_icon_hash_put(const char *theme_name, const char *icon, int size, const char *file); + /** * @} */ diff --git a/legacy/efreet/src/lib/efreet_utils.c b/legacy/efreet/src/lib/efreet_utils.c index 00357d4c05..de56146c94 100644 --- a/legacy/efreet/src/lib/efreet_utils.c +++ b/legacy/efreet/src/lib/efreet_utils.c @@ -514,6 +514,7 @@ efreet_util_cache_fill(__UNUSED__ void *data) free(fill); idler = NULL; fill = NULL; + efreet_cache_clear(); ecore_event_add(EFREET_EVENT_DESKTOP_LIST_CHANGE, NULL, NULL, NULL); return 0; @@ -532,6 +533,7 @@ efreet_util_cache_fill(__UNUSED__ void *data) eina_hash_foreach(file_id_by_desktop_path, dump, NULL); printf("%d\n", eina_hash_population(desktop_by_file_id)); #endif + efreet_cache_clear(); ecore_event_add(EFREET_EVENT_DESKTOP_LIST_CHANGE, NULL, NULL, NULL); return 0; @@ -634,6 +636,7 @@ efreet_util_cache_add(const char *path, const char *file_id, int priority, int e ev->current = desktop; efreet_desktop_ref(ev->current); ev->change = EFREET_DESKTOP_CHANGE_ADD; + efreet_cache_clear(); ecore_event_add(EFREET_EVENT_DESKTOP_CHANGE, ev, efreet_event_desktop_change_free, NULL); } } @@ -654,6 +657,7 @@ efreet_util_cache_add(const char *path, const char *file_id, int priority, int e ev->change = EFREET_DESKTOP_CHANGE_UPDATE; efreet_desktop_free(ud->desktop); ud->desktop = desktop; + efreet_cache_clear(); ecore_event_add(EFREET_EVENT_DESKTOP_CHANGE, ev, efreet_event_desktop_change_free, NULL); } else @@ -685,6 +689,7 @@ efreet_util_cache_remove(const char *path, const char *file_id, int priority) ev->current = ud->desktop; efreet_desktop_ref(ev->current); ev->change = EFREET_DESKTOP_CHANGE_REMOVE; + efreet_cache_clear(); ecore_event_add(EFREET_EVENT_DESKTOP_CHANGE, ev, efreet_event_desktop_change_free, NULL); eina_hash_del(desktop_by_file_id, file_id, ud); @@ -733,6 +738,7 @@ efreet_util_cache_reload(const char *path, const char *file_id, int priority) ev->previous = ud->desktop; efreet_desktop_ref(ev->previous); ev->change = EFREET_DESKTOP_CHANGE_UPDATE; + efreet_cache_clear(); ecore_event_add(EFREET_EVENT_DESKTOP_CHANGE, ev, efreet_event_desktop_change_free, NULL); efreet_desktop_free(ud->desktop); @@ -754,6 +760,7 @@ efreet_util_cache_reload(const char *path, const char *file_id, int priority) ev->current = desktop; efreet_desktop_ref(ev->current); ev->change = EFREET_DESKTOP_CHANGE_ADD; + efreet_cache_clear(); ecore_event_add(EFREET_EVENT_DESKTOP_CHANGE, ev, efreet_event_desktop_change_free, NULL); } }