2006-04-07 [colin] 2.1.0cvs16
[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", "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", "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", "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", "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", "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", "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", "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         {"uri_color", "32512", &prefs_common.uri_col, P_COLOR,
526          NULL, NULL, NULL},
527         {"target_folder_color", "14294218", &prefs_common.tgt_folder_col, P_COLOR,
528          NULL, NULL, NULL},
529         {"signature_color", "7960953", &prefs_common.signature_col, P_COLOR,
530          NULL, NULL, NULL},
531         {"recycle_quote_colors", "FALSE", &prefs_common.recycle_quote_colors,
532          P_BOOL, NULL, NULL, NULL},
533
534         {"display_header_pane", "FALSE", &prefs_common.display_header_pane,
535          P_BOOL, NULL, NULL, NULL},
536         {"display_header", "TRUE", &prefs_common.display_header, P_BOOL,
537          NULL, NULL, NULL},
538         {"display_xface", "TRUE", &prefs_common.display_xface,
539          P_BOOL, NULL, NULL, NULL},
540         {"render_html", "TRUE", &prefs_common.render_html, P_BOOL,
541          NULL, NULL, NULL},
542         {"invoke_plugin_on_html", "FALSE", &prefs_common.invoke_plugin_on_html, P_BOOL,
543          NULL, NULL, NULL},
544         {"line_space", "2", &prefs_common.line_space, P_INT,
545          NULL, NULL, NULL},
546
547         {"enable_smooth_scroll", "FALSE",
548          &prefs_common.enable_smooth_scroll, P_BOOL,
549          NULL, NULL, NULL},
550         {"scroll_step", "1", &prefs_common.scroll_step, P_INT,
551          NULL, NULL, NULL},
552         {"scroll_half_page", "FALSE", &prefs_common.scroll_halfpage, P_BOOL,
553          NULL, NULL, NULL},
554
555         {"show_other_header", "FALSE", &prefs_common.show_other_header, P_BOOL,
556          NULL, NULL, NULL},
557
558         {"attach_desc", "TRUE", &prefs_common.attach_desc, P_BOOL,
559          NULL, NULL, NULL},
560         {"attach_save_directory", NULL,
561          &SPECIFIC_PREFS.attach_save_dir, P_STRING, NULL, NULL, NULL},
562         {"attach_load_directory", NULL,
563          &SPECIFIC_PREFS.attach_load_dir, P_STRING, NULL, NULL, NULL},
564
565         /* MIME viewer */
566         {"mime_image_viewer", DEFAULT_IMAGE_VIEWER_CMD,
567          &SPECIFIC_PREFS.mime_image_viewer,     P_STRING, NULL, NULL, NULL},
568         {"mime_audio_player", DEFAULT_AUDIO_PLAYER_CMD,
569          &SPECIFIC_PREFS.mime_audio_player, P_STRING, NULL, NULL, NULL},
570         {"mime_open_command", "gedit '%s'",
571          &SPECIFIC_PREFS.mime_open_cmd, P_STRING, NULL, NULL, NULL},
572
573         /* Interface */
574         {"separate_folder", "FALSE", &prefs_common.sep_folder, P_BOOL,
575          NULL, NULL, NULL},
576         {"separate_message", "FALSE", &prefs_common.sep_msg, P_BOOL,
577          NULL, NULL, NULL},
578
579         /* {"emulate_emacs", "FALSE", &prefs_common.emulate_emacs, P_BOOL,
580          NULL, NULL, NULL}, */
581         {"always_show_message_when_selected", "FALSE",
582          &prefs_common.always_show_msg,
583          P_BOOL, NULL, NULL, NULL},
584         {"select_on_entry", "2", &prefs_common.select_on_entry,
585          P_ENUM, NULL, NULL, NULL},
586         {"mark_as_read_on_new_window", "FALSE",
587          &prefs_common.mark_as_read_on_new_window,
588          P_BOOL, NULL, NULL, NULL},
589         {"mark_as_read_delay", "0",
590          &prefs_common.mark_as_read_delay, P_INT, 
591          NULL, NULL, NULL},
592         {"immediate_execution", "TRUE", &prefs_common.immediate_exec, P_BOOL,
593          NULL, NULL, NULL},
594         {"nextunreadmsg_dialog", "1", &prefs_common.next_unread_msg_dialog, P_ENUM,
595          NULL, NULL, NULL},
596
597         {"pixmap_theme_path", DEFAULT_PIXMAP_THEME, 
598          &SPECIFIC_PREFS.pixmap_theme_path, P_STRING,
599          NULL, NULL, NULL},
600
601         {"ask_mark_all_read", "TRUE", &prefs_common.ask_mark_all_read, P_BOOL,
602          NULL, NULL, NULL},
603
604         /* Other */
605         {"uri_open_command", DEFAULT_BROWSER_CMD,
606          &SPECIFIC_PREFS.uri_cmd, P_STRING, NULL, NULL, NULL},
607         {"print_command", "lpr %s",
608          &SPECIFIC_PREFS.print_cmd, P_STRING, NULL, NULL, NULL},
609         {"ext_editor_command", DEFAULT_EDITOR_CMD,
610          &SPECIFIC_PREFS.ext_editor_cmd, P_STRING, NULL, NULL, NULL},
611
612         {"add_address_by_click", "FALSE", &prefs_common.add_address_by_click,
613          P_BOOL, NULL, NULL, NULL},
614         {"confirm_on_exit", "FALSE", &prefs_common.confirm_on_exit, P_BOOL,
615          NULL, NULL, NULL},
616         {"clean_trash_on_exit", "FALSE", &prefs_common.clean_on_exit, P_BOOL,
617          NULL, NULL, NULL},
618         {"ask_on_cleaning", "TRUE", &prefs_common.ask_on_clean, P_BOOL,
619          NULL, NULL, NULL},
620         {"warn_queued_on_exit", "TRUE", &prefs_common.warn_queued_on_exit,
621          P_BOOL, NULL, NULL, NULL},
622         {"work_offline", "FALSE", &prefs_common.work_offline, P_BOOL,
623          NULL, NULL, NULL},
624         {"summary_quicksearch_type", "0", &prefs_common.summary_quicksearch_type, P_INT,
625          NULL, NULL, NULL},
626         {"summary_quicksearch_recurse", "1", &prefs_common.summary_quicksearch_recurse, P_INT,
627          NULL, NULL, NULL},
628
629         {"io_timeout_secs", "60", &prefs_common.io_timeout_secs,
630          P_INT, NULL, NULL, NULL},
631         {"hide_score", "-9999", &prefs_common.kill_score, P_INT,
632          NULL, NULL, NULL},
633         {"important_score", "1", &prefs_common.important_score, P_INT,
634          NULL, NULL, NULL},
635         {"clip_log", "TRUE", &prefs_common.cliplog, P_BOOL,
636          NULL, NULL, NULL},
637         {"log_length", "500", &prefs_common.loglength, P_INT,
638          NULL, NULL, NULL},
639
640         {"color_new", "179", &prefs_common.color_new, P_COLOR,
641          NULL, NULL, NULL},
642
643         /* Some windows' sizes */
644         {"filteringwin_width", "500", &prefs_common.filteringwin_width, P_INT,
645          NULL, NULL, NULL},
646         {"filteringwin_height", "-1", &prefs_common.filteringwin_height, P_INT,
647          NULL, NULL, NULL},
648
649         {"filteringactionwin_width", "490", &prefs_common.filteringactionwin_width, P_INT,
650          NULL, NULL, NULL},
651         {"filteringactionwin_height", "-1", &prefs_common.filteringactionwin_height, P_INT,
652          NULL, NULL, NULL},
653
654         {"matcherwin_width", "520", &prefs_common.matcherwin_width, P_INT,
655          NULL, NULL, NULL},
656         {"matcherwin_height", "-1", &prefs_common.matcherwin_height, P_INT,
657          NULL, NULL, NULL},
658
659         {"templateswin_width", "440", &prefs_common.templateswin_width, P_INT,
660          NULL, NULL, NULL},
661         {"templateswin_height", "-1", &prefs_common.templateswin_height, P_INT,
662          NULL, NULL, NULL},
663
664         {"actionswin_width", "486", &prefs_common.actionswin_width, P_INT,
665          NULL, NULL, NULL},
666         {"actionswin_height", "-1", &prefs_common.actionswin_height, P_INT,
667          NULL, NULL, NULL},
668
669         {"addressbookwin_width", "520", &prefs_common.addressbookwin_width, P_INT,
670          NULL, NULL, NULL},
671         {"addressbookwin_height", "-1", &prefs_common.addressbookwin_height, P_INT,
672          NULL, NULL, NULL},
673
674         {"addressbookeditpersonwin_width", "640", &prefs_common.addressbookeditpersonwin_width, P_INT,
675          NULL, NULL, NULL},
676         {"addressbookeditpersonwin_height", "-1", &prefs_common.addressbookeditpersonwin_height, P_INT,
677          NULL, NULL, NULL},
678
679         {"pluginswin_width", "480", &prefs_common.pluginswin_width, P_INT,
680          NULL, NULL, NULL},
681         {"pluginswin_height", "-1", &prefs_common.pluginswin_height, P_INT,
682          NULL, NULL, NULL},
683
684         {"prefswin_width", "600", &prefs_common.prefswin_width, P_INT,
685          NULL, NULL, NULL},
686         {"prefswin_height", "-1", &prefs_common.prefswin_height, P_INT,
687          NULL, NULL, NULL},
688
689         {"folderitemwin_width", "500", &prefs_common.folderitemwin_width, P_INT,
690          NULL, NULL, NULL},
691         {"folderitemwin_height", "-1", &prefs_common.folderitemwin_height, P_INT,
692          NULL, NULL, NULL},
693
694         {"editaccountwin_width", "500", &prefs_common.editaccountwin_width, P_INT,
695          NULL, NULL, NULL},
696         {"editaccountwin_height", "-1", &prefs_common.editaccountwin_height, P_INT,
697          NULL, NULL, NULL},
698
699         {"accountswin_width", "500", &prefs_common.accountswin_width, P_INT,
700          NULL, NULL, NULL},
701         {"accountswin_height", "-1", &prefs_common.accountswin_height, P_INT,
702          NULL, NULL, NULL},
703
704         {"logwin_width", "520", &prefs_common.logwin_width, P_INT,
705          NULL, NULL, NULL},
706         {"logwin_height", "-1", &prefs_common.logwin_height, P_INT,
707          NULL, NULL, NULL},
708
709         {"folderselwin_width", "300", &prefs_common.folderselwin_width, P_INT,
710          NULL, NULL, NULL},
711         {"folderselwin_height", "-1", &prefs_common.folderselwin_height, P_INT,
712          NULL, NULL, NULL},
713
714         {"addressaddwin_width", "300", &prefs_common.addressaddwin_width, P_INT,
715          NULL, NULL, NULL},
716         {"addressaddwin_height", "-1", &prefs_common.addressaddwin_height, P_INT,
717          NULL, NULL, NULL},
718
719         /* Hidden */
720         {"warn_dnd", "1", &prefs_common.warn_dnd, P_INT,
721          NULL, NULL, NULL},
722         {"utf8_instead_of_locale_for_broken_mail", "0", 
723          &prefs_common.broken_are_utf8, P_INT,
724          NULL, NULL, NULL},
725         {"enable_swap_from", "FALSE", &prefs_common.swap_from, P_BOOL,
726          NULL, NULL, NULL},
727         {"enable_rules_hint", "TRUE", &prefs_common.enable_rules_hint, P_BOOL,
728          NULL, NULL, NULL},
729         {"enable_hscrollbar", "TRUE", &prefs_common.enable_hscrollbar, P_BOOL,
730          NULL, NULL, NULL},
731         {"folderview_vscrollbar_policy", "0",
732          &prefs_common.folderview_vscrollbar_policy, P_ENUM,
733          NULL, NULL, NULL},
734         {"textview_cursor_visible", "FALSE",
735          &prefs_common.textview_cursor_visible, P_BOOL,
736          NULL, NULL, NULL},
737         {"hover_timeout", "500", &prefs_common.hover_timeout, P_INT,
738          NULL, NULL, NULL},
739         {"cache_max_mem_usage", "4096", &prefs_common.cache_max_mem_usage, P_INT,
740          NULL, NULL, NULL},
741         {"cache_min_keep_time", "15", &prefs_common.cache_min_keep_time, P_INT,
742          NULL, NULL, NULL},
743         {"thread_by_subject_max_age", "10", &prefs_common.thread_by_subject_max_age,
744         P_INT, NULL, NULL, NULL },
745         {"summary_quicksearch_sticky", "1", &prefs_common.summary_quicksearch_sticky, P_INT,
746          NULL, NULL, NULL},
747         {"statusbar_update_step", "10", &prefs_common.statusbar_update_step, P_INT,
748          NULL, NULL, NULL},
749         {"compose_no_markup", "FALSE", &prefs_common.compose_no_markup, P_BOOL,
750          NULL, NULL, NULL},
751
752         {NULL, NULL, NULL, P_OTHER, NULL, NULL, NULL}
753 };
754
755 PrefsCommon *prefs_common_get(void)
756 {
757         return &prefs_common;
758 }
759
760 /*
761  * Read history list from the specified history file
762  */
763 GList *prefs_common_read_history(const gchar *history) 
764 {
765         FILE *fp;
766         gchar *path;
767         gchar buf[PREFSBUFSIZE];
768         GList *tmp = NULL;
769
770         path = g_strconcat(get_rc_dir(), G_DIR_SEPARATOR_S, history,
771                            NULL);
772         if ((fp = g_fopen(path, "rb")) == NULL) {
773                 if (ENOENT != errno) FILE_OP_ERROR(path, "fopen");
774                 g_free(path);
775                 return NULL;
776         }
777         g_free(path);
778         while (fgets(buf, sizeof(buf), fp) != NULL) {
779                 g_strstrip(buf);
780                 if (buf[0] == '\0') continue;
781                 tmp = add_history(tmp, buf);
782         }
783         fclose(fp);
784
785         tmp = g_list_reverse(tmp);
786
787         return tmp;
788 }
789
790 void prefs_common_read_config(void)
791 {
792         gchar *rcpath;
793
794         rcpath = g_strconcat(get_rc_dir(), G_DIR_SEPARATOR_S, COMMON_RC, NULL);
795         prefs_read_config(param, "Common", rcpath, NULL);
796 #ifdef G_OS_WIN32
797         prefs_read_config(param_os_specific, "CommonWin32", rcpath, NULL);
798 #endif
799
800         g_free(rcpath);
801
802         prefs_common.quotefmt = gettext(prefs_common.quotefmt);
803         prefs_common.fw_quotefmt = gettext(prefs_common.fw_quotefmt);
804         prefs_common.date_format = gettext(prefs_common.date_format);
805
806         prefs_common.mime_open_cmd_history =
807                 prefs_common_read_history(COMMAND_HISTORY);
808         prefs_common.summary_quicksearch_history =
809                 prefs_common_read_history(QUICKSEARCH_HISTORY);
810
811         colorlabel_update_colortable_from_prefs();
812 }
813
814 /*
815  * Save history list to the specified history file
816  */
817 void prefs_common_save_history(const gchar *history, GList *list)
818 {
819         GList *cur;
820         FILE *fp;
821         gchar *path;
822
823         path = g_strconcat(get_rc_dir(), G_DIR_SEPARATOR_S, history,
824                            NULL);
825         if ((fp = g_fopen(path, "wb")) == NULL) {
826                 FILE_OP_ERROR(path, "fopen");
827                 g_free(path);
828                 return;
829         }
830
831         for (cur = list; cur != NULL; cur = cur->next) {
832                 fputs((gchar *)cur->data, fp);
833                 fputc('\n', fp);
834         }
835
836         fclose(fp);
837         g_free(path);
838 }
839
840 void prefs_common_write_config(void)
841 {
842         prefs_write_config(param, "Common", COMMON_RC);
843 #ifdef G_OS_WIN32
844         prefs_write_config(param_os_specific, "CommonWin32", COMMON_RC);
845 #endif
846
847         prefs_common_save_history(COMMAND_HISTORY, 
848                 prefs_common.mime_open_cmd_history);
849         prefs_common_save_history(QUICKSEARCH_HISTORY, 
850                 prefs_common.summary_quicksearch_history);
851 }
852
853 void pref_set_textview_from_pref(GtkTextView *textview, gchar *txt)
854 {
855         GtkTextBuffer *buffer = gtk_text_view_get_buffer(textview);
856         gchar *o_out, *out = malloc(txt?(strlen(txt)+1):1);
857         gchar *t = txt;
858         memset(out, 0, strlen(txt)+1);
859         o_out = out;
860         while (*t != '\0') {
861                 if (*t == '\\' && *(t+1) == 'n') {
862                         *out++ = '\n';
863                         t++;
864                 } else if (*t == '\\') {
865                         t++;
866                 } else {
867                         *out++ = *t;
868                 }
869                 t++;
870         }
871         *out='\0';
872
873         gtk_text_buffer_set_text(buffer, o_out?o_out:"", -1);
874         g_free(o_out);
875 }
876
877 gchar *pref_get_pref_from_textview(GtkTextView *textview) 
878 {
879         GtkTextBuffer *buffer;
880         GtkTextIter start, end;
881         gchar *o_out, *out, *tmp, *t;
882         
883         buffer = gtk_text_view_get_buffer(textview);
884         gtk_text_buffer_get_start_iter(buffer, &start);
885         gtk_text_buffer_get_iter_at_offset(buffer, &end, -1);
886         tmp = gtk_text_buffer_get_text(buffer, &start, &end, FALSE);
887         t = tmp;
888         o_out = out = malloc(2*strlen(tmp)+1);
889         
890         while (*t != '\0') {
891                 if (*t == '\n') {
892                         *out++ = '\\';
893                         *out++ = 'n';
894                 } else if (*t == '\\') {
895                         *out++ = '\\';
896                         *out++ = '\\';
897                 } else {
898                         *out++ = *t;
899                 }
900                 t++;
901         }
902         *out = '\0';
903         g_free(tmp);
904
905         return o_out;
906 }