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