diff --git a/shell/futureutil.h b/shell/futureutil.h new file mode 100644 --- /dev/null +++ b/shell/futureutil.h @@ -0,0 +1,34 @@ +/* + * Copyright 2016 Ivan Cukic + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Library General Public License as + * published by the Free Software Foundation; either version 2, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details + * + * You should have received a copy of the GNU Library General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + + +#ifndef FUTUREUTIL_H +#define FUTUREUTIL_H + +#include + +template +inline void awaitFuture(const QFuture &future) +{ + while (!future.isFinished()) { + QCoreApplication::processEvents(); + } +} + +#endif /* !FUTUREUTIL_H */ diff --git a/shell/shellcorona.h b/shell/shellcorona.h --- a/shell/shellcorona.h +++ b/shell/shellcorona.h @@ -91,7 +91,7 @@ PanelView *panelView(Plasma::Containment *containment) const; - //Those two are a bit of an hack but are just for desktop scripting + // This one is a bit of an hack but are just for desktop scripting void insertActivity(const QString &id, const QString &plugin); Plasma::Containment *setContainmentTypeForScreen(int screen, const QString &plugin); diff --git a/shell/shellcorona.cpp b/shell/shellcorona.cpp --- a/shell/shellcorona.cpp +++ b/shell/shellcorona.cpp @@ -63,6 +63,8 @@ #include "plasmashelladaptor.h" +#include "futureutil.h" + #ifndef NDEBUG #define CHECK_SCREEN_INVARIANTS screenInvariants(); #else @@ -902,13 +904,16 @@ Plasma::Containment *ShellCorona::createContainmentForActivity(const QString& activity, int screenNum) { - QHash act = m_desktopContainments.value(activity); - QHash::const_iterator it = act.constFind(screenNum); - if (it != act.constEnd()) { - return *it; + if (m_desktopContainments.contains(activity)) { + QHash act = m_desktopContainments.value(activity); + QHash::const_iterator it = act.constFind(screenNum); + if (it != act.constEnd() && (*it)) { + return *it; + } } QString plugin = m_activityContainmentPlugins.value(activity); + if (plugin.isEmpty()) { plugin = m_desktopDefaultsConfig.readEntry("Containment", "org.kde.desktopcontainment"); } @@ -1226,6 +1231,24 @@ { activityAdded(id); + const QString currentActivityReally = m_activityController->currentActivity(); + + // TODO: This needs to go away! + // The containment creation API does not know when we have a + // new activity to create a containment for, we need to pretend + // that the current activity has been changed + QFuture currentActivity = m_activityController->setCurrentActivity(id); + awaitFuture(currentActivity); + + if (!currentActivity.result()) { + qDebug() << "Failed to create and switch to the activity"; + return; + } + + while (m_activityController->currentActivity() != id) { + QCoreApplication::processEvents(); + } + m_activityContainmentPlugins.insert(id, plugin); for (int i = 0; i < m_views.count(); ++i) { Plasma::Containment *c = createContainmentForActivity(id, i);