From 0a8ffffa5f7a87984e8b7894717cd13eb8f9f845 Mon Sep 17 00:00:00 2001 From: Carsten Haitzler Date: Mon, 19 May 2008 04:37:34 +0000 Subject: [PATCH] add in gadman for desktop. happy dave! :) SVN revision: 34610 --- configure.in | 2 + data/themes/default_gadman.edc | 205 +++++ src/bin/e_bindings.c | 16 + src/bin/e_bindings.h | 1 + src/bin/e_config.c | 107 +-- src/bin/e_config.h | 4 +- src/bin/e_gadcon.c | 68 +- src/bin/e_gadcon.h | 7 +- src/bin/e_gadcon_popup.c | 11 + src/bin/e_module.c | 43 +- src/bin/e_module.h | 1 + src/bin/e_shelf.c | 4 +- src/bin/e_toolbar.c | 4 +- src/modules/Makefile.am | 1 + src/modules/gadman/Makefile.am | 31 + src/modules/gadman/e-module-gadman.edj | Bin 0 -> 10689 bytes src/modules/gadman/e_mod_config.c | 176 ++++ src/modules/gadman/e_mod_config.h | 9 + src/modules/gadman/e_mod_gadman.c | 1014 ++++++++++++++++++++++++ src/modules/gadman/e_mod_gadman.h | 49 ++ src/modules/gadman/e_mod_main.c | 123 +++ src/modules/gadman/e_mod_main.h | 10 + src/modules/gadman/module.desktop.in | 6 + 23 files changed, 1801 insertions(+), 91 deletions(-) create mode 100644 src/modules/gadman/Makefile.am create mode 100644 src/modules/gadman/e-module-gadman.edj create mode 100644 src/modules/gadman/e_mod_config.c create mode 100644 src/modules/gadman/e_mod_config.h create mode 100644 src/modules/gadman/e_mod_gadman.c create mode 100644 src/modules/gadman/e_mod_gadman.h create mode 100644 src/modules/gadman/e_mod_main.c create mode 100644 src/modules/gadman/e_mod_main.h create mode 100644 src/modules/gadman/module.desktop.in diff --git a/configure.in b/configure.in index c5e979b30..8e9fca779 100644 --- a/configure.in +++ b/configure.in @@ -373,6 +373,8 @@ src/modules/conf_mime/Makefile src/modules/conf_mime/module.desktop src/modules/conf_interaction/Makefile src/modules/conf_interaction/module.desktop +src/modules/gadman/Makefile +src/modules/gadman/module.desktop src/preload/Makefile data/Makefile data/fonts/Makefile diff --git a/data/themes/default_gadman.edc b/data/themes/default_gadman.edc index f2c4aafb2..0616869ff 100644 --- a/data/themes/default_gadman.edc +++ b/data/themes/default_gadman.edc @@ -1426,3 +1426,208 @@ group { } } } + +group { + name: "e/gadman/full_bg"; + parts { + part{ + name: "bg"; + type: RECT; + mouse_events: 1; + description { + state: "default" 0.0; + color: 255 255 255 200; + } + description { + state: "hidden" 0.0; + color: 255 255 255 0; + } + } + } + programs { + program { + name: "hide"; + signal: "e,state,visibility,hide"; + source: "e"; + action: STATE_SET "hidden" 0.0; + transition: LINEAR 0.4; + target: "bg"; + } + program { + name: "show"; + signal: "e,state,visibility,show"; + source: "e"; + action: STATE_SET "default" 0.0; + transition: LINEAR 0.4; + target: "bg"; + } + } +} + +group { + name: "e/gadman/frame"; + parts { + part{ + name: "bg_clip"; + type: RECT; + mouse_events: 0; + description { + state: "default" 0.0; + color: 255 255 255 255; + rel1 { + to: "overlay"; + } + rel2 { + to: "overlay"; + } + } + description { + state: "plain" 0.0; + color: 255 255 255 255; + rel1 { + relative: 0.0 0.0; + } + rel2 { + relative: 0.0 0.0; + } + } + } + part { + name: "background"; + mouse_events: 1; + clip_to: "bg_clip"; + description { + state: "default" 0.0; + rel1 { + to: "overlay"; + } + rel2 { + to: "overlay"; + } + image { + normal: "e17_ibar_bg_h.png"; + border: 6 6 6 6; + } + fill { + smooth: 0; + } + } + description { + state: "hidden" 0.0; + inherit: "default" 0.0; + color: 255 255 255 0; + } + } + part { + name: "items_clip"; + type: RECT; + mouse_events: 0; + description { + state: "default" 0.0; + rel1 { + to: "background"; + offset: 4 4; + } + rel2 { + to: "background"; + offset: -5 -5; + } + color: 255 255 255 255; + } + description { + state: "hidden" 0.0; + inherit: "default" 0.0; + color: 255 255 255 0; + } + } + part { + name: "e.swallow.content"; + type: SWALLOW; + clip_to: "items_clip"; + description { + state: "default" 0.0; + rel1 { + offset: 4 4; + } + rel2 { + offset: -5 -5; + } + } + description { + state: "hidden" 0.0; + color: 255 255 255 0; + rel1 { + relative: 0.5 0.5; + } + rel2 { + relative: 0.5 0.5; + } + } + } + part { + name: "overlay"; + mouse_events: 0; + clip_to: "bg_clip"; + description { + state: "default" 0.0; + image { + normal: "e17_ibar_over_h.png"; + border: 13 13 13 13; + middle: 0; + } + fill { + smooth: 0; + } + } + description { + state: "hidden" 0.0; + inherit: "default" 0.0; + color: 255 255 255 0; + rel1 { + relative: 0.5 0.5; + } + rel2 { + relative: 0.5 0.5; + } + } + } + } + programs { + program { + name: "inset"; + signal: "e,state,visibility,inset"; + source: "e"; + action: STATE_SET "default" 0.0; + target: "bg_clip"; + } + program { + name: "plain"; + signal: "e,state,visibility,plain"; + source: "e"; + action: STATE_SET "plain" 0.0; + target: "bg_clip"; + } + program { + name: "hide"; + signal: "e,state,visibility,hide"; + source: "e"; + action: STATE_SET "hidden" 0.0; + transition: ACCELERATE 0.4; + target: "items_clip"; + target: "background"; + target: "overlay"; + target: "e.swallow.content"; + } + program { + name: "show"; + signal: "e,state,visibility,show"; + source: "e"; + action: STATE_SET "default" 0.0; + transition: DECELERATE 0.4; + target: "items_clip"; + target: "background"; + target: "overlay"; + target: "e.swallow.content"; + } + } +} diff --git a/src/bin/e_bindings.c b/src/bin/e_bindings.c index 69e490a12..7103b69cd 100644 --- a/src/bin/e_bindings.c +++ b/src/bin/e_bindings.c @@ -324,6 +324,22 @@ e_bindings_key_add(E_Binding_Context ctxt, const char *key, E_Binding_Modifier m key_bindings = evas_list_append(key_bindings, bind); } +EAPI E_Binding_Key * +e_bindings_key_get(const char *action) +{ + Evas_List *l; + + for (l = key_bindings; l; l = l->next) + { + E_Binding_Key *bind; + + bind = l->data; + if (bind->action && action && !strcmp(action, bind->action)) + return bind; + } + return NULL; +} + EAPI void e_bindings_key_del(E_Binding_Context ctxt, const char *key, E_Binding_Modifier mod, int any_mod, const char *action, const char *params) { diff --git a/src/bin/e_bindings.h b/src/bin/e_bindings.h index 5a44bf9a9..5428b9713 100644 --- a/src/bin/e_bindings.h +++ b/src/bin/e_bindings.h @@ -95,6 +95,7 @@ EAPI E_Action *e_bindings_mouse_up_event_handle(E_Binding_Context ctxt, E_Obje EAPI void e_bindings_key_add(E_Binding_Context ctxt, const char *key, E_Binding_Modifier mod, int any_mod, const char *action, const char *params); EAPI void e_bindings_key_del(E_Binding_Context ctxt, const char *key, E_Binding_Modifier mod, int any_mod, const char *action, const char *params); +EAPI E_Binding_Key *e_bindings_key_get(const char *action); EAPI void e_bindings_key_grab(E_Binding_Context ctxt, Ecore_X_Window win); EAPI void e_bindings_key_ungrab(E_Binding_Context ctxt, Ecore_X_Window win); EAPI E_Action *e_bindings_key_down_event_handle(E_Binding_Context ctxt, E_Object *obj, Ecore_X_Event_Key_Down *ev); diff --git a/src/bin/e_config.c b/src/bin/e_config.c index cc1a06000..d85e4bea6 100644 --- a/src/bin/e_config.c +++ b/src/bin/e_config.c @@ -96,6 +96,10 @@ e_config_init(void) E_CONFIG_VAL(D, T, geom.pos, INT); E_CONFIG_VAL(D, T, geom.size, INT); E_CONFIG_VAL(D, T, geom.res, INT); + E_CONFIG_VAL(D, T, geom.pos_x, DOUBLE); + E_CONFIG_VAL(D, T, geom.pos_y, DOUBLE); + E_CONFIG_VAL(D, T, geom.size_w, DOUBLE); + E_CONFIG_VAL(D, T, geom.size_h, DOUBLE); E_CONFIG_VAL(D, T, state_info.seq, INT); E_CONFIG_VAL(D, T, state_info.flags, INT); E_CONFIG_VAL(D, T, style, STR); @@ -188,6 +192,7 @@ e_config_init(void) E_CONFIG_VAL(D, T, name, STR); E_CONFIG_VAL(D, T, enabled, UCHAR); E_CONFIG_VAL(D, T, delayed, UCHAR); + E_CONFIG_VAL(D, T, priority, INT); _e_config_font_default_edd = E_CONFIG_DD_NEW("E_Font_Default", E_Font_Default); @@ -761,62 +766,64 @@ e_config_init(void) { E_Config_Module *em; -#define CFG_MODULE(_name, _enabled, _delayed) \ +#define CFG_MODULE(_name, _enabled, _delayed, _priority) \ em = E_NEW(E_Config_Module, 1); \ em->name = evas_stringshare_add(_name); \ em->enabled = _enabled; \ em->delayed = _delayed; \ + em->priority = _priority; \ e_config->modules = evas_list_append(e_config->modules, em) - CFG_MODULE("start", 1, 0); - CFG_MODULE("ibar", 1, 0); - CFG_MODULE("ibox", 1, 0); - CFG_MODULE("dropshadow", 1, 0); - CFG_MODULE("clock", 1, 0); - CFG_MODULE("battery", 1, 0); - CFG_MODULE("cpufreq", 1, 0); - CFG_MODULE("temperature", 1, 0); - CFG_MODULE("pager", 1, 0); - CFG_MODULE("exebuf", 1, 1); - CFG_MODULE("winlist", 1, 1); - CFG_MODULE("conf", 1, 1); - CFG_MODULE("conf_applications", 1, 1); - CFG_MODULE("conf_borders", 1, 1); - CFG_MODULE("conf_clientlist", 1, 1); - CFG_MODULE("conf_colors", 1, 1); - CFG_MODULE("conf_desk", 1, 1); - CFG_MODULE("conf_desklock", 1, 1); - CFG_MODULE("conf_desks", 1, 1); - CFG_MODULE("conf_dialogs", 1, 1); - CFG_MODULE("conf_display", 1, 1); - CFG_MODULE("conf_dpms", 1, 1); - CFG_MODULE("conf_exebuf", 1, 1); - CFG_MODULE("conf_fonts", 1, 1); - CFG_MODULE("conf_icon_theme", 1, 1); - CFG_MODULE("conf_imc", 1, 1); - CFG_MODULE("conf_intl", 1, 1); - CFG_MODULE("conf_keybindings", 1, 1); - CFG_MODULE("conf_menus", 1, 1); - CFG_MODULE("conf_mime", 1, 1); - CFG_MODULE("conf_mouse", 1, 1); - CFG_MODULE("conf_mousebindings", 1, 1); - CFG_MODULE("conf_mouse_cursor", 1, 1); - CFG_MODULE("conf_paths", 1, 1); - CFG_MODULE("conf_performance", 1, 1); - CFG_MODULE("conf_profiles", 1, 1); - CFG_MODULE("conf_screensaver", 1, 1); - CFG_MODULE("conf_shelves", 1, 1); - CFG_MODULE("conf_startup", 1, 1); - CFG_MODULE("conf_theme", 1, 1); - CFG_MODULE("conf_transitions", 1, 1); - CFG_MODULE("conf_wallpaper", 1, 1); - CFG_MODULE("conf_window_display", 1, 1); - CFG_MODULE("conf_window_focus", 1, 1); - CFG_MODULE("conf_window_manipulation", 1, 1); - CFG_MODULE("conf_winlist", 1, 1); - CFG_MODULE("conf_engine", 1, 1); - CFG_MODULE("fileman", 1, 1); - CFG_MODULE("conf_interaction", 1, 1); + CFG_MODULE("start", 1, 0, 0); + CFG_MODULE("ibar", 1, 0, 0); + CFG_MODULE("ibox", 1, 0, 0); + CFG_MODULE("dropshadow", 1, 0, 0); + CFG_MODULE("clock", 1, 0, 0); + CFG_MODULE("battery", 1, 0, 0); + CFG_MODULE("cpufreq", 1, 0, 0); + CFG_MODULE("temperature", 1, 0, 0); + CFG_MODULE("gadman", 1, 0, -100); + CFG_MODULE("pager", 1, 0, 0); + CFG_MODULE("exebuf", 1, 1, 0); + CFG_MODULE("winlist", 1, 1, 0); + CFG_MODULE("conf", 1, 1, 0); + CFG_MODULE("conf_applications", 1, 1, 0); + CFG_MODULE("conf_borders", 1, 1, 0); + CFG_MODULE("conf_clientlist", 1, 1, 0); + CFG_MODULE("conf_colors", 1, 1, 0); + CFG_MODULE("conf_desk", 1, 1, 0); + CFG_MODULE("conf_desklock", 1, 1, 0); + CFG_MODULE("conf_desks", 1, 1, 0); + CFG_MODULE("conf_dialogs", 1, 1, 0); + CFG_MODULE("conf_display", 1, 1, 0); + CFG_MODULE("conf_dpms", 1, 1, 0); + CFG_MODULE("conf_exebuf", 1, 1, 0); + CFG_MODULE("conf_fonts", 1, 1, 0); + CFG_MODULE("conf_icon_theme", 1, 1, 0); + CFG_MODULE("conf_imc", 1, 1, 0); + CFG_MODULE("conf_intl", 1, 1, 0); + CFG_MODULE("conf_keybindings", 1, 1, 0); + CFG_MODULE("conf_menus", 1, 1, 0); + CFG_MODULE("conf_mime", 1, 1, 0); + CFG_MODULE("conf_mouse", 1, 1, 0); + CFG_MODULE("conf_mousebindings", 1, 1, 0); + CFG_MODULE("conf_mouse_cursor", 1, 1, 0); + CFG_MODULE("conf_paths", 1, 1, 0); + CFG_MODULE("conf_performance", 1, 1, 0); + CFG_MODULE("conf_profiles", 1, 1, 0); + CFG_MODULE("conf_screensaver", 1, 1, 0); + CFG_MODULE("conf_shelves", 1, 1, 0); + CFG_MODULE("conf_startup", 1, 1, 0); + CFG_MODULE("conf_theme", 1, 1, 0); + CFG_MODULE("conf_transitions", 1, 1, 0); + CFG_MODULE("conf_wallpaper", 1, 1, 0); + CFG_MODULE("conf_window_display", 1, 1, 0); + CFG_MODULE("conf_window_focus", 1, 1, 0); + CFG_MODULE("conf_window_manipulation", 1, 1, 0); + CFG_MODULE("conf_winlist", 1, 1, 0); + CFG_MODULE("conf_engine", 1, 1, 0); + CFG_MODULE("fileman", 1, 1, 0); + CFG_MODULE("conf_interaction", 1, 1, 0); } #if 0 { diff --git a/src/bin/e_config.h b/src/bin/e_config.h index 24af5a9d7..c8edfcd03 100644 --- a/src/bin/e_config.h +++ b/src/bin/e_config.h @@ -293,6 +293,7 @@ struct _E_Config_Module const char *name; unsigned char enabled; unsigned char delayed; + int priority; }; struct _E_Config_Theme @@ -373,7 +374,8 @@ struct _E_Config_Gadcon_Client const char *name; const char *id; struct { - int pos, size, res; + int pos, size, res; //gadcon + double pos_x, pos_y, size_w, size_h; //gadman } geom; struct { int seq, flags; diff --git a/src/bin/e_gadcon.c b/src/bin/e_gadcon.c index 15f513d2a..b4c0a4edf 100644 --- a/src/bin/e_gadcon.c +++ b/src/bin/e_gadcon.c @@ -654,7 +654,7 @@ e_gadcon_canvas_zone_geometry_get(E_Gadcon *gc, int *x, int *y, int *w, int *h) EAPI void e_gadcon_util_menu_attach_func_set(E_Gadcon *gc, - void (*func) (void *data, E_Menu *menu), + void (*func) (void *data, E_Gadcon_Client *gcc, E_Menu *menu), void *data) { E_OBJECT_CHECK(gc); @@ -1187,7 +1187,7 @@ e_gadcon_client_util_menu_items_append(E_Gadcon_Client *gcc, E_Menu *menu, int f gcc->menu = menu; */ - if (!gcc->gadcon->toolbar) + if (gcc->gadcon->shelf) { mn = e_menu_new(); mi = e_menu_item_new(mn); @@ -1214,42 +1214,44 @@ e_gadcon_client_util_menu_items_append(E_Gadcon_Client *gcc, E_Menu *menu, int f e_menu_item_submenu_set(mi, mn); e_object_del(E_OBJECT(mn)); } - mi = e_menu_item_new(menu); - e_menu_item_label_set(mi, _("Automatically scroll contents")); - e_util_menu_item_edje_icon_set(mi, "enlightenment/autoscroll"); - e_menu_item_check_set(mi, 1); - if (gcc->autoscroll) e_menu_item_toggle_set(mi, 1); - e_menu_item_callback_set(mi, _e_gadcon_client_cb_menu_autoscroll, gcc); - - mi = e_menu_item_new(menu); - e_menu_item_label_set(mi, _("Able to be resized")); - e_util_menu_item_edje_icon_set(mi, "enlightenment/resizable"); - e_menu_item_check_set(mi, 1); - if (gcc->resizable) e_menu_item_toggle_set(mi, 1); - e_menu_item_callback_set(mi, _e_gadcon_client_cb_menu_resizable, gcc); - - mi = e_menu_item_new(menu); - e_menu_item_separator_set(mi, 1); - - if (!gcc->o_control) + if (gcc->gadcon->shelf || gcc->gadcon->toolbar) { mi = e_menu_item_new(menu); - e_menu_item_label_set(mi, _("Begin move/resize this gadget")); - e_util_menu_item_edje_icon_set(mi, "enlightenment/edit"); - e_menu_item_callback_set(mi, _e_gadcon_client_cb_menu_edit, gcc); + e_menu_item_label_set(mi, _("Automatically scroll contents")); + e_util_menu_item_edje_icon_set(mi, "enlightenment/autoscroll"); + e_menu_item_check_set(mi, 1); + if (gcc->autoscroll) e_menu_item_toggle_set(mi, 1); + e_menu_item_callback_set(mi, _e_gadcon_client_cb_menu_autoscroll, gcc); + + mi = e_menu_item_new(menu); + e_menu_item_label_set(mi, _("Able to be resized")); + e_util_menu_item_edje_icon_set(mi, "enlightenment/resizable"); + e_menu_item_check_set(mi, 1); + if (gcc->resizable) e_menu_item_toggle_set(mi, 1); + e_menu_item_callback_set(mi, _e_gadcon_client_cb_menu_resizable, gcc); + + mi = e_menu_item_new(menu); + e_menu_item_separator_set(mi, 1); + + if (!gcc->o_control) + { + mi = e_menu_item_new(menu); + e_menu_item_label_set(mi, _("Begin move/resize this gadget")); + e_util_menu_item_edje_icon_set(mi, "enlightenment/edit"); + e_menu_item_callback_set(mi, _e_gadcon_client_cb_menu_edit, gcc); + } + + mi = e_menu_item_new(menu); + e_menu_item_label_set(mi, _("Remove this gadget")); + e_util_menu_item_edje_icon_set(mi, "enlightenment/remove"); + e_menu_item_callback_set(mi, _e_gadcon_client_cb_menu_remove, gcc); } - - mi = e_menu_item_new(menu); - e_menu_item_label_set(mi, _("Remove this gadget")); - e_util_menu_item_edje_icon_set(mi, "enlightenment/remove"); - e_menu_item_callback_set(mi, _e_gadcon_client_cb_menu_remove, gcc); - if (gcc->gadcon->menu_attach.func) { mi = e_menu_item_new(menu); e_menu_item_separator_set(mi, 1); - gcc->gadcon->menu_attach.func(gcc->gadcon->menu_attach.data, menu); + gcc->gadcon->menu_attach.func(gcc->gadcon->menu_attach.data, gcc, menu); } } @@ -1454,6 +1456,10 @@ _e_gadcon_client_save(E_Gadcon_Client *gcc) gcc->cf->geom.pos = gcc->config.pos; gcc->cf->geom.size = gcc->config.size; gcc->cf->geom.res = gcc->config.res; + gcc->cf->geom.pos_x = gcc->config.pos_x; + gcc->cf->geom.pos_y = gcc->config.pos_y; + gcc->cf->geom.size_w = gcc->config.size_w; + gcc->cf->geom.size_h = gcc->config.size_h; gcc->cf->state_info.seq = gcc->state_info.seq; gcc->cf->state_info.flags = gcc->state_info.flags; gcc->cf->autoscroll = gcc->autoscroll; @@ -1652,7 +1658,7 @@ _e_gadcon_cb_client_mouse_down(void *data, Evas *evas, Evas_Object *obj, void *e mi = e_menu_item_new(mn); e_menu_item_separator_set(mi, 1); - gcc->gadcon->menu_attach.func(gcc->gadcon->menu_attach.data, mn); + gcc->gadcon->menu_attach.func(gcc->gadcon->menu_attach.data, gcc, mn); } if (gcc->gadcon->toolbar) diff --git a/src/bin/e_gadcon.h b/src/bin/e_gadcon.h index 2083a1cf4..18e5b05a7 100644 --- a/src/bin/e_gadcon.h +++ b/src/bin/e_gadcon.h @@ -80,7 +80,7 @@ struct _E_Gadcon } frame_request; struct { - void (*func) (void *data, E_Menu *menu); + void (*func) (void *data, E_Gadcon_Client *gcc, E_Menu *menu); void *data; } menu_attach; @@ -135,7 +135,8 @@ struct _E_Gadcon_Client void *data; struct { - int pos, size, res; + int pos, size, res; //gadcon + double pos_x, pos_y, size_w, size_h; //gadman } config; struct @@ -203,7 +204,7 @@ EAPI void e_gadcon_zone_set(E_Gadcon *gc, E_Zone *zone); EAPI E_Zone *e_gadcon_zone_get(E_Gadcon *gc); EAPI void e_gadcon_ecore_evas_set(E_Gadcon *gc, Ecore_Evas *ee); EAPI int e_gadcon_canvas_zone_geometry_get(E_Gadcon *gc, int *x, int *y, int *w, int *h); -EAPI void e_gadcon_util_menu_attach_func_set(E_Gadcon *gc, void (*func) (void *data, E_Menu *menu), void *data); +EAPI void e_gadcon_util_menu_attach_func_set(E_Gadcon *gc, void (*func) (void *data, E_Gadcon_Client *gcc, E_Menu *menu), void *data); EAPI void e_gadcon_dnd_window_set(E_Gadcon *gc, Ecore_X_Window win); EAPI Ecore_X_Window e_gadcon_dnd_window_get(E_Gadcon *gc); EAPI void e_gadcon_shelf_set(E_Gadcon *gc, E_Shelf *shelf); diff --git a/src/bin/e_gadcon_popup.c b/src/bin/e_gadcon_popup.c index f0913dfc4..bf45783e1 100644 --- a/src/bin/e_gadcon_popup.c +++ b/src/bin/e_gadcon_popup.c @@ -133,6 +133,17 @@ e_gadcon_popup_show(E_Gadcon_Popup *pop) else if (px < zx) px = zx; break; + case E_GADCON_ORIENT_FLOAT: + px = (gx + (gw / 2)) - (pop->w / 2); + if (gy >= zh / 2) + py = gy - pop->h; + else + py = gy + gh; + if (px + pop->w >= zw) + px = zw - pop->w; + else if (px < zx) + px = zx; + break; default: e_popup_move_resize(pop->win, 50, 50, pop->w, pop->h); return; diff --git a/src/bin/e_module.c b/src/bin/e_module.c index db6981945..1f0b2e527 100644 --- a/src/bin/e_module.c +++ b/src/bin/e_module.c @@ -16,6 +16,7 @@ static void _e_module_dialog_disable_show(const char *title, const char *body, E static void _e_module_cb_dialog_disable(void *data, E_Dialog *dia); static void _e_module_event_update_free(void *data, void *event); static int _e_module_cb_idler(void *data); +static int _e_module_sort_priority(void *d1, void *d2); /* local subsystem globals */ static Evas_List *_e_modules = NULL; @@ -43,7 +44,8 @@ e_module_shutdown(void) */ VALGRIND_DO_LEAK_CHECK #endif - + + _e_modules = evas_list_reverse(_e_modules); for (l = _e_modules; l; l = l->next) { E_Module *m; @@ -70,7 +72,9 @@ EAPI void e_module_all_load(void) { Evas_List *l; - + e_config->modules = evas_list_sort(e_config->modules, + evas_list_count(e_config->modules), + _e_module_sort_priority); for (l = e_config->modules; l; l = l->next) { E_Config_Module *em; @@ -445,6 +449,31 @@ e_module_delayed_set(E_Module *m, int delayed) } } +EAPI void +e_module_priority_set(E_Module *m, int priority) +{ + /* Set the loading order for a module. + More priority means load earlier */ + Evas_List *l; + + for (l = e_config->modules; l; l = l->next) + { + E_Config_Module *em; + + em = l->data; + if (!em) continue; + if (!e_util_strcmp(m->name, em->name)) + { + if (em->priority != priority) + { + em->priority = priority; + e_config_save_queue(); + } + break; + } + } +} + /* local subsystem functions */ static void @@ -542,3 +571,13 @@ _e_module_cb_idler(void *data) _e_module_idler = NULL; return 0; } + +static int +_e_module_sort_priority(void *d1, void *d2) +{ + E_Config_Module *m1, *m2; + + m1 = d1; + m2 = d2; + return (m2->priority - m1->priority); +} diff --git a/src/bin/e_module.h b/src/bin/e_module.h index 7728d4ed2..d2d4f3532 100644 --- a/src/bin/e_module.h +++ b/src/bin/e_module.h @@ -68,6 +68,7 @@ EAPI E_Module *e_module_find(const char *name); EAPI Evas_List *e_module_list(void); EAPI void e_module_dialog_show(E_Module *m, const char *title, const char *body); EAPI void e_module_delayed_set(E_Module *m, int delayed); +EAPI void e_module_priority_set(E_Module *m, int priority); #endif #endif diff --git a/src/bin/e_shelf.c b/src/bin/e_shelf.c index f333f16b1..de027350f 100644 --- a/src/bin/e_shelf.c +++ b/src/bin/e_shelf.c @@ -15,7 +15,7 @@ static void _e_shelf_cb_menu_contents(void *data, E_Menu *m, E_Menu_Item *mi); static void _e_shelf_cb_confirm_dialog_yes(void *data); static void _e_shelf_cb_menu_delete(void *data, E_Menu *m, E_Menu_Item *mi); static void _e_shelf_menu_append(E_Shelf *es, E_Menu *mn); -static void _e_shelf_cb_menu_items_append(void *data, E_Menu *mn); +static void _e_shelf_cb_menu_items_append(void *data, E_Gadcon_Client *gcc, E_Menu *mn); static void _e_shelf_cb_mouse_down(void *data, Evas *evas, Evas_Object *obj, void *event_info); static int _e_shelf_cb_mouse_in(void *data, int type, void *event); static int _e_shelf_cb_mouse_out(void *data, int type, void *event); @@ -1079,7 +1079,7 @@ _e_shelf_menu_append(E_Shelf *es, E_Menu *mn) } static void -_e_shelf_cb_menu_items_append(void *data, E_Menu *mn) +_e_shelf_cb_menu_items_append(void *data, E_Gadcon_Client *gcc, E_Menu *mn) { E_Shelf *es; diff --git a/src/bin/e_toolbar.c b/src/bin/e_toolbar.c index 70f1ac12b..141e28845 100644 --- a/src/bin/e_toolbar.c +++ b/src/bin/e_toolbar.c @@ -18,7 +18,7 @@ static void _e_toolbar_fm2_dir_deleted(void *data, Evas_Object *obj, void *event static void _e_toolbar_fm2_files_deleted(void *data, Evas_Object *obj, void *event_info); static void _e_toolbar_fm2_selected(void *data, Evas_Object *obj, void *event_info); static void _e_toolbar_fm2_selection_changed(void *data, Evas_Object *obj, void *event_info); -static void _e_toolbar_menu_items_append(void *data, E_Menu *mn); +static void _e_toolbar_menu_items_append(void *data, E_Gadcon_Client *gcc, E_Menu *mn); /* local vars */ static Evas_List *toolbars = NULL; @@ -336,7 +336,7 @@ _e_toolbar_menu_cb_pre(void *data, E_Menu *mn) } static void -_e_toolbar_menu_items_append(void *data, E_Menu *mn) +_e_toolbar_menu_items_append(void *data, E_Gadcon_Client *gcc, E_Menu *mn) { E_Toolbar *tbar; diff --git a/src/modules/Makefile.am b/src/modules/Makefile.am index 9cf4f368c..bd756b9f1 100644 --- a/src/modules/Makefile.am +++ b/src/modules/Makefile.am @@ -50,6 +50,7 @@ conf_exebuf \ conf_paths \ conf_mime \ conf_interaction \ +gadman \ conf_window_remembers if HAVE_TEMPERATURE diff --git a/src/modules/gadman/Makefile.am b/src/modules/gadman/Makefile.am new file mode 100644 index 000000000..6b17b9169 --- /dev/null +++ b/src/modules/gadman/Makefile.am @@ -0,0 +1,31 @@ +MAINTAINERCLEANFILES = Makefile.in +MODULE = gadman + +# data files for the module +filesdir = $(libdir)/enlightenment/modules/$(MODULE) +files_DATA = e-module-gadman.edj module.desktop + +EXTRA_DIST = $(files_DATA) + +# the module .so file +INCLUDES = -I. \ + -I$(top_srcdir) \ + -I$(top_srcdir)/src/modules/$(MODULE) \ + -I$(top_srcdir)/src/bin \ + -I$(top_srcdir)/src/lib \ + -I$(top_srcdir)/src/modules \ + @e_cflags@ +pkgdir = $(libdir)/enlightenment/modules/$(MODULE)/$(MODULE_ARCH) +pkg_LTLIBRARIES = module.la +module_la_SOURCES = e_mod_main.c \ + e_mod_main.h \ + e_mod_config.c \ + e_mod_config.h \ + e_mod_gadman.c \ + e_mod_gadman.h +module_la_LIBADD = @e_libs@ @dlopen_libs@ +module_la_LDFLAGS = -module -avoid-version +module_la_DEPENDENCIES = $(top_builddir)/config.h + +uninstall: + rm -rf $(DESTDIR)$(libdir)/enlightenment/modules/$(MODULE) diff --git a/src/modules/gadman/e-module-gadman.edj b/src/modules/gadman/e-module-gadman.edj new file mode 100644 index 0000000000000000000000000000000000000000..e540cd3e1ef11d18e2f32f33257f9a77d782bd4c GIT binary patch literal 10689 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 wHzCGes#1_m^US(WQVcbL# +#include "e_mod_main.h" +#include "e_mod_gadman.h" +#include "e_mod_config.h" +#include "config.h" + + +struct _E_Config_Dialog_Data +{ + Evas_Object *o_avail; //List of available gadgets + Evas_Object *o_add; //Add button +}; + + +/* Local protos */ +static void *_create_data(E_Config_Dialog *cfd); +static void _free_data(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata); +static Evas_Object *_basic_create_widgets(E_Config_Dialog *cfd, Evas *evas, E_Config_Dialog_Data *cfdata); +static int _basic_apply_data(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata); +static void _fill_gadgets_list(Evas_Object *ilist); +static void _cb_add(void *data, void *data2); +static void _avail_list_cb_change(void *data, Evas_Object *obj); + + +EAPI E_Config_Dialog * +e_int_config_gadman_module(E_Container *con, const char *params __UNUSED__) +{ + E_Config_Dialog *cfd; + E_Config_Dialog_View *v; + char buf[4096]; + + /* check if config dialog exists ... */ + if (e_config_dialog_find("E", "_e_modules_gadman_config_dialog")) + return NULL; + + /* ... else create it */ + v = E_NEW(E_Config_Dialog_View, 1); + v->create_cfdata = _create_data; + v->free_cfdata = _free_data; + v->basic.apply_cfdata = _basic_apply_data; + v->basic.create_widgets = _basic_create_widgets; + v->advanced.apply_cfdata = NULL; + v->advanced.create_widgets = NULL; + v->override_auto_apply = 0; //TODO this should remove the ok/apply buttons ... but doesnt work :( + + snprintf(buf, sizeof(buf), "%s/e-module-gadman.edj", + Man->module->dir); + cfd = e_config_dialog_new(con, _("Gadgets Manager"), + "E", "_e_modules_gadman_config_dialog", + buf, 0, v, Man); + + Man->config_dialog = cfd; + + return Man->config_dialog; +} + +static void * +_create_data(E_Config_Dialog *cfd) +{ + E_Config_Dialog_Data *cfdata; + cfdata = E_NEW(E_Config_Dialog_Data, 1); + return cfdata; +} + +static void +_free_data(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata) +{ + Man->config_dialog = NULL; + free(cfdata); + cfdata = NULL; +} + +static Evas_Object * +_basic_create_widgets(E_Config_Dialog *cfd, Evas *evas, E_Config_Dialog_Data *cfdata) +{ + Evas_Object *o, *of, *ob, *ol; + + o = e_widget_list_add(evas, 0, 0); + of = e_widget_framelist_add(evas, _("Available Gadgets"), 0); + + //o_avail List of available gadgets + ol = e_widget_ilist_add(evas, 24, 24, NULL); + e_widget_ilist_multi_select_set(ol, 0); + e_widget_on_change_hook_set(ol, _avail_list_cb_change, cfdata); + cfdata->o_avail = ol; + _fill_gadgets_list(ol); + e_widget_framelist_object_append(of, ol); + + //o_add Button to add a gadget + ob = e_widget_button_add(evas, _("Add Gadget"), NULL, _cb_add, cfdata, NULL); + e_widget_disabled_set(ob, 1); + cfdata->o_add = ob; + e_widget_framelist_object_append(of, ob); + + e_widget_list_object_append(o, of, 1, 1, 0.5); + + return o; +} + +static int +_basic_apply_data(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata) +{ + gadman_gadget_edit_end(); + e_config_save_queue(); + return 1; +} + +/********************************************************************/ + +static void +_fill_gadgets_list(Evas_Object *ilist) +{ + Evas_List *l = NULL; + int w; + + e_widget_ilist_freeze(ilist); + e_widget_ilist_clear(ilist); + + for (l = e_gadcon_provider_list(); l; l = l->next) + { + E_Gadcon_Client_Class *cc; + Evas_Object *icon = NULL; + const char *lbl = NULL; + + if (!(cc = l->data)) continue; + if (cc->func.label) lbl = cc->func.label(); + if (!lbl) lbl = cc->name; + if (cc->func.icon) icon = cc->func.icon(Man->gc->evas); + e_widget_ilist_append(ilist, icon, lbl, NULL, + (void *)cc, NULL); + } + + e_widget_ilist_go(ilist); + e_widget_min_size_get(ilist, &w, NULL); + if (w < 200) w = 200; + e_widget_min_size_set(ilist, w, 250); + e_widget_ilist_thaw(ilist); +} + +static void +_cb_add(void *data, void *data2) +{ + E_Config_Dialog_Data *cfdata = data; + Evas_List *l; + Evas_List *selected; + int i; + + if (!cfdata) return; + + for (i = 0, l = e_widget_ilist_items_get(cfdata->o_avail); l; l = l->next, i++) + { + E_Ilist_Item *item = NULL; + const char *name = NULL; + E_Gadcon_Client_Class *cc; + E_Gadcon_Client *gcc; + + if (!(item = l->data)) continue; + if (!item->selected) continue; + + cc = e_widget_ilist_nth_data_get(cfdata->o_avail, i); + if (!cc) continue; + + gcc = gadman_gadget_add(cc, 0); + gadman_gadget_edit_start(gcc); + } + if (l) evas_list_free(l); +} + +static void +_avail_list_cb_change(void *data, Evas_Object *obj) +{ + E_Config_Dialog_Data *cfdata = data; + + if (!cfdata) return; + e_widget_disabled_set(cfdata->o_add, 0); +} diff --git a/src/modules/gadman/e_mod_config.h b/src/modules/gadman/e_mod_config.h new file mode 100644 index 000000000..32993cf05 --- /dev/null +++ b/src/modules/gadman/e_mod_config.h @@ -0,0 +1,9 @@ +#ifdef E_TYPEDEFS +#else +#ifndef E_MOD_CONFIG_H +#define E_MOD_CONFIG_H + +EAPI E_Config_Dialog *e_int_config_gadman_module(E_Container *con, const char *params __UNUSED__); + +# endif +#endif diff --git a/src/modules/gadman/e_mod_gadman.c b/src/modules/gadman/e_mod_gadman.c new file mode 100644 index 000000000..4355266d9 --- /dev/null +++ b/src/modules/gadman/e_mod_gadman.c @@ -0,0 +1,1014 @@ +#include +#include +#include "config.h" +#include "e_mod_main.h" +#include "e_mod_gadman.h" +#include "e_mod_config.h" + +/* local protos */ +static void _attach_menu(void *data, E_Gadcon_Client *gcc, E_Menu *menu); +static void _save_widget_position(E_Gadcon_Client *gcc); +static void _apply_widget_position(E_Gadcon_Client *gcc); +static char *_get_bind_text(const char* action); + +static void _hide_finished(void *data, Evas_Object *o, const char *em, const char *src); + +static Evas_Object* _create_mover(E_Gadcon *gc); +static Evas_Object* _get_mover(E_Gadcon_Client *gcc); +static E_Gadcon* _gadman_gadcon_new(const char* name, int ontop); + +static void on_shape_change(void *data, E_Container_Shape *es, E_Container_Shape_Change ch); + +static void on_top(void *data, Evas_Object *o, const char *em, const char *src); +static void on_right(void *data, Evas_Object *o, const char *em, const char *src); +static void on_down(void *data, Evas_Object *o, const char *em, const char *src); +static void on_left(void *data, Evas_Object *o, const char *em, const char *src); +static void on_move(void *data, Evas_Object *o, const char *em, const char *src); + +static void on_frame_click(void *data, Evas *e, Evas_Object *obj, void *event_info); +static void on_bg_click(void *data, Evas_Object *o, const char *em, const char *src); + +static void on_menu_style_plain(void *data, E_Menu *m, E_Menu_Item *mi); +static void on_menu_style_inset(void *data, E_Menu *m, E_Menu_Item *mi); +static void on_menu_layer_bg(void *data, E_Menu *m, E_Menu_Item *mi); +static void on_menu_layer_top(void *data, E_Menu *m, E_Menu_Item *mi); +static void on_menu_delete(void *data, E_Menu *m, E_Menu_Item *mi); +static void on_menu_edit(void *data, E_Menu *m, E_Menu_Item *mi); +static void on_menu_add(void *data, E_Menu *m, E_Menu_Item *mi); + + +E_Gadcon_Client *current; + +/* Implementation */ +void +gadman_init(E_Module *m) +{ + Evas_List *managers, *l; + + /* Create Manager */ + Man = calloc(1, sizeof(Manager)); + if (!Man) return; + Man->module = m; + Man->container = e_container_current_get(e_manager_current_get()); + Man->width = Man->container->w; + Man->height = Man->container->h; + Man->gadgets = NULL; + Man->top_ee = NULL; + Man->visible = 0; + + /* Check if composite is enable */ + if (ecore_x_screen_is_composited(0) || e_config->use_composite) + Man->use_composite = 1; + else + Man->use_composite = 0; + + /* with this we can trap screen resolution change (a better way?)*/ + e_container_shape_change_callback_add(Man->container, on_shape_change, NULL); + + /* Create Gadcon for background and top */ + Man->gc = _gadman_gadcon_new("gadman", 0); + Man->gc_top = _gadman_gadcon_new("gadman_top", 1); + + /* Create 2 mover objects */ + Man->mover = _create_mover(Man->gc); + Man->mover_top = _create_mover(Man->gc_top); + + /* Start existing gadgets */ + for (l = Man->gc->cf->clients; l; l = l->next) + { + E_Config_Gadcon_Client *cf_gcc = l->data; + gadman_gadget_place(cf_gcc, 0); + } + for (l = Man->gc_top->cf->clients; l; l = l->next) + { + E_Config_Gadcon_Client *cf_gcc = l->data; + gadman_gadget_place(cf_gcc, 1); + } +} + +void +gadman_shutdown(void) +{ + e_container_shape_change_callback_del(Man->container, on_shape_change, NULL); +printf("++++++++ UNPOPULATE BG\n"); + e_gadcon_unpopulate(Man->gc); // TODO FIX ME !! +printf("++++++++ UNPOPULATE TOP\n"); + e_gadcon_unpopulate(Man->gc_top); + + /* free gadcons */ + e_config->gadcons = evas_list_remove(e_config->gadcons, Man->gc); + e_config->gadcons = evas_list_remove(e_config->gadcons, Man->gc_top); + evas_stringshare_del(Man->gc->name); + evas_stringshare_del(Man->gc_top->name); + if (Man->gc->config_dialog) e_object_del(E_OBJECT(Man->gc->config_dialog)); + if (Man->icon_name) evas_stringshare_del(Man->icon_name); + free(Man->gc); + free(Man->gc_top); + + /* free manager */ + evas_object_del(Man->mover); + evas_object_del(Man->mover_top); + evas_list_free(Man->gadgets); + if (Man->top_ee) + { + e_canvas_del(Man->top_ee); + //ecore_evas_free(Man->top_ee); + } + free(Man); + Man = NULL; +} + +E_Gadcon_Client * +gadman_gadget_place(E_Config_Gadcon_Client *cf, int ontop) +{ + E_Gadcon *gc; + E_Gadcon_Client *gcc; + E_Gadcon_Client_Class *cc = NULL; + Evas_List *l; + + if (ontop) gc = Man->gc_top; + else gc = Man->gc; + + if (!cf->name) return NULL; + + /* Find provider */ + for (l = e_gadcon_provider_list(); l; l = l->next) + { + cc = l->data; + if (!strcmp(cc->name, cf->name)) + break; + else + cc = NULL; + } + if (!cc) return NULL; + + /* init Gadcon_Client */ + gcc = cc->func.init(gc, cf->name, cf->id, cc->default_style); + gcc->cf = cf; + gcc->client_class = cc; + + Man->gadgets = evas_list_append(Man->gadgets, gcc); + + //printf("Place Gadget %s (style: %s id: %s) (gadcon: %s)\n", gcc->name, cf->style, cf->id, gc->name); + + /* create frame */ + gcc->o_frame = edje_object_add(gc->evas); + e_theme_edje_object_set(gcc->o_frame, "base/theme/gadman", "e/gadman/frame"); + if ((cf->style) && !strcmp(cf->style, E_GADCON_CLIENT_STYLE_INSET)) + edje_object_signal_emit(gcc->o_frame, "e,state,visibility,inset", "e"); + else + edje_object_signal_emit(gcc->o_frame, "e,state,visibility,plain", "e"); + + /* swallow the client inside the frame */ + edje_object_part_swallow(gcc->o_frame, "e.swallow.content", gcc->o_base); + + evas_object_event_callback_add(gcc->o_frame, EVAS_CALLBACK_MOUSE_DOWN, + on_frame_click, gcc); + + _apply_widget_position(gcc); + + if (gcc->gadcon == Man->gc_top) + edje_object_signal_emit(gcc->o_frame, "e,state,visibility,hide", "e"); + + evas_object_show(gcc->o_frame); + + return gcc; +} + +E_Gadcon_Client * +gadman_gadget_add(E_Gadcon_Client_Class *cc, int ontop) +{ + E_Config_Gadcon_Client *cf = NULL; + E_Gadcon_Client *gcc; + E_Gadcon *gc; + char *id; + if (ontop) + gc = Man->gc_top; + else + gc = Man->gc; + + /* Create Config_Gadcon_Client */ + cf = e_gadcon_client_config_new(gc, cc->name); + cf->style = evas_stringshare_add(cc->default_style); + cf->geom.pos_x = DEFAULT_POS_X; + cf->geom.pos_y = DEFAULT_POS_Y; + cf->geom.size_w = DEFAULT_SIZE_W; + cf->geom.size_h = DEFAULT_SIZE_H; + + /* Place the new gadget */ + gcc = gadman_gadget_place(cf, ontop); + + return gcc; +} + +void +gadman_gadget_remove(E_Gadcon_Client *gcc) +{ + + Man->gadgets = evas_list_remove(Man->gadgets, gcc); + + edje_object_part_unswallow(gcc->o_frame, gcc->o_base); + evas_object_del(gcc->o_frame); + + gcc->gadcon->clients = evas_list_remove(gcc->gadcon->clients, gcc); + + e_object_del(E_OBJECT(gcc)); + current = NULL; +} + +void +gadman_gadget_del(E_Gadcon_Client *gcc) +{ + + Man->gadgets = evas_list_remove(Man->gadgets, gcc); + + edje_object_part_unswallow(gcc->o_frame, gcc->o_base); + evas_object_del(gcc->o_frame); + + e_gadcon_client_config_del(current->gadcon->cf, gcc->cf); + gcc->gadcon->clients = evas_list_remove(gcc->gadcon->clients, gcc); + e_object_del(E_OBJECT(gcc)); + + current = NULL; +} + +void +gadman_gadget_edit_start(E_Gadcon_Client *gcc) +{ + E_Gadcon *gc; + + current = gcc; + + gc = gcc->gadcon; + gc->editing = 1; + + /* Move/resize the correct mover */ + int x, y, w, h; + Evas_Object *mover; + + evas_object_geometry_get(gcc->o_frame, &x, &y, &w, &h); + mover = _get_mover(gcc); + + evas_object_move(mover, x, y); + evas_object_resize(mover, w, h); + evas_object_raise(mover); + evas_object_show(mover); +} + +void +gadman_gadget_edit_end(void) +{ + evas_object_hide(Man->mover); + evas_object_hide(Man->mover_top); + + Man->gc->editing = 0; + Man->gc_top->editing = 0; + + _save_widget_position(current); +} + + +void +gadman_gadgets_show(void) +{ + Evas_List *l; + + Man->visible = 1; + ecore_evas_show(Man->top_ee); + + edje_object_signal_emit(Man->full_bg, "e,state,visibility,show", "e"); + + for (l = Man->gadgets; l; l = l->next) + { + E_Gadcon_Client *gcc = l->data; + if (gcc->gadcon == Man->gc_top) + edje_object_signal_emit(gcc->o_frame, "e,state,visibility,show", "e"); + } +} + + +void +gadman_gadgets_hide(void) +{ + Evas_List *l; + + Man->visible = 0; + + edje_object_signal_emit(Man->full_bg, "e,state,visibility,hide", "e"); + + for (l = Man->gadgets; l; l = l->next) + { + E_Gadcon_Client *gcc = l->data; + if (gcc->gadcon == Man->gc_top) + edje_object_signal_emit(gcc->o_frame, "e,state,visibility,hide", "e"); + } +} + + +void +gadman_gadgets_toggle(void) +{ + if (Man->visible) + gadman_gadgets_hide(); + else + gadman_gadgets_show(); +} + + +/* Internals */ +static E_Gadcon* +_gadman_gadcon_new(const char* name, int ontop) +{ + E_Gadcon *gc; + Evas_List *l; + + /* Create Gadcon */ + gc = E_OBJECT_ALLOC(E_Gadcon, E_GADCON_TYPE, NULL); + if (!gc) return NULL; + + gc->name = evas_stringshare_add(name); + gc->layout_policy = E_GADCON_LAYOUT_POLICY_PANEL; + gc->orient = E_GADCON_ORIENT_FLOAT; + + /* Create ecore fullscreen window */ + if (ontop) + { + Man->top_ee = e_canvas_new(e_config->evas_engine_popups, + Man->container->win, + 0, 0, 0, 0, 1, 1, &(Man->top_win), NULL); + + if (Man->use_composite) + { + ecore_evas_alpha_set(Man->top_ee, 1); + Man->top_win = ecore_evas_software_x11_window_get(Man->top_ee); + // Leave 1px to switch desktop when mouse is on border + ecore_x_window_shape_rectangle_set(Man->top_win, 1, 1, + Man->width - 2, Man->height - 2); + } + else + { + ecore_evas_shaped_set(Man->top_ee, 1); + } + + ecore_evas_avoid_damage_set(Man->top_ee, 1); //?? + e_canvas_add(Man->top_ee); //?? + + e_container_window_raise(Man->container, Man->top_win, 250); + + ecore_evas_move_resize(Man->top_ee, 0, 0, Man->width, Man->height); + ecore_evas_hide(Man->top_ee); + + gc->evas = ecore_evas_get(Man->top_ee); + e_gadcon_ecore_evas_set(gc, Man->top_ee); + + /* create full background object */ + Man->full_bg = edje_object_add(gc->evas); + e_theme_edje_object_set(Man->full_bg, "base/theme/gadman", "e/gadman/full_bg"); + edje_object_signal_callback_add(Man->full_bg, "mouse,down,*", "bg", + on_bg_click, NULL); + edje_object_signal_callback_add(Man->full_bg, "program,stop", "hide", + _hide_finished, NULL); + evas_object_move(Man->full_bg, 0, 0); + evas_object_resize(Man->full_bg, Man->width, Man->height); + evas_object_show(Man->full_bg); + + } + /* ... or use the e background window */ + else + { + gc->evas = Man->container->bg_evas; + e_gadcon_ecore_evas_set(gc, Man->container->bg_ecore_evas); + } + + e_gadcon_zone_set(gc, e_zone_current_get(Man->container)); + e_gadcon_util_menu_attach_func_set(gc, _attach_menu, NULL); + + gc->id = 114 + ontop; // TODO what's this ??????? 114 is a random number + gc->edje.o_parent = NULL; + gc->edje.swallow_name = NULL; + gc->shelf = NULL; + gc->toolbar = NULL; + gc->editing = 0; + gc->o_container = NULL; + gc->frame_request.func = NULL; + gc->resize_request.func = NULL; + gc->min_size_request.func = NULL; + + /* Search for existing gadcon config */ + gc->cf = NULL; + for (l = e_config->gadcons; l; l=l->next) + { + E_Config_Gadcon *cg = l->data; + if (!strcmp(cg->name, name)) + { + gc->cf = cg; + break; + } + } + /* ... or create a new one */ + if (!gc->cf) + { + gc->cf = E_NEW(E_Config_Gadcon, 1); + gc->cf->name = evas_stringshare_add(name); + gc->cf->id = gc->id; + gc->cf->clients = NULL; + e_config->gadcons = evas_list_append(e_config->gadcons, gc->cf); + e_config_save_queue(); + } + + return gc; +} + +static Evas_Object* +_create_mover(E_Gadcon *gc) +{ + Evas_Object *mover; + + /* create mover object */ + mover = edje_object_add(gc->evas); + e_theme_edje_object_set(mover, "base/theme/gadman", "e/gadman/control"); + + edje_object_signal_callback_add(mover, "mouse,down,1", "overlay", + on_move, (void*)DRAG_START); + edje_object_signal_callback_add(mover, "mouse,up,1", "overlay", + on_move, (void*)DRAG_STOP); + edje_object_signal_callback_add(mover, "mouse,down,3", "overlay", + gadman_gadget_edit_end, NULL); + + edje_object_signal_callback_add(mover, "mouse,down,1", "h1", + on_left, (void*)DRAG_START); + edje_object_signal_callback_add(mover, "mouse,up,1", "h1", + on_left, (void*)DRAG_STOP); + edje_object_signal_callback_add(mover, "mouse,down,1", "v2", + on_down, (void*)DRAG_START); + edje_object_signal_callback_add(mover, "mouse,up,1", "v2", + on_down, (void*)DRAG_STOP); + edje_object_signal_callback_add(mover, "mouse,down,1", "h2", + on_right, (void*)DRAG_START); + edje_object_signal_callback_add(mover, "mouse,up,1", "h2", + on_right, (void*)DRAG_STOP); + edje_object_signal_callback_add(mover, "mouse,down,1", "v1", + on_top, (void*)DRAG_START); + edje_object_signal_callback_add(mover, "mouse,up,1", "v1", + on_top, (void*)DRAG_STOP); + + evas_object_move(mover, 20, 30); + evas_object_resize(mover, 100, 100); + evas_object_hide(mover); + + return mover; +} + +static Evas_Object * +_get_mover(E_Gadcon_Client *gcc) +{ + if (gcc->gadcon == Man->gc_top) + return Man->mover_top; + else + return Man->mover; +} + +static void +_save_widget_position(E_Gadcon_Client *gcc) +{ + int x, y, w, h; + evas_object_geometry_get(gcc->o_frame, &x, &y, &w, &h); + + current->cf->geom.pos_x = (double)x / (double)Man->width; + current->cf->geom.pos_y = (double)y / (double)Man->height; + current->cf->geom.size_w = (double)w / (double)Man->width;; + current->cf->geom.size_h = (double)h / (double)Man->height; + + e_config_save_queue(); +} + +static void +_apply_widget_position(E_Gadcon_Client *gcc) +{ + Evas_List *l; + int x, y, w, h; + int fx, fy, fw, fh; + + x = gcc->cf->geom.pos_x * Man->width; + y = gcc->cf->geom.pos_y * Man->height; + w = gcc->cf->geom.size_w * Man->width; + h = gcc->cf->geom.size_h * Man->height; + + /* Respect min sizes */ + if (h < gcc->min.h) h = gcc->min.h; + if (w < gcc->min.w) w = gcc->min.w; + + if (h < 1) h = 100; + if (w < 1) w = 100; + + /* Respect screen margin */ + if (x < 0) x = 0; + if (y < 0) y = 0; + + if (x > Man->width) x = 0; + if (y > Man->height) y = 0; + + if ((y + h) > Man->height) h = Man->height - y; + if ((x + w) > Man->width) w = Man->width - x; + + evas_object_move(gcc->o_frame, x, y); + evas_object_resize(gcc->o_frame, w, h); +} + +static void +_attach_menu(void *data, E_Gadcon_Client *gcc, E_Menu *menu) +{ + E_Menu *mn; + E_Menu_Item *mi; + char buf[128]; + + //printf("Attach menu (gcc: %x id: %s) [%s]\n", gcc, gcc->cf->id, gcc->cf->style); + if (!gcc) return; + + if (!gcc->cf->style) + gcc->cf->style = evas_stringshare_add(E_GADCON_CLIENT_STYLE_INSET); + + /* plain / inset */ + mn = e_menu_new(); + mi = e_menu_item_new(mn); + e_menu_item_label_set(mi, _("Plain")); + e_menu_item_radio_set(mi, 1); + e_menu_item_radio_group_set(mi, 1); + if (!strcmp(gcc->cf->style, E_GADCON_CLIENT_STYLE_PLAIN)) + e_menu_item_toggle_set(mi, 1); + e_menu_item_callback_set(mi, on_menu_style_plain, gcc); + + mi = e_menu_item_new(mn); + e_menu_item_label_set(mi, _("Inset")); + e_menu_item_radio_set(mi, 1); + e_menu_item_radio_group_set(mi, 1); + if (!strcmp(gcc->cf->style, E_GADCON_CLIENT_STYLE_INSET)) + e_menu_item_toggle_set(mi, 1); + e_menu_item_callback_set(mi, on_menu_style_inset, gcc); + + mi = e_menu_item_new(menu); + e_menu_item_label_set(mi, _("Appearance")); + e_util_menu_item_edje_icon_set(mi, "enlightenment/appearance"); + e_menu_item_submenu_set(mi, mn); + e_object_del(E_OBJECT(mn)); + + /* bg / ontop */ + mn = e_menu_new(); + mi = e_menu_item_new(mn); + e_menu_item_label_set(mi, _("Always on desktop")); + e_menu_item_radio_set(mi, 1); + e_menu_item_radio_group_set(mi, 2); + if (gcc->gadcon == Man->gc) + e_menu_item_toggle_set(mi, 1); + e_menu_item_callback_set(mi, on_menu_layer_bg, gcc); + + mi = e_menu_item_new(mn); + snprintf(buf, sizeof(buf), "%s %s", + _("On top pressing"), _get_bind_text("gadman_toggle")); + e_menu_item_label_set(mi, buf); + e_menu_item_radio_set(mi, 1); + e_menu_item_radio_group_set(mi, 2); + if (gcc->gadcon == Man->gc_top) + e_menu_item_toggle_set(mi, 1); + e_menu_item_callback_set(mi, on_menu_layer_top, gcc); + + mi = e_menu_item_new(menu); + e_menu_item_label_set(mi, _("Behavior")); + e_util_menu_item_edje_icon_set(mi, "enlightenment/appearance"); + e_menu_item_submenu_set(mi, mn); + e_object_del(E_OBJECT(mn)); + + /* Move / resize*/ + mi = e_menu_item_new(menu); + e_menu_item_label_set(mi, _("Move/resize this gadget")); + e_menu_item_icon_edje_set(mi, Man->icon_name, "move_icon"); + e_menu_item_callback_set(mi, on_menu_edit, gcc); + + /* Remove this gadgets */ + mi = e_menu_item_new(menu); + e_menu_item_label_set(mi, _("Remove this gadget")); + e_menu_item_callback_set(mi, on_menu_delete, gcc); + + /* Add other gadgets */ + mi = e_menu_item_new(menu); + e_menu_item_label_set(mi, _("Add other gadgets")); + e_menu_item_icon_edje_set(mi, Man->icon_name, "icon"); + e_menu_item_callback_set(mi, on_menu_add, gcc); +} + +static char* +_get_bind_text(const char* action) +{ + char b[256] = ""; + E_Binding_Key *bind; + bind = e_bindings_key_get(action); + + if (bind && bind->key) + { + if (bind->mod & E_BINDING_MODIFIER_CTRL) + strcat(b, _("CTRL")); + + if (bind->mod & E_BINDING_MODIFIER_ALT) + { + if (b[0]) strcat(b, " + "); + strcat(b, _("ALT")); + } + + if (bind->mod & E_BINDING_MODIFIER_SHIFT) + { + if (b[0]) strcat(b, " + "); + strcat(b, _("SHIFT")); + } + + if (bind->mod & E_BINDING_MODIFIER_WIN) + { + if (b[0]) strcat(b, " + "); + strcat(b, _("WIN")); + } + + if (bind->key && bind->key[0]) + { + char *l; + if (b[0]) strcat(b, " + "); + + l = strdup(bind->key); + l[0] = (char)toupper(bind->key[0]); + strcat(b, l); + free(l); + } + return &b; + } + return "(You must define a binding)"; +} + +static void +_hide_finished(void *data, Evas_Object *o, const char *em, const char *src) +{ + ecore_evas_hide(Man->top_ee); +} + +/* Callbacks */ +static void +on_shape_change(void *data, E_Container_Shape *es, E_Container_Shape_Change ch) +{ + Evas_List *l; + E_Container *con = e_container_shape_container_get(es); + + if (con->w == Man->width && con->h == Man->height) return; + + /* The screen size is changed */ + Man->width = con->w; + Man->height = con->h; + + /* ReStart gadgets */ + e_gadcon_unpopulate(Man->gc); + e_gadcon_unpopulate(Man->gc_top); + for (l = Man->gc->cf->clients; l; l = l->next) + { + E_Config_Gadcon_Client *cf_gcc = l->data; + gadman_gadget_place(cf_gcc, 0); + } + for (l = Man->gc_top->cf->clients; l; l = l->next) + { + E_Config_Gadcon_Client *cf_gcc = l->data; + gadman_gadget_place(cf_gcc, 1); + } +} +static void +on_menu_style_plain(void *data, E_Menu *m, E_Menu_Item *mi) +{ + E_Gadcon_Client *gcc; + + gcc = current; + if (gcc->style) evas_stringshare_del(gcc->style); + gcc->style = evas_stringshare_add(E_GADCON_CLIENT_STYLE_PLAIN); + + if (gcc->cf->style) evas_stringshare_del(gcc->cf->style); + gcc->cf->style = evas_stringshare_add(E_GADCON_CLIENT_STYLE_PLAIN); + + edje_object_signal_emit(gcc->o_frame, "e,state,visibility,plain", "e"); + + e_config_save_queue(); +} + +static void +on_menu_style_inset(void *data, E_Menu *m, E_Menu_Item *mi) +{ + E_Gadcon_Client *gcc; + + gcc = current; + printf("Inset (%s)\n", gcc->name); + + if (gcc->style) evas_stringshare_del(gcc->style); + gcc->style = evas_stringshare_add(E_GADCON_CLIENT_STYLE_INSET); + + if (gcc->cf->style) evas_stringshare_del(gcc->cf->style); + gcc->cf->style = evas_stringshare_add(E_GADCON_CLIENT_STYLE_INSET); + + edje_object_signal_emit(gcc->o_frame, "e,state,visibility,inset", "e"); + + e_config_save_queue(); +} + + + +static void +on_menu_layer_bg(void *data, E_Menu *m, E_Menu_Item *mi) +{ + E_Config_Gadcon_Client *cf; + + if (!current) return; + cf = current->cf; + + gadman_gadget_remove(current); + current = gadman_gadget_place(cf, 0); + + Man->gc_top->cf->clients = evas_list_remove(Man->gc_top->cf->clients, cf); + Man->gc->cf->clients = evas_list_append(Man->gc->cf->clients, cf); + + e_config_save_queue(); +} + +static void +on_menu_layer_top(void *data, E_Menu *m, E_Menu_Item *mi) +{ + E_Config_Gadcon_Client *cf; + + if (!current) return; + cf = current->cf; + + gadman_gadget_remove(current); + current = gadman_gadget_place(cf, 1); + + Man->gc->cf->clients = evas_list_remove(Man->gc->cf->clients, cf); + Man->gc_top->cf->clients = evas_list_append(Man->gc_top->cf->clients, cf); + + e_config_save_queue(); + + gadman_gadgets_show(); +} + +static void +on_menu_edit(void *data, E_Menu *m, E_Menu_Item *mi) +{ + gadman_gadget_edit_start(data); +} + +static void +on_menu_add(void *data, E_Menu *m, E_Menu_Item *mi) +{ + if (Man->visible) + gadman_gadgets_hide(); + e_configure_registry_call("extensions/gadman", m->zone->container, NULL); +} +static void +on_menu_delete(void *data, E_Menu *m, E_Menu_Item *mi) +{ + gadman_gadget_del(data); + e_config_save_queue(); +} + +static void +on_frame_click(void *data, Evas *e, Evas_Object *obj, void *event_info) +{ + + Evas_Event_Mouse_Down *ev; + E_Gadcon_Client *gcc; + + ev = event_info; + + printf("Click\n"); + + if (Man->gc->editing) gadman_gadget_edit_end(); + + gcc = data; + current = gcc; + + if (ev->button == 5) + { + E_Menu *mn; + int cx, cy, cw, ch; + + mn = e_menu_new(); + //e_menu_post_deactivate_callback_set(mn, _e_gadcon_client_cb_menu_post, + // gcc); + gcc->menu = mn; + + e_gadcon_client_util_menu_items_append(gcc, mn, 0); + + e_gadcon_canvas_zone_geometry_get(gcc->gadcon, &cx, &cy, &cw, &ch); + e_menu_activate_mouse(mn, + e_util_zone_current_get(e_manager_current_get()), + cx + ev->output.x, cy + ev->output.y, 1, 1, + E_MENU_POP_DIRECTION_DOWN, ev->timestamp); + e_util_evas_fake_mouse_up_later(gcc->gadcon->evas, + ev->button); + } + +} + +static void +on_top(void *data, Evas_Object *o, const char *em, const char *src) +{ + static int ox, oy, ow, oh; //Object coord + int mx, my; //Mouse coord + int action = (int)data; + Evas_Object *mover; + mover = _get_mover(current); + + if (action == DRAG_START) + { + evas_pointer_output_xy_get(current->gadcon->evas, &mx, &my); + evas_object_geometry_get(mover, &ox, &oy, &ow, &oh); + edje_object_signal_callback_add(o, "mouse,move", "v1", + on_top,(void*)DRAG_MOVE); + } + else if (action == DRAG_STOP) + { + edje_object_signal_callback_del(o, "mouse,move", "v1", on_top); + _save_widget_position(current); + } + else if (action == DRAG_MOVE) + { + int w, h; + evas_pointer_output_xy_get(current->gadcon->evas, &mx, &my); + + h = (oy + oh) - my - 15; + if (h < current->min.h) h = current->min.h; + + evas_object_resize(mover, ow, h); + evas_object_move(mover, ox, my + 15); + + evas_object_resize(current->o_frame, ow, h); + evas_object_move(current->o_frame, ox, my + 15); + } +} + +static void +on_right(void *data, Evas_Object *o, const char *em, const char *src) +{ + static int ox, oy, ow, oh; //Object coord + int mx, my; //Mouse coord + int action = (int)data; + Evas_Object *mover; + mover = _get_mover(current); + + if (action == DRAG_START) + { + evas_pointer_output_xy_get(current->gadcon->evas, &mx, &my); + evas_object_geometry_get(mover, &ox, &oy, &ow, &oh); + edje_object_signal_callback_add(o, "mouse,move", "h2", + on_right,(void*)DRAG_MOVE); + } + else if (action == DRAG_STOP) + { + edje_object_signal_callback_del(o, "mouse,move", "h2", on_right); + _save_widget_position(current); + } + else if (action == DRAG_MOVE) + { + int w, h; + evas_pointer_output_xy_get(current->gadcon->evas, &mx, &my); + + w = mx - ox - 15; + if (w < current->min.w) w = current->min.w; + + evas_object_resize(mover, w, oh); + evas_object_resize(current->o_frame, w, oh); + } +} + +static void +on_down(void *data, Evas_Object *o, const char *em, const char *src) +{ + static int ox, oy, ow, oh; //Object coord + int mx, my; //Mouse coord + int action = (int)data; + Evas_Object *mover; + mover = _get_mover(current); + + if (action == DRAG_START) + { + evas_pointer_output_xy_get(current->gadcon->evas, &mx, &my); + evas_object_geometry_get(mover, &ox, &oy, &ow, &oh); + edje_object_signal_callback_add(o, "mouse,move", "v2", + on_down,(void*)DRAG_MOVE); + } + else if (action == DRAG_STOP) + { + edje_object_signal_callback_del(o, "mouse,move", "v2", on_down); + _save_widget_position(current); + } + else if (action == DRAG_MOVE) + { + int w, h; + evas_pointer_output_xy_get(current->gadcon->evas, &mx, &my); + h = my - oy - 15; + if (h < current->min.h) h = current->min.h; + + evas_object_resize(mover, ow, h); + evas_object_resize(current->o_frame, ow, h); + } +} + +static void +on_left(void *data, Evas_Object *o, const char *em, const char *src) +{ + static int ox, oy, ow, oh; //Object coord + int mx, my; //Mouse coord + int action = (int)data; + Evas_Object *mover; + mover = _get_mover(current); + + if (action == DRAG_START) + { + evas_pointer_output_xy_get(current->gadcon->evas, &mx, &my); + evas_object_geometry_get(mover, &ox, &oy, &ow, &oh); + edje_object_signal_callback_add(o, "mouse,move", "h1", + on_left,(void*)DRAG_MOVE); + } + else if (action == DRAG_STOP) + { + edje_object_signal_callback_del(o, "mouse,move", "h1", on_left); + _save_widget_position(current); + } + else if (action == DRAG_MOVE) + { + int w, h; + evas_pointer_output_xy_get(current->gadcon->evas, &mx, &my); + + w = (ox + ow) - mx - 15; + if (w < current->min.w) w = current->min.w; + + evas_object_move(mover, mx + 15, oy); + evas_object_resize(mover, w, oh); + + evas_object_move(current->o_frame, mx + 15, oy); + evas_object_resize(current->o_frame, w, oh); + } +} + + +static void +on_move(void *data, Evas_Object *o, const char *em, const char *src) +{ + static int dx, dy; //Offset of mouse pointer inside the mover + static int ox, oy; //Starting object position + static int ow, oh; //Starting object size + int mx, my; //Mouse coord + Evas_Object *mover; + + int action = (int)data; + mover = _get_mover(current); + + /* DRAG_START */ + if (action == DRAG_START) + { + evas_pointer_output_xy_get(current->gadcon->evas, &mx, &my); + evas_object_geometry_get(mover, &ox, &oy, &ow, &oh); + + dx = mx - ox; + dy = my - oy; + + edje_object_signal_callback_add(o, "mouse,move", "overlay", + on_move,(void*)DRAG_MOVE); + return; + } + + /* DRAG_STOP */ + if (action == DRAG_STOP) + { + edje_object_signal_callback_del(o, "mouse,move", "overlay", on_move); + dx = dy = 0; + _save_widget_position(current); + return; + } + + /* DRAG_MOVE */ + if (action == DRAG_MOVE) + { + int x, y; + + evas_pointer_output_xy_get(current->gadcon->evas, &mx, &my); + + x = mx - dx; + y = my - dy; + + /* don't go out of the screen */ + if (x < 0) x = 0; + if (x > (Man->width - ow)) x = Man->width - ow; + if (y < 0) y = 0; + if (y > (Man->height - oh)) y = Man->height - oh; + + evas_object_move(current->o_frame, x , y); + evas_object_move(mover, x, y); + evas_object_raise(current->o_frame); + evas_object_raise(mover); + } +} + +static void +on_bg_click(void *data, Evas_Object *o, const char *em, const char *src) +{ + gadman_gadgets_hide(); +} diff --git a/src/modules/gadman/e_mod_gadman.h b/src/modules/gadman/e_mod_gadman.h new file mode 100644 index 000000000..26568894e --- /dev/null +++ b/src/modules/gadman/e_mod_gadman.h @@ -0,0 +1,49 @@ +#ifndef E_MOD_GADMAN_H +#define E_MOD_GADMAN_H + +#define DEFAULT_POS_X 0.1 +#define DEFAULT_POS_Y 0.1 +#define DEFAULT_SIZE_W 0.07 +#define DEFAULT_SIZE_H 0.07 + +#define DRAG_START 0 +#define DRAG_STOP 1 +#define DRAG_MOVE 2 + +typedef struct _Manager Manager; + +struct _Manager +{ + E_Gadcon *gc; + E_Gadcon *gc_top; + Evas_List *gadgets; + Evas_Object *mover; + Evas_Object *mover_top; + Evas_Object *full_bg; + char *icon_name; + + int visible; + int use_composite; + Ecore_X_Window top_win; + Ecore_Evas *top_ee; + E_Container *container; + + Evas_Coord width, height; + + E_Module *module; + E_Config_Dialog *config_dialog; + E_Int_Menu_Augmentation *maug; + E_Action *action; +}; + +Manager *Man; + +void gadman_init(E_Module *m); +void gadman_shutdown(void); +E_Gadcon_Client *gadman_gadget_add(E_Gadcon_Client_Class *cc, int ontop); +void gadman_gadget_del(E_Gadcon_Client *gcc); +E_Gadcon_Client *gadman_gadget_place(E_Config_Gadcon_Client *cf, int ontop); +void gadman_gadget_edit_start(E_Gadcon_Client *gcc); +void gadman_gadget_edit_end(void); + +#endif diff --git a/src/modules/gadman/e_mod_main.c b/src/modules/gadman/e_mod_main.c new file mode 100644 index 000000000..3912b362c --- /dev/null +++ b/src/modules/gadman/e_mod_main.c @@ -0,0 +1,123 @@ +#include +#include "config.h" +#include "e_mod_main.h" +#include "e_mod_gadman.h" +#include "e_mod_config.h" + +/* local protos */ +static void _gadman_maug_cb(void *data, E_Menu *m, E_Menu_Item *mi); +static void _gadman_maug_add(void *data, E_Menu *m); +static void _gadman_action_cb(E_Object *obj, const char *params); + + +/* public module routines. all modules must have these */ +EAPI E_Module_Api e_modapi = { + E_MODULE_API_VERSION, + "Gadman" +}; + +EAPI void * +e_modapi_init(E_Module *m) +{ + char buf[4096]; + + /* Set up module's message catalogue */ + //snprintf(buf, sizeof(buf), "%s/locale", e_module_dir_get(m)); + //bindtextdomain(PACKAGE, buf); + //bind_textdomain_codeset(PACKAGE, "UTF-8"); + + /* Set up a new configuration panel */ + snprintf(buf, sizeof(buf), "%s/e-module-gadman.edj", m->dir); + e_configure_registry_category_add("extensions", 90, _("Extensions"), NULL, + "enlightenment/extensions"); + e_configure_registry_item_add("extensions/gadman", 150, _("Gadgets"), NULL, + buf, e_int_config_gadman_module); + + /* Set this module to be loaded after all other modules, or we don't see + modules loaded after this */ + e_module_priority_set(m, -100); + + gadman_init(m); + + /* Menu augmentation */ + Man->icon_name = evas_stringshare_add(buf); + Man->maug = NULL; + Man->maug = e_int_menus_menu_augmentation_add("config/1", _gadman_maug_add, + Man->icon_name, NULL, NULL); + /* Create toggle action */ + Man->action = e_action_add("gadman_toggle"); + if (Man->action) + { + Man->action->func.go = _gadman_action_cb; + e_action_predef_name_set(_("Gadgets"), _("Show/hide gadgets"), + "gadman_toggle", NULL, NULL, 0); + } + + /* Create a binding for the action (if not exists) */ + if (!e_bindings_key_get("gadman_toggle")) + { + e_managers_keys_ungrab(); + e_bindings_key_add(E_BINDING_CONTEXT_ANY, "g", E_BINDING_MODIFIER_WIN, + 0, "gadman_toggle", NULL); + + e_managers_keys_grab(); + e_config_save_queue(); + } + + return Man; +} + +EAPI int +e_modapi_shutdown(E_Module *m) +{ + if(Man->maug) + e_int_menus_menu_augmentation_del("config/1", Man->maug); + + e_configure_registry_item_del("extensions/deskman"); + e_configure_registry_category_del("extensions"); + + if (Man->config_dialog) + { + e_object_del(E_OBJECT(Man->config_dialog)); + Man->config_dialog = NULL; + } + if (Man->action) + { + e_action_predef_name_del(_("Gadgets"), _("Show/hide gadgets")); + e_action_del("gadman_toggle"); + Man->action = NULL; + } + + gadman_shutdown(); + + return 1; +} + +EAPI int +e_modapi_save(E_Module *m) +{ + return 1; +} + +static void +_gadman_maug_cb(void *data, E_Menu *m, E_Menu_Item *mi) +{ + e_configure_registry_call("extensions/gadman", m->zone->container, NULL); +} + +static void +_gadman_maug_add(void *data, E_Menu *m) +{ + E_Menu_Item *mi; + + mi = e_menu_item_new(m); + e_menu_item_label_set(mi, _("Gadgets")); + e_menu_item_icon_edje_set(mi, (char *)data, "icon"); + e_menu_item_callback_set(mi, _gadman_maug_cb, NULL); +} + +static void +_gadman_action_cb(E_Object *obj, const char *params) +{ + gadman_gadgets_toggle(); +} diff --git a/src/modules/gadman/e_mod_main.h b/src/modules/gadman/e_mod_main.h new file mode 100644 index 000000000..f884cc0aa --- /dev/null +++ b/src/modules/gadman/e_mod_main.h @@ -0,0 +1,10 @@ +#ifndef E_MOD_MAIN_H +#define E_MOD_MAIN_H + +EAPI extern E_Module_Api e_modapi; + +EAPI void *e_modapi_init(E_Module *m); +EAPI int e_modapi_shutdown(E_Module *m); +EAPI int e_modapi_save(E_Module *m); + +#endif diff --git a/src/modules/gadman/module.desktop.in b/src/modules/gadman/module.desktop.in new file mode 100644 index 000000000..d698ef5af --- /dev/null +++ b/src/modules/gadman/module.desktop.in @@ -0,0 +1,6 @@ +[Desktop Entry] +Type=Link +Name=Gadgets +Icon=e-module-gadman +X-Enlightenment-ModuleType=appearance +Comment=Gadget Manager

Module to manage gadgets on the desktop.