Get the cursor keys on the numpad working (patch by tinus). Modified: trunk/reactos/subsys/system/usetup/keytrans.c _____
Modified: trunk/reactos/subsys/system/usetup/keytrans.c --- trunk/reactos/subsys/system/usetup/keytrans.c 2005-11-23 22:01:38 UTC (rev 19505) +++ trunk/reactos/subsys/system/usetup/keytrans.c 2005-11-23 22:10:30 UTC (rev 19506) @@ -53,11 +53,11 @@
VK_F2, VK_F3, VK_F4, VK_F5, /* 0x40 */ VK_F6, VK_F7, VK_F8, VK_F9, - VK_F10, VK_NUMLOCK, VK_SCROLL, VK_NUMPAD7, - VK_NUMPAD8, VK_NUMPAD9, VK_SUBTRACT, VK_NUMPAD4, - VK_NUMPAD5, VK_NUMPAD6, VK_ADD, VK_NUMPAD1, + VK_F10, VK_NUMLOCK, VK_SCROLL, VK_HOME, + VK_UP, VK_PRIOR, VK_SUBTRACT, VK_LEFT, + 0, VK_RIGHT, VK_ADD, VK_END, /* 0x50 */ - VK_NUMPAD2, VK_NUMPAD3, VK_NUMPAD0, VK_SEPARATOR, + VK_DOWN, VK_NEXT, VK_INSERT, VK_DELETE, 0, 0, 0, VK_F11, VK_F12, 0, 0, 0, 0, 0, 0, 0, @@ -116,6 +116,56 @@ 0, 0, 0, 0 };
+/* + * Note how the keyboard lights are not handled, so while NUMLOCK_ON can + * be on, the light will never be. If this starts to be a problem it can be + * fixed, but it's too much work for too little gain to do now. + * Look in win32k/ntuser/input.c for an example. + */ + +static WORD KeyTableNumlock[] = { +/* 0x00 */ + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, +/* 0x10 */ + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, +/* 0x20 */ + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, +/* 0x30 */ + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, +/* 0x40 */ + 0, 0, 0, 0, + 0, 0, 0, VK_NUMPAD7, + VK_NUMPAD8, VK_NUMPAD9, 0, VK_NUMPAD4, + VK_NUMPAD5, VK_NUMPAD6, 0, VK_NUMPAD1, +/* 0x50 */ + VK_NUMPAD2, VK_NUMPAD3, VK_NUMPAD0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, +/* 0x60 */ + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, +/* 0x70 */ + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0 +}; + typedef struct _SCANTOASCII { USHORT ScanCode; USHORT Enhanced; @@ -225,6 +275,11 @@ Value = LEFT_ALT_PRESSED; break;
+ case 0x45: + Value = NUMLOCK_ON; + if (!(InputData->Flags & KEY_BREAK)) + *State ^= Value; + return; default: return; } @@ -253,6 +308,12 @@ IntVKFromKbdInput(PKEYBOARD_INPUT_DATA InputData, DWORD KeyState) { if (!(KeyState & ENHANCED_KEY)) { + if ((KeyState & NUMLOCK_ON) && + KeyTableNumlock[InputData->MakeCode & 0x7f]) { + DPRINT("Numlock, using %x\n", + InputData->MakeCode & 0x7f); + return KeyTableNumlock[InputData->MakeCode & 0x7f]; + } DPRINT("Not enhanced, using %x\n", InputData->MakeCode & 0x7f); return KeyTable[InputData->MakeCode & 0x7f]; }