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