From e10def6de7c964be8f86b6f2c1a081e9f623f611 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Camilla=20L=C3=B6wy?= Date: Wed, 1 Dec 2021 17:55:16 +0100 Subject: [PATCH] Win32: Fix bad content scale on monitor disconnect The monitor handle could have become invalid just before the call to GetDpiForMonitor. It was possible for both window and monitor content scale queries. This ensures both that an appropriate error is emitted and that the retrieved values are zero on error. Fixes #1615 (cherry picked from commit fbfd7e65c842c7909b11747f0641364593304f1a) --- CONTRIBUTORS.md | 1 + README.md | 3 +++ src/win32_monitor.c | 13 ++++++++++++- 3 files changed, 16 insertions(+), 1 deletion(-) diff --git a/CONTRIBUTORS.md b/CONTRIBUTORS.md index b1bc1a01..da26b569 100644 --- a/CONTRIBUTORS.md +++ b/CONTRIBUTORS.md @@ -62,6 +62,7 @@ video tutorials. - Mário Freitas - GeO4d - Marcus Geelnard + - ghuser404 - Charles Giessen - Ryan C. Gordon - Stephen Gowen diff --git a/README.md b/README.md index 59abe286..ad78eff2 100644 --- a/README.md +++ b/README.md @@ -124,6 +124,9 @@ information on what to include when reporting a bug. ## Changelog - Bugfix: Joysticks connected before init did not get gamepad mappings (#1996) + - [Win32] Bugfix: Content scale queries could fail silently (#1615) + - [Win32] Bugfix: Content scales could have garbage values if monitor was recently + disconnected (#1615) - [Cocoa] Bugfix: A dependency on an external constant caused crashes on macOS 11 and earlier (#1985,#1994) - [X11] Bugfix: Icon pixel format conversion worked only by accident, relying on diff --git a/src/win32_monitor.c b/src/win32_monitor.c index c8bae359..3cb33933 100644 --- a/src/win32_monitor.c +++ b/src/win32_monitor.c @@ -318,8 +318,19 @@ void _glfwGetMonitorContentScaleWin32(HMONITOR handle, float* xscale, float* ysc { UINT xdpi, ydpi; + if (xscale) + *xscale = 0.f; + if (yscale) + *yscale = 0.f; + if (IsWindows8Point1OrGreater()) - GetDpiForMonitor(handle, MDT_EFFECTIVE_DPI, &xdpi, &ydpi); + { + if (GetDpiForMonitor(handle, MDT_EFFECTIVE_DPI, &xdpi, &ydpi) != S_OK) + { + _glfwInputError(GLFW_PLATFORM_ERROR, "Win32: Failed to query monitor DPI"); + return; + } + } else { const HDC dc = GetDC(NULL);