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