2006-05-19 [wwp] 2.2.0cvs37
[claws.git] / src / prefs_common.c
1 /*
2  * Sylpheed -- a GTK+ based, lightweight, and fast e-mail client
3  * Copyright (C) 1999-2006 Hiroyuki Yamamoto and the Sylpheed-Claws 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         {"small_font_gtk2",     "Sans 9",
99           &prefs_common.smallfont,              P_STRING, NULL, NULL, NULL},
100         {"normal_font_gtk2",    "Sans 9",
101           &prefs_common.normalfont,             P_STRING, NULL, NULL, NULL},
102
103         /* Message */
104         {"attach_save_directory", NULL,
105          &prefs_common.attach_save_dir, P_STRING, NULL, NULL, NULL},
106         {"attach_load_directory", NULL,
107          &prefs_common.attach_load_dir, P_STRING, NULL, NULL, NULL},
108
109         /* MIME viewer */
110         {"mime_image_viewer", NULL,
111          &prefs_common.mime_image_viewer, P_STRING, NULL, NULL, NULL},
112         {"mime_audio_player", NULL,
113          &prefs_common.mime_audio_player, 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         {"no_receive_error_panel", "FALSE", &prefs_common.no_recv_err_panel,
168          P_BOOL, NULL, NULL, NULL},
169         {"close_receive_dialog", "TRUE", &prefs_common.close_recv_dialog,
170          P_BOOL, NULL, NULL, NULL},
171  
172         /* Send */
173         {"save_message", "TRUE", &prefs_common.savemsg, P_BOOL,
174          NULL, NULL, NULL},
175         {"confirm_send_queued_messages", "FALSE", &prefs_common.confirm_send_queued_messages,
176          P_BOOL, NULL, NULL, NULL},
177         {"send_dialog_mode", "0", &prefs_common.send_dialog_mode, P_ENUM,
178          NULL, NULL, NULL},
179
180         {"outgoing_charset", CS_AUTO, &prefs_common.outgoing_charset, P_STRING,
181          NULL, NULL, NULL},
182         {"encoding_method", "0", &prefs_common.encoding_method, P_ENUM,
183          NULL, NULL, NULL},
184
185         {"allow_jisx0201_kana", "FALSE", &prefs_common.allow_jisx0201_kana,
186          P_BOOL, NULL, NULL, NULL},
187
188         /* Compose */
189         {"auto_ext_editor", "FALSE", &prefs_common.auto_exteditor, P_BOOL,
190          NULL, NULL, NULL},
191         {"forward_as_attachment", "FALSE", &prefs_common.forward_as_attachment,
192          P_BOOL, NULL, NULL, NULL},
193         {"redirect_keep_from", "FALSE",
194          &prefs_common.redirect_keep_from, P_BOOL,
195          NULL, NULL, NULL},
196         {"undo_level", "50", &prefs_common.undolevels, P_INT,
197          NULL, NULL, NULL},
198
199         {"linewrap_length", "72", &prefs_common.linewrap_len, P_INT,
200          NULL, NULL, NULL},
201         {"linewrap_quotation", "TRUE", &prefs_common.linewrap_quote, P_BOOL,
202          NULL, NULL, NULL},
203         {"linewrap_pastes", "TRUE", &prefs_common.linewrap_pastes, P_BOOL,
204          NULL, NULL, NULL},
205         {"linewrap_auto", "TRUE", &prefs_common.autowrap, P_BOOL,
206          NULL, NULL, NULL},
207         {"autosave", "TRUE", &prefs_common.autosave,
208          P_BOOL, NULL, NULL, NULL},
209         {"autosave_length", "50", &prefs_common.autosave_length, P_INT,
210          NULL, NULL, NULL},
211 #if USE_ASPELL
212         {"enable_aspell", "TRUE", &prefs_common.enable_aspell, P_BOOL,
213          NULL, NULL, NULL},
214         {"aspell_path", ASPELL_PATH, &prefs_common.aspell_path, P_STRING,
215          NULL, NULL, NULL},
216         {"dictionary",  "", &prefs_common.dictionary, P_STRING,
217          NULL, NULL, NULL},
218         {"aspell_sugmode", "1", &prefs_common.aspell_sugmode, P_INT,
219          NULL, NULL, NULL},
220         {"use_alternate_dict", "FALSE", &prefs_common.use_alternate, P_BOOL,
221          NULL, NULL, NULL},
222         {"check_while_typing", "TRUE", &prefs_common.check_while_typing, P_BOOL,
223          NULL, NULL, NULL},
224         {"recheck_when_changing_dict", "TRUE", &prefs_common.recheck_when_changing_dict,
225          P_BOOL, NULL, NULL, NULL},
226         {"misspelled_color", "16711680", &prefs_common.misspelled_col, P_COLOR,
227          NULL, NULL, NULL},
228 #endif
229         {"reply_with_quote", "TRUE", &prefs_common.reply_with_quote, P_BOOL,
230          NULL, NULL, NULL},
231
232         /* Account autoselection */
233         {"reply_account_autoselect", "TRUE",
234          &prefs_common.reply_account_autosel, P_BOOL,
235          NULL, NULL, NULL},
236         {"forward_account_autoselect", "TRUE",
237          &prefs_common.forward_account_autosel, P_BOOL,
238          NULL, NULL, NULL},
239         {"reedit_account_autoselect", "TRUE",
240          &prefs_common.reedit_account_autosel, P_BOOL,
241          NULL, NULL, NULL},
242
243         {"default_reply_list", "TRUE", &prefs_common.default_reply_list, P_BOOL,
244          NULL, NULL, NULL},
245
246         {"show_ruler", "TRUE", &prefs_common.show_ruler, P_BOOL,
247          NULL, NULL, NULL},
248
249         /* Quote */
250         {"reply_quote_mark", "> ", &prefs_common.quotemark, P_STRING,
251          NULL, NULL, NULL},
252         {"reply_quote_format", N_("On %d\\n%f wrote:\\n\\n%q"),
253          &prefs_common.quotefmt, P_STRING, NULL, NULL, NULL},
254
255         {"forward_quote_mark", "> ", &prefs_common.fw_quotemark, P_STRING,
256          NULL, NULL, NULL},
257         {"forward_quote_format",
258          N_("\\n\\nBegin forwarded message:\\n\\n"
259          "?d{Date: %d\\n}?f{From: %f\\n}?t{To: %t\\n}?c{Cc: %c\\n}"
260          "?n{Newsgroups: %n\\n}?s{Subject: %s\\n}\\n\\n%M"),
261          &prefs_common.fw_quotefmt, P_STRING, NULL, NULL, NULL},
262         {"quote_chars", ">", &prefs_common.quote_chars, P_STRING,
263          NULL, NULL, NULL},
264
265         /* Display */
266         /* Obsolete fonts. For coexisting with Gtk+-1.2 version */
267         {"widget_font",         NULL,
268           &prefs_common.widgetfont_gtk1,        P_STRING, NULL, NULL, NULL},
269         {"message_font",        "-misc-fixed-medium-r-normal--14-*-*-*-*-*-*-*",
270          &prefs_common.textfont_gtk1,           P_STRING, NULL, NULL, NULL},
271         {"small_font",          "-*-helvetica-medium-r-normal--10-*-*-*-*-*-*-*",
272           &prefs_common.smallfont_gtk1,         P_STRING, NULL, NULL, NULL},
273         {"bold_font",           "-*-helvetica-bold-r-normal--12-*-*-*-*-*-*-*",
274           &prefs_common.boldfont_gtk1,          P_STRING, NULL, NULL, NULL},
275         {"normal_font",         "-*-helvetica-medium-r-normal--12-*-*-*-*-*-*-*",
276           &prefs_common.normalfont_gtk1,        P_STRING, NULL, NULL, NULL},
277
278         /* new fonts */
279         {"widget_font_gtk2",    NULL,
280           &SPECIFIC_PREFS.widgetfont,           P_STRING, NULL, NULL, NULL},
281         {"message_font_gtk2",   "Monospace 9",
282          &SPECIFIC_PREFS.textfont,                      P_STRING, NULL, NULL, NULL},
283         {"small_font_gtk2",     "Sans 9",
284           &SPECIFIC_PREFS.smallfont,            P_STRING, NULL, NULL, NULL},
285         {"normal_font_gtk2",    "Sans 9",
286           &SPECIFIC_PREFS.normalfont,           P_STRING, NULL, NULL, NULL},
287
288         /* custom colors */
289         {"custom_color1", "#ff9900", &prefs_common.custom_colorlabel[0].color, P_COLOR,
290          NULL, NULL, NULL},
291         {"custom_colorlabel1", N_("Orange"), &prefs_common.custom_colorlabel[0].label, P_STRING,
292          NULL, NULL, NULL},
293         {"custom_color2", "#ff0000", &prefs_common.custom_colorlabel[1].color, P_COLOR,
294          NULL, NULL, NULL},
295         {"custom_colorlabel2", N_("Red"), &prefs_common.custom_colorlabel[1].label, P_STRING,
296          NULL, NULL, NULL},
297         {"custom_color3", "#ff66ff", &prefs_common.custom_colorlabel[2].color, P_COLOR,
298          NULL, NULL, NULL},
299         {"custom_colorlabel3", N_("Pink"), &prefs_common.custom_colorlabel[2].label, P_STRING,
300          NULL, NULL, NULL},
301         {"custom_color4", "#00ccff", &prefs_common.custom_colorlabel[3].color, P_COLOR,
302          NULL, NULL, NULL},
303         {"custom_colorlabel4", N_("Sky blue"), &prefs_common.custom_colorlabel[3].label, P_STRING,
304          NULL, NULL, NULL},
305         {"custom_color5", "#0000ff", &prefs_common.custom_colorlabel[4].color, P_COLOR,
306          NULL, NULL, NULL},
307         {"custom_colorlabel5", N_("Blue"), &prefs_common.custom_colorlabel[4].label, P_STRING,
308          NULL, NULL, NULL},
309         {"custom_color6", "#009900", &prefs_common.custom_colorlabel[5].color, P_COLOR,
310          NULL, NULL, NULL},
311         {"custom_colorlabel6", N_("Green"), &prefs_common.custom_colorlabel[5].label, P_STRING,
312          NULL, NULL, NULL},
313         {"custom_color7", "#663366", &prefs_common.custom_colorlabel[6].color, P_COLOR,
314          NULL, NULL, NULL},
315         {"custom_colorlabel7", N_("Brown"), &prefs_common.custom_colorlabel[6].label, P_STRING,
316          NULL, NULL, NULL},
317
318         /* image viewer */
319         {"display_image", "TRUE", &prefs_common.display_img, P_BOOL,
320          NULL, NULL, NULL},
321         {"resize_image", "TRUE", &prefs_common.resize_img, P_BOOL,
322          NULL, NULL, NULL},
323         {"inline_image", "TRUE", &prefs_common.inline_img, P_BOOL,
324          NULL, NULL, NULL},
325
326         {"display_folder_unread_num", "FALSE",
327          &prefs_common.display_folder_unread, P_BOOL,
328          NULL, NULL, NULL},
329         {"newsgroup_abbrev_len", "16",
330          &prefs_common.ng_abbrev_len, P_INT,
331          NULL, NULL, NULL},
332
333         {"translate_header", "FALSE", &prefs_common.trans_hdr, P_BOOL,
334          NULL, NULL, NULL},
335
336         /* Display: Summary View */
337         {"use_address_book", "FALSE", &prefs_common.use_addr_book, P_BOOL,
338          NULL, NULL, NULL},
339         {"thread_by_subject", "TRUE", &prefs_common.thread_by_subject, P_BOOL,
340          NULL, NULL, NULL},
341         {"date_format", N_("%y/%m/%d(%a) %H:%M"), &prefs_common.date_format,
342          P_STRING, NULL, NULL, NULL},
343
344         {"bold_unread", "TRUE", &prefs_common.bold_unread, P_BOOL,
345          NULL, NULL, NULL},
346
347         {"enable_thread", "TRUE", &prefs_common.enable_thread, P_BOOL,
348          NULL, NULL, NULL},
349         {"toolbar_style", "3", &prefs_common.toolbar_style, P_ENUM,
350          NULL, NULL, NULL},
351         {"toolbar_detachable", "FALSE", &prefs_common.toolbar_detachable, P_BOOL,
352          NULL, NULL, NULL},
353         {"show_statusbar", "TRUE", &prefs_common.show_statusbar, P_BOOL,
354          NULL, NULL, NULL},
355         {"show_searchbar", "TRUE", &prefs_common.show_searchbar, P_BOOL,
356          NULL, NULL, NULL},
357
358
359         {"summary_col_show_mark", "TRUE",
360          &prefs_common.summary_col_visible[S_COL_MARK], P_BOOL, NULL, NULL, NULL},
361         {"summary_col_show_unread", "TRUE",
362          &prefs_common.summary_col_visible[S_COL_STATUS], P_BOOL, NULL, NULL, NULL},
363         {"summary_col_show_mime", "TRUE",
364          &prefs_common.summary_col_visible[S_COL_MIME], P_BOOL, NULL, NULL, NULL},
365         {"summary_col_show_subject", "TRUE",
366          &prefs_common.summary_col_visible[S_COL_SUBJECT], P_BOOL, NULL, NULL, NULL},
367         {"summary_col_show_from", "TRUE",
368          &prefs_common.summary_col_visible[S_COL_FROM], P_BOOL, NULL, NULL, NULL},
369         {"summary_col_show_to", "FALSE",
370          &prefs_common.summary_col_visible[S_COL_TO], P_BOOL, NULL, NULL, NULL},
371         {"summary_col_show_date", "TRUE",
372          &prefs_common.summary_col_visible[S_COL_DATE], P_BOOL, NULL, NULL, NULL},
373         {"summary_col_show_size", "TRUE",
374          &prefs_common.summary_col_visible[S_COL_SIZE], P_BOOL, NULL, NULL, NULL},
375         {"summary_col_show_number", "FALSE",
376          &prefs_common.summary_col_visible[S_COL_NUMBER], P_BOOL, NULL, NULL, NULL},
377         {"summary_col_show_score", "FALSE",
378          &prefs_common.summary_col_visible[S_COL_SCORE], P_BOOL, NULL, NULL, NULL},
379         {"summary_col_show_locked", "FALSE",
380          &prefs_common.summary_col_visible[S_COL_LOCKED], P_BOOL, NULL, NULL, NULL},
381
382         {"summary_col_pos_mark", "0",
383           &prefs_common.summary_col_pos[S_COL_MARK], P_INT, NULL, NULL, NULL},
384         {"summary_col_pos_unread", "1",
385           &prefs_common.summary_col_pos[S_COL_STATUS], P_INT, NULL, NULL, NULL},
386         {"summary_col_pos_mime", "2",
387           &prefs_common.summary_col_pos[S_COL_MIME], P_INT, NULL, NULL, NULL},
388         {"summary_col_pos_subject", "3",
389           &prefs_common.summary_col_pos[S_COL_SUBJECT], P_INT, NULL, NULL, NULL},
390         {"summary_col_pos_from", "4",
391           &prefs_common.summary_col_pos[S_COL_FROM], P_INT, NULL, NULL, NULL},
392         {"summary_col_pos_date", "5",
393           &prefs_common.summary_col_pos[S_COL_DATE], P_INT, NULL, NULL, NULL},
394         {"summary_col_pos_size", "6",
395           &prefs_common.summary_col_pos[S_COL_SIZE], P_INT, NULL, NULL, NULL},
396         {"summary_col_pos_number", "7",
397           &prefs_common.summary_col_pos[S_COL_NUMBER], P_INT, NULL, NULL, NULL},
398         {"summary_col_pos_score", "8",
399          &prefs_common.summary_col_pos[S_COL_SCORE], P_INT, NULL, NULL, NULL},
400         {"summary_col_pos_locked", "9",
401          &prefs_common.summary_col_pos[S_COL_LOCKED], P_INT, NULL, NULL, NULL},
402         {"summary_col_pos_to", "10",
403           &prefs_common.summary_col_pos[S_COL_TO], P_INT, NULL, NULL, NULL},
404
405         {"summary_col_size_mark", "10",
406          &prefs_common.summary_col_size[S_COL_MARK], P_INT, NULL, NULL, NULL},
407         {"summary_col_size_unread", "13",
408          &prefs_common.summary_col_size[S_COL_STATUS], P_INT, NULL, NULL, NULL},
409         {"summary_col_size_mime", "10",
410          &prefs_common.summary_col_size[S_COL_MIME], P_INT, NULL, NULL, NULL},
411         {"summary_col_size_subject", "200",
412          &prefs_common.summary_col_size[S_COL_SUBJECT], P_INT, NULL, NULL, NULL},
413         {"summary_col_size_from", "120",
414          &prefs_common.summary_col_size[S_COL_FROM], P_INT, NULL, NULL, NULL},
415         {"summary_col_size_to", "120",
416          &prefs_common.summary_col_size[S_COL_TO], P_INT, NULL, NULL, NULL},
417         {"summary_col_size_date", "118",
418          &prefs_common.summary_col_size[S_COL_DATE], P_INT, NULL, NULL, NULL},
419         {"summary_col_size_size", "45",
420          &prefs_common.summary_col_size[S_COL_SIZE], P_INT, NULL, NULL, NULL},
421         {"summary_col_size_number", "40",
422          &prefs_common.summary_col_size[S_COL_NUMBER], P_INT, NULL, NULL, NULL},
423         {"summary_col_size_score", "40",
424          &prefs_common.summary_col_size[S_COL_SCORE], P_INT, NULL, NULL, NULL},
425         {"summary_col_size_locked", "13",
426          &prefs_common.summary_col_size[S_COL_LOCKED], P_INT, NULL, NULL, NULL},
427
428         /* Widget size */
429         {"folderwin_x", "16", &prefs_common.folderwin_x, P_INT,
430          NULL, NULL, NULL},
431         {"folderwin_y", "16", &prefs_common.folderwin_y, P_INT,
432          NULL, NULL, NULL},
433         {"folderview_width", "270", &prefs_common.folderview_width, P_INT,
434          NULL, NULL, NULL},
435         {"folderview_height", "450", &prefs_common.folderview_height, P_INT,
436          NULL, NULL, NULL},
437         {"folderview_visible", "TRUE", &prefs_common.folderview_visible, P_BOOL,
438          NULL, NULL, NULL},
439
440         {"folder_col_show_folder", "TRUE",
441          &prefs_common.folder_col_visible[F_COL_FOLDER], P_BOOL, NULL, NULL, NULL},
442         {"folder_col_show_new", "TRUE",
443          &prefs_common.folder_col_visible[F_COL_NEW], P_BOOL, NULL, NULL, NULL},
444         {"folder_col_show_unread", "TRUE",
445          &prefs_common.folder_col_visible[F_COL_UNREAD], P_BOOL, NULL, NULL, NULL},
446         {"folder_col_show_total", "TRUE",
447          &prefs_common.folder_col_visible[F_COL_TOTAL], P_BOOL, NULL, NULL, NULL},
448
449         {"folder_col_pos_folder", "0",
450          &prefs_common.folder_col_pos[F_COL_FOLDER], P_INT, NULL, NULL, NULL},
451         {"folder_col_pos_new", "1",
452          &prefs_common.folder_col_pos[F_COL_NEW], P_INT, NULL, NULL, NULL},
453         {"folder_col_pos_unread", "2",
454          &prefs_common.folder_col_pos[F_COL_UNREAD], P_INT, NULL, NULL, NULL},
455         {"folder_col_pos_total", "3",
456          &prefs_common.folder_col_pos[F_COL_TOTAL], P_INT, NULL, NULL, NULL},
457
458         {"folder_col_size_folder", "120",
459          &prefs_common.folder_col_size[F_COL_FOLDER], P_INT, NULL, NULL, NULL},
460         {"folder_col_size_new", "32",
461          &prefs_common.folder_col_size[F_COL_NEW], P_INT, NULL, NULL, NULL},
462         {"folder_col_size_unread", "32",
463          &prefs_common.folder_col_size[F_COL_UNREAD], P_INT, NULL, NULL, NULL},
464         {"folder_col_size_total", "32",
465          &prefs_common.folder_col_size[F_COL_TOTAL], P_INT, NULL, NULL, NULL},
466
467         {"summaryview_width", "500", &prefs_common.summaryview_width, P_INT,
468          NULL, NULL, NULL},
469         {"summaryview_height", "244", &prefs_common.summaryview_height, P_INT,
470          NULL, NULL, NULL},
471
472         {"main_messagewin_x", "256", &prefs_common.main_msgwin_x, P_INT,
473          NULL, NULL, NULL},
474         {"main_messagewin_y", "210", &prefs_common.main_msgwin_y, P_INT,
475          NULL, NULL, NULL},
476         {"messageview_width", "500", &prefs_common.msgview_width, P_INT,
477          NULL, NULL, NULL},
478         {"messageview_height", "213", &prefs_common.msgview_height, P_INT,
479          NULL, NULL, NULL},
480         {"messageview_visible", "TRUE", &prefs_common.msgview_visible, P_BOOL,
481          NULL, NULL, NULL},
482
483         {"mainview_x", "64", &prefs_common.mainview_x, P_INT,
484          NULL, NULL, NULL},
485         {"mainview_y", "64", &prefs_common.mainview_y, P_INT,
486          NULL, NULL, NULL},
487         {"mainview_width", "500", &prefs_common.mainview_width, P_INT,
488          NULL, NULL, NULL},
489         {"mainview_height", "400", &prefs_common.mainview_height, P_INT,
490          NULL, NULL, NULL},
491         {"mainwin_x", "64", &prefs_common.mainwin_x, P_INT,
492          NULL, NULL, NULL},
493         {"mainwin_y", "64", &prefs_common.mainwin_y, P_INT,
494          NULL, NULL, NULL},
495         {"mainwin_width", "800", &prefs_common.mainwin_width, P_INT,
496          NULL, NULL, NULL},
497         {"mainwin_height", "600", &prefs_common.mainwin_height, P_INT,
498          NULL, NULL, NULL},
499         {"messagewin_width", "600", &prefs_common.msgwin_width, P_INT,
500          NULL, NULL, NULL},
501         {"messagewin_height", "540", &prefs_common.msgwin_height, P_INT,
502          NULL, NULL, NULL},
503         {"sourcewin_width", "600", &prefs_common.sourcewin_width, P_INT,
504          NULL, NULL, NULL},
505         {"sourcewin_height", "500", &prefs_common.sourcewin_height, P_INT,
506          NULL, NULL, NULL},
507         {"compose_width", "600", &prefs_common.compose_width, P_INT,
508          NULL, NULL, NULL},
509         {"compose_height", "560", &prefs_common.compose_height, P_INT,
510          NULL, NULL, NULL},
511         {"compose_x", "0", &prefs_common.compose_x, P_INT,
512          NULL, NULL, NULL},
513         {"compose_y", "0", &prefs_common.compose_y, P_INT,
514          NULL, NULL, NULL},
515         /* Message */
516         {"enable_color", "TRUE", &prefs_common.enable_color, P_BOOL,
517          NULL, NULL, NULL},
518
519         {"quote_level1_color", "179", &prefs_common.quote_level1_col, P_COLOR,
520          NULL, NULL, NULL},
521         {"quote_level2_color", "179", &prefs_common.quote_level2_col, P_COLOR,
522          NULL, NULL, NULL},
523         {"quote_level3_color", "179", &prefs_common.quote_level3_col, P_COLOR,
524          NULL, NULL, NULL},
525         {"enable_bgcolor", "FALSE", &prefs_common.enable_bgcolor, P_BOOL,
526          NULL, NULL, NULL},
527         {"quote_level1_bgcolor", "13421772", &prefs_common.quote_level1_bgcol, P_COLOR,
528          NULL, NULL, NULL},
529         {"quote_level2_bgcolor", "13948116", &prefs_common.quote_level2_bgcol, P_COLOR,
530          NULL, NULL, NULL},
531         {"quote_level3_bgcolor", "14540253", &prefs_common.quote_level3_bgcol, P_COLOR,
532          NULL, NULL, NULL},
533         {"uri_color", "32512", &prefs_common.uri_col, P_COLOR,
534          NULL, NULL, NULL},
535         {"target_folder_color", "14294218", &prefs_common.tgt_folder_col, P_COLOR,
536          NULL, NULL, NULL},
537         {"signature_color", "7960953", &prefs_common.signature_col, P_COLOR,
538          NULL, NULL, NULL},
539         {"recycle_quote_colors", "FALSE", &prefs_common.recycle_quote_colors,
540          P_BOOL, NULL, NULL, NULL},
541
542         {"display_header_pane", "FALSE", &prefs_common.display_header_pane,
543          P_BOOL, NULL, NULL, NULL},
544         {"display_header", "TRUE", &prefs_common.display_header, P_BOOL,
545          NULL, NULL, NULL},
546         {"display_xface", "TRUE", &prefs_common.display_xface,
547          P_BOOL, NULL, NULL, NULL},
548         {"render_html", "TRUE", &prefs_common.render_html, P_BOOL,
549          NULL, NULL, NULL},
550         {"invoke_plugin_on_html", "FALSE", &prefs_common.invoke_plugin_on_html, P_BOOL,
551          NULL, NULL, NULL},
552         {"line_space", "2", &prefs_common.line_space, P_INT,
553          NULL, NULL, NULL},
554
555         {"enable_smooth_scroll", "FALSE",
556          &prefs_common.enable_smooth_scroll, P_BOOL,
557          NULL, NULL, NULL},
558         {"scroll_step", "1", &prefs_common.scroll_step, P_INT,
559          NULL, NULL, NULL},
560         {"scroll_half_page", "FALSE", &prefs_common.scroll_halfpage, P_BOOL,
561          NULL, NULL, NULL},
562
563         {"show_other_header", "FALSE", &prefs_common.show_other_header, P_BOOL,
564          NULL, NULL, NULL},
565
566         {"attach_desc", "TRUE", &prefs_common.attach_desc, P_BOOL,
567          NULL, NULL, NULL},
568         {"attach_save_directory", NULL,
569          &SPECIFIC_PREFS.attach_save_dir, P_STRING, NULL, NULL, NULL},
570         {"attach_load_directory", NULL,
571          &SPECIFIC_PREFS.attach_load_dir, P_STRING, NULL, NULL, NULL},
572
573         /* MIME viewer */
574         {"mime_image_viewer", DEFAULT_IMAGE_VIEWER_CMD,
575          &SPECIFIC_PREFS.mime_image_viewer,     P_STRING, NULL, NULL, NULL},
576         {"mime_audio_player", DEFAULT_AUDIO_PLAYER_CMD,
577          &SPECIFIC_PREFS.mime_audio_player, P_STRING, NULL, NULL, NULL},
578         {"mime_open_command", "gedit '%s'",
579          &SPECIFIC_PREFS.mime_open_cmd, P_STRING, NULL, NULL, NULL},
580
581         /* Interface */
582         {"separate_folder", "FALSE", &prefs_common.sep_folder, P_BOOL,
583          NULL, NULL, NULL},
584         {"separate_message", "FALSE", &prefs_common.sep_msg, P_BOOL,
585          NULL, NULL, NULL},
586
587         /* {"emulate_emacs", "FALSE", &prefs_common.emulate_emacs, P_BOOL,
588          NULL, NULL, NULL}, */
589         {"always_show_message_when_selected", "FALSE",
590          &prefs_common.always_show_msg,
591          P_BOOL, NULL, NULL, NULL},
592         {"select_on_entry", "2", &prefs_common.select_on_entry,
593          P_ENUM, NULL, NULL, NULL},
594         {"mark_as_read_on_new_window", "FALSE",
595          &prefs_common.mark_as_read_on_new_window,
596          P_BOOL, NULL, NULL, NULL},
597         {"mark_as_read_delay", "0",
598          &prefs_common.mark_as_read_delay, P_INT, 
599          NULL, NULL, NULL},
600         {"immediate_execution", "TRUE", &prefs_common.immediate_exec, P_BOOL,
601          NULL, NULL, NULL},
602         {"nextunreadmsg_dialog", "1", &prefs_common.next_unread_msg_dialog, P_ENUM,
603          NULL, NULL, NULL},
604
605         {"pixmap_theme_path", DEFAULT_PIXMAP_THEME, 
606          &SPECIFIC_PREFS.pixmap_theme_path, P_STRING,
607          NULL, NULL, NULL},
608
609         {"ask_mark_all_read", "TRUE", &prefs_common.ask_mark_all_read, P_BOOL,
610          NULL, NULL, NULL},
611
612         /* Other */
613         {"uri_open_command", DEFAULT_BROWSER_CMD,
614          &SPECIFIC_PREFS.uri_cmd, P_STRING, NULL, NULL, NULL},
615         {"print_command", "lpr %s",
616          &SPECIFIC_PREFS.print_cmd, P_STRING, NULL, NULL, NULL},
617         {"ext_editor_command", DEFAULT_EDITOR_CMD,
618          &SPECIFIC_PREFS.ext_editor_cmd, P_STRING, NULL, NULL, NULL},
619
620         {"add_address_by_click", "FALSE", &prefs_common.add_address_by_click,
621          P_BOOL, NULL, NULL, NULL},
622         {"confirm_on_exit", "FALSE", &prefs_common.confirm_on_exit, P_BOOL,
623          NULL, NULL, NULL},
624         {"clean_trash_on_exit", "FALSE", &prefs_common.clean_on_exit, P_BOOL,
625          NULL, NULL, NULL},
626         {"ask_on_cleaning", "TRUE", &prefs_common.ask_on_clean, P_BOOL,
627          NULL, NULL, NULL},
628         {"warn_queued_on_exit", "TRUE", &prefs_common.warn_queued_on_exit,
629          P_BOOL, NULL, NULL, NULL},
630         {"work_offline", "FALSE", &prefs_common.work_offline, P_BOOL,
631          NULL, NULL, NULL},
632         {"summary_quicksearch_type", "0", &prefs_common.summary_quicksearch_type, P_INT,
633          NULL, NULL, NULL},
634         {"summary_quicksearch_recurse", "1", &prefs_common.summary_quicksearch_recurse, P_INT,
635          NULL, NULL, NULL},
636
637         {"io_timeout_secs", "60", &prefs_common.io_timeout_secs,
638          P_INT, NULL, NULL, NULL},
639         {"hide_score", "-9999", &prefs_common.kill_score, P_INT,
640          NULL, NULL, NULL},
641         {"important_score", "1", &prefs_common.important_score, P_INT,
642          NULL, NULL, NULL},
643         {"clip_log", "TRUE", &prefs_common.cliplog, P_BOOL,
644          NULL, NULL, NULL},
645         {"log_length", "500", &prefs_common.loglength, P_INT,
646          NULL, NULL, NULL},
647         {"log_msg_color", "#00af00", &prefs_common.log_msg_color, P_COLOR,
648          NULL, NULL, NULL},
649         {"log_warn_color", "#af0000", &prefs_common.log_warn_color, P_COLOR,
650          NULL, NULL, NULL},
651         {"log_error_color", "#af0000", &prefs_common.log_error_color, P_COLOR,
652          NULL, NULL, NULL},
653         {"log_in_color", "#000000", &prefs_common.log_in_color, P_COLOR,
654          NULL, NULL, NULL},
655         {"log_out_color", "#0000ef", &prefs_common.log_out_color, P_COLOR,
656          NULL, NULL, NULL},
657
658         {"color_new", "179", &prefs_common.color_new, P_COLOR,
659          NULL, NULL, NULL},
660
661         /* Some windows' sizes */
662         {"filteringwin_width", "500", &prefs_common.filteringwin_width, P_INT,
663          NULL, NULL, NULL},
664         {"filteringwin_height", "-1", &prefs_common.filteringwin_height, P_INT,
665          NULL, NULL, NULL},
666
667         {"filteringactionwin_width", "490", &prefs_common.filteringactionwin_width, P_INT,
668          NULL, NULL, NULL},
669         {"filteringactionwin_height", "-1", &prefs_common.filteringactionwin_height, P_INT,
670          NULL, NULL, NULL},
671
672         {"matcherwin_width", "520", &prefs_common.matcherwin_width, P_INT,
673          NULL, NULL, NULL},
674         {"matcherwin_height", "-1", &prefs_common.matcherwin_height, P_INT,
675          NULL, NULL, NULL},
676
677         {"templateswin_width", "440", &prefs_common.templateswin_width, P_INT,
678          NULL, NULL, NULL},
679         {"templateswin_height", "-1", &prefs_common.templateswin_height, P_INT,
680          NULL, NULL, NULL},
681
682         {"actionswin_width", "486", &prefs_common.actionswin_width, P_INT,
683          NULL, NULL, NULL},
684         {"actionswin_height", "-1", &prefs_common.actionswin_height, P_INT,
685          NULL, NULL, NULL},
686
687         {"addressbookwin_width", "520", &prefs_common.addressbookwin_width, P_INT,
688          NULL, NULL, NULL},
689         {"addressbookwin_height", "-1", &prefs_common.addressbookwin_height, P_INT,
690          NULL, NULL, NULL},
691
692         {"addressbookeditpersonwin_width", "640", &prefs_common.addressbookeditpersonwin_width, P_INT,
693          NULL, NULL, NULL},
694         {"addressbookeditpersonwin_height", "-1", &prefs_common.addressbookeditpersonwin_height, P_INT,
695          NULL, NULL, NULL},
696
697         {"pluginswin_width", "480", &prefs_common.pluginswin_width, P_INT,
698          NULL, NULL, NULL},
699         {"pluginswin_height", "-1", &prefs_common.pluginswin_height, P_INT,
700          NULL, NULL, NULL},
701
702         {"prefswin_width", "600", &prefs_common.prefswin_width, P_INT,
703          NULL, NULL, NULL},
704         {"prefswin_height", "-1", &prefs_common.prefswin_height, P_INT,
705          NULL, NULL, NULL},
706
707         {"folderitemwin_width", "500", &prefs_common.folderitemwin_width, P_INT,
708          NULL, NULL, NULL},
709         {"folderitemwin_height", "-1", &prefs_common.folderitemwin_height, P_INT,
710          NULL, NULL, NULL},
711
712         {"editaccountwin_width", "500", &prefs_common.editaccountwin_width, P_INT,
713          NULL, NULL, NULL},
714         {"editaccountwin_height", "-1", &prefs_common.editaccountwin_height, P_INT,
715          NULL, NULL, NULL},
716
717         {"accountswin_width", "500", &prefs_common.accountswin_width, P_INT,
718          NULL, NULL, NULL},
719         {"accountswin_height", "-1", &prefs_common.accountswin_height, P_INT,
720          NULL, NULL, NULL},
721
722         {"logwin_width", "520", &prefs_common.logwin_width, P_INT,
723          NULL, NULL, NULL},
724         {"logwin_height", "-1", &prefs_common.logwin_height, P_INT,
725          NULL, NULL, NULL},
726
727         {"folderselwin_width", "300", &prefs_common.folderselwin_width, P_INT,
728          NULL, NULL, NULL},
729         {"folderselwin_height", "-1", &prefs_common.folderselwin_height, P_INT,
730          NULL, NULL, NULL},
731
732         {"addressaddwin_width", "300", &prefs_common.addressaddwin_width, P_INT,
733          NULL, NULL, NULL},
734         {"addressaddwin_height", "-1", &prefs_common.addressaddwin_height, P_INT,
735          NULL, NULL, NULL},
736
737         /* Hidden */
738         {"warn_dnd", "1", &prefs_common.warn_dnd, P_INT,
739          NULL, NULL, NULL},
740         {"utf8_instead_of_locale_for_broken_mail", "0", 
741          &prefs_common.broken_are_utf8, P_INT,
742          NULL, NULL, NULL},
743         {"enable_swap_from", "FALSE", &prefs_common.swap_from, P_BOOL,
744          NULL, NULL, NULL},
745         {"enable_rules_hint", "TRUE", &prefs_common.enable_rules_hint, P_BOOL,
746          NULL, NULL, NULL},
747         {"enable_hscrollbar", "TRUE", &prefs_common.enable_hscrollbar, P_BOOL,
748          NULL, NULL, NULL},
749         {"folderview_vscrollbar_policy", "0",
750          &prefs_common.folderview_vscrollbar_policy, P_ENUM,
751          NULL, NULL, NULL},
752         {"textview_cursor_visible", "FALSE",
753          &prefs_common.textview_cursor_visible, P_BOOL,
754          NULL, NULL, NULL},
755         {"hover_timeout", "500", &prefs_common.hover_timeout, P_INT,
756          NULL, NULL, NULL},
757         {"cache_max_mem_usage", "4096", &prefs_common.cache_max_mem_usage, P_INT,
758          NULL, NULL, NULL},
759         {"cache_min_keep_time", "15", &prefs_common.cache_min_keep_time, P_INT,
760          NULL, NULL, NULL},
761         {"thread_by_subject_max_age", "10", &prefs_common.thread_by_subject_max_age,
762         P_INT, NULL, NULL, NULL },
763         {"summary_quicksearch_sticky", "1", &prefs_common.summary_quicksearch_sticky, P_INT,
764          NULL, NULL, NULL},
765         {"statusbar_update_step", "10", &prefs_common.statusbar_update_step, P_INT,
766          NULL, NULL, NULL},
767         {"compose_no_markup", "FALSE", &prefs_common.compose_no_markup, P_BOOL,
768          NULL, NULL, NULL},
769
770         {NULL, NULL, NULL, P_OTHER, NULL, NULL, NULL}
771 };
772
773 PrefsCommon *prefs_common_get(void)
774 {
775         return &prefs_common;
776 }
777
778 /*
779  * Read history list from the specified history file
780  */
781 GList *prefs_common_read_history(const gchar *history) 
782 {
783         FILE *fp;
784         gchar *path;
785         gchar buf[PREFSBUFSIZE];
786         GList *tmp = NULL;
787
788         path = g_strconcat(get_rc_dir(), G_DIR_SEPARATOR_S, history,
789                            NULL);
790         if ((fp = g_fopen(path, "rb")) == NULL) {
791                 if (ENOENT != errno) FILE_OP_ERROR(path, "fopen");
792                 g_free(path);
793                 return NULL;
794         }
795         g_free(path);
796         while (fgets(buf, sizeof(buf), fp) != NULL) {
797                 g_strstrip(buf);
798                 if (buf[0] == '\0') continue;
799                 tmp = add_history(tmp, buf);
800         }
801         fclose(fp);
802
803         tmp = g_list_reverse(tmp);
804
805         return tmp;
806 }
807
808 void prefs_common_read_config(void)
809 {
810         gchar *rcpath;
811         gchar *tmp;
812
813         rcpath = g_strconcat(get_rc_dir(), G_DIR_SEPARATOR_S, COMMON_RC, NULL);
814         prefs_read_config(param, "Common", rcpath, NULL);
815 #ifdef G_OS_WIN32
816         prefs_read_config(param_os_specific, "CommonWin32", rcpath, NULL);
817 #endif
818
819         g_free(rcpath);
820
821         tmp = g_strdup(gettext(prefs_common.quotefmt));
822         g_free(prefs_common.quotefmt);
823         prefs_common.quotefmt = tmp;
824
825         tmp = g_strdup(gettext(prefs_common.fw_quotefmt));
826         g_free(prefs_common.fw_quotefmt);
827         prefs_common.fw_quotefmt = tmp;
828         
829         tmp = g_strdup(gettext(prefs_common.date_format));
830         g_free(prefs_common.date_format);
831         prefs_common.date_format = tmp;
832
833         prefs_common.mime_open_cmd_history =
834                 prefs_common_read_history(COMMAND_HISTORY);
835         prefs_common.summary_quicksearch_history =
836                 prefs_common_read_history(QUICKSEARCH_HISTORY);
837
838         colorlabel_update_colortable_from_prefs();
839 }
840
841 /*
842  * Save history list to the specified history file
843  */
844 void prefs_common_save_history(const gchar *history, GList *list)
845 {
846         GList *cur;
847         FILE *fp;
848         gchar *path;
849
850         path = g_strconcat(get_rc_dir(), G_DIR_SEPARATOR_S, history,
851                            NULL);
852         if ((fp = g_fopen(path, "wb")) == NULL) {
853                 FILE_OP_ERROR(path, "fopen");
854                 g_free(path);
855                 return;
856         }
857
858         for (cur = list; cur != NULL; cur = cur->next) {
859                 fputs((gchar *)cur->data, fp);
860                 fputc('\n', fp);
861         }
862
863         fclose(fp);
864         g_free(path);
865 }
866
867 void prefs_common_write_config(void)
868 {
869         prefs_write_config(param, "Common", COMMON_RC);
870 #ifdef G_OS_WIN32
871         prefs_write_config(param_os_specific, "CommonWin32", COMMON_RC);
872 #endif
873
874         prefs_common_save_history(COMMAND_HISTORY, 
875                 prefs_common.mime_open_cmd_history);
876         prefs_common_save_history(QUICKSEARCH_HISTORY, 
877                 prefs_common.summary_quicksearch_history);
878 }
879
880 void pref_set_textview_from_pref(GtkTextView *textview, gchar *txt)
881 {
882         GtkTextBuffer *buffer = gtk_text_view_get_buffer(textview);
883         gchar *o_out, *out = malloc(txt?(strlen(txt)+1):1);
884         gchar *t = txt;
885         memset(out, 0, strlen(txt)+1);
886         o_out = out;
887         while (*t != '\0') {
888                 if (*t == '\\' && *(t+1) == 'n') {
889                         *out++ = '\n';
890                         t++;
891                 } else if (*t == '\\') {
892                         t++;
893                 } else {
894                         *out++ = *t;
895                 }
896                 t++;
897         }
898         *out='\0';
899
900         gtk_text_buffer_set_text(buffer, o_out?o_out:"", -1);
901         g_free(o_out);
902 }
903
904 gchar *pref_get_pref_from_textview(GtkTextView *textview) 
905 {
906         GtkTextBuffer *buffer;
907         GtkTextIter start, end;
908         gchar *o_out, *out, *tmp, *t;
909         
910         buffer = gtk_text_view_get_buffer(textview);
911         gtk_text_buffer_get_start_iter(buffer, &start);
912         gtk_text_buffer_get_iter_at_offset(buffer, &end, -1);
913         tmp = gtk_text_buffer_get_text(buffer, &start, &end, FALSE);
914         t = tmp;
915         o_out = out = malloc(2*strlen(tmp)+1);
916         
917         while (*t != '\0') {
918                 if (*t == '\n') {
919                         *out++ = '\\';
920                         *out++ = 'n';
921                 } else if (*t == '\\') {
922                         *out++ = '\\';
923                         *out++ = '\\';
924                 } else {
925                         *out++ = *t;
926                 }
927                 t++;
928         }
929         *out = '\0';
930         g_free(tmp);
931
932         return o_out;
933 }