From 69b676ff9d6af274f23e507020d9b0af6e22a315 Mon Sep 17 00:00:00 2001 From: Sam Lantinga Date: Sat, 9 Feb 2008 07:18:38 +0000 Subject: [PATCH] Undo keyboard layout based alphabetic key mapping. Grr.... HACK HACK HACK... --HG-- extra : convert_revision : svn%3Ac70aab31-4412-0410-b14c-859654838e24/trunk%402722 --- src/video/win32/SDL_win32events.c | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/src/video/win32/SDL_win32events.c b/src/video/win32/SDL_win32events.c index 732331cff..a6fe3d892 100644 --- a/src/video/win32/SDL_win32events.c +++ b/src/video/win32/SDL_win32events.c @@ -47,6 +47,33 @@ #define GET_XBUTTON_WPARAM(w) (HIWORD(w)) #endif +static WPARAM +RemapVKEY(WPARAM wParam, LPARAM lParam) +{ + /* Windows remaps alphabetic keys based on current layout. + We try to provide USB scancodes, so undo this mapping. + */ + if (wParam >= 'A' && wParam <= 'Z') { + /* Alphabetic scancodes for PC keyboards */ + static BYTE scancodes[26] = { + 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 scancode = (lParam >> 16) & 0xFF; + int i; + + if (scancode != scancodes[wParam - 'A']) { + for (i = 0; i < SDL_arraysize(scancodes); ++i) { + if (scancode == scancodes[i]) { + wParam = 'A' + i; + break; + } + } + } + } + return wParam; +} + LRESULT CALLBACK WIN_WindowProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { @@ -310,6 +337,7 @@ WIN_WindowProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) } index = data->videodata->keyboard; + wParam = RemapVKEY(wParam, lParam); switch (wParam) { case VK_CONTROL: if (lParam & EXTENDED_KEYMASK) @@ -353,6 +381,7 @@ WIN_WindowProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) int index; index = data->videodata->keyboard; + wParam = RemapVKEY(wParam, lParam); switch (wParam) { case VK_CONTROL: if (lParam & EXTENDED_KEYMASK)