> Date: Sun, 18 Sep 2022 14:21:06 +0200 > From: Tobias Heider <tobias.hei...@stusta.de> > > Hi, > > the diff below adds a new mouse type WSMOUSE_TYPE_APPLE which emulates Apples > touchpad behaviour. Instead of mapping soft-buttons to an area on the pad, > the different mouse buttons are mapped to single-finger, two-finger and > three-finger clicks as is the default in macos. > > The diff enables the new mode on apldcms(4) and aplms(4) which are the drivers > used by Apple silicon laptops. > > Tested on an m2 air by me and an m1 by robert@. > > ok?
I don't think OpenBSD should behave differently just because it is running on Apple hardware. Maybe it makes sense to add this mode as a user configurale option? > diff --git sys/arch/arm64/dev/apldc.c sys/arch/arm64/dev/apldc.c > index 09a03c734da..f261c19b13b 100644 > --- sys/arch/arm64/dev/apldc.c > +++ sys/arch/arm64/dev/apldc.c > @@ -1363,7 +1363,7 @@ apldcms_configure(struct apldcms_softc *sc) > struct wsmousehw *hw = wsmouse_get_hw(sc->sc_wsmousedev); > > /* The values below are for the MacBookPro17,1 */ > - hw->type = WSMOUSE_TYPE_TOUCHPAD; > + hw->type = WSMOUSE_TYPE_APPLE; > hw->hw_type = WSMOUSEHW_CLICKPAD; > hw->x_min = -6046; > hw->x_max = 6536; > diff --git sys/arch/arm64/dev/aplhidev.c sys/arch/arm64/dev/aplhidev.c > index 2b00f7e217d..290520e85cb 100644 > --- sys/arch/arm64/dev/aplhidev.c > +++ sys/arch/arm64/dev/aplhidev.c > @@ -654,7 +654,7 @@ aplms_configure(struct aplms_softc *sc) > struct wsmousehw *hw = wsmouse_get_hw(sc->sc_wsmousedev); > > /* The values below are for the MacBookPro17,1 */ > - hw->type = WSMOUSE_TYPE_TOUCHPAD; > + hw->type = WSMOUSE_TYPE_APPLE; > hw->hw_type = WSMOUSEHW_CLICKPAD; > hw->x_min = -6046; > hw->x_max = 6536; > diff --git sys/dev/wscons/wsconsio.h sys/dev/wscons/wsconsio.h > index de483493360..67b46da8d1f 100644 > --- sys/dev/wscons/wsconsio.h > +++ sys/dev/wscons/wsconsio.h > @@ -245,6 +245,7 @@ struct wskbd_encoding_data { > #define WSMOUSE_TYPE_ELANTECH 18 /* Elantech touchpad */ > #define WSMOUSE_TYPE_SYNAP_SBTN 19 /* Synaptics soft > buttons */ > #define WSMOUSE_TYPE_TOUCHPAD 20 /* Generic touchpad */ > +#define WSMOUSE_TYPE_APPLE 21 /* Apple touchpad */ > > /* Set resolution. Not applicable to all mouse types. */ > #define WSMOUSEIO_SRES _IOW('W', 33, u_int) > @@ -313,6 +314,7 @@ enum wsmousecfg { > WSMOUSECFG_SOFTBUTTONS = 64, /* 2 soft-buttons at the bottom edge */ > WSMOUSECFG_SOFTMBTN, /* add a middle-button area */ > WSMOUSECFG_TOPBUTTONS, /* 3 soft-buttons at the top edge */ > + WSMOUSECFG_MTBUTTONS, /* multi-finger buttons */ > WSMOUSECFG_TWOFINGERSCROLL, /* enable two-finger scrolling */ > WSMOUSECFG_EDGESCROLL, /* enable edge scrolling */ > WSMOUSECFG_HORIZSCROLL, /* enable horizontal edge scrolling */ > diff --git sys/dev/wscons/wstpad.c sys/dev/wscons/wstpad.c > index be074b89fb8..9a74fa65908 100644 > --- sys/dev/wscons/wstpad.c > +++ sys/dev/wscons/wstpad.c > @@ -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,23 @@ wstpad_softbuttons(struct wsmouseinput *input, u_int > *cmds, int hdlr) > } > > 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; > + case 1: > + tp->softbutton = LEFTBTN; > + break; > + default: > + tp->softbutton = 0; > + break; > + } > + } else > + tp->softbutton = wstpad_get_sbtn(input, top); > if (tp->softbutton) > *cmds |= 1 << SOFTBUTTON_DOWN; > } > @@ -1237,12 +1255,14 @@ wstpad_process_input(struct wsmouseinput *input, > struct evq_access *evq) > 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: > @@ -1578,6 +1598,8 @@ wstpad_configure(struct wsmouseinput *input) > if (input->hw.hw_type == WSMOUSEHW_CLICKPAD) { > if (input->hw.type == WSMOUSE_TYPE_SYNAP_SBTN) { > tp->features |= WSTPAD_TOPBUTTONS; > + } else if (input->hw.type == WSMOUSE_TYPE_APPLE) { > + tp->features |= WSTPAD_MTBUTTONS; > } else { > tp->features |= WSTPAD_SOFTBUTTONS; > tp->features |= WSTPAD_SOFTMBTN; > @@ -1621,6 +1643,8 @@ wstpad_configure(struct wsmouseinput *input) > > 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) > @@ -1702,6 +1726,9 @@ wstpad_set_param(struct wsmouseinput *input, int key, > int val) > case WSMOUSECFG_TOPBUTTONS: > flag = WSTPAD_TOPBUTTONS; > break; > + case WSMOUSECFG_MTBUTTONS: > + flag = WSTPAD_MTBUTTONS; > + break; > case WSMOUSECFG_TWOFINGERSCROLL: > flag = WSTPAD_TWOFINGERSCROLL; > break; > @@ -1796,6 +1823,9 @@ wstpad_get_param(struct wsmouseinput *input, int key, > int *pval) > case WSMOUSECFG_TOPBUTTONS: > flag = WSTPAD_TOPBUTTONS; > break; > + case WSMOUSECFG_MTBUTTONS: > + flag = WSTPAD_MTBUTTONS; > + break; > case WSMOUSECFG_TWOFINGERSCROLL: > flag = WSTPAD_TWOFINGERSCROLL; > break; > >