pass ground-truth cursor pos to WIN_UpdateFocus

This commit is contained in:
expikr
2025-04-24 07:23:17 +08:00
committed by Sam Lantinga
parent 11a3296a42
commit c84c2aa2c4

View File

@@ -356,7 +356,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; SDL_WindowData *data = window->internal;
HWND hwnd = data->hwnd; HWND hwnd = data->hwnd;
@@ -393,7 +393,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 // In relative mode we are guaranteed to have mouse focus if we have keyboard focus
if (!SDL_GetMouse()->relative_mode) { if (!SDL_GetMouse()->relative_mode) {
GetCursorPos(&cursorPos); cursorPos.x = (LONG)GET_X_LPARAM(pos);
cursorPos.y = (LONG)GET_Y_LPARAM(pos);
ScreenToClient(hwnd, &cursorPos); ScreenToClient(hwnd, &cursorPos);
SDL_SendMouseMotion(WIN_GetEventTimestamp(), window, SDL_GLOBAL_MOUSE_ID, false, (float)cursorPos.x, (float)cursorPos.y); SDL_SendMouseMotion(WIN_GetEventTimestamp(), window, SDL_GLOBAL_MOUSE_ID, false, (float)cursorPos.x, (float)cursorPos.y);
} }
@@ -1248,13 +1249,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 /* 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 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. */ the global foreground window changes to and from this window. */
WIN_UpdateFocus(data->window, !!wParam); WIN_UpdateFocus(data->window, !!wParam, GetMessagePos());
} break; } break;
case WM_ACTIVATE: case WM_ACTIVATE:
{ {
// Update the focus in case we changed focus to a child window and then away from the application // 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; } break;
case WM_MOUSEACTIVATE: case WM_MOUSEACTIVATE:
@@ -1277,14 +1278,14 @@ LRESULT CALLBACK WIN_WindowProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lPara
case WM_SETFOCUS: case WM_SETFOCUS:
{ {
// Update the focus in case it's changing between top-level windows in the same application // 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; } break;
case WM_KILLFOCUS: case WM_KILLFOCUS:
case WM_ENTERIDLE: case WM_ENTERIDLE:
{ {
// Update the focus in case it's changing between top-level windows in the same application // 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; } break;
case WM_POINTERENTER: case WM_POINTERENTER: