diff options
author | bruvzg <7645683+bruvzg@users.noreply.github.com> | 2022-12-11 01:21:22 +0200 |
---|---|---|
committer | bruvzg <7645683+bruvzg@users.noreply.github.com> | 2023-01-23 15:08:12 +0200 |
commit | daad4aed62bfa471421f960179f0ac0fd78e8040 (patch) | |
tree | 86b7f69d180f253c51c4b567139d68850f9e365d /core/os | |
parent | 9937915ad77059b63582ffd4e324afb26f467b76 (diff) |
Cleanup and unify keyboard input.
- Unify keycode values (secondary label printed on a key), remove unused hardcoded Latin-1 codes.
- Unify IME behaviour, add inline composition string display on Windows and X11.
- Add key_label (localized label printed on a key) value to the key events, and allow mapping actions to the unshifted Unicode events.
- Add support for physical keyboard (Bluetooth or Sidecar) handling on iOS.
- Add support for media key handling on macOS.
Co-authored-by: Raul Santos <raulsntos@gmail.com>
Diffstat (limited to 'core/os')
-rw-r--r-- | core/os/keyboard.cpp | 119 | ||||
-rw-r--r-- | core/os/keyboard.h | 87 |
2 files changed, 42 insertions, 164 deletions
diff --git a/core/os/keyboard.cpp b/core/os/keyboard.cpp index 5183b77cb1..25a4b320cd 100644 --- a/core/os/keyboard.cpp +++ b/core/os/keyboard.cpp @@ -127,14 +127,9 @@ static const _KeyCodeText _keycodes[] = { {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::HYPER ,"Hyper"}, {Key::HELP ,"Help"}, - {Key::DIRECTION_L ,"Direction L"}, - {Key::DIRECTION_R ,"Direction R"}, {Key::BACK ,"Back"}, {Key::FORWARD ,"Forward"}, {Key::STOP ,"Stop"}, @@ -142,11 +137,6 @@ static const _KeyCodeText _keycodes[] = { {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"}, @@ -174,6 +164,10 @@ static const _KeyCodeText _keycodes[] = { {Key::LAUNCHD ,"LaunchD"}, {Key::LAUNCHE ,"LaunchE"}, {Key::LAUNCHF ,"LaunchF"}, + {Key::GLOBE ,"Globe"}, + {Key::KEYBOARD ,"On-screen keyboard"}, + {Key::JIS_EISU ,"JIS Eisu"}, + {Key::JIS_KANA ,"JIS Kana"}, {Key::UNKNOWN ,"Unknown"}, {Key::SPACE ,"Space"}, {Key::EXCLAM ,"Exclam"}, @@ -244,72 +238,6 @@ static const _KeyCodeText _keycodes[] = { {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::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"}, {Key::NONE ,nullptr} /* clang-format on */ }; @@ -378,14 +306,9 @@ bool keycode_has_unicode(Key p_keycode) { case Key::F33: case Key::F34: case Key::F35: - case Key::SUPER_L: - case Key::SUPER_R: case Key::MENU: - case Key::HYPER_L: - case Key::HYPER_R: + case Key::HYPER: case Key::HELP: - case Key::DIRECTION_L: - case Key::DIRECTION_R: case Key::BACK: case Key::FORWARD: case Key::STOP: @@ -393,11 +316,6 @@ bool keycode_has_unicode(Key p_keycode) { 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: @@ -426,6 +344,10 @@ bool keycode_has_unicode(Key p_keycode) { case Key::LAUNCHD: case Key::LAUNCHE: case Key::LAUNCHF: + case Key::GLOBE: + case Key::KEYBOARD: + case Key::JIS_EISU: + case Key::JIS_KANA: return false; default: { } @@ -522,3 +444,24 @@ int keycode_get_value_by_index(int p_index) { const char *keycode_get_name_by_index(int p_index) { return _keycodes[p_index].text; } + +char32_t fix_unicode(char32_t p_char) { + if (p_char >= 0x20 && p_char != 0x7F) { + return p_char; + } + return 0; +} + +Key fix_keycode(char32_t p_char, Key p_key) { + if (p_char >= 0x20 && p_char <= 0x7E) { + return (Key)String::char_uppercase(p_char); + } + return p_key; +} + +Key fix_key_label(char32_t p_char, Key p_key) { + if (p_char >= 0x20 && p_char != 0x7F) { + return (Key)String::char_uppercase(p_char); + } + return p_key; +} diff --git a/core/os/keyboard.h b/core/os/keyboard.h index c78fa2a631..6315356510 100644 --- a/core/os/keyboard.h +++ b/core/os/keyboard.h @@ -127,11 +127,8 @@ enum class Key { SUPER_L = SPECIAL | 0x40, SUPER_R = SPECIAL | 0x41, MENU = SPECIAL | 0x42, - HYPER_L = SPECIAL | 0x43, - HYPER_R = SPECIAL | 0x44, + HYPER = SPECIAL | 0x43, HELP = SPECIAL | 0x45, - DIRECTION_L = SPECIAL | 0x46, - DIRECTION_R = SPECIAL | 0x47, BACK = SPECIAL | 0x48, FORWARD = SPECIAL | 0x49, STOP = SPECIAL | 0x4A, @@ -139,11 +136,6 @@ enum class Key { VOLUMEDOWN = SPECIAL | 0x4C, VOLUMEMUTE = SPECIAL | 0x4D, VOLUMEUP = SPECIAL | 0x4E, - BASSBOOST = SPECIAL | 0x4F, - BASSUP = SPECIAL | 0x50, - BASSDOWN = SPECIAL | 0x51, - TREBLEUP = SPECIAL | 0x52, - TREBLEDOWN = SPECIAL | 0x53, MEDIAPLAY = SPECIAL | 0x54, MEDIASTOP = SPECIAL | 0x55, MEDIAPREVIOUS = SPECIAL | 0x56, @@ -173,7 +165,12 @@ enum class Key { LAUNCHE = SPECIAL | 0x6E, LAUNCHF = SPECIAL | 0x6F, - UNKNOWN = SPECIAL | 0xFFFFFF, + GLOBE = SPECIAL | 0x70, + KEYBOARD = SPECIAL | 0x71, + JIS_EISU = SPECIAL | 0x72, + JIS_KANA = SPECIAL | 0x73, + + UNKNOWN = SPECIAL | 0x7FFFFF, /* PRINTABLE LATIN 1 CODES */ @@ -246,74 +243,8 @@ enum class Key { BAR = 0x007C, BRACERIGHT = 0x007D, ASCIITILDE = 0x007E, - NOBREAKSPACE = 0x00A0, - EXCLAMDOWN = 0x00A1, - CENT = 0x00A2, - STERLING = 0x00A3, - CURRENCY = 0x00A4, YEN = 0x00A5, - BROKENBAR = 0x00A6, SECTION = 0x00A7, - DIAERESIS = 0x00A8, - COPYRIGHT = 0x00A9, - ORDFEMININE = 0x00AA, - GUILLEMOTLEFT = 0x00AB, - NOTSIGN = 0x00AC, - HYPHEN = 0x00AD, - KEY_REGISTERED = 0x00AE, // "REGISTERED" is a reserved word on Windows. - MACRON = 0x00AF, - DEGREE = 0x00B0, - PLUSMINUS = 0x00B1, - TWOSUPERIOR = 0x00B2, - THREESUPERIOR = 0x00B3, - ACUTE = 0x00B4, - MU = 0x00B5, - PARAGRAPH = 0x00B6, - PERIODCENTERED = 0x00B7, - CEDILLA = 0x00B8, - ONESUPERIOR = 0x00B9, - MASCULINE = 0x00BA, - GUILLEMOTRIGHT = 0x00BB, - ONEQUARTER = 0x00BC, - ONEHALF = 0x00BD, - THREEQUARTERS = 0x00BE, - QUESTIONDOWN = 0x00BF, - AGRAVE = 0x00C0, - AACUTE = 0x00C1, - ACIRCUMFLEX = 0x00C2, - ATILDE = 0x00C3, - ADIAERESIS = 0x00C4, - ARING = 0x00C5, - AE = 0x00C6, - CCEDILLA = 0x00C7, - EGRAVE = 0x00C8, - EACUTE = 0x00C9, - ECIRCUMFLEX = 0x00CA, - EDIAERESIS = 0x00CB, - IGRAVE = 0x00CC, - IACUTE = 0x00CD, - ICIRCUMFLEX = 0x00CE, - IDIAERESIS = 0x00CF, - ETH = 0x00D0, - NTILDE = 0x00D1, - OGRAVE = 0x00D2, - OACUTE = 0x00D3, - OCIRCUMFLEX = 0x00D4, - OTILDE = 0x00D5, - ODIAERESIS = 0x00D6, - MULTIPLY = 0x00D7, - OOBLIQUE = 0x00D8, - UGRAVE = 0x00D9, - UACUTE = 0x00DA, - UCIRCUMFLEX = 0x00DB, - UDIAERESIS = 0x00DC, - YACUTE = 0x00DD, - THORN = 0x00DE, - SSHARP = 0x00DF, - - DIVISION = 0x00F7, - YDIAERESIS = 0x00FF, - END_LATIN1 = 0x0100, }; enum class KeyModifierMask { @@ -407,4 +338,8 @@ int keycode_get_count(); int keycode_get_value_by_index(int p_index); const char *keycode_get_name_by_index(int p_index); +char32_t fix_unicode(char32_t p_char); +Key fix_keycode(char32_t p_char, Key p_key); +Key fix_key_label(char32_t p_char, Key p_key); + #endif // KEYBOARD_H |