diff --git a/shell/scripting/scriptengine.h b/shell/scripting/scriptengine.h --- a/shell/scripting/scriptengine.h +++ b/shell/scripting/scriptengine.h @@ -71,8 +71,8 @@ void setupEngine(); static QString onlyExec(const QString &commandLine); - // containment accessors - static QStringList availableContainments(const QString &type); + static QStringList availableActivities(QScriptContext *context, QScriptEngine *engine); + static QScriptValue createActivity(QScriptContext *context, QScriptEngine *engine); static QScriptValue setCurrentActivity(QScriptContext *context, QScriptEngine *engine); static QScriptValue currentActivity(QScriptContext *controller, QScriptEngine *engine); diff --git a/shell/scripting/scriptengine.cpp b/shell/scripting/scriptengine.cpp --- a/shell/scripting/scriptengine.cpp +++ b/shell/scripting/scriptengine.cpp @@ -54,6 +54,16 @@ QScriptValue constructQRectFClass(QScriptEngine *engine); +namespace { + template + inline void awaitFuture(const QFuture &future) + { + while (!future.isFinished()) { + QCoreApplication::processEvents(); + } + } +} + namespace WorkspaceScripting { @@ -93,6 +103,23 @@ return engine->undefinedValue(); } +QStringList ScriptEngine::availableActivities(QScriptContext *context, QScriptEngine *engine) +{ + Q_UNUSED(engine) + + ScriptEngine *env = envFor(engine); + + ShellCorona *sc = qobject_cast(env->m_corona); + StandaloneAppCorona *ac = qobject_cast(env->m_corona); + if (sc) { + return sc->availableActivities(); + } else if (ac) { + return ac->availableActivities(); + } + + return QStringList(); +} + QScriptValue ScriptEngine::desktopsForActivity(QScriptContext *context, QScriptEngine *engine) { if (context->argumentCount() == 0) { @@ -105,9 +132,8 @@ const QString id = context->argument(0).toString(); // confirm this activity actually exists - KActivities::Consumer consumer; bool found = false; - for (const QString &act: consumer.activities()) { + for (const QString &act: availableActivities(context, engine)) { if (act == id) { found = true; break; @@ -176,16 +202,11 @@ KActivities::Controller controller; - //TODO: if there are activities without containment, recycle + // This is not the nicest way to do this, but createActivity + // is a synchronous API :/ QFuture futureId = controller.addActivity(name); - QEventLoop loop; + awaitFuture(futureId); - QFutureWatcher *watcher = new QFutureWatcher(); - connect(watcher, &QFutureWatcherBase::finished, &loop, &QEventLoop::quit); - - watcher->setFuture(futureId); - - loop.exec(); QString id = futureId.result(); qDebug() << "Setting default Containment plugin:" << plugin; @@ -219,14 +240,7 @@ KActivities::Controller controller; QFuture task = controller.setCurrentActivity(id); - QEventLoop loop; - - QFutureWatcher watcher; - connect(&watcher, &QFutureWatcherBase::finished, &loop, &QEventLoop::quit); - - watcher.setFuture(task); - - loop.exec(); + awaitFuture(task); return QScriptValue(task.result()); } @@ -245,14 +259,7 @@ KActivities::Controller controller; QFuture task = controller.setActivityName(id, name); - QEventLoop loop; - - QFutureWatcher watcher; - connect(&watcher, &QFutureWatcherBase::finished, &loop, &QEventLoop::quit); - - watcher.setFuture(task); - - loop.exec(); + awaitFuture(task); return QScriptValue(); } @@ -285,9 +292,7 @@ { Q_UNUSED(context) - KActivities::Consumer consumer; - - return qScriptValueFromSequence(engine, consumer.activities()); + return qScriptValueFromSequence(engine, availableActivities(context, engine)); } QScriptValue ScriptEngine::newPanel(QScriptContext *context, QScriptEngine *engine) diff --git a/shell/shellcorona.h b/shell/shellcorona.h --- a/shell/shellcorona.h +++ b/shell/shellcorona.h @@ -87,6 +87,8 @@ Q_INVOKABLE QRegion availableScreenRegion(int id) const override; Q_INVOKABLE QRect availableScreenRect(int id) const override; + Q_INVOKABLE QStringList availableActivities() const; + PanelView *panelView(Plasma::Containment *containment) const; //Those two are a bit of an hack but are just for desktop scripting diff --git a/shell/shellcorona.cpp b/shell/shellcorona.cpp --- a/shell/shellcorona.cpp +++ b/shell/shellcorona.cpp @@ -677,6 +677,11 @@ return r; } +QStringList ShellCorona::availableActivities() const +{ + return m_activityContainmentPlugins.keys(); +} + QScreen *ShellCorona::screenForId(int screenId) const { DesktopView *v = m_views.value(screenId); @@ -1219,6 +1224,8 @@ void ShellCorona::insertActivity(const QString &id, const QString &plugin) { + activityAdded(id); + m_activityContainmentPlugins.insert(id, plugin); for (int i = 0; i < m_views.count(); ++i) { Plasma::Containment *c = createContainmentForActivity(id, i); diff --git a/shell/standaloneappcorona.h b/shell/standaloneappcorona.h --- a/shell/standaloneappcorona.h +++ b/shell/standaloneappcorona.h @@ -46,6 +46,8 @@ void insertActivity(const QString &id, const QString &plugin); Plasma::Containment *addPanel(const QString &plugin); + Q_INVOKABLE QStringList availableActivities() const; + public Q_SLOTS: void load(); diff --git a/shell/standaloneappcorona.cpp b/shell/standaloneappcorona.cpp --- a/shell/standaloneappcorona.cpp +++ b/shell/standaloneappcorona.cpp @@ -202,6 +202,11 @@ return; } +QStringList StandaloneAppCorona::availableActivities() const +{ + return m_activityContainmentPlugins.keys(); +} + void StandaloneAppCorona::insertActivity(const QString &id, const QString &plugin) { m_activityContainmentPlugins.insert(id, plugin);