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