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