bu5hm4n pushed a commit to branch master.

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

commit be3cfcec66c77d507f722ea41afbc4d018c7ed26
Author: Marcel Hollerbach <[email protected]>
Date:   Sun Mar 11 17:56:07 2018 +0100

    elm_genlist: move focus recovering to first_touch instead of
    focus_update
    
    this means that the function is called more reliable, and not only based
    on focus state, but also based on the redirect situation.
---
 src/lib/elementary/elm_genlist.c  | 80 +++++++++++++++++++--------------------
 src/lib/elementary/elm_genlist.eo |  1 +
 2 files changed, 39 insertions(+), 42 deletions(-)

diff --git a/src/lib/elementary/elm_genlist.c b/src/lib/elementary/elm_genlist.c
index a05aaa0871..16f51c7b06 100644
--- a/src/lib/elementary/elm_genlist.c
+++ b/src/lib/elementary/elm_genlist.c
@@ -3366,62 +3366,58 @@ _elm_genlist_nearest_visible_item_get(Evas_Object *obj, 
Elm_Object_Item *eo_it)
    return eo_it;
 }
 
-EOLIAN static Eina_Bool
-_elm_genlist_efl_ui_focus_object_on_focus_update(Eo *obj, Elm_Genlist_Data *sd)
+EOLIAN static void
+_elm_genlist_efl_ui_focus_manager_setup_on_first_touch(Eo *obj, 
Elm_Genlist_Data *sd, Efl_Ui_Focus_Direction direction EINA_UNUSED, 
Efl_Ui_Focus_Object *entry EINA_UNUSED)
 {
-   Eina_Bool int_ret = EINA_FALSE;
    Elm_Object_Item *eo_it = NULL;
    Eina_Bool is_sel = EINA_FALSE;
 
-   int_ret = efl_ui_focus_object_on_focus_update(efl_super(obj, MY_CLASS));
-   if (!int_ret) return EINA_FALSE;
-
-   if (efl_ui_focus_object_focus_get(obj) && (sd->items) && (sd->selected) &&
-       (!sd->last_selected_item))
+   if (sd->last_focused_item)
+     eo_it = sd->last_focused_item;
+   else if (sd->last_selected_item)
+     eo_it = sd->last_selected_item;
+   else if (_elm_config->first_item_focus_on_first_focus_in || !eo_it)
      {
-        sd->last_selected_item = eina_list_data_get(sd->selected);
+        eo_it = elm_genlist_first_item_get(obj);
+        is_sel = EINA_TRUE;
      }
 
-   if (efl_ui_focus_object_focus_get(obj) && !sd->mouse_down)
+   while (eo_it)
      {
-        if (sd->last_focused_item)
-          eo_it = sd->last_focused_item;
-        else if (sd->last_selected_item)
-          eo_it = sd->last_selected_item;
-        else if (_elm_config->first_item_focus_on_first_focus_in)
-          {
-             eo_it = elm_genlist_first_item_get(obj);
-             is_sel = EINA_TRUE;
-          }
-
-        while (eo_it)
-          {
-             ELM_GENLIST_ITEM_DATA_GET(eo_it, it);
-             if ((!_is_no_select(it)) && 
(!elm_object_item_disabled_get(eo_it)))
-               break;
-             eo_it = EO_OBJ(ELM_GEN_ITEM_NEXT(it));
-          }
+        ELM_GENLIST_ITEM_DATA_GET(eo_it, it);
+        if ((!_is_no_select(it)) && (!elm_object_item_disabled_get(eo_it)))
+          break;
+        eo_it = EO_OBJ(ELM_GEN_ITEM_NEXT(it));
+     }
 
+   if (eo_it)
+     {
+        eo_it = _elm_genlist_nearest_visible_item_get(obj, eo_it);
         if (eo_it)
           {
-             eo_it = _elm_genlist_nearest_visible_item_get(obj, eo_it);
-             if (eo_it)
-               {
-                  if (!_elm_config->item_select_on_focus_disable && is_sel)
-                    elm_genlist_item_selected_set(eo_it, EINA_TRUE);
-                  else
-                    elm_object_item_focus_set(eo_it, EINA_TRUE);
-                  _elm_widget_focus_highlight_start(obj);
-               }
+             if (!_elm_config->item_select_on_focus_disable && is_sel)
+               elm_genlist_item_selected_set(eo_it, EINA_TRUE);
+             else
+               elm_object_item_focus_set(eo_it, EINA_TRUE);
+            _elm_widget_focus_highlight_start(obj);
+            //set it again in the manager, there might be the case that the 
manager focus history and internal item foused logic are in different states
+            efl_ui_focus_manager_focus_set(obj, eo_it);
           }
      }
-   else
+}
+
+EOLIAN static Eina_Bool
+_elm_genlist_efl_ui_focus_object_on_focus_update(Eo *obj, Elm_Genlist_Data *sd)
+{
+   Eina_Bool int_ret = EINA_FALSE;
+
+   int_ret = efl_ui_focus_object_on_focus_update(efl_super(obj, MY_CLASS));
+   if (!int_ret) return EINA_FALSE;
+
+   if (efl_ui_focus_object_focus_get(obj) && (sd->items) && (sd->selected) &&
+       (!sd->last_selected_item))
      {
-        if (sd->focused_item)
-          {
-             sd->last_focused_item = sd->focused_item;
-             _elm_genlist_item_unfocused(sd->focused_item);
-          }
+        sd->last_selected_item = eina_list_data_get(sd->selected);
      }
 
    return EINA_TRUE;
diff --git a/src/lib/elementary/elm_genlist.eo 
b/src/lib/elementary/elm_genlist.eo
index 8100b26077..f3141b9568 100644
--- a/src/lib/elementary/elm_genlist.eo
+++ b/src/lib/elementary/elm_genlist.eo
@@ -558,6 +558,7 @@ class Elm.Genlist (Efl.Ui.Layout, Efl.Ui.Focus.Composition, 
Elm.Interface_Scroll
       Efl.Access.Selection.access_selection_clear;
       Efl.Ui.Focus.Composition.prepare;
       Efl.Ui.Widget.focus_state_apply;
+      Efl.Ui.Focus.Manager.setup_on_first_touch;
    }
    events {
       item,focused; [[Called when genlist item got focus]]

-- 


Reply via email to