1 /*
2     SPDX-FileCopyrightText: 2019 David Edmundson <davidedmundson@kde.org>
3 
4     SPDX-License-Identifier: LGPL-2.0-or-later
5 */
6 
7 #pragma once
8 
9 #include "kworkspace_export.h"
10 #include <QObject>
11 
12 /**
13  * Public facing API for SessionManagement
14  */
15 class KWORKSPACE_EXPORT SessionManagement : public QObject
16 {
17     Q_OBJECT
18     Q_PROPERTY(State state READ state NOTIFY stateChanged)
19 
20     Q_PROPERTY(bool canShutdown READ canShutdown NOTIFY canShutdownChanged)
21     Q_PROPERTY(bool canReboot READ canReboot NOTIFY canRebootChanged)
22     Q_PROPERTY(bool canLogout READ canLogout NOTIFY canLogoutChanged)
23     Q_PROPERTY(bool canSuspend READ canSuspend NOTIFY canSuspendChanged)
24     Q_PROPERTY(bool canHibernate READ canHibernate NOTIFY canHibernateChanged)
25     Q_PROPERTY(bool canSwitchUser READ canSwitchUser NOTIFY canSwitchUserChanged)
26     Q_PROPERTY(bool canLock READ canLock NOTIFY canLockChanged)
27     Q_PROPERTY(bool canSaveSession READ canSaveSession NOTIFY canSaveSessionChanged)
28 
29 public:
30     enum class State {
31         /**
32          * The backend is loading canXyz functions may not represent the true state
33          */
34         Loading,
35         /**
36          * All loaded
37          */
38         Ready,
39         /**
40          * Error creating a suitable backend, no actions will be available
41          */
42         Error,
43     };
44     Q_ENUM(State)
45 
46     enum class ConfirmationMode {
47         /**
48          * Obey the user's confirmation setting.
49          */
50         Default = -1,
51         /**
52          * Don't confirm, shutdown without asking.
53          */
54         Skip = 0,
55         /**
56          * Always confirm, ask even if the user turned it off.
57          */
58         ForcePrompt = 1,
59     };
60     Q_ENUM(ConfirmationMode)
61 
62     SessionManagement(QObject *parent = nullptr);
63     ~SessionManagement() override = default;
64 
65     State state() const;
66 
67     bool canShutdown() const;
68     bool canReboot() const;
69     bool canLogout() const;
70     bool canSuspend() const;
71     bool canHybridSuspend() const;
72     bool canHibernate() const;
73     bool canSwitchUser() const;
74     bool canLock() const;
75     bool canSaveSession() const;
76 
77 public Q_SLOTS:
78     /**
79      * These requestX methods will either launch a prompt to shutdown or
80      * The user may cancel it at any point in the process
81      */
82     void requestShutdown(ConfirmationMode = ConfirmationMode::Default);
83     void requestReboot(ConfirmationMode = ConfirmationMode::Default);
84     void requestLogout(ConfirmationMode = ConfirmationMode::Default);
85 
86     void suspend();
87     void hybridSuspend();
88     void hibernate();
89 
90     void switchUser();
91     void lock();
92 
93     void saveSession();
94 
95 Q_SIGNALS:
96     void stateChanged();
97     void canShutdownChanged();
98     void canRebootChanged();
99     void canLogoutChanged();
100     void canSuspendChanged();
101     void canHybridSuspendChanged();
102     void canHibernateChanged();
103     void canSwitchUserChanged();
104     void canLockChanged();
105     void canSaveSessionChanged();
106 
107     void aboutToSuspend();
108     void resumingFromSuspend();
109 
110 private:
111     void *d; // unused, just reserving the space in case we go ABI stable
112 };
113