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