diff --git a/src/video/x11/SDL_x11events.c b/src/video/x11/SDL_x11events.c index c07282906b..c5bd675ebe 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;