diff options
author | Yuri Sizov <yuris@humnom.net> | 2023-07-12 21:02:37 +0200 |
---|---|---|
committer | Yuri Sizov <yuris@humnom.net> | 2023-07-12 21:02:37 +0200 |
commit | ff689003a576f0fdf854a7756fb4ceb64f39ae7b (patch) | |
tree | ace0a9b487c2d98318d824f09515f5ec5ed8750d /platform/linuxbsd/x11/display_server_x11.cpp | |
parent | a927b22f65a53277db25367cf967620b0e9ffa94 (diff) | |
parent | 08e8ff371dccf1e678dd26310d5e2eb62c8c7e27 (diff) | |
download | redot-engine-ff689003a576f0fdf854a7756fb4ceb64f39ae7b.tar.gz |
Merge pull request #77993 from bruvzg/key_lbl_from_p
Implement DisplayServer.keyboard_get_label_from_physical method.
Diffstat (limited to 'platform/linuxbsd/x11/display_server_x11.cpp')
-rw-r--r-- | platform/linuxbsd/x11/display_server_x11.cpp | 24 |
1 files changed, 24 insertions, 0 deletions
diff --git a/platform/linuxbsd/x11/display_server_x11.cpp b/platform/linuxbsd/x11/display_server_x11.cpp index bdb160e6a6..a7f9475342 100644 --- a/platform/linuxbsd/x11/display_server_x11.cpp +++ b/platform/linuxbsd/x11/display_server_x11.cpp @@ -2980,6 +2980,30 @@ Key DisplayServerX11::keyboard_get_keycode_from_physical(Key p_keycode) const { return (Key)(key | modifiers); } +Key DisplayServerX11::keyboard_get_label_from_physical(Key p_keycode) const { + Key modifiers = p_keycode & KeyModifierMask::MODIFIER_MASK; + Key keycode_no_mod = p_keycode & KeyModifierMask::CODE_MASK; + unsigned int xkeycode = KeyMappingX11::get_xlibcode(keycode_no_mod); + KeySym xkeysym = XkbKeycodeToKeysym(x11_display, xkeycode, keyboard_get_current_layout(), 0); + if (is_ascii_lower_case(xkeysym)) { + xkeysym -= ('a' - 'A'); + } + + Key key = KeyMappingX11::get_keycode(xkeysym); +#ifdef XKB_ENABLED + if (xkb_loaded_v08p) { + String keysym = String::chr(xkb_keysym_to_utf32(xkb_keysym_to_upper(xkeysym))); + key = fix_key_label(keysym[0], KeyMappingX11::get_keycode(xkeysym)); + } +#endif + + // If not found, fallback to QWERTY. + // This should match the behavior of the event pump + if (key == Key::NONE) { + return p_keycode; + } + return (Key)(key | modifiers); +} DisplayServerX11::Property DisplayServerX11::_read_property(Display *p_display, Window p_window, Atom p_property) { Atom actual_type = None; int actual_format = 0; |