15#include "KWayland/Client/compositor.h"
16#include "KWayland/Client/connection_thread.h"
17#include "KWayland/Client/event_queue.h"
18#include "KWayland/Client/registry.h"
19#include "KWayland/Client/surface.h"
20#include "KWayland/Client/xdgdecoration.h"
21#include "KWayland/Client/xdgshell.h"
32 void testDecoration_data();
33 void testDecoration();
41 KWayland::Client::ConnectionThread *m_connection =
nullptr;
42 KWayland::Client::Compositor *m_compositor =
nullptr;
43 KWayland::Client::EventQueue *m_queue =
nullptr;
44 KWayland::Client::XdgShell *m_xdgShell =
nullptr;
45 KWayland::Client::XdgDecorationManager *m_xdgDecorationManager =
nullptr;
47 QThread *m_thread =
nullptr;
48 KWayland::Client::Registry *m_registry =
nullptr;
51static const QString s_socketName = QStringLiteral(
"kwayland-test-wayland-server-side-decoration-0");
58void TestXdgDecoration::init()
62 qRegisterMetaType<KWayland::Client::XdgDecoration::Mode>();
63 qRegisterMetaType<XdgToplevelDecorationV1Interface::Mode>();
72 m_connection =
new KWayland::Client::ConnectionThread;
73 QSignalSpy connectedSpy(m_connection, &KWayland::Client::ConnectionThread::connected);
74 m_connection->setSocketName(s_socketName);
76 m_thread =
new QThread(
this);
77 m_connection->moveToThread(m_thread);
80 m_connection->initConnection();
81 QVERIFY(connectedSpy.wait());
83 m_queue =
new KWayland::Client::EventQueue(
this);
84 QVERIFY(!m_queue->isValid());
85 m_queue->setup(m_connection);
86 QVERIFY(m_queue->isValid());
88 m_registry =
new KWayland::Client::Registry();
89 QSignalSpy compositorSpy(m_registry, &KWayland::Client::Registry::compositorAnnounced);
90 QSignalSpy xdgShellSpy(m_registry, &KWayland::Client::Registry::xdgShellStableAnnounced);
91 QSignalSpy xdgDecorationManagerSpy(m_registry, &KWayland::Client::Registry::xdgDecorationAnnounced);
93 QVERIFY(!m_registry->eventQueue());
94 m_registry->setEventQueue(m_queue);
95 QCOMPARE(m_registry->eventQueue(), m_queue);
96 m_registry->create(m_connection);
97 QVERIFY(m_registry->isValid());
101 QVERIFY(compositorSpy.wait());
102 m_compositor = m_registry->createCompositor(compositorSpy.first().first().value<quint32>(), compositorSpy.first().last().value<quint32>(),
this);
105 QVERIFY(xdgShellSpy.wait());
106 m_xdgShell = m_registry->createXdgShell(xdgShellSpy.first().first().value<quint32>(), xdgShellSpy.first().last().value<quint32>(),
this);
110 QVERIFY(xdgDecorationManagerSpy.wait());
111 m_xdgDecorationManager = m_registry->createXdgDecorationManager(xdgDecorationManagerSpy.first().first().value<quint32>(),
112 xdgDecorationManagerSpy.first().last().value<quint32>(),
116void TestXdgDecoration::cleanup()
120 m_compositor =
nullptr;
124 m_xdgShell =
nullptr;
126 if (m_xdgDecorationManager) {
127 delete m_xdgDecorationManager;
128 m_xdgDecorationManager =
nullptr;
136 m_registry =
nullptr;
145 m_connection =
nullptr;
151void TestXdgDecoration::testDecoration_data()
153 using namespace KWin;
154 QTest::addColumn<KWin::XdgToplevelDecorationV1Interface::Mode>(
"configuredMode");
155 QTest::addColumn<KWayland::Client::XdgDecoration::Mode>(
"configuredModeExp");
156 QTest::addColumn<KWayland::Client::XdgDecoration::Mode>(
"setMode");
157 QTest::addColumn<KWin::XdgToplevelDecorationV1Interface::Mode>(
"setModeExp");
159 const auto serverClient = XdgToplevelDecorationV1Interface::Mode::Client;
160 const auto serverServer = XdgToplevelDecorationV1Interface::Mode::Server;
161 const auto clientClient = KWayland::Client::XdgDecoration::Mode::ClientSide;
162 const auto clientServer = KWayland::Client::XdgDecoration::Mode::ServerSide;
164 QTest::newRow(
"client->client") << serverClient << clientClient << clientClient << serverClient;
165 QTest::newRow(
"client->server") << serverClient << clientClient << clientServer << serverServer;
166 QTest::newRow(
"server->client") << serverServer << clientServer << clientClient << serverClient;
167 QTest::newRow(
"server->server") << serverServer << clientServer << clientServer << serverServer;
170void TestXdgDecoration::testDecoration()
172 using namespace KWin;
175 QFETCH(KWayland::Client::XdgDecoration::Mode, configuredModeExp);
176 QFETCH(KWayland::Client::XdgDecoration::Mode, setMode);
179 QSignalSpy surfaceCreatedSpy(m_compositorInterface, &CompositorInterface::surfaceCreated);
180 QSignalSpy shellSurfaceCreatedSpy(m_xdgShellInterface, &XdgShellInterface::toplevelCreated);
181 QSignalSpy decorationCreatedSpy(m_xdgDecorationManagerInterface, &XdgDecorationManagerV1Interface::decorationCreated);
184 std::unique_ptr<KWayland::Client::Surface> surface(m_compositor->createSurface());
185 std::unique_ptr<KWayland::Client::XdgShellSurface> shellSurface(m_xdgShell->createSurface(surface.get()));
186 std::unique_ptr<KWayland::Client::XdgDecoration> decoration(m_xdgDecorationManager->getToplevelDecoration(shellSurface.get()));
189 QVERIFY(surfaceCreatedSpy.count() || surfaceCreatedSpy.wait());
190 QVERIFY(shellSurfaceCreatedSpy.count() || shellSurfaceCreatedSpy.wait());
191 QVERIFY(decorationCreatedSpy.count() || decorationCreatedSpy.wait());
193 auto shellSurfaceIface = shellSurfaceCreatedSpy.first().first().value<
XdgToplevelInterface *>();
196 QVERIFY(decorationIface);
197 QVERIFY(shellSurfaceIface);
198 QCOMPARE(decorationIface->toplevel(), shellSurfaceIface);
199 QCOMPARE(decorationIface->preferredMode(), XdgToplevelDecorationV1Interface::Mode::Undefined);
201 QSignalSpy clientConfiguredSpy(decoration.get(), &KWayland::Client::XdgDecoration::modeChanged);
202 QSignalSpy modeRequestedSpy(decorationIface, &XdgToplevelDecorationV1Interface::preferredModeChanged);
206 quint32 serial = shellSurfaceIface->sendConfigure(QSize(0, 0), {});
207 QVERIFY(clientConfiguredSpy.wait());
208 QCOMPARE(clientConfiguredSpy.first().first().value<KWayland::Client::XdgDecoration::Mode>(), configuredModeExp);
210 shellSurface->ackConfigure(serial);
213 decoration->setMode(setMode);
214 QVERIFY(modeRequestedSpy.wait());
216 QCOMPARE(decorationIface->preferredMode(), setModeExp);
217 modeRequestedSpy.clear();
219 decoration->unsetMode();
220 QVERIFY(modeRequestedSpy.wait());
225#include "test_xdg_decoration.moc"
Class holding the Wayland server display loop.
bool addSocketName(const QString &name=QString())
quint32 sendConfigure(const QSize &size, const States &states)
TestXdgDecoration(QObject *parent=nullptr)