dont crash when changing layouts

--occasionaly when the user was switching
layouts it could get some crashes. It looks
safer to unload first the Latte::Views objects
and their corresponding containments afterwards.
I tried in my system to switch multiple layouts
in plenty different configurations and I could
not get a crash. This patch should fix the
mentioned crash report if that was the root
of the issue.

BUG:412864
FIXED-IN:0.9.5
pull/9/head
Michail Vourlakos 5 years ago
parent 6b5f4a952a
commit 61016444fb

@ -67,23 +67,11 @@ void GenericLayout::unloadContainments()
return; return;
} }
//!disconnect signals in order to avoid crashes when the layout is unloading qDebug() << "Layout - " + name() + " : [unloadContainments]"
disconnect(this, &GenericLayout::viewsCountChanged, m_corona, &Plasma::Corona::availableScreenRectChanged); << "containments ::: " << m_containments.size()
disconnect(this, &GenericLayout::viewsCountChanged, m_corona, &Plasma::Corona::availableScreenRegionChanged);
disconnect(m_corona->activityConsumer(), &KActivities::Consumer::currentActivityChanged, this, &GenericLayout::updateLastUsedActivity);
qDebug() << "Layout - " + name() + " unload: containments ... size ::: " << m_containments.size()
<< " ,latteViews in memory ::: " << m_latteViews.size() << " ,latteViews in memory ::: " << m_latteViews.size()
<< " ,hidden latteViews in memory ::: " << m_waitingLatteViews.size(); << " ,hidden latteViews in memory ::: " << m_waitingLatteViews.size();
for (const auto view : m_latteViews) {
view->disconnectSensitiveSignals();
}
for (const auto view : m_waitingLatteViews) {
view->disconnectSensitiveSignals();
}
m_unloadedContainmentsIds.clear(); m_unloadedContainmentsIds.clear();
QList<Plasma::Containment *> systrays; QList<Plasma::Containment *> systrays;
@ -117,7 +105,23 @@ void GenericLayout::unloadLatteViews()
return; return;
} }
qDebug() << "Layout - " + name() + " unload: latteViews ... size: " << m_latteViews.size(); qDebug() << "Layout - " + name() + " : [unloadLatteViews]"
<< "containments ::: " << m_containments.size()
<< " ,latteViews in memory ::: " << m_latteViews.size()
<< " ,hidden latteViews in memory ::: " << m_waitingLatteViews.size();
//!disconnect signals in order to avoid crashes when the layout is unloading
disconnect(this, &GenericLayout::viewsCountChanged, m_corona, &Plasma::Corona::availableScreenRectChanged);
disconnect(this, &GenericLayout::viewsCountChanged, m_corona, &Plasma::Corona::availableScreenRegionChanged);
disconnect(m_corona->activityConsumer(), &KActivities::Consumer::currentActivityChanged, this, &GenericLayout::updateLastUsedActivity);
for (const auto view : m_latteViews) {
view->disconnectSensitiveSignals();
}
for (const auto view : m_waitingLatteViews) {
view->disconnectSensitiveSignals();
}
qDeleteAll(m_latteViews); qDeleteAll(m_latteViews);
qDeleteAll(m_waitingLatteViews); qDeleteAll(m_waitingLatteViews);

@ -515,8 +515,8 @@ void Synchronizer::unloadCentralLayout(CentralLayout *layout)
central->syncToLayoutFile(true); central->syncToLayoutFile(true);
} }
central->unloadContainments();
central->unloadLatteViews(); central->unloadLatteViews();
central->unloadContainments();
if (m_multipleModeInitialized) { if (m_multipleModeInitialized) {
m_manager->clearUnloadedContainmentsFromLinkedFile(central->unloadedContainmentsIds(), true); m_manager->clearUnloadedContainmentsFromLinkedFile(central->unloadedContainmentsIds(), true);
@ -533,8 +533,8 @@ void Synchronizer::unloadSharedLayout(SharedLayout *layout)
int pos = m_sharedLayouts.indexOf(layout); int pos = m_sharedLayouts.indexOf(layout);
SharedLayout *shared = m_sharedLayouts.takeAt(pos); SharedLayout *shared = m_sharedLayouts.takeAt(pos);
shared->syncToLayoutFile(true); shared->syncToLayoutFile(true);
shared->unloadContainments();
shared->unloadLatteViews(); shared->unloadLatteViews();
shared->unloadContainments();
m_manager->clearUnloadedContainmentsFromLinkedFile(shared->unloadedContainmentsIds(), true); m_manager->clearUnloadedContainmentsFromLinkedFile(shared->unloadedContainmentsIds(), true);
delete layout; delete layout;

Loading…
Cancel
Save