2007-06-12 [wwp] 2.9.2cvs56
[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", "480", &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         {"last_opened_folder", "", &prefs_common.last_opened_folder,
967         P_STRING, NULL, NULL, NULL },
968         {"goto_last_folder_on_startup", "FALSE", &prefs_common.goto_last_folder_on_startup,
969         P_BOOL, NULL, NULL, NULL },
970         {"summary_quicksearch_sticky", "1", &prefs_common.summary_quicksearch_sticky, P_INT,
971          NULL, NULL, NULL},
972         {"summary_quicksearch_dynamic", "0", &prefs_common.summary_quicksearch_dynamic, P_INT,
973          NULL, NULL, NULL},
974         {"summary_quicksearch_autorun", "0", &prefs_common.summary_quicksearch_autorun, P_INT,
975          NULL, NULL, NULL},
976         {"statusbar_update_step", "10", &prefs_common.statusbar_update_step, P_INT,
977          NULL, NULL, NULL},
978         {"compose_no_markup", "FALSE", &prefs_common.compose_no_markup, P_BOOL,
979          NULL, NULL, NULL},
980         {"skip_ssl_cert_check", "FALSE", &prefs_common.skip_ssl_cert_check, P_BOOL,
981          NULL, NULL, NULL},
982         {"live_dangerously", "FALSE", &prefs_common.live_dangerously, P_BOOL,
983          NULL, NULL, NULL},
984         {"hide_quotes", "0", &prefs_common.hide_quotes, P_INT,
985          NULL, NULL, NULL},
986         {"unsafe_ssl_certs", "FALSE", &prefs_common.unsafe_ssl_certs, P_BOOL,
987          NULL, NULL, NULL},
988 #ifndef MAEMO
989         {"real_time_sync", "FALSE", &prefs_common.real_time_sync, P_BOOL,
990          NULL, NULL, NULL},
991 #else
992         {"real_time_sync", "TRUE", &prefs_common.real_time_sync, P_BOOL,
993          NULL, NULL, NULL},
994 #endif
995         {NULL, NULL, NULL, P_OTHER, NULL, NULL, NULL}
996 };
997
998 PrefsCommon *prefs_common_get(void)
999 {
1000         return &prefs_common;
1001 }
1002
1003 /*
1004  * Read history list from the specified history file
1005  */
1006 static GList *prefs_common_read_history(const gchar *history) 
1007 {
1008         FILE *fp;
1009         gchar *path;
1010         gchar buf[PREFSBUFSIZE];
1011         GList *tmp = NULL;
1012
1013         path = g_strconcat(get_rc_dir(), G_DIR_SEPARATOR_S, history,
1014                            NULL);
1015         if ((fp = g_fopen(path, "rb")) == NULL) {
1016                 if (ENOENT != errno) FILE_OP_ERROR(path, "fopen");
1017                 g_free(path);
1018                 return NULL;
1019         }
1020         g_free(path);
1021         while (fgets(buf, sizeof(buf), fp) != NULL) {
1022                 g_strstrip(buf);
1023                 if (buf[0] == '\0') continue;
1024                 tmp = add_history(tmp, buf);
1025         }
1026         fclose(fp);
1027
1028         tmp = g_list_reverse(tmp);
1029
1030         return tmp;
1031 }
1032
1033 void prefs_common_read_config(void)
1034 {
1035         gchar *rcpath;
1036         gchar *tmp;
1037
1038         rcpath = g_strconcat(get_rc_dir(), G_DIR_SEPARATOR_S, COMMON_RC, NULL);
1039         prefs_read_config(param, "Common", rcpath, NULL);
1040 #ifdef G_OS_WIN32
1041         prefs_read_config(param_os_specific, "CommonWin32", rcpath, NULL);
1042 #endif
1043
1044         g_free(rcpath);
1045
1046         tmp = g_strdup(gettext(prefs_common.quotefmt));
1047         g_free(prefs_common.quotefmt);
1048         prefs_common.quotefmt = tmp;
1049
1050         tmp = g_strdup(gettext(prefs_common.fw_quotefmt));
1051         g_free(prefs_common.fw_quotefmt);
1052         prefs_common.fw_quotefmt = tmp;
1053         
1054         tmp = g_strdup(gettext(prefs_common.date_format));
1055         g_free(prefs_common.date_format);
1056         prefs_common.date_format = tmp;
1057
1058         tmp = g_strdup(gettext(prefs_common.compose_body_format));
1059         g_free(prefs_common.compose_body_format);
1060         prefs_common.compose_body_format = tmp;
1061
1062         prefs_common.mime_open_cmd_history =
1063                 prefs_common_read_history(COMMAND_HISTORY);
1064         prefs_common.summary_quicksearch_history =
1065                 prefs_common_read_history(QUICKSEARCH_HISTORY);
1066         prefs_common.summary_search_from_history =
1067                 prefs_common_read_history(SUMMARY_SEARCH_FROM_HISTORY);
1068         prefs_common.summary_search_to_history =
1069                 prefs_common_read_history(SUMMARY_SEARCH_TO_HISTORY);
1070         prefs_common.summary_search_subject_history =
1071                 prefs_common_read_history(SUMMARY_SEARCH_SUBJECT_HISTORY);
1072         prefs_common.summary_search_body_history =
1073                 prefs_common_read_history(SUMMARY_SEARCH_BODY_HISTORY);
1074         prefs_common.summary_search_adv_condition_history =
1075                 prefs_common_read_history(SUMMARY_SEARCH_ADV_CONDITION_HISTORY);
1076         prefs_common.message_search_history =
1077                 prefs_common_read_history(MESSAGE_SEARCH_HISTORY);
1078
1079         colorlabel_update_colortable_from_prefs();
1080 }
1081
1082 #define TRY(func) \
1083 if (!(func)) \
1084 { \
1085         g_warning("failed to write\n"); \
1086         goto out;                       \
1087 } \
1088
1089 /*
1090  * Save history list to the specified history file
1091  */
1092 static void prefs_common_save_history(const gchar *history, GList *list)
1093 {
1094         GList *cur;
1095         FILE *fp;
1096         gchar *path, *tmp_path;
1097
1098         path = g_strconcat(get_rc_dir(), G_DIR_SEPARATOR_S, history,
1099                            NULL);
1100         tmp_path = g_strconcat(path, ".tmp", NULL);
1101
1102         if ((fp = g_fopen(tmp_path, "wb")) == NULL) {
1103                 FILE_OP_ERROR(tmp_path, "fopen");
1104                 goto out;
1105         }
1106
1107         for (cur = list; cur != NULL; cur = cur->next) {
1108                 TRY(fputs((gchar *)cur->data, fp) != EOF &&
1109                     fputc('\n', fp) != EOF);
1110         }
1111
1112         if (fclose(fp) == EOF) {
1113                 FILE_OP_ERROR(tmp_path, "fclose");
1114                 fp = NULL;
1115                 goto out;
1116         }
1117         fp = NULL;
1118 #ifdef G_OS_WIN32
1119         g_unlink(path);
1120 #endif
1121         if (g_rename(tmp_path, path) < 0) {
1122                 FILE_OP_ERROR(path, "rename");
1123                 goto out;
1124         }
1125
1126 out:
1127         if (fp)
1128                 fclose(fp);
1129         g_free(tmp_path);
1130         g_free(path);
1131 }
1132
1133 #undef TRY
1134
1135 void prefs_common_write_config(void)
1136 {
1137         prefs_write_config(param, "Common", COMMON_RC);
1138 #ifdef G_OS_WIN32
1139         prefs_write_config(param_os_specific, "CommonWin32", COMMON_RC);
1140 #endif
1141
1142         prefs_common_save_history(COMMAND_HISTORY, 
1143                 prefs_common.mime_open_cmd_history);
1144         prefs_common_save_history(QUICKSEARCH_HISTORY, 
1145                 prefs_common.summary_quicksearch_history);
1146         prefs_common_save_history(SUMMARY_SEARCH_FROM_HISTORY, 
1147                 prefs_common.summary_search_from_history);
1148         prefs_common_save_history(SUMMARY_SEARCH_TO_HISTORY, 
1149                 prefs_common.summary_search_to_history);
1150         prefs_common_save_history(SUMMARY_SEARCH_SUBJECT_HISTORY, 
1151                 prefs_common.summary_search_subject_history);
1152         prefs_common_save_history(SUMMARY_SEARCH_BODY_HISTORY, 
1153                 prefs_common.summary_search_body_history);
1154         prefs_common_save_history(SUMMARY_SEARCH_ADV_CONDITION_HISTORY, 
1155                 prefs_common.summary_search_adv_condition_history);
1156         prefs_common_save_history(MESSAGE_SEARCH_HISTORY, 
1157                 prefs_common.message_search_history);
1158 }
1159
1160 /* make a copy of string 'in' into buffer 'out'. un-escape \ sequences.
1161    both 'in' and 'out' must be non-NULL.
1162    'out' must be a pointer to a buffer whose size is at least equal
1163    to strlen(txt)+1, this buffer will get cleared. out's contents
1164    will always get set to a valid string, even if it's "".*/
1165 void pref_get_unescaped_pref(gchar *out, const gchar *in)
1166 {
1167         const gchar *i;
1168         gchar *o;
1169
1170         *out = '\0';
1171
1172         g_return_if_fail( in != NULL );
1173         g_return_if_fail( out != NULL );
1174
1175         i = in;
1176         o = out;
1177         memset(out, 0, strlen(in)+1);
1178         while (*i != '\0') {
1179                 if (*i == '\\' && *(i+1) == 'n') {
1180                         *o++ = '\n';
1181                         i++;
1182                 } else if (*i == '\\' && *(i+1) == 't') {
1183                         *o++ = '\t';
1184                         i++;
1185                 } else if (*i == '\\' && *(i+1) == '\\') {
1186                         *o++ = '\\';
1187                         i++;
1188                 } else {
1189                         *o++ = *i;
1190                 }
1191                 i++;
1192         }
1193         *o='\0';
1194 }
1195
1196 /* make a copy of string 'in' into buffer 'out'. escape \ sequences.
1197    both 'in' and 'out' must be non-NULL.
1198    'out' must be a pointer to a buffer whose size is at least equal
1199    to 2*strlen(txt)+1. out's contents will always get set to a valid
1200    string, even if it's "". */
1201 void pref_get_escaped_pref(gchar *out, const gchar *in)
1202 {
1203         const gchar *i;
1204         gchar *o;
1205
1206         *out = '\0';
1207
1208         g_return_if_fail( in != NULL );
1209         g_return_if_fail( out != NULL );
1210
1211         i = in;
1212         o = out;
1213         while (*i != '\0') {
1214                 if (*i == '\n') {
1215                         *o++ = '\\';
1216                         *o++ = 'n';
1217                 } else if (*i == '\t') {
1218                         *o++ = '\\';
1219                         *o++ = 't';
1220                 } else if (*i == '\\') {
1221                         *o++ = '\\';
1222                         *o++ = '\\';
1223                 } else {
1224                         *o++ = *i;
1225                 }
1226                 i++;
1227         }
1228         *o = '\0';
1229 }
1230                 
1231 /* set the contents of a textview widget from the internal \-escaped
1232   representation of a pref string. both txt and textview must be non-NULL. */
1233 void pref_set_textview_from_pref(GtkTextView *textview, const gchar *txt)
1234 {
1235         GtkTextBuffer *buffer;
1236         gchar *out = NULL;
1237
1238         g_return_if_fail( textview != NULL );
1239
1240         buffer = gtk_text_view_get_buffer(textview);
1241
1242         if (!txt) {
1243                 gtk_text_buffer_set_text(buffer, "", -1);
1244         } else {
1245                 out = malloc(strlen(txt)+1);
1246
1247                 pref_get_unescaped_pref(out, txt);
1248
1249                 gtk_text_buffer_set_text(buffer, out?out:"", -1);
1250                 g_free(out);
1251         }
1252 }
1253
1254 /* set the contents of a gtkentry widget from the internal \-escaped
1255   representation of a pref string. both txt and entry must be non-NULL. */
1256 void pref_set_entry_from_pref(GtkEntry *entry, const gchar *txt)
1257 {
1258         gchar *out = NULL;
1259
1260         g_return_if_fail( entry != NULL );
1261         if (!txt) {
1262                 gtk_entry_set_text(entry, "");
1263         } else {
1264                 out = malloc(strlen(txt)+1);
1265
1266                 pref_get_unescaped_pref(out, txt);
1267
1268                 gtk_entry_set_text(entry, out?out:"");
1269                 g_free(out);
1270         }
1271 }
1272
1273 /* get the \-escaped internal representation of a pref from the contents of
1274    a textview widget. textview must be non-NULL. */
1275 gchar *pref_get_pref_from_textview(GtkTextView *textview) 
1276 {
1277         GtkTextBuffer *buffer;
1278         GtkTextIter start, end;
1279         gchar *out, *tmp;
1280         
1281         g_return_val_if_fail( textview != NULL, "" );
1282
1283         buffer = gtk_text_view_get_buffer(textview);
1284         gtk_text_buffer_get_start_iter(buffer, &start);
1285         gtk_text_buffer_get_iter_at_offset(buffer, &end, -1);
1286         tmp = gtk_text_buffer_get_text(buffer, &start, &end, FALSE);
1287         out = malloc(2*strlen(tmp)+1);
1288         
1289         pref_get_escaped_pref(out, tmp);
1290         g_free(tmp);
1291
1292         return out?out:"";
1293 }
1294
1295 /* get the \-escaped internal representation of a pref from the contents of
1296    a gtkentry widget. entry must be non-NULL. */
1297 gchar *pref_get_pref_from_entry(GtkEntry *entry) 
1298 {
1299         gchar *out, *tmp;
1300
1301         g_return_val_if_fail( entry != NULL, "" );
1302
1303         tmp = gtk_editable_get_chars(GTK_EDITABLE(entry), 0, -1);
1304         out = malloc(2*strlen(tmp)+1);
1305
1306         pref_get_escaped_pref(out, tmp);
1307         g_free(tmp);
1308
1309         return out?out:"";
1310 }
1311
1312 /* ugly hack to be able to get this pref from ssl_certificate.c */
1313 gboolean prefs_common_unsafe_ssl_certs(void)
1314 {
1315         return prefs_common.unsafe_ssl_certs;
1316 }
1317
1318 /**
1319    return the translated name of a header, if the translate_header option is
1320    set, otherwise return the untranslated header name (header_name itself).
1321    this function is provided for convenience, it's an interface to
1322    prefs_common.trans_hdr.
1323    works with header names either with or without trailing colon, provided
1324    that gettext found such header name in the sources (they should all be
1325    found in src/gtk/headers.h anyway).
1326 */
1327 const gchar *prefs_common_translated_header_name(const gchar *header_name)
1328 {
1329         if (header_name == NULL || *header_name == '\0')
1330                 return header_name;
1331
1332         return prefs_common.trans_hdr ? gettext(header_name) : header_name;
1333 }