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