From 54ec9cec6751e8d948273d0139dc3e4329c9e440 Mon Sep 17 00:00:00 2001 From: Sebastian Dransfeld Date: Wed, 24 Nov 2010 21:10:52 +0000 Subject: [PATCH] listen to changes for icon dirs SVN revision: 54957 --- legacy/efreet/src/lib/efreet_cache.c | 4 -- legacy/efreet/src/lib/efreet_icon.c | 83 ++++++++++++++++++++++++++++ 2 files changed, 83 insertions(+), 4 deletions(-) diff --git a/legacy/efreet/src/lib/efreet_cache.c b/legacy/efreet/src/lib/efreet_cache.c index 4de488051f..8c0e2b0371 100644 --- a/legacy/efreet/src/lib/efreet_cache.c +++ b/legacy/efreet/src/lib/efreet_cache.c @@ -119,10 +119,6 @@ efreet_cache_init(void) NULL); if (!cache_monitor) goto error; -#if 0 - efreet_icon_changes_listen(); -#endif - #ifdef ICON_CACHE efreet_cache_icon_update(); #endif diff --git a/legacy/efreet/src/lib/efreet_icon.c b/legacy/efreet/src/lib/efreet_icon.c index 2ce0900382..25b06dda1e 100644 --- a/legacy/efreet/src/lib/efreet_icon.c +++ b/legacy/efreet/src/lib/efreet_icon.c @@ -29,6 +29,8 @@ static Eina_List *efreet_icon_extensions = NULL; static Eina_List *efreet_extra_icon_dirs = NULL; static Eina_Hash *efreet_icon_cache = NULL; +static Eina_Hash *change_monitors = NULL; + typedef struct Efreet_Icon_Cache Efreet_Icon_Cache; struct Efreet_Icon_Cache { @@ -102,6 +104,12 @@ static const char *efreet_cache_icon_lookup_path(Efreet_Cache_Icon_Element *elem static const char *efreet_cache_icon_lookup_path_path(Efreet_Cache_Icon_Element *elem, const char *path); static const char *efreet_cache_icon_fallback_lookup_path(Efreet_Cache_Icon *icon); static const char *efreet_cache_icon_fallback_lookup_path_path(Efreet_Cache_Icon *icon, const char *path); + +static void efreet_icon_changes_listen(void); +static void efreet_icon_changes_monitor_add(const char *path); +static void efreet_icon_changes_cb(void *data, Ecore_File_Monitor *em, + Ecore_File_Event event, const char *path); + #endif /** @@ -129,6 +137,7 @@ efreet_icon_init(void) efreet_extra_icon_dirs = NULL; efreet_icon_cache = eina_hash_string_superfast_new(EINA_FREE_CB(efreet_icon_cache_free)); + efreet_icon_changes_listen(); return 1; } @@ -150,6 +159,7 @@ efreet_icon_shutdown(void) IF_FREE_HASH(efreet_icon_cache); eina_log_domain_unregister(_efreet_icon_log_dom); + IF_FREE_HASH(change_monitors); } /** @@ -1910,4 +1920,77 @@ efreet_cache_icon_fallback_lookup_path_path(Efreet_Cache_Icon *icon, const char return NULL; } +static void +efreet_icon_changes_listen(void) +{ + Eina_List *l; + Eina_List *xdg_dirs; + char buf[PATH_MAX]; + const char *dir; + + if (!efreet_cache_update) return; + + change_monitors = eina_hash_string_superfast_new(EINA_FREE_CB(ecore_file_monitor_del)); + if (!change_monitors) return; + + efreet_icon_changes_monitor_add(efreet_icon_deprecated_user_dir_get()); + efreet_icon_changes_monitor_add(efreet_icon_user_dir_get()); + EINA_LIST_FOREACH(efreet_extra_icon_dirs, l, dir) + efreet_icon_changes_monitor_add(dir); + + xdg_dirs = efreet_data_dirs_get(); + EINA_LIST_FOREACH(xdg_dirs, l, dir) + { + snprintf(buf, sizeof(buf), "%s/icons", dir); + efreet_icon_changes_monitor_add(buf); + } + +#ifndef STRICT_SPEC + EINA_LIST_FOREACH(xdg_dirs, l, dir) + { + snprintf(buf, sizeof(buf), "%s/pixmaps", dir); + efreet_icon_changes_monitor_add(buf); + } +#endif + + efreet_icon_changes_monitor_add("/usr/share/pixmaps"); +} + +static void +efreet_icon_changes_monitor_add(const char *path) +{ + char rp[PATH_MAX]; + + if (!realpath(path, rp)) return; + if (eina_hash_find(change_monitors, rp)) return; + eina_hash_add(change_monitors, rp, + ecore_file_monitor_add(rp, + efreet_icon_changes_cb, + NULL)); +} + +static void +efreet_icon_changes_cb(void *data __UNUSED__, Ecore_File_Monitor *em __UNUSED__, + Ecore_File_Event event, const char *path) +{ + switch (event) + { + case ECORE_FILE_EVENT_NONE: + /* noop */ + break; + + case ECORE_FILE_EVENT_CREATED_FILE: + case ECORE_FILE_EVENT_DELETED_FILE: + case ECORE_FILE_EVENT_MODIFIED: + case ECORE_FILE_EVENT_DELETED_DIRECTORY: + case ECORE_FILE_EVENT_CREATED_DIRECTORY: + efreet_cache_icon_update(); + break; + + case ECORE_FILE_EVENT_DELETED_SELF: + eina_hash_del_by_key(change_monitors, path); + efreet_cache_icon_update(); + break; + } +} #endif