diff options
Diffstat (limited to 'accounts/gkleen@sif/shell/quickshell-plugins/Systemd.hpp')
-rw-r--r-- | accounts/gkleen@sif/shell/quickshell-plugins/Systemd.hpp | 133 |
1 files changed, 133 insertions, 0 deletions
diff --git a/accounts/gkleen@sif/shell/quickshell-plugins/Systemd.hpp b/accounts/gkleen@sif/shell/quickshell-plugins/Systemd.hpp index f8841518..615024d2 100644 --- a/accounts/gkleen@sif/shell/quickshell-plugins/Systemd.hpp +++ b/accounts/gkleen@sif/shell/quickshell-plugins/Systemd.hpp | |||
@@ -1,14 +1,147 @@ | |||
1 | #pragma once | 1 | #pragma once |
2 | 2 | ||
3 | #include <cstdint> | ||
4 | #include <memory> | ||
5 | #include <string> | ||
6 | |||
3 | #include <QObject> | 7 | #include <QObject> |
8 | #include <QDBusInterface> | ||
4 | #include <QtQmlIntegration/qqmlintegration.h> | 9 | #include <QtQmlIntegration/qqmlintegration.h> |
5 | 10 | ||
11 | #include "dbus_systemd_manager.h" | ||
12 | #include "dbus_logind_manager.h" | ||
13 | #include "dbus_logind_session.h" | ||
14 | #include "dbus_properties.h" | ||
15 | |||
6 | class Systemd : public QObject { | 16 | class Systemd : public QObject { |
7 | Q_OBJECT; | 17 | Q_OBJECT; |
8 | QML_SINGLETON; | 18 | QML_SINGLETON; |
9 | QML_ELEMENT; | 19 | QML_ELEMENT; |
10 | 20 | ||
11 | public: | 21 | public: |
22 | explicit Systemd(QObject* parent = nullptr); | ||
23 | |||
24 | Q_PROPERTY(bool idleHint READ idleHint WRITE setIdleHint NOTIFY idleHintChanged) | ||
25 | Q_PROPERTY(bool lockedHint READ lockedHint WRITE setLockedHint NOTIFY lockedHintChanged) | ||
26 | |||
12 | Q_INVOKABLE void stopUserUnit(const QString& unit, const QString& mode); | 27 | Q_INVOKABLE void stopUserUnit(const QString& unit, const QString& mode); |
13 | Q_INVOKABLE void setBrightness(const QString& subsystem, const QString& name, quint32 brightness); | 28 | Q_INVOKABLE void setBrightness(const QString& subsystem, const QString& name, quint32 brightness); |
29 | Q_INVOKABLE void setIdleHint(bool idle); | ||
30 | Q_INVOKABLE void setLockedHint(bool locked); | ||
31 | Q_INVOKABLE void lockSession(); | ||
32 | Q_INVOKABLE void suspend(); | ||
33 | Q_INVOKABLE void hibernate(); | ||
34 | |||
35 | bool idleHint(); | ||
36 | bool lockedHint(); | ||
37 | |||
38 | signals: | ||
39 | void shutdown(bool before); | ||
40 | void sleep(bool before); | ||
41 | void lock(); | ||
42 | void unlock(); | ||
43 | void idleHintChanged(); | ||
44 | void lockedHintChanged(); | ||
45 | |||
46 | private slots: | ||
47 | void onLogindSessionPropertiesChanged(const QString& interface_name, const QVariantMap& changed_properties, const QStringList& invalidated_properties); | ||
48 | |||
49 | private: | ||
50 | DBusSystemdManager* systemdManager; | ||
51 | DBusLogindManager* logindManager; | ||
52 | DBusLogindSession* logindSession; | ||
53 | DBusProperties* logindSessionProperties; | ||
54 | }; | ||
55 | |||
56 | class SystemdInhibitorParams : public QObject { | ||
57 | Q_OBJECT; | ||
58 | QML_ELEMENT; | ||
59 | QML_SINGLETON; | ||
60 | |||
61 | public: | ||
62 | enum WhatItem : uint8_t { | ||
63 | Shutdown = 0b1, | ||
64 | Sleep = 0b10, | ||
65 | Idle = 0b100, | ||
66 | HandlePowerKey = 0b1000, | ||
67 | HandleSuspendKey = 0b10000, | ||
68 | HandleHibernateKey = 0b100000, | ||
69 | HandleLidSwitch = 0b1000000, | ||
70 | }; | ||
71 | Q_ENUM(WhatItem); | ||
72 | Q_DECLARE_FLAGS(What, WhatItem); | ||
73 | |||
74 | enum Mode : uint8_t { | ||
75 | Block = 1, | ||
76 | BlockWeak = 2, | ||
77 | Delay = 3, | ||
78 | }; | ||
79 | Q_ENUM(Mode); | ||
80 | |||
81 | Q_INVOKABLE static std::string toString(WhatItem what); | ||
82 | Q_INVOKABLE static std::string toString(What what); | ||
83 | Q_INVOKABLE static std::string toString(Mode mode); | ||
84 | |||
85 | static constexpr WhatItem allWhatItems[] = { Shutdown, Sleep, Idle, HandlePowerKey, HandleSuspendKey, HandleHibernateKey, HandleLidSwitch }; | ||
14 | }; | 86 | }; |
87 | Q_DECLARE_OPERATORS_FOR_FLAGS(SystemdInhibitorParams::What) | ||
88 | |||
89 | class SystemdInhibitor : public QObject { | ||
90 | Q_OBJECT; | ||
91 | Q_PROPERTY(bool enabled READ enabled WRITE setEnabled NOTIFY enabledChanged); | ||
92 | Q_PROPERTY(SystemdInhibitorParams::What what READ what WRITE setWhat NOTIFY whatChanged); | ||
93 | Q_PROPERTY(QString who READ who WRITE setWho NOTIFY whoChanged); | ||
94 | Q_PROPERTY(QString why READ why WRITE setWhy NOTIFY whyChanged); | ||
95 | Q_PROPERTY(SystemdInhibitorParams::Mode mode READ mode WRITE setMode NOTIFY modeChanged); | ||
96 | QML_ELEMENT; | ||
97 | |||
98 | public: | ||
99 | explicit SystemdInhibitor(QObject* parent = nullptr): QObject(parent) {} | ||
100 | |||
101 | bool enabled() const; | ||
102 | void setEnabled(bool enabled); | ||
103 | |||
104 | SystemdInhibitorParams::What what() const; | ||
105 | void setWhat(SystemdInhibitorParams::What what); | ||
106 | |||
107 | QString who() const; | ||
108 | void setWho(QString who); | ||
109 | |||
110 | QString why() const; | ||
111 | void setWhy(QString why); | ||
112 | |||
113 | SystemdInhibitorParams::Mode mode() const; | ||
114 | void setMode(SystemdInhibitorParams::Mode mode); | ||
115 | |||
116 | Q_INVOKABLE void release(); | ||
117 | |||
118 | signals: | ||
119 | void enabledChanged(); | ||
120 | void whatChanged(); | ||
121 | void whoChanged(); | ||
122 | void whyChanged(); | ||
123 | void modeChanged(); | ||
124 | |||
125 | private: | ||
126 | class ActiveSystemdInhibitor { | ||
127 | public: | ||
128 | uint32_t fd = -1; | ||
129 | SystemdInhibitorParams::What what; | ||
130 | QString who; | ||
131 | QString why; | ||
132 | SystemdInhibitorParams::Mode mode; | ||
133 | |||
134 | ActiveSystemdInhibitor(SystemdInhibitorParams::What what_, QString who_, QString why_, SystemdInhibitorParams::Mode mode_); | ||
135 | ~ActiveSystemdInhibitor(); | ||
136 | }; | ||
137 | |||
138 | void update(); | ||
139 | |||
140 | bool mEnabled = true; | ||
141 | std::unique_ptr<ActiveSystemdInhibitor> activeInhibitor; | ||
142 | SystemdInhibitorParams::What mWhat = static_cast<SystemdInhibitorParams::What>(0); | ||
143 | QString mWho; | ||
144 | QString mWhy; | ||
145 | SystemdInhibitorParams::Mode mMode = static_cast<SystemdInhibitorParams::Mode>(0); | ||
146 | }; | ||
147 | |||