25ac2bea24c4eca0ad5cdd2a183ef9b4dabe1d82
[claws.git] / src / prefs_common.c
1 /*
2  * Sylpheed -- a GTK+ based, lightweight, and fast e-mail client
3  * Copyright (C) 1999-2013 Hiroyuki Yamamoto and the Claws Mail team
4  *
5  * This program is free software; you can redistribute it and/or modify
6  * it under the terms of the GNU General Public License as published by
7  * the Free Software Foundation; either version 3 of the License, or
8  * (at your option) any later version.
9  *
10  * This program is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13  * GNU General Public License for more details.
14  *
15  * You should have received a copy of the GNU General Public License
16  * along with this program. If not, see <http://www.gnu.org/licenses/>.
17  * 
18  */
19
20 #ifdef HAVE_CONFIG_H
21 #  include "config.h"
22 #include "claws-features.h"
23 #endif
24
25 #include "defs.h"
26
27 #include <glib.h>
28 #include <glib/gi18n.h>
29 #include <gtk/gtk.h>
30 #include <gdk/gdkkeysyms.h>
31 #include <stdio.h>
32 #include <stdlib.h>
33 #include <string.h>
34 #include <unistd.h>
35 #include <sys/types.h>
36 #include <sys/stat.h>
37 #include <errno.h>
38
39 #include "main.h"
40 #include "prefs_gtk.h"
41 #include "prefs_common.h"
42 #include "prefs_display_header.h"
43 #include "prefs_summary_column.h"
44 #include "prefs_folder_column.h"
45 #include "mainwindow.h"
46 #include "summaryview.h"
47 #include "folderview.h"
48 #include "messageview.h"
49 #include "manage_window.h"
50 #include "inc.h"
51 #include "menu.h"
52 #include "codeconv.h"
53 #include "utils.h"
54 #include "gtkutils.h"
55 #include "alertpanel.h"
56 #include "folder.h"
57 #include "socket.h"
58 #include "filesel.h"
59 #include "folderview.h"
60 #include "stock_pixmap.h"
61 #include "prefswindow.h"
62 #include "colorlabel.h"
63 #ifndef USE_NEW_ADDRBOOK
64         #include "addrcustomattr.h"
65 #endif
66
67 enum {
68         DATEFMT_FMT,
69         DATEFMT_TXT,
70         N_DATEFMT_COLUMNS
71 };
72
73 PrefsCommon prefs_common;
74
75 GtkWidget *notebook;
76
77 #ifdef G_OS_WIN32
78 /*
79  * In the Windows version prefs_common contains
80  *   - the non-OS-specific settings of the "Common" section and
81  *   - the OS-specific settings of the "CommonWin32" section
82  * The OS-specific settings of the "Common" section are not used
83  * but saved in prefs_unix.
84  */
85
86 #  define SPECIFIC_PREFS prefs_unix
87
88 static PrefsCommon prefs_unix;
89
90 static PrefParam param_os_specific[] = {
91         /* Receive */
92         {"ext_inc_path", "",
93          &prefs_common.extinc_cmd, P_STRING, NULL, NULL, NULL},
94         {"newmail_notify_cmd", "",
95          &prefs_common.newmail_notify_cmd, P_STRING, NULL, NULL, NULL},
96
97         /* new fonts */
98         {"widget_font_gtk2",    NULL,
99           &prefs_common.widgetfont,             P_STRING, NULL, NULL, NULL},
100         {"message_font_gtk2",   "Monospace 9",
101          &prefs_common.textfont,                P_STRING, NULL, NULL, NULL},
102         {"print_font_gtk2",     "Monospace 9",
103          &prefs_common.printfont,               P_STRING, NULL, NULL, NULL},
104         {"small_font_gtk2",     "Sans 9",
105           &prefs_common.smallfont,              P_STRING, NULL, NULL, NULL},
106         {"normal_font_gtk2",    "Sans 9",
107           &prefs_common.normalfont,             P_STRING, NULL, NULL, NULL},
108         {"bold_font_gtk2",      "Sans 9 Bold",
109           &prefs_common.boldfont,               P_STRING, NULL, NULL, NULL},
110         /* Message */
111         {"attach_save_directory", NULL,
112          &prefs_common.attach_save_dir, P_STRING, NULL, NULL, NULL},
113         {"attach_load_directory", NULL,
114          &prefs_common.attach_load_dir, P_STRING, NULL, NULL, NULL},
115
116         /* MIME viewer */
117         {"mime_textviewer", NULL,
118          &prefs_common.mime_textviewer,   P_STRING, NULL, NULL, NULL},
119         {"mime_open_command", "notepad '%s'",
120          &prefs_common.mime_open_cmd,     P_STRING, NULL, NULL, NULL},
121
122         /* Interface */
123         {"pixmap_theme_path", DEFAULT_PIXMAP_THEME, 
124          &prefs_common.pixmap_theme_path, P_STRING, NULL, NULL, NULL},
125
126         /* Other */
127         {"ext_editor_command", "notepad %s",
128          &prefs_common.ext_editor_cmd, P_STRING, NULL, NULL, NULL},
129
130         {NULL, NULL, NULL, P_OTHER, NULL, NULL, NULL}
131 };
132 #else
133 #  define SPECIFIC_PREFS prefs_common
134 #endif
135
136 /*
137    parameter name, default value, pointer to the prefs variable, data type,
138    pointer to the widget pointer,
139    pointer to the function for data setting,
140    pointer to the function for widget setting
141  */
142
143 static PrefParam param[] = {
144         /* Receive */
145         {"use_ext_inc", "FALSE", &prefs_common.use_extinc, P_BOOL,
146          NULL, NULL, NULL},
147         {"ext_inc_path", DEFAULT_INC_PATH, &SPECIFIC_PREFS.extinc_cmd, P_STRING,
148          NULL, NULL, NULL},
149
150         {"autochk_newmail", "FALSE", &prefs_common.autochk_newmail, P_BOOL,
151          NULL, NULL, NULL},
152         {"autochk_interval", "10", &prefs_common.autochk_itv, P_INT,
153          NULL, NULL, NULL},
154         {"check_on_startup", "FALSE", &prefs_common.chk_on_startup, P_BOOL,
155          NULL, NULL, NULL},
156         {"open_inbox_on_inc", "FALSE", &prefs_common.open_inbox_on_inc,
157          P_BOOL, NULL, NULL, NULL},
158         {"scan_all_after_inc", "FALSE", &prefs_common.scan_all_after_inc,
159          P_BOOL, NULL, NULL, NULL},
160         {"newmail_notify_manu", "FALSE", &prefs_common.newmail_notify_manu,
161          P_BOOL, NULL, NULL, NULL},
162         {"newmail_notify_auto", "FALSE", &prefs_common.newmail_notify_auto,
163         P_BOOL, NULL, NULL, NULL},
164         {"newmail_notify_cmd", "", &SPECIFIC_PREFS.newmail_notify_cmd, P_STRING,
165          NULL, NULL, NULL},
166         {"receive_dialog_mode", "2", &prefs_common.recv_dialog_mode, P_ENUM,
167          NULL, NULL, NULL},
168         {"receivewin_width", "460", &prefs_common.receivewin_width, P_INT,
169          NULL, NULL, NULL},
170         {"receivewin_height", "-1", &prefs_common.receivewin_height, P_INT,
171          NULL, NULL, NULL},
172         {"no_receive_error_panel", "FALSE", &prefs_common.no_recv_err_panel,
173          P_BOOL, NULL, NULL, NULL},
174         {"close_receive_dialog", "TRUE", &prefs_common.close_recv_dialog,
175          P_BOOL, NULL, NULL, NULL},
176  
177         /* Send */
178         {"save_message", "TRUE", &prefs_common.savemsg, P_BOOL,
179          NULL, NULL, NULL},
180         {"confirm_send_queued_messages", "FALSE", &prefs_common.confirm_send_queued_messages,
181          P_BOOL, NULL, NULL, NULL},
182 #ifndef GENERIC_UMPC
183         {"send_dialog_mode", "0", &prefs_common.send_dialog_invisible, P_BOOL,
184          NULL, NULL, NULL},
185 #else
186         {"send_dialog_mode", "1", &prefs_common.send_dialog_invisible, P_BOOL,
187          NULL, NULL, NULL},
188 #endif
189         {"sendwin_width", "460", &prefs_common.sendwin_width, P_INT,
190          NULL, NULL, NULL},
191         {"sendwin_height", "-1", &prefs_common.sendwin_height, P_INT,
192          NULL, NULL, NULL},
193
194         {"outgoing_charset", CS_AUTO, &prefs_common.outgoing_charset, P_STRING,
195          NULL, NULL, NULL},
196         {"encoding_method", "0", &prefs_common.encoding_method, P_ENUM,
197          NULL, NULL, NULL},
198         {"outgoing_fallback_to_ascii", "TRUE", &prefs_common.outgoing_fallback_to_ascii, P_BOOL,
199          NULL, NULL, NULL},
200         {"warn_empty_subj", "TRUE", &prefs_common.warn_empty_subj,
201          P_BOOL, NULL, NULL, NULL},
202
203         {"allow_jisx0201_kana", "FALSE", &prefs_common.allow_jisx0201_kana,
204          P_BOOL, NULL, NULL, NULL},
205
206         /* Compose */
207         {"auto_ext_editor", "FALSE", &prefs_common.auto_exteditor, P_BOOL,
208          NULL, NULL, NULL},
209         {"forward_as_attachment", "FALSE", &prefs_common.forward_as_attachment,
210          P_BOOL, NULL, NULL, NULL},
211         {"redirect_keep_from", "FALSE",
212          &prefs_common.redirect_keep_from, P_BOOL,
213          NULL, NULL, NULL},
214         {"undo_level", "50", &prefs_common.undolevels, P_INT,
215          NULL, NULL, NULL},
216         {"compose_with_format", "FALSE", &prefs_common.compose_with_format, P_BOOL,
217          NULL, NULL, NULL},
218         {"compose_subject_format", "",
219          &prefs_common.compose_subject_format, P_STRING, NULL, NULL, NULL},
220         {"compose_body_format", N_("Hello,\\n"),
221          &prefs_common.compose_body_format, P_STRING, NULL, NULL, NULL},
222         {"show_compose_margin", "FALSE", &prefs_common.show_compose_margin, P_BOOL,
223          NULL, NULL, NULL},
224         
225
226         {"linewrap_length", "72", &prefs_common.linewrap_len, P_INT,
227          NULL, NULL, NULL},
228         {"linewrap_quotation", "TRUE", &prefs_common.linewrap_quote, P_BOOL,
229          NULL, NULL, NULL},
230         {"linewrap_pastes", "TRUE", &prefs_common.linewrap_pastes, P_BOOL,
231          NULL, NULL, NULL},
232         {"primary_paste_unselects", "FALSE", &prefs_common.primary_paste_unselects, P_BOOL,
233          NULL, NULL, NULL},
234         {"linewrap_auto", "TRUE", &prefs_common.autowrap, P_BOOL,
235          NULL, NULL, NULL},
236         {"auto_indent", "TRUE", &prefs_common.auto_indent, P_BOOL,
237          NULL, NULL, NULL},
238         {"autosave", "TRUE", &prefs_common.autosave,
239          P_BOOL, NULL, NULL, NULL},
240         {"autosave_length", "50", &prefs_common.autosave_length, P_INT,
241          NULL, NULL, NULL},
242         {"autosave_encrypted", "TRUE", &prefs_common.autosave_encrypted,
243          P_BOOL, NULL, NULL, NULL},
244         {"warn_large_insert", "TRUE", &prefs_common.warn_large_insert,
245          P_BOOL, NULL, NULL, NULL},
246         {"warn_large_insert_size", "500", &prefs_common.warn_large_insert_size,
247          P_INT, NULL, NULL, NULL},
248
249         {"enable_aspell", "TRUE", &prefs_common.enable_aspell, P_BOOL,
250          NULL, NULL, NULL},
251         {"dictionary",  "", &prefs_common.dictionary, P_STRING,
252          NULL, NULL, NULL},
253         {"alt_dictionary",  "", &prefs_common.alt_dictionary, P_STRING,
254          NULL, NULL, NULL},
255         {"use_alternate_dict", "FALSE", &prefs_common.use_alternate, P_BOOL,
256          NULL, NULL, NULL},
257         {"check_while_typing", "TRUE", &prefs_common.check_while_typing, P_BOOL,
258          NULL, NULL, NULL},
259         {"recheck_when_changing_dict", "TRUE", &prefs_common.recheck_when_changing_dict,
260          P_BOOL, NULL, NULL, NULL},
261         {"misspelled_color", "#ff0000", &prefs_common.misspelled_col, P_COLOR,
262          NULL, NULL, NULL},
263         {"use_both_dicts", "FALSE", &prefs_common.use_both_dicts, P_BOOL,
264          NULL, NULL, NULL},
265
266         {"reply_with_quote", "TRUE", &prefs_common.reply_with_quote, P_BOOL,
267          NULL, NULL, NULL},
268         {"compose_dnd_insert_or_attach", "0", &prefs_common.compose_dnd_mode, P_ENUM,
269          NULL, NULL, NULL},
270
271         /* Account autoselection */
272         {"reply_account_autoselect", "TRUE",
273          &prefs_common.reply_account_autosel, P_BOOL,
274          NULL, NULL, NULL},
275         {"forward_account_autoselect", "TRUE",
276          &prefs_common.forward_account_autosel, P_BOOL,
277          NULL, NULL, NULL},
278         {"reedit_account_autoselect", "TRUE",
279          &prefs_common.reedit_account_autosel, P_BOOL,
280          NULL, NULL, NULL},
281
282         {"default_reply_list", "TRUE", &prefs_common.default_reply_list, P_BOOL,
283          NULL, NULL, NULL},
284
285 #ifndef GENERIC_UMPC
286         {"show_ruler", "TRUE", &prefs_common.show_ruler, P_BOOL,
287          NULL, NULL, NULL},
288 #else
289         {"show_ruler", "FALSE", &prefs_common.show_ruler, P_BOOL,
290          NULL, NULL, NULL},
291 #endif
292
293         /* Quote */
294         {"reply_quote_mark", "> ", &prefs_common.quotemark, P_STRING,
295          NULL, NULL, NULL},
296         {"reply_quote_format", N_("On %d\\n%f wrote:\\n\\n%q\\n%X"),
297          &prefs_common.quotefmt, P_STRING, NULL, NULL, NULL},
298
299         {"forward_quote_mark", "> ", &prefs_common.fw_quotemark, P_STRING,
300          NULL, NULL, NULL},
301         {"forward_quote_format",
302          N_("\\n\\nBegin forwarded message:\\n\\n"
303          "?d{Date: %d\\n}?f{From: %f\\n}?t{To: %t\\n}?c{Cc: %c\\n}"
304          "?n{Newsgroups: %n\\n}?s{Subject: %s\\n}\\n\\n%M"),
305          &prefs_common.fw_quotefmt, P_STRING,
306          NULL, NULL, NULL},
307         {"quote_chars", ">", &prefs_common.quote_chars, P_STRING,
308          NULL, NULL, NULL},
309
310         /* Display */
311         /* Obsolete fonts. For coexisting with Gtk+-1.2 version */
312         {"widget_font",         NULL,
313           &prefs_common.widgetfont_gtk1,        P_STRING, NULL, NULL, NULL},
314         {"message_font",        "-misc-fixed-medium-r-normal--14-*-*-*-*-*-*-*",
315          &prefs_common.textfont_gtk1,           P_STRING, NULL, NULL, NULL},
316         {"small_font",          "-*-helvetica-medium-r-normal--10-*-*-*-*-*-*-*",
317           &prefs_common.smallfont_gtk1,         P_STRING, NULL, NULL, NULL},
318         {"bold_font",           "-*-helvetica-bold-r-normal--12-*-*-*-*-*-*-*",
319           &prefs_common.boldfont_gtk1,          P_STRING, NULL, NULL, NULL},
320         {"normal_font",         "-*-helvetica-medium-r-normal--12-*-*-*-*-*-*-*",
321           &prefs_common.normalfont_gtk1,        P_STRING, NULL, NULL, NULL},
322
323         /* new fonts */
324 #ifndef GENERIC_UMPC
325         {"widget_font_gtk2",    NULL,
326           &SPECIFIC_PREFS.widgetfont,           P_STRING, NULL, NULL, NULL},
327         {"message_font_gtk2",   "Monospace 9",
328          &SPECIFIC_PREFS.textfont,                      P_STRING, NULL, NULL, NULL},
329         {"print_font_gtk2",     "Monospace 9",
330          &SPECIFIC_PREFS.printfont,             P_STRING, NULL, NULL, NULL},
331         {"small_font_gtk2",     "Sans 9",
332           &SPECIFIC_PREFS.smallfont,            P_STRING, NULL, NULL, NULL},
333         {"normal_font_gtk2",    "Sans 9",
334           &SPECIFIC_PREFS.normalfont,           P_STRING, NULL, NULL, NULL},
335         {"bold_font_gtk2",      "Sans Bold 9",
336           &SPECIFIC_PREFS.boldfont,             P_STRING, NULL, NULL, NULL},
337 #else
338         {"widget_font_gtk2",    NULL,
339           &SPECIFIC_PREFS.widgetfont,           P_STRING, NULL, NULL, NULL},
340         {"message_font_gtk2",   "Monospace 8",
341          &SPECIFIC_PREFS.textfont,                      P_STRING, NULL, NULL, NULL},
342         {"print_font_gtk2",     "Monospace 8",
343          &SPECIFIC_PREFS.printfont,             P_STRING, NULL, NULL, NULL},
344         {"small_font_gtk2",     "Sans 8",
345           &SPECIFIC_PREFS.smallfont,            P_STRING, NULL, NULL, NULL},
346         {"normal_font_gtk2",    "Sans 8",
347           &SPECIFIC_PREFS.normalfont,           P_STRING, NULL, NULL, NULL},
348         {"bold_font_gtk2",      "Sans Bold 8",
349           &SPECIFIC_PREFS.boldfont,             P_STRING, NULL, NULL, NULL},
350 #endif
351
352         {"use_different_print_font", "FALSE", &prefs_common.use_different_print_font, P_BOOL,
353          NULL, NULL, NULL},
354         {"derive_from_normal_font", "TRUE", &prefs_common.derive_from_normal_font, P_BOOL,
355          NULL, NULL, NULL},
356
357         /* custom colors */
358         {"custom_color1", "#ff9900", &prefs_common.custom_colorlabel[0].color, P_COLOR,
359          NULL, NULL, NULL},
360         {"custom_colorlabel1", N_("Orange"), &prefs_common.custom_colorlabel[0].label, P_STRING,
361          NULL, NULL, NULL},
362         {"custom_color2", "#ff0000", &prefs_common.custom_colorlabel[1].color, P_COLOR,
363          NULL, NULL, NULL},
364         {"custom_colorlabel2", N_("Red"), &prefs_common.custom_colorlabel[1].label, P_STRING,
365          NULL, NULL, NULL},
366         {"custom_color3", "#ff66ff", &prefs_common.custom_colorlabel[2].color, P_COLOR,
367          NULL, NULL, NULL},
368         {"custom_colorlabel3", N_("Pink"), &prefs_common.custom_colorlabel[2].label, P_STRING,
369          NULL, NULL, NULL},
370         {"custom_color4", "#00ccff", &prefs_common.custom_colorlabel[3].color, P_COLOR,
371          NULL, NULL, NULL},
372         {"custom_colorlabel4", N_("Sky blue"), &prefs_common.custom_colorlabel[3].label, P_STRING,
373          NULL, NULL, NULL},
374         {"custom_color5", "#0000ff", &prefs_common.custom_colorlabel[4].color, P_COLOR,
375          NULL, NULL, NULL},
376         {"custom_colorlabel5", N_("Blue"), &prefs_common.custom_colorlabel[4].label, P_STRING,
377          NULL, NULL, NULL},
378         {"custom_color6", "#009900", &prefs_common.custom_colorlabel[5].color, P_COLOR,
379          NULL, NULL, NULL},
380         {"custom_colorlabel6", N_("Green"), &prefs_common.custom_colorlabel[5].label, P_STRING,
381          NULL, NULL, NULL},
382         {"custom_color7", "#663333", &prefs_common.custom_colorlabel[6].color, P_COLOR,
383          NULL, NULL, NULL},
384         {"custom_colorlabel7", N_("Brown"), &prefs_common.custom_colorlabel[6].label, P_STRING,
385          NULL, NULL, NULL},
386         {"custom_color8", "#aaaaaa", &prefs_common.custom_colorlabel[7].color, P_COLOR,
387          NULL, NULL, NULL},
388         {"custom_colorlabel8", N_("Grey"), &prefs_common.custom_colorlabel[7].label, P_STRING,
389          NULL, NULL, NULL},
390         {"custom_color9", "#c07254", &prefs_common.custom_colorlabel[8].color, P_COLOR,
391          NULL, NULL, NULL},
392         {"custom_colorlabel9", N_("Light brown"), &prefs_common.custom_colorlabel[8].label, P_STRING,
393          NULL, NULL, NULL},
394         {"custom_color10", "#c00000", &prefs_common.custom_colorlabel[9].color, P_COLOR,
395          NULL, NULL, NULL},
396         {"custom_colorlabel10", N_("Dark red"), &prefs_common.custom_colorlabel[9].label, P_STRING,
397          NULL, NULL, NULL},
398         {"custom_color11", "#cc1074", &prefs_common.custom_colorlabel[10].color, P_COLOR,
399          NULL, NULL, NULL},
400         {"custom_colorlabel11", N_("Dark pink"), &prefs_common.custom_colorlabel[10].label, P_STRING,
401          NULL, NULL, NULL},
402         {"custom_color12", "#5094cd", &prefs_common.custom_colorlabel[11].color, P_COLOR,
403          NULL, NULL, NULL},
404         {"custom_colorlabel12", N_("Steel blue"), &prefs_common.custom_colorlabel[11].label, P_STRING,
405          NULL, NULL, NULL},
406         {"custom_color13", "#ffd500", &prefs_common.custom_colorlabel[12].color, P_COLOR,
407          NULL, NULL, NULL},
408         {"custom_colorlabel13", N_("Gold"), &prefs_common.custom_colorlabel[12].label, P_STRING,
409          NULL, NULL, NULL},
410         {"custom_color14", "#00d800", &prefs_common.custom_colorlabel[13].color, P_COLOR,
411          NULL, NULL, NULL},
412         {"custom_colorlabel14", N_("Bright green"), &prefs_common.custom_colorlabel[13].label, P_STRING,
413          NULL, NULL, NULL},
414         {"custom_color15", "#c060c0", &prefs_common.custom_colorlabel[14].color, P_COLOR,
415          NULL, NULL, NULL},
416         {"custom_colorlabel15", N_("Magenta"), &prefs_common.custom_colorlabel[14].label, P_STRING,
417          NULL, NULL, NULL},
418
419         /* image viewer */
420         {"display_image", "TRUE", &prefs_common.display_img, P_BOOL,
421          NULL, NULL, NULL},
422         {"resize_image", "TRUE", &prefs_common.resize_img, P_BOOL,
423          NULL, NULL, NULL},
424         {"inline_image", "TRUE", &prefs_common.inline_img, P_BOOL,
425          NULL, NULL, NULL},
426
427         {"display_folder_unread_num", "0",
428          &prefs_common.display_folder_unread, P_INT,
429          NULL, NULL, NULL},
430         {"newsgroup_abbrev_len", "16",
431          &prefs_common.ng_abbrev_len, P_INT,
432          NULL, NULL, NULL},
433
434         {"translate_header", "FALSE", &prefs_common.trans_hdr, P_BOOL,
435          NULL, NULL, NULL},
436
437         /* Display: Summary View */
438         {"use_address_book", "FALSE", &prefs_common.use_addr_book, P_BOOL,
439          NULL, NULL, NULL},
440         {"thread_by_subject", "TRUE", &prefs_common.thread_by_subject, P_BOOL,
441          NULL, NULL, NULL},
442         {"date_format", N_("%x(%a) %H:%M"), &prefs_common.date_format,
443          P_STRING, NULL, NULL, NULL},
444         {"msgview_date_format", "FALSE", &prefs_common.msgview_date_format, P_BOOL,
445          NULL, NULL, NULL},
446
447         {"bold_unread", "TRUE", &prefs_common.bold_unread, P_BOOL,
448          NULL, NULL, NULL},
449
450         {"enable_thread", "TRUE", &prefs_common.enable_thread, P_BOOL,
451          NULL, NULL, NULL},
452 #ifndef GENERIC_UMPC
453         {"toolbar_style", "3", &prefs_common.toolbar_style, P_ENUM,
454          NULL, NULL, NULL},
455 #else
456         {"toolbar_style", "1", &prefs_common.toolbar_style, P_ENUM,
457          NULL, NULL, NULL},
458 #endif
459         {"toolbar_detachable", "FALSE", &prefs_common.toolbar_detachable, P_BOOL,
460          NULL, NULL, NULL},
461         {"show_col_headers", "TRUE", &prefs_common.show_col_headers, P_BOOL,
462          NULL, NULL, NULL},
463 #ifndef GENERIC_UMPC
464         {"show_statusbar", "TRUE", &prefs_common.show_statusbar, P_BOOL,
465          NULL, NULL, NULL},
466         {"show_searchbar", "TRUE", &prefs_common.show_searchbar, P_BOOL,
467          NULL, NULL, NULL},
468 #else
469         {"show_statusbar", "FALSE", &prefs_common.show_statusbar, P_BOOL,
470          NULL, NULL, NULL},
471         {"show_searchbar", "FALSE", &prefs_common.show_searchbar, P_BOOL,
472          NULL, NULL, NULL},
473 #endif
474
475         {"summary_col_show_mark", "TRUE",
476          &prefs_common.summary_col_visible[S_COL_MARK], P_BOOL, NULL, NULL, NULL},
477         {"summary_col_show_unread", "TRUE",
478          &prefs_common.summary_col_visible[S_COL_STATUS], P_BOOL, NULL, NULL, NULL},
479         {"summary_col_show_subject", "TRUE",
480          &prefs_common.summary_col_visible[S_COL_SUBJECT], P_BOOL, NULL, NULL, NULL},
481         {"summary_col_show_from", "TRUE",
482          &prefs_common.summary_col_visible[S_COL_FROM], P_BOOL, NULL, NULL, NULL},
483         {"summary_col_show_to", "FALSE",
484          &prefs_common.summary_col_visible[S_COL_TO], P_BOOL, NULL, NULL, NULL},
485         {"summary_col_show_date", "TRUE",
486          &prefs_common.summary_col_visible[S_COL_DATE], P_BOOL, NULL, NULL, NULL},
487         {"summary_col_show_mime", "TRUE",
488          &prefs_common.summary_col_visible[S_COL_MIME], P_BOOL, NULL, NULL, NULL},
489         {"summary_col_show_size", "TRUE",
490          &prefs_common.summary_col_visible[S_COL_SIZE], P_BOOL, NULL, NULL, NULL},
491         {"summary_col_show_number", "FALSE",
492          &prefs_common.summary_col_visible[S_COL_NUMBER], P_BOOL, NULL, NULL, NULL},
493         {"summary_col_show_score", "FALSE",
494          &prefs_common.summary_col_visible[S_COL_SCORE], P_BOOL, NULL, NULL, NULL},
495         {"summary_col_show_locked", "FALSE",
496          &prefs_common.summary_col_visible[S_COL_LOCKED], P_BOOL, NULL, NULL, NULL},
497         {"summary_col_show_tags", "FALSE",
498          &prefs_common.summary_col_visible[S_COL_TAGS], P_BOOL, NULL, NULL, NULL},
499
500         {"summary_col_pos_mark", "0",
501           &prefs_common.summary_col_pos[S_COL_MARK], P_INT, NULL, NULL, NULL},
502         {"summary_col_pos_unread", "1",
503           &prefs_common.summary_col_pos[S_COL_STATUS], P_INT, NULL, NULL, NULL},
504         {"summary_col_pos_mime", "2",
505           &prefs_common.summary_col_pos[S_COL_MIME], P_INT, NULL, NULL, NULL},
506         {"summary_col_pos_subject", "3",
507           &prefs_common.summary_col_pos[S_COL_SUBJECT], P_INT, NULL, NULL, NULL},
508         {"summary_col_pos_from", "4",
509           &prefs_common.summary_col_pos[S_COL_FROM], P_INT, NULL, NULL, NULL},
510         {"summary_col_pos_date", "5",
511           &prefs_common.summary_col_pos[S_COL_DATE], P_INT, NULL, NULL, NULL},
512         {"summary_col_pos_size", "6",
513           &prefs_common.summary_col_pos[S_COL_SIZE], P_INT, NULL, NULL, NULL},
514         {"summary_col_pos_number", "7",
515           &prefs_common.summary_col_pos[S_COL_NUMBER], P_INT, NULL, NULL, NULL},
516         {"summary_col_pos_score", "8",
517          &prefs_common.summary_col_pos[S_COL_SCORE], P_INT, NULL, NULL, NULL},
518         {"summary_col_pos_locked", "9",
519          &prefs_common.summary_col_pos[S_COL_LOCKED], P_INT, NULL, NULL, NULL},
520         {"summary_col_pos_to", "10",
521           &prefs_common.summary_col_pos[S_COL_TO], P_INT, NULL, NULL, NULL},
522         {"summary_col_pos_tags", "11",
523           &prefs_common.summary_col_pos[S_COL_TAGS], P_INT, NULL, NULL, NULL},
524
525         {"summary_col_size_mark", "10",
526          &prefs_common.summary_col_size[S_COL_MARK], P_INT, NULL, NULL, NULL},
527         {"summary_col_size_unread", "13",
528          &prefs_common.summary_col_size[S_COL_STATUS], P_INT, NULL, NULL, NULL},
529         {"summary_col_size_mime", "10",
530          &prefs_common.summary_col_size[S_COL_MIME], P_INT, NULL, NULL, NULL},
531 #ifndef GENERIC_UMPC
532         {"summary_col_size_subject", "200",
533          &prefs_common.summary_col_size[S_COL_SUBJECT], P_INT, NULL, NULL, NULL},
534         {"summary_col_size_from", "120",
535          &prefs_common.summary_col_size[S_COL_FROM], P_INT, NULL, NULL, NULL},
536         {"summary_col_size_to", "120",
537          &prefs_common.summary_col_size[S_COL_TO], P_INT, NULL, NULL, NULL},
538 #else
539         {"summary_col_size_subject", "300",
540          &prefs_common.summary_col_size[S_COL_SUBJECT], P_INT, NULL, NULL, NULL},
541         {"summary_col_size_from", "150",
542          &prefs_common.summary_col_size[S_COL_FROM], P_INT, NULL, NULL, NULL},
543         {"summary_col_size_to", "150",
544          &prefs_common.summary_col_size[S_COL_TO], P_INT, NULL, NULL, NULL},
545
546 #endif
547         {"summary_col_size_date", "118",
548          &prefs_common.summary_col_size[S_COL_DATE], P_INT, NULL, NULL, NULL},
549         {"summary_col_size_size", "45",
550          &prefs_common.summary_col_size[S_COL_SIZE], P_INT, NULL, NULL, NULL},
551         {"summary_col_size_number", "40",
552          &prefs_common.summary_col_size[S_COL_NUMBER], P_INT, NULL, NULL, NULL},
553         {"summary_col_size_score", "40",
554          &prefs_common.summary_col_size[S_COL_SCORE], P_INT, NULL, NULL, NULL},
555         {"summary_col_size_locked", "13",
556          &prefs_common.summary_col_size[S_COL_LOCKED], P_INT, NULL, NULL, NULL},
557         {"summary_col_size_tags", "150",
558          &prefs_common.summary_col_size[S_COL_TAGS], P_INT, NULL, NULL, NULL},
559
560         /* Widget size */
561         {"folderwin_x", "16", &prefs_common.folderwin_x, P_INT,
562          NULL, NULL, NULL},
563         {"folderwin_y", "16", &prefs_common.folderwin_y, P_INT,
564          NULL, NULL, NULL},
565         {"folderview_width", "270", &prefs_common.folderview_width, P_INT,
566          NULL, NULL, NULL},
567         {"folderview_height", "450", &prefs_common.folderview_height, P_INT,
568          NULL, NULL, NULL},
569         {"folderview_visible", "TRUE", &prefs_common.folderview_visible, P_BOOL,
570          NULL, NULL, NULL},
571
572         {"folder_col_show_folder", "TRUE",
573          &prefs_common.folder_col_visible[F_COL_FOLDER], P_BOOL, NULL, NULL, NULL},
574         {"folder_col_show_new", "TRUE",
575          &prefs_common.folder_col_visible[F_COL_NEW], P_BOOL, NULL, NULL, NULL},
576         {"folder_col_show_unread", "TRUE",
577          &prefs_common.folder_col_visible[F_COL_UNREAD], P_BOOL, NULL, NULL, NULL},
578         {"folder_col_show_total", "TRUE",
579          &prefs_common.folder_col_visible[F_COL_TOTAL], P_BOOL, NULL, NULL, NULL},
580
581         {"folder_col_pos_folder", "0",
582          &prefs_common.folder_col_pos[F_COL_FOLDER], P_INT, NULL, NULL, NULL},
583         {"folder_col_pos_new", "1",
584          &prefs_common.folder_col_pos[F_COL_NEW], P_INT, NULL, NULL, NULL},
585         {"folder_col_pos_unread", "2",
586          &prefs_common.folder_col_pos[F_COL_UNREAD], P_INT, NULL, NULL, NULL},
587         {"folder_col_pos_total", "3",
588          &prefs_common.folder_col_pos[F_COL_TOTAL], P_INT, NULL, NULL, NULL},
589
590 #ifndef GENERIC_UMPC
591         {"folder_col_size_folder", "120",
592          &prefs_common.folder_col_size[F_COL_FOLDER], P_INT, NULL, NULL, NULL},
593         {"folder_col_size_new", "32",
594          &prefs_common.folder_col_size[F_COL_NEW], P_INT, NULL, NULL, NULL},
595         {"folder_col_size_unread", "32",
596          &prefs_common.folder_col_size[F_COL_UNREAD], P_INT, NULL, NULL, NULL},
597         {"folder_col_size_total", "32",
598          &prefs_common.folder_col_size[F_COL_TOTAL], P_INT, NULL, NULL, NULL},
599 #else
600         {"folder_col_size_folder", "400",
601          &prefs_common.folder_col_size[F_COL_FOLDER], P_INT, NULL, NULL, NULL},
602         {"folder_col_size_new", "32",
603          &prefs_common.folder_col_size[F_COL_NEW], P_INT, NULL, NULL, NULL},
604         {"folder_col_size_unread", "32",
605          &prefs_common.folder_col_size[F_COL_UNREAD], P_INT, NULL, NULL, NULL},
606         {"folder_col_size_total", "32",
607          &prefs_common.folder_col_size[F_COL_TOTAL], P_INT, NULL, NULL, NULL},
608 #endif
609         {"summaryview_width", "500", &prefs_common.summaryview_width, P_INT,
610          NULL, NULL, NULL},
611         {"summaryview_height", "244", &prefs_common.summaryview_height, P_INT,
612          NULL, NULL, NULL},
613
614         {"main_messagewin_x", "256", &prefs_common.main_msgwin_x, P_INT,
615          NULL, NULL, NULL},
616         {"main_messagewin_y", "210", &prefs_common.main_msgwin_y, P_INT,
617          NULL, NULL, NULL},
618         {"messageview_width", "500", &prefs_common.msgview_width, P_INT,
619          NULL, NULL, NULL},
620         {"messageview_height", "213", &prefs_common.msgview_height, P_INT,
621          NULL, NULL, NULL},
622         {"messageview_visible", "TRUE", &prefs_common.msgview_visible, P_BOOL,
623          NULL, NULL, NULL},
624
625         {"mainview_x", "64", &prefs_common.mainview_x, P_INT,
626          NULL, NULL, NULL},
627         {"mainview_y", "64", &prefs_common.mainview_y, P_INT,
628          NULL, NULL, NULL},
629         {"mainview_width", "500", &prefs_common.mainview_width, P_INT,
630          NULL, NULL, NULL},
631         {"mainview_height", "400", &prefs_common.mainview_height, P_INT,
632          NULL, NULL, NULL},
633         {"mainwin_x", "64", &prefs_common.mainwin_x, P_INT,
634          NULL, NULL, NULL},
635         {"mainwin_y", "64", &prefs_common.mainwin_y, P_INT,
636          NULL, NULL, NULL},
637         {"mainwin_maximised", "FALSE", &prefs_common.mainwin_maximised, P_BOOL,
638          NULL, NULL, NULL},
639         {"mainwin_fullscreen", "FALSE", &prefs_common.mainwin_fullscreen, P_BOOL,
640          NULL, NULL, NULL},
641         {"mainwin_menubar", "TRUE", &prefs_common.mainwin_menubar, P_BOOL,
642          NULL, NULL, NULL},
643 #ifndef GENERIC_UMPC
644         {"mainwin_width", "800", &prefs_common.mainwin_width, P_INT,
645          NULL, NULL, NULL},
646         {"mainwin_height", "600", &prefs_common.mainwin_height, P_INT,
647          NULL, NULL, NULL},
648         {"messagewin_width", "600", &prefs_common.msgwin_width, P_INT,
649          NULL, NULL, NULL},
650         {"messagewin_height", "540", &prefs_common.msgwin_height, P_INT,
651          NULL, NULL, NULL},
652         {"mimeview_tree_height", "60", &prefs_common.mimeview_tree_height, P_INT,
653          NULL, NULL, NULL},      
654         {"sourcewin_width", "600", &prefs_common.sourcewin_width, P_INT,
655          NULL, NULL, NULL},
656         {"sourcewin_height", "500", &prefs_common.sourcewin_height, P_INT,
657          NULL, NULL, NULL},
658         {"compose_width", "600", &prefs_common.compose_width, P_INT,
659          NULL, NULL, NULL},
660         {"compose_height", "560", &prefs_common.compose_height, P_INT,
661          NULL, NULL, NULL},
662 #else
663         {"mainwin_width", "700", &prefs_common.mainwin_width, P_INT,
664          NULL, NULL, NULL},
665         {"mainwin_height", "470", &prefs_common.mainwin_height, P_INT,
666          NULL, NULL, NULL},
667         {"messagewin_width", "700", &prefs_common.msgwin_width, P_INT,
668          NULL, NULL, NULL},
669         {"messagewin_height", "470", &prefs_common.msgwin_height, P_INT,
670          NULL, NULL, NULL},
671         {"sourcewin_width", "700", &prefs_common.sourcewin_width, P_INT,
672          NULL, NULL, NULL},
673         {"sourcewin_height", "470", &prefs_common.sourcewin_height, P_INT,
674          NULL, NULL, NULL},
675         {"compose_width", "700", &prefs_common.compose_width, P_INT,
676          NULL, NULL, NULL},
677         {"compose_height", "470", &prefs_common.compose_height, P_INT,
678          NULL, NULL, NULL},
679 #endif
680         {"compose_notebook_height", "130", &prefs_common.compose_notebook_height, P_INT,
681          NULL, NULL, NULL},
682         {"compose_x", "0", &prefs_common.compose_x, P_INT,
683          NULL, NULL, NULL},
684         {"compose_y", "0", &prefs_common.compose_y, P_INT,
685          NULL, NULL, NULL},
686         /* Message */
687         {"enable_color", "TRUE", &prefs_common.enable_color, P_BOOL,
688          NULL, NULL, NULL},
689
690         {"quote_level1_color", "#0000b3", &prefs_common.quote_level1_col, P_COLOR,
691          NULL, NULL, NULL},
692         {"quote_level2_color", "#0000b3", &prefs_common.quote_level2_col, P_COLOR,
693          NULL, NULL, NULL},
694         {"quote_level3_color", "#0000b3", &prefs_common.quote_level3_col, P_COLOR,
695          NULL, NULL, NULL},
696         {"enable_bgcolor", "FALSE", &prefs_common.enable_bgcolor, P_BOOL,
697          NULL, NULL, NULL},
698         {"quote_level1_bgcolor", "#cccccc", &prefs_common.quote_level1_bgcol, P_COLOR,
699          NULL, NULL, NULL},
700         {"quote_level2_bgcolor", "#d4d4d4", &prefs_common.quote_level2_bgcol, P_COLOR,
701          NULL, NULL, NULL},
702         {"quote_level3_bgcolor", "#dddddd", &prefs_common.quote_level3_bgcol, P_COLOR,
703          NULL, NULL, NULL},
704         {"uri_color", "#007f00", &prefs_common.uri_col, P_COLOR,
705          NULL, NULL, NULL},
706         {"emphasis_color", "#0000cf", &prefs_common.emphasis_col, P_COLOR,
707          NULL, NULL, NULL},
708         {"target_folder_color", "#da1cca", &prefs_common.tgt_folder_col, P_COLOR,
709          NULL, NULL, NULL},
710         {"signature_color", "#797979", &prefs_common.signature_col, P_COLOR,
711          NULL, NULL, NULL},
712         {"recycle_quote_colors", "FALSE", &prefs_common.recycle_quote_colors,
713          P_BOOL, NULL, NULL, NULL},
714
715         {"display_header_pane", "FALSE", &prefs_common.display_header_pane,
716          P_BOOL, NULL, NULL, NULL},
717         {"display_header", "TRUE", &prefs_common.display_header, P_BOOL,
718          NULL, NULL, NULL},
719         {"display_xface", "TRUE", &prefs_common.display_xface,
720          P_BOOL, NULL, NULL, NULL},
721         {"render_html", "TRUE", &prefs_common.render_html, P_BOOL,
722          NULL, NULL, NULL},
723         {"invoke_plugin_on_html", "FALSE", &prefs_common.invoke_plugin_on_html, P_BOOL,
724          NULL, NULL, NULL},
725         {"promote_html_part", "FALSE", &prefs_common.promote_html_part, P_BOOL,
726          NULL, NULL, NULL},
727         {"line_space", "2", &prefs_common.line_space, P_INT,
728          NULL, NULL, NULL},
729         {"never_send_retrcpt", "FALSE", &prefs_common.never_send_retrcpt, P_BOOL,
730          NULL, NULL, NULL},
731
732         {"enable_smooth_scroll", "FALSE",
733          &prefs_common.enable_smooth_scroll, P_BOOL,
734          NULL, NULL, NULL},
735         {"scroll_step", "1", &prefs_common.scroll_step, P_INT,
736          NULL, NULL, NULL},
737         {"scroll_half_page", "FALSE", &prefs_common.scroll_halfpage, P_BOOL,
738          NULL, NULL, NULL},
739         {"hide_quoted", "TRUE",
740          &prefs_common.hide_quoted, P_BOOL,
741          NULL, NULL, NULL},
742         {"respect_flowed_format", "FALSE", &prefs_common.respect_flowed_format, P_BOOL,
743          NULL, NULL, NULL},
744         {"show_all_headers", "FALSE", &prefs_common.show_all_headers, P_BOOL,
745          NULL, NULL, NULL},
746
747         {"show_other_header", "FALSE", &prefs_common.show_other_header, P_BOOL,
748          NULL, NULL, NULL},
749
750         {"attach_desc", "TRUE", &prefs_common.attach_desc, P_BOOL,
751          NULL, NULL, NULL},
752         {"attach_save_directory", NULL,
753          &SPECIFIC_PREFS.attach_save_dir, P_STRING, NULL, NULL, NULL},
754         {"attach_load_directory", NULL,
755          &SPECIFIC_PREFS.attach_load_dir, P_STRING, NULL, NULL, NULL},
756
757         /* MIME viewer */
758         {"mime_textviewer",   NULL,
759          &SPECIFIC_PREFS.mime_textviewer,   P_STRING, NULL, NULL, NULL},
760         {"mime_open_command", "gedit '%s'",
761          &SPECIFIC_PREFS.mime_open_cmd,     P_STRING, NULL, NULL, NULL},
762         {"show_inline_attachments", "TRUE", 
763          &prefs_common.show_inline_attachments, P_BOOL, NULL, NULL, NULL},
764
765         /* Interface */
766 #ifndef GENERIC_UMPC
767         {"layout_mode", "0", &prefs_common.layout_mode, P_INT,
768          NULL, NULL, NULL},
769 #else
770         {"layout_mode", "5", &prefs_common.layout_mode, P_INT,
771          NULL, NULL, NULL},
772 #endif
773         /* {"emulate_emacs", "FALSE", &prefs_common.emulate_emacs, P_BOOL,
774          NULL, NULL, NULL}, */
775         {"always_show_message_when_selected", "0",
776          &prefs_common.always_show_msg,
777          P_ENUM, NULL, NULL, NULL},
778         {"select_on_entry", "3", &prefs_common.select_on_entry,
779          P_ENUM, NULL, NULL, NULL},
780         {"show_tooltips", "TRUE", &prefs_common.show_tooltips,
781          P_BOOL, NULL, NULL, NULL},
782
783         /* do it SUMMARY_OPEN_ACTIONS-1 times */
784         {"summary_select_prio1", "0", &prefs_common.summary_select_prio[0], P_ENUM,
785          NULL, NULL, NULL},
786         {"summary_select_prio2", "0", &prefs_common.summary_select_prio[1], P_ENUM,
787          NULL, NULL, NULL},
788         {"summary_select_prio3", "0", &prefs_common.summary_select_prio[2], P_ENUM,
789          NULL, NULL, NULL},
790         {"summary_select_prio4", "0", &prefs_common.summary_select_prio[3], P_ENUM,
791          NULL, NULL, NULL},
792         {"summary_select_prio5", "0", &prefs_common.summary_select_prio[4], P_ENUM,
793          NULL, NULL, NULL},
794         {"summary_select_prio6", "0", &prefs_common.summary_select_prio[5], P_ENUM,
795          NULL, NULL, NULL},
796         {"summary_select_prio7", "0", &prefs_common.summary_select_prio[6], P_ENUM,
797          NULL, NULL, NULL},
798
799         {"mark_as_read_on_new_window", "FALSE",
800          &prefs_common.mark_as_read_on_new_window,
801          P_BOOL, NULL, NULL, NULL},
802         {"mark_as_read_delay", "0",
803          &prefs_common.mark_as_read_delay, P_INT, 
804          NULL, NULL, NULL},
805         {"immediate_execution", "TRUE", &prefs_common.immediate_exec, P_BOOL,
806          NULL, NULL, NULL},
807         {"nextunreadmsg_dialog", "1", &prefs_common.next_unread_msg_dialog, P_ENUM,
808          NULL, NULL, NULL},
809         {"summary_from_show", "0", &prefs_common.summary_from_show, P_ENUM,
810          NULL, NULL, NULL},
811
812         {"pixmap_theme_path", DEFAULT_PIXMAP_THEME, 
813          &SPECIFIC_PREFS.pixmap_theme_path, P_STRING,
814          NULL, NULL, NULL},
815
816         {"ask_mark_all_read", "TRUE", &prefs_common.ask_mark_all_read, P_BOOL,
817          NULL, NULL, NULL},
818
819         {"ask_apply_per_account_filtering_rules", "TRUE", &prefs_common.ask_apply_per_account_filtering_rules, P_BOOL,
820          NULL, NULL, NULL},
821         {"apply_per_account_filtering_rules", "0", &prefs_common.apply_per_account_filtering_rules, P_ENUM,
822          NULL, NULL, NULL},
823
824         /* Addressbook */
825         {"addressbook_use_editaddress_dialog", "TRUE", &prefs_common.addressbook_use_editaddress_dialog,
826          P_BOOL, NULL, NULL, NULL},
827         {"addressbook_hpaned_pos", "-1", &prefs_common.addressbook_hpaned_pos,
828          P_INT, NULL, NULL, NULL},
829         {"addressbook_vpaned_pos", "-1", &prefs_common.addressbook_vpaned_pos,
830          P_INT, NULL, NULL, NULL},
831
832         /* Other */
833 #ifndef G_OS_WIN32
834         {"uri_open_command", DEFAULT_BROWSER_CMD,
835          &SPECIFIC_PREFS.uri_cmd, P_STRING, NULL, NULL, NULL},
836 #else
837         {"gtk_theme", DEFAULT_W32_GTK_THEME,
838          &SPECIFIC_PREFS.gtk_theme, P_STRING, NULL, NULL, NULL},
839 #endif
840         {"ext_editor_command", DEFAULT_EDITOR_CMD,
841          &SPECIFIC_PREFS.ext_editor_cmd, P_STRING, NULL, NULL, NULL},
842         {"cmds_use_system_default", "TRUE",
843          &prefs_common.cmds_use_system_default, P_BOOL, NULL, NULL, NULL},
844         {"add_address_by_click", "FALSE", &prefs_common.add_address_by_click,
845          P_BOOL, NULL, NULL, NULL},
846         {"session_passwords", "FALSE", &prefs_common.session_passwords,
847          P_BOOL, NULL, NULL, NULL},
848         {"confirm_on_exit", "FALSE", &prefs_common.confirm_on_exit, P_BOOL,
849          NULL, NULL, NULL},
850         {"clean_trash_on_exit", "FALSE", &prefs_common.clean_on_exit, P_BOOL,
851          NULL, NULL, NULL},
852         {"ask_on_cleaning", "TRUE", &prefs_common.ask_on_clean, P_BOOL,
853          NULL, NULL, NULL},
854         {"warn_queued_on_exit", "TRUE", &prefs_common.warn_queued_on_exit,
855          P_BOOL, NULL, NULL, NULL},
856         {"work_offline", "FALSE", &prefs_common.work_offline, P_BOOL,
857          NULL, NULL, NULL},
858         {"summary_quicksearch_type", "0", &prefs_common.summary_quicksearch_type, P_INT,
859          NULL, NULL, NULL},
860 #ifndef GENERIC_UMPC
861         {"summary_quicksearch_recurse", "1", &prefs_common.summary_quicksearch_recurse, P_INT,
862          NULL, NULL, NULL},
863 #else
864         {"summary_quicksearch_recurse", "0", &prefs_common.summary_quicksearch_recurse, P_INT,
865          NULL, NULL, NULL},
866 #endif
867
868 #if defined(__OpenBSD__)
869         {"io_timeout_secs", "80", &prefs_common.io_timeout_secs,
870          P_INT, NULL, NULL, NULL},
871 #else
872         {"io_timeout_secs", "60", &prefs_common.io_timeout_secs,
873          P_INT, NULL, NULL, NULL},
874 #endif
875         {"hide_score", "-9999", &prefs_common.kill_score, P_INT,
876          NULL, NULL, NULL},
877         {"important_score", "1", &prefs_common.important_score, P_INT,
878          NULL, NULL, NULL},
879
880         {"clip_log", "TRUE", &prefs_common.cliplog, P_BOOL,
881          NULL, NULL, NULL},
882         {"log_length", "500", &prefs_common.loglength, P_INT,
883          NULL, NULL, NULL},
884 #ifndef GENERIC_UMPC
885         {"enable_log_standard", "TRUE", &prefs_common.enable_log_standard, P_BOOL,
886          NULL, NULL, NULL},
887         {"enable_log_warning", "TRUE", &prefs_common.enable_log_warning, P_BOOL,
888          NULL, NULL, NULL},
889         {"enable_log_error", "TRUE", &prefs_common.enable_log_error, P_BOOL,
890          NULL, NULL, NULL},
891         {"enable_log_status", "TRUE", &prefs_common.enable_log_status, P_BOOL,
892          NULL, NULL, NULL},
893 #else
894         {"enable_log_standard", "FALSE", &prefs_common.enable_log_standard, P_BOOL,
895          NULL, NULL, NULL},
896         {"enable_log_warning", "FALSE", &prefs_common.enable_log_warning, P_BOOL,
897          NULL, NULL, NULL},
898         {"enable_log_error", "FALSE", &prefs_common.enable_log_error, P_BOOL,
899          NULL, NULL, NULL},
900         {"enable_log_status", "FALSE", &prefs_common.enable_log_status, P_BOOL,
901          NULL, NULL, NULL},
902 #endif
903         {"log_msg_color", "#00af00", &prefs_common.log_msg_color, P_COLOR,
904          NULL, NULL, NULL},
905         {"log_warn_color", "#af0000", &prefs_common.log_warn_color, P_COLOR,
906          NULL, NULL, NULL},
907         {"log_error_color", "#af0000", &prefs_common.log_error_color, P_COLOR,
908          NULL, NULL, NULL},
909         {"log_in_color", "#000000", &prefs_common.log_in_color, P_COLOR,
910          NULL, NULL, NULL},
911         {"log_out_color", "#0000ef", &prefs_common.log_out_color, P_COLOR,
912          NULL, NULL, NULL},
913         {"log_status_ok_color", "#00af00", &prefs_common.log_status_ok_color, P_COLOR,
914          NULL, NULL, NULL},
915         {"log_status_nok_color", "#0000af", &prefs_common.log_status_nok_color, P_COLOR,
916          NULL, NULL, NULL},
917         {"log_status_skip_color", "#aa00aa", &prefs_common.log_status_skip_color, P_COLOR,
918          NULL, NULL, NULL},
919
920     {"enable_filtering_debug", "FALSE", &prefs_common.enable_filtering_debug, P_BOOL,
921          NULL, NULL, NULL},
922     {"filtering_debug_level", "1", &prefs_common.filtering_debug_level, P_INT,
923          NULL, NULL, NULL},
924     {"enable_filtering_debug_inc", "TRUE", &prefs_common.enable_filtering_debug_inc, P_BOOL,
925          NULL, NULL, NULL},
926     {"enable_filtering_debug_manual", "TRUE", &prefs_common.enable_filtering_debug_manual, P_BOOL,
927          NULL, NULL, NULL},
928     {"enable_filtering_debug_folder_proc", "FALSE", &prefs_common.enable_filtering_debug_folder_proc, P_BOOL,
929          NULL, NULL, NULL},
930     {"enable_filtering_debug_pre_proc", "FALSE", &prefs_common.enable_filtering_debug_pre_proc, P_BOOL,
931          NULL, NULL, NULL},
932     {"enable_filtering_debug_post_proc", "FALSE", &prefs_common.enable_filtering_debug_post_proc, P_BOOL,
933          NULL, NULL, NULL},
934     {"filtering_debug_clip_log", "TRUE", &prefs_common.filtering_debug_cliplog, P_BOOL,
935          NULL, NULL, NULL},
936         {"filtering_debug_log_length", "500", &prefs_common.filtering_debug_loglength, P_INT,
937          NULL, NULL, NULL},
938
939         {"gtk_can_change_accels", "FALSE", &prefs_common.gtk_can_change_accels, P_BOOL,
940          NULL, NULL, NULL},
941
942         {"color_new", "#0000b3", &prefs_common.color_new, P_COLOR,
943          NULL, NULL, NULL},
944
945         /* Some windows' sizes */
946         {"filteringwin_width", "500", &prefs_common.filteringwin_width, P_INT,
947          NULL, NULL, NULL},
948         {"filteringwin_height", "-1", &prefs_common.filteringwin_height, P_INT,
949          NULL, NULL, NULL},
950
951         {"filteringactionwin_width", "490", &prefs_common.filteringactionwin_width, P_INT,
952          NULL, NULL, NULL},
953         {"filteringactionwin_height", "-1", &prefs_common.filteringactionwin_height, P_INT,
954          NULL, NULL, NULL},
955
956         {"matcherwin_width", "520", &prefs_common.matcherwin_width, P_INT,
957          NULL, NULL, NULL},
958         {"matcherwin_height", "-1", &prefs_common.matcherwin_height, P_INT,
959          NULL, NULL, NULL},
960
961         {"templateswin_width", "480", &prefs_common.templateswin_width, P_INT,
962          NULL, NULL, NULL},
963         {"templateswin_height", "-1", &prefs_common.templateswin_height, P_INT,
964          NULL, NULL, NULL},
965
966         {"actionswin_width", "486", &prefs_common.actionswin_width, P_INT,
967          NULL, NULL, NULL},
968         {"actionswin_height", "-1", &prefs_common.actionswin_height, P_INT,
969          NULL, NULL, NULL},
970
971         {"tagswin_width", "486", &prefs_common.tagswin_width, P_INT,
972          NULL, NULL, NULL},
973         {"tagswin_height", "-1", &prefs_common.tagswin_height, P_INT,
974          NULL, NULL, NULL},
975
976         {"addressbookwin_width", "520", &prefs_common.addressbookwin_width, P_INT,
977          NULL, NULL, NULL},
978         {"addressbookwin_height", "-1", &prefs_common.addressbookwin_height, P_INT,
979          NULL, NULL, NULL},
980
981         {"addressbookeditpersonwin_width", "640", &prefs_common.addressbookeditpersonwin_width, P_INT,
982          NULL, NULL, NULL},
983         {"addressbookeditpersonwin_height", "320", &prefs_common.addressbookeditpersonwin_height, P_INT,
984          NULL, NULL, NULL},
985
986         {"addressbookeditgroupwin_width", "580", &prefs_common.addressbookeditgroupwin_width, P_INT,
987          NULL, NULL, NULL},
988         {"addressbookeditgroupwin_height", "340", &prefs_common.addressbookeditgroupwin_height, P_INT,
989          NULL, NULL, NULL},
990
991         {"pluginswin_width", "-1", &prefs_common.pluginswin_width, P_INT,
992          NULL, NULL, NULL},
993         {"pluginswin_height", "-1", &prefs_common.pluginswin_height, P_INT,
994          NULL, NULL, NULL},
995
996         {"prefswin_width", "600", &prefs_common.prefswin_width, P_INT,
997          NULL, NULL, NULL},
998         {"prefswin_height", "-1", &prefs_common.prefswin_height, P_INT,
999          NULL, NULL, NULL},
1000
1001         {"folderitemwin_width", "500", &prefs_common.folderitemwin_width, P_INT,
1002          NULL, NULL, NULL},
1003         {"folderitemwin_height", "-1", &prefs_common.folderitemwin_height, P_INT,
1004          NULL, NULL, NULL},
1005
1006         {"zero_replacement_char", "0", &prefs_common.zero_replacement, P_STRING,
1007          NULL, NULL, NULL},
1008
1009         {"editaccountwin_width", "500", &prefs_common.editaccountwin_width, P_INT,
1010          NULL, NULL, NULL},
1011         {"editaccountwin_height", "-1", &prefs_common.editaccountwin_height, P_INT,
1012          NULL, NULL, NULL},
1013
1014         {"accountswin_width", "500", &prefs_common.accountswin_width, P_INT,
1015          NULL, NULL, NULL},
1016         {"accountswin_height", "-1", &prefs_common.accountswin_height, P_INT,
1017          NULL, NULL, NULL},
1018
1019         {"logwin_width", "520", &prefs_common.logwin_width, P_INT,
1020          NULL, NULL, NULL},
1021         {"logwin_height", "-1", &prefs_common.logwin_height, P_INT,
1022          NULL, NULL, NULL},
1023
1024         {"filtering_debugwin_width", "600", &prefs_common.filtering_debugwin_width, P_INT,
1025          NULL, NULL, NULL},
1026         {"filtering_debugwin_height", "-1", &prefs_common.filtering_debugwin_height, P_INT,
1027          NULL, NULL, NULL},
1028
1029         {"folderselwin_width", "300", &prefs_common.folderselwin_width, P_INT,
1030          NULL, NULL, NULL},
1031         {"folderselwin_height", "-1", &prefs_common.folderselwin_height, P_INT,
1032          NULL, NULL, NULL},
1033
1034         {"addressaddwin_width", "300", &prefs_common.addressaddwin_width, P_INT,
1035          NULL, NULL, NULL},
1036         {"addressaddwin_height", "-1", &prefs_common.addressaddwin_height, P_INT,
1037          NULL, NULL, NULL},
1038
1039         {"addressbook_folderselwin_width", "300", &prefs_common.addressbook_folderselwin_width, P_INT,
1040          NULL, NULL, NULL},
1041         {"addressbook_folderselwin_height", "-1", &prefs_common.addressbook_folderselwin_height, P_INT,
1042          NULL, NULL, NULL},
1043
1044         {"aboutwin_width", "450", &prefs_common.aboutwin_width, P_INT,
1045          NULL, NULL, NULL},
1046         {"aboutwin_height", "500", &prefs_common.aboutwin_height, P_INT,
1047          NULL, NULL, NULL},
1048
1049         {"addrgather_width", "450", &prefs_common.addrgather_width, P_INT,
1050          NULL, NULL, NULL},
1051         {"addrgather_height", "-1", &prefs_common.addrgather_height, P_INT,
1052          NULL, NULL, NULL},
1053
1054         {"news_subscribe_width", "450", &prefs_common.news_subscribe_width, P_INT,
1055          NULL, NULL, NULL},
1056         {"news_subscribe_height", "400", &prefs_common.news_subscribe_height, P_INT,
1057          NULL, NULL, NULL},
1058
1059         /* Hidden */
1060         {"warn_dnd", "1", &prefs_common.warn_dnd, P_INT,
1061          NULL, NULL, NULL},
1062         {"utf8_instead_of_locale_for_broken_mail", "0", 
1063          &prefs_common.broken_are_utf8, P_INT,
1064          NULL, NULL, NULL},
1065         {"enable_swap_from", "FALSE", &prefs_common.swap_from, P_BOOL,
1066          NULL, NULL, NULL},
1067         {"use_stripes_everywhere", "TRUE", &prefs_common.use_stripes_everywhere, P_BOOL,
1068          NULL, NULL, NULL},
1069         {"use_stripes_in_summaries", "TRUE", &prefs_common.use_stripes_in_summaries, P_BOOL,
1070          NULL, NULL, NULL},
1071         {"stripes_color_offset", "4000", &prefs_common.stripes_color_offset, P_INT,
1072          NULL, NULL, NULL},
1073         {"enable_hscrollbar", "TRUE", &prefs_common.enable_hscrollbar, P_BOOL,
1074          NULL, NULL, NULL},
1075         {"folderview_vscrollbar_policy", "0",
1076          &prefs_common.folderview_vscrollbar_policy, P_ENUM,
1077          NULL, NULL, NULL},
1078         {"textview_cursor_visible", "FALSE",
1079          &prefs_common.textview_cursor_visible, P_BOOL,
1080          NULL, NULL, NULL},
1081         {"hover_timeout", "500", &prefs_common.hover_timeout, P_INT,
1082          NULL, NULL, NULL},
1083 #ifndef GENERIC_UMPC
1084         {"cache_max_mem_usage", "4096", &prefs_common.cache_max_mem_usage, P_INT,
1085          NULL, NULL, NULL},
1086         {"cache_min_keep_time", "15", &prefs_common.cache_min_keep_time, P_INT,
1087          NULL, NULL, NULL},
1088 #else
1089         {"cache_max_mem_usage", "4096", &prefs_common.cache_max_mem_usage, P_INT,
1090          NULL, NULL, NULL},
1091         {"cache_min_keep_time", "0", &prefs_common.cache_min_keep_time, P_INT,
1092          NULL, NULL, NULL},
1093 #endif
1094         {"thread_by_subject_max_age", "10", &prefs_common.thread_by_subject_max_age,
1095         P_INT, NULL, NULL, NULL },
1096         {"last_opened_folder", "", &prefs_common.last_opened_folder,
1097         P_STRING, NULL, NULL, NULL },
1098         {"goto_last_folder_on_startup", "FALSE", &prefs_common.goto_last_folder_on_startup,
1099         P_BOOL, NULL, NULL, NULL },
1100         {"summary_quicksearch_sticky", "1", &prefs_common.summary_quicksearch_sticky, P_INT,
1101          NULL, NULL, NULL},
1102         {"summary_quicksearch_dynamic", "0", &prefs_common.summary_quicksearch_dynamic, P_INT,
1103          NULL, NULL, NULL},
1104         {"summary_quicksearch_autorun", "0", &prefs_common.summary_quicksearch_autorun, P_INT,
1105          NULL, NULL, NULL},
1106         {"statusbar_update_step", "10", &prefs_common.statusbar_update_step, P_INT,
1107          NULL, NULL, NULL},
1108         {"compose_no_markup", "FALSE", &prefs_common.compose_no_markup, P_BOOL,
1109          NULL, NULL, NULL},
1110         {"skip_ssl_cert_check", "FALSE", &prefs_common.skip_ssl_cert_check, P_BOOL,
1111          NULL, NULL, NULL},
1112         {"live_dangerously", "FALSE", &prefs_common.live_dangerously, P_BOOL,
1113          NULL, NULL, NULL},
1114         {"save_parts_readwrite", "FALSE", &prefs_common.save_parts_readwrite, P_BOOL,
1115          NULL, NULL, NULL},
1116         {"hide_quotes", "0", &prefs_common.hide_quotes, P_INT,
1117          NULL, NULL, NULL},
1118         {"unsafe_ssl_certs", "FALSE", &prefs_common.unsafe_ssl_certs, P_BOOL,
1119          NULL, NULL, NULL},
1120 #ifndef GENERIC_UMPC
1121         {"real_time_sync", "FALSE", &prefs_common.real_time_sync, P_BOOL,
1122          NULL, NULL, NULL},
1123 #else
1124         {"real_time_sync", "TRUE", &prefs_common.real_time_sync, P_BOOL,
1125          NULL, NULL, NULL},
1126 #endif
1127
1128         {"print_paper_type", NULL, &prefs_common.print_paper_type, P_STRING,
1129          NULL, NULL, NULL},
1130         {"print_paper_orientation", "0", &prefs_common.print_paper_orientation, P_INT,
1131          NULL, NULL, NULL},
1132         {"print_margin_top", "-1", &prefs_common.print_margin_top, P_INT,
1133          NULL, NULL, NULL},
1134         {"print_margin_bottom", "-1", &prefs_common.print_margin_bottom, P_INT,
1135          NULL, NULL, NULL},
1136         {"print_margin_left", "-1", &prefs_common.print_margin_left, P_INT,
1137          NULL, NULL, NULL},
1138         {"print_margin_right", "-1", &prefs_common.print_margin_right, P_INT,
1139          NULL, NULL, NULL},
1140         {"print_use_color", "0", &prefs_common.print_use_color, P_INT,
1141          NULL, NULL, NULL},
1142         {"print_use_collate", "0", &prefs_common.print_use_collate, P_INT,
1143          NULL, NULL, NULL},
1144         {"print_use_reverse", "0", &prefs_common.print_use_reverse, P_INT,
1145          NULL, NULL, NULL},
1146         {"print_use_duplex", "0", &prefs_common.print_use_duplex, P_INT,
1147          NULL, NULL, NULL},
1148         {"print_imgs", "1", &prefs_common.print_imgs, P_INT,
1149          NULL, NULL, NULL},
1150         {"print_previewwin_width", "600", &prefs_common.print_previewwin_width, P_INT,
1151          NULL, NULL, NULL},
1152         {"print_previewwin_height", "-1", &prefs_common.print_previewwin_height, P_INT,
1153          NULL, NULL, NULL},
1154         {"use_networkmanager", "TRUE", &prefs_common.use_networkmanager, P_BOOL,
1155          NULL, NULL, NULL},
1156         {"use_shred", "FALSE", &prefs_common.use_shred, P_BOOL,
1157          NULL, NULL, NULL},
1158
1159         {"two_line_vertical", "TRUE", &prefs_common.two_line_vert,
1160         P_BOOL, NULL, NULL, NULL },
1161
1162         {"inherit_folder_properties", "FALSE", &prefs_common.inherit_folder_props, P_BOOL,
1163          NULL, NULL, NULL},
1164
1165         {"flush_metadata", "TRUE", &prefs_common.flush_metadata, P_BOOL,
1166          NULL, NULL, NULL},
1167
1168         {"nav_history_length", "50", &prefs_common.nav_history_length, P_INT,
1169          NULL, NULL, NULL},
1170
1171         {"diff_added_color", "#008b8b", &prefs_common.diff_added_color, P_COLOR,
1172          NULL, NULL, NULL},
1173         {"diff_deleted_color", "#6a5acd", &prefs_common.diff_deleted_color, P_COLOR,
1174          NULL, NULL, NULL},
1175         {"diff_hunk_color", "#a52a2a", &prefs_common.diff_hunk_color, P_COLOR,
1176          NULL, NULL, NULL},
1177
1178         {"folder_search_wildcard", "TRUE", &prefs_common.folder_search_wildcard, P_BOOL,
1179          NULL, NULL, NULL},
1180         {"address_search_wildcard", "TRUE", &prefs_common.address_search_wildcard, P_BOOL,
1181          NULL, NULL, NULL},
1182         {"enable_avatars", "3", &prefs_common.enable_avatars, P_INT, 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, -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);
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 /**
1561    return the translated name of a header, if the translate_header option is
1562    set, otherwise return the untranslated header name (header_name itself).
1563    this function is provided for convenience, it's an interface to
1564    prefs_common.trans_hdr.
1565    works with header names either with or without trailing colon, provided
1566    that gettext found such header name in the sources (they should all be
1567    found in src/gtk/headers.h anyway).
1568 */
1569 const gchar *prefs_common_translated_header_name(const gchar *header_name)
1570 {
1571         if (header_name == NULL || *header_name == '\0')
1572                 return header_name;
1573
1574         return prefs_common.trans_hdr ? gettext(header_name) : header_name;
1575 }
1576
1577 const gchar *prefs_common_get_uri_cmd(void)
1578 {
1579 #ifdef G_OS_WIN32
1580         return NULL;
1581 #else
1582         gchar *tmp = NULL;
1583         
1584         if (!prefs_common.cmds_use_system_default)
1585                 return prefs_common.uri_cmd;
1586         
1587         tmp = g_find_program_in_path("xdg-open");
1588         if (!tmp) 
1589                 return prefs_common.uri_cmd;
1590         
1591         g_free(tmp);
1592         return "xdg-open %s";
1593 #endif
1594 }
1595
1596 const gchar *prefs_common_get_ext_editor_cmd(void)
1597 {
1598         return prefs_common.ext_editor_cmd;
1599 #if 0 /* we should do that, but it detaches the editor and breaks
1600          compose.c's external composition. */
1601         gchar *tmp = NULL;
1602         
1603         if (!prefs_common.cmds_use_system_default)
1604                 return prefs_common.ext_editor_cmd;
1605         
1606         tmp = g_find_program_in_path("xdg-open");
1607         if (!tmp) 
1608                 return prefs_common.ext_editor_cmd;
1609         
1610         g_free(tmp);
1611         return "xdg-open %s";
1612 #endif 
1613 }
1614
1615 gboolean prefs_common_get_use_shred(void)
1616 {
1617         return prefs_common.use_shred;
1618 }
1619
1620 gboolean prefs_common_get_flush_metadata (void)
1621 {
1622         return prefs_common.flush_metadata;
1623 }
1624
1625 PrefsCommon *prefs_common_get_prefs(void)
1626 {
1627         return &prefs_common;
1628 }