Add mediumraw support to the linux kdrive driver
Signed-off-by: Daniel Stone <daniel@fooishbar.org>
This commit is contained in:
parent
455383db95
commit
c4fd112153
|
@ -42,6 +42,8 @@
|
||||||
#include <sys/ioctl.h>
|
#include <sys/ioctl.h>
|
||||||
|
|
||||||
extern int LinuxConsoleFd;
|
extern int LinuxConsoleFd;
|
||||||
|
static unsigned char mediumraw_data, mediumraw_up;
|
||||||
|
static enum { DEFAULT, EXTBYTE1, EXTBYTE2 } mediumraw_state = DEFAULT;
|
||||||
|
|
||||||
static const KeySym linux_to_x[256] = {
|
static const KeySym linux_to_x[256] = {
|
||||||
NoSymbol, NoSymbol, NoSymbol, NoSymbol,
|
NoSymbol, NoSymbol, NoSymbol, NoSymbol,
|
||||||
|
@ -701,7 +703,29 @@ LinuxKeyboardRead (int fd, void *closure)
|
||||||
else
|
else
|
||||||
#endif
|
#endif
|
||||||
scancode = b[0] & 0x7f;
|
scancode = b[0] & 0x7f;
|
||||||
|
/* This is extended medium raw mode interpreter
|
||||||
|
see linux/drivers/keyboard.c (kbd->kbdmode == VC_MEDIUMRAW) */
|
||||||
|
switch (mediumraw_state)
|
||||||
|
{
|
||||||
|
case DEFAULT:
|
||||||
|
if (scancode == 0)
|
||||||
|
{
|
||||||
|
mediumraw_state = EXTBYTE1;
|
||||||
|
mediumraw_up = b[0] & 0x80;
|
||||||
|
}
|
||||||
|
else
|
||||||
KdEnqueueKeyboardEvent (closure, scancode, b[0] & 0x80);
|
KdEnqueueKeyboardEvent (closure, scancode, b[0] & 0x80);
|
||||||
|
break;
|
||||||
|
case EXTBYTE1:
|
||||||
|
mediumraw_data = scancode;
|
||||||
|
mediumraw_state = EXTBYTE2;
|
||||||
|
break;
|
||||||
|
case EXTBYTE2:
|
||||||
|
/* Note: Only codes < 256 will pass correctly through KdEnqueueKeyboardEvent() */
|
||||||
|
KdEnqueueKeyboardEvent (closure, (int)mediumraw_data << 7 | scancode, mediumraw_up);
|
||||||
|
mediumraw_state = DEFAULT;
|
||||||
|
break;
|
||||||
|
}
|
||||||
b++;
|
b++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue