[mutter] Add tap-button-map and tap-and-drag-lock support to X11 and Wayland
- From: Carlos Garnacho <carlosg src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [mutter] Add tap-button-map and tap-and-drag-lock support to X11 and Wayland
- Date: Fri, 10 Jul 2020 13:40:15 +0000 (UTC)
commit 775ec67a44bd938a9472a9a16f386bd3424c69a4
Author: Giusy Margarita <kurmikon libero it>
Date: Tue Jun 16 16:53:48 2020 +0200
Add tap-button-map and tap-and-drag-lock support to X11 and Wayland
https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1319
src/backends/meta-input-settings-private.h | 6 +++
src/backends/meta-input-settings.c | 67 ++++++++++++++++++++++++
src/backends/native/meta-input-settings-native.c | 64 ++++++++++++++++++++++
src/backends/x11/meta-input-settings-x11.c | 48 +++++++++++++++++
4 files changed, 185 insertions(+)
---
diff --git a/src/backends/meta-input-settings-private.h b/src/backends/meta-input-settings-private.h
index f890208842..1a7b258ece 100644
--- a/src/backends/meta-input-settings-private.h
+++ b/src/backends/meta-input-settings-private.h
@@ -55,9 +55,15 @@ struct _MetaInputSettingsClass
void (* set_tap_enabled) (MetaInputSettings *settings,
ClutterInputDevice *device,
gboolean enabled);
+ void (* set_tap_button_map) (MetaInputSettings *settings,
+ ClutterInputDevice *device,
+ GDesktopTouchpadTapButtonMap mode);
void (* set_tap_and_drag_enabled) (MetaInputSettings *settings,
ClutterInputDevice *device,
gboolean enabled);
+ void (* set_tap_and_drag_lock_enabled) (MetaInputSettings *settings,
+ ClutterInputDevice *device,
+ gboolean enabled);
void (* set_disable_while_typing) (MetaInputSettings *settings,
ClutterInputDevice *device,
gboolean enabled);
diff --git a/src/backends/meta-input-settings.c b/src/backends/meta-input-settings.c
index 5b2cee29fb..eb8a93fc4d 100644
--- a/src/backends/meta-input-settings.c
+++ b/src/backends/meta-input-settings.c
@@ -620,6 +620,36 @@ update_touchpad_tap_enabled (MetaInputSettings *input_settings,
}
}
+static void
+update_touchpad_tap_button_map (MetaInputSettings *input_settings,
+ ClutterInputDevice *device)
+{
+ MetaInputSettingsClass *input_settings_class;
+ GDesktopTouchpadTapButtonMap method;
+ MetaInputSettingsPrivate *priv;
+
+ if (device &&
+ clutter_input_device_get_device_type (device) != CLUTTER_TOUCHPAD_DEVICE)
+ return;
+
+ priv = meta_input_settings_get_instance_private (input_settings);
+ input_settings_class = META_INPUT_SETTINGS_GET_CLASS (input_settings);
+ method = g_settings_get_enum (priv->touchpad_settings, "tap-button-map");
+
+ if (device)
+ {
+ settings_device_set_uint_setting (input_settings, device,
+ input_settings_class->set_tap_button_map,
+ method);
+ }
+ else
+ {
+ settings_set_uint_setting (input_settings, CLUTTER_TOUCHPAD_DEVICE,
+ (ConfigUintFunc) input_settings_class->set_tap_button_map,
+ method);
+ }
+}
+
static void
update_touchpad_tap_and_drag_enabled (MetaInputSettings *input_settings,
ClutterInputDevice *device)
@@ -652,6 +682,37 @@ update_touchpad_tap_and_drag_enabled (MetaInputSettings *input_settings,
}
}
+static void
+update_touchpad_tap_and_drag_lock_enabled (MetaInputSettings *input_settings,
+ ClutterInputDevice *device)
+{
+ MetaInputSettingsClass *input_settings_class;
+ MetaInputSettingsPrivate *priv;
+ gboolean enabled;
+
+ if (device &&
+ clutter_input_device_get_device_type (device) != CLUTTER_TOUCHPAD_DEVICE)
+ return;
+
+ priv = meta_input_settings_get_instance_private (input_settings);
+ input_settings_class = META_INPUT_SETTINGS_GET_CLASS (input_settings);
+ enabled = g_settings_get_boolean (priv->touchpad_settings, "tap-and-drag-lock");
+
+ if (device)
+ {
+ settings_device_set_bool_setting (input_settings, device,
+ input_settings_class->set_tap_and_drag_lock_enabled,
+ enabled);
+ }
+ else
+ {
+ settings_set_bool_setting (input_settings, CLUTTER_TOUCHPAD_DEVICE,
+ NULL,
+ input_settings_class->set_tap_and_drag_lock_enabled,
+ enabled);
+ }
+}
+
static void
update_touchpad_edge_scroll (MetaInputSettings *input_settings,
ClutterInputDevice *device)
@@ -1198,8 +1259,12 @@ meta_input_settings_changed_cb (GSettings *settings,
update_device_natural_scroll (input_settings, NULL);
else if (strcmp (key, "tap-to-click") == 0)
update_touchpad_tap_enabled (input_settings, NULL);
+ else if (strcmp (key, "tap-button-map") == 0)
+ update_touchpad_tap_button_map (input_settings, NULL);
else if (strcmp (key, "tap-and-drag") == 0)
update_touchpad_tap_and_drag_enabled (input_settings, NULL);
+ else if (strcmp (key, "tap-and-drag-lock") == 0)
+ update_touchpad_tap_and_drag_lock_enabled (input_settings, NULL);
else if (strcmp(key, "disable-while-typing") == 0)
update_touchpad_disable_while_typing (input_settings, NULL);
else if (strcmp (key, "send-events") == 0)
@@ -1700,7 +1765,9 @@ apply_device_settings (MetaInputSettings *input_settings,
update_touchpad_left_handed (input_settings, device);
update_touchpad_tap_enabled (input_settings, device);
+ update_touchpad_tap_button_map (input_settings, device);
update_touchpad_tap_and_drag_enabled (input_settings, device);
+ update_touchpad_tap_and_drag_lock_enabled (input_settings, device);
update_touchpad_disable_while_typing (input_settings, device);
update_touchpad_send_events (input_settings, device);
update_touchpad_two_finger_scroll (input_settings, device);
diff --git a/src/backends/native/meta-input-settings-native.c
b/src/backends/native/meta-input-settings-native.c
index fe82e8d1f9..abf07510aa 100644
--- a/src/backends/native/meta-input-settings-native.c
+++ b/src/backends/native/meta-input-settings-native.c
@@ -140,6 +140,24 @@ meta_input_settings_native_set_tap_and_drag_enabled (MetaInputSettings *setting
LIBINPUT_CONFIG_DRAG_DISABLED);
}
+static void
+meta_input_settings_native_set_tap_and_drag_lock_enabled (MetaInputSettings *settings,
+ ClutterInputDevice *device,
+ gboolean enabled)
+{
+ struct libinput_device *libinput_device;
+
+ libinput_device = meta_input_device_native_get_libinput_device (device);
+ if (!libinput_device)
+ return;
+
+ if (libinput_device_config_tap_get_finger_count (libinput_device) > 0)
+ libinput_device_config_tap_set_drag_lock_enabled (libinput_device,
+ enabled ?
+ LIBINPUT_CONFIG_DRAG_LOCK_ENABLED :
+ LIBINPUT_CONFIG_DRAG_LOCK_DISABLED);
+}
+
static void
meta_input_settings_native_set_disable_while_typing (MetaInputSettings *settings,
ClutterInputDevice *device,
@@ -193,6 +211,15 @@ device_set_click_method (struct libinput_device *libinput_device,
return status == LIBINPUT_CONFIG_STATUS_SUCCESS;
}
+static gboolean
+device_set_tap_button_map (struct libinput_device *libinput_device,
+ enum libinput_config_tap_button_map map)
+{
+ enum libinput_config_status status =
+ libinput_device_config_tap_set_button_map (libinput_device, map);
+ return status == LIBINPUT_CONFIG_STATUS_SUCCESS;
+}
+
static void
meta_input_settings_native_set_edge_scroll (MetaInputSettings *settings,
ClutterInputDevice *device,
@@ -309,6 +336,40 @@ meta_input_settings_native_set_click_method (MetaInputSettings *settin
device_set_click_method (libinput_device, click_method);
}
+static void
+meta_input_settings_native_set_tap_button_map (MetaInputSettings *settings,
+ ClutterInputDevice *device,
+ GDesktopTouchpadTapButtonMap mode)
+{
+ enum libinput_config_tap_button_map button_map = 0;
+ struct libinput_device *libinput_device;
+
+ libinput_device = meta_input_device_native_get_libinput_device (device);
+ if (!libinput_device)
+ return;
+
+ if (libinput_device_config_tap_get_finger_count (libinput_device) == 0)
+ return;
+
+ switch (mode)
+ {
+ case G_DESKTOP_TOUCHPAD_BUTTON_TAP_MAP_DEFAULT:
+ button_map = libinput_device_config_tap_get_default_button_map (libinput_device);
+ break;
+ case G_DESKTOP_TOUCHPAD_BUTTON_TAP_MAP_LRM:
+ button_map = LIBINPUT_CONFIG_TAP_MAP_LRM;
+ break;
+ case G_DESKTOP_TOUCHPAD_BUTTON_TAP_MAP_LMR:
+ button_map = LIBINPUT_CONFIG_TAP_MAP_LMR;
+ break;
+ default:
+ g_assert_not_reached ();
+ return;
+ }
+
+ device_set_tap_button_map (libinput_device, button_map);
+}
+
static void
meta_input_settings_native_set_keyboard_repeat (MetaInputSettings *settings,
gboolean enabled,
@@ -633,7 +694,10 @@ meta_input_settings_native_class_init (MetaInputSettingsNativeClass *klass)
input_settings_class->set_speed = meta_input_settings_native_set_speed;
input_settings_class->set_left_handed = meta_input_settings_native_set_left_handed;
input_settings_class->set_tap_enabled = meta_input_settings_native_set_tap_enabled;
+ input_settings_class->set_tap_button_map = meta_input_settings_native_set_tap_button_map;
input_settings_class->set_tap_and_drag_enabled = meta_input_settings_native_set_tap_and_drag_enabled;
+ input_settings_class->set_tap_and_drag_lock_enabled =
+ meta_input_settings_native_set_tap_and_drag_lock_enabled;
input_settings_class->set_invert_scroll = meta_input_settings_native_set_invert_scroll;
input_settings_class->set_edge_scroll = meta_input_settings_native_set_edge_scroll;
input_settings_class->set_two_finger_scroll = meta_input_settings_native_set_two_finger_scroll;
diff --git a/src/backends/x11/meta-input-settings-x11.c b/src/backends/x11/meta-input-settings-x11.c
index 40067770f8..d563f27c4c 100644
--- a/src/backends/x11/meta-input-settings-x11.c
+++ b/src/backends/x11/meta-input-settings-x11.c
@@ -289,6 +289,17 @@ meta_input_settings_x11_set_tap_and_drag_enabled (MetaInputSettings *settings,
XA_INTEGER, 8, &value, 1);
}
+static void
+meta_input_settings_x11_set_tap_and_drag_lock_enabled (MetaInputSettings *settings,
+ ClutterInputDevice *device,
+ gboolean enabled)
+{
+ guchar value = (enabled) ? 1 : 0;
+
+ change_property (device, "libinput Tapping Drag Lock Enabled",
+ XA_INTEGER, 8, &value, 1);
+}
+
static void
meta_input_settings_x11_set_invert_scroll (MetaInputSettings *settings,
ClutterInputDevice *device,
@@ -429,6 +440,40 @@ meta_input_settings_x11_set_click_method (MetaInputSettings *settings,
meta_XFree(available);
}
+static void
+meta_input_settings_x11_set_tap_button_map (MetaInputSettings *settings,
+ ClutterInputDevice *device,
+ GDesktopTouchpadTapButtonMap mode)
+{
+ guchar values[2] = { 0 }; /* lrm, lmr */
+ guchar *defaults;
+
+ switch (mode)
+ {
+ case G_DESKTOP_TOUCHPAD_BUTTON_TAP_MAP_DEFAULT:
+ defaults = get_property (device, "libinput Tapping Button Mapping Default",
+ XA_INTEGER, 8, 2);
+ if (!defaults)
+ break;
+ memcpy (values, defaults, 2);
+ meta_XFree (defaults);
+ break;
+ case G_DESKTOP_TOUCHPAD_BUTTON_TAP_MAP_LRM:
+ values[0] = 1;
+ break;
+ case G_DESKTOP_TOUCHPAD_BUTTON_TAP_MAP_LMR:
+ values[1] = 1;
+ break;
+ default:
+ g_assert_not_reached ();
+ return;
+ }
+
+ if (values[0] || values[1])
+ change_property (device, "libinput Tapping Button Mapping Enabled",
+ XA_INTEGER, 8, &values, 2);
+}
+
static void
meta_input_settings_x11_set_keyboard_repeat (MetaInputSettings *settings,
gboolean enabled,
@@ -894,7 +939,10 @@ meta_input_settings_x11_class_init (MetaInputSettingsX11Class *klass)
input_settings_class->set_speed = meta_input_settings_x11_set_speed;
input_settings_class->set_left_handed = meta_input_settings_x11_set_left_handed;
input_settings_class->set_tap_enabled = meta_input_settings_x11_set_tap_enabled;
+ input_settings_class->set_tap_button_map = meta_input_settings_x11_set_tap_button_map;
input_settings_class->set_tap_and_drag_enabled = meta_input_settings_x11_set_tap_and_drag_enabled;
+ input_settings_class->set_tap_and_drag_lock_enabled =
+ meta_input_settings_x11_set_tap_and_drag_lock_enabled;
input_settings_class->set_disable_while_typing = meta_input_settings_x11_set_disable_while_typing;
input_settings_class->set_invert_scroll = meta_input_settings_x11_set_invert_scroll;
input_settings_class->set_edge_scroll = meta_input_settings_x11_set_edge_scroll;
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]