<div dir="ltr">On Thu, Jun 18, 2015 at 12:14 AM, Pekka Paalanen <span dir="ltr"><<a href="mailto:ppaalanen@gmail.com" target="_blank">ppaalanen@gmail.com</a>></span> wrote:<br><div class="gmail_extra"><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><span class=""><br>
</span>Arnaud's code:<br>
<span class=""><br>
        surf[BLUE] = surface_create(ctx, NULL, 100, 100, 0, 0, 0xff0000ff);<br>
        if (!surf[BLUE])<br>
                die("failed to create root surface");<br>
<br>
        surf[RED] = surface_create(ctx, surf[BLUE], 100, 100, -100, -100,<br>
                                   0xffff0000);<br>
<br>
        surf[GREEN] = surface_create(ctx, surf[BLUE], 100, 100, -50, -50,<br>
                                     0xff00ff00);<br>
<br>
#if 0<br>
        wl_subsurface_place_below(surf[GREEN]->subsurface, surf[BLUE]->surface);<br>
        wl_subsurface_place_below(surf[RED]->subsurface, surf[GREEN]->surface);<br>
#else<br>
        wl_subsurface_place_below(surf[RED]->subsurface, surf[GREEN]->surface);<br>
        wl_subsurface_place_below(surf[GREEN]->subsurface, surf[BLUE]->surface);<br>
#endif<br>
<br>
</span>I can't see how you come to your conclusion, would you care to explain?<br></blockquote><div><br></div><div>Arnaud claims the result of this is the order G,R,B.<br><br></div><div>If place_below(A,B) was implemented as "insert A before B in the list" then the first statement (place_below(R,G)) would change this to R,G,B. The second statement (place_below(G,B)) would not change anything as G is already in the right place.<br><br></div><div>However if place_below(A,B) was implemented as "insert A at the start of the list" then the first statement produces R,G,B and then the second one moves G and produces G,R,B which matches what he is seeing.<br><br></div><div>Either he did not report correctly what is happening or place_below is not working as you specified.<br><br></div><div>I did not realize that the order was defined before the place_below calls. If you assume the three surfaces are in a random order, then the "insert A before B" implementation can still produce G,B,R.<br><br></div><div>I think we all agree that the solution is for the client to start with the "main" surface and do place_above/below with the adjacent surface, then place_above/below with the next further surface, etc.<br><br></div></div></div></div>