Browse Source

GDK: Partially revert 2670eb44afec9311ee8fbec447703c427db1e1c8

MsgWaitForMultipleObjects is desktop-only.

(cherry picked from commit e1e5d33420f8069469aaf21e61fe58ef37c2e7db)
(cherry picked from commit da9bfc43e796182f7d5c8bfc86a5ec2e50ae90d0)
Jade Macho 1 year ago
parent
commit
dae1232489
1 changed files with 30 additions and 0 deletions
  1. 30 0
      src/video/windows/SDL_windowsevents.c

+ 30 - 0
src/video/windows/SDL_windowsevents.c

@@ -1803,6 +1803,7 @@ void SDL_SetWindowsMessageHook(SDL_WindowsMessageHook callback, void *userdata)
 int WIN_WaitEventTimeout(_THIS, int timeout)
 {
     if (g_WindowsEnableMessageLoop) {
+#if !defined(__XBOXONE__) && !defined(__XBOXSERIES__)
         DWORD dwMilliseconds, ret;
         dwMilliseconds = timeout < 0 ? INFINITE : (DWORD)timeout;
         ret = MsgWaitForMultipleObjects(0, NULL, FALSE, dwMilliseconds, QS_ALLINPUT);
@@ -1811,6 +1812,35 @@ int WIN_WaitEventTimeout(_THIS, int timeout)
         } else {
             return 0;
         }
+#else
+        /* MsgWaitForMultipleObjects is desktop-only. */
+        MSG msg;
+        BOOL message_result;
+        UINT_PTR timer_id = 0;
+        if (timeout > 0) {
+            timer_id = SetTimer(NULL, 0, timeout, NULL);
+            message_result = GetMessage(&msg, 0, 0, 0);
+            KillTimer(NULL, timer_id);
+        } else if (timeout == 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) {
+                g_WindowsMessageHook(g_WindowsMessageHookData, msg.hwnd, msg.message, msg.wParam, msg.lParam);
+            }
+            /* Always translate the message in case it's a non-SDL window (e.g. with Qt integration) */
+            TranslateMessage(&msg);
+            DispatchMessage(&msg);
+            return 1;
+        } else {
+            return 0;
+        }
+#endif /*!defined(__XBOXONE__) && !defined(__XBOXSERIES__)*/
     } else {
         /* Fail the wait so the caller falls back to polling */
         return -1;