From 5f1bcc124fda6dd217183842d8711d646e1aac7b Mon Sep 17 00:00:00 2001 From: Peter Hutterer Date: Thu, 11 Jun 2015 11:49:24 +1000 Subject: [PATCH] input-settings-x11: check properties for correctness before changing them Before submitting a new scroll mode, click method or sendevents mode check if the value is supported by the device. This avoids BadValue errors when setting two-finger scrolling on single-finger touchpad devices since we can't easily handle BadValue (see 9747277b) https://bugzilla.gnome.org/show_bug.cgi?id=750816 Signed-off-by: Peter Hutterer --- src/backends/x11/meta-input-settings-x11.c | 49 ++++++++++++++++++---- 1 file changed, 42 insertions(+), 7 deletions(-) diff --git a/src/backends/x11/meta-input-settings-x11.c b/src/backends/x11/meta-input-settings-x11.c index cffc63e8e..e582dfc1f 100644 --- a/src/backends/x11/meta-input-settings-x11.c +++ b/src/backends/x11/meta-input-settings-x11.c @@ -106,6 +106,12 @@ meta_input_settings_x11_set_send_events (MetaInputSettings *settings, GDesktopDeviceSendEvents mode) { guchar values[2] = { 0 }; /* disabled, disabled-on-external-mouse */ + guchar *available; + + available = get_property (device, "libinput Send Events Modes Available", + XA_INTEGER, 8, 2); + if (!available) + return; switch (mode) { @@ -119,8 +125,14 @@ meta_input_settings_x11_set_send_events (MetaInputSettings *settings, break; } - change_property (device, "libinput Send Events Mode Enabled", - XA_INTEGER, 8, &values, 2); + if ((values[0] && !available[0]) || (values[1] && !available[1])) + g_warning ("Device '%s' does not support sendevents mode %d\n", + clutter_input_device_get_device_name (device), mode); + else + change_property (device, "libinput Send Events Mode Enabled", + XA_INTEGER, 8, &values, 2); + + meta_XFree (available); } static void @@ -192,6 +204,12 @@ meta_input_settings_x11_set_scroll_method (MetaInputSettings *setting GDesktopTouchpadScrollMethod mode) { guchar values[3] = { 0 }; /* 2fg, edge, button. The last value is unused */ + guchar *available; + + available = get_property (device, "libinput Scroll Methods Available", + XA_INTEGER, 8, 3); + if (!available) + return; switch (mode) { @@ -207,8 +225,14 @@ meta_input_settings_x11_set_scroll_method (MetaInputSettings *setting g_assert_not_reached (); } - change_property (device, "libinput Scroll Method Enabled", - XA_INTEGER, 8, &values, 3); + if ((values[0] && !available[0]) || (values[1] && !available[1])) + g_warning ("Device '%s' does not support scroll mode %d\n", + clutter_input_device_get_device_name (device), mode); + else + change_property (device, "libinput Scroll Method Enabled", + XA_INTEGER, 8, &values, 3); + + meta_XFree (available); } static void @@ -226,7 +250,12 @@ meta_input_settings_x11_set_click_method (MetaInputSettings *settings, GDesktopTouchpadClickMethod mode) { guchar values[2] = { 0 }; /* buttonareas, clickfinger */ - guchar *defaults; + guchar *defaults, *available; + + available = get_property (device, "libinput Click Methods Available", + XA_INTEGER, 8, 2); + if (!available) + return; switch (mode) { @@ -251,8 +280,14 @@ meta_input_settings_x11_set_click_method (MetaInputSettings *settings, return; } - change_property (device, "libinput Click Method Enabled", - XA_INTEGER, 8, &values, 2); + if ((values[0] && !available[0]) || (values[1] && !available[1])) + g_warning ("Device '%s' does not support click method %d\n", + clutter_input_device_get_device_name (device), mode); + else + change_property (device, "libinput Click Method Enabled", + XA_INTEGER, 8, &values, 2); + + meta_XFree(available); } static void