QortalOS Brooklyn for Raspberry Pi 4
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

233 lines
9.9 KiB

/*
SPDX-FileCopyrightText: 2008 Dario Freddi <[email protected]>
SPDX-FileCopyrightText: 2008 Sebastian Kügler <[email protected]>
SPDX-License-Identifier: GPL-2.0-or-later
*/
#include "PowerDevilRunner.h"
// kde-workspace/libs
#include <sessionmanagement.h>
#include <QDBusConnectionInterface>
#include <QDBusInterface>
#include <QDBusReply>
#include <QDebug>
#include <QIcon>
#include <KLocalizedString>
#include <KSharedConfig>
#include <cmath>
K_PLUGIN_CLASS_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"));
setMinLetterCount(3);
const KLocalizedString suspend = ki18nc("Note this is a KRunner keyword", "suspend");
m_suspend = RunnerKeyword{suspend.untranslatedText(), suspend.toString()};
const KLocalizedString toRam = ki18nc("Note this is a KRunner keyword", "to ram");
m_toRam = RunnerKeyword{toRam.untranslatedText(), toRam.toString(), false};
const KLocalizedString sleep = ki18nc("Note this is a KRunner keyword", "sleep");
m_sleep = RunnerKeyword{sleep.untranslatedText(), sleep.toString()};
const KLocalizedString hibernate = ki18nc("Note this is a KRunner keyword", "hibernate");
m_hibernate = RunnerKeyword{hibernate.untranslatedText(), hibernate.toString()};
const KLocalizedString toDisk = ki18nc("Note this is a KRunner keyword", "to disk");
m_toDisk = RunnerKeyword{toDisk.untranslatedText(), toDisk.toString(), false};
const KLocalizedString dimScreen = ki18nc("Note this is a KRunner keyword", "dim screen");
m_dimScreen = RunnerKeyword{dimScreen.untranslatedText(), dimScreen.toString()};
const KLocalizedString screenBrightness = ki18nc("Note this is a KRunner keyword", "dim screen");
m_screenBrightness = RunnerKeyword{screenBrightness.untranslatedText(), screenBrightness.toString()};
updateStatus();
}
void PowerDevilRunner::updateSyntaxes()
{
setSyntaxes({}); // Clear the existing ones
addSyntaxForKeyword({m_suspend},
i18n("Lists system suspend (e.g. sleep, hibernate) options "
"and allows them to be activated"));
if (m_session->canSuspend()) {
addSyntaxForKeyword({m_sleep, m_toRam}, i18n("Suspends the system to RAM"));
}
if (m_session->canHibernate()) {
addSyntaxForKeyword({m_hibernate, m_toDisk}, i18n("Suspends the system to disk"));
}
Plasma::RunnerSyntax brightnessSyntax(
i18nc("Note this is a KRunner keyword, <> is a placeholder and should be at the end", "screen brightness <percent value>"),
// xgettext:no-c-format
i18n("Lists screen brightness options or sets it to the brightness defined by the search term; "
"e.g. screen brightness 50 would dim the screen to 50% maximum brightness"));
brightnessSyntax.addExampleQuery(i18nc("Note this is a KRunner keyword", "dim screen"));
addSyntax(brightnessSyntax);
}
PowerDevilRunner::~PowerDevilRunner()
{
}
void PowerDevilRunner::updateStatus()
{
updateSyntaxes();
}
enum SleepState { StandbyState = 1, SuspendState = 2, HibernateState = 4, HybridSuspendState = 8 };
void PowerDevilRunner::match(Plasma::RunnerContext &context)
{
const QString term = context.query();
Plasma::QueryMatch::Type type = Plasma::QueryMatch::ExactMatch;
QList<Plasma::QueryMatch> matches;
int screenBrightnessResults = matchesScreenBrightnessKeywords(term);
if (screenBrightnessResults != -1) {
Plasma::QueryMatch match(this);
match.setType(type);
match.setIconName(QStringLiteral("preferences-system-power-management"));
match.setText(i18n("Set Brightness to %1%", screenBrightnessResults));
match.setData(screenBrightnessResults);
match.setRelevance(1);
match.setId(QStringLiteral("BrightnessChange"));
matches.append(match);
} else if (matchesRunnerKeywords({m_screenBrightness, m_dimScreen}, type, term)) {
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(type);
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 (matchesRunnerKeywords({m_sleep}, type, term)) {
if (m_session->canSuspend()) {
addSuspendMatch(SuspendState, matches, type);
}
if (m_session->canHibernate()) {
addSuspendMatch(HibernateState, matches, type);
}
} else if (matchesRunnerKeywords({m_suspend, m_toRam}, type, term)) {
addSuspendMatch(SuspendState, matches, type);
} else if (matchesRunnerKeywords({m_hibernate, m_toDisk}, type, term)) {
addSuspendMatch(HibernateState, matches, type);
}
context.addMatches(matches);
}
void PowerDevilRunner::addSuspendMatch(int value, QList<Plasma::QueryMatch> &matches, Plasma::QueryMatch::Type type)
{
Plasma::QueryMatch match(this);
match.setType(type);
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")) {
QDBusReply<int> max = brightnessIface.call("brightnessMax");
const int value = max.isValid() ? std::round(match.data().toInt() * max / 100.0) : match.data().toInt();
brightnessIface.asyncCall("setBrightness", value);
} else if (match.id() == QLatin1String("PowerDevil_DimTotal")) {
brightnessIface.asyncCall(QStringLiteral("setBrightness"), 0);
} else if (match.id() == QLatin1String("PowerDevil_DimHalf")) {
QDBusReply<int> brightness = brightnessIface.asyncCall(QStringLiteral("brightness"));
brightnessIface.asyncCall(QStringLiteral("setBrightness"), static_cast<int>(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;
}
}
}
bool PowerDevilRunner::matchesRunnerKeywords(const QList<RunnerKeyword> &keywords, Plasma::QueryMatch::Type &type, const QString &query) const
{
return std::any_of(keywords.begin(), keywords.end(), [&query, &type](const RunnerKeyword &keyword) {
bool exactMatch =
keyword.triggerWord.compare(query, Qt::CaseInsensitive) == 0 || keyword.translatedTriggerWord.compare(query, Qt::CaseInsensitive) == 0;
type = exactMatch ? Plasma::QueryMatch::ExactMatch : Plasma::QueryMatch::CompletionMatch;
if (!exactMatch && keyword.supportPartialMatch) {
return keyword.triggerWord.startsWith(query, Qt::CaseInsensitive) || keyword.translatedTriggerWord.startsWith(query, Qt::CaseInsensitive);
}
return exactMatch;
});
}
void PowerDevilRunner::addSyntaxForKeyword(const QList<RunnerKeyword> &keywords, const QString &description)
{
Plasma::RunnerSyntax syntax(keywords.first().translatedTriggerWord, description);
for (int i = 1; i < keywords.size(); ++i) {
syntax.addExampleQuery(keywords.at(i).translatedTriggerWord);
}
addSyntax(syntax);
}
int PowerDevilRunner::matchesScreenBrightnessKeywords(const QString &query) const
{
const static QStringList expressions = {QStringLiteral("screen brightness "),
i18nc("Note this is a KRunner keyword, it should end with a space", "screen brightness "),
QStringLiteral("dim screen "),
i18nc("Note this is a KRunner keyword, it should end with a space", "dim screen ")};
for (const QString &expression : expressions) {
if (query.startsWith(expression)) {
const QString number = query.mid(expression.size());
bool ok;
int result = qBound(0, number.toInt(&ok), 100);
return ok ? result : -1;
}
}
return -1;
}
#include "PowerDevilRunner.moc"