From 117998f8f1ce9d29f3ea9d428eace3751acff013 Mon Sep 17 00:00:00 2001 From: Gustavo Sverzut Barbieri Date: Sat, 11 Jul 2009 20:46:55 +0000 Subject: [PATCH] gadman: use one gadcon per zone. Before gadman was using a single gadcon for all zones, that lead to problems like popup menus being incorrectly placed. The correct solution is to mimic shelves and have one gadcon per zone, including the top layer. By: manio SVN revision: 41312 --- src/bin/e_config.c | 1 + src/bin/e_config.h | 1 + src/modules/gadman/e_mod_config.c | 2 +- src/modules/gadman/e_mod_gadman.c | 322 ++++++++++++++++++------------ src/modules/gadman/e_mod_gadman.h | 25 ++- 5 files changed, 220 insertions(+), 131 deletions(-) diff --git a/src/bin/e_config.c b/src/bin/e_config.c index d867b79d4..648d8ab01 100644 --- a/src/bin/e_config.c +++ b/src/bin/e_config.c @@ -152,6 +152,7 @@ e_config_init(void) #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); diff --git a/src/bin/e_config.h b/src/bin/e_config.h index 53d7f3156..d4c129faf 100644 --- a/src/bin/e_config.h +++ b/src/bin/e_config.h @@ -446,6 +446,7 @@ struct _E_Config_Gadcon { const char *name; int id; + int zone; Eina_List *clients; }; diff --git a/src/modules/gadman/e_mod_config.c b/src/modules/gadman/e_mod_config.c index c8ddb16bc..58f4a1a6d 100644 --- a/src/modules/gadman/e_mod_config.c +++ b/src/modules/gadman/e_mod_config.c @@ -333,7 +333,7 @@ _cb_add(void *data, void *data2) cc = e_widget_ilist_nth_data_get(cfdata->o_avail, i); if (!cc) continue; - gcc = gadman_gadget_add(cc, 0); + gcc = gadman_gadget_add(cc, GADMAN_LAYER_BG); gadman_gadget_edit_start(gcc); } diff --git a/src/modules/gadman/e_mod_gadman.c b/src/modules/gadman/e_mod_gadman.c index a4b30d946..e7694e52b 100644 --- a/src/modules/gadman/e_mod_gadman.c +++ b/src/modules/gadman/e_mod_gadman.c @@ -12,7 +12,7 @@ static char *_get_bind_text(const char* action); 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, Gadman_Layer_Type layer, E_Zone *zone); static void on_shape_change(void *data, E_Container_Shape *es, E_Container_Shape_Change ch); @@ -45,6 +45,9 @@ Manager *Man = NULL; void gadman_init(E_Module *m) { + const Eina_List *l; + E_Zone *zone; + /* Create Manager */ Man = calloc(1, sizeof(Manager)); if (!Man) return; @@ -53,94 +56,105 @@ gadman_init(E_Module *m) Man->container = e_container_current_get(e_manager_current_get()); Man->width = Man->container->w; Man->height = Man->container->h; - Man->gadgets = NULL; - Man->top_ee = NULL; - Man->visible = 0; /* Check if composite is enable */ if (ecore_x_screen_is_composited(0) || e_config->use_composite) Man->use_composite = 1; - else - Man->use_composite = 0; /* with this we can trap screen resolution change (a better way?)*/ e_container_shape_change_callback_add(Man->container, on_shape_change, NULL); - /* Create Gadcon for background and top */ - Man->gc = _gadman_gadcon_new("gadman", 0); - Man->gc_top = _gadman_gadcon_new("gadman_top", 1); + /* iterating through zones - and making gadmans on each */ + EINA_LIST_FOREACH(Man->container->zones, l, zone) + { + const char *layer_name[] = {"gadman", "gadman_top"}; + unsigned int layer; - /* Create 2 mover objects */ - Man->mover = _create_mover(Man->gc); - Man->mover_top = _create_mover(Man->gc_top); + for (layer = 0; layer < GADMAN_LAYER_COUNT; layer++) + { + E_Gadcon *gc = _gadman_gadcon_new(layer_name[layer], layer, zone); + Man->gadcons[layer] = eina_list_append(Man->gadcons[layer], gc); + } + } } void gadman_shutdown(void) { + E_Gadcon *gc; + unsigned int layer; + e_container_shape_change_callback_del(Man->container, on_shape_change, NULL); - e_gadcon_unpopulate(Man->gc); - e_gadcon_unpopulate(Man->gc_top); + for (layer = 0; layer < GADMAN_LAYER_COUNT; layer++) + { + EINA_LIST_FREE(Man->gadcons[layer], gc) + { + e_gadcon_unpopulate(gc); + e_gadcon_custom_del(gc); - e_gadcon_custom_del(Man->gc); - e_gadcon_custom_del(Man->gc_top); + /* 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)); + } + + eina_list_free(Man->gadgets[layer]); + evas_object_del(Man->movers[layer]); + } - /* 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)); 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); if (Man->top_ee) { e_canvas_del(Man->top_ee); //ecore_evas_free(Man->top_ee); } free(Man); - Man = NULL; } void gadman_populate_class(void *data, E_Gadcon *gc, const E_Gadcon_Client_Class *cc) { - Eina_List *l; + Gadman_Layer_Type layer = (Gadman_Layer_Type)(long)data; + const Eina_List *l; + E_Config_Gadcon_Client *cf_gcc; - for (l = gc->cf->clients; l; l = l->next) + EINA_LIST_FOREACH(gc->cf->clients, l, cf_gcc) { - 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, layer, gc->zone); } } -E_Gadcon_Client * -gadman_gadget_place(E_Config_Gadcon_Client *cf, int ontop) +E_Gadcon * +gadman_gadcon_get(const E_Zone *zone, Gadman_Layer_Type layer) { + const Eina_List *l; + E_Gadcon *gc; + + EINA_LIST_FOREACH(Man->gadcons[layer], l, gc) + if (gc->zone == zone) return gc; + return NULL; +} + +E_Gadcon_Client * +gadman_gadget_place(E_Config_Gadcon_Client *cf, Gadman_Layer_Type layer, E_Zone *zone) +{ + const Eina_List *l; E_Gadcon *gc; E_Gadcon_Client *gcc; E_Gadcon_Client_Class *cc = NULL; - Eina_List *l = NULL; if (!cf->name) return NULL; - if (ontop) gc = Man->gc_top; - else gc = Man->gc; + gc = gadman_gadcon_get(zone, layer); /* Find provider */ - for (l = e_gadcon_provider_list(); l; l = l->next) + EINA_LIST_FOREACH(e_gadcon_provider_list(), l, cc) { - cc = l->data; if (!strcmp(cc->name, cf->name)) break; else @@ -154,7 +168,7 @@ gadman_gadget_place(E_Config_Gadcon_Client *cf, int ontop) gcc->cf = cf; gcc->client_class = cc; - Man->gadgets = eina_list_append(Man->gadgets, gcc); + Man->gadgets[layer] = eina_list_append(Man->gadgets[layer], gcc); //printf("Place Gadget %s (style: %s id: %s) (gadcon: %s)\n", gcc->name, cf->style, cf->id, gc->name); @@ -180,7 +194,7 @@ gadman_gadget_place(E_Config_Gadcon_Client *cf, int ontop) _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); @@ -189,17 +203,15 @@ gadman_gadget_place(E_Config_Gadcon_Client *cf, int ontop) } E_Gadcon_Client * -gadman_gadget_add(E_Gadcon_Client_Class *cc, int ontop) +gadman_gadget_add(E_Gadcon_Client_Class *cc, Gadman_Layer_Type layer) { E_Config_Gadcon_Client *cf = NULL; E_Gadcon_Client *gcc; 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()), layer); /* Create Config_Gadcon_Client */ cf = e_gadcon_client_config_new(gc, cc->name); @@ -210,7 +222,7 @@ gadman_gadget_add(E_Gadcon_Client_Class *cc, int ontop) cf->geom.size_h = DEFAULT_SIZE_H; /* Place the new gadget */ - gcc = gadman_gadget_place(cf, ontop); + gcc = gadman_gadget_place(cf, layer, gc->zone); /* Respect Aspect */ evas_object_geometry_get(gcc->o_frame, NULL, NULL, &w, &h); @@ -229,9 +241,9 @@ gadman_gadget_add(E_Gadcon_Client_Class *cc, int ontop) } void -gadman_gadget_remove(E_Gadcon_Client *gcc) +gadman_gadget_remove(E_Gadcon_Client *gcc, Gadman_Layer_Type layer) { - Man->gadgets = eina_list_remove(Man->gadgets, gcc); + Man->gadgets[layer] = eina_list_remove(Man->gadgets[layer], gcc); edje_object_part_unswallow(gcc->o_frame, gcc->o_base); evas_object_del(gcc->o_frame); @@ -245,7 +257,8 @@ gadman_gadget_remove(E_Gadcon_Client *gcc) void gadman_gadget_del(E_Gadcon_Client *gcc) { - Man->gadgets = eina_list_remove(Man->gadgets, gcc); + Gadman_Layer_Type layer = gcc->gadcon->id - ID_GADMAN_LAYER_BASE; + Man->gadgets[layer] = eina_list_remove(Man->gadgets[layer], gcc); edje_object_part_unswallow(gcc->o_frame, gcc->o_base); evas_object_del(gcc->o_frame); @@ -282,11 +295,18 @@ gadman_gadget_edit_start(E_Gadcon_Client *gcc) void gadman_gadget_edit_end(void) { - evas_object_hide(Man->mover); - evas_object_hide(Man->mover_top); + unsigned int layer; - Man->gc->editing = 0; - Man->gc_top->editing = 0; + for (layer = 0; layer < GADMAN_LAYER_COUNT; layer++) + { + const Eina_List *l; + E_Gadcon *gc; + + evas_object_hide(Man->movers[layer]); + + EINA_LIST_FOREACH(Man->gadcons[layer], l, gc) + gc->editing = 0; + } if (current) _save_widget_position(current); } @@ -294,7 +314,8 @@ gadman_gadget_edit_end(void) void gadman_gadgets_show(void) { - Eina_List *l = NULL; + const Eina_List *l; + E_Gadcon_Client *gcc; Man->visible = 1; ecore_evas_show(Man->top_ee); @@ -317,12 +338,9 @@ gadman_gadgets_show(void) "e,state,visibility,show,custom,now", "e"); } - for (l = Man->gadgets; l; l = l->next) + /* Showing top gadgets */ + EINA_LIST_FOREACH(Man->gadgets[GADMAN_LAYER_TOP], l, gcc) { - E_Gadcon_Client *gcc; - - if (!(gcc = l->data)) continue; - if (gcc->gadcon != Man->gc_top) continue; if (Man->conf->anim_gad) edje_object_signal_emit(gcc->o_frame, "e,state,visibility,show", "e"); @@ -335,7 +353,8 @@ gadman_gadgets_show(void) void gadman_gadgets_hide(void) { - Eina_List *l = NULL; + const Eina_List *l; + E_Gadcon_Client *gcc; Man->visible = 0; @@ -354,12 +373,9 @@ gadman_gadgets_hide(void) "e,state,visibility,hide,custom,now", "e"); } - for (l = Man->gadgets; l; l = l->next) + /* Hiding top gadgets */ + EINA_LIST_FOREACH(Man->gadgets[GADMAN_LAYER_TOP], l, gcc) { - E_Gadcon_Client *gcc; - - if (!(gcc = l->data)) continue; - if (gcc->gadcon != Man->gc_top) continue; if (Man->conf->anim_gad) edje_object_signal_emit(gcc->o_frame, "e,state,visibility,hide", "e"); @@ -428,10 +444,11 @@ gadman_update_bg(void) /* Internals */ static E_Gadcon* -_gadman_gadcon_new(const char* name, int ontop) +_gadman_gadcon_new(const char* name, Gadman_Layer_Type layer, E_Zone *zone) { + const Eina_List *l; E_Gadcon *gc; - Eina_List *l = NULL; + E_Config_Gadcon *cg; /* Create Gadcon */ gc = E_OBJECT_ALLOC(E_Gadcon, E_GADCON_TYPE, NULL); @@ -442,11 +459,14 @@ _gadman_gadcon_new(const char* name, int ontop) gc->orient = E_GADCON_ORIENT_FLOAT; /* Create ecore fullscreen window */ - if (ontop) + if (layer > GADMAN_LAYER_BG) { - 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) { @@ -490,11 +510,11 @@ _gadman_gadcon_new(const char* name, int ontop) 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); + e_gadcon_populate_callback_set(gc, gadman_populate_class, (void*)layer); - gc->id = 114 + ontop; // TODO what's this ??????? 114 is a random number + gc->id = ID_GADMAN_LAYER_BASE + layer; gc->edje.o_parent = NULL; gc->edje.swallow_name = NULL; gc->shelf = NULL; @@ -507,12 +527,9 @@ _gadman_gadcon_new(const char* name, int ontop) /* Search for existing gadcon config */ gc->cf = NULL; - for (l = e_config->gadcons; l; l=l->next) + EINA_LIST_FOREACH(e_config->gadcons, l, cg) { - 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 +542,7 @@ _gadman_gadcon_new(const char* name, int ontop) 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 +550,13 @@ _gadman_gadcon_new(const char* name, int ontop) e_gadcon_custom_new(gc); + if (!Man->movers[layer]) + Man->movers[layer] = _create_mover(gc); + + /* Assigning top gadcon - needed in gadman_update_bg() */ + if ((layer > GADMAN_LAYER_BG) && !Man->gc_top) + Man->gc_top = gc; + return gc; } @@ -588,10 +613,7 @@ _create_mover(E_Gadcon *gc) static Evas_Object * _get_mover(E_Gadcon_Client *gcc) { - if (gcc->gadcon == Man->gc_top) - return Man->mover_top; - else - return Man->mover; + return Man->movers[gcc->gadcon->id - ID_GADMAN_LAYER_BASE]; } static void @@ -612,26 +634,30 @@ static void _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 + MIN_VISIBLE_MARIGIN)) h = ((zone->y + zone->h + MIN_VISIBLE_MARIGIN) - y); + if ((x + w) > (zone->x + zone->w + MIN_VISIBLE_MARIGIN)) w = ((zone->x + zone->w + MIN_VISIBLE_MARIGIN) - x); evas_object_move(gcc->o_frame, x, y); evas_object_resize(gcc->o_frame, w, h); @@ -709,7 +735,7 @@ _attach_menu(void *data, E_Gadcon_Client *gcc, E_Menu *menu) 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 +747,7 @@ _attach_menu(void *data, E_Gadcon_Client *gcc, E_Menu *menu) 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); @@ -799,8 +825,11 @@ _get_bind_text(const char* action) static void on_shape_change(void *data, E_Container_Shape *es, E_Container_Shape_Change ch) { - Eina_List *l = NULL; + const Eina_List *l, *g; + E_Gadcon *gc; + E_Config_Gadcon_Client *cf_gcc; E_Container *con; + unsigned int layer; con = e_container_shape_container_get(es); if ((con->w == Man->width) && (con->h == Man->height)) return; @@ -810,22 +839,15 @@ on_shape_change(void *data, E_Container_Shape *es, E_Container_Shape_Change ch) 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) + + for (layer = 0; layer < GADMAN_LAYER_COUNT; layer++) { - E_Config_Gadcon_Client *cf_gcc; - - if (!(cf_gcc = l->data)) continue; - gadman_gadget_place(cf_gcc, 0); - } - - for (l = Man->gc_top->cf->clients; l; l = l->next) - { - E_Config_Gadcon_Client *cf_gcc; - - if (!(cf_gcc = l->data)) continue; - gadman_gadget_place(cf_gcc, 1); + EINA_LIST_FOREACH(Man->gadcons[layer], g, gc) + { + e_gadcon_unpopulate(gc); + EINA_LIST_FOREACH(gc->cf->clients, l, cf_gcc) + gadman_gadget_place(cf_gcc, layer, gc->zone); + } } } @@ -926,16 +948,30 @@ on_menu_style_vert(void *data, E_Menu *m, E_Menu_Item *mi) static void on_menu_layer_bg(void *data, E_Menu *m, E_Menu_Item *mi) { + const Eina_List *l; E_Config_Gadcon_Client *cf; + E_Gadcon_Client *gcc; + E_Gadcon *gc; + unsigned int layer; if (!current) return; cf = current->cf; + gcc = data; - gadman_gadget_remove(current); - current = gadman_gadget_place(cf, 0); + gadman_gadget_remove(current, GADMAN_LAYER_TOP); + current = gadman_gadget_place(cf, GADMAN_LAYER_BG, 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); + for (layer = 0; layer < GADMAN_LAYER_COUNT; layer++) + { + EINA_LIST_FOREACH(Man->gadcons[layer], l, gc) + { + if (gc->zone != current->gadcon->zone) continue; + if (layer == GADMAN_LAYER_BG) + gc->cf->clients = eina_list_append(gc->cf->clients, cf); + else if (layer == GADMAN_LAYER_TOP) + gc->cf->clients = eina_list_remove(gc->cf->clients, cf); + } + } e_config_save_queue(); } @@ -943,16 +979,30 @@ on_menu_layer_bg(void *data, E_Menu *m, E_Menu_Item *mi) static void on_menu_layer_top(void *data, E_Menu *m, E_Menu_Item *mi) { + const Eina_List *l; E_Config_Gadcon_Client *cf; + E_Gadcon_Client *gcc; + E_Gadcon *gc; + unsigned int layer; if (!current) return; cf = current->cf; + gcc = data; - gadman_gadget_remove(current); - current = gadman_gadget_place(cf, 1); + gadman_gadget_remove(current, GADMAN_LAYER_BG); + current = gadman_gadget_place(cf, GADMAN_LAYER_TOP, 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); + for (layer = 0; layer < GADMAN_LAYER_COUNT; layer++) + { + EINA_LIST_FOREACH(Man->gadcons[layer], l, gc) + { + if (gc->zone != current->gadcon->zone) continue; + if (layer == GADMAN_LAYER_BG) + gc->cf->clients = eina_list_remove(gc->cf->clients, cf); + else if (layer == GADMAN_LAYER_TOP) + gc->cf->clients = eina_list_append(gc->cf->clients, cf); + } + } e_config_save_queue(); @@ -988,9 +1038,10 @@ on_frame_click(void *data, Evas *e, Evas_Object *obj, void *event_info) ev = event_info; - if (Man->gc->editing) gadman_gadget_edit_end(); - gcc = data; + + if (gcc->gadcon->editing) gadman_gadget_edit_end(); + current = gcc; if (ev->button == 5) @@ -1225,9 +1276,32 @@ on_move(void *data, Evas_Object *o, const char *em, const char *src) /* DRAG_STOP */ if (action == DRAG_STOP) { - current->moving = 0; + E_Config_Gadcon_Client *cf; + E_Zone *dst_zone = NULL; + E_Gadcon *dst_gadcon; + int 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)) + { + unsigned int layer = current->gadcon->id - ID_GADMAN_LAYER_BASE; + cf = current->cf; + + current->gadcon->cf->clients = eina_list_remove(current->gadcon->cf->clients, cf); + dst_gadcon = gadman_gadcon_get(dst_zone, layer); + 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; } diff --git a/src/modules/gadman/e_mod_gadman.h b/src/modules/gadman/e_mod_gadman.h index 603af9b28..73f84cc64 100644 --- a/src/modules/gadman/e_mod_gadman.h +++ b/src/modules/gadman/e_mod_gadman.h @@ -15,6 +15,8 @@ #define BG_CUSTOM 2 #define BG_TRANS 3 +#define MIN_VISIBLE_MARIGIN 20 + typedef struct _Manager Manager; typedef struct _Config Config; @@ -30,13 +32,23 @@ struct _Config int anim_gad; }; +typedef enum +{ + GADMAN_LAYER_BG = 0, /* layer is considered unsigned int */ + GADMAN_LAYER_TOP, + GADMAN_LAYER_COUNT +} Gadman_Layer_Type; + +#define ID_GADMAN_LAYER_BASE 114 +#define ID_GADMAN_LAYER_BG (ID_GADMAN_LAYER_BASE + GADMAN_LAYER_BG) +#define ID_GADMAN_LAYER_TOP (ID_GADMAN_LAYER_BASE + GADMAN_LAYER_TOP) + struct _Manager { - E_Gadcon *gc; + Eina_List *gadcons[GADMAN_LAYER_COUNT]; E_Gadcon *gc_top; - Eina_List *gadgets; - Evas_Object *mover; - Evas_Object *mover_top; + Eina_List *gadgets[GADMAN_LAYER_COUNT]; + Evas_Object *movers[GADMAN_LAYER_COUNT]; Evas_Object *full_bg; const char *icon_name; @@ -61,12 +73,13 @@ extern Manager *Man; void gadman_init(E_Module *m); void gadman_shutdown(void); -E_Gadcon_Client *gadman_gadget_add(E_Gadcon_Client_Class *cc, int ontop); +E_Gadcon_Client *gadman_gadget_add(E_Gadcon_Client_Class *cc, Gadman_Layer_Type layer); 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, Gadman_Layer_Type layer, 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(const E_Zone *zone, Gadman_Layer_Type layer); #endif