compositor: ignore unmapped sub-surfaces for view_list
authorPekka Paalanen <pekka.paalanen@collabora.co.uk>
Mon, 28 Jul 2014 09:49:24 +0000 (12:49 +0300)
committerPekka Paalanen <pekka.paalanen@collabora.co.uk>
Tue, 29 Jul 2014 14:35:14 +0000 (17:35 +0300)
commit661de3a6a7ad11a9e4b39b346fea4dad3f853582
tree60648fded09cccd68de40fdd519bd6bd90821266
parentdce7c6e5a2fb2e639e1e96ec0eaaf0f6551bc7b6
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 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@collabora.com>
Signed-off-by: Pekka Paalanen <pekka.paalanen@collabora.co.uk>
Reviewed-by: Jason Ekstrand <jason@jlekstrand.net>
src/compositor.c