From a317c3699093ecaf3a6c6020c887569f82793ed9 Mon Sep 17 00:00:00 2001 From: Cedric BAIL Date: Wed, 13 Jun 2012 03:10:18 +0000 Subject: [PATCH] edje: properly clean up callbacks when destroying edje object. SVN revision: 72057 --- legacy/edje/src/lib/edje_load.c | 13 +++++++------ legacy/edje/src/lib/edje_util.c | 25 +++++++++++++++++++++---- 2 files changed, 28 insertions(+), 10 deletions(-) diff --git a/legacy/edje/src/lib/edje_load.c b/legacy/edje/src/lib/edje_load.c index 5fbfb3d689..e9e7a1f7c0 100644 --- a/legacy/edje/src/lib/edje_load.c +++ b/legacy/edje/src/lib/edje_load.c @@ -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); diff --git a/legacy/edje/src/lib/edje_util.c b/legacy/edje/src/lib/edje_util.c index 6f77ba36a5..b5bd45d82b 100644 --- a/legacy/edje/src/lib/edje_util.c +++ b/legacy/edje/src/lib/edje_util.c @@ -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); }