diff --git a/legacy/evas/ChangeLog b/legacy/evas/ChangeLog index a0c175a294..e4dda37fcd 100644 --- a/legacy/evas/ChangeLog +++ b/legacy/evas/ChangeLog @@ -908,6 +908,7 @@ 2012-07-24 Ingvaldur Sigurjonsson * Fix typoe in docs +<<<<<<< .mine 2012-07-24 Hermet (ChunEon Park) @@ -917,3 +918,10 @@ 2012-07-24 Cedric Bail * Handle Proxy with the right context. + +2012-07-24 Carsten Haitzler (The Rasterman) + + * Fix long-standing bug when changing layer of a smart object, + its children dont change their layer value and pointer with it, thus + getting layer from them get you the wrong one. + diff --git a/legacy/evas/src/lib/canvas/evas_layer.c b/legacy/evas/src/lib/canvas/evas_layer.c index 54e9907105..3c7bc84bf1 100644 --- a/legacy/evas/src/lib/canvas/evas_layer.c +++ b/legacy/evas/src/lib/canvas/evas_layer.c @@ -133,6 +133,31 @@ evas_layer_del(Evas_Layer *lay) e->layers = (Evas_Layer *)eina_inlist_remove(EINA_INLIST_GET(e->layers), EINA_INLIST_GET(lay)); } +static void +_evas_object_layer_set_child(Evas_Object *obj, Evas_Object *par, short l) +{ + Evas *e; + + if (obj->delete_me) return; + if (obj->cur.layer == l) return; + e = obj->layer->evas; + evas_object_release(obj, 1); + obj->cur.layer = l; + obj->layer = par->layer; + obj->layer->usage++; + if (obj->smart.smart) + { + Eina_Inlist *contained; + Evas_Object *member; + + contained = (Eina_Inlist *)evas_object_smart_members_get_direct(obj); + EINA_INLIST_FOREACH(contained, member) + { + _evas_object_layer_set_child(member, obj, l); + } + } +} + /* public functions */ EAPI void @@ -176,6 +201,17 @@ evas_object_layer_set(Evas_Object *obj, short l) obj->layer->evas->last_timestamp, NULL); } + else + { + Eina_Inlist *contained; + Evas_Object *member; + + contained = (Eina_Inlist *)evas_object_smart_members_get_direct(obj); + EINA_INLIST_FOREACH(contained, member) + { + _evas_object_layer_set_child(member, obj, l); + } + } evas_object_inform_call_restack(obj); }