2013-02-20 [colin] 3.9.0cvs83
[claws.git] / src / prefs_common.c
1 /*
2  * Sylpheed -- a GTK+ based, lightweight, and fast e-mail client
3  * Copyright (C) 1999-2012 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 #ifdef MAEMO
145         {"data_root", "", &prefs_common.data_root, P_STRING,
146          NULL, NULL, NULL},
147 #endif
148         /* Receive */
149         {"use_ext_inc", "FALSE", &prefs_common.use_extinc, P_BOOL,
150          NULL, NULL, NULL},
151         {"ext_inc_path", DEFAULT_INC_PATH, &SPECIFIC_PREFS.extinc_cmd, P_STRING,
152          NULL, NULL, NULL},
153
154         {"autochk_newmail", "FALSE", &prefs_common.autochk_newmail, P_BOOL,
155          NULL, NULL, NULL},
156         {"autochk_interval", "10", &prefs_common.autochk_itv, P_INT,
157          NULL, NULL, NULL},
158         {"check_on_startup", "FALSE", &prefs_common.chk_on_startup, P_BOOL,
159          NULL, NULL, NULL},
160         {"open_inbox_on_inc", "FALSE", &prefs_common.open_inbox_on_inc,
161          P_BOOL, NULL, NULL, NULL},
162         {"scan_all_after_inc", "FALSE", &prefs_common.scan_all_after_inc,
163          P_BOOL, NULL, NULL, NULL},
164         {"newmail_notify_manu", "FALSE", &prefs_common.newmail_notify_manu,
165          P_BOOL, NULL, NULL, NULL},
166         {"newmail_notify_auto", "FALSE", &prefs_common.newmail_notify_auto,
167         P_BOOL, NULL, NULL, NULL},
168         {"newmail_notify_cmd", "", &SPECIFIC_PREFS.newmail_notify_cmd, P_STRING,
169          NULL, NULL, NULL},
170 #ifdef MAEMO
171         {"maemo_show_led", "TRUE", &prefs_common.maemo_show_led, P_BOOL,
172          NULL, NULL, NULL},
173         {"maemo_play_sound", "FALSE", &prefs_common.maemo_play_sound, P_BOOL,
174          NULL, NULL, NULL},
175         {"maemo_show_banner", "FALSE", &prefs_common.maemo_show_banner, P_BOOL,
176          NULL, NULL, NULL},
177 #endif
178         {"receive_dialog_mode", "2", &prefs_common.recv_dialog_mode, P_ENUM,
179          NULL, NULL, NULL},
180         {"receivewin_width", "460", &prefs_common.receivewin_width, P_INT,
181          NULL, NULL, NULL},
182         {"receivewin_height", "-1", &prefs_common.receivewin_height, P_INT,
183          NULL, NULL, NULL},
184         {"no_receive_error_panel", "FALSE", &prefs_common.no_recv_err_panel,
185          P_BOOL, NULL, NULL, NULL},
186         {"close_receive_dialog", "TRUE", &prefs_common.close_recv_dialog,
187          P_BOOL, NULL, NULL, NULL},
188  
189         /* Send */
190         {"save_message", "TRUE", &prefs_common.savemsg, P_BOOL,
191          NULL, NULL, NULL},
192         {"confirm_send_queued_messages", "FALSE", &prefs_common.confirm_send_queued_messages,
193          P_BOOL, NULL, NULL, NULL},
194 #ifndef GENERIC_UMPC
195         {"send_dialog_mode", "0", &prefs_common.send_dialog_invisible, P_BOOL,
196          NULL, NULL, NULL},
197 #else
198         {"send_dialog_mode", "1", &prefs_common.send_dialog_invisible, P_BOOL,
199          NULL, NULL, NULL},
200 #endif
201         {"sendwin_width", "460", &prefs_common.sendwin_width, P_INT,
202          NULL, NULL, NULL},
203         {"sendwin_height", "-1", &prefs_common.sendwin_height, P_INT,
204          NULL, NULL, NULL},
205
206         {"outgoing_charset", CS_AUTO, &prefs_common.outgoing_charset, P_STRING,
207          NULL, NULL, NULL},
208         {"encoding_method", "0", &prefs_common.encoding_method, P_ENUM,
209          NULL, NULL, NULL},
210         {"outgoing_fallback_to_ascii", "TRUE", &prefs_common.outgoing_fallback_to_ascii, P_BOOL,
211          NULL, NULL, NULL},
212
213         {"allow_jisx0201_kana", "FALSE", &prefs_common.allow_jisx0201_kana,
214          P_BOOL, NULL, NULL, NULL},
215
216         /* Compose */
217         {"auto_ext_editor", "FALSE", &prefs_common.auto_exteditor, P_BOOL,
218          NULL, NULL, NULL},
219         {"forward_as_attachment", "FALSE", &prefs_common.forward_as_attachment,
220          P_BOOL, NULL, NULL, NULL},
221         {"redirect_keep_from", "FALSE",
222          &prefs_common.redirect_keep_from, P_BOOL,
223          NULL, NULL, NULL},
224         {"undo_level", "50", &prefs_common.undolevels, P_INT,
225          NULL, NULL, NULL},
226         {"compose_with_format", "FALSE", &prefs_common.compose_with_format, P_BOOL,
227          NULL, NULL, NULL},
228         {"compose_subject_format", "",
229          &prefs_common.compose_subject_format, P_STRING, NULL, NULL, NULL},
230         {"compose_body_format", N_("Hello,\\n"),
231          &prefs_common.compose_body_format, P_STRING, NULL, NULL, NULL},
232         {"show_compose_margin", "FALSE", &prefs_common.show_compose_margin, P_BOOL,
233          NULL, NULL, NULL},
234         
235
236         {"linewrap_length", "72", &prefs_common.linewrap_len, P_INT,
237          NULL, NULL, NULL},
238         {"linewrap_quotation", "TRUE", &prefs_common.linewrap_quote, P_BOOL,
239          NULL, NULL, NULL},
240         {"linewrap_pastes", "TRUE", &prefs_common.linewrap_pastes, P_BOOL,
241          NULL, NULL, NULL},
242         {"primary_paste_unselects", "FALSE", &prefs_common.primary_paste_unselects, P_BOOL,
243          NULL, NULL, NULL},
244         {"linewrap_auto", "TRUE", &prefs_common.autowrap, P_BOOL,
245          NULL, NULL, NULL},
246         {"auto_indent", "TRUE", &prefs_common.auto_indent, P_BOOL,
247          NULL, NULL, NULL},
248         {"autosave", "TRUE", &prefs_common.autosave,
249          P_BOOL, NULL, NULL, NULL},
250         {"autosave_length", "50", &prefs_common.autosave_length, P_INT,
251          NULL, NULL, NULL},
252         {"warn_large_insert", "TRUE", &prefs_common.warn_large_insert,
253          P_BOOL, NULL, NULL, NULL},
254         {"warn_large_insert_size", "500", &prefs_common.warn_large_insert_size,
255          P_INT, NULL, NULL, NULL},
256
257         {"enable_aspell", "TRUE", &prefs_common.enable_aspell, P_BOOL,
258          NULL, NULL, NULL},
259         {"dictionary",  "", &prefs_common.dictionary, P_STRING,
260          NULL, NULL, NULL},
261         {"alt_dictionary",  "", &prefs_common.alt_dictionary, P_STRING,
262          NULL, NULL, NULL},
263         {"use_alternate_dict", "FALSE", &prefs_common.use_alternate, P_BOOL,
264          NULL, NULL, NULL},
265         {"check_while_typing", "TRUE", &prefs_common.check_while_typing, P_BOOL,
266          NULL, NULL, NULL},
267         {"recheck_when_changing_dict", "TRUE", &prefs_common.recheck_when_changing_dict,
268          P_BOOL, NULL, NULL, NULL},
269         {"misspelled_color", "#ff0000", &prefs_common.misspelled_col, P_COLOR,
270          NULL, NULL, NULL},
271         {"use_both_dicts", "FALSE", &prefs_common.use_both_dicts, P_BOOL,
272          NULL, NULL, NULL},
273
274         {"reply_with_quote", "TRUE", &prefs_common.reply_with_quote, P_BOOL,
275          NULL, NULL, NULL},
276         {"compose_dnd_insert_or_attach", "0", &prefs_common.compose_dnd_mode, P_ENUM,
277          NULL, NULL, NULL},
278
279         /* Account autoselection */
280         {"reply_account_autoselect", "TRUE",
281          &prefs_common.reply_account_autosel, P_BOOL,
282          NULL, NULL, NULL},
283         {"forward_account_autoselect", "TRUE",
284          &prefs_common.forward_account_autosel, P_BOOL,
285          NULL, NULL, NULL},
286         {"reedit_account_autoselect", "TRUE",
287          &prefs_common.reedit_account_autosel, P_BOOL,
288          NULL, NULL, NULL},
289
290         {"default_reply_list", "TRUE", &prefs_common.default_reply_list, P_BOOL,
291          NULL, NULL, NULL},
292
293 #ifndef GENERIC_UMPC
294         {"show_ruler", "TRUE", &prefs_common.show_ruler, P_BOOL,
295          NULL, NULL, NULL},
296 #else
297         {"show_ruler", "FALSE", &prefs_common.show_ruler, P_BOOL,
298          NULL, NULL, NULL},
299 #endif
300
301         /* Quote */
302         {"reply_quote_mark", "> ", &prefs_common.quotemark, P_STRING,
303          NULL, NULL, NULL},
304         {"reply_quote_format", N_("On %d\\n%f wrote:\\n\\n%q\\n%X"),
305          &prefs_common.quotefmt, P_STRING, NULL, NULL, NULL},
306
307         {"forward_quote_mark", "> ", &prefs_common.fw_quotemark, P_STRING,
308          NULL, NULL, NULL},
309         {"forward_quote_format",
310          N_("\\n\\nBegin forwarded message:\\n\\n"
311          "?d{Date: %d\\n}?f{From: %f\\n}?t{To: %t\\n}?c{Cc: %c\\n}"
312          "?n{Newsgroups: %n\\n}?s{Subject: %s\\n}\\n\\n%M"),
313          &prefs_common.fw_quotefmt, P_STRING,
314          NULL, NULL, NULL},
315         {"quote_chars", ">", &prefs_common.quote_chars, P_STRING,
316          NULL, NULL, NULL},
317
318         /* Display */
319         /* Obsolete fonts. For coexisting with Gtk+-1.2 version */
320         {"widget_font",         NULL,
321           &prefs_common.widgetfont_gtk1,        P_STRING, NULL, NULL, NULL},
322         {"message_font",        "-misc-fixed-medium-r-normal--14-*-*-*-*-*-*-*",
323          &prefs_common.textfont_gtk1,           P_STRING, NULL, NULL, NULL},
324         {"small_font",          "-*-helvetica-medium-r-normal--10-*-*-*-*-*-*-*",
325           &prefs_common.smallfont_gtk1,         P_STRING, NULL, NULL, NULL},
326         {"bold_font",           "-*-helvetica-bold-r-normal--12-*-*-*-*-*-*-*",
327           &prefs_common.boldfont_gtk1,          P_STRING, NULL, NULL, NULL},
328         {"normal_font",         "-*-helvetica-medium-r-normal--12-*-*-*-*-*-*-*",
329           &prefs_common.normalfont_gtk1,        P_STRING, NULL, NULL, NULL},
330
331         /* new fonts */
332 #ifndef GENERIC_UMPC
333         {"widget_font_gtk2",    NULL,
334           &SPECIFIC_PREFS.widgetfont,           P_STRING, NULL, NULL, NULL},
335         {"message_font_gtk2",   "Monospace 9",
336          &SPECIFIC_PREFS.textfont,                      P_STRING, NULL, NULL, NULL},
337         {"print_font_gtk2",     "Monospace 9",
338          &SPECIFIC_PREFS.printfont,             P_STRING, NULL, NULL, NULL},
339         {"small_font_gtk2",     "Sans 9",
340           &SPECIFIC_PREFS.smallfont,            P_STRING, NULL, NULL, NULL},
341         {"normal_font_gtk2",    "Sans 9",
342           &SPECIFIC_PREFS.normalfont,           P_STRING, NULL, NULL, NULL},
343         {"bold_font_gtk2",      "Sans Bold 9",
344           &SPECIFIC_PREFS.boldfont,             P_STRING, NULL, NULL, NULL},
345 #else
346         {"widget_font_gtk2",    NULL,
347           &SPECIFIC_PREFS.widgetfont,           P_STRING, NULL, NULL, NULL},
348         {"message_font_gtk2",   "Monospace 8",
349          &SPECIFIC_PREFS.textfont,                      P_STRING, NULL, NULL, NULL},
350         {"print_font_gtk2",     "Monospace 8",
351          &SPECIFIC_PREFS.printfont,             P_STRING, NULL, NULL, NULL},
352         {"small_font_gtk2",     "Sans 8",
353           &SPECIFIC_PREFS.smallfont,            P_STRING, NULL, NULL, NULL},
354         {"normal_font_gtk2",    "Sans 8",
355           &SPECIFIC_PREFS.normalfont,           P_STRING, NULL, NULL, NULL},
356         {"bold_font_gtk2",      "Sans Bold 8",
357           &SPECIFIC_PREFS.boldfont,             P_STRING, NULL, NULL, NULL},
358 #endif
359
360         {"use_different_print_font", "FALSE", &prefs_common.use_different_print_font, P_BOOL,
361          NULL, NULL, NULL},
362         {"derive_from_normal_font", "TRUE", &prefs_common.derive_from_normal_font, P_BOOL,
363          NULL, NULL, NULL},
364
365         /* custom colors */
366         {"custom_color1", "#ff9900", &prefs_common.custom_colorlabel[0].color, P_COLOR,
367          NULL, NULL, NULL},
368         {"custom_colorlabel1", N_("Orange"), &prefs_common.custom_colorlabel[0].label, P_STRING,
369          NULL, NULL, NULL},
370         {"custom_color2", "#ff0000", &prefs_common.custom_colorlabel[1].color, P_COLOR,
371          NULL, NULL, NULL},
372         {"custom_colorlabel2", N_("Red"), &prefs_common.custom_colorlabel[1].label, P_STRING,
373          NULL, NULL, NULL},
374         {"custom_color3", "#ff66ff", &prefs_common.custom_colorlabel[2].color, P_COLOR,
375          NULL, NULL, NULL},
376         {"custom_colorlabel3", N_("Pink"), &prefs_common.custom_colorlabel[2].label, P_STRING,
377          NULL, NULL, NULL},
378         {"custom_color4", "#00ccff", &prefs_common.custom_colorlabel[3].color, P_COLOR,
379          NULL, NULL, NULL},
380         {"custom_colorlabel4", N_("Sky blue"), &prefs_common.custom_colorlabel[3].label, P_STRING,
381          NULL, NULL, NULL},
382         {"custom_color5", "#0000ff", &prefs_common.custom_colorlabel[4].color, P_COLOR,
383          NULL, NULL, NULL},
384         {"custom_colorlabel5", N_("Blue"), &prefs_common.custom_colorlabel[4].label, P_STRING,
385          NULL, NULL, NULL},
386         {"custom_color6", "#009900", &prefs_common.custom_colorlabel[5].color, P_COLOR,
387          NULL, NULL, NULL},
388         {"custom_colorlabel6", N_("Green"), &prefs_common.custom_colorlabel[5].label, P_STRING,
389          NULL, NULL, NULL},
390         {"custom_color7", "#663333", &prefs_common.custom_colorlabel[6].color, P_COLOR,
391          NULL, NULL, NULL},
392         {"custom_colorlabel7", N_("Brown"), &prefs_common.custom_colorlabel[6].label, P_STRING,
393          NULL, NULL, NULL},
394         {"custom_color8", "#aaaaaa", &prefs_common.custom_colorlabel[7].color, P_COLOR,
395          NULL, NULL, NULL},
396         {"custom_colorlabel8", N_("Grey"), &prefs_common.custom_colorlabel[7].label, P_STRING,
397          NULL, NULL, NULL},
398         {"custom_color9", "#c07254", &prefs_common.custom_colorlabel[8].color, P_COLOR,
399          NULL, NULL, NULL},
400         {"custom_colorlabel9", N_("Light brown"), &prefs_common.custom_colorlabel[8].label, P_STRING,
401          NULL, NULL, NULL},
402         {"custom_color10", "#c00000", &prefs_common.custom_colorlabel[9].color, P_COLOR,
403          NULL, NULL, NULL},
404         {"custom_colorlabel10", N_("Dark red"), &prefs_common.custom_colorlabel[9].label, P_STRING,
405          NULL, NULL, NULL},
406         {"custom_color11", "#cc1074", &prefs_common.custom_colorlabel[10].color, P_COLOR,
407          NULL, NULL, NULL},
408         {"custom_colorlabel11", N_("Dark pink"), &prefs_common.custom_colorlabel[10].label, P_STRING,
409          NULL, NULL, NULL},
410         {"custom_color12", "#5094cd", &prefs_common.custom_colorlabel[11].color, P_COLOR,
411          NULL, NULL, NULL},
412         {"custom_colorlabel12", N_("Steel blue"), &prefs_common.custom_colorlabel[11].label, P_STRING,
413          NULL, NULL, NULL},
414         {"custom_color13", "#ffd500", &prefs_common.custom_colorlabel[12].color, P_COLOR,
415          NULL, NULL, NULL},
416         {"custom_colorlabel13", N_("Gold"), &prefs_common.custom_colorlabel[12].label, P_STRING,
417          NULL, NULL, NULL},
418         {"custom_color14", "#00d800", &prefs_common.custom_colorlabel[13].color, P_COLOR,
419          NULL, NULL, NULL},
420         {"custom_colorlabel14", N_("Bright green"), &prefs_common.custom_colorlabel[13].label, P_STRING,
421          NULL, NULL, NULL},
422         {"custom_color15", "#c060c0", &prefs_common.custom_colorlabel[14].color, P_COLOR,
423          NULL, NULL, NULL},
424         {"custom_colorlabel15", N_("Magenta"), &prefs_common.custom_colorlabel[14].label, P_STRING,
425          NULL, NULL, NULL},
426
427         /* image viewer */
428         {"display_image", "TRUE", &prefs_common.display_img, P_BOOL,
429          NULL, NULL, NULL},
430         {"resize_image", "TRUE", &prefs_common.resize_img, P_BOOL,
431          NULL, NULL, NULL},
432         {"inline_image", "TRUE", &prefs_common.inline_img, P_BOOL,
433          NULL, NULL, NULL},
434
435         {"display_folder_unread_num", "0",
436          &prefs_common.display_folder_unread, P_INT,
437          NULL, NULL, NULL},
438         {"newsgroup_abbrev_len", "16",
439          &prefs_common.ng_abbrev_len, P_INT,
440          NULL, NULL, NULL},
441
442         {"translate_header", "FALSE", &prefs_common.trans_hdr, P_BOOL,
443          NULL, NULL, NULL},
444
445         /* Display: Summary View */
446         {"use_address_book", "FALSE", &prefs_common.use_addr_book, P_BOOL,
447          NULL, NULL, NULL},
448         {"thread_by_subject", "TRUE", &prefs_common.thread_by_subject, P_BOOL,
449          NULL, NULL, NULL},
450         {"date_format", N_("%x(%a) %H:%M"), &prefs_common.date_format,
451          P_STRING, NULL, NULL, NULL},
452         {"msgview_date_format", "FALSE", &prefs_common.msgview_date_format, P_BOOL,
453          NULL, NULL, NULL},
454
455         {"bold_unread", "TRUE", &prefs_common.bold_unread, P_BOOL,
456          NULL, NULL, NULL},
457
458         {"enable_thread", "TRUE", &prefs_common.enable_thread, P_BOOL,
459          NULL, NULL, NULL},
460 #ifndef GENERIC_UMPC
461         {"toolbar_style", "3", &prefs_common.toolbar_style, P_ENUM,
462          NULL, NULL, NULL},
463 #else
464         {"toolbar_style", "1", &prefs_common.toolbar_style, P_ENUM,
465          NULL, NULL, NULL},
466 #endif
467         {"toolbar_detachable", "FALSE", &prefs_common.toolbar_detachable, P_BOOL,
468          NULL, NULL, NULL},
469         {"show_col_headers", "TRUE", &prefs_common.show_col_headers, P_BOOL,
470          NULL, NULL, NULL},
471 #ifndef GENERIC_UMPC
472         {"show_statusbar", "TRUE", &prefs_common.show_statusbar, P_BOOL,
473          NULL, NULL, NULL},
474         {"show_searchbar", "TRUE", &prefs_common.show_searchbar, P_BOOL,
475          NULL, NULL, NULL},
476 #else
477         {"show_statusbar", "FALSE", &prefs_common.show_statusbar, P_BOOL,
478          NULL, NULL, NULL},
479         {"show_searchbar", "FALSE", &prefs_common.show_searchbar, P_BOOL,
480          NULL, NULL, NULL},
481 #endif
482
483         {"summary_col_show_mark", "TRUE",
484          &prefs_common.summary_col_visible[S_COL_MARK], P_BOOL, NULL, NULL, NULL},
485         {"summary_col_show_unread", "TRUE",
486          &prefs_common.summary_col_visible[S_COL_STATUS], P_BOOL, NULL, NULL, NULL},
487         {"summary_col_show_subject", "TRUE",
488          &prefs_common.summary_col_visible[S_COL_SUBJECT], P_BOOL, NULL, NULL, NULL},
489         {"summary_col_show_from", "TRUE",
490          &prefs_common.summary_col_visible[S_COL_FROM], P_BOOL, NULL, NULL, NULL},
491         {"summary_col_show_to", "FALSE",
492          &prefs_common.summary_col_visible[S_COL_TO], P_BOOL, NULL, NULL, NULL},
493         {"summary_col_show_date", "TRUE",
494          &prefs_common.summary_col_visible[S_COL_DATE], P_BOOL, NULL, NULL, NULL},
495         {"summary_col_show_mime", "TRUE",
496          &prefs_common.summary_col_visible[S_COL_MIME], P_BOOL, NULL, NULL, NULL},
497         {"summary_col_show_size", "TRUE",
498          &prefs_common.summary_col_visible[S_COL_SIZE], P_BOOL, NULL, NULL, NULL},
499         {"summary_col_show_number", "FALSE",
500          &prefs_common.summary_col_visible[S_COL_NUMBER], P_BOOL, NULL, NULL, NULL},
501         {"summary_col_show_score", "FALSE",
502          &prefs_common.summary_col_visible[S_COL_SCORE], P_BOOL, NULL, NULL, NULL},
503         {"summary_col_show_locked", "FALSE",
504          &prefs_common.summary_col_visible[S_COL_LOCKED], P_BOOL, NULL, NULL, NULL},
505         {"summary_col_show_tags", "FALSE",
506          &prefs_common.summary_col_visible[S_COL_TAGS], P_BOOL, NULL, NULL, NULL},
507
508         {"summary_col_pos_mark", "0",
509           &prefs_common.summary_col_pos[S_COL_MARK], P_INT, NULL, NULL, NULL},
510         {"summary_col_pos_unread", "1",
511           &prefs_common.summary_col_pos[S_COL_STATUS], P_INT, NULL, NULL, NULL},
512         {"summary_col_pos_mime", "2",
513           &prefs_common.summary_col_pos[S_COL_MIME], P_INT, NULL, NULL, NULL},
514         {"summary_col_pos_subject", "3",
515           &prefs_common.summary_col_pos[S_COL_SUBJECT], P_INT, NULL, NULL, NULL},
516         {"summary_col_pos_from", "4",
517           &prefs_common.summary_col_pos[S_COL_FROM], P_INT, NULL, NULL, NULL},
518         {"summary_col_pos_date", "5",
519           &prefs_common.summary_col_pos[S_COL_DATE], P_INT, NULL, NULL, NULL},
520         {"summary_col_pos_size", "6",
521           &prefs_common.summary_col_pos[S_COL_SIZE], P_INT, NULL, NULL, NULL},
522         {"summary_col_pos_number", "7",
523           &prefs_common.summary_col_pos[S_COL_NUMBER], P_INT, NULL, NULL, NULL},
524         {"summary_col_pos_score", "8",
525          &prefs_common.summary_col_pos[S_COL_SCORE], P_INT, NULL, NULL, NULL},
526         {"summary_col_pos_locked", "9",
527          &prefs_common.summary_col_pos[S_COL_LOCKED], P_INT, NULL, NULL, NULL},
528         {"summary_col_pos_to", "10",
529           &prefs_common.summary_col_pos[S_COL_TO], P_INT, NULL, NULL, NULL},
530         {"summary_col_pos_tags", "11",
531           &prefs_common.summary_col_pos[S_COL_TAGS], P_INT, NULL, NULL, NULL},
532
533         {"summary_col_size_mark", "10",
534          &prefs_common.summary_col_size[S_COL_MARK], P_INT, NULL, NULL, NULL},
535         {"summary_col_size_unread", "13",
536          &prefs_common.summary_col_size[S_COL_STATUS], P_INT, NULL, NULL, NULL},
537         {"summary_col_size_mime", "10",
538          &prefs_common.summary_col_size[S_COL_MIME], P_INT, NULL, NULL, NULL},
539 #ifndef GENERIC_UMPC
540         {"summary_col_size_subject", "200",
541          &prefs_common.summary_col_size[S_COL_SUBJECT], P_INT, NULL, NULL, NULL},
542         {"summary_col_size_from", "120",
543          &prefs_common.summary_col_size[S_COL_FROM], P_INT, NULL, NULL, NULL},
544         {"summary_col_size_to", "120",
545          &prefs_common.summary_col_size[S_COL_TO], P_INT, NULL, NULL, NULL},
546 #else
547         {"summary_col_size_subject", "300",
548          &prefs_common.summary_col_size[S_COL_SUBJECT], P_INT, NULL, NULL, NULL},
549         {"summary_col_size_from", "150",
550          &prefs_common.summary_col_size[S_COL_FROM], P_INT, NULL, NULL, NULL},
551         {"summary_col_size_to", "150",
552          &prefs_common.summary_col_size[S_COL_TO], P_INT, NULL, NULL, NULL},
553
554 #endif
555         {"summary_col_size_date", "118",
556          &prefs_common.summary_col_size[S_COL_DATE], P_INT, NULL, NULL, NULL},
557         {"summary_col_size_size", "45",
558          &prefs_common.summary_col_size[S_COL_SIZE], P_INT, NULL, NULL, NULL},
559         {"summary_col_size_number", "40",
560          &prefs_common.summary_col_size[S_COL_NUMBER], P_INT, NULL, NULL, NULL},
561         {"summary_col_size_score", "40",
562          &prefs_common.summary_col_size[S_COL_SCORE], P_INT, NULL, NULL, NULL},
563         {"summary_col_size_locked", "13",
564          &prefs_common.summary_col_size[S_COL_LOCKED], P_INT, NULL, NULL, NULL},
565         {"summary_col_size_tags", "150",
566          &prefs_common.summary_col_size[S_COL_TAGS], P_INT, NULL, NULL, NULL},
567
568         /* Widget size */
569         {"folderwin_x", "16", &prefs_common.folderwin_x, P_INT,
570          NULL, NULL, NULL},
571         {"folderwin_y", "16", &prefs_common.folderwin_y, P_INT,
572          NULL, NULL, NULL},
573         {"folderview_width", "270", &prefs_common.folderview_width, P_INT,
574          NULL, NULL, NULL},
575         {"folderview_height", "450", &prefs_common.folderview_height, P_INT,
576          NULL, NULL, NULL},
577         {"folderview_visible", "TRUE", &prefs_common.folderview_visible, P_BOOL,
578          NULL, NULL, NULL},
579
580         {"folder_col_show_folder", "TRUE",
581          &prefs_common.folder_col_visible[F_COL_FOLDER], P_BOOL, NULL, NULL, NULL},
582         {"folder_col_show_new", "TRUE",
583          &prefs_common.folder_col_visible[F_COL_NEW], P_BOOL, NULL, NULL, NULL},
584         {"folder_col_show_unread", "TRUE",
585          &prefs_common.folder_col_visible[F_COL_UNREAD], P_BOOL, NULL, NULL, NULL},
586         {"folder_col_show_total", "TRUE",
587          &prefs_common.folder_col_visible[F_COL_TOTAL], P_BOOL, NULL, NULL, NULL},
588
589         {"folder_col_pos_folder", "0",
590          &prefs_common.folder_col_pos[F_COL_FOLDER], P_INT, NULL, NULL, NULL},
591         {"folder_col_pos_new", "1",
592          &prefs_common.folder_col_pos[F_COL_NEW], P_INT, NULL, NULL, NULL},
593         {"folder_col_pos_unread", "2",
594          &prefs_common.folder_col_pos[F_COL_UNREAD], P_INT, NULL, NULL, NULL},
595         {"folder_col_pos_total", "3",
596          &prefs_common.folder_col_pos[F_COL_TOTAL], P_INT, NULL, NULL, NULL},
597
598 #ifndef GENERIC_UMPC
599         {"folder_col_size_folder", "120",
600          &prefs_common.folder_col_size[F_COL_FOLDER], P_INT, NULL, NULL, NULL},
601         {"folder_col_size_new", "32",
602          &prefs_common.folder_col_size[F_COL_NEW], P_INT, NULL, NULL, NULL},
603         {"folder_col_size_unread", "32",
604          &prefs_common.folder_col_size[F_COL_UNREAD], P_INT, NULL, NULL, NULL},
605         {"folder_col_size_total", "32",
606          &prefs_common.folder_col_size[F_COL_TOTAL], P_INT, NULL, NULL, NULL},
607 #else
608         {"folder_col_size_folder", "400",
609          &prefs_common.folder_col_size[F_COL_FOLDER], P_INT, NULL, NULL, NULL},
610         {"folder_col_size_new", "32",
611          &prefs_common.folder_col_size[F_COL_NEW], P_INT, NULL, NULL, NULL},
612         {"folder_col_size_unread", "32",
613          &prefs_common.folder_col_size[F_COL_UNREAD], P_INT, NULL, NULL, NULL},
614         {"folder_col_size_total", "32",
615          &prefs_common.folder_col_size[F_COL_TOTAL], P_INT, NULL, NULL, NULL},
616 #endif
617         {"summaryview_width", "500", &prefs_common.summaryview_width, P_INT,
618          NULL, NULL, NULL},
619         {"summaryview_height", "244", &prefs_common.summaryview_height, P_INT,
620          NULL, NULL, NULL},
621
622         {"main_messagewin_x", "256", &prefs_common.main_msgwin_x, P_INT,
623          NULL, NULL, NULL},
624         {"main_messagewin_y", "210", &prefs_common.main_msgwin_y, P_INT,
625          NULL, NULL, NULL},
626         {"messageview_width", "500", &prefs_common.msgview_width, P_INT,
627          NULL, NULL, NULL},
628         {"messageview_height", "213", &prefs_common.msgview_height, P_INT,
629          NULL, NULL, NULL},
630         {"messageview_visible", "TRUE", &prefs_common.msgview_visible, P_BOOL,
631          NULL, NULL, NULL},
632
633         {"mainview_x", "64", &prefs_common.mainview_x, P_INT,
634          NULL, NULL, NULL},
635         {"mainview_y", "64", &prefs_common.mainview_y, P_INT,
636          NULL, NULL, NULL},
637         {"mainview_width", "500", &prefs_common.mainview_width, P_INT,
638          NULL, NULL, NULL},
639         {"mainview_height", "400", &prefs_common.mainview_height, P_INT,
640          NULL, NULL, NULL},
641         {"mainwin_x", "64", &prefs_common.mainwin_x, P_INT,
642          NULL, NULL, NULL},
643         {"mainwin_y", "64", &prefs_common.mainwin_y, P_INT,
644          NULL, NULL, NULL},
645         {"mainwin_maximised", "FALSE", &prefs_common.mainwin_maximised, P_BOOL,
646          NULL, NULL, NULL},
647         {"mainwin_fullscreen", "FALSE", &prefs_common.mainwin_fullscreen, 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         {NULL, NULL, NULL, P_OTHER, NULL, NULL, NULL}
1185 };
1186
1187 /*
1188  * Read history list from the specified history file in the specified directory (subdir of rc_dir)
1189  * Fallback to default_list if history file is not found
1190  */
1191 GList *prefs_common_read_history_from_dir_with_defaults(const gchar *dirname, const gchar *history,
1192                                                                                                                           GList *default_list)
1193 {
1194         FILE *fp;
1195         gchar *path;
1196         gchar buf[PREFSBUFSIZE];
1197         GList *tmp = NULL;
1198
1199         if (dirname) {
1200                 path = g_strconcat(get_rc_dir(), G_DIR_SEPARATOR_S, dirname,
1201                                    G_DIR_SEPARATOR_S, history,
1202                                    NULL);
1203         } else {
1204         path = g_strconcat(get_rc_dir(), G_DIR_SEPARATOR_S, history,
1205                            NULL);
1206         }
1207         if ((fp = g_fopen(path, "rb")) == NULL) {
1208                 if (ENOENT != errno) FILE_OP_ERROR(path, "fopen");
1209                 g_free(path);
1210                 /* returns default list if set, otherwise NULL */
1211                 return default_list;
1212         }
1213         g_free(path);
1214         while (fgets(buf, sizeof(buf), fp) != NULL) {
1215                 g_strstrip(buf);
1216                 if (buf[0] == '\0') continue;
1217                 tmp = add_history(tmp, buf);
1218         }
1219         fclose(fp);
1220
1221         tmp = g_list_reverse(tmp);
1222
1223         return tmp;
1224 }
1225
1226 /*
1227  * Read history list from the specified history file in the specified directory (subdir of rc_dir)
1228  */
1229 static GList *prefs_common_read_history_from_dir(const gchar *dirname, const gchar *history) 
1230 {
1231         return prefs_common_read_history_from_dir_with_defaults(dirname, history, NULL);
1232 }
1233
1234 /*
1235  * Read history list from the specified history file
1236  */
1237 static GList *prefs_common_read_history(const gchar *history) 
1238 {
1239         return prefs_common_read_history_from_dir(NULL, history);
1240 }
1241
1242 void prefs_common_read_config(void)
1243 {
1244         gchar *rcpath;
1245         gchar *tmp;
1246
1247         rcpath = g_strconcat(get_rc_dir(), G_DIR_SEPARATOR_S, COMMON_RC, NULL);
1248         prefs_read_config(param, "Common", rcpath, NULL);
1249 #ifdef G_OS_WIN32
1250         prefs_read_config(param_os_specific, "CommonWin32", rcpath, NULL);
1251 #endif
1252
1253         g_free(rcpath);
1254
1255         tmp = g_strdup(gettext(prefs_common.date_format));
1256         g_free(prefs_common.date_format);
1257         prefs_common.date_format = tmp;
1258
1259         prefs_common.mime_open_cmd_history =
1260                 prefs_common_read_history(COMMAND_HISTORY);
1261         prefs_common.summary_quicksearch_history =
1262                 prefs_common_read_history(QUICKSEARCH_HISTORY);
1263         prefs_common.summary_search_from_history =
1264                 prefs_common_read_history(SUMMARY_SEARCH_FROM_HISTORY);
1265         prefs_common.summary_search_to_history =
1266                 prefs_common_read_history(SUMMARY_SEARCH_TO_HISTORY);
1267         prefs_common.summary_search_subject_history =
1268                 prefs_common_read_history(SUMMARY_SEARCH_SUBJECT_HISTORY);
1269         prefs_common.summary_search_body_history =
1270                 prefs_common_read_history(SUMMARY_SEARCH_BODY_HISTORY);
1271         prefs_common.summary_search_adv_condition_history =
1272                 prefs_common_read_history(SUMMARY_SEARCH_ADV_CONDITION_HISTORY);
1273         prefs_common.message_search_history =
1274                 prefs_common_read_history(MESSAGE_SEARCH_HISTORY);
1275         prefs_common.compose_save_to_history =
1276                 prefs_common_read_history(COMPOSE_SAVE_TO_HISTORY);
1277 #ifndef USE_NEW_ADDRBOOK
1278         prefs_common.addressbook_custom_attributes = addressbook_update_custom_attr_from_prefs();
1279 #endif
1280         colorlabel_update_colortable_from_prefs();
1281 }
1282
1283 #define TRY(func) \
1284 if (!(func)) \
1285 { \
1286         g_warning("failed to write\n"); \
1287         goto out;                       \
1288 } \
1289
1290 /*
1291  * Save history list to the specified history file in the specified directory (subdir of rc_dir)
1292  */
1293 static void prefs_common_save_history_to_dir(const gchar *dirname, const gchar *history, GList *list)
1294 {
1295         GList *cur;
1296         FILE *fp;
1297         gchar *path, *tmp_path;
1298
1299         if (dirname) {
1300                 path = g_strconcat(get_rc_dir(), G_DIR_SEPARATOR_S, dirname,
1301                                    G_DIR_SEPARATOR_S, history,
1302                                    NULL);
1303         } else {
1304         path = g_strconcat(get_rc_dir(), G_DIR_SEPARATOR_S, history,
1305                            NULL);
1306         }
1307         tmp_path = g_strconcat(path, ".tmp", NULL);
1308
1309         if ((fp = g_fopen(tmp_path, "wb")) == NULL) {
1310                 FILE_OP_ERROR(tmp_path, "fopen");
1311                 goto out;
1312         }
1313
1314         for (cur = list; cur != NULL; cur = cur->next) {
1315                 TRY(fputs((gchar *)cur->data, fp) != EOF &&
1316                     fputc('\n', fp) != EOF);
1317         }
1318
1319         if (fclose(fp) == EOF) {
1320                 FILE_OP_ERROR(tmp_path, "fclose");
1321                 fp = NULL;
1322                 goto out;
1323         }
1324         fp = NULL;
1325 #ifdef G_OS_WIN32
1326         claws_unlink(path);
1327 #endif
1328         if (g_rename(tmp_path, path) < 0) {
1329                 FILE_OP_ERROR(path, "rename");
1330                 goto out;
1331         }
1332
1333 out:
1334         if (fp)
1335                 fclose(fp);
1336         g_free(tmp_path);
1337         g_free(path);
1338 }
1339
1340 /*
1341  * Save history list to the specified history file
1342  */
1343 static void prefs_common_save_history(const gchar *history, GList *list)
1344 {
1345         prefs_common_save_history_to_dir(NULL, history, list);
1346 }
1347
1348 #undef TRY
1349
1350 void prefs_common_write_config(void)
1351 {
1352         prefs_write_config(param, "Common", COMMON_RC);
1353 #ifdef G_OS_WIN32
1354         prefs_write_config(param_os_specific, "CommonWin32", COMMON_RC);
1355 #endif
1356
1357         prefs_common_save_history(COMMAND_HISTORY, 
1358                 prefs_common.mime_open_cmd_history);
1359         prefs_common_save_history(QUICKSEARCH_HISTORY, 
1360                 prefs_common.summary_quicksearch_history);
1361         prefs_common_save_history(SUMMARY_SEARCH_FROM_HISTORY, 
1362                 prefs_common.summary_search_from_history);
1363         prefs_common_save_history(SUMMARY_SEARCH_TO_HISTORY, 
1364                 prefs_common.summary_search_to_history);
1365         prefs_common_save_history(SUMMARY_SEARCH_SUBJECT_HISTORY, 
1366                 prefs_common.summary_search_subject_history);
1367         prefs_common_save_history(SUMMARY_SEARCH_BODY_HISTORY, 
1368                 prefs_common.summary_search_body_history);
1369         prefs_common_save_history(SUMMARY_SEARCH_ADV_CONDITION_HISTORY, 
1370                 prefs_common.summary_search_adv_condition_history);
1371         prefs_common_save_history(MESSAGE_SEARCH_HISTORY, 
1372                 prefs_common.message_search_history);
1373         prefs_common_save_history(COMPOSE_SAVE_TO_HISTORY, 
1374                 prefs_common.compose_save_to_history);
1375
1376 #ifndef USE_NEW_ADDRBOOK
1377                 prefs_common_save_history_to_dir(ADDRBOOK_DIR,
1378                 ADDRESSBOOK_CUSTOM_ATTRIBUTES, 
1379                 prefs_common.addressbook_custom_attributes);
1380 #endif
1381 }
1382
1383 /* make a copy of string 'in' into buffer 'out'. un-escape \ sequences.
1384    both 'in' and 'out' must be non-NULL.
1385    'out' must be a pointer to a buffer whose size is at least equal
1386    to strlen(txt)+1, this buffer will get cleared. out's contents
1387    will always get set to a valid string, even if it's "".*/
1388 void pref_get_unescaped_pref(gchar *out, const gchar *in)
1389 {
1390         const gchar *i;
1391         gchar *o;
1392
1393         *out = '\0';
1394
1395         cm_return_if_fail( in != NULL );
1396         cm_return_if_fail( out != NULL );
1397
1398         i = in;
1399         o = out;
1400         memset(out, 0, strlen(in)+1);
1401         while (*i != '\0') {
1402                 if (*i == '\\' && *(i+1) == 'n') {
1403                         *o++ = '\n';
1404                         i++;
1405                 } else if (*i == '\\' && *(i+1) == 't') {
1406                         *o++ = '\t';
1407                         i++;
1408                 } else if (*i == '\\' && *(i+1) == '\\') {
1409                         *o++ = '\\';
1410                         i++;
1411                 } else {
1412                         *o++ = *i;
1413                 }
1414                 i++;
1415         }
1416         *o='\0';
1417 }
1418
1419 /* make a copy of string 'in' into buffer 'out'. escape \ sequences.
1420    both 'in' and 'out' must be non-NULL.
1421    'out' must be a pointer to a buffer whose size is at least equal
1422    to 2*strlen(txt)+1. out's contents will always get set to a valid
1423    string, even if it's "". */
1424 void pref_get_escaped_pref(gchar *out, const gchar *in)
1425 {
1426         const gchar *i;
1427         gchar *o;
1428
1429         *out = '\0';
1430
1431         cm_return_if_fail( in != NULL );
1432         cm_return_if_fail( out != NULL );
1433
1434         i = in;
1435         o = out;
1436         while (*i != '\0') {
1437                 if (*i == '\n') {
1438                         *o++ = '\\';
1439                         *o++ = 'n';
1440                 } else if (*i == '\t') {
1441                         *o++ = '\\';
1442                         *o++ = 't';
1443                 } else if (*i == '\\') {
1444                         *o++ = '\\';
1445                         *o++ = '\\';
1446                 } else {
1447                         *o++ = *i;
1448                 }
1449                 i++;
1450         }
1451         *o = '\0';
1452 }
1453                 
1454 /* set the contents of a textview widget from the internal \-escaped
1455   representation of a pref string. both txt and textview must be non-NULL. */
1456 void pref_set_textview_from_pref(GtkTextView *textview, const gchar *txt)
1457 {
1458         GtkTextBuffer *buffer;
1459         gchar *out = NULL;
1460
1461         cm_return_if_fail( textview != NULL );
1462
1463         buffer = gtk_text_view_get_buffer(textview);
1464
1465         if (!txt) {
1466                 gtk_text_buffer_set_text(buffer, "", -1);
1467         } else {
1468                 out = g_malloc(strlen(txt)+1);
1469
1470                 pref_get_unescaped_pref(out, txt);
1471
1472                 gtk_text_buffer_set_text(buffer, out?out:"", -1);
1473                 g_free(out);
1474         }
1475 }
1476
1477 /* set the contents of a gtkentry widget from the internal \-escaped
1478   representation of a pref string. both txt and entry must be non-NULL. */
1479 void pref_set_entry_from_pref(GtkEntry *entry, const gchar *txt)
1480 {
1481         gchar *out = NULL;
1482
1483         cm_return_if_fail( entry != NULL );
1484         if (!txt) {
1485                 gtk_entry_set_text(entry, "");
1486         } else {
1487                 out = g_malloc(strlen(txt)+1);
1488
1489                 pref_get_unescaped_pref(out, txt);
1490
1491                 gtk_entry_set_text(entry, out?out:"");
1492                 g_free(out);
1493         }
1494 }
1495
1496 /* get the \-escaped internal representation of a pref from the contents of
1497    a textview widget. textview must be non-NULL. */
1498 gchar *pref_get_pref_from_textview(GtkTextView *textview) 
1499 {
1500         GtkTextBuffer *buffer;
1501         GtkTextIter start, end;
1502         gchar *out, *tmp;
1503         
1504         cm_return_val_if_fail( textview != NULL, "" );
1505
1506         buffer = gtk_text_view_get_buffer(textview);
1507         gtk_text_buffer_get_start_iter(buffer, &start);
1508         gtk_text_buffer_get_iter_at_offset(buffer, &end, -1);
1509         tmp = gtk_text_buffer_get_text(buffer, &start, &end, FALSE);
1510         out = malloc(2*strlen(tmp)+1);
1511         if (out)
1512                 pref_get_escaped_pref(out, tmp);
1513         g_free(tmp);
1514
1515         return out?out:"";
1516 }
1517
1518 /* get the \-escaped internal representation of a pref from the contents of
1519    a gtkentry widget. entry must be non-NULL. */
1520 gchar *pref_get_pref_from_entry(GtkEntry *entry) 
1521 {
1522         gchar *out, *tmp;
1523
1524         cm_return_val_if_fail( entry != NULL, "" );
1525
1526         tmp = gtk_editable_get_chars(GTK_EDITABLE(entry), 0, -1);
1527         out = malloc(2*strlen(tmp)+1);
1528         
1529         if (out)
1530                 pref_get_escaped_pref(out, tmp);
1531         g_free(tmp);
1532
1533         return out?out:"";
1534 }
1535
1536 /* ugly hack to be able to get this pref from ssl_certificate.c */
1537 gboolean prefs_common_unsafe_ssl_certs(void)
1538 {
1539         return prefs_common.unsafe_ssl_certs;
1540 }
1541
1542 gboolean prefs_common_enable_log_standard(void)
1543 {
1544         return prefs_common.enable_log_standard;
1545 }
1546
1547 gboolean prefs_common_enable_log_warning(void)
1548 {
1549         return prefs_common.enable_log_warning;
1550 }
1551 gboolean prefs_common_enable_log_error(void)
1552 {
1553         return prefs_common.enable_log_error;
1554 }
1555 gboolean prefs_common_enable_log_status(void)
1556 {
1557         return prefs_common.enable_log_status;
1558 }
1559
1560 #ifdef MAEMO
1561 const gchar *prefs_common_get_data_root(void)
1562 {
1563         if (prefs_common.data_root && *prefs_common.data_root)
1564                 return prefs_common.data_root;
1565         else
1566                 return NULL;
1567 }
1568 #endif
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 }