Cleaned up WindowsScanCodeToSDLScanCode() so VKeytoScancode() always takes precedence for the keys it handles and the rest of the logic is easier to read.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129
diff --git a/src/video/windows/SDL_windowsevents.c b/src/video/windows/SDL_windowsevents.c
index 5247264..eca633b 100644
--- a/src/video/windows/SDL_windowsevents.c
+++ b/src/video/windows/SDL_windowsevents.c
@@ -143,70 +143,74 @@ static SDL_Scancode
WindowsScanCodeToSDLScanCode(LPARAM lParam, WPARAM wParam)
{
SDL_Scancode code;
- char bIsExtended;
int nScanCode = (lParam >> 16) & 0xFF;
+ SDL_bool bIsExtended = (lParam & (1 << 24)) != 0;
- /* 0x45 here to work around both pause and numlock sharing the same scancode, so use the VK key to tell them apart */
- if (nScanCode == 0 || nScanCode == 0x45) {
- return VKeytoScancode(wParam);
- }
+ code = VKeytoScancode(wParam);
- if (nScanCode > 127)
- return SDL_SCANCODE_UNKNOWN;
-
- code = windows_scancode_table[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_PERIOD;
- case SDL_SCANCODE_PRINTSCREEN:
- return SDL_SCANCODE_KP_MULTIPLY;
- default:
- break;
- }
- /* prefer virtual keycodes over scancodes for extended keys */
- } else {
- SDL_Scancode vc = VKeytoScancode(wParam);
- if (vc != SDL_SCANCODE_UNKNOWN) {
- code = vc;
- } else {
+ if (code == SDL_SCANCODE_UNKNOWN && nScanCode <= 127) {
+ code = windows_scancode_table[nScanCode];
+
+ if (bIsExtended) {
switch (code) {
case SDL_SCANCODE_RETURN:
- return SDL_SCANCODE_KP_ENTER;
+ code = SDL_SCANCODE_KP_ENTER;
+ break;
case SDL_SCANCODE_LALT:
- return SDL_SCANCODE_RALT;
+ code = SDL_SCANCODE_RALT;
+ break;
case SDL_SCANCODE_LCTRL:
- return SDL_SCANCODE_RCTRL;
+ code = SDL_SCANCODE_RCTRL;
+ break;
case SDL_SCANCODE_SLASH:
- return SDL_SCANCODE_KP_DIVIDE;
+ code = SDL_SCANCODE_KP_DIVIDE;
+ break;
case SDL_SCANCODE_CAPSLOCK:
- return SDL_SCANCODE_KP_PLUS;
+ code = SDL_SCANCODE_KP_PLUS;
+ break;
+ default:
+ break;
+ }
+ } else {
+ switch (code) {
+ case SDL_SCANCODE_HOME:
+ code = SDL_SCANCODE_KP_7;
+ break;
+ case SDL_SCANCODE_UP:
+ code = SDL_SCANCODE_KP_8;
+ break;
+ case SDL_SCANCODE_PAGEUP:
+ code = SDL_SCANCODE_KP_9;
+ break;
+ case SDL_SCANCODE_LEFT:
+ code = SDL_SCANCODE_KP_4;
+ break;
+ case SDL_SCANCODE_RIGHT:
+ code = SDL_SCANCODE_KP_6;
+ break;
+ case SDL_SCANCODE_END:
+ code = SDL_SCANCODE_KP_1;
+ break;
+ case SDL_SCANCODE_DOWN:
+ code = SDL_SCANCODE_KP_2;
+ break;
+ case SDL_SCANCODE_PAGEDOWN:
+ code = SDL_SCANCODE_KP_3;
+ break;
+ case SDL_SCANCODE_INSERT:
+ code = SDL_SCANCODE_KP_0;
+ break;
+ case SDL_SCANCODE_DELETE:
+ code = SDL_SCANCODE_KP_PERIOD;
+ break;
+ case SDL_SCANCODE_PRINTSCREEN:
+ code = SDL_SCANCODE_KP_MULTIPLY;
+ break;
default:
break;
}
}
}
-
return code;
}