diff --git a/legacy/evas/src/lib/canvas/evas_layer.c b/legacy/evas/src/lib/canvas/evas_layer.c index 757ddb8073..05bed5ff28 100644 --- a/legacy/evas/src/lib/canvas/evas_layer.c +++ b/legacy/evas/src/lib/canvas/evas_layer.c @@ -44,6 +44,20 @@ evas_layer_new(Evas *e) return lay; } +void +evas_layer_pre_free(Evas_Layer *lay) +{ + Evas_Object_List *l; + + for (l = (Evas_Object_List *)lay->objects; l; l = l->next) + { + Evas_Object *obj; + + obj = (Evas_Object *)l; + evas_object_del(obj); + } +} + void evas_layer_free(Evas_Layer *lay) { @@ -52,7 +66,6 @@ evas_layer_free(Evas_Layer *lay) Evas_Object *obj; obj = (Evas_Object *)lay->objects; - if (obj->smart.smart) evas_object_smart_del(obj); evas_object_free(obj, 0); } free(lay); diff --git a/legacy/evas/src/lib/canvas/evas_main.c b/legacy/evas/src/lib/canvas/evas_main.c index af518d5586..f61cd4b2a2 100644 --- a/legacy/evas/src/lib/canvas/evas_main.c +++ b/legacy/evas/src/lib/canvas/evas_main.c @@ -72,13 +72,19 @@ evas_new(void) void evas_free(Evas *e) { + Evas_Object_List *l; + MAGIC_CHECK(e, Evas, MAGIC_EVAS); return; MAGIC_CHECK_END(); - evas_object_font_path_clear(e); - - e->pointer.object.in = evas_list_free(e->pointer.object.in); + for (l = (Evas_Object_List *)(e->layers); l; l = l->next) + { + Evas_Layer *lay; + + lay = (Evas_Layer *)l; + evas_layer_pre_free(lay); + } while (e->layers) { Evas_Layer *lay; @@ -88,6 +94,9 @@ evas_free(Evas *e) evas_layer_free(lay); } + evas_object_font_path_clear(e); + e->pointer.object.in = evas_list_free(e->pointer.object.in); + if (e->name_hash) evas_hash_free(e->name_hash); while (e->damages) diff --git a/legacy/evas/src/lib/canvas/evas_object_main.c b/legacy/evas/src/lib/canvas/evas_object_main.c index ba0d544a58..ddf866b7f8 100644 --- a/legacy/evas/src/lib/canvas/evas_object_main.c +++ b/legacy/evas/src/lib/canvas/evas_object_main.c @@ -422,6 +422,8 @@ evas_object_del(Evas_Object *obj) evas_object_change(obj); obj->delete_me = 1; if (obj->smart.smart) evas_object_smart_del(obj); + evas_object_smart_cleanup(obj); + obj->smart.smart = NULL; } void diff --git a/legacy/evas/src/lib/canvas/evas_object_smart.c b/legacy/evas/src/lib/canvas/evas_object_smart.c index 0d14f49108..371b3d207b 100644 --- a/legacy/evas/src/lib/canvas/evas_object_smart.c +++ b/legacy/evas/src/lib/canvas/evas_object_smart.c @@ -238,8 +238,8 @@ evas_object_smart_del(Evas_Object *obj) Evas_Smart *s; s = obj->smart.smart; - if (obj->smart.parent) evas_object_smart_member_del(obj); if ((s) && (s->func_del)) s->func_del(obj); + if (obj->smart.parent) evas_object_smart_member_del(obj); if (s) evas_object_smart_unuse(s); } diff --git a/legacy/evas/src/lib/include/evas_private.h b/legacy/evas/src/lib/include/evas_private.h index 91e912edc4..c786877509 100644 --- a/legacy/evas/src/lib/include/evas_private.h +++ b/legacy/evas/src/lib/include/evas_private.h @@ -497,6 +497,7 @@ void evas_object_render_pre_effect_updates(Evas_List *updates, Evas_Object *obj, Evas_List * evas_rects_return_difference_rects(int x, int y, int w, int h, int xx, int yy, int ww, int hh); void evas_object_clip_recalc(Evas_Object *obj); Evas_Layer *evas_layer_new(Evas *e); +void evas_layer_pre_free(Evas_Layer *lay); void evas_layer_free(Evas_Layer *lay); Evas_Layer *evas_layer_find(Evas *e, int layer_num); void evas_layer_add(Evas_Layer *lay);