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 [ + + + - ]: 416 : G_DEFINE_ABSTRACT_TYPE_WITH_PRIVATE (ValentSessionAdapter, valent_session_adapter, VALENT_TYPE_EXTENSION)
42 : :
43 : : /**
44 : : * ValentSessionAdapterClass:
45 : : * @get_active: the virtual function pointer for valent_session_adapter_get_active()
46 : : * @get_locked: the virtual function pointer for valent_session_adapter_get_locked()
47 : : * @set_locked: the virtual function pointer for valent_session_adapter_set_locked()
48 : : *
49 : : * The virtual function table for `ValentSessionAdapter`.
50 : : */
51 : :
52 : : enum {
53 : : PROP_0,
54 : : PROP_ACTIVE,
55 : : PROP_LOCKED,
56 : : N_PROPERTIES
57 : : };
58 : :
59 : : static GParamSpec *properties[N_PROPERTIES] = { NULL, };
60 : :
61 : :
62 : : /* LCOV_EXCL_START */
63 : : static gboolean
64 : : valent_session_adapter_real_get_active (ValentSessionAdapter *adapter)
65 : : {
66 : : ValentSessionAdapterPrivate *priv = valent_session_adapter_get_instance_private (adapter);
67 : :
68 : : g_assert (VALENT_IS_SESSION_ADAPTER (adapter));
69 : :
70 : : return priv->active;
71 : : }
72 : :
73 : : static gboolean
74 : : valent_session_adapter_real_get_locked (ValentSessionAdapter *adapter)
75 : : {
76 : : ValentSessionAdapterPrivate *priv = valent_session_adapter_get_instance_private (adapter);
77 : :
78 : : g_assert (VALENT_IS_SESSION_ADAPTER (adapter));
79 : :
80 : : return priv->locked;
81 : : }
82 : :
83 : : static void
84 : : valent_session_adapter_real_set_locked (ValentSessionAdapter *adapter,
85 : : gboolean state)
86 : : {
87 : : ValentSessionAdapterPrivate *priv = valent_session_adapter_get_instance_private (adapter);
88 : :
89 : : g_assert (VALENT_IS_SESSION_ADAPTER (adapter));
90 : :
91 : : if (priv->active == !!state)
92 : : return;
93 : :
94 : : priv->locked = !!state;
95 : : g_object_notify_by_pspec (G_OBJECT (adapter), properties [PROP_LOCKED]);
96 : : }
97 : : /* LCOV_EXCL_STOP */
98 : :
99 : : /*
100 : : * GObject
101 : : */
102 : : static void
103 : 4 : valent_session_adapter_get_property (GObject *object,
104 : : guint prop_id,
105 : : GValue *value,
106 : : GParamSpec *pspec)
107 : : {
108 : 4 : ValentSessionAdapter *self = VALENT_SESSION_ADAPTER (object);
109 : :
110 [ + + - ]: 4 : switch (prop_id)
111 : : {
112 : 2 : case PROP_ACTIVE:
113 : 2 : g_value_set_boolean (value, valent_session_adapter_get_active (self));
114 : 2 : break;
115 : :
116 : 2 : case PROP_LOCKED:
117 : 2 : g_value_set_boolean (value, valent_session_adapter_get_locked (self));
118 : 2 : break;
119 : :
120 : 0 : default:
121 : 0 : G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
122 : : }
123 : 4 : }
124 : :
125 : : static void
126 : 1 : valent_session_adapter_set_property (GObject *object,
127 : : guint prop_id,
128 : : const GValue *value,
129 : : GParamSpec *pspec)
130 : : {
131 : 1 : ValentSessionAdapter *self = VALENT_SESSION_ADAPTER (object);
132 : :
133 [ + - ]: 1 : switch (prop_id)
134 : : {
135 : 1 : case PROP_LOCKED:
136 : 1 : valent_session_adapter_set_locked (self, g_value_get_boolean (value));
137 : 1 : break;
138 : :
139 : 0 : default:
140 : 0 : G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
141 : : }
142 : 1 : }
143 : :
144 : : static void
145 : 66 : valent_session_adapter_class_init (ValentSessionAdapterClass *klass)
146 : : {
147 : 66 : GObjectClass *object_class = G_OBJECT_CLASS (klass);
148 : :
149 : 66 : object_class->get_property = valent_session_adapter_get_property;
150 : 66 : object_class->set_property = valent_session_adapter_set_property;
151 : :
152 : 66 : klass->get_active = valent_session_adapter_real_get_active;
153 : 66 : klass->get_locked = valent_session_adapter_real_get_locked;
154 : 66 : klass->set_locked = valent_session_adapter_real_set_locked;
155 : :
156 : : /**
157 : : * ValentSessionAdapter:active: (getter get_active)
158 : : *
159 : : * Whether the session is active.
160 : : *
161 : : * Since: 1.0
162 : : */
163 : 132 : properties [PROP_ACTIVE] =
164 : 66 : g_param_spec_boolean ("active", NULL, NULL,
165 : : FALSE,
166 : : (G_PARAM_READABLE |
167 : : G_PARAM_EXPLICIT_NOTIFY |
168 : : G_PARAM_STATIC_STRINGS));
169 : :
170 : : /**
171 : : * ValentSessionAdapter:locked: (getter get_locked) (setter set_locked)
172 : : *
173 : : * Whether the session is locked.
174 : : *
175 : : * Since: 1.0
176 : : */
177 : 132 : properties [PROP_LOCKED] =
178 : 66 : g_param_spec_boolean ("locked", NULL, NULL,
179 : : FALSE,
180 : : (G_PARAM_READWRITE |
181 : : G_PARAM_EXPLICIT_NOTIFY |
182 : : G_PARAM_STATIC_STRINGS));
183 : :
184 : 66 : g_object_class_install_properties (object_class, N_PROPERTIES, properties);
185 : 66 : }
186 : :
187 : : static void
188 : 6 : valent_session_adapter_init (ValentSessionAdapter *adapter)
189 : : {
190 : 6 : }
191 : :
192 : : /**
193 : : * valent_session_adapter_get_active: (virtual get_active) (get-property active)
194 : : * @adapter: a `ValentSessionAdapter`
195 : : *
196 : : * Get whether the session is active.
197 : : *
198 : : * Returns: %TRUE if active, %FALSE if idle
199 : : *
200 : : * Since: 1.0
201 : : */
202 : : gboolean
203 : 7 : valent_session_adapter_get_active (ValentSessionAdapter *adapter)
204 : : {
205 : 7 : gboolean ret;
206 : :
207 : 7 : VALENT_ENTRY;
208 : :
209 [ + - ]: 7 : g_return_val_if_fail (VALENT_IS_SESSION_ADAPTER (adapter), FALSE);
210 : :
211 : 7 : ret = VALENT_SESSION_ADAPTER_GET_CLASS (adapter)->get_active (adapter);
212 : :
213 : 7 : VALENT_RETURN (ret);
214 : : }
215 : :
216 : : /**
217 : : * valent_session_adapter_get_locked: (virtual get_locked) (get-property locked)
218 : : * @adapter: a `ValentSessionAdapter`
219 : : *
220 : : * Get whether the session is locked.
221 : : *
222 : : * Returns: %TRUE if locked, %FALSE if unlocked
223 : : *
224 : : * Since: 1.0
225 : : */
226 : : gboolean
227 : 13 : valent_session_adapter_get_locked (ValentSessionAdapter *adapter)
228 : : {
229 : 13 : gboolean ret;
230 : :
231 : 13 : VALENT_ENTRY;
232 : :
233 [ + - ]: 13 : g_return_val_if_fail (VALENT_IS_SESSION_ADAPTER (adapter), FALSE);
234 : :
235 : 13 : ret = VALENT_SESSION_ADAPTER_GET_CLASS (adapter)->get_locked (adapter);
236 : :
237 : 13 : VALENT_RETURN (ret);
238 : : }
239 : :
240 : : /**
241 : : * valent_session_adapter_set_locked: (virtual set_locked) (set-property locked)
242 : : * @adapter: a `ValentSessionAdapter`
243 : : * @state: %TRUE to lock, %FALSE to unlock
244 : : *
245 : : * Set whether the session is locked.
246 : : *
247 : : * Since: 1.0
248 : : */
249 : : void
250 : 5 : valent_session_adapter_set_locked (ValentSessionAdapter *adapter,
251 : : gboolean state)
252 : : {
253 : 5 : VALENT_ENTRY;
254 : :
255 [ + - ]: 5 : g_return_if_fail (VALENT_IS_SESSION_ADAPTER (adapter));
256 : :
257 : 5 : VALENT_SESSION_ADAPTER_GET_CLASS (adapter)->set_locked (adapter, state);
258 : :
259 : 5 : VALENT_EXIT;
260 : : }
261 : :
|