2005-08-05 [colin] 1.9.13cvs17
[claws.git] / src / prefs_common.c
1 /*
2  * Sylpheed -- a GTK+ based, lightweight, and fast e-mail client
3  * Copyright (C) 1999-2005 Hiroyuki Yamamoto
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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, 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
62 enum {
63         DATEFMT_FMT,
64         DATEFMT_TXT,
65         N_DATEFMT_COLUMNS
66 };
67
68 PrefsCommon prefs_common;
69
70 GtkWidget *notebook;
71
72 /*
73    parameter name, default value, pointer to the prefs variable, data type,
74    pointer to the widget pointer,
75    pointer to the function for data setting,
76    pointer to the function for widget setting
77  */
78
79 static PrefParam param[] = {
80         /* Receive */
81         {"use_ext_inc", "FALSE", &prefs_common.use_extinc, P_BOOL,
82          NULL, NULL, NULL},
83         {"ext_inc_path", DEFAULT_INC_PATH, &prefs_common.extinc_cmd, P_STRING,
84          NULL, NULL, NULL},
85
86         {"autochk_newmail", "FALSE", &prefs_common.autochk_newmail, P_BOOL,
87          NULL, NULL, NULL},
88         {"autochk_interval", "10", &prefs_common.autochk_itv, P_INT,
89          NULL, NULL, NULL},
90         {"check_on_startup", "FALSE", &prefs_common.chk_on_startup, P_BOOL,
91          NULL, NULL, NULL},
92         {"scan_all_after_inc", "FALSE", &prefs_common.scan_all_after_inc,
93          P_BOOL, NULL, NULL, NULL},
94         {"newmail_notify_manu", "FALSE", &prefs_common.newmail_notify_manu,
95          P_BOOL, NULL, NULL, NULL},
96         {"newmail_notify_auto", "FALSE", &prefs_common.newmail_notify_auto,
97         P_BOOL, NULL, NULL, NULL},
98         {"newmail_notify_cmd", "", &prefs_common.newmail_notify_cmd, P_STRING,
99          NULL, NULL, NULL},
100         {"receive_dialog_mode", "1", &prefs_common.recv_dialog_mode, P_ENUM,
101          NULL, NULL, NULL},
102         {"no_receive_error_panel", "FALSE", &prefs_common.no_recv_err_panel,
103          P_BOOL, NULL, NULL, NULL},
104         {"close_receive_dialog", "TRUE", &prefs_common.close_recv_dialog,
105          P_BOOL, NULL, NULL, NULL},
106  
107         /* Send */
108         {"save_message", "TRUE", &prefs_common.savemsg, P_BOOL,
109          NULL, NULL, NULL},
110         {"confirm_send_queued_messages", "FALSE", &prefs_common.confirm_send_queued_messages,
111          P_BOOL, NULL, NULL, NULL},
112         {"send_dialog_mode", "0", &prefs_common.send_dialog_mode, P_ENUM,
113          NULL, NULL, NULL},
114
115         {"outgoing_charset", CS_AUTO, &prefs_common.outgoing_charset, P_STRING,
116          NULL, NULL, NULL},
117         {"encoding_method", "0", &prefs_common.encoding_method, P_ENUM,
118          NULL, NULL, NULL},
119
120         {"allow_jisx0201_kana", "FALSE", &prefs_common.allow_jisx0201_kana,
121          P_BOOL, NULL, NULL, NULL},
122
123         /* Compose */
124         {"auto_ext_editor", "FALSE", &prefs_common.auto_exteditor, P_BOOL,
125          NULL, NULL, NULL},
126         {"forward_as_attachment", "FALSE", &prefs_common.forward_as_attachment,
127          P_BOOL, NULL, NULL, NULL},
128         {"redirect_keep_from", "FALSE",
129          &prefs_common.redirect_keep_from, P_BOOL,
130          NULL, NULL, NULL},
131         {"undo_level", "50", &prefs_common.undolevels, P_INT,
132          NULL, NULL, NULL},
133
134         {"linewrap_length", "72", &prefs_common.linewrap_len, P_INT,
135          NULL, NULL, NULL},
136         {"linewrap_quotation", "TRUE", &prefs_common.linewrap_quote, P_BOOL,
137          NULL, NULL, NULL},
138         {"linewrap_auto", "TRUE", &prefs_common.autowrap, P_BOOL,
139          NULL, NULL, NULL},
140         {"linewrap_before_sending", "FALSE", &prefs_common.linewrap_at_send, P_BOOL, 
141          NULL, NULL, NULL},
142         {"autosave", "FALSE", &prefs_common.autosave,
143          P_BOOL, NULL, NULL, NULL},
144         {"autosave_length", "50", &prefs_common.autosave_length, P_INT,
145          NULL, NULL, NULL},
146 #if USE_ASPELL
147         {"enable_aspell", "TRUE", &prefs_common.enable_aspell, P_BOOL,
148          NULL, NULL, NULL},
149         {"aspell_path", ASPELL_PATH, &prefs_common.aspell_path, P_STRING,
150          NULL, NULL, NULL},
151         {"dictionary",  "", &prefs_common.dictionary, P_STRING,
152          NULL, NULL, NULL},
153         {"aspell_sugmode", "1", &prefs_common.aspell_sugmode, P_INT,
154          NULL, NULL, NULL},
155         {"use_alternate_dict", "FALSE", &prefs_common.use_alternate, P_BOOL,
156          NULL, NULL, NULL},
157         {"check_while_typing", "TRUE", &prefs_common.check_while_typing, P_BOOL,
158          NULL, NULL, NULL},
159         {"misspelled_color", "16711680", &prefs_common.misspelled_col, P_COLOR,
160          NULL, NULL, NULL},
161 #endif
162         {"reply_with_quote", "TRUE", &prefs_common.reply_with_quote, P_BOOL,
163          NULL, NULL, NULL},
164
165         /* Account autoselection */
166         {"reply_account_autoselect", "TRUE",
167          &prefs_common.reply_account_autosel, P_BOOL,
168          NULL, NULL, NULL},
169         {"forward_account_autoselect", "TRUE",
170          &prefs_common.forward_account_autosel, P_BOOL,
171          NULL, NULL, NULL},
172         {"reedit_account_autoselect", "TRUE",
173          &prefs_common.reedit_account_autosel, P_BOOL,
174          NULL, NULL, NULL},
175
176         {"default_reply_list", "TRUE", &prefs_common.default_reply_list, P_BOOL,
177          NULL, NULL, NULL},
178
179         {"show_ruler", "TRUE", &prefs_common.show_ruler, P_BOOL,
180          NULL, NULL, NULL},
181
182         /* Quote */
183         {"reply_quote_mark", "> ", &prefs_common.quotemark, P_STRING,
184          NULL, NULL, NULL},
185         {"reply_quote_format", "On %d\\n%f wrote:\\n\\n%q",
186          &prefs_common.quotefmt, P_STRING, NULL, NULL, NULL},
187
188         {"forward_quote_mark", "> ", &prefs_common.fw_quotemark, P_STRING,
189          NULL, NULL, NULL},
190         {"forward_quote_format",
191          "\\n\\nBegin forwarded message:\\n\\n"
192          "?d{Date: %d\\n}?f{From: %f\\n}?t{To: %t\\n}?c{Cc: %c\\n}"
193          "?n{Newsgroups: %n\\n}?s{Subject: %s\\n}\\n\\n%M",
194          &prefs_common.fw_quotefmt, P_STRING, NULL, NULL, NULL},
195         {"quote_chars", ">", &prefs_common.quote_chars, P_STRING,
196          NULL, NULL, NULL},
197
198         /* Display */
199         /* Obsolete fonts. For coexisting with Gtk+-1.2 version */
200         {"widget_font",         NULL,
201           &prefs_common.widgetfont_gtk1,        P_STRING, NULL, NULL, NULL},
202         {"message_font",        "-misc-fixed-medium-r-normal--14-*-*-*-*-*-*-*",
203          &prefs_common.textfont_gtk1,           P_STRING, NULL, NULL, NULL},
204         {"small_font",          "-*-helvetica-medium-r-normal--10-*-*-*-*-*-*-*",
205           &prefs_common.smallfont_gtk1,         P_STRING, NULL, NULL, NULL},
206         {"bold_font",           "-*-helvetica-bold-r-normal--12-*-*-*-*-*-*-*",
207           &prefs_common.boldfont_gtk1,          P_STRING, NULL, NULL, NULL},
208         {"normal_font",         "-*-helvetica-medium-r-normal--12-*-*-*-*-*-*-*",
209           &prefs_common.normalfont_gtk1,        P_STRING, NULL, NULL, NULL},
210
211         /* new fonts */
212         {"widget_font_gtk2",    NULL,
213           &prefs_common.widgetfont,             P_STRING, NULL, NULL, NULL},
214         {"message_font_gtk2",   "Monospace 9",
215          &prefs_common.textfont,                P_STRING, NULL, NULL, NULL},
216         {"small_font_gtk2",     "Sans 9",
217           &prefs_common.smallfont,              P_STRING, NULL, NULL, NULL},
218         {"bold_font_gtk2",      "Sans Bold 9",
219           &prefs_common.boldfont,               P_STRING, NULL, NULL, NULL},
220         {"normal_font_gtk2",    "Sans 9", 
221           &prefs_common.normalfont,             P_STRING, NULL, NULL, NULL},
222
223         /* image viewer */
224         {"display_image", "TRUE", &prefs_common.display_img, P_BOOL,
225          NULL, NULL, NULL},
226         {"resize_image", "TRUE", &prefs_common.resize_img, P_BOOL,
227          NULL, NULL, NULL},
228         {"inline_image", "TRUE", &prefs_common.inline_img, P_BOOL,
229          NULL, NULL, NULL},
230
231         {"display_folder_unread_num", "TRUE",
232          &prefs_common.display_folder_unread, P_BOOL,
233          NULL, NULL, NULL},
234         {"newsgroup_abbrev_len", "16",
235          &prefs_common.ng_abbrev_len, P_INT,
236          NULL, NULL, NULL},
237
238         {"translate_header", "TRUE", &prefs_common.trans_hdr, P_BOOL,
239          NULL, NULL, NULL},
240
241         /* Display: Summary View */
242         {"use_address_book", "FALSE", &prefs_common.use_addr_book, P_BOOL,
243          NULL, NULL, NULL},
244         {"thread_by_subject", "TRUE", &prefs_common.thread_by_subject, P_BOOL,
245          NULL, NULL, NULL},
246         {"date_format", "%y/%m/%d(%a) %H:%M", &prefs_common.date_format,
247          P_STRING, NULL, NULL, NULL},
248
249         {"enable_rules_hint", "TRUE", &prefs_common.enable_rules_hint, P_BOOL,
250          NULL, NULL, NULL},
251         {"enable_hscrollbar", "TRUE", &prefs_common.enable_hscrollbar, P_BOOL,
252          NULL, NULL, NULL},
253         {"bold_unread", "TRUE", &prefs_common.bold_unread, P_BOOL,
254          NULL, NULL, NULL},
255         {"thread_by_subject_max_age", "10", &prefs_common.thread_by_subject_max_age,
256         P_INT, NULL, NULL, NULL },
257
258         {"enable_thread", "TRUE", &prefs_common.enable_thread, P_BOOL,
259          NULL, NULL, NULL},
260         {"toolbar_style", "3", &prefs_common.toolbar_style, P_ENUM,
261          NULL, NULL, NULL},
262         {"toolbar_detachable", "TRUE", &prefs_common.toolbar_detachable, P_BOOL,
263          NULL, NULL, NULL},
264         {"show_statusbar", "TRUE", &prefs_common.show_statusbar, P_BOOL,
265          NULL, NULL, NULL},
266         {"show_searchbar", "TRUE", &prefs_common.show_searchbar, P_BOOL,
267          NULL, NULL, NULL},
268
269         {"folderview_vscrollbar_policy", "0",
270          &prefs_common.folderview_vscrollbar_policy, P_ENUM,
271          NULL, NULL, NULL},
272
273         {"summary_col_show_mark", "TRUE",
274          &prefs_common.summary_col_visible[S_COL_MARK], P_BOOL, NULL, NULL, NULL},
275         {"summary_col_show_unread", "TRUE",
276          &prefs_common.summary_col_visible[S_COL_STATUS], P_BOOL, NULL, NULL, NULL},
277         {"summary_col_show_mime", "TRUE",
278          &prefs_common.summary_col_visible[S_COL_MIME], P_BOOL, NULL, NULL, NULL},
279         {"summary_col_show_subject", "TRUE",
280          &prefs_common.summary_col_visible[S_COL_SUBJECT], P_BOOL, NULL, NULL, NULL},
281         {"summary_col_show_from", "TRUE",
282          &prefs_common.summary_col_visible[S_COL_FROM], P_BOOL, NULL, NULL, NULL},
283         {"summary_col_show_to", "FALSE",
284          &prefs_common.summary_col_visible[S_COL_TO], P_BOOL, NULL, NULL, NULL},
285         {"summary_col_show_date", "TRUE",
286          &prefs_common.summary_col_visible[S_COL_DATE], P_BOOL, NULL, NULL, NULL},
287         {"summary_col_show_size", "TRUE",
288          &prefs_common.summary_col_visible[S_COL_SIZE], P_BOOL, NULL, NULL, NULL},
289         {"summary_col_show_number", "FALSE",
290          &prefs_common.summary_col_visible[S_COL_NUMBER], P_BOOL, NULL, NULL, NULL},
291         {"summary_col_show_score", "FALSE",
292          &prefs_common.summary_col_visible[S_COL_SCORE], P_BOOL, NULL, NULL, NULL},
293         {"summary_col_show_locked", "FALSE",
294          &prefs_common.summary_col_visible[S_COL_LOCKED], P_BOOL, NULL, NULL, NULL},
295
296         {"summary_col_pos_mark", "0",
297           &prefs_common.summary_col_pos[S_COL_MARK], P_INT, NULL, NULL, NULL},
298         {"summary_col_pos_unread", "1",
299           &prefs_common.summary_col_pos[S_COL_STATUS], P_INT, NULL, NULL, NULL},
300         {"summary_col_pos_mime", "2",
301           &prefs_common.summary_col_pos[S_COL_MIME], P_INT, NULL, NULL, NULL},
302         {"summary_col_pos_subject", "3",
303           &prefs_common.summary_col_pos[S_COL_SUBJECT], P_INT, NULL, NULL, NULL},
304         {"summary_col_pos_from", "4",
305           &prefs_common.summary_col_pos[S_COL_FROM], P_INT, NULL, NULL, NULL},
306         {"summary_col_pos_date", "5",
307           &prefs_common.summary_col_pos[S_COL_DATE], P_INT, NULL, NULL, NULL},
308         {"summary_col_pos_size", "6",
309           &prefs_common.summary_col_pos[S_COL_SIZE], P_INT, NULL, NULL, NULL},
310         {"summary_col_pos_number", "7",
311           &prefs_common.summary_col_pos[S_COL_NUMBER], P_INT, NULL, NULL, NULL},
312         {"summary_col_pos_score", "8",
313          &prefs_common.summary_col_pos[S_COL_SCORE], P_INT, NULL, NULL, NULL},
314         {"summary_col_pos_locked", "9",
315          &prefs_common.summary_col_pos[S_COL_LOCKED], P_INT, NULL, NULL, NULL},
316         {"summary_col_pos_to", "10",
317           &prefs_common.summary_col_pos[S_COL_TO], P_INT, NULL, NULL, NULL},
318
319         {"summary_col_size_mark", "10",
320          &prefs_common.summary_col_size[S_COL_MARK], P_INT, NULL, NULL, NULL},
321         {"summary_col_size_unread", "13",
322          &prefs_common.summary_col_size[S_COL_STATUS], P_INT, NULL, NULL, NULL},
323         {"summary_col_size_mime", "10",
324          &prefs_common.summary_col_size[S_COL_MIME], P_INT, NULL, NULL, NULL},
325         {"summary_col_size_subject", "200",
326          &prefs_common.summary_col_size[S_COL_SUBJECT], P_INT, NULL, NULL, NULL},
327         {"summary_col_size_from", "120",
328          &prefs_common.summary_col_size[S_COL_FROM], P_INT, NULL, NULL, NULL},
329         {"summary_col_size_to", "120",
330          &prefs_common.summary_col_size[S_COL_TO], P_INT, NULL, NULL, NULL},
331         {"summary_col_size_date", "118",
332          &prefs_common.summary_col_size[S_COL_DATE], P_INT, NULL, NULL, NULL},
333         {"summary_col_size_size", "45",
334          &prefs_common.summary_col_size[S_COL_SIZE], P_INT, NULL, NULL, NULL},
335         {"summary_col_size_number", "40",
336          &prefs_common.summary_col_size[S_COL_NUMBER], P_INT, NULL, NULL, NULL},
337         {"summary_col_size_score", "40",
338          &prefs_common.summary_col_size[S_COL_SCORE], P_INT, NULL, NULL, NULL},
339         {"summary_col_size_locked", "13",
340          &prefs_common.summary_col_size[S_COL_LOCKED], P_INT, NULL, NULL, NULL},
341
342         /* Widget size */
343         {"folderwin_x", "16", &prefs_common.folderwin_x, P_INT,
344          NULL, NULL, NULL},
345         {"folderwin_y", "16", &prefs_common.folderwin_y, P_INT,
346          NULL, NULL, NULL},
347         {"folderview_width", "179", &prefs_common.folderview_width, P_INT,
348          NULL, NULL, NULL},
349         {"folderview_height", "450", &prefs_common.folderview_height, P_INT,
350          NULL, NULL, NULL},
351         {"folderview_visible", "TRUE", &prefs_common.folderview_visible, P_BOOL,
352          NULL, NULL, NULL},
353
354         {"folder_col_show_folder", "TRUE",
355          &prefs_common.folder_col_visible[F_COL_FOLDER], P_BOOL, NULL, NULL, NULL},
356         {"folder_col_show_new", "TRUE",
357          &prefs_common.folder_col_visible[F_COL_NEW], P_BOOL, NULL, NULL, NULL},
358         {"folder_col_show_unread", "TRUE",
359          &prefs_common.folder_col_visible[F_COL_UNREAD], P_BOOL, NULL, NULL, NULL},
360         {"folder_col_show_total", "TRUE",
361          &prefs_common.folder_col_visible[F_COL_TOTAL], P_BOOL, NULL, NULL, NULL},
362
363         {"folder_col_pos_folder", "0",
364          &prefs_common.folder_col_pos[F_COL_FOLDER], P_INT, NULL, NULL, NULL},
365         {"folder_col_pos_new", "1",
366          &prefs_common.folder_col_pos[F_COL_NEW], P_INT, NULL, NULL, NULL},
367         {"folder_col_pos_unread", "2",
368          &prefs_common.folder_col_pos[F_COL_UNREAD], P_INT, NULL, NULL, NULL},
369         {"folder_col_pos_total", "3",
370          &prefs_common.folder_col_pos[F_COL_TOTAL], P_INT, NULL, NULL, NULL},
371
372         {"folder_col_size_folder", "150",
373          &prefs_common.folder_col_size[F_COL_FOLDER], P_INT, NULL, NULL, NULL},
374         {"folder_col_size_new", "32",
375          &prefs_common.folder_col_size[F_COL_NEW], P_INT, NULL, NULL, NULL},
376         {"folder_col_size_unread", "32",
377          &prefs_common.folder_col_size[F_COL_UNREAD], P_INT, NULL, NULL, NULL},
378         {"folder_col_size_total", "32",
379          &prefs_common.folder_col_size[F_COL_TOTAL], P_INT, NULL, NULL, NULL},
380
381         {"summaryview_width", "600", &prefs_common.summaryview_width, P_INT,
382          NULL, NULL, NULL},
383         {"summaryview_height", "157", &prefs_common.summaryview_height, P_INT,
384          NULL, NULL, NULL},
385
386         {"main_messagewin_x", "256", &prefs_common.main_msgwin_x, P_INT,
387          NULL, NULL, NULL},
388         {"main_messagewin_y", "210", &prefs_common.main_msgwin_y, P_INT,
389          NULL, NULL, NULL},
390         {"messageview_width", "600", &prefs_common.msgview_width, P_INT,
391          NULL, NULL, NULL},
392         {"messageview_height", "300", &prefs_common.msgview_height, P_INT,
393          NULL, NULL, NULL},
394         {"messageview_visible", "TRUE", &prefs_common.msgview_visible, P_BOOL,
395          NULL, NULL, NULL},
396
397         {"mainview_x", "64", &prefs_common.mainview_x, P_INT,
398          NULL, NULL, NULL},
399         {"mainview_y", "64", &prefs_common.mainview_y, P_INT,
400          NULL, NULL, NULL},
401         {"mainview_width", "600", &prefs_common.mainview_width, P_INT,
402          NULL, NULL, NULL},
403         {"mainview_height", "600", &prefs_common.mainview_height, P_INT,
404          NULL, NULL, NULL},
405         {"mainwin_x", "64", &prefs_common.mainwin_x, P_INT,
406          NULL, NULL, NULL},
407         {"mainwin_y", "64", &prefs_common.mainwin_y, P_INT,
408          NULL, NULL, NULL},
409         {"mainwin_width", "800", &prefs_common.mainwin_width, P_INT,
410          NULL, NULL, NULL},
411         {"mainwin_height", "600", &prefs_common.mainwin_height, P_INT,
412          NULL, NULL, NULL},
413         {"messagewin_width", "600", &prefs_common.msgwin_width, P_INT,
414          NULL, NULL, NULL},
415         {"messagewin_height", "540", &prefs_common.msgwin_height, P_INT,
416          NULL, NULL, NULL},
417         {"sourcewin_width", "600", &prefs_common.sourcewin_width, P_INT,
418          NULL, NULL, NULL},
419         {"sourcewin_height", "500", &prefs_common.sourcewin_height, P_INT,
420          NULL, NULL, NULL},
421         {"compose_width", "600", &prefs_common.compose_width, P_INT,
422          NULL, NULL, NULL},
423         {"compose_height", "560", &prefs_common.compose_height, P_INT,
424          NULL, NULL, NULL},
425         {"compose_x", "0", &prefs_common.compose_x, P_INT,
426          NULL, NULL, NULL},
427         {"compose_y", "0", &prefs_common.compose_y, P_INT,
428          NULL, NULL, NULL},
429         /* Message */
430         {"enable_color", "TRUE", &prefs_common.enable_color, P_BOOL,
431          NULL, NULL, NULL},
432
433         {"quote_level1_color", "179", &prefs_common.quote_level1_col, P_COLOR,
434          NULL, NULL, NULL},
435         {"quote_level2_color", "179", &prefs_common.quote_level2_col, P_COLOR,
436          NULL, NULL, NULL},
437         {"quote_level3_color", "179", &prefs_common.quote_level3_col, P_COLOR,
438          NULL, NULL, NULL},
439         {"uri_color", "32512", &prefs_common.uri_col, P_COLOR,
440          NULL, NULL, NULL},
441         {"target_folder_color", "14294218", &prefs_common.tgt_folder_col, P_COLOR,
442          NULL, NULL, NULL},
443         {"signature_color", "7960953", &prefs_common.signature_col, P_COLOR,
444          NULL, NULL, NULL},
445         {"recycle_quote_colors", "FALSE", &prefs_common.recycle_quote_colors,
446          P_BOOL, NULL, NULL, NULL},
447
448         {"convert_mb_alnum", "FALSE", &prefs_common.conv_mb_alnum, P_BOOL,
449          NULL, NULL, NULL},
450         {"display_header_pane", "TRUE", &prefs_common.display_header_pane,
451          P_BOOL, NULL, NULL, NULL},
452         {"display_header", "TRUE", &prefs_common.display_header, P_BOOL,
453          NULL, NULL, NULL},
454         {"render_html", "TRUE", &prefs_common.render_html, P_BOOL,
455          NULL, NULL, NULL},
456         {"textview_cursor_visible", "FALSE",
457          &prefs_common.textview_cursor_visible, P_BOOL,
458          NULL, NULL, NULL},
459         {"line_space", "2", &prefs_common.line_space, P_INT,
460          NULL, NULL, NULL},
461
462         {"enable_smooth_scroll", "FALSE",
463          &prefs_common.enable_smooth_scroll, P_BOOL,
464          NULL, NULL, NULL},
465         {"scroll_step", "1", &prefs_common.scroll_step, P_INT,
466          NULL, NULL, NULL},
467         {"scroll_half_page", "FALSE", &prefs_common.scroll_halfpage, P_BOOL,
468          NULL, NULL, NULL},
469
470         {"show_other_header", "FALSE", &prefs_common.show_other_header, P_BOOL,
471          NULL, NULL, NULL},
472
473         {"attach_desc", "TRUE", &prefs_common.attach_desc, P_BOOL,
474          NULL, NULL, NULL},
475         {"attach_save_directory", NULL,
476          &prefs_common.attach_save_dir, P_STRING, NULL, NULL, NULL},
477
478         /* MIME viewer */
479         {"mime_image_viewer", "display '%s'",
480          &prefs_common.mime_image_viewer, P_STRING, NULL, NULL, NULL},
481         {"mime_audio_player", "play '%s'",
482          &prefs_common.mime_audio_player, P_STRING, NULL, NULL, NULL},
483         {"mime_open_command", "gedit '%s'",
484          &prefs_common.mime_open_cmd, P_STRING, NULL, NULL, NULL},
485
486         /* Interface */
487         {"separate_folder", "FALSE", &prefs_common.sep_folder, P_BOOL,
488          NULL, NULL, NULL},
489         {"separate_message", "FALSE", &prefs_common.sep_msg, P_BOOL,
490          NULL, NULL, NULL},
491
492         /* {"emulate_emacs", "FALSE", &prefs_common.emulate_emacs, P_BOOL,
493          NULL, NULL, NULL}, */
494         {"always_show_message_when_selected", "FALSE",
495          &prefs_common.always_show_msg,
496          P_BOOL, NULL, NULL, NULL},
497         {"select_on_entry", NULL, &prefs_common.select_on_entry,
498          P_ENUM, NULL, NULL, NULL},
499         {"mark_as_read_on_new_window", "FALSE",
500          &prefs_common.mark_as_read_on_new_window,
501          P_BOOL, NULL, NULL, NULL},
502         {"mark_as_read_delay", "0",
503          &prefs_common.mark_as_read_delay, P_INT, 
504          NULL, NULL, NULL},
505         {"open_inbox_on_inc", "FALSE", &prefs_common.open_inbox_on_inc,
506          P_BOOL, NULL, NULL, NULL},
507         {"immediate_execution", "TRUE", &prefs_common.immediate_exec, P_BOOL,
508          NULL, NULL, NULL},
509         {"nextunreadmsg_dialog", NULL, &prefs_common.next_unread_msg_dialog, P_ENUM,
510          NULL, NULL, NULL},
511
512         {"pixmap_theme_path", DEFAULT_PIXMAP_THEME, 
513          &prefs_common.pixmap_theme_path, P_STRING,
514          NULL, NULL, NULL},
515
516         {"hover_timeout", "500", &prefs_common.hover_timeout, P_INT,
517          NULL, NULL, NULL},
518         
519         /* Other */
520         {"uri_open_command", DEFAULT_BROWSER_CMD,
521          &prefs_common.uri_cmd, P_STRING, NULL, NULL, NULL},
522         {"print_command", "lpr %s", &prefs_common.print_cmd, P_STRING,
523          NULL, NULL, NULL},
524         {"ext_editor_command", "gedit %s",
525          &prefs_common.ext_editor_cmd, P_STRING, NULL, NULL, NULL},
526
527         {"add_address_by_click", "FALSE", &prefs_common.add_address_by_click,
528          P_BOOL, NULL, NULL, NULL},
529         {"confirm_on_exit", "FALSE", &prefs_common.confirm_on_exit, P_BOOL,
530          NULL, NULL, NULL},
531         {"clean_trash_on_exit", "FALSE", &prefs_common.clean_on_exit, P_BOOL,
532          NULL, NULL, NULL},
533         {"ask_on_cleaning", "TRUE", &prefs_common.ask_on_clean, P_BOOL,
534          NULL, NULL, NULL},
535         {"warn_queued_on_exit", "TRUE", &prefs_common.warn_queued_on_exit,
536          P_BOOL, NULL, NULL, NULL},
537         {"work_offline", "FALSE", &prefs_common.work_offline, P_BOOL,
538          NULL, NULL, NULL},
539         {"summary_quicksearch_type", "0", &prefs_common.summary_quicksearch_type, P_INT,
540          NULL, NULL, NULL},
541         {"summary_quicksearch_sticky", "1", &prefs_common.summary_quicksearch_sticky, P_INT,
542          NULL, NULL, NULL},
543         {"summary_quicksearch_recurse", "1", &prefs_common.summary_quicksearch_recurse, P_INT,
544          NULL, NULL, NULL},
545
546         {"io_timeout_secs", "60", &prefs_common.io_timeout_secs,
547          P_INT, NULL, NULL, NULL},
548         {"hide_score", "-9999", &prefs_common.kill_score, P_INT,
549          NULL, NULL, NULL},
550         {"important_score", "1", &prefs_common.important_score, P_INT,
551          NULL, NULL, NULL},
552         {"clip_log", "TRUE", &prefs_common.cliplog, P_BOOL,
553          NULL, NULL, NULL},
554         {"log_length", "500", &prefs_common.loglength, P_INT,
555          NULL, NULL, NULL},
556
557         {"cache_max_mem_usage", "4096", &prefs_common.cache_max_mem_usage, P_INT,
558          NULL, NULL, NULL},
559         {"cache_min_keep_time", "15", &prefs_common.cache_min_keep_time, P_INT,
560          NULL, NULL, NULL},
561
562         {"color_new", "179", &prefs_common.color_new, P_COLOR,
563          NULL, NULL, NULL},
564
565         {"filteringwin_width", "500", &prefs_common.filteringwin_width, P_INT,
566          NULL, NULL, NULL},
567         {"filteringwin_height", "-1", &prefs_common.filteringwin_height, P_INT,
568          NULL, NULL, NULL},
569         {"warn_dnd", "1", &prefs_common.warn_dnd, P_INT,
570          NULL, NULL, NULL},
571
572         {NULL, NULL, NULL, P_OTHER, NULL, NULL, NULL}
573 };
574
575 PrefsCommon *prefs_common_get(void)
576 {
577         return &prefs_common;
578 }
579
580 /*
581  * Read history list from the specified history file
582  */
583 GList *prefs_common_read_history(const gchar *history) 
584 {
585         FILE *fp;
586         gchar *path;
587         gchar buf[PREFSBUFSIZE];
588         GList *tmp = NULL;
589
590         path = g_strconcat(get_rc_dir(), G_DIR_SEPARATOR_S, history,
591                            NULL);
592         if ((fp = fopen(path, "rb")) == NULL) {
593                 if (ENOENT != errno) FILE_OP_ERROR(path, "fopen");
594                 g_free(path);
595                 return NULL;
596         }
597         g_free(path);
598         while (fgets(buf, sizeof(buf), fp) != NULL) {
599                 g_strstrip(buf);
600                 if (buf[0] == '\0') continue;
601                 tmp = add_history(tmp, buf);
602         }
603         fclose(fp);
604
605         tmp = g_list_reverse(tmp);
606
607         return tmp;
608 }
609
610 void prefs_common_read_config(void)
611 {
612         gchar *rcpath;
613         
614         rcpath = g_strconcat(get_rc_dir(), G_DIR_SEPARATOR_S, COMMON_RC, NULL);
615         prefs_read_config(param, "Common", rcpath, NULL);
616         g_free(rcpath);
617         
618         prefs_common.mime_open_cmd_history =
619                 prefs_common_read_history(COMMAND_HISTORY);
620         prefs_common.summary_quicksearch_history =
621                 prefs_common_read_history(QUICKSEARCH_HISTORY);
622 }
623
624 /*
625  * Save history list to the specified history file
626  */
627 void prefs_common_save_history(const gchar *history, GList *list)
628 {
629         GList *cur;
630         FILE *fp;
631         gchar *path;
632
633         path = g_strconcat(get_rc_dir(), G_DIR_SEPARATOR_S, history,
634                            NULL);
635         if ((fp = fopen(path, "wb")) == NULL) {
636                 FILE_OP_ERROR(path, "fopen");
637                 g_free(path);
638                 return;
639         }
640
641         for (cur = list; cur != NULL; cur = cur->next) {
642                 fputs((gchar *)cur->data, fp);
643                 fputc('\n', fp);
644         }
645
646         fclose(fp);
647         g_free(path);
648 }
649
650 void prefs_common_write_config(void)
651 {
652         prefs_write_config(param, "Common", COMMON_RC);
653
654         prefs_common_save_history(COMMAND_HISTORY, 
655                 prefs_common.mime_open_cmd_history);
656         prefs_common_save_history(QUICKSEARCH_HISTORY, 
657                 prefs_common.summary_quicksearch_history);
658 }
659
660 void pref_set_textview_from_pref(GtkTextView *textview, gchar *txt)
661 {
662         GtkTextBuffer *buffer = gtk_text_view_get_buffer(textview);
663         gchar *o_out, *out = malloc(txt?(strlen(txt)+1):1);
664         gchar *t = txt;
665         memset(out, 0, strlen(txt)+1);
666         o_out = out;
667         while (*t != '\0') {
668                 if (*t == '\\' && *(t+1) == 'n') {
669                         *out++ = '\n';
670                         t++;
671                 } else if (*t == '\\') {
672                         t++;
673                 } else {
674                         *out++ = *t;
675                 }
676                 t++;
677         }
678         *out='\0';
679
680         gtk_text_buffer_set_text(buffer, o_out?o_out:"", -1);
681         g_free(o_out);
682 }
683
684 gchar *pref_get_pref_from_textview(GtkTextView *textview) 
685 {
686         GtkTextBuffer *buffer;
687         GtkTextIter start, end;
688         gchar *o_out, *out, *tmp, *t;
689         
690         buffer = gtk_text_view_get_buffer(textview);
691         gtk_text_buffer_get_start_iter(buffer, &start);
692         gtk_text_buffer_get_iter_at_offset(buffer, &end, -1);
693         tmp = gtk_text_buffer_get_text(buffer, &start, &end, FALSE);
694         t = tmp;
695         o_out = out = malloc(2*strlen(tmp)+1);
696         
697         while (*t != '\0') {
698                 if (*t == '\n') {
699                         *out++ = '\\';
700                         *out++ = 'n';
701                 } else if (*t == '\\') {
702                         *out++ = '\\';
703                         *out++ = '\\';
704                 } else {
705                         *out++ = *t;
706                 }
707                 t++;
708         }
709         *out = '\0';
710         g_free(tmp);
711
712         return o_out;
713 }