Browse Source

Fix certain characters being recognized as special keys in Windows when using the us international layout

(cherry picked from commit e460456e60b5129f89b4647d8bbb9c71a294c1ca)
Eric Rybicki 5 years ago
parent
commit
c2eea4bde0

+ 13 - 0
platform/windows/key_mapping_windows.cpp

@@ -251,3 +251,16 @@ unsigned int KeyMappingWindows::get_keysym(unsigned int p_code) {
 
 
 	return KEY_UNKNOWN;
 	return KEY_UNKNOWN;
 }
 }
+
+bool KeyMappingWindows::is_extended_key(unsigned int p_code) {
+	return p_code == VK_INSERT ||
+		   p_code == VK_DELETE ||
+		   p_code == VK_HOME ||
+		   p_code == VK_END ||
+		   p_code == VK_PRIOR ||
+		   p_code == VK_NEXT ||
+		   p_code == VK_LEFT ||
+		   p_code == VK_UP ||
+		   p_code == VK_RIGHT ||
+		   p_code == VK_DOWN;
+}

+ 1 - 0
platform/windows/key_mapping_windows.h

@@ -43,6 +43,7 @@ class KeyMappingWindows {
 
 
 public:
 public:
 	static unsigned int get_keysym(unsigned int p_code);
 	static unsigned int get_keysym(unsigned int p_code);
+	static bool is_extended_key(unsigned int p_code);
 };
 };
 
 
 #endif // KEY_MAPPING_WINDOWS_H
 #endif // KEY_MAPPING_WINDOWS_H

+ 2 - 1
platform/windows/os_windows.cpp

@@ -1216,7 +1216,8 @@ void OS_Windows::process_key_events() {
 		switch (ke.uMsg) {
 		switch (ke.uMsg) {
 
 
 			case WM_CHAR: {
 			case WM_CHAR: {
-				if ((i == 0 && ke.uMsg == WM_CHAR) || (i > 0 && key_event_buffer[i - 1].uMsg == WM_CHAR)) {
+				// extended keys should only be processed as WM_KEYDOWN message.
+				if (!KeyMappingWindows::is_extended_key(ke.wParam) && ((i == 0 && ke.uMsg == WM_CHAR) || (i > 0 && key_event_buffer[i - 1].uMsg == WM_CHAR))) {
 					Ref<InputEventKey> k;
 					Ref<InputEventKey> k;
 					k.instance();
 					k.instance();