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