svn commit: r260622 - head/sys/dev/usb/input
Hans Petter Selasky
hselasky at FreeBSD.org
Tue Jan 14 08:43:38 UTC 2014
Author: hselasky
Date: Tue Jan 14 08:43:38 2014
New Revision: 260622
URL: http://svnweb.freebsd.org/changeset/base/260622
Log:
Don't output any modifier keys before we see a valid
non-modifier key press. This prevents so-called "ghost
keyboards" keeping modifier keys pressed while not
actually seen as a real keyboard.
MFC after: 2 weeks
Modified:
head/sys/dev/usb/input/ukbd.c
Modified: head/sys/dev/usb/input/ukbd.c
==============================================================================
--- head/sys/dev/usb/input/ukbd.c Tue Jan 14 04:28:41 2014 (r260621)
+++ head/sys/dev/usb/input/ukbd.c Tue Jan 14 08:43:38 2014 (r260622)
@@ -197,6 +197,7 @@ struct ukbd_softc {
#define UKBD_FLAG_NUMLOCK 0x00080000
#define UKBD_FLAG_CAPSLOCK 0x00100000
#define UKBD_FLAG_SCROLLLOCK 0x00200000
+#define UKBD_FLAG_VALID_KEYS 0x00400000
int sc_mode; /* input mode (K_XLATE,K_RAW,K_CODE) */
int sc_state; /* shift/lock key state */
@@ -512,6 +513,41 @@ ukbd_interrupt(struct ukbd_softc *sc)
n_mod = sc->sc_ndata.modifiers;
o_mod = sc->sc_odata.modifiers;
+
+ /*
+ * Don't output any modifier keys before we see a valid
+ * non-modifier key press. This prevents so-called "ghost
+ * keyboards" keeping modifier keys pressed while not actually
+ * seen as a real keyboard.
+ */
+ if (sc->sc_flags & UKBD_FLAG_VALID_KEYS)
+ goto kfound;
+
+ for (i = 0; i != UKBD_NKEYCODE; i++) {
+ key = sc->sc_ndata.keycode[i];
+ switch (key) {
+ case 0xe0:
+ case 0xe4:
+ case 0xe1:
+ case 0xe5:
+ case 0xe2:
+ case 0xe6:
+ case 0xe3:
+ case 0xe7:
+ case 0x00:
+ case KEY_ERROR:
+ break;
+ default:
+ sc->sc_flags |= UKBD_FLAG_VALID_KEYS;
+ goto kfound;
+ }
+ }
+ DPRINTF("Keeping modifiers buffered\n");
+
+ /* keep modifiers in buffer */
+ sc->sc_ndata.modifiers = n_mod = 0;
+
+kfound:
if (n_mod != o_mod) {
for (i = 0; i < UKBD_NMOD; i++) {
if ((n_mod & ukbd_mods[i].mask) !=
More information about the svn-src-head
mailing list