# HG changeset patch # User Sam Lantinga # Date 1202763992 0 # Node ID f537a293b3dab5f0ce93ae440571bd3f00f03cd2 # Parent 5e1f06dc513692945e04887dc7c0a780649b14ab Windows also remaps the numeric keypad... grrr diff -r 5e1f06dc5136 -r f537a293b3da src/video/win32/SDL_win32events.c --- a/src/video/win32/SDL_win32events.c Mon Feb 11 20:26:22 2008 +0000 +++ b/src/video/win32/SDL_win32events.c Mon Feb 11 21:06:32 2008 +0000 @@ -33,8 +33,8 @@ #endif /* Masks for processing the windows KEYDOWN and KEYUP messages */ -#define REPEATED_KEYMASK (1<<30) -#define EXTENDED_KEYMASK (1<<24) +#define REPEATED_KEYMASK (1<<30) +#define EXTENDED_KEYMASK (1<<24) #define VK_ENTER 10 /* Keypad Enter ... no VKEY defined? */ @@ -52,13 +52,13 @@ static WPARAM RemapVKEY(WPARAM wParam, LPARAM lParam) { + int i; + BYTE scancode = (BYTE)((lParam >> 16) & 0xFF); + /* Windows remaps alphabetic keys based on current layout. We try to provide USB scancodes, so undo this mapping. */ if (wParam >= 'A' && wParam <= 'Z') { - BYTE scancode = (BYTE)((lParam >> 16) & 0xFF); - int i; - if (scancode != alpha_scancodes[wParam - 'A']) { for (i = 0; i < SDL_arraysize(alpha_scancodes); ++i) { if (scancode == alpha_scancodes[i]) { @@ -68,6 +68,15 @@ } } } + + /* Keypad keys are a little trickier, we always scan for them. */ + for (i = 0; i < SDL_arraysize(keypad_scancodes); ++i) { + if (scancode == keypad_scancodes[i]) { + wParam = VK_NUMPAD0+i; + break; + } + } + return wParam; } diff -r 5e1f06dc5136 -r f537a293b3da src/video/win32/SDL_win32keyboard.c --- a/src/video/win32/SDL_win32keyboard.c Mon Feb 11 20:26:22 2008 +0000 +++ b/src/video/win32/SDL_win32keyboard.c Mon Feb 11 21:06:32 2008 +0000 @@ -41,6 +41,9 @@ 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 }; +BYTE keypad_scancodes[10] = { + 82, 79, 80, 81, 75, 76, 77, 71, 72, 73 +}; void WIN_InitKeyboard(_THIS) @@ -57,6 +60,13 @@ printf("%d = %d\n", i, alpha_scancodes[i]); } } + if (MapVirtualKey(VK_NUMPAD0, MAPVK_VK_TO_VSC) != keypad_scancodes[0]) { +printf("Fixing keypad scancode map!\nPlease send the following 10 lines of output to the SDL mailing list , including a description of your keyboard hardware.\n"); + for (i = 0; i < SDL_arraysize(keypad_scancodes); ++i) { + keypad_scancodes[i] = MapVirtualKey(VK_NUMPAD0+i, MAPVK_VK_TO_VSC); +printf("%d = %d\n", i, keypad_scancodes[i]); + } + } data->key_layout = win32_scancode_table; diff -r 5e1f06dc5136 -r f537a293b3da src/video/win32/SDL_win32keyboard.h --- a/src/video/win32/SDL_win32keyboard.h Mon Feb 11 20:26:22 2008 +0000 +++ b/src/video/win32/SDL_win32keyboard.h Mon Feb 11 21:06:32 2008 +0000 @@ -25,6 +25,7 @@ #define _SDL_win32keyboard_h extern BYTE alpha_scancodes[26]; +extern BYTE keypad_scancodes[10]; extern void WIN_InitKeyboard(_THIS); extern void WIN_UpdateKeymap(int keyboard);