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