b77e3b581000137f97651e0bcdb199cad61ba977
[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         {"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
648         {"color_new", "179", &prefs_common.color_new, P_COLOR,
649          NULL, NULL, NULL},
650
651         /* Some windows' sizes */
652         {"filteringwin_width", "500", &prefs_common.filteringwin_width, P_INT,
653          NULL, NULL, NULL},
654         {"filteringwin_height", "-1", &prefs_common.filteringwin_height, P_INT,
655          NULL, NULL, NULL},
656
657         {"filteringactionwin_width", "490", &prefs_common.filteringactionwin_width, P_INT,
658          NULL, NULL, NULL},
659         {"filteringactionwin_height", "-1", &prefs_common.filteringactionwin_height, P_INT,
660          NULL, NULL, NULL},
661
662         {"matcherwin_width", "520", &prefs_common.matcherwin_width, P_INT,
663          NULL, NULL, NULL},
664         {"matcherwin_height", "-1", &prefs_common.matcherwin_height, P_INT,
665          NULL, NULL, NULL},
666
667         {"templateswin_width", "440", &prefs_common.templateswin_width, P_INT,
668          NULL, NULL, NULL},
669         {"templateswin_height", "-1", &prefs_common.templateswin_height, P_INT,
670          NULL, NULL, NULL},
671
672         {"actionswin_width", "486", &prefs_common.actionswin_width, P_INT,
673          NULL, NULL, NULL},
674         {"actionswin_height", "-1", &prefs_common.actionswin_height, P_INT,
675          NULL, NULL, NULL},
676
677         {"addressbookwin_width", "520", &prefs_common.addressbookwin_width, P_INT,
678          NULL, NULL, NULL},
679         {"addressbookwin_height", "-1", &prefs_common.addressbookwin_height, P_INT,
680          NULL, NULL, NULL},
681
682         {"addressbookeditpersonwin_width", "640", &prefs_common.addressbookeditpersonwin_width, P_INT,
683          NULL, NULL, NULL},
684         {"addressbookeditpersonwin_height", "-1", &prefs_common.addressbookeditpersonwin_height, P_INT,
685          NULL, NULL, NULL},
686
687         {"pluginswin_width", "480", &prefs_common.pluginswin_width, P_INT,
688          NULL, NULL, NULL},
689         {"pluginswin_height", "-1", &prefs_common.pluginswin_height, P_INT,
690          NULL, NULL, NULL},
691
692         {"prefswin_width", "600", &prefs_common.prefswin_width, P_INT,
693          NULL, NULL, NULL},
694         {"prefswin_height", "-1", &prefs_common.prefswin_height, P_INT,
695          NULL, NULL, NULL},
696
697         {"folderitemwin_width", "500", &prefs_common.folderitemwin_width, P_INT,
698          NULL, NULL, NULL},
699         {"folderitemwin_height", "-1", &prefs_common.folderitemwin_height, P_INT,
700          NULL, NULL, NULL},
701
702         {"editaccountwin_width", "500", &prefs_common.editaccountwin_width, P_INT,
703          NULL, NULL, NULL},
704         {"editaccountwin_height", "-1", &prefs_common.editaccountwin_height, P_INT,
705          NULL, NULL, NULL},
706
707         {"accountswin_width", "500", &prefs_common.accountswin_width, P_INT,
708          NULL, NULL, NULL},
709         {"accountswin_height", "-1", &prefs_common.accountswin_height, P_INT,
710          NULL, NULL, NULL},
711
712         {"logwin_width", "520", &prefs_common.logwin_width, P_INT,
713          NULL, NULL, NULL},
714         {"logwin_height", "-1", &prefs_common.logwin_height, P_INT,
715          NULL, NULL, NULL},
716
717         {"folderselwin_width", "300", &prefs_common.folderselwin_width, P_INT,
718          NULL, NULL, NULL},
719         {"folderselwin_height", "-1", &prefs_common.folderselwin_height, P_INT,
720          NULL, NULL, NULL},
721
722         {"addressaddwin_width", "300", &prefs_common.addressaddwin_width, P_INT,
723          NULL, NULL, NULL},
724         {"addressaddwin_height", "-1", &prefs_common.addressaddwin_height, P_INT,
725          NULL, NULL, NULL},
726
727         /* Hidden */
728         {"warn_dnd", "1", &prefs_common.warn_dnd, P_INT,
729          NULL, NULL, NULL},
730         {"utf8_instead_of_locale_for_broken_mail", "0", 
731          &prefs_common.broken_are_utf8, P_INT,
732          NULL, NULL, NULL},
733         {"enable_swap_from", "FALSE", &prefs_common.swap_from, P_BOOL,
734          NULL, NULL, NULL},
735         {"enable_rules_hint", "TRUE", &prefs_common.enable_rules_hint, P_BOOL,
736          NULL, NULL, NULL},
737         {"enable_hscrollbar", "TRUE", &prefs_common.enable_hscrollbar, P_BOOL,
738          NULL, NULL, NULL},
739         {"folderview_vscrollbar_policy", "0",
740          &prefs_common.folderview_vscrollbar_policy, P_ENUM,
741          NULL, NULL, NULL},
742         {"textview_cursor_visible", "FALSE",
743          &prefs_common.textview_cursor_visible, P_BOOL,
744          NULL, NULL, NULL},
745         {"hover_timeout", "500", &prefs_common.hover_timeout, P_INT,
746          NULL, NULL, NULL},
747         {"cache_max_mem_usage", "4096", &prefs_common.cache_max_mem_usage, P_INT,
748          NULL, NULL, NULL},
749         {"cache_min_keep_time", "15", &prefs_common.cache_min_keep_time, P_INT,
750          NULL, NULL, NULL},
751         {"thread_by_subject_max_age", "10", &prefs_common.thread_by_subject_max_age,
752         P_INT, NULL, NULL, NULL },
753         {"summary_quicksearch_sticky", "1", &prefs_common.summary_quicksearch_sticky, P_INT,
754          NULL, NULL, NULL},
755         {"statusbar_update_step", "10", &prefs_common.statusbar_update_step, P_INT,
756          NULL, NULL, NULL},
757         {"compose_no_markup", "FALSE", &prefs_common.compose_no_markup, P_BOOL,
758          NULL, NULL, NULL},
759
760         {NULL, NULL, NULL, P_OTHER, NULL, NULL, NULL}
761 };
762
763 PrefsCommon *prefs_common_get(void)
764 {
765         return &prefs_common;
766 }
767
768 /*
769  * Read history list from the specified history file
770  */
771 GList *prefs_common_read_history(const gchar *history) 
772 {
773         FILE *fp;
774         gchar *path;
775         gchar buf[PREFSBUFSIZE];
776         GList *tmp = NULL;
777
778         path = g_strconcat(get_rc_dir(), G_DIR_SEPARATOR_S, history,
779                            NULL);
780         if ((fp = g_fopen(path, "rb")) == NULL) {
781                 if (ENOENT != errno) FILE_OP_ERROR(path, "fopen");
782                 g_free(path);
783                 return NULL;
784         }
785         g_free(path);
786         while (fgets(buf, sizeof(buf), fp) != NULL) {
787                 g_strstrip(buf);
788                 if (buf[0] == '\0') continue;
789                 tmp = add_history(tmp, buf);
790         }
791         fclose(fp);
792
793         tmp = g_list_reverse(tmp);
794
795         return tmp;
796 }
797
798 void prefs_common_read_config(void)
799 {
800         gchar *rcpath;
801         gchar *tmp;
802
803         rcpath = g_strconcat(get_rc_dir(), G_DIR_SEPARATOR_S, COMMON_RC, NULL);
804         prefs_read_config(param, "Common", rcpath, NULL);
805 #ifdef G_OS_WIN32
806         prefs_read_config(param_os_specific, "CommonWin32", rcpath, NULL);
807 #endif
808
809         g_free(rcpath);
810
811         tmp = g_strdup(gettext(prefs_common.quotefmt));
812         g_free(prefs_common.quotefmt);
813         prefs_common.quotefmt = tmp;
814
815         tmp = g_strdup(gettext(prefs_common.fw_quotefmt));
816         g_free(prefs_common.fw_quotefmt);
817         prefs_common.fw_quotefmt = tmp;
818         
819         tmp = g_strdup(gettext(prefs_common.date_format));
820         g_free(prefs_common.date_format);
821         prefs_common.date_format = tmp;
822
823         prefs_common.mime_open_cmd_history =
824                 prefs_common_read_history(COMMAND_HISTORY);
825         prefs_common.summary_quicksearch_history =
826                 prefs_common_read_history(QUICKSEARCH_HISTORY);
827
828         colorlabel_update_colortable_from_prefs();
829 }
830
831 /*
832  * Save history list to the specified history file
833  */
834 void prefs_common_save_history(const gchar *history, GList *list)
835 {
836         GList *cur;
837         FILE *fp;
838         gchar *path;
839
840         path = g_strconcat(get_rc_dir(), G_DIR_SEPARATOR_S, history,
841                            NULL);
842         if ((fp = g_fopen(path, "wb")) == NULL) {
843                 FILE_OP_ERROR(path, "fopen");
844                 g_free(path);
845                 return;
846         }
847
848         for (cur = list; cur != NULL; cur = cur->next) {
849                 fputs((gchar *)cur->data, fp);
850                 fputc('\n', fp);
851         }
852
853         fclose(fp);
854         g_free(path);
855 }
856
857 void prefs_common_write_config(void)
858 {
859         prefs_write_config(param, "Common", COMMON_RC);
860 #ifdef G_OS_WIN32
861         prefs_write_config(param_os_specific, "CommonWin32", COMMON_RC);
862 #endif
863
864         prefs_common_save_history(COMMAND_HISTORY, 
865                 prefs_common.mime_open_cmd_history);
866         prefs_common_save_history(QUICKSEARCH_HISTORY, 
867                 prefs_common.summary_quicksearch_history);
868 }
869
870 void pref_set_textview_from_pref(GtkTextView *textview, gchar *txt)
871 {
872         GtkTextBuffer *buffer = gtk_text_view_get_buffer(textview);
873         gchar *o_out, *out = malloc(txt?(strlen(txt)+1):1);
874         gchar *t = txt;
875         memset(out, 0, strlen(txt)+1);
876         o_out = out;
877         while (*t != '\0') {
878                 if (*t == '\\' && *(t+1) == 'n') {
879                         *out++ = '\n';
880                         t++;
881                 } else if (*t == '\\') {
882                         t++;
883                 } else {
884                         *out++ = *t;
885                 }
886                 t++;
887         }
888         *out='\0';
889
890         gtk_text_buffer_set_text(buffer, o_out?o_out:"", -1);
891         g_free(o_out);
892 }
893
894 gchar *pref_get_pref_from_textview(GtkTextView *textview) 
895 {
896         GtkTextBuffer *buffer;
897         GtkTextIter start, end;
898         gchar *o_out, *out, *tmp, *t;
899         
900         buffer = gtk_text_view_get_buffer(textview);
901         gtk_text_buffer_get_start_iter(buffer, &start);
902         gtk_text_buffer_get_iter_at_offset(buffer, &end, -1);
903         tmp = gtk_text_buffer_get_text(buffer, &start, &end, FALSE);
904         t = tmp;
905         o_out = out = malloc(2*strlen(tmp)+1);
906         
907         while (*t != '\0') {
908                 if (*t == '\n') {
909                         *out++ = '\\';
910                         *out++ = 'n';
911                 } else if (*t == '\\') {
912                         *out++ = '\\';
913                         *out++ = '\\';
914                 } else {
915                         *out++ = *t;
916                 }
917                 t++;
918         }
919         *out = '\0';
920         g_free(tmp);
921
922         return o_out;
923 }