bu5hm4n pushed a commit to branch master. http://git.enlightenment.org/core/efl.git/commit/?id=de084292e06e011afb4e86134b25eb34041ba58b
commit de084292e06e011afb4e86134b25eb34041ba58b Author: Marcel Hollerbach <[email protected]> Date: Wed Nov 15 10:15:34 2017 +0100 efl_ui_focus_manager: unset the redirect chain once a redirect is set this prevents the manager from having a redirect chain while not even beeing used by the root manager --- src/lib/elementary/efl_ui_focus_manager_calc.c | 13 +++++--- src/tests/elementary/elm_test_focus.c | 46 ++++++++++++++++++++++++++ 2 files changed, 55 insertions(+), 4 deletions(-) diff --git a/src/lib/elementary/efl_ui_focus_manager_calc.c b/src/lib/elementary/efl_ui_focus_manager_calc.c index 1ed0f02e30..d440f8c313 100644 --- a/src/lib/elementary/efl_ui_focus_manager_calc.c +++ b/src/lib/elementary/efl_ui_focus_manager_calc.c @@ -1384,11 +1384,16 @@ _efl_ui_focus_manager_calc_efl_ui_focus_manager_focus_set(Eo *obj, Efl_Ui_Focus_ if (pd->redirect) { - //reset the history of that manager - efl_ui_focus_manager_reset_history(pd->redirect); + Efl_Ui_Focus_Manager *m = obj; + + //completly unset the current redirect chain + while (efl_ui_focus_manager_redirect_get(m)) + { + Efl_Ui_Focus_Manager *old = m; - //first unset the redirect - efl_ui_focus_manager_redirect_set(obj, NULL); + m = efl_ui_focus_manager_redirect_get(m); + efl_ui_focus_manager_redirect_set(old, NULL); + } } redirect_manager = node->redirect_manager; diff --git a/src/tests/elementary/elm_test_focus.c b/src/tests/elementary/elm_test_focus.c index e7b4676342..385b8fbcc0 100644 --- a/src/tests/elementary/elm_test_focus.c +++ b/src/tests/elementary/elm_test_focus.c @@ -396,6 +396,51 @@ START_TEST(root_redirect_chain) } END_TEST +START_TEST(root_redirect_chain_unset) +{ + Efl_Ui_Focus_Manager *m, *m2, *m3, *m4; + + elm_init(1, NULL); + + TEST_OBJ_NEW(root, 0, 20, 20, 20); + TEST_OBJ_NEW(root2, 0, 20, 20, 20); + TEST_OBJ_NEW(child, 0, 20, 20, 20); + + m = efl_add(EFL_UI_FOCUS_MANAGER_CALC_CLASS, NULL, + efl_ui_focus_manager_root_set(efl_added, root) + ); + + focus_test_manager_set(root2, m); + + m2 = efl_add(EFL_UI_FOCUS_MANAGER_CALC_CLASS, NULL, + efl_ui_focus_manager_root_set(efl_added, root2) + ); + + m3 = efl_add(EFL_UI_FOCUS_MANAGER_CALC_CLASS, NULL, + efl_ui_focus_manager_root_set(efl_added, root2) + ); + + m4 = efl_add(EFL_UI_FOCUS_MANAGER_CALC_CLASS, NULL, + efl_ui_focus_manager_root_set(efl_added, root2) + ); + + efl_ui_focus_manager_redirect_set(m, m3); + efl_ui_focus_manager_redirect_set(m3, m4); + efl_ui_focus_manager_redirect_set(m4, m2); + + efl_ui_focus_manager_calc_register(m, root2, root, m2); + efl_ui_focus_manager_calc_register(m2, child, root2, NULL); + efl_ui_focus_manager_focus_set(m2, child); + + ck_assert_ptr_eq(efl_ui_focus_manager_redirect_get(m), m2); + ck_assert_ptr_eq(efl_ui_focus_manager_redirect_get(m2), NULL); + ck_assert_ptr_eq(efl_ui_focus_manager_redirect_get(m3), NULL); + ck_assert_ptr_eq(efl_ui_focus_manager_redirect_get(m4), NULL); + + elm_shutdown(); +} +END_TEST + void elm_test_focus(TCase *tc) { tcase_add_test(tc, focus_register_twice); @@ -410,4 +455,5 @@ void elm_test_focus(TCase *tc) tcase_add_test(tc, order_check); tcase_add_test(tc, logical_shift); tcase_add_test(tc, root_redirect_chain); + tcase_add_test(tc, root_redirect_chain_unset); } --
