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