mirror of
https://github.com/love2d/love.git
synced 2026-08-16 08:11:02 +02:00
key press events and love.keyboard support arbitrary non-ascii key constants.
Closes #2012.
This commit is contained in:
+225
-218
@@ -27,6 +27,7 @@
|
||||
|
||||
// C++
|
||||
#include <vector>
|
||||
#include <map>
|
||||
|
||||
namespace love
|
||||
{
|
||||
@@ -37,219 +38,6 @@ class Keyboard : public Module
|
||||
{
|
||||
public:
|
||||
|
||||
/**
|
||||
* Keyboard keys. They are dependent on the current layout of the keyboard.
|
||||
**/
|
||||
enum Key
|
||||
{
|
||||
KEY_UNKNOWN,
|
||||
|
||||
KEY_RETURN,
|
||||
KEY_ESCAPE,
|
||||
KEY_BACKSPACE,
|
||||
KEY_TAB,
|
||||
KEY_SPACE,
|
||||
KEY_EXCLAIM,
|
||||
KEY_QUOTEDBL,
|
||||
KEY_HASH,
|
||||
KEY_PERCENT,
|
||||
KEY_DOLLAR,
|
||||
KEY_AMPERSAND,
|
||||
KEY_QUOTE,
|
||||
KEY_LEFTPAREN,
|
||||
KEY_RIGHTPAREN,
|
||||
KEY_ASTERISK,
|
||||
KEY_PLUS,
|
||||
KEY_COMMA,
|
||||
KEY_MINUS,
|
||||
KEY_PERIOD,
|
||||
KEY_SLASH,
|
||||
KEY_0,
|
||||
KEY_1,
|
||||
KEY_2,
|
||||
KEY_3,
|
||||
KEY_4,
|
||||
KEY_5,
|
||||
KEY_6,
|
||||
KEY_7,
|
||||
KEY_8,
|
||||
KEY_9,
|
||||
KEY_COLON,
|
||||
KEY_SEMICOLON,
|
||||
KEY_LESS,
|
||||
KEY_EQUALS,
|
||||
KEY_GREATER,
|
||||
KEY_QUESTION,
|
||||
KEY_AT,
|
||||
|
||||
KEY_LEFTBRACKET,
|
||||
KEY_BACKSLASH,
|
||||
KEY_RIGHTBRACKET,
|
||||
KEY_CARET,
|
||||
KEY_UNDERSCORE,
|
||||
KEY_BACKQUOTE,
|
||||
KEY_A,
|
||||
KEY_B,
|
||||
KEY_C,
|
||||
KEY_D,
|
||||
KEY_E,
|
||||
KEY_F,
|
||||
KEY_G,
|
||||
KEY_H,
|
||||
KEY_I,
|
||||
KEY_J,
|
||||
KEY_K,
|
||||
KEY_L,
|
||||
KEY_M,
|
||||
KEY_N,
|
||||
KEY_O,
|
||||
KEY_P,
|
||||
KEY_Q,
|
||||
KEY_R,
|
||||
KEY_S,
|
||||
KEY_T,
|
||||
KEY_U,
|
||||
KEY_V,
|
||||
KEY_W,
|
||||
KEY_X,
|
||||
KEY_Y,
|
||||
KEY_Z,
|
||||
|
||||
KEY_CAPSLOCK,
|
||||
|
||||
KEY_F1,
|
||||
KEY_F2,
|
||||
KEY_F3,
|
||||
KEY_F4,
|
||||
KEY_F5,
|
||||
KEY_F6,
|
||||
KEY_F7,
|
||||
KEY_F8,
|
||||
KEY_F9,
|
||||
KEY_F10,
|
||||
KEY_F11,
|
||||
KEY_F12,
|
||||
|
||||
KEY_PRINTSCREEN,
|
||||
KEY_SCROLLLOCK,
|
||||
KEY_PAUSE,
|
||||
KEY_INSERT,
|
||||
KEY_HOME,
|
||||
KEY_PAGEUP,
|
||||
KEY_DELETE,
|
||||
KEY_END,
|
||||
KEY_PAGEDOWN,
|
||||
KEY_RIGHT,
|
||||
KEY_LEFT,
|
||||
KEY_DOWN,
|
||||
KEY_UP,
|
||||
|
||||
KEY_NUMLOCKCLEAR,
|
||||
KEY_KP_DIVIDE,
|
||||
KEY_KP_MULTIPLY,
|
||||
KEY_KP_MINUS,
|
||||
KEY_KP_PLUS,
|
||||
KEY_KP_ENTER,
|
||||
KEY_KP_1,
|
||||
KEY_KP_2,
|
||||
KEY_KP_3,
|
||||
KEY_KP_4,
|
||||
KEY_KP_5,
|
||||
KEY_KP_6,
|
||||
KEY_KP_7,
|
||||
KEY_KP_8,
|
||||
KEY_KP_9,
|
||||
KEY_KP_0,
|
||||
KEY_KP_PERIOD,
|
||||
KEY_KP_COMMA,
|
||||
KEY_KP_EQUALS,
|
||||
|
||||
KEY_APPLICATION,
|
||||
KEY_POWER,
|
||||
KEY_F13,
|
||||
KEY_F14,
|
||||
KEY_F15,
|
||||
KEY_F16,
|
||||
KEY_F17,
|
||||
KEY_F18,
|
||||
KEY_F19,
|
||||
KEY_F20,
|
||||
KEY_F21,
|
||||
KEY_F22,
|
||||
KEY_F23,
|
||||
KEY_F24,
|
||||
KEY_EXECUTE,
|
||||
KEY_HELP,
|
||||
KEY_MENU,
|
||||
KEY_SELECT,
|
||||
KEY_STOP,
|
||||
KEY_AGAIN,
|
||||
KEY_UNDO,
|
||||
KEY_CUT,
|
||||
KEY_COPY,
|
||||
KEY_PASTE,
|
||||
KEY_FIND,
|
||||
KEY_MUTE,
|
||||
KEY_VOLUMEUP,
|
||||
KEY_VOLUMEDOWN,
|
||||
|
||||
KEY_ALTERASE,
|
||||
KEY_SYSREQ,
|
||||
KEY_CANCEL,
|
||||
KEY_CLEAR,
|
||||
KEY_PRIOR,
|
||||
KEY_RETURN2,
|
||||
KEY_SEPARATOR,
|
||||
KEY_OUT,
|
||||
KEY_OPER,
|
||||
KEY_CLEARAGAIN,
|
||||
|
||||
KEY_THOUSANDSSEPARATOR,
|
||||
KEY_DECIMALSEPARATOR,
|
||||
KEY_CURRENCYUNIT,
|
||||
KEY_CURRENCYSUBUNIT,
|
||||
|
||||
KEY_LCTRL,
|
||||
KEY_LSHIFT,
|
||||
KEY_LALT,
|
||||
KEY_LGUI,
|
||||
KEY_RCTRL,
|
||||
KEY_RSHIFT,
|
||||
KEY_RALT,
|
||||
KEY_RGUI,
|
||||
|
||||
KEY_MODE,
|
||||
|
||||
KEY_AUDIONEXT,
|
||||
KEY_AUDIOPREV,
|
||||
KEY_AUDIOSTOP,
|
||||
KEY_AUDIOPLAY,
|
||||
KEY_AUDIOMUTE,
|
||||
KEY_MEDIASELECT,
|
||||
KEY_WWW,
|
||||
KEY_MAIL,
|
||||
KEY_CALCULATOR,
|
||||
KEY_COMPUTER,
|
||||
KEY_APP_SEARCH,
|
||||
KEY_APP_HOME,
|
||||
KEY_APP_BACK,
|
||||
KEY_APP_FORWARD,
|
||||
KEY_APP_STOP,
|
||||
KEY_APP_REFRESH,
|
||||
KEY_APP_BOOKMARKS,
|
||||
|
||||
KEY_BRIGHTNESSDOWN,
|
||||
KEY_BRIGHTNESSUP,
|
||||
KEY_DISPLAYSWITCH,
|
||||
KEY_KBDILLUMTOGGLE,
|
||||
KEY_KBDILLUMDOWN,
|
||||
KEY_KBDILLUMUP,
|
||||
KEY_EJECT,
|
||||
KEY_SLEEP,
|
||||
|
||||
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.
|
||||
@@ -520,17 +308,236 @@ public:
|
||||
};
|
||||
|
||||
/**
|
||||
* Modifier keys. These are special keys that temporarily modifies the normal function of a button when active.
|
||||
* Modifier keys. These are special keys that temporarily modify the normal function of a button when active.
|
||||
**/
|
||||
enum ModifierKey {
|
||||
enum ModifierKey
|
||||
{
|
||||
MODKEY_NUMLOCK,
|
||||
MODKEY_CAPSLOCK,
|
||||
MODKEY_SCROLLLOCK,
|
||||
MODKEY_MODE,
|
||||
|
||||
MODKEY_MAX_ENUM
|
||||
};
|
||||
|
||||
static constexpr uint32 KEY_SCANCODE_MASK = 1u << 30;
|
||||
|
||||
#define LOVE_KEY(scancode) (scancode | KEY_SCANCODE_MASK)
|
||||
|
||||
/**
|
||||
* Keyboard keys. They are dependent on the current layout of the keyboard.
|
||||
* This is not a full list of all keys - any unicode character can be a key,
|
||||
* which is why the ASCII keys in this list use their ASCII value directly.
|
||||
**/
|
||||
enum Key
|
||||
{
|
||||
KEY_UNKNOWN = 0,
|
||||
|
||||
KEY_RETURN = '\r',
|
||||
KEY_ESCAPE = '\x1B',
|
||||
KEY_BACKSPACE = '\b',
|
||||
KEY_TAB = '\t',
|
||||
KEY_SPACE = ' ',
|
||||
KEY_EXCLAIM = '!',
|
||||
KEY_QUOTEDBL = '"',
|
||||
KEY_HASH = '#',
|
||||
KEY_PERCENT = '%',
|
||||
KEY_DOLLAR = '$',
|
||||
KEY_AMPERSAND = '&',
|
||||
KEY_QUOTE = '\'',
|
||||
KEY_LEFTPAREN = '(',
|
||||
KEY_RIGHTPAREN = ')',
|
||||
KEY_ASTERISK = '*',
|
||||
KEY_PLUS = '+',
|
||||
KEY_COMMA = ',',
|
||||
KEY_MINUS = '-',
|
||||
KEY_PERIOD = '.',
|
||||
KEY_SLASH = '/',
|
||||
KEY_0 = '0',
|
||||
KEY_1 = '1',
|
||||
KEY_2 = '2',
|
||||
KEY_3 = '3',
|
||||
KEY_4 = '4',
|
||||
KEY_5 = '5',
|
||||
KEY_6 = '6',
|
||||
KEY_7 = '7',
|
||||
KEY_8 = '8',
|
||||
KEY_9 = '9',
|
||||
KEY_COLON = ':',
|
||||
KEY_SEMICOLON = ';',
|
||||
KEY_LESS = '<',
|
||||
KEY_EQUALS = '=',
|
||||
KEY_GREATER = '>',
|
||||
KEY_QUESTION = '?',
|
||||
KEY_AT = '@',
|
||||
|
||||
KEY_LEFTBRACKET = '[',
|
||||
KEY_BACKSLASH = '\\',
|
||||
KEY_RIGHTBRACKET = ']',
|
||||
KEY_CARET = '^',
|
||||
KEY_UNDERSCORE = '_',
|
||||
KEY_BACKQUOTE = '`',
|
||||
KEY_A = 'a',
|
||||
KEY_B = 'b',
|
||||
KEY_C = 'c',
|
||||
KEY_D = 'd',
|
||||
KEY_E = 'e',
|
||||
KEY_F = 'f',
|
||||
KEY_G = 'g',
|
||||
KEY_H = 'h',
|
||||
KEY_I = 'i',
|
||||
KEY_J = 'j',
|
||||
KEY_K = 'k',
|
||||
KEY_L = 'l',
|
||||
KEY_M = 'm',
|
||||
KEY_N = 'n',
|
||||
KEY_O = 'o',
|
||||
KEY_P = 'p',
|
||||
KEY_Q = 'q',
|
||||
KEY_R = 'r',
|
||||
KEY_S = 's',
|
||||
KEY_T = 't',
|
||||
KEY_U = 'u',
|
||||
KEY_V = 'v',
|
||||
KEY_W = 'w',
|
||||
KEY_X = 'x',
|
||||
KEY_Y = 'y',
|
||||
KEY_Z = 'z',
|
||||
|
||||
KEY_CAPSLOCK = LOVE_KEY(SCANCODE_CAPSLOCK),
|
||||
|
||||
KEY_F1 = LOVE_KEY(SCANCODE_F1),
|
||||
KEY_F2 = LOVE_KEY(SCANCODE_F2),
|
||||
KEY_F3 = LOVE_KEY(SCANCODE_F3),
|
||||
KEY_F4 = LOVE_KEY(SCANCODE_F4),
|
||||
KEY_F5 = LOVE_KEY(SCANCODE_F5),
|
||||
KEY_F6 = LOVE_KEY(SCANCODE_F6),
|
||||
KEY_F7 = LOVE_KEY(SCANCODE_F7),
|
||||
KEY_F8 = LOVE_KEY(SCANCODE_F8),
|
||||
KEY_F9 = LOVE_KEY(SCANCODE_F9),
|
||||
KEY_F10 = LOVE_KEY(SCANCODE_F10),
|
||||
KEY_F11 = LOVE_KEY(SCANCODE_F11),
|
||||
KEY_F12 = LOVE_KEY(SCANCODE_F12),
|
||||
|
||||
KEY_PRINTSCREEN = LOVE_KEY(SCANCODE_PRINTSCREEN),
|
||||
KEY_SCROLLLOCK = LOVE_KEY(SCANCODE_SCROLLLOCK),
|
||||
KEY_PAUSE = LOVE_KEY(SCANCODE_PAUSE),
|
||||
KEY_INSERT = LOVE_KEY(SCANCODE_INSERT),
|
||||
KEY_HOME = LOVE_KEY(SCANCODE_HOME),
|
||||
KEY_PAGEUP = LOVE_KEY(SCANCODE_PAGEUP),
|
||||
KEY_DELETE = LOVE_KEY(SCANCODE_DELETE),
|
||||
KEY_END = LOVE_KEY(SCANCODE_END),
|
||||
KEY_PAGEDOWN = LOVE_KEY(SCANCODE_PAGEDOWN),
|
||||
KEY_RIGHT = LOVE_KEY(SCANCODE_RIGHT),
|
||||
KEY_LEFT = LOVE_KEY(SCANCODE_LEFT),
|
||||
KEY_DOWN = LOVE_KEY(SCANCODE_DOWN),
|
||||
KEY_UP = LOVE_KEY(SCANCODE_UP),
|
||||
|
||||
KEY_NUMLOCKCLEAR = LOVE_KEY(SCANCODE_NUMLOCKCLEAR),
|
||||
KEY_KP_DIVIDE = LOVE_KEY(SCANCODE_KP_DIVIDE),
|
||||
KEY_KP_MULTIPLY = LOVE_KEY(SCANCODE_KP_MULTIPLY),
|
||||
KEY_KP_MINUS = LOVE_KEY(SCANCODE_KP_MINUS),
|
||||
KEY_KP_PLUS = LOVE_KEY(SCANCODE_KP_PLUS),
|
||||
KEY_KP_ENTER = LOVE_KEY(SCANCODE_KP_ENTER),
|
||||
KEY_KP_1 = LOVE_KEY(SCANCODE_KP_1),
|
||||
KEY_KP_2 = LOVE_KEY(SCANCODE_KP_2),
|
||||
KEY_KP_3 = LOVE_KEY(SCANCODE_KP_3),
|
||||
KEY_KP_4 = LOVE_KEY(SCANCODE_KP_4),
|
||||
KEY_KP_5 = LOVE_KEY(SCANCODE_KP_5),
|
||||
KEY_KP_6 = LOVE_KEY(SCANCODE_KP_6),
|
||||
KEY_KP_7 = LOVE_KEY(SCANCODE_KP_7),
|
||||
KEY_KP_8 = LOVE_KEY(SCANCODE_KP_8),
|
||||
KEY_KP_9 = LOVE_KEY(SCANCODE_KP_9),
|
||||
KEY_KP_0 = LOVE_KEY(SCANCODE_KP_0),
|
||||
KEY_KP_PERIOD = LOVE_KEY(SCANCODE_KP_PERIOD),
|
||||
KEY_KP_COMMA = LOVE_KEY(SCANCODE_KP_COMMA),
|
||||
KEY_KP_EQUALS = LOVE_KEY(SCANCODE_KP_EQUALS),
|
||||
|
||||
KEY_APPLICATION = LOVE_KEY(SCANCODE_APPLICATION),
|
||||
KEY_POWER = LOVE_KEY(SCANCODE_POWER),
|
||||
KEY_F13 = LOVE_KEY(SCANCODE_F13),
|
||||
KEY_F14 = LOVE_KEY(SCANCODE_F14),
|
||||
KEY_F15 = LOVE_KEY(SCANCODE_F15),
|
||||
KEY_F16 = LOVE_KEY(SCANCODE_F16),
|
||||
KEY_F17 = LOVE_KEY(SCANCODE_F17),
|
||||
KEY_F18 = LOVE_KEY(SCANCODE_F18),
|
||||
KEY_F19 = LOVE_KEY(SCANCODE_F19),
|
||||
KEY_F20 = LOVE_KEY(SCANCODE_F20),
|
||||
KEY_F21 = LOVE_KEY(SCANCODE_F21),
|
||||
KEY_F22 = LOVE_KEY(SCANCODE_F22),
|
||||
KEY_F23 = LOVE_KEY(SCANCODE_F23),
|
||||
KEY_F24 = LOVE_KEY(SCANCODE_F24),
|
||||
KEY_EXECUTE = LOVE_KEY(SCANCODE_EXECUTE),
|
||||
KEY_HELP = LOVE_KEY(SCANCODE_HELP),
|
||||
KEY_MENU = LOVE_KEY(SCANCODE_MENU),
|
||||
KEY_SELECT = LOVE_KEY(SCANCODE_SELECT),
|
||||
KEY_STOP = LOVE_KEY(SCANCODE_STOP),
|
||||
KEY_AGAIN = LOVE_KEY(SCANCODE_AGAIN),
|
||||
KEY_UNDO = LOVE_KEY(SCANCODE_UNDO),
|
||||
KEY_CUT = LOVE_KEY(SCANCODE_CUT),
|
||||
KEY_COPY = LOVE_KEY(SCANCODE_COPY),
|
||||
KEY_PASTE = LOVE_KEY(SCANCODE_PASTE),
|
||||
KEY_FIND = LOVE_KEY(SCANCODE_FIND),
|
||||
KEY_MUTE = LOVE_KEY(SCANCODE_MUTE),
|
||||
KEY_VOLUMEUP = LOVE_KEY(SCANCODE_VOLUMEUP),
|
||||
KEY_VOLUMEDOWN = LOVE_KEY(SCANCODE_VOLUMEDOWN),
|
||||
|
||||
KEY_ALTERASE = LOVE_KEY(SCANCODE_ALTERASE),
|
||||
KEY_SYSREQ = LOVE_KEY(SCANCODE_SYSREQ),
|
||||
KEY_CANCEL = LOVE_KEY(SCANCODE_CANCEL),
|
||||
KEY_CLEAR = LOVE_KEY(SCANCODE_CLEAR),
|
||||
KEY_PRIOR = LOVE_KEY(SCANCODE_PRIOR),
|
||||
KEY_RETURN2 = LOVE_KEY(SCANCODE_RETURN2),
|
||||
KEY_SEPARATOR = LOVE_KEY(SCANCODE_SEPARATOR),
|
||||
KEY_OUT = LOVE_KEY(SCANCODE_OUT),
|
||||
KEY_OPER = LOVE_KEY(SCANCODE_OPER),
|
||||
KEY_CLEARAGAIN = LOVE_KEY(SCANCODE_CLEARAGAIN),
|
||||
|
||||
KEY_THOUSANDSSEPARATOR = LOVE_KEY(SCANCODE_THOUSANDSSEPARATOR),
|
||||
KEY_DECIMALSEPARATOR = LOVE_KEY(SCANCODE_DECIMALSEPARATOR),
|
||||
KEY_CURRENCYUNIT = LOVE_KEY(SCANCODE_CURRENCYUNIT),
|
||||
KEY_CURRENCYSUBUNIT = LOVE_KEY(SCANCODE_CURRENCYSUBUNIT),
|
||||
|
||||
KEY_LCTRL = LOVE_KEY(SCANCODE_LCTRL),
|
||||
KEY_LSHIFT = LOVE_KEY(SCANCODE_LSHIFT),
|
||||
KEY_LALT = LOVE_KEY(SCANCODE_LALT),
|
||||
KEY_LGUI = LOVE_KEY(SCANCODE_LGUI),
|
||||
KEY_RCTRL = LOVE_KEY(SCANCODE_RCTRL),
|
||||
KEY_RSHIFT = LOVE_KEY(SCANCODE_RSHIFT),
|
||||
KEY_RALT = LOVE_KEY(SCANCODE_RALT),
|
||||
KEY_RGUI = LOVE_KEY(SCANCODE_RGUI),
|
||||
|
||||
KEY_MODE = LOVE_KEY(SCANCODE_MODE),
|
||||
|
||||
KEY_AUDIONEXT = LOVE_KEY(SCANCODE_AUDIONEXT),
|
||||
KEY_AUDIOPREV = LOVE_KEY(SCANCODE_AUDIOPREV),
|
||||
KEY_AUDIOSTOP = LOVE_KEY(SCANCODE_AUDIOSTOP),
|
||||
KEY_AUDIOPLAY = LOVE_KEY(SCANCODE_AUDIOPLAY),
|
||||
KEY_AUDIOMUTE = LOVE_KEY(SCANCODE_AUDIOMUTE),
|
||||
KEY_MEDIASELECT = LOVE_KEY(SCANCODE_MEDIASELECT),
|
||||
KEY_WWW = LOVE_KEY(SCANCODE_WWW),
|
||||
KEY_MAIL = LOVE_KEY(SCANCODE_MAIL),
|
||||
KEY_CALCULATOR = LOVE_KEY(SCANCODE_CALCULATOR),
|
||||
KEY_COMPUTER = LOVE_KEY(SCANCODE_COMPUTER),
|
||||
KEY_APP_SEARCH = LOVE_KEY(SCANCODE_AC_SEARCH),
|
||||
KEY_APP_HOME = LOVE_KEY(SCANCODE_AC_HOME),
|
||||
KEY_APP_BACK = LOVE_KEY(SCANCODE_AC_BACK),
|
||||
KEY_APP_FORWARD = LOVE_KEY(SCANCODE_AC_FORWARD),
|
||||
KEY_APP_STOP = LOVE_KEY(SCANCODE_AC_STOP),
|
||||
KEY_APP_REFRESH = LOVE_KEY(SCANCODE_AC_REFRESH),
|
||||
KEY_APP_BOOKMARKS = LOVE_KEY(SCANCODE_AC_BOOKMARKS),
|
||||
|
||||
KEY_BRIGHTNESSDOWN = LOVE_KEY(SCANCODE_BRIGHTNESSDOWN),
|
||||
KEY_BRIGHTNESSUP = LOVE_KEY(SCANCODE_BRIGHTNESSUP),
|
||||
KEY_DISPLAYSWITCH = LOVE_KEY(SCANCODE_DISPLAYSWITCH),
|
||||
KEY_KBDILLUMTOGGLE = LOVE_KEY(SCANCODE_KBDILLUMTOGGLE),
|
||||
KEY_KBDILLUMDOWN = LOVE_KEY(SCANCODE_KBDILLUMDOWN),
|
||||
KEY_KBDILLUMUP = LOVE_KEY(SCANCODE_KBDILLUMUP),
|
||||
KEY_EJECT = LOVE_KEY(SCANCODE_EJECT),
|
||||
KEY_SLEEP = LOVE_KEY(SCANCODE_SLEEP),
|
||||
};
|
||||
|
||||
#undef LOVE_KEY
|
||||
|
||||
virtual ~Keyboard() {}
|
||||
|
||||
/**
|
||||
@@ -617,8 +624,8 @@ protected:
|
||||
|
||||
private:
|
||||
|
||||
static StringMap<Key, KEY_MAX_ENUM>::Entry keyEntries[];
|
||||
static StringMap<Key, KEY_MAX_ENUM> keys;
|
||||
static std::map<uint32, std::string> keyToString;
|
||||
static std::map<std::string, uint32> stringToKey;
|
||||
|
||||
static StringMap<Scancode, SCANCODE_MAX_ENUM>::Entry scancodeEntries[];
|
||||
static StringMap<Scancode, SCANCODE_MAX_ENUM> scancodes;
|
||||
|
||||
Reference in New Issue
Block a user