2007-03-24 13:12:16 -07:00
|
|
|
#include "e.h"
|
2007-03-24 15:02:33 -07:00
|
|
|
|
2007-03-25 03:16:05 -07:00
|
|
|
/* local subsystem functions */
|
2010-04-20 11:48:42 -07:00
|
|
|
static void _e_order_free(E_Order *eo);
|
|
|
|
static void _e_order_cb_monitor(void *data, Ecore_File_Monitor *em, Ecore_File_Event event, const char *path);
|
|
|
|
static void _e_order_read(E_Order *eo);
|
|
|
|
static void _e_order_save(E_Order *eo);
|
2010-06-24 09:19:12 -07:00
|
|
|
static Eina_Bool _e_order_cb_efreet_cache_update(void *data, int ev_type, void *ev);
|
2007-04-06 04:21:34 -07:00
|
|
|
|
2008-10-22 04:49:33 -07:00
|
|
|
static Eina_List *orders = NULL;
|
|
|
|
static Eina_List *handlers = NULL;
|
2007-04-04 15:25:41 -07:00
|
|
|
|
2007-03-25 03:16:05 -07:00
|
|
|
/* externally accessible functions */
|
2010-11-22 07:21:32 -08:00
|
|
|
EINTERN int
|
2007-04-04 15:25:41 -07:00
|
|
|
e_order_init(void)
|
|
|
|
{
|
2011-05-12 22:49:36 -07:00
|
|
|
char *menu_file = NULL;
|
|
|
|
|
2010-04-20 11:48:42 -07:00
|
|
|
handlers =
|
|
|
|
eina_list_append(handlers,
|
|
|
|
ecore_event_handler_add(EFREET_EVENT_DESKTOP_CACHE_UPDATE,
|
|
|
|
_e_order_cb_efreet_cache_update,
|
|
|
|
NULL));
|
2011-05-12 22:49:36 -07:00
|
|
|
if (e_config->default_system_menu)
|
|
|
|
menu_file = strdup(e_config->default_system_menu);
|
|
|
|
if (!menu_file)
|
|
|
|
menu_file = strdup("/etc/xdg/menus/applications.menu");
|
|
|
|
if (menu_file)
|
|
|
|
{
|
|
|
|
if (!ecore_file_exists(menu_file))
|
|
|
|
{
|
|
|
|
char buf[PATH_MAX];
|
|
|
|
|
|
|
|
free(menu_file);
|
2011-05-20 09:19:53 -07:00
|
|
|
menu_file = NULL;
|
2011-05-12 22:49:36 -07:00
|
|
|
snprintf(buf, sizeof(buf), "/etc/xdg/menus/enlightenment.menu");
|
|
|
|
if (ecore_file_exists(buf)) menu_file = strdup(buf);
|
|
|
|
else
|
|
|
|
{
|
|
|
|
snprintf(buf, sizeof(buf),
|
|
|
|
"%s/etc/xdg/menus/enlightenment.menu",
|
|
|
|
e_prefix_get());
|
|
|
|
if (ecore_file_exists(buf)) menu_file = strdup(buf);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
efreet_menu_file_set(menu_file);
|
|
|
|
if (menu_file) free(menu_file);
|
2007-04-04 15:25:41 -07:00
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
2010-11-22 07:21:32 -08:00
|
|
|
EINTERN int
|
2007-04-04 15:25:41 -07:00
|
|
|
e_order_shutdown(void)
|
|
|
|
{
|
2008-10-22 04:49:33 -07:00
|
|
|
orders = eina_list_free(orders);
|
2007-04-06 04:21:34 -07:00
|
|
|
|
2009-08-21 08:08:49 -07:00
|
|
|
E_FREE_LIST(handlers, ecore_event_handler_del);
|
2007-04-04 15:25:41 -07:00
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
2007-03-24 15:02:33 -07:00
|
|
|
EAPI E_Order *
|
|
|
|
e_order_new(const char *path)
|
|
|
|
{
|
|
|
|
E_Order *eo;
|
2007-03-25 03:16:05 -07:00
|
|
|
|
2007-03-24 15:02:33 -07:00
|
|
|
eo = E_OBJECT_ALLOC(E_Order, E_ORDER_TYPE, _e_order_free);
|
|
|
|
if (!eo) return NULL;
|
|
|
|
|
2008-10-15 08:12:56 -07:00
|
|
|
if (path) eo->path = eina_stringshare_add(path);
|
2007-03-25 03:16:05 -07:00
|
|
|
_e_order_read(eo);
|
2007-03-24 15:02:33 -07:00
|
|
|
eo->monitor = ecore_file_monitor_add(path, _e_order_cb_monitor, eo);
|
|
|
|
|
2008-10-22 04:49:33 -07:00
|
|
|
orders = eina_list_append(orders, eo);
|
2007-04-04 15:25:41 -07:00
|
|
|
|
2007-03-24 15:02:33 -07:00
|
|
|
return eo;
|
|
|
|
}
|
|
|
|
|
2007-03-25 03:16:05 -07:00
|
|
|
EAPI void
|
|
|
|
e_order_update_callback_set(E_Order *eo, void (*cb)(void *data, E_Order *eo), void *data)
|
|
|
|
{
|
|
|
|
E_OBJECT_CHECK(eo);
|
|
|
|
E_OBJECT_TYPE_CHECK(eo, E_ORDER_TYPE);
|
|
|
|
|
|
|
|
eo->cb.update = cb;
|
|
|
|
eo->cb.data = data;
|
|
|
|
}
|
|
|
|
|
2007-03-24 16:51:46 -07:00
|
|
|
EAPI void
|
|
|
|
e_order_remove(E_Order *eo, Efreet_Desktop *desktop)
|
|
|
|
{
|
2008-10-22 04:49:33 -07:00
|
|
|
Eina_List *tmp;
|
2007-07-26 05:29:52 -07:00
|
|
|
|
2007-03-25 03:16:05 -07:00
|
|
|
E_OBJECT_CHECK(eo);
|
|
|
|
E_OBJECT_TYPE_CHECK(eo, E_ORDER_TYPE);
|
|
|
|
|
2008-10-22 04:49:33 -07:00
|
|
|
tmp = eina_list_data_find_list(eo->desktops, desktop);
|
2007-07-26 05:29:52 -07:00
|
|
|
if (!tmp) return;
|
2009-08-21 08:08:49 -07:00
|
|
|
efreet_desktop_free(eina_list_data_get(tmp));
|
2008-10-22 04:49:33 -07:00
|
|
|
eo->desktops = eina_list_remove_list(eo->desktops, tmp);
|
2007-03-24 16:51:46 -07:00
|
|
|
_e_order_save(eo);
|
|
|
|
}
|
|
|
|
|
|
|
|
EAPI void
|
|
|
|
e_order_append(E_Order *eo, Efreet_Desktop *desktop)
|
|
|
|
{
|
2007-03-25 03:16:05 -07:00
|
|
|
E_OBJECT_CHECK(eo);
|
|
|
|
E_OBJECT_TYPE_CHECK(eo, E_ORDER_TYPE);
|
|
|
|
|
2007-07-26 05:29:52 -07:00
|
|
|
efreet_desktop_ref(desktop);
|
2008-10-22 04:49:33 -07:00
|
|
|
eo->desktops = eina_list_append(eo->desktops, desktop);
|
2007-03-24 16:51:46 -07:00
|
|
|
_e_order_save(eo);
|
|
|
|
}
|
|
|
|
|
|
|
|
EAPI void
|
|
|
|
e_order_prepend_relative(E_Order *eo, Efreet_Desktop *desktop, Efreet_Desktop *before)
|
|
|
|
{
|
2007-03-25 03:16:05 -07:00
|
|
|
E_OBJECT_CHECK(eo);
|
|
|
|
E_OBJECT_TYPE_CHECK(eo, E_ORDER_TYPE);
|
|
|
|
|
2007-07-26 05:29:52 -07:00
|
|
|
efreet_desktop_ref(desktop);
|
2008-10-22 04:49:33 -07:00
|
|
|
eo->desktops = eina_list_prepend_relative(eo->desktops, desktop, before);
|
2007-03-24 16:51:46 -07:00
|
|
|
_e_order_save(eo);
|
|
|
|
}
|
|
|
|
|
|
|
|
EAPI void
|
2008-10-22 04:49:33 -07:00
|
|
|
e_order_files_append(E_Order *eo, Eina_List *files)
|
2007-03-24 16:51:46 -07:00
|
|
|
{
|
2008-10-22 04:49:33 -07:00
|
|
|
Eina_List *l;
|
2009-08-21 08:08:49 -07:00
|
|
|
const char *file;
|
2007-03-24 16:51:46 -07:00
|
|
|
|
2007-03-25 03:16:05 -07:00
|
|
|
E_OBJECT_CHECK(eo);
|
|
|
|
E_OBJECT_TYPE_CHECK(eo, E_ORDER_TYPE);
|
|
|
|
|
2009-08-21 08:08:49 -07:00
|
|
|
EINA_LIST_FOREACH(files, l, file)
|
2007-03-24 16:51:46 -07:00
|
|
|
{
|
|
|
|
Efreet_Desktop *desktop;
|
|
|
|
|
|
|
|
desktop = efreet_desktop_get(file);
|
|
|
|
if (!desktop) continue;
|
2008-10-22 04:49:33 -07:00
|
|
|
eo->desktops = eina_list_append(eo->desktops, desktop);
|
2007-03-24 16:51:46 -07:00
|
|
|
}
|
|
|
|
_e_order_save(eo);
|
|
|
|
}
|
|
|
|
|
|
|
|
EAPI void
|
2008-10-22 04:49:33 -07:00
|
|
|
e_order_files_prepend_relative(E_Order *eo, Eina_List *files, Efreet_Desktop *before)
|
2007-03-24 16:51:46 -07:00
|
|
|
{
|
2008-10-22 04:49:33 -07:00
|
|
|
Eina_List *l;
|
2009-08-21 08:08:49 -07:00
|
|
|
const char *file;
|
2007-03-24 16:51:46 -07:00
|
|
|
|
2007-03-25 03:16:05 -07:00
|
|
|
E_OBJECT_CHECK(eo);
|
|
|
|
E_OBJECT_TYPE_CHECK(eo, E_ORDER_TYPE);
|
|
|
|
|
2009-08-21 08:08:49 -07:00
|
|
|
EINA_LIST_FOREACH(files, l, file)
|
2007-03-24 16:51:46 -07:00
|
|
|
{
|
|
|
|
Efreet_Desktop *desktop;
|
|
|
|
|
|
|
|
desktop = efreet_desktop_get(file);
|
|
|
|
if (!desktop) continue;
|
2008-10-22 04:49:33 -07:00
|
|
|
eo->desktops = eina_list_prepend_relative(eo->desktops, desktop, before);
|
2007-03-24 16:51:46 -07:00
|
|
|
}
|
|
|
|
_e_order_save(eo);
|
|
|
|
}
|
|
|
|
|
2007-06-06 18:09:24 -07:00
|
|
|
EAPI void
|
|
|
|
e_order_clear(E_Order *eo)
|
|
|
|
{
|
|
|
|
E_OBJECT_CHECK(eo);
|
|
|
|
E_OBJECT_TYPE_CHECK(eo, E_ORDER_TYPE);
|
|
|
|
|
2009-08-21 08:08:49 -07:00
|
|
|
E_FREE_LIST(eo->desktops, efreet_desktop_free);
|
2007-06-06 18:09:24 -07:00
|
|
|
_e_order_save(eo);
|
|
|
|
}
|
|
|
|
|
2007-03-25 03:16:05 -07:00
|
|
|
/* local subsystem functions */
|
2007-03-24 15:02:33 -07:00
|
|
|
static void
|
|
|
|
_e_order_free(E_Order *eo)
|
|
|
|
{
|
2010-02-22 00:04:41 -08:00
|
|
|
if (eo->delay) ecore_timer_del(eo->delay);
|
2009-08-21 08:08:49 -07:00
|
|
|
E_FREE_LIST(eo->desktops, efreet_desktop_free);
|
2008-10-15 08:12:56 -07:00
|
|
|
if (eo->path) eina_stringshare_del(eo->path);
|
2007-03-24 15:02:33 -07:00
|
|
|
if (eo->monitor) ecore_file_monitor_del(eo->monitor);
|
2008-10-22 04:49:33 -07:00
|
|
|
orders = eina_list_remove(orders, eo);
|
2007-03-24 15:02:33 -07:00
|
|
|
free(eo);
|
|
|
|
}
|
|
|
|
|
2010-06-24 09:19:12 -07:00
|
|
|
static Eina_Bool
|
2010-02-22 00:04:41 -08:00
|
|
|
_e_order_cb_monitor_delay(void *data)
|
2007-03-24 15:02:33 -07:00
|
|
|
{
|
2010-02-22 00:04:41 -08:00
|
|
|
E_Order *eo = data;
|
|
|
|
|
2007-03-25 03:16:05 -07:00
|
|
|
/* It doesn't really matter what the change is, just re-read the file */
|
|
|
|
_e_order_read(eo);
|
|
|
|
if (eo->cb.update) eo->cb.update(eo->cb.data, eo);
|
2010-02-22 00:04:41 -08:00
|
|
|
eo->delay = NULL;
|
2010-06-24 09:19:12 -07:00
|
|
|
return ECORE_CALLBACK_CANCEL;
|
2010-02-22 00:04:41 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
2010-08-18 14:24:03 -07:00
|
|
|
_e_order_cb_monitor(void *data, Ecore_File_Monitor *em __UNUSED__, Ecore_File_Event event __UNUSED__, const char *path __UNUSED__)
|
2010-02-22 00:04:41 -08:00
|
|
|
{
|
|
|
|
E_Order *eo = data;
|
|
|
|
|
|
|
|
if (eo->delay) ecore_timer_del(eo->delay);
|
|
|
|
eo->delay = ecore_timer_add(0.2, _e_order_cb_monitor_delay, eo);
|
2007-03-25 03:16:05 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
_e_order_read(E_Order *eo)
|
|
|
|
{
|
|
|
|
FILE *f;
|
2007-03-30 05:14:32 -07:00
|
|
|
char *dir;
|
2007-03-25 03:16:05 -07:00
|
|
|
|
2009-08-21 08:08:49 -07:00
|
|
|
E_FREE_LIST(eo->desktops, efreet_desktop_free);
|
2007-03-25 03:16:05 -07:00
|
|
|
if (!eo->path) return;
|
|
|
|
|
2007-07-25 10:01:04 -07:00
|
|
|
dir = ecore_file_dir_get(eo->path);
|
2007-03-25 03:16:05 -07:00
|
|
|
f = fopen(eo->path, "rb");
|
|
|
|
if (f)
|
|
|
|
{
|
2007-06-17 00:38:48 -07:00
|
|
|
char buf[4096];
|
2007-03-25 03:16:05 -07:00
|
|
|
|
|
|
|
while (fgets(buf, sizeof(buf), f))
|
|
|
|
{
|
|
|
|
int len;
|
|
|
|
|
|
|
|
len = strlen(buf);
|
|
|
|
if (len > 0)
|
|
|
|
{
|
|
|
|
if (buf[len - 1] == '\n')
|
|
|
|
{
|
|
|
|
buf[len - 1] = 0;
|
|
|
|
len--;
|
|
|
|
}
|
|
|
|
if (len > 0)
|
|
|
|
{
|
2010-06-01 16:49:52 -07:00
|
|
|
Efreet_Desktop *desktop = NULL;
|
2007-03-30 05:14:32 -07:00
|
|
|
|
2007-06-10 04:50:59 -07:00
|
|
|
if (buf[0] == '/')
|
|
|
|
desktop = efreet_desktop_get(buf);
|
2007-03-30 05:14:32 -07:00
|
|
|
if (!desktop)
|
2007-07-25 10:01:04 -07:00
|
|
|
desktop = efreet_desktop_get(ecore_file_file_get(buf));
|
2007-03-30 05:14:32 -07:00
|
|
|
if (!desktop)
|
2010-03-27 13:53:30 -07:00
|
|
|
desktop = efreet_util_desktop_file_id_find(ecore_file_file_get(buf));
|
2010-04-20 11:48:42 -07:00
|
|
|
if (desktop)
|
|
|
|
eo->desktops = eina_list_append(eo->desktops, desktop);
|
2007-03-25 03:16:05 -07:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
fclose(f);
|
|
|
|
}
|
2007-03-30 05:14:32 -07:00
|
|
|
if (dir) free(dir);
|
2007-03-24 15:02:33 -07:00
|
|
|
}
|
2007-03-24 16:41:24 -07:00
|
|
|
|
|
|
|
static void
|
|
|
|
_e_order_save(E_Order *eo)
|
|
|
|
{
|
|
|
|
FILE *f;
|
2008-10-22 04:49:33 -07:00
|
|
|
Eina_List *l;
|
2009-08-21 08:08:49 -07:00
|
|
|
Efreet_Desktop *desktop;
|
2007-03-24 16:41:24 -07:00
|
|
|
|
2007-04-05 16:28:34 -07:00
|
|
|
if (!eo->path) return;
|
2007-03-24 16:41:24 -07:00
|
|
|
f = fopen(eo->path, "wb");
|
|
|
|
if (!f) return;
|
|
|
|
|
2009-08-21 08:08:49 -07:00
|
|
|
EINA_LIST_FOREACH(eo->desktops, l, desktop)
|
2007-03-24 16:41:24 -07:00
|
|
|
{
|
2007-03-25 06:12:23 -07:00
|
|
|
const char *id;
|
2007-03-24 16:41:24 -07:00
|
|
|
|
2007-03-25 03:52:00 -07:00
|
|
|
id = efreet_util_path_to_file_id(desktop->orig_path);
|
2007-04-06 04:41:23 -07:00
|
|
|
if (id)
|
2010-04-20 11:48:42 -07:00
|
|
|
fprintf(f, "%s\n", id);
|
2007-04-06 04:41:23 -07:00
|
|
|
else
|
2010-04-20 11:48:42 -07:00
|
|
|
fprintf(f, "%s\n", desktop->orig_path);
|
2007-03-24 16:41:24 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
fclose(f);
|
|
|
|
}
|
2007-04-06 04:21:34 -07:00
|
|
|
|
2010-06-24 09:19:12 -07:00
|
|
|
static Eina_Bool
|
2011-08-16 05:46:47 -07:00
|
|
|
_e_order_cb_efreet_cache_update(void *data __UNUSED__, int ev_type __UNUSED__, void *event)
|
2007-04-06 04:21:34 -07:00
|
|
|
{
|
2011-08-16 05:46:47 -07:00
|
|
|
Efreet_Event_Cache_Update *ev = event;
|
2008-10-22 04:49:33 -07:00
|
|
|
Eina_List *l;
|
2009-08-21 08:08:49 -07:00
|
|
|
E_Order *eo;
|
2007-04-06 04:21:34 -07:00
|
|
|
|
2011-08-16 05:46:47 -07:00
|
|
|
if (!ev->changed) return ECORE_CALLBACK_PASS_ON;
|
|
|
|
|
2010-03-25 22:34:34 -07:00
|
|
|
/* reread all .order files */
|
|
|
|
EINA_LIST_FOREACH(orders, l, eo)
|
2007-04-06 04:21:34 -07:00
|
|
|
{
|
2010-03-25 22:34:34 -07:00
|
|
|
_e_order_read(eo);
|
|
|
|
if (eo->cb.update) eo->cb.update(eo->cb.data, eo);
|
2007-04-06 04:21:34 -07:00
|
|
|
}
|
2010-06-24 09:19:12 -07:00
|
|
|
return ECORE_CALLBACK_PASS_ON;
|
2007-04-06 04:21:34 -07:00
|
|
|
}
|