summaryrefslogtreecommitdiffstats
path: root/core/os/keyboard.cpp
diff options
context:
space:
mode:
authorMarcel Admiraal <madmiraal@users.noreply.github.com>2021-04-18 11:38:50 +0100
committerMarcel Admiraal <madmiraal@users.noreply.github.com>2023-02-07 08:25:02 +1300
commit84199757a410ee68be0705e357b2a1f54b2842f7 (patch)
treee6097212f6ba24c30b6ffaee620ff1d9399e0a63 /core/os/keyboard.cpp
parent13f0158e49676fc5ec8694a40261685596faa3d1 (diff)
downloadredot-engine-84199757a410ee68be0705e357b2a1f54b2842f7.tar.gz
Fix OS.find_keycode_from_string not working with modifiers
Diffstat (limited to 'core/os/keyboard.cpp')
-rw-r--r--core/os/keyboard.cpp29
1 files changed, 25 insertions, 4 deletions
diff --git a/core/os/keyboard.cpp b/core/os/keyboard.cpp
index 25a4b320cd..2f20c5eae9 100644
--- a/core/os/keyboard.cpp
+++ b/core/os/keyboard.cpp
@@ -400,17 +400,38 @@ String keycode_get_string(Key p_code) {
return codestr;
}
-Key find_keycode(const String &p_code) {
+Key find_keycode(const String &p_codestr) {
+ Key keycode = Key::NONE;
+ Vector<String> code_parts = p_codestr.split("+");
+ if (code_parts.size() < 1) {
+ return keycode;
+ }
+
+ String last_part = code_parts[code_parts.size() - 1];
const _KeyCodeText *kct = &_keycodes[0];
while (kct->text) {
- if (p_code.nocasecmp_to(kct->text) == 0) {
- return kct->code;
+ if (last_part.nocasecmp_to(kct->text) == 0) {
+ keycode = kct->code;
+ break;
}
kct++;
}
- return Key::NONE;
+ for (int part = 0; part < code_parts.size() - 1; part++) {
+ String code_part = code_parts[part];
+ if (code_part.nocasecmp_to(find_keycode_name(Key::SHIFT)) == 0) {
+ keycode |= KeyModifierMask::SHIFT;
+ } else if (code_part.nocasecmp_to(find_keycode_name(Key::CTRL)) == 0) {
+ keycode |= KeyModifierMask::CTRL;
+ } else if (code_part.nocasecmp_to(find_keycode_name(Key::META)) == 0) {
+ keycode |= KeyModifierMask::META;
+ } else if (code_part.nocasecmp_to(find_keycode_name(Key::ALT)) == 0) {
+ keycode |= KeyModifierMask::ALT;
+ }
+ }
+
+ return keycode;
}
const char *find_keycode_name(Key p_keycode) {