2009-03-17 [colin] 3.7.1cvs18
[claws.git] / src / prefs_common.c
1 /*
2  * Sylpheed -- a GTK+ based, lightweight, and fast e-mail client
3  * Copyright (C) 1999-2009 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         {"ext_editor_command", "notepad %s",
125          &prefs_common.ext_editor_cmd, P_STRING, NULL, NULL, NULL},
126
127         {NULL, NULL, NULL, P_OTHER, NULL, NULL, NULL}
128 };
129 #else
130 #  define SPECIFIC_PREFS prefs_common
131 #endif
132
133 /*
134    parameter name, default value, pointer to the prefs variable, data type,
135    pointer to the widget pointer,
136    pointer to the function for data setting,
137    pointer to the function for widget setting
138  */
139
140 static PrefParam param[] = {
141 #ifdef MAEMO
142         {"data_root", "", &prefs_common.data_root, P_STRING,
143          NULL, NULL, NULL},
144 #endif
145         /* Receive */
146         {"use_ext_inc", "FALSE", &prefs_common.use_extinc, P_BOOL,
147          NULL, NULL, NULL},
148         {"ext_inc_path", DEFAULT_INC_PATH, &SPECIFIC_PREFS.extinc_cmd, P_STRING,
149          NULL, NULL, NULL},
150
151         {"autochk_newmail", "FALSE", &prefs_common.autochk_newmail, P_BOOL,
152          NULL, NULL, NULL},
153         {"autochk_interval", "10", &prefs_common.autochk_itv, P_INT,
154          NULL, NULL, NULL},
155         {"check_on_startup", "FALSE", &prefs_common.chk_on_startup, P_BOOL,
156          NULL, NULL, NULL},
157         {"open_inbox_on_inc", "FALSE", &prefs_common.open_inbox_on_inc,
158          P_BOOL, NULL, NULL, NULL},
159         {"scan_all_after_inc", "FALSE", &prefs_common.scan_all_after_inc,
160          P_BOOL, NULL, NULL, NULL},
161         {"newmail_notify_manu", "FALSE", &prefs_common.newmail_notify_manu,
162          P_BOOL, NULL, NULL, NULL},
163         {"newmail_notify_auto", "FALSE", &prefs_common.newmail_notify_auto,
164         P_BOOL, NULL, NULL, NULL},
165         {"newmail_notify_cmd", "", &SPECIFIC_PREFS.newmail_notify_cmd, P_STRING,
166          NULL, NULL, NULL},
167 #ifdef MAEMO
168         {"maemo_show_led", "TRUE", &prefs_common.maemo_show_led, P_BOOL,
169          NULL, NULL, NULL},
170         {"maemo_play_sound", "FALSE", &prefs_common.maemo_play_sound, P_BOOL,
171          NULL, NULL, NULL},
172         {"maemo_show_banner", "FALSE", &prefs_common.maemo_show_banner, P_BOOL,
173          NULL, NULL, NULL},
174 #endif
175         {"receive_dialog_mode", "2", &prefs_common.recv_dialog_mode, P_ENUM,
176          NULL, NULL, NULL},
177         {"receivewin_width", "460", &prefs_common.receivewin_width, P_INT,
178          NULL, NULL, NULL},
179         {"receivewin_height", "-1", &prefs_common.receivewin_height, P_INT,
180          NULL, NULL, NULL},
181         {"no_receive_error_panel", "FALSE", &prefs_common.no_recv_err_panel,
182          P_BOOL, NULL, NULL, NULL},
183         {"close_receive_dialog", "TRUE", &prefs_common.close_recv_dialog,
184          P_BOOL, NULL, NULL, NULL},
185  
186         /* Send */
187         {"save_message", "TRUE", &prefs_common.savemsg, P_BOOL,
188          NULL, NULL, NULL},
189         {"confirm_send_queued_messages", "FALSE", &prefs_common.confirm_send_queued_messages,
190          P_BOOL, NULL, NULL, NULL},
191 #ifndef GENERIC_UMPC
192         {"send_dialog_mode", "0", &prefs_common.send_dialog_invisible, P_BOOL,
193          NULL, NULL, NULL},
194 #else
195         {"send_dialog_mode", "1", &prefs_common.send_dialog_invisible, P_BOOL,
196          NULL, NULL, NULL},
197 #endif
198         {"sendwin_width", "460", &prefs_common.sendwin_width, P_INT,
199          NULL, NULL, NULL},
200         {"sendwin_height", "-1", &prefs_common.sendwin_height, P_INT,
201          NULL, NULL, NULL},
202
203         {"outgoing_charset", CS_AUTO, &prefs_common.outgoing_charset, P_STRING,
204          NULL, NULL, NULL},
205         {"encoding_method", "0", &prefs_common.encoding_method, P_ENUM,
206          NULL, NULL, NULL},
207         {"outgoing_fallback_to_ascii", "TRUE", &prefs_common.outgoing_fallback_to_ascii, P_BOOL,
208          NULL, NULL, NULL},
209
210         {"allow_jisx0201_kana", "FALSE", &prefs_common.allow_jisx0201_kana,
211          P_BOOL, NULL, NULL, NULL},
212
213         /* Compose */
214         {"auto_ext_editor", "FALSE", &prefs_common.auto_exteditor, P_BOOL,
215          NULL, NULL, NULL},
216         {"forward_as_attachment", "FALSE", &prefs_common.forward_as_attachment,
217          P_BOOL, NULL, NULL, NULL},
218         {"redirect_keep_from", "FALSE",
219          &prefs_common.redirect_keep_from, P_BOOL,
220          NULL, NULL, NULL},
221         {"undo_level", "50", &prefs_common.undolevels, P_INT,
222          NULL, NULL, NULL},
223         {"compose_with_format", "FALSE", &prefs_common.compose_with_format, P_BOOL,
224          NULL, NULL, NULL},
225         {"compose_subject_format", "",
226          &prefs_common.compose_subject_format, P_STRING, NULL, NULL, NULL},
227         {"compose_body_format", N_("Hello,\\n"),
228          &prefs_common.compose_body_format, P_STRING, NULL, NULL, NULL},
229
230         {"linewrap_length", "72", &prefs_common.linewrap_len, P_INT,
231          NULL, NULL, NULL},
232         {"linewrap_quotation", "TRUE", &prefs_common.linewrap_quote, P_BOOL,
233          NULL, NULL, NULL},
234         {"linewrap_pastes", "TRUE", &prefs_common.linewrap_pastes, P_BOOL,
235          NULL, NULL, NULL},
236         {"primary_paste_unselects", "FALSE", &prefs_common.primary_paste_unselects, P_BOOL,
237          NULL, NULL, NULL},
238         {"linewrap_auto", "TRUE", &prefs_common.autowrap, P_BOOL,
239          NULL, NULL, NULL},
240         {"auto_indent", "TRUE", &prefs_common.auto_indent, P_BOOL,
241          NULL, NULL, NULL},
242         {"autosave", "TRUE", &prefs_common.autosave,
243          P_BOOL, NULL, NULL, NULL},
244         {"autosave_length", "50", &prefs_common.autosave_length, P_INT,
245          NULL, NULL, NULL},
246
247         {"enable_aspell", "TRUE", &prefs_common.enable_aspell, P_BOOL,
248          NULL, NULL, NULL},
249         {"dictionary",  "", &prefs_common.dictionary, P_STRING,
250          NULL, NULL, NULL},
251         {"alt_dictionary",  "", &prefs_common.alt_dictionary, P_STRING,
252          NULL, NULL, NULL},
253         {"use_alternate_dict", "FALSE", &prefs_common.use_alternate, P_BOOL,
254          NULL, NULL, NULL},
255         {"check_while_typing", "TRUE", &prefs_common.check_while_typing, P_BOOL,
256          NULL, NULL, NULL},
257         {"recheck_when_changing_dict", "TRUE", &prefs_common.recheck_when_changing_dict,
258          P_BOOL, NULL, NULL, NULL},
259         {"misspelled_color", "#ff0000", &prefs_common.misspelled_col, P_COLOR,
260          NULL, NULL, NULL},
261         {"use_both_dicts", "FALSE", &prefs_common.use_both_dicts, P_BOOL,
262          NULL, NULL, NULL},
263
264         {"reply_with_quote", "TRUE", &prefs_common.reply_with_quote, P_BOOL,
265          NULL, NULL, NULL},
266         {"compose_dnd_insert_or_attach", "0", &prefs_common.compose_dnd_mode, P_ENUM,
267          NULL, NULL, NULL},
268
269         /* Account autoselection */
270         {"reply_account_autoselect", "TRUE",
271          &prefs_common.reply_account_autosel, P_BOOL,
272          NULL, NULL, NULL},
273         {"forward_account_autoselect", "TRUE",
274          &prefs_common.forward_account_autosel, P_BOOL,
275          NULL, NULL, NULL},
276         {"reedit_account_autoselect", "TRUE",
277          &prefs_common.reedit_account_autosel, P_BOOL,
278          NULL, NULL, NULL},
279
280         {"default_reply_list", "TRUE", &prefs_common.default_reply_list, P_BOOL,
281          NULL, NULL, NULL},
282
283 #ifndef GENERIC_UMPC
284         {"show_ruler", "TRUE", &prefs_common.show_ruler, P_BOOL,
285          NULL, NULL, NULL},
286 #else
287         {"show_ruler", "FALSE", &prefs_common.show_ruler, P_BOOL,
288          NULL, NULL, NULL},
289 #endif
290
291         /* Quote */
292         {"reply_quote_mark", "> ", &prefs_common.quotemark, P_STRING,
293          NULL, NULL, NULL},
294         {"reply_quote_format", N_("On %d\\n%f wrote:\\n\\n%q\\n%X"),
295          &prefs_common.quotefmt, P_STRING, NULL, NULL, NULL},
296
297         {"forward_quote_mark", "> ", &prefs_common.fw_quotemark, P_STRING,
298          NULL, NULL, NULL},
299         {"forward_quote_format",
300          N_("\\n\\nBegin forwarded message:\\n\\n"
301          "?d{Date: %d\\n}?f{From: %f\\n}?t{To: %t\\n}?c{Cc: %c\\n}"
302          "?n{Newsgroups: %n\\n}?s{Subject: %s\\n}\\n\\n%M"),
303          &prefs_common.fw_quotefmt, P_STRING,
304          NULL, NULL, NULL},
305         {"quote_chars", ">", &prefs_common.quote_chars, P_STRING,
306          NULL, NULL, NULL},
307
308         /* Display */
309         /* Obsolete fonts. For coexisting with Gtk+-1.2 version */
310         {"widget_font",         NULL,
311           &prefs_common.widgetfont_gtk1,        P_STRING, NULL, NULL, NULL},
312         {"message_font",        "-misc-fixed-medium-r-normal--14-*-*-*-*-*-*-*",
313          &prefs_common.textfont_gtk1,           P_STRING, NULL, NULL, NULL},
314         {"small_font",          "-*-helvetica-medium-r-normal--10-*-*-*-*-*-*-*",
315           &prefs_common.smallfont_gtk1,         P_STRING, NULL, NULL, NULL},
316         {"bold_font",           "-*-helvetica-bold-r-normal--12-*-*-*-*-*-*-*",
317           &prefs_common.boldfont_gtk1,          P_STRING, NULL, NULL, NULL},
318         {"normal_font",         "-*-helvetica-medium-r-normal--12-*-*-*-*-*-*-*",
319           &prefs_common.normalfont_gtk1,        P_STRING, NULL, NULL, NULL},
320
321         /* new fonts */
322 #ifndef GENERIC_UMPC
323         {"widget_font_gtk2",    NULL,
324           &SPECIFIC_PREFS.widgetfont,           P_STRING, NULL, NULL, NULL},
325         {"message_font_gtk2",   "Monospace 9",
326          &SPECIFIC_PREFS.textfont,                      P_STRING, NULL, NULL, NULL},
327         {"print_font_gtk2",     "Monospace 9",
328          &SPECIFIC_PREFS.printfont,             P_STRING, NULL, NULL, NULL},
329         {"small_font_gtk2",     "Sans 9",
330           &SPECIFIC_PREFS.smallfont,            P_STRING, NULL, NULL, NULL},
331         {"normal_font_gtk2",    "Sans 9",
332           &SPECIFIC_PREFS.normalfont,           P_STRING, NULL, NULL, NULL},
333         {"bold_font_gtk2",      "Sans Bold 9",
334           &SPECIFIC_PREFS.boldfont,             P_STRING, NULL, NULL, NULL},
335 #else
336         {"widget_font_gtk2",    NULL,
337           &SPECIFIC_PREFS.widgetfont,           P_STRING, NULL, NULL, NULL},
338         {"message_font_gtk2",   "Monospace 8",
339          &SPECIFIC_PREFS.textfont,                      P_STRING, NULL, NULL, NULL},
340         {"print_font_gtk2",     "Monospace 8",
341          &SPECIFIC_PREFS.printfont,             P_STRING, NULL, NULL, NULL},
342         {"small_font_gtk2",     "Sans 8",
343           &SPECIFIC_PREFS.smallfont,            P_STRING, NULL, NULL, NULL},
344         {"normal_font_gtk2",    "Sans 8",
345           &SPECIFIC_PREFS.normalfont,           P_STRING, NULL, NULL, NULL},
346         {"bold_font_gtk2",      "Sans Bold 8",
347           &SPECIFIC_PREFS.boldfont,             P_STRING, NULL, NULL, NULL},
348 #endif
349
350         {"use_different_print_font", "FALSE", &prefs_common.use_different_print_font, P_BOOL,
351          NULL, NULL, NULL},
352         {"derive_from_normal_font", "TRUE", &prefs_common.derive_from_normal_font, P_BOOL,
353          NULL, NULL, NULL},
354
355         /* custom colors */
356         {"custom_color1", "#ff9900", &prefs_common.custom_colorlabel[0].color, P_COLOR,
357          NULL, NULL, NULL},
358         {"custom_colorlabel1", N_("Orange"), &prefs_common.custom_colorlabel[0].label, P_STRING,
359          NULL, NULL, NULL},
360         {"custom_color2", "#ff0000", &prefs_common.custom_colorlabel[1].color, P_COLOR,
361          NULL, NULL, NULL},
362         {"custom_colorlabel2", N_("Red"), &prefs_common.custom_colorlabel[1].label, P_STRING,
363          NULL, NULL, NULL},
364         {"custom_color3", "#ff66ff", &prefs_common.custom_colorlabel[2].color, P_COLOR,
365          NULL, NULL, NULL},
366         {"custom_colorlabel3", N_("Pink"), &prefs_common.custom_colorlabel[2].label, P_STRING,
367          NULL, NULL, NULL},
368         {"custom_color4", "#00ccff", &prefs_common.custom_colorlabel[3].color, P_COLOR,
369          NULL, NULL, NULL},
370         {"custom_colorlabel4", N_("Sky blue"), &prefs_common.custom_colorlabel[3].label, P_STRING,
371          NULL, NULL, NULL},
372         {"custom_color5", "#0000ff", &prefs_common.custom_colorlabel[4].color, P_COLOR,
373          NULL, NULL, NULL},
374         {"custom_colorlabel5", N_("Blue"), &prefs_common.custom_colorlabel[4].label, P_STRING,
375          NULL, NULL, NULL},
376         {"custom_color6", "#009900", &prefs_common.custom_colorlabel[5].color, P_COLOR,
377          NULL, NULL, NULL},
378         {"custom_colorlabel6", N_("Green"), &prefs_common.custom_colorlabel[5].label, P_STRING,
379          NULL, NULL, NULL},
380         {"custom_color7", "#663333", &prefs_common.custom_colorlabel[6].color, P_COLOR,
381          NULL, NULL, NULL},
382         {"custom_colorlabel7", N_("Brown"), &prefs_common.custom_colorlabel[6].label, P_STRING,
383          NULL, NULL, NULL},
384         {"custom_color8", "#aaaaaa", &prefs_common.custom_colorlabel[7].color, P_COLOR,
385          NULL, NULL, NULL},
386         {"custom_colorlabel8", N_("Grey"), &prefs_common.custom_colorlabel[7].label, P_STRING,
387          NULL, NULL, NULL},
388         {"custom_color9", "#c07254", &prefs_common.custom_colorlabel[8].color, P_COLOR,
389          NULL, NULL, NULL},
390         {"custom_colorlabel9", N_("Light brown"), &prefs_common.custom_colorlabel[8].label, P_STRING,
391          NULL, NULL, NULL},
392         {"custom_color10", "#c00000", &prefs_common.custom_colorlabel[9].color, P_COLOR,
393          NULL, NULL, NULL},
394         {"custom_colorlabel10", N_("Dark red"), &prefs_common.custom_colorlabel[9].label, P_STRING,
395          NULL, NULL, NULL},
396         {"custom_color11", "#cc1074", &prefs_common.custom_colorlabel[10].color, P_COLOR,
397          NULL, NULL, NULL},
398         {"custom_colorlabel11", N_("Dark pink"), &prefs_common.custom_colorlabel[10].label, P_STRING,
399          NULL, NULL, NULL},
400         {"custom_color12", "#5094cd", &prefs_common.custom_colorlabel[11].color, P_COLOR,
401          NULL, NULL, NULL},
402         {"custom_colorlabel12", N_("Steel blue"), &prefs_common.custom_colorlabel[11].label, P_STRING,
403          NULL, NULL, NULL},
404         {"custom_color13", "#ffd500", &prefs_common.custom_colorlabel[12].color, P_COLOR,
405          NULL, NULL, NULL},
406         {"custom_colorlabel13", N_("Gold"), &prefs_common.custom_colorlabel[12].label, P_STRING,
407          NULL, NULL, NULL},
408         {"custom_color14", "#00d800", &prefs_common.custom_colorlabel[13].color, P_COLOR,
409          NULL, NULL, NULL},
410         {"custom_colorlabel14", N_("Bright green"), &prefs_common.custom_colorlabel[13].label, P_STRING,
411          NULL, NULL, NULL},
412         {"custom_color15", "#c060c0", &prefs_common.custom_colorlabel[14].color, P_COLOR,
413          NULL, NULL, NULL},
414         {"custom_colorlabel15", N_("Magenta"), &prefs_common.custom_colorlabel[14].label, P_STRING,
415          NULL, NULL, NULL},
416
417         /* image viewer */
418         {"display_image", "TRUE", &prefs_common.display_img, P_BOOL,
419          NULL, NULL, NULL},
420         {"resize_image", "TRUE", &prefs_common.resize_img, P_BOOL,
421          NULL, NULL, NULL},
422         {"inline_image", "TRUE", &prefs_common.inline_img, P_BOOL,
423          NULL, NULL, NULL},
424
425         {"display_folder_unread_num", "0",
426          &prefs_common.display_folder_unread, P_INT,
427          NULL, NULL, NULL},
428         {"newsgroup_abbrev_len", "16",
429          &prefs_common.ng_abbrev_len, P_INT,
430          NULL, NULL, NULL},
431
432         {"translate_header", "FALSE", &prefs_common.trans_hdr, P_BOOL,
433          NULL, NULL, NULL},
434
435         /* Display: Summary View */
436         {"use_address_book", "FALSE", &prefs_common.use_addr_book, P_BOOL,
437          NULL, NULL, NULL},
438         {"thread_by_subject", "TRUE", &prefs_common.thread_by_subject, P_BOOL,
439          NULL, NULL, NULL},
440         {"date_format", N_("%y/%m/%d(%a) %H:%M"), &prefs_common.date_format,
441          P_STRING, NULL, NULL, NULL},
442
443         {"bold_unread", "TRUE", &prefs_common.bold_unread, P_BOOL,
444          NULL, NULL, NULL},
445
446         {"enable_thread", "TRUE", &prefs_common.enable_thread, P_BOOL,
447          NULL, NULL, NULL},
448 #ifndef GENERIC_UMPC
449         {"toolbar_style", "3", &prefs_common.toolbar_style, P_ENUM,
450          NULL, NULL, NULL},
451 #else
452         {"toolbar_style", "1", &prefs_common.toolbar_style, P_ENUM,
453          NULL, NULL, NULL},
454 #endif
455         {"toolbar_detachable", "FALSE", &prefs_common.toolbar_detachable, P_BOOL,
456          NULL, NULL, NULL},
457         {"show_col_headers", "TRUE", &prefs_common.show_col_headers, P_BOOL,
458          NULL, NULL, NULL},
459 #ifndef GENERIC_UMPC
460         {"show_statusbar", "TRUE", &prefs_common.show_statusbar, P_BOOL,
461          NULL, NULL, NULL},
462         {"show_searchbar", "TRUE", &prefs_common.show_searchbar, P_BOOL,
463          NULL, NULL, NULL},
464 #else
465         {"show_statusbar", "FALSE", &prefs_common.show_statusbar, P_BOOL,
466          NULL, NULL, NULL},
467         {"show_searchbar", "FALSE", &prefs_common.show_searchbar, P_BOOL,
468          NULL, NULL, NULL},
469 #endif
470
471         {"summary_col_show_mark", "TRUE",
472          &prefs_common.summary_col_visible[S_COL_MARK], P_BOOL, NULL, NULL, NULL},
473         {"summary_col_show_unread", "TRUE",
474          &prefs_common.summary_col_visible[S_COL_STATUS], P_BOOL, NULL, NULL, NULL},
475         {"summary_col_show_subject", "TRUE",
476          &prefs_common.summary_col_visible[S_COL_SUBJECT], P_BOOL, NULL, NULL, NULL},
477         {"summary_col_show_from", "TRUE",
478          &prefs_common.summary_col_visible[S_COL_FROM], P_BOOL, NULL, NULL, NULL},
479         {"summary_col_show_to", "FALSE",
480          &prefs_common.summary_col_visible[S_COL_TO], P_BOOL, NULL, NULL, NULL},
481         {"summary_col_show_date", "TRUE",
482          &prefs_common.summary_col_visible[S_COL_DATE], P_BOOL, NULL, NULL, NULL},
483         {"summary_col_show_mime", "TRUE",
484          &prefs_common.summary_col_visible[S_COL_MIME], P_BOOL, NULL, NULL, NULL},
485         {"summary_col_show_size", "TRUE",
486          &prefs_common.summary_col_visible[S_COL_SIZE], P_BOOL, NULL, NULL, NULL},
487         {"summary_col_show_number", "FALSE",
488          &prefs_common.summary_col_visible[S_COL_NUMBER], P_BOOL, NULL, NULL, NULL},
489         {"summary_col_show_score", "FALSE",
490          &prefs_common.summary_col_visible[S_COL_SCORE], P_BOOL, NULL, NULL, NULL},
491         {"summary_col_show_locked", "FALSE",
492          &prefs_common.summary_col_visible[S_COL_LOCKED], P_BOOL, NULL, NULL, NULL},
493         {"summary_col_show_tags", "FALSE",
494          &prefs_common.summary_col_visible[S_COL_TAGS], P_BOOL, NULL, NULL, NULL},
495
496         {"summary_col_pos_mark", "0",
497           &prefs_common.summary_col_pos[S_COL_MARK], P_INT, NULL, NULL, NULL},
498         {"summary_col_pos_unread", "1",
499           &prefs_common.summary_col_pos[S_COL_STATUS], P_INT, NULL, NULL, NULL},
500         {"summary_col_pos_mime", "2",
501           &prefs_common.summary_col_pos[S_COL_MIME], P_INT, NULL, NULL, NULL},
502         {"summary_col_pos_subject", "3",
503           &prefs_common.summary_col_pos[S_COL_SUBJECT], P_INT, NULL, NULL, NULL},
504         {"summary_col_pos_from", "4",
505           &prefs_common.summary_col_pos[S_COL_FROM], P_INT, NULL, NULL, NULL},
506         {"summary_col_pos_date", "5",
507           &prefs_common.summary_col_pos[S_COL_DATE], P_INT, NULL, NULL, NULL},
508         {"summary_col_pos_size", "6",
509           &prefs_common.summary_col_pos[S_COL_SIZE], P_INT, NULL, NULL, NULL},
510         {"summary_col_pos_number", "7",
511           &prefs_common.summary_col_pos[S_COL_NUMBER], P_INT, NULL, NULL, NULL},
512         {"summary_col_pos_score", "8",
513          &prefs_common.summary_col_pos[S_COL_SCORE], P_INT, NULL, NULL, NULL},
514         {"summary_col_pos_locked", "9",
515          &prefs_common.summary_col_pos[S_COL_LOCKED], P_INT, NULL, NULL, NULL},
516         {"summary_col_pos_to", "10",
517           &prefs_common.summary_col_pos[S_COL_TO], P_INT, NULL, NULL, NULL},
518         {"summary_col_pos_tags", "11",
519           &prefs_common.summary_col_pos[S_COL_TAGS], P_INT, NULL, NULL, NULL},
520
521         {"summary_col_size_mark", "10",
522          &prefs_common.summary_col_size[S_COL_MARK], P_INT, NULL, NULL, NULL},
523         {"summary_col_size_unread", "13",
524          &prefs_common.summary_col_size[S_COL_STATUS], P_INT, NULL, NULL, NULL},
525         {"summary_col_size_mime", "10",
526          &prefs_common.summary_col_size[S_COL_MIME], P_INT, NULL, NULL, NULL},
527 #ifndef GENERIC_UMPC
528         {"summary_col_size_subject", "200",
529          &prefs_common.summary_col_size[S_COL_SUBJECT], P_INT, NULL, NULL, NULL},
530         {"summary_col_size_from", "120",
531          &prefs_common.summary_col_size[S_COL_FROM], P_INT, NULL, NULL, NULL},
532         {"summary_col_size_to", "120",
533          &prefs_common.summary_col_size[S_COL_TO], P_INT, NULL, NULL, NULL},
534 #else
535         {"summary_col_size_subject", "300",
536          &prefs_common.summary_col_size[S_COL_SUBJECT], P_INT, NULL, NULL, NULL},
537         {"summary_col_size_from", "150",
538          &prefs_common.summary_col_size[S_COL_FROM], P_INT, NULL, NULL, NULL},
539         {"summary_col_size_to", "150",
540          &prefs_common.summary_col_size[S_COL_TO], P_INT, NULL, NULL, NULL},
541
542 #endif
543         {"summary_col_size_date", "118",
544          &prefs_common.summary_col_size[S_COL_DATE], P_INT, NULL, NULL, NULL},
545         {"summary_col_size_size", "45",
546          &prefs_common.summary_col_size[S_COL_SIZE], P_INT, NULL, NULL, NULL},
547         {"summary_col_size_number", "40",
548          &prefs_common.summary_col_size[S_COL_NUMBER], P_INT, NULL, NULL, NULL},
549         {"summary_col_size_score", "40",
550          &prefs_common.summary_col_size[S_COL_SCORE], P_INT, NULL, NULL, NULL},
551         {"summary_col_size_locked", "13",
552          &prefs_common.summary_col_size[S_COL_LOCKED], P_INT, NULL, NULL, NULL},
553         {"summary_col_size_tags", "150",
554          &prefs_common.summary_col_size[S_COL_TAGS], P_INT, NULL, NULL, NULL},
555
556         /* Widget size */
557         {"folderwin_x", "16", &prefs_common.folderwin_x, P_INT,
558          NULL, NULL, NULL},
559         {"folderwin_y", "16", &prefs_common.folderwin_y, P_INT,
560          NULL, NULL, NULL},
561         {"folderview_width", "270", &prefs_common.folderview_width, P_INT,
562          NULL, NULL, NULL},
563         {"folderview_height", "450", &prefs_common.folderview_height, P_INT,
564          NULL, NULL, NULL},
565         {"folderview_visible", "TRUE", &prefs_common.folderview_visible, P_BOOL,
566          NULL, NULL, NULL},
567
568         {"folder_col_show_folder", "TRUE",
569          &prefs_common.folder_col_visible[F_COL_FOLDER], P_BOOL, NULL, NULL, NULL},
570         {"folder_col_show_new", "TRUE",
571          &prefs_common.folder_col_visible[F_COL_NEW], P_BOOL, NULL, NULL, NULL},
572         {"folder_col_show_unread", "TRUE",
573          &prefs_common.folder_col_visible[F_COL_UNREAD], P_BOOL, NULL, NULL, NULL},
574         {"folder_col_show_total", "TRUE",
575          &prefs_common.folder_col_visible[F_COL_TOTAL], P_BOOL, NULL, NULL, NULL},
576
577         {"folder_col_pos_folder", "0",
578          &prefs_common.folder_col_pos[F_COL_FOLDER], P_INT, NULL, NULL, NULL},
579         {"folder_col_pos_new", "1",
580          &prefs_common.folder_col_pos[F_COL_NEW], P_INT, NULL, NULL, NULL},
581         {"folder_col_pos_unread", "2",
582          &prefs_common.folder_col_pos[F_COL_UNREAD], P_INT, NULL, NULL, NULL},
583         {"folder_col_pos_total", "3",
584          &prefs_common.folder_col_pos[F_COL_TOTAL], P_INT, NULL, NULL, NULL},
585
586 #ifndef GENERIC_UMPC
587         {"folder_col_size_folder", "120",
588          &prefs_common.folder_col_size[F_COL_FOLDER], P_INT, NULL, NULL, NULL},
589         {"folder_col_size_new", "32",
590          &prefs_common.folder_col_size[F_COL_NEW], P_INT, NULL, NULL, NULL},
591         {"folder_col_size_unread", "32",
592          &prefs_common.folder_col_size[F_COL_UNREAD], P_INT, NULL, NULL, NULL},
593         {"folder_col_size_total", "32",
594          &prefs_common.folder_col_size[F_COL_TOTAL], P_INT, NULL, NULL, NULL},
595 #else
596         {"folder_col_size_folder", "400",
597          &prefs_common.folder_col_size[F_COL_FOLDER], P_INT, NULL, NULL, NULL},
598         {"folder_col_size_new", "32",
599          &prefs_common.folder_col_size[F_COL_NEW], P_INT, NULL, NULL, NULL},
600         {"folder_col_size_unread", "32",
601          &prefs_common.folder_col_size[F_COL_UNREAD], P_INT, NULL, NULL, NULL},
602         {"folder_col_size_total", "32",
603          &prefs_common.folder_col_size[F_COL_TOTAL], P_INT, NULL, NULL, NULL},
604 #endif
605         {"summaryview_width", "500", &prefs_common.summaryview_width, P_INT,
606          NULL, NULL, NULL},
607         {"summaryview_height", "244", &prefs_common.summaryview_height, P_INT,
608          NULL, NULL, NULL},
609
610         {"main_messagewin_x", "256", &prefs_common.main_msgwin_x, P_INT,
611          NULL, NULL, NULL},
612         {"main_messagewin_y", "210", &prefs_common.main_msgwin_y, P_INT,
613          NULL, NULL, NULL},
614         {"messageview_width", "500", &prefs_common.msgview_width, P_INT,
615          NULL, NULL, NULL},
616         {"messageview_height", "213", &prefs_common.msgview_height, P_INT,
617          NULL, NULL, NULL},
618         {"messageview_visible", "TRUE", &prefs_common.msgview_visible, P_BOOL,
619          NULL, NULL, NULL},
620
621         {"mainview_x", "64", &prefs_common.mainview_x, P_INT,
622          NULL, NULL, NULL},
623         {"mainview_y", "64", &prefs_common.mainview_y, P_INT,
624          NULL, NULL, NULL},
625         {"mainview_width", "500", &prefs_common.mainview_width, P_INT,
626          NULL, NULL, NULL},
627         {"mainview_height", "400", &prefs_common.mainview_height, P_INT,
628          NULL, NULL, NULL},
629         {"mainwin_x", "64", &prefs_common.mainwin_x, P_INT,
630          NULL, NULL, NULL},
631         {"mainwin_y", "64", &prefs_common.mainwin_y, P_INT,
632          NULL, NULL, NULL},
633         {"mainwin_maximised", "FALSE", &prefs_common.mainwin_maximised, P_BOOL,
634          NULL, NULL, NULL},
635         {"mainwin_fullscreen", "FALSE", &prefs_common.mainwin_fullscreen, 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 #ifndef G_OS_WIN32
815         {"uri_open_command", DEFAULT_BROWSER_CMD,
816          &SPECIFIC_PREFS.uri_cmd, P_STRING, NULL, NULL, NULL},
817         {"print_command", "lpr %s",
818          &SPECIFIC_PREFS.print_cmd, P_STRING, NULL, NULL, NULL},
819 #endif
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_margin_top", "-1", &prefs_common.print_margin_top, P_INT,
1100          NULL, NULL, NULL},
1101         {"print_margin_bottom", "-1", &prefs_common.print_margin_bottom, P_INT,
1102          NULL, NULL, NULL},
1103         {"print_margin_left", "-1", &prefs_common.print_margin_left, P_INT,
1104          NULL, NULL, NULL},
1105         {"print_margin_right", "-1", &prefs_common.print_margin_right, P_INT,
1106          NULL, NULL, NULL},
1107         {"print_use_color", "0", &prefs_common.print_use_color, P_INT,
1108          NULL, NULL, NULL},
1109         {"print_use_collate", "0", &prefs_common.print_use_collate, P_INT,
1110          NULL, NULL, NULL},
1111         {"print_use_reverse", "0", &prefs_common.print_use_reverse, P_INT,
1112          NULL, NULL, NULL},
1113         {"print_use_duplex", "0", &prefs_common.print_use_duplex, P_INT,
1114          NULL, NULL, NULL},
1115         {"print_imgs", "1", &prefs_common.print_imgs, P_INT,
1116          NULL, NULL, NULL},
1117         {"print_previewwin_width", "600", &prefs_common.print_previewwin_width, P_INT,
1118          NULL, NULL, NULL},
1119         {"print_previewwin_height", "-1", &prefs_common.print_previewwin_height, P_INT,
1120          NULL, NULL, NULL},
1121         {"use_networkmanager", "TRUE", &prefs_common.use_networkmanager, P_BOOL,
1122          NULL, NULL, NULL},
1123         {"use_shred", "FALSE", &prefs_common.use_shred, P_BOOL,
1124          NULL, NULL, NULL},
1125
1126         {"two_line_vertical", "TRUE", &prefs_common.two_line_vert,
1127         P_BOOL, NULL, NULL, NULL },
1128
1129         {"inherit_folder_properties", "FALSE", &prefs_common.inherit_folder_props, P_BOOL,
1130          NULL, NULL, NULL},
1131
1132         {"flush_metadata", "TRUE", &prefs_common.flush_metadata, P_BOOL,
1133          NULL, NULL, NULL},
1134
1135         {NULL, NULL, NULL, P_OTHER, NULL, NULL, NULL}
1136 };
1137
1138 /*
1139  * Read history list from the specified history file in the specified directory (subdir of rc_dir)
1140  * Fallback to default_list if history file is not found
1141  */
1142 GList *prefs_common_read_history_from_dir_with_defaults(const gchar *dirname, const gchar *history,
1143                                                                                                                           GList *default_list)
1144 {
1145         FILE *fp;
1146         gchar *path;
1147         gchar buf[PREFSBUFSIZE];
1148         GList *tmp = NULL;
1149
1150         if (dirname) {
1151                 path = g_strconcat(get_rc_dir(), G_DIR_SEPARATOR_S, dirname,
1152                                    G_DIR_SEPARATOR_S, history,
1153                                    NULL);
1154         } else {
1155         path = g_strconcat(get_rc_dir(), G_DIR_SEPARATOR_S, history,
1156                            NULL);
1157         }
1158         if ((fp = g_fopen(path, "rb")) == NULL) {
1159                 if (ENOENT != errno) FILE_OP_ERROR(path, "fopen");
1160                 g_free(path);
1161                 /* returns default list if set, otherwise NULL */
1162                 return default_list;
1163         }
1164         g_free(path);
1165         while (fgets(buf, sizeof(buf), fp) != NULL) {
1166                 g_strstrip(buf);
1167                 if (buf[0] == '\0') continue;
1168                 tmp = add_history(tmp, buf);
1169         }
1170         fclose(fp);
1171
1172         tmp = g_list_reverse(tmp);
1173
1174         return tmp;
1175 }
1176
1177 /*
1178  * Read history list from the specified history file in the specified directory (subdir of rc_dir)
1179  */
1180 static GList *prefs_common_read_history_from_dir(const gchar *dirname, const gchar *history) 
1181 {
1182         return prefs_common_read_history_from_dir_with_defaults(dirname, history, NULL);
1183 }
1184
1185 /*
1186  * Read history list from the specified history file
1187  */
1188 static GList *prefs_common_read_history(const gchar *history) 
1189 {
1190         return prefs_common_read_history_from_dir(NULL, history);
1191 }
1192
1193 void prefs_common_read_config(void)
1194 {
1195         gchar *rcpath;
1196         gchar *tmp;
1197
1198         rcpath = g_strconcat(get_rc_dir(), G_DIR_SEPARATOR_S, COMMON_RC, NULL);
1199         prefs_read_config(param, "Common", rcpath, NULL);
1200 #ifdef G_OS_WIN32
1201         prefs_read_config(param_os_specific, "CommonWin32", rcpath, NULL);
1202 #endif
1203
1204         g_free(rcpath);
1205
1206         tmp = g_strdup(gettext(prefs_common.date_format));
1207         g_free(prefs_common.date_format);
1208         prefs_common.date_format = tmp;
1209
1210         prefs_common.mime_open_cmd_history =
1211                 prefs_common_read_history(COMMAND_HISTORY);
1212         prefs_common.summary_quicksearch_history =
1213                 prefs_common_read_history(QUICKSEARCH_HISTORY);
1214         prefs_common.summary_search_from_history =
1215                 prefs_common_read_history(SUMMARY_SEARCH_FROM_HISTORY);
1216         prefs_common.summary_search_to_history =
1217                 prefs_common_read_history(SUMMARY_SEARCH_TO_HISTORY);
1218         prefs_common.summary_search_subject_history =
1219                 prefs_common_read_history(SUMMARY_SEARCH_SUBJECT_HISTORY);
1220         prefs_common.summary_search_body_history =
1221                 prefs_common_read_history(SUMMARY_SEARCH_BODY_HISTORY);
1222         prefs_common.summary_search_adv_condition_history =
1223                 prefs_common_read_history(SUMMARY_SEARCH_ADV_CONDITION_HISTORY);
1224         prefs_common.message_search_history =
1225                 prefs_common_read_history(MESSAGE_SEARCH_HISTORY);
1226         prefs_common.compose_save_to_history =
1227                 prefs_common_read_history(COMPOSE_SAVE_TO_HISTORY);
1228
1229         prefs_common.addressbook_custom_attributes = addressbook_update_custom_attr_from_prefs();
1230
1231         colorlabel_update_colortable_from_prefs();
1232 }
1233
1234 #define TRY(func) \
1235 if (!(func)) \
1236 { \
1237         g_warning("failed to write\n"); \
1238         goto out;                       \
1239 } \
1240
1241 /*
1242  * Save history list to the specified history file in the specified directory (subdir of rc_dir)
1243  */
1244 static void prefs_common_save_history_to_dir(const gchar *dirname, const gchar *history, GList *list)
1245 {
1246         GList *cur;
1247         FILE *fp;
1248         gchar *path, *tmp_path;
1249
1250         if (dirname) {
1251                 path = g_strconcat(get_rc_dir(), G_DIR_SEPARATOR_S, dirname,
1252                                    G_DIR_SEPARATOR_S, history,
1253                                    NULL);
1254         } else {
1255         path = g_strconcat(get_rc_dir(), G_DIR_SEPARATOR_S, history,
1256                            NULL);
1257         }
1258         tmp_path = g_strconcat(path, ".tmp", NULL);
1259
1260         if ((fp = g_fopen(tmp_path, "wb")) == NULL) {
1261                 FILE_OP_ERROR(tmp_path, "fopen");
1262                 goto out;
1263         }
1264
1265         for (cur = list; cur != NULL; cur = cur->next) {
1266                 TRY(fputs((gchar *)cur->data, fp) != EOF &&
1267                     fputc('\n', fp) != EOF);
1268         }
1269
1270         if (fclose(fp) == EOF) {
1271                 FILE_OP_ERROR(tmp_path, "fclose");
1272                 fp = NULL;
1273                 goto out;
1274         }
1275         fp = NULL;
1276 #ifdef G_OS_WIN32
1277         claws_unlink(path);
1278 #endif
1279         if (g_rename(tmp_path, path) < 0) {
1280                 FILE_OP_ERROR(path, "rename");
1281                 goto out;
1282         }
1283
1284 out:
1285         if (fp)
1286                 fclose(fp);
1287         g_free(tmp_path);
1288         g_free(path);
1289 }
1290
1291 /*
1292  * Save history list to the specified history file
1293  */
1294 static void prefs_common_save_history(const gchar *history, GList *list)
1295 {
1296         prefs_common_save_history_to_dir(NULL, history, list);
1297 }
1298
1299 #undef TRY
1300
1301 void prefs_common_write_config(void)
1302 {
1303         prefs_write_config(param, "Common", COMMON_RC);
1304 #ifdef G_OS_WIN32
1305         prefs_write_config(param_os_specific, "CommonWin32", COMMON_RC);
1306 #endif
1307
1308         prefs_common_save_history(COMMAND_HISTORY, 
1309                 prefs_common.mime_open_cmd_history);
1310         prefs_common_save_history(QUICKSEARCH_HISTORY, 
1311                 prefs_common.summary_quicksearch_history);
1312         prefs_common_save_history(SUMMARY_SEARCH_FROM_HISTORY, 
1313                 prefs_common.summary_search_from_history);
1314         prefs_common_save_history(SUMMARY_SEARCH_TO_HISTORY, 
1315                 prefs_common.summary_search_to_history);
1316         prefs_common_save_history(SUMMARY_SEARCH_SUBJECT_HISTORY, 
1317                 prefs_common.summary_search_subject_history);
1318         prefs_common_save_history(SUMMARY_SEARCH_BODY_HISTORY, 
1319                 prefs_common.summary_search_body_history);
1320         prefs_common_save_history(SUMMARY_SEARCH_ADV_CONDITION_HISTORY, 
1321                 prefs_common.summary_search_adv_condition_history);
1322         prefs_common_save_history(MESSAGE_SEARCH_HISTORY, 
1323                 prefs_common.message_search_history);
1324         prefs_common_save_history(COMPOSE_SAVE_TO_HISTORY, 
1325                 prefs_common.compose_save_to_history);
1326
1327         prefs_common_save_history_to_dir(ADDRBOOK_DIR,
1328                 ADDRESSBOOK_CUSTOM_ATTRIBUTES, 
1329                 prefs_common.addressbook_custom_attributes);
1330 }
1331
1332 /* make a copy of string 'in' into buffer 'out'. un-escape \ sequences.
1333    both 'in' and 'out' must be non-NULL.
1334    'out' must be a pointer to a buffer whose size is at least equal
1335    to strlen(txt)+1, this buffer will get cleared. out's contents
1336    will always get set to a valid string, even if it's "".*/
1337 void pref_get_unescaped_pref(gchar *out, const gchar *in)
1338 {
1339         const gchar *i;
1340         gchar *o;
1341
1342         *out = '\0';
1343
1344         cm_return_if_fail( in != NULL );
1345         cm_return_if_fail( out != NULL );
1346
1347         i = in;
1348         o = out;
1349         memset(out, 0, strlen(in)+1);
1350         while (*i != '\0') {
1351                 if (*i == '\\' && *(i+1) == 'n') {
1352                         *o++ = '\n';
1353                         i++;
1354                 } else if (*i == '\\' && *(i+1) == 't') {
1355                         *o++ = '\t';
1356                         i++;
1357                 } else if (*i == '\\' && *(i+1) == '\\') {
1358                         *o++ = '\\';
1359                         i++;
1360                 } else {
1361                         *o++ = *i;
1362                 }
1363                 i++;
1364         }
1365         *o='\0';
1366 }
1367
1368 /* make a copy of string 'in' into buffer 'out'. escape \ sequences.
1369    both 'in' and 'out' must be non-NULL.
1370    'out' must be a pointer to a buffer whose size is at least equal
1371    to 2*strlen(txt)+1. out's contents will always get set to a valid
1372    string, even if it's "". */
1373 void pref_get_escaped_pref(gchar *out, const gchar *in)
1374 {
1375         const gchar *i;
1376         gchar *o;
1377
1378         *out = '\0';
1379
1380         cm_return_if_fail( in != NULL );
1381         cm_return_if_fail( out != NULL );
1382
1383         i = in;
1384         o = out;
1385         while (*i != '\0') {
1386                 if (*i == '\n') {
1387                         *o++ = '\\';
1388                         *o++ = 'n';
1389                 } else if (*i == '\t') {
1390                         *o++ = '\\';
1391                         *o++ = 't';
1392                 } else if (*i == '\\') {
1393                         *o++ = '\\';
1394                         *o++ = '\\';
1395                 } else {
1396                         *o++ = *i;
1397                 }
1398                 i++;
1399         }
1400         *o = '\0';
1401 }
1402                 
1403 /* set the contents of a textview widget from the internal \-escaped
1404   representation of a pref string. both txt and textview must be non-NULL. */
1405 void pref_set_textview_from_pref(GtkTextView *textview, const gchar *txt)
1406 {
1407         GtkTextBuffer *buffer;
1408         gchar *out = NULL;
1409
1410         cm_return_if_fail( textview != NULL );
1411
1412         buffer = gtk_text_view_get_buffer(textview);
1413
1414         if (!txt) {
1415                 gtk_text_buffer_set_text(buffer, "", -1);
1416         } else {
1417                 out = malloc(strlen(txt)+1);
1418
1419                 pref_get_unescaped_pref(out, txt);
1420
1421                 gtk_text_buffer_set_text(buffer, out?out:"", -1);
1422                 g_free(out);
1423         }
1424 }
1425
1426 /* set the contents of a gtkentry widget from the internal \-escaped
1427   representation of a pref string. both txt and entry must be non-NULL. */
1428 void pref_set_entry_from_pref(GtkEntry *entry, const gchar *txt)
1429 {
1430         gchar *out = NULL;
1431
1432         cm_return_if_fail( entry != NULL );
1433         if (!txt) {
1434                 gtk_entry_set_text(entry, "");
1435         } else {
1436                 out = malloc(strlen(txt)+1);
1437
1438                 pref_get_unescaped_pref(out, txt);
1439
1440                 gtk_entry_set_text(entry, out?out:"");
1441                 g_free(out);
1442         }
1443 }
1444
1445 /* get the \-escaped internal representation of a pref from the contents of
1446    a textview widget. textview must be non-NULL. */
1447 gchar *pref_get_pref_from_textview(GtkTextView *textview) 
1448 {
1449         GtkTextBuffer *buffer;
1450         GtkTextIter start, end;
1451         gchar *out, *tmp;
1452         
1453         cm_return_val_if_fail( textview != NULL, "" );
1454
1455         buffer = gtk_text_view_get_buffer(textview);
1456         gtk_text_buffer_get_start_iter(buffer, &start);
1457         gtk_text_buffer_get_iter_at_offset(buffer, &end, -1);
1458         tmp = gtk_text_buffer_get_text(buffer, &start, &end, FALSE);
1459         out = malloc(2*strlen(tmp)+1);
1460         if (out)
1461                 pref_get_escaped_pref(out, tmp);
1462         g_free(tmp);
1463
1464         return out?out:"";
1465 }
1466
1467 /* get the \-escaped internal representation of a pref from the contents of
1468    a gtkentry widget. entry must be non-NULL. */
1469 gchar *pref_get_pref_from_entry(GtkEntry *entry) 
1470 {
1471         gchar *out, *tmp;
1472
1473         cm_return_val_if_fail( entry != NULL, "" );
1474
1475         tmp = gtk_editable_get_chars(GTK_EDITABLE(entry), 0, -1);
1476         out = malloc(2*strlen(tmp)+1);
1477         
1478         if (out)
1479                 pref_get_escaped_pref(out, tmp);
1480         g_free(tmp);
1481
1482         return out?out:"";
1483 }
1484
1485 /* ugly hack to be able to get this pref from ssl_certificate.c */
1486 gboolean prefs_common_unsafe_ssl_certs(void)
1487 {
1488         return prefs_common.unsafe_ssl_certs;
1489 }
1490
1491 gboolean prefs_common_enable_log_standard(void)
1492 {
1493         return prefs_common.enable_log_standard;
1494 }
1495
1496 gboolean prefs_common_enable_log_warning(void)
1497 {
1498         return prefs_common.enable_log_warning;
1499 }
1500 gboolean prefs_common_enable_log_error(void)
1501 {
1502         return prefs_common.enable_log_error;
1503 }
1504 gboolean prefs_common_enable_log_status(void)
1505 {
1506         return prefs_common.enable_log_status;
1507 }
1508
1509 #ifdef MAEMO
1510 const gchar *prefs_common_get_data_root(void)
1511 {
1512         if (prefs_common.data_root && *prefs_common.data_root)
1513                 return prefs_common.data_root;
1514         else
1515                 return NULL;
1516 }
1517 #endif
1518 /**
1519    return the translated name of a header, if the translate_header option is
1520    set, otherwise return the untranslated header name (header_name itself).
1521    this function is provided for convenience, it's an interface to
1522    prefs_common.trans_hdr.
1523    works with header names either with or without trailing colon, provided
1524    that gettext found such header name in the sources (they should all be
1525    found in src/gtk/headers.h anyway).
1526 */
1527 const gchar *prefs_common_translated_header_name(const gchar *header_name)
1528 {
1529         if (header_name == NULL || *header_name == '\0')
1530                 return header_name;
1531
1532         return prefs_common.trans_hdr ? gettext(header_name) : header_name;
1533 }
1534
1535 const gchar *prefs_common_get_uri_cmd(void)
1536 {
1537 #ifdef G_OS_WIN32
1538         return NULL;
1539 #else
1540         gchar *tmp = NULL;
1541         
1542         if (!prefs_common.cmds_use_system_default)
1543                 return prefs_common.uri_cmd;
1544         
1545         tmp = g_find_program_in_path("xdg-open");
1546         if (!tmp) 
1547                 return prefs_common.uri_cmd;
1548         
1549         g_free(tmp);
1550         return "xdg-open %s";
1551 #endif
1552 }
1553
1554 const gchar *prefs_common_get_ext_editor_cmd(void)
1555 {
1556         return prefs_common.ext_editor_cmd;
1557 #if 0 /* we should do that, but it detaches the editor and breaks
1558          compose.c's external composition. */
1559         gchar *tmp = NULL;
1560         
1561         if (!prefs_common.cmds_use_system_default)
1562                 return prefs_common.ext_editor_cmd;
1563         
1564         tmp = g_find_program_in_path("xdg-open");
1565         if (!tmp) 
1566                 return prefs_common.ext_editor_cmd;
1567         
1568         g_free(tmp);
1569         return "xdg-open %s";
1570 #endif 
1571 }
1572
1573 gboolean prefs_common_get_use_shred(void)
1574 {
1575         return prefs_common.use_shred;
1576 }
1577
1578 gboolean prefs_common_get_flush_metadata (void)
1579 {
1580         return prefs_common.flush_metadata;
1581 }
1582
1583 PrefsCommon *prefs_common_get_prefs(void)
1584 {
1585         return &prefs_common;
1586 }