2012-04-01 [colin] 3.8.0cvs36
[claws.git] / src / prefs_common.c
1 /*
2  * Sylpheed -- a GTK+ based, lightweight, and fast e-mail client
3  * Copyright (C) 1999-2011 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         {NULL, NULL, NULL, P_OTHER, NULL, NULL, NULL}
1174 };
1175
1176 /*
1177  * Read history list from the specified history file in the specified directory (subdir of rc_dir)
1178  * Fallback to default_list if history file is not found
1179  */
1180 GList *prefs_common_read_history_from_dir_with_defaults(const gchar *dirname, const gchar *history,
1181                                                                                                                           GList *default_list)
1182 {
1183         FILE *fp;
1184         gchar *path;
1185         gchar buf[PREFSBUFSIZE];
1186         GList *tmp = NULL;
1187
1188         if (dirname) {
1189                 path = g_strconcat(get_rc_dir(), G_DIR_SEPARATOR_S, dirname,
1190                                    G_DIR_SEPARATOR_S, history,
1191                                    NULL);
1192         } else {
1193         path = g_strconcat(get_rc_dir(), G_DIR_SEPARATOR_S, history,
1194                            NULL);
1195         }
1196         if ((fp = g_fopen(path, "rb")) == NULL) {
1197                 if (ENOENT != errno) FILE_OP_ERROR(path, "fopen");
1198                 g_free(path);
1199                 /* returns default list if set, otherwise NULL */
1200                 return default_list;
1201         }
1202         g_free(path);
1203         while (fgets(buf, sizeof(buf), fp) != NULL) {
1204                 g_strstrip(buf);
1205                 if (buf[0] == '\0') continue;
1206                 tmp = add_history(tmp, buf);
1207         }
1208         fclose(fp);
1209
1210         tmp = g_list_reverse(tmp);
1211
1212         return tmp;
1213 }
1214
1215 /*
1216  * Read history list from the specified history file in the specified directory (subdir of rc_dir)
1217  */
1218 static GList *prefs_common_read_history_from_dir(const gchar *dirname, const gchar *history) 
1219 {
1220         return prefs_common_read_history_from_dir_with_defaults(dirname, history, NULL);
1221 }
1222
1223 /*
1224  * Read history list from the specified history file
1225  */
1226 static GList *prefs_common_read_history(const gchar *history) 
1227 {
1228         return prefs_common_read_history_from_dir(NULL, history);
1229 }
1230
1231 void prefs_common_read_config(void)
1232 {
1233         gchar *rcpath;
1234         gchar *tmp;
1235
1236         rcpath = g_strconcat(get_rc_dir(), G_DIR_SEPARATOR_S, COMMON_RC, NULL);
1237         prefs_read_config(param, "Common", rcpath, NULL);
1238 #ifdef G_OS_WIN32
1239         prefs_read_config(param_os_specific, "CommonWin32", rcpath, NULL);
1240 #endif
1241
1242         g_free(rcpath);
1243
1244         tmp = g_strdup(gettext(prefs_common.date_format));
1245         g_free(prefs_common.date_format);
1246         prefs_common.date_format = tmp;
1247
1248         prefs_common.mime_open_cmd_history =
1249                 prefs_common_read_history(COMMAND_HISTORY);
1250         prefs_common.summary_quicksearch_history =
1251                 prefs_common_read_history(QUICKSEARCH_HISTORY);
1252         prefs_common.summary_search_from_history =
1253                 prefs_common_read_history(SUMMARY_SEARCH_FROM_HISTORY);
1254         prefs_common.summary_search_to_history =
1255                 prefs_common_read_history(SUMMARY_SEARCH_TO_HISTORY);
1256         prefs_common.summary_search_subject_history =
1257                 prefs_common_read_history(SUMMARY_SEARCH_SUBJECT_HISTORY);
1258         prefs_common.summary_search_body_history =
1259                 prefs_common_read_history(SUMMARY_SEARCH_BODY_HISTORY);
1260         prefs_common.summary_search_adv_condition_history =
1261                 prefs_common_read_history(SUMMARY_SEARCH_ADV_CONDITION_HISTORY);
1262         prefs_common.message_search_history =
1263                 prefs_common_read_history(MESSAGE_SEARCH_HISTORY);
1264         prefs_common.compose_save_to_history =
1265                 prefs_common_read_history(COMPOSE_SAVE_TO_HISTORY);
1266 #ifndef USE_NEW_ADDRBOOK
1267         prefs_common.addressbook_custom_attributes = addressbook_update_custom_attr_from_prefs();
1268 #endif
1269         colorlabel_update_colortable_from_prefs();
1270 }
1271
1272 #define TRY(func) \
1273 if (!(func)) \
1274 { \
1275         g_warning("failed to write\n"); \
1276         goto out;                       \
1277 } \
1278
1279 /*
1280  * Save history list to the specified history file in the specified directory (subdir of rc_dir)
1281  */
1282 static void prefs_common_save_history_to_dir(const gchar *dirname, const gchar *history, GList *list)
1283 {
1284         GList *cur;
1285         FILE *fp;
1286         gchar *path, *tmp_path;
1287
1288         if (dirname) {
1289                 path = g_strconcat(get_rc_dir(), G_DIR_SEPARATOR_S, dirname,
1290                                    G_DIR_SEPARATOR_S, history,
1291                                    NULL);
1292         } else {
1293         path = g_strconcat(get_rc_dir(), G_DIR_SEPARATOR_S, history,
1294                            NULL);
1295         }
1296         tmp_path = g_strconcat(path, ".tmp", NULL);
1297
1298         if ((fp = g_fopen(tmp_path, "wb")) == NULL) {
1299                 FILE_OP_ERROR(tmp_path, "fopen");
1300                 goto out;
1301         }
1302
1303         for (cur = list; cur != NULL; cur = cur->next) {
1304                 TRY(fputs((gchar *)cur->data, fp) != EOF &&
1305                     fputc('\n', fp) != EOF);
1306         }
1307
1308         if (fclose(fp) == EOF) {
1309                 FILE_OP_ERROR(tmp_path, "fclose");
1310                 fp = NULL;
1311                 goto out;
1312         }
1313         fp = NULL;
1314 #ifdef G_OS_WIN32
1315         claws_unlink(path);
1316 #endif
1317         if (g_rename(tmp_path, path) < 0) {
1318                 FILE_OP_ERROR(path, "rename");
1319                 goto out;
1320         }
1321
1322 out:
1323         if (fp)
1324                 fclose(fp);
1325         g_free(tmp_path);
1326         g_free(path);
1327 }
1328
1329 /*
1330  * Save history list to the specified history file
1331  */
1332 static void prefs_common_save_history(const gchar *history, GList *list)
1333 {
1334         prefs_common_save_history_to_dir(NULL, history, list);
1335 }
1336
1337 #undef TRY
1338
1339 void prefs_common_write_config(void)
1340 {
1341         prefs_write_config(param, "Common", COMMON_RC);
1342 #ifdef G_OS_WIN32
1343         prefs_write_config(param_os_specific, "CommonWin32", COMMON_RC);
1344 #endif
1345
1346         prefs_common_save_history(COMMAND_HISTORY, 
1347                 prefs_common.mime_open_cmd_history);
1348         prefs_common_save_history(QUICKSEARCH_HISTORY, 
1349                 prefs_common.summary_quicksearch_history);
1350         prefs_common_save_history(SUMMARY_SEARCH_FROM_HISTORY, 
1351                 prefs_common.summary_search_from_history);
1352         prefs_common_save_history(SUMMARY_SEARCH_TO_HISTORY, 
1353                 prefs_common.summary_search_to_history);
1354         prefs_common_save_history(SUMMARY_SEARCH_SUBJECT_HISTORY, 
1355                 prefs_common.summary_search_subject_history);
1356         prefs_common_save_history(SUMMARY_SEARCH_BODY_HISTORY, 
1357                 prefs_common.summary_search_body_history);
1358         prefs_common_save_history(SUMMARY_SEARCH_ADV_CONDITION_HISTORY, 
1359                 prefs_common.summary_search_adv_condition_history);
1360         prefs_common_save_history(MESSAGE_SEARCH_HISTORY, 
1361                 prefs_common.message_search_history);
1362         prefs_common_save_history(COMPOSE_SAVE_TO_HISTORY, 
1363                 prefs_common.compose_save_to_history);
1364
1365 #ifndef USE_NEW_ADDRBOOK
1366                 prefs_common_save_history_to_dir(ADDRBOOK_DIR,
1367                 ADDRESSBOOK_CUSTOM_ATTRIBUTES, 
1368                 prefs_common.addressbook_custom_attributes);
1369 #endif
1370 }
1371
1372 /* make a copy of string 'in' into buffer 'out'. un-escape \ sequences.
1373    both 'in' and 'out' must be non-NULL.
1374    'out' must be a pointer to a buffer whose size is at least equal
1375    to strlen(txt)+1, this buffer will get cleared. out's contents
1376    will always get set to a valid string, even if it's "".*/
1377 void pref_get_unescaped_pref(gchar *out, const gchar *in)
1378 {
1379         const gchar *i;
1380         gchar *o;
1381
1382         *out = '\0';
1383
1384         cm_return_if_fail( in != NULL );
1385         cm_return_if_fail( out != NULL );
1386
1387         i = in;
1388         o = out;
1389         memset(out, 0, strlen(in)+1);
1390         while (*i != '\0') {
1391                 if (*i == '\\' && *(i+1) == 'n') {
1392                         *o++ = '\n';
1393                         i++;
1394                 } else if (*i == '\\' && *(i+1) == 't') {
1395                         *o++ = '\t';
1396                         i++;
1397                 } else if (*i == '\\' && *(i+1) == '\\') {
1398                         *o++ = '\\';
1399                         i++;
1400                 } else {
1401                         *o++ = *i;
1402                 }
1403                 i++;
1404         }
1405         *o='\0';
1406 }
1407
1408 /* make a copy of string 'in' into buffer 'out'. escape \ sequences.
1409    both 'in' and 'out' must be non-NULL.
1410    'out' must be a pointer to a buffer whose size is at least equal
1411    to 2*strlen(txt)+1. out's contents will always get set to a valid
1412    string, even if it's "". */
1413 void pref_get_escaped_pref(gchar *out, const gchar *in)
1414 {
1415         const gchar *i;
1416         gchar *o;
1417
1418         *out = '\0';
1419
1420         cm_return_if_fail( in != NULL );
1421         cm_return_if_fail( out != NULL );
1422
1423         i = in;
1424         o = out;
1425         while (*i != '\0') {
1426                 if (*i == '\n') {
1427                         *o++ = '\\';
1428                         *o++ = 'n';
1429                 } else if (*i == '\t') {
1430                         *o++ = '\\';
1431                         *o++ = 't';
1432                 } else if (*i == '\\') {
1433                         *o++ = '\\';
1434                         *o++ = '\\';
1435                 } else {
1436                         *o++ = *i;
1437                 }
1438                 i++;
1439         }
1440         *o = '\0';
1441 }
1442                 
1443 /* set the contents of a textview widget from the internal \-escaped
1444   representation of a pref string. both txt and textview must be non-NULL. */
1445 void pref_set_textview_from_pref(GtkTextView *textview, const gchar *txt)
1446 {
1447         GtkTextBuffer *buffer;
1448         gchar *out = NULL;
1449
1450         cm_return_if_fail( textview != NULL );
1451
1452         buffer = gtk_text_view_get_buffer(textview);
1453
1454         if (!txt) {
1455                 gtk_text_buffer_set_text(buffer, "", -1);
1456         } else {
1457                 out = g_malloc(strlen(txt)+1);
1458
1459                 pref_get_unescaped_pref(out, txt);
1460
1461                 gtk_text_buffer_set_text(buffer, out?out:"", -1);
1462                 g_free(out);
1463         }
1464 }
1465
1466 /* set the contents of a gtkentry widget from the internal \-escaped
1467   representation of a pref string. both txt and entry must be non-NULL. */
1468 void pref_set_entry_from_pref(GtkEntry *entry, const gchar *txt)
1469 {
1470         gchar *out = NULL;
1471
1472         cm_return_if_fail( entry != NULL );
1473         if (!txt) {
1474                 gtk_entry_set_text(entry, "");
1475         } else {
1476                 out = g_malloc(strlen(txt)+1);
1477
1478                 pref_get_unescaped_pref(out, txt);
1479
1480                 gtk_entry_set_text(entry, out?out:"");
1481                 g_free(out);
1482         }
1483 }
1484
1485 /* get the \-escaped internal representation of a pref from the contents of
1486    a textview widget. textview must be non-NULL. */
1487 gchar *pref_get_pref_from_textview(GtkTextView *textview) 
1488 {
1489         GtkTextBuffer *buffer;
1490         GtkTextIter start, end;
1491         gchar *out, *tmp;
1492         
1493         cm_return_val_if_fail( textview != NULL, "" );
1494
1495         buffer = gtk_text_view_get_buffer(textview);
1496         gtk_text_buffer_get_start_iter(buffer, &start);
1497         gtk_text_buffer_get_iter_at_offset(buffer, &end, -1);
1498         tmp = gtk_text_buffer_get_text(buffer, &start, &end, FALSE);
1499         out = malloc(2*strlen(tmp)+1);
1500         if (out)
1501                 pref_get_escaped_pref(out, tmp);
1502         g_free(tmp);
1503
1504         return out?out:"";
1505 }
1506
1507 /* get the \-escaped internal representation of a pref from the contents of
1508    a gtkentry widget. entry must be non-NULL. */
1509 gchar *pref_get_pref_from_entry(GtkEntry *entry) 
1510 {
1511         gchar *out, *tmp;
1512
1513         cm_return_val_if_fail( entry != NULL, "" );
1514
1515         tmp = gtk_editable_get_chars(GTK_EDITABLE(entry), 0, -1);
1516         out = malloc(2*strlen(tmp)+1);
1517         
1518         if (out)
1519                 pref_get_escaped_pref(out, tmp);
1520         g_free(tmp);
1521
1522         return out?out:"";
1523 }
1524
1525 /* ugly hack to be able to get this pref from ssl_certificate.c */
1526 gboolean prefs_common_unsafe_ssl_certs(void)
1527 {
1528         return prefs_common.unsafe_ssl_certs;
1529 }
1530
1531 gboolean prefs_common_enable_log_standard(void)
1532 {
1533         return prefs_common.enable_log_standard;
1534 }
1535
1536 gboolean prefs_common_enable_log_warning(void)
1537 {
1538         return prefs_common.enable_log_warning;
1539 }
1540 gboolean prefs_common_enable_log_error(void)
1541 {
1542         return prefs_common.enable_log_error;
1543 }
1544 gboolean prefs_common_enable_log_status(void)
1545 {
1546         return prefs_common.enable_log_status;
1547 }
1548
1549 #ifdef MAEMO
1550 const gchar *prefs_common_get_data_root(void)
1551 {
1552         if (prefs_common.data_root && *prefs_common.data_root)
1553                 return prefs_common.data_root;
1554         else
1555                 return NULL;
1556 }
1557 #endif
1558 /**
1559    return the translated name of a header, if the translate_header option is
1560    set, otherwise return the untranslated header name (header_name itself).
1561    this function is provided for convenience, it's an interface to
1562    prefs_common.trans_hdr.
1563    works with header names either with or without trailing colon, provided
1564    that gettext found such header name in the sources (they should all be
1565    found in src/gtk/headers.h anyway).
1566 */
1567 const gchar *prefs_common_translated_header_name(const gchar *header_name)
1568 {
1569         if (header_name == NULL || *header_name == '\0')
1570                 return header_name;
1571
1572         return prefs_common.trans_hdr ? gettext(header_name) : header_name;
1573 }
1574
1575 const gchar *prefs_common_get_uri_cmd(void)
1576 {
1577 #ifdef G_OS_WIN32
1578         return NULL;
1579 #else
1580         gchar *tmp = NULL;
1581         
1582         if (!prefs_common.cmds_use_system_default)
1583                 return prefs_common.uri_cmd;
1584         
1585         tmp = g_find_program_in_path("xdg-open");
1586         if (!tmp) 
1587                 return prefs_common.uri_cmd;
1588         
1589         g_free(tmp);
1590         return "xdg-open %s";
1591 #endif
1592 }
1593
1594 const gchar *prefs_common_get_ext_editor_cmd(void)
1595 {
1596         return prefs_common.ext_editor_cmd;
1597 #if 0 /* we should do that, but it detaches the editor and breaks
1598          compose.c's external composition. */
1599         gchar *tmp = NULL;
1600         
1601         if (!prefs_common.cmds_use_system_default)
1602                 return prefs_common.ext_editor_cmd;
1603         
1604         tmp = g_find_program_in_path("xdg-open");
1605         if (!tmp) 
1606                 return prefs_common.ext_editor_cmd;
1607         
1608         g_free(tmp);
1609         return "xdg-open %s";
1610 #endif 
1611 }
1612
1613 gboolean prefs_common_get_use_shred(void)
1614 {
1615         return prefs_common.use_shred;
1616 }
1617
1618 gboolean prefs_common_get_flush_metadata (void)
1619 {
1620         return prefs_common.flush_metadata;
1621 }
1622
1623 PrefsCommon *prefs_common_get_prefs(void)
1624 {
1625         return &prefs_common;
1626 }