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
wilder-5.14
Ivan Čukić 10 years ago
parent 85d721b91f
commit a566273eb8
  1. 34
      shell/futureutil.h
  2. 31
      shell/shellcorona.cpp
  3. 2
      shell/shellcorona.h

@ -0,0 +1,34 @@
/*
* Copyright 2016 Ivan Cukic <ivan.cukic@kde.org>
*
* 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 <QCoreApplication>
template <typename T>
inline void awaitFuture(const QFuture<T> &future)
{
while (!future.isFinished()) {
QCoreApplication::processEvents();
}
}
#endif /* !FUTUREUTIL_H */

@ -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<int, Plasma::Containment *> act = m_desktopContainments.value(activity);
QHash<int, Plasma::Containment *>::const_iterator it = act.constFind(screenNum);
if (it != act.constEnd()) {
return *it;
if (m_desktopContainments.contains(activity)) {
QHash<int, Plasma::Containment *> act = m_desktopContainments.value(activity);
QHash<int, Plasma::Containment *>::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<bool> 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);

@ -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);

Loading…
Cancel
Save