diff options
| -rw-r--r-- | data/org.mate.peripherals-mouse.gschema.xml.in | 5 | ||||
| -rw-r--r-- | plugins/mouse/msd-mouse-manager.c | 78 |
2 files changed, 77 insertions, 6 deletions
diff --git a/data/org.mate.peripherals-mouse.gschema.xml.in b/data/org.mate.peripherals-mouse.gschema.xml.in index 87b4bc2..b36cbd8 100644 --- a/data/org.mate.peripherals-mouse.gschema.xml.in +++ b/data/org.mate.peripherals-mouse.gschema.xml.in @@ -10,6 +10,11 @@ <summary>Mouse button orientation</summary> <description>Swap left and right mouse buttons for left-handed mice.</description> </key> + <key name="natural-scroll" type="b"> + <default>false</default> + <summary>Natural scrolling</summary> + <description>Set this to true to enable natural (reverse) scrolling for mice</description> + </key> <key name="motion-acceleration" type="d"> <default>-1</default> <summary>Motion Acceleration</summary> diff --git a/plugins/mouse/msd-mouse-manager.c b/plugins/mouse/msd-mouse-manager.c index fb4c35c..a79fd09 100644 --- a/plugins/mouse/msd-mouse-manager.c +++ b/plugins/mouse/msd-mouse-manager.c @@ -60,6 +60,7 @@ /* Mouse settings */ #define MATE_MOUSE_SCHEMA "org.mate.peripherals-mouse" #define KEY_MOUSE_LOCATE_POINTER "locate-pointer" +#define KEY_MOUSE_NATURAL_SCROLL "natural-scroll" #define KEY_MIDDLE_BUTTON_EMULATION "middle-button-enabled" /* Touchpad settings */ @@ -1391,8 +1392,8 @@ set_natural_scroll_libinput (XDeviceInfo *device_info, } static void -set_natural_scroll (XDeviceInfo *device_info, - gboolean natural_scroll) +set_touchpad_natural_scroll (XDeviceInfo *device_info, + gboolean natural_scroll) { if (property_from_name ("Synaptics Scrolling Distance")) set_natural_scroll_synaptics (device_info, natural_scroll); @@ -1402,7 +1403,7 @@ set_natural_scroll (XDeviceInfo *device_info, } static void -set_natural_scroll_all (MsdMouseManager *manager) +set_touchpad_natural_scroll_all (MsdMouseManager *manager) { int numdevices, i; XDeviceInfo *devicelist = XListInputDevices (GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()), &numdevices); @@ -1413,7 +1414,69 @@ set_natural_scroll_all (MsdMouseManager *manager) gboolean natural_scroll = g_settings_get_boolean (manager->priv->settings_touchpad, KEY_TOUCHPAD_NATURAL_SCROLL); for (i = 0; i < numdevices; i++) { - set_natural_scroll (&devicelist[i], natural_scroll); + set_touchpad_natural_scroll (&devicelist[i], natural_scroll); + } + + XFreeDeviceList (devicelist); +} + +static void +mouse_set_bool (XDeviceInfo *device_info, + const char *property_name, + int property_index, + gboolean enabled) +{ + XDevice *device; + GdkDisplay *display; + + display = gdk_display_get_default (); + + device = device_is_touchpad (device_info); + if (device != NULL) { + XCloseDevice (GDK_DISPLAY_XDISPLAY (display), device); + return; + } + + if ((device_info->use == IsXPointer) || + (device_info->use == IsXKeyboard) || + (!xinput_device_has_buttons (device_info))) + return; + + gdk_x11_display_error_trap_push (display); + device = XOpenDevice (GDK_DISPLAY_XDISPLAY (display), device_info->id); + if ((gdk_x11_display_error_trap_pop (display) != 0) || (device == NULL)) + return; + + property_set_bool (device_info, device, property_name, property_index, enabled); + + gdk_x11_display_error_trap_push (display); + XCloseDevice (GDK_DISPLAY_XDISPLAY (display), device); + gdk_x11_display_error_trap_pop_ignored (display); +} + +static void +set_mouse_natural_scroll (XDeviceInfo *device_info, + gboolean natural_scroll) +{ + g_debug ("Trying to set %s for \"%s\"", natural_scroll ? "natural (reverse) scroll" : "normal scroll", device_info->name); + + mouse_set_bool (device_info, "libinput Natural Scrolling Enabled", 0, natural_scroll); + mouse_set_bool (device_info, "Evdev Wheel Inversion", 0, natural_scroll); +} + +static void +set_mouse_natural_scroll_all (MsdMouseManager *manager) +{ + int numdevices, i; + XDeviceInfo *devicelist = XListInputDevices (GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()), &numdevices); + + if (devicelist == NULL) + return; + + gboolean natural_scroll = g_settings_get_boolean (manager->priv->settings_mouse, KEY_MOUSE_NATURAL_SCROLL); + + for (i = 0; i < numdevices; i++) { + set_mouse_natural_scroll (&devicelist[i], natural_scroll); } XFreeDeviceList (devicelist); @@ -1679,7 +1742,8 @@ set_mouse_settings (MsdMouseManager *manager) set_tap_to_click_all (manager); set_click_actions_all (manager); set_scrolling_all (manager->priv->settings_touchpad); - set_natural_scroll_all (manager); + set_touchpad_natural_scroll_all (manager); + set_mouse_natural_scroll_all (manager); set_touchpad_enabled_all (g_settings_get_boolean (manager->priv->settings_touchpad, KEY_TOUCHPAD_ENABLED)); set_accel_profile_all (manager); } @@ -1700,6 +1764,8 @@ mouse_callback (GSettings *settings, set_accel_profile_all (manager); } else if (g_strcmp0 (key, KEY_MIDDLE_BUTTON_EMULATION) == 0) { set_middle_button_all (g_settings_get_boolean (settings, key)); + } else if (g_strcmp0 (key, KEY_MOUSE_NATURAL_SCROLL) == 0) { + set_mouse_natural_scroll_all (manager); } else if (g_strcmp0 (key, KEY_MOUSE_LOCATE_POINTER) == 0) { set_locate_pointer (manager, g_settings_get_boolean (settings, key)); #if 0 /* FIXME need to fork (?) mousetweaks for this to work */ @@ -1741,7 +1807,7 @@ touchpad_callback (GSettings *settings, || (g_strcmp0 (key, KEY_HORIZ_TWO_FINGER_SCROLL) == 0)) { set_scrolling_all (manager->priv->settings_touchpad); } else if (g_strcmp0 (key, KEY_TOUCHPAD_NATURAL_SCROLL) == 0) { - set_natural_scroll_all (manager); + set_touchpad_natural_scroll_all (manager); } else if (g_strcmp0 (key, KEY_TOUCHPAD_ENABLED) == 0) { set_touchpad_enabled_all (g_settings_get_boolean (settings, key)); } else if ((g_strcmp0 (key, KEY_MOTION_ACCELERATION) == 0) |
