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