summaryrefslogtreecommitdiff
path: root/src/backends/x11/meta-input-settings-x11.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/backends/x11/meta-input-settings-x11.c')
-rw-r--r--src/backends/x11/meta-input-settings-x11.c148
1 files changed, 94 insertions, 54 deletions
diff --git a/src/backends/x11/meta-input-settings-x11.c b/src/backends/x11/meta-input-settings-x11.c
index d14815a07..c571d4c9d 100644
--- a/src/backends/x11/meta-input-settings-x11.c
+++ b/src/backends/x11/meta-input-settings-x11.c
@@ -36,6 +36,12 @@
#include "core/display-private.h"
#include "meta/meta-x11-errors.h"
+typedef struct
+{
+ MetaInputSettings *settings;
+ XDevice *xdev;
+} DeviceHandle;
+
G_DEFINE_TYPE (MetaInputSettingsX11, meta_input_settings_x11,
META_TYPE_INPUT_SETTINGS)
@@ -47,24 +53,44 @@ typedef enum
SCROLL_METHOD_NUM_FIELDS
} ScrollMethod;
+static MetaBackend *
+get_backend (MetaInputSettings *settings)
+{
+ return meta_input_settings_get_backend (settings);
+}
+
+static MetaDisplay *
+get_display (MetaInputSettings *settings)
+{
+ MetaBackend *backend = get_backend (settings);
+ MetaContext *context = meta_backend_get_context (backend);
+
+ return meta_context_get_display (context);
+}
+
static void
-device_free_xdevice (gpointer user_data)
+device_handle_free (gpointer user_data)
{
- MetaDisplay *display = meta_get_display ();
- MetaBackend *backend = meta_get_backend ();
+ DeviceHandle *handle = user_data;
+ MetaInputSettings *settings = handle->settings;
+ MetaDisplay *display = get_display (settings);
+ MetaBackend *backend = get_backend (settings);
Display *xdisplay = meta_backend_x11_get_xdisplay (META_BACKEND_X11 (backend));
XDevice *xdev = user_data;
meta_x11_error_trap_push (display->x11_display);
XCloseDevice (xdisplay, xdev);
meta_x11_error_trap_pop (display->x11_display);
+
+ g_free (handle);
}
static XDevice *
-device_ensure_xdevice (ClutterInputDevice *device)
+device_ensure_xdevice (MetaInputSettings *settings,
+ ClutterInputDevice *device)
{
- MetaDisplay *display = meta_get_display ();
- MetaBackend *backend = meta_get_backend ();
+ MetaDisplay *display = get_display (settings);
+ MetaBackend *backend = get_backend (settings);
Display *xdisplay = meta_backend_x11_get_xdisplay (META_BACKEND_X11 (backend));
int device_id = meta_input_device_x11_get_device_id (device);
XDevice *xdev = NULL;
@@ -79,9 +105,14 @@ device_ensure_xdevice (ClutterInputDevice *device)
if (xdev)
{
+ DeviceHandle *handle;
+
+ handle = g_new0 (DeviceHandle, 1);
+ handle->settings = settings;
+ handle->xdev = xdev;
g_object_set_data_full (G_OBJECT (device),
"meta-input-settings-xdevice",
- xdev, device_free_xdevice);
+ handle, device_handle_free);
}
return xdev;
@@ -94,7 +125,8 @@ get_property (ClutterInputDevice *device,
int format,
gulong nitems)
{
- MetaBackend *backend = meta_get_backend ();
+ MetaInputDevice *input_device = META_INPUT_DEVICE (device);
+ MetaBackend *backend = meta_input_device_get_backend (input_device);
Display *xdisplay = meta_backend_x11_get_xdisplay (META_BACKEND_X11 (backend));
gulong nitems_ret, bytes_after_ret;
int rc, device_id, format_ret;
@@ -126,14 +158,15 @@ get_property (ClutterInputDevice *device,
}
static void
-change_property (ClutterInputDevice *device,
+change_property (MetaInputSettings *settings,
+ ClutterInputDevice *device,
const gchar *property,
Atom type,
int format,
void *data,
gulong nitems)
{
- MetaBackend *backend = meta_get_backend ();
+ MetaBackend *backend = get_backend (settings);
Display *xdisplay = meta_backend_x11_get_xdisplay (META_BACKEND_X11 (backend));
int device_id;
Atom property_atom;
@@ -183,7 +216,7 @@ meta_input_settings_x11_set_send_events (MetaInputSettings *settings,
g_warning ("Device '%s' does not support sendevents mode %d",
clutter_input_device_get_device_name (device), mode);
else
- change_property (device, "libinput Send Events Mode Enabled",
+ change_property (settings, device, "libinput Send Events Mode Enabled",
XA_INTEGER, 8, &values, 2);
meta_XFree (available);
@@ -194,13 +227,13 @@ meta_input_settings_x11_set_matrix (MetaInputSettings *settings,
ClutterInputDevice *device,
const float matrix[6])
{
- MetaBackend *backend = meta_get_backend ();
+ MetaBackend *backend = get_backend (settings);
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",
+ change_property (settings, device, "Coordinate Transformation Matrix",
XInternAtom (xdisplay, "FLOAT", False),
32, &full_matrix, 9);
}
@@ -210,11 +243,11 @@ meta_input_settings_x11_set_speed (MetaInputSettings *settings,
ClutterInputDevice *device,
gdouble speed)
{
- MetaBackend *backend = meta_get_backend ();
+ MetaBackend *backend = get_backend (settings);
Display *xdisplay = meta_backend_x11_get_xdisplay (META_BACKEND_X11 (backend));
gfloat value = speed;
- change_property (device, "libinput Accel Speed",
+ change_property (settings, device, "libinput Accel Speed",
XInternAtom (xdisplay, "FLOAT", False),
32, &value, 1);
}
@@ -234,13 +267,13 @@ meta_input_settings_x11_set_left_handed (MetaInputSettings *settings,
device_type == CLUTTER_ERASER_DEVICE)
{
value = enabled ? 3 : 0;
- change_property (device, "Wacom Rotation",
+ change_property (settings, device, "Wacom Rotation",
XA_INTEGER, 8, &value, 1);
}
else
{
value = enabled ? 1 : 0;
- change_property (device, "libinput Left Handed Enabled",
+ change_property (settings, device, "libinput Left Handed Enabled",
XA_INTEGER, 8, &value, 1);
}
}
@@ -252,7 +285,7 @@ meta_input_settings_x11_set_disable_while_typing (MetaInputSettings *settings,
{
guchar value = (enabled) ? 1 : 0;
- change_property (device, "libinput Disable While Typing Enabled",
+ change_property (settings, device, "libinput Disable While Typing Enabled",
XA_INTEGER, 8, &value, 1);
}
@@ -263,7 +296,7 @@ meta_input_settings_x11_set_tap_enabled (MetaInputSettings *settings,
{
guchar value = (enabled) ? 1 : 0;
- change_property (device, "libinput Tapping Enabled",
+ change_property (settings, device, "libinput Tapping Enabled",
XA_INTEGER, 8, &value, 1);
}
@@ -274,7 +307,7 @@ meta_input_settings_x11_set_tap_and_drag_enabled (MetaInputSettings *settings,
{
guchar value = (enabled) ? 1 : 0;
- change_property (device, "libinput Tapping Drag Enabled",
+ change_property (settings, device, "libinput Tapping Drag Enabled",
XA_INTEGER, 8, &value, 1);
}
@@ -285,7 +318,7 @@ meta_input_settings_x11_set_tap_and_drag_lock_enabled (MetaInputSettings *setti
{
guchar value = (enabled) ? 1 : 0;
- change_property (device, "libinput Tapping Drag Lock Enabled",
+ change_property (settings, device, "libinput Tapping Drag Lock Enabled",
XA_INTEGER, 8, &value, 1);
}
@@ -296,14 +329,15 @@ meta_input_settings_x11_set_invert_scroll (MetaInputSettings *settings,
{
guchar value = (inverted) ? 1 : 0;
- change_property (device, "libinput Natural Scrolling Enabled",
+ change_property (settings, device, "libinput Natural Scrolling Enabled",
XA_INTEGER, 8, &value, 1);
}
static void
-change_scroll_method (ClutterInputDevice *device,
- ScrollMethod method,
- gboolean enabled)
+change_scroll_method (MetaInputSettings *settings,
+ ClutterInputDevice *device,
+ ScrollMethod method,
+ gboolean enabled)
{
guchar values[SCROLL_METHOD_NUM_FIELDS] = { 0 }; /* 2fg, edge, button. The last value is unused */
guchar *current = NULL;
@@ -322,7 +356,7 @@ change_scroll_method (ClutterInputDevice *device,
memcpy (values, current, SCROLL_METHOD_NUM_FIELDS);
values[method] = !!enabled;
- change_property (device, "libinput Scroll Method Enabled",
+ change_property (settings, device, "libinput Scroll Method Enabled",
XA_INTEGER, 8, &values, SCROLL_METHOD_NUM_FIELDS);
out:
meta_XFree (current);
@@ -334,7 +368,8 @@ meta_input_settings_x11_set_edge_scroll (MetaInputSettings *settings,
ClutterInputDevice *device,
gboolean edge_scroll_enabled)
{
- change_scroll_method (device, SCROLL_METHOD_FIELD_EDGE, edge_scroll_enabled);
+ change_scroll_method (settings, device,
+ SCROLL_METHOD_FIELD_EDGE, edge_scroll_enabled);
}
static void
@@ -342,7 +377,8 @@ meta_input_settings_x11_set_two_finger_scroll (MetaInputSettings *set
ClutterInputDevice *device,
gboolean two_finger_scroll_enabled)
{
- change_scroll_method (device, SCROLL_METHOD_FIELD_2FG, two_finger_scroll_enabled);
+ change_scroll_method (settings, device,
+ SCROLL_METHOD_FIELD_2FG, two_finger_scroll_enabled);
}
static gboolean
@@ -369,10 +405,11 @@ meta_input_settings_x11_set_scroll_button (MetaInputSettings *settings,
{
gchar lock = button_lock;
- change_scroll_method (device, SCROLL_METHOD_FIELD_BUTTON, button != 0);
- change_property (device, "libinput Button Scrolling Button",
+ change_scroll_method (settings, device,
+ SCROLL_METHOD_FIELD_BUTTON, button != 0);
+ change_property (settings, device, "libinput Button Scrolling Button",
XA_CARDINAL, 32, &button, 1);
- change_property (device, "libinput Button Scrolling Button Lock Enabled",
+ change_property (settings, device, "libinput Button Scrolling Button Lock Enabled",
XA_INTEGER, 8, &lock, 1);
}
@@ -416,7 +453,7 @@ meta_input_settings_x11_set_click_method (MetaInputSettings *settings,
g_warning ("Device '%s' does not support click method %d",
clutter_input_device_get_device_name (device), mode);
else
- change_property (device, "libinput Click Method Enabled",
+ change_property (settings, device, "libinput Click Method Enabled",
XA_INTEGER, 8, &values, 2);
meta_XFree(available);
@@ -452,7 +489,7 @@ meta_input_settings_x11_set_tap_button_map (MetaInputSettings *settin
}
if (values[0] || values[1])
- change_property (device, "libinput Tapping Button Mapping Enabled",
+ change_property (settings, device, "libinput Tapping Button Mapping Enabled",
XA_INTEGER, 8, &values, 2);
}
@@ -462,7 +499,7 @@ meta_input_settings_x11_set_keyboard_repeat (MetaInputSettings *settings,
guint delay,
guint interval)
{
- MetaBackend *backend = meta_get_backend ();
+ MetaBackend *backend = get_backend (settings);
Display *xdisplay = meta_backend_x11_get_xdisplay (META_BACKEND_X11 (backend));
if (enabled)
@@ -477,8 +514,9 @@ meta_input_settings_x11_set_keyboard_repeat (MetaInputSettings *settings,
}
static void
-set_device_accel_profile (ClutterInputDevice *device,
- GDesktopPointerAccelProfile profile)
+set_device_accel_profile (MetaInputSettings *settings,
+ ClutterInputDevice *device,
+ GDesktopPointerAccelProfile profile)
{
guchar *defaults, *available;
guchar values[2] = { 0 }; /* adaptive, flat */
@@ -512,7 +550,7 @@ set_device_accel_profile (ClutterInputDevice *device,
break;
}
- change_property (device, "libinput Accel Profile Enabled",
+ change_property (settings, device, "libinput Accel Profile Enabled",
XA_INTEGER, 8, &values, 2);
meta_XFree (available);
@@ -535,7 +573,7 @@ meta_input_settings_x11_set_mouse_accel_profile (MetaInputSettings *set
CLUTTER_INPUT_CAPABILITY_TRACKPOINT)) != 0)
return;
- set_device_accel_profile (device, profile);
+ set_device_accel_profile (settings, device, profile);
}
static void
@@ -548,7 +586,7 @@ meta_input_settings_x11_set_trackball_accel_profile (MetaInputSettings
if ((caps & CLUTTER_INPUT_CAPABILITY_TRACKBALL) == 0)
return;
- set_device_accel_profile (device, profile);
+ set_device_accel_profile (settings, device, profile);
}
static void
@@ -556,8 +594,8 @@ meta_input_settings_x11_set_tablet_mapping (MetaInputSettings *settings,
ClutterInputDevice *device,
GDesktopTabletMapping mapping)
{
- MetaDisplay *display = meta_get_display ();
- MetaBackend *backend = meta_get_backend ();
+ MetaDisplay *display = get_display (settings);
+ MetaBackend *backend = get_backend (settings);
Display *xdisplay = meta_backend_x11_get_xdisplay (META_BACKEND_X11 (backend));
XDevice *xdev;
@@ -566,7 +604,7 @@ meta_input_settings_x11_set_tablet_mapping (MetaInputSettings *settings,
/* Grab the puke bucket! */
meta_x11_error_trap_push (display->x11_display);
- xdev = device_ensure_xdevice (device);
+ xdev = device_ensure_xdevice (settings, device);
if (xdev)
{
XSetDeviceMode (xdisplay, xdev,
@@ -582,13 +620,14 @@ meta_input_settings_x11_set_tablet_mapping (MetaInputSettings *settings,
}
static gboolean
-device_query_area (ClutterInputDevice *device,
+device_query_area (MetaInputSettings *settings,
+ ClutterInputDevice *device,
gint *x,
gint *y,
gint *width,
gint *height)
{
- MetaBackend *backend = meta_get_backend ();
+ MetaBackend *backend = get_backend (settings);
Display *xdisplay = meta_backend_x11_get_xdisplay (META_BACKEND_X11 (backend));
gint device_id, n_devices, i;
XIDeviceInfo *info;
@@ -630,7 +669,7 @@ update_tablet_area (MetaInputSettings *settings,
ClutterInputDevice *device,
gint32 *area)
{
- change_property (device, "Wacom Tablet Area",
+ change_property (settings, device, "Wacom Tablet Area",
XA_INTEGER, 32, area, 4);
}
@@ -644,7 +683,7 @@ meta_input_settings_x11_set_tablet_area (MetaInputSettings *settings,
{
gint32 x, y, width, height, area[4] = { 0 };
- if (!device_query_area (device, &x, &y, &width, &height))
+ if (!device_query_area (settings, device, &x, &y, &width, &height))
return;
area[0] = (width * padding_left) + x;
@@ -661,7 +700,8 @@ meta_input_settings_x11_set_tablet_aspect_ratio (MetaInputSettings *settings,
{
int32_t dev_x, dev_y, dev_width, dev_height, area[4] = { 0 };
- if (!device_query_area (device, &dev_x, &dev_y, &dev_width, &dev_height))
+ if (!device_query_area (settings, device,
+ &dev_x, &dev_y, &dev_width, &dev_height))
return;
if (aspect_ratio > 0)
@@ -711,8 +751,8 @@ meta_input_settings_x11_set_stylus_button_map (MetaInputSettings *setti
GDesktopStylusButtonAction secondary,
GDesktopStylusButtonAction tertiary)
{
- MetaDisplay *display = meta_get_display ();
- MetaBackend *backend = meta_get_backend ();
+ MetaDisplay *display = get_display (settings);
+ MetaBackend *backend = get_backend (settings);
Display *xdisplay = meta_backend_x11_get_xdisplay (META_BACKEND_X11 (backend));
XDevice *xdev;
@@ -721,7 +761,7 @@ meta_input_settings_x11_set_stylus_button_map (MetaInputSettings *setti
/* Grab the puke bucket! */
meta_x11_error_trap_push (display->x11_display);
- xdev = device_ensure_xdevice (device);
+ xdev = device_ensure_xdevice (settings, device);
if (xdev)
{
guchar map[8] = {
@@ -761,7 +801,7 @@ meta_input_settings_x11_set_mouse_middle_click_emulation (MetaInputSettings *se
CLUTTER_INPUT_CAPABILITY_TRACKPOINT)) != 0)
return;
- change_property (device, "libinput Middle Emulation Enabled",
+ change_property (settings, device, "libinput Middle Emulation Enabled",
XA_INTEGER, 8, &value, 1);
}
@@ -776,7 +816,7 @@ meta_input_settings_x11_set_touchpad_middle_click_emulation (MetaInputSettings
if ((caps & CLUTTER_INPUT_CAPABILITY_TOUCHPAD) == 0)
return;
- change_property (device, "libinput Middle Emulation Enabled",
+ change_property (settings, device, "libinput Middle Emulation Enabled",
XA_INTEGER, 8, &value, 1);
}
@@ -791,7 +831,7 @@ meta_input_settings_x11_set_trackball_middle_click_emulation (MetaInputSettings
if ((caps & CLUTTER_INPUT_CAPABILITY_TRACKBALL) == 0)
return;
- change_property (device, "libinput Middle Emulation Enabled",
+ change_property (settings, device, "libinput Middle Emulation Enabled",
XA_INTEGER, 8, &value, 1);
}
@@ -803,7 +843,7 @@ meta_input_settings_x11_set_stylus_pressure (MetaInputSettings *settings,
{
guint32 values[4] = { pressure[0], pressure[1], pressure[2], pressure[3] };
- change_property (device, "Wacom Pressurecurve", XA_INTEGER, 32,
+ change_property (settings, device, "Wacom Pressurecurve", XA_INTEGER, 32,
&values, G_N_ELEMENTS (values));
}