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);
 }

-- 


Reply via email to