diff options
| author | Hans Petter Selasky <hselasky@FreeBSD.org> | 2020-03-30 15:29:39 +0000 |
|---|---|---|
| committer | Hans Petter Selasky <hselasky@FreeBSD.org> | 2020-03-30 15:29:39 +0000 |
| commit | 8e2e5ae7d1804c45e12876c412edbcc13f735dd3 (patch) | |
| tree | 6f80b9d1ff17772b510b17a07f712de495e47924 /sys/dev/usb/input | |
| parent | 9b1d850be89f83b4a427318745e2f90cdec1854e (diff) | |
Notes
Diffstat (limited to 'sys/dev/usb/input')
| -rw-r--r-- | sys/dev/usb/input/ukbd.c | 20 |
1 files changed, 17 insertions, 3 deletions
diff --git a/sys/dev/usb/input/ukbd.c b/sys/dev/usb/input/ukbd.c index 355dbdb21475..33e137dbbfae 100644 --- a/sys/dev/usb/input/ukbd.c +++ b/sys/dev/usb/input/ukbd.c @@ -499,6 +499,21 @@ ukbd_interrupt(struct ukbd_softc *sc) UKBD_LOCK_ASSERT(); + /* Check for modifier key changes first */ + for (key = 0xe0; key != 0xe8; key++) { + const uint64_t mask = 1ULL << (key % 64); + const uint64_t delta = + sc->sc_odata.bitmap[key / 64] ^ + sc->sc_ndata.bitmap[key / 64]; + + if (delta & mask) { + if (sc->sc_odata.bitmap[key / 64] & mask) + ukbd_put_key(sc, key | KEY_RELEASE); + else + ukbd_put_key(sc, key | KEY_PRESS); + } + } + /* Check for key changes */ for (key = 0; key != UKBD_NKEYCODE; key++) { const uint64_t mask = 1ULL << (key % 64); @@ -509,6 +524,8 @@ ukbd_interrupt(struct ukbd_softc *sc) if (mask == 1 && delta == 0) { key += 63; continue; /* skip empty areas */ + } else if (ukbd_is_modifier_key(key)) { + continue; } else if (delta & mask) { if (sc->sc_odata.bitmap[key / 64] & mask) { ukbd_put_key(sc, key | KEY_RELEASE); @@ -519,9 +536,6 @@ ukbd_interrupt(struct ukbd_softc *sc) } else { ukbd_put_key(sc, key | KEY_PRESS); - if (ukbd_is_modifier_key(key)) - continue; - sc->sc_co_basetime = sbinuptime(); sc->sc_delay = sc->sc_kbd.kb_delay1; ukbd_start_timer(sc); |
