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