diff --git a/containmentactions/contextmenu/menu.h b/containmentactions/contextmenu/menu.h --- a/containmentactions/contextmenu/menu.h +++ b/containmentactions/contextmenu/menu.h @@ -23,6 +23,8 @@ #include #include +class SessionManagement; + class ContextMenu : public Plasma::ContainmentActions { Q_OBJECT @@ -41,9 +43,7 @@ public Q_SLOTS: void runCommand(); - void lockScreen(); void startLogout(); - void logout(); private: QAction *m_runCommandAction; @@ -57,6 +57,7 @@ QHash m_actions; QStringList m_actionOrder; QButtonGroup *m_buttons; + SessionManagement *m_session; }; #endif diff --git a/containmentactions/contextmenu/menu.cpp b/containmentactions/contextmenu/menu.cpp --- a/containmentactions/contextmenu/menu.cpp +++ b/containmentactions/contextmenu/menu.cpp @@ -35,13 +35,8 @@ #include #include "kworkspace.h" +#include #include "krunner_interface.h" -#include "screensaver_interface.h" - -#ifdef Q_OS_WIN -#define _WIN32_WINNT 0x0500 // require NT 5.0 (win 2k pro) -#include -#endif // Q_OS_WIN ContextMenu::ContextMenu(QObject *parent, const QVariantList &args) : Plasma::ContainmentActions(parent, args), @@ -51,7 +46,8 @@ m_separator1(nullptr), m_separator2(nullptr), m_separator3(nullptr), - m_buttons(nullptr) + m_buttons(nullptr), + m_session(new SessionManagement(this)) { } @@ -101,11 +97,20 @@ m_lockScreenAction = new QAction(i18nc("plasma_containmentactions_contextmenu", "Lock Screen"), this); m_lockScreenAction->setIcon(QIcon::fromTheme(QStringLiteral("system-lock-screen"))); m_lockScreenAction->setShortcut(KGlobalAccel::self()->globalShortcut(QStringLiteral("ksmserver"), QStringLiteral("Lock Session")).value(0)); - connect(m_lockScreenAction, &QAction::triggered, this, &ContextMenu::lockScreen); + m_lockScreenAction->setEnabled(m_session->canLock()); + connect(m_session, &SessionManagement::canLockChanged, this, [this]() { + m_lockScreenAction->setEnabled(m_session->canLock()); + }); + connect(m_lockScreenAction, &QAction::triggered, m_session, &SessionManagement::lock); + m_logoutAction = new QAction(i18nc("plasma_containmentactions_contextmenu", "Leave..."), this); m_logoutAction->setIcon(QIcon::fromTheme(QStringLiteral("system-log-out"))); m_logoutAction->setShortcut(KGlobalAccel::self()->globalShortcut(QStringLiteral("ksmserver"), QStringLiteral("Log Out")).value(0)); + m_logoutAction->setEnabled(m_session->canLogout()); + connect(m_session, &SessionManagement::canLogoutChanged, this, [this]() { + m_logoutAction->setEnabled(m_session->canLogout()); + }); connect(m_logoutAction, &QAction::triggered, this, &ContextMenu::startLogout); m_separator1 = new QAction(this); @@ -208,47 +213,21 @@ krunner.display(); } -void ContextMenu::lockScreen() -{ - if (!KAuthorized::authorizeAction(QStringLiteral("lock_screen"))) { - return; - } - -#ifndef Q_OS_WIN - QString interface(QStringLiteral("org.freedesktop.ScreenSaver")); - org::freedesktop::ScreenSaver screensaver(interface, QStringLiteral("/ScreenSaver"), - QDBusConnection::sessionBus()); - if (screensaver.isValid()) { - screensaver.Lock(); - } -#else - LockWorkStation(); -#endif // !Q_OS_WIN -} - void ContextMenu::startLogout() { - // this short delay is due to two issues: - // a) KWorkSpace's DBus alls are all synchronous - // b) the destruction of the menu that this action is in is delayed - // - // (a) leads to the menu hanging out where everyone can see it because - // the even loop doesn't get returned to allowing it to close. - // - // (b) leads to a 0ms timer not working since a 0ms timer just appends to - // the event queue, and then the menu closing event gets appended to that. - // - // ergo a timer with small timeout - QTimer::singleShot(10, this, &ContextMenu::logout); -} - -void ContextMenu::logout() -{ - if (!KAuthorized::authorizeAction(QStringLiteral("logout"))) { - return; + KConfig config(QStringLiteral("ksmserverrc")); + const auto group = config.group("General"); + switch (group.readEntry("shutdownType", int(KWorkSpace::ShutdownTypeNone))) { + case int(KWorkSpace::ShutdownTypeHalt): + m_session->requestShutdown(); + break; + case int(KWorkSpace::ShutdownTypeReboot): + m_session->requestReboot(); + break; + default: + m_session->requestLogout(); + break; } - - KWorkSpace::requestShutDown(); } QWidget* ContextMenu::createConfigurationInterface(QWidget* parent) diff --git a/dataengines/powermanagement/powermanagementjob.h b/dataengines/powermanagement/powermanagementjob.h --- a/dataengines/powermanagement/powermanagementjob.h +++ b/dataengines/powermanagement/powermanagementjob.h @@ -22,6 +22,7 @@ // plasma #include +class SessionManagement; class QDBusPendingCall; class PowerManagementJob : public Plasma::ServiceJob @@ -37,9 +38,9 @@ void start() override; private: - void requestShutDown(); QDBusPendingCall setScreenBrightness(int value, bool silent); QDBusPendingCall setKeyboardBrightness(int value, bool silent); + SessionManagement *m_session; }; #endif // POWERMANAGEMENTJOB_H diff --git a/dataengines/powermanagement/powermanagementjob.cpp b/dataengines/powermanagement/powermanagementjob.cpp --- a/dataengines/powermanagement/powermanagementjob.cpp +++ b/dataengines/powermanagement/powermanagementjob.cpp @@ -24,16 +24,17 @@ #include // kde-workspace/libs -#include +#include #include #include "powermanagementjob.h" #include -PowerManagementJob::PowerManagementJob(const QString &operation, QMap ¶meters, QObject *parent) : - ServiceJob(parent->objectName(), operation, parameters, parent) +PowerManagementJob::PowerManagementJob(const QString &operation, QMap ¶meters, QObject *parent) + : ServiceJob(parent->objectName(), operation, parameters, parent) + , m_session(new SessionManagement(this)) { } @@ -57,37 +58,52 @@ //qDebug() << "starting operation ... " << operation; if (operation == QLatin1String("lockScreen")) { - if (KAuthorized::authorizeAction(QStringLiteral("lock_screen"))) { - const QString interface(QStringLiteral("org.freedesktop.ScreenSaver")); - QDBusInterface screensaver(interface, QStringLiteral("/ScreenSaver")); - screensaver.asyncCall(QStringLiteral("Lock")); + if (m_session->canLock()) { + m_session->lock(); setResult(true); return; } qDebug() << "operation denied " << operation; setResult(false); return; } else if (operation == QLatin1String("suspend") || operation == QLatin1String("suspendToRam")) { - Solid::PowerManagement::requestSleep(Solid::PowerManagement::SuspendState, nullptr, nullptr); - setResult(Solid::PowerManagement::supportedSleepStates().contains(Solid::PowerManagement::SuspendState)); + if (m_session->canSuspend()) { + m_session->suspend(); + setResult(true); + } else { + setResult(false); + } return; } else if (operation == QLatin1String("suspendToDisk")) { - Solid::PowerManagement::requestSleep(Solid::PowerManagement::HibernateState, nullptr, nullptr); - setResult(Solid::PowerManagement::supportedSleepStates().contains(Solid::PowerManagement::HibernateState)); + if (m_session->canHibernate()) { + m_session->hibernate(); + setResult(true); + } else { + setResult(false); + } return; } else if (operation == QLatin1String("suspendHybrid")) { - Solid::PowerManagement::requestSleep(Solid::PowerManagement::HybridSuspendState, nullptr, nullptr); - setResult(Solid::PowerManagement::supportedSleepStates().contains(Solid::PowerManagement::HybridSuspendState)); + if (m_session->canHybridSuspend()) { + m_session->hybridSuspend(); + setResult(true); + } else { + setResult(false); + } return; } else if (operation == QLatin1String("requestShutDown")) { - requestShutDown(); - setResult(true); + if (m_session->canShutdown()) { + m_session->requestShutdown(); + setResult(true); + } else { + setResult(false); + } return; } else if (operation == QLatin1String("switchUser")) { - // Taken from kickoff/core/itemhandlers.cpp - org::kde::krunner::App krunner(QStringLiteral("org.kde.krunner"), QStringLiteral("/App"), QDBusConnection::sessionBus()); - krunner.switchUser(); - setResult(true); + if (m_session->canSwitchUser()) { + m_session->switchUser(); + setResult(true); + } + setResult(false); return; } else if (operation == QLatin1String("beginSuppressingSleep")) { setResult(Solid::PowerManagement::beginSuppressingSleep(parameters().value(QStringLiteral("reason")).toString())); @@ -134,9 +150,3 @@ msg << value; return QDBusConnection::sessionBus().asyncCall(msg); } - -void PowerManagementJob::requestShutDown() -{ - KWorkSpace::requestShutDown(); -} - diff --git a/runners/sessions/sessionrunner.h b/runners/sessions/sessionrunner.h --- a/runners/sessions/sessionrunner.h +++ b/runners/sessions/sessionrunner.h @@ -22,6 +22,7 @@ #include #include +#include /** * This class provides matches for running sessions as well as @@ -41,11 +42,11 @@ enum { LogoutAction = 1, ShutdownAction, RestartAction, LockAction }; private: - void lock(); void matchCommands(QList &matches, const QString& term); QString m_triggerWord; KDisplayManager dm; + SessionManagement m_session; bool m_canLogout; }; diff --git a/runners/sessions/sessionrunner.cpp b/runners/sessions/sessionrunner.cpp --- a/runners/sessions/sessionrunner.cpp +++ b/runners/sessions/sessionrunner.cpp @@ -18,7 +18,6 @@ #include "sessionrunner.h" - #include #include #include @@ -213,29 +212,21 @@ { Q_UNUSED(context); if (match.data().type() == QVariant::Int) { - KWorkSpace::ShutdownType type = KWorkSpace::ShutdownTypeDefault; - switch (match.data().toInt()) { case LogoutAction: - type = KWorkSpace::ShutdownTypeNone; + m_session.requestLogout(); break; case RestartAction: - type = KWorkSpace::ShutdownTypeReboot; + m_session.requestReboot(); break; case ShutdownAction: - type = KWorkSpace::ShutdownTypeHalt; + m_session.requestShutdown(); break; case LockAction: - lock(); - return; + m_session.lock(); break; } - - if (type != KWorkSpace::ShutdownTypeDefault) { - KWorkSpace::ShutdownConfirm confirm = KWorkSpace::ShutdownConfirmDefault; - KWorkSpace::requestShutDown(confirm, type); - return; - } + return; } if (!match.data().toString().isEmpty()) { @@ -262,19 +253,9 @@ if (result == QMessageBox::Cancel) { return; } + m_session.lock(); - lock(); dm.startReserve(); } -void SessionRunner::lock() -{ - QString interface(QStringLiteral("org.freedesktop.ScreenSaver")); - org::freedesktop::ScreenSaver screensaver(interface, QStringLiteral("/ScreenSaver"), - QDBusConnection::sessionBus()); - if (screensaver.isValid()) { - screensaver.Lock(); - } -} - #include "sessionrunner.moc"