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