diff --git a/docs/labwc-config.5.scd b/docs/labwc-config.5.scd
index 5f700df2..fb98b328 100644
--- a/docs/labwc-config.5.scd
+++ b/docs/labwc-config.5.scd
@@ -958,7 +958,7 @@ extending outward from the snapped edge.
yes
-
+ sticky
@@ -1027,9 +1027,11 @@ extending outward from the snapped edge.
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.
-** [yes|no]
- Enable or disable drag lock for this category. Drag lock ignores a
- momentary release of a finger during tap-and-dragging.
+** [yes|no|sticky]
+ Enable or disable drag lock for this category. Drag lock ignores a temporary
+ release of a finger during tap-and-dragging. Both *yes* and *sticky* enable
+ drag lock, but if *yes* is set, the drag lock expires after a timeout.
+ Default is *sticky*.
** [yes|no]
Enable or disable middle button emulation for this category. Middle
diff --git a/docs/rc.xml.all b/docs/rc.xml.all
index 0bb9182d..c6f00f64 100644
--- a/docs/rc.xml.all
+++ b/docs/rc.xml.all
@@ -632,7 +632,7 @@
yes
-
+ sticky
diff --git a/meson.build b/meson.build
index 51a09427..b83eb8c2 100644
--- a/meson.build
+++ b/meson.build
@@ -110,6 +110,10 @@ conf_data.set10('HAVE_RSVG', have_rsvg)
conf_data.set10('HAVE_LIBSFDO', have_libsfdo)
+foreach sym : ['LIBINPUT_CONFIG_DRAG_LOCK_ENABLED_STICKY']
+ conf_data.set10('HAVE_' + sym, cc.has_header_symbol('libinput.h', sym, dependencies: input))
+endforeach
+
if get_option('static_analyzer').enabled()
add_project_arguments(['-fanalyzer'], language: 'c')
endif
diff --git a/src/config/libinput.c b/src/config/libinput.c
index 04b0a2b5..f7e07d3a 100644
--- a/src/config/libinput.c
+++ b/src/config/libinput.c
@@ -1,7 +1,7 @@
// SPDX-License-Identifier: GPL-2.0-only
#include
#include
-
+#include "config.h"
#include "common/mem.h"
#include "common/list.h"
#include "common/string-helpers.h"
@@ -19,7 +19,11 @@ libinput_category_init(struct libinput_category *l)
l->tap = LIBINPUT_CONFIG_TAP_ENABLED;
l->tap_button_map = LIBINPUT_CONFIG_TAP_MAP_LRM;
l->tap_and_drag = -1;
+#if HAVE_LIBINPUT_CONFIG_DRAG_LOCK_ENABLED_STICKY
+ l->drag_lock = LIBINPUT_CONFIG_DRAG_LOCK_ENABLED_STICKY;
+#else
l->drag_lock = -1;
+#endif
l->accel_profile = -1;
l->middle_emu = -1;
l->dwt = -1;
diff --git a/src/config/rcxml.c b/src/config/rcxml.c
index a3e8f85e..b1bafcd8 100644
--- a/src/config/rcxml.c
+++ b/src/config/rcxml.c
@@ -771,6 +771,16 @@ fill_libinput_category(char *nodename, char *content, struct parser_state *state
? LIBINPUT_CONFIG_DRAG_ENABLED
: LIBINPUT_CONFIG_DRAG_DISABLED;
} else if (!strcasecmp(nodename, "dragLock")) {
+ if (!strcasecmp(content, "sticky")) {
+#if HAVE_LIBINPUT_CONFIG_DRAG_LOCK_ENABLED_STICKY
+ state->current_libinput_category->drag_lock =
+ LIBINPUT_CONFIG_DRAG_LOCK_ENABLED_STICKY;
+#else
+ wlr_log(WLR_ERROR, "sticky is"
+ " only supported in libinput >= 1.27");
+#endif
+ return;
+ }
int ret = parse_bool(content, -1);
if (ret < 0) {
return;