27#include <QMutexLocker>
32#include <kplugininfo.h>
33#include <kservicetypetrader.h>
34#include <kstandarddirs.h>
39#include "private/abstractrunner_p.h"
46K_GLOBAL_STATIC(QMutex, s_bigLock)
50 d(new AbstractRunnerPrivate(this))
55AbstractRunner::AbstractRunner(
const KService::Ptr service,
QObject *parent)
57 d(new AbstractRunnerPrivate(this))
62AbstractRunner::AbstractRunner(
QObject *parent,
const QVariantList &args)
64 d(new AbstractRunnerPrivate(this))
66 if (args.count() > 0) {
67 KService::Ptr service = KService::serviceByStorageId(args[0].toString());
74AbstractRunner::~AbstractRunner()
79KConfigGroup AbstractRunner::config()
const
82 if (group.isEmpty()) {
83 group =
"UnnamedRunner";
86 KConfigGroup runners(KGlobal::config(),
"Runners");
87 return KConfigGroup(&runners, group);
90void AbstractRunner::reloadConfiguration()
93 emit d->script->reloadConfiguration();
99 d->syntaxes.append(syntax);
104 d->syntaxes.append(syntax);
105 d->defaultSyntax = &(d->syntaxes.last());
108void AbstractRunner::setSyntaxes(
const QList<RunnerSyntax> &syntaxes)
110 d->syntaxes = syntaxes;
113QList<RunnerSyntax> AbstractRunner::syntaxes()
const
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();
140 bool slowed = speed() == SlowSpeed;
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";
157 setSpeed(NormalSpeed);
167 emit d->script->actionsForMatch(match, &ret);
172QAction* AbstractRunner::addAction(
const QString &
id,
const QIcon &icon,
const QString &text)
174 QAction *a =
new QAction(icon, text,
this);
175 d->actions.insert(
id, a);
179void AbstractRunner::addAction(
const QString &
id, QAction *action)
181 d->actions.insert(
id, action);
184void AbstractRunner::removeAction(
const QString &
id)
186 QAction *a = d->actions.take(
id);
190QAction* AbstractRunner::action(
const QString &
id)
const
192 return d->actions.value(
id);
195QHash<QString, QAction*> AbstractRunner::actions()
const
200void AbstractRunner::clearActions()
202 qDeleteAll(d->actions);
206QMimeData * AbstractRunner::mimeDataForMatch(
const QueryMatch *match)
212bool AbstractRunner::hasRunOptions()
214 return d->hasRunOptions;
217void AbstractRunner::setHasRunOptions(
bool hasRunOptions)
219 d->hasRunOptions = hasRunOptions;
222void AbstractRunner::createRunOptions(
QWidget *parent)
225 emit d->script->createRunOptions(parent);
235 if (!d->speedLock.tryLockForRead()) {
239 d->speedLock.unlock();
243void AbstractRunner::setSpeed(
Speed speed)
245 d->speedLock.lockForWrite();
247 d->speedLock.unlock();
257 d->priority = priority;
260RunnerContext::Types AbstractRunner::ignoredTypes()
const
262 return d->blackListed;
265void AbstractRunner::setIgnoredTypes(RunnerContext::Types types)
267 d->blackListed = types;
270KService::List AbstractRunner::serviceQuery(
const QString &serviceType,
const QString &constraint)
const
272 return KServiceTypeTrader::self()->query(serviceType, constraint);
275QMutex* AbstractRunner::bigLock()
283 return d->script->run(search, action);
290 return d->script->match(search);
294QString AbstractRunner::name()
const
296 if (d->runnerDescription.isValid()) {
297 return d->runnerDescription.name();
301 return d->package->metadata().name();
307QIcon AbstractRunner::icon()
const
309 if (d->runnerDescription.isValid()) {
310 return KIcon(d->runnerDescription.icon());
314 return KIcon(d->package->metadata().icon());
320QString AbstractRunner::id()
const
322 if (d->runnerDescription.isValid()) {
323 return d->runnerDescription.pluginName();
327 return d->package->metadata().pluginName();
333QString AbstractRunner::description()
const
335 if (d->runnerDescription.isValid()) {
336 return d->runnerDescription.property(
"Comment").toString();
340 return d->package->metadata().description();
352void AbstractRunner::init()
355 d->setupScriptSupport();
359 reloadConfiguration();
362DataEngine *AbstractRunner::dataEngine(
const QString &name)
const
364 return d->dataEngine(name);
367bool AbstractRunner::isMatchingSuspended()
const
369 return d->suspendMatching;
372void AbstractRunner::suspendMatching(
bool suspend)
374 if (d->suspendMatching == suspend) {
378 d->suspendMatching = suspend;
379 emit matchingSuspended(suspend);
391 hasRunOptions(false),
392 suspendMatching(false)
396AbstractRunnerPrivate::~AbstractRunnerPrivate()
404void 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.";
419void AbstractRunnerPrivate::init(
const QString &path)
424void 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();
456void 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"
An abstract base class for Plasma Runner plugins.
Speed
Specifies a nominal speed for the runner.
Priority
Specifies a priority for the runner.
Data provider for plasmoids (Plasma plugins)
object representing an installed Plasmagik package
A match returned by an AbstractRunner in response to a given RunnerContext.
The RunnerContext class provides information related to a search, including the search term,...
Namespace for everything in libplasma.
PackageStructure::Ptr packageStructure(const QString &language, ComponentType type)
Loads an appropriate PackageStructure for the given language and type.
AppletScript * loadScriptEngine(const QString &language, Applet *applet)
Loads an Applet script engine for the given language.
@ RunnerComponent
Plasma::AbstractRunner based plugsin.