diff --git a/shell_client.h b/shell_client.h --- a/shell_client.h +++ b/shell_client.h @@ -29,6 +29,7 @@ { class ShellSurfaceInterface; class ServerSideDecorationInterface; +class ServerSideDecorationPaletteInterface; class AppMenuInterface; class PlasmaShellSurfaceInterface; class QtExtendedSurfaceInterface; @@ -137,6 +138,7 @@ void installQtExtendedSurface(KWayland::Server::QtExtendedSurfaceInterface *surface); void installServerSideDecoration(KWayland::Server::ServerSideDecorationInterface *decoration); void installAppMenu(KWayland::Server::AppMenuInterface *appmenu); + void installPalette(KWayland::Server::ServerSideDecorationPaletteInterface *palette); bool isInitialPositionSet() const override; @@ -220,6 +222,7 @@ QPointer m_plasmaShellSurface; QPointer m_qtExtendedSurface; QPointer m_appMenuInterface; + QPointer m_paletteInterface; KWayland::Server::ServerSideDecorationInterface *m_serverDecoration = nullptr; bool m_userNoBorder = false; bool m_fullScreen = false; diff --git a/shell_client.cpp b/shell_client.cpp --- a/shell_client.cpp +++ b/shell_client.cpp @@ -47,6 +47,7 @@ #include #include #include +#include #include @@ -59,7 +60,6 @@ using namespace KWayland::Server; -static const QByteArray s_schemePropertyName = QByteArrayLiteral("KDE_COLOR_SCHEME_PATH"); static const QByteArray s_skipClosePropertyName = QByteArrayLiteral("KWIN_SKIP_CLOSE_ANIMATION"); namespace KWin @@ -1387,14 +1387,25 @@ updateMenu(menu->address()); } +void ShellClient::installPalette(ServerSideDecorationPaletteInterface *palette) +{ + m_paletteInterface = palette; + + auto updatePalette = [this](const QString &palette) { + AbstractClient::updateColorScheme(rules()->checkDecoColor(palette)); + }; + connect(m_paletteInterface, &ServerSideDecorationPaletteInterface::paletteChanged, this, [=](const QString &palette) { + updatePalette(palette); + }); + connect(m_paletteInterface, &QObject::destroyed, this, [=]() { + updatePalette(QString()); + }); + updatePalette(palette->palette()); +} + + bool ShellClient::eventFilter(QObject *watched, QEvent *event) { - if (watched == m_qtExtendedSurface.data() && event->type() == QEvent::DynamicPropertyChange) { - QDynamicPropertyChangeEvent *pe = static_cast(event); - if (pe->propertyName() == s_schemePropertyName) { - AbstractClient::updateColorScheme(rules()->checkDecoColor(m_qtExtendedSurface->property(pe->propertyName().constData()).toString())); - } - } if (watched == m_internalWindow && event->type() == QEvent::DynamicPropertyChange) { QDynamicPropertyChangeEvent *pe = static_cast(event); if (pe->propertyName() == s_skipClosePropertyName) { @@ -1406,8 +1417,8 @@ void ShellClient::updateColorScheme() { - if (m_qtExtendedSurface) { - AbstractClient::updateColorScheme(rules()->checkDecoColor(m_qtExtendedSurface->property(s_schemePropertyName.constData()).toString())); + if (m_paletteInterface) { + AbstractClient::updateColorScheme(rules()->checkDecoColor(m_paletteInterface->palette())); } else { AbstractClient::updateColorScheme(rules()->checkDecoColor(QString())); } diff --git a/wayland_server.h b/wayland_server.h --- a/wayland_server.h +++ b/wayland_server.h @@ -48,6 +48,7 @@ class ShellInterface; class SeatInterface; class ServerSideDecorationManagerInterface; +class ServerSideDecorationPaletteManagerInterface; class SurfaceInterface; class OutputInterface; class PlasmaShellInterface; @@ -221,6 +222,7 @@ KWayland::Server::ServerSideDecorationManagerInterface *m_decorationManager = nullptr; KWayland::Server::OutputManagementInterface *m_outputManagement = nullptr; KWayland::Server::AppMenuManagerInterface *m_appMenuManager = nullptr; + KWayland::Server::ServerSideDecorationPaletteManagerInterface *m_paletteManager = nullptr; struct { KWayland::Server::ClientConnection *client = nullptr; QMetaObject::Connection destroyConnection; diff --git a/wayland_server.cpp b/wayland_server.cpp --- a/wayland_server.cpp +++ b/wayland_server.cpp @@ -49,6 +49,7 @@ #include #include #include +#include #include #include #include @@ -156,6 +157,9 @@ if (auto menu = m_appMenuManager->appMenuForSurface(surface->surface())) { client->installAppMenu(menu); } + if (auto palette = m_paletteManager->paletteForSurface(surface->surface())) { + client->installPalette(palette); + } if (client->isInternal()) { m_internalClients << client; } else { @@ -286,6 +290,15 @@ } } ); + m_paletteManager = m_display->createServerSideDecorationPaletteManager(m_display); + m_paletteManager->create(); + connect(m_paletteManager, &ServerSideDecorationPaletteManagerInterface::paletteCreated, + [this] (ServerSideDecorationPaletteInterface *palette) { + if (ShellClient *client = findClient(palette->surface())) { + client->installPalette(palette); + } + } + ); m_windowManagement = m_display->createPlasmaWindowManagement(m_display); m_windowManagement->create();