2008-09-25 [colin] 3.5.0cvs131
[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 #ifndef GENERIC_UMPC
638         {"mainwin_width", "800", &prefs_common.mainwin_width, P_INT,
639          NULL, NULL, NULL},
640         {"mainwin_height", "600", &prefs_common.mainwin_height, P_INT,
641          NULL, NULL, NULL},
642         {"messagewin_width", "600", &prefs_common.msgwin_width, P_INT,
643          NULL, NULL, NULL},
644         {"messagewin_height", "540", &prefs_common.msgwin_height, P_INT,
645          NULL, NULL, NULL},
646         {"sourcewin_width", "600", &prefs_common.sourcewin_width, P_INT,
647          NULL, NULL, NULL},
648         {"sourcewin_height", "500", &prefs_common.sourcewin_height, P_INT,
649          NULL, NULL, NULL},
650         {"compose_width", "600", &prefs_common.compose_width, P_INT,
651          NULL, NULL, NULL},
652         {"compose_height", "560", &prefs_common.compose_height, P_INT,
653          NULL, NULL, NULL},
654 #else
655         {"mainwin_width", "700", &prefs_common.mainwin_width, P_INT,
656          NULL, NULL, NULL},
657         {"mainwin_height", "470", &prefs_common.mainwin_height, P_INT,
658          NULL, NULL, NULL},
659         {"messagewin_width", "700", &prefs_common.msgwin_width, P_INT,
660          NULL, NULL, NULL},
661         {"messagewin_height", "470", &prefs_common.msgwin_height, P_INT,
662          NULL, NULL, NULL},
663         {"sourcewin_width", "700", &prefs_common.sourcewin_width, P_INT,
664          NULL, NULL, NULL},
665         {"sourcewin_height", "470", &prefs_common.sourcewin_height, P_INT,
666          NULL, NULL, NULL},
667         {"compose_width", "700", &prefs_common.compose_width, P_INT,
668          NULL, NULL, NULL},
669         {"compose_height", "470", &prefs_common.compose_height, P_INT,
670          NULL, NULL, NULL},
671 #endif
672         {"compose_x", "0", &prefs_common.compose_x, P_INT,
673          NULL, NULL, NULL},
674         {"compose_y", "0", &prefs_common.compose_y, P_INT,
675          NULL, NULL, NULL},
676         /* Message */
677         {"enable_color", "TRUE", &prefs_common.enable_color, P_BOOL,
678          NULL, NULL, NULL},
679
680         {"quote_level1_color", "#0000b3", &prefs_common.quote_level1_col, P_COLOR,
681          NULL, NULL, NULL},
682         {"quote_level2_color", "#0000b3", &prefs_common.quote_level2_col, P_COLOR,
683          NULL, NULL, NULL},
684         {"quote_level3_color", "#0000b3", &prefs_common.quote_level3_col, P_COLOR,
685          NULL, NULL, NULL},
686         {"enable_bgcolor", "FALSE", &prefs_common.enable_bgcolor, P_BOOL,
687          NULL, NULL, NULL},
688         {"quote_level1_bgcolor", "#cccccc", &prefs_common.quote_level1_bgcol, P_COLOR,
689          NULL, NULL, NULL},
690         {"quote_level2_bgcolor", "#d4d4d4", &prefs_common.quote_level2_bgcol, P_COLOR,
691          NULL, NULL, NULL},
692         {"quote_level3_bgcolor", "#dddddd", &prefs_common.quote_level3_bgcol, P_COLOR,
693          NULL, NULL, NULL},
694         {"uri_color", "#007f00", &prefs_common.uri_col, P_COLOR,
695          NULL, NULL, NULL},
696         {"emphasis_color", "#0000cf", &prefs_common.emphasis_col, P_COLOR,
697          NULL, NULL, NULL},
698         {"target_folder_color", "#da1cca", &prefs_common.tgt_folder_col, P_COLOR,
699          NULL, NULL, NULL},
700         {"signature_color", "#797979", &prefs_common.signature_col, P_COLOR,
701          NULL, NULL, NULL},
702         {"recycle_quote_colors", "FALSE", &prefs_common.recycle_quote_colors,
703          P_BOOL, NULL, NULL, NULL},
704
705         {"display_header_pane", "FALSE", &prefs_common.display_header_pane,
706          P_BOOL, NULL, NULL, NULL},
707         {"display_header", "TRUE", &prefs_common.display_header, P_BOOL,
708          NULL, NULL, NULL},
709         {"display_xface", "TRUE", &prefs_common.display_xface,
710          P_BOOL, NULL, NULL, NULL},
711         {"render_html", "TRUE", &prefs_common.render_html, P_BOOL,
712          NULL, NULL, NULL},
713         {"invoke_plugin_on_html", "FALSE", &prefs_common.invoke_plugin_on_html, P_BOOL,
714          NULL, NULL, NULL},
715         {"promote_html_part", "FALSE", &prefs_common.promote_html_part, P_BOOL,
716          NULL, NULL, NULL},
717         {"line_space", "2", &prefs_common.line_space, P_INT,
718          NULL, NULL, NULL},
719         {"never_send_retrcpt", "FALSE", &prefs_common.never_send_retrcpt, P_BOOL,
720          NULL, NULL, NULL},
721
722         {"enable_smooth_scroll", "FALSE",
723          &prefs_common.enable_smooth_scroll, P_BOOL,
724          NULL, NULL, NULL},
725         {"scroll_step", "1", &prefs_common.scroll_step, P_INT,
726          NULL, NULL, NULL},
727         {"scroll_half_page", "FALSE", &prefs_common.scroll_halfpage, P_BOOL,
728          NULL, NULL, NULL},
729         {"respect_flowed_format", "FALSE", &prefs_common.respect_flowed_format, P_BOOL,
730          NULL, NULL, NULL},
731
732         {"show_other_header", "FALSE", &prefs_common.show_other_header, P_BOOL,
733          NULL, NULL, NULL},
734
735         {"attach_desc", "TRUE", &prefs_common.attach_desc, P_BOOL,
736          NULL, NULL, NULL},
737         {"attach_save_directory", NULL,
738          &SPECIFIC_PREFS.attach_save_dir, P_STRING, NULL, NULL, NULL},
739         {"attach_load_directory", NULL,
740          &SPECIFIC_PREFS.attach_load_dir, P_STRING, NULL, NULL, NULL},
741
742         /* MIME viewer */
743         {"mime_textviewer",   NULL,
744          &SPECIFIC_PREFS.mime_textviewer,   P_STRING, NULL, NULL, NULL},
745         {"mime_open_command", "gedit '%s'",
746          &SPECIFIC_PREFS.mime_open_cmd,     P_STRING, NULL, NULL, NULL},
747
748         /* Interface */
749 #ifndef GENERIC_UMPC
750         {"layout_mode", "0", &prefs_common.layout_mode, P_INT,
751          NULL, NULL, NULL},
752 #else
753         {"layout_mode", "5", &prefs_common.layout_mode, P_INT,
754          NULL, NULL, NULL},
755 #endif
756         /* {"emulate_emacs", "FALSE", &prefs_common.emulate_emacs, P_BOOL,
757          NULL, NULL, NULL}, */
758         {"always_show_message_when_selected", "0",
759          &prefs_common.always_show_msg,
760          P_ENUM, NULL, NULL, NULL},
761         {"select_on_entry", "3", &prefs_common.select_on_entry,
762          P_ENUM, NULL, NULL, NULL},
763         {"show_tooltips", "TRUE", &prefs_common.show_tooltips,
764          P_BOOL, NULL, NULL, NULL},
765
766         /* do it SUMMARY_OPEN_ACTIONS-1 times */
767         {"summary_select_prio1", "0", &prefs_common.summary_select_prio[0], P_ENUM,
768          NULL, NULL, NULL},
769         {"summary_select_prio2", "0", &prefs_common.summary_select_prio[1], P_ENUM,
770          NULL, NULL, NULL},
771         {"summary_select_prio3", "0", &prefs_common.summary_select_prio[2], P_ENUM,
772          NULL, NULL, NULL},
773         {"summary_select_prio4", "0", &prefs_common.summary_select_prio[3], P_ENUM,
774          NULL, NULL, NULL},
775         {"summary_select_prio5", "0", &prefs_common.summary_select_prio[4], P_ENUM,
776          NULL, NULL, NULL},
777         {"summary_select_prio6", "0", &prefs_common.summary_select_prio[5], P_ENUM,
778          NULL, NULL, NULL},
779         {"summary_select_prio7", "0", &prefs_common.summary_select_prio[6], P_ENUM,
780          NULL, NULL, NULL},
781
782         {"mark_as_read_on_new_window", "FALSE",
783          &prefs_common.mark_as_read_on_new_window,
784          P_BOOL, NULL, NULL, NULL},
785         {"mark_as_read_delay", "0",
786          &prefs_common.mark_as_read_delay, P_INT, 
787          NULL, NULL, NULL},
788         {"immediate_execution", "TRUE", &prefs_common.immediate_exec, P_BOOL,
789          NULL, NULL, NULL},
790         {"nextunreadmsg_dialog", "1", &prefs_common.next_unread_msg_dialog, P_ENUM,
791          NULL, NULL, NULL},
792
793         {"pixmap_theme_path", DEFAULT_PIXMAP_THEME, 
794          &SPECIFIC_PREFS.pixmap_theme_path, P_STRING,
795          NULL, NULL, NULL},
796
797         {"ask_mark_all_read", "TRUE", &prefs_common.ask_mark_all_read, P_BOOL,
798          NULL, NULL, NULL},
799
800         {"ask_apply_per_account_filtering_rules", "TRUE", &prefs_common.ask_apply_per_account_filtering_rules, P_BOOL,
801          NULL, NULL, NULL},
802         {"apply_per_account_filtering_rules", "0", &prefs_common.apply_per_account_filtering_rules, P_ENUM,
803          NULL, NULL, NULL},
804
805         /* Addressbook */
806         {"addressbook_use_editaddress_dialog", "TRUE", &prefs_common.addressbook_use_editaddress_dialog,
807          P_BOOL, NULL, NULL, NULL},
808         {"addressbook_hpaned_pos", "-1", &prefs_common.addressbook_hpaned_pos,
809          P_INT, NULL, NULL, NULL},
810         {"addressbook_vpaned_pos", "-1", &prefs_common.addressbook_vpaned_pos,
811          P_INT, NULL, NULL, NULL},
812
813         /* Other */
814         {"uri_open_command", DEFAULT_BROWSER_CMD,
815          &SPECIFIC_PREFS.uri_cmd, P_STRING, NULL, NULL, NULL},
816         {"print_command", "lpr %s",
817          &SPECIFIC_PREFS.print_cmd, P_STRING, NULL, NULL, NULL},
818         {"ext_editor_command", DEFAULT_EDITOR_CMD,
819          &SPECIFIC_PREFS.ext_editor_cmd, P_STRING, NULL, NULL, NULL},
820         {"cmds_use_system_default", "FALSE",
821          &prefs_common.cmds_use_system_default, P_BOOL, NULL, NULL, NULL},
822         {"add_address_by_click", "FALSE", &prefs_common.add_address_by_click,
823          P_BOOL, NULL, NULL, NULL},
824         {"session_passwords", "FALSE", &prefs_common.session_passwords,
825          P_BOOL, NULL, NULL, NULL},
826         {"confirm_on_exit", "FALSE", &prefs_common.confirm_on_exit, P_BOOL,
827          NULL, NULL, NULL},
828         {"clean_trash_on_exit", "FALSE", &prefs_common.clean_on_exit, P_BOOL,
829          NULL, NULL, NULL},
830         {"ask_on_cleaning", "TRUE", &prefs_common.ask_on_clean, P_BOOL,
831          NULL, NULL, NULL},
832         {"warn_queued_on_exit", "TRUE", &prefs_common.warn_queued_on_exit,
833          P_BOOL, NULL, NULL, NULL},
834         {"work_offline", "FALSE", &prefs_common.work_offline, P_BOOL,
835          NULL, NULL, NULL},
836         {"summary_quicksearch_type", "0", &prefs_common.summary_quicksearch_type, P_INT,
837          NULL, NULL, NULL},
838 #ifndef GENERIC_UMPC
839         {"summary_quicksearch_recurse", "1", &prefs_common.summary_quicksearch_recurse, P_INT,
840          NULL, NULL, NULL},
841 #else
842         {"summary_quicksearch_recurse", "0", &prefs_common.summary_quicksearch_recurse, P_INT,
843          NULL, NULL, NULL},
844 #endif
845
846 #if defined(__OpenBSD__)
847         {"io_timeout_secs", "80", &prefs_common.io_timeout_secs,
848          P_INT, NULL, NULL, NULL},
849 #else
850         {"io_timeout_secs", "60", &prefs_common.io_timeout_secs,
851          P_INT, NULL, NULL, NULL},
852 #endif
853         {"hide_score", "-9999", &prefs_common.kill_score, P_INT,
854          NULL, NULL, NULL},
855         {"important_score", "1", &prefs_common.important_score, P_INT,
856          NULL, NULL, NULL},
857
858         {"clip_log", "TRUE", &prefs_common.cliplog, P_BOOL,
859          NULL, NULL, NULL},
860         {"log_length", "500", &prefs_common.loglength, P_INT,
861          NULL, NULL, NULL},
862 #ifndef GENERIC_UMPC
863         {"enable_log_standard", "TRUE", &prefs_common.enable_log_standard, P_BOOL,
864          NULL, NULL, NULL},
865         {"enable_log_warning", "TRUE", &prefs_common.enable_log_warning, P_BOOL,
866          NULL, NULL, NULL},
867         {"enable_log_error", "TRUE", &prefs_common.enable_log_error, P_BOOL,
868          NULL, NULL, NULL},
869         {"enable_log_status", "TRUE", &prefs_common.enable_log_status, P_BOOL,
870          NULL, NULL, NULL},
871 #else
872         {"enable_log_standard", "FALSE", &prefs_common.enable_log_standard, P_BOOL,
873          NULL, NULL, NULL},
874         {"enable_log_warning", "FALSE", &prefs_common.enable_log_warning, P_BOOL,
875          NULL, NULL, NULL},
876         {"enable_log_error", "FALSE", &prefs_common.enable_log_error, P_BOOL,
877          NULL, NULL, NULL},
878         {"enable_log_status", "FALSE", &prefs_common.enable_log_status, P_BOOL,
879          NULL, NULL, NULL},
880 #endif
881         {"log_msg_color", "#00af00", &prefs_common.log_msg_color, P_COLOR,
882          NULL, NULL, NULL},
883         {"log_warn_color", "#af0000", &prefs_common.log_warn_color, P_COLOR,
884          NULL, NULL, NULL},
885         {"log_error_color", "#af0000", &prefs_common.log_error_color, P_COLOR,
886          NULL, NULL, NULL},
887         {"log_in_color", "#000000", &prefs_common.log_in_color, P_COLOR,
888          NULL, NULL, NULL},
889         {"log_out_color", "#0000ef", &prefs_common.log_out_color, P_COLOR,
890          NULL, NULL, NULL},
891         {"log_status_ok_color", "#00af00", &prefs_common.log_status_ok_color, P_COLOR,
892          NULL, NULL, NULL},
893         {"log_status_nok_color", "#0000af", &prefs_common.log_status_nok_color, P_COLOR,
894          NULL, NULL, NULL},
895         {"log_status_skip_color", "#aa00aa", &prefs_common.log_status_skip_color, P_COLOR,
896          NULL, NULL, NULL},
897
898     {"enable_filtering_debug", "FALSE", &prefs_common.enable_filtering_debug, P_BOOL,
899          NULL, NULL, NULL},
900     {"filtering_debug_level", "1", &prefs_common.filtering_debug_level, P_INT,
901          NULL, NULL, NULL},
902     {"enable_filtering_debug_inc", "TRUE", &prefs_common.enable_filtering_debug_inc, P_BOOL,
903          NULL, NULL, NULL},
904     {"enable_filtering_debug_manual", "TRUE", &prefs_common.enable_filtering_debug_manual, P_BOOL,
905          NULL, NULL, NULL},
906     {"enable_filtering_debug_folder_proc", "FALSE", &prefs_common.enable_filtering_debug_folder_proc, P_BOOL,
907          NULL, NULL, NULL},
908     {"enable_filtering_debug_pre_proc", "FALSE", &prefs_common.enable_filtering_debug_pre_proc, P_BOOL,
909          NULL, NULL, NULL},
910     {"enable_filtering_debug_post_proc", "FALSE", &prefs_common.enable_filtering_debug_post_proc, P_BOOL,
911          NULL, NULL, NULL},
912     {"filtering_debug_clip_log", "TRUE", &prefs_common.filtering_debug_cliplog, P_BOOL,
913          NULL, NULL, NULL},
914         {"filtering_debug_log_length", "500", &prefs_common.filtering_debug_loglength, P_INT,
915          NULL, NULL, NULL},
916
917         {"gtk_can_change_accels", "TRUE", &prefs_common.gtk_can_change_accels, P_BOOL,
918          NULL, NULL, NULL},
919
920         {"color_new", "#0000b3", &prefs_common.color_new, P_COLOR,
921          NULL, NULL, NULL},
922
923         /* Some windows' sizes */
924         {"filteringwin_width", "500", &prefs_common.filteringwin_width, P_INT,
925          NULL, NULL, NULL},
926         {"filteringwin_height", "-1", &prefs_common.filteringwin_height, P_INT,
927          NULL, NULL, NULL},
928
929         {"filteringactionwin_width", "490", &prefs_common.filteringactionwin_width, P_INT,
930          NULL, NULL, NULL},
931         {"filteringactionwin_height", "-1", &prefs_common.filteringactionwin_height, P_INT,
932          NULL, NULL, NULL},
933
934         {"matcherwin_width", "520", &prefs_common.matcherwin_width, P_INT,
935          NULL, NULL, NULL},
936         {"matcherwin_height", "-1", &prefs_common.matcherwin_height, P_INT,
937          NULL, NULL, NULL},
938
939         {"templateswin_width", "480", &prefs_common.templateswin_width, P_INT,
940          NULL, NULL, NULL},
941         {"templateswin_height", "-1", &prefs_common.templateswin_height, P_INT,
942          NULL, NULL, NULL},
943
944         {"actionswin_width", "486", &prefs_common.actionswin_width, P_INT,
945          NULL, NULL, NULL},
946         {"actionswin_height", "-1", &prefs_common.actionswin_height, P_INT,
947          NULL, NULL, NULL},
948
949         {"tagswin_width", "486", &prefs_common.tagswin_width, P_INT,
950          NULL, NULL, NULL},
951         {"tagswin_height", "-1", &prefs_common.tagswin_height, P_INT,
952          NULL, NULL, NULL},
953
954         {"addressbookwin_width", "520", &prefs_common.addressbookwin_width, P_INT,
955          NULL, NULL, NULL},
956         {"addressbookwin_height", "-1", &prefs_common.addressbookwin_height, P_INT,
957          NULL, NULL, NULL},
958
959         {"addressbookeditpersonwin_width", "640", &prefs_common.addressbookeditpersonwin_width, P_INT,
960          NULL, NULL, NULL},
961         {"addressbookeditpersonwin_height", "320", &prefs_common.addressbookeditpersonwin_height, P_INT,
962          NULL, NULL, NULL},
963
964         {"addressbookeditgroupwin_width", "580", &prefs_common.addressbookeditgroupwin_width, P_INT,
965          NULL, NULL, NULL},
966         {"addressbookeditgroupwin_height", "340", &prefs_common.addressbookeditgroupwin_height, P_INT,
967          NULL, NULL, NULL},
968
969         {"pluginswin_width", "-1", &prefs_common.pluginswin_width, P_INT,
970          NULL, NULL, NULL},
971         {"pluginswin_height", "-1", &prefs_common.pluginswin_height, P_INT,
972          NULL, NULL, NULL},
973
974         {"prefswin_width", "600", &prefs_common.prefswin_width, P_INT,
975          NULL, NULL, NULL},
976         {"prefswin_height", "-1", &prefs_common.prefswin_height, P_INT,
977          NULL, NULL, NULL},
978
979         {"folderitemwin_width", "500", &prefs_common.folderitemwin_width, P_INT,
980          NULL, NULL, NULL},
981         {"folderitemwin_height", "-1", &prefs_common.folderitemwin_height, P_INT,
982          NULL, NULL, NULL},
983
984         {"zero_replacement_char", "0", &prefs_common.zero_replacement, P_STRING,
985          NULL, NULL, NULL},
986
987         {"editaccountwin_width", "500", &prefs_common.editaccountwin_width, P_INT,
988          NULL, NULL, NULL},
989         {"editaccountwin_height", "-1", &prefs_common.editaccountwin_height, P_INT,
990          NULL, NULL, NULL},
991
992         {"accountswin_width", "500", &prefs_common.accountswin_width, P_INT,
993          NULL, NULL, NULL},
994         {"accountswin_height", "-1", &prefs_common.accountswin_height, P_INT,
995          NULL, NULL, NULL},
996
997         {"logwin_width", "520", &prefs_common.logwin_width, P_INT,
998          NULL, NULL, NULL},
999         {"logwin_height", "-1", &prefs_common.logwin_height, P_INT,
1000          NULL, NULL, NULL},
1001
1002         {"filtering_debugwin_width", "600", &prefs_common.filtering_debugwin_width, P_INT,
1003          NULL, NULL, NULL},
1004         {"filtering_debugwin_height", "-1", &prefs_common.filtering_debugwin_height, P_INT,
1005          NULL, NULL, NULL},
1006
1007         {"folderselwin_width", "300", &prefs_common.folderselwin_width, P_INT,
1008          NULL, NULL, NULL},
1009         {"folderselwin_height", "-1", &prefs_common.folderselwin_height, P_INT,
1010          NULL, NULL, NULL},
1011
1012         {"addressaddwin_width", "300", &prefs_common.addressaddwin_width, P_INT,
1013          NULL, NULL, NULL},
1014         {"addressaddwin_height", "-1", &prefs_common.addressaddwin_height, P_INT,
1015          NULL, NULL, NULL},
1016
1017         {"addressbook_folderselwin_width", "300", &prefs_common.addressbook_folderselwin_width, P_INT,
1018          NULL, NULL, NULL},
1019         {"addressbook_folderselwin_height", "-1", &prefs_common.addressbook_folderselwin_height, P_INT,
1020          NULL, NULL, NULL},
1021
1022         /* Hidden */
1023         {"warn_dnd", "1", &prefs_common.warn_dnd, P_INT,
1024          NULL, NULL, NULL},
1025         {"utf8_instead_of_locale_for_broken_mail", "0", 
1026          &prefs_common.broken_are_utf8, P_INT,
1027          NULL, NULL, NULL},
1028         {"enable_swap_from", "FALSE", &prefs_common.swap_from, P_BOOL,
1029          NULL, NULL, NULL},
1030         {"use_stripes_everywhere", "TRUE", &prefs_common.use_stripes_everywhere, P_BOOL,
1031          NULL, NULL, NULL},
1032         {"use_stripes_in_summaries", "TRUE", &prefs_common.use_stripes_in_summaries, P_BOOL,
1033          NULL, NULL, NULL},
1034         {"stripes_color_offset", "4000", &prefs_common.stripes_color_offset, P_INT,
1035          NULL, NULL, NULL},
1036         {"enable_dotted_lines", "FALSE", &prefs_common.enable_dotted_lines, P_BOOL,
1037          NULL, NULL, NULL},
1038         {"enable_hscrollbar", "TRUE", &prefs_common.enable_hscrollbar, P_BOOL,
1039          NULL, NULL, NULL},
1040         {"folderview_vscrollbar_policy", "0",
1041          &prefs_common.folderview_vscrollbar_policy, P_ENUM,
1042          NULL, NULL, NULL},
1043         {"textview_cursor_visible", "FALSE",
1044          &prefs_common.textview_cursor_visible, P_BOOL,
1045          NULL, NULL, NULL},
1046         {"hover_timeout", "500", &prefs_common.hover_timeout, P_INT,
1047          NULL, NULL, NULL},
1048 #ifndef GENERIC_UMPC
1049         {"cache_max_mem_usage", "4096", &prefs_common.cache_max_mem_usage, P_INT,
1050          NULL, NULL, NULL},
1051         {"cache_min_keep_time", "15", &prefs_common.cache_min_keep_time, P_INT,
1052          NULL, NULL, NULL},
1053 #else
1054         {"cache_max_mem_usage", "4096", &prefs_common.cache_max_mem_usage, P_INT,
1055          NULL, NULL, NULL},
1056         {"cache_min_keep_time", "0", &prefs_common.cache_min_keep_time, P_INT,
1057          NULL, NULL, NULL},
1058 #endif
1059         {"thread_by_subject_max_age", "10", &prefs_common.thread_by_subject_max_age,
1060         P_INT, NULL, NULL, NULL },
1061         {"last_opened_folder", "", &prefs_common.last_opened_folder,
1062         P_STRING, NULL, NULL, NULL },
1063         {"goto_last_folder_on_startup", "FALSE", &prefs_common.goto_last_folder_on_startup,
1064         P_BOOL, NULL, NULL, NULL },
1065         {"summary_quicksearch_sticky", "1", &prefs_common.summary_quicksearch_sticky, P_INT,
1066          NULL, NULL, NULL},
1067         {"summary_quicksearch_dynamic", "0", &prefs_common.summary_quicksearch_dynamic, P_INT,
1068          NULL, NULL, NULL},
1069         {"summary_quicksearch_autorun", "0", &prefs_common.summary_quicksearch_autorun, P_INT,
1070          NULL, NULL, NULL},
1071         {"statusbar_update_step", "10", &prefs_common.statusbar_update_step, P_INT,
1072          NULL, NULL, NULL},
1073         {"compose_no_markup", "FALSE", &prefs_common.compose_no_markup, P_BOOL,
1074          NULL, NULL, NULL},
1075         {"skip_ssl_cert_check", "FALSE", &prefs_common.skip_ssl_cert_check, P_BOOL,
1076          NULL, NULL, NULL},
1077         {"live_dangerously", "FALSE", &prefs_common.live_dangerously, P_BOOL,
1078          NULL, NULL, NULL},
1079         {"save_parts_readwrite", "FALSE", &prefs_common.save_parts_readwrite, P_BOOL,
1080          NULL, NULL, NULL},
1081         {"hide_quotes", "0", &prefs_common.hide_quotes, P_INT,
1082          NULL, NULL, NULL},
1083         {"unsafe_ssl_certs", "FALSE", &prefs_common.unsafe_ssl_certs, P_BOOL,
1084          NULL, NULL, NULL},
1085 #ifndef GENERIC_UMPC
1086         {"real_time_sync", "FALSE", &prefs_common.real_time_sync, P_BOOL,
1087          NULL, NULL, NULL},
1088 #else
1089         {"real_time_sync", "TRUE", &prefs_common.real_time_sync, P_BOOL,
1090          NULL, NULL, NULL},
1091 #endif
1092
1093         {"print_paper_type", NULL, &prefs_common.print_paper_type, P_STRING,
1094          NULL, NULL, NULL},
1095         {"print_paper_orientation", "0", &prefs_common.print_paper_orientation, P_INT,
1096          NULL, NULL, NULL},
1097         {"print_use_color", "0", &prefs_common.print_use_color, P_INT,
1098          NULL, NULL, NULL},
1099         {"print_use_collate", "0", &prefs_common.print_use_collate, P_INT,
1100          NULL, NULL, NULL},
1101         {"print_use_reverse", "0", &prefs_common.print_use_reverse, P_INT,
1102          NULL, NULL, NULL},
1103         {"print_use_duplex", "0", &prefs_common.print_use_duplex, P_INT,
1104          NULL, NULL, NULL},
1105         {"print_imgs", "1", &prefs_common.print_imgs, P_INT,
1106          NULL, NULL, NULL},
1107         {"print_previewwin_width", "600", &prefs_common.print_previewwin_width, P_INT,
1108          NULL, NULL, NULL},
1109         {"print_previewwin_height", "-1", &prefs_common.print_previewwin_height, P_INT,
1110          NULL, NULL, NULL},
1111         {"use_networkmanager", "TRUE", &prefs_common.use_networkmanager, P_BOOL,
1112          NULL, NULL, NULL},
1113         {"use_shred", "FALSE", &prefs_common.use_shred, P_BOOL,
1114          NULL, NULL, NULL},
1115
1116         {"two_line_vertical", "TRUE", &prefs_common.two_line_vert,
1117         P_BOOL, NULL, NULL, NULL },
1118
1119         {"inherit_folder_properties", "FALSE", &prefs_common.inherit_folder_props, P_BOOL,
1120          NULL, NULL, NULL},
1121
1122         {NULL, NULL, NULL, P_OTHER, NULL, NULL, NULL}
1123 };
1124
1125 /*
1126  * Read history list from the specified history file in the specified directory (subdir of rc_dir)
1127  * Fallback to default_list if history file is not found
1128  */
1129 GList *prefs_common_read_history_from_dir_with_defaults(const gchar *dirname, const gchar *history,
1130                                                                                                                           GList *default_list)
1131 {
1132         FILE *fp;
1133         gchar *path;
1134         gchar buf[PREFSBUFSIZE];
1135         GList *tmp = NULL;
1136
1137         if (dirname) {
1138                 path = g_strconcat(get_rc_dir(), G_DIR_SEPARATOR_S, dirname,
1139                                    G_DIR_SEPARATOR_S, history,
1140                                    NULL);
1141         } else {
1142         path = g_strconcat(get_rc_dir(), G_DIR_SEPARATOR_S, history,
1143                            NULL);
1144         }
1145         if ((fp = g_fopen(path, "rb")) == NULL) {
1146                 if (ENOENT != errno) FILE_OP_ERROR(path, "fopen");
1147                 g_free(path);
1148                 /* returns default list if set, otherwise NULL */
1149                 return default_list;
1150         }
1151         g_free(path);
1152         while (fgets(buf, sizeof(buf), fp) != NULL) {
1153                 g_strstrip(buf);
1154                 if (buf[0] == '\0') continue;
1155                 tmp = add_history(tmp, buf);
1156         }
1157         fclose(fp);
1158
1159         tmp = g_list_reverse(tmp);
1160
1161         return tmp;
1162 }
1163
1164 /*
1165  * Read history list from the specified history file in the specified directory (subdir of rc_dir)
1166  */
1167 static GList *prefs_common_read_history_from_dir(const gchar *dirname, const gchar *history) 
1168 {
1169         return prefs_common_read_history_from_dir_with_defaults(dirname, history, NULL);
1170 }
1171
1172 /*
1173  * Read history list from the specified history file
1174  */
1175 static GList *prefs_common_read_history(const gchar *history) 
1176 {
1177         return prefs_common_read_history_from_dir(NULL, history);
1178 }
1179
1180 void prefs_common_read_config(void)
1181 {
1182         gchar *rcpath;
1183         gchar *tmp;
1184
1185         rcpath = g_strconcat(get_rc_dir(), G_DIR_SEPARATOR_S, COMMON_RC, NULL);
1186         prefs_read_config(param, "Common", rcpath, NULL);
1187 #ifdef G_OS_WIN32
1188         prefs_read_config(param_os_specific, "CommonWin32", rcpath, NULL);
1189 #endif
1190
1191         g_free(rcpath);
1192
1193         tmp = g_strdup(gettext(prefs_common.date_format));
1194         g_free(prefs_common.date_format);
1195         prefs_common.date_format = tmp;
1196
1197         prefs_common.mime_open_cmd_history =
1198                 prefs_common_read_history(COMMAND_HISTORY);
1199         prefs_common.summary_quicksearch_history =
1200                 prefs_common_read_history(QUICKSEARCH_HISTORY);
1201         prefs_common.summary_search_from_history =
1202                 prefs_common_read_history(SUMMARY_SEARCH_FROM_HISTORY);
1203         prefs_common.summary_search_to_history =
1204                 prefs_common_read_history(SUMMARY_SEARCH_TO_HISTORY);
1205         prefs_common.summary_search_subject_history =
1206                 prefs_common_read_history(SUMMARY_SEARCH_SUBJECT_HISTORY);
1207         prefs_common.summary_search_body_history =
1208                 prefs_common_read_history(SUMMARY_SEARCH_BODY_HISTORY);
1209         prefs_common.summary_search_adv_condition_history =
1210                 prefs_common_read_history(SUMMARY_SEARCH_ADV_CONDITION_HISTORY);
1211         prefs_common.message_search_history =
1212                 prefs_common_read_history(MESSAGE_SEARCH_HISTORY);
1213
1214         prefs_common.addressbook_custom_attributes = addressbook_update_custom_attr_from_prefs();
1215
1216         colorlabel_update_colortable_from_prefs();
1217 }
1218
1219 #define TRY(func) \
1220 if (!(func)) \
1221 { \
1222         g_warning("failed to write\n"); \
1223         goto out;                       \
1224 } \
1225
1226 /*
1227  * Save history list to the specified history file in the specified directory (subdir of rc_dir)
1228  */
1229 static void prefs_common_save_history_to_dir(const gchar *dirname, const gchar *history, GList *list)
1230 {
1231         GList *cur;
1232         FILE *fp;
1233         gchar *path, *tmp_path;
1234
1235         if (dirname) {
1236                 path = g_strconcat(get_rc_dir(), G_DIR_SEPARATOR_S, dirname,
1237                                    G_DIR_SEPARATOR_S, history,
1238                                    NULL);
1239         } else {
1240         path = g_strconcat(get_rc_dir(), G_DIR_SEPARATOR_S, history,
1241                            NULL);
1242         }
1243         tmp_path = g_strconcat(path, ".tmp", NULL);
1244
1245         if ((fp = g_fopen(tmp_path, "wb")) == NULL) {
1246                 FILE_OP_ERROR(tmp_path, "fopen");
1247                 goto out;
1248         }
1249
1250         for (cur = list; cur != NULL; cur = cur->next) {
1251                 TRY(fputs((gchar *)cur->data, fp) != EOF &&
1252                     fputc('\n', fp) != EOF);
1253         }
1254
1255         if (fclose(fp) == EOF) {
1256                 FILE_OP_ERROR(tmp_path, "fclose");
1257                 fp = NULL;
1258                 goto out;
1259         }
1260         fp = NULL;
1261 #ifdef G_OS_WIN32
1262         claws_unlink(path);
1263 #endif
1264         if (g_rename(tmp_path, path) < 0) {
1265                 FILE_OP_ERROR(path, "rename");
1266                 goto out;
1267         }
1268
1269 out:
1270         if (fp)
1271                 fclose(fp);
1272         g_free(tmp_path);
1273         g_free(path);
1274 }
1275
1276 /*
1277  * Save history list to the specified history file
1278  */
1279 static void prefs_common_save_history(const gchar *history, GList *list)
1280 {
1281         prefs_common_save_history_to_dir(NULL, history, list);
1282 }
1283
1284 #undef TRY
1285
1286 void prefs_common_write_config(void)
1287 {
1288         prefs_write_config(param, "Common", COMMON_RC);
1289 #ifdef G_OS_WIN32
1290         prefs_write_config(param_os_specific, "CommonWin32", COMMON_RC);
1291 #endif
1292
1293         prefs_common_save_history(COMMAND_HISTORY, 
1294                 prefs_common.mime_open_cmd_history);
1295         prefs_common_save_history(QUICKSEARCH_HISTORY, 
1296                 prefs_common.summary_quicksearch_history);
1297         prefs_common_save_history(SUMMARY_SEARCH_FROM_HISTORY, 
1298                 prefs_common.summary_search_from_history);
1299         prefs_common_save_history(SUMMARY_SEARCH_TO_HISTORY, 
1300                 prefs_common.summary_search_to_history);
1301         prefs_common_save_history(SUMMARY_SEARCH_SUBJECT_HISTORY, 
1302                 prefs_common.summary_search_subject_history);
1303         prefs_common_save_history(SUMMARY_SEARCH_BODY_HISTORY, 
1304                 prefs_common.summary_search_body_history);
1305         prefs_common_save_history(SUMMARY_SEARCH_ADV_CONDITION_HISTORY, 
1306                 prefs_common.summary_search_adv_condition_history);
1307         prefs_common_save_history(MESSAGE_SEARCH_HISTORY, 
1308                 prefs_common.message_search_history);
1309
1310         prefs_common_save_history_to_dir(ADDRBOOK_DIR,
1311                 ADDRESSBOOK_CUSTOM_ATTRIBUTES, 
1312                 prefs_common.addressbook_custom_attributes);
1313 }
1314
1315 /* make a copy of string 'in' into buffer 'out'. un-escape \ sequences.
1316    both 'in' and 'out' must be non-NULL.
1317    'out' must be a pointer to a buffer whose size is at least equal
1318    to strlen(txt)+1, this buffer will get cleared. out's contents
1319    will always get set to a valid string, even if it's "".*/
1320 void pref_get_unescaped_pref(gchar *out, const gchar *in)
1321 {
1322         const gchar *i;
1323         gchar *o;
1324
1325         *out = '\0';
1326
1327         g_return_if_fail( in != NULL );
1328         g_return_if_fail( out != NULL );
1329
1330         i = in;
1331         o = out;
1332         memset(out, 0, strlen(in)+1);
1333         while (*i != '\0') {
1334                 if (*i == '\\' && *(i+1) == 'n') {
1335                         *o++ = '\n';
1336                         i++;
1337                 } else if (*i == '\\' && *(i+1) == 't') {
1338                         *o++ = '\t';
1339                         i++;
1340                 } else if (*i == '\\' && *(i+1) == '\\') {
1341                         *o++ = '\\';
1342                         i++;
1343                 } else {
1344                         *o++ = *i;
1345                 }
1346                 i++;
1347         }
1348         *o='\0';
1349 }
1350
1351 /* make a copy of string 'in' into buffer 'out'. escape \ sequences.
1352    both 'in' and 'out' must be non-NULL.
1353    'out' must be a pointer to a buffer whose size is at least equal
1354    to 2*strlen(txt)+1. out's contents will always get set to a valid
1355    string, even if it's "". */
1356 void pref_get_escaped_pref(gchar *out, const gchar *in)
1357 {
1358         const gchar *i;
1359         gchar *o;
1360
1361         *out = '\0';
1362
1363         g_return_if_fail( in != NULL );
1364         g_return_if_fail( out != NULL );
1365
1366         i = in;
1367         o = out;
1368         while (*i != '\0') {
1369                 if (*i == '\n') {
1370                         *o++ = '\\';
1371                         *o++ = 'n';
1372                 } else if (*i == '\t') {
1373                         *o++ = '\\';
1374                         *o++ = 't';
1375                 } else if (*i == '\\') {
1376                         *o++ = '\\';
1377                         *o++ = '\\';
1378                 } else {
1379                         *o++ = *i;
1380                 }
1381                 i++;
1382         }
1383         *o = '\0';
1384 }
1385                 
1386 /* set the contents of a textview widget from the internal \-escaped
1387   representation of a pref string. both txt and textview must be non-NULL. */
1388 void pref_set_textview_from_pref(GtkTextView *textview, const gchar *txt)
1389 {
1390         GtkTextBuffer *buffer;
1391         gchar *out = NULL;
1392
1393         g_return_if_fail( textview != NULL );
1394
1395         buffer = gtk_text_view_get_buffer(textview);
1396
1397         if (!txt) {
1398                 gtk_text_buffer_set_text(buffer, "", -1);
1399         } else {
1400                 out = malloc(strlen(txt)+1);
1401
1402                 pref_get_unescaped_pref(out, txt);
1403
1404                 gtk_text_buffer_set_text(buffer, out?out:"", -1);
1405                 g_free(out);
1406         }
1407 }
1408
1409 /* set the contents of a gtkentry widget from the internal \-escaped
1410   representation of a pref string. both txt and entry must be non-NULL. */
1411 void pref_set_entry_from_pref(GtkEntry *entry, const gchar *txt)
1412 {
1413         gchar *out = NULL;
1414
1415         g_return_if_fail( entry != NULL );
1416         if (!txt) {
1417                 gtk_entry_set_text(entry, "");
1418         } else {
1419                 out = malloc(strlen(txt)+1);
1420
1421                 pref_get_unescaped_pref(out, txt);
1422
1423                 gtk_entry_set_text(entry, out?out:"");
1424                 g_free(out);
1425         }
1426 }
1427
1428 /* get the \-escaped internal representation of a pref from the contents of
1429    a textview widget. textview must be non-NULL. */
1430 gchar *pref_get_pref_from_textview(GtkTextView *textview) 
1431 {
1432         GtkTextBuffer *buffer;
1433         GtkTextIter start, end;
1434         gchar *out, *tmp;
1435         
1436         g_return_val_if_fail( textview != NULL, "" );
1437
1438         buffer = gtk_text_view_get_buffer(textview);
1439         gtk_text_buffer_get_start_iter(buffer, &start);
1440         gtk_text_buffer_get_iter_at_offset(buffer, &end, -1);
1441         tmp = gtk_text_buffer_get_text(buffer, &start, &end, FALSE);
1442         out = malloc(2*strlen(tmp)+1);
1443         
1444         pref_get_escaped_pref(out, tmp);
1445         g_free(tmp);
1446
1447         return out?out:"";
1448 }
1449
1450 /* get the \-escaped internal representation of a pref from the contents of
1451    a gtkentry widget. entry must be non-NULL. */
1452 gchar *pref_get_pref_from_entry(GtkEntry *entry) 
1453 {
1454         gchar *out, *tmp;
1455
1456         g_return_val_if_fail( entry != NULL, "" );
1457
1458         tmp = gtk_editable_get_chars(GTK_EDITABLE(entry), 0, -1);
1459         out = malloc(2*strlen(tmp)+1);
1460
1461         pref_get_escaped_pref(out, tmp);
1462         g_free(tmp);
1463
1464         return out?out:"";
1465 }
1466
1467 /* ugly hack to be able to get this pref from ssl_certificate.c */
1468 gboolean prefs_common_unsafe_ssl_certs(void)
1469 {
1470         return prefs_common.unsafe_ssl_certs;
1471 }
1472
1473 gboolean prefs_common_enable_log_standard(void)
1474 {
1475         return prefs_common.enable_log_standard;
1476 }
1477
1478 gboolean prefs_common_enable_log_warning(void)
1479 {
1480         return prefs_common.enable_log_warning;
1481 }
1482 gboolean prefs_common_enable_log_error(void)
1483 {
1484         return prefs_common.enable_log_error;
1485 }
1486 gboolean prefs_common_enable_log_status(void)
1487 {
1488         return prefs_common.enable_log_status;
1489 }
1490
1491 #ifdef MAEMO
1492 const gchar *prefs_common_get_data_root(void)
1493 {
1494         if (prefs_common.data_root && *prefs_common.data_root)
1495                 return prefs_common.data_root;
1496         else
1497                 return NULL;
1498 }
1499 #endif
1500 /**
1501    return the translated name of a header, if the translate_header option is
1502    set, otherwise return the untranslated header name (header_name itself).
1503    this function is provided for convenience, it's an interface to
1504    prefs_common.trans_hdr.
1505    works with header names either with or without trailing colon, provided
1506    that gettext found such header name in the sources (they should all be
1507    found in src/gtk/headers.h anyway).
1508 */
1509 const gchar *prefs_common_translated_header_name(const gchar *header_name)
1510 {
1511         if (header_name == NULL || *header_name == '\0')
1512                 return header_name;
1513
1514         return prefs_common.trans_hdr ? gettext(header_name) : header_name;
1515 }
1516
1517 const gchar *prefs_common_get_uri_cmd(void)
1518 {
1519         gchar *tmp = NULL;
1520         
1521         if (!prefs_common.cmds_use_system_default)
1522                 return prefs_common.uri_cmd;
1523         
1524         tmp = g_find_program_in_path("xdg-open");
1525         if (!tmp) 
1526                 return prefs_common.uri_cmd;
1527         
1528         g_free(tmp);
1529         return "xdg-open %s";
1530 }
1531
1532 const gchar *prefs_common_get_ext_editor_cmd(void)
1533 {
1534         return prefs_common.ext_editor_cmd;
1535 #if 0 /* we should do that, but it detaches the editor and breaks
1536          compose.c's external composition. */
1537         gchar *tmp = NULL;
1538         
1539         if (!prefs_common.cmds_use_system_default)
1540                 return prefs_common.ext_editor_cmd;
1541         
1542         tmp = g_find_program_in_path("xdg-open");
1543         if (!tmp) 
1544                 return prefs_common.ext_editor_cmd;
1545         
1546         g_free(tmp);
1547         return "xdg-open %s";
1548 #endif 
1549 }
1550
1551 gboolean prefs_common_get_use_shred(void)
1552 {
1553         return prefs_common.use_shred;
1554 }