|
|
88c283 |
From 3f7ba6739773f43a3ad2a5d26cb8c3365f77cc00 Mon Sep 17 00:00:00 2001
|
|
|
776610 |
From: Rui Matos <tiagomatos@gmail.com>
|
|
|
776610 |
Date: Mon, 9 Oct 2017 18:39:52 +0200
|
|
|
776610 |
Subject: [PATCH 1/3] backends/x11: Add a synaptics check for two finger scroll
|
|
|
776610 |
availability
|
|
|
776610 |
|
|
|
776610 |
Commit "backends/x11: Support synaptics configuration" added support
|
|
|
776610 |
for synaptics two finger scrolling but didn't add the code to check
|
|
|
776610 |
that it is available resulting in the upper layer always assuming it
|
|
|
776610 |
isn't.
|
|
|
776610 |
---
|
|
|
776610 |
src/backends/x11/meta-input-settings-x11.c | 11 +++++++++++
|
|
|
776610 |
1 file changed, 11 insertions(+)
|
|
|
776610 |
|
|
|
776610 |
diff --git a/src/backends/x11/meta-input-settings-x11.c b/src/backends/x11/meta-input-settings-x11.c
|
|
|
88c283 |
index 051a1c605..887bc8b42 100644
|
|
|
776610 |
--- a/src/backends/x11/meta-input-settings-x11.c
|
|
|
776610 |
+++ b/src/backends/x11/meta-input-settings-x11.c
|
|
|
88c283 |
@@ -630,6 +630,17 @@ meta_input_settings_x11_has_two_finger_scroll (MetaInputSettings *settings,
|
|
|
776610 |
guchar *available = NULL;
|
|
|
776610 |
gboolean has_two_finger = TRUE;
|
|
|
776610 |
|
|
|
776610 |
+ if (is_device_synaptics (device))
|
|
|
776610 |
+ {
|
|
|
776610 |
+ available = get_property (device, "Synaptics Capabilities",
|
|
|
776610 |
+ XA_INTEGER, 8, 4);
|
|
|
776610 |
+ if (!available || !available[3])
|
|
|
776610 |
+ has_two_finger = FALSE;
|
|
|
776610 |
+
|
|
|
776610 |
+ meta_XFree (available);
|
|
|
776610 |
+ return has_two_finger;
|
|
|
776610 |
+ }
|
|
|
776610 |
+
|
|
|
776610 |
available = get_property (device, "libinput Scroll Methods Available",
|
|
|
776610 |
XA_INTEGER, 8, SCROLL_METHOD_NUM_FIELDS);
|
|
|
776610 |
if (!available || !available[SCROLL_METHOD_FIELD_2FG])
|
|
|
776610 |
--
|
|
|
88c283 |
2.21.0
|
|
|
776610 |
|
|
|
776610 |
|
|
|
88c283 |
From 717561b28f35e05d40fb941baba781436a0abf68 Mon Sep 17 00:00:00 2001
|
|
|
776610 |
From: Rui Matos <tiagomatos@gmail.com>
|
|
|
776610 |
Date: Mon, 9 Oct 2017 18:55:56 +0200
|
|
|
776610 |
Subject: [PATCH 2/3] backends/x11: Add disable while typing support for
|
|
|
776610 |
synaptics
|
|
|
776610 |
|
|
|
776610 |
This is basically a copy of the old g-s-d mouse plugin code to manage
|
|
|
776610 |
syndaemon when the synaptics driver is being used.
|
|
|
776610 |
---
|
|
|
776610 |
src/backends/x11/meta-input-settings-x11.c | 112 +++++++++++++++++++++
|
|
|
776610 |
1 file changed, 112 insertions(+)
|
|
|
776610 |
|
|
|
776610 |
diff --git a/src/backends/x11/meta-input-settings-x11.c b/src/backends/x11/meta-input-settings-x11.c
|
|
|
88c283 |
index 887bc8b42..12a592c75 100644
|
|
|
776610 |
--- a/src/backends/x11/meta-input-settings-x11.c
|
|
|
776610 |
+++ b/src/backends/x11/meta-input-settings-x11.c
|
|
|
776610 |
@@ -35,6 +35,9 @@
|
|
|
776610 |
#ifdef HAVE_LIBGUDEV
|
|
|
776610 |
#include <gudev/gudev.h>
|
|
|
776610 |
#endif
|
|
|
776610 |
+#ifdef __linux
|
|
|
776610 |
+#include <sys/prctl.h>
|
|
|
776610 |
+#endif
|
|
|
776610 |
|
|
|
776610 |
#include "backends/meta-logical-monitor.h"
|
|
|
88c283 |
#include "backends/x11/meta-backend-x11.h"
|
|
|
88c283 |
@@ -46,6 +49,8 @@ typedef struct _MetaInputSettingsX11Private
|
|
|
776610 |
#ifdef HAVE_LIBGUDEV
|
|
|
776610 |
GUdevClient *udev_client;
|
|
|
776610 |
#endif
|
|
|
776610 |
+ gboolean syndaemon_spawned;
|
|
|
776610 |
+ GPid syndaemon_pid;
|
|
|
776610 |
} MetaInputSettingsX11Private;
|
|
|
776610 |
|
|
|
776610 |
G_DEFINE_TYPE_WITH_PRIVATE (MetaInputSettingsX11, meta_input_settings_x11,
|
|
|
88c283 |
@@ -337,6 +342,107 @@ change_synaptics_speed (ClutterInputDevice *device,
|
|
|
776610 |
XCloseDevice (xdisplay, xdevice);
|
|
|
776610 |
}
|
|
|
776610 |
|
|
|
776610 |
+/* Ensure that syndaemon dies together with us, to avoid running several of
|
|
|
776610 |
+ * them */
|
|
|
776610 |
+static void
|
|
|
776610 |
+setup_syndaemon (gpointer user_data)
|
|
|
776610 |
+{
|
|
|
776610 |
+#ifdef __linux
|
|
|
776610 |
+ prctl (PR_SET_PDEATHSIG, SIGHUP);
|
|
|
776610 |
+#endif
|
|
|
776610 |
+}
|
|
|
776610 |
+
|
|
|
776610 |
+static gboolean
|
|
|
776610 |
+have_program_in_path (const char *name)
|
|
|
776610 |
+{
|
|
|
776610 |
+ gchar *path;
|
|
|
776610 |
+ gboolean result;
|
|
|
776610 |
+
|
|
|
776610 |
+ path = g_find_program_in_path (name);
|
|
|
776610 |
+ result = (path != NULL);
|
|
|
776610 |
+ g_free (path);
|
|
|
776610 |
+ return result;
|
|
|
776610 |
+}
|
|
|
776610 |
+
|
|
|
776610 |
+static void
|
|
|
776610 |
+syndaemon_died (GPid pid,
|
|
|
776610 |
+ gint status,
|
|
|
776610 |
+ gpointer user_data)
|
|
|
776610 |
+{
|
|
|
776610 |
+ MetaInputSettingsX11 *settings_x11 = META_INPUT_SETTINGS_X11 (user_data);
|
|
|
776610 |
+ MetaInputSettingsX11Private *priv =
|
|
|
776610 |
+ meta_input_settings_x11_get_instance_private (settings_x11);
|
|
|
776610 |
+ GError *error = NULL;
|
|
|
776610 |
+
|
|
|
776610 |
+ if (!g_spawn_check_exit_status (status, &error))
|
|
|
776610 |
+ {
|
|
|
776610 |
+ if ((WIFSIGNALED (status) && WTERMSIG (status) != SIGHUP) ||
|
|
|
776610 |
+ error->domain == G_SPAWN_EXIT_ERROR)
|
|
|
776610 |
+ g_warning ("Syndaemon exited unexpectedly: %s", error->message);
|
|
|
776610 |
+ g_error_free (error);
|
|
|
776610 |
+ }
|
|
|
776610 |
+
|
|
|
776610 |
+ g_spawn_close_pid (pid);
|
|
|
776610 |
+ priv->syndaemon_spawned = FALSE;
|
|
|
776610 |
+}
|
|
|
776610 |
+
|
|
|
776610 |
+static void
|
|
|
776610 |
+set_synaptics_disable_w_typing (MetaInputSettings *settings,
|
|
|
776610 |
+ gboolean state)
|
|
|
776610 |
+{
|
|
|
776610 |
+ MetaInputSettingsX11 *settings_x11 = META_INPUT_SETTINGS_X11 (settings);
|
|
|
776610 |
+ MetaInputSettingsX11Private *priv =
|
|
|
776610 |
+ meta_input_settings_x11_get_instance_private (settings_x11);
|
|
|
776610 |
+
|
|
|
776610 |
+ if (state)
|
|
|
776610 |
+ {
|
|
|
776610 |
+ GError *error = NULL;
|
|
|
776610 |
+ GPtrArray *args;
|
|
|
776610 |
+
|
|
|
776610 |
+ if (priv->syndaemon_spawned)
|
|
|
776610 |
+ return;
|
|
|
776610 |
+
|
|
|
776610 |
+ if (!have_program_in_path ("syndaemon"))
|
|
|
776610 |
+ return;
|
|
|
776610 |
+
|
|
|
776610 |
+ args = g_ptr_array_new ();
|
|
|
776610 |
+
|
|
|
88c283 |
+ g_ptr_array_add (args, (gpointer)"syndaemon");
|
|
|
88c283 |
+ g_ptr_array_add (args, (gpointer)"-i");
|
|
|
88c283 |
+ g_ptr_array_add (args, (gpointer)"1.0");
|
|
|
88c283 |
+ g_ptr_array_add (args, (gpointer)"-t");
|
|
|
88c283 |
+ g_ptr_array_add (args, (gpointer)"-K");
|
|
|
88c283 |
+ g_ptr_array_add (args, (gpointer)"-R");
|
|
|
776610 |
+ g_ptr_array_add (args, NULL);
|
|
|
776610 |
+
|
|
|
776610 |
+ /* we must use G_SPAWN_DO_NOT_REAP_CHILD to avoid
|
|
|
776610 |
+ * double-forking, otherwise syndaemon will immediately get
|
|
|
776610 |
+ * killed again through (PR_SET_PDEATHSIG when the intermediate
|
|
|
776610 |
+ * process dies */
|
|
|
776610 |
+ g_spawn_async (g_get_home_dir (), (char **) args->pdata, NULL,
|
|
|
776610 |
+ G_SPAWN_SEARCH_PATH|G_SPAWN_DO_NOT_REAP_CHILD, setup_syndaemon, NULL,
|
|
|
776610 |
+ &priv->syndaemon_pid, &error);
|
|
|
776610 |
+
|
|
|
776610 |
+ priv->syndaemon_spawned = (error == NULL);
|
|
|
776610 |
+ g_ptr_array_free (args, TRUE);
|
|
|
776610 |
+
|
|
|
776610 |
+ if (error)
|
|
|
776610 |
+ {
|
|
|
776610 |
+ g_warning ("Failed to launch syndaemon: %s", error->message);
|
|
|
776610 |
+ g_error_free (error);
|
|
|
776610 |
+ }
|
|
|
776610 |
+ else
|
|
|
776610 |
+ {
|
|
|
776610 |
+ g_child_watch_add (priv->syndaemon_pid, syndaemon_died, settings);
|
|
|
776610 |
+ }
|
|
|
776610 |
+ }
|
|
|
776610 |
+ else if (priv->syndaemon_spawned)
|
|
|
776610 |
+ {
|
|
|
776610 |
+ kill (priv->syndaemon_pid, SIGHUP);
|
|
|
776610 |
+ priv->syndaemon_spawned = FALSE;
|
|
|
776610 |
+ }
|
|
|
776610 |
+}
|
|
|
776610 |
+
|
|
|
776610 |
static void
|
|
|
776610 |
meta_input_settings_x11_set_send_events (MetaInputSettings *settings,
|
|
|
776610 |
ClutterInputDevice *device,
|
|
|
88c283 |
@@ -461,6 +567,12 @@ meta_input_settings_x11_set_disable_while_typing (MetaInputSettings *settings,
|
|
|
776610 |
{
|
|
|
776610 |
guchar value = (enabled) ? 1 : 0;
|
|
|
776610 |
|
|
|
776610 |
+ if (is_device_synaptics (device))
|
|
|
776610 |
+ {
|
|
|
776610 |
+ set_synaptics_disable_w_typing (settings, enabled);
|
|
|
776610 |
+ return;
|
|
|
776610 |
+ }
|
|
|
776610 |
+
|
|
|
776610 |
change_property (device, "libinput Disable While Typing Enabled",
|
|
|
776610 |
XA_INTEGER, 8, &value, 1);
|
|
|
776610 |
}
|
|
|
776610 |
--
|
|
|
88c283 |
2.21.0
|
|
|
776610 |
|
|
|
776610 |
|
|
|
88c283 |
From 0afa6d0940ca4f5ffafd24effd2c414963a44277 Mon Sep 17 00:00:00 2001
|
|
|
776610 |
From: Rui Matos <tiagomatos@gmail.com>
|
|
|
776610 |
Date: Tue, 10 Oct 2017 19:07:27 +0200
|
|
|
776610 |
Subject: [PATCH 3/3] backends/x11: Support plain old X device configuration
|
|
|
776610 |
|
|
|
776610 |
We re-use part of the code added to support synaptics and add a few
|
|
|
776610 |
bits specific for xorg-x11-drv-evdev devices.
|
|
|
776610 |
---
|
|
|
776610 |
src/backends/x11/meta-input-settings-x11.c | 97 +++++++++++++++++-----
|
|
|
776610 |
1 file changed, 74 insertions(+), 23 deletions(-)
|
|
|
776610 |
|
|
|
776610 |
diff --git a/src/backends/x11/meta-input-settings-x11.c b/src/backends/x11/meta-input-settings-x11.c
|
|
|
88c283 |
index 12a592c75..80e5ed10e 100644
|
|
|
776610 |
--- a/src/backends/x11/meta-input-settings-x11.c
|
|
|
776610 |
+++ b/src/backends/x11/meta-input-settings-x11.c
|
|
|
88c283 |
@@ -182,36 +182,36 @@ is_device_synaptics (ClutterInputDevice *device)
|
|
|
776610 |
return TRUE;
|
|
|
776610 |
}
|
|
|
776610 |
|
|
|
776610 |
+static gboolean
|
|
|
776610 |
+is_device_libinput (ClutterInputDevice *device)
|
|
|
776610 |
+{
|
|
|
776610 |
+ guchar *has_setting;
|
|
|
776610 |
+
|
|
|
776610 |
+ /* We just need looking for a synaptics-specific property */
|
|
|
776610 |
+ has_setting = get_property (device, "libinput Send Events Modes Available", XA_INTEGER, 8, 2);
|
|
|
776610 |
+ if (!has_setting)
|
|
|
776610 |
+ return FALSE;
|
|
|
776610 |
+
|
|
|
776610 |
+ meta_XFree (has_setting);
|
|
|
776610 |
+ return TRUE;
|
|
|
776610 |
+}
|
|
|
776610 |
+
|
|
|
776610 |
static void
|
|
|
776610 |
-change_synaptics_tap_left_handed (ClutterInputDevice *device,
|
|
|
776610 |
- gboolean tap_enabled,
|
|
|
776610 |
- gboolean left_handed)
|
|
|
776610 |
+change_x_device_left_handed (ClutterInputDevice *device,
|
|
|
776610 |
+ gboolean left_handed)
|
|
|
776610 |
{
|
|
|
776610 |
MetaDisplay *display = meta_get_display ();
|
|
|
88c283 |
MetaX11Display *x11_display = display ? display->x11_display : NULL;
|
|
|
776610 |
MetaBackend *backend = meta_get_backend ();
|
|
|
776610 |
Display *xdisplay = meta_backend_x11_get_xdisplay (META_BACKEND_X11 (backend));
|
|
|
776610 |
XDevice *xdevice;
|
|
|
776610 |
- guchar *tap_action, *buttons;
|
|
|
776610 |
+ guchar *buttons;
|
|
|
776610 |
guint buttons_capacity = 16, n_buttons;
|
|
|
776610 |
|
|
|
776610 |
xdevice = XOpenDevice(xdisplay, clutter_input_device_get_device_id (device));
|
|
|
776610 |
if (!xdevice)
|
|
|
776610 |
return;
|
|
|
776610 |
|
|
|
776610 |
- tap_action = get_property (device, "Synaptics Tap Action",
|
|
|
776610 |
- XA_INTEGER, 8, 7);
|
|
|
776610 |
- if (!tap_action)
|
|
|
776610 |
- goto out;
|
|
|
776610 |
-
|
|
|
776610 |
- tap_action[4] = tap_enabled ? (left_handed ? 3 : 1) : 0;
|
|
|
776610 |
- tap_action[5] = tap_enabled ? (left_handed ? 1 : 3) : 0;
|
|
|
776610 |
- tap_action[6] = tap_enabled ? 2 : 0;
|
|
|
776610 |
-
|
|
|
776610 |
- change_property (device, "Synaptics Tap Action",
|
|
|
776610 |
- XA_INTEGER, 8, tap_action, 7);
|
|
|
776610 |
- meta_XFree (tap_action);
|
|
|
776610 |
-
|
|
|
88c283 |
if (x11_display)
|
|
|
88c283 |
meta_x11_error_trap_push (x11_display);
|
|
|
776610 |
buttons = g_new (guchar, buttons_capacity);
|
|
|
88c283 |
@@ -235,17 +235,39 @@ change_synaptics_tap_left_handed (ClutterInputDevice *device,
|
|
|
776610 |
|
|
|
88c283 |
if (x11_display && meta_x11_error_trap_pop_with_return (x11_display))
|
|
|
776610 |
{
|
|
|
776610 |
- g_warning ("Could not set synaptics touchpad left-handed for %s",
|
|
|
776610 |
+ g_warning ("Could not set left-handed for %s",
|
|
|
776610 |
clutter_input_device_get_device_name (device));
|
|
|
776610 |
}
|
|
|
776610 |
|
|
|
776610 |
- out:
|
|
|
776610 |
XCloseDevice (xdisplay, xdevice);
|
|
|
776610 |
}
|
|
|
776610 |
|
|
|
776610 |
static void
|
|
|
776610 |
-change_synaptics_speed (ClutterInputDevice *device,
|
|
|
776610 |
- gdouble speed)
|
|
|
776610 |
+change_synaptics_tap_left_handed (ClutterInputDevice *device,
|
|
|
776610 |
+ gboolean tap_enabled,
|
|
|
776610 |
+ gboolean left_handed)
|
|
|
776610 |
+{
|
|
|
776610 |
+ guchar *tap_action;
|
|
|
776610 |
+
|
|
|
776610 |
+ tap_action = get_property (device, "Synaptics Tap Action",
|
|
|
776610 |
+ XA_INTEGER, 8, 7);
|
|
|
776610 |
+ if (!tap_action)
|
|
|
776610 |
+ return;
|
|
|
776610 |
+
|
|
|
776610 |
+ tap_action[4] = tap_enabled ? (left_handed ? 3 : 1) : 0;
|
|
|
776610 |
+ tap_action[5] = tap_enabled ? (left_handed ? 1 : 3) : 0;
|
|
|
776610 |
+ tap_action[6] = tap_enabled ? 2 : 0;
|
|
|
776610 |
+
|
|
|
776610 |
+ change_property (device, "Synaptics Tap Action",
|
|
|
776610 |
+ XA_INTEGER, 8, tap_action, 7);
|
|
|
776610 |
+ meta_XFree (tap_action);
|
|
|
776610 |
+
|
|
|
776610 |
+ change_x_device_left_handed (device, left_handed);
|
|
|
776610 |
+}
|
|
|
776610 |
+
|
|
|
776610 |
+static void
|
|
|
776610 |
+change_x_device_speed (ClutterInputDevice *device,
|
|
|
776610 |
+ gdouble speed)
|
|
|
776610 |
{
|
|
|
776610 |
MetaDisplay *display = meta_get_display ();
|
|
|
88c283 |
MetaX11Display *x11_display = display ? display->x11_display : NULL;
|
|
|
88c283 |
@@ -342,6 +364,23 @@ change_synaptics_speed (ClutterInputDevice *device,
|
|
|
776610 |
XCloseDevice (xdisplay, xdevice);
|
|
|
776610 |
}
|
|
|
776610 |
|
|
|
776610 |
+static void
|
|
|
776610 |
+change_x_device_scroll_button (ClutterInputDevice *device,
|
|
|
776610 |
+ guint button)
|
|
|
776610 |
+{
|
|
|
776610 |
+ guchar value;
|
|
|
776610 |
+
|
|
|
776610 |
+ value = button > 0 ? 1 : 0;
|
|
|
776610 |
+ change_property (device, "Evdev Wheel Emulation",
|
|
|
776610 |
+ XA_INTEGER, 8, &value, 1);
|
|
|
776610 |
+ if (button > 0)
|
|
|
776610 |
+ {
|
|
|
776610 |
+ value = button;
|
|
|
776610 |
+ change_property (device, "Evdev Wheel Emulation Button",
|
|
|
776610 |
+ XA_INTEGER, 8, &value, 1);
|
|
|
776610 |
+ }
|
|
|
776610 |
+}
|
|
|
776610 |
+
|
|
|
776610 |
/* Ensure that syndaemon dies together with us, to avoid running several of
|
|
|
776610 |
* them */
|
|
|
776610 |
static void
|
|
|
88c283 |
@@ -510,9 +549,10 @@ meta_input_settings_x11_set_speed (MetaInputSettings *settings,
|
|
|
776610 |
Display *xdisplay = meta_backend_x11_get_xdisplay (META_BACKEND_X11 (backend));
|
|
|
776610 |
gfloat value = speed;
|
|
|
776610 |
|
|
|
776610 |
- if (is_device_synaptics (device))
|
|
|
776610 |
+ if (is_device_synaptics (device) ||
|
|
|
776610 |
+ !is_device_libinput (device))
|
|
|
776610 |
{
|
|
|
776610 |
- change_synaptics_speed (device, speed);
|
|
|
776610 |
+ change_x_device_speed (device, speed);
|
|
|
776610 |
return;
|
|
|
776610 |
}
|
|
|
776610 |
|
|
|
88c283 |
@@ -554,6 +594,11 @@ meta_input_settings_x11_set_left_handed (MetaInputSettings *settings,
|
|
|
776610 |
g_object_unref (settings);
|
|
|
776610 |
return;
|
|
|
776610 |
}
|
|
|
88c283 |
+ else if (!is_device_libinput (device) && device_type != CLUTTER_PAD_DEVICE)
|
|
|
776610 |
+ {
|
|
|
776610 |
+ change_x_device_left_handed (device, enabled);
|
|
|
776610 |
+ return;
|
|
|
776610 |
+ }
|
|
|
776610 |
|
|
|
776610 |
change_property (device, "libinput Left Handed Enabled",
|
|
|
776610 |
XA_INTEGER, 8, &value, 1);
|
|
|
88c283 |
@@ -767,6 +812,12 @@ meta_input_settings_x11_set_scroll_button (MetaInputSettings *settings,
|
|
|
776610 |
ClutterInputDevice *device,
|
|
|
776610 |
guint button)
|
|
|
776610 |
{
|
|
|
776610 |
+ if (!is_device_libinput (device))
|
|
|
776610 |
+ {
|
|
|
776610 |
+ change_x_device_scroll_button (device, button);
|
|
|
776610 |
+ return;
|
|
|
776610 |
+ }
|
|
|
776610 |
+
|
|
|
776610 |
change_property (device, "libinput Button Scrolling Button",
|
|
|
776610 |
XA_INTEGER, 32, &button, 1);
|
|
|
776610 |
}
|
|
|
776610 |
--
|
|
|
88c283 |
2.21.0
|
|
|
776610 |
|