From 9e6f83307dc9d08b543aa6badc5abe420980b9c5 Mon Sep 17 00:00:00 2001 From: Vladimir Belyavsky Date: Fri, 20 May 2022 19:38:06 +0300 Subject: [PATCH] Fallback to PerMonitorDpiAware if V2DpiAware is not supported by system MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2 might not be supported on some legacy Windows 10 editions (prior Creator Update). In this case SetProcessDpiAwarenessContext returns ERROR_INVALID_PARAMETER. Fallback to DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE using old API SetProcessDpiAwareness in such cases as the most suitable. Fixes: QTBUG-103733 Change-Id: I39216e63ecfcae96aaa159237a52b0a76bc5d956 Reviewed-by: Morten Johan Sørvig (cherry picked from commit 4a2c31103c7c993c87f88087811e02804adfabf3) Reviewed-by: Qt Cherry-pick Bot --- .../platforms/windows/qwindowscontext.cpp | 18 ++++++++--------- .../platforms/windows/qwindowscontext.h | 2 +- .../platforms/windows/qwindowsintegration.cpp | 20 +++++++++++-------- 3 files changed, 21 insertions(+), 19 deletions(-) diff --git a/src/plugins/platforms/windows/qwindowscontext.cpp b/src/plugins/platforms/windows/qwindowscontext.cpp index ae4128d0735..6dece1a5187 100644 --- a/src/plugins/platforms/windows/qwindowscontext.cpp +++ b/src/plugins/platforms/windows/qwindowscontext.cpp @@ -382,21 +382,19 @@ void QWindowsContext::setProcessDpiAwareness(QtWindows::ProcessDpiAwareness dpiA } } -void QWindowsContext::setProcessDpiV2Awareness() +bool QWindowsContext::setProcessDpiV2Awareness() { qCDebug(lcQpaWindows) << __FUNCTION__; const BOOL ok = SetProcessDpiAwarenessContext(DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2); - if (ok) { - QWindowsContextPrivate::m_v2DpiAware = true; - } else { + if (!ok) { const HRESULT errorCode = GetLastError(); - // ERROR_ACCESS_DENIED means set externally (MSVC manifest or external app loading Qt plugin). - // Silence warning in that case unless debug is enabled. - if (errorCode != ERROR_ACCESS_DENIED || lcQpaWindows().isDebugEnabled()) { - qWarning().noquote().nospace() << "setProcessDpiAwarenessContext(DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2) failed: " - << QWindowsContext::comErrorString(errorCode); - } + qCWarning(lcQpaWindows).noquote().nospace() << "setProcessDpiAwarenessContext(DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2) failed: " + << QWindowsContext::comErrorString(errorCode); + return false; } + + QWindowsContextPrivate::m_v2DpiAware = true; + return true; } bool QWindowsContext::isDarkMode() diff --git a/src/plugins/platforms/windows/qwindowscontext.h b/src/plugins/platforms/windows/qwindowscontext.h index ac65f745e71..4cc47a3ba4b 100644 --- a/src/plugins/platforms/windows/qwindowscontext.h +++ b/src/plugins/platforms/windows/qwindowscontext.h @@ -121,7 +121,7 @@ public: static void setTabletAbsoluteRange(int a); void setProcessDpiAwareness(QtWindows::ProcessDpiAwareness dpiAwareness); static int processDpiAwareness(); - void setProcessDpiV2Awareness(); + bool setProcessDpiV2Awareness(); static bool isDarkMode(); diff --git a/src/plugins/platforms/windows/qwindowsintegration.cpp b/src/plugins/platforms/windows/qwindowsintegration.cpp index a281172651d..8e947225657 100644 --- a/src/plugins/platforms/windows/qwindowsintegration.cpp +++ b/src/plugins/platforms/windows/qwindowsintegration.cpp @@ -223,16 +223,20 @@ void QWindowsIntegrationPrivate::parseOptions(QWindowsIntegration *q, const QStr if (!dpiAwarenessSet) { // Set only once in case of repeated instantiations of QGuiApplication. if (!QCoreApplication::testAttribute(Qt::AA_PluginApplication)) { - - // DpiAwareV2 requires using new API if (dpiAwareness == QtWindows::ProcessPerMonitorV2DpiAware) { - m_context.setProcessDpiV2Awareness(); - qCDebug(lcQpaWindows) - << __FUNCTION__ << "DpiAwareness: DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2"; - } else { + // DpiAwareV2 requires using new API + if (m_context.setProcessDpiV2Awareness()) { + qCDebug(lcQpaWindows, "DpiAwareness: DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2"); + dpiAwarenessSet = true; + } else { + // fallback to old API + dpiAwareness = QtWindows::ProcessPerMonitorDpiAware; + } + } + + if (!dpiAwarenessSet) { m_context.setProcessDpiAwareness(dpiAwareness); - qCDebug(lcQpaWindows) - << __FUNCTION__ << "DpiAwareness=" << dpiAwareness + qCDebug(lcQpaWindows) << "DpiAwareness=" << dpiAwareness << "effective process DPI awareness=" << QWindowsContext::processDpiAwareness(); } }