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:
parent
f06dfb60b9
commit
6d4b3582ad
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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());
|
||||
|
@ -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
|
||||
|
@ -79,9 +79,7 @@ public:
|
||||
DontUseWMPointer = 0x400,
|
||||
DetectAltGrModifier = 0x800,
|
||||
RtlEnabled = 0x1000,
|
||||
DarkModeWindowFrames = 0x2000,
|
||||
DarkModeStyle = 0x4000,
|
||||
FontDatabaseDirectWrite = 0x8000
|
||||
FontDatabaseDirectWrite = 0x2000
|
||||
};
|
||||
|
||||
explicit QWindowsIntegration(const QStringList ¶mList);
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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));
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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;
|
||||
|
Loading…
x
Reference in New Issue
Block a user