Warning, file /plasma/kwin/autotests/integration/buffer_size_change_test.cpp was not indexed or was modified since last indexation (in which case cross-reference links may be missing, inaccurate or erroneous).
0001 /* 0002 KWin - the KDE window manager 0003 This file is part of the KDE project. 0004 0005 SPDX-FileCopyrightText: 2019 Roman Gilg <subdiff@gmail.com> 0006 0007 SPDX-License-Identifier: GPL-2.0-or-later 0008 */ 0009 #include "generic_scene_opengl_test.h" 0010 0011 #include "composite.h" 0012 #include "scene/workspacescene.h" 0013 #include "wayland_server.h" 0014 #include "window.h" 0015 0016 #include <KWayland/Client/subsurface.h> 0017 #include <KWayland/Client/surface.h> 0018 0019 namespace KWin 0020 { 0021 0022 static const QString s_socketName = QStringLiteral("wayland_test_buffer_size_change-0"); 0023 0024 class BufferSizeChangeTest : public GenericSceneOpenGLTest 0025 { 0026 Q_OBJECT 0027 public: 0028 BufferSizeChangeTest() 0029 : GenericSceneOpenGLTest(QByteArrayLiteral("O2")) 0030 { 0031 } 0032 private Q_SLOTS: 0033 void init(); 0034 void testShmBufferSizeChange(); 0035 void testShmBufferSizeChangeOnSubSurface(); 0036 }; 0037 0038 void BufferSizeChangeTest::init() 0039 { 0040 QVERIFY(Test::setupWaylandConnection()); 0041 } 0042 0043 void BufferSizeChangeTest::testShmBufferSizeChange() 0044 { 0045 // This test verifies that an SHM buffer size change is handled correctly 0046 0047 std::unique_ptr<KWayland::Client::Surface> surface(Test::createSurface()); 0048 QVERIFY(surface != nullptr); 0049 0050 std::unique_ptr<Test::XdgToplevel> shellSurface(Test::createXdgToplevelSurface(surface.get())); 0051 QVERIFY(shellSurface != nullptr); 0052 0053 // set buffer size 0054 Window *window = Test::renderAndWaitForShown(surface.get(), QSize(100, 50), Qt::blue); 0055 QVERIFY(window); 0056 0057 // add a first repaint 0058 QSignalSpy frameRenderedSpy(Compositor::self()->scene(), &WorkspaceScene::frameRendered); 0059 Compositor::self()->scene()->addRepaintFull(); 0060 QVERIFY(frameRenderedSpy.wait()); 0061 0062 // now change buffer size 0063 Test::render(surface.get(), QSize(30, 10), Qt::red); 0064 0065 QSignalSpy damagedSpy(window, &Window::damaged); 0066 QVERIFY(damagedSpy.wait()); 0067 KWin::Compositor::self()->scene()->addRepaintFull(); 0068 QVERIFY(frameRenderedSpy.wait()); 0069 } 0070 0071 void BufferSizeChangeTest::testShmBufferSizeChangeOnSubSurface() 0072 { 0073 // setup parent surface 0074 std::unique_ptr<KWayland::Client::Surface> parentSurface(Test::createSurface()); 0075 QVERIFY(parentSurface != nullptr); 0076 std::unique_ptr<Test::XdgToplevel> shellSurface(Test::createXdgToplevelSurface(parentSurface.get())); 0077 QVERIFY(shellSurface != nullptr); 0078 0079 // setup sub surface 0080 std::unique_ptr<KWayland::Client::Surface> surface(Test::createSurface()); 0081 QVERIFY(surface != nullptr); 0082 std::unique_ptr<KWayland::Client::SubSurface> subSurface(Test::createSubSurface(surface.get(), parentSurface.get())); 0083 QVERIFY(subSurface != nullptr); 0084 0085 // set buffer sizes 0086 Test::render(surface.get(), QSize(30, 10), Qt::red); 0087 Window *parent = Test::renderAndWaitForShown(parentSurface.get(), QSize(100, 50), Qt::blue); 0088 QVERIFY(parent); 0089 0090 // add a first repaint 0091 QSignalSpy frameRenderedSpy(Compositor::self()->scene(), &WorkspaceScene::frameRendered); 0092 Compositor::self()->scene()->addRepaintFull(); 0093 QVERIFY(frameRenderedSpy.wait()); 0094 0095 // change buffer size of sub surface 0096 QSignalSpy damagedParentSpy(parent, &Window::damaged); 0097 Test::render(surface.get(), QSize(20, 10), Qt::red); 0098 parentSurface->commit(KWayland::Client::Surface::CommitFlag::None); 0099 0100 QVERIFY(damagedParentSpy.wait()); 0101 0102 // add a second repaint 0103 KWin::Compositor::self()->scene()->addRepaintFull(); 0104 QVERIFY(frameRenderedSpy.wait()); 0105 } 0106 0107 } 0108 0109 WAYLANDTEST_MAIN(KWin::BufferSizeChangeTest) 0110 #include "buffer_size_change_test.moc"