Hello
Finaly i finished a patch for making gadman gadcons for multiple zones. I did it same as a shelf - i also needed to add a zone property to the config. One gadcon is changed to list of gadcons. In this way every client has a proper zone (obtained from parent gadcon) - and the popups shows corrrectly (for CTRL+ALT+G as well).

Patch made from dir /trunk/e/src using 'svn diff'.
Please review :)

regards,
--
manio
jabber/e-mail: ma...@skyboo.net
http://manio.skyboo.net

Index: bin/e_config.c
===================================================================
--- bin/e_config.c	(revision 41251)
+++ bin/e_config.c	(working copy)
@@ -139,6 +139,7 @@
 #define D _e_config_gadcon_edd
    E_CONFIG_VAL(D, T, name, STR);
    E_CONFIG_VAL(D, T, id, INT);
+   E_CONFIG_VAL(D, T, zone, INT);
    E_CONFIG_LIST(D, T, clients, _e_config_gadcon_client_edd);
 
    _e_config_shelf_desk_edd = E_CONFIG_DD_NEW("E_Config_Shelf_Desk", E_Config_Shelf_Desk);
Index: bin/e_config.h
===================================================================
--- bin/e_config.h	(revision 41251)
+++ bin/e_config.h	(working copy)
@@ -446,6 +446,7 @@
 {
    const char *name;
    int         id;
+   int         zone;
    Eina_List  *clients;
 };
 
Index: modules/gadman/e_mod_gadman.h
===================================================================
--- modules/gadman/e_mod_gadman.h	(revision 41251)
+++ modules/gadman/e_mod_gadman.h	(working copy)
@@ -15,6 +15,9 @@
 #define BG_CUSTOM 2
 #define BG_TRANS  3
 
+#define ID_GADMAN_LAYER_BG  114
+#define ID_GADMAN_LAYER_TOP 115
+
 typedef struct _Manager Manager;
 typedef struct _Config Config;
 
@@ -32,7 +35,7 @@
 
 struct _Manager
 {
-   E_Gadcon    *gc;
+   Eina_List   *gadcons;
    E_Gadcon    *gc_top;
    Eina_List   *gadgets;
    Evas_Object *mover;
@@ -63,10 +66,11 @@
 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);
+E_Gadcon_Client *gadman_gadget_place(E_Config_Gadcon_Client *cf, int ontop, E_Zone *zone);
 void             gadman_gadget_edit_start(E_Gadcon_Client *gcc);
 void             gadman_gadget_edit_end(void);
 void             gadman_gadgets_toggle(void);
 void             gadman_update_bg(void);
+E_Gadcon        *gadman_gadcon_get(E_Zone *zone, int ontop);
 
 #endif
Index: modules/gadman/e_mod_gadman.c
===================================================================
--- modules/gadman/e_mod_gadman.c	(revision 41251)
+++ modules/gadman/e_mod_gadman.c	(working copy)
@@ -12,7 +12,7 @@
 
 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 E_Gadcon* _gadman_gadcon_new(const char* name, int ontop, E_Zone *zone);
 
 static void on_shape_change(void *data, E_Container_Shape *es, E_Container_Shape_Change ch);
 
@@ -45,6 +45,8 @@
 void
 gadman_init(E_Module *m)
 {
+   Eina_List *l = NULL;
+
    /* Create Manager */
    Man = calloc(1, sizeof(Manager));
    if (!Man) return;
@@ -53,6 +55,7 @@
    Man->container = e_container_current_get(e_manager_current_get());
    Man->width = Man->container->w;
    Man->height = Man->container->h;
+   Man->gadcons = NULL;
    Man->gadgets = NULL;
    Man->top_ee = NULL;
    Man->visible = 0;
@@ -66,13 +69,16 @@
    /* 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);
+   /* iterating through zones - and making gadmans on each */
+   for (l = Man->container->zones; l; l = l->next)
+     {
+       E_Zone *zone;
+       zone = l->data;
 
-   /* Create 2 mover objects */
-   Man->mover = _create_mover(Man->gc);
-   Man->mover_top = _create_mover(Man->gc_top);
+       /* Create Gadcon for background and top */
+       Man->gadcons = eina_list_append(Man->gadcons, _gadman_gadcon_new("gadman", 0, zone));
+       Man->gadcons = eina_list_append(Man->gadcons, _gadman_gadcon_new("gadman_top", 1, zone));
+     }
 }
 
 void
@@ -80,26 +86,31 @@
 {
    e_container_shape_change_callback_del(Man->container, on_shape_change, NULL);
 
-   e_gadcon_unpopulate(Man->gc);
-   e_gadcon_unpopulate(Man->gc_top);
+   Eina_List *l = NULL;
+   for (l = Man->gadcons; l; l = l->next)
+     {
+	E_Gadcon *gc;
+	if (!(gc = l->data)) continue;
 
-   e_gadcon_custom_del(Man->gc);
-   e_gadcon_custom_del(Man->gc_top);
+       e_gadcon_unpopulate(gc);
+       e_gadcon_custom_del(gc);
 
-   /* free gadcons */
-   e_config->gadcons = eina_list_remove(e_config->gadcons, Man->gc);
-   e_config->gadcons = eina_list_remove(e_config->gadcons, Man->gc_top);
-   eina_stringshare_del(Man->gc->name);
-   eina_stringshare_del(Man->gc_top->name);
-   if (Man->gc->config_dialog) e_object_del(E_OBJECT(Man->gc->config_dialog));
+       /* free gadcons */
+       e_config->gadcons = eina_list_remove(e_config->gadcons, gc);
+       eina_stringshare_del(gc->name);
+
+       if (gc->config_dialog) e_object_del(E_OBJECT(gc->config_dialog));
+
+       free(gc);
+     }
+
    if (Man->icon_name) eina_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);
    eina_list_free(Man->gadgets);
+   eina_list_free(Man->gadcons);
    if (Man->top_ee)
      {
         e_canvas_del(Man->top_ee);
@@ -119,13 +130,28 @@
         E_Config_Gadcon_Client *cf_gcc;
 
         if (!(cf_gcc = l->data)) continue;
-        if (cf_gcc->name && cc->name && !strcmp(cf_gcc->name, cc->name))
-         gadman_gadget_place(cf_gcc, (int)data);
+        if (cf_gcc->name && cc->name && !strcmp(cf_gcc->name, cc->name) && (gc->cf->zone == gc->zone->id))
+         gadman_gadget_place(cf_gcc, (int)data, gc->zone);
      }
 }
 
+E_Gadcon *
+gadman_gadcon_get(E_Zone *zone, int ontop)
+{
+   Eina_List *l = NULL;
+   for (l = Man->gadcons; l; l = l->next)
+     {
+       E_Gadcon *gc;
+
+       if (!(gc = l->data)) continue;
+       if ((gc->zone == zone) && (gc->id == (ID_GADMAN_LAYER_BG + ontop)))
+         return gc;
+     }
+   return NULL;
+}
+
 E_Gadcon_Client *
-gadman_gadget_place(E_Config_Gadcon_Client *cf, int ontop)
+gadman_gadget_place(E_Config_Gadcon_Client *cf, int ontop, E_Zone *zone)
 {
    E_Gadcon *gc;
    E_Gadcon_Client *gcc;
@@ -134,8 +160,7 @@
 
    if (!cf->name) return NULL;
 
-   if (ontop) gc = Man->gc_top;
-   else gc = Man->gc;
+   gc = gadman_gadcon_get(zone, ontop);
 
    /* Find provider */
    for (l = e_gadcon_provider_list(); l; l = l->next) 
@@ -180,7 +205,7 @@
 
    _apply_widget_position(gcc);
 
-   if (gcc->gadcon == Man->gc_top)
+   if (gcc->gadcon->id == ID_GADMAN_LAYER_TOP)
      edje_object_signal_emit(gcc->o_frame, "e,state,visibility,hide", "e");
 
    evas_object_show(gcc->o_frame);
@@ -196,10 +221,7 @@
    E_Gadcon *gc;
    int w, h;
 
-   if (ontop)
-     gc = Man->gc_top;
-   else
-     gc = Man->gc;
+   gc = gadman_gadcon_get(e_util_zone_current_get(e_manager_current_get()), ontop);
 
    /* Create Config_Gadcon_Client */
    cf = e_gadcon_client_config_new(gc, cc->name);
@@ -210,7 +232,7 @@
    cf->geom.size_h = DEFAULT_SIZE_H;
 
    /* Place the new gadget */
-   gcc = gadman_gadget_place(cf, ontop);
+   gcc = gadman_gadget_place(cf, ontop, gc->zone);
 
    /* Respect Aspect */
    evas_object_geometry_get(gcc->o_frame, NULL, NULL, &w, &h);
@@ -285,9 +307,15 @@
    evas_object_hide(Man->mover);
    evas_object_hide(Man->mover_top);
 
-   Man->gc->editing = 0;
-   Man->gc_top->editing = 0;
+   Eina_List *l = NULL;
+   for (l = Man->gadcons; l; l = l->next)
+     {
+        E_Gadcon *gc;
+        if (!(gc = l->data)) continue;
 
+        gc->editing = 0;
+     }
+
    if (current) _save_widget_position(current);
 }
 
@@ -322,7 +350,7 @@
 	E_Gadcon_Client *gcc;
 
 	if (!(gcc = l->data)) continue;
-	if (gcc->gadcon != Man->gc_top) continue;
+	if (gcc->gadcon->id != ID_GADMAN_LAYER_TOP) continue;
 	if (Man->conf->anim_gad)
 	  edje_object_signal_emit(gcc->o_frame,
 	                          "e,state,visibility,show", "e");
@@ -359,7 +387,7 @@
         E_Gadcon_Client *gcc;
 
 	if (!(gcc = l->data)) continue;
-	if (gcc->gadcon != Man->gc_top) continue;
+	if (gcc->gadcon->id != ID_GADMAN_LAYER_TOP) continue;
 	if (Man->conf->anim_gad)
 	  edje_object_signal_emit(gcc->o_frame,
 	                          "e,state,visibility,hide", "e");
@@ -428,7 +456,7 @@
 
 /* Internals */
 static E_Gadcon*
-_gadman_gadcon_new(const char* name, int ontop)
+_gadman_gadcon_new(const char* name, int ontop, E_Zone *zone)
 {
    E_Gadcon *gc;
    Eina_List *l = NULL;
@@ -444,9 +472,12 @@
    /* 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));
+        if (!Man->top_ee)
+        {
+          Man->top_ee = e_canvas_new(e_config->evas_engine_popups,
+                                     Man->container->win, 0, 0, 0, 0, 1, 1,
+                                     &(Man->top_win));
+        }
 
         if (Man->use_composite)
           {
@@ -469,6 +500,7 @@
 
         /* 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,*",
@@ -490,11 +522,11 @@
         e_drop_xdnd_register_set(Man->container->bg_win, 1);
      }
 
-   e_gadcon_zone_set(gc, e_zone_current_get(Man->container));
+   e_gadcon_zone_set(gc, zone);
    e_gadcon_util_menu_attach_func_set(gc, _attach_menu, NULL);
    e_gadcon_populate_callback_set(gc, gadman_populate_class, (void*)ontop);
 
-   gc->id = 114 + ontop; // TODO what's this ??????? 114 is a random number
+   gc->id = ID_GADMAN_LAYER_BG + ontop;
    gc->edje.o_parent = NULL;
    gc->edje.swallow_name = NULL;
    gc->shelf = NULL;
@@ -512,7 +544,7 @@
         E_Config_Gadcon *cg;
 
         if (!(cg = l->data)) continue;
-        if (!strcmp(cg->name, name))
+        if (!strcmp(cg->name, name) && (cg->zone == zone->id))
           {
              gc->cf = cg;
              break;
@@ -525,6 +557,7 @@
         gc->cf = E_NEW(E_Config_Gadcon, 1);
         gc->cf->name = eina_stringshare_add(name);
         gc->cf->id = gc->id;
+        gc->cf->zone = zone->id;
         gc->cf->clients = NULL;
         e_config->gadcons = eina_list_append(e_config->gadcons, gc->cf);
         e_config_save_queue();
@@ -532,6 +565,13 @@
 
    e_gadcon_custom_new(gc);
 
+   /* Create mover objects */
+   if (!ontop && !Man->mover)    Man->mover = _create_mover(gc);
+   if (ontop && !Man->mover_top) Man->mover_top = _create_mover(gc);
+
+   /* Assigning top gadcon - needed in gadman_update_bg() */
+   if (ontop && !Man->gc_top)    Man->gc_top = gc;
+
    return gc;
 }
 
@@ -588,7 +628,7 @@
 static Evas_Object *
 _get_mover(E_Gadcon_Client *gcc)
 {
-   if (gcc->gadcon == Man->gc_top)
+   if (gcc->gadcon->id == ID_GADMAN_LAYER_TOP)
      return Man->mover_top;
    else
      return Man->mover;
@@ -612,26 +652,30 @@
 _apply_widget_position(E_Gadcon_Client *gcc)
 {
    int x, y, w, h;
+   E_Zone *zone;
 
    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;
 
+   /* Obtain zone from parent gadcon */
+   zone = gcc->gadcon->zone;
+
    /* 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;
+   /* Respect zone marigin */
+   if (x < zone->x) x = zone->x;
+   if (y < zone->y) y = zone->y;
+   if (x > (zone->x + zone->w)) x = zone->x;
+   if (y > (zone->y + zone->h)) y = zone->y;
 
-   if ((y + h) > Man->height) h = (Man->height - y);
-   if ((x + w) > Man->width) w = (Man->width - x);
+   if ((y + h) > (zone->y + zone->h)) h = ((zone->y + zone->h) - y);
+   if ((x + w) > (zone->x + zone->w)) w = ((zone->x + zone->w) - x);
 
    evas_object_move(gcc->o_frame, x, y);
    evas_object_resize(gcc->o_frame, w, h);
@@ -709,7 +753,7 @@
    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)
+   if (gcc->gadcon->id == ID_GADMAN_LAYER_BG)
      e_menu_item_toggle_set(mi, 1);
    e_menu_item_callback_set(mi, on_menu_layer_bg, gcc);
 
@@ -721,7 +765,7 @@
    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)
+   if (gcc->gadcon->id == ID_GADMAN_LAYER_TOP)
      e_menu_item_toggle_set(mi, 1);
    e_menu_item_callback_set(mi, on_menu_layer_top, gcc);
 
@@ -810,23 +854,25 @@
    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)
+   Eina_List *g = NULL;
+   for (g = Man->gadcons; g; g = g->next)
      {
-        E_Config_Gadcon_Client *cf_gcc;
+        E_Gadcon *gc;
+        if (!(gc = g->data)) continue;
 
-        if (!(cf_gcc = l->data)) continue;
-        gadman_gadget_place(cf_gcc, 0);
-     }
+        e_gadcon_unpopulate(gc);
 
-   for (l = Man->gc_top->cf->clients; l; l = l->next)
-     {
-        E_Config_Gadcon_Client *cf_gcc;
+        for (l = gc->cf->clients; l; l = l->next)
+          {
+             E_Config_Gadcon_Client *cf_gcc;
 
-        if (!(cf_gcc = l->data)) continue;
-        gadman_gadget_place(cf_gcc, 1);
-     }
+             if (!(cf_gcc = l->data)) continue;
+             if (gc->id == ID_GADMAN_LAYER_BG)        //ontop = 0
+               gadman_gadget_place(cf_gcc, 0, gc->zone);
+             else if (gc->id == ID_GADMAN_LAYER_TOP)  //ontop = 1
+               gadman_gadget_place(cf_gcc, 1, gc->zone);
+          }
+      }
 }
 
 static void
@@ -927,16 +973,28 @@
 on_menu_layer_bg(void *data, E_Menu *m, E_Menu_Item *mi)
 {
    E_Config_Gadcon_Client *cf;
+   E_Gadcon_Client *gcc;
 
    if (!current) return;
    cf = current->cf;
+   gcc = data;
 
    gadman_gadget_remove(current);
-   current = gadman_gadget_place(cf, 0);
+   current = gadman_gadget_place(cf, 0, gcc->gadcon->zone);
 
-   Man->gc_top->cf->clients = eina_list_remove(Man->gc_top->cf->clients, cf);
-   Man->gc->cf->clients = eina_list_append(Man->gc->cf->clients, cf);
+   Eina_List *l = NULL;
+   for (l = Man->gadcons; l; l = l->next)
+     {
+        E_Gadcon *gc;
+        if (!(gc = l->data)) continue;
+        if (gc->zone != current->gadcon->zone) continue;
 
+        if (gc->id == ID_GADMAN_LAYER_TOP)
+          gc->cf->clients = eina_list_remove(gc->cf->clients, cf);
+        else if (gc->id == ID_GADMAN_LAYER_BG)
+          gc->cf->clients = eina_list_append(gc->cf->clients, cf);
+     }
+
    e_config_save_queue();
 }
 
@@ -944,16 +1002,28 @@
 on_menu_layer_top(void *data, E_Menu *m, E_Menu_Item *mi)
 {
    E_Config_Gadcon_Client *cf;
+   E_Gadcon_Client *gcc;
 
    if (!current) return;
    cf = current->cf;
+   gcc = data;
 
    gadman_gadget_remove(current);
-   current = gadman_gadget_place(cf, 1);
+   current = gadman_gadget_place(cf, 1, gcc->gadcon->zone);
 
-   Man->gc->cf->clients = eina_list_remove(Man->gc->cf->clients, cf);
-   Man->gc_top->cf->clients = eina_list_append(Man->gc_top->cf->clients, cf);
+   Eina_List *l = NULL;
+   for (l = Man->gadcons; l; l = l->next)
+     {
+        E_Gadcon *gc;
+        if (!(gc = l->data)) continue;
+        if (gc->zone != current->gadcon->zone) continue;
 
+        if (gc->id == ID_GADMAN_LAYER_BG)
+          gc->cf->clients = eina_list_remove(gc->cf->clients, cf);
+        else if (gc->id == ID_GADMAN_LAYER_TOP)
+          gc->cf->clients = eina_list_append(gc->cf->clients, cf);
+     }
+
    e_config_save_queue();
 
    gadman_gadgets_show();
@@ -988,9 +1058,10 @@
 
    ev = event_info;
 
-   if (Man->gc->editing) gadman_gadget_edit_end();
+   gcc = data;
 
-   gcc = data;
+   if (gcc->gadcon->editing) gadman_gadget_edit_end();
+
    current = gcc;
 
    if (ev->button == 5)
@@ -1225,9 +1296,32 @@
    /* DRAG_STOP */
    if (action == DRAG_STOP)
      {
-	current->moving = 0;
+        E_Config_Gadcon_Client *cf;
+        E_Zone *dst_zone = NULL;
+        E_Gadcon *dst_gadcon;
+        int ontop, gx, gy;
+
+        current->moving = 0;
         dx = dy = 0;
-        _save_widget_position(current);
+
+        /* checking if zone was changed for dragged gadget */
+        evas_object_geometry_get(current->o_frame, &gx, &gy, NULL, NULL);
+        dst_zone = e_container_zone_at_point_get(e_container_current_get(e_manager_current_get()), gx, gy);
+        if (dst_zone && (current->gadcon->zone != dst_zone))
+          {
+             cf = current->cf;
+             ontop = (int) (current->gadcon->id == ID_GADMAN_LAYER_TOP);
+
+             current->gadcon->cf->clients = eina_list_remove(current->gadcon->cf->clients, cf);
+             dst_gadcon = gadman_gadcon_get(dst_zone, ontop);
+             if (dst_gadcon)
+               {
+                  dst_gadcon->cf->clients = eina_list_append(dst_gadcon->cf->clients, cf);
+                  e_config_save_queue();
+               }
+          }
+        else
+          _save_widget_position(current);
         return;
      }
 
------------------------------------------------------------------------------
_______________________________________________
enlightenment-devel mailing list
enlightenment-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/enlightenment-devel

Reply via email to