Changeset View
Changeset View
Standalone View
Standalone View
shell/scripting/scriptengine.cpp
Show First 20 Lines • Show All 48 Lines • ▼ Show 20 Line(s) | |||||
49 | #include "i18n.h" | 49 | #include "i18n.h" | ||
50 | #include "panel.h" | 50 | #include "panel.h" | ||
51 | #include "widget.h" | 51 | #include "widget.h" | ||
52 | #include "../shellcorona.h" | 52 | #include "../shellcorona.h" | ||
53 | #include "../standaloneappcorona.h" | 53 | #include "../standaloneappcorona.h" | ||
54 | 54 | | |||
55 | QScriptValue constructQRectFClass(QScriptEngine *engine); | 55 | QScriptValue constructQRectFClass(QScriptEngine *engine); | ||
56 | 56 | | |||
57 | namespace { | ||||
58 | template <typename T> | ||||
59 | inline void awaitFuture(const QFuture<T> &future) | ||||
60 | { | ||||
61 | while (!future.isFinished()) { | ||||
62 | QCoreApplication::processEvents(); | ||||
63 | } | ||||
64 | } | ||||
65 | } | ||||
66 | | ||||
57 | namespace WorkspaceScripting | 67 | namespace WorkspaceScripting | ||
58 | { | 68 | { | ||
59 | 69 | | |||
60 | ScriptEngine::ScriptEngine(Plasma::Corona *corona, QObject *parent) | 70 | ScriptEngine::ScriptEngine(Plasma::Corona *corona, QObject *parent) | ||
61 | : QScriptEngine(parent), | 71 | : QScriptEngine(parent), | ||
62 | m_corona(corona) | 72 | m_corona(corona) | ||
63 | { | 73 | { | ||
64 | Q_ASSERT(m_corona); | 74 | Q_ASSERT(m_corona); | ||
Show All 23 Lines | 97 | foreach (Plasma::Containment *c, env->m_corona->containments()) { | |||
88 | if (c->id() == id && !isPanel(c)) { | 98 | if (c->id() == id && !isPanel(c)) { | ||
89 | return env->wrap(c); | 99 | return env->wrap(c); | ||
90 | } | 100 | } | ||
91 | } | 101 | } | ||
92 | 102 | | |||
93 | return engine->undefinedValue(); | 103 | return engine->undefinedValue(); | ||
94 | } | 104 | } | ||
95 | 105 | | |||
106 | QStringList ScriptEngine::availableActivities(QScriptContext *context, QScriptEngine *engine) | ||||
107 | { | ||||
108 | Q_UNUSED(engine) | ||||
109 | | ||||
110 | ScriptEngine *env = envFor(engine); | ||||
111 | | ||||
112 | ShellCorona *sc = qobject_cast<ShellCorona *>(env->m_corona); | ||||
113 | StandaloneAppCorona *ac = qobject_cast<StandaloneAppCorona *>(env->m_corona); | ||||
114 | if (sc) { | ||||
115 | return sc->availableActivities(); | ||||
116 | } else if (ac) { | ||||
117 | return ac->availableActivities(); | ||||
118 | } | ||||
119 | | ||||
120 | return QStringList(); | ||||
121 | } | ||||
122 | | ||||
96 | QScriptValue ScriptEngine::desktopsForActivity(QScriptContext *context, QScriptEngine *engine) | 123 | QScriptValue ScriptEngine::desktopsForActivity(QScriptContext *context, QScriptEngine *engine) | ||
97 | { | 124 | { | ||
98 | if (context->argumentCount() == 0) { | 125 | if (context->argumentCount() == 0) { | ||
99 | return context->throwError(i18n("desktopsForActivity requires an id")); | 126 | return context->throwError(i18n("desktopsForActivity requires an id")); | ||
100 | } | 127 | } | ||
101 | 128 | | |||
102 | QScriptValue containments = engine->newArray(); | 129 | QScriptValue containments = engine->newArray(); | ||
103 | int count = 0; | 130 | int count = 0; | ||
104 | 131 | | |||
105 | const QString id = context->argument(0).toString(); | 132 | const QString id = context->argument(0).toString(); | ||
106 | 133 | | |||
107 | // confirm this activity actually exists | 134 | // confirm this activity actually exists | ||
108 | KActivities::Consumer consumer; | | |||
109 | bool found = false; | 135 | bool found = false; | ||
110 | for (const QString &act: consumer.activities()) { | 136 | for (const QString &act: availableActivities(context, engine)) { | ||
111 | if (act == id) { | 137 | if (act == id) { | ||
112 | found = true; | 138 | found = true; | ||
113 | break; | 139 | break; | ||
114 | } | 140 | } | ||
115 | } | 141 | } | ||
116 | 142 | | |||
117 | if (!found) { | 143 | if (!found) { | ||
118 | containments.setProperty(QStringLiteral("length"), 0); | 144 | containments.setProperty(QStringLiteral("length"), 0); | ||
▲ Show 20 Lines • Show All 52 Lines • ▼ Show 20 Line(s) | 193 | { | |||
171 | 197 | | |||
172 | const QString name = context->argument(0).toString(); | 198 | const QString name = context->argument(0).toString(); | ||
173 | QString plugin = context->argument(1).toString(); | 199 | QString plugin = context->argument(1).toString(); | ||
174 | 200 | | |||
175 | ScriptEngine *env = envFor(engine); | 201 | ScriptEngine *env = envFor(engine); | ||
176 | 202 | | |||
177 | KActivities::Controller controller; | 203 | KActivities::Controller controller; | ||
178 | 204 | | |||
179 | //TODO: if there are activities without containment, recycle | 205 | // This is not the nicest way to do this, but createActivity | ||
206 | // is a synchronous API :/ | ||||
180 | QFuture<QString> futureId = controller.addActivity(name); | 207 | QFuture<QString> futureId = controller.addActivity(name); | ||
181 | QEventLoop loop; | 208 | awaitFuture(futureId); | ||
182 | | ||||
183 | QFutureWatcher<QString> *watcher = new QFutureWatcher<QString>(); | | |||
184 | connect(watcher, &QFutureWatcherBase::finished, &loop, &QEventLoop::quit); | | |||
185 | 209 | | |||
186 | watcher->setFuture(futureId); | | |||
187 | | ||||
188 | loop.exec(); | | |||
189 | QString id = futureId.result(); | 210 | QString id = futureId.result(); | ||
190 | 211 | | |||
191 | qDebug() << "Setting default Containment plugin:" << plugin; | 212 | qDebug() << "Setting default Containment plugin:" << plugin; | ||
192 | 213 | | |||
193 | if (plugin.isEmpty() || plugin == QLatin1String("undefined")) { | 214 | if (plugin.isEmpty() || plugin == QLatin1String("undefined")) { | ||
194 | KConfigGroup shellCfg = KConfigGroup(KSharedConfig::openConfig(env->m_corona->package().filePath("defaults")), "Desktop"); | 215 | KConfigGroup shellCfg = KConfigGroup(KSharedConfig::openConfig(env->m_corona->package().filePath("defaults")), "Desktop"); | ||
195 | plugin = shellCfg.readEntry("Containment", "org.kde.desktopcontainment"); | 216 | plugin = shellCfg.readEntry("Containment", "org.kde.desktopcontainment"); | ||
196 | } | 217 | } | ||
Show All 17 Lines | 234 | if (context->argumentCount() < 0) { | |||
214 | return context->throwError(i18n("setCurrentActivity required the activity id")); | 235 | return context->throwError(i18n("setCurrentActivity required the activity id")); | ||
215 | } | 236 | } | ||
216 | 237 | | |||
217 | const QString id = context->argument(0).toString(); | 238 | const QString id = context->argument(0).toString(); | ||
218 | 239 | | |||
219 | KActivities::Controller controller; | 240 | KActivities::Controller controller; | ||
220 | 241 | | |||
221 | QFuture<bool> task = controller.setCurrentActivity(id); | 242 | QFuture<bool> task = controller.setCurrentActivity(id); | ||
222 | QEventLoop loop; | 243 | awaitFuture(task); | ||
223 | | ||||
224 | QFutureWatcher<bool> watcher; | | |||
225 | connect(&watcher, &QFutureWatcherBase::finished, &loop, &QEventLoop::quit); | | |||
226 | | ||||
227 | watcher.setFuture(task); | | |||
228 | | ||||
229 | loop.exec(); | | |||
230 | 244 | | |||
231 | return QScriptValue(task.result()); | 245 | return QScriptValue(task.result()); | ||
232 | } | 246 | } | ||
233 | 247 | | |||
234 | QScriptValue ScriptEngine::setActivityName(QScriptContext *context, QScriptEngine *engine) | 248 | QScriptValue ScriptEngine::setActivityName(QScriptContext *context, QScriptEngine *engine) | ||
235 | { | 249 | { | ||
236 | Q_UNUSED(engine) | 250 | Q_UNUSED(engine) | ||
237 | 251 | | |||
238 | if (context->argumentCount() < 2) { | 252 | if (context->argumentCount() < 2) { | ||
239 | return context->throwError(i18n("setActivityName required the activity id and name")); | 253 | return context->throwError(i18n("setActivityName required the activity id and name")); | ||
240 | } | 254 | } | ||
241 | 255 | | |||
242 | const QString id = context->argument(0).toString(); | 256 | const QString id = context->argument(0).toString(); | ||
243 | const QString name = context->argument(1).toString(); | 257 | const QString name = context->argument(1).toString(); | ||
244 | 258 | | |||
245 | KActivities::Controller controller; | 259 | KActivities::Controller controller; | ||
246 | 260 | | |||
247 | QFuture<void> task = controller.setActivityName(id, name); | 261 | QFuture<void> task = controller.setActivityName(id, name); | ||
248 | QEventLoop loop; | 262 | awaitFuture(task); | ||
249 | | ||||
250 | QFutureWatcher<void> watcher; | | |||
251 | connect(&watcher, &QFutureWatcherBase::finished, &loop, &QEventLoop::quit); | | |||
252 | | ||||
253 | watcher.setFuture(task); | | |||
254 | | ||||
255 | loop.exec(); | | |||
256 | 263 | | |||
257 | return QScriptValue(); | 264 | return QScriptValue(); | ||
258 | } | 265 | } | ||
259 | 266 | | |||
260 | QScriptValue ScriptEngine::activityName(QScriptContext *context, QScriptEngine *engine) | 267 | QScriptValue ScriptEngine::activityName(QScriptContext *context, QScriptEngine *engine) | ||
261 | { | 268 | { | ||
262 | Q_UNUSED(engine) | 269 | Q_UNUSED(engine) | ||
263 | 270 | | |||
Show All 16 Lines | 283 | { | |||
280 | KActivities::Consumer consumer; | 287 | KActivities::Consumer consumer; | ||
281 | return consumer.currentActivity(); | 288 | return consumer.currentActivity(); | ||
282 | } | 289 | } | ||
283 | 290 | | |||
284 | QScriptValue ScriptEngine::activities(QScriptContext *context, QScriptEngine *engine) | 291 | QScriptValue ScriptEngine::activities(QScriptContext *context, QScriptEngine *engine) | ||
285 | { | 292 | { | ||
286 | Q_UNUSED(context) | 293 | Q_UNUSED(context) | ||
287 | 294 | | |||
288 | KActivities::Consumer consumer; | 295 | return qScriptValueFromSequence(engine, availableActivities(context, engine)); | ||
289 | | ||||
290 | return qScriptValueFromSequence(engine, consumer.activities()); | | |||
291 | } | 296 | } | ||
292 | 297 | | |||
293 | QScriptValue ScriptEngine::newPanel(QScriptContext *context, QScriptEngine *engine) | 298 | QScriptValue ScriptEngine::newPanel(QScriptContext *context, QScriptEngine *engine) | ||
294 | { | 299 | { | ||
295 | QString plugin(QStringLiteral("org.kde.panel")); | 300 | QString plugin(QStringLiteral("org.kde.panel")); | ||
296 | 301 | | |||
297 | if (context->argumentCount() > 0) { | 302 | if (context->argumentCount() > 0) { | ||
298 | plugin = context->argument(0).toString(); | 303 | plugin = context->argument(0).toString(); | ||
▲ Show 20 Lines • Show All 661 Lines • Show Last 20 Lines |