a really simple hash cache for icon finds - this massively makes stuff faster
for app dialogs etc. yes - it uses ram. thats next - make it leaner on ram usage. its simple enough now where that shouldnt be a problem. SVN revision: 38839
This commit is contained in:
parent
d508c49684
commit
b00bae1d92
|
@ -31,6 +31,7 @@ efreet_utils.c \
|
|||
efreet_uri.c \
|
||||
efreet_private.h \
|
||||
efreet_xml.h \
|
||||
efreet_cache.c \
|
||||
$(EFREETHEADERS)
|
||||
|
||||
libefreet_la_SOURCES = \
|
||||
|
|
|
@ -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));
|
||||
}
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
||||
/**
|
||||
* @}
|
||||
*/
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue