[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