sanity check desktop for activity requests, allow fetching current activity

wilder-5.14
Aaron Seigo 12 years ago
parent 2f22b304c8
commit 3f617fdbb6
  1. 42
      shell/scripting/scriptengine.cpp
  2. 1
      shell/scripting/scriptengine.h

@ -20,6 +20,7 @@
#include "scriptengine.h"
#include <QApplication>
#include <QDesktopWidget>
#include <QDir>
#include <QDirIterator>
#include <QFile>
@ -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));

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

Loading…
Cancel
Save