merge of '2641af179102d54034675cfdb4e90ed8d63ee913'
[vuplus_openembedded] / packages / xorg-xserver / xserver-kdrive-1.3.0.0 / linux-keyboard-mediumraw.patch
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
5 @@ -384,14 +384,35 @@
6  LinuxKeyboardRead (int fd, void *closure)
7  {
8      unsigned char   buf[256], *b;
9 -    int                    n;
10 +    int                    n, mediumraw_data, mediumraw_event;
11 +    static enum { LOWKEY, BYTE1, BYTE2 } mediumraw_state = LOWKEY;
12  
13      while ((n = read (fd, buf, sizeof (buf))) > 0)
14      {
15         b = buf;
16         while (n--)
17         {
18 -           KdEnqueueKeyboardEvent (b[0] & 0x7f, b[0] & 0x80);
19 +           switch (mediumraw_state)
20 +           {
21 +           case LOWKEY:
22 +               if ( (b[0] & 0x7f) == 0)
23 +               {
24 +                   mediumraw_state = BYTE1;
25 +                   mediumraw_event = b[0] & 0x80;
26 +               }
27 +               else
28 +                   KdEnqueueKeyboardEvent (b[0] & 0x7f, b[0] & 0x80);
29 +               break;
30 +           case BYTE1:
31 +               mediumraw_data = (b[0] & 0x7f) << 7;
32 +               mediumraw_state = BYTE2;
33 +               break;
34 +           case BYTE2:
35 +               /* FIXME: KdEnqueueKeyboardEvent should accept word size */
36 +               KdEnqueueKeyboardEvent ( mediumraw_data | (b[0] & 0x7f), mediumraw_event);
37 +               mediumraw_state = LOWKEY;
38 +               break;
39 +           }
40             b++;
41         }
42      }
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
47 @@ -430,12 +430,32 @@
48  {
49      KbdDevPtr pKbd = (KbdDevPtr) pInfo->private;
50      unsigned char rBuf[64];
51 -    int nBytes, i;
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) {
60 +           case LOWKEY:
61 +               if ( (rBuf[i] & 0x7f) == 0) {
62 +                   mediumraw_state = BYTE1;
63 +                   mediumraw_event = rBuf[i] & 0x80;
64 +               }
65 +               else
66 +                   pKbd->PostEvent(pInfo, rBuf[i] & 0x7f,
67 +                                   rBuf[i] & 0x80 ? FALSE : TRUE);
68 +               break;
69 +           case BYTE1:
70 +               mediumraw_data = (rBuf[i] & 0x7f) << 7;
71 +               mediumraw_state = BYTE2;
72 +               break;
73 +           case BYTE2:
74 +               pKbd->PostEvent(pInfo, mediumraw_data | (rBuf[i] & 0x7f),
75 +                               mediumraw_event ? FALSE : TRUE);
76 +               mediumraw_state = LOWKEY;
77 +               break;
78 +           }
79         }
80 +    }
81  }
82  
83  static Bool