2009-02-06 [holger] 3.7.0cvs55
[claws.git] / src / prefs_common.c
1 /*
2  * Sylpheed -- a GTK+ based, lightweight, and fast e-mail client
3  * Copyright (C) 1999-2009 Hiroyuki Yamamoto and the Claws Mail team
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 3 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  */
19
20 #ifdef HAVE_CONFIG_H
21 #  include "config.h"
22 #endif
23
24 #include "defs.h"
25
26 #include <glib.h>
27 #include <glib/gi18n.h>
28 #include <gtk/gtk.h>
29 #include <gdk/gdkkeysyms.h>
30 #include <stdio.h>
31 #include <stdlib.h>
32 #include <string.h>
33 #include <unistd.h>
34 #include <sys/types.h>
35 #include <sys/stat.h>
36 #include <errno.h>
37
38 #include "main.h"
39 #include "prefs_gtk.h"
40 #include "prefs_common.h"
41 #include "prefs_display_header.h"
42 #include "prefs_summary_column.h"
43 #include "prefs_folder_column.h"
44 #include "mainwindow.h"
45 #include "summaryview.h"
46 #include "folderview.h"
47 #include "messageview.h"
48 #include "manage_window.h"
49 #include "inc.h"
50 #include "menu.h"
51 #include "codeconv.h"
52 #include "utils.h"
53 #include "gtkutils.h"
54 #include "alertpanel.h"
55 #include "folder.h"
56 #include "socket.h"
57 #include "filesel.h"
58 #include "folderview.h"
59 #include "stock_pixmap.h"
60 #include "prefswindow.h"
61 #include "colorlabel.h"
62 #include "addrcustomattr.h"
63
64 enum {
65         DATEFMT_FMT,
66         DATEFMT_TXT,
67         N_DATEFMT_COLUMNS
68 };
69
70 PrefsCommon prefs_common;
71
72 GtkWidget *notebook;
73
74 #ifdef G_OS_WIN32
75 /*
76  * In the Windows version prefs_common contains
77  *   - the non-OS-specific settings of the "Common" section and
78  *   - the OS-specific settings of the "CommonWin32" section
79  * The OS-specific settings of the "Common" section are not used
80  * but saved in prefs_unix.
81  */
82
83 #  define SPECIFIC_PREFS prefs_unix
84
85 static PrefsCommon prefs_unix;
86
87 static PrefParam param_os_specific[] = {
88         /* Receive */
89         {"ext_inc_path", "",
90          &prefs_common.extinc_cmd, P_STRING, NULL, NULL, NULL},
91         {"newmail_notify_cmd", "",
92          &prefs_common.newmail_notify_cmd, P_STRING, NULL, NULL, NULL},
93
94         /* new fonts */
95         {"widget_font_gtk2",    NULL,
96           &prefs_common.widgetfont,             P_STRING, NULL, NULL, NULL},
97         {"message_font_gtk2",   "Monospace 9",
98          &prefs_common.textfont,                P_STRING, NULL, NULL, NULL},
99         {"print_font_gtk2",     "Monospace 9",
100          &prefs_common.printfont,               P_STRING, NULL, NULL, NULL},
101         {"small_font_gtk2",     "Sans 9",
102           &prefs_common.smallfont,              P_STRING, NULL, NULL, NULL},
103         {"normal_font_gtk2",    "Sans 9",
104           &prefs_common.normalfont,             P_STRING, NULL, NULL, NULL},
105         {"bold_font_gtk2",      "Sans 9 Bold",
106           &prefs_common.boldfont,               P_STRING, NULL, NULL, NULL},
107         /* Message */
108         {"attach_save_directory", NULL,
109          &prefs_common.attach_save_dir, P_STRING, NULL, NULL, NULL},
110         {"attach_load_directory", NULL,
111          &prefs_common.attach_load_dir, P_STRING, NULL, NULL, NULL},
112
113         /* MIME viewer */
114         {"mime_textviewer", NULL,
115          &prefs_common.mime_textviewer,   P_STRING, NULL, NULL, NULL},
116         {"mime_open_command", "notepad '%s'",
117          &prefs_common.mime_open_cmd,     P_STRING, NULL, NULL, NULL},
118
119         /* Interface */
120         {"pixmap_theme_path", DEFAULT_PIXMAP_THEME, 
121          &prefs_common.pixmap_theme_path, P_STRING, NULL, NULL, NULL},
122
123         /* Other */
124         {"ext_editor_command", "notepad %s",
125          &prefs_common.ext_editor_cmd, P_STRING, NULL, NULL, NULL},
126
127         {NULL, NULL, NULL, P_OTHER, NULL, NULL, NULL}
128 };
129 #else
130 #  define SPECIFIC_PREFS prefs_common
131 #endif
132
133 /*
134    parameter name, default value, pointer to the prefs variable, data type,
135    pointer to the widget pointer,
136    pointer to the function for data setting,
137    pointer to the function for widget setting
138  */
139
140 static PrefParam param[] = {
141 #ifdef MAEMO
142         {"data_root", "", &prefs_common.data_root, P_STRING,
143          NULL, NULL, NULL},
144 #endif
145         /* Receive */
146         {"use_ext_inc", "FALSE", &prefs_common.use_extinc, P_BOOL,
147          NULL, NULL, NULL},
148         {"ext_inc_path", DEFAULT_INC_PATH, &SPECIFIC_PREFS.extinc_cmd, P_STRING,
149          NULL, NULL, NULL},
150
151         {"autochk_newmail", "FALSE", &prefs_common.autochk_newmail, P_BOOL,
152          NULL, NULL, NULL},
153         {"autochk_interval", "10", &prefs_common.autochk_itv, P_INT,
154          NULL, NULL, NULL},
155         {"check_on_startup", "FALSE", &prefs_common.chk_on_startup, P_BOOL,
156          NULL, NULL, NULL},
157         {"open_inbox_on_inc", "FALSE", &prefs_common.open_inbox_on_inc,
158          P_BOOL, NULL, NULL, NULL},
159         {"scan_all_after_inc", "FALSE", &prefs_common.scan_all_after_inc,
160          P_BOOL, NULL, NULL, NULL},
161         {"newmail_notify_manu", "FALSE", &prefs_common.newmail_notify_manu,
162          P_BOOL, NULL, NULL, NULL},
163         {"newmail_notify_auto", "FALSE", &prefs_common.newmail_notify_auto,
164         P_BOOL, NULL, NULL, NULL},
165         {"newmail_notify_cmd", "", &SPECIFIC_PREFS.newmail_notify_cmd, P_STRING,
166          NULL, NULL, NULL},
167 #ifdef MAEMO
168         {"maemo_show_led", "TRUE", &prefs_common.maemo_show_led, P_BOOL,
169          NULL, NULL, NULL},
170         {"maemo_play_sound", "FALSE", &prefs_common.maemo_play_sound, P_BOOL,
171          NULL, NULL, NULL},
172         {"maemo_show_banner", "FALSE", &prefs_common.maemo_show_banner, P_BOOL,
173          NULL, NULL, NULL},
174 #endif
175         {"receive_dialog_mode", "2", &prefs_common.recv_dialog_mode, P_ENUM,
176          NULL, NULL, NULL},
177         {"receivewin_width", "460", &prefs_common.receivewin_width, P_INT,
178          NULL, NULL, NULL},
179         {"receivewin_height", "-1", &prefs_common.receivewin_height, P_INT,
180          NULL, NULL, NULL},
181         {"no_receive_error_panel", "FALSE", &prefs_common.no_recv_err_panel,
182          P_BOOL, NULL, NULL, NULL},
183         {"close_receive_dialog", "TRUE", &prefs_common.close_recv_dialog,
184          P_BOOL, NULL, NULL, NULL},
185  
186         /* Send */
187         {"save_message", "TRUE", &prefs_common.savemsg, P_BOOL,
188          NULL, NULL, NULL},
189         {"confirm_send_queued_messages", "FALSE", &prefs_common.confirm_send_queued_messages,
190          P_BOOL, NULL, NULL, NULL},
191 #ifndef GENERIC_UMPC
192         {"send_dialog_mode", "0", &prefs_common.send_dialog_invisible, P_BOOL,
193          NULL, NULL, NULL},
194 #else
195         {"send_dialog_mode", "1", &prefs_common.send_dialog_invisible, P_BOOL,
196          NULL, NULL, NULL},
197 #endif
198         {"sendwin_width", "460", &prefs_common.sendwin_width, P_INT,
199          NULL, NULL, NULL},
200         {"sendwin_height", "-1", &prefs_common.sendwin_height, P_INT,
201          NULL, NULL, NULL},
202
203         {"outgoing_charset", CS_AUTO, &prefs_common.outgoing_charset, P_STRING,
204          NULL, NULL, NULL},
205         {"encoding_method", "0", &prefs_common.encoding_method, P_ENUM,
206          NULL, NULL, NULL},
207         {"outgoing_fallback_to_ascii", "TRUE", &prefs_common.outgoing_fallback_to_ascii, P_BOOL,
208          NULL, NULL, NULL},
209
210         {"allow_jisx0201_kana", "FALSE", &prefs_common.allow_jisx0201_kana,
211          P_BOOL, NULL, NULL, NULL},
212
213         /* Compose */
214         {"auto_ext_editor", "FALSE", &prefs_common.auto_exteditor, P_BOOL,
215          NULL, NULL, NULL},
216         {"forward_as_attachment", "FALSE", &prefs_common.forward_as_attachment,
217          P_BOOL, NULL, NULL, NULL},
218         {"redirect_keep_from", "FALSE",
219          &prefs_common.redirect_keep_from, P_BOOL,
220          NULL, NULL, NULL},
221         {"undo_level", "50", &prefs_common.undolevels, P_INT,
222          NULL, NULL, NULL},
223         {"compose_with_format", "FALSE", &prefs_common.compose_with_format, P_BOOL,
224          NULL, NULL, NULL},
225         {"compose_subject_format", "",
226          &prefs_common.compose_subject_format, P_STRING, NULL, NULL, NULL},
227         {"compose_body_format", N_("Hello,\\n"),
228          &prefs_common.compose_body_format, P_STRING, NULL, NULL, NULL},
229
230         {"linewrap_length", "72", &prefs_common.linewrap_len, P_INT,
231          NULL, NULL, NULL},
232         {"linewrap_quotation", "TRUE", &prefs_common.linewrap_quote, P_BOOL,
233          NULL, NULL, NULL},
234         {"linewrap_pastes", "TRUE", &prefs_common.linewrap_pastes, P_BOOL,
235          NULL, NULL, NULL},
236         {"primary_paste_unselects", "FALSE", &prefs_common.primary_paste_unselects, P_BOOL,
237          NULL, NULL, NULL},
238         {"linewrap_auto", "TRUE", &prefs_common.autowrap, P_BOOL,
239          NULL, NULL, NULL},
240         {"auto_indent", "TRUE", &prefs_common.auto_indent, P_BOOL,
241          NULL, NULL, NULL},
242         {"autosave", "TRUE", &prefs_common.autosave,
243          P_BOOL, NULL, NULL, NULL},
244         {"autosave_length", "50", &prefs_common.autosave_length, P_INT,
245          NULL, NULL, NULL},
246
247         {"enable_aspell", "TRUE", &prefs_common.enable_aspell, P_BOOL,
248          NULL, NULL, NULL},
249         {"dictionary",  "", &prefs_common.dictionary, P_STRING,
250          NULL, NULL, NULL},
251         {"alt_dictionary",  "", &prefs_common.alt_dictionary, P_STRING,
252          NULL, NULL, NULL},
253         {"use_alternate_dict", "FALSE", &prefs_common.use_alternate, P_BOOL,
254          NULL, NULL, NULL},
255         {"check_while_typing", "TRUE", &prefs_common.check_while_typing, P_BOOL,
256          NULL, NULL, NULL},
257         {"recheck_when_changing_dict", "TRUE", &prefs_common.recheck_when_changing_dict,
258          P_BOOL, NULL, NULL, NULL},
259         {"misspelled_color", "#ff0000", &prefs_common.misspelled_col, P_COLOR,
260          NULL, NULL, NULL},
261         {"use_both_dicts", "FALSE", &prefs_common.use_both_dicts, P_BOOL,
262          NULL, NULL, NULL},
263
264         {"reply_with_quote", "TRUE", &prefs_common.reply_with_quote, P_BOOL,
265          NULL, NULL, NULL},
266         {"compose_dnd_insert_or_attach", "0", &prefs_common.compose_dnd_mode, P_ENUM,
267          NULL, NULL, NULL},
268
269         /* Account autoselection */
270         {"reply_account_autoselect", "TRUE",
271          &prefs_common.reply_account_autosel, P_BOOL,
272          NULL, NULL, NULL},
273         {"forward_account_autoselect", "TRUE",
274          &prefs_common.forward_account_autosel, P_BOOL,
275          NULL, NULL, NULL},
276         {"reedit_account_autoselect", "TRUE",
277          &prefs_common.reedit_account_autosel, P_BOOL,
278          NULL, NULL, NULL},
279
280         {"default_reply_list", "TRUE", &prefs_common.default_reply_list, P_BOOL,
281          NULL, NULL, NULL},
282
283 #ifndef GENERIC_UMPC
284         {"show_ruler", "TRUE", &prefs_common.show_ruler, P_BOOL,
285          NULL, NULL, NULL},
286 #else
287         {"show_ruler", "FALSE", &prefs_common.show_ruler, P_BOOL,
288          NULL, NULL, NULL},
289 #endif
290
291         /* Quote */
292         {"reply_quote_mark", "> ", &prefs_common.quotemark, P_STRING,
293          NULL, NULL, NULL},
294         {"reply_quote_format", N_("On %d\\n%f wrote:\\n\\n%q\\n%X"),
295          &prefs_common.quotefmt, P_STRING, NULL, NULL, NULL},
296
297         {"forward_quote_mark", "> ", &prefs_common.fw_quotemark, P_STRING,
298          NULL, NULL, NULL},
299         {"forward_quote_format",
300          N_("\\n\\nBegin forwarded message:\\n\\n"
301          "?d{Date: %d\\n}?f{From: %f\\n}?t{To: %t\\n}?c{Cc: %c\\n}"
302          "?n{Newsgroups: %n\\n}?s{Subject: %s\\n}\\n\\n%M"),
303          &prefs_common.fw_quotefmt, P_STRING,
304          NULL, NULL, NULL},
305         {"quote_chars", ">", &prefs_common.quote_chars, P_STRING,
306          NULL, NULL, NULL},
307
308         /* Display */
309         /* Obsolete fonts. For coexisting with Gtk+-1.2 version */
310         {"widget_font",         NULL,
311           &prefs_common.widgetfont_gtk1,        P_STRING, NULL, NULL, NULL},
312         {"message_font",        "-misc-fixed-medium-r-normal--14-*-*-*-*-*-*-*",
313          &prefs_common.textfont_gtk1,           P_STRING, NULL, NULL, NULL},
314         {"small_font",          "-*-helvetica-medium-r-normal--10-*-*-*-*-*-*-*",
315           &prefs_common.smallfont_gtk1,         P_STRING, NULL, NULL, NULL},
316         {"bold_font",           "-*-helvetica-bold-r-normal--12-*-*-*-*-*-*-*",
317           &prefs_common.boldfont_gtk1,          P_STRING, NULL, NULL, NULL},
318         {"normal_font",         "-*-helvetica-medium-r-normal--12-*-*-*-*-*-*-*",
319           &prefs_common.normalfont_gtk1,        P_STRING, NULL, NULL, NULL},
320
321         /* new fonts */
322 #ifndef GENERIC_UMPC
323         {"widget_font_gtk2",    NULL,
324           &SPECIFIC_PREFS.widgetfont,           P_STRING, NULL, NULL, NULL},
325         {"message_font_gtk2",   "Monospace 9",
326          &SPECIFIC_PREFS.textfont,                      P_STRING, NULL, NULL, NULL},
327         {"print_font_gtk2",     "Monospace 9",
328          &SPECIFIC_PREFS.printfont,             P_STRING, NULL, NULL, NULL},
329         {"small_font_gtk2",     "Sans 9",
330           &SPECIFIC_PREFS.smallfont,            P_STRING, NULL, NULL, NULL},
331         {"normal_font_gtk2",    "Sans 9",
332           &SPECIFIC_PREFS.normalfont,           P_STRING, NULL, NULL, NULL},
333         {"bold_font_gtk2",      "Sans Bold 9",
334           &SPECIFIC_PREFS.boldfont,             P_STRING, NULL, NULL, NULL},
335 #else
336         {"widget_font_gtk2",    NULL,
337           &SPECIFIC_PREFS.widgetfont,           P_STRING, NULL, NULL, NULL},
338         {"message_font_gtk2",   "Monospace 8",
339          &SPECIFIC_PREFS.textfont,                      P_STRING, NULL, NULL, NULL},
340         {"print_font_gtk2",     "Monospace 8",
341          &SPECIFIC_PREFS.printfont,             P_STRING, NULL, NULL, NULL},
342         {"small_font_gtk2",     "Sans 8",
343           &SPECIFIC_PREFS.smallfont,            P_STRING, NULL, NULL, NULL},
344         {"normal_font_gtk2",    "Sans 8",
345           &SPECIFIC_PREFS.normalfont,           P_STRING, NULL, NULL, NULL},
346         {"bold_font_gtk2",      "Sans Bold 8",
347           &SPECIFIC_PREFS.boldfont,             P_STRING, NULL, NULL, NULL},
348 #endif
349
350         {"use_different_print_font", "FALSE", &prefs_common.use_different_print_font, P_BOOL,
351          NULL, NULL, NULL},
352         {"derive_from_normal_font", "TRUE", &prefs_common.derive_from_normal_font, P_BOOL,
353          NULL, NULL, NULL},
354
355         /* custom colors */
356         {"custom_color1", "#ff9900", &prefs_common.custom_colorlabel[0].color, P_COLOR,
357          NULL, NULL, NULL},
358         {"custom_colorlabel1", N_("Orange"), &prefs_common.custom_colorlabel[0].label, P_STRING,
359          NULL, NULL, NULL},
360         {"custom_color2", "#ff0000", &prefs_common.custom_colorlabel[1].color, P_COLOR,
361          NULL, NULL, NULL},
362         {"custom_colorlabel2", N_("Red"), &prefs_common.custom_colorlabel[1].label, P_STRING,
363          NULL, NULL, NULL},
364         {"custom_color3", "#ff66ff", &prefs_common.custom_colorlabel[2].color, P_COLOR,
365          NULL, NULL, NULL},
366         {"custom_colorlabel3", N_("Pink"), &prefs_common.custom_colorlabel[2].label, P_STRING,
367          NULL, NULL, NULL},
368         {"custom_color4", "#00ccff", &prefs_common.custom_colorlabel[3].color, P_COLOR,
369          NULL, NULL, NULL},
370         {"custom_colorlabel4", N_("Sky blue"), &prefs_common.custom_colorlabel[3].label, P_STRING,
371          NULL, NULL, NULL},
372         {"custom_color5", "#0000ff", &prefs_common.custom_colorlabel[4].color, P_COLOR,
373          NULL, NULL, NULL},
374         {"custom_colorlabel5", N_("Blue"), &prefs_common.custom_colorlabel[4].label, P_STRING,
375          NULL, NULL, NULL},
376         {"custom_color6", "#009900", &prefs_common.custom_colorlabel[5].color, P_COLOR,
377          NULL, NULL, NULL},
378         {"custom_colorlabel6", N_("Green"), &prefs_common.custom_colorlabel[5].label, P_STRING,
379          NULL, NULL, NULL},
380         {"custom_color7", "#663333", &prefs_common.custom_colorlabel[6].color, P_COLOR,
381          NULL, NULL, NULL},
382         {"custom_colorlabel7", N_("Brown"), &prefs_common.custom_colorlabel[6].label, P_STRING,
383          NULL, NULL, NULL},
384         {"custom_color8", "#aaaaaa", &prefs_common.custom_colorlabel[7].color, P_COLOR,
385          NULL, NULL, NULL},
386         {"custom_colorlabel8", N_("Grey"), &prefs_common.custom_colorlabel[7].label, P_STRING,
387          NULL, NULL, NULL},
388         {"custom_color9", "#c07254", &prefs_common.custom_colorlabel[8].color, P_COLOR,
389          NULL, NULL, NULL},
390         {"custom_colorlabel9", N_("Light brown"), &prefs_common.custom_colorlabel[8].label, P_STRING,
391          NULL, NULL, NULL},
392         {"custom_color10", "#c00000", &prefs_common.custom_colorlabel[9].color, P_COLOR,
393          NULL, NULL, NULL},
394         {"custom_colorlabel10", N_("Dark red"), &prefs_common.custom_colorlabel[9].label, P_STRING,
395          NULL, NULL, NULL},
396         {"custom_color11", "#cc1074", &prefs_common.custom_colorlabel[10].color, P_COLOR,
397          NULL, NULL, NULL},
398         {"custom_colorlabel11", N_("Dark pink"), &prefs_common.custom_colorlabel[10].label, P_STRING,
399          NULL, NULL, NULL},
400         {"custom_color12", "#5094cd", &prefs_common.custom_colorlabel[11].color, P_COLOR,
401          NULL, NULL, NULL},
402         {"custom_colorlabel12", N_("Steel blue"), &prefs_common.custom_colorlabel[11].label, P_STRING,
403          NULL, NULL, NULL},
404         {"custom_color13", "#ffd500", &prefs_common.custom_colorlabel[12].color, P_COLOR,
405          NULL, NULL, NULL},
406         {"custom_colorlabel13", N_("Gold"), &prefs_common.custom_colorlabel[12].label, P_STRING,
407          NULL, NULL, NULL},
408         {"custom_color14", "#00d800", &prefs_common.custom_colorlabel[13].color, P_COLOR,
409          NULL, NULL, NULL},
410         {"custom_colorlabel14", N_("Bright green"), &prefs_common.custom_colorlabel[13].label, P_STRING,
411          NULL, NULL, NULL},
412         {"custom_color15", "#c060c0", &prefs_common.custom_colorlabel[14].color, P_COLOR,
413          NULL, NULL, NULL},
414         {"custom_colorlabel15", N_("Magenta"), &prefs_common.custom_colorlabel[14].label, P_STRING,
415          NULL, NULL, NULL},
416
417         /* image viewer */
418         {"display_image", "TRUE", &prefs_common.display_img, P_BOOL,
419          NULL, NULL, NULL},
420         {"resize_image", "TRUE", &prefs_common.resize_img, P_BOOL,
421          NULL, NULL, NULL},
422         {"inline_image", "TRUE", &prefs_common.inline_img, P_BOOL,
423          NULL, NULL, NULL},
424
425         {"display_folder_unread_num", "0",
426          &prefs_common.display_folder_unread, P_INT,
427          NULL, NULL, NULL},
428         {"newsgroup_abbrev_len", "16",
429          &prefs_common.ng_abbrev_len, P_INT,
430          NULL, NULL, NULL},
431
432         {"translate_header", "FALSE", &prefs_common.trans_hdr, P_BOOL,
433          NULL, NULL, NULL},
434
435         /* Display: Summary View */
436         {"use_address_book", "FALSE", &prefs_common.use_addr_book, P_BOOL,
437          NULL, NULL, NULL},
438         {"thread_by_subject", "TRUE", &prefs_common.thread_by_subject, P_BOOL,
439          NULL, NULL, NULL},
440         {"date_format", N_("%y/%m/%d(%a) %H:%M"), &prefs_common.date_format,
441          P_STRING, NULL, NULL, NULL},
442
443         {"bold_unread", "TRUE", &prefs_common.bold_unread, P_BOOL,
444          NULL, NULL, NULL},
445
446         {"enable_thread", "TRUE", &prefs_common.enable_thread, P_BOOL,
447          NULL, NULL, NULL},
448 #ifndef GENERIC_UMPC
449         {"toolbar_style", "3", &prefs_common.toolbar_style, P_ENUM,
450          NULL, NULL, NULL},
451 #else
452         {"toolbar_style", "1", &prefs_common.toolbar_style, P_ENUM,
453          NULL, NULL, NULL},
454 #endif
455         {"toolbar_detachable", "FALSE", &prefs_common.toolbar_detachable, P_BOOL,
456          NULL, NULL, NULL},
457         {"show_col_headers", "TRUE", &prefs_common.show_col_headers, P_BOOL,
458          NULL, NULL, NULL},
459 #ifndef GENERIC_UMPC
460         {"show_statusbar", "TRUE", &prefs_common.show_statusbar, P_BOOL,
461          NULL, NULL, NULL},
462         {"show_searchbar", "TRUE", &prefs_common.show_searchbar, P_BOOL,
463          NULL, NULL, NULL},
464 #else
465         {"show_statusbar", "FALSE", &prefs_common.show_statusbar, P_BOOL,
466          NULL, NULL, NULL},
467         {"show_searchbar", "FALSE", &prefs_common.show_searchbar, P_BOOL,
468          NULL, NULL, NULL},
469 #endif
470
471         {"summary_col_show_mark", "TRUE",
472          &prefs_common.summary_col_visible[S_COL_MARK], P_BOOL, NULL, NULL, NULL},
473         {"summary_col_show_unread", "TRUE",
474          &prefs_common.summary_col_visible[S_COL_STATUS], P_BOOL, NULL, NULL, NULL},
475         {"summary_col_show_subject", "TRUE",
476          &prefs_common.summary_col_visible[S_COL_SUBJECT], P_BOOL, NULL, NULL, NULL},
477         {"summary_col_show_from", "TRUE",
478          &prefs_common.summary_col_visible[S_COL_FROM], P_BOOL, NULL, NULL, NULL},
479         {"summary_col_show_to", "FALSE",
480          &prefs_common.summary_col_visible[S_COL_TO], P_BOOL, NULL, NULL, NULL},
481         {"summary_col_show_date", "TRUE",
482          &prefs_common.summary_col_visible[S_COL_DATE], P_BOOL, NULL, NULL, NULL},
483         {"summary_col_show_mime", "TRUE",
484          &prefs_common.summary_col_visible[S_COL_MIME], P_BOOL, NULL, NULL, NULL},
485         {"summary_col_show_size", "TRUE",
486          &prefs_common.summary_col_visible[S_COL_SIZE], P_BOOL, NULL, NULL, NULL},
487         {"summary_col_show_number", "FALSE",
488          &prefs_common.summary_col_visible[S_COL_NUMBER], P_BOOL, NULL, NULL, NULL},
489         {"summary_col_show_score", "FALSE",
490          &prefs_common.summary_col_visible[S_COL_SCORE], P_BOOL, NULL, NULL, NULL},
491         {"summary_col_show_locked", "FALSE",
492          &prefs_common.summary_col_visible[S_COL_LOCKED], P_BOOL, NULL, NULL, NULL},
493         {"summary_col_show_tags", "FALSE",
494          &prefs_common.summary_col_visible[S_COL_TAGS], P_BOOL, NULL, NULL, NULL},
495
496         {"summary_col_pos_mark", "0",
497           &prefs_common.summary_col_pos[S_COL_MARK], P_INT, NULL, NULL, NULL},
498         {"summary_col_pos_unread", "1",
499           &prefs_common.summary_col_pos[S_COL_STATUS], P_INT, NULL, NULL, NULL},
500         {"summary_col_pos_mime", "2",
501           &prefs_common.summary_col_pos[S_COL_MIME], P_INT, NULL, NULL, NULL},
502         {"summary_col_pos_subject", "3",
503           &prefs_common.summary_col_pos[S_COL_SUBJECT], P_INT, NULL, NULL, NULL},
504         {"summary_col_pos_from", "4",
505           &prefs_common.summary_col_pos[S_COL_FROM], P_INT, NULL, NULL, NULL},
506         {"summary_col_pos_date", "5",
507           &prefs_common.summary_col_pos[S_COL_DATE], P_INT, NULL, NULL, NULL},
508         {"summary_col_pos_size", "6",
509           &prefs_common.summary_col_pos[S_COL_SIZE], P_INT, NULL, NULL, NULL},
510         {"summary_col_pos_number", "7",
511           &prefs_common.summary_col_pos[S_COL_NUMBER], P_INT, NULL, NULL, NULL},
512         {"summary_col_pos_score", "8",
513          &prefs_common.summary_col_pos[S_COL_SCORE], P_INT, NULL, NULL, NULL},
514         {"summary_col_pos_locked", "9",
515          &prefs_common.summary_col_pos[S_COL_LOCKED], P_INT, NULL, NULL, NULL},
516         {"summary_col_pos_to", "10",
517           &prefs_common.summary_col_pos[S_COL_TO], P_INT, NULL, NULL, NULL},
518         {"summary_col_pos_tags", "11",
519           &prefs_common.summary_col_pos[S_COL_TAGS], P_INT, NULL, NULL, NULL},
520
521         {"summary_col_size_mark", "10",
522          &prefs_common.summary_col_size[S_COL_MARK], P_INT, NULL, NULL, NULL},
523         {"summary_col_size_unread", "13",
524          &prefs_common.summary_col_size[S_COL_STATUS], P_INT, NULL, NULL, NULL},
525         {"summary_col_size_mime", "10",
526          &prefs_common.summary_col_size[S_COL_MIME], P_INT, NULL, NULL, NULL},
527 #ifndef GENERIC_UMPC
528         {"summary_col_size_subject", "200",
529          &prefs_common.summary_col_size[S_COL_SUBJECT], P_INT, NULL, NULL, NULL},
530         {"summary_col_size_from", "120",
531          &prefs_common.summary_col_size[S_COL_FROM], P_INT, NULL, NULL, NULL},
532         {"summary_col_size_to", "120",
533          &prefs_common.summary_col_size[S_COL_TO], P_INT, NULL, NULL, NULL},
534 #else
535         {"summary_col_size_subject", "300",
536          &prefs_common.summary_col_size[S_COL_SUBJECT], P_INT, NULL, NULL, NULL},
537         {"summary_col_size_from", "150",
538          &prefs_common.summary_col_size[S_COL_FROM], P_INT, NULL, NULL, NULL},
539         {"summary_col_size_to", "150",
540          &prefs_common.summary_col_size[S_COL_TO], P_INT, NULL, NULL, NULL},
541
542 #endif
543         {"summary_col_size_date", "118",
544          &prefs_common.summary_col_size[S_COL_DATE], P_INT, NULL, NULL, NULL},
545         {"summary_col_size_size", "45",
546          &prefs_common.summary_col_size[S_COL_SIZE], P_INT, NULL, NULL, NULL},
547         {"summary_col_size_number", "40",
548          &prefs_common.summary_col_size[S_COL_NUMBER], P_INT, NULL, NULL, NULL},
549         {"summary_col_size_score", "40",
550          &prefs_common.summary_col_size[S_COL_SCORE], P_INT, NULL, NULL, NULL},
551         {"summary_col_size_locked", "13",
552          &prefs_common.summary_col_size[S_COL_LOCKED], P_INT, NULL, NULL, NULL},
553         {"summary_col_size_tags", "150",
554          &prefs_common.summary_col_size[S_COL_TAGS], P_INT, NULL, NULL, NULL},
555
556         /* Widget size */
557         {"folderwin_x", "16", &prefs_common.folderwin_x, P_INT,
558          NULL, NULL, NULL},
559         {"folderwin_y", "16", &prefs_common.folderwin_y, P_INT,
560          NULL, NULL, NULL},
561         {"folderview_width", "270", &prefs_common.folderview_width, P_INT,
562          NULL, NULL, NULL},
563         {"folderview_height", "450", &prefs_common.folderview_height, P_INT,
564          NULL, NULL, NULL},
565         {"folderview_visible", "TRUE", &prefs_common.folderview_visible, P_BOOL,
566          NULL, NULL, NULL},
567
568         {"folder_col_show_folder", "TRUE",
569          &prefs_common.folder_col_visible[F_COL_FOLDER], P_BOOL, NULL, NULL, NULL},
570         {"folder_col_show_new", "TRUE",
571          &prefs_common.folder_col_visible[F_COL_NEW], P_BOOL, NULL, NULL, NULL},
572         {"folder_col_show_unread", "TRUE",
573          &prefs_common.folder_col_visible[F_COL_UNREAD], P_BOOL, NULL, NULL, NULL},
574         {"folder_col_show_total", "TRUE",
575          &prefs_common.folder_col_visible[F_COL_TOTAL], P_BOOL, NULL, NULL, NULL},
576
577         {"folder_col_pos_folder", "0",
578          &prefs_common.folder_col_pos[F_COL_FOLDER], P_INT, NULL, NULL, NULL},
579         {"folder_col_pos_new", "1",
580          &prefs_common.folder_col_pos[F_COL_NEW], P_INT, NULL, NULL, NULL},
581         {"folder_col_pos_unread", "2",
582          &prefs_common.folder_col_pos[F_COL_UNREAD], P_INT, NULL, NULL, NULL},
583         {"folder_col_pos_total", "3",
584          &prefs_common.folder_col_pos[F_COL_TOTAL], P_INT, NULL, NULL, NULL},
585
586 #ifndef GENERIC_UMPC
587         {"folder_col_size_folder", "120",
588          &prefs_common.folder_col_size[F_COL_FOLDER], P_INT, NULL, NULL, NULL},
589         {"folder_col_size_new", "32",
590          &prefs_common.folder_col_size[F_COL_NEW], P_INT, NULL, NULL, NULL},
591         {"folder_col_size_unread", "32",
592          &prefs_common.folder_col_size[F_COL_UNREAD], P_INT, NULL, NULL, NULL},
593         {"folder_col_size_total", "32",
594          &prefs_common.folder_col_size[F_COL_TOTAL], P_INT, NULL, NULL, NULL},
595 #else
596         {"folder_col_size_folder", "400",
597          &prefs_common.folder_col_size[F_COL_FOLDER], P_INT, NULL, NULL, NULL},
598         {"folder_col_size_new", "32",
599          &prefs_common.folder_col_size[F_COL_NEW], P_INT, NULL, NULL, NULL},
600         {"folder_col_size_unread", "32",
601          &prefs_common.folder_col_size[F_COL_UNREAD], P_INT, NULL, NULL, NULL},
602         {"folder_col_size_total", "32",
603          &prefs_common.folder_col_size[F_COL_TOTAL], P_INT, NULL, NULL, NULL},
604 #endif
605         {"summaryview_width", "500", &prefs_common.summaryview_width, P_INT,
606          NULL, NULL, NULL},
607         {"summaryview_height", "244", &prefs_common.summaryview_height, P_INT,
608          NULL, NULL, NULL},
609
610         {"main_messagewin_x", "256", &prefs_common.main_msgwin_x, P_INT,
611          NULL, NULL, NULL},
612         {"main_messagewin_y", "210", &prefs_common.main_msgwin_y, P_INT,
613          NULL, NULL, NULL},
614         {"messageview_width", "500", &prefs_common.msgview_width, P_INT,
615          NULL, NULL, NULL},
616         {"messageview_height", "213", &prefs_common.msgview_height, P_INT,
617          NULL, NULL, NULL},
618         {"messageview_visible", "TRUE", &prefs_common.msgview_visible, P_BOOL,
619          NULL, NULL, NULL},
620
621         {"mainview_x", "64", &prefs_common.mainview_x, P_INT,
622          NULL, NULL, NULL},
623         {"mainview_y", "64", &prefs_common.mainview_y, P_INT,
624          NULL, NULL, NULL},
625         {"mainview_width", "500", &prefs_common.mainview_width, P_INT,
626          NULL, NULL, NULL},
627         {"mainview_height", "400", &prefs_common.mainview_height, P_INT,
628          NULL, NULL, NULL},
629         {"mainwin_x", "64", &prefs_common.mainwin_x, P_INT,
630          NULL, NULL, NULL},
631         {"mainwin_y", "64", &prefs_common.mainwin_y, P_INT,
632          NULL, NULL, NULL},
633         {"mainwin_maximised", "FALSE", &prefs_common.mainwin_maximised, P_BOOL,
634          NULL, NULL, NULL},
635         {"mainwin_fullscreen", "FALSE", &prefs_common.mainwin_fullscreen, P_BOOL,
636          NULL, NULL, NULL},
637 #ifndef GENERIC_UMPC
638         {"mainwin_width", "800", &prefs_common.mainwin_width, P_INT,
639          NULL, NULL, NULL},
640         {"mainwin_height", "600", &prefs_common.mainwin_height, P_INT,
641          NULL, NULL, NULL},
642         {"messagewin_width", "600", &prefs_common.msgwin_width, P_INT,
643          NULL, NULL, NULL},
644         {"messagewin_height", "540", &prefs_common.msgwin_height, P_INT,
645          NULL, NULL, NULL},
646         {"sourcewin_width", "600", &prefs_common.sourcewin_width, P_INT,
647          NULL, NULL, NULL},
648         {"sourcewin_height", "500", &prefs_common.sourcewin_height, P_INT,
649          NULL, NULL, NULL},
650         {"compose_width", "600", &prefs_common.compose_width, P_INT,
651          NULL, NULL, NULL},
652         {"compose_height", "560", &prefs_common.compose_height, P_INT,
653          NULL, NULL, NULL},
654 #else
655         {"mainwin_width", "700", &prefs_common.mainwin_width, P_INT,
656          NULL, NULL, NULL},
657         {"mainwin_height", "470", &prefs_common.mainwin_height, P_INT,
658          NULL, NULL, NULL},
659         {"messagewin_width", "700", &prefs_common.msgwin_width, P_INT,
660          NULL, NULL, NULL},
661         {"messagewin_height", "470", &prefs_common.msgwin_height, P_INT,
662          NULL, NULL, NULL},
663         {"sourcewin_width", "700", &prefs_common.sourcewin_width, P_INT,
664          NULL, NULL, NULL},
665         {"sourcewin_height", "470", &prefs_common.sourcewin_height, P_INT,
666          NULL, NULL, NULL},
667         {"compose_width", "700", &prefs_common.compose_width, P_INT,
668          NULL, NULL, NULL},
669         {"compose_height", "470", &prefs_common.compose_height, P_INT,
670          NULL, NULL, NULL},
671 #endif
672         {"compose_x", "0", &prefs_common.compose_x, P_INT,
673          NULL, NULL, NULL},
674         {"compose_y", "0", &prefs_common.compose_y, P_INT,
675          NULL, NULL, NULL},
676         /* Message */
677         {"enable_color", "TRUE", &prefs_common.enable_color, P_BOOL,
678          NULL, NULL, NULL},
679
680         {"quote_level1_color", "#0000b3", &prefs_common.quote_level1_col, P_COLOR,
681          NULL, NULL, NULL},
682         {"quote_level2_color", "#0000b3", &prefs_common.quote_level2_col, P_COLOR,
683          NULL, NULL, NULL},
684         {"quote_level3_color", "#0000b3", &prefs_common.quote_level3_col, P_COLOR,
685          NULL, NULL, NULL},
686         {"enable_bgcolor", "FALSE", &prefs_common.enable_bgcolor, P_BOOL,
687          NULL, NULL, NULL},
688         {"quote_level1_bgcolor", "#cccccc", &prefs_common.quote_level1_bgcol, P_COLOR,
689          NULL, NULL, NULL},
690         {"quote_level2_bgcolor", "#d4d4d4", &prefs_common.quote_level2_bgcol, P_COLOR,
691          NULL, NULL, NULL},
692         {"quote_level3_bgcolor", "#dddddd", &prefs_common.quote_level3_bgcol, P_COLOR,
693          NULL, NULL, NULL},
694         {"uri_color", "#007f00", &prefs_common.uri_col, P_COLOR,
695          NULL, NULL, NULL},
696         {"emphasis_color", "#0000cf", &prefs_common.emphasis_col, P_COLOR,
697          NULL, NULL, NULL},
698         {"target_folder_color", "#da1cca", &prefs_common.tgt_folder_col, P_COLOR,
699          NULL, NULL, NULL},
700         {"signature_color", "#797979", &prefs_common.signature_col, P_COLOR,
701          NULL, NULL, NULL},
702         {"recycle_quote_colors", "FALSE", &prefs_common.recycle_quote_colors,
703          P_BOOL, NULL, NULL, NULL},
704
705         {"display_header_pane", "FALSE", &prefs_common.display_header_pane,
706          P_BOOL, NULL, NULL, NULL},
707         {"display_header", "TRUE", &prefs_common.display_header, P_BOOL,
708          NULL, NULL, NULL},
709         {"display_xface", "TRUE", &prefs_common.display_xface,
710          P_BOOL, NULL, NULL, NULL},
711         {"render_html", "TRUE", &prefs_common.render_html, P_BOOL,
712          NULL, NULL, NULL},
713         {"invoke_plugin_on_html", "FALSE", &prefs_common.invoke_plugin_on_html, P_BOOL,
714          NULL, NULL, NULL},
715         {"promote_html_part", "FALSE", &prefs_common.promote_html_part, P_BOOL,
716          NULL, NULL, NULL},
717         {"line_space", "2", &prefs_common.line_space, P_INT,
718          NULL, NULL, NULL},
719         {"never_send_retrcpt", "FALSE", &prefs_common.never_send_retrcpt, P_BOOL,
720          NULL, NULL, NULL},
721
722         {"enable_smooth_scroll", "FALSE",
723          &prefs_common.enable_smooth_scroll, P_BOOL,
724          NULL, NULL, NULL},
725         {"scroll_step", "1", &prefs_common.scroll_step, P_INT,
726          NULL, NULL, NULL},
727         {"scroll_half_page", "FALSE", &prefs_common.scroll_halfpage, P_BOOL,
728          NULL, NULL, NULL},
729         {"respect_flowed_format", "FALSE", &prefs_common.respect_flowed_format, P_BOOL,
730          NULL, NULL, NULL},
731
732         {"show_other_header", "FALSE", &prefs_common.show_other_header, P_BOOL,
733          NULL, NULL, NULL},
734
735         {"attach_desc", "TRUE", &prefs_common.attach_desc, P_BOOL,
736          NULL, NULL, NULL},
737         {"attach_save_directory", NULL,
738          &SPECIFIC_PREFS.attach_save_dir, P_STRING, NULL, NULL, NULL},
739         {"attach_load_directory", NULL,
740          &SPECIFIC_PREFS.attach_load_dir, P_STRING, NULL, NULL, NULL},
741
742         /* MIME viewer */
743         {"mime_textviewer",   NULL,
744          &SPECIFIC_PREFS.mime_textviewer,   P_STRING, NULL, NULL, NULL},
745         {"mime_open_command", "gedit '%s'",
746          &SPECIFIC_PREFS.mime_open_cmd,     P_STRING, NULL, NULL, NULL},
747
748         /* Interface */
749 #ifndef GENERIC_UMPC
750         {"layout_mode", "0", &prefs_common.layout_mode, P_INT,
751          NULL, NULL, NULL},
752 #else
753         {"layout_mode", "5", &prefs_common.layout_mode, P_INT,
754          NULL, NULL, NULL},
755 #endif
756         /* {"emulate_emacs", "FALSE", &prefs_common.emulate_emacs, P_BOOL,
757          NULL, NULL, NULL}, */
758         {"always_show_message_when_selected", "0",
759          &prefs_common.always_show_msg,
760          P_ENUM, NULL, NULL, NULL},
761         {"select_on_entry", "3", &prefs_common.select_on_entry,
762          P_ENUM, NULL, NULL, NULL},
763         {"show_tooltips", "TRUE", &prefs_common.show_tooltips,
764          P_BOOL, NULL, NULL, NULL},
765
766         /* do it SUMMARY_OPEN_ACTIONS-1 times */
767         {"summary_select_prio1", "0", &prefs_common.summary_select_prio[0], P_ENUM,
768          NULL, NULL, NULL},
769         {"summary_select_prio2", "0", &prefs_common.summary_select_prio[1], P_ENUM,
770          NULL, NULL, NULL},
771         {"summary_select_prio3", "0", &prefs_common.summary_select_prio[2], P_ENUM,
772          NULL, NULL, NULL},
773         {"summary_select_prio4", "0", &prefs_common.summary_select_prio[3], P_ENUM,
774          NULL, NULL, NULL},
775         {"summary_select_prio5", "0", &prefs_common.summary_select_prio[4], P_ENUM,
776          NULL, NULL, NULL},
777         {"summary_select_prio6", "0", &prefs_common.summary_select_prio[5], P_ENUM,
778          NULL, NULL, NULL},
779         {"summary_select_prio7", "0", &prefs_common.summary_select_prio[6], P_ENUM,
780          NULL, NULL, NULL},
781
782         {"mark_as_read_on_new_window", "FALSE",
783          &prefs_common.mark_as_read_on_new_window,
784          P_BOOL, NULL, NULL, NULL},
785         {"mark_as_read_delay", "0",
786          &prefs_common.mark_as_read_delay, P_INT, 
787          NULL, NULL, NULL},
788         {"immediate_execution", "TRUE", &prefs_common.immediate_exec, P_BOOL,
789          NULL, NULL, NULL},
790         {"nextunreadmsg_dialog", "1", &prefs_common.next_unread_msg_dialog, P_ENUM,
791          NULL, NULL, NULL},
792
793         {"pixmap_theme_path", DEFAULT_PIXMAP_THEME, 
794          &SPECIFIC_PREFS.pixmap_theme_path, P_STRING,
795          NULL, NULL, NULL},
796
797         {"ask_mark_all_read", "TRUE", &prefs_common.ask_mark_all_read, P_BOOL,
798          NULL, NULL, NULL},
799
800         {"ask_apply_per_account_filtering_rules", "TRUE", &prefs_common.ask_apply_per_account_filtering_rules, P_BOOL,
801          NULL, NULL, NULL},
802         {"apply_per_account_filtering_rules", "0", &prefs_common.apply_per_account_filtering_rules, P_ENUM,
803          NULL, NULL, NULL},
804
805         /* Addressbook */
806         {"addressbook_use_editaddress_dialog", "TRUE", &prefs_common.addressbook_use_editaddress_dialog,
807          P_BOOL, NULL, NULL, NULL},
808         {"addressbook_hpaned_pos", "-1", &prefs_common.addressbook_hpaned_pos,
809          P_INT, NULL, NULL, NULL},
810         {"addressbook_vpaned_pos", "-1", &prefs_common.addressbook_vpaned_pos,
811          P_INT, NULL, NULL, NULL},
812
813         /* Other */
814 #ifndef G_OS_WIN32
815         {"uri_open_command", DEFAULT_BROWSER_CMD,
816          &SPECIFIC_PREFS.uri_cmd, P_STRING, NULL, NULL, NULL},
817         {"print_command", "lpr %s",
818          &SPECIFIC_PREFS.print_cmd, P_STRING, NULL, NULL, NULL},
819 #endif
820         {"ext_editor_command", DEFAULT_EDITOR_CMD,
821          &SPECIFIC_PREFS.ext_editor_cmd, P_STRING, NULL, NULL, NULL},
822         {"cmds_use_system_default", "FALSE",
823          &prefs_common.cmds_use_system_default, P_BOOL, NULL, NULL, NULL},
824         {"add_address_by_click", "FALSE", &prefs_common.add_address_by_click,
825          P_BOOL, NULL, NULL, NULL},
826         {"session_passwords", "FALSE", &prefs_common.session_passwords,
827          P_BOOL, NULL, NULL, NULL},
828         {"confirm_on_exit", "FALSE", &prefs_common.confirm_on_exit, P_BOOL,
829          NULL, NULL, NULL},
830         {"clean_trash_on_exit", "FALSE", &prefs_common.clean_on_exit, P_BOOL,
831          NULL, NULL, NULL},
832         {"ask_on_cleaning", "TRUE", &prefs_common.ask_on_clean, P_BOOL,
833          NULL, NULL, NULL},
834         {"warn_queued_on_exit", "TRUE", &prefs_common.warn_queued_on_exit,
835          P_BOOL, NULL, NULL, NULL},
836         {"work_offline", "FALSE", &prefs_common.work_offline, P_BOOL,
837          NULL, NULL, NULL},
838         {"summary_quicksearch_type", "0", &prefs_common.summary_quicksearch_type, P_INT,
839          NULL, NULL, NULL},
840 #ifndef GENERIC_UMPC
841         {"summary_quicksearch_recurse", "1", &prefs_common.summary_quicksearch_recurse, P_INT,
842          NULL, NULL, NULL},
843 #else
844         {"summary_quicksearch_recurse", "0", &prefs_common.summary_quicksearch_recurse, P_INT,
845          NULL, NULL, NULL},
846 #endif
847
848 #if defined(__OpenBSD__)
849         {"io_timeout_secs", "80", &prefs_common.io_timeout_secs,
850          P_INT, NULL, NULL, NULL},
851 #else
852         {"io_timeout_secs", "60", &prefs_common.io_timeout_secs,
853          P_INT, NULL, NULL, NULL},
854 #endif
855         {"hide_score", "-9999", &prefs_common.kill_score, P_INT,
856          NULL, NULL, NULL},
857         {"important_score", "1", &prefs_common.important_score, P_INT,
858          NULL, NULL, NULL},
859
860         {"clip_log", "TRUE", &prefs_common.cliplog, P_BOOL,
861          NULL, NULL, NULL},
862         {"log_length", "500", &prefs_common.loglength, P_INT,
863          NULL, NULL, NULL},
864 #ifndef GENERIC_UMPC
865         {"enable_log_standard", "TRUE", &prefs_common.enable_log_standard, P_BOOL,
866          NULL, NULL, NULL},
867         {"enable_log_warning", "TRUE", &prefs_common.enable_log_warning, P_BOOL,
868          NULL, NULL, NULL},
869         {"enable_log_error", "TRUE", &prefs_common.enable_log_error, P_BOOL,
870          NULL, NULL, NULL},
871         {"enable_log_status", "TRUE", &prefs_common.enable_log_status, P_BOOL,
872          NULL, NULL, NULL},
873 #else
874         {"enable_log_standard", "FALSE", &prefs_common.enable_log_standard, P_BOOL,
875          NULL, NULL, NULL},
876         {"enable_log_warning", "FALSE", &prefs_common.enable_log_warning, P_BOOL,
877          NULL, NULL, NULL},
878         {"enable_log_error", "FALSE", &prefs_common.enable_log_error, P_BOOL,
879          NULL, NULL, NULL},
880         {"enable_log_status", "FALSE", &prefs_common.enable_log_status, P_BOOL,
881          NULL, NULL, NULL},
882 #endif
883         {"log_msg_color", "#00af00", &prefs_common.log_msg_color, P_COLOR,
884          NULL, NULL, NULL},
885         {"log_warn_color", "#af0000", &prefs_common.log_warn_color, P_COLOR,
886          NULL, NULL, NULL},
887         {"log_error_color", "#af0000", &prefs_common.log_error_color, P_COLOR,
888          NULL, NULL, NULL},
889         {"log_in_color", "#000000", &prefs_common.log_in_color, P_COLOR,
890          NULL, NULL, NULL},
891         {"log_out_color", "#0000ef", &prefs_common.log_out_color, P_COLOR,
892          NULL, NULL, NULL},
893         {"log_status_ok_color", "#00af00", &prefs_common.log_status_ok_color, P_COLOR,
894          NULL, NULL, NULL},
895         {"log_status_nok_color", "#0000af", &prefs_common.log_status_nok_color, P_COLOR,
896          NULL, NULL, NULL},
897         {"log_status_skip_color", "#aa00aa", &prefs_common.log_status_skip_color, P_COLOR,
898          NULL, NULL, NULL},
899
900     {"enable_filtering_debug", "FALSE", &prefs_common.enable_filtering_debug, P_BOOL,
901          NULL, NULL, NULL},
902     {"filtering_debug_level", "1", &prefs_common.filtering_debug_level, P_INT,
903          NULL, NULL, NULL},
904     {"enable_filtering_debug_inc", "TRUE", &prefs_common.enable_filtering_debug_inc, P_BOOL,
905          NULL, NULL, NULL},
906     {"enable_filtering_debug_manual", "TRUE", &prefs_common.enable_filtering_debug_manual, P_BOOL,
907          NULL, NULL, NULL},
908     {"enable_filtering_debug_folder_proc", "FALSE", &prefs_common.enable_filtering_debug_folder_proc, P_BOOL,
909          NULL, NULL, NULL},
910     {"enable_filtering_debug_pre_proc", "FALSE", &prefs_common.enable_filtering_debug_pre_proc, P_BOOL,
911          NULL, NULL, NULL},
912     {"enable_filtering_debug_post_proc", "FALSE", &prefs_common.enable_filtering_debug_post_proc, P_BOOL,
913          NULL, NULL, NULL},
914     {"filtering_debug_clip_log", "TRUE", &prefs_common.filtering_debug_cliplog, P_BOOL,
915          NULL, NULL, NULL},
916         {"filtering_debug_log_length", "500", &prefs_common.filtering_debug_loglength, P_INT,
917          NULL, NULL, NULL},
918
919         {"gtk_can_change_accels", "TRUE", &prefs_common.gtk_can_change_accels, P_BOOL,
920          NULL, NULL, NULL},
921
922         {"color_new", "#0000b3", &prefs_common.color_new, P_COLOR,
923          NULL, NULL, NULL},
924
925         /* Some windows' sizes */
926         {"filteringwin_width", "500", &prefs_common.filteringwin_width, P_INT,
927          NULL, NULL, NULL},
928         {"filteringwin_height", "-1", &prefs_common.filteringwin_height, P_INT,
929          NULL, NULL, NULL},
930
931         {"filteringactionwin_width", "490", &prefs_common.filteringactionwin_width, P_INT,
932          NULL, NULL, NULL},
933         {"filteringactionwin_height", "-1", &prefs_common.filteringactionwin_height, P_INT,
934          NULL, NULL, NULL},
935
936         {"matcherwin_width", "520", &prefs_common.matcherwin_width, P_INT,
937          NULL, NULL, NULL},
938         {"matcherwin_height", "-1", &prefs_common.matcherwin_height, P_INT,
939          NULL, NULL, NULL},
940
941         {"templateswin_width", "480", &prefs_common.templateswin_width, P_INT,
942          NULL, NULL, NULL},
943         {"templateswin_height", "-1", &prefs_common.templateswin_height, P_INT,
944          NULL, NULL, NULL},
945
946         {"actionswin_width", "486", &prefs_common.actionswin_width, P_INT,
947          NULL, NULL, NULL},
948         {"actionswin_height", "-1", &prefs_common.actionswin_height, P_INT,
949          NULL, NULL, NULL},
950
951         {"tagswin_width", "486", &prefs_common.tagswin_width, P_INT,
952          NULL, NULL, NULL},
953         {"tagswin_height", "-1", &prefs_common.tagswin_height, P_INT,
954          NULL, NULL, NULL},
955
956         {"addressbookwin_width", "520", &prefs_common.addressbookwin_width, P_INT,
957          NULL, NULL, NULL},
958         {"addressbookwin_height", "-1", &prefs_common.addressbookwin_height, P_INT,
959          NULL, NULL, NULL},
960
961         {"addressbookeditpersonwin_width", "640", &prefs_common.addressbookeditpersonwin_width, P_INT,
962          NULL, NULL, NULL},
963         {"addressbookeditpersonwin_height", "320", &prefs_common.addressbookeditpersonwin_height, P_INT,
964          NULL, NULL, NULL},
965
966         {"addressbookeditgroupwin_width", "580", &prefs_common.addressbookeditgroupwin_width, P_INT,
967          NULL, NULL, NULL},
968         {"addressbookeditgroupwin_height", "340", &prefs_common.addressbookeditgroupwin_height, P_INT,
969          NULL, NULL, NULL},
970
971         {"pluginswin_width", "-1", &prefs_common.pluginswin_width, P_INT,
972          NULL, NULL, NULL},
973         {"pluginswin_height", "-1", &prefs_common.pluginswin_height, P_INT,
974          NULL, NULL, NULL},
975
976         {"prefswin_width", "600", &prefs_common.prefswin_width, P_INT,
977          NULL, NULL, NULL},
978         {"prefswin_height", "-1", &prefs_common.prefswin_height, P_INT,
979          NULL, NULL, NULL},
980
981         {"folderitemwin_width", "500", &prefs_common.folderitemwin_width, P_INT,
982          NULL, NULL, NULL},
983         {"folderitemwin_height", "-1", &prefs_common.folderitemwin_height, P_INT,
984          NULL, NULL, NULL},
985
986         {"zero_replacement_char", "0", &prefs_common.zero_replacement, P_STRING,
987          NULL, NULL, NULL},
988
989         {"editaccountwin_width", "500", &prefs_common.editaccountwin_width, P_INT,
990          NULL, NULL, NULL},
991         {"editaccountwin_height", "-1", &prefs_common.editaccountwin_height, P_INT,
992          NULL, NULL, NULL},
993
994         {"accountswin_width", "500", &prefs_common.accountswin_width, P_INT,
995          NULL, NULL, NULL},
996         {"accountswin_height", "-1", &prefs_common.accountswin_height, P_INT,
997          NULL, NULL, NULL},
998
999         {"logwin_width", "520", &prefs_common.logwin_width, P_INT,
1000          NULL, NULL, NULL},
1001         {"logwin_height", "-1", &prefs_common.logwin_height, P_INT,
1002          NULL, NULL, NULL},
1003
1004         {"filtering_debugwin_width", "600", &prefs_common.filtering_debugwin_width, P_INT,
1005          NULL, NULL, NULL},
1006         {"filtering_debugwin_height", "-1", &prefs_common.filtering_debugwin_height, P_INT,
1007          NULL, NULL, NULL},
1008
1009         {"folderselwin_width", "300", &prefs_common.folderselwin_width, P_INT,
1010          NULL, NULL, NULL},
1011         {"folderselwin_height", "-1", &prefs_common.folderselwin_height, P_INT,
1012          NULL, NULL, NULL},
1013
1014         {"addressaddwin_width", "300", &prefs_common.addressaddwin_width, P_INT,
1015          NULL, NULL, NULL},
1016         {"addressaddwin_height", "-1", &prefs_common.addressaddwin_height, P_INT,
1017          NULL, NULL, NULL},
1018
1019         {"addressbook_folderselwin_width", "300", &prefs_common.addressbook_folderselwin_width, P_INT,
1020          NULL, NULL, NULL},
1021         {"addressbook_folderselwin_height", "-1", &prefs_common.addressbook_folderselwin_height, P_INT,
1022          NULL, NULL, NULL},
1023
1024         /* Hidden */
1025         {"warn_dnd", "1", &prefs_common.warn_dnd, P_INT,
1026          NULL, NULL, NULL},
1027         {"utf8_instead_of_locale_for_broken_mail", "0", 
1028          &prefs_common.broken_are_utf8, P_INT,
1029          NULL, NULL, NULL},
1030         {"enable_swap_from", "FALSE", &prefs_common.swap_from, P_BOOL,
1031          NULL, NULL, NULL},
1032         {"use_stripes_everywhere", "TRUE", &prefs_common.use_stripes_everywhere, P_BOOL,
1033          NULL, NULL, NULL},
1034         {"use_stripes_in_summaries", "TRUE", &prefs_common.use_stripes_in_summaries, P_BOOL,
1035          NULL, NULL, NULL},
1036         {"stripes_color_offset", "4000", &prefs_common.stripes_color_offset, P_INT,
1037          NULL, NULL, NULL},
1038         {"enable_dotted_lines", "FALSE", &prefs_common.enable_dotted_lines, P_BOOL,
1039          NULL, NULL, NULL},
1040         {"enable_hscrollbar", "TRUE", &prefs_common.enable_hscrollbar, P_BOOL,
1041          NULL, NULL, NULL},
1042         {"folderview_vscrollbar_policy", "0",
1043          &prefs_common.folderview_vscrollbar_policy, P_ENUM,
1044          NULL, NULL, NULL},
1045         {"textview_cursor_visible", "FALSE",
1046          &prefs_common.textview_cursor_visible, P_BOOL,
1047          NULL, NULL, NULL},
1048         {"hover_timeout", "500", &prefs_common.hover_timeout, P_INT,
1049          NULL, NULL, NULL},
1050 #ifndef GENERIC_UMPC
1051         {"cache_max_mem_usage", "4096", &prefs_common.cache_max_mem_usage, P_INT,
1052          NULL, NULL, NULL},
1053         {"cache_min_keep_time", "15", &prefs_common.cache_min_keep_time, P_INT,
1054          NULL, NULL, NULL},
1055 #else
1056         {"cache_max_mem_usage", "4096", &prefs_common.cache_max_mem_usage, P_INT,
1057          NULL, NULL, NULL},
1058         {"cache_min_keep_time", "0", &prefs_common.cache_min_keep_time, P_INT,
1059          NULL, NULL, NULL},
1060 #endif
1061         {"thread_by_subject_max_age", "10", &prefs_common.thread_by_subject_max_age,
1062         P_INT, NULL, NULL, NULL },
1063         {"last_opened_folder", "", &prefs_common.last_opened_folder,
1064         P_STRING, NULL, NULL, NULL },
1065         {"goto_last_folder_on_startup", "FALSE", &prefs_common.goto_last_folder_on_startup,
1066         P_BOOL, NULL, NULL, NULL },
1067         {"summary_quicksearch_sticky", "1", &prefs_common.summary_quicksearch_sticky, P_INT,
1068          NULL, NULL, NULL},
1069         {"summary_quicksearch_dynamic", "0", &prefs_common.summary_quicksearch_dynamic, P_INT,
1070          NULL, NULL, NULL},
1071         {"summary_quicksearch_autorun", "0", &prefs_common.summary_quicksearch_autorun, P_INT,
1072          NULL, NULL, NULL},
1073         {"statusbar_update_step", "10", &prefs_common.statusbar_update_step, P_INT,
1074          NULL, NULL, NULL},
1075         {"compose_no_markup", "FALSE", &prefs_common.compose_no_markup, P_BOOL,
1076          NULL, NULL, NULL},
1077         {"skip_ssl_cert_check", "FALSE", &prefs_common.skip_ssl_cert_check, P_BOOL,
1078          NULL, NULL, NULL},
1079         {"live_dangerously", "FALSE", &prefs_common.live_dangerously, P_BOOL,
1080          NULL, NULL, NULL},
1081         {"save_parts_readwrite", "FALSE", &prefs_common.save_parts_readwrite, P_BOOL,
1082          NULL, NULL, NULL},
1083         {"hide_quotes", "0", &prefs_common.hide_quotes, P_INT,
1084          NULL, NULL, NULL},
1085         {"unsafe_ssl_certs", "FALSE", &prefs_common.unsafe_ssl_certs, P_BOOL,
1086          NULL, NULL, NULL},
1087 #ifndef GENERIC_UMPC
1088         {"real_time_sync", "FALSE", &prefs_common.real_time_sync, P_BOOL,
1089          NULL, NULL, NULL},
1090 #else
1091         {"real_time_sync", "TRUE", &prefs_common.real_time_sync, P_BOOL,
1092          NULL, NULL, NULL},
1093 #endif
1094
1095         {"print_paper_type", NULL, &prefs_common.print_paper_type, P_STRING,
1096          NULL, NULL, NULL},
1097         {"print_paper_orientation", "0", &prefs_common.print_paper_orientation, P_INT,
1098          NULL, NULL, NULL},
1099         {"print_margin_top", "-1", &prefs_common.print_margin_top, P_INT,
1100          NULL, NULL, NULL},
1101         {"print_margin_bottom", "-1", &prefs_common.print_margin_bottom, P_INT,
1102          NULL, NULL, NULL},
1103         {"print_margin_left", "-1", &prefs_common.print_margin_left, P_INT,
1104          NULL, NULL, NULL},
1105         {"print_margin_right", "-1", &prefs_common.print_margin_right, P_INT,
1106          NULL, NULL, NULL},
1107         {"print_use_color", "0", &prefs_common.print_use_color, P_INT,
1108          NULL, NULL, NULL},
1109         {"print_use_collate", "0", &prefs_common.print_use_collate, P_INT,
1110          NULL, NULL, NULL},
1111         {"print_use_reverse", "0", &prefs_common.print_use_reverse, P_INT,
1112          NULL, NULL, NULL},
1113         {"print_use_duplex", "0", &prefs_common.print_use_duplex, P_INT,
1114          NULL, NULL, NULL},
1115         {"print_imgs", "1", &prefs_common.print_imgs, P_INT,
1116          NULL, NULL, NULL},
1117         {"print_previewwin_width", "600", &prefs_common.print_previewwin_width, P_INT,
1118          NULL, NULL, NULL},
1119         {"print_previewwin_height", "-1", &prefs_common.print_previewwin_height, P_INT,
1120          NULL, NULL, NULL},
1121         {"use_networkmanager", "TRUE", &prefs_common.use_networkmanager, P_BOOL,
1122          NULL, NULL, NULL},
1123         {"use_shred", "FALSE", &prefs_common.use_shred, P_BOOL,
1124          NULL, NULL, NULL},
1125
1126         {"two_line_vertical", "TRUE", &prefs_common.two_line_vert,
1127         P_BOOL, NULL, NULL, NULL },
1128
1129         {"inherit_folder_properties", "FALSE", &prefs_common.inherit_folder_props, P_BOOL,
1130          NULL, NULL, NULL},
1131
1132         {NULL, NULL, NULL, P_OTHER, NULL, NULL, NULL}
1133 };
1134
1135 /*
1136  * Read history list from the specified history file in the specified directory (subdir of rc_dir)
1137  * Fallback to default_list if history file is not found
1138  */
1139 GList *prefs_common_read_history_from_dir_with_defaults(const gchar *dirname, const gchar *history,
1140                                                                                                                           GList *default_list)
1141 {
1142         FILE *fp;
1143         gchar *path;
1144         gchar buf[PREFSBUFSIZE];
1145         GList *tmp = NULL;
1146
1147         if (dirname) {
1148                 path = g_strconcat(get_rc_dir(), G_DIR_SEPARATOR_S, dirname,
1149                                    G_DIR_SEPARATOR_S, history,
1150                                    NULL);
1151         } else {
1152         path = g_strconcat(get_rc_dir(), G_DIR_SEPARATOR_S, history,
1153                            NULL);
1154         }
1155         if ((fp = g_fopen(path, "rb")) == NULL) {
1156                 if (ENOENT != errno) FILE_OP_ERROR(path, "fopen");
1157                 g_free(path);
1158                 /* returns default list if set, otherwise NULL */
1159                 return default_list;
1160         }
1161         g_free(path);
1162         while (fgets(buf, sizeof(buf), fp) != NULL) {
1163                 g_strstrip(buf);
1164                 if (buf[0] == '\0') continue;
1165                 tmp = add_history(tmp, buf);
1166         }
1167         fclose(fp);
1168
1169         tmp = g_list_reverse(tmp);
1170
1171         return tmp;
1172 }
1173
1174 /*
1175  * Read history list from the specified history file in the specified directory (subdir of rc_dir)
1176  */
1177 static GList *prefs_common_read_history_from_dir(const gchar *dirname, const gchar *history) 
1178 {
1179         return prefs_common_read_history_from_dir_with_defaults(dirname, history, NULL);
1180 }
1181
1182 /*
1183  * Read history list from the specified history file
1184  */
1185 static GList *prefs_common_read_history(const gchar *history) 
1186 {
1187         return prefs_common_read_history_from_dir(NULL, history);
1188 }
1189
1190 void prefs_common_read_config(void)
1191 {
1192         gchar *rcpath;
1193         gchar *tmp;
1194
1195         rcpath = g_strconcat(get_rc_dir(), G_DIR_SEPARATOR_S, COMMON_RC, NULL);
1196         prefs_read_config(param, "Common", rcpath, NULL);
1197 #ifdef G_OS_WIN32
1198         prefs_read_config(param_os_specific, "CommonWin32", rcpath, NULL);
1199 #endif
1200
1201         g_free(rcpath);
1202
1203         tmp = g_strdup(gettext(prefs_common.date_format));
1204         g_free(prefs_common.date_format);
1205         prefs_common.date_format = tmp;
1206
1207         prefs_common.mime_open_cmd_history =
1208                 prefs_common_read_history(COMMAND_HISTORY);
1209         prefs_common.summary_quicksearch_history =
1210                 prefs_common_read_history(QUICKSEARCH_HISTORY);
1211         prefs_common.summary_search_from_history =
1212                 prefs_common_read_history(SUMMARY_SEARCH_FROM_HISTORY);
1213         prefs_common.summary_search_to_history =
1214                 prefs_common_read_history(SUMMARY_SEARCH_TO_HISTORY);
1215         prefs_common.summary_search_subject_history =
1216                 prefs_common_read_history(SUMMARY_SEARCH_SUBJECT_HISTORY);
1217         prefs_common.summary_search_body_history =
1218                 prefs_common_read_history(SUMMARY_SEARCH_BODY_HISTORY);
1219         prefs_common.summary_search_adv_condition_history =
1220                 prefs_common_read_history(SUMMARY_SEARCH_ADV_CONDITION_HISTORY);
1221         prefs_common.message_search_history =
1222                 prefs_common_read_history(MESSAGE_SEARCH_HISTORY);
1223         prefs_common.compose_save_to_history =
1224                 prefs_common_read_history(COMPOSE_SAVE_TO_HISTORY);
1225
1226         prefs_common.addressbook_custom_attributes = addressbook_update_custom_attr_from_prefs();
1227
1228         colorlabel_update_colortable_from_prefs();
1229 }
1230
1231 #define TRY(func) \
1232 if (!(func)) \
1233 { \
1234         g_warning("failed to write\n"); \
1235         goto out;                       \
1236 } \
1237
1238 /*
1239  * Save history list to the specified history file in the specified directory (subdir of rc_dir)
1240  */
1241 static void prefs_common_save_history_to_dir(const gchar *dirname, const gchar *history, GList *list)
1242 {
1243         GList *cur;
1244         FILE *fp;
1245         gchar *path, *tmp_path;
1246
1247         if (dirname) {
1248                 path = g_strconcat(get_rc_dir(), G_DIR_SEPARATOR_S, dirname,
1249                                    G_DIR_SEPARATOR_S, history,
1250                                    NULL);
1251         } else {
1252         path = g_strconcat(get_rc_dir(), G_DIR_SEPARATOR_S, history,
1253                            NULL);
1254         }
1255         tmp_path = g_strconcat(path, ".tmp", NULL);
1256
1257         if ((fp = g_fopen(tmp_path, "wb")) == NULL) {
1258                 FILE_OP_ERROR(tmp_path, "fopen");
1259                 goto out;
1260         }
1261
1262         for (cur = list; cur != NULL; cur = cur->next) {
1263                 TRY(fputs((gchar *)cur->data, fp) != EOF &&
1264                     fputc('\n', fp) != EOF);
1265         }
1266
1267         if (fclose(fp) == EOF) {
1268                 FILE_OP_ERROR(tmp_path, "fclose");
1269                 fp = NULL;
1270                 goto out;
1271         }
1272         fp = NULL;
1273 #ifdef G_OS_WIN32
1274         claws_unlink(path);
1275 #endif
1276         if (g_rename(tmp_path, path) < 0) {
1277                 FILE_OP_ERROR(path, "rename");
1278                 goto out;
1279         }
1280
1281 out:
1282         if (fp)
1283                 fclose(fp);
1284         g_free(tmp_path);
1285         g_free(path);
1286 }
1287
1288 /*
1289  * Save history list to the specified history file
1290  */
1291 static void prefs_common_save_history(const gchar *history, GList *list)
1292 {
1293         prefs_common_save_history_to_dir(NULL, history, list);
1294 }
1295
1296 #undef TRY
1297
1298 void prefs_common_write_config(void)
1299 {
1300         prefs_write_config(param, "Common", COMMON_RC);
1301 #ifdef G_OS_WIN32
1302         prefs_write_config(param_os_specific, "CommonWin32", COMMON_RC);
1303 #endif
1304
1305         prefs_common_save_history(COMMAND_HISTORY, 
1306                 prefs_common.mime_open_cmd_history);
1307         prefs_common_save_history(QUICKSEARCH_HISTORY, 
1308                 prefs_common.summary_quicksearch_history);
1309         prefs_common_save_history(SUMMARY_SEARCH_FROM_HISTORY, 
1310                 prefs_common.summary_search_from_history);
1311         prefs_common_save_history(SUMMARY_SEARCH_TO_HISTORY, 
1312                 prefs_common.summary_search_to_history);
1313         prefs_common_save_history(SUMMARY_SEARCH_SUBJECT_HISTORY, 
1314                 prefs_common.summary_search_subject_history);
1315         prefs_common_save_history(SUMMARY_SEARCH_BODY_HISTORY, 
1316                 prefs_common.summary_search_body_history);
1317         prefs_common_save_history(SUMMARY_SEARCH_ADV_CONDITION_HISTORY, 
1318                 prefs_common.summary_search_adv_condition_history);
1319         prefs_common_save_history(MESSAGE_SEARCH_HISTORY, 
1320                 prefs_common.message_search_history);
1321         prefs_common_save_history(COMPOSE_SAVE_TO_HISTORY, 
1322                 prefs_common.compose_save_to_history);
1323
1324         prefs_common_save_history_to_dir(ADDRBOOK_DIR,
1325                 ADDRESSBOOK_CUSTOM_ATTRIBUTES, 
1326                 prefs_common.addressbook_custom_attributes);
1327 }
1328
1329 /* make a copy of string 'in' into buffer 'out'. un-escape \ sequences.
1330    both 'in' and 'out' must be non-NULL.
1331    'out' must be a pointer to a buffer whose size is at least equal
1332    to strlen(txt)+1, this buffer will get cleared. out's contents
1333    will always get set to a valid string, even if it's "".*/
1334 void pref_get_unescaped_pref(gchar *out, const gchar *in)
1335 {
1336         const gchar *i;
1337         gchar *o;
1338
1339         *out = '\0';
1340
1341         g_return_if_fail( in != NULL );
1342         g_return_if_fail( out != NULL );
1343
1344         i = in;
1345         o = out;
1346         memset(out, 0, strlen(in)+1);
1347         while (*i != '\0') {
1348                 if (*i == '\\' && *(i+1) == 'n') {
1349                         *o++ = '\n';
1350                         i++;
1351                 } else if (*i == '\\' && *(i+1) == 't') {
1352                         *o++ = '\t';
1353                         i++;
1354                 } else if (*i == '\\' && *(i+1) == '\\') {
1355                         *o++ = '\\';
1356                         i++;
1357                 } else {
1358                         *o++ = *i;
1359                 }
1360                 i++;
1361         }
1362         *o='\0';
1363 }
1364
1365 /* make a copy of string 'in' into buffer 'out'. escape \ sequences.
1366    both 'in' and 'out' must be non-NULL.
1367    'out' must be a pointer to a buffer whose size is at least equal
1368    to 2*strlen(txt)+1. out's contents will always get set to a valid
1369    string, even if it's "". */
1370 void pref_get_escaped_pref(gchar *out, const gchar *in)
1371 {
1372         const gchar *i;
1373         gchar *o;
1374
1375         *out = '\0';
1376
1377         g_return_if_fail( in != NULL );
1378         g_return_if_fail( out != NULL );
1379
1380         i = in;
1381         o = out;
1382         while (*i != '\0') {
1383                 if (*i == '\n') {
1384                         *o++ = '\\';
1385                         *o++ = 'n';
1386                 } else if (*i == '\t') {
1387                         *o++ = '\\';
1388                         *o++ = 't';
1389                 } else if (*i == '\\') {
1390                         *o++ = '\\';
1391                         *o++ = '\\';
1392                 } else {
1393                         *o++ = *i;
1394                 }
1395                 i++;
1396         }
1397         *o = '\0';
1398 }
1399                 
1400 /* set the contents of a textview widget from the internal \-escaped
1401   representation of a pref string. both txt and textview must be non-NULL. */
1402 void pref_set_textview_from_pref(GtkTextView *textview, const gchar *txt)
1403 {
1404         GtkTextBuffer *buffer;
1405         gchar *out = NULL;
1406
1407         g_return_if_fail( textview != NULL );
1408
1409         buffer = gtk_text_view_get_buffer(textview);
1410
1411         if (!txt) {
1412                 gtk_text_buffer_set_text(buffer, "", -1);
1413         } else {
1414                 out = malloc(strlen(txt)+1);
1415
1416                 pref_get_unescaped_pref(out, txt);
1417
1418                 gtk_text_buffer_set_text(buffer, out?out:"", -1);
1419                 g_free(out);
1420         }
1421 }
1422
1423 /* set the contents of a gtkentry widget from the internal \-escaped
1424   representation of a pref string. both txt and entry must be non-NULL. */
1425 void pref_set_entry_from_pref(GtkEntry *entry, const gchar *txt)
1426 {
1427         gchar *out = NULL;
1428
1429         g_return_if_fail( entry != NULL );
1430         if (!txt) {
1431                 gtk_entry_set_text(entry, "");
1432         } else {
1433                 out = malloc(strlen(txt)+1);
1434
1435                 pref_get_unescaped_pref(out, txt);
1436
1437                 gtk_entry_set_text(entry, out?out:"");
1438                 g_free(out);
1439         }
1440 }
1441
1442 /* get the \-escaped internal representation of a pref from the contents of
1443    a textview widget. textview must be non-NULL. */
1444 gchar *pref_get_pref_from_textview(GtkTextView *textview) 
1445 {
1446         GtkTextBuffer *buffer;
1447         GtkTextIter start, end;
1448         gchar *out, *tmp;
1449         
1450         g_return_val_if_fail( textview != NULL, "" );
1451
1452         buffer = gtk_text_view_get_buffer(textview);
1453         gtk_text_buffer_get_start_iter(buffer, &start);
1454         gtk_text_buffer_get_iter_at_offset(buffer, &end, -1);
1455         tmp = gtk_text_buffer_get_text(buffer, &start, &end, FALSE);
1456         out = malloc(2*strlen(tmp)+1);
1457         
1458         pref_get_escaped_pref(out, tmp);
1459         g_free(tmp);
1460
1461         return out?out:"";
1462 }
1463
1464 /* get the \-escaped internal representation of a pref from the contents of
1465    a gtkentry widget. entry must be non-NULL. */
1466 gchar *pref_get_pref_from_entry(GtkEntry *entry) 
1467 {
1468         gchar *out, *tmp;
1469
1470         g_return_val_if_fail( entry != NULL, "" );
1471
1472         tmp = gtk_editable_get_chars(GTK_EDITABLE(entry), 0, -1);
1473         out = malloc(2*strlen(tmp)+1);
1474
1475         pref_get_escaped_pref(out, tmp);
1476         g_free(tmp);
1477
1478         return out?out:"";
1479 }
1480
1481 /* ugly hack to be able to get this pref from ssl_certificate.c */
1482 gboolean prefs_common_unsafe_ssl_certs(void)
1483 {
1484         return prefs_common.unsafe_ssl_certs;
1485 }
1486
1487 gboolean prefs_common_enable_log_standard(void)
1488 {
1489         return prefs_common.enable_log_standard;
1490 }
1491
1492 gboolean prefs_common_enable_log_warning(void)
1493 {
1494         return prefs_common.enable_log_warning;
1495 }
1496 gboolean prefs_common_enable_log_error(void)
1497 {
1498         return prefs_common.enable_log_error;
1499 }
1500 gboolean prefs_common_enable_log_status(void)
1501 {
1502         return prefs_common.enable_log_status;
1503 }
1504
1505 #ifdef MAEMO
1506 const gchar *prefs_common_get_data_root(void)
1507 {
1508         if (prefs_common.data_root && *prefs_common.data_root)
1509                 return prefs_common.data_root;
1510         else
1511                 return NULL;
1512 }
1513 #endif
1514 /**
1515    return the translated name of a header, if the translate_header option is
1516    set, otherwise return the untranslated header name (header_name itself).
1517    this function is provided for convenience, it's an interface to
1518    prefs_common.trans_hdr.
1519    works with header names either with or without trailing colon, provided
1520    that gettext found such header name in the sources (they should all be
1521    found in src/gtk/headers.h anyway).
1522 */
1523 const gchar *prefs_common_translated_header_name(const gchar *header_name)
1524 {
1525         if (header_name == NULL || *header_name == '\0')
1526                 return header_name;
1527
1528         return prefs_common.trans_hdr ? gettext(header_name) : header_name;
1529 }
1530
1531 const gchar *prefs_common_get_uri_cmd(void)
1532 {
1533 #ifdef G_OS_WIN32
1534         return NULL;
1535 #else
1536         gchar *tmp = NULL;
1537         
1538         if (!prefs_common.cmds_use_system_default)
1539                 return prefs_common.uri_cmd;
1540         
1541         tmp = g_find_program_in_path("xdg-open");
1542         if (!tmp) 
1543                 return prefs_common.uri_cmd;
1544         
1545         g_free(tmp);
1546         return "xdg-open %s";
1547 #endif
1548 }
1549
1550 const gchar *prefs_common_get_ext_editor_cmd(void)
1551 {
1552         return prefs_common.ext_editor_cmd;
1553 #if 0 /* we should do that, but it detaches the editor and breaks
1554          compose.c's external composition. */
1555         gchar *tmp = NULL;
1556         
1557         if (!prefs_common.cmds_use_system_default)
1558                 return prefs_common.ext_editor_cmd;
1559         
1560         tmp = g_find_program_in_path("xdg-open");
1561         if (!tmp) 
1562                 return prefs_common.ext_editor_cmd;
1563         
1564         g_free(tmp);
1565         return "xdg-open %s";
1566 #endif 
1567 }
1568
1569 gboolean prefs_common_get_use_shred(void)
1570 {
1571         return prefs_common.use_shred;
1572 }
1573
1574 PrefsCommon *prefs_common_get_prefs(void)
1575 {
1576         return &prefs_common;
1577 }