[SVN] r3544 - trunk/SDL/src/video/win32

svn-owner at libsdl.org svn-owner at libsdl.org
Fri Feb 8 23:18:41 PST 2008


Author: slouken
Date: 2008-02-08 23:18:38 -0800 (Fri, 08 Feb 2008)
New Revision: 3544

Modified:
   trunk/SDL/src/video/win32/SDL_win32events.c
Log:
Undo keyboard layout based alphabetic key mapping.  Grr.... HACK HACK HACK...


Modified: trunk/SDL/src/video/win32/SDL_win32events.c
===================================================================
--- trunk/SDL/src/video/win32/SDL_win32events.c	2008-02-09 06:47:46 UTC (rev 3543)
+++ trunk/SDL/src/video/win32/SDL_win32events.c	2008-02-09 07:18:38 UTC (rev 3544)
@@ -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 @@
             }
 
             index = data->videodata->keyboard;
+            wParam = RemapVKEY(wParam, lParam);
             switch (wParam) {
             case VK_CONTROL:
                 if (lParam & EXTENDED_KEYMASK)
@@ -353,6 +381,7 @@
             int index;
 
             index = data->videodata->keyboard;
+            wParam = RemapVKEY(wParam, lParam);
             switch (wParam) {
             case VK_CONTROL:
                 if (lParam & EXTENDED_KEYMASK)



More information about the SVN mailing list