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:
parent
d0aefa87bf
commit
bd6dcbb044
|
@ -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;
|
||||
|
||||
|
|
|
@ -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]]
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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 *
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
Loading…
Reference in New Issue