summaryrefslogtreecommitdiff
path: root/core/os
diff options
context:
space:
mode:
authorbruvzg <7645683+bruvzg@users.noreply.github.com>2022-12-11 01:21:22 +0200
committerbruvzg <7645683+bruvzg@users.noreply.github.com>2023-01-23 15:08:12 +0200
commitdaad4aed62bfa471421f960179f0ac0fd78e8040 (patch)
tree86b7f69d180f253c51c4b567139d68850f9e365d /core/os
parent9937915ad77059b63582ffd4e324afb26f467b76 (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.cpp119
-rw-r--r--core/os/keyboard.h87
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