On Sun, Sep 22, 2013 at 02:27:41PM +0200, Giulio Camuffo wrote: > Oh, i just noticed you pushed your commit that removes the > weston_compositor_build_surface_list() but you didn't push this one. :)
Yeah, not good. Pushed now. Kristian > 2013/9/22 Giulio Camuffo <giuliocamu...@gmail.com>: > > 2013/9/22 Kristian Høgsberg <hoegsb...@gmail.com>: > >> On Sat, Sep 21, 2013 at 06:08:28PM +0200, Giulio Camuffo wrote: > >>> compositor.surface_list is recreated every redraw with the mapped > >>> surfaces, but if a surface gets unmapped and then in the same frame > >>> weston_compositor_pick_surface() is called we must make sure it > >>> does not pick the unmapped surface, since it traverses the > >>> surface_list to find one. > >>> If after the unmap the surface gets also deleted it's even more > >>> important, as it must not pick a destroyed surface. > >> > >> We have a call to weston_compositor_build_surface_list() in after the > >> call to weston_surface_unmap() in weston_surface_destroy(), but we > >> should be able to keep the list uptodate as we unmap surfaces. I > >> think we did it "just to be safe", but your patch should be enough and > >> if it isn't I want to find out what we're missing. > > > > Also, that weston_compositor_build_surface_list() wasn't called if the > > unmap was > > a result of a previous explicit wl_surface_attach(0) call > > ("wl_surface_attach(0); wl_surface_destroy()" from the client side), > > because the > > "if (weston_surface_is_mapped(surface))" failed. > > > > Giulio > > > >> > >> I'll push your patch and then remove the rebuild of the surface list > >> in weston_surface_destroy(). > >> > >> Kristian > >> > >> > >>> --- > >>> src/compositor.c | 2 ++ > >>> 1 file changed, 2 insertions(+) > >>> > >>> diff --git a/src/compositor.c b/src/compositor.c > >>> index a1c01fb..fefa001 100644 > >>> --- a/src/compositor.c > >>> +++ b/src/compositor.c > >>> @@ -994,6 +994,8 @@ weston_surface_unmap(struct weston_surface *surface) > >>> surface->mapped = 0; > >>> surface->output = NULL; > >>> wl_list_remove(&surface->layer_link); > >>> + wl_list_remove(&surface->link); > >>> + wl_list_init(&surface->link); > >>> > >>> wl_list_for_each(seat, &surface->compositor->seat_list, link) { > >>> if (seat->keyboard && seat->keyboard->focus == surface) > >>> -- > >>> 1.8.4 > >>> > >>> _______________________________________________ > >>> wayland-devel mailing list > >>> wayland-devel@lists.freedesktop.org > >>> http://lists.freedesktop.org/mailman/listinfo/wayland-devel _______________________________________________ wayland-devel mailing list wayland-devel@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/wayland-devel