[PATCH weston] compositor: ignore unmapped sub-surfaces for view_list

Pekka Paalanen ppaalanen at gmail.com
Tue Jul 29 07:37:43 PDT 2014


On Mon, 28 Jul 2014 23:48:33 -0700
Jason Ekstrand <jason at jlekstrand.net> wrote:

> Yeah, I think this looks ok.
> 
> Reviewed-by: Jason Ekstrand <jason at jlekstrand.net>

Pushed, thanks,
pq


> On Mon, Jul 28, 2014 at 4:06 AM, Pekka Paalanen <ppaalanen at gmail.com> wrote:
> 
> > From: Pekka Paalanen <pekka.paalanen at collabora.co.uk>
> >
> > It looks like that in the great conversion introducing weston_view, one
> > conditional was forgotten from the code that builds the global flat list
> > of views. Sub-surfaces are added to the view list specially, as they are
> > not governed by their presence in a layer's view list, and therefore
> > need an explicit check for mappedness.
> >
> > The bug, missing the explicit check, caused sub-surfaces to enter the
> > global view_list regardless of their state. This lead to the pointer
> > focus picking code processing them, and as the input region defaults to
> > infinite, picking these unmapped surfaces. Clients then get confused
> > about the wl_pointer.enter events with unexpected wl_surface.
> >
> > To trigger this issue, it is enough to just create one additional
> > wl_surface and make it a sub-surface of a main surface that is or gets
> > mapped. Literally, just a wl_subsomcpositor_get_subsurface() call is
> > enough. At some point later, the unmapped sub-surface will get pointer
> > focus, depending on view stacking order.
> >
> > Fix the issue by adding a is_mapped check when building the view_list.
> >
> > Note, that 95ec0f95aa2df74c2da19e7dda24528fa8f765cc accidentally also
> > prevents this bug from happening, because it adds a test against the
> > transform.masked_boundingbox in weston_compositor_pick_view().
> >
> > Reported-by: George Kiagiadakis <george.kiagiadakis at collabora.com>
> > Signed-off-by: Pekka Paalanen <pekka.paalanen at collabora.co.uk>
> > Cc: Jason Ekstrand <jason.ekstrand at intel.com>
> > ---
> >  src/compositor.c | 3 +++
> >  1 file changed, 3 insertions(+)
> >
> > diff --git a/src/compositor.c b/src/compositor.c
> > index 02f569f..1e17583 100644
> > --- a/src/compositor.c
> > +++ b/src/compositor.c
> > @@ -1751,6 +1751,9 @@ view_list_add_subsurface_view(struct
> > weston_compositor *compositor,
> >         struct weston_subsurface *child;
> >         struct weston_view *view = NULL, *iv;
> >
> > +       if (!weston_surface_is_mapped(sub->surface))
> > +               return;
> > +
> >         wl_list_for_each(iv, &sub->unused_views, surface_link) {
> >                 if (iv->geometry.parent == parent) {
> >                         view = iv;
> > --
> > 1.8.5.5
> >
> > _______________________________________________
> > wayland-devel mailing list
> > wayland-devel at lists.freedesktop.org
> > http://lists.freedesktop.org/mailman/listinfo/wayland-devel
> >



More information about the wayland-devel mailing list