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