1 /*
2  * Claws Mail -- a GTK+ based, lightweight, and fast e-mail client
3  * Copyright (C) 1999-2012 Tristan Chabredier <wwp@claws-mail.org> and
4  * the Claws Mail team
5  *
6  * This program is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation; either version 3 of the License, or
9  * (at your option) any later version.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program. If not, see <http://www.gnu.org/licenses/>.
18  *
19  */
20 
21 #ifdef HAVE_CONFIG_H
22 #  include "config.h"
23 #include "claws-features.h"
24 #endif
25 
26 #include "defs.h"
27 
28 #include <stdio.h>
29 #include <stdlib.h>
30 
31 #include <glib.h>
32 #include <glib/gi18n.h>
33 #include <gtk/gtk.h>
34 
35 #include "prefs_common.h"
36 #include "prefs_gtk.h"
37 
38 #include "gtk/gtkutils.h"
39 #include "gtk/prefswindow.h"
40 #include "gtk/menu.h"
41 
42 #include "manage_window.h"
43 
44 #include "log.h"
45 #include "combobox.h"
46 
47 typedef struct _LoggingPage
48 {
49 	PrefsPage page;
50 
51 	GtkWidget *window;
52 
53 	GtkWidget *checkbtn_clip_network_log;
54 	GtkWidget *spinbtn_network_log_length;
55 	GtkWidget *checkbtn_log_standard;
56 	GtkWidget *checkbtn_log_warning;
57 	GtkWidget *checkbtn_log_error;
58 	GtkWidget *checkbtn_log_status;
59 	GtkWidget *checkbtn_clip_filtering_log;
60 	GtkWidget *spinbtn_filtering_log_length;
61 	GtkWidget *checkbtn_filtering_log;
62 	GtkWidget *checkbtn_filtering_log_inc;
63 	GtkWidget *checkbtn_filtering_log_manual;
64 	GtkWidget *checkbtn_filtering_log_folder_proc;
65 	GtkWidget *checkbtn_filtering_log_pre_proc;
66 	GtkWidget *checkbtn_filtering_log_post_proc;
67 	GtkWidget *optmenu_filtering_log_level;
68 } LoggingPage;
69 
prefs_logging_create_check_buttons(GtkWidget ** checkbtn1,gchar * label1,GtkWidget ** checkbtn2,gchar * label2)70 static GtkWidget *prefs_logging_create_check_buttons(GtkWidget **checkbtn1,
71 			gchar *label1, GtkWidget **checkbtn2, gchar *label2)
72 {
73 	GtkWidget *hbox_checkbtn;
74 
75 	hbox_checkbtn = gtk_hbox_new(FALSE, VBOX_BORDER);
76 	gtk_widget_show(hbox_checkbtn);
77 
78 	PACK_CHECK_BUTTON (hbox_checkbtn, *checkbtn1, label1);
79 	gtk_label_set_line_wrap(GTK_LABEL(gtk_bin_get_child(GTK_BIN((*checkbtn1)))), TRUE);
80 
81 	PACK_CHECK_BUTTON (hbox_checkbtn, *checkbtn2, label2);
82 	gtk_label_set_line_wrap(GTK_LABEL(gtk_bin_get_child(GTK_BIN((*checkbtn2)))), TRUE);
83 
84 	return hbox_checkbtn;
85 }
86 
prefs_logging_create_widget(PrefsPage * _page,GtkWindow * window,gpointer data)87 static void prefs_logging_create_widget(PrefsPage *_page, GtkWindow *window,
88 			       	  gpointer data)
89 {
90 	LoggingPage *prefs_logging = (LoggingPage *) _page;
91 
92 	GtkWidget *vbox1;
93 
94 	GtkWidget *frame_logging;
95 	GtkWidget *vbox_network_log;
96 	GtkWidget *hbox_clip_network_log;
97 	GtkWidget *checkbtn_clip_network_log;
98 	GtkWidget *spinbtn_network_log_length;
99 	GtkAdjustment *spinbtn_network_log_length_adj;
100 	GtkWidget *hbox_checkbtn;
101 	GtkWidget *vbox1_filtering_log;
102 	GtkWidget *hbox_clip_filtering_log;
103 	GtkWidget *checkbtn_clip_filtering_log;
104 	GtkWidget *spinbtn_filtering_log_length;
105 	GtkAdjustment *spinbtn_filtering_log_length_adj;
106 	GtkWidget *hbox_filtering_log;
107 	GtkWidget *checkbtn_filtering_log;
108 	GtkWidget *frame_filtering_log;
109 	GtkWidget *vbox2_filtering_log;
110 	GtkWidget *checkbtn_filtering_log_inc;
111 	GtkWidget *checkbtn_filtering_log_manual;
112 	GtkWidget *checkbtn_filtering_log_folder_proc;
113 	GtkWidget *checkbtn_filtering_log_pre_proc;
114 	GtkWidget *checkbtn_filtering_log_post_proc;
115 	GtkWidget *hbox_filtering_log_level;
116 	GtkWidget *label_filtering_log_level;
117 	GtkWidget *optmenu_filtering_log_level;
118 	GtkSizeGroup *filter_size_group;
119 	GtkListStore *menu;
120 	GtkTreeIter iter;
121 	GtkWidget *frame_disk_log;
122 	GtkWidget *vbox_disk_log;
123 	GtkWidget *label;
124 	GtkWidget *hbox;
125 	GtkWidget *checkbtn_log_standard;
126 	GtkWidget *checkbtn_log_warning;
127 	GtkWidget *checkbtn_log_error;
128 	GtkWidget *checkbtn_log_status;
129 	GtkSizeGroup *log_size_group;
130 
131 	vbox1 = gtk_vbox_new (FALSE, VSPACING);
132 	gtk_widget_show (vbox1);
133 	gtk_container_set_border_width (GTK_CONTAINER (vbox1), VBOX_BORDER);
134 
135 	/* Protocol log */
136 	vbox_network_log = gtkut_get_options_frame(vbox1, &frame_logging, _("Network log"));
137 
138 	hbox_clip_network_log = gtk_hbox_new (FALSE, 8);
139 	gtk_container_add (GTK_CONTAINER (vbox_network_log), hbox_clip_network_log);
140 	gtk_widget_show (hbox_clip_network_log);
141 
142 	PACK_CHECK_BUTTON (hbox_clip_network_log, checkbtn_clip_network_log,
143 			   _("Restrict the log window to"));
144 
145 	spinbtn_network_log_length_adj = GTK_ADJUSTMENT(gtk_adjustment_new (500, 0, G_MAXINT, 1, 10, 0));
146 	spinbtn_network_log_length = gtk_spin_button_new
147 		(GTK_ADJUSTMENT (spinbtn_network_log_length_adj), 1, 0);
148 	gtk_widget_show (spinbtn_network_log_length);
149 	gtk_box_pack_start (GTK_BOX (hbox_clip_network_log), spinbtn_network_log_length,
150 			    FALSE, FALSE, 0);
151 	gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (spinbtn_network_log_length), TRUE);
152 
153 	CLAWS_SET_TIP(spinbtn_network_log_length,
154 			     _("0 to stop logging in the log window"));
155 
156 	label = gtk_label_new(_("lines"));
157 	gtk_widget_show (label);
158   	gtk_box_pack_start(GTK_BOX(hbox_clip_network_log), label, FALSE, FALSE, 0);
159 
160 	SET_TOGGLE_SENSITIVITY(checkbtn_clip_network_log, spinbtn_network_log_length);
161 	SET_TOGGLE_SENSITIVITY(checkbtn_clip_network_log, label);
162 
163 	/* Filtering/processing debug log */
164 	vbox1_filtering_log = gtkut_get_options_frame(vbox1,
165 				&frame_logging, _("Filtering/processing log"));
166 
167 	PACK_CHECK_BUTTON (vbox1_filtering_log, checkbtn_filtering_log,
168 			   _("Enable logging of filtering/processing rules"));
169 	hbox_filtering_log = gtk_hbox_new (FALSE, 8);
170 	gtk_container_add (GTK_CONTAINER (vbox1_filtering_log), hbox_filtering_log);
171 	gtk_widget_show (hbox_filtering_log);
172 
173 	CLAWS_SET_TIP(checkbtn_filtering_log,
174 			     _("If checked, turns on logging of filtering and processing rules.\n"
175 				"The log is accessible from 'Tools/Filtering log'.\n"
176 				"Caution: enabling this option will slow down the filtering/processing, "
177 				"this might be critical when applying many rules upon thousands of "
178 				"messages."));
179 
180 	vbox2_filtering_log = gtkut_get_options_frame(vbox1_filtering_log, &frame_filtering_log,
181 							_("Log filtering/processing when..."));
182 
183 	hbox_checkbtn = prefs_logging_create_check_buttons(
184 						&checkbtn_filtering_log_inc,
185 						_("filtering at incorporation"),
186 						&checkbtn_filtering_log_pre_proc,
187 						_("pre-processing folders"));
188 	gtk_box_pack_start(GTK_BOX(vbox2_filtering_log), hbox_checkbtn, FALSE, FALSE, 0);
189 
190 	hbox_checkbtn = prefs_logging_create_check_buttons(
191 						&checkbtn_filtering_log_manual,
192 						_("manually filtering"),
193 						&checkbtn_filtering_log_post_proc,
194 						_("post-processing folders"));
195 	gtk_box_pack_start(GTK_BOX(vbox2_filtering_log), hbox_checkbtn, FALSE, FALSE, 0);
196 
197 	hbox_checkbtn = gtk_hbox_new(TRUE, VBOX_BORDER);
198 	gtk_widget_show(hbox_checkbtn);
199 	gtk_box_pack_start(GTK_BOX(vbox2_filtering_log), hbox_checkbtn, FALSE, FALSE, 0);
200 	PACK_CHECK_BUTTON (hbox_checkbtn, checkbtn_filtering_log_folder_proc,
201 			   _("processing folders"));
202 	gtk_box_pack_start(GTK_BOX(hbox_checkbtn), gtk_label_new(""),
203 			   FALSE, TRUE, 0);
204 
205 	filter_size_group = gtk_size_group_new(GTK_SIZE_GROUP_HORIZONTAL);
206 	gtk_size_group_add_widget(filter_size_group, checkbtn_filtering_log_inc);
207 	gtk_size_group_add_widget(filter_size_group, checkbtn_filtering_log_manual);
208 	gtk_size_group_add_widget(filter_size_group, checkbtn_filtering_log_folder_proc);
209 	g_object_unref(G_OBJECT(filter_size_group));
210 
211 	SET_TOGGLE_SENSITIVITY(checkbtn_filtering_log, frame_filtering_log);
212 
213 	hbox_filtering_log_level = gtk_hbox_new (FALSE, 8);
214 	gtk_widget_show (hbox_filtering_log_level);
215 	gtk_box_pack_start(GTK_BOX (vbox1_filtering_log), hbox_filtering_log_level, FALSE, FALSE, 0);
216 
217 	label_filtering_log_level = gtk_label_new (_("Log level"));
218 	gtk_widget_show (label_filtering_log_level);
219 	gtk_box_pack_start(GTK_BOX(hbox_filtering_log_level), label_filtering_log_level, FALSE, FALSE, 0);
220 
221  	optmenu_filtering_log_level = gtkut_sc_combobox_create(NULL, FALSE);
222  	gtk_widget_show (optmenu_filtering_log_level);
223 
224 	menu = GTK_LIST_STORE(gtk_combo_box_get_model(
225 				GTK_COMBO_BOX(optmenu_filtering_log_level)));
226 	COMBOBOX_ADD (menu, _("Low"), 0);
227 	COMBOBOX_ADD (menu, _("Medium"), 1);
228 	COMBOBOX_ADD (menu, _("High"), 2);
229 
230 	gtk_box_pack_start(GTK_BOX(hbox_filtering_log_level), optmenu_filtering_log_level, FALSE, FALSE, 0);
231 
232 	CLAWS_SET_TIP(optmenu_filtering_log_level,
233 			     _("Select the level of detail of the logging.\n"
234 				"Choose Low to see when rules are applied, which "
235 				"conditions match or don't match and what actions are "
236 				"performed.\n"
237 				"Choose Medium to see more details about the message "
238 				"that is being processed, and why rules are skipped.\n"
239 				"Choose High to explicitly show the reason why all "
240 				"rules are processed or skipped, and why all conditions "
241 				"are matched or not matched.\n"
242 				"Caution: the higher the level, the greater the "
243 				"impact on performance."));
244 
245 	hbox_clip_filtering_log = gtk_hbox_new (FALSE, 8);
246 	gtk_container_add (GTK_CONTAINER (vbox1_filtering_log), hbox_clip_filtering_log);
247 	gtk_widget_show (hbox_clip_filtering_log);
248 	PACK_CHECK_BUTTON (hbox_clip_filtering_log, checkbtn_clip_filtering_log,
249 			   _("Restrict the log window to"));
250 
251 	spinbtn_filtering_log_length_adj = GTK_ADJUSTMENT(gtk_adjustment_new (500, 0, G_MAXINT, 1, 10, 0));
252 	spinbtn_filtering_log_length = gtk_spin_button_new
253 		(GTK_ADJUSTMENT (spinbtn_filtering_log_length_adj), 1, 0);
254 	gtk_widget_show (spinbtn_filtering_log_length);
255 	gtk_box_pack_start (GTK_BOX (hbox_clip_filtering_log), spinbtn_filtering_log_length,
256 			    FALSE, FALSE, 0);
257 	gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (spinbtn_filtering_log_length), TRUE);
258 
259 	CLAWS_SET_TIP(spinbtn_filtering_log_length,
260 			     _("0 to stop logging in the log window"));
261 
262 	label = gtk_label_new(_("lines"));
263 	gtk_widget_show (label);
264   	gtk_box_pack_start(GTK_BOX(hbox_clip_filtering_log), label, FALSE, FALSE, 0);
265 
266 	SET_TOGGLE_SENSITIVITY(checkbtn_clip_filtering_log, spinbtn_filtering_log_length);
267 	SET_TOGGLE_SENSITIVITY(checkbtn_clip_filtering_log, label);
268 	SET_TOGGLE_SENSITIVITY(checkbtn_filtering_log, hbox_clip_filtering_log);
269 	SET_TOGGLE_SENSITIVITY(checkbtn_filtering_log, optmenu_filtering_log_level);
270 	SET_TOGGLE_SENSITIVITY(checkbtn_filtering_log, checkbtn_clip_filtering_log);
271 	SET_TOGGLE_SENSITIVITY(checkbtn_filtering_log, label_filtering_log_level);
272 
273 	/* disk log */
274 	vbox_disk_log = gtkut_get_options_frame(vbox1, &frame_disk_log, _("Disk log"));
275 
276 	label = gtk_label_new(_("Write the following information to disk..."));
277 	gtk_widget_show(label);
278 	hbox = gtk_hbox_new (FALSE, 8);
279 	gtk_container_add (GTK_CONTAINER (vbox_disk_log), hbox);
280 	gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0);
281 	gtk_widget_show (hbox);
282 
283 	hbox_checkbtn = prefs_logging_create_check_buttons(&checkbtn_log_warning,
284 				_("Warning messages"), &checkbtn_log_standard,
285 				_("Network protocol messages"));
286 	gtk_box_pack_start(GTK_BOX(vbox_disk_log), hbox_checkbtn, FALSE, FALSE, 0);
287 
288 	hbox_checkbtn = prefs_logging_create_check_buttons(&checkbtn_log_error,
289 				_("Error messages"), &checkbtn_log_status,
290 				_("Status messages for filtering/processing log"));
291 	gtk_box_pack_start(GTK_BOX(vbox_disk_log), hbox_checkbtn, FALSE, FALSE, 0);
292 
293 	log_size_group = gtk_size_group_new(GTK_SIZE_GROUP_HORIZONTAL);
294 	gtk_size_group_add_widget(log_size_group, checkbtn_log_warning);
295 	gtk_size_group_add_widget(log_size_group, checkbtn_log_error);
296 	g_object_unref(G_OBJECT(log_size_group));
297 
298 	gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbtn_clip_network_log),
299 		prefs_common.cliplog);
300 	gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbtn_clip_filtering_log),
301 		prefs_common.filtering_debug_cliplog);
302 	gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbtn_log_standard),
303 		prefs_common.enable_log_standard);
304 	gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbtn_log_warning),
305 		prefs_common.enable_log_warning);
306 	gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbtn_log_error),
307 		prefs_common.enable_log_error);
308 	gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbtn_log_status),
309 		prefs_common.enable_log_status);
310 	gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbtn_filtering_log),
311 		prefs_common.enable_filtering_debug);
312 	gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbtn_filtering_log_inc),
313 		prefs_common.enable_filtering_debug_inc);
314 	gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbtn_filtering_log_manual),
315 		prefs_common.enable_filtering_debug_manual);
316 	gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbtn_filtering_log_folder_proc),
317 		prefs_common.enable_filtering_debug_folder_proc);
318 	gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbtn_filtering_log_pre_proc),
319 		prefs_common.enable_filtering_debug_pre_proc);
320 	gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbtn_filtering_log_post_proc),
321 		prefs_common.enable_filtering_debug_post_proc);
322 
323 	gtk_spin_button_set_value(GTK_SPIN_BUTTON(spinbtn_network_log_length),
324 		prefs_common.loglength);
325 	gtk_spin_button_set_value(GTK_SPIN_BUTTON(spinbtn_filtering_log_length),
326 		prefs_common.filtering_debug_loglength);
327 	combobox_select_by_data(GTK_COMBO_BOX(optmenu_filtering_log_level),
328 			prefs_common.filtering_debug_level);
329 
330 	prefs_logging->checkbtn_clip_network_log = checkbtn_clip_network_log;
331 	prefs_logging->spinbtn_network_log_length = spinbtn_network_log_length;
332 	prefs_logging->checkbtn_log_standard = checkbtn_log_standard;
333 	prefs_logging->checkbtn_log_warning = checkbtn_log_warning;
334 	prefs_logging->checkbtn_log_error = checkbtn_log_error;
335 	prefs_logging->checkbtn_log_status = checkbtn_log_status;
336 	prefs_logging->checkbtn_clip_filtering_log = checkbtn_clip_filtering_log;
337 	prefs_logging->spinbtn_filtering_log_length = spinbtn_filtering_log_length;
338 	prefs_logging->checkbtn_filtering_log = checkbtn_filtering_log;
339 	prefs_logging->checkbtn_filtering_log_inc = checkbtn_filtering_log_inc;
340 	prefs_logging->checkbtn_filtering_log_manual = checkbtn_filtering_log_manual;
341 	prefs_logging->checkbtn_filtering_log_folder_proc = checkbtn_filtering_log_folder_proc;
342 	prefs_logging->checkbtn_filtering_log_pre_proc = checkbtn_filtering_log_pre_proc;
343 	prefs_logging->checkbtn_filtering_log_post_proc = checkbtn_filtering_log_post_proc;
344 	prefs_logging->optmenu_filtering_log_level = optmenu_filtering_log_level;
345 	prefs_logging->page.widget = vbox1;
346 }
347 
prefs_logging_save(PrefsPage * _page)348 static void prefs_logging_save(PrefsPage *_page)
349 {
350 	LoggingPage *page = (LoggingPage *) _page;
351 	MainWindow *mainwindow;
352 
353 	gboolean filtering_debug_enabled;
354 	prefs_common.filtering_debug_level =
355 		combobox_get_active_data(GTK_COMBO_BOX(page->optmenu_filtering_log_level));
356 
357 	prefs_common.cliplog = gtk_toggle_button_get_active(
358 		GTK_TOGGLE_BUTTON(page->checkbtn_clip_network_log));
359 	prefs_common.loglength = gtk_spin_button_get_value_as_int(
360 		GTK_SPIN_BUTTON(page->spinbtn_network_log_length));
361 	prefs_common.enable_log_standard = gtk_toggle_button_get_active(
362 		GTK_TOGGLE_BUTTON(page->checkbtn_log_standard));
363 	prefs_common.enable_log_warning = gtk_toggle_button_get_active(
364 		GTK_TOGGLE_BUTTON(page->checkbtn_log_warning));
365 	prefs_common.enable_log_error = gtk_toggle_button_get_active(
366 		GTK_TOGGLE_BUTTON(page->checkbtn_log_error));
367 	prefs_common.enable_log_status = gtk_toggle_button_get_active(
368 		GTK_TOGGLE_BUTTON(page->checkbtn_log_status));
369 	prefs_common.filtering_debug_cliplog = gtk_toggle_button_get_active(
370 		GTK_TOGGLE_BUTTON(page->checkbtn_clip_filtering_log));
371 	prefs_common.filtering_debug_loglength = gtk_spin_button_get_value_as_int(
372 		GTK_SPIN_BUTTON(page->spinbtn_filtering_log_length));
373 	filtering_debug_enabled = prefs_common.enable_filtering_debug;
374 	prefs_common.enable_filtering_debug = gtk_toggle_button_get_active(
375 		GTK_TOGGLE_BUTTON(page->checkbtn_filtering_log));
376 	if (filtering_debug_enabled != prefs_common.enable_filtering_debug) {
377 		if (prefs_common.enable_filtering_debug)
378 			log_message(LOG_DEBUG_FILTERING, _("filtering log enabled\n"));
379 		else
380 			log_message(LOG_DEBUG_FILTERING, _("filtering log disabled\n"));
381 	}
382 	prefs_common.enable_filtering_debug_inc = gtk_toggle_button_get_active(
383 		GTK_TOGGLE_BUTTON(page->checkbtn_filtering_log_inc));
384 	prefs_common.enable_filtering_debug_manual = gtk_toggle_button_get_active(
385 		GTK_TOGGLE_BUTTON(page->checkbtn_filtering_log_manual));
386 	prefs_common.enable_filtering_debug_folder_proc = gtk_toggle_button_get_active(
387 		GTK_TOGGLE_BUTTON(page->checkbtn_filtering_log_folder_proc));
388 	prefs_common.enable_filtering_debug_pre_proc = gtk_toggle_button_get_active(
389 		GTK_TOGGLE_BUTTON(page->checkbtn_filtering_log_pre_proc));
390 	prefs_common.enable_filtering_debug_post_proc = gtk_toggle_button_get_active(
391 		GTK_TOGGLE_BUTTON(page->checkbtn_filtering_log_post_proc));
392 	mainwindow = mainwindow_get_mainwindow();
393 	log_window_set_clipping(mainwindow->logwin, prefs_common.cliplog,
394 				prefs_common.loglength);
395 	log_window_set_clipping(mainwindow->filtering_debugwin, prefs_common.filtering_debug_cliplog,
396 				prefs_common.filtering_debug_loglength);
397 }
398 
prefs_logging_destroy_widget(PrefsPage * _page)399 static void prefs_logging_destroy_widget(PrefsPage *_page)
400 {
401 }
402 
403 LoggingPage *prefs_logging;
404 
prefs_logging_init(void)405 void prefs_logging_init(void)
406 {
407 	LoggingPage *page;
408 	static gchar *path[3];
409 
410 	path[0] = _("Other");
411 	path[1] = _("Logging");
412 	path[2] = NULL;
413 
414 	page = g_new0(LoggingPage, 1);
415 	page->page.path = path;
416 	page->page.create_widget = prefs_logging_create_widget;
417 	page->page.destroy_widget = prefs_logging_destroy_widget;
418 	page->page.save_page = prefs_logging_save;
419 	page->page.weight = 5.0;
420 	prefs_gtk_register_page((PrefsPage *) page);
421 	prefs_logging = page;
422 }
423 
prefs_logging_done(void)424 void prefs_logging_done(void)
425 {
426 	prefs_gtk_unregister_page((PrefsPage *) prefs_logging);
427 	g_free(prefs_logging);
428 }
429