diff options
Diffstat (limited to 'kde-plasma/kwin/files/kwin-5.14.3-virtualdesktop-crash.patch')
-rw-r--r-- | kde-plasma/kwin/files/kwin-5.14.3-virtualdesktop-crash.patch | 137 |
1 files changed, 137 insertions, 0 deletions
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 000000000000..4e480a06be8e --- /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 <vladzzag@gmail.com> +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 notmart@gmail.com ++Copyright (C) 2018 Vlad Zagorodniy <vladzzag@gmail.com> + + 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 notmart@gmail.com ++Copyright (C) 2018 Vlad Zagorodniy <vladzzag@gmail.com> + + 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 |