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