Added love.keyboard.getKeyFromScancode and love.keyboard.getScancodeFromKey. Resolves issue #982.

Scancodes represent a physical key independent of the keyboard's current layout. For example, pressing the key located where 'q' is on a U.S. keyboard will produce the key 'q' and the scancode 'q' when using a U.S. keyboard layout, but when using a French keyboard layout it will produce the key 'a' and the scancode 'q'.

Scancodes are useful for creating default controls that have the same physical locations on on all keyboards.
This commit is contained in:
Alex Szpakowski
2015-02-01 03:13:14 -04:00
parent 695ab41915
commit a314b18515
6 changed files with 907 additions and 3 deletions
+295
View File
@@ -61,6 +61,37 @@ bool Keyboard::isDown(Key *keylist) const
return false;
}
Keyboard::Key Keyboard::getKeyFromScancode(Scancode scancode) const
{
SDL_Scancode sdlscancode = SDL_SCANCODE_UNKNOWN;
scancodes.find(scancode, sdlscancode);
SDL_Keycode sdlkey = SDL_GetKeyFromScancode(sdlscancode);
for (int i = 0; i < KEY_MAX_ENUM; i++)
{
if (keymap[i] == sdlkey)
return (Key) i;
}
return KEY_UNKNOWN;
}
Keyboard::Scancode Keyboard::getScancodeFromKey(Key key) const
{
Scancode scancode = SCANCODE_UNKNOWN;
if (key != KEY_MAX_ENUM)
{
SDL_Keycode sdlkey = keymap[key];
SDL_Scancode sdlscancode = SDL_GetScancodeFromKey(sdlkey);
scancodes.find(sdlscancode, scancode);
}
return scancode;
}
void Keyboard::setTextInput(bool enable)
{
if (enable)
@@ -288,6 +319,270 @@ const SDL_Keycode *Keyboard::createKeyMap()
const SDL_Keycode *Keyboard::keymap = Keyboard::createKeyMap();
EnumMap<Keyboard::Scancode, SDL_Scancode, SDL_NUM_SCANCODES>::Entry Keyboard::scancodeEntries[] =
{
{SCANCODE_UNKNOWN, SDL_SCANCODE_UNKNOWN},
{SCANCODE_A, SDL_SCANCODE_A},
{SCANCODE_B, SDL_SCANCODE_B},
{SCANCODE_C, SDL_SCANCODE_C},
{SCANCODE_D, SDL_SCANCODE_D},
{SCANCODE_E, SDL_SCANCODE_E},
{SCANCODE_F, SDL_SCANCODE_F},
{SCANCODE_G, SDL_SCANCODE_G},
{SCANCODE_H, SDL_SCANCODE_H},
{SCANCODE_I, SDL_SCANCODE_I},
{SCANCODE_J, SDL_SCANCODE_J},
{SCANCODE_K, SDL_SCANCODE_K},
{SCANCODE_L, SDL_SCANCODE_L},
{SCANCODE_M, SDL_SCANCODE_M},
{SCANCODE_N, SDL_SCANCODE_N},
{SCANCODE_O, SDL_SCANCODE_O},
{SCANCODE_P, SDL_SCANCODE_P},
{SCANCODE_Q, SDL_SCANCODE_Q},
{SCANCODE_R, SDL_SCANCODE_R},
{SCANCODE_S, SDL_SCANCODE_S},
{SCANCODE_T, SDL_SCANCODE_T},
{SCANCODE_U, SDL_SCANCODE_U},
{SCANCODE_V, SDL_SCANCODE_V},
{SCANCODE_W, SDL_SCANCODE_W},
{SCANCODE_X, SDL_SCANCODE_X},
{SCANCODE_Y, SDL_SCANCODE_Y},
{SCANCODE_Z, SDL_SCANCODE_Z},
{SCANCODE_1, SDL_SCANCODE_1},
{SCANCODE_2, SDL_SCANCODE_2},
{SCANCODE_3, SDL_SCANCODE_3},
{SCANCODE_4, SDL_SCANCODE_4},
{SCANCODE_5, SDL_SCANCODE_5},
{SCANCODE_6, SDL_SCANCODE_6},
{SCANCODE_7, SDL_SCANCODE_7},
{SCANCODE_8, SDL_SCANCODE_8},
{SCANCODE_9, SDL_SCANCODE_9},
{SCANCODE_0, SDL_SCANCODE_0},
{SCANCODE_RETURN, SDL_SCANCODE_RETURN},
{SCANCODE_ESCAPE, SDL_SCANCODE_ESCAPE},
{SCANCODE_BACKSPACE, SDL_SCANCODE_BACKSPACE},
{SCANCODE_TAB, SDL_SCANCODE_TAB},
{SCANCODE_SPACE, SDL_SCANCODE_SPACE},
{SCANCODE_MINUS, SDL_SCANCODE_MINUS},
{SCANCODE_EQUALS, SDL_SCANCODE_EQUALS},
{SCANCODE_LEFTBRACKET, SDL_SCANCODE_LEFTBRACKET},
{SCANCODE_RIGHTBRACKET, SDL_SCANCODE_RIGHTBRACKET},
{SCANCODE_BACKSLASH, SDL_SCANCODE_BACKSLASH},
{SCANCODE_NONUSHASH, SDL_SCANCODE_NONUSHASH},
{SCANCODE_SEMICOLON, SDL_SCANCODE_SEMICOLON},
{SCANCODE_APOSTROPHE, SDL_SCANCODE_APOSTROPHE},
{SCANCODE_GRAVE, SDL_SCANCODE_GRAVE},
{SCANCODE_COMMA, SDL_SCANCODE_COMMA},
{SCANCODE_PERIOD, SDL_SCANCODE_PERIOD},
{SCANCODE_SLASH, SDL_SCANCODE_SLASH},
{SCANCODE_CAPSLOCK, SDL_SCANCODE_CAPSLOCK},
{SCANCODE_F1, SDL_SCANCODE_F1},
{SCANCODE_F2, SDL_SCANCODE_F2},
{SCANCODE_F3, SDL_SCANCODE_F3},
{SCANCODE_F4, SDL_SCANCODE_F4},
{SCANCODE_F5, SDL_SCANCODE_F5},
{SCANCODE_F6, SDL_SCANCODE_F6},
{SCANCODE_F7, SDL_SCANCODE_F7},
{SCANCODE_F8, SDL_SCANCODE_F8},
{SCANCODE_F9, SDL_SCANCODE_F9},
{SCANCODE_F10, SDL_SCANCODE_F10},
{SCANCODE_F11, SDL_SCANCODE_F11},
{SCANCODE_F12, SDL_SCANCODE_F12},
{SCANCODE_PRINTSCREEN, SDL_SCANCODE_PRINTSCREEN},
{SCANCODE_SCROLLLOCK, SDL_SCANCODE_SCROLLLOCK},
{SCANCODE_PAUSE, SDL_SCANCODE_PAUSE},
{SCANCODE_INSERT, SDL_SCANCODE_INSERT},
{SCANCODE_HOME, SDL_SCANCODE_HOME},
{SCANCODE_PAGEUP, SDL_SCANCODE_PAGEUP},
{SCANCODE_DELETE, SDL_SCANCODE_DELETE},
{SCANCODE_END, SDL_SCANCODE_END},
{SCANCODE_PAGEDOWN, SDL_SCANCODE_PAGEDOWN},
{SCANCODE_RIGHT, SDL_SCANCODE_RIGHT},
{SCANCODE_LEFT, SDL_SCANCODE_LEFT},
{SCANCODE_DOWN, SDL_SCANCODE_DOWN},
{SCANCODE_UP, SDL_SCANCODE_UP},
{SCANCODE_NUMLOCKCLEAR, SDL_SCANCODE_NUMLOCKCLEAR},
{SCANCODE_KP_DIVIDE, SDL_SCANCODE_KP_DIVIDE},
{SCANCODE_KP_MULTIPLY, SDL_SCANCODE_KP_MULTIPLY},
{SCANCODE_KP_MINUS, SDL_SCANCODE_KP_MINUS},
{SCANCODE_KP_PLUS, SDL_SCANCODE_KP_PLUS},
{SCANCODE_KP_ENTER, SDL_SCANCODE_KP_ENTER},
{SCANCODE_KP_1, SDL_SCANCODE_KP_1},
{SCANCODE_KP_2, SDL_SCANCODE_KP_2},
{SCANCODE_KP_3, SDL_SCANCODE_KP_3},
{SCANCODE_KP_4, SDL_SCANCODE_KP_4},
{SCANCODE_KP_5, SDL_SCANCODE_KP_5},
{SCANCODE_KP_6, SDL_SCANCODE_KP_6},
{SCANCODE_KP_7, SDL_SCANCODE_KP_7},
{SCANCODE_KP_8, SDL_SCANCODE_KP_8},
{SCANCODE_KP_9, SDL_SCANCODE_KP_9},
{SCANCODE_KP_0, SDL_SCANCODE_KP_0},
{SCANCODE_KP_PERIOD, SDL_SCANCODE_KP_PERIOD},
{SCANCODE_NONUSBACKSLASH, SDL_SCANCODE_NONUSBACKSLASH},
{SCANCODE_APPLICATION, SDL_SCANCODE_APPLICATION},
{SCANCODE_POWER, SDL_SCANCODE_POWER},
{SCANCODE_KP_EQUALS, SDL_SCANCODE_KP_EQUALS},
{SCANCODE_F13, SDL_SCANCODE_F13},
{SCANCODE_F14, SDL_SCANCODE_F14},
{SCANCODE_F15, SDL_SCANCODE_F15},
{SCANCODE_F16, SDL_SCANCODE_F16},
{SCANCODE_F17, SDL_SCANCODE_F17},
{SCANCODE_F18, SDL_SCANCODE_F18},
{SCANCODE_F19, SDL_SCANCODE_F19},
{SCANCODE_F20, SDL_SCANCODE_F20},
{SCANCODE_F21, SDL_SCANCODE_F21},
{SCANCODE_F22, SDL_SCANCODE_F22},
{SCANCODE_F23, SDL_SCANCODE_F23},
{SCANCODE_F24, SDL_SCANCODE_F24},
{SCANCODE_EXECUTE, SDL_SCANCODE_EXECUTE},
{SCANCODE_HELP, SDL_SCANCODE_HELP},
{SCANCODE_MENU, SDL_SCANCODE_MENU},
{SCANCODE_SELECT, SDL_SCANCODE_SELECT},
{SCANCODE_STOP, SDL_SCANCODE_STOP},
{SCANCODE_AGAIN, SDL_SCANCODE_AGAIN},
{SCANCODE_UNDO, SDL_SCANCODE_UNDO},
{SCANCODE_CUT, SDL_SCANCODE_CUT},
{SCANCODE_COPY, SDL_SCANCODE_COPY},
{SCANCODE_PASTE, SDL_SCANCODE_PASTE},
{SCANCODE_FIND, SDL_SCANCODE_FIND},
{SCANCODE_MUTE, SDL_SCANCODE_MUTE},
{SCANCODE_VOLUMEUP, SDL_SCANCODE_VOLUMEUP},
{SCANCODE_VOLUMEDOWN, SDL_SCANCODE_VOLUMEDOWN},
{SCANCODE_KP_COMMA, SDL_SCANCODE_KP_COMMA},
{SCANCODE_KP_EQUALSAS400, SDL_SCANCODE_KP_EQUALSAS400},
{SCANCODE_INTERNATIONAL1, SDL_SCANCODE_INTERNATIONAL1},
{SCANCODE_INTERNATIONAL2, SDL_SCANCODE_INTERNATIONAL2},
{SCANCODE_INTERNATIONAL3, SDL_SCANCODE_INTERNATIONAL3},
{SCANCODE_INTERNATIONAL4, SDL_SCANCODE_INTERNATIONAL4},
{SCANCODE_INTERNATIONAL5, SDL_SCANCODE_INTERNATIONAL5},
{SCANCODE_INTERNATIONAL6, SDL_SCANCODE_INTERNATIONAL6},
{SCANCODE_INTERNATIONAL7, SDL_SCANCODE_INTERNATIONAL7},
{SCANCODE_INTERNATIONAL8, SDL_SCANCODE_INTERNATIONAL8},
{SCANCODE_INTERNATIONAL9, SDL_SCANCODE_INTERNATIONAL9},
{SCANCODE_LANG1, SDL_SCANCODE_LANG1},
{SCANCODE_LANG2, SDL_SCANCODE_LANG2},
{SCANCODE_LANG3, SDL_SCANCODE_LANG3},
{SCANCODE_LANG4, SDL_SCANCODE_LANG4},
{SCANCODE_LANG5, SDL_SCANCODE_LANG5},
{SCANCODE_LANG6, SDL_SCANCODE_LANG6},
{SCANCODE_LANG7, SDL_SCANCODE_LANG7},
{SCANCODE_LANG8, SDL_SCANCODE_LANG8},
{SCANCODE_LANG9, SDL_SCANCODE_LANG9},
{SCANCODE_ALTERASE, SDL_SCANCODE_ALTERASE},
{SCANCODE_SYSREQ, SDL_SCANCODE_SYSREQ},
{SCANCODE_CANCEL, SDL_SCANCODE_CANCEL},
{SCANCODE_CLEAR, SDL_SCANCODE_CLEAR},
{SCANCODE_PRIOR, SDL_SCANCODE_PRIOR},
{SCANCODE_RETURN2, SDL_SCANCODE_RETURN2},
{SCANCODE_SEPARATOR, SDL_SCANCODE_SEPARATOR},
{SCANCODE_OUT, SDL_SCANCODE_OUT},
{SCANCODE_OPER, SDL_SCANCODE_OPER},
{SCANCODE_CLEARAGAIN, SDL_SCANCODE_CLEARAGAIN},
{SCANCODE_CRSEL, SDL_SCANCODE_CRSEL},
{SCANCODE_EXSEL, SDL_SCANCODE_EXSEL},
{SCANCODE_KP_00, SDL_SCANCODE_KP_00},
{SCANCODE_KP_000, SDL_SCANCODE_KP_000},
{SCANCODE_THOUSANDSSEPARATOR, SDL_SCANCODE_THOUSANDSSEPARATOR},
{SCANCODE_DECIMALSEPARATOR, SDL_SCANCODE_DECIMALSEPARATOR},
{SCANCODE_CURRENCYUNIT, SDL_SCANCODE_CURRENCYUNIT},
{SCANCODE_CURRENCYSUBUNIT, SDL_SCANCODE_CURRENCYSUBUNIT},
{SCANCODE_KP_LEFTPAREN, SDL_SCANCODE_KP_LEFTPAREN},
{SCANCODE_KP_RIGHTPAREN, SDL_SCANCODE_KP_RIGHTPAREN},
{SCANCODE_KP_LEFTBRACE, SDL_SCANCODE_KP_LEFTBRACE},
{SCANCODE_KP_RIGHTBRACE, SDL_SCANCODE_KP_RIGHTBRACE},
{SCANCODE_KP_TAB, SDL_SCANCODE_KP_TAB},
{SCANCODE_KP_BACKSPACE, SDL_SCANCODE_KP_BACKSPACE},
{SCANCODE_KP_A, SDL_SCANCODE_KP_A},
{SCANCODE_KP_B, SDL_SCANCODE_KP_B},
{SCANCODE_KP_C, SDL_SCANCODE_KP_C},
{SCANCODE_KP_D, SDL_SCANCODE_KP_D},
{SCANCODE_KP_E, SDL_SCANCODE_KP_E},
{SCANCODE_KP_F, SDL_SCANCODE_KP_F},
{SCANCODE_KP_XOR, SDL_SCANCODE_KP_XOR},
{SCANCODE_KP_POWER, SDL_SCANCODE_KP_POWER},
{SCANCODE_KP_PERCENT, SDL_SCANCODE_KP_PERCENT},
{SCANCODE_KP_LESS, SDL_SCANCODE_KP_LESS},
{SCANCODE_KP_GREATER, SDL_SCANCODE_KP_GREATER},
{SCANCODE_KP_AMPERSAND, SDL_SCANCODE_KP_AMPERSAND},
{SCANCODE_KP_DBLAMPERSAND, SDL_SCANCODE_KP_DBLAMPERSAND},
{SCANCODE_KP_VERTICALBAR, SDL_SCANCODE_KP_VERTICALBAR},
{SCANCODE_KP_DBLVERTICALBAR, SDL_SCANCODE_KP_DBLVERTICALBAR},
{SCANCODE_KP_COLON, SDL_SCANCODE_KP_COLON},
{SCANCODE_KP_HASH, SDL_SCANCODE_KP_HASH},
{SCANCODE_KP_SPACE, SDL_SCANCODE_KP_SPACE},
{SCANCODE_KP_AT, SDL_SCANCODE_KP_AT},
{SCANCODE_KP_EXCLAM, SDL_SCANCODE_KP_EXCLAM},
{SCANCODE_KP_MEMSTORE, SDL_SCANCODE_KP_MEMSTORE},
{SCANCODE_KP_MEMRECALL, SDL_SCANCODE_KP_MEMRECALL},
{SCANCODE_KP_MEMCLEAR, SDL_SCANCODE_KP_MEMCLEAR},
{SCANCODE_KP_MEMADD, SDL_SCANCODE_KP_MEMADD},
{SCANCODE_KP_MEMSUBTRACT, SDL_SCANCODE_KP_MEMSUBTRACT},
{SCANCODE_KP_MEMMULTIPLY, SDL_SCANCODE_KP_MEMMULTIPLY},
{SCANCODE_KP_MEMDIVIDE, SDL_SCANCODE_KP_MEMDIVIDE},
{SCANCODE_KP_PLUSMINUS, SDL_SCANCODE_KP_PLUSMINUS},
{SCANCODE_KP_CLEAR, SDL_SCANCODE_KP_CLEAR},
{SCANCODE_KP_CLEARENTRY, SDL_SCANCODE_KP_CLEARENTRY},
{SCANCODE_KP_BINARY, SDL_SCANCODE_KP_BINARY},
{SCANCODE_KP_OCTAL, SDL_SCANCODE_KP_OCTAL},
{SCANCODE_KP_DECIMAL, SDL_SCANCODE_KP_DECIMAL},
{SCANCODE_KP_HEXADECIMAL, SDL_SCANCODE_KP_HEXADECIMAL},
{SCANCODE_LCTRL, SDL_SCANCODE_LCTRL},
{SCANCODE_LSHIFT, SDL_SCANCODE_LSHIFT},
{SCANCODE_LALT, SDL_SCANCODE_LALT},
{SCANCODE_LGUI, SDL_SCANCODE_LGUI},
{SCANCODE_RCTRL, SDL_SCANCODE_RCTRL},
{SCANCODE_RSHIFT, SDL_SCANCODE_RSHIFT},
{SCANCODE_RALT, SDL_SCANCODE_RALT},
{SCANCODE_RGUI, SDL_SCANCODE_RGUI},
{SCANCODE_MODE, SDL_SCANCODE_MODE},
{SCANCODE_AUDIONEXT, SDL_SCANCODE_AUDIONEXT},
{SCANCODE_AUDIOPREV, SDL_SCANCODE_AUDIOPREV},
{SCANCODE_AUDIOSTOP, SDL_SCANCODE_AUDIOSTOP},
{SCANCODE_AUDIOPLAY, SDL_SCANCODE_AUDIOPLAY},
{SCANCODE_AUDIOMUTE, SDL_SCANCODE_AUDIOMUTE},
{SCANCODE_MEDIASELECT, SDL_SCANCODE_MEDIASELECT},
{SCANCODE_WWW, SDL_SCANCODE_WWW},
{SCANCODE_MAIL, SDL_SCANCODE_MAIL},
{SCANCODE_CALCULATOR, SDL_SCANCODE_CALCULATOR},
{SCANCODE_COMPUTER, SDL_SCANCODE_COMPUTER},
{SCANCODE_AC_SEARCH, SDL_SCANCODE_AC_SEARCH},
{SCANCODE_AC_HOME, SDL_SCANCODE_AC_HOME},
{SCANCODE_AC_BACK, SDL_SCANCODE_AC_BACK},
{SCANCODE_AC_FORWARD, SDL_SCANCODE_AC_FORWARD},
{SCANCODE_AC_STOP, SDL_SCANCODE_AC_STOP},
{SCANCODE_AC_REFRESH, SDL_SCANCODE_AC_REFRESH},
{SCANCODE_AC_BOOKMARKS, SDL_SCANCODE_AC_BOOKMARKS},
{SCANCODE_BRIGHTNESSDOWN, SDL_SCANCODE_BRIGHTNESSDOWN},
{SCANCODE_BRIGHTNESSUP, SDL_SCANCODE_BRIGHTNESSUP},
{SCANCODE_DISPLAYSWITCH, SDL_SCANCODE_DISPLAYSWITCH},
{SCANCODE_KBDILLUMTOGGLE, SDL_SCANCODE_KBDILLUMTOGGLE},
{SCANCODE_KBDILLUMDOWN, SDL_SCANCODE_KBDILLUMDOWN},
{SCANCODE_KBDILLUMUP, SDL_SCANCODE_KBDILLUMUP},
{SCANCODE_EJECT, SDL_SCANCODE_EJECT},
{SCANCODE_SLEEP, SDL_SCANCODE_SLEEP},
{SCANCODE_APP1, SDL_SCANCODE_APP1},
{SCANCODE_APP2, SDL_SCANCODE_APP2},
};
EnumMap<Keyboard::Scancode, SDL_Scancode, SDL_NUM_SCANCODES> Keyboard::scancodes(Keyboard::scancodeEntries, sizeof(Keyboard::scancodeEntries));
} // sdl
} // keyboard
} // love