From 83cd36e95f57fd17eb705b963dcc1ca489bb0cc0 Mon Sep 17 00:00:00 2001
From: Emmanuele Bassi <ebassi@gnome.org>
Date: Thu, 9 Apr 2015 11:03:16 +0100
Subject: [PATCH] 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
---
 clutter/x11/clutter-device-manager-xi2.c | 34 +++++++++++++++++++++++-
 1 file changed, 33 insertions(+), 1 deletion(-)

diff --git a/clutter/x11/clutter-device-manager-xi2.c b/clutter/x11/clutter-device-manager-xi2.c
index 2303fb4fc..1bad9d710 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 gboolean
 get_device_ids (ClutterBackendX11  *backend_x11,
                 XIDeviceInfo       *info,
@@ -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,