On Tue,  6 May 2014 15:25:40 +0300
Ander Conselvan de Oliveira <conselv...@gmail.com> wrote:

> From: Ander Conselvan de Oliveira <ander.conselvan.de.olive...@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
_______________________________________________
wayland-devel mailing list
wayland-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/wayland-devel

Reply via email to