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
This commit is contained in:
Gustavo Sverzut Barbieri 2009-07-11 20:46:55 +00:00
parent 0857b90c89
commit 117998f8f1
5 changed files with 220 additions and 131 deletions

View File

@ -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);

View File

@ -446,6 +446,7 @@ struct _E_Config_Gadcon
{
const char *name;
int id;
int zone;
Eina_List *clients;
};

View File

@ -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);
}

View File

@ -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;
}

View File

@ -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