diff --git a/DDrawCompat/CompatActivateAppHandler.cpp b/DDrawCompat/CompatActivateAppHandler.cpp index b40e4e0..35f2f58 100644 --- a/DDrawCompat/CompatActivateAppHandler.cpp +++ b/DDrawCompat/CompatActivateAppHandler.cpp @@ -1,6 +1,7 @@ #include "CompatActivateAppHandler.h" #include "CompatDirectDraw.h" #include "CompatDirectDrawSurface.h" +#include "CompatGdi.h" #include "CompatPrimarySurface.h" #include "DDrawLog.h" #include "RealPrimarySurface.h" @@ -54,9 +55,11 @@ namespace CompatDirectDraw::s_origVtable.SetDisplayMode( dd, dm.width, dm.height, 32, dm.refreshRate, 0); } + CompatGdi::enableEmulation(); } else { + CompatGdi::disableEmulation(); if (CompatPrimarySurface::isDisplayModeChanged) { CompatDirectDraw::s_origVtable.RestoreDisplayMode(dd); diff --git a/DDrawCompat/CompatGdi.cpp b/DDrawCompat/CompatGdi.cpp index 74dcfc5..9f54ad9 100644 --- a/DDrawCompat/CompatGdi.cpp +++ b/DDrawCompat/CompatGdi.cpp @@ -1,3 +1,5 @@ +#include + #include "CompatDirectDrawPalette.h" #include "CompatDirectDrawSurface.h" #include "CompatGdi.h" @@ -15,6 +17,7 @@ namespace { + std::atomic g_disableEmulationCount = 0; DWORD g_renderingRefCount = 0; DWORD g_ddLockThreadRenderingRefCount = 0; DWORD g_ddLockThreadId = 0; @@ -154,6 +157,16 @@ namespace CompatGdi } } + void disableEmulation() + { + ++g_disableEmulationCount; + } + + void enableEmulation() + { + --g_disableEmulationCount; + } + void hookWndProc(LPCSTR className, WNDPROC &oldWndProc, WNDPROC newWndProc) { HWND hwnd = CreateWindow(className, nullptr, 0, 0, 0, 0, 0, nullptr, nullptr, nullptr, 0); @@ -193,7 +206,7 @@ namespace CompatGdi bool isEmulationEnabled() { - return RealPrimarySurface::isFullScreen(); + return g_disableEmulationCount <= 0 && RealPrimarySurface::isFullScreen(); } void unhookWndProc(LPCSTR className, WNDPROC oldWndProc) diff --git a/DDrawCompat/CompatGdi.h b/DDrawCompat/CompatGdi.h index 3deb5df..80f8021 100644 --- a/DDrawCompat/CompatGdi.h +++ b/DDrawCompat/CompatGdi.h @@ -9,6 +9,9 @@ namespace CompatGdi bool beginGdiRendering(); void endGdiRendering(); + void disableEmulation(); + void enableEmulation(); + void hookWndProc(LPCSTR className, WNDPROC &oldWndProc, WNDPROC newWndProc); void installHooks(); void invalidate(const RECT* rect);