[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