2007-08-03 [colin] 2.10.0cvs86
[claws.git] / src / prefs_common.c
1 /*
2  * Sylpheed -- a GTK+ based, lightweight, and fast e-mail client
3  * Copyright (C) 1999-2007 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
63 enum {
64         DATEFMT_FMT,
65         DATEFMT_TXT,
66         N_DATEFMT_COLUMNS
67 };
68
69 PrefsCommon prefs_common;
70
71 GtkWidget *notebook;
72
73 #ifdef G_OS_WIN32
74 /*
75  * In the Windows version prefs_common contains
76  *   - the non-OS-specific settings of the "Common" section and
77  *   - the OS-specific settings of the "CommonWin32" section
78  * The OS-specific settings of the "Common" section are not used
79  * but saved in prefs_unix.
80  */
81
82 #  define SPECIFIC_PREFS prefs_unix
83
84 static PrefsCommon prefs_unix;
85
86 static PrefParam param_os_specific[] = {
87         /* Receive */
88         {"ext_inc_path", "",
89          &prefs_common.extinc_cmd, P_STRING, NULL, NULL, NULL},
90         {"newmail_notify_cmd", "",
91          &prefs_common.newmail_notify_cmd, P_STRING, NULL, NULL, NULL},
92
93         /* new fonts */
94         {"widget_font_gtk2",    NULL,
95           &prefs_common.widgetfont,             P_STRING, NULL, NULL, NULL},
96         {"message_font_gtk2",   "Monospace 9",
97          &prefs_common.textfont,                P_STRING, NULL, NULL, NULL},
98         {"print_font_gtk2",     "Monospace 9",
99          &prefs_common.printfont,               P_STRING, NULL, NULL, NULL},
100         {"small_font_gtk2",     "Sans 9",
101           &prefs_common.smallfont,              P_STRING, NULL, NULL, NULL},
102         {"normal_font_gtk2",    "Sans 9",
103           &prefs_common.normalfont,             P_STRING, NULL, NULL, NULL},
104         /* Message */
105         {"attach_save_directory", NULL,
106          &prefs_common.attach_save_dir, P_STRING, NULL, NULL, NULL},
107         {"attach_load_directory", NULL,
108          &prefs_common.attach_load_dir, P_STRING, NULL, NULL, NULL},
109
110         /* MIME viewer */
111         {"mime_textviewer", NULL,
112          &prefs_common.mime_textviewer,   P_STRING, NULL, NULL, NULL},
113         {"mime_open_command", "notepad '%s'",
114          &prefs_common.mime_open_cmd,     P_STRING, NULL, NULL, NULL},
115
116         /* Interface */
117         {"pixmap_theme_path", DEFAULT_PIXMAP_THEME, 
118          &prefs_common.pixmap_theme_path, P_STRING, NULL, NULL, NULL},
119
120         /* Other */
121         {"uri_open_command", NULL,
122          &prefs_common.uri_cmd, P_STRING, NULL, NULL, NULL},
123         {"print_command", "notepad /p %s",
124          &prefs_common.print_cmd, P_STRING, NULL, NULL, NULL},
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_play_sound", "FALSE", &prefs_common.maemo_play_sound, P_BOOL,
170          NULL, NULL, NULL},
171         {"maemo_show_banner", "FALSE", &prefs_common.maemo_show_banner, P_BOOL,
172          NULL, NULL, NULL},
173 #endif
174         {"receive_dialog_mode", "2", &prefs_common.recv_dialog_mode, P_ENUM,
175          NULL, NULL, NULL},
176         {"receivewin_width", "460", &prefs_common.receivewin_width, P_INT,
177          NULL, NULL, NULL},
178         {"receivewin_height", "-1", &prefs_common.receivewin_height, P_INT,
179          NULL, NULL, NULL},
180         {"no_receive_error_panel", "FALSE", &prefs_common.no_recv_err_panel,
181          P_BOOL, NULL, NULL, NULL},
182         {"close_receive_dialog", "TRUE", &prefs_common.close_recv_dialog,
183          P_BOOL, NULL, NULL, NULL},
184  
185         /* Send */
186         {"save_message", "TRUE", &prefs_common.savemsg, P_BOOL,
187          NULL, NULL, NULL},
188         {"confirm_send_queued_messages", "FALSE", &prefs_common.confirm_send_queued_messages,
189          P_BOOL, NULL, NULL, NULL},
190         {"send_dialog_mode", "1", &prefs_common.send_dialog_mode, P_ENUM,
191          NULL, NULL, NULL},
192         {"sendwin_width", "460", &prefs_common.sendwin_width, P_INT,
193          NULL, NULL, NULL},
194         {"sendwin_height", "-1", &prefs_common.sendwin_height, P_INT,
195          NULL, NULL, NULL},
196
197         {"outgoing_charset", CS_AUTO, &prefs_common.outgoing_charset, P_STRING,
198          NULL, NULL, NULL},
199         {"encoding_method", "0", &prefs_common.encoding_method, P_ENUM,
200          NULL, NULL, NULL},
201
202         {"allow_jisx0201_kana", "FALSE", &prefs_common.allow_jisx0201_kana,
203          P_BOOL, NULL, NULL, NULL},
204
205         /* Compose */
206         {"auto_ext_editor", "FALSE", &prefs_common.auto_exteditor, P_BOOL,
207          NULL, NULL, NULL},
208         {"forward_as_attachment", "FALSE", &prefs_common.forward_as_attachment,
209          P_BOOL, NULL, NULL, NULL},
210         {"redirect_keep_from", "FALSE",
211          &prefs_common.redirect_keep_from, P_BOOL,
212          NULL, NULL, NULL},
213         {"undo_level", "50", &prefs_common.undolevels, P_INT,
214          NULL, NULL, NULL},
215         {"compose_with_format", "FALSE", &prefs_common.compose_with_format, P_BOOL,
216          NULL, NULL, NULL},
217         {"compose_subject_format", "",
218          &prefs_common.compose_subject_format, P_STRING, NULL, NULL, NULL},
219         {"compose_body_format", N_("Hello,\\n"),
220          &prefs_common.compose_body_format, P_STRING, NULL, NULL, NULL},
221
222         {"linewrap_length", "72", &prefs_common.linewrap_len, P_INT,
223          NULL, NULL, NULL},
224         {"linewrap_quotation", "TRUE", &prefs_common.linewrap_quote, P_BOOL,
225          NULL, NULL, NULL},
226         {"linewrap_pastes", "TRUE", &prefs_common.linewrap_pastes, P_BOOL,
227          NULL, NULL, NULL},
228         {"linewrap_auto", "TRUE", &prefs_common.autowrap, P_BOOL,
229          NULL, NULL, NULL},
230         {"autosave", "TRUE", &prefs_common.autosave,
231          P_BOOL, NULL, NULL, NULL},
232         {"autosave_length", "50", &prefs_common.autosave_length, P_INT,
233          NULL, NULL, NULL},
234 #if USE_ASPELL
235         {"enable_aspell", "TRUE", &prefs_common.enable_aspell, P_BOOL,
236          NULL, NULL, NULL},
237         {"aspell_path", ASPELL_PATH, &prefs_common.aspell_path, P_STRING,
238          NULL, NULL, NULL},
239         {"dictionary",  "", &prefs_common.dictionary, P_STRING,
240          NULL, NULL, NULL},
241         {"alt_dictionary",  "", &prefs_common.alt_dictionary, P_STRING,
242          NULL, NULL, NULL},
243         {"aspell_sugmode", "1", &prefs_common.aspell_sugmode, P_INT,
244          NULL, NULL, NULL},
245         {"use_alternate_dict", "FALSE", &prefs_common.use_alternate, P_BOOL,
246          NULL, NULL, NULL},
247         {"check_while_typing", "TRUE", &prefs_common.check_while_typing, P_BOOL,
248          NULL, NULL, NULL},
249         {"recheck_when_changing_dict", "TRUE", &prefs_common.recheck_when_changing_dict,
250          P_BOOL, NULL, NULL, NULL},
251         {"misspelled_color", "16711680", &prefs_common.misspelled_col, P_COLOR,
252          NULL, NULL, NULL},
253         {"use_both_dicts", "FALSE", &prefs_common.use_both_dicts, P_BOOL,
254          NULL, NULL, NULL},
255 #endif
256         {"reply_with_quote", "TRUE", &prefs_common.reply_with_quote, P_BOOL,
257          NULL, NULL, NULL},
258         {"compose_dnd_insert_or_attach", "0", &prefs_common.compose_dnd_mode, P_ENUM,
259          NULL, NULL, NULL},
260
261         /* Account autoselection */
262         {"reply_account_autoselect", "TRUE",
263          &prefs_common.reply_account_autosel, P_BOOL,
264          NULL, NULL, NULL},
265         {"forward_account_autoselect", "TRUE",
266          &prefs_common.forward_account_autosel, P_BOOL,
267          NULL, NULL, NULL},
268         {"reedit_account_autoselect", "TRUE",
269          &prefs_common.reedit_account_autosel, P_BOOL,
270          NULL, NULL, NULL},
271
272         {"default_reply_list", "TRUE", &prefs_common.default_reply_list, P_BOOL,
273          NULL, NULL, NULL},
274
275 #ifndef MAEMO
276         {"show_ruler", "TRUE", &prefs_common.show_ruler, P_BOOL,
277          NULL, NULL, NULL},
278 #else
279         {"show_ruler", "FALSE", &prefs_common.show_ruler, P_BOOL,
280          NULL, NULL, NULL},
281 #endif
282
283         /* Quote */
284         {"reply_quote_mark", "> ", &prefs_common.quotemark, P_STRING,
285          NULL, NULL, NULL},
286         {"reply_quote_format", N_("On %d\\n%f wrote:\\n\\n%q"),
287          &prefs_common.quotefmt, P_STRING, NULL, NULL, NULL},
288
289         {"forward_quote_mark", "> ", &prefs_common.fw_quotemark, P_STRING,
290          NULL, NULL, NULL},
291         {"forward_quote_format",
292          N_("\\n\\nBegin forwarded message:\\n\\n"
293          "?d{Date: %d\\n}?f{From: %f\\n}?t{To: %t\\n}?c{Cc: %c\\n}"
294          "?n{Newsgroups: %n\\n}?s{Subject: %s\\n}\\n\\n%M"),
295          &prefs_common.fw_quotefmt, P_STRING, NULL, NULL, NULL},
296         {"quote_chars", ">", &prefs_common.quote_chars, P_STRING,
297          NULL, NULL, NULL},
298
299         /* Display */
300         /* Obsolete fonts. For coexisting with Gtk+-1.2 version */
301         {"widget_font",         NULL,
302           &prefs_common.widgetfont_gtk1,        P_STRING, NULL, NULL, NULL},
303         {"message_font",        "-misc-fixed-medium-r-normal--14-*-*-*-*-*-*-*",
304          &prefs_common.textfont_gtk1,           P_STRING, NULL, NULL, NULL},
305         {"small_font",          "-*-helvetica-medium-r-normal--10-*-*-*-*-*-*-*",
306           &prefs_common.smallfont_gtk1,         P_STRING, NULL, NULL, NULL},
307         {"bold_font",           "-*-helvetica-bold-r-normal--12-*-*-*-*-*-*-*",
308           &prefs_common.boldfont_gtk1,          P_STRING, NULL, NULL, NULL},
309         {"normal_font",         "-*-helvetica-medium-r-normal--12-*-*-*-*-*-*-*",
310           &prefs_common.normalfont_gtk1,        P_STRING, NULL, NULL, NULL},
311
312         /* new fonts */
313 #ifndef MAEMO
314         {"widget_font_gtk2",    NULL,
315           &SPECIFIC_PREFS.widgetfont,           P_STRING, NULL, NULL, NULL},
316         {"message_font_gtk2",   "Monospace 9",
317          &SPECIFIC_PREFS.textfont,                      P_STRING, NULL, NULL, NULL},
318         {"print_font_gtk2",     "Monospace 9",
319          &SPECIFIC_PREFS.printfont,             P_STRING, NULL, NULL, NULL},
320         {"small_font_gtk2",     "Sans 9",
321           &SPECIFIC_PREFS.smallfont,            P_STRING, NULL, NULL, NULL},
322         {"normal_font_gtk2",    "Sans 9",
323           &SPECIFIC_PREFS.normalfont,           P_STRING, NULL, NULL, NULL},
324 #else
325         {"widget_font_gtk2",    NULL,
326           &SPECIFIC_PREFS.widgetfont,           P_STRING, NULL, NULL, NULL},
327         {"message_font_gtk2",   "Monospace 8",
328          &SPECIFIC_PREFS.textfont,                      P_STRING, NULL, NULL, NULL},
329         {"print_font_gtk2",     "Monospace 8",
330          &SPECIFIC_PREFS.printfont,             P_STRING, NULL, NULL, NULL},
331         {"small_font_gtk2",     "Sans 8",
332           &SPECIFIC_PREFS.smallfont,            P_STRING, NULL, NULL, NULL},
333         {"normal_font_gtk2",    "Sans 8",
334           &SPECIFIC_PREFS.normalfont,           P_STRING, NULL, NULL, NULL},
335 #endif
336         /* custom colors */
337         {"custom_color1", "#ff9900", &prefs_common.custom_colorlabel[0].color, P_COLOR,
338          NULL, NULL, NULL},
339         {"custom_colorlabel1", N_("Orange"), &prefs_common.custom_colorlabel[0].label, P_STRING,
340          NULL, NULL, NULL},
341         {"custom_color2", "#ff0000", &prefs_common.custom_colorlabel[1].color, P_COLOR,
342          NULL, NULL, NULL},
343         {"custom_colorlabel2", N_("Red"), &prefs_common.custom_colorlabel[1].label, P_STRING,
344          NULL, NULL, NULL},
345         {"custom_color3", "#ff66ff", &prefs_common.custom_colorlabel[2].color, P_COLOR,
346          NULL, NULL, NULL},
347         {"custom_colorlabel3", N_("Pink"), &prefs_common.custom_colorlabel[2].label, P_STRING,
348          NULL, NULL, NULL},
349         {"custom_color4", "#00ccff", &prefs_common.custom_colorlabel[3].color, P_COLOR,
350          NULL, NULL, NULL},
351         {"custom_colorlabel4", N_("Sky blue"), &prefs_common.custom_colorlabel[3].label, P_STRING,
352          NULL, NULL, NULL},
353         {"custom_color5", "#0000ff", &prefs_common.custom_colorlabel[4].color, P_COLOR,
354          NULL, NULL, NULL},
355         {"custom_colorlabel5", N_("Blue"), &prefs_common.custom_colorlabel[4].label, P_STRING,
356          NULL, NULL, NULL},
357         {"custom_color6", "#009900", &prefs_common.custom_colorlabel[5].color, P_COLOR,
358          NULL, NULL, NULL},
359         {"custom_colorlabel6", N_("Green"), &prefs_common.custom_colorlabel[5].label, P_STRING,
360          NULL, NULL, NULL},
361         {"custom_color7", "#663333", &prefs_common.custom_colorlabel[6].color, P_COLOR,
362          NULL, NULL, NULL},
363         {"custom_colorlabel7", N_("Brown"), &prefs_common.custom_colorlabel[6].label, P_STRING,
364          NULL, NULL, NULL},
365         {"custom_color8", "#aaaaaa", &prefs_common.custom_colorlabel[7].color, P_COLOR,
366          NULL, NULL, NULL},
367         {"custom_colorlabel8", N_("Grey"), &prefs_common.custom_colorlabel[7].label, P_STRING,
368          NULL, NULL, NULL},
369         {"custom_color9", "#c07254", &prefs_common.custom_colorlabel[8].color, P_COLOR,
370          NULL, NULL, NULL},
371         {"custom_colorlabel9", N_("Light brown"), &prefs_common.custom_colorlabel[8].label, P_STRING,
372          NULL, NULL, NULL},
373         {"custom_color10", "#c00000", &prefs_common.custom_colorlabel[9].color, P_COLOR,
374          NULL, NULL, NULL},
375         {"custom_colorlabel10", N_("Dark red"), &prefs_common.custom_colorlabel[9].label, P_STRING,
376          NULL, NULL, NULL},
377         {"custom_color11", "#cc1074", &prefs_common.custom_colorlabel[10].color, P_COLOR,
378          NULL, NULL, NULL},
379         {"custom_colorlabel11", N_("Dark pink"), &prefs_common.custom_colorlabel[10].label, P_STRING,
380          NULL, NULL, NULL},
381         {"custom_color12", "#5094cd", &prefs_common.custom_colorlabel[11].color, P_COLOR,
382          NULL, NULL, NULL},
383         {"custom_colorlabel12", N_("Steel blue"), &prefs_common.custom_colorlabel[11].label, P_STRING,
384          NULL, NULL, NULL},
385         {"custom_color13", "#ffd500", &prefs_common.custom_colorlabel[12].color, P_COLOR,
386          NULL, NULL, NULL},
387         {"custom_colorlabel13", N_("Gold"), &prefs_common.custom_colorlabel[12].label, P_STRING,
388          NULL, NULL, NULL},
389         {"custom_color14", "#00d800", &prefs_common.custom_colorlabel[13].color, P_COLOR,
390          NULL, NULL, NULL},
391         {"custom_colorlabel14", N_("Bright green"), &prefs_common.custom_colorlabel[13].label, P_STRING,
392          NULL, NULL, NULL},
393         {"custom_color15", "#c060c0", &prefs_common.custom_colorlabel[14].color, P_COLOR,
394          NULL, NULL, NULL},
395         {"custom_colorlabel15", N_("Magenta"), &prefs_common.custom_colorlabel[14].label, P_STRING,
396          NULL, NULL, NULL},
397
398         /* image viewer */
399         {"display_image", "TRUE", &prefs_common.display_img, P_BOOL,
400          NULL, NULL, NULL},
401         {"resize_image", "TRUE", &prefs_common.resize_img, P_BOOL,
402          NULL, NULL, NULL},
403         {"inline_image", "TRUE", &prefs_common.inline_img, P_BOOL,
404          NULL, NULL, NULL},
405
406         {"display_folder_unread_num", "0",
407          &prefs_common.display_folder_unread, P_INT,
408          NULL, NULL, NULL},
409         {"newsgroup_abbrev_len", "16",
410          &prefs_common.ng_abbrev_len, P_INT,
411          NULL, NULL, NULL},
412
413         {"translate_header", "FALSE", &prefs_common.trans_hdr, P_BOOL,
414          NULL, NULL, NULL},
415
416         /* Display: Summary View */
417         {"use_address_book", "FALSE", &prefs_common.use_addr_book, P_BOOL,
418          NULL, NULL, NULL},
419         {"thread_by_subject", "TRUE", &prefs_common.thread_by_subject, P_BOOL,
420          NULL, NULL, NULL},
421         {"date_format", N_("%y/%m/%d(%a) %H:%M"), &prefs_common.date_format,
422          P_STRING, NULL, NULL, NULL},
423
424         {"bold_unread", "TRUE", &prefs_common.bold_unread, P_BOOL,
425          NULL, NULL, NULL},
426
427         {"enable_thread", "TRUE", &prefs_common.enable_thread, P_BOOL,
428          NULL, NULL, NULL},
429 #ifndef MAEMO
430         {"toolbar_style", "3", &prefs_common.toolbar_style, P_ENUM,
431          NULL, NULL, NULL},
432 #else
433         {"toolbar_style", "1", &prefs_common.toolbar_style, P_ENUM,
434          NULL, NULL, NULL},
435 #endif
436         {"toolbar_detachable", "FALSE", &prefs_common.toolbar_detachable, P_BOOL,
437          NULL, NULL, NULL},
438         {"show_col_headers", "TRUE", &prefs_common.show_col_headers, P_BOOL,
439          NULL, NULL, NULL},
440 #ifndef MAEMO
441         {"show_statusbar", "TRUE", &prefs_common.show_statusbar, P_BOOL,
442          NULL, NULL, NULL},
443         {"show_searchbar", "TRUE", &prefs_common.show_searchbar, P_BOOL,
444          NULL, NULL, NULL},
445 #else
446         {"show_statusbar", "FALSE", &prefs_common.show_statusbar, P_BOOL,
447          NULL, NULL, NULL},
448         {"show_searchbar", "FALSE", &prefs_common.show_searchbar, P_BOOL,
449          NULL, NULL, NULL},
450 #endif
451
452         {"summary_col_show_mark", "TRUE",
453          &prefs_common.summary_col_visible[S_COL_MARK], P_BOOL, NULL, NULL, NULL},
454         {"summary_col_show_unread", "TRUE",
455          &prefs_common.summary_col_visible[S_COL_STATUS], P_BOOL, NULL, NULL, NULL},
456         {"summary_col_show_subject", "TRUE",
457          &prefs_common.summary_col_visible[S_COL_SUBJECT], P_BOOL, NULL, NULL, NULL},
458         {"summary_col_show_from", "TRUE",
459          &prefs_common.summary_col_visible[S_COL_FROM], P_BOOL, NULL, NULL, NULL},
460         {"summary_col_show_to", "FALSE",
461          &prefs_common.summary_col_visible[S_COL_TO], P_BOOL, NULL, NULL, NULL},
462         {"summary_col_show_date", "TRUE",
463          &prefs_common.summary_col_visible[S_COL_DATE], P_BOOL, NULL, NULL, NULL},
464         {"summary_col_show_mime", "TRUE",
465          &prefs_common.summary_col_visible[S_COL_MIME], P_BOOL, NULL, NULL, NULL},
466         {"summary_col_show_size", "TRUE",
467          &prefs_common.summary_col_visible[S_COL_SIZE], P_BOOL, NULL, NULL, NULL},
468         {"summary_col_show_number", "FALSE",
469          &prefs_common.summary_col_visible[S_COL_NUMBER], P_BOOL, NULL, NULL, NULL},
470         {"summary_col_show_score", "FALSE",
471          &prefs_common.summary_col_visible[S_COL_SCORE], P_BOOL, NULL, NULL, NULL},
472         {"summary_col_show_locked", "FALSE",
473          &prefs_common.summary_col_visible[S_COL_LOCKED], P_BOOL, NULL, NULL, NULL},
474         {"summary_col_show_tags", "FALSE",
475          &prefs_common.summary_col_visible[S_COL_TAGS], P_BOOL, NULL, NULL, NULL},
476
477         {"summary_col_pos_mark", "0",
478           &prefs_common.summary_col_pos[S_COL_MARK], P_INT, NULL, NULL, NULL},
479         {"summary_col_pos_unread", "1",
480           &prefs_common.summary_col_pos[S_COL_STATUS], P_INT, NULL, NULL, NULL},
481         {"summary_col_pos_mime", "2",
482           &prefs_common.summary_col_pos[S_COL_MIME], P_INT, NULL, NULL, NULL},
483         {"summary_col_pos_subject", "3",
484           &prefs_common.summary_col_pos[S_COL_SUBJECT], P_INT, NULL, NULL, NULL},
485         {"summary_col_pos_from", "4",
486           &prefs_common.summary_col_pos[S_COL_FROM], P_INT, NULL, NULL, NULL},
487         {"summary_col_pos_date", "5",
488           &prefs_common.summary_col_pos[S_COL_DATE], P_INT, NULL, NULL, NULL},
489         {"summary_col_pos_size", "6",
490           &prefs_common.summary_col_pos[S_COL_SIZE], P_INT, NULL, NULL, NULL},
491         {"summary_col_pos_number", "7",
492           &prefs_common.summary_col_pos[S_COL_NUMBER], P_INT, NULL, NULL, NULL},
493         {"summary_col_pos_score", "8",
494          &prefs_common.summary_col_pos[S_COL_SCORE], P_INT, NULL, NULL, NULL},
495         {"summary_col_pos_locked", "9",
496          &prefs_common.summary_col_pos[S_COL_LOCKED], P_INT, NULL, NULL, NULL},
497         {"summary_col_pos_to", "10",
498           &prefs_common.summary_col_pos[S_COL_TO], P_INT, NULL, NULL, NULL},
499         {"summary_col_pos_tags", "11",
500           &prefs_common.summary_col_pos[S_COL_TAGS], P_INT, NULL, NULL, NULL},
501
502         {"summary_col_size_mark", "10",
503          &prefs_common.summary_col_size[S_COL_MARK], P_INT, NULL, NULL, NULL},
504         {"summary_col_size_unread", "13",
505          &prefs_common.summary_col_size[S_COL_STATUS], P_INT, NULL, NULL, NULL},
506         {"summary_col_size_mime", "10",
507          &prefs_common.summary_col_size[S_COL_MIME], P_INT, NULL, NULL, NULL},
508 #ifndef MAEMO
509         {"summary_col_size_subject", "200",
510          &prefs_common.summary_col_size[S_COL_SUBJECT], P_INT, NULL, NULL, NULL},
511         {"summary_col_size_from", "120",
512          &prefs_common.summary_col_size[S_COL_FROM], P_INT, NULL, NULL, NULL},
513         {"summary_col_size_to", "120",
514          &prefs_common.summary_col_size[S_COL_TO], P_INT, NULL, NULL, NULL},
515 #else
516         {"summary_col_size_subject", "300",
517          &prefs_common.summary_col_size[S_COL_SUBJECT], P_INT, NULL, NULL, NULL},
518         {"summary_col_size_from", "150",
519          &prefs_common.summary_col_size[S_COL_FROM], P_INT, NULL, NULL, NULL},
520         {"summary_col_size_to", "150",
521          &prefs_common.summary_col_size[S_COL_TO], P_INT, NULL, NULL, NULL},
522
523 #endif
524         {"summary_col_size_date", "118",
525          &prefs_common.summary_col_size[S_COL_DATE], P_INT, NULL, NULL, NULL},
526         {"summary_col_size_size", "45",
527          &prefs_common.summary_col_size[S_COL_SIZE], P_INT, NULL, NULL, NULL},
528         {"summary_col_size_number", "40",
529          &prefs_common.summary_col_size[S_COL_NUMBER], P_INT, NULL, NULL, NULL},
530         {"summary_col_size_score", "40",
531          &prefs_common.summary_col_size[S_COL_SCORE], P_INT, NULL, NULL, NULL},
532         {"summary_col_size_locked", "13",
533          &prefs_common.summary_col_size[S_COL_LOCKED], P_INT, NULL, NULL, NULL},
534         {"summary_col_size_tags", "150",
535          &prefs_common.summary_col_size[S_COL_TAGS], P_INT, NULL, NULL, NULL},
536
537         /* Widget size */
538         {"folderwin_x", "16", &prefs_common.folderwin_x, P_INT,
539          NULL, NULL, NULL},
540         {"folderwin_y", "16", &prefs_common.folderwin_y, P_INT,
541          NULL, NULL, NULL},
542         {"folderview_width", "270", &prefs_common.folderview_width, P_INT,
543          NULL, NULL, NULL},
544         {"folderview_height", "450", &prefs_common.folderview_height, P_INT,
545          NULL, NULL, NULL},
546         {"folderview_visible", "TRUE", &prefs_common.folderview_visible, P_BOOL,
547          NULL, NULL, NULL},
548
549         {"folder_col_show_folder", "TRUE",
550          &prefs_common.folder_col_visible[F_COL_FOLDER], P_BOOL, NULL, NULL, NULL},
551         {"folder_col_show_new", "TRUE",
552          &prefs_common.folder_col_visible[F_COL_NEW], P_BOOL, NULL, NULL, NULL},
553         {"folder_col_show_unread", "TRUE",
554          &prefs_common.folder_col_visible[F_COL_UNREAD], P_BOOL, NULL, NULL, NULL},
555         {"folder_col_show_total", "TRUE",
556          &prefs_common.folder_col_visible[F_COL_TOTAL], P_BOOL, NULL, NULL, NULL},
557
558         {"folder_col_pos_folder", "0",
559          &prefs_common.folder_col_pos[F_COL_FOLDER], P_INT, NULL, NULL, NULL},
560         {"folder_col_pos_new", "1",
561          &prefs_common.folder_col_pos[F_COL_NEW], P_INT, NULL, NULL, NULL},
562         {"folder_col_pos_unread", "2",
563          &prefs_common.folder_col_pos[F_COL_UNREAD], P_INT, NULL, NULL, NULL},
564         {"folder_col_pos_total", "3",
565          &prefs_common.folder_col_pos[F_COL_TOTAL], P_INT, NULL, NULL, NULL},
566
567 #ifndef MAEMO
568         {"folder_col_size_folder", "120",
569          &prefs_common.folder_col_size[F_COL_FOLDER], P_INT, NULL, NULL, NULL},
570         {"folder_col_size_new", "32",
571          &prefs_common.folder_col_size[F_COL_NEW], P_INT, NULL, NULL, NULL},
572         {"folder_col_size_unread", "32",
573          &prefs_common.folder_col_size[F_COL_UNREAD], P_INT, NULL, NULL, NULL},
574         {"folder_col_size_total", "32",
575          &prefs_common.folder_col_size[F_COL_TOTAL], P_INT, NULL, NULL, NULL},
576 #else
577         {"folder_col_size_folder", "400",
578          &prefs_common.folder_col_size[F_COL_FOLDER], P_INT, NULL, NULL, NULL},
579         {"folder_col_size_new", "32",
580          &prefs_common.folder_col_size[F_COL_NEW], P_INT, NULL, NULL, NULL},
581         {"folder_col_size_unread", "32",
582          &prefs_common.folder_col_size[F_COL_UNREAD], P_INT, NULL, NULL, NULL},
583         {"folder_col_size_total", "32",
584          &prefs_common.folder_col_size[F_COL_TOTAL], P_INT, NULL, NULL, NULL},
585 #endif
586         {"summaryview_width", "500", &prefs_common.summaryview_width, P_INT,
587          NULL, NULL, NULL},
588         {"summaryview_height", "244", &prefs_common.summaryview_height, P_INT,
589          NULL, NULL, NULL},
590
591         {"main_messagewin_x", "256", &prefs_common.main_msgwin_x, P_INT,
592          NULL, NULL, NULL},
593         {"main_messagewin_y", "210", &prefs_common.main_msgwin_y, P_INT,
594          NULL, NULL, NULL},
595         {"messageview_width", "500", &prefs_common.msgview_width, P_INT,
596          NULL, NULL, NULL},
597         {"messageview_height", "213", &prefs_common.msgview_height, P_INT,
598          NULL, NULL, NULL},
599         {"messageview_visible", "TRUE", &prefs_common.msgview_visible, P_BOOL,
600          NULL, NULL, NULL},
601
602         {"mainview_x", "64", &prefs_common.mainview_x, P_INT,
603          NULL, NULL, NULL},
604         {"mainview_y", "64", &prefs_common.mainview_y, P_INT,
605          NULL, NULL, NULL},
606         {"mainview_width", "500", &prefs_common.mainview_width, P_INT,
607          NULL, NULL, NULL},
608         {"mainview_height", "400", &prefs_common.mainview_height, P_INT,
609          NULL, NULL, NULL},
610         {"mainwin_x", "64", &prefs_common.mainwin_x, P_INT,
611          NULL, NULL, NULL},
612         {"mainwin_y", "64", &prefs_common.mainwin_y, P_INT,
613          NULL, NULL, NULL},
614 #ifndef MAEMO
615         {"mainwin_width", "800", &prefs_common.mainwin_width, P_INT,
616          NULL, NULL, NULL},
617         {"mainwin_height", "600", &prefs_common.mainwin_height, P_INT,
618          NULL, NULL, NULL},
619         {"messagewin_width", "600", &prefs_common.msgwin_width, P_INT,
620          NULL, NULL, NULL},
621         {"messagewin_height", "540", &prefs_common.msgwin_height, P_INT,
622          NULL, NULL, NULL},
623         {"sourcewin_width", "600", &prefs_common.sourcewin_width, P_INT,
624          NULL, NULL, NULL},
625         {"sourcewin_height", "500", &prefs_common.sourcewin_height, P_INT,
626          NULL, NULL, NULL},
627         {"compose_width", "600", &prefs_common.compose_width, P_INT,
628          NULL, NULL, NULL},
629         {"compose_height", "560", &prefs_common.compose_height, P_INT,
630          NULL, NULL, NULL},
631 #else
632         {"mainwin_width", "700", &prefs_common.mainwin_width, P_INT,
633          NULL, NULL, NULL},
634         {"mainwin_height", "470", &prefs_common.mainwin_height, P_INT,
635          NULL, NULL, NULL},
636         {"messagewin_width", "700", &prefs_common.msgwin_width, P_INT,
637          NULL, NULL, NULL},
638         {"messagewin_height", "470", &prefs_common.msgwin_height, P_INT,
639          NULL, NULL, NULL},
640         {"sourcewin_width", "700", &prefs_common.sourcewin_width, P_INT,
641          NULL, NULL, NULL},
642         {"sourcewin_height", "470", &prefs_common.sourcewin_height, P_INT,
643          NULL, NULL, NULL},
644         {"compose_width", "700", &prefs_common.compose_width, P_INT,
645          NULL, NULL, NULL},
646         {"compose_height", "470", &prefs_common.compose_height, P_INT,
647          NULL, NULL, NULL},
648 #endif
649         {"compose_x", "0", &prefs_common.compose_x, P_INT,
650          NULL, NULL, NULL},
651         {"compose_y", "0", &prefs_common.compose_y, P_INT,
652          NULL, NULL, NULL},
653         /* Message */
654         {"enable_color", "TRUE", &prefs_common.enable_color, P_BOOL,
655          NULL, NULL, NULL},
656
657         {"quote_level1_color", "179", &prefs_common.quote_level1_col, P_COLOR,
658          NULL, NULL, NULL},
659         {"quote_level2_color", "179", &prefs_common.quote_level2_col, P_COLOR,
660          NULL, NULL, NULL},
661         {"quote_level3_color", "179", &prefs_common.quote_level3_col, P_COLOR,
662          NULL, NULL, NULL},
663         {"enable_bgcolor", "FALSE", &prefs_common.enable_bgcolor, P_BOOL,
664          NULL, NULL, NULL},
665         {"quote_level1_bgcolor", "13421772", &prefs_common.quote_level1_bgcol, P_COLOR,
666          NULL, NULL, NULL},
667         {"quote_level2_bgcolor", "13948116", &prefs_common.quote_level2_bgcol, P_COLOR,
668          NULL, NULL, NULL},
669         {"quote_level3_bgcolor", "14540253", &prefs_common.quote_level3_bgcol, P_COLOR,
670          NULL, NULL, NULL},
671         {"uri_color", "32512", &prefs_common.uri_col, P_COLOR,
672          NULL, NULL, NULL},
673         {"target_folder_color", "14294218", &prefs_common.tgt_folder_col, P_COLOR,
674          NULL, NULL, NULL},
675         {"signature_color", "7960953", &prefs_common.signature_col, P_COLOR,
676          NULL, NULL, NULL},
677         {"recycle_quote_colors", "FALSE", &prefs_common.recycle_quote_colors,
678          P_BOOL, NULL, NULL, NULL},
679
680         {"display_header_pane", "FALSE", &prefs_common.display_header_pane,
681          P_BOOL, NULL, NULL, NULL},
682         {"display_header", "TRUE", &prefs_common.display_header, P_BOOL,
683          NULL, NULL, NULL},
684         {"display_xface", "TRUE", &prefs_common.display_xface,
685          P_BOOL, NULL, NULL, NULL},
686         {"render_html", "TRUE", &prefs_common.render_html, P_BOOL,
687          NULL, NULL, NULL},
688         {"invoke_plugin_on_html", "FALSE", &prefs_common.invoke_plugin_on_html, P_BOOL,
689          NULL, NULL, NULL},
690         {"line_space", "2", &prefs_common.line_space, P_INT,
691          NULL, NULL, NULL},
692         {"never_send_retrcpt", "FALSE", &prefs_common.never_send_retrcpt, P_BOOL,
693          NULL, NULL, NULL},
694
695         {"enable_smooth_scroll", "FALSE",
696          &prefs_common.enable_smooth_scroll, P_BOOL,
697          NULL, NULL, NULL},
698         {"scroll_step", "1", &prefs_common.scroll_step, P_INT,
699          NULL, NULL, NULL},
700         {"scroll_half_page", "FALSE", &prefs_common.scroll_halfpage, P_BOOL,
701          NULL, NULL, NULL},
702         {"respect_flowed_format", "FALSE", &prefs_common.respect_flowed_format, P_BOOL,
703          NULL, NULL, NULL},
704
705         {"show_other_header", "FALSE", &prefs_common.show_other_header, P_BOOL,
706          NULL, NULL, NULL},
707
708         {"use_different_print_font", "FALSE", &prefs_common.use_different_print_font, P_BOOL,
709          NULL, NULL, NULL},
710
711         {"attach_desc", "TRUE", &prefs_common.attach_desc, P_BOOL,
712          NULL, NULL, NULL},
713         {"attach_save_directory", NULL,
714          &SPECIFIC_PREFS.attach_save_dir, P_STRING, NULL, NULL, NULL},
715         {"attach_load_directory", NULL,
716          &SPECIFIC_PREFS.attach_load_dir, P_STRING, NULL, NULL, NULL},
717
718         /* MIME viewer */
719         {"mime_textviewer",   NULL,
720          &SPECIFIC_PREFS.mime_textviewer,   P_STRING, NULL, NULL, NULL},
721         {"mime_open_command", "gedit '%s'",
722          &SPECIFIC_PREFS.mime_open_cmd,     P_STRING, NULL, NULL, NULL},
723
724         /* Interface */
725 #ifndef MAEMO
726         {"layout_mode", "0", &prefs_common.layout_mode, P_INT,
727          NULL, NULL, NULL},
728 #else
729         {"layout_mode", "5", &prefs_common.layout_mode, P_INT,
730          NULL, NULL, NULL},
731 #endif
732         /* {"emulate_emacs", "FALSE", &prefs_common.emulate_emacs, P_BOOL,
733          NULL, NULL, NULL}, */
734         {"always_show_message_when_selected", "FALSE",
735          &prefs_common.always_show_msg,
736          P_BOOL, NULL, NULL, NULL},
737         {"select_on_entry", "3", &prefs_common.select_on_entry,
738          P_ENUM, NULL, NULL, NULL},
739
740         {"summary_select_prio1", "0", &prefs_common.summary_select_prio[0], P_ENUM,
741          NULL, NULL, NULL},
742         {"summary_select_prio2", "0", &prefs_common.summary_select_prio[1], P_ENUM,
743          NULL, NULL, NULL},
744         {"summary_select_prio3", "0", &prefs_common.summary_select_prio[2], P_ENUM,
745          NULL, NULL, NULL},
746         {"summary_select_prio4", "0", &prefs_common.summary_select_prio[3], P_ENUM,
747          NULL, NULL, NULL},
748         {"summary_select_prio5", "0", &prefs_common.summary_select_prio[4], P_ENUM,
749          NULL, NULL, NULL},
750         {"summary_select_prio6", "0", &prefs_common.summary_select_prio[5], P_ENUM,
751          NULL, NULL, NULL},
752
753         {"mark_as_read_on_new_window", "FALSE",
754          &prefs_common.mark_as_read_on_new_window,
755          P_BOOL, NULL, NULL, NULL},
756         {"mark_as_read_delay", "0",
757          &prefs_common.mark_as_read_delay, P_INT, 
758          NULL, NULL, NULL},
759         {"immediate_execution", "TRUE", &prefs_common.immediate_exec, P_BOOL,
760          NULL, NULL, NULL},
761         {"nextunreadmsg_dialog", "1", &prefs_common.next_unread_msg_dialog, P_ENUM,
762          NULL, NULL, NULL},
763
764         {"pixmap_theme_path", DEFAULT_PIXMAP_THEME, 
765          &SPECIFIC_PREFS.pixmap_theme_path, P_STRING,
766          NULL, NULL, NULL},
767
768         {"ask_mark_all_read", "TRUE", &prefs_common.ask_mark_all_read, P_BOOL,
769          NULL, NULL, NULL},
770
771         {"ask_apply_per_account_filtering_rules", "TRUE", &prefs_common.ask_apply_per_account_filtering_rules, P_BOOL,
772          NULL, NULL, NULL},
773         {"apply_per_account_filtering_rules", "0", &prefs_common.apply_per_account_filtering_rules, P_ENUM,
774          NULL, NULL, NULL},
775
776         /* Addressbook */
777         {"addressbook_use_editaddress_dialog", "TRUE", &prefs_common.addressbook_use_editaddress_dialog,
778          P_BOOL, NULL, NULL, NULL},
779         {"addressbook_hpaned_pos", "-1", &prefs_common.addressbook_hpaned_pos,
780          P_INT, NULL, NULL, NULL},
781         {"addressbook_vpaned_pos", "-1", &prefs_common.addressbook_vpaned_pos,
782          P_INT, NULL, NULL, NULL},
783
784         /* Other */
785         {"uri_open_command", DEFAULT_BROWSER_CMD,
786          &SPECIFIC_PREFS.uri_cmd, P_STRING, NULL, NULL, NULL},
787         {"print_command", "lpr %s",
788          &SPECIFIC_PREFS.print_cmd, P_STRING, NULL, NULL, NULL},
789         {"ext_editor_command", DEFAULT_EDITOR_CMD,
790          &SPECIFIC_PREFS.ext_editor_cmd, P_STRING, NULL, NULL, NULL},
791         {"add_address_by_click", "FALSE", &prefs_common.add_address_by_click,
792          P_BOOL, NULL, NULL, NULL},
793         {"confirm_on_exit", "FALSE", &prefs_common.confirm_on_exit, P_BOOL,
794          NULL, NULL, NULL},
795         {"clean_trash_on_exit", "FALSE", &prefs_common.clean_on_exit, P_BOOL,
796          NULL, NULL, NULL},
797         {"ask_on_cleaning", "TRUE", &prefs_common.ask_on_clean, P_BOOL,
798          NULL, NULL, NULL},
799         {"warn_queued_on_exit", "TRUE", &prefs_common.warn_queued_on_exit,
800          P_BOOL, NULL, NULL, NULL},
801         {"work_offline", "FALSE", &prefs_common.work_offline, P_BOOL,
802          NULL, NULL, NULL},
803         {"summary_quicksearch_type", "0", &prefs_common.summary_quicksearch_type, P_INT,
804          NULL, NULL, NULL},
805 #ifndef MAEMO
806         {"summary_quicksearch_recurse", "1", &prefs_common.summary_quicksearch_recurse, P_INT,
807          NULL, NULL, NULL},
808 #else
809         {"summary_quicksearch_recurse", "0", &prefs_common.summary_quicksearch_recurse, P_INT,
810          NULL, NULL, NULL},
811 #endif
812
813         {"io_timeout_secs", "60", &prefs_common.io_timeout_secs,
814          P_INT, NULL, NULL, NULL},
815         {"hide_score", "-9999", &prefs_common.kill_score, P_INT,
816          NULL, NULL, NULL},
817         {"important_score", "1", &prefs_common.important_score, P_INT,
818          NULL, NULL, NULL},
819
820         {"clip_log", "TRUE", &prefs_common.cliplog, P_BOOL,
821          NULL, NULL, NULL},
822         {"log_length", "500", &prefs_common.loglength, P_INT,
823          NULL, NULL, NULL},
824 #ifndef MAEMO
825         {"enable_log_standard", "TRUE", &prefs_common.enable_log_standard, P_BOOL,
826          NULL, NULL, NULL},
827         {"enable_log_warning", "TRUE", &prefs_common.enable_log_warning, P_BOOL,
828          NULL, NULL, NULL},
829         {"enable_log_error", "TRUE", &prefs_common.enable_log_error, P_BOOL,
830          NULL, NULL, NULL},
831         {"enable_log_status", "TRUE", &prefs_common.enable_log_status, P_BOOL,
832          NULL, NULL, NULL},
833 #else
834         {"enable_log_standard", "FALSE", &prefs_common.enable_log_standard, P_BOOL,
835          NULL, NULL, NULL},
836         {"enable_log_warning", "FALSE", &prefs_common.enable_log_warning, P_BOOL,
837          NULL, NULL, NULL},
838         {"enable_log_error", "FALSE", &prefs_common.enable_log_error, P_BOOL,
839          NULL, NULL, NULL},
840         {"enable_log_status", "FALSE", &prefs_common.enable_log_status, P_BOOL,
841          NULL, NULL, NULL},
842 #endif
843         {"log_msg_color", "#00af00", &prefs_common.log_msg_color, P_COLOR,
844          NULL, NULL, NULL},
845         {"log_warn_color", "#af0000", &prefs_common.log_warn_color, P_COLOR,
846          NULL, NULL, NULL},
847         {"log_error_color", "#af0000", &prefs_common.log_error_color, P_COLOR,
848          NULL, NULL, NULL},
849         {"log_in_color", "#000000", &prefs_common.log_in_color, P_COLOR,
850          NULL, NULL, NULL},
851         {"log_out_color", "#0000ef", &prefs_common.log_out_color, P_COLOR,
852          NULL, NULL, NULL},
853         {"log_status_ok_color", "#00af00", &prefs_common.log_status_ok_color, P_COLOR,
854          NULL, NULL, NULL},
855         {"log_status_nok_color", "#0000af", &prefs_common.log_status_nok_color, P_COLOR,
856          NULL, NULL, NULL},
857         {"log_status_skip_color", "#aa00aa", &prefs_common.log_status_skip_color, P_COLOR,
858          NULL, NULL, NULL},
859
860     {"enable_filtering_debug", "FALSE", &prefs_common.enable_filtering_debug, P_BOOL,
861          NULL, NULL, NULL},
862     {"filtering_debug_level", "1", &prefs_common.filtering_debug_level, P_INT,
863          NULL, NULL, NULL},
864     {"enable_filtering_debug_inc", "TRUE", &prefs_common.enable_filtering_debug_inc, P_BOOL,
865          NULL, NULL, NULL},
866     {"enable_filtering_debug_manual", "TRUE", &prefs_common.enable_filtering_debug_manual, P_BOOL,
867          NULL, NULL, NULL},
868     {"enable_filtering_debug_folder_proc", "FALSE", &prefs_common.enable_filtering_debug_folder_proc, P_BOOL,
869          NULL, NULL, NULL},
870     {"enable_filtering_debug_pre_proc", "FALSE", &prefs_common.enable_filtering_debug_pre_proc, P_BOOL,
871          NULL, NULL, NULL},
872     {"enable_filtering_debug_post_proc", "FALSE", &prefs_common.enable_filtering_debug_post_proc, P_BOOL,
873          NULL, NULL, NULL},
874     {"filtering_debug_clip_log", "TRUE", &prefs_common.filtering_debug_cliplog, P_BOOL,
875          NULL, NULL, NULL},
876         {"filtering_debug_log_length", "500", &prefs_common.filtering_debug_loglength, P_INT,
877          NULL, NULL, NULL},
878
879         {"gtk_can_change_accels", "TRUE", &prefs_common.gtk_can_change_accels, P_BOOL,
880          NULL, NULL, NULL},
881
882         {"color_new", "179", &prefs_common.color_new, P_COLOR,
883          NULL, NULL, NULL},
884
885         /* Some windows' sizes */
886         {"filteringwin_width", "500", &prefs_common.filteringwin_width, P_INT,
887          NULL, NULL, NULL},
888         {"filteringwin_height", "-1", &prefs_common.filteringwin_height, P_INT,
889          NULL, NULL, NULL},
890
891         {"filteringactionwin_width", "490", &prefs_common.filteringactionwin_width, P_INT,
892          NULL, NULL, NULL},
893         {"filteringactionwin_height", "-1", &prefs_common.filteringactionwin_height, P_INT,
894          NULL, NULL, NULL},
895
896         {"matcherwin_width", "520", &prefs_common.matcherwin_width, P_INT,
897          NULL, NULL, NULL},
898         {"matcherwin_height", "-1", &prefs_common.matcherwin_height, P_INT,
899          NULL, NULL, NULL},
900
901         {"templateswin_width", "480", &prefs_common.templateswin_width, P_INT,
902          NULL, NULL, NULL},
903         {"templateswin_height", "-1", &prefs_common.templateswin_height, P_INT,
904          NULL, NULL, NULL},
905
906         {"actionswin_width", "486", &prefs_common.actionswin_width, P_INT,
907          NULL, NULL, NULL},
908         {"actionswin_height", "-1", &prefs_common.actionswin_height, P_INT,
909          NULL, NULL, NULL},
910
911         {"tagswin_width", "486", &prefs_common.tagswin_width, P_INT,
912          NULL, NULL, NULL},
913         {"tagswin_height", "-1", &prefs_common.tagswin_height, P_INT,
914          NULL, NULL, NULL},
915
916         {"addressbookwin_width", "520", &prefs_common.addressbookwin_width, P_INT,
917          NULL, NULL, NULL},
918         {"addressbookwin_height", "-1", &prefs_common.addressbookwin_height, P_INT,
919          NULL, NULL, NULL},
920
921         {"addressbookeditpersonwin_width", "640", &prefs_common.addressbookeditpersonwin_width, P_INT,
922          NULL, NULL, NULL},
923         {"addressbookeditpersonwin_height", "320", &prefs_common.addressbookeditpersonwin_height, P_INT,
924          NULL, NULL, NULL},
925
926         {"addressbookeditgroupwin_width", "580", &prefs_common.addressbookeditgroupwin_width, P_INT,
927          NULL, NULL, NULL},
928         {"addressbookeditgroupwin_height", "340", &prefs_common.addressbookeditgroupwin_height, P_INT,
929          NULL, NULL, NULL},
930
931         {"pluginswin_width", "-1", &prefs_common.pluginswin_width, P_INT,
932          NULL, NULL, NULL},
933         {"pluginswin_height", "-1", &prefs_common.pluginswin_height, P_INT,
934          NULL, NULL, NULL},
935
936         {"prefswin_width", "600", &prefs_common.prefswin_width, P_INT,
937          NULL, NULL, NULL},
938         {"prefswin_height", "-1", &prefs_common.prefswin_height, P_INT,
939          NULL, NULL, NULL},
940
941         {"folderitemwin_width", "500", &prefs_common.folderitemwin_width, P_INT,
942          NULL, NULL, NULL},
943         {"folderitemwin_height", "-1", &prefs_common.folderitemwin_height, P_INT,
944          NULL, NULL, NULL},
945
946         {"zero_replacement_char", "0", &prefs_common.zero_replacement, P_STRING,
947          NULL, NULL, NULL},
948
949         {"editaccountwin_width", "500", &prefs_common.editaccountwin_width, P_INT,
950          NULL, NULL, NULL},
951         {"editaccountwin_height", "-1", &prefs_common.editaccountwin_height, P_INT,
952          NULL, NULL, NULL},
953
954         {"accountswin_width", "500", &prefs_common.accountswin_width, P_INT,
955          NULL, NULL, NULL},
956         {"accountswin_height", "-1", &prefs_common.accountswin_height, P_INT,
957          NULL, NULL, NULL},
958
959         {"logwin_width", "520", &prefs_common.logwin_width, P_INT,
960          NULL, NULL, NULL},
961         {"logwin_height", "-1", &prefs_common.logwin_height, P_INT,
962          NULL, NULL, NULL},
963
964         {"filtering_debugwin_width", "600", &prefs_common.filtering_debugwin_width, P_INT,
965          NULL, NULL, NULL},
966         {"filtering_debugwin_height", "-1", &prefs_common.filtering_debugwin_height, P_INT,
967          NULL, NULL, NULL},
968
969         {"folderselwin_width", "300", &prefs_common.folderselwin_width, P_INT,
970          NULL, NULL, NULL},
971         {"folderselwin_height", "-1", &prefs_common.folderselwin_height, P_INT,
972          NULL, NULL, NULL},
973
974         {"addressaddwin_width", "300", &prefs_common.addressaddwin_width, P_INT,
975          NULL, NULL, NULL},
976         {"addressaddwin_height", "-1", &prefs_common.addressaddwin_height, P_INT,
977          NULL, NULL, NULL},
978
979         {"addressbook_folderselwin_width", "300", &prefs_common.addressbook_folderselwin_width, P_INT,
980          NULL, NULL, NULL},
981         {"addressbook_folderselwin_height", "-1", &prefs_common.addressbook_folderselwin_height, P_INT,
982          NULL, NULL, NULL},
983
984         /* Hidden */
985         {"warn_dnd", "1", &prefs_common.warn_dnd, P_INT,
986          NULL, NULL, NULL},
987         {"utf8_instead_of_locale_for_broken_mail", "0", 
988          &prefs_common.broken_are_utf8, P_INT,
989          NULL, NULL, NULL},
990         {"enable_swap_from", "FALSE", &prefs_common.swap_from, P_BOOL,
991          NULL, NULL, NULL},
992         {"use_stripes_everywhere", "TRUE", &prefs_common.use_stripes_everywhere, P_BOOL,
993          NULL, NULL, NULL},
994         {"use_stripes_in_summaries", "TRUE", &prefs_common.use_stripes_in_summaries, P_BOOL,
995          NULL, NULL, NULL},
996         {"stripes_color_offset", "4000", &prefs_common.stripes_color_offset, P_INT,
997          NULL, NULL, NULL},
998         {"enable_dotted_lines", "FALSE", &prefs_common.enable_dotted_lines, P_BOOL,
999          NULL, NULL, NULL},
1000         {"enable_hscrollbar", "TRUE", &prefs_common.enable_hscrollbar, P_BOOL,
1001          NULL, NULL, NULL},
1002         {"folderview_vscrollbar_policy", "0",
1003          &prefs_common.folderview_vscrollbar_policy, P_ENUM,
1004          NULL, NULL, NULL},
1005         {"textview_cursor_visible", "FALSE",
1006          &prefs_common.textview_cursor_visible, P_BOOL,
1007          NULL, NULL, NULL},
1008         {"hover_timeout", "500", &prefs_common.hover_timeout, P_INT,
1009          NULL, NULL, NULL},
1010 #ifndef MAEMO
1011         {"cache_max_mem_usage", "4096", &prefs_common.cache_max_mem_usage, P_INT,
1012          NULL, NULL, NULL},
1013         {"cache_min_keep_time", "15", &prefs_common.cache_min_keep_time, P_INT,
1014          NULL, NULL, NULL},
1015 #else
1016         {"cache_max_mem_usage", "4096", &prefs_common.cache_max_mem_usage, P_INT,
1017          NULL, NULL, NULL},
1018         {"cache_min_keep_time", "0", &prefs_common.cache_min_keep_time, P_INT,
1019          NULL, NULL, NULL},
1020 #endif
1021         {"thread_by_subject_max_age", "10", &prefs_common.thread_by_subject_max_age,
1022         P_INT, NULL, NULL, NULL },
1023         {"last_opened_folder", "", &prefs_common.last_opened_folder,
1024         P_STRING, NULL, NULL, NULL },
1025         {"goto_last_folder_on_startup", "FALSE", &prefs_common.goto_last_folder_on_startup,
1026         P_BOOL, NULL, NULL, NULL },
1027         {"summary_quicksearch_sticky", "1", &prefs_common.summary_quicksearch_sticky, P_INT,
1028          NULL, NULL, NULL},
1029         {"summary_quicksearch_dynamic", "0", &prefs_common.summary_quicksearch_dynamic, P_INT,
1030          NULL, NULL, NULL},
1031         {"summary_quicksearch_autorun", "0", &prefs_common.summary_quicksearch_autorun, P_INT,
1032          NULL, NULL, NULL},
1033         {"statusbar_update_step", "10", &prefs_common.statusbar_update_step, P_INT,
1034          NULL, NULL, NULL},
1035         {"compose_no_markup", "FALSE", &prefs_common.compose_no_markup, P_BOOL,
1036          NULL, NULL, NULL},
1037         {"skip_ssl_cert_check", "FALSE", &prefs_common.skip_ssl_cert_check, P_BOOL,
1038          NULL, NULL, NULL},
1039         {"live_dangerously", "FALSE", &prefs_common.live_dangerously, P_BOOL,
1040          NULL, NULL, NULL},
1041         {"hide_quotes", "0", &prefs_common.hide_quotes, P_INT,
1042          NULL, NULL, NULL},
1043         {"unsafe_ssl_certs", "FALSE", &prefs_common.unsafe_ssl_certs, P_BOOL,
1044          NULL, NULL, NULL},
1045 #ifndef MAEMO
1046         {"real_time_sync", "FALSE", &prefs_common.real_time_sync, P_BOOL,
1047          NULL, NULL, NULL},
1048 #else
1049         {"real_time_sync", "TRUE", &prefs_common.real_time_sync, P_BOOL,
1050          NULL, NULL, NULL},
1051 #endif
1052         {NULL, NULL, NULL, P_OTHER, NULL, NULL, NULL}
1053 };
1054
1055 PrefsCommon *prefs_common_get(void)
1056 {
1057         return &prefs_common;
1058 }
1059
1060 /*
1061  * Read history list from the specified history file
1062  */
1063 static GList *prefs_common_read_history(const gchar *history) 
1064 {
1065         FILE *fp;
1066         gchar *path;
1067         gchar buf[PREFSBUFSIZE];
1068         GList *tmp = NULL;
1069
1070         path = g_strconcat(get_rc_dir(), G_DIR_SEPARATOR_S, history,
1071                            NULL);
1072         if ((fp = g_fopen(path, "rb")) == NULL) {
1073                 if (ENOENT != errno) FILE_OP_ERROR(path, "fopen");
1074                 g_free(path);
1075                 return NULL;
1076         }
1077         g_free(path);
1078         while (fgets(buf, sizeof(buf), fp) != NULL) {
1079                 g_strstrip(buf);
1080                 if (buf[0] == '\0') continue;
1081                 tmp = add_history(tmp, buf);
1082         }
1083         fclose(fp);
1084
1085         tmp = g_list_reverse(tmp);
1086
1087         return tmp;
1088 }
1089
1090 void prefs_common_read_config(void)
1091 {
1092         gchar *rcpath;
1093         gchar *tmp;
1094
1095         rcpath = g_strconcat(get_rc_dir(), G_DIR_SEPARATOR_S, COMMON_RC, NULL);
1096         prefs_read_config(param, "Common", rcpath, NULL);
1097 #ifdef G_OS_WIN32
1098         prefs_read_config(param_os_specific, "CommonWin32", rcpath, NULL);
1099 #endif
1100
1101         g_free(rcpath);
1102
1103         tmp = g_strdup(gettext(prefs_common.quotefmt));
1104         g_free(prefs_common.quotefmt);
1105         prefs_common.quotefmt = tmp;
1106
1107         tmp = g_strdup(gettext(prefs_common.fw_quotefmt));
1108         g_free(prefs_common.fw_quotefmt);
1109         prefs_common.fw_quotefmt = tmp;
1110         
1111         tmp = g_strdup(gettext(prefs_common.date_format));
1112         g_free(prefs_common.date_format);
1113         prefs_common.date_format = tmp;
1114
1115         tmp = g_strdup(gettext(prefs_common.compose_body_format));
1116         g_free(prefs_common.compose_body_format);
1117         prefs_common.compose_body_format = tmp;
1118
1119         prefs_common.mime_open_cmd_history =
1120                 prefs_common_read_history(COMMAND_HISTORY);
1121         prefs_common.summary_quicksearch_history =
1122                 prefs_common_read_history(QUICKSEARCH_HISTORY);
1123         prefs_common.summary_search_from_history =
1124                 prefs_common_read_history(SUMMARY_SEARCH_FROM_HISTORY);
1125         prefs_common.summary_search_to_history =
1126                 prefs_common_read_history(SUMMARY_SEARCH_TO_HISTORY);
1127         prefs_common.summary_search_subject_history =
1128                 prefs_common_read_history(SUMMARY_SEARCH_SUBJECT_HISTORY);
1129         prefs_common.summary_search_body_history =
1130                 prefs_common_read_history(SUMMARY_SEARCH_BODY_HISTORY);
1131         prefs_common.summary_search_adv_condition_history =
1132                 prefs_common_read_history(SUMMARY_SEARCH_ADV_CONDITION_HISTORY);
1133         prefs_common.message_search_history =
1134                 prefs_common_read_history(MESSAGE_SEARCH_HISTORY);
1135
1136         colorlabel_update_colortable_from_prefs();
1137 }
1138
1139 #define TRY(func) \
1140 if (!(func)) \
1141 { \
1142         g_warning("failed to write\n"); \
1143         goto out;                       \
1144 } \
1145
1146 /*
1147  * Save history list to the specified history file
1148  */
1149 static void prefs_common_save_history(const gchar *history, GList *list)
1150 {
1151         GList *cur;
1152         FILE *fp;
1153         gchar *path, *tmp_path;
1154
1155         path = g_strconcat(get_rc_dir(), G_DIR_SEPARATOR_S, history,
1156                            NULL);
1157         tmp_path = g_strconcat(path, ".tmp", NULL);
1158
1159         if ((fp = g_fopen(tmp_path, "wb")) == NULL) {
1160                 FILE_OP_ERROR(tmp_path, "fopen");
1161                 goto out;
1162         }
1163
1164         for (cur = list; cur != NULL; cur = cur->next) {
1165                 TRY(fputs((gchar *)cur->data, fp) != EOF &&
1166                     fputc('\n', fp) != EOF);
1167         }
1168
1169         if (fclose(fp) == EOF) {
1170                 FILE_OP_ERROR(tmp_path, "fclose");
1171                 fp = NULL;
1172                 goto out;
1173         }
1174         fp = NULL;
1175 #ifdef G_OS_WIN32
1176         g_unlink(path);
1177 #endif
1178         if (g_rename(tmp_path, path) < 0) {
1179                 FILE_OP_ERROR(path, "rename");
1180                 goto out;
1181         }
1182
1183 out:
1184         if (fp)
1185                 fclose(fp);
1186         g_free(tmp_path);
1187         g_free(path);
1188 }
1189
1190 #undef TRY
1191
1192 void prefs_common_write_config(void)
1193 {
1194         prefs_write_config(param, "Common", COMMON_RC);
1195 #ifdef G_OS_WIN32
1196         prefs_write_config(param_os_specific, "CommonWin32", COMMON_RC);
1197 #endif
1198
1199         prefs_common_save_history(COMMAND_HISTORY, 
1200                 prefs_common.mime_open_cmd_history);
1201         prefs_common_save_history(QUICKSEARCH_HISTORY, 
1202                 prefs_common.summary_quicksearch_history);
1203         prefs_common_save_history(SUMMARY_SEARCH_FROM_HISTORY, 
1204                 prefs_common.summary_search_from_history);
1205         prefs_common_save_history(SUMMARY_SEARCH_TO_HISTORY, 
1206                 prefs_common.summary_search_to_history);
1207         prefs_common_save_history(SUMMARY_SEARCH_SUBJECT_HISTORY, 
1208                 prefs_common.summary_search_subject_history);
1209         prefs_common_save_history(SUMMARY_SEARCH_BODY_HISTORY, 
1210                 prefs_common.summary_search_body_history);
1211         prefs_common_save_history(SUMMARY_SEARCH_ADV_CONDITION_HISTORY, 
1212                 prefs_common.summary_search_adv_condition_history);
1213         prefs_common_save_history(MESSAGE_SEARCH_HISTORY, 
1214                 prefs_common.message_search_history);
1215 }
1216
1217 /* make a copy of string 'in' into buffer 'out'. un-escape \ sequences.
1218    both 'in' and 'out' must be non-NULL.
1219    'out' must be a pointer to a buffer whose size is at least equal
1220    to strlen(txt)+1, this buffer will get cleared. out's contents
1221    will always get set to a valid string, even if it's "".*/
1222 void pref_get_unescaped_pref(gchar *out, const gchar *in)
1223 {
1224         const gchar *i;
1225         gchar *o;
1226
1227         *out = '\0';
1228
1229         g_return_if_fail( in != NULL );
1230         g_return_if_fail( out != NULL );
1231
1232         i = in;
1233         o = out;
1234         memset(out, 0, strlen(in)+1);
1235         while (*i != '\0') {
1236                 if (*i == '\\' && *(i+1) == 'n') {
1237                         *o++ = '\n';
1238                         i++;
1239                 } else if (*i == '\\' && *(i+1) == 't') {
1240                         *o++ = '\t';
1241                         i++;
1242                 } else if (*i == '\\' && *(i+1) == '\\') {
1243                         *o++ = '\\';
1244                         i++;
1245                 } else {
1246                         *o++ = *i;
1247                 }
1248                 i++;
1249         }
1250         *o='\0';
1251 }
1252
1253 /* make a copy of string 'in' into buffer 'out'. escape \ sequences.
1254    both 'in' and 'out' must be non-NULL.
1255    'out' must be a pointer to a buffer whose size is at least equal
1256    to 2*strlen(txt)+1. out's contents will always get set to a valid
1257    string, even if it's "". */
1258 void pref_get_escaped_pref(gchar *out, const gchar *in)
1259 {
1260         const gchar *i;
1261         gchar *o;
1262
1263         *out = '\0';
1264
1265         g_return_if_fail( in != NULL );
1266         g_return_if_fail( out != NULL );
1267
1268         i = in;
1269         o = out;
1270         while (*i != '\0') {
1271                 if (*i == '\n') {
1272                         *o++ = '\\';
1273                         *o++ = 'n';
1274                 } else if (*i == '\t') {
1275                         *o++ = '\\';
1276                         *o++ = 't';
1277                 } else if (*i == '\\') {
1278                         *o++ = '\\';
1279                         *o++ = '\\';
1280                 } else {
1281                         *o++ = *i;
1282                 }
1283                 i++;
1284         }
1285         *o = '\0';
1286 }
1287                 
1288 /* set the contents of a textview widget from the internal \-escaped
1289   representation of a pref string. both txt and textview must be non-NULL. */
1290 void pref_set_textview_from_pref(GtkTextView *textview, const gchar *txt)
1291 {
1292         GtkTextBuffer *buffer;
1293         gchar *out = NULL;
1294
1295         g_return_if_fail( textview != NULL );
1296
1297         buffer = gtk_text_view_get_buffer(textview);
1298
1299         if (!txt) {
1300                 gtk_text_buffer_set_text(buffer, "", -1);
1301         } else {
1302                 out = malloc(strlen(txt)+1);
1303
1304                 pref_get_unescaped_pref(out, txt);
1305
1306                 gtk_text_buffer_set_text(buffer, out?out:"", -1);
1307                 g_free(out);
1308         }
1309 }
1310
1311 /* set the contents of a gtkentry widget from the internal \-escaped
1312   representation of a pref string. both txt and entry must be non-NULL. */
1313 void pref_set_entry_from_pref(GtkEntry *entry, const gchar *txt)
1314 {
1315         gchar *out = NULL;
1316
1317         g_return_if_fail( entry != NULL );
1318         if (!txt) {
1319                 gtk_entry_set_text(entry, "");
1320         } else {
1321                 out = malloc(strlen(txt)+1);
1322
1323                 pref_get_unescaped_pref(out, txt);
1324
1325                 gtk_entry_set_text(entry, out?out:"");
1326                 g_free(out);
1327         }
1328 }
1329
1330 /* get the \-escaped internal representation of a pref from the contents of
1331    a textview widget. textview must be non-NULL. */
1332 gchar *pref_get_pref_from_textview(GtkTextView *textview) 
1333 {
1334         GtkTextBuffer *buffer;
1335         GtkTextIter start, end;
1336         gchar *out, *tmp;
1337         
1338         g_return_val_if_fail( textview != NULL, "" );
1339
1340         buffer = gtk_text_view_get_buffer(textview);
1341         gtk_text_buffer_get_start_iter(buffer, &start);
1342         gtk_text_buffer_get_iter_at_offset(buffer, &end, -1);
1343         tmp = gtk_text_buffer_get_text(buffer, &start, &end, FALSE);
1344         out = malloc(2*strlen(tmp)+1);
1345         
1346         pref_get_escaped_pref(out, tmp);
1347         g_free(tmp);
1348
1349         return out?out:"";
1350 }
1351
1352 /* get the \-escaped internal representation of a pref from the contents of
1353    a gtkentry widget. entry must be non-NULL. */
1354 gchar *pref_get_pref_from_entry(GtkEntry *entry) 
1355 {
1356         gchar *out, *tmp;
1357
1358         g_return_val_if_fail( entry != NULL, "" );
1359
1360         tmp = gtk_editable_get_chars(GTK_EDITABLE(entry), 0, -1);
1361         out = malloc(2*strlen(tmp)+1);
1362
1363         pref_get_escaped_pref(out, tmp);
1364         g_free(tmp);
1365
1366         return out?out:"";
1367 }
1368
1369 /* ugly hack to be able to get this pref from ssl_certificate.c */
1370 gboolean prefs_common_unsafe_ssl_certs(void)
1371 {
1372         return prefs_common.unsafe_ssl_certs;
1373 }
1374
1375 gboolean prefs_common_enable_log_standard(void)
1376 {
1377         return prefs_common.enable_log_standard;
1378 }
1379
1380 gboolean prefs_common_enable_log_warning(void)
1381 {
1382         return prefs_common.enable_log_warning;
1383 }
1384 gboolean prefs_common_enable_log_error(void)
1385 {
1386         return prefs_common.enable_log_error;
1387 }
1388 gboolean prefs_common_enable_log_status(void)
1389 {
1390         return prefs_common.enable_log_status;
1391 }
1392
1393 #ifdef MAEMO
1394 const gchar *prefs_common_get_data_root(void)
1395 {
1396         if (prefs_common.data_root && *prefs_common.data_root)
1397                 return prefs_common.data_root;
1398         else
1399                 return NULL;
1400 }
1401 #endif
1402 /**
1403    return the translated name of a header, if the translate_header option is
1404    set, otherwise return the untranslated header name (header_name itself).
1405    this function is provided for convenience, it's an interface to
1406    prefs_common.trans_hdr.
1407    works with header names either with or without trailing colon, provided
1408    that gettext found such header name in the sources (they should all be
1409    found in src/gtk/headers.h anyway).
1410 */
1411 const gchar *prefs_common_translated_header_name(const gchar *header_name)
1412 {
1413         if (header_name == NULL || *header_name == '\0')
1414                 return header_name;
1415
1416         return prefs_common.trans_hdr ? gettext(header_name) : header_name;
1417 }