Index: xorg-server-1.2.0/hw/kdrive/linux/keyboard.c =================================================================== --- xorg-server-1.2.0.orig/hw/kdrive/linux/keyboard.c 2007-01-23 05:39:15.000000000 +0000 +++ xorg-server-1.2.0/hw/kdrive/linux/keyboard.c 2007-07-10 22:25:30.000000000 +0000 @@ -384,14 +384,36 @@ LinuxKeyboardRead (int fd, void *closure) { unsigned char buf[256], *b; - int n; + int n, mediumraw_data, mediumraw_event; + static enum { OFF, BYTE1, BYTE2 } mediumraw_state = OFF; while ((n = read (fd, buf, sizeof (buf))) > 0) { b = buf; while (n--) { - KdEnqueueKeyboardEvent (b[0] & 0x7f, b[0] & 0x80); + switch (mediumraw_state) + { + case OFF: + if ( (b[0] & 0x7f) == 0) + { + mediumraw_state = BYTE1; + mediumraw_event = b[0] & 0x80; + } + else + KdEnqueueKeyboardEvent (b[0] & 0x7f, b[0] & 0x80); + break; + case BYTE1: + mediumraw_data = (b[0] & 0x7f) << 7; + mediumraw_state = BYTE2; + break; + case BYTE2: + /* FIXME: KdEnqueueKeyboardEvent should accept word size */ + KdEnqueueKeyboardEvent ( mediumraw_data | (b[0] & 0x7f), mediumraw_event); + mediumraw_data = (b[1] & 0x7f) << 7; + mediumraw_state = OFF; + break; + } b++; } }