[gtk+] x11: Detect single-touch touchscreens as GDK_SOURCE_TOUCHSCREEN
- From: Matthias Clasen <matthiasc src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk+] x11: Detect single-touch touchscreens as GDK_SOURCE_TOUCHSCREEN
- Date: Tue, 3 Nov 2015 12:13:32 +0000 (UTC)
commit 29dd395b7a5b8af0af55c12763e470f1daec287b
Author: Carlos Garnacho <carlosg gnome org>
Date: Fri Oct 30 14:10:19 2015 +0100
x11: Detect single-touch touchscreens as GDK_SOURCE_TOUCHSCREEN
Those won't have ABS_MT_* axes, so won't be reported has having
XITouchClassInfo. Fallback on these to checking whether abs x/y axes are
available. After the Wacom checks, any remaining device with absolute axes
should be touchscreens, and GDK_SOURCE_MOUSE does indeed just make sense on
devices with relative axes.
https://bugzilla.gnome.org/show_bug.cgi?id=757358
gdk/x11/gdkdevicemanager-xi2.c | 35 +++++++++++++++++++++++++++++++++++
1 files changed, 35 insertions(+), 0 deletions(-)
---
diff --git a/gdk/x11/gdkdevicemanager-xi2.c b/gdk/x11/gdkdevicemanager-xi2.c
index 2401ff1..dc35f03 100644
--- a/gdk/x11/gdkdevicemanager-xi2.c
+++ b/gdk/x11/gdkdevicemanager-xi2.c
@@ -302,6 +302,39 @@ is_touch_device (XIAnyClassInfo **classes,
}
static gboolean
+has_abs_axes (GdkDisplay *display,
+ XIAnyClassInfo **classes,
+ guint n_classes)
+{
+ gboolean has_x = FALSE, has_y = FALSE;
+ Atom abs_x, abs_y;
+ guint i;
+
+ abs_x = gdk_x11_get_xatom_by_name_for_display (display, "Abs X");
+ abs_y = gdk_x11_get_xatom_by_name_for_display (display, "Abs Y");
+
+ for (i = 0; i < n_classes; i++)
+ {
+ XIValuatorClassInfo *class = (XIValuatorClassInfo *) classes[i];
+
+ if (class->type != XIValuatorClass)
+ continue;
+ if (class->mode != XIModeAbsolute)
+ continue;
+
+ if (class->label == abs_x)
+ has_x = TRUE;
+ else if (class->label == abs_y)
+ has_y = TRUE;
+
+ if (has_x && has_y)
+ break;
+ }
+
+ return (has_x && has_y);
+}
+
+static gboolean
get_device_ids (GdkDisplay *display,
XIDeviceInfo *info,
gchar **vendor_id,
@@ -393,6 +426,8 @@ create_device (GdkDeviceManager *device_manager,
else if (strstr (tmp_name, "wacom") ||
strstr (tmp_name, "pen"))
input_source = GDK_SOURCE_PEN;
+ else if (has_abs_axes (display, dev->classes, dev->num_classes))
+ input_source = GDK_SOURCE_TOUCHSCREEN;
else
input_source = GDK_SOURCE_MOUSE;
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]