diff --git a/app/dockview.cpp b/app/dockview.cpp index b51979248..f9a35b353 100644 --- a/app/dockview.cpp +++ b/app/dockview.cpp @@ -299,6 +299,15 @@ void DockView::initSignalingForLocationChangeSliding() }); } +void DockView::disconnectSensitiveSignals() +{ + disconnect(corona(), &Plasma::Corona::availableScreenRectChanged, this, &DockView::availableScreenRectChanged); + + if (visibility()) { + visibility()->setEnabledDynamicBackground(false); + } +} + void DockView::availableScreenRectChanged() { if (m_inDelete) diff --git a/app/dockview.h b/app/dockview.h index 57e1c6276..5e0008ccd 100644 --- a/app/dockview.h +++ b/app/dockview.h @@ -181,6 +181,10 @@ public: static QScreen *atScreens(QQmlListProperty<QScreen> *property, int index); void reconsiderScreen(); + //! these are signals that create crashes, such a example is the availableScreenRectChanged from corona + //! when its containment is destroyed + void disconnectSensitiveSignals(); + public slots: Q_INVOKABLE void addNewDock(); Q_INVOKABLE void removeDock(); diff --git a/app/layout.cpp b/app/layout.cpp index 0f8161143..50a497287 100644 --- a/app/layout.cpp +++ b/app/layout.cpp @@ -64,6 +64,30 @@ void Layout::unloadContainments() qDebug() << "Layout - " + name() + " unload: containments ... size: " << m_containments.size(); + foreach (auto view, m_dockViews) { + view->disconnectSensitiveSignals(); + } + + foreach (auto view, m_waitingDockViews) { + view->disconnectSensitiveSignals(); + } + + QList<Plasma::Containment *> systrays; + + //!identify systrays and unload them first + foreach (auto containment, m_containments) { + if (Plasma::Applet *parentApplet = qobject_cast<Plasma::Applet *>(containment->parent())) { + systrays.append(containment); + } + } + + while (!systrays.isEmpty()) { + Plasma::Containment *systray = systrays.at(0); + systrays.removeFirst(); + m_containments.removeAll(systray); + delete systray; + } + while (!m_containments.isEmpty()) { Plasma::Containment *containment = m_containments.at(0); m_containments.removeFirst();