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;