2008-12-09 [colin] 3.6.1cvs66
[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         {"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_use_color", "0", &prefs_common.print_use_color, P_INT,
1100          NULL, NULL, NULL},
1101         {"print_use_collate", "0", &prefs_common.print_use_collate, P_INT,
1102          NULL, NULL, NULL},
1103         {"print_use_reverse", "0", &prefs_common.print_use_reverse, P_INT,
1104          NULL, NULL, NULL},
1105         {"print_use_duplex", "0", &prefs_common.print_use_duplex, P_INT,
1106          NULL, NULL, NULL},
1107         {"print_imgs", "1", &prefs_common.print_imgs, P_INT,
1108          NULL, NULL, NULL},
1109         {"print_previewwin_width", "600", &prefs_common.print_previewwin_width, P_INT,
1110          NULL, NULL, NULL},
1111         {"print_previewwin_height", "-1", &prefs_common.print_previewwin_height, P_INT,
1112          NULL, NULL, NULL},
1113         {"use_networkmanager", "TRUE", &prefs_common.use_networkmanager, P_BOOL,
1114          NULL, NULL, NULL},
1115         {"use_shred", "FALSE", &prefs_common.use_shred, P_BOOL,
1116          NULL, NULL, NULL},
1117
1118         {"two_line_vertical", "TRUE", &prefs_common.two_line_vert,
1119         P_BOOL, NULL, NULL, NULL },
1120
1121         {"inherit_folder_properties", "FALSE", &prefs_common.inherit_folder_props, P_BOOL,
1122          NULL, NULL, NULL},
1123
1124         {NULL, NULL, NULL, P_OTHER, NULL, NULL, NULL}
1125 };
1126
1127 /*
1128  * Read history list from the specified history file in the specified directory (subdir of rc_dir)
1129  * Fallback to default_list if history file is not found
1130  */
1131 GList *prefs_common_read_history_from_dir_with_defaults(const gchar *dirname, const gchar *history,
1132                                                                                                                           GList *default_list)
1133 {
1134         FILE *fp;
1135         gchar *path;
1136         gchar buf[PREFSBUFSIZE];
1137         GList *tmp = NULL;
1138
1139         if (dirname) {
1140                 path = g_strconcat(get_rc_dir(), G_DIR_SEPARATOR_S, dirname,
1141                                    G_DIR_SEPARATOR_S, history,
1142                                    NULL);
1143         } else {
1144         path = g_strconcat(get_rc_dir(), G_DIR_SEPARATOR_S, history,
1145                            NULL);
1146         }
1147         if ((fp = g_fopen(path, "rb")) == NULL) {
1148                 if (ENOENT != errno) FILE_OP_ERROR(path, "fopen");
1149                 g_free(path);
1150                 /* returns default list if set, otherwise NULL */
1151                 return default_list;
1152         }
1153         g_free(path);
1154         while (fgets(buf, sizeof(buf), fp) != NULL) {
1155                 g_strstrip(buf);
1156                 if (buf[0] == '\0') continue;
1157                 tmp = add_history(tmp, buf);
1158         }
1159         fclose(fp);
1160
1161         tmp = g_list_reverse(tmp);
1162
1163         return tmp;
1164 }
1165
1166 /*
1167  * Read history list from the specified history file in the specified directory (subdir of rc_dir)
1168  */
1169 static GList *prefs_common_read_history_from_dir(const gchar *dirname, const gchar *history) 
1170 {
1171         return prefs_common_read_history_from_dir_with_defaults(dirname, history, NULL);
1172 }
1173
1174 /*
1175  * Read history list from the specified history file
1176  */
1177 static GList *prefs_common_read_history(const gchar *history) 
1178 {
1179         return prefs_common_read_history_from_dir(NULL, history);
1180 }
1181
1182 void prefs_common_read_config(void)
1183 {
1184         gchar *rcpath;
1185         gchar *tmp;
1186
1187         rcpath = g_strconcat(get_rc_dir(), G_DIR_SEPARATOR_S, COMMON_RC, NULL);
1188         prefs_read_config(param, "Common", rcpath, NULL);
1189 #ifdef G_OS_WIN32
1190         prefs_read_config(param_os_specific, "CommonWin32", rcpath, NULL);
1191 #endif
1192
1193         g_free(rcpath);
1194
1195         tmp = g_strdup(gettext(prefs_common.date_format));
1196         g_free(prefs_common.date_format);
1197         prefs_common.date_format = tmp;
1198
1199         prefs_common.mime_open_cmd_history =
1200                 prefs_common_read_history(COMMAND_HISTORY);
1201         prefs_common.summary_quicksearch_history =
1202                 prefs_common_read_history(QUICKSEARCH_HISTORY);
1203         prefs_common.summary_search_from_history =
1204                 prefs_common_read_history(SUMMARY_SEARCH_FROM_HISTORY);
1205         prefs_common.summary_search_to_history =
1206                 prefs_common_read_history(SUMMARY_SEARCH_TO_HISTORY);
1207         prefs_common.summary_search_subject_history =
1208                 prefs_common_read_history(SUMMARY_SEARCH_SUBJECT_HISTORY);
1209         prefs_common.summary_search_body_history =
1210                 prefs_common_read_history(SUMMARY_SEARCH_BODY_HISTORY);
1211         prefs_common.summary_search_adv_condition_history =
1212                 prefs_common_read_history(SUMMARY_SEARCH_ADV_CONDITION_HISTORY);
1213         prefs_common.message_search_history =
1214                 prefs_common_read_history(MESSAGE_SEARCH_HISTORY);
1215         prefs_common.compose_save_to_history =
1216                 prefs_common_read_history(COMPOSE_SAVE_TO_HISTORY);
1217
1218         prefs_common.addressbook_custom_attributes = addressbook_update_custom_attr_from_prefs();
1219
1220         colorlabel_update_colortable_from_prefs();
1221 }
1222
1223 #define TRY(func) \
1224 if (!(func)) \
1225 { \
1226         g_warning("failed to write\n"); \
1227         goto out;                       \
1228 } \
1229
1230 /*
1231  * Save history list to the specified history file in the specified directory (subdir of rc_dir)
1232  */
1233 static void prefs_common_save_history_to_dir(const gchar *dirname, const gchar *history, GList *list)
1234 {
1235         GList *cur;
1236         FILE *fp;
1237         gchar *path, *tmp_path;
1238
1239         if (dirname) {
1240                 path = g_strconcat(get_rc_dir(), G_DIR_SEPARATOR_S, dirname,
1241                                    G_DIR_SEPARATOR_S, history,
1242                                    NULL);
1243         } else {
1244         path = g_strconcat(get_rc_dir(), G_DIR_SEPARATOR_S, history,
1245                            NULL);
1246         }
1247         tmp_path = g_strconcat(path, ".tmp", NULL);
1248
1249         if ((fp = g_fopen(tmp_path, "wb")) == NULL) {
1250                 FILE_OP_ERROR(tmp_path, "fopen");
1251                 goto out;
1252         }
1253
1254         for (cur = list; cur != NULL; cur = cur->next) {
1255                 TRY(fputs((gchar *)cur->data, fp) != EOF &&
1256                     fputc('\n', fp) != EOF);
1257         }
1258
1259         if (fclose(fp) == EOF) {
1260                 FILE_OP_ERROR(tmp_path, "fclose");
1261                 fp = NULL;
1262                 goto out;
1263         }
1264         fp = NULL;
1265 #ifdef G_OS_WIN32
1266         claws_unlink(path);
1267 #endif
1268         if (g_rename(tmp_path, path) < 0) {
1269                 FILE_OP_ERROR(path, "rename");
1270                 goto out;
1271         }
1272
1273 out:
1274         if (fp)
1275                 fclose(fp);
1276         g_free(tmp_path);
1277         g_free(path);
1278 }
1279
1280 /*
1281  * Save history list to the specified history file
1282  */
1283 static void prefs_common_save_history(const gchar *history, GList *list)
1284 {
1285         prefs_common_save_history_to_dir(NULL, history, list);
1286 }
1287
1288 #undef TRY
1289
1290 void prefs_common_write_config(void)
1291 {
1292         prefs_write_config(param, "Common", COMMON_RC);
1293 #ifdef G_OS_WIN32
1294         prefs_write_config(param_os_specific, "CommonWin32", COMMON_RC);
1295 #endif
1296
1297         prefs_common_save_history(COMMAND_HISTORY, 
1298                 prefs_common.mime_open_cmd_history);
1299         prefs_common_save_history(QUICKSEARCH_HISTORY, 
1300                 prefs_common.summary_quicksearch_history);
1301         prefs_common_save_history(SUMMARY_SEARCH_FROM_HISTORY, 
1302                 prefs_common.summary_search_from_history);
1303         prefs_common_save_history(SUMMARY_SEARCH_TO_HISTORY, 
1304                 prefs_common.summary_search_to_history);
1305         prefs_common_save_history(SUMMARY_SEARCH_SUBJECT_HISTORY, 
1306                 prefs_common.summary_search_subject_history);
1307         prefs_common_save_history(SUMMARY_SEARCH_BODY_HISTORY, 
1308                 prefs_common.summary_search_body_history);
1309         prefs_common_save_history(SUMMARY_SEARCH_ADV_CONDITION_HISTORY, 
1310                 prefs_common.summary_search_adv_condition_history);
1311         prefs_common_save_history(MESSAGE_SEARCH_HISTORY, 
1312                 prefs_common.message_search_history);
1313         prefs_common_save_history(COMPOSE_SAVE_TO_HISTORY, 
1314                 prefs_common.compose_save_to_history);
1315
1316         prefs_common_save_history_to_dir(ADDRBOOK_DIR,
1317                 ADDRESSBOOK_CUSTOM_ATTRIBUTES, 
1318                 prefs_common.addressbook_custom_attributes);
1319 }
1320
1321 /* make a copy of string 'in' into buffer 'out'. un-escape \ sequences.
1322    both 'in' and 'out' must be non-NULL.
1323    'out' must be a pointer to a buffer whose size is at least equal
1324    to strlen(txt)+1, this buffer will get cleared. out's contents
1325    will always get set to a valid string, even if it's "".*/
1326 void pref_get_unescaped_pref(gchar *out, const gchar *in)
1327 {
1328         const gchar *i;
1329         gchar *o;
1330
1331         *out = '\0';
1332
1333         g_return_if_fail( in != NULL );
1334         g_return_if_fail( out != NULL );
1335
1336         i = in;
1337         o = out;
1338         memset(out, 0, strlen(in)+1);
1339         while (*i != '\0') {
1340                 if (*i == '\\' && *(i+1) == 'n') {
1341                         *o++ = '\n';
1342                         i++;
1343                 } else if (*i == '\\' && *(i+1) == 't') {
1344                         *o++ = '\t';
1345                         i++;
1346                 } else if (*i == '\\' && *(i+1) == '\\') {
1347                         *o++ = '\\';
1348                         i++;
1349                 } else {
1350                         *o++ = *i;
1351                 }
1352                 i++;
1353         }
1354         *o='\0';
1355 }
1356
1357 /* make a copy of string 'in' into buffer 'out'. escape \ sequences.
1358    both 'in' and 'out' must be non-NULL.
1359    'out' must be a pointer to a buffer whose size is at least equal
1360    to 2*strlen(txt)+1. out's contents will always get set to a valid
1361    string, even if it's "". */
1362 void pref_get_escaped_pref(gchar *out, const gchar *in)
1363 {
1364         const gchar *i;
1365         gchar *o;
1366
1367         *out = '\0';
1368
1369         g_return_if_fail( in != NULL );
1370         g_return_if_fail( out != NULL );
1371
1372         i = in;
1373         o = out;
1374         while (*i != '\0') {
1375                 if (*i == '\n') {
1376                         *o++ = '\\';
1377                         *o++ = 'n';
1378                 } else if (*i == '\t') {
1379                         *o++ = '\\';
1380                         *o++ = 't';
1381                 } else if (*i == '\\') {
1382                         *o++ = '\\';
1383                         *o++ = '\\';
1384                 } else {
1385                         *o++ = *i;
1386                 }
1387                 i++;
1388         }
1389         *o = '\0';
1390 }
1391                 
1392 /* set the contents of a textview widget from the internal \-escaped
1393   representation of a pref string. both txt and textview must be non-NULL. */
1394 void pref_set_textview_from_pref(GtkTextView *textview, const gchar *txt)
1395 {
1396         GtkTextBuffer *buffer;
1397         gchar *out = NULL;
1398
1399         g_return_if_fail( textview != NULL );
1400
1401         buffer = gtk_text_view_get_buffer(textview);
1402
1403         if (!txt) {
1404                 gtk_text_buffer_set_text(buffer, "", -1);
1405         } else {
1406                 out = malloc(strlen(txt)+1);
1407
1408                 pref_get_unescaped_pref(out, txt);
1409
1410                 gtk_text_buffer_set_text(buffer, out?out:"", -1);
1411                 g_free(out);
1412         }
1413 }
1414
1415 /* set the contents of a gtkentry widget from the internal \-escaped
1416   representation of a pref string. both txt and entry must be non-NULL. */
1417 void pref_set_entry_from_pref(GtkEntry *entry, const gchar *txt)
1418 {
1419         gchar *out = NULL;
1420
1421         g_return_if_fail( entry != NULL );
1422         if (!txt) {
1423                 gtk_entry_set_text(entry, "");
1424         } else {
1425                 out = malloc(strlen(txt)+1);
1426
1427                 pref_get_unescaped_pref(out, txt);
1428
1429                 gtk_entry_set_text(entry, out?out:"");
1430                 g_free(out);
1431         }
1432 }
1433
1434 /* get the \-escaped internal representation of a pref from the contents of
1435    a textview widget. textview must be non-NULL. */
1436 gchar *pref_get_pref_from_textview(GtkTextView *textview) 
1437 {
1438         GtkTextBuffer *buffer;
1439         GtkTextIter start, end;
1440         gchar *out, *tmp;
1441         
1442         g_return_val_if_fail( textview != NULL, "" );
1443
1444         buffer = gtk_text_view_get_buffer(textview);
1445         gtk_text_buffer_get_start_iter(buffer, &start);
1446         gtk_text_buffer_get_iter_at_offset(buffer, &end, -1);
1447         tmp = gtk_text_buffer_get_text(buffer, &start, &end, FALSE);
1448         out = malloc(2*strlen(tmp)+1);
1449         
1450         pref_get_escaped_pref(out, tmp);
1451         g_free(tmp);
1452
1453         return out?out:"";
1454 }
1455
1456 /* get the \-escaped internal representation of a pref from the contents of
1457    a gtkentry widget. entry must be non-NULL. */
1458 gchar *pref_get_pref_from_entry(GtkEntry *entry) 
1459 {
1460         gchar *out, *tmp;
1461
1462         g_return_val_if_fail( entry != NULL, "" );
1463
1464         tmp = gtk_editable_get_chars(GTK_EDITABLE(entry), 0, -1);
1465         out = malloc(2*strlen(tmp)+1);
1466
1467         pref_get_escaped_pref(out, tmp);
1468         g_free(tmp);
1469
1470         return out?out:"";
1471 }
1472
1473 /* ugly hack to be able to get this pref from ssl_certificate.c */
1474 gboolean prefs_common_unsafe_ssl_certs(void)
1475 {
1476         return prefs_common.unsafe_ssl_certs;
1477 }
1478
1479 gboolean prefs_common_enable_log_standard(void)
1480 {
1481         return prefs_common.enable_log_standard;
1482 }
1483
1484 gboolean prefs_common_enable_log_warning(void)
1485 {
1486         return prefs_common.enable_log_warning;
1487 }
1488 gboolean prefs_common_enable_log_error(void)
1489 {
1490         return prefs_common.enable_log_error;
1491 }
1492 gboolean prefs_common_enable_log_status(void)
1493 {
1494         return prefs_common.enable_log_status;
1495 }
1496
1497 #ifdef MAEMO
1498 const gchar *prefs_common_get_data_root(void)
1499 {
1500         if (prefs_common.data_root && *prefs_common.data_root)
1501                 return prefs_common.data_root;
1502         else
1503                 return NULL;
1504 }
1505 #endif
1506 /**
1507    return the translated name of a header, if the translate_header option is
1508    set, otherwise return the untranslated header name (header_name itself).
1509    this function is provided for convenience, it's an interface to
1510    prefs_common.trans_hdr.
1511    works with header names either with or without trailing colon, provided
1512    that gettext found such header name in the sources (they should all be
1513    found in src/gtk/headers.h anyway).
1514 */
1515 const gchar *prefs_common_translated_header_name(const gchar *header_name)
1516 {
1517         if (header_name == NULL || *header_name == '\0')
1518                 return header_name;
1519
1520         return prefs_common.trans_hdr ? gettext(header_name) : header_name;
1521 }
1522
1523 const gchar *prefs_common_get_uri_cmd(void)
1524 {
1525 #ifdef G_OS_WIN32
1526         return NULL;
1527 #else
1528         gchar *tmp = NULL;
1529         
1530         if (!prefs_common.cmds_use_system_default)
1531                 return prefs_common.uri_cmd;
1532         
1533         tmp = g_find_program_in_path("xdg-open");
1534         if (!tmp) 
1535                 return prefs_common.uri_cmd;
1536         
1537         g_free(tmp);
1538         return "xdg-open %s";
1539 #endif
1540 }
1541
1542 const gchar *prefs_common_get_ext_editor_cmd(void)
1543 {
1544         return prefs_common.ext_editor_cmd;
1545 #if 0 /* we should do that, but it detaches the editor and breaks
1546          compose.c's external composition. */
1547         gchar *tmp = NULL;
1548         
1549         if (!prefs_common.cmds_use_system_default)
1550                 return prefs_common.ext_editor_cmd;
1551         
1552         tmp = g_find_program_in_path("xdg-open");
1553         if (!tmp) 
1554                 return prefs_common.ext_editor_cmd;
1555         
1556         g_free(tmp);
1557         return "xdg-open %s";
1558 #endif 
1559 }
1560
1561 gboolean prefs_common_get_use_shred(void)
1562 {
1563         return prefs_common.use_shred;
1564 }
1565
1566 PrefsCommon *prefs_common_get_prefs(void)
1567 {
1568         return &prefs_common;
1569 }