summaryrefslogtreecommitdiff
path: root/clients/window.c
diff options
context:
space:
mode:
authorAnder Conselvan de Oliveira <ander.conselvan.de.oliveira@intel.com>2014-05-06 15:25:40 +0300
committerKristian Høgsberg <krh@bitplanet.net>2014-05-12 12:50:00 -0700
commita57c9f1b90a14bbbd5de217f1e44bd443cd3783f (patch)
treed4693a2e8d24714f4fbf653572c306fc162643f3 /clients/window.c
parent15f8563524943c4e2cddc4560663b6cc8fa5f881 (diff)
downloadweston-a57c9f1b90a14bbbd5de217f1e44bd443cd3783f.tar.gz
window: Ignore input events from subsurfaces
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
Diffstat (limited to 'clients/window.c')
-rw-r--r--clients/window.c21
1 files changed, 16 insertions, 5 deletions
diff --git a/clients/window.c b/clients/window.c
index f12ce396..4592ef96 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