Commit 8b7ced17 authored by Sam Lantinga's avatar Sam Lantinga

Reset mouse state when changing video modes

--HG--
extra : convert_revision : svn%3Ac70aab31-4412-0410-b14c-859654838e24/trunk%40461
parent d79f2837
...@@ -63,7 +63,7 @@ extern int SDL_PrivateQuit(void); ...@@ -63,7 +63,7 @@ extern int SDL_PrivateQuit(void);
extern int SDL_PrivateSysWMEvent(SDL_SysWMmsg *message); extern int SDL_PrivateSysWMEvent(SDL_SysWMmsg *message);
/* Used by the activity event handler to remove mouse focus */ /* 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 */ /* Used by the activity event handler to remove keyboard focus */
extern void SDL_ResetKeyboard(void); extern void SDL_ResetKeyboard(void);
......
...@@ -59,6 +59,17 @@ int SDL_MouseInit(void) ...@@ -59,6 +59,17 @@ int SDL_MouseInit(void)
return(0); 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) Uint8 SDL_GetMouseState (int *x, int *y)
{ {
if ( x ) if ( x )
......
...@@ -607,6 +607,7 @@ SDL_Surface * SDL_SetVideoMode (int width, int height, int bpp, Uint32 flags) ...@@ -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 */ /* Reset the keyboard here so event callbacks can run */
SDL_ResetKeyboard(); SDL_ResetKeyboard();
SDL_ResetMouse();
/* Clean up any previous video mode */ /* Clean up any previous video mode */
if ( SDL_PublicSurface != NULL ) { if ( SDL_PublicSurface != NULL ) {
......
...@@ -221,33 +221,6 @@ static int DX5_DInputInit(_THIS) ...@@ -221,33 +221,6 @@ static int DX5_DInputInit(_THIS)
return(0); 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 */ /* Clean up DirectInput */
static void DX5_DInputQuit(_THIS) static void DX5_DInputQuit(_THIS)
{ {
...@@ -396,10 +369,10 @@ static void handle_mouse(const int numevents, DIDEVICEOBJECTDATA *ptrbuf) ...@@ -396,10 +369,10 @@ static void handle_mouse(const int numevents, DIDEVICEOBJECTDATA *ptrbuf)
yrel = 0; yrel = 0;
} }
if((int)ptrbuf[i].dwData > 0) if((int)ptrbuf[i].dwData > 0)
button = 4; button = SDL_BUTTON_WHEELUP;
else else
button = 5; button = SDL_BUTTON_WHEELDOWN;
posted = SDL_PrivateMouseButton( posted = SDL_PrivateMouseButton(
SDL_PRESSED, button, 0, 0); SDL_PRESSED, button, 0, 0);
posted |= SDL_PrivateMouseButton( posted |= SDL_PrivateMouseButton(
SDL_RELEASED, button, 0, 0); SDL_RELEASED, button, 0, 0);
...@@ -543,7 +516,7 @@ LONG ...@@ -543,7 +516,7 @@ LONG
1 if there was input, 0 if there was no input, or -1 if the application has 1 if there was input, 0 if there was no input, or -1 if the application has
posted a quit message. posted a quit message.
*/ */
static int DX5_CheckInput(_THIS, int timeout) static int DX5_CheckInput(_THIS, int timeout, BOOL processInput)
{ {
MSG msg; MSG msg;
int i; int i;
...@@ -602,7 +575,7 @@ static int DX5_CheckInput(_THIS, int timeout) ...@@ -602,7 +575,7 @@ static int DX5_CheckInput(_THIS, int timeout)
evtbuf, &numevents, 0); evtbuf, &numevents, 0);
} }
/* Handle the events */ /* Handle the events */
if ( result == DI_OK ) { if ( result == DI_OK && processInput ) {
/* Note: This can post multiple events to event queue /* Note: This can post multiple events to event queue
*/ */
(*SDL_DIfun[event])((int)numevents, evtbuf); (*SDL_DIfun[event])((int)numevents, evtbuf);
...@@ -623,10 +596,40 @@ static int DX5_CheckInput(_THIS, int timeout) ...@@ -623,10 +596,40 @@ static int DX5_CheckInput(_THIS, int timeout)
return(0); 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) void DX5_PumpEvents(_THIS)
{ {
/* Wait for messages and DirectInput */ /* Wait for messages and DirectInput */
while ( DX5_CheckInput(this, 0) > 0 ) { while ( DX5_CheckInput(this, 0, TRUE) > 0 ) {
/* Loop and check again */; /* Loop and check again */;
} }
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment