File indexing completed on 2024-04-28 05:35:36
0001 /* 0002 SPDX-FileCopyrightText: 2019 David Edmundson <davidedmundson@kde.org> 0003 0004 SPDX-License-Identifier: LGPL-2.0-or-later 0005 */ 0006 0007 #pragma once 0008 0009 #include <KConfigWatcher> 0010 #include <QObject> 0011 0012 #include "kworkspace_export.h" 0013 #include "sessionmanagement.h" 0014 0015 class OrgFreedesktopLogin1ManagerInterface; 0016 0017 /** 0018 * Performs direct system actions that could kill the session 0019 * 0020 * Semi-internal. Symbols exported, but not the header 0021 * To be used only by the daemon that performs logout (currently ksmserver) 0022 * 0023 * All other users should go via the public SessionManagement that prompts and logs out properly. 0024 */ 0025 class KWORKSPACE_EXPORT SessionBackend : public QObject 0026 { 0027 Q_OBJECT 0028 public: 0029 static SessionBackend *self(); 0030 virtual SessionManagement::State state() const = 0; 0031 0032 virtual void shutdown() = 0; 0033 virtual void reboot() = 0; 0034 virtual void suspend() = 0; 0035 virtual void hybridSuspend() = 0; 0036 virtual void hibernate() = 0; 0037 virtual void suspendThenHibernate() = 0; 0038 0039 virtual bool canShutdown() const = 0; 0040 virtual bool canReboot() const = 0; 0041 virtual bool canSuspend() const = 0; 0042 virtual bool canHybridSuspend() const = 0; 0043 virtual bool canHibernate() const = 0; 0044 virtual bool canSuspendThenHibernate() const = 0; 0045 0046 virtual bool canSwitchUser() const; 0047 0048 bool confirmLogout() const; 0049 0050 Q_SIGNALS: 0051 void stateChanged(); 0052 void canShutdownChanged(); 0053 void canRebootChanged(); 0054 void canSuspendChanged(); 0055 void canHybridSuspendChanged(); 0056 void canHibernateChanged(); 0057 void canSuspendThenHibernateChanged(); 0058 0059 void aboutToSuspend(); 0060 void resumingFromSuspend(); 0061 0062 protected: 0063 SessionBackend(); 0064 ~SessionBackend() override = default; 0065 0066 private: 0067 KConfigWatcher::Ptr m_kserverConfig; 0068 }; 0069 0070 /* 0071 * This class wraps both Logind and CK2 0072 * Abstraction for that is handled in OrgFreedesktopLogin1ManagerInterface 0073 */ 0074 class LogindSessionBackend : public SessionBackend 0075 { 0076 Q_OBJECT 0077 public: 0078 static bool exists(); 0079 LogindSessionBackend(); 0080 0081 SessionManagement::State state() const override; 0082 void shutdown() override; 0083 void reboot() override; 0084 void suspend() override; 0085 void hybridSuspend() override; 0086 void hibernate() override; 0087 void suspendThenHibernate() override; 0088 bool canShutdown() const override; 0089 bool canReboot() const override; 0090 bool canSuspend() const override; 0091 bool canHybridSuspend() const override; 0092 bool canHibernate() const override; 0093 bool canSuspendThenHibernate() const override; 0094 bool canSwitchUser() const override; 0095 0096 private: 0097 OrgFreedesktopLogin1ManagerInterface *m_login1; 0098 SessionManagement::State m_state = SessionManagement::State::Loading; 0099 bool m_canShutdown = false; 0100 bool m_canReboot = false; 0101 bool m_canSuspend = false; 0102 bool m_canHybridSuspend = false; 0103 bool m_canHibernate = false; 0104 bool m_canSuspendThenHibernate = false; 0105 uint m_pendingJobs = 0; 0106 }; 0107 0108 class DummySessionBackend : public SessionBackend 0109 { 0110 Q_OBJECT 0111 public: 0112 DummySessionBackend(); 0113 0114 SessionManagement::State state() const override 0115 { 0116 return SessionManagement::State::Error; 0117 } 0118 void shutdown() override 0119 { 0120 } 0121 void reboot() override 0122 { 0123 } 0124 void suspend() override 0125 { 0126 } 0127 void hybridSuspend() override 0128 { 0129 } 0130 void hibernate() override 0131 { 0132 } 0133 void suspendThenHibernate() override 0134 { 0135 } 0136 bool canShutdown() const override 0137 { 0138 return false; 0139 } 0140 bool canReboot() const override 0141 { 0142 return false; 0143 } 0144 bool canSuspend() const override 0145 { 0146 return false; 0147 } 0148 bool canHybridSuspend() const override 0149 { 0150 return false; 0151 } 0152 bool canHibernate() const override 0153 { 0154 return false; 0155 } 0156 bool canSuspendThenHibernate() const override 0157 { 0158 return false; 0159 } 0160 }; 0161 0162 class TestSessionBackend : public SessionBackend 0163 { 0164 Q_OBJECT 0165 public: 0166 TestSessionBackend(); 0167 0168 SessionManagement::State state() const override 0169 { 0170 return SessionManagement::State::Ready; 0171 } 0172 void shutdown() override; 0173 void reboot() override; 0174 void suspend() override; 0175 void hybridSuspend() override; 0176 void hibernate() override; 0177 void suspendThenHibernate() override; 0178 0179 bool canShutdown() const override 0180 { 0181 return true; 0182 } 0183 bool canReboot() const override 0184 { 0185 return true; 0186 } 0187 bool canSuspend() const override 0188 { 0189 return true; 0190 } 0191 bool canHybridSuspend() const override 0192 { 0193 return true; 0194 } 0195 bool canHibernate() const override 0196 { 0197 return true; 0198 } 0199 bool canSuspendThenHibernate() const override 0200 { 0201 return true; 0202 } 0203 };