Skip to content

Instantly share code, notes, and snippets.

@moveccr
Last active September 2, 2021 09:15
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save moveccr/affded12286cb9013222ad251a4ec129 to your computer and use it in GitHub Desktop.
Save moveccr/affded12286cb9013222ad251a4ec129 to your computer and use it in GitHub Desktop.
NetBSD/luna68k NWSMOUSE=0 のときにマウスが接続されているとキーボードに誤入力が発生する問題のパッチ
diff --git a/sys/arch/luna68k/dev/lunaws.c b/sys/arch/luna68k/dev/lunaws.c
index 06379fdf4..edf2d9c8f 100644
--- a/sys/arch/luna68k/dev/lunaws.c
+++ b/sys/arch/luna68k/dev/lunaws.c
@@ -77,9 +77,9 @@ struct ws_softc {
u_int sc_rxqtail;
#if NWSMOUSE > 0
device_t sc_wsmousedev;
- int sc_msreport;
int sc_msbuttons, sc_msdx, sc_msdy;
#endif
+ int sc_msreport;
void *sc_si;
int sc_rawkbd;
};
@@ -183,9 +183,9 @@ wsattach(device_t parent, device_t self, void *aux)
b.accesscookie = (void *)sc;
sc->sc_wsmousedev =
config_found_ia(self, "wsmousedev", &b, wsmousedevprint);
- sc->sc_msreport = 0;
}
#endif
+ sc->sc_msreport = 0;
}
/*ARGSUSED*/
@@ -224,7 +224,6 @@ wssoftintr(void *arg)
while (sc->sc_rxqhead != sc->sc_rxqtail) {
code = sc->sc_rxq[sc->sc_rxqhead];
sc->sc_rxqhead = OMKBD_NEXTRXQ(sc->sc_rxqhead);
-#if NWSMOUSE > 0
/*
* if (code >= 0x80 && code <= 0x87), then
* it's the first byte of 3 byte long mouse report
@@ -232,33 +231,34 @@ wssoftintr(void *arg)
* code[1], [2] -> x,y delta
* otherwise, key press or release event.
*/
- if (sc->sc_msreport == 0) {
- if (code < 0x80 || code > 0x87) {
- omkbd_input(sc, code);
- continue;
+ if (sc->sc_msreport != 0) {
+ sc->sc_msreport--;
+#if NWSMOUSE > 0
+ if (sc->sc_msreport != 0) {
+ sc->sc_msdx = (int8_t)code;
+ } else {
+ sc->sc_msdy = (int8_t)code;
+ wsmouse_input(sc->sc_wsmousedev,
+ sc->sc_msbuttons, sc->sc_msdx, sc->sc_msdy, 0, 0,
+ WSMOUSE_INPUT_DELTA);
+
}
- code = (code & 07) ^ 07;
- /* LMR->RML: wsevent counts 0 for leftmost */
- sc->sc_msbuttons = (code & 02);
- if ((code & 01) != 0)
- sc->sc_msbuttons |= 04;
- if ((code & 04) != 0)
- sc->sc_msbuttons |= 01;
- sc->sc_msreport = 1;
- } else if (sc->sc_msreport == 1) {
- sc->sc_msdx = (int8_t)code;
+#endif
+ continue;
+ }
+ if ((code & 0xf8) == 0x80) {
+ /* remain bytes for mouse data */
sc->sc_msreport = 2;
- } else if (sc->sc_msreport == 2) {
- sc->sc_msdy = (int8_t)code;
- wsmouse_input(sc->sc_wsmousedev,
- sc->sc_msbuttons, sc->sc_msdx, sc->sc_msdy, 0, 0,
- WSMOUSE_INPUT_DELTA);
-
- sc->sc_msreport = 0;
+#if NWSMOUSE > 0
+ /* buttons: Negative logic to positive */
+ code = ~code;
+ /* LMR->RML: wsevent counts 0 for leftmost */
+ sc->sc_msbuttons = ((code & 1) << 2) | (code & 2)
+ | ((code & 4) >> 2);
+#endif
+ continue;
}
-#else
omkbd_input(sc, code);
-#endif
}
}
@@ -379,10 +379,7 @@ omkbd_ioctl(void *v, u_long cmd, void *data, int flag, struct lwp *l)
static int
omms_enable(void *v)
{
- struct ws_softc *sc = v;
-
syscnputc((dev_t)1, 0x60); /* enable 3 byte long mouse reporting */
- sc->sc_msreport = 0;
return 0;
}
@@ -401,9 +398,6 @@ omms_ioctl(void *v, u_long cmd, void *data, int flag, struct lwp *l)
static void
omms_disable(void *v)
{
- struct ws_softc *sc = v;
-
syscnputc((dev_t)1, 0x20); /* quiet mouse */
- sc->sc_msreport = 0;
}
#endif
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment