[gtk+/gtk-3-18] x11: Detect single-touch touchscreens as GDK_SOURCE_TOUCHSCREEN



commit 1266d15c4b67eb23dc7945a7af75268ee76af452
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]