Windows: Unstick shift keys in a timely manner when the OS loses a KEYUP event.
Fixes Bugzilla #1959.
This commit is contained in:
parent
9b622dc41e
commit
72d8cda7bb
1 changed files with 13 additions and 0 deletions
|
@ -766,11 +766,24 @@ WIN_WindowProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
|
|||
void
|
||||
WIN_PumpEvents(_THIS)
|
||||
{
|
||||
const Uint8 *keystate;
|
||||
MSG msg;
|
||||
while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) {
|
||||
TranslateMessage(&msg);
|
||||
DispatchMessage(&msg);
|
||||
}
|
||||
|
||||
/* Windows loses a shift KEYUP event when you have both pressed at once and let go of one.
|
||||
You won't get a KEYUP until both are released, and that keyup will only be for the second
|
||||
key you released. Take heroic measures and check the keystate as of the last handled event,
|
||||
and if we think a key is pressed when Windows doesn't, unstick it in SDL's state. */
|
||||
keystate = SDL_GetKeyboardState(NULL);
|
||||
if ((keystate[SDL_SCANCODE_LSHIFT] == SDL_PRESSED) && !(GetKeyState(VK_LSHIFT) & 0x8000)) {
|
||||
SDL_SendKeyboardKey(SDL_RELEASED, SDL_SCANCODE_LSHIFT);
|
||||
}
|
||||
if ((keystate[SDL_SCANCODE_RSHIFT] == SDL_PRESSED) && !(GetKeyState(VK_RSHIFT) & 0x8000)) {
|
||||
SDL_SendKeyboardKey(SDL_RELEASED, SDL_SCANCODE_RSHIFT);
|
||||
}
|
||||
}
|
||||
|
||||
static int app_registered = 0;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue