From b8465450720ebca3e1f9ca5c3e4e72ec1061414e Mon Sep 17 00:00:00 2001 From: Marcel Hollerbach Date: Thu, 13 Jul 2017 10:12:50 +0200 Subject: [PATCH] efl_ui_focus_manager_sub: make it a mixin This just brings the functionality, the manager that is used as sub can still be decided and be brought in via inheritance or compositition --- src/lib/elementary/efl_ui_focus_manager_sub.c | 55 ++++++------------- .../elementary/efl_ui_focus_manager_sub.eo | 9 +-- src/lib/elementary/elm_interface_scrollable.c | 2 +- .../elementary/elm_interface_scrollable.eo | 2 +- src/tests/elementary/elm_test_focus_sub.c | 5 +- src/tests/elementary/focus_test_sub_main.eo | 2 +- 6 files changed, 24 insertions(+), 51 deletions(-) diff --git a/src/lib/elementary/efl_ui_focus_manager_sub.c b/src/lib/elementary/efl_ui_focus_manager_sub.c index 265781d7fe..1c51865d99 100644 --- a/src/lib/elementary/efl_ui_focus_manager_sub.c +++ b/src/lib/elementary/efl_ui_focus_manager_sub.c @@ -5,7 +5,7 @@ #include #include "elm_priv.h" -#define MY_CLASS EFL_UI_FOCUS_MANAGER_SUB_CLASS +#define MY_CLASS EFL_UI_FOCUS_MANAGER_SUB_MIXIN #define MY_DATA(o, p) Efl_Ui_Focus_Manager_Sub_Data *p = efl_data_scope_get(o, MY_CLASS); typedef struct { Efl_Ui_Focus_Manager *manager;//the manager where current_border is currently registered @@ -34,10 +34,8 @@ _focus_changed(void *data, const Efl_Event *event) { Efl_Ui_Focus_Manager_Sub *m = data; Efl_Ui_Focus_Manager *manager; - Elm_Widget *elem; - elem = efl_parent_get(m); - manager = efl_ui_focus_user_manager_get(elem); + manager = efl_ui_focus_user_manager_get(m); //only do this when we are getting focus if (!event->info) return; @@ -69,11 +67,9 @@ _border_flush(Eo *obj, Efl_Ui_Focus_Manager_Sub_Data *pd) Eina_List *selection, *tmp; Efl_Ui_Focus_Object *node, *logical; Efl_Ui_Focus_Manager *manager; - Efl_Ui_Focus_Manager *elem; - elem = efl_parent_get(obj); - manager = efl_ui_focus_user_manager_get(elem); - logical = elem; + manager = efl_ui_focus_user_manager_get(obj); + logical = obj; borders = efl_ui_focus_manager_border_elements_get(obj); selection = NULL; @@ -89,7 +85,7 @@ _border_flush(Eo *obj, Efl_Ui_Focus_Manager_Sub_Data *pd) EINA_LIST_FREE(tmp, node) { - if (node == elem) continue; + if (node == obj) continue; _unregister(obj, manager, node); } @@ -99,7 +95,7 @@ _border_flush(Eo *obj, Efl_Ui_Focus_Manager_Sub_Data *pd) EINA_LIST_FREE(tmp, node) { - if (node == elem) continue; + if (node == obj) continue; _register(obj, manager, node, logical); } @@ -112,14 +108,11 @@ _border_unregister(Eo *obj, Efl_Ui_Focus_Manager_Sub_Data *pd) { Efl_Ui_Focus_Object *node; Efl_Ui_Focus_Manager *manager; - Efl_Ui_Focus_Manager *elem; - elem = efl_parent_get(obj); - - manager = efl_ui_focus_user_manager_get(elem); + manager = efl_ui_focus_user_manager_get(obj); EINA_LIST_FREE(pd->current_border, node) { - if (node == elem) continue; + if (node == obj) continue; _unregister(obj, manager, node); } } @@ -178,14 +171,13 @@ static void _flush_manager(Eo *obj, Efl_Ui_Focus_Manager_Sub_Data *pd) { Efl_Ui_Focus_Manager *manager; - Efl_Ui_Focus_Object *logical, *real_object; + Efl_Ui_Focus_Object *logical; Efl_Ui_Focus_User *b; Eina_List *n; - real_object = efl_parent_get(obj); - logical = efl_ui_focus_user_parent_get(real_object); - manager = efl_ui_focus_user_manager_get(real_object); + logical = efl_ui_focus_user_parent_get(obj); + manager = efl_ui_focus_user_manager_get(obj); //unregister from the old efl_event_callback_array_del(pd->manager, parent_manager(), obj); @@ -193,7 +185,7 @@ _flush_manager(Eo *obj, Efl_Ui_Focus_Manager_Sub_Data *pd) EINA_LIST_FOREACH(pd->current_border , n, b) { - if (b == real_object) continue; + if (b == obj) continue; _unregister(obj, manager, b); _register(obj, manager, b, logical); @@ -216,28 +208,13 @@ EFL_CALLBACKS_ARRAY_DEFINE(self_manager, {EFL_UI_FOCUS_USER_EVENT_MANAGER_CHANGED, _manager_change} ); -EOLIAN static void -_efl_ui_focus_manager_sub_efl_object_parent_set(Eo *obj, Efl_Ui_Focus_Manager_Sub_Data *pd EINA_UNUSED, Efl_Object *parent) -{ - Eo *old_parent, *new_parent; - - old_parent = efl_parent_get(obj); - - _efl_ui_focus_manager_redirect_events_del(obj, old_parent); - efl_event_callback_array_del(old_parent, self_manager(), obj); - - efl_parent_set(efl_super(obj, MY_CLASS), parent); - - 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* _efl_ui_focus_manager_sub_efl_object_constructor(Eo *obj, Efl_Ui_Focus_Manager_Sub_Data *pd EINA_UNUSED) { + efl_event_callback_array_add(obj, self_manager(), obj); + + _flush_manager(obj, pd); + return efl_constructor(efl_super(obj, MY_CLASS)); } diff --git a/src/lib/elementary/efl_ui_focus_manager_sub.eo b/src/lib/elementary/efl_ui_focus_manager_sub.eo index 148a399c68..117ccb4adc 100644 --- a/src/lib/elementary/efl_ui_focus_manager_sub.eo +++ b/src/lib/elementary/efl_ui_focus_manager_sub.eo @@ -1,4 +1,4 @@ -class Efl.Ui.Focus.Manager.Sub (Efl.Ui.Focus.Manager.Calc, Efl.Object) +mixin Efl.Ui.Focus.Manager.Sub (Efl.Ui.Focus.Manager, Efl.Object) { [[A class that automatically registeres its border elements in the parent manager @@ -13,17 +13,10 @@ class Efl.Ui.Focus.Manager.Sub (Efl.Ui.Focus.Manager.Calc, Efl.Object) You can filter the border elements by overriding the property @Efl.Ui.Focus.Manager.border_elements. - This class is only working as composite object to a @Efl.Ui.Focus.User - and @Efl.Ui.Focus.Object. - - The object itself redirects the manager's events to the object where this - object is attached. - @since 1.20 ]] implements { Efl.Object.constructor; Efl.Object.destructor; - Efl.Object.parent { set; } } } diff --git a/src/lib/elementary/elm_interface_scrollable.c b/src/lib/elementary/elm_interface_scrollable.c index 1757d5e990..9089f10cd4 100644 --- a/src/lib/elementary/elm_interface_scrollable.c +++ b/src/lib/elementary/elm_interface_scrollable.c @@ -4682,7 +4682,7 @@ _elm_interface_scrollable_elm_widget_focus_manager_factory(Eo *obj EINA_UNUSED, { Efl_Ui_Focus_Manager *manager; - manager = efl_add(EFL_UI_FOCUS_MANAGER_SUB_CLASS, obj, + manager = efl_add(EFL_UI_FOCUS_MANAGER_CALC_CLASS, obj, efl_ui_focus_manager_root_set(efl_added, root) ); diff --git a/src/lib/elementary/elm_interface_scrollable.eo b/src/lib/elementary/elm_interface_scrollable.eo index 0a1da9606f..8547d19d9a 100644 --- a/src/lib/elementary/elm_interface_scrollable.eo +++ b/src/lib/elementary/elm_interface_scrollable.eo @@ -29,7 +29,7 @@ enum Elm.Scroller.Single_Direction last [[Sentinel value to indicate last enum field during iteration]] } -mixin Elm.Interface_Scrollable(Efl.Ui.Scrollable, Efl.Ui.Focus.Manager, Elm.Widget) +mixin Elm.Interface_Scrollable(Efl.Ui.Scrollable, Efl.Ui.Focus.Manager.Sub, Elm.Widget) { [[Elm scrollable mixin]] eo_prefix: elm_interface_scrollable; diff --git a/src/tests/elementary/elm_test_focus_sub.c b/src/tests/elementary/elm_test_focus_sub.c index 1c52c1bcd9..18042cb608 100644 --- a/src/tests/elementary/elm_test_focus_sub.c +++ b/src/tests/elementary/elm_test_focus_sub.c @@ -93,11 +93,14 @@ _setup(Efl_Ui_Focus_Manager **m, Efl_Ui_Focus_Manager_Sub **sub, Efl_Ui_Focus_Ob efl_key_data_set(focus_main, "__user_manager", manager); efl_key_data_set(focus_main, "__user_parent", root_manager); - Efl_Ui_Focus_Manager_Sub *subm = efl_add(EFL_UI_FOCUS_MANAGER_SUB_CLASS, focus_main, + Efl_Ui_Focus_Manager_Calc *subm = efl_add(EFL_UI_FOCUS_MANAGER_CALC_CLASS, focus_main, efl_ui_focus_manager_root_set(efl_added, root) ); efl_composite_attach(focus_main, subm); + + efl_event_callback_call(focus_main, EFL_UI_FOCUS_USER_EVENT_MANAGER_CHANGED, NULL); + efl_ui_focus_manager_calc_register_logical(manager, focus_main, root_manager, subm); *sub = focus_main; diff --git a/src/tests/elementary/focus_test_sub_main.eo b/src/tests/elementary/focus_test_sub_main.eo index 51a88d5ba1..ccaad330a2 100644 --- a/src/tests/elementary/focus_test_sub_main.eo +++ b/src/tests/elementary/focus_test_sub_main.eo @@ -1,4 +1,4 @@ -class Focus.Test.Sub.Main(Efl.Object, Efl.Ui.Focus.User, Efl.Ui.Focus.Object, Efl.Ui.Focus.Manager) { +class Focus.Test.Sub.Main(Efl.Object, Efl.Ui.Focus.User, Efl.Ui.Focus.Object, Efl.Ui.Focus.Manager.Sub) { implements { Efl.Ui.Focus.User.manager { get; } Efl.Ui.Focus.User.parent { get; }