diff options
author | monsta <[email protected]> | 2016-10-31 16:47:44 +0300 |
---|---|---|
committer | monsta <[email protected]> | 2016-10-31 16:55:22 +0300 |
commit | 76e0ee3104a68d57e85aa4148702a888c0677bdf (patch) | |
tree | 71372fe1e499c2c13ad1149ddc630bd0a6e3e1ff | |
parent | 6ba80db4f66b7f5a034d616796e5c951df8992a1 (diff) | |
download | mate-settings-daemon-76e0ee3104a68d57e85aa4148702a888c0677bdf.tar.bz2 mate-settings-daemon-76e0ee3104a68d57e85aa4148702a888c0677bdf.tar.xz |
mouse: add key for separate touchpad handedness (left/right-handed)
schema: org.mate.peripherals-touchpad
key: left-handed (same name as in peripherals-mouse schema)
values: 'right', 'left', 'mouse'
default value: 'mouse' - follow the corresponding mouse setting
(to keep the default behaviour same as before)
adapted from:
https://git.gnome.org/browse/gnome-settings-daemon/commit/?id=59ec6da345fa6d20c13d44f9cfe4f607cb1eeea3
https://git.gnome.org/browse/gnome-settings-daemon/commit/?id=ccaf750510e8797f22045490eb37d39693023ec6
-rw-r--r-- | data/org.mate.peripherals-touchpad.gschema.xml.in | 10 | ||||
-rw-r--r-- | plugins/mouse/msd-mouse-manager.c | 51 |
2 files changed, 54 insertions, 7 deletions
diff --git a/data/org.mate.peripherals-touchpad.gschema.xml.in b/data/org.mate.peripherals-touchpad.gschema.xml.in index eab7d6b..d3557dd 100644 --- a/data/org.mate.peripherals-touchpad.gschema.xml.in +++ b/data/org.mate.peripherals-touchpad.gschema.xml.in @@ -1,4 +1,9 @@ <schemalist gettext-domain="@GETTEXT_PACKAGE@"> + <enum id="org.mate.peripherals-touchpad.Handedness"> + <value nick="right" value="0"/> + <value nick="left" value="1"/> + <value nick="mouse" value="2"/> + </enum> <schema id="org.mate.peripherals-touchpad" path="/org/mate/desktop/peripherals/touchpad/"> <key name="disable-while-typing" type="b"> <default>false</default> @@ -65,5 +70,10 @@ <summary>Three finger tap button</summary> <description>Select the button mapping for three-finger tap. Supported values are: 1: left mouse button 2: middle mouse button 3: right mouse button</description> </key> + <key name="left-handed" enum="org.mate.peripherals-touchpad.Handedness"> + <default>'mouse'</default> + <summary>Touchpad button orientation</summary> + <description>Swap left and right buttons for left-handed touchpads with 'left', 'right' for right-handed, 'mouse' to follow the mouse setting.</description> + </key> </schema> </schemalist> diff --git a/plugins/mouse/msd-mouse-manager.c b/plugins/mouse/msd-mouse-manager.c index 32f8c1a..305bf88 100644 --- a/plugins/mouse/msd-mouse-manager.c +++ b/plugins/mouse/msd-mouse-manager.c @@ -72,6 +72,7 @@ #define KEY_VERT_TWO_FINGER_SCROLL "vertical-two-finger-scrolling" #define KEY_HORIZ_TWO_FINGER_SCROLL "horizontal-two-finger-scrolling" #define KEY_TOUCHPAD_ENABLED "touchpad-enabled" +#define KEY_TOUCHPAD_LEFT_HANDED "left-handed" /* NOTE: here it's enum, not boolean */ #if 0 /* FIXME need to fork (?) mousetweaks for this to work */ @@ -94,6 +95,12 @@ struct MsdMouseManagerPrivate GPid locate_pointer_pid; }; +typedef enum { + TOUCHPAD_HANDEDNESS_RIGHT, + TOUCHPAD_HANDEDNESS_LEFT, + TOUCHPAD_HANDEDNESS_MOUSE +} TouchpadHandedness; + static void msd_mouse_manager_class_init (MsdMouseManagerClass *klass); static void msd_mouse_manager_init (MsdMouseManager *mouse_manager); static void msd_mouse_manager_finalize (GObject *object); @@ -242,12 +249,14 @@ touchpad_has_single_button (XDevice *device) static void set_left_handed (MsdMouseManager *manager, XDeviceInfo *device_info, - gboolean left_handed) + gboolean mouse_left_handed, + gboolean touchpad_left_handed) { XDevice *device; guchar *buttons; gsize buttons_capacity = 16; gint n_buttons; + gboolean left_handed; if ((device_info->use == IsXPointer) || (device_info->use == IsXKeyboard) || @@ -262,6 +271,8 @@ set_left_handed (MsdMouseManager *manager, gboolean tap = g_settings_get_boolean (manager->priv->settings_touchpad, KEY_TOUCHPAD_TAP_TO_CLICK); gboolean single_button = touchpad_has_single_button (device); + left_handed = touchpad_left_handed; + if (tap && !single_button) { gint one_finger_tap = g_settings_get_int (manager->priv->settings_touchpad, KEY_TOUCHPAD_ONE_FINGER_TAP); gint two_finger_tap = g_settings_get_int (manager->priv->settings_touchpad, KEY_TOUCHPAD_TWO_FINGER_TAP); @@ -273,6 +284,8 @@ set_left_handed (MsdMouseManager *manager, if (single_button) return; + } else { + left_handed = mouse_left_handed; } gdk_error_trap_push (); @@ -308,7 +321,8 @@ set_left_handed (MsdMouseManager *manager, static void set_left_handed_all (MsdMouseManager *manager, - gboolean left_handed) + gboolean mouse_left_handed, + gboolean touchpad_left_handed) { XDeviceInfo *device_info; gint n_devices; @@ -317,7 +331,7 @@ set_left_handed_all (MsdMouseManager *manager, device_info = XListInputDevices (GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()), &n_devices); for (i = 0; i < n_devices; i++) { - set_left_handed (manager, &device_info[i], left_handed); + set_left_handed (manager, &device_info[i], mouse_left_handed, touchpad_left_handed); } if (device_info != NULL) @@ -523,6 +537,22 @@ set_disable_w_typing (MsdMouseManager *manager, gboolean state) } } +static gboolean +get_touchpad_handedness (MsdMouseManager *manager, + gboolean mouse_left_handed) +{ + switch (g_settings_get_enum (manager->priv->settings_touchpad, KEY_TOUCHPAD_LEFT_HANDED)) { + case TOUCHPAD_HANDEDNESS_RIGHT: + return FALSE; + case TOUCHPAD_HANDEDNESS_LEFT: + return TRUE; + case TOUCHPAD_HANDEDNESS_MOUSE: + return mouse_left_handed; + default: + g_assert_not_reached (); + } +} + static void set_tap_to_click (MsdMouseManager *manager, XDeviceInfo *device_info, @@ -589,7 +619,7 @@ set_tap_to_click_all (MsdMouseManager *manager) return; gboolean state = g_settings_get_boolean (manager->priv->settings_touchpad, KEY_TOUCHPAD_TAP_TO_CLICK); - gboolean left_handed = g_settings_get_boolean (manager->priv->settings_mouse, KEY_MOUSE_LEFT_HANDED); + gboolean left_handed = get_touchpad_handedness (manager, g_settings_get_boolean (manager->priv->settings_mouse, KEY_MOUSE_LEFT_HANDED)); gint one_finger_tap = g_settings_get_int (manager->priv->settings_touchpad, KEY_TOUCHPAD_ONE_FINGER_TAP); gint two_finger_tap = g_settings_get_int (manager->priv->settings_touchpad, KEY_TOUCHPAD_TWO_FINGER_TAP); gint three_finger_tap = g_settings_get_int (manager->priv->settings_touchpad, KEY_TOUCHPAD_THREE_FINGER_TAP); @@ -947,9 +977,10 @@ set_mousetweaks_daemon (MsdMouseManager *manager, static void set_mouse_settings (MsdMouseManager *manager) { - gboolean left_handed = g_settings_get_boolean (manager->priv->settings_mouse, KEY_MOUSE_LEFT_HANDED); + gboolean mouse_left_handed = g_settings_get_boolean (manager->priv->settings_mouse, KEY_MOUSE_LEFT_HANDED); + gboolean touchpad_left_handed = get_touchpad_handedness (manager, mouse_left_handed); + set_left_handed_all (manager, mouse_left_handed, touchpad_left_handed); - set_left_handed_all (manager, left_handed); set_motion_acceleration (manager, g_settings_get_double (manager->priv->settings_mouse, KEY_MOUSE_MOTION_ACCELERATION)); set_motion_threshold (manager, g_settings_get_int (manager->priv->settings_mouse, KEY_MOUSE_MOTION_THRESHOLD)); set_middle_button_all (manager, g_settings_get_boolean (manager->priv->settings_mouse, KEY_MIDDLE_BUTTON_EMULATION)); @@ -969,7 +1000,13 @@ mouse_callback (GSettings *settings, MsdMouseManager *manager) { if (g_strcmp0 (key, KEY_MOUSE_LEFT_HANDED) == 0) { - set_left_handed_all (manager, g_settings_get_boolean (settings, key)); + gboolean mouse_left_handed = g_settings_get_boolean (settings, key); + gboolean touchpad_left_handed = get_touchpad_handedness (manager, mouse_left_handed); + set_left_handed_all (manager, mouse_left_handed, touchpad_left_handed); + } else if (g_strcmp0 (key, KEY_TOUCHPAD_LEFT_HANDED) == 0) { + gboolean mouse_left_handed = g_settings_get_boolean (manager->priv->settings_mouse, KEY_MOUSE_LEFT_HANDED); + gboolean touchpad_left_handed = get_touchpad_handedness (manager, mouse_left_handed); + set_left_handed_all (manager, mouse_left_handed, touchpad_left_handed); } else if (g_strcmp0 (key, KEY_MOUSE_MOTION_ACCELERATION) == 0) { set_motion_acceleration (manager, g_settings_get_double (settings, key)); } else if (g_strcmp0 (key, KEY_MOUSE_MOTION_THRESHOLD) == 0) { |