KWin
Loading...
Searching...
No Matches
activation_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: 2019 Vlad Zahorodnii <vlad.zahorodnii@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 "wayland_server.h"
14#include "window.h"
15#include "workspace.h"
16
17#include <KWayland/Client/surface.h>
18
19namespace KWin
20{
21
22static const QString s_socketName = QStringLiteral("wayland_test_activation-0");
23
24class ActivationTest : public QObject
25{
26 Q_OBJECT
27
28private Q_SLOTS:
29 void initTestCase();
30 void init();
31 void cleanup();
32
33 void testSwitchToWindowToLeft();
34 void testSwitchToWindowToRight();
35 void testSwitchToWindowAbove();
36 void testSwitchToWindowBelow();
37 void testSwitchToWindowMaximized();
38 void testSwitchToWindowFullScreen();
39
40private:
41 void stackScreensHorizontally();
42 void stackScreensVertically();
43};
44
45void ActivationTest::initTestCase()
46{
47 qRegisterMetaType<Window *>();
48
49 QSignalSpy applicationStartedSpy(kwinApp(), &Application::started);
50 QVERIFY(waylandServer()->init(s_socketName));
52 QRect(0, 0, 1280, 1024),
53 QRect(1280, 0, 1280, 1024),
54 });
55
56 kwinApp()->start();
57 QVERIFY(applicationStartedSpy.wait());
58 const auto outputs = workspace()->outputs();
59 QCOMPARE(outputs.count(), 2);
60 QCOMPARE(outputs[0]->geometry(), QRect(0, 0, 1280, 1024));
61 QCOMPARE(outputs[1]->geometry(), QRect(1280, 0, 1280, 1024));
62}
63
64void ActivationTest::init()
65{
67
68 workspace()->setActiveOutput(QPoint(640, 512));
69 input()->pointer()->warp(QPoint(640, 512));
70}
71
72void ActivationTest::cleanup()
73{
75
76 stackScreensHorizontally();
77}
78
79void ActivationTest::testSwitchToWindowToLeft()
80{
81 // This test verifies that "Switch to Window to the Left" shortcut works.
82
83 // Prepare the test environment.
84 stackScreensHorizontally();
85
86 // Create several windows on the left screen.
87 std::unique_ptr<KWayland::Client::Surface> surface1(Test::createSurface());
88 std::unique_ptr<Test::XdgToplevel> shellSurface1(Test::createXdgToplevelSurface(surface1.get()));
89 Window *window1 = Test::renderAndWaitForShown(surface1.get(), QSize(100, 50), Qt::blue);
90 QVERIFY(window1);
91 QVERIFY(window1->isActive());
92
93 std::unique_ptr<KWayland::Client::Surface> surface2(Test::createSurface());
94 std::unique_ptr<Test::XdgToplevel> shellSurface2(Test::createXdgToplevelSurface(surface2.get()));
95 Window *window2 = Test::renderAndWaitForShown(surface2.get(), QSize(100, 50), Qt::blue);
96 QVERIFY(window2);
97 QVERIFY(window2->isActive());
98
99 window1->move(QPoint(300, 200));
100 window2->move(QPoint(500, 200));
101
102 // Create several windows on the right screen.
103 std::unique_ptr<KWayland::Client::Surface> surface3(Test::createSurface());
104 std::unique_ptr<Test::XdgToplevel> shellSurface3(Test::createXdgToplevelSurface(surface3.get()));
105 Window *window3 = Test::renderAndWaitForShown(surface3.get(), QSize(100, 50), Qt::blue);
106 QVERIFY(window3);
107 QVERIFY(window3->isActive());
108
109 std::unique_ptr<KWayland::Client::Surface> surface4(Test::createSurface());
110 std::unique_ptr<Test::XdgToplevel> shellSurface4(Test::createXdgToplevelSurface(surface4.get()));
111 Window *window4 = Test::renderAndWaitForShown(surface4.get(), QSize(100, 50), Qt::blue);
112 QVERIFY(window4);
113 QVERIFY(window4->isActive());
114
115 window3->move(QPoint(1380, 200));
116 window4->move(QPoint(1580, 200));
117
118 // Switch to window to the left.
120 QVERIFY(window3->isActive());
121
122 // Switch to window to the left.
124 QVERIFY(window2->isActive());
125
126 // Switch to window to the left.
128 QVERIFY(window1->isActive());
129
130 // Switch to window to the left.
132 QVERIFY(window4->isActive());
133
134 // Destroy all windows.
135 shellSurface1.reset();
136 QVERIFY(Test::waitForWindowClosed(window1));
137 shellSurface2.reset();
138 QVERIFY(Test::waitForWindowClosed(window2));
139 shellSurface3.reset();
140 QVERIFY(Test::waitForWindowClosed(window3));
141 shellSurface4.reset();
142 QVERIFY(Test::waitForWindowClosed(window4));
143}
144
145void ActivationTest::testSwitchToWindowToRight()
146{
147 // This test verifies that "Switch to Window to the Right" shortcut works.
148
149 // Prepare the test environment.
150 stackScreensHorizontally();
151
152 // Create several windows on the left screen.
153 std::unique_ptr<KWayland::Client::Surface> surface1(Test::createSurface());
154 std::unique_ptr<Test::XdgToplevel> shellSurface1(Test::createXdgToplevelSurface(surface1.get()));
155 Window *window1 = Test::renderAndWaitForShown(surface1.get(), QSize(100, 50), Qt::blue);
156 QVERIFY(window1);
157 QVERIFY(window1->isActive());
158
159 std::unique_ptr<KWayland::Client::Surface> surface2(Test::createSurface());
160 std::unique_ptr<Test::XdgToplevel> shellSurface2(Test::createXdgToplevelSurface(surface2.get()));
161 Window *window2 = Test::renderAndWaitForShown(surface2.get(), QSize(100, 50), Qt::blue);
162 QVERIFY(window2);
163 QVERIFY(window2->isActive());
164
165 window1->move(QPoint(300, 200));
166 window2->move(QPoint(500, 200));
167
168 // Create several windows on the right screen.
169 std::unique_ptr<KWayland::Client::Surface> surface3(Test::createSurface());
170 std::unique_ptr<Test::XdgToplevel> shellSurface3(Test::createXdgToplevelSurface(surface3.get()));
171 Window *window3 = Test::renderAndWaitForShown(surface3.get(), QSize(100, 50), Qt::blue);
172 QVERIFY(window3);
173 QVERIFY(window3->isActive());
174
175 std::unique_ptr<KWayland::Client::Surface> surface4(Test::createSurface());
176 std::unique_ptr<Test::XdgToplevel> shellSurface4(Test::createXdgToplevelSurface(surface4.get()));
177 Window *window4 = Test::renderAndWaitForShown(surface4.get(), QSize(100, 50), Qt::blue);
178 QVERIFY(window4);
179 QVERIFY(window4->isActive());
180
181 window3->move(QPoint(1380, 200));
182 window4->move(QPoint(1580, 200));
183
184 // Switch to window to the right.
186 QVERIFY(window1->isActive());
187
188 // Switch to window to the right.
190 QVERIFY(window2->isActive());
191
192 // Switch to window to the right.
194 QVERIFY(window3->isActive());
195
196 // Switch to window to the right.
198 QVERIFY(window4->isActive());
199
200 // Destroy all windows.
201 shellSurface1.reset();
202 QVERIFY(Test::waitForWindowClosed(window1));
203 shellSurface2.reset();
204 QVERIFY(Test::waitForWindowClosed(window2));
205 shellSurface3.reset();
206 QVERIFY(Test::waitForWindowClosed(window3));
207 shellSurface4.reset();
208 QVERIFY(Test::waitForWindowClosed(window4));
209}
210
211void ActivationTest::testSwitchToWindowAbove()
212{
213 // This test verifies that "Switch to Window Above" shortcut works.
214
215 // Prepare the test environment.
216 stackScreensVertically();
217
218 // Create several windows on the top screen.
219 std::unique_ptr<KWayland::Client::Surface> surface1(Test::createSurface());
220 std::unique_ptr<Test::XdgToplevel> shellSurface1(Test::createXdgToplevelSurface(surface1.get()));
221 Window *window1 = Test::renderAndWaitForShown(surface1.get(), QSize(100, 50), Qt::blue);
222 QVERIFY(window1);
223 QVERIFY(window1->isActive());
224
225 std::unique_ptr<KWayland::Client::Surface> surface2(Test::createSurface());
226 std::unique_ptr<Test::XdgToplevel> shellSurface2(Test::createXdgToplevelSurface(surface2.get()));
227 Window *window2 = Test::renderAndWaitForShown(surface2.get(), QSize(100, 50), Qt::blue);
228 QVERIFY(window2);
229 QVERIFY(window2->isActive());
230
231 window1->move(QPoint(200, 300));
232 window2->move(QPoint(200, 500));
233
234 // Create several windows on the bottom screen.
235 std::unique_ptr<KWayland::Client::Surface> surface3(Test::createSurface());
236 std::unique_ptr<Test::XdgToplevel> shellSurface3(Test::createXdgToplevelSurface(surface3.get()));
237 Window *window3 = Test::renderAndWaitForShown(surface3.get(), QSize(100, 50), Qt::blue);
238 QVERIFY(window3);
239 QVERIFY(window3->isActive());
240
241 std::unique_ptr<KWayland::Client::Surface> surface4(Test::createSurface());
242 std::unique_ptr<Test::XdgToplevel> shellSurface4(Test::createXdgToplevelSurface(surface4.get()));
243 Window *window4 = Test::renderAndWaitForShown(surface4.get(), QSize(100, 50), Qt::blue);
244 QVERIFY(window4);
245 QVERIFY(window4->isActive());
246
247 window3->move(QPoint(200, 1224));
248 window4->move(QPoint(200, 1424));
249
250 // Switch to window above.
252 QVERIFY(window3->isActive());
253
254 // Switch to window above.
256 QVERIFY(window2->isActive());
257
258 // Switch to window above.
260 QVERIFY(window1->isActive());
261
262 // Switch to window above.
264 QVERIFY(window4->isActive());
265
266 // Destroy all windows.
267 shellSurface1.reset();
268 QVERIFY(Test::waitForWindowClosed(window1));
269 shellSurface2.reset();
270 QVERIFY(Test::waitForWindowClosed(window2));
271 shellSurface3.reset();
272 QVERIFY(Test::waitForWindowClosed(window3));
273 shellSurface4.reset();
274 QVERIFY(Test::waitForWindowClosed(window4));
275}
276
277void ActivationTest::testSwitchToWindowBelow()
278{
279 // This test verifies that "Switch to Window Bottom" shortcut works.
280
281 // Prepare the test environment.
282 stackScreensVertically();
283
284 // Create several windows on the top screen.
285 std::unique_ptr<KWayland::Client::Surface> surface1(Test::createSurface());
286 std::unique_ptr<Test::XdgToplevel> shellSurface1(Test::createXdgToplevelSurface(surface1.get()));
287 Window *window1 = Test::renderAndWaitForShown(surface1.get(), QSize(100, 50), Qt::blue);
288 QVERIFY(window1);
289 QVERIFY(window1->isActive());
290
291 std::unique_ptr<KWayland::Client::Surface> surface2(Test::createSurface());
292 std::unique_ptr<Test::XdgToplevel> shellSurface2(Test::createXdgToplevelSurface(surface2.get()));
293 Window *window2 = Test::renderAndWaitForShown(surface2.get(), QSize(100, 50), Qt::blue);
294 QVERIFY(window2);
295 QVERIFY(window2->isActive());
296
297 window1->move(QPoint(200, 300));
298 window2->move(QPoint(200, 500));
299
300 // Create several windows on the bottom screen.
301 std::unique_ptr<KWayland::Client::Surface> surface3(Test::createSurface());
302 std::unique_ptr<Test::XdgToplevel> shellSurface3(Test::createXdgToplevelSurface(surface3.get()));
303 Window *window3 = Test::renderAndWaitForShown(surface3.get(), QSize(100, 50), Qt::blue);
304 QVERIFY(window3);
305 QVERIFY(window3->isActive());
306
307 std::unique_ptr<KWayland::Client::Surface> surface4(Test::createSurface());
308 std::unique_ptr<Test::XdgToplevel> shellSurface4(Test::createXdgToplevelSurface(surface4.get()));
309 Window *window4 = Test::renderAndWaitForShown(surface4.get(), QSize(100, 50), Qt::blue);
310 QVERIFY(window4);
311 QVERIFY(window4->isActive());
312
313 window3->move(QPoint(200, 1224));
314 window4->move(QPoint(200, 1424));
315
316 // Switch to window below.
318 QVERIFY(window1->isActive());
319
320 // Switch to window below.
322 QVERIFY(window2->isActive());
323
324 // Switch to window below.
326 QVERIFY(window3->isActive());
327
328 // Switch to window below.
330 QVERIFY(window4->isActive());
331
332 // Destroy all windows.
333 shellSurface1.reset();
334 QVERIFY(Test::waitForWindowClosed(window1));
335 shellSurface2.reset();
336 QVERIFY(Test::waitForWindowClosed(window2));
337 shellSurface3.reset();
338 QVERIFY(Test::waitForWindowClosed(window3));
339 shellSurface4.reset();
340 QVERIFY(Test::waitForWindowClosed(window4));
341}
342
343void ActivationTest::testSwitchToWindowMaximized()
344{
345 // This test verifies that we switch to the top-most maximized window, i.e.
346 // the one that user sees at the moment. See bug 411356.
347
348 // Prepare the test environment.
349 stackScreensHorizontally();
350
351 // Create several maximized windows on the left screen.
352 std::unique_ptr<KWayland::Client::Surface> surface1(Test::createSurface());
353 std::unique_ptr<Test::XdgToplevel> shellSurface1(Test::createXdgToplevelSurface(surface1.get()));
354 QSignalSpy toplevelConfigureRequestedSpy1(shellSurface1.get(), &Test::XdgToplevel::configureRequested);
355 QSignalSpy surfaceConfigureRequestedSpy1(shellSurface1->xdgSurface(), &Test::XdgSurface::configureRequested);
356 Window *window1 = Test::renderAndWaitForShown(surface1.get(), QSize(100, 50), Qt::blue);
357 QVERIFY(window1);
358 QVERIFY(window1->isActive());
359 QVERIFY(surfaceConfigureRequestedSpy1.wait()); // Wait for the configure event with the activated state.
361 QVERIFY(surfaceConfigureRequestedSpy1.wait());
362 QSignalSpy frameGeometryChangedSpy1(window1, &Window::frameGeometryChanged);
363 shellSurface1->xdgSurface()->ack_configure(surfaceConfigureRequestedSpy1.last().at(0).value<quint32>());
364 Test::render(surface1.get(), toplevelConfigureRequestedSpy1.last().at(0).toSize(), Qt::red);
365 QVERIFY(frameGeometryChangedSpy1.wait());
366
367 std::unique_ptr<KWayland::Client::Surface> surface2(Test::createSurface());
368 std::unique_ptr<Test::XdgToplevel> shellSurface2(Test::createXdgToplevelSurface(surface2.get()));
369 QSignalSpy toplevelConfigureRequestedSpy2(shellSurface2.get(), &Test::XdgToplevel::configureRequested);
370 QSignalSpy surfaceConfigureRequestedSpy2(shellSurface2->xdgSurface(), &Test::XdgSurface::configureRequested);
371 Window *window2 = Test::renderAndWaitForShown(surface2.get(), QSize(100, 50), Qt::blue);
372 QVERIFY(window2);
373 QVERIFY(window2->isActive());
374 QVERIFY(surfaceConfigureRequestedSpy2.wait()); // Wait for the configure event with the activated state.
376 QVERIFY(surfaceConfigureRequestedSpy2.wait());
377 QSignalSpy frameGeometryChangedSpy2(window2, &Window::frameGeometryChanged);
378 shellSurface2->xdgSurface()->ack_configure(surfaceConfigureRequestedSpy2.last().at(0).value<quint32>());
379 Test::render(surface2.get(), toplevelConfigureRequestedSpy2.last().at(0).toSize(), Qt::red);
380 QVERIFY(frameGeometryChangedSpy2.wait());
381
382 const QList<Window *> stackingOrder = workspace()->stackingOrder();
383 QVERIFY(stackingOrder.indexOf(window1) < stackingOrder.indexOf(window2));
384 QCOMPARE(window1->maximizeMode(), MaximizeFull);
385 QCOMPARE(window2->maximizeMode(), MaximizeFull);
386
387 // Create several windows on the right screen.
388 std::unique_ptr<KWayland::Client::Surface> surface3(Test::createSurface());
389 std::unique_ptr<Test::XdgToplevel> shellSurface3(Test::createXdgToplevelSurface(surface3.get()));
390 Window *window3 = Test::renderAndWaitForShown(surface3.get(), QSize(100, 50), Qt::blue);
391 QVERIFY(window3);
392 QVERIFY(window3->isActive());
393
394 std::unique_ptr<KWayland::Client::Surface> surface4(Test::createSurface());
395 std::unique_ptr<Test::XdgToplevel> shellSurface4(Test::createXdgToplevelSurface(surface4.get()));
396 Window *window4 = Test::renderAndWaitForShown(surface4.get(), QSize(100, 50), Qt::blue);
397 QVERIFY(window4);
398 QVERIFY(window4->isActive());
399
400 window3->move(QPoint(1380, 200));
401 window4->move(QPoint(1580, 200));
402
403 // Switch to window to the left.
405 QVERIFY(window3->isActive());
406
407 // Switch to window to the left.
409 QVERIFY(window2->isActive());
410
411 // Switch to window to the left.
413 QVERIFY(window4->isActive());
414
415 // Destroy all windows.
416 shellSurface1.reset();
417 QVERIFY(Test::waitForWindowClosed(window1));
418 shellSurface2.reset();
419 QVERIFY(Test::waitForWindowClosed(window2));
420 shellSurface3.reset();
421 QVERIFY(Test::waitForWindowClosed(window3));
422 shellSurface4.reset();
423 QVERIFY(Test::waitForWindowClosed(window4));
424}
425
426void ActivationTest::testSwitchToWindowFullScreen()
427{
428 // This test verifies that we switch to the top-most fullscreen window, i.e.
429 // the one that user sees at the moment. See bug 411356.
430
431 // Prepare the test environment.
432 stackScreensVertically();
433
434 // Create several maximized windows on the top screen.
435 std::unique_ptr<KWayland::Client::Surface> surface1(Test::createSurface());
436 std::unique_ptr<Test::XdgToplevel> shellSurface1(Test::createXdgToplevelSurface(surface1.get()));
437 QSignalSpy toplevelConfigureRequestedSpy1(shellSurface1.get(), &Test::XdgToplevel::configureRequested);
438 QSignalSpy surfaceConfigureRequestedSpy1(shellSurface1->xdgSurface(), &Test::XdgSurface::configureRequested);
439 Window *window1 = Test::renderAndWaitForShown(surface1.get(), QSize(100, 50), Qt::blue);
440 QVERIFY(window1);
441 QVERIFY(window1->isActive());
442 QVERIFY(surfaceConfigureRequestedSpy1.wait()); // Wait for the configure event with the activated state.
444 QVERIFY(surfaceConfigureRequestedSpy1.wait());
445 QSignalSpy frameGeometryChangedSpy1(window1, &Window::frameGeometryChanged);
446 shellSurface1->xdgSurface()->ack_configure(surfaceConfigureRequestedSpy1.last().at(0).value<quint32>());
447 Test::render(surface1.get(), toplevelConfigureRequestedSpy1.last().at(0).toSize(), Qt::red);
448 QVERIFY(frameGeometryChangedSpy1.wait());
449
450 std::unique_ptr<KWayland::Client::Surface> surface2(Test::createSurface());
451 std::unique_ptr<Test::XdgToplevel> shellSurface2(Test::createXdgToplevelSurface(surface2.get()));
452 QSignalSpy toplevelConfigureRequestedSpy2(shellSurface2.get(), &Test::XdgToplevel::configureRequested);
453 QSignalSpy surfaceConfigureRequestedSpy2(shellSurface2->xdgSurface(), &Test::XdgSurface::configureRequested);
454 Window *window2 = Test::renderAndWaitForShown(surface2.get(), QSize(100, 50), Qt::blue);
455 QVERIFY(window2);
456 QVERIFY(window2->isActive());
457 QVERIFY(surfaceConfigureRequestedSpy2.wait()); // Wait for the configure event with the activated state.
459 QVERIFY(surfaceConfigureRequestedSpy2.wait());
460 QSignalSpy frameGeometryChangedSpy2(window2, &Window::frameGeometryChanged);
461 shellSurface2->xdgSurface()->ack_configure(surfaceConfigureRequestedSpy2.last().at(0).value<quint32>());
462 Test::render(surface2.get(), toplevelConfigureRequestedSpy2.last().at(0).toSize(), Qt::red);
463 QVERIFY(frameGeometryChangedSpy2.wait());
464
465 const QList<Window *> stackingOrder = workspace()->stackingOrder();
466 QVERIFY(stackingOrder.indexOf(window1) < stackingOrder.indexOf(window2));
467 QVERIFY(window1->isFullScreen());
468 QVERIFY(window2->isFullScreen());
469
470 // Create several windows on the bottom screen.
471 std::unique_ptr<KWayland::Client::Surface> surface3(Test::createSurface());
472 std::unique_ptr<Test::XdgToplevel> shellSurface3(Test::createXdgToplevelSurface(surface3.get()));
473 Window *window3 = Test::renderAndWaitForShown(surface3.get(), QSize(100, 50), Qt::blue);
474 QVERIFY(window3);
475 QVERIFY(window3->isActive());
476
477 std::unique_ptr<KWayland::Client::Surface> surface4(Test::createSurface());
478 std::unique_ptr<Test::XdgToplevel> shellSurface4(Test::createXdgToplevelSurface(surface4.get()));
479 Window *window4 = Test::renderAndWaitForShown(surface4.get(), QSize(100, 50), Qt::blue);
480 QVERIFY(window4);
481 QVERIFY(window4->isActive());
482
483 window3->move(QPoint(200, 1224));
484 window4->move(QPoint(200, 1424));
485
486 // Switch to window above.
488 QVERIFY(window3->isActive());
489
490 // Switch to window above.
492 QVERIFY(window2->isActive());
493
494 // Switch to window above.
496 QVERIFY(window4->isActive());
497
498 // Destroy all windows.
499 shellSurface1.reset();
500 QVERIFY(Test::waitForWindowClosed(window1));
501 shellSurface2.reset();
502 QVERIFY(Test::waitForWindowClosed(window2));
503 shellSurface3.reset();
504 QVERIFY(Test::waitForWindowClosed(window3));
505 shellSurface4.reset();
506 QVERIFY(Test::waitForWindowClosed(window4));
507}
508
509void ActivationTest::stackScreensHorizontally()
510{
511 // Process pending wl_output bind requests before destroying all outputs.
512 QTest::qWait(1);
513
514 const QList<QRect> screenGeometries{
515 QRect(0, 0, 1280, 1024),
516 QRect(1280, 0, 1280, 1024),
517 };
518 Test::setOutputConfig(screenGeometries);
519}
520
521void ActivationTest::stackScreensVertically()
522{
523 // Process pending wl_output bind requests before destroying all outputs.
524 QTest::qWait(1);
525
526 const QList<QRect> screenGeometries{
527 QRect(0, 0, 1280, 1024),
528 QRect(0, 1024, 1280, 1024),
529 };
530 Test::setOutputConfig(screenGeometries);
531}
532
533}
534
536#include "activation_test.moc"
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)
void frameGeometryChanged(const QRectF &oldGeometry)
const QList< Window * > & stackingOrder() const
Definition workspace.h:788
void switchWindow(Direction direction)
void slotWindowFullScreen()
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)
bool waitForWindowClosed(Window *window)
@ MaximizeFull
Equal to MaximizeVertical | MaximizeHorizontal.
Definition common.h:79
WaylandServer * waylandServer()
Workspace * workspace()
Definition workspace.h:830
InputRedirection * input()
Definition input.h:549