GCC Code Coverage Report


Directory: ./
File: panels/privacy/usage/cc-usage-page.c
Date: 2024-05-04 07:58:27
Exec Total Coverage
Lines: 0 154 0.0%
Functions: 0 19 0.0%
Branches: 0 31 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 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, see <http://www.gnu.org/licenses/>.
17 *
18 * Author: Matthias Clasen <mclasen@redhat.com>
19 */
20
21 #include "cc-usage-page.h"
22 #include "cc-usage-page-enums.h"
23 #include "cc-util.h"
24
25 #include <gio/gdesktopappinfo.h>
26 #include <glib/gi18n.h>
27
28 struct _CcUsagePage
29 {
30 AdwNavigationPage parent_instance;
31
32 GSettings *privacy_settings;
33
34 AdwSwitchRow *recently_used_row;
35 AdwComboRow *retain_history_combo;
36
37 AdwSwitchRow *purge_trash_row;
38 AdwSwitchRow *purge_temp_row;
39 AdwComboRow *purge_after_combo;
40 GtkButton *purge_temp_button;
41 GtkButton *purge_trash_button;
42 };
43
44 G_DEFINE_TYPE (CcUsagePage, cc_usage_page, ADW_TYPE_NAVIGATION_PAGE)
45
46 static char *
47 purge_after_name_cb (AdwEnumListItem *item,
48 gpointer user_data)
49 {
50 switch (adw_enum_list_item_get_value (item))
51 {
52 case CC_USAGE_PAGE_PURGE_AFTER_1_HOUR:
53 /* Translators: Option for "Automatically Delete Period" in "Trash & Temporary Files" group */
54 return g_strdup (C_("purge_files", "1 hour"));
55 case CC_USAGE_PAGE_PURGE_AFTER_1_DAY:
56 /* Translators: Option for "Automatically Delete Period" in "Trash & Temporary Files" group */
57 return g_strdup (C_("purge_files", "1 day"));
58 case CC_USAGE_PAGE_PURGE_AFTER_2_DAYS:
59 /* Translators: Option for "Automatically Delete Period" in "Trash & Temporary Files" group */
60 return g_strdup (C_("purge_files", "2 days"));
61 case CC_USAGE_PAGE_PURGE_AFTER_3_DAYS:
62 /* Translators: Option for "Automatically Delete Period" in "Trash & Temporary Files" group */
63 return g_strdup (C_("purge_files", "3 days"));
64 case CC_USAGE_PAGE_PURGE_AFTER_4_DAYS:
65 /* Translators: Option for "Automatically Delete Period" in "Trash & Temporary Files" group */
66 return g_strdup (C_("purge_files", "4 days"));
67 case CC_USAGE_PAGE_PURGE_AFTER_5_DAYS:
68 /* Translators: Option for "Automatically Delete Period" in "Trash & Temporary Files" group */
69 return g_strdup (C_("purge_files", "5 days"));
70 case CC_USAGE_PAGE_PURGE_AFTER_6_DAYS:
71 /* Translators: Option for "Automatically Delete Period" in "Trash & Temporary Files" group */
72 return g_strdup (C_("purge_files", "6 days"));
73 case CC_USAGE_PAGE_PURGE_AFTER_7_DAYS:
74 /* Translators: Option for "Automatically Delete Period" in "Trash & Temporary Files" group */
75 return g_strdup (C_("purge_files", "7 days"));
76 case CC_USAGE_PAGE_PURGE_AFTER_14_DAYS:
77 /* Translators: Option for "Automatically Delete Period" in "Trash & Temporary Files" group */
78 return g_strdup (C_("purge_files", "14 days"));
79 case CC_USAGE_PAGE_PURGE_AFTER_30_DAYS:
80 /* Translators: Option for "Automatically Delete Period" in "Trash & Temporary Files" group */
81 return g_strdup (C_("purge_files", "30 days"));
82 default:
83 return NULL;
84 }
85 }
86
87 static void
88 purge_after_combo_changed_cb (AdwComboRow *combo_row,
89 GParamSpec *pspec,
90 CcUsagePage *self)
91 {
92 AdwEnumListItem *item;
93 CcUsagePagePurgeAfter value;
94
95 item = ADW_ENUM_LIST_ITEM (adw_combo_row_get_selected_item (combo_row));
96 value = adw_enum_list_item_get_value (item);
97
98 g_settings_set (self->privacy_settings, "old-files-age", "u", value);
99 }
100
101 static void
102 set_purge_after_value_for_combo (AdwComboRow *combo_row,
103 CcUsagePage *self)
104 {
105 AdwEnumListModel *model;
106 guint value;
107
108 model = ADW_ENUM_LIST_MODEL (adw_combo_row_get_model (combo_row));
109
110 g_settings_get (self->privacy_settings, "old-files-age", "u", &value);
111 adw_combo_row_set_selected (combo_row,
112 adw_enum_list_model_find_position (model, value));
113 }
114
115 static GtkDialog *
116 run_warning (CcUsagePage *self,
117 const gchar *prompt,
118 const gchar *text,
119 const gchar *button_title)
120 {
121 GtkWindow *parent = NULL;
122 GtkWidget *dialog;
123 GtkWidget *button;
124
125 parent = GTK_WINDOW (gtk_widget_get_root (GTK_WIDGET (self)));
126
127 dialog = gtk_message_dialog_new (parent,
128 GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT,
129 GTK_MESSAGE_WARNING,
130 GTK_BUTTONS_NONE,
131 NULL);
132 g_object_set (dialog,
133 "text", prompt,
134 "secondary-text", text,
135 NULL);
136 gtk_dialog_add_button (GTK_DIALOG (dialog), _("_Cancel"), GTK_RESPONSE_CANCEL);
137 gtk_dialog_add_button (GTK_DIALOG (dialog), button_title, GTK_RESPONSE_OK);
138
139 gtk_dialog_set_default_response (GTK_DIALOG (dialog), FALSE);
140
141 button = gtk_dialog_get_widget_for_response (GTK_DIALOG (dialog), GTK_RESPONSE_OK);
142 gtk_widget_add_css_class (button, "destructive-action");
143
144 gtk_window_present (GTK_WINDOW (dialog));
145
146 return GTK_DIALOG (dialog);
147 }
148
149 static void
150 on_empty_trash_warning_response_cb (GtkDialog *dialog,
151 gint response,
152 CcUsagePage *self)
153 {
154 g_autoptr(GDBusConnection) bus = NULL;
155
156 if (response != GTK_RESPONSE_OK)
157 goto out;
158
159 bus = g_bus_get_sync (G_BUS_TYPE_SESSION, NULL, NULL);
160 g_dbus_connection_call (bus,
161 "org.gnome.SettingsDaemon.Housekeeping",
162 "/org/gnome/SettingsDaemon/Housekeeping",
163 "org.gnome.SettingsDaemon.Housekeeping",
164 "EmptyTrash",
165 NULL, NULL, 0, -1, NULL, NULL, NULL);
166
167 out:
168 gtk_window_destroy (GTK_WINDOW (dialog));
169 }
170
171 static void
172 empty_trash (CcUsagePage *self)
173 {
174 GtkDialog *dialog;
175
176 dialog = run_warning (self,
177 _("Empty all items from Trash?"),
178 _("All items in the Trash will be permanently deleted."),
179 _("_Empty Trash"));
180
181 g_signal_connect_object (dialog,
182 "response",
183 G_CALLBACK (on_empty_trash_warning_response_cb),
184 self,
185 0);
186 }
187
188 static void
189 on_purge_temp_warning_response_cb (GtkDialog *dialog,
190 gint response,
191 CcUsagePage *self)
192 {
193 g_autoptr(GDBusConnection) bus = NULL;
194
195 if (response != GTK_RESPONSE_OK)
196 goto out;
197
198 bus = g_bus_get_sync (G_BUS_TYPE_SESSION, NULL, NULL);
199 g_dbus_connection_call (bus,
200 "org.gnome.SettingsDaemon.Housekeeping",
201 "/org/gnome/SettingsDaemon/Housekeeping",
202 "org.gnome.SettingsDaemon.Housekeeping",
203 "RemoveTempFiles",
204 NULL, NULL, 0, -1, NULL, NULL, NULL);
205
206 out:
207 gtk_window_destroy (GTK_WINDOW (dialog));
208 }
209 static void
210 purge_temp (CcUsagePage *self)
211 {
212 GtkDialog *dialog;
213
214 dialog = run_warning (self,
215 _("Delete all the temporary files?"),
216 _("All the temporary files will be permanently deleted."),
217 _("_Purge Temporary Files"));
218
219 g_signal_connect_object (dialog,
220 "response",
221 G_CALLBACK (on_purge_temp_warning_response_cb),
222 self,
223 0);
224 }
225
226 static void
227 cc_usage_page_finalize (GObject *object)
228 {
229 CcUsagePage *self = CC_USAGE_PAGE (object);
230
231 g_clear_object (&self->privacy_settings);
232
233 G_OBJECT_CLASS (cc_usage_page_parent_class)->finalize (object);
234 }
235
236 static char *
237 retain_history_name_cb (AdwEnumListItem *item,
238 gpointer user_data)
239 {
240 switch (adw_enum_list_item_get_value (item))
241 {
242 case CC_USAGE_PAGE_RETAIN_HISTORY_1_DAY:
243 /* Translators: Option for "File History Duration" in "File History" group */
244 return g_strdup (C_("retain_history", "1 day"));
245 case CC_USAGE_PAGE_RETAIN_HISTORY_7_DAYS:
246 /* Translators: Option for "File History Duration" in "File History" group */
247 return g_strdup (C_("retain_history", "7 days"));
248 case CC_USAGE_PAGE_RETAIN_HISTORY_30_DAYS:
249 /* Translators: Option for "File History Duration" in "File History" group */
250 return g_strdup (C_("retain_history", "30 days"));
251 case CC_USAGE_PAGE_RETAIN_HISTORY_FOREVER:
252 /* Translators: Option for "File History Duration" in "File History" group */
253 return g_strdup (C_("retain_history", "Forever"));
254 default:
255 return NULL;
256 }
257 }
258
259 static void
260 retain_history_combo_changed_cb (AdwComboRow *combo_row,
261 GParamSpec *pspec,
262 CcUsagePage *self)
263 {
264 AdwEnumListItem *item;
265 CcUsagePageRetainHistory value;
266
267 item = ADW_ENUM_LIST_ITEM (adw_combo_row_get_selected_item (combo_row));
268 value = adw_enum_list_item_get_value (item);
269
270 g_settings_set (self->privacy_settings, "recent-files-max-age", "i", value);
271 }
272
273 static void
274 set_retain_history_value_for_combo (AdwComboRow *combo_row,
275 CcUsagePage *self)
276 {
277 AdwEnumListModel *model;
278 gint value;
279
280 model = ADW_ENUM_LIST_MODEL (adw_combo_row_get_model (combo_row));
281
282 g_settings_get (self->privacy_settings, "recent-files-max-age", "i", &value);
283 adw_combo_row_set_selected (combo_row,
284 adw_enum_list_model_find_position (model, value));
285 }
286
287 static void
288 cc_usage_page_init (CcUsagePage *self)
289 {
290 g_type_ensure (CC_TYPE_USAGE_PAGE_PURGE_AFTER);
291 g_type_ensure (CC_TYPE_USAGE_PAGE_RETAIN_HISTORY);
292
293 gtk_widget_init_template (GTK_WIDGET (self));
294
295 self->privacy_settings = g_settings_new ("org.gnome.desktop.privacy");
296
297 g_settings_bind (self->privacy_settings,
298 "remember-recent-files",
299 self->recently_used_row,
300 "active",
301 G_SETTINGS_BIND_DEFAULT);
302
303 set_retain_history_value_for_combo (self->retain_history_combo, self);
304
305 g_settings_bind (self->privacy_settings,
306 "remember-recent-files",
307 self->retain_history_combo,
308 "sensitive",
309 G_SETTINGS_BIND_GET);
310
311 g_settings_bind (self->privacy_settings, "remove-old-trash-files",
312 self->purge_trash_row, "active",
313 G_SETTINGS_BIND_DEFAULT);
314
315 g_settings_bind (self->privacy_settings, "remove-old-temp-files",
316 self->purge_temp_row, "active",
317 G_SETTINGS_BIND_DEFAULT);
318
319 set_purge_after_value_for_combo (self->purge_after_combo, self);
320
321 g_signal_connect_object (self->purge_trash_button, "clicked", G_CALLBACK (empty_trash), self, G_CONNECT_SWAPPED);
322 g_signal_connect_object (self->purge_temp_button, "clicked", G_CALLBACK (purge_temp), self, G_CONNECT_SWAPPED);
323 }
324
325 static void
326 on_clear_recent_warning_response_cb (GtkDialog *dialog,
327 gint response,
328 CcUsagePage *self)
329 {
330 if (response == GTK_RESPONSE_OK)
331 gtk_recent_manager_purge_items (gtk_recent_manager_get_default (), NULL);
332
333 gtk_window_destroy (GTK_WINDOW (dialog));
334 }
335
336 static void
337 clear_recent (CcUsagePage *self)
338 {
339 GtkDialog *dialog;
340
341 dialog = run_warning (self,
342 _("Clear File History?"),
343 _("After clearing, lists of recently used files will appear empty."),
344 _("Clear _History"));
345
346 g_signal_connect_object (dialog,
347 "response",
348 G_CALLBACK (on_clear_recent_warning_response_cb),
349 self,
350 0);
351 }
352
353 static void
354 cc_usage_page_class_init (CcUsagePageClass *klass)
355 {
356 GObjectClass *oclass = G_OBJECT_CLASS (klass);
357 GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
358
359 oclass->finalize = cc_usage_page_finalize;
360
361 gtk_widget_class_set_template_from_resource (widget_class, "/org/gnome/control-center/privacy/usage/cc-usage-page.ui");
362
363 gtk_widget_class_bind_template_child (widget_class, CcUsagePage, purge_after_combo);
364 gtk_widget_class_bind_template_child (widget_class, CcUsagePage, purge_temp_row);
365 gtk_widget_class_bind_template_child (widget_class, CcUsagePage, purge_trash_button);
366 gtk_widget_class_bind_template_child (widget_class, CcUsagePage, purge_trash_row);
367 gtk_widget_class_bind_template_child (widget_class, CcUsagePage, purge_temp_button);
368 gtk_widget_class_bind_template_child (widget_class, CcUsagePage, recently_used_row);
369 gtk_widget_class_bind_template_child (widget_class, CcUsagePage, retain_history_combo);
370
371 gtk_widget_class_bind_template_callback (widget_class, clear_recent);
372 gtk_widget_class_bind_template_callback (widget_class, retain_history_name_cb);
373 gtk_widget_class_bind_template_callback (widget_class, retain_history_combo_changed_cb);
374 gtk_widget_class_bind_template_callback (widget_class, purge_after_name_cb);
375 gtk_widget_class_bind_template_callback (widget_class, purge_after_combo_changed_cb);
376 }
377