diff --git a/src/Makefile_Elementary.am b/src/Makefile_Elementary.am index 3b7413b79b..c57b83095b 100644 --- a/src/Makefile_Elementary.am +++ b/src/Makefile_Elementary.am @@ -1346,7 +1346,7 @@ tests_elementary_elm_suite_SOURCES = \ tests/elementary/tests_elementary_elm_suite-elm_test_focus.$(OBJEXT): tests/elementary/focus_test.eo.c tests/elementary/focus_test.eo.h -tests/elementary/tests_elementary_elm_suite-elm_test_focus_sub.$(OBJEXT): tests/elementary/focus_test_sub.eo.c tests/elementary/focus_test_sub.eo.h +tests/elementary/tests_elementary_elm_suite-elm_test_focus_sub.$(OBJEXT): tests/elementary/focus_test_sub_main.eo.c tests/elementary/focus_test_sub_main.eo.h tests_elementary_elm_suite_CPPFLAGS = \ -DTESTS_BUILD_DIR=\"${top_builddir}/src/tests/elementary\" \ diff --git a/src/lib/elementary/efl_ui_focus_manager_sub.c b/src/lib/elementary/efl_ui_focus_manager_sub.c index a1c0b2145b..6fee1812f2 100644 --- a/src/lib/elementary/efl_ui_focus_manager_sub.c +++ b/src/lib/elementary/efl_ui_focus_manager_sub.c @@ -175,33 +175,41 @@ _logical_manager_change(void *data EINA_UNUSED, const Efl_Event *ev) } static void -_manager_change(void *data, const Efl_Event *ev) +_flush_manager(Eo *obj, Efl_Ui_Focus_Manager_Sub_Data *pd) { - MY_DATA(data, pd); - Efl_Ui_Focus_Manager *manager; - Efl_Ui_Focus_Object *logical; + Efl_Ui_Focus_Object *logical, *real_object; Efl_Ui_Focus_User *b; Eina_List *n; - logical = efl_ui_focus_user_parent_get(ev->object); - manager = efl_ui_focus_user_manager_get(ev->object); + real_object = efl_parent_get(obj); + + logical = efl_ui_focus_user_parent_get(real_object); + manager = efl_ui_focus_user_manager_get(real_object); //unregister from the old - efl_event_callback_array_del(pd->manager, parent_manager(), data); - efl_event_callback_array_add(manager, parent_manager(), data); + efl_event_callback_array_del(pd->manager, parent_manager(), obj); + efl_event_callback_array_add(manager, parent_manager(), obj); EINA_LIST_FOREACH(pd->current_border , n, b) { - if (b == ev->object) continue; + if (b == real_object) continue; - _unregister(data, manager, b); - _register(data, manager, b, logical); + _unregister(obj, manager, b); + _register(obj, manager, b, logical); } //unregister the old manager, use the new pd->manager = manager; } +static void +_manager_change(void *data, const Efl_Event *ev EINA_UNUSED) +{ + MY_DATA(data, pd); + + _flush_manager(data, pd); +} + EFL_CALLBACKS_ARRAY_DEFINE(self_manager, {EFL_UI_FOCUS_MANAGER_EVENT_COORDS_DIRTY, _self_manager_dirty}, {EFL_UI_FOCUS_USER_EVENT_LOGICAL_CHANGED, _logical_manager_change}, @@ -223,6 +231,8 @@ _efl_ui_focus_manager_sub_efl_object_parent_set(Eo *obj, Efl_Ui_Focus_Manager_Su new_parent = efl_parent_get(obj); _efl_ui_focus_manager_redirect_events_add(obj, new_parent); efl_event_callback_array_add(new_parent, self_manager(), obj); + + _flush_manager(obj, pd); } EOLIAN static Efl_Object* diff --git a/src/tests/elementary/elm_test_focus.c b/src/tests/elementary/elm_test_focus.c index 250e3b1fdd..3908b40ed2 100644 --- a/src/tests/elementary/elm_test_focus.c +++ b/src/tests/elementary/elm_test_focus.c @@ -93,6 +93,7 @@ START_TEST(redirect) elm_init(1, NULL); TEST_OBJ_NEW(root, 0, 0, 20, 20); + TEST_OBJ_NEW(root2, 0, 0, 20, 20); TEST_OBJ_NEW(one, 0, 0, 20, 20); TEST_OBJ_NEW(two, 20, 0, 20, 20); @@ -101,10 +102,11 @@ START_TEST(redirect) ); Efl_Ui_Focus_Manager *m2 = efl_add(EFL_UI_FOCUS_MANAGER_CLASS, NULL, - efl_ui_focus_manager_root_set(efl_added, one) + efl_ui_focus_manager_root_set(efl_added, root2) ); - efl_ui_focus_manager_register(m2, two, one, NULL); + efl_ui_focus_manager_register(m2, one, root2, NULL); + efl_ui_focus_manager_register(m2, two, root2, NULL); efl_ui_focus_manager_redirect_set(m, m2); efl_ui_focus_manager_focus(m2, one); @@ -205,7 +207,7 @@ START_TEST(logical_chain) Efl_Object *logical_chain[] = { child1, subchild11, subchild12, subchild13, - child2, subchild21, subchild22, subchild23, root, NULL + child2, subchild21, subchild22, subchild23, NULL }; for (i = 0; logical_chain[i]; ++i) { @@ -319,7 +321,6 @@ START_TEST(order_check) order = eina_list_append(order, child1); ck_assert_int_eq(efl_ui_focus_manager_update_children(m, root, order), 1); - eina_list_free(order); order = NULL; //negativ check diff --git a/src/tests/elementary/elm_test_focus_sub.c b/src/tests/elementary/elm_test_focus_sub.c index f626014acf..b4927d2180 100644 --- a/src/tests/elementary/elm_test_focus_sub.c +++ b/src/tests/elementary/elm_test_focus_sub.c @@ -1,23 +1,30 @@ #include "elm_test_focus_common.h" -#include "focus_test_sub.eo.h" +#include "focus_test_sub_main.eo.h" typedef struct { -} Focus_Test_Sub_Data; +} Focus_Test_Sub_Main_Data; + EOLIAN static void -_focus_test_sub_efl_ui_focus_object_geometry_get(Eo *obj EINA_UNUSED, Focus_Test_Sub_Data *pd EINA_UNUSED, Eina_Rectangle *rect EINA_UNUSED) +_focus_test_sub_main_efl_ui_focus_object_geometry_get(Eo *obj EINA_UNUSED, Focus_Test_Sub_Main_Data *pd EINA_UNUSED, Eina_Rectangle *rect) { - rect->y = rect->x = 0; - rect->w = rect->h = 20; + EINA_RECTANGLE_SET(rect, 0, 0, 20, 20); } -EOLIAN static Eina_Bool -_focus_test_sub_efl_ui_focus_object_focus_get(Eo *obj EINA_UNUSED, Focus_Test_Sub_Data *pd EINA_UNUSED) +EOLIAN static Efl_Ui_Focus_Manager* +_focus_test_sub_main_efl_ui_focus_user_manager_get(Eo *obj, Focus_Test_Sub_Main_Data *pd EINA_UNUSED) { - return EINA_FALSE; + return efl_key_data_get(obj, "__user_manager"); } +EOLIAN static Efl_Ui_Focus_Object* +_focus_test_sub_main_efl_ui_focus_user_parent_get(Eo *obj, Focus_Test_Sub_Main_Data *pd EINA_UNUSED) +{ + return efl_key_data_get(obj, "__user_parent"); +} + + static Eina_List *registered; static Eina_List *unregistered; @@ -54,7 +61,7 @@ _set_equal(Eina_List *a, Eina_List *b) return EINA_TRUE; } -#include "focus_test_sub.eo.c" +#include "focus_test_sub_main.eo.c" static void _setup(Efl_Ui_Focus_Manager **m, Efl_Ui_Focus_Manager_Sub **sub, Efl_Ui_Focus_Object **r) @@ -78,13 +85,19 @@ _setup(Efl_Ui_Focus_Manager **m, Efl_Ui_Focus_Manager_Sub **sub, Efl_Ui_Focus_Ob efl_object_override(manager, &manager_tracker); - Efl_Ui_Focus_Manager_Sub *subm = efl_add(FOCUS_TEST_SUB_CLASS, manager, + Focus_Test_Sub_Main *main = efl_add(FOCUS_TEST_SUB_MAIN_CLASS, NULL); + + efl_key_data_set(main, "__user_manager", manager); + efl_key_data_set(main, "__user_parent", root_manager); + + Efl_Ui_Focus_Manager_Sub *subm = efl_add(EFL_UI_FOCUS_MANAGER_SUB_CLASS, main, efl_ui_focus_manager_root_set(efl_added, root) ); - efl_event_callback_call(manager, EFL_UI_FOCUS_MANAGER_EVENT_PRE_FLUSH, NULL); + efl_composite_attach(main, subm); + efl_ui_focus_manager_register_logical(manager, main, root_manager, subm); - *sub = subm; + *sub = main; *m = manager; *r = root; } @@ -102,7 +115,7 @@ START_TEST(correct_register) TEST_OBJ_NEW(child2, 10, 0, 10, 10); TEST_OBJ_NEW(child3, 0, 10, 10, 10); - set1 = eina_list_append(set1, sub); + //set1 = eina_list_append(set1, sub); //set1 = eina_list_append(set1, root); set1 = eina_list_append(set1, child1); set1 = eina_list_append(set1, child2); @@ -117,12 +130,14 @@ START_TEST(correct_register) ck_assert_ptr_eq(unregistered, NULL); fail_if(!_set_equal(registered, set1)); - efl_del(sub); - efl_del(manager); - efl_del(root); + efl_ui_focus_manager_unregister(sub, child1); + efl_ui_focus_manager_unregister(sub, child2); + efl_ui_focus_manager_unregister(sub, child3); efl_del(child1); efl_del(child2); efl_del(child3); + efl_del(sub); + efl_del(manager); elm_shutdown(); } END_TEST diff --git a/src/tests/elementary/focus_test_sub.eo b/src/tests/elementary/focus_test_sub.eo deleted file mode 100644 index fcf37fd84d..0000000000 --- a/src/tests/elementary/focus_test_sub.eo +++ /dev/null @@ -1,6 +0,0 @@ -class Focus.Test.Sub(Efl.Ui.Focus.Manager.Sub) { - implements { - Efl.Ui.Focus.Object.geometry_get; - Efl.Ui.Focus.Object.focus.get; - } -} \ No newline at end of file diff --git a/src/tests/elementary/focus_test_sub_main.eo b/src/tests/elementary/focus_test_sub_main.eo new file mode 100644 index 0000000000..3c417cddf0 --- /dev/null +++ b/src/tests/elementary/focus_test_sub_main.eo @@ -0,0 +1,7 @@ +class Focus.Test.Sub.Main(Efl.Object, Efl.Ui.Focus.User, Efl.Ui.Focus.Object, Efl.Ui.Focus.Manager) { + implements { + Efl.Ui.Focus.User.manager.get; + Efl.Ui.Focus.User.parent.get; + Efl.Ui.Focus.Object.geometry_get; + } +} \ No newline at end of file