diff options
author | monsta <[email protected]> | 2016-12-23 14:00:34 +0300 |
---|---|---|
committer | monsta <[email protected]> | 2017-01-02 16:53:33 +0300 |
commit | e3800c8a9a865b4ddeb4aef10081ac0b52996883 (patch) | |
tree | f93f86451322480fda5cc698502a37cde91ffd43 /plugins | |
parent | 5956d7c3b2d0abf4b70ef480a9c4c455c39a3f04 (diff) | |
download | mate-settings-daemon-e3800c8a9a865b4ddeb4aef10081ac0b52996883.tar.bz2 mate-settings-daemon-e3800c8a9a865b4ddeb4aef10081ac0b52996883.tar.xz |
mouse: libinput - hook up click methods
note: libinput does not allow for configuration of the click actions,
the options are just "software buttons" or "clickfinger". If any
clickfinger actions are set, we enable clickfinger, otherwise software
buttons.
adapted from:
https://github.com/linuxmint/cinnamon-settings-daemon/commit/6394ea6c2754c434897cebfc6c331b4ee07ce1b8
Diffstat (limited to 'plugins')
-rw-r--r-- | plugins/mouse/msd-mouse-manager.c | 65 |
1 files changed, 62 insertions, 3 deletions
diff --git a/plugins/mouse/msd-mouse-manager.c b/plugins/mouse/msd-mouse-manager.c index b48189b..43fd124 100644 --- a/plugins/mouse/msd-mouse-manager.c +++ b/plugins/mouse/msd-mouse-manager.c @@ -810,9 +810,9 @@ set_tap_to_click_all (MsdMouseManager *manager) } static void -set_click_actions (XDeviceInfo *device_info, - gint enable_two_finger_click, - gint enable_three_finger_click) +set_click_actions_synaptics (XDeviceInfo *device_info, + gint enable_two_finger_click, + gint enable_three_finger_click) { XDevice *device; int format, rc; @@ -851,7 +851,66 @@ set_click_actions (XDeviceInfo *device_info, if (gdk_error_trap_pop ()) { g_warning ("Error in setting click actions on \"%s\"", device_info->name); } +} + +static void +set_click_actions_libinput (XDeviceInfo *device_info, + gint enable_two_finger_click, + gint enable_three_finger_click) +{ + XDevice *device; + int format, rc; + unsigned long nitems, bytes_after; + unsigned char *data; + Atom prop, type; + gboolean want_clickfinger; + gboolean want_softwarebuttons; + + prop = property_from_name ("libinput Click Method Enabled"); + if (!prop) + return; + + device = device_is_touchpad (device_info); + if (device == NULL) { + return; + } + + g_debug ("setting click action to click on %s", device_info->name); + + want_clickfinger = enable_two_finger_click || enable_three_finger_click; + want_softwarebuttons = !want_clickfinger; + + 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 >= 2) { + data[0] = want_softwarebuttons; + data[1] = want_clickfinger; + 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 click actions on \"%s\"", device_info->name); + } +} + +static void +set_click_actions (XDeviceInfo *device_info, + gint enable_two_finger_click, + gint enable_three_finger_click) +{ + if (property_from_name ("Synaptics Click Action")) + set_click_actions_synaptics (device_info, enable_two_finger_click, enable_three_finger_click); + if (property_from_name ("libinput Click Method Enabled")) + set_click_actions_libinput (device_info, enable_two_finger_click, enable_three_finger_click); } static void |