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