diff --git a/shell_client.cpp b/shell_client.cpp index e9dde7deb3b5d616f3b29e8751ddc29fd4c3d474..36752058c169184c7b79dda7af19ccc1e287de87 100644 --- a/shell_client.cpp +++ b/shell_client.cpp @@ -47,6 +47,7 @@ along with this program. If not, see . #include #include #include +#include #include @@ -59,7 +60,6 @@ along with this program. If not, see . 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 @@ void ShellClient::installAppMenu(AppMenuInterface *menu) 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 @@ bool ShellClient::eventFilter(QObject *watched, QEvent *event) 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/shell_client.h b/shell_client.h index c2dfa2270a782e5f52da27018bd4b8f11b71cde0..3a22acbcf34ea1f9104e94cf6a431f8ca3f024a0 100644 --- a/shell_client.h +++ b/shell_client.h @@ -29,6 +29,7 @@ namespace Server { class ShellSurfaceInterface; class ServerSideDecorationInterface; +class ServerSideDecorationPaletteInterface; class AppMenuInterface; class PlasmaShellSurfaceInterface; class QtExtendedSurfaceInterface; @@ -137,6 +138,7 @@ public: 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 @@ private: 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/wayland_server.cpp b/wayland_server.cpp index 611c715e4aed92298260699c368bc9ed4281c75d..d23fa4043c51212c0964a1a3f85833db3ef137cf 100644 --- a/wayland_server.cpp +++ b/wayland_server.cpp @@ -49,6 +49,7 @@ along with this program. If not, see . #include #include #include +#include #include #include #include @@ -156,6 +157,9 @@ void WaylandServer::createSurface(T *surface) 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 @@ bool WaylandServer::init(const QByteArray &socketName, InitalizationFlags flags) } } ); + 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(); diff --git a/wayland_server.h b/wayland_server.h index 879bff0b1348f654204f3d3be8659fb5b1ff91ed..868a7f01808b810a1caf97460e85c3a54b358872 100644 --- a/wayland_server.h +++ b/wayland_server.h @@ -48,6 +48,7 @@ class DataDeviceInterface; class ShellInterface; class SeatInterface; class ServerSideDecorationManagerInterface; +class ServerSideDecorationPaletteManagerInterface; class SurfaceInterface; class OutputInterface; class PlasmaShellInterface; @@ -221,6 +222,7 @@ private: 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;