From bd6dcbb044ffea543f27cc69c421317bdea4a14a Mon Sep 17 00:00:00 2001 From: "Carsten Haitzler (Rasterman)" Date: Thu, 31 Aug 2017 17:34:30 +0900 Subject: [PATCH] elm focus manager - dont leak child lists when updating focus order REALLY fix T5800 by duplicating lists rather than taking ownership @fix --- .../elementary/efl_ui_focus_manager_calc.c | 8 +++-- .../elementary/efl_ui_focus_manager_calc.eo | 2 +- src/lib/elementary/elc_fileselector.c | 30 ++++++++++--------- src/lib/elementary/elm_box.c | 8 +++-- src/lib/elementary/elm_grid.c | 8 +++-- src/lib/elementary/elm_table.c | 8 +++-- src/lib/elementary/elm_toolbar.c | 29 ++++++++++-------- src/tests/elementary/elm_test_focus.c | 1 + 8 files changed, 58 insertions(+), 36 deletions(-) diff --git a/src/lib/elementary/efl_ui_focus_manager_calc.c b/src/lib/elementary/efl_ui_focus_manager_calc.c index 87ae279a43..effd445e6c 100644 --- a/src/lib/elementary/efl_ui_focus_manager_calc.c +++ b/src/lib/elementary/efl_ui_focus_manager_calc.c @@ -551,6 +551,7 @@ _efl_ui_focus_manager_calc_register_logical(Eo *obj, Efl_Ui_Focus_Manager_Calc_D tmp = eina_list_clone(T(pnode).saved_order); efl_ui_focus_manager_calc_update_order(obj, parent, tmp); + eina_list_free(tmp); } return EINA_TRUE; @@ -593,6 +594,7 @@ _efl_ui_focus_manager_calc_register(Eo *obj, Efl_Ui_Focus_Manager_Calc_Data *pd, tmp = eina_list_clone(T(pnode).saved_order); efl_ui_focus_manager_calc_update_order(obj, parent, tmp); + eina_list_free(tmp); } return EINA_TRUE; @@ -692,7 +694,7 @@ _efl_ui_focus_manager_calc_update_order(Eo *obj, Efl_Ui_Focus_Manager_Calc_Data return; ELM_SAFE_FREE(T(pnode).saved_order, eina_list_free); - T(pnode).saved_order = order; + T(pnode).saved_order = eina_list_clone(order); //get all nodes from the subset EINA_LIST_FOREACH(order, n, o) @@ -725,14 +727,14 @@ _efl_ui_focus_manager_calc_update_children(Eo *obj EINA_UNUSED, Efl_Ui_Focus_Man Node *pnode; Efl_Ui_Focus_Object *o; Eina_Bool fail = EINA_FALSE; - Eina_List *node_order = NULL; + Eina_List *node_order = NULL, *n; pnode = node_get(obj, pd, parent); if (!pnode) return EINA_FALSE; //get all nodes from the subset - EINA_LIST_FREE(order, o) + EINA_LIST_FOREACH(order, n, o) { Node *tmp; diff --git a/src/lib/elementary/efl_ui_focus_manager_calc.eo b/src/lib/elementary/efl_ui_focus_manager_calc.eo index 2b78b259ac..7d622c9786 100644 --- a/src/lib/elementary/efl_ui_focus_manager_calc.eo +++ b/src/lib/elementary/efl_ui_focus_manager_calc.eo @@ -66,7 +66,7 @@ class Efl.Ui.Focus.Manager.Calc (Efl.Object, Efl.Ui.Focus.Manager) { [[Give the list of children a different order.]] params { parent : Efl.Ui.Focus.Object @nonull; [[the parent to update]] - children : own(list); [[the list with the new order]] + children : list; [[the list with the new order]] } return : bool; [[$true if successful, $false otherwise]] } diff --git a/src/lib/elementary/elc_fileselector.c b/src/lib/elementary/elc_fileselector.c index 8cfa0911cf..a3536c4b33 100644 --- a/src/lib/elementary/elc_fileselector.c +++ b/src/lib/elementary/elc_fileselector.c @@ -96,24 +96,26 @@ EFL_CALLBACKS_ARRAY_DEFINE(monitoring_callbacks, static void _focus_chain_update(Eo *obj, Elm_Fileselector_Data *pd) { - Eina_List *tmp = NULL; + Eo *fman = efl_ui_focus_user_manager_get(obj); + if (fman) + { + Eina_List *tmp = NULL; #define A(p) tmp = eina_list_append(tmp, p); - - A(pd->up_button) - A(pd->home_button) - A(pd->search_entry) - A(pd->files_view) - A(pd->path_entry) - A(pd->name_entry) - A(pd->filter_hoversel) - A(pd->ok_button) - A(pd->cancel_button) - - + A(pd->up_button) + A(pd->home_button) + A(pd->search_entry) + A(pd->files_view) + A(pd->path_entry) + A(pd->name_entry) + A(pd->filter_hoversel) + A(pd->ok_button) + A(pd->cancel_button) #undef A - efl_ui_focus_manager_calc_update_order(efl_ui_focus_user_manager_get(obj), obj, tmp); + efl_ui_focus_manager_calc_update_order(efl_ui_focus_user_manager_get(obj), obj, tmp); + eina_list_free(tmp); + } } static void diff --git a/src/lib/elementary/elm_box.c b/src/lib/elementary/elm_box.c index b6a617dd2b..04420be35f 100644 --- a/src/lib/elementary/elm_box.c +++ b/src/lib/elementary/elm_box.c @@ -26,9 +26,13 @@ static void _focus_order_flush(Eo *obj, Elm_Box_Data *pd EINA_UNUSED) { Elm_Widget_Smart_Data *wpd = efl_data_scope_get(obj, ELM_WIDGET_CLASS); - Eina_List *order = evas_object_box_children_get(wpd->resize_obj); + if (wpd->focus.manager) + { + Eina_List *order = evas_object_box_children_get(wpd->resize_obj); - efl_ui_focus_manager_calc_update_order(wpd->focus.manager, obj, order); + efl_ui_focus_manager_calc_update_order(wpd->focus.manager, obj, order); + eina_list_free(order); + } } static void * diff --git a/src/lib/elementary/elm_grid.c b/src/lib/elementary/elm_grid.c index 7c85648882..9b37e3e87e 100644 --- a/src/lib/elementary/elm_grid.c +++ b/src/lib/elementary/elm_grid.c @@ -17,9 +17,13 @@ static void _focus_order_flush(Eo *obj) { Elm_Widget_Smart_Data *wpd = efl_data_scope_get(obj, ELM_WIDGET_CLASS); - Eina_List *order = evas_object_grid_children_get(wpd->resize_obj); + if (wpd->focus.manager) + { + Eina_List *order = evas_object_grid_children_get(wpd->resize_obj); - efl_ui_focus_manager_calc_update_order(wpd->focus.manager, obj, order); + efl_ui_focus_manager_calc_update_order(wpd->focus.manager, obj, order); + eina_list_free(order); + } } diff --git a/src/lib/elementary/elm_table.c b/src/lib/elementary/elm_table.c index 48e6dfa62a..d90bdc7d8d 100644 --- a/src/lib/elementary/elm_table.c +++ b/src/lib/elementary/elm_table.c @@ -18,9 +18,13 @@ static void _focus_order_flush(Eo *obj) { Elm_Widget_Smart_Data *wpd = efl_data_scope_get(obj, ELM_WIDGET_CLASS); - Eina_List *order = evas_object_table_children_get(wpd->resize_obj); + if (wpd->focus.manager) + { + Eina_List *order = evas_object_table_children_get(wpd->resize_obj); - efl_ui_focus_manager_calc_update_order(wpd->focus.manager, obj, order); + efl_ui_focus_manager_calc_update_order(wpd->focus.manager, obj, order); + eina_list_free(order); + } } EOLIAN static Eina_Bool diff --git a/src/lib/elementary/elm_toolbar.c b/src/lib/elementary/elm_toolbar.c index 011b842cc2..53d834c50b 100644 --- a/src/lib/elementary/elm_toolbar.c +++ b/src/lib/elementary/elm_toolbar.c @@ -101,24 +101,29 @@ _item_focus_eval(Elm_Toolbar_Item_Data *pd) static void _item_focus_eval_all(Elm_Toolbar *obj, Elm_Toolbar_Data *pd) { - Elm_Toolbar_Item_Data *it; Elm_Widget_Smart_Data *wpd; - Eina_List *order = NULL; wpd = efl_data_scope_get(obj, ELM_WIDGET_CLASS); - EINA_INLIST_FOREACH(pd->items, it) + if (wpd->focus.manager) { - _item_focus_eval(it); - order = eina_list_append(order, EO_OBJ(it)); - } + Eina_List *order = NULL; + Elm_Toolbar_Item_Data *it; - if (pd->more_item) - { - _item_focus_eval(pd->more_item); - order = eina_list_append(order, EO_OBJ(pd->more_item)); - } + EINA_INLIST_FOREACH(pd->items, it) + { + _item_focus_eval(it); + order = eina_list_append(order, EO_OBJ(it)); + } - efl_ui_focus_manager_calc_update_order(wpd->focus.manager, obj, order); + if (pd->more_item) + { + _item_focus_eval(pd->more_item); + order = eina_list_append(order, EO_OBJ(pd->more_item)); + } + + efl_ui_focus_manager_calc_update_order(wpd->focus.manager, obj, order); + eina_list_free(order); + } } static int diff --git a/src/tests/elementary/elm_test_focus.c b/src/tests/elementary/elm_test_focus.c index ab6c7f558d..063d4cdaa3 100644 --- a/src/tests/elementary/elm_test_focus.c +++ b/src/tests/elementary/elm_test_focus.c @@ -320,6 +320,7 @@ START_TEST(order_check) order = eina_list_append(order, child3); order = eina_list_append(order, child1); ck_assert_int_eq(efl_ui_focus_manager_calc_update_children(m, root, order), 1); + eina_list_free(order); order = NULL;