From 82ef02217d3000418166401ae3c108e052205358 Mon Sep 17 00:00:00 2001 From: Marco Martin Date: Tue, 22 Oct 2013 14:55:46 +0200 Subject: [PATCH] better delay of panel creation it also avoids recursive checkLoadingDesktopsComplete that caused a crash --- src/shell/shellcorona.cpp | 25 ++++++++++++++++++++----- src/shell/shellcorona.h | 1 + 2 files changed, 21 insertions(+), 5 deletions(-) diff --git a/src/shell/shellcorona.cpp b/src/shell/shellcorona.cpp index a8598663d..130021e64 100644 --- a/src/shell/shellcorona.cpp +++ b/src/shell/shellcorona.cpp @@ -34,6 +34,7 @@ #include #include + #include "activity.h" #include "desktopview.h" #include "panelview.h" @@ -54,6 +55,11 @@ public: // constant controlling how long between requesting a configuration sync // and one happening should occur. currently 10 seconds appConfigSyncTimer.setInterval(10000); + + waitingPanelsTimer = new QTimer(q); + waitingPanelsTimer->setSingleShot(true); + waitingPanelsTimer->setInterval(250); + connect(waitingPanelsTimer, &QTimer::timeout, q, &ShellCorona::createWaitingPanels); } ShellCorona *q; @@ -69,6 +75,7 @@ public: QList waitingPanels; QSet loadingDesktops; QHash activities; + QTimer *waitingPanelsTimer; QTimer appConfigSyncTimer; }; @@ -389,14 +396,21 @@ void ShellCorona::checkLoadingDesktopsComplete() } if (d->loadingDesktops.isEmpty()) { - foreach (Plasma::Containment *cont, d->waitingPanels) { - d->panelViews[cont] = new PanelView(this); - d->panelViews[cont]->setContainment(cont); - } - d->waitingPanels.clear(); + d->waitingPanelsTimer->start(); + } else { + d->waitingPanelsTimer->stop(); } } +void ShellCorona::createWaitingPanels() +{ + foreach (Plasma::Containment *cont, d->waitingPanels) { + d->panelViews[cont] = new PanelView(this); + d->panelViews[cont]->setContainment(cont); + } + d->waitingPanels.clear(); +} + void ShellCorona::updateScreenOwner(int wasScreen, int isScreen, Plasma::Containment *containment) { qDebug() << "Was screen" << wasScreen << "Is screen" << isScreen <<"Containment" << containment << containment->title(); @@ -413,6 +427,7 @@ void ShellCorona::updateScreenOwner(int wasScreen, int isScreen, Plasma::Contain d->panelViews[containment]->setContainment(0); d->panelViews[containment]->deleteLater(); d->panelViews.remove(containment); + d->waitingPanels.removeAll(containment); } } checkLoadingDesktopsComplete(); diff --git a/src/shell/shellcorona.h b/src/shell/shellcorona.h index 326421a68..991312dcd 100644 --- a/src/shell/shellcorona.h +++ b/src/shell/shellcorona.h @@ -125,6 +125,7 @@ protected Q_SLOTS: private Q_SLOTS: void checkLoadingDesktopsComplete(); + void createWaitingPanels(); void handleContainmentAdded(Plasma::Containment *c); void showWidgetExplorer(); void toggleActivityManager();