Skip to content

Commit

Permalink
x11: Don't send duplicate events when reconciling the keyboard state
Browse files Browse the repository at this point in the history
Failing to check if a key was known to be pressed by SDL was causing
SDL_SendKeyboardKey to send duplicate key pressed events with the repeat
property set to true.

Fixes Bugzilla #3637.
  • Loading branch information
bgK committed Apr 22, 2017
1 parent 5dc3501 commit 545fba7
Showing 1 changed file with 10 additions and 4 deletions.
14 changes: 10 additions & 4 deletions src/video/x11/SDL_x11events.c
Expand Up @@ -348,6 +348,7 @@ X11_ReconcileKeyboardState(_THIS)
Window junk_window;
int x, y;
unsigned int mask;
const Uint8 *keyboardState;

X11_XQueryKeymap(display, keys);

Expand All @@ -357,11 +358,16 @@ X11_ReconcileKeyboardState(_THIS)
SDL_ToggleModState(KMOD_NUM, (mask & X11_GetNumLockModifierMask(_this)) != 0);
}

keyboardState = SDL_GetKeyboardState(0);
for (keycode = 0; keycode < 256; ++keycode) {
if (keys[keycode / 8] & (1 << (keycode % 8))) {
SDL_SendKeyboardKey(SDL_PRESSED, viddata->key_layout[keycode]);
} else {
SDL_SendKeyboardKey(SDL_RELEASED, viddata->key_layout[keycode]);
SDL_Scancode scancode = viddata->key_layout[keycode];
SDL_bool x11KeyPressed = (keys[keycode / 8] & (1 << (keycode % 8))) != 0;
SDL_bool sdlKeyPressed = keyboardState[scancode] == SDL_PRESSED;

if (x11KeyPressed && !sdlKeyPressed) {
SDL_SendKeyboardKey(SDL_PRESSED, scancode);
} else if (!x11KeyPressed && sdlKeyPressed) {
SDL_SendKeyboardKey(SDL_RELEASED, scancode);
}
}
}
Expand Down

0 comments on commit 545fba7

Please sign in to comment.