Changeset View
Changeset View
Standalone View
Standalone View
autotests/integration/scene_qpainter_test.cpp
Show All 16 Lines | |||||
17 | You should have received a copy of the GNU General Public License | 17 | You should have received a copy of the GNU General Public License | ||
18 | along with this program. If not, see <http://www.gnu.org/licenses/>. | 18 | along with this program. If not, see <http://www.gnu.org/licenses/>. | ||
19 | *********************************************************************/ | 19 | *********************************************************************/ | ||
20 | #include "kwin_wayland_test.h" | 20 | #include "kwin_wayland_test.h" | ||
21 | #include "composite.h" | 21 | #include "composite.h" | ||
22 | #include "effectloader.h" | 22 | #include "effectloader.h" | ||
23 | #include "client.h" | 23 | #include "client.h" | ||
24 | #include "cursor.h" | 24 | #include "cursor.h" | ||
25 | #include "effects.h" | ||||
25 | #include "platform.h" | 26 | #include "platform.h" | ||
26 | #include "scene_qpainter.h" | | |||
27 | #include "shell_client.h" | 27 | #include "shell_client.h" | ||
28 | #include "wayland_server.h" | 28 | #include "wayland_server.h" | ||
29 | #include "effect_builtins.h" | 29 | #include "effect_builtins.h" | ||
30 | #include "workspace.h" | 30 | #include "workspace.h" | ||
31 | 31 | | |||
32 | #include <KConfigGroup> | 32 | #include <KConfigGroup> | ||
33 | 33 | | |||
34 | #include <KWayland/Client/seat.h> | 34 | #include <KWayland/Client/seat.h> | ||
▲ Show 20 Lines • Show All 61 Lines • ▼ Show 20 Line(s) | 71 | { | |||
96 | QVERIFY(workspaceCreatedSpy.wait()); | 96 | QVERIFY(workspaceCreatedSpy.wait()); | ||
97 | QVERIFY(Compositor::self()); | 97 | QVERIFY(Compositor::self()); | ||
98 | } | 98 | } | ||
99 | 99 | | |||
100 | void SceneQPainterTest::testStartFrame() | 100 | void SceneQPainterTest::testStartFrame() | ||
101 | { | 101 | { | ||
102 | // this test verifies that the initial rendering is correct | 102 | // this test verifies that the initial rendering is correct | ||
103 | Compositor::self()->addRepaintFull(); | 103 | Compositor::self()->addRepaintFull(); | ||
104 | auto scene = qobject_cast<SceneQPainter*>(Compositor::self()->scene()); | 104 | auto scene = Compositor::self()->scene(); | ||
105 | QVERIFY(scene); | 105 | QVERIFY(scene); | ||
106 | QSignalSpy frameRenderedSpy(scene, &Scene::frameRendered); | 106 | QSignalSpy frameRenderedSpy(scene, &Scene::frameRendered); | ||
107 | QVERIFY(frameRenderedSpy.isValid()); | 107 | QVERIFY(frameRenderedSpy.isValid()); | ||
108 | QVERIFY(frameRenderedSpy.wait()); | 108 | QVERIFY(frameRenderedSpy.wait()); | ||
109 | // now let's render a reference image for comparison | 109 | // now let's render a reference image for comparison | ||
110 | QImage referenceImage(QSize(1280, 1024), QImage::Format_RGB32); | 110 | QImage referenceImage(QSize(1280, 1024), QImage::Format_RGB32); | ||
111 | referenceImage.fill(Qt::black); | 111 | referenceImage.fill(Qt::black); | ||
112 | QPainter p(&referenceImage); | 112 | QPainter p(&referenceImage); | ||
113 | const QImage cursorImage = kwinApp()->platform()->softwareCursor(); | 113 | const QImage cursorImage = kwinApp()->platform()->softwareCursor(); | ||
114 | QVERIFY(!cursorImage.isNull()); | 114 | QVERIFY(!cursorImage.isNull()); | ||
115 | p.drawImage(KWin::Cursor::pos() - kwinApp()->platform()->softwareCursorHotspot(), cursorImage); | 115 | p.drawImage(KWin::Cursor::pos() - kwinApp()->platform()->softwareCursorHotspot(), cursorImage); | ||
116 | QCOMPARE(referenceImage, *scene->backend()->buffer()); | 116 | QCOMPARE(referenceImage, *scene->qpainterRenderBuffer()); | ||
117 | } | 117 | } | ||
118 | 118 | | |||
119 | void SceneQPainterTest::testCursorMoving() | 119 | void SceneQPainterTest::testCursorMoving() | ||
120 | { | 120 | { | ||
121 | // this test verifies that rendering is correct also after moving the cursor a few times | 121 | // this test verifies that rendering is correct also after moving the cursor a few times | ||
122 | auto scene = qobject_cast<SceneQPainter*>(Compositor::self()->scene()); | 122 | auto scene = Compositor::self()->scene(); | ||
123 | QVERIFY(scene); | 123 | QVERIFY(scene); | ||
124 | QSignalSpy frameRenderedSpy(scene, &Scene::frameRendered); | 124 | QSignalSpy frameRenderedSpy(scene, &Scene::frameRendered); | ||
125 | QVERIFY(frameRenderedSpy.isValid()); | 125 | QVERIFY(frameRenderedSpy.isValid()); | ||
126 | KWin::Cursor::setPos(0, 0); | 126 | KWin::Cursor::setPos(0, 0); | ||
127 | QVERIFY(frameRenderedSpy.wait()); | 127 | QVERIFY(frameRenderedSpy.wait()); | ||
128 | KWin::Cursor::setPos(10, 0); | 128 | KWin::Cursor::setPos(10, 0); | ||
129 | QVERIFY(frameRenderedSpy.wait()); | 129 | QVERIFY(frameRenderedSpy.wait()); | ||
130 | KWin::Cursor::setPos(10, 12); | 130 | KWin::Cursor::setPos(10, 12); | ||
131 | QVERIFY(frameRenderedSpy.wait()); | 131 | QVERIFY(frameRenderedSpy.wait()); | ||
132 | KWin::Cursor::setPos(12, 14); | 132 | KWin::Cursor::setPos(12, 14); | ||
133 | QVERIFY(frameRenderedSpy.wait()); | 133 | QVERIFY(frameRenderedSpy.wait()); | ||
134 | KWin::Cursor::setPos(50, 60); | 134 | KWin::Cursor::setPos(50, 60); | ||
135 | QVERIFY(frameRenderedSpy.wait()); | 135 | QVERIFY(frameRenderedSpy.wait()); | ||
136 | KWin::Cursor::setPos(45, 45); | 136 | KWin::Cursor::setPos(45, 45); | ||
137 | QVERIFY(frameRenderedSpy.wait()); | 137 | QVERIFY(frameRenderedSpy.wait()); | ||
138 | // now let's render a reference image for comparison | 138 | // now let's render a reference image for comparison | ||
139 | QImage referenceImage(QSize(1280, 1024), QImage::Format_RGB32); | 139 | QImage referenceImage(QSize(1280, 1024), QImage::Format_RGB32); | ||
140 | referenceImage.fill(Qt::black); | 140 | referenceImage.fill(Qt::black); | ||
141 | QPainter p(&referenceImage); | 141 | QPainter p(&referenceImage); | ||
142 | const QImage cursorImage = kwinApp()->platform()->softwareCursor(); | 142 | const QImage cursorImage = kwinApp()->platform()->softwareCursor(); | ||
143 | QVERIFY(!cursorImage.isNull()); | 143 | QVERIFY(!cursorImage.isNull()); | ||
144 | p.drawImage(QPoint(45, 45) - kwinApp()->platform()->softwareCursorHotspot(), cursorImage); | 144 | p.drawImage(QPoint(45, 45) - kwinApp()->platform()->softwareCursorHotspot(), cursorImage); | ||
145 | QCOMPARE(referenceImage, *scene->backend()->buffer()); | 145 | QCOMPARE(referenceImage, *scene->qpainterRenderBuffer()); | ||
146 | } | 146 | } | ||
147 | 147 | | |||
148 | void SceneQPainterTest::testWindow_data() | 148 | void SceneQPainterTest::testWindow_data() | ||
149 | { | 149 | { | ||
150 | QTest::addColumn<Test::ShellSurfaceType>("type"); | 150 | QTest::addColumn<Test::ShellSurfaceType>("type"); | ||
151 | 151 | | |||
152 | QTest::newRow("wlShell") << Test::ShellSurfaceType::WlShell; | 152 | QTest::newRow("wlShell") << Test::ShellSurfaceType::WlShell; | ||
153 | QTest::newRow("xdgShellV5") << Test::ShellSurfaceType::XdgShellV5; | 153 | QTest::newRow("xdgShellV5") << Test::ShellSurfaceType::XdgShellV5; | ||
154 | } | 154 | } | ||
155 | 155 | | |||
156 | void SceneQPainterTest::testWindow() | 156 | void SceneQPainterTest::testWindow() | ||
157 | { | 157 | { | ||
158 | KWin::Cursor::setPos(45, 45); | 158 | KWin::Cursor::setPos(45, 45); | ||
159 | // this test verifies that a window is rendered correctly | 159 | // this test verifies that a window is rendered correctly | ||
160 | using namespace KWayland::Client; | 160 | using namespace KWayland::Client; | ||
161 | QVERIFY(Test::setupWaylandConnection(Test::AdditionalWaylandInterface::Seat)); | 161 | QVERIFY(Test::setupWaylandConnection(Test::AdditionalWaylandInterface::Seat)); | ||
162 | QVERIFY(Test::waitForWaylandPointer()); | 162 | QVERIFY(Test::waitForWaylandPointer()); | ||
163 | QScopedPointer<Surface> s(Test::createSurface()); | 163 | QScopedPointer<Surface> s(Test::createSurface()); | ||
164 | QFETCH(Test::ShellSurfaceType, type); | 164 | QFETCH(Test::ShellSurfaceType, type); | ||
165 | QScopedPointer<QObject> ss(Test::createShellSurface(type, s.data())); | 165 | QScopedPointer<QObject> ss(Test::createShellSurface(type, s.data())); | ||
166 | QScopedPointer<Pointer> p(Test::waylandSeat()->createPointer()); | 166 | QScopedPointer<Pointer> p(Test::waylandSeat()->createPointer()); | ||
167 | 167 | | |||
168 | auto scene = qobject_cast<SceneQPainter*>(KWin::Compositor::self()->scene()); | 168 | auto scene = KWin::Compositor::self()->scene(); | ||
169 | QVERIFY(scene); | 169 | QVERIFY(scene); | ||
170 | QSignalSpy frameRenderedSpy(scene, &Scene::frameRendered); | 170 | QSignalSpy frameRenderedSpy(scene, &Scene::frameRendered); | ||
171 | QVERIFY(frameRenderedSpy.isValid()); | 171 | QVERIFY(frameRenderedSpy.isValid()); | ||
172 | 172 | | |||
173 | // now let's map the window | 173 | // now let's map the window | ||
174 | QVERIFY(Test::renderAndWaitForShown(s.data(), QSize(200, 300), Qt::blue)); | 174 | QVERIFY(Test::renderAndWaitForShown(s.data(), QSize(200, 300), Qt::blue)); | ||
175 | // which should trigger a frame | 175 | // which should trigger a frame | ||
176 | if (frameRenderedSpy.isEmpty()) { | 176 | if (frameRenderedSpy.isEmpty()) { | ||
177 | QVERIFY(frameRenderedSpy.wait()); | 177 | QVERIFY(frameRenderedSpy.wait()); | ||
178 | } | 178 | } | ||
179 | // we didn't set a cursor image on the surface yet, so it should be just black + window | 179 | // we didn't set a cursor image on the surface yet, so it should be just black + window | ||
180 | QImage referenceImage(QSize(1280, 1024), QImage::Format_RGB32); | 180 | QImage referenceImage(QSize(1280, 1024), QImage::Format_RGB32); | ||
181 | referenceImage.fill(Qt::black); | 181 | referenceImage.fill(Qt::black); | ||
182 | QPainter painter(&referenceImage); | 182 | QPainter painter(&referenceImage); | ||
183 | painter.fillRect(0, 0, 200, 300, Qt::blue); | 183 | painter.fillRect(0, 0, 200, 300, Qt::blue); | ||
184 | QCOMPARE(referenceImage, *scene->backend()->buffer()); | 184 | QCOMPARE(referenceImage, *scene->qpainterRenderBuffer()); | ||
185 | 185 | | |||
186 | // now let's set a cursor image | 186 | // now let's set a cursor image | ||
187 | QScopedPointer<Surface> cs(Test::createSurface()); | 187 | QScopedPointer<Surface> cs(Test::createSurface()); | ||
188 | QVERIFY(!cs.isNull()); | 188 | QVERIFY(!cs.isNull()); | ||
189 | Test::render(cs.data(), QSize(10, 10), Qt::red); | 189 | Test::render(cs.data(), QSize(10, 10), Qt::red); | ||
190 | p->setCursor(cs.data(), QPoint(5, 5)); | 190 | p->setCursor(cs.data(), QPoint(5, 5)); | ||
191 | QVERIFY(frameRenderedSpy.wait()); | 191 | QVERIFY(frameRenderedSpy.wait()); | ||
192 | painter.fillRect(KWin::Cursor::pos().x() - 5, KWin::Cursor::pos().y() - 5, 10, 10, Qt::red); | 192 | painter.fillRect(KWin::Cursor::pos().x() - 5, KWin::Cursor::pos().y() - 5, 10, 10, Qt::red); | ||
193 | QCOMPARE(referenceImage, *scene->backend()->buffer()); | 193 | QCOMPARE(referenceImage, *scene->qpainterRenderBuffer()); | ||
194 | // let's move the cursor again | 194 | // let's move the cursor again | ||
195 | KWin::Cursor::setPos(10, 10); | 195 | KWin::Cursor::setPos(10, 10); | ||
196 | QVERIFY(frameRenderedSpy.wait()); | 196 | QVERIFY(frameRenderedSpy.wait()); | ||
197 | painter.fillRect(0, 0, 200, 300, Qt::blue); | 197 | painter.fillRect(0, 0, 200, 300, Qt::blue); | ||
198 | painter.fillRect(5, 5, 10, 10, Qt::red); | 198 | painter.fillRect(5, 5, 10, 10, Qt::red); | ||
199 | QCOMPARE(referenceImage, *scene->backend()->buffer()); | 199 | QCOMPARE(referenceImage, *scene->qpainterRenderBuffer()); | ||
200 | } | 200 | } | ||
201 | 201 | | |||
202 | void SceneQPainterTest::testWindowScaled() | 202 | void SceneQPainterTest::testWindowScaled() | ||
203 | { | 203 | { | ||
204 | KWin::Cursor::setPos(10, 10); | 204 | KWin::Cursor::setPos(10, 10); | ||
205 | // this test verifies that a window is rendered correctly | 205 | // this test verifies that a window is rendered correctly | ||
206 | using namespace KWayland::Client; | 206 | using namespace KWayland::Client; | ||
207 | QVERIFY(Test::setupWaylandConnection(Test::AdditionalWaylandInterface::Seat)); | 207 | QVERIFY(Test::setupWaylandConnection(Test::AdditionalWaylandInterface::Seat)); | ||
208 | QVERIFY(Test::waitForWaylandPointer()); | 208 | QVERIFY(Test::waitForWaylandPointer()); | ||
209 | QScopedPointer<Surface> s(Test::createSurface()); | 209 | QScopedPointer<Surface> s(Test::createSurface()); | ||
210 | QScopedPointer<ShellSurface> ss(Test::createShellSurface(s.data())); | 210 | QScopedPointer<ShellSurface> ss(Test::createShellSurface(s.data())); | ||
211 | QScopedPointer<Pointer> p(Test::waylandSeat()->createPointer()); | 211 | QScopedPointer<Pointer> p(Test::waylandSeat()->createPointer()); | ||
212 | 212 | | |||
213 | auto scene = qobject_cast<SceneQPainter*>(KWin::Compositor::self()->scene()); | 213 | auto scene = KWin::Compositor::self()->scene(); | ||
214 | QVERIFY(scene); | 214 | QVERIFY(scene); | ||
215 | QSignalSpy frameRenderedSpy(scene, &Scene::frameRendered); | 215 | QSignalSpy frameRenderedSpy(scene, &Scene::frameRendered); | ||
216 | QVERIFY(frameRenderedSpy.isValid()); | 216 | QVERIFY(frameRenderedSpy.isValid()); | ||
217 | 217 | | |||
218 | // now let's set a cursor image | 218 | // now let's set a cursor image | ||
219 | QScopedPointer<Surface> cs(Test::createSurface()); | 219 | QScopedPointer<Surface> cs(Test::createSurface()); | ||
220 | QVERIFY(!cs.isNull()); | 220 | QVERIFY(!cs.isNull()); | ||
221 | Test::render(cs.data(), QSize(10, 10), Qt::red); | 221 | Test::render(cs.data(), QSize(10, 10), Qt::red); | ||
Show All 19 Lines | |||||
241 | } | 241 | } | ||
242 | QImage referenceImage(QSize(1280, 1024), QImage::Format_RGB32); | 242 | QImage referenceImage(QSize(1280, 1024), QImage::Format_RGB32); | ||
243 | referenceImage.fill(Qt::black); | 243 | referenceImage.fill(Qt::black); | ||
244 | QPainter painter(&referenceImage); | 244 | QPainter painter(&referenceImage); | ||
245 | painter.fillRect(0, 0, 200, 300, Qt::blue); | 245 | painter.fillRect(0, 0, 200, 300, Qt::blue); | ||
246 | painter.fillRect(100, 150, 100, 100, Qt::red); | 246 | painter.fillRect(100, 150, 100, 100, Qt::red); | ||
247 | painter.fillRect(5, 5, 10, 10, Qt::red); //cursor | 247 | painter.fillRect(5, 5, 10, 10, Qt::red); //cursor | ||
248 | 248 | | |||
249 | QCOMPARE(referenceImage, *scene->backend()->buffer()); | 249 | QCOMPARE(referenceImage, *scene->qpainterRenderBuffer()); | ||
250 | } | 250 | } | ||
251 | 251 | | |||
252 | void SceneQPainterTest::testCompositorRestart_data() | 252 | void SceneQPainterTest::testCompositorRestart_data() | ||
253 | { | 253 | { | ||
254 | QTest::addColumn<Test::ShellSurfaceType>("type"); | 254 | QTest::addColumn<Test::ShellSurfaceType>("type"); | ||
255 | 255 | | |||
256 | QTest::newRow("wlShell") << Test::ShellSurfaceType::WlShell; | 256 | QTest::newRow("wlShell") << Test::ShellSurfaceType::WlShell; | ||
257 | QTest::newRow("xdgShellV5") << Test::ShellSurfaceType::XdgShellV5; | 257 | QTest::newRow("xdgShellV5") << Test::ShellSurfaceType::XdgShellV5; | ||
Show All 17 Lines | 261 | { | |||
275 | QVERIFY(oldScene); | 275 | QVERIFY(oldScene); | ||
276 | QSignalSpy sceneCreatedSpy(KWin::Compositor::self(), &KWin::Compositor::sceneCreated); | 276 | QSignalSpy sceneCreatedSpy(KWin::Compositor::self(), &KWin::Compositor::sceneCreated); | ||
277 | QVERIFY(sceneCreatedSpy.isValid()); | 277 | QVERIFY(sceneCreatedSpy.isValid()); | ||
278 | KWin::Compositor::self()->slotReinitialize(); | 278 | KWin::Compositor::self()->slotReinitialize(); | ||
279 | if (sceneCreatedSpy.isEmpty()) { | 279 | if (sceneCreatedSpy.isEmpty()) { | ||
280 | QVERIFY(sceneCreatedSpy.wait()); | 280 | QVERIFY(sceneCreatedSpy.wait()); | ||
281 | } | 281 | } | ||
282 | QCOMPARE(sceneCreatedSpy.count(), 1); | 282 | QCOMPARE(sceneCreatedSpy.count(), 1); | ||
283 | auto scene = qobject_cast<SceneQPainter*>(KWin::Compositor::self()->scene()); | 283 | auto scene = KWin::Compositor::self()->scene(); | ||
284 | QVERIFY(scene); | 284 | QVERIFY(scene); | ||
285 | 285 | | |||
286 | // this should directly trigger a frame | 286 | // this should directly trigger a frame | ||
287 | KWin::Compositor::self()->addRepaintFull(); | 287 | KWin::Compositor::self()->addRepaintFull(); | ||
288 | QSignalSpy frameRenderedSpy(scene, &Scene::frameRendered); | 288 | QSignalSpy frameRenderedSpy(scene, &Scene::frameRendered); | ||
289 | QVERIFY(frameRenderedSpy.isValid()); | 289 | QVERIFY(frameRenderedSpy.isValid()); | ||
290 | QVERIFY(frameRenderedSpy.wait()); | 290 | QVERIFY(frameRenderedSpy.wait()); | ||
291 | 291 | | |||
292 | // render reference image | 292 | // render reference image | ||
293 | QImage referenceImage(QSize(1280, 1024), QImage::Format_RGB32); | 293 | QImage referenceImage(QSize(1280, 1024), QImage::Format_RGB32); | ||
294 | referenceImage.fill(Qt::black); | 294 | referenceImage.fill(Qt::black); | ||
295 | QPainter painter(&referenceImage); | 295 | QPainter painter(&referenceImage); | ||
296 | painter.fillRect(0, 0, 200, 300, Qt::blue); | 296 | painter.fillRect(0, 0, 200, 300, Qt::blue); | ||
297 | const QImage cursorImage = kwinApp()->platform()->softwareCursor(); | 297 | const QImage cursorImage = kwinApp()->platform()->softwareCursor(); | ||
298 | QVERIFY(!cursorImage.isNull()); | 298 | QVERIFY(!cursorImage.isNull()); | ||
299 | painter.drawImage(QPoint(400, 400) - kwinApp()->platform()->softwareCursorHotspot(), cursorImage); | 299 | painter.drawImage(QPoint(400, 400) - kwinApp()->platform()->softwareCursorHotspot(), cursorImage); | ||
300 | QCOMPARE(referenceImage, *scene->backend()->buffer()); | 300 | QCOMPARE(referenceImage, *scene->qpainterRenderBuffer()); | ||
301 | } | 301 | } | ||
302 | 302 | | |||
303 | struct XcbConnectionDeleter | 303 | struct XcbConnectionDeleter | ||
304 | { | 304 | { | ||
305 | static inline void cleanup(xcb_connection_t *pointer) | 305 | static inline void cleanup(xcb_connection_t *pointer) | ||
306 | { | 306 | { | ||
307 | xcb_disconnect(pointer); | 307 | xcb_disconnect(pointer); | ||
308 | } | 308 | } | ||
▲ Show 20 Lines • Show All 47 Lines • ▼ Show 20 Line(s) | 312 | { | |||
356 | QTRY_COMPARE(client->surface()->buffer()->data().size(), client->geometry().size()); | 356 | QTRY_COMPARE(client->surface()->buffer()->data().size(), client->geometry().size()); | ||
357 | QImage compareImage(client->clientSize(), QImage::Format_RGB32); | 357 | QImage compareImage(client->clientSize(), QImage::Format_RGB32); | ||
358 | compareImage.fill(Qt::white); | 358 | compareImage.fill(Qt::white); | ||
359 | QCOMPARE(client->surface()->buffer()->data().copy(QRect(client->clientPos(), client->clientSize())), compareImage); | 359 | QCOMPARE(client->surface()->buffer()->data().copy(QRect(client->clientPos(), client->clientSize())), compareImage); | ||
360 | 360 | | |||
361 | // enough time for rendering the window | 361 | // enough time for rendering the window | ||
362 | QTest::qWait(100); | 362 | QTest::qWait(100); | ||
363 | 363 | | |||
364 | auto scene = qobject_cast<SceneQPainter*>(KWin::Compositor::self()->scene()); | 364 | auto scene = KWin::Compositor::self()->scene(); | ||
365 | QVERIFY(scene); | 365 | QVERIFY(scene); | ||
366 | 366 | | |||
367 | // this should directly trigger a frame | 367 | // this should directly trigger a frame | ||
368 | KWin::Compositor::self()->addRepaintFull(); | 368 | KWin::Compositor::self()->addRepaintFull(); | ||
369 | QSignalSpy frameRenderedSpy(scene, &Scene::frameRendered); | 369 | QSignalSpy frameRenderedSpy(scene, &Scene::frameRendered); | ||
370 | QVERIFY(frameRenderedSpy.isValid()); | 370 | QVERIFY(frameRenderedSpy.isValid()); | ||
371 | QVERIFY(frameRenderedSpy.wait()); | 371 | QVERIFY(frameRenderedSpy.wait()); | ||
372 | 372 | | |||
373 | const QPoint startPos = client->pos() + client->clientPos(); | 373 | const QPoint startPos = client->pos() + client->clientPos(); | ||
374 | auto image = scene->backend()->buffer(); | 374 | auto image = scene->qpainterRenderBuffer(); | ||
375 | QCOMPARE(image->copy(QRect(startPos, client->clientSize())), compareImage); | 375 | QCOMPARE(image->copy(QRect(startPos, client->clientSize())), compareImage); | ||
376 | 376 | | |||
377 | // and destroy the window again | 377 | // and destroy the window again | ||
378 | xcb_unmap_window(c.data(), w); | 378 | xcb_unmap_window(c.data(), w); | ||
379 | xcb_flush(c.data()); | 379 | xcb_flush(c.data()); | ||
380 | 380 | | |||
381 | QSignalSpy windowClosedSpy(client, &Client::windowClosed); | 381 | QSignalSpy windowClosedSpy(client, &Client::windowClosed); | ||
382 | QVERIFY(windowClosedSpy.isValid()); | 382 | QVERIFY(windowClosedSpy.isValid()); | ||
383 | QVERIFY(windowClosedSpy.wait()); | 383 | QVERIFY(windowClosedSpy.wait()); | ||
384 | xcb_destroy_window(c.data(), w); | 384 | xcb_destroy_window(c.data(), w); | ||
385 | c.reset(); | 385 | c.reset(); | ||
386 | } | 386 | } | ||
387 | 387 | | |||
388 | WAYLANDTEST_MAIN(SceneQPainterTest) | 388 | WAYLANDTEST_MAIN(SceneQPainterTest) | ||
389 | #include "scene_qpainter_test.moc" | 389 | #include "scene_qpainter_test.moc" |