From 1061948185ea80841cf969c90e41e023c3786ff3 Mon Sep 17 00:00:00 2001 From: baldurk Date: Wed, 3 Dec 2014 10:41:37 +0000 Subject: [PATCH] Implement AllowFullscreen (or rather, !AllowFullscreen) for win32 GL --- renderdoc/hooks/gl_win32_hooks.cpp | 40 ++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/renderdoc/hooks/gl_win32_hooks.cpp b/renderdoc/hooks/gl_win32_hooks.cpp index 684646c78..3433af68f 100644 --- a/renderdoc/hooks/gl_win32_hooks.cpp +++ b/renderdoc/hooks/gl_win32_hooks.cpp @@ -266,6 +266,10 @@ class OpenGLHook : LibraryHook Hook wglMakeCurrent_hook; Hook wglGetProcAddress_hook; Hook SwapBuffers_hook; + Hook ChangeDisplaySettingsA_hook; + Hook ChangeDisplaySettingsW_hook; + Hook ChangeDisplaySettingsExA_hook; + Hook ChangeDisplaySettingsExW_hook; PROC (WINAPI* wglGetProcAddress_realfunc)(const char*); PFNWGLCREATECONTEXTATTRIBSARBPROC wglCreateContextAttribsARB_realfunc; @@ -442,6 +446,38 @@ class OpenGLHook : LibraryHook return glhooks.SwapBuffers_hook()(dc); } + + static LONG WINAPI ChangeDisplaySettingsA_hooked(DEVMODEA *mode, DWORD flags) + { + if((flags & CDS_FULLSCREEN) == 0 || RenderDoc::Inst().GetCaptureOptions().AllowFullscreen) + return glhooks.ChangeDisplaySettingsA_hook()(mode, flags); + + return DISP_CHANGE_SUCCESSFUL; + } + + static LONG WINAPI ChangeDisplaySettingsW_hooked(DEVMODEW *mode, DWORD flags) + { + if((flags & CDS_FULLSCREEN) == 0 || RenderDoc::Inst().GetCaptureOptions().AllowFullscreen) + return glhooks.ChangeDisplaySettingsW_hook()(mode, flags); + + return DISP_CHANGE_SUCCESSFUL; + } + + static LONG WINAPI ChangeDisplaySettingsExA_hooked(LPCSTR devname, DEVMODEA *mode, HWND wnd, DWORD flags, LPVOID param) + { + if((flags & CDS_FULLSCREEN) == 0 || RenderDoc::Inst().GetCaptureOptions().AllowFullscreen) + return glhooks.ChangeDisplaySettingsExA_hook()(devname, mode, wnd, flags, param); + + return DISP_CHANGE_SUCCESSFUL; + } + + static LONG WINAPI ChangeDisplaySettingsExW_hooked(LPCWSTR devname, DEVMODEW *mode, HWND wnd, DWORD flags, LPVOID param) + { + if((flags & CDS_FULLSCREEN) == 0 || RenderDoc::Inst().GetCaptureOptions().AllowFullscreen) + return glhooks.ChangeDisplaySettingsExW_hook()(devname, mode, wnd, flags, param); + + return DISP_CHANGE_SUCCESSFUL; + } static const char * WINAPI wglGetExtensionsStringARB_hooked(HDC dc) { @@ -541,6 +577,10 @@ class OpenGLHook : LibraryHook success &= wglMakeCurrent_hook.Initialize("wglMakeCurrent", DLL_NAME, wglMakeCurrent_hooked); success &= wglGetProcAddress_hook.Initialize("wglGetProcAddress", DLL_NAME, wglGetProcAddress_hooked); success &= SwapBuffers_hook.Initialize("SwapBuffers", "gdi32.dll", SwapBuffers_hooked); + success &= ChangeDisplaySettingsA_hook.Initialize("ChangeDisplaySettingsA", "user32.dll", ChangeDisplaySettingsA_hooked); + success &= ChangeDisplaySettingsW_hook.Initialize("ChangeDisplaySettingsW", "user32.dll", ChangeDisplaySettingsW_hooked); + success &= ChangeDisplaySettingsExA_hook.Initialize("ChangeDisplaySettingsExA", "user32.dll", ChangeDisplaySettingsExA_hooked); + success &= ChangeDisplaySettingsExW_hook.Initialize("ChangeDisplaySettingsExW", "user32.dll", ChangeDisplaySettingsExW_hooked); wglGetProcAddress_realfunc = wglGetProcAddress_hook();