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