feature: user defined GetMessage on Windows

This commit is contained in:
sid 2023-08-08 12:36:30 +08:00
parent 4bceea70c5
commit 257c0b8cd7
2 changed files with 29 additions and 2 deletions

View file

@ -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__)

View file

@ -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) {