elementary/naviframe - fix the naviframe crash if naviframe_item_pop and naviframe...
authorChunEon Park <hermet@hermet.pe.kr>
Mon, 3 Dec 2012 13:27:57 +0000 (13:27 +0000)
committerChunEon Park <hermet@hermet.pe.kr>
Mon, 3 Dec 2012 13:27:57 +0000 (13:27 +0000)
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
src/lib/elm_widget_naviframe.h

index 848be6d..2267287 100644 (file)
@@ -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);
index 05ea5ff..c41d6a9 100644 (file)
@@ -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;