elementary: enforce walk to protect the object existence by using eo refcounting.

This commit is contained in:
Cedric BAIL 2018-05-10 15:37:32 -07:00
parent 048a93e6e3
commit e4a6aaa4c1
1 changed files with 19 additions and 15 deletions

View File

@ -777,7 +777,7 @@ _elm_list_mode_set_internal(Evas_Object *obj)
}
static inline void
_elm_list_walk(Elm_List_Data *sd)
_elm_list_walk(Evas_Object *obj, Elm_List_Data *sd)
{
if (sd->walking < 0)
{
@ -785,6 +785,7 @@ _elm_list_walk(Elm_List_Data *sd)
sd->walking = 0;
}
sd->walking++;
efl_ref(obj);
}
static inline void
@ -798,7 +799,7 @@ _elm_list_unwalk(Evas_Object *obj, Elm_List_Data *sd)
}
if (sd->walking)
return;
goto cleanup;
if (sd->to_delete)
_elm_list_deletions_process(sd);
@ -809,6 +810,9 @@ _elm_list_unwalk(Evas_Object *obj, Elm_List_Data *sd)
_items_fix(obj);
elm_layout_sizing_eval(obj);
}
cleanup:
efl_unref(obj);
}
static void
@ -841,7 +845,7 @@ _items_fix(Evas_Object *obj)
}
evas_object_ref(obj);
_elm_list_walk(sd); // watch out "return" before unwalk!
_elm_list_walk(obj, sd); // watch out "return" before unwalk!
EINA_LIST_FOREACH(sd->items, l, eo_it)
{
@ -1360,7 +1364,7 @@ _item_highlight(Elm_List_Item_Data *it)
return;
evas_object_ref(obj);
_elm_list_walk(sd);
_elm_list_walk(obj, sd);
edje_object_signal_emit(VIEW(it), "elm,state,selected", "elm");
efl_event_callback_legacy_call(obj, ELM_LIST_EVENT_HIGHLIGHTED, EO_OBJ(it));
@ -1412,7 +1416,7 @@ _item_select(Elm_List_Item_Data *it)
call:
evas_object_ref(obj);
_elm_list_walk(sd);
_elm_list_walk(obj, sd);
if (it->func) it->func((void *)WIDGET_ITEM_DATA_GET(eo_it), WIDGET(it), eo_it);
efl_event_callback_legacy_call(obj, EFL_UI_EVENT_SELECTED, eo_it);
@ -1439,7 +1443,7 @@ _item_unhighlight(Elm_List_Item_Data *it)
if (!it->highlighted) return;
evas_object_ref(obj);
_elm_list_walk(sd);
_elm_list_walk(obj, sd);
edje_object_signal_emit(VIEW(it), "elm,state,unselected", "elm");
efl_event_callback_legacy_call
@ -1470,7 +1474,7 @@ _item_unselect(Elm_List_Item_Data *it)
// return;
evas_object_ref(obj);
_elm_list_walk(sd);
_elm_list_walk(obj, sd);
if (sd->focus_on_selection_enabled)
{
@ -1607,7 +1611,7 @@ _mouse_move_cb(void *data,
ELM_LIST_DATA_GET(obj, sd);
evas_object_ref(obj);
_elm_list_walk(sd);
_elm_list_walk(obj, sd);
evas_object_geometry_get(o, &x, &y, &w, &h);
@ -1688,7 +1692,7 @@ _mouse_down_cb(void *data,
sd->was_selected = it->selected;
evas_object_ref(obj);
_elm_list_walk(sd);
_elm_list_walk(obj, sd);
_item_highlight(it);
sd->longpressed = EINA_FALSE;
@ -1779,7 +1783,7 @@ _mouse_up_cb(void *data,
return;
evas_object_ref(obj);
_elm_list_walk(sd);
_elm_list_walk(obj, sd);
if (sd->focused_item != EO_OBJ(it))
elm_object_item_focus_set(EO_OBJ(it), EINA_TRUE);
@ -2063,7 +2067,7 @@ _elm_list_item_elm_widget_item_del_pre(Eo *eo_item, Elm_List_Item_Data *item)
sd->items = eina_list_remove_list(sd->items, item->node);
evas_object_ref(obj);
_elm_list_walk(sd);
_elm_list_walk(obj, sd);
_elm_list_item_free(item);
@ -2202,7 +2206,7 @@ _access_activate_cb(void *data EINA_UNUSED,
ELM_LIST_DATA_GET(obj, sd);
evas_object_ref(obj);
_elm_list_walk(sd);
_elm_list_walk(obj, sd);
if (sd->multi)
{
@ -2454,7 +2458,7 @@ _elm_list_efl_canvas_group_group_del(Eo *obj, Elm_List_Data *sd)
evas_object_event_callback_del
(sd->box, EVAS_CALLBACK_CHANGED_SIZE_HINTS, _size_hints_changed_cb);
_elm_list_walk(sd);
_elm_list_walk(obj, sd);
EINA_LIST_FREE(sd->items, eo_it)
{
@ -2719,7 +2723,7 @@ _elm_list_clear(Eo *obj, Elm_List_Data *sd)
evas_object_ref(obj);
_elm_list_walk(sd);
_elm_list_walk(obj, sd);
EINA_LIST_FREE(sd->items, eo_it)
{
@ -2900,7 +2904,7 @@ _elm_list_item_selected_set(Eo *eo_item EINA_UNUSED, Elm_List_Item_Data *item,
if (item->selected == selected) return;
evas_object_ref(obj);
_elm_list_walk(sd);
_elm_list_walk(obj, sd);
if (selected)
{