17#include <KWayland/Client/output.h>
18#include <KWayland/Client/registry.h>
19#include <KWayland/Client/xdgoutput.h>
23static const QString s_socketName = QStringLiteral(
"wayland_test_kwin_screen_changes-0");
33 void testScreenAddRemove();
36void ScreenChangesTest::initTestCase()
43 QVERIFY(applicationStartedSpy.wait());
44 setenv(
"QT_QPA_PLATFORM",
"wayland",
true);
47void ScreenChangesTest::init()
55void ScreenChangesTest::cleanup()
60void ScreenChangesTest::testScreenAddRemove()
66 QSignalSpy allAnnounced(®istry, &KWayland::Client::Registry::interfacesAnnounced);
67 QSignalSpy outputAnnouncedSpy(®istry, &KWayland::Client::Registry::outputAnnounced);
68 QSignalSpy outputRemovedSpy(®istry, &KWayland::Client::Registry::outputRemoved);
72 QVERIFY(allAnnounced.wait());
73 const auto xdgOMData =
registry.interface(KWayland::Client::Registry::Interface::XdgOutputUnstableV1);
74 auto xdgOutputManager =
registry.createXdgOutputManager(xdgOMData.name, xdgOMData.version);
78 QCOMPARE(outputAnnouncedSpy.count(), 1);
79 const quint32 firstOutputId = outputAnnouncedSpy.first().first().value<quint32>();
80 QVERIFY(firstOutputId != 0u);
81 outputAnnouncedSpy.clear();
84 const QList<QRect> geometries{QRect(0, 0, 1280, 1024), QRect(1280, 0, 1280, 1024)};
88 QCOMPARE(outputs[0]->geometry(), geometries[0]);
89 QCOMPARE(outputs[1]->geometry(), geometries[1]);
92 QVERIFY(outputAnnouncedSpy.wait());
93 if (outputAnnouncedSpy.count() < 2) {
94 QVERIFY(outputAnnouncedSpy.wait());
96 QCOMPARE(outputAnnouncedSpy.count(), 2);
98 if (outputRemovedSpy.isEmpty()) {
99 QVERIFY(outputRemovedSpy.wait());
101 QCOMPARE(outputRemovedSpy.count(), 1);
102 QCOMPARE(outputRemovedSpy.first().first().value<quint32>(), firstOutputId);
106 QCOMPARE(outputAnnouncedSpy.count(), 2);
107 QCOMPARE(outputRemovedSpy.count(), 1);
110 std::unique_ptr<KWayland::Client::Output> o1(
registry.createOutput(outputAnnouncedSpy.first().first().value<quint32>(), outputAnnouncedSpy.first().last().value<quint32>()));
111 QVERIFY(o1->isValid());
112 QSignalSpy o1ChangedSpy(o1.get(), &KWayland::Client::Output::changed);
113 QVERIFY(o1ChangedSpy.wait());
114 KWin::Output *serverOutput1 = kwinApp()->outputBackend()->findOutput(o1->name());
115 QCOMPARE(o1->globalPosition(), serverOutput1->
geometry().topLeft());
116 QCOMPARE(o1->pixelSize(), serverOutput1->
modeSize());
117 std::unique_ptr<KWayland::Client::Output> o2(
registry.createOutput(outputAnnouncedSpy.last().first().value<quint32>(), outputAnnouncedSpy.last().last().value<quint32>()));
118 QVERIFY(o2->isValid());
119 QSignalSpy o2ChangedSpy(o2.get(), &KWayland::Client::Output::changed);
120 QVERIFY(o2ChangedSpy.wait());
121 KWin::Output *serverOutput2 = kwinApp()->outputBackend()->findOutput(o2->name());
122 QCOMPARE(o2->globalPosition(), serverOutput2->
geometry().topLeft());
123 QCOMPARE(o2->pixelSize(), serverOutput2->
modeSize());
126 std::unique_ptr<KWayland::Client::XdgOutput> xdgO1(xdgOutputManager->getXdgOutput(o1.get()));
127 QSignalSpy xdgO1ChangedSpy(xdgO1.get(), &KWayland::Client::XdgOutput::changed);
128 QVERIFY(xdgO1ChangedSpy.wait());
129 QCOMPARE(xdgO1->logicalPosition(), serverOutput1->
geometry().topLeft());
130 QCOMPARE(xdgO1->logicalSize(), serverOutput1->
geometry().size());
131 std::unique_ptr<KWayland::Client::XdgOutput> xdgO2(xdgOutputManager->getXdgOutput(o2.get()));
132 QSignalSpy xdgO2ChangedSpy(xdgO2.get(), &KWayland::Client::XdgOutput::changed);
133 QVERIFY(xdgO2ChangedSpy.wait());
134 QCOMPARE(xdgO2->logicalPosition(), serverOutput2->
geometry().topLeft());
135 QCOMPARE(xdgO2->logicalSize(), serverOutput2->
geometry().size());
137 QVERIFY(xdgO1->name().startsWith(
"Virtual-"));
138 QVERIFY(xdgO1->name() != xdgO2->name());
139 QVERIFY(!xdgO1->description().isEmpty());
142 outputAnnouncedSpy.clear();
143 outputRemovedSpy.clear();
145 QSignalSpy o1RemovedSpy(o1.get(), &KWayland::Client::Output::removed);
146 QSignalSpy o2RemovedSpy(o2.get(), &KWayland::Client::Output::removed);
148 const QList<QRect> geometries2{QRect(0, 0, 1280, 1024)};
152 QCOMPARE(outputs[0]->geometry(), geometries2.at(0));
154 QVERIFY(outputAnnouncedSpy.wait());
155 QCOMPARE(outputAnnouncedSpy.count(), 1);
156 if (o1RemovedSpy.isEmpty()) {
157 QVERIFY(o1RemovedSpy.wait());
159 if (o2RemovedSpy.isEmpty()) {
160 QVERIFY(o2RemovedSpy.wait());
164 QCOMPARE(outputAnnouncedSpy.count(), 1);
165 QCOMPARE(o1RemovedSpy.count(), 1);
166 QCOMPARE(o2RemovedSpy.count(), 1);
167 QCOMPARE(outputRemovedSpy.count(), 2);
171#include "screen_changes_test.moc"
QList< Output * > outputs() const
void setActiveOutput(Output *output)
#define WAYLANDTEST_MAIN(TestObject)
void destroyWaylandConnection()
void setOutputConfig(const QList< QRect > &geometries)
bool setupWaylandConnection(AdditionalWaylandInterfaces flags=AdditionalWaylandInterfaces())
KWayland::Client::Registry * registry
QList< KWayland::Client::Output * > outputs
KWayland::Client::ConnectionThread * waylandConnection()
WaylandServer * waylandServer()
InputRedirection * input()