From 379c47cc758bd3b3a67d0359af7606a59c07c193 Mon Sep 17 00:00:00 2001 From: Sam Lantinga Date: Wed, 12 Nov 2025 11:50:29 -0800 Subject: [PATCH] Revert "Fix lost KEY_UP events with multiple keyboards using shared scancode state (#14446)" This reverts commit 3dab15d3b4908d316c9e2018b12877290f3bcc26. With this commit any repeated key will be reported as held down indefinitely. --- src/events/SDL_keyboard.c | 28 ++++------------------------ 1 file changed, 4 insertions(+), 24 deletions(-) diff --git a/src/events/SDL_keyboard.c b/src/events/SDL_keyboard.c index 9204fc4ae8..8f94256894 100644 --- a/src/events/SDL_keyboard.c +++ b/src/events/SDL_keyboard.c @@ -51,7 +51,6 @@ typedef struct SDL_Keyboard SDL_Keymod modstate; Uint8 keysource[SDL_SCANCODE_COUNT]; bool keystate[SDL_SCANCODE_COUNT]; - Uint8 keyrefcount[SDL_SCANCODE_COUNT]; // how many devices hold this key SDL_Keymap *keymap; Uint32 keycode_options; bool autorelease_pending; @@ -89,10 +88,6 @@ static void SDLCALL SDL_KeycodeOptionsChanged(void *userdata, const char *name, // Public functions bool SDL_InitKeyboard(void) { - // Init key reference counts to 0 - SDL_Keyboard *keyboard = &SDL_keyboard; - SDL_zeroa(keyboard->keyrefcount); - SDL_AddHintCallback(SDL_HINT_KEYCODE_OPTIONS, SDL_KeycodeOptionsChanged, &SDL_keyboard); @@ -230,7 +225,6 @@ void SDL_ResetKeyboard(void) if (keyboard->keystate[scancode]) { SDL_SendKeyboardKey(0, SDL_GLOBAL_KEYBOARD_ID, 0, (SDL_Scancode)scancode, false); } - keyboard->keyrefcount[scancode] = 0; // Reset reference count } } @@ -528,7 +522,6 @@ static bool SDL_SendKeyboardKeyInternal(Uint64 timestamp, Uint32 flags, SDL_Keyb SDL_Keycode keycode = SDLK_UNKNOWN; Uint32 type; bool repeat = false; - bool last_release = false; const Uint8 source = flags & KEYBOARD_SOURCE_MASK; #ifdef DEBUG_KEYBOARD @@ -545,9 +538,6 @@ static bool SDL_SendKeyboardKeyInternal(Uint64 timestamp, Uint32 flags, SDL_Keyb if (scancode > SDL_SCANCODE_UNKNOWN && scancode < SDL_SCANCODE_COUNT) { // Drop events that don't change state if (down) { - if (keyboard->keyrefcount[scancode] < 255) { - keyboard->keyrefcount[scancode]++; - } if (keyboard->keystate[scancode]) { if (!(keyboard->keysource[scancode] & source)) { keyboard->keysource[scancode] |= source; @@ -557,22 +547,14 @@ static bool SDL_SendKeyboardKeyInternal(Uint64 timestamp, Uint32 flags, SDL_Keyb } keyboard->keysource[scancode] |= source; } else { - if (keyboard->keyrefcount[scancode] == 0) { + if (!keyboard->keystate[scancode]) { return false; } - --keyboard->keyrefcount[scancode]; - if (keyboard->keyrefcount[scancode] == 0) { - keyboard->keysource[scancode] = 0; - last_release = true; - } + keyboard->keysource[scancode] = 0; } // Update internal keyboard state - if (down) { - keyboard->keystate[scancode] = true; - } else if (last_release) { - keyboard->keystate[scancode] = false; - } + keyboard->keystate[scancode] = down; keycode = SDL_GetKeyFromScancode(scancode, keyboard->modstate, true); @@ -639,9 +621,7 @@ static bool SDL_SendKeyboardKeyInternal(Uint64 timestamp, Uint32 flags, SDL_Keyb break; } } else { - if (last_release) { - keyboard->modstate &= ~modifier; - } + keyboard->modstate &= ~modifier; } }