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);
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);
......
......@@ -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 )
......
......@@ -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 ) {
......
......@@ -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<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 @@ static void handle_mouse(const int numevents, DIDEVICEOBJECTDATA *ptrbuf)
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 @@ 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<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 */;
}
}
......
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