Distinguish between Enter and Numpad Enter

Fixes #2015
This commit is contained in:
Cameron Gutman
2026-09-26 15:21:11 -05:00
parent b75fe0d932
commit c0f62ad64e
3 changed files with 53 additions and 11 deletions
+1 -1
View File
@@ -218,7 +218,7 @@ private:
int m_GamepadMask; int m_GamepadMask;
GamepadState m_GamepadState[MAX_GAMEPADS]; GamepadState m_GamepadState[MAX_GAMEPADS];
QSet<short> m_KeysDown; QSet<uint32_t> m_KeysDown;
bool m_FakeMouseCaptureActive; bool m_FakeMouseCaptureActive;
bool m_KeyboardCaptureActive; bool m_KeyboardCaptureActive;
QString m_OldIgnoreDevices; QString m_OldIgnoreDevices;
+48 -6
View File
@@ -13,6 +13,15 @@
#define VK_NUMPAD0 0x60 #define VK_NUMPAD0 0x60
#endif #endif
#define MAKE_KEYPRESS_STATE(code, modifiers, flags) \
((uint32_t)(uint16_t)(code) | \
((uint32_t)(uint8_t)((modifiers) & MODIFIER_EXTENDED) << 16) | \
((uint32_t)(uint8_t)(flags) << 24))
#define GET_KEYPRESS_CODE(x) ((short)((x) & 0xFFFF))
#define GET_KEYPRESS_EXTENDED_MODIFIER(x) ((char)(((x) >> 16) & 0xFF))
#define GET_KEYPRESS_FLAGS(x) ((char)(((x) >> 24) & 0xFF))
void SdlInputHandler::performSpecialKeyCombo(KeyCombo combo) void SdlInputHandler::performSpecialKeyCombo(KeyCombo combo)
{ {
switch (combo) { switch (combo) {
@@ -177,6 +186,7 @@ void SdlInputHandler::handleKeyEvent(SDL_KeyboardEvent* event)
{ {
short keyCode; short keyCode;
char modifiers; char modifiers;
char flags;
bool shouldNotConvertToScanCodeOnServer = false; bool shouldNotConvertToScanCodeOnServer = false;
if (event->repeat) { if (event->repeat) {
@@ -264,7 +274,9 @@ void SdlInputHandler::handleKeyEvent(SDL_KeyboardEvent* event)
case SDL_SCANCODE_CLEAR: case SDL_SCANCODE_CLEAR:
keyCode = 0x0C; keyCode = 0x0C;
break; break;
case SDL_SCANCODE_KP_ENTER: // FIXME: Is this correct? case SDL_SCANCODE_KP_ENTER:
modifiers |= MODIFIER_EXTENDED;
Q_FALLTHROUGH();
case SDL_SCANCODE_RETURN: case SDL_SCANCODE_RETURN:
keyCode = 0x0D; keyCode = 0x0D;
break; break;
@@ -282,27 +294,35 @@ void SdlInputHandler::handleKeyEvent(SDL_KeyboardEvent* event)
break; break;
case SDL_SCANCODE_PAGEUP: case SDL_SCANCODE_PAGEUP:
keyCode = 0x21; keyCode = 0x21;
modifiers |= MODIFIER_EXTENDED;
break; break;
case SDL_SCANCODE_PAGEDOWN: case SDL_SCANCODE_PAGEDOWN:
keyCode = 0x22; keyCode = 0x22;
modifiers |= MODIFIER_EXTENDED;
break; break;
case SDL_SCANCODE_END: case SDL_SCANCODE_END:
keyCode = 0x23; keyCode = 0x23;
modifiers |= MODIFIER_EXTENDED;
break; break;
case SDL_SCANCODE_HOME: case SDL_SCANCODE_HOME:
keyCode = 0x24; keyCode = 0x24;
modifiers |= MODIFIER_EXTENDED;
break; break;
case SDL_SCANCODE_LEFT: case SDL_SCANCODE_LEFT:
keyCode = 0x25; keyCode = 0x25;
modifiers |= MODIFIER_EXTENDED;
break; break;
case SDL_SCANCODE_UP: case SDL_SCANCODE_UP:
keyCode = 0x26; keyCode = 0x26;
modifiers |= MODIFIER_EXTENDED;
break; break;
case SDL_SCANCODE_RIGHT: case SDL_SCANCODE_RIGHT:
keyCode = 0x27; keyCode = 0x27;
modifiers |= MODIFIER_EXTENDED;
break; break;
case SDL_SCANCODE_DOWN: case SDL_SCANCODE_DOWN:
keyCode = 0x28; keyCode = 0x28;
modifiers |= MODIFIER_EXTENDED;
break; break;
case SDL_SCANCODE_SELECT: case SDL_SCANCODE_SELECT:
keyCode = 0x29; keyCode = 0x29;
@@ -312,12 +332,15 @@ void SdlInputHandler::handleKeyEvent(SDL_KeyboardEvent* event)
break; break;
case SDL_SCANCODE_PRINTSCREEN: case SDL_SCANCODE_PRINTSCREEN:
keyCode = 0x2C; keyCode = 0x2C;
modifiers |= MODIFIER_EXTENDED;
break; break;
case SDL_SCANCODE_INSERT: case SDL_SCANCODE_INSERT:
keyCode = 0x2D; keyCode = 0x2D;
modifiers |= MODIFIER_EXTENDED;
break; break;
case SDL_SCANCODE_DELETE: case SDL_SCANCODE_DELETE:
keyCode = 0x2E; keyCode = 0x2E;
modifiers |= MODIFIER_EXTENDED;
break; break;
case SDL_SCANCODE_HELP: case SDL_SCANCODE_HELP:
keyCode = 0x2F; keyCode = 0x2F;
@@ -347,6 +370,7 @@ void SdlInputHandler::handleKeyEvent(SDL_KeyboardEvent* event)
break; break;
case SDL_SCANCODE_KP_DIVIDE: case SDL_SCANCODE_KP_DIVIDE:
keyCode = 0x6F; keyCode = 0x6F;
modifiers |= MODIFIER_EXTENDED;
break; break;
case SDL_SCANCODE_NUMLOCKCLEAR: case SDL_SCANCODE_NUMLOCKCLEAR:
keyCode = 0x90; keyCode = 0x90;
@@ -365,48 +389,60 @@ void SdlInputHandler::handleKeyEvent(SDL_KeyboardEvent* event)
break; break;
case SDL_SCANCODE_RCTRL: case SDL_SCANCODE_RCTRL:
keyCode = 0xA3; keyCode = 0xA3;
modifiers |= MODIFIER_EXTENDED;
break; break;
case SDL_SCANCODE_LALT: case SDL_SCANCODE_LALT:
keyCode = 0xA4; keyCode = 0xA4;
break; break;
case SDL_SCANCODE_RALT: case SDL_SCANCODE_RALT:
keyCode = 0xA5; keyCode = 0xA5;
modifiers |= MODIFIER_EXTENDED;
break; break;
case SDL_SCANCODE_LGUI: case SDL_SCANCODE_LGUI:
if (!isSystemKeyCaptureActive()) { if (!isSystemKeyCaptureActive()) {
return; return;
} }
keyCode = 0x5B; keyCode = 0x5B;
modifiers |= MODIFIER_EXTENDED;
break; break;
case SDL_SCANCODE_RGUI: case SDL_SCANCODE_RGUI:
if (!isSystemKeyCaptureActive()) { if (!isSystemKeyCaptureActive()) {
return; return;
} }
keyCode = 0x5C; keyCode = 0x5C;
modifiers |= MODIFIER_EXTENDED;
break; break;
case SDL_SCANCODE_APPLICATION: case SDL_SCANCODE_APPLICATION:
keyCode = 0x5D; keyCode = 0x5D;
modifiers |= MODIFIER_EXTENDED;
break; break;
case SDL_SCANCODE_AC_BACK: case SDL_SCANCODE_AC_BACK:
keyCode = 0xA6; keyCode = 0xA6;
modifiers |= MODIFIER_EXTENDED;
break; break;
case SDL_SCANCODE_AC_FORWARD: case SDL_SCANCODE_AC_FORWARD:
keyCode = 0xA7; keyCode = 0xA7;
modifiers |= MODIFIER_EXTENDED;
break; break;
case SDL_SCANCODE_AC_REFRESH: case SDL_SCANCODE_AC_REFRESH:
keyCode = 0xA8; keyCode = 0xA8;
modifiers |= MODIFIER_EXTENDED;
break; break;
case SDL_SCANCODE_AC_STOP: case SDL_SCANCODE_AC_STOP:
keyCode = 0xA9; keyCode = 0xA9;
modifiers |= MODIFIER_EXTENDED;
break; break;
case SDL_SCANCODE_AC_SEARCH: case SDL_SCANCODE_AC_SEARCH:
keyCode = 0xAA; keyCode = 0xAA;
modifiers |= MODIFIER_EXTENDED;
break; break;
case SDL_SCANCODE_AC_BOOKMARKS: case SDL_SCANCODE_AC_BOOKMARKS:
keyCode = 0xAB; keyCode = 0xAB;
modifiers |= MODIFIER_EXTENDED;
break; break;
case SDL_SCANCODE_AC_HOME: case SDL_SCANCODE_AC_HOME:
keyCode = 0xAC; keyCode = 0xAC;
modifiers |= MODIFIER_EXTENDED;
break; break;
case SDL_SCANCODE_SEMICOLON: case SDL_SCANCODE_SEMICOLON:
keyCode = 0xBA; keyCode = 0xBA;
@@ -464,19 +500,22 @@ void SdlInputHandler::handleKeyEvent(SDL_KeyboardEvent* event)
} }
} }
keyCode |= 0x8000;
flags = shouldNotConvertToScanCodeOnServer ? SS_KBE_FLAG_NON_NORMALIZED : 0;
// Track the key state so we always know which keys are down // Track the key state so we always know which keys are down
if (event->state == SDL_PRESSED) { if (event->state == SDL_PRESSED) {
m_KeysDown.insert(keyCode); m_KeysDown.insert(MAKE_KEYPRESS_STATE(keyCode, modifiers, flags));
} }
else { else {
m_KeysDown.remove(keyCode); m_KeysDown.remove(MAKE_KEYPRESS_STATE(keyCode, modifiers, flags));
} }
LiSendKeyboardEvent2(0x8000 | keyCode, LiSendKeyboardEvent2(keyCode,
event->state == SDL_PRESSED ? event->state == SDL_PRESSED ?
KEY_ACTION_DOWN : KEY_ACTION_UP, KEY_ACTION_DOWN : KEY_ACTION_UP,
modifiers, modifiers,
shouldNotConvertToScanCodeOnServer ? SS_KBE_FLAG_NON_NORMALIZED : 0); flags);
} }
void SdlInputHandler::raiseAllKeys() void SdlInputHandler::raiseAllKeys()
@@ -490,7 +529,10 @@ void SdlInputHandler::raiseAllKeys()
(int)m_KeysDown.count()); (int)m_KeysDown.count());
for (auto keyDown : std::as_const(m_KeysDown)) { for (auto keyDown : std::as_const(m_KeysDown)) {
LiSendKeyboardEvent(keyDown, KEY_ACTION_UP, 0); LiSendKeyboardEvent2(GET_KEYPRESS_CODE(keyDown),
KEY_ACTION_UP,
GET_KEYPRESS_EXTENDED_MODIFIER(keyDown),
GET_KEYPRESS_FLAGS(keyDown));
} }
m_KeysDown.clear(); m_KeysDown.clear();