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