bu5hm4n pushed a commit to branch master. http://git.enlightenment.org/core/efl.git/commit/?id=a417af04e86e3974476471867d90637017138403
commit a417af04e86e3974476471867d90637017138403 Author: Marcel Hollerbach <mar...@osg.samsung.com> Date: Tue Oct 24 17:27:53 2017 +0200 elm_widget: also delay focus set if something is not registered this fixes a infinite loop --- src/lib/elementary/elm_main.c | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/src/lib/elementary/elm_main.c b/src/lib/elementary/elm_main.c index 1ce7d28476..81cbce4eeb 100644 --- a/src/lib/elementary/elm_main.c +++ b/src/lib/elementary/elm_main.c @@ -1663,9 +1663,9 @@ elm_object_focus_get(const Evas_Object *obj) static void _elm_widget_focus(Evas_Object *obj); static void -_manager_changed(void *data EINA_UNUSED, const Efl_Event *event) +_manager_changed(void *data EINA_UNUSED, const Efl_Event *event EINA_UNUSED) { - _elm_widget_focus(event->object); + _elm_widget_focus(data); } static void @@ -1678,13 +1678,13 @@ _elm_widget_focus(Evas_Object *obj) m2 = efl_ui_focus_user_manager_get(obj); o = efl_key_data_get(m, "__delayed_focus_set"); - efl_event_callback_del(o, EFL_UI_FOCUS_USER_EVENT_MANAGER_CHANGED, _manager_changed, NULL); + efl_event_callback_del(o, EFL_UI_FOCUS_USER_EVENT_MANAGER_CHANGED, _manager_changed, obj); efl_key_data_set(m, "__delayed_focus_set", NULL); if (!m2) { efl_key_data_set(m, "__delayed_focus_set", obj); - efl_event_callback_add(obj, EFL_UI_FOCUS_USER_EVENT_MANAGER_CHANGED, _manager_changed, NULL); + efl_event_callback_add(obj, EFL_UI_FOCUS_USER_EVENT_MANAGER_CHANGED, _manager_changed, obj); return; } @@ -1693,6 +1693,14 @@ _elm_widget_focus(Evas_Object *obj) { Efl_Ui_Focus_Manager *new_manager;; new_manager = efl_ui_focus_user_manager_get(m2); + + /* also delay the registeration if we miss a manager half way */ + if (!new_manager) + { + efl_event_callback_add(m2, EFL_UI_FOCUS_USER_EVENT_MANAGER_CHANGED, _manager_changed, obj); + return; + } + //new manager is in a higher hirarchy than m2 //so we set m2 as redirect in new_manager efl_ui_focus_manager_redirect_set(new_manager, m2); --