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