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