From 6922761f3fd0351403e0c2c6d10d1fd0c4fe9bdd Mon Sep 17 00:00:00 2001 From: Marcel Hollerbach Date: Tue, 11 Dec 2018 16:40:40 +0100 Subject: [PATCH] elm_gen****: fix focus restoring on window focus changes this ensures that if there is no focused item, that at least the container is focused. This leads to the fact that the elm_genlist /elm_gengrid is refocused when a window is unfocused and focused again. Reviewed-by: YeongJong Lee Differential Revision: https://phab.enlightenment.org/D7451 --- src/lib/elementary/elm_gengrid.c | 15 +++++++++++++-- src/lib/elementary/elm_gengrid.eo | 1 + src/lib/elementary/elm_genlist.c | 14 +++++++++++++- src/lib/elementary/elm_genlist.eo | 1 + 4 files changed, 28 insertions(+), 3 deletions(-) diff --git a/src/lib/elementary/elm_gengrid.c b/src/lib/elementary/elm_gengrid.c index 14ed8009f9..ef3da833fb 100644 --- a/src/lib/elementary/elm_gengrid.c +++ b/src/lib/elementary/elm_gengrid.c @@ -4255,12 +4255,23 @@ _elm_gengrid_efl_ui_focus_manager_setup_on_first_touch(Eo *obj, Elm_Gengrid_Data } else { - //Just set evas focus on the gengrid itself, events will pass on and some element will be taken - evas_object_focus_set(obj, EINA_TRUE); + efl_ui_focus_object_focus_set(obj, EINA_TRUE); } } } +EOLIAN static Efl_Ui_Focus_Object* +_elm_gengrid_efl_ui_focus_manager_manager_focus_get(const Eo *obj, Elm_Gengrid_Data *pd) +{ + Eo *focused_obj = efl_ui_focus_manager_focus_get(efl_super(obj, MY_CLASS)); + Eo *registered_manager = efl_ui_focus_object_focus_manager_get(obj); + + if (!focused_obj && efl_ui_focus_manager_redirect_get(registered_manager)) + return (Efl_Ui_Focus_Object*) obj; + + return focused_obj; +} + static void _gengrid_element_focused(void *data, const Efl_Event *ev) { diff --git a/src/lib/elementary/elm_gengrid.eo b/src/lib/elementary/elm_gengrid.eo index 33d260f8e3..55f7f5420c 100644 --- a/src/lib/elementary/elm_gengrid.eo +++ b/src/lib/elementary/elm_gengrid.eo @@ -528,6 +528,7 @@ class Elm.Gengrid (Efl.Ui.Layout, Efl.Ui.Focus.Composition, Elm.Interface_Scroll Efl.Ui.Focus.Composition.prepare; Efl.Ui.Widget.focus_state_apply; Efl.Ui.Focus.Manager.setup_on_first_touch; + Efl.Ui.Focus.Manager.manager_focus { get; } } events { realized: Efl.Object; [[Called when gengrid realized]] diff --git a/src/lib/elementary/elm_genlist.c b/src/lib/elementary/elm_genlist.c index 09de6ad309..728d33376b 100644 --- a/src/lib/elementary/elm_genlist.c +++ b/src/lib/elementary/elm_genlist.c @@ -3438,11 +3438,23 @@ _elm_genlist_efl_ui_focus_manager_setup_on_first_touch(Eo *obj, Elm_Genlist_Data else { //Just set evas focus on the genlist itself, events will pass on and a other element will be taken - evas_object_focus_set(obj, EINA_TRUE); + efl_ui_focus_object_focus_set(obj, EINA_TRUE); } } } +EOLIAN static Efl_Ui_Focus_Object* +_elm_genlist_efl_ui_focus_manager_manager_focus_get(const Eo *obj, Elm_Genlist_Data *pd) +{ + Eo *focused_obj = efl_ui_focus_manager_focus_get(efl_super(obj, MY_CLASS)); + Eo *registered_manager = efl_ui_focus_object_focus_manager_get(obj); + + if (!focused_obj && efl_ui_focus_manager_redirect_get(registered_manager)) + return (Efl_Ui_Focus_Object*) obj; + + return focused_obj; +} + EOLIAN static Eina_Bool _elm_genlist_efl_ui_focus_object_on_focus_update(Eo *obj, Elm_Genlist_Data *sd) { diff --git a/src/lib/elementary/elm_genlist.eo b/src/lib/elementary/elm_genlist.eo index 3e8835d81e..1d7e562616 100644 --- a/src/lib/elementary/elm_genlist.eo +++ b/src/lib/elementary/elm_genlist.eo @@ -555,6 +555,7 @@ class Elm.Genlist (Efl.Ui.Layout, Elm.Interface_Scrollable, Efl.Ui.Clickable, Efl.Access.Selection.access_selection_clear; Efl.Ui.Widget.focus_state_apply; Efl.Ui.Focus.Manager.setup_on_first_touch; + Efl.Ui.Focus.Manager.manager_focus { get; } } events { item,focused: Efl.Object; [[Called when genlist item got focus]]