From 84199757a410ee68be0705e357b2a1f54b2842f7 Mon Sep 17 00:00:00 2001 From: Marcel Admiraal Date: Sun, 18 Apr 2021 11:38:50 +0100 Subject: [PATCH] Fix OS.find_keycode_from_string not working with modifiers --- core/os/keyboard.cpp | 29 +++++++++++++++++++++++++---- core/os/keyboard.h | 2 +- 2 files changed, 26 insertions(+), 5 deletions(-) diff --git a/core/os/keyboard.cpp b/core/os/keyboard.cpp index 25a4b320cd3..2f20c5eae94 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 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) { diff --git a/core/os/keyboard.h b/core/os/keyboard.h index 84017e89a6a..cf276dc49f2 100644 --- a/core/os/keyboard.h +++ b/core/os/keyboard.h @@ -330,7 +330,7 @@ constexpr KeyModifierMask operator|(KeyModifierMask a, KeyModifierMask b) { String keycode_get_string(Key p_code); bool keycode_has_unicode(Key p_keycode); -Key find_keycode(const String &p_code); +Key find_keycode(const String &p_codestr); const char *find_keycode_name(Key p_keycode); int keycode_get_count(); int keycode_get_value_by_index(int p_index);