diff --git a/src/video/windows/SDL_windowsevents.c b/src/video/windows/SDL_windowsevents.c index 175e22111a..a5a17ff62e 100644 --- a/src/video/windows/SDL_windowsevents.c +++ b/src/video/windows/SDL_windowsevents.c @@ -352,7 +352,7 @@ static void WIN_UpdateMouseCapture(void) } } -static void WIN_UpdateFocus(SDL_Window *window, bool expect_focus) +static void WIN_UpdateFocus(SDL_Window *window, bool expect_focus, DWORD pos) { SDL_WindowData *data = window->internal; HWND hwnd = data->hwnd; @@ -389,7 +389,8 @@ static void WIN_UpdateFocus(SDL_Window *window, bool expect_focus) // In relative mode we are guaranteed to have mouse focus if we have keyboard focus if (!SDL_GetMouse()->relative_mode) { - GetCursorPos(&cursorPos); + cursorPos.x = (LONG)GET_X_LPARAM(pos); + cursorPos.y = (LONG)GET_Y_LPARAM(pos); ScreenToClient(hwnd, &cursorPos); SDL_SendMouseMotion(WIN_GetEventTimestamp(), window, SDL_GLOBAL_MOUSE_ID, false, (float)cursorPos.x, (float)cursorPos.y); } @@ -1244,13 +1245,13 @@ LRESULT CALLBACK WIN_WindowProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lPara /* Update the focus here, since it's possible to get WM_ACTIVATE and WM_SETFOCUS without actually being the foreground window, but this appears to get called in all cases where the global foreground window changes to and from this window. */ - WIN_UpdateFocus(data->window, !!wParam); + WIN_UpdateFocus(data->window, !!wParam, GetMessagePos()); } break; case WM_ACTIVATE: { // Update the focus in case we changed focus to a child window and then away from the application - WIN_UpdateFocus(data->window, !!LOWORD(wParam)); + WIN_UpdateFocus(data->window, !!LOWORD(wParam), GetMessagePos()); } break; case WM_MOUSEACTIVATE: @@ -1273,14 +1274,14 @@ LRESULT CALLBACK WIN_WindowProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lPara case WM_SETFOCUS: { // Update the focus in case it's changing between top-level windows in the same application - WIN_UpdateFocus(data->window, true); + WIN_UpdateFocus(data->window, true, GetMessagePos()); } break; case WM_KILLFOCUS: case WM_ENTERIDLE: { // Update the focus in case it's changing between top-level windows in the same application - WIN_UpdateFocus(data->window, false); + WIN_UpdateFocus(data->window, false, GetMessagePos()); } break; case WM_POINTERENTER: