From 0af7229b8e5c9e963797d74bdf65434d05a4a649 Mon Sep 17 00:00:00 2001 From: Philip Rebohle Date: Mon, 31 May 2021 17:01:59 +0200 Subject: [PATCH] [util] Restore display modes of all monitors in RestoreMonitorDisplayMode Fixes #2064. --- src/d3d9/d3d9_swapchain.cpp | 2 +- src/dxgi/dxgi_swapchain.cpp | 2 +- src/util/util_monitor.cpp | 30 ++++++++++++++++++++++++++---- src/util/util_monitor.h | 7 ++----- 4 files changed, 30 insertions(+), 11 deletions(-) diff --git a/src/d3d9/d3d9_swapchain.cpp b/src/d3d9/d3d9_swapchain.cpp index f38d7a97..ea9d5d19 100644 --- a/src/d3d9/d3d9_swapchain.cpp +++ b/src/d3d9/d3d9_swapchain.cpp @@ -1255,7 +1255,7 @@ namespace dxvk { if (hMonitor == nullptr) return D3DERR_INVALIDCALL; - return RestoreMonitorDisplayMode(hMonitor) + return RestoreMonitorDisplayMode() ? D3D_OK : D3DERR_NOTAVAILABLE; } diff --git a/src/dxgi/dxgi_swapchain.cpp b/src/dxgi/dxgi_swapchain.cpp index 6bfeab8e..d02c62b5 100644 --- a/src/dxgi/dxgi_swapchain.cpp +++ b/src/dxgi/dxgi_swapchain.cpp @@ -722,7 +722,7 @@ namespace dxvk { if (!hMonitor) return DXGI_ERROR_INVALID_CALL; - return RestoreMonitorDisplayMode(hMonitor) + return RestoreMonitorDisplayMode() ? S_OK : DXGI_ERROR_NOT_CURRENTLY_AVAILABLE; } diff --git a/src/util/util_monitor.cpp b/src/util/util_monitor.cpp index 1b84714f..69f60d16 100644 --- a/src/util/util_monitor.cpp +++ b/src/util/util_monitor.cpp @@ -70,19 +70,41 @@ namespace dxvk { } - BOOL RestoreMonitorDisplayMode( - HMONITOR hMonitor) { + BOOL CALLBACK RestoreMonitorDisplayModeCallback( + HMONITOR hMonitor, + HDC hDC, + LPRECT pRect, + LPARAM pUserdata) { + auto success = reinterpret_cast(pUserdata); + DEVMODEW devMode = { }; devMode.dmSize = sizeof(devMode); - if (!GetMonitorDisplayMode(hMonitor, ENUM_REGISTRY_SETTINGS, &devMode)) + if (!GetMonitorDisplayMode(hMonitor, ENUM_REGISTRY_SETTINGS, &devMode)) { + *success = false; return false; + } Logger::info(str::format("Restoring display mode: ", devMode.dmPelsWidth, "x", devMode.dmPelsHeight, "@", devMode.dmDisplayFrequency)); - return SetMonitorDisplayMode(hMonitor, &devMode); + if (!SetMonitorDisplayMode(hMonitor, &devMode)) { + *success = false; + return false; + } + + return true; + } + + + BOOL RestoreMonitorDisplayMode() { + bool success = true; + bool result = ::EnumDisplayMonitors(nullptr, nullptr, + &RestoreMonitorDisplayModeCallback, + reinterpret_cast(&success)); + + return result && success; } diff --git a/src/util/util_monitor.h b/src/util/util_monitor.h index c89520a9..41c6ebee 100644 --- a/src/util/util_monitor.h +++ b/src/util/util_monitor.h @@ -36,13 +36,10 @@ namespace dxvk { DEVMODEW* pMode); /** - * \brief Change display mode to registry settings - * - * \param [in] hMonitor The monitor to change + * \brief Change display modes to registry settings * \returns \c true on success */ - BOOL RestoreMonitorDisplayMode( - HMONITOR hMonitor); + BOOL RestoreMonitorDisplayMode(); /** * \brief Queries window client size