left button, right button, and middle button, respectively (lrm) (the
default), or to left button, middle button, and right button (lmr).
+*<libinput><device category=""><tapAndDrag>* [yes|no]
+ Enable or disable tap-and-drag for this category. Tap-and-drag processes
+ a tap immediately followed by a finger down as the start of a drag.
+
+*<libinput><device category=""><dragLock>* [yes|no]
+ Enable or disable drag lock for this category. Drag lock ignores a
+ momentary release of a finger during tap-and-dragging.
+
*<libinput><device category=""><middleEmulation>* [yes|no]
Enable or disable middle button emulation for this category. Middle
emulation processes a simultaneous left and right click as a press of
<accelProfile></accelProfile>
<tap>yes</tap>
<tapButtonMap></tapButtonMap>
+ <tapAndDrag></tapAndDrag>
+ <dragLock></dragLock>
<middleEmulation></middleEmulation>
<disableWhileTyping></disableWhileTyping>
</device>
int left_handed;
enum libinput_config_tap_state tap;
enum libinput_config_tap_button_map tap_button_map;
+ enum libinput_config_drag_state tap_and_drag;
+ enum libinput_config_drag_lock_state drag_lock;
enum libinput_config_accel_profile accel_profile;
enum libinput_config_middle_emulation_state middle_emu;
enum libinput_config_dwt_state dwt;
l->left_handed = -1;
l->tap = LIBINPUT_CONFIG_TAP_ENABLED;
l->tap_button_map = LIBINPUT_CONFIG_TAP_MAP_LRM;
+ l->tap_and_drag = -1;
+ l->drag_lock = -1;
l->accel_profile = -1;
l->middle_emu = -1;
l->dwt = -1;
} else {
wlr_log(WLR_ERROR, "invalid tapButtonMap");
}
+ } else if (!strcasecmp(nodename, "tapAndDrag")) {
+ int ret = parse_bool(content, -1);
+ if (ret < 0) {
+ return;
+ }
+ current_libinput_category->tap_and_drag = ret
+ ? LIBINPUT_CONFIG_DRAG_ENABLED
+ : LIBINPUT_CONFIG_DRAG_DISABLED;
+ } else if (!strcasecmp(nodename, "dragLock")) {
+ int ret = parse_bool(content, -1);
+ if (ret < 0) {
+ return;
+ }
+ current_libinput_category->drag_lock = ret
+ ? LIBINPUT_CONFIG_DRAG_LOCK_ENABLED
+ : LIBINPUT_CONFIG_DRAG_LOCK_DISABLED;
} else if (!strcasecmp(nodename, "accelProfile")) {
current_libinput_category->accel_profile =
get_accel_profile(content);
dc->tap_button_map);
}
+ if (libinput_device_config_tap_get_finger_count(libinput_dev) <= 0
+ || dc->tap_and_drag < 0) {
+ wlr_log(WLR_INFO, "tap-and-drag not configured");
+ } else {
+ wlr_log(WLR_INFO, "tap-and-drag configured");
+ libinput_device_config_tap_set_drag_enabled(
+ libinput_dev, dc->tap_and_drag);
+ }
+
+ if (libinput_device_config_tap_get_finger_count(libinput_dev) <= 0
+ || dc->drag_lock < 0) {
+ wlr_log(WLR_INFO, "drag lock not configured");
+ } else {
+ wlr_log(WLR_INFO, "drag lock configured");
+ libinput_device_config_tap_set_drag_lock_enabled(
+ libinput_dev, dc->drag_lock);
+ }
+
if (libinput_device_config_scroll_has_natural_scroll(libinput_dev) <= 0
|| dc->natural_scroll < 0) {
wlr_log(WLR_INFO, "natural scroll not configured");