gdkseatdefault: Grab touch events where applicable
authorDaniel Boles <dboles@src.gnome.org>
Tue, 5 Sep 2017 14:44:00 +0000 (15:44 +0100)
committerDaniel Boles <dboles@src.gnome.org>
Wed, 20 Sep 2017 18:19:31 +0000 (19:19 +0100)
gdk_seat_default_grab() grabs POINTER_EVENTS if the capability is
GDK_SEAT_CAPABILITY_ALL_POINTING. But that enumerator is a union that
includes GDK_SEAT_CAPABILITY_TOUCH, but we never grabbed TOUCH_EVENTS,
an unused macro that was presumably created with this purpose in mind.

So, check which of the ALL_POINTING capabilities we have, and set the
right mask of POINTER_EVENTS and/or TOUCH_EVENTS as required.

As part of this, explicitly let TABLET_STYLUS take over pointer events,
as this is the intended behaviour and was the effective result before.

This should fix touch events being lost in migrating from Device.grab()
to Seat.grab(GDK_SEAT_CAPABILITY_ALL_POINTING), as found by Inkscape.

https://bugzilla.gnome.org/show_bug.cgi?id=781757

gdk/gdkseatdefault.c

index dc3f2887d39720e7b34f822aa8744bf2cc1ec471..91a42cd4af373c82cb1435370f7acff7b0446b15 100644 (file)
@@ -132,9 +132,22 @@ gdk_seat_default_grab (GdkSeat                *seat,
 
   if (capabilities & GDK_SEAT_CAPABILITY_ALL_POINTING)
     {
+      /* ALL_POINTING spans 3 capabilities; get the mask for the ones we have */
+      GdkEventMask pointer_evmask = 0;
+
+      /* We let tablet styli take over the pointer cursor */
+      if (capabilities & (GDK_SEAT_CAPABILITY_POINTER |
+                          GDK_SEAT_CAPABILITY_TABLET_STYLUS))
+        {
+          pointer_evmask |= POINTER_EVENTS;
+        }
+
+      if (capabilities & GDK_SEAT_CAPABILITY_TOUCH)
+        pointer_evmask |= TOUCH_EVENTS;
+
       status = gdk_device_grab (priv->master_pointer, window,
                                 GDK_OWNERSHIP_NONE, owner_events,
-                                POINTER_EVENTS, cursor,
+                                pointer_evmask, cursor,
                                 evtime);
     }