You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
128 lines
4.3 KiB
128 lines
4.3 KiB
7 years ago
|
From bc17d94ef058564c1a1adf28a8696164455fea1b Mon Sep 17 00:00:00 2001
|
||
|
From: Carlos Garnacho <carlosg@gnome.org>
|
||
|
Date: Tue, 30 Jan 2018 13:07:32 +0100
|
||
|
Subject: [PATCH] backends/x11: Preserve XI1 XDevice throughout
|
||
|
ClutterInputDevice lifetime
|
||
|
|
||
|
Opening and closing the device may result into XI2 grabs being cut short,
|
||
|
resulting into pad buttons being rendered ineffective, and other possible
|
||
|
misbehaviors. This is an XInput flaw that fell in the gap between XI1 and
|
||
|
XI2, and has no easy fix. It pays us for mixing both versions, I guess...
|
||
|
|
||
|
Work this around by keeping the XI1 XDevice attached to the
|
||
|
ClutterInputDevice, this way it will live long enough that this is not
|
||
|
a concern.
|
||
|
|
||
|
Investigation of this bug was mostly carried by Peter Hutterer, I'm just
|
||
|
the executing hand.
|
||
|
|
||
|
https://gitlab.gnome.org/GNOME/mutter/issues/7
|
||
|
|
||
|
Closes: #7
|
||
|
---
|
||
|
src/backends/x11/meta-input-settings-x11.c | 48 ++++++++++++++++++++++++++----
|
||
|
1 file changed, 42 insertions(+), 6 deletions(-)
|
||
|
|
||
|
diff --git a/src/backends/x11/meta-input-settings-x11.c b/src/backends/x11/meta-input-settings-x11.c
|
||
|
index d1ee37a..7a876ef 100644
|
||
|
--- a/src/backends/x11/meta-input-settings-x11.c
|
||
|
+++ b/src/backends/x11/meta-input-settings-x11.c
|
||
|
@@ -55,6 +55,46 @@ enum {
|
||
|
SCROLL_METHOD_NUM_FIELDS
|
||
|
};
|
||
|
|
||
|
+static void
|
||
|
+device_free_xdevice (gpointer user_data)
|
||
|
+{
|
||
|
+ MetaDisplay *display = meta_get_display ();
|
||
|
+ MetaBackend *backend = meta_get_backend ();
|
||
|
+ Display *xdisplay = meta_backend_x11_get_xdisplay (META_BACKEND_X11 (backend));
|
||
|
+ XDevice *xdev = user_data;
|
||
|
+
|
||
|
+ meta_error_trap_push (display);
|
||
|
+ XCloseDevice (xdisplay, xdev);
|
||
|
+ meta_error_trap_pop (display);
|
||
|
+}
|
||
|
+
|
||
|
+static XDevice *
|
||
|
+device_ensure_xdevice (ClutterInputDevice *device)
|
||
|
+{
|
||
|
+ MetaDisplay *display = meta_get_display ();
|
||
|
+ MetaBackend *backend = meta_get_backend ();
|
||
|
+ Display *xdisplay = meta_backend_x11_get_xdisplay (META_BACKEND_X11 (backend));
|
||
|
+ int device_id = clutter_input_device_get_device_id (device);
|
||
|
+ XDevice *xdev = NULL;
|
||
|
+
|
||
|
+ xdev = g_object_get_data (G_OBJECT (device), "meta-input-settings-xdevice");
|
||
|
+ if (xdev)
|
||
|
+ return xdev;
|
||
|
+
|
||
|
+ meta_error_trap_push (display);
|
||
|
+ xdev = XOpenDevice (xdisplay, device_id);
|
||
|
+ meta_error_trap_pop (display);
|
||
|
+
|
||
|
+ if (xdev)
|
||
|
+ {
|
||
|
+ g_object_set_data_full (G_OBJECT (device),
|
||
|
+ "meta-input-settings-xdevice",
|
||
|
+ xdev, (GDestroyNotify) device_free_xdevice);
|
||
|
+ }
|
||
|
+
|
||
|
+ return xdev;
|
||
|
+}
|
||
|
+
|
||
|
static void *
|
||
|
get_property (ClutterInputDevice *device,
|
||
|
const gchar *property,
|
||
|
@@ -540,7 +580,6 @@ meta_input_settings_x11_set_tablet_mapping (MetaInputSettings *settings,
|
||
|
MetaDisplay *display = meta_get_display ();
|
||
|
MetaBackend *backend = meta_get_backend ();
|
||
|
Display *xdisplay = meta_backend_x11_get_xdisplay (META_BACKEND_X11 (backend));
|
||
|
- int device_id = clutter_input_device_get_device_id (device);
|
||
|
XDevice *xdev;
|
||
|
|
||
|
if (!display)
|
||
|
@@ -548,13 +587,12 @@ meta_input_settings_x11_set_tablet_mapping (MetaInputSettings *settings,
|
||
|
|
||
|
/* Grab the puke bucket! */
|
||
|
meta_error_trap_push (display);
|
||
|
- xdev = XOpenDevice (xdisplay, device_id);
|
||
|
+ xdev = device_ensure_xdevice (device);
|
||
|
if (xdev)
|
||
|
{
|
||
|
XSetDeviceMode (xdisplay, xdev,
|
||
|
mapping == G_DESKTOP_TABLET_MAPPING_ABSOLUTE ?
|
||
|
Absolute : Relative);
|
||
|
- XCloseDevice (xdisplay, xdev);
|
||
|
}
|
||
|
|
||
|
if (meta_error_trap_pop_with_return (display))
|
||
|
@@ -737,7 +775,6 @@ meta_input_settings_x11_set_stylus_button_map (MetaInputSettings *setti
|
||
|
MetaDisplay *display = meta_get_display ();
|
||
|
MetaBackend *backend = meta_get_backend ();
|
||
|
Display *xdisplay = meta_backend_x11_get_xdisplay (META_BACKEND_X11 (backend));
|
||
|
- int device_id = clutter_input_device_get_device_id (device);
|
||
|
XDevice *xdev;
|
||
|
|
||
|
if (!display)
|
||
|
@@ -745,7 +782,7 @@ meta_input_settings_x11_set_stylus_button_map (MetaInputSettings *setti
|
||
|
|
||
|
/* Grab the puke bucket! */
|
||
|
meta_error_trap_push (display);
|
||
|
- xdev = XOpenDevice (xdisplay, device_id);
|
||
|
+ xdev = device_ensure_xdevice (device);
|
||
|
if (xdev)
|
||
|
{
|
||
|
guchar map[3] = {
|
||
|
@@ -755,7 +792,6 @@ meta_input_settings_x11_set_stylus_button_map (MetaInputSettings *setti
|
||
|
};
|
||
|
|
||
|
XSetDeviceButtonMapping (xdisplay, xdev, map, G_N_ELEMENTS (map));
|
||
|
- XCloseDevice (xdisplay, xdev);
|
||
|
}
|
||
|
|
||
|
if (meta_error_trap_pop_with_return (display))
|
||
|
--
|
||
|
1.8.3.1
|
||
|
|