15b4368fa5eb215bee22ff54bfb1dc6d9c87d356
[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
750         {NULL, NULL, NULL, P_OTHER, NULL, NULL, NULL}
751 };
752
753 PrefsCommon *prefs_common_get(void)
754 {
755         return &prefs_common;
756 }
757
758 /*
759  * Read history list from the specified history file
760  */
761 GList *prefs_common_read_history(const gchar *history) 
762 {
763         FILE *fp;
764         gchar *path;
765         gchar buf[PREFSBUFSIZE];
766         GList *tmp = NULL;
767
768         path = g_strconcat(get_rc_dir(), G_DIR_SEPARATOR_S, history,
769                            NULL);
770         if ((fp = g_fopen(path, "rb")) == NULL) {
771                 if (ENOENT != errno) FILE_OP_ERROR(path, "fopen");
772                 g_free(path);
773                 return NULL;
774         }
775         g_free(path);
776         while (fgets(buf, sizeof(buf), fp) != NULL) {
777                 g_strstrip(buf);
778                 if (buf[0] == '\0') continue;
779                 tmp = add_history(tmp, buf);
780         }
781         fclose(fp);
782
783         tmp = g_list_reverse(tmp);
784
785         return tmp;
786 }
787
788 void prefs_common_read_config(void)
789 {
790         gchar *rcpath;
791
792         rcpath = g_strconcat(get_rc_dir(), G_DIR_SEPARATOR_S, COMMON_RC, NULL);
793         prefs_read_config(param, "Common", rcpath, NULL);
794 #ifdef G_OS_WIN32
795         prefs_read_config(param_os_specific, "CommonWin32", rcpath, NULL);
796 #endif
797
798         g_free(rcpath);
799
800         prefs_common.quotefmt = gettext(prefs_common.quotefmt);
801         prefs_common.fw_quotefmt = gettext(prefs_common.fw_quotefmt);
802         prefs_common.date_format = gettext(prefs_common.date_format);
803
804         prefs_common.mime_open_cmd_history =
805                 prefs_common_read_history(COMMAND_HISTORY);
806         prefs_common.summary_quicksearch_history =
807                 prefs_common_read_history(QUICKSEARCH_HISTORY);
808
809         colorlabel_update_colortable_from_prefs();
810 }
811
812 /*
813  * Save history list to the specified history file
814  */
815 void prefs_common_save_history(const gchar *history, GList *list)
816 {
817         GList *cur;
818         FILE *fp;
819         gchar *path;
820
821         path = g_strconcat(get_rc_dir(), G_DIR_SEPARATOR_S, history,
822                            NULL);
823         if ((fp = g_fopen(path, "wb")) == NULL) {
824                 FILE_OP_ERROR(path, "fopen");
825                 g_free(path);
826                 return;
827         }
828
829         for (cur = list; cur != NULL; cur = cur->next) {
830                 fputs((gchar *)cur->data, fp);
831                 fputc('\n', fp);
832         }
833
834         fclose(fp);
835         g_free(path);
836 }
837
838 void prefs_common_write_config(void)
839 {
840         prefs_write_config(param, "Common", COMMON_RC);
841 #ifdef G_OS_WIN32
842         prefs_write_config(param_os_specific, "CommonWin32", COMMON_RC);
843 #endif
844
845         prefs_common_save_history(COMMAND_HISTORY, 
846                 prefs_common.mime_open_cmd_history);
847         prefs_common_save_history(QUICKSEARCH_HISTORY, 
848                 prefs_common.summary_quicksearch_history);
849 }
850
851 void pref_set_textview_from_pref(GtkTextView *textview, gchar *txt)
852 {
853         GtkTextBuffer *buffer = gtk_text_view_get_buffer(textview);
854         gchar *o_out, *out = malloc(txt?(strlen(txt)+1):1);
855         gchar *t = txt;
856         memset(out, 0, strlen(txt)+1);
857         o_out = out;
858         while (*t != '\0') {
859                 if (*t == '\\' && *(t+1) == 'n') {
860                         *out++ = '\n';
861                         t++;
862                 } else if (*t == '\\') {
863                         t++;
864                 } else {
865                         *out++ = *t;
866                 }
867                 t++;
868         }
869         *out='\0';
870
871         gtk_text_buffer_set_text(buffer, o_out?o_out:"", -1);
872         g_free(o_out);
873 }
874
875 gchar *pref_get_pref_from_textview(GtkTextView *textview) 
876 {
877         GtkTextBuffer *buffer;
878         GtkTextIter start, end;
879         gchar *o_out, *out, *tmp, *t;
880         
881         buffer = gtk_text_view_get_buffer(textview);
882         gtk_text_buffer_get_start_iter(buffer, &start);
883         gtk_text_buffer_get_iter_at_offset(buffer, &end, -1);
884         tmp = gtk_text_buffer_get_text(buffer, &start, &end, FALSE);
885         t = tmp;
886         o_out = out = malloc(2*strlen(tmp)+1);
887         
888         while (*t != '\0') {
889                 if (*t == '\n') {
890                         *out++ = '\\';
891                         *out++ = 'n';
892                 } else if (*t == '\\') {
893                         *out++ = '\\';
894                         *out++ = '\\';
895                 } else {
896                         *out++ = *t;
897                 }
898                 t++;
899         }
900         *out = '\0';
901         g_free(tmp);
902
903         return o_out;
904 }