0c806fc2ca8f58e778c1792f395bd2ca04eef1a4
[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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
18  */
19
20 #ifdef HAVE_CONFIG_H
21 #  include "config.h"
22 #endif
23
24 #include "defs.h"
25
26 #include <glib.h>
27 #include <glib/gi18n.h>
28 #include <gtk/gtk.h>
29 #include <gdk/gdkkeysyms.h>
30 #include <stdio.h>
31 #include <stdlib.h>
32 #include <string.h>
33 #include <unistd.h>
34 #include <sys/types.h>
35 #include <sys/stat.h>
36 #include <errno.h>
37
38 #include "main.h"
39 #include "prefs_gtk.h"
40 #include "prefs_common.h"
41 #include "prefs_display_header.h"
42 #include "prefs_summary_column.h"
43 #include "prefs_folder_column.h"
44 #include "mainwindow.h"
45 #include "summaryview.h"
46 #include "folderview.h"
47 #include "messageview.h"
48 #include "manage_window.h"
49 #include "inc.h"
50 #include "menu.h"
51 #include "codeconv.h"
52 #include "utils.h"
53 #include "gtkutils.h"
54 #include "alertpanel.h"
55 #include "folder.h"
56 #include "socket.h"
57 #include "filesel.h"
58 #include "folderview.h"
59 #include "stock_pixmap.h"
60 #include "prefswindow.h"
61
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         {"use_address_book", "FALSE", &prefs_common.use_addr_book, P_BOOL,
243          NULL, NULL, NULL},
244         {"thread_by_subject", "TRUE", &prefs_common.thread_by_subject, P_BOOL,
245          NULL, NULL, NULL},
246         {"date_format", "%y/%m/%d(%a) %H:%M", &prefs_common.date_format,
247          P_STRING, NULL, NULL, NULL},
248
249         {"bold_unread", "TRUE", &prefs_common.bold_unread, P_BOOL,
250          NULL, NULL, NULL},
251
252         {"enable_thread", "TRUE", &prefs_common.enable_thread, P_BOOL,
253          NULL, NULL, NULL},
254         {"toolbar_style", "3", &prefs_common.toolbar_style, P_ENUM,
255          NULL, NULL, NULL},
256         {"toolbar_detachable", "TRUE", &prefs_common.toolbar_detachable, P_BOOL,
257          NULL, NULL, NULL},
258         {"show_statusbar", "TRUE", &prefs_common.show_statusbar, P_BOOL,
259          NULL, NULL, NULL},
260         {"show_searchbar", "TRUE", &prefs_common.show_searchbar, P_BOOL,
261          NULL, NULL, NULL},
262
263
264         {"summary_col_show_mark", "TRUE",
265          &prefs_common.summary_col_visible[S_COL_MARK], P_BOOL, NULL, NULL, NULL},
266         {"summary_col_show_unread", "TRUE",
267          &prefs_common.summary_col_visible[S_COL_STATUS], P_BOOL, NULL, NULL, NULL},
268         {"summary_col_show_mime", "TRUE",
269          &prefs_common.summary_col_visible[S_COL_MIME], P_BOOL, NULL, NULL, NULL},
270         {"summary_col_show_subject", "TRUE",
271          &prefs_common.summary_col_visible[S_COL_SUBJECT], P_BOOL, NULL, NULL, NULL},
272         {"summary_col_show_from", "TRUE",
273          &prefs_common.summary_col_visible[S_COL_FROM], P_BOOL, NULL, NULL, NULL},
274         {"summary_col_show_to", "FALSE",
275          &prefs_common.summary_col_visible[S_COL_TO], P_BOOL, NULL, NULL, NULL},
276         {"summary_col_show_date", "TRUE",
277          &prefs_common.summary_col_visible[S_COL_DATE], P_BOOL, NULL, NULL, NULL},
278         {"summary_col_show_size", "TRUE",
279          &prefs_common.summary_col_visible[S_COL_SIZE], P_BOOL, NULL, NULL, NULL},
280         {"summary_col_show_number", "FALSE",
281          &prefs_common.summary_col_visible[S_COL_NUMBER], P_BOOL, NULL, NULL, NULL},
282         {"summary_col_show_score", "FALSE",
283          &prefs_common.summary_col_visible[S_COL_SCORE], P_BOOL, NULL, NULL, NULL},
284         {"summary_col_show_locked", "FALSE",
285          &prefs_common.summary_col_visible[S_COL_LOCKED], P_BOOL, NULL, NULL, NULL},
286
287         {"summary_col_pos_mark", "0",
288           &prefs_common.summary_col_pos[S_COL_MARK], P_INT, NULL, NULL, NULL},
289         {"summary_col_pos_unread", "1",
290           &prefs_common.summary_col_pos[S_COL_STATUS], P_INT, NULL, NULL, NULL},
291         {"summary_col_pos_mime", "2",
292           &prefs_common.summary_col_pos[S_COL_MIME], P_INT, NULL, NULL, NULL},
293         {"summary_col_pos_subject", "3",
294           &prefs_common.summary_col_pos[S_COL_SUBJECT], P_INT, NULL, NULL, NULL},
295         {"summary_col_pos_from", "4",
296           &prefs_common.summary_col_pos[S_COL_FROM], P_INT, NULL, NULL, NULL},
297         {"summary_col_pos_date", "5",
298           &prefs_common.summary_col_pos[S_COL_DATE], P_INT, NULL, NULL, NULL},
299         {"summary_col_pos_size", "6",
300           &prefs_common.summary_col_pos[S_COL_SIZE], P_INT, NULL, NULL, NULL},
301         {"summary_col_pos_number", "7",
302           &prefs_common.summary_col_pos[S_COL_NUMBER], P_INT, NULL, NULL, NULL},
303         {"summary_col_pos_score", "8",
304          &prefs_common.summary_col_pos[S_COL_SCORE], P_INT, NULL, NULL, NULL},
305         {"summary_col_pos_locked", "9",
306          &prefs_common.summary_col_pos[S_COL_LOCKED], P_INT, NULL, NULL, NULL},
307         {"summary_col_pos_to", "10",
308           &prefs_common.summary_col_pos[S_COL_TO], P_INT, NULL, NULL, NULL},
309
310         {"summary_col_size_mark", "10",
311          &prefs_common.summary_col_size[S_COL_MARK], P_INT, NULL, NULL, NULL},
312         {"summary_col_size_unread", "13",
313          &prefs_common.summary_col_size[S_COL_STATUS], P_INT, NULL, NULL, NULL},
314         {"summary_col_size_mime", "10",
315          &prefs_common.summary_col_size[S_COL_MIME], P_INT, NULL, NULL, NULL},
316         {"summary_col_size_subject", "200",
317          &prefs_common.summary_col_size[S_COL_SUBJECT], P_INT, NULL, NULL, NULL},
318         {"summary_col_size_from", "120",
319          &prefs_common.summary_col_size[S_COL_FROM], P_INT, NULL, NULL, NULL},
320         {"summary_col_size_to", "120",
321          &prefs_common.summary_col_size[S_COL_TO], P_INT, NULL, NULL, NULL},
322         {"summary_col_size_date", "118",
323          &prefs_common.summary_col_size[S_COL_DATE], P_INT, NULL, NULL, NULL},
324         {"summary_col_size_size", "45",
325          &prefs_common.summary_col_size[S_COL_SIZE], P_INT, NULL, NULL, NULL},
326         {"summary_col_size_number", "40",
327          &prefs_common.summary_col_size[S_COL_NUMBER], P_INT, NULL, NULL, NULL},
328         {"summary_col_size_score", "40",
329          &prefs_common.summary_col_size[S_COL_SCORE], P_INT, NULL, NULL, NULL},
330         {"summary_col_size_locked", "13",
331          &prefs_common.summary_col_size[S_COL_LOCKED], P_INT, NULL, NULL, NULL},
332
333         /* Widget size */
334         {"folderwin_x", "16", &prefs_common.folderwin_x, P_INT,
335          NULL, NULL, NULL},
336         {"folderwin_y", "16", &prefs_common.folderwin_y, P_INT,
337          NULL, NULL, NULL},
338         {"folderview_width", "179", &prefs_common.folderview_width, P_INT,
339          NULL, NULL, NULL},
340         {"folderview_height", "450", &prefs_common.folderview_height, P_INT,
341          NULL, NULL, NULL},
342         {"folderview_visible", "TRUE", &prefs_common.folderview_visible, P_BOOL,
343          NULL, NULL, NULL},
344
345         {"folder_col_show_folder", "TRUE",
346          &prefs_common.folder_col_visible[F_COL_FOLDER], P_BOOL, NULL, NULL, NULL},
347         {"folder_col_show_new", "TRUE",
348          &prefs_common.folder_col_visible[F_COL_NEW], P_BOOL, NULL, NULL, NULL},
349         {"folder_col_show_unread", "TRUE",
350          &prefs_common.folder_col_visible[F_COL_UNREAD], P_BOOL, NULL, NULL, NULL},
351         {"folder_col_show_total", "TRUE",
352          &prefs_common.folder_col_visible[F_COL_TOTAL], P_BOOL, NULL, NULL, NULL},
353
354         {"folder_col_pos_folder", "0",
355          &prefs_common.folder_col_pos[F_COL_FOLDER], P_INT, NULL, NULL, NULL},
356         {"folder_col_pos_new", "1",
357          &prefs_common.folder_col_pos[F_COL_NEW], P_INT, NULL, NULL, NULL},
358         {"folder_col_pos_unread", "2",
359          &prefs_common.folder_col_pos[F_COL_UNREAD], P_INT, NULL, NULL, NULL},
360         {"folder_col_pos_total", "3",
361          &prefs_common.folder_col_pos[F_COL_TOTAL], P_INT, NULL, NULL, NULL},
362
363         {"folder_col_size_folder", "150",
364          &prefs_common.folder_col_size[F_COL_FOLDER], P_INT, NULL, NULL, NULL},
365         {"folder_col_size_new", "32",
366          &prefs_common.folder_col_size[F_COL_NEW], P_INT, NULL, NULL, NULL},
367         {"folder_col_size_unread", "32",
368          &prefs_common.folder_col_size[F_COL_UNREAD], P_INT, NULL, NULL, NULL},
369         {"folder_col_size_total", "32",
370          &prefs_common.folder_col_size[F_COL_TOTAL], P_INT, NULL, NULL, NULL},
371
372         {"summaryview_width", "600", &prefs_common.summaryview_width, P_INT,
373          NULL, NULL, NULL},
374         {"summaryview_height", "157", &prefs_common.summaryview_height, P_INT,
375          NULL, NULL, NULL},
376
377         {"main_messagewin_x", "256", &prefs_common.main_msgwin_x, P_INT,
378          NULL, NULL, NULL},
379         {"main_messagewin_y", "210", &prefs_common.main_msgwin_y, P_INT,
380          NULL, NULL, NULL},
381         {"messageview_width", "600", &prefs_common.msgview_width, P_INT,
382          NULL, NULL, NULL},
383         {"messageview_height", "300", &prefs_common.msgview_height, P_INT,
384          NULL, NULL, NULL},
385         {"messageview_visible", "TRUE", &prefs_common.msgview_visible, P_BOOL,
386          NULL, NULL, NULL},
387
388         {"mainview_x", "64", &prefs_common.mainview_x, P_INT,
389          NULL, NULL, NULL},
390         {"mainview_y", "64", &prefs_common.mainview_y, P_INT,
391          NULL, NULL, NULL},
392         {"mainview_width", "600", &prefs_common.mainview_width, P_INT,
393          NULL, NULL, NULL},
394         {"mainview_height", "600", &prefs_common.mainview_height, P_INT,
395          NULL, NULL, NULL},
396         {"mainwin_x", "64", &prefs_common.mainwin_x, P_INT,
397          NULL, NULL, NULL},
398         {"mainwin_y", "64", &prefs_common.mainwin_y, P_INT,
399          NULL, NULL, NULL},
400         {"mainwin_width", "800", &prefs_common.mainwin_width, P_INT,
401          NULL, NULL, NULL},
402         {"mainwin_height", "600", &prefs_common.mainwin_height, P_INT,
403          NULL, NULL, NULL},
404         {"messagewin_width", "600", &prefs_common.msgwin_width, P_INT,
405          NULL, NULL, NULL},
406         {"messagewin_height", "540", &prefs_common.msgwin_height, P_INT,
407          NULL, NULL, NULL},
408         {"sourcewin_width", "600", &prefs_common.sourcewin_width, P_INT,
409          NULL, NULL, NULL},
410         {"sourcewin_height", "500", &prefs_common.sourcewin_height, P_INT,
411          NULL, NULL, NULL},
412         {"compose_width", "600", &prefs_common.compose_width, P_INT,
413          NULL, NULL, NULL},
414         {"compose_height", "560", &prefs_common.compose_height, P_INT,
415          NULL, NULL, NULL},
416         {"compose_x", "0", &prefs_common.compose_x, P_INT,
417          NULL, NULL, NULL},
418         {"compose_y", "0", &prefs_common.compose_y, P_INT,
419          NULL, NULL, NULL},
420         /* Message */
421         {"enable_color", "TRUE", &prefs_common.enable_color, P_BOOL,
422          NULL, NULL, NULL},
423
424         {"quote_level1_color", "179", &prefs_common.quote_level1_col, P_COLOR,
425          NULL, NULL, NULL},
426         {"quote_level2_color", "179", &prefs_common.quote_level2_col, P_COLOR,
427          NULL, NULL, NULL},
428         {"quote_level3_color", "179", &prefs_common.quote_level3_col, P_COLOR,
429          NULL, NULL, NULL},
430         {"uri_color", "32512", &prefs_common.uri_col, P_COLOR,
431          NULL, NULL, NULL},
432         {"target_folder_color", "14294218", &prefs_common.tgt_folder_col, P_COLOR,
433          NULL, NULL, NULL},
434         {"signature_color", "7960953", &prefs_common.signature_col, P_COLOR,
435          NULL, NULL, NULL},
436         {"recycle_quote_colors", "FALSE", &prefs_common.recycle_quote_colors,
437          P_BOOL, NULL, NULL, NULL},
438
439         {"convert_mb_alnum", "FALSE", &prefs_common.conv_mb_alnum, P_BOOL,
440          NULL, NULL, NULL},
441         {"display_header_pane", "TRUE", &prefs_common.display_header_pane,
442          P_BOOL, NULL, NULL, NULL},
443         {"display_header", "TRUE", &prefs_common.display_header, P_BOOL,
444          NULL, NULL, NULL},
445         {"render_html", "TRUE", &prefs_common.render_html, P_BOOL,
446          NULL, NULL, NULL},
447         {"line_space", "2", &prefs_common.line_space, P_INT,
448          NULL, NULL, NULL},
449
450         {"enable_smooth_scroll", "FALSE",
451          &prefs_common.enable_smooth_scroll, P_BOOL,
452          NULL, NULL, NULL},
453         {"scroll_step", "1", &prefs_common.scroll_step, P_INT,
454          NULL, NULL, NULL},
455         {"scroll_half_page", "FALSE", &prefs_common.scroll_halfpage, P_BOOL,
456          NULL, NULL, NULL},
457
458         {"show_other_header", "FALSE", &prefs_common.show_other_header, P_BOOL,
459          NULL, NULL, NULL},
460
461         {"attach_desc", "TRUE", &prefs_common.attach_desc, P_BOOL,
462          NULL, NULL, NULL},
463         {"attach_save_directory", NULL,
464          &prefs_common.attach_save_dir, P_STRING, NULL, NULL, NULL},
465
466         /* MIME viewer */
467         {"mime_image_viewer", DEFAULT_IMAGE_VIEWER_CMD,
468          &prefs_common.mime_image_viewer, P_STRING, NULL, NULL, NULL},
469         {"mime_audio_player", DEFAULT_AUDIO_PLAYER_CMD,
470          &prefs_common.mime_audio_player, P_STRING, NULL, NULL, NULL},
471         {"mime_open_command", "gedit '%s'",
472          &prefs_common.mime_open_cmd, P_STRING, NULL, NULL, NULL},
473
474         /* Interface */
475         {"separate_folder", "FALSE", &prefs_common.sep_folder, P_BOOL,
476          NULL, NULL, NULL},
477         {"separate_message", "FALSE", &prefs_common.sep_msg, P_BOOL,
478          NULL, NULL, NULL},
479
480         /* {"emulate_emacs", "FALSE", &prefs_common.emulate_emacs, P_BOOL,
481          NULL, NULL, NULL}, */
482         {"always_show_message_when_selected", "FALSE",
483          &prefs_common.always_show_msg,
484          P_BOOL, NULL, NULL, NULL},
485         {"select_on_entry", NULL, &prefs_common.select_on_entry,
486          P_ENUM, NULL, NULL, NULL},
487         {"mark_as_read_on_new_window", "FALSE",
488          &prefs_common.mark_as_read_on_new_window,
489          P_BOOL, NULL, NULL, NULL},
490         {"mark_as_read_delay", "0",
491          &prefs_common.mark_as_read_delay, P_INT, 
492          NULL, NULL, NULL},
493         {"open_inbox_on_inc", "FALSE", &prefs_common.open_inbox_on_inc,
494          P_BOOL, NULL, NULL, NULL},
495         {"immediate_execution", "TRUE", &prefs_common.immediate_exec, P_BOOL,
496          NULL, NULL, NULL},
497         {"nextunreadmsg_dialog", NULL, &prefs_common.next_unread_msg_dialog, P_ENUM,
498          NULL, NULL, NULL},
499
500         {"pixmap_theme_path", DEFAULT_PIXMAP_THEME, 
501          &prefs_common.pixmap_theme_path, P_STRING,
502          NULL, NULL, NULL},
503
504         {"ask_mark_all_read", "TRUE", &prefs_common.ask_mark_all_read, P_BOOL,
505          NULL, NULL, NULL},
506
507         /* Other */
508         {"uri_open_command", DEFAULT_BROWSER_CMD,
509          &prefs_common.uri_cmd, P_STRING, NULL, NULL, NULL},
510         {"print_command", "lpr %s", &prefs_common.print_cmd, P_STRING,
511          NULL, NULL, NULL},
512         {"ext_editor_command", "gedit %s",
513          &prefs_common.ext_editor_cmd, P_STRING, NULL, NULL, NULL},
514
515         {"add_address_by_click", "FALSE", &prefs_common.add_address_by_click,
516          P_BOOL, NULL, NULL, NULL},
517         {"confirm_on_exit", "FALSE", &prefs_common.confirm_on_exit, P_BOOL,
518          NULL, NULL, NULL},
519         {"clean_trash_on_exit", "FALSE", &prefs_common.clean_on_exit, P_BOOL,
520          NULL, NULL, NULL},
521         {"ask_on_cleaning", "TRUE", &prefs_common.ask_on_clean, P_BOOL,
522          NULL, NULL, NULL},
523         {"warn_queued_on_exit", "TRUE", &prefs_common.warn_queued_on_exit,
524          P_BOOL, NULL, NULL, NULL},
525         {"work_offline", "FALSE", &prefs_common.work_offline, P_BOOL,
526          NULL, NULL, NULL},
527         {"summary_quicksearch_type", "0", &prefs_common.summary_quicksearch_type, P_INT,
528          NULL, NULL, NULL},
529         {"summary_quicksearch_recurse", "1", &prefs_common.summary_quicksearch_recurse, P_INT,
530          NULL, NULL, NULL},
531
532         {"io_timeout_secs", "60", &prefs_common.io_timeout_secs,
533          P_INT, NULL, NULL, NULL},
534         {"hide_score", "-9999", &prefs_common.kill_score, P_INT,
535          NULL, NULL, NULL},
536         {"important_score", "1", &prefs_common.important_score, P_INT,
537          NULL, NULL, NULL},
538         {"clip_log", "TRUE", &prefs_common.cliplog, P_BOOL,
539          NULL, NULL, NULL},
540         {"log_length", "500", &prefs_common.loglength, P_INT,
541          NULL, NULL, NULL},
542
543         {"color_new", "179", &prefs_common.color_new, P_COLOR,
544          NULL, NULL, NULL},
545
546         {"filteringwin_width", "500", &prefs_common.filteringwin_width, P_INT,
547          NULL, NULL, NULL},
548         {"filteringwin_height", "-1", &prefs_common.filteringwin_height, P_INT,
549          NULL, NULL, NULL},
550
551         /* Hidden */
552         {"warn_dnd", "1", &prefs_common.warn_dnd, P_INT,
553          NULL, NULL, NULL},
554         {"utf8_instead_of_locale_for_broken_mail", "0", 
555          &prefs_common.broken_are_utf8, P_INT,
556          NULL, NULL, NULL},
557         {"enable_swap_from", "FALSE", &prefs_common.swap_from, P_BOOL,
558          NULL, NULL, NULL},
559         {"enable_rules_hint", "TRUE", &prefs_common.enable_rules_hint, P_BOOL,
560          NULL, NULL, NULL},
561         {"enable_hscrollbar", "TRUE", &prefs_common.enable_hscrollbar, P_BOOL,
562          NULL, NULL, NULL},
563         {"folderview_vscrollbar_policy", "0",
564          &prefs_common.folderview_vscrollbar_policy, P_ENUM,
565          NULL, NULL, NULL},
566         {"textview_cursor_visible", "FALSE",
567          &prefs_common.textview_cursor_visible, P_BOOL,
568          NULL, NULL, NULL},
569         {"hover_timeout", "500", &prefs_common.hover_timeout, P_INT,
570          NULL, NULL, NULL},
571         {"cache_max_mem_usage", "4096", &prefs_common.cache_max_mem_usage, P_INT,
572          NULL, NULL, NULL},
573         {"cache_min_keep_time", "15", &prefs_common.cache_min_keep_time, P_INT,
574          NULL, NULL, NULL},
575         {"thread_by_subject_max_age", "10", &prefs_common.thread_by_subject_max_age,
576         P_INT, NULL, NULL, NULL },
577         {"summary_quicksearch_sticky", "1", &prefs_common.summary_quicksearch_sticky, P_INT,
578          NULL, NULL, NULL},
579         {"statusbar_update_step", "10", &prefs_common.statusbar_update_step, P_INT,
580          NULL, NULL, NULL},
581
582         {NULL, NULL, NULL, P_OTHER, NULL, NULL, NULL}
583 };
584
585 PrefsCommon *prefs_common_get(void)
586 {
587         return &prefs_common;
588 }
589
590 /*
591  * Read history list from the specified history file
592  */
593 GList *prefs_common_read_history(const gchar *history) 
594 {
595         FILE *fp;
596         gchar *path;
597         gchar buf[PREFSBUFSIZE];
598         GList *tmp = NULL;
599
600         path = g_strconcat(get_rc_dir(), G_DIR_SEPARATOR_S, history,
601                            NULL);
602         if ((fp = g_fopen(path, "rb")) == NULL) {
603                 if (ENOENT != errno) FILE_OP_ERROR(path, "fopen");
604                 g_free(path);
605                 return NULL;
606         }
607         g_free(path);
608         while (fgets(buf, sizeof(buf), fp) != NULL) {
609                 g_strstrip(buf);
610                 if (buf[0] == '\0') continue;
611                 tmp = add_history(tmp, buf);
612         }
613         fclose(fp);
614
615         tmp = g_list_reverse(tmp);
616
617         return tmp;
618 }
619
620 void prefs_common_read_config(void)
621 {
622         gchar *rcpath;
623         
624         rcpath = g_strconcat(get_rc_dir(), G_DIR_SEPARATOR_S, COMMON_RC, NULL);
625         prefs_read_config(param, "Common", rcpath, NULL);
626         g_free(rcpath);
627         
628         prefs_common.mime_open_cmd_history =
629                 prefs_common_read_history(COMMAND_HISTORY);
630         prefs_common.summary_quicksearch_history =
631                 prefs_common_read_history(QUICKSEARCH_HISTORY);
632 }
633
634 /*
635  * Save history list to the specified history file
636  */
637 void prefs_common_save_history(const gchar *history, GList *list)
638 {
639         GList *cur;
640         FILE *fp;
641         gchar *path;
642
643         path = g_strconcat(get_rc_dir(), G_DIR_SEPARATOR_S, history,
644                            NULL);
645         if ((fp = g_fopen(path, "wb")) == NULL) {
646                 FILE_OP_ERROR(path, "fopen");
647                 g_free(path);
648                 return;
649         }
650
651         for (cur = list; cur != NULL; cur = cur->next) {
652                 fputs((gchar *)cur->data, fp);
653                 fputc('\n', fp);
654         }
655
656         fclose(fp);
657         g_free(path);
658 }
659
660 void prefs_common_write_config(void)
661 {
662         prefs_write_config(param, "Common", COMMON_RC);
663
664         prefs_common_save_history(COMMAND_HISTORY, 
665                 prefs_common.mime_open_cmd_history);
666         prefs_common_save_history(QUICKSEARCH_HISTORY, 
667                 prefs_common.summary_quicksearch_history);
668 }
669
670 void pref_set_textview_from_pref(GtkTextView *textview, gchar *txt)
671 {
672         GtkTextBuffer *buffer = gtk_text_view_get_buffer(textview);
673         gchar *o_out, *out = malloc(txt?(strlen(txt)+1):1);
674         gchar *t = txt;
675         memset(out, 0, strlen(txt)+1);
676         o_out = out;
677         while (*t != '\0') {
678                 if (*t == '\\' && *(t+1) == 'n') {
679                         *out++ = '\n';
680                         t++;
681                 } else if (*t == '\\') {
682                         t++;
683                 } else {
684                         *out++ = *t;
685                 }
686                 t++;
687         }
688         *out='\0';
689
690         gtk_text_buffer_set_text(buffer, o_out?o_out:"", -1);
691         g_free(o_out);
692 }
693
694 gchar *pref_get_pref_from_textview(GtkTextView *textview) 
695 {
696         GtkTextBuffer *buffer;
697         GtkTextIter start, end;
698         gchar *o_out, *out, *tmp, *t;
699         
700         buffer = gtk_text_view_get_buffer(textview);
701         gtk_text_buffer_get_start_iter(buffer, &start);
702         gtk_text_buffer_get_iter_at_offset(buffer, &end, -1);
703         tmp = gtk_text_buffer_get_text(buffer, &start, &end, FALSE);
704         t = tmp;
705         o_out = out = malloc(2*strlen(tmp)+1);
706         
707         while (*t != '\0') {
708                 if (*t == '\n') {
709                         *out++ = '\\';
710                         *out++ = 'n';
711                 } else if (*t == '\\') {
712                         *out++ = '\\';
713                         *out++ = '\\';
714                 } else {
715                         *out++ = *t;
716                 }
717                 t++;
718         }
719         *out = '\0';
720         g_free(tmp);
721
722         return o_out;
723 }