From e7ecfd84e61c38f978e45f5aa1f19b004057fdc2 Mon Sep 17 00:00:00 2001 From: Sam Lantinga Date: Mon, 20 Jan 2003 02:11:07 +0000 Subject: [PATCH] Mike Nordell _really_ fixed Win32 windib shift state handling this time. :) --- src/video/windib/SDL_dibevents.c | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/src/video/windib/SDL_dibevents.c b/src/video/windib/SDL_dibevents.c index 4b953dda9..7e83b6b0b 100644 --- a/src/video/windib/SDL_dibevents.c +++ b/src/video/windib/SDL_dibevents.c @@ -49,6 +49,7 @@ 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) @@ -82,10 +83,12 @@ LONG break; case VK_SHIFT: /* EXTENDED trick doesn't work here */ - if ( GetKeyState(VK_LSHIFT) & 0x8000 ) { + if (!prev_shiftstates[0] && (GetKeyState(VK_LSHIFT) & 0x8000)) { wParam = VK_LSHIFT; - } else if ( GetKeyState(VK_RSHIFT) & 0x8000 ) { + prev_shiftstates[0] = TRUE; + } else if (!prev_shiftstates[1] && (GetKeyState(VK_RSHIFT) & 0x8000)) { wParam = VK_RSHIFT; + prev_shiftstates[1] = TRUE; } else { /* Huh? */ } @@ -135,7 +138,15 @@ LONG break; case VK_SHIFT: /* EXTENDED trick doesn't work here */ - wParam = VK_LSHIFT; + if (prev_shiftstates[0] && !(GetKeyState(VK_LSHIFT) & 0x8000)) { + wParam = VK_LSHIFT; + prev_shiftstates[0] = FALSE; + } else if (prev_shiftstates[1] && !(GetKeyState(VK_RSHIFT) & 0x8000)) { + wParam = VK_RSHIFT; + prev_shiftstates[1] = FALSE; + } else { + /* Huh? */ + } break; case VK_MENU: if ( lParam&EXTENDED_KEYMASK ) @@ -311,6 +322,9 @@ 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)