This commit seems to have added a few warnings to our build.

../../../src/lib/elm_menu.c:505:9: warning: passing argument 1 of 
'elm_object_item_disabled_set' from incompatible pointer type [enabled 
by default]
          elm_object_item_disabled_set(current, EINA_TRUE);

--
Tom.


On 09/04/14 11:03, Bogdan Devichev wrote:
> raster pushed a commit to branch master.
>
> http://git.enlightenment.org/core/elementary.git/commit/?id=aedef31eddf38567e27abcb4f753cf803c4f7b47
>
> commit aedef31eddf38567e27abcb4f753cf803c4f7b47
> Author: Bogdan Devichev <b.devic...@samsung.com>
> Date:   Wed Apr 9 19:04:55 2014 +0900
>
>      elementary: when modal win appears another wins are blocked
>
>      Summary:
>      In win.edc add blocker for its content and programs for it. Add
>      Eina_Bool blocked and was_enabled to _Elm_Menu_Item for correctly 
> blocking
>      and unblocking of main_menu. They used for saving state which was before 
> modal
>      win was apeared. Add callbacks and private functions in menu.c for 
> blocking and
>      unblocking menu. Add integer modal_count to Elm_Win_Smart_Data for 
> creating
>      enum of modal wins. Add changes in win.c for blocking content, in_focus 
> callback
>      and menu while modal win is exist.
>
>      Reviewers: cedric, seoz, raster
>
>      Reviewed By: raster
>
>      CC: reutskiy.v.v, raster
>
>      Differential Revision: https://phab.enlightenment.org/D607
> ---
>   data/themes/edc/elm/win.edc | 24 +++++++++++++
>   src/lib/elm_menu.c          | 31 +++++++++++++++++
>   src/lib/elm_widget_menu.h   |  2 ++
>   src/lib/elm_win.c           | 83 
> +++++++++++++++++++++++++++++++++++++++++++--
>   4 files changed, 138 insertions(+), 2 deletions(-)
>
> diff --git a/data/themes/edc/elm/win.edc b/data/themes/edc/elm/win.edc
> index 56af51f..343de6c 100644
> --- a/data/themes/edc/elm/win.edc
> +++ b/data/themes/edc/elm/win.edc
> @@ -28,6 +28,18 @@ group { name: "elm/win/base/default";
>               }
>            }
>         }
> +      part { name: "blocker"; type: RECT;
> +         description { state: "default" 0.0;
> +            rel1.relative : 0.0 0.0;
> +            rel2.relative : 1.0 1.0;
> +            color: 64 64 64 150;
> +            visible: 0;
> +         }
> +         description { state: "visible" 0.0;
> +            inherit: "default" 0.0;
> +            visible: 1;
> +         }
> +      }
>      }
>      programs {
>         program { name: "show_menu";
> @@ -42,5 +54,17 @@ group { name: "elm/win/base/default";
>            action: STATE_SET "default" 0.0;
>            target: "elm.swallow.menu";
>         }
> +      program { name: "hide_blocker";
> +         signal: "elm,action,hide_blocker";
> +         source: "elm";
> +         action: STATE_SET "default" 0.0;
> +         target: "blocker";
> +      }
> +      program { name: "show_blocker";
> +         signal: "elm,action,show_blocker";
> +         source: "elm";
> +         action: STATE_SET "visible" 0.0;
> +         target: "blocker";
> +      }
>      }
>   }
> diff --git a/src/lib/elm_menu.c b/src/lib/elm_menu.c
> index d13f442..5e8a356 100644
> --- a/src/lib/elm_menu.c
> +++ b/src/lib/elm_menu.c
> @@ -492,6 +492,33 @@ _menu_item_inactivate_cb(void *data,
>      if (item->submenu.open) _submenu_hide(item);
>   }
>
> +static void
> +_block_menu(Elm_Menu_Data * sd, Evas_Object *obj EINA_UNUSED, ...)
> +{
> +   const Eina_List *l;
> +   Elm_Menu_Item *current;
> +   Eina_List *items = sd->items;
> +   EINA_LIST_FOREACH(items, l, current)
> +     {
> +        if (!current->blocked) current->was_enabled = 
> !elm_widget_item_disabled_get(current);
> +        current->blocked = EINA_TRUE;
> +        elm_object_item_disabled_set(current, EINA_TRUE);
> +     }
> +}
> +
> +static void
> +_unblock_menu(Elm_Menu_Data * sd, Evas_Object *obj EINA_UNUSED, ...)
> +{
> +   const Eina_List *l;
> +   Elm_Menu_Item *current;
> +   Eina_List *items = sd->items;
> +   EINA_LIST_FOREACH(items, l, current)
> +     {
> +        elm_object_item_disabled_set(current, !current->was_enabled);
> +        current->blocked = EINA_FALSE;
> +     }
> +}
> +
>   EOLIAN static void
>   _elm_menu_evas_smart_show(Eo *obj EINA_UNUSED, Elm_Menu_Data *sd)
>   {
> @@ -736,6 +763,10 @@ _elm_menu_eo_base_constructor(Eo *obj, Elm_Menu_Data *sd)
>          (sd->hv, ELM_HOVER_AXIS_VERTICAL), sd->bx);
>
>      _sizing_eval(obj);
> +   evas_object_smart_callback_add(obj, "elm,action,block_menu",
> +                                  _block_menu, sd);
> +   evas_object_smart_callback_add(obj, "elm,action,unblock_menu",
> +                                  _unblock_menu, sd);
>   }
>
>   EAPI void
> diff --git a/src/lib/elm_widget_menu.h b/src/lib/elm_widget_menu.h
> index 04fe244..0cede00 100644
> --- a/src/lib/elm_widget_menu.h
> +++ b/src/lib/elm_widget_menu.h
> @@ -53,6 +53,8 @@ struct _Elm_Menu_Item
>      Eina_Bool      separator : 1;
>      Eina_Bool      selected : 1;
>      Eina_Bool      object_item : 1;
> +   Eina_Bool      was_enabled : 1;
> +   Eina_Bool      blocked : 1;
>   };
>
>   /**
> diff --git a/src/lib/elm_win.c b/src/lib/elm_win.c
> index c3a1651..227f051 100644
> --- a/src/lib/elm_win.c
> +++ b/src/lib/elm_win.c
> @@ -50,6 +50,40 @@ static const Elm_Win_Trap *trap = NULL;
>     if (!obj || !eo_isa(obj, MY_CLASS)) \
>       return
>
> +#define DECREMENT_MODALITY()                                    \
> +  EINA_LIST_FOREACH(_elm_win_list, l, current)                  \
> +    {                                                           \
> +       ELM_WIN_DATA_GET_OR_RETURN(current, cursd);              \
> +       if ((obj != current) && (cursd->modal_count > 0))        \
> +         {                                                      \
> +            cursd->modal_count--;                               \
> +         }                                                      \
> +       if (cursd->modal_count == 0)                             \
> +         {                                                      \
> +            edje_object_signal_emit(cursd->layout, \
> +                        "elm,action,hide_blocker", "elm");      \
> +            evas_object_smart_callback_call(cursd->main_menu, \
> +                        "elm,action,unblock_menu", NULL);       \
> +         }                                                      \
> +    }
> +
> +#define INCREMENT_MODALITY()                                    \
> +  EINA_LIST_FOREACH(_elm_win_list, l, current)                  \
> +    {                                                           \
> +       ELM_WIN_DATA_GET_OR_RETURN(current, cursd);              \
> +       if (obj != current)                                      \
> +         {                                                      \
> +            cursd->modal_count++;                               \
> +         }                                                      \
> +       if (cursd->modal_count > 0)                              \
> +         {                                                      \
> +            edje_object_signal_emit(cursd->layout, \
> +                             "elm,action,show_blocker", "elm"); \
> +            evas_object_smart_callback_call(cursd->main_menu, \
> +                             "elm,action,block_menu", NULL);    \
> +         }                                                      \
> +    }
> +
>   #define ENGINE_GET() (_elm_preferred_engine ? _elm_preferred_engine : 
> (_elm_config->engine ? _elm_config->engine : ""))
>   #define ENGINE_COMPARE(name) (!strcmp(ENGINE_GET(), name))
>
> @@ -158,6 +192,7 @@ struct _Elm_Win_Data
>      int          size_base_w, size_base_h;
>      int          size_step_w, size_step_h;
>      int          norender;
> +   int          modal_count;
>      Eina_Bool    urgent : 1;
>      Eina_Bool    modal : 1;
>      Eina_Bool    demand_attention : 1;
> @@ -858,7 +893,7 @@ _elm_win_focus_in(Ecore_Evas *ee)
>      Evas_Object *obj;
>      unsigned int order = 0;
>
> -   if (!sd) return;
> +   if ((!sd) || (sd->modal_count)) return;
>
>      obj = sd->obj;
>
> @@ -1249,10 +1284,19 @@ _deferred_ecore_evas_free(void *data)
>   EOLIAN static void
>   _elm_win_evas_smart_show(Eo *obj, Elm_Win_Data *sd)
>   {
> +   if (sd->modal_count) return;
> +   const Eina_List *l;
> +   Evas_Object *current;
> +
>      if (!evas_object_visible_get(obj))
>        _elm_win_state_eval_queue();
>      eo_do_super(obj, MY_CLASS, evas_obj_smart_show());
>
> +   if ((sd->modal) && (!evas_object_visible_get(obj)))
> +     {
> +        INCREMENT_MODALITY()
> +     }
> +
>      TRAP(sd, show);
>
>      if (sd->shot.info) _shot_handle(sd);
> @@ -1261,10 +1305,19 @@ _elm_win_evas_smart_show(Eo *obj, Elm_Win_Data *sd)
>   EOLIAN static void
>   _elm_win_evas_smart_hide(Eo *obj, Elm_Win_Data *sd)
>   {
> +   if (sd->modal_count) return;
> +   const Eina_List *l;
> +   Evas_Object *current;
> +
>      if (evas_object_visible_get(obj))
>        _elm_win_state_eval_queue();
>      eo_do_super(obj, MY_CLASS, evas_obj_smart_hide());
>
> +   if ((sd->modal) && (evas_object_visible_get(obj)))
> +     {
> +        DECREMENT_MODALITY()
> +     }
> +
>      TRAP(sd, hide);
>
>      if (sd->frame_obj)
> @@ -1512,6 +1565,17 @@ _elm_win_img_callbacks_del(Evas_Object *obj, 
> Evas_Object *imgobj)
>   EOLIAN static void
>   _elm_win_evas_smart_del(Eo *obj, Elm_Win_Data *sd)
>   {
> +   const Eina_List *l;
> +   Evas_Object *current;
> +
> +   if ((sd->modal) && (evas_object_visible_get(obj)))
> +     {
> +       DECREMENT_MODALITY()
> +     }
> +
> +   if ((sd->modal) && (sd->modal_count > 0))
> +     ERR("Deleted modal win was blocked by another modal win which was 
> created after creation of that win.");
> +
>      evas_object_event_callback_del_full(sd->layout,
>                                          EVAS_CALLBACK_CHANGED_SIZE_HINTS,
>                                          
> _elm_win_on_resize_obj_changed_size_hints,
> @@ -3111,6 +3175,7 @@ _elm_win_constructor(Eo *obj, Elm_Win_Data *sd, const 
> char *name, Elm_Win_Type t
>
>      sd->type = type;
>      sd->parent = parent;
> +   sd->modal_count = 0;
>
>      if (sd->parent)
>        evas_object_event_callback_add
> @@ -3834,8 +3899,22 @@ _elm_win_demand_attention_get(Eo *obj EINA_UNUSED, 
> Elm_Win_Data *sd)
>   }
>
>   EOLIAN static void
> -_elm_win_modal_set(Eo *obj EINA_UNUSED, Elm_Win_Data *sd, Eina_Bool modal)
> +_elm_win_modal_set(Eo *obj, Elm_Win_Data *sd, Eina_Bool modal)
>   {
> +   if (sd->modal_count) return;
> +
> +   const Eina_List *l;
> +   Evas_Object *current;
> +
> +   if ((modal) && (!sd->modal) && (evas_object_visible_get(obj)))
> +     {
> +       INCREMENT_MODALITY()
> +     }
> +   else if ((!modal) && (sd->modal) && (evas_object_visible_get(obj)))
> +     {
> +       DECREMENT_MODALITY()
> +     }
> +
>      sd->modal = modal;
>      TRAP(sd, modal_set, modal);
>   #ifdef HAVE_ELEMENTARY_X
>


------------------------------------------------------------------------------
Put Bad Developers to Shame
Dominate Development with Jenkins Continuous Integration
Continuously Automate Build, Test & Deployment 
Start a new project now. Try Jenkins in the cloud.
http://p.sf.net/sfu/13600_Cloudbees
_______________________________________________
enlightenment-devel mailing list
enlightenment-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/enlightenment-devel

Reply via email to