Replaced USER32.DLL use by hardcoded tables for VkKeyScanA and
MapVirtualKeyA.
diff --git a/win32/console.c b/win32/console.c
index 2d6f45e..d831db2 100644
--- a/win32/console.c
+++ b/win32/console.c
@@ -10,8 +10,6 @@
/* FIXME:
* - Completely lacks SCREENBUFFER interface.
* - No abstraction for something other than xterm.
- * - Key input translation shouldn't use VkKeyScan and MapVirtualKey, since
- * they are window (USER) driver dependend.
* - Output sometimes is buffered (We switched off buffering by ~ICANON ?)
*/
/* Reference applications:
@@ -54,6 +52,44 @@
DEFAULT_DEBUG_CHANNEL(console)
+/* Ascii -> VK, generated by calling VkKeyScanA(i) */
+static int vkkeyscan_table[256] = {
+ 0,0,0,0,0,0,0,0,8,9,0,0,0,13,0,0,0,0,0,19,145,556,0,0,0,0,0,27,0,0,0,
+ 0,32,305,478,307,308,309,311,222,313,304,312,443,188,189,190,191,48,
+ 49,50,51,52,53,54,55,56,57,442,186,444,187,446,447,306,321,322,323,
+ 324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,
+ 341,342,343,344,345,346,219,220,221,310,445,192,65,66,67,68,69,70,71,
+ 72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,475,476,477,
+ 448,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,400,0,0,0,0,0,0
+};
+
+static int mapvkey_0[256]={
+ 0,0,0,0,0,0,0,0,14,15,0,0,0,28,0,0,42,29,56,69,58,0,0,0,0,0,0,1,0,0,
+ 0,0,57,73,81,79,71,75,72,77,80,0,0,0,55,82,83,0,11,2,3,4,5,6,7,8,9,
+ 10,0,0,0,0,0,0,0,30,48,46,32,18,33,34,35,23,36,37,38,50,49,24,25,16,
+ 19,31,20,22,47,17,45,21,44,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,55,78,0,74,
+ 0,53,59,60,61,62,63,64,65,66,67,68,87,88,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,69,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,39,13,51,12,52,53,41,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,26,43,27,40,76,96,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+};
+
+static int mapvkey_1[256]={
+ 0,27,49,50,51,52,53,54,55,56,57,48,189,187,8,9,81,87,69,82,84,89,85,
+ 73,79,80,219,221,13,17,65,83,68,70,71,72,74,75,76,186,222,192,16,220,
+ 90,88,67,86,66,78,77,188,190,191,16,106,18,32,20,112,113,114,115,116,
+ 117,118,119,120,121,144,145,36,38,33,109,37,223,39,107,35,40,34,45,
+ 46,0,0,0,122,123,0,0,0,0,0,0,0,224,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0
+};
/* FIXME: Should be in an internal header file. OK, so which one?
Used by CONSOLE_makecomplex. */
@@ -102,22 +138,16 @@
ir.Event.KeyEvent.dwControlKeyState|=LEFT_ALT_PRESSED;
inchar &= ~0x80;
}
-#if 0 /* FIXME: cannot call USER functions here */
- ir.Event.KeyEvent.wVirtualKeyCode = VkKeyScan16(inchar);
+ ir.Event.KeyEvent.wVirtualKeyCode = vkkeyscan_table[inchar];
if (ir.Event.KeyEvent.wVirtualKeyCode & 0x0100)
ir.Event.KeyEvent.dwControlKeyState|=SHIFT_PRESSED;
if (ir.Event.KeyEvent.wVirtualKeyCode & 0x0200)
ir.Event.KeyEvent.dwControlKeyState|=LEFT_CTRL_PRESSED;
if (ir.Event.KeyEvent.wVirtualKeyCode & 0x0400)
ir.Event.KeyEvent.dwControlKeyState|=LEFT_ALT_PRESSED;
- ir.Event.KeyEvent.wVirtualScanCode = MapVirtualKey16(
- ir.Event.KeyEvent.wVirtualKeyCode & 0x00ff,
- 0 /* VirtualKeyCodes to ScanCode */
- );
-#else
- ir.Event.KeyEvent.wVirtualKeyCode = 0;
- ir.Event.KeyEvent.wVirtualScanCode = 0;
-#endif
+ ir.Event.KeyEvent.wVirtualScanCode = mapvkey_0[
+ ir.Event.KeyEvent.wVirtualKeyCode & 0x00ff
+ ]; /* VirtualKeyCodes to ScanCode */
ir.Event.KeyEvent.uChar.AsciiChar = inchar;
if ((inchar==127)||(inchar=='\b')) { /* backspace */
@@ -150,15 +180,10 @@
ir.Event.KeyEvent.bKeyDown = 1;
ir.Event.KeyEvent.wRepeatCount = 0;
-#if 0 /* FIXME: cannot call USER functions here */
- ir.Event.KeyEvent.wVirtualKeyCode = VkKeyScan16(27);
- ir.Event.KeyEvent.wVirtualScanCode = MapVirtualKey16(
- ir.Event.KeyEvent.wVirtualKeyCode,0
- );
-#else
ir.Event.KeyEvent.wVirtualKeyCode = VK_ESCAPE;
- ir.Event.KeyEvent.wVirtualScanCode = 1;
-#endif
+ ir.Event.KeyEvent.wVirtualScanCode = mapvkey_0[
+ ir.Event.KeyEvent.wVirtualKeyCode
+ ];
ir.Event.KeyEvent.dwControlKeyState = 0;
ir.Event.KeyEvent.uChar.AsciiChar = 27;
assert(WriteConsoleInputA( hConsoleInput, &ir, 1, &junk ));
@@ -240,11 +265,7 @@
}
if (scancode) {
ir.Event.KeyEvent.wVirtualScanCode = scancode;
-#if 0 /* FIXME: cannot call USER functions here */
- ir.Event.KeyEvent.wVirtualKeyCode = MapVirtualKey16(scancode,1);
-#else
- ir.Event.KeyEvent.wVirtualKeyCode = 0;
-#endif
+ ir.Event.KeyEvent.wVirtualKeyCode = mapvkey_1[scancode];
assert(WriteConsoleInputA( hConsoleInput, &ir, 1, &junk ));
ir.Event.KeyEvent.bKeyDown = 0;
assert(WriteConsoleInputA( hConsoleInput, &ir, 1, &junk ));