bu5hm4n pushed a commit to branch master.

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

commit 09824ec4508d0c20bfe2f26654903e5f5f6981c4
Author: Marcel Hollerbach <[email protected]>
Date:   Sat Dec 17 19:45:56 2016 +0100

    efl_ui_focus_manager_sub: focus the item in sub and main manager
---
 src/lib/elementary/efl_ui_focus_manager_sub.c | 44 ++++++++++++++++++++++++---
 1 file changed, 39 insertions(+), 5 deletions(-)

diff --git a/src/lib/elementary/efl_ui_focus_manager_sub.c 
b/src/lib/elementary/efl_ui_focus_manager_sub.c
index 89b6b4e..42f9d19 100644
--- a/src/lib/elementary/efl_ui_focus_manager_sub.c
+++ b/src/lib/elementary/efl_ui_focus_manager_sub.c
@@ -30,6 +30,39 @@ _set_a_without_b(Eina_List *a, Eina_List *b)
 }
 
 static void
+_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);
+
+   //only do this when we are getting focus
+   if (!event->info) return;
+
+   //if there is already the redirect, ignore this focus request
+   if (efl_ui_focus_manager_redirect_get(manager)) return;
+
+   efl_ui_focus_manager_focus(m, event->object);
+}
+
+static void
+_register(Efl_Ui_Focus_Manager *obj, Efl_Ui_Focus_Manager *par_m, 
Efl_Ui_Focus_Object *node, Efl_Ui_Focus_Object *logical)
+{
+   efl_ui_focus_manager_register(par_m, node, logical, obj);
+   efl_event_callback_add(node, EFL_UI_FOCUS_OBJECT_EVENT_FOCUS_CHANGED, 
_focus_changed, obj);
+}
+
+static void
+_unregister(Efl_Ui_Focus_Manager *obj, Efl_Ui_Focus_Manager *par_m, 
Efl_Ui_Focus_Object *node)
+{
+   efl_ui_focus_manager_unregister(par_m, node);
+   efl_event_callback_del(node, EFL_UI_FOCUS_OBJECT_EVENT_FOCUS_CHANGED, 
_focus_changed, obj);
+}
+
+static void
 _border_flush(Eo *obj, Efl_Ui_Focus_Manager_Sub_Data *pd)
 {
    Eina_Iterator *borders;
@@ -57,7 +90,7 @@ _border_flush(Eo *obj, Efl_Ui_Focus_Manager_Sub_Data *pd)
    EINA_LIST_FREE(tmp, node)
      {
         if (node == elem) continue;
-        efl_ui_focus_manager_unregister(manager, node);
+        _unregister(obj, manager, node);
      }
 
    //set of the elements which are new without those which are currently 
registered
@@ -67,7 +100,7 @@ _border_flush(Eo *obj, Efl_Ui_Focus_Manager_Sub_Data *pd)
    EINA_LIST_FREE(tmp, node)
      {
         if (node == elem) continue;
-        efl_ui_focus_manager_register(manager, node, logical, elem);
+        _register(obj, manager, node, logical);
      }
 
    eina_list_free(pd->current_border);
@@ -87,7 +120,7 @@ _border_unregister(Eo *obj, Efl_Ui_Focus_Manager_Sub_Data 
*pd)
    EINA_LIST_FREE(pd->current_border, node)
      {
         if (node == elem) continue;
-        efl_ui_focus_manager_unregister(manager, node);
+        _unregister(obj, manager, node);
      }
 
    pd->current_border = NULL;
@@ -151,8 +184,9 @@ _manager_change(void *data, const Efl_Event *ev)
    EINA_LIST_FOREACH(pd->current_border , n, b)
      {
         if (b == ev->object) continue;
-        efl_ui_focus_manager_unregister(pd->manager, b);
-        efl_ui_focus_manager_register(manager, b, logical, ev->object);
+
+        _unregister(data, manager, b);
+        _register(data, manager, b, logical);
      }
    //unregister the old manager, use the new
    pd->manager = manager;

-- 


Reply via email to