Simplify hidden prefs for too many recipients
[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 #ifdef HAVE_SVG
125         {"enable_alpha_svg", "TRUE",
126          &prefs_common.enable_alpha_svg, P_BOOL, NULL, NULL, NULL},
127         {"enable_pixmap_scaling", "TRUE",
128          &prefs_common.enable_pixmap_scaling, P_BOOL, NULL, NULL, NULL},
129         {"pixmap_scaling_auto", "TRUE",
130          &prefs_common.pixmap_scaling_auto, P_BOOL, NULL, NULL, NULL},
131         {"pixmap_scaling_ppi", "96",
132          &prefs_common.pixmap_scaling_ppi, P_INT, NULL, NULL, NULL},
133 #endif
134
135         /* Other */
136         {"ext_editor_command", "notepad %s",
137          &prefs_common.ext_editor_cmd, P_STRING, NULL, NULL, NULL},
138
139         {NULL, NULL, NULL, P_OTHER, NULL, NULL, NULL}
140 };
141 #else
142 #  define SPECIFIC_PREFS prefs_common
143 #endif
144
145 /*
146    parameter name, default value, pointer to the prefs variable, data type,
147    pointer to the widget pointer,
148    pointer to the function for data setting,
149    pointer to the function for widget setting
150  */
151
152 static PrefParam param[] = {
153         {"config_version", "0",
154          &prefs_common.config_version, P_INT, NULL, NULL, NULL},
155
156         /* Receive */
157         {"use_ext_inc", "FALSE", &prefs_common.use_extinc, P_BOOL,
158          NULL, NULL, NULL},
159         {"ext_inc_path", DEFAULT_INC_PATH, &SPECIFIC_PREFS.extinc_cmd, P_STRING,
160          NULL, NULL, NULL},
161
162         {"autochk_newmail", "FALSE", &prefs_common.autochk_newmail, P_BOOL,
163          NULL, NULL, NULL},
164         {"autochk_interval", "600", &prefs_common.autochk_itv, P_INT,
165          NULL, NULL, NULL},
166         {"check_on_startup", "FALSE", &prefs_common.chk_on_startup, P_BOOL,
167          NULL, NULL, NULL},
168         {"open_inbox_on_inc", "FALSE", &prefs_common.open_inbox_on_inc,
169          P_BOOL, NULL, NULL, NULL},
170         {"scan_all_after_inc", "FALSE", &prefs_common.scan_all_after_inc,
171          P_BOOL, NULL, NULL, NULL},
172         {"newmail_notify_manu", "FALSE", &prefs_common.newmail_notify_manu,
173          P_BOOL, NULL, NULL, NULL},
174         {"newmail_notify_auto", "FALSE", &prefs_common.newmail_notify_auto,
175         P_BOOL, NULL, NULL, NULL},
176         {"newmail_notify_cmd", "", &SPECIFIC_PREFS.newmail_notify_cmd, P_STRING,
177          NULL, NULL, NULL},
178         {"receive_dialog_mode", "2", &prefs_common.recv_dialog_mode, P_ENUM,
179          NULL, NULL, NULL},
180         {"receivewin_width", "460", &prefs_common.receivewin_width, P_INT,
181          NULL, NULL, NULL},
182         {"receivewin_height", "-1", &prefs_common.receivewin_height, P_INT,
183          NULL, NULL, NULL},
184         {"no_receive_error_panel", "FALSE", &prefs_common.no_recv_err_panel,
185          P_BOOL, NULL, NULL, NULL},
186         {"close_receive_dialog", "TRUE", &prefs_common.close_recv_dialog,
187          P_BOOL, NULL, NULL, NULL},
188  
189         /* Send */
190         {"save_message", "TRUE", &prefs_common.savemsg, P_BOOL,
191          NULL, NULL, NULL},
192         {"confirm_send_queued_messages", "FALSE", &prefs_common.confirm_send_queued_messages,
193          P_BOOL, NULL, NULL, NULL},
194 #ifndef GENERIC_UMPC
195         {"send_dialog_mode", "0", &prefs_common.send_dialog_invisible, P_BOOL,
196          NULL, NULL, NULL},
197 #else
198         {"send_dialog_mode", "1", &prefs_common.send_dialog_invisible, P_BOOL,
199          NULL, NULL, NULL},
200 #endif
201         {"sendwin_width", "460", &prefs_common.sendwin_width, P_INT,
202          NULL, NULL, NULL},
203         {"sendwin_height", "-1", &prefs_common.sendwin_height, P_INT,
204          NULL, NULL, NULL},
205
206         {"outgoing_charset", CS_AUTO, &prefs_common.outgoing_charset, P_STRING,
207          NULL, NULL, NULL},
208         {"encoding_method", "0", &prefs_common.encoding_method, P_ENUM,
209          NULL, NULL, NULL},
210         {"outgoing_fallback_to_ascii", "TRUE", &prefs_common.outgoing_fallback_to_ascii, P_BOOL,
211          NULL, NULL, NULL},
212          {"rewrite_first_from", "TRUE", &prefs_common.rewrite_first_from,
213           P_BOOL, NULL, NULL, NULL},
214         {"warn_empty_subj", "TRUE", &prefs_common.warn_empty_subj,
215          P_BOOL, NULL, NULL, NULL},
216         {"warn_sending_many_recipients_num", "0", &prefs_common.warn_sending_many_recipients_num, P_INT,
217          NULL, NULL, NULL},
218         {"hide_timezone", "FALSE", &prefs_common.hide_timezone,
219          P_BOOL, NULL, NULL, NULL},
220         {"allow_jisx0201_kana", "FALSE", &prefs_common.allow_jisx0201_kana,
221          P_BOOL, NULL, NULL, NULL},
222
223         /* Compose */
224         {"auto_ext_editor", "FALSE", &prefs_common.auto_exteditor, P_BOOL,
225          NULL, NULL, NULL},
226         {"forward_as_attachment", "FALSE", &prefs_common.forward_as_attachment,
227          P_BOOL, NULL, NULL, NULL},
228         {"redirect_keep_from", "FALSE",
229          &prefs_common.redirect_keep_from, P_BOOL,
230          NULL, NULL, NULL},
231         {"undo_level", "50", &prefs_common.undolevels, P_INT,
232          NULL, NULL, NULL},
233         {"compose_with_format", "FALSE", &prefs_common.compose_with_format, P_BOOL,
234          NULL, NULL, NULL},
235         {"compose_subject_format", "",
236          &prefs_common.compose_subject_format, P_STRING, NULL, NULL, NULL},
237         {"compose_body_format", N_("Hello,\\n"),
238          &prefs_common.compose_body_format, P_STRING, NULL, NULL, NULL},
239         {"show_compose_margin", "FALSE", &prefs_common.show_compose_margin, P_BOOL,
240          NULL, NULL, NULL},
241         {"type_any_header", "FALSE", &prefs_common.type_any_header, P_BOOL,
242          NULL, NULL, NULL},
243         
244
245         {"linewrap_length", "72", &prefs_common.linewrap_len, P_INT,
246          NULL, NULL, NULL},
247         {"linewrap_quotation", "TRUE", &prefs_common.linewrap_quote, P_BOOL,
248          NULL, NULL, NULL},
249         {"linewrap_pastes", "TRUE", &prefs_common.linewrap_pastes, P_BOOL,
250          NULL, NULL, NULL},
251         {"primary_paste_unselects", "FALSE", &prefs_common.primary_paste_unselects, P_BOOL,
252          NULL, NULL, NULL},
253         {"linewrap_auto", "TRUE", &prefs_common.autowrap, P_BOOL,
254          NULL, NULL, NULL},
255         {"auto_indent", "TRUE", &prefs_common.auto_indent, P_BOOL,
256          NULL, NULL, NULL},
257         {"autosave", "TRUE", &prefs_common.autosave,
258          P_BOOL, NULL, NULL, NULL},
259         {"autosave_length", "50", &prefs_common.autosave_length, P_INT,
260          NULL, NULL, NULL},
261         {"autosave_encrypted", "FALSE", &prefs_common.autosave_encrypted,
262          P_BOOL, NULL, NULL, NULL},
263         {"warn_large_insert", "TRUE", &prefs_common.warn_large_insert,
264          P_BOOL, NULL, NULL, NULL},
265         {"warn_large_insert_size", "500", &prefs_common.warn_large_insert_size,
266          P_INT, NULL, NULL, NULL},
267
268         {"enable_aspell", "TRUE", &prefs_common.enable_aspell, P_BOOL,
269          NULL, NULL, NULL},
270         {"dictionary",  "", &prefs_common.dictionary, P_STRING,
271          NULL, NULL, NULL},
272         {"alt_dictionary",  "", &prefs_common.alt_dictionary, P_STRING,
273          NULL, NULL, NULL},
274         {"use_alternate_dict", "FALSE", &prefs_common.use_alternate, P_BOOL,
275          NULL, NULL, NULL},
276         {"check_while_typing", "TRUE", &prefs_common.check_while_typing, P_BOOL,
277          NULL, NULL, NULL},
278         {"recheck_when_changing_dict", "TRUE", &prefs_common.recheck_when_changing_dict,
279          P_BOOL, NULL, NULL, NULL},
280         {"misspelled_color", "#ff0000", &prefs_common.misspelled_col, P_COLOR,
281          NULL, NULL, NULL},
282         {"use_both_dicts", "FALSE", &prefs_common.use_both_dicts, P_BOOL,
283          NULL, NULL, NULL},
284
285         {"reply_with_quote", "TRUE", &prefs_common.reply_with_quote, P_BOOL,
286          NULL, NULL, NULL},
287         {"compose_dnd_insert_or_attach", "0", &prefs_common.compose_dnd_mode, P_ENUM,
288          NULL, NULL, NULL},
289
290         /* Account autoselection */
291         {"reply_account_autoselect", "TRUE",
292          &prefs_common.reply_account_autosel, P_BOOL,
293          NULL, NULL, NULL},
294         {"forward_account_autoselect", "TRUE",
295          &prefs_common.forward_account_autosel, P_BOOL,
296          NULL, NULL, NULL},
297         {"reedit_account_autoselect", "TRUE",
298          &prefs_common.reedit_account_autosel, P_BOOL,
299          NULL, NULL, NULL},
300
301         {"default_reply_list", "TRUE", &prefs_common.default_reply_list, P_BOOL,
302          NULL, NULL, NULL},
303
304 #ifndef GENERIC_UMPC
305         {"show_ruler", "TRUE", &prefs_common.show_ruler, P_BOOL,
306          NULL, NULL, NULL},
307 #else
308         {"show_ruler", "FALSE", &prefs_common.show_ruler, P_BOOL,
309          NULL, NULL, NULL},
310 #endif
311
312         /* Quote */
313         {"reply_quote_mark", "> ", &prefs_common.quotemark, P_STRING,
314          NULL, NULL, NULL},
315         {"reply_quote_format", N_("On %d\\n%f wrote:\\n\\n%q\\n%X"),
316          &prefs_common.quotefmt, P_STRING, NULL, NULL, NULL},
317
318         {"forward_quote_mark", "> ", &prefs_common.fw_quotemark, P_STRING,
319          NULL, NULL, NULL},
320         {"forward_quote_format",
321          N_("\\n\\nBegin forwarded message:\\n\\n"
322          "?d{Date: %d\\n}?f{From: %f\\n}?t{To: %t\\n}?c{Cc: %c\\n}"
323          "?n{Newsgroups: %n\\n}?s{Subject: %s\\n}\\n\\n%M"),
324          &prefs_common.fw_quotefmt, P_STRING,
325          NULL, NULL, NULL},
326         {"quote_chars", ">", &prefs_common.quote_chars, P_STRING,
327          NULL, NULL, NULL},
328
329         /* Display */
330         /* 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_header_color", "#000000", &prefs_common.default_header_color, P_COLOR,
730          NULL, NULL, NULL},
731         {"default_header_bgcolor", "#f5f6be", &prefs_common.default_header_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", "xdg-open '%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 #ifdef HAVE_SVG
850         {"enable_alpha_svg", "TRUE",
851          &SPECIFIC_PREFS.enable_alpha_svg, P_BOOL,
852          NULL, NULL, NULL},
853         {"enable_pixmap_scaling", "TRUE",
854          &SPECIFIC_PREFS.enable_pixmap_scaling, P_BOOL,
855          NULL, NULL, NULL},
856         {"pixmap_scaling_auto", "TRUE",
857          &SPECIFIC_PREFS.pixmap_scaling_auto, P_BOOL,
858          NULL, NULL, NULL},
859         {"pixmap_scaling_ppi", "96",
860          &SPECIFIC_PREFS.pixmap_scaling_ppi, P_INT,
861          NULL, NULL, NULL},
862 #endif
863
864         {"ask_mark_all_read", "TRUE", &prefs_common.ask_mark_all_read, P_BOOL,
865          NULL, NULL, NULL},
866
867         {"ask_apply_per_account_filtering_rules", "TRUE", &prefs_common.ask_apply_per_account_filtering_rules, P_BOOL,
868          NULL, NULL, NULL},
869         {"apply_per_account_filtering_rules", "0", &prefs_common.apply_per_account_filtering_rules, P_ENUM,
870          NULL, NULL, NULL},
871
872         /* Addressbook */
873         {"addressbook_use_editaddress_dialog", "TRUE", &prefs_common.addressbook_use_editaddress_dialog,
874          P_BOOL, NULL, NULL, NULL},
875         {"addressbook_hpaned_pos", "-1", &prefs_common.addressbook_hpaned_pos,
876          P_INT, NULL, NULL, NULL},
877         {"addressbook_vpaned_pos", "-1", &prefs_common.addressbook_vpaned_pos,
878          P_INT, NULL, NULL, NULL},
879
880         /* Other */
881 #ifndef G_OS_WIN32
882         {"uri_open_command", DEFAULT_BROWSER_CMD,
883          &SPECIFIC_PREFS.uri_cmd, P_STRING, NULL, NULL, NULL},
884 #else
885         {"gtk_theme", DEFAULT_W32_GTK_THEME,
886          &SPECIFIC_PREFS.gtk_theme, P_STRING, NULL, NULL, NULL},
887 #endif
888         {"ext_editor_command", DEFAULT_EDITOR_CMD,
889          &SPECIFIC_PREFS.ext_editor_cmd, P_STRING, NULL, NULL, NULL},
890         {"cmds_use_system_default", "TRUE",
891          &prefs_common.cmds_use_system_default, P_BOOL, NULL, NULL, NULL},
892         {"add_address_by_click", "FALSE", &prefs_common.add_address_by_click,
893          P_BOOL, NULL, NULL, NULL},
894         {"session_passwords", "FALSE", &prefs_common.session_passwords,
895          P_BOOL, NULL, NULL, NULL},
896         {"confirm_on_exit", "FALSE", &prefs_common.confirm_on_exit, P_BOOL,
897          NULL, NULL, NULL},
898         {"clean_trash_on_exit", "FALSE", &prefs_common.clean_on_exit, P_BOOL,
899          NULL, NULL, NULL},
900         {"ask_on_cleaning", "TRUE", &prefs_common.ask_on_clean, P_BOOL,
901          NULL, NULL, NULL},
902         {"warn_queued_on_exit", "TRUE", &prefs_common.warn_queued_on_exit,
903          P_BOOL, NULL, NULL, NULL},
904         {"work_offline", "FALSE", &prefs_common.work_offline, P_BOOL,
905          NULL, NULL, NULL},
906         {"summary_quicksearch_type", "0", &prefs_common.summary_quicksearch_type, P_INT,
907          NULL, NULL, NULL},
908 #ifndef GENERIC_UMPC
909         {"summary_quicksearch_recurse", "1", &prefs_common.summary_quicksearch_recurse, P_INT,
910          NULL, NULL, NULL},
911 #else
912         {"summary_quicksearch_recurse", "0", &prefs_common.summary_quicksearch_recurse, P_INT,
913          NULL, NULL, NULL},
914 #endif
915
916 #if defined(__OpenBSD__)
917         {"io_timeout_secs", "80", &prefs_common.io_timeout_secs,
918          P_INT, NULL, NULL, NULL},
919 #else
920         {"io_timeout_secs", "60", &prefs_common.io_timeout_secs,
921          P_INT, NULL, NULL, NULL},
922 #endif
923         {"hide_score", "-9999", &prefs_common.kill_score, P_INT,
924          NULL, NULL, NULL},
925         {"important_score", "1", &prefs_common.important_score, P_INT,
926          NULL, NULL, NULL},
927
928         {"clip_log", "TRUE", &prefs_common.cliplog, P_BOOL,
929          NULL, NULL, NULL},
930         {"log_length", "500", &prefs_common.loglength, P_INT,
931          NULL, NULL, NULL},
932 #ifndef GENERIC_UMPC
933         {"enable_log_standard", "TRUE", &prefs_common.enable_log_standard, P_BOOL,
934          NULL, NULL, NULL},
935         {"enable_log_warning", "TRUE", &prefs_common.enable_log_warning, P_BOOL,
936          NULL, NULL, NULL},
937         {"enable_log_error", "TRUE", &prefs_common.enable_log_error, P_BOOL,
938          NULL, NULL, NULL},
939         {"enable_log_status", "TRUE", &prefs_common.enable_log_status, P_BOOL,
940          NULL, NULL, NULL},
941 #else
942         {"enable_log_standard", "FALSE", &prefs_common.enable_log_standard, P_BOOL,
943          NULL, NULL, NULL},
944         {"enable_log_warning", "FALSE", &prefs_common.enable_log_warning, P_BOOL,
945          NULL, NULL, NULL},
946         {"enable_log_error", "FALSE", &prefs_common.enable_log_error, P_BOOL,
947          NULL, NULL, NULL},
948         {"enable_log_status", "FALSE", &prefs_common.enable_log_status, P_BOOL,
949          NULL, NULL, NULL},
950 #endif
951         {"log_msg_color", "#00af00", &prefs_common.log_msg_color, P_COLOR,
952          NULL, NULL, NULL},
953         {"log_warn_color", "#af0000", &prefs_common.log_warn_color, P_COLOR,
954          NULL, NULL, NULL},
955         {"log_error_color", "#af0000", &prefs_common.log_error_color, P_COLOR,
956          NULL, NULL, NULL},
957         {"log_in_color", "#000000", &prefs_common.log_in_color, P_COLOR,
958          NULL, NULL, NULL},
959         {"log_out_color", "#0000ef", &prefs_common.log_out_color, P_COLOR,
960          NULL, NULL, NULL},
961         {"log_status_ok_color", "#00af00", &prefs_common.log_status_ok_color, P_COLOR,
962          NULL, NULL, NULL},
963         {"log_status_nok_color", "#0000af", &prefs_common.log_status_nok_color, P_COLOR,
964          NULL, NULL, NULL},
965         {"log_status_skip_color", "#aa00aa", &prefs_common.log_status_skip_color, P_COLOR,
966          NULL, NULL, NULL},
967
968     {"enable_filtering_debug", "FALSE", &prefs_common.enable_filtering_debug, P_BOOL,
969          NULL, NULL, NULL},
970     {"filtering_debug_level", "1", &prefs_common.filtering_debug_level, P_INT,
971          NULL, NULL, NULL},
972     {"enable_filtering_debug_inc", "TRUE", &prefs_common.enable_filtering_debug_inc, P_BOOL,
973          NULL, NULL, NULL},
974     {"enable_filtering_debug_manual", "TRUE", &prefs_common.enable_filtering_debug_manual, P_BOOL,
975          NULL, NULL, NULL},
976     {"enable_filtering_debug_folder_proc", "FALSE", &prefs_common.enable_filtering_debug_folder_proc, P_BOOL,
977          NULL, NULL, NULL},
978     {"enable_filtering_debug_pre_proc", "FALSE", &prefs_common.enable_filtering_debug_pre_proc, P_BOOL,
979          NULL, NULL, NULL},
980     {"enable_filtering_debug_post_proc", "FALSE", &prefs_common.enable_filtering_debug_post_proc, P_BOOL,
981          NULL, NULL, NULL},
982     {"filtering_debug_clip_log", "TRUE", &prefs_common.filtering_debug_cliplog, P_BOOL,
983          NULL, NULL, NULL},
984         {"filtering_debug_log_length", "500", &prefs_common.filtering_debug_loglength, P_INT,
985          NULL, NULL, NULL},
986
987         {"gtk_can_change_accels", "FALSE", &prefs_common.gtk_can_change_accels, P_BOOL,
988          NULL, NULL, NULL},
989
990         {"color_new", "#0000b3", &prefs_common.color_new, P_COLOR,
991          NULL, NULL, NULL},
992
993         /* Some windows' sizes */
994         {"filteringwin_width", "500", &prefs_common.filteringwin_width, P_INT,
995          NULL, NULL, NULL},
996         {"filteringwin_height", "-1", &prefs_common.filteringwin_height, P_INT,
997          NULL, NULL, NULL},
998
999         {"filteringactionwin_width", "490", &prefs_common.filteringactionwin_width, P_INT,
1000          NULL, NULL, NULL},
1001         {"filteringactionwin_height", "-1", &prefs_common.filteringactionwin_height, P_INT,
1002          NULL, NULL, NULL},
1003
1004         {"matcherwin_width", "520", &prefs_common.matcherwin_width, P_INT,
1005          NULL, NULL, NULL},
1006         {"matcherwin_height", "-1", &prefs_common.matcherwin_height, P_INT,
1007          NULL, NULL, NULL},
1008
1009         {"templateswin_width", "480", &prefs_common.templateswin_width, P_INT,
1010          NULL, NULL, NULL},
1011         {"templateswin_height", "-1", &prefs_common.templateswin_height, P_INT,
1012          NULL, NULL, NULL},
1013
1014         {"actionswin_width", "486", &prefs_common.actionswin_width, P_INT,
1015          NULL, NULL, NULL},
1016         {"actionswin_height", "-1", &prefs_common.actionswin_height, P_INT,
1017          NULL, NULL, NULL},
1018
1019         {"tagswin_width", "486", &prefs_common.tagswin_width, P_INT,
1020          NULL, NULL, NULL},
1021         {"tagswin_height", "-1", &prefs_common.tagswin_height, P_INT,
1022          NULL, NULL, NULL},
1023
1024         {"addressbookwin_width", "520", &prefs_common.addressbookwin_width, P_INT,
1025          NULL, NULL, NULL},
1026         {"addressbookwin_height", "-1", &prefs_common.addressbookwin_height, P_INT,
1027          NULL, NULL, NULL},
1028
1029         {"addressbookeditpersonwin_width", "640", &prefs_common.addressbookeditpersonwin_width, P_INT,
1030          NULL, NULL, NULL},
1031         {"addressbookeditpersonwin_height", "320", &prefs_common.addressbookeditpersonwin_height, P_INT,
1032          NULL, NULL, NULL},
1033
1034         {"addressbookeditgroupwin_width", "580", &prefs_common.addressbookeditgroupwin_width, P_INT,
1035          NULL, NULL, NULL},
1036         {"addressbookeditgroupwin_height", "340", &prefs_common.addressbookeditgroupwin_height, P_INT,
1037          NULL, NULL, NULL},
1038
1039         {"pluginswin_width", "-1", &prefs_common.pluginswin_width, P_INT,
1040          NULL, NULL, NULL},
1041         {"pluginswin_height", "-1", &prefs_common.pluginswin_height, P_INT,
1042          NULL, NULL, NULL},
1043
1044         {"prefswin_width", "600", &prefs_common.prefswin_width, P_INT,
1045          NULL, NULL, NULL},
1046         {"prefswin_height", "-1", &prefs_common.prefswin_height, P_INT,
1047          NULL, NULL, NULL},
1048
1049         {"folderitemwin_width", "500", &prefs_common.folderitemwin_width, P_INT,
1050          NULL, NULL, NULL},
1051         {"folderitemwin_height", "-1", &prefs_common.folderitemwin_height, P_INT,
1052          NULL, NULL, NULL},
1053
1054         {"zero_replacement_char", "0", &prefs_common.zero_replacement, P_STRING,
1055          NULL, NULL, NULL},
1056
1057         {"editaccountwin_width", "500", &prefs_common.editaccountwin_width, P_INT,
1058          NULL, NULL, NULL},
1059         {"editaccountwin_height", "-1", &prefs_common.editaccountwin_height, P_INT,
1060          NULL, NULL, NULL},
1061
1062         {"accountswin_width", "500", &prefs_common.accountswin_width, P_INT,
1063          NULL, NULL, NULL},
1064         {"accountswin_height", "-1", &prefs_common.accountswin_height, P_INT,
1065          NULL, NULL, NULL},
1066
1067         {"logwin_width", "520", &prefs_common.logwin_width, P_INT,
1068          NULL, NULL, NULL},
1069         {"logwin_height", "-1", &prefs_common.logwin_height, P_INT,
1070          NULL, NULL, NULL},
1071
1072         {"filtering_debugwin_width", "600", &prefs_common.filtering_debugwin_width, P_INT,
1073          NULL, NULL, NULL},
1074         {"filtering_debugwin_height", "-1", &prefs_common.filtering_debugwin_height, P_INT,
1075          NULL, NULL, NULL},
1076
1077         {"folderselwin_width", "300", &prefs_common.folderselwin_width, P_INT,
1078          NULL, NULL, NULL},
1079         {"folderselwin_height", "-1", &prefs_common.folderselwin_height, P_INT,
1080          NULL, NULL, NULL},
1081
1082         {"addressaddwin_width", "300", &prefs_common.addressaddwin_width, P_INT,
1083          NULL, NULL, NULL},
1084         {"addressaddwin_height", "-1", &prefs_common.addressaddwin_height, P_INT,
1085          NULL, NULL, NULL},
1086
1087         {"addressbook_folderselwin_width", "300", &prefs_common.addressbook_folderselwin_width, P_INT,
1088          NULL, NULL, NULL},
1089         {"addressbook_folderselwin_height", "-1", &prefs_common.addressbook_folderselwin_height, P_INT,
1090          NULL, NULL, NULL},
1091
1092         {"aboutwin_width", "450", &prefs_common.aboutwin_width, P_INT,
1093          NULL, NULL, NULL},
1094         {"aboutwin_height", "500", &prefs_common.aboutwin_height, P_INT,
1095          NULL, NULL, NULL},
1096
1097         {"addrgather_width", "450", &prefs_common.addrgather_width, P_INT,
1098          NULL, NULL, NULL},
1099         {"addrgather_height", "-1", &prefs_common.addrgather_height, P_INT,
1100          NULL, NULL, NULL},
1101
1102         {"news_subscribe_width", "450", &prefs_common.news_subscribe_width, P_INT,
1103          NULL, NULL, NULL},
1104         {"news_subscribe_height", "400", &prefs_common.news_subscribe_height, P_INT,
1105          NULL, NULL, NULL},
1106
1107         /* Hidden */
1108         {"warn_dnd", "1", &prefs_common.warn_dnd, P_INT,
1109          NULL, NULL, NULL},
1110         {"utf8_instead_of_locale_for_broken_mail", "0", 
1111          &prefs_common.broken_are_utf8, P_INT,
1112          NULL, NULL, NULL},
1113         {"enable_swap_from", "FALSE", &prefs_common.swap_from, P_BOOL,
1114          NULL, NULL, NULL},
1115         {"use_stripes_everywhere", "TRUE", &prefs_common.use_stripes_everywhere, P_BOOL,
1116          NULL, NULL, NULL},
1117         {"use_stripes_in_summaries", "TRUE", &prefs_common.use_stripes_in_summaries, P_BOOL,
1118          NULL, NULL, NULL},
1119         {"stripes_color_offset", "4000", &prefs_common.stripes_color_offset, P_INT,
1120          NULL, NULL, NULL},
1121         {"enable_hscrollbar", "TRUE", &prefs_common.enable_hscrollbar, P_BOOL,
1122          NULL, NULL, NULL},
1123         {"folderview_vscrollbar_policy", "0",
1124          &prefs_common.folderview_vscrollbar_policy, P_ENUM,
1125          NULL, NULL, NULL},
1126         {"textview_cursor_visible", "FALSE",
1127          &prefs_common.textview_cursor_visible, P_BOOL,
1128          NULL, NULL, NULL},
1129         {"hover_timeout", "500", &prefs_common.hover_timeout, P_INT,
1130          NULL, NULL, NULL},
1131 #ifndef GENERIC_UMPC
1132         {"cache_max_mem_usage", "4096", &prefs_common.cache_max_mem_usage, P_INT,
1133          NULL, NULL, NULL},
1134         {"cache_min_keep_time", "15", &prefs_common.cache_min_keep_time, P_INT,
1135          NULL, NULL, NULL},
1136 #else
1137         {"cache_max_mem_usage", "4096", &prefs_common.cache_max_mem_usage, P_INT,
1138          NULL, NULL, NULL},
1139         {"cache_min_keep_time", "0", &prefs_common.cache_min_keep_time, P_INT,
1140          NULL, NULL, NULL},
1141 #endif
1142         {"thread_by_subject_max_age", "10", &prefs_common.thread_by_subject_max_age,
1143         P_INT, NULL, NULL, NULL },
1144         {"last_opened_folder", "", &prefs_common.last_opened_folder,
1145         P_STRING, NULL, NULL, NULL },
1146         {"goto_last_folder_on_startup", "FALSE", &prefs_common.goto_last_folder_on_startup,
1147         P_BOOL, NULL, NULL, NULL },
1148         {"summary_quicksearch_sticky", "1", &prefs_common.summary_quicksearch_sticky, P_INT,
1149          NULL, NULL, NULL},
1150         {"summary_quicksearch_dynamic", "0", &prefs_common.summary_quicksearch_dynamic, P_INT,
1151          NULL, NULL, NULL},
1152         {"summary_quicksearch_autorun", "0", &prefs_common.summary_quicksearch_autorun, P_INT,
1153          NULL, NULL, NULL},
1154         {"statusbar_update_step", "10", &prefs_common.statusbar_update_step, P_INT,
1155          NULL, NULL, NULL},
1156         {"compose_no_markup", "FALSE", &prefs_common.compose_no_markup, P_BOOL,
1157          NULL, NULL, NULL},
1158         {"skip_ssl_cert_check", "FALSE", &prefs_common.skip_ssl_cert_check, P_BOOL,
1159          NULL, NULL, NULL},
1160         {"live_dangerously", "FALSE", &prefs_common.live_dangerously, P_BOOL,
1161          NULL, NULL, NULL},
1162         {"save_parts_readwrite", "FALSE", &prefs_common.save_parts_readwrite, P_BOOL,
1163          NULL, NULL, NULL},
1164         {"hide_quotes", "0", &prefs_common.hide_quotes, P_INT,
1165          NULL, NULL, NULL},
1166         {"unsafe_ssl_certs", "FALSE", &prefs_common.unsafe_ssl_certs, P_BOOL,
1167          NULL, NULL, NULL},
1168 #ifndef GENERIC_UMPC
1169         {"real_time_sync", "FALSE", &prefs_common.real_time_sync, P_BOOL,
1170          NULL, NULL, NULL},
1171 #else
1172         {"real_time_sync", "TRUE", &prefs_common.real_time_sync, P_BOOL,
1173          NULL, NULL, NULL},
1174 #endif
1175
1176         {"print_paper_type", NULL, &prefs_common.print_paper_type, P_STRING,
1177          NULL, NULL, NULL},
1178         {"print_paper_orientation", "0", &prefs_common.print_paper_orientation, P_INT,
1179          NULL, NULL, NULL},
1180         {"print_margin_top", "-1", &prefs_common.print_margin_top, P_INT,
1181          NULL, NULL, NULL},
1182         {"print_margin_bottom", "-1", &prefs_common.print_margin_bottom, P_INT,
1183          NULL, NULL, NULL},
1184         {"print_margin_left", "-1", &prefs_common.print_margin_left, P_INT,
1185          NULL, NULL, NULL},
1186         {"print_margin_right", "-1", &prefs_common.print_margin_right, P_INT,
1187          NULL, NULL, NULL},
1188         {"print_use_color", "0", &prefs_common.print_use_color, P_INT,
1189          NULL, NULL, NULL},
1190         {"print_use_collate", "0", &prefs_common.print_use_collate, P_INT,
1191          NULL, NULL, NULL},
1192         {"print_use_reverse", "0", &prefs_common.print_use_reverse, P_INT,
1193          NULL, NULL, NULL},
1194         {"print_use_duplex", "0", &prefs_common.print_use_duplex, P_INT,
1195          NULL, NULL, NULL},
1196         {"print_imgs", "1", &prefs_common.print_imgs, P_INT,
1197          NULL, NULL, NULL},
1198         {"print_previewwin_width", "600", &prefs_common.print_previewwin_width, P_INT,
1199          NULL, NULL, NULL},
1200         {"print_previewwin_height", "-1", &prefs_common.print_previewwin_height, P_INT,
1201          NULL, NULL, NULL},
1202         {"use_networkmanager", "TRUE", &prefs_common.use_networkmanager, P_BOOL,
1203          NULL, NULL, NULL},
1204         {"use_shred", "FALSE", &prefs_common.use_shred, P_BOOL,
1205          NULL, NULL, NULL},
1206
1207         {"two_line_vertical", "TRUE", &prefs_common.two_line_vert,
1208         P_BOOL, NULL, NULL, NULL },
1209
1210         {"inherit_folder_properties", "FALSE", &prefs_common.inherit_folder_props, P_BOOL,
1211          NULL, NULL, NULL},
1212
1213         {"flush_metadata", "TRUE", &prefs_common.flush_metadata, P_BOOL,
1214          NULL, NULL, NULL},
1215
1216         {"nav_history_length", "50", &prefs_common.nav_history_length, P_INT,
1217          NULL, NULL, NULL},
1218
1219         {"diff_added_color", "#008b8b", &prefs_common.diff_added_color, P_COLOR,
1220          NULL, NULL, NULL},
1221         {"diff_deleted_color", "#6a5acd", &prefs_common.diff_deleted_color, P_COLOR,
1222          NULL, NULL, NULL},
1223         {"diff_hunk_color", "#a52a2a", &prefs_common.diff_hunk_color, P_COLOR,
1224          NULL, NULL, NULL},
1225
1226         {"folder_search_wildcard", "TRUE", &prefs_common.folder_search_wildcard, P_BOOL,
1227          NULL, NULL, NULL},
1228         {"address_search_wildcard", "TRUE", &prefs_common.address_search_wildcard, P_BOOL,
1229          NULL, NULL, NULL},
1230         {"enable_avatars", "3", &prefs_common.enable_avatars, P_INT, NULL, NULL, NULL},
1231 #ifndef PASSWORD_CRYPTO_OLD
1232         {"use_master_passphrase", FALSE, &prefs_common.use_master_passphrase, P_BOOL, NULL, NULL, NULL },
1233         {"master_passphrase", "", &prefs_common.master_passphrase, P_STRING, NULL, NULL, NULL },
1234         {"master_passphrase_salt", "", &prefs_common.master_passphrase_salt, P_STRING, NULL, NULL, NULL },
1235         {"master_passphrase_pbkdf2_rounds", "50000", &prefs_common.master_passphrase_pbkdf2_rounds, P_INT, NULL, NULL, NULL},
1236 #endif
1237
1238         {NULL, NULL, NULL, P_OTHER, NULL, NULL, NULL}
1239 };
1240
1241 /*
1242  * Read history list from the specified history file in the specified directory (subdir of rc_dir)
1243  * Fallback to default_list if history file is not found
1244  */
1245 GList *prefs_common_read_history_from_dir_with_defaults(const gchar *dirname, const gchar *history,
1246                                                                                                                           GList *default_list)
1247 {
1248         FILE *fp;
1249         gchar *path;
1250         gchar buf[PREFSBUFSIZE];
1251         GList *tmp = NULL;
1252
1253         if (dirname) {
1254                 path = g_strconcat(get_rc_dir(), G_DIR_SEPARATOR_S, dirname,
1255                                    G_DIR_SEPARATOR_S, history,
1256                                    NULL);
1257         } else {
1258         path = g_strconcat(get_rc_dir(), G_DIR_SEPARATOR_S, history,
1259                            NULL);
1260         }
1261         if ((fp = g_fopen(path, "rb")) == NULL) {
1262                 if (ENOENT != errno) FILE_OP_ERROR(path, "fopen");
1263                 g_free(path);
1264                 /* returns default list if set, otherwise NULL */
1265                 return default_list;
1266         }
1267         g_free(path);
1268         while (fgets(buf, sizeof(buf), fp) != NULL) {
1269                 g_strstrip(buf);
1270                 if (buf[0] == '\0') continue;
1271                 tmp = add_history(tmp, buf);
1272         }
1273         fclose(fp);
1274
1275         tmp = g_list_reverse(tmp);
1276
1277         return tmp;
1278 }
1279
1280 /*
1281  * Read history list from the specified history file in the specified directory (subdir of rc_dir)
1282  */
1283 static GList *prefs_common_read_history_from_dir(const gchar *dirname, const gchar *history) 
1284 {
1285         return prefs_common_read_history_from_dir_with_defaults(dirname, history, NULL);
1286 }
1287
1288 /*
1289  * Read history list from the specified history file
1290  */
1291 static GList *prefs_common_read_history(const gchar *history) 
1292 {
1293         return prefs_common_read_history_from_dir(NULL, history);
1294 }
1295
1296 void prefs_common_read_config(void)
1297 {
1298         gchar *rcpath;
1299         gchar *tmp;
1300
1301         rcpath = g_strconcat(get_rc_dir(), G_DIR_SEPARATOR_S, COMMON_RC, NULL);
1302         prefs_read_config(param, "Common", rcpath, NULL);
1303 #ifdef G_OS_WIN32
1304         prefs_read_config(param_os_specific, "CommonWin32", rcpath, NULL);
1305 #endif
1306
1307         g_free(rcpath);
1308
1309         tmp = g_strdup(gettext(prefs_common.date_format));
1310         g_free(prefs_common.date_format);
1311         prefs_common.date_format = tmp;
1312
1313         prefs_common.mime_open_cmd_history =
1314                 prefs_common_read_history(COMMAND_HISTORY);
1315         prefs_common.summary_quicksearch_history =
1316                 prefs_common_read_history(QUICKSEARCH_HISTORY);
1317         prefs_common.summary_search_from_history =
1318                 prefs_common_read_history(SUMMARY_SEARCH_FROM_HISTORY);
1319         prefs_common.summary_search_to_history =
1320                 prefs_common_read_history(SUMMARY_SEARCH_TO_HISTORY);
1321         prefs_common.summary_search_subject_history =
1322                 prefs_common_read_history(SUMMARY_SEARCH_SUBJECT_HISTORY);
1323         prefs_common.summary_search_body_history =
1324                 prefs_common_read_history(SUMMARY_SEARCH_BODY_HISTORY);
1325         prefs_common.summary_search_adv_condition_history =
1326                 prefs_common_read_history(SUMMARY_SEARCH_ADV_CONDITION_HISTORY);
1327         prefs_common.message_search_history =
1328                 prefs_common_read_history(MESSAGE_SEARCH_HISTORY);
1329         prefs_common.compose_save_to_history =
1330                 prefs_common_read_history(COMPOSE_SAVE_TO_HISTORY);
1331 #ifndef USE_ALT_ADDRBOOK
1332         prefs_common.addressbook_custom_attributes = addressbook_update_custom_attr_from_prefs();
1333 #endif
1334         colorlabel_update_colortable_from_prefs();
1335 }
1336
1337 #define TRY(func) \
1338 if (!(func)) \
1339 { \
1340         g_warning("failed to write"); \
1341         goto out;                       \
1342 } \
1343
1344 /*
1345  * Save history list to the specified history file in the specified directory (subdir of rc_dir)
1346  */
1347 static void prefs_common_save_history_to_dir(const gchar *dirname, const gchar *history, GList *list)
1348 {
1349         GList *cur;
1350         FILE *fp;
1351         gchar *path, *tmp_path;
1352
1353         if (dirname) {
1354                 path = g_strconcat(get_rc_dir(), G_DIR_SEPARATOR_S, dirname,
1355                                    G_DIR_SEPARATOR_S, history,
1356                                    NULL);
1357         } else {
1358         path = g_strconcat(get_rc_dir(), G_DIR_SEPARATOR_S, history,
1359                            NULL);
1360         }
1361         tmp_path = g_strconcat(path, ".tmp", NULL);
1362
1363         if ((fp = g_fopen(tmp_path, "wb")) == NULL) {
1364                 FILE_OP_ERROR(tmp_path, "fopen");
1365                 goto out;
1366         }
1367
1368         for (cur = list; cur != NULL; cur = cur->next) {
1369                 TRY(fputs((gchar *)cur->data, fp) != EOF &&
1370                     fputc('\n', fp) != EOF);
1371         }
1372
1373         if (fclose(fp) == EOF) {
1374                 FILE_OP_ERROR(tmp_path, "fclose");
1375                 fp = NULL;
1376                 goto out;
1377         }
1378         fp = NULL;
1379 #ifdef G_OS_WIN32
1380         claws_unlink(path);
1381 #endif
1382         if (g_rename(tmp_path, path) < 0) {
1383                 FILE_OP_ERROR(path, "rename");
1384                 goto out;
1385         }
1386
1387 out:
1388         if (fp)
1389                 fclose(fp);
1390         g_free(tmp_path);
1391         g_free(path);
1392 }
1393
1394 /*
1395  * Save history list to the specified history file
1396  */
1397 static void prefs_common_save_history(const gchar *history, GList *list)
1398 {
1399         prefs_common_save_history_to_dir(NULL, history, list);
1400 }
1401
1402 #undef TRY
1403
1404 void prefs_common_write_config(void)
1405 {
1406         prefs_write_config(param, "Common", COMMON_RC);
1407 #ifdef G_OS_WIN32
1408         prefs_write_config(param_os_specific, "CommonWin32", COMMON_RC);
1409 #endif
1410
1411         prefs_common_save_history(COMMAND_HISTORY, 
1412                 prefs_common.mime_open_cmd_history);
1413         prefs_common_save_history(QUICKSEARCH_HISTORY, 
1414                 prefs_common.summary_quicksearch_history);
1415         prefs_common_save_history(SUMMARY_SEARCH_FROM_HISTORY, 
1416                 prefs_common.summary_search_from_history);
1417         prefs_common_save_history(SUMMARY_SEARCH_TO_HISTORY, 
1418                 prefs_common.summary_search_to_history);
1419         prefs_common_save_history(SUMMARY_SEARCH_SUBJECT_HISTORY, 
1420                 prefs_common.summary_search_subject_history);
1421         prefs_common_save_history(SUMMARY_SEARCH_BODY_HISTORY, 
1422                 prefs_common.summary_search_body_history);
1423         prefs_common_save_history(SUMMARY_SEARCH_ADV_CONDITION_HISTORY, 
1424                 prefs_common.summary_search_adv_condition_history);
1425         prefs_common_save_history(MESSAGE_SEARCH_HISTORY, 
1426                 prefs_common.message_search_history);
1427         prefs_common_save_history(COMPOSE_SAVE_TO_HISTORY, 
1428                 prefs_common.compose_save_to_history);
1429
1430 #ifndef USE_ALT_ADDRBOOK
1431                 prefs_common_save_history_to_dir(ADDRBOOK_DIR,
1432                 ADDRESSBOOK_CUSTOM_ATTRIBUTES, 
1433                 prefs_common.addressbook_custom_attributes);
1434 #endif
1435 }
1436
1437 /* make a copy of string 'in' into buffer 'out'. un-escape \ sequences.
1438    both 'in' and 'out' must be non-NULL.
1439    'out' must be a pointer to a buffer whose size is at least equal
1440    to strlen(txt)+1, this buffer will get cleared. out's contents
1441    will always get set to a valid string, even if it's "".*/
1442 void pref_get_unescaped_pref(gchar *out, const gchar *in)
1443 {
1444         const gchar *i;
1445         gchar *o;
1446
1447         *out = '\0';
1448
1449         cm_return_if_fail( in != NULL );
1450         cm_return_if_fail( out != NULL );
1451
1452         i = in;
1453         o = out;
1454         memset(out, 0, strlen(in)+1);
1455         while (*i != '\0') {
1456                 if (*i == '\\' && *(i+1) == 'n') {
1457                         *o++ = '\n';
1458                         i++;
1459                 } else if (*i == '\\' && *(i+1) == 't') {
1460                         *o++ = '\t';
1461                         i++;
1462                 } else if (*i == '\\' && *(i+1) == '\\') {
1463                         *o++ = '\\';
1464                         i++;
1465                 } else {
1466                         *o++ = *i;
1467                 }
1468                 i++;
1469         }
1470         *o='\0';
1471 }
1472
1473 /* make a copy of string 'in' into buffer 'out'. escape \ sequences.
1474    both 'in' and 'out' must be non-NULL.
1475    'out' must be a pointer to a buffer whose size is at least equal
1476    to 2*strlen(txt)+1. out's contents will always get set to a valid
1477    string, even if it's "". */
1478 void pref_get_escaped_pref(gchar *out, const gchar *in)
1479 {
1480         const gchar *i;
1481         gchar *o;
1482
1483         *out = '\0';
1484
1485         cm_return_if_fail( in != NULL );
1486         cm_return_if_fail( out != NULL );
1487
1488         i = in;
1489         o = out;
1490         while (*i != '\0') {
1491                 if (*i == '\n') {
1492                         *o++ = '\\';
1493                         *o++ = 'n';
1494                 } else if (*i == '\t') {
1495                         *o++ = '\\';
1496                         *o++ = 't';
1497                 } else if (*i == '\\') {
1498                         *o++ = '\\';
1499                         *o++ = '\\';
1500                 } else {
1501                         *o++ = *i;
1502                 }
1503                 i++;
1504         }
1505         *o = '\0';
1506 }
1507                 
1508 /* set the contents of a textview widget from the internal \-escaped
1509   representation of a pref string. both txt and textview must be non-NULL. */
1510 void pref_set_textview_from_pref(GtkTextView *textview, const gchar *txt)
1511 {
1512         GtkTextBuffer *buffer;
1513         gchar *out = NULL;
1514
1515         cm_return_if_fail( textview != NULL );
1516
1517         buffer = gtk_text_view_get_buffer(textview);
1518
1519         if (!txt) {
1520                 gtk_text_buffer_set_text(buffer, "", -1);
1521         } else {
1522                 out = g_malloc(strlen(txt)+1);
1523
1524                 pref_get_unescaped_pref(out, txt);
1525
1526                 gtk_text_buffer_set_text(buffer, out, -1);
1527                 g_free(out);
1528         }
1529 }
1530
1531 /* set the contents of a gtkentry widget from the internal \-escaped
1532   representation of a pref string. both txt and entry must be non-NULL. */
1533 void pref_set_entry_from_pref(GtkEntry *entry, const gchar *txt)
1534 {
1535         gchar *out = NULL;
1536
1537         cm_return_if_fail( entry != NULL );
1538         if (!txt) {
1539                 gtk_entry_set_text(entry, "");
1540         } else {
1541                 out = g_malloc(strlen(txt)+1);
1542
1543                 pref_get_unescaped_pref(out, txt);
1544
1545                 gtk_entry_set_text(entry, out);
1546                 g_free(out);
1547         }
1548 }
1549
1550 /* get the \-escaped internal representation of a pref from the contents of
1551    a textview widget. textview must be non-NULL. */
1552 gchar *pref_get_pref_from_textview(GtkTextView *textview) 
1553 {
1554         GtkTextBuffer *buffer;
1555         GtkTextIter start, end;
1556         gchar *out, *tmp;
1557         
1558         cm_return_val_if_fail( textview != NULL, "" );
1559
1560         buffer = gtk_text_view_get_buffer(textview);
1561         gtk_text_buffer_get_start_iter(buffer, &start);
1562         gtk_text_buffer_get_iter_at_offset(buffer, &end, -1);
1563         tmp = gtk_text_buffer_get_text(buffer, &start, &end, FALSE);
1564         out = malloc(2*strlen(tmp)+1);
1565         if (out)
1566                 pref_get_escaped_pref(out, tmp);
1567         g_free(tmp);
1568
1569         return out?out:"";
1570 }
1571
1572 /* get the \-escaped internal representation of a pref from the contents of
1573    a gtkentry widget. entry must be non-NULL. */
1574 gchar *pref_get_pref_from_entry(GtkEntry *entry) 
1575 {
1576         gchar *out, *tmp;
1577
1578         cm_return_val_if_fail( entry != NULL, "" );
1579
1580         tmp = gtk_editable_get_chars(GTK_EDITABLE(entry), 0, -1);
1581         out = malloc(2*strlen(tmp)+1);
1582         
1583         if (out)
1584                 pref_get_escaped_pref(out, tmp);
1585         g_free(tmp);
1586
1587         return out?out:"";
1588 }
1589
1590 /* ugly hack to be able to get this pref from ssl_certificate.c */
1591 gboolean prefs_common_unsafe_ssl_certs(void)
1592 {
1593         return prefs_common.unsafe_ssl_certs;
1594 }
1595
1596 gboolean prefs_common_enable_log_standard(void)
1597 {
1598         return prefs_common.enable_log_standard;
1599 }
1600
1601 gboolean prefs_common_enable_log_warning(void)
1602 {
1603         return prefs_common.enable_log_warning;
1604 }
1605 gboolean prefs_common_enable_log_error(void)
1606 {
1607         return prefs_common.enable_log_error;
1608 }
1609 gboolean prefs_common_enable_log_status(void)
1610 {
1611         return prefs_common.enable_log_status;
1612 }
1613
1614 /**
1615    return the translated name of a header, if the translate_header option is
1616    set, otherwise return the untranslated header name (header_name itself).
1617    this function is provided for convenience, it's an interface to
1618    prefs_common.trans_hdr.
1619    works with header names either with or without trailing colon, provided
1620    that gettext found such header name in the sources (they should all be
1621    found in src/gtk/headers.h anyway).
1622 */
1623 const gchar *prefs_common_translated_header_name(const gchar *header_name)
1624 {
1625         if (header_name == NULL || *header_name == '\0')
1626                 return header_name;
1627
1628         return prefs_common.trans_hdr ? gettext(header_name) : header_name;
1629 }
1630
1631 const gchar *prefs_common_get_uri_cmd(void)
1632 {
1633 #ifdef G_OS_WIN32
1634         return NULL;
1635 #else
1636         gchar *tmp = NULL;
1637         
1638         if (!prefs_common.cmds_use_system_default)
1639                 return prefs_common.uri_cmd;
1640         
1641         tmp = g_find_program_in_path("xdg-open");
1642         if (!tmp) 
1643                 return prefs_common.uri_cmd;
1644         
1645         g_free(tmp);
1646         return "xdg-open %s";
1647 #endif
1648 }
1649
1650 const gchar *prefs_common_get_ext_editor_cmd(void)
1651 {
1652         return prefs_common.ext_editor_cmd;
1653 #if 0 /* we should do that, but it detaches the editor and breaks
1654          compose.c's external composition. */
1655         gchar *tmp = NULL;
1656         
1657         if (!prefs_common.cmds_use_system_default)
1658                 return prefs_common.ext_editor_cmd;
1659         
1660         tmp = g_find_program_in_path("xdg-open");
1661         if (!tmp) 
1662                 return prefs_common.ext_editor_cmd;
1663         
1664         g_free(tmp);
1665         return "xdg-open %s";
1666 #endif 
1667 }
1668
1669 gboolean prefs_common_get_use_shred(void)
1670 {
1671         return prefs_common.use_shred;
1672 }
1673
1674 gboolean prefs_common_get_flush_metadata (void)
1675 {
1676         return prefs_common.flush_metadata;
1677 }
1678
1679 PrefsCommon *prefs_common_get_prefs(void)
1680 {
1681         return &prefs_common;
1682 }