From 83cd36e95f57fd17eb705b963dcc1ca489bb0cc0 Mon Sep 17 00:00:00 2001 From: Emmanuele Bassi 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,