Add more granular options on when to open a selected message.
[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         {"open_selected_message_on_search_results", "FALSE",
810          &prefs_common.open_selected_on_search_results,
811          P_BOOL, NULL, NULL, NULL},
812         {"open_selected_message_on_prevnext", "FALSE",
813          &prefs_common.open_selected_on_prevnext,
814          P_BOOL, NULL, NULL, NULL},
815         {"open_selected_message_on_deletemove", "FALSE",
816          &prefs_common.open_selected_on_deletemove,
817          P_BOOL, NULL, NULL, NULL},
818         {"open_selected_message_on_directional", "FALSE",
819          &prefs_common.open_selected_on_directional,
820          P_BOOL, NULL, NULL, NULL},
821         {"always_show_message_when_selected", "FALSE",
822          &prefs_common.always_show_msg,
823          P_BOOL, NULL, NULL, NULL},
824         {"select_on_entry", "3", &prefs_common.select_on_entry,
825          P_ENUM, NULL, NULL, NULL},
826         {"show_tooltips", "TRUE", &prefs_common.show_tooltips,
827          P_BOOL, NULL, NULL, NULL},
828
829         /* do it SUMMARY_OPEN_ACTIONS-1 times */
830         {"summary_select_prio1", "0", &prefs_common.summary_select_prio[0], P_ENUM,
831          NULL, NULL, NULL},
832         {"summary_select_prio2", "0", &prefs_common.summary_select_prio[1], P_ENUM,
833          NULL, NULL, NULL},
834         {"summary_select_prio3", "0", &prefs_common.summary_select_prio[2], P_ENUM,
835          NULL, NULL, NULL},
836         {"summary_select_prio4", "0", &prefs_common.summary_select_prio[3], P_ENUM,
837          NULL, NULL, NULL},
838         {"summary_select_prio5", "0", &prefs_common.summary_select_prio[4], P_ENUM,
839          NULL, NULL, NULL},
840         {"summary_select_prio6", "0", &prefs_common.summary_select_prio[5], P_ENUM,
841          NULL, NULL, NULL},
842         {"summary_select_prio7", "0", &prefs_common.summary_select_prio[6], P_ENUM,
843          NULL, NULL, NULL},
844
845         {"mark_as_read_on_new_window", "FALSE",
846          &prefs_common.mark_as_read_on_new_window,
847          P_BOOL, NULL, NULL, NULL},
848         {"mark_as_read_delay", "0",
849          &prefs_common.mark_as_read_delay, P_INT, 
850          NULL, NULL, NULL},
851         {"immediate_execution", "TRUE", &prefs_common.immediate_exec, P_BOOL,
852          NULL, NULL, NULL},
853         {"nextunreadmsg_dialog", "1", &prefs_common.next_unread_msg_dialog, P_ENUM,
854          NULL, NULL, NULL},
855         {"summary_from_show", "0", &prefs_common.summary_from_show, P_ENUM,
856          NULL, NULL, NULL},
857
858         {"pixmap_theme_path", DEFAULT_PIXMAP_THEME, 
859          &SPECIFIC_PREFS.pixmap_theme_path, P_STRING,
860          NULL, NULL, NULL},
861 #ifdef HAVE_SVG
862         {"enable_alpha_svg", "TRUE",
863          &SPECIFIC_PREFS.enable_alpha_svg, P_BOOL,
864          NULL, NULL, NULL},
865         {"enable_pixmap_scaling", "TRUE",
866          &SPECIFIC_PREFS.enable_pixmap_scaling, P_BOOL,
867          NULL, NULL, NULL},
868         {"pixmap_scaling_auto", "TRUE",
869          &SPECIFIC_PREFS.pixmap_scaling_auto, P_BOOL,
870          NULL, NULL, NULL},
871         {"pixmap_scaling_ppi", "96",
872          &SPECIFIC_PREFS.pixmap_scaling_ppi, P_INT,
873          NULL, NULL, NULL},
874 #endif
875
876         {"ask_mark_all_read", "TRUE", &prefs_common.ask_mark_all_read, P_BOOL,
877          NULL, NULL, NULL},
878
879         {"ask_apply_per_account_filtering_rules", "TRUE", &prefs_common.ask_apply_per_account_filtering_rules, P_BOOL,
880          NULL, NULL, NULL},
881         {"apply_per_account_filtering_rules", "0", &prefs_common.apply_per_account_filtering_rules, P_ENUM,
882          NULL, NULL, NULL},
883
884         /* Addressbook */
885         {"addressbook_use_editaddress_dialog", "TRUE", &prefs_common.addressbook_use_editaddress_dialog,
886          P_BOOL, NULL, NULL, NULL},
887         {"addressbook_hpaned_pos", "-1", &prefs_common.addressbook_hpaned_pos,
888          P_INT, NULL, NULL, NULL},
889         {"addressbook_vpaned_pos", "-1", &prefs_common.addressbook_vpaned_pos,
890          P_INT, NULL, NULL, NULL},
891
892         /* Other */
893 #ifndef G_OS_WIN32
894         {"uri_open_command", DEFAULT_BROWSER_CMD,
895          &SPECIFIC_PREFS.uri_cmd, P_STRING, NULL, NULL, NULL},
896 #else
897         {"gtk_theme", DEFAULT_W32_GTK_THEME,
898          &SPECIFIC_PREFS.gtk_theme, P_STRING, NULL, NULL, NULL},
899 #endif
900         {"ext_editor_command", DEFAULT_EDITOR_CMD,
901          &SPECIFIC_PREFS.ext_editor_cmd, P_STRING, NULL, NULL, NULL},
902         {"cmds_use_system_default", "TRUE",
903          &prefs_common.cmds_use_system_default, P_BOOL, NULL, NULL, NULL},
904         {"add_address_by_click", "FALSE", &prefs_common.add_address_by_click,
905          P_BOOL, NULL, NULL, NULL},
906         {"session_passwords", "FALSE", &prefs_common.session_passwords,
907          P_BOOL, NULL, NULL, NULL},
908         {"confirm_on_exit", "FALSE", &prefs_common.confirm_on_exit, P_BOOL,
909          NULL, NULL, NULL},
910         {"clean_trash_on_exit", "FALSE", &prefs_common.clean_on_exit, P_BOOL,
911          NULL, NULL, NULL},
912         {"ask_on_cleaning", "TRUE", &prefs_common.ask_on_clean, P_BOOL,
913          NULL, NULL, NULL},
914         {"warn_queued_on_exit", "TRUE", &prefs_common.warn_queued_on_exit,
915          P_BOOL, NULL, NULL, NULL},
916         {"work_offline", "FALSE", &prefs_common.work_offline, P_BOOL,
917          NULL, NULL, NULL},
918         {"summary_quicksearch_type", "0", &prefs_common.summary_quicksearch_type, P_INT,
919          NULL, NULL, NULL},
920 #ifndef GENERIC_UMPC
921         {"summary_quicksearch_recurse", "1", &prefs_common.summary_quicksearch_recurse, P_INT,
922          NULL, NULL, NULL},
923 #else
924         {"summary_quicksearch_recurse", "0", &prefs_common.summary_quicksearch_recurse, P_INT,
925          NULL, NULL, NULL},
926 #endif
927
928 #if defined(__OpenBSD__)
929         {"io_timeout_secs", "80", &prefs_common.io_timeout_secs,
930          P_INT, NULL, NULL, NULL},
931 #else
932         {"io_timeout_secs", "60", &prefs_common.io_timeout_secs,
933          P_INT, NULL, NULL, NULL},
934 #endif
935         {"hide_score", "-9999", &prefs_common.kill_score, P_INT,
936          NULL, NULL, NULL},
937         {"important_score", "1", &prefs_common.important_score, P_INT,
938          NULL, NULL, NULL},
939
940         {"clip_log", "TRUE", &prefs_common.cliplog, P_BOOL,
941          NULL, NULL, NULL},
942         {"log_length", "500", &prefs_common.loglength, P_INT,
943          NULL, NULL, NULL},
944 #ifndef GENERIC_UMPC
945         {"enable_log_standard", "TRUE", &prefs_common.enable_log_standard, P_BOOL,
946          NULL, NULL, NULL},
947         {"enable_log_warning", "TRUE", &prefs_common.enable_log_warning, P_BOOL,
948          NULL, NULL, NULL},
949         {"enable_log_error", "TRUE", &prefs_common.enable_log_error, P_BOOL,
950          NULL, NULL, NULL},
951         {"enable_log_status", "TRUE", &prefs_common.enable_log_status, P_BOOL,
952          NULL, NULL, NULL},
953 #else
954         {"enable_log_standard", "FALSE", &prefs_common.enable_log_standard, P_BOOL,
955          NULL, NULL, NULL},
956         {"enable_log_warning", "FALSE", &prefs_common.enable_log_warning, P_BOOL,
957          NULL, NULL, NULL},
958         {"enable_log_error", "FALSE", &prefs_common.enable_log_error, P_BOOL,
959          NULL, NULL, NULL},
960         {"enable_log_status", "FALSE", &prefs_common.enable_log_status, P_BOOL,
961          NULL, NULL, NULL},
962 #endif
963         {"log_msg_color", "#00af00", &prefs_common.log_msg_color, P_COLOR,
964          NULL, NULL, NULL},
965         {"log_warn_color", "#af0000", &prefs_common.log_warn_color, P_COLOR,
966          NULL, NULL, NULL},
967         {"log_error_color", "#af0000", &prefs_common.log_error_color, P_COLOR,
968          NULL, NULL, NULL},
969         {"log_in_color", "#000000", &prefs_common.log_in_color, P_COLOR,
970          NULL, NULL, NULL},
971         {"log_out_color", "#0000ef", &prefs_common.log_out_color, P_COLOR,
972          NULL, NULL, NULL},
973         {"log_status_ok_color", "#00af00", &prefs_common.log_status_ok_color, P_COLOR,
974          NULL, NULL, NULL},
975         {"log_status_nok_color", "#0000af", &prefs_common.log_status_nok_color, P_COLOR,
976          NULL, NULL, NULL},
977         {"log_status_skip_color", "#aa00aa", &prefs_common.log_status_skip_color, P_COLOR,
978          NULL, NULL, NULL},
979
980     {"enable_filtering_debug", "FALSE", &prefs_common.enable_filtering_debug, P_BOOL,
981          NULL, NULL, NULL},
982     {"filtering_debug_level", "1", &prefs_common.filtering_debug_level, P_INT,
983          NULL, NULL, NULL},
984     {"enable_filtering_debug_inc", "TRUE", &prefs_common.enable_filtering_debug_inc, P_BOOL,
985          NULL, NULL, NULL},
986     {"enable_filtering_debug_manual", "TRUE", &prefs_common.enable_filtering_debug_manual, P_BOOL,
987          NULL, NULL, NULL},
988     {"enable_filtering_debug_folder_proc", "FALSE", &prefs_common.enable_filtering_debug_folder_proc, P_BOOL,
989          NULL, NULL, NULL},
990     {"enable_filtering_debug_pre_proc", "FALSE", &prefs_common.enable_filtering_debug_pre_proc, P_BOOL,
991          NULL, NULL, NULL},
992     {"enable_filtering_debug_post_proc", "FALSE", &prefs_common.enable_filtering_debug_post_proc, P_BOOL,
993          NULL, NULL, NULL},
994     {"filtering_debug_clip_log", "TRUE", &prefs_common.filtering_debug_cliplog, P_BOOL,
995          NULL, NULL, NULL},
996         {"filtering_debug_log_length", "500", &prefs_common.filtering_debug_loglength, P_INT,
997          NULL, NULL, NULL},
998
999         {"gtk_can_change_accels", "FALSE", &prefs_common.gtk_can_change_accels, P_BOOL,
1000          NULL, NULL, NULL},
1001
1002         {"color_new", "#0000b3", &prefs_common.color_new, P_COLOR,
1003          NULL, NULL, NULL},
1004
1005         /* Some windows' sizes */
1006         {"filteringwin_width", "500", &prefs_common.filteringwin_width, P_INT,
1007          NULL, NULL, NULL},
1008         {"filteringwin_height", "-1", &prefs_common.filteringwin_height, P_INT,
1009          NULL, NULL, NULL},
1010
1011         {"filteringactionwin_width", "490", &prefs_common.filteringactionwin_width, P_INT,
1012          NULL, NULL, NULL},
1013         {"filteringactionwin_height", "-1", &prefs_common.filteringactionwin_height, P_INT,
1014          NULL, NULL, NULL},
1015
1016         {"matcherwin_width", "520", &prefs_common.matcherwin_width, P_INT,
1017          NULL, NULL, NULL},
1018         {"matcherwin_height", "-1", &prefs_common.matcherwin_height, P_INT,
1019          NULL, NULL, NULL},
1020
1021         {"templateswin_width", "480", &prefs_common.templateswin_width, P_INT,
1022          NULL, NULL, NULL},
1023         {"templateswin_height", "-1", &prefs_common.templateswin_height, P_INT,
1024          NULL, NULL, NULL},
1025
1026         {"actionswin_width", "486", &prefs_common.actionswin_width, P_INT,
1027          NULL, NULL, NULL},
1028         {"actionswin_height", "-1", &prefs_common.actionswin_height, P_INT,
1029          NULL, NULL, NULL},
1030
1031         {"tagswin_width", "486", &prefs_common.tagswin_width, P_INT,
1032          NULL, NULL, NULL},
1033         {"tagswin_height", "-1", &prefs_common.tagswin_height, P_INT,
1034          NULL, NULL, NULL},
1035
1036         {"addressbookwin_width", "520", &prefs_common.addressbookwin_width, P_INT,
1037          NULL, NULL, NULL},
1038         {"addressbookwin_height", "-1", &prefs_common.addressbookwin_height, P_INT,
1039          NULL, NULL, NULL},
1040
1041         {"addressbookeditpersonwin_width", "640", &prefs_common.addressbookeditpersonwin_width, P_INT,
1042          NULL, NULL, NULL},
1043         {"addressbookeditpersonwin_height", "320", &prefs_common.addressbookeditpersonwin_height, P_INT,
1044          NULL, NULL, NULL},
1045
1046         {"addressbookeditgroupwin_width", "580", &prefs_common.addressbookeditgroupwin_width, P_INT,
1047          NULL, NULL, NULL},
1048         {"addressbookeditgroupwin_height", "340", &prefs_common.addressbookeditgroupwin_height, P_INT,
1049          NULL, NULL, NULL},
1050
1051         {"pluginswin_width", "-1", &prefs_common.pluginswin_width, P_INT,
1052          NULL, NULL, NULL},
1053         {"pluginswin_height", "-1", &prefs_common.pluginswin_height, P_INT,
1054          NULL, NULL, NULL},
1055
1056         {"prefswin_width", "600", &prefs_common.prefswin_width, P_INT,
1057          NULL, NULL, NULL},
1058         {"prefswin_height", "-1", &prefs_common.prefswin_height, P_INT,
1059          NULL, NULL, NULL},
1060
1061         {"folderitemwin_width", "500", &prefs_common.folderitemwin_width, P_INT,
1062          NULL, NULL, NULL},
1063         {"folderitemwin_height", "-1", &prefs_common.folderitemwin_height, P_INT,
1064          NULL, NULL, NULL},
1065
1066         {"zero_replacement_char", "0", &prefs_common.zero_replacement, P_STRING,
1067          NULL, NULL, NULL},
1068
1069         {"editaccountwin_width", "500", &prefs_common.editaccountwin_width, P_INT,
1070          NULL, NULL, NULL},
1071         {"editaccountwin_height", "-1", &prefs_common.editaccountwin_height, P_INT,
1072          NULL, NULL, NULL},
1073
1074         {"accountswin_width", "500", &prefs_common.accountswin_width, P_INT,
1075          NULL, NULL, NULL},
1076         {"accountswin_height", "-1", &prefs_common.accountswin_height, P_INT,
1077          NULL, NULL, NULL},
1078
1079         {"logwin_width", "520", &prefs_common.logwin_width, P_INT,
1080          NULL, NULL, NULL},
1081         {"logwin_height", "-1", &prefs_common.logwin_height, P_INT,
1082          NULL, NULL, NULL},
1083
1084         {"filtering_debugwin_width", "600", &prefs_common.filtering_debugwin_width, P_INT,
1085          NULL, NULL, NULL},
1086         {"filtering_debugwin_height", "-1", &prefs_common.filtering_debugwin_height, P_INT,
1087          NULL, NULL, NULL},
1088
1089         {"folderselwin_width", "300", &prefs_common.folderselwin_width, P_INT,
1090          NULL, NULL, NULL},
1091         {"folderselwin_height", "-1", &prefs_common.folderselwin_height, P_INT,
1092          NULL, NULL, NULL},
1093
1094         {"addressaddwin_width", "300", &prefs_common.addressaddwin_width, P_INT,
1095          NULL, NULL, NULL},
1096         {"addressaddwin_height", "-1", &prefs_common.addressaddwin_height, P_INT,
1097          NULL, NULL, NULL},
1098
1099         {"addressbook_folderselwin_width", "300", &prefs_common.addressbook_folderselwin_width, P_INT,
1100          NULL, NULL, NULL},
1101         {"addressbook_folderselwin_height", "-1", &prefs_common.addressbook_folderselwin_height, P_INT,
1102          NULL, NULL, NULL},
1103
1104         {"aboutwin_width", "450", &prefs_common.aboutwin_width, P_INT,
1105          NULL, NULL, NULL},
1106         {"aboutwin_height", "500", &prefs_common.aboutwin_height, P_INT,
1107          NULL, NULL, NULL},
1108
1109         {"addrgather_width", "450", &prefs_common.addrgather_width, P_INT,
1110          NULL, NULL, NULL},
1111         {"addrgather_height", "-1", &prefs_common.addrgather_height, P_INT,
1112          NULL, NULL, NULL},
1113
1114         {"news_subscribe_width", "450", &prefs_common.news_subscribe_width, P_INT,
1115          NULL, NULL, NULL},
1116         {"news_subscribe_height", "400", &prefs_common.news_subscribe_height, P_INT,
1117          NULL, NULL, NULL},
1118
1119         /* Hidden */
1120         {"warn_dnd", "1", &prefs_common.warn_dnd, P_INT,
1121          NULL, NULL, NULL},
1122         {"utf8_instead_of_locale_for_broken_mail", "0", 
1123          &prefs_common.broken_are_utf8, P_INT,
1124          NULL, NULL, NULL},
1125         {"enable_swap_from", "FALSE", &prefs_common.swap_from, P_BOOL,
1126          NULL, NULL, NULL},
1127         {"use_stripes_everywhere", "TRUE", &prefs_common.use_stripes_everywhere, P_BOOL,
1128          NULL, NULL, NULL},
1129         {"use_stripes_in_summaries", "TRUE", &prefs_common.use_stripes_in_summaries, P_BOOL,
1130          NULL, NULL, NULL},
1131         {"stripes_color_offset", "4000", &prefs_common.stripes_color_offset, P_INT,
1132          NULL, NULL, NULL},
1133         {"enable_hscrollbar", "TRUE", &prefs_common.enable_hscrollbar, P_BOOL,
1134          NULL, NULL, NULL},
1135         {"folderview_vscrollbar_policy", "0",
1136          &prefs_common.folderview_vscrollbar_policy, P_ENUM,
1137          NULL, NULL, NULL},
1138         {"textview_cursor_visible", "FALSE",
1139          &prefs_common.textview_cursor_visible, P_BOOL,
1140          NULL, NULL, NULL},
1141         {"hover_timeout", "500", &prefs_common.hover_timeout, P_INT,
1142          NULL, NULL, NULL},
1143 #ifndef GENERIC_UMPC
1144         {"cache_max_mem_usage", "4096", &prefs_common.cache_max_mem_usage, P_INT,
1145          NULL, NULL, NULL},
1146         {"cache_min_keep_time", "15", &prefs_common.cache_min_keep_time, P_INT,
1147          NULL, NULL, NULL},
1148 #else
1149         {"cache_max_mem_usage", "4096", &prefs_common.cache_max_mem_usage, P_INT,
1150          NULL, NULL, NULL},
1151         {"cache_min_keep_time", "0", &prefs_common.cache_min_keep_time, P_INT,
1152          NULL, NULL, NULL},
1153 #endif
1154         {"thread_by_subject_max_age", "10", &prefs_common.thread_by_subject_max_age,
1155         P_INT, NULL, NULL, NULL },
1156         {"last_opened_folder", "", &prefs_common.last_opened_folder,
1157         P_STRING, NULL, NULL, NULL },
1158         {"goto_last_folder_on_startup", "FALSE", &prefs_common.goto_last_folder_on_startup,
1159         P_BOOL, NULL, NULL, NULL },
1160         {"summary_quicksearch_sticky", "1", &prefs_common.summary_quicksearch_sticky, P_INT,
1161          NULL, NULL, NULL},
1162         {"summary_quicksearch_dynamic", "0", &prefs_common.summary_quicksearch_dynamic, P_INT,
1163          NULL, NULL, NULL},
1164         {"summary_quicksearch_autorun", "0", &prefs_common.summary_quicksearch_autorun, P_INT,
1165          NULL, NULL, NULL},
1166         {"statusbar_update_step", "10", &prefs_common.statusbar_update_step, P_INT,
1167          NULL, NULL, NULL},
1168         {"compose_no_markup", "FALSE", &prefs_common.compose_no_markup, P_BOOL,
1169          NULL, NULL, NULL},
1170         {"skip_ssl_cert_check", "FALSE", &prefs_common.skip_ssl_cert_check, P_BOOL,
1171          NULL, NULL, NULL},
1172         {"live_dangerously", "FALSE", &prefs_common.live_dangerously, P_BOOL,
1173          NULL, NULL, NULL},
1174         {"save_parts_readwrite", "FALSE", &prefs_common.save_parts_readwrite, P_BOOL,
1175          NULL, NULL, NULL},
1176         {"hide_quotes", "0", &prefs_common.hide_quotes, P_INT,
1177          NULL, NULL, NULL},
1178         {"unsafe_ssl_certs", "FALSE", &prefs_common.unsafe_ssl_certs, P_BOOL,
1179          NULL, NULL, NULL},
1180 #ifndef GENERIC_UMPC
1181         {"real_time_sync", "FALSE", &prefs_common.real_time_sync, P_BOOL,
1182          NULL, NULL, NULL},
1183 #else
1184         {"real_time_sync", "TRUE", &prefs_common.real_time_sync, P_BOOL,
1185          NULL, NULL, NULL},
1186 #endif
1187
1188         {"print_paper_type", NULL, &prefs_common.print_paper_type, P_STRING,
1189          NULL, NULL, NULL},
1190         {"print_paper_orientation", "0", &prefs_common.print_paper_orientation, P_INT,
1191          NULL, NULL, NULL},
1192         {"print_margin_top", "-1", &prefs_common.print_margin_top, P_INT,
1193          NULL, NULL, NULL},
1194         {"print_margin_bottom", "-1", &prefs_common.print_margin_bottom, P_INT,
1195          NULL, NULL, NULL},
1196         {"print_margin_left", "-1", &prefs_common.print_margin_left, P_INT,
1197          NULL, NULL, NULL},
1198         {"print_margin_right", "-1", &prefs_common.print_margin_right, P_INT,
1199          NULL, NULL, NULL},
1200         {"print_use_color", "0", &prefs_common.print_use_color, P_INT,
1201          NULL, NULL, NULL},
1202         {"print_use_collate", "0", &prefs_common.print_use_collate, P_INT,
1203          NULL, NULL, NULL},
1204         {"print_use_reverse", "0", &prefs_common.print_use_reverse, P_INT,
1205          NULL, NULL, NULL},
1206         {"print_use_duplex", "0", &prefs_common.print_use_duplex, P_INT,
1207          NULL, NULL, NULL},
1208         {"print_imgs", "1", &prefs_common.print_imgs, P_INT,
1209          NULL, NULL, NULL},
1210         {"print_previewwin_width", "600", &prefs_common.print_previewwin_width, P_INT,
1211          NULL, NULL, NULL},
1212         {"print_previewwin_height", "-1", &prefs_common.print_previewwin_height, P_INT,
1213          NULL, NULL, NULL},
1214         {"use_networkmanager", "TRUE", &prefs_common.use_networkmanager, P_BOOL,
1215          NULL, NULL, NULL},
1216         {"use_shred", "FALSE", &prefs_common.use_shred, P_BOOL,
1217          NULL, NULL, NULL},
1218
1219         {"two_line_vertical", "TRUE", &prefs_common.two_line_vert,
1220         P_BOOL, NULL, NULL, NULL },
1221
1222         {"inherit_folder_properties", "FALSE", &prefs_common.inherit_folder_props, P_BOOL,
1223          NULL, NULL, NULL},
1224
1225         {"flush_metadata", "TRUE", &prefs_common.flush_metadata, P_BOOL,
1226          NULL, NULL, NULL},
1227
1228         {"nav_history_length", "50", &prefs_common.nav_history_length, P_INT,
1229          NULL, NULL, NULL},
1230
1231         {"diff_added_color", "#008b8b", &prefs_common.diff_added_color, P_COLOR,
1232          NULL, NULL, NULL},
1233         {"diff_deleted_color", "#6a5acd", &prefs_common.diff_deleted_color, P_COLOR,
1234          NULL, NULL, NULL},
1235         {"diff_hunk_color", "#a52a2a", &prefs_common.diff_hunk_color, P_COLOR,
1236          NULL, NULL, NULL},
1237
1238         {"folder_search_wildcard", "TRUE", &prefs_common.folder_search_wildcard, P_BOOL,
1239          NULL, NULL, NULL},
1240         {"address_search_wildcard", "TRUE", &prefs_common.address_search_wildcard, P_BOOL,
1241          NULL, NULL, NULL},
1242         {"enable_avatars", "3", &prefs_common.enable_avatars, P_INT, NULL, NULL, NULL},
1243 #ifndef PASSWORD_CRYPTO_OLD
1244         {"use_master_passphrase", FALSE, &prefs_common.use_master_passphrase, P_BOOL, NULL, NULL, NULL },
1245         {"master_passphrase", "", &prefs_common.master_passphrase, P_STRING, NULL, NULL, NULL },
1246         {"master_passphrase_salt", "", &prefs_common.master_passphrase_salt, P_STRING, NULL, NULL, NULL },
1247         {"master_passphrase_pbkdf2_rounds", "50000", &prefs_common.master_passphrase_pbkdf2_rounds, P_INT, NULL, NULL, NULL},
1248 #endif
1249
1250         {NULL, NULL, NULL, P_OTHER, NULL, NULL, NULL}
1251 };
1252
1253 /*
1254  * Read history list from the specified history file in the specified directory (subdir of rc_dir)
1255  * Fallback to default_list if history file is not found
1256  */
1257 GList *prefs_common_read_history_from_dir_with_defaults(const gchar *dirname, const gchar *history,
1258                                                                                                                           GList *default_list)
1259 {
1260         FILE *fp;
1261         gchar *path;
1262         gchar buf[PREFSBUFSIZE];
1263         GList *tmp = NULL;
1264
1265         if (dirname) {
1266                 path = g_strconcat(get_rc_dir(), G_DIR_SEPARATOR_S, dirname,
1267                                    G_DIR_SEPARATOR_S, history,
1268                                    NULL);
1269         } else {
1270         path = g_strconcat(get_rc_dir(), G_DIR_SEPARATOR_S, history,
1271                            NULL);
1272         }
1273         if ((fp = g_fopen(path, "rb")) == NULL) {
1274                 if (ENOENT != errno) FILE_OP_ERROR(path, "fopen");
1275                 g_free(path);
1276                 /* returns default list if set, otherwise NULL */
1277                 return default_list;
1278         }
1279         g_free(path);
1280         while (fgets(buf, sizeof(buf), fp) != NULL) {
1281                 g_strstrip(buf);
1282                 if (buf[0] == '\0') continue;
1283                 tmp = add_history(tmp, buf);
1284         }
1285         fclose(fp);
1286
1287         tmp = g_list_reverse(tmp);
1288
1289         return tmp;
1290 }
1291
1292 /*
1293  * Read history list from the specified history file in the specified directory (subdir of rc_dir)
1294  */
1295 static GList *prefs_common_read_history_from_dir(const gchar *dirname, const gchar *history) 
1296 {
1297         return prefs_common_read_history_from_dir_with_defaults(dirname, history, NULL);
1298 }
1299
1300 /*
1301  * Read history list from the specified history file
1302  */
1303 static GList *prefs_common_read_history(const gchar *history) 
1304 {
1305         return prefs_common_read_history_from_dir(NULL, history);
1306 }
1307
1308 void prefs_common_read_config(void)
1309 {
1310         gchar *rcpath;
1311         gchar *tmp;
1312
1313         rcpath = g_strconcat(get_rc_dir(), G_DIR_SEPARATOR_S, COMMON_RC, NULL);
1314         prefs_read_config(param, "Common", rcpath, NULL);
1315 #ifdef G_OS_WIN32
1316         prefs_read_config(param_os_specific, "CommonWin32", rcpath, NULL);
1317 #endif
1318
1319         g_free(rcpath);
1320
1321         tmp = g_strdup(gettext(prefs_common.date_format));
1322         g_free(prefs_common.date_format);
1323         prefs_common.date_format = tmp;
1324
1325         prefs_common.mime_open_cmd_history =
1326                 prefs_common_read_history(COMMAND_HISTORY);
1327         prefs_common.summary_quicksearch_history =
1328                 prefs_common_read_history(QUICKSEARCH_HISTORY);
1329         prefs_common.summary_search_from_history =
1330                 prefs_common_read_history(SUMMARY_SEARCH_FROM_HISTORY);
1331         prefs_common.summary_search_to_history =
1332                 prefs_common_read_history(SUMMARY_SEARCH_TO_HISTORY);
1333         prefs_common.summary_search_subject_history =
1334                 prefs_common_read_history(SUMMARY_SEARCH_SUBJECT_HISTORY);
1335         prefs_common.summary_search_body_history =
1336                 prefs_common_read_history(SUMMARY_SEARCH_BODY_HISTORY);
1337         prefs_common.summary_search_adv_condition_history =
1338                 prefs_common_read_history(SUMMARY_SEARCH_ADV_CONDITION_HISTORY);
1339         prefs_common.message_search_history =
1340                 prefs_common_read_history(MESSAGE_SEARCH_HISTORY);
1341         prefs_common.compose_save_to_history =
1342                 prefs_common_read_history(COMPOSE_SAVE_TO_HISTORY);
1343 #ifndef USE_ALT_ADDRBOOK
1344         prefs_common.addressbook_custom_attributes = addressbook_update_custom_attr_from_prefs();
1345 #endif
1346         colorlabel_update_colortable_from_prefs();
1347 }
1348
1349 #define TRY(func) \
1350 if (!(func)) \
1351 { \
1352         g_warning("failed to write"); \
1353         goto out;                       \
1354 } \
1355
1356 /*
1357  * Save history list to the specified history file in the specified directory (subdir of rc_dir)
1358  */
1359 static void prefs_common_save_history_to_dir(const gchar *dirname, const gchar *history, GList *list)
1360 {
1361         GList *cur;
1362         FILE *fp;
1363         gchar *path, *tmp_path;
1364
1365         if (dirname) {
1366                 path = g_strconcat(get_rc_dir(), G_DIR_SEPARATOR_S, dirname,
1367                                    G_DIR_SEPARATOR_S, history,
1368                                    NULL);
1369         } else {
1370         path = g_strconcat(get_rc_dir(), G_DIR_SEPARATOR_S, history,
1371                            NULL);
1372         }
1373         tmp_path = g_strconcat(path, ".tmp", NULL);
1374
1375         if ((fp = g_fopen(tmp_path, "wb")) == NULL) {
1376                 FILE_OP_ERROR(tmp_path, "fopen");
1377                 goto out;
1378         }
1379
1380         for (cur = list; cur != NULL; cur = cur->next) {
1381                 TRY(fputs((gchar *)cur->data, fp) != EOF &&
1382                     fputc('\n', fp) != EOF);
1383         }
1384
1385         if (fclose(fp) == EOF) {
1386                 FILE_OP_ERROR(tmp_path, "fclose");
1387                 fp = NULL;
1388                 goto out;
1389         }
1390         fp = NULL;
1391 #ifdef G_OS_WIN32
1392         claws_unlink(path);
1393 #endif
1394         if (g_rename(tmp_path, path) < 0) {
1395                 FILE_OP_ERROR(path, "rename");
1396                 goto out;
1397         }
1398
1399 out:
1400         if (fp)
1401                 fclose(fp);
1402         g_free(tmp_path);
1403         g_free(path);
1404 }
1405
1406 /*
1407  * Save history list to the specified history file
1408  */
1409 static void prefs_common_save_history(const gchar *history, GList *list)
1410 {
1411         prefs_common_save_history_to_dir(NULL, history, list);
1412 }
1413
1414 #undef TRY
1415
1416 void prefs_common_write_config(void)
1417 {
1418         prefs_write_config(param, "Common", COMMON_RC);
1419 #ifdef G_OS_WIN32
1420         prefs_write_config(param_os_specific, "CommonWin32", COMMON_RC);
1421 #endif
1422
1423         prefs_common_save_history(COMMAND_HISTORY, 
1424                 prefs_common.mime_open_cmd_history);
1425         prefs_common_save_history(QUICKSEARCH_HISTORY, 
1426                 prefs_common.summary_quicksearch_history);
1427         prefs_common_save_history(SUMMARY_SEARCH_FROM_HISTORY, 
1428                 prefs_common.summary_search_from_history);
1429         prefs_common_save_history(SUMMARY_SEARCH_TO_HISTORY, 
1430                 prefs_common.summary_search_to_history);
1431         prefs_common_save_history(SUMMARY_SEARCH_SUBJECT_HISTORY, 
1432                 prefs_common.summary_search_subject_history);
1433         prefs_common_save_history(SUMMARY_SEARCH_BODY_HISTORY, 
1434                 prefs_common.summary_search_body_history);
1435         prefs_common_save_history(SUMMARY_SEARCH_ADV_CONDITION_HISTORY, 
1436                 prefs_common.summary_search_adv_condition_history);
1437         prefs_common_save_history(MESSAGE_SEARCH_HISTORY, 
1438                 prefs_common.message_search_history);
1439         prefs_common_save_history(COMPOSE_SAVE_TO_HISTORY, 
1440                 prefs_common.compose_save_to_history);
1441
1442 #ifndef USE_ALT_ADDRBOOK
1443                 prefs_common_save_history_to_dir(ADDRBOOK_DIR,
1444                 ADDRESSBOOK_CUSTOM_ATTRIBUTES, 
1445                 prefs_common.addressbook_custom_attributes);
1446 #endif
1447 }
1448
1449 /* make a copy of string 'in' into buffer 'out'. un-escape \ sequences.
1450    both 'in' and 'out' must be non-NULL.
1451    'out' must be a pointer to a buffer whose size is at least equal
1452    to strlen(txt)+1, this buffer will get cleared. out's contents
1453    will always get set to a valid string, even if it's "".*/
1454 void pref_get_unescaped_pref(gchar *out, const gchar *in)
1455 {
1456         const gchar *i;
1457         gchar *o;
1458
1459         *out = '\0';
1460
1461         cm_return_if_fail( in != NULL );
1462         cm_return_if_fail( out != NULL );
1463
1464         i = in;
1465         o = out;
1466         memset(out, 0, strlen(in)+1);
1467         while (*i != '\0') {
1468                 if (*i == '\\' && *(i+1) == 'n') {
1469                         *o++ = '\n';
1470                         i++;
1471                 } else if (*i == '\\' && *(i+1) == 't') {
1472                         *o++ = '\t';
1473                         i++;
1474                 } else if (*i == '\\' && *(i+1) == '\\') {
1475                         *o++ = '\\';
1476                         i++;
1477                 } else {
1478                         *o++ = *i;
1479                 }
1480                 i++;
1481         }
1482         *o='\0';
1483 }
1484
1485 /* make a copy of string 'in' into buffer 'out'. escape \ sequences.
1486    both 'in' and 'out' must be non-NULL.
1487    'out' must be a pointer to a buffer whose size is at least equal
1488    to 2*strlen(txt)+1. out's contents will always get set to a valid
1489    string, even if it's "". */
1490 void pref_get_escaped_pref(gchar *out, const gchar *in)
1491 {
1492         const gchar *i;
1493         gchar *o;
1494
1495         *out = '\0';
1496
1497         cm_return_if_fail( in != NULL );
1498         cm_return_if_fail( out != NULL );
1499
1500         i = in;
1501         o = out;
1502         while (*i != '\0') {
1503                 if (*i == '\n') {
1504                         *o++ = '\\';
1505                         *o++ = 'n';
1506                 } else if (*i == '\t') {
1507                         *o++ = '\\';
1508                         *o++ = 't';
1509                 } else if (*i == '\\') {
1510                         *o++ = '\\';
1511                         *o++ = '\\';
1512                 } else {
1513                         *o++ = *i;
1514                 }
1515                 i++;
1516         }
1517         *o = '\0';
1518 }
1519                 
1520 /* set the contents of a textview widget from the internal \-escaped
1521   representation of a pref string. both txt and textview must be non-NULL. */
1522 void pref_set_textview_from_pref(GtkTextView *textview, const gchar *txt)
1523 {
1524         GtkTextBuffer *buffer;
1525         gchar *out = NULL;
1526
1527         cm_return_if_fail( textview != NULL );
1528
1529         buffer = gtk_text_view_get_buffer(textview);
1530
1531         if (!txt) {
1532                 gtk_text_buffer_set_text(buffer, "", -1);
1533         } else {
1534                 out = g_malloc(strlen(txt)+1);
1535
1536                 pref_get_unescaped_pref(out, txt);
1537
1538                 gtk_text_buffer_set_text(buffer, out, -1);
1539                 g_free(out);
1540         }
1541 }
1542
1543 /* set the contents of a gtkentry widget from the internal \-escaped
1544   representation of a pref string. both txt and entry must be non-NULL. */
1545 void pref_set_entry_from_pref(GtkEntry *entry, const gchar *txt)
1546 {
1547         gchar *out = NULL;
1548
1549         cm_return_if_fail( entry != NULL );
1550         if (!txt) {
1551                 gtk_entry_set_text(entry, "");
1552         } else {
1553                 out = g_malloc(strlen(txt)+1);
1554
1555                 pref_get_unescaped_pref(out, txt);
1556
1557                 gtk_entry_set_text(entry, out);
1558                 g_free(out);
1559         }
1560 }
1561
1562 /* get the \-escaped internal representation of a pref from the contents of
1563    a textview widget. textview must be non-NULL. */
1564 gchar *pref_get_pref_from_textview(GtkTextView *textview) 
1565 {
1566         GtkTextBuffer *buffer;
1567         GtkTextIter start, end;
1568         gchar *out, *tmp;
1569         
1570         cm_return_val_if_fail( textview != NULL, "" );
1571
1572         buffer = gtk_text_view_get_buffer(textview);
1573         gtk_text_buffer_get_start_iter(buffer, &start);
1574         gtk_text_buffer_get_iter_at_offset(buffer, &end, -1);
1575         tmp = gtk_text_buffer_get_text(buffer, &start, &end, FALSE);
1576         out = malloc(2*strlen(tmp)+1);
1577         if (out)
1578                 pref_get_escaped_pref(out, tmp);
1579         g_free(tmp);
1580
1581         return out?out:"";
1582 }
1583
1584 /* get the \-escaped internal representation of a pref from the contents of
1585    a gtkentry widget. entry must be non-NULL. */
1586 gchar *pref_get_pref_from_entry(GtkEntry *entry) 
1587 {
1588         gchar *out, *tmp;
1589
1590         cm_return_val_if_fail( entry != NULL, "" );
1591
1592         tmp = gtk_editable_get_chars(GTK_EDITABLE(entry), 0, -1);
1593         out = malloc(2*strlen(tmp)+1);
1594         
1595         if (out)
1596                 pref_get_escaped_pref(out, tmp);
1597         g_free(tmp);
1598
1599         return out?out:"";
1600 }
1601
1602 /* ugly hack to be able to get this pref from ssl_certificate.c */
1603 gboolean prefs_common_unsafe_ssl_certs(void)
1604 {
1605         return prefs_common.unsafe_ssl_certs;
1606 }
1607
1608 gboolean prefs_common_enable_log_standard(void)
1609 {
1610         return prefs_common.enable_log_standard;
1611 }
1612
1613 gboolean prefs_common_enable_log_warning(void)
1614 {
1615         return prefs_common.enable_log_warning;
1616 }
1617 gboolean prefs_common_enable_log_error(void)
1618 {
1619         return prefs_common.enable_log_error;
1620 }
1621 gboolean prefs_common_enable_log_status(void)
1622 {
1623         return prefs_common.enable_log_status;
1624 }
1625
1626 /**
1627    return the translated name of a header, if the translate_header option is
1628    set, otherwise return the untranslated header name (header_name itself).
1629    this function is provided for convenience, it's an interface to
1630    prefs_common.trans_hdr.
1631    works with header names either with or without trailing colon, provided
1632    that gettext found such header name in the sources (they should all be
1633    found in src/gtk/headers.h anyway).
1634 */
1635 const gchar *prefs_common_translated_header_name(const gchar *header_name)
1636 {
1637         if (header_name == NULL || *header_name == '\0')
1638                 return header_name;
1639
1640         return prefs_common.trans_hdr ? gettext(header_name) : header_name;
1641 }
1642
1643 const gchar *prefs_common_get_uri_cmd(void)
1644 {
1645 #ifdef G_OS_WIN32
1646         return NULL;
1647 #else
1648         gchar *tmp = NULL;
1649         
1650         if (!prefs_common.cmds_use_system_default)
1651                 return prefs_common.uri_cmd;
1652         
1653         tmp = g_find_program_in_path("xdg-open");
1654         if (!tmp) 
1655                 return prefs_common.uri_cmd;
1656         
1657         g_free(tmp);
1658         return "xdg-open %s";
1659 #endif
1660 }
1661
1662 const gchar *prefs_common_get_ext_editor_cmd(void)
1663 {
1664         return prefs_common.ext_editor_cmd;
1665 #if 0 /* we should do that, but it detaches the editor and breaks
1666          compose.c's external composition. */
1667         gchar *tmp = NULL;
1668         
1669         if (!prefs_common.cmds_use_system_default)
1670                 return prefs_common.ext_editor_cmd;
1671         
1672         tmp = g_find_program_in_path("xdg-open");
1673         if (!tmp) 
1674                 return prefs_common.ext_editor_cmd;
1675         
1676         g_free(tmp);
1677         return "xdg-open %s";
1678 #endif 
1679 }
1680
1681 gboolean prefs_common_get_use_shred(void)
1682 {
1683         return prefs_common.use_shred;
1684 }
1685
1686 gboolean prefs_common_get_flush_metadata (void)
1687 {
1688         return prefs_common.flush_metadata;
1689 }
1690
1691 PrefsCommon *prefs_common_get_prefs(void)
1692 {
1693         return &prefs_common;
1694 }