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