diff options
Diffstat (limited to 'src/backends/x11/meta-input-settings-x11.c')
-rw-r--r-- | src/backends/x11/meta-input-settings-x11.c | 148 |
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)); } |