I wouldn't mind seeing such a feature in the driver, but I think there's more to do than counting contacts. The start of a click-and-drag gesture may involve two contacts and a button-press event, or people who place a thumb in the lower clickpad area and use it for pressing the clickpad button might leave the index finger in the main area. In both cases you probably shouldn't generate a middle- button event, and I guess it doesn't happen on MacOS, or does it?
There may be various means to distinguish the gestures. The driver might check the positions and the distance of the contacts, or identify their duration, their initial position or the current direction and speed of movement, etc. I don't know which strategies work well and can be implemented with reasonable effort, it might not be easy to figure that out. It seems that libinput uses distances (see https://wayland.freedesktop.org/libinput/doc/1.22.0/clickpad-softbuttons.html ) as well as additional means for identifying "thumbs", but I'm not familiar with the details. On 2/7/23 14:12, Tobias Heider wrote: > On Mon, Sep 19, 2022 at 11:16:51AM +0200, Ulf Brosziewski wrote: >> Is there enough interest in this feature among OpenBSD users? I haven't >> seen many requests for it, if any. Moreover, is it a good idea to configure >> different input methods on this or that hardware just because another OS >> has different defaults? >> >> Just in case the answer to these questions turns out to be "yes", here are >> some remarks on the diff. > > I do still believe that there is interest in this feature based on the > feedback > I got from other devs. Having it available as a non-default option as > kettenis@ > said would be good enough. > > Below is a revised version of the diff that adds a new mouse.tp.mtbuttons > config > option. It can either be enabled via wsconsctl mouse.tp.mtbuttons=1 or by > adding mouse.tp.mtbuttons=1 to your /etc/wsconsctl.conf. > > ok? > > Index: sys/dev/wscons/wsconsio.h > =================================================================== > RCS file: /cvs/src/sys/dev/wscons/wsconsio.h,v > retrieving revision 1.98 > diff -u -p -r1.98 wsconsio.h > --- sys/dev/wscons/wsconsio.h 15 Jul 2022 17:57:27 -0000 1.98 > +++ sys/dev/wscons/wsconsio.h 5 Feb 2023 15:35:39 -0000 > @@ -319,6 +319,7 @@ enum wsmousecfg { > WSMOUSECFG_SWAPSIDES, /* invert soft-button/scroll areas */ > WSMOUSECFG_DISABLE, /* disable all output except for > clicks in the top-button area */ > + WSMOUSECFG_MTBUTTONS, /* multi-touch buttons */ > > /* > * Touchpad options > Index: sys/dev/wscons/wstpad.c > =================================================================== > RCS file: /cvs/src/sys/dev/wscons/wstpad.c,v > retrieving revision 1.31 > diff -u -p -r1.31 wstpad.c > --- sys/dev/wscons/wstpad.c 9 Jun 2022 22:17:18 -0000 1.31 > +++ sys/dev/wscons/wstpad.c 5 Feb 2023 15:35:39 -0000 > @@ -72,6 +72,7 @@ > enum tpad_handlers { > SOFTBUTTON_HDLR, > TOPBUTTON_HDLR, > + MTBUTTON_HDLR, > TAP_HDLR, > F2SCROLL_HDLR, > EDGESCROLL_HDLR, > @@ -149,6 +150,7 @@ struct tpad_touch { > #define WSTPAD_HORIZSCROLL (1 << 5) > #define WSTPAD_SWAPSIDES (1 << 6) > #define WSTPAD_DISABLE (1 << 7) > +#define WSTPAD_MTBUTTONS (1 << 8) > > #define WSTPAD_MT (1 << 31) > > @@ -646,7 +648,17 @@ wstpad_softbuttons(struct wsmouseinput * > } > > if (tp->softbutton == 0 && PRIMARYBTN_CLICKED(tp)) { > - tp->softbutton = wstpad_get_sbtn(input, top); > + if (hdlr == MTBUTTON_HDLR) { > + switch (tp->contacts) { > + case 2: > + tp->softbutton = RIGHTBTN; > + break; > + case 3: > + tp->softbutton = MIDDLEBTN; > + break; > + } > + } else > + tp->softbutton = wstpad_get_sbtn(input, top); > if (tp->softbutton) > *cmds |= 1 << SOFTBUTTON_DOWN; > } > @@ -1237,12 +1249,14 @@ wstpad_process_input(struct wsmouseinput > cmds = 0; > handlers = tp->handlers; > if (DISABLE(tp)) > - handlers &= ((1 << TOPBUTTON_HDLR) | (1 << SOFTBUTTON_HDLR)); > + handlers &= ((1 << TOPBUTTON_HDLR) | (1 << SOFTBUTTON_HDLR) | > + (1 << MTBUTTON_HDLR)); > > FOREACHBIT(handlers, hdlr) { > switch (hdlr) { > case SOFTBUTTON_HDLR: > case TOPBUTTON_HDLR: > + case MTBUTTON_HDLR: > wstpad_softbuttons(input, &cmds, hdlr); > continue; > case TAP_HDLR: > @@ -1621,6 +1635,8 @@ wstpad_configure(struct wsmouseinput *in > > tp->handlers = 0; > > + if (tp->features & WSTPAD_MTBUTTONS) > + tp->handlers |= 1 << MTBUTTON_HDLR; > if (tp->features & WSTPAD_SOFTBUTTONS) > tp->handlers |= 1 << SOFTBUTTON_HDLR; > if (tp->features & WSTPAD_TOPBUTTONS) > @@ -1691,7 +1707,7 @@ wstpad_set_param(struct wsmouseinput *in > return (EINVAL); > > switch (key) { > - case WSMOUSECFG_SOFTBUTTONS ... WSMOUSECFG_DISABLE: > + case WSMOUSECFG_SOFTBUTTONS ... WSMOUSECFG_MTBUTTONS: > switch (key) { > case WSMOUSECFG_SOFTBUTTONS: > flag = WSTPAD_SOFTBUTTONS; > @@ -1717,6 +1733,9 @@ wstpad_set_param(struct wsmouseinput *in > case WSMOUSECFG_DISABLE: > flag = WSTPAD_DISABLE; > break; > + case WSMOUSECFG_MTBUTTONS: > + flag = WSTPAD_MTBUTTONS; > + break; > } > if (val) > tp->features |= flag; > @@ -1785,7 +1804,7 @@ wstpad_get_param(struct wsmouseinput *in > return (EINVAL); > > switch (key) { > - case WSMOUSECFG_SOFTBUTTONS ... WSMOUSECFG_DISABLE: > + case WSMOUSECFG_SOFTBUTTONS ... WSMOUSECFG_MTBUTTONS: > switch (key) { > case WSMOUSECFG_SOFTBUTTONS: > flag = WSTPAD_SOFTBUTTONS; > @@ -1810,6 +1829,9 @@ wstpad_get_param(struct wsmouseinput *in > break; > case WSMOUSECFG_DISABLE: > flag = WSTPAD_DISABLE; > + break; > + case WSMOUSECFG_MTBUTTONS: > + flag = WSTPAD_MTBUTTONS; > break; > } > *pval = !!(tp->features & flag); > Index: sbin/wsconsctl/mouse.c > =================================================================== > RCS file: /cvs/src/sbin/wsconsctl/mouse.c,v > retrieving revision 1.20 > diff -u -p -r1.20 mouse.c > --- sbin/wsconsctl/mouse.c 19 Aug 2019 21:42:33 -0000 1.20 > +++ sbin/wsconsctl/mouse.c 5 Feb 2023 15:35:39 -0000 > @@ -57,6 +57,7 @@ struct field mouse_field_tab[] = { > { "reverse_scrolling", &cfg_revscroll, FMT_CFG, FLG_NORDBACK }, > /* touchpad-specific options: */ > { "tp.tapping", &cfg_tapping, FMT_CFG, FLG_NORDBACK }, > + { "tp.mtbuttons", &cfg_mtbuttons, FMT_CFG, > FLG_NORDBACK }, > { "tp.scaling", &cfg_scaling, FMT_CFG, FLG_NORDBACK }, > { "tp.swapsides", &cfg_swapsides, FMT_CFG, > FLG_NORDBACK }, > { "tp.disable", &cfg_disable, FMT_CFG, FLG_NORDBACK }, > Index: sbin/wsconsctl/mousecfg.c > =================================================================== > RCS file: /cvs/src/sbin/wsconsctl/mousecfg.c,v > retrieving revision 1.9 > diff -u -p -r1.9 mousecfg.c > --- sbin/wsconsctl/mousecfg.c 3 Mar 2021 19:44:37 -0000 1.9 > +++ sbin/wsconsctl/mousecfg.c 5 Feb 2023 15:35:39 -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_DISABLE > +#define TP_FEATURES_LAST WSMOUSECFG_MTBUTTONS > #define TP_SETUP_FIRST WSMOUSECFG_LEFT_EDGE > #define TP_SETUP_LAST WSMOUSECFG_TAP_THREE_BTNMAP > #define LOG_FIRST WSMOUSECFG_LOG_INPUT > @@ -75,6 +75,12 @@ struct wsmouse_parameters cfg_tapping = > { WSMOUSECFG_TAP_TWO_BTNMAP, 0 }, > { WSMOUSECFG_TAP_THREE_BTNMAP, 0 }, }, > 3 > +}; > + > +struct wsmouse_parameters cfg_mtbuttons = { > + (struct wsmouse_param[]) { > + { WSMOUSECFG_MTBUTTONS, 0 }, }, > + 1 > }; > > struct wsmouse_parameters cfg_scaling = { > Index: sbin/wsconsctl/mousecfg.h > =================================================================== > RCS file: /cvs/src/sbin/wsconsctl/mousecfg.h,v > retrieving revision 1.4 > diff -u -p -r1.4 mousecfg.h > --- sbin/wsconsctl/mousecfg.h 19 Aug 2019 21:42:33 -0000 1.4 > +++ sbin/wsconsctl/mousecfg.h 5 Feb 2023 15:35:39 -0000 > @@ -17,6 +17,7 @@ > */ > > extern struct wsmouse_parameters cfg_tapping; > +extern struct wsmouse_parameters cfg_mtbuttons; > extern struct wsmouse_parameters cfg_scaling; > extern struct wsmouse_parameters cfg_edges; > extern struct wsmouse_parameters cfg_swapsides; >