2013/6/12 Mike Blumenkrantz - Enlightenment Git <no-re...@enlightenment.org>
> discomfitor pushed a commit to branch master. > > commit 84793983e18e0e0ba707d754ea3fc5f80cf55c09 > Author: Mike Blumenkrantz <m.blumenk...@samsung.com> > 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?) > That was there (lots of years ago, when I first write gadman) to handle screen resolution changes. Gadgets use relative positioning, thus when you change screen resolution the gadgets was correctly recalculated their position. For example: if you have a gadget in the bottom-right corner and you change the screen resolution to a lower one, the gadget will not get lost > > * 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 > ------------------------------------------------------------------------------ This SF.net email is sponsored by Windows: Build for Windows Store. http://p.sf.net/sfu/windows-dev2dev _______________________________________________ enlightenment-devel mailing list enlightenment-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/enlightenment-devel