From a566273eb80dd2eb40c4fdea381d3f97bf57c0aa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ivan=20=C4=8Cuki=C4=87?= Date: Mon, 18 Jul 2016 18:14:43 +0200 Subject: [PATCH] Switching activity while creating it from PlasmaScript Summary: Containment creation relies on the current activity, so we need to change the current activity when creating one from PlasmaScript in order for the Containment to be created correctly. Test Plan: Tested with: print(currentActivity()); var id = currentActivity(); var desktops = desktopsForActivity(id); print(desktops.length); for (var i = 0; i < desktops.length; ++i) { print(desktops[i].id); } var id = createActivity("Day 4 - Test 1 - " + activities().length); var desktops = desktopsForActivity(id); for (var i = 0; i < desktops.length; ++i) { print(desktops[i].id); } Reviewers: #plasma, mart Reviewed By: mart Subscribers: plasma-devel Tags: #plasma Differential Revision: https://phabricator.kde.org/D2211 --- shell/futureutil.h | 34 ++++++++++++++++++++++++++++++++++ shell/shellcorona.cpp | 31 +++++++++++++++++++++++++++---- shell/shellcorona.h | 2 +- 3 files changed, 62 insertions(+), 5 deletions(-) create mode 100644 shell/futureutil.h diff --git a/shell/futureutil.h b/shell/futureutil.h new file mode 100644 index 000000000..268330388 --- /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.cpp b/shell/shellcorona.cpp index 84098248c..93a218add 100644 --- 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 @@ QScreen* ShellCorona::insertScreen(QScreen *screen, int idx) 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 @@ void ShellCorona::insertActivity(const QString &id, const QString &plugin) { 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); diff --git a/shell/shellcorona.h b/shell/shellcorona.h index 33ffefe66..4a2f7f999 100644 --- a/shell/shellcorona.h +++ b/shell/shellcorona.h @@ -91,7 +91,7 @@ public: 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);