From 484b4cc77037530daff5eaea3994fc1ef32ef241 Mon Sep 17 00:00:00 2001 From: Sam Lantinga Date: Tue, 20 Aug 2002 06:01:20 +0000 Subject: [PATCH] Reset mouse state when changing video modes --- src/events/SDL_events_c.h | 2 +- src/events/SDL_mouse.c | 11 +++++ src/video/SDL_video.c | 1 + src/video/windx5/SDL_dx5events.c | 69 +++++++++++++++++--------------- 4 files changed, 49 insertions(+), 34 deletions(-) diff --git a/src/events/SDL_events_c.h b/src/events/SDL_events_c.h index 8cb67b68a..9a8a427ee 100644 --- a/src/events/SDL_events_c.h +++ b/src/events/SDL_events_c.h @@ -63,7 +63,7 @@ extern int SDL_PrivateQuit(void); 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); diff --git a/src/events/SDL_mouse.c b/src/events/SDL_mouse.c index 6e2dbd5cc..0955f4568 100644 --- a/src/events/SDL_mouse.c +++ b/src/events/SDL_mouse.c @@ -59,6 +59,17 @@ int SDL_MouseInit(void) 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 ) diff --git a/src/video/SDL_video.c b/src/video/SDL_video.c index 32e9e0e44..4256729be 100644 --- a/src/video/SDL_video.c +++ b/src/video/SDL_video.c @@ -607,6 +607,7 @@ SDL_Surface * SDL_SetVideoMode (int width, int height, int bpp, Uint32 flags) /* Reset the keyboard here so event callbacks can run */ SDL_ResetKeyboard(); + SDL_ResetMouse(); /* Clean up any previous video mode */ if ( SDL_PublicSurface != NULL ) { diff --git a/src/video/windx5/SDL_dx5events.c b/src/video/windx5/SDL_dx5events.c index 59f8d9fec..6d8d631a2 100644 --- a/src/video/windx5/SDL_dx5events.c +++ b/src/video/windx5/SDL_dx5events.c @@ -221,33 +221,6 @@ static int DX5_DInputInit(_THIS) 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 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 @@ LONG 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 @@ static int DX5_CheckInput(_THIS, int timeout) 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 @@ static int DX5_CheckInput(_THIS, int timeout) 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 0 ) { + while ( DX5_CheckInput(this, 0, TRUE) > 0 ) { /* Loop and check again */; } }