Windows QPA: Move dark mode handling to the new interface

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 <andre.rocha@qt.io>
Reviewed-by: Tor Arne Vestbø <tor.arne.vestbo@qt.io>
This commit is contained in:
Friedemann Kleint 2020-07-24 15:26:13 +02:00
parent f06dfb60b9
commit 6d4b3582ad
11 changed files with 61 additions and 43 deletions

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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<QWindowsNativeInterface *>(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());

View File

@ -135,9 +135,11 @@ QT_BEGIN_NAMESPACE
struct QWindowsIntegrationPrivate
{
Q_DISABLE_COPY_MOVE(QWindowsIntegrationPrivate)
explicit QWindowsIntegrationPrivate(const QStringList &paramList);
explicit QWindowsIntegrationPrivate() = default;
~QWindowsIntegrationPrivate();
void parseOptions(QWindowsIntegration *q, const QStringList &paramList);
unsigned m_options = 0;
QWindowsContext m_context;
QPlatformFontDatabase *m_fontDatabase = nullptr;
@ -181,9 +183,13 @@ bool parseIntOption(const QString &parameter,const QLatin1String &option,
return true;
}
using DarkModeHandlingFlag = QPlatformInterface::Private::QWindowsApplication::DarkModeHandlingFlag;
using DarkModeHandling = QPlatformInterface::Private::QWindowsApplication::DarkModeHandling;
static inline unsigned parseOptions(const QStringList &paramList,
int *tabletAbsoluteRange,
QtWindows::ProcessDpiAwareness *dpiAwareness)
QtWindows::ProcessDpiAwareness *dpiAwareness,
DarkModeHandling *darkModeHandling)
{
unsigned options = 0;
for (const QString &param : paramList) {
@ -223,9 +229,10 @@ static inline unsigned parseOptions(const QStringList &paramList,
} 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 &paramList,
return options;
}
QWindowsIntegrationPrivate::QWindowsIntegrationPrivate(const QStringList &paramList)
void QWindowsIntegrationPrivate::parseOptions(QWindowsIntegration *q, const QStringList &paramList)
{
initOpenGlBlacklistResources();
@ -242,7 +249,9 @@ QWindowsIntegrationPrivate::QWindowsIntegrationPrivate(const QStringList &paramL
// 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 &paramList) :
d(new QWindowsIntegrationPrivate(paramList))
d(new QWindowsIntegrationPrivate)
{
m_instance = this;
d->parseOptions(this, paramList);
#if QT_CONFIG(clipboard)
d->m_clipboard.registerViewer();
#endif

View File

@ -79,9 +79,7 @@ public:
DontUseWMPointer = 0x400,
DetectAltGrModifier = 0x800,
RtlEnabled = 0x1000,
DarkModeWindowFrames = 0x2000,
DarkModeStyle = 0x4000,
FontDatabaseDirectWrite = 0x8000
FontDatabaseDirectWrite = 0x2000
};
explicit QWindowsIntegration(const QStringList &paramList);

View File

@ -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

View File

@ -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

View File

@ -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));

View File

@ -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);
}

View File

@ -85,7 +85,7 @@
#include <qpa/qplatformscreen.h>
#include <private/qguiapplication_p.h>
#include <private/qhighdpiscaling_p.h>
#include <qpa/qplatformnativeinterface.h>
#include <qpa/qplatformintegration.h>
#include <private/qwidget_p.h>
#include <private/qstylehelper_p.h>
@ -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<bool>()
&& ni->property("darkMode").value<bool>();
if (auto windowsApp = dynamic_cast<QWindowsApplication *>(QGuiApplicationPrivate::platformIntegration())) {
result = windowsApp->isDarkMode()
&& windowsApp->darkModeHandling().testFlag(QWindowsApplication::DarkModeStyle);
}
#endif
return result;