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