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"
5 : :
6 : : #include "config.h"
7 : :
8 : : #include <gio/gio.h>
9 : : #include <libpeas.h>
10 : : #include <libvalent-core.h>
11 : :
12 : : #include "valent-session.h"
13 : : #include "valent-session-adapter.h"
14 : :
15 : :
16 : : /**
17 : : * ValentSession:
18 : : *
19 : : * A class for monitoring the session state.
20 : : *
21 : : * `ValentSession` is an abstraction of session managers, intended for use by
22 : : * [class@Valent.DevicePlugin] implementations.
23 : : *
24 : : * Plugins can implement [class@Valent.SessionAdapter] to provide an interface
25 : : * to monitor and control the session state.
26 : : *
27 : : * Since: 1.0
28 : : */
29 : : struct _ValentSession
30 : : {
31 : : ValentComponent parent_instance;
32 : :
33 : : ValentSessionAdapter *default_adapter;
34 : : };
35 : :
36 [ + + + - ]: 175 : G_DEFINE_FINAL_TYPE (ValentSession, valent_session, VALENT_TYPE_COMPONENT)
37 : :
38 : : enum {
39 : : PROP_0,
40 : : PROP_ACTIVE,
41 : : PROP_LOCKED,
42 : : N_PROPERTIES
43 : : };
44 : :
45 : : static GParamSpec *properties[N_PROPERTIES] = { NULL, };
46 : :
47 : : static void
48 : 9 : on_active_changed (ValentSessionAdapter *adapter,
49 : : GParamSpec *pspec,
50 : : ValentSession *self)
51 : : {
52 : 9 : VALENT_ENTRY;
53 : :
54 [ + - ]: 2 : if (self->default_adapter == adapter)
55 : 2 : g_object_notify_by_pspec (G_OBJECT (self), properties [PROP_ACTIVE]);
56 : :
57 : 9 : VALENT_EXIT;
58 : : }
59 : :
60 : : static void
61 : 13 : on_locked_changed (ValentSessionAdapter *adapter,
62 : : GParamSpec *pspec,
63 : : ValentSession *self)
64 : : {
65 : 13 : VALENT_ENTRY;
66 : :
67 [ + - ]: 6 : if (self->default_adapter == adapter)
68 : 6 : g_object_notify_by_pspec (G_OBJECT (self), properties [PROP_LOCKED]);
69 : :
70 : 13 : VALENT_EXIT;
71 : : }
72 : :
73 : : /*
74 : : * ValentComponent
75 : : */
76 : : static void
77 : 11 : valent_session_bind_preferred (ValentComponent *component,
78 : : GObject *extension)
79 : : {
80 : 11 : ValentSession *self = VALENT_SESSION (component);
81 : 11 : ValentSessionAdapter *adapter = VALENT_SESSION_ADAPTER (extension);
82 : :
83 : 11 : VALENT_ENTRY;
84 : :
85 [ + - ]: 11 : g_assert (VALENT_IS_SESSION (self));
86 [ + + - + ]: 11 : g_assert (adapter == NULL || VALENT_IS_SESSION_ADAPTER (adapter));
87 : :
88 [ + + ]: 11 : if (self->default_adapter != NULL)
89 : : {
90 : 4 : g_signal_handlers_disconnect_by_func (self->default_adapter,
91 : : self,
92 : : on_active_changed);
93 : 4 : g_signal_handlers_disconnect_by_func (self->default_adapter,
94 : : self,
95 : : on_locked_changed);
96 : 4 : self->default_adapter = NULL;
97 : : }
98 : :
99 [ + + ]: 11 : if (adapter != NULL)
100 : : {
101 : 7 : self->default_adapter = adapter;
102 : 7 : g_signal_connect_object (self->default_adapter,
103 : : "notify::active",
104 : : G_CALLBACK (on_active_changed),
105 : : self,
106 : : G_CONNECT_DEFAULT);
107 : 7 : on_active_changed (self->default_adapter, NULL, self);
108 : 7 : g_signal_connect_object (self->default_adapter,
109 : : "notify::locked",
110 : : G_CALLBACK (on_locked_changed),
111 : : self,
112 : : G_CONNECT_DEFAULT);
113 : 7 : on_locked_changed (self->default_adapter, NULL, self);
114 : : }
115 : :
116 : 11 : VALENT_EXIT;
117 : : }
118 : :
119 : : /*
120 : : * GObject
121 : : */
122 : : static void
123 : 2 : valent_session_get_property (GObject *object,
124 : : guint prop_id,
125 : : GValue *value,
126 : : GParamSpec *pspec)
127 : : {
128 : 2 : ValentSession *self = VALENT_SESSION (object);
129 : :
130 [ + + - ]: 2 : switch (prop_id)
131 : : {
132 : 1 : case PROP_ACTIVE:
133 : 1 : g_value_set_boolean (value, valent_session_get_active (self));
134 : 1 : break;
135 : :
136 : 1 : case PROP_LOCKED:
137 : 1 : g_value_set_boolean (value, valent_session_get_locked (self));
138 : 1 : break;
139 : :
140 : 0 : default:
141 : 0 : G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
142 : : }
143 : 2 : }
144 : :
145 : : static void
146 : 1 : valent_session_set_property (GObject *object,
147 : : guint prop_id,
148 : : const GValue *value,
149 : : GParamSpec *pspec)
150 : : {
151 : 1 : ValentSession *self = VALENT_SESSION (object);
152 : :
153 [ + - ]: 1 : switch (prop_id)
154 : : {
155 : 1 : case PROP_LOCKED:
156 : 1 : valent_session_set_locked (self, g_value_get_boolean (value));
157 : 1 : break;
158 : :
159 : 0 : default:
160 : 0 : G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
161 : : }
162 : 1 : }
163 : :
164 : : static void
165 : 6 : valent_session_class_init (ValentSessionClass *klass)
166 : : {
167 : 6 : GObjectClass *object_class = G_OBJECT_CLASS (klass);
168 : 6 : ValentComponentClass *component_class = VALENT_COMPONENT_CLASS (klass);
169 : :
170 : 6 : object_class->get_property = valent_session_get_property;
171 : 6 : object_class->set_property = valent_session_set_property;
172 : :
173 : 6 : component_class->bind_preferred = valent_session_bind_preferred;
174 : :
175 : : /**
176 : : * ValentSession:active: (getter get_active)
177 : : *
178 : : * Whether the session is active.
179 : : *
180 : : * Since: 1.0
181 : : */
182 : 12 : properties [PROP_ACTIVE] =
183 : 6 : g_param_spec_boolean ("active", NULL, NULL,
184 : : FALSE,
185 : : (G_PARAM_READABLE |
186 : : G_PARAM_EXPLICIT_NOTIFY |
187 : : G_PARAM_STATIC_STRINGS));
188 : :
189 : : /**
190 : : * ValentSession:locked: (getter get_locked) (setter set_locked)
191 : : *
192 : : * Whether the session is locked.
193 : : *
194 : : * Since: 1.0
195 : : */
196 : 12 : properties [PROP_LOCKED] =
197 : 6 : g_param_spec_boolean ("locked", NULL, NULL,
198 : : FALSE,
199 : : (G_PARAM_READWRITE |
200 : : G_PARAM_EXPLICIT_NOTIFY |
201 : : G_PARAM_STATIC_STRINGS));
202 : :
203 : 6 : g_object_class_install_properties (object_class, N_PROPERTIES, properties);
204 : 6 : }
205 : :
206 : : static void
207 : 6 : valent_session_init (ValentSession *self)
208 : : {
209 : 6 : }
210 : :
211 : : /**
212 : : * valent_session_get_default:
213 : : *
214 : : * Get the default [class@Valent.Session].
215 : : *
216 : : * Returns: (transfer none) (nullable): a `ValentSession`
217 : : *
218 : : * Since: 1.0
219 : : */
220 : : ValentSession *
221 : 13 : valent_session_get_default (void)
222 : : {
223 : 13 : static ValentSession *default_instance = NULL;
224 : :
225 [ + + ]: 13 : if (default_instance == NULL)
226 : : {
227 : 6 : default_instance = g_object_new (VALENT_TYPE_SESSION,
228 : : "plugin-domain", "session",
229 : : "plugin-type", VALENT_TYPE_SESSION_ADAPTER,
230 : : NULL);
231 : 6 : g_object_add_weak_pointer (G_OBJECT (default_instance),
232 : : (gpointer)&default_instance);
233 : : }
234 : :
235 : 13 : return default_instance;
236 : : }
237 : :
238 : : /**
239 : : * valent_session_get_active: (get-property active)
240 : : * @session: a `ValentSession`
241 : : *
242 : : * Get the active state of the primary [class@Valent.SessionAdapter].
243 : : *
244 : : * Returns: %TRUE if the session is active, or %FALSE if not
245 : : *
246 : : * Since: 1.0
247 : : */
248 : : gboolean
249 : 4 : valent_session_get_active (ValentSession *session)
250 : : {
251 : 4 : gboolean ret = FALSE;
252 : :
253 : 4 : VALENT_ENTRY;
254 : :
255 [ + - ]: 4 : g_return_val_if_fail (VALENT_IS_SESSION (session), FALSE);
256 : :
257 [ - + ]: 4 : if G_LIKELY (session->default_adapter != NULL)
258 : 4 : ret = valent_session_adapter_get_active (session->default_adapter);
259 : :
260 : 4 : VALENT_RETURN (ret);
261 : : }
262 : :
263 : : /**
264 : : * valent_session_get_locked: (get-property locked)
265 : : * @session: a `ValentSession`
266 : : *
267 : : * Get the locked state of the primary [class@Valent.SessionAdapter].
268 : : *
269 : : * Returns: %TRUE if the session is locked, or %FALSE if unlocked
270 : : *
271 : : * Since: 1.0
272 : : */
273 : : gboolean
274 : 8 : valent_session_get_locked (ValentSession *session)
275 : : {
276 : 8 : gboolean ret = FALSE;
277 : :
278 : 8 : VALENT_ENTRY;
279 : :
280 [ + - ]: 8 : g_return_val_if_fail (VALENT_IS_SESSION (session), FALSE);
281 : :
282 [ - + ]: 8 : if G_LIKELY (session->default_adapter != NULL)
283 : 8 : ret = valent_session_adapter_get_locked (session->default_adapter);
284 : :
285 : 8 : VALENT_RETURN (ret);
286 : : }
287 : :
288 : : /**
289 : : * valent_session_set_locked: (set-property locked)
290 : : * @session: a `ValentSession`
291 : : * @state: %TRUE to lock, or %FALSE to unlock
292 : : *
293 : : * Set the locked state of the primary [class@Valent.SessionAdapter].
294 : : *
295 : : * Since: 1.0
296 : : */
297 : : void
298 : 4 : valent_session_set_locked (ValentSession *session,
299 : : gboolean state)
300 : : {
301 : 4 : VALENT_ENTRY;
302 : :
303 [ + - ]: 4 : g_return_if_fail (VALENT_IS_SESSION (session));
304 : :
305 [ + - ]: 4 : if G_LIKELY (session->default_adapter != NULL)
306 : 4 : valent_session_adapter_set_locked (session->default_adapter, state);
307 : :
308 : 4 : VALENT_EXIT;
309 : : }
310 : :
|