Reset mouse state when changing video modes
authorSam Lantinga <slouken@libsdl.org>
Tue, 20 Aug 2002 06:01:20 +0000
changeset 460 a888b3ae31ff
parent 459 2a778055dbba
child 461 1d36f593078a
Reset mouse state when changing video modes
src/events/SDL_events_c.h
src/events/SDL_mouse.c
src/video/SDL_video.c
src/video/windx5/SDL_dx5events.c
--- 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 */;
 	}
 }