Browse Source

Letting MS-Windows create both Alt and Ctrl events from AltGr, because filtering it out is only possible using unreliable hacks.

David Piuva 1 year ago
parent
commit
b00ea0cda0
1 changed files with 14 additions and 23 deletions
  1. 14 23
      Source/windowManagers/Win32Window.cpp

+ 14 - 23
Source/windowManagers/Win32Window.cpp

@@ -360,7 +360,7 @@ static dsr::DsrKey getDsrKey(WPARAM keyCode) {
 	} else if (keyCode == VK_F9) {
 	} else if (keyCode == VK_F9) {
 		result = dsr::DsrKey_F9;
 		result = dsr::DsrKey_F9;
 	} else if (keyCode == VK_F10) {
 	} else if (keyCode == VK_F10) {
-		result = dsr::DsrKey_F10; // Windows 11 may send a mouse event when pressing the F10 key.
+		result = dsr::DsrKey_F10;
 	} else if (keyCode == VK_F11) {
 	} else if (keyCode == VK_F11) {
 		result = dsr::DsrKey_F11;
 		result = dsr::DsrKey_F11;
 	} else if (keyCode == VK_F12) {
 	} else if (keyCode == VK_F12) {
@@ -380,7 +380,7 @@ static dsr::DsrKey getDsrKey(WPARAM keyCode) {
 	} else if (keyCode == VK_LCONTROL || keyCode == VK_CONTROL || keyCode == VK_RCONTROL) {
 	} else if (keyCode == VK_LCONTROL || keyCode == VK_CONTROL || keyCode == VK_RCONTROL) {
 		result = dsr::DsrKey_Control;
 		result = dsr::DsrKey_Control;
 	} else if (keyCode == VK_LMENU || keyCode == VK_MENU || keyCode == VK_RMENU) {
 	} else if (keyCode == VK_LMENU || keyCode == VK_MENU || keyCode == VK_RMENU) {
-		result = dsr::DsrKey_Alt; // Sometimes only AltGr is working on Windows 11, while the Alt key sends a mouse event instead.
+		result = dsr::DsrKey_Alt;
 	} else if (keyCode == VK_DELETE) {
 	} else if (keyCode == VK_DELETE) {
 		result = dsr::DsrKey_Delete;
 		result = dsr::DsrKey_Delete;
 	} else if (keyCode == VK_LEFT) {
 	} else if (keyCode == VK_LEFT) {
@@ -572,28 +572,19 @@ static LRESULT CALLBACK WindowProcedure(HWND hwnd, UINT message, WPARAM wParam,
 			dsr::DsrKey dsrKey = getDsrKey(wParam); // Portable key-code
 			dsr::DsrKey dsrKey = getDsrKey(wParam); // Portable key-code
 			
 			
 			bool previouslyPressed = lParam & (1 << 30);
 			bool previouslyPressed = lParam & (1 << 30);
-
-			// TODO: How can we filter out false Ctrl events from Alt-Gr so that Alt-Gr is the same as Alt for the physical key code?
-			//       The character code should already contain any modifications,
-			//         so we do not need it again for the physical key code when not writing text.
-			// Check if the key event is for a system key or regular key.
-			bool system_event = message == WM_SYSKEYDOWN || message == WM_SYSKEYUP;
-			// Check if the key code is Alt or F10.
-			bool system_key = wParam == VK_MENU || wParam == VK_F10;
-			// If key codes match the type of event, we use it.
-			if (system_event == system_key) {
-				if (message == WM_KEYDOWN || message == WM_SYSKEYDOWN) {
-					// If not repeated
-					if (!previouslyPressed) {
-						// Physical key down
-						parent->queueInputEvent(new dsr::KeyboardEvent(dsr::KeyboardEventType::KeyDown, character, dsrKey));
-					}
-					// Press typing with repeat
-					parent->queueInputEvent(new dsr::KeyboardEvent(dsr::KeyboardEventType::KeyType, character, dsrKey));
-				} else { // message == WM_KEYUP
-					// Physical key up
-					parent->queueInputEvent(new dsr::KeyboardEvent(dsr::KeyboardEventType::KeyUp, character, dsrKey));
+			// For now, just let Windows send both Alt and Ctrl events from AltGr.
+			//   Would however be better if it could be consistent with other platforms.
+			if (message == WM_KEYDOWN || message == WM_SYSKEYDOWN) {
+				// If not repeated
+				if (!previouslyPressed) {
+					// Physical key down
+					parent->queueInputEvent(new dsr::KeyboardEvent(dsr::KeyboardEventType::KeyDown, character, dsrKey));
 				}
 				}
+				// Press typing with repeat
+				parent->queueInputEvent(new dsr::KeyboardEvent(dsr::KeyboardEventType::KeyType, character, dsrKey));
+			} else { // message == WM_KEYUP || message == WM_SYSKEYUP
+				// Physical key up
+				parent->queueInputEvent(new dsr::KeyboardEvent(dsr::KeyboardEventType::KeyUp, character, dsrKey));
 			}
 			}
 		}
 		}
 		break;
 		break;