GCC Code Coverage Report


Directory: ./
File: panels/privacy/screen/cc-screen-page.c
Date: 2024-05-04 07:58:27
Exec Total Coverage
Lines: 0 156 0.0%
Functions: 0 15 0.0%
Branches: 0 57 0.0%

Line Branch Exec Source
1 /* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*-
2 *
3 * Copyright (C) 2018 Red Hat, Inc
4 * Copyright (C) 2020 Collabora Ltd.
5 * Copyright (C) 2021-2022 Canonical Ltd.
6 *
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation; either version 2 of the License, or
10 * (at your option) any later version.
11 *
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with this program; if not, see <http://www.gnu.org/licenses/>.
19 *
20 * Author: Matthias Clasen <mclasen@redhat.com>
21 */
22
23 #include "cc-screen-page.h"
24 #include "cc-screen-page-enums.h"
25 #include "cc-util.h"
26
27 #include "panels/display/cc-display-config-manager-dbus.h"
28
29 #include <gio/gdesktopappinfo.h>
30 #include <glib/gi18n.h>
31
32 struct _CcScreenPage
33 {
34 AdwNavigationPage parent_instance;
35
36 CcDisplayConfigManager *display_config_manager;
37
38 GSettings *lock_settings;
39 GSettings *notification_settings;
40 GSettings *privacy_settings;
41 GSettings *session_settings;
42
43 GCancellable *cancellable;
44
45 AdwComboRow *blank_screen_row;
46 AdwComboRow *lock_after_row;
47 AdwPreferencesGroup *screen_privacy_group;
48 GDBusProxy *usb_proxy;
49 AdwSwitchRow *automatic_screen_lock_row;
50 AdwSwitchRow *privacy_screen_row;
51 AdwSwitchRow *show_notifications_row;
52 AdwSwitchRow *usb_protection_row;
53 };
54
55 G_DEFINE_TYPE (CcScreenPage, cc_screen_page, ADW_TYPE_NAVIGATION_PAGE)
56
57 static char *
58 lock_after_name_cb (AdwEnumListItem *item,
59 gpointer user_data)
60 {
61
62 switch (adw_enum_list_item_get_value (item))
63 {
64 case CC_SCREEN_PAGE_LOCK_AFTER_SCREEN_OFF:
65 /* Translators: Option for "Lock screen after blank" in "Screen Lock" page */
66 return g_strdup(C_("lock_screen", "Screen Turns Off"));
67 case CC_SCREEN_PAGE_LOCK_AFTER_30_SEC:
68 /* Translators: Option for "Lock screen after blank" in "Screen Lock" page */
69 return g_strdup (C_("lock_screen", "30 seconds"));
70 case CC_SCREEN_PAGE_LOCK_AFTER_1_MIN:
71 /* Translators: Option for "Lock screen after blank" in "Screen Lock" page */
72 return g_strdup (C_("lock_screen", "1 minute"));
73 case CC_SCREEN_PAGE_LOCK_AFTER_2_MIN:
74 /* Translators: Option for "Lock screen after blank" in "Screen Lock" page */
75 return g_strdup (C_("lock_screen", "2 minutes"));
76 case CC_SCREEN_PAGE_LOCK_AFTER_3_MIN:
77 /* Translators: Option for "Lock screen after blank" in "Screen Lock" page */
78 return g_strdup (C_("lock_screen", "3 minutes"));
79 case CC_SCREEN_PAGE_LOCK_AFTER_5_MIN:
80 /* Translators: Option for "Lock screen after blank" in "Screen Lock" page */
81 return g_strdup (C_("lock_screen", "5 minutes"));
82 case CC_SCREEN_PAGE_LOCK_AFTER_30_MIN:
83 /* Translators: Option for "Lock screen after blank" in "Screen Lock" page */
84 return g_strdup (C_("lock_screen", "30 minutes"));
85 case CC_SCREEN_PAGE_LOCK_AFTER_1_HR:
86 /* Translators: Option for "Lock screen after blank" in "Screen Lock" page */
87 return g_strdup (C_("lock_screen", "1 hour"));
88 default:
89 return NULL;
90 }
91 }
92
93 static void
94 on_lock_combo_changed_cb (AdwComboRow *combo_row,
95 GParamSpec *pspec,
96 CcScreenPage *self)
97 {
98 AdwEnumListItem *item;
99 CcScreenPageLockAfter delay;
100
101 item = ADW_ENUM_LIST_ITEM (adw_combo_row_get_selected_item (combo_row));
102 delay = adw_enum_list_item_get_value (item);
103
104 g_settings_set (self->lock_settings, "lock-delay", "u", delay);
105 }
106
107 static void
108 set_lock_value_for_combo (AdwComboRow *combo_row,
109 CcScreenPage *self)
110 {
111 AdwEnumListModel *model;
112 guint value;
113
114 model = ADW_ENUM_LIST_MODEL (adw_combo_row_get_model (combo_row));
115
116 g_settings_get (self->lock_settings, "lock-delay", "u", &value);
117 adw_combo_row_set_selected (combo_row,
118 adw_enum_list_model_find_position (model, value));
119 }
120
121 static char *
122 screen_delay_name_cb (AdwEnumListItem *item,
123 gpointer user_data)
124 {
125
126 switch (adw_enum_list_item_get_value (item))
127 {
128 case CC_SCREEN_PAGE_BLANK_SCREEN_DELAY_1_MIN:
129 /* Translators: Option for "Blank screen" in "Screen Lock" page */
130 return g_strdup (C_("blank_screen", "1 minute"));
131 case CC_SCREEN_PAGE_BLANK_SCREEN_DELAY_2_MIN:
132 /* Translators: Option for "Blank screen" in "Screen Lock" page */
133 return g_strdup (C_("blank_screen", "2 minutes"));
134 case CC_SCREEN_PAGE_BLANK_SCREEN_DELAY_3_MIN:
135 /* Translators: Option for "Blank screen" in "Screen Lock" page */
136 return g_strdup (C_("blank_screen", "3 minutes"));
137 case CC_SCREEN_PAGE_BLANK_SCREEN_DELAY_4_MIN:
138 /* Translators: Option for "Blank screen" in "Screen Lock" page */
139 return g_strdup (C_("blank_screen", "4 minutes"));
140 case CC_SCREEN_PAGE_BLANK_SCREEN_DELAY_5_MIN:
141 /* Translators: Option for "Blank screen" in "Screen Lock" page */
142 return g_strdup (C_("blank_screen", "5 minutes"));
143 case CC_SCREEN_PAGE_BLANK_SCREEN_DELAY_8_MIN:
144 /* Translators: Option for "Blank screen" in "Screen Lock" page */
145 return g_strdup (C_("blank_screen", "8 minutes"));
146 case CC_SCREEN_PAGE_BLANK_SCREEN_DELAY_10_MIN:
147 /* Translators: Option for "Blank screen" in "Screen Lock" page */
148 return g_strdup (C_("blank_screen", "10 minutes"));
149 case CC_SCREEN_PAGE_BLANK_SCREEN_DELAY_12_MIN:
150 /* Translators: Option for "Blank screen" in "Screen Lock" page */
151 return g_strdup (C_("blank_screen", "12 minutes"));
152 case CC_SCREEN_PAGE_BLANK_SCREEN_DELAY_15_MIN:
153 /* Translators: Option for "Blank screen" in "Screen Lock" page */
154 return g_strdup (C_("blank_screen", "15 minutes"));
155 case CC_SCREEN_PAGE_BLANK_SCREEN_DELAY_NEVER:
156 /* Translators: Option for "Blank screen" in "Screen Lock" page */
157 return g_strdup (C_("blank_screen", "Never"));
158 default:
159 return NULL;
160 }
161 }
162
163 static void
164 set_blank_screen_delay_value (CcScreenPage *self,
165 gint value)
166 {
167 AdwEnumListModel *model;
168
169 model = ADW_ENUM_LIST_MODEL (adw_combo_row_get_model (self->blank_screen_row));
170
171 adw_combo_row_set_selected (self->blank_screen_row,
172 adw_enum_list_model_find_position (model, value));
173 }
174
175 static void
176 on_blank_screen_delay_changed_cb (AdwComboRow *combo_row,
177 GParamSpec *pspec,
178 CcScreenPage *self)
179 {
180 AdwEnumListItem *item;
181 CcScreenPageBlankScreenDelay delay;
182
183 item = ADW_ENUM_LIST_ITEM (adw_combo_row_get_selected_item (combo_row));
184 delay = adw_enum_list_item_get_value (item);
185
186 g_settings_set_uint (self->session_settings, "idle-delay", delay);
187 }
188
189 static void
190 on_usb_protection_properties_changed_cb (GDBusProxy *usb_proxy,
191 GVariant *changed_properties,
192 GStrv invalidated_properties,
193 CcScreenPage *self)
194 {
195 gboolean available = FALSE;
196
197 if (self->usb_proxy)
198 {
199 g_autoptr(GVariant) variant = NULL;
200
201 variant = g_dbus_proxy_get_cached_property (self->usb_proxy, "Available");
202 if (variant != NULL)
203 available = g_variant_get_boolean (variant);
204 }
205
206 /* Show the USB protection row only if the required daemon is up and running */
207 gtk_widget_set_visible (GTK_WIDGET (self->usb_protection_row), available);
208 }
209
210 static void
211 on_usb_protection_param_ready (GObject *source_object,
212 GAsyncResult *res,
213 gpointer user_data)
214 {
215 g_autoptr(GError) error = NULL;
216 CcScreenPage *self;
217 GDBusProxy *proxy;
218
219 self = user_data;
220 proxy = g_dbus_proxy_new_for_bus_finish (res, &error);
221 if (error)
222 {
223 if (!g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED))
224 {
225 g_warning ("Failed to connect to SettingsDaemon.UsbProtection: %s",
226 error->message);
227 }
228
229 gtk_widget_set_visible (GTK_WIDGET (self->usb_protection_row), FALSE);
230 return;
231 }
232 self->usb_proxy = proxy;
233
234 g_signal_connect_object (self->usb_proxy,
235 "g-properties-changed",
236 G_CALLBACK (on_usb_protection_properties_changed_cb),
237 self,
238 0);
239 on_usb_protection_properties_changed_cb (self->usb_proxy, NULL, NULL, self);
240 }
241
242 static void
243 cc_screen_page_finalize (GObject *object)
244 {
245 CcScreenPage *self = CC_SCREEN_PAGE (object);
246
247 g_cancellable_cancel (self->cancellable);
248 g_clear_object (&self->cancellable);
249 g_clear_object (&self->display_config_manager);
250 g_clear_object (&self->lock_settings);
251 g_clear_object (&self->notification_settings);
252 g_clear_object (&self->session_settings);
253 g_clear_object (&self->usb_proxy);
254
255 G_OBJECT_CLASS (cc_screen_page_parent_class)->finalize (object);
256 }
257
258 static void
259 cc_screen_page_class_init (CcScreenPageClass *klass)
260 {
261 GObjectClass *oclass = G_OBJECT_CLASS (klass);
262 GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
263
264 oclass->finalize = cc_screen_page_finalize;
265
266 g_type_ensure (CC_TYPE_SCREEN_PAGE_LOCK_AFTER);
267 g_type_ensure (CC_TYPE_SCREEN_PAGE_BLANK_SCREEN_DELAY);
268 gtk_widget_class_set_template_from_resource (widget_class, "/org/gnome/control-center/privacy/screen/cc-screen-page.ui");
269
270 gtk_widget_class_bind_template_child (widget_class, CcScreenPage, automatic_screen_lock_row);
271 gtk_widget_class_bind_template_child (widget_class, CcScreenPage, blank_screen_row);
272 gtk_widget_class_bind_template_child (widget_class, CcScreenPage, lock_after_row);
273 gtk_widget_class_bind_template_child (widget_class, CcScreenPage, privacy_screen_row);
274 gtk_widget_class_bind_template_child (widget_class, CcScreenPage, screen_privacy_group);
275 gtk_widget_class_bind_template_child (widget_class, CcScreenPage, show_notifications_row);
276 gtk_widget_class_bind_template_child (widget_class, CcScreenPage, usb_protection_row);
277
278 gtk_widget_class_bind_template_callback (widget_class, lock_after_name_cb);
279 gtk_widget_class_bind_template_callback (widget_class, on_blank_screen_delay_changed_cb);
280 gtk_widget_class_bind_template_callback (widget_class, on_lock_combo_changed_cb);
281 gtk_widget_class_bind_template_callback (widget_class, screen_delay_name_cb);
282 }
283
284 static void
285 update_display_config (CcScreenPage *self)
286 {
287 g_autoptr (CcDisplayConfig) config = NULL;
288 gboolean any_privacy_screen = FALSE;
289 gboolean any_configurable_privacy_screen = FALSE;
290 GList *monitors;
291 GList *l;
292
293 config = cc_display_config_manager_get_current (self->display_config_manager);
294 monitors = config ? cc_display_config_get_monitors (config) : NULL;
295
296 for (l = monitors; l; l = l->next)
297 {
298 CcDisplayMonitor *monitor = CC_DISPLAY_MONITOR (l->data);
299 CcDisplayMonitorPrivacy privacy = cc_display_monitor_get_privacy (monitor);
300
301 if (privacy != CC_DISPLAY_MONITOR_PRIVACY_UNSUPPORTED)
302 {
303 any_privacy_screen = TRUE;
304
305 if (!(privacy & CC_DISPLAY_MONITOR_PRIVACY_LOCKED))
306 any_configurable_privacy_screen = TRUE;
307 }
308 }
309
310 gtk_widget_set_visible (GTK_WIDGET (self->screen_privacy_group),
311 any_privacy_screen);
312 gtk_widget_set_sensitive (GTK_WIDGET (self->privacy_screen_row),
313 any_configurable_privacy_screen);
314 }
315
316 static void
317 cc_screen_page_init (CcScreenPage *self)
318 {
319 guint value;
320
321 gtk_widget_init_template (GTK_WIDGET (self));
322
323 self->cancellable = g_cancellable_new ();
324
325 self->lock_settings = g_settings_new ("org.gnome.desktop.screensaver");
326 self->privacy_settings = g_settings_new ("org.gnome.desktop.privacy");
327 self->notification_settings = g_settings_new ("org.gnome.desktop.notifications");
328 self->session_settings = g_settings_new ("org.gnome.desktop.session");
329
330 g_settings_bind (self->lock_settings,
331 "lock-enabled",
332 self->automatic_screen_lock_row,
333 "active",
334 G_SETTINGS_BIND_DEFAULT);
335
336 g_settings_bind (self->lock_settings,
337 "lock-enabled",
338 self->lock_after_row,
339 "sensitive",
340 G_SETTINGS_BIND_GET);
341
342 set_lock_value_for_combo (self->lock_after_row, self);
343
344 g_settings_bind (self->notification_settings,
345 "show-in-lock-screen",
346 self->show_notifications_row,
347 "active",
348 G_SETTINGS_BIND_DEFAULT);
349
350 value = g_settings_get_uint (self->session_settings, "idle-delay");
351 set_blank_screen_delay_value (self, value);
352
353 g_settings_bind (self->privacy_settings,
354 "usb-protection",
355 self->usb_protection_row,
356 "active",
357 G_SETTINGS_BIND_DEFAULT);
358
359 self->display_config_manager = cc_display_config_manager_dbus_new ();
360 g_signal_connect_object (self->display_config_manager, "changed",
361 G_CALLBACK (update_display_config), self,
362 G_CONNECT_SWAPPED);
363
364 update_display_config (self);
365 g_settings_bind (self->privacy_settings,
366 "privacy-screen",
367 self->privacy_screen_row,
368 "active",
369 G_SETTINGS_BIND_DEFAULT);
370
371 g_dbus_proxy_new_for_bus (G_BUS_TYPE_SESSION,
372 G_DBUS_PROXY_FLAGS_NONE,
373 NULL,
374 "org.gnome.SettingsDaemon.UsbProtection",
375 "/org/gnome/SettingsDaemon/UsbProtection",
376 "org.gnome.SettingsDaemon.UsbProtection",
377 self->cancellable,
378 on_usb_protection_param_ready,
379 self);
380 }
381