From 02403d38c99b4af0a92e33cfa58b7932e55f0939 Mon Sep 17 00:00:00 2001 From: "J?rgen P. Tjern?" Date: Mon, 25 Feb 2013 16:52:42 -0800 Subject: [PATCH] sdl2 - change the windows scancode logic to use the scan code value in lparam rather than VK's to get a stable scancode value across different KB layouts --- include/SDL_scancode.h | 3 + src/events/scancodes_windows.h | 287 +++--------------------- src/video/windows/SDL_windowsevents.c | 148 ++++++++++-- src/video/windows/SDL_windowskeyboard.c | 25 ++- test/checkkeys.c | 6 +- 5 files changed, 186 insertions(+), 283 deletions(-) diff --git a/include/SDL_scancode.h b/include/SDL_scancode.h index 32d9f4c71..b05ca5cca 100644 --- a/include/SDL_scancode.h +++ b/include/SDL_scancode.h @@ -385,6 +385,9 @@ typedef enum SDL_SCANCODE_EJECT = 281, SDL_SCANCODE_SLEEP = 282, + SDL_SCANCODE_APP1 = 283, + SDL_SCANCODE_APP2 = 284, + /*@}*//*Walther keys*/ /* Add any other keys here. */ diff --git a/src/events/scancodes_windows.h b/src/events/scancodes_windows.h index 496227984..e2c91ab38 100644 --- a/src/events/scancodes_windows.h +++ b/src/events/scancodes_windows.h @@ -25,262 +25,35 @@ - msdn.microsoft.com */ /* *INDENT-OFF* */ -static const SDL_Scancode windows_scancode_table[] = { - /* 0, 0x00 */ SDL_SCANCODE_UNKNOWN, - /* 1, 0x01 */ SDL_SCANCODE_UNKNOWN, - /* 2, 0x02 */ SDL_SCANCODE_UNKNOWN, - /* 3, 0x03 */ SDL_SCANCODE_UNKNOWN, - /* 4, 0x04 */ SDL_SCANCODE_UNKNOWN, - /* 5, 0x05 */ SDL_SCANCODE_UNKNOWN, - /* 6, 0x06 */ SDL_SCANCODE_UNKNOWN, - /* 7, 0x07 */ SDL_SCANCODE_UNKNOWN, - /* 8, 0x08 */ SDL_SCANCODE_BACKSPACE, - /* 9, 0x09 */ SDL_SCANCODE_TAB, - /* 10, 0x0a */ SDL_SCANCODE_KP_ENTER, /* Not a VKEY, SDL specific */ - /* 11, 0x0b */ SDL_SCANCODE_UNKNOWN, - /* 12, 0x0c */ SDL_SCANCODE_CLEAR, - /* 13, 0x0d */ SDL_SCANCODE_RETURN, - /* 14, 0x0e */ SDL_SCANCODE_UNKNOWN, - /* 15, 0x0f */ SDL_SCANCODE_UNKNOWN, - /* 16, 0x10 */ SDL_SCANCODE_UNKNOWN, - /* 17, 0x11 */ SDL_SCANCODE_UNKNOWN, - /* 18, 0x12 */ SDL_SCANCODE_APPLICATION, - /* 19, 0x13 */ SDL_SCANCODE_PAUSE, - /* 20, 0x14 */ SDL_SCANCODE_CAPSLOCK, - /* 21, 0x15 */ SDL_SCANCODE_UNKNOWN, - /* 22, 0x16 */ SDL_SCANCODE_UNKNOWN, - /* 23, 0x17 */ SDL_SCANCODE_UNKNOWN, - /* 24, 0x18 */ SDL_SCANCODE_UNKNOWN, - /* 25, 0x19 */ SDL_SCANCODE_UNKNOWN, - /* 26, 0x1a */ SDL_SCANCODE_UNKNOWN, - /* 27, 0x1b */ SDL_SCANCODE_ESCAPE, - /* 28, 0x1c */ SDL_SCANCODE_UNKNOWN, - /* 29, 0x1d */ SDL_SCANCODE_UNKNOWN, - /* 30, 0x1e */ SDL_SCANCODE_UNKNOWN, - /* 31, 0x1f */ SDL_SCANCODE_MODE, - /* 32, 0x20 */ SDL_SCANCODE_SPACE, - /* 33, 0x21 */ SDL_SCANCODE_PAGEUP, - /* 34, 0x22 */ SDL_SCANCODE_PAGEDOWN, - /* 35, 0x23 */ SDL_SCANCODE_END, - /* 36, 0x24 */ SDL_SCANCODE_HOME, - /* 37, 0x25 */ SDL_SCANCODE_LEFT, - /* 38, 0x26 */ SDL_SCANCODE_UP, - /* 39, 0x27 */ SDL_SCANCODE_RIGHT, - /* 40, 0x28 */ SDL_SCANCODE_DOWN, - /* 41, 0x29 */ SDL_SCANCODE_SELECT, - /* 42, 0x2a */ SDL_SCANCODE_UNKNOWN, /* VK_PRINT */ - /* 43, 0x2b */ SDL_SCANCODE_EXECUTE, - /* 44, 0x2c */ SDL_SCANCODE_PRINTSCREEN, - /* 45, 0x2d */ SDL_SCANCODE_INSERT, - /* 46, 0x2e */ SDL_SCANCODE_DELETE, - /* 47, 0x2f */ SDL_SCANCODE_HELP, - /* 48, 0x30 */ SDL_SCANCODE_0, - /* 49, 0x31 */ SDL_SCANCODE_1, - /* 50, 0x32 */ SDL_SCANCODE_2, - /* 51, 0x33 */ SDL_SCANCODE_3, - /* 52, 0x34 */ SDL_SCANCODE_4, - /* 53, 0x35 */ SDL_SCANCODE_5, - /* 54, 0x36 */ SDL_SCANCODE_6, - /* 55, 0x37 */ SDL_SCANCODE_7, - /* 56, 0x38 */ SDL_SCANCODE_8, - /* 57, 0x39 */ SDL_SCANCODE_9, - /* 58, 0x3a */ SDL_SCANCODE_UNKNOWN, - /* 59, 0x3b */ SDL_SCANCODE_UNKNOWN, - /* 60, 0x3c */ SDL_SCANCODE_UNKNOWN, - /* 61, 0x3d */ SDL_SCANCODE_UNKNOWN, - /* 62, 0x3e */ SDL_SCANCODE_UNKNOWN, - /* 63, 0x3f */ SDL_SCANCODE_UNKNOWN, - /* 64, 0x40 */ SDL_SCANCODE_UNKNOWN, - /* 65, 0x41 */ SDL_SCANCODE_A, - /* 66, 0x42 */ SDL_SCANCODE_B, - /* 67, 0x43 */ SDL_SCANCODE_C, - /* 68, 0x44 */ SDL_SCANCODE_D, - /* 69, 0x45 */ SDL_SCANCODE_E, - /* 70, 0x46 */ SDL_SCANCODE_F, - /* 71, 0x47 */ SDL_SCANCODE_G, - /* 72, 0x48 */ SDL_SCANCODE_H, - /* 73, 0x49 */ SDL_SCANCODE_I, - /* 74, 0x4a */ SDL_SCANCODE_J, - /* 75, 0x4b */ SDL_SCANCODE_K, - /* 76, 0x4c */ SDL_SCANCODE_L, - /* 77, 0x4d */ SDL_SCANCODE_M, - /* 78, 0x4e */ SDL_SCANCODE_N, - /* 79, 0x4f */ SDL_SCANCODE_O, - /* 80, 0x50 */ SDL_SCANCODE_P, - /* 81, 0x51 */ SDL_SCANCODE_Q, - /* 82, 0x52 */ SDL_SCANCODE_R, - /* 83, 0x53 */ SDL_SCANCODE_S, - /* 84, 0x54 */ SDL_SCANCODE_T, - /* 85, 0x55 */ SDL_SCANCODE_U, - /* 86, 0x56 */ SDL_SCANCODE_V, - /* 87, 0x57 */ SDL_SCANCODE_W, - /* 88, 0x58 */ SDL_SCANCODE_X, - /* 89, 0x59 */ SDL_SCANCODE_Y, - /* 90, 0x5a */ SDL_SCANCODE_Z, - /* 91, 0x5b */ SDL_SCANCODE_LGUI, - /* 92, 0x5c */ SDL_SCANCODE_RGUI, - /* 93, 0x5d */ SDL_SCANCODE_APPLICATION, - /* 94, 0x5e */ SDL_SCANCODE_UNKNOWN, - /* 95, 0x5f */ SDL_SCANCODE_UNKNOWN, - /* 96, 0x60 */ SDL_SCANCODE_KP_0, - /* 97, 0x61 */ SDL_SCANCODE_KP_1, - /* 98, 0x62 */ SDL_SCANCODE_KP_2, - /* 99, 0x63 */ SDL_SCANCODE_KP_3, - /* 100, 0x64 */ SDL_SCANCODE_KP_4, - /* 101, 0x65 */ SDL_SCANCODE_KP_5, - /* 102, 0x66 */ SDL_SCANCODE_KP_6, - /* 103, 0x67 */ SDL_SCANCODE_KP_7, - /* 104, 0x68 */ SDL_SCANCODE_KP_8, - /* 105, 0x69 */ SDL_SCANCODE_KP_9, - /* 106, 0x6a */ SDL_SCANCODE_KP_MULTIPLY, - /* 107, 0x6b */ SDL_SCANCODE_KP_PLUS, - /* 108, 0x6c */ SDL_SCANCODE_SEPARATOR, - /* 109, 0x6d */ SDL_SCANCODE_KP_MINUS, - /* 110, 0x6e */ SDL_SCANCODE_KP_DECIMAL, - /* 111, 0x6f */ SDL_SCANCODE_KP_DIVIDE, - /* 112, 0x70 */ SDL_SCANCODE_F1, - /* 113, 0x71 */ SDL_SCANCODE_F2, - /* 114, 0x72 */ SDL_SCANCODE_F3, - /* 115, 0x73 */ SDL_SCANCODE_F4, - /* 116, 0x74 */ SDL_SCANCODE_F5, - /* 117, 0x75 */ SDL_SCANCODE_F6, - /* 118, 0x76 */ SDL_SCANCODE_F7, - /* 119, 0x77 */ SDL_SCANCODE_F8, - /* 120, 0x78 */ SDL_SCANCODE_F9, - /* 121, 0x79 */ SDL_SCANCODE_F10, - /* 122, 0x7a */ SDL_SCANCODE_F11, - /* 123, 0x7b */ SDL_SCANCODE_F12, - /* 124, 0x7c */ SDL_SCANCODE_F13, - /* 125, 0x7d */ SDL_SCANCODE_F14, - /* 126, 0x7e */ SDL_SCANCODE_F15, - /* 127, 0x7f */ SDL_SCANCODE_F16, - /* 128, 0x80 */ SDL_SCANCODE_F17, /* or SDL_SCANCODE_AUDIONEXT */ - /* 129, 0x81 */ SDL_SCANCODE_F18, /* or SDL_SCANCODE_AUDIOPREV */ - /* 130, 0x82 */ SDL_SCANCODE_F19, /* or SDL_SCANCODE_AUDIOSTOP */ - /* 131, 0x83 */ SDL_SCANCODE_F20, /* or SDL_SCANCODE_AUDIOPLAY */ - /* 132, 0x84 */ SDL_SCANCODE_F21, /* or SDL_SCANCODE_MAIL */ - /* 133, 0x85 */ SDL_SCANCODE_F22, /* or SDL_SCANCODE_MEDIASELECT */ - /* 134, 0x86 */ SDL_SCANCODE_F23, /* or SDL_SCANCODE_WWW */ - /* 135, 0x87 */ SDL_SCANCODE_F24, /* or SDL_SCANCODE_CALCULATOR */ - /* 136, 0x88 */ SDL_SCANCODE_UNKNOWN, - /* 137, 0x89 */ SDL_SCANCODE_UNKNOWN, - /* 138, 0x8a */ SDL_SCANCODE_UNKNOWN, - /* 139, 0x8b */ SDL_SCANCODE_UNKNOWN, - /* 140, 0x8c */ SDL_SCANCODE_UNKNOWN, - /* 141, 0x8d */ SDL_SCANCODE_UNKNOWN, - /* 142, 0x8e */ SDL_SCANCODE_UNKNOWN, - /* 143, 0x8f */ SDL_SCANCODE_UNKNOWN, - /* 144, 0x90 */ SDL_SCANCODE_NUMLOCKCLEAR, - /* 145, 0x91 */ SDL_SCANCODE_SCROLLLOCK, - /* 146, 0x92 */ SDL_SCANCODE_KP_EQUALS, - /* 147, 0x93 */ SDL_SCANCODE_UNKNOWN, - /* 148, 0x94 */ SDL_SCANCODE_UNKNOWN, - /* 149, 0x95 */ SDL_SCANCODE_UNKNOWN, - /* 150, 0x96 */ SDL_SCANCODE_UNKNOWN, - /* 151, 0x97 */ SDL_SCANCODE_UNKNOWN, - /* 152, 0x98 */ SDL_SCANCODE_UNKNOWN, - /* 153, 0x99 */ SDL_SCANCODE_UNKNOWN, - /* 154, 0x9a */ SDL_SCANCODE_UNKNOWN, - /* 155, 0x9b */ SDL_SCANCODE_UNKNOWN, - /* 156, 0x9c */ SDL_SCANCODE_UNKNOWN, - /* 157, 0x9d */ SDL_SCANCODE_UNKNOWN, - /* 158, 0x9e */ SDL_SCANCODE_UNKNOWN, - /* 159, 0x9f */ SDL_SCANCODE_UNKNOWN, - /* 160, 0xa0 */ SDL_SCANCODE_LSHIFT, - /* 161, 0xa1 */ SDL_SCANCODE_RSHIFT, - /* 162, 0xa2 */ SDL_SCANCODE_LCTRL, - /* 163, 0xa3 */ SDL_SCANCODE_RCTRL, - /* 164, 0xa4 */ SDL_SCANCODE_LALT, - /* 165, 0xa5 */ SDL_SCANCODE_RALT, - /* 166, 0xa6 */ SDL_SCANCODE_AC_BACK, - /* 167, 0xa7 */ SDL_SCANCODE_AC_FORWARD, - /* 168, 0xa8 */ SDL_SCANCODE_AC_REFRESH, - /* 169, 0xa9 */ SDL_SCANCODE_AC_STOP, - /* 170, 0xaa */ SDL_SCANCODE_AC_SEARCH, - /* 171, 0xab */ SDL_SCANCODE_AC_BOOKMARKS, - /* 172, 0xac */ SDL_SCANCODE_AC_HOME, - /* 173, 0xad */ SDL_SCANCODE_AUDIOMUTE, - /* 174, 0xae */ SDL_SCANCODE_VOLUMEDOWN, - /* 175, 0xaf */ SDL_SCANCODE_VOLUMEUP, - /* 176, 0xb0 */ SDL_SCANCODE_AUDIONEXT, - /* 177, 0xb1 */ SDL_SCANCODE_AUDIOPREV, - /* 178, 0xb2 */ SDL_SCANCODE_AUDIOSTOP, - /* 179, 0xb3 */ SDL_SCANCODE_AUDIOPLAY, - /* 180, 0xb4 */ SDL_SCANCODE_MAIL, - /* 181, 0xb5 */ SDL_SCANCODE_MEDIASELECT, - /* 182, 0xb6 */ SDL_SCANCODE_UNKNOWN, /* VK_LAUNCH_APP1 */ - /* 183, 0xb7 */ SDL_SCANCODE_UNKNOWN, /* VK_LAUNCH_APP2 */ - /* 184, 0xb8 */ SDL_SCANCODE_UNKNOWN, - /* 185, 0xb9 */ SDL_SCANCODE_UNKNOWN, - /* 186, 0xba */ SDL_SCANCODE_SEMICOLON, - /* 187, 0xbb */ SDL_SCANCODE_EQUALS, - /* 188, 0xbc */ SDL_SCANCODE_COMMA, - /* 189, 0xbd */ SDL_SCANCODE_MINUS, - /* 190, 0xbe */ SDL_SCANCODE_PERIOD, - /* 191, 0xbf */ SDL_SCANCODE_SLASH, - /* 192, 0xc0 */ SDL_SCANCODE_GRAVE, - /* 193, 0xc1 */ SDL_SCANCODE_UNKNOWN, - /* 194, 0xc2 */ SDL_SCANCODE_UNKNOWN, - /* 195, 0xc3 */ SDL_SCANCODE_UNKNOWN, - /* 196, 0xc4 */ SDL_SCANCODE_UNKNOWN, - /* 197, 0xc5 */ SDL_SCANCODE_UNKNOWN, - /* 198, 0xc6 */ SDL_SCANCODE_UNKNOWN, - /* 199, 0xc7 */ SDL_SCANCODE_UNKNOWN, - /* 200, 0xc8 */ SDL_SCANCODE_UNKNOWN, - /* 201, 0xc9 */ SDL_SCANCODE_UNKNOWN, - /* 202, 0xca */ SDL_SCANCODE_UNKNOWN, - /* 203, 0xcb */ SDL_SCANCODE_UNKNOWN, - /* 204, 0xcc */ SDL_SCANCODE_UNKNOWN, - /* 205, 0xcd */ SDL_SCANCODE_UNKNOWN, - /* 206, 0xce */ SDL_SCANCODE_UNKNOWN, - /* 207, 0xcf */ SDL_SCANCODE_UNKNOWN, - /* 208, 0xd0 */ SDL_SCANCODE_UNKNOWN, - /* 209, 0xd1 */ SDL_SCANCODE_UNKNOWN, - /* 210, 0xd2 */ SDL_SCANCODE_UNKNOWN, - /* 211, 0xd3 */ SDL_SCANCODE_UNKNOWN, - /* 212, 0xd4 */ SDL_SCANCODE_UNKNOWN, - /* 213, 0xd5 */ SDL_SCANCODE_UNKNOWN, - /* 214, 0xd6 */ SDL_SCANCODE_UNKNOWN, - /* 215, 0xd7 */ SDL_SCANCODE_UNKNOWN, - /* 216, 0xd8 */ SDL_SCANCODE_UNKNOWN, - /* 217, 0xd9 */ SDL_SCANCODE_UNKNOWN, - /* 218, 0xda */ SDL_SCANCODE_UNKNOWN, - /* 219, 0xdb */ SDL_SCANCODE_LEFTBRACKET, - /* 220, 0xdc */ SDL_SCANCODE_BACKSLASH, - /* 221, 0xdd */ SDL_SCANCODE_RIGHTBRACKET, - /* 222, 0xde */ SDL_SCANCODE_APOSTROPHE, - /* 223, 0xdf */ SDL_SCANCODE_UNKNOWN, - /* 224, 0xe0 */ SDL_SCANCODE_UNKNOWN, - /* 225, 0xe1 */ SDL_SCANCODE_UNKNOWN, - /* 226, 0xe2 */ SDL_SCANCODE_NONUSBACKSLASH, - /* 227, 0xe3 */ SDL_SCANCODE_UNKNOWN, - /* 228, 0xe4 */ SDL_SCANCODE_UNKNOWN, - /* 229, 0xe5 */ SDL_SCANCODE_UNKNOWN, - /* 230, 0xe6 */ SDL_SCANCODE_UNKNOWN, - /* 231, 0xe7 */ SDL_SCANCODE_UNKNOWN, - /* 232, 0xe8 */ SDL_SCANCODE_UNKNOWN, - /* 233, 0xe9 */ SDL_SCANCODE_UNKNOWN, - /* 234, 0xea */ SDL_SCANCODE_UNKNOWN, - /* 235, 0xeb */ SDL_SCANCODE_UNKNOWN, - /* 236, 0xec */ SDL_SCANCODE_UNKNOWN, - /* 237, 0xed */ SDL_SCANCODE_UNKNOWN, - /* 238, 0xee */ SDL_SCANCODE_UNKNOWN, - /* 239, 0xef */ SDL_SCANCODE_UNKNOWN, - /* 240, 0xf0 */ SDL_SCANCODE_UNKNOWN, - /* 241, 0xf1 */ SDL_SCANCODE_UNKNOWN, - /* 242, 0xf2 */ SDL_SCANCODE_UNKNOWN, - /* 243, 0xf3 */ SDL_SCANCODE_UNKNOWN, - /* 244, 0xf4 */ SDL_SCANCODE_UNKNOWN, - /* 245, 0xf5 */ SDL_SCANCODE_UNKNOWN, - /* 246, 0xf6 */ SDL_SCANCODE_SYSREQ, - /* 247, 0xf7 */ SDL_SCANCODE_CRSEL, - /* 248, 0xf8 */ SDL_SCANCODE_EXSEL, - /* 249, 0xf9 */ SDL_SCANCODE_UNKNOWN, /* VK_EREOF */ - /* 250, 0xfa */ SDL_SCANCODE_UNKNOWN, /* VK_PLAY */ - /* 251, 0xfb */ SDL_SCANCODE_UNKNOWN, /* VK_ZOOM */ - /* 252, 0xfc */ SDL_SCANCODE_UNKNOWN, - /* 253, 0xfd */ SDL_SCANCODE_UNKNOWN, /* VK_PA1 */ - /* 254, 0xfe */ SDL_SCANCODE_CLEAR, - /* 255, 0xff */ SDL_SCANCODE_UNKNOWN, +// this maps non-translated keyboard scan codes to engine key codes +// Google for 'Keyboard Scan Code Specification' +static const SDL_Scancode windows_scancode_table[] = +{ + // 0 1 2 3 4 5 6 7 + // 8 9 A B C D E F + SDL_SCANCODE_UNKNOWN, SDL_SCANCODE_ESCAPE, SDL_SCANCODE_1, SDL_SCANCODE_2, SDL_SCANCODE_3, SDL_SCANCODE_4, SDL_SCANCODE_5, SDL_SCANCODE_6, // 0 + SDL_SCANCODE_7, SDL_SCANCODE_8, SDL_SCANCODE_9, SDL_SCANCODE_0, SDL_SCANCODE_MINUS, SDL_SCANCODE_EQUALS, SDL_SCANCODE_BACKSPACE, SDL_SCANCODE_TAB, // 0 + + SDL_SCANCODE_Q, SDL_SCANCODE_W, SDL_SCANCODE_E, SDL_SCANCODE_R, SDL_SCANCODE_T, SDL_SCANCODE_Y, SDL_SCANCODE_U, SDL_SCANCODE_I, // 1 + SDL_SCANCODE_O, SDL_SCANCODE_P, SDL_SCANCODE_LEFTBRACKET, SDL_SCANCODE_RIGHTBRACKET, SDL_SCANCODE_RETURN, SDL_SCANCODE_LCTRL, SDL_SCANCODE_A, SDL_SCANCODE_S, // 1 + + SDL_SCANCODE_D, SDL_SCANCODE_F, SDL_SCANCODE_G, SDL_SCANCODE_H, SDL_SCANCODE_J, SDL_SCANCODE_K, SDL_SCANCODE_L, SDL_SCANCODE_SEMICOLON, // 2 + SDL_SCANCODE_APOSTROPHE, SDL_SCANCODE_GRAVE, SDL_SCANCODE_LSHIFT, SDL_SCANCODE_BACKSLASH, SDL_SCANCODE_Z, SDL_SCANCODE_X, SDL_SCANCODE_C, SDL_SCANCODE_V, // 2 + + SDL_SCANCODE_B, SDL_SCANCODE_N, SDL_SCANCODE_M, SDL_SCANCODE_COMMA, SDL_SCANCODE_PERIOD, SDL_SCANCODE_SLASH, SDL_SCANCODE_RSHIFT, SDL_SCANCODE_PRINTSCREEN,// 3 + SDL_SCANCODE_LALT, SDL_SCANCODE_SPACE, SDL_SCANCODE_CAPSLOCK, SDL_SCANCODE_F1, SDL_SCANCODE_F2, SDL_SCANCODE_F3, SDL_SCANCODE_F4, SDL_SCANCODE_F5, // 3 + + SDL_SCANCODE_F6, SDL_SCANCODE_F7, SDL_SCANCODE_F8, SDL_SCANCODE_F9, SDL_SCANCODE_F10, SDL_SCANCODE_NUMLOCKCLEAR, SDL_SCANCODE_SCROLLLOCK,SDL_SCANCODE_HOME, // 4 + SDL_SCANCODE_UP, SDL_SCANCODE_PAGEUP, SDL_SCANCODE_KP_MINUS, SDL_SCANCODE_LEFT, SDL_SCANCODE_KP_5, SDL_SCANCODE_RIGHT, SDL_SCANCODE_KP_PLUS, SDL_SCANCODE_END, // 4 + + SDL_SCANCODE_DOWN, SDL_SCANCODE_PAGEDOWN, SDL_SCANCODE_INSERT, SDL_SCANCODE_DELETE, SDL_SCANCODE_UNKNOWN, SDL_SCANCODE_UNKNOWN, SDL_SCANCODE_UNKNOWN, SDL_SCANCODE_F11, // 5 + SDL_SCANCODE_F12, SDL_SCANCODE_PAUSE, SDL_SCANCODE_UNKNOWN, SDL_SCANCODE_LGUI, SDL_SCANCODE_RGUI, SDL_SCANCODE_APPLICATION, SDL_SCANCODE_UNKNOWN, SDL_SCANCODE_UNKNOWN, // 5 + + SDL_SCANCODE_UNKNOWN, SDL_SCANCODE_UNKNOWN, SDL_SCANCODE_UNKNOWN, SDL_SCANCODE_UNKNOWN, SDL_SCANCODE_UNKNOWN, SDL_SCANCODE_UNKNOWN, SDL_SCANCODE_UNKNOWN, SDL_SCANCODE_UNKNOWN, // 6 + SDL_SCANCODE_UNKNOWN, SDL_SCANCODE_UNKNOWN, SDL_SCANCODE_UNKNOWN, SDL_SCANCODE_UNKNOWN, SDL_SCANCODE_UNKNOWN, SDL_SCANCODE_UNKNOWN, SDL_SCANCODE_UNKNOWN, SDL_SCANCODE_UNKNOWN, // 6 + + SDL_SCANCODE_UNKNOWN, SDL_SCANCODE_UNKNOWN, SDL_SCANCODE_UNKNOWN, SDL_SCANCODE_UNKNOWN, SDL_SCANCODE_UNKNOWN, SDL_SCANCODE_UNKNOWN, SDL_SCANCODE_UNKNOWN, SDL_SCANCODE_UNKNOWN, // 7 + SDL_SCANCODE_UNKNOWN, SDL_SCANCODE_UNKNOWN, SDL_SCANCODE_UNKNOWN, SDL_SCANCODE_UNKNOWN, SDL_SCANCODE_UNKNOWN, SDL_SCANCODE_UNKNOWN, SDL_SCANCODE_UNKNOWN, SDL_SCANCODE_UNKNOWN // 7 }; + /* *INDENT-ON* */ diff --git a/src/video/windows/SDL_windowsevents.c b/src/video/windows/SDL_windowsevents.c index 863daf7ec..34baac8da 100644 --- a/src/video/windows/SDL_windowsevents.c +++ b/src/video/windows/SDL_windowsevents.c @@ -105,6 +105,126 @@ RemapVKEY(WPARAM wParam, LPARAM lParam) return wParam; } +static SDL_Scancode +WindowsScanCodeToSDLScanCode( int lParam, int wParam, const SDL_Scancode *key_map ) +{ + SDL_Scancode code; + char bIsExtended; + int nScanCode = ( lParam >> 16 ) & 0xFF; + + if ( nScanCode == 0 ) + { + switch( wParam ) + { + case VK_CLEAR: return SDL_SCANCODE_CLEAR; + case VK_MODECHANGE: return SDL_SCANCODE_MODE; + case VK_SELECT: return SDL_SCANCODE_SELECT; + case VK_EXECUTE: return SDL_SCANCODE_EXECUTE; + case VK_HELP: return SDL_SCANCODE_HELP; + + case VK_F13: return SDL_SCANCODE_F13; + case VK_F14: return SDL_SCANCODE_F14; + case VK_F15: return SDL_SCANCODE_F15; + case VK_F16: return SDL_SCANCODE_F16; + case VK_F17: return SDL_SCANCODE_F17; + case VK_F18: return SDL_SCANCODE_F18; + case VK_F19: return SDL_SCANCODE_F19; + case VK_F20: return SDL_SCANCODE_F20; + case VK_F21: return SDL_SCANCODE_F21; + case VK_F22: return SDL_SCANCODE_F22; + case VK_F23: return SDL_SCANCODE_F23; + case VK_F24: return SDL_SCANCODE_F24; + + case VK_OEM_NEC_EQUAL: return SDL_SCANCODE_KP_EQUALS; + case VK_BROWSER_BACK: return SDL_SCANCODE_AC_BACK; + case VK_BROWSER_FORWARD: return SDL_SCANCODE_AC_FORWARD; + case VK_BROWSER_REFRESH: return SDL_SCANCODE_AC_REFRESH; + case VK_BROWSER_STOP: return SDL_SCANCODE_AC_STOP; + case VK_BROWSER_SEARCH: return SDL_SCANCODE_AC_SEARCH; + case VK_BROWSER_FAVORITES: return SDL_SCANCODE_AC_BOOKMARKS; + case VK_BROWSER_HOME: return SDL_SCANCODE_AC_HOME; + case VK_VOLUME_MUTE: return SDL_SCANCODE_AUDIOMUTE; + case VK_VOLUME_DOWN: return SDL_SCANCODE_VOLUMEDOWN; + case VK_VOLUME_UP: return SDL_SCANCODE_VOLUMEUP; + + case VK_MEDIA_NEXT_TRACK: return SDL_SCANCODE_AUDIONEXT; + case VK_MEDIA_PREV_TRACK: return SDL_SCANCODE_AUDIOPREV; + case VK_MEDIA_STOP: return SDL_SCANCODE_AUDIOSTOP; + case VK_MEDIA_PLAY_PAUSE: return SDL_SCANCODE_AUDIOPLAY; + case VK_LAUNCH_MAIL: return SDL_SCANCODE_MAIL; + case VK_LAUNCH_MEDIA_SELECT: return SDL_SCANCODE_MEDIASELECT; + + case VK_OEM_102: return SDL_SCANCODE_NONUSBACKSLASH; + + case VK_ATTN: return SDL_SCANCODE_SYSREQ; + case VK_CRSEL: return SDL_SCANCODE_CRSEL; + case VK_EXSEL: return SDL_SCANCODE_EXSEL; + case VK_OEM_CLEAR: return SDL_SCANCODE_CLEAR; + + case VK_LAUNCH_APP1: return SDL_SCANCODE_APP1; + case VK_LAUNCH_APP2: return SDL_SCANCODE_APP2; + + default: return SDL_SCANCODE_UNKNOWN; + } + } + + if ( nScanCode > 127 ) + return SDL_SCANCODE_UNKNOWN; + + code = key_map[nScanCode]; + + bIsExtended = ( lParam & ( 1 << 24 ) ) != 0; + if ( !bIsExtended ) + { + switch ( code ) + { + case SDL_SCANCODE_HOME: + return SDL_SCANCODE_KP_7; + case SDL_SCANCODE_UP: + return SDL_SCANCODE_KP_8; + case SDL_SCANCODE_PAGEUP: + return SDL_SCANCODE_KP_9; + case SDL_SCANCODE_LEFT: + return SDL_SCANCODE_KP_4; + case SDL_SCANCODE_RIGHT: + return SDL_SCANCODE_KP_6; + case SDL_SCANCODE_END: + return SDL_SCANCODE_KP_1; + case SDL_SCANCODE_DOWN: + return SDL_SCANCODE_KP_2; + case SDL_SCANCODE_PAGEDOWN: + return SDL_SCANCODE_KP_3; + case SDL_SCANCODE_INSERT: + return SDL_SCANCODE_KP_0; + case SDL_SCANCODE_DELETE: + return SDL_SCANCODE_KP_DECIMAL; + case SDL_SCANCODE_PRINTSCREEN: + return SDL_SCANCODE_KP_MULTIPLY; + default: + break; + } + } + else + { + switch ( code ) + { + case SDL_SCANCODE_RETURN: + return SDL_SCANCODE_KP_ENTER; + case SDL_SCANCODE_LALT: + return SDL_SCANCODE_RALT; + case SDL_SCANCODE_LCTRL: + return SDL_SCANCODE_RCTRL; + case SDL_SCANCODE_SLASH: + return SDL_SCANCODE_KP_DIVIDE; + case SDL_SCANCODE_CAPSLOCK: + return SDL_SCANCODE_KP_PLUS; + } + } + + return code; +} + + LRESULT CALLBACK WIN_WindowProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { @@ -311,6 +431,7 @@ WIN_WindowProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) case WM_SYSKEYDOWN: case WM_KEYDOWN: { + SDL_Scancode code; wParam = RemapVKEY(wParam, lParam); switch (wParam) { case VK_CONTROL: @@ -346,9 +467,9 @@ WIN_WindowProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) wParam = VK_ENTER; break; } - if (wParam < 256) { - SDL_SendKeyboardKey(SDL_PRESSED, - data->videodata->key_layout[wParam]); + code = WindowsScanCodeToSDLScanCode( lParam, wParam, data->videodata->key_layout ); + if ( code != SDL_SCANCODE_UNKNOWN ) { + SDL_SendKeyboardKey(SDL_PRESSED, code ); } } returnCode = 0; @@ -357,7 +478,8 @@ WIN_WindowProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) case WM_SYSKEYUP: case WM_KEYUP: { - wParam = RemapVKEY(wParam, lParam); + SDL_Scancode code; + wParam = RemapVKEY(wParam, lParam); switch (wParam) { case VK_CONTROL: if (lParam & EXTENDED_KEYMASK) @@ -394,15 +516,15 @@ WIN_WindowProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) } /* Windows only reports keyup for print screen */ - if (wParam == VK_SNAPSHOT - && SDL_GetKeyboardState(NULL)[SDL_SCANCODE_PRINTSCREEN] == - SDL_RELEASED) { - SDL_SendKeyboardKey(SDL_PRESSED, - data->videodata->key_layout[wParam]); - } - if (wParam < 256) { - SDL_SendKeyboardKey(SDL_RELEASED, - data->videodata->key_layout[wParam]); + code = WindowsScanCodeToSDLScanCode( lParam, wParam, data->videodata->key_layout ); + if ( code != SDL_SCANCODE_UNKNOWN ) { + if (wParam == VK_SNAPSHOT + && SDL_GetKeyboardState(NULL)[SDL_SCANCODE_PRINTSCREEN] == + SDL_RELEASED) { + SDL_SendKeyboardKey(SDL_PRESSED, + code); + } + SDL_SendKeyboardKey(SDL_RELEASED, code ); } } returnCode = 0; diff --git a/src/video/windows/SDL_windowskeyboard.c b/src/video/windows/SDL_windowskeyboard.c index dcdd78455..26695f7a0 100644 --- a/src/video/windows/SDL_windowskeyboard.c +++ b/src/video/windows/SDL_windowskeyboard.c @@ -90,6 +90,7 @@ WIN_InitKeyboard(_THIS) } } + // windows scancode to SDL scancode table data->key_layout = windows_scancode_table; data->ime_com_initialized = SDL_FALSE; @@ -150,24 +151,28 @@ WIN_UpdateKeymap() SDL_Scancode scancode; SDL_Keycode keymap[SDL_NUM_SCANCODES]; - SDL_GetDefaultKeymap(keymap); + for (i = 0; i < SDL_arraysize(keymap); ++i) + { + keymap[i] = SDL_SCANCODE_TO_KEYCODE( i ); + } for (i = 0; i < SDL_arraysize(windows_scancode_table); i++) { - + int vk; /* Make sure this scancode is a valid character scancode */ scancode = windows_scancode_table[i]; - if (scancode == SDL_SCANCODE_UNKNOWN || keymap[scancode] >= 127) { + if (scancode == SDL_SCANCODE_UNKNOWN ) { continue; } - /* Alphabetic keys are handled specially, since Windows remaps them */ - if (i >= 'A' && i <= 'Z') { - BYTE vsc = alpha_scancodes[i - 'A']; - keymap[scancode] = MapVirtualKey(vsc, MAPVK_VSC_TO_VK) + 0x20; - } else { - keymap[scancode] = (MapVirtualKey(i, MAPVK_VK_TO_CHAR) & 0x7FFF); - } + vk = MapVirtualKey(i, MAPVK_VSC_TO_VK); + if ( vk ) { + int ch; + ch = (MapVirtualKey( vk, MAPVK_VK_TO_CHAR ) & 0x7FFF); + if ( ch ) + keymap[scancode] = ch; + } } + SDL_SetKeymap(0, keymap, SDL_NUM_SCANCODES); } diff --git a/test/checkkeys.c b/test/checkkeys.c index fdbce60dd..49dc277b2 100644 --- a/test/checkkeys.c +++ b/test/checkkeys.c @@ -105,7 +105,7 @@ PrintKey(SDL_Keysym * sym, SDL_bool pressed, SDL_bool repeat) "Unknown Key (scancode %d = %s) %s ", sym->scancode, SDL_GetScancodeName(sym->scancode), - pressed ? "pressed" : "released"); + pressed ? "pressed " : "released"); } /* Print the translated character, if one exists */ @@ -129,13 +129,13 @@ PrintKey(SDL_Keysym * sym, SDL_bool pressed, SDL_bool repeat) if (repeat) { print_string(&spot, &left, " (repeat)"); } - SDL_Log("%s", message); + SDL_Log("%s\n", message); } static void PrintText(char *text) { - SDL_Log("Text: %s", text); + SDL_Log("Text: %s\n", text); } int