summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarcel Hollerbach <mail@marcel-hollerbach.de>2020-03-23 12:12:06 -0400
committerMike Blumenkrantz <zmike@samsung.com>2020-03-23 12:12:06 -0400
commit8e0a7cedc1b8f2f5c808517fec597ec412682200 (patch)
tree89055bcbf9916b2e29e84a74fd229254e221ba2d
parenta1c7384da9dede4a63616fe9ba1824bea0a2da6d (diff)
downloadefl-8e0a7cedc1b8f2f5c808517fec597ec412682200.tar.gz
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
-rw-r--r--src/lib/elementary/efl_ui_widget.c21
-rw-r--r--src/tests/elementary/efl_ui_test_widget.c33
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);
}