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