[PATCH weston] window: Ignore input events from subsurfaces
Kristian Høgsberg
hoegsberg at gmail.com
Mon May 12 12:50:40 PDT 2014
On Tue, May 06, 2014 at 03:25:40PM +0300, Ander Conselvan de Oliveira wrote:
> From: Ander Conselvan de Oliveira <ander.conselvan.de.oliveira at intel.com>
>
> Toytoolkit was not designed to handle input from subsurfaces and
> instead it expects subsurfaces to have an empty input region. That way
> input events for subsurfaces are generated on the main surface and
> there is no need to convert coordinates before reporting the event to
> the user.
>
> However it is possible that a subsurface has a non-empty input region,
> but in that case those events aren't properly processed. The function
> window_find_widget() assumes the coordinates are in the main surface
> coordinate space, and ends up chosing the wrong widget.
>
> This patch changes the input code to completely ignore input events from
> subsurfaces. This option was chosen instead of ensuring that the input
> region on those surfaces is always empty since there's no enforcement
> that a subsurface should completely overlap with the main surface. If
> an event happens in the area of the surface that doesn't overlap, the
> event could cause a completely unrelated surface to be picked.
Let's go with this for now.
Kristian
> https://bugs.freedesktop.org/show_bug.cgi?id=78207
> ---
> clients/window.c | 21 ++++++++++++++++-----
> 1 file changed, 16 insertions(+), 5 deletions(-)
>
> diff --git a/clients/window.c b/clients/window.c
> index b7febed..3b57264 100644
> --- a/clients/window.c
> +++ b/clients/window.c
> @@ -2605,10 +2605,15 @@ pointer_handle_enter(void *data, struct wl_pointer *pointer,
> return;
> }
>
> + window = wl_surface_get_user_data(surface);
> + if (surface != window->main_surface->surface) {
> + DBG("Ignoring input event from subsurface %p\n", surface);
> + return;
> + }
> +
> input->display->serial = serial;
> input->pointer_enter_serial = serial;
> - input->pointer_focus = wl_surface_get_user_data(surface);
> - window = input->pointer_focus;
> + input->pointer_focus = window;
>
> if (window->resizing) {
> window->resizing = 0;
> @@ -2644,12 +2649,12 @@ pointer_handle_motion(void *data, struct wl_pointer *pointer,
> float sx = wl_fixed_to_double(sx_w);
> float sy = wl_fixed_to_double(sy_w);
>
> - input->sx = sx;
> - input->sy = sy;
> -
> if (!window)
> return;
>
> + input->sx = sx;
> + input->sy = sy;
> +
> /* when making the window smaller - e.g. after a unmaximise we might
> * still have a pending motion event that the compositor has picked
> * based on the old surface dimensions
> @@ -2979,6 +2984,12 @@ touch_handle_down(void *data, struct wl_touch *wl_touch,
> return;
> }
>
> + if (surface != input->touch_focus->main_surface->surface) {
> + DBG("Ignoring input event from subsurface %p\n", surface);
> + input->touch_focus = NULL;
> + return;
> + }
> +
> if (input->grab)
> widget = input->grab;
> else
> --
> 1.8.3.2
>
> _______________________________________________
> 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