27 #include <QMutexLocker>
32 #include <kplugininfo.h>
33 #include <kservicetypetrader.h>
34 #include <kstandarddirs.h>
39 #include "private/abstractrunner_p.h"
46 K_GLOBAL_STATIC(QMutex, s_bigLock)
50 d(new AbstractRunnerPrivate(this))
57 d(new AbstractRunnerPrivate(this))
64 d(new AbstractRunnerPrivate(this))
66 if (args.count() > 0) {
67 KService::Ptr service = KService::serviceByStorageId(args[0].
toString());
82 if (group.isEmpty()) {
83 group =
"UnnamedRunner";
86 KConfigGroup runners(KGlobal::config(),
"Runners");
87 return KConfigGroup(&runners, group);
93 emit d->script->reloadConfiguration();
99 d->syntaxes.append(syntax);
104 d->syntaxes.append(syntax);
105 d->defaultSyntax = &(d->syntaxes.last());
120 return d->defaultSyntax;
125 static const int reasonableRunTime = 1500;
126 static const int fastEnoughTime = 250;
128 if (d->suspendMatching) {
139 const int runtime = time.elapsed();
142 if (!slowed && runtime > reasonableRunTime) {
145 kDebug() <<
id() <<
"runner is too slow, putting it on the back burner.";
150 if (slowed && runtime < fastEnoughTime && localContext.
query().size() > 2) {
153 if (d->fastRuns > 2) {
156 kDebug() <<
id() <<
"runner is faster than we thought, kicking it up a notch";
167 emit d->script->actionsForMatch(match, &ret);
174 QAction *a =
new QAction(icon, text,
this);
175 d->actions.insert(
id, a);
181 d->actions.insert(
id, action);
186 QAction *a = d->actions.take(
id);
192 return d->actions.value(
id);
202 qDeleteAll(d->actions);
214 return d->hasRunOptions;
225 emit d->script->createRunOptions(parent);
235 if (!d->speedLock.tryLockForRead()) {
239 d->speedLock.unlock();
245 d->speedLock.lockForWrite();
247 d->speedLock.unlock();
262 return d->blackListed;
267 d->blackListed = types;
272 return KServiceTypeTrader::self()->query(serviceType, constraint);
283 return d->script->run(search, action);
290 return d->script->match(search);
296 if (d->runnerDescription.isValid()) {
297 return d->runnerDescription.name();
301 return d->package->metadata().name();
309 if (d->runnerDescription.isValid()) {
310 return KIcon(d->runnerDescription.icon());
314 return KIcon(d->package->metadata().icon());
322 if (d->runnerDescription.isValid()) {
323 return d->runnerDescription.pluginName();
327 return d->package->metadata().pluginName();
335 if (d->runnerDescription.isValid()) {
336 return d->runnerDescription.property(
"Comment").toString();
340 return d->package->metadata().description();
355 d->setupScriptSupport();
364 return d->dataEngine(name);
369 return d->suspendMatching;
374 if (d->suspendMatching == suspend) {
378 d->suspendMatching = suspend;
391 hasRunOptions(false),
392 suspendMatching(false)
396 AbstractRunnerPrivate::~AbstractRunnerPrivate()
404 void AbstractRunnerPrivate::init(
const KService::Ptr service)
406 runnerDescription = KPluginInfo(service);
407 if (runnerDescription.isValid()) {
408 const QString api = runnerDescription.property(
"X-Plasma-API").toString();
409 if (!api.isEmpty()) {
410 const QString path = KStandardDirs::locate(
"data",
"plasma/runners/" + runnerDescription.pluginName() +
'/');
411 prepScripting(path, api);
413 kDebug() <<
"Could not create a(n)" << api <<
"ScriptEngine for the" << runnerDescription.name() <<
"Runner.";
419 void AbstractRunnerPrivate::init(
const QString &path)
424 void AbstractRunnerPrivate::prepScripting(
const QString &path, QString api)
433 structure->setPath(path);
434 package = new Package(path, structure);
436 if (!package->isValid()) {
437 kDebug() <<
"Invalid Runner package at" << path;
444 api = package->metadata().implementationApi();
456 void AbstractRunnerPrivate::setupScriptSupport()
462 kDebug() <<
"setting up script support, package is in" << package->path()
463 <<
"which is a" << package->structure()->type() <<
"package"
464 <<
", main script is" << package->filePath(
"mainscript");
466 QString translationsPath = package->filePath(
"translations");
467 if (!translationsPath.isEmpty()) {
470 KGlobal::dirs()->addResourceDir(
"locale", translationsPath);
471 KGlobal::locale()->insertCatalog(package->metadata().pluginName());
477 #include "abstractrunner.moc"