[clutter/clutter-1.20] x11: Improve touchpad detection heuristics



commit 30cf9b400eeb22af2bed496325311276111ae32c
Author: Emmanuele Bassi <ebassi gnome org>
Date:   Thu Apr 9 11:03:16 2015 +0100

    x11: Improve touchpad detection heuristics
    
    We should use the same heuristics used by GDK in order to detect whether
    a device is a touchpad or not.
    
    Based on the similar code from Carlos Garnacho for GDK:
    https://git.gnome.org/browse/gtk+/commit/?id=6f07d5e7
    
    https://bugzilla.gnome.org/show_bug.cgi?id=747436
    
    (cherry picked from commit 79849ef1d5fff9acd310cd68d59df0c7cf2cb28f)
    
    Signed-off-by: Emmanuele Bassi <ebassi gnome org>

 clutter/x11/clutter-device-manager-xi2.c |   34 +++++++++++++++++++++++++++++-
 1 files changed, 33 insertions(+), 1 deletions(-)
---
diff --git a/clutter/x11/clutter-device-manager-xi2.c b/clutter/x11/clutter-device-manager-xi2.c
index 47aa4bf..f1bd4cb 100644
--- a/clutter/x11/clutter-device-manager-xi2.c
+++ b/clutter/x11/clutter-device-manager-xi2.c
@@ -222,6 +222,32 @@ is_touch_device (XIAnyClassInfo         **classes,
   return FALSE;
 }
 
+static gboolean
+is_touchpad_device (ClutterBackendX11 *backend_x11,
+                    XIDeviceInfo      *info)
+{
+  gulong nitems, bytes_after;
+  guint32 *data = NULL;
+  int rc, format;
+  Atom type;
+
+  clutter_x11_trap_x_errors ();
+  rc = XIGetProperty (backend_x11->xdpy,
+                      info->deviceid,
+                      XInternAtom (backend_x11->xdpy, "libinput Tapping Enabled", False),
+                      0, 1, False, XA_INTEGER, &type, &format, &nitems, &bytes_after,
+                      (guchar **) &data);
+  clutter_x11_untrap_x_errors ();
+
+  /* We don't care about the data */
+  XFree (data);
+
+  if (rc != Success || type != XA_INTEGER || format != 32 || nitems != 1)
+    return FALSE;
+
+  return TRUE;
+}
+
 static ClutterInputDevice *
 create_device (ClutterDeviceManagerXI2 *manager_xi2,
                ClutterBackendX11       *backend_x11,
@@ -234,7 +260,13 @@ create_device (ClutterDeviceManagerXI2 *manager_xi2,
   guint num_touches = 0;
 
   if (info->use == XIMasterKeyboard || info->use == XISlaveKeyboard)
-    source = CLUTTER_KEYBOARD_DEVICE;
+    {
+      source = CLUTTER_KEYBOARD_DEVICE;
+    }
+  else if (is_touchpad_device (backend_x11, info))
+    {
+      source = CLUTTER_TOUCHPAD_DEVICE;
+    }
   else if (info->use == XISlavePointer &&
            is_touch_device (info->classes, info->num_classes,
                             &touch_source,


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