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 *