compositor: ignore unmapped sub-surfaces for view_list

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 95ec0f95aa 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@collabora.com>
Signed-off-by: Pekka Paalanen <pekka.paalanen@collabora.co.uk>
Reviewed-by: Jason Ekstrand <jason@jlekstrand.net>
dev
Pekka Paalanen 11 years ago
parent dce7c6e5a2
commit 661de3a6a7
  1. 3
      src/compositor.c

@ -1751,6 +1751,9 @@ view_list_add_subsurface_view(struct weston_compositor *compositor,
struct weston_subsurface *child; struct weston_subsurface *child;
struct weston_view *view = NULL, *iv; struct weston_view *view = NULL, *iv;
if (!weston_surface_is_mapped(sub->surface))
return;
wl_list_for_each(iv, &sub->unused_views, surface_link) { wl_list_for_each(iv, &sub->unused_views, surface_link) {
if (iv->geometry.parent == parent) { if (iv->geometry.parent == parent) {
view = iv; view = iv;

Loading…
Cancel
Save