From 29e7d477b1001c106dda45dbf434729831cb97a5 Mon Sep 17 00:00:00 2001 From: Jean-Philippe Andre Date: Tue, 22 Nov 2016 17:59:33 +0900 Subject: [PATCH] win: Simplify modal legacy API and add test case This fixes the modality of windows shown after setting the flag. --- src/Makefile_Elementary.am | 1 + src/bin/elementary/test.c | 2 + src/bin/elementary/test_win_modal.c | 78 +++++++++++++++++++++++++++++ src/lib/elementary/efl_ui_win.c | 36 ++++--------- 4 files changed, 90 insertions(+), 27 deletions(-) create mode 100644 src/bin/elementary/test_win_modal.c diff --git a/src/Makefile_Elementary.am b/src/Makefile_Elementary.am index 667840e9d5..97ff78b2d5 100644 --- a/src/Makefile_Elementary.am +++ b/src/Makefile_Elementary.am @@ -836,6 +836,7 @@ bin/elementary/test_win_plug.c \ bin/elementary/test_win_state.c \ bin/elementary/test_win_wm_rotation.c \ bin/elementary/test_win_dialog.c \ +bin/elementary/test_win_modal.c \ bin/elementary/test.h bin_elementary_elementary_test_LDADD = @USE_ELEMENTARY_LIBS@ diff --git a/src/bin/elementary/test.c b/src/bin/elementary/test.c index a250762a82..5595d88b6c 100644 --- a/src/bin/elementary/test.c +++ b/src/bin/elementary/test.c @@ -283,6 +283,7 @@ void test_dnd_multi_features(void *data, Evas_Object *obj, void *event_info); void test_dnd_types(void *data, Evas_Object *obj, void *event_info); void test_task_switcher(void *data, Evas_Object *obj, void *event_info); void test_win_dialog(void *data, Evas_Object *obj, void *event_info); +void test_win_modal(void *data, Evas_Object *obj, void *event_info); void test_box_disable(void *data, Evas_Object *obj, void *event_info); void test_layout_disable(void *data, Evas_Object *obj, void *event_info); @@ -642,6 +643,7 @@ add_tests: ADD_TEST(NULL, "Window / Background", "Window WM Rotation", test_win_wm_rotation); ADD_TEST(NULL, "Window / Background", "Window Standard/Dialog", test_win_dialog); ADD_TEST(NULL, "Window / Background", "Window Keygrab Set", test_win_keygrab); + ADD_TEST(NULL, "Window / Background", "Window Modal", test_win_modal); //------------------------------// ADD_TEST(NULL, "Images", "Icon", test_icon); diff --git a/src/bin/elementary/test_win_modal.c b/src/bin/elementary/test_win_modal.c new file mode 100644 index 0000000000..b844b8a972 --- /dev/null +++ b/src/bin/elementary/test_win_modal.c @@ -0,0 +1,78 @@ +#ifdef HAVE_CONFIG_H +# include "elementary_config.h" +#endif +#include + +static Evas_Object * +_parent_win_get(Evas_Object *obj) +{ + Evas_Object *parent = obj; + + while ((parent = elm_object_parent_widget_get(obj)) != NULL) + obj = parent; + + return obj; +} + +static void +_close(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *win = data; + + evas_object_del(win); +} + +void +test_win_modal(void *data EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED) +{ + Evas_Object *parent_win, *win, *bg, *txt, *bx, *bt; + + parent_win = _parent_win_get(obj); + + win = elm_win_add(parent_win, "modal", ELM_WIN_BASIC); + elm_win_title_set(win, "Window Modal"); + elm_win_autodel_set(win, EINA_TRUE); + + bg = elm_bg_add(win); + elm_win_resize_object_add(win, bg); + evas_object_size_hint_align_set(bg, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_show(bg); + + bx = elm_box_add(win); + elm_win_resize_object_add(win, bx); + evas_object_size_hint_align_set(bx, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_show(bx); + + txt = elm_label_add(win); + elm_object_text_set(txt, "This is a modal window.
" + "It will block all inputs on all the other opened windows."); + evas_object_size_hint_align_set(txt, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(txt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_label_line_wrap_set(txt, ELM_WRAP_WORD); + elm_box_pack_end(bx, txt); + evas_object_show(txt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Open another modal window"); + evas_object_size_hint_align_set(bt, 0.5, 0.5); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0); + evas_object_smart_callback_add(bt, "clicked", test_win_modal, NULL); + elm_box_pack_end(bx, bt); + evas_object_show(bt); + + bt = elm_button_add(win); + elm_object_text_set(bt, "Close"); + evas_object_size_hint_align_set(bt, 0.5, 0.5); + evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, 0); + evas_object_smart_callback_add(bt, "clicked", _close, win); + elm_box_pack_end(bx, bt); + evas_object_show(bt); + + /* make the window modal */ + elm_win_modal_set(win, EINA_TRUE); + + evas_object_resize(win, 250, 150); + evas_object_show(win); +} diff --git a/src/lib/elementary/efl_ui_win.c b/src/lib/elementary/efl_ui_win.c index 537e1aee39..2710fd81d6 100644 --- a/src/lib/elementary/efl_ui_win.c +++ b/src/lib/elementary/efl_ui_win.c @@ -2155,9 +2155,6 @@ _efl_ui_win_show(Eo *obj, Efl_Ui_Win_Data *sd) return; } - if (!evas_object_visible_get(obj)) do_eval = EINA_TRUE; - efl_gfx_visible_set(efl_super(obj, MY_CLASS), EINA_TRUE); - if ((sd->modal) && (!evas_object_visible_get(obj))) { const Eina_List *l; @@ -2165,6 +2162,9 @@ _efl_ui_win_show(Eo *obj, Efl_Ui_Win_Data *sd) INCREMENT_MODALITY() } + if (!evas_object_visible_get(obj)) do_eval = EINA_TRUE; + efl_gfx_visible_set(efl_super(obj, MY_CLASS), EINA_TRUE); + if (sd->deferred_resize_job) _elm_win_resize_job(sd->obj); evas_smart_objects_calculate(evas_object_evas_get(obj)); @@ -7268,37 +7268,19 @@ elm_win_demand_attention_get(const Evas_Object *obj) EAPI void elm_win_modal_set(Evas_Object *obj, Eina_Bool modal) { - ELM_WIN_CHECK(obj); - ELM_WIN_DATA_GET_OR_RETURN(obj, sd); + Efl_Ui_Win_Modal_Mode modality; - 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 - _elm_win_xwin_update(sd); -#endif + modality = modal ? EFL_UI_WIN_MODAL_MODAL : EFL_UI_WIN_MODAL_NONE; + efl_ui_win_modal_set(obj, modality); } EAPI Eina_Bool elm_win_modal_get(const Evas_Object *obj) { - ELM_WIN_CHECK(obj) EINA_FALSE; - ELM_WIN_DATA_GET_OR_RETURN(obj, sd, EINA_FALSE); + Efl_Ui_Win_Modal_Mode modality; - return sd->modal; + modality = efl_ui_win_modal_get(obj); + return (modality != EFL_UI_WIN_MODAL_NONE); } EAPI void