Branch data Line data Source code
1 : : // SPDX-License-Identifier: GPL-3.0-or-later
2 : : // SPDX-FileCopyrightText: Andy Holmes <andrew.g.r.holmes@gmail.com>
3 : :
4 : : #define G_LOG_DOMAIN "valent-session-adapter"
5 : :
6 : : #include "config.h"
7 : :
8 : : #include <gio/gio.h>
9 : : #include <libvalent-core.h>
10 : :
11 : : #include "valent-session-adapter.h"
12 : :
13 : :
14 : : /**
15 : : * ValentSessionAdapter:
16 : : *
17 : : * An abstract base class for session managers.
18 : : *
19 : : * `ValentSessionAdapter` is a base class for plugins that provide an interface
20 : : * to the desktop session manager. This usually means monitoring the idle state,
21 : : * locking and unlocking the session.
22 : : *
23 : : * ## `.plugin` File
24 : : *
25 : : * Implementations may define the following extra fields in the `.plugin` file:
26 : : *
27 : : * - `X-SessionAdapterPriority`
28 : : *
29 : : * An integer indicating the adapter priority. The implementation with the
30 : : * lowest value will be used as the primary adapter.
31 : : *
32 : : * Since: 1.0
33 : : */
34 : :
35 : : typedef struct
36 : : {
37 : : uint8_t active : 1;
38 : : uint8_t locked : 1;
39 : : } ValentSessionAdapterPrivate;
40 : :
41 [ + + + - ]: 370 : G_DEFINE_ABSTRACT_TYPE_WITH_PRIVATE (ValentSessionAdapter, valent_session_adapter, VALENT_TYPE_EXTENSION)
42 : :
43 : : typedef enum {
44 : : PROP_ACTIVE = 1,
45 : : PROP_LOCKED,
46 : : } ValentSessionAdapterProperty;
47 : :
48 : : static GParamSpec *properties[PROP_LOCKED + 1] = { NULL, };
49 : :
50 : :
51 : : /* LCOV_EXCL_START */
52 : : static gboolean
53 : : valent_session_adapter_real_get_active (ValentSessionAdapter *adapter)
54 : : {
55 : : ValentSessionAdapterPrivate *priv = valent_session_adapter_get_instance_private (adapter);
56 : :
57 : : g_assert (VALENT_IS_SESSION_ADAPTER (adapter));
58 : :
59 : : return priv->active;
60 : : }
61 : :
62 : : static gboolean
63 : : valent_session_adapter_real_get_locked (ValentSessionAdapter *adapter)
64 : : {
65 : : ValentSessionAdapterPrivate *priv = valent_session_adapter_get_instance_private (adapter);
66 : :
67 : : g_assert (VALENT_IS_SESSION_ADAPTER (adapter));
68 : :
69 : : return priv->locked;
70 : : }
71 : :
72 : : static void
73 : : valent_session_adapter_real_set_locked (ValentSessionAdapter *adapter,
74 : : gboolean state)
75 : : {
76 : : ValentSessionAdapterPrivate *priv = valent_session_adapter_get_instance_private (adapter);
77 : :
78 : : g_assert (VALENT_IS_SESSION_ADAPTER (adapter));
79 : :
80 : : if (priv->active == !!state)
81 : : return;
82 : :
83 : : priv->locked = !!state;
84 : : g_object_notify_by_pspec (G_OBJECT (adapter), properties [PROP_LOCKED]);
85 : : }
86 : : /* LCOV_EXCL_STOP */
87 : :
88 : : /*
89 : : * GObject
90 : : */
91 : : static void
92 : 4 : valent_session_adapter_get_property (GObject *object,
93 : : guint prop_id,
94 : : GValue *value,
95 : : GParamSpec *pspec)
96 : : {
97 : 4 : ValentSessionAdapter *self = VALENT_SESSION_ADAPTER (object);
98 : :
99 [ + + - ]: 4 : switch ((ValentSessionAdapterProperty)prop_id)
100 : : {
101 : 2 : case PROP_ACTIVE:
102 : 2 : g_value_set_boolean (value, valent_session_adapter_get_active (self));
103 : 2 : break;
104 : :
105 : 2 : case PROP_LOCKED:
106 : 2 : g_value_set_boolean (value, valent_session_adapter_get_locked (self));
107 : 2 : break;
108 : :
109 : 0 : default:
110 : 0 : G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
111 : : }
112 : 4 : }
113 : :
114 : : static void
115 : 1 : valent_session_adapter_set_property (GObject *object,
116 : : guint prop_id,
117 : : const GValue *value,
118 : : GParamSpec *pspec)
119 : : {
120 : 1 : ValentSessionAdapter *self = VALENT_SESSION_ADAPTER (object);
121 : :
122 [ + - ]: 1 : switch ((ValentSessionAdapterProperty)prop_id)
123 : : {
124 : 1 : case PROP_LOCKED:
125 : 1 : valent_session_adapter_set_locked (self, g_value_get_boolean (value));
126 : 1 : break;
127 : :
128 : 0 : case PROP_ACTIVE:
129 : : default:
130 : 0 : G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
131 : : }
132 : 1 : }
133 : :
134 : : static void
135 : 58 : valent_session_adapter_class_init (ValentSessionAdapterClass *klass)
136 : : {
137 : 58 : GObjectClass *object_class = G_OBJECT_CLASS (klass);
138 : :
139 : 58 : object_class->get_property = valent_session_adapter_get_property;
140 : 58 : object_class->set_property = valent_session_adapter_set_property;
141 : :
142 : 58 : klass->get_active = valent_session_adapter_real_get_active;
143 : 58 : klass->get_locked = valent_session_adapter_real_get_locked;
144 : 58 : klass->set_locked = valent_session_adapter_real_set_locked;
145 : :
146 : : /**
147 : : * ValentSessionAdapter:active: (getter get_active)
148 : : *
149 : : * Whether the session is active.
150 : : *
151 : : * Since: 1.0
152 : : */
153 : 116 : properties [PROP_ACTIVE] =
154 : 58 : g_param_spec_boolean ("active", NULL, NULL,
155 : : FALSE,
156 : : (G_PARAM_READABLE |
157 : : G_PARAM_EXPLICIT_NOTIFY |
158 : : G_PARAM_STATIC_STRINGS));
159 : :
160 : : /**
161 : : * ValentSessionAdapter:locked: (getter get_locked) (setter set_locked)
162 : : *
163 : : * Whether the session is locked.
164 : : *
165 : : * Since: 1.0
166 : : */
167 : 116 : properties [PROP_LOCKED] =
168 : 58 : g_param_spec_boolean ("locked", NULL, NULL,
169 : : FALSE,
170 : : (G_PARAM_READWRITE |
171 : : G_PARAM_EXPLICIT_NOTIFY |
172 : : G_PARAM_STATIC_STRINGS));
173 : :
174 : 58 : g_object_class_install_properties (object_class, G_N_ELEMENTS (properties), properties);
175 : 58 : }
176 : :
177 : : static void
178 : 6 : valent_session_adapter_init (ValentSessionAdapter *adapter)
179 : : {
180 : 6 : }
181 : :
182 : : /**
183 : : * valent_session_adapter_get_active: (virtual get_active) (get-property active)
184 : : * @adapter: a `ValentSessionAdapter`
185 : : *
186 : : * Get whether the session is active.
187 : : *
188 : : * Returns: %TRUE if active, %FALSE if idle
189 : : *
190 : : * Since: 1.0
191 : : */
192 : : gboolean
193 : 7 : valent_session_adapter_get_active (ValentSessionAdapter *adapter)
194 : : {
195 : 7 : gboolean ret;
196 : :
197 : 7 : VALENT_ENTRY;
198 : :
199 [ + - ]: 7 : g_return_val_if_fail (VALENT_IS_SESSION_ADAPTER (adapter), FALSE);
200 : :
201 : 7 : ret = VALENT_SESSION_ADAPTER_GET_CLASS (adapter)->get_active (adapter);
202 : :
203 : 7 : VALENT_RETURN (ret);
204 : : }
205 : :
206 : : /**
207 : : * valent_session_adapter_get_locked: (virtual get_locked) (get-property locked)
208 : : * @adapter: a `ValentSessionAdapter`
209 : : *
210 : : * Get whether the session is locked.
211 : : *
212 : : * Returns: %TRUE if locked, %FALSE if unlocked
213 : : *
214 : : * Since: 1.0
215 : : */
216 : : gboolean
217 : 13 : valent_session_adapter_get_locked (ValentSessionAdapter *adapter)
218 : : {
219 : 13 : gboolean ret;
220 : :
221 : 13 : VALENT_ENTRY;
222 : :
223 [ + - ]: 13 : g_return_val_if_fail (VALENT_IS_SESSION_ADAPTER (adapter), FALSE);
224 : :
225 : 13 : ret = VALENT_SESSION_ADAPTER_GET_CLASS (adapter)->get_locked (adapter);
226 : :
227 : 13 : VALENT_RETURN (ret);
228 : : }
229 : :
230 : : /**
231 : : * valent_session_adapter_set_locked: (virtual set_locked) (set-property locked)
232 : : * @adapter: a `ValentSessionAdapter`
233 : : * @state: %TRUE to lock, %FALSE to unlock
234 : : *
235 : : * Set whether the session is locked.
236 : : *
237 : : * Since: 1.0
238 : : */
239 : : void
240 : 5 : valent_session_adapter_set_locked (ValentSessionAdapter *adapter,
241 : : gboolean state)
242 : : {
243 : 5 : VALENT_ENTRY;
244 : :
245 [ + - ]: 5 : g_return_if_fail (VALENT_IS_SESSION_ADAPTER (adapter));
246 : :
247 : 5 : VALENT_SESSION_ADAPTER_GET_CLASS (adapter)->set_locked (adapter, state);
248 : :
249 : 5 : VALENT_EXIT;
250 : : }
251 : :
|