git: d452a029953e - main - wsp: Add hw.usb.wsp.max_scroll_finger_distance for two-finger scrolling

From: Vladimir Kondratyev <wulf_at_FreeBSD.org>
Date: Fri, 07 Mar 2025 17:55:18 UTC
The branch main has been updated by wulf:

URL: https://cgit.FreeBSD.org/src/commit/?id=d452a029953e6e3879c4e73fb023ad9b7ac281a3

commit d452a029953e6e3879c4e73fb023ad9b7ac281a3
Author:     Joshua Rogers <Joshua@Joshua.Hu>
AuthorDate: 2025-03-07 17:53:34 +0000
Commit:     Vladimir Kondratyev <wulf@FreeBSD.org>
CommitDate: 2025-03-07 17:53:34 +0000

    wsp: Add hw.usb.wsp.max_scroll_finger_distance for two-finger scrolling
    
    The hw.usb.wsp.max_scroll_finger_distance sysctl may be used to specify
    the maximum distance between two fingers which are registered as a z-axis
    (vertical scroll with mousepad) movement.
    
    Previously, this was shared with the tunable
    hw.usb.wsp.max_double_tap_distance which is used to specify the maximum
    distance between two fingers which register as a right-click.
    
    This patch also cleans up and add new information to the manpage for
    wsp(4).
    
    Signed-off-by: Joshua Rogers <Joshua@Joshua.Hu>
---
 share/man/man4/wsp.4    | 21 ++++++++++++++++++---
 sys/dev/usb/input/wsp.c |  9 +++++++--
 2 files changed, 25 insertions(+), 5 deletions(-)

diff --git a/share/man/man4/wsp.4 b/share/man/man4/wsp.4
index 83a4421fa2ff..b77d5ac99a7b 100644
--- a/share/man/man4/wsp.4
+++ b/share/man/man4/wsp.4
@@ -63,24 +63,39 @@ through nodes under
 Pointer sensitivity can be controlled using the sysctl tunable
 .Nm hw.usb.wsp.scale_factor .
 Tap to left-click can be controlled using the sysctl tunable
-.Nm hw.usb.wsp.enable_single_tap_clicks ,
-set to 0 to disable single tap clicks or 1 to enable them (default).
+.Nm hw.usb.wsp.enable_single_tap_clicks
+with 0 disabling single tap clicks and 1 enabling them (default).
 Movement on the trackpad following a partially-released click can be
 controlled using the sysctl tunable
 .Nm hw.usb.wsp.enable_single_tap_movement ,
-set to 0 to disable the movement on the trackpad until a full release
+with 0 to disable the movement on the trackpad until a full release
 or 1 to allow the continued movement (default).
 .Nm hw.usb.wsp.max_finger_area
 defines the maximum area on the trackpad which is registered as a
 finger (lower for greater palm detection).
+.Nm max_scroll_finger_distance
+defines the maximum distance between two fingers where z-axis
+movements are registered.
 .Nm hw.usb.wsp.max_double_tap_distance
 defines the maximum distance between two finger clicks or taps which may
 register as a double-click.
+.Nm hw.usb.wsp.scr_hor_threshold
+defines the minimum required horizontal movement to register as a forward
+/back button click.
 Z-Axis sensitivity can be controlled using the sysctl tunable
 .Nm hw.usb.wsp.z_factor .
 Z-Axis inversion can be controlled using the sysctl tunable
 .Nm hw.usb.wsp.z_invert ,
 set to 0 to disable (default) or 1 to enable inversion.
+.Pp
+.Nm
+may use evdev data (if enabled during kernel compilation) for gesture support
+using the
+.Xr sysctl 8
+value
+.Nm kern.evdev.rcpt_mask .
+On most MacBooks, setting this value to 3 enables gestures, while 12
+disables them.
 .Sh FILES
 .Nm
 creates a blocking pseudo-device file,
diff --git a/sys/dev/usb/input/wsp.c b/sys/dev/usb/input/wsp.c
index f9b85f926221..d74ba1da32b1 100644
--- a/sys/dev/usb/input/wsp.c
+++ b/sys/dev/usb/input/wsp.c
@@ -98,6 +98,7 @@ static struct wsp_tuning {
 	int	pressure_tap_threshold;
 	int	scr_hor_threshold;
 	int	max_finger_area;
+	int	max_scroll_finger_distance;
 	int	max_double_tap_distance;
 	int	enable_single_tap_clicks;
 	int	enable_single_tap_movement;
@@ -112,6 +113,7 @@ static struct wsp_tuning {
 	.pressure_tap_threshold = 120,
 	.scr_hor_threshold = 50,
 	.max_finger_area = 1900,
+	.max_scroll_finger_distance = MAX_FINGER_ORIENTATION/2,
 	.max_double_tap_distance = 2500,
 	.enable_single_tap_clicks = 1,
 	.enable_single_tap_movement = 1,
@@ -127,7 +129,8 @@ wsp_runing_rangecheck(struct wsp_tuning *ptun)
 	WSP_CLAMP(ptun->pressure_untouch_threshold, 1, 255);
 	WSP_CLAMP(ptun->pressure_tap_threshold, 1, 255);
 	WSP_CLAMP(ptun->max_finger_area, 1, 2400);
-	WSP_CLAMP(ptun->max_double_tap_distance, 1, 16384);
+	WSP_CLAMP(ptun->max_scroll_finger_distance, 1, MAX_FINGER_ORIENTATION);
+	WSP_CLAMP(ptun->max_double_tap_distance, 1, MAX_FINGER_ORIENTATION);
 	WSP_CLAMP(ptun->scr_hor_threshold, 1, 255);
 	WSP_CLAMP(ptun->enable_single_tap_clicks, 0, 1);
 	WSP_CLAMP(ptun->enable_single_tap_movement, 0, 1);
@@ -147,6 +150,8 @@ SYSCTL_INT(_hw_usb_wsp, OID_AUTO, pressure_tap_threshold, CTLFLAG_RWTUN,
     &wsp_tuning.pressure_tap_threshold, 0, "tap pressure threshold");
 SYSCTL_INT(_hw_usb_wsp, OID_AUTO, max_finger_area, CTLFLAG_RWTUN,
     &wsp_tuning.max_finger_area, 0, "maximum finger area");
+SYSCTL_INT(_hw_usb_wsp, OID_AUTO, max_scroll_finger_distance, CTLFLAG_RWTUN,
+    &wsp_tuning.max_scroll_finger_distance, 0, "maximum scroll finger distance");
 SYSCTL_INT(_hw_usb_wsp, OID_AUTO, max_double_tap_distance, CTLFLAG_RWTUN,
     &wsp_tuning.max_double_tap_distance, 0, "maximum double-finger click distance");
 SYSCTL_INT(_hw_usb_wsp, OID_AUTO, scr_hor_threshold, CTLFLAG_RWTUN,
@@ -1262,7 +1267,7 @@ wsp_intr_callback(struct usb_xfer *xfer, usb_error_t error)
 				dx = dy = 0;
 				if (sc->dz_count == 0)
 					dz = (sc->dz_sum / tun.z_factor) * (tun.z_invert ? -1 : 1);
-				if (sc->scr_mode == WSP_SCR_HOR || sc->distance > tun.max_double_tap_distance)
+				if (sc->scr_mode == WSP_SCR_HOR || sc->distance > tun.max_scroll_finger_distance)
 					dz = 0;
 			}
 			if (ntouch == 3)