diff --git a/legacy/ecore/src/lib/ecore_desktop/Ecore_Desktop.h b/legacy/ecore/src/lib/ecore_desktop/Ecore_Desktop.h index b73658ce51..0fa6b3cec3 100644 --- a/legacy/ecore/src/lib/ecore_desktop/Ecore_Desktop.h +++ b/legacy/ecore/src/lib/ecore_desktop/Ecore_Desktop.h @@ -91,7 +91,8 @@ typedef struct _Ecore_Desktop_Icon_Theme Ecore_Desktop_Icon_Theme; struct _Ecore_Desktop_Icon_Theme_Directory { - char *path; + Ecore_Hash *icons; + char *full_path; char *type; int size, minimum, maximum, threshold; }; diff --git a/legacy/ecore/src/lib/ecore_desktop/ecore_desktop_icon.c b/legacy/ecore/src/lib/ecore_desktop/ecore_desktop_icon.c index 41a708d090..994ed542be 100644 --- a/legacy/ecore/src/lib/ecore_desktop/ecore_desktop_icon.c +++ b/legacy/ecore/src/lib/ecore_desktop/ecore_desktop_icon.c @@ -10,7 +10,8 @@ static char *_ecore_desktop_icon_find0(const char *icon, const char *icon_size, - const char *icon_theme); + const char *icon_theme, + int *in_cache); static int _ecore_desktop_icon_theme_list_add(void *data, const char *path); @@ -86,7 +87,7 @@ ecore_desktop_icon_find(const char *icon, const char *icon_size, if ((ext) && (!strcmp(ext, ".ico"))) continue; - result = _ecore_desktop_icon_find0(icn, icon_size, icon_theme); + result = _ecore_desktop_icon_find0(icn, icon_size, icon_theme, &in_cache); if (result) break; } @@ -129,7 +130,7 @@ ecore_desktop_icon_find(const char *icon, const char *icon_size, */ static char * _ecore_desktop_icon_find0(const char *icon, const char *icon_size, - const char *icon_theme) + const char *icon_theme, int *in_cache) { /* NOTES ON OPTIMIZATIONS * @@ -153,7 +154,7 @@ _ecore_desktop_icon_find0(const char *icon, const char *icon_size, * the directory where the index.theme file lives. * * On the other hand, OS caching (at least in linux) seems to do a reasonable - * job here. + * job here. But not good enough though. * * We also precalculate and cache all the information extracted from * the .theme files. @@ -250,11 +251,29 @@ _ecore_desktop_icon_find0(const char *icon, const char *icon_size, continue; if ((ext[i][0] != '\0') && (has_icon_ext)) continue; - snprintf(path, PATH_MAX, "%s/%s/%s%s", icon_theme, directory->path, icon, ext[i]); + if (directory->icons) + { + snprintf(path, PATH_MAX, "%s%s", icon, ext[i]); #ifdef DEBUG - printf("FDO icon = %s\n", path); + printf("FDO icon = %s\n", path); #endif - found = ecore_desktop_paths_file_find(ecore_desktop_paths_icons, path, 0, NULL, NULL); + found = ecore_hash_get(directory->icons, path); + if (found) + { + found = strdup(found); + if (match) + *in_cache = 1; + } + } + else + { + snprintf(path, PATH_MAX, "%s/%s%s", directory->full_path, icon, ext[i]); +#ifdef DEBUG + printf("FDO icon = %s\n", path); +#endif + if (ecore_file_exists(path)) + found = strdup(path); + } if (found) { if (ecore_file_is_dir(found)) @@ -302,13 +321,13 @@ _ecore_desktop_icon_find0(const char *icon, const char *icon_size, ecore_list_goto_first(theme->Inherits); while ((inherits = ecore_list_next(theme->Inherits)) != NULL) { - found = _ecore_desktop_icon_find0(icon, icon_size, inherits); + found = _ecore_desktop_icon_find0(icon, icon_size, inherits, in_cache); if (found) goto done; } } else /* Fall back strategy #3, Try the default hicolor theme. */ { - found = _ecore_desktop_icon_find0(icon, icon_size, "hicolor"); + found = _ecore_desktop_icon_find0(icon, icon_size, "hicolor", in_cache); if (found) goto done; } } @@ -443,7 +462,7 @@ Ecore_Desktop_Icon_Theme * ecore_desktop_icon_theme_get(const char *icon_theme, const char *lang) { Ecore_Desktop_Icon_Theme *result = NULL; - char *theme_path = NULL, *dir = NULL; + char *theme_path = NULL, *theme_dir = NULL; char *value; Ecore_List *Directories; char *directory; @@ -451,17 +470,17 @@ ecore_desktop_icon_theme_get(const char *icon_theme, const char *lang) if (icon_theme[0] == '/') { theme_path = strdup(icon_theme); - dir = ecore_file_get_dir(theme_path); - if (dir) - icon_theme = (char *)ecore_file_get_file(dir); -#ifdef DEBUG + theme_dir = ecore_file_get_dir(theme_path); + if (theme_dir) + icon_theme = (char *)ecore_file_get_file(theme_dir); +//#ifdef DEBUG printf("LOADING THEME %s - %s\n", icon_theme, theme_path); -#endif +//#endif } result = ecore_hash_get(icon_theme_cache, icon_theme); if (result) goto done; - if (!dir) + if (!theme_dir) { char icn[PATH_MAX]; @@ -471,6 +490,7 @@ ecore_desktop_icon_theme_get(const char *icon_theme, const char *lang) #endif theme_path = ecore_desktop_paths_file_find(ecore_desktop_paths_icons, icn, 2, NULL, NULL); + theme_dir = ecore_file_get_dir(theme_path); } if (!theme_path) goto error; result = calloc(1, sizeof(Ecore_Desktop_Icon_Theme)); @@ -480,6 +500,7 @@ ecore_desktop_icon_theme_get(const char *icon_theme, const char *lang) result->group = ecore_hash_get(result->data, "Icon Theme"); if (!result->group) goto error; + if ((strcmp(icon_theme, "hicolor") == 0)) result->hicolor = 1; @@ -522,8 +543,10 @@ ecore_desktop_icon_theme_get(const char *icon_theme, const char *lang) if ((dir) && (sub_group)) { char *size, *minsize, *maxsize, *threshold; + char full_path[PATH_MAX]; - dir->path = strdup(directory); + snprintf(full_path, PATH_MAX, "%s/%s", theme_dir, directory); + dir->full_path = strdup(full_path); value = ecore_hash_get(sub_group, "Type"); if (!value) value = "Threshold"; @@ -546,6 +569,27 @@ ecore_desktop_icon_theme_get(const char *icon_theme, const char *lang) dir->size = atoi(size); ecore_list_append(result->Directories, dir); + + dir->icons = ecore_hash_new(ecore_str_hash, ecore_str_compare); + if (dir->icons) + { + Ecore_List *files; + + ecore_hash_set_free_key(dir->icons, free); + ecore_hash_set_free_value(dir->icons, free); + files = ecore_file_ls(dir->full_path); + if (files) + { + const char *file; + + while ((file = ecore_list_next(files))) + { + snprintf(full_path, PATH_MAX, "%s/%s", dir->full_path, file); + ecore_hash_set(dir->icons, strdup(file), strdup(full_path)); + } + ecore_list_destroy(files); + } + } } else _ecore_desktop_icon_theme_directory_destroy(dir); @@ -563,13 +607,13 @@ ecore_desktop_icon_theme_get(const char *icon_theme, const char *lang) result->group = NULL; done: - if (dir) free(dir); + if (theme_dir) free(theme_dir); if (theme_path) free(theme_path); return result; error: - if (dir) free(dir); + if (theme_dir) free(theme_dir); if (theme_path) free(theme_path); if (result) { @@ -621,9 +665,11 @@ static void _ecore_desktop_icon_theme_directory_destroy(Ecore_Desktop_Icon_Theme_Directory * icon_theme_directory) { - if (icon_theme_directory->path) - free(icon_theme_directory->path); + if (icon_theme_directory->full_path) + free(icon_theme_directory->full_path); if (icon_theme_directory->type) free(icon_theme_directory->type); + if (icon_theme_directory->icons) + ecore_hash_destroy(icon_theme_directory->icons); free(icon_theme_directory); }