From 2f9b4a7080b0b3ed1cf3f98e73f19e7fa135afae Mon Sep 17 00:00:00 2001 From: Jaehyun Cho Date: Fri, 6 Mar 2020 13:25:04 +0900 Subject: [PATCH] elc_naviframe: fix to delete item once by elm_object_item_del in pop_cb If elm_object_item_del is called in pop_cb and pop_cb returns EINA_FALSE, then the given item is destructed by _item_noref when efl_unref is called after pop_cb. After the above destruction, efl_del is called after the above efl_unref and it deletes the item again. Not to delete item after the item is destructed, efl_del after pop_cb is removed. --- src/bin/elementary/test_naviframe.c | 43 +++++++++++++++++++++++++++-- src/lib/elementary/elc_naviframe.c | 4 +-- 2 files changed, 41 insertions(+), 6 deletions(-) diff --git a/src/bin/elementary/test_naviframe.c b/src/bin/elementary/test_naviframe.c index 81696148ba..36e4bdb332 100644 --- a/src/bin/elementary/test_naviframe.c +++ b/src/bin/elementary/test_naviframe.c @@ -65,6 +65,43 @@ _promote(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) elm_naviframe_item_promote(data); } +Eina_Bool +_pop_cb(void *data EINA_UNUSED, Elm_Object_Item *it) +{ + elm_object_item_del(it); + + /* If EINA_TRUE is returned, pop transition effect happens and then the item + * is automatically deleted. + * If EINA_FALSE is returned, pop transition effect does not happen and the + * item is not automatically deleted. + */ + return EINA_FALSE; +} + +void +_page9(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Evas_Object *bt, *bt2, *nf = data; + Elm_Object_Item *it; + + bt = elm_button_add(nf); + evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL); + BUTTON_TEXT_SET(bt, "Page 8"); + + bt2 = elm_button_add(nf); + evas_object_size_hint_align_set(bt2, EVAS_HINT_FILL, EVAS_HINT_FILL); + BUTTON_TEXT_SET(bt2, "Page 1"); + evas_object_smart_callback_add(bt2, "clicked", _promote, + evas_object_data_get(nf, "page1")); + + it = elm_naviframe_item_push(nf, "Page 9", bt, bt2, NULL, NULL); + elm_object_item_part_text_set(it, "subtitle", "Callback for naviframe item pop is set"); + + elm_naviframe_item_pop_cb_set(it, _pop_cb, NULL); + + evas_object_smart_callback_add(bt, "clicked", _navi_pop, nf); +} + void _page8(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) { @@ -78,9 +115,9 @@ _page8(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) bt2 = elm_button_add(nf); evas_object_size_hint_align_set(bt2, EVAS_HINT_FILL, EVAS_HINT_FILL); - BUTTON_TEXT_SET(bt2, "Page 1"); - evas_object_smart_callback_add(bt2, "clicked", _promote, - evas_object_data_get(nf, "page1")); + BUTTON_TEXT_SET(bt2, "Page 9"); + evas_object_smart_callback_add(bt2, "clicked", _page9, nf); + content = _content_new(nf, img6); it = elm_naviframe_item_push(nf, "Page 8", bt, bt2, content, NULL); elm_object_item_part_text_set(it, "subtitle", "Overlap style!"); diff --git a/src/lib/elementary/elc_naviframe.c b/src/lib/elementary/elc_naviframe.c index 10368cb014..894d88e641 100644 --- a/src/lib/elementary/elc_naviframe.c +++ b/src/lib/elementary/elc_naviframe.c @@ -1733,9 +1733,7 @@ _elm_naviframe_item_pop(Eo *obj, Elm_Naviframe_Data *sd) if (!it->pop_cb(it->pop_data, eo_item)) { efl_unref(eo_item); - if (it->delete_me) - efl_del(eo_item); - else + if (!it->delete_me) { /* To avoid multiple item pops, the auto pushed button deletes its clicked callback once it is called.