From 257c0b8cd7b9ef7138c69db5759df86b072f49bd Mon Sep 17 00:00:00 2001 From: sid Date: Tue, 8 Aug 2023 12:36:30 +0800 Subject: [PATCH] feature: user defined GetMessage on Windows --- include/SDL_system.h | 8 ++++++++ src/video/windows/SDL_windowsevents.c | 23 +++++++++++++++++++++-- 2 files changed, 29 insertions(+), 2 deletions(-) diff --git a/include/SDL_system.h b/include/SDL_system.h index 4b7eaddcc0..05b25a410f 100644 --- a/include/SDL_system.h +++ b/include/SDL_system.h @@ -55,6 +55,14 @@ typedef void (SDLCALL * SDL_WindowsMessageHook)(void *userdata, void *hWnd, unsi */ extern DECLSPEC void SDLCALL SDL_SetWindowsMessageHook(SDL_WindowsMessageHook callback, void *userdata); +// the return value is BOOL +typedef int(SDLCALL *SDL_WindowsGetMessageImpl)(void *userdata, void *lpMsg, void *hWnd, unsigned int wMsgFilterMin, unsigned int wMsgFilterMax); + +/** + * Set a GetMessage implement, for blocking etc. + */ +extern DECLSPEC void SDLCALL SDL_SetWindowsGetMessageImpl(SDL_WindowsGetMessageImpl callback, void *userdata); + #endif /* defined(__WIN32__) || defined(__GDK__) */ #if defined(__WIN32__) || defined(__WINGDK__) diff --git a/src/video/windows/SDL_windowsevents.c b/src/video/windows/SDL_windowsevents.c index 180c1a8eb8..b44e025955 100644 --- a/src/video/windows/SDL_windowsevents.c +++ b/src/video/windows/SDL_windowsevents.c @@ -1767,6 +1767,25 @@ void SDL_SetWindowsMessageHook(SDL_WindowsMessageHook callback, void *userdata) g_WindowsMessageHookData = userdata; } +// A user implement API: GetMessage +static SDL_WindowsGetMessageImpl g_WindowsGetMessageImpl = NULL; +static void *g_WindowsGetMessageImplData = NULL; + +void SDLCALL SDL_SetWindowsGetMessageImpl(SDL_WindowsGetMessageImpl callback, void* userdata) +{ + g_WindowsGetMessageImpl = callback; + g_WindowsGetMessageImplData = userdata; +} + +static BOOL GetMessageImpl(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wMsgFilterMax) +{ + if (g_WindowsGetMessageImpl) + { + return g_WindowsGetMessageImpl(g_WindowsGetMessageImplData, lpMsg, hWnd, wMsgFilterMin, wMsgFilterMax); + } + return GetMessage(lpMsg, hWnd, wMsgFilterMin, wMsgFilterMax); +} + int WIN_WaitEventTimeout(_THIS, int timeout) { MSG msg; @@ -1775,12 +1794,12 @@ int WIN_WaitEventTimeout(_THIS, int timeout) UINT_PTR timer_id = 0; if (timeout > 0) { timer_id = SetTimer(NULL, 0, timeout, NULL); - message_result = GetMessage(&msg, 0, 0, 0); + message_result = GetMessageImpl(&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); + message_result = GetMessageImpl(&msg, 0, 0, 0); } if (message_result) { if (msg.message == WM_TIMER && msg.hwnd == NULL && msg.wParam == timer_id) {