Enlightenment CVS committal Author : englebass Project : e17 Module : libs/efreet
Dir : e17/libs/efreet/src/lib Modified Files: efreet_utils.c Log Message: Prioritize user .desktop files. =================================================================== RCS file: /cvs/e/e17/libs/efreet/src/lib/efreet_utils.c,v retrieving revision 1.23 retrieving revision 1.24 diff -u -3 -r1.23 -r1.24 --- efreet_utils.c 4 Apr 2007 12:00:40 -0000 1.23 +++ efreet_utils.c 5 Apr 2007 20:22:58 -0000 1.24 @@ -7,6 +7,7 @@ typedef struct Efreet_Cache_Search Efreet_Cache_Search; typedef struct Efreet_Cache_Search_List Efreet_Cache_Search_List; typedef struct Efreet_Monitor Efreet_Monitor; +typedef struct Efreet_Util_Desktop Efreet_Util_Desktop; struct Efreet_Cache_Fill { @@ -19,6 +20,7 @@ { char *path; char *file_id; + int priority; }; struct Efreet_Cache_Search @@ -37,12 +39,19 @@ { char *file_id; Ecore_File_Monitor *monitor; + int priority; +}; + +struct Efreet_Util_Desktop +{ + Efreet_Desktop *desktop; + int priority; }; static int efreet_util_cache_fill(void *data); -static void efreet_util_cache_add(const char *path, const char *file_id); -static void efreet_util_cache_remove(const char *path, const char *file_id); -static void efreet_util_cache_reload(const char *path, const char *file_id); +static void efreet_util_cache_add(const char *path, const char *file_id, int priority); +static void efreet_util_cache_remove(const char *path, const char *file_id, int priority); +static void efreet_util_cache_reload(const char *path, const char *file_id, int priority); static void efreet_util_cache_dir_free(void *data); static void efreet_util_cache_search_mime(void *value, void *data); @@ -58,7 +67,7 @@ static int efreet_util_glob_match(const char *str, const char *glob); -static void efreet_util_monitor(const char *path, const char *file_id); +static void efreet_util_monitor(const char *path, const char *file_id, int priority); static void efreet_util_monitor_cb(void *data, Ecore_File_Monitor *monitor, Ecore_File_Event event, const char *path); static void efreet_util_monitor_free(void *data); @@ -82,6 +91,7 @@ EFREET_EVENT_UTIL_DESKTOP_LIST_CHANGE = ecore_event_type_new(); desktop_by_file_id = ecore_hash_new(ecore_str_hash, ecore_str_compare); ecore_hash_set_free_key(desktop_by_file_id, ECORE_FREE_CB(ecore_string_release)); + ecore_hash_set_free_value(desktop_by_file_id, free); file_id_by_desktop_path = ecore_hash_new(ecore_str_hash, ecore_str_compare); ecore_hash_set_free_key(file_id_by_desktop_path, ECORE_FREE_CB(ecore_string_release)); ecore_hash_set_free_value(file_id_by_desktop_path, ECORE_FREE_CB(ecore_string_release)); @@ -98,11 +108,13 @@ { Efreet_Cache_Fill_Dir *dir; char *path; + int priority = 0; while ((path = ecore_list_remove_first(dirs))) { dir = NEW(Efreet_Cache_Fill_Dir, 1); dir->path = path; + dir->priority = priority++; ecore_list_append(fill->dirs, dir); } ecore_list_destroy(dirs); @@ -219,24 +231,28 @@ efreet_util_desktop_wm_class_find(const char *wmname, const char *wmclass) { Efreet_Cache_Search search; + Efreet_Util_Desktop *ud; if ((!wmname) && (!wmclass)) return NULL; search.what1 = wmname; search.what2 = wmclass; - return ecore_hash_find(desktop_by_file_id, efreet_util_cache_search_wm_class, &search); + ud = ecore_hash_find(desktop_by_file_id, efreet_util_cache_search_wm_class, &search); + if (ud) return ud->desktop; + return NULL; } Efreet_Desktop * efreet_util_desktop_file_id_find(const char *file_id) { Efreet_Desktop *desktop = NULL; + Efreet_Util_Desktop *ud = NULL; Ecore_List *dirs; const char *dir; + int priority = 0; if (!file_id) return NULL; - desktop = ecore_hash_get(desktop_by_file_id, file_id); - if (desktop) return desktop; - desktop = NULL; + ud = ecore_hash_get(desktop_by_file_id, file_id); + if (ud) return ud->desktop; dirs = efreet_default_dirs_get(efreet_data_home_get(), efreet_data_dirs_get(), "applications"); @@ -261,9 +277,19 @@ } free(tmp); if (desktop) break; + priority++; } ecore_list_destroy(dirs); - if (desktop) ecore_hash_set(desktop_by_file_id, (void *)ecore_string_instance(file_id), desktop); + if (desktop) + { + ud = NEW(Efreet_Util_Desktop, 1); + if (ud) + { + ud->priority = priority; + ud->desktop = desktop; + ecore_hash_set(desktop_by_file_id, (void *)ecore_string_instance(file_id), ud); + } + } return desktop; } @@ -271,33 +297,42 @@ efreet_util_desktop_exec_find(const char *exec) { Efreet_Cache_Search search; + Efreet_Util_Desktop *ud; if (!exec) return NULL; search.what1 = exec; search.what2 = NULL; - return ecore_hash_find(desktop_by_file_id, efreet_util_cache_search_exec, &search); + ud = ecore_hash_find(desktop_by_file_id, efreet_util_cache_search_exec, &search); + if (ud) return ud->desktop; + return NULL; } Efreet_Desktop * efreet_util_desktop_name_find(const char *name) { Efreet_Cache_Search search; + Efreet_Util_Desktop *ud; if (!name) return NULL; search.what1 = name; search.what2 = NULL; - return ecore_hash_find(desktop_by_file_id, efreet_util_cache_search_name, &search); + ud = ecore_hash_find(desktop_by_file_id, efreet_util_cache_search_name, &search); + if (ud) return ud->desktop; + return NULL; } Efreet_Desktop * efreet_util_desktop_generic_name_find(const char *generic_name) { Efreet_Cache_Search search; + Efreet_Util_Desktop *ud; if (!generic_name) return NULL; search.what1 = generic_name; search.what2 = NULL; - return ecore_hash_find(desktop_by_file_id, efreet_util_cache_search_generic_name, &search); + ud = ecore_hash_find(desktop_by_file_id, efreet_util_cache_search_generic_name, &search); + if (ud) return ud->desktop; + return NULL; } Ecore_List * @@ -432,15 +467,17 @@ dir = NEW(Efreet_Cache_Fill_Dir, 1); dir->path = strdup(buf); dir->file_id = strdup(file_id); + dir->priority = fill->current->priority; ecore_list_append(fill->dirs, dir); } else - efreet_util_cache_add(buf, file_id); + efreet_util_cache_add(buf, file_id, fill->current->priority); } if (!file) { /* This dir has been search through */ - efreet_util_monitor(fill->current->path, fill->current->file_id); + efreet_util_monitor(fill->current->path, fill->current->file_id, + fill->current->priority); efreet_util_cache_dir_free(fill->current); fill->current = NULL; closedir(fill->files); @@ -452,9 +489,10 @@ } static void -efreet_util_cache_add(const char *path, const char *file_id) +efreet_util_cache_add(const char *path, const char *file_id, int priority) { Efreet_Desktop *desktop; + Efreet_Util_Desktop *ud; char *ext; ext = strrchr(path, '.'); @@ -462,8 +500,21 @@ desktop = efreet_desktop_get(path); if (!desktop || desktop->type != EFREET_DESKTOP_TYPE_APPLICATION) return; - if (!ecore_hash_get(desktop_by_file_id, file_id)) - ecore_hash_set(desktop_by_file_id, (void *)ecore_string_instance(file_id), desktop); + ud = ecore_hash_get(desktop_by_file_id, file_id); + if (!ud) + { + ud = NEW(Efreet_Util_Desktop, 1); + if (ud) + { + ud->priority = priority; + ud->desktop = desktop; + ecore_hash_set(desktop_by_file_id, (void *)ecore_string_instance(file_id), ud); + } + } + else if (priority < ud->priority) + { + ud->desktop = desktop; + } if (!ecore_hash_get(file_id_by_desktop_path, desktop->orig_path)) ecore_hash_set(file_id_by_desktop_path, (void *)ecore_string_instance(desktop->orig_path), @@ -471,20 +522,30 @@ } static void -efreet_util_cache_remove(const char *path, const char *file_id) +efreet_util_cache_remove(const char *path, const char *file_id, int priority) { + Efreet_Util_Desktop *ud; char *ext; ext = strrchr(path, '.'); if (!ext || strcmp(ext, ".desktop")) return; - ecore_hash_remove(desktop_by_file_id, file_id); + ud = ecore_hash_get(desktop_by_file_id, file_id); + if (ud && (ud->priority >= priority)) + { + ecore_hash_remove(desktop_by_file_id, file_id); + free(ud); + /* This call will search application dirs and add the file to cache if it + * exists. */ + efreet_util_desktop_file_id_find(file_id); + } ecore_hash_remove(file_id_by_desktop_path, path); } static void -efreet_util_cache_reload(const char *path, const char *file_id) +efreet_util_cache_reload(const char *path, const char *file_id, int priority) { Efreet_Desktop *desktop; + Efreet_Util_Desktop *ud; char *ext; ext = strrchr(path, '.'); @@ -492,10 +553,20 @@ desktop = efreet_desktop_get(path); if (!desktop || desktop->type != EFREET_DESKTOP_TYPE_APPLICATION) return; - /* Check if the pointer is the same. The pointer shouldn't change if the - * path is the same */ - if (desktop != ecore_hash_get(desktop_by_file_id, file_id)) return; - ecore_hash_set(desktop_by_file_id, (void *)ecore_string_instance(file_id), desktop); + ud = ecore_hash_get(desktop_by_file_id, file_id); + if (ud) + { + if (ud->priority < priority) return; + ud->desktop = desktop; + } + else + { + ud = NEW(Efreet_Util_Desktop, 1); + if (!ud) return; + ud->priority = priority; + ud->desktop = desktop; + ecore_hash_set(desktop_by_file_id, (void *)ecore_string_instance(file_id), ud); + } } static void @@ -514,20 +585,20 @@ { Ecore_Hash_Node *node; Efreet_Cache_Search_List *search; - Efreet_Desktop *desktop; + Efreet_Util_Desktop *ud; const char *mime; node = value; search = data; - desktop = node->value; + ud = node->value; - if (!desktop->mime_types) return; - ecore_list_goto_first(desktop->mime_types); - while ((mime = ecore_list_next(desktop->mime_types))) + if (!ud->desktop->mime_types) return; + ecore_list_goto_first(ud->desktop->mime_types); + while ((mime = ecore_list_next(ud->desktop->mime_types))) { if (!strcmp(search->what, mime)) { - ecore_list_append(search->list, desktop); + ecore_list_append(search->list, ud->desktop); break; } } @@ -537,13 +608,13 @@ efreet_util_cache_search_wm_class(const void *value, const void *data) { const Efreet_Cache_Search *search; - const Efreet_Desktop *desktop; + const Efreet_Util_Desktop *ud; - desktop = value; + ud = value; search = data; - if (!desktop->startup_wm_class) return 1; - if ((search->what2) && (!strcmp(desktop->startup_wm_class, search->what2))) + if (!ud->desktop->startup_wm_class) return 1; + if ((search->what2) && (!strcmp(ud->desktop->startup_wm_class, search->what2))) return 0; /* this isn't really valid - we look at class only, not name else if ((search->what1) && (!strcmp(desktop->startup_wm_class, search->what1))) @@ -556,15 +627,15 @@ efreet_util_cache_search_exec(const void *value, const void *data) { const Efreet_Cache_Search *search; - const Efreet_Desktop *desktop; + const Efreet_Util_Desktop *ud; char *exec; const char *file; - desktop = value; + ud = value; search = data; - if (!desktop->exec) return 1; - exec = ecore_file_app_exe_get(desktop->exec); + if (!ud->desktop->exec) return 1; + exec = ecore_file_app_exe_get(ud->desktop->exec); if (!exec) return 1; if (!strcmp(exec, search->what1)) { @@ -586,26 +657,26 @@ efreet_util_cache_search_name(const void *value, const void *data) { const Efreet_Cache_Search *search; - const Efreet_Desktop *desktop; + const Efreet_Util_Desktop *ud; - desktop = value; + ud = value; search = data; - if (!desktop->name) return 1; - return strcmp(desktop->name, search->what1); + if (!ud->desktop->name) return 1; + return strcmp(ud->desktop->name, search->what1); } static int efreet_util_cache_search_generic_name(const void *value, const void *data) { const Efreet_Cache_Search *search; - const Efreet_Desktop *desktop; + const Efreet_Util_Desktop *ud; - desktop = value; + ud = value; search = data; - if (!desktop->generic_name) return 1; - return strcmp(desktop->generic_name, search->what1); + if (!ud->desktop->generic_name) return 1; + return strcmp(ud->desktop->generic_name, search->what1); } static void @@ -613,14 +684,14 @@ { Ecore_Hash_Node *node; Efreet_Cache_Search_List *search; - Efreet_Desktop *desktop; + Efreet_Util_Desktop *ud; node = value; search = data; - desktop = node->value; + ud = node->value; - if (efreet_util_glob_match(desktop->name, search->what)) - ecore_list_append(search->list, desktop); + if (efreet_util_glob_match(ud->desktop->name, search->what)) + ecore_list_append(search->list, ud->desktop); } static void @@ -628,18 +699,19 @@ { Ecore_Hash_Node *node; Efreet_Cache_Search_List *search; - Efreet_Desktop *desktop; + Efreet_Util_Desktop *ud; char *exec; node = value; search = data; - desktop = node->value; + ud = node->value; - exec = ecore_file_app_exe_get(desktop->exec); + if (!ud->desktop->exec) return; + exec = ecore_file_app_exe_get(ud->desktop->exec); if (exec) { if (efreet_util_glob_match(exec, search->what)) - ecore_list_append(search->list, desktop); + ecore_list_append(search->list, ud->desktop); free(exec); } } @@ -649,14 +721,14 @@ { Ecore_Hash_Node *node; Efreet_Cache_Search_List *search; - Efreet_Desktop *desktop; + Efreet_Util_Desktop *ud; node = value; search = data; - desktop = node->value; + ud = node->value; - if (efreet_util_glob_match(desktop->generic_name, search->what)) - ecore_list_append(search->list, desktop); + if (efreet_util_glob_match(ud->desktop->generic_name, search->what)) + ecore_list_append(search->list, ud->desktop); } static void @@ -664,14 +736,14 @@ { Ecore_Hash_Node *node; Efreet_Cache_Search_List *search; - Efreet_Desktop *desktop; + Efreet_Util_Desktop *ud; node = value; search = data; - desktop = node->value; + ud = node->value; - if (efreet_util_glob_match(desktop->comment, search->what)) - ecore_list_append(search->list, desktop); + if (efreet_util_glob_match(ud->desktop->comment, search->what)) + ecore_list_append(search->list, ud->desktop); } static int @@ -690,7 +762,7 @@ } static void -efreet_util_monitor(const char *path, const char *file_id) +efreet_util_monitor(const char *path, const char *file_id, int priority) { Efreet_Monitor *em; @@ -698,6 +770,7 @@ if (!em) return; em->monitor = ecore_file_monitor_add(path, efreet_util_monitor_cb, em); if (file_id) em->file_id = strdup(file_id); + em->priority = priority; ecore_list_append(monitors, em); } @@ -719,13 +792,13 @@ /* Ignore */ break; case ECORE_FILE_EVENT_CREATED_FILE: - efreet_util_cache_add(path, file_id); + efreet_util_cache_add(path, file_id, em->priority); break; case ECORE_FILE_EVENT_CREATED_DIRECTORY: - efreet_util_monitor(path, file_id); + efreet_util_monitor(path, file_id, em->priority); break; case ECORE_FILE_EVENT_DELETED_FILE: - efreet_util_cache_remove(path, file_id); + efreet_util_cache_remove(path, file_id, em->priority); break; case ECORE_FILE_EVENT_DELETED_DIRECTORY: /* Ignore, we should already have a monitor on any subdir */ @@ -736,7 +809,7 @@ efreet_util_monitor_free(em); break; case ECORE_FILE_EVENT_MODIFIED: - efreet_util_cache_reload(path, file_id); + efreet_util_cache_reload(path, file_id, em->priority); break; } } ------------------------------------------------------------------------- Take Surveys. Earn Cash. Influence the Future of IT Join SourceForge.net's Techsay panel and you'll get the chance to share your opinions on IT & business topics through brief surveys-and earn cash http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV _______________________________________________ enlightenment-cvs mailing list enlightenment-cvs@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/enlightenment-cvs