KWin
Loading...
Searching...
No Matches
test_server_side_decoration_palette.cpp
Go to the documentation of this file.
1/*
2 SPDX-FileCopyrightText: 2017 David Edmundson <davidedmundson@kde.org>
3 SPDX-FileCopyrightText: 2014 Martin Gräßlin <mgraesslin@kde.org>
4
5 SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL
6*/
7// Qt
8#include <QSignalSpy>
9#include <QTest>
10// KWin
11#include "wayland/compositor.h"
12#include "wayland/display.h"
14
15#include "qwayland-server-decoration-palette.h"
16
17#include "KWayland/Client/compositor.h"
18#include "KWayland/Client/connection_thread.h"
19#include "KWayland/Client/event_queue.h"
20#include "KWayland/Client/registry.h"
21#include "KWayland/Client/surface.h"
22
23class ServerSideDecorationPaletteManager : public QtWayland::org_kde_kwin_server_decoration_palette_manager
24{
25};
26
27class ServerSideDecorationPalette : public QObject, public QtWayland::org_kde_kwin_server_decoration_palette
28{
29 Q_OBJECT
30
31public:
33 {
34 release();
35 }
36};
37
38class TestServerSideDecorationPalette : public QObject
39{
40 Q_OBJECT
41public:
42 explicit TestServerSideDecorationPalette(QObject *parent = nullptr);
43private Q_SLOTS:
44 void init();
45 void cleanup();
46
47 void testCreateAndSet();
48
49private:
50 KWin::Display *m_display;
51 KWin::CompositorInterface *m_compositorInterface;
53 KWayland::Client::ConnectionThread *m_connection;
54 KWayland::Client::Compositor *m_compositor;
55 ServerSideDecorationPaletteManager *m_paletteManager;
56 KWayland::Client::EventQueue *m_queue;
57 QThread *m_thread;
58};
59
60static const QString s_socketName = QStringLiteral("kwayland-test-wayland-decopalette-0");
61
63 : QObject(parent)
64 , m_display(nullptr)
65 , m_compositorInterface(nullptr)
66 , m_connection(nullptr)
67 , m_compositor(nullptr)
68 , m_queue(nullptr)
69 , m_thread(nullptr)
70{
71}
72
73void TestServerSideDecorationPalette::init()
74{
75 using namespace KWin;
76 delete m_display;
77 m_display = new KWin::Display(this);
78 m_display->addSocketName(s_socketName);
79 m_display->start();
80 QVERIFY(m_display->isRunning());
81
82 // setup connection
83 m_connection = new KWayland::Client::ConnectionThread;
84 QSignalSpy connectedSpy(m_connection, &KWayland::Client::ConnectionThread::connected);
85 m_connection->setSocketName(s_socketName);
86
87 m_thread = new QThread(this);
88 m_connection->moveToThread(m_thread);
89 m_thread->start();
90
91 m_connection->initConnection();
92 QVERIFY(connectedSpy.wait());
93
94 m_queue = new KWayland::Client::EventQueue(this);
95 QVERIFY(!m_queue->isValid());
96 m_queue->setup(m_connection);
97 QVERIFY(m_queue->isValid());
98
99 m_compositorInterface = new CompositorInterface(m_display, m_display);
100 m_paletteManagerInterface = new ServerSideDecorationPaletteManagerInterface(m_display, m_display);
101
102 KWayland::Client::Registry registry;
103
104 connect(&registry, &KWayland::Client::Registry::interfaceAnnounced, this, [this, &registry](const QByteArray &interfaceName, quint32 name, quint32 version) {
105 if (interfaceName == org_kde_kwin_server_decoration_palette_manager_interface.name) {
106 m_paletteManager = new ServerSideDecorationPaletteManager();
107 m_paletteManager->init(registry.registry(), name, version);
108 }
109 });
110
111 QSignalSpy interfacesAnnouncedSpy(&registry, &KWayland::Client::Registry::interfacesAnnounced);
112 QSignalSpy compositorSpy(&registry, &KWayland::Client::Registry::compositorAnnounced);
113
114 QVERIFY(!registry.eventQueue());
115 registry.setEventQueue(m_queue);
116 QCOMPARE(registry.eventQueue(), m_queue);
117 registry.create(m_connection->display());
118 QVERIFY(registry.isValid());
119 registry.setup();
120 QVERIFY(interfacesAnnouncedSpy.wait());
121
122 m_compositor = registry.createCompositor(compositorSpy.first().first().value<quint32>(), compositorSpy.first().last().value<quint32>(), this);
123
124 QVERIFY(m_compositor);
125 QVERIFY(m_paletteManager);
126}
127
128void TestServerSideDecorationPalette::cleanup()
129{
130#define CLEANUP(variable) \
131 if (variable) { \
132 delete variable; \
133 variable = nullptr; \
134 }
135 CLEANUP(m_compositor)
136 CLEANUP(m_paletteManager)
137 CLEANUP(m_queue)
138 if (m_connection) {
139 m_connection->deleteLater();
140 m_connection = nullptr;
141 }
142 if (m_thread) {
143 m_thread->quit();
144 m_thread->wait();
145 delete m_thread;
146 m_thread = nullptr;
147 }
148 CLEANUP(m_compositorInterface)
149 CLEANUP(m_paletteManagerInterface)
150 CLEANUP(m_display)
151#undef CLEANUP
152}
153
154void TestServerSideDecorationPalette::testCreateAndSet()
155{
156 QSignalSpy serverSurfaceCreated(m_compositorInterface, &KWin::CompositorInterface::surfaceCreated);
157
158 std::unique_ptr<KWayland::Client::Surface> surface(m_compositor->createSurface());
159 QVERIFY(serverSurfaceCreated.wait());
160
161 auto serverSurface = serverSurfaceCreated.first().first().value<KWin::SurfaceInterface *>();
162 QSignalSpy paletteCreatedSpy(m_paletteManagerInterface, &KWin::ServerSideDecorationPaletteManagerInterface::paletteCreated);
163
164 QVERIFY(!m_paletteManagerInterface->paletteForSurface(serverSurface));
165
166 auto palette = std::make_unique<ServerSideDecorationPalette>();
167 palette->init(m_paletteManager->create(*surface.get()));
168 QVERIFY(paletteCreatedSpy.wait());
169 auto paletteInterface = paletteCreatedSpy.first().first().value<KWin::ServerSideDecorationPaletteInterface *>();
170 QCOMPARE(m_paletteManagerInterface->paletteForSurface(serverSurface), paletteInterface);
171
172 QCOMPARE(paletteInterface->palette(), QString());
173
174 QSignalSpy changedSpy(paletteInterface, &KWin::ServerSideDecorationPaletteInterface::paletteChanged);
175 palette->set_palette(QStringLiteral("foobar"));
176 QVERIFY(changedSpy.wait());
177 QCOMPARE(paletteInterface->palette(), QString("foobar"));
178
179 // and destroy
180 QSignalSpy destroyedSpy(paletteInterface, &QObject::destroyed);
181 palette.reset();
182 QVERIFY(destroyedSpy.wait());
183 QVERIFY(!m_paletteManagerInterface->paletteForSurface(serverSurface));
184}
185
186QTEST_GUILESS_MAIN(TestServerSideDecorationPalette)
187#include "test_server_side_decoration_palette.moc"
void surfaceCreated(KWin::SurfaceInterface *surface)
Class holding the Wayland server display loop.
Definition display.h:34
bool addSocketName(const QString &name=QString())
Definition display.cpp:68
bool isRunning() const
Definition display.cpp:144
bool start()
Definition display.cpp:92
void paletteChanged(const QString &palette)
void paletteCreated(KWin::ServerSideDecorationPaletteInterface *)
ServerSideDecorationPaletteInterface * paletteForSurface(SurfaceInterface *)
Resource representing a wl_surface.
Definition surface.h:80
KWayland::Client::Registry * registry
#define CLEANUP(variable)
constexpr int version