From 3e3b34adc9fb928338a8e1d67eb14b0a7db4ff4c Mon Sep 17 00:00:00 2001 From: Sam Lantinga Date: Wed, 4 Jun 2014 10:52:34 -0700 Subject: [PATCH] Added a hint to disable windows message processing in SDL_PumpEvents() SDL_SetHint( SDL_HINT_WINDOWS_ENABLE_MESSAGELOOP, "0" ); --- include/SDL_hints.h | 11 +++++++++++ src/video/windows/SDL_windowsevents.c | 18 ++++++++++-------- src/video/windows/SDL_windowsvideo.c | 27 +++++++++++++++++++-------- src/video/windows/SDL_windowsvideo.h | 1 + 4 files changed, 41 insertions(+), 16 deletions(-) diff --git a/include/SDL_hints.h b/include/SDL_hints.h index eec2ddff47918..249f24d1fcee2 100644 --- a/include/SDL_hints.h +++ b/include/SDL_hints.h @@ -196,6 +196,17 @@ extern "C" { */ #define SDL_HINT_WINDOW_FRAME_USABLE_WHILE_CURSOR_HIDDEN "SDL_WINDOW_FRAME_USABLE_WHILE_CURSOR_HIDDEN" +/** + * \brief A variable controlling whether the windows message loop is processed by SDL + * + * This variable can be set to the following values: + * "0" - The window message loop is not run + * "1" - The window message loop is processed in SDL_PumpEvents() + * + * By default SDL will process the windows message loop + */ +#define SDL_HINT_WINDOWS_ENABLE_MESSAGELOOP "SDL_WINDOWS_ENABLE_MESSAGELOOP" + /** * \brief A variable controlling whether grabbing input grabs the keyboard * diff --git a/src/video/windows/SDL_windowsevents.c b/src/video/windows/SDL_windowsevents.c index d3cdd6ce12241..2aa1814c7bbdb 100644 --- a/src/video/windows/SDL_windowsevents.c +++ b/src/video/windows/SDL_windowsevents.c @@ -890,14 +890,16 @@ WIN_PumpEvents(_THIS) MSG msg; DWORD start_ticks = GetTickCount(); - while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) { - /* Always translate the message in case it's a non-SDL window (e.g. with Qt integration) */ - TranslateMessage(&msg); - DispatchMessage(&msg); - - /* Make sure we don't busy loop here forever if there are lots of events coming in */ - if (SDL_TICKS_PASSED(msg.time, start_ticks)) { - break; + if (g_WindowsEnableMessageLoop) { + while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) { + /* Always translate the message in case it's a non-SDL window (e.g. with Qt integration) */ + TranslateMessage(&msg); + DispatchMessage(&msg); + + /* Make sure we don't busy loop here forever if there are lots of events coming in */ + if (SDL_TICKS_PASSED(msg.time, start_ticks)) { + break; + } } } diff --git a/src/video/windows/SDL_windowsvideo.c b/src/video/windows/SDL_windowsvideo.c index f8bb34b247fee..12eca0349b967 100644 --- a/src/video/windows/SDL_windowsvideo.c +++ b/src/video/windows/SDL_windowsvideo.c @@ -39,8 +39,18 @@ static int WIN_VideoInit(_THIS); static void WIN_VideoQuit(_THIS); /* Hints */ +SDL_bool g_WindowsEnableMessageLoop = SDL_TRUE; SDL_bool g_WindowFrameUsableWhileCursorHidden = SDL_TRUE; +static void UpdateWindowsEnableMessageLoop(void *userdata, const char *name, const char *oldValue, const char *newValue) +{ + if (newValue && *newValue == '0') { + g_WindowsEnableMessageLoop = SDL_FALSE; + } else { + g_WindowsEnableMessageLoop = SDL_TRUE; + } +} + static void UpdateWindowFrameUsableWhileCursorHidden(void *userdata, const char *name, const char *oldValue, const char *newValue) { if (newValue && *newValue == '0') { @@ -97,9 +107,9 @@ WIN_CreateDevice(int devindex) data->userDLL = SDL_LoadObject("USER32.DLL"); if (data->userDLL) { - data->CloseTouchInputHandle = (BOOL (WINAPI *)( HTOUCHINPUT )) SDL_LoadFunction(data->userDLL, "CloseTouchInputHandle"); - data->GetTouchInputInfo = (BOOL (WINAPI *)( HTOUCHINPUT, UINT, PTOUCHINPUT, int )) SDL_LoadFunction(data->userDLL, "GetTouchInputInfo"); - data->RegisterTouchWindow = (BOOL (WINAPI *)( HWND, ULONG )) SDL_LoadFunction(data->userDLL, "RegisterTouchWindow"); + data->CloseTouchInputHandle = (BOOL (WINAPI *)(HTOUCHINPUT)) SDL_LoadFunction(data->userDLL, "CloseTouchInputHandle"); + data->GetTouchInputInfo = (BOOL (WINAPI *)(HTOUCHINPUT, UINT, PTOUCHINPUT, int)) SDL_LoadFunction(data->userDLL, "GetTouchInputInfo"); + data->RegisterTouchWindow = (BOOL (WINAPI *)(HWND, ULONG)) SDL_LoadFunction(data->userDLL, "RegisterTouchWindow"); } /* Set the function pointers */ @@ -178,7 +188,8 @@ WIN_VideoInit(_THIS) WIN_InitKeyboard(_this); WIN_InitMouse(_this); - SDL_AddHintCallback( SDL_HINT_WINDOW_FRAME_USABLE_WHILE_CURSOR_HIDDEN, UpdateWindowFrameUsableWhileCursorHidden, NULL ); + SDL_AddHintCallback(SDL_HINT_WINDOWS_ENABLE_MESSAGELOOP, UpdateWindowsEnableMessageLoop, NULL); + SDL_AddHintCallback(SDL_HINT_WINDOW_FRAME_USABLE_WHILE_CURSOR_HIDDEN, UpdateWindowFrameUsableWhileCursorHidden, NULL); return 0; } @@ -196,7 +207,7 @@ WIN_VideoQuit(_THIS) #include SDL_bool -D3D_LoadDLL( void **pD3DDLL, IDirect3D9 **pDirect3D9Interface ) +D3D_LoadDLL(void **pD3DDLL, IDirect3D9 **pDirect3D9Interface) { *pD3DDLL = SDL_LoadObject("D3D9.DLL"); if (*pD3DDLL) { @@ -239,7 +250,7 @@ D3D_LoadDLL( void **pD3DDLL, IDirect3D9 **pDirect3D9Interface ) int -SDL_Direct3D9GetAdapterIndex( int displayIndex ) +SDL_Direct3D9GetAdapterIndex(int displayIndex) { void *pD3DDLL; IDirect3D9 *pD3D; @@ -287,7 +298,7 @@ DXGI_LoadDLL(void **pDXGIDLL, IDXGIFactory **pDXGIFactory) { *pDXGIDLL = SDL_LoadObject("DXGI.DLL"); if (*pDXGIDLL) { - HRESULT (WINAPI *CreateDXGI)( REFIID riid, void **ppFactory ); + HRESULT (WINAPI *CreateDXGI)(REFIID riid, void **ppFactory); CreateDXGI = (HRESULT (WINAPI *) (REFIID, void**)) SDL_LoadFunction(*pDXGIDLL, @@ -365,7 +376,7 @@ SDL_DXGIGetOutputInfo(int displayIndex, int *adapterIndex, int *outputIndex) *adapterIndex = nAdapter; *outputIndex = nOutput; } - SDL_free( outputName ); + SDL_free(outputName); } IDXGIOutput_Release(pDXGIOutput); nOutput++; diff --git a/src/video/windows/SDL_windowsvideo.h b/src/video/windows/SDL_windowsvideo.h index 406f88dbf0274..aaedc04eafaf3 100644 --- a/src/video/windows/SDL_windowsvideo.h +++ b/src/video/windows/SDL_windowsvideo.h @@ -171,6 +171,7 @@ typedef struct SDL_VideoData TSFSink *ime_ippasink; } SDL_VideoData; +extern SDL_bool g_WindowsEnableMessageLoop; extern SDL_bool g_WindowFrameUsableWhileCursorHidden; typedef struct IDirect3D9 IDirect3D9;