diff options
author | monsta <[email protected]> | 2016-12-23 13:44:56 +0300 |
---|---|---|
committer | monsta <[email protected]> | 2017-01-02 16:53:33 +0300 |
commit | 5956d7c3b2d0abf4b70ef480a9c4c455c39a3f04 (patch) | |
tree | c99bf8ba540e95f5618def78963d4463afd38e16 | |
parent | 8872b8fdd4e201031997e65fd1721ec785984d0d (diff) | |
download | mate-settings-daemon-5956d7c3b2d0abf4b70ef480a9c4c455c39a3f04.tar.bz2 mate-settings-daemon-5956d7c3b2d0abf4b70ef480a9c4c455c39a3f04.tar.xz |
mouse: libinput - hook up scrolling settings
note: libinput does not allow for both edge and twofinger scrolling
to be enabled simultaneously. We prefer twofinger scrolling. The same
goes for horizontal scrolling, it picks the setting for whatever scroll
method we applied.
adapted from:
https://github.com/linuxmint/cinnamon-settings-daemon/commit/82442095a33b1f063f00512d438711ef092e0121
-rw-r--r-- | plugins/mouse/msd-mouse-manager.c | 81 |
1 files changed, 79 insertions, 2 deletions
diff --git a/plugins/mouse/msd-mouse-manager.c b/plugins/mouse/msd-mouse-manager.c index 80d19f2..b48189b 100644 --- a/plugins/mouse/msd-mouse-manager.c +++ b/plugins/mouse/msd-mouse-manager.c @@ -962,8 +962,8 @@ set_natural_scroll_all (MsdMouseManager *manager) } static void -set_scrolling (XDeviceInfo *device_info, - GSettings *settings) +set_scrolling_synaptics (XDeviceInfo *device_info, + GSettings *settings) { touchpad_set_bool (device_info, "Synaptics Edge Scrolling", 0, g_settings_get_boolean (settings, KEY_VERT_EDGE_SCROLL)); touchpad_set_bool (device_info, "Synaptics Edge Scrolling", 1, g_settings_get_boolean (settings, KEY_HORIZ_EDGE_SCROLL)); @@ -972,6 +972,83 @@ set_scrolling (XDeviceInfo *device_info, } static void +set_scrolling_libinput (XDeviceInfo *device_info, + GSettings *settings) +{ + XDevice *device; + int format, rc; + unsigned long nitems, bytes_after; + unsigned char *data; + Atom prop, type; + gboolean want_edge, want_2fg; + gboolean want_horiz; + + prop = property_from_name ("libinput Scroll Method Enabled"); + if (!prop) + return; + + device = device_is_touchpad (device_info); + if (device == NULL) { + return; + } + + want_2fg = g_settings_get_boolean (settings, KEY_VERT_TWO_FINGER_SCROLL); + want_edge = g_settings_get_boolean (settings, KEY_VERT_EDGE_SCROLL); + + /* libinput only allows for one scroll method at a time. + * If both are set, pick 2fg scrolling. + */ + if (want_2fg) + want_edge = FALSE; + + g_debug ("setting scroll method on %s", device_info->name); + + gdk_error_trap_push (); + rc = XGetDeviceProperty (GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()), device, prop, 0, 2, + False, XA_INTEGER, &type, &format, &nitems, + &bytes_after, &data); + + if (rc == Success && type == XA_INTEGER && format == 8 && nitems >= 3) { + data[0] = want_2fg; + data[1] = want_edge; + XChangeDeviceProperty (GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()), device, + prop, XA_INTEGER, 8, PropModeReplace, data, nitems); + } + + if (rc == Success) + XFree (data); + + XCloseDevice (GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()), device); + if (gdk_error_trap_pop ()) { + g_warning ("Error in setting scroll method on \"%s\"", device_info->name); + } + + /* Horizontal scrolling is handled by xf86-input-libinput and + * there's only one bool. Pick the one matching the scroll method + * we picked above. + */ + if (want_2fg) + want_horiz = g_settings_get_boolean (settings, KEY_HORIZ_TWO_FINGER_SCROLL); + else if (want_edge) + want_horiz = g_settings_get_boolean (settings, KEY_HORIZ_EDGE_SCROLL); + else + return; + + touchpad_set_bool (device_info, "libinput Horizontal Scroll Enabled", 0, want_horiz); +} + +static void +set_scrolling (XDeviceInfo *device_info, + GSettings *settings) +{ + if (property_from_name ("Synaptics Edge Scrolling")) + set_scrolling_synaptics (device_info, settings); + + if (property_from_name ("libinput Scroll Method Enabled")) + set_scrolling_libinput (device_info, settings); +} + +static void set_scrolling_all (GSettings *settings) { int numdevices, i; |