[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(&registry, &Registry::compositorAnnounced);
+     QSignalSpy shmSpy(&registry, &Registry::shmAnnounced);
+     QSignalSpy shellSpy(&registry, &Registry::shellAnnounced);
+     QSignalSpy seatSpy(&registry, &Registry::seatAnnounced);
+     QSignalSpy decorationSpy(&registry, \
&Registry::serverSideDecorationManagerAnnounced); +     QSignalSpy \
allAnnounced(&registry, &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