diff --git a/shell/scripting/scriptengine.cpp b/shell/scripting/scriptengine.cpp index f458becb5..98f3f00a1 100644 --- a/shell/scripting/scriptengine.cpp +++ b/shell/scripting/scriptengine.cpp @@ -20,6 +20,7 @@ #include "scriptengine.h" #include +#include #include #include #include @@ -96,13 +97,29 @@ QScriptValue ScriptEngine::desktopById(QScriptContext *context, QScriptEngine *e QScriptValue ScriptEngine::desktopsForActivity(QScriptContext *context, QScriptEngine *engine) { if (context->argumentCount() == 0) { - return context->throwError(i18n("containmentsByActivity requires an id")); + return context->throwError(i18n("desktopsForActivity requires an id")); } QScriptValue containments = engine->newArray(); int count = 0; const QString id = context->argument(0).toString(); + + // confirm this activity actually exists + KActivities::Consumer consumer; + bool found = false; + for (const QString &act: consumer.activities()) { + if (act == id) { + found = true; + break; + } + } + + if (!found) { + containments.setProperty("length", 0); + return containments; + } + ScriptEngine *env = envFor(engine); foreach (Plasma::Containment *c, env->m_corona->containments()) { if (c->activity() == id && !isPanel(c)) { @@ -111,6 +128,19 @@ QScriptValue ScriptEngine::desktopsForActivity(QScriptContext *context, QScriptE } } + if (count == 0) { + // we have no desktops for this activity, so lets make them now + // this can happen when the activity already exists but has never been activated + // with the current shell package and layout.js is run to set up the shell for the + // first time + const int numScreens = qApp->desktop()->numScreens(); + for (int i = 0; i < numScreens; ++i) { + Plasma::Containment *c = env->m_corona->createContainmentForActivity(id, i); + containments.setProperty(count, env->wrap(c)); + ++count; + } + } + containments.setProperty("length", count); return containments; } @@ -147,6 +177,7 @@ QScriptValue ScriptEngine::createActivity(QScriptContext *context, QScriptEngine foreach (Plasma::Containment *cont, env->m_corona->containments()) { knownActivities.insert(cont->activity()); } + foreach (const QString &act, consumer.activities()) { if (!knownActivities.contains(act)) { id = act; @@ -201,6 +232,14 @@ QScriptValue ScriptEngine::setCurrentActivity(QScriptContext *context, QScriptEn return QScriptValue(task.result()); } +QScriptValue ScriptEngine::currentActivity(QScriptContext *context, QScriptEngine *engine) +{ + Q_UNUSED(context) + + KActivities::Consumer consumer; + return consumer.currentActivity(); +} + QScriptValue ScriptEngine::activities(QScriptContext *context, QScriptEngine *engine) { Q_UNUSED(context) @@ -722,6 +761,7 @@ void ScriptEngine::setupEngine() m_scriptSelf.setProperty("QRectF", constructQRectFClass(this)); m_scriptSelf.setProperty("createActivity", newFunction(ScriptEngine::createActivity)); m_scriptSelf.setProperty("setCurrentActivity", newFunction(ScriptEngine::setCurrentActivity)); + m_scriptSelf.setProperty("currentActivity", newFunction(ScriptEngine::currentActivity)); m_scriptSelf.setProperty("activities", newFunction(ScriptEngine::activities)); m_scriptSelf.setProperty("Panel", newFunction(ScriptEngine::newPanel, newObject())); m_scriptSelf.setProperty("desktopsForActivity", newFunction(ScriptEngine::desktopsForActivity)); diff --git a/shell/scripting/scriptengine.h b/shell/scripting/scriptengine.h index 2ea0e3170..6ce8b51a4 100644 --- a/shell/scripting/scriptengine.h +++ b/shell/scripting/scriptengine.h @@ -73,6 +73,7 @@ private: static QStringList availableContainments(const QString &type); static QScriptValue createActivity(QScriptContext *context, QScriptEngine *engine); static QScriptValue setCurrentActivity(QScriptContext *context, QScriptEngine *engine); + static QScriptValue currentActivity(QScriptContext *controller, QScriptEngine *engine); static QScriptValue activities(QScriptContext *context, QScriptEngine *engine); static QScriptValue newPanel(QScriptContext *context, QScriptEngine *engine); static QScriptValue desktopsForActivity(QScriptContext *context, QScriptEngine *engine);