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

Reply via email to