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