discomfitor pushed a commit to branch master.

http://git.enlightenment.org/core/enlightenment.git/commit/?id=5b2f952c85dde4572cae4bdb1b054e76500f3065

commit 5b2f952c85dde4572cae4bdb1b054e76500f3065
Author: Stephen Houston <[email protected]>
Date:   Wed Sep 21 11:34:43 2016 -0500

    Introduce pager gadget using new gadget api.
---
 src/modules/Makefile_pager.mk                      |   7 +-
 src/modules/pager/e_mod_config.c                   |   8 +-
 src/modules/pager/e_mod_main.c                     |  44 +-
 src/modules/pager/e_mod_main.h                     |  30 +-
 src/modules/pager/gadget/config.c                  | 601 ++++++++++++++++++
 src/modules/pager/gadget/mod.c                     | 104 ++++
 src/modules/pager/{e_mod_main.c => gadget/pager.c} | 692 +++++++--------------
 src/modules/pager/gadget/pager.h                   |  50 ++
 8 files changed, 1028 insertions(+), 508 deletions(-)

diff --git a/src/modules/Makefile_pager.mk b/src/modules/Makefile_pager.mk
index a77198e..3799e89 100644
--- a/src/modules/Makefile_pager.mk
+++ b/src/modules/Makefile_pager.mk
@@ -5,7 +5,6 @@ pagerdir = $(MDIR)/pager
 pager_DATA = src/modules/pager/e-module-pager.edj \
             src/modules/pager/module.desktop
 
-
 pagerpkgdir = $(MDIR)/pager/$(MODULE_ARCH)
 pagerpkg_LTLIBRARIES = src/modules/pager/module.la
 
@@ -14,7 +13,11 @@ src_modules_pager_module_la_CPPFLAGS = $(MOD_CPPFLAGS)
 src_modules_pager_module_la_LDFLAGS = $(MOD_LDFLAGS)
 src_modules_pager_module_la_SOURCES = src/modules/pager/e_mod_main.h \
                          src/modules/pager/e_mod_main.c \
-                         src/modules/pager/e_mod_config.c
+                         src/modules/pager/e_mod_config.c \
+                          src/modules/pager/gadget/pager.h \
+                          src/modules/pager/gadget/pager.c \
+                          src/modules/pager/gadget/mod.c \
+                          src/modules/pager/gadget/config.c
 
 PHONIES += pager install-pager
 pager: $(pagerpkg_LTLIBRARIES) $(pager_DATA)
diff --git a/src/modules/pager/e_mod_config.c b/src/modules/pager/e_mod_config.c
index 391c0ca..5d57051 100644
--- a/src/modules/pager/e_mod_config.c
+++ b/src/modules/pager/e_mod_config.c
@@ -70,10 +70,10 @@ _config_pager_module(Config_Item *ci)
    v->advanced.check_changed = _adv_check_changed;
 
    snprintf(buff, sizeof(buff), "%s/e-module-pager.edj",
-            pager_config->module->dir);
+            module->dir);
    cfd = e_config_dialog_new(NULL, _("Pager Settings"), "E",
                              "_e_mod_pager_config_dialog", buff, 0, v, ci);
-   pager_config->config_dialog = cfd;
+   config_dialog = cfd;
 }
 
 /* local function prototypes */
@@ -111,7 +111,7 @@ _free_data(E_Config_Dialog *cfd EINA_UNUSED, 
E_Config_Dialog_Data *cfdata)
 {
    cfdata->gui.popup_list = eina_list_free(cfdata->gui.popup_list);
    cfdata->gui.urgent_list = eina_list_free(cfdata->gui.urgent_list);
-   pager_config->config_dialog = NULL;
+   config_dialog = NULL;
    E_FREE(cfdata);
 }
 
@@ -153,6 +153,7 @@ _basic_apply(E_Config_Dialog *cfd EINA_UNUSED, 
E_Config_Dialog_Data *cfdata)
    pager_config->show_desk_names = cfdata->show_desk_names;
    pager_config->popup_urgent = cfdata->popup.urgent_show;
    _pager_cb_config_updated();
+   _pager_cb_config_gadget_updated();
    e_config_save_queue();
    return 1;
 }
@@ -306,6 +307,7 @@ _adv_apply(E_Config_Dialog *cfd EINA_UNUSED, 
E_Config_Dialog_Data *cfdata)
    pager_config->btn_noplace = cfdata->btn.noplace;
    pager_config->btn_desk = cfdata->btn.desk;
    _pager_cb_config_updated();
+   _pager_cb_config_gadget_updated();
    e_config_save_queue();
    return 1;
 }
diff --git a/src/modules/pager/e_mod_main.c b/src/modules/pager/e_mod_main.c
index 3bde897..4e4b21d 100644
--- a/src/modules/pager/e_mod_main.c
+++ b/src/modules/pager/e_mod_main.c
@@ -167,8 +167,9 @@ static E_Desk *current_desk = NULL;
 static E_Config_DD *conf_edd = NULL;
 static Eina_List *pagers = NULL;
 
-Config *pager_config = NULL;
-
+EINTERN E_Module *module;
+EINTERN E_Config_Dialog *config_dialog;
+EINTERN Eina_List *instances, *shandlers;
 
 static Pager_Win *
 _pager_desk_window_find(Pager_Desk *pd, E_Client *client)
@@ -240,7 +241,7 @@ _gc_init(E_Gadcon *gc, const char *name, const char *id, 
const char *style)
                                   _pager_cb_obj_show, inst);
    evas_object_event_callback_add(o, EVAS_CALLBACK_HIDE,
                                   _pager_cb_obj_hide, inst);
-   pager_config->instances = eina_list_append(pager_config->instances, inst);
+   instances = eina_list_append(instances, inst);
    return gcc;
 }
 
@@ -251,7 +252,7 @@ _gc_shutdown(E_Gadcon_Client *gcc)
 
    inst = gcc->data;
    if (pager_config)
-     pager_config->instances = eina_list_remove(pager_config->instances, inst);
+     instances = eina_list_remove(instances, inst);
    e_drop_handler_del(inst->pager->drop_handler);
    _pager_free(inst->pager);
    free(inst);
@@ -299,7 +300,7 @@ _gc_icon(const E_Gadcon_Client_Class *client_class 
EINA_UNUSED, Evas *evas)
 
    o = edje_object_add(evas);
    snprintf(buf, sizeof(buf), "%s/e-module-pager.edj",
-            e_module_dir_get(pager_config->module));
+            e_module_dir_get(module));
    edje_object_file_set(o, buf, "icon");
    return o;
 }
@@ -310,7 +311,7 @@ _gc_id_new(const E_Gadcon_Client_Class *client_class)
    static char buf[4096];
 
    snprintf(buf, sizeof(buf), "%s.%d", client_class->name,
-            eina_list_count(pager_config->instances) + 1);
+            eina_list_count(instances) + 1);
    return buf;
 }
 
@@ -908,7 +909,7 @@ static void
 _pager_inst_cb_menu_configure(void *data EINA_UNUSED, E_Menu *m EINA_UNUSED, 
E_Menu_Item *mi EINA_UNUSED)
 {
    if (!pager_config) return;
-   if (pager_config->config_dialog) return;
+   if (config_dialog) return;
    /* FIXME: pass zone config item */
    _config_pager_module(NULL);
 }
@@ -917,10 +918,10 @@ static E_Config_Dialog *
 _pager_config_dialog(Evas_Object *parent EINA_UNUSED, const char *params 
EINA_UNUSED)
 {
    if (!pager_config) return NULL;
-   if (pager_config->config_dialog) return NULL;
+   if (config_dialog) return NULL;
    /* FIXME: pass zone config item */
    _config_pager_module(NULL);
-   return pager_config->config_dialog;
+   return config_dialog;
 }
 
 static void
@@ -2040,6 +2041,7 @@ e_modapi_init(E_Module *m)
 {
    E_Module *p;
 
+   e_modapi_gadget_init(m);
    p = e_module_find("pager_plain");
    if (p && p->enabled)
      {
@@ -2098,13 +2100,13 @@ e_modapi_init(E_Module *m)
    E_CONFIG_LIMIT(pager_config->btn_noplace, 0, 32);
    E_CONFIG_LIMIT(pager_config->btn_desk, 0, 32);
 
-   E_LIST_HANDLER_APPEND(pager_config->handlers, E_EVENT_ZONE_DESK_COUNT_SET, 
_pager_cb_event_zone_desk_count_set, NULL);
-   E_LIST_HANDLER_APPEND(pager_config->handlers, E_EVENT_DESK_SHOW, 
_pager_cb_event_desk_show, NULL);
-   E_LIST_HANDLER_APPEND(pager_config->handlers, E_EVENT_DESK_NAME_CHANGE, 
_pager_cb_event_desk_name_change, NULL);
-   E_LIST_HANDLER_APPEND(pager_config->handlers, E_EVENT_COMPOSITOR_RESIZE, 
_pager_cb_event_compositor_resize, NULL);
-   E_LIST_HANDLER_APPEND(pager_config->handlers, E_EVENT_CLIENT_PROPERTY, 
_pager_cb_event_client_urgent_change, NULL);
+   E_LIST_HANDLER_APPEND(shandlers, E_EVENT_ZONE_DESK_COUNT_SET, 
_pager_cb_event_zone_desk_count_set, NULL);
+   E_LIST_HANDLER_APPEND(shandlers, E_EVENT_DESK_SHOW, 
_pager_cb_event_desk_show, NULL);
+   E_LIST_HANDLER_APPEND(shandlers, E_EVENT_DESK_NAME_CHANGE, 
_pager_cb_event_desk_name_change, NULL);
+   E_LIST_HANDLER_APPEND(shandlers, E_EVENT_COMPOSITOR_RESIZE, 
_pager_cb_event_compositor_resize, NULL);
+   E_LIST_HANDLER_APPEND(shandlers, E_EVENT_CLIENT_PROPERTY, 
_pager_cb_event_client_urgent_change, NULL);
 
-   pager_config->module = m;
+   module = m;
 
    e_gadcon_provider_register(&_gadcon_class);
 
@@ -2140,13 +2142,14 @@ e_modapi_init(E_Module *m)
 }
 
 E_API int
-e_modapi_shutdown(E_Module *m EINA_UNUSED)
+e_modapi_shutdown(E_Module *m)
 {
+   e_modapi_gadget_shutdown(m);
    e_gadcon_provider_unregister(&_gadcon_class);
 
-   if (pager_config->config_dialog)
-     e_object_del(E_OBJECT(pager_config->config_dialog));
-   E_FREE_LIST(pager_config->handlers, ecore_event_handler_del);
+   if (config_dialog)
+     e_object_del(E_OBJECT(config_dialog));
+   E_FREE_LIST(shandlers, ecore_event_handler_del);
 
    e_configure_registry_item_del("extensions/pager");
 
@@ -2166,8 +2169,9 @@ e_modapi_shutdown(E_Module *m EINA_UNUSED)
 }
 
 E_API int
-e_modapi_save(E_Module *m EINA_UNUSED)
+e_modapi_save(E_Module *m)
 {
+   e_modapi_gadget_save(m);
    e_config_domain_save("module.pager", conf_edd, pager_config);
    return 1;
 }
diff --git a/src/modules/pager/e_mod_main.h b/src/modules/pager/e_mod_main.h
index 746e733..9040995 100644
--- a/src/modules/pager/e_mod_main.h
+++ b/src/modules/pager/e_mod_main.h
@@ -1,5 +1,6 @@
 #ifndef E_MOD_MAIN_H
 #define E_MOD_MAIN_H
+#include "gadget/pager.h"
 
 typedef struct _Config Config;
 typedef struct _Config_Item Config_Item;
@@ -15,38 +16,17 @@ typedef struct _Config_Item Config_Item;
 #define PAGER_DESKNAME_LEFT 3
 #define PAGER_DESKNAME_RIGHT 4
 
-struct _Config
-{
-   unsigned int popup;
-   double popup_speed;
-   unsigned int popup_urgent;
-   unsigned int popup_urgent_stick;
-   unsigned int popup_urgent_focus;
-   double popup_urgent_speed;
-   unsigned int show_desk_names;
-   int popup_act_height; /*keyaction popup */
-   int popup_height;    /* urgent/on-deskswitch popup*/
-   unsigned int drag_resist;
-   unsigned int btn_drag;
-   unsigned int btn_noplace;
-   unsigned int btn_desk;
-   unsigned int flip_desk;
-
-   /* just config state */
-   E_Module *module;
-   E_Config_Dialog *config_dialog;
-   Eina_List *instances, *handlers;
-};
-
 E_API extern E_Module_Api e_modapi;
 
 E_API void *e_modapi_init(E_Module *m);
 E_API int e_modapi_shutdown(E_Module *m);
 E_API int e_modapi_save(E_Module *m);
 
-EINTERN void _pager_cb_config_updated(void);
 EINTERN void _config_pager_module(Config_Item *ci);
-extern Config *pager_config;
+
+extern E_Module *module;
+extern E_Config_Dialog *config_dialog;
+extern Eina_List *instances, *shandlers;
 
 /**
  * @addtogroup Optional_Gadgets
diff --git a/src/modules/pager/gadget/config.c 
b/src/modules/pager/gadget/config.c
new file mode 100644
index 0000000..cb06e42
--- /dev/null
+++ b/src/modules/pager/gadget/config.c
@@ -0,0 +1,601 @@
+#include "pager.h"
+
+#define BUTTON_DRAG    0
+#define BUTTON_NOPLACE 1
+#define BUTTON_DESK    2
+
+typedef struct _Config_Objects Config_Objects;
+struct _Config_Objects
+{
+   Evas_Object     *general_page;
+   Evas_Object     *popup_page;
+   Evas_Object     *urgent_page;
+   Evas_Object     *o_popup;
+   Evas_Object     *o_popup_speed;
+   Evas_Object     *o_popup_urgent;
+   Evas_Object     *o_popup_urgent_stick;
+   Evas_Object     *o_popup_urgent_focus;
+   Evas_Object     *o_popup_urgent_speed;
+   Evas_Object     *o_show_desk_names;
+   Evas_Object     *o_popup_act_height;
+   Evas_Object     *o_popup_height;
+   Evas_Object     *o_drag_resist;
+   Evas_Object     *o_btn_drag;
+   Evas_Object     *o_btn_noplace;
+   Evas_Object     *o_btn_desk;
+   Evas_Object     *o_flip_desk;
+   E_Grab_Dialog   *grab_dia;
+   int              grab_btn;
+   int              w, h;
+};
+Config_Objects *pager_gadget_config_objects = NULL;
+
+static void
+_config_close(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Object *obj 
EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+   cfg_dialog = NULL;
+   E_FREE(pager_gadget_config_objects);
+}
+
+static void
+_config_show_general(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, 
void *event_info EINA_UNUSED)
+{
+   evas_object_hide(pager_gadget_config_objects->popup_page);
+   evas_object_hide(pager_gadget_config_objects->urgent_page);
+   evas_object_show(pager_gadget_config_objects->general_page);
+}
+
+static void
+_config_show_popup(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void 
*event_info EINA_UNUSED)
+{
+   evas_object_hide(pager_gadget_config_objects->general_page);
+   evas_object_hide(pager_gadget_config_objects->urgent_page);
+   evas_object_show(pager_gadget_config_objects->popup_page);
+}
+
+static void
+_config_show_urgent(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void 
*event_info EINA_UNUSED)
+{
+   evas_object_hide(pager_gadget_config_objects->general_page);
+   evas_object_hide(pager_gadget_config_objects->popup_page);
+   evas_object_show(pager_gadget_config_objects->urgent_page);
+}
+
+static void
+_config_value_changed(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, 
void *event_data EINA_UNUSED)
+{
+   pager_config->popup =
+       elm_check_state_get(pager_gadget_config_objects->o_popup);
+   pager_config->popup_speed =
+       elm_slider_value_get(pager_gadget_config_objects->o_popup_speed);
+   pager_config->flip_desk = 
+       elm_check_state_get(pager_gadget_config_objects->o_flip_desk);
+   pager_config->popup_urgent = 
+       elm_check_state_get(pager_gadget_config_objects->o_popup_urgent);
+   pager_config->popup_urgent_stick = 
+       elm_check_state_get(pager_gadget_config_objects->o_popup_urgent_stick);
+   pager_config->popup_urgent_focus =
+       elm_check_state_get(pager_gadget_config_objects->o_popup_urgent_focus);
+   pager_config->popup_urgent_speed = 
+       elm_slider_value_get(pager_gadget_config_objects->o_popup_urgent_speed);
+   pager_config->show_desk_names = 
+       elm_check_state_get(pager_gadget_config_objects->o_show_desk_names);
+   pager_config->popup_height = 
+       elm_slider_value_get(pager_gadget_config_objects->o_popup_height);
+   pager_config->popup_act_height = 
+       elm_slider_value_get(pager_gadget_config_objects->o_popup_act_height);
+   pager_config->drag_resist = 
+       elm_slider_value_get(pager_gadget_config_objects->o_drag_resist);
+   _pager_cb_config_gadget_updated();
+   _pager_cb_config_updated();
+   e_config_save_queue();
+
+   elm_object_disabled_set(pager_gadget_config_objects->o_popup_speed,
+       !pager_config->popup);
+   elm_object_disabled_set(pager_gadget_config_objects->o_popup_act_height,
+       !pager_config->popup);
+   elm_object_disabled_set(pager_gadget_config_objects->o_popup_height,
+       !pager_config->popup);
+   elm_object_disabled_set(pager_gadget_config_objects->o_popup_urgent_stick,
+       !pager_config->popup_urgent);
+   elm_object_disabled_set(pager_gadget_config_objects->o_popup_urgent_focus,
+       !pager_config->popup_urgent);
+   elm_object_disabled_set(pager_gadget_config_objects->o_popup_urgent_speed,
+       !pager_config->popup_urgent);
+}
+
+static void
+_config_update_btn(Evas_Object *button, const int mouse_button)
+{
+   char lbl[256];
+   char *icon = NULL;
+   Evas_Object *ic = NULL;
+
+   switch (mouse_button)
+     {
+      case 0:
+        snprintf(lbl, sizeof(lbl), _("Click to set"));
+        break;
+      case 1:
+        if (e_config->mouse_hand == E_MOUSE_HAND_RIGHT)
+          {
+             snprintf(lbl, sizeof(lbl), _("Left button"));
+             icon = "preferences-desktop-mouse-left";
+          }
+        else if (e_config->mouse_hand == E_MOUSE_HAND_LEFT)
+          {
+             snprintf(lbl, sizeof(lbl), _("Right button"));
+             icon = "preferences-desktop-mouse-right";
+          }
+        else
+          {
+             snprintf(lbl, sizeof(lbl), _("Button %i"), mouse_button);
+             icon = "preferences-desktop-mouse-extra";
+          }
+        break;
+      case 2:
+        snprintf(lbl, sizeof(lbl), _("Middle button"));
+        icon = "preferences-desktop-mouse-middle";
+        break;
+      case 3:
+        if (e_config->mouse_hand == E_MOUSE_HAND_RIGHT)
+          {
+             snprintf(lbl, sizeof(lbl), _("Right button"));
+             icon = "preferences-desktop-mouse-right";
+          }
+        else if (e_config->mouse_hand == E_MOUSE_HAND_LEFT)
+          {
+             snprintf(lbl, sizeof(lbl), _("Left button"));
+             icon = "preferences-desktop-mouse-left";
+          }
+        else
+          {
+             snprintf(lbl, sizeof(lbl), _("Button %i"), mouse_button);
+             icon = "preferences-desktop-mouse-extra";
+          }
+        break;
+      default:
+        snprintf(lbl, sizeof(lbl), _("Button %i"), mouse_button);
+        icon = "preferences-desktop-mouse-extra";
+        break;
+     }
+   elm_object_text_set(button, lbl);
+   if (icon)
+     {
+        ic = elm_icon_add(evas_object_evas_get(button));
+        elm_icon_standard_set(ic, icon);
+        evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_BOTH, 1, 1);
+     }
+   elm_object_part_content_set(button, "icon", ic);
+}
+
+static void
+_config_update_btns(void)
+{
+#if 0
+   _config_update_btn(pager_gadget_config_objects->o_btn_drag, 
pager_config->btn_drag);
+#endif
+
+   _config_update_btn(pager_gadget_config_objects->o_btn_noplace, 
pager_config->btn_noplace);
+   _config_update_btn(pager_gadget_config_objects->o_btn_desk, 
pager_config->btn_desk);
+}
+
+static void
+_config_grab_window_del(void *data EINA_UNUSED)
+{
+   evas_object_show(cfg_dialog);
+   _config_update_btns();
+}
+
+static Eina_Bool
+_config_grab_cb_mouse_down(void *data EINA_UNUSED, int type EINA_UNUSED, void 
*event)
+{
+   Ecore_Event_Mouse_Button *ev;
+
+   ev = event;
+
+   if (ev->buttons == 3)
+     {
+        e_util_dialog_show(_("Attention"),
+                           _("You cannot use the right mouse button in the<br>"
+                             "gadget for this as it is already taken by 
internal<br>"
+                             "code for context menus.<br>"
+                             "This button only works in the popup."));
+     }
+   else
+     {
+        if (ev->buttons == pager_config->btn_drag)
+          pager_config->btn_drag = 0;
+        else if (ev->buttons == pager_config->btn_noplace)
+          pager_config->btn_noplace = 0;
+        else if (ev->buttons == pager_config->btn_desk)
+          pager_config->btn_desk = 0;
+
+        if (pager_gadget_config_objects->grab_btn == 1)
+          pager_config->btn_drag = ev->buttons;
+        else if (pager_gadget_config_objects->grab_btn == 2)
+          pager_config->btn_noplace = ev->buttons;
+        else
+          pager_config->btn_desk = ev->buttons;
+     }
+
+   e_object_del(E_OBJECT(pager_gadget_config_objects->grab_dia));
+   return ECORE_CALLBACK_PASS_ON;
+}
+
+static Eina_Bool
+_config_grab_cb_key_down(void *data EINA_UNUSED, int type EINA_UNUSED, void 
*event)
+{
+   Ecore_Event_Key *ev;
+
+   ev = event;
+   if (!strcmp(ev->key, "Delete"))
+     {
+        if (pager_gadget_config_objects->grab_btn == 1)
+          pager_config->btn_drag = 0;
+        else if (pager_gadget_config_objects->grab_btn == 2)
+          pager_config->btn_noplace = 0;
+        else
+          pager_config->btn_desk = 0;
+     }
+   e_object_del(E_OBJECT(pager_gadget_config_objects->grab_dia));
+   return ECORE_CALLBACK_PASS_ON;
+}
+
+static void
+_config_grab_window_show(void *data, Evas_Object *obj EINA_UNUSED, void 
*event_info EINA_UNUSED)
+{
+
+   evas_object_hide(cfg_dialog);
+   pager_gadget_config_objects->grab_btn = 0;
+   if ((long)data == BUTTON_DRAG)
+     pager_gadget_config_objects->grab_btn = 1;
+   else if ((long)data == BUTTON_NOPLACE)
+     pager_gadget_config_objects->grab_btn = 2;
+
+   pager_gadget_config_objects->grab_dia = e_grab_dialog_show(NULL, EINA_TRUE,
+       _config_grab_cb_key_down, _config_grab_cb_mouse_down, NULL, NULL);
+   
e_object_del_attach_func_set(E_OBJECT(pager_gadget_config_objects->grab_dia), 
_config_grab_window_del);
+}
+
+static Evas_Object *
+_config_create_pages(Evas_Object *parent)
+{
+   Evas_Object *m, *tb, *ow;
+   int row = 4;
+
+   m = elm_table_add(parent);
+   E_EXPAND(m);
+   evas_object_show(m);
+
+   /* General Page */
+   tb = elm_table_add(m);
+   E_EXPAND(tb);
+   evas_object_show(tb);
+
+   ow = elm_check_add(tb);
+   elm_object_text_set(ow, _("Flip desktop on mouse wheel"));
+   evas_object_size_hint_align_set(ow, 0.0, EVAS_HINT_FILL);
+   elm_check_state_set(ow, pager_config->flip_desk);
+   elm_table_pack(tb, ow, 0, 0, 1, 1);
+   E_ALIGN(ow, EVAS_HINT_FILL, EVAS_HINT_FILL);
+   E_WEIGHT(ow, EVAS_HINT_EXPAND, 0);
+   evas_object_smart_callback_add(ow, "changed",
+       _config_value_changed, NULL);
+   evas_object_show(ow);
+   pager_gadget_config_objects->o_flip_desk = ow;
+
+   ow = elm_check_add(tb);
+   elm_object_text_set(ow, _("Always show desktop names"));
+   evas_object_size_hint_align_set(ow, 0.0, EVAS_HINT_FILL);
+   elm_check_state_set(ow, pager_config->show_desk_names);
+   elm_table_pack(tb, ow, 0, 1, 1, 1);
+   E_ALIGN(ow, EVAS_HINT_FILL, EVAS_HINT_FILL);
+   E_WEIGHT(ow, EVAS_HINT_EXPAND, 0);
+   evas_object_smart_callback_add(ow, "changed",
+       _config_value_changed, NULL);
+   evas_object_show(ow);
+   pager_gadget_config_objects->o_show_desk_names = ow;
+
+   ow = elm_label_add(tb);
+   elm_object_text_set(ow, _("Resistance to dragging"));
+   elm_table_pack(tb, ow, 0, 2, 1, 1);
+   E_ALIGN(ow, 0.5, 0.5);
+   E_WEIGHT(ow, EVAS_HINT_EXPAND, 0);
+   evas_object_show(ow);
+
+   ow = elm_slider_add(tb);
+   elm_slider_min_max_set(ow, 0, 10);
+   elm_slider_step_set(ow, 1);
+   elm_slider_value_set(ow, pager_config->drag_resist);
+   elm_slider_unit_format_set(ow, _("%.0f pixels"));
+   elm_table_pack(tb, ow, 0, 3, 1, 1);
+   E_ALIGN(ow, EVAS_HINT_FILL, EVAS_HINT_FILL);
+   E_WEIGHT(ow, EVAS_HINT_EXPAND, 0);
+   evas_object_smart_callback_add(ow, "delay,changed",
+       _config_value_changed, NULL);
+   evas_object_show(ow);
+   pager_gadget_config_objects->o_drag_resist = ow;
+
+#if 0
+   ow = elm_label_add(tb);
+   elm_object_text_set(ow, _("Select and Slide button"));
+   elm_table_pack(tb, ow, 0, row, 1, 1);
+   E_ALIGN(ow, 0.5, 0.5);
+   E_WEIGHT(ow, EVAS_HINT_EXPAND, 0);
+   evas_object_show(ow);
+   row++;
+
+   ow = elm_button_add(tb);
+   elm_object_text_set(ow, _("Click to set"));
+   evas_object_smart_callback_add(ow, "clicked",
+       _config_grab_window_show, (void *)BUTTON_DRAG);
+   elm_table_pack(tb, ow, 0, row, 1, 1);
+   E_ALIGN(ow, EVAS_HINT_FILL, EVAS_HINT_FILL);
+   E_WEIGHT(ow, EVAS_HINT_EXPAND, 0);
+   evas_object_show(ow);
+   pager_gadget_config_objects->o_btn_drag = ow;
+   row++;
+#endif
+
+   ow = elm_label_add(tb);
+   elm_object_text_set(ow, _("Drag and Drop button"));
+   elm_table_pack(tb, ow, 0, row, 1, 1);
+   E_ALIGN(ow, 0.5, 0.5);
+   E_WEIGHT(ow, EVAS_HINT_EXPAND, 0);
+   evas_object_show(ow);
+   row++;
+
+   ow = elm_button_add(tb);
+   elm_object_text_set(ow, _("Click to set"));
+   evas_object_smart_callback_add(ow, "clicked",
+       _config_grab_window_show, (void *)BUTTON_NOPLACE);
+   elm_table_pack(tb, ow, 0, row, 1, 1);
+   E_ALIGN(ow, EVAS_HINT_FILL, EVAS_HINT_FILL);
+   E_WEIGHT(ow, EVAS_HINT_EXPAND, 0);
+   evas_object_show(ow);
+   pager_gadget_config_objects->o_btn_noplace = ow;
+   row++;
+
+   ow = elm_label_add(tb);
+   elm_object_text_set(ow, _("Drag whole desktop"));
+   elm_table_pack(tb, ow, 0, row, 1, 1);
+   E_ALIGN(ow, 0.5, 0.5);
+   E_WEIGHT(ow, EVAS_HINT_EXPAND, 0);
+   evas_object_show(ow);
+   row++;
+
+   ow = elm_button_add(tb);
+   elm_object_text_set(ow, _("Click to set"));
+   evas_object_smart_callback_add(ow, "clicked",
+       _config_grab_window_show, (void *)BUTTON_DESK);
+   elm_table_pack(tb, ow, 0, row, 1, 1);
+   E_ALIGN(ow, EVAS_HINT_FILL, EVAS_HINT_FILL);
+   E_WEIGHT(ow, EVAS_HINT_EXPAND, 0);
+   evas_object_show(ow);
+   pager_gadget_config_objects->o_btn_desk = ow;
+
+   _config_update_btns();
+
+   elm_table_pack(m, tb, 0, 0, 1, 1);
+   pager_gadget_config_objects->general_page = tb;
+
+   /* Popup Page */
+   tb = elm_table_add(m);
+   E_EXPAND(tb);
+   evas_object_show(tb);
+
+   ow = elm_check_add(tb);
+   elm_object_text_set(ow, _("Show popup on desktop change"));
+   evas_object_size_hint_align_set(ow, 0.0, EVAS_HINT_FILL);
+   elm_check_state_set(ow, pager_config->show_desk_names);
+   elm_table_pack(tb, ow, 0, 0, 1, 1);
+   E_ALIGN(ow, EVAS_HINT_FILL, EVAS_HINT_FILL);
+   E_WEIGHT(ow, EVAS_HINT_EXPAND, 0);
+   evas_object_smart_callback_add(ow, "changed",
+       _config_value_changed, NULL);
+   evas_object_show(ow);
+   pager_gadget_config_objects->o_popup = ow;
+
+   ow = elm_label_add(tb);
+   elm_object_text_set(ow, _("Popup pager height"));
+   elm_object_disabled_set(ow, !pager_config->popup);
+   elm_table_pack(tb, ow, 0, 1, 1, 1);
+   E_ALIGN(ow, 0.5, 0.5);
+   E_WEIGHT(ow, EVAS_HINT_EXPAND, 0);
+   evas_object_show(ow);
+
+   ow = elm_slider_add(tb);
+   elm_object_disabled_set(ow, !pager_config->popup);
+   elm_slider_min_max_set(ow, 20, 200);
+   elm_slider_step_set(ow, 1);
+   elm_slider_value_set(ow, pager_config->popup_height);
+   elm_slider_unit_format_set(ow, _("%.0f pixels"));
+   elm_table_pack(tb, ow, 0, 2, 1, 1);
+   E_ALIGN(ow, EVAS_HINT_FILL, EVAS_HINT_FILL);
+   E_WEIGHT(ow, EVAS_HINT_EXPAND, 0);
+   evas_object_smart_callback_add(ow, "delay,changed",
+       _config_value_changed, NULL);
+   evas_object_show(ow);
+   pager_gadget_config_objects->o_popup_height = ow;
+   
+   ow = elm_label_add(tb);
+   elm_object_text_set(ow, _("Popup duration"));
+   elm_object_disabled_set(ow, !pager_config->popup);
+   elm_table_pack(tb, ow, 0, 3, 1, 1);
+   E_ALIGN(ow, 0.5, 0.5);
+   E_WEIGHT(ow, EVAS_HINT_EXPAND, 0);
+   evas_object_show(ow);
+
+   ow = elm_slider_add(tb);
+   elm_object_disabled_set(ow, !pager_config->popup);
+   elm_slider_min_max_set(ow, 0.1, 10);
+   elm_slider_step_set(ow, 0.1);
+   elm_slider_value_set(ow, pager_config->popup_speed);
+   elm_slider_unit_format_set(ow, _("%1.1f seconds"));
+   elm_table_pack(tb, ow, 0, 4, 1, 1);
+   E_ALIGN(ow, EVAS_HINT_FILL, EVAS_HINT_FILL);
+   E_WEIGHT(ow, EVAS_HINT_EXPAND, 0);
+   evas_object_smart_callback_add(ow, "delay,changed",
+       _config_value_changed, NULL);
+   evas_object_show(ow);
+   pager_gadget_config_objects->o_popup_speed = ow;
+
+   ow = elm_label_add(tb);
+   elm_object_text_set(ow, _("Pager action popup height"));
+   elm_object_disabled_set(ow, !pager_config->popup);
+   elm_table_pack(tb, ow, 0, 5, 1, 1);
+   E_ALIGN(ow, 0.5, 0.5);
+   E_WEIGHT(ow, EVAS_HINT_EXPAND, 0);
+   evas_object_show(ow);
+
+   ow = elm_slider_add(tb);
+   elm_object_disabled_set(ow, !pager_config->popup);
+   elm_slider_min_max_set(ow, 20, 200);
+   elm_slider_step_set(ow, 1);
+   elm_slider_value_set(ow, pager_config->popup_act_height);
+   elm_slider_unit_format_set(ow, _("%.0f pixels"));
+   elm_table_pack(tb, ow, 0, 6, 1, 1);
+   E_ALIGN(ow, EVAS_HINT_FILL, EVAS_HINT_FILL);
+   E_WEIGHT(ow, EVAS_HINT_EXPAND, 0);
+   evas_object_smart_callback_add(ow, "delay,changed",
+       _config_value_changed, NULL);
+   evas_object_show(ow);
+   pager_gadget_config_objects->o_popup_act_height = ow;
+
+   elm_table_pack(m, tb, 0, 0, 1, 1);
+   pager_gadget_config_objects->popup_page = tb;
+
+   /* Urgent Page */
+   tb = elm_table_add(m);
+   E_EXPAND(tb);
+   evas_object_show(tb);
+
+   ow = elm_check_add(tb);
+   elm_object_text_set(ow, _("Show popup for urgent window"));
+   evas_object_size_hint_align_set(ow, 0.0, EVAS_HINT_FILL);
+   elm_check_state_set(ow, pager_config->popup_urgent);
+   elm_table_pack(tb, ow, 0, 0, 1, 1);
+   E_ALIGN(ow, EVAS_HINT_FILL, EVAS_HINT_FILL);
+   E_WEIGHT(ow, EVAS_HINT_EXPAND, 0);
+   evas_object_smart_callback_add(ow, "changed",
+       _config_value_changed, NULL);
+   evas_object_show(ow);
+   pager_gadget_config_objects->o_popup_urgent = ow;
+
+   ow = elm_check_add(tb);
+   elm_object_disabled_set(ow, !pager_config->popup_urgent);
+   elm_object_text_set(ow, _("Urgent popup sticks on screen"));
+   evas_object_size_hint_align_set(ow, 0.0, EVAS_HINT_FILL);
+   elm_check_state_set(ow, pager_config->popup_urgent_stick);
+   elm_table_pack(tb, ow, 0, 1, 1, 1);
+   E_ALIGN(ow, EVAS_HINT_FILL, EVAS_HINT_FILL);
+   E_WEIGHT(ow, EVAS_HINT_EXPAND, 0);
+   evas_object_smart_callback_add(ow, "changed",
+       _config_value_changed, NULL);
+   evas_object_show(ow);
+   pager_gadget_config_objects->o_popup_urgent_stick = ow;
+
+   ow = elm_check_add(tb);
+   elm_object_disabled_set(ow, !pager_config->popup_urgent);
+   elm_object_text_set(ow, _("Show popup for focused windows"));
+   evas_object_size_hint_align_set(ow, 0.0, EVAS_HINT_FILL);
+   elm_check_state_set(ow, pager_config->popup_urgent_focus);
+   elm_table_pack(tb, ow, 0, 2, 1, 1);
+   E_ALIGN(ow, EVAS_HINT_FILL, EVAS_HINT_FILL);
+   E_WEIGHT(ow, EVAS_HINT_EXPAND, 0);
+   evas_object_smart_callback_add(ow, "changed",
+       _config_value_changed, NULL);
+   evas_object_show(ow);
+   pager_gadget_config_objects->o_popup_urgent_focus = ow;
+
+   ow = elm_label_add(tb);
+   elm_object_text_set(ow, _("Urgent Popup Duration"));
+   elm_object_disabled_set(ow, !pager_config->popup_urgent);
+   elm_table_pack(tb, ow, 0, 3, 1, 1);
+   E_ALIGN(ow, 0.5, 0.5);
+   E_WEIGHT(ow, EVAS_HINT_EXPAND, 0);
+   evas_object_show(ow);
+
+   ow = elm_slider_add(tb);
+   elm_object_disabled_set(ow, !pager_config->popup_urgent);
+   elm_slider_min_max_set(ow, 0.1, 10);
+   elm_slider_step_set(ow, 0.1);
+   elm_slider_value_set(ow, pager_config->popup_urgent_speed);
+   elm_slider_unit_format_set(ow, _("%1.1f seconds"));
+   elm_table_pack(tb, ow, 0, 4, 1, 1);
+   E_ALIGN(ow, EVAS_HINT_FILL, EVAS_HINT_FILL);
+   E_WEIGHT(ow, EVAS_HINT_EXPAND, 0);
+   evas_object_smart_callback_add(ow, "delay,changed",
+       _config_value_changed, NULL);
+   evas_object_show(ow);
+   pager_gadget_config_objects->o_popup_urgent_speed = ow;
+
+   elm_table_pack(m, tb, 0, 0, 1, 1);
+   pager_gadget_config_objects->urgent_page = tb;
+
+   return m;
+}
+
+EINTERN Evas_Object *
+config_pager(E_Zone *zone)
+{
+   Evas_Object *popup, *tb, *lbl, *list, *fr;
+   Elm_Object_Item *it;
+
+   pager_gadget_config_objects = E_NEW(Config_Objects, 1);
+   pager_gadget_config_objects->w = 0;
+   pager_gadget_config_objects->h = 0;
+
+   popup = elm_popup_add(e_comp->elm);
+   E_EXPAND(popup);
+   elm_popup_allow_events_set(popup, 1);
+   elm_popup_scrollable_set(popup, 1);
+
+   tb = elm_table_add(popup);
+   E_EXPAND(tb);
+   evas_object_show(tb);
+   elm_object_content_set(popup, tb);
+
+   lbl = elm_label_add(tb);
+   elm_object_style_set(lbl, "marker");
+   evas_object_show(lbl);
+   elm_object_text_set(lbl, _("Pager Configuration"));
+   elm_table_pack(tb, lbl, 0, 0, 2, 1);
+
+   list = elm_list_add(tb);
+   E_ALIGN(list, 0, EVAS_HINT_FILL);
+   E_WEIGHT(list, 0, EVAS_HINT_EXPAND);
+   elm_table_pack(tb, list, 0, 1, 1, 1);
+   elm_list_select_mode_set(list, ELM_OBJECT_SELECT_MODE_ALWAYS);
+   elm_scroller_content_min_limit(list, 1, 1);
+   it = elm_list_item_append(list, _("General"), NULL, NULL,
+       _config_show_general, NULL);
+   elm_list_item_selected_set(it, 1);
+   it = elm_list_item_append(list, _("Popup"), NULL, NULL,
+       _config_show_popup,  NULL);
+   it = elm_list_item_append(list, _("Urgent"), NULL, NULL,
+       _config_show_urgent, NULL);
+   elm_list_go(list);
+   evas_object_show(list);
+
+   fr = elm_frame_add(tb);
+   E_EXPAND(fr);
+   elm_table_pack(tb, fr, 1, 1, 1, 1);
+   evas_object_show(fr);
+   
+   elm_object_content_set(fr,
+     _config_create_pages(fr));
+   _config_show_general(NULL, NULL, NULL);
+
+   popup = e_comp_object_util_add(popup, E_COMP_OBJECT_TYPE_NONE);
+   evas_object_layer_set(popup, E_LAYER_POPUP);
+   evas_object_resize(popup, zone->w / 4, zone->h / 3);
+   e_comp_object_util_center(popup);
+   evas_object_show(popup);
+   e_comp_object_util_autoclose(popup, NULL, 
e_comp_object_util_autoclose_on_escape, NULL);
+   evas_object_event_callback_add(popup, EVAS_CALLBACK_DEL, _config_close, 
NULL);
+
+   return cfg_dialog = popup;
+}
+
diff --git a/src/modules/pager/gadget/mod.c b/src/modules/pager/gadget/mod.c
new file mode 100644
index 0000000..af4c370
--- /dev/null
+++ b/src/modules/pager/gadget/mod.c
@@ -0,0 +1,104 @@
+#include "pager.h"
+static E_Config_DD *conf_edd = NULL;
+Config *pager_config;
+E_Module *gmodule;
+Evas_Object *cfg_dialog;
+Eina_List *ginstances, *ghandlers;
+
+E_API void *
+e_modapi_gadget_init(E_Module *m)
+{
+   conf_edd = E_CONFIG_DD_NEW("Pager_Config", Config);
+#undef T
+#undef D
+#define T Config
+#define D conf_edd
+   E_CONFIG_VAL(D, T, popup, UINT);
+   E_CONFIG_VAL(D, T, popup_speed, DOUBLE);
+   E_CONFIG_VAL(D, T, popup_urgent, UINT);
+   E_CONFIG_VAL(D, T, popup_urgent_stick, UINT);
+   E_CONFIG_VAL(D, T, popup_urgent_speed, DOUBLE);
+   E_CONFIG_VAL(D, T, show_desk_names, UINT);
+   E_CONFIG_VAL(D, T, popup_height, INT);
+   E_CONFIG_VAL(D, T, popup_act_height, INT);
+   E_CONFIG_VAL(D, T, drag_resist, UINT);
+   E_CONFIG_VAL(D, T, btn_drag, UCHAR);
+   E_CONFIG_VAL(D, T, btn_noplace, UCHAR);
+   E_CONFIG_VAL(D, T, btn_desk, UCHAR);
+   E_CONFIG_VAL(D, T, flip_desk, UCHAR);
+
+   pager_config = e_config_domain_load("module.pager", conf_edd);
+
+   if (!pager_config)
+     {
+        pager_config = E_NEW(Config, 1);
+        pager_config->popup = 1;
+        pager_config->popup_speed = 1.0;
+        pager_config->popup_urgent = 0;
+        pager_config->popup_urgent_stick = 0;
+        pager_config->popup_urgent_speed = 1.5;
+        pager_config->show_desk_names = 0;
+        pager_config->popup_height = 60;
+        pager_config->popup_act_height = 60;
+        pager_config->drag_resist = 3;
+        pager_config->btn_drag = 1;
+        pager_config->btn_noplace = 2;
+        pager_config->btn_desk = 2;
+        pager_config->flip_desk = 0;
+     }
+   E_CONFIG_LIMIT(pager_config->popup, 0, 1);
+   E_CONFIG_LIMIT(pager_config->popup_speed, 0.1, 10.0);
+   E_CONFIG_LIMIT(pager_config->popup_urgent, 0, 1);
+   E_CONFIG_LIMIT(pager_config->popup_urgent_stick, 0, 1);
+   E_CONFIG_LIMIT(pager_config->popup_urgent_speed, 0.1, 10.0);
+   E_CONFIG_LIMIT(pager_config->show_desk_names, 0, 1);
+   E_CONFIG_LIMIT(pager_config->popup_height, 20, 200);
+   E_CONFIG_LIMIT(pager_config->popup_act_height, 20, 200);
+   E_CONFIG_LIMIT(pager_config->drag_resist, 0, 50);
+   E_CONFIG_LIMIT(pager_config->flip_desk, 0, 1);
+   E_CONFIG_LIMIT(pager_config->btn_drag, 0, 32);
+   E_CONFIG_LIMIT(pager_config->btn_noplace, 0, 32);
+   E_CONFIG_LIMIT(pager_config->btn_desk, 0, 32);
+
+   gmodule = m;
+
+   pager_init();
+
+   e_gadget_type_add("Pager Gadget", pager_create, NULL);
+
+   return m;
+}
+
+E_API int
+e_modapi_gadget_shutdown(E_Module *m EINA_UNUSED)
+{
+   if (cfg_dialog)
+     e_object_del(E_OBJECT(cfg_dialog));
+
+   if (pager_config && ghandlers)
+     E_FREE_LIST(ghandlers, ecore_event_handler_del);
+
+   e_action_del("pager_gadget_show");
+   e_action_del("pager_gadget_switch");
+
+   e_action_predef_name_del("Pager Gadget", "Show Pager Popup");
+   e_action_predef_name_del("Pager Gadget", "Popup Desk Right");
+   e_action_predef_name_del("Pager Gadget", "Popup Desk Left");
+   e_action_predef_name_del("Pager Gadget", "Popup Desk Up");
+   e_action_predef_name_del("Pager Gadget", "Popup Desk Down");
+   e_action_predef_name_del("Pager Gadget", "Popup Desk Next");
+   e_action_predef_name_del("Pager Gadget", "Popup Desk Previous");
+
+   e_gadget_type_del("Pager Gadget");
+
+   E_FREE(pager_config);
+   E_CONFIG_DD_FREE(conf_edd);
+   return 1;
+}
+
+E_API int
+e_modapi_gadget_save(E_Module *m EINA_UNUSED)
+{
+   e_config_domain_save("module.pager", conf_edd, pager_config);
+   return 1;
+}
diff --git a/src/modules/pager/e_mod_main.c b/src/modules/pager/gadget/pager.c
similarity index 76%
copy from src/modules/pager/e_mod_main.c
copy to src/modules/pager/gadget/pager.c
index 3bde897..5886592 100644
--- a/src/modules/pager/e_mod_main.c
+++ b/src/modules/pager/gadget/pager.c
@@ -1,25 +1,4 @@
-#include "e.h"
-#include "e_mod_main.h"
-
-/* gadcon requirements */
-static E_Gadcon_Client *_gc_init(E_Gadcon *gc, const char *name, const char 
*id, const char *style);
-static void             _gc_shutdown(E_Gadcon_Client *gcc);
-static void             _gc_orient(E_Gadcon_Client *gcc, E_Gadcon_Orient 
orient EINA_UNUSED);
-static const char      *_gc_label(const E_Gadcon_Client_Class *client_class 
EINA_UNUSED);
-static Evas_Object     *_gc_icon(const E_Gadcon_Client_Class *client_class 
EINA_UNUSED, Evas *evas);
-static const char      *_gc_id_new(const E_Gadcon_Client_Class *client_class 
EINA_UNUSED);
-
-/* and actually define the gadcon class that this module provides (just 1) */
-static const E_Gadcon_Client_Class _gadcon_class =
-{
-   GADCON_CLIENT_CLASS_VERSION,
-   "pager",
-   {
-      _gc_init, _gc_shutdown, _gc_orient, _gc_label, _gc_icon, _gc_id_new, 
NULL,
-      e_gadcon_site_is_not_toolbar
-   },
-   E_GADCON_CLIENT_STYLE_INSET
-};
+#include "pager.h"
 
 /* actual module specifics */
 typedef struct _Instance    Instance;
@@ -30,15 +9,15 @@ typedef struct _Pager_Popup Pager_Popup;
 
 struct _Instance
 {
-   E_Gadcon_Client *gcc;
    Evas_Object     *o_pager; /* table */
    Pager           *pager;
+   Pager_Popup     *popup;
+   Eina_Bool        destroyed;
 };
 
 struct _Pager
 {
    Instance       *inst;
-   E_Drop_Handler *drop_handler;
    Pager_Popup    *popup;
    Evas_Object    *o_table;
    E_Zone         *zone;
@@ -47,8 +26,6 @@ struct _Pager
    Pager_Desk     *active_pd;
    unsigned char   dragging : 1;
    unsigned char   just_dragged : 1;
-   Evas_Coord      dnd_x, dnd_y;
-   Pager_Desk     *active_drop_pd;
    E_Client       *active_drag_client;
    Ecore_Job      *recalc;
    Eina_Bool       invert : 1;
@@ -61,6 +38,7 @@ struct _Pager_Desk
    Eina_List   *wins;
    Evas_Object *o_desk;
    Evas_Object *o_layout;
+   Evas_Object *drop_handler;
    int          xpos, ypos, urgent;
    int          current : 1;
    struct
@@ -102,11 +80,8 @@ static void             _pager_cb_mirror_add(Pager_Desk 
*pd, Evas_Object *obj, E
 
 static void             _pager_cb_obj_show(void *data, Evas *e EINA_UNUSED, 
Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED);
 static void             _pager_cb_obj_hide(void *data, Evas *e EINA_UNUSED, 
Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED);
-static void             _pager_cb_obj_moveresize(void *data, Evas *e 
EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED);
 static void             _button_cb_mouse_down(void *data, Evas *e EINA_UNUSED, 
Evas_Object *obj EINA_UNUSED, void *event_info);
-static void             _pager_inst_cb_menu_configure(void *data EINA_UNUSED, 
E_Menu *m EINA_UNUSED, E_Menu_Item *mi EINA_UNUSED);
-static void             _pager_inst_cb_menu_virtual_desktops_dialog(void 
*data, E_Menu *m EINA_UNUSED, E_Menu_Item *mi EINA_UNUSED);
-static void             _pager_instance_drop_zone_recalc(Instance *inst);
+static Evas_Object     *_pager_gadget_configure(Evas_Object *g);
 static Eina_Bool        _pager_cb_event_desk_show(void *data EINA_UNUSED, int 
type EINA_UNUSED, void *event);
 static Eina_Bool        _pager_cb_event_desk_name_change(void *data 
EINA_UNUSED, int type EINA_UNUSED, void *event);
 static Eina_Bool        _pager_cb_event_compositor_resize(void *data 
EINA_UNUSED, int type EINA_UNUSED, void *event);
@@ -120,27 +95,26 @@ static void             _pager_drop_cb_enter(void *data, 
const char *type EINA_U
 static void             _pager_drop_cb_move(void *data, const char *type 
EINA_UNUSED, void *event_info);
 static void             _pager_drop_cb_leave(void *data, const char *type 
EINA_UNUSED, void *event_info EINA_UNUSED);
 static void             _pager_drop_cb_drop(void *data, const char *type, void 
*event_info);
-static void             _pager_inst_cb_scroll(void *data);
-static void             _pager_update_drop_position(Pager *p, Evas_Coord x, 
Evas_Coord y);
+static void             _pager_update_drop_position(Pager *p, Pager_Desk *pd, 
Evas_Coord x, Evas_Coord y);
 static void             _pager_desk_cb_mouse_down(void *data, Evas *e 
EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info);
 static void             _pager_desk_cb_mouse_up(void *data, Evas *e 
EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info);
 static void             _pager_desk_cb_mouse_move(void *data, Evas *e 
EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info);
 static void             _pager_desk_cb_drag_finished(E_Drag *drag, int 
dropped);
 static void             _pager_desk_cb_mouse_wheel(void *data, Evas *e 
EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info);
 static Eina_Bool        _pager_popup_cb_timeout(void *data);
-static Pager           *_pager_new(Evas *evas, E_Zone *zone, E_Gadcon *gc);
+static Pager           *_pager_new(Evas *evas);
 static void             _pager_free(Pager *p);
-static void             _pager_fill(Pager *p, E_Gadcon *gc);
+static void             _pager_fill(Pager *p);
+static void             _pager_orient(Instance *inst, E_Gadget_Site_Orient 
orient);
 static void             _pager_empty(Pager *p);
 static Pager_Desk      *_pager_desk_new(Pager *p, E_Desk *desk, int xpos, int 
ypos, Eina_Bool invert);
 static void             _pager_desk_free(Pager_Desk *pd);
-static Pager_Desk      *_pager_desk_at_coord(Pager *p, Evas_Coord x, 
Evas_Coord y);
 static void             _pager_desk_select(Pager_Desk *pd);
 static Pager_Desk      *_pager_desk_find(Pager *p, E_Desk *desk);
 static void             _pager_desk_switch(Pager_Desk *pd1, Pager_Desk *pd2);
 static Pager_Win       *_pager_window_new(Pager_Desk *pd, Evas_Object *mirror, 
E_Client *client);
 static void             _pager_window_free(Pager_Win *pw);
-static Pager_Popup     *_pager_popup_new(E_Zone *zone, int keyaction);
+static Pager_Popup     *pager_popup_new(int keyaction);
 static void             _pager_popup_free(Pager_Popup *pp);
 static Pager_Popup     *_pager_popup_find(E_Zone *zone);
 
@@ -156,19 +130,16 @@ static void             
_pager_popup_cb_action_show(E_Object *obj EINA_UNUSED, c
 static void             _pager_popup_cb_action_switch(E_Object *obj 
EINA_UNUSED, const char *params, Ecore_Event_Key *ev);
 
 /* variables for pager popup on key actions */
-static E_Action *act_popup_show = NULL;
-static E_Action *act_popup_switch = NULL;
 static Ecore_Window input_window = 0;
 static Eina_List *handlers = NULL;
 static Pager_Popup *act_popup = NULL; /* active popup */
 static int hold_count = 0;
 static int hold_mod = 0;
 static E_Desk *current_desk = NULL;
-static E_Config_DD *conf_edd = NULL;
 static Eina_List *pagers = NULL;
 
-Config *pager_config = NULL;
-
+static E_Action *act_popup_show = NULL;
+static E_Action *act_popup_switch = NULL;
 
 static Pager_Win *
 _pager_desk_window_find(Pager_Desk *pd, E_Client *client)
@@ -177,8 +148,12 @@ _pager_desk_window_find(Pager_Desk *pd, E_Client *client)
    Pager_Win *pw;
 
    EINA_LIST_FOREACH(pd->wins, l, pw)
-     if (pw->client == client) return pw;
-
+     {
+        if (pw)
+          {
+             if (pw->client == client) return pw;
+          }
+     }
    return NULL;
 }
 
@@ -198,120 +173,106 @@ _pager_window_find(Pager *p, E_Client *client)
    return NULL;
 }
 
-static E_Gadcon_Client *
-_gc_init(E_Gadcon *gc, const char *name, const char *id, const char *style)
+static void
+_pager_gadget_anchor_change_cb(void *data, Evas_Object *obj, void *event_info 
EINA_UNUSED)
 {
-   Pager *p;
-   Evas_Object *o;
-   E_Gadcon_Client *gcc;
-   Instance *inst;
-   Evas_Coord x, y, w, h;
-   const char *drop[] =
-   {
-      "enlightenment/pager_win", "enlightenment/border",
-      "enlightenment/vdesktop"
-   };
+   Instance *inst = data;
 
-   inst = E_NEW(Instance, 1);
+   _pager_orient(inst, e_gadget_site_orient_get(obj));
+   if (inst->pager && inst->o_pager)
+     {
+        _pager_empty(inst->pager);
+        _pager_fill(inst->pager);
+     }
+}
 
-   p = _pager_new(gc->evas, gc->zone, gc);
-   p->inst = inst;
-   inst->pager = p;
-   o = p->o_table;
-   gcc = e_gadcon_client_new(gc, name, id, style, o);
-   gcc->data = inst;
 
-   inst->gcc = gcc;
-   inst->o_pager = o;
+static void
+_pager_gadget_created_cb(void *data, Evas_Object *obj, void *event_info 
EINA_UNUSED)
+{
+   Instance *inst = data;
+   Eina_List *l;
+   Pager_Desk *pd;
 
-   evas_object_geometry_get(o, &x, &y, &w, &h);
-   p->drop_handler =
-     e_drop_handler_add(E_OBJECT(inst->gcc), NULL, p,
-                        _pager_drop_cb_enter, _pager_drop_cb_move,
-                        _pager_drop_cb_leave, _pager_drop_cb_drop,
-                        drop, 3, x, y, w, h);
-   evas_object_event_callback_add(o, EVAS_CALLBACK_MOVE,
-                                  _pager_cb_obj_moveresize, inst);
-   evas_object_event_callback_add(o, EVAS_CALLBACK_RESIZE,
-                                  _pager_cb_obj_moveresize, inst);
-   evas_object_event_callback_add(o, EVAS_CALLBACK_MOUSE_DOWN,
-                                  _button_cb_mouse_down, inst);
-   evas_object_event_callback_add(o, EVAS_CALLBACK_SHOW,
-                                  _pager_cb_obj_show, inst);
-   evas_object_event_callback_add(o, EVAS_CALLBACK_HIDE,
-                                  _pager_cb_obj_hide, inst);
-   pager_config->instances = eina_list_append(pager_config->instances, inst);
-   return gcc;
+   e_gadget_configure_cb_set(inst->o_pager, _pager_gadget_configure);
+   _pager_orient(inst, e_gadget_site_orient_get(obj));
+   if (inst->pager && inst->o_pager)
+     {
+        _pager_empty(inst->pager);
+        _pager_fill(inst->pager);
+        
+        EINA_LIST_FOREACH(inst->pager->desks, l, pd)
+          {
+             if (!pd->drop_handler)
+               {
+                  const char *drop[] =
+                  {
+                     "enlightenment/pager_win", "enlightenment/border",
+                     "enlightenment/vdesktop"
+                  };
+                  pd->drop_handler =
+                    e_gadget_drop_handler_add(inst->o_pager, pd,
+                             _pager_drop_cb_enter, _pager_drop_cb_move,
+                             _pager_drop_cb_leave, _pager_drop_cb_drop,
+                             drop, 3);
+                  //edje_object_part_swallow(pd->o_desk, "e.swallow.drop", 
pd->drop_handler);
+                  evas_object_show(pd->drop_handler);
+               }
+          }
+     }
+   evas_object_smart_callback_del_full(obj, "gadget_created", 
_pager_gadget_created_cb, data);
 }
 
 static void
-_gc_shutdown(E_Gadcon_Client *gcc)
+_pager_gadget_destroyed_cb(void *data, Evas_Object *obj EINA_UNUSED, void 
*event_info EINA_UNUSED)
 {
-   Instance *inst;
+   Instance *inst = data;
 
-   inst = gcc->data;
-   if (pager_config)
-     pager_config->instances = eina_list_remove(pager_config->instances, inst);
-   e_drop_handler_del(inst->pager->drop_handler);
-   _pager_free(inst->pager);
-   free(inst);
+   inst->destroyed = EINA_TRUE;
 }
 
 static void
-_gc_orient(E_Gadcon_Client *gcc, E_Gadcon_Orient orient EINA_UNUSED)
+_pager_orient(Instance *inst, E_Gadget_Site_Orient orient)
 {
-   Instance *inst;
    int aspect_w, aspect_h;
    double aspect_ratio;
 
-   inst = gcc->data;
+   if (inst->o_pager)
+     {
+        switch (orient)
+          {
+
+             case E_GADGET_SITE_ORIENT_HORIZONTAL:
+                inst->pager->invert = EINA_FALSE;
+                break;
+             case E_GADGET_SITE_ORIENT_VERTICAL:
+                inst->pager->invert = EINA_TRUE;
+                break;
+             case E_GADGET_SITE_ORIENT_NONE:
+                inst->pager->invert = EINA_TRUE;
+                break;
+             default:
+                inst->pager->invert = EINA_FALSE;
+          }
+     }
    if (inst->pager->invert)
      {
         aspect_w = inst->pager->ynum * inst->pager->zone->w;
         aspect_h = inst->pager->xnum * inst->pager->zone->h;
+        evas_object_size_hint_aspect_set(inst->o_pager, 
EVAS_ASPECT_CONTROL_HORIZONTAL, aspect_w, aspect_h);
      }
    else
      {
         aspect_w = inst->pager->xnum * inst->pager->zone->w;
         aspect_h = inst->pager->ynum * inst->pager->zone->h;
+        evas_object_size_hint_aspect_set(inst->o_pager, 
EVAS_ASPECT_CONTROL_VERTICAL, aspect_w, aspect_h);
      }
-
-   e_gadcon_client_aspect_set(gcc, aspect_w, aspect_h);
    aspect_ratio = (double)aspect_w / (double)aspect_h;
 
    if (aspect_ratio > 1.0)
-     e_gadcon_client_min_size_set(gcc, 4 * aspect_ratio, 4);
+     evas_object_size_hint_min_set(inst->o_pager, 4 * aspect_ratio, 4);
    else
-     e_gadcon_client_min_size_set(gcc, 4, 4 * aspect_ratio);
-}
-
-static const char *
-_gc_label(const E_Gadcon_Client_Class *client_class EINA_UNUSED)
-{
-   return _("Pager");
-}
-
-static Evas_Object *
-_gc_icon(const E_Gadcon_Client_Class *client_class EINA_UNUSED, Evas *evas)
-{
-   Evas_Object *o;
-   char buf[PATH_MAX];
-
-   o = edje_object_add(evas);
-   snprintf(buf, sizeof(buf), "%s/e-module-pager.edj",
-            e_module_dir_get(pager_config->module));
-   edje_object_file_set(o, buf, "icon");
-   return o;
-}
-
-static const char *
-_gc_id_new(const E_Gadcon_Client_Class *client_class)
-{
-   static char buf[4096];
-
-   snprintf(buf, sizeof(buf), "%s.%d", client_class->name,
-            eina_list_count(pager_config->instances) + 1);
-   return buf;
+     evas_object_size_hint_min_set(inst->o_pager, 4, 4 * aspect_ratio);
 }
 
 static void
@@ -337,12 +298,13 @@ _pager_recalc(void *data)
      }
    w = w2; h = h2;
    w += mw; h += mh;
-   if ((p->inst) && (p->inst->gcc))
+   if ((p->inst) && (p->inst->o_pager))
      {
+        _pager_orient(p->inst, 
e_gadget_site_orient_get(e_gadget_site_get(p->inst->o_pager)));
         if (p->invert)
-          e_gadcon_client_aspect_set(p->inst->gcc, p->ynum * w, p->xnum * h);
+          evas_object_size_hint_min_set(p->inst->o_pager, p->ynum * w, p->xnum 
* h);
         else
-          e_gadcon_client_aspect_set(p->inst->gcc, p->xnum * w, p->ynum * h);
+          evas_object_size_hint_min_set(p->inst->o_pager, p->xnum * w, p->ynum 
* h);
      }
 }
 
@@ -356,7 +318,7 @@ _pager_resize(void *data, Evas *e EINA_UNUSED, Evas_Object 
*obj EINA_UNUSED, voi
 }
 
 static Pager *
-_pager_new(Evas *evas, E_Zone *zone, E_Gadcon *gc)
+_pager_new(Evas *evas)
 {
    Pager *p;
 
@@ -366,8 +328,8 @@ _pager_new(Evas *evas, E_Zone *zone, E_Gadcon *gc)
    p->o_table = elm_table_add(e_win_evas_win_get(evas));
    evas_object_event_callback_add(p->o_table, EVAS_CALLBACK_RESIZE, 
_pager_resize, p);
    elm_table_homogeneous_set(p->o_table, 1);
-   p->zone = zone;
-   _pager_fill(p, gc);
+   p->zone = e_comp_object_util_zone_get(p->o_table);
+   _pager_fill(p);
    pagers = eina_list_append(pagers, p);
    return p;
 }
@@ -383,34 +345,28 @@ _pager_free(Pager *p)
 }
 
 static void
-_pager_fill(Pager *p, E_Gadcon *gc)
+_pager_fill(Pager *p)
 {
    int x, y;
+   E_Gadget_Site_Orient orient;
 
-   if (gc)
+   if (p->inst && p->inst->o_pager)
      {
-        switch (gc->orient)
+        orient = e_gadget_site_orient_get(e_gadget_site_get(p->inst->o_pager));
+        switch (orient)
           {
 
-             case E_GADCON_ORIENT_TOP:
-             case E_GADCON_ORIENT_BOTTOM:
-             case E_GADCON_ORIENT_CORNER_TL:
-             case E_GADCON_ORIENT_CORNER_TR:
-             case E_GADCON_ORIENT_CORNER_BL:
-             case E_GADCON_ORIENT_CORNER_BR:
-             case E_GADCON_ORIENT_HORIZ:
-             case E_GADCON_ORIENT_FLOAT:
-               p->invert = EINA_FALSE;
-               break;
-             case E_GADCON_ORIENT_VERT:
-             case E_GADCON_ORIENT_LEFT:
-             case E_GADCON_ORIENT_RIGHT:
-             case E_GADCON_ORIENT_CORNER_LT:
-             case E_GADCON_ORIENT_CORNER_RT:
-             case E_GADCON_ORIENT_CORNER_LB:
-             case E_GADCON_ORIENT_CORNER_RB:
+             case E_GADGET_SITE_ORIENT_HORIZONTAL:
+                p->invert = EINA_FALSE;
+                break;
+             case E_GADGET_SITE_ORIENT_VERTICAL:
+                p->invert = EINA_TRUE;
+                break;
+             case E_GADGET_SITE_ORIENT_NONE:
+                p->invert = EINA_TRUE;
+                break;
              default:
-               p->invert = EINA_TRUE;
+                p->invert = EINA_FALSE;
           }
      }
    e_zone_desk_count_get(p->zone, &(p->xnum), &(p->ynum));
@@ -453,6 +409,11 @@ _pager_desk_new(Pager *p, E_Desk *desk, int xpos, int 
ypos, Eina_Bool invert)
    Eina_List *l;
    int w, h;
    Evas *e;
+   const char *drop[] =
+   {
+      "enlightenment/pager_win", "enlightenment/border",
+      "enlightenment/vdesktop"
+   };
 
    if (!desk) return NULL;
    pd = E_NEW(Pager_Desk, 1);
@@ -464,6 +425,7 @@ _pager_desk_new(Pager *p, E_Desk *desk, int xpos, int ypos, 
Eina_Bool invert)
    pd->desk = desk;
    e_object_ref(E_OBJECT(desk));
    pd->pager = p;
+   pd->drop_handler = NULL;
 
    e = evas_object_evas_get(p->o_table);
    o = edje_object_add(e);
@@ -476,6 +438,7 @@ _pager_desk_new(Pager *p, E_Desk *desk, int xpos, int ypos, 
Eina_Bool invert)
 
    edje_object_size_min_calc(o, &w, &h);
    evas_object_size_hint_min_set(o, w, h);
+
    E_EXPAND(o);
    E_FILL(o);
    if (invert)
@@ -514,6 +477,17 @@ _pager_desk_new(Pager *p, E_Desk *desk, int xpos, int 
ypos, Eina_Bool invert)
    edje_object_part_swallow(pd->o_desk, "e.swallow.content", pd->o_layout);
    evas_object_show(pd->o_layout);
 
+   if (pd->pager->inst)
+     {
+        pd->drop_handler =
+           e_gadget_drop_handler_add(p->inst->o_pager, pd,
+                        _pager_drop_cb_enter, _pager_drop_cb_move,
+                        _pager_drop_cb_leave, _pager_drop_cb_drop,
+                        drop, 3);
+        edje_object_part_swallow(pd->o_desk, "e.swallow.drop", 
pd->drop_handler);
+        evas_object_show(pd->drop_handler);
+     }
+
    return pd;
 }
 
@@ -521,7 +495,10 @@ static void
 _pager_desk_free(Pager_Desk *pd)
 {
    Pager_Win *w;
-
+   
+   if (pd->drop_handler)
+     evas_object_del(pd->drop_handler);
+   pd->drop_handler = NULL;
    evas_object_del(pd->o_desk);
    evas_object_del(pd->o_layout);
    EINA_LIST_FREE(pd->wins, w)
@@ -530,22 +507,6 @@ _pager_desk_free(Pager_Desk *pd)
    free(pd);
 }
 
-static Pager_Desk *
-_pager_desk_at_coord(Pager *p, Evas_Coord x, Evas_Coord y)
-{
-   Eina_List *l;
-   Pager_Desk *pd;
-
-   EINA_LIST_FOREACH(p->desks, l, pd)
-     {
-        Evas_Coord dx, dy, dw, dh;
-
-        evas_object_geometry_get(pd->o_desk, &dx, &dy, &dw, &dh);
-        if (E_INSIDE(x, y, dx, dy, dw, dh)) return pd;
-     }
-   return NULL;
-}
-
 static void
 _pager_desk_select(Pager_Desk *pd)
 {
@@ -741,20 +702,21 @@ _pager_popup_cb_del(void *data, Evas *e EINA_UNUSED, 
Evas_Object *obj EINA_UNUSE
 }
 
 static Pager_Popup *
-_pager_popup_new(E_Zone *zone, int keyaction)
+pager_popup_new(int keyaction)
 {
    Pager_Popup *pp;
    Evas_Coord w, h, zx, zy, zw, zh;
    int x, y, height, width;
    E_Desk *desk;
    Pager_Desk *pd;
+   E_Zone *zone = e_zone_current_get();
 
    pp = E_NEW(Pager_Popup, 1);
    if (!pp) return NULL;
 
    /* Show popup */
 
-   pp->pager = _pager_new(e_comp->evas, zone, NULL);
+   pp->pager = _pager_new(e_comp->evas);
    
    pp->pager->popup = pp;
    pp->urgent = 0;
@@ -789,7 +751,7 @@ _pager_popup_new(E_Zone *zone, int keyaction)
    evas_object_resize(pp->pager->o_table, width, height);
 
    pp->o_bg = edje_object_add(e_comp->evas);
-   evas_object_name_set(pp->o_bg, "pager_popup");
+   evas_object_name_set(pp->o_bg, "pager_gadget_popup");
    e_theme_edje_object_set(pp->o_bg, "base/theme/modules/pager",
                            "e/modules/pager16/popup");
    desk = e_desk_current_get(zone);
@@ -857,89 +819,29 @@ _pager_cb_obj_show(void *data, Evas *e EINA_UNUSED, 
Evas_Object *obj EINA_UNUSED
        edje_object_signal_emit(pd->o_desk, "e,state,visible", "e");
 }
 
-static void
-_pager_cb_obj_moveresize(void *data, Evas *e EINA_UNUSED, Evas_Object *obj 
EINA_UNUSED, void *event_info EINA_UNUSED)
+static Evas_Object *
+_pager_gadget_configure(Evas_Object *g)
 {
-   Instance *inst;
-
-   inst = data;
-   _pager_instance_drop_zone_recalc(inst);
+   if (!pager_config) return NULL;
+   if (cfg_dialog) return NULL;
+   return config_pager(e_comp_object_util_zone_get(g));
 }
 
 static void
 _button_cb_mouse_down(void *data, Evas *e EINA_UNUSED, Evas_Object *obj 
EINA_UNUSED, void *event_info)
 {
-   Instance *inst;
-   Evas_Event_Mouse_Down *ev;
-   E_Menu *m;
-   E_Menu_Item *mi;
-   int cx, cy;
+   Instance *inst = data;
+   Evas_Event_Mouse_Down *ev = event_info;
 
-   inst = data;
-   ev = event_info;
+   if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD) return;
    if (ev->button != 3) return;
-   if (inst->gcc->menu) return;
-
-   m = e_menu_new();
-   mi = e_menu_item_new(m);
-   e_menu_item_label_set(mi, _("Settings"));
-   e_util_menu_item_theme_icon_set(mi, "configure");
-   e_menu_item_callback_set(mi, _pager_inst_cb_menu_configure, NULL);
-
-   m = e_gadcon_client_util_menu_items_append(inst->gcc, m, 0);
-   if (e_configure_registry_exists("screen/virtual_desktops"))
-     {
-        mi = e_menu_item_new_relative(m, NULL);
-        e_menu_item_label_set(mi, _("Virtual Desktops Settings"));
-        e_util_menu_item_theme_icon_set(mi, "preferences-desktop");
-        e_menu_item_callback_set(mi, 
_pager_inst_cb_menu_virtual_desktops_dialog, inst);
-     }
-
-   e_gadcon_canvas_zone_geometry_get(inst->gcc->gadcon, &cx, &cy,
-                                     NULL, NULL);
-   e_menu_activate_mouse(m, e_zone_current_get(),
-                         cx + ev->output.x, cy + ev->output.y, 1, 1,
-                         E_MENU_POP_DIRECTION_DOWN, ev->timestamp);
-   evas_event_feed_mouse_up(inst->gcc->gadcon->evas, ev->button,
-                            EVAS_BUTTON_NONE, ev->timestamp, NULL);
-}
-
-static void
-_pager_inst_cb_menu_configure(void *data EINA_UNUSED, E_Menu *m EINA_UNUSED, 
E_Menu_Item *mi EINA_UNUSED)
-{
-   if (!pager_config) return;
-   if (pager_config->config_dialog) return;
-   /* FIXME: pass zone config item */
-   _config_pager_module(NULL);
-}
-
-static E_Config_Dialog *
-_pager_config_dialog(Evas_Object *parent EINA_UNUSED, const char *params 
EINA_UNUSED)
-{
-   if (!pager_config) return NULL;
-   if (pager_config->config_dialog) return NULL;
-   /* FIXME: pass zone config item */
-   _config_pager_module(NULL);
-   return pager_config->config_dialog;
-}
-
-static void
-_pager_inst_cb_menu_virtual_desktops_dialog(void *data EINA_UNUSED, E_Menu *m 
EINA_UNUSED, E_Menu_Item *mi EINA_UNUSED)
-{
-   e_configure_registry_call("screen/virtual_desktops", NULL, NULL);
-}
-
-static void
-_pager_instance_drop_zone_recalc(Instance *inst)
-{
-   Evas_Coord x, y, w, h;
-
-   e_gadcon_client_viewport_geometry_get(inst->gcc, &x, &y, &w, &h);
-   e_drop_handler_geometry_set(inst->pager->drop_handler, x, y, w, h);
+   if(!pager_config) return;
+   if (cfg_dialog) return;
+   e_gadget_configure(inst->o_pager);
 }
 
 EINTERN void
-_pager_cb_config_updated(void)
+_pager_cb_config_gadget_updated(void)
 {
    Pager *p;
    Pager_Desk *pd;
@@ -979,8 +881,8 @@ _pager_cb_event_zone_desk_count_set(void *data EINA_UNUSED, 
int type EINA_UNUSED
         if ((ev->zone->desk_x_count == p->xnum) &&
             (ev->zone->desk_y_count == p->ynum)) continue;
         _pager_empty(p);
-        _pager_fill(p, p->inst ? p->inst->gcc->gadcon : NULL);
-        if (p->inst) _gc_orient(p->inst->gcc, p->inst->gcc->gadcon->orient);
+        _pager_fill(p);
+        if (p->inst) _pager_orient(p->inst, 
e_gadget_site_orient_get(e_gadget_site_get(p->inst->o_pager)));
      }
 
    return ECORE_CALLBACK_PASS_ON;
@@ -1010,7 +912,7 @@ _pager_cb_event_desk_show(void *data EINA_UNUSED, int type 
EINA_UNUSED, void *ev
         if ((pp = _pager_popup_find(ev->desk->zone)))
           evas_object_show(pp->popup);
         else
-          pp = _pager_popup_new(ev->desk->zone, 0);
+          pp = pager_popup_new(0);
         if (pp->timer)
           ecore_timer_reset(pp->timer);
         else
@@ -1065,7 +967,7 @@ _pager_cb_event_client_urgent_change(void *data 
EINA_UNUSED, int type EINA_UNUSE
 
         if ((!pp) && (ev->ec->urgent || ev->ec->icccm.urgent) && 
(!ev->ec->iconic))
           {
-             pp = _pager_popup_new(ev->ec->zone, 0);
+             pp = pager_popup_new(0);
              if (!pp) return ECORE_CALLBACK_RENEW;
 
              if (!pager_config->popup_urgent_stick)
@@ -1092,7 +994,7 @@ _pager_cb_event_compositor_resize(void *data EINA_UNUSED, 
int type EINA_UNUSED,
           e_layout_virtual_size_set(pd->o_layout, pd->desk->zone->w,
                                     pd->desk->zone->h);
 
-        if (p->inst) _gc_orient(p->inst->gcc, p->inst->gcc->gadcon->orient);
+        if (p->inst) _pager_orient(p->inst, 
e_gadget_site_orient_get(e_gadget_site_get(p->inst->o_pager)));
         /* TODO if (p->popup) */
      }
 
@@ -1184,7 +1086,6 @@ _pager_window_cb_mouse_move(void *data, Evas *e 
EINA_UNUSED, Evas_Object *obj EI
    pw->drag.start = 0;
    e_comp_object_effect_clip(pw->client->frame);
    edje_object_signal_emit(pw->desk->o_desk, "e,action,drag,in", "e");
-   pw->desk->pager->active_drop_pd = pw->desk;
 
    evas_object_geometry_get(pw->o_mirror, &x, &y, &w, &h);
    evas_object_hide(pw->o_mirror);
@@ -1270,12 +1171,6 @@ _pager_window_cb_drag_finished(E_Drag *drag, int dropped)
           evas_object_raise(pw->client->frame);
         evas_object_focus_set(pw->client->frame, 1);
      }
-   if (p->active_drop_pd)
-     {
-        edje_object_signal_emit(p->active_drop_pd->o_desk, 
"e,action,drag,out", "e");
-        if (!pw->drag.start) p->active_drop_pd->pager->just_dragged = 1;
-        p->active_drop_pd = NULL;
-     }
    edje_object_signal_emit(pw->desk->o_desk, "e,action,drag,out", "e");
    if (!pw->drag.from_pager)
      {
@@ -1298,38 +1193,14 @@ _pager_window_cb_drag_finished(E_Drag *drag, int 
dropped)
 }
 
 static void
-_pager_inst_cb_scroll(void *data)
+_pager_update_drop_position(Pager *p, Pager_Desk *pd, Evas_Coord x, Evas_Coord 
y)
 {
-   Pager *p;
-
-   p = data;
-   _pager_update_drop_position(p, p->dnd_x, p->dnd_y);
-}
-
-static void
-_pager_update_drop_position(Pager *p, Evas_Coord x, Evas_Coord y)
-{
-   Pager_Desk *pd;
    Pager_Win *pw = NULL;
-   Eina_Bool changed;
 
-   p->dnd_x = x;
-   p->dnd_y = y;
-   pd = _pager_desk_at_coord(p, x, y);
-   changed = (pd != p->active_drop_pd);
-   if (changed)
-     {
-        if (pd)
-          edje_object_signal_emit(pd->o_desk, "e,action,drag,in", "e");
-        if (p->active_drop_pd)
-          edje_object_signal_emit(p->active_drop_pd->o_desk, 
"e,action,drag,out", "e");
-        p->active_drop_pd = pd;
-     }
    if (pd)
      pw = _pager_desk_window_find(pd, p->active_drag_client);
-   if (!pw)
+   else
      pw = _pager_window_find(p, p->active_drag_client);
-
    if (!pw) return;
    if (pd)
      {
@@ -1361,70 +1232,56 @@ _pager_update_drop_position(Pager *p, Evas_Coord x, 
Evas_Coord y)
 static void
 _pager_drop_cb_enter(void *data, const char *type EINA_UNUSED, void 
*event_info EINA_UNUSED)
 {
-   Pager *p = data;
+   Pager_Desk *pd = data;
 
    /* FIXME this fixes a segv, but the case is not easy
     * reproduceable. this makes no sense either since
     * the same 'pager' is passed to e_drop_handler_add
     * and it works without this almost all the time.
     * so this must be an issue with e_dnd code... i guess */
-   if (act_popup) p = act_popup->pager;
-
-   if (p->inst)
-     e_gadcon_client_autoscroll_cb_set(p->inst->gcc, _pager_inst_cb_scroll, p);
+   if (act_popup) return;
+   edje_object_signal_emit(pd->o_desk, "e,action,drag,in", "e");
 }
 
 static void
 _pager_drop_cb_move(void *data, const char *type EINA_UNUSED, void *event_info)
 {
    E_Event_Dnd_Move *ev;
-   Pager *p;
+   Pager_Desk *pd;
 
    ev = event_info;
-   p = data;
-
-   if (act_popup) p = act_popup->pager;
-
-   _pager_update_drop_position(p, ev->x, ev->y);
+   pd = data;
 
-   if (p->inst)
-     e_gadcon_client_autoscroll_update(p->inst->gcc, ev->x, ev->y);
+   if (act_popup) return;
+   _pager_update_drop_position(pd->pager, pd, ev->x, ev->y);
 }
 
 static void
 _pager_drop_cb_leave(void *data, const char *type EINA_UNUSED, void 
*event_info EINA_UNUSED)
 {
-   Pager *p = data;
-
-   if (act_popup) p = act_popup->pager;
+   Pager_Desk *pd = data;
 
-   if (p->active_drop_pd)
-     edje_object_signal_emit(p->active_drop_pd->o_desk, "e,action,drag,out", 
"e");
-   p->active_drop_pd = NULL;
-
-   if (p->inst) e_gadcon_client_autoscroll_cb_set(p->inst->gcc, NULL, NULL);
+   if (act_popup) return;
+   edje_object_signal_emit(pd->o_desk, "e,action,drag,out", "e");
 }
 
 static void
 _pager_drop_cb_drop(void *data, const char *type, void *event_info)
 {
    E_Event_Dnd_Drop *ev;
+   Eina_List *l;
    Pager_Desk *pd;
    Pager_Desk *pd2 = NULL;
    E_Client *ec = NULL;
-   Eina_List *l;
    int dx = 0, dy = 0;
    Pager_Win *pw = NULL;
    Evas_Coord wx, wy, wx2, wy2;
    Evas_Coord nx, ny;
-   Pager *p;
-
    ev = event_info;
-   p = data;
+   pd = data;
 
-   if (act_popup) p = act_popup->pager;
+   if (act_popup) return;
 
-   pd = _pager_desk_at_coord(p, ev->x, ev->y);
    if (pd)
      {
         if (!strcmp(type, "enlightenment/pager_win"))
@@ -1489,18 +1346,10 @@ _pager_drop_cb_drop(void *data, const char *type, void 
*event_info)
              if (fullscreen) e_client_fullscreen(ec, fs);
           }
      }
-
-   EINA_LIST_FOREACH(p->desks, l, pd)
+   EINA_LIST_FOREACH(pd->pager->desks, l, pd)
      {
-        if (!p->active_drop_pd) break;
-        if (pd == p->active_drop_pd)
-          {
-             edje_object_signal_emit(pd->o_desk, "e,action,drag,out", "e");
-             p->active_drop_pd = NULL;
-          }
+        edje_object_signal_emit(pd->o_desk, "e,action,drag,out", "e");
      }
-
-   if (p->inst) e_gadcon_client_autoscroll_cb_set(p->inst->gcc, NULL, NULL);
 }
 
 static void
@@ -1553,7 +1402,6 @@ _pager_desk_cb_mouse_up(void *data, Evas *e EINA_UNUSED, 
Evas_Object *obj EINA_U
         e_desk_show(pd->desk);
         pd->drag.start = 0;
         pd->drag.in_pager = 0;
-        p->active_drop_pd = NULL;
      }
    else if (ev->button == (int)pager_config->btn_desk)
      {
@@ -1646,11 +1494,7 @@ _pager_desk_cb_drag_finished(E_Drag *drag, int dropped)
         pd->drag.from_pager->dragging = 0;
         pd->drag.from_pager->just_dragged = 0;
      }
-   if (pd->pager->active_drop_pd)
-     {
-        edje_object_signal_emit(pd->pager->active_drop_pd->o_desk, 
"e,action,drag,out", "e");
-        pd->pager->active_drop_pd = NULL;
-     }
+   edje_object_signal_emit(pd->o_desk, "e,action,drag,out", "e");
    pd->drag.from_pager = NULL;
 
    if (act_popup)
@@ -1757,7 +1601,7 @@ _pager_popup_show(void)
        (handlers, ecore_event_handler_add
          (ECORE_EVENT_MOUSE_WHEEL, _pager_popup_cb_mouse_wheel, NULL));
 
-   act_popup = _pager_popup_new(zone, 1);
+   act_popup = pager_popup_new(0);
 
    evas_object_geometry_get(act_popup->pager->o_table, &x, &y, &w, &h);
 
@@ -1934,7 +1778,7 @@ _pager_popup_cb_key_down(void *data EINA_UNUSED, int type 
EINA_UNUSED, void *eve
           {
              E_Binding_Modifier mod = 0;
 
-             if ((binding->action) && (strcmp(binding->action, 
"pager_switch")))
+             if ((binding->action) && (strcmp(binding->action, 
"pager_gadget_switch")))
                continue;
 
              if (ev->modifiers & ECORE_EVENT_MODIFIER_SHIFT)
@@ -2028,147 +1872,79 @@ _pager_popup_cb_key_up(void *data EINA_UNUSED, int 
type EINA_UNUSED, void *event
    return ECORE_CALLBACK_PASS_ON;
 }
 
-/***************************************************************************/
-/* module setup */
-E_API E_Module_Api e_modapi =
+static void
+pager_del(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void 
*event_info EINA_UNUSED)
 {
-   E_MODULE_API_VERSION, "Pager"
-};
+   Instance *inst = data;
+
+   _pager_free(inst->pager);
+   ginstances = eina_list_remove(ginstances, inst);
+   free(inst);
+}
 
-E_API void *
-e_modapi_init(E_Module *m)
+EINTERN Evas_Object *
+pager_create(Evas_Object *parent, int *id EINA_UNUSED, E_Gadget_Site_Orient 
orient EINA_UNUSED)
 {
-   E_Module *p;
+   Pager *p;
+   Evas_Object *o;
+   Instance *inst;
 
-   p = e_module_find("pager_plain");
-   if (p && p->enabled)
-     {
-        e_util_dialog_show(_("Error"), _("Pager module cannot be loaded at the 
same time as Pager Plain!"));
-        return NULL;
-     }
-   conf_edd = E_CONFIG_DD_NEW("Pager_Config", Config);
-#undef T
-#undef D
-#define T Config
-#define D conf_edd
-   E_CONFIG_VAL(D, T, popup, UINT);
-   E_CONFIG_VAL(D, T, popup_speed, DOUBLE);
-   E_CONFIG_VAL(D, T, popup_urgent, UINT);
-   E_CONFIG_VAL(D, T, popup_urgent_stick, UINT);
-   E_CONFIG_VAL(D, T, popup_urgent_speed, DOUBLE);
-   E_CONFIG_VAL(D, T, show_desk_names, UINT);
-   E_CONFIG_VAL(D, T, popup_height, INT);
-   E_CONFIG_VAL(D, T, popup_act_height, INT);
-   E_CONFIG_VAL(D, T, drag_resist, UINT);
-   E_CONFIG_VAL(D, T, btn_drag, UCHAR);
-   E_CONFIG_VAL(D, T, btn_noplace, UCHAR);
-   E_CONFIG_VAL(D, T, btn_desk, UCHAR);
-   E_CONFIG_VAL(D, T, flip_desk, UCHAR);
-
-   pager_config = e_config_domain_load("module.pager", conf_edd);
-
-   if (!pager_config)
-     {
-        pager_config = E_NEW(Config, 1);
-        pager_config->popup = 1;
-        pager_config->popup_speed = 1.0;
-        pager_config->popup_urgent = 0;
-        pager_config->popup_urgent_stick = 0;
-        pager_config->popup_urgent_speed = 1.5;
-        pager_config->show_desk_names = 0;
-        pager_config->popup_height = 60;
-        pager_config->popup_act_height = 60;
-        pager_config->drag_resist = 3;
-        pager_config->btn_drag = 1;
-        pager_config->btn_noplace = 2;
-        pager_config->btn_desk = 2;
-        pager_config->flip_desk = 0;
-     }
-   E_CONFIG_LIMIT(pager_config->popup, 0, 1);
-   E_CONFIG_LIMIT(pager_config->popup_speed, 0.1, 10.0);
-   E_CONFIG_LIMIT(pager_config->popup_urgent, 0, 1);
-   E_CONFIG_LIMIT(pager_config->popup_urgent_stick, 0, 1);
-   E_CONFIG_LIMIT(pager_config->popup_urgent_speed, 0.1, 10.0);
-   E_CONFIG_LIMIT(pager_config->show_desk_names, 0, 1);
-   E_CONFIG_LIMIT(pager_config->popup_height, 20, 200);
-   E_CONFIG_LIMIT(pager_config->popup_act_height, 20, 200);
-   E_CONFIG_LIMIT(pager_config->drag_resist, 0, 50);
-   E_CONFIG_LIMIT(pager_config->flip_desk, 0, 1);
-   E_CONFIG_LIMIT(pager_config->btn_drag, 0, 32);
-   E_CONFIG_LIMIT(pager_config->btn_noplace, 0, 32);
-   E_CONFIG_LIMIT(pager_config->btn_desk, 0, 32);
-
-   E_LIST_HANDLER_APPEND(pager_config->handlers, E_EVENT_ZONE_DESK_COUNT_SET, 
_pager_cb_event_zone_desk_count_set, NULL);
-   E_LIST_HANDLER_APPEND(pager_config->handlers, E_EVENT_DESK_SHOW, 
_pager_cb_event_desk_show, NULL);
-   E_LIST_HANDLER_APPEND(pager_config->handlers, E_EVENT_DESK_NAME_CHANGE, 
_pager_cb_event_desk_name_change, NULL);
-   E_LIST_HANDLER_APPEND(pager_config->handlers, E_EVENT_COMPOSITOR_RESIZE, 
_pager_cb_event_compositor_resize, NULL);
-   E_LIST_HANDLER_APPEND(pager_config->handlers, E_EVENT_CLIENT_PROPERTY, 
_pager_cb_event_client_urgent_change, NULL);
-
-   pager_config->module = m;
-
-   e_gadcon_provider_register(&_gadcon_class);
-
-   e_configure_registry_item_add("extensions/pager", 40, _("Pager"), NULL,
-                                 "preferences-pager", _pager_config_dialog);
-
-   act_popup_show = e_action_add("pager_show");
+   inst = E_NEW(Instance, 1);
+   p = _pager_new(evas_object_evas_get(parent));
+   p->inst = inst;
+   inst->pager = p;
+   o = p->o_table;
+   inst->o_pager = o;
+   inst->destroyed = EINA_FALSE;
+   _pager_orient(inst, e_gadget_site_orient_get(parent));
+
+   evas_object_event_callback_add(o, EVAS_CALLBACK_DEL, pager_del, inst);
+   evas_object_smart_callback_add(parent, "gadget_created", 
_pager_gadget_created_cb, inst);
+   evas_object_smart_callback_add(parent, "gadget_site_anchor", 
_pager_gadget_anchor_change_cb, inst);
+   evas_object_smart_callback_add(parent, "gadget_destroyed", 
_pager_gadget_destroyed_cb, inst);
+
+   evas_object_event_callback_add(o, EVAS_CALLBACK_MOUSE_DOWN,
+                                  _button_cb_mouse_down, inst);
+   evas_object_event_callback_add(o, EVAS_CALLBACK_SHOW,
+                                  _pager_cb_obj_show, inst);
+   evas_object_event_callback_add(o, EVAS_CALLBACK_HIDE,
+                                  _pager_cb_obj_hide, inst);
+   ginstances = eina_list_append(ginstances, inst);
+   return inst->o_pager;
+}
+
+EINTERN void
+pager_init(void)
+{
+   E_LIST_HANDLER_APPEND(ghandlers, E_EVENT_ZONE_DESK_COUNT_SET, 
_pager_cb_event_zone_desk_count_set, NULL);
+   E_LIST_HANDLER_APPEND(ghandlers, E_EVENT_DESK_SHOW, 
_pager_cb_event_desk_show, NULL);
+   E_LIST_HANDLER_APPEND(ghandlers, E_EVENT_DESK_NAME_CHANGE, 
_pager_cb_event_desk_name_change, NULL);
+   E_LIST_HANDLER_APPEND(ghandlers, E_EVENT_COMPOSITOR_RESIZE, 
_pager_cb_event_compositor_resize, NULL);
+   E_LIST_HANDLER_APPEND(ghandlers, E_EVENT_CLIENT_PROPERTY, 
_pager_cb_event_client_urgent_change, NULL);
+
+   act_popup_show = e_action_add("pager_gadget_show");
    if (act_popup_show)
      {
         act_popup_show->func.go_key = _pager_popup_cb_action_show;
-        e_action_predef_name_set(N_("Pager"), N_("Show Pager Popup"),
-                                 "pager_show", "<none>", NULL, 0);
+        e_action_predef_name_set(N_("Pager Gadget"), N_("Show Pager Popup"),
+                                 "pager_gadget_show", "<none>", NULL, 0);
      }
-   act_popup_switch = e_action_add("pager_switch");
+   act_popup_switch = e_action_add("pager_gadget_switch");
    if (act_popup_switch)
      {
         act_popup_switch->func.go_key = _pager_popup_cb_action_switch;
-        e_action_predef_name_set(N_("Pager"), N_("Popup Desk Right"),
-                                 "pager_switch", "right", NULL, 0);
-        e_action_predef_name_set(N_("Pager"), N_("Popup Desk Left"),
-                                 "pager_switch", "left", NULL, 0);
-        e_action_predef_name_set(N_("Pager"), N_("Popup Desk Up"),
-                                 "pager_switch", "up", NULL, 0);
-        e_action_predef_name_set(N_("Pager"), N_("Popup Desk Down"),
-                                 "pager_switch", "down", NULL, 0);
-        e_action_predef_name_set(N_("Pager"), N_("Popup Desk Next"),
-                                 "pager_switch", "next", NULL, 0);
-        e_action_predef_name_set(N_("Pager"), N_("Popup Desk Previous"),
-                                 "pager_switch", "prev", NULL, 0);
+        e_action_predef_name_set(N_("Pager Gadget"), N_("Popup Desk Right"),
+                                 "pager_gadget_switch", "right", NULL, 0);
+        e_action_predef_name_set(N_("Pager Gadget"), N_("Popup Desk Left"),
+                                 "pager_gadget_switch", "left", NULL, 0);
+        e_action_predef_name_set(N_("Pager Gadget"), N_("Popup Desk Up"),
+                                 "pager_gadget_switch", "up", NULL, 0);
+        e_action_predef_name_set(N_("Pager Gadget"), N_("Popup Desk Down"),
+                                 "pager_gadget_switch", "down", NULL, 0);
+        e_action_predef_name_set(N_("Pager Gadget"), N_("Popup Desk Next"),
+                                 "pager_gadget_switch", "next", NULL, 0);
+        e_action_predef_name_set(N_("Pager Gadget"), N_("Popup Desk Previous"),
+                                 "pager_gadget_switch", "prev", NULL, 0);
      }
-
-   return m;
-}
-
-E_API int
-e_modapi_shutdown(E_Module *m EINA_UNUSED)
-{
-   e_gadcon_provider_unregister(&_gadcon_class);
-
-   if (pager_config->config_dialog)
-     e_object_del(E_OBJECT(pager_config->config_dialog));
-   E_FREE_LIST(pager_config->handlers, ecore_event_handler_del);
-
-   e_configure_registry_item_del("extensions/pager");
-
-   e_action_del("pager_show");
-   e_action_del("pager_switch");
-
-   e_action_predef_name_del("Pager", "Popup Desk Right");
-   e_action_predef_name_del("Pager", "Popup Desk Left");
-   e_action_predef_name_del("Pager", "Popup Desk Up");
-   e_action_predef_name_del("Pager", "Popup Desk Down");
-   e_action_predef_name_del("Pager", "Popup Desk Next");
-   e_action_predef_name_del("Pager", "Popup Desk Previous");
-
-   E_FREE(pager_config);
-   E_CONFIG_DD_FREE(conf_edd);
-   return 1;
-}
-
-E_API int
-e_modapi_save(E_Module *m EINA_UNUSED)
-{
-   e_config_domain_save("module.pager", conf_edd, pager_config);
-   return 1;
 }
 
diff --git a/src/modules/pager/gadget/pager.h b/src/modules/pager/gadget/pager.h
new file mode 100644
index 0000000..b75c53b
--- /dev/null
+++ b/src/modules/pager/gadget/pager.h
@@ -0,0 +1,50 @@
+#ifndef PAGER_H
+#define PAGER_H
+
+#include "e.h"
+
+E_API void *e_modapi_gadget_init(E_Module *m);
+E_API int   e_modapi_gadget_shutdown(E_Module *m);
+E_API int   e_modapi_gadget_save(E_Module *m);
+
+typedef struct _Config Config;
+struct _Config
+{
+   unsigned int popup;
+   double       popup_speed;
+   unsigned int popup_urgent;
+   unsigned int popup_urgent_stick;
+   unsigned int popup_urgent_focus;
+   double       popup_urgent_speed;
+   unsigned int show_desk_names;
+   int          popup_act_height;
+   int          popup_height;
+   unsigned int drag_resist;
+   unsigned int btn_drag;
+   unsigned int btn_noplace;
+   unsigned int btn_desk;
+   unsigned int flip_desk;
+};
+
+EINTERN Evas_Object    *pager_create(Evas_Object *parent, int *id, 
E_Gadget_Site_Orient orient);
+EINTERN Evas_Object    *config_pager(E_Zone *zone);
+EINTERN void           pager_init(void);
+EINTERN void           _pager_cb_config_gadget_updated(void);
+EINTERN void           _pager_cb_config_updated(void);
+
+extern Config          *pager_config;
+extern E_Module        *gmodule;
+extern Evas_Object     *cfg_dialog;
+extern Eina_List       *ginstances, *ghandlers;
+/**
+ * @addtogroup Optional_Gadgets
+ * @{
+ *
+ * @defgroup Module_Pager Virtual Desktop Pager
+ *
+ * Shows the grid of virtual desktops and allows changing between
+ * them.
+ *
+ * @}
+ */
+#endif

-- 


Reply via email to