edje: properly clean up callbacks when destroying edje object.

SVN revision: 72057
This commit is contained in:
Cedric BAIL 2012-06-13 03:10:18 +00:00
parent 6746b071d1
commit a317c36990
2 changed files with 28 additions and 10 deletions

View 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);

View 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);
}