diff --git a/compile_linux.sh b/compile_linux.sh index 7908938..670d6bd 100755 --- a/compile_linux.sh +++ b/compile_linux.sh @@ -62,6 +62,7 @@ ccache g++ -Wall -D_REENTRANT -g -Isfw -c sfw/render_core/mesh_utils.cpp -o sfw/ ccache g++ -Wall -D_REENTRANT -g -Isfw -c sfw/render_core/texture.cpp -o sfw/render_core/texture.o ccache g++ -Wall -D_REENTRANT -g -Isfw -c sfw/render_core/image.cpp -o sfw/render_core/image.o ccache g++ -Wall -D_REENTRANT -g -Isfw -c sfw/render_core/render_state.cpp -o sfw/render_core/render_state.o +ccache g++ -Wall -D_REENTRANT -g -Isfw -c sfw/render_core/input/keyboard.cpp -o sfw/render_core/input/keyboard.o ccache g++ -Wall -D_REENTRANT -g -Isfw -c sfw/render_objects/camera_3d.cpp -o sfw/render_objects/camera_3d.o ccache g++ -Wall -D_REENTRANT -g -Isfw -c sfw/render_objects/object_3d.cpp -o sfw/render_objects/object_3d.o @@ -93,6 +94,7 @@ ccache g++ -Wall -lm -ldl -lpthread -lX11 -D_REENTRANT -g sfw/core/aabb.o sfw/c sfw/render_core/application.o sfw/render_core/scene.o sfw/render_core/window.o \ sfw/render_core/shader.o sfw/render_core/material.o sfw/render_core/mesh.o \ sfw/render_core/mesh_utils.o sfw/render_core/texture.o \ + sfw/render_core/input/keyboard.o \ sfw/render_objects/camera_3d.o sfw/render_objects/object_3d.o sfw/render_objects/mesh_instance_3d.o \ sfw/render_objects/object_2d.o \ sfw/render_objects/sprite.o sfw/render_objects/tile_map.o \ diff --git a/sfw/render_core/input/keyboard.cpp b/sfw/render_core/input/keyboard.cpp new file mode 100644 index 0000000..80b564e --- /dev/null +++ b/sfw/render_core/input/keyboard.cpp @@ -0,0 +1,446 @@ +/*************************************************************************/ +/* keyboard.cpp */ +/* From https://github.com/Relintai/pandemonium_engine (MIT) */ +/*************************************************************************/ + +#include "keyboard.h" + +struct _KeyCodeText { + int code; + const char *text; +}; + +static const _KeyCodeText _keycodes[] = { + + /* clang-format off */ + {KEY_ESCAPE ,"Escape"}, + {KEY_TAB ,"Tab"}, + {KEY_BACKTAB ,"BackTab"}, + {KEY_BACKSPACE ,"BackSpace"}, + {KEY_ENTER ,"Enter"}, + {KEY_KP_ENTER ,"Kp Enter"}, + {KEY_INSERT ,"Insert"}, + {KEY_DELETE ,"Delete"}, + {KEY_PAUSE ,"Pause"}, + {KEY_PRINT ,"Print"}, + {KEY_SYSREQ ,"SysReq"}, + {KEY_CLEAR ,"Clear"}, + {KEY_HOME ,"Home"}, + {KEY_END ,"End"}, + {KEY_LEFT ,"Left"}, + {KEY_UP ,"Up"}, + {KEY_RIGHT ,"Right"}, + {KEY_DOWN ,"Down"}, + {KEY_PAGEUP ,"PageUp"}, + {KEY_PAGEDOWN ,"PageDown"}, + {KEY_SHIFT ,"Shift"}, + {KEY_CONTROL ,"Control"}, +#ifdef OSX_ENABLED + {KEY_META ,"Command"}, +#else + {KEY_META ,"Meta"}, +#endif + {KEY_ALT ,"Alt"}, + {KEY_CAPSLOCK ,"CapsLock"}, + {KEY_NUMLOCK ,"NumLock"}, + {KEY_SCROLLLOCK ,"ScrollLock"}, + {KEY_F1 ,"F1"}, + {KEY_F2 ,"F2"}, + {KEY_F3 ,"F3"}, + {KEY_F4 ,"F4"}, + {KEY_F5 ,"F5"}, + {KEY_F6 ,"F6"}, + {KEY_F7 ,"F7"}, + {KEY_F8 ,"F8"}, + {KEY_F9 ,"F9"}, + {KEY_F10 ,"F10"}, + {KEY_F11 ,"F11"}, + {KEY_F12 ,"F12"}, + {KEY_F13 ,"F13"}, + {KEY_F14 ,"F14"}, + {KEY_F15 ,"F15"}, + {KEY_F16 ,"F16"}, + {KEY_KP_MULTIPLY ,"Kp Multiply"}, + {KEY_KP_DIVIDE ,"Kp Divide"}, + {KEY_KP_SUBTRACT ,"Kp Subtract"}, + {KEY_KP_PERIOD ,"Kp Period"}, + {KEY_KP_ADD ,"Kp Add"}, + {KEY_KP_0 ,"Kp 0"}, + {KEY_KP_1 ,"Kp 1"}, + {KEY_KP_2 ,"Kp 2"}, + {KEY_KP_3 ,"Kp 3"}, + {KEY_KP_4 ,"Kp 4"}, + {KEY_KP_5 ,"Kp 5"}, + {KEY_KP_6 ,"Kp 6"}, + {KEY_KP_7 ,"Kp 7"}, + {KEY_KP_8 ,"Kp 8"}, + {KEY_KP_9 ,"Kp 9"}, + {KEY_SUPER_L ,"Super L"}, + {KEY_SUPER_R ,"Super R"}, + {KEY_MENU ,"Menu"}, + {KEY_HYPER_L ,"Hyper L"}, + {KEY_HYPER_R ,"Hyper R"}, + {KEY_HELP ,"Help"}, + {KEY_DIRECTION_L ,"Direction L"}, + {KEY_DIRECTION_R ,"Direction R"}, + {KEY_BACK ,"Back"}, + {KEY_FORWARD ,"Forward"}, + {KEY_STOP ,"Stop"}, + {KEY_REFRESH ,"Refresh"}, + {KEY_VOLUMEDOWN ,"VolumeDown"}, + {KEY_VOLUMEMUTE ,"VolumeMute"}, + {KEY_VOLUMEUP ,"VolumeUp"}, + {KEY_BASSBOOST ,"BassBoost"}, + {KEY_BASSUP ,"BassUp"}, + {KEY_BASSDOWN ,"BassDown"}, + {KEY_TREBLEUP ,"TrebleUp"}, + {KEY_TREBLEDOWN ,"TrebleDown"}, + {KEY_MEDIAPLAY ,"MediaPlay"}, + {KEY_MEDIASTOP ,"MediaStop"}, + {KEY_MEDIAPREVIOUS ,"MediaPrevious"}, + {KEY_MEDIANEXT ,"MediaNext"}, + {KEY_MEDIARECORD ,"MediaRecord"}, + {KEY_HOMEPAGE ,"HomePage"}, + {KEY_FAVORITES ,"Favorites"}, + {KEY_SEARCH ,"Search"}, + {KEY_STANDBY ,"StandBy"}, + {KEY_LAUNCHMAIL ,"LaunchMail"}, + {KEY_LAUNCHMEDIA ,"LaunchMedia"}, + {KEY_LAUNCH0 ,"Launch0"}, + {KEY_LAUNCH1 ,"Launch1"}, + {KEY_LAUNCH2 ,"Launch2"}, + {KEY_LAUNCH3 ,"Launch3"}, + {KEY_LAUNCH4 ,"Launch4"}, + {KEY_LAUNCH5 ,"Launch5"}, + {KEY_LAUNCH6 ,"Launch6"}, + {KEY_LAUNCH7 ,"Launch7"}, + {KEY_LAUNCH8 ,"Launch8"}, + {KEY_LAUNCH9 ,"Launch9"}, + {KEY_LAUNCHA ,"LaunchA"}, + {KEY_LAUNCHB ,"LaunchB"}, + {KEY_LAUNCHC ,"LaunchC"}, + {KEY_LAUNCHD ,"LaunchD"}, + {KEY_LAUNCHE ,"LaunchE"}, + {KEY_LAUNCHF ,"LaunchF"}, + + {KEY_UNKNOWN ,"Unknown"}, + + {KEY_SPACE ,"Space"}, + {KEY_EXCLAM ,"Exclam"}, + {KEY_QUOTEDBL ,"QuoteDbl"}, + {KEY_NUMBERSIGN ,"NumberSign"}, + {KEY_DOLLAR ,"Dollar"}, + {KEY_PERCENT ,"Percent"}, + {KEY_AMPERSAND ,"Ampersand"}, + {KEY_APOSTROPHE ,"Apostrophe"}, + {KEY_PARENLEFT ,"ParenLeft"}, + {KEY_PARENRIGHT ,"ParenRight"}, + {KEY_ASTERISK ,"Asterisk"}, + {KEY_PLUS ,"Plus"}, + {KEY_COMMA ,"Comma"}, + {KEY_MINUS ,"Minus"}, + {KEY_PERIOD ,"Period"}, + {KEY_SLASH ,"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 ,"Colon"}, + {KEY_SEMICOLON ,"Semicolon"}, + {KEY_LESS ,"Less"}, + {KEY_EQUAL ,"Equal"}, + {KEY_GREATER ,"Greater"}, + {KEY_QUESTION ,"Question"}, + {KEY_AT ,"At"}, + {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_BRACKETLEFT ,"BracketLeft"}, + {KEY_BACKSLASH ,"BackSlash"}, + {KEY_BRACKETRIGHT ,"BracketRight"}, + {KEY_ASCIICIRCUM ,"AsciiCircum"}, + {KEY_UNDERSCORE ,"UnderScore"}, + {KEY_QUOTELEFT ,"QuoteLeft"}, + {KEY_BRACELEFT ,"BraceLeft"}, + {KEY_BAR ,"Bar"}, + {KEY_BRACERIGHT ,"BraceRight"}, + {KEY_ASCIITILDE ,"AsciiTilde"}, + {KEY_NOBREAKSPACE ,"NoBreakSpace"}, + {KEY_EXCLAMDOWN ,"ExclamDown"}, + {KEY_CENT ,"Cent"}, + {KEY_STERLING ,"Sterling"}, + {KEY_CURRENCY ,"Currency"}, + {KEY_YEN ,"Yen"}, + {KEY_BROKENBAR ,"BrokenBar"}, + {KEY_SECTION ,"Section"}, + {KEY_DIAERESIS ,"Diaeresis"}, + {KEY_COPYRIGHT ,"Copyright"}, + {KEY_ORDFEMININE ,"Ordfeminine"}, + {KEY_GUILLEMOTLEFT ,"GuillemotLeft"}, + {KEY_NOTSIGN ,"NotSign"}, + {KEY_HYPHEN ,"Hyphen"}, + {KEY_REGISTERED ,"Registered"}, + {KEY_MACRON ,"Macron"}, + {KEY_DEGREE ,"Degree"}, + {KEY_PLUSMINUS ,"PlusMinus"}, + {KEY_TWOSUPERIOR ,"TwoSuperior"}, + {KEY_THREESUPERIOR ,"ThreeSuperior"}, + {KEY_ACUTE ,"Acute"}, + {KEY_MU ,"Mu"}, + {KEY_PARAGRAPH ,"Paragraph"}, + {KEY_PERIODCENTERED ,"PeriodCentered"}, + {KEY_CEDILLA ,"Cedilla"}, + {KEY_ONESUPERIOR ,"OneSuperior"}, + {KEY_MASCULINE ,"Masculine"}, + {KEY_GUILLEMOTRIGHT ,"GuillemotRight"}, + {KEY_ONEQUARTER ,"OneQuarter"}, + {KEY_ONEHALF ,"OneHalf"}, + {KEY_THREEQUARTERS ,"ThreeQuarters"}, + {KEY_QUESTIONDOWN ,"QuestionDown"}, + {KEY_AGRAVE ,"Agrave"}, + {KEY_AACUTE ,"Aacute"}, + {KEY_ACIRCUMFLEX ,"AcircumFlex"}, + {KEY_ATILDE ,"Atilde"}, + {KEY_ADIAERESIS ,"Adiaeresis"}, + {KEY_ARING ,"Aring"}, + {KEY_AE ,"Ae"}, + {KEY_CCEDILLA ,"Ccedilla"}, + {KEY_EGRAVE ,"Egrave"}, + {KEY_EACUTE ,"Eacute"}, + {KEY_ECIRCUMFLEX ,"Ecircumflex"}, + {KEY_EDIAERESIS ,"Ediaeresis"}, + {KEY_IGRAVE ,"Igrave"}, + {KEY_IACUTE ,"Iacute"}, + {KEY_ICIRCUMFLEX ,"Icircumflex"}, + {KEY_IDIAERESIS ,"Idiaeresis"}, + {KEY_ETH ,"Eth"}, + {KEY_NTILDE ,"Ntilde"}, + {KEY_OGRAVE ,"Ograve"}, + {KEY_OACUTE ,"Oacute"}, + {KEY_OCIRCUMFLEX ,"Ocircumflex"}, + {KEY_OTILDE ,"Otilde"}, + {KEY_ODIAERESIS ,"Odiaeresis"}, + {KEY_MULTIPLY ,"Multiply"}, + {KEY_OOBLIQUE ,"Ooblique"}, + {KEY_UGRAVE ,"Ugrave"}, + {KEY_UACUTE ,"Uacute"}, + {KEY_UCIRCUMFLEX ,"Ucircumflex"}, + {KEY_UDIAERESIS ,"Udiaeresis"}, + {KEY_YACUTE ,"Yacute"}, + {KEY_THORN ,"Thorn"}, + {KEY_SSHARP ,"Ssharp"}, + + {KEY_DIVISION ,"Division"}, + {KEY_YDIAERESIS ,"Ydiaeresis"}, + {0 ,nullptr} + /* clang-format on */ +}; + +bool keycode_has_unicode(uint32_t p_keycode) { + switch (p_keycode) { + case KEY_ESCAPE: + case KEY_TAB: + case KEY_BACKTAB: + case KEY_BACKSPACE: + case KEY_ENTER: + case KEY_KP_ENTER: + case KEY_INSERT: + case KEY_DELETE: + case KEY_PAUSE: + case KEY_PRINT: + case KEY_SYSREQ: + case KEY_CLEAR: + case KEY_HOME: + case KEY_END: + case KEY_LEFT: + case KEY_UP: + case KEY_RIGHT: + case KEY_DOWN: + case KEY_PAGEUP: + case KEY_PAGEDOWN: + case KEY_SHIFT: + case KEY_CONTROL: + case KEY_META: + case KEY_ALT: + case KEY_CAPSLOCK: + case KEY_NUMLOCK: + case KEY_SCROLLLOCK: + case KEY_F1: + case KEY_F2: + case KEY_F3: + case KEY_F4: + case KEY_F5: + case KEY_F6: + case KEY_F7: + case KEY_F8: + case KEY_F9: + case KEY_F10: + case KEY_F11: + case KEY_F12: + case KEY_F13: + case KEY_F14: + case KEY_F15: + case KEY_F16: + case KEY_SUPER_L: + case KEY_SUPER_R: + case KEY_MENU: + case KEY_HYPER_L: + case KEY_HYPER_R: + case KEY_HELP: + case KEY_DIRECTION_L: + case KEY_DIRECTION_R: + case KEY_BACK: + case KEY_FORWARD: + case KEY_STOP: + case KEY_REFRESH: + case KEY_VOLUMEDOWN: + case KEY_VOLUMEMUTE: + case KEY_VOLUMEUP: + case KEY_BASSBOOST: + case KEY_BASSUP: + case KEY_BASSDOWN: + case KEY_TREBLEUP: + case KEY_TREBLEDOWN: + case KEY_MEDIAPLAY: + case KEY_MEDIASTOP: + case KEY_MEDIAPREVIOUS: + case KEY_MEDIANEXT: + case KEY_MEDIARECORD: + case KEY_HOMEPAGE: + case KEY_FAVORITES: + case KEY_SEARCH: + case KEY_STANDBY: + case KEY_OPENURL: + case KEY_LAUNCHMAIL: + case KEY_LAUNCHMEDIA: + case KEY_LAUNCH0: + case KEY_LAUNCH1: + case KEY_LAUNCH2: + case KEY_LAUNCH3: + case KEY_LAUNCH4: + case KEY_LAUNCH5: + case KEY_LAUNCH6: + case KEY_LAUNCH7: + case KEY_LAUNCH8: + case KEY_LAUNCH9: + case KEY_LAUNCHA: + case KEY_LAUNCHB: + case KEY_LAUNCHC: + case KEY_LAUNCHD: + case KEY_LAUNCHE: + case KEY_LAUNCHF: + return false; + } + + return true; +} + +String keycode_get_string(uint32_t p_code) { + String codestr; + if (p_code & KEY_MASK_SHIFT) { + codestr += find_keycode_name(KEY_SHIFT); + codestr += "+"; + } + if (p_code & KEY_MASK_ALT) { + codestr += find_keycode_name(KEY_ALT); + codestr += "+"; + } + if (p_code & KEY_MASK_CTRL) { + codestr += find_keycode_name(KEY_CONTROL); + codestr += "+"; + } + if (p_code & KEY_MASK_META) { + codestr += find_keycode_name(KEY_META); + codestr += "+"; + } + + p_code &= KEY_CODE_MASK; + + const _KeyCodeText *kct = &_keycodes[0]; + + while (kct->text) { + if (kct->code == (int)p_code) { + codestr += kct->text; + return codestr; + } + kct++; + } + + codestr += String::chr(p_code); + + return codestr; +} + +int find_keycode(const String &p_code) { + const _KeyCodeText *kct = &_keycodes[0]; + + while (kct->text) { + if (p_code.nocasecmp_to(kct->text) == 0) { + return kct->code; + } + kct++; + } + + return 0; +} + +const char *find_keycode_name(int p_keycode) { + const _KeyCodeText *kct = &_keycodes[0]; + + while (kct->text) { + if (kct->code == p_keycode) { + return kct->text; + } + kct++; + } + + return ""; +} + +int keycode_get_count() { + const _KeyCodeText *kct = &_keycodes[0]; + + int count = 0; + while (kct->text) { + count++; + kct++; + } + return count; +} + +int keycode_get_value_by_index(int p_index) { + return _keycodes[p_index].code; +} + +const char *keycode_get_name_by_index(int p_index) { + return _keycodes[p_index].text; +} diff --git a/sfw/render_core/input/keyboard.h b/sfw/render_core/input/keyboard.h new file mode 100644 index 0000000..fda30bc --- /dev/null +++ b/sfw/render_core/input/keyboard.h @@ -0,0 +1,303 @@ +#ifndef KEYBOARD_H +#define KEYBOARD_H + +/*************************************************************************/ +/* keyboard.h */ +/* From https://github.com/Relintai/pandemonium_engine (MIT) */ +/*************************************************************************/ + +#include "core/ustring.h" + +/* + Special Key: + + The strategy here is similar to the one used by toolkits, + which consists in leaving the 24 bits unicode range for printable + characters, and use the upper 8 bits for special keys and + modifiers. This way everything (char/keycode) can fit nicely in one 32 bits unsigned integer. +*/ +enum { + SPKEY = (1 << 24) +}; + +enum KeyList { + /* CURSOR/FUNCTION/BROWSER/MULTIMEDIA/MISC KEYS */ + KEY_ESCAPE = SPKEY | 0x01, + KEY_TAB = SPKEY | 0x02, + KEY_BACKTAB = SPKEY | 0x03, + KEY_BACKSPACE = SPKEY | 0x04, + KEY_ENTER = SPKEY | 0x05, + KEY_KP_ENTER = SPKEY | 0x06, + KEY_INSERT = SPKEY | 0x07, + KEY_DELETE = SPKEY | 0x08, + KEY_PAUSE = SPKEY | 0x09, + KEY_PRINT = SPKEY | 0x0A, + KEY_SYSREQ = SPKEY | 0x0B, + KEY_CLEAR = SPKEY | 0x0C, + KEY_HOME = SPKEY | 0x0D, + KEY_END = SPKEY | 0x0E, + KEY_LEFT = SPKEY | 0x0F, + KEY_UP = SPKEY | 0x10, + KEY_RIGHT = SPKEY | 0x11, + KEY_DOWN = SPKEY | 0x12, + KEY_PAGEUP = SPKEY | 0x13, + KEY_PAGEDOWN = SPKEY | 0x14, + KEY_SHIFT = SPKEY | 0x15, + KEY_CONTROL = SPKEY | 0x16, + KEY_META = SPKEY | 0x17, + KEY_ALT = SPKEY | 0x18, + KEY_CAPSLOCK = SPKEY | 0x19, + KEY_NUMLOCK = SPKEY | 0x1A, + KEY_SCROLLLOCK = SPKEY | 0x1B, + KEY_F1 = SPKEY | 0x1C, + KEY_F2 = SPKEY | 0x1D, + KEY_F3 = SPKEY | 0x1E, + KEY_F4 = SPKEY | 0x1F, + KEY_F5 = SPKEY | 0x20, + KEY_F6 = SPKEY | 0x21, + KEY_F7 = SPKEY | 0x22, + KEY_F8 = SPKEY | 0x23, + KEY_F9 = SPKEY | 0x24, + KEY_F10 = SPKEY | 0x25, + KEY_F11 = SPKEY | 0x26, + KEY_F12 = SPKEY | 0x27, + KEY_F13 = SPKEY | 0x28, + KEY_F14 = SPKEY | 0x29, + KEY_F15 = SPKEY | 0x2A, + KEY_F16 = SPKEY | 0x2B, + KEY_KP_MULTIPLY = SPKEY | 0x81, + KEY_KP_DIVIDE = SPKEY | 0x82, + KEY_KP_SUBTRACT = SPKEY | 0x83, + KEY_KP_PERIOD = SPKEY | 0x84, + KEY_KP_ADD = SPKEY | 0x85, + KEY_KP_0 = SPKEY | 0x86, + KEY_KP_1 = SPKEY | 0x87, + KEY_KP_2 = SPKEY | 0x88, + KEY_KP_3 = SPKEY | 0x89, + KEY_KP_4 = SPKEY | 0x8A, + KEY_KP_5 = SPKEY | 0x8B, + KEY_KP_6 = SPKEY | 0x8C, + KEY_KP_7 = SPKEY | 0x8D, + KEY_KP_8 = SPKEY | 0x8E, + KEY_KP_9 = SPKEY | 0x8F, + KEY_SUPER_L = SPKEY | 0x2C, + KEY_SUPER_R = SPKEY | 0x2D, + KEY_MENU = SPKEY | 0x2E, + KEY_HYPER_L = SPKEY | 0x2F, + KEY_HYPER_R = SPKEY | 0x30, + KEY_HELP = SPKEY | 0x31, + KEY_DIRECTION_L = SPKEY | 0x32, + KEY_DIRECTION_R = SPKEY | 0x33, + KEY_BACK = SPKEY | 0x40, + KEY_FORWARD = SPKEY | 0x41, + KEY_STOP = SPKEY | 0x42, + KEY_REFRESH = SPKEY | 0x43, + KEY_VOLUMEDOWN = SPKEY | 0x44, + KEY_VOLUMEMUTE = SPKEY | 0x45, + KEY_VOLUMEUP = SPKEY | 0x46, + KEY_BASSBOOST = SPKEY | 0x47, + KEY_BASSUP = SPKEY | 0x48, + KEY_BASSDOWN = SPKEY | 0x49, + KEY_TREBLEUP = SPKEY | 0x4A, + KEY_TREBLEDOWN = SPKEY | 0x4B, + KEY_MEDIAPLAY = SPKEY | 0x4C, + KEY_MEDIASTOP = SPKEY | 0x4D, + KEY_MEDIAPREVIOUS = SPKEY | 0x4E, + KEY_MEDIANEXT = SPKEY | 0x4F, + KEY_MEDIARECORD = SPKEY | 0x50, + KEY_HOMEPAGE = SPKEY | 0x51, + KEY_FAVORITES = SPKEY | 0x52, + KEY_SEARCH = SPKEY | 0x53, + KEY_STANDBY = SPKEY | 0x54, + KEY_OPENURL = SPKEY | 0x55, + KEY_LAUNCHMAIL = SPKEY | 0x56, + KEY_LAUNCHMEDIA = SPKEY | 0x57, + KEY_LAUNCH0 = SPKEY | 0x58, + KEY_LAUNCH1 = SPKEY | 0x59, + KEY_LAUNCH2 = SPKEY | 0x5A, + KEY_LAUNCH3 = SPKEY | 0x5B, + KEY_LAUNCH4 = SPKEY | 0x5C, + KEY_LAUNCH5 = SPKEY | 0x5D, + KEY_LAUNCH6 = SPKEY | 0x5E, + KEY_LAUNCH7 = SPKEY | 0x5F, + KEY_LAUNCH8 = SPKEY | 0x60, + KEY_LAUNCH9 = SPKEY | 0x61, + KEY_LAUNCHA = SPKEY | 0x62, + KEY_LAUNCHB = SPKEY | 0x63, + KEY_LAUNCHC = SPKEY | 0x64, + KEY_LAUNCHD = SPKEY | 0x65, + KEY_LAUNCHE = SPKEY | 0x66, + KEY_LAUNCHF = SPKEY | 0x67, + + KEY_UNKNOWN = SPKEY | 0xFFFFFF, + + /* PRINTABLE LATIN 1 CODES */ + + KEY_SPACE = 0x0020, + KEY_EXCLAM = 0x0021, + KEY_QUOTEDBL = 0x0022, + KEY_NUMBERSIGN = 0x0023, + KEY_DOLLAR = 0x0024, + KEY_PERCENT = 0x0025, + KEY_AMPERSAND = 0x0026, + KEY_APOSTROPHE = 0x0027, + KEY_PARENLEFT = 0x0028, + KEY_PARENRIGHT = 0x0029, + KEY_ASTERISK = 0x002A, + KEY_PLUS = 0x002B, + KEY_COMMA = 0x002C, + KEY_MINUS = 0x002D, + KEY_PERIOD = 0x002E, + KEY_SLASH = 0x002F, + KEY_0 = 0x0030, + KEY_1 = 0x0031, + KEY_2 = 0x0032, + KEY_3 = 0x0033, + KEY_4 = 0x0034, + KEY_5 = 0x0035, + KEY_6 = 0x0036, + KEY_7 = 0x0037, + KEY_8 = 0x0038, + KEY_9 = 0x0039, + KEY_COLON = 0x003A, + KEY_SEMICOLON = 0x003B, + KEY_LESS = 0x003C, + KEY_EQUAL = 0x003D, + KEY_GREATER = 0x003E, + KEY_QUESTION = 0x003F, + KEY_AT = 0x0040, + KEY_A = 0x0041, + KEY_B = 0x0042, + KEY_C = 0x0043, + KEY_D = 0x0044, + KEY_E = 0x0045, + KEY_F = 0x0046, + KEY_G = 0x0047, + KEY_H = 0x0048, + KEY_I = 0x0049, + KEY_J = 0x004A, + KEY_K = 0x004B, + KEY_L = 0x004C, + KEY_M = 0x004D, + KEY_N = 0x004E, + KEY_O = 0x004F, + KEY_P = 0x0050, + KEY_Q = 0x0051, + KEY_R = 0x0052, + KEY_S = 0x0053, + KEY_T = 0x0054, + KEY_U = 0x0055, + KEY_V = 0x0056, + KEY_W = 0x0057, + KEY_X = 0x0058, + KEY_Y = 0x0059, + KEY_Z = 0x005A, + KEY_BRACKETLEFT = 0x005B, + KEY_BACKSLASH = 0x005C, + KEY_BRACKETRIGHT = 0x005D, + KEY_ASCIICIRCUM = 0x005E, + KEY_UNDERSCORE = 0x005F, + KEY_QUOTELEFT = 0x0060, + KEY_BRACELEFT = 0x007B, + KEY_BAR = 0x007C, + KEY_BRACERIGHT = 0x007D, + KEY_ASCIITILDE = 0x007E, + KEY_NOBREAKSPACE = 0x00A0, + KEY_EXCLAMDOWN = 0x00A1, + KEY_CENT = 0x00A2, + KEY_STERLING = 0x00A3, + KEY_CURRENCY = 0x00A4, + KEY_YEN = 0x00A5, + KEY_BROKENBAR = 0x00A6, + KEY_SECTION = 0x00A7, + KEY_DIAERESIS = 0x00A8, + KEY_COPYRIGHT = 0x00A9, + KEY_ORDFEMININE = 0x00AA, + KEY_GUILLEMOTLEFT = 0x00AB, + KEY_NOTSIGN = 0x00AC, + KEY_HYPHEN = 0x00AD, + KEY_REGISTERED = 0x00AE, + KEY_MACRON = 0x00AF, + KEY_DEGREE = 0x00B0, + KEY_PLUSMINUS = 0x00B1, + KEY_TWOSUPERIOR = 0x00B2, + KEY_THREESUPERIOR = 0x00B3, + KEY_ACUTE = 0x00B4, + KEY_MU = 0x00B5, + KEY_PARAGRAPH = 0x00B6, + KEY_PERIODCENTERED = 0x00B7, + KEY_CEDILLA = 0x00B8, + KEY_ONESUPERIOR = 0x00B9, + KEY_MASCULINE = 0x00BA, + KEY_GUILLEMOTRIGHT = 0x00BB, + KEY_ONEQUARTER = 0x00BC, + KEY_ONEHALF = 0x00BD, + KEY_THREEQUARTERS = 0x00BE, + KEY_QUESTIONDOWN = 0x00BF, + KEY_AGRAVE = 0x00C0, + KEY_AACUTE = 0x00C1, + KEY_ACIRCUMFLEX = 0x00C2, + KEY_ATILDE = 0x00C3, + KEY_ADIAERESIS = 0x00C4, + KEY_ARING = 0x00C5, + KEY_AE = 0x00C6, + KEY_CCEDILLA = 0x00C7, + KEY_EGRAVE = 0x00C8, + KEY_EACUTE = 0x00C9, + KEY_ECIRCUMFLEX = 0x00CA, + KEY_EDIAERESIS = 0x00CB, + KEY_IGRAVE = 0x00CC, + KEY_IACUTE = 0x00CD, + KEY_ICIRCUMFLEX = 0x00CE, + KEY_IDIAERESIS = 0x00CF, + KEY_ETH = 0x00D0, + KEY_NTILDE = 0x00D1, + KEY_OGRAVE = 0x00D2, + KEY_OACUTE = 0x00D3, + KEY_OCIRCUMFLEX = 0x00D4, + KEY_OTILDE = 0x00D5, + KEY_ODIAERESIS = 0x00D6, + KEY_MULTIPLY = 0x00D7, + KEY_OOBLIQUE = 0x00D8, + KEY_UGRAVE = 0x00D9, + KEY_UACUTE = 0x00DA, + KEY_UCIRCUMFLEX = 0x00DB, + KEY_UDIAERESIS = 0x00DC, + KEY_YACUTE = 0x00DD, + KEY_THORN = 0x00DE, + KEY_SSHARP = 0x00DF, + + KEY_DIVISION = 0x00F7, + KEY_YDIAERESIS = 0x00FF, + +}; + +enum KeyModifierMask { + + KEY_CODE_MASK = ((1 << 25) - 1), ///< Apply this mask to any keycode to remove modifiers. + KEY_MODIFIER_MASK = (0xFF << 24), ///< Apply this mask to isolate modifiers. + KEY_MASK_SHIFT = (1 << 25), + KEY_MASK_ALT = (1 << 26), + KEY_MASK_META = (1 << 27), + KEY_MASK_CTRL = (1 << 28), +#ifdef APPLE_STYLE_KEYS + KEY_MASK_CMD = KEY_MASK_META, +#else + KEY_MASK_CMD = KEY_MASK_CTRL, +#endif + + KEY_MASK_KPAD = (1 << 29), + KEY_MASK_GROUP_SWITCH = (1 << 30) + // bit 31 can't be used because variant uses regular 32 bits int as datatype + +}; + +String keycode_get_string(uint32_t p_code); +bool keycode_has_unicode(uint32_t p_keycode); +int find_keycode(const String &p_code); +const char *find_keycode_name(int p_keycode); +int keycode_get_count(); +int keycode_get_value_by_index(int p_index); +const char *keycode_get_name_by_index(int p_index); + +#endif