2007-07-25 [colin] 2.10.0cvs63
[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 #ifndef MAEMO
439         {"show_statusbar", "TRUE", &prefs_common.show_statusbar, P_BOOL,
440          NULL, NULL, NULL},
441         {"show_searchbar", "TRUE", &prefs_common.show_searchbar, P_BOOL,
442          NULL, NULL, NULL},
443 #else
444         {"show_statusbar", "FALSE", &prefs_common.show_statusbar, P_BOOL,
445          NULL, NULL, NULL},
446         {"show_searchbar", "FALSE", &prefs_common.show_searchbar, P_BOOL,
447          NULL, NULL, NULL},
448 #endif
449
450         {"summary_col_show_mark", "TRUE",
451          &prefs_common.summary_col_visible[S_COL_MARK], P_BOOL, NULL, NULL, NULL},
452         {"summary_col_show_unread", "TRUE",
453          &prefs_common.summary_col_visible[S_COL_STATUS], P_BOOL, NULL, NULL, NULL},
454         {"summary_col_show_subject", "TRUE",
455          &prefs_common.summary_col_visible[S_COL_SUBJECT], P_BOOL, NULL, NULL, NULL},
456         {"summary_col_show_from", "TRUE",
457          &prefs_common.summary_col_visible[S_COL_FROM], P_BOOL, NULL, NULL, NULL},
458         {"summary_col_show_to", "FALSE",
459          &prefs_common.summary_col_visible[S_COL_TO], P_BOOL, NULL, NULL, NULL},
460         {"summary_col_show_date", "TRUE",
461          &prefs_common.summary_col_visible[S_COL_DATE], P_BOOL, NULL, NULL, NULL},
462         {"summary_col_show_mime", "TRUE",
463          &prefs_common.summary_col_visible[S_COL_MIME], P_BOOL, NULL, NULL, NULL},
464         {"summary_col_show_size", "TRUE",
465          &prefs_common.summary_col_visible[S_COL_SIZE], P_BOOL, NULL, NULL, NULL},
466         {"summary_col_show_number", "FALSE",
467          &prefs_common.summary_col_visible[S_COL_NUMBER], P_BOOL, NULL, NULL, NULL},
468         {"summary_col_show_score", "FALSE",
469          &prefs_common.summary_col_visible[S_COL_SCORE], P_BOOL, NULL, NULL, NULL},
470         {"summary_col_show_locked", "FALSE",
471          &prefs_common.summary_col_visible[S_COL_LOCKED], P_BOOL, NULL, NULL, NULL},
472         {"summary_col_show_tags", "FALSE",
473          &prefs_common.summary_col_visible[S_COL_TAGS], P_BOOL, NULL, NULL, NULL},
474
475         {"summary_col_pos_mark", "0",
476           &prefs_common.summary_col_pos[S_COL_MARK], P_INT, NULL, NULL, NULL},
477         {"summary_col_pos_unread", "1",
478           &prefs_common.summary_col_pos[S_COL_STATUS], P_INT, NULL, NULL, NULL},
479         {"summary_col_pos_mime", "2",
480           &prefs_common.summary_col_pos[S_COL_MIME], P_INT, NULL, NULL, NULL},
481         {"summary_col_pos_subject", "3",
482           &prefs_common.summary_col_pos[S_COL_SUBJECT], P_INT, NULL, NULL, NULL},
483         {"summary_col_pos_from", "4",
484           &prefs_common.summary_col_pos[S_COL_FROM], P_INT, NULL, NULL, NULL},
485         {"summary_col_pos_date", "5",
486           &prefs_common.summary_col_pos[S_COL_DATE], P_INT, NULL, NULL, NULL},
487         {"summary_col_pos_size", "6",
488           &prefs_common.summary_col_pos[S_COL_SIZE], P_INT, NULL, NULL, NULL},
489         {"summary_col_pos_number", "7",
490           &prefs_common.summary_col_pos[S_COL_NUMBER], P_INT, NULL, NULL, NULL},
491         {"summary_col_pos_score", "8",
492          &prefs_common.summary_col_pos[S_COL_SCORE], P_INT, NULL, NULL, NULL},
493         {"summary_col_pos_locked", "9",
494          &prefs_common.summary_col_pos[S_COL_LOCKED], P_INT, NULL, NULL, NULL},
495         {"summary_col_pos_to", "10",
496           &prefs_common.summary_col_pos[S_COL_TO], P_INT, NULL, NULL, NULL},
497         {"summary_col_pos_tags", "11",
498           &prefs_common.summary_col_pos[S_COL_TAGS], P_INT, NULL, NULL, NULL},
499
500         {"summary_col_size_mark", "10",
501          &prefs_common.summary_col_size[S_COL_MARK], P_INT, NULL, NULL, NULL},
502         {"summary_col_size_unread", "13",
503          &prefs_common.summary_col_size[S_COL_STATUS], P_INT, NULL, NULL, NULL},
504         {"summary_col_size_mime", "10",
505          &prefs_common.summary_col_size[S_COL_MIME], P_INT, NULL, NULL, NULL},
506 #ifndef MAEMO
507         {"summary_col_size_subject", "200",
508          &prefs_common.summary_col_size[S_COL_SUBJECT], P_INT, NULL, NULL, NULL},
509         {"summary_col_size_from", "120",
510          &prefs_common.summary_col_size[S_COL_FROM], P_INT, NULL, NULL, NULL},
511         {"summary_col_size_to", "120",
512          &prefs_common.summary_col_size[S_COL_TO], P_INT, NULL, NULL, NULL},
513 #else
514         {"summary_col_size_subject", "300",
515          &prefs_common.summary_col_size[S_COL_SUBJECT], P_INT, NULL, NULL, NULL},
516         {"summary_col_size_from", "150",
517          &prefs_common.summary_col_size[S_COL_FROM], P_INT, NULL, NULL, NULL},
518         {"summary_col_size_to", "150",
519          &prefs_common.summary_col_size[S_COL_TO], P_INT, NULL, NULL, NULL},
520
521 #endif
522         {"summary_col_size_date", "118",
523          &prefs_common.summary_col_size[S_COL_DATE], P_INT, NULL, NULL, NULL},
524         {"summary_col_size_size", "45",
525          &prefs_common.summary_col_size[S_COL_SIZE], P_INT, NULL, NULL, NULL},
526         {"summary_col_size_number", "40",
527          &prefs_common.summary_col_size[S_COL_NUMBER], P_INT, NULL, NULL, NULL},
528         {"summary_col_size_score", "40",
529          &prefs_common.summary_col_size[S_COL_SCORE], P_INT, NULL, NULL, NULL},
530         {"summary_col_size_locked", "13",
531          &prefs_common.summary_col_size[S_COL_LOCKED], P_INT, NULL, NULL, NULL},
532         {"summary_col_size_tags", "150",
533          &prefs_common.summary_col_size[S_COL_TAGS], P_INT, NULL, NULL, NULL},
534
535         /* Widget size */
536         {"folderwin_x", "16", &prefs_common.folderwin_x, P_INT,
537          NULL, NULL, NULL},
538         {"folderwin_y", "16", &prefs_common.folderwin_y, P_INT,
539          NULL, NULL, NULL},
540         {"folderview_width", "270", &prefs_common.folderview_width, P_INT,
541          NULL, NULL, NULL},
542         {"folderview_height", "450", &prefs_common.folderview_height, P_INT,
543          NULL, NULL, NULL},
544         {"folderview_visible", "TRUE", &prefs_common.folderview_visible, P_BOOL,
545          NULL, NULL, NULL},
546
547         {"folder_col_show_folder", "TRUE",
548          &prefs_common.folder_col_visible[F_COL_FOLDER], P_BOOL, NULL, NULL, NULL},
549         {"folder_col_show_new", "TRUE",
550          &prefs_common.folder_col_visible[F_COL_NEW], P_BOOL, NULL, NULL, NULL},
551         {"folder_col_show_unread", "TRUE",
552          &prefs_common.folder_col_visible[F_COL_UNREAD], P_BOOL, NULL, NULL, NULL},
553         {"folder_col_show_total", "TRUE",
554          &prefs_common.folder_col_visible[F_COL_TOTAL], P_BOOL, NULL, NULL, NULL},
555
556         {"folder_col_pos_folder", "0",
557          &prefs_common.folder_col_pos[F_COL_FOLDER], P_INT, NULL, NULL, NULL},
558         {"folder_col_pos_new", "1",
559          &prefs_common.folder_col_pos[F_COL_NEW], P_INT, NULL, NULL, NULL},
560         {"folder_col_pos_unread", "2",
561          &prefs_common.folder_col_pos[F_COL_UNREAD], P_INT, NULL, NULL, NULL},
562         {"folder_col_pos_total", "3",
563          &prefs_common.folder_col_pos[F_COL_TOTAL], P_INT, NULL, NULL, NULL},
564
565 #ifndef MAEMO
566         {"folder_col_size_folder", "120",
567          &prefs_common.folder_col_size[F_COL_FOLDER], P_INT, NULL, NULL, NULL},
568         {"folder_col_size_new", "32",
569          &prefs_common.folder_col_size[F_COL_NEW], P_INT, NULL, NULL, NULL},
570         {"folder_col_size_unread", "32",
571          &prefs_common.folder_col_size[F_COL_UNREAD], P_INT, NULL, NULL, NULL},
572         {"folder_col_size_total", "32",
573          &prefs_common.folder_col_size[F_COL_TOTAL], P_INT, NULL, NULL, NULL},
574 #else
575         {"folder_col_size_folder", "400",
576          &prefs_common.folder_col_size[F_COL_FOLDER], P_INT, NULL, NULL, NULL},
577         {"folder_col_size_new", "32",
578          &prefs_common.folder_col_size[F_COL_NEW], P_INT, NULL, NULL, NULL},
579         {"folder_col_size_unread", "32",
580          &prefs_common.folder_col_size[F_COL_UNREAD], P_INT, NULL, NULL, NULL},
581         {"folder_col_size_total", "32",
582          &prefs_common.folder_col_size[F_COL_TOTAL], P_INT, NULL, NULL, NULL},
583 #endif
584         {"summaryview_width", "500", &prefs_common.summaryview_width, P_INT,
585          NULL, NULL, NULL},
586         {"summaryview_height", "244", &prefs_common.summaryview_height, P_INT,
587          NULL, NULL, NULL},
588
589         {"main_messagewin_x", "256", &prefs_common.main_msgwin_x, P_INT,
590          NULL, NULL, NULL},
591         {"main_messagewin_y", "210", &prefs_common.main_msgwin_y, P_INT,
592          NULL, NULL, NULL},
593         {"messageview_width", "500", &prefs_common.msgview_width, P_INT,
594          NULL, NULL, NULL},
595         {"messageview_height", "213", &prefs_common.msgview_height, P_INT,
596          NULL, NULL, NULL},
597         {"messageview_visible", "TRUE", &prefs_common.msgview_visible, P_BOOL,
598          NULL, NULL, NULL},
599
600         {"mainview_x", "64", &prefs_common.mainview_x, P_INT,
601          NULL, NULL, NULL},
602         {"mainview_y", "64", &prefs_common.mainview_y, P_INT,
603          NULL, NULL, NULL},
604         {"mainview_width", "500", &prefs_common.mainview_width, P_INT,
605          NULL, NULL, NULL},
606         {"mainview_height", "400", &prefs_common.mainview_height, P_INT,
607          NULL, NULL, NULL},
608         {"mainwin_x", "64", &prefs_common.mainwin_x, P_INT,
609          NULL, NULL, NULL},
610         {"mainwin_y", "64", &prefs_common.mainwin_y, P_INT,
611          NULL, NULL, NULL},
612 #ifndef MAEMO
613         {"mainwin_width", "800", &prefs_common.mainwin_width, P_INT,
614          NULL, NULL, NULL},
615         {"mainwin_height", "600", &prefs_common.mainwin_height, P_INT,
616          NULL, NULL, NULL},
617         {"messagewin_width", "600", &prefs_common.msgwin_width, P_INT,
618          NULL, NULL, NULL},
619         {"messagewin_height", "540", &prefs_common.msgwin_height, P_INT,
620          NULL, NULL, NULL},
621         {"sourcewin_width", "600", &prefs_common.sourcewin_width, P_INT,
622          NULL, NULL, NULL},
623         {"sourcewin_height", "500", &prefs_common.sourcewin_height, P_INT,
624          NULL, NULL, NULL},
625         {"compose_width", "600", &prefs_common.compose_width, P_INT,
626          NULL, NULL, NULL},
627         {"compose_height", "560", &prefs_common.compose_height, P_INT,
628          NULL, NULL, NULL},
629 #else
630         {"mainwin_width", "700", &prefs_common.mainwin_width, P_INT,
631          NULL, NULL, NULL},
632         {"mainwin_height", "470", &prefs_common.mainwin_height, P_INT,
633          NULL, NULL, NULL},
634         {"messagewin_width", "700", &prefs_common.msgwin_width, P_INT,
635          NULL, NULL, NULL},
636         {"messagewin_height", "470", &prefs_common.msgwin_height, P_INT,
637          NULL, NULL, NULL},
638         {"sourcewin_width", "700", &prefs_common.sourcewin_width, P_INT,
639          NULL, NULL, NULL},
640         {"sourcewin_height", "470", &prefs_common.sourcewin_height, P_INT,
641          NULL, NULL, NULL},
642         {"compose_width", "700", &prefs_common.compose_width, P_INT,
643          NULL, NULL, NULL},
644         {"compose_height", "470", &prefs_common.compose_height, P_INT,
645          NULL, NULL, NULL},
646 #endif
647         {"compose_x", "0", &prefs_common.compose_x, P_INT,
648          NULL, NULL, NULL},
649         {"compose_y", "0", &prefs_common.compose_y, P_INT,
650          NULL, NULL, NULL},
651         /* Message */
652         {"enable_color", "TRUE", &prefs_common.enable_color, P_BOOL,
653          NULL, NULL, NULL},
654
655         {"quote_level1_color", "179", &prefs_common.quote_level1_col, P_COLOR,
656          NULL, NULL, NULL},
657         {"quote_level2_color", "179", &prefs_common.quote_level2_col, P_COLOR,
658          NULL, NULL, NULL},
659         {"quote_level3_color", "179", &prefs_common.quote_level3_col, P_COLOR,
660          NULL, NULL, NULL},
661         {"enable_bgcolor", "FALSE", &prefs_common.enable_bgcolor, P_BOOL,
662          NULL, NULL, NULL},
663         {"quote_level1_bgcolor", "13421772", &prefs_common.quote_level1_bgcol, P_COLOR,
664          NULL, NULL, NULL},
665         {"quote_level2_bgcolor", "13948116", &prefs_common.quote_level2_bgcol, P_COLOR,
666          NULL, NULL, NULL},
667         {"quote_level3_bgcolor", "14540253", &prefs_common.quote_level3_bgcol, P_COLOR,
668          NULL, NULL, NULL},
669         {"uri_color", "32512", &prefs_common.uri_col, P_COLOR,
670          NULL, NULL, NULL},
671         {"target_folder_color", "14294218", &prefs_common.tgt_folder_col, P_COLOR,
672          NULL, NULL, NULL},
673         {"signature_color", "7960953", &prefs_common.signature_col, P_COLOR,
674          NULL, NULL, NULL},
675         {"recycle_quote_colors", "FALSE", &prefs_common.recycle_quote_colors,
676          P_BOOL, NULL, NULL, NULL},
677
678         {"display_header_pane", "FALSE", &prefs_common.display_header_pane,
679          P_BOOL, NULL, NULL, NULL},
680         {"display_header", "TRUE", &prefs_common.display_header, P_BOOL,
681          NULL, NULL, NULL},
682         {"display_xface", "TRUE", &prefs_common.display_xface,
683          P_BOOL, NULL, NULL, NULL},
684         {"render_html", "TRUE", &prefs_common.render_html, P_BOOL,
685          NULL, NULL, NULL},
686         {"invoke_plugin_on_html", "FALSE", &prefs_common.invoke_plugin_on_html, P_BOOL,
687          NULL, NULL, NULL},
688         {"line_space", "2", &prefs_common.line_space, P_INT,
689          NULL, NULL, NULL},
690         {"never_send_retrcpt", "FALSE", &prefs_common.never_send_retrcpt, P_BOOL,
691          NULL, NULL, NULL},
692
693         {"enable_smooth_scroll", "FALSE",
694          &prefs_common.enable_smooth_scroll, P_BOOL,
695          NULL, NULL, NULL},
696         {"scroll_step", "1", &prefs_common.scroll_step, P_INT,
697          NULL, NULL, NULL},
698         {"scroll_half_page", "FALSE", &prefs_common.scroll_halfpage, P_BOOL,
699          NULL, NULL, NULL},
700         {"respect_flowed_format", "FALSE", &prefs_common.respect_flowed_format, P_BOOL,
701          NULL, NULL, NULL},
702
703         {"show_other_header", "FALSE", &prefs_common.show_other_header, P_BOOL,
704          NULL, NULL, NULL},
705
706         {"use_different_print_font", "FALSE", &prefs_common.use_different_print_font, P_BOOL,
707          NULL, NULL, NULL},
708
709         {"attach_desc", "TRUE", &prefs_common.attach_desc, P_BOOL,
710          NULL, NULL, NULL},
711         {"attach_save_directory", NULL,
712          &SPECIFIC_PREFS.attach_save_dir, P_STRING, NULL, NULL, NULL},
713         {"attach_load_directory", NULL,
714          &SPECIFIC_PREFS.attach_load_dir, P_STRING, NULL, NULL, NULL},
715
716         /* MIME viewer */
717         {"mime_textviewer",   NULL,
718          &SPECIFIC_PREFS.mime_textviewer,   P_STRING, NULL, NULL, NULL},
719         {"mime_open_command", "gedit '%s'",
720          &SPECIFIC_PREFS.mime_open_cmd,     P_STRING, NULL, NULL, NULL},
721
722         /* Interface */
723 #ifndef MAEMO
724         {"layout_mode", "0", &prefs_common.layout_mode, P_INT,
725          NULL, NULL, NULL},
726 #else
727         {"layout_mode", "5", &prefs_common.layout_mode, P_INT,
728          NULL, NULL, NULL},
729 #endif
730         /* {"emulate_emacs", "FALSE", &prefs_common.emulate_emacs, P_BOOL,
731          NULL, NULL, NULL}, */
732         {"always_show_message_when_selected", "FALSE",
733          &prefs_common.always_show_msg,
734          P_BOOL, NULL, NULL, NULL},
735         {"select_on_entry", "3", &prefs_common.select_on_entry,
736          P_ENUM, NULL, NULL, NULL},
737
738         {"summary_select_prio1", "0", &prefs_common.summary_select_prio[0], P_ENUM,
739          NULL, NULL, NULL},
740         {"summary_select_prio2", "0", &prefs_common.summary_select_prio[1], P_ENUM,
741          NULL, NULL, NULL},
742         {"summary_select_prio3", "0", &prefs_common.summary_select_prio[2], P_ENUM,
743          NULL, NULL, NULL},
744         {"summary_select_prio4", "0", &prefs_common.summary_select_prio[3], P_ENUM,
745          NULL, NULL, NULL},
746         {"summary_select_prio5", "0", &prefs_common.summary_select_prio[4], P_ENUM,
747          NULL, NULL, NULL},
748         {"summary_select_prio6", "0", &prefs_common.summary_select_prio[5], P_ENUM,
749          NULL, NULL, NULL},
750
751         {"mark_as_read_on_new_window", "FALSE",
752          &prefs_common.mark_as_read_on_new_window,
753          P_BOOL, NULL, NULL, NULL},
754         {"mark_as_read_delay", "0",
755          &prefs_common.mark_as_read_delay, P_INT, 
756          NULL, NULL, NULL},
757         {"immediate_execution", "TRUE", &prefs_common.immediate_exec, P_BOOL,
758          NULL, NULL, NULL},
759         {"nextunreadmsg_dialog", "1", &prefs_common.next_unread_msg_dialog, P_ENUM,
760          NULL, NULL, NULL},
761
762         {"pixmap_theme_path", DEFAULT_PIXMAP_THEME, 
763          &SPECIFIC_PREFS.pixmap_theme_path, P_STRING,
764          NULL, NULL, NULL},
765
766         {"ask_mark_all_read", "TRUE", &prefs_common.ask_mark_all_read, P_BOOL,
767          NULL, NULL, NULL},
768
769         {"ask_apply_per_account_filtering_rules", "TRUE", &prefs_common.ask_apply_per_account_filtering_rules, P_BOOL,
770          NULL, NULL, NULL},
771         {"apply_per_account_filtering_rules", "0", &prefs_common.apply_per_account_filtering_rules, P_ENUM,
772          NULL, NULL, NULL},
773
774         /* Addressbook */
775         {"addressbook_use_editaddress_dialog", "TRUE", &prefs_common.addressbook_use_editaddress_dialog,
776          P_BOOL, NULL, NULL, NULL},
777         {"addressbook_hpaned_pos", "-1", &prefs_common.addressbook_hpaned_pos,
778          P_INT, NULL, NULL, NULL},
779         {"addressbook_vpaned_pos", "-1", &prefs_common.addressbook_vpaned_pos,
780          P_INT, NULL, NULL, NULL},
781
782         /* Other */
783         {"uri_open_command", DEFAULT_BROWSER_CMD,
784          &SPECIFIC_PREFS.uri_cmd, P_STRING, NULL, NULL, NULL},
785         {"print_command", "lpr %s",
786          &SPECIFIC_PREFS.print_cmd, P_STRING, NULL, NULL, NULL},
787         {"ext_editor_command", DEFAULT_EDITOR_CMD,
788          &SPECIFIC_PREFS.ext_editor_cmd, P_STRING, NULL, NULL, NULL},
789         {"add_address_by_click", "FALSE", &prefs_common.add_address_by_click,
790          P_BOOL, NULL, NULL, NULL},
791         {"confirm_on_exit", "FALSE", &prefs_common.confirm_on_exit, P_BOOL,
792          NULL, NULL, NULL},
793         {"clean_trash_on_exit", "FALSE", &prefs_common.clean_on_exit, P_BOOL,
794          NULL, NULL, NULL},
795         {"ask_on_cleaning", "TRUE", &prefs_common.ask_on_clean, P_BOOL,
796          NULL, NULL, NULL},
797         {"warn_queued_on_exit", "TRUE", &prefs_common.warn_queued_on_exit,
798          P_BOOL, NULL, NULL, NULL},
799         {"work_offline", "FALSE", &prefs_common.work_offline, P_BOOL,
800          NULL, NULL, NULL},
801         {"summary_quicksearch_type", "0", &prefs_common.summary_quicksearch_type, P_INT,
802          NULL, NULL, NULL},
803 #ifndef MAEMO
804         {"summary_quicksearch_recurse", "1", &prefs_common.summary_quicksearch_recurse, P_INT,
805          NULL, NULL, NULL},
806 #else
807         {"summary_quicksearch_recurse", "0", &prefs_common.summary_quicksearch_recurse, P_INT,
808          NULL, NULL, NULL},
809 #endif
810
811         {"io_timeout_secs", "60", &prefs_common.io_timeout_secs,
812          P_INT, NULL, NULL, NULL},
813         {"hide_score", "-9999", &prefs_common.kill_score, P_INT,
814          NULL, NULL, NULL},
815         {"important_score", "1", &prefs_common.important_score, P_INT,
816          NULL, NULL, NULL},
817
818         {"clip_log", "TRUE", &prefs_common.cliplog, P_BOOL,
819          NULL, NULL, NULL},
820         {"log_length", "500", &prefs_common.loglength, P_INT,
821          NULL, NULL, NULL},
822 #ifndef MAEMO
823         {"enable_log_standard", "TRUE", &prefs_common.enable_log_standard, P_BOOL,
824          NULL, NULL, NULL},
825         {"enable_log_warning", "TRUE", &prefs_common.enable_log_warning, P_BOOL,
826          NULL, NULL, NULL},
827         {"enable_log_error", "TRUE", &prefs_common.enable_log_error, P_BOOL,
828          NULL, NULL, NULL},
829         {"enable_log_status", "TRUE", &prefs_common.enable_log_status, P_BOOL,
830          NULL, NULL, NULL},
831 #else
832         {"enable_log_standard", "FALSE", &prefs_common.enable_log_standard, P_BOOL,
833          NULL, NULL, NULL},
834         {"enable_log_warning", "FALSE", &prefs_common.enable_log_warning, P_BOOL,
835          NULL, NULL, NULL},
836         {"enable_log_error", "FALSE", &prefs_common.enable_log_error, P_BOOL,
837          NULL, NULL, NULL},
838         {"enable_log_status", "FALSE", &prefs_common.enable_log_status, P_BOOL,
839          NULL, NULL, NULL},
840 #endif
841         {"log_msg_color", "#00af00", &prefs_common.log_msg_color, P_COLOR,
842          NULL, NULL, NULL},
843         {"log_warn_color", "#af0000", &prefs_common.log_warn_color, P_COLOR,
844          NULL, NULL, NULL},
845         {"log_error_color", "#af0000", &prefs_common.log_error_color, P_COLOR,
846          NULL, NULL, NULL},
847         {"log_in_color", "#000000", &prefs_common.log_in_color, P_COLOR,
848          NULL, NULL, NULL},
849         {"log_out_color", "#0000ef", &prefs_common.log_out_color, P_COLOR,
850          NULL, NULL, NULL},
851         {"log_status_ok_color", "#00af00", &prefs_common.log_status_ok_color, P_COLOR,
852          NULL, NULL, NULL},
853         {"log_status_nok_color", "#0000af", &prefs_common.log_status_nok_color, P_COLOR,
854          NULL, NULL, NULL},
855         {"log_status_skip_color", "#aa00aa", &prefs_common.log_status_skip_color, P_COLOR,
856          NULL, NULL, NULL},
857
858     {"enable_filtering_debug", "FALSE", &prefs_common.enable_filtering_debug, P_BOOL,
859          NULL, NULL, NULL},
860     {"filtering_debug_level", "1", &prefs_common.filtering_debug_level, P_INT,
861          NULL, NULL, NULL},
862     {"enable_filtering_debug_inc", "TRUE", &prefs_common.enable_filtering_debug_inc, P_BOOL,
863          NULL, NULL, NULL},
864     {"enable_filtering_debug_manual", "TRUE", &prefs_common.enable_filtering_debug_manual, P_BOOL,
865          NULL, NULL, NULL},
866     {"enable_filtering_debug_folder_proc", "FALSE", &prefs_common.enable_filtering_debug_folder_proc, P_BOOL,
867          NULL, NULL, NULL},
868     {"enable_filtering_debug_pre_proc", "FALSE", &prefs_common.enable_filtering_debug_pre_proc, P_BOOL,
869          NULL, NULL, NULL},
870     {"enable_filtering_debug_post_proc", "FALSE", &prefs_common.enable_filtering_debug_post_proc, P_BOOL,
871          NULL, NULL, NULL},
872     {"filtering_debug_clip_log", "TRUE", &prefs_common.filtering_debug_cliplog, P_BOOL,
873          NULL, NULL, NULL},
874         {"filtering_debug_log_length", "500", &prefs_common.filtering_debug_loglength, P_INT,
875          NULL, NULL, NULL},
876
877         {"gtk_can_change_accels", "TRUE", &prefs_common.gtk_can_change_accels, P_BOOL,
878          NULL, NULL, NULL},
879
880         {"color_new", "179", &prefs_common.color_new, P_COLOR,
881          NULL, NULL, NULL},
882
883         /* Some windows' sizes */
884         {"filteringwin_width", "500", &prefs_common.filteringwin_width, P_INT,
885          NULL, NULL, NULL},
886         {"filteringwin_height", "-1", &prefs_common.filteringwin_height, P_INT,
887          NULL, NULL, NULL},
888
889         {"filteringactionwin_width", "490", &prefs_common.filteringactionwin_width, P_INT,
890          NULL, NULL, NULL},
891         {"filteringactionwin_height", "-1", &prefs_common.filteringactionwin_height, P_INT,
892          NULL, NULL, NULL},
893
894         {"matcherwin_width", "520", &prefs_common.matcherwin_width, P_INT,
895          NULL, NULL, NULL},
896         {"matcherwin_height", "-1", &prefs_common.matcherwin_height, P_INT,
897          NULL, NULL, NULL},
898
899         {"templateswin_width", "480", &prefs_common.templateswin_width, P_INT,
900          NULL, NULL, NULL},
901         {"templateswin_height", "-1", &prefs_common.templateswin_height, P_INT,
902          NULL, NULL, NULL},
903
904         {"actionswin_width", "486", &prefs_common.actionswin_width, P_INT,
905          NULL, NULL, NULL},
906         {"actionswin_height", "-1", &prefs_common.actionswin_height, P_INT,
907          NULL, NULL, NULL},
908
909         {"tagswin_width", "486", &prefs_common.tagswin_width, P_INT,
910          NULL, NULL, NULL},
911         {"tagswin_height", "-1", &prefs_common.tagswin_height, P_INT,
912          NULL, NULL, NULL},
913
914         {"addressbookwin_width", "520", &prefs_common.addressbookwin_width, P_INT,
915          NULL, NULL, NULL},
916         {"addressbookwin_height", "-1", &prefs_common.addressbookwin_height, P_INT,
917          NULL, NULL, NULL},
918
919         {"addressbookeditpersonwin_width", "640", &prefs_common.addressbookeditpersonwin_width, P_INT,
920          NULL, NULL, NULL},
921         {"addressbookeditpersonwin_height", "320", &prefs_common.addressbookeditpersonwin_height, P_INT,
922          NULL, NULL, NULL},
923
924         {"addressbookeditgroupwin_width", "580", &prefs_common.addressbookeditgroupwin_width, P_INT,
925          NULL, NULL, NULL},
926         {"addressbookeditgroupwin_height", "340", &prefs_common.addressbookeditgroupwin_height, P_INT,
927          NULL, NULL, NULL},
928
929         {"pluginswin_width", "-1", &prefs_common.pluginswin_width, P_INT,
930          NULL, NULL, NULL},
931         {"pluginswin_height", "-1", &prefs_common.pluginswin_height, P_INT,
932          NULL, NULL, NULL},
933
934         {"prefswin_width", "600", &prefs_common.prefswin_width, P_INT,
935          NULL, NULL, NULL},
936         {"prefswin_height", "-1", &prefs_common.prefswin_height, P_INT,
937          NULL, NULL, NULL},
938
939         {"folderitemwin_width", "500", &prefs_common.folderitemwin_width, P_INT,
940          NULL, NULL, NULL},
941         {"folderitemwin_height", "-1", &prefs_common.folderitemwin_height, P_INT,
942          NULL, NULL, NULL},
943
944         {"zero_replacement_char", "0", &prefs_common.zero_replacement, P_STRING,
945          NULL, NULL, NULL},
946
947         {"editaccountwin_width", "500", &prefs_common.editaccountwin_width, P_INT,
948          NULL, NULL, NULL},
949         {"editaccountwin_height", "-1", &prefs_common.editaccountwin_height, P_INT,
950          NULL, NULL, NULL},
951
952         {"accountswin_width", "500", &prefs_common.accountswin_width, P_INT,
953          NULL, NULL, NULL},
954         {"accountswin_height", "-1", &prefs_common.accountswin_height, P_INT,
955          NULL, NULL, NULL},
956
957         {"logwin_width", "520", &prefs_common.logwin_width, P_INT,
958          NULL, NULL, NULL},
959         {"logwin_height", "-1", &prefs_common.logwin_height, P_INT,
960          NULL, NULL, NULL},
961
962         {"filtering_debugwin_width", "600", &prefs_common.filtering_debugwin_width, P_INT,
963          NULL, NULL, NULL},
964         {"filtering_debugwin_height", "-1", &prefs_common.filtering_debugwin_height, P_INT,
965          NULL, NULL, NULL},
966
967         {"folderselwin_width", "300", &prefs_common.folderselwin_width, P_INT,
968          NULL, NULL, NULL},
969         {"folderselwin_height", "-1", &prefs_common.folderselwin_height, P_INT,
970          NULL, NULL, NULL},
971
972         {"addressaddwin_width", "300", &prefs_common.addressaddwin_width, P_INT,
973          NULL, NULL, NULL},
974         {"addressaddwin_height", "-1", &prefs_common.addressaddwin_height, P_INT,
975          NULL, NULL, NULL},
976
977         {"addressbook_folderselwin_width", "300", &prefs_common.addressbook_folderselwin_width, P_INT,
978          NULL, NULL, NULL},
979         {"addressbook_folderselwin_height", "-1", &prefs_common.addressbook_folderselwin_height, P_INT,
980          NULL, NULL, NULL},
981
982         /* Hidden */
983         {"warn_dnd", "1", &prefs_common.warn_dnd, P_INT,
984          NULL, NULL, NULL},
985         {"utf8_instead_of_locale_for_broken_mail", "0", 
986          &prefs_common.broken_are_utf8, P_INT,
987          NULL, NULL, NULL},
988         {"enable_swap_from", "FALSE", &prefs_common.swap_from, P_BOOL,
989          NULL, NULL, NULL},
990         {"use_stripes_everywhere", "TRUE", &prefs_common.use_stripes_everywhere, P_BOOL,
991          NULL, NULL, NULL},
992         {"use_stripes_in_summaries", "TRUE", &prefs_common.use_stripes_in_summaries, P_BOOL,
993          NULL, NULL, NULL},
994         {"stripes_color_offset", "4000", &prefs_common.stripes_color_offset, P_INT,
995          NULL, NULL, NULL},
996         {"enable_dotted_lines", "FALSE", &prefs_common.enable_dotted_lines, P_BOOL,
997          NULL, NULL, NULL},
998         {"enable_hscrollbar", "TRUE", &prefs_common.enable_hscrollbar, P_BOOL,
999          NULL, NULL, NULL},
1000         {"folderview_vscrollbar_policy", "0",
1001          &prefs_common.folderview_vscrollbar_policy, P_ENUM,
1002          NULL, NULL, NULL},
1003         {"textview_cursor_visible", "FALSE",
1004          &prefs_common.textview_cursor_visible, P_BOOL,
1005          NULL, NULL, NULL},
1006         {"hover_timeout", "500", &prefs_common.hover_timeout, P_INT,
1007          NULL, NULL, NULL},
1008 #ifndef MAEMO
1009         {"cache_max_mem_usage", "4096", &prefs_common.cache_max_mem_usage, P_INT,
1010          NULL, NULL, NULL},
1011         {"cache_min_keep_time", "15", &prefs_common.cache_min_keep_time, P_INT,
1012          NULL, NULL, NULL},
1013 #else
1014         {"cache_max_mem_usage", "4096", &prefs_common.cache_max_mem_usage, P_INT,
1015          NULL, NULL, NULL},
1016         {"cache_min_keep_time", "0", &prefs_common.cache_min_keep_time, P_INT,
1017          NULL, NULL, NULL},
1018 #endif
1019         {"thread_by_subject_max_age", "10", &prefs_common.thread_by_subject_max_age,
1020         P_INT, NULL, NULL, NULL },
1021         {"last_opened_folder", "", &prefs_common.last_opened_folder,
1022         P_STRING, NULL, NULL, NULL },
1023         {"goto_last_folder_on_startup", "FALSE", &prefs_common.goto_last_folder_on_startup,
1024         P_BOOL, NULL, NULL, NULL },
1025         {"summary_quicksearch_sticky", "1", &prefs_common.summary_quicksearch_sticky, P_INT,
1026          NULL, NULL, NULL},
1027         {"summary_quicksearch_dynamic", "0", &prefs_common.summary_quicksearch_dynamic, P_INT,
1028          NULL, NULL, NULL},
1029         {"summary_quicksearch_autorun", "0", &prefs_common.summary_quicksearch_autorun, P_INT,
1030          NULL, NULL, NULL},
1031         {"statusbar_update_step", "10", &prefs_common.statusbar_update_step, P_INT,
1032          NULL, NULL, NULL},
1033         {"compose_no_markup", "FALSE", &prefs_common.compose_no_markup, P_BOOL,
1034          NULL, NULL, NULL},
1035         {"skip_ssl_cert_check", "FALSE", &prefs_common.skip_ssl_cert_check, P_BOOL,
1036          NULL, NULL, NULL},
1037         {"live_dangerously", "FALSE", &prefs_common.live_dangerously, P_BOOL,
1038          NULL, NULL, NULL},
1039         {"hide_quotes", "0", &prefs_common.hide_quotes, P_INT,
1040          NULL, NULL, NULL},
1041         {"unsafe_ssl_certs", "FALSE", &prefs_common.unsafe_ssl_certs, P_BOOL,
1042          NULL, NULL, NULL},
1043 #ifndef MAEMO
1044         {"real_time_sync", "FALSE", &prefs_common.real_time_sync, P_BOOL,
1045          NULL, NULL, NULL},
1046 #else
1047         {"real_time_sync", "TRUE", &prefs_common.real_time_sync, P_BOOL,
1048          NULL, NULL, NULL},
1049 #endif
1050         {NULL, NULL, NULL, P_OTHER, NULL, NULL, NULL}
1051 };
1052
1053 PrefsCommon *prefs_common_get(void)
1054 {
1055         return &prefs_common;
1056 }
1057
1058 /*
1059  * Read history list from the specified history file
1060  */
1061 static GList *prefs_common_read_history(const gchar *history) 
1062 {
1063         FILE *fp;
1064         gchar *path;
1065         gchar buf[PREFSBUFSIZE];
1066         GList *tmp = NULL;
1067
1068         path = g_strconcat(get_rc_dir(), G_DIR_SEPARATOR_S, history,
1069                            NULL);
1070         if ((fp = g_fopen(path, "rb")) == NULL) {
1071                 if (ENOENT != errno) FILE_OP_ERROR(path, "fopen");
1072                 g_free(path);
1073                 return NULL;
1074         }
1075         g_free(path);
1076         while (fgets(buf, sizeof(buf), fp) != NULL) {
1077                 g_strstrip(buf);
1078                 if (buf[0] == '\0') continue;
1079                 tmp = add_history(tmp, buf);
1080         }
1081         fclose(fp);
1082
1083         tmp = g_list_reverse(tmp);
1084
1085         return tmp;
1086 }
1087
1088 void prefs_common_read_config(void)
1089 {
1090         gchar *rcpath;
1091         gchar *tmp;
1092
1093         rcpath = g_strconcat(get_rc_dir(), G_DIR_SEPARATOR_S, COMMON_RC, NULL);
1094         prefs_read_config(param, "Common", rcpath, NULL);
1095 #ifdef G_OS_WIN32
1096         prefs_read_config(param_os_specific, "CommonWin32", rcpath, NULL);
1097 #endif
1098
1099         g_free(rcpath);
1100
1101         tmp = g_strdup(gettext(prefs_common.quotefmt));
1102         g_free(prefs_common.quotefmt);
1103         prefs_common.quotefmt = tmp;
1104
1105         tmp = g_strdup(gettext(prefs_common.fw_quotefmt));
1106         g_free(prefs_common.fw_quotefmt);
1107         prefs_common.fw_quotefmt = tmp;
1108         
1109         tmp = g_strdup(gettext(prefs_common.date_format));
1110         g_free(prefs_common.date_format);
1111         prefs_common.date_format = tmp;
1112
1113         tmp = g_strdup(gettext(prefs_common.compose_body_format));
1114         g_free(prefs_common.compose_body_format);
1115         prefs_common.compose_body_format = tmp;
1116
1117         prefs_common.mime_open_cmd_history =
1118                 prefs_common_read_history(COMMAND_HISTORY);
1119         prefs_common.summary_quicksearch_history =
1120                 prefs_common_read_history(QUICKSEARCH_HISTORY);
1121         prefs_common.summary_search_from_history =
1122                 prefs_common_read_history(SUMMARY_SEARCH_FROM_HISTORY);
1123         prefs_common.summary_search_to_history =
1124                 prefs_common_read_history(SUMMARY_SEARCH_TO_HISTORY);
1125         prefs_common.summary_search_subject_history =
1126                 prefs_common_read_history(SUMMARY_SEARCH_SUBJECT_HISTORY);
1127         prefs_common.summary_search_body_history =
1128                 prefs_common_read_history(SUMMARY_SEARCH_BODY_HISTORY);
1129         prefs_common.summary_search_adv_condition_history =
1130                 prefs_common_read_history(SUMMARY_SEARCH_ADV_CONDITION_HISTORY);
1131         prefs_common.message_search_history =
1132                 prefs_common_read_history(MESSAGE_SEARCH_HISTORY);
1133
1134         colorlabel_update_colortable_from_prefs();
1135 }
1136
1137 #define TRY(func) \
1138 if (!(func)) \
1139 { \
1140         g_warning("failed to write\n"); \
1141         goto out;                       \
1142 } \
1143
1144 /*
1145  * Save history list to the specified history file
1146  */
1147 static void prefs_common_save_history(const gchar *history, GList *list)
1148 {
1149         GList *cur;
1150         FILE *fp;
1151         gchar *path, *tmp_path;
1152
1153         path = g_strconcat(get_rc_dir(), G_DIR_SEPARATOR_S, history,
1154                            NULL);
1155         tmp_path = g_strconcat(path, ".tmp", NULL);
1156
1157         if ((fp = g_fopen(tmp_path, "wb")) == NULL) {
1158                 FILE_OP_ERROR(tmp_path, "fopen");
1159                 goto out;
1160         }
1161
1162         for (cur = list; cur != NULL; cur = cur->next) {
1163                 TRY(fputs((gchar *)cur->data, fp) != EOF &&
1164                     fputc('\n', fp) != EOF);
1165         }
1166
1167         if (fclose(fp) == EOF) {
1168                 FILE_OP_ERROR(tmp_path, "fclose");
1169                 fp = NULL;
1170                 goto out;
1171         }
1172         fp = NULL;
1173 #ifdef G_OS_WIN32
1174         g_unlink(path);
1175 #endif
1176         if (g_rename(tmp_path, path) < 0) {
1177                 FILE_OP_ERROR(path, "rename");
1178                 goto out;
1179         }
1180
1181 out:
1182         if (fp)
1183                 fclose(fp);
1184         g_free(tmp_path);
1185         g_free(path);
1186 }
1187
1188 #undef TRY
1189
1190 void prefs_common_write_config(void)
1191 {
1192         prefs_write_config(param, "Common", COMMON_RC);
1193 #ifdef G_OS_WIN32
1194         prefs_write_config(param_os_specific, "CommonWin32", COMMON_RC);
1195 #endif
1196
1197         prefs_common_save_history(COMMAND_HISTORY, 
1198                 prefs_common.mime_open_cmd_history);
1199         prefs_common_save_history(QUICKSEARCH_HISTORY, 
1200                 prefs_common.summary_quicksearch_history);
1201         prefs_common_save_history(SUMMARY_SEARCH_FROM_HISTORY, 
1202                 prefs_common.summary_search_from_history);
1203         prefs_common_save_history(SUMMARY_SEARCH_TO_HISTORY, 
1204                 prefs_common.summary_search_to_history);
1205         prefs_common_save_history(SUMMARY_SEARCH_SUBJECT_HISTORY, 
1206                 prefs_common.summary_search_subject_history);
1207         prefs_common_save_history(SUMMARY_SEARCH_BODY_HISTORY, 
1208                 prefs_common.summary_search_body_history);
1209         prefs_common_save_history(SUMMARY_SEARCH_ADV_CONDITION_HISTORY, 
1210                 prefs_common.summary_search_adv_condition_history);
1211         prefs_common_save_history(MESSAGE_SEARCH_HISTORY, 
1212                 prefs_common.message_search_history);
1213 }
1214
1215 /* make a copy of string 'in' into buffer 'out'. un-escape \ sequences.
1216    both 'in' and 'out' must be non-NULL.
1217    'out' must be a pointer to a buffer whose size is at least equal
1218    to strlen(txt)+1, this buffer will get cleared. out's contents
1219    will always get set to a valid string, even if it's "".*/
1220 void pref_get_unescaped_pref(gchar *out, const gchar *in)
1221 {
1222         const gchar *i;
1223         gchar *o;
1224
1225         *out = '\0';
1226
1227         g_return_if_fail( in != NULL );
1228         g_return_if_fail( out != NULL );
1229
1230         i = in;
1231         o = out;
1232         memset(out, 0, strlen(in)+1);
1233         while (*i != '\0') {
1234                 if (*i == '\\' && *(i+1) == 'n') {
1235                         *o++ = '\n';
1236                         i++;
1237                 } else if (*i == '\\' && *(i+1) == 't') {
1238                         *o++ = '\t';
1239                         i++;
1240                 } else if (*i == '\\' && *(i+1) == '\\') {
1241                         *o++ = '\\';
1242                         i++;
1243                 } else {
1244                         *o++ = *i;
1245                 }
1246                 i++;
1247         }
1248         *o='\0';
1249 }
1250
1251 /* make a copy of string 'in' into buffer 'out'. escape \ sequences.
1252    both 'in' and 'out' must be non-NULL.
1253    'out' must be a pointer to a buffer whose size is at least equal
1254    to 2*strlen(txt)+1. out's contents will always get set to a valid
1255    string, even if it's "". */
1256 void pref_get_escaped_pref(gchar *out, const gchar *in)
1257 {
1258         const gchar *i;
1259         gchar *o;
1260
1261         *out = '\0';
1262
1263         g_return_if_fail( in != NULL );
1264         g_return_if_fail( out != NULL );
1265
1266         i = in;
1267         o = out;
1268         while (*i != '\0') {
1269                 if (*i == '\n') {
1270                         *o++ = '\\';
1271                         *o++ = 'n';
1272                 } else if (*i == '\t') {
1273                         *o++ = '\\';
1274                         *o++ = 't';
1275                 } else if (*i == '\\') {
1276                         *o++ = '\\';
1277                         *o++ = '\\';
1278                 } else {
1279                         *o++ = *i;
1280                 }
1281                 i++;
1282         }
1283         *o = '\0';
1284 }
1285                 
1286 /* set the contents of a textview widget from the internal \-escaped
1287   representation of a pref string. both txt and textview must be non-NULL. */
1288 void pref_set_textview_from_pref(GtkTextView *textview, const gchar *txt)
1289 {
1290         GtkTextBuffer *buffer;
1291         gchar *out = NULL;
1292
1293         g_return_if_fail( textview != NULL );
1294
1295         buffer = gtk_text_view_get_buffer(textview);
1296
1297         if (!txt) {
1298                 gtk_text_buffer_set_text(buffer, "", -1);
1299         } else {
1300                 out = malloc(strlen(txt)+1);
1301
1302                 pref_get_unescaped_pref(out, txt);
1303
1304                 gtk_text_buffer_set_text(buffer, out?out:"", -1);
1305                 g_free(out);
1306         }
1307 }
1308
1309 /* set the contents of a gtkentry widget from the internal \-escaped
1310   representation of a pref string. both txt and entry must be non-NULL. */
1311 void pref_set_entry_from_pref(GtkEntry *entry, const gchar *txt)
1312 {
1313         gchar *out = NULL;
1314
1315         g_return_if_fail( entry != NULL );
1316         if (!txt) {
1317                 gtk_entry_set_text(entry, "");
1318         } else {
1319                 out = malloc(strlen(txt)+1);
1320
1321                 pref_get_unescaped_pref(out, txt);
1322
1323                 gtk_entry_set_text(entry, out?out:"");
1324                 g_free(out);
1325         }
1326 }
1327
1328 /* get the \-escaped internal representation of a pref from the contents of
1329    a textview widget. textview must be non-NULL. */
1330 gchar *pref_get_pref_from_textview(GtkTextView *textview) 
1331 {
1332         GtkTextBuffer *buffer;
1333         GtkTextIter start, end;
1334         gchar *out, *tmp;
1335         
1336         g_return_val_if_fail( textview != NULL, "" );
1337
1338         buffer = gtk_text_view_get_buffer(textview);
1339         gtk_text_buffer_get_start_iter(buffer, &start);
1340         gtk_text_buffer_get_iter_at_offset(buffer, &end, -1);
1341         tmp = gtk_text_buffer_get_text(buffer, &start, &end, FALSE);
1342         out = malloc(2*strlen(tmp)+1);
1343         
1344         pref_get_escaped_pref(out, tmp);
1345         g_free(tmp);
1346
1347         return out?out:"";
1348 }
1349
1350 /* get the \-escaped internal representation of a pref from the contents of
1351    a gtkentry widget. entry must be non-NULL. */
1352 gchar *pref_get_pref_from_entry(GtkEntry *entry) 
1353 {
1354         gchar *out, *tmp;
1355
1356         g_return_val_if_fail( entry != NULL, "" );
1357
1358         tmp = gtk_editable_get_chars(GTK_EDITABLE(entry), 0, -1);
1359         out = malloc(2*strlen(tmp)+1);
1360
1361         pref_get_escaped_pref(out, tmp);
1362         g_free(tmp);
1363
1364         return out?out:"";
1365 }
1366
1367 /* ugly hack to be able to get this pref from ssl_certificate.c */
1368 gboolean prefs_common_unsafe_ssl_certs(void)
1369 {
1370         return prefs_common.unsafe_ssl_certs;
1371 }
1372
1373 gboolean prefs_common_enable_log_standard(void)
1374 {
1375         return prefs_common.enable_log_standard;
1376 }
1377
1378 gboolean prefs_common_enable_log_warning(void)
1379 {
1380         return prefs_common.enable_log_warning;
1381 }
1382 gboolean prefs_common_enable_log_error(void)
1383 {
1384         return prefs_common.enable_log_error;
1385 }
1386 gboolean prefs_common_enable_log_status(void)
1387 {
1388         return prefs_common.enable_log_status;
1389 }
1390
1391 #ifdef MAEMO
1392 const gchar *prefs_common_get_data_root(void)
1393 {
1394         if (prefs_common.data_root && *prefs_common.data_root)
1395                 return prefs_common.data_root;
1396         else
1397                 return NULL;
1398 }
1399 #endif
1400 /**
1401    return the translated name of a header, if the translate_header option is
1402    set, otherwise return the untranslated header name (header_name itself).
1403    this function is provided for convenience, it's an interface to
1404    prefs_common.trans_hdr.
1405    works with header names either with or without trailing colon, provided
1406    that gettext found such header name in the sources (they should all be
1407    found in src/gtk/headers.h anyway).
1408 */
1409 const gchar *prefs_common_translated_header_name(const gchar *header_name)
1410 {
1411         if (header_name == NULL || *header_name == '\0')
1412                 return header_name;
1413
1414         return prefs_common.trans_hdr ? gettext(header_name) : header_name;
1415 }