Right now, there is a single master toggle for enabling all touchpad tap
gestures (mouse.tp.tapping). This patch splits this parameter into three
for independent control of one-finger, two-finger, and three-finger tap
gestures. This allows users to mix and match which gestures they prefer
for the ideal touchpad experience.

Index: sbin/wsconsctl/mousecfg.c
===================================================================
RCS file: /cvs/src/sbin/wsconsctl/mousecfg.c,v
retrieving revision 1.7
diff -u -p -u -p -r1.7 mousecfg.c
--- sbin/wsconsctl/mousecfg.c   2 Apr 2020 17:17:04 -0000       1.7
+++ sbin/wsconsctl/mousecfg.c   9 Feb 2021 00:17:14 -0000
@@ -40,7 +40,7 @@
 #define TP_FILTER_FIRST                WSMOUSECFG_DX_MAX
 #define TP_FILTER_LAST         WSMOUSECFG_SMOOTHING
 #define TP_FEATURES_FIRST      WSMOUSECFG_SOFTBUTTONS
-#define TP_FEATURES_LAST       WSMOUSECFG_TAPPING
+#define TP_FEATURES_LAST       WSMOUSECFG_THREEFINGERTAPPING
 #define TP_SETUP_FIRST         WSMOUSECFG_LEFT_EDGE
 #define TP_SETUP_LAST          WSMOUSECFG_TAP_LOCKTIME
 #define LOG_FIRST              WSMOUSECFG_LOG_INPUT
@@ -71,8 +71,10 @@ static const int touchpad_types[] = {

 struct wsmouse_parameters cfg_tapping = {
        (struct wsmouse_param[]) {
-           { WSMOUSECFG_TAPPING, 0 }, },
-       1
+           { WSMOUSECFG_ONEFINGERTAPPING, 0 },
+           { WSMOUSECFG_TWOFINGERTAPPING, 0 },
+           { WSMOUSECFG_THREEFINGERTAPPING, 0 }, },
+       3
 };

 struct wsmouse_parameters cfg_scaling = {
Index: share/man/man4/wsmouse.4
===================================================================
RCS file: /cvs/src/share/man/man4/wsmouse.4,v
retrieving revision 1.20
diff -u -p -u -p -r1.20 wsmouse.4
--- share/man/man4/wsmouse.4    4 Feb 2018 20:29:59 -0000       1.20
+++ share/man/man4/wsmouse.4    9 Feb 2021 00:17:14 -0000
@@ -26,7 +26,7 @@
 .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 .\" SUCH DAMAGE.
 .\"
-.Dd $Mdocdate: February 4 2018 $
+.Dd $Mdocdate: February 8 2021 $
 .Dt WSMOUSE 4
 .Os
 .Sh NAME
@@ -87,14 +87,22 @@ is omitted, commands apply to
 .Pa /dev/wsmouse0 .
 .Bl -tag -width Ds
 .It Cm mouse.tp.tapping
-Setting this parameter to a non-zero value enables tap gestures.
+This list of three parameters sets the enabled tap gestures, in the order:
+.Bd -literal -offset indent
+.Sm off
+.Ar one-finger , two-finger , three-finger
+.Sm on
+.Ed
+.Pp
+Setting a parameter to a non-zero value enables that tap gesture.
 Contacts on the touchpad that are immediately released again
-trigger click events.
+trigger click events only if the corresponding tap gesture is enabled.
 One-finger, two-finger, and three-finger taps generate left-button,
 right-button, and middle-button clicks, respectively.
 If, within a short time interval, a second touch follows a one-finger
 tap, the button-up event is not issued until that touch ends
 .Pq Dq tap-and-drag .
+This requires the one-finger tap gesture to be enabled.
 .It Cm mouse.tp.scaling
 The value is a scale coefficient that is applied to the relative
 coordinates.
Index: sys/dev/wscons/wsconsio.h
===================================================================
RCS file: /cvs/src/sys/dev/wscons/wsconsio.h,v
retrieving revision 1.95
diff -u -p -u -p -r1.95 wsconsio.h
--- sys/dev/wscons/wsconsio.h   1 Oct 2020 17:28:14 -0000       1.95
+++ sys/dev/wscons/wsconsio.h   9 Feb 2021 00:17:17 -0000
@@ -319,7 +319,9 @@ enum wsmousecfg {
        WSMOUSECFG_SWAPSIDES,           /* invert soft-button/scroll areas */
        WSMOUSECFG_DISABLE,             /* disable all output except for
                                           clicks in the top-button area */
-       WSMOUSECFG_TAPPING,             /* enable tapping */
+       WSMOUSECFG_ONEFINGERTAPPING,    /* enable one-finger tapping */
+       WSMOUSECFG_TWOFINGERTAPPING,    /* enable two-finger tapping */
+       WSMOUSECFG_THREEFINGERTAPPING,  /* enable three-finger tapping */

        /*
         * Touchpad options
@@ -345,7 +347,7 @@ enum wsmousecfg {
        WSMOUSECFG_LOG_INPUT = 256,
        WSMOUSECFG_LOG_EVENTS,
 };
-#define WSMOUSECFG_MAX 39      /* max size of param array per ioctl */
+#define WSMOUSECFG_MAX 41      /* max size of param array per ioctl */

 struct wsmouse_param {
        enum wsmousecfg key;
Index: sys/dev/wscons/wstpad.c
===================================================================
RCS file: /cvs/src/sys/dev/wscons/wstpad.c,v
retrieving revision 1.26
diff -u -p -u -p -r1.26 wstpad.c
--- sys/dev/wscons/wstpad.c     13 Sep 2020 10:05:46 -0000      1.26
+++ sys/dev/wscons/wstpad.c     9 Feb 2021 00:17:17 -0000
@@ -139,18 +139,19 @@ struct tpad_touch {
 /*
  * wstpad.features
  */
-#define WSTPAD_SOFTBUTTONS     (1 << 0)
-#define WSTPAD_SOFTMBTN                (1 << 1)
-#define WSTPAD_TOPBUTTONS      (1 << 2)
-#define WSTPAD_TWOFINGERSCROLL (1 << 3)
-#define WSTPAD_EDGESCROLL      (1 << 4)
-#define WSTPAD_HORIZSCROLL     (1 << 5)
-#define WSTPAD_SWAPSIDES       (1 << 6)
-#define WSTPAD_DISABLE         (1 << 7)
-#define WSTPAD_TAPPING         (1 << 8)
-
-#define WSTPAD_MT              (1 << 31)
+#define WSTPAD_SOFTBUTTONS             (1 << 0)
+#define WSTPAD_SOFTMBTN                        (1 << 1)
+#define WSTPAD_TOPBUTTONS              (1 << 2)
+#define WSTPAD_TWOFINGERSCROLL         (1 << 3)
+#define WSTPAD_EDGESCROLL              (1 << 4)
+#define WSTPAD_HORIZSCROLL             (1 << 5)
+#define WSTPAD_SWAPSIDES               (1 << 6)
+#define WSTPAD_DISABLE                 (1 << 7)
+#define WSTPAD_ONEFINGERTAPPING                (1 << 8)
+#define WSTPAD_TWOFINGERTAPPING                (1 << 9)
+#define WSTPAD_THREEFINGERTAPPING      (1 << 10)

+#define WSTPAD_MT                      (1 << 31)

 struct wstpad {
        u_int features;
@@ -725,6 +726,16 @@ tap_btn(struct wstpad *tp, int nmasked)
        return (n == 2 ? RIGHTBTN : (n == 3 ? MIDDLEBTN : LEFTBTN));
 }

+static inline int
+tap_btn_ignore(struct wstpad *tp)
+{
+       u_int btn = tp->tap.button;
+
+       return (btn == LEFTBTN ? !(tp->features & WSTPAD_ONEFINGERTAPPING)
+           : btn == RIGHTBTN ? !(tp->features & WSTPAD_TWOFINGERTAPPING)
+           : !(tp->features & WSTPAD_THREEFINGERTAPPING));
+}
+
 /*
  * This handler supports one-, two-, and three-finger-taps, which
  * are mapped to left-button, right-button and middle-button events,
@@ -793,9 +804,13 @@ wstpad_tap(struct wsmouseinput *input, u
                                tp->tap.centered = 0;
                        }
                        if (tp->tap.state == TAP_LIFTED) {
-                               *cmds |= 1 << TAPBUTTON_DOWN;
-                               err = !timeout_add_msec(&tp->tap.to,
-                                   tp->tap.clicktime);
+                               if (!tap_btn_ignore(tp)) {
+                                       *cmds |= 1 << TAPBUTTON_DOWN;
+                                       err = !timeout_add_msec(&tp->tap.to,
+                                           tp->tap.clicktime);
+                               } else {
+                                       tp->tap.state = TAP_DETECT;
+                               }
                        }
                }
                break;
@@ -1626,7 +1641,8 @@ wstpad_configure(struct wsmouseinput *in
        else if (tp->features & WSTPAD_EDGESCROLL)
                tp->handlers |= 1 << EDGESCROLL_HDLR;

-       if (tp->features & WSTPAD_TAPPING) {
+       if (tp->features & (WSTPAD_ONEFINGERTAPPING | WSTPAD_TWOFINGERTAPPING |
+           WSTPAD_THREEFINGERTAPPING)) {
                tp->tap.clicktime = imin(imax(tp->tap.clicktime, 80), 350);
                if (tp->tap.locktime)
                        tp->tap.locktime =
@@ -1669,7 +1685,7 @@ wstpad_set_param(struct wsmouseinput *in
                return (EINVAL);

        switch (key) {
-       case WSMOUSECFG_SOFTBUTTONS ... WSMOUSECFG_TAPPING:
+       case WSMOUSECFG_SOFTBUTTONS ... WSMOUSECFG_THREEFINGERTAPPING:
                switch (key) {
                case WSMOUSECFG_SOFTBUTTONS:
                        flag = WSTPAD_SOFTBUTTONS;
@@ -1695,8 +1711,14 @@ wstpad_set_param(struct wsmouseinput *in
                case WSMOUSECFG_DISABLE:
                        flag = WSTPAD_DISABLE;
                        break;
-               case WSMOUSECFG_TAPPING:
-                       flag = WSTPAD_TAPPING;
+               case WSMOUSECFG_ONEFINGERTAPPING:
+                       flag = WSTPAD_ONEFINGERTAPPING;
+                       break;
+               case WSMOUSECFG_TWOFINGERTAPPING:
+                       flag = WSTPAD_TWOFINGERTAPPING;
+                       break;
+               case WSMOUSECFG_THREEFINGERTAPPING:
+                       flag = WSTPAD_THREEFINGERTAPPING;
                        break;
                }
                if (val)
@@ -1757,7 +1779,7 @@ wstpad_get_param(struct wsmouseinput *in
                return (EINVAL);

        switch (key) {
-       case WSMOUSECFG_SOFTBUTTONS ... WSMOUSECFG_TAPPING:
+       case WSMOUSECFG_SOFTBUTTONS ... WSMOUSECFG_THREEFINGERTAPPING:
                switch (key) {
                case WSMOUSECFG_SOFTBUTTONS:
                        flag = WSTPAD_SOFTBUTTONS;
@@ -1783,8 +1805,14 @@ wstpad_get_param(struct wsmouseinput *in
                case WSMOUSECFG_DISABLE:
                        flag = WSTPAD_DISABLE;
                        break;
-               case WSMOUSECFG_TAPPING:
-                       flag = WSTPAD_TAPPING;
+               case WSMOUSECFG_ONEFINGERTAPPING:
+                       flag = WSTPAD_ONEFINGERTAPPING;
+                       break;
+               case WSMOUSECFG_TWOFINGERTAPPING:
+                       flag = WSTPAD_TWOFINGERTAPPING;
+                       break;
+               case WSMOUSECFG_THREEFINGERTAPPING:
+                       flag = WSTPAD_THREEFINGERTAPPING;
                        break;
                }
                *pval = !!(tp->features & flag);

Reply via email to