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