[PATCH weston] window: Ignore input events from subsurfaces

Pekka Paalanen ppaalanen at gmail.com
Tue May 6 05:40:15 PDT 2014


On Tue,  6 May 2014 15:25:40 +0300
Ander Conselvan de Oliveira <conselvan2 at gmail.com> 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.
> 
> 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;

Ignoring enter on a sub-surface, actually. I assume the explanation is
that, that the leave on the main surface already sets pointer_focus to
NULL, and here we just avoid setting it, so all following input events
get ignored.

Ok.

> +	}
> +
>  	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) {

Could touch_focus somehow already be NULL?
Like putting two fingers one after the other to the sub-surface?

> +		DBG("Ignoring input event from subsurface %p\n", surface);
> +		input->touch_focus = NULL;

If I have a finger down on the main surface somewhere, and put another
finger on the tooltip, won't I lose the main surface then?

Sorry, I've no idea how multitouch works here.

> +		return;
> +	}
> +
>  	if (input->grab)
>  		widget = input->grab;
>  	else

Thanks,
pq


More information about the wayland-devel mailing list