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



commit 79849ef1d5fff9acd310cd68d59df0c7cf2cb28f
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 83cd36e95f57fd17eb705b963dcc1ca489bb0cc0)
    
    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 2303fb4..1bad9d7 100644
--- a/clutter/x11/clutter-device-manager-xi2.c
+++ b/clutter/x11/clutter-device-manager-xi2.c
@@ -223,6 +223,32 @@ is_touch_device (XIAnyClassInfo         **classes,
 }
 
 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 gboolean
 get_device_ids (ClutterBackendX11  *backend_x11,
                 XIDeviceInfo       *info,
                 gchar             **vendor_id,
@@ -267,7 +293,13 @@ create_device (ClutterDeviceManagerXI2 *manager_xi2,
   gchar *vendor_id = NULL, *product_id = NULL;
 
   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]