From 3c3656f74e76633aeaec9b96791e2d56da1122ba Mon Sep 17 00:00:00 2001 From: tokyo4j Date: Sat, 2 Sep 2023 17:32:48 +0900 Subject: [PATCH] config: support and --- docs/labwc-config.5.scd | 8 ++++++++ docs/rc.xml.all | 2 ++ include/config/libinput.h | 2 ++ src/config/libinput.c | 2 ++ src/config/rcxml.c | 16 ++++++++++++++++ src/seat.c | 18 ++++++++++++++++++ 6 files changed, 48 insertions(+) diff --git a/docs/labwc-config.5.scd b/docs/labwc-config.5.scd index 14485dc2..ca301883 100644 --- a/docs/labwc-config.5.scd +++ b/docs/labwc-config.5.scd @@ -407,6 +407,14 @@ Therefore, where multiple objects of the same kind are required (for example left button, right button, and middle button, respectively (lrm) (the default), or to left button, middle button, and right button (lmr). +** [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. + +** [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] Enable or disable middle button emulation for this category. Middle emulation processes a simultaneous left and right click as a press of diff --git a/docs/rc.xml.all b/docs/rc.xml.all index ea7bb0ba..c0665ee6 100644 --- a/docs/rc.xml.all +++ b/docs/rc.xml.all @@ -392,6 +392,8 @@ yes + + diff --git a/include/config/libinput.h b/include/config/libinput.h index d944195d..46451f26 100644 --- a/include/config/libinput.h +++ b/include/config/libinput.h @@ -21,6 +21,8 @@ struct libinput_category { 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; diff --git a/src/config/libinput.c b/src/config/libinput.c index ee3ca1e6..e66060a0 100644 --- a/src/config/libinput.c +++ b/src/config/libinput.c @@ -16,6 +16,8 @@ libinput_category_init(struct libinput_category *l) 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; diff --git a/src/config/rcxml.c b/src/config/rcxml.c index b33edf8d..5e6a456a 100644 --- a/src/config/rcxml.c +++ b/src/config/rcxml.c @@ -408,6 +408,22 @@ fill_libinput_category(char *nodename, char *content) } 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); diff --git a/src/seat.c b/src/seat.c index a565fc78..a38858a8 100644 --- a/src/seat.c +++ b/src/seat.c @@ -95,6 +95,24 @@ configure_libinput(struct wlr_input_device *wlr_input_device) 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");