diff options
author | Emmanuele Bassi <ebassi@gnome.org> | 2015-04-09 11:03:16 +0100 |
---|---|---|
committer | Emmanuele Bassi <ebassi@gnome.org> | 2015-04-23 20:57:59 +0100 |
commit | 30cf9b400eeb22af2bed496325311276111ae32c (patch) | |
tree | e0c7f39bb4c996c79aa15e69858861f712bdfcd1 | |
parent | c0998fa347c2e36b900d4728b611c964d7121963 (diff) | |
download | clutter-30cf9b400eeb22af2bed496325311276111ae32c.tar.gz |
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>
-rw-r--r-- | 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 47aa4bfe7..f1bd4cb3a 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, |