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