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