From 379c47cc758bd3b3a67d0359af7606a59c07c193 Mon Sep 17 00:00:00 2001
From: Sam Lantinga <[EMAIL REDACTED]>
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 9204fc4ae8125..8f94256894cad 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;
}
}