2007-02-06 17:13:08 -08:00
|
|
|
/* vim: set sw=4 ts=4 sts=4 et: */
|
|
|
|
#include "Efreet.h"
|
|
|
|
#include "efreet_private.h"
|
|
|
|
|
2007-04-04 01:48:29 -07:00
|
|
|
typedef struct Efreet_Cache_Fill Efreet_Cache_Fill;
|
|
|
|
typedef struct Efreet_Cache_Fill_Dir Efreet_Cache_Fill_Dir;
|
|
|
|
typedef struct Efreet_Cache_Search Efreet_Cache_Search;
|
|
|
|
typedef struct Efreet_Cache_Search_List Efreet_Cache_Search_List;
|
2007-04-04 03:09:20 -07:00
|
|
|
typedef struct Efreet_Monitor Efreet_Monitor;
|
2007-04-05 13:22:58 -07:00
|
|
|
typedef struct Efreet_Util_Desktop Efreet_Util_Desktop;
|
2007-03-25 05:47:59 -07:00
|
|
|
|
2007-04-04 01:48:29 -07:00
|
|
|
struct Efreet_Cache_Fill
|
2007-03-25 05:47:59 -07:00
|
|
|
{
|
|
|
|
Ecore_List *dirs;
|
|
|
|
Efreet_Cache_Fill_Dir *current;
|
|
|
|
DIR *files;
|
|
|
|
};
|
|
|
|
|
2007-04-04 01:48:29 -07:00
|
|
|
struct Efreet_Cache_Fill_Dir
|
2007-03-25 05:47:59 -07:00
|
|
|
{
|
|
|
|
char *path;
|
|
|
|
char *file_id;
|
2007-04-05 13:22:58 -07:00
|
|
|
int priority;
|
2007-03-25 05:47:59 -07:00
|
|
|
};
|
|
|
|
|
2007-04-04 01:48:29 -07:00
|
|
|
struct Efreet_Cache_Search
|
2007-03-25 06:43:52 -07:00
|
|
|
{
|
2007-03-25 11:17:34 -07:00
|
|
|
const char *what1;
|
|
|
|
const char *what2;
|
|
|
|
};
|
|
|
|
|
2007-04-04 01:48:29 -07:00
|
|
|
struct Efreet_Cache_Search_List
|
2007-03-25 11:17:34 -07:00
|
|
|
{
|
|
|
|
Ecore_List *list;
|
2007-03-25 12:01:45 -07:00
|
|
|
const char *what;
|
2007-03-25 06:43:52 -07:00
|
|
|
};
|
|
|
|
|
2007-04-04 03:09:20 -07:00
|
|
|
struct Efreet_Monitor
|
|
|
|
{
|
|
|
|
char *file_id;
|
|
|
|
Ecore_File_Monitor *monitor;
|
2007-04-05 13:22:58 -07:00
|
|
|
int priority;
|
|
|
|
};
|
|
|
|
|
|
|
|
struct Efreet_Util_Desktop
|
|
|
|
{
|
|
|
|
Efreet_Desktop *desktop;
|
|
|
|
int priority;
|
2007-04-04 03:09:20 -07:00
|
|
|
};
|
|
|
|
|
2007-04-04 01:48:29 -07:00
|
|
|
static int efreet_util_cache_fill(void *data);
|
2007-04-10 00:18:51 -07:00
|
|
|
static void efreet_util_cache_add(const char *path, const char *file_id, int priority, int event);
|
2007-04-05 13:22:58 -07:00
|
|
|
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);
|
2007-04-04 01:48:29 -07:00
|
|
|
static void efreet_util_cache_dir_free(void *data);
|
2007-03-25 12:01:45 -07:00
|
|
|
|
2007-04-04 01:48:29 -07:00
|
|
|
static void efreet_util_cache_search_mime(void *value, void *data);
|
|
|
|
static int efreet_util_cache_search_wm_class(const void *value, const void *data);
|
2007-04-04 03:09:20 -07:00
|
|
|
static int efreet_util_cache_search_exec(const void *value, const void *data);
|
2007-04-04 01:48:29 -07:00
|
|
|
static int efreet_util_cache_search_name(const void *value, const void *data);
|
|
|
|
static int efreet_util_cache_search_generic_name(const void *value, const void *data);
|
2007-03-25 05:47:59 -07:00
|
|
|
|
2007-04-04 01:48:29 -07:00
|
|
|
static void efreet_util_cache_search_name_glob(void *value, void *data);
|
|
|
|
static void efreet_util_cache_search_exec_glob(void *value, void *data);
|
|
|
|
static void efreet_util_cache_search_generic_name_glob(void *value, void *data);
|
|
|
|
static void efreet_util_cache_search_comment_glob(void *value, void *data);
|
2007-03-25 12:01:45 -07:00
|
|
|
|
2007-04-04 01:48:29 -07:00
|
|
|
static int efreet_util_glob_match(const char *str, const char *glob);
|
2007-03-25 12:01:45 -07:00
|
|
|
|
2007-04-05 13:22:58 -07:00
|
|
|
static void efreet_util_monitor(const char *path, const char *file_id, int priority);
|
2007-04-04 03:09:20 -07:00
|
|
|
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);
|
2007-04-14 23:16:54 -07:00
|
|
|
static void efreet_util_menus_find_helper(Ecore_List *menus, const char *config_dir);
|
2007-04-04 03:09:20 -07:00
|
|
|
|
2007-06-03 11:07:23 -07:00
|
|
|
static void efreet_util_desktops_by_category_add(Efreet_Desktop *desktop);
|
|
|
|
static void efreet_util_desktops_by_category_remove(Efreet_Desktop *desktop);
|
|
|
|
|
2007-03-25 05:47:59 -07:00
|
|
|
static Ecore_Hash *desktop_by_file_id = NULL;
|
|
|
|
static Ecore_Hash *file_id_by_desktop_path = NULL;
|
2007-06-03 11:07:23 -07:00
|
|
|
static Ecore_Hash *desktops_by_category = NULL;
|
2007-03-25 05:47:59 -07:00
|
|
|
|
2007-06-03 11:07:23 -07:00
|
|
|
static Ecore_Idler *idler = NULL;
|
2007-04-13 09:28:32 -07:00
|
|
|
static Efreet_Cache_Fill *fill = NULL;
|
2007-03-25 05:47:59 -07:00
|
|
|
|
2007-04-04 03:09:20 -07:00
|
|
|
static Ecore_List *monitors = NULL;
|
|
|
|
|
2007-04-09 05:16:09 -07:00
|
|
|
static int init = 0;
|
|
|
|
|
2007-04-05 13:53:43 -07:00
|
|
|
int EFREET_EVENT_DESKTOP_LIST_CHANGE = 0;
|
|
|
|
int EFREET_EVENT_DESKTOP_CHANGE = 0;
|
2007-03-30 18:59:24 -07:00
|
|
|
|
2007-03-25 03:42:28 -07:00
|
|
|
int
|
|
|
|
efreet_util_init(void)
|
|
|
|
{
|
2007-03-25 05:47:59 -07:00
|
|
|
Ecore_List *dirs;
|
|
|
|
|
2007-04-09 05:16:09 -07:00
|
|
|
if (init++) return init;
|
|
|
|
|
2007-04-05 13:53:43 -07:00
|
|
|
if (!EFREET_EVENT_DESKTOP_LIST_CHANGE)
|
|
|
|
EFREET_EVENT_DESKTOP_LIST_CHANGE = ecore_event_type_new();
|
|
|
|
if (!EFREET_EVENT_DESKTOP_CHANGE)
|
|
|
|
EFREET_EVENT_DESKTOP_CHANGE = ecore_event_type_new();
|
2007-03-25 05:47:59 -07:00
|
|
|
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));
|
2007-04-05 13:22:58 -07:00
|
|
|
ecore_hash_set_free_value(desktop_by_file_id, free);
|
2007-06-03 11:07:23 -07:00
|
|
|
|
2007-03-25 05:47:59 -07:00
|
|
|
file_id_by_desktop_path = ecore_hash_new(ecore_str_hash, ecore_str_compare);
|
2007-03-25 06:10:09 -07:00
|
|
|
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));
|
2007-03-25 05:47:59 -07:00
|
|
|
|
2007-06-03 11:07:23 -07:00
|
|
|
desktops_by_category = ecore_hash_new(ecore_str_hash, ecore_str_compare);
|
|
|
|
ecore_hash_set_free_key(desktops_by_category, ECORE_FREE_CB(ecore_string_release));
|
|
|
|
ecore_hash_set_free_value(desktops_by_category, ECORE_FREE_CB(ecore_list_destroy));
|
|
|
|
|
2007-04-04 03:09:20 -07:00
|
|
|
monitors = ecore_list_new();
|
|
|
|
ecore_list_set_free_cb(monitors, efreet_util_monitor_free);
|
|
|
|
|
2007-03-25 05:47:59 -07:00
|
|
|
fill = NEW(Efreet_Cache_Fill, 1);
|
|
|
|
fill->dirs = ecore_list_new();
|
2007-04-04 01:48:29 -07:00
|
|
|
ecore_list_set_free_cb(fill->dirs, efreet_util_cache_dir_free);
|
2007-03-25 05:47:59 -07:00
|
|
|
dirs = efreet_default_dirs_get(efreet_data_home_get(), efreet_data_dirs_get(),
|
|
|
|
"applications");
|
|
|
|
if (dirs)
|
|
|
|
{
|
|
|
|
Efreet_Cache_Fill_Dir *dir;
|
|
|
|
char *path;
|
2007-04-05 13:22:58 -07:00
|
|
|
int priority = 0;
|
2007-03-25 05:47:59 -07:00
|
|
|
|
|
|
|
while ((path = ecore_list_remove_first(dirs)))
|
|
|
|
{
|
|
|
|
dir = NEW(Efreet_Cache_Fill_Dir, 1);
|
|
|
|
dir->path = path;
|
2007-04-05 13:22:58 -07:00
|
|
|
dir->priority = priority++;
|
2007-03-25 05:47:59 -07:00
|
|
|
ecore_list_append(fill->dirs, dir);
|
|
|
|
}
|
|
|
|
ecore_list_destroy(dirs);
|
|
|
|
}
|
2007-04-13 09:28:32 -07:00
|
|
|
idler = ecore_idler_add(efreet_util_cache_fill, NULL);
|
2007-04-09 05:16:09 -07:00
|
|
|
return init;
|
2007-03-25 03:42:28 -07:00
|
|
|
}
|
|
|
|
|
2007-04-09 05:16:09 -07:00
|
|
|
int
|
2007-03-25 03:42:28 -07:00
|
|
|
efreet_util_shutdown(void)
|
|
|
|
{
|
2007-04-09 05:16:09 -07:00
|
|
|
if (--init) return init;
|
|
|
|
|
2007-03-25 05:47:59 -07:00
|
|
|
if (idler)
|
|
|
|
{
|
2007-04-13 09:28:32 -07:00
|
|
|
ecore_idler_del(idler);
|
2007-03-25 05:47:59 -07:00
|
|
|
IF_FREE_LIST(fill->dirs);
|
2007-04-04 01:48:29 -07:00
|
|
|
if (fill->current) efreet_util_cache_dir_free(fill->current);
|
2007-03-25 14:49:49 -07:00
|
|
|
if (fill->files) closedir(fill->files);
|
2007-03-25 05:47:59 -07:00
|
|
|
free(fill);
|
|
|
|
}
|
|
|
|
idler = NULL;
|
|
|
|
|
|
|
|
IF_FREE_HASH(desktop_by_file_id);
|
|
|
|
IF_FREE_HASH(file_id_by_desktop_path);
|
2007-04-04 03:09:20 -07:00
|
|
|
|
|
|
|
IF_FREE_LIST(monitors);
|
2007-06-03 11:07:23 -07:00
|
|
|
|
|
|
|
IF_FREE_HASH(desktops_by_category);
|
|
|
|
|
2007-04-09 05:16:09 -07:00
|
|
|
return init;
|
2007-03-25 03:42:28 -07:00
|
|
|
}
|
|
|
|
|
2007-02-06 18:14:46 -08:00
|
|
|
char *
|
2007-02-06 17:13:08 -08:00
|
|
|
efreet_util_path_in_default(const char *section, const char *path)
|
|
|
|
{
|
|
|
|
Ecore_List *dirs;
|
2007-02-06 18:14:46 -08:00
|
|
|
char *ret = NULL;
|
2007-02-06 17:13:08 -08:00
|
|
|
char *dir;
|
|
|
|
|
|
|
|
dirs = efreet_default_dirs_get(efreet_data_home_get(), efreet_data_dirs_get(),
|
|
|
|
section);
|
|
|
|
|
|
|
|
ecore_list_goto_first(dirs);
|
|
|
|
while ((dir = ecore_list_next(dirs)))
|
|
|
|
{
|
|
|
|
size_t len;
|
|
|
|
|
|
|
|
len = strlen(dir);
|
|
|
|
if (!strncmp(path, dir, strlen(dir)))
|
|
|
|
{
|
2007-02-06 18:14:46 -08:00
|
|
|
ret = strdup(dir);
|
2007-02-06 17:13:08 -08:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
ecore_list_destroy(dirs);
|
|
|
|
return ret;
|
|
|
|
}
|
2007-02-06 18:14:46 -08:00
|
|
|
|
2007-03-25 06:10:09 -07:00
|
|
|
const char *
|
2007-03-25 03:49:04 -07:00
|
|
|
efreet_util_path_to_file_id(const char *path)
|
2007-02-06 18:14:46 -08:00
|
|
|
{
|
|
|
|
size_t len;
|
2007-03-25 06:10:09 -07:00
|
|
|
char *tmp, *p;
|
2007-03-25 03:49:04 -07:00
|
|
|
char *base;
|
2007-03-25 06:10:09 -07:00
|
|
|
const char *file_id = NULL;
|
2007-03-25 03:49:04 -07:00
|
|
|
|
|
|
|
if (!path) return NULL;
|
2007-03-25 05:47:59 -07:00
|
|
|
file_id = ecore_hash_get(file_id_by_desktop_path, path);
|
|
|
|
if (file_id) return file_id;
|
|
|
|
|
2007-03-25 03:49:04 -07:00
|
|
|
base = efreet_util_path_in_default("applications", path);
|
|
|
|
if (!base) return NULL;
|
2007-02-06 18:14:46 -08:00
|
|
|
|
|
|
|
len = strlen(base);
|
2007-03-25 03:49:04 -07:00
|
|
|
if (strlen(path) <= len)
|
|
|
|
{
|
|
|
|
free(base);
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
if (strncmp(path, base, len))
|
|
|
|
{
|
|
|
|
free(base);
|
|
|
|
return NULL;
|
|
|
|
}
|
2007-02-06 18:14:46 -08:00
|
|
|
|
2007-03-25 06:10:09 -07:00
|
|
|
tmp = strdup(path + len + 1);
|
|
|
|
p = tmp;
|
2007-02-06 18:14:46 -08:00
|
|
|
while (*p)
|
|
|
|
{
|
|
|
|
if (*p == '/') *p = '-';
|
|
|
|
p++;
|
|
|
|
}
|
2007-03-25 03:49:04 -07:00
|
|
|
free(base);
|
2007-03-25 06:10:09 -07:00
|
|
|
file_id = ecore_string_instance(tmp);
|
|
|
|
free(tmp);
|
|
|
|
ecore_hash_set(file_id_by_desktop_path, (void *)ecore_string_instance(path),
|
|
|
|
(void *)file_id);
|
2007-03-25 05:47:59 -07:00
|
|
|
return file_id;
|
2007-02-06 18:14:46 -08:00
|
|
|
}
|
2007-03-24 14:59:34 -07:00
|
|
|
|
2007-03-25 11:17:34 -07:00
|
|
|
Ecore_List *
|
|
|
|
efreet_util_desktop_mime_list(const char *mime)
|
|
|
|
{
|
2007-03-25 12:01:45 -07:00
|
|
|
Efreet_Cache_Search_List search;
|
2007-03-25 11:17:34 -07:00
|
|
|
|
|
|
|
search.list = ecore_list_new();
|
2007-04-15 03:53:54 -07:00
|
|
|
search.what = ecore_string_instance(mime);
|
2007-03-25 11:17:34 -07:00
|
|
|
|
2007-04-04 03:09:20 -07:00
|
|
|
ecore_hash_for_each_node(desktop_by_file_id, efreet_util_cache_search_mime, &search);
|
2007-04-15 03:53:54 -07:00
|
|
|
ecore_string_release(search.what);
|
2007-03-25 11:17:34 -07:00
|
|
|
|
|
|
|
if (ecore_list_is_empty(search.list)) IF_FREE_LIST(search.list);
|
|
|
|
return search.list;
|
|
|
|
}
|
|
|
|
|
2007-03-25 08:52:18 -07:00
|
|
|
Efreet_Desktop *
|
2007-03-25 09:17:19 -07:00
|
|
|
efreet_util_desktop_wm_class_find(const char *wmname, const char *wmclass)
|
2007-03-25 08:52:18 -07:00
|
|
|
{
|
|
|
|
Efreet_Cache_Search search;
|
2007-04-05 13:22:58 -07:00
|
|
|
Efreet_Util_Desktop *ud;
|
2007-03-25 08:52:18 -07:00
|
|
|
|
|
|
|
if ((!wmname) && (!wmclass)) return NULL;
|
|
|
|
search.what1 = wmname;
|
|
|
|
search.what2 = wmclass;
|
2007-04-05 13:22:58 -07:00
|
|
|
ud = ecore_hash_find(desktop_by_file_id, efreet_util_cache_search_wm_class, &search);
|
|
|
|
if (ud) return ud->desktop;
|
|
|
|
return NULL;
|
2007-03-25 08:52:18 -07:00
|
|
|
}
|
|
|
|
|
2007-03-24 14:59:34 -07:00
|
|
|
Efreet_Desktop *
|
2007-03-25 05:57:49 -07:00
|
|
|
efreet_util_desktop_file_id_find(const char *file_id)
|
2007-03-24 14:59:34 -07:00
|
|
|
{
|
|
|
|
Efreet_Desktop *desktop = NULL;
|
2007-04-05 13:22:58 -07:00
|
|
|
Efreet_Util_Desktop *ud = NULL;
|
2007-03-24 14:59:34 -07:00
|
|
|
Ecore_List *dirs;
|
|
|
|
const char *dir;
|
2007-04-05 13:22:58 -07:00
|
|
|
int priority = 0;
|
2007-03-24 14:59:34 -07:00
|
|
|
|
|
|
|
if (!file_id) return NULL;
|
2007-04-05 13:22:58 -07:00
|
|
|
ud = ecore_hash_get(desktop_by_file_id, file_id);
|
|
|
|
if (ud) return ud->desktop;
|
2007-03-24 14:59:34 -07:00
|
|
|
|
|
|
|
dirs = efreet_default_dirs_get(efreet_data_home_get(), efreet_data_dirs_get(),
|
|
|
|
"applications");
|
|
|
|
if (!dirs) return NULL;
|
|
|
|
|
|
|
|
ecore_list_goto_first(dirs);
|
|
|
|
while ((dir = ecore_list_next(dirs)))
|
|
|
|
{
|
|
|
|
char *tmp, *p;
|
|
|
|
char buf[PATH_MAX];
|
|
|
|
|
|
|
|
tmp = strdup(file_id);
|
|
|
|
p = tmp;
|
|
|
|
|
|
|
|
while (p)
|
|
|
|
{
|
2007-03-24 15:49:59 -07:00
|
|
|
snprintf(buf, sizeof(buf), "%s/%s", dir, tmp);
|
2007-03-24 14:59:34 -07:00
|
|
|
desktop = efreet_desktop_get(buf);
|
|
|
|
if (desktop) break;
|
|
|
|
p = strchr(p, '-');
|
|
|
|
if (p) *p = '/';
|
|
|
|
}
|
|
|
|
free(tmp);
|
|
|
|
if (desktop) break;
|
2007-04-05 13:22:58 -07:00
|
|
|
priority++;
|
2007-03-24 14:59:34 -07:00
|
|
|
}
|
|
|
|
ecore_list_destroy(dirs);
|
2007-04-05 13:22:58 -07:00
|
|
|
if (desktop)
|
|
|
|
{
|
2007-04-05 13:53:43 -07:00
|
|
|
Efreet_Event_Desktop_Change *ev;
|
|
|
|
|
2007-04-05 13:22:58 -07:00
|
|
|
ud = NEW(Efreet_Util_Desktop, 1);
|
2007-04-05 13:53:43 -07:00
|
|
|
ud->priority = priority;
|
|
|
|
ud->desktop = desktop;
|
2007-06-03 11:07:23 -07:00
|
|
|
|
2007-04-05 13:53:43 -07:00
|
|
|
ecore_hash_set(desktop_by_file_id, (void *)ecore_string_instance(file_id), ud);
|
2007-06-03 11:07:23 -07:00
|
|
|
efreet_util_desktops_by_category_add(desktop);
|
2007-04-05 13:53:43 -07:00
|
|
|
|
|
|
|
ev = NEW(Efreet_Event_Desktop_Change, 1);
|
2007-04-05 14:10:50 -07:00
|
|
|
ev->current = desktop;
|
2007-04-05 13:53:43 -07:00
|
|
|
ev->change = EFREET_DESKTOP_CHANGE_ADD;
|
|
|
|
ecore_event_add(EFREET_EVENT_DESKTOP_CHANGE, ev, NULL, NULL);
|
2007-04-05 13:22:58 -07:00
|
|
|
}
|
2007-03-24 14:59:34 -07:00
|
|
|
return desktop;
|
|
|
|
}
|
2007-03-25 05:47:59 -07:00
|
|
|
|
|
|
|
Efreet_Desktop *
|
2007-03-25 05:57:49 -07:00
|
|
|
efreet_util_desktop_exec_find(const char *exec)
|
2007-03-25 05:47:59 -07:00
|
|
|
{
|
2007-04-04 03:09:20 -07:00
|
|
|
Efreet_Cache_Search search;
|
2007-04-05 13:22:58 -07:00
|
|
|
Efreet_Util_Desktop *ud;
|
2007-03-25 05:47:59 -07:00
|
|
|
|
|
|
|
if (!exec) return NULL;
|
2007-04-04 03:09:20 -07:00
|
|
|
search.what1 = exec;
|
|
|
|
search.what2 = NULL;
|
2007-04-05 13:22:58 -07:00
|
|
|
ud = ecore_hash_find(desktop_by_file_id, efreet_util_cache_search_exec, &search);
|
|
|
|
if (ud) return ud->desktop;
|
|
|
|
return NULL;
|
2007-03-25 06:43:52 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
Efreet_Desktop *
|
|
|
|
efreet_util_desktop_name_find(const char *name)
|
|
|
|
{
|
|
|
|
Efreet_Cache_Search search;
|
2007-04-05 13:22:58 -07:00
|
|
|
Efreet_Util_Desktop *ud;
|
2007-03-25 06:43:52 -07:00
|
|
|
|
|
|
|
if (!name) return NULL;
|
2007-03-25 08:52:18 -07:00
|
|
|
search.what1 = name;
|
|
|
|
search.what2 = NULL;
|
2007-04-05 13:22:58 -07:00
|
|
|
ud = ecore_hash_find(desktop_by_file_id, efreet_util_cache_search_name, &search);
|
|
|
|
if (ud) return ud->desktop;
|
|
|
|
return NULL;
|
2007-03-25 06:43:52 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
Efreet_Desktop *
|
|
|
|
efreet_util_desktop_generic_name_find(const char *generic_name)
|
|
|
|
{
|
|
|
|
Efreet_Cache_Search search;
|
2007-04-05 13:22:58 -07:00
|
|
|
Efreet_Util_Desktop *ud;
|
2007-03-25 06:43:52 -07:00
|
|
|
|
|
|
|
if (!generic_name) return NULL;
|
2007-03-25 08:52:18 -07:00
|
|
|
search.what1 = generic_name;
|
|
|
|
search.what2 = NULL;
|
2007-04-05 13:22:58 -07:00
|
|
|
ud = ecore_hash_find(desktop_by_file_id, efreet_util_cache_search_generic_name, &search);
|
|
|
|
if (ud) return ud->desktop;
|
|
|
|
return NULL;
|
2007-03-25 05:47:59 -07:00
|
|
|
}
|
|
|
|
|
2007-03-25 12:01:45 -07:00
|
|
|
Ecore_List *
|
|
|
|
efreet_util_desktop_name_glob_list(const char *glob)
|
|
|
|
{
|
|
|
|
Efreet_Cache_Search_List search;
|
|
|
|
|
|
|
|
search.list = ecore_list_new();
|
|
|
|
search.what = glob;
|
|
|
|
|
2007-04-04 03:09:20 -07:00
|
|
|
ecore_hash_for_each_node(desktop_by_file_id, efreet_util_cache_search_name_glob, &search);
|
2007-03-25 12:01:45 -07:00
|
|
|
|
|
|
|
if (ecore_list_is_empty(search.list)) IF_FREE_LIST(search.list);
|
|
|
|
return search.list;
|
|
|
|
}
|
|
|
|
|
|
|
|
Ecore_List *
|
|
|
|
efreet_util_desktop_exec_glob_list(const char *glob)
|
|
|
|
{
|
|
|
|
Efreet_Cache_Search_List search;
|
|
|
|
|
|
|
|
search.list = ecore_list_new();
|
|
|
|
search.what = glob;
|
|
|
|
|
2007-04-04 03:09:20 -07:00
|
|
|
ecore_hash_for_each_node(desktop_by_file_id, efreet_util_cache_search_exec_glob, &search);
|
2007-03-25 12:01:45 -07:00
|
|
|
|
|
|
|
if (ecore_list_is_empty(search.list)) IF_FREE_LIST(search.list);
|
|
|
|
return search.list;
|
|
|
|
}
|
|
|
|
|
|
|
|
Ecore_List *
|
|
|
|
efreet_util_desktop_generic_name_glob_list(const char *glob)
|
|
|
|
{
|
|
|
|
Efreet_Cache_Search_List search;
|
|
|
|
|
|
|
|
search.list = ecore_list_new();
|
|
|
|
search.what = glob;
|
|
|
|
|
2007-04-04 03:09:20 -07:00
|
|
|
ecore_hash_for_each_node(desktop_by_file_id, efreet_util_cache_search_generic_name_glob, &search);
|
2007-03-25 12:01:45 -07:00
|
|
|
|
|
|
|
if (ecore_list_is_empty(search.list)) IF_FREE_LIST(search.list);
|
|
|
|
return search.list;
|
|
|
|
}
|
|
|
|
|
|
|
|
Ecore_List *
|
|
|
|
efreet_util_desktop_comment_glob_list(const char *glob)
|
|
|
|
{
|
|
|
|
Efreet_Cache_Search_List search;
|
|
|
|
|
|
|
|
search.list = ecore_list_new();
|
|
|
|
search.what = glob;
|
|
|
|
|
2007-04-04 03:09:20 -07:00
|
|
|
ecore_hash_for_each_node(desktop_by_file_id, efreet_util_cache_search_comment_glob, &search);
|
2007-03-25 12:01:45 -07:00
|
|
|
|
|
|
|
if (ecore_list_is_empty(search.list)) IF_FREE_LIST(search.list);
|
|
|
|
return search.list;
|
|
|
|
}
|
|
|
|
|
2007-04-15 00:24:03 -07:00
|
|
|
/**
|
|
|
|
* Find all desktop categories
|
2007-06-06 18:22:48 -07:00
|
|
|
* This list must be freed using ecore_list_destroy()
|
2007-04-15 00:24:03 -07:00
|
|
|
*
|
|
|
|
* @return an Ecore_List of category names (const char *)
|
|
|
|
*/
|
|
|
|
Ecore_List *
|
2007-06-27 03:57:54 -07:00
|
|
|
efreet_util_desktop_categories_list(void)
|
2007-04-15 00:24:03 -07:00
|
|
|
{
|
2007-06-03 11:07:23 -07:00
|
|
|
return ecore_hash_keys(desktops_by_category);
|
2007-04-15 00:24:03 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Find all desktops in a given category
|
2007-06-06 18:22:48 -07:00
|
|
|
*
|
|
|
|
* Note: this returns a pointer to an internal list. Do not add to, remove from, or delete this list.
|
|
|
|
*
|
2007-04-15 00:24:03 -07:00
|
|
|
* @param category the category name
|
|
|
|
* @return a list of desktops
|
|
|
|
*/
|
2007-06-06 18:22:48 -07:00
|
|
|
Ecore_List *
|
2007-04-15 00:24:03 -07:00
|
|
|
efreet_util_desktop_category_list(const char *category)
|
|
|
|
{
|
2007-06-03 11:07:23 -07:00
|
|
|
return ecore_hash_get(desktops_by_category, category);
|
2007-04-15 00:24:03 -07:00
|
|
|
|
|
|
|
}
|
|
|
|
|
2007-03-25 05:47:59 -07:00
|
|
|
#if 0
|
|
|
|
static void
|
|
|
|
dump(void *value, void *data __UNUSED__)
|
|
|
|
{
|
|
|
|
Ecore_Hash_Node *node;
|
|
|
|
node = value;
|
|
|
|
printf("%s -> %p\n", (char *)node->key, node->value);
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
|
|
|
|
static int
|
2007-04-13 09:28:32 -07:00
|
|
|
efreet_util_cache_fill(void *data __UNUSED__)
|
2007-03-25 05:47:59 -07:00
|
|
|
{
|
|
|
|
struct dirent *file = NULL;
|
|
|
|
double start;
|
|
|
|
char buf[PATH_MAX];
|
|
|
|
|
|
|
|
if (!fill->dirs)
|
|
|
|
{
|
|
|
|
free(fill);
|
|
|
|
idler = NULL;
|
2007-04-13 09:28:32 -07:00
|
|
|
fill = NULL;
|
2007-04-05 13:53:43 -07:00
|
|
|
ecore_event_add(EFREET_EVENT_DESKTOP_LIST_CHANGE, NULL, NULL, NULL);
|
2007-04-03 11:43:30 -07:00
|
|
|
|
2007-03-25 05:47:59 -07:00
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
if (!fill->current)
|
|
|
|
{
|
|
|
|
fill->current = ecore_list_remove_first(fill->dirs);
|
|
|
|
if (!fill->current)
|
|
|
|
{
|
|
|
|
IF_FREE_LIST(fill->dirs);
|
|
|
|
free(fill);
|
|
|
|
idler = NULL;
|
2007-04-13 09:28:32 -07:00
|
|
|
fill = NULL;
|
2007-03-25 05:47:59 -07:00
|
|
|
#if 0
|
|
|
|
ecore_hash_for_each_node(desktop_by_file_id, dump, NULL);
|
|
|
|
ecore_hash_for_each_node(file_id_by_desktop_path, dump, NULL);
|
|
|
|
printf("%d\n", ecore_hash_count(desktop_by_file_id));
|
|
|
|
#endif
|
2007-04-05 13:53:43 -07:00
|
|
|
ecore_event_add(EFREET_EVENT_DESKTOP_LIST_CHANGE, NULL, NULL, NULL);
|
2007-03-30 18:59:24 -07:00
|
|
|
|
2007-03-25 05:47:59 -07:00
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
start = ecore_time_get();
|
|
|
|
if (!fill->files) fill->files = opendir(fill->current->path);
|
|
|
|
if (!fill->files)
|
|
|
|
{
|
|
|
|
/* Couldn't open this dir, continue to next */
|
2007-04-15 00:24:03 -07:00
|
|
|
efreet_util_cache_dir_free(fill->current);
|
2007-03-25 05:47:59 -07:00
|
|
|
fill->current = NULL;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2007-04-18 07:18:28 -07:00
|
|
|
do
|
2007-03-25 05:47:59 -07:00
|
|
|
{
|
|
|
|
char file_id[PATH_MAX];
|
|
|
|
|
|
|
|
file = readdir(fill->files);
|
|
|
|
if (!file) break;
|
|
|
|
if (!strcmp(file->d_name, ".") || !strcmp(file->d_name, "..")) continue;
|
|
|
|
|
|
|
|
snprintf(buf, PATH_MAX, "%s/%s", fill->current->path, file->d_name);
|
|
|
|
if (fill->current->file_id)
|
|
|
|
snprintf(file_id, PATH_MAX, "%s-%s", fill->current->file_id, file->d_name);
|
|
|
|
else
|
|
|
|
strcpy(file_id, file->d_name);
|
|
|
|
|
|
|
|
if (ecore_file_is_dir(buf))
|
|
|
|
{
|
|
|
|
Efreet_Cache_Fill_Dir *dir;
|
|
|
|
|
|
|
|
dir = NEW(Efreet_Cache_Fill_Dir, 1);
|
|
|
|
dir->path = strdup(buf);
|
|
|
|
dir->file_id = strdup(file_id);
|
2007-04-05 13:22:58 -07:00
|
|
|
dir->priority = fill->current->priority;
|
2007-03-25 05:47:59 -07:00
|
|
|
ecore_list_append(fill->dirs, dir);
|
|
|
|
}
|
|
|
|
else
|
2007-04-10 00:18:51 -07:00
|
|
|
efreet_util_cache_add(buf, file_id, fill->current->priority, 0);
|
2007-04-18 07:18:28 -07:00
|
|
|
} while ((ecore_time_get() - start) < 0.01);
|
|
|
|
|
2007-03-25 05:47:59 -07:00
|
|
|
if (!file)
|
|
|
|
{
|
|
|
|
/* This dir has been search through */
|
2007-04-05 13:22:58 -07:00
|
|
|
efreet_util_monitor(fill->current->path, fill->current->file_id,
|
|
|
|
fill->current->priority);
|
2007-04-04 01:48:29 -07:00
|
|
|
efreet_util_cache_dir_free(fill->current);
|
2007-03-25 05:47:59 -07:00
|
|
|
fill->current = NULL;
|
|
|
|
closedir(fill->files);
|
|
|
|
fill->files = NULL;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
2007-04-04 03:09:20 -07:00
|
|
|
static void
|
2007-04-10 00:18:51 -07:00
|
|
|
efreet_util_cache_add(const char *path, const char *file_id, int priority, int event)
|
2007-04-04 03:09:20 -07:00
|
|
|
{
|
|
|
|
Efreet_Desktop *desktop;
|
2007-04-05 13:22:58 -07:00
|
|
|
Efreet_Util_Desktop *ud;
|
2007-04-04 03:09:20 -07:00
|
|
|
char *ext;
|
|
|
|
|
|
|
|
ext = strrchr(path, '.');
|
|
|
|
if (!ext || strcmp(ext, ".desktop")) return;
|
|
|
|
desktop = efreet_desktop_get(path);
|
|
|
|
|
|
|
|
if (!desktop || desktop->type != EFREET_DESKTOP_TYPE_APPLICATION) return;
|
2007-04-05 13:22:58 -07:00
|
|
|
ud = ecore_hash_get(desktop_by_file_id, file_id);
|
|
|
|
if (!ud)
|
|
|
|
{
|
2007-04-10 09:11:54 -07:00
|
|
|
ud = NEW(Efreet_Util_Desktop, 1);
|
|
|
|
ud->priority = priority;
|
|
|
|
ud->desktop = desktop;
|
|
|
|
|
|
|
|
ecore_hash_set(desktop_by_file_id, (void *)ecore_string_instance(file_id), ud);
|
2007-06-03 11:07:23 -07:00
|
|
|
efreet_util_desktops_by_category_add(desktop);
|
|
|
|
|
2007-04-10 00:18:51 -07:00
|
|
|
if (event)
|
|
|
|
{
|
|
|
|
Efreet_Event_Desktop_Change *ev;
|
2007-04-05 13:53:43 -07:00
|
|
|
|
2007-04-10 00:18:51 -07:00
|
|
|
ev = NEW(Efreet_Event_Desktop_Change, 1);
|
|
|
|
ev->current = desktop;
|
|
|
|
ev->change = EFREET_DESKTOP_CHANGE_ADD;
|
|
|
|
ecore_event_add(EFREET_EVENT_DESKTOP_CHANGE, ev, NULL, NULL);
|
|
|
|
}
|
2007-04-05 13:22:58 -07:00
|
|
|
}
|
|
|
|
else if (priority < ud->priority)
|
|
|
|
{
|
2007-06-03 11:07:23 -07:00
|
|
|
efreet_util_desktops_by_category_remove(ud->desktop);
|
|
|
|
efreet_util_desktops_by_category_add(desktop);
|
|
|
|
|
2007-04-10 00:18:51 -07:00
|
|
|
if (event)
|
|
|
|
{
|
|
|
|
Efreet_Event_Desktop_Change *ev;
|
|
|
|
|
|
|
|
ev = NEW(Efreet_Event_Desktop_Change, 1);
|
|
|
|
ev->current = desktop;
|
|
|
|
ev->previous = ud->desktop;
|
|
|
|
ev->change = EFREET_DESKTOP_CHANGE_UPDATE;
|
|
|
|
ud->desktop = desktop;
|
|
|
|
ecore_event_add(EFREET_EVENT_DESKTOP_CHANGE, ev, NULL, NULL);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
ud->desktop = desktop;
|
2007-04-05 13:22:58 -07:00
|
|
|
}
|
2007-04-04 03:09:20 -07:00
|
|
|
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),
|
|
|
|
(void *)ecore_string_instance(file_id));
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
2007-04-05 13:22:58 -07:00
|
|
|
efreet_util_cache_remove(const char *path, const char *file_id, int priority)
|
2007-04-04 03:09:20 -07:00
|
|
|
{
|
2007-04-05 13:22:58 -07:00
|
|
|
Efreet_Util_Desktop *ud;
|
2007-04-04 03:09:20 -07:00
|
|
|
char *ext;
|
|
|
|
|
|
|
|
ext = strrchr(path, '.');
|
|
|
|
if (!ext || strcmp(ext, ".desktop")) return;
|
2007-04-05 13:22:58 -07:00
|
|
|
ud = ecore_hash_get(desktop_by_file_id, file_id);
|
|
|
|
if (ud && (ud->priority >= priority))
|
|
|
|
{
|
2007-04-05 13:53:43 -07:00
|
|
|
Efreet_Event_Desktop_Change *ev;
|
|
|
|
|
2007-04-05 13:22:58 -07:00
|
|
|
ecore_hash_remove(desktop_by_file_id, file_id);
|
2007-06-03 11:07:23 -07:00
|
|
|
efreet_util_desktops_by_category_remove(ud->desktop);
|
2007-04-05 13:53:43 -07:00
|
|
|
|
|
|
|
ev = NEW(Efreet_Event_Desktop_Change, 1);
|
2007-04-05 14:10:50 -07:00
|
|
|
ev->current = ud->desktop;
|
2007-04-05 13:53:43 -07:00
|
|
|
ev->change = EFREET_DESKTOP_CHANGE_REMOVE;
|
|
|
|
ecore_event_add(EFREET_EVENT_DESKTOP_CHANGE, ev, NULL, NULL);
|
|
|
|
|
2007-04-05 13:22:58 -07:00
|
|
|
free(ud);
|
2007-04-05 13:53:43 -07:00
|
|
|
|
2007-04-05 13:22:58 -07:00
|
|
|
/* This call will search application dirs and add the file to cache if it
|
|
|
|
* exists. */
|
|
|
|
efreet_util_desktop_file_id_find(file_id);
|
|
|
|
}
|
2007-04-04 03:09:20 -07:00
|
|
|
ecore_hash_remove(file_id_by_desktop_path, path);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
2007-04-05 13:22:58 -07:00
|
|
|
efreet_util_cache_reload(const char *path, const char *file_id, int priority)
|
2007-04-04 03:09:20 -07:00
|
|
|
{
|
|
|
|
Efreet_Desktop *desktop;
|
2007-04-05 13:22:58 -07:00
|
|
|
Efreet_Util_Desktop *ud;
|
2007-04-04 03:09:20 -07:00
|
|
|
char *ext;
|
|
|
|
|
|
|
|
ext = strrchr(path, '.');
|
|
|
|
if (!ext || strcmp(ext, ".desktop")) return;
|
|
|
|
desktop = efreet_desktop_get(path);
|
|
|
|
|
|
|
|
if (!desktop || desktop->type != EFREET_DESKTOP_TYPE_APPLICATION) return;
|
2007-04-05 13:22:58 -07:00
|
|
|
ud = ecore_hash_get(desktop_by_file_id, file_id);
|
|
|
|
if (ud)
|
|
|
|
{
|
2007-04-05 13:53:43 -07:00
|
|
|
Efreet_Event_Desktop_Change *ev;
|
|
|
|
|
2007-04-05 13:22:58 -07:00
|
|
|
if (ud->priority < priority) return;
|
2007-04-05 13:53:43 -07:00
|
|
|
|
2007-06-03 11:07:23 -07:00
|
|
|
efreet_util_desktops_by_category_remove(ud->desktop);
|
|
|
|
efreet_util_desktops_by_category_add(desktop);
|
|
|
|
|
2007-04-05 13:53:43 -07:00
|
|
|
ev = NEW(Efreet_Event_Desktop_Change, 1);
|
2007-04-05 14:10:50 -07:00
|
|
|
ev->current = desktop;
|
|
|
|
ev->previous = ud->desktop;
|
|
|
|
ev->change = EFREET_DESKTOP_CHANGE_UPDATE;
|
2007-04-05 13:53:43 -07:00
|
|
|
ecore_event_add(EFREET_EVENT_DESKTOP_CHANGE, ev, NULL, NULL);
|
|
|
|
|
2007-04-05 13:22:58 -07:00
|
|
|
ud->desktop = desktop;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2007-04-05 13:53:43 -07:00
|
|
|
Efreet_Event_Desktop_Change *ev;
|
|
|
|
|
2007-04-05 13:22:58 -07:00
|
|
|
ud = NEW(Efreet_Util_Desktop, 1);
|
|
|
|
ud->priority = priority;
|
|
|
|
ud->desktop = desktop;
|
2007-06-03 11:07:23 -07:00
|
|
|
|
2007-04-05 13:22:58 -07:00
|
|
|
ecore_hash_set(desktop_by_file_id, (void *)ecore_string_instance(file_id), ud);
|
2007-06-03 11:07:23 -07:00
|
|
|
efreet_util_desktops_by_category_remove(ud->desktop);
|
|
|
|
efreet_util_desktops_by_category_add(desktop);
|
2007-04-05 13:53:43 -07:00
|
|
|
|
|
|
|
ev = NEW(Efreet_Event_Desktop_Change, 1);
|
2007-04-05 14:10:50 -07:00
|
|
|
ev->current = desktop;
|
2007-04-05 13:53:43 -07:00
|
|
|
ev->change = EFREET_DESKTOP_CHANGE_ADD;
|
|
|
|
ecore_event_add(EFREET_EVENT_DESKTOP_CHANGE, ev, NULL, NULL);
|
2007-04-05 13:22:58 -07:00
|
|
|
}
|
2007-04-04 03:09:20 -07:00
|
|
|
}
|
|
|
|
|
2007-03-25 05:47:59 -07:00
|
|
|
static void
|
2007-04-04 01:48:29 -07:00
|
|
|
efreet_util_cache_dir_free(void *data)
|
2007-03-25 05:47:59 -07:00
|
|
|
{
|
|
|
|
Efreet_Cache_Fill_Dir *dir;
|
|
|
|
|
|
|
|
dir = data;
|
|
|
|
IF_FREE(dir->path);
|
|
|
|
IF_FREE(dir->file_id);
|
|
|
|
free(dir);
|
|
|
|
}
|
2007-03-25 06:43:52 -07:00
|
|
|
|
2007-03-25 11:17:34 -07:00
|
|
|
static void
|
2007-04-04 01:48:29 -07:00
|
|
|
efreet_util_cache_search_mime(void *value, void *data)
|
2007-03-25 11:17:34 -07:00
|
|
|
{
|
|
|
|
Ecore_Hash_Node *node;
|
2007-03-25 12:01:45 -07:00
|
|
|
Efreet_Cache_Search_List *search;
|
2007-04-05 13:22:58 -07:00
|
|
|
Efreet_Util_Desktop *ud;
|
2007-03-25 11:17:34 -07:00
|
|
|
const char *mime;
|
|
|
|
|
|
|
|
node = value;
|
|
|
|
search = data;
|
2007-04-05 13:22:58 -07:00
|
|
|
ud = node->value;
|
2007-03-25 11:17:34 -07:00
|
|
|
|
2007-04-05 13:22:58 -07:00
|
|
|
if (!ud->desktop->mime_types) return;
|
|
|
|
ecore_list_goto_first(ud->desktop->mime_types);
|
|
|
|
while ((mime = ecore_list_next(ud->desktop->mime_types)))
|
2007-03-25 11:17:34 -07:00
|
|
|
{
|
2007-04-15 03:53:54 -07:00
|
|
|
if (search->what == mime)
|
2007-03-25 11:17:34 -07:00
|
|
|
{
|
2007-04-05 13:22:58 -07:00
|
|
|
ecore_list_append(search->list, ud->desktop);
|
2007-03-25 11:17:34 -07:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2007-03-25 09:44:47 -07:00
|
|
|
static int
|
2007-04-04 01:48:29 -07:00
|
|
|
efreet_util_cache_search_wm_class(const void *value, const void *data)
|
2007-03-25 08:52:18 -07:00
|
|
|
{
|
2007-03-25 09:44:47 -07:00
|
|
|
const Efreet_Cache_Search *search;
|
2007-04-05 13:22:58 -07:00
|
|
|
const Efreet_Util_Desktop *ud;
|
2007-03-25 08:52:18 -07:00
|
|
|
|
2007-04-05 13:22:58 -07:00
|
|
|
ud = value;
|
2007-03-25 08:52:18 -07:00
|
|
|
search = data;
|
|
|
|
|
2007-04-05 13:22:58 -07:00
|
|
|
if (!ud->desktop->startup_wm_class) return 1;
|
|
|
|
if ((search->what2) && (!strcmp(ud->desktop->startup_wm_class, search->what2)))
|
2007-03-25 09:44:47 -07:00
|
|
|
return 0;
|
2007-04-05 13:29:26 -07:00
|
|
|
else if ((search->what1) && (!strcmp(ud->desktop->startup_wm_class, search->what1)))
|
2007-03-25 09:44:47 -07:00
|
|
|
return 0;
|
|
|
|
return 1;
|
2007-03-25 08:52:18 -07:00
|
|
|
}
|
|
|
|
|
2007-04-04 03:09:20 -07:00
|
|
|
static int
|
|
|
|
efreet_util_cache_search_exec(const void *value, const void *data)
|
|
|
|
{
|
|
|
|
const Efreet_Cache_Search *search;
|
2007-04-05 13:22:58 -07:00
|
|
|
const Efreet_Util_Desktop *ud;
|
2007-04-04 03:09:20 -07:00
|
|
|
char *exec;
|
|
|
|
const char *file;
|
|
|
|
|
2007-04-05 13:22:58 -07:00
|
|
|
ud = value;
|
2007-04-04 03:09:20 -07:00
|
|
|
search = data;
|
|
|
|
|
2007-04-05 13:22:58 -07:00
|
|
|
if (!ud->desktop->exec) return 1;
|
|
|
|
exec = ecore_file_app_exe_get(ud->desktop->exec);
|
2007-04-04 03:09:20 -07:00
|
|
|
if (!exec) return 1;
|
|
|
|
if (!strcmp(exec, search->what1))
|
|
|
|
{
|
|
|
|
free(exec);
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
file = ecore_file_get_file(exec);
|
|
|
|
if (file && !strcmp(file, search->what1))
|
|
|
|
{
|
|
|
|
free(exec);
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
free(exec);
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
2007-03-25 09:44:47 -07:00
|
|
|
static int
|
2007-04-04 01:48:29 -07:00
|
|
|
efreet_util_cache_search_name(const void *value, const void *data)
|
2007-03-25 06:43:52 -07:00
|
|
|
{
|
2007-03-25 09:44:47 -07:00
|
|
|
const Efreet_Cache_Search *search;
|
2007-04-05 13:22:58 -07:00
|
|
|
const Efreet_Util_Desktop *ud;
|
2007-03-25 06:43:52 -07:00
|
|
|
|
2007-04-05 13:22:58 -07:00
|
|
|
ud = value;
|
2007-03-25 06:43:52 -07:00
|
|
|
search = data;
|
|
|
|
|
2007-04-05 13:22:58 -07:00
|
|
|
if (!ud->desktop->name) return 1;
|
|
|
|
return strcmp(ud->desktop->name, search->what1);
|
2007-03-25 06:43:52 -07:00
|
|
|
}
|
|
|
|
|
2007-03-25 09:44:47 -07:00
|
|
|
static int
|
2007-04-04 01:48:29 -07:00
|
|
|
efreet_util_cache_search_generic_name(const void *value, const void *data)
|
2007-03-25 06:43:52 -07:00
|
|
|
{
|
2007-03-25 09:44:47 -07:00
|
|
|
const Efreet_Cache_Search *search;
|
2007-04-05 13:22:58 -07:00
|
|
|
const Efreet_Util_Desktop *ud;
|
2007-03-25 06:43:52 -07:00
|
|
|
|
2007-04-05 13:22:58 -07:00
|
|
|
ud = value;
|
2007-03-25 06:43:52 -07:00
|
|
|
search = data;
|
|
|
|
|
2007-04-05 13:22:58 -07:00
|
|
|
if (!ud->desktop->generic_name) return 1;
|
|
|
|
return strcmp(ud->desktop->generic_name, search->what1);
|
2007-03-25 06:43:52 -07:00
|
|
|
}
|
2007-03-25 12:01:45 -07:00
|
|
|
|
|
|
|
static void
|
2007-04-04 01:48:29 -07:00
|
|
|
efreet_util_cache_search_name_glob(void *value, void *data)
|
2007-03-25 12:01:45 -07:00
|
|
|
{
|
|
|
|
Ecore_Hash_Node *node;
|
|
|
|
Efreet_Cache_Search_List *search;
|
2007-04-05 13:22:58 -07:00
|
|
|
Efreet_Util_Desktop *ud;
|
2007-03-25 12:01:45 -07:00
|
|
|
|
|
|
|
node = value;
|
|
|
|
search = data;
|
2007-04-05 13:22:58 -07:00
|
|
|
ud = node->value;
|
2007-03-25 12:01:45 -07:00
|
|
|
|
2007-04-05 13:22:58 -07:00
|
|
|
if (efreet_util_glob_match(ud->desktop->name, search->what))
|
|
|
|
ecore_list_append(search->list, ud->desktop);
|
2007-03-25 12:01:45 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
2007-04-04 01:48:29 -07:00
|
|
|
efreet_util_cache_search_exec_glob(void *value, void *data)
|
2007-03-25 12:01:45 -07:00
|
|
|
{
|
|
|
|
Ecore_Hash_Node *node;
|
|
|
|
Efreet_Cache_Search_List *search;
|
2007-04-05 13:22:58 -07:00
|
|
|
Efreet_Util_Desktop *ud;
|
2007-03-25 12:01:45 -07:00
|
|
|
char *exec;
|
|
|
|
|
|
|
|
node = value;
|
|
|
|
search = data;
|
2007-04-05 13:22:58 -07:00
|
|
|
ud = node->value;
|
2007-03-25 12:01:45 -07:00
|
|
|
|
2007-04-05 13:22:58 -07:00
|
|
|
if (!ud->desktop->exec) return;
|
|
|
|
exec = ecore_file_app_exe_get(ud->desktop->exec);
|
2007-03-25 12:01:45 -07:00
|
|
|
if (exec)
|
|
|
|
{
|
2007-04-04 01:48:29 -07:00
|
|
|
if (efreet_util_glob_match(exec, search->what))
|
2007-04-05 13:22:58 -07:00
|
|
|
ecore_list_append(search->list, ud->desktop);
|
2007-03-25 12:01:45 -07:00
|
|
|
free(exec);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
2007-04-04 01:48:29 -07:00
|
|
|
efreet_util_cache_search_generic_name_glob(void *value, void *data)
|
2007-03-25 12:01:45 -07:00
|
|
|
{
|
|
|
|
Ecore_Hash_Node *node;
|
|
|
|
Efreet_Cache_Search_List *search;
|
2007-04-05 13:22:58 -07:00
|
|
|
Efreet_Util_Desktop *ud;
|
2007-03-25 12:01:45 -07:00
|
|
|
|
|
|
|
node = value;
|
|
|
|
search = data;
|
2007-04-05 13:22:58 -07:00
|
|
|
ud = node->value;
|
2007-03-25 12:01:45 -07:00
|
|
|
|
2007-04-05 13:22:58 -07:00
|
|
|
if (efreet_util_glob_match(ud->desktop->generic_name, search->what))
|
|
|
|
ecore_list_append(search->list, ud->desktop);
|
2007-03-25 12:01:45 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
2007-04-04 01:48:29 -07:00
|
|
|
efreet_util_cache_search_comment_glob(void *value, void *data)
|
2007-03-25 12:01:45 -07:00
|
|
|
{
|
|
|
|
Ecore_Hash_Node *node;
|
|
|
|
Efreet_Cache_Search_List *search;
|
2007-04-05 13:22:58 -07:00
|
|
|
Efreet_Util_Desktop *ud;
|
2007-03-25 12:01:45 -07:00
|
|
|
|
|
|
|
node = value;
|
|
|
|
search = data;
|
2007-04-05 13:22:58 -07:00
|
|
|
ud = node->value;
|
2007-03-25 12:01:45 -07:00
|
|
|
|
2007-04-05 13:22:58 -07:00
|
|
|
if (efreet_util_glob_match(ud->desktop->comment, search->what))
|
|
|
|
ecore_list_append(search->list, ud->desktop);
|
2007-03-25 12:01:45 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
static int
|
2007-04-04 01:48:29 -07:00
|
|
|
efreet_util_glob_match(const char *str, const char *glob)
|
2007-03-25 12:01:45 -07:00
|
|
|
{
|
|
|
|
if (!str || !glob)
|
|
|
|
return 0;
|
2007-04-04 05:00:40 -07:00
|
|
|
if (glob[0] == '\0')
|
2007-03-25 12:01:45 -07:00
|
|
|
{
|
2007-04-04 05:00:40 -07:00
|
|
|
if (str[0] == '\0') return 1;
|
2007-03-25 12:01:45 -07:00
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
if (!strcmp(glob, "*")) return 1;
|
|
|
|
if (!fnmatch(glob, str, 0)) return 1;
|
|
|
|
return 0;
|
|
|
|
}
|
2007-04-04 03:09:20 -07:00
|
|
|
|
|
|
|
static void
|
2007-04-05 13:22:58 -07:00
|
|
|
efreet_util_monitor(const char *path, const char *file_id, int priority)
|
2007-04-04 03:09:20 -07:00
|
|
|
{
|
|
|
|
Efreet_Monitor *em;
|
|
|
|
|
|
|
|
em = NEW(Efreet_Monitor, 1);
|
|
|
|
em->monitor = ecore_file_monitor_add(path, efreet_util_monitor_cb, em);
|
|
|
|
if (file_id) em->file_id = strdup(file_id);
|
2007-04-05 13:22:58 -07:00
|
|
|
em->priority = priority;
|
2007-04-04 03:09:20 -07:00
|
|
|
ecore_list_append(monitors, em);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
efreet_util_monitor_cb(void *data, Ecore_File_Monitor *monitor __UNUSED__,
|
|
|
|
Ecore_File_Event event, const char *path)
|
|
|
|
{
|
|
|
|
Efreet_Monitor *em;
|
|
|
|
char file_id[PATH_MAX];
|
|
|
|
|
|
|
|
em = data;
|
|
|
|
if (em->file_id)
|
|
|
|
snprintf(file_id, sizeof(file_id), "%s-%s", em->file_id, ecore_file_get_file(path));
|
|
|
|
else
|
|
|
|
strcpy(file_id, ecore_file_get_file(path));
|
|
|
|
switch (event)
|
|
|
|
{
|
|
|
|
case ECORE_FILE_EVENT_NONE:
|
|
|
|
/* Ignore */
|
|
|
|
break;
|
|
|
|
case ECORE_FILE_EVENT_CREATED_FILE:
|
2007-04-10 00:18:51 -07:00
|
|
|
efreet_util_cache_add(path, file_id, em->priority, 1);
|
2007-04-04 03:09:20 -07:00
|
|
|
break;
|
|
|
|
case ECORE_FILE_EVENT_CREATED_DIRECTORY:
|
2007-04-13 09:28:32 -07:00
|
|
|
{
|
|
|
|
Efreet_Cache_Fill_Dir *dir;
|
|
|
|
|
|
|
|
if (!fill)
|
|
|
|
{
|
|
|
|
fill = NEW(Efreet_Cache_Fill, 1);
|
|
|
|
fill->dirs = ecore_list_new();
|
|
|
|
ecore_list_set_free_cb(fill->dirs, efreet_util_cache_dir_free);
|
|
|
|
}
|
|
|
|
|
|
|
|
dir = NEW(Efreet_Cache_Fill_Dir, 1);
|
|
|
|
dir->path = strdup(path);
|
|
|
|
dir->file_id = strdup(file_id);
|
|
|
|
dir->priority = em->priority;
|
|
|
|
ecore_list_append(fill->dirs, dir);
|
|
|
|
|
|
|
|
if (!idler)
|
|
|
|
idler = ecore_idler_add(efreet_util_cache_fill, NULL);
|
|
|
|
}
|
2007-04-04 03:09:20 -07:00
|
|
|
break;
|
|
|
|
case ECORE_FILE_EVENT_DELETED_FILE:
|
2007-04-05 13:22:58 -07:00
|
|
|
efreet_util_cache_remove(path, file_id, em->priority);
|
2007-04-04 03:09:20 -07:00
|
|
|
break;
|
|
|
|
case ECORE_FILE_EVENT_DELETED_DIRECTORY:
|
|
|
|
/* Ignore, we should already have a monitor on any subdir */
|
|
|
|
break;
|
|
|
|
case ECORE_FILE_EVENT_DELETED_SELF:
|
2007-05-28 03:35:12 -07:00
|
|
|
if (ecore_list_goto(monitors, em))
|
|
|
|
ecore_list_remove(monitors);
|
2007-04-04 03:09:20 -07:00
|
|
|
efreet_util_monitor_free(em);
|
|
|
|
break;
|
|
|
|
case ECORE_FILE_EVENT_MODIFIED:
|
2007-04-05 13:22:58 -07:00
|
|
|
efreet_util_cache_reload(path, file_id, em->priority);
|
2007-04-04 03:09:20 -07:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
efreet_util_monitor_free(void *data)
|
|
|
|
{
|
|
|
|
Efreet_Monitor *em;
|
|
|
|
|
|
|
|
em = data;
|
|
|
|
if (em->monitor) ecore_file_monitor_del(em->monitor);
|
|
|
|
IF_FREE(em->file_id);
|
|
|
|
free(em);
|
|
|
|
}
|
|
|
|
|
2007-04-14 23:16:54 -07:00
|
|
|
/**
|
|
|
|
* Returns a list of .menu files found in the various config dirs.
|
|
|
|
* @return An ecore list of menu file paths (const char *). This must be freed with ecore_list_destroy().
|
|
|
|
*/
|
|
|
|
Ecore_List *
|
2007-06-27 03:57:54 -07:00
|
|
|
efreet_util_menus_find(void)
|
2007-04-14 23:16:54 -07:00
|
|
|
{
|
|
|
|
Ecore_List *menus, *dirs;
|
|
|
|
const char *dir;
|
|
|
|
|
|
|
|
menus = ecore_list_new();
|
|
|
|
ecore_list_set_free_cb(menus, ECORE_FREE_CB(free));
|
|
|
|
|
|
|
|
efreet_util_menus_find_helper(menus, efreet_config_home_get());
|
|
|
|
|
|
|
|
dirs = efreet_config_dirs_get();
|
|
|
|
ecore_list_goto_first(dirs);
|
|
|
|
while ((dir = ecore_list_next(dirs)))
|
|
|
|
efreet_util_menus_find_helper(menus, dir);
|
|
|
|
|
|
|
|
return menus;
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
efreet_util_menus_find_helper(Ecore_List *menus, const char *config_dir)
|
|
|
|
{
|
|
|
|
DIR *files = NULL;
|
|
|
|
struct dirent *file = NULL;
|
|
|
|
char dbuf[PATH_MAX], fbuf[PATH_MAX];
|
|
|
|
|
|
|
|
snprintf(dbuf, sizeof(dbuf), "%s/menus", config_dir);
|
|
|
|
files = opendir(dbuf);
|
|
|
|
if (!files) return;
|
|
|
|
while ((file = readdir(files))) {
|
|
|
|
const char *exten;
|
|
|
|
exten = strrchr(file->d_name, '.');
|
|
|
|
if (!exten) continue;
|
|
|
|
if (strcmp(".menu", exten)) continue;
|
|
|
|
|
|
|
|
snprintf(fbuf, PATH_MAX, "%s/%s", dbuf, file->d_name);
|
|
|
|
if (ecore_file_is_dir(fbuf)) continue;
|
|
|
|
|
|
|
|
ecore_list_append(menus, strdup(fbuf));
|
|
|
|
}
|
|
|
|
closedir(files);
|
|
|
|
}
|
2007-06-03 11:07:23 -07:00
|
|
|
|
|
|
|
static void
|
|
|
|
efreet_util_desktops_by_category_add(Efreet_Desktop *desktop)
|
|
|
|
{
|
|
|
|
const char *category;
|
|
|
|
|
|
|
|
if (!desktop->categories) return;
|
|
|
|
|
|
|
|
ecore_list_goto_first(desktop->categories);
|
|
|
|
while ((category = ecore_list_next(desktop->categories)))
|
|
|
|
{
|
|
|
|
Ecore_List *list;
|
|
|
|
list = ecore_hash_get(desktops_by_category, category);
|
|
|
|
if (!list)
|
|
|
|
{
|
|
|
|
list = ecore_list_new();
|
|
|
|
ecore_hash_set(desktops_by_category,
|
|
|
|
(void *)ecore_string_instance(category), list);
|
|
|
|
}
|
|
|
|
if (!ecore_list_goto(list, desktop))
|
|
|
|
ecore_list_append(list, desktop);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
efreet_util_desktops_by_category_remove(Efreet_Desktop *desktop)
|
|
|
|
{
|
|
|
|
const char *category;
|
|
|
|
|
|
|
|
if (!desktop->categories) return;
|
|
|
|
|
|
|
|
ecore_list_goto_first(desktop->categories);
|
|
|
|
while ((category = ecore_list_next(desktop->categories)))
|
|
|
|
{
|
|
|
|
Ecore_List *list;
|
|
|
|
list = ecore_hash_get(desktops_by_category, category);
|
|
|
|
if (!list) continue;
|
|
|
|
if (ecore_list_goto(list, desktop))
|
|
|
|
ecore_list_remove(list);
|
|
|
|
if (ecore_list_is_empty(list))
|
|
|
|
{
|
|
|
|
ecore_hash_remove(desktops_by_category, category);
|
|
|
|
ecore_list_destroy(list);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|