Skip to content

Commit

Permalink
Date: Sat, 15 Jan 2005 02:01:51 +0000 (UTC)
Browse files Browse the repository at this point in the history
From: jimrandomh
Subject: [SDL] Re: Modifier keys pressed during initialization stick

I wrote a simple test program which initializes SDL, prints the SDL
version number, then prints any keydown and keyup events with their
modifiers. (Source code below). Compilation was done using Visual
Studio 6, release mode.

My test sequence was:
Start a command prompt. Type the name of the test program.
shift down
enter down (program starts)
Wait for window to appear
enter up
shift up
spacebar down
spacebar up

Under Windows 98, the output was correct:
SDL 1.2.8
left shift down
shift-return down
shift-return up
left shift up
space down
space up

Under Windows 2000 and under Windows XP, the output was:
SDL 1.2.8
shift-space down
shift-space up

Since shift was not held at the time space was pressed, this is
incorrect. Similar results were observed with launching in different
ways (including double-clicking in Windows Explorer), so it does not
depend on the launching terminal.
  • Loading branch information
slouken committed Jan 29, 2006
1 parent 3fc3191 commit 925f293
Show file tree
Hide file tree
Showing 3 changed files with 23 additions and 14 deletions.
3 changes: 3 additions & 0 deletions src/events/SDL_keyboard.c
Expand Up @@ -506,6 +506,9 @@ printf("The '%s' key has been %s\n", SDL_GetKeyName(keysym->sym),

/* Drop events that don't change state */
if ( SDL_KeyState[keysym->sym] == state ) {
#if 0
printf("Event didn't change state - dropped!\n");
#endif
return(0);
}

Expand Down
6 changes: 6 additions & 0 deletions src/video/wincommon/SDL_sysevents.c
Expand Up @@ -214,21 +214,27 @@ static void WIN_GetKeyboardState(void)
if ( GetKeyboardState(keyboard) ) {
if ( keyboard[VK_LSHIFT] & 0x80) {
state |= KMOD_LSHIFT;
kstate[SDLK_LSHIFT] = SDL_PRESSED;
}
if ( keyboard[VK_RSHIFT] & 0x80) {
state |= KMOD_RSHIFT;
kstate[SDLK_RSHIFT] = SDL_PRESSED;
}
if ( keyboard[VK_LCONTROL] & 0x80) {
state |= KMOD_LCTRL;
kstate[SDLK_LCTRL] = SDL_PRESSED;
}
if ( keyboard[VK_RCONTROL] & 0x80) {
state |= KMOD_RCTRL;
kstate[SDLK_RCTRL] = SDL_PRESSED;
}
if ( keyboard[VK_LMENU] & 0x80) {
state |= KMOD_LALT;
kstate[SDLK_LALT] = SDL_PRESSED;
}
if ( keyboard[VK_RMENU] & 0x80) {
state |= KMOD_RALT;
kstate[SDLK_RALT] = SDL_PRESSED;
}
if ( keyboard[VK_NUMLOCK] & 0x01) {
state |= KMOD_NUM;
Expand Down
28 changes: 14 additions & 14 deletions src/video/windib/SDL_dibevents.c
Expand Up @@ -49,7 +49,6 @@ static char rcsid =
/* The translation table from a Microsoft VK keysym to a SDL keysym */
static SDLKey VK_keymap[SDLK_LAST];
static SDL_keysym *TranslateKey(UINT vkey, UINT scancode, SDL_keysym *keysym, int pressed);
static BOOL prev_shiftstates[2];

/* Masks for processing the windows KEYDOWN and KEYUP messages */
#define REPEATED_KEYMASK (1<<30)
Expand Down Expand Up @@ -117,14 +116,16 @@ LONG
break;
case VK_SHIFT:
/* EXTENDED trick doesn't work here */
if (!prev_shiftstates[0] && (GetKeyState(VK_LSHIFT) & 0x8000)) {
{
Uint8 *state = SDL_GetKeyState(NULL);
if (state[SDLK_LSHIFT] == SDL_RELEASED && (GetKeyState(VK_LSHIFT) & 0x8000)) {
wParam = VK_LSHIFT;
prev_shiftstates[0] = TRUE;
} else if (!prev_shiftstates[1] && (GetKeyState(VK_RSHIFT) & 0x8000)) {
} else if (state[SDLK_RSHIFT] == SDL_RELEASED && (GetKeyState(VK_RSHIFT) & 0x8000)) {
wParam = VK_RSHIFT;
prev_shiftstates[1] = TRUE;
} else {
/* Huh? */
/* Probably a key repeat */
return(0);
}
}
break;
case VK_MENU:
Expand Down Expand Up @@ -178,14 +179,16 @@ LONG
break;
case VK_SHIFT:
/* EXTENDED trick doesn't work here */
if (prev_shiftstates[0] && !(GetKeyState(VK_LSHIFT) & 0x8000)) {
{
Uint8 *state = SDL_GetKeyState(NULL);
if (state[SDLK_LSHIFT] == SDL_PRESSED && !(GetKeyState(VK_LSHIFT) & 0x8000)) {
wParam = VK_LSHIFT;
prev_shiftstates[0] = FALSE;
} else if (prev_shiftstates[1] && !(GetKeyState(VK_RSHIFT) & 0x8000)) {
} else if (state[SDLK_RSHIFT] == SDL_PRESSED && !(GetKeyState(VK_RSHIFT) & 0x8000)) {
wParam = VK_RSHIFT;
prev_shiftstates[1] = FALSE;
} else {
/* Huh? */
/* Probably a key repeat */
return(0);
}
}
break;
case VK_MENU:
Expand Down Expand Up @@ -372,9 +375,6 @@ void DIB_InitOSKeymap(_THIS)
VK_keymap[VK_SNAPSHOT] = SDLK_PRINT;
VK_keymap[VK_CANCEL] = SDLK_BREAK;
VK_keymap[VK_APPS] = SDLK_MENU;

prev_shiftstates[0] = FALSE;
prev_shiftstates[1] = FALSE;
}

static SDL_keysym *TranslateKey(UINT vkey, UINT scancode, SDL_keysym *keysym, int pressed)
Expand Down

0 comments on commit 925f293

Please sign in to comment.