edje: properly clean up callbacks when destroying edje object.
authorcedric <cedric@7cbeb6ba-43b4-40fd-8cce-4c39aea84d33>
Wed, 13 Jun 2012 03:10:18 +0000 (03:10 +0000)
committercedric <cedric@7cbeb6ba-43b4-40fd-8cce-4c39aea84d33>
Wed, 13 Jun 2012 03:10:18 +0000 (03:10 +0000)
git-svn-id: svn+ssh://svn.enlightenment.org/var/svn/e/trunk/edje@72057 7cbeb6ba-43b4-40fd-8cce-4c39aea84d33

src/lib/edje_load.c
src/lib/edje_util.c

index 5fbfb3d..e9e7a1f 100644 (file)
@@ -1110,6 +1110,13 @@ _edje_file_del(Edje *ed)
           }
         return;
      }
+
+   while (ed->user_defined)
+     {
+        eud = eina_list_data_get(ed->user_defined);
+        _edje_user_definition_free(eud);
+     }
+
    if (ed->table_parts)
      {
        unsigned int i;
@@ -1232,12 +1239,6 @@ _edje_file_del(Edje *ed)
          }
      }
 
-   while (ed->user_defined)
-     {
-        eud = eina_list_data_get(ed->user_defined);
-        _edje_user_definition_free(eud);
-     }
-
    if (ed->L) _edje_lua2_script_shutdown(ed);
    while (ed->subobjs) _edje_subobj_unregister(ed, ed->subobjs->data);
    if (ed->table_parts) free(ed->table_parts);
index 6f77ba3..b5bd45d 100644 (file)
@@ -47,6 +47,8 @@ static Eina_Bool _edje_text_class_list_foreach(const Eina_Hash *hash, const void
 static void _edje_object_image_preload_cb(void *data, Evas *e, Evas_Object *obj, void *event_info);
 static void _edje_object_signal_preload_cb(void *data, Evas_Object *obj, const char *emission, const char *source);
 static void _edje_user_def_del_cb(void *data, Evas *e __UNUSED__, Evas_Object *child __UNUSED__, void *einfo __UNUSED__);
+static void _edje_table_child_remove(Edje_Real_Part *rp, Evas_Object *child);
+static void _edje_box_child_remove(Edje_Real_Part *rp, Evas_Object *child);
 
 Edje_Real_Part *_edje_real_part_recursive_get_helper(const Edje *ed, char **path);
 
@@ -70,11 +72,26 @@ void
 _edje_user_definition_free(Edje_User_Defined *eud)
 {
    Evas_Object *child = NULL;
+   Edje_Real_Part *rp;
+
+   eud->ed->user_defined = eina_list_remove(eud->ed->user_defined, eud);
+
    switch (eud->type)
      {
-      case EDJE_USER_SWALLOW: child = eud->u.swallow.child; break;
-      case EDJE_USER_BOX_PACK: child = eud->u.box.child; break;
-      case EDJE_USER_TABLE_PACK: child = eud->u.table.child; break;
+      case EDJE_USER_SWALLOW:
+       child = eud->u.swallow.child;
+       edje_object_part_unswallow(eud->ed->obj, child);
+       break;
+      case EDJE_USER_BOX_PACK:
+       child = eud->u.box.child;
+       rp = _edje_real_part_recursive_get(eud->ed, eud->part);
+       _edje_box_child_remove(rp, child);
+       break;
+      case EDJE_USER_TABLE_PACK:
+       child = eud->u.table.child;
+       rp = _edje_real_part_recursive_get(eud->ed, eud->part);
+       _edje_table_child_remove(rp, child);
+       break;
       case EDJE_USER_STRING:
       case EDJE_USER_DRAG_STEP:
       case EDJE_USER_DRAG_PAGE:
@@ -82,8 +99,8 @@ _edje_user_definition_free(Edje_User_Defined *eud)
       case EDJE_USER_DRAG_SIZE:
          break;
      }
+
    if (child) evas_object_event_callback_del_full(child, EVAS_CALLBACK_DEL, _edje_user_def_del_cb, eud);
-   eud->ed->user_defined = eina_list_remove(eud->ed->user_defined, eud);
    eina_stringshare_del(eud->part);
    free(eud);
 }