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