SDL: Fix wrong keyboad button labels

console-destruction
Lukas Werling 2016-08-20 23:15:53 +02:00
parent b553d69d25
commit 2044fc3c06
3 changed files with 133 additions and 106 deletions

View File

@ -32,6 +32,11 @@
#include <SDL.h>
#endif
#ifdef USE_SDL_MAINLOOP
// Required for KeycodeToString translation table.
#include "platform/C4App.h"
#endif
/* ----------------- Key maps ------------------ */
struct C4KeyShiftMapEntry
@ -443,7 +448,8 @@ StdStrBuf C4KeyCodeEx::KeyCode2String(C4KeyCode wCode, bool fHumanReadable, bool
return FormatString("\\x%x", static_cast<unsigned int>(wCode));
#elif defined(USE_SDL_MAINLOOP)
StdStrBuf buf;
buf.Copy(SDL_GetScancodeName(static_cast<SDL_Scancode>(wCode)));
auto name = KeycodeToString(wCode);
if (name) buf.Copy(name);
if (!buf.getLength()) buf.Format("\\x%x", wCode);
return buf;
#endif

View File

@ -29,6 +29,8 @@
#ifdef USE_SDL_MAINLOOP
#include <SDL.h>
const char* KeycodeToString(C4KeyCode code);
#endif
#ifdef USE_WIN32_WINDOWS

View File

@ -131,119 +131,138 @@ bool C4AbstractApp::FlushMessages()
return true;
}
#define SDL_SCANCODE_KEYCODE \
X(SDL_SCANCODE_LSHIFT, K_SHIFT_L) \
X(SDL_SCANCODE_RSHIFT, K_SHIFT_R) \
X(SDL_SCANCODE_LCTRL, K_CONTROL_L) \
X(SDL_SCANCODE_RCTRL, K_CONTROL_R) \
X(SDL_SCANCODE_LALT, K_ALT_L) \
X(SDL_SCANCODE_RALT, K_ALT_R) \
X(SDL_SCANCODE_F1, K_F1) \
X(SDL_SCANCODE_F2, K_F2) \
X(SDL_SCANCODE_F3, K_F3) \
X(SDL_SCANCODE_F4, K_F4) \
X(SDL_SCANCODE_F5, K_F5) \
X(SDL_SCANCODE_F6, K_F6) \
X(SDL_SCANCODE_F7, K_F7) \
X(SDL_SCANCODE_F8, K_F8) \
X(SDL_SCANCODE_F9, K_F9) \
X(SDL_SCANCODE_F10, K_F10) \
X(SDL_SCANCODE_F11, K_F11) \
X(SDL_SCANCODE_F12, K_F12) \
X(SDL_SCANCODE_KP_PLUS, K_ADD) \
X(SDL_SCANCODE_KP_MINUS, K_SUBTRACT) \
X(SDL_SCANCODE_KP_MULTIPLY, K_MULTIPLY) \
X(SDL_SCANCODE_ESCAPE, K_ESCAPE) \
X(SDL_SCANCODE_PAUSE, K_PAUSE) \
X(SDL_SCANCODE_TAB, K_TAB) \
X(SDL_SCANCODE_RETURN, K_RETURN) \
X(SDL_SCANCODE_DELETE, K_DELETE) \
X(SDL_SCANCODE_INSERT, K_INSERT) \
X(SDL_SCANCODE_BACKSPACE, K_BACK) \
X(SDL_SCANCODE_SPACE, K_SPACE) \
X(SDL_SCANCODE_UP, K_UP) \
X(SDL_SCANCODE_DOWN, K_DOWN) \
X(SDL_SCANCODE_LEFT, K_LEFT) \
X(SDL_SCANCODE_RIGHT, K_RIGHT) \
X(SDL_SCANCODE_HOME, K_HOME) \
X(SDL_SCANCODE_END, K_END) \
X(SDL_SCANCODE_SCROLLLOCK, K_SCROLL) \
X(SDL_SCANCODE_MENU, K_MENU) \
X(SDL_SCANCODE_PAGEUP, K_PAGEUP) \
X(SDL_SCANCODE_PAGEDOWN, K_PAGEDOWN) \
X(SDL_SCANCODE_1, K_1) \
X(SDL_SCANCODE_2, K_2) \
X(SDL_SCANCODE_3, K_3) \
X(SDL_SCANCODE_4, K_4) \
X(SDL_SCANCODE_5, K_5) \
X(SDL_SCANCODE_6, K_6) \
X(SDL_SCANCODE_7, K_7) \
X(SDL_SCANCODE_8, K_8) \
X(SDL_SCANCODE_9, K_9) \
X(SDL_SCANCODE_0, K_0) \
X(SDL_SCANCODE_A, K_A) \
X(SDL_SCANCODE_B, K_B) \
X(SDL_SCANCODE_C, K_C) \
X(SDL_SCANCODE_D, K_D) \
X(SDL_SCANCODE_E, K_E) \
X(SDL_SCANCODE_F, K_F) \
X(SDL_SCANCODE_G, K_G) \
X(SDL_SCANCODE_H, K_H) \
X(SDL_SCANCODE_I, K_I) \
X(SDL_SCANCODE_J, K_J) \
X(SDL_SCANCODE_K, K_K) \
X(SDL_SCANCODE_L, K_L) \
X(SDL_SCANCODE_M, K_M) \
X(SDL_SCANCODE_N, K_N) \
X(SDL_SCANCODE_O, K_O) \
X(SDL_SCANCODE_P, K_P) \
X(SDL_SCANCODE_Q, K_Q) \
X(SDL_SCANCODE_R, K_R) \
X(SDL_SCANCODE_S, K_S) \
X(SDL_SCANCODE_T, K_T) \
X(SDL_SCANCODE_U, K_U) \
X(SDL_SCANCODE_V, K_V) \
X(SDL_SCANCODE_W, K_W) \
X(SDL_SCANCODE_X, K_X) \
X(SDL_SCANCODE_Y, K_Y) \
X(SDL_SCANCODE_Z, K_Z) \
X(SDL_SCANCODE_MINUS, K_MINUS) \
X(SDL_SCANCODE_EQUALS, K_EQUAL) \
X(SDL_SCANCODE_LEFTBRACKET, K_LEFT_BRACKET) \
X(SDL_SCANCODE_RIGHTBRACKET, K_RIGHT_BRACKET) \
X(SDL_SCANCODE_SEMICOLON, K_SEMICOLON) \
X(SDL_SCANCODE_APOSTROPHE, K_APOSTROPHE) \
X(SDL_SCANCODE_GRAVE, K_GRAVE_ACCENT) \
X(SDL_SCANCODE_BACKSLASH, K_BACKSLASH) \
X(SDL_SCANCODE_COMMA, K_COMMA) \
X(SDL_SCANCODE_PERIOD, K_PERIOD) \
X(SDL_SCANCODE_SLASH, K_SLASH) \
X(SDL_SCANCODE_CAPSLOCK, K_CAPS) \
X(SDL_SCANCODE_NUMLOCKCLEAR, K_NUM) \
X(SDL_SCANCODE_KP_7, K_NUM7) \
X(SDL_SCANCODE_KP_8, K_NUM8) \
X(SDL_SCANCODE_KP_9, K_NUM9) \
X(SDL_SCANCODE_KP_4, K_NUM4) \
X(SDL_SCANCODE_KP_5, K_NUM5) \
X(SDL_SCANCODE_KP_6, K_NUM6) \
X(SDL_SCANCODE_KP_1, K_NUM1) \
X(SDL_SCANCODE_KP_2, K_NUM2) \
X(SDL_SCANCODE_KP_3, K_NUM3) \
X(SDL_SCANCODE_KP_0, K_NUM0) \
X(SDL_SCANCODE_KP_PERIOD, K_DECIMAL) \
X(SDL_SCANCODE_NONUSBACKSLASH, K_86) \
X(SDL_SCANCODE_KP_ENTER, K_NUM_RETURN) \
X(SDL_SCANCODE_KP_DIVIDE, K_DIVIDE) \
X(SDL_SCANCODE_LGUI, K_WIN_L) \
X(SDL_SCANCODE_RGUI, K_WIN_R) \
X(SDL_SCANCODE_PRINTSCREEN, K_PRINT) \
static C4KeyCode sdl_scancode_to_keycode(SDL_Scancode scancode)
{
switch (scancode)
{
case SDL_SCANCODE_LSHIFT: return K_SHIFT_L;
case SDL_SCANCODE_RSHIFT: return K_SHIFT_R;
case SDL_SCANCODE_LCTRL: return K_CONTROL_L;
case SDL_SCANCODE_RCTRL: return K_CONTROL_R;
case SDL_SCANCODE_LALT: return K_ALT_L;
case SDL_SCANCODE_RALT: return K_ALT_R;
case SDL_SCANCODE_F1: return K_F1;
case SDL_SCANCODE_F2: return K_F2;
case SDL_SCANCODE_F3: return K_F3;
case SDL_SCANCODE_F4: return K_F4;
case SDL_SCANCODE_F5: return K_F5;
case SDL_SCANCODE_F6: return K_F6;
case SDL_SCANCODE_F7: return K_F7;
case SDL_SCANCODE_F8: return K_F8;
case SDL_SCANCODE_F9: return K_F9;
case SDL_SCANCODE_F10: return K_F10;
case SDL_SCANCODE_F11: return K_F11;
case SDL_SCANCODE_F12: return K_F12;
case SDL_SCANCODE_KP_PLUS: return K_ADD;
case SDL_SCANCODE_KP_MINUS: return K_SUBTRACT;
case SDL_SCANCODE_KP_MULTIPLY: return K_MULTIPLY;
case SDL_SCANCODE_ESCAPE: return K_ESCAPE;
case SDL_SCANCODE_PAUSE: return K_PAUSE;
case SDL_SCANCODE_TAB: return K_TAB;
case SDL_SCANCODE_RETURN: return K_RETURN;
case SDL_SCANCODE_DELETE: return K_DELETE;
case SDL_SCANCODE_INSERT: return K_INSERT;
case SDL_SCANCODE_BACKSPACE: return K_BACK;
case SDL_SCANCODE_SPACE: return K_SPACE;
case SDL_SCANCODE_UP: return K_UP;
case SDL_SCANCODE_DOWN: return K_DOWN;
case SDL_SCANCODE_LEFT: return K_LEFT;
case SDL_SCANCODE_RIGHT: return K_RIGHT;
case SDL_SCANCODE_HOME: return K_HOME;
case SDL_SCANCODE_END: return K_END;
case SDL_SCANCODE_SCROLLLOCK: return K_SCROLL;
case SDL_SCANCODE_MENU: return K_MENU;
case SDL_SCANCODE_PAGEUP: return K_PAGEUP;
case SDL_SCANCODE_PAGEDOWN: return K_PAGEDOWN;
case SDL_SCANCODE_1: return K_1;
case SDL_SCANCODE_2: return K_2;
case SDL_SCANCODE_3: return K_3;
case SDL_SCANCODE_4: return K_4;
case SDL_SCANCODE_5: return K_5;
case SDL_SCANCODE_6: return K_6;
case SDL_SCANCODE_7: return K_7;
case SDL_SCANCODE_8: return K_8;
case SDL_SCANCODE_9: return K_9;
case SDL_SCANCODE_0: return K_0;
case SDL_SCANCODE_A: return K_A;
case SDL_SCANCODE_B: return K_B;
case SDL_SCANCODE_C: return K_C;
case SDL_SCANCODE_D: return K_D;
case SDL_SCANCODE_E: return K_E;
case SDL_SCANCODE_F: return K_F;
case SDL_SCANCODE_G: return K_G;
case SDL_SCANCODE_H: return K_H;
case SDL_SCANCODE_I: return K_I;
case SDL_SCANCODE_J: return K_J;
case SDL_SCANCODE_K: return K_K;
case SDL_SCANCODE_L: return K_L;
case SDL_SCANCODE_M: return K_M;
case SDL_SCANCODE_N: return K_N;
case SDL_SCANCODE_O: return K_O;
case SDL_SCANCODE_P: return K_P;
case SDL_SCANCODE_Q: return K_Q;
case SDL_SCANCODE_R: return K_R;
case SDL_SCANCODE_S: return K_S;
case SDL_SCANCODE_T: return K_T;
case SDL_SCANCODE_U: return K_U;
case SDL_SCANCODE_V: return K_V;
case SDL_SCANCODE_W: return K_W;
case SDL_SCANCODE_X: return K_X;
case SDL_SCANCODE_Y: return K_Y;
case SDL_SCANCODE_Z: return K_Z;
case SDL_SCANCODE_MINUS: return K_MINUS;
case SDL_SCANCODE_EQUALS: return K_EQUAL;
case SDL_SCANCODE_LEFTBRACKET: return K_LEFT_BRACKET;
case SDL_SCANCODE_RIGHTBRACKET: return K_RIGHT_BRACKET;
case SDL_SCANCODE_SEMICOLON: return K_SEMICOLON;
case SDL_SCANCODE_APOSTROPHE: return K_APOSTROPHE;
case SDL_SCANCODE_GRAVE: return K_GRAVE_ACCENT;
case SDL_SCANCODE_BACKSLASH: return K_BACKSLASH;
case SDL_SCANCODE_COMMA: return K_COMMA;
case SDL_SCANCODE_PERIOD: return K_PERIOD;
case SDL_SCANCODE_SLASH: return K_SLASH;
case SDL_SCANCODE_CAPSLOCK: return K_CAPS;
case SDL_SCANCODE_NUMLOCKCLEAR: return K_NUM;
case SDL_SCANCODE_KP_7: return K_NUM7;
case SDL_SCANCODE_KP_8: return K_NUM8;
case SDL_SCANCODE_KP_9: return K_NUM9;
case SDL_SCANCODE_KP_4: return K_NUM4;
case SDL_SCANCODE_KP_5: return K_NUM5;
case SDL_SCANCODE_KP_6: return K_NUM6;
case SDL_SCANCODE_KP_1: return K_NUM1;
case SDL_SCANCODE_KP_2: return K_NUM2;
case SDL_SCANCODE_KP_3: return K_NUM3;
case SDL_SCANCODE_KP_0: return K_NUM0;
case SDL_SCANCODE_KP_PERIOD: return K_DECIMAL;
case SDL_SCANCODE_NONUSBACKSLASH: return K_86;
case SDL_SCANCODE_KP_ENTER: return K_NUM_RETURN;
case SDL_SCANCODE_KP_DIVIDE: return K_DIVIDE;
case SDL_SCANCODE_LGUI: return K_WIN_L;
case SDL_SCANCODE_RGUI: return K_WIN_R;
case SDL_SCANCODE_PRINTSCREEN: return K_PRINT;
#define X(sdl, oc) case sdl: return oc;
SDL_SCANCODE_KEYCODE
#undef X
}
return 0;
}
const char* KeycodeToString(C4KeyCode code)
{
SDL_Scancode scancode;
switch (code)
{
#define X(sdl, oc) case oc: scancode = sdl; break;
SDL_SCANCODE_KEYCODE
#undef X
default:
return nullptr;
}
return SDL_GetScancodeName(scancode);
}
void C4AbstractApp::HandleSDLEvent(SDL_Event& e)
{
DWORD flags;