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