diff --git a/src/lib/evas/canvas/evas_layer.c b/src/lib/evas/canvas/evas_layer.c index b81c0e0add..bee7449b28 100644 --- a/src/lib/evas/canvas/evas_layer.c +++ b/src/lib/evas/canvas/evas_layer.c @@ -75,18 +75,17 @@ _evas_layer_free(Evas_Layer *lay) void _evas_layer_flush_removes(Evas_Layer *lay) { - if (lay->walking_objects) return; - while (lay->removes) - { - Evas_Object_Protected_Data *obj = lay->removes->data; + Evas_Object_Protected_Data *obj; + if (lay->walking_objects) return; + EINA_LIST_FREE(lay->removes, obj) + { lay->objects = (Evas_Object_Protected_Data *) eina_inlist_remove(EINA_INLIST_GET(lay->objects), EINA_INLIST_GET(obj)); - lay->removes = eina_list_remove_list(lay->removes, lay->removes); obj->layer = NULL; obj->in_layer = 0; - lay->usage--; + if (lay->usage > 0) lay->usage--; } if (lay->usage <= 0) { diff --git a/src/lib/evas/canvas/evas_object_smart.c b/src/lib/evas/canvas/evas_object_smart.c index 40c3ac21b1..a189101df7 100644 --- a/src/lib/evas/canvas/evas_object_smart.c +++ b/src/lib/evas/canvas/evas_object_smart.c @@ -298,7 +298,6 @@ evas_object_smart_member_del(Evas_Object *eo_obj) if (!obj) return; if (!obj->smart.parent) return; Evas_Object *smart_obj = obj->smart.parent; - efl_canvas_group_member_del(smart_obj, eo_obj); } @@ -1270,8 +1269,37 @@ evas_object_smart_cleanup(Evas_Object *eo_obj) while (o->contained) { - Evas_Object *contained_obj = ((Evas_Object_Protected_Data *)o->contained)->object; - evas_object_smart_member_del(contained_obj); + Evas_Object_Protected_Data *contained = + (Evas_Object_Protected_Data *)o->contained; + Evas_Object *contained_obj = contained->object; + + if (contained->smart.parent != eo_obj) + { + Evas_Layer *lay = obj->layer; + + ERR("This is bad - object %p in child list for %p has parent %p", contained_obj, eo_obj, contained->smart.parent); + o->contained = eina_inlist_remove + (o->contained, EINA_INLIST_GET(contained)); + if (lay) + { + // this SHOULD be eina_inlist_append() BUT seemingly + // if we call this this objetc gets magicaly added + // back to o->conmtaind above NOt lay->objects. this + // is utterly bizzarre and the only explanation i + // can come up with right now is a compiler bug. + lay->objects = (Evas_Object_Protected_Data *) + eina_inlist_prepend(EINA_INLIST_GET(lay->objects), + EINA_INLIST_GET(contained)); + if (contained->layer != lay) + { + if (contained->layer) contained->layer->usage--; + contained->layer = lay; + contained->in_layer = 1; + lay->usage++; + } + } + } + else evas_object_smart_member_del(contained_obj); } while (o->callbacks)