From 8e0a7cedc1b8f2f5c808517fec597ec412682200 Mon Sep 17 00:00:00 2001 From: Marcel Hollerbach Date: Mon, 23 Mar 2020 12:12:06 -0400 Subject: [PATCH] efl_ui_widget: fix tree_unfocusable setting Summary: when setting twice the same value, unsetting the same value would not restore the same state in the tree again. With this commit, we ensure this is working correctly. Reviewers: zmike Reviewed By: zmike Subscribers: zmike, cedric, #reviewers, #committers Tags: #efl Differential Revision: https://phab.enlightenment.org/D11550 --- src/lib/elementary/efl_ui_widget.c | 21 +++++++++------ src/tests/elementary/efl_ui_test_widget.c | 33 +++++++++++++++++++++++ 2 files changed, 46 insertions(+), 8 deletions(-) diff --git a/src/lib/elementary/efl_ui_widget.c b/src/lib/elementary/efl_ui_widget.c index a58c66b99c..929e53a2e4 100644 --- a/src/lib/elementary/efl_ui_widget.c +++ b/src/lib/elementary/efl_ui_widget.c @@ -1748,7 +1748,9 @@ elm_widget_tree_unfocusable_set(Eo *obj, Eina_Bool tree_unfocusable) Efl_Ui_Widget *subs; Elm_Widget_Smart_Data *pd = efl_data_scope_safe_get(obj, MY_CLASS); EINA_SAFETY_ON_NULL_RETURN(pd); - int distance, parent_counter = (pd->parent_obj ? _tree_unfocusable_counter_get(pd->parent_obj) : 0); + int old_tree_unfocusable, distance, parent_counter = (pd->parent_obj ? _tree_unfocusable_counter_get(pd->parent_obj) : 0); + + old_tree_unfocusable = pd->tree_unfocusable; if (tree_unfocusable) pd->tree_unfocusable ++; @@ -1762,15 +1764,18 @@ elm_widget_tree_unfocusable_set(Eo *obj, Eina_Bool tree_unfocusable) distance = MAX(MIN(tree_unfocusable, 1), 0); pd->tree_unfocusable = parent_counter + distance; } - for (unsigned int i = 0; i < eina_array_count(pd->children); ++i) + if (old_tree_unfocusable != pd->tree_unfocusable) { - subs = eina_array_data_get(pd->children, i); - if (efl_isa(subs, EFL_UI_WIDGET_CLASS)) - elm_widget_tree_unfocusable_set(subs, elm_widget_tree_unfocusable_get(obj)); - } + for (unsigned int i = 0; i < eina_array_count(pd->children); ++i) + { + subs = eina_array_data_get(pd->children, i); + if (efl_isa(subs, EFL_UI_WIDGET_CLASS)) + elm_widget_tree_unfocusable_set(subs, elm_widget_tree_unfocusable_get(obj)); + } - //focus state eval on all children - _elm_widget_full_eval_children(obj, pd); + //focus state eval on all children + _elm_widget_full_eval_children(obj, pd); + } } /** diff --git a/src/tests/elementary/efl_ui_test_widget.c b/src/tests/elementary/efl_ui_test_widget.c index 7e55fd1b79..7b260dd40c 100644 --- a/src/tests/elementary/efl_ui_test_widget.c +++ b/src/tests/elementary/efl_ui_test_widget.c @@ -332,6 +332,38 @@ EFL_START_TEST(efl_ui_test_widget_win_provider_find) } EFL_END_TEST +#define CHECK_UNFOCUSABLE_STATE(x) \ + ck_assert_int_eq(elm_widget_tree_unfocusable_get(s.box), x); \ + ck_assert_int_eq(elm_widget_tree_unfocusable_get(s.win), x); \ + ck_assert_int_eq(elm_widget_tree_unfocusable_get(s.ic), x); \ + ck_assert_int_eq(elm_widget_tree_unfocusable_get(s.btn1), x); \ + ck_assert_int_eq(elm_widget_tree_unfocusable_get(s.btn2), x) + + +EFL_START_TEST(efl_ui_test_widget_tree_unfocusable) +{ + State s; + + _small_ui(&s); + CHECK_UNFOCUSABLE_STATE(0); + + elm_widget_tree_unfocusable_set(s.win, EINA_TRUE); + CHECK_UNFOCUSABLE_STATE(1); + + elm_widget_tree_unfocusable_set(s.win, EINA_FALSE); + CHECK_UNFOCUSABLE_STATE(0); + + elm_widget_tree_unfocusable_set(s.win, EINA_TRUE); + CHECK_UNFOCUSABLE_STATE(1); + + elm_widget_tree_unfocusable_set(s.win, EINA_TRUE); + CHECK_UNFOCUSABLE_STATE(1); + + elm_widget_tree_unfocusable_set(s.win, EINA_FALSE); + CHECK_UNFOCUSABLE_STATE(0); +} +EFL_END_TEST + void efl_ui_test_widget(TCase *tc) { tcase_add_checked_fixture(tc, fail_on_errors_setup, fail_on_errors_teardown); @@ -346,4 +378,5 @@ void efl_ui_test_widget(TCase *tc) tcase_add_test(tc, efl_ui_test_widget_disabled_parent); tcase_add_test(tc, efl_ui_test_widget_disabled_behaviour); tcase_add_test(tc, efl_ui_test_widget_win_provider_find); + tcase_add_test(tc, efl_ui_test_widget_tree_unfocusable); }