return EINA_TRUE;
}
+static Eina_Bool
+check_changed(Efreet_Cache_Icon_Theme *theme)
+{
+ Eina_List *l;
+ const char *name;
+
+ if (!theme) return EINA_FALSE;
+
+ if (theme->changed) return EINA_TRUE;
+ if (theme->theme.inherits)
+ {
+ EINA_LIST_FOREACH(theme->theme.inherits, l, name)
+ {
+ Efreet_Cache_Icon_Theme *inherit;
+
+ inherit = eina_hash_find(icon_themes, name);
+ if (!inherit) fprintf(stderr, "Theme `%s` not found for `%s`.\n",
+ name, theme->theme.name.internal);
+ if (check_changed(inherit)) return EINA_TRUE;
+ }
+ }
+ else if (strcmp(theme->theme.name.internal, "hicolor"))
+ {
+ theme = eina_hash_find(icon_themes, "hicolor");
+ if (check_changed(theme)) return EINA_TRUE;
+ }
+ return EINA_FALSE;
+}
+
static Efreet_Icon_Theme_Directory *
icon_theme_directory_new(Efreet_Ini *ini, const char *name)
{
dir = NEW(Efreet_Icon_Theme_Directory, 1);
if (!dir) return NULL;
dir->name = eina_stringshare_add(name);
+ eina_array_push(strs, dir->name);
efreet_ini_section_set(ini, name);
return dir;
}
-static void
+static Eina_Bool
icon_theme_index_read(Efreet_Cache_Icon_Theme *theme, const char *path)
{
- /* TODO: return error value */
Efreet_Ini *ini;
Efreet_Icon_Theme_Directory *dir;
const char *tmp;
+ struct stat st;
+ char rp[PATH_MAX];
- if (!theme || !path) return;
+ if (!theme || !path) return EINA_FALSE;
+
+ if (!realpath(path, rp)) return EINA_FALSE;
+
+ if (stat(rp, &st) < 0) return EINA_FALSE;
+ if (theme->path && !strcmp(theme->path, rp) && theme->last_cache_check >= (long long) st.st_mtime)
+ {
+ /* no change */
+ theme->valid = 1;
+ return EINA_TRUE;
+ }
+ if (!theme->path || strcmp(theme->path, rp))
+ {
+ theme->path = eina_stringshare_add(rp);
+ eina_array_push(strs, theme->path);
+ }
+ if ((long long) st.st_mtime > theme->last_cache_check)
+ theme->last_cache_check = (long long) st.st_mtime;
+ theme->changed = 1;
ini = efreet_ini_new(path);
- if (!ini) return;
+ if (!ini) return EINA_FALSE;
if (!ini->data)
{
efreet_ini_free(ini);
- return;
+ return EINA_FALSE;
}
efreet_ini_section_set(ini, "Icon Theme");
tmp = efreet_ini_localestring_get(ini, "Name");
- if (tmp) theme->theme.name.name = eina_stringshare_add(tmp);
+ if (tmp)
+ {
+ theme->theme.name.name = eina_stringshare_add(tmp);
+ eina_array_push(strs, theme->theme.name.name);
+ }
tmp = efreet_ini_localestring_get(ini, "Comment");
- if (tmp) theme->theme.comment = eina_stringshare_add(tmp);
+ if (tmp)
+ {
+ theme->theme.comment = eina_stringshare_add(tmp);
+ eina_array_push(strs, theme->theme.comment);
+ }
tmp = efreet_ini_string_get(ini, "Example");
- if (tmp) theme->theme.example_icon = eina_stringshare_add(tmp);
+ if (tmp)
+ {
+ theme->theme.example_icon = eina_stringshare_add(tmp);
+ eina_array_push(strs, theme->theme.example_icon);
+ }
theme->hidden = efreet_ini_boolean_get(ini, "Hidden");
if (tmp)
{
char *t, *s, *p;
+ const char *i;
size_t len;
len = strlen(tmp) + 1;
{
*p = '\0';
- theme->theme.inherits = eina_list_append(theme->theme.inherits, eina_stringshare_add(s));
+ i = eina_stringshare_add(s);
+ theme->theme.inherits = eina_list_append(theme->theme.inherits, i);
+ eina_array_push(strs, i);
s = ++p;
p = strchr(s, ',');
}
- theme->theme.inherits = eina_list_append(theme->theme.inherits, eina_stringshare_add(s));
+ i = eina_stringshare_add(s);
+ theme->theme.inherits = eina_list_append(theme->theme.inherits, i);
+ eina_array_push(strs, i);
}
/* make sure this one is done last as setting the directory will change
error:
efreet_ini_free(ini);
+
+ return EINA_TRUE;
}
static Eina_Bool
const char *name;
const char *path;
char buf[PATH_MAX];
+ struct stat st;
+
+ if (stat(entry->path, &st) < 0) continue;
if ((entry->type != EINA_FILE_DIR) &&
(entry->type != EINA_FILE_LNK))
{
theme = NEW(Efreet_Cache_Icon_Theme, 1);
theme->theme.name.internal = eina_stringshare_add(name);
+ eina_array_push(strs, theme->theme.name.internal);
eina_hash_direct_add(icon_themes,
(void *)theme->theme.name.internal, theme);
+ theme->changed = 1;
+ }
+ if ((long long) st.st_mtime > theme->last_cache_check)
+ {
+ theme->last_cache_check = (long long) st.st_mtime;
+ theme->changed = 1;
}
- path = eina_stringshare_add(entry->path);
- if (!eina_list_data_find(theme->theme.paths, path))
+ /* TODO: We need to handle change in order of included paths */
+ if (!eina_list_search_unsorted(theme->theme.paths, EINA_COMPARE_CB(strcmp), entry->path))
+ {
+ path = eina_stringshare_add(entry->path);
theme->theme.paths = eina_list_append(theme->theme.paths, path);
- else
- eina_stringshare_del(path);
+ eina_array_push(strs, path);
+ theme->changed = 1;
+ }
- theme->last_cache_check = ecore_time_unix_get();
/* we're already valid so no reason to check for an index.theme file */
if (theme->valid) continue;
memcpy(buf, entry->path, entry->path_length);
memcpy(buf + entry->path_length, "/index.theme", sizeof("/index.theme"));
if (ecore_file_exists(buf))
- icon_theme_index_read(theme, buf);
+ {
+ if (!icon_theme_index_read(theme, buf))
+ theme->valid = 0;
+ }
}
eina_iterator_free(it);
return EINA_TRUE;
icon_theme_free(Efreet_Cache_Icon_Theme *theme)
{
void *data;
- Efreet_Icon_Theme_Directory *dir;
- EINA_LIST_FREE(theme->theme.paths, data)
- eina_stringshare_del(data);
- EINA_LIST_FREE(theme->theme.inherits, data)
- eina_stringshare_del(data);
- EINA_LIST_FREE(theme->theme.directories, dir)
- {
- eina_stringshare_del(dir->name);
- free(dir);
- }
+ eina_list_free(theme->theme.paths);
+ eina_list_free(theme->theme.inherits);
+ EINA_LIST_FREE(theme->theme.directories, data)
+ free(data);
+ if (theme->dirs) efreet_hash_free(theme->dirs, free);
free(theme);
}
Eina_Bool changed = EINA_FALSE;
int lockfd = -1;
int tmpfd = -1;
- int i;
+ char **keys;
+ int num, i;
for (i = 1; i < argc; i++)
{
theme_version->major = EFREET_ICON_CACHE_MAJOR;
theme_version->minor = EFREET_ICON_CACHE_MINOR;
+ keys = eet_list(theme_ef, "*", &num);
+ if (keys)
+ {
+ for (i = 0; i < num; i++)
+ {
+ if (!strncmp(keys[i], "efreet", 6)) continue;
+ theme = eet_data_read(theme_ef, theme_edd, keys[i]);
+ if (theme) eina_hash_direct_add(icon_themes, theme->theme.name.internal, theme);
+ }
+ free(keys);
+ }
+
/* scan themes */
cache_theme_scan(efreet_icon_deprecated_user_dir_get());
cache_theme_scan(efreet_icon_user_dir_get());
cache_theme_scan("/usr/share/pixmaps");
/* scan icons */
- edd = efreet_icons_edd(EINA_TRUE);
+ edd = efreet_icons_edd();
it = eina_hash_iterator_data_new(icon_themes);
EINA_ITERATOR_FOREACH(it, theme)
{
if (!cache->icons)
cache->icons = eina_hash_string_superfast_new(NULL);
- if (!cache->dirs)
- cache->dirs = eina_hash_string_superfast_new(NULL);
+ changed = theme->changed = check_changed(theme);
+ if (theme->changed && theme->dirs)
+ {
+ efreet_hash_free(theme->dirs, free);
+ theme->dirs = NULL;
+ }
+ if (!theme->dirs)
+ theme->dirs = eina_hash_string_superfast_new(NULL);
- if (cache_scan(&(theme->theme), themes, cache->icons, cache->dirs, &changed))
+ if (cache_scan(&(theme->theme), themes, cache->icons, theme->dirs, &changed))
{
fprintf(stderr, "generated: '%s' %i (%i)\n",
theme->theme.name.internal,
eina_hash_free(themes);
efreet_hash_free(cache->icons, EINA_FREE_CB(efreet_cache_icon_free));
- efreet_hash_free(cache->dirs, free);
free(cache);
/* TODO: Only write if changed */
}
eina_iterator_free(it);
- edd = efreet_icons_fallback_edd(EINA_TRUE);
+ edd = efreet_icons_fallback_edd();
/* read fallback icons from the eet file */
cache = eet_data_read(icon_ef, edd, EFREET_CACHE_ICON_FALLBACK);
if (!cache->icons)
cache->icons = eina_hash_string_superfast_new(NULL);
- if (!cache->dirs)
- cache->dirs = eina_hash_string_superfast_new(NULL);
+ theme = eet_data_read(theme_ef, theme_edd, EFREET_CACHE_ICON_FALLBACK);
+ if (!theme)
+ theme = NEW(Efreet_Cache_Icon_Theme, 1);
+ if (!theme->dirs)
+ theme->dirs = eina_hash_string_superfast_new(NULL);
/* Save fallback in the right part */
- if (cache_fallback_scan(cache->icons, cache->dirs, &changed))
+ if (cache_fallback_scan(cache->icons, theme->dirs, &changed))
{
fprintf(stderr, "generated: fallback %i (%i)\n", changed, eina_hash_population(cache->icons));
if (changed)
}
efreet_hash_free(cache->icons, EINA_FREE_CB(efreet_cache_icon_fallback_free));
- efreet_hash_free(cache->dirs, free);
free(cache);
eina_hash_free(icon_themes);
if (!c) return NULL;
if (c->icons) efreet_hash_free(c->icons, EINA_FREE_CB(efreet_cache_icon_free));
- if (c->dirs) efreet_hash_free(c->dirs, free);
free(c);
return NULL;
if (!c) return NULL;
if (c->icons) efreet_hash_free(c->icons, EINA_FREE_CB(efreet_cache_icon_fallback_free));
- if (c->dirs) efreet_hash_free(c->dirs, free);
free(c);
return NULL;
* Needs EAPI because of helper binaries
*/
EAPI Eet_Data_Descriptor *
-efreet_icons_edd(Eina_Bool include_dirs)
+efreet_icons_edd(void)
{
Eet_Data_Descriptor_Class eddc;
EET_DATA_DESCRIPTOR_ADD_HASH(icons_edd, Efreet_Cache_Icons,
"icons", icons, icon_edd);
- if (include_dirs)
- EET_DATA_DESCRIPTOR_ADD_HASH(icons_edd, Efreet_Cache_Icons,
- "dirs", dirs, efreet_icon_directory_edd());
-
return icons_edd;
}
* Needs EAPI because of helper binaries
*/
EAPI Eet_Data_Descriptor *
-efreet_icons_fallback_edd(Eina_Bool include_dirs)
+efreet_icons_fallback_edd(void)
{
Eet_Data_Descriptor_Class eddc;
EET_DATA_DESCRIPTOR_ADD_HASH(fallback_edd, Efreet_Cache_Icons,
"icons", icons, icon_fallback_edd);
- if (include_dirs)
- EET_DATA_DESCRIPTOR_ADD_HASH(fallback_edd, Efreet_Cache_Icons,
- "dirs", dirs, efreet_icon_directory_edd());
-
return fallback_edd;
}
if (!theme_name)
{
INFO("loading theme %s", theme->name.internal);
- theme_cache = eet_data_read(icon_cache, efreet_icons_edd(EINA_FALSE), theme->name.internal);
+ theme_cache = eet_data_read(icon_cache, efreet_icons_edd(), theme->name.internal);
if (theme_cache && !theme_cache->icons)
theme_cache->icons = eina_hash_string_superfast_new(NULL);
if (theme_cache)
if (!fallback_cache)
{
INFO("loading fallback cache");
- fallback_cache = eet_data_read(icon_cache, efreet_icons_fallback_edd(EINA_FALSE), EFREET_CACHE_ICON_FALLBACK);
+ fallback_cache = eet_data_read(icon_cache, efreet_icons_fallback_edd(), EFREET_CACHE_ICON_FALLBACK);
if (fallback_cache && !fallback_cache->icons)
fallback_cache->icons = eina_hash_string_superfast_new(NULL);
}