21d886767b55abd55eeb91af150a413241b3168c
[claws.git] / src / prefs_common.c
1 /*
2  * Sylpheed -- a GTK+ based, lightweight, and fast e-mail client
3  * Copyright (C) 1999-2012 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 #include "claws-features.h"
23 #endif
24
25 #include "defs.h"
26
27 #include <glib.h>
28 #include <glib/gi18n.h>
29 #include <gtk/gtk.h>
30 #include <gdk/gdkkeysyms.h>
31 #include <stdio.h>
32 #include <stdlib.h>
33 #include <string.h>
34 #include <unistd.h>
35 #include <sys/types.h>
36 #include <sys/stat.h>
37 #include <errno.h>
38
39 #include "main.h"
40 #include "prefs_gtk.h"
41 #include "prefs_common.h"
42 #include "prefs_display_header.h"
43 #include "prefs_summary_column.h"
44 #include "prefs_folder_column.h"
45 #include "mainwindow.h"
46 #include "summaryview.h"
47 #include "folderview.h"
48 #include "messageview.h"
49 #include "manage_window.h"
50 #include "inc.h"
51 #include "menu.h"
52 #include "codeconv.h"
53 #include "utils.h"
54 #include "gtkutils.h"
55 #include "alertpanel.h"
56 #include "folder.h"
57 #include "socket.h"
58 #include "filesel.h"
59 #include "folderview.h"
60 #include "stock_pixmap.h"
61 #include "prefswindow.h"
62 #include "colorlabel.h"
63 #ifndef USE_NEW_ADDRBOOK
64         #include "addrcustomattr.h"
65 #endif
66
67 enum {
68         DATEFMT_FMT,
69         DATEFMT_TXT,
70         N_DATEFMT_COLUMNS
71 };
72
73 PrefsCommon prefs_common;
74
75 GtkWidget *notebook;
76
77 #ifdef G_OS_WIN32
78 /*
79  * In the Windows version prefs_common contains
80  *   - the non-OS-specific settings of the "Common" section and
81  *   - the OS-specific settings of the "CommonWin32" section
82  * The OS-specific settings of the "Common" section are not used
83  * but saved in prefs_unix.
84  */
85
86 #  define SPECIFIC_PREFS prefs_unix
87
88 static PrefsCommon prefs_unix;
89
90 static PrefParam param_os_specific[] = {
91         /* Receive */
92         {"ext_inc_path", "",
93          &prefs_common.extinc_cmd, P_STRING, NULL, NULL, NULL},
94         {"newmail_notify_cmd", "",
95          &prefs_common.newmail_notify_cmd, P_STRING, NULL, NULL, NULL},
96
97         /* new fonts */
98         {"message_font_gtk2",   "Monospace 9",
99          &prefs_common.textfont,                P_STRING, NULL, NULL, NULL},
100         {"print_font_gtk2",     "Monospace 9",
101          &prefs_common.printfont,               P_STRING, NULL, NULL, NULL},
102         {"small_font_gtk2",     "Sans 9",
103           &prefs_common.smallfont,              P_STRING, NULL, NULL, NULL},
104         {"normal_font_gtk2",    "Sans 9",
105           &prefs_common.normalfont,             P_STRING, NULL, NULL, NULL},
106         {"bold_font_gtk2",      "Sans 9 Bold",
107           &prefs_common.boldfont,               P_STRING, NULL, NULL, NULL},
108         /* Message */
109         {"attach_save_directory", NULL,
110          &prefs_common.attach_save_dir, P_STRING, NULL, NULL, NULL},
111         {"attach_load_directory", NULL,
112          &prefs_common.attach_load_dir, P_STRING, NULL, NULL, NULL},
113
114         /* MIME viewer */
115         {"mime_textviewer", NULL,
116          &prefs_common.mime_textviewer,   P_STRING, NULL, NULL, NULL},
117         {"mime_open_command", "notepad '%s'",
118          &prefs_common.mime_open_cmd,     P_STRING, NULL, NULL, NULL},
119
120         /* Interface */
121         {"pixmap_theme_path", DEFAULT_PIXMAP_THEME, 
122          &prefs_common.pixmap_theme_path, P_STRING, NULL, NULL, NULL},
123
124         /* Other */
125         {"ext_editor_command", "notepad %s",
126          &prefs_common.ext_editor_cmd, P_STRING, NULL, NULL, NULL},
127
128         {NULL, NULL, NULL, P_OTHER, NULL, NULL, NULL}
129 };
130 #else
131 #  define SPECIFIC_PREFS prefs_common
132 #endif
133
134 /*
135    parameter name, default value, pointer to the prefs variable, data type,
136    pointer to the widget pointer,
137    pointer to the function for data setting,
138    pointer to the function for widget setting
139  */
140
141 static PrefParam param[] = {
142 #ifdef MAEMO
143         {"data_root", "", &prefs_common.data_root, P_STRING,
144          NULL, NULL, NULL},
145 #endif
146         /* Receive */
147         {"use_ext_inc", "FALSE", &prefs_common.use_extinc, P_BOOL,
148          NULL, NULL, NULL},
149         {"ext_inc_path", DEFAULT_INC_PATH, &SPECIFIC_PREFS.extinc_cmd, P_STRING,
150          NULL, NULL, NULL},
151
152         {"autochk_newmail", "FALSE", &prefs_common.autochk_newmail, P_BOOL,
153          NULL, NULL, NULL},
154         {"autochk_interval", "10", &prefs_common.autochk_itv, P_INT,
155          NULL, NULL, NULL},
156         {"check_on_startup", "FALSE", &prefs_common.chk_on_startup, P_BOOL,
157          NULL, NULL, NULL},
158         {"open_inbox_on_inc", "FALSE", &prefs_common.open_inbox_on_inc,
159          P_BOOL, NULL, NULL, NULL},
160         {"scan_all_after_inc", "FALSE", &prefs_common.scan_all_after_inc,
161          P_BOOL, NULL, NULL, NULL},
162         {"newmail_notify_manu", "FALSE", &prefs_common.newmail_notify_manu,
163          P_BOOL, NULL, NULL, NULL},
164         {"newmail_notify_auto", "FALSE", &prefs_common.newmail_notify_auto,
165         P_BOOL, NULL, NULL, NULL},
166         {"newmail_notify_cmd", "", &SPECIFIC_PREFS.newmail_notify_cmd, P_STRING,
167          NULL, NULL, NULL},
168 #ifdef MAEMO
169         {"maemo_show_led", "TRUE", &prefs_common.maemo_show_led, P_BOOL,
170          NULL, NULL, NULL},
171         {"maemo_play_sound", "FALSE", &prefs_common.maemo_play_sound, P_BOOL,
172          NULL, NULL, NULL},
173         {"maemo_show_banner", "FALSE", &prefs_common.maemo_show_banner, P_BOOL,
174          NULL, NULL, NULL},
175 #endif
176         {"receive_dialog_mode", "2", &prefs_common.recv_dialog_mode, P_ENUM,
177          NULL, NULL, NULL},
178         {"receivewin_width", "460", &prefs_common.receivewin_width, P_INT,
179          NULL, NULL, NULL},
180         {"receivewin_height", "-1", &prefs_common.receivewin_height, P_INT,
181          NULL, NULL, NULL},
182         {"no_receive_error_panel", "FALSE", &prefs_common.no_recv_err_panel,
183          P_BOOL, NULL, NULL, NULL},
184         {"close_receive_dialog", "TRUE", &prefs_common.close_recv_dialog,
185          P_BOOL, NULL, NULL, NULL},
186  
187         /* Send */
188         {"save_message", "TRUE", &prefs_common.savemsg, P_BOOL,
189          NULL, NULL, NULL},
190         {"confirm_send_queued_messages", "FALSE", &prefs_common.confirm_send_queued_messages,
191          P_BOOL, NULL, NULL, NULL},
192 #ifndef GENERIC_UMPC
193         {"send_dialog_mode", "0", &prefs_common.send_dialog_invisible, P_BOOL,
194          NULL, NULL, NULL},
195 #else
196         {"send_dialog_mode", "1", &prefs_common.send_dialog_invisible, P_BOOL,
197          NULL, NULL, NULL},
198 #endif
199         {"sendwin_width", "460", &prefs_common.sendwin_width, P_INT,
200          NULL, NULL, NULL},
201         {"sendwin_height", "-1", &prefs_common.sendwin_height, P_INT,
202          NULL, NULL, NULL},
203
204         {"outgoing_charset", CS_AUTO, &prefs_common.outgoing_charset, P_STRING,
205          NULL, NULL, NULL},
206         {"encoding_method", "0", &prefs_common.encoding_method, P_ENUM,
207          NULL, NULL, NULL},
208         {"outgoing_fallback_to_ascii", "TRUE", &prefs_common.outgoing_fallback_to_ascii, P_BOOL,
209          NULL, NULL, NULL},
210
211         {"allow_jisx0201_kana", "FALSE", &prefs_common.allow_jisx0201_kana,
212          P_BOOL, NULL, NULL, NULL},
213
214         /* Compose */
215         {"auto_ext_editor", "FALSE", &prefs_common.auto_exteditor, P_BOOL,
216          NULL, NULL, NULL},
217         {"forward_as_attachment", "FALSE", &prefs_common.forward_as_attachment,
218          P_BOOL, NULL, NULL, NULL},
219         {"redirect_keep_from", "FALSE",
220          &prefs_common.redirect_keep_from, P_BOOL,
221          NULL, NULL, NULL},
222         {"undo_level", "50", &prefs_common.undolevels, P_INT,
223          NULL, NULL, NULL},
224         {"compose_with_format", "FALSE", &prefs_common.compose_with_format, P_BOOL,
225          NULL, NULL, NULL},
226         {"compose_subject_format", "",
227          &prefs_common.compose_subject_format, P_STRING, NULL, NULL, NULL},
228         {"compose_body_format", N_("Hello,\\n"),
229          &prefs_common.compose_body_format, P_STRING, NULL, NULL, NULL},
230         {"show_compose_margin", "FALSE", &prefs_common.show_compose_margin, P_BOOL,
231          NULL, NULL, NULL},
232         
233
234         {"linewrap_length", "72", &prefs_common.linewrap_len, P_INT,
235          NULL, NULL, NULL},
236         {"linewrap_quotation", "TRUE", &prefs_common.linewrap_quote, P_BOOL,
237          NULL, NULL, NULL},
238         {"linewrap_pastes", "TRUE", &prefs_common.linewrap_pastes, P_BOOL,
239          NULL, NULL, NULL},
240         {"primary_paste_unselects", "FALSE", &prefs_common.primary_paste_unselects, P_BOOL,
241          NULL, NULL, NULL},
242         {"linewrap_auto", "TRUE", &prefs_common.autowrap, P_BOOL,
243          NULL, NULL, NULL},
244         {"auto_indent", "TRUE", &prefs_common.auto_indent, P_BOOL,
245          NULL, NULL, NULL},
246         {"autosave", "TRUE", &prefs_common.autosave,
247          P_BOOL, NULL, NULL, NULL},
248         {"autosave_length", "50", &prefs_common.autosave_length, P_INT,
249          NULL, NULL, NULL},
250         {"warn_large_insert", "TRUE", &prefs_common.warn_large_insert,
251          P_BOOL, NULL, NULL, NULL},
252         {"warn_large_insert_size", "500", &prefs_common.warn_large_insert_size,
253          P_INT, NULL, NULL, NULL},
254
255         {"enable_aspell", "TRUE", &prefs_common.enable_aspell, P_BOOL,
256          NULL, NULL, NULL},
257         {"dictionary",  "", &prefs_common.dictionary, P_STRING,
258          NULL, NULL, NULL},
259         {"alt_dictionary",  "", &prefs_common.alt_dictionary, P_STRING,
260          NULL, NULL, NULL},
261         {"use_alternate_dict", "FALSE", &prefs_common.use_alternate, P_BOOL,
262          NULL, NULL, NULL},
263         {"check_while_typing", "TRUE", &prefs_common.check_while_typing, P_BOOL,
264          NULL, NULL, NULL},
265         {"recheck_when_changing_dict", "TRUE", &prefs_common.recheck_when_changing_dict,
266          P_BOOL, NULL, NULL, NULL},
267         {"misspelled_color", "#ff0000", &prefs_common.misspelled_col, P_COLOR,
268          NULL, NULL, NULL},
269         {"use_both_dicts", "FALSE", &prefs_common.use_both_dicts, P_BOOL,
270          NULL, NULL, NULL},
271
272         {"reply_with_quote", "TRUE", &prefs_common.reply_with_quote, P_BOOL,
273          NULL, NULL, NULL},
274         {"compose_dnd_insert_or_attach", "0", &prefs_common.compose_dnd_mode, P_ENUM,
275          NULL, NULL, NULL},
276
277         /* Account autoselection */
278         {"reply_account_autoselect", "TRUE",
279          &prefs_common.reply_account_autosel, P_BOOL,
280          NULL, NULL, NULL},
281         {"forward_account_autoselect", "TRUE",
282          &prefs_common.forward_account_autosel, P_BOOL,
283          NULL, NULL, NULL},
284         {"reedit_account_autoselect", "TRUE",
285          &prefs_common.reedit_account_autosel, P_BOOL,
286          NULL, NULL, NULL},
287
288         {"default_reply_list", "TRUE", &prefs_common.default_reply_list, P_BOOL,
289          NULL, NULL, NULL},
290
291 #ifndef GENERIC_UMPC
292         {"show_ruler", "TRUE", &prefs_common.show_ruler, P_BOOL,
293          NULL, NULL, NULL},
294 #else
295         {"show_ruler", "FALSE", &prefs_common.show_ruler, P_BOOL,
296          NULL, NULL, NULL},
297 #endif
298
299         /* Quote */
300         {"reply_quote_mark", "> ", &prefs_common.quotemark, P_STRING,
301          NULL, NULL, NULL},
302         {"reply_quote_format", N_("On %d\\n%f wrote:\\n\\n%q\\n%X"),
303          &prefs_common.quotefmt, P_STRING, NULL, NULL, NULL},
304
305         {"forward_quote_mark", "> ", &prefs_common.fw_quotemark, P_STRING,
306          NULL, NULL, NULL},
307         {"forward_quote_format",
308          N_("\\n\\nBegin forwarded message:\\n\\n"
309          "?d{Date: %d\\n}?f{From: %f\\n}?t{To: %t\\n}?c{Cc: %c\\n}"
310          "?n{Newsgroups: %n\\n}?s{Subject: %s\\n}\\n\\n%M"),
311          &prefs_common.fw_quotefmt, P_STRING,
312          NULL, NULL, NULL},
313         {"quote_chars", ">", &prefs_common.quote_chars, P_STRING,
314          NULL, NULL, NULL},
315
316         /* Display */
317         /* Obsolete fonts. For coexisting with Gtk+-1.2 version */
318         {"message_font",        "-misc-fixed-medium-r-normal--14-*-*-*-*-*-*-*",
319          &prefs_common.textfont_gtk1,           P_STRING, NULL, NULL, NULL},
320         {"small_font",          "-*-helvetica-medium-r-normal--10-*-*-*-*-*-*-*",
321           &prefs_common.smallfont_gtk1,         P_STRING, NULL, NULL, NULL},
322         {"bold_font",           "-*-helvetica-bold-r-normal--12-*-*-*-*-*-*-*",
323           &prefs_common.boldfont_gtk1,          P_STRING, NULL, NULL, NULL},
324         {"normal_font",         "-*-helvetica-medium-r-normal--12-*-*-*-*-*-*-*",
325           &prefs_common.normalfont_gtk1,        P_STRING, NULL, NULL, NULL},
326
327         /* new fonts */
328 #ifndef GENERIC_UMPC
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         {"message_font_gtk2",   "Monospace 8",
341          &SPECIFIC_PREFS.textfont,                      P_STRING, NULL, NULL, NULL},
342         {"print_font_gtk2",     "Monospace 8",
343          &SPECIFIC_PREFS.printfont,             P_STRING, NULL, NULL, NULL},
344         {"small_font_gtk2",     "Sans 8",
345           &SPECIFIC_PREFS.smallfont,            P_STRING, NULL, NULL, NULL},
346         {"normal_font_gtk2",    "Sans 8",
347           &SPECIFIC_PREFS.normalfont,           P_STRING, NULL, NULL, NULL},
348         {"bold_font_gtk2",      "Sans Bold 8",
349           &SPECIFIC_PREFS.boldfont,             P_STRING, NULL, NULL, NULL},
350 #endif
351
352         {"use_different_print_font", "FALSE", &prefs_common.use_different_print_font, P_BOOL,
353          NULL, NULL, NULL},
354         {"derive_from_normal_font", "TRUE", &prefs_common.derive_from_normal_font, P_BOOL,
355          NULL, NULL, NULL},
356
357         /* custom colors */
358         {"custom_color1", "#ff9900", &prefs_common.custom_colorlabel[0].color, P_COLOR,
359          NULL, NULL, NULL},
360         {"custom_colorlabel1", N_("Orange"), &prefs_common.custom_colorlabel[0].label, P_STRING,
361          NULL, NULL, NULL},
362         {"custom_color2", "#ff0000", &prefs_common.custom_colorlabel[1].color, P_COLOR,
363          NULL, NULL, NULL},
364         {"custom_colorlabel2", N_("Red"), &prefs_common.custom_colorlabel[1].label, P_STRING,
365          NULL, NULL, NULL},
366         {"custom_color3", "#ff66ff", &prefs_common.custom_colorlabel[2].color, P_COLOR,
367          NULL, NULL, NULL},
368         {"custom_colorlabel3", N_("Pink"), &prefs_common.custom_colorlabel[2].label, P_STRING,
369          NULL, NULL, NULL},
370         {"custom_color4", "#00ccff", &prefs_common.custom_colorlabel[3].color, P_COLOR,
371          NULL, NULL, NULL},
372         {"custom_colorlabel4", N_("Sky blue"), &prefs_common.custom_colorlabel[3].label, P_STRING,
373          NULL, NULL, NULL},
374         {"custom_color5", "#0000ff", &prefs_common.custom_colorlabel[4].color, P_COLOR,
375          NULL, NULL, NULL},
376         {"custom_colorlabel5", N_("Blue"), &prefs_common.custom_colorlabel[4].label, P_STRING,
377          NULL, NULL, NULL},
378         {"custom_color6", "#009900", &prefs_common.custom_colorlabel[5].color, P_COLOR,
379          NULL, NULL, NULL},
380         {"custom_colorlabel6", N_("Green"), &prefs_common.custom_colorlabel[5].label, P_STRING,
381          NULL, NULL, NULL},
382         {"custom_color7", "#663333", &prefs_common.custom_colorlabel[6].color, P_COLOR,
383          NULL, NULL, NULL},
384         {"custom_colorlabel7", N_("Brown"), &prefs_common.custom_colorlabel[6].label, P_STRING,
385          NULL, NULL, NULL},
386         {"custom_color8", "#aaaaaa", &prefs_common.custom_colorlabel[7].color, P_COLOR,
387          NULL, NULL, NULL},
388         {"custom_colorlabel8", N_("Grey"), &prefs_common.custom_colorlabel[7].label, P_STRING,
389          NULL, NULL, NULL},
390         {"custom_color9", "#c07254", &prefs_common.custom_colorlabel[8].color, P_COLOR,
391          NULL, NULL, NULL},
392         {"custom_colorlabel9", N_("Light brown"), &prefs_common.custom_colorlabel[8].label, P_STRING,
393          NULL, NULL, NULL},
394         {"custom_color10", "#c00000", &prefs_common.custom_colorlabel[9].color, P_COLOR,
395          NULL, NULL, NULL},
396         {"custom_colorlabel10", N_("Dark red"), &prefs_common.custom_colorlabel[9].label, P_STRING,
397          NULL, NULL, NULL},
398         {"custom_color11", "#cc1074", &prefs_common.custom_colorlabel[10].color, P_COLOR,
399          NULL, NULL, NULL},
400         {"custom_colorlabel11", N_("Dark pink"), &prefs_common.custom_colorlabel[10].label, P_STRING,
401          NULL, NULL, NULL},
402         {"custom_color12", "#5094cd", &prefs_common.custom_colorlabel[11].color, P_COLOR,
403          NULL, NULL, NULL},
404         {"custom_colorlabel12", N_("Steel blue"), &prefs_common.custom_colorlabel[11].label, P_STRING,
405          NULL, NULL, NULL},
406         {"custom_color13", "#ffd500", &prefs_common.custom_colorlabel[12].color, P_COLOR,
407          NULL, NULL, NULL},
408         {"custom_colorlabel13", N_("Gold"), &prefs_common.custom_colorlabel[12].label, P_STRING,
409          NULL, NULL, NULL},
410         {"custom_color14", "#00d800", &prefs_common.custom_colorlabel[13].color, P_COLOR,
411          NULL, NULL, NULL},
412         {"custom_colorlabel14", N_("Bright green"), &prefs_common.custom_colorlabel[13].label, P_STRING,
413          NULL, NULL, NULL},
414         {"custom_color15", "#c060c0", &prefs_common.custom_colorlabel[14].color, P_COLOR,
415          NULL, NULL, NULL},
416         {"custom_colorlabel15", N_("Magenta"), &prefs_common.custom_colorlabel[14].label, P_STRING,
417          NULL, NULL, NULL},
418
419         /* image viewer */
420         {"display_image", "TRUE", &prefs_common.display_img, P_BOOL,
421          NULL, NULL, NULL},
422         {"resize_image", "TRUE", &prefs_common.resize_img, P_BOOL,
423          NULL, NULL, NULL},
424         {"inline_image", "TRUE", &prefs_common.inline_img, P_BOOL,
425          NULL, NULL, NULL},
426
427         {"display_folder_unread_num", "0",
428          &prefs_common.display_folder_unread, P_INT,
429          NULL, NULL, NULL},
430         {"newsgroup_abbrev_len", "16",
431          &prefs_common.ng_abbrev_len, P_INT,
432          NULL, NULL, NULL},
433
434         {"translate_header", "FALSE", &prefs_common.trans_hdr, P_BOOL,
435          NULL, NULL, NULL},
436
437         /* Display: Summary View */
438         {"use_address_book", "FALSE", &prefs_common.use_addr_book, P_BOOL,
439          NULL, NULL, NULL},
440         {"thread_by_subject", "TRUE", &prefs_common.thread_by_subject, P_BOOL,
441          NULL, NULL, NULL},
442         {"date_format", N_("%x(%a) %H:%M"), &prefs_common.date_format,
443          P_STRING, NULL, NULL, NULL},
444         {"msgview_date_format", "FALSE", &prefs_common.msgview_date_format, P_BOOL,
445          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         {"mimeview_tree_height", "60", &prefs_common.mimeview_tree_height, P_INT,
651          NULL, NULL, NULL},      
652         {"sourcewin_width", "600", &prefs_common.sourcewin_width, P_INT,
653          NULL, NULL, NULL},
654         {"sourcewin_height", "500", &prefs_common.sourcewin_height, P_INT,
655          NULL, NULL, NULL},
656         {"compose_width", "600", &prefs_common.compose_width, P_INT,
657          NULL, NULL, NULL},
658         {"compose_height", "560", &prefs_common.compose_height, P_INT,
659          NULL, NULL, NULL},
660 #else
661         {"mainwin_width", "700", &prefs_common.mainwin_width, P_INT,
662          NULL, NULL, NULL},
663         {"mainwin_height", "470", &prefs_common.mainwin_height, P_INT,
664          NULL, NULL, NULL},
665         {"messagewin_width", "700", &prefs_common.msgwin_width, P_INT,
666          NULL, NULL, NULL},
667         {"messagewin_height", "470", &prefs_common.msgwin_height, P_INT,
668          NULL, NULL, NULL},
669         {"sourcewin_width", "700", &prefs_common.sourcewin_width, P_INT,
670          NULL, NULL, NULL},
671         {"sourcewin_height", "470", &prefs_common.sourcewin_height, P_INT,
672          NULL, NULL, NULL},
673         {"compose_width", "700", &prefs_common.compose_width, P_INT,
674          NULL, NULL, NULL},
675         {"compose_height", "470", &prefs_common.compose_height, P_INT,
676          NULL, NULL, NULL},
677 #endif
678         {"compose_notebook_height", "130", &prefs_common.compose_notebook_height, P_INT,
679          NULL, NULL, NULL},
680         {"compose_x", "0", &prefs_common.compose_x, P_INT,
681          NULL, NULL, NULL},
682         {"compose_y", "0", &prefs_common.compose_y, P_INT,
683          NULL, NULL, NULL},
684         /* Message */
685         {"enable_color", "TRUE", &prefs_common.enable_color, P_BOOL,
686          NULL, NULL, NULL},
687
688         {"quote_level1_color", "#0000b3", &prefs_common.quote_level1_col, P_COLOR,
689          NULL, NULL, NULL},
690         {"quote_level2_color", "#0000b3", &prefs_common.quote_level2_col, P_COLOR,
691          NULL, NULL, NULL},
692         {"quote_level3_color", "#0000b3", &prefs_common.quote_level3_col, P_COLOR,
693          NULL, NULL, NULL},
694         {"enable_bgcolor", "FALSE", &prefs_common.enable_bgcolor, P_BOOL,
695          NULL, NULL, NULL},
696         {"quote_level1_bgcolor", "#cccccc", &prefs_common.quote_level1_bgcol, P_COLOR,
697          NULL, NULL, NULL},
698         {"quote_level2_bgcolor", "#d4d4d4", &prefs_common.quote_level2_bgcol, P_COLOR,
699          NULL, NULL, NULL},
700         {"quote_level3_bgcolor", "#dddddd", &prefs_common.quote_level3_bgcol, P_COLOR,
701          NULL, NULL, NULL},
702         {"uri_color", "#007f00", &prefs_common.uri_col, P_COLOR,
703          NULL, NULL, NULL},
704         {"emphasis_color", "#0000cf", &prefs_common.emphasis_col, P_COLOR,
705          NULL, NULL, NULL},
706         {"target_folder_color", "#da1cca", &prefs_common.tgt_folder_col, P_COLOR,
707          NULL, NULL, NULL},
708         {"signature_color", "#797979", &prefs_common.signature_col, P_COLOR,
709          NULL, NULL, NULL},
710         {"recycle_quote_colors", "FALSE", &prefs_common.recycle_quote_colors,
711          P_BOOL, NULL, NULL, NULL},
712
713         {"display_header_pane", "FALSE", &prefs_common.display_header_pane,
714          P_BOOL, NULL, NULL, NULL},
715         {"display_header", "TRUE", &prefs_common.display_header, P_BOOL,
716          NULL, NULL, NULL},
717         {"display_xface", "TRUE", &prefs_common.display_xface,
718          P_BOOL, NULL, NULL, NULL},
719         {"render_html", "TRUE", &prefs_common.render_html, P_BOOL,
720          NULL, NULL, NULL},
721         {"invoke_plugin_on_html", "FALSE", &prefs_common.invoke_plugin_on_html, P_BOOL,
722          NULL, NULL, NULL},
723         {"promote_html_part", "FALSE", &prefs_common.promote_html_part, P_BOOL,
724          NULL, NULL, NULL},
725         {"line_space", "2", &prefs_common.line_space, P_INT,
726          NULL, NULL, NULL},
727         {"never_send_retrcpt", "FALSE", &prefs_common.never_send_retrcpt, P_BOOL,
728          NULL, NULL, NULL},
729
730         {"enable_smooth_scroll", "FALSE",
731          &prefs_common.enable_smooth_scroll, P_BOOL,
732          NULL, NULL, NULL},
733         {"scroll_step", "1", &prefs_common.scroll_step, P_INT,
734          NULL, NULL, NULL},
735         {"scroll_half_page", "FALSE", &prefs_common.scroll_halfpage, P_BOOL,
736          NULL, NULL, NULL},
737         {"hide_quoted", "TRUE",
738          &prefs_common.hide_quoted, P_BOOL,
739          NULL, NULL, NULL},
740         {"respect_flowed_format", "FALSE", &prefs_common.respect_flowed_format, P_BOOL,
741          NULL, NULL, NULL},
742         {"show_all_headers", "FALSE", &prefs_common.show_all_headers, P_BOOL,
743          NULL, NULL, NULL},
744
745         {"show_other_header", "FALSE", &prefs_common.show_other_header, P_BOOL,
746          NULL, NULL, NULL},
747
748         {"attach_desc", "TRUE", &prefs_common.attach_desc, P_BOOL,
749          NULL, NULL, NULL},
750         {"attach_save_directory", NULL,
751          &SPECIFIC_PREFS.attach_save_dir, P_STRING, NULL, NULL, NULL},
752         {"attach_load_directory", NULL,
753          &SPECIFIC_PREFS.attach_load_dir, P_STRING, NULL, NULL, NULL},
754
755         /* MIME viewer */
756         {"mime_textviewer",   NULL,
757          &SPECIFIC_PREFS.mime_textviewer,   P_STRING, NULL, NULL, NULL},
758         {"mime_open_command", "gedit '%s'",
759          &SPECIFIC_PREFS.mime_open_cmd,     P_STRING, NULL, NULL, NULL},
760         {"show_inline_attachments", "TRUE", 
761          &prefs_common.show_inline_attachments, P_BOOL, NULL, NULL, NULL},
762
763         /* Interface */
764 #ifndef GENERIC_UMPC
765         {"layout_mode", "0", &prefs_common.layout_mode, P_INT,
766          NULL, NULL, NULL},
767 #else
768         {"layout_mode", "5", &prefs_common.layout_mode, P_INT,
769          NULL, NULL, NULL},
770 #endif
771         /* {"emulate_emacs", "FALSE", &prefs_common.emulate_emacs, P_BOOL,
772          NULL, NULL, NULL}, */
773         {"always_show_message_when_selected", "0",
774          &prefs_common.always_show_msg,
775          P_ENUM, NULL, NULL, NULL},
776         {"select_on_entry", "3", &prefs_common.select_on_entry,
777          P_ENUM, NULL, NULL, NULL},
778         {"show_tooltips", "TRUE", &prefs_common.show_tooltips,
779          P_BOOL, NULL, NULL, NULL},
780
781         /* do it SUMMARY_OPEN_ACTIONS-1 times */
782         {"summary_select_prio1", "0", &prefs_common.summary_select_prio[0], P_ENUM,
783          NULL, NULL, NULL},
784         {"summary_select_prio2", "0", &prefs_common.summary_select_prio[1], P_ENUM,
785          NULL, NULL, NULL},
786         {"summary_select_prio3", "0", &prefs_common.summary_select_prio[2], P_ENUM,
787          NULL, NULL, NULL},
788         {"summary_select_prio4", "0", &prefs_common.summary_select_prio[3], P_ENUM,
789          NULL, NULL, NULL},
790         {"summary_select_prio5", "0", &prefs_common.summary_select_prio[4], P_ENUM,
791          NULL, NULL, NULL},
792         {"summary_select_prio6", "0", &prefs_common.summary_select_prio[5], P_ENUM,
793          NULL, NULL, NULL},
794         {"summary_select_prio7", "0", &prefs_common.summary_select_prio[6], P_ENUM,
795          NULL, NULL, NULL},
796
797         {"mark_as_read_on_new_window", "FALSE",
798          &prefs_common.mark_as_read_on_new_window,
799          P_BOOL, NULL, NULL, NULL},
800         {"mark_as_read_delay", "0",
801          &prefs_common.mark_as_read_delay, P_INT, 
802          NULL, NULL, NULL},
803         {"immediate_execution", "TRUE", &prefs_common.immediate_exec, P_BOOL,
804          NULL, NULL, NULL},
805         {"nextunreadmsg_dialog", "1", &prefs_common.next_unread_msg_dialog, P_ENUM,
806          NULL, NULL, NULL},
807         {"summary_from_show", "0", &prefs_common.summary_from_show, P_ENUM,
808          NULL, NULL, NULL},
809
810         {"pixmap_theme_path", DEFAULT_PIXMAP_THEME, 
811          &SPECIFIC_PREFS.pixmap_theme_path, P_STRING,
812          NULL, NULL, NULL},
813
814         {"ask_mark_all_read", "TRUE", &prefs_common.ask_mark_all_read, P_BOOL,
815          NULL, NULL, NULL},
816
817         {"ask_apply_per_account_filtering_rules", "TRUE", &prefs_common.ask_apply_per_account_filtering_rules, P_BOOL,
818          NULL, NULL, NULL},
819         {"apply_per_account_filtering_rules", "0", &prefs_common.apply_per_account_filtering_rules, P_ENUM,
820          NULL, NULL, NULL},
821
822         /* Addressbook */
823         {"addressbook_use_editaddress_dialog", "TRUE", &prefs_common.addressbook_use_editaddress_dialog,
824          P_BOOL, NULL, NULL, NULL},
825         {"addressbook_hpaned_pos", "-1", &prefs_common.addressbook_hpaned_pos,
826          P_INT, NULL, NULL, NULL},
827         {"addressbook_vpaned_pos", "-1", &prefs_common.addressbook_vpaned_pos,
828          P_INT, NULL, NULL, NULL},
829
830         /* Other */
831 #ifndef G_OS_WIN32
832         {"uri_open_command", DEFAULT_BROWSER_CMD,
833          &SPECIFIC_PREFS.uri_cmd, P_STRING, NULL, NULL, NULL},
834 #endif
835         {"ext_editor_command", DEFAULT_EDITOR_CMD,
836          &SPECIFIC_PREFS.ext_editor_cmd, P_STRING, NULL, NULL, NULL},
837         {"cmds_use_system_default", "TRUE",
838          &prefs_common.cmds_use_system_default, P_BOOL, NULL, NULL, NULL},
839         {"add_address_by_click", "FALSE", &prefs_common.add_address_by_click,
840          P_BOOL, NULL, NULL, NULL},
841         {"session_passwords", "FALSE", &prefs_common.session_passwords,
842          P_BOOL, NULL, NULL, NULL},
843         {"confirm_on_exit", "FALSE", &prefs_common.confirm_on_exit, P_BOOL,
844          NULL, NULL, NULL},
845         {"clean_trash_on_exit", "FALSE", &prefs_common.clean_on_exit, P_BOOL,
846          NULL, NULL, NULL},
847         {"ask_on_cleaning", "TRUE", &prefs_common.ask_on_clean, P_BOOL,
848          NULL, NULL, NULL},
849         {"warn_queued_on_exit", "TRUE", &prefs_common.warn_queued_on_exit,
850          P_BOOL, NULL, NULL, NULL},
851         {"work_offline", "FALSE", &prefs_common.work_offline, P_BOOL,
852          NULL, NULL, NULL},
853         {"summary_quicksearch_type", "0", &prefs_common.summary_quicksearch_type, P_INT,
854          NULL, NULL, NULL},
855 #ifndef GENERIC_UMPC
856         {"summary_quicksearch_recurse", "1", &prefs_common.summary_quicksearch_recurse, P_INT,
857          NULL, NULL, NULL},
858 #else
859         {"summary_quicksearch_recurse", "0", &prefs_common.summary_quicksearch_recurse, P_INT,
860          NULL, NULL, NULL},
861 #endif
862
863 #if defined(__OpenBSD__)
864         {"io_timeout_secs", "80", &prefs_common.io_timeout_secs,
865          P_INT, NULL, NULL, NULL},
866 #else
867         {"io_timeout_secs", "60", &prefs_common.io_timeout_secs,
868          P_INT, NULL, NULL, NULL},
869 #endif
870         {"hide_score", "-9999", &prefs_common.kill_score, P_INT,
871          NULL, NULL, NULL},
872         {"important_score", "1", &prefs_common.important_score, P_INT,
873          NULL, NULL, NULL},
874
875         {"clip_log", "TRUE", &prefs_common.cliplog, P_BOOL,
876          NULL, NULL, NULL},
877         {"log_length", "500", &prefs_common.loglength, P_INT,
878          NULL, NULL, NULL},
879 #ifndef GENERIC_UMPC
880         {"enable_log_standard", "TRUE", &prefs_common.enable_log_standard, P_BOOL,
881          NULL, NULL, NULL},
882         {"enable_log_warning", "TRUE", &prefs_common.enable_log_warning, P_BOOL,
883          NULL, NULL, NULL},
884         {"enable_log_error", "TRUE", &prefs_common.enable_log_error, P_BOOL,
885          NULL, NULL, NULL},
886         {"enable_log_status", "TRUE", &prefs_common.enable_log_status, P_BOOL,
887          NULL, NULL, NULL},
888 #else
889         {"enable_log_standard", "FALSE", &prefs_common.enable_log_standard, P_BOOL,
890          NULL, NULL, NULL},
891         {"enable_log_warning", "FALSE", &prefs_common.enable_log_warning, P_BOOL,
892          NULL, NULL, NULL},
893         {"enable_log_error", "FALSE", &prefs_common.enable_log_error, P_BOOL,
894          NULL, NULL, NULL},
895         {"enable_log_status", "FALSE", &prefs_common.enable_log_status, P_BOOL,
896          NULL, NULL, NULL},
897 #endif
898         {"log_msg_color", "#00af00", &prefs_common.log_msg_color, P_COLOR,
899          NULL, NULL, NULL},
900         {"log_warn_color", "#af0000", &prefs_common.log_warn_color, P_COLOR,
901          NULL, NULL, NULL},
902         {"log_error_color", "#af0000", &prefs_common.log_error_color, P_COLOR,
903          NULL, NULL, NULL},
904         {"log_in_color", "#000000", &prefs_common.log_in_color, P_COLOR,
905          NULL, NULL, NULL},
906         {"log_out_color", "#0000ef", &prefs_common.log_out_color, P_COLOR,
907          NULL, NULL, NULL},
908         {"log_status_ok_color", "#00af00", &prefs_common.log_status_ok_color, P_COLOR,
909          NULL, NULL, NULL},
910         {"log_status_nok_color", "#0000af", &prefs_common.log_status_nok_color, P_COLOR,
911          NULL, NULL, NULL},
912         {"log_status_skip_color", "#aa00aa", &prefs_common.log_status_skip_color, P_COLOR,
913          NULL, NULL, NULL},
914
915     {"enable_filtering_debug", "FALSE", &prefs_common.enable_filtering_debug, P_BOOL,
916          NULL, NULL, NULL},
917     {"filtering_debug_level", "1", &prefs_common.filtering_debug_level, P_INT,
918          NULL, NULL, NULL},
919     {"enable_filtering_debug_inc", "TRUE", &prefs_common.enable_filtering_debug_inc, P_BOOL,
920          NULL, NULL, NULL},
921     {"enable_filtering_debug_manual", "TRUE", &prefs_common.enable_filtering_debug_manual, P_BOOL,
922          NULL, NULL, NULL},
923     {"enable_filtering_debug_folder_proc", "FALSE", &prefs_common.enable_filtering_debug_folder_proc, P_BOOL,
924          NULL, NULL, NULL},
925     {"enable_filtering_debug_pre_proc", "FALSE", &prefs_common.enable_filtering_debug_pre_proc, P_BOOL,
926          NULL, NULL, NULL},
927     {"enable_filtering_debug_post_proc", "FALSE", &prefs_common.enable_filtering_debug_post_proc, P_BOOL,
928          NULL, NULL, NULL},
929     {"filtering_debug_clip_log", "TRUE", &prefs_common.filtering_debug_cliplog, P_BOOL,
930          NULL, NULL, NULL},
931         {"filtering_debug_log_length", "500", &prefs_common.filtering_debug_loglength, P_INT,
932          NULL, NULL, NULL},
933
934         {"gtk_can_change_accels", "FALSE", &prefs_common.gtk_can_change_accels, P_BOOL,
935          NULL, NULL, NULL},
936
937         {"color_new", "#0000b3", &prefs_common.color_new, P_COLOR,
938          NULL, NULL, NULL},
939
940         /* Some windows' sizes */
941         {"filteringwin_width", "500", &prefs_common.filteringwin_width, P_INT,
942          NULL, NULL, NULL},
943         {"filteringwin_height", "-1", &prefs_common.filteringwin_height, P_INT,
944          NULL, NULL, NULL},
945
946         {"filteringactionwin_width", "490", &prefs_common.filteringactionwin_width, P_INT,
947          NULL, NULL, NULL},
948         {"filteringactionwin_height", "-1", &prefs_common.filteringactionwin_height, P_INT,
949          NULL, NULL, NULL},
950
951         {"matcherwin_width", "520", &prefs_common.matcherwin_width, P_INT,
952          NULL, NULL, NULL},
953         {"matcherwin_height", "-1", &prefs_common.matcherwin_height, P_INT,
954          NULL, NULL, NULL},
955
956         {"templateswin_width", "480", &prefs_common.templateswin_width, P_INT,
957          NULL, NULL, NULL},
958         {"templateswin_height", "-1", &prefs_common.templateswin_height, P_INT,
959          NULL, NULL, NULL},
960
961         {"actionswin_width", "486", &prefs_common.actionswin_width, P_INT,
962          NULL, NULL, NULL},
963         {"actionswin_height", "-1", &prefs_common.actionswin_height, P_INT,
964          NULL, NULL, NULL},
965
966         {"tagswin_width", "486", &prefs_common.tagswin_width, P_INT,
967          NULL, NULL, NULL},
968         {"tagswin_height", "-1", &prefs_common.tagswin_height, P_INT,
969          NULL, NULL, NULL},
970
971         {"addressbookwin_width", "520", &prefs_common.addressbookwin_width, P_INT,
972          NULL, NULL, NULL},
973         {"addressbookwin_height", "-1", &prefs_common.addressbookwin_height, P_INT,
974          NULL, NULL, NULL},
975
976         {"addressbookeditpersonwin_width", "640", &prefs_common.addressbookeditpersonwin_width, P_INT,
977          NULL, NULL, NULL},
978         {"addressbookeditpersonwin_height", "320", &prefs_common.addressbookeditpersonwin_height, P_INT,
979          NULL, NULL, NULL},
980
981         {"addressbookeditgroupwin_width", "580", &prefs_common.addressbookeditgroupwin_width, P_INT,
982          NULL, NULL, NULL},
983         {"addressbookeditgroupwin_height", "340", &prefs_common.addressbookeditgroupwin_height, P_INT,
984          NULL, NULL, NULL},
985
986         {"pluginswin_width", "-1", &prefs_common.pluginswin_width, P_INT,
987          NULL, NULL, NULL},
988         {"pluginswin_height", "-1", &prefs_common.pluginswin_height, P_INT,
989          NULL, NULL, NULL},
990
991         {"prefswin_width", "600", &prefs_common.prefswin_width, P_INT,
992          NULL, NULL, NULL},
993         {"prefswin_height", "-1", &prefs_common.prefswin_height, P_INT,
994          NULL, NULL, NULL},
995
996         {"folderitemwin_width", "500", &prefs_common.folderitemwin_width, P_INT,
997          NULL, NULL, NULL},
998         {"folderitemwin_height", "-1", &prefs_common.folderitemwin_height, P_INT,
999          NULL, NULL, NULL},
1000
1001         {"zero_replacement_char", "0", &prefs_common.zero_replacement, P_STRING,
1002          NULL, NULL, NULL},
1003
1004         {"editaccountwin_width", "500", &prefs_common.editaccountwin_width, P_INT,
1005          NULL, NULL, NULL},
1006         {"editaccountwin_height", "-1", &prefs_common.editaccountwin_height, P_INT,
1007          NULL, NULL, NULL},
1008
1009         {"accountswin_width", "500", &prefs_common.accountswin_width, P_INT,
1010          NULL, NULL, NULL},
1011         {"accountswin_height", "-1", &prefs_common.accountswin_height, P_INT,
1012          NULL, NULL, NULL},
1013
1014         {"logwin_width", "520", &prefs_common.logwin_width, P_INT,
1015          NULL, NULL, NULL},
1016         {"logwin_height", "-1", &prefs_common.logwin_height, P_INT,
1017          NULL, NULL, NULL},
1018
1019         {"filtering_debugwin_width", "600", &prefs_common.filtering_debugwin_width, P_INT,
1020          NULL, NULL, NULL},
1021         {"filtering_debugwin_height", "-1", &prefs_common.filtering_debugwin_height, P_INT,
1022          NULL, NULL, NULL},
1023
1024         {"folderselwin_width", "300", &prefs_common.folderselwin_width, P_INT,
1025          NULL, NULL, NULL},
1026         {"folderselwin_height", "-1", &prefs_common.folderselwin_height, P_INT,
1027          NULL, NULL, NULL},
1028
1029         {"addressaddwin_width", "300", &prefs_common.addressaddwin_width, P_INT,
1030          NULL, NULL, NULL},
1031         {"addressaddwin_height", "-1", &prefs_common.addressaddwin_height, P_INT,
1032          NULL, NULL, NULL},
1033
1034         {"addressbook_folderselwin_width", "300", &prefs_common.addressbook_folderselwin_width, P_INT,
1035          NULL, NULL, NULL},
1036         {"addressbook_folderselwin_height", "-1", &prefs_common.addressbook_folderselwin_height, P_INT,
1037          NULL, NULL, NULL},
1038
1039         {"aboutwin_width", "450", &prefs_common.aboutwin_width, P_INT,
1040          NULL, NULL, NULL},
1041         {"aboutwin_height", "500", &prefs_common.aboutwin_height, P_INT,
1042          NULL, NULL, NULL},
1043
1044         {"addrgather_width", "450", &prefs_common.addrgather_width, P_INT,
1045          NULL, NULL, NULL},
1046         {"addrgather_height", "-1", &prefs_common.addrgather_height, P_INT,
1047          NULL, NULL, NULL},
1048
1049         {"news_subscribe_width", "450", &prefs_common.news_subscribe_width, P_INT,
1050          NULL, NULL, NULL},
1051         {"news_subscribe_height", "400", &prefs_common.news_subscribe_height, P_INT,
1052          NULL, NULL, NULL},
1053
1054         /* Hidden */
1055         {"warn_dnd", "1", &prefs_common.warn_dnd, P_INT,
1056          NULL, NULL, NULL},
1057         {"utf8_instead_of_locale_for_broken_mail", "0", 
1058          &prefs_common.broken_are_utf8, P_INT,
1059          NULL, NULL, NULL},
1060         {"enable_swap_from", "FALSE", &prefs_common.swap_from, P_BOOL,
1061          NULL, NULL, NULL},
1062         {"use_stripes_everywhere", "TRUE", &prefs_common.use_stripes_everywhere, P_BOOL,
1063          NULL, NULL, NULL},
1064         {"use_stripes_in_summaries", "TRUE", &prefs_common.use_stripes_in_summaries, P_BOOL,
1065          NULL, NULL, NULL},
1066         {"stripes_color_offset", "4000", &prefs_common.stripes_color_offset, P_INT,
1067          NULL, NULL, NULL},
1068         {"enable_hscrollbar", "TRUE", &prefs_common.enable_hscrollbar, P_BOOL,
1069          NULL, NULL, NULL},
1070         {"folderview_vscrollbar_policy", "0",
1071          &prefs_common.folderview_vscrollbar_policy, P_ENUM,
1072          NULL, NULL, NULL},
1073         {"textview_cursor_visible", "FALSE",
1074          &prefs_common.textview_cursor_visible, P_BOOL,
1075          NULL, NULL, NULL},
1076         {"hover_timeout", "500", &prefs_common.hover_timeout, P_INT,
1077          NULL, NULL, NULL},
1078 #ifndef GENERIC_UMPC
1079         {"cache_max_mem_usage", "4096", &prefs_common.cache_max_mem_usage, P_INT,
1080          NULL, NULL, NULL},
1081         {"cache_min_keep_time", "15", &prefs_common.cache_min_keep_time, P_INT,
1082          NULL, NULL, NULL},
1083 #else
1084         {"cache_max_mem_usage", "4096", &prefs_common.cache_max_mem_usage, P_INT,
1085          NULL, NULL, NULL},
1086         {"cache_min_keep_time", "0", &prefs_common.cache_min_keep_time, P_INT,
1087          NULL, NULL, NULL},
1088 #endif
1089         {"thread_by_subject_max_age", "10", &prefs_common.thread_by_subject_max_age,
1090         P_INT, NULL, NULL, NULL },
1091         {"last_opened_folder", "", &prefs_common.last_opened_folder,
1092         P_STRING, NULL, NULL, NULL },
1093         {"goto_last_folder_on_startup", "FALSE", &prefs_common.goto_last_folder_on_startup,
1094         P_BOOL, NULL, NULL, NULL },
1095         {"summary_quicksearch_sticky", "1", &prefs_common.summary_quicksearch_sticky, P_INT,
1096          NULL, NULL, NULL},
1097         {"summary_quicksearch_dynamic", "0", &prefs_common.summary_quicksearch_dynamic, P_INT,
1098          NULL, NULL, NULL},
1099         {"summary_quicksearch_autorun", "0", &prefs_common.summary_quicksearch_autorun, P_INT,
1100          NULL, NULL, NULL},
1101         {"statusbar_update_step", "10", &prefs_common.statusbar_update_step, P_INT,
1102          NULL, NULL, NULL},
1103         {"compose_no_markup", "FALSE", &prefs_common.compose_no_markup, P_BOOL,
1104          NULL, NULL, NULL},
1105         {"skip_ssl_cert_check", "FALSE", &prefs_common.skip_ssl_cert_check, P_BOOL,
1106          NULL, NULL, NULL},
1107         {"live_dangerously", "FALSE", &prefs_common.live_dangerously, P_BOOL,
1108          NULL, NULL, NULL},
1109         {"save_parts_readwrite", "FALSE", &prefs_common.save_parts_readwrite, P_BOOL,
1110          NULL, NULL, NULL},
1111         {"hide_quotes", "0", &prefs_common.hide_quotes, P_INT,
1112          NULL, NULL, NULL},
1113         {"unsafe_ssl_certs", "FALSE", &prefs_common.unsafe_ssl_certs, P_BOOL,
1114          NULL, NULL, NULL},
1115 #ifndef GENERIC_UMPC
1116         {"real_time_sync", "FALSE", &prefs_common.real_time_sync, P_BOOL,
1117          NULL, NULL, NULL},
1118 #else
1119         {"real_time_sync", "TRUE", &prefs_common.real_time_sync, P_BOOL,
1120          NULL, NULL, NULL},
1121 #endif
1122
1123         {"print_paper_type", NULL, &prefs_common.print_paper_type, P_STRING,
1124          NULL, NULL, NULL},
1125         {"print_paper_orientation", "0", &prefs_common.print_paper_orientation, P_INT,
1126          NULL, NULL, NULL},
1127         {"print_margin_top", "-1", &prefs_common.print_margin_top, P_INT,
1128          NULL, NULL, NULL},
1129         {"print_margin_bottom", "-1", &prefs_common.print_margin_bottom, P_INT,
1130          NULL, NULL, NULL},
1131         {"print_margin_left", "-1", &prefs_common.print_margin_left, P_INT,
1132          NULL, NULL, NULL},
1133         {"print_margin_right", "-1", &prefs_common.print_margin_right, P_INT,
1134          NULL, NULL, NULL},
1135         {"print_use_color", "0", &prefs_common.print_use_color, P_INT,
1136          NULL, NULL, NULL},
1137         {"print_use_collate", "0", &prefs_common.print_use_collate, P_INT,
1138          NULL, NULL, NULL},
1139         {"print_use_reverse", "0", &prefs_common.print_use_reverse, P_INT,
1140          NULL, NULL, NULL},
1141         {"print_use_duplex", "0", &prefs_common.print_use_duplex, P_INT,
1142          NULL, NULL, NULL},
1143         {"print_imgs", "1", &prefs_common.print_imgs, P_INT,
1144          NULL, NULL, NULL},
1145         {"print_previewwin_width", "600", &prefs_common.print_previewwin_width, P_INT,
1146          NULL, NULL, NULL},
1147         {"print_previewwin_height", "-1", &prefs_common.print_previewwin_height, P_INT,
1148          NULL, NULL, NULL},
1149         {"use_networkmanager", "TRUE", &prefs_common.use_networkmanager, P_BOOL,
1150          NULL, NULL, NULL},
1151         {"use_shred", "FALSE", &prefs_common.use_shred, P_BOOL,
1152          NULL, NULL, NULL},
1153
1154         {"two_line_vertical", "TRUE", &prefs_common.two_line_vert,
1155         P_BOOL, NULL, NULL, NULL },
1156
1157         {"inherit_folder_properties", "FALSE", &prefs_common.inherit_folder_props, P_BOOL,
1158          NULL, NULL, NULL},
1159
1160         {"flush_metadata", "TRUE", &prefs_common.flush_metadata, P_BOOL,
1161          NULL, NULL, NULL},
1162
1163         {"nav_history_length", "50", &prefs_common.nav_history_length, P_INT,
1164          NULL, NULL, NULL},
1165
1166         {"diff_added_color", "#008b8b", &prefs_common.diff_added_color, P_COLOR,
1167          NULL, NULL, NULL},
1168         {"diff_deleted_color", "#6a5acd", &prefs_common.diff_deleted_color, P_COLOR,
1169          NULL, NULL, NULL},
1170         {"diff_hunk_color", "#a52a2a", &prefs_common.diff_hunk_color, P_COLOR,
1171          NULL, NULL, NULL},
1172
1173         {NULL, NULL, NULL, P_OTHER, NULL, NULL, NULL}
1174 };
1175
1176 /*
1177  * Read history list from the specified history file in the specified directory (subdir of rc_dir)
1178  * Fallback to default_list if history file is not found
1179  */
1180 GList *prefs_common_read_history_from_dir_with_defaults(const gchar *dirname, const gchar *history,
1181                                                                                                                           GList *default_list)
1182 {
1183         FILE *fp;
1184         gchar *path;
1185         gchar buf[PREFSBUFSIZE];
1186         GList *tmp = NULL;
1187
1188         if (dirname) {
1189                 path = g_strconcat(get_rc_dir(), G_DIR_SEPARATOR_S, dirname,
1190                                    G_DIR_SEPARATOR_S, history,
1191                                    NULL);
1192         } else {
1193         path = g_strconcat(get_rc_dir(), G_DIR_SEPARATOR_S, history,
1194                            NULL);
1195         }
1196         if ((fp = g_fopen(path, "rb")) == NULL) {
1197                 if (ENOENT != errno) FILE_OP_ERROR(path, "fopen");
1198                 g_free(path);
1199                 /* returns default list if set, otherwise NULL */
1200                 return default_list;
1201         }
1202         g_free(path);
1203         while (fgets(buf, sizeof(buf), fp) != NULL) {
1204                 g_strstrip(buf);
1205                 if (buf[0] == '\0') continue;
1206                 tmp = add_history(tmp, buf);
1207         }
1208         fclose(fp);
1209
1210         tmp = g_list_reverse(tmp);
1211
1212         return tmp;
1213 }
1214
1215 /*
1216  * Read history list from the specified history file in the specified directory (subdir of rc_dir)
1217  */
1218 static GList *prefs_common_read_history_from_dir(const gchar *dirname, const gchar *history) 
1219 {
1220         return prefs_common_read_history_from_dir_with_defaults(dirname, history, NULL);
1221 }
1222
1223 /*
1224  * Read history list from the specified history file
1225  */
1226 static GList *prefs_common_read_history(const gchar *history) 
1227 {
1228         return prefs_common_read_history_from_dir(NULL, history);
1229 }
1230
1231 void prefs_common_read_config(void)
1232 {
1233         gchar *rcpath;
1234         gchar *tmp;
1235
1236         rcpath = g_strconcat(get_rc_dir(), G_DIR_SEPARATOR_S, COMMON_RC, NULL);
1237         prefs_read_config(param, "Common", rcpath, NULL);
1238 #ifdef G_OS_WIN32
1239         prefs_read_config(param_os_specific, "CommonWin32", rcpath, NULL);
1240 #endif
1241
1242         g_free(rcpath);
1243
1244         tmp = g_strdup(gettext(prefs_common.date_format));
1245         g_free(prefs_common.date_format);
1246         prefs_common.date_format = tmp;
1247
1248         prefs_common.mime_open_cmd_history =
1249                 prefs_common_read_history(COMMAND_HISTORY);
1250         prefs_common.summary_quicksearch_history =
1251                 prefs_common_read_history(QUICKSEARCH_HISTORY);
1252         prefs_common.summary_search_from_history =
1253                 prefs_common_read_history(SUMMARY_SEARCH_FROM_HISTORY);
1254         prefs_common.summary_search_to_history =
1255                 prefs_common_read_history(SUMMARY_SEARCH_TO_HISTORY);
1256         prefs_common.summary_search_subject_history =
1257                 prefs_common_read_history(SUMMARY_SEARCH_SUBJECT_HISTORY);
1258         prefs_common.summary_search_body_history =
1259                 prefs_common_read_history(SUMMARY_SEARCH_BODY_HISTORY);
1260         prefs_common.summary_search_adv_condition_history =
1261                 prefs_common_read_history(SUMMARY_SEARCH_ADV_CONDITION_HISTORY);
1262         prefs_common.message_search_history =
1263                 prefs_common_read_history(MESSAGE_SEARCH_HISTORY);
1264         prefs_common.compose_save_to_history =
1265                 prefs_common_read_history(COMPOSE_SAVE_TO_HISTORY);
1266 #ifndef USE_NEW_ADDRBOOK
1267         prefs_common.addressbook_custom_attributes = addressbook_update_custom_attr_from_prefs();
1268 #endif
1269         colorlabel_update_colortable_from_prefs();
1270 }
1271
1272 #define TRY(func) \
1273 if (!(func)) \
1274 { \
1275         g_warning("failed to write\n"); \
1276         goto out;                       \
1277 } \
1278
1279 /*
1280  * Save history list to the specified history file in the specified directory (subdir of rc_dir)
1281  */
1282 static void prefs_common_save_history_to_dir(const gchar *dirname, const gchar *history, GList *list)
1283 {
1284         GList *cur;
1285         FILE *fp;
1286         gchar *path, *tmp_path;
1287
1288         if (dirname) {
1289                 path = g_strconcat(get_rc_dir(), G_DIR_SEPARATOR_S, dirname,
1290                                    G_DIR_SEPARATOR_S, history,
1291                                    NULL);
1292         } else {
1293         path = g_strconcat(get_rc_dir(), G_DIR_SEPARATOR_S, history,
1294                            NULL);
1295         }
1296         tmp_path = g_strconcat(path, ".tmp", NULL);
1297
1298         if ((fp = g_fopen(tmp_path, "wb")) == NULL) {
1299                 FILE_OP_ERROR(tmp_path, "fopen");
1300                 goto out;
1301         }
1302
1303         for (cur = list; cur != NULL; cur = cur->next) {
1304                 TRY(fputs((gchar *)cur->data, fp) != EOF &&
1305                     fputc('\n', fp) != EOF);
1306         }
1307
1308         if (fclose(fp) == EOF) {
1309                 FILE_OP_ERROR(tmp_path, "fclose");
1310                 fp = NULL;
1311                 goto out;
1312         }
1313         fp = NULL;
1314 #ifdef G_OS_WIN32
1315         claws_unlink(path);
1316 #endif
1317         if (g_rename(tmp_path, path) < 0) {
1318                 FILE_OP_ERROR(path, "rename");
1319                 goto out;
1320         }
1321
1322 out:
1323         if (fp)
1324                 fclose(fp);
1325         g_free(tmp_path);
1326         g_free(path);
1327 }
1328
1329 /*
1330  * Save history list to the specified history file
1331  */
1332 static void prefs_common_save_history(const gchar *history, GList *list)
1333 {
1334         prefs_common_save_history_to_dir(NULL, history, list);
1335 }
1336
1337 #undef TRY
1338
1339 void prefs_common_write_config(void)
1340 {
1341         prefs_write_config(param, "Common", COMMON_RC);
1342 #ifdef G_OS_WIN32
1343         prefs_write_config(param_os_specific, "CommonWin32", COMMON_RC);
1344 #endif
1345
1346         prefs_common_save_history(COMMAND_HISTORY, 
1347                 prefs_common.mime_open_cmd_history);
1348         prefs_common_save_history(QUICKSEARCH_HISTORY, 
1349                 prefs_common.summary_quicksearch_history);
1350         prefs_common_save_history(SUMMARY_SEARCH_FROM_HISTORY, 
1351                 prefs_common.summary_search_from_history);
1352         prefs_common_save_history(SUMMARY_SEARCH_TO_HISTORY, 
1353                 prefs_common.summary_search_to_history);
1354         prefs_common_save_history(SUMMARY_SEARCH_SUBJECT_HISTORY, 
1355                 prefs_common.summary_search_subject_history);
1356         prefs_common_save_history(SUMMARY_SEARCH_BODY_HISTORY, 
1357                 prefs_common.summary_search_body_history);
1358         prefs_common_save_history(SUMMARY_SEARCH_ADV_CONDITION_HISTORY, 
1359                 prefs_common.summary_search_adv_condition_history);
1360         prefs_common_save_history(MESSAGE_SEARCH_HISTORY, 
1361                 prefs_common.message_search_history);
1362         prefs_common_save_history(COMPOSE_SAVE_TO_HISTORY, 
1363                 prefs_common.compose_save_to_history);
1364
1365 #ifndef USE_NEW_ADDRBOOK
1366                 prefs_common_save_history_to_dir(ADDRBOOK_DIR,
1367                 ADDRESSBOOK_CUSTOM_ATTRIBUTES, 
1368                 prefs_common.addressbook_custom_attributes);
1369 #endif
1370 }
1371
1372 /* make a copy of string 'in' into buffer 'out'. un-escape \ sequences.
1373    both 'in' and 'out' must be non-NULL.
1374    'out' must be a pointer to a buffer whose size is at least equal
1375    to strlen(txt)+1, this buffer will get cleared. out's contents
1376    will always get set to a valid string, even if it's "".*/
1377 void pref_get_unescaped_pref(gchar *out, const gchar *in)
1378 {
1379         const gchar *i;
1380         gchar *o;
1381
1382         *out = '\0';
1383
1384         cm_return_if_fail( in != NULL );
1385         cm_return_if_fail( out != NULL );
1386
1387         i = in;
1388         o = out;
1389         memset(out, 0, strlen(in)+1);
1390         while (*i != '\0') {
1391                 if (*i == '\\' && *(i+1) == 'n') {
1392                         *o++ = '\n';
1393                         i++;
1394                 } else if (*i == '\\' && *(i+1) == 't') {
1395                         *o++ = '\t';
1396                         i++;
1397                 } else if (*i == '\\' && *(i+1) == '\\') {
1398                         *o++ = '\\';
1399                         i++;
1400                 } else {
1401                         *o++ = *i;
1402                 }
1403                 i++;
1404         }
1405         *o='\0';
1406 }
1407
1408 /* make a copy of string 'in' into buffer 'out'. escape \ sequences.
1409    both 'in' and 'out' must be non-NULL.
1410    'out' must be a pointer to a buffer whose size is at least equal
1411    to 2*strlen(txt)+1. out's contents will always get set to a valid
1412    string, even if it's "". */
1413 void pref_get_escaped_pref(gchar *out, const gchar *in)
1414 {
1415         const gchar *i;
1416         gchar *o;
1417
1418         *out = '\0';
1419
1420         cm_return_if_fail( in != NULL );
1421         cm_return_if_fail( out != NULL );
1422
1423         i = in;
1424         o = out;
1425         while (*i != '\0') {
1426                 if (*i == '\n') {
1427                         *o++ = '\\';
1428                         *o++ = 'n';
1429                 } else if (*i == '\t') {
1430                         *o++ = '\\';
1431                         *o++ = 't';
1432                 } else if (*i == '\\') {
1433                         *o++ = '\\';
1434                         *o++ = '\\';
1435                 } else {
1436                         *o++ = *i;
1437                 }
1438                 i++;
1439         }
1440         *o = '\0';
1441 }
1442                 
1443 /* set the contents of a textview widget from the internal \-escaped
1444   representation of a pref string. both txt and textview must be non-NULL. */
1445 void pref_set_textview_from_pref(GtkTextView *textview, const gchar *txt)
1446 {
1447         GtkTextBuffer *buffer;
1448         gchar *out = NULL;
1449
1450         cm_return_if_fail( textview != NULL );
1451
1452         buffer = gtk_text_view_get_buffer(textview);
1453
1454         if (!txt) {
1455                 gtk_text_buffer_set_text(buffer, "", -1);
1456         } else {
1457                 out = g_malloc(strlen(txt)+1);
1458
1459                 pref_get_unescaped_pref(out, txt);
1460
1461                 gtk_text_buffer_set_text(buffer, out?out:"", -1);
1462                 g_free(out);
1463         }
1464 }
1465
1466 /* set the contents of a gtkentry widget from the internal \-escaped
1467   representation of a pref string. both txt and entry must be non-NULL. */
1468 void pref_set_entry_from_pref(GtkEntry *entry, const gchar *txt)
1469 {
1470         gchar *out = NULL;
1471
1472         cm_return_if_fail( entry != NULL );
1473         if (!txt) {
1474                 gtk_entry_set_text(entry, "");
1475         } else {
1476                 out = g_malloc(strlen(txt)+1);
1477
1478                 pref_get_unescaped_pref(out, txt);
1479
1480                 gtk_entry_set_text(entry, out?out:"");
1481                 g_free(out);
1482         }
1483 }
1484
1485 /* get the \-escaped internal representation of a pref from the contents of
1486    a textview widget. textview must be non-NULL. */
1487 gchar *pref_get_pref_from_textview(GtkTextView *textview) 
1488 {
1489         GtkTextBuffer *buffer;
1490         GtkTextIter start, end;
1491         gchar *out, *tmp;
1492         
1493         cm_return_val_if_fail( textview != NULL, "" );
1494
1495         buffer = gtk_text_view_get_buffer(textview);
1496         gtk_text_buffer_get_start_iter(buffer, &start);
1497         gtk_text_buffer_get_iter_at_offset(buffer, &end, -1);
1498         tmp = gtk_text_buffer_get_text(buffer, &start, &end, FALSE);
1499         out = malloc(2*strlen(tmp)+1);
1500         if (out)
1501                 pref_get_escaped_pref(out, tmp);
1502         g_free(tmp);
1503
1504         return out?out:"";
1505 }
1506
1507 /* get the \-escaped internal representation of a pref from the contents of
1508    a gtkentry widget. entry must be non-NULL. */
1509 gchar *pref_get_pref_from_entry(GtkEntry *entry) 
1510 {
1511         gchar *out, *tmp;
1512
1513         cm_return_val_if_fail( entry != NULL, "" );
1514
1515         tmp = gtk_editable_get_chars(GTK_EDITABLE(entry), 0, -1);
1516         out = malloc(2*strlen(tmp)+1);
1517         
1518         if (out)
1519                 pref_get_escaped_pref(out, tmp);
1520         g_free(tmp);
1521
1522         return out?out:"";
1523 }
1524
1525 /* ugly hack to be able to get this pref from ssl_certificate.c */
1526 gboolean prefs_common_unsafe_ssl_certs(void)
1527 {
1528         return prefs_common.unsafe_ssl_certs;
1529 }
1530
1531 gboolean prefs_common_enable_log_standard(void)
1532 {
1533         return prefs_common.enable_log_standard;
1534 }
1535
1536 gboolean prefs_common_enable_log_warning(void)
1537 {
1538         return prefs_common.enable_log_warning;
1539 }
1540 gboolean prefs_common_enable_log_error(void)
1541 {
1542         return prefs_common.enable_log_error;
1543 }
1544 gboolean prefs_common_enable_log_status(void)
1545 {
1546         return prefs_common.enable_log_status;
1547 }
1548
1549 #ifdef MAEMO
1550 const gchar *prefs_common_get_data_root(void)
1551 {
1552         if (prefs_common.data_root && *prefs_common.data_root)
1553                 return prefs_common.data_root;
1554         else
1555                 return NULL;
1556 }
1557 #endif
1558 /**
1559    return the translated name of a header, if the translate_header option is
1560    set, otherwise return the untranslated header name (header_name itself).
1561    this function is provided for convenience, it's an interface to
1562    prefs_common.trans_hdr.
1563    works with header names either with or without trailing colon, provided
1564    that gettext found such header name in the sources (they should all be
1565    found in src/gtk/headers.h anyway).
1566 */
1567 const gchar *prefs_common_translated_header_name(const gchar *header_name)
1568 {
1569         if (header_name == NULL || *header_name == '\0')
1570                 return header_name;
1571
1572         return prefs_common.trans_hdr ? gettext(header_name) : header_name;
1573 }
1574
1575 const gchar *prefs_common_get_uri_cmd(void)
1576 {
1577 #ifdef G_OS_WIN32
1578         return NULL;
1579 #else
1580         gchar *tmp = NULL;
1581         
1582         if (!prefs_common.cmds_use_system_default)
1583                 return prefs_common.uri_cmd;
1584         
1585         tmp = g_find_program_in_path("xdg-open");
1586         if (!tmp) 
1587                 return prefs_common.uri_cmd;
1588         
1589         g_free(tmp);
1590         return "xdg-open %s";
1591 #endif
1592 }
1593
1594 const gchar *prefs_common_get_ext_editor_cmd(void)
1595 {
1596         return prefs_common.ext_editor_cmd;
1597 #if 0 /* we should do that, but it detaches the editor and breaks
1598          compose.c's external composition. */
1599         gchar *tmp = NULL;
1600         
1601         if (!prefs_common.cmds_use_system_default)
1602                 return prefs_common.ext_editor_cmd;
1603         
1604         tmp = g_find_program_in_path("xdg-open");
1605         if (!tmp) 
1606                 return prefs_common.ext_editor_cmd;
1607         
1608         g_free(tmp);
1609         return "xdg-open %s";
1610 #endif 
1611 }
1612
1613 gboolean prefs_common_get_use_shred(void)
1614 {
1615         return prefs_common.use_shred;
1616 }
1617
1618 gboolean prefs_common_get_flush_metadata (void)
1619 {
1620         return prefs_common.flush_metadata;
1621 }
1622
1623 PrefsCommon *prefs_common_get_prefs(void)
1624 {
1625         return &prefs_common;
1626 }
1627
1628 void prefs_common_zoom_font(gchar **font, ZoomType type)
1629 {
1630         PangoFontDescription *font_desc;
1631         int size;
1632
1633         if (font == NULL || *font == '\0')
1634                 return;
1635
1636         font_desc = pango_font_description_from_string(*font);
1637         size = pango_font_description_get_size(font_desc)/PANGO_SCALE;
1638
1639         if (type == ZOOM_IN && size < 30)
1640                 size++;
1641         if (type == ZOOM_OUT && size > 5)
1642                 size--;
1643
1644         pango_font_description_set_size(font_desc, size*PANGO_SCALE);
1645
1646         g_free(*font); 
1647         *font = pango_font_description_to_string(font_desc);
1648         pango_font_description_free(font_desc);
1649 }