diff options
author | Carlos Garnacho <carlosg@gnome.org> | 2015-10-30 14:10:19 +0100 |
---|---|---|
committer | Matthias Clasen <mclasen@redhat.com> | 2015-11-03 07:07:12 -0500 |
commit | 29dd395b7a5b8af0af55c12763e470f1daec287b (patch) | |
tree | 0a64b225298e5a56ac5e08987eb319f480e9bbb3 /gdk | |
parent | b3b4282beb9930b3d1688ff19f8016f35998427d (diff) | |
download | gtk+-29dd395b7a5b8af0af55c12763e470f1daec287b.tar.gz |
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
Diffstat (limited to 'gdk')
-rw-r--r-- | 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 2401ff1ce7..dc35f0310e 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; |