summaryrefslogtreecommitdiff
path: root/src/backends/meta-input-settings.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/backends/meta-input-settings.c')
-rw-r--r--src/backends/meta-input-settings.c1762
1 files changed, 0 insertions, 1762 deletions
diff --git a/src/backends/meta-input-settings.c b/src/backends/meta-input-settings.c
deleted file mode 100644
index 16618608b..000000000
--- a/src/backends/meta-input-settings.c
+++ /dev/null
@@ -1,1762 +0,0 @@
-/* -*- 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>
- */
-
-/**
- * SECTION:input-settings
- * @title: MetaInputSettings
- * @short_description: Mutter input device configuration
- */
-
-#include "config.h"
-
-#include <glib/gi18n-lib.h>
-#include <string.h>
-
-#include "backends/meta-backend-private.h"
-#include "backends/meta-input-device-private.h"
-#include "backends/meta-input-settings-private.h"
-#include "backends/meta-input-mapper-private.h"
-#include "backends/meta-logical-monitor.h"
-#include "backends/meta-monitor.h"
-#include "core/display-private.h"
-#include "meta/util.h"
-
-static GQuark quark_tool_settings = 0;
-
-typedef struct _MetaInputSettingsPrivate MetaInputSettingsPrivate;
-typedef struct _DeviceMappingInfo DeviceMappingInfo;
-typedef struct _CurrentToolInfo CurrentToolInfo;
-
-struct _CurrentToolInfo
-{
- MetaInputSettings *input_settings;
- ClutterInputDevice *device;
- ClutterInputDeviceTool *tool;
- GSettings *settings;
- gulong changed_id;
-};
-
-struct _DeviceMappingInfo
-{
- MetaInputSettings *input_settings;
- ClutterInputDevice *device;
- GSettings *settings;
- gulong changed_id;
- guint *group_modes;
- double aspect_ratio;
-};
-
-struct _MetaInputSettingsPrivate
-{
- ClutterSeat *seat;
- gulong monitors_changed_id;
-
- GSettings *mouse_settings;
- GSettings *touchpad_settings;
- GSettings *trackball_settings;
- GSettings *keyboard_settings;
- GSettings *keyboard_a11y_settings;
-
- GList *devices;
- GHashTable *mappable_devices;
-
- GHashTable *current_tools;
-
- GHashTable *two_finger_devices;
-
- MetaKbdA11ySettings kbd_a11y_settings;
-};
-
-typedef gboolean (* ConfigBoolMappingFunc) (MetaInputSettings *input_settings,
- ClutterInputDevice *device,
- gboolean value);
-
-typedef void (*ConfigBoolFunc) (MetaInputSettings *input_settings,
- ClutterInputDevice *device,
- gboolean setting);
-typedef void (*ConfigDoubleFunc) (MetaInputSettings *input_settings,
- ClutterInputDevice *device,
- gdouble value);
-typedef void (*ConfigUintFunc) (MetaInputSettings *input_settings,
- ClutterInputDevice *device,
- guint value);
-
-G_DEFINE_TYPE_WITH_PRIVATE (MetaInputSettings, meta_input_settings, G_TYPE_OBJECT)
-
-enum
-{
- KBD_A11Y_CHANGED,
- N_SIGNALS
-};
-
-static guint signals[N_SIGNALS] = { 0 };
-
-static GSList *
-meta_input_settings_get_devices (MetaInputSettings *settings,
- ClutterInputDeviceType type)
-{
- MetaInputSettingsPrivate *priv;
- GList *l;
- GSList *list = NULL;
-
- priv = meta_input_settings_get_instance_private (settings);
-
- for (l = priv->devices; l; l = l->next)
- {
- ClutterInputDevice *device = l->data;
-
- if (clutter_input_device_get_device_type (device) == type &&
- clutter_input_device_get_device_mode (device) != CLUTTER_INPUT_MODE_LOGICAL)
- list = g_slist_prepend (list, device);
- }
-
- return list;
-}
-
-static void
-meta_input_settings_dispose (GObject *object)
-{
- MetaInputSettings *settings = META_INPUT_SETTINGS (object);
- MetaInputSettingsPrivate *priv = meta_input_settings_get_instance_private (settings);
-
- g_clear_object (&priv->mouse_settings);
- g_clear_object (&priv->touchpad_settings);
- g_clear_object (&priv->trackball_settings);
- g_clear_object (&priv->keyboard_settings);
- g_clear_object (&priv->keyboard_a11y_settings);
- g_clear_pointer (&priv->mappable_devices, g_hash_table_unref);
- g_clear_pointer (&priv->current_tools, g_hash_table_unref);
-
- g_clear_pointer (&priv->two_finger_devices, g_hash_table_destroy);
-
- G_OBJECT_CLASS (meta_input_settings_parent_class)->dispose (object);
-}
-
-static void
-settings_device_set_bool_setting (MetaInputSettings *input_settings,
- ClutterInputDevice *device,
- ConfigBoolFunc func,
- gboolean enabled)
-{
- func (input_settings, device, enabled);
-}
-
-static void
-settings_set_bool_setting (MetaInputSettings *input_settings,
- ClutterInputDeviceType type,
- ConfigBoolMappingFunc mapping_func,
- ConfigBoolFunc func,
- gboolean enabled)
-{
- GSList *devices, *l;
-
- devices = meta_input_settings_get_devices (input_settings, type);
-
- for (l = devices; l; l = l->next)
- {
- gboolean value = enabled;
-
- if (mapping_func)
- value = mapping_func (input_settings, l->data, value);
- settings_device_set_bool_setting (input_settings, l->data, func, value);
- }
-
- g_slist_free (devices);
-}
-
-static void
-settings_device_set_double_setting (MetaInputSettings *input_settings,
- ClutterInputDevice *device,
- ConfigDoubleFunc func,
- gdouble value)
-{
- func (input_settings, device, value);
-}
-
-static void
-settings_set_double_setting (MetaInputSettings *input_settings,
- ClutterInputDeviceType type,
- ConfigDoubleFunc func,
- gdouble value)
-{
- GSList *devices, *d;
-
- devices = meta_input_settings_get_devices (input_settings, type);
-
- for (d = devices; d; d = d->next)
- settings_device_set_double_setting (input_settings, d->data, func, value);
-
- g_slist_free (devices);
-}
-
-static void
-settings_device_set_uint_setting (MetaInputSettings *input_settings,
- ClutterInputDevice *device,
- ConfigUintFunc func,
- guint value)
-{
- (func) (input_settings, device, value);
-}
-
-static void
-settings_set_uint_setting (MetaInputSettings *input_settings,
- ClutterInputDeviceType type,
- ConfigUintFunc func,
- guint value)
-{
- GSList *devices, *d;
-
- devices = meta_input_settings_get_devices (input_settings, type);
-
- for (d = devices; d; d = d->next)
- settings_device_set_uint_setting (input_settings, d->data, func, value);
-
- g_slist_free (devices);
-}
-
-static void
-update_touchpad_left_handed (MetaInputSettings *input_settings,
- ClutterInputDevice *device)
-{
- MetaInputSettingsClass *input_settings_class;
- GDesktopTouchpadHandedness handedness;
- MetaInputSettingsPrivate *priv;
- gboolean enabled = FALSE;
-
- if (device &&
- clutter_input_device_get_device_type (device) != CLUTTER_TOUCHPAD_DEVICE)
- return;
-
- priv = meta_input_settings_get_instance_private (input_settings);
- input_settings_class = META_INPUT_SETTINGS_GET_CLASS (input_settings);
- handedness = g_settings_get_enum (priv->touchpad_settings, "left-handed");
-
- switch (handedness)
- {
- case G_DESKTOP_TOUCHPAD_HANDEDNESS_RIGHT:
- enabled = FALSE;
- break;
- case G_DESKTOP_TOUCHPAD_HANDEDNESS_LEFT:
- enabled = TRUE;
- break;
- case G_DESKTOP_TOUCHPAD_HANDEDNESS_MOUSE:
- enabled = g_settings_get_boolean (priv->mouse_settings, "left-handed");
- break;
- default:
- g_assert_not_reached ();
- }
-
- if (device)
- {
- settings_device_set_bool_setting (input_settings, device,
- input_settings_class->set_left_handed,
- enabled);
- }
- else
- {
- settings_set_bool_setting (input_settings, CLUTTER_TOUCHPAD_DEVICE, NULL,
- input_settings_class->set_left_handed,
- enabled);
- }
-}
-
-static void
-update_mouse_left_handed (MetaInputSettings *input_settings,
- ClutterInputDevice *device)
-{
- MetaInputSettingsClass *input_settings_class;
- MetaInputSettingsPrivate *priv;
- gboolean enabled;
-
- if (device &&
- clutter_input_device_get_device_type (device) != CLUTTER_POINTER_DEVICE)
- return;
-
- priv = meta_input_settings_get_instance_private (input_settings);
- input_settings_class = META_INPUT_SETTINGS_GET_CLASS (input_settings);
- enabled = g_settings_get_boolean (priv->mouse_settings, "left-handed");
-
- if (device)
- {
- settings_device_set_bool_setting (input_settings, device,
- input_settings_class->set_left_handed,
- enabled);
- }
- else
- {
- GDesktopTouchpadHandedness touchpad_handedness;
-
- settings_set_bool_setting (input_settings, CLUTTER_POINTER_DEVICE, NULL,
- input_settings_class->set_left_handed,
- enabled);
-
- touchpad_handedness = g_settings_get_enum (priv->touchpad_settings,
- "left-handed");
-
- /* Also update touchpads if they're following mouse settings */
- if (touchpad_handedness == G_DESKTOP_TOUCHPAD_HANDEDNESS_MOUSE)
- update_touchpad_left_handed (input_settings, NULL);
- }
-}
-
-static void
-do_update_pointer_accel_profile (MetaInputSettings *input_settings,
- GSettings *settings,
- ClutterInputDevice *device,
- GDesktopPointerAccelProfile profile)
-{
- MetaInputSettingsPrivate *priv =
- meta_input_settings_get_instance_private (input_settings);
- MetaInputSettingsClass *input_settings_class =
- META_INPUT_SETTINGS_GET_CLASS (input_settings);
-
- if (settings == priv->mouse_settings)
- input_settings_class->set_mouse_accel_profile (input_settings,
- device,
- profile);
- else if (settings == priv->trackball_settings)
- input_settings_class->set_trackball_accel_profile (input_settings,
- device,
- profile);
-}
-
-static void
-update_pointer_accel_profile (MetaInputSettings *input_settings,
- GSettings *settings,
- ClutterInputDevice *device)
-{
- GDesktopPointerAccelProfile profile;
-
- profile = g_settings_get_enum (settings, "accel-profile");
-
- if (device)
- {
- do_update_pointer_accel_profile (input_settings, settings,
- device, profile);
- }
- else
- {
- MetaInputSettingsPrivate *priv =
- meta_input_settings_get_instance_private (input_settings);
- GList *l;
-
- for (l = priv->devices; l; l = l->next)
- {
- device = l->data;
-
- if (clutter_input_device_get_device_mode (device) ==
- CLUTTER_INPUT_MODE_LOGICAL)
- continue;
-
- do_update_pointer_accel_profile (input_settings, settings,
- device, profile);
- }
- }
-}
-
-static GSettings *
-get_settings_for_device_type (MetaInputSettings *input_settings,
- ClutterInputDeviceType type)
-{
- MetaInputSettingsPrivate *priv;
- priv = meta_input_settings_get_instance_private (input_settings);
- switch (type)
- {
- case CLUTTER_POINTER_DEVICE:
- return priv->mouse_settings;
- case CLUTTER_TOUCHPAD_DEVICE:
- return priv->touchpad_settings;
- default:
- return NULL;
- }
-}
-
-static void
-update_middle_click_emulation (MetaInputSettings *input_settings,
- GSettings *settings,
- ClutterInputDevice *device)
-{
- ConfigBoolFunc func;
- const gchar *key = "middle-click-emulation";
- MetaInputSettingsPrivate *priv = meta_input_settings_get_instance_private (input_settings);
-
- if (!settings)
- return;
-
- if (settings == priv->mouse_settings)
- func = META_INPUT_SETTINGS_GET_CLASS (input_settings)->set_mouse_middle_click_emulation;
- else if (settings == priv->touchpad_settings)
- func = META_INPUT_SETTINGS_GET_CLASS (input_settings)->set_touchpad_middle_click_emulation;
- else if (settings == priv->trackball_settings)
- func = META_INPUT_SETTINGS_GET_CLASS (input_settings)->set_trackball_middle_click_emulation;
- else
- return;
-
- if (device)
- {
- settings_device_set_bool_setting (input_settings, device, func,
- g_settings_get_boolean (settings, key));
- }
- else
- {
- settings_set_bool_setting (input_settings, CLUTTER_POINTER_DEVICE,
- NULL, func,
- g_settings_get_boolean (settings, key));
- }
-}
-
-static void
-update_device_speed (MetaInputSettings *input_settings,
- ClutterInputDevice *device)
-{
- GSettings *settings;
- ConfigDoubleFunc func;
- const gchar *key = "speed";
-
- func = META_INPUT_SETTINGS_GET_CLASS (input_settings)->set_speed;
-
- if (device)
- {
- settings = get_settings_for_device_type (input_settings,
- clutter_input_device_get_device_type (device));
- if (!settings)
- return;
-
- settings_device_set_double_setting (input_settings, device, func,
- g_settings_get_double (settings, key));
- }
- else
- {
- settings = get_settings_for_device_type (input_settings, CLUTTER_POINTER_DEVICE);
- settings_set_double_setting (input_settings, CLUTTER_POINTER_DEVICE, func,
- g_settings_get_double (settings, key));
- settings = get_settings_for_device_type (input_settings, CLUTTER_TOUCHPAD_DEVICE);
- settings_set_double_setting (input_settings, CLUTTER_TOUCHPAD_DEVICE, func,
- g_settings_get_double (settings, key));
- }
-}
-
-static void
-update_device_natural_scroll (MetaInputSettings *input_settings,
- ClutterInputDevice *device)
-{
- GSettings *settings;
- ConfigBoolFunc func;
- const gchar *key = "natural-scroll";
-
- func = META_INPUT_SETTINGS_GET_CLASS (input_settings)->set_invert_scroll;
-
- if (device)
- {
- settings = get_settings_for_device_type (input_settings,
- clutter_input_device_get_device_type (device));
- if (!settings)
- return;
-
- settings_device_set_bool_setting (input_settings, device, func,
- g_settings_get_boolean (settings, key));
- }
- else
- {
- settings = get_settings_for_device_type (input_settings, CLUTTER_POINTER_DEVICE);
- settings_set_bool_setting (input_settings, CLUTTER_POINTER_DEVICE,
- NULL, func,
- g_settings_get_boolean (settings, key));
- settings = get_settings_for_device_type (input_settings, CLUTTER_TOUCHPAD_DEVICE);
- settings_set_bool_setting (input_settings, CLUTTER_TOUCHPAD_DEVICE,
- NULL, func,
- g_settings_get_boolean (settings, key));
- }
-}
-
-static void
-update_touchpad_disable_while_typing (MetaInputSettings *input_settings,
- ClutterInputDevice *device)
-{
- GSettings *settings;
- MetaInputSettingsClass *input_settings_class;
- MetaInputSettingsPrivate *priv;
- gboolean enabled;
- const gchar *key = "disable-while-typing";
-
- if (device &&
- clutter_input_device_get_device_type (device) != CLUTTER_TOUCHPAD_DEVICE)
- return;
-
- priv = meta_input_settings_get_instance_private (input_settings);
- input_settings_class = META_INPUT_SETTINGS_GET_CLASS (input_settings);
- enabled = g_settings_get_boolean (priv->touchpad_settings, key);
-
- if (device)
- {
- settings = get_settings_for_device_type (input_settings,
- clutter_input_device_get_device_type (device));
-
- if (!settings)
- return;
-
- settings_device_set_bool_setting (input_settings, device,
- input_settings_class->set_disable_while_typing,
- enabled);
- }
- else
- {
- settings_set_bool_setting (input_settings, CLUTTER_TOUCHPAD_DEVICE, NULL,
- input_settings_class->set_disable_while_typing,
- enabled);
- }
-}
-
-static gboolean
-device_is_tablet_touchpad (MetaInputSettings *input_settings,
- ClutterInputDevice *device)
-{
-#ifdef HAVE_LIBWACOM
- WacomIntegrationFlags flags = 0;
- WacomDevice *wacom_device;
-
- if (clutter_input_device_get_device_type (device) != CLUTTER_TOUCHPAD_DEVICE)
- return FALSE;
-
- wacom_device = meta_input_device_get_wacom_device (META_INPUT_DEVICE (device));
-
- if (wacom_device)
- {
- flags = libwacom_get_integration_flags (wacom_device);
-
- if ((flags & (WACOM_DEVICE_INTEGRATED_SYSTEM |
- WACOM_DEVICE_INTEGRATED_DISPLAY)) == 0)
- return TRUE;
- }
-#endif
-
- return FALSE;
-}
-
-static gboolean
-force_enable_on_tablet (MetaInputSettings *input_settings,
- ClutterInputDevice *device,
- gboolean value)
-{
- return device_is_tablet_touchpad (input_settings, device) || value;
-}
-
-static void
-update_touchpad_tap_enabled (MetaInputSettings *input_settings,
- ClutterInputDevice *device)
-{
- MetaInputSettingsClass *input_settings_class;
- MetaInputSettingsPrivate *priv;
- gboolean enabled;
-
- if (device &&
- clutter_input_device_get_device_type (device) != CLUTTER_TOUCHPAD_DEVICE)
- return;
-
- priv = meta_input_settings_get_instance_private (input_settings);
- input_settings_class = META_INPUT_SETTINGS_GET_CLASS (input_settings);
- enabled = g_settings_get_boolean (priv->touchpad_settings, "tap-to-click");
-
- if (device)
- {
- enabled = force_enable_on_tablet (input_settings, device, enabled);
- settings_device_set_bool_setting (input_settings, device,
- input_settings_class->set_tap_enabled,
- enabled);
- }
- else
- {
- settings_set_bool_setting (input_settings, CLUTTER_TOUCHPAD_DEVICE,
- force_enable_on_tablet,
- input_settings_class->set_tap_enabled,
- enabled);
- }
-}
-
-static void
-update_touchpad_tap_button_map (MetaInputSettings *input_settings,
- ClutterInputDevice *device)
-{
- MetaInputSettingsClass *input_settings_class;
- GDesktopTouchpadTapButtonMap method;
- MetaInputSettingsPrivate *priv;
-
- if (device &&
- clutter_input_device_get_device_type (device) != CLUTTER_TOUCHPAD_DEVICE)
- return;
-
- priv = meta_input_settings_get_instance_private (input_settings);
- input_settings_class = META_INPUT_SETTINGS_GET_CLASS (input_settings);
- method = g_settings_get_enum (priv->touchpad_settings, "tap-button-map");
-
- if (device)
- {
- settings_device_set_uint_setting (input_settings, device,
- input_settings_class->set_tap_button_map,
- method);
- }
- else
- {
- settings_set_uint_setting (input_settings, CLUTTER_TOUCHPAD_DEVICE,
- (ConfigUintFunc) input_settings_class->set_tap_button_map,
- method);
- }
-}
-
-static void
-update_touchpad_tap_and_drag_enabled (MetaInputSettings *input_settings,
- ClutterInputDevice *device)
-{
- MetaInputSettingsClass *input_settings_class;
- MetaInputSettingsPrivate *priv;
- gboolean enabled;
-
- if (device &&
- clutter_input_device_get_device_type (device) != CLUTTER_TOUCHPAD_DEVICE)
- return;
-
- priv = meta_input_settings_get_instance_private (input_settings);
- input_settings_class = META_INPUT_SETTINGS_GET_CLASS (input_settings);
- enabled = g_settings_get_boolean (priv->touchpad_settings, "tap-and-drag");
-
- if (device)
- {
- enabled = force_enable_on_tablet (input_settings, device, enabled);
- settings_device_set_bool_setting (input_settings, device,
- input_settings_class->set_tap_and_drag_enabled,
- enabled);
- }
- else
- {
- settings_set_bool_setting (input_settings, CLUTTER_TOUCHPAD_DEVICE,
- force_enable_on_tablet,
- input_settings_class->set_tap_and_drag_enabled,
- enabled);
- }
-}
-
-static void
-update_touchpad_tap_and_drag_lock_enabled (MetaInputSettings *input_settings,
- ClutterInputDevice *device)
-{
- MetaInputSettingsClass *input_settings_class;
- MetaInputSettingsPrivate *priv;
- gboolean enabled;
-
- if (device &&
- clutter_input_device_get_device_type (device) != CLUTTER_TOUCHPAD_DEVICE)
- return;
-
- priv = meta_input_settings_get_instance_private (input_settings);
- input_settings_class = META_INPUT_SETTINGS_GET_CLASS (input_settings);
- enabled = g_settings_get_boolean (priv->touchpad_settings, "tap-and-drag-lock");
-
- if (device)
- {
- settings_device_set_bool_setting (input_settings, device,
- input_settings_class->set_tap_and_drag_lock_enabled,
- enabled);
- }
- else
- {
- settings_set_bool_setting (input_settings, CLUTTER_TOUCHPAD_DEVICE,
- NULL,
- input_settings_class->set_tap_and_drag_lock_enabled,
- enabled);
- }
-}
-
-static void
-update_touchpad_edge_scroll (MetaInputSettings *input_settings,
- ClutterInputDevice *device)
-{
- MetaInputSettingsClass *input_settings_class;
- gboolean edge_scroll_enabled;
- gboolean two_finger_scroll_enabled;
- gboolean two_finger_scroll_available;
- MetaInputSettingsPrivate *priv;
-
- if (device &&
- clutter_input_device_get_device_type (device) != CLUTTER_TOUCHPAD_DEVICE)
- return;
-
- priv = meta_input_settings_get_instance_private (input_settings);
- input_settings_class = META_INPUT_SETTINGS_GET_CLASS (input_settings);
- edge_scroll_enabled = g_settings_get_boolean (priv->touchpad_settings, "edge-scrolling-enabled");
- two_finger_scroll_enabled = g_settings_get_boolean (priv->touchpad_settings, "two-finger-scrolling-enabled");
- two_finger_scroll_available = g_hash_table_size (priv->two_finger_devices) > 0;
-
- /* If both are enabled we prefer two finger. */
- if (edge_scroll_enabled && two_finger_scroll_enabled && two_finger_scroll_available)
- edge_scroll_enabled = FALSE;
-
- if (device)
- {
- settings_device_set_bool_setting (input_settings, device,
- input_settings_class->set_edge_scroll,
- edge_scroll_enabled);
- }
- else
- {
- settings_set_bool_setting (input_settings, CLUTTER_TOUCHPAD_DEVICE, NULL,
- (ConfigBoolFunc) input_settings_class->set_edge_scroll,
- edge_scroll_enabled);
- }
-}
-
-static void
-update_touchpad_two_finger_scroll (MetaInputSettings *input_settings,
- ClutterInputDevice *device)
-{
- MetaInputSettingsClass *input_settings_class;
- gboolean two_finger_scroll_enabled;
- MetaInputSettingsPrivate *priv;
-
- if (device &&
- clutter_input_device_get_device_type (device) != CLUTTER_TOUCHPAD_DEVICE)
- return;
-
- priv = meta_input_settings_get_instance_private (input_settings);
- input_settings_class = META_INPUT_SETTINGS_GET_CLASS (input_settings);
- two_finger_scroll_enabled = g_settings_get_boolean (priv->touchpad_settings, "two-finger-scrolling-enabled");
-
- /* Disable edge since they can't both be set. */
- if (two_finger_scroll_enabled)
- update_touchpad_edge_scroll (input_settings, device);
-
- if (device)
- {
- settings_device_set_bool_setting (input_settings, device,
- input_settings_class->set_two_finger_scroll,
- two_finger_scroll_enabled);
- }
- else
- {
- settings_set_bool_setting (input_settings, CLUTTER_TOUCHPAD_DEVICE, NULL,
- (ConfigBoolFunc) input_settings_class->set_two_finger_scroll,
- two_finger_scroll_enabled);
- }
-
- /* Edge might have been disabled because two finger was on. */
- if (!two_finger_scroll_enabled)
- update_touchpad_edge_scroll (input_settings, device);
-}
-
-static void
-update_touchpad_click_method (MetaInputSettings *input_settings,
- ClutterInputDevice *device)
-{
- MetaInputSettingsClass *input_settings_class;
- GDesktopTouchpadClickMethod method;
- MetaInputSettingsPrivate *priv;
-
- if (device &&
- clutter_input_device_get_device_type (device) != CLUTTER_TOUCHPAD_DEVICE)
- return;
-
- priv = meta_input_settings_get_instance_private (input_settings);
- input_settings_class = META_INPUT_SETTINGS_GET_CLASS (input_settings);
- method = g_settings_get_enum (priv->touchpad_settings, "click-method");
-
- if (device)
- {
- settings_device_set_uint_setting (input_settings, device,
- input_settings_class->set_click_method,
- method);
- }
- else
- {
- settings_set_uint_setting (input_settings, CLUTTER_TOUCHPAD_DEVICE,
- (ConfigUintFunc) input_settings_class->set_click_method,
- method);
- }
-}
-
-static void
-update_touchpad_send_events (MetaInputSettings *input_settings,
- ClutterInputDevice *device)
-{
- MetaInputSettingsClass *input_settings_class;
- MetaInputSettingsPrivate *priv;
- GDesktopDeviceSendEvents mode;
-
- if (device &&
- clutter_input_device_get_device_type (device) != CLUTTER_TOUCHPAD_DEVICE)
- return;
-
- priv = meta_input_settings_get_instance_private (input_settings);
- input_settings_class = META_INPUT_SETTINGS_GET_CLASS (input_settings);
- mode = g_settings_get_enum (priv->touchpad_settings, "send-events");
-
- if (device)
- {
- settings_device_set_uint_setting (input_settings, device,
- input_settings_class->set_send_events,
- mode);
- }
- else
- {
- settings_set_uint_setting (input_settings, CLUTTER_TOUCHPAD_DEVICE,
- input_settings_class->set_send_events,
- mode);
- }
-}
-
-static void
-update_trackball_scroll_button (MetaInputSettings *input_settings,
- ClutterInputDevice *device)
-{
- MetaInputSettingsClass *input_settings_class;
- MetaInputSettingsPrivate *priv;
- guint button;
- gboolean button_lock;
-
- priv = meta_input_settings_get_instance_private (input_settings);
- input_settings_class = META_INPUT_SETTINGS_GET_CLASS (input_settings);
-
- if (device && !input_settings_class->is_trackball_device (input_settings, device))
- return;
-
- /* This key is 'i' in the schema but it also specifies a minimum
- * range of 0 so the cast here is safe. */
- button = (guint) g_settings_get_int (priv->trackball_settings, "scroll-wheel-emulation-button");
- button_lock = g_settings_get_boolean (priv->trackball_settings, "scroll-wheel-emulation-button-lock");
-
- if (device)
- {
- input_settings_class->set_scroll_button (input_settings, device, button, button_lock);
- }
- else if (!device)
- {
- GList *l;
-
- for (l = priv->devices; l; l = l->next)
- {
- device = l->data;
-
- if (input_settings_class->is_trackball_device (input_settings, device))
- input_settings_class->set_scroll_button (input_settings, device, button, button_lock);
- }
- }
-}
-
-static void
-update_keyboard_repeat (MetaInputSettings *input_settings)
-{
- MetaInputSettingsClass *input_settings_class;
- MetaInputSettingsPrivate *priv;
- guint delay, interval;
- gboolean repeat;
-
- priv = meta_input_settings_get_instance_private (input_settings);
- repeat = g_settings_get_boolean (priv->keyboard_settings, "repeat");
- delay = g_settings_get_uint (priv->keyboard_settings, "delay");
- interval = g_settings_get_uint (priv->keyboard_settings, "repeat-interval");
-
- delay = MAX (1, delay);
- interval = MAX (1, interval);
-
- input_settings_class = META_INPUT_SETTINGS_GET_CLASS (input_settings);
- input_settings_class->set_keyboard_repeat (input_settings,
- repeat, delay, interval);
-}
-
-static void
-update_tablet_keep_aspect (MetaInputSettings *input_settings,
- GSettings *settings,
- ClutterInputDevice *device)
-{
- MetaInputSettingsPrivate *priv;
- MetaInputSettingsClass *input_settings_class;
- DeviceMappingInfo *info;
- gboolean keep_aspect;
- double aspect_ratio;
-
- if (clutter_input_device_get_device_type (device) != CLUTTER_TABLET_DEVICE &&
- clutter_input_device_get_device_type (device) != CLUTTER_PEN_DEVICE &&
- clutter_input_device_get_device_type (device) != CLUTTER_ERASER_DEVICE)
- return;
-
- priv = meta_input_settings_get_instance_private (input_settings);
-
- info = g_hash_table_lookup (priv->mappable_devices, device);
- if (!info)
- return;
-
-#ifdef HAVE_LIBWACOM
- {
- WacomDevice *wacom_device;
-
- wacom_device = meta_input_device_get_wacom_device (META_INPUT_DEVICE (device));
-
- /* Keep aspect only makes sense in external tablets */
- if (wacom_device &&
- libwacom_get_integration_flags (wacom_device) != WACOM_DEVICE_INTEGRATED_NONE)
- return;
- }
-#endif
-
- keep_aspect = g_settings_get_boolean (settings, "keep-aspect");
-
- if (keep_aspect)
- aspect_ratio = info->aspect_ratio;
- else
- aspect_ratio = 0;
-
- input_settings_class = META_INPUT_SETTINGS_GET_CLASS (input_settings);
- input_settings_class->set_tablet_aspect_ratio (input_settings, device, aspect_ratio);
-}
-
-static void
-update_tablet_mapping (MetaInputSettings *input_settings,
- GSettings *settings,
- ClutterInputDevice *device)
-{
- MetaInputSettingsClass *input_settings_class;
- GDesktopTabletMapping mapping;
-
- if (clutter_input_device_get_device_type (device) != CLUTTER_TABLET_DEVICE &&
- clutter_input_device_get_device_type (device) != CLUTTER_PEN_DEVICE &&
- clutter_input_device_get_device_type (device) != CLUTTER_ERASER_DEVICE)
- return;
-
-#ifdef HAVE_LIBWACOM
- {
- WacomDevice *wacom_device;
-
- wacom_device = meta_input_device_get_wacom_device (META_INPUT_DEVICE (device));
-
- /* Tablet mapping only makes sense on external tablets */
- if (wacom_device &&
- (libwacom_get_integration_flags (wacom_device) != WACOM_DEVICE_INTEGRATED_NONE))
- return;
- }
-#endif
-
- input_settings_class = META_INPUT_SETTINGS_GET_CLASS (input_settings);
- mapping = g_settings_get_enum (settings, "mapping");
-
- settings_device_set_uint_setting (input_settings, device,
- input_settings_class->set_tablet_mapping,
- mapping);
-}
-
-static void
-update_tablet_area (MetaInputSettings *input_settings,
- GSettings *settings,
- ClutterInputDevice *device)
-{
- MetaInputSettingsClass *input_settings_class;
- GVariant *variant;
- const gdouble *area;
- gsize n_elems;
-
- if (clutter_input_device_get_device_type (device) != CLUTTER_TABLET_DEVICE &&
- clutter_input_device_get_device_type (device) != CLUTTER_PEN_DEVICE &&
- clutter_input_device_get_device_type (device) != CLUTTER_ERASER_DEVICE)
- return;
-
-#ifdef HAVE_LIBWACOM
- {
- WacomDevice *wacom_device;
-
- wacom_device = meta_input_device_get_wacom_device (META_INPUT_DEVICE (device));
-
- /* Tablet area only makes sense on system/display integrated tablets */
- if (wacom_device &&
- (libwacom_get_integration_flags (wacom_device) &
- (WACOM_DEVICE_INTEGRATED_SYSTEM | WACOM_DEVICE_INTEGRATED_DISPLAY)) == 0)
- return;
- }
-#endif
-
- input_settings_class = META_INPUT_SETTINGS_GET_CLASS (input_settings);
- variant = g_settings_get_value (settings, "area");
-
- area = g_variant_get_fixed_array (variant, &n_elems, sizeof (gdouble));
- if (n_elems == 4)
- {
- input_settings_class->set_tablet_area (input_settings, device,
- area[0], area[1],
- area[2], area[3]);
- }
-
- g_variant_unref (variant);
-}
-
-static void
-update_tablet_left_handed (MetaInputSettings *input_settings,
- GSettings *settings,
- ClutterInputDevice *device)
-{
- MetaInputSettingsClass *input_settings_class;
- gboolean enabled;
-
- if (clutter_input_device_get_device_type (device) != CLUTTER_TABLET_DEVICE &&
- clutter_input_device_get_device_type (device) != CLUTTER_PEN_DEVICE &&
- clutter_input_device_get_device_type (device) != CLUTTER_ERASER_DEVICE &&
- clutter_input_device_get_device_type (device) != CLUTTER_PAD_DEVICE)
- return;
-
-#ifdef HAVE_LIBWACOM
- {
- WacomDevice *wacom_device;
-
- wacom_device = meta_input_device_get_wacom_device (META_INPUT_DEVICE (device));
-
- /* Left handed mode only makes sense on external tablets */
- if (wacom_device &&
- (libwacom_get_integration_flags (wacom_device) != WACOM_DEVICE_INTEGRATED_NONE))
- return;
- }
-#endif
-
- input_settings_class = META_INPUT_SETTINGS_GET_CLASS (input_settings);
- enabled = g_settings_get_boolean (settings, "left-handed");
-
- settings_device_set_bool_setting (input_settings, device,
- input_settings_class->set_left_handed,
- enabled);
-}
-
-static void
-meta_input_settings_changed_cb (GSettings *settings,
- const char *key,
- gpointer user_data)
-{
- MetaInputSettings *input_settings = META_INPUT_SETTINGS (user_data);
- MetaInputSettingsPrivate *priv = meta_input_settings_get_instance_private (input_settings);
-
- if (settings == priv->mouse_settings)
- {
- if (strcmp (key, "left-handed") == 0)
- update_mouse_left_handed (input_settings, NULL);
- else if (strcmp (key, "speed") == 0)
- update_device_speed (input_settings, NULL);
- else if (strcmp (key, "natural-scroll") == 0)
- update_device_natural_scroll (input_settings, NULL);
- else if (strcmp (key, "accel-profile") == 0)
- update_pointer_accel_profile (input_settings, settings, NULL);
- else if (strcmp (key, "middle-click-emulation") == 0)
- update_middle_click_emulation (input_settings, settings, NULL);
- }
- else if (settings == priv->touchpad_settings)
- {
- if (strcmp (key, "left-handed") == 0)
- update_touchpad_left_handed (input_settings, NULL);
- else if (strcmp (key, "speed") == 0)
- update_device_speed (input_settings, NULL);
- else if (strcmp (key, "natural-scroll") == 0)
- update_device_natural_scroll (input_settings, NULL);
- else if (strcmp (key, "tap-to-click") == 0)
- update_touchpad_tap_enabled (input_settings, NULL);
- else if (strcmp (key, "tap-button-map") == 0)
- update_touchpad_tap_button_map (input_settings, NULL);
- else if (strcmp (key, "tap-and-drag") == 0)
- update_touchpad_tap_and_drag_enabled (input_settings, NULL);
- else if (strcmp (key, "tap-and-drag-lock") == 0)
- update_touchpad_tap_and_drag_lock_enabled (input_settings, NULL);
- else if (strcmp(key, "disable-while-typing") == 0)
- update_touchpad_disable_while_typing (input_settings, NULL);
- else if (strcmp (key, "send-events") == 0)
- update_touchpad_send_events (input_settings, NULL);
- else if (strcmp (key, "edge-scrolling-enabled") == 0)
- update_touchpad_edge_scroll (input_settings, NULL);
- else if (strcmp (key, "two-finger-scrolling-enabled") == 0)
- update_touchpad_two_finger_scroll (input_settings, NULL);
- else if (strcmp (key, "click-method") == 0)
- update_touchpad_click_method (input_settings, NULL);
- else if (strcmp (key, "middle-click-emulation") == 0)
- update_middle_click_emulation (input_settings, settings, NULL);
- }
- else if (settings == priv->trackball_settings)
- {
- if (strcmp (key, "scroll-wheel-emulation-button") == 0 ||
- strcmp (key, "scroll-wheel-emulation-button-lock") == 0)
- update_trackball_scroll_button (input_settings, NULL);
- else if (strcmp (key, "accel-profile") == 0)
- update_pointer_accel_profile (input_settings, settings, NULL);
- else if (strcmp (key, "middle-click-emulation") == 0)
- update_middle_click_emulation (input_settings, settings, NULL);
- }
- else if (settings == priv->keyboard_settings)
- {
- if (strcmp (key, "repeat") == 0 ||
- strcmp (key, "repeat-interval") == 0 ||
- strcmp (key, "delay") == 0)
- update_keyboard_repeat (input_settings);
- }
-}
-
-static void
-mapped_device_changed_cb (GSettings *settings,
- const gchar *key,
- DeviceMappingInfo *info)
-{
- if (strcmp (key, "mapping") == 0)
- update_tablet_mapping (info->input_settings, settings, info->device);
- else if (strcmp (key, "area") == 0)
- update_tablet_area (info->input_settings, settings, info->device);
- else if (strcmp (key, "keep-aspect") == 0)
- update_tablet_keep_aspect (info->input_settings, settings, info->device);
- else if (strcmp (key, "left-handed") == 0)
- update_tablet_left_handed (info->input_settings, settings, info->device);
-}
-
-static void
-apply_mappable_device_settings (MetaInputSettings *input_settings,
- DeviceMappingInfo *info)
-{
- ClutterInputDeviceType device_type;
-
- device_type = clutter_input_device_get_device_type (info->device);
-
- if (device_type == CLUTTER_TABLET_DEVICE ||
- device_type == CLUTTER_PEN_DEVICE ||
- device_type == CLUTTER_ERASER_DEVICE ||
- device_type == CLUTTER_PAD_DEVICE)
- {
- update_tablet_mapping (input_settings, info->settings, info->device);
- update_tablet_area (input_settings, info->settings, info->device);
- update_tablet_keep_aspect (input_settings, info->settings, info->device);
- update_tablet_left_handed (input_settings, info->settings, info->device);
- }
-}
-
-struct _keyboard_a11y_settings_flags_pair {
- const char *name;
- MetaKeyboardA11yFlags flag;
-} keyboard_a11y_settings_flags_pair[] = {
- { "enable", META_A11Y_KEYBOARD_ENABLED },
- { "timeout-enable", META_A11Y_TIMEOUT_ENABLED },
- { "mousekeys-enable", META_A11Y_MOUSE_KEYS_ENABLED },
- { "slowkeys-enable", META_A11Y_SLOW_KEYS_ENABLED },
- { "slowkeys-beep-press", META_A11Y_SLOW_KEYS_BEEP_PRESS },
- { "slowkeys-beep-accept", META_A11Y_SLOW_KEYS_BEEP_ACCEPT },
- { "slowkeys-beep-reject", META_A11Y_SLOW_KEYS_BEEP_REJECT },
- { "bouncekeys-enable", META_A11Y_BOUNCE_KEYS_ENABLED },
- { "bouncekeys-beep-reject", META_A11Y_BOUNCE_KEYS_BEEP_REJECT },
- { "togglekeys-enable", META_A11Y_TOGGLE_KEYS_ENABLED },
- { "stickykeys-enable", META_A11Y_STICKY_KEYS_ENABLED },
- { "stickykeys-modifier-beep", META_A11Y_STICKY_KEYS_BEEP },
- { "stickykeys-two-key-off", META_A11Y_STICKY_KEYS_TWO_KEY_OFF },
- { "feature-state-change-beep", META_A11Y_FEATURE_STATE_CHANGE_BEEP },
-};
-
-static void
-load_keyboard_a11y_settings (MetaInputSettings *input_settings)
-{
- MetaInputSettingsPrivate *priv = meta_input_settings_get_instance_private (input_settings);
- MetaKbdA11ySettings kbd_a11y_settings = { 0 };
- guint i;
-
- kbd_a11y_settings.controls = 0;
- for (i = 0; i < G_N_ELEMENTS (keyboard_a11y_settings_flags_pair); i++)
- {
- if (g_settings_get_boolean (priv->keyboard_a11y_settings, keyboard_a11y_settings_flags_pair[i].name))
- kbd_a11y_settings.controls |= keyboard_a11y_settings_flags_pair[i].flag;
- }
-
- kbd_a11y_settings.timeout_delay = g_settings_get_int (priv->keyboard_a11y_settings,
- "disable-timeout");
- kbd_a11y_settings.slowkeys_delay = g_settings_get_int (priv->keyboard_a11y_settings,
- "slowkeys-delay");
- kbd_a11y_settings.debounce_delay = g_settings_get_int (priv->keyboard_a11y_settings,
- "bouncekeys-delay");
- kbd_a11y_settings.mousekeys_init_delay = g_settings_get_int (priv->keyboard_a11y_settings,
- "mousekeys-init-delay");
- kbd_a11y_settings.mousekeys_max_speed = g_settings_get_int (priv->keyboard_a11y_settings,
- "mousekeys-max-speed");
- kbd_a11y_settings.mousekeys_accel_time = g_settings_get_int (priv->keyboard_a11y_settings,
- "mousekeys-accel-time");
-
- priv->kbd_a11y_settings = kbd_a11y_settings;
- g_signal_emit (input_settings, signals[KBD_A11Y_CHANGED], 0, &priv->kbd_a11y_settings);
-}
-
-void
-meta_input_settings_notify_kbd_a11y_change (MetaInputSettings *input_settings,
- MetaKeyboardA11yFlags new_flags,
- MetaKeyboardA11yFlags what_changed)
-{
- MetaInputSettingsPrivate *priv = meta_input_settings_get_instance_private (input_settings);
- guint i;
-
- for (i = 0; i < G_N_ELEMENTS (keyboard_a11y_settings_flags_pair); i++)
- {
- if (keyboard_a11y_settings_flags_pair[i].flag & what_changed)
- g_settings_set_boolean (priv->keyboard_a11y_settings,
- keyboard_a11y_settings_flags_pair[i].name,
- (new_flags & keyboard_a11y_settings_flags_pair[i].flag) ? TRUE : FALSE);
- }
-}
-
-static void
-meta_input_keyboard_a11y_settings_changed (GSettings *settings,
- const char *key,
- gpointer user_data)
-{
- MetaInputSettings *input_settings = META_INPUT_SETTINGS (user_data);
-
- load_keyboard_a11y_settings (input_settings);
-}
-
-static GSettings *
-lookup_device_settings (ClutterInputDevice *device)
-{
- const gchar *group, *schema, *vendor, *product;
- ClutterInputDeviceType type;
- GSettings *settings;
- gchar *path;
-
- type = clutter_input_device_get_device_type (device);
-
- if (type == CLUTTER_TOUCHSCREEN_DEVICE)
- {
- group = "touchscreens";
- schema = "org.gnome.desktop.peripherals.touchscreen";
- }
- else if (type == CLUTTER_TABLET_DEVICE ||
- type == CLUTTER_PEN_DEVICE ||
- type == CLUTTER_ERASER_DEVICE ||
- type == CLUTTER_CURSOR_DEVICE ||
- type == CLUTTER_PAD_DEVICE)
- {
- group = "tablets";
- schema = "org.gnome.desktop.peripherals.tablet";
- }
- else
- return NULL;
-
- vendor = clutter_input_device_get_vendor_id (device);
- product = clutter_input_device_get_product_id (device);
- path = g_strdup_printf ("/org/gnome/desktop/peripherals/%s/%s:%s/",
- group, vendor, product);
-
- settings = g_settings_new_with_path (schema, path);
- g_free (path);
-
- return settings;
-}
-
-static GSettings *
-lookup_tool_settings (ClutterInputDeviceTool *tool,
- ClutterInputDevice *device)
-{
- GSettings *tool_settings;
- guint64 serial;
- gchar *path;
-
- tool_settings = g_object_get_qdata (G_OBJECT (tool), quark_tool_settings);
- if (tool_settings)
- return tool_settings;
-
- serial = clutter_input_device_tool_get_serial (tool);
-
- /* The Wacom driver uses serial 1 for serial-less devices but 1 is not a
- * real serial, so let's custom-case this */
- if (serial == 0 || serial == 1)
- {
- path = g_strdup_printf ("/org/gnome/desktop/peripherals/stylus/default-%s:%s/",
- clutter_input_device_get_vendor_id (device),
- clutter_input_device_get_product_id (device));
- }
- else
- {
- path = g_strdup_printf ("/org/gnome/desktop/peripherals/stylus/%" G_GINT64_MODIFIER "x/",
- serial);
- }
-
- tool_settings =
- g_settings_new_with_path ("org.gnome.desktop.peripherals.tablet.stylus",
- path);
- g_object_set_qdata_full (G_OBJECT (tool), quark_tool_settings, tool_settings,
- (GDestroyNotify) g_object_unref);
- g_free (path);
-
- return tool_settings;
-}
-
-static void
-device_mapping_info_free (DeviceMappingInfo *info)
-{
- g_clear_signal_handler (&info->changed_id, info->settings);
- g_object_unref (info->settings);
- g_free (info->group_modes);
- g_free (info);
-}
-
-static gboolean
-check_add_mappable_device (MetaInputSettings *input_settings,
- ClutterInputDevice *device)
-{
- MetaInputSettingsPrivate *priv;
- DeviceMappingInfo *info;
- ClutterInputDeviceType device_type;
- GSettings *settings;
-
- device_type = clutter_input_device_get_device_type (device);
-
- if ((device_type == CLUTTER_TABLET_DEVICE ||
- device_type == CLUTTER_PEN_DEVICE ||
- device_type == CLUTTER_ERASER_DEVICE ||
- device_type == CLUTTER_PAD_DEVICE) &&
- g_getenv ("MUTTER_DISABLE_WACOM_CONFIGURATION") != NULL)
- return FALSE;
-
- settings = lookup_device_settings (device);
-
- if (!settings)
- return FALSE;
-
- priv = meta_input_settings_get_instance_private (input_settings);
-
- info = g_new0 (DeviceMappingInfo, 1);
- info->input_settings = input_settings;
- info->device = device;
- info->settings = settings;
-
- if (device_type == CLUTTER_PAD_DEVICE)
- {
- info->group_modes =
- g_new0 (guint, clutter_input_device_get_n_mode_groups (device));
- }
-
- info->changed_id = g_signal_connect (settings, "changed",
- G_CALLBACK (mapped_device_changed_cb),
- info);
-
- g_hash_table_insert (priv->mappable_devices, device, info);
-
- apply_mappable_device_settings (input_settings, info);
-
- return TRUE;
-}
-
-static void
-apply_device_settings (MetaInputSettings *input_settings,
- ClutterInputDevice *device)
-{
- MetaInputSettingsPrivate *priv =
- meta_input_settings_get_instance_private (input_settings);
-
- update_device_speed (input_settings, device);
- update_device_natural_scroll (input_settings, device);
-
- update_mouse_left_handed (input_settings, device);
- update_pointer_accel_profile (input_settings,
- priv->mouse_settings,
- device);
-
- update_touchpad_left_handed (input_settings, device);
- update_touchpad_tap_enabled (input_settings, device);
- update_touchpad_tap_button_map (input_settings, device);
- update_touchpad_tap_and_drag_enabled (input_settings, device);
- update_touchpad_tap_and_drag_lock_enabled (input_settings, device);
- update_touchpad_disable_while_typing (input_settings, device);
- update_touchpad_send_events (input_settings, device);
- update_touchpad_two_finger_scroll (input_settings, device);
- update_touchpad_edge_scroll (input_settings, device);
- update_touchpad_click_method (input_settings, device);
-
- update_trackball_scroll_button (input_settings, device);
- update_pointer_accel_profile (input_settings,
- priv->trackball_settings,
- device);
-
- update_middle_click_emulation (input_settings, priv->mouse_settings, device);
- update_middle_click_emulation (input_settings, priv->touchpad_settings, device);
- update_middle_click_emulation (input_settings, priv->trackball_settings, device);
-}
-
-static void
-update_stylus_pressure (MetaInputSettings *input_settings,
- ClutterInputDevice *device,
- ClutterInputDeviceTool *tool)
-{
- MetaInputSettingsClass *input_settings_class;
- GSettings *tool_settings;
- const gint32 *curve;
- GVariant *variant;
- gsize n_elems;
-
- if (clutter_input_device_get_device_type (device) != CLUTTER_TABLET_DEVICE &&
- clutter_input_device_get_device_type (device) != CLUTTER_PEN_DEVICE &&
- clutter_input_device_get_device_type (device) != CLUTTER_ERASER_DEVICE)
- return;
-
- if (!tool)
- return;
-
- tool_settings = lookup_tool_settings (tool, device);
-
- if (clutter_input_device_tool_get_tool_type (tool) ==
- CLUTTER_INPUT_DEVICE_TOOL_ERASER)
- variant = g_settings_get_value (tool_settings, "eraser-pressure-curve");
- else
- variant = g_settings_get_value (tool_settings, "pressure-curve");
-
- curve = g_variant_get_fixed_array (variant, &n_elems, sizeof (gint32));
- if (n_elems != 4)
- return;
-
- input_settings_class = META_INPUT_SETTINGS_GET_CLASS (input_settings);
- input_settings_class->set_stylus_pressure (input_settings, device, tool, curve);
-}
-
-static void
-update_stylus_buttonmap (MetaInputSettings *input_settings,
- ClutterInputDevice *device,
- ClutterInputDeviceTool *tool)
-{
- MetaInputSettingsClass *input_settings_class;
- GDesktopStylusButtonAction primary, secondary, tertiary;
- GSettings *tool_settings;
-
- if (clutter_input_device_get_device_type (device) != CLUTTER_TABLET_DEVICE &&
- clutter_input_device_get_device_type (device) != CLUTTER_PEN_DEVICE &&
- clutter_input_device_get_device_type (device) != CLUTTER_ERASER_DEVICE)
- return;
-
- if (!tool)
- return;
-
- tool_settings = lookup_tool_settings (tool, device);
-
- primary = g_settings_get_enum (tool_settings, "button-action");
- secondary = g_settings_get_enum (tool_settings, "secondary-button-action");
- tertiary = g_settings_get_enum (tool_settings, "tertiary-button-action");
-
- input_settings_class = META_INPUT_SETTINGS_GET_CLASS (input_settings);
- input_settings_class->set_stylus_button_map (input_settings, device, tool,
- primary, secondary, tertiary);
-}
-
-static void
-apply_stylus_settings (MetaInputSettings *input_settings,
- ClutterInputDevice *device,
- ClutterInputDeviceTool *tool)
-{
- update_stylus_pressure (input_settings, device, tool);
- update_stylus_buttonmap (input_settings, device, tool);
-}
-
-static void
-evaluate_two_finger_scrolling (MetaInputSettings *input_settings,
- ClutterInputDevice *device)
-{
- MetaInputSettingsClass *klass;
- MetaInputSettingsPrivate *priv;
-
- if (clutter_input_device_get_device_type (device) != CLUTTER_TOUCHPAD_DEVICE)
- return;
-
- klass = META_INPUT_SETTINGS_GET_CLASS (input_settings);
- priv = meta_input_settings_get_instance_private (input_settings);
-
- if (klass->has_two_finger_scroll (input_settings, device))
- g_hash_table_add (priv->two_finger_devices, device);
-}
-
-void
-meta_input_settings_add_device (MetaInputSettings *input_settings,
- ClutterInputDevice *device)
-{
- MetaInputSettingsPrivate *priv =
- meta_input_settings_get_instance_private (input_settings);
-
- if (clutter_input_device_get_device_mode (device) == CLUTTER_INPUT_MODE_LOGICAL)
- return;
-
- priv->devices = g_list_prepend (priv->devices, device);
- evaluate_two_finger_scrolling (input_settings, device);
-
- apply_device_settings (input_settings, device);
- check_add_mappable_device (input_settings, device);
-}
-
-void
-meta_input_settings_remove_device (MetaInputSettings *input_settings,
- ClutterInputDevice *device)
-{
- MetaInputSettingsPrivate *priv;
-
- priv = meta_input_settings_get_instance_private (input_settings);
- g_hash_table_remove (priv->mappable_devices, device);
- g_hash_table_remove (priv->current_tools, device);
-
- if (g_hash_table_remove (priv->two_finger_devices, device) &&
- g_hash_table_size (priv->two_finger_devices) == 0)
- apply_device_settings (input_settings, NULL);
-
- priv->devices = g_list_remove (priv->devices, device);
-}
-
-static void
-current_tool_changed_cb (GSettings *settings,
- const char *key,
- gpointer user_data)
-{
- CurrentToolInfo *info = user_data;
-
- apply_stylus_settings (info->input_settings, info->device, info->tool);
-}
-
-static CurrentToolInfo *
-current_tool_info_new (MetaInputSettings *input_settings,
- ClutterInputDevice *device,
- ClutterInputDeviceTool *tool)
-{
- CurrentToolInfo *info;
-
- info = g_new0 (CurrentToolInfo, 1);
- info->input_settings = input_settings;
- info->device = device;
- info->tool = tool;
- info->settings = lookup_tool_settings (tool, device);
- info->changed_id =
- g_signal_connect (info->settings, "changed",
- G_CALLBACK (current_tool_changed_cb),
- info);
- return info;
-}
-
-static void
-current_tool_info_free (CurrentToolInfo *info)
-{
- g_clear_signal_handler (&info->changed_id, info->settings);
- g_free (info);
-}
-
-void
-meta_input_settings_notify_tool_change (MetaInputSettings *input_settings,
- ClutterInputDevice *device,
- ClutterInputDeviceTool *tool)
-{
- MetaInputSettingsPrivate *priv;
-
- priv = meta_input_settings_get_instance_private (input_settings);
-
- if (tool)
- {
- CurrentToolInfo *current_tool;
-
- current_tool = current_tool_info_new (input_settings, device, tool);
- g_hash_table_insert (priv->current_tools, device, current_tool);
- apply_stylus_settings (input_settings, device, tool);
- }
- else
- {
- g_hash_table_remove (priv->current_tools, device);
- }
-}
-
-static void
-check_mappable_devices (MetaInputSettings *input_settings)
-{
- MetaInputSettingsPrivate *priv;
- GList *l;
-
- priv = meta_input_settings_get_instance_private (input_settings);
-
- for (l = priv->devices; l; l = l->next)
- {
- ClutterInputDevice *device = l->data;
-
- if (clutter_input_device_get_device_mode (device) == CLUTTER_INPUT_MODE_LOGICAL)
- continue;
-
- check_add_mappable_device (input_settings, device);
- }
-}
-
-static void
-meta_input_settings_constructed (GObject *object)
-{
- MetaInputSettings *input_settings = META_INPUT_SETTINGS (object);
- GSList *devices, *d;
-
- devices = meta_input_settings_get_devices (input_settings, CLUTTER_TOUCHPAD_DEVICE);
- for (d = devices; d; d = d->next)
- evaluate_two_finger_scrolling (input_settings, d->data);
-
- g_slist_free (devices);
-
- apply_device_settings (input_settings, NULL);
- update_keyboard_repeat (input_settings);
- check_mappable_devices (input_settings);
-
- load_keyboard_a11y_settings (input_settings);
-}
-
-static void
-meta_input_settings_class_init (MetaInputSettingsClass *klass)
-{
- GObjectClass *object_class = G_OBJECT_CLASS (klass);
-
- object_class->dispose = meta_input_settings_dispose;
- object_class->constructed = meta_input_settings_constructed;
-
- quark_tool_settings =
- g_quark_from_static_string ("meta-input-settings-tool-settings");
-
- signals[KBD_A11Y_CHANGED] =
- g_signal_new ("kbd-a11y-changed",
- G_TYPE_FROM_CLASS (object_class),
- G_SIGNAL_RUN_LAST,
- 0, NULL, NULL, NULL,
- G_TYPE_NONE, 1,
- G_TYPE_POINTER);
-
-}
-
-static void
-meta_input_settings_init (MetaInputSettings *settings)
-{
- MetaInputSettingsPrivate *priv;
-
- priv = meta_input_settings_get_instance_private (settings);
-
- priv->mouse_settings = g_settings_new ("org.gnome.desktop.peripherals.mouse");
- g_signal_connect (priv->mouse_settings, "changed",
- G_CALLBACK (meta_input_settings_changed_cb), settings);
-
- priv->touchpad_settings = g_settings_new ("org.gnome.desktop.peripherals.touchpad");
- g_signal_connect (priv->touchpad_settings, "changed",
- G_CALLBACK (meta_input_settings_changed_cb), settings);
-
- priv->trackball_settings = g_settings_new ("org.gnome.desktop.peripherals.trackball");
- g_signal_connect (priv->trackball_settings, "changed",
- G_CALLBACK (meta_input_settings_changed_cb), settings);
-
- priv->keyboard_settings = g_settings_new ("org.gnome.desktop.peripherals.keyboard");
- g_signal_connect (priv->keyboard_settings, "changed",
- G_CALLBACK (meta_input_settings_changed_cb), settings);
-
- priv->keyboard_a11y_settings = g_settings_new ("org.gnome.desktop.a11y.keyboard");
- g_signal_connect (priv->keyboard_a11y_settings, "changed",
- G_CALLBACK (meta_input_keyboard_a11y_settings_changed), settings);
-
- priv->mappable_devices =
- g_hash_table_new_full (NULL, NULL, NULL, (GDestroyNotify) device_mapping_info_free);
-
- priv->current_tools =
- g_hash_table_new_full (NULL, NULL, NULL, (GDestroyNotify) current_tool_info_free);
-
- priv->two_finger_devices = g_hash_table_new (NULL, NULL);
-}
-
-void
-meta_input_settings_maybe_save_numlock_state (MetaInputSettings *input_settings,
- gboolean numlock_state)
-{
- MetaInputSettingsPrivate *priv;
-
- priv = meta_input_settings_get_instance_private (input_settings);
-
- if (!g_settings_get_boolean (priv->keyboard_settings, "remember-numlock-state"))
- return;
-
- if (numlock_state == g_settings_get_boolean (priv->keyboard_settings, "numlock-state"))
- return;
-
- g_settings_set_boolean (priv->keyboard_settings, "numlock-state", numlock_state);
-}
-
-gboolean
-meta_input_settings_maybe_restore_numlock_state (MetaInputSettings *input_settings)
-{
- MetaInputSettingsPrivate *priv;
- gboolean numlock_state = FALSE;
-
- priv = meta_input_settings_get_instance_private (input_settings);
-
- if (g_settings_get_boolean (priv->keyboard_settings, "remember-numlock-state"))
- numlock_state = g_settings_get_boolean (priv->keyboard_settings, "numlock-state");
-
- return numlock_state;
-}
-
-void
-meta_input_settings_set_device_matrix (MetaInputSettings *input_settings,
- ClutterInputDevice *device,
- float matrix[6])
-{
- g_return_if_fail (META_IS_INPUT_SETTINGS (input_settings));
- g_return_if_fail (CLUTTER_IS_INPUT_DEVICE (device));
-
- META_INPUT_SETTINGS_GET_CLASS (input_settings)->set_matrix (input_settings,
- device,
- matrix);
-}
-
-void
-meta_input_settings_set_device_enabled (MetaInputSettings *input_settings,
- ClutterInputDevice *device,
- gboolean enabled)
-{
- GDesktopDeviceSendEvents mode;
-
- g_return_if_fail (META_IS_INPUT_SETTINGS (input_settings));
- g_return_if_fail (CLUTTER_IS_INPUT_DEVICE (device));
-
- mode = enabled ?
- G_DESKTOP_DEVICE_SEND_EVENTS_ENABLED :
- G_DESKTOP_DEVICE_SEND_EVENTS_DISABLED;
-
- META_INPUT_SETTINGS_GET_CLASS (input_settings)->set_send_events (input_settings,
- device,
- mode);
-}
-
-void
-meta_input_settings_set_device_aspect_ratio (MetaInputSettings *input_settings,
- ClutterInputDevice *device,
- double aspect_ratio)
-{
- MetaInputSettingsPrivate *priv;
- DeviceMappingInfo *info;
-
- g_return_if_fail (META_IS_INPUT_SETTINGS (input_settings));
- g_return_if_fail (CLUTTER_IS_INPUT_DEVICE (device));
-
- priv = meta_input_settings_get_instance_private (input_settings);
-
- info = g_hash_table_lookup (priv->mappable_devices, device);
- if (!info)
- return;
-
- info->aspect_ratio = aspect_ratio;
- update_tablet_keep_aspect (input_settings, info->settings, device);
-}
-
-void
-meta_input_settings_get_kbd_a11y_settings (MetaInputSettings *input_settings,
- MetaKbdA11ySettings *a11y_settings)
-{
- MetaInputSettingsPrivate *priv;
-
- g_return_if_fail (META_IS_INPUT_SETTINGS (input_settings));
-
- priv = meta_input_settings_get_instance_private (input_settings);
-
- *a11y_settings = priv->kbd_a11y_settings;
-}