efl_ui_focus_manager_root_focus: refactor _state_eval
authorYeongJong Lee <yj34.lee@samsung.com>
Wed, 4 Apr 2018 16:28:21 +0000 (18:28 +0200)
committerWonki Kim <wonki_.kim@samsung.com>
Tue, 10 Apr 2018 13:25:42 +0000 (22:25 +0900)
Summary:
we have to check whether all of descendant are none_logical.

ref T6800

Test Plan:
1. elementary_test -to ctxpopup
2. Click 'Ctxpopup with user content'
3. Try focus ctxpopup content(button) using arrow key.
4. Check that the content is focused (you can move scroll bar)

Reviewers: bu5hm4n

Subscribers: cedric

Maniphest Tasks: T6800

Differential Revision: https://phab.enlightenment.org/D5856

src/lib/elementary/efl_ui_focus_manager_root_focus.c
src/lib/elementary/efl_ui_focus_manager_root_focus.eo

index 1a90cf2..3b21fb7 100644 (file)
@@ -13,7 +13,6 @@
 
 typedef struct {
    Efl_Ui_Focus_Object *root;
-   Eina_List *none_logicals;
 
    Evas_Object *rect;
    Eina_Bool rect_registered;
@@ -31,30 +30,48 @@ _trap(Efl_Ui_Focus_Manager_Root_Focus_Data *pd, Efl_Ui_Focus_Object *obj)
 static void
 _state_eval(Eo *obj, Efl_Ui_Focus_Manager_Root_Focus_Data *pd)
 {
-   if (pd->none_logicals && pd->rect_registered)
-     {
-         efl_ui_focus_manager_calc_unregister(obj, pd->rect);
-         pd->rect_registered = EINA_FALSE;
-     }
-   else if (!pd->none_logicals && !pd->rect_registered)
+   Efl_Ui_Focus_Object *root;
+   Eina_Bool none_logical = EINA_FALSE;
+
+   if (pd->rect_registered)
+     efl_ui_focus_manager_calc_unregister(obj, pd->rect);
+
+   root = efl_ui_focus_manager_root_get(obj);
+   none_logical = !!efl_ui_focus_manager_request_subchild(obj, root);
+
+   if (none_logical)
+     pd->rect_registered = EINA_FALSE;
+   else
      {
-         efl_ui_focus_manager_calc_register(obj, pd->rect, pd->root, NULL);
-         pd->rect_registered = EINA_TRUE;
+        efl_ui_focus_manager_calc_register(obj, pd->rect, pd->root, NULL);
+        pd->rect_registered = EINA_TRUE;
      }
 }
 
 EOLIAN static Eina_Bool
 _efl_ui_focus_manager_root_focus_efl_ui_focus_manager_calc_register(Eo *obj, Efl_Ui_Focus_Manager_Root_Focus_Data *pd, Efl_Ui_Focus_Object *child, Efl_Ui_Focus_Object *parent, Efl_Ui_Focus_Manager *redirect)
 {
-   Eina_Bool ret = EINA_FALSE;
    if (efl_ui_focus_manager_calc_register(efl_super(obj, MY_CLASS), child, parent, redirect))
      {
-        pd->none_logicals = eina_list_append(pd->none_logicals, child);
-        ret = EINA_TRUE;
+        if (child != pd->rect)
+          _state_eval(obj, pd);
+
+        return EINA_TRUE;
      }
-   if (child != pd->rect)
-     _state_eval(obj, pd);
-   return ret;
+   return EINA_FALSE;
+}
+
+EOLIAN static Eina_Bool
+_efl_ui_focus_manager_root_focus_efl_ui_focus_manager_calc_register_logical(Eo *obj, Efl_Ui_Focus_Manager_Root_Focus_Data *pd, Efl_Ui_Focus_Object *child, Efl_Ui_Focus_Object *parent, Efl_Ui_Focus_Manager *redirect)
+{
+   if (efl_ui_focus_manager_calc_register_logical(efl_super(obj, MY_CLASS), child, parent, redirect))
+     {
+        if (redirect)
+          _state_eval(obj, pd);
+
+        return EINA_TRUE;
+     }
+   return EINA_FALSE;
 }
 
 EOLIAN static void
@@ -62,8 +79,6 @@ _efl_ui_focus_manager_root_focus_efl_ui_focus_manager_calc_unregister(Eo *obj, E
 {
    efl_ui_focus_manager_calc_unregister(efl_super(obj, MY_CLASS), child);
 
-   pd->none_logicals = eina_list_remove(pd->none_logicals, child);
-
    if (child != pd->rect)
      _state_eval(obj, pd);
 }
@@ -105,14 +120,10 @@ _efl_ui_focus_manager_root_focus_efl_ui_focus_manager_logical_end(Eo *obj, Efl_U
 EOLIAN static Eina_Iterator *
 _efl_ui_focus_manager_root_focus_efl_ui_focus_manager_border_elements_get(Eo *obj, Efl_Ui_Focus_Manager_Root_Focus_Data *pd)
 {
-   if (!!pd->none_logicals)
-     {
-        return efl_ui_focus_manager_border_elements_get(efl_super(obj, MY_CLASS));;
-     }
-   else
-     {
-        return eina_list_iterator_new(pd->iterator_list);
-     }
+   if (pd->rect_registered)
+     return eina_list_iterator_new(pd->iterator_list);
+
+   return efl_ui_focus_manager_border_elements_get(efl_super(obj, MY_CLASS));
 }
 
 
index 4c86d3d..e4062df 100644 (file)
@@ -1,6 +1,7 @@
 class Efl.Ui.Focus.Manager.Root_Focus(Efl.Ui.Focus.Manager.Calc) {
   [[ This class ensures that the root is at least focusable, if nothing else is focusable]]
   implements {
+    Efl.Ui.Focus.Manager.Calc.register_logical;
     Efl.Ui.Focus.Manager.Calc.register;
     Efl.Ui.Focus.Manager.Calc.unregister;
     Efl.Ui.Focus.Manager.manager_focus {set; get;}