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