2005-08-19 [paul] 1.9.13cvs40
[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         {"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", "display '%s'",
482          &prefs_common.mime_image_viewer, P_STRING, NULL, NULL, NULL},
483         {"mime_audio_player", "play '%s'",
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
494         /* {"emulate_emacs", "FALSE", &prefs_common.emulate_emacs, P_BOOL,
495          NULL, NULL, NULL}, */
496         {"always_show_message_when_selected", "FALSE",
497          &prefs_common.always_show_msg,
498          P_BOOL, NULL, NULL, NULL},
499         {"select_on_entry", NULL, &prefs_common.select_on_entry,
500          P_ENUM, NULL, NULL, NULL},
501         {"mark_as_read_on_new_window", "FALSE",
502          &prefs_common.mark_as_read_on_new_window,
503          P_BOOL, NULL, NULL, NULL},
504         {"mark_as_read_delay", "0",
505          &prefs_common.mark_as_read_delay, P_INT, 
506          NULL, NULL, NULL},
507         {"open_inbox_on_inc", "FALSE", &prefs_common.open_inbox_on_inc,
508          P_BOOL, NULL, NULL, NULL},
509         {"immediate_execution", "TRUE", &prefs_common.immediate_exec, P_BOOL,
510          NULL, NULL, NULL},
511         {"nextunreadmsg_dialog", NULL, &prefs_common.next_unread_msg_dialog, P_ENUM,
512          NULL, NULL, NULL},
513
514         {"pixmap_theme_path", DEFAULT_PIXMAP_THEME, 
515          &prefs_common.pixmap_theme_path, P_STRING,
516          NULL, NULL, NULL},
517
518         {"hover_timeout", "500", &prefs_common.hover_timeout, P_INT,
519          NULL, NULL, NULL},
520         
521         /* Other */
522         {"uri_open_command", DEFAULT_BROWSER_CMD,
523          &prefs_common.uri_cmd, P_STRING, NULL, NULL, NULL},
524         {"print_command", "lpr %s", &prefs_common.print_cmd, P_STRING,
525          NULL, NULL, NULL},
526         {"ext_editor_command", "gedit %s",
527          &prefs_common.ext_editor_cmd, P_STRING, NULL, NULL, NULL},
528
529         {"add_address_by_click", "FALSE", &prefs_common.add_address_by_click,
530          P_BOOL, NULL, NULL, NULL},
531         {"confirm_on_exit", "FALSE", &prefs_common.confirm_on_exit, P_BOOL,
532          NULL, NULL, NULL},
533         {"clean_trash_on_exit", "FALSE", &prefs_common.clean_on_exit, P_BOOL,
534          NULL, NULL, NULL},
535         {"ask_on_cleaning", "TRUE", &prefs_common.ask_on_clean, P_BOOL,
536          NULL, NULL, NULL},
537         {"warn_queued_on_exit", "TRUE", &prefs_common.warn_queued_on_exit,
538          P_BOOL, NULL, NULL, NULL},
539         {"work_offline", "FALSE", &prefs_common.work_offline, P_BOOL,
540          NULL, NULL, NULL},
541         {"summary_quicksearch_type", "0", &prefs_common.summary_quicksearch_type, P_INT,
542          NULL, NULL, NULL},
543         {"summary_quicksearch_sticky", "1", &prefs_common.summary_quicksearch_sticky, P_INT,
544          NULL, NULL, NULL},
545         {"summary_quicksearch_recurse", "1", &prefs_common.summary_quicksearch_recurse, P_INT,
546          NULL, NULL, NULL},
547
548         {"io_timeout_secs", "60", &prefs_common.io_timeout_secs,
549          P_INT, NULL, NULL, NULL},
550         {"hide_score", "-9999", &prefs_common.kill_score, P_INT,
551          NULL, NULL, NULL},
552         {"important_score", "1", &prefs_common.important_score, P_INT,
553          NULL, NULL, NULL},
554         {"clip_log", "TRUE", &prefs_common.cliplog, P_BOOL,
555          NULL, NULL, NULL},
556         {"log_length", "500", &prefs_common.loglength, P_INT,
557          NULL, NULL, NULL},
558
559         {"cache_max_mem_usage", "4096", &prefs_common.cache_max_mem_usage, P_INT,
560          NULL, NULL, NULL},
561         {"cache_min_keep_time", "15", &prefs_common.cache_min_keep_time, P_INT,
562          NULL, NULL, NULL},
563
564         {"color_new", "179", &prefs_common.color_new, P_COLOR,
565          NULL, NULL, NULL},
566
567         {"filteringwin_width", "500", &prefs_common.filteringwin_width, P_INT,
568          NULL, NULL, NULL},
569         {"filteringwin_height", "-1", &prefs_common.filteringwin_height, P_INT,
570          NULL, NULL, NULL},
571         {"warn_dnd", "1", &prefs_common.warn_dnd, P_INT,
572          NULL, NULL, NULL},
573
574         {NULL, NULL, NULL, P_OTHER, NULL, NULL, NULL}
575 };
576
577 PrefsCommon *prefs_common_get(void)
578 {
579         return &prefs_common;
580 }
581
582 /*
583  * Read history list from the specified history file
584  */
585 GList *prefs_common_read_history(const gchar *history) 
586 {
587         FILE *fp;
588         gchar *path;
589         gchar buf[PREFSBUFSIZE];
590         GList *tmp = NULL;
591
592         path = g_strconcat(get_rc_dir(), G_DIR_SEPARATOR_S, history,
593                            NULL);
594         if ((fp = g_fopen(path, "rb")) == NULL) {
595                 if (ENOENT != errno) FILE_OP_ERROR(path, "fopen");
596                 g_free(path);
597                 return NULL;
598         }
599         g_free(path);
600         while (fgets(buf, sizeof(buf), fp) != NULL) {
601                 g_strstrip(buf);
602                 if (buf[0] == '\0') continue;
603                 tmp = add_history(tmp, buf);
604         }
605         fclose(fp);
606
607         tmp = g_list_reverse(tmp);
608
609         return tmp;
610 }
611
612 void prefs_common_read_config(void)
613 {
614         gchar *rcpath;
615         
616         rcpath = g_strconcat(get_rc_dir(), G_DIR_SEPARATOR_S, COMMON_RC, NULL);
617         prefs_read_config(param, "Common", rcpath, NULL);
618         g_free(rcpath);
619         
620         prefs_common.mime_open_cmd_history =
621                 prefs_common_read_history(COMMAND_HISTORY);
622         prefs_common.summary_quicksearch_history =
623                 prefs_common_read_history(QUICKSEARCH_HISTORY);
624 }
625
626 /*
627  * Save history list to the specified history file
628  */
629 void prefs_common_save_history(const gchar *history, GList *list)
630 {
631         GList *cur;
632         FILE *fp;
633         gchar *path;
634
635         path = g_strconcat(get_rc_dir(), G_DIR_SEPARATOR_S, history,
636                            NULL);
637         if ((fp = g_fopen(path, "wb")) == NULL) {
638                 FILE_OP_ERROR(path, "fopen");
639                 g_free(path);
640                 return;
641         }
642
643         for (cur = list; cur != NULL; cur = cur->next) {
644                 fputs((gchar *)cur->data, fp);
645                 fputc('\n', fp);
646         }
647
648         fclose(fp);
649         g_free(path);
650 }
651
652 void prefs_common_write_config(void)
653 {
654         prefs_write_config(param, "Common", COMMON_RC);
655
656         prefs_common_save_history(COMMAND_HISTORY, 
657                 prefs_common.mime_open_cmd_history);
658         prefs_common_save_history(QUICKSEARCH_HISTORY, 
659                 prefs_common.summary_quicksearch_history);
660 }
661
662 void pref_set_textview_from_pref(GtkTextView *textview, gchar *txt)
663 {
664         GtkTextBuffer *buffer = gtk_text_view_get_buffer(textview);
665         gchar *o_out, *out = malloc(txt?(strlen(txt)+1):1);
666         gchar *t = txt;
667         memset(out, 0, strlen(txt)+1);
668         o_out = out;
669         while (*t != '\0') {
670                 if (*t == '\\' && *(t+1) == 'n') {
671                         *out++ = '\n';
672                         t++;
673                 } else if (*t == '\\') {
674                         t++;
675                 } else {
676                         *out++ = *t;
677                 }
678                 t++;
679         }
680         *out='\0';
681
682         gtk_text_buffer_set_text(buffer, o_out?o_out:"", -1);
683         g_free(o_out);
684 }
685
686 gchar *pref_get_pref_from_textview(GtkTextView *textview) 
687 {
688         GtkTextBuffer *buffer;
689         GtkTextIter start, end;
690         gchar *o_out, *out, *tmp, *t;
691         
692         buffer = gtk_text_view_get_buffer(textview);
693         gtk_text_buffer_get_start_iter(buffer, &start);
694         gtk_text_buffer_get_iter_at_offset(buffer, &end, -1);
695         tmp = gtk_text_buffer_get_text(buffer, &start, &end, FALSE);
696         t = tmp;
697         o_out = out = malloc(2*strlen(tmp)+1);
698         
699         while (*t != '\0') {
700                 if (*t == '\n') {
701                         *out++ = '\\';
702                         *out++ = 'n';
703                 } else if (*t == '\\') {
704                         *out++ = '\\';
705                         *out++ = '\\';
706                 } else {
707                         *out++ = *t;
708                 }
709                 t++;
710         }
711         *out = '\0';
712         g_free(tmp);
713
714         return o_out;
715 }