discomfitor pushed a commit to branch master.
commit 84793983e18e0e0ba707d754ea3fc5f80cf55c09
Author: Mike Blumenkrantz <[email protected]>
Date: Wed Jun 12 07:41:31 2013 +0100
another huge gadman rewrite. hooray.
* merge gadman overlay to comp canvas using a popup
* unify zone change handlers
* remove stupid container shape change handler (wtf was this supposed to
do?)
* better dnd usage
---
src/modules/gadman/e_mod_gadman.c | 170 +++++++++++++-------------------------
src/modules/gadman/e_mod_gadman.h | 7 +-
2 files changed, 59 insertions(+), 118 deletions(-)
diff --git a/src/modules/gadman/e_mod_gadman.c
b/src/modules/gadman/e_mod_gadman.c
index ae12ad2..df1fd41 100644
--- a/src/modules/gadman/e_mod_gadman.c
+++ b/src/modules/gadman/e_mod_gadman.c
@@ -11,8 +11,6 @@ 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, Gadman_Layer_Type
layer, E_Zone *zone, E_Gadcon_Location *loc);
-static void on_shape_change(void *data, E_Container_Shape *es,
E_Container_Shape_Change ch);
-
static void on_top(void *data, Evas_Object *o, const char *em,
const char *src);
static void on_right(void *data, Evas_Object *o, const char *em,
const char *src);
static void on_down(void *data, Evas_Object *o, const char *em,
const char *src);
@@ -39,8 +37,7 @@ static void _e_gadman_client_remove(void *data
__UNUSED__, E_Gadcon_
static void _e_gadman_handlers_add(void);
static void _e_gadman_handler_del(void);
-static Eina_Bool _e_gadman_cb_zone_add(void *data __UNUSED__, int type
__UNUSED__, void *event);
-static Eina_Bool _e_gadman_cb_zone_del(void *data __UNUSED__, int type
__UNUSED__, void *event);
+static Eina_Bool _e_gadman_cb_zone_change(void *data __UNUSED__, int
type __UNUSED__, void *event);
static E_Gadcon_Client *gadman_gadget_place(E_Gadcon_Client *gcc, const
E_Gadcon_Client_Class *cc, E_Config_Gadcon_Client *cf, Gadman_Layer_Type layer,
E_Zone *zone);
static E_Gadcon *gadman_gadcon_get(const E_Zone *zone,
Gadman_Layer_Type layer);
@@ -62,13 +59,13 @@ gadman_reset(void)
E_FREE_LIST(Man->drag_handlers, ecore_event_handler_del);
for (layer = 0; layer < GADMAN_LAYER_COUNT; layer++)
{
- EINA_LIST_FREE(Man->gadcons[layer], gc)
- e_object_del(E_OBJECT(gc));
+ E_FREE_LIST(Man->gadcons[layer], e_object_del);
Man->gadgets[layer] = eina_list_free(Man->gadgets[layer]);
-
- if (Man->movers[layer]) evas_object_del(Man->movers[layer]);
- Man->movers[layer] = NULL;
+ E_FREE_FUNC(Man->movers[layer], evas_object_del);
}
+ E_FREE_FUNC(Man->overlay, e_object_del);
+ E_FREE_FUNC(Man->full_bg, evas_object_del);
+ E_FREE_FUNC(Man->overlay_layer, evas_object_del);
Man->gc_top = NULL;
if (_gadman_gadgets)
{
@@ -106,13 +103,6 @@ gadman_init(E_Module *m)
Man->width = Man->container->w;
Man->height = Man->container->h;
- /* Check if composite is enable */
- if (e_config->use_shaped_win)
- Man->use_shaped_win = 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 and register "desktop" location */
location = Man->location[GADMAN_LAYER_BG] =
e_gadcon_location_new(_("Desktop"), E_GADCON_SITE_DESKTOP,
_e_gadman_client_add,
(intptr_t*)(long)GADMAN_LAYER_BG,
@@ -138,7 +128,6 @@ gadman_shutdown(void)
_e_gadman_handler_del();
- e_container_shape_change_callback_del(Man->container, on_shape_change,
NULL);
gadman_gadget_edit_end(NULL, NULL, NULL, NULL);
for (layer = 0; layer < GADMAN_LAYER_COUNT; layer++)
@@ -153,11 +142,8 @@ gadman_shutdown(void)
eina_stringshare_del(Man->icon_name);
/* free manager */
- if (Man->top_ee)
- {
- e_canvas_del(Man->top_ee);
- //ecore_evas_free(Man->top_ee);
- }
+ E_FREE_FUNC(Man->overlay, e_object_del);
+ E_FREE_FUNC(Man->overlay_layer, evas_object_del);
if (_gadman_gadgets)
{
eina_hash_free_cb_set(_gadman_gadgets, EINA_FREE_CB(eina_list_free));
@@ -207,7 +193,10 @@ gadman_gadcon_place_job(E_Gadcon_Client *gcc)
_apply_widget_position(gcc);
if (gcc == gcc->gadcon->drag_gcc)
gadman_gadget_edit_start(gcc);
- evas_object_show(gcc->o_frame);
+ if (Man->visible || (gcc->gadcon != Man->gc_top))
+ e_gadcon_client_show(gcc);
+ else
+ e_gadcon_client_hide(gcc);
}
static void
@@ -296,11 +285,15 @@ gadman_gadget_place(E_Gadcon_Client *gcc, const
E_Gadcon_Client_Class *cc, E_Con
evas_object_event_callback_add(gcc->o_frame, EVAS_CALLBACK_MOUSE_DOWN,
on_frame_click, gcc);
+ gcc->hidden = 1;
if (gcc->gadcon->id == ID_GADMAN_LAYER_TOP)
- edje_object_signal_emit(gcc->o_frame, "e,state,visibility,hide", "e");
+ {
+ edje_object_signal_emit(gcc->o_frame, "e,state,visibility,hide", "e");
+ evas_object_layer_set(gcc->o_base, E_COMP_CANVAS_LAYER_POPUP);
+ evas_object_layer_set(gcc->o_frame, E_COMP_CANVAS_LAYER_POPUP);
+ }
else
{
- /* FIXME: comp */
evas_object_layer_set(gcc->o_base, E_COMP_CANVAS_LAYER_DESKTOP);
evas_object_layer_set(gcc->o_frame, E_COMP_CANVAS_LAYER_DESKTOP);
}
@@ -408,7 +401,8 @@ gadman_gadget_edit_start(E_Gadcon_Client *gcc)
evas_object_move(mover, x, y);
evas_object_resize(mover, w, h);
evas_object_raise(mover);
- evas_object_show(mover);
+ if (Man->visible || (gc != Man->gc_top))
+ evas_object_show(mover);
evas_object_event_callback_del(mover, EVAS_CALLBACK_HIDE, gadman_edit);
evas_object_event_callback_add(mover, EVAS_CALLBACK_HIDE, gadman_edit, gcc);
}
@@ -450,10 +444,9 @@ gadman_gadgets_show(void)
{
Eina_List *l;
E_Gadcon_Client *gcc;
- E_Config_Gadcon_Client *cf_gcc;
Man->visible = 1;
- ecore_evas_show(Man->top_ee);
+ e_popup_show(Man->overlay);
if (Man->conf->bg_type == BG_STD)
{
@@ -475,17 +468,19 @@ gadman_gadgets_show(void)
}
/* Showing top gadgets */
- EINA_LIST_FOREACH(Man->gadgets[GADMAN_LAYER_TOP], l, cf_gcc)
+ EINA_LIST_FOREACH(Man->gc_top->clients, l, gcc)
{
- gcc = e_gadcon_client_find(NULL, cf_gcc);
- if (!gcc) continue;
if (Man->conf->anim_gad)
edje_object_signal_emit(gcc->o_frame,
"e,state,visibility,show", "e");
else
edje_object_signal_emit(gcc->o_frame,
"e,state,visibility,show,now", "e");
+ e_gadcon_client_show(gcc);
}
+ Man->gc_top->drop_handler->hidden = 0;
+ if (!Man->gc_top->editing) return;
+ if (gcc) evas_object_show(_get_mover(gcc));
}
void
@@ -493,10 +488,10 @@ gadman_gadgets_hide(void)
{
Eina_List *l;
E_Gadcon_Client *gcc;
- E_Config_Gadcon_Client *cf_gcc;
Eina_Bool editing = EINA_FALSE;
Man->visible = 0;
+ Man->gc_top->drop_handler->hidden = 1;
if (Man->conf->bg_type == BG_STD)
{
@@ -518,10 +513,8 @@ gadman_gadgets_hide(void)
}
/* Hiding top gadgets */
- EINA_LIST_FOREACH(Man->gadgets[GADMAN_LAYER_TOP], l, cf_gcc)
+ EINA_LIST_FOREACH(Man->gc_top->clients, l, gcc)
{
- gcc = e_gadcon_client_find(NULL, cf_gcc);
- if (!gcc) continue;
editing = gcc->gadcon->editing;
if (Man->conf->anim_gad)
edje_object_signal_emit(gcc->o_frame,
@@ -529,6 +522,7 @@ gadman_gadgets_hide(void)
else
edje_object_signal_emit(gcc->o_frame,
"e,state,visibility,hide,now", "e");
+ e_gadcon_client_hide(gcc);
}
if (editing)
gadman_gadget_edit_end(NULL, NULL, NULL, NULL);
@@ -744,33 +738,23 @@ _gadman_gadcon_new(const char *name, Gadman_Layer_Type
layer, E_Zone *zone, E_Ga
gc->orient = E_GADCON_ORIENT_FLOAT;
gc->location = loc;
- /* Create ecore fullscreen window */
- if (layer > GADMAN_LAYER_BG)
- {
- if (!Man->top_ee)
- {
- Man->top_ee = e_canvas_new(Man->container->win, 0, 0, 0, 0, 1, 0,
- &(Man->top_win));
- ecore_evas_fullscreen_set(Man->top_ee, 1);
- ecore_evas_name_class_set(Man->top_ee, "gadman", "gadgets");
- }
-
- if (!Man->use_shaped_win)
- {
- ecore_evas_alpha_set(Man->top_ee, 1);
- Man->top_win = ecore_evas_software_x11_window_get(Man->top_ee);
- }
- else
- ecore_evas_shaped_set(Man->top_ee, 1);
-
- e_canvas_add(Man->top_ee); //??
- e_container_window_raise(Man->container, Man->top_win,
E_LAYER_FULLSCREEN);
+ gc->evas = e_comp_get(Man->container)->evas;
+ e_gadcon_ecore_evas_set(gc, e_comp_get(Man->container)->ee);
+ e_gadcon_xdnd_window_set(gc, e_comp_get(Man->container)->ee_win);
+ e_gadcon_dnd_window_set(gc, e_comp_get(Man->container)->ee_win);
- ecore_evas_move_resize(Man->top_ee, 0, 0, Man->width, Man->height);
- ecore_evas_hide(Man->top_ee);
+ e_gadcon_drop_handler_add(gc, _gadman_gadcon_dnd_enter_cb,
_gadman_gadcon_dnd_leave_cb,
+ _gadman_gadcon_dnd_move_cb,
_gadman_gadcon_dnd_drop_cb,
+ zone->x, zone->y, zone->w, zone->h);
+ 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 *)layer);
- gc->evas = ecore_evas_get(Man->top_ee);
- e_gadcon_ecore_evas_set(gc, Man->top_ee);
+ if (layer > GADMAN_LAYER_BG)
+ {
+ Man->overlay = e_popup_new(eina_list_data_get(Man->container->zones),
0, 0, Man->container->w, Man->container->h);
+ e_popup_name_set(Man->overlay, "noshadow_gadman");
+ e_popup_layer_set(Man->overlay, E_COMP_CANVAS_LAYER_LAYOUT,
E_LAYER_FULLSCREEN);
/* create full background object */
Man->full_bg = edje_object_add(gc->evas);
@@ -781,28 +765,13 @@ _gadman_gadcon_new(const char *name, Gadman_Layer_Type
layer, E_Zone *zone, E_Ga
edje_object_signal_callback_add(Man->full_bg, "e,action,hide,stop",
"", on_hide_stop, NULL);
- evas_object_move(Man->full_bg, 0, 0);
- evas_object_resize(Man->full_bg, Man->width, Man->height);
- evas_object_show(Man->full_bg);
+ e_popup_content_set(Man->overlay, Man->full_bg);
- e_drop_xdnd_register_set(Man->top_win, 1);
- e_gadcon_xdnd_window_set(gc, Man->top_win);
- e_gadcon_dnd_window_set(gc, Man->top_win);
+ /* create placeholder rect to maintain our dnd stacking layer */
+ gc->drop_handler->base = Man->overlay_layer =
evas_object_rectangle_add(gc->evas);
+ evas_object_layer_set(Man->overlay_layer, E_COMP_CANVAS_LAYER_LAYOUT +
E_LAYER_FULLSCREEN);
+ gc->drop_handler->hidden = 1;
}
- /* ... or use the e background window */
- else
- {
- gc->evas = e_comp_get(Man->container)->evas;
- e_gadcon_ecore_evas_set(gc, e_comp_get(Man->container)->ee);
- e_gadcon_xdnd_window_set(gc, e_comp_get(Man->container)->ee_win);
- e_gadcon_dnd_window_set(gc, e_comp_get(Man->container)->ee_win);
- }
- e_gadcon_drop_handler_add(gc, _gadman_gadcon_dnd_enter_cb,
_gadman_gadcon_dnd_leave_cb,
- _gadman_gadcon_dnd_move_cb,
_gadman_gadcon_dnd_drop_cb,
- zone->x, zone->y, zone->w, zone->h);
- 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 *)layer);
gc->id = ID_GADMAN_LAYER_BASE + layer;
gc->edje.o_parent = NULL;
@@ -876,6 +845,8 @@ _create_mover(E_Gadcon *gc)
evas_object_layer_set(mover, E_COMP_CANVAS_LAYER_DESKTOP);
evas_object_event_callback_add(mover, EVAS_CALLBACK_DEL, _mover_del,
NULL);
}
+ else
+ evas_object_layer_set(mover, E_COMP_CANVAS_LAYER_MENU);
e_theme_edje_object_set(mover, "base/theme/gadman", "e/gadman/control");
edje_object_signal_callback_add(mover, "e,action,move,start", "",
@@ -1101,24 +1072,6 @@ _attach_menu(void *data __UNUSED__, E_Gadcon_Client
*gcc, E_Menu *menu)
e_menu_item_callback_set(mi, on_menu_add, gcc);
}
-/* Callbacks */
-static void
-on_shape_change(void *data __UNUSED__, E_Container_Shape *es,
E_Container_Shape_Change ch __UNUSED__)
-{
- E_Container *con;
-
- con = e_container_shape_container_get(es);
- if ((con->w == Man->width) && (con->h == Man->height)) return;
-
- /* The screen size is changed */
- Man->width = con->w;
- Man->height = con->h;
- if (Man->gadman_reset_timer)
- ecore_timer_reset(Man->gadman_reset_timer);
- else
- Man->gadman_reset_timer = ecore_timer_add(3.0, _e_gadman_reset_timer,
NULL);
-}
-
static void
on_menu_style_plain(void *data, E_Menu *m __UNUSED__, E_Menu_Item *mi
__UNUSED__)
{
@@ -1513,7 +1466,7 @@ on_bg_click(void *data __UNUSED__, Evas_Object *o
__UNUSED__, const char *em __U
static void
on_hide_stop(void *data __UNUSED__, Evas_Object *o __UNUSED__, const char *em
__UNUSED__, const char *src __UNUSED__)
{
- ecore_evas_hide(Man->top_ee);
+ e_popup_hide(Man->overlay);
}
static int
@@ -1533,8 +1486,9 @@ _e_gadman_client_remove(void *data __UNUSED__,
E_Gadcon_Client *gcc)
static void
_e_gadman_handlers_add(void)
{
- E_LIST_HANDLER_APPEND(_gadman_hdls, E_EVENT_ZONE_ADD,
_e_gadman_cb_zone_add, NULL);
- E_LIST_HANDLER_APPEND(_gadman_hdls, E_EVENT_ZONE_DEL,
_e_gadman_cb_zone_del, NULL);
+ E_LIST_HANDLER_APPEND(_gadman_hdls, E_EVENT_ZONE_ADD,
_e_gadman_cb_zone_change, NULL);
+ E_LIST_HANDLER_APPEND(_gadman_hdls, E_EVENT_ZONE_MOVE_RESIZE,
_e_gadman_cb_zone_change, NULL);
+ E_LIST_HANDLER_APPEND(_gadman_hdls, E_EVENT_ZONE_DEL,
_e_gadman_cb_zone_change, NULL);
E_LIST_HANDLER_APPEND(_gadman_hdls, E_EVENT_MODULE_UPDATE,
_gadman_module_cb, NULL);
E_LIST_HANDLER_APPEND(_gadman_hdls, E_EVENT_MODULE_INIT_END,
_gadman_module_init_end_cb, NULL);
}
@@ -1585,7 +1539,7 @@ _e_gadman_reset_timer(void *d __UNUSED__)
}
static Eina_Bool
-_e_gadman_cb_zone_add(void *data __UNUSED__, int type __UNUSED__, void *event
__UNUSED__)
+_e_gadman_cb_zone_change(void *data __UNUSED__, int type __UNUSED__, void
*event __UNUSED__)
{
if (!Man) return ECORE_CALLBACK_RENEW;
if (Man->gadman_reset_timer)
@@ -1594,15 +1548,3 @@ _e_gadman_cb_zone_add(void *data __UNUSED__, int type
__UNUSED__, void *event __
Man->gadman_reset_timer = ecore_timer_add(3.0, _e_gadman_reset_timer,
NULL);
return ECORE_CALLBACK_PASS_ON;
}
-
-static Eina_Bool
-_e_gadman_cb_zone_del(void *data __UNUSED__, int type __UNUSED__, void *event
__UNUSED__)
-{
- if (!Man) return ECORE_CALLBACK_RENEW;
- if (Man->gadman_reset_timer)
- ecore_timer_reset(Man->gadman_reset_timer);
- else
- Man->gadman_reset_timer = ecore_timer_add(3.0, _e_gadman_reset_timer,
NULL);
- return ECORE_CALLBACK_RENEW;
-}
-
diff --git a/src/modules/gadman/e_mod_gadman.h
b/src/modules/gadman/e_mod_gadman.h
index 9460b7a..8977b3a 100644
--- a/src/modules/gadman/e_mod_gadman.h
+++ b/src/modules/gadman/e_mod_gadman.h
@@ -54,6 +54,7 @@ struct _Manager
Ecore_Timer *gadman_reset_timer;
Evas_Object *movers[GADMAN_LAYER_COUNT];
Evas_Object *full_bg;
+ Evas_Object *overlay_layer;
const char *icon_name;
E_Gadcon_Client *drag_gcc[GADMAN_LAYER_COUNT];
@@ -63,12 +64,10 @@ struct _Manager
Ecore_Event_Handler *add;
int visible;
- int use_shaped_win;
- Ecore_X_Window top_win;
- Ecore_Evas *top_ee;
+ E_Popup *overlay;
E_Container *container;
- Evas_Coord width, height;
+ int width, height;
E_Module *module;
E_Config_Dialog *config_dialog;
--
------------------------------------------------------------------------------
This SF.net email is sponsored by Windows:
Build for Windows Store.
http://p.sf.net/sfu/windows-dev2dev