Index: src/video/wincommon/SDL_sysevents.c =================================================================== --- src/video/wincommon/SDL_sysevents.c (revision 5366) +++ src/video/wincommon/SDL_sysevents.c (working copy) @@ -316,10 +316,10 @@ if ( active ) { /* Gain the following states */ appstate = SDL_APPACTIVE|SDL_APPINPUTFOCUS; - if ( this->input_grab != SDL_GRAB_OFF ) { - WIN_GrabInput(this, SDL_GRAB_ON); - } - if ( !(SDL_GetAppState()&SDL_APPINPUTFOCUS) ) { + if ( !(SDL_GetAppState() & SDL_APPINPUTFOCUS) ) { + if ( this->input_grab != SDL_GRAB_OFF ) { + WIN_GrabInput(this, SDL_GRAB_ON); + } if ( ! DDRAW_FULLSCREEN() ) { DIB_SwapGamma(this); } @@ -344,14 +344,16 @@ if ( minimized ) { appstate |= SDL_APPACTIVE; } - if ( this->input_grab != SDL_GRAB_OFF ) { - WIN_GrabInput(this, SDL_GRAB_OFF); - } + if ( SDL_GetAppState() & SDL_APPINPUTFOCUS ) { + if ( this->input_grab != SDL_GRAB_OFF ) { + WIN_GrabInput(this, SDL_GRAB_OFF); + } if ( ! DDRAW_FULLSCREEN() ) { DIB_SwapGamma(this); } if ( WINDIB_FULLSCREEN() ) { + appstate |= SDL_APPMOUSEFOCUS; SDL_RestoreDesktopMode(); #if defined(_WIN32_WCE) LoadAygshell(); @@ -372,8 +374,7 @@ case WM_MOUSEMOVE: { #ifdef WM_MOUSELEAVE - /* No need to handle SDL_APPMOUSEFOCUS when fullscreen */ - if ( SDL_VideoSurface && !FULLSCREEN() ) { + if ( SDL_VideoSurface ) { /* mouse has entered the window */ if ( !(SDL_GetAppState() & SDL_APPMOUSEFOCUS) ) { @@ -398,11 +399,8 @@ #ifdef WM_MOUSELEAVE case WM_MOUSELEAVE: { - /* No need to handle SDL_APPMOUSEFOCUS when fullscreen */ - if ( SDL_VideoSurface && !FULLSCREEN() ) { + if ( SDL_VideoSurface ) { /* mouse has left the window */ - /* or */ - /* Elvis has left the building! */ posted = SDL_PrivateAppActive(0, SDL_APPMOUSEFOCUS); } } Index: src/video/windx5/SDL_dx5events.c =================================================================== --- src/video/windx5/SDL_dx5events.c (revision 5366) +++ src/video/windx5/SDL_dx5events.c (working copy) @@ -149,8 +149,8 @@ #else &c_dfDIMouse, #endif - (DISCL_FOREGROUND|DISCL_NONEXCLUSIVE), - (DISCL_FOREGROUND|DISCL_NONEXCLUSIVE), handle_mouse }, + (DISCL_BACKGROUND|DISCL_NONEXCLUSIVE), + (DISCL_BACKGROUND|DISCL_NONEXCLUSIVE), handle_mouse }, { NULL, NULL, NULL, 0, 0, NULL } }; @@ -297,8 +297,7 @@ { extern int mouse_relative; - if ( (SDL_GetAppState() & (SDL_APPINPUTFOCUS|SDL_APPMOUSEFOCUS)) == - (SDL_APPINPUTFOCUS|SDL_APPMOUSEFOCUS) ) { + if ( SDL_GetAppState() & SDL_APPMOUSEFOCUS ) { posted = SDL_PrivateMouseMotion( 0, relative, x, y); @@ -355,10 +354,6 @@ ClientToScreen(SDL_Window, ¢er); SetCursorPos(center.x, center.y); } - } else { - /* No window or mouse focus, control is lost */ - mouse_lost = 1; - ClipCursor(NULL); } } @@ -375,6 +370,12 @@ return; } + /* If mouse focus has been lost, make sure we release the cursor. */ + if ( !(SDL_GetAppState() & SDL_APPMOUSEFOCUS) ) { + mouse_lost = 1; + ClipCursor(NULL); + } + /* If the mouse was lost, regain some sense of mouse state */ if ( mouse_lost && (SDL_GetAppState() & SDL_APPMOUSEFOCUS) ) { POINT mouse_pos; @@ -667,7 +668,7 @@ } /* Pump the DirectInput flow */ - if ( SDL_GetAppState() & SDL_APPINPUTFOCUS ) { + if ( SDL_GetAppState() & SDL_APPMOUSEFOCUS ) { for ( i=0; i