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