bu5hm4n pushed a commit to branch master. http://git.enlightenment.org/core/efl.git/commit/?id=89cc2ca06a31f9e14877c71ba90f9b6d43a4b794
commit 89cc2ca06a31f9e14877c71ba90f9b6d43a4b794 Author: Marcel Hollerbach <[email protected]> Date: Mon Dec 12 19:23:42 2016 +0100 efl_ui_focus_manager: restructure node struct a redirect can happen for logical OR normal --- src/lib/elementary/efl_ui_focus_manager.c | 38 +++++++----------------------- src/lib/elementary/efl_ui_focus_manager.eo | 1 + src/lib/elementary/elm_widget.c | 2 +- 3 files changed, 11 insertions(+), 30 deletions(-) diff --git a/src/lib/elementary/efl_ui_focus_manager.c b/src/lib/elementary/efl_ui_focus_manager.c index a3c390e..c64e4bc 100644 --- a/src/lib/elementary/efl_ui_focus_manager.c +++ b/src/lib/elementary/efl_ui_focus_manager.c @@ -35,7 +35,6 @@ struct _Border { typedef enum { NODE_TYPE_NORMAL = 0, - NODE_TYPE_LISTENER = 1, NODE_TYPE_ONLY_LOGICAL = 2, } Node_Type; @@ -44,15 +43,7 @@ struct _Node{ Efl_Ui_Focus_Object *focusable; Efl_Ui_Focus_Manager *manager; - - union { - struct { - Efl_Ui_Focus_Manager *manager; - } listener; - struct { - - } normal; - } data; + Efl_Ui_Focus_Manager *redirect_manager; struct _Tree_Node{ Node *parent; //the parent in the tree @@ -509,7 +500,7 @@ _register(Eo *obj, Efl_Ui_Focus_Manager_Data *pd, Efl_Ui_Focus_Object *child, No return node; } EOLIAN static Eina_Bool -_efl_ui_focus_manager_register_logical(Eo *obj, Efl_Ui_Focus_Manager_Data *pd, Efl_Ui_Focus_Object *child, Efl_Ui_Focus_Object *parent) +_efl_ui_focus_manager_register_logical(Eo *obj, Efl_Ui_Focus_Manager_Data *pd, Efl_Ui_Focus_Object *child, Efl_Ui_Focus_Object *parent, Efl_Ui_Focus_Manager *redirect) { Node *node = NULL; Node *pnode = NULL; @@ -524,7 +515,7 @@ _efl_ui_focus_manager_register_logical(Eo *obj, Efl_Ui_Focus_Manager_Data *pd, E if (!node) return EINA_FALSE; node->type = NODE_TYPE_ONLY_LOGICAL; - + node->redirect_manager = redirect; return EINA_TRUE; } @@ -548,15 +539,8 @@ _efl_ui_focus_manager_register(Eo *obj, Efl_Ui_Focus_Manager_Data *pd, Efl_Ui_Fo //listen to changes efl_event_callback_array_add(child, focusable_node(), obj); - if (!redirect) - { - node->type = NODE_TYPE_NORMAL; - } - else - { - node->type = NODE_TYPE_LISTENER; - node->data.listener.manager = redirect; - } + node->type = NODE_TYPE_NORMAL; + node->redirect_manager = redirect; //mark dirty dirty_add(obj, pd, node); @@ -570,9 +554,8 @@ _efl_ui_focus_manager_update_redirect(Eo *obj EINA_UNUSED, Efl_Ui_Focus_Manager_ Node *node = node_get(pd, child); if (!node) return EINA_FALSE; - if (node->type != NODE_TYPE_LISTENER) return EINA_FALSE; - node->data.listener.manager = redirect; + node->redirect_manager = redirect; return EINA_TRUE; } @@ -1071,11 +1054,11 @@ _efl_ui_focus_manager_focus(Eo *obj, Efl_Ui_Focus_Manager_Data *pd, Efl_Ui_Focus efl_ui_focus_object_focus_set(node->focusable, EINA_TRUE); //now check if this is also a listener object - if (node->type == NODE_TYPE_LISTENER) + if (node->redirect_manager) { Efl_Ui_Focus_Manager *redirect; - redirect = node->data.listener.manager; + redirect = node->redirect_manager; efl_ui_focus_manager_redirect_set(obj, redirect); } @@ -1218,9 +1201,6 @@ _efl_ui_focus_manager_fetch(Eo *obj, Efl_Ui_Focus_Manager_Data *pd, Efl_Ui_Focus res->prev = _prev(n)->focusable; switch(n->type) { - case NODE_TYPE_LISTENER: - res->type = "listener"; - break; case NODE_TYPE_ONLY_LOGICAL: res->type = "logical"; break; @@ -1229,7 +1209,7 @@ _efl_ui_focus_manager_fetch(Eo *obj, Efl_Ui_Focus_Manager_Data *pd, Efl_Ui_Focus break; } res->parent = T(n).parent->focusable; - res->redirect = n->type == NODE_TYPE_LISTENER ? n->data.listener.manager : NULL; + res->redirect = n->redirect_manager; #undef DIR_CLONE return res; diff --git a/src/lib/elementary/efl_ui_focus_manager.eo b/src/lib/elementary/efl_ui_focus_manager.eo index c110284..12e47c7 100644 --- a/src/lib/elementary/efl_ui_focus_manager.eo +++ b/src/lib/elementary/efl_ui_focus_manager.eo @@ -66,6 +66,7 @@ class Efl.Ui.Focus.Manager (Efl.Object) { params { child : Efl.Ui.Focus.Object @nonull; parent : Efl.Ui.Focus.Object @nonull; + redirect : Efl.Ui.Focus.Manager; [[The redirect manager to set once this child is focused can be NULL for no redirect]] } return : bool; [[$true if it was successfull $false if not]] } diff --git a/src/lib/elementary/elm_widget.c b/src/lib/elementary/elm_widget.c index 13479fc..9e27de3 100644 --- a/src/lib/elementary/elm_widget.c +++ b/src/lib/elementary/elm_widget.c @@ -267,7 +267,7 @@ _elm_widget_focus_register(Eo *obj, Elm_Widget_Smart_Data *pd, if (full) efl_ui_focus_manager_register(manager, obj, logical, NULL); else - efl_ui_focus_manager_register_logical(manager, obj, logical); + efl_ui_focus_manager_register_logical(manager, obj, logical, NULL); } --
