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