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.
This commit is contained in:
parent
bd6608dd90
commit
2f9b4a7080
|
@ -65,6 +65,43 @@ _promote(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
|
||||||
elm_naviframe_item_promote(data);
|
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
|
void
|
||||||
_page8(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
|
_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);
|
bt2 = elm_button_add(nf);
|
||||||
evas_object_size_hint_align_set(bt2, EVAS_HINT_FILL, EVAS_HINT_FILL);
|
evas_object_size_hint_align_set(bt2, EVAS_HINT_FILL, EVAS_HINT_FILL);
|
||||||
BUTTON_TEXT_SET(bt2, "Page 1");
|
BUTTON_TEXT_SET(bt2, "Page 9");
|
||||||
evas_object_smart_callback_add(bt2, "clicked", _promote,
|
evas_object_smart_callback_add(bt2, "clicked", _page9, nf);
|
||||||
evas_object_data_get(nf, "page1"));
|
|
||||||
content = _content_new(nf, img6);
|
content = _content_new(nf, img6);
|
||||||
it = elm_naviframe_item_push(nf, "Page 8", bt, bt2, content, NULL);
|
it = elm_naviframe_item_push(nf, "Page 8", bt, bt2, content, NULL);
|
||||||
elm_object_item_part_text_set(it, "subtitle", "Overlap style!");
|
elm_object_item_part_text_set(it, "subtitle", "Overlap style!");
|
||||||
|
|
|
@ -1733,9 +1733,7 @@ _elm_naviframe_item_pop(Eo *obj, Elm_Naviframe_Data *sd)
|
||||||
if (!it->pop_cb(it->pop_data, eo_item))
|
if (!it->pop_cb(it->pop_data, eo_item))
|
||||||
{
|
{
|
||||||
efl_unref(eo_item);
|
efl_unref(eo_item);
|
||||||
if (it->delete_me)
|
if (!it->delete_me)
|
||||||
efl_del(eo_item);
|
|
||||||
else
|
|
||||||
{
|
{
|
||||||
/* To avoid multiple item pops, the auto pushed button deletes
|
/* To avoid multiple item pops, the auto pushed button deletes
|
||||||
its clicked callback once it is called.
|
its clicked callback once it is called.
|
||||||
|
|
Loading…
Reference in New Issue