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