diff --git a/src/platformtheme/kwaylandintegration.h b/src/platformtheme/kwaylandintegration.h --- a/src/platformtheme/kwaylandintegration.h +++ b/src/platformtheme/kwaylandintegration.h @@ -22,6 +22,8 @@ #include +class QWindow; + namespace KWayland { namespace Client @@ -41,6 +43,7 @@ bool eventFilter(QObject *watched, QEvent *event) Q_DECL_OVERRIDE; private: + void installColorScheme(QWindow *w); KWayland::Client::ServerSideDecorationManager *m_decoration; }; diff --git a/src/platformtheme/kwaylandintegration.cpp b/src/platformtheme/kwaylandintegration.cpp --- a/src/platformtheme/kwaylandintegration.cpp +++ b/src/platformtheme/kwaylandintegration.cpp @@ -19,16 +19,19 @@ */ #include "kwaylandintegration.h" -#include +#include #include +#include #include #include #include #include using namespace KWayland::Client; +static const QByteArray s_schemePropertyName = QByteArrayLiteral("KDE_COLOR_SCHEME_PATH"); + KWaylandIntegration::KWaylandIntegration() : QObject() , m_decoration(Q_NULLPTR) @@ -73,6 +76,11 @@ if (auto e = dynamic_cast(event)) { switch (e->surfaceEventType()) { case QPlatformSurfaceEvent::SurfaceCreated: { + // set colorscheme hint + if (qApp->property(s_schemePropertyName.constData()).isValid()) { + installColorScheme(w); + } + // create deco Surface *s = Surface::fromWindow(w); if (!s) { return false; @@ -105,5 +113,20 @@ } } } + if (event->type() == QEvent::ApplicationPaletteChange) { + const auto topLevelWindows = QGuiApplication::topLevelWindows(); + for (QWindow *w : topLevelWindows) { + installColorScheme(w); + } + } return false; } + +void KWaylandIntegration::installColorScheme(QWindow *w) +{ + if (QPlatformNativeInterface *native = qApp->platformNativeInterface()) { + if (QPlatformWindow *pw = w->handle()) { + native->setWindowProperty(pw, QString::fromUtf8(s_schemePropertyName), qApp->property(s_schemePropertyName.constData())); + } + } +}