mirror of
https://github.com/brl/mutter.git
synced 2024-11-27 18:40:40 -05:00
backends/x11: Add disable while typing support for synaptics
This is basically a copy of the old g-s-d mouse plugin code to manage syndaemon when the synaptics driver is being used.
This commit is contained in:
parent
325d3ebb2a
commit
b0067b45b9
@ -35,6 +35,9 @@
|
|||||||
#ifdef HAVE_LIBGUDEV
|
#ifdef HAVE_LIBGUDEV
|
||||||
#include <gudev/gudev.h>
|
#include <gudev/gudev.h>
|
||||||
#endif
|
#endif
|
||||||
|
#ifdef __linux
|
||||||
|
#include <sys/prctl.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
#include <meta/errors.h>
|
#include <meta/errors.h>
|
||||||
#include "backends/meta-logical-monitor.h"
|
#include "backends/meta-logical-monitor.h"
|
||||||
@ -44,6 +47,8 @@ typedef struct _MetaInputSettingsX11Private
|
|||||||
#ifdef HAVE_LIBGUDEV
|
#ifdef HAVE_LIBGUDEV
|
||||||
GUdevClient *udev_client;
|
GUdevClient *udev_client;
|
||||||
#endif
|
#endif
|
||||||
|
gboolean syndaemon_spawned;
|
||||||
|
GPid syndaemon_pid;
|
||||||
} MetaInputSettingsX11Private;
|
} MetaInputSettingsX11Private;
|
||||||
|
|
||||||
G_DEFINE_TYPE_WITH_PRIVATE (MetaInputSettingsX11, meta_input_settings_x11,
|
G_DEFINE_TYPE_WITH_PRIVATE (MetaInputSettingsX11, meta_input_settings_x11,
|
||||||
@ -332,6 +337,107 @@ change_synaptics_speed (ClutterInputDevice *device,
|
|||||||
XCloseDevice (xdisplay, xdevice);
|
XCloseDevice (xdisplay, xdevice);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Ensure that syndaemon dies together with us, to avoid running several of
|
||||||
|
* them */
|
||||||
|
static void
|
||||||
|
setup_syndaemon (gpointer user_data)
|
||||||
|
{
|
||||||
|
#ifdef __linux
|
||||||
|
prctl (PR_SET_PDEATHSIG, SIGHUP);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
static gboolean
|
||||||
|
have_program_in_path (const char *name)
|
||||||
|
{
|
||||||
|
gchar *path;
|
||||||
|
gboolean result;
|
||||||
|
|
||||||
|
path = g_find_program_in_path (name);
|
||||||
|
result = (path != NULL);
|
||||||
|
g_free (path);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
syndaemon_died (GPid pid,
|
||||||
|
gint status,
|
||||||
|
gpointer user_data)
|
||||||
|
{
|
||||||
|
MetaInputSettingsX11 *settings_x11 = META_INPUT_SETTINGS_X11 (user_data);
|
||||||
|
MetaInputSettingsX11Private *priv =
|
||||||
|
meta_input_settings_x11_get_instance_private (settings_x11);
|
||||||
|
GError *error = NULL;
|
||||||
|
|
||||||
|
if (!g_spawn_check_exit_status (status, &error))
|
||||||
|
{
|
||||||
|
if ((WIFSIGNALED (status) && WTERMSIG (status) != SIGHUP) ||
|
||||||
|
error->domain == G_SPAWN_EXIT_ERROR)
|
||||||
|
g_warning ("Syndaemon exited unexpectedly: %s", error->message);
|
||||||
|
g_error_free (error);
|
||||||
|
}
|
||||||
|
|
||||||
|
g_spawn_close_pid (pid);
|
||||||
|
priv->syndaemon_spawned = FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
set_synaptics_disable_w_typing (MetaInputSettings *settings,
|
||||||
|
gboolean state)
|
||||||
|
{
|
||||||
|
MetaInputSettingsX11 *settings_x11 = META_INPUT_SETTINGS_X11 (settings);
|
||||||
|
MetaInputSettingsX11Private *priv =
|
||||||
|
meta_input_settings_x11_get_instance_private (settings_x11);
|
||||||
|
|
||||||
|
if (state)
|
||||||
|
{
|
||||||
|
GError *error = NULL;
|
||||||
|
GPtrArray *args;
|
||||||
|
|
||||||
|
if (priv->syndaemon_spawned)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (!have_program_in_path ("syndaemon"))
|
||||||
|
return;
|
||||||
|
|
||||||
|
args = g_ptr_array_new ();
|
||||||
|
|
||||||
|
g_ptr_array_add (args, "syndaemon");
|
||||||
|
g_ptr_array_add (args, "-i");
|
||||||
|
g_ptr_array_add (args, "1.0");
|
||||||
|
g_ptr_array_add (args, "-t");
|
||||||
|
g_ptr_array_add (args, "-K");
|
||||||
|
g_ptr_array_add (args, "-R");
|
||||||
|
g_ptr_array_add (args, NULL);
|
||||||
|
|
||||||
|
/* we must use G_SPAWN_DO_NOT_REAP_CHILD to avoid
|
||||||
|
* double-forking, otherwise syndaemon will immediately get
|
||||||
|
* killed again through (PR_SET_PDEATHSIG when the intermediate
|
||||||
|
* process dies */
|
||||||
|
g_spawn_async (g_get_home_dir (), (char **) args->pdata, NULL,
|
||||||
|
G_SPAWN_SEARCH_PATH|G_SPAWN_DO_NOT_REAP_CHILD, setup_syndaemon, NULL,
|
||||||
|
&priv->syndaemon_pid, &error);
|
||||||
|
|
||||||
|
priv->syndaemon_spawned = (error == NULL);
|
||||||
|
g_ptr_array_free (args, TRUE);
|
||||||
|
|
||||||
|
if (error)
|
||||||
|
{
|
||||||
|
g_warning ("Failed to launch syndaemon: %s", error->message);
|
||||||
|
g_error_free (error);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
g_child_watch_add (priv->syndaemon_pid, syndaemon_died, settings);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (priv->syndaemon_spawned)
|
||||||
|
{
|
||||||
|
kill (priv->syndaemon_pid, SIGHUP);
|
||||||
|
priv->syndaemon_spawned = FALSE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
meta_input_settings_x11_set_send_events (MetaInputSettings *settings,
|
meta_input_settings_x11_set_send_events (MetaInputSettings *settings,
|
||||||
ClutterInputDevice *device,
|
ClutterInputDevice *device,
|
||||||
@ -456,6 +562,12 @@ meta_input_settings_x11_set_disable_while_typing (MetaInputSettings *settings,
|
|||||||
{
|
{
|
||||||
guchar value = (enabled) ? 1 : 0;
|
guchar value = (enabled) ? 1 : 0;
|
||||||
|
|
||||||
|
if (is_device_synaptics (device))
|
||||||
|
{
|
||||||
|
set_synaptics_disable_w_typing (settings, enabled);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
change_property (device, "libinput Disable While Typing Enabled",
|
change_property (device, "libinput Disable While Typing Enabled",
|
||||||
XA_INTEGER, 8, &value, 1);
|
XA_INTEGER, 8, &value, 1);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user