diff --git a/src/video/windows/SDL_windowsevents.c b/src/video/windows/SDL_windowsevents.c index 4f914aae6..0fbe012aa 100644 --- a/src/video/windows/SDL_windowsevents.c +++ b/src/video/windows/SDL_windowsevents.c @@ -783,8 +783,16 @@ WIN_WindowProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) } } } - SDL_SetMouseFocus(NULL); } + + /* When WM_MOUSELEAVE is fired we can be assured that the cursor has left the window. + Regardless of relative mode, it is important that mouse focus is reset as there is a potential + race condition when in the process of leaving/entering relative mode, resulting in focus never + being lost. This then causes a cascading failure where SDL_WINDOWEVENT_ENTER / SDL_WINDOWEVENT_LEAVE + can stop firing permanently, due to the focus being in the wrong state and TrackMouseEvent never + resubscribing. */ + SDL_SetMouseFocus(NULL); + returnCode = 0; break; #endif /* WM_MOUSELEAVE */