From cbee4abdfcdd97b3a1e392bc37a29f1260b51b89 Mon Sep 17 00:00:00 2001
From: Frank Praznik <[EMAIL REDACTED]>
Date: Mon, 23 Feb 2026 13:15:45 -0500
Subject: [PATCH] x11: Don't send duplicate key down events when reconciling
Modifier keys shouldn't be repeated.
(cherry picked from commit 550394eecdc250c7ce542a99f0c2b55683521656)
---
src/video/x11/SDL_x11events.c | 10 ++++++++--
1 file changed, 8 insertions(+), 2 deletions(-)
diff --git a/src/video/x11/SDL_x11events.c b/src/video/x11/SDL_x11events.c
index c07282906b930..c5bd675ebe69f 100644
--- a/src/video/x11/SDL_x11events.c
+++ b/src/video/x11/SDL_x11events.c
@@ -547,6 +547,9 @@ void X11_ReconcileKeyboardState(SDL_VideoDevice *_this)
X11_XQueryKeymap(display, keys);
+ int numkeys = 0;
+ const bool *keystate = SDL_GetKeyboardState(&numkeys);
+
for (Uint32 keycode = 0; keycode < SDL_arraysize(videodata->keyboard.key_layout); ++keycode) {
const SDL_Scancode scancode = videodata->keyboard.key_layout[keycode];
const bool x11KeyPressed = (keys[keycode / 8] & (1 << (keycode % 8))) != 0;
@@ -564,8 +567,11 @@ void X11_ReconcileKeyboardState(SDL_VideoDevice *_this)
case SDLK_RGUI:
case SDLK_MODE:
case SDLK_LEVEL5_SHIFT:
- X11_HandleModifierKeys(videodata, scancode, true);
- SDL_SendKeyboardKeyIgnoreModifiers(0, SDL_GLOBAL_KEYBOARD_ID, keycode, scancode, true);
+ // Don't send duplicate key events when reconciling.
+ if (keystate && scancode < numkeys && !keystate[scancode]) {
+ X11_HandleModifierKeys(videodata, scancode, true);
+ SDL_SendKeyboardKeyIgnoreModifiers(0, SDL_GLOBAL_KEYBOARD_ID, keycode, scancode, true);
+ }
break;
default:
break;