raster pushed a commit to branch master. http://git.enlightenment.org/core/efl.git/commit/?id=e29102e1344b0f5aa25d189593cdaf9a30ba8fa6
commit e29102e1344b0f5aa25d189593cdaf9a30ba8fa6 Author: Carsten Haitzler (Rasterman) <ras...@rasterman.com> Date: Sat Apr 7 16:34:29 2018 +0900 Revert "efl_ui_focus_manager_root_focus: refactor _state_eval" This reverts commit c6ce04e48f7813475e929f6205a2f6a2e7eb9729. OK. I bisected and found that this is ythe root cause for 2 pretty chunky bugs. Reverting this fixes T6870 and fixes T6871. so that's 2 segvs in existing uses and even olne (elm config) ships with efl. Having a look at the diff doesn't jump out what is wrong here, but the best course IMHO is to take this patch and put it back into review again... :) --- .../elementary/efl_ui_focus_manager_root_focus.c | 61 +++++++++------------- .../elementary/efl_ui_focus_manager_root_focus.eo | 1 - 2 files changed, 25 insertions(+), 37 deletions(-) diff --git a/src/lib/elementary/efl_ui_focus_manager_root_focus.c b/src/lib/elementary/efl_ui_focus_manager_root_focus.c index 3b21fb7729..1a90cf2927 100644 --- a/src/lib/elementary/efl_ui_focus_manager_root_focus.c +++ b/src/lib/elementary/efl_ui_focus_manager_root_focus.c @@ -13,6 +13,7 @@ typedef struct { Efl_Ui_Focus_Object *root; + Eina_List *none_logicals; Evas_Object *rect; Eina_Bool rect_registered; @@ -30,48 +31,30 @@ _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) { - 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 + if (pd->none_logicals && pd->rect_registered) { - efl_ui_focus_manager_calc_register(obj, pd->rect, pd->root, NULL); - pd->rect_registered = EINA_TRUE; + efl_ui_focus_manager_calc_unregister(obj, pd->rect); + pd->rect_registered = EINA_FALSE; } -} - -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) -{ - if (efl_ui_focus_manager_calc_register(efl_super(obj, MY_CLASS), child, parent, redirect)) + else if (!pd->none_logicals && !pd->rect_registered) { - if (child != pd->rect) - _state_eval(obj, pd); - - return EINA_TRUE; + efl_ui_focus_manager_calc_register(obj, pd->rect, pd->root, NULL); + pd->rect_registered = EINA_TRUE; } - 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) +_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) { - if (efl_ui_focus_manager_calc_register_logical(efl_super(obj, MY_CLASS), child, parent, redirect)) + Eina_Bool ret = EINA_FALSE; + if (efl_ui_focus_manager_calc_register(efl_super(obj, MY_CLASS), child, parent, redirect)) { - if (redirect) - _state_eval(obj, pd); - - return EINA_TRUE; + pd->none_logicals = eina_list_append(pd->none_logicals, child); + ret = EINA_TRUE; } - return EINA_FALSE; + if (child != pd->rect) + _state_eval(obj, pd); + return ret; } EOLIAN static void @@ -79,6 +62,8 @@ _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); } @@ -120,10 +105,14 @@ _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->rect_registered) - return eina_list_iterator_new(pd->iterator_list); - - return efl_ui_focus_manager_border_elements_get(efl_super(obj, MY_CLASS)); + 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); + } } diff --git a/src/lib/elementary/efl_ui_focus_manager_root_focus.eo b/src/lib/elementary/efl_ui_focus_manager_root_focus.eo index e4062df06d..4c86d3d563 100644 --- a/src/lib/elementary/efl_ui_focus_manager_root_focus.eo +++ b/src/lib/elementary/efl_ui_focus_manager_root_focus.eo @@ -1,7 +1,6 @@ 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;} --