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/shm_pool.h"
21#include "KWayland/Client/surface.h"
23#include "qwayland-viewporter.h"
47 KWayland::Client::ConnectionThread *m_connection;
48 KWayland::Client::EventQueue *m_queue;
49 KWayland::Client::Compositor *m_clientCompositor;
50 KWayland::Client::ShmPool *m_shm;
58static const QString s_socketName = QStringLiteral(
"kwin-wayland-server-viewporter-test-0");
60void TestViewporterInterface::initTestCase()
71 m_connection =
new KWayland::Client::ConnectionThread;
72 QSignalSpy connectedSpy(m_connection, &KWayland::Client::ConnectionThread::connected);
73 m_connection->setSocketName(s_socketName);
75 m_thread =
new QThread(
this);
76 m_connection->moveToThread(m_thread);
79 m_connection->initConnection();
80 QVERIFY(connectedSpy.wait());
81 QVERIFY(!m_connection->connections().isEmpty());
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 auto registry =
new KWayland::Client::Registry(
this);
89 connect(registry, &KWayland::Client::Registry::interfaceAnnounced,
this, [
this, registry](
const QByteArray &interface, quint32
id, quint32
version) {
90 if (interface == QByteArrayLiteral(
"wp_viewporter")) {
92 m_viewporter->init(*registry,
id,
version);
95 QSignalSpy allAnnouncedSpy(registry, &KWayland::Client::Registry::interfaceAnnounced);
96 QSignalSpy compositorSpy(registry, &KWayland::Client::Registry::compositorAnnounced);
97 QSignalSpy shmSpy(registry, &KWayland::Client::Registry::shmAnnounced);
99 registry->create(m_connection->display());
102 QVERIFY(allAnnouncedSpy.wait());
104 m_clientCompositor =
registry->createCompositor(compositorSpy.first().first().value<quint32>(), compositorSpy.first().last().value<quint32>(),
this);
105 QVERIFY(m_clientCompositor->isValid());
107 m_shm =
registry->createShmPool(shmSpy.first().first().value<quint32>(), shmSpy.first().last().value<quint32>(),
this);
108 QVERIFY(m_shm->isValid());
115 m_viewporter =
nullptr;
131 m_connection->deleteLater();
132 m_connection =
nullptr;
135void TestViewporterInterface::testCropScale()
139 std::unique_ptr<KWayland::Client::Surface> clientSurface(m_clientCompositor->createSurface(
this));
140 QVERIFY(serverSurfaceCreatedSpy.wait());
142 QVERIFY(serverSurface);
149 QImage image(QSize(200, 100), QImage::Format_ARGB32_Premultiplied);
150 image.fill(Qt::black);
151 KWayland::Client::Buffer::Ptr buffer = m_shm->createBuffer(image);
152 clientSurface->attachBuffer(buffer);
153 clientSurface->setScale(2);
154 clientSurface->damage(image.rect());
155 clientSurface->commit(KWayland::Client::Surface::CommitFlag::None);
156 QVERIFY(serverSurfaceMappedSpy.wait());
157 QCOMPARE(bufferSourceBoxChangedSpy.count(), 1);
158 QCOMPARE(serverSurface->
size(), QSize(100, 50));
162 std::unique_ptr<Viewport> clientViewport(
new Viewport);
163 clientViewport->init(m_viewporter->get_viewport(*clientSurface));
166 clientViewport->set_source(wl_fixed_from_double(10), wl_fixed_from_double(10), wl_fixed_from_double(30), wl_fixed_from_double(20));
167 clientSurface->commit(KWayland::Client::Surface::CommitFlag::None);
168 QVERIFY(serverSurfaceSizeChangedSpy.wait());
169 QCOMPARE(bufferSourceBoxChangedSpy.count(), 2);
170 QCOMPARE(serverSurface->
size(), QSize(30, 20));
174 clientViewport->set_destination(500, 250);
175 clientSurface->commit(KWayland::Client::Surface::CommitFlag::None);
176 QVERIFY(serverSurfaceSizeChangedSpy.wait());
177 QCOMPARE(bufferSourceBoxChangedSpy.count(), 2);
178 QCOMPARE(serverSurface->
size(), QSize(500, 250));
182 clientViewport->destroy();
183 clientSurface->commit(KWayland::Client::Surface::CommitFlag::None);
184 QVERIFY(serverSurfaceSizeChangedSpy.wait());
185 QCOMPARE(bufferSourceBoxChangedSpy.count(), 3);
186 QCOMPARE(serverSurface->
size(), QSize(100, 50));
192#include "test_viewporter_interface.moc"
void surfaceCreated(KWin::SurfaceInterface *surface)
Class holding the Wayland server display loop.
bool addSocketName(const QString &name=QString())
Resource representing a wl_surface.
QRectF bufferSourceBox() const
void bufferSourceBoxChanged()
~TestViewporterInterface() override
KWayland::Client::Registry * registry