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;