2007-06-17 [wwp] 2.9.2cvs68
[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", "3", &prefs_common.select_on_entry,
718          P_ENUM, NULL, NULL, NULL},
719
720         {"summary_select_prio1", "0", &prefs_common.summary_select_prio[0], P_ENUM,
721          NULL, NULL, NULL},
722         {"summary_select_prio2", "0", &prefs_common.summary_select_prio[1], P_ENUM,
723          NULL, NULL, NULL},
724         {"summary_select_prio3", "0", &prefs_common.summary_select_prio[2], P_ENUM,
725          NULL, NULL, NULL},
726         {"summary_select_prio4", "0", &prefs_common.summary_select_prio[3], P_ENUM,
727          NULL, NULL, NULL},
728         {"summary_select_prio5", "0", &prefs_common.summary_select_prio[4], P_ENUM,
729          NULL, NULL, NULL},
730         {"summary_select_prio6", "0", &prefs_common.summary_select_prio[5], P_ENUM,
731          NULL, NULL, NULL},
732
733         {"mark_as_read_on_new_window", "FALSE",
734          &prefs_common.mark_as_read_on_new_window,
735          P_BOOL, NULL, NULL, NULL},
736         {"mark_as_read_delay", "0",
737          &prefs_common.mark_as_read_delay, P_INT, 
738          NULL, NULL, NULL},
739         {"immediate_execution", "TRUE", &prefs_common.immediate_exec, P_BOOL,
740          NULL, NULL, NULL},
741         {"nextunreadmsg_dialog", "1", &prefs_common.next_unread_msg_dialog, P_ENUM,
742          NULL, NULL, NULL},
743
744         {"pixmap_theme_path", DEFAULT_PIXMAP_THEME, 
745          &SPECIFIC_PREFS.pixmap_theme_path, P_STRING,
746          NULL, NULL, NULL},
747
748         {"ask_mark_all_read", "TRUE", &prefs_common.ask_mark_all_read, P_BOOL,
749          NULL, NULL, NULL},
750
751         {"ask_apply_per_account_filtering_rules", "TRUE", &prefs_common.ask_apply_per_account_filtering_rules, P_BOOL,
752          NULL, NULL, NULL},
753         {"apply_per_account_filtering_rules", "0", &prefs_common.apply_per_account_filtering_rules, P_ENUM,
754          NULL, NULL, NULL},
755
756         /* Addressbook */
757         {"addressbook_use_editaddress_dialog", "TRUE", &prefs_common.addressbook_use_editaddress_dialog,
758          P_BOOL, NULL, NULL, NULL},
759         {"addressbook_hpaned_pos", "-1", &prefs_common.addressbook_hpaned_pos,
760          P_INT, NULL, NULL, NULL},
761         {"addressbook_vpaned_pos", "-1", &prefs_common.addressbook_vpaned_pos,
762          P_INT, NULL, NULL, NULL},
763
764         /* Other */
765         {"uri_open_command", DEFAULT_BROWSER_CMD,
766          &SPECIFIC_PREFS.uri_cmd, P_STRING, NULL, NULL, NULL},
767         {"print_command", "lpr %s",
768          &SPECIFIC_PREFS.print_cmd, P_STRING, NULL, NULL, NULL},
769         {"ext_editor_command", DEFAULT_EDITOR_CMD,
770          &SPECIFIC_PREFS.ext_editor_cmd, P_STRING, NULL, NULL, NULL},
771         {"add_address_by_click", "FALSE", &prefs_common.add_address_by_click,
772          P_BOOL, NULL, NULL, NULL},
773         {"confirm_on_exit", "FALSE", &prefs_common.confirm_on_exit, P_BOOL,
774          NULL, NULL, NULL},
775         {"clean_trash_on_exit", "FALSE", &prefs_common.clean_on_exit, P_BOOL,
776          NULL, NULL, NULL},
777         {"ask_on_cleaning", "TRUE", &prefs_common.ask_on_clean, P_BOOL,
778          NULL, NULL, NULL},
779         {"warn_queued_on_exit", "TRUE", &prefs_common.warn_queued_on_exit,
780          P_BOOL, NULL, NULL, NULL},
781         {"work_offline", "FALSE", &prefs_common.work_offline, P_BOOL,
782          NULL, NULL, NULL},
783         {"summary_quicksearch_type", "0", &prefs_common.summary_quicksearch_type, P_INT,
784          NULL, NULL, NULL},
785 #ifndef MAEMO
786         {"summary_quicksearch_recurse", "1", &prefs_common.summary_quicksearch_recurse, P_INT,
787          NULL, NULL, NULL},
788 #else
789         {"summary_quicksearch_recurse", "0", &prefs_common.summary_quicksearch_recurse, P_INT,
790          NULL, NULL, NULL},
791 #endif
792
793         {"io_timeout_secs", "60", &prefs_common.io_timeout_secs,
794          P_INT, NULL, NULL, NULL},
795         {"hide_score", "-9999", &prefs_common.kill_score, P_INT,
796          NULL, NULL, NULL},
797         {"important_score", "1", &prefs_common.important_score, P_INT,
798          NULL, NULL, NULL},
799
800     {"clip_log", "TRUE", &prefs_common.cliplog, P_BOOL,
801          NULL, NULL, NULL},
802         {"log_length", "500", &prefs_common.loglength, P_INT,
803          NULL, NULL, NULL},
804
805         {"log_msg_color", "#00af00", &prefs_common.log_msg_color, P_COLOR,
806          NULL, NULL, NULL},
807         {"log_warn_color", "#af0000", &prefs_common.log_warn_color, P_COLOR,
808          NULL, NULL, NULL},
809         {"log_error_color", "#af0000", &prefs_common.log_error_color, P_COLOR,
810          NULL, NULL, NULL},
811         {"log_in_color", "#000000", &prefs_common.log_in_color, P_COLOR,
812          NULL, NULL, NULL},
813         {"log_out_color", "#0000ef", &prefs_common.log_out_color, P_COLOR,
814          NULL, NULL, NULL},
815         {"log_status_ok_color", "#00af00", &prefs_common.log_status_ok_color, P_COLOR,
816          NULL, NULL, NULL},
817         {"log_status_nok_color", "#0000af", &prefs_common.log_status_nok_color, P_COLOR,
818          NULL, NULL, NULL},
819         {"log_status_skip_color", "#aa00aa", &prefs_common.log_status_skip_color, P_COLOR,
820          NULL, NULL, NULL},
821
822     {"enable_filtering_debug", "FALSE", &prefs_common.enable_filtering_debug, P_BOOL,
823          NULL, NULL, NULL},
824     {"filtering_debug_level", "1", &prefs_common.filtering_debug_level, P_INT,
825          NULL, NULL, NULL},
826     {"enable_filtering_debug_inc", "TRUE", &prefs_common.enable_filtering_debug_inc, P_BOOL,
827          NULL, NULL, NULL},
828     {"enable_filtering_debug_manual", "TRUE", &prefs_common.enable_filtering_debug_manual, P_BOOL,
829          NULL, NULL, NULL},
830     {"enable_filtering_debug_folder_proc", "FALSE", &prefs_common.enable_filtering_debug_folder_proc, P_BOOL,
831          NULL, NULL, NULL},
832     {"enable_filtering_debug_pre_proc", "FALSE", &prefs_common.enable_filtering_debug_pre_proc, P_BOOL,
833          NULL, NULL, NULL},
834     {"enable_filtering_debug_post_proc", "FALSE", &prefs_common.enable_filtering_debug_post_proc, P_BOOL,
835          NULL, NULL, NULL},
836     {"filtering_debug_clip_log", "TRUE", &prefs_common.filtering_debug_cliplog, P_BOOL,
837          NULL, NULL, NULL},
838         {"filtering_debug_log_length", "500", &prefs_common.filtering_debug_loglength, P_INT,
839          NULL, NULL, NULL},
840
841         {"gtk_can_change_accels", "TRUE", &prefs_common.gtk_can_change_accels, P_BOOL,
842          NULL, NULL, NULL},
843
844         {"color_new", "179", &prefs_common.color_new, P_COLOR,
845          NULL, NULL, NULL},
846
847         /* Some windows' sizes */
848         {"filteringwin_width", "500", &prefs_common.filteringwin_width, P_INT,
849          NULL, NULL, NULL},
850         {"filteringwin_height", "-1", &prefs_common.filteringwin_height, P_INT,
851          NULL, NULL, NULL},
852
853         {"filteringactionwin_width", "490", &prefs_common.filteringactionwin_width, P_INT,
854          NULL, NULL, NULL},
855         {"filteringactionwin_height", "-1", &prefs_common.filteringactionwin_height, P_INT,
856          NULL, NULL, NULL},
857
858         {"matcherwin_width", "520", &prefs_common.matcherwin_width, P_INT,
859          NULL, NULL, NULL},
860         {"matcherwin_height", "-1", &prefs_common.matcherwin_height, P_INT,
861          NULL, NULL, NULL},
862
863         {"templateswin_width", "480", &prefs_common.templateswin_width, P_INT,
864          NULL, NULL, NULL},
865         {"templateswin_height", "-1", &prefs_common.templateswin_height, P_INT,
866          NULL, NULL, NULL},
867
868         {"actionswin_width", "486", &prefs_common.actionswin_width, P_INT,
869          NULL, NULL, NULL},
870         {"actionswin_height", "-1", &prefs_common.actionswin_height, P_INT,
871          NULL, NULL, NULL},
872
873         {"addressbookwin_width", "520", &prefs_common.addressbookwin_width, P_INT,
874          NULL, NULL, NULL},
875         {"addressbookwin_height", "-1", &prefs_common.addressbookwin_height, P_INT,
876          NULL, NULL, NULL},
877
878         {"addressbookeditpersonwin_width", "640", &prefs_common.addressbookeditpersonwin_width, P_INT,
879          NULL, NULL, NULL},
880         {"addressbookeditpersonwin_height", "320", &prefs_common.addressbookeditpersonwin_height, P_INT,
881          NULL, NULL, NULL},
882
883         {"addressbookeditgroupwin_width", "580", &prefs_common.addressbookeditgroupwin_width, P_INT,
884          NULL, NULL, NULL},
885         {"addressbookeditgroupwin_height", "340", &prefs_common.addressbookeditgroupwin_height, P_INT,
886          NULL, NULL, NULL},
887
888         {"pluginswin_width", "-1", &prefs_common.pluginswin_width, P_INT,
889          NULL, NULL, NULL},
890         {"pluginswin_height", "-1", &prefs_common.pluginswin_height, P_INT,
891          NULL, NULL, NULL},
892
893         {"prefswin_width", "600", &prefs_common.prefswin_width, P_INT,
894          NULL, NULL, NULL},
895         {"prefswin_height", "-1", &prefs_common.prefswin_height, P_INT,
896          NULL, NULL, NULL},
897
898         {"folderitemwin_width", "500", &prefs_common.folderitemwin_width, P_INT,
899          NULL, NULL, NULL},
900         {"folderitemwin_height", "-1", &prefs_common.folderitemwin_height, P_INT,
901          NULL, NULL, NULL},
902
903         {"zero_replacement_char", "0", &prefs_common.zero_replacement, P_STRING,
904          NULL, NULL, NULL},
905
906         {"editaccountwin_width", "500", &prefs_common.editaccountwin_width, P_INT,
907          NULL, NULL, NULL},
908         {"editaccountwin_height", "-1", &prefs_common.editaccountwin_height, P_INT,
909          NULL, NULL, NULL},
910
911         {"accountswin_width", "500", &prefs_common.accountswin_width, P_INT,
912          NULL, NULL, NULL},
913         {"accountswin_height", "-1", &prefs_common.accountswin_height, P_INT,
914          NULL, NULL, NULL},
915
916         {"logwin_width", "520", &prefs_common.logwin_width, P_INT,
917          NULL, NULL, NULL},
918         {"logwin_height", "-1", &prefs_common.logwin_height, P_INT,
919          NULL, NULL, NULL},
920
921         {"filtering_debugwin_width", "600", &prefs_common.filtering_debugwin_width, P_INT,
922          NULL, NULL, NULL},
923         {"filtering_debugwin_height", "-1", &prefs_common.filtering_debugwin_height, P_INT,
924          NULL, NULL, NULL},
925
926         {"folderselwin_width", "300", &prefs_common.folderselwin_width, P_INT,
927          NULL, NULL, NULL},
928         {"folderselwin_height", "-1", &prefs_common.folderselwin_height, P_INT,
929          NULL, NULL, NULL},
930
931         {"addressaddwin_width", "300", &prefs_common.addressaddwin_width, P_INT,
932          NULL, NULL, NULL},
933         {"addressaddwin_height", "-1", &prefs_common.addressaddwin_height, P_INT,
934          NULL, NULL, NULL},
935
936         {"addressbook_folderselwin_width", "300", &prefs_common.addressbook_folderselwin_width, P_INT,
937          NULL, NULL, NULL},
938         {"addressbook_folderselwin_height", "-1", &prefs_common.addressbook_folderselwin_height, P_INT,
939          NULL, NULL, NULL},
940
941         /* Hidden */
942         {"warn_dnd", "1", &prefs_common.warn_dnd, P_INT,
943          NULL, NULL, NULL},
944         {"utf8_instead_of_locale_for_broken_mail", "0", 
945          &prefs_common.broken_are_utf8, P_INT,
946          NULL, NULL, NULL},
947         {"enable_swap_from", "FALSE", &prefs_common.swap_from, P_BOOL,
948          NULL, NULL, NULL},
949         {"use_stripes_everywhere", "TRUE", &prefs_common.use_stripes_everywhere, P_BOOL,
950          NULL, NULL, NULL},
951         {"use_stripes_in_summaries", "TRUE", &prefs_common.use_stripes_in_summaries, P_BOOL,
952          NULL, NULL, NULL},
953         {"stripes_color_offset", "4000", &prefs_common.stripes_color_offset, P_INT,
954          NULL, NULL, NULL},
955         {"enable_dotted_lines", "FALSE", &prefs_common.enable_dotted_lines, P_BOOL,
956          NULL, NULL, NULL},
957         {"enable_hscrollbar", "TRUE", &prefs_common.enable_hscrollbar, P_BOOL,
958          NULL, NULL, NULL},
959         {"folderview_vscrollbar_policy", "0",
960          &prefs_common.folderview_vscrollbar_policy, P_ENUM,
961          NULL, NULL, NULL},
962         {"textview_cursor_visible", "FALSE",
963          &prefs_common.textview_cursor_visible, P_BOOL,
964          NULL, NULL, NULL},
965         {"hover_timeout", "500", &prefs_common.hover_timeout, P_INT,
966          NULL, NULL, NULL},
967 #ifndef MAEMO
968         {"cache_max_mem_usage", "4096", &prefs_common.cache_max_mem_usage, P_INT,
969          NULL, NULL, NULL},
970         {"cache_min_keep_time", "15", &prefs_common.cache_min_keep_time, P_INT,
971          NULL, NULL, NULL},
972 #else
973         {"cache_max_mem_usage", "4096", &prefs_common.cache_max_mem_usage, P_INT,
974          NULL, NULL, NULL},
975         {"cache_min_keep_time", "0", &prefs_common.cache_min_keep_time, P_INT,
976          NULL, NULL, NULL},
977 #endif
978         {"thread_by_subject_max_age", "10", &prefs_common.thread_by_subject_max_age,
979         P_INT, NULL, NULL, NULL },
980         {"last_opened_folder", "", &prefs_common.last_opened_folder,
981         P_STRING, NULL, NULL, NULL },
982         {"goto_last_folder_on_startup", "FALSE", &prefs_common.goto_last_folder_on_startup,
983         P_BOOL, NULL, NULL, NULL },
984         {"summary_quicksearch_sticky", "1", &prefs_common.summary_quicksearch_sticky, P_INT,
985          NULL, NULL, NULL},
986         {"summary_quicksearch_dynamic", "0", &prefs_common.summary_quicksearch_dynamic, P_INT,
987          NULL, NULL, NULL},
988         {"summary_quicksearch_autorun", "0", &prefs_common.summary_quicksearch_autorun, P_INT,
989          NULL, NULL, NULL},
990         {"statusbar_update_step", "10", &prefs_common.statusbar_update_step, P_INT,
991          NULL, NULL, NULL},
992         {"compose_no_markup", "FALSE", &prefs_common.compose_no_markup, P_BOOL,
993          NULL, NULL, NULL},
994         {"skip_ssl_cert_check", "FALSE", &prefs_common.skip_ssl_cert_check, P_BOOL,
995          NULL, NULL, NULL},
996         {"live_dangerously", "FALSE", &prefs_common.live_dangerously, P_BOOL,
997          NULL, NULL, NULL},
998         {"hide_quotes", "0", &prefs_common.hide_quotes, P_INT,
999          NULL, NULL, NULL},
1000         {"unsafe_ssl_certs", "FALSE", &prefs_common.unsafe_ssl_certs, P_BOOL,
1001          NULL, NULL, NULL},
1002 #ifndef MAEMO
1003         {"real_time_sync", "FALSE", &prefs_common.real_time_sync, P_BOOL,
1004          NULL, NULL, NULL},
1005 #else
1006         {"real_time_sync", "TRUE", &prefs_common.real_time_sync, P_BOOL,
1007          NULL, NULL, NULL},
1008 #endif
1009         {NULL, NULL, NULL, P_OTHER, NULL, NULL, NULL}
1010 };
1011
1012 PrefsCommon *prefs_common_get(void)
1013 {
1014         return &prefs_common;
1015 }
1016
1017 /*
1018  * Read history list from the specified history file
1019  */
1020 static GList *prefs_common_read_history(const gchar *history) 
1021 {
1022         FILE *fp;
1023         gchar *path;
1024         gchar buf[PREFSBUFSIZE];
1025         GList *tmp = NULL;
1026
1027         path = g_strconcat(get_rc_dir(), G_DIR_SEPARATOR_S, history,
1028                            NULL);
1029         if ((fp = g_fopen(path, "rb")) == NULL) {
1030                 if (ENOENT != errno) FILE_OP_ERROR(path, "fopen");
1031                 g_free(path);
1032                 return NULL;
1033         }
1034         g_free(path);
1035         while (fgets(buf, sizeof(buf), fp) != NULL) {
1036                 g_strstrip(buf);
1037                 if (buf[0] == '\0') continue;
1038                 tmp = add_history(tmp, buf);
1039         }
1040         fclose(fp);
1041
1042         tmp = g_list_reverse(tmp);
1043
1044         return tmp;
1045 }
1046
1047 void prefs_common_read_config(void)
1048 {
1049         gchar *rcpath;
1050         gchar *tmp;
1051
1052         rcpath = g_strconcat(get_rc_dir(), G_DIR_SEPARATOR_S, COMMON_RC, NULL);
1053         prefs_read_config(param, "Common", rcpath, NULL);
1054 #ifdef G_OS_WIN32
1055         prefs_read_config(param_os_specific, "CommonWin32", rcpath, NULL);
1056 #endif
1057
1058         g_free(rcpath);
1059
1060         tmp = g_strdup(gettext(prefs_common.quotefmt));
1061         g_free(prefs_common.quotefmt);
1062         prefs_common.quotefmt = tmp;
1063
1064         tmp = g_strdup(gettext(prefs_common.fw_quotefmt));
1065         g_free(prefs_common.fw_quotefmt);
1066         prefs_common.fw_quotefmt = tmp;
1067         
1068         tmp = g_strdup(gettext(prefs_common.date_format));
1069         g_free(prefs_common.date_format);
1070         prefs_common.date_format = tmp;
1071
1072         tmp = g_strdup(gettext(prefs_common.compose_body_format));
1073         g_free(prefs_common.compose_body_format);
1074         prefs_common.compose_body_format = tmp;
1075
1076         prefs_common.mime_open_cmd_history =
1077                 prefs_common_read_history(COMMAND_HISTORY);
1078         prefs_common.summary_quicksearch_history =
1079                 prefs_common_read_history(QUICKSEARCH_HISTORY);
1080         prefs_common.summary_search_from_history =
1081                 prefs_common_read_history(SUMMARY_SEARCH_FROM_HISTORY);
1082         prefs_common.summary_search_to_history =
1083                 prefs_common_read_history(SUMMARY_SEARCH_TO_HISTORY);
1084         prefs_common.summary_search_subject_history =
1085                 prefs_common_read_history(SUMMARY_SEARCH_SUBJECT_HISTORY);
1086         prefs_common.summary_search_body_history =
1087                 prefs_common_read_history(SUMMARY_SEARCH_BODY_HISTORY);
1088         prefs_common.summary_search_adv_condition_history =
1089                 prefs_common_read_history(SUMMARY_SEARCH_ADV_CONDITION_HISTORY);
1090         prefs_common.message_search_history =
1091                 prefs_common_read_history(MESSAGE_SEARCH_HISTORY);
1092
1093         colorlabel_update_colortable_from_prefs();
1094 }
1095
1096 #define TRY(func) \
1097 if (!(func)) \
1098 { \
1099         g_warning("failed to write\n"); \
1100         goto out;                       \
1101 } \
1102
1103 /*
1104  * Save history list to the specified history file
1105  */
1106 static void prefs_common_save_history(const gchar *history, GList *list)
1107 {
1108         GList *cur;
1109         FILE *fp;
1110         gchar *path, *tmp_path;
1111
1112         path = g_strconcat(get_rc_dir(), G_DIR_SEPARATOR_S, history,
1113                            NULL);
1114         tmp_path = g_strconcat(path, ".tmp", NULL);
1115
1116         if ((fp = g_fopen(tmp_path, "wb")) == NULL) {
1117                 FILE_OP_ERROR(tmp_path, "fopen");
1118                 goto out;
1119         }
1120
1121         for (cur = list; cur != NULL; cur = cur->next) {
1122                 TRY(fputs((gchar *)cur->data, fp) != EOF &&
1123                     fputc('\n', fp) != EOF);
1124         }
1125
1126         if (fclose(fp) == EOF) {
1127                 FILE_OP_ERROR(tmp_path, "fclose");
1128                 fp = NULL;
1129                 goto out;
1130         }
1131         fp = NULL;
1132 #ifdef G_OS_WIN32
1133         g_unlink(path);
1134 #endif
1135         if (g_rename(tmp_path, path) < 0) {
1136                 FILE_OP_ERROR(path, "rename");
1137                 goto out;
1138         }
1139
1140 out:
1141         if (fp)
1142                 fclose(fp);
1143         g_free(tmp_path);
1144         g_free(path);
1145 }
1146
1147 #undef TRY
1148
1149 void prefs_common_write_config(void)
1150 {
1151         prefs_write_config(param, "Common", COMMON_RC);
1152 #ifdef G_OS_WIN32
1153         prefs_write_config(param_os_specific, "CommonWin32", COMMON_RC);
1154 #endif
1155
1156         prefs_common_save_history(COMMAND_HISTORY, 
1157                 prefs_common.mime_open_cmd_history);
1158         prefs_common_save_history(QUICKSEARCH_HISTORY, 
1159                 prefs_common.summary_quicksearch_history);
1160         prefs_common_save_history(SUMMARY_SEARCH_FROM_HISTORY, 
1161                 prefs_common.summary_search_from_history);
1162         prefs_common_save_history(SUMMARY_SEARCH_TO_HISTORY, 
1163                 prefs_common.summary_search_to_history);
1164         prefs_common_save_history(SUMMARY_SEARCH_SUBJECT_HISTORY, 
1165                 prefs_common.summary_search_subject_history);
1166         prefs_common_save_history(SUMMARY_SEARCH_BODY_HISTORY, 
1167                 prefs_common.summary_search_body_history);
1168         prefs_common_save_history(SUMMARY_SEARCH_ADV_CONDITION_HISTORY, 
1169                 prefs_common.summary_search_adv_condition_history);
1170         prefs_common_save_history(MESSAGE_SEARCH_HISTORY, 
1171                 prefs_common.message_search_history);
1172 }
1173
1174 /* make a copy of string 'in' into buffer 'out'. un-escape \ sequences.
1175    both 'in' and 'out' must be non-NULL.
1176    'out' must be a pointer to a buffer whose size is at least equal
1177    to strlen(txt)+1, this buffer will get cleared. out's contents
1178    will always get set to a valid string, even if it's "".*/
1179 void pref_get_unescaped_pref(gchar *out, const gchar *in)
1180 {
1181         const gchar *i;
1182         gchar *o;
1183
1184         *out = '\0';
1185
1186         g_return_if_fail( in != NULL );
1187         g_return_if_fail( out != NULL );
1188
1189         i = in;
1190         o = out;
1191         memset(out, 0, strlen(in)+1);
1192         while (*i != '\0') {
1193                 if (*i == '\\' && *(i+1) == 'n') {
1194                         *o++ = '\n';
1195                         i++;
1196                 } else if (*i == '\\' && *(i+1) == 't') {
1197                         *o++ = '\t';
1198                         i++;
1199                 } else if (*i == '\\' && *(i+1) == '\\') {
1200                         *o++ = '\\';
1201                         i++;
1202                 } else {
1203                         *o++ = *i;
1204                 }
1205                 i++;
1206         }
1207         *o='\0';
1208 }
1209
1210 /* make a copy of string 'in' into buffer 'out'. escape \ sequences.
1211    both 'in' and 'out' must be non-NULL.
1212    'out' must be a pointer to a buffer whose size is at least equal
1213    to 2*strlen(txt)+1. out's contents will always get set to a valid
1214    string, even if it's "". */
1215 void pref_get_escaped_pref(gchar *out, const gchar *in)
1216 {
1217         const gchar *i;
1218         gchar *o;
1219
1220         *out = '\0';
1221
1222         g_return_if_fail( in != NULL );
1223         g_return_if_fail( out != NULL );
1224
1225         i = in;
1226         o = out;
1227         while (*i != '\0') {
1228                 if (*i == '\n') {
1229                         *o++ = '\\';
1230                         *o++ = 'n';
1231                 } else if (*i == '\t') {
1232                         *o++ = '\\';
1233                         *o++ = 't';
1234                 } else if (*i == '\\') {
1235                         *o++ = '\\';
1236                         *o++ = '\\';
1237                 } else {
1238                         *o++ = *i;
1239                 }
1240                 i++;
1241         }
1242         *o = '\0';
1243 }
1244                 
1245 /* set the contents of a textview widget from the internal \-escaped
1246   representation of a pref string. both txt and textview must be non-NULL. */
1247 void pref_set_textview_from_pref(GtkTextView *textview, const gchar *txt)
1248 {
1249         GtkTextBuffer *buffer;
1250         gchar *out = NULL;
1251
1252         g_return_if_fail( textview != NULL );
1253
1254         buffer = gtk_text_view_get_buffer(textview);
1255
1256         if (!txt) {
1257                 gtk_text_buffer_set_text(buffer, "", -1);
1258         } else {
1259                 out = malloc(strlen(txt)+1);
1260
1261                 pref_get_unescaped_pref(out, txt);
1262
1263                 gtk_text_buffer_set_text(buffer, out?out:"", -1);
1264                 g_free(out);
1265         }
1266 }
1267
1268 /* set the contents of a gtkentry widget from the internal \-escaped
1269   representation of a pref string. both txt and entry must be non-NULL. */
1270 void pref_set_entry_from_pref(GtkEntry *entry, const gchar *txt)
1271 {
1272         gchar *out = NULL;
1273
1274         g_return_if_fail( entry != NULL );
1275         if (!txt) {
1276                 gtk_entry_set_text(entry, "");
1277         } else {
1278                 out = malloc(strlen(txt)+1);
1279
1280                 pref_get_unescaped_pref(out, txt);
1281
1282                 gtk_entry_set_text(entry, out?out:"");
1283                 g_free(out);
1284         }
1285 }
1286
1287 /* get the \-escaped internal representation of a pref from the contents of
1288    a textview widget. textview must be non-NULL. */
1289 gchar *pref_get_pref_from_textview(GtkTextView *textview) 
1290 {
1291         GtkTextBuffer *buffer;
1292         GtkTextIter start, end;
1293         gchar *out, *tmp;
1294         
1295         g_return_val_if_fail( textview != NULL, "" );
1296
1297         buffer = gtk_text_view_get_buffer(textview);
1298         gtk_text_buffer_get_start_iter(buffer, &start);
1299         gtk_text_buffer_get_iter_at_offset(buffer, &end, -1);
1300         tmp = gtk_text_buffer_get_text(buffer, &start, &end, FALSE);
1301         out = malloc(2*strlen(tmp)+1);
1302         
1303         pref_get_escaped_pref(out, tmp);
1304         g_free(tmp);
1305
1306         return out?out:"";
1307 }
1308
1309 /* get the \-escaped internal representation of a pref from the contents of
1310    a gtkentry widget. entry must be non-NULL. */
1311 gchar *pref_get_pref_from_entry(GtkEntry *entry) 
1312 {
1313         gchar *out, *tmp;
1314
1315         g_return_val_if_fail( entry != NULL, "" );
1316
1317         tmp = gtk_editable_get_chars(GTK_EDITABLE(entry), 0, -1);
1318         out = malloc(2*strlen(tmp)+1);
1319
1320         pref_get_escaped_pref(out, tmp);
1321         g_free(tmp);
1322
1323         return out?out:"";
1324 }
1325
1326 /* ugly hack to be able to get this pref from ssl_certificate.c */
1327 gboolean prefs_common_unsafe_ssl_certs(void)
1328 {
1329         return prefs_common.unsafe_ssl_certs;
1330 }
1331
1332 /**
1333    return the translated name of a header, if the translate_header option is
1334    set, otherwise return the untranslated header name (header_name itself).
1335    this function is provided for convenience, it's an interface to
1336    prefs_common.trans_hdr.
1337    works with header names either with or without trailing colon, provided
1338    that gettext found such header name in the sources (they should all be
1339    found in src/gtk/headers.h anyway).
1340 */
1341 const gchar *prefs_common_translated_header_name(const gchar *header_name)
1342 {
1343         if (header_name == NULL || *header_name == '\0')
1344                 return header_name;
1345
1346         return prefs_common.trans_hdr ? gettext(header_name) : header_name;
1347 }