/*************************************************************************** * Copyright 2008 by Dario Freddi * * Copyright 2008 by Sebastian Kügler * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA . * ***************************************************************************/ #include "PowerDevilRunner.h" // kde-workspace/libs #include #include #include #include #include #include #include #include K_EXPORT_PLASMA_RUNNER_WITH_JSON(PowerDevilRunner, "plasma-runner-powerdevil.json") PowerDevilRunner::PowerDevilRunner(QObject *parent, const KPluginMetaData &metaData, const QVariantList &args) : Plasma::AbstractRunner(parent, metaData, args) , m_session(new SessionManagement(this)) { setObjectName(QStringLiteral("PowerDevil")); updateStatus(); initUpdateTriggers(); QStringList commands; commands << i18nc("Note this is a KRunner keyword", "suspend") << i18nc("Note this is a KRunner keyword", "sleep") << i18nc("Note this is a KRunner keyword", "hibernate") << i18nc("Note this is a KRunner keyword", "to disk") << i18nc("Note this is a KRunner keyword", "to ram") << i18nc("Note this is a KRunner keyword", "screen brightness") << i18nc("Note this is a KRunner keyword", "dim screen"); setTriggerWords(commands); } void PowerDevilRunner::updateSyntaxes() { QList syntaxes; syntaxes.append(Plasma::RunnerSyntax(i18nc("Note this is a KRunner keyword", "suspend"), i18n("Lists system suspend (e.g. sleep, hibernate) options " "and allows them to be activated"))); if (m_session->canSuspend()) { Plasma::RunnerSyntax sleepSyntax(i18nc("Note this is a KRunner keyword", "sleep"), i18n("Suspends the system to RAM")); sleepSyntax.addExampleQuery(i18nc("Note this is a KRunner keyword", "to ram")); syntaxes.append(sleepSyntax); } if (m_session->canHibernate()) { Plasma::RunnerSyntax hibernateSyntax(i18nc("Note this is a KRunner keyword", "hibernate"), i18n("Suspends the system to disk")); hibernateSyntax.addExampleQuery(i18nc("Note this is a KRunner keyword", "to disk")); syntaxes.append(hibernateSyntax); } Plasma::RunnerSyntax brightnessSyntax(i18nc("Note this is a KRunner keyword", "screen brightness"), // xgettext:no-c-format i18n("Lists screen brightness options or sets it to the brightness defined by :q:; " "e.g. screen brightness 50 would dim the screen to 50% maximum brightness")); brightnessSyntax.addExampleQuery(i18nc("Note this is a KRunner keyword", "dim screen")); syntaxes.append(brightnessSyntax); setSyntaxes(syntaxes); } PowerDevilRunner::~PowerDevilRunner() { } void PowerDevilRunner::initUpdateTriggers() { // Also receive updates triggered through the DBus QDBusConnection dbus = QDBusConnection::sessionBus(); if (dbus.interface()->isServiceRegistered(QStringLiteral("org.kde.Solid.PowerManagement"))) { if (!dbus.connect(QStringLiteral("org.kde.Solid.PowerManagement"), QStringLiteral("/org/kde/Solid/PowerManagement"), QStringLiteral("org.kde.Solid.PowerManagement"), QStringLiteral("configurationReloaded"), this, SLOT(updateStatus()))) { qDebug() << "error!"; } } } void PowerDevilRunner::updateStatus() { updateSyntaxes(); } bool PowerDevilRunner::parseQuery(const QString& query, const QList& rxList, QString& parameter) const { for (const QRegExp& rx : rxList) { if (rx.exactMatch(query)) { parameter = rx.cap(1).trimmed(); return true; } } return false; } enum SleepState { StandbyState = 1, SuspendState = 2, HibernateState = 4, HybridSuspendState = 8 }; void PowerDevilRunner::match(Plasma::RunnerContext &context) { const QString term = context.query(); QList matches; QString parameter; if (parseQuery(term, QList() << QRegExp(i18nc("Note this is a KRunner keyword; %1 is a parameter", "screen brightness %1", QStringLiteral("(.*)")), Qt::CaseInsensitive) << QRegExp(i18nc("Note this is a KRunner keyword", "screen brightness"), Qt::CaseInsensitive) << QRegExp(i18nc("Note this is a KRunner keyword; %1 is a parameter", "dim screen %1", QStringLiteral("(.*)")), Qt::CaseInsensitive) << QRegExp(i18nc("Note this is a KRunner keyword", "dim screen"), Qt::CaseInsensitive), parameter)) { if (!parameter.isEmpty()) { bool test; int b = parameter.toInt(&test); if (test) { int brightness = qBound(0, b, 100); Plasma::QueryMatch match(this); match.setType(Plasma::QueryMatch::ExactMatch); match.setIconName(QStringLiteral("preferences-system-power-management")); match.setText(i18n("Set Brightness to %1", brightness)); match.setData(brightness); match.setRelevance(1); match.setId(QStringLiteral("BrightnessChange")); matches.append(match); } } else { Plasma::QueryMatch match1(this); match1.setType(Plasma::QueryMatch::ExactMatch); match1.setIconName(QStringLiteral("preferences-system-power-management")); match1.setText(i18n("Dim screen totally")); match1.setRelevance(1); match1.setId(QStringLiteral("DimTotal")); matches.append(match1); Plasma::QueryMatch match2(this); match2.setType(Plasma::QueryMatch::ExactMatch); match2.setIconName(QStringLiteral("preferences-system-power-management")); match2.setText(i18n("Dim screen by half")); match2.setRelevance(1); match2.setId(QStringLiteral("DimHalf")); matches.append(match2); } } else if (term.compare(i18nc("Note this is a KRunner keyword", "sleep"), Qt::CaseInsensitive) == 0) { if (m_session->canSuspend()) { addSuspendMatch(SuspendState, matches); } if (m_session->canHibernate()) { addSuspendMatch(HibernateState, matches); } } else if (term.compare(i18nc("Note this is a KRunner keyword", "suspend"), Qt::CaseInsensitive) == 0 || term.compare(i18nc("Note this is a KRunner keyword", "to ram"), Qt::CaseInsensitive) == 0) { addSuspendMatch(SuspendState, matches); } else if (term.compare(i18nc("Note this is a KRunner keyword", "hibernate"), Qt::CaseInsensitive) == 0 || term.compare(i18nc("Note this is a KRunner keyword", "to disk"), Qt::CaseInsensitive) == 0) { addSuspendMatch(HibernateState, matches); } context.addMatches(matches); } void PowerDevilRunner::addSuspendMatch(int value, QList &matches) { Plasma::QueryMatch match(this); match.setType(Plasma::QueryMatch::ExactMatch); switch ((SleepState)value) { case SuspendState: case StandbyState: match.setIconName(QStringLiteral("system-suspend")); match.setText(i18nc("Suspend to RAM", "Sleep")); match.setSubtext(i18n("Suspend to RAM")); match.setRelevance(1); break; case HibernateState: match.setIconName(QStringLiteral("system-suspend-hibernate")); match.setText(i18nc("Suspend to disk", "Hibernate")); match.setSubtext(i18n("Suspend to disk")); match.setRelevance(0.99); break; } match.setData(value); match.setId(QStringLiteral("Sleep")); matches.append(match); } void PowerDevilRunner::run(const Plasma::RunnerContext &context, const Plasma::QueryMatch &match) { Q_UNUSED(context) QDBusInterface iface(QStringLiteral("org.kde.Solid.PowerManagement"), QStringLiteral("/org/kde/Solid/PowerManagement"), QStringLiteral("org.kde.Solid.PowerManagement")); QDBusInterface brightnessIface(QStringLiteral("org.kde.Solid.PowerManagement"), QStringLiteral("/org/kde/Solid/PowerManagement/Actions/BrightnessControl"), QStringLiteral("org.kde.Solid.PowerManagement.Actions.BrightnessControl")); if (match.id().startsWith(QLatin1String("PowerDevil_ProfileChange"))) { iface.asyncCall(QStringLiteral("loadProfile"), match.data().toString()); } else if (match.id() == QLatin1String("PowerDevil_BrightnessChange")) { brightnessIface.asyncCall(QStringLiteral("setBrightness"), match.data().toInt()); } else if (match.id() == QLatin1String("PowerDevil_DimTotal")) { brightnessIface.asyncCall(QStringLiteral("setBrightness"), 0); } else if (match.id() == QLatin1String("PowerDevil_DimHalf")) { QDBusReply brightness = brightnessIface.asyncCall(QStringLiteral("brightness")); brightnessIface.asyncCall(QStringLiteral("setBrightness"), static_cast(brightness / 2)); } else if (match.id().startsWith(QLatin1String("PowerDevil_Sleep"))) { switch ((SleepState)match.data().toInt()) { case SuspendState: case StandbyState: m_session->suspend(); break; case HibernateState: m_session->hibernate(); break; } } } #include "PowerDevilRunner.moc"