diff --git a/DDrawCompat/Config/Settings/AltTabFix.h b/DDrawCompat/Config/Settings/AltTabFix.h index 15205d2..1a500dd 100644 --- a/DDrawCompat/Config/Settings/AltTabFix.h +++ b/DDrawCompat/Config/Settings/AltTabFix.h @@ -9,10 +9,10 @@ namespace Config class AltTabFix : public EnumSetting { public: - enum Values { OFF, KEEPVIDMEM }; + enum Values { OFF, KEEPVIDMEM, KEEPVIDMEMNP }; AltTabFix() - : EnumSetting("AltTabFix", "off", { "off", "keepvidmem" }) + : EnumSetting("AltTabFix", "off", { "off", "keepvidmem", "keepvidmemnp" }) { } }; diff --git a/DDrawCompat/DDraw/DirectDraw.cpp b/DDrawCompat/DDraw/DirectDraw.cpp index 11b2ac7..cf01c57 100644 --- a/DDrawCompat/DDraw/DirectDraw.cpp +++ b/DDrawCompat/DDraw/DirectDraw.cpp @@ -215,17 +215,19 @@ namespace DDraw LRESULT handleActivateApp(bool isActivated, std::function callOrigWndProc) { LOG_FUNC("handleActivateApp", isActivated, callOrigWndProc); - if (Config::Settings::AltTabFix::KEEPVIDMEM != Config::altTabFix.get()) + if (Config::Settings::AltTabFix::OFF == Config::altTabFix.get()) { return LOG_RESULT(callOrigWndProc()); } DDraw::ScopedThreadLock lock; + const bool keepPrimary = Config::Settings::AltTabFix::KEEPVIDMEM == Config::altTabFix.get(); std::set surfacesToRestore; DDraw::Surface::enumSurfaces([&](const Surface& surface) { auto lcl = DDraw::DirectDrawSurface::getInt(*surface.getDDS()).lpLcl; - if (!(lcl->dwFlags & DDRAWISURF_INVALID)) + if (!(lcl->dwFlags & DDRAWISURF_INVALID) && + (keepPrimary || !(surface.getOrigCaps() & DDSCAPS_PRIMARYSURFACE))) { lcl->dwFlags |= DDRAWISURF_INVALID; surfacesToRestore.insert(lcl); @@ -245,7 +247,7 @@ namespace DDraw } }); - if (isActivated) + if (isActivated && keepPrimary) { auto realPrimary(DDraw::RealPrimarySurface::getSurface()); if (realPrimary) diff --git a/DDrawCompat/DDraw/Surfaces/Surface.h b/DDrawCompat/DDraw/Surfaces/Surface.h index 60907c2..df01a05 100644 --- a/DDrawCompat/DDraw/Surfaces/Surface.h +++ b/DDrawCompat/DDraw/Surfaces/Surface.h @@ -38,6 +38,7 @@ namespace DDraw static Surface* getSurface(TSurface& dds); CompatWeakPtr getDDS() const { return m_surface; }; + DWORD getOrigCaps() const { return m_origCaps; } template SurfaceImpl* getImpl() const;