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)
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();
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);
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)
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();
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();
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;
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.
Priority priority() const
The priority of the runner.
QAction * action(const QString &id) const
Returns the action associated with the id.
virtual void reloadConfiguration()
Signal runner to reload its configuration.
Speed
Specifies a nominal speed for the runner.
virtual void match(Plasma::RunnerContext &context)
This is the main query method.
QList< RunnerSyntax > syntaxes() const
void setSpeed(Speed newSpeed)
Sets the nominal speed of the runner.
Speed speed() const
The nominal speed of the runner.
Priority
Specifies a priority for the runner.
bool hasRunOptions()
If the runner has options that the user can interact with to modify what happens when run or one of t...
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.
static QScriptValue toString(QScriptContext *ctx, QScriptEngine *eng)
@ RunnerComponent
Plasma::AbstractRunner based plugsin.