From: englebass Date: Mon, 31 Jan 2011 11:44:24 +0000 (+0000) Subject: Create internal struct for theme cache X-Git-Tag: 2.0_alpha~51^2~119 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=99abdec5bac17c1513506dfab9dfcbc58caf1a42;p=framework%2Fuifw%2Fefreet.git Create internal struct for theme cache git-svn-id: svn+ssh://svn.enlightenment.org/var/svn/e/trunk/efreet@56595 7cbeb6ba-43b4-40fd-8cce-4c39aea84d33 --- diff --git a/ChangeLog b/ChangeLog index e64c801..23aa1af 100644 --- a/ChangeLog +++ b/ChangeLog @@ -42,3 +42,7 @@ * Check whether dirs is NULL +2011-01-XX Sebastian Dransfeld + + * Create internal struct for theme cache + diff --git a/src/bin/efreet_icon_cache_create.c b/src/bin/efreet_icon_cache_create.c index adb5b3e..75075c0 100644 --- a/src/bin/efreet_icon_cache_create.c +++ b/src/bin/efreet_icon_cache_create.c @@ -370,7 +370,7 @@ icon_theme_directory_new(Efreet_Ini *ini, const char *name) } static void -icon_theme_index_read(Efreet_Icon_Theme *theme, const char *path) +icon_theme_index_read(Efreet_Cache_Icon_Theme *theme, const char *path) { /* TODO: return error value */ Efreet_Ini *ini; @@ -389,13 +389,13 @@ icon_theme_index_read(Efreet_Icon_Theme *theme, const char *path) efreet_ini_section_set(ini, "Icon Theme"); tmp = efreet_ini_localestring_get(ini, "Name"); - if (tmp) theme->name.name = eina_stringshare_add(tmp); + if (tmp) theme->theme.name.name = eina_stringshare_add(tmp); tmp = efreet_ini_localestring_get(ini, "Comment"); - if (tmp) theme->comment = eina_stringshare_add(tmp); + if (tmp) theme->theme.comment = eina_stringshare_add(tmp); tmp = efreet_ini_string_get(ini, "Example"); - if (tmp) theme->example_icon = eina_stringshare_add(tmp); + if (tmp) theme->theme.example_icon = eina_stringshare_add(tmp); theme->hidden = efreet_ini_boolean_get(ini, "Hidden"); @@ -418,11 +418,11 @@ icon_theme_index_read(Efreet_Icon_Theme *theme, const char *path) { *p = '\0'; - theme->inherits = eina_list_append(theme->inherits, eina_stringshare_add(s)); + theme->theme.inherits = eina_list_append(theme->theme.inherits, eina_stringshare_add(s)); s = ++p; p = strchr(s, ','); } - theme->inherits = eina_list_append(theme->inherits, eina_stringshare_add(s)); + theme->theme.inherits = eina_list_append(theme->theme.inherits, eina_stringshare_add(s)); } /* make sure this one is done last as setting the directory will change @@ -447,7 +447,7 @@ icon_theme_index_read(Efreet_Icon_Theme *theme, const char *path) dir = icon_theme_directory_new(ini, s); if (!dir) goto error; - theme->directories = eina_list_append(theme->directories, dir); + theme->theme.directories = eina_list_append(theme->theme.directories, dir); if (p) s = ++p; } @@ -468,7 +468,7 @@ cache_theme_scan(const char *dir) EINA_ITERATOR_FOREACH(it, entry) { - Efreet_Icon_Theme *theme; + Efreet_Cache_Icon_Theme *theme; const char *name; const char *path; char buf[PATH_MAX]; @@ -482,15 +482,15 @@ cache_theme_scan(const char *dir) if (!theme) { - theme = NEW(Efreet_Icon_Theme, 1); - theme->name.internal = eina_stringshare_add(name); + theme = NEW(Efreet_Cache_Icon_Theme, 1); + theme->theme.name.internal = eina_stringshare_add(name); eina_hash_direct_add(icon_themes, - (void *)theme->name.internal, theme); + (void *)theme->theme.name.internal, theme); } path = eina_stringshare_add(entry->path); - if (!eina_list_data_find(theme->paths, path)) - theme->paths = eina_list_append(theme->paths, path); + if (!eina_list_data_find(theme->theme.paths, path)) + theme->theme.paths = eina_list_append(theme->theme.paths, path); else eina_stringshare_del(path); @@ -533,16 +533,16 @@ cache_lock_file(void) } static void -icon_theme_free(Efreet_Icon_Theme *theme) +icon_theme_free(Efreet_Cache_Icon_Theme *theme) { void *data; Efreet_Icon_Theme_Directory *dir; - EINA_LIST_FREE(theme->paths, data) + EINA_LIST_FREE(theme->theme.paths, data) eina_stringshare_del(data); - EINA_LIST_FREE(theme->inherits, data) + EINA_LIST_FREE(theme->theme.inherits, data) eina_stringshare_del(data); - EINA_LIST_FREE(theme->directories, dir) + EINA_LIST_FREE(theme->theme.directories, dir) { eina_stringshare_del(dir->name); free(dir); @@ -564,7 +564,8 @@ main(int argc, char **argv) Efreet_Cache_Version *icon_version; Efreet_Cache_Version *theme_version; Efreet_Cache_Icons *cache; - Efreet_Icon_Theme *theme; + Efreet_Cache_Icon_Theme *theme; + Eet_Data_Descriptor *theme_edd; Eet_Data_Descriptor *edd; Eet_File *icon_ef; Eet_File *theme_ef; @@ -616,6 +617,8 @@ main(int argc, char **argv) /* finish efreet init */ if (!efreet_init()) goto on_error; + /* Need to init edd's, so they are like we want, not like userspace wants */ + theme_edd = efreet_icon_theme_edd(EINA_TRUE); icon_themes = eina_hash_string_superfast_new(EINA_FREE_CB(icon_theme_free)); @@ -695,13 +698,13 @@ main(int argc, char **argv) if (!theme->valid || theme->hidden) continue; #ifndef STRICT_SPEC - if (!theme->name.name) continue; + if (!theme->theme.name.name) continue; #endif themes = eina_hash_string_superfast_new(NULL); /* read icons from the eet file */ - cache = eet_data_read(icon_ef, edd, theme->name.internal); + cache = eet_data_read(icon_ef, edd, theme->theme.name.internal); /* No existing cache before, so create it */ if (!cache) @@ -718,14 +721,14 @@ main(int argc, char **argv) if (!cache->dirs) cache->dirs = eina_hash_string_superfast_new(NULL); - if (cache_scan(theme, themes, cache->icons, cache->dirs, &changed)) + if (cache_scan(&(theme->theme), themes, cache->icons, cache->dirs, &changed)) { fprintf(stderr, "generated: '%s' %i (%i)\n", - theme->name.internal, + theme->theme.name.internal, changed, eina_hash_population(cache->icons)); if (changed) - eet_data_write(icon_ef, edd, theme->name.internal, cache, 1); + eet_data_write(icon_ef, edd, theme->theme.name.internal, cache, 1); changed = EINA_FALSE; } @@ -735,7 +738,7 @@ main(int argc, char **argv) free(cache); /* TODO: Only write if changed */ - eet_data_write(theme_ef, efreet_icon_theme_edd(), theme->name.internal, theme, 1); + eet_data_write(theme_ef, theme_edd, theme->theme.name.internal, theme, 1); } eina_iterator_free(it); diff --git a/src/lib/efreet_cache.c b/src/lib/efreet_cache.c index e1e7c38..5dbe4ea 100644 --- a/src/lib/efreet_cache.c +++ b/src/lib/efreet_cache.c @@ -475,7 +475,7 @@ efreet_icons_edd(Eina_Bool include_dirs) * Needs EAPI because of helper binaries */ EAPI Eet_Data_Descriptor * -efreet_icon_theme_edd(void) +efreet_icon_theme_edd(Eina_Bool cache) { Eet_Data_Descriptor_Class eddc; @@ -500,28 +500,37 @@ efreet_icon_theme_edd(void) EET_DATA_DESCRIPTOR_ADD_BASIC(icon_theme_directory_edd, Efreet_Icon_Theme_Directory, "size.threshold", size.threshold, EET_T_UINT); - EET_EINA_FILE_DATA_DESCRIPTOR_CLASS_SET(&eddc, Efreet_Icon_Theme); + EET_EINA_FILE_DATA_DESCRIPTOR_CLASS_SET(&eddc, Efreet_Cache_Icon_Theme); icon_theme_edd = eet_data_descriptor_file_new(&eddc); if (!icon_theme_edd) return NULL; - EET_DATA_DESCRIPTOR_ADD_BASIC(icon_theme_edd, Efreet_Icon_Theme, - "name.internal", name.internal, EET_T_STRING); - EET_DATA_DESCRIPTOR_ADD_BASIC(icon_theme_edd, Efreet_Icon_Theme, - "name.name", name.name, EET_T_STRING); - EET_DATA_DESCRIPTOR_ADD_BASIC(icon_theme_edd, Efreet_Icon_Theme, - "comment", comment, EET_T_STRING); - EET_DATA_DESCRIPTOR_ADD_BASIC(icon_theme_edd, Efreet_Icon_Theme, - "example_icon", example_icon, EET_T_STRING); + EET_DATA_DESCRIPTOR_ADD_BASIC(icon_theme_edd, Efreet_Cache_Icon_Theme, + "name.internal", theme.name.internal, EET_T_STRING); + EET_DATA_DESCRIPTOR_ADD_BASIC(icon_theme_edd, Efreet_Cache_Icon_Theme, + "name.name", theme.name.name, EET_T_STRING); + EET_DATA_DESCRIPTOR_ADD_BASIC(icon_theme_edd, Efreet_Cache_Icon_Theme, + "comment", theme.comment, EET_T_STRING); + EET_DATA_DESCRIPTOR_ADD_BASIC(icon_theme_edd, Efreet_Cache_Icon_Theme, + "example_icon", theme.example_icon, EET_T_STRING); eet_data_descriptor_element_add(icon_theme_edd, "paths", EET_T_STRING, EET_G_LIST, - offsetof(Efreet_Icon_Theme, paths), 0, NULL, NULL); + offsetof(Efreet_Cache_Icon_Theme, theme.paths), 0, NULL, NULL); eet_data_descriptor_element_add(icon_theme_edd, "inherits", EET_T_STRING, EET_G_LIST, - offsetof(Efreet_Icon_Theme, inherits), 0, NULL, NULL); - EET_DATA_DESCRIPTOR_ADD_LIST(icon_theme_edd, Efreet_Icon_Theme, - "directories", directories, icon_theme_directory_edd); + offsetof(Efreet_Cache_Icon_Theme, theme.inherits), 0, NULL, NULL); + EET_DATA_DESCRIPTOR_ADD_LIST(icon_theme_edd, Efreet_Cache_Icon_Theme, + "directories", theme.directories, icon_theme_directory_edd); - EET_DATA_DESCRIPTOR_ADD_BASIC(icon_theme_edd, Efreet_Icon_Theme, - "last_cache_check", last_cache_check, EET_T_DOUBLE); + if (cache) + { + EET_DATA_DESCRIPTOR_ADD_BASIC(icon_theme_edd, Efreet_Cache_Icon_Theme, + "last_cache_check", last_cache_check, EET_T_LONG_LONG); + + EET_DATA_DESCRIPTOR_ADD_BASIC(icon_theme_edd, Efreet_Cache_Icon_Theme, + "path", path, EET_T_STRING); + + EET_DATA_DESCRIPTOR_ADD_HASH(icon_theme_edd, Efreet_Cache_Icon_Theme, + "dirs", dirs, efreet_icon_directory_edd()); + } return icon_theme_edd; } @@ -676,7 +685,7 @@ Efreet_Icon_Theme * efreet_cache_icon_theme_find(const char *theme) { 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(), theme); + return eet_data_read(icon_theme_cache, efreet_icon_theme_edd(EINA_FALSE), theme); } void diff --git a/src/lib/efreet_cache_private.h b/src/lib/efreet_cache_private.h index ccb926d..1add8f8 100644 --- a/src/lib/efreet_cache_private.h +++ b/src/lib/efreet_cache_private.h @@ -12,8 +12,25 @@ EAPI Eet_Data_Descriptor *efreet_desktop_edd(void); EAPI Eet_Data_Descriptor *efreet_hash_array_string_edd(void); EAPI Eet_Data_Descriptor *efreet_hash_string_edd(void); EAPI Eet_Data_Descriptor *efreet_array_string_edd(void); -EAPI Eet_Data_Descriptor *efreet_icon_theme_edd(void); +EAPI Eet_Data_Descriptor *efreet_icon_theme_edd(Eina_Bool cache); EAPI Eet_Data_Descriptor *efreet_icons_edd(Eina_Bool include_dirs); EAPI Eet_Data_Descriptor *efreet_icons_fallback_edd(Eina_Bool include_dirs); +typedef struct Efreet_Cache_Icon_Theme Efreet_Cache_Icon_Theme; + +struct Efreet_Cache_Icon_Theme +{ + Efreet_Icon_Theme theme; + + long long last_cache_check; /**< Last time the cache was checked */ + + Eina_Hash *dirs; /**< All possible icon paths for this theme */ + + const char *path; /**< path to index.theme */ + + Eina_Bool hidden:1; /**< Should this theme be hidden from users */ + Eina_Bool valid:1; /**< Have we seen an index for this theme */ + Eina_Bool changed:1; /**< Changed since last seen */ +}; + #endif diff --git a/src/lib/efreet_icon.h b/src/lib/efreet_icon.h index 765a72b..8ee6aa1 100644 --- a/src/lib/efreet_icon.h +++ b/src/lib/efreet_icon.h @@ -63,14 +63,9 @@ struct Efreet_Icon_Theme /* An icon theme can have multiple directories that store it's icons. We * need to be able to find a search each one. */ - Eina_List *paths; /**< The paths */ - Eina_List *inherits; /**< Icon themes we inherit from */ - Eina_List *directories; /**< List of subdirectories for this theme */ - - double last_cache_check; /**< Last time the cache was checked */ - - unsigned char hidden:1; /**< Should this theme be hidden from users */ - unsigned char valid:1; /**< Have we seen an index for this theme */ + Eina_List *paths; /**< The paths */ + Eina_List *inherits; /**< Icon themes we inherit from */ + Eina_List *directories; /**< List of subdirectories for this theme */ }; /** diff --git a/src/tests/ef_icon_theme.c b/src/tests/ef_icon_theme.c index 90eb668..6cad371 100644 --- a/src/tests/ef_icon_theme.c +++ b/src/tests/ef_icon_theme.c @@ -558,7 +558,7 @@ ef_icons_find(Efreet_Icon_Theme *theme, Eina_Hash *icons) ef_icons_find(parent_theme, icons); } } - else if (theme->valid && strcmp(theme->name.internal, "hicolor")) + else if (strcmp(theme->name.internal, "hicolor")) { Efreet_Icon_Theme *parent_theme; diff --git a/src/tests/efreet_icon_cache_dump.c b/src/tests/efreet_icon_cache_dump.c index 40abf18..da6291c 100644 --- a/src/tests/efreet_icon_cache_dump.c +++ b/src/tests/efreet_icon_cache_dump.c @@ -89,7 +89,7 @@ main(int argc, char **argv) { for (i = 1; i < argc; i++) { - theme = eet_data_read(theme_ef, efreet_icon_theme_edd(), argv[i]); + theme = eet_data_read(theme_ef, efreet_icon_theme_edd(EINA_FALSE), argv[i]); if (theme) l = eina_list_append(l, theme); } } @@ -103,7 +103,7 @@ main(int argc, char **argv) { for (i = 0; i < num; i++) { - theme = eet_data_read(theme_ef, efreet_icon_theme_edd(), keys[i]); + theme = eet_data_read(theme_ef, efreet_icon_theme_edd(EINA_FALSE), keys[i]); if (theme) l = eina_list_append(l, theme); } free(keys);