elm focus manager - dont leak child lists when updating focus order

REALLY fix T5800 by duplicating lists rather than taking ownership

@fix
This commit is contained in:
Carsten Haitzler 2017-08-31 17:34:30 +09:00
parent d0aefa87bf
commit bd6dcbb044
8 changed files with 58 additions and 36 deletions

View File

@ -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;

View File

@ -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<Efl.Ui.Focus.Object>); [[the list with the new order]]
children : list<Efl.Ui.Focus.Object>; [[the list with the new order]]
}
return : bool; [[$true if successful, $false otherwise]]
}

View File

@ -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

View File

@ -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 *

View File

@ -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);
}
}

View File

@ -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

View File

@ -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

View File

@ -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;