summaryrefslogtreecommitdiff
path: root/gdk
diff options
context:
space:
mode:
authorMatthias Clasen <mclasen@redhat.com>2015-11-16 18:31:37 -0500
committerMatthias Clasen <mclasen@redhat.com>2015-11-16 18:34:18 -0500
commitc659292940f0fec924caf7f6a25b842593be0522 (patch)
treeceb1155567d526ea5cc0afc36e168edfccbd93e0 /gdk
parente24c248013b6d669814a3890a02d5c6512b5f77a (diff)
downloadgtk+-c659292940f0fec924caf7f6a25b842593be0522.tar.gz
x11: Try harder to find a core pointer
We currently just look for a master device with input source MOUSE. After recent changes to the way input devices are classified, xwayland on my system comes up with a virtual core pointer that has input source TOUCHSCREEN. This was causing assertion failures. Be a little more careful and accept a touchscreen as core pointer, if there is no mouse.
Diffstat (limited to 'gdk')
-rw-r--r--gdk/x11/gdkdisplay-x11.c29
1 files changed, 18 insertions, 11 deletions
diff --git a/gdk/x11/gdkdisplay-x11.c b/gdk/x11/gdkdisplay-x11.c
index 0030c6c116..5816d18002 100644
--- a/gdk/x11/gdkdisplay-x11.c
+++ b/gdk/x11/gdkdisplay-x11.c
@@ -1342,6 +1342,7 @@ gdk_x11_display_init_input (GdkDisplay *display)
GdkDeviceManager *device_manager;
GdkDevice *device;
GList *list, *l;
+ gint pass;
display_x11 = GDK_X11_DISPLAY (display);
device_manager = gdk_display_get_device_manager (display);
@@ -1365,25 +1366,31 @@ gdk_x11_display_init_input (GdkDisplay *display)
g_list_free (list);
/* Now set "core" pointer to the first
- * master device that is a pointer.
+ * master device that is a pointer,
+ * preferring mice over touchscreens.
*/
list = gdk_device_manager_list_devices (device_manager, GDK_DEVICE_TYPE_MASTER);
- for (l = list; l; l = l->next)
+ for (pass = 0; pass < 2; pass++)
{
- device = l->data;
+ for (l = list; l; l = l->next)
+ {
+ device = l->data;
- if (gdk_device_get_source (device) != GDK_SOURCE_MOUSE)
- continue;
+ if ((pass == 0 && gdk_device_get_source (device) == GDK_SOURCE_MOUSE) ||
+ (pass == 1 && gdk_device_get_source (device) == GDK_SOURCE_TOUCHSCREEN))
+ {
+ display->core_pointer = device;
- display->core_pointer = device;
- break;
+ /* Add the core pointer to the devices list */
+ display_x11->input_devices = g_list_prepend (display_x11->input_devices,
+ g_object_ref (display->core_pointer));
+ goto out;
+ }
+ }
}
- /* Add the core pointer to the devices list */
- display_x11->input_devices = g_list_prepend (display_x11->input_devices,
- g_object_ref (display->core_pointer));
-
+out:
g_list_free (list);
}