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.
354 lines
10 KiB
354 lines
10 KiB
/*************************************************************************** |
|
* Copyright (C) 2015 by Eike Hein <hein@kde.org> * |
|
* * |
|
* 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 "systementry.h" |
|
|
|
#include <QDBusConnection> |
|
#include <QDBusInterface> |
|
#include <QDBusPendingCall> |
|
|
|
#include <KAuthorized> |
|
#include <KConfigGroup> |
|
#include <KLocalizedString> |
|
#include <KSharedConfig> |
|
#include <kworkspace.h> |
|
#include <Solid/PowerManagement> |
|
#include "ksmserver_interface.h" |
|
#include <kworkspace5/kdisplaymanager.h> |
|
|
|
KDisplayManager *SystemEntry::m_displayManager = new KDisplayManager(); |
|
|
|
SystemEntry::SystemEntry(AbstractModel *owner, Action action) : AbstractEntry(owner) |
|
, m_action(action) |
|
, m_valid(false) |
|
{ |
|
init(); |
|
} |
|
|
|
SystemEntry::SystemEntry(AbstractModel *owner, const QString &id) : AbstractEntry(owner) |
|
, m_action(NoAction) |
|
, m_valid(false) |
|
{ |
|
if (id == QStringLiteral("lock-screen")) { |
|
m_action = LockSession; |
|
} else if (id == QStringLiteral("logout")) { |
|
m_action = LogoutSession; |
|
} else if (id == QStringLiteral("save-session")) { |
|
m_action = SaveSession; |
|
} else if (id == QStringLiteral("switch-user")) { |
|
m_action = NewSession; |
|
} else if (id == QStringLiteral("suspend")) { |
|
m_action = SuspendToRam; |
|
} else if (id == QStringLiteral("hibernate")) { |
|
m_action = SuspendToDisk; |
|
} else if (id == QStringLiteral("reboot")) { |
|
m_action = Reboot; |
|
} else if (id == QStringLiteral("shutdown")) { |
|
m_action = Shutdown; |
|
} |
|
|
|
init(); |
|
} |
|
|
|
void SystemEntry::init() |
|
{ |
|
switch (m_action) { |
|
case NoAction: |
|
m_valid = false; |
|
break; |
|
case LockSession: |
|
m_valid = KAuthorized::authorizeKAction("lock_screen"); |
|
break; |
|
case LogoutSession: |
|
case SaveSession: |
|
{ |
|
bool authorize = KAuthorized::authorizeKAction("logout") && KAuthorized::authorize("logout"); |
|
|
|
if (m_action == SaveSession) { |
|
const KConfigGroup c(KSharedConfig::openConfig("ksmserverrc", KConfig::NoGlobals), "General"); |
|
|
|
m_valid = authorize && c.readEntry("loginMode") == "restoreSavedSession"; |
|
} else { |
|
m_valid = authorize; |
|
} |
|
|
|
break; |
|
} |
|
case NewSession: |
|
m_valid = KAuthorized::authorizeKAction("start_new_session") |
|
&& m_displayManager->isSwitchable() |
|
&& m_displayManager->numReserve() >= 0; |
|
break; |
|
case SuspendToRam: |
|
m_valid = Solid::PowerManagement::supportedSleepStates().contains(Solid::PowerManagement::SuspendState); |
|
break; |
|
case SuspendToDisk: |
|
m_valid = Solid::PowerManagement::supportedSleepStates().contains(Solid::PowerManagement::HibernateState); |
|
break; |
|
case Reboot: |
|
m_valid = KWorkSpace::canShutDown(KWorkSpace::ShutdownConfirmDefault, KWorkSpace::ShutdownTypeReboot); |
|
break; |
|
case Shutdown: |
|
m_valid = KWorkSpace::canShutDown(KWorkSpace::ShutdownConfirmDefault, KWorkSpace::ShutdownTypeHalt); |
|
break; |
|
default: |
|
m_valid = true; |
|
} |
|
} |
|
|
|
bool SystemEntry::isValid() const |
|
{ |
|
return m_valid; |
|
} |
|
|
|
QIcon SystemEntry::icon() const |
|
{ |
|
const QString &name = iconName(); |
|
|
|
if (!name.isEmpty()) { |
|
return QIcon::fromTheme(name, QIcon::fromTheme("unknown")); |
|
} |
|
|
|
return QIcon::fromTheme("unknown"); |
|
} |
|
|
|
QString SystemEntry::iconName() const |
|
{ |
|
switch (m_action) { |
|
case LockSession: |
|
return "system-lock-screen"; |
|
break; |
|
case LogoutSession: |
|
return "system-log-out"; |
|
break; |
|
case SaveSession: |
|
return "system-save-session"; |
|
break; |
|
case NewSession: |
|
return "system-switch-user"; |
|
break; |
|
case SuspendToRam: |
|
return "system-suspend"; |
|
break; |
|
case SuspendToDisk: |
|
return "system-suspend-hibernate"; |
|
break; |
|
case Reboot: |
|
return "system-reboot"; |
|
break; |
|
case Shutdown: |
|
return "system-shutdown"; |
|
break; |
|
default: |
|
break; |
|
} |
|
|
|
return QString(); |
|
} |
|
|
|
QString SystemEntry::name() const |
|
{ |
|
switch (m_action) { |
|
case LockSession: |
|
return i18n("Lock"); |
|
break; |
|
case LogoutSession: |
|
return i18n("Logout"); |
|
break; |
|
case SaveSession: |
|
return i18n("Save Session"); |
|
break; |
|
case NewSession: |
|
return i18n("New Session"); |
|
break; |
|
case SuspendToRam: |
|
return i18n("Suspend"); |
|
break; |
|
case SuspendToDisk: |
|
return i18n("Hibernate"); |
|
break; |
|
case Reboot: |
|
return i18n("Restart"); |
|
break; |
|
case Shutdown: |
|
return i18n("Shutdown"); |
|
break; |
|
default: |
|
break; |
|
} |
|
|
|
return QString(); |
|
} |
|
|
|
QString SystemEntry::group() const |
|
{ |
|
switch (m_action) { |
|
case LockSession: |
|
return i18n("Session"); |
|
break; |
|
case LogoutSession: |
|
return i18n("Session"); |
|
break; |
|
case SaveSession: |
|
return i18n("Session"); |
|
break; |
|
case NewSession: |
|
return i18n("Session"); |
|
break; |
|
case SuspendToRam: |
|
return i18n("System"); |
|
break; |
|
case SuspendToDisk: |
|
return i18n("System"); |
|
break; |
|
case Reboot: |
|
return i18n("System"); |
|
break; |
|
case Shutdown: |
|
return i18n("System"); |
|
break; |
|
default: |
|
break; |
|
} |
|
|
|
return QString(); |
|
} |
|
|
|
QString SystemEntry::description() const |
|
{ |
|
switch (m_action) { |
|
case LockSession: |
|
return i18n("Lock screen"); |
|
break; |
|
case LogoutSession: |
|
return i18n("End session"); |
|
break; |
|
case SaveSession: |
|
return i18n("Save Session"); |
|
break; |
|
case NewSession: |
|
return i18n("Start a parallel session as a different user"); |
|
break; |
|
case SuspendToRam: |
|
return i18n("Suspend to RAM"); |
|
break; |
|
case SuspendToDisk: |
|
return i18n("Suspend to disk"); |
|
break; |
|
case Reboot: |
|
return i18n("Restart computer"); |
|
break; |
|
case Shutdown: |
|
return i18n("Turn off computer"); |
|
break; |
|
default: |
|
break; |
|
} |
|
|
|
return QString(); |
|
} |
|
|
|
QString SystemEntry::id() const |
|
{ |
|
switch (m_action) { |
|
case LockSession: |
|
return QStringLiteral("lock-screen"); |
|
break; |
|
case LogoutSession: |
|
return QStringLiteral("logout"); |
|
break; |
|
case SaveSession: |
|
return QStringLiteral("save-session"); |
|
break; |
|
case NewSession: |
|
return QStringLiteral("switch-user"); |
|
break; |
|
case SuspendToRam: |
|
return QStringLiteral("suspend"); |
|
break; |
|
case SuspendToDisk: |
|
return QStringLiteral("hibernate"); |
|
break; |
|
case Reboot: |
|
return QStringLiteral("reboot"); |
|
break; |
|
case Shutdown: |
|
return QStringLiteral("shutdown"); |
|
break; |
|
|
|
default: |
|
break; |
|
} |
|
|
|
return QString(); |
|
} |
|
|
|
bool SystemEntry::run(const QString& actionId, const QVariant &argument) |
|
{ |
|
Q_UNUSED(actionId) |
|
Q_UNUSED(argument) |
|
|
|
switch (m_action) { |
|
case LockSession: |
|
{ |
|
QDBusConnection bus = QDBusConnection::sessionBus(); |
|
QDBusInterface interface("org.freedesktop.ScreenSaver", "/ScreenSaver", "org.freedesktop.ScreenSaver", bus); |
|
interface.asyncCall("Lock"); |
|
break; |
|
} |
|
case LogoutSession: |
|
KWorkSpace::requestShutDown(KWorkSpace::ShutdownConfirmDefault, KWorkSpace::ShutdownTypeNone); |
|
break; |
|
case SaveSession: |
|
{ |
|
org::kde::KSMServerInterface ksmserver(QStringLiteral("org.kde.ksmserver"), |
|
QStringLiteral("/KSMServer"), QDBusConnection::sessionBus()); |
|
|
|
if (ksmserver.isValid()) { |
|
ksmserver.saveCurrentSession(); |
|
} |
|
|
|
break; |
|
} |
|
case NewSession: |
|
{ |
|
QDBusConnection bus = QDBusConnection::sessionBus(); |
|
QDBusInterface interface("org.freedesktop.ScreenSaver", "/ScreenSaver", "org.freedesktop.ScreenSaver", bus); |
|
interface.asyncCall("Lock"); |
|
m_displayManager->startReserve(); |
|
break; |
|
}; |
|
case SuspendToRam: |
|
Solid::PowerManagement::requestSleep(Solid::PowerManagement::SuspendState, 0, 0); |
|
break; |
|
case SuspendToDisk: |
|
Solid::PowerManagement::requestSleep(Solid::PowerManagement::HibernateState, 0, 0); |
|
break; |
|
case Reboot: |
|
KWorkSpace::requestShutDown(KWorkSpace::ShutdownConfirmDefault, KWorkSpace::ShutdownTypeReboot); |
|
break; |
|
case Shutdown: |
|
KWorkSpace::requestShutDown(KWorkSpace::ShutdownConfirmDefault, KWorkSpace::ShutdownTypeHalt); |
|
break; |
|
default: |
|
return false; |
|
} |
|
|
|
return true; |
|
}
|
|
|