|
@@ -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;
|