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