2009-08-21 [colin] 3.7.2cvs22
[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         {"print_command", "lpr %s",
822          &SPECIFIC_PREFS.print_cmd, P_STRING, NULL, NULL, NULL},
823 #endif
824         {"ext_editor_command", DEFAULT_EDITOR_CMD,
825          &SPECIFIC_PREFS.ext_editor_cmd, P_STRING, NULL, NULL, NULL},
826         {"cmds_use_system_default", "TRUE",
827          &prefs_common.cmds_use_system_default, P_BOOL, NULL, NULL, NULL},
828         {"add_address_by_click", "FALSE", &prefs_common.add_address_by_click,
829          P_BOOL, NULL, NULL, NULL},
830         {"session_passwords", "FALSE", &prefs_common.session_passwords,
831          P_BOOL, NULL, NULL, NULL},
832         {"confirm_on_exit", "FALSE", &prefs_common.confirm_on_exit, P_BOOL,
833          NULL, NULL, NULL},
834         {"clean_trash_on_exit", "FALSE", &prefs_common.clean_on_exit, P_BOOL,
835          NULL, NULL, NULL},
836         {"ask_on_cleaning", "TRUE", &prefs_common.ask_on_clean, P_BOOL,
837          NULL, NULL, NULL},
838         {"warn_queued_on_exit", "TRUE", &prefs_common.warn_queued_on_exit,
839          P_BOOL, NULL, NULL, NULL},
840         {"work_offline", "FALSE", &prefs_common.work_offline, P_BOOL,
841          NULL, NULL, NULL},
842         {"summary_quicksearch_type", "0", &prefs_common.summary_quicksearch_type, P_INT,
843          NULL, NULL, NULL},
844 #ifndef GENERIC_UMPC
845         {"summary_quicksearch_recurse", "1", &prefs_common.summary_quicksearch_recurse, P_INT,
846          NULL, NULL, NULL},
847 #else
848         {"summary_quicksearch_recurse", "0", &prefs_common.summary_quicksearch_recurse, P_INT,
849          NULL, NULL, NULL},
850 #endif
851
852 #if defined(__OpenBSD__)
853         {"io_timeout_secs", "80", &prefs_common.io_timeout_secs,
854          P_INT, NULL, NULL, NULL},
855 #else
856         {"io_timeout_secs", "60", &prefs_common.io_timeout_secs,
857          P_INT, NULL, NULL, NULL},
858 #endif
859         {"hide_score", "-9999", &prefs_common.kill_score, P_INT,
860          NULL, NULL, NULL},
861         {"important_score", "1", &prefs_common.important_score, P_INT,
862          NULL, NULL, NULL},
863
864         {"clip_log", "TRUE", &prefs_common.cliplog, P_BOOL,
865          NULL, NULL, NULL},
866         {"log_length", "500", &prefs_common.loglength, P_INT,
867          NULL, NULL, NULL},
868 #ifndef GENERIC_UMPC
869         {"enable_log_standard", "TRUE", &prefs_common.enable_log_standard, P_BOOL,
870          NULL, NULL, NULL},
871         {"enable_log_warning", "TRUE", &prefs_common.enable_log_warning, P_BOOL,
872          NULL, NULL, NULL},
873         {"enable_log_error", "TRUE", &prefs_common.enable_log_error, P_BOOL,
874          NULL, NULL, NULL},
875         {"enable_log_status", "TRUE", &prefs_common.enable_log_status, P_BOOL,
876          NULL, NULL, NULL},
877 #else
878         {"enable_log_standard", "FALSE", &prefs_common.enable_log_standard, P_BOOL,
879          NULL, NULL, NULL},
880         {"enable_log_warning", "FALSE", &prefs_common.enable_log_warning, P_BOOL,
881          NULL, NULL, NULL},
882         {"enable_log_error", "FALSE", &prefs_common.enable_log_error, P_BOOL,
883          NULL, NULL, NULL},
884         {"enable_log_status", "FALSE", &prefs_common.enable_log_status, P_BOOL,
885          NULL, NULL, NULL},
886 #endif
887         {"log_msg_color", "#00af00", &prefs_common.log_msg_color, P_COLOR,
888          NULL, NULL, NULL},
889         {"log_warn_color", "#af0000", &prefs_common.log_warn_color, P_COLOR,
890          NULL, NULL, NULL},
891         {"log_error_color", "#af0000", &prefs_common.log_error_color, P_COLOR,
892          NULL, NULL, NULL},
893         {"log_in_color", "#000000", &prefs_common.log_in_color, P_COLOR,
894          NULL, NULL, NULL},
895         {"log_out_color", "#0000ef", &prefs_common.log_out_color, P_COLOR,
896          NULL, NULL, NULL},
897         {"log_status_ok_color", "#00af00", &prefs_common.log_status_ok_color, P_COLOR,
898          NULL, NULL, NULL},
899         {"log_status_nok_color", "#0000af", &prefs_common.log_status_nok_color, P_COLOR,
900          NULL, NULL, NULL},
901         {"log_status_skip_color", "#aa00aa", &prefs_common.log_status_skip_color, P_COLOR,
902          NULL, NULL, NULL},
903
904     {"enable_filtering_debug", "FALSE", &prefs_common.enable_filtering_debug, P_BOOL,
905          NULL, NULL, NULL},
906     {"filtering_debug_level", "1", &prefs_common.filtering_debug_level, P_INT,
907          NULL, NULL, NULL},
908     {"enable_filtering_debug_inc", "TRUE", &prefs_common.enable_filtering_debug_inc, P_BOOL,
909          NULL, NULL, NULL},
910     {"enable_filtering_debug_manual", "TRUE", &prefs_common.enable_filtering_debug_manual, P_BOOL,
911          NULL, NULL, NULL},
912     {"enable_filtering_debug_folder_proc", "FALSE", &prefs_common.enable_filtering_debug_folder_proc, P_BOOL,
913          NULL, NULL, NULL},
914     {"enable_filtering_debug_pre_proc", "FALSE", &prefs_common.enable_filtering_debug_pre_proc, P_BOOL,
915          NULL, NULL, NULL},
916     {"enable_filtering_debug_post_proc", "FALSE", &prefs_common.enable_filtering_debug_post_proc, P_BOOL,
917          NULL, NULL, NULL},
918     {"filtering_debug_clip_log", "TRUE", &prefs_common.filtering_debug_cliplog, P_BOOL,
919          NULL, NULL, NULL},
920         {"filtering_debug_log_length", "500", &prefs_common.filtering_debug_loglength, P_INT,
921          NULL, NULL, NULL},
922
923         {"gtk_can_change_accels", "TRUE", &prefs_common.gtk_can_change_accels, P_BOOL,
924          NULL, NULL, NULL},
925
926         {"color_new", "#0000b3", &prefs_common.color_new, P_COLOR,
927          NULL, NULL, NULL},
928
929         /* Some windows' sizes */
930         {"filteringwin_width", "500", &prefs_common.filteringwin_width, P_INT,
931          NULL, NULL, NULL},
932         {"filteringwin_height", "-1", &prefs_common.filteringwin_height, P_INT,
933          NULL, NULL, NULL},
934
935         {"filteringactionwin_width", "490", &prefs_common.filteringactionwin_width, P_INT,
936          NULL, NULL, NULL},
937         {"filteringactionwin_height", "-1", &prefs_common.filteringactionwin_height, P_INT,
938          NULL, NULL, NULL},
939
940         {"matcherwin_width", "520", &prefs_common.matcherwin_width, P_INT,
941          NULL, NULL, NULL},
942         {"matcherwin_height", "-1", &prefs_common.matcherwin_height, P_INT,
943          NULL, NULL, NULL},
944
945         {"templateswin_width", "480", &prefs_common.templateswin_width, P_INT,
946          NULL, NULL, NULL},
947         {"templateswin_height", "-1", &prefs_common.templateswin_height, P_INT,
948          NULL, NULL, NULL},
949
950         {"actionswin_width", "486", &prefs_common.actionswin_width, P_INT,
951          NULL, NULL, NULL},
952         {"actionswin_height", "-1", &prefs_common.actionswin_height, P_INT,
953          NULL, NULL, NULL},
954
955         {"tagswin_width", "486", &prefs_common.tagswin_width, P_INT,
956          NULL, NULL, NULL},
957         {"tagswin_height", "-1", &prefs_common.tagswin_height, P_INT,
958          NULL, NULL, NULL},
959
960         {"addressbookwin_width", "520", &prefs_common.addressbookwin_width, P_INT,
961          NULL, NULL, NULL},
962         {"addressbookwin_height", "-1", &prefs_common.addressbookwin_height, P_INT,
963          NULL, NULL, NULL},
964
965         {"addressbookeditpersonwin_width", "640", &prefs_common.addressbookeditpersonwin_width, P_INT,
966          NULL, NULL, NULL},
967         {"addressbookeditpersonwin_height", "320", &prefs_common.addressbookeditpersonwin_height, P_INT,
968          NULL, NULL, NULL},
969
970         {"addressbookeditgroupwin_width", "580", &prefs_common.addressbookeditgroupwin_width, P_INT,
971          NULL, NULL, NULL},
972         {"addressbookeditgroupwin_height", "340", &prefs_common.addressbookeditgroupwin_height, P_INT,
973          NULL, NULL, NULL},
974
975         {"pluginswin_width", "-1", &prefs_common.pluginswin_width, P_INT,
976          NULL, NULL, NULL},
977         {"pluginswin_height", "-1", &prefs_common.pluginswin_height, P_INT,
978          NULL, NULL, NULL},
979
980         {"prefswin_width", "600", &prefs_common.prefswin_width, P_INT,
981          NULL, NULL, NULL},
982         {"prefswin_height", "-1", &prefs_common.prefswin_height, P_INT,
983          NULL, NULL, NULL},
984
985         {"folderitemwin_width", "500", &prefs_common.folderitemwin_width, P_INT,
986          NULL, NULL, NULL},
987         {"folderitemwin_height", "-1", &prefs_common.folderitemwin_height, P_INT,
988          NULL, NULL, NULL},
989
990         {"zero_replacement_char", "0", &prefs_common.zero_replacement, P_STRING,
991          NULL, NULL, NULL},
992
993         {"editaccountwin_width", "500", &prefs_common.editaccountwin_width, P_INT,
994          NULL, NULL, NULL},
995         {"editaccountwin_height", "-1", &prefs_common.editaccountwin_height, P_INT,
996          NULL, NULL, NULL},
997
998         {"accountswin_width", "500", &prefs_common.accountswin_width, P_INT,
999          NULL, NULL, NULL},
1000         {"accountswin_height", "-1", &prefs_common.accountswin_height, P_INT,
1001          NULL, NULL, NULL},
1002
1003         {"logwin_width", "520", &prefs_common.logwin_width, P_INT,
1004          NULL, NULL, NULL},
1005         {"logwin_height", "-1", &prefs_common.logwin_height, P_INT,
1006          NULL, NULL, NULL},
1007
1008         {"filtering_debugwin_width", "600", &prefs_common.filtering_debugwin_width, P_INT,
1009          NULL, NULL, NULL},
1010         {"filtering_debugwin_height", "-1", &prefs_common.filtering_debugwin_height, P_INT,
1011          NULL, NULL, NULL},
1012
1013         {"folderselwin_width", "300", &prefs_common.folderselwin_width, P_INT,
1014          NULL, NULL, NULL},
1015         {"folderselwin_height", "-1", &prefs_common.folderselwin_height, P_INT,
1016          NULL, NULL, NULL},
1017
1018         {"addressaddwin_width", "300", &prefs_common.addressaddwin_width, P_INT,
1019          NULL, NULL, NULL},
1020         {"addressaddwin_height", "-1", &prefs_common.addressaddwin_height, P_INT,
1021          NULL, NULL, NULL},
1022
1023         {"addressbook_folderselwin_width", "300", &prefs_common.addressbook_folderselwin_width, P_INT,
1024          NULL, NULL, NULL},
1025         {"addressbook_folderselwin_height", "-1", &prefs_common.addressbook_folderselwin_height, P_INT,
1026          NULL, NULL, NULL},
1027
1028         {"aboutwin_width", "450", &prefs_common.aboutwin_width, P_INT,
1029          NULL, NULL, NULL},
1030         {"aboutwin_height", "500", &prefs_common.aboutwin_height, P_INT,
1031          NULL, NULL, NULL},
1032
1033         /* Hidden */
1034         {"warn_dnd", "1", &prefs_common.warn_dnd, P_INT,
1035          NULL, NULL, NULL},
1036         {"utf8_instead_of_locale_for_broken_mail", "0", 
1037          &prefs_common.broken_are_utf8, P_INT,
1038          NULL, NULL, NULL},
1039         {"enable_swap_from", "FALSE", &prefs_common.swap_from, P_BOOL,
1040          NULL, NULL, NULL},
1041         {"use_stripes_everywhere", "TRUE", &prefs_common.use_stripes_everywhere, P_BOOL,
1042          NULL, NULL, NULL},
1043         {"use_stripes_in_summaries", "TRUE", &prefs_common.use_stripes_in_summaries, P_BOOL,
1044          NULL, NULL, NULL},
1045         {"stripes_color_offset", "4000", &prefs_common.stripes_color_offset, P_INT,
1046          NULL, NULL, NULL},
1047         {"enable_dotted_lines", "FALSE", &prefs_common.enable_dotted_lines, P_BOOL,
1048          NULL, NULL, NULL},
1049         {"enable_hscrollbar", "TRUE", &prefs_common.enable_hscrollbar, P_BOOL,
1050          NULL, NULL, NULL},
1051         {"folderview_vscrollbar_policy", "0",
1052          &prefs_common.folderview_vscrollbar_policy, P_ENUM,
1053          NULL, NULL, NULL},
1054         {"textview_cursor_visible", "FALSE",
1055          &prefs_common.textview_cursor_visible, P_BOOL,
1056          NULL, NULL, NULL},
1057         {"hover_timeout", "500", &prefs_common.hover_timeout, P_INT,
1058          NULL, NULL, NULL},
1059 #ifndef GENERIC_UMPC
1060         {"cache_max_mem_usage", "4096", &prefs_common.cache_max_mem_usage, P_INT,
1061          NULL, NULL, NULL},
1062         {"cache_min_keep_time", "15", &prefs_common.cache_min_keep_time, P_INT,
1063          NULL, NULL, NULL},
1064 #else
1065         {"cache_max_mem_usage", "4096", &prefs_common.cache_max_mem_usage, P_INT,
1066          NULL, NULL, NULL},
1067         {"cache_min_keep_time", "0", &prefs_common.cache_min_keep_time, P_INT,
1068          NULL, NULL, NULL},
1069 #endif
1070         {"thread_by_subject_max_age", "10", &prefs_common.thread_by_subject_max_age,
1071         P_INT, NULL, NULL, NULL },
1072         {"last_opened_folder", "", &prefs_common.last_opened_folder,
1073         P_STRING, NULL, NULL, NULL },
1074         {"goto_last_folder_on_startup", "FALSE", &prefs_common.goto_last_folder_on_startup,
1075         P_BOOL, NULL, NULL, NULL },
1076         {"summary_quicksearch_sticky", "1", &prefs_common.summary_quicksearch_sticky, P_INT,
1077          NULL, NULL, NULL},
1078         {"summary_quicksearch_dynamic", "0", &prefs_common.summary_quicksearch_dynamic, P_INT,
1079          NULL, NULL, NULL},
1080         {"summary_quicksearch_autorun", "0", &prefs_common.summary_quicksearch_autorun, P_INT,
1081          NULL, NULL, NULL},
1082         {"statusbar_update_step", "10", &prefs_common.statusbar_update_step, P_INT,
1083          NULL, NULL, NULL},
1084         {"compose_no_markup", "FALSE", &prefs_common.compose_no_markup, P_BOOL,
1085          NULL, NULL, NULL},
1086         {"skip_ssl_cert_check", "FALSE", &prefs_common.skip_ssl_cert_check, P_BOOL,
1087          NULL, NULL, NULL},
1088         {"live_dangerously", "FALSE", &prefs_common.live_dangerously, P_BOOL,
1089          NULL, NULL, NULL},
1090         {"save_parts_readwrite", "FALSE", &prefs_common.save_parts_readwrite, P_BOOL,
1091          NULL, NULL, NULL},
1092         {"hide_quotes", "0", &prefs_common.hide_quotes, P_INT,
1093          NULL, NULL, NULL},
1094         {"unsafe_ssl_certs", "FALSE", &prefs_common.unsafe_ssl_certs, P_BOOL,
1095          NULL, NULL, NULL},
1096 #ifndef GENERIC_UMPC
1097         {"real_time_sync", "FALSE", &prefs_common.real_time_sync, P_BOOL,
1098          NULL, NULL, NULL},
1099 #else
1100         {"real_time_sync", "TRUE", &prefs_common.real_time_sync, P_BOOL,
1101          NULL, NULL, NULL},
1102 #endif
1103
1104         {"print_paper_type", NULL, &prefs_common.print_paper_type, P_STRING,
1105          NULL, NULL, NULL},
1106         {"print_paper_orientation", "0", &prefs_common.print_paper_orientation, P_INT,
1107          NULL, NULL, NULL},
1108         {"print_margin_top", "-1", &prefs_common.print_margin_top, P_INT,
1109          NULL, NULL, NULL},
1110         {"print_margin_bottom", "-1", &prefs_common.print_margin_bottom, P_INT,
1111          NULL, NULL, NULL},
1112         {"print_margin_left", "-1", &prefs_common.print_margin_left, P_INT,
1113          NULL, NULL, NULL},
1114         {"print_margin_right", "-1", &prefs_common.print_margin_right, P_INT,
1115          NULL, NULL, NULL},
1116         {"print_use_color", "0", &prefs_common.print_use_color, P_INT,
1117          NULL, NULL, NULL},
1118         {"print_use_collate", "0", &prefs_common.print_use_collate, P_INT,
1119          NULL, NULL, NULL},
1120         {"print_use_reverse", "0", &prefs_common.print_use_reverse, P_INT,
1121          NULL, NULL, NULL},
1122         {"print_use_duplex", "0", &prefs_common.print_use_duplex, P_INT,
1123          NULL, NULL, NULL},
1124         {"print_imgs", "1", &prefs_common.print_imgs, P_INT,
1125          NULL, NULL, NULL},
1126         {"print_previewwin_width", "600", &prefs_common.print_previewwin_width, P_INT,
1127          NULL, NULL, NULL},
1128         {"print_previewwin_height", "-1", &prefs_common.print_previewwin_height, P_INT,
1129          NULL, NULL, NULL},
1130         {"use_networkmanager", "TRUE", &prefs_common.use_networkmanager, P_BOOL,
1131          NULL, NULL, NULL},
1132         {"use_shred", "FALSE", &prefs_common.use_shred, P_BOOL,
1133          NULL, NULL, NULL},
1134
1135         {"two_line_vertical", "TRUE", &prefs_common.two_line_vert,
1136         P_BOOL, NULL, NULL, NULL },
1137
1138         {"inherit_folder_properties", "FALSE", &prefs_common.inherit_folder_props, P_BOOL,
1139          NULL, NULL, NULL},
1140
1141         {"flush_metadata", "TRUE", &prefs_common.flush_metadata, P_BOOL,
1142          NULL, NULL, NULL},
1143
1144         {NULL, NULL, NULL, P_OTHER, NULL, NULL, NULL}
1145 };
1146
1147 /*
1148  * Read history list from the specified history file in the specified directory (subdir of rc_dir)
1149  * Fallback to default_list if history file is not found
1150  */
1151 GList *prefs_common_read_history_from_dir_with_defaults(const gchar *dirname, const gchar *history,
1152                                                                                                                           GList *default_list)
1153 {
1154         FILE *fp;
1155         gchar *path;
1156         gchar buf[PREFSBUFSIZE];
1157         GList *tmp = NULL;
1158
1159         if (dirname) {
1160                 path = g_strconcat(get_rc_dir(), G_DIR_SEPARATOR_S, dirname,
1161                                    G_DIR_SEPARATOR_S, history,
1162                                    NULL);
1163         } else {
1164         path = g_strconcat(get_rc_dir(), G_DIR_SEPARATOR_S, history,
1165                            NULL);
1166         }
1167         if ((fp = g_fopen(path, "rb")) == NULL) {
1168                 if (ENOENT != errno) FILE_OP_ERROR(path, "fopen");
1169                 g_free(path);
1170                 /* returns default list if set, otherwise NULL */
1171                 return default_list;
1172         }
1173         g_free(path);
1174         while (fgets(buf, sizeof(buf), fp) != NULL) {
1175                 g_strstrip(buf);
1176                 if (buf[0] == '\0') continue;
1177                 tmp = add_history(tmp, buf);
1178         }
1179         fclose(fp);
1180
1181         tmp = g_list_reverse(tmp);
1182
1183         return tmp;
1184 }
1185
1186 /*
1187  * Read history list from the specified history file in the specified directory (subdir of rc_dir)
1188  */
1189 static GList *prefs_common_read_history_from_dir(const gchar *dirname, const gchar *history) 
1190 {
1191         return prefs_common_read_history_from_dir_with_defaults(dirname, history, NULL);
1192 }
1193
1194 /*
1195  * Read history list from the specified history file
1196  */
1197 static GList *prefs_common_read_history(const gchar *history) 
1198 {
1199         return prefs_common_read_history_from_dir(NULL, history);
1200 }
1201
1202 void prefs_common_read_config(void)
1203 {
1204         gchar *rcpath;
1205         gchar *tmp;
1206
1207         rcpath = g_strconcat(get_rc_dir(), G_DIR_SEPARATOR_S, COMMON_RC, NULL);
1208         prefs_read_config(param, "Common", rcpath, NULL);
1209 #ifdef G_OS_WIN32
1210         prefs_read_config(param_os_specific, "CommonWin32", rcpath, NULL);
1211 #endif
1212
1213         g_free(rcpath);
1214
1215         tmp = g_strdup(gettext(prefs_common.date_format));
1216         g_free(prefs_common.date_format);
1217         prefs_common.date_format = tmp;
1218
1219         prefs_common.mime_open_cmd_history =
1220                 prefs_common_read_history(COMMAND_HISTORY);
1221         prefs_common.summary_quicksearch_history =
1222                 prefs_common_read_history(QUICKSEARCH_HISTORY);
1223         prefs_common.summary_search_from_history =
1224                 prefs_common_read_history(SUMMARY_SEARCH_FROM_HISTORY);
1225         prefs_common.summary_search_to_history =
1226                 prefs_common_read_history(SUMMARY_SEARCH_TO_HISTORY);
1227         prefs_common.summary_search_subject_history =
1228                 prefs_common_read_history(SUMMARY_SEARCH_SUBJECT_HISTORY);
1229         prefs_common.summary_search_body_history =
1230                 prefs_common_read_history(SUMMARY_SEARCH_BODY_HISTORY);
1231         prefs_common.summary_search_adv_condition_history =
1232                 prefs_common_read_history(SUMMARY_SEARCH_ADV_CONDITION_HISTORY);
1233         prefs_common.message_search_history =
1234                 prefs_common_read_history(MESSAGE_SEARCH_HISTORY);
1235         prefs_common.compose_save_to_history =
1236                 prefs_common_read_history(COMPOSE_SAVE_TO_HISTORY);
1237
1238         prefs_common.addressbook_custom_attributes = addressbook_update_custom_attr_from_prefs();
1239
1240         colorlabel_update_colortable_from_prefs();
1241 }
1242
1243 #define TRY(func) \
1244 if (!(func)) \
1245 { \
1246         g_warning("failed to write\n"); \
1247         goto out;                       \
1248 } \
1249
1250 /*
1251  * Save history list to the specified history file in the specified directory (subdir of rc_dir)
1252  */
1253 static void prefs_common_save_history_to_dir(const gchar *dirname, const gchar *history, GList *list)
1254 {
1255         GList *cur;
1256         FILE *fp;
1257         gchar *path, *tmp_path;
1258
1259         if (dirname) {
1260                 path = g_strconcat(get_rc_dir(), G_DIR_SEPARATOR_S, dirname,
1261                                    G_DIR_SEPARATOR_S, history,
1262                                    NULL);
1263         } else {
1264         path = g_strconcat(get_rc_dir(), G_DIR_SEPARATOR_S, history,
1265                            NULL);
1266         }
1267         tmp_path = g_strconcat(path, ".tmp", NULL);
1268
1269         if ((fp = g_fopen(tmp_path, "wb")) == NULL) {
1270                 FILE_OP_ERROR(tmp_path, "fopen");
1271                 goto out;
1272         }
1273
1274         for (cur = list; cur != NULL; cur = cur->next) {
1275                 TRY(fputs((gchar *)cur->data, fp) != EOF &&
1276                     fputc('\n', fp) != EOF);
1277         }
1278
1279         if (fclose(fp) == EOF) {
1280                 FILE_OP_ERROR(tmp_path, "fclose");
1281                 fp = NULL;
1282                 goto out;
1283         }
1284         fp = NULL;
1285 #ifdef G_OS_WIN32
1286         claws_unlink(path);
1287 #endif
1288         if (g_rename(tmp_path, path) < 0) {
1289                 FILE_OP_ERROR(path, "rename");
1290                 goto out;
1291         }
1292
1293 out:
1294         if (fp)
1295                 fclose(fp);
1296         g_free(tmp_path);
1297         g_free(path);
1298 }
1299
1300 /*
1301  * Save history list to the specified history file
1302  */
1303 static void prefs_common_save_history(const gchar *history, GList *list)
1304 {
1305         prefs_common_save_history_to_dir(NULL, history, list);
1306 }
1307
1308 #undef TRY
1309
1310 void prefs_common_write_config(void)
1311 {
1312         prefs_write_config(param, "Common", COMMON_RC);
1313 #ifdef G_OS_WIN32
1314         prefs_write_config(param_os_specific, "CommonWin32", COMMON_RC);
1315 #endif
1316
1317         prefs_common_save_history(COMMAND_HISTORY, 
1318                 prefs_common.mime_open_cmd_history);
1319         prefs_common_save_history(QUICKSEARCH_HISTORY, 
1320                 prefs_common.summary_quicksearch_history);
1321         prefs_common_save_history(SUMMARY_SEARCH_FROM_HISTORY, 
1322                 prefs_common.summary_search_from_history);
1323         prefs_common_save_history(SUMMARY_SEARCH_TO_HISTORY, 
1324                 prefs_common.summary_search_to_history);
1325         prefs_common_save_history(SUMMARY_SEARCH_SUBJECT_HISTORY, 
1326                 prefs_common.summary_search_subject_history);
1327         prefs_common_save_history(SUMMARY_SEARCH_BODY_HISTORY, 
1328                 prefs_common.summary_search_body_history);
1329         prefs_common_save_history(SUMMARY_SEARCH_ADV_CONDITION_HISTORY, 
1330                 prefs_common.summary_search_adv_condition_history);
1331         prefs_common_save_history(MESSAGE_SEARCH_HISTORY, 
1332                 prefs_common.message_search_history);
1333         prefs_common_save_history(COMPOSE_SAVE_TO_HISTORY, 
1334                 prefs_common.compose_save_to_history);
1335
1336         prefs_common_save_history_to_dir(ADDRBOOK_DIR,
1337                 ADDRESSBOOK_CUSTOM_ATTRIBUTES, 
1338                 prefs_common.addressbook_custom_attributes);
1339 }
1340
1341 /* make a copy of string 'in' into buffer 'out'. un-escape \ sequences.
1342    both 'in' and 'out' must be non-NULL.
1343    'out' must be a pointer to a buffer whose size is at least equal
1344    to strlen(txt)+1, this buffer will get cleared. out's contents
1345    will always get set to a valid string, even if it's "".*/
1346 void pref_get_unescaped_pref(gchar *out, const gchar *in)
1347 {
1348         const gchar *i;
1349         gchar *o;
1350
1351         *out = '\0';
1352
1353         cm_return_if_fail( in != NULL );
1354         cm_return_if_fail( out != NULL );
1355
1356         i = in;
1357         o = out;
1358         memset(out, 0, strlen(in)+1);
1359         while (*i != '\0') {
1360                 if (*i == '\\' && *(i+1) == 'n') {
1361                         *o++ = '\n';
1362                         i++;
1363                 } else if (*i == '\\' && *(i+1) == 't') {
1364                         *o++ = '\t';
1365                         i++;
1366                 } else if (*i == '\\' && *(i+1) == '\\') {
1367                         *o++ = '\\';
1368                         i++;
1369                 } else {
1370                         *o++ = *i;
1371                 }
1372                 i++;
1373         }
1374         *o='\0';
1375 }
1376
1377 /* make a copy of string 'in' into buffer 'out'. escape \ sequences.
1378    both 'in' and 'out' must be non-NULL.
1379    'out' must be a pointer to a buffer whose size is at least equal
1380    to 2*strlen(txt)+1. out's contents will always get set to a valid
1381    string, even if it's "". */
1382 void pref_get_escaped_pref(gchar *out, const gchar *in)
1383 {
1384         const gchar *i;
1385         gchar *o;
1386
1387         *out = '\0';
1388
1389         cm_return_if_fail( in != NULL );
1390         cm_return_if_fail( out != NULL );
1391
1392         i = in;
1393         o = out;
1394         while (*i != '\0') {
1395                 if (*i == '\n') {
1396                         *o++ = '\\';
1397                         *o++ = 'n';
1398                 } else if (*i == '\t') {
1399                         *o++ = '\\';
1400                         *o++ = 't';
1401                 } else if (*i == '\\') {
1402                         *o++ = '\\';
1403                         *o++ = '\\';
1404                 } else {
1405                         *o++ = *i;
1406                 }
1407                 i++;
1408         }
1409         *o = '\0';
1410 }
1411                 
1412 /* set the contents of a textview widget from the internal \-escaped
1413   representation of a pref string. both txt and textview must be non-NULL. */
1414 void pref_set_textview_from_pref(GtkTextView *textview, const gchar *txt)
1415 {
1416         GtkTextBuffer *buffer;
1417         gchar *out = NULL;
1418
1419         cm_return_if_fail( textview != NULL );
1420
1421         buffer = gtk_text_view_get_buffer(textview);
1422
1423         if (!txt) {
1424                 gtk_text_buffer_set_text(buffer, "", -1);
1425         } else {
1426                 out = malloc(strlen(txt)+1);
1427
1428                 pref_get_unescaped_pref(out, txt);
1429
1430                 gtk_text_buffer_set_text(buffer, out?out:"", -1);
1431                 g_free(out);
1432         }
1433 }
1434
1435 /* set the contents of a gtkentry widget from the internal \-escaped
1436   representation of a pref string. both txt and entry must be non-NULL. */
1437 void pref_set_entry_from_pref(GtkEntry *entry, const gchar *txt)
1438 {
1439         gchar *out = NULL;
1440
1441         cm_return_if_fail( entry != NULL );
1442         if (!txt) {
1443                 gtk_entry_set_text(entry, "");
1444         } else {
1445                 out = malloc(strlen(txt)+1);
1446
1447                 pref_get_unescaped_pref(out, txt);
1448
1449                 gtk_entry_set_text(entry, out?out:"");
1450                 g_free(out);
1451         }
1452 }
1453
1454 /* get the \-escaped internal representation of a pref from the contents of
1455    a textview widget. textview must be non-NULL. */
1456 gchar *pref_get_pref_from_textview(GtkTextView *textview) 
1457 {
1458         GtkTextBuffer *buffer;
1459         GtkTextIter start, end;
1460         gchar *out, *tmp;
1461         
1462         cm_return_val_if_fail( textview != NULL, "" );
1463
1464         buffer = gtk_text_view_get_buffer(textview);
1465         gtk_text_buffer_get_start_iter(buffer, &start);
1466         gtk_text_buffer_get_iter_at_offset(buffer, &end, -1);
1467         tmp = gtk_text_buffer_get_text(buffer, &start, &end, FALSE);
1468         out = malloc(2*strlen(tmp)+1);
1469         if (out)
1470                 pref_get_escaped_pref(out, tmp);
1471         g_free(tmp);
1472
1473         return out?out:"";
1474 }
1475
1476 /* get the \-escaped internal representation of a pref from the contents of
1477    a gtkentry widget. entry must be non-NULL. */
1478 gchar *pref_get_pref_from_entry(GtkEntry *entry) 
1479 {
1480         gchar *out, *tmp;
1481
1482         cm_return_val_if_fail( entry != NULL, "" );
1483
1484         tmp = gtk_editable_get_chars(GTK_EDITABLE(entry), 0, -1);
1485         out = malloc(2*strlen(tmp)+1);
1486         
1487         if (out)
1488                 pref_get_escaped_pref(out, tmp);
1489         g_free(tmp);
1490
1491         return out?out:"";
1492 }
1493
1494 /* ugly hack to be able to get this pref from ssl_certificate.c */
1495 gboolean prefs_common_unsafe_ssl_certs(void)
1496 {
1497         return prefs_common.unsafe_ssl_certs;
1498 }
1499
1500 gboolean prefs_common_enable_log_standard(void)
1501 {
1502         return prefs_common.enable_log_standard;
1503 }
1504
1505 gboolean prefs_common_enable_log_warning(void)
1506 {
1507         return prefs_common.enable_log_warning;
1508 }
1509 gboolean prefs_common_enable_log_error(void)
1510 {
1511         return prefs_common.enable_log_error;
1512 }
1513 gboolean prefs_common_enable_log_status(void)
1514 {
1515         return prefs_common.enable_log_status;
1516 }
1517
1518 #ifdef MAEMO
1519 const gchar *prefs_common_get_data_root(void)
1520 {
1521         if (prefs_common.data_root && *prefs_common.data_root)
1522                 return prefs_common.data_root;
1523         else
1524                 return NULL;
1525 }
1526 #endif
1527 /**
1528    return the translated name of a header, if the translate_header option is
1529    set, otherwise return the untranslated header name (header_name itself).
1530    this function is provided for convenience, it's an interface to
1531    prefs_common.trans_hdr.
1532    works with header names either with or without trailing colon, provided
1533    that gettext found such header name in the sources (they should all be
1534    found in src/gtk/headers.h anyway).
1535 */
1536 const gchar *prefs_common_translated_header_name(const gchar *header_name)
1537 {
1538         if (header_name == NULL || *header_name == '\0')
1539                 return header_name;
1540
1541         return prefs_common.trans_hdr ? gettext(header_name) : header_name;
1542 }
1543
1544 const gchar *prefs_common_get_uri_cmd(void)
1545 {
1546 #ifdef G_OS_WIN32
1547         return NULL;
1548 #else
1549         gchar *tmp = NULL;
1550         
1551         if (!prefs_common.cmds_use_system_default)
1552                 return prefs_common.uri_cmd;
1553         
1554         tmp = g_find_program_in_path("xdg-open");
1555         if (!tmp) 
1556                 return prefs_common.uri_cmd;
1557         
1558         g_free(tmp);
1559         return "xdg-open %s";
1560 #endif
1561 }
1562
1563 const gchar *prefs_common_get_ext_editor_cmd(void)
1564 {
1565         return prefs_common.ext_editor_cmd;
1566 #if 0 /* we should do that, but it detaches the editor and breaks
1567          compose.c's external composition. */
1568         gchar *tmp = NULL;
1569         
1570         if (!prefs_common.cmds_use_system_default)
1571                 return prefs_common.ext_editor_cmd;
1572         
1573         tmp = g_find_program_in_path("xdg-open");
1574         if (!tmp) 
1575                 return prefs_common.ext_editor_cmd;
1576         
1577         g_free(tmp);
1578         return "xdg-open %s";
1579 #endif 
1580 }
1581
1582 gboolean prefs_common_get_use_shred(void)
1583 {
1584         return prefs_common.use_shred;
1585 }
1586
1587 gboolean prefs_common_get_flush_metadata (void)
1588 {
1589         return prefs_common.flush_metadata;
1590 }
1591
1592 PrefsCommon *prefs_common_get_prefs(void)
1593 {
1594         return &prefs_common;
1595 }