bu5hm4n pushed a commit to branch master.

http://git.enlightenment.org/core/efl.git/commit/?id=b8465450720ebca3e1f9ca5c3e4e72ec1061414e

commit b8465450720ebca3e1f9ca5c3e4e72ec1061414e
Author: Marcel Hollerbach <marcel-hollerb...@t-online.de>
Date:   Thu Jul 13 10:12:50 2017 +0200

    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  | 53 ++++++++------------------
 src/lib/elementary/efl_ui_focus_manager_sub.eo |  9 +----
 src/lib/elementary/elm_interface_scrollable.c  |  2 +-
 src/lib/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, 23 insertions(+), 50 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 <Elementary.h>
 #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)
+EOLIAN static Efl_Object*
+_efl_ui_focus_manager_sub_efl_object_constructor(Eo *obj, 
Efl_Ui_Focus_Manager_Sub_Data *pd EINA_UNUSED)
 {
-   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);
+   efl_event_callback_array_add(obj, 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)
-{
    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; }

-- 


Reply via email to