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