diff options
author | Ross Burton <ross@burtonini.com> | 2008-04-22 18:05:53 +0100 |
---|---|---|
committer | Ross Burton <ross@burtonini.com> | 2008-04-22 18:05:53 +0100 |
commit | c4fd1121531b0cba1a3e90fa747871d784365c7e (patch) | |
tree | e7b141644ada98efb625988dc419c131892a71a0 | |
parent | 455383db95618a05ebdbeae78423e08065f0e14e (diff) |
Add mediumraw support to the linux kdrive driver
Signed-off-by: Daniel Stone <daniel@fooishbar.org>
-rw-r--r-- | hw/kdrive/linux/keyboard.c | 26 |
1 files changed, 25 insertions, 1 deletions
diff --git a/hw/kdrive/linux/keyboard.c b/hw/kdrive/linux/keyboard.c index 3193ab761..ae981b776 100644 --- a/hw/kdrive/linux/keyboard.c +++ b/hw/kdrive/linux/keyboard.c @@ -42,6 +42,8 @@ #include <sys/ioctl.h> 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] = { NoSymbol, NoSymbol, NoSymbol, NoSymbol, @@ -701,7 +703,29 @@ LinuxKeyboardRead (int fd, void *closure) else #endif scancode = b[0] & 0x7f; - KdEnqueueKeyboardEvent (closure, scancode, b[0] & 0x80); + /* 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); + 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++; } } |