mirror of https://github.com/Qortal/Brooklyn
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.
214 lines
6.0 KiB
214 lines
6.0 KiB
/* |
|
SPDX-FileCopyrightText: 2019 David Edmundson <[email protected]> |
|
|
|
SPDX-License-Identifier: LGPL-2.0-or-later |
|
*/ |
|
|
|
#include "sessionmanagement.h" |
|
|
|
#include "sessionmanagementbackend.h" |
|
|
|
#include <KAuthorized> |
|
#include <KConfigGroup> |
|
#include <KSharedConfig> |
|
|
|
#include "kscreenlocker_interface.h" |
|
#include "ksmserver_interface.h" |
|
#include "logoutprompt_interface.h" |
|
#include "screenlocker_interface.h" |
|
#include "shutdown_interface.h" |
|
|
|
// add a constructor with the service names and paths pre-populated |
|
class LogoutPromptIface : public OrgKdeLogoutPromptInterface |
|
{ |
|
Q_OBJECT |
|
public: |
|
LogoutPromptIface() |
|
: OrgKdeLogoutPromptInterface(QStringLiteral("org.kde.LogoutPrompt"), QStringLiteral("/LogoutPrompt"), QDBusConnection::sessionBus()) |
|
{ |
|
} |
|
}; |
|
|
|
class ShutdownIface : public OrgKdeShutdownInterface |
|
{ |
|
Q_OBJECT |
|
public: |
|
ShutdownIface() |
|
: OrgKdeShutdownInterface(QStringLiteral("org.kde.Shutdown"), QStringLiteral("/Shutdown"), QDBusConnection::sessionBus()) |
|
{ |
|
} |
|
}; |
|
|
|
SessionManagement::SessionManagement(QObject *parent) |
|
: QObject(parent) |
|
{ |
|
auto backend = SessionBackend::self(); |
|
connect(backend, &SessionBackend::stateChanged, this, &SessionManagement::stateChanged); |
|
connect(backend, &SessionBackend::canShutdownChanged, this, &SessionManagement::canShutdownChanged); |
|
connect(backend, &SessionBackend::canRebootChanged, this, &SessionManagement::canRebootChanged); |
|
connect(backend, &SessionBackend::canSuspendChanged, this, &SessionManagement::canSuspendChanged); |
|
connect(backend, &SessionBackend::canHybridSuspendChanged, this, &SessionManagement::canHybridSuspendChanged); |
|
connect(backend, &SessionBackend::canHibernateChanged, this, &SessionManagement::canHibernateChanged); |
|
connect(backend, &SessionBackend::aboutToSuspend, this, &SessionManagement::aboutToSuspend); |
|
connect(backend, &SessionBackend::resumingFromSuspend, this, &SessionManagement::resumingFromSuspend); |
|
} |
|
|
|
bool SessionManagement::canShutdown() const |
|
{ |
|
return canLogout() && SessionBackend::self()->canShutdown(); |
|
} |
|
|
|
bool SessionManagement::canReboot() const |
|
{ |
|
return canLogout() && SessionBackend::self()->canReboot(); |
|
} |
|
|
|
bool SessionManagement::canLogout() const |
|
{ |
|
// checking both is for compatibility with old kiosk configs |
|
// authorizeAction is the "correct" one |
|
return KAuthorized::authorizeAction(QStringLiteral("logout")) && KAuthorized::authorize(QStringLiteral("logout")); |
|
} |
|
|
|
bool SessionManagement::canSuspend() const |
|
{ |
|
return SessionBackend::self()->canSuspend(); |
|
} |
|
|
|
bool SessionManagement::canHybridSuspend() const |
|
{ |
|
return SessionBackend::self()->canHybridSuspend(); |
|
} |
|
|
|
bool SessionManagement::canHibernate() const |
|
{ |
|
return SessionBackend::self()->canHibernate(); |
|
} |
|
|
|
bool SessionManagement::canSwitchUser() const |
|
{ |
|
return KAuthorized::authorizeAction(QStringLiteral("start_new_session")); |
|
} |
|
|
|
bool SessionManagement::canLock() const |
|
{ |
|
return KAuthorized::authorizeAction(QStringLiteral("lock_screen")); |
|
} |
|
|
|
bool SessionManagement::canSaveSession() const |
|
{ |
|
const KConfigGroup c(KSharedConfig::openConfig(QStringLiteral("ksmserverrc")), "General"); |
|
return canLogout() && c.readEntry("loginMode") == QLatin1String("restoreSavedSession"); |
|
} |
|
|
|
SessionManagement::State SessionManagement::state() const |
|
{ |
|
return SessionBackend::self()->state(); |
|
} |
|
|
|
void SessionManagement::requestShutdown(ConfirmationMode confirmationMode) |
|
{ |
|
if (!canShutdown()) { |
|
return; |
|
} |
|
bool confirm = confirmationMode == ConfirmationMode::ForcePrompt; |
|
if (confirmationMode == ConfirmationMode::Default) { |
|
confirm = SessionBackend::self()->confirmLogout(); |
|
} |
|
if (confirm) { |
|
LogoutPromptIface iface; |
|
iface.promptShutDown().waitForFinished(); |
|
} else { |
|
ShutdownIface iface; |
|
iface.logoutAndShutdown().waitForFinished(); |
|
} |
|
} |
|
|
|
void SessionManagement::requestReboot(ConfirmationMode confirmationMode) |
|
{ |
|
if (!canReboot()) { |
|
return; |
|
} |
|
bool confirm = confirmationMode == ConfirmationMode::ForcePrompt; |
|
if (confirmationMode == ConfirmationMode::Default) { |
|
confirm = SessionBackend::self()->confirmLogout(); |
|
} |
|
if (confirm) { |
|
LogoutPromptIface iface; |
|
iface.promptReboot().waitForFinished(); |
|
} else { |
|
ShutdownIface iface; |
|
iface.logoutAndReboot().waitForFinished(); |
|
} |
|
} |
|
|
|
void SessionManagement::requestLogout(ConfirmationMode confirmationMode) |
|
{ |
|
if (!canLogout()) { |
|
return; |
|
} |
|
bool confirm = confirmationMode == ConfirmationMode::ForcePrompt; |
|
if (confirmationMode == ConfirmationMode::Default) { |
|
confirm = SessionBackend::self()->confirmLogout(); |
|
} |
|
if (confirm) { |
|
LogoutPromptIface iface; |
|
iface.promptLogout().waitForFinished(); |
|
} else { |
|
ShutdownIface iface; |
|
iface.logout().waitForFinished(); |
|
} |
|
} |
|
|
|
void SessionManagement::suspend() |
|
{ |
|
if (!canSuspend()) { |
|
return; |
|
} |
|
SessionBackend::self()->suspend(); |
|
} |
|
|
|
void SessionManagement::hybridSuspend() |
|
{ |
|
if (!canHybridSuspend()) { |
|
return; |
|
} |
|
SessionManagement::hybridSuspend(); |
|
} |
|
|
|
void SessionManagement::hibernate() |
|
{ |
|
if (!canHibernate()) { |
|
return; |
|
} |
|
SessionBackend::self()->hibernate(); |
|
} |
|
|
|
void SessionManagement::lock() |
|
{ |
|
if (!canLock()) { |
|
return; |
|
} |
|
OrgFreedesktopScreenSaverInterface iface(QStringLiteral("org.freedesktop.ScreenSaver"), QStringLiteral("/ScreenSaver"), QDBusConnection::sessionBus()); |
|
iface.Lock(); |
|
} |
|
|
|
void SessionManagement::switchUser() |
|
{ |
|
if (!canSwitchUser()) { |
|
return; |
|
} |
|
OrgKdeScreensaverInterface iface(QStringLiteral("org.freedesktop.ScreenSaver"), QStringLiteral("/ScreenSaver"), QDBusConnection::sessionBus()); |
|
iface.SwitchUser(); |
|
} |
|
|
|
void SessionManagement::saveSession() |
|
{ |
|
if (!canSaveSession()) { |
|
return; |
|
} |
|
OrgKdeKSMServerInterfaceInterface ksmserver(QStringLiteral("org.kde.ksmserver"), QStringLiteral("/KSMServer"), QDBusConnection::sessionBus()); |
|
ksmserver.saveCurrentSession(); |
|
} |
|
|
|
#include "sessionmanagement.moc"
|
|
|