Move theme hash from efreet_icon to efreet_cache

SVN revision: 56852
This commit is contained in:
Sebastian Dransfeld 2011-02-09 17:09:16 +00:00
parent 2344ff9520
commit 021beae781
4 changed files with 75 additions and 64 deletions

View File

@ -55,3 +55,7 @@
* Do efreet_init before using efreet_*() functions
* Move lock creation to own function for desktop cache
* Set file owner to calling user
2011-02-09 Sebastian Dransfeld
* Move theme hash from efreet_icon.c to efreet_cache.c

View File

@ -47,6 +47,7 @@ static Eet_File *icon_cache = NULL;
static Eet_File *fallback_cache = NULL;
static Eet_File *icon_theme_cache = NULL;
static Eina_Hash *themes = NULL;
static Eina_Hash *icons = NULL;
static Eina_Hash *fallbacks = NULL;
@ -104,6 +105,7 @@ efreet_cache_init(void)
EFREET_EVENT_ICON_CACHE_UPDATE = ecore_event_type_new();
EFREET_EVENT_DESKTOP_CACHE_UPDATE = ecore_event_type_new();
themes = eina_hash_string_superfast_new(EINA_FREE_CB(efreet_cache_icon_theme_free));
icons = eina_hash_string_superfast_new(EINA_FREE_CB(efreet_cache_icon_free));
fallbacks = eina_hash_string_superfast_new(EINA_FREE_CB(efreet_cache_icon_fallback_free));
@ -149,6 +151,7 @@ efreet_cache_shutdown(void)
icon_cache = efreet_cache_close(icon_cache);
icon_theme_cache = efreet_cache_close(icon_theme_cache);
IF_FREE_HASH(themes);
IF_FREE_HASH(icons);
IF_FREE_HASH(fallbacks);
@ -649,8 +652,20 @@ efreet_cache_icon_fallback_find(const char *icon)
Efreet_Icon_Theme *
efreet_cache_icon_theme_find(const char *theme)
{
Efreet_Cache_Icon_Theme *cache;
if (!efreet_cache_check(&icon_theme_cache, efreet_icon_theme_cache_file(), EFREET_ICON_CACHE_MAJOR)) return NULL;
return eet_data_read(icon_theme_cache, efreet_icon_theme_edd(EINA_FALSE), theme);
cache = eina_hash_find(themes, theme);
if (cache == NON_EXISTING) return NULL;
if (cache) return &(cache->theme);
cache = eet_data_read(icon_theme_cache, efreet_icon_theme_edd(EINA_FALSE), theme);
if (cache)
eina_hash_add(themes, theme, cache);
else
eina_hash_add(themes, theme, NON_EXISTING);
return &(cache->theme);
}
void
@ -659,6 +674,7 @@ efreet_cache_icon_theme_free(Efreet_Icon_Theme *theme)
void *data;
if (!theme) return;
if (theme == NON_EXISTING) return;
eina_list_free(theme->paths);
eina_list_free(theme->inherits);
@ -668,23 +684,26 @@ efreet_cache_icon_theme_free(Efreet_Icon_Theme *theme)
free(theme);
}
char **
efreet_cache_icon_theme_name_list(int *num)
Eina_List *
efreet_cache_icon_theme_list(void)
{
Eina_List *ret = NULL;
char **keys;
int i;
int i, num;
if (!efreet_cache_check(&icon_theme_cache, efreet_icon_theme_cache_file(), EFREET_ICON_CACHE_MAJOR)) return NULL;
keys = eet_list(icon_theme_cache, "*", num);
for (i = 0; i < *num; i++)
keys = eet_list(icon_theme_cache, "*", &num);
for (i = 0; i < num; i++)
{
if (!strncmp(keys[i], "__efreet", 8) && (i < (*num + 1)))
{
memmove(&keys[i], &keys[i + 1], (*num - i - 1) * sizeof(char *));
(*num)--;
}
Efreet_Icon_Theme *theme;
if (!strncmp(keys[i], "__efreet", 8)) continue;
/* TODO: This could be done more efficient by checking the theme hash
* directly. */
theme = efreet_cache_icon_theme_find(keys[i]);
if (theme) ret = eina_list_append(ret, theme);
}
return keys;
free(keys);
return ret;
}
/*
@ -829,6 +848,7 @@ cache_update_cb(void *data __UNUSED__, Ecore_File_Monitor *em __UNUSED__,
const char *file;
Efreet_Event_Cache_Update *ev = NULL;
Efreet_Old_Cache *d = NULL;
Eina_List *l = NULL;
if (event != ECORE_FILE_EVENT_CREATED_FILE &&
event != ECORE_FILE_EVENT_MODIFIED) return;
@ -856,31 +876,46 @@ cache_update_cb(void *data __UNUSED__, Ecore_File_Monitor *em __UNUSED__,
{
ev = NEW(Efreet_Event_Cache_Update, 1);
if (!ev) goto error;
d = NEW(Efreet_Old_Cache, 1);
if (!d) goto error;
IF_RELEASE(theme_name);
eina_hash_free(icons);
/* Save all old caches */
d = NEW(Efreet_Old_Cache, 1);
if (!d) goto error;
d->hash = themes;
d->ef = icon_theme_cache;
l = eina_list_append(l, d);
d = NEW(Efreet_Old_Cache, 1);
if (!d) goto error;
d->hash = icons;
d->ef = icon_cache;
l = eina_list_append(l, d);
d = NEW(Efreet_Old_Cache, 1);
if (!d) goto error;
d->hash = fallbacks;
d->ef = fallback_cache;
l = eina_list_append(l, d);
/* Create new empty caches */
themes = eina_hash_string_superfast_new(EINA_FREE_CB(efreet_cache_icon_theme_free));
icons = eina_hash_string_superfast_new(EINA_FREE_CB(efreet_cache_icon_free));
eina_hash_free(fallbacks);
fallbacks = eina_hash_string_superfast_new(EINA_FREE_CB(efreet_cache_icon_fallback_free));
icon_cache = efreet_cache_close(icon_cache);
fallback_cache = efreet_cache_close(fallback_cache);
d->hash = efreet_icon_themes;
d->ef = icon_theme_cache;
efreet_icon_themes = eina_hash_string_superfast_new(EINA_FREE_CB(efreet_cache_icon_theme_free));
icon_theme_cache = NULL;
icon_cache = NULL;
fallback_cache = NULL;
ecore_event_add(EFREET_EVENT_ICON_CACHE_UPDATE, ev, icon_cache_update_free, d);
/* Send event */
ecore_event_add(EFREET_EVENT_ICON_CACHE_UPDATE, ev, icon_cache_update_free, l);
}
return;
error:
IF_FREE(ev);
IF_FREE(d);
EINA_LIST_FREE(l, d)
free(d);
}
static void
@ -1040,11 +1075,15 @@ static void
icon_cache_update_free(void *data, void *ev)
{
Efreet_Old_Cache *d;
Eina_List *l;
d = data;
if (d->hash)
eina_hash_free(d->hash);
efreet_cache_close(d->ef);
free(d);
l = data;
EINA_LIST_FREE(l, d)
{
if (d->hash)
eina_hash_free(d->hash);
efreet_cache_close(d->ef);
free(d);
}
free(ev);
}

View File

@ -39,8 +39,6 @@ static int _efreet_icon_log_dom = -1;
#include "Efreet.h"
#include "efreet_private.h"
Eina_Hash *efreet_icon_themes = NULL;
static const char *efreet_icon_deprecated_user_dir = NULL;
static const char *efreet_icon_user_dir = NULL;
static Eina_List *efreet_icon_extensions = NULL;
@ -97,7 +95,6 @@ efreet_icon_init(void)
for (i = 0; default_exts[i]; i++)
efreet_icon_extensions = eina_list_append(efreet_icon_extensions, eina_stringshare_add(default_exts[i]));
efreet_icon_themes = eina_hash_string_superfast_new(EINA_FREE_CB(efreet_cache_icon_theme_free));
efreet_icon_changes_listen();
efreet_extra_icon_dirs = NULL;
@ -117,7 +114,6 @@ efreet_icon_shutdown(void)
IF_RELEASE(efreet_icon_deprecated_user_dir);
IF_FREE_LIST(efreet_icon_extensions, eina_stringshare_del);
IF_FREE_HASH(efreet_icon_themes);
efreet_extra_icon_dirs = eina_list_free(efreet_extra_icon_dirs);
eina_log_domain_unregister(_efreet_icon_log_dom);
@ -225,25 +221,7 @@ efreet_icon_extensions_list_get(void)
EAPI Eina_List *
efreet_icon_theme_list_get(void)
{
Eina_List *list = NULL;
char **keys;
int num, i;
keys = efreet_cache_icon_theme_name_list(&num);
if (keys)
{
for (i = 0; i < num; i++)
{
Efreet_Icon_Theme *theme;
theme = efreet_icon_theme_find(keys[i]);
if (theme)
list = eina_list_append(list, theme);
}
free(keys);
}
return list;
return efreet_cache_icon_theme_list();
}
/**
@ -255,18 +233,9 @@ efreet_icon_theme_list_get(void)
EAPI Efreet_Icon_Theme *
efreet_icon_theme_find(const char *theme_name)
{
Efreet_Icon_Theme *theme;
if (!theme_name) return NULL;
theme = eina_hash_find(efreet_icon_themes, theme_name);
if (!theme)
{
theme = efreet_cache_icon_theme_find(theme_name);
if (theme) eina_hash_direct_add(efreet_icon_themes, theme->name.internal, theme);
}
return theme;
return efreet_cache_icon_theme_find(theme_name);
}
/**

View File

@ -94,7 +94,6 @@
/* TODO: Move these to cache, make static and add accessor */
extern Eina_Hash *efreet_desktop_cache;
extern Eina_Hash *efreet_icon_themes;
#define EFREET_DESKTOP_CACHE_MAJOR 1
#define EFREET_DESKTOP_CACHE_MINOR 0
@ -220,7 +219,7 @@ Efreet_Cache_Icon *efreet_cache_icon_find(Efreet_Icon_Theme *theme, const char *
Efreet_Cache_Fallback_Icon *efreet_cache_icon_fallback_find(const char *icon);
Efreet_Icon_Theme *efreet_cache_icon_theme_find(const char *theme);
void efreet_cache_icon_theme_free(Efreet_Icon_Theme *theme);
char **efreet_cache_icon_theme_name_list(int *num);
Eina_List *efreet_cache_icon_theme_list(void);
EAPI void efreet_cache_array_string_free(Efreet_Cache_Array_String *array);
EAPI void efreet_hash_free(Eina_Hash *hash, Eina_Free_Cb free_cb);