2007-03-31 [colin] 2.8.1cvs77
[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         {"zero_replacement_char", "0", &prefs_common.zero_replacement, P_STRING,
890          NULL, NULL, NULL},
891
892         {"editaccountwin_width", "500", &prefs_common.editaccountwin_width, P_INT,
893          NULL, NULL, NULL},
894         {"editaccountwin_height", "-1", &prefs_common.editaccountwin_height, P_INT,
895          NULL, NULL, NULL},
896
897         {"accountswin_width", "500", &prefs_common.accountswin_width, P_INT,
898          NULL, NULL, NULL},
899         {"accountswin_height", "-1", &prefs_common.accountswin_height, P_INT,
900          NULL, NULL, NULL},
901
902         {"logwin_width", "520", &prefs_common.logwin_width, P_INT,
903          NULL, NULL, NULL},
904         {"logwin_height", "-1", &prefs_common.logwin_height, P_INT,
905          NULL, NULL, NULL},
906
907         {"filtering_debugwin_width", "600", &prefs_common.filtering_debugwin_width, P_INT,
908          NULL, NULL, NULL},
909         {"filtering_debugwin_height", "-1", &prefs_common.filtering_debugwin_height, P_INT,
910          NULL, NULL, NULL},
911
912         {"folderselwin_width", "300", &prefs_common.folderselwin_width, P_INT,
913          NULL, NULL, NULL},
914         {"folderselwin_height", "-1", &prefs_common.folderselwin_height, P_INT,
915          NULL, NULL, NULL},
916
917         {"addressaddwin_width", "300", &prefs_common.addressaddwin_width, P_INT,
918          NULL, NULL, NULL},
919         {"addressaddwin_height", "-1", &prefs_common.addressaddwin_height, P_INT,
920          NULL, NULL, NULL},
921
922         {"addressbook_folderselwin_width", "300", &prefs_common.addressbook_folderselwin_width, P_INT,
923          NULL, NULL, NULL},
924         {"addressbook_folderselwin_height", "-1", &prefs_common.addressbook_folderselwin_height, P_INT,
925          NULL, NULL, NULL},
926
927         /* Hidden */
928         {"warn_dnd", "1", &prefs_common.warn_dnd, P_INT,
929          NULL, NULL, NULL},
930         {"utf8_instead_of_locale_for_broken_mail", "0", 
931          &prefs_common.broken_are_utf8, P_INT,
932          NULL, NULL, NULL},
933         {"enable_swap_from", "FALSE", &prefs_common.swap_from, P_BOOL,
934          NULL, NULL, NULL},
935         {"use_stripes_everywhere", "TRUE", &prefs_common.use_stripes_everywhere, P_BOOL,
936          NULL, NULL, NULL},
937         {"use_stripes_in_summaries", "TRUE", &prefs_common.use_stripes_in_summaries, P_BOOL,
938          NULL, NULL, NULL},
939         {"stripes_color_offset", "4000", &prefs_common.stripes_color_offset, P_INT,
940          NULL, NULL, NULL},
941         {"enable_dotted_lines", "FALSE", &prefs_common.enable_dotted_lines, P_BOOL,
942          NULL, NULL, NULL},
943         {"enable_hscrollbar", "TRUE", &prefs_common.enable_hscrollbar, P_BOOL,
944          NULL, NULL, NULL},
945         {"folderview_vscrollbar_policy", "0",
946          &prefs_common.folderview_vscrollbar_policy, P_ENUM,
947          NULL, NULL, NULL},
948         {"textview_cursor_visible", "FALSE",
949          &prefs_common.textview_cursor_visible, P_BOOL,
950          NULL, NULL, NULL},
951         {"hover_timeout", "500", &prefs_common.hover_timeout, P_INT,
952          NULL, NULL, NULL},
953 #ifndef MAEMO
954         {"cache_max_mem_usage", "4096", &prefs_common.cache_max_mem_usage, P_INT,
955          NULL, NULL, NULL},
956         {"cache_min_keep_time", "15", &prefs_common.cache_min_keep_time, P_INT,
957          NULL, NULL, NULL},
958 #else
959         {"cache_max_mem_usage", "4096", &prefs_common.cache_max_mem_usage, P_INT,
960          NULL, NULL, NULL},
961         {"cache_min_keep_time", "0", &prefs_common.cache_min_keep_time, P_INT,
962          NULL, NULL, NULL},
963 #endif
964         {"thread_by_subject_max_age", "10", &prefs_common.thread_by_subject_max_age,
965         P_INT, NULL, NULL, NULL },
966         {"summary_quicksearch_sticky", "1", &prefs_common.summary_quicksearch_sticky, P_INT,
967          NULL, NULL, NULL},
968         {"summary_quicksearch_dynamic", "0", &prefs_common.summary_quicksearch_dynamic, P_INT,
969          NULL, NULL, NULL},
970         {"statusbar_update_step", "10", &prefs_common.statusbar_update_step, P_INT,
971          NULL, NULL, NULL},
972         {"compose_no_markup", "FALSE", &prefs_common.compose_no_markup, P_BOOL,
973          NULL, NULL, NULL},
974         {"skip_ssl_cert_check", "FALSE", &prefs_common.skip_ssl_cert_check, P_BOOL,
975          NULL, NULL, NULL},
976         {"live_dangerously", "FALSE", &prefs_common.live_dangerously, P_BOOL,
977          NULL, NULL, NULL},
978         {"hide_quotes", "0", &prefs_common.hide_quotes, P_INT,
979          NULL, NULL, NULL},
980         {"unsafe_ssl_certs", "FALSE", &prefs_common.unsafe_ssl_certs, P_BOOL,
981          NULL, NULL, NULL},
982
983         {NULL, NULL, NULL, P_OTHER, NULL, NULL, NULL}
984 };
985
986 PrefsCommon *prefs_common_get(void)
987 {
988         return &prefs_common;
989 }
990
991 /*
992  * Read history list from the specified history file
993  */
994 static GList *prefs_common_read_history(const gchar *history) 
995 {
996         FILE *fp;
997         gchar *path;
998         gchar buf[PREFSBUFSIZE];
999         GList *tmp = NULL;
1000
1001         path = g_strconcat(get_rc_dir(), G_DIR_SEPARATOR_S, history,
1002                            NULL);
1003         if ((fp = g_fopen(path, "rb")) == NULL) {
1004                 if (ENOENT != errno) FILE_OP_ERROR(path, "fopen");
1005                 g_free(path);
1006                 return NULL;
1007         }
1008         g_free(path);
1009         while (fgets(buf, sizeof(buf), fp) != NULL) {
1010                 g_strstrip(buf);
1011                 if (buf[0] == '\0') continue;
1012                 tmp = add_history(tmp, buf);
1013         }
1014         fclose(fp);
1015
1016         tmp = g_list_reverse(tmp);
1017
1018         return tmp;
1019 }
1020
1021 void prefs_common_read_config(void)
1022 {
1023         gchar *rcpath;
1024         gchar *tmp;
1025
1026         rcpath = g_strconcat(get_rc_dir(), G_DIR_SEPARATOR_S, COMMON_RC, NULL);
1027         prefs_read_config(param, "Common", rcpath, NULL);
1028 #ifdef G_OS_WIN32
1029         prefs_read_config(param_os_specific, "CommonWin32", rcpath, NULL);
1030 #endif
1031
1032         g_free(rcpath);
1033
1034         tmp = g_strdup(gettext(prefs_common.quotefmt));
1035         g_free(prefs_common.quotefmt);
1036         prefs_common.quotefmt = tmp;
1037
1038         tmp = g_strdup(gettext(prefs_common.fw_quotefmt));
1039         g_free(prefs_common.fw_quotefmt);
1040         prefs_common.fw_quotefmt = tmp;
1041         
1042         tmp = g_strdup(gettext(prefs_common.date_format));
1043         g_free(prefs_common.date_format);
1044         prefs_common.date_format = tmp;
1045
1046         tmp = g_strdup(gettext(prefs_common.compose_body_format));
1047         g_free(prefs_common.compose_body_format);
1048         prefs_common.compose_body_format = tmp;
1049
1050         prefs_common.mime_open_cmd_history =
1051                 prefs_common_read_history(COMMAND_HISTORY);
1052         prefs_common.summary_quicksearch_history =
1053                 prefs_common_read_history(QUICKSEARCH_HISTORY);
1054         prefs_common.summary_search_from_history =
1055                 prefs_common_read_history(SUMMARY_SEARCH_FROM_HISTORY);
1056         prefs_common.summary_search_to_history =
1057                 prefs_common_read_history(SUMMARY_SEARCH_TO_HISTORY);
1058         prefs_common.summary_search_subject_history =
1059                 prefs_common_read_history(SUMMARY_SEARCH_SUBJECT_HISTORY);
1060         prefs_common.summary_search_body_history =
1061                 prefs_common_read_history(SUMMARY_SEARCH_BODY_HISTORY);
1062         prefs_common.summary_search_adv_condition_history =
1063                 prefs_common_read_history(SUMMARY_SEARCH_ADV_CONDITION_HISTORY);
1064         prefs_common.message_search_history =
1065                 prefs_common_read_history(MESSAGE_SEARCH_HISTORY);
1066
1067         colorlabel_update_colortable_from_prefs();
1068 }
1069
1070 #define TRY(func) \
1071 if (!(func)) \
1072 { \
1073         g_warning("failed to write\n"); \
1074         goto out;                       \
1075 } \
1076
1077 /*
1078  * Save history list to the specified history file
1079  */
1080 static void prefs_common_save_history(const gchar *history, GList *list)
1081 {
1082         GList *cur;
1083         FILE *fp;
1084         gchar *path, *tmp_path;
1085
1086         path = g_strconcat(get_rc_dir(), G_DIR_SEPARATOR_S, history,
1087                            NULL);
1088         tmp_path = g_strconcat(path, ".tmp", NULL);
1089
1090         if ((fp = g_fopen(tmp_path, "wb")) == NULL) {
1091                 FILE_OP_ERROR(tmp_path, "fopen");
1092                 goto out;
1093         }
1094
1095         for (cur = list; cur != NULL; cur = cur->next) {
1096                 TRY(fputs((gchar *)cur->data, fp) != EOF &&
1097                     fputc('\n', fp) != EOF);
1098         }
1099
1100         if (fclose(fp) == EOF) {
1101                 FILE_OP_ERROR(tmp_path, "fclose");
1102                 fp = NULL;
1103                 goto out;
1104         }
1105         fp = NULL;
1106 #ifdef G_OS_WIN32
1107         g_unlink(path);
1108 #endif
1109         if (g_rename(tmp_path, path) < 0) {
1110                 FILE_OP_ERROR(path, "rename");
1111                 goto out;
1112         }
1113
1114 out:
1115         if (fp)
1116                 fclose(fp);
1117         g_free(tmp_path);
1118         g_free(path);
1119 }
1120
1121 #undef TRY
1122
1123 void prefs_common_write_config(void)
1124 {
1125         prefs_write_config(param, "Common", COMMON_RC);
1126 #ifdef G_OS_WIN32
1127         prefs_write_config(param_os_specific, "CommonWin32", COMMON_RC);
1128 #endif
1129
1130         prefs_common_save_history(COMMAND_HISTORY, 
1131                 prefs_common.mime_open_cmd_history);
1132         prefs_common_save_history(QUICKSEARCH_HISTORY, 
1133                 prefs_common.summary_quicksearch_history);
1134         prefs_common_save_history(SUMMARY_SEARCH_FROM_HISTORY, 
1135                 prefs_common.summary_search_from_history);
1136         prefs_common_save_history(SUMMARY_SEARCH_TO_HISTORY, 
1137                 prefs_common.summary_search_to_history);
1138         prefs_common_save_history(SUMMARY_SEARCH_SUBJECT_HISTORY, 
1139                 prefs_common.summary_search_subject_history);
1140         prefs_common_save_history(SUMMARY_SEARCH_BODY_HISTORY, 
1141                 prefs_common.summary_search_body_history);
1142         prefs_common_save_history(SUMMARY_SEARCH_ADV_CONDITION_HISTORY, 
1143                 prefs_common.summary_search_adv_condition_history);
1144         prefs_common_save_history(MESSAGE_SEARCH_HISTORY, 
1145                 prefs_common.message_search_history);
1146 }
1147
1148 /* make a copy of string 'in' into buffer 'out'. un-escape \ sequences.
1149    both 'in' and 'out' must be non-NULL.
1150    'out' must be a pointer to a buffer whose size is at least equal
1151    to strlen(txt)+1, this buffer will get cleared. out's contents
1152    will always get set to a valid string, even if it's "".*/
1153 void pref_get_unescaped_pref(gchar *out, const gchar *in)
1154 {
1155         const gchar *i;
1156         gchar *o;
1157
1158         *out = '\0';
1159
1160         g_return_if_fail( in != NULL );
1161         g_return_if_fail( out != NULL );
1162
1163         i = in;
1164         o = out;
1165         memset(out, 0, strlen(in)+1);
1166         while (*i != '\0') {
1167                 if (*i == '\\' && *(i+1) == 'n') {
1168                         *o++ = '\n';
1169                         i++;
1170                 } else if (*i == '\\' && *(i+1) == 't') {
1171                         *o++ = '\t';
1172                         i++;
1173                 } else if (*i == '\\' && *(i+1) == '\\') {
1174                         *o++ = '\\';
1175                         i++;
1176                 } else {
1177                         *o++ = *i;
1178                 }
1179                 i++;
1180         }
1181         *o='\0';
1182 }
1183
1184 /* make a copy of string 'in' into buffer 'out'. escape \ sequences.
1185    both 'in' and 'out' must be non-NULL.
1186    'out' must be a pointer to a buffer whose size is at least equal
1187    to 2*strlen(txt)+1. out's contents will always get set to a valid
1188    string, even if it's "". */
1189 void pref_get_escaped_pref(gchar *out, const gchar *in)
1190 {
1191         const gchar *i;
1192         gchar *o;
1193
1194         *out = '\0';
1195
1196         g_return_if_fail( in != NULL );
1197         g_return_if_fail( out != NULL );
1198
1199         i = in;
1200         o = out;
1201         while (*i != '\0') {
1202                 if (*i == '\n') {
1203                         *o++ = '\\';
1204                         *o++ = 'n';
1205                 } else if (*i == '\t') {
1206                         *o++ = '\\';
1207                         *o++ = 't';
1208                 } else if (*i == '\\') {
1209                         *o++ = '\\';
1210                         *o++ = '\\';
1211                 } else {
1212                         *o++ = *i;
1213                 }
1214                 i++;
1215         }
1216         *o = '\0';
1217 }
1218                 
1219 /* set the contents of a textview widget from the internal \-escaped
1220   representation of a pref string. both txt and textview must be non-NULL. */
1221 void pref_set_textview_from_pref(GtkTextView *textview, const gchar *txt)
1222 {
1223         GtkTextBuffer *buffer;
1224         gchar *out = NULL;
1225
1226         g_return_if_fail( txt != NULL );
1227         g_return_if_fail( textview != NULL );
1228
1229         buffer = gtk_text_view_get_buffer(textview);
1230         out = malloc(strlen(txt)+1);
1231
1232         pref_get_unescaped_pref(out, txt);
1233
1234         gtk_text_buffer_set_text(buffer, out?out:"", -1);
1235         g_free(out);
1236 }
1237
1238 /* set the contents of a gtkentry widget from the internal \-escaped
1239   representation of a pref string. both txt and entry must be non-NULL. */
1240 void pref_set_entry_from_pref(GtkEntry *entry, const gchar *txt)
1241 {
1242         gchar *out = NULL;
1243
1244         g_return_if_fail( txt != NULL );
1245         g_return_if_fail( entry != NULL );
1246
1247         out = malloc(strlen(txt)+1);
1248
1249         pref_get_unescaped_pref(out, txt);
1250
1251         gtk_entry_set_text(entry, out?out:"");
1252         g_free(out);
1253 }
1254
1255 /* get the \-escaped internal representation of a pref from the contents of
1256    a textview widget. textview must be non-NULL. */
1257 gchar *pref_get_pref_from_textview(GtkTextView *textview) 
1258 {
1259         GtkTextBuffer *buffer;
1260         GtkTextIter start, end;
1261         gchar *out, *tmp;
1262         
1263         g_return_val_if_fail( textview != NULL, "" );
1264
1265         buffer = gtk_text_view_get_buffer(textview);
1266         gtk_text_buffer_get_start_iter(buffer, &start);
1267         gtk_text_buffer_get_iter_at_offset(buffer, &end, -1);
1268         tmp = gtk_text_buffer_get_text(buffer, &start, &end, FALSE);
1269         out = malloc(2*strlen(tmp)+1);
1270         
1271         pref_get_escaped_pref(out, tmp);
1272         g_free(tmp);
1273
1274         return out?out:"";
1275 }
1276
1277 /* get the \-escaped internal representation of a pref from the contents of
1278    a gtkentry widget. entry must be non-NULL. */
1279 gchar *pref_get_pref_from_entry(GtkEntry *entry) 
1280 {
1281         gchar *out, *tmp;
1282
1283         g_return_val_if_fail( entry != NULL, "" );
1284
1285         tmp = gtk_editable_get_chars(GTK_EDITABLE(entry), 0, -1);
1286         out = malloc(2*strlen(tmp)+1);
1287
1288         pref_get_escaped_pref(out, tmp);
1289         g_free(tmp);
1290
1291         return out?out:"";
1292 }
1293
1294 /* ugly hack to be able to get this pref from ssl_certificate.c */
1295 gboolean prefs_common_unsafe_ssl_certs(void)
1296 {
1297         return prefs_common.unsafe_ssl_certs;
1298 }