diff --git a/docs/labwc-config.5.scd b/docs/labwc-config.5.scd index 13751813..bc8cf59b 100644 --- a/docs/labwc-config.5.scd +++ b/docs/labwc-config.5.scd @@ -592,6 +592,7 @@ extending outward from the snapped edge. + ``` @@ -667,6 +668,22 @@ extending outward from the snapped edge. any motion events while a keyboard is typing, and for a short while after as well. +** [none|buttonAreas|clickfinger] + Configure the method by which physical clicks on a touchpad are mapped to + mouse-button events. + + The click methods available are: + - *buttonAreas* - The bottom of the touchpad is divided into distinct + regions corresponding to left, middle and right buttons; clicking within + the region will trigger the corresponding event. Clicking the main area + further up produces a left button event. + - *clickfinger* - Clicking with one, two or three finger(s) will produce + left, right or middle button event without regard to the location of a + click. + - *none* - Physical clicks will not produce button events. + + The default method depends on the touchpad hardware. + ## WINDOW RULES Two types of window rules are supported, actions and properties. They are diff --git a/docs/rc.xml.all b/docs/rc.xml.all index 423bcb74..5d0c4cff 100644 --- a/docs/rc.xml.all +++ b/docs/rc.xml.all @@ -465,13 +465,14 @@ non-touch, default or the name of a device. You can obtain device names by running *libinput list-devices* as root or member of the input group. - Tap is set to *yes* be default. All others are left blank in order to use + Tap is set to *yes* by default. All others are left blank in order to use device defaults. All values are [yes|no] except for: - pointerSpeed [-1.0 to 1.0] - accelProfile [flat|adaptive] - tapButtonMap [lrm|lmr] + - clickMethod [none|buttonAreas|clickfinger] --> @@ -485,6 +486,7 @@ + diff --git a/include/config/libinput.h b/include/config/libinput.h index 4ec0ebb7..dffeea98 100644 --- a/include/config/libinput.h +++ b/include/config/libinput.h @@ -28,6 +28,7 @@ struct libinput_category { int accel_profile; /* -1 or libinput_config_accel_profile */ int middle_emu; /* -1 or libinput_config_middle_emulation_state */ int dwt; /* -1 or libinput_config_dwt_state */ + int click_method; /* -1 or libinput_config_click_method */ }; enum lab_libinput_device_type get_device_type(const char *s); diff --git a/src/config/libinput.c b/src/config/libinput.c index 7ce62b79..a8de5e7b 100644 --- a/src/config/libinput.c +++ b/src/config/libinput.c @@ -23,6 +23,7 @@ libinput_category_init(struct libinput_category *l) l->accel_profile = -1; l->middle_emu = -1; l->dwt = -1; + l->click_method = -1; } enum lab_libinput_device_type diff --git a/src/config/rcxml.c b/src/config/rcxml.c index 61784e13..f18cce32 100644 --- a/src/config/rcxml.c +++ b/src/config/rcxml.c @@ -563,6 +563,19 @@ fill_libinput_category(char *nodename, char *content) current_libinput_category->dwt = ret ? LIBINPUT_CONFIG_DWT_ENABLED : LIBINPUT_CONFIG_DWT_DISABLED; + } else if (!strcasecmp(nodename, "clickMethod")) { + if (!strcasecmp(content, "none")) { + current_libinput_category->click_method = + LIBINPUT_CONFIG_CLICK_METHOD_NONE; + } else if (!strcasecmp(content, "clickfinger")) { + current_libinput_category->click_method = + LIBINPUT_CONFIG_CLICK_METHOD_CLICKFINGER; + } else if (!strcasecmp(content, "buttonAreas")) { + current_libinput_category->click_method = + LIBINPUT_CONFIG_CLICK_METHOD_BUTTON_AREAS; + } else { + wlr_log(WLR_ERROR, "invalid clickMethod"); + } } } diff --git a/src/seat.c b/src/seat.c index 52b1b5d0..0f421987 100644 --- a/src/seat.c +++ b/src/seat.c @@ -189,6 +189,24 @@ configure_libinput(struct wlr_input_device *wlr_input_device) wlr_log(WLR_INFO, "dwt configured"); libinput_device_config_dwt_set_enabled(libinput_dev, dc->dwt); } + if ((libinput_device_config_click_get_methods(libinput_dev) + & dc->click_method) == 0 + || dc->click_method < 0) { + wlr_log(WLR_INFO, "click method not configured"); + } else { + wlr_log(WLR_INFO, "click method configured"); + + /* + * Note, the documentation claims that: + * > [...] The device may require changing to a neutral state + * > first before activating the new method. + * + * However, just setting the method seems to work without + * issues. + */ + + libinput_device_config_click_set_method(libinput_dev, dc->click_method); + } } static struct wlr_output *