@@ -2010,6 +2010,38 @@ Key DisplayServerWindows::keyboard_get_keycode_from_physical(Key p_keycode) cons
20102010 return (Key)(KeyMappingWindows::get_keysym (vk) | modifiers);
20112011}
20122012
2013+ Key DisplayServerWindows::keyboard_get_label_from_physical (Key p_keycode) const {
2014+ Key modifiers = p_keycode & KeyModifierMask::MODIFIER_MASK ;
2015+ Key keycode_no_mod = (Key)(p_keycode & KeyModifierMask::CODE_MASK );
2016+
2017+ if (keycode_no_mod == Key::PRINT ||
2018+ keycode_no_mod == Key::KP_ADD ||
2019+ keycode_no_mod == Key::KP_5 ||
2020+ (keycode_no_mod >= Key::KEY_0 && keycode_no_mod <= Key::KEY_9 )) {
2021+ return p_keycode;
2022+ }
2023+
2024+ unsigned int scancode = KeyMappingWindows::get_scancode (keycode_no_mod);
2025+ if (scancode == 0 ) {
2026+ return p_keycode;
2027+ }
2028+
2029+ Key keycode = KeyMappingWindows::get_keysym (MapVirtualKey (scancode, MAPVK_VSC_TO_VK ));
2030+
2031+ HKL current_layout = GetKeyboardLayout (0 );
2032+ static BYTE keyboard_state[256 ];
2033+ memset (keyboard_state, 0 , 256 );
2034+ wchar_t chars[256 ] = {};
2035+ UINT extended_code = MapVirtualKey (scancode, MAPVK_VSC_TO_VK_EX );
2036+ if (ToUnicodeEx (extended_code, scancode, keyboard_state, chars, 255 , 4 , current_layout) > 0 ) {
2037+ String keysym = String::utf16 ((char16_t *)chars, 255 );
2038+ if (!keysym.is_empty ()) {
2039+ return fix_key_label (keysym[0 ], keycode) | modifiers;
2040+ }
2041+ }
2042+ return p_keycode;
2043+ }
2044+
20132045String _get_full_layout_name_from_registry (HKL p_layout) {
20142046 String id = " SYSTEM\\ CurrentControlSet\\ Control\\ Keyboard Layouts\\ " + String::num_int64 ((int64_t )p_layout, 16 , false ).lpad (8 , " 0" );
20152047 String ret;
0 commit comments