KWin
Loading...
Searching...
No Matches
tiles_test.cpp
Go to the documentation of this file.
1/*
2 KWin - the KDE window manager
3 This file is part of the KDE project.
4
5 SPDX-FileCopyrightText: 2022 Marco Martin <mart@kde.org>
6
7 SPDX-License-Identifier: GPL-2.0-or-later
8*/
9#include "kwin_wayland_test.h"
10
11#include "core/output.h"
12#include "pointer_input.h"
13#include "tiles/tilemanager.h"
14#include "wayland_server.h"
15#include "window.h"
16#include "workspace.h"
17
18#include <QAbstractItemModelTester>
19
20namespace KWin
21{
22
23static const QString s_socketName = QStringLiteral("wayland_test_kwin_transient_placement-0");
24
25class TilesTest : public QObject
26{
27 Q_OBJECT
28private Q_SLOTS:
29 void initTestCase();
30 void init();
31 void cleanup();
32 void testWindowInteraction();
33 void testAssignedTileDeletion();
34 void resizeTileFromWindow();
35
36private:
37 void createSampleLayout();
38
39 Output *m_output;
40 TileManager *m_tileManager;
41 CustomTile *m_rootTile;
42};
43
44void TilesTest::initTestCase()
45{
46 qRegisterMetaType<KWin::Window *>();
47 QSignalSpy applicationStartedSpy(kwinApp(), &Application::started);
48 QVERIFY(applicationStartedSpy.isValid());
49 QVERIFY(waylandServer()->init(s_socketName));
51 QRect(0, 0, 1280, 1024),
52 QRect(1280, 0, 1280, 1024),
53 });
54
55 kwinApp()->start();
56 QVERIFY(applicationStartedSpy.wait());
57 const auto outputs = workspace()->outputs();
58 QCOMPARE(outputs.count(), 2);
59 QCOMPARE(outputs[0]->geometry(), QRect(0, 0, 1280, 1024));
60 QCOMPARE(outputs[1]->geometry(), QRect(1280, 0, 1280, 1024));
61 setenv("QT_QPA_PLATFORM", "wayland", true);
62}
63
64void TilesTest::init()
65{
67
68 workspace()->setActiveOutput(QPoint(640, 512));
69 input()->pointer()->warp(QPoint(640, 512));
70 m_output = workspace()->activeOutput();
71 m_tileManager = workspace()->tileManager(m_output);
72 m_rootTile = m_tileManager->rootTile();
73 QAbstractItemModelTester(m_tileManager->model(), QAbstractItemModelTester::FailureReportingMode::QtTest);
74 while (m_rootTile->childCount() > 0) {
75 static_cast<CustomTile *>(m_rootTile->childTile(0))->remove();
76 }
77 createSampleLayout();
78}
79
80void TilesTest::cleanup()
81{
82 while (m_rootTile->childCount() > 0) {
83 static_cast<CustomTile *>(m_rootTile->childTile(0))->remove();
84 }
86}
87
88void TilesTest::createSampleLayout()
89{
90 QCOMPARE(m_rootTile->childCount(), 0);
92 QCOMPARE(m_rootTile->childCount(), 2);
93
94 auto leftTile = qobject_cast<CustomTile *>(m_rootTile->childTiles().first());
95 auto rightTile = qobject_cast<CustomTile *>(m_rootTile->childTiles().last());
96 QVERIFY(leftTile);
97 QVERIFY(rightTile);
98
99 QCOMPARE(leftTile->relativeGeometry(), QRectF(0, 0, 0.5, 1));
100 QCOMPARE(rightTile->relativeGeometry(), QRectF(0.5, 0, 0.5, 1));
101
102 // Splitting with the same layout direction creates a sibling, not 2 children
104 auto newRightTile = qobject_cast<CustomTile *>(m_rootTile->childTiles().last());
105
106 QCOMPARE(m_rootTile->childCount(), 3);
107 QCOMPARE(m_rootTile->relativeGeometry(), QRectF(0, 0, 1, 1));
108 QCOMPARE(leftTile->relativeGeometry(), QRectF(0, 0, 0.5, 1));
109 QCOMPARE(rightTile->relativeGeometry(), QRectF(0.5, 0, 0.25, 1));
110 QCOMPARE(newRightTile->relativeGeometry(), QRectF(0.75, 0, 0.25, 1));
111
112 QCOMPARE(m_rootTile->windowGeometry(), QRectF(4, 4, 1272, 1016));
113 QCOMPARE(leftTile->windowGeometry(), QRectF(4, 4, 634, 1016));
114 QCOMPARE(rightTile->windowGeometry(), QRectF(642, 4, 316, 1016));
115 QCOMPARE(newRightTile->windowGeometry(), QRectF(962, 4, 314, 1016));
116
117 // Splitting with a different layout direction creates 2 children in the tile
118 QVERIFY(!rightTile->isLayout());
119 QCOMPARE(rightTile->childCount(), 0);
121 QVERIFY(rightTile->isLayout());
122 QCOMPARE(rightTile->childCount(), 2);
123 auto verticalTopTile = qobject_cast<CustomTile *>(rightTile->childTiles().first());
124 auto verticalBottomTile = qobject_cast<CustomTile *>(rightTile->childTiles().last());
125
126 // geometry of rightTile should be the same
127 QCOMPARE(m_rootTile->childCount(), 3);
128 QCOMPARE(rightTile->relativeGeometry(), QRectF(0.5, 0, 0.25, 1));
129 QCOMPARE(rightTile->windowGeometry(), QRectF(642, 4, 316, 1016));
130
131 QCOMPARE(verticalTopTile->relativeGeometry(), QRectF(0.5, 0, 0.25, 0.5));
132 QCOMPARE(verticalBottomTile->relativeGeometry(), QRectF(0.5, 0.5, 0.25, 0.5));
133 QCOMPARE(verticalTopTile->windowGeometry(), QRectF(642, 4, 316, 506));
134 QCOMPARE(verticalBottomTile->windowGeometry(), QRectF(642, 514, 316, 506));
135}
136
137void TilesTest::testWindowInteraction()
138{
139 // Test that resizing a tile resizes the contained window and resizes the neighboring tiles as well
140 std::unique_ptr<KWayland::Client::Surface> surface(Test::createSurface());
141
142 std::unique_ptr<Test::XdgToplevel> shellSurface(Test::createXdgToplevelSurface(surface.get()));
143
144 QSignalSpy surfaceConfigureRequestedSpy(shellSurface->xdgSurface(), &Test::XdgSurface::configureRequested);
145 QSignalSpy toplevelConfigureRequestedSpy(shellSurface.get(), &Test::XdgToplevel::configureRequested);
146
147 auto rootWindow = Test::renderAndWaitForShown(surface.get(), QSize(100, 100), Qt::cyan);
148 QVERIFY(rootWindow);
149 QSignalSpy frameGeometryChangedSpy(rootWindow, &Window::frameGeometryChanged);
150 QVERIFY(surfaceConfigureRequestedSpy.wait());
151 QCOMPARE(surfaceConfigureRequestedSpy.count(), 1);
152 QCOMPARE(toplevelConfigureRequestedSpy.count(), 1);
153
154 auto leftTile = qobject_cast<CustomTile *>(m_rootTile->childTiles().first());
155 QVERIFY(leftTile);
156
157 rootWindow->setTile(leftTile);
158 QVERIFY(surfaceConfigureRequestedSpy.wait());
159 QCOMPARE(surfaceConfigureRequestedSpy.count(), 2);
160 QCOMPARE(toplevelConfigureRequestedSpy.count(), 2);
161
162 shellSurface->xdgSurface()->ack_configure(surfaceConfigureRequestedSpy.last().at(0).value<quint32>());
163 Test::render(surface.get(), toplevelConfigureRequestedSpy.last().first().value<QSize>(), Qt::blue);
164 QVERIFY(frameGeometryChangedSpy.wait());
165 QCOMPARE(rootWindow->frameGeometry(), leftTile->windowGeometry().toRect());
166
167 QCOMPARE(toplevelConfigureRequestedSpy.last().first().value<QSize>(), leftTile->windowGeometry().toRect().size());
168
169 // Resize owning tile
170 leftTile->setRelativeGeometry({0, 0, 0.4, 1});
171
172 QVERIFY(surfaceConfigureRequestedSpy.wait());
173 QCOMPARE(surfaceConfigureRequestedSpy.count(), 3);
174 QCOMPARE(toplevelConfigureRequestedSpy.count(), 3);
175
176 QCOMPARE(toplevelConfigureRequestedSpy.last().first().value<QSize>(), leftTile->windowGeometry().toRect().size());
177
178 shellSurface->xdgSurface()->ack_configure(surfaceConfigureRequestedSpy.last().at(0).value<quint32>());
179
180 QCOMPARE(toplevelConfigureRequestedSpy.last().first().value<QSize>(), leftTile->windowGeometry().toRect().size());
181
182 Test::render(surface.get(), toplevelConfigureRequestedSpy.last().first().value<QSize>(), Qt::blue);
183 QVERIFY(frameGeometryChangedSpy.wait());
184 QCOMPARE(rootWindow->frameGeometry(), leftTile->windowGeometry().toRect());
185
186 auto middleTile = qobject_cast<CustomTile *>(m_rootTile->childTiles()[1]);
187 QVERIFY(middleTile);
188 auto rightTile = qobject_cast<CustomTile *>(m_rootTile->childTiles()[2]);
189 QVERIFY(rightTile);
190 auto verticalTopTile = qobject_cast<CustomTile *>(middleTile->childTiles().first());
191 QVERIFY(verticalTopTile);
192 auto verticalBottomTile = qobject_cast<CustomTile *>(middleTile->childTiles().last());
193 QVERIFY(verticalBottomTile);
194
195 QCOMPARE(leftTile->relativeGeometry(), QRectF(0, 0, 0.4, 1));
196 QCOMPARE(middleTile->relativeGeometry(), QRectF(0.4, 0, 0.35, 1));
197 QCOMPARE(rightTile->relativeGeometry(), QRectF(0.75, 0, 0.25, 1));
198 QCOMPARE(verticalTopTile->relativeGeometry(), QRectF(0.4, 0, 0.35, 0.5));
199 QCOMPARE(verticalBottomTile->relativeGeometry(), QRectF(0.4, 0.5, 0.35, 0.5));
200}
201
202void TilesTest::testAssignedTileDeletion()
203{
204 auto leftTile = qobject_cast<CustomTile *>(m_rootTile->childTiles().first());
205 QVERIFY(leftTile);
206 leftTile->setRelativeGeometry({0, 0, 0.4, 1});
207
208 std::unique_ptr<KWayland::Client::Surface> rootSurface(Test::createSurface());
209
210 std::unique_ptr<Test::XdgToplevel> root(Test::createXdgToplevelSurface(rootSurface.get()));
211
212 QSignalSpy surfaceConfigureRequestedSpy(root->xdgSurface(), &Test::XdgSurface::configureRequested);
213 QSignalSpy toplevelConfigureRequestedSpy(root.get(), &Test::XdgToplevel::configureRequested);
214
215 auto rootWindow = Test::renderAndWaitForShown(rootSurface.get(), QSize(100, 100), Qt::cyan);
216 QVERIFY(rootWindow);
217 QSignalSpy frameGeometryChangedSpy(rootWindow, &Window::frameGeometryChanged);
218 QVERIFY(surfaceConfigureRequestedSpy.wait());
219 QCOMPARE(surfaceConfigureRequestedSpy.count(), 1);
220 QCOMPARE(toplevelConfigureRequestedSpy.count(), 1);
221 root->xdgSurface()->ack_configure(surfaceConfigureRequestedSpy.last().at(0).value<quint32>());
222
223 auto middleTile = qobject_cast<CustomTile *>(m_rootTile->childTiles()[1]);
224 QVERIFY(middleTile);
225 auto middleBottomTile = qobject_cast<CustomTile *>(m_rootTile->childTiles()[1]->childTiles()[1]);
226 QVERIFY(middleBottomTile);
227
228 rootWindow->setTile(middleBottomTile);
229 QVERIFY(surfaceConfigureRequestedSpy.wait());
230 QCOMPARE(surfaceConfigureRequestedSpy.count(), 2);
231 QCOMPARE(toplevelConfigureRequestedSpy.count(), 2);
232
233 root->xdgSurface()->ack_configure(surfaceConfigureRequestedSpy.last().at(0).value<quint32>());
234
235 Test::render(rootSurface.get(), toplevelConfigureRequestedSpy.last().first().value<QSize>(), Qt::blue);
236 QVERIFY(frameGeometryChangedSpy.wait());
237 QCOMPARE(rootWindow->frameGeometry(), middleBottomTile->windowGeometry().toRect());
238
239 QCOMPARE(toplevelConfigureRequestedSpy.last().first().value<QSize>(), middleBottomTile->windowGeometry().toRect().size());
240
241 QCOMPARE(middleBottomTile->windowGeometry().toRect(), QRect(514, 514, 444, 506));
242
243 middleBottomTile->remove();
244
245 QVERIFY(surfaceConfigureRequestedSpy.wait());
246 QCOMPARE(surfaceConfigureRequestedSpy.count(), 3);
247 QCOMPARE(toplevelConfigureRequestedSpy.count(), 3);
248
249 root->xdgSurface()->ack_configure(surfaceConfigureRequestedSpy.last().at(0).value<quint32>());
250
251 // The window has been reassigned to middleTile after deletion of the children
252 QCOMPARE(toplevelConfigureRequestedSpy.last().first().value<QSize>(), middleTile->windowGeometry().toRect().size());
253
254 Test::render(rootSurface.get(), toplevelConfigureRequestedSpy.last().first().value<QSize>(), Qt::blue);
255 QVERIFY(frameGeometryChangedSpy.wait());
256 QCOMPARE(rootWindow->frameGeometry(), middleTile->windowGeometry().toRect());
257
258 // Both children have been deleted as the system avoids tiles with ha single child
259 QCOMPARE(middleTile->isLayout(), false);
260 QCOMPARE(middleTile->childCount(), 0);
261 QCOMPARE(rootWindow->tile(), middleTile);
262}
263
264void TilesTest::resizeTileFromWindow()
265{
266 auto middleBottomTile = qobject_cast<CustomTile *>(m_rootTile->childTiles()[1]->childTiles()[1]);
267 QVERIFY(middleBottomTile);
268 middleBottomTile->remove();
269
270 std::unique_ptr<KWayland::Client::Surface> rootSurface(Test::createSurface());
271
272 std::unique_ptr<Test::XdgToplevel> root(Test::createXdgToplevelSurface(rootSurface.get()));
273
274 QSignalSpy surfaceConfigureRequestedSpy(root->xdgSurface(), &Test::XdgSurface::configureRequested);
275 QSignalSpy toplevelConfigureRequestedSpy(root.get(), &Test::XdgToplevel::configureRequested);
276
277 Test::XdgToplevel::States states;
278 auto window = Test::renderAndWaitForShown(rootSurface.get(), QSize(100, 100), Qt::cyan);
279 QVERIFY(window);
280 QSignalSpy frameGeometryChangedSpy(window, &Window::frameGeometryChanged);
281 QVERIFY(frameGeometryChangedSpy.isValid());
282 QVERIFY(surfaceConfigureRequestedSpy.wait());
283 QCOMPARE(surfaceConfigureRequestedSpy.count(), 1);
284 QCOMPARE(toplevelConfigureRequestedSpy.count(), 1);
285 root->xdgSurface()->ack_configure(surfaceConfigureRequestedSpy.last().at(0).value<quint32>());
286
287 auto leftTile = qobject_cast<CustomTile *>(m_rootTile->childTiles().first());
288 QVERIFY(leftTile);
289 leftTile->setRelativeGeometry({0, 0, 0.4, 1});
290 QCOMPARE(leftTile->windowGeometry(), QRectF(4, 4, 506, 1016));
291
292 auto middleTile = qobject_cast<CustomTile *>(m_rootTile->childTiles()[1]);
293 QVERIFY(middleTile);
294 QCOMPARE(middleTile->windowGeometry(), QRectF(514, 4, 444, 1016));
295
297 auto topLeftTile = qobject_cast<CustomTile *>(leftTile->childTiles().first());
298 QVERIFY(topLeftTile);
299 QCOMPARE(topLeftTile->windowGeometry(), QRectF(4, 4, 506, 506));
300 QSignalSpy tileGeometryChangedSpy(topLeftTile, &Tile::windowGeometryChanged);
301 auto bottomLeftTile = qobject_cast<CustomTile *>(leftTile->childTiles().last());
302 QVERIFY(bottomLeftTile);
303 QCOMPARE(bottomLeftTile->windowGeometry(), QRectF(4, 514, 506, 506));
304
305 window->setTile(topLeftTile);
306 QVERIFY(surfaceConfigureRequestedSpy.wait());
307 QCOMPARE(surfaceConfigureRequestedSpy.count(), 2);
308 QCOMPARE(toplevelConfigureRequestedSpy.count(), 2);
309
310 root->xdgSurface()->ack_configure(surfaceConfigureRequestedSpy.last().at(0).value<quint32>());
311
312 QCOMPARE(toplevelConfigureRequestedSpy.last().first().value<QSize>(), topLeftTile->windowGeometry().toRect().size());
313 Test::render(rootSurface.get(), toplevelConfigureRequestedSpy.last().first().value<QSize>(), Qt::blue);
314 QVERIFY(frameGeometryChangedSpy.wait());
315 QCOMPARE(window->frameGeometry(), QRect(4, 4, 506, 506));
316
317 QCOMPARE(workspace()->activeWindow(), window);
318 QSignalSpy interactiveMoveResizeStartedSpy(window, &Window::interactiveMoveResizeStarted);
319 QVERIFY(interactiveMoveResizeStartedSpy.isValid());
320 QSignalSpy moveResizedChangedSpy(window, &Window::moveResizedChanged);
321 QVERIFY(moveResizedChangedSpy.isValid());
322 QSignalSpy interactiveMoveResizeFinishedSpy(window, &Window::interactiveMoveResizeFinished);
323 QVERIFY(interactiveMoveResizeFinishedSpy.isValid());
324
325 // begin resize
326 QCOMPARE(workspace()->moveResizeWindow(), nullptr);
327 QCOMPARE(window->isInteractiveMove(), false);
328 QCOMPARE(window->isInteractiveResize(), false);
330 QCOMPARE(workspace()->moveResizeWindow(), window);
331 QCOMPARE(interactiveMoveResizeStartedSpy.count(), 1);
332 QCOMPARE(moveResizedChangedSpy.count(), 1);
333 QCOMPARE(window->isInteractiveResize(), true);
334 QCOMPARE(window->geometryRestore(), QRect());
335 QVERIFY(surfaceConfigureRequestedSpy.wait());
336 QCOMPARE(surfaceConfigureRequestedSpy.count(), 3);
337 QCOMPARE(toplevelConfigureRequestedSpy.count(), 3);
338 states = toplevelConfigureRequestedSpy.last().at(1).value<Test::XdgToplevel::States>();
339 QVERIFY(states.testFlag(Test::XdgToplevel::State::Activated));
340 QVERIFY(states.testFlag(Test::XdgToplevel::State::Resizing));
341 // Trigger a change.
342 QPoint cursorPos = window->frameGeometry().bottomRight().toPoint();
343 input()->pointer()->warp(cursorPos + QPoint(8, 0));
344 window->updateInteractiveMoveResize(Cursors::self()->mouse()->pos());
345 QCOMPARE(Cursors::self()->mouse()->pos(), cursorPos + QPoint(8, 0));
346
347 // The client should receive a configure event with the new size.
348 QVERIFY(surfaceConfigureRequestedSpy.wait());
349 QCOMPARE(surfaceConfigureRequestedSpy.count(), 4);
350 QCOMPARE(toplevelConfigureRequestedSpy.count(), 4);
351 states = toplevelConfigureRequestedSpy.last().at(1).value<Test::XdgToplevel::States>();
352 QVERIFY(states.testFlag(Test::XdgToplevel::State::Activated));
353 QVERIFY(states.testFlag(Test::XdgToplevel::State::Resizing));
354 QCOMPARE(toplevelConfigureRequestedSpy.last().at(0).toSize(), QSize(516, 508));
355
356 // Now render new size.
357 root->xdgSurface()->ack_configure(surfaceConfigureRequestedSpy.last().at(0).value<quint32>());
358 Test::render(rootSurface.get(), toplevelConfigureRequestedSpy.last().first().value<QSize>(), Qt::blue);
359 QVERIFY(frameGeometryChangedSpy.wait());
360 QCOMPARE(window->frameGeometry(), QRect(4, 4, 516, 508));
361
362 QTRY_COMPARE(tileGeometryChangedSpy.count(), 2);
363 QCOMPARE(window->tile(), topLeftTile);
364 QCOMPARE(topLeftTile->windowGeometry(), QRect(4, 4, 516, 508));
365 QCOMPARE(bottomLeftTile->windowGeometry(), QRect(4, 516, 516, 504));
366 QCOMPARE(leftTile->windowGeometry(), QRect(4, 4, 516, 1016));
367 QCOMPARE(middleTile->windowGeometry(), QRect(524, 4, 434, 1016));
368
369 // Resize vertically
371 QCOMPARE(workspace()->moveResizeWindow(), window);
372 QCOMPARE(interactiveMoveResizeStartedSpy.count(), 2);
373 QCOMPARE(moveResizedChangedSpy.count(), 3);
374 QCOMPARE(window->isInteractiveResize(), true);
375 QCOMPARE(window->geometryRestore(), QRect());
376 QVERIFY(surfaceConfigureRequestedSpy.wait());
377 QCOMPARE(surfaceConfigureRequestedSpy.count(), 5);
378 QCOMPARE(toplevelConfigureRequestedSpy.count(), 5);
379 states = toplevelConfigureRequestedSpy.last().at(1).value<Test::XdgToplevel::States>();
380 QVERIFY(states.testFlag(Test::XdgToplevel::State::Activated));
381 QVERIFY(states.testFlag(Test::XdgToplevel::State::Resizing));
382
383 // Trigger a change.
384 cursorPos = window->frameGeometry().bottomRight().toPoint();
385 input()->pointer()->warp(cursorPos + QPoint(0, 8));
386 window->updateInteractiveMoveResize(Cursors::self()->mouse()->pos());
387 QCOMPARE(Cursors::self()->mouse()->pos(), cursorPos + QPoint(0, 8));
388
389 // The client should receive a configure event with the new size.
390 QVERIFY(surfaceConfigureRequestedSpy.wait());
391 QCOMPARE(surfaceConfigureRequestedSpy.count(), 6);
392 QCOMPARE(toplevelConfigureRequestedSpy.count(), 6);
393 states = toplevelConfigureRequestedSpy.last().at(1).value<Test::XdgToplevel::States>();
394 QVERIFY(states.testFlag(Test::XdgToplevel::State::Activated));
395 QVERIFY(states.testFlag(Test::XdgToplevel::State::Resizing));
396 QCOMPARE(toplevelConfigureRequestedSpy.last().at(0).toSize(), QSize(518, 518));
397
398 // Now render new size.
399 root->xdgSurface()->ack_configure(surfaceConfigureRequestedSpy.last().at(0).value<quint32>());
400 Test::render(rootSurface.get(), toplevelConfigureRequestedSpy.last().first().value<QSize>(), Qt::blue);
401 QVERIFY(frameGeometryChangedSpy.wait());
402 QCOMPARE(window->frameGeometry(), QRect(4, 4, 518, 518));
403
404 QTRY_COMPARE(tileGeometryChangedSpy.count(), 5);
405 QCOMPARE(window->tile(), topLeftTile);
406 QCOMPARE(topLeftTile->windowGeometry(), QRect(4, 4, 518, 518));
407 QCOMPARE(bottomLeftTile->windowGeometry(), QRect(4, 526, 518, 494));
408 QCOMPARE(leftTile->windowGeometry(), QRect(4, 4, 518, 1016));
409 QCOMPARE(middleTile->windowGeometry(), QRect(526, 4, 432, 1016));
410}
411}
412
414#include "tiles_test.moc"
static Cursors * self()
Definition cursor.cpp:35
Q_INVOKABLE void split(KWin::Tile::LayoutDirection newDirection)
PointerInputRedirection * pointer() const
Definition input.h:220
void warp(const QPointF &pos)
void configureRequested(quint32 serial)
void configureRequested(const QSize &size, KWin::Test::XdgToplevel::States states)
Tile * childTile(int row)
Definition tile.cpp:354
int childCount() const
Definition tile.cpp:362
QList< Tile * > childTiles() const
Definition tile.cpp:349
QRectF windowGeometry() const
Definition tile.cpp:139
void windowGeometryChanged()
QRectF relativeGeometry
Definition tile.h:28
KWin::Tile * rootTile
Definition tilemanager.h:40
TileModel * model
Definition tilemanager.h:41
void interactiveMoveResizeStarted()
void interactiveMoveResizeFinished()
void moveResizedChanged()
void frameGeometryChanged(const QRectF &oldGeometry)
TileManager * tileManager(Output *output)
Output * activeOutput() const
QList< Output * > outputs() const
Definition workspace.h:762
void setActiveOutput(Output *output)
#define WAYLANDTEST_MAIN(TestObject)
Window * renderAndWaitForShown(KWayland::Client::Surface *surface, const QSize &size, const QColor &color, const QImage::Format &format=QImage::Format_ARGB32, int timeout=5000)
void destroyWaylandConnection()
void setOutputConfig(const QList< QRect > &geometries)
bool setupWaylandConnection(AdditionalWaylandInterfaces flags=AdditionalWaylandInterfaces())
void render(KWayland::Client::Surface *surface, const QSize &size, const QColor &color, const QImage::Format &format=QImage::Format_ARGB32_Premultiplied)
std::unique_ptr< KWayland::Client::Surface > createSurface()
XdgToplevel * createXdgToplevelSurface(KWayland::Client::Surface *surface, QObject *parent=nullptr)
KWIN_EXPORT xcb_window_t rootWindow()
Definition xcb.h:24
WaylandServer * waylandServer()
Workspace * workspace()
Definition workspace.h:830
InputRedirection * input()
Definition input.h:549