From 19a88030d3de12a96402a1103c964e5a7363646c Mon Sep 17 00:00:00 2001 From: Marco Martin Date: Tue, 10 Jan 2017 15:27:14 +0100 Subject: [PATCH] better clean up of duplicate containments Summary: due to old multiscreen bugs, sometimes the appletsrc file gets polluted with a lot of containments with same activity id and lastScreen, in some cases even hundreds (see https://bugs.kde.org/show_bug.cgi?id=371858) in that case we can't be 100% sure what containment will be loaded at startup, leading to an herratical behavior. it was trying to clean up duplicates but wasn't really effective now base upon lastScreen (so we catch other activities as well) and manually remove the destroyed containment from m_desktopContainments (which may sole some multiscreen related bug, such as 371991) BUG:371858 CCBUG:371991 Test Plan: started a session with the corrupted appletsrc from the bugreport, file gets cleaned out of duplicates Reviewers: davidedmundson, #plasma Reviewed By: davidedmundson, #plasma Subscribers: davidedmundson, plasma-devel Tags: #plasma Differential Revision: https://phabricator.kde.org/D3981 --- shell/shellcorona.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/shell/shellcorona.cpp b/shell/shellcorona.cpp index dd281c95f..1337523d6 100644 --- a/shell/shellcorona.cpp +++ b/shell/shellcorona.cpp @@ -1896,7 +1896,8 @@ void ShellCorona::insertContainment(const QString &activity, int screenNum, Plas { Plasma::Containment *cont = nullptr; for (Plasma::Containment *c : m_desktopContainments.value(activity)) { - if (c->screen() == screenNum) { + //using lastScreen() instead of screen() catches also containments of activities that aren't the current one, so not assigned to a screen right now + if (c->lastScreen() == screenNum) { cont = c; if (containment == cont) { return; @@ -1908,8 +1909,6 @@ void ShellCorona::insertContainment(const QString &activity, int screenNum, Plas Q_ASSERT(!m_desktopContainments.value(activity).values().contains(containment)); if (cont) { - disconnect(cont, SIGNAL(destroyed(QObject*)), - this, SLOT(desktopContainmentDestroyed(QObject*))); cont->destroy(); } m_desktopContainments[activity].insert(containment); @@ -1924,7 +1923,8 @@ void ShellCorona::desktopContainmentDestroyed(QObject *obj) // members of Containment are not accessible anymore, // so keep ugly bookeeping by hand auto containment = static_cast(obj); - for (auto a : m_desktopContainments) { + //explicitly specify the range by reference, as we need to remove stuff from the sets + for (QSet &a : m_desktopContainments) { QMutableSetIterator it(a); while (it.hasNext()) { it.next();