2007-01-16 [colin] 2.7.1cvs11
[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         {"separate_folder", "FALSE", &prefs_common.sep_folder, P_BOOL,
610          NULL, NULL, NULL},
611         {"separate_message", "FALSE", &prefs_common.sep_msg, P_BOOL,
612          NULL, NULL, NULL},
613
614         /* {"emulate_emacs", "FALSE", &prefs_common.emulate_emacs, P_BOOL,
615          NULL, NULL, NULL}, */
616         {"always_show_message_when_selected", "FALSE",
617          &prefs_common.always_show_msg,
618          P_BOOL, NULL, NULL, NULL},
619         {"select_on_entry", "2", &prefs_common.select_on_entry,
620          P_ENUM, NULL, NULL, NULL},
621         {"mark_as_read_on_new_window", "FALSE",
622          &prefs_common.mark_as_read_on_new_window,
623          P_BOOL, NULL, NULL, NULL},
624         {"mark_as_read_delay", "0",
625          &prefs_common.mark_as_read_delay, P_INT, 
626          NULL, NULL, NULL},
627         {"immediate_execution", "TRUE", &prefs_common.immediate_exec, P_BOOL,
628          NULL, NULL, NULL},
629         {"nextunreadmsg_dialog", "1", &prefs_common.next_unread_msg_dialog, P_ENUM,
630          NULL, NULL, NULL},
631
632         {"pixmap_theme_path", DEFAULT_PIXMAP_THEME, 
633          &SPECIFIC_PREFS.pixmap_theme_path, P_STRING,
634          NULL, NULL, NULL},
635
636         {"ask_mark_all_read", "TRUE", &prefs_common.ask_mark_all_read, P_BOOL,
637          NULL, NULL, NULL},
638
639         {"ask_apply_per_account_filtering_rules", "TRUE", &prefs_common.ask_apply_per_account_filtering_rules, P_BOOL,
640          NULL, NULL, NULL},
641         {"apply_per_account_filtering_rules", "0", &prefs_common.apply_per_account_filtering_rules, P_ENUM,
642          NULL, NULL, NULL},
643
644         /* Addressbook */
645         {"addressbook_use_editaddress_dialog", "TRUE", &prefs_common.addressbook_use_editaddress_dialog,
646          P_BOOL, NULL, NULL, NULL},
647         {"addressbook_hpaned_pos", "-1", &prefs_common.addressbook_hpaned_pos,
648          P_INT, NULL, NULL, NULL},
649         {"addressbook_vpaned_pos", "-1", &prefs_common.addressbook_vpaned_pos,
650          P_INT, NULL, NULL, NULL},
651
652         /* Other */
653         {"uri_open_command", DEFAULT_BROWSER_CMD,
654          &SPECIFIC_PREFS.uri_cmd, P_STRING, NULL, NULL, NULL},
655         {"print_command", "lpr %s",
656          &SPECIFIC_PREFS.print_cmd, P_STRING, NULL, NULL, NULL},
657         {"ext_editor_command", DEFAULT_EDITOR_CMD,
658          &SPECIFIC_PREFS.ext_editor_cmd, P_STRING, NULL, NULL, NULL},
659         {"add_address_by_click", "FALSE", &prefs_common.add_address_by_click,
660          P_BOOL, NULL, NULL, NULL},
661         {"confirm_on_exit", "FALSE", &prefs_common.confirm_on_exit, P_BOOL,
662          NULL, NULL, NULL},
663         {"clean_trash_on_exit", "FALSE", &prefs_common.clean_on_exit, P_BOOL,
664          NULL, NULL, NULL},
665         {"ask_on_cleaning", "TRUE", &prefs_common.ask_on_clean, P_BOOL,
666          NULL, NULL, NULL},
667         {"warn_queued_on_exit", "TRUE", &prefs_common.warn_queued_on_exit,
668          P_BOOL, NULL, NULL, NULL},
669         {"work_offline", "FALSE", &prefs_common.work_offline, P_BOOL,
670          NULL, NULL, NULL},
671         {"summary_quicksearch_type", "0", &prefs_common.summary_quicksearch_type, P_INT,
672          NULL, NULL, NULL},
673         {"summary_quicksearch_recurse", "1", &prefs_common.summary_quicksearch_recurse, P_INT,
674          NULL, NULL, NULL},
675
676         {"io_timeout_secs", "60", &prefs_common.io_timeout_secs,
677          P_INT, NULL, NULL, NULL},
678         {"hide_score", "-9999", &prefs_common.kill_score, P_INT,
679          NULL, NULL, NULL},
680         {"important_score", "1", &prefs_common.important_score, P_INT,
681          NULL, NULL, NULL},
682         {"clip_log", "TRUE", &prefs_common.cliplog, P_BOOL,
683          NULL, NULL, NULL},
684         {"log_length", "500", &prefs_common.loglength, P_INT,
685          NULL, NULL, NULL},
686         {"log_msg_color", "#00af00", &prefs_common.log_msg_color, P_COLOR,
687          NULL, NULL, NULL},
688         {"log_warn_color", "#af0000", &prefs_common.log_warn_color, P_COLOR,
689          NULL, NULL, NULL},
690         {"log_error_color", "#af0000", &prefs_common.log_error_color, P_COLOR,
691          NULL, NULL, NULL},
692         {"log_in_color", "#000000", &prefs_common.log_in_color, P_COLOR,
693          NULL, NULL, NULL},
694         {"log_out_color", "#0000ef", &prefs_common.log_out_color, P_COLOR,
695          NULL, NULL, NULL},
696
697         {"color_new", "179", &prefs_common.color_new, P_COLOR,
698          NULL, NULL, NULL},
699
700         /* Some windows' sizes */
701         {"filteringwin_width", "500", &prefs_common.filteringwin_width, P_INT,
702          NULL, NULL, NULL},
703         {"filteringwin_height", "-1", &prefs_common.filteringwin_height, P_INT,
704          NULL, NULL, NULL},
705
706         {"filteringactionwin_width", "490", &prefs_common.filteringactionwin_width, P_INT,
707          NULL, NULL, NULL},
708         {"filteringactionwin_height", "-1", &prefs_common.filteringactionwin_height, P_INT,
709          NULL, NULL, NULL},
710
711         {"matcherwin_width", "520", &prefs_common.matcherwin_width, P_INT,
712          NULL, NULL, NULL},
713         {"matcherwin_height", "-1", &prefs_common.matcherwin_height, P_INT,
714          NULL, NULL, NULL},
715
716         {"templateswin_width", "440", &prefs_common.templateswin_width, P_INT,
717          NULL, NULL, NULL},
718         {"templateswin_height", "-1", &prefs_common.templateswin_height, P_INT,
719          NULL, NULL, NULL},
720
721         {"actionswin_width", "486", &prefs_common.actionswin_width, P_INT,
722          NULL, NULL, NULL},
723         {"actionswin_height", "-1", &prefs_common.actionswin_height, P_INT,
724          NULL, NULL, NULL},
725
726         {"addressbookwin_width", "520", &prefs_common.addressbookwin_width, P_INT,
727          NULL, NULL, NULL},
728         {"addressbookwin_height", "-1", &prefs_common.addressbookwin_height, P_INT,
729          NULL, NULL, NULL},
730
731         {"addressbookeditpersonwin_width", "640", &prefs_common.addressbookeditpersonwin_width, P_INT,
732          NULL, NULL, NULL},
733         {"addressbookeditpersonwin_height", "320", &prefs_common.addressbookeditpersonwin_height, P_INT,
734          NULL, NULL, NULL},
735
736         {"addressbookeditgroupwin_width", "580", &prefs_common.addressbookeditgroupwin_width, P_INT,
737          NULL, NULL, NULL},
738         {"addressbookeditgroupwin_height", "340", &prefs_common.addressbookeditgroupwin_height, P_INT,
739          NULL, NULL, NULL},
740
741         {"pluginswin_width", "480", &prefs_common.pluginswin_width, P_INT,
742          NULL, NULL, NULL},
743         {"pluginswin_height", "-1", &prefs_common.pluginswin_height, P_INT,
744          NULL, NULL, NULL},
745
746         {"prefswin_width", "600", &prefs_common.prefswin_width, P_INT,
747          NULL, NULL, NULL},
748         {"prefswin_height", "-1", &prefs_common.prefswin_height, P_INT,
749          NULL, NULL, NULL},
750
751         {"folderitemwin_width", "500", &prefs_common.folderitemwin_width, P_INT,
752          NULL, NULL, NULL},
753         {"folderitemwin_height", "-1", &prefs_common.folderitemwin_height, P_INT,
754          NULL, NULL, NULL},
755
756         {"editaccountwin_width", "500", &prefs_common.editaccountwin_width, P_INT,
757          NULL, NULL, NULL},
758         {"editaccountwin_height", "-1", &prefs_common.editaccountwin_height, P_INT,
759          NULL, NULL, NULL},
760
761         {"accountswin_width", "500", &prefs_common.accountswin_width, P_INT,
762          NULL, NULL, NULL},
763         {"accountswin_height", "-1", &prefs_common.accountswin_height, P_INT,
764          NULL, NULL, NULL},
765
766         {"logwin_width", "520", &prefs_common.logwin_width, P_INT,
767          NULL, NULL, NULL},
768         {"logwin_height", "-1", &prefs_common.logwin_height, P_INT,
769          NULL, NULL, NULL},
770
771         {"folderselwin_width", "300", &prefs_common.folderselwin_width, P_INT,
772          NULL, NULL, NULL},
773         {"folderselwin_height", "-1", &prefs_common.folderselwin_height, P_INT,
774          NULL, NULL, NULL},
775
776         {"addressaddwin_width", "300", &prefs_common.addressaddwin_width, P_INT,
777          NULL, NULL, NULL},
778         {"addressaddwin_height", "-1", &prefs_common.addressaddwin_height, P_INT,
779          NULL, NULL, NULL},
780
781         {"addressbook_folderselwin_width", "300", &prefs_common.addressbook_folderselwin_width, P_INT,
782          NULL, NULL, NULL},
783         {"addressbook_folderselwin_height", "-1", &prefs_common.addressbook_folderselwin_height, P_INT,
784          NULL, NULL, NULL},
785
786         /* Hidden */
787         {"warn_dnd", "1", &prefs_common.warn_dnd, P_INT,
788          NULL, NULL, NULL},
789         {"utf8_instead_of_locale_for_broken_mail", "0", 
790          &prefs_common.broken_are_utf8, P_INT,
791          NULL, NULL, NULL},
792         {"enable_swap_from", "FALSE", &prefs_common.swap_from, P_BOOL,
793          NULL, NULL, NULL},
794         {"use_stripes_everywhere", "TRUE", &prefs_common.use_stripes_everywhere, P_BOOL,
795          NULL, NULL, NULL},
796         {"use_stripes_in_summaries", "TRUE", &prefs_common.use_stripes_in_summaries, P_BOOL,
797          NULL, NULL, NULL},
798         {"stripes_color_offset", "4000", &prefs_common.stripes_color_offset, P_INT,
799          NULL, NULL, NULL},
800         {"enable_dotted_lines", "FALSE", &prefs_common.enable_dotted_lines, P_BOOL,
801          NULL, NULL, NULL},
802         {"enable_hscrollbar", "TRUE", &prefs_common.enable_hscrollbar, P_BOOL,
803          NULL, NULL, NULL},
804         {"folderview_vscrollbar_policy", "0",
805          &prefs_common.folderview_vscrollbar_policy, P_ENUM,
806          NULL, NULL, NULL},
807         {"textview_cursor_visible", "FALSE",
808          &prefs_common.textview_cursor_visible, P_BOOL,
809          NULL, NULL, NULL},
810         {"hover_timeout", "500", &prefs_common.hover_timeout, P_INT,
811          NULL, NULL, NULL},
812         {"cache_max_mem_usage", "4096", &prefs_common.cache_max_mem_usage, P_INT,
813          NULL, NULL, NULL},
814         {"cache_min_keep_time", "15", &prefs_common.cache_min_keep_time, P_INT,
815          NULL, NULL, NULL},
816         {"thread_by_subject_max_age", "10", &prefs_common.thread_by_subject_max_age,
817         P_INT, NULL, NULL, NULL },
818         {"summary_quicksearch_sticky", "1", &prefs_common.summary_quicksearch_sticky, P_INT,
819          NULL, NULL, NULL},
820         {"summary_quicksearch_dynamic", "0", &prefs_common.summary_quicksearch_dynamic, P_INT,
821          NULL, NULL, NULL},
822         {"statusbar_update_step", "10", &prefs_common.statusbar_update_step, P_INT,
823          NULL, NULL, NULL},
824         {"compose_no_markup", "FALSE", &prefs_common.compose_no_markup, P_BOOL,
825          NULL, NULL, NULL},
826         {"skip_ssl_cert_check", "FALSE", &prefs_common.skip_ssl_cert_check, P_BOOL,
827          NULL, NULL, NULL},
828         {"live_dangerously", "FALSE", &prefs_common.live_dangerously, P_BOOL,
829          NULL, NULL, NULL},
830         {"hide_quotes", "0", &prefs_common.hide_quotes, P_INT,
831          NULL, NULL, NULL},
832         {"unsafe_ssl_certs", "FALSE", &prefs_common.unsafe_ssl_certs, P_BOOL,
833          NULL, NULL, NULL},
834
835         {NULL, NULL, NULL, P_OTHER, NULL, NULL, NULL}
836 };
837
838 PrefsCommon *prefs_common_get(void)
839 {
840         return &prefs_common;
841 }
842
843 /*
844  * Read history list from the specified history file
845  */
846 GList *prefs_common_read_history(const gchar *history) 
847 {
848         FILE *fp;
849         gchar *path;
850         gchar buf[PREFSBUFSIZE];
851         GList *tmp = NULL;
852
853         path = g_strconcat(get_rc_dir(), G_DIR_SEPARATOR_S, history,
854                            NULL);
855         if ((fp = g_fopen(path, "rb")) == NULL) {
856                 if (ENOENT != errno) FILE_OP_ERROR(path, "fopen");
857                 g_free(path);
858                 return NULL;
859         }
860         g_free(path);
861         while (fgets(buf, sizeof(buf), fp) != NULL) {
862                 g_strstrip(buf);
863                 if (buf[0] == '\0') continue;
864                 tmp = add_history(tmp, buf);
865         }
866         fclose(fp);
867
868         tmp = g_list_reverse(tmp);
869
870         return tmp;
871 }
872
873 void prefs_common_read_config(void)
874 {
875         gchar *rcpath;
876         gchar *tmp;
877
878         rcpath = g_strconcat(get_rc_dir(), G_DIR_SEPARATOR_S, COMMON_RC, NULL);
879         prefs_read_config(param, "Common", rcpath, NULL);
880 #ifdef G_OS_WIN32
881         prefs_read_config(param_os_specific, "CommonWin32", rcpath, NULL);
882 #endif
883
884         g_free(rcpath);
885
886         tmp = g_strdup(gettext(prefs_common.quotefmt));
887         g_free(prefs_common.quotefmt);
888         prefs_common.quotefmt = tmp;
889
890         tmp = g_strdup(gettext(prefs_common.fw_quotefmt));
891         g_free(prefs_common.fw_quotefmt);
892         prefs_common.fw_quotefmt = tmp;
893         
894         tmp = g_strdup(gettext(prefs_common.date_format));
895         g_free(prefs_common.date_format);
896         prefs_common.date_format = tmp;
897
898         tmp = g_strdup(gettext(prefs_common.compose_body_format));
899         g_free(prefs_common.compose_body_format);
900         prefs_common.compose_body_format = tmp;
901
902         prefs_common.mime_open_cmd_history =
903                 prefs_common_read_history(COMMAND_HISTORY);
904         prefs_common.summary_quicksearch_history =
905                 prefs_common_read_history(QUICKSEARCH_HISTORY);
906         prefs_common.summary_search_from_history =
907                 prefs_common_read_history(SUMMARY_SEARCH_FROM_HISTORY);
908         prefs_common.summary_search_to_history =
909                 prefs_common_read_history(SUMMARY_SEARCH_TO_HISTORY);
910         prefs_common.summary_search_subject_history =
911                 prefs_common_read_history(SUMMARY_SEARCH_SUBJECT_HISTORY);
912         prefs_common.summary_search_body_history =
913                 prefs_common_read_history(SUMMARY_SEARCH_BODY_HISTORY);
914         prefs_common.summary_search_adv_condition_history =
915                 prefs_common_read_history(SUMMARY_SEARCH_ADV_CONDITION_HISTORY);
916         prefs_common.message_search_history =
917                 prefs_common_read_history(MESSAGE_SEARCH_HISTORY);
918
919         colorlabel_update_colortable_from_prefs();
920 }
921
922 /*
923  * Save history list to the specified history file
924  */
925 void prefs_common_save_history(const gchar *history, GList *list)
926 {
927         GList *cur;
928         FILE *fp;
929         gchar *path;
930
931         path = g_strconcat(get_rc_dir(), G_DIR_SEPARATOR_S, history,
932                            NULL);
933         if ((fp = g_fopen(path, "wb")) == NULL) {
934                 FILE_OP_ERROR(path, "fopen");
935                 g_free(path);
936                 return;
937         }
938
939         for (cur = list; cur != NULL; cur = cur->next) {
940                 fputs((gchar *)cur->data, fp);
941                 fputc('\n', fp);
942         }
943
944         fclose(fp);
945         g_free(path);
946 }
947
948 void prefs_common_write_config(void)
949 {
950         prefs_write_config(param, "Common", COMMON_RC);
951 #ifdef G_OS_WIN32
952         prefs_write_config(param_os_specific, "CommonWin32", COMMON_RC);
953 #endif
954
955         prefs_common_save_history(COMMAND_HISTORY, 
956                 prefs_common.mime_open_cmd_history);
957         prefs_common_save_history(QUICKSEARCH_HISTORY, 
958                 prefs_common.summary_quicksearch_history);
959         prefs_common_save_history(SUMMARY_SEARCH_FROM_HISTORY, 
960                 prefs_common.summary_search_from_history);
961         prefs_common_save_history(SUMMARY_SEARCH_TO_HISTORY, 
962                 prefs_common.summary_search_to_history);
963         prefs_common_save_history(SUMMARY_SEARCH_SUBJECT_HISTORY, 
964                 prefs_common.summary_search_subject_history);
965         prefs_common_save_history(SUMMARY_SEARCH_BODY_HISTORY, 
966                 prefs_common.summary_search_body_history);
967         prefs_common_save_history(SUMMARY_SEARCH_ADV_CONDITION_HISTORY, 
968                 prefs_common.summary_search_adv_condition_history);
969         prefs_common_save_history(MESSAGE_SEARCH_HISTORY, 
970                 prefs_common.message_search_history);
971 }
972
973 /* make a copy of string 'in' into buffer 'out'. un-escape \ sequences.
974    both 'in' and 'out' must be non-NULL.
975    'out' must be a pointer to a buffer whose size is at least equal
976    to strlen(txt)+1, this buffer will get cleared. out's contents
977    will always get set to a valid string, even if it's "".*/
978 void pref_get_unescaped_pref(gchar *out, const gchar *in)
979 {
980         const gchar *i;
981         gchar *o;
982
983         *out = '\0';
984
985         g_return_if_fail( in != NULL );
986         g_return_if_fail( out != NULL );
987
988         i = in;
989         o = out;
990         memset(out, 0, strlen(in)+1);
991         while (*i != '\0') {
992                 if (*i == '\\' && *(i+1) == 'n') {
993                         *o++ = '\n';
994                         i++;
995                 } else if (*i == '\\' && *(i+1) == 't') {
996                         *o++ = '\t';
997                         i++;
998                 } else if (*i == '\\' && *(i+1) == '\\') {
999                         *o++ = '\\';
1000                         i++;
1001                 } else {
1002                         *o++ = *i;
1003                 }
1004                 i++;
1005         }
1006         *o='\0';
1007 }
1008
1009 /* make a copy of string 'in' into buffer 'out'. escape \ sequences.
1010    both 'in' and 'out' must be non-NULL.
1011    'out' must be a pointer to a buffer whose size is at least equal
1012    to 2*strlen(txt)+1. out's contents will always get set to a valid
1013    string, even if it's "". */
1014 void pref_get_escaped_pref(gchar *out, const gchar *in)
1015 {
1016         const gchar *i;
1017         gchar *o;
1018
1019         *out = '\0';
1020
1021         g_return_if_fail( in != NULL );
1022         g_return_if_fail( out != NULL );
1023
1024         i = in;
1025         o = out;
1026         while (*i != '\0') {
1027                 if (*i == '\n') {
1028                         *o++ = '\\';
1029                         *o++ = 'n';
1030                 } else if (*i == '\t') {
1031                         *o++ = '\\';
1032                         *o++ = 't';
1033                 } else if (*i == '\\') {
1034                         *o++ = '\\';
1035                         *o++ = '\\';
1036                 } else {
1037                         *o++ = *i;
1038                 }
1039                 i++;
1040         }
1041         *o = '\0';
1042 }
1043                 
1044 /* set the contents of a textview widget from the internal \-escaped
1045   representation of a pref string. both txt and textview must be non-NULL. */
1046 void pref_set_textview_from_pref(GtkTextView *textview, const gchar *txt)
1047 {
1048         GtkTextBuffer *buffer;
1049         gchar *out = NULL;
1050
1051         g_return_if_fail( txt != NULL );
1052         g_return_if_fail( textview != NULL );
1053
1054         buffer = gtk_text_view_get_buffer(textview);
1055         out = malloc(strlen(txt)+1);
1056
1057         pref_get_unescaped_pref(out, txt);
1058
1059         gtk_text_buffer_set_text(buffer, out?out:"", -1);
1060         g_free(out);
1061 }
1062
1063 /* set the contents of a gtkentry widget from the internal \-escaped
1064   representation of a pref string. both txt and entry must be non-NULL. */
1065 void pref_set_entry_from_pref(GtkEntry *entry, const gchar *txt)
1066 {
1067         gchar *out = NULL;
1068
1069         g_return_if_fail( txt != NULL );
1070         g_return_if_fail( entry != NULL );
1071
1072         out = malloc(strlen(txt)+1);
1073
1074         pref_get_unescaped_pref(out, txt);
1075
1076         gtk_entry_set_text(entry, out?out:"");
1077         g_free(out);
1078 }
1079
1080 /* get the \-escaped internal representation of a pref from the contents of
1081    a textview widget. textview must be non-NULL. */
1082 gchar *pref_get_pref_from_textview(GtkTextView *textview) 
1083 {
1084         GtkTextBuffer *buffer;
1085         GtkTextIter start, end;
1086         gchar *out, *tmp;
1087         
1088         g_return_val_if_fail( textview != NULL, "" );
1089
1090         buffer = gtk_text_view_get_buffer(textview);
1091         gtk_text_buffer_get_start_iter(buffer, &start);
1092         gtk_text_buffer_get_iter_at_offset(buffer, &end, -1);
1093         tmp = gtk_text_buffer_get_text(buffer, &start, &end, FALSE);
1094         out = malloc(2*strlen(tmp)+1);
1095         
1096         pref_get_escaped_pref(out, tmp);
1097         g_free(tmp);
1098
1099         return out?out:"";
1100 }
1101
1102 /* get the \-escaped internal representation of a pref from the contents of
1103    a gtkentry widget. entry must be non-NULL. */
1104 gchar *pref_get_pref_from_entry(GtkEntry *entry) 
1105 {
1106         gchar *out, *tmp;
1107
1108         g_return_val_if_fail( entry != NULL, "" );
1109
1110         tmp = gtk_editable_get_chars(GTK_EDITABLE(entry), 0, -1);
1111         out = malloc(2*strlen(tmp)+1);
1112
1113         pref_get_escaped_pref(out, tmp);
1114         g_free(tmp);
1115
1116         return out?out:"";
1117 }
1118
1119 /* ugly hack to be able to get this pref from ssl_certificate.c */
1120 gboolean prefs_common_unsafe_ssl_certs(void)
1121 {
1122         return prefs_common.unsafe_ssl_certs;
1123 }