5 #include <Ecore_File.h>
13 #define FREE(x) do { free(x); x = NULL; } while (0);
15 static void ef_icon_theme_themes_find(const char *search_dir,
17 static void ef_icons_find(Efreet_Icon_Theme *theme, Ecore_List *themes,
19 static void ef_read_dir(const char *dir, Ecore_Hash *icons);
22 ef_cb_efreet_icon_theme(void)
27 unsetenv("XDG_DATA_HOME");
29 putenv("HOME=/var/tmp");
32 tmp = efreet_icon_user_dir_get();
33 if (strcmp(tmp, "/var/tmp/.local/share/icons"))
35 printf("efreet_icon_user_dir_get() returned incorrect "
36 "value (%s) on HOME=/var/tmp\n", tmp);
44 tmp = efreet_icon_user_dir_get();
45 if (strcmp(tmp, "/tmp/.local/share/icons"))
47 printf("efreet_icon_user_dir_get() returned incorrect "
48 "value (%s) on HOME=\n", tmp);
56 ef_cb_efreet_icon_theme_list(void)
61 Efreet_Icon_Theme *theme;
62 Ecore_List *icon_dirs;
66 dirs = ecore_hash_new(ecore_str_hash, ecore_str_compare);
67 ecore_hash_free_key_cb_set(dirs, free);
69 icon_dirs = efreet_data_dirs_get();
70 ecore_list_first_goto(icon_dirs);
72 ef_icon_theme_themes_find(efreet_icon_user_dir_get(), dirs);
73 while ((dir = ecore_list_next(icon_dirs)))
75 snprintf(buf, sizeof(buf), "%s/icons", dir);
76 ef_icon_theme_themes_find(buf, dirs);
78 ef_icon_theme_themes_find("/usr/share/pixmaps", dirs);
80 themes = efreet_icon_theme_list_get();
81 ecore_list_first_goto(themes);
82 while ((theme = ecore_list_next(themes)))
84 if (ecore_hash_get(dirs, theme->name.internal))
85 ecore_hash_remove(dirs, theme->name.internal);
88 printf("efreet_icon_theme_list_get() returned %s which we didn't "
89 "see when scanning the directories.\n", theme->name.internal);
93 ecore_list_destroy(themes);
95 themes = ecore_hash_keys(dirs);
96 if (ecore_list_count(themes) > 0)
100 printf("efreet_icon_theme_list_get() missed: ");
101 ecore_list_first_goto(themes);
102 while ((dir = ecore_list_next(themes)))
108 ecore_list_destroy(themes);
109 ecore_hash_destroy(dirs);
115 ef_icon_theme_themes_find(const char *search_dir, Ecore_Hash *themes)
120 if (!search_dir || !themes) return;
122 dirs = ecore_file_ls(search_dir);
125 while ((dir = ecore_list_first_remove(dirs)))
129 /* if we've already added the theme we're done */
130 if (ecore_hash_get(themes, dir))
136 /* if the index.theme file exists we open it and look for the hidden
138 snprintf(p, sizeof(p), "%s/%s/index.theme", search_dir, dir);
139 if (ecore_file_exists(p))
145 ini = efreet_ini_new(p);
146 efreet_ini_section_set(ini, "Icon Theme");
148 if (efreet_ini_boolean_get(ini, "Hidden")) skip = 1;
149 if (!efreet_ini_localestring_get(ini, "Name")) skip = 1;
150 efreet_ini_free(ini);
155 ecore_hash_set(themes, d, d);
160 ecore_list_destroy(dirs);
163 const char *icons[] =
175 "document-open-recent",
176 "document-page-setup",
178 "document-print-preview",
179 "document-properties",
192 "format-indent-less",
193 "format-indent-more",
194 "format-justify-center",
195 "format-justify-fill",
196 "format-justify-left",
197 "format-justify-right",
198 "format-text-direction-ltr",
199 "format-text-direction-rtl",
201 "format-text-italic",
202 "format-text-underline",
203 "format-text-strikethrough",
224 "mail-mark-important",
234 "media-playback-pause",
235 "media-playback-start",
236 "media-playback-stop",
238 "media-seek-backward",
239 "media-seek-forward",
240 "media-skip-backward",
241 "media-skip-forward",
242 "system-lock-screen",
247 "tools-check-spelling",
250 "view-sort-ascending",
251 "view-sort-descending",
259 "accessories-calculator",
260 "accessories-character-map",
261 "accessories-dictionary",
262 "accessories-text-editor",
264 "multimedia-volume-control",
266 "preferences-desktop-accessibility",
267 "preferences-desktop-font",
268 "preferences-desktop-keyboard",
269 "preferences-desktop-locale",
270 "preferences-desktop-multimedia",
271 "preferences-desktop-screensaver",
272 "preferences-desktop-theme",
273 "preferences-desktop-wallpaper",
274 "system-file-manager",
275 "system-software-update",
276 "utilities-terminal",
277 "applications-accessories",
278 "applications-development",
279 "applications-games",
280 "applications-graphics",
281 "applications-internet",
282 "applications-multimedia",
283 "applications-office",
284 "applications-other",
285 "applications-system",
286 "applications-utilities",
287 "preferences-desktop",
288 "preferences-desktop-accessibility",
289 "preferences-desktop-peripherals",
290 "preferences-desktop-personal",
292 "preferences-system",
293 "preferences-system-network",
296 "audio-input-microphone",
303 "drive-removable-media",
323 "emblem-symbolic-link",
324 "emblem-synchronized",
341 "application-x-executable",
348 "text-x-generic-template",
351 "x-office-address-book",
354 "x-office-presentation",
355 "x-office-spreadsheet",
364 "appointment-missed",
368 "audio-volume-medium",
369 "audio-volume-muted",
373 "dialog-information",
377 "folder-drag-accept",
387 "mail-signed-verified",
388 "media-playlist-repeat",
389 "media-playlist-shuffle",
395 "network-transmit-receive",
398 "software-update-available",
399 "software-update-urgent",
401 "sync-synchronizing",
410 "weather-clear-night",
411 "weather-few-clouds",
412 "weather-few-clouds-night",
415 "weather-severe-alert",
417 "weather-showers-scattered",
425 ef_cb_efreet_icon_match(void)
428 Ecore_Hash *icon_hash;
429 Efreet_Icon_Theme *theme;
432 themes = efreet_icon_theme_list_get();
433 ecore_list_first_goto(themes);
434 while ((theme = ecore_list_next(themes)))
436 if (!strcmp(theme->name.internal, THEME))
442 printf("Theme not installed, SKIPPED.\n");
443 ecore_list_destroy(themes);
447 icon_hash = ecore_hash_new(ecore_str_hash, ecore_str_compare);
448 ecore_hash_free_key_cb_set(icon_hash, free);
449 ecore_hash_free_value_cb_set(icon_hash, free);
451 ef_icons_find(theme, themes, icon_hash);
452 ecore_list_destroy(themes);
454 double start = ecore_time_get();
455 for (i = 0; icons[i] != NULL; i++)
459 path = efreet_icon_path_find(THEME, icons[i], SIZE);
464 if (ecore_hash_get(icon_hash, icons[i]))
466 printf("NOT FOUND %s\n", icons[i]);
473 s = strrchr(path, '.');
475 s = strrchr(path, '/');
478 if (s && strcmp(s, icons[i]))
480 printf("Name mismatch name (%s) vs ef (%s)\n", icons[i], s);
485 printf("Time: %f\n", (ecore_time_get() - start));
486 ecore_hash_destroy(icon_hash);
488 start = ecore_time_get();
489 for (i = 0; icons[i] != NULL; i++)
493 path = efreet_icon_path_find(THEME, icons[i], SIZE);
497 s = strrchr(path, '.');
499 s = strrchr(path, '/');
502 if (s && strcmp(s, icons[i]))
504 printf("Name mismatch name (%s) vs ef (%s)\n", icons[i], s);
509 printf("Time: %f\n", (ecore_time_get() - start));
515 ef_icons_find(Efreet_Icon_Theme *theme, Ecore_List *themes, Ecore_Hash *icons)
519 if (!theme || !icons) return;
521 if (theme->paths.count == 1)
523 Efreet_Icon_Theme_Directory *dir;
525 ecore_list_first_goto(theme->directories);
526 while ((dir = ecore_list_next(theme->directories)))
528 if (theme->paths.count > 1)
533 list = theme->paths.path;
534 ecore_list_first_goto(list);
535 while ((tmp = ecore_list_next(list)))
537 snprintf(path, sizeof(path), "%s/%s/", tmp, dir->name);
538 ef_read_dir(path, icons);
541 else if (theme->paths.count == 1)
543 snprintf(path, sizeof(path), "%s/%s/", (char *)theme->paths.path, dir->name);
544 ef_read_dir(path, icons);
548 else if (theme->paths.count > 1)
550 const char *theme_path;
552 ecore_list_first_goto(theme->paths.path);
553 while ((theme_path = ecore_list_next(theme->paths.path)))
555 Efreet_Icon_Theme_Directory *dir;
557 ecore_list_first_goto(theme->directories);
558 while ((dir = ecore_list_next(theme->directories)))
560 snprintf(path, sizeof(path), "%s/%s/", theme_path, dir->name);
561 ef_read_dir(path, icons);
568 Efreet_Icon_Theme *parent_theme;
571 ecore_list_first_goto(theme->inherits);
572 while ((parent = ecore_list_next(theme->inherits)))
574 ecore_list_first_goto(themes);
575 while ((parent_theme = ecore_list_next(themes)))
577 if (!strcmp(parent_theme->name.internal, parent))
578 ef_icons_find(parent_theme, themes, icons);
584 Efreet_Icon_Theme *parent_theme;
586 ecore_list_first_goto(themes);
587 while ((parent_theme = ecore_list_next(themes)))
589 if (!strcmp(parent_theme->name.internal, "hicolor"))
590 ef_icons_find(parent_theme, themes, icons);
594 ef_read_dir("/usr/share/pixmaps", icons);
598 ef_read_dir(const char *dir, Ecore_Hash *icons)
603 if (!dir || !icons) return;
605 files = ecore_file_ls(dir);
608 while ((file = ecore_list_first_remove(files)))
612 p = strrchr(file, '.');
619 if (!strcmp(p, ".png") || !strcmp(p, ".xpm"))
623 p = strrchr(file, '/');
625 if (p) ecore_hash_set(icons, strdup(p), strdup(p));
630 ecore_list_destroy(files);