[Pkg-e-commits] [SCM] Enlightenment 17 branch, upstream-vcs, updated. 3eef8cab2cb6f039b529ffc89deb21a0dcab03df
raster
raster at alioth.debian.org
Sat May 24 15:07:45 UTC 2008
The following commit has been merged in the upstream-vcs branch:
commit 1fa503c0cf697e1901887e745e77fa90a1996a55
Author: raster <raster>
Date: Mon May 19 04:37:34 2008 +0000
add in gadman for desktop. happy dave! :)
diff --git a/configure.in b/configure.in
index c5e979b..8e9fca7 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 f2c4aaf..0616869 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 69e490a..7103b69 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 5a44bf9..5428b97 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 cc1a060..d85e4be 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 24af5a9..c8edfcd 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 15f513d..b4c0a4e 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_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_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);
+ }
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 2083a1c..18e5b05 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 f0913df..bf45783 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 db69819..1f0b2e5 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 7728d4e..d2d4f35 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 f333f16..de02735 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 70f1ac1..141e288 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 9cf4f36..bd756b9 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 0000000..6b17b91
--- /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 0000000..e540cd3
Binary files /dev/null and b/src/modules/gadman/e-module-gadman.edj differ
diff --git a/src/modules/gadman/e_mod_config.c b/src/modules/gadman/e_mod_config.c
new file mode 100644
index 0000000..6ff6f2f
--- /dev/null
+++ b/src/modules/gadman/e_mod_config.c
@@ -0,0 +1,176 @@
+#include <e.h>
+#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 0000000..32993cf
--- /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 0000000..4355266
--- /dev/null
+++ b/src/modules/gadman/e_mod_gadman.c
@@ -0,0 +1,1014 @@
+#include <e.h>
+#include <X11/extensions/shape.h>
+#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 0000000..2656889
--- /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 0000000..3912b36
--- /dev/null
+++ b/src/modules/gadman/e_mod_main.c
@@ -0,0 +1,123 @@
+#include <e.h>
+#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 0000000..f884cc0
--- /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 0000000..d698ef5
--- /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=<hilight>Gadget Manager</hilight><br><br>Module to manage gadgets on the desktop.
--
Enlightenment 17
More information about the Pkg-e-commits
mailing list