Mercurial > sdl-ios-xcode
changeset 460:a888b3ae31ff
Reset mouse state when changing video modes
author | Sam Lantinga <slouken@libsdl.org> |
---|---|
date | Tue, 20 Aug 2002 06:01:20 +0000 |
parents | 2a778055dbba |
children | 1d36f593078a |
files | src/events/SDL_events_c.h src/events/SDL_mouse.c src/video/SDL_video.c src/video/windx5/SDL_dx5events.c |
diffstat | 4 files changed, 49 insertions(+), 34 deletions(-) [+] |
line wrap: on
line diff
--- a/src/events/SDL_events_c.h Tue Aug 20 05:59:31 2002 +0000 +++ b/src/events/SDL_events_c.h Tue Aug 20 06:01:20 2002 +0000 @@ -63,7 +63,7 @@ extern int SDL_PrivateSysWMEvent(SDL_SysWMmsg *message); /* Used by the activity event handler to remove mouse focus */ -extern void SDL_MouseFocus(int focus); +extern void SDL_ResetMouse(void); /* Used by the activity event handler to remove keyboard focus */ extern void SDL_ResetKeyboard(void);
--- a/src/events/SDL_mouse.c Tue Aug 20 05:59:31 2002 +0000 +++ b/src/events/SDL_mouse.c Tue Aug 20 06:01:20 2002 +0000 @@ -59,6 +59,17 @@ return(0); } +/* We lost the mouse, so post button up messages for all pressed buttons */ +void SDL_ResetMouse(void) +{ + int i; + for ( i = 0; i < sizeof(SDL_ButtonState)*8; ++i ) { + if ( SDL_ButtonState & SDL_BUTTON(i) ) { + SDL_PrivateMouseButton(SDL_RELEASED, i, 0, 0); + } + } +} + Uint8 SDL_GetMouseState (int *x, int *y) { if ( x )
--- a/src/video/SDL_video.c Tue Aug 20 05:59:31 2002 +0000 +++ b/src/video/SDL_video.c Tue Aug 20 06:01:20 2002 +0000 @@ -607,6 +607,7 @@ /* Reset the keyboard here so event callbacks can run */ SDL_ResetKeyboard(); + SDL_ResetMouse(); /* Clean up any previous video mode */ if ( SDL_PublicSurface != NULL ) {
--- a/src/video/windx5/SDL_dx5events.c Tue Aug 20 05:59:31 2002 +0000 +++ b/src/video/windx5/SDL_dx5events.c Tue Aug 20 06:01:20 2002 +0000 @@ -221,33 +221,6 @@ return(0); } -/* Change cooperative level based on whether or not we are fullscreen */ -void DX5_DInputReset(_THIS, int fullscreen) -{ - DWORD level; - int i; - HRESULT result; - - for ( i=0; i<MAX_INPUTS; ++i ) { - if ( SDL_DIdev[i] != NULL ) { - if ( fullscreen ) { - level = inputs[i].raw_level; - } else { - level = inputs[i].win_level; - } - IDirectInputDevice2_Unacquire(SDL_DIdev[i]); - result = IDirectInputDevice2_SetCooperativeLevel( - SDL_DIdev[i], SDL_Window, level); - IDirectInputDevice2_Acquire(SDL_DIdev[i]); - if ( result != DI_OK ) { - SetDIerror( - "DirectInputDevice::SetCooperativeLevel", result); - } - } - } - mouse_lost = 1; -} - /* Clean up DirectInput */ static void DX5_DInputQuit(_THIS) { @@ -396,10 +369,10 @@ yrel = 0; } if((int)ptrbuf[i].dwData > 0) - button = 4; + button = SDL_BUTTON_WHEELUP; else - button = 5; - posted = SDL_PrivateMouseButton( + button = SDL_BUTTON_WHEELDOWN; + posted = SDL_PrivateMouseButton( SDL_PRESSED, button, 0, 0); posted |= SDL_PrivateMouseButton( SDL_RELEASED, button, 0, 0); @@ -543,7 +516,7 @@ 1 if there was input, 0 if there was no input, or -1 if the application has posted a quit message. */ -static int DX5_CheckInput(_THIS, int timeout) +static int DX5_CheckInput(_THIS, int timeout, BOOL processInput) { MSG msg; int i; @@ -602,7 +575,7 @@ evtbuf, &numevents, 0); } /* Handle the events */ - if ( result == DI_OK ) { + if ( result == DI_OK && processInput ) { /* Note: This can post multiple events to event queue */ (*SDL_DIfun[event])((int)numevents, evtbuf); @@ -623,10 +596,40 @@ return(0); } +/* Change cooperative level based on whether or not we are fullscreen */ +void DX5_DInputReset(_THIS, int fullscreen) +{ + DWORD level; + int i; + HRESULT result; + + for ( i=0; i<MAX_INPUTS; ++i ) { + if ( SDL_DIdev[i] != NULL ) { + if ( fullscreen ) { + level = inputs[i].raw_level; + } else { + level = inputs[i].win_level; + } + IDirectInputDevice2_Unacquire(SDL_DIdev[i]); + result = IDirectInputDevice2_SetCooperativeLevel( + SDL_DIdev[i], SDL_Window, level); + IDirectInputDevice2_Acquire(SDL_DIdev[i]); + if ( result != DI_OK ) { + SetDIerror( + "DirectInputDevice::SetCooperativeLevel", result); + } + } + } + mouse_lost = 1; + + /* Flush pending input */ + DX5_CheckInput(this, 0, FALSE); +} + void DX5_PumpEvents(_THIS) { /* Wait for messages and DirectInput */ - while ( DX5_CheckInput(this, 0) > 0 ) { + while ( DX5_CheckInput(this, 0, TRUE) > 0 ) { /* Loop and check again */; } }