From 22ff42f6d1e27a80e8c9ddafbeec82e8b8969dfb Mon Sep 17 00:00:00 2001 From: ChunEon Park Date: Mon, 3 Dec 2012 13:27:57 +0000 Subject: [PATCH] elementary/naviframe - fix the naviframe crash if naviframe_item_pop and naviframe deletion is performed in serial. even if the naviframe widget is deleted, the popped item's animator callback can be called. Now keep the popping item list to handle this. SVN revision: 80065 --- src/lib/elc_naviframe.c | 55 +++++++++++++++++++++++++----------------- src/lib/elm_widget_naviframe.h | 1 + 2 files changed, 34 insertions(+), 22 deletions(-) diff --git a/src/lib/elc_naviframe.c b/src/lib/elc_naviframe.c index 848be6d..2267287 100644 --- a/src/lib/elc_naviframe.c +++ b/src/lib/elc_naviframe.c @@ -1252,10 +1252,34 @@ _elm_naviframe_smart_add(Eo *obj, void *_pd, va_list *list EINA_UNUSED) elm_widget_can_focus_set(obj, EINA_FALSE); } +static Eina_Bool +_pop_transition_cb(void *data) +{ + Elm_Naviframe_Item *prev_it, *it; + it = (Elm_Naviframe_Item *)data; + ELM_NAVIFRAME_DATA_GET(WIDGET(it), sd); + + it->animator = NULL; + sd->popping = eina_list_remove(sd->popping, it); + + prev_it = (Elm_Naviframe_Item *) elm_naviframe_top_item_get(WIDGET(it)); + if (prev_it) + { + edje_object_signal_emit(VIEW(prev_it), "elm,state,prev,popped,deferred", "elm"); + edje_object_message_signal_process(VIEW(prev_it)); + } + edje_object_signal_emit(VIEW(it), "elm,state,cur,popped,deferred", "elm"); + + edje_object_message_signal_process(VIEW(it)); + + return ECORE_CALLBACK_CANCEL; +} + static void _elm_naviframe_smart_del(Eo *obj, void *_pd, va_list *list EINA_UNUSED) { Elm_Naviframe_Item *it; + Eina_List *l; Elm_Naviframe_Smart_Data *sd = _pd; @@ -1267,6 +1291,14 @@ _elm_naviframe_smart_del(Eo *obj, void *_pd, va_list *list EINA_UNUSED) elm_widget_item_del(it); } + //All popping items which are not called yet by animator. + EINA_LIST_FOREACH(sd->popping, l, it) + { + ecore_animator_del(it->animator); + elm_widget_item_del(it); + } + eina_list_free(sd->popping); + sd->on_deletion = EINA_FALSE; evas_object_del(sd->dummy_edje); @@ -1308,27 +1340,6 @@ _push_transition_cb(void *data) return ECORE_CALLBACK_CANCEL; } -static Eina_Bool -_pop_transition_cb(void *data) -{ - Elm_Naviframe_Item *prev_it, *it; - it = (Elm_Naviframe_Item *)data; - - it->animator = NULL; - - prev_it = (Elm_Naviframe_Item *) elm_naviframe_top_item_get(WIDGET(it)); - if (prev_it) - { - edje_object_signal_emit(VIEW(prev_it), "elm,state,prev,popped,deferred", "elm"); - edje_object_message_signal_process(VIEW(prev_it)); - } - edje_object_signal_emit(VIEW(it), "elm,state,cur,popped,deferred", "elm"); - - edje_object_message_signal_process(VIEW(it)); - - return ECORE_CALLBACK_CANCEL; -} - EAPI Evas_Object * elm_naviframe_add(Evas_Object *parent) { @@ -1463,7 +1474,6 @@ _item_insert_before(Eo *obj, void *_pd, va_list *list) if (EINA_INLIST_GET(it)->prev) prev_it = EINA_INLIST_CONTAINER_GET(EINA_INLIST_GET(it)->prev, Elm_Naviframe_Item); - it = _item_new(obj, prev_it, title_label, prev_btn, next_btn, content, item_style); if (!it) return; @@ -1601,6 +1611,7 @@ _item_pop(Eo *obj, void *_pd, va_list *list) if (it->animator) ecore_animator_del(it->animator); it->animator = ecore_animator_add(_pop_transition_cb, it); + sd->popping = eina_list_append(sd->popping, it); } else elm_widget_item_del(it); diff --git a/src/lib/elm_widget_naviframe.h b/src/lib/elm_widget_naviframe.h index 05ea5ff..c41d6a9 100644 --- a/src/lib/elm_widget_naviframe.h +++ b/src/lib/elm_widget_naviframe.h @@ -21,6 +21,7 @@ typedef struct _Elm_Naviframe_Smart_Data Elm_Naviframe_Smart_Data; struct _Elm_Naviframe_Smart_Data { Eina_Inlist *stack; /* top item is the list's LAST item */ + Eina_List *popping; Evas_Object *dummy_edje; Evas_Display_Mode dispmode; Elm_Object_Item *compress_it; -- 2.7.4