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-xdp-session"
5 : :
6 : : #include "config.h"
7 : :
8 : : #include <libportal/portal.h>
9 : : #include <valent.h>
10 : :
11 : : #include "valent-xdp-session.h"
12 : : #include "valent-xdp-utils.h"
13 : :
14 : :
15 : : struct _ValentXdpSession
16 : : {
17 : : ValentSessionAdapter parent_instance;
18 : :
19 : : unsigned int active : 1;
20 : : unsigned int locked : 1;
21 : : };
22 : :
23 : : static void g_async_initable_iface_init (GAsyncInitableIface *iface);
24 : :
25 : 0 : G_DEFINE_FINAL_TYPE_WITH_CODE (ValentXdpSession, valent_xdp_session, VALENT_TYPE_SESSION_ADAPTER,
26 : : G_IMPLEMENT_INTERFACE (G_TYPE_ASYNC_INITABLE, g_async_initable_iface_init))
27 : :
28 : :
29 : : static void
30 : 0 : on_session_state_changed (XdpPortal *portal,
31 : : gboolean screensaver_active,
32 : : XdpLoginSessionState state,
33 : : ValentXdpSession *self)
34 : : {
35 : 0 : g_assert (VALENT_IS_XDP_SESSION (self));
36 : :
37 : 0 : if (self->active != (state == XDP_LOGIN_SESSION_RUNNING))
38 : : {
39 : 0 : self->active = (state == XDP_LOGIN_SESSION_RUNNING);
40 : 0 : g_object_notify (G_OBJECT (self), "active");
41 : : }
42 : :
43 : 0 : if (self->locked != screensaver_active)
44 : : {
45 : 0 : self->locked = screensaver_active;
46 : 0 : g_object_notify (G_OBJECT (self), "locked");
47 : : }
48 : :
49 : 0 : xdp_portal_session_monitor_query_end_response (portal);
50 : 0 : }
51 : :
52 : : /*
53 : : * ValentSessionAdapter
54 : : */
55 : : static gboolean
56 : 0 : valent_xdp_session_get_active (ValentSessionAdapter *adapter)
57 : : {
58 : 0 : ValentXdpSession *self = VALENT_XDP_SESSION (adapter);
59 : :
60 : 0 : return self->active;
61 : : }
62 : :
63 : : static gboolean
64 : 0 : valent_xdp_session_get_locked (ValentSessionAdapter *adapter)
65 : : {
66 : 0 : ValentXdpSession *self = VALENT_XDP_SESSION (adapter);
67 : :
68 : 0 : return self->locked;
69 : : }
70 : :
71 : : /*
72 : : * GAsyncInitable
73 : : */
74 : : static void
75 : 0 : xdp_portal_session_monitor_start_cb (GObject *object,
76 : : GAsyncResult *result,
77 : : gpointer user_data)
78 : : {
79 : 0 : XdpPortal *portal = XDP_PORTAL (object);
80 : 0 : g_autoptr (GTask) task = G_TASK (user_data);
81 : 0 : ValentXdpSession *self = g_task_get_source_object (task);
82 : 0 : g_autoptr (GError) error = NULL;
83 : :
84 : 0 : g_assert (G_IS_TASK (task));
85 : 0 : g_assert (VALENT_IS_XDP_SESSION (self));
86 : :
87 : 0 : if (!xdp_portal_session_monitor_start_finish (portal, result, &error))
88 : : {
89 : 0 : valent_extension_plugin_state_changed (VALENT_EXTENSION (self),
90 : : VALENT_PLUGIN_STATE_ERROR,
91 : : error);
92 : 0 : return g_task_return_error (task, g_steal_pointer (&error));
93 : : }
94 : :
95 : 0 : g_signal_connect_object (portal,
96 : : "session-state-changed",
97 : : G_CALLBACK (on_session_state_changed),
98 : : self, 0);
99 : :
100 : : /* Report the adapter as active */
101 : 0 : valent_extension_plugin_state_changed (VALENT_EXTENSION (self),
102 : : VALENT_PLUGIN_STATE_ACTIVE,
103 : : NULL);
104 : 0 : g_task_return_boolean (task, TRUE);
105 : : }
106 : :
107 : : static void
108 : 0 : valent_xdp_session_init_async (GAsyncInitable *initable,
109 : : int io_priority,
110 : : GCancellable *cancellable,
111 : : GAsyncReadyCallback callback,
112 : : gpointer user_data)
113 : : {
114 : 0 : g_autoptr (GTask) task = NULL;
115 : 0 : g_autoptr (GCancellable) destroy = NULL;
116 : 0 : g_autoptr (XdpParent) parent = NULL;
117 : :
118 : 0 : g_assert (VALENT_IS_XDP_SESSION (initable));
119 : :
120 : : /* Cancel initialization if the object is destroyed */
121 : 0 : destroy = valent_object_chain_cancellable (VALENT_OBJECT (initable),
122 : : cancellable);
123 : :
124 : 0 : task = g_task_new (initable, destroy, callback, user_data);
125 : 0 : g_task_set_priority (task, io_priority);
126 : 0 : g_task_set_source_tag (task, valent_xdp_session_init_async);
127 : :
128 : 0 : parent = valent_xdp_get_parent ();
129 : 0 : xdp_portal_session_monitor_start (valent_xdp_get_default (),
130 : : parent,
131 : : XDP_SESSION_MONITOR_FLAG_NONE,
132 : : destroy,
133 : : xdp_portal_session_monitor_start_cb,
134 : : g_steal_pointer (&task));
135 : 0 : }
136 : :
137 : : static void
138 : 0 : g_async_initable_iface_init (GAsyncInitableIface *iface)
139 : : {
140 : 0 : iface->init_async = valent_xdp_session_init_async;
141 : 0 : }
142 : :
143 : : /*
144 : : * ValentObject
145 : : */
146 : : static void
147 : 0 : valent_xdp_session_destroy (ValentObject *object)
148 : : {
149 : 0 : ValentXdpSession *self = VALENT_XDP_SESSION (object);
150 : 0 : XdpPortal *portal = valent_xdp_get_default ();
151 : :
152 : 0 : g_signal_handlers_disconnect_by_data (portal, self);
153 : 0 : xdp_portal_session_monitor_stop (portal);
154 : :
155 : 0 : VALENT_OBJECT_CLASS (valent_xdp_session_parent_class)->destroy (object);
156 : 0 : }
157 : :
158 : : /*
159 : : * GObject
160 : : */
161 : : static void
162 : 0 : valent_xdp_session_class_init (ValentXdpSessionClass *klass)
163 : : {
164 : 0 : ValentObjectClass *vobject_class = VALENT_OBJECT_CLASS (klass);
165 : 0 : ValentSessionAdapterClass *session_class = VALENT_SESSION_ADAPTER_CLASS (klass);
166 : :
167 : 0 : vobject_class->destroy = valent_xdp_session_destroy;
168 : :
169 : 0 : session_class->get_active = valent_xdp_session_get_active;
170 : 0 : session_class->get_locked = valent_xdp_session_get_locked;
171 : : }
172 : :
173 : : static void
174 : 0 : valent_xdp_session_init (ValentXdpSession *self)
175 : : {
176 : 0 : }
177 : :
|