diff options
author | Matthias Clasen <mclasen@redhat.com> | 2015-11-16 18:31:37 -0500 |
---|---|---|
committer | Matthias Clasen <mclasen@redhat.com> | 2015-11-16 18:34:18 -0500 |
commit | c659292940f0fec924caf7f6a25b842593be0522 (patch) | |
tree | ceb1155567d526ea5cc0afc36e168edfccbd93e0 /gdk | |
parent | e24c248013b6d669814a3890a02d5c6512b5f77a (diff) | |
download | gtk+-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.c | 29 |
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); } |