[prev in list] [next in list] [prev in thread] [next in thread]
List: kde-commits
Subject: [kwin] /: Merge branch 'Plasma/5.6'
From: Martin_Gräßlin <mgraesslin () kde ! org>
Date: 2016-04-26 11:13:31
Message-ID: E1av0vr-0004mi-Jb () scm ! kde ! org
[Download RAW message or body]
Git commit e64450c80714b1dc1023c5db613be7323c3ac1ed by Martin Gräßlin.
Committed on 26/04/2016 at 11:13.
Pushed by graesslin into branch 'master'.
Merge branch 'Plasma/5.6'
M +9 -0 autotests/wayland/CMakeLists.txt
M +224 -0 autotests/wayland/dont_crash_empty_deco.cpp
M +3 -2 autotests/wayland/kwin_wayland_test.cpp
M +1 -0 composite.cpp
M +2 -0 effects/morphingpopups/package/metadata.desktop
M +3 -2 main_wayland.cpp
M +5 -0 scene_opengl.cpp
M +5 -3 wayland_server.cpp
http://commits.kde.org/kwin/e64450c80714b1dc1023c5db613be7323c3ac1ed
diff --cc autotests/wayland/CMakeLists.txt
index b460b21,9c6d5a4..8519bf8
--- a/autotests/wayland/CMakeLists.txt
+++ b/autotests/wayland/CMakeLists.txt
@@@ -129,21 -127,10 +129,30 @@@ add_test(kwin-testTransientPlacmenet te
ecm_mark_as_test(testTransientPlacmenet)
########################################################
+# Debug Console Test
+########################################################
+set( testDebugConsole_SRCS debug_console_test.cpp kwin_wayland_test.cpp )
+add_executable(testDebugConsole ${testDebugConsole_SRCS})
+target_link_libraries( testDebugConsole kwin Qt5::Test)
+add_test(kwin-testDebugConsole testDebugConsole)
+ecm_mark_as_test(testDebugConsole)
+
+########################################################
+# Struts Test
+########################################################
+if (XCB_ICCCM_FOUND)
+ set( testStruts_SRCS struts_test.cpp kwin_wayland_test.cpp )
+ add_executable(testStruts ${testStruts_SRCS})
+ target_link_libraries( testStruts kwin Qt5::Test XCB::ICCCM)
+ add_test(kwin-testStruts testStruts)
+ ecm_mark_as_test(testStruts)
+endif()
++
++########################################################
+ # Dont Crash Empty Deco Test
+ ########################################################
+ set( testDontCrashEmptyDeco_SRCS dont_crash_empty_deco.cpp kwin_wayland_test.cpp )
+ add_executable(testDontCrashEmptyDeco ${testDontCrashEmptyDeco_SRCS})
+ target_link_libraries( testDontCrashEmptyDeco kwin Qt5::Test)
+ add_test(kwin-testDontCrashEmptyDeco testDontCrashEmptyDeco)
+ ecm_mark_as_test(testDontCrashEmptyDeco)
diff --cc autotests/wayland/dont_crash_empty_deco.cpp
index 0000000,7ae4a2e..8ca2f2e
mode 000000,100644..100644
--- a/autotests/wayland/dont_crash_empty_deco.cpp
+++ b/autotests/wayland/dont_crash_empty_deco.cpp
@@@ -1,0 -1,224 +1,224 @@@
+ /********************************************************************
+ KWin - the KDE window manager
+ This file is part of the KDE project.
+
+ Copyright (C) 2016 Martin Gräßlin <mgraesslin@kde.org>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *********************************************************************/
+ #include "kwin_wayland_test.h"
-#include "abstract_backend.h"
++#include "platform.h"
+ #include "client.h"
+ #include "cursor.h"
+ #include "screenedge.h"
+ #include "screens.h"
+ #include "wayland_server.h"
+ #include "workspace.h"
+ #include "shell_client.h"
+ #include <kwineffects.h>
+
+ #include <KWayland/Client/connection_thread.h>
+ #include <KWayland/Client/compositor.h>
+ #include <KWayland/Client/event_queue.h>
+ #include <KWayland/Client/registry.h>
+ #include <KWayland/Client/pointer.h>
+ #include <KWayland/Client/server_decoration.h>
+ #include <KWayland/Client/shell.h>
+ #include <KWayland/Client/seat.h>
+ #include <KWayland/Client/shm_pool.h>
+ #include <KWayland/Client/surface.h>
+
+ #include <KDecoration2/Decoration>
+
+ #include <linux/input.h>
+
+ namespace KWin
+ {
+
+ static const QString s_socketName = \
QStringLiteral("wayland_test_kwin_dont_crash_empty_decoration-0"); +
+ class DontCrashEmptyDecorationTest : public QObject
+ {
+ Q_OBJECT
+ private Q_SLOTS:
+ void initTestCase();
+ void init();
+ void cleanup();
+ void testBug361551();
+
+ private:
+ KWayland::Client::ConnectionThread *m_connection = nullptr;
+ KWayland::Client::Compositor *m_compositor = nullptr;
+ KWayland::Client::ServerSideDecorationManager *m_deco = nullptr;
+ KWayland::Client::Seat *m_seat = nullptr;
+ KWayland::Client::ShmPool *m_shm = nullptr;
+ KWayland::Client::Shell *m_shell = nullptr;
+ KWayland::Client::EventQueue *m_queue = nullptr;
+ QThread *m_thread = nullptr;
+ };
+
+ void DontCrashEmptyDecorationTest::initTestCase()
+ {
+ if (!QFile::exists(QStringLiteral("/dev/dri/card0"))) {
+ QSKIP("Needs a dri device");
+ }
+ qRegisterMetaType<KWin::ShellClient*>();
+ qRegisterMetaType<KWin::AbstractClient*>();
+ QSignalSpy workspaceCreatedSpy(kwinApp(), &Application::workspaceCreated);
+ QVERIFY(workspaceCreatedSpy.isValid());
- waylandServer()->backend()->setInitialWindowSize(QSize(1280, 1024));
- QMetaObject::invokeMethod(waylandServer()->backend(), "setOutputCount", \
Qt::DirectConnection, Q_ARG(int, 2)); ++ \
kwinApp()->platform()->setInitialWindowSize(QSize(1280, 1024)); ++ \
QMetaObject::invokeMethod(kwinApp()->platform(), "setOutputCount", \
Qt::DirectConnection, Q_ARG(int, 2)); + \
waylandServer()->init(s_socketName.toLocal8Bit()); +
+ // this test needs to enforce OpenGL compositing to get into the crashy \
condition + qputenv("KWIN_COMPOSE", QByteArrayLiteral("O2"));
+ kwinApp()->start();
+ QVERIFY(workspaceCreatedSpy.wait());
+ QCOMPARE(screens()->count(), 2);
+ QCOMPARE(screens()->geometry(0), QRect(0, 0, 1280, 1024));
+ QCOMPARE(screens()->geometry(1), QRect(1280, 0, 1280, 1024));
+ setenv("QT_QPA_PLATFORM", "wayland", true);
+ waylandServer()->initWorkspace();
+ }
+
+ void DontCrashEmptyDecorationTest::init()
+ {
+ using namespace KWayland::Client;
+ // setup connection
+ m_connection = new ConnectionThread;
+ QSignalSpy connectedSpy(m_connection, &ConnectionThread::connected);
+ QVERIFY(connectedSpy.isValid());
+ m_connection->setSocketName(s_socketName);
+
+ m_thread = new QThread(this);
+ m_connection->moveToThread(m_thread);
+ m_thread->start();
+
+ m_connection->initConnection();
+ QVERIFY(connectedSpy.wait());
+
+ m_queue = new EventQueue(this);
+ QVERIFY(!m_queue->isValid());
+ m_queue->setup(m_connection);
+ QVERIFY(m_queue->isValid());
+
+ Registry registry;
+ registry.setEventQueue(m_queue);
+ QSignalSpy compositorSpy(®istry, &Registry::compositorAnnounced);
+ QSignalSpy shmSpy(®istry, &Registry::shmAnnounced);
+ QSignalSpy shellSpy(®istry, &Registry::shellAnnounced);
+ QSignalSpy seatSpy(®istry, &Registry::seatAnnounced);
+ QSignalSpy decorationSpy(®istry, \
&Registry::serverSideDecorationManagerAnnounced); + QSignalSpy \
allAnnounced(®istry, &Registry::interfacesAnnounced); + \
QVERIFY(allAnnounced.isValid()); + QVERIFY(shmSpy.isValid());
+ QVERIFY(shellSpy.isValid());
+ QVERIFY(compositorSpy.isValid());
+ QVERIFY(seatSpy.isValid());
+ QVERIFY(decorationSpy.isValid());
+ registry.create(m_connection->display());
+ QVERIFY(registry.isValid());
+ registry.setup();
+ QVERIFY(allAnnounced.wait());
+ QVERIFY(!compositorSpy.isEmpty());
+ QVERIFY(!shmSpy.isEmpty());
+ QVERIFY(!shellSpy.isEmpty());
+ QVERIFY(!seatSpy.isEmpty());
+ QVERIFY(!decorationSpy.isEmpty());
+
+ m_compositor = \
registry.createCompositor(compositorSpy.first().first().value<quint32>(), \
compositorSpy.first().last().value<quint32>(), this); + \
QVERIFY(m_compositor->isValid()); + m_shm = \
registry.createShmPool(shmSpy.first().first().value<quint32>(), \
shmSpy.first().last().value<quint32>(), this); + QVERIFY(m_shm->isValid());
+ m_shell = registry.createShell(shellSpy.first().first().value<quint32>(), \
shellSpy.first().last().value<quint32>(), this); + QVERIFY(m_shell->isValid());
+ m_seat = registry.createSeat(seatSpy.first().first().value<quint32>(), \
seatSpy.first().last().value<quint32>(), this); + QVERIFY(m_seat->isValid());
+ m_deco = registry.createServerSideDecorationManager(decorationSpy.first().first().value<quint32>(), \
decorationSpy.first().last().value<quint32>()); + QVERIFY(m_deco->isValid());
+ QSignalSpy hasPointerSpy(m_seat, &Seat::hasPointerChanged);
+ QVERIFY(hasPointerSpy.isValid());
+ QVERIFY(hasPointerSpy.wait());
+
+ screens()->setCurrent(0);
+ Cursor::setPos(QPoint(640, 512));
+ }
+
+ void DontCrashEmptyDecorationTest::cleanup()
+ {
+ delete m_compositor;
+ m_compositor = nullptr;
+ delete m_deco;
+ m_deco = nullptr;
+ delete m_seat;
+ m_seat = nullptr;
+ delete m_shm;
+ m_shm = nullptr;
+ delete m_shell;
+ m_shell = nullptr;
+ delete m_queue;
+ m_queue = nullptr;
+ if (m_thread) {
+ m_connection->deleteLater();
+ m_thread->quit();
+ m_thread->wait();
+ delete m_thread;
+ m_thread = nullptr;
+ m_connection = nullptr;
+ }
+ }
+
+ void DontCrashEmptyDecorationTest::testBug361551()
+ {
+ // this test verifies that resizing an X11 window to an invalid size does not \
result in crash on unmap + // when the DecorationRenderer gets copied to the \
Deleted + // there a repaint is scheduled and the resulting texture is invalid if \
the window size is invalid +
+ // create an xcb window
+ xcb_connection_t *c = xcb_connect(nullptr, nullptr);
+ QVERIFY(!xcb_connection_has_error(c));
+
+ xcb_window_t w = xcb_generate_id(c);
+ xcb_create_window(c, XCB_COPY_FROM_PARENT, w, rootWindow(), 0, 0, 10, 10, 0, \
XCB_WINDOW_CLASS_INPUT_OUTPUT, XCB_COPY_FROM_PARENT, 0, nullptr); + \
xcb_map_window(c, w); + xcb_flush(c);
+
+ // we should get a client for it
+ QSignalSpy windowCreatedSpy(workspace(), &Workspace::clientAdded);
+ QVERIFY(windowCreatedSpy.isValid());
+ QVERIFY(windowCreatedSpy.wait());
+ Client *client = windowCreatedSpy.first().first().value<Client*>();
+ QVERIFY(client);
+ QCOMPARE(client->window(), w);
+ QVERIFY(client->isDecorated());
+
+ // let's set a stupid geometry
+ client->setGeometry(0, 0, 0, 0);
+ QCOMPARE(client->geometry(), QRect(0, 0, 0, 0));
+
+ // and destroy the window again
+ xcb_unmap_window(c, w);
+ xcb_destroy_window(c, w);
+ xcb_flush(c);
+ xcb_disconnect(c);
+
+ QSignalSpy windowClosedSpy(client, &Client::windowClosed);
+ QVERIFY(windowClosedSpy.isValid());
+ QVERIFY(windowClosedSpy.wait());
+ }
+
+ }
+
+ WAYLANDTEST_MAIN(KWin::DontCrashEmptyDecorationTest)
+ #include "dont_crash_empty_deco.moc"
diff --cc autotests/wayland/kwin_wayland_test.cpp
index 4001abb,2206a00..d37015b
--- a/autotests/wayland/kwin_wayland_test.cpp
+++ b/autotests/wayland/kwin_wayland_test.cpp
@@@ -18,7 -18,8 +18,8 @@@ You should have received a copy of the
along with this program. If not, see <http://www.gnu.org/licenses/>.
*********************************************************************/
#include "kwin_wayland_test.h"
-#include "../../abstract_backend.h"
+#include "../../platform.h"
+ #include "../../composite.h"
#include "../../effects.h"
#include "../../wayland_server.h"
#include "../../workspace.h"
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic