From 6d4b3582adaf3cea23b0ef777a1bf3e7597fd8da Mon Sep 17 00:00:00 2001 From: Friedemann Kleint Date: Fri, 24 Jul 2020 15:26:13 +0200 Subject: [PATCH] Windows QPA: Move dark mode handling to the new interface MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Move options to new interface, making them settable from code on this occasion. Task-number: QTBUG-83252 Change-Id: Idd80667c502a8cde5d7c66d7e597ea34c22738e7 Reviewed-by: AndrĂ© de la Rocha Reviewed-by: Tor Arne Vestbø --- src/gui/kernel/qguiapplication_p.h | 13 ++++++++++ .../platforms/windows/qwindowsapplication.cpp | 15 ++++++++++++ .../platforms/windows/qwindowsapplication.h | 5 ++++ .../platforms/windows/qwindowscontext.cpp | 9 +++---- .../platforms/windows/qwindowsintegration.cpp | 24 +++++++++++++------ .../platforms/windows/qwindowsintegration.h | 4 +--- .../windows/qwindowsnativeinterface.cpp | 11 --------- .../windows/qwindowsnativeinterface.h | 8 ------- .../platforms/windows/qwindowstheme.cpp | 2 +- .../platforms/windows/qwindowswindow.cpp | 2 +- src/widgets/styles/qwindowsstyle.cpp | 11 ++++----- 11 files changed, 61 insertions(+), 43 deletions(-) diff --git a/src/gui/kernel/qguiapplication_p.h b/src/gui/kernel/qguiapplication_p.h index 8080d7801d7..ecb4a66facd 100644 --- a/src/gui/kernel/qguiapplication_p.h +++ b/src/gui/kernel/qguiapplication_p.h @@ -390,6 +390,13 @@ struct Q_GUI_EXPORT QWindowsApplication Q_DECLARE_FLAGS(TouchWindowTouchTypes, TouchWindowTouchType) + enum DarkModeHandlingFlag { + DarkModeWindowFrames = 0x1, + DarkModeStyle = 0x2 + }; + + Q_DECLARE_FLAGS(DarkModeHandling, DarkModeHandlingFlag) + virtual void setTouchWindowTouchType(TouchWindowTouchTypes type) = 0; virtual TouchWindowTouchTypes touchWindowTouchType() const = 0; @@ -400,6 +407,11 @@ struct Q_GUI_EXPORT QWindowsApplication virtual bool isWinTabEnabled() const = 0; virtual bool setWinTabEnabled(bool enabled) = 0; + + virtual bool isDarkMode() const = 0; + + virtual DarkModeHandling darkModeHandling() const = 0; + virtual void setDarkModeHandling(DarkModeHandling handling) = 0; }; #endif // Q_OS_WIN @@ -407,6 +419,7 @@ struct Q_GUI_EXPORT QWindowsApplication #if defined(Q_OS_WIN) Q_DECLARE_OPERATORS_FOR_FLAGS(QPlatformInterface::Private::QWindowsApplication::TouchWindowTouchTypes) +Q_DECLARE_OPERATORS_FOR_FLAGS(QPlatformInterface::Private::QWindowsApplication::DarkModeHandling) #endif QT_END_NAMESPACE diff --git a/src/plugins/platforms/windows/qwindowsapplication.cpp b/src/plugins/platforms/windows/qwindowsapplication.cpp index 082db98a4f4..c137b2a8a81 100644 --- a/src/plugins/platforms/windows/qwindowsapplication.cpp +++ b/src/plugins/platforms/windows/qwindowsapplication.cpp @@ -94,4 +94,19 @@ bool QWindowsApplication::setWinTabEnabled(bool enabled) return enabled ? ctx->initTablet() : ctx->disposeTablet(); } +bool QWindowsApplication::isDarkMode() const +{ + return QWindowsContext::isDarkMode(); +} + +QWindowsApplication::DarkModeHandling QWindowsApplication::darkModeHandling() const +{ + return m_darkModeHandling; +} + +void QWindowsApplication::setDarkModeHandling(QWindowsApplication::DarkModeHandling handling) +{ + m_darkModeHandling = handling; +} + QT_END_NAMESPACE diff --git a/src/plugins/platforms/windows/qwindowsapplication.h b/src/plugins/platforms/windows/qwindowsapplication.h index 309fc7151f0..6cf8577ab52 100644 --- a/src/plugins/platforms/windows/qwindowsapplication.h +++ b/src/plugins/platforms/windows/qwindowsapplication.h @@ -58,9 +58,14 @@ public: bool isWinTabEnabled() const override; bool setWinTabEnabled(bool enabled) override; + bool isDarkMode() const override; + DarkModeHandling darkModeHandling() const override; + void setDarkModeHandling(DarkModeHandling handling) override; + private: WindowActivationBehavior m_windowActivationBehavior = DefaultActivateWindow; TouchWindowTouchTypes m_touchWindowTouchTypes = NormalTouch; + DarkModeHandling m_darkModeHandling; }; QT_END_NAMESPACE diff --git a/src/plugins/platforms/windows/qwindowscontext.cpp b/src/plugins/platforms/windows/qwindowscontext.cpp index 39278f31e80..1e5b247f0f2 100644 --- a/src/plugins/platforms/windows/qwindowscontext.cpp +++ b/src/plugins/platforms/windows/qwindowscontext.cpp @@ -1244,15 +1244,12 @@ bool QWindowsContext::windowsProc(HWND hwnd, UINT message, const bool darkMode = QWindowsTheme::queryDarkMode(); if (darkMode != QWindowsContextPrivate::m_darkMode) { QWindowsContextPrivate::m_darkMode = darkMode; - auto nativeInterface = - static_cast(QWindowsIntegration::instance()->nativeInterface()); - emit nativeInterface->darkModeChanged(darkMode); - const auto options = QWindowsIntegration::instance()->options(); - if ((options & QWindowsIntegration::DarkModeWindowFrames) != 0) { + auto integration = QWindowsIntegration::instance(); + if (integration->darkModeHandling().testFlag(QWindowsApplication::DarkModeWindowFrames)) { for (QWindowsWindow *w : d->m_windows) w->setDarkBorder(QWindowsContextPrivate::m_darkMode); } - if ((options & QWindowsIntegration::DarkModeStyle) != 0) { + if (integration->darkModeHandling().testFlag(QWindowsApplication::DarkModeStyle)) { QWindowsTheme::instance()->refresh(); for (QWindowsWindow *w : d->m_windows) QWindowSystemInterface::handleThemeChange(w->window()); diff --git a/src/plugins/platforms/windows/qwindowsintegration.cpp b/src/plugins/platforms/windows/qwindowsintegration.cpp index aeafff99623..6ec5f6e37fc 100644 --- a/src/plugins/platforms/windows/qwindowsintegration.cpp +++ b/src/plugins/platforms/windows/qwindowsintegration.cpp @@ -135,9 +135,11 @@ QT_BEGIN_NAMESPACE struct QWindowsIntegrationPrivate { Q_DISABLE_COPY_MOVE(QWindowsIntegrationPrivate) - explicit QWindowsIntegrationPrivate(const QStringList ¶mList); + explicit QWindowsIntegrationPrivate() = default; ~QWindowsIntegrationPrivate(); + void parseOptions(QWindowsIntegration *q, const QStringList ¶mList); + unsigned m_options = 0; QWindowsContext m_context; QPlatformFontDatabase *m_fontDatabase = nullptr; @@ -181,9 +183,13 @@ bool parseIntOption(const QString ¶meter,const QLatin1String &option, return true; } +using DarkModeHandlingFlag = QPlatformInterface::Private::QWindowsApplication::DarkModeHandlingFlag; +using DarkModeHandling = QPlatformInterface::Private::QWindowsApplication::DarkModeHandling; + static inline unsigned parseOptions(const QStringList ¶mList, int *tabletAbsoluteRange, - QtWindows::ProcessDpiAwareness *dpiAwareness) + QtWindows::ProcessDpiAwareness *dpiAwareness, + DarkModeHandling *darkModeHandling) { unsigned options = 0; for (const QString ¶m : paramList) { @@ -223,9 +229,10 @@ static inline unsigned parseOptions(const QStringList ¶mList, } else if (param == u"reverse") { options |= QWindowsIntegration::RtlEnabled; } else if (param == u"darkmode=1") { - options |= QWindowsIntegration::DarkModeWindowFrames; + darkModeHandling->setFlag(DarkModeHandlingFlag::DarkModeWindowFrames); } else if (param == u"darkmode=2") { - options |= QWindowsIntegration::DarkModeWindowFrames | QWindowsIntegration::DarkModeStyle; + darkModeHandling->setFlag(DarkModeHandlingFlag::DarkModeWindowFrames); + darkModeHandling->setFlag(DarkModeHandlingFlag::DarkModeStyle); } else { qWarning() << "Unknown option" << param; } @@ -233,7 +240,7 @@ static inline unsigned parseOptions(const QStringList ¶mList, return options; } -QWindowsIntegrationPrivate::QWindowsIntegrationPrivate(const QStringList ¶mList) +void QWindowsIntegrationPrivate::parseOptions(QWindowsIntegration *q, const QStringList ¶mList) { initOpenGlBlacklistResources(); @@ -242,7 +249,9 @@ QWindowsIntegrationPrivate::QWindowsIntegrationPrivate(const QStringList ¶mL // are connected to Windows 8.1 QtWindows::ProcessDpiAwareness dpiAwareness = QtWindows::ProcessPerMonitorDpiAware; int tabletAbsoluteRange = -1; - m_options = parseOptions(paramList, &tabletAbsoluteRange, &dpiAwareness); + DarkModeHandling darkModeHandling; + m_options = ::parseOptions(paramList, &tabletAbsoluteRange, &dpiAwareness, &darkModeHandling); + q->setDarkModeHandling(darkModeHandling); QWindowsFontDatabase::setFontOptions(m_options); if (tabletAbsoluteRange >= 0) QWindowsContext::setTabletAbsoluteRange(tabletAbsoluteRange); @@ -276,9 +285,10 @@ QWindowsIntegrationPrivate::~QWindowsIntegrationPrivate() QWindowsIntegration *QWindowsIntegration::m_instance = nullptr; QWindowsIntegration::QWindowsIntegration(const QStringList ¶mList) : - d(new QWindowsIntegrationPrivate(paramList)) + d(new QWindowsIntegrationPrivate) { m_instance = this; + d->parseOptions(this, paramList); #if QT_CONFIG(clipboard) d->m_clipboard.registerViewer(); #endif diff --git a/src/plugins/platforms/windows/qwindowsintegration.h b/src/plugins/platforms/windows/qwindowsintegration.h index 3a8c09dd439..eaf62c750df 100644 --- a/src/plugins/platforms/windows/qwindowsintegration.h +++ b/src/plugins/platforms/windows/qwindowsintegration.h @@ -79,9 +79,7 @@ public: DontUseWMPointer = 0x400, DetectAltGrModifier = 0x800, RtlEnabled = 0x1000, - DarkModeWindowFrames = 0x2000, - DarkModeStyle = 0x4000, - FontDatabaseDirectWrite = 0x8000 + FontDatabaseDirectWrite = 0x2000 }; explicit QWindowsIntegration(const QStringList ¶mList); diff --git a/src/plugins/platforms/windows/qwindowsnativeinterface.cpp b/src/plugins/platforms/windows/qwindowsnativeinterface.cpp index 103db19a695..12950d02d6a 100644 --- a/src/plugins/platforms/windows/qwindowsnativeinterface.cpp +++ b/src/plugins/platforms/windows/qwindowsnativeinterface.cpp @@ -239,15 +239,4 @@ QVariant QWindowsNativeInterface::gpuList() const return result; } -bool QWindowsNativeInterface::isDarkMode() const -{ - return QWindowsContext::isDarkMode(); -} - -// Dark mode support level 2 (style) -bool QWindowsNativeInterface::isDarkModeStyle() const -{ - return (QWindowsIntegration::instance()->options() & QWindowsIntegration::DarkModeStyle) != 0; -} - QT_END_NAMESPACE diff --git a/src/plugins/platforms/windows/qwindowsnativeinterface.h b/src/plugins/platforms/windows/qwindowsnativeinterface.h index 6b3740a17b3..bb7801f3982 100644 --- a/src/plugins/platforms/windows/qwindowsnativeinterface.h +++ b/src/plugins/platforms/windows/qwindowsnativeinterface.h @@ -63,8 +63,6 @@ class QWindowsNativeInterface : public QPlatformNativeInterface { Q_OBJECT Q_PROPERTY(bool asyncExpose READ asyncExpose WRITE setAsyncExpose) - Q_PROPERTY(bool darkMode READ isDarkMode STORED false NOTIFY darkModeChanged) - Q_PROPERTY(bool darkModeStyle READ isDarkModeStyle STORED false) Q_PROPERTY(QVariant gpu READ gpu STORED false) Q_PROPERTY(QVariant gpuList READ gpuList STORED false) @@ -92,14 +90,8 @@ public: bool asyncExpose() const; void setAsyncExpose(bool value); - bool isDarkMode() const; - bool isDarkModeStyle() const; - QVariant gpu() const; QVariant gpuList() const; - -Q_SIGNALS: - void darkModeChanged(bool); }; QT_END_NAMESPACE diff --git a/src/plugins/platforms/windows/qwindowstheme.cpp b/src/plugins/platforms/windows/qwindowstheme.cpp index 130fac47367..ea74d8e372b 100644 --- a/src/plugins/platforms/windows/qwindowstheme.cpp +++ b/src/plugins/platforms/windows/qwindowstheme.cpp @@ -533,7 +533,7 @@ void QWindowsTheme::refreshPalettes() return; const bool light = !QWindowsContext::isDarkMode() - || (QWindowsIntegration::instance()->options() & QWindowsIntegration::DarkModeStyle) == 0; + || !QWindowsIntegration::instance()->darkModeHandling().testFlag(QWindowsApplication::DarkModeStyle); m_palettes[SystemPalette] = new QPalette(systemPalette(light)); m_palettes[ToolTipPalette] = new QPalette(toolTipPalette(*m_palettes[SystemPalette], light)); m_palettes[MenuPalette] = new QPalette(menuPalette(*m_palettes[SystemPalette], light)); diff --git a/src/plugins/platforms/windows/qwindowswindow.cpp b/src/plugins/platforms/windows/qwindowswindow.cpp index 2da42511796..a7cc36951a4 100644 --- a/src/plugins/platforms/windows/qwindowswindow.cpp +++ b/src/plugins/platforms/windows/qwindowswindow.cpp @@ -821,7 +821,7 @@ QWindowsWindowData } if (QWindowsContext::isDarkMode() - && (QWindowsIntegration::instance()->options() & QWindowsIntegration::DarkModeWindowFrames) != 0 + && QWindowsIntegration::instance()->darkModeHandling().testFlag(QWindowsApplication::DarkModeWindowFrames) && shouldApplyDarkFrame(w)) { QWindowsWindow::setDarkBorderToWindow(result.hwnd, true); } diff --git a/src/widgets/styles/qwindowsstyle.cpp b/src/widgets/styles/qwindowsstyle.cpp index c442636e062..c402446df10 100644 --- a/src/widgets/styles/qwindowsstyle.cpp +++ b/src/widgets/styles/qwindowsstyle.cpp @@ -85,7 +85,7 @@ #include #include #include -#include +#include #include #include @@ -133,13 +133,12 @@ bool QWindowsStylePrivate::isDarkMode() { bool result = false; #ifdef Q_OS_WIN + using QWindowsApplication = QPlatformInterface::Private::QWindowsApplication; // Windows only: Return whether dark mode style support is desired and // dark mode is in effect. - if (auto ni = QGuiApplication::platformNativeInterface()) { - const QVariant darkModeStyleP = ni->property("darkModeStyle"); - result = darkModeStyleP.type() == QVariant::Bool - && darkModeStyleP.value() - && ni->property("darkMode").value(); + if (auto windowsApp = dynamic_cast(QGuiApplicationPrivate::platformIntegration())) { + result = windowsApp->isDarkMode() + && windowsApp->darkModeHandling().testFlag(QWindowsApplication::DarkModeStyle); } #endif return result;