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