[gtk+] gdkseatdefault: Grab touch events where applicable



commit 9c7e996bceaecedd474481d00303d807dcd5410c
Author: Daniel Boles <dboles src gnome org>
Date:   Tue Sep 5 15:44:00 2017 +0100

    gdkseatdefault: Grab touch events where applicable
    
    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 |   15 ++++++++++++++-
 1 files changed, 14 insertions(+), 1 deletions(-)
---
diff --git a/gdk/gdkseatdefault.c b/gdk/gdkseatdefault.c
index dc3f288..91a42cd 100644
--- a/gdk/gdkseatdefault.c
+++ b/gdk/gdkseatdefault.c
@@ -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);
     }
 


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]