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