commit: 881b0b008ecbd40cf3b264b14ce2429796196ad2 Author: Andreas Sturmlechner <asturm <AT> gentoo <DOT> org> AuthorDate: Tue Nov 13 10:21:08 2018 +0000 Commit: Andreas Sturmlechner <asturm <AT> gentoo <DOT> org> CommitDate: Tue Nov 13 11:32:42 2018 +0000 URL: https://gitweb.gentoo.org/repo/gentoo.git/commit/?id=881b0b00
kde-plasma/kwin: Fix runtime crashes Backported from 5.14 branch. Package-Manager: Portage-2.3.51, Repoman-2.3.12 Signed-off-by: Andreas Sturmlechner <asturm <AT> gentoo.org> .../files/kwin-5.14.3-resizewindows-crash.patch | 72 +++++++++++ .../files/kwin-5.14.3-virtualdesktop-crash.patch | 137 +++++++++++++++++++++ kde-plasma/kwin/kwin-5.14.3-r1.ebuild | 111 +++++++++++++++++ 3 files changed, 320 insertions(+) diff --git a/kde-plasma/kwin/files/kwin-5.14.3-resizewindows-crash.patch b/kde-plasma/kwin/files/kwin-5.14.3-resizewindows-crash.patch new file mode 100644 index 00000000000..37963c8395c --- /dev/null +++ b/kde-plasma/kwin/files/kwin-5.14.3-resizewindows-crash.patch @@ -0,0 +1,72 @@ +From 406b70b04e093c13faf763e2d885797ae037d806 Mon Sep 17 00:00:00 2001 +From: Vlad Zagorodniy <[email protected]> +Date: Mon, 12 Nov 2018 17:45:14 +0200 +Subject: [wayland] Don't crash when resizing windows + +Summary: +If you resize a decorated client by using the resize user action(press +Alt + F3 > More Actions > Resize), then KWin will crash because it gets +stuck in an infinite loop (AbstractClient::performMoveResize <-> +ShellClient::setGeometry). + +Here's how KWin gets stuck in that loop: +* when you finish resizing the client, AbstractClient::keyPressEvent + will call AbstractClient::finishMoveResize; +* the first thing that finishMoveResize does is block geometry updates, + then it does some clean up (e.g. reset the value of isMoveResize(), etc), + updates the geometry of the client and when it's done, it will emit + clientFinishUserMoveResized signal; +* when PointerInputRedirection notices that signal, it will call + processDecorationMove on the client, which in its turn will indirectly + call AbstractClient::startMoveResize; +* when it's time to go back to AbstractClient::keyPressEvent, geometry + updates are unblocked and if there are any pending geometry updates, + then ShellClient::setGeometry will be called; +* ShellClient::setGeometry will eventually call ShellClient::doSetGeometry; +* ShellClient::doSetGeometry will call AbstractClient::performMoveResize + because AbstractClient::processDecorationMove indirectly called + AbstractClient::startMoveResize; +* AbstractClient::performMoveResize calls ShellClient::setGeometry; +* (at this point, KWin got stuck in the infinite loop) + +This change swaps setMoveResizePointerButtonDown and finishMoveResize, +so processDecorationMove won't indirectly call startMoveResize. + +BUG: 397577 +FIXED-IN: 5.14.4 + +Reviewers: #kwin, davidedmundson + +Reviewed By: #kwin, davidedmundson + +Subscribers: kwin + +Tags: #kwin + +Differential Revision: https://phabricator.kde.org/D16846 +--- + abstract_client.cpp | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/abstract_client.cpp b/abstract_client.cpp +index b4628f2..ed72b9c 100644 +--- a/abstract_client.cpp ++++ b/abstract_client.cpp +@@ -1457,13 +1457,13 @@ void AbstractClient::keyPressEvent(uint key_code) + case Qt::Key_Space: + case Qt::Key_Return: + case Qt::Key_Enter: +- finishMoveResize(false); + setMoveResizePointerButtonDown(false); ++ finishMoveResize(false); + updateCursor(); + break; + case Qt::Key_Escape: +- finishMoveResize(true); + setMoveResizePointerButtonDown(false); ++ finishMoveResize(true); + updateCursor(); + break; + default: +-- +cgit v0.11.2 diff --git a/kde-plasma/kwin/files/kwin-5.14.3-virtualdesktop-crash.patch b/kde-plasma/kwin/files/kwin-5.14.3-virtualdesktop-crash.patch new file mode 100644 index 00000000000..4e480a06be8 --- /dev/null +++ b/kde-plasma/kwin/files/kwin-5.14.3-virtualdesktop-crash.patch @@ -0,0 +1,137 @@ +From ad28da84e78c7eb7ff1e608c4819707b2142daea Mon Sep 17 00:00:00 2001 +From: Vlad Zagorodniy <[email protected]> +Date: Mon, 5 Nov 2018 14:59:42 +0200 +Subject: [effects/slidingpopups] Don't crash when sliding virtual desktops + +Summary: +If you switch virtual desktops while krunner is sliding in, then +depending on whether your distro strips assert statements away, +KWin can crash. + +The reason why it crashes is the sliding popups effect tries to unref +deleted windows that it hasn't referenced before (if there is an active +full screen effect, then popups won't be slided out, which in its turn +means that we won't reference deleted windows). So, in the end, the +refcount of those windows can be -1. That triggers an assert statement +in the destructor of the Deleted class, which checks whether the +refcount is equal to 0. + +Popups are not slided while there is an active full screen effect because +we don't know what the full screen effect does. + +This patch adjusts the sliding popups effect so it stops all active +animations when user switches virtual desktops or when a full screen +effect kicks in. We need to do that so the effect won't try to +unreference windows in postPaintWindow. + +Visually, it doesn't look quite nice, but for now that's good enough. +A proper fix would be more complex: we would need to make sure that +full screen effects ignore sliding popups (and also maybe docks) and +perform some input redirection. + +BUG: 400170 +FIXED-IN: 5.14.4 + +Test Plan: I'm not able anymore to reproduce bug 400170. + +Reviewers: #kwin, graesslin + +Reviewed By: #kwin, graesslin + +Subscribers: davidedmundson, graesslin, kwin + +Tags: #kwin + +Differential Revision: https://phabricator.kde.org/D16731 +--- + effects/slidingpopups/slidingpopups.cpp | 22 ++++++++++++++++++++++ + effects/slidingpopups/slidingpopups.h | 6 +++--- + 2 files changed, 25 insertions(+), 3 deletions(-) + +diff --git a/effects/slidingpopups/slidingpopups.cpp b/effects/slidingpopups/slidingpopups.cpp +index a104a5c..066b2a3 100644 +--- a/effects/slidingpopups/slidingpopups.cpp ++++ b/effects/slidingpopups/slidingpopups.cpp +@@ -3,6 +3,7 @@ + This file is part of the KDE project. + + Copyright (C) 2009 Marco Martin [email protected] ++Copyright (C) 2018 Vlad Zagorodniy <[email protected]> + + 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 +@@ -53,6 +54,11 @@ SlidingPopupsEffect::SlidingPopupsEffect() + m_atom = effects->announceSupportProperty(QByteArrayLiteral("_KDE_SLIDE"), this); + } + ); ++ connect(effects, qOverload<int, int, EffectWindow *>(&EffectsHandler::desktopChanged), ++ this, &SlidingPopupsEffect::stopAnimations); ++ connect(effects, &EffectsHandler::activeFullScreenEffectChanged, ++ this, &SlidingPopupsEffect::stopAnimations); ++ + reconfigure(ReconfigureAll); + } + +@@ -434,6 +440,22 @@ void SlidingPopupsEffect::slideOut(EffectWindow *w) + w->addRepaintFull(); + } + ++void SlidingPopupsEffect::stopAnimations() ++{ ++ for (auto it = m_animations.constBegin(); it != m_animations.constEnd(); ++it) { ++ EffectWindow *w = it.key(); ++ ++ if (w->isDeleted()) { ++ w->unrefWindow(); ++ } else { ++ w->setData(WindowForceBackgroundContrastRole, QVariant()); ++ w->setData(WindowForceBlurRole, QVariant()); ++ } ++ } ++ ++ m_animations.clear(); ++} ++ + bool SlidingPopupsEffect::isActive() const + { + return !m_animations.isEmpty(); +diff --git a/effects/slidingpopups/slidingpopups.h b/effects/slidingpopups/slidingpopups.h +index 821640a..32e8fb5 100644 +--- a/effects/slidingpopups/slidingpopups.h ++++ b/effects/slidingpopups/slidingpopups.h +@@ -3,6 +3,7 @@ + This file is part of the KDE project. + + Copyright (C) 2009 Marco Martin [email protected] ++Copyright (C) 2018 Vlad Zagorodniy <[email protected]> + + 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 +@@ -49,8 +50,6 @@ public: + + static bool supported(); + +- // TODO react also on virtual desktop changes +- + int slideInDuration() const; + int slideOutDuration() const; + +@@ -62,6 +61,7 @@ private Q_SLOTS: + + void slideIn(EffectWindow *w); + void slideOut(EffectWindow *w); ++ void stopAnimations(); + + private: + void setupAnimData(EffectWindow *w); +@@ -81,7 +81,7 @@ private: + AnimationKind kind; + TimeLine timeLine; + }; +- QHash<const EffectWindow*, Animation> m_animations; ++ QHash<EffectWindow *, Animation> m_animations; + + enum class Location { + Left, +-- +cgit v0.11.2 diff --git a/kde-plasma/kwin/kwin-5.14.3-r1.ebuild b/kde-plasma/kwin/kwin-5.14.3-r1.ebuild new file mode 100644 index 00000000000..a2ab760c9be --- /dev/null +++ b/kde-plasma/kwin/kwin-5.14.3-r1.ebuild @@ -0,0 +1,111 @@ +# Copyright 1999-2018 Gentoo Authors +# Distributed under the terms of the GNU General Public License v2 + +EAPI=6 + +KDE_HANDBOOK="optional" +KDE_TEST="optional" +VIRTUALX_REQUIRED="test" +inherit kde5 + +DESCRIPTION="KDE window manager" +LICENSE="GPL-2+" +KEYWORDS="~amd64 ~arm ~arm64 ~x86" +IUSE="caps gles2 multimedia" + +COMMON_DEPEND=" + $(add_frameworks_dep kactivities) + $(add_frameworks_dep kauth) + $(add_frameworks_dep kcmutils) + $(add_frameworks_dep kcompletion) + $(add_frameworks_dep kconfig) + $(add_frameworks_dep kconfigwidgets) + $(add_frameworks_dep kcoreaddons) + $(add_frameworks_dep kcrash) + $(add_frameworks_dep kdeclarative) + $(add_frameworks_dep kglobalaccel '' '' '5=') + $(add_frameworks_dep ki18n) + $(add_frameworks_dep kiconthemes) + $(add_frameworks_dep kidletime '' '' '5=') + $(add_frameworks_dep kinit) + $(add_frameworks_dep kio) + $(add_frameworks_dep knewstuff) + $(add_frameworks_dep knotifications) + $(add_frameworks_dep kpackage) + $(add_frameworks_dep kservice) + $(add_frameworks_dep ktextwidgets) + $(add_frameworks_dep kwayland) + $(add_frameworks_dep kwidgetsaddons) + $(add_frameworks_dep kwindowsystem X) + $(add_frameworks_dep kxmlgui) + $(add_frameworks_dep plasma) + $(add_plasma_dep breeze) + $(add_plasma_dep kdecoration) + $(add_plasma_dep kscreenlocker) + $(add_qt_dep qtdbus) + $(add_qt_dep qtdeclarative) + $(add_qt_dep qtgui 'gles2=' '' '5=') + $(add_qt_dep qtscript) + $(add_qt_dep qtsensors) + $(add_qt_dep qtwidgets) + $(add_qt_dep qtx11extras) + >=dev-libs/libinput-1.9 + >=dev-libs/wayland-1.2 + media-libs/fontconfig + media-libs/freetype + media-libs/libepoxy + media-libs/mesa[egl,gbm,gles2?,wayland] + virtual/libudev:= + x11-libs/libICE + x11-libs/libSM + x11-libs/libX11 + x11-libs/libXi + x11-libs/libdrm + >=x11-libs/libxcb-1.10 + >=x11-libs/libxkbcommon-0.7.0 + x11-libs/xcb-util-cursor + x11-libs/xcb-util-image + x11-libs/xcb-util-keysyms + x11-libs/xcb-util-wm + caps? ( sys-libs/libcap ) +" +RDEPEND="${COMMON_DEPEND} + $(add_qt_dep qtquickcontrols) + $(add_qt_dep qtquickcontrols2) + $(add_qt_dep qtvirtualkeyboard) + multimedia? ( $(add_qt_dep qtmultimedia 'gstreamer,qml') ) + !kde-plasma/kwin:4 + !kde-plasma/systemsettings:4 +" +DEPEND="${COMMON_DEPEND} + $(add_qt_dep designer) + $(add_qt_dep qtconcurrent) + x11-base/xorg-proto +" +PDEPEND=" + $(add_plasma_dep kde-cli-tools) +" + +RESTRICT+=" test" + +PATCHES=( + "${FILESDIR}/${PN}-5.14.3-virtualdesktop-crash.patch" + "${FILESDIR}/${PN}-5.14.3-resizewindows-crash.patch" +) + +src_prepare() { + kde5_src_prepare + use multimedia || eapply "${FILESDIR}/${PN}-gstreamer-optional.patch" + + # Access violations, bug #640432 + sed -e "s/^ecm_find_qmlmodule.*QtMultimedia/#&/" \ + -i CMakeLists.txt || die +} + +src_configure() { + local mycmakeargs=( + $(cmake-utils_use_find_package caps Libcap) + ) + + kde5_src_configure +}
