bf273a9f28c624eaf5dce484f5030262d6a7a0f0
[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         {"open_selected_message_on_folder_open", "FALSE",
790          &prefs_common.open_selected_on_folder_open,
791          P_BOOL, NULL, NULL, NULL},
792         {"always_show_message_when_selected", "0",
793          &prefs_common.always_show_msg,
794          P_ENUM, NULL, NULL, NULL},
795         {"select_on_entry", "3", &prefs_common.select_on_entry,
796          P_ENUM, NULL, NULL, NULL},
797         {"show_tooltips", "TRUE", &prefs_common.show_tooltips,
798          P_BOOL, NULL, NULL, NULL},
799
800         /* do it SUMMARY_OPEN_ACTIONS-1 times */
801         {"summary_select_prio1", "0", &prefs_common.summary_select_prio[0], P_ENUM,
802          NULL, NULL, NULL},
803         {"summary_select_prio2", "0", &prefs_common.summary_select_prio[1], P_ENUM,
804          NULL, NULL, NULL},
805         {"summary_select_prio3", "0", &prefs_common.summary_select_prio[2], P_ENUM,
806          NULL, NULL, NULL},
807         {"summary_select_prio4", "0", &prefs_common.summary_select_prio[3], P_ENUM,
808          NULL, NULL, NULL},
809         {"summary_select_prio5", "0", &prefs_common.summary_select_prio[4], P_ENUM,
810          NULL, NULL, NULL},
811         {"summary_select_prio6", "0", &prefs_common.summary_select_prio[5], P_ENUM,
812          NULL, NULL, NULL},
813         {"summary_select_prio7", "0", &prefs_common.summary_select_prio[6], P_ENUM,
814          NULL, NULL, NULL},
815
816         {"mark_as_read_on_new_window", "FALSE",
817          &prefs_common.mark_as_read_on_new_window,
818          P_BOOL, NULL, NULL, NULL},
819         {"mark_as_read_delay", "0",
820          &prefs_common.mark_as_read_delay, P_INT, 
821          NULL, NULL, NULL},
822         {"immediate_execution", "TRUE", &prefs_common.immediate_exec, P_BOOL,
823          NULL, NULL, NULL},
824         {"nextunreadmsg_dialog", "1", &prefs_common.next_unread_msg_dialog, P_ENUM,
825          NULL, NULL, NULL},
826         {"summary_from_show", "0", &prefs_common.summary_from_show, P_ENUM,
827          NULL, NULL, NULL},
828
829         {"pixmap_theme_path", DEFAULT_PIXMAP_THEME, 
830          &SPECIFIC_PREFS.pixmap_theme_path, P_STRING,
831          NULL, NULL, NULL},
832
833         {"ask_mark_all_read", "TRUE", &prefs_common.ask_mark_all_read, P_BOOL,
834          NULL, NULL, NULL},
835
836         {"ask_apply_per_account_filtering_rules", "TRUE", &prefs_common.ask_apply_per_account_filtering_rules, P_BOOL,
837          NULL, NULL, NULL},
838         {"apply_per_account_filtering_rules", "0", &prefs_common.apply_per_account_filtering_rules, P_ENUM,
839          NULL, NULL, NULL},
840
841         /* Addressbook */
842         {"addressbook_use_editaddress_dialog", "TRUE", &prefs_common.addressbook_use_editaddress_dialog,
843          P_BOOL, NULL, NULL, NULL},
844         {"addressbook_hpaned_pos", "-1", &prefs_common.addressbook_hpaned_pos,
845          P_INT, NULL, NULL, NULL},
846         {"addressbook_vpaned_pos", "-1", &prefs_common.addressbook_vpaned_pos,
847          P_INT, NULL, NULL, NULL},
848
849         /* Other */
850 #ifndef G_OS_WIN32
851         {"uri_open_command", DEFAULT_BROWSER_CMD,
852          &SPECIFIC_PREFS.uri_cmd, P_STRING, NULL, NULL, NULL},
853 #else
854         {"gtk_theme", DEFAULT_W32_GTK_THEME,
855          &SPECIFIC_PREFS.gtk_theme, P_STRING, NULL, NULL, NULL},
856 #endif
857         {"ext_editor_command", DEFAULT_EDITOR_CMD,
858          &SPECIFIC_PREFS.ext_editor_cmd, P_STRING, NULL, NULL, NULL},
859         {"cmds_use_system_default", "TRUE",
860          &prefs_common.cmds_use_system_default, P_BOOL, NULL, NULL, NULL},
861         {"add_address_by_click", "FALSE", &prefs_common.add_address_by_click,
862          P_BOOL, NULL, NULL, NULL},
863         {"session_passwords", "FALSE", &prefs_common.session_passwords,
864          P_BOOL, NULL, NULL, NULL},
865         {"confirm_on_exit", "FALSE", &prefs_common.confirm_on_exit, P_BOOL,
866          NULL, NULL, NULL},
867         {"clean_trash_on_exit", "FALSE", &prefs_common.clean_on_exit, P_BOOL,
868          NULL, NULL, NULL},
869         {"ask_on_cleaning", "TRUE", &prefs_common.ask_on_clean, P_BOOL,
870          NULL, NULL, NULL},
871         {"warn_queued_on_exit", "TRUE", &prefs_common.warn_queued_on_exit,
872          P_BOOL, NULL, NULL, NULL},
873         {"work_offline", "FALSE", &prefs_common.work_offline, P_BOOL,
874          NULL, NULL, NULL},
875         {"summary_quicksearch_type", "0", &prefs_common.summary_quicksearch_type, P_INT,
876          NULL, NULL, NULL},
877 #ifndef GENERIC_UMPC
878         {"summary_quicksearch_recurse", "1", &prefs_common.summary_quicksearch_recurse, P_INT,
879          NULL, NULL, NULL},
880 #else
881         {"summary_quicksearch_recurse", "0", &prefs_common.summary_quicksearch_recurse, P_INT,
882          NULL, NULL, NULL},
883 #endif
884
885 #if defined(__OpenBSD__)
886         {"io_timeout_secs", "80", &prefs_common.io_timeout_secs,
887          P_INT, NULL, NULL, NULL},
888 #else
889         {"io_timeout_secs", "60", &prefs_common.io_timeout_secs,
890          P_INT, NULL, NULL, NULL},
891 #endif
892         {"hide_score", "-9999", &prefs_common.kill_score, P_INT,
893          NULL, NULL, NULL},
894         {"important_score", "1", &prefs_common.important_score, P_INT,
895          NULL, NULL, NULL},
896
897         {"clip_log", "TRUE", &prefs_common.cliplog, P_BOOL,
898          NULL, NULL, NULL},
899         {"log_length", "500", &prefs_common.loglength, P_INT,
900          NULL, NULL, NULL},
901 #ifndef GENERIC_UMPC
902         {"enable_log_standard", "TRUE", &prefs_common.enable_log_standard, P_BOOL,
903          NULL, NULL, NULL},
904         {"enable_log_warning", "TRUE", &prefs_common.enable_log_warning, P_BOOL,
905          NULL, NULL, NULL},
906         {"enable_log_error", "TRUE", &prefs_common.enable_log_error, P_BOOL,
907          NULL, NULL, NULL},
908         {"enable_log_status", "TRUE", &prefs_common.enable_log_status, P_BOOL,
909          NULL, NULL, NULL},
910 #else
911         {"enable_log_standard", "FALSE", &prefs_common.enable_log_standard, P_BOOL,
912          NULL, NULL, NULL},
913         {"enable_log_warning", "FALSE", &prefs_common.enable_log_warning, P_BOOL,
914          NULL, NULL, NULL},
915         {"enable_log_error", "FALSE", &prefs_common.enable_log_error, P_BOOL,
916          NULL, NULL, NULL},
917         {"enable_log_status", "FALSE", &prefs_common.enable_log_status, P_BOOL,
918          NULL, NULL, NULL},
919 #endif
920         {"log_msg_color", "#00af00", &prefs_common.log_msg_color, P_COLOR,
921          NULL, NULL, NULL},
922         {"log_warn_color", "#af0000", &prefs_common.log_warn_color, P_COLOR,
923          NULL, NULL, NULL},
924         {"log_error_color", "#af0000", &prefs_common.log_error_color, P_COLOR,
925          NULL, NULL, NULL},
926         {"log_in_color", "#000000", &prefs_common.log_in_color, P_COLOR,
927          NULL, NULL, NULL},
928         {"log_out_color", "#0000ef", &prefs_common.log_out_color, P_COLOR,
929          NULL, NULL, NULL},
930         {"log_status_ok_color", "#00af00", &prefs_common.log_status_ok_color, P_COLOR,
931          NULL, NULL, NULL},
932         {"log_status_nok_color", "#0000af", &prefs_common.log_status_nok_color, P_COLOR,
933          NULL, NULL, NULL},
934         {"log_status_skip_color", "#aa00aa", &prefs_common.log_status_skip_color, P_COLOR,
935          NULL, NULL, NULL},
936
937     {"enable_filtering_debug", "FALSE", &prefs_common.enable_filtering_debug, P_BOOL,
938          NULL, NULL, NULL},
939     {"filtering_debug_level", "1", &prefs_common.filtering_debug_level, P_INT,
940          NULL, NULL, NULL},
941     {"enable_filtering_debug_inc", "TRUE", &prefs_common.enable_filtering_debug_inc, P_BOOL,
942          NULL, NULL, NULL},
943     {"enable_filtering_debug_manual", "TRUE", &prefs_common.enable_filtering_debug_manual, P_BOOL,
944          NULL, NULL, NULL},
945     {"enable_filtering_debug_folder_proc", "FALSE", &prefs_common.enable_filtering_debug_folder_proc, P_BOOL,
946          NULL, NULL, NULL},
947     {"enable_filtering_debug_pre_proc", "FALSE", &prefs_common.enable_filtering_debug_pre_proc, P_BOOL,
948          NULL, NULL, NULL},
949     {"enable_filtering_debug_post_proc", "FALSE", &prefs_common.enable_filtering_debug_post_proc, P_BOOL,
950          NULL, NULL, NULL},
951     {"filtering_debug_clip_log", "TRUE", &prefs_common.filtering_debug_cliplog, P_BOOL,
952          NULL, NULL, NULL},
953         {"filtering_debug_log_length", "500", &prefs_common.filtering_debug_loglength, P_INT,
954          NULL, NULL, NULL},
955
956         {"gtk_can_change_accels", "FALSE", &prefs_common.gtk_can_change_accels, P_BOOL,
957          NULL, NULL, NULL},
958
959         {"color_new", "#0000b3", &prefs_common.color_new, P_COLOR,
960          NULL, NULL, NULL},
961
962         /* Some windows' sizes */
963         {"filteringwin_width", "500", &prefs_common.filteringwin_width, P_INT,
964          NULL, NULL, NULL},
965         {"filteringwin_height", "-1", &prefs_common.filteringwin_height, P_INT,
966          NULL, NULL, NULL},
967
968         {"filteringactionwin_width", "490", &prefs_common.filteringactionwin_width, P_INT,
969          NULL, NULL, NULL},
970         {"filteringactionwin_height", "-1", &prefs_common.filteringactionwin_height, P_INT,
971          NULL, NULL, NULL},
972
973         {"matcherwin_width", "520", &prefs_common.matcherwin_width, P_INT,
974          NULL, NULL, NULL},
975         {"matcherwin_height", "-1", &prefs_common.matcherwin_height, P_INT,
976          NULL, NULL, NULL},
977
978         {"templateswin_width", "480", &prefs_common.templateswin_width, P_INT,
979          NULL, NULL, NULL},
980         {"templateswin_height", "-1", &prefs_common.templateswin_height, P_INT,
981          NULL, NULL, NULL},
982
983         {"actionswin_width", "486", &prefs_common.actionswin_width, P_INT,
984          NULL, NULL, NULL},
985         {"actionswin_height", "-1", &prefs_common.actionswin_height, P_INT,
986          NULL, NULL, NULL},
987
988         {"tagswin_width", "486", &prefs_common.tagswin_width, P_INT,
989          NULL, NULL, NULL},
990         {"tagswin_height", "-1", &prefs_common.tagswin_height, P_INT,
991          NULL, NULL, NULL},
992
993         {"addressbookwin_width", "520", &prefs_common.addressbookwin_width, P_INT,
994          NULL, NULL, NULL},
995         {"addressbookwin_height", "-1", &prefs_common.addressbookwin_height, P_INT,
996          NULL, NULL, NULL},
997
998         {"addressbookeditpersonwin_width", "640", &prefs_common.addressbookeditpersonwin_width, P_INT,
999          NULL, NULL, NULL},
1000         {"addressbookeditpersonwin_height", "320", &prefs_common.addressbookeditpersonwin_height, P_INT,
1001          NULL, NULL, NULL},
1002
1003         {"addressbookeditgroupwin_width", "580", &prefs_common.addressbookeditgroupwin_width, P_INT,
1004          NULL, NULL, NULL},
1005         {"addressbookeditgroupwin_height", "340", &prefs_common.addressbookeditgroupwin_height, P_INT,
1006          NULL, NULL, NULL},
1007
1008         {"pluginswin_width", "-1", &prefs_common.pluginswin_width, P_INT,
1009          NULL, NULL, NULL},
1010         {"pluginswin_height", "-1", &prefs_common.pluginswin_height, P_INT,
1011          NULL, NULL, NULL},
1012
1013         {"prefswin_width", "600", &prefs_common.prefswin_width, P_INT,
1014          NULL, NULL, NULL},
1015         {"prefswin_height", "-1", &prefs_common.prefswin_height, P_INT,
1016          NULL, NULL, NULL},
1017
1018         {"folderitemwin_width", "500", &prefs_common.folderitemwin_width, P_INT,
1019          NULL, NULL, NULL},
1020         {"folderitemwin_height", "-1", &prefs_common.folderitemwin_height, P_INT,
1021          NULL, NULL, NULL},
1022
1023         {"zero_replacement_char", "0", &prefs_common.zero_replacement, P_STRING,
1024          NULL, NULL, NULL},
1025
1026         {"editaccountwin_width", "500", &prefs_common.editaccountwin_width, P_INT,
1027          NULL, NULL, NULL},
1028         {"editaccountwin_height", "-1", &prefs_common.editaccountwin_height, P_INT,
1029          NULL, NULL, NULL},
1030
1031         {"accountswin_width", "500", &prefs_common.accountswin_width, P_INT,
1032          NULL, NULL, NULL},
1033         {"accountswin_height", "-1", &prefs_common.accountswin_height, P_INT,
1034          NULL, NULL, NULL},
1035
1036         {"logwin_width", "520", &prefs_common.logwin_width, P_INT,
1037          NULL, NULL, NULL},
1038         {"logwin_height", "-1", &prefs_common.logwin_height, P_INT,
1039          NULL, NULL, NULL},
1040
1041         {"filtering_debugwin_width", "600", &prefs_common.filtering_debugwin_width, P_INT,
1042          NULL, NULL, NULL},
1043         {"filtering_debugwin_height", "-1", &prefs_common.filtering_debugwin_height, P_INT,
1044          NULL, NULL, NULL},
1045
1046         {"folderselwin_width", "300", &prefs_common.folderselwin_width, P_INT,
1047          NULL, NULL, NULL},
1048         {"folderselwin_height", "-1", &prefs_common.folderselwin_height, P_INT,
1049          NULL, NULL, NULL},
1050
1051         {"addressaddwin_width", "300", &prefs_common.addressaddwin_width, P_INT,
1052          NULL, NULL, NULL},
1053         {"addressaddwin_height", "-1", &prefs_common.addressaddwin_height, P_INT,
1054          NULL, NULL, NULL},
1055
1056         {"addressbook_folderselwin_width", "300", &prefs_common.addressbook_folderselwin_width, P_INT,
1057          NULL, NULL, NULL},
1058         {"addressbook_folderselwin_height", "-1", &prefs_common.addressbook_folderselwin_height, P_INT,
1059          NULL, NULL, NULL},
1060
1061         {"aboutwin_width", "450", &prefs_common.aboutwin_width, P_INT,
1062          NULL, NULL, NULL},
1063         {"aboutwin_height", "500", &prefs_common.aboutwin_height, P_INT,
1064          NULL, NULL, NULL},
1065
1066         {"addrgather_width", "450", &prefs_common.addrgather_width, P_INT,
1067          NULL, NULL, NULL},
1068         {"addrgather_height", "-1", &prefs_common.addrgather_height, P_INT,
1069          NULL, NULL, NULL},
1070
1071         {"news_subscribe_width", "450", &prefs_common.news_subscribe_width, P_INT,
1072          NULL, NULL, NULL},
1073         {"news_subscribe_height", "400", &prefs_common.news_subscribe_height, P_INT,
1074          NULL, NULL, NULL},
1075
1076         /* Hidden */
1077         {"warn_dnd", "1", &prefs_common.warn_dnd, P_INT,
1078          NULL, NULL, NULL},
1079         {"utf8_instead_of_locale_for_broken_mail", "0", 
1080          &prefs_common.broken_are_utf8, P_INT,
1081          NULL, NULL, NULL},
1082         {"enable_swap_from", "FALSE", &prefs_common.swap_from, P_BOOL,
1083          NULL, NULL, NULL},
1084         {"use_stripes_everywhere", "TRUE", &prefs_common.use_stripes_everywhere, P_BOOL,
1085          NULL, NULL, NULL},
1086         {"use_stripes_in_summaries", "TRUE", &prefs_common.use_stripes_in_summaries, P_BOOL,
1087          NULL, NULL, NULL},
1088         {"stripes_color_offset", "4000", &prefs_common.stripes_color_offset, P_INT,
1089          NULL, NULL, NULL},
1090         {"enable_hscrollbar", "TRUE", &prefs_common.enable_hscrollbar, P_BOOL,
1091          NULL, NULL, NULL},
1092         {"folderview_vscrollbar_policy", "0",
1093          &prefs_common.folderview_vscrollbar_policy, P_ENUM,
1094          NULL, NULL, NULL},
1095         {"textview_cursor_visible", "FALSE",
1096          &prefs_common.textview_cursor_visible, P_BOOL,
1097          NULL, NULL, NULL},
1098         {"hover_timeout", "500", &prefs_common.hover_timeout, P_INT,
1099          NULL, NULL, NULL},
1100 #ifndef GENERIC_UMPC
1101         {"cache_max_mem_usage", "4096", &prefs_common.cache_max_mem_usage, P_INT,
1102          NULL, NULL, NULL},
1103         {"cache_min_keep_time", "15", &prefs_common.cache_min_keep_time, P_INT,
1104          NULL, NULL, NULL},
1105 #else
1106         {"cache_max_mem_usage", "4096", &prefs_common.cache_max_mem_usage, P_INT,
1107          NULL, NULL, NULL},
1108         {"cache_min_keep_time", "0", &prefs_common.cache_min_keep_time, P_INT,
1109          NULL, NULL, NULL},
1110 #endif
1111         {"thread_by_subject_max_age", "10", &prefs_common.thread_by_subject_max_age,
1112         P_INT, NULL, NULL, NULL },
1113         {"last_opened_folder", "", &prefs_common.last_opened_folder,
1114         P_STRING, NULL, NULL, NULL },
1115         {"goto_last_folder_on_startup", "FALSE", &prefs_common.goto_last_folder_on_startup,
1116         P_BOOL, NULL, NULL, NULL },
1117         {"summary_quicksearch_sticky", "1", &prefs_common.summary_quicksearch_sticky, P_INT,
1118          NULL, NULL, NULL},
1119         {"summary_quicksearch_dynamic", "0", &prefs_common.summary_quicksearch_dynamic, P_INT,
1120          NULL, NULL, NULL},
1121         {"summary_quicksearch_autorun", "0", &prefs_common.summary_quicksearch_autorun, P_INT,
1122          NULL, NULL, NULL},
1123         {"statusbar_update_step", "10", &prefs_common.statusbar_update_step, P_INT,
1124          NULL, NULL, NULL},
1125         {"compose_no_markup", "FALSE", &prefs_common.compose_no_markup, P_BOOL,
1126          NULL, NULL, NULL},
1127         {"skip_ssl_cert_check", "FALSE", &prefs_common.skip_ssl_cert_check, P_BOOL,
1128          NULL, NULL, NULL},
1129         {"live_dangerously", "FALSE", &prefs_common.live_dangerously, P_BOOL,
1130          NULL, NULL, NULL},
1131         {"save_parts_readwrite", "FALSE", &prefs_common.save_parts_readwrite, P_BOOL,
1132          NULL, NULL, NULL},
1133         {"hide_quotes", "0", &prefs_common.hide_quotes, P_INT,
1134          NULL, NULL, NULL},
1135         {"unsafe_ssl_certs", "FALSE", &prefs_common.unsafe_ssl_certs, P_BOOL,
1136          NULL, NULL, NULL},
1137 #ifndef GENERIC_UMPC
1138         {"real_time_sync", "FALSE", &prefs_common.real_time_sync, P_BOOL,
1139          NULL, NULL, NULL},
1140 #else
1141         {"real_time_sync", "TRUE", &prefs_common.real_time_sync, P_BOOL,
1142          NULL, NULL, NULL},
1143 #endif
1144
1145         {"print_paper_type", NULL, &prefs_common.print_paper_type, P_STRING,
1146          NULL, NULL, NULL},
1147         {"print_paper_orientation", "0", &prefs_common.print_paper_orientation, P_INT,
1148          NULL, NULL, NULL},
1149         {"print_margin_top", "-1", &prefs_common.print_margin_top, P_INT,
1150          NULL, NULL, NULL},
1151         {"print_margin_bottom", "-1", &prefs_common.print_margin_bottom, P_INT,
1152          NULL, NULL, NULL},
1153         {"print_margin_left", "-1", &prefs_common.print_margin_left, P_INT,
1154          NULL, NULL, NULL},
1155         {"print_margin_right", "-1", &prefs_common.print_margin_right, P_INT,
1156          NULL, NULL, NULL},
1157         {"print_use_color", "0", &prefs_common.print_use_color, P_INT,
1158          NULL, NULL, NULL},
1159         {"print_use_collate", "0", &prefs_common.print_use_collate, P_INT,
1160          NULL, NULL, NULL},
1161         {"print_use_reverse", "0", &prefs_common.print_use_reverse, P_INT,
1162          NULL, NULL, NULL},
1163         {"print_use_duplex", "0", &prefs_common.print_use_duplex, P_INT,
1164          NULL, NULL, NULL},
1165         {"print_imgs", "1", &prefs_common.print_imgs, P_INT,
1166          NULL, NULL, NULL},
1167         {"print_previewwin_width", "600", &prefs_common.print_previewwin_width, P_INT,
1168          NULL, NULL, NULL},
1169         {"print_previewwin_height", "-1", &prefs_common.print_previewwin_height, P_INT,
1170          NULL, NULL, NULL},
1171         {"use_networkmanager", "TRUE", &prefs_common.use_networkmanager, P_BOOL,
1172          NULL, NULL, NULL},
1173         {"use_shred", "FALSE", &prefs_common.use_shred, P_BOOL,
1174          NULL, NULL, NULL},
1175
1176         {"two_line_vertical", "TRUE", &prefs_common.two_line_vert,
1177         P_BOOL, NULL, NULL, NULL },
1178
1179         {"inherit_folder_properties", "FALSE", &prefs_common.inherit_folder_props, P_BOOL,
1180          NULL, NULL, NULL},
1181
1182         {"flush_metadata", "TRUE", &prefs_common.flush_metadata, P_BOOL,
1183          NULL, NULL, NULL},
1184
1185         {"nav_history_length", "50", &prefs_common.nav_history_length, P_INT,
1186          NULL, NULL, NULL},
1187
1188         {"diff_added_color", "#008b8b", &prefs_common.diff_added_color, P_COLOR,
1189          NULL, NULL, NULL},
1190         {"diff_deleted_color", "#6a5acd", &prefs_common.diff_deleted_color, P_COLOR,
1191          NULL, NULL, NULL},
1192         {"diff_hunk_color", "#a52a2a", &prefs_common.diff_hunk_color, P_COLOR,
1193          NULL, NULL, NULL},
1194
1195         {"folder_search_wildcard", "TRUE", &prefs_common.folder_search_wildcard, P_BOOL,
1196          NULL, NULL, NULL},
1197         {"address_search_wildcard", "TRUE", &prefs_common.address_search_wildcard, P_BOOL,
1198          NULL, NULL, NULL},
1199         {"enable_avatars", "3", &prefs_common.enable_avatars, P_INT, NULL, NULL, NULL},
1200 #ifndef PASSWORD_CRYPTO_OLD
1201         {"use_master_passphrase", FALSE, &prefs_common.use_master_passphrase, P_BOOL, NULL, NULL, NULL },
1202         {"master_passphrase", "", &prefs_common.master_passphrase, P_STRING, NULL, NULL, NULL },
1203         {"master_passphrase_salt", "", &prefs_common.master_passphrase_salt, P_STRING, NULL, NULL, NULL },
1204         {"master_passphrase_pbkdf2_rounds", "50000", &prefs_common.master_passphrase_pbkdf2_rounds, P_INT, NULL, NULL, NULL},
1205 #endif
1206
1207         {NULL, NULL, NULL, P_OTHER, NULL, NULL, NULL}
1208 };
1209
1210 /*
1211  * Read history list from the specified history file in the specified directory (subdir of rc_dir)
1212  * Fallback to default_list if history file is not found
1213  */
1214 GList *prefs_common_read_history_from_dir_with_defaults(const gchar *dirname, const gchar *history,
1215                                                                                                                           GList *default_list)
1216 {
1217         FILE *fp;
1218         gchar *path;
1219         gchar buf[PREFSBUFSIZE];
1220         GList *tmp = NULL;
1221
1222         if (dirname) {
1223                 path = g_strconcat(get_rc_dir(), G_DIR_SEPARATOR_S, dirname,
1224                                    G_DIR_SEPARATOR_S, history,
1225                                    NULL);
1226         } else {
1227         path = g_strconcat(get_rc_dir(), G_DIR_SEPARATOR_S, history,
1228                            NULL);
1229         }
1230         if ((fp = g_fopen(path, "rb")) == NULL) {
1231                 if (ENOENT != errno) FILE_OP_ERROR(path, "fopen");
1232                 g_free(path);
1233                 /* returns default list if set, otherwise NULL */
1234                 return default_list;
1235         }
1236         g_free(path);
1237         while (fgets(buf, sizeof(buf), fp) != NULL) {
1238                 g_strstrip(buf);
1239                 if (buf[0] == '\0') continue;
1240                 tmp = add_history(tmp, buf);
1241         }
1242         fclose(fp);
1243
1244         tmp = g_list_reverse(tmp);
1245
1246         return tmp;
1247 }
1248
1249 /*
1250  * Read history list from the specified history file in the specified directory (subdir of rc_dir)
1251  */
1252 static GList *prefs_common_read_history_from_dir(const gchar *dirname, const gchar *history) 
1253 {
1254         return prefs_common_read_history_from_dir_with_defaults(dirname, history, NULL);
1255 }
1256
1257 /*
1258  * Read history list from the specified history file
1259  */
1260 static GList *prefs_common_read_history(const gchar *history) 
1261 {
1262         return prefs_common_read_history_from_dir(NULL, history);
1263 }
1264
1265 void prefs_common_read_config(void)
1266 {
1267         gchar *rcpath;
1268         gchar *tmp;
1269
1270         rcpath = g_strconcat(get_rc_dir(), G_DIR_SEPARATOR_S, COMMON_RC, NULL);
1271         prefs_read_config(param, "Common", rcpath, NULL);
1272 #ifdef G_OS_WIN32
1273         prefs_read_config(param_os_specific, "CommonWin32", rcpath, NULL);
1274 #endif
1275
1276         g_free(rcpath);
1277
1278         tmp = g_strdup(gettext(prefs_common.date_format));
1279         g_free(prefs_common.date_format);
1280         prefs_common.date_format = tmp;
1281
1282         prefs_common.mime_open_cmd_history =
1283                 prefs_common_read_history(COMMAND_HISTORY);
1284         prefs_common.summary_quicksearch_history =
1285                 prefs_common_read_history(QUICKSEARCH_HISTORY);
1286         prefs_common.summary_search_from_history =
1287                 prefs_common_read_history(SUMMARY_SEARCH_FROM_HISTORY);
1288         prefs_common.summary_search_to_history =
1289                 prefs_common_read_history(SUMMARY_SEARCH_TO_HISTORY);
1290         prefs_common.summary_search_subject_history =
1291                 prefs_common_read_history(SUMMARY_SEARCH_SUBJECT_HISTORY);
1292         prefs_common.summary_search_body_history =
1293                 prefs_common_read_history(SUMMARY_SEARCH_BODY_HISTORY);
1294         prefs_common.summary_search_adv_condition_history =
1295                 prefs_common_read_history(SUMMARY_SEARCH_ADV_CONDITION_HISTORY);
1296         prefs_common.message_search_history =
1297                 prefs_common_read_history(MESSAGE_SEARCH_HISTORY);
1298         prefs_common.compose_save_to_history =
1299                 prefs_common_read_history(COMPOSE_SAVE_TO_HISTORY);
1300 #ifndef USE_ALT_ADDRBOOK
1301         prefs_common.addressbook_custom_attributes = addressbook_update_custom_attr_from_prefs();
1302 #endif
1303         colorlabel_update_colortable_from_prefs();
1304 }
1305
1306 #define TRY(func) \
1307 if (!(func)) \
1308 { \
1309         g_warning("failed to write"); \
1310         goto out;                       \
1311 } \
1312
1313 /*
1314  * Save history list to the specified history file in the specified directory (subdir of rc_dir)
1315  */
1316 static void prefs_common_save_history_to_dir(const gchar *dirname, const gchar *history, GList *list)
1317 {
1318         GList *cur;
1319         FILE *fp;
1320         gchar *path, *tmp_path;
1321
1322         if (dirname) {
1323                 path = g_strconcat(get_rc_dir(), G_DIR_SEPARATOR_S, dirname,
1324                                    G_DIR_SEPARATOR_S, history,
1325                                    NULL);
1326         } else {
1327         path = g_strconcat(get_rc_dir(), G_DIR_SEPARATOR_S, history,
1328                            NULL);
1329         }
1330         tmp_path = g_strconcat(path, ".tmp", NULL);
1331
1332         if ((fp = g_fopen(tmp_path, "wb")) == NULL) {
1333                 FILE_OP_ERROR(tmp_path, "fopen");
1334                 goto out;
1335         }
1336
1337         for (cur = list; cur != NULL; cur = cur->next) {
1338                 TRY(fputs((gchar *)cur->data, fp) != EOF &&
1339                     fputc('\n', fp) != EOF);
1340         }
1341
1342         if (fclose(fp) == EOF) {
1343                 FILE_OP_ERROR(tmp_path, "fclose");
1344                 fp = NULL;
1345                 goto out;
1346         }
1347         fp = NULL;
1348 #ifdef G_OS_WIN32
1349         claws_unlink(path);
1350 #endif
1351         if (g_rename(tmp_path, path) < 0) {
1352                 FILE_OP_ERROR(path, "rename");
1353                 goto out;
1354         }
1355
1356 out:
1357         if (fp)
1358                 fclose(fp);
1359         g_free(tmp_path);
1360         g_free(path);
1361 }
1362
1363 /*
1364  * Save history list to the specified history file
1365  */
1366 static void prefs_common_save_history(const gchar *history, GList *list)
1367 {
1368         prefs_common_save_history_to_dir(NULL, history, list);
1369 }
1370
1371 #undef TRY
1372
1373 void prefs_common_write_config(void)
1374 {
1375         prefs_write_config(param, "Common", COMMON_RC);
1376 #ifdef G_OS_WIN32
1377         prefs_write_config(param_os_specific, "CommonWin32", COMMON_RC);
1378 #endif
1379
1380         prefs_common_save_history(COMMAND_HISTORY, 
1381                 prefs_common.mime_open_cmd_history);
1382         prefs_common_save_history(QUICKSEARCH_HISTORY, 
1383                 prefs_common.summary_quicksearch_history);
1384         prefs_common_save_history(SUMMARY_SEARCH_FROM_HISTORY, 
1385                 prefs_common.summary_search_from_history);
1386         prefs_common_save_history(SUMMARY_SEARCH_TO_HISTORY, 
1387                 prefs_common.summary_search_to_history);
1388         prefs_common_save_history(SUMMARY_SEARCH_SUBJECT_HISTORY, 
1389                 prefs_common.summary_search_subject_history);
1390         prefs_common_save_history(SUMMARY_SEARCH_BODY_HISTORY, 
1391                 prefs_common.summary_search_body_history);
1392         prefs_common_save_history(SUMMARY_SEARCH_ADV_CONDITION_HISTORY, 
1393                 prefs_common.summary_search_adv_condition_history);
1394         prefs_common_save_history(MESSAGE_SEARCH_HISTORY, 
1395                 prefs_common.message_search_history);
1396         prefs_common_save_history(COMPOSE_SAVE_TO_HISTORY, 
1397                 prefs_common.compose_save_to_history);
1398
1399 #ifndef USE_ALT_ADDRBOOK
1400                 prefs_common_save_history_to_dir(ADDRBOOK_DIR,
1401                 ADDRESSBOOK_CUSTOM_ATTRIBUTES, 
1402                 prefs_common.addressbook_custom_attributes);
1403 #endif
1404 }
1405
1406 /* make a copy of string 'in' into buffer 'out'. un-escape \ sequences.
1407    both 'in' and 'out' must be non-NULL.
1408    'out' must be a pointer to a buffer whose size is at least equal
1409    to strlen(txt)+1, this buffer will get cleared. out's contents
1410    will always get set to a valid string, even if it's "".*/
1411 void pref_get_unescaped_pref(gchar *out, const gchar *in)
1412 {
1413         const gchar *i;
1414         gchar *o;
1415
1416         *out = '\0';
1417
1418         cm_return_if_fail( in != NULL );
1419         cm_return_if_fail( out != NULL );
1420
1421         i = in;
1422         o = out;
1423         memset(out, 0, strlen(in)+1);
1424         while (*i != '\0') {
1425                 if (*i == '\\' && *(i+1) == 'n') {
1426                         *o++ = '\n';
1427                         i++;
1428                 } else if (*i == '\\' && *(i+1) == 't') {
1429                         *o++ = '\t';
1430                         i++;
1431                 } else if (*i == '\\' && *(i+1) == '\\') {
1432                         *o++ = '\\';
1433                         i++;
1434                 } else {
1435                         *o++ = *i;
1436                 }
1437                 i++;
1438         }
1439         *o='\0';
1440 }
1441
1442 /* make a copy of string 'in' into buffer 'out'. escape \ sequences.
1443    both 'in' and 'out' must be non-NULL.
1444    'out' must be a pointer to a buffer whose size is at least equal
1445    to 2*strlen(txt)+1. out's contents will always get set to a valid
1446    string, even if it's "". */
1447 void pref_get_escaped_pref(gchar *out, const gchar *in)
1448 {
1449         const gchar *i;
1450         gchar *o;
1451
1452         *out = '\0';
1453
1454         cm_return_if_fail( in != NULL );
1455         cm_return_if_fail( out != NULL );
1456
1457         i = in;
1458         o = out;
1459         while (*i != '\0') {
1460                 if (*i == '\n') {
1461                         *o++ = '\\';
1462                         *o++ = 'n';
1463                 } else if (*i == '\t') {
1464                         *o++ = '\\';
1465                         *o++ = 't';
1466                 } else if (*i == '\\') {
1467                         *o++ = '\\';
1468                         *o++ = '\\';
1469                 } else {
1470                         *o++ = *i;
1471                 }
1472                 i++;
1473         }
1474         *o = '\0';
1475 }
1476                 
1477 /* set the contents of a textview widget from the internal \-escaped
1478   representation of a pref string. both txt and textview must be non-NULL. */
1479 void pref_set_textview_from_pref(GtkTextView *textview, const gchar *txt)
1480 {
1481         GtkTextBuffer *buffer;
1482         gchar *out = NULL;
1483
1484         cm_return_if_fail( textview != NULL );
1485
1486         buffer = gtk_text_view_get_buffer(textview);
1487
1488         if (!txt) {
1489                 gtk_text_buffer_set_text(buffer, "", -1);
1490         } else {
1491                 out = g_malloc(strlen(txt)+1);
1492
1493                 pref_get_unescaped_pref(out, txt);
1494
1495                 gtk_text_buffer_set_text(buffer, out, -1);
1496                 g_free(out);
1497         }
1498 }
1499
1500 /* set the contents of a gtkentry widget from the internal \-escaped
1501   representation of a pref string. both txt and entry must be non-NULL. */
1502 void pref_set_entry_from_pref(GtkEntry *entry, const gchar *txt)
1503 {
1504         gchar *out = NULL;
1505
1506         cm_return_if_fail( entry != NULL );
1507         if (!txt) {
1508                 gtk_entry_set_text(entry, "");
1509         } else {
1510                 out = g_malloc(strlen(txt)+1);
1511
1512                 pref_get_unescaped_pref(out, txt);
1513
1514                 gtk_entry_set_text(entry, out);
1515                 g_free(out);
1516         }
1517 }
1518
1519 /* get the \-escaped internal representation of a pref from the contents of
1520    a textview widget. textview must be non-NULL. */
1521 gchar *pref_get_pref_from_textview(GtkTextView *textview) 
1522 {
1523         GtkTextBuffer *buffer;
1524         GtkTextIter start, end;
1525         gchar *out, *tmp;
1526         
1527         cm_return_val_if_fail( textview != NULL, "" );
1528
1529         buffer = gtk_text_view_get_buffer(textview);
1530         gtk_text_buffer_get_start_iter(buffer, &start);
1531         gtk_text_buffer_get_iter_at_offset(buffer, &end, -1);
1532         tmp = gtk_text_buffer_get_text(buffer, &start, &end, FALSE);
1533         out = malloc(2*strlen(tmp)+1);
1534         if (out)
1535                 pref_get_escaped_pref(out, tmp);
1536         g_free(tmp);
1537
1538         return out?out:"";
1539 }
1540
1541 /* get the \-escaped internal representation of a pref from the contents of
1542    a gtkentry widget. entry must be non-NULL. */
1543 gchar *pref_get_pref_from_entry(GtkEntry *entry) 
1544 {
1545         gchar *out, *tmp;
1546
1547         cm_return_val_if_fail( entry != NULL, "" );
1548
1549         tmp = gtk_editable_get_chars(GTK_EDITABLE(entry), 0, -1);
1550         out = malloc(2*strlen(tmp)+1);
1551         
1552         if (out)
1553                 pref_get_escaped_pref(out, tmp);
1554         g_free(tmp);
1555
1556         return out?out:"";
1557 }
1558
1559 /* ugly hack to be able to get this pref from ssl_certificate.c */
1560 gboolean prefs_common_unsafe_ssl_certs(void)
1561 {
1562         return prefs_common.unsafe_ssl_certs;
1563 }
1564
1565 gboolean prefs_common_enable_log_standard(void)
1566 {
1567         return prefs_common.enable_log_standard;
1568 }
1569
1570 gboolean prefs_common_enable_log_warning(void)
1571 {
1572         return prefs_common.enable_log_warning;
1573 }
1574 gboolean prefs_common_enable_log_error(void)
1575 {
1576         return prefs_common.enable_log_error;
1577 }
1578 gboolean prefs_common_enable_log_status(void)
1579 {
1580         return prefs_common.enable_log_status;
1581 }
1582
1583 /**
1584    return the translated name of a header, if the translate_header option is
1585    set, otherwise return the untranslated header name (header_name itself).
1586    this function is provided for convenience, it's an interface to
1587    prefs_common.trans_hdr.
1588    works with header names either with or without trailing colon, provided
1589    that gettext found such header name in the sources (they should all be
1590    found in src/gtk/headers.h anyway).
1591 */
1592 const gchar *prefs_common_translated_header_name(const gchar *header_name)
1593 {
1594         if (header_name == NULL || *header_name == '\0')
1595                 return header_name;
1596
1597         return prefs_common.trans_hdr ? gettext(header_name) : header_name;
1598 }
1599
1600 const gchar *prefs_common_get_uri_cmd(void)
1601 {
1602 #ifdef G_OS_WIN32
1603         return NULL;
1604 #else
1605         gchar *tmp = NULL;
1606         
1607         if (!prefs_common.cmds_use_system_default)
1608                 return prefs_common.uri_cmd;
1609         
1610         tmp = g_find_program_in_path("xdg-open");
1611         if (!tmp) 
1612                 return prefs_common.uri_cmd;
1613         
1614         g_free(tmp);
1615         return "xdg-open %s";
1616 #endif
1617 }
1618
1619 const gchar *prefs_common_get_ext_editor_cmd(void)
1620 {
1621         return prefs_common.ext_editor_cmd;
1622 #if 0 /* we should do that, but it detaches the editor and breaks
1623          compose.c's external composition. */
1624         gchar *tmp = NULL;
1625         
1626         if (!prefs_common.cmds_use_system_default)
1627                 return prefs_common.ext_editor_cmd;
1628         
1629         tmp = g_find_program_in_path("xdg-open");
1630         if (!tmp) 
1631                 return prefs_common.ext_editor_cmd;
1632         
1633         g_free(tmp);
1634         return "xdg-open %s";
1635 #endif 
1636 }
1637
1638 gboolean prefs_common_get_use_shred(void)
1639 {
1640         return prefs_common.use_shred;
1641 }
1642
1643 gboolean prefs_common_get_flush_metadata (void)
1644 {
1645         return prefs_common.flush_metadata;
1646 }
1647
1648 PrefsCommon *prefs_common_get_prefs(void)
1649 {
1650         return &prefs_common;
1651 }