[mutter] backends/x11: Implement X11-specific MetaInputSettings
- From: Jasper St. Pierre <jstpierre src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [mutter] backends/x11: Implement X11-specific MetaInputSettings
- Date: Sun, 18 Jan 2015 21:33:15 +0000 (UTC)
commit 3c06f2dc90986744b9b49ef2c4f511e3e2c6ae85
Author: Carlos Garnacho <carlosg gnome org>
Date: Wed Oct 29 15:37:29 2014 +0100
backends/x11: Implement X11-specific MetaInputSettings
This goes through modifying XI2 device properties, either common ones (eg.
set on every device) or those specific to the libinput X11 driver. Keyboard
repeat/rate are set through core and XKB APIs.
https://bugzilla.gnome.org/show_bug.cgi?id=739397
src/Makefile.am | 2 +
src/backends/meta-input-settings.c | 4 +
src/backends/x11/meta-input-settings-x11.c | 226 ++++++++++++++++++++++++++++
src/backends/x11/meta-input-settings-x11.h | 49 ++++++
4 files changed, 281 insertions(+), 0 deletions(-)
---
diff --git a/src/Makefile.am b/src/Makefile.am
index 05154dc..d402aa5 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -95,6 +95,8 @@ libmutter_la_SOURCES = \
backends/x11/meta-cursor-renderer-x11.h \
backends/x11/meta-idle-monitor-xsync.c \
backends/x11/meta-idle-monitor-xsync.h \
+ backends/x11/meta-input-settings-x11.c \
+ backends/x11/meta-input-settings-x11.h \
backends/x11/meta-monitor-manager-xrandr.c \
backends/x11/meta-monitor-manager-xrandr.h \
core/meta-accel-parse.c \
diff --git a/src/backends/meta-input-settings.c b/src/backends/meta-input-settings.c
index 761f9c4..0c99562 100644
--- a/src/backends/meta-input-settings.c
+++ b/src/backends/meta-input-settings.c
@@ -31,6 +31,7 @@
#include "meta-backend-private.h"
#include "meta-input-settings-private.h"
+#include "x11/meta-input-settings-x11.h"
#include <meta/util.h>
@@ -603,5 +604,8 @@ meta_input_settings_init (MetaInputSettings *settings)
MetaInputSettings *
meta_input_settings_create (void)
{
+ if (!meta_is_wayland_compositor ())
+ return g_object_new (META_TYPE_INPUT_SETTINGS_X11, NULL);
+
return NULL;
}
diff --git a/src/backends/x11/meta-input-settings-x11.c b/src/backends/x11/meta-input-settings-x11.c
new file mode 100644
index 0000000..4437aed
--- /dev/null
+++ b/src/backends/x11/meta-input-settings-x11.c
@@ -0,0 +1,226 @@
+/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
+
+/*
+ * Copyright (C) 2014 Red Hat
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+ * 02111-1307, USA.
+ *
+ * Author: Carlos Garnacho <carlosg gnome org>
+ */
+
+#include "config.h"
+
+#include "meta-backend-x11.h"
+#include "meta-input-settings-x11.h"
+
+#include <gdk/gdkx.h>
+#include <X11/Xatom.h>
+#include <X11/extensions/XInput2.h>
+#include <X11/XKBlib.h>
+
+#include <meta/errors.h>
+
+G_DEFINE_TYPE (MetaInputSettingsX11, meta_input_settings_x11, META_TYPE_INPUT_SETTINGS)
+
+static void
+change_property (ClutterInputDevice *device,
+ const gchar *property,
+ Atom type,
+ int format,
+ void *data,
+ gulong nitems)
+{
+ MetaBackend *backend = meta_get_backend ();
+ Display *xdisplay = meta_backend_x11_get_xdisplay (META_BACKEND_X11 (backend));
+ gulong nitems_ret, bytes_after_ret;
+ int rc, device_id, format_ret;
+ Atom property_atom, type_ret;
+ guchar *data_ret;
+
+ property_atom = XInternAtom (xdisplay, property, False);
+ device_id = clutter_input_device_get_device_id (device);
+
+ rc = XIGetProperty (xdisplay, device_id, property_atom,
+ 0, 0, False, type, &type_ret, &format_ret,
+ &nitems_ret, &bytes_after_ret, &data_ret);
+
+ meta_XFree (data_ret);
+
+ if (rc == Success && type_ret == type && format_ret == format)
+ XIChangeProperty (xdisplay, device_id, property_atom, type,
+ format, XIPropModeReplace, data, nitems);
+}
+
+static void
+meta_input_settings_x11_set_send_events (MetaInputSettings *settings,
+ ClutterInputDevice *device,
+ GDesktopDeviceSendEvents mode)
+{
+ guchar values[2] = { 0 }; /* disabled, disabled-on-external-mouse */
+
+ switch (mode)
+ {
+ case G_DESKTOP_DEVICE_SEND_EVENTS_DISABLED:
+ values[0] = 1;
+ break;
+ case G_DESKTOP_DEVICE_SEND_EVENTS_DISABLED_ON_EXTERNAL_MOUSE:
+ values[1] = 1;
+ break;
+ default:
+ break;
+ }
+
+ change_property (device, "libinput Send Events Mode Enabled",
+ XA_INTEGER, 8, &values, 2);
+}
+
+static void
+meta_input_settings_x11_set_matrix (MetaInputSettings *settings,
+ ClutterInputDevice *device,
+ gfloat matrix[6])
+{
+ MetaBackend *backend = meta_get_backend ();
+ Display *xdisplay = meta_backend_x11_get_xdisplay (META_BACKEND_X11 (backend));
+ gfloat full_matrix[9] = { matrix[0], matrix[1], matrix[2],
+ matrix[3], matrix[4], matrix[5],
+ 0, 0, 1 };
+
+ change_property (device, "Coordinate Transformation Matrix",
+ XInternAtom (xdisplay, "FLOAT", False),
+ 32, &full_matrix, 9);
+}
+
+static void
+meta_input_settings_x11_set_speed (MetaInputSettings *settings,
+ ClutterInputDevice *device,
+ gdouble speed)
+{
+ MetaBackend *backend = meta_get_backend ();
+ Display *xdisplay = meta_backend_x11_get_xdisplay (META_BACKEND_X11 (backend));
+ gfloat value = speed;
+
+ change_property (device, "libinput Accel Speed",
+ XInternAtom (xdisplay, "FLOAT", False),
+ 32, &value, 1);
+}
+
+static void
+meta_input_settings_x11_set_left_handed (MetaInputSettings *settings,
+ ClutterInputDevice *device,
+ gboolean enabled)
+{
+ guchar value = (enabled) ? 1 : 0;
+
+ change_property (device, "libinput Left Handed Enabled",
+ XA_INTEGER, 8, &value, 1);
+}
+
+static void
+meta_input_settings_x11_set_tap_enabled (MetaInputSettings *settings,
+ ClutterInputDevice *device,
+ gboolean enabled)
+{
+ guchar value = (enabled) ? 1 : 0;
+
+ change_property (device, "libinput Tapping Enabled",
+ XA_INTEGER, 8, &value, 1);
+}
+
+static void
+meta_input_settings_x11_set_invert_scroll (MetaInputSettings *settings,
+ ClutterInputDevice *device,
+ gboolean inverted)
+{
+ guchar value = (inverted) ? 1 : 0;
+
+ change_property (device, "libinput Natural Scrolling Enabled",
+ XA_INTEGER, 8, &value, 1);
+}
+
+static void
+meta_input_settings_x11_set_scroll_method (MetaInputSettings *settings,
+ ClutterInputDevice *device,
+ GDesktopTouchpadScrollMethod mode)
+{
+ guchar values[3] = { 0 }; /* 2fg, edge, button. The last value is unused */
+
+ switch (mode)
+ {
+ case G_DESKTOP_TOUCHPAD_SCROLL_METHOD_DISABLED:
+ break;
+ case G_DESKTOP_TOUCHPAD_SCROLL_METHOD_EDGE_SCROLLING:
+ values[1] = 1;
+ break;
+ case G_DESKTOP_TOUCHPAD_SCROLL_METHOD_TWO_FINGER_SCROLLING:
+ values[0] = 1;
+ break;
+ default:
+ g_assert_not_reached ();
+ }
+
+ change_property (device, "libinput Scroll Method Enabled",
+ XA_INTEGER, 8, &values, 3);
+}
+
+static void
+meta_input_settings_x11_set_scroll_button (MetaInputSettings *settings,
+ ClutterInputDevice *device,
+ guint button)
+{
+ change_property (device, "libinput Scroll Method Enabled",
+ XA_INTEGER, 32, &button, 1);
+}
+
+static void
+meta_input_settings_x11_set_keyboard_repeat (MetaInputSettings *settings,
+ gboolean enabled,
+ guint delay,
+ guint interval)
+{
+ MetaBackend *backend = meta_get_backend ();
+ Display *xdisplay = meta_backend_x11_get_xdisplay (META_BACKEND_X11 (backend));
+
+ if (enabled)
+ {
+ XAutoRepeatOn (xdisplay);
+ XkbSetAutoRepeatRate (xdisplay, XkbUseCoreKbd, delay, interval);
+ }
+ else
+ {
+ XAutoRepeatOff (xdisplay);
+ }
+}
+
+static void
+meta_input_settings_x11_class_init (MetaInputSettingsX11Class *klass)
+{
+ MetaInputSettingsClass *input_settings_class = META_INPUT_SETTINGS_CLASS (klass);
+
+ input_settings_class->set_send_events = meta_input_settings_x11_set_send_events;
+ input_settings_class->set_matrix = meta_input_settings_x11_set_matrix;
+ 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_invert_scroll = meta_input_settings_x11_set_invert_scroll;
+ input_settings_class->set_scroll_method = meta_input_settings_x11_set_scroll_method;
+ input_settings_class->set_scroll_button = meta_input_settings_x11_set_scroll_button;
+ input_settings_class->set_keyboard_repeat = meta_input_settings_x11_set_keyboard_repeat;
+}
+
+static void
+meta_input_settings_x11_init (MetaInputSettingsX11 *settings)
+{
+}
diff --git a/src/backends/x11/meta-input-settings-x11.h b/src/backends/x11/meta-input-settings-x11.h
new file mode 100644
index 0000000..8ba71a1
--- /dev/null
+++ b/src/backends/x11/meta-input-settings-x11.h
@@ -0,0 +1,49 @@
+/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
+
+/*
+ * Copyright 2014 Red Hat, Inc.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, see <http://www.gnu.org/licenses/>.
+ *
+ * Author: Carlos Garnacho <carlosg gnome org>
+ */
+
+#ifndef META_INPUT_SETTINGS_X11_H
+#define META_INPUT_SETTINGS_X11_H
+
+#include "meta-input-settings-private.h"
+
+#define META_TYPE_INPUT_SETTINGS_X11 (meta_input_settings_x11_get_type ())
+#define META_INPUT_SETTINGS_X11(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj),
META_TYPE_INPUT_SETTINGS_X11, MetaInputSettingsX11))
+#define META_INPUT_SETTINGS_X11_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass),
META_TYPE_INPUT_SETTINGS_X11, MetaInputSettingsX11Class))
+#define META_IS_INPUT_SETTINGS_X11(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj),
META_TYPE_INPUT_SETTINGS_X11))
+#define META_IS_INPUT_SETTINGS_X11_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass),
META_TYPE_INPUT_SETTINGS_X11))
+#define META_INPUT_SETTINGS_X11_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj),
META_TYPE_INPUT_SETTINGS_X11, MetaInputSettingsX11Class))
+
+typedef struct _MetaInputSettingsX11 MetaInputSettingsX11;
+typedef struct _MetaInputSettingsX11Class MetaInputSettingsX11Class;
+
+struct _MetaInputSettingsX11
+{
+ MetaInputSettings parent_instance;
+};
+
+struct _MetaInputSettingsX11Class
+{
+ MetaInputSettingsClass parent_class;
+};
+
+GType meta_input_settings_x11_get_type (void) G_GNUC_CONST;
+
+#endif /* META_INPUT_SETTINGS_X11_H */
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]