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
+291 -1
View File
@@ -34,6 +34,9 @@ class Keyboard : public Module
{
public:
/**
* Keyboard keys. They are dependent on the current layout of the keyboard.
**/
enum Key
{
KEY_UNKNOWN,
@@ -244,6 +247,275 @@ public:
KEY_MAX_ENUM
};
/**
* Scancodes represent physical keys independent of the current layout.
* Their names may not match the names of the keys printed on the keyboard.
* Some of them are very esoteric...
**/
enum Scancode
{
SCANCODE_UNKNOWN,
SCANCODE_A,
SCANCODE_B,
SCANCODE_C,
SCANCODE_D,
SCANCODE_E,
SCANCODE_F,
SCANCODE_G,
SCANCODE_H,
SCANCODE_I,
SCANCODE_J,
SCANCODE_K,
SCANCODE_L,
SCANCODE_M,
SCANCODE_N,
SCANCODE_O,
SCANCODE_P,
SCANCODE_Q,
SCANCODE_R,
SCANCODE_S,
SCANCODE_T,
SCANCODE_U,
SCANCODE_V,
SCANCODE_W,
SCANCODE_X,
SCANCODE_Y,
SCANCODE_Z,
SCANCODE_1,
SCANCODE_2,
SCANCODE_3,
SCANCODE_4,
SCANCODE_5,
SCANCODE_6,
SCANCODE_7,
SCANCODE_8,
SCANCODE_9,
SCANCODE_0,
SCANCODE_RETURN,
SCANCODE_ESCAPE,
SCANCODE_BACKSPACE,
SCANCODE_TAB,
SCANCODE_SPACE,
SCANCODE_MINUS,
SCANCODE_EQUALS,
SCANCODE_LEFTBRACKET,
SCANCODE_RIGHTBRACKET,
SCANCODE_BACKSLASH,
SCANCODE_NONUSHASH,
SCANCODE_SEMICOLON,
SCANCODE_APOSTROPHE,
SCANCODE_GRAVE,
SCANCODE_COMMA,
SCANCODE_PERIOD,
SCANCODE_SLASH,
SCANCODE_CAPSLOCK,
SCANCODE_F1,
SCANCODE_F2,
SCANCODE_F3,
SCANCODE_F4,
SCANCODE_F5,
SCANCODE_F6,
SCANCODE_F7,
SCANCODE_F8,
SCANCODE_F9,
SCANCODE_F10,
SCANCODE_F11,
SCANCODE_F12,
SCANCODE_PRINTSCREEN,
SCANCODE_SCROLLLOCK,
SCANCODE_PAUSE,
SCANCODE_INSERT,
SCANCODE_HOME,
SCANCODE_PAGEUP,
SCANCODE_DELETE,
SCANCODE_END,
SCANCODE_PAGEDOWN,
SCANCODE_RIGHT,
SCANCODE_LEFT,
SCANCODE_DOWN,
SCANCODE_UP,
SCANCODE_NUMLOCKCLEAR,
SCANCODE_KP_DIVIDE,
SCANCODE_KP_MULTIPLY,
SCANCODE_KP_MINUS,
SCANCODE_KP_PLUS,
SCANCODE_KP_ENTER,
SCANCODE_KP_1,
SCANCODE_KP_2,
SCANCODE_KP_3,
SCANCODE_KP_4,
SCANCODE_KP_5,
SCANCODE_KP_6,
SCANCODE_KP_7,
SCANCODE_KP_8,
SCANCODE_KP_9,
SCANCODE_KP_0,
SCANCODE_KP_PERIOD,
SCANCODE_NONUSBACKSLASH,
SCANCODE_APPLICATION,
SCANCODE_POWER,
SCANCODE_KP_EQUALS,
SCANCODE_F13,
SCANCODE_F14,
SCANCODE_F15,
SCANCODE_F16,
SCANCODE_F17,
SCANCODE_F18,
SCANCODE_F19,
SCANCODE_F20,
SCANCODE_F21,
SCANCODE_F22,
SCANCODE_F23,
SCANCODE_F24,
SCANCODE_EXECUTE,
SCANCODE_HELP,
SCANCODE_MENU,
SCANCODE_SELECT,
SCANCODE_STOP,
SCANCODE_AGAIN,
SCANCODE_UNDO,
SCANCODE_CUT,
SCANCODE_COPY,
SCANCODE_PASTE,
SCANCODE_FIND,
SCANCODE_MUTE,
SCANCODE_VOLUMEUP,
SCANCODE_VOLUMEDOWN,
SCANCODE_KP_COMMA,
SCANCODE_KP_EQUALSAS400,
SCANCODE_INTERNATIONAL1,
SCANCODE_INTERNATIONAL2,
SCANCODE_INTERNATIONAL3,
SCANCODE_INTERNATIONAL4,
SCANCODE_INTERNATIONAL5,
SCANCODE_INTERNATIONAL6,
SCANCODE_INTERNATIONAL7,
SCANCODE_INTERNATIONAL8,
SCANCODE_INTERNATIONAL9,
SCANCODE_LANG1,
SCANCODE_LANG2,
SCANCODE_LANG3,
SCANCODE_LANG4,
SCANCODE_LANG5,
SCANCODE_LANG6,
SCANCODE_LANG7,
SCANCODE_LANG8,
SCANCODE_LANG9,
SCANCODE_ALTERASE,
SCANCODE_SYSREQ,
SCANCODE_CANCEL,
SCANCODE_CLEAR,
SCANCODE_PRIOR,
SCANCODE_RETURN2,
SCANCODE_SEPARATOR,
SCANCODE_OUT,
SCANCODE_OPER,
SCANCODE_CLEARAGAIN,
SCANCODE_CRSEL,
SCANCODE_EXSEL,
SCANCODE_KP_00,
SCANCODE_KP_000,
SCANCODE_THOUSANDSSEPARATOR,
SCANCODE_DECIMALSEPARATOR,
SCANCODE_CURRENCYUNIT,
SCANCODE_CURRENCYSUBUNIT,
SCANCODE_KP_LEFTPAREN,
SCANCODE_KP_RIGHTPAREN,
SCANCODE_KP_LEFTBRACE,
SCANCODE_KP_RIGHTBRACE,
SCANCODE_KP_TAB,
SCANCODE_KP_BACKSPACE,
SCANCODE_KP_A,
SCANCODE_KP_B,
SCANCODE_KP_C,
SCANCODE_KP_D,
SCANCODE_KP_E,
SCANCODE_KP_F,
SCANCODE_KP_XOR,
SCANCODE_KP_POWER,
SCANCODE_KP_PERCENT,
SCANCODE_KP_LESS,
SCANCODE_KP_GREATER,
SCANCODE_KP_AMPERSAND,
SCANCODE_KP_DBLAMPERSAND,
SCANCODE_KP_VERTICALBAR,
SCANCODE_KP_DBLVERTICALBAR,
SCANCODE_KP_COLON,
SCANCODE_KP_HASH,
SCANCODE_KP_SPACE,
SCANCODE_KP_AT,
SCANCODE_KP_EXCLAM,
SCANCODE_KP_MEMSTORE,
SCANCODE_KP_MEMRECALL,
SCANCODE_KP_MEMCLEAR,
SCANCODE_KP_MEMADD,
SCANCODE_KP_MEMSUBTRACT,
SCANCODE_KP_MEMMULTIPLY,
SCANCODE_KP_MEMDIVIDE,
SCANCODE_KP_PLUSMINUS,
SCANCODE_KP_CLEAR,
SCANCODE_KP_CLEARENTRY,
SCANCODE_KP_BINARY,
SCANCODE_KP_OCTAL,
SCANCODE_KP_DECIMAL,
SCANCODE_KP_HEXADECIMAL,
SCANCODE_LCTRL,
SCANCODE_LSHIFT,
SCANCODE_LALT,
SCANCODE_LGUI,
SCANCODE_RCTRL,
SCANCODE_RSHIFT,
SCANCODE_RALT,
SCANCODE_RGUI,
SCANCODE_MODE,
SCANCODE_AUDIONEXT,
SCANCODE_AUDIOPREV,
SCANCODE_AUDIOSTOP,
SCANCODE_AUDIOPLAY,
SCANCODE_AUDIOMUTE,
SCANCODE_MEDIASELECT,
SCANCODE_WWW,
SCANCODE_MAIL,
SCANCODE_CALCULATOR,
SCANCODE_COMPUTER,
SCANCODE_AC_SEARCH,
SCANCODE_AC_HOME,
SCANCODE_AC_BACK,
SCANCODE_AC_FORWARD,
SCANCODE_AC_STOP,
SCANCODE_AC_REFRESH,
SCANCODE_AC_BOOKMARKS,
SCANCODE_BRIGHTNESSDOWN,
SCANCODE_BRIGHTNESSUP,
SCANCODE_DISPLAYSWITCH,
SCANCODE_KBDILLUMTOGGLE,
SCANCODE_KBDILLUMDOWN,
SCANCODE_KBDILLUMUP,
SCANCODE_EJECT,
SCANCODE_SLEEP,
SCANCODE_APP1,
SCANCODE_APP2,
SCANCODE_MAX_ENUM
};
virtual ~Keyboard() {}
// Implements Module.
@@ -268,6 +540,18 @@ public:
**/
virtual bool isDown(Key *keylist) const = 0;
/**
* Gets the key corresponding to the specified scancode according to the
* current keyboard layout.
**/
virtual Key getKeyFromScancode(Scancode scancode) const = 0;
/**
* Gets the scancode corresponding to the specified key according to the
* current keyboard layout.
**/
virtual Scancode getScancodeFromKey(Key key) const = 0;
/**
* Sets whether text input events should be sent
* @param enable Whether to send text input events.
@@ -280,13 +564,19 @@ public:
virtual bool hasTextInput() const = 0;
static bool getConstant(const char *in, Key &out);
static bool getConstant(Key in, const char *&out);
static bool getConstant(Key in, const char *&out);
static bool getConstant(const char *in, Scancode &out);
static bool getConstant(Scancode in, const char *&out);
private:
static StringMap<Key, KEY_MAX_ENUM>::Entry keyEntries[];
static StringMap<Key, KEY_MAX_ENUM> keys;
static StringMap<Scancode, SCANCODE_MAX_ENUM>::Entry scancodeEntries[];
static StringMap<Scancode, SCANCODE_MAX_ENUM> scancodes;
}; // Keyboard
} // keyboard