From 925f293e80fee6b66ac69f6f7d95c6bb664d5f44 Mon Sep 17 00:00:00 2001 From: Sam Lantinga Date: Sun, 29 Jan 2006 07:57:13 +0000 Subject: [PATCH] Date: Sat, 15 Jan 2005 02:01:51 +0000 (UTC) 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. --- src/events/SDL_keyboard.c | 3 +++ src/video/wincommon/SDL_sysevents.c | 6 ++++++ src/video/windib/SDL_dibevents.c | 28 ++++++++++++++-------------- 3 files changed, 23 insertions(+), 14 deletions(-) diff --git a/src/events/SDL_keyboard.c b/src/events/SDL_keyboard.c index a847fbd26..419ab116d 100644 --- a/src/events/SDL_keyboard.c +++ b/src/events/SDL_keyboard.c @@ -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); } diff --git a/src/video/wincommon/SDL_sysevents.c b/src/video/wincommon/SDL_sysevents.c index a4a3f8cd0..87a6e3318 100644 --- a/src/video/wincommon/SDL_sysevents.c +++ b/src/video/wincommon/SDL_sysevents.c @@ -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; diff --git a/src/video/windib/SDL_dibevents.c b/src/video/windib/SDL_dibevents.c index 0db2564ae..c9b4c9bf7 100644 --- a/src/video/windib/SDL_dibevents.c +++ b/src/video/windib/SDL_dibevents.c @@ -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) @@ -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: @@ -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: @@ -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)