13#include "KWayland/Client/connection_thread.h"
14#include "KWayland/Client/event_queue.h"
15#include "KWayland/Client/output.h"
16#include "KWayland/Client/registry.h"
21#include <wayland-client-protocol.h>
33 void testModeChange();
34 void testScaleChange();
36 void testSubPixel_data();
39 void testTransform_data();
44 KWayland::Client::ConnectionThread *m_connection;
45 KWayland::Client::EventQueue *m_queue;
49static const QString s_socketName = QStringLiteral(
"kwin-test-wayland-output-0");
54 , m_connection(nullptr)
59void TestWaylandOutput::init()
68 m_connection =
new KWayland::Client::ConnectionThread;
69 QSignalSpy connectedSpy(m_connection, &KWayland::Client::ConnectionThread::connected);
70 m_connection->setSocketName(s_socketName);
72 m_thread =
new QThread(
this);
73 m_connection->moveToThread(m_thread);
76 m_connection->initConnection();
77 QVERIFY(connectedSpy.wait());
79 m_queue =
new KWayland::Client::EventQueue(
this);
80 QVERIFY(!m_queue->isValid());
81 m_queue->setup(m_connection);
82 QVERIFY(m_queue->isValid());
85void TestWaylandOutput::cleanup()
98 m_connection =
nullptr;
104void TestWaylandOutput::testRegistry()
106 auto outputHandle = std::make_unique<FakeOutput>();
107 outputHandle->setMode(QSize(1024, 768), 60000);
108 outputHandle->moveTo(QPoint(100, 50));
109 outputHandle->setPhysicalSize(QSize(200, 100));
111 auto outputInterface = std::make_unique<KWin::OutputInterface>(m_display, outputHandle.get());
113 KWayland::Client::Registry
registry;
114 QSignalSpy announced(®istry, &KWayland::Client::Registry::outputAnnounced);
115 registry.create(m_connection->display());
118 wl_display_flush(m_connection->display());
119 QVERIFY(announced.wait());
121 KWayland::Client::Output output;
122 QVERIFY(!output.isValid());
123 QCOMPARE(output.geometry(), QRect());
124 QCOMPARE(output.globalPosition(), QPoint());
125 QCOMPARE(output.manufacturer(), QString());
126 QCOMPARE(output.model(), QString());
127 QCOMPARE(output.physicalSize(), QSize());
128 QCOMPARE(output.pixelSize(), QSize());
129 QCOMPARE(output.refreshRate(), 0);
130 QCOMPARE(output.scale(), 1);
131 QCOMPARE(output.subPixel(), KWayland::Client::Output::SubPixel::Unknown);
132 QCOMPARE(output.transform(), KWayland::Client::Output::Transform::Normal);
134 QSignalSpy outputChanged(&output, &KWayland::Client::Output::changed);
135 auto o =
registry.bindOutput(announced.first().first().value<quint32>(), announced.first().last().value<quint32>());
136 QVERIFY(!KWayland::Client::Output::get(o));
138 QCOMPARE(KWayland::Client::Output::get(o), &output);
139 wl_display_flush(m_connection->display());
140 QVERIFY(outputChanged.wait());
142 QCOMPARE(output.geometry(), QRect(100, 50, 1024, 768));
143 QCOMPARE(output.globalPosition(), QPoint(100, 50));
144 QCOMPARE(output.manufacturer(), QString());
145 QCOMPARE(output.model(), QString());
146 QCOMPARE(output.physicalSize(), QSize(200, 100));
147 QCOMPARE(output.pixelSize(), QSize(1024, 768));
148 QCOMPARE(output.refreshRate(), 60000);
149 QCOMPARE(output.scale(), 1);
151 QCOMPARE(output.subPixel(), KWayland::Client::Output::SubPixel::Unknown);
153 QCOMPARE(output.transform(), KWayland::Client::Output::Transform::Normal);
156void TestWaylandOutput::testModeChange()
158 auto outputHandle = std::make_unique<FakeOutput>();
159 outputHandle->setMode(QSize(1024, 768), 60000);
161 auto outputInterface = std::make_unique<KWin::OutputInterface>(m_display, outputHandle.get());
163 KWayland::Client::Registry
registry;
164 QSignalSpy announced(®istry, &KWayland::Client::Registry::outputAnnounced);
166 registry.create(m_connection->display());
169 wl_display_flush(m_connection->display());
170 QVERIFY(announced.wait());
172 KWayland::Client::Output output;
173 QSignalSpy outputChanged(&output, &KWayland::Client::Output::changed);
174 QSignalSpy modeAddedSpy(&output, &KWayland::Client::Output::modeAdded);
175 output.setup(
registry.bindOutput(announced.first().first().value<quint32>(), announced.first().last().value<quint32>()));
176 wl_display_flush(m_connection->display());
177 QVERIFY(outputChanged.wait());
178 QCOMPARE(modeAddedSpy.count(), 1);
179 QCOMPARE(modeAddedSpy.at(0).first().value<KWayland::Client::Output::Mode>().size, QSize(1024, 768));
180 QCOMPARE(modeAddedSpy.at(0).first().value<KWayland::Client::Output::Mode>().refreshRate, 60000);
181 QCOMPARE(modeAddedSpy.at(0).first().value<KWayland::Client::Output::Mode>().flags, KWayland::Client::Output::Mode::Flags(KWayland::Client::Output::Mode::Flag::Current));
182 QCOMPARE(modeAddedSpy.at(0).first().value<KWayland::Client::Output::Mode>().output, QPointer<KWayland::Client::Output>(&output));
183 QCOMPARE(output.pixelSize(), QSize(1024, 768));
184 QCOMPARE(output.refreshRate(), 60000);
187 outputHandle->setMode(QSize(1280, 1024), 90000);
188 QVERIFY(outputChanged.wait());
189 QCOMPARE(modeAddedSpy.count(), 2);
190 QCOMPARE(modeAddedSpy.at(1).first().value<KWayland::Client::Output::Mode>().size, QSize(1280, 1024));
191 QCOMPARE(modeAddedSpy.at(1).first().value<KWayland::Client::Output::Mode>().refreshRate, 90000);
192 QCOMPARE(modeAddedSpy.at(1).first().value<KWayland::Client::Output::Mode>().flags, KWayland::Client::Output::Mode::Flags(KWayland::Client::Output::Mode::Flag::Current));
193 QCOMPARE(modeAddedSpy.at(1).first().value<KWayland::Client::Output::Mode>().output, QPointer<KWayland::Client::Output>(&output));
194 QCOMPARE(output.pixelSize(), QSize(1280, 1024));
195 QCOMPARE(output.refreshRate(), 90000);
198void TestWaylandOutput::testScaleChange()
200 auto outputHandle = std::make_unique<FakeOutput>();
201 outputHandle->setMode(QSize(1024, 768), 60000);
203 auto outputInterface = std::make_unique<KWin::OutputInterface>(m_display, outputHandle.get());
205 KWayland::Client::Registry
registry;
206 QSignalSpy announced(®istry, &KWayland::Client::Registry::outputAnnounced);
207 registry.create(m_connection->display());
210 wl_display_flush(m_connection->display());
211 QVERIFY(announced.wait());
213 KWayland::Client::Output output;
214 QSignalSpy outputChanged(&output, &KWayland::Client::Output::changed);
215 output.setup(
registry.bindOutput(announced.first().first().value<quint32>(), announced.first().last().value<quint32>()));
216 wl_display_flush(m_connection->display());
217 QVERIFY(outputChanged.wait());
218 QCOMPARE(output.scale(), 1);
221 outputChanged.clear();
222 outputHandle->setScale(2);
223 QVERIFY(outputChanged.wait());
224 QCOMPARE(output.scale(), 2);
226 outputHandle->setScale(2);
227 QVERIFY(!outputChanged.wait(100));
230 outputChanged.clear();
231 outputHandle->setScale(4);
232 QVERIFY(outputChanged.wait());
233 QCOMPARE(output.scale(), 4);
236void TestWaylandOutput::testSubPixel_data()
238 QTest::addColumn<KWayland::Client::Output::SubPixel>(
"expected");
239 QTest::addColumn<KWin::Output::SubPixel>(
"actual");
248void TestWaylandOutput::testSubPixel()
252 auto outputHandle = std::make_unique<FakeOutput>();
253 outputHandle->setMode(QSize(1024, 768), 60000);
254 outputHandle->setSubPixel(actual);
256 auto outputInterface = std::make_unique<KWin::OutputInterface>(m_display, outputHandle.get());
258 KWayland::Client::Registry
registry;
259 QSignalSpy announced(®istry, &KWayland::Client::Registry::outputAnnounced);
260 registry.create(m_connection->display());
263 wl_display_flush(m_connection->display());
264 QVERIFY(announced.wait());
266 KWayland::Client::Output output;
267 QSignalSpy outputChanged(&output, &KWayland::Client::Output::changed);
268 output.setup(
registry.bindOutput(announced.first().first().value<quint32>(), announced.first().last().value<quint32>()));
269 wl_display_flush(m_connection->display());
270 if (outputChanged.isEmpty()) {
271 QVERIFY(outputChanged.wait());
274 QTEST(output.subPixel(),
"expected");
277void TestWaylandOutput::testTransform_data()
279 QTest::addColumn<KWayland::Client::Output::Transform>(
"expected");
280 QTest::addColumn<KWin::OutputTransform::Kind>(
"actual");
291void TestWaylandOutput::testTransform()
295 auto outputHandle = std::make_unique<FakeOutput>();
296 outputHandle->setMode(QSize(1024, 768), 60000);
297 outputHandle->setTransform(actual);
299 auto outputInterface = std::make_unique<KWin::OutputInterface>(m_display, outputHandle.get());
301 using namespace KWin;
303 KWayland::Client::Registry
registry;
304 QSignalSpy announced(®istry, &KWayland::Client::Registry::outputAnnounced);
305 registry.create(m_connection->display());
308 wl_display_flush(m_connection->display());
309 QVERIFY(announced.wait());
311 KWayland::Client::Output *output =
registry.createOutput(announced.first().first().value<quint32>(), announced.first().last().value<quint32>(), ®istry);
312 QSignalSpy outputChanged(output, &KWayland::Client::Output::changed);
313 wl_display_flush(m_connection->display());
314 if (outputChanged.isEmpty()) {
315 QVERIFY(outputChanged.wait());
318 QTEST(output->transform(),
"expected");
321 outputChanged.clear();
323 if (outputChanged.isEmpty()) {
324 QVERIFY(outputChanged.wait());
326 QCOMPARE(output->transform(), KWayland::Client::Output::Transform::Normal);
330#include "test_wayland_output.moc"
Class holding the Wayland server display loop.
bool addSocketName(const QString &name=QString())
TestWaylandOutput(QObject *parent=nullptr)
KWayland::Client::Registry * registry