1 Index: xorg-server-1.3.0.0/hw/kdrive/linux/keyboard.c
2 ===================================================================
3 --- xorg-server-1.3.0.0.orig/hw/kdrive/linux/keyboard.c 2006-11-16 18:01:23.000000000 +0000
4 +++ xorg-server-1.3.0.0/hw/kdrive/linux/keyboard.c 2007-08-12 12:14:29.000000000 +0000
6 LinuxKeyboardRead (int fd, void *closure)
8 unsigned char buf[256], *b;
10 + int n, mediumraw_data, mediumraw_event;
11 + static enum { LOWKEY, BYTE1, BYTE2 } mediumraw_state = LOWKEY;
13 while ((n = read (fd, buf, sizeof (buf))) > 0)
18 - KdEnqueueKeyboardEvent (b[0] & 0x7f, b[0] & 0x80);
19 + switch (mediumraw_state)
22 + if ( (b[0] & 0x7f) == 0)
24 + mediumraw_state = BYTE1;
25 + mediumraw_event = b[0] & 0x80;
28 + KdEnqueueKeyboardEvent (b[0] & 0x7f, b[0] & 0x80);
31 + mediumraw_data = (b[0] & 0x7f) << 7;
32 + mediumraw_state = BYTE2;
35 + /* FIXME: KdEnqueueKeyboardEvent should accept word size */
36 + KdEnqueueKeyboardEvent ( mediumraw_data | (b[0] & 0x7f), mediumraw_event);
37 + mediumraw_state = LOWKEY;
43 Index: xorg-server-1.3.0.0/hw/xfree86/os-support/linux/lnx_kbd.c
44 ===================================================================
45 --- xorg-server-1.3.0.0.orig/hw/xfree86/os-support/linux/lnx_kbd.c 2006-11-16 18:01:25.000000000 +0000
46 +++ xorg-server-1.3.0.0/hw/xfree86/os-support/linux/lnx_kbd.c 2007-08-12 12:14:29.000000000 +0000
49 KbdDevPtr pKbd = (KbdDevPtr) pInfo->private;
50 unsigned char rBuf[64];
52 + int nBytes, i, mediumraw_data, mediumraw_event;
53 + static enum { LOWKEY, BYTE1, BYTE2 } mediumraw_state = LOWKEY;
54 if ((nBytes = read( pInfo->fd, (char *)rBuf, sizeof(rBuf))) > 0) {
55 - for (i = 0; i < nBytes; i++)
56 - pKbd->PostEvent(pInfo, rBuf[i] & 0x7f,
57 - rBuf[i] & 0x80 ? FALSE : TRUE);
58 + for (i = 0; i < nBytes; i++) {
59 + switch (mediumraw_state) {
61 + if ( (rBuf[i] & 0x7f) == 0) {
62 + mediumraw_state = BYTE1;
63 + mediumraw_event = rBuf[i] & 0x80;
66 + pKbd->PostEvent(pInfo, rBuf[i] & 0x7f,
67 + rBuf[i] & 0x80 ? FALSE : TRUE);
70 + mediumraw_data = (rBuf[i] & 0x7f) << 7;
71 + mediumraw_state = BYTE2;
74 + pKbd->PostEvent(pInfo, mediumraw_data | (rBuf[i] & 0x7f),
75 + mediumraw_event ? FALSE : TRUE);
76 + mediumraw_state = LOWKEY;