From 2670eb44afec9311ee8fbec447703c427db1e1c8 Mon Sep 17 00:00:00 2001 From: Sam Lantinga Date: Thu, 25 Jan 2024 06:30:07 -0800 Subject: [PATCH] Improved timing accuracy of SDL_WaitEventTimeout() on Windows We don't need to use the hack of setting a timer and waiting for a timer message, MsgWaitForMultipleObjects() will allow us to wait for input directly with a timeout. Before this change, sleeping for 20 ms would actually sleep for around 30 ms, with this change the sleep time is pretty accurate at 20-21 ms. --- src/video/windows/SDL_windowsevents.c | 25 +------------------------ 1 file changed, 1 insertion(+), 24 deletions(-) diff --git a/src/video/windows/SDL_windowsevents.c b/src/video/windows/SDL_windowsevents.c index d54b5ea41..2ac4e78ae 100644 --- a/src/video/windows/SDL_windowsevents.c +++ b/src/video/windows/SDL_windowsevents.c @@ -1686,31 +1686,8 @@ void SDL_SetWindowsMessageHook(SDL_WindowsMessageHook callback, void *userdata) int WIN_WaitEventTimeout(SDL_VideoDevice *_this, Sint64 timeoutNS) { - MSG msg; if (g_WindowsEnableMessageLoop) { - BOOL message_result; - UINT_PTR timer_id = 0; - if (timeoutNS > 0) { - timer_id = SetTimer(NULL, 0, (UINT)SDL_NS_TO_MS(timeoutNS), NULL); - message_result = GetMessage(&msg, 0, 0, 0); - KillTimer(NULL, timer_id); - } else if (timeoutNS == 0) { - message_result = PeekMessage(&msg, NULL, 0, 0, PM_REMOVE); - } else { - message_result = GetMessage(&msg, 0, 0, 0); - } - if (message_result) { - if (msg.message == WM_TIMER && !msg.hwnd && msg.wParam == timer_id) { - return 0; - } - if (g_WindowsMessageHook) { - if (!g_WindowsMessageHook(g_WindowsMessageHookData, &msg)) { - return 1; - } - } - /* Always translate the message in case it's a non-SDL window (e.g. with Qt integration) */ - TranslateMessage(&msg); - DispatchMessage(&msg); + if (MsgWaitForMultipleObjects(0, NULL, FALSE, (DWORD)SDL_NS_TO_MS(timeoutNS), QS_ALLINPUT)) { return 1; } else { return 0;