14#include "qwayland-server-decoration.h"
16#include "KWayland/Client/compositor.h"
17#include "KWayland/Client/connection_thread.h"
18#include "KWayland/Client/event_queue.h"
19#include "KWayland/Client/registry.h"
20#include "KWayland/Client/surface.h"
42 Q_EMIT
modeChanged(ServerSideDecorationManager::mode(mode));
55 void testCreate_data();
58 void testRequest_data();
61 void testSurfaceDestroy();
67 KWayland::Client::ConnectionThread *m_connection =
nullptr;
68 KWayland::Client::Compositor *m_compositor =
nullptr;
69 KWayland::Client::EventQueue *m_queue =
nullptr;
71 QThread *m_thread =
nullptr;
72 KWayland::Client::Registry *m_registry =
nullptr;
75static const QString s_socketName = QStringLiteral(
"kwayland-test-wayland-server-side-decoration-0");
82void TestServerSideDecoration::init()
92 m_connection =
new KWayland::Client::ConnectionThread;
93 QSignalSpy connectedSpy(m_connection, &KWayland::Client::ConnectionThread::connected);
94 m_connection->setSocketName(s_socketName);
96 m_thread =
new QThread(
this);
97 m_connection->moveToThread(m_thread);
100 m_connection->initConnection();
101 QVERIFY(connectedSpy.wait());
103 m_queue =
new KWayland::Client::EventQueue(
this);
104 QVERIFY(!m_queue->isValid());
105 m_queue->setup(m_connection);
106 QVERIFY(m_queue->isValid());
111 m_registry =
new KWayland::Client::Registry();
112 connect(m_registry, &KWayland::Client::Registry::interfaceAnnounced,
this, [
this](
const QByteArray &interfaceName, quint32 name, quint32
version) {
113 if (interfaceName == org_kde_kwin_server_decoration_manager_interface.name) {
114 m_serverSideDecorationManager = new ServerSideDecorationManager();
115 m_serverSideDecorationManager->init(*m_registry, name, version);
119 QSignalSpy interfacesAnnouncedSpy(m_registry, &KWayland::Client::Registry::interfacesAnnounced);
120 QSignalSpy compositorSpy(m_registry, &KWayland::Client::Registry::compositorAnnounced);
122 QVERIFY(!m_registry->eventQueue());
123 m_registry->setEventQueue(m_queue);
124 QCOMPARE(m_registry->eventQueue(), m_queue);
125 m_registry->create(m_connection);
126 QVERIFY(m_registry->isValid());
128 QVERIFY(interfacesAnnouncedSpy.wait());
130 m_compositor = m_registry->createCompositor(compositorSpy.first().first().value<quint32>(), compositorSpy.first().last().value<quint32>(),
this);
132 QVERIFY(m_compositor);
133 QVERIFY(m_serverSideDecorationManager);
136void TestServerSideDecoration::cleanup()
140 m_compositor =
nullptr;
142 if (m_serverSideDecorationManager) {
143 delete m_serverSideDecorationManager;
144 m_serverSideDecorationManager =
nullptr;
148 m_registry =
nullptr;
163 m_connection =
nullptr;
169void TestServerSideDecoration::testCreate_data()
171 using namespace KWin;
172 QTest::addColumn<ServerSideDecorationManagerInterface::Mode>(
"serverMode");
173 QTest::addColumn<ServerSideDecorationManager::mode>(
"clientMode");
175 QTest::newRow(
"none") << ServerSideDecorationManagerInterface::Mode::None << ServerSideDecorationManager::mode_None;
176 QTest::newRow(
"client") << ServerSideDecorationManagerInterface::Mode::Client << ServerSideDecorationManager::mode_Client;
177 QTest::newRow(
"server") << ServerSideDecorationManagerInterface::Mode::Server << ServerSideDecorationManager::mode_Server;
180void TestServerSideDecoration::testCreate()
182 using namespace KWin;
184 m_serverSideDecorationManagerInterface->
setDefaultMode(serverMode);
185 QCOMPARE(m_serverSideDecorationManagerInterface->
defaultMode(), serverMode);
187 QSignalSpy serverSurfaceCreated(m_compositorInterface, &CompositorInterface::surfaceCreated);
188 QSignalSpy decorationCreated(m_serverSideDecorationManagerInterface, &ServerSideDecorationManagerInterface::decorationCreated);
190 std::unique_ptr<KWayland::Client::Surface> surface(m_compositor->createSurface());
191 QVERIFY(serverSurfaceCreated.wait());
193 auto serverSurface = serverSurfaceCreated.first().first().value<
SurfaceInterface *>();
194 QVERIFY(!ServerSideDecorationInterface::get(serverSurface));
197 auto serverSideDecoration = std::make_unique<ServerSideDecoration>();
198 serverSideDecoration->init(m_serverSideDecorationManager->create(*surface.get()));
201 QVERIFY(decorationCreated.wait());
205 QCOMPARE(serverDeco, ServerSideDecorationInterface::get(serverSurface));
206 QCOMPARE(serverDeco->surface(), serverSurface);
209 QVERIFY(modeChangedSpy.wait());
210 QCOMPARE(modeChangedSpy.count(), 1);
211 QTEST(modeChangedSpy.last().at(0).value<ServerSideDecorationManager::mode>(),
"clientMode");
214 QSignalSpy destroyedSpy(serverDeco, &QObject::destroyed);
215 serverSideDecoration.reset();
216 QVERIFY(destroyedSpy.wait());
219void TestServerSideDecoration::testRequest_data()
221 using namespace KWin;
222 QTest::addColumn<ServerSideDecorationManagerInterface::Mode>(
"defaultMode");
223 QTest::addColumn<ServerSideDecorationManager::mode>(
"clientMode");
224 QTest::addColumn<ServerSideDecorationManager::mode>(
"clientRequestMode");
225 QTest::addColumn<ServerSideDecorationManagerInterface::Mode>(
"serverRequestedMode");
227 const auto serverNone = ServerSideDecorationManagerInterface::Mode::None;
228 const auto serverClient = ServerSideDecorationManagerInterface::Mode::Client;
229 const auto serverServer = ServerSideDecorationManagerInterface::Mode::Server;
230 const auto clientNone = ServerSideDecorationManager::mode_None;
231 const auto clientClient = ServerSideDecorationManager::mode_Client;
232 const auto clientServer = ServerSideDecorationManager::mode_Server;
234 QTest::newRow(
"none->none") << serverNone << clientNone << clientNone << serverNone;
235 QTest::newRow(
"none->client") << serverNone << clientNone << clientClient << serverClient;
236 QTest::newRow(
"none->server") << serverNone << clientNone << clientServer << serverServer;
237 QTest::newRow(
"client->none") << serverClient << clientClient << clientNone << serverNone;
238 QTest::newRow(
"client->client") << serverClient << clientClient << clientClient << serverClient;
239 QTest::newRow(
"client->server") << serverClient << clientClient << clientServer << serverServer;
240 QTest::newRow(
"server->none") << serverServer << clientServer << clientNone << serverNone;
241 QTest::newRow(
"server->client") << serverServer << clientServer << clientClient << serverClient;
242 QTest::newRow(
"server->server") << serverServer << clientServer << clientServer << serverServer;
245void TestServerSideDecoration::testRequest()
247 using namespace KWin;
249 m_serverSideDecorationManagerInterface->
setDefaultMode(defaultMode);
250 QCOMPARE(m_serverSideDecorationManagerInterface->
defaultMode(), defaultMode);
252 QSignalSpy serverSurfaceCreated(m_compositorInterface, &CompositorInterface::surfaceCreated);
253 QSignalSpy decorationCreated(m_serverSideDecorationManagerInterface, &ServerSideDecorationManagerInterface::decorationCreated);
256 std::unique_ptr<KWayland::Client::Surface> surface(m_compositor->createSurface());
258 auto serverSideDecoration = std::make_unique<ServerSideDecoration>();
259 serverSideDecoration->init(m_serverSideDecorationManager->create(*surface.get()));
261 QVERIFY(decorationCreated.wait());
265 QSignalSpy preferredModeChangedSpy(serverDeco, &ServerSideDecorationInterface::preferredModeChanged);
268 QVERIFY(modeChangedSpy.wait());
269 QCOMPARE(modeChangedSpy.count(), 1);
270 QTEST(modeChangedSpy.last().at(0).value<ServerSideDecorationManager::mode>(),
"clientMode");
273 QFETCH(ServerSideDecorationManager::mode, clientRequestMode);
274 serverSideDecoration->request_mode(clientRequestMode);
276 QCOMPARE(modeChangedSpy.count(), 1);
278 QVERIFY(preferredModeChangedSpy.wait());
279 QCOMPARE(preferredModeChangedSpy.count(), 1);
281 QCOMPARE(serverDeco->preferredMode(), serverRequestedMode);
284 QCOMPARE(serverDeco->mode(), defaultMode);
285 serverDeco->setMode(serverRequestedMode);
286 QCOMPARE(serverDeco->mode(), serverRequestedMode);
289 QVERIFY(modeChangedSpy.wait());
290 QCOMPARE(modeChangedSpy.count(), 2);
291 QCOMPARE(modeChangedSpy.last().at(0).value<ServerSideDecorationManager::mode>(), clientRequestMode);
294void TestServerSideDecoration::testSurfaceDestroy()
296 using namespace KWin;
297 QSignalSpy serverSurfaceCreated(m_compositorInterface, &CompositorInterface::surfaceCreated);
298 QSignalSpy decorationCreated(m_serverSideDecorationManagerInterface, &ServerSideDecorationManagerInterface::decorationCreated);
300 std::unique_ptr<KWayland::Client::Surface> surface(m_compositor->createSurface());
301 QVERIFY(serverSurfaceCreated.wait());
303 auto serverSurface = serverSurfaceCreated.first().first().value<
SurfaceInterface *>();
304 auto serverSideDecoration = std::make_unique<ServerSideDecoration>();
305 serverSideDecoration->init(m_serverSideDecorationManager->create(*surface.get()));
307 QVERIFY(decorationCreated.wait());
312 QSignalSpy surfaceDestroyedSpy(serverSurface, &QObject::destroyed);
313 QSignalSpy decorationDestroyedSpy(serverDeco, &QObject::destroyed);
315 QVERIFY(surfaceDestroyedSpy.wait());
316 QVERIFY(decorationDestroyedSpy.isEmpty());
318 serverSideDecoration.reset();
319 QVERIFY(decorationDestroyedSpy.wait());
323#include "test_server_side_decoration.moc"
Class holding the Wayland server display loop.
bool addSocketName(const QString &name=QString())
Representing how a SurfaceInterface should be decorated.
Manager to create ServerSideDecorationInterface.
void setDefaultMode(Mode mode)
Resource representing a wl_surface.
static SurfaceInterface * get(wl_resource *native)
~ServerSideDecoration() override
void org_kde_kwin_server_decoration_mode(uint32_t mode) override
void modeChanged(ServerSideDecorationManager::mode mode)
TestServerSideDecoration(QObject *parent=nullptr)