diff options
author | Vladimir Belyavsky <belyavskyv@gmail.com> | 2022-05-20 19:38:06 +0300 |
---|---|---|
committer | Vladimir Belyavsky <belyavskyv@gmail.com> | 2022-06-08 17:08:49 +0000 |
commit | 4a2c31103c7c993c87f88087811e02804adfabf3 (patch) | |
tree | f35619b84b40a556d61d6d6cb75a2e3b6207745d /src/plugins/platforms/windows | |
parent | e4f9a78c18039a013326307f4884eeb7e83bd976 (diff) |
Fallback to PerMonitorDpiAware if V2DpiAware is not supported by system
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
Pick-to: 6.3 6.4
Change-Id: I39216e63ecfcae96aaa159237a52b0a76bc5d956
Reviewed-by: Morten Johan Sørvig <morten.sorvig@qt.io>
Diffstat (limited to 'src/plugins/platforms/windows')
-rw-r--r-- | src/plugins/platforms/windows/qwindowscontext.cpp | 18 | ||||
-rw-r--r-- | src/plugins/platforms/windows/qwindowscontext.h | 2 | ||||
-rw-r--r-- | src/plugins/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 ae4128d073..6dece1a518 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 ac65f745e7..4cc47a3ba4 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 a281172651..8e94722565 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(); } } |