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