07312a8a2d8b292a94c62a2dcd0b938e7d848f4b
[claws.git] / src / prefs_common.c
1 /*
2  * Sylpheed -- a GTK+ based, lightweight, and fast e-mail client
3  * Copyright (C) 1999-2004 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 <gtk/gtk.h>
28 #include <gdk/gdkkeysyms.h>
29 #include <stdio.h>
30 #include <stdlib.h>
31 #include <string.h>
32 #include <unistd.h>
33 #include <sys/types.h>
34 #include <sys/stat.h>
35 #include <errno.h>
36
37 #include "intl.h"
38 #include "main.h"
39 #include "prefs_gtk.h"
40 #include "prefs_common.h"
41 #include "prefs_display_header.h"
42 #include "prefs_summary_column.h"
43 #include "mainwindow.h"
44 #include "summaryview.h"
45 #include "messageview.h"
46 #include "manage_window.h"
47 #include "inc.h"
48 #include "menu.h"
49 #include "codeconv.h"
50 #include "utils.h"
51 #include "gtkutils.h"
52 #include "alertpanel.h"
53 #include "folder.h"
54 #include "socket.h"
55 #include "filesel.h"
56 #include "folderview.h"
57 #include "stock_pixmap.h"
58 #include "quote_fmt.h"
59
60 PrefsCommon prefs_common;
61
62 static PrefsDialog dialog;
63
64 static struct Receive {
65         GtkWidget *checkbtn_incext;
66         GtkWidget *entry_incext;
67         GtkWidget *button_incext;
68
69         GtkWidget *checkbtn_autochk;
70         GtkWidget *spinbtn_autochk;
71         GtkObject *spinbtn_autochk_adj;
72
73         GtkWidget *checkbtn_chkonstartup;
74         GtkWidget *checkbtn_scan_after_inc;
75
76
77         GtkWidget *checkbtn_newmail_auto;
78         GtkWidget *checkbtn_newmail_manu;
79         GtkWidget *entry_newmail_notify_cmd;
80         GtkWidget *hbox_newmail_notify;
81         GtkWidget *optmenu_recvdialog;
82         GtkWidget *checkbtn_no_recv_err_panel;
83         GtkWidget *checkbtn_close_recv_dialog;
84 } receive;
85
86 static struct Send {
87         GtkWidget *checkbtn_savemsg;
88         GtkWidget *optmenu_senddialog;
89
90         GtkWidget *optmenu_charset;
91         GtkWidget *optmenu_encoding_method;
92 } p_send;
93
94 static struct Compose {
95         GtkWidget *entry_fw_quotemark;
96         GtkWidget *text_fw_quotefmt;
97
98         GtkWidget *checkbtn_autoextedit;
99         GtkWidget *spinbtn_undolevel;
100         GtkObject *spinbtn_undolevel_adj;
101         GtkWidget *spinbtn_linewrap;
102         GtkObject *spinbtn_linewrap_adj;
103         GtkWidget *checkbtn_wrapquote;
104         GtkWidget *checkbtn_autowrap;
105         GtkWidget *checkbtn_wrapatsend;
106
107         GtkWidget *checkbtn_reply_account_autosel;
108         GtkWidget *checkbtn_forward_account_autosel;
109         GtkWidget *checkbtn_reedit_account_autosel;
110         GtkWidget *checkbtn_quote;
111         GtkWidget *checkbtn_default_reply_list;
112         GtkWidget *checkbtn_forward_as_attachment;
113         GtkWidget *checkbtn_redirect_keep_from;
114         GtkWidget *checkbtn_smart_wrapping;
115         GtkWidget *checkbtn_block_cursor;
116         GtkWidget *checkbtn_reply_with_quote;
117         
118         GtkWidget *checkbtn_autosave;
119         GtkWidget *entry_autosave_length;
120 } compose;
121
122 static struct Quote {
123         GtkWidget *entry_quotemark;
124         GtkWidget *text_quotefmt;
125
126         GtkWidget *entry_fw_quotemark;
127         GtkWidget *text_fw_quotefmt;
128         
129         GtkWidget *entry_quote_chars;
130 } quote;
131
132 static struct Display {
133         GtkWidget *chkbtn_folder_unread;
134         GtkWidget *entry_ng_abbrev_len;
135         GtkWidget *spinbtn_ng_abbrev_len;
136         GtkObject *spinbtn_ng_abbrev_len_adj;
137
138         GtkWidget *chkbtn_transhdr;
139
140         GtkWidget *chkbtn_swapfrom;
141         GtkWidget *chkbtn_useaddrbook;
142         GtkWidget *chkbtn_threadsubj;
143         GtkWidget *entry_datefmt;
144 } display;
145
146 static struct Message {
147         GtkWidget *chkbtn_enablecol;
148         GtkWidget *button_edit_col;
149         GtkWidget *chkbtn_mbalnum;
150         GtkWidget *chkbtn_disphdrpane;
151         GtkWidget *chkbtn_disphdr;
152         GtkWidget *spinbtn_linespc;
153         GtkObject *spinbtn_linespc_adj;
154         GtkWidget *chkbtn_headspc;
155
156         GtkWidget *chkbtn_smoothscroll;
157         GtkWidget *spinbtn_scrollstep;
158         GtkObject *spinbtn_scrollstep_adj;
159         GtkWidget *chkbtn_halfpage;
160
161         GtkWidget *chkbtn_attach_desc;
162 } message;
163
164 #if USE_GPGME
165 static struct Privacy {
166         GtkWidget *checkbtn_auto_check_signatures;
167         GtkWidget *checkbtn_store_passphrase;
168         GtkWidget *spinbtn_store_passphrase;
169         GtkObject *spinbtn_store_passphrase_adj;
170         GtkWidget *checkbtn_passphrase_grab;
171         GtkWidget *checkbtn_gpg_warning;
172 } privacy;
173 #endif
174
175 static struct Interface {
176         /* GtkWidget *checkbtn_emacs; */
177         GtkWidget *checkbtn_always_show_msg;
178         GtkWidget *checkbtn_openunread;
179         GtkWidget *checkbtn_mark_as_read_on_newwin;
180         GtkWidget *checkbtn_openinbox;
181         GtkWidget *checkbtn_immedexec;
182         GtkWidget *optmenu_nextunreadmsgdialog;
183 } interface;
184
185 static struct Other {
186         GtkWidget *checkbtn_addaddrbyclick;
187         GtkWidget *checkbtn_confonexit;
188         GtkWidget *checkbtn_cleanonexit;
189         GtkWidget *checkbtn_askonclean;
190         GtkWidget *checkbtn_warnqueued;
191         GtkWidget *checkbtn_cliplog;
192         GtkWidget *loglength_entry;
193 #if 0
194 #ifdef USE_OPENSSL
195         GtkWidget *checkbtn_ssl_ask_unknown_valid;
196 #endif
197 #endif
198
199         GtkWidget *spinbtn_iotimeout;
200         GtkObject *spinbtn_iotimeout_adj;
201 } other;
202
203 static struct MessageColorButtons {
204         GtkWidget *quote_level1_btn;
205         GtkWidget *quote_level2_btn;
206         GtkWidget *quote_level3_btn;
207         GtkWidget *uri_btn;
208         GtkWidget *tgt_folder_btn;
209         GtkWidget *signature_btn;
210 } color_buttons;
211
212 static struct KeybindDialog {
213         GtkWidget *window;
214         GtkWidget *combo;
215 } keybind;
216
217 static GtkWidget *quote_color_win;
218 static GtkWidget *color_dialog;
219
220 static void prefs_common_charset_set_data_from_optmenu     (PrefParam *pparam);
221 static void prefs_common_charset_set_optmenu               (PrefParam *pparam);
222 static void prefs_common_encoding_set_data_from_optmenu    (PrefParam *pparam);
223 static void prefs_common_encoding_set_optmenu              (PrefParam *pparam);
224 static void prefs_common_recv_dialog_set_data_from_optmenu (PrefParam *pparam);
225 static void prefs_common_recv_dialog_set_optmenu           (PrefParam *pparam);
226 static void prefs_common_recv_dialog_newmail_notify_toggle_cb   (GtkWidget *w,
227                                                                  gpointer data);
228 static void prefs_common_recv_dialog_set_data_from_optmenu(PrefParam *pparam);
229 static void prefs_common_recv_dialog_set_optmenu(PrefParam *pparam);
230 static void prefs_common_send_dialog_set_data_from_optmenu(PrefParam *pparam);
231 static void prefs_common_send_dialog_set_optmenu(PrefParam *pparam);
232 static void prefs_nextunreadmsgdialog_set_data_from_optmenu(PrefParam *pparam);
233 static void prefs_nextunreadmsgdialog_set_optmenu(PrefParam *pparam);
234
235 /*
236    parameter name, default value, pointer to the prefs variable, data type,
237    pointer to the widget pointer,
238    pointer to the function for data setting,
239    pointer to the function for widget setting
240  */
241
242 static PrefParam param[] = {
243         /* Receive */
244         {"use_ext_inc", "FALSE", &prefs_common.use_extinc, P_BOOL,
245          &receive.checkbtn_incext,
246          prefs_set_data_from_toggle, prefs_set_toggle},
247         {"ext_inc_path", DEFAULT_INC_PATH, &prefs_common.extinc_cmd, P_STRING,
248          &receive.entry_incext,
249          prefs_set_data_from_entry, prefs_set_entry},
250
251         {"autochk_newmail", "FALSE", &prefs_common.autochk_newmail, P_BOOL,
252          &receive.checkbtn_autochk,
253          prefs_set_data_from_toggle, prefs_set_toggle},
254         {"autochk_interval", "10", &prefs_common.autochk_itv, P_INT,
255          &receive.spinbtn_autochk,
256          prefs_set_data_from_spinbtn, prefs_set_spinbtn},
257         {"check_on_startup", "FALSE", &prefs_common.chk_on_startup, P_BOOL,
258          &receive.checkbtn_chkonstartup,
259          prefs_set_data_from_toggle, prefs_set_toggle},
260         {"scan_all_after_inc", "FALSE", &prefs_common.scan_all_after_inc,
261          P_BOOL, &receive.checkbtn_scan_after_inc,
262          prefs_set_data_from_toggle, prefs_set_toggle},
263         {"newmail_notify_manu", "FALSE", &prefs_common.newmail_notify_manu,
264          P_BOOL, &receive.checkbtn_newmail_manu,
265          prefs_set_data_from_toggle, prefs_set_toggle},
266         {"newmail_notify_auto", "FALSE", &prefs_common.newmail_notify_auto,
267         P_BOOL, &receive.checkbtn_newmail_auto,
268          prefs_set_data_from_toggle, prefs_set_toggle},
269         {"newmail_notify_cmd", "", &prefs_common.newmail_notify_cmd, P_STRING,
270          &receive.entry_newmail_notify_cmd,
271          prefs_set_data_from_entry, prefs_set_entry},
272         {"receive_dialog_mode", "1", &prefs_common.recv_dialog_mode, P_ENUM,
273          &receive.optmenu_recvdialog,
274          prefs_common_recv_dialog_set_data_from_optmenu,
275          prefs_common_recv_dialog_set_optmenu},
276         {"no_receive_error_panel", "FALSE", &prefs_common.no_recv_err_panel,
277          P_BOOL, &receive.checkbtn_no_recv_err_panel,
278          prefs_set_data_from_toggle, prefs_set_toggle},
279         {"close_receive_dialog", "TRUE", &prefs_common.close_recv_dialog,
280          P_BOOL, &receive.checkbtn_close_recv_dialog,
281          prefs_set_data_from_toggle, prefs_set_toggle},
282  
283         /* Send */
284         {"save_message", "TRUE", &prefs_common.savemsg, P_BOOL,
285          &p_send.checkbtn_savemsg,
286          prefs_set_data_from_toggle, prefs_set_toggle},
287         {"send_dialog_mode", "0", &prefs_common.send_dialog_mode, P_ENUM,
288          &p_send.optmenu_senddialog,
289          prefs_common_send_dialog_set_data_from_optmenu,
290          prefs_common_send_dialog_set_optmenu},
291
292         {"outgoing_charset", CS_AUTO, &prefs_common.outgoing_charset, P_STRING,
293          &p_send.optmenu_charset,
294          prefs_common_charset_set_data_from_optmenu,
295          prefs_common_charset_set_optmenu},
296         {"encoding_method", "0", &prefs_common.encoding_method, P_ENUM,
297          &p_send.optmenu_encoding_method,
298          prefs_common_encoding_set_data_from_optmenu,
299          prefs_common_encoding_set_optmenu},
300
301         {"allow_jisx0201_kana", "FALSE", &prefs_common.allow_jisx0201_kana,
302          P_BOOL, NULL, NULL, NULL},
303
304         /* Compose */
305         {"auto_ext_editor", "FALSE", &prefs_common.auto_exteditor, P_BOOL,
306          &compose.checkbtn_autoextedit,
307          prefs_set_data_from_toggle, prefs_set_toggle},
308         {"forward_as_attachment", "FALSE", &prefs_common.forward_as_attachment,
309          P_BOOL, &compose.checkbtn_forward_as_attachment,
310          prefs_set_data_from_toggle, prefs_set_toggle},
311         {"redirect_keep_from", "FALSE",
312          &prefs_common.redirect_keep_from, P_BOOL,
313          &compose.checkbtn_redirect_keep_from,
314          prefs_set_data_from_toggle, prefs_set_toggle},
315         {"undo_level", "50", &prefs_common.undolevels, P_INT,
316          &compose.spinbtn_undolevel,
317          prefs_set_data_from_spinbtn, prefs_set_spinbtn},
318         {"block_cursor", "FALSE", &prefs_common.block_cursor,
319          P_BOOL, &compose.checkbtn_block_cursor,
320          prefs_set_data_from_toggle, prefs_set_toggle},
321
322         {"linewrap_length", "72", &prefs_common.linewrap_len, P_INT,
323          &compose.spinbtn_linewrap,
324          prefs_set_data_from_spinbtn, prefs_set_spinbtn},
325         {"linewrap_quotation", "FALSE", &prefs_common.linewrap_quote, P_BOOL,
326          &compose.checkbtn_wrapquote,
327          prefs_set_data_from_toggle, prefs_set_toggle},
328         {"linewrap_auto", "FALSE", &prefs_common.autowrap, P_BOOL,
329          &compose.checkbtn_autowrap,
330          prefs_set_data_from_toggle, prefs_set_toggle},
331         {"linewrap_before_sending", "FALSE",
332          &prefs_common.linewrap_at_send, P_BOOL,
333          &compose.checkbtn_wrapatsend,
334          prefs_set_data_from_toggle, prefs_set_toggle},
335         {"smart_wrapping", "TRUE", &prefs_common.smart_wrapping,
336          P_BOOL, &compose.checkbtn_smart_wrapping,
337          prefs_set_data_from_toggle, prefs_set_toggle},
338         {"autosave", "FALSE", &prefs_common.autosave,
339          P_BOOL, &compose.checkbtn_autosave,
340          prefs_set_data_from_toggle, prefs_set_toggle},
341         {"autosave_length", "50", &prefs_common.autosave_length,
342          P_INT, &compose.entry_autosave_length,
343          prefs_set_data_from_entry, prefs_set_entry},
344 #if USE_ASPELL
345         {"enable_aspell", "TRUE", &prefs_common.enable_aspell, P_BOOL,
346          NULL, NULL, NULL},
347         {"aspell_path", ASPELL_PATH, &prefs_common.aspell_path, P_STRING,
348          NULL, NULL, NULL},
349         {"dictionary",  "", &prefs_common.dictionary, P_STRING,
350          NULL, NULL, NULL},
351         {"aspell_sugmode", "1", &prefs_common.aspell_sugmode, P_INT,
352          NULL, NULL, NULL},
353         {"use_alternate_dict", "FALSE", &prefs_common.use_alternate, P_BOOL,
354          NULL, NULL, NULL},
355         {"check_while_typing", "TRUE", &prefs_common.check_while_typing, P_BOOL,
356          NULL, NULL, NULL},
357         {"misspelled_color", "16711680", &prefs_common.misspelled_col, P_COLOR,
358          NULL, NULL, NULL},
359 #endif
360         {"reply_with_quote", "TRUE", &prefs_common.reply_with_quote, P_BOOL,
361          &compose.checkbtn_reply_with_quote, prefs_set_data_from_toggle, prefs_set_toggle},
362
363         /* Account autoselection */
364         {"reply_account_autoselect", "TRUE",
365          &prefs_common.reply_account_autosel, P_BOOL,
366          &compose.checkbtn_reply_account_autosel,
367          prefs_set_data_from_toggle, prefs_set_toggle},
368         {"forward_account_autoselect", "TRUE",
369          &prefs_common.forward_account_autosel, P_BOOL,
370          &compose.checkbtn_forward_account_autosel,
371          prefs_set_data_from_toggle, prefs_set_toggle},
372         {"reedit_account_autoselect", "TRUE",
373          &prefs_common.reedit_account_autosel, P_BOOL,
374          &compose.checkbtn_reedit_account_autosel,
375          prefs_set_data_from_toggle, prefs_set_toggle},
376
377         {"default_reply_list", "TRUE", &prefs_common.default_reply_list, P_BOOL,
378          &compose.checkbtn_default_reply_list,
379          prefs_set_data_from_toggle, prefs_set_toggle},
380
381         {"show_ruler", "TRUE", &prefs_common.show_ruler, P_BOOL,
382          NULL, NULL, NULL},
383
384         /* Quote */
385         {"reply_quote_mark", "> ", &prefs_common.quotemark, P_STRING,
386          &quote.entry_quotemark, prefs_set_data_from_entry, prefs_set_entry},
387         {"reply_quote_format", "On %d\\n%f wrote:\\n\\n%Q",
388          &prefs_common.quotefmt, P_STRING, &quote.text_quotefmt,
389          prefs_set_data_from_text, prefs_set_text},
390
391         {"forward_quote_mark", "> ", &prefs_common.fw_quotemark, P_STRING,
392          &quote.entry_fw_quotemark,
393          prefs_set_data_from_entry, prefs_set_entry},
394         {"forward_quote_format",
395          "\\n\\nBegin forwarded message:\\n\\n"
396          "?d{Date: %d\\n}?f{From: %f\\n}?t{To: %t\\n}?c{Cc: %c\\n}"
397          "?n{Newsgroups: %n\\n}?s{Subject: %s\\n}\\n\\n%M",
398          &prefs_common.fw_quotefmt, P_STRING, &quote.text_fw_quotefmt,
399          prefs_set_data_from_text, prefs_set_text},
400         {"quote_chars", ">", &prefs_common.quote_chars, P_STRING,
401          &quote.entry_quote_chars, prefs_set_data_from_entry, prefs_set_entry},
402
403         /* Display */
404         {"widget_font", NULL, &prefs_common.widgetfont, P_STRING,
405          NULL, NULL, NULL},
406         {"message_font", "-misc-fixed-medium-r-normal--14-*-*-*-*-*-*-*",
407          &prefs_common.textfont, P_STRING, NULL, NULL, NULL},
408         {"small_font",   "-*-helvetica-medium-r-normal--10-*-*-*-*-*-*-*",
409          &prefs_common.smallfont,   P_STRING, NULL, NULL, NULL},
410         {"bold_font",    "-*-helvetica-bold-r-normal--12-*-*-*-*-*-*-*",
411          &prefs_common.boldfont,    P_STRING, NULL, NULL, NULL},
412         {"normal_font",  "-*-helvetica-medium-r-normal--12-*-*-*-*-*-*-*",
413          &prefs_common.normalfont,  P_STRING, NULL, NULL, NULL},
414
415
416         {"display_folder_unread_num", "TRUE",
417          &prefs_common.display_folder_unread, P_BOOL,
418          &display.chkbtn_folder_unread,
419          prefs_set_data_from_toggle, prefs_set_toggle},
420         {"newsgroup_abbrev_len", "16",
421          &prefs_common.ng_abbrev_len, P_INT,
422          &display.spinbtn_ng_abbrev_len,
423          prefs_set_data_from_spinbtn, prefs_set_spinbtn},
424
425         {"translate_header", "TRUE", &prefs_common.trans_hdr, P_BOOL,
426          &display.chkbtn_transhdr,
427          prefs_set_data_from_toggle, prefs_set_toggle},
428
429         /* Display: Summary View */
430         {"enable_swap_from", "FALSE", &prefs_common.swap_from, P_BOOL,
431          &display.chkbtn_swapfrom,
432          prefs_set_data_from_toggle, prefs_set_toggle},
433         {"use_address_book", "TRUE", &prefs_common.use_addr_book, P_BOOL,
434          &display.chkbtn_useaddrbook,
435          prefs_set_data_from_toggle, prefs_set_toggle},
436         {"thread_by_subject", "TRUE", &prefs_common.thread_by_subject, P_BOOL,
437          &display.chkbtn_threadsubj,
438          prefs_set_data_from_toggle, prefs_set_toggle},
439         {"date_format", "%y/%m/%d(%a) %H:%M", &prefs_common.date_format,
440          P_STRING, &display.entry_datefmt,
441          prefs_set_data_from_entry, prefs_set_entry},
442
443         {"enable_hscrollbar", "TRUE", &prefs_common.enable_hscrollbar, P_BOOL,
444          NULL, NULL, NULL},
445         {"bold_unread", "TRUE", &prefs_common.bold_unread, P_BOOL,
446          NULL, NULL, NULL},
447         {"thread_by_subject_max_age", "10", &prefs_common.thread_by_subject_max_age,
448         P_INT, NULL, NULL, NULL },
449
450         {"enable_thread", "TRUE", &prefs_common.enable_thread, P_BOOL,
451          NULL, NULL, NULL},
452         {"toolbar_style", "3", &prefs_common.toolbar_style, P_ENUM,
453          NULL, NULL, NULL},
454         {"show_statusbar", "TRUE", &prefs_common.show_statusbar, P_BOOL,
455          NULL, NULL, NULL},
456         {"show_searchbar", "TRUE", &prefs_common.show_searchbar, P_BOOL,
457          NULL, NULL, NULL},
458
459         {"folderview_vscrollbar_policy", "0",
460          &prefs_common.folderview_vscrollbar_policy, P_ENUM,
461          NULL, NULL, NULL},
462
463         {"summary_col_show_mark", "TRUE",
464          &prefs_common.summary_col_visible[S_COL_MARK], P_BOOL, NULL, NULL, NULL},
465         {"summary_col_show_unread", "TRUE",
466          &prefs_common.summary_col_visible[S_COL_STATUS], P_BOOL, NULL, NULL, NULL},
467         {"summary_col_show_mime", "TRUE",
468          &prefs_common.summary_col_visible[S_COL_MIME], P_BOOL, NULL, NULL, NULL},
469         {"summary_col_show_subject", "TRUE",
470          &prefs_common.summary_col_visible[S_COL_SUBJECT], P_BOOL, NULL, NULL, NULL},
471         {"summary_col_show_from", "TRUE",
472          &prefs_common.summary_col_visible[S_COL_FROM], P_BOOL, NULL, NULL, NULL},
473         {"summary_col_show_date", "TRUE",
474          &prefs_common.summary_col_visible[S_COL_DATE], P_BOOL, NULL, NULL, NULL},
475         {"summary_col_show_size", "TRUE",
476          &prefs_common.summary_col_visible[S_COL_SIZE], P_BOOL, NULL, NULL, NULL},
477         {"summary_col_show_number", "FALSE",
478          &prefs_common.summary_col_visible[S_COL_NUMBER], P_BOOL, NULL, NULL, NULL},
479         {"summary_col_show_score", "FALSE",
480          &prefs_common.summary_col_visible[S_COL_SCORE], P_BOOL, NULL, NULL, NULL},
481         {"summary_col_show_locked", "FALSE",
482          &prefs_common.summary_col_visible[S_COL_LOCKED], P_BOOL, NULL, NULL, NULL},
483
484         {"summary_col_pos_mark", "0",
485           &prefs_common.summary_col_pos[S_COL_MARK], P_INT, NULL, NULL, NULL},
486         {"summary_col_pos_unread", "1",
487           &prefs_common.summary_col_pos[S_COL_STATUS], P_INT, NULL, NULL, NULL},
488         {"summary_col_pos_mime", "2",
489           &prefs_common.summary_col_pos[S_COL_MIME], P_INT, NULL, NULL, NULL},
490         {"summary_col_pos_subject", "3",
491           &prefs_common.summary_col_pos[S_COL_SUBJECT], P_INT, NULL, NULL, NULL},
492         {"summary_col_pos_from", "4",
493           &prefs_common.summary_col_pos[S_COL_FROM], P_INT, NULL, NULL, NULL},
494         {"summary_col_pos_date", "5",
495           &prefs_common.summary_col_pos[S_COL_DATE], P_INT, NULL, NULL, NULL},
496         {"summary_col_pos_size", "6",
497           &prefs_common.summary_col_pos[S_COL_SIZE], P_INT, NULL, NULL, NULL},
498         {"summary_col_pos_number", "7",
499           &prefs_common.summary_col_pos[S_COL_NUMBER], P_INT, NULL, NULL, NULL},
500         {"summary_col_pos_score", "8",
501          &prefs_common.summary_col_pos[S_COL_SCORE], P_INT, NULL, NULL, NULL},
502         {"summary_col_pos_locked", "9",
503          &prefs_common.summary_col_pos[S_COL_LOCKED], P_INT, NULL, NULL, NULL},
504
505         {"summary_col_size_mark", "10",
506          &prefs_common.summary_col_size[S_COL_MARK], P_INT, NULL, NULL, NULL},
507         {"summary_col_size_unread", "13",
508          &prefs_common.summary_col_size[S_COL_STATUS], P_INT, NULL, NULL, NULL},
509         {"summary_col_size_mime", "10",
510          &prefs_common.summary_col_size[S_COL_MIME], P_INT, NULL, NULL, NULL},
511         {"summary_col_size_subject", "200",
512          &prefs_common.summary_col_size[S_COL_SUBJECT], P_INT, NULL, NULL, NULL},
513         {"summary_col_size_from", "120",
514          &prefs_common.summary_col_size[S_COL_FROM], P_INT, NULL, NULL, NULL},
515         {"summary_col_size_date", "118",
516          &prefs_common.summary_col_size[S_COL_DATE], P_INT, NULL, NULL, NULL},
517         {"summary_col_size_size", "45",
518          &prefs_common.summary_col_size[S_COL_SIZE], P_INT, NULL, NULL, NULL},
519         {"summary_col_size_number", "40",
520          &prefs_common.summary_col_size[S_COL_NUMBER], P_INT, NULL, NULL, NULL},
521         {"summary_col_size_score", "40",
522          &prefs_common.summary_col_size[S_COL_SCORE], P_INT, NULL, NULL, NULL},
523         {"summary_col_size_locked", "13",
524          &prefs_common.summary_col_size[S_COL_LOCKED], P_INT, NULL, NULL, NULL},
525
526         /* Widget size */
527         {"folderwin_x", "16", &prefs_common.folderwin_x, P_INT,
528          NULL, NULL, NULL},
529         {"folderwin_y", "16", &prefs_common.folderwin_y, P_INT,
530          NULL, NULL, NULL},
531         {"folderview_width", "179", &prefs_common.folderview_width, P_INT,
532          NULL, NULL, NULL},
533         {"folderview_height", "600", &prefs_common.folderview_height, P_INT,
534          NULL, NULL, NULL},
535         {"folderview_visible", "TRUE", &prefs_common.folderview_visible, P_BOOL,
536          NULL, NULL, NULL},
537
538         {"folder_col_folder", "150", &prefs_common.folder_col_folder, P_INT,
539          NULL, NULL, NULL},
540         {"folder_col_new", "32", &prefs_common.folder_col_new, P_INT,
541          NULL, NULL, NULL},
542         {"folder_col_unread", "32", &prefs_common.folder_col_unread, P_INT,
543          NULL, NULL, NULL},
544         {"folder_col_total", "32", &prefs_common.folder_col_total, P_INT,
545          NULL, NULL, NULL},
546
547         {"summaryview_width", "600", &prefs_common.summaryview_width, P_INT,
548          NULL, NULL, NULL},
549         {"summaryview_height", "173", &prefs_common.summaryview_height, P_INT,
550          NULL, NULL, NULL},
551
552         {"main_messagewin_x", "256", &prefs_common.main_msgwin_x, P_INT,
553          NULL, NULL, NULL},
554         {"main_messagewin_y", "210", &prefs_common.main_msgwin_y, P_INT,
555          NULL, NULL, NULL},
556         {"messageview_width", "600", &prefs_common.msgview_width, P_INT,
557          NULL, NULL, NULL},
558         {"messageview_height", "540", &prefs_common.msgview_height, P_INT,
559          NULL, NULL, NULL},
560         {"messageview_visible", "TRUE", &prefs_common.msgview_visible, P_BOOL,
561          NULL, NULL, NULL},
562
563         {"mainview_x", "64", &prefs_common.mainview_x, P_INT,
564          NULL, NULL, NULL},
565         {"mainview_y", "64", &prefs_common.mainview_y, P_INT,
566          NULL, NULL, NULL},
567         {"mainview_width", "600", &prefs_common.mainview_width, P_INT,
568          NULL, NULL, NULL},
569         {"mainview_height", "600", &prefs_common.mainview_height, P_INT,
570          NULL, NULL, NULL},
571         {"mainwin_x", "64", &prefs_common.mainwin_x, P_INT,
572          NULL, NULL, NULL},
573         {"mainwin_y", "64", &prefs_common.mainwin_y, P_INT,
574          NULL, NULL, NULL},
575         {"mainwin_width", "800", &prefs_common.mainwin_width, P_INT,
576          NULL, NULL, NULL},
577         {"mainwin_height", "600", &prefs_common.mainwin_height, P_INT,
578          NULL, NULL, NULL},
579         {"messagewin_width", "600", &prefs_common.msgwin_width, P_INT,
580          NULL, NULL, NULL},
581         {"messagewin_height", "540", &prefs_common.msgwin_height, P_INT,
582          NULL, NULL, NULL},
583         {"sourcewin_width", "600", &prefs_common.sourcewin_width, P_INT,
584          NULL, NULL, NULL},
585         {"sourcewin_height", "500", &prefs_common.sourcewin_height, P_INT,
586          NULL, NULL, NULL},
587         {"compose_width", "600", &prefs_common.compose_width, P_INT,
588          NULL, NULL, NULL},
589         {"compose_height", "560", &prefs_common.compose_height, P_INT,
590          NULL, NULL, NULL},
591         {"compose_x", "0", &prefs_common.compose_x, P_INT,
592          NULL, NULL, NULL},
593         {"compose_y", "0", &prefs_common.compose_y, P_INT,
594          NULL, NULL, NULL},
595         /* Message */
596         {"enable_color", "TRUE", &prefs_common.enable_color, P_BOOL,
597          &message.chkbtn_enablecol,
598          prefs_set_data_from_toggle, prefs_set_toggle},
599
600         {"quote_level1_color", "179", &prefs_common.quote_level1_col, P_COLOR,
601          NULL, NULL, NULL},
602         {"quote_level2_color", "179", &prefs_common.quote_level2_col, P_COLOR,
603          NULL, NULL, NULL},
604         {"quote_level3_color", "179", &prefs_common.quote_level3_col, P_COLOR,
605          NULL, NULL, NULL},
606         {"uri_color", "32512", &prefs_common.uri_col, P_COLOR,
607          NULL, NULL, NULL},
608         {"target_folder_color", "14294218", &prefs_common.tgt_folder_col, P_COLOR,
609          NULL, NULL, NULL},
610         {"signature_color", "7960953", &prefs_common.signature_col, P_COLOR,
611          NULL, NULL, NULL},
612         {"recycle_quote_colors", "FALSE", &prefs_common.recycle_quote_colors,
613          P_BOOL, NULL, NULL, NULL},
614
615         {"convert_mb_alnum", "FALSE", &prefs_common.conv_mb_alnum, P_BOOL,
616          &message.chkbtn_mbalnum,
617          prefs_set_data_from_toggle, prefs_set_toggle},
618         {"display_header_pane", "TRUE", &prefs_common.display_header_pane,
619          P_BOOL, &message.chkbtn_disphdrpane,
620          prefs_set_data_from_toggle, prefs_set_toggle},
621         {"display_header", "TRUE", &prefs_common.display_header, P_BOOL,
622          &message.chkbtn_disphdr,
623          prefs_set_data_from_toggle, prefs_set_toggle},
624         {"line_space", "2", &prefs_common.line_space, P_INT,
625          &message.spinbtn_linespc,
626          prefs_set_data_from_spinbtn, prefs_set_spinbtn},
627         {"enable_head_space", "FALSE", &prefs_common.head_space, P_BOOL,
628          &message.chkbtn_headspc,
629          prefs_set_data_from_toggle, prefs_set_toggle},
630
631         {"enable_smooth_scroll", "FALSE",
632          &prefs_common.enable_smooth_scroll, P_BOOL,
633          &message.chkbtn_smoothscroll,
634          prefs_set_data_from_toggle, prefs_set_toggle},
635         {"scroll_step", "1", &prefs_common.scroll_step, P_INT,
636          &message.spinbtn_scrollstep,
637          prefs_set_data_from_spinbtn, prefs_set_spinbtn},
638         {"scroll_half_page", "FALSE", &prefs_common.scroll_halfpage, P_BOOL,
639          &message.chkbtn_halfpage,
640          prefs_set_data_from_toggle, prefs_set_toggle},
641
642         {"show_other_header", "FALSE", &prefs_common.show_other_header, P_BOOL,
643          NULL, NULL, NULL},
644
645         {"attach_desc", "TRUE", &prefs_common.attach_desc, P_BOOL,
646          &message.chkbtn_attach_desc,
647          prefs_set_data_from_toggle, prefs_set_toggle},
648         {"attach_save_directory", NULL,
649          &prefs_common.attach_save_dir, P_STRING, NULL, NULL, NULL},
650
651         /* MIME viewer */
652         {"mime_image_viewer", "display '%s'",
653          &prefs_common.mime_image_viewer, P_STRING, NULL, NULL, NULL},
654         {"mime_audio_player", "play '%s'",
655          &prefs_common.mime_audio_player, P_STRING, NULL, NULL, NULL},
656         {"mime_open_command", "gedit '%s'",
657          &prefs_common.mime_open_cmd, P_STRING, NULL, NULL, NULL},
658
659 #if USE_GPGME
660         /* Privacy */
661         {"auto_check_signatures", "TRUE",
662          &prefs_common.auto_check_signatures, P_BOOL,
663          &privacy.checkbtn_auto_check_signatures,
664          prefs_set_data_from_toggle, prefs_set_toggle},
665         {"store_passphrase", "FALSE", &prefs_common.store_passphrase, P_BOOL,
666          &privacy.checkbtn_store_passphrase,
667          prefs_set_data_from_toggle, prefs_set_toggle},
668         {"store_passphrase_timeout", "0",
669          &prefs_common.store_passphrase_timeout, P_INT,
670          &privacy.spinbtn_store_passphrase,
671          prefs_set_data_from_spinbtn, prefs_set_spinbtn},
672 #ifndef __MINGW32__
673         {"passphrase_grab", "FALSE", &prefs_common.passphrase_grab, P_BOOL,
674          &privacy.checkbtn_passphrase_grab,
675          prefs_set_data_from_toggle, prefs_set_toggle},
676 #endif /* __MINGW32__ */
677         {"gpg_warning", "TRUE", &prefs_common.gpg_warning, P_BOOL,
678          &privacy.checkbtn_gpg_warning,
679          prefs_set_data_from_toggle, prefs_set_toggle},
680 #endif /* USE_GPGME */
681
682         /* Interface */
683         {"separate_folder", "FALSE", &prefs_common.sep_folder, P_BOOL,
684          NULL, NULL, NULL},
685         {"separate_message", "FALSE", &prefs_common.sep_msg, P_BOOL,
686          NULL, NULL, NULL},
687
688         /* {"emulate_emacs", "FALSE", &prefs_common.emulate_emacs, P_BOOL,
689          NULL, NULL, NULL}, */
690         {"always_show_message_when_selected", "FALSE",
691          &prefs_common.always_show_msg,
692          P_BOOL, &interface.checkbtn_always_show_msg,
693          prefs_set_data_from_toggle, prefs_set_toggle},
694         {"open_unread_on_enter", "FALSE", &prefs_common.open_unread_on_enter,
695          P_BOOL, &interface.checkbtn_openunread,
696          prefs_set_data_from_toggle, prefs_set_toggle},
697         {"mark_as_read_on_new_window", "FALSE",
698          &prefs_common.mark_as_read_on_new_window,
699          P_BOOL, &interface.checkbtn_mark_as_read_on_newwin,
700          prefs_set_data_from_toggle, prefs_set_toggle},
701         {"open_inbox_on_inc", "FALSE", &prefs_common.open_inbox_on_inc,
702          P_BOOL, &interface.checkbtn_openinbox,
703          prefs_set_data_from_toggle, prefs_set_toggle},
704         {"immediate_execution", "TRUE", &prefs_common.immediate_exec, P_BOOL,
705          &interface.checkbtn_immedexec,
706          prefs_set_data_from_toggle, prefs_set_toggle},
707         {"nextunreadmsg_dialog", NULL, &prefs_common.next_unread_msg_dialog, P_ENUM,
708          &interface.optmenu_nextunreadmsgdialog,
709          prefs_nextunreadmsgdialog_set_data_from_optmenu,
710          prefs_nextunreadmsgdialog_set_optmenu},
711
712         {"pixmap_theme_path", DEFAULT_PIXMAP_THEME, 
713          &prefs_common.pixmap_theme_path, P_STRING,
714          NULL, NULL, NULL},
715
716         {"hover_timeout", "500", &prefs_common.hover_timeout, P_INT,
717          NULL, NULL, NULL},
718         
719         /* Other */
720         {"uri_open_command", DEFAULT_BROWSER_CMD,
721          &prefs_common.uri_cmd, P_STRING, NULL, NULL, NULL},
722         {"print_command", "lpr %s", &prefs_common.print_cmd, P_STRING,
723          NULL, NULL, NULL},
724         {"ext_editor_command", "gedit %s",
725          &prefs_common.ext_editor_cmd, P_STRING, NULL, NULL, NULL},
726
727         {"add_address_by_click", "FALSE", &prefs_common.add_address_by_click,
728          P_BOOL, &other.checkbtn_addaddrbyclick,
729          prefs_set_data_from_toggle, prefs_set_toggle},
730
731         {"confirm_on_exit", "TRUE", &prefs_common.confirm_on_exit, P_BOOL,
732          &other.checkbtn_confonexit,
733          prefs_set_data_from_toggle, prefs_set_toggle},
734         {"clean_trash_on_exit", "FALSE", &prefs_common.clean_on_exit, P_BOOL,
735          &other.checkbtn_cleanonexit,
736          prefs_set_data_from_toggle, prefs_set_toggle},
737         {"ask_on_cleaning", "TRUE", &prefs_common.ask_on_clean, P_BOOL,
738          &other.checkbtn_askonclean,
739          prefs_set_data_from_toggle, prefs_set_toggle},
740         {"warn_queued_on_exit", "TRUE", &prefs_common.warn_queued_on_exit,
741          P_BOOL, &other.checkbtn_warnqueued,
742          prefs_set_data_from_toggle, prefs_set_toggle},
743 #if 0
744 #ifdef USE_OPENSSL
745         {"ssl_ask_unknown_valid", "TRUE", &prefs_common.ssl_ask_unknown_valid,
746          P_BOOL, &other.checkbtn_ssl_ask_unknown_valid,
747          prefs_set_data_from_toggle, prefs_set_toggle},
748 #endif
749 #endif
750         {"work_offline", "FALSE", &prefs_common.work_offline, P_BOOL,
751          NULL, NULL, NULL},
752         {"summary_quicksearch_type", "0", &prefs_common.summary_quicksearch_type, P_INT,
753          NULL, NULL, NULL},
754
755         {"io_timeout_secs", "60", &prefs_common.io_timeout_secs,
756          P_INT, &other.spinbtn_iotimeout,
757          prefs_set_data_from_spinbtn, prefs_set_spinbtn},
758         {"hide_score", "-9999", &prefs_common.kill_score, P_INT,
759          NULL, NULL, NULL},
760         {"important_score", "1", &prefs_common.important_score, P_INT,
761          NULL, NULL, NULL},
762         {"clip_log", "TRUE", &prefs_common.cliplog, P_BOOL,
763          &other.checkbtn_cliplog,
764          prefs_set_data_from_toggle, prefs_set_toggle},
765         {"log_length", "500", &prefs_common.loglength, P_INT,
766          &other.loglength_entry,
767          prefs_set_data_from_entry, prefs_set_entry},
768
769         {"cache_max_mem_usage", "4096", &prefs_common.cache_max_mem_usage, P_INT,
770          NULL, NULL, NULL},
771         {"cache_min_keep_time", "15", &prefs_common.cache_min_keep_time, P_INT,
772          NULL, NULL, NULL},
773
774         {"color_new", "179", &prefs_common.color_new, P_COLOR,
775          NULL, NULL, NULL},
776
777         {NULL, NULL, NULL, P_OTHER, NULL, NULL, NULL}
778 };
779
780 /* widget creating functions */
781 static void prefs_common_create         (void);
782 static void prefs_receive_create        (void);
783 static void prefs_send_create           (void);
784 static void prefs_compose_create        (void);
785 static void prefs_quote_create          (void);
786 static void prefs_display_create        (void);
787 static void prefs_message_create        (void);
788 #if USE_GPGME
789 static void prefs_privacy_create        (void);
790 #endif
791 static void prefs_interface_create      (void);
792 static void prefs_other_create          (void);
793
794 static void date_format_ok_btn_clicked          (GtkButton      *button,
795                                                  GtkWidget     **widget);
796 static void date_format_cancel_btn_clicked      (GtkButton      *button,
797                                                  GtkWidget     **widget);
798 static void date_format_key_pressed             (GtkWidget      *keywidget,
799                                                  GdkEventKey    *event,
800                                                  GtkWidget     **widget);
801 static gboolean date_format_on_delete           (GtkWidget      *dialogwidget,
802                                                  GdkEventAny    *event,
803                                                  GtkWidget     **widget);
804 static void date_format_entry_on_change         (GtkEditable    *editable,
805                                                  GtkLabel       *example);
806 static void date_format_select_row              (GtkWidget      *date_format_list,
807                                                  gint            row,
808                                                  gint            column,
809                                                  GdkEventButton *event,
810                                                  GtkWidget      *date_format);
811 static GtkWidget *date_format_create            (GtkButton      *button,
812                                                  void           *data);
813
814 static void prefs_quote_colors_dialog           (void);
815 static void prefs_quote_colors_dialog_create    (void);
816 static void prefs_quote_colors_key_pressed      (GtkWidget      *widget,
817                                                  GdkEventKey    *event,
818                                                  gpointer        data);
819 static void quote_color_set_dialog              (GtkWidget      *widget,
820                                                  gpointer        data);
821 static void quote_colors_set_dialog_ok          (GtkWidget      *widget,
822                                                  gpointer        data);
823 static void quote_colors_set_dialog_cancel      (GtkWidget      *widget,
824                                                  gpointer        data);
825 static void quote_colors_set_dialog_key_pressed (GtkWidget      *widget,
826                                                  GdkEventKey    *event,
827                                                  gpointer        data);
828 static void set_button_bg_color                 (GtkWidget      *widget,
829                                                  gint            color);
830 static void prefs_enable_message_color_toggled  (void);
831 static void prefs_recycle_colors_toggled        (GtkWidget      *widget);
832
833 static void prefs_keybind_select                (void);
834 static gint prefs_keybind_deleted               (GtkWidget      *widget,
835                                                  GdkEventAny    *event,
836                                                  gpointer        data);
837 static void prefs_keybind_key_pressed           (GtkWidget      *widget,
838                                                  GdkEventKey    *event,
839                                                  gpointer        data);
840 static void prefs_keybind_cancel                (void);
841 static void prefs_keybind_apply_clicked         (GtkWidget      *widget);
842
843 static gint prefs_common_deleted        (GtkWidget      *widget,
844                                          GdkEventAny    *event,
845                                          gpointer        data);
846 static void prefs_common_key_pressed    (GtkWidget      *widget,
847                                          GdkEventKey    *event,
848                                          gpointer        data);
849 static void prefs_common_ok             (void);
850 static void prefs_common_apply          (void);
851 static void prefs_common_cancel         (void);
852
853 void prefs_common_init(void) 
854 {
855         prefs_common.disphdr_list = NULL;
856 }
857
858 PrefsCommon *prefs_common_get(void)
859 {
860         return &prefs_common;
861 }
862
863 /*
864  * Read history list from the specified history file
865  */
866 GList *prefs_common_read_history(const gchar *history) 
867 {
868         FILE *fp;
869         gchar *path;
870         gchar buf[PREFSBUFSIZE];
871         GList *tmp = NULL;
872
873         path = g_strconcat(get_rc_dir(), G_DIR_SEPARATOR_S, history,
874                            NULL);
875         if ((fp = fopen(path, "rb")) == NULL) {
876                 if (ENOENT != errno) FILE_OP_ERROR(path, "fopen");
877                 g_free(path);
878                 return NULL;
879         }
880         g_free(path);
881         while (fgets(buf, sizeof(buf), fp) != NULL) {
882                 g_strstrip(buf);
883                 if (buf[0] == '\0') continue;
884                 tmp = add_history(tmp, buf);
885         }
886         fclose(fp);
887
888         tmp = g_list_reverse(tmp);
889
890         return tmp;
891 }
892
893 void prefs_common_read_config(void)
894 {
895         prefs_read_config(param, "Common", COMMON_RC);
896
897         prefs_common.mime_open_cmd_history =
898                 prefs_common_read_history(COMMAND_HISTORY);
899         prefs_common.summary_quicksearch_history =
900                 prefs_common_read_history(QUICKSEARCH_HISTORY);
901 }
902
903 /*
904  * Save history list to the specified history file
905  */
906 void prefs_common_save_history(const gchar *history, GList *list)
907 {
908         GList *cur;
909         FILE *fp;
910         gchar *path;
911
912         path = g_strconcat(get_rc_dir(), G_DIR_SEPARATOR_S, history,
913                            NULL);
914         if ((fp = fopen(path, "wb")) == NULL) {
915                 FILE_OP_ERROR(path, "fopen");
916                 g_free(path);
917                 return;
918         }
919
920         for (cur = list; cur != NULL; cur = cur->next) {
921                 fputs((gchar *)cur->data, fp);
922                 fputc('\n', fp);
923         }
924
925         fclose(fp);
926         g_free(path);
927 }
928
929 void prefs_common_save_config(void)
930 {
931         prefs_save_config(param, "Common", COMMON_RC);
932
933         prefs_common_save_history(COMMAND_HISTORY, 
934                 prefs_common.mime_open_cmd_history);
935         prefs_common_save_history(QUICKSEARCH_HISTORY, 
936                 prefs_common.summary_quicksearch_history);
937 }
938
939 void prefs_common_open(void)
940 {
941         if (prefs_rc_is_readonly(COMMON_RC))
942                 return;
943
944         inc_lock();
945
946         if (!dialog.window) {
947                 prefs_common_create();
948         }
949
950         manage_window_set_transient(GTK_WINDOW(dialog.window));
951         gtk_notebook_set_page(GTK_NOTEBOOK(dialog.notebook), 0);
952         gtk_widget_grab_focus(dialog.ok_btn);
953
954         prefs_set_dialog(param);
955
956         gtk_widget_show(dialog.window);
957 }
958
959 static void prefs_common_create(void)
960 {
961         gint page = 0;
962
963         debug_print("Creating common preferences window...\n");
964
965         prefs_dialog_create(&dialog);
966         gtk_window_set_title (GTK_WINDOW(dialog.window),
967                               _("Common Preferences"));
968         gtk_signal_connect (GTK_OBJECT(dialog.window), "delete_event",
969                             GTK_SIGNAL_FUNC(prefs_common_deleted), NULL);
970         gtk_signal_connect (GTK_OBJECT(dialog.window), "key_press_event",
971                             GTK_SIGNAL_FUNC(prefs_common_key_pressed), NULL);
972         MANAGE_WINDOW_SIGNALS_CONNECT(dialog.window);
973
974         gtk_signal_connect (GTK_OBJECT(dialog.ok_btn), "clicked",
975                             GTK_SIGNAL_FUNC(prefs_common_ok), NULL);
976         gtk_signal_connect (GTK_OBJECT(dialog.apply_btn), "clicked",
977                             GTK_SIGNAL_FUNC(prefs_common_apply), NULL);
978         gtk_signal_connect_object (GTK_OBJECT(dialog.cancel_btn), "clicked",
979                                    GTK_SIGNAL_FUNC(prefs_common_cancel),
980                                    GTK_OBJECT(dialog.window));
981
982         /* create all widgets on notebook */
983         prefs_receive_create();
984         SET_NOTEBOOK_LABEL(dialog.notebook, _("Receive"),   page++);
985         prefs_send_create();
986         SET_NOTEBOOK_LABEL(dialog.notebook, _("Send"),      page++);
987         prefs_compose_create();
988         SET_NOTEBOOK_LABEL(dialog.notebook, _("Compose"),   page++);
989         prefs_quote_create();
990         SET_NOTEBOOK_LABEL(dialog.notebook, _("Quote"),   page++);
991         prefs_display_create();
992         SET_NOTEBOOK_LABEL(dialog.notebook, _("Display"),   page++);
993         prefs_message_create();
994         SET_NOTEBOOK_LABEL(dialog.notebook, _("Message"),   page++);
995 #if USE_GPGME
996         prefs_privacy_create();
997         SET_NOTEBOOK_LABEL(dialog.notebook, _("Privacy"),   page++);
998 #endif
999         prefs_interface_create();
1000         SET_NOTEBOOK_LABEL(dialog.notebook, _("Interface"), page++);
1001         prefs_other_create();
1002         SET_NOTEBOOK_LABEL(dialog.notebook, _("Other"),     page++);
1003
1004         gtk_widget_show_all(dialog.window);
1005 }
1006
1007 static void prefs_receive_create(void)
1008 {
1009         GtkWidget *vbox1;
1010         GtkWidget *vbox2;
1011         GtkWidget *frame_incext;
1012         GtkWidget *checkbtn_incext;
1013         GtkWidget *hbox;
1014         GtkWidget *label_incext;
1015         GtkWidget *entry_incext;
1016         /* GtkWidget *button_incext; */
1017
1018         GtkWidget *hbox_autochk;
1019         GtkWidget *checkbtn_autochk;
1020         GtkWidget *label_autochk1;
1021         GtkObject *spinbtn_autochk_adj;
1022         GtkWidget *spinbtn_autochk;
1023         GtkWidget *label_autochk2;
1024         GtkWidget *checkbtn_chkonstartup;
1025         GtkWidget *checkbtn_scan_after_inc;
1026
1027
1028         GtkWidget *frame_newmail;
1029         GtkWidget *hbox_newmail_notify;
1030         GtkWidget *checkbtn_newmail_auto;
1031         GtkWidget *checkbtn_newmail_manu;
1032         GtkWidget *entry_newmail_notify_cmd;
1033         GtkWidget *label_newmail_notify_cmd;
1034
1035         GtkWidget *hbox_recvdialog;
1036         GtkWidget *label_recvdialog;
1037         GtkWidget *menu;
1038         GtkWidget *menuitem;
1039         GtkWidget *optmenu_recvdialog;
1040         GtkWidget *checkbtn_no_recv_err_panel;
1041         GtkWidget *checkbtn_close_recv_dialog;
1042
1043         vbox1 = gtk_vbox_new (FALSE, VSPACING);
1044         gtk_widget_show (vbox1);
1045         gtk_container_add (GTK_CONTAINER (dialog.notebook), vbox1);
1046         gtk_container_set_border_width (GTK_CONTAINER (vbox1), VBOX_BORDER);
1047
1048         PACK_FRAME(vbox1, frame_incext, _("External program"));
1049
1050         vbox2 = gtk_vbox_new (FALSE, VSPACING_NARROW);
1051         gtk_widget_show (vbox2);
1052         gtk_container_add (GTK_CONTAINER (frame_incext), vbox2);
1053         gtk_container_set_border_width (GTK_CONTAINER (vbox2), 8);
1054
1055         /* Use of external incorporation program */
1056         PACK_CHECK_BUTTON (vbox2, checkbtn_incext,
1057                            _("Use external program for incorporation"));
1058
1059         hbox = gtk_hbox_new (FALSE, 8);
1060         gtk_widget_show (hbox);
1061         gtk_box_pack_start (GTK_BOX (vbox2), hbox, FALSE, FALSE, 0);
1062         SET_TOGGLE_SENSITIVITY (checkbtn_incext, hbox);
1063
1064         label_incext = gtk_label_new (_("Command"));
1065         gtk_widget_show (label_incext);
1066         gtk_box_pack_start (GTK_BOX (hbox), label_incext, FALSE, FALSE, 0);
1067
1068         entry_incext = gtk_entry_new ();
1069         gtk_widget_show (entry_incext);
1070         gtk_box_pack_start (GTK_BOX (hbox), entry_incext, TRUE, TRUE, 0);
1071
1072 #if 0
1073         button_incext = gtk_button_new_with_label ("... ");
1074         gtk_widget_show (button_incext);
1075         gtk_box_pack_start (GTK_BOX (hbox), button_incext, FALSE, FALSE, 0);
1076 #endif
1077
1078         vbox2 = gtk_vbox_new (FALSE, 0);
1079         gtk_widget_show (vbox2);
1080         gtk_box_pack_start (GTK_BOX (vbox1), vbox2, FALSE, FALSE, 0);
1081
1082         /* Auto-checking */
1083         hbox_autochk = gtk_hbox_new (FALSE, 8);
1084         gtk_widget_show (hbox_autochk);
1085         gtk_box_pack_start (GTK_BOX (vbox2), hbox_autochk, FALSE, FALSE, 0);
1086
1087         PACK_CHECK_BUTTON (hbox_autochk, checkbtn_autochk,
1088                            _("Auto-check new mail"));
1089
1090         label_autochk1 = gtk_label_new (_("every"));
1091         gtk_widget_show (label_autochk1);
1092         gtk_box_pack_start (GTK_BOX (hbox_autochk), label_autochk1, FALSE, FALSE, 0);
1093
1094         spinbtn_autochk_adj = gtk_adjustment_new (5, 1, 100, 1, 10, 10);
1095         spinbtn_autochk = gtk_spin_button_new
1096                 (GTK_ADJUSTMENT (spinbtn_autochk_adj), 1, 0);
1097         gtk_widget_show (spinbtn_autochk);
1098         gtk_box_pack_start (GTK_BOX (hbox_autochk), spinbtn_autochk, FALSE, FALSE, 0);
1099         gtk_widget_set_usize (spinbtn_autochk, 64, -1);
1100         gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (spinbtn_autochk), TRUE);
1101
1102         label_autochk2 = gtk_label_new (_("minute(s)"));
1103         gtk_widget_show (label_autochk2);
1104         gtk_box_pack_start (GTK_BOX (hbox_autochk), label_autochk2, FALSE, FALSE, 0);
1105
1106         SET_TOGGLE_SENSITIVITY(checkbtn_autochk, label_autochk1);
1107         SET_TOGGLE_SENSITIVITY(checkbtn_autochk, spinbtn_autochk);
1108         SET_TOGGLE_SENSITIVITY(checkbtn_autochk, label_autochk2);
1109
1110         PACK_CHECK_BUTTON (vbox2, checkbtn_chkonstartup,
1111                            _("Check new mail on startup"));
1112         PACK_CHECK_BUTTON (vbox2, checkbtn_scan_after_inc,
1113                            _("Update all local folders after incorporation"));
1114
1115
1116         /* receive dialog */
1117         hbox_recvdialog = gtk_hbox_new (FALSE, 8);
1118         gtk_widget_show (hbox_recvdialog);
1119         gtk_box_pack_start (GTK_BOX (vbox2), hbox_recvdialog, FALSE, FALSE, 0);
1120
1121         label_recvdialog = gtk_label_new (_("Show receive dialog"));
1122         gtk_misc_set_alignment(GTK_MISC(label_recvdialog), 0, 0.5);
1123         gtk_widget_show (label_recvdialog);
1124         gtk_box_pack_start (GTK_BOX (hbox_recvdialog), label_recvdialog, FALSE, FALSE, 0);
1125
1126         optmenu_recvdialog = gtk_option_menu_new ();
1127         gtk_widget_show (optmenu_recvdialog);
1128         gtk_box_pack_start (GTK_BOX (hbox_recvdialog), optmenu_recvdialog, FALSE, FALSE, 0);
1129
1130         menu = gtk_menu_new ();
1131         MENUITEM_ADD (menu, menuitem, _("Always"), RECV_DIALOG_ALWAYS);
1132         MENUITEM_ADD (menu, menuitem, _("Only on manual receiving"),
1133                       RECV_DIALOG_MANUAL);
1134         MENUITEM_ADD (menu, menuitem, _("Never"), RECV_DIALOG_NEVER);
1135
1136         gtk_option_menu_set_menu (GTK_OPTION_MENU (optmenu_recvdialog), menu);
1137
1138         PACK_CHECK_BUTTON (vbox2, checkbtn_no_recv_err_panel,
1139                            _("Don't popup error dialog on receive error"));
1140
1141         PACK_CHECK_BUTTON (vbox2, checkbtn_close_recv_dialog,
1142                            _("Close receive dialog when finished"));
1143         
1144         PACK_FRAME(vbox1, frame_newmail, _("Run command when new mail "
1145                                            "arrives"));
1146         vbox2 = gtk_vbox_new (FALSE, VSPACING_NARROW);
1147         gtk_widget_show (vbox2);
1148         gtk_container_add (GTK_CONTAINER (frame_newmail), vbox2);
1149         gtk_container_set_border_width (GTK_CONTAINER (vbox2), 8);
1150
1151         hbox = gtk_hbox_new (TRUE, 8);
1152         gtk_widget_show (hbox);
1153         PACK_CHECK_BUTTON (hbox, checkbtn_newmail_auto,
1154                            _("after autochecking"));
1155         PACK_CHECK_BUTTON (hbox, checkbtn_newmail_manu,
1156                            _("after manual checking"));
1157         gtk_box_pack_start (GTK_BOX(vbox2), hbox, FALSE, FALSE, 0);
1158         gtk_signal_connect(GTK_OBJECT(checkbtn_newmail_auto), "toggled",
1159                            GTK_SIGNAL_FUNC(prefs_common_recv_dialog_newmail_notify_toggle_cb),
1160                            NULL);
1161         gtk_signal_connect(GTK_OBJECT(checkbtn_newmail_manu), "toggled",
1162                            GTK_SIGNAL_FUNC(prefs_common_recv_dialog_newmail_notify_toggle_cb),
1163                            NULL);
1164
1165         hbox_newmail_notify = gtk_hbox_new (FALSE, 8);
1166         gtk_widget_show (hbox);
1167         gtk_box_pack_start (GTK_BOX (vbox2), hbox_newmail_notify, FALSE, 
1168                             FALSE, 0);
1169
1170         label_newmail_notify_cmd = gtk_label_new (_("Command to execute:\n"
1171                                                     "(use %d as number of new "
1172                                                     "mails)"));
1173         gtk_label_set_justify(GTK_LABEL(label_newmail_notify_cmd), 
1174                               GTK_JUSTIFY_RIGHT);
1175         gtk_widget_show (label_newmail_notify_cmd);
1176         gtk_box_pack_start (GTK_BOX (hbox_newmail_notify), 
1177                             label_newmail_notify_cmd, FALSE, FALSE, 0);
1178
1179         entry_newmail_notify_cmd = gtk_entry_new ();
1180         gtk_widget_show (entry_newmail_notify_cmd);
1181         gtk_box_pack_start (GTK_BOX (hbox_newmail_notify), 
1182                             entry_newmail_notify_cmd, TRUE, TRUE, 0);
1183
1184         gtk_widget_set_sensitive(hbox_newmail_notify, 
1185                                  prefs_common.newmail_notify_auto || 
1186                                  prefs_common.newmail_notify_manu);
1187
1188         receive.checkbtn_incext = checkbtn_incext;
1189         receive.entry_incext    = entry_incext;
1190         /* receive.button_incext   = button_incext; */
1191
1192         receive.checkbtn_autochk    = checkbtn_autochk;
1193         receive.spinbtn_autochk     = spinbtn_autochk;
1194         receive.spinbtn_autochk_adj = spinbtn_autochk_adj;
1195
1196         receive.checkbtn_chkonstartup = checkbtn_chkonstartup;
1197         receive.checkbtn_scan_after_inc = checkbtn_scan_after_inc;
1198
1199
1200         receive.checkbtn_newmail_auto  = checkbtn_newmail_auto;
1201         receive.checkbtn_newmail_manu  = checkbtn_newmail_manu;
1202         receive.hbox_newmail_notify    = hbox_newmail_notify;
1203         receive.entry_newmail_notify_cmd = entry_newmail_notify_cmd;
1204         receive.optmenu_recvdialog          = optmenu_recvdialog;
1205         receive.checkbtn_no_recv_err_panel  = checkbtn_no_recv_err_panel;
1206         receive.checkbtn_close_recv_dialog  = checkbtn_close_recv_dialog;
1207 }
1208
1209 static void prefs_send_create(void)
1210 {
1211         GtkWidget *vbox1;
1212         GtkWidget *vbox2;
1213         GtkWidget *hbox1;
1214         GtkWidget *checkbtn_savemsg;
1215         GtkWidget *label_outcharset;
1216         GtkWidget *optmenu_charset;
1217         GtkWidget *optmenu_menu;
1218         GtkWidget *menuitem;
1219         GtkTooltips *charset_tooltip;
1220         GtkWidget *optmenu_encoding;
1221         GtkWidget *label_encoding;
1222         GtkTooltips *encoding_tooltip;
1223         GtkWidget *label_senddialog;
1224         GtkWidget *menu;
1225         GtkWidget *optmenu_senddialog;
1226         GtkWidget *hbox_senddialog;
1227
1228         vbox1 = gtk_vbox_new (FALSE, VSPACING);
1229         gtk_widget_show (vbox1);
1230         gtk_container_add (GTK_CONTAINER (dialog.notebook), vbox1);
1231         gtk_container_set_border_width (GTK_CONTAINER (vbox1), VBOX_BORDER);
1232
1233         vbox2 = gtk_vbox_new (FALSE, 0);
1234         gtk_widget_show (vbox2);
1235         gtk_box_pack_start (GTK_BOX (vbox1), vbox2, FALSE, FALSE, 0);
1236
1237         PACK_CHECK_BUTTON (vbox2, checkbtn_savemsg,
1238                            _("Save sent messages to Sent folder"));
1239
1240         hbox_senddialog = gtk_hbox_new (FALSE, 8);
1241         gtk_box_pack_start (GTK_BOX (vbox1), hbox_senddialog, FALSE, FALSE, 0);
1242
1243         label_senddialog = gtk_label_new (_("Show send dialog"));
1244         gtk_widget_show (label_senddialog);
1245         gtk_box_pack_start (GTK_BOX (hbox_senddialog), label_senddialog, FALSE, FALSE, 0);
1246
1247         optmenu_senddialog = gtk_option_menu_new ();
1248         gtk_widget_show (optmenu_senddialog);
1249         gtk_box_pack_start (GTK_BOX (hbox_senddialog), optmenu_senddialog, FALSE, FALSE, 0);
1250         
1251         menu = gtk_menu_new ();
1252         MENUITEM_ADD (menu, menuitem, _("Always"), SEND_DIALOG_ALWAYS);
1253         MENUITEM_ADD (menu, menuitem, _("Never"), SEND_DIALOG_NEVER);
1254
1255         gtk_option_menu_set_menu (GTK_OPTION_MENU (optmenu_senddialog), menu);
1256
1257         hbox1 = gtk_hbox_new (FALSE, 8);
1258         gtk_widget_show (hbox1);
1259         gtk_box_pack_start (GTK_BOX (vbox1), hbox1, FALSE, FALSE, 0);
1260
1261         label_outcharset = gtk_label_new (_("Outgoing codeset"));
1262         gtk_widget_show (label_outcharset);
1263         gtk_box_pack_start (GTK_BOX (hbox1), label_outcharset, FALSE, FALSE, 0);
1264
1265         charset_tooltip = gtk_tooltips_new();
1266
1267         optmenu_charset = gtk_option_menu_new ();
1268         gtk_widget_show (optmenu_charset);
1269         gtk_tooltips_set_tip(GTK_TOOLTIPS(charset_tooltip), optmenu_charset,
1270                              _("If `Automatic' is selected, the optimal encoding"
1271                                " for the current locale will be used"),
1272                              NULL);
1273         gtk_box_pack_start (GTK_BOX (hbox1), optmenu_charset, FALSE, FALSE, 0);
1274
1275         optmenu_menu = gtk_menu_new ();
1276
1277 #define SET_MENUITEM(str, data) \
1278 { \
1279         MENUITEM_ADD(optmenu_menu, menuitem, str, data); \
1280 }
1281
1282         SET_MENUITEM(_("Automatic (Recommended)"),       CS_AUTO);
1283         SET_MENUITEM(_("7bit ascii (US-ASCII)"),         CS_US_ASCII);
1284 #if HAVE_ICONV
1285         SET_MENUITEM(_("Unicode (UTF-8)"),               CS_UTF_8);
1286 #endif
1287         SET_MENUITEM(_("Western European (ISO-8859-1)"),  CS_ISO_8859_1);
1288         SET_MENUITEM(_("Western European (ISO-8859-15)"), CS_ISO_8859_15);
1289         SET_MENUITEM(_("Central European (ISO-8859-2)"),  CS_ISO_8859_2);
1290         SET_MENUITEM(_("Baltic (ISO-8859-13)"),           CS_ISO_8859_13);
1291         SET_MENUITEM(_("Baltic (ISO-8859-4)"),            CS_ISO_8859_4);
1292         SET_MENUITEM(_("Greek (ISO-8859-7)"),             CS_ISO_8859_7);
1293         SET_MENUITEM(_("Turkish (ISO-8859-9)"),           CS_ISO_8859_9);
1294 #if HAVE_ICONV
1295         SET_MENUITEM(_("Cyrillic (ISO-8859-5)"),          CS_ISO_8859_5);
1296 #endif
1297         SET_MENUITEM(_("Cyrillic (KOI8-R)"),             CS_KOI8_R);
1298 #if HAVE_ICONV
1299         SET_MENUITEM(_("Cyrillic (Windows-1251)"),       CS_WINDOWS_1251);
1300         SET_MENUITEM(_("Cyrillic (KOI8-U)"),             CS_KOI8_U);
1301 #endif
1302         SET_MENUITEM(_("Japanese (ISO-2022-JP)"),        CS_ISO_2022_JP);
1303 #if 0
1304         SET_MENUITEM(_("Japanese (EUC-JP)"),             CS_EUC_JP);
1305         SET_MENUITEM(_("Japanese (Shift_JIS)"),          CS_SHIFT_JIS);
1306 #endif /* 0 */
1307         SET_MENUITEM(_("Simplified Chinese (GB2312)"),   CS_GB2312);
1308         SET_MENUITEM(_("Traditional Chinese (Big5)"),    CS_BIG5);
1309 #if 0
1310         SET_MENUITEM(_("Traditional Chinese (EUC-TW)"),  CS_EUC_TW);
1311         SET_MENUITEM(_("Chinese (ISO-2022-CN)"),         CS_ISO_2022_CN);
1312 #endif /* 0 */
1313         SET_MENUITEM(_("Korean (EUC-KR)"),               CS_EUC_KR);
1314         SET_MENUITEM(_("Thai (TIS-620)"),                CS_TIS_620);
1315         SET_MENUITEM(_("Thai (Windows-874)"),            CS_WINDOWS_874);
1316
1317         gtk_option_menu_set_menu (GTK_OPTION_MENU (optmenu_charset),
1318                                   optmenu_menu);
1319
1320         hbox1 = gtk_hbox_new (FALSE, 8);
1321         gtk_widget_show (hbox1);
1322         gtk_box_pack_start (GTK_BOX (vbox1), hbox1, FALSE, FALSE, 0);
1323
1324         hbox1 = gtk_hbox_new (FALSE, 8);
1325         gtk_widget_show (hbox1);
1326         gtk_box_pack_start (GTK_BOX (vbox1), hbox1, FALSE, FALSE, 0);
1327
1328         label_encoding = gtk_label_new (_("Transfer encoding"));
1329         gtk_widget_show (label_encoding);
1330         gtk_box_pack_start (GTK_BOX (hbox1), label_encoding, FALSE, FALSE, 0);
1331
1332         encoding_tooltip = gtk_tooltips_new();
1333
1334         optmenu_encoding = gtk_option_menu_new ();
1335         gtk_widget_show (optmenu_encoding);
1336         gtk_tooltips_set_tip(GTK_TOOLTIPS(encoding_tooltip), optmenu_encoding,
1337                              _("Specify Content-Transfer-Encoding used when"
1338                                " message body contains non-ASCII characters"),
1339                              NULL);
1340         gtk_box_pack_start (GTK_BOX (hbox1), optmenu_encoding, FALSE, FALSE, 0);
1341
1342         optmenu_menu = gtk_menu_new ();
1343
1344         SET_MENUITEM(_("Automatic"),     CTE_AUTO);
1345         SET_MENUITEM("base64",           CTE_BASE64);
1346         SET_MENUITEM("quoted-printable", CTE_QUOTED_PRINTABLE);
1347         SET_MENUITEM("8bit",             CTE_8BIT);
1348
1349         gtk_option_menu_set_menu (GTK_OPTION_MENU (optmenu_encoding),
1350                                   optmenu_menu);
1351
1352         hbox1 = gtk_hbox_new (FALSE, 8);
1353         gtk_widget_show (hbox1);
1354         gtk_box_pack_start (GTK_BOX (vbox1), hbox1, FALSE, FALSE, 0);
1355
1356         p_send.checkbtn_savemsg  = checkbtn_savemsg;
1357         p_send.optmenu_senddialog = optmenu_senddialog;
1358
1359         p_send.optmenu_charset = optmenu_charset;
1360         p_send.optmenu_encoding_method = optmenu_encoding;
1361 }
1362
1363 static void prefs_common_recv_dialog_newmail_notify_toggle_cb(GtkWidget *w, gpointer data)
1364 {
1365         gboolean toggled;
1366
1367         toggled = gtk_toggle_button_get_active
1368                         (GTK_TOGGLE_BUTTON(receive.checkbtn_newmail_manu)) ||
1369                   gtk_toggle_button_get_active
1370                         (GTK_TOGGLE_BUTTON(receive.checkbtn_newmail_auto));
1371         gtk_widget_set_sensitive(receive.hbox_newmail_notify, toggled);
1372 }
1373
1374 static void prefs_compose_create(void)
1375 {
1376         GtkWidget *vbox1;
1377         GtkWidget *vbox2;
1378
1379         GtkWidget *checkbtn_autoextedit;
1380
1381         GtkWidget *frame_autosel;
1382         GtkWidget *hbox_autosel;
1383         GtkWidget *checkbtn_reply_account_autosel;
1384         GtkWidget *checkbtn_forward_account_autosel;
1385         GtkWidget *checkbtn_reedit_account_autosel;
1386
1387         GtkWidget *hbox_undolevel;
1388         GtkWidget *label_undolevel;
1389         GtkObject *spinbtn_undolevel_adj;
1390         GtkWidget *spinbtn_undolevel;
1391
1392         GtkWidget *vbox_linewrap;
1393
1394         GtkWidget *hbox3;
1395         GtkWidget *hbox4;
1396         GtkWidget *hbox5;
1397         GtkWidget *label_linewrap;
1398         GtkObject *spinbtn_linewrap_adj;
1399         GtkWidget *spinbtn_linewrap;
1400         GtkWidget *checkbtn_wrapquote;
1401         GtkWidget *checkbtn_autowrap;
1402         GtkWidget *checkbtn_wrapatsend;
1403
1404         GtkWidget *checkbtn_default_reply_list;
1405
1406         GtkWidget *checkbtn_forward_as_attachment;
1407         GtkWidget *checkbtn_redirect_keep_from;
1408         GtkWidget *checkbtn_smart_wrapping;
1409         GtkWidget *checkbtn_block_cursor;
1410         GtkWidget *frame_msgwrap;
1411
1412         GtkWidget *hbox_autosave;
1413         GtkWidget *checkbtn_autosave;
1414         GtkWidget *entry_autosave_length;
1415         GtkWidget *label_autosave_length;
1416         
1417         vbox1 = gtk_vbox_new (FALSE, VSPACING);
1418         gtk_widget_show (vbox1);
1419         gtk_container_add (GTK_CONTAINER (dialog.notebook), vbox1);
1420         gtk_container_set_border_width (GTK_CONTAINER (vbox1), VBOX_BORDER);
1421
1422         /* Account autoselection */
1423         PACK_FRAME(vbox1, frame_autosel, _("Automatic account selection"));
1424
1425         hbox_autosel = gtk_hbox_new (FALSE, VSPACING_NARROW);
1426         gtk_widget_show (hbox_autosel);
1427         gtk_container_add (GTK_CONTAINER (frame_autosel), hbox_autosel);
1428         gtk_container_set_border_width (GTK_CONTAINER (hbox_autosel), 8);
1429
1430         PACK_CHECK_BUTTON (hbox_autosel, checkbtn_reply_account_autosel,
1431                            _("when replying"));
1432         PACK_CHECK_BUTTON (hbox_autosel, checkbtn_forward_account_autosel,
1433                            _("when forwarding"));
1434         PACK_CHECK_BUTTON (hbox_autosel, checkbtn_reedit_account_autosel,
1435                            _("when re-editing"));
1436
1437         vbox2 = gtk_vbox_new (FALSE, 0);
1438         gtk_widget_show (vbox2);
1439         gtk_box_pack_start (GTK_BOX (vbox1), vbox2, FALSE, FALSE, 0);
1440
1441         PACK_CHECK_BUTTON (vbox2, checkbtn_default_reply_list,
1442                            _("Reply button invokes mailing list reply"));
1443
1444         PACK_CHECK_BUTTON (vbox2, checkbtn_autoextedit,
1445                            _("Automatically launch the external editor"));
1446
1447         hbox5 = gtk_hbox_new (FALSE, 8);
1448         gtk_widget_show (hbox5);
1449         gtk_box_pack_start (GTK_BOX (vbox2), hbox5, FALSE, FALSE, 0);
1450
1451         PACK_CHECK_BUTTON (hbox5, checkbtn_forward_as_attachment,
1452                            _("Forward as attachment"));
1453
1454         PACK_CHECK_BUTTON (hbox5, checkbtn_block_cursor,
1455                           _("Block cursor"));
1456
1457         PACK_CHECK_BUTTON (vbox2, checkbtn_redirect_keep_from,
1458                            _("Keep the original 'From' header when redirecting"));
1459
1460         
1461         hbox_autosave = gtk_hbox_new (FALSE, 8);
1462         gtk_widget_show (hbox_autosave);
1463         gtk_box_pack_start (GTK_BOX (vbox1), hbox_autosave, FALSE, FALSE, 0);
1464         
1465         PACK_CHECK_BUTTON (hbox_autosave, checkbtn_autosave,
1466                            _("Autosave to Drafts folder every "));
1467
1468         entry_autosave_length = gtk_entry_new();
1469         gtk_widget_set_usize (entry_autosave_length, 64, -1);   
1470         gtk_widget_show (entry_autosave_length);
1471         gtk_box_pack_start (GTK_BOX (hbox_autosave), entry_autosave_length, FALSE, FALSE, 0);
1472         
1473         label_autosave_length = gtk_label_new(_("characters"));
1474         gtk_widget_show (label_autosave_length);
1475         gtk_box_pack_start (GTK_BOX (hbox_autosave), label_autosave_length, FALSE, FALSE, 0);
1476         
1477         hbox_undolevel = gtk_hbox_new (FALSE, 8);
1478         gtk_widget_show (hbox_undolevel);
1479         gtk_box_pack_start (GTK_BOX (vbox1), hbox_undolevel, FALSE, FALSE, 0);
1480
1481         label_undolevel = gtk_label_new (_("Undo level"));
1482         gtk_widget_show (label_undolevel);
1483         gtk_box_pack_start (GTK_BOX (hbox_undolevel), label_undolevel, FALSE, FALSE, 0);
1484
1485         spinbtn_undolevel_adj = gtk_adjustment_new (50, 0, 100, 1, 10, 10);
1486         spinbtn_undolevel = gtk_spin_button_new
1487                 (GTK_ADJUSTMENT (spinbtn_undolevel_adj), 1, 0);
1488         gtk_widget_show (spinbtn_undolevel);
1489         gtk_box_pack_start (GTK_BOX (hbox_undolevel), spinbtn_undolevel, FALSE, FALSE, 0);
1490         gtk_widget_set_usize (spinbtn_undolevel, 64, -1);
1491         gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (spinbtn_undolevel), TRUE);
1492
1493         /* line-wrapping */
1494         PACK_FRAME(vbox1, frame_msgwrap, _("Message wrapping"));
1495
1496         vbox_linewrap = gtk_vbox_new (FALSE, VSPACING_NARROW);
1497         gtk_widget_show (vbox_linewrap);
1498         gtk_container_add (GTK_CONTAINER (frame_msgwrap), vbox_linewrap);
1499         gtk_container_set_border_width (GTK_CONTAINER (vbox_linewrap), 8);
1500
1501         hbox3 = gtk_hbox_new (FALSE, 8);
1502         gtk_widget_show (hbox3);
1503         gtk_box_pack_start (GTK_BOX (vbox_linewrap), hbox3, FALSE, FALSE, 0);
1504
1505
1506         label_linewrap = gtk_label_new (_("Wrap messages at"));
1507         gtk_widget_show (label_linewrap);
1508         gtk_box_pack_start (GTK_BOX (hbox3), label_linewrap, FALSE, FALSE, 0);
1509
1510         spinbtn_linewrap_adj = gtk_adjustment_new (72, 20, 1024, 1, 10, 10);
1511         spinbtn_linewrap = gtk_spin_button_new
1512                 (GTK_ADJUSTMENT (spinbtn_linewrap_adj), 1, 0);
1513         gtk_widget_show (spinbtn_linewrap);
1514         gtk_box_pack_start (GTK_BOX (hbox3), spinbtn_linewrap, FALSE, FALSE, 0);
1515         gtk_widget_set_usize (spinbtn_linewrap, 64, -1);
1516         gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (spinbtn_linewrap), TRUE);
1517
1518         label_linewrap = gtk_label_new (_("characters"));
1519         gtk_widget_show (label_linewrap);
1520         gtk_box_pack_start (GTK_BOX (hbox3), label_linewrap, FALSE, FALSE, 0);
1521
1522         hbox4 = gtk_hbox_new (FALSE, VSPACING);
1523         gtk_widget_show (hbox4);
1524         gtk_box_pack_start (GTK_BOX (vbox_linewrap), hbox4, FALSE, FALSE, 0);
1525
1526         PACK_CHECK_BUTTON (hbox4, checkbtn_wrapquote, _("Wrap quotation"));
1527
1528         PACK_CHECK_BUTTON (hbox4, checkbtn_autowrap, _("Wrap on input"));
1529
1530         PACK_CHECK_BUTTON
1531                 (hbox4, checkbtn_wrapatsend, _("Wrap before sending"));
1532
1533         PACK_CHECK_BUTTON (vbox_linewrap, checkbtn_smart_wrapping,
1534                            _("Smart wrapping (EXPERIMENTAL)"));
1535         
1536        /*
1537         compose.checkbtn_quote   = checkbtn_quote;
1538         compose.entry_quotemark  = entry_quotemark;
1539         compose.text_quotefmt    = text_quotefmt;
1540         */
1541
1542         compose.checkbtn_autoextedit = checkbtn_autoextedit;
1543
1544         compose.checkbtn_reply_account_autosel   = checkbtn_reply_account_autosel;
1545         compose.checkbtn_forward_account_autosel = checkbtn_forward_account_autosel;
1546         compose.checkbtn_reedit_account_autosel  = checkbtn_reedit_account_autosel;
1547
1548         compose.spinbtn_undolevel     = spinbtn_undolevel;
1549         compose.spinbtn_undolevel_adj = spinbtn_undolevel_adj;
1550
1551         compose.spinbtn_linewrap      = spinbtn_linewrap;
1552         compose.spinbtn_linewrap_adj  = spinbtn_linewrap_adj;
1553         compose.checkbtn_wrapquote    = checkbtn_wrapquote;
1554         compose.checkbtn_autowrap     = checkbtn_autowrap;
1555         compose.checkbtn_wrapatsend   = checkbtn_wrapatsend;
1556
1557         compose.checkbtn_autosave     = checkbtn_autosave;
1558         compose.entry_autosave_length = entry_autosave_length;
1559         
1560         compose.checkbtn_forward_as_attachment =
1561                 checkbtn_forward_as_attachment;
1562         compose.checkbtn_redirect_keep_from =
1563                 checkbtn_redirect_keep_from;
1564         compose.checkbtn_smart_wrapping = 
1565                 checkbtn_smart_wrapping;
1566         compose.checkbtn_block_cursor   =
1567                 checkbtn_block_cursor;
1568         compose.checkbtn_default_reply_list = checkbtn_default_reply_list;
1569 }
1570
1571 static void prefs_quote_create(void)
1572 {
1573         GtkWidget *vbox1;
1574         GtkWidget *frame_quote;
1575         GtkWidget *vbox_quote;
1576         GtkWidget *hbox1;
1577         GtkWidget *hbox2;
1578         GtkWidget *label_quotemark;
1579         GtkWidget *entry_quotemark;
1580         GtkWidget *scrolledwin_quotefmt;
1581         GtkWidget *text_quotefmt;
1582
1583         GtkWidget *entry_fw_quotemark;
1584         GtkWidget *text_fw_quotefmt;
1585
1586         GtkWidget *entry_quote_chars;
1587         GtkWidget *label_quote_chars;
1588         
1589         GtkWidget *btn_quotedesc;
1590
1591         GtkWidget *checkbtn_reply_with_quote;
1592
1593         vbox1 = gtk_vbox_new (FALSE, VSPACING);
1594         gtk_widget_show (vbox1);
1595         gtk_container_add (GTK_CONTAINER (dialog.notebook), vbox1);
1596         gtk_container_set_border_width (GTK_CONTAINER (vbox1), VBOX_BORDER);
1597
1598         /* reply */
1599
1600         PACK_CHECK_BUTTON (vbox1, checkbtn_reply_with_quote, _("Reply will quote by default"));
1601
1602         PACK_FRAME (vbox1, frame_quote, _("Reply format"));
1603
1604         vbox_quote = gtk_vbox_new (FALSE, VSPACING_NARROW);
1605         gtk_widget_show (vbox_quote);
1606         gtk_container_add (GTK_CONTAINER (frame_quote), vbox_quote);
1607         gtk_container_set_border_width (GTK_CONTAINER (vbox_quote), 8);
1608
1609         hbox1 = gtk_hbox_new (FALSE, 32);
1610         gtk_widget_show (hbox1);
1611         gtk_box_pack_start (GTK_BOX (vbox_quote), hbox1, FALSE, FALSE, 0);
1612
1613         hbox2 = gtk_hbox_new (FALSE, 8);
1614         gtk_widget_show (hbox2);
1615         gtk_box_pack_start (GTK_BOX (hbox1), hbox2, FALSE, FALSE, 0);
1616
1617         label_quotemark = gtk_label_new (_("Quotation mark"));
1618         gtk_widget_show (label_quotemark);
1619         gtk_box_pack_start (GTK_BOX (hbox2), label_quotemark, FALSE, FALSE, 0);
1620
1621         entry_quotemark = gtk_entry_new ();
1622         gtk_widget_show (entry_quotemark);
1623         gtk_box_pack_start (GTK_BOX (hbox2), entry_quotemark, FALSE, FALSE, 0);
1624         gtk_widget_set_usize (entry_quotemark, 64, -1);
1625
1626         scrolledwin_quotefmt = gtk_scrolled_window_new (NULL, NULL);
1627         gtk_widget_show (scrolledwin_quotefmt);
1628         gtk_box_pack_start (GTK_BOX (vbox_quote), scrolledwin_quotefmt, TRUE, TRUE, 0);
1629         gtk_scrolled_window_set_policy
1630                 (GTK_SCROLLED_WINDOW (scrolledwin_quotefmt),
1631                  GTK_POLICY_NEVER, GTK_POLICY_ALWAYS);
1632
1633         text_quotefmt = gtk_text_new (NULL, NULL);
1634         gtk_widget_show (text_quotefmt);
1635         gtk_container_add(GTK_CONTAINER(scrolledwin_quotefmt), text_quotefmt);
1636         gtk_text_set_editable (GTK_TEXT (text_quotefmt), TRUE);
1637         gtk_widget_set_usize(text_quotefmt, -1, 60);
1638
1639         /* forward */
1640
1641         PACK_FRAME (vbox1, frame_quote, _("Forward format"));
1642
1643         vbox_quote = gtk_vbox_new (FALSE, VSPACING_NARROW);
1644         gtk_widget_show (vbox_quote);
1645         gtk_container_add (GTK_CONTAINER (frame_quote), vbox_quote);
1646         gtk_container_set_border_width (GTK_CONTAINER (vbox_quote), 8);
1647
1648         hbox1 = gtk_hbox_new (FALSE, 32);
1649         gtk_widget_show (hbox1);
1650         gtk_box_pack_start (GTK_BOX (vbox_quote), hbox1, FALSE, FALSE, 0);
1651
1652         hbox2 = gtk_hbox_new (FALSE, 8);
1653         gtk_widget_show (hbox2);
1654         gtk_box_pack_start (GTK_BOX (hbox1), hbox2, FALSE, FALSE, 0);
1655
1656         label_quotemark = gtk_label_new (_("Quotation mark"));
1657         gtk_widget_show (label_quotemark);
1658         gtk_box_pack_start (GTK_BOX (hbox2), label_quotemark, FALSE, FALSE, 0);
1659
1660         entry_fw_quotemark = gtk_entry_new ();
1661         gtk_widget_show (entry_fw_quotemark);
1662         gtk_box_pack_start (GTK_BOX (hbox2), entry_fw_quotemark,
1663                             FALSE, FALSE, 0);
1664         gtk_widget_set_usize (entry_fw_quotemark, 64, -1);
1665
1666         scrolledwin_quotefmt = gtk_scrolled_window_new (NULL, NULL);
1667         gtk_widget_show (scrolledwin_quotefmt);
1668         gtk_box_pack_start (GTK_BOX (vbox_quote), scrolledwin_quotefmt, TRUE, TRUE, 0);
1669         gtk_scrolled_window_set_policy
1670                 (GTK_SCROLLED_WINDOW (scrolledwin_quotefmt),
1671                  GTK_POLICY_NEVER, GTK_POLICY_ALWAYS);
1672
1673         text_fw_quotefmt = gtk_text_new (NULL, NULL);
1674         gtk_widget_show (text_fw_quotefmt);
1675         gtk_container_add(GTK_CONTAINER(scrolledwin_quotefmt),
1676                           text_fw_quotefmt);
1677         gtk_text_set_editable (GTK_TEXT (text_fw_quotefmt), TRUE);
1678         gtk_widget_set_usize(text_fw_quotefmt, -1, 60);
1679
1680         hbox1 = gtk_hbox_new (FALSE, 32);
1681         gtk_widget_show (hbox1);
1682         gtk_box_pack_start (GTK_BOX (vbox1), hbox1, FALSE, FALSE, 0);
1683
1684         btn_quotedesc =
1685                 gtk_button_new_with_label (_(" Description of symbols "));
1686         gtk_widget_show (btn_quotedesc);
1687         gtk_box_pack_start (GTK_BOX (hbox1), btn_quotedesc, FALSE, FALSE, 0);
1688         gtk_signal_connect(GTK_OBJECT(btn_quotedesc), "clicked",
1689                            GTK_SIGNAL_FUNC(quote_fmt_quote_description), NULL);
1690
1691         /* quote chars */
1692
1693         PACK_FRAME (vbox1, frame_quote, _("Quotation characters"));
1694
1695         vbox_quote = gtk_vbox_new (FALSE, VSPACING_NARROW);
1696         gtk_widget_show (vbox_quote);
1697         gtk_container_add (GTK_CONTAINER (frame_quote), vbox_quote);
1698         gtk_container_set_border_width (GTK_CONTAINER (vbox_quote), 8);
1699
1700         hbox1 = gtk_hbox_new (FALSE, 32);
1701         gtk_widget_show (hbox1);
1702         gtk_box_pack_start (GTK_BOX (vbox_quote), hbox1, FALSE, FALSE, 0);
1703
1704         hbox2 = gtk_hbox_new (FALSE, 8);
1705         gtk_widget_show (hbox2);
1706         gtk_box_pack_start (GTK_BOX (hbox1), hbox2, FALSE, FALSE, 0);
1707
1708         label_quote_chars = gtk_label_new (_("Treat these characters as quotation marks: "));
1709         gtk_widget_show (label_quote_chars);
1710         gtk_box_pack_start (GTK_BOX (hbox2), label_quote_chars, FALSE, FALSE, 0);
1711
1712         entry_quote_chars = gtk_entry_new ();
1713         gtk_widget_show (entry_quote_chars);
1714         gtk_box_pack_start (GTK_BOX (hbox2), entry_quote_chars,
1715                             FALSE, FALSE, 0);
1716         gtk_widget_set_usize (entry_quote_chars, 64, -1);
1717
1718
1719         compose.checkbtn_reply_with_quote= checkbtn_reply_with_quote;
1720         quote.entry_quotemark    = entry_quotemark;
1721         quote.text_quotefmt      = text_quotefmt;
1722         quote.entry_fw_quotemark = entry_fw_quotemark;
1723         quote.text_fw_quotefmt   = text_fw_quotefmt;
1724         quote.entry_quote_chars  = entry_quote_chars;
1725 }
1726
1727 static void prefs_display_create(void)
1728 {
1729         GtkWidget *vbox1;
1730         GtkWidget *chkbtn_transhdr;
1731         GtkWidget *chkbtn_folder_unread;
1732         GtkWidget *hbox1;
1733         GtkWidget *label_ng_abbrev;
1734         GtkWidget *spinbtn_ng_abbrev_len;
1735         GtkObject *spinbtn_ng_abbrev_len_adj;
1736         GtkWidget *frame_summary;
1737         GtkWidget *vbox2;
1738         GtkWidget *chkbtn_swapfrom;
1739         GtkWidget *chkbtn_useaddrbook;
1740         GtkWidget *chkbtn_threadsubj;
1741         GtkWidget *vbox3;
1742         GtkWidget *label_datefmt;
1743         GtkWidget *button_datefmt;
1744         GtkWidget *entry_datefmt;
1745         GtkWidget *button_dispitem;
1746
1747         vbox1 = gtk_vbox_new (FALSE, VSPACING);
1748         gtk_widget_show (vbox1);
1749         gtk_container_add (GTK_CONTAINER (dialog.notebook), vbox1);
1750         gtk_container_set_border_width (GTK_CONTAINER (vbox1), VBOX_BORDER);
1751
1752         vbox2 = gtk_vbox_new (FALSE, 0);
1753         gtk_widget_show (vbox2);
1754         gtk_box_pack_start (GTK_BOX (vbox1), vbox2, FALSE, TRUE, 0);
1755
1756         PACK_CHECK_BUTTON
1757                 (vbox2, chkbtn_transhdr,
1758                  _("Translate header name (such as `From:', `Subject:')"));
1759
1760         PACK_CHECK_BUTTON (vbox2, chkbtn_folder_unread,
1761                            _("Display unread number next to folder name"));
1762
1763         PACK_VSPACER(vbox2, vbox3, VSPACING_NARROW_2);
1764
1765         hbox1 = gtk_hbox_new (FALSE, 8);
1766         gtk_widget_show (hbox1);
1767         gtk_box_pack_start (GTK_BOX (vbox2), hbox1, FALSE, TRUE, 0);
1768
1769         label_ng_abbrev = gtk_label_new
1770                 (_("Abbreviate newsgroup names longer than"));
1771         gtk_widget_show (label_ng_abbrev);
1772         gtk_box_pack_start (GTK_BOX (hbox1), label_ng_abbrev, FALSE, FALSE, 0);
1773
1774         spinbtn_ng_abbrev_len_adj = gtk_adjustment_new (16, 0, 999, 1, 10, 10);
1775         spinbtn_ng_abbrev_len = gtk_spin_button_new
1776                 (GTK_ADJUSTMENT (spinbtn_ng_abbrev_len_adj), 1, 0);
1777         gtk_widget_show (spinbtn_ng_abbrev_len);
1778         gtk_box_pack_start (GTK_BOX (hbox1), spinbtn_ng_abbrev_len,
1779                             FALSE, FALSE, 0);
1780         gtk_widget_set_usize (spinbtn_ng_abbrev_len, 56, -1);
1781         gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (spinbtn_ng_abbrev_len),
1782                                      TRUE);
1783
1784         label_ng_abbrev = gtk_label_new
1785                 (_("letters"));
1786         gtk_widget_show (label_ng_abbrev);
1787         gtk_box_pack_start (GTK_BOX (hbox1), label_ng_abbrev, FALSE, FALSE, 0);
1788
1789         /* ---- Summary ---- */
1790
1791         PACK_FRAME(vbox1, frame_summary, _("Summary View"));
1792
1793         vbox2 = gtk_vbox_new (FALSE, 0);
1794         gtk_widget_show (vbox2);
1795         gtk_container_add (GTK_CONTAINER (frame_summary), vbox2);
1796         gtk_container_set_border_width (GTK_CONTAINER (vbox2), 8);
1797
1798         PACK_CHECK_BUTTON
1799                 (vbox2, chkbtn_swapfrom,
1800                  _("Display recipient in `From' column if sender is yourself"));
1801         PACK_CHECK_BUTTON
1802                 (vbox2, chkbtn_useaddrbook,
1803                  _("Display sender using address book"));
1804         PACK_CHECK_BUTTON
1805                 (vbox2, chkbtn_threadsubj,
1806                  _("Thread using subject in addition to standard headers"));
1807
1808         PACK_VSPACER(vbox2, vbox3, VSPACING_NARROW_2);
1809
1810         hbox1 = gtk_hbox_new (FALSE, 8);
1811         gtk_widget_show (hbox1);
1812         gtk_box_pack_start (GTK_BOX (vbox2), hbox1, FALSE, TRUE, 0);
1813
1814         label_datefmt = gtk_label_new (_("Date format"));
1815         gtk_widget_show (label_datefmt);
1816         gtk_box_pack_start (GTK_BOX (hbox1), label_datefmt, FALSE, FALSE, 0);
1817
1818         entry_datefmt = gtk_entry_new ();
1819         gtk_widget_show (entry_datefmt);
1820         gtk_box_pack_start (GTK_BOX (hbox1), entry_datefmt, TRUE, TRUE, 0);
1821
1822         button_datefmt = gtk_button_new_with_label (" ... ");
1823
1824         gtk_widget_show (button_datefmt);
1825         gtk_box_pack_start (GTK_BOX (hbox1), button_datefmt, FALSE, FALSE, 0);
1826         gtk_signal_connect (GTK_OBJECT (button_datefmt), "clicked",
1827                             GTK_SIGNAL_FUNC (date_format_create), NULL);
1828
1829         PACK_VSPACER(vbox2, vbox3, VSPACING_NARROW);
1830
1831         hbox1 = gtk_hbox_new (FALSE, 8);
1832         gtk_widget_show (hbox1);
1833         gtk_box_pack_start (GTK_BOX (vbox2), hbox1, FALSE, TRUE, 0);
1834
1835         button_dispitem = gtk_button_new_with_label
1836                 (_(" Set displayed items in summary... "));
1837         gtk_widget_show (button_dispitem);
1838         gtk_box_pack_start (GTK_BOX (hbox1), button_dispitem, FALSE, TRUE, 0);
1839         gtk_signal_connect (GTK_OBJECT (button_dispitem), "clicked",
1840                             GTK_SIGNAL_FUNC (prefs_summary_column_open),
1841                             NULL);
1842
1843         display.chkbtn_transhdr           = chkbtn_transhdr;
1844         display.chkbtn_folder_unread      = chkbtn_folder_unread;
1845         display.spinbtn_ng_abbrev_len     = spinbtn_ng_abbrev_len;
1846         display.spinbtn_ng_abbrev_len_adj = spinbtn_ng_abbrev_len_adj;
1847
1848         display.chkbtn_swapfrom      = chkbtn_swapfrom;
1849         display.chkbtn_useaddrbook   = chkbtn_useaddrbook;
1850         display.chkbtn_threadsubj    = chkbtn_threadsubj;
1851         display.entry_datefmt        = entry_datefmt;
1852 }
1853
1854 static void prefs_message_create(void)
1855 {
1856         GtkWidget *vbox1;
1857         GtkWidget *vbox2;
1858         GtkWidget *vbox3;
1859         GtkWidget *hbox1;
1860         GtkWidget *chkbtn_enablecol;
1861         GtkWidget *button_edit_col;
1862         GtkWidget *chkbtn_mbalnum;
1863         GtkWidget *chkbtn_disphdrpane;
1864         GtkWidget *chkbtn_disphdr;
1865         GtkWidget *button_edit_disphdr;
1866         GtkWidget *hbox_linespc;
1867         GtkWidget *label_linespc;
1868         GtkObject *spinbtn_linespc_adj;
1869         GtkWidget *spinbtn_linespc;
1870         GtkWidget *chkbtn_headspc;
1871
1872         GtkWidget *frame_scr;
1873         GtkWidget *vbox_scr;
1874         GtkWidget *chkbtn_smoothscroll;
1875         GtkWidget *hbox_scr;
1876         GtkWidget *label_scr;
1877         GtkObject *spinbtn_scrollstep_adj;
1878         GtkWidget *spinbtn_scrollstep;
1879         GtkWidget *chkbtn_halfpage;
1880
1881         GtkWidget *chkbtn_attach_desc;
1882
1883         vbox1 = gtk_vbox_new (FALSE, VSPACING);
1884         gtk_widget_show (vbox1);
1885         gtk_container_add (GTK_CONTAINER (dialog.notebook), vbox1);
1886         gtk_container_set_border_width (GTK_CONTAINER (vbox1), VBOX_BORDER);
1887
1888         vbox2 = gtk_vbox_new (FALSE, 0);
1889         gtk_widget_show (vbox2);
1890         gtk_box_pack_start (GTK_BOX (vbox1), vbox2, FALSE, FALSE, 0);
1891
1892         hbox1 = gtk_hbox_new (FALSE, 8);
1893         gtk_widget_show (hbox1);
1894         gtk_box_pack_start (GTK_BOX (vbox2), hbox1, FALSE, TRUE, 0);
1895
1896         PACK_CHECK_BUTTON (hbox1, chkbtn_enablecol,
1897                            _("Enable coloration of message"));
1898         gtk_signal_connect(GTK_OBJECT(chkbtn_enablecol), "toggled",
1899                            GTK_SIGNAL_FUNC(prefs_enable_message_color_toggled),
1900                            NULL);
1901
1902         button_edit_col = gtk_button_new_with_label (_(" Edit... "));
1903         gtk_widget_show (button_edit_col);
1904         gtk_box_pack_end (GTK_BOX (hbox1), button_edit_col, FALSE, TRUE, 0);
1905         gtk_signal_connect (GTK_OBJECT (button_edit_col), "clicked",
1906                             GTK_SIGNAL_FUNC (prefs_quote_colors_dialog), NULL);
1907
1908         SET_TOGGLE_SENSITIVITY(chkbtn_enablecol, button_edit_col);
1909
1910         PACK_CHECK_BUTTON
1911                 (vbox2, chkbtn_mbalnum,
1912                  _("Display multi-byte alphanumeric as\n"
1913                    "ASCII character (Japanese only)"));
1914         gtk_label_set_justify (GTK_LABEL (GTK_BIN(chkbtn_mbalnum)->child),
1915                                GTK_JUSTIFY_LEFT);
1916
1917         PACK_CHECK_BUTTON(vbox2, chkbtn_disphdrpane,
1918                           _("Display header pane above message view"));
1919
1920         hbox1 = gtk_hbox_new (FALSE, 8);
1921         gtk_widget_show (hbox1);
1922         gtk_box_pack_start (GTK_BOX (vbox2), hbox1, FALSE, TRUE, 0);
1923
1924         PACK_CHECK_BUTTON(hbox1, chkbtn_disphdr,
1925                           _("Display short headers on message view"));
1926
1927         button_edit_disphdr = gtk_button_new_with_label (_(" Edit... "));
1928         gtk_widget_show (button_edit_disphdr);
1929         gtk_box_pack_end (GTK_BOX (hbox1), button_edit_disphdr,
1930                           FALSE, TRUE, 0);
1931         gtk_signal_connect (GTK_OBJECT (button_edit_disphdr), "clicked",
1932                             GTK_SIGNAL_FUNC (prefs_display_header_open),
1933                             NULL);
1934
1935         SET_TOGGLE_SENSITIVITY(chkbtn_disphdr, button_edit_disphdr);
1936
1937         PACK_VSPACER(vbox2, vbox3, VSPACING_NARROW_2);
1938
1939         hbox1 = gtk_hbox_new (FALSE, 32);
1940         gtk_widget_show (hbox1);
1941         gtk_box_pack_start (GTK_BOX (vbox2), hbox1, FALSE, TRUE, 0);
1942
1943         hbox_linespc = gtk_hbox_new (FALSE, 8);
1944         gtk_widget_show (hbox1);
1945         gtk_box_pack_start (GTK_BOX (hbox1), hbox_linespc, FALSE, TRUE, 0);
1946
1947         label_linespc = gtk_label_new (_("Line space"));
1948         gtk_widget_show (label_linespc);
1949         gtk_box_pack_start (GTK_BOX (hbox_linespc), label_linespc,
1950                             FALSE, FALSE, 0);
1951
1952         spinbtn_linespc_adj = gtk_adjustment_new (2, 0, 16, 1, 1, 16);
1953         spinbtn_linespc = gtk_spin_button_new
1954                 (GTK_ADJUSTMENT (spinbtn_linespc_adj), 1, 0);
1955         gtk_widget_show (spinbtn_linespc);
1956         gtk_box_pack_start (GTK_BOX (hbox_linespc), spinbtn_linespc,
1957                             FALSE, FALSE, 0);
1958         gtk_widget_set_usize (spinbtn_linespc, 64, -1);
1959         gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (spinbtn_linespc), TRUE);
1960
1961         label_linespc = gtk_label_new (_("pixel(s)"));
1962         gtk_widget_show (label_linespc);
1963         gtk_box_pack_start (GTK_BOX (hbox_linespc), label_linespc,
1964                             FALSE, FALSE, 0);
1965
1966         PACK_CHECK_BUTTON(hbox1, chkbtn_headspc, _("Indent text"));
1967
1968         PACK_FRAME(vbox1, frame_scr, _("Scroll"));
1969
1970         vbox_scr = gtk_vbox_new (FALSE, 0);
1971         gtk_widget_show (vbox_scr);
1972         gtk_container_add (GTK_CONTAINER (frame_scr), vbox_scr);
1973         gtk_container_set_border_width (GTK_CONTAINER (vbox_scr), 8);
1974
1975         PACK_CHECK_BUTTON(vbox_scr, chkbtn_halfpage, _("Half page"));
1976
1977         hbox1 = gtk_hbox_new (FALSE, 32);
1978         gtk_widget_show (hbox1);
1979         gtk_box_pack_start (GTK_BOX (vbox_scr), hbox1, FALSE, TRUE, 0);
1980
1981         PACK_CHECK_BUTTON(hbox1, chkbtn_smoothscroll, _("Smooth scroll"));
1982
1983         hbox_scr = gtk_hbox_new (FALSE, 8);
1984         gtk_widget_show (hbox_scr);
1985         gtk_box_pack_start (GTK_BOX (hbox1), hbox_scr, FALSE, FALSE, 0);
1986
1987         label_scr = gtk_label_new (_("Step"));
1988         gtk_widget_show (label_scr);
1989         gtk_box_pack_start (GTK_BOX (hbox_scr), label_scr, FALSE, FALSE, 0);
1990
1991         spinbtn_scrollstep_adj = gtk_adjustment_new (1, 1, 100, 1, 10, 10);
1992         spinbtn_scrollstep = gtk_spin_button_new
1993                 (GTK_ADJUSTMENT (spinbtn_scrollstep_adj), 1, 0);
1994         gtk_widget_show (spinbtn_scrollstep);
1995         gtk_box_pack_start (GTK_BOX (hbox_scr), spinbtn_scrollstep,
1996                             FALSE, FALSE, 0);
1997         gtk_widget_set_usize (spinbtn_scrollstep, 64, -1);
1998         gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (spinbtn_scrollstep),
1999                                      TRUE);
2000
2001         label_scr = gtk_label_new (_("pixel(s)"));
2002         gtk_widget_show (label_scr);
2003         gtk_box_pack_start (GTK_BOX (hbox_scr), label_scr, FALSE, FALSE, 0);
2004
2005         SET_TOGGLE_SENSITIVITY (chkbtn_smoothscroll, hbox_scr)
2006
2007         vbox3 = gtk_vbox_new (FALSE, 0);
2008         gtk_widget_show (vbox3);
2009         gtk_box_pack_start (GTK_BOX (vbox1), vbox3, FALSE, FALSE, 0);
2010
2011         PACK_CHECK_BUTTON(vbox3, chkbtn_attach_desc,
2012                           _("Show attachment descriptions (rather than names)"));
2013
2014
2015         message.chkbtn_enablecol   = chkbtn_enablecol;
2016         message.button_edit_col    = button_edit_col;
2017         message.chkbtn_mbalnum     = chkbtn_mbalnum;
2018         message.chkbtn_disphdrpane = chkbtn_disphdrpane;
2019         message.chkbtn_disphdr     = chkbtn_disphdr;
2020         message.spinbtn_linespc    = spinbtn_linespc;
2021         message.chkbtn_headspc     = chkbtn_headspc;
2022
2023         message.chkbtn_smoothscroll    = chkbtn_smoothscroll;
2024         message.spinbtn_scrollstep     = spinbtn_scrollstep;
2025         message.spinbtn_scrollstep_adj = spinbtn_scrollstep_adj;
2026         message.chkbtn_halfpage        = chkbtn_halfpage;
2027
2028         message.chkbtn_attach_desc  = chkbtn_attach_desc;
2029 }
2030
2031 #if USE_GPGME
2032 static void prefs_privacy_create(void)
2033 {
2034         GtkWidget *vbox1;
2035         GtkWidget *vbox2;
2036         GtkWidget *vbox3;
2037         GtkWidget *hbox1;
2038         GtkWidget *hbox_spc;
2039         GtkWidget *label;
2040         GtkWidget *checkbtn_auto_check_signatures;
2041         GtkWidget *checkbtn_store_passphrase;
2042         GtkObject *spinbtn_store_passphrase_adj;
2043         GtkWidget *spinbtn_store_passphrase;
2044         GtkTooltips *store_tooltip;
2045         GtkWidget *checkbtn_passphrase_grab;
2046         GtkWidget *checkbtn_gpg_warning;
2047
2048         vbox1 = gtk_vbox_new (FALSE, VSPACING);
2049         gtk_widget_show (vbox1);
2050         gtk_container_add (GTK_CONTAINER (dialog.notebook), vbox1);
2051         gtk_container_set_border_width (GTK_CONTAINER (vbox1), VBOX_BORDER);
2052
2053         vbox2 = gtk_vbox_new (FALSE, 0);
2054         gtk_widget_show (vbox2);
2055         gtk_box_pack_start (GTK_BOX (vbox1), vbox2, FALSE, FALSE, 0);
2056
2057         PACK_CHECK_BUTTON (vbox2, checkbtn_auto_check_signatures,
2058                            _("Automatically check signatures"));
2059
2060         PACK_CHECK_BUTTON (vbox2, checkbtn_store_passphrase,
2061                            _("Store passphrase in memory temporarily"));
2062
2063         vbox3 = gtk_vbox_new (FALSE, 0);
2064         gtk_widget_show (vbox3);
2065         gtk_box_pack_start (GTK_BOX (vbox2), vbox3, FALSE, FALSE, 0);
2066
2067         hbox1 = gtk_hbox_new (FALSE, 8);
2068         gtk_widget_show (hbox1);
2069         gtk_box_pack_start (GTK_BOX (vbox3), hbox1, FALSE, FALSE, 0);
2070
2071         hbox_spc = gtk_hbox_new (FALSE, 0);
2072         gtk_widget_show (hbox_spc);
2073         gtk_box_pack_start (GTK_BOX (hbox1), hbox_spc, FALSE, FALSE, 0);
2074         gtk_widget_set_usize (hbox_spc, 12, -1);
2075
2076         label = gtk_label_new (_("Expire after"));
2077         gtk_widget_show (label);
2078         gtk_box_pack_start (GTK_BOX (hbox1), label, FALSE, FALSE, 0);
2079
2080         store_tooltip = gtk_tooltips_new();
2081
2082         spinbtn_store_passphrase_adj = gtk_adjustment_new (0, 0, 1440, 1, 5, 5);
2083         spinbtn_store_passphrase = gtk_spin_button_new
2084                 (GTK_ADJUSTMENT (spinbtn_store_passphrase_adj), 1, 0);
2085         gtk_widget_show (spinbtn_store_passphrase);
2086         gtk_tooltips_set_tip(GTK_TOOLTIPS(store_tooltip), spinbtn_store_passphrase,
2087                              _("Setting to '0' will store the passphrase"
2088                                " for the whole session"),
2089                              NULL);
2090         gtk_box_pack_start (GTK_BOX (hbox1), spinbtn_store_passphrase, FALSE, FALSE, 0);
2091         gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (spinbtn_store_passphrase),
2092                                      TRUE);
2093         gtk_widget_set_usize (spinbtn_store_passphrase, 64, -1);
2094
2095         label = gtk_label_new (_("minute(s) "));
2096         gtk_widget_show (label);
2097         gtk_box_pack_start (GTK_BOX (hbox1), label, FALSE, FALSE, 0);
2098
2099         hbox1 = gtk_hbox_new (FALSE, 8);
2100         gtk_widget_show (hbox1);
2101         gtk_box_pack_start (GTK_BOX (vbox3), hbox1, FALSE, FALSE, 0);
2102
2103         hbox_spc = gtk_hbox_new (FALSE, 0);
2104         gtk_widget_show (hbox_spc);
2105         gtk_box_pack_start (GTK_BOX (hbox1), hbox_spc, FALSE, FALSE, 0);
2106         gtk_widget_set_usize (hbox_spc, 12, -1);
2107
2108         SET_TOGGLE_SENSITIVITY (checkbtn_store_passphrase, vbox3);
2109
2110 #ifndef __MINGW32__
2111         PACK_CHECK_BUTTON (vbox2, checkbtn_passphrase_grab,
2112                            _("Grab input while entering a passphrase"));
2113 #endif
2114
2115         PACK_CHECK_BUTTON
2116                 (vbox2, checkbtn_gpg_warning,
2117                  _("Display warning on startup if GnuPG doesn't work"));
2118
2119         hbox1 = gtk_hbox_new (FALSE, 8);
2120         gtk_widget_show (hbox1);
2121         gtk_box_pack_start (GTK_BOX (vbox1), hbox1, FALSE, FALSE, 0);
2122
2123         privacy.checkbtn_auto_check_signatures
2124                                              = checkbtn_auto_check_signatures;
2125         privacy.checkbtn_store_passphrase    = checkbtn_store_passphrase;
2126         privacy.spinbtn_store_passphrase     = spinbtn_store_passphrase;
2127         privacy.spinbtn_store_passphrase_adj = spinbtn_store_passphrase_adj;
2128         privacy.checkbtn_passphrase_grab     = checkbtn_passphrase_grab;
2129         privacy.checkbtn_gpg_warning         = checkbtn_gpg_warning;
2130 }
2131 #endif /* USE_GPGME */
2132
2133 static void prefs_interface_create(void)
2134 {
2135         GtkWidget *vbox1;
2136         GtkWidget *vbox2;
2137         GtkWidget *vbox3;
2138         /* GtkWidget *checkbtn_emacs; */
2139         GtkWidget *checkbtn_always_show_msg;
2140         GtkWidget *checkbtn_openunread;
2141         GtkWidget *checkbtn_mark_as_read_on_newwin;
2142         GtkWidget *checkbtn_openinbox;
2143         GtkWidget *checkbtn_immedexec;
2144         GtkTooltips *immedexec_tooltip;
2145         GtkWidget *hbox1;
2146         GtkWidget *label;
2147         GtkWidget *menu;
2148         GtkWidget *menuitem;
2149
2150         GtkWidget *button_keybind;
2151
2152         GtkWidget *hbox_nextunreadmsgdialog;
2153         GtkWidget *optmenu_nextunreadmsgdialog;
2154
2155         vbox1 = gtk_vbox_new (FALSE, VSPACING);
2156         gtk_widget_show (vbox1);
2157         gtk_container_add (GTK_CONTAINER (dialog.notebook), vbox1);
2158         gtk_container_set_border_width (GTK_CONTAINER (vbox1), VBOX_BORDER);
2159
2160         vbox2 = gtk_vbox_new (FALSE, 0);
2161         gtk_widget_show (vbox2);
2162         gtk_box_pack_start (GTK_BOX (vbox1), vbox2, FALSE, FALSE, 0);
2163
2164         /* PACK_CHECK_BUTTON (vbox2, checkbtn_emacs,
2165                            _("Emulate the behavior of mouse operation of\n"
2166                              "Emacs-based mailer"));
2167         gtk_label_set_justify (GTK_LABEL (GTK_BIN (checkbtn_emacs)->child),
2168                                GTK_JUSTIFY_LEFT);   */
2169
2170         PACK_CHECK_BUTTON
2171                 (vbox2, checkbtn_always_show_msg,
2172                  _("Always open messages in summary when selected"));
2173
2174         PACK_CHECK_BUTTON
2175                 (vbox2, checkbtn_openunread,
2176                  _("Open first unread message when entering a folder"));
2177
2178         PACK_CHECK_BUTTON
2179                 (vbox2, checkbtn_mark_as_read_on_newwin,
2180                  _("Only mark message as read when opened in new window"));
2181
2182         PACK_CHECK_BUTTON
2183                 (vbox2, checkbtn_openinbox,
2184                  _("Go to inbox after receiving new mail"));
2185
2186         vbox3 = gtk_vbox_new (FALSE, 0);
2187         gtk_widget_show (vbox3);
2188         gtk_box_pack_start (GTK_BOX (vbox2), vbox3, FALSE, FALSE, 0);
2189
2190         immedexec_tooltip = gtk_tooltips_new();
2191
2192         PACK_CHECK_BUTTON
2193                 (vbox3, checkbtn_immedexec,
2194                  _("Execute immediately when moving or deleting messages"));
2195         gtk_tooltips_set_tip(GTK_TOOLTIPS(immedexec_tooltip), checkbtn_immedexec,
2196                              _("Messages will be marked until execution"
2197                                " if this is turned off"),
2198                              NULL);
2199
2200         hbox1 = gtk_hbox_new (FALSE, 0);
2201         gtk_widget_show (hbox1);
2202         gtk_box_pack_start (GTK_BOX (vbox3), hbox1, FALSE, FALSE, 0);
2203
2204         /* Next Unread Message Dialog */
2205         hbox_nextunreadmsgdialog = gtk_hbox_new (FALSE, 8);
2206         gtk_widget_show (hbox1);
2207         gtk_box_pack_start (GTK_BOX (vbox1), hbox_nextunreadmsgdialog, FALSE, FALSE, 0);
2208
2209         label = gtk_label_new (_("Show no-unread-message dialog"));
2210         gtk_widget_show (label);
2211         gtk_box_pack_start (GTK_BOX (hbox_nextunreadmsgdialog), label, FALSE, FALSE, 8);
2212
2213         optmenu_nextunreadmsgdialog = gtk_option_menu_new ();
2214         gtk_widget_show (optmenu_nextunreadmsgdialog);
2215         gtk_box_pack_start (GTK_BOX (hbox_nextunreadmsgdialog), optmenu_nextunreadmsgdialog, FALSE, FALSE, 8);
2216         
2217         menu = gtk_menu_new ();
2218         MENUITEM_ADD (menu, menuitem, _("Always"), NEXTUNREADMSGDIALOG_ALWAYS);
2219         MENUITEM_ADD (menu, menuitem, _("Assume 'Yes'"), 
2220                       NEXTUNREADMSGDIALOG_ASSUME_YES);
2221         MENUITEM_ADD (menu, menuitem, _("Assume 'No'"), 
2222                       NEXTUNREADMSGDIALOG_ASSUME_NO);
2223
2224         gtk_option_menu_set_menu (GTK_OPTION_MENU (optmenu_nextunreadmsgdialog), menu);
2225
2226         hbox1 = gtk_hbox_new (FALSE, 8);
2227         gtk_widget_show (hbox1);
2228         gtk_box_pack_start (GTK_BOX (vbox1), hbox1, FALSE, FALSE, 0);
2229
2230         button_keybind = gtk_button_new_with_label (_(" Set key bindings... "));
2231         gtk_widget_show (button_keybind);
2232         gtk_box_pack_start (GTK_BOX (hbox1), button_keybind, FALSE, FALSE, 0);
2233         gtk_signal_connect (GTK_OBJECT (button_keybind), "clicked",
2234                             GTK_SIGNAL_FUNC (prefs_keybind_select), NULL);
2235
2236         /* interface.checkbtn_emacs          = checkbtn_emacs; */
2237         interface.checkbtn_always_show_msg    = checkbtn_always_show_msg;
2238         interface.checkbtn_openunread         = checkbtn_openunread;
2239         interface.checkbtn_mark_as_read_on_newwin
2240                                               = checkbtn_mark_as_read_on_newwin;
2241         interface.checkbtn_openinbox          = checkbtn_openinbox;
2242         interface.checkbtn_immedexec          = checkbtn_immedexec;
2243         interface.optmenu_nextunreadmsgdialog = optmenu_nextunreadmsgdialog;
2244 }
2245
2246 static void prefs_other_create(void)
2247 {
2248         GtkWidget *vbox1;
2249         GtkWidget *hbox1;
2250
2251         GtkWidget *frame_addr;
2252         GtkWidget *vbox_addr;
2253         GtkWidget *checkbtn_addaddrbyclick;
2254         
2255         GtkWidget *frame_cliplog;
2256         GtkWidget *vbox_cliplog;
2257         GtkWidget *hbox_cliplog;
2258         GtkWidget *checkbtn_cliplog;
2259         GtkWidget *loglength_label;
2260         GtkWidget *loglength_entry;
2261         GtkTooltips *loglength_tooltip;
2262
2263         GtkWidget *frame_exit;
2264         GtkWidget *vbox_exit;
2265         GtkWidget *checkbtn_confonexit;
2266         GtkWidget *checkbtn_cleanonexit;
2267         GtkWidget *checkbtn_askonclean;
2268         GtkWidget *checkbtn_warnqueued;
2269
2270         GtkWidget *label_iotimeout;
2271         GtkWidget *spinbtn_iotimeout;
2272         GtkObject *spinbtn_iotimeout_adj;
2273
2274 #if 0
2275 #ifdef USE_OPENSSL
2276         GtkWidget *frame_ssl;
2277         GtkWidget *vbox_ssl;
2278         GtkWidget *hbox_ssl;
2279         GtkWidget *checkbtn_ssl_ask_unknown_valid;
2280 #endif
2281 #endif
2282         vbox1 = gtk_vbox_new (FALSE, VSPACING);
2283         gtk_widget_show (vbox1);
2284         gtk_container_add (GTK_CONTAINER (dialog.notebook), vbox1);
2285         gtk_container_set_border_width (GTK_CONTAINER (vbox1), VBOX_BORDER);
2286
2287         PACK_FRAME (vbox1, frame_addr, _("Address book"));
2288
2289         vbox_addr = gtk_vbox_new (FALSE, 0);
2290         gtk_widget_show (vbox_addr);
2291         gtk_container_add (GTK_CONTAINER (frame_addr), vbox_addr);
2292         gtk_container_set_border_width (GTK_CONTAINER (vbox_addr), 8);
2293
2294         PACK_CHECK_BUTTON
2295                 (vbox_addr, checkbtn_addaddrbyclick,
2296                  _("Add address to destination when double-clicked"));
2297
2298         /* Clip Log */
2299         PACK_FRAME (vbox1, frame_cliplog, _("Log Size"));
2300
2301         vbox_cliplog = gtk_vbox_new (FALSE, 0);
2302         gtk_widget_show (vbox_cliplog);
2303         gtk_container_add (GTK_CONTAINER (frame_cliplog), vbox_cliplog);
2304         gtk_container_set_border_width (GTK_CONTAINER (vbox_cliplog), 8);
2305         PACK_CHECK_BUTTON (vbox_cliplog, checkbtn_cliplog,
2306                            _("Clip the log size"));
2307         hbox_cliplog = gtk_hbox_new (FALSE, 3);
2308         gtk_container_add (GTK_CONTAINER (vbox_cliplog), hbox_cliplog);
2309         gtk_widget_show (hbox_cliplog);
2310         
2311         loglength_label = gtk_label_new (_("Log window length"));
2312         gtk_box_pack_start (GTK_BOX (hbox_cliplog), loglength_label,
2313                             FALSE, TRUE, 0);
2314         gtk_widget_show (GTK_WIDGET (loglength_label));
2315         
2316         loglength_tooltip = gtk_tooltips_new();
2317         
2318         loglength_entry = gtk_entry_new ();
2319         gtk_widget_set_usize (GTK_WIDGET (loglength_entry), 64, -1);
2320         gtk_box_pack_start (GTK_BOX (hbox_cliplog), loglength_entry,
2321                             FALSE, TRUE, 0);
2322         gtk_widget_show (GTK_WIDGET (loglength_entry));
2323         gtk_tooltips_set_tip(GTK_TOOLTIPS(loglength_tooltip), loglength_entry,
2324                              _("0 to stop logging in the log window"),
2325                              NULL);
2326         gtk_box_pack_start (GTK_BOX (hbox_cliplog), loglength_label,
2327                             FALSE, TRUE, 0);
2328         SET_TOGGLE_SENSITIVITY(checkbtn_cliplog, loglength_entry);
2329
2330 #if 0
2331 #ifdef USE_OPENSSL
2332         /* SSL */
2333         PACK_FRAME (vbox1, frame_ssl, _("Security"));
2334
2335         vbox_ssl = gtk_vbox_new (FALSE, 0);
2336         gtk_widget_show (vbox_ssl);
2337         gtk_container_add (GTK_CONTAINER (frame_ssl), vbox_ssl);
2338         gtk_container_set_border_width (GTK_CONTAINER (vbox_ssl), 8);
2339         PACK_CHECK_BUTTON (vbox_ssl, checkbtn_ssl_ask_unknown_valid, 
2340                            _("Ask before accepting SSL certificates"));
2341         hbox_ssl = gtk_hbox_new (FALSE, 3);
2342         gtk_container_add (GTK_CONTAINER (vbox_ssl), hbox_ssl);
2343         gtk_widget_show (hbox_ssl);
2344 #endif
2345 #endif
2346         
2347         /* On Exit */
2348         PACK_FRAME (vbox1, frame_exit, _("On exit"));
2349
2350         vbox_exit = gtk_vbox_new (FALSE, 0);
2351         gtk_widget_show (vbox_exit);
2352         gtk_container_add (GTK_CONTAINER (frame_exit), vbox_exit);
2353         gtk_container_set_border_width (GTK_CONTAINER (vbox_exit), 8);
2354
2355         PACK_CHECK_BUTTON (vbox_exit, checkbtn_confonexit,
2356                            _("Confirm on exit"));
2357
2358         hbox1 = gtk_hbox_new (FALSE, 32);
2359         gtk_widget_show (hbox1);
2360         gtk_box_pack_start (GTK_BOX (vbox_exit), hbox1, FALSE, FALSE, 0);
2361
2362         PACK_CHECK_BUTTON (hbox1, checkbtn_cleanonexit,
2363                            _("Empty trash on exit"));
2364         PACK_CHECK_BUTTON (hbox1, checkbtn_askonclean,
2365                            _("Ask before emptying"));
2366         SET_TOGGLE_SENSITIVITY (checkbtn_cleanonexit, checkbtn_askonclean);
2367
2368         PACK_CHECK_BUTTON (vbox_exit, checkbtn_warnqueued,
2369                            _("Warn if there are queued messages"));
2370
2371         hbox1 = gtk_hbox_new (FALSE, 8);
2372         gtk_widget_show (hbox1);
2373         gtk_box_pack_start (GTK_BOX (vbox1), hbox1, FALSE, FALSE, 0);
2374
2375         label_iotimeout = gtk_label_new (_("Socket I/O timeout:"));
2376         gtk_widget_show (label_iotimeout);
2377         gtk_box_pack_start (GTK_BOX (hbox1), label_iotimeout, FALSE, FALSE, 0);
2378
2379         spinbtn_iotimeout_adj = gtk_adjustment_new (60, 0, 1000, 1, 10, 10);
2380         spinbtn_iotimeout = gtk_spin_button_new
2381                 (GTK_ADJUSTMENT (spinbtn_iotimeout_adj), 1, 0);
2382         gtk_widget_show (spinbtn_iotimeout);
2383         gtk_box_pack_start (GTK_BOX (hbox1), spinbtn_iotimeout,
2384                             FALSE, FALSE, 0);
2385         gtk_widget_set_usize (spinbtn_iotimeout, 64, -1);
2386         gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (spinbtn_iotimeout), TRUE);
2387
2388         label_iotimeout = gtk_label_new (_("seconds"));
2389         gtk_widget_show (label_iotimeout);
2390         gtk_box_pack_start (GTK_BOX (hbox1), label_iotimeout, FALSE, FALSE, 0);
2391
2392         other.checkbtn_addaddrbyclick = checkbtn_addaddrbyclick;
2393         
2394         other.checkbtn_cliplog     = checkbtn_cliplog;
2395         other.loglength_entry      = loglength_entry;
2396
2397         other.checkbtn_confonexit  = checkbtn_confonexit;
2398         other.checkbtn_cleanonexit = checkbtn_cleanonexit;
2399         other.checkbtn_askonclean  = checkbtn_askonclean;
2400         other.checkbtn_warnqueued  = checkbtn_warnqueued;
2401
2402         other.spinbtn_iotimeout     = spinbtn_iotimeout;
2403         other.spinbtn_iotimeout_adj = spinbtn_iotimeout_adj;
2404         
2405 #if 0
2406 #ifdef USE_OPENSSL
2407         other.checkbtn_ssl_ask_unknown_valid = checkbtn_ssl_ask_unknown_valid;
2408 #endif
2409 #endif
2410 }
2411
2412 static void date_format_ok_btn_clicked(GtkButton *button, GtkWidget **widget)
2413 {
2414         GtkWidget *datefmt_sample = NULL;
2415         gchar *text;
2416
2417         g_return_if_fail(widget != NULL);
2418         g_return_if_fail(*widget != NULL);
2419         g_return_if_fail(display.entry_datefmt != NULL);
2420
2421         datefmt_sample = GTK_WIDGET(gtk_object_get_data
2422                                     (GTK_OBJECT(*widget), "datefmt_sample"));
2423         g_return_if_fail(datefmt_sample != NULL);
2424
2425         text = gtk_editable_get_chars(GTK_EDITABLE(datefmt_sample), 0, -1);
2426         g_free(prefs_common.date_format);
2427         prefs_common.date_format = text;
2428         gtk_entry_set_text(GTK_ENTRY(display.entry_datefmt), text);
2429
2430         gtk_widget_destroy(*widget);
2431         *widget = NULL;
2432 }
2433
2434 static void date_format_cancel_btn_clicked(GtkButton *button,
2435                                            GtkWidget **widget)
2436 {
2437         g_return_if_fail(widget != NULL);
2438         g_return_if_fail(*widget != NULL);
2439
2440         gtk_widget_destroy(*widget);
2441         *widget = NULL;
2442 }
2443
2444 static void date_format_key_pressed(GtkWidget *keywidget, GdkEventKey *event,
2445                                     GtkWidget **widget)
2446 {
2447         if (event && event->keyval == GDK_Escape)
2448                 date_format_cancel_btn_clicked(NULL, widget);
2449 }
2450
2451 static gboolean date_format_on_delete(GtkWidget *dialogwidget,
2452                                       GdkEventAny *event, GtkWidget **widget)
2453 {
2454         g_return_val_if_fail(widget != NULL, FALSE);
2455         g_return_val_if_fail(*widget != NULL, FALSE);
2456
2457         *widget = NULL;
2458         return FALSE;
2459 }
2460
2461 static void date_format_entry_on_change(GtkEditable *editable,
2462                                         GtkLabel *example)
2463 {
2464         time_t cur_time;
2465         struct tm *cal_time;
2466         gchar buffer[100];
2467         gchar *text;
2468
2469         cur_time = time(NULL);
2470         cal_time = localtime(&cur_time);
2471         buffer[0] = 0;
2472         text = gtk_editable_get_chars(editable, 0, -1);
2473         if (text)
2474                 strftime(buffer, sizeof buffer, text, cal_time); 
2475         g_free(text);
2476         gtk_label_set_text(example, buffer);
2477 }
2478
2479 static void date_format_select_row(GtkWidget *date_format_list, gint row,
2480                                    gint column, GdkEventButton *event,
2481                                    GtkWidget *date_format)
2482 {
2483         gint cur_pos;
2484         gchar *format;
2485         gchar *old_format;
2486         gchar *new_format;
2487         GtkWidget *datefmt_sample;
2488
2489         /* only on double click */
2490         if (!event || event->type != GDK_2BUTTON_PRESS) return;
2491
2492
2493         datefmt_sample = GTK_WIDGET(gtk_object_get_data
2494                                     (GTK_OBJECT(date_format), "datefmt_sample"));
2495
2496         g_return_if_fail(date_format_list != NULL);
2497         g_return_if_fail(date_format != NULL);
2498         g_return_if_fail(datefmt_sample != NULL);
2499
2500         /* get format from clist */
2501         gtk_clist_get_text(GTK_CLIST(date_format_list), row, 0, &format);
2502
2503         cur_pos = gtk_editable_get_position(GTK_EDITABLE(datefmt_sample));
2504         old_format = gtk_entry_get_text(GTK_ENTRY(datefmt_sample));
2505
2506         /* insert the format into the text entry */
2507         new_format = g_malloc(strlen(old_format) + 3);
2508
2509         strncpy(new_format, old_format, cur_pos);
2510         new_format[cur_pos] = '\0';
2511         strcat(new_format, format);
2512         strcat(new_format, &old_format[cur_pos]);
2513
2514         gtk_entry_set_text(GTK_ENTRY(datefmt_sample), new_format);
2515         gtk_editable_set_position(GTK_EDITABLE(datefmt_sample), cur_pos + 2);
2516
2517         g_free(new_format);
2518 }
2519
2520 static GtkWidget *date_format_create(GtkButton *button, void *data)
2521 {
2522         static GtkWidget *datefmt_win = NULL;
2523         GtkWidget *vbox1;
2524         GtkWidget *scrolledwindow1;
2525         GtkWidget *datefmt_clist;
2526         GtkWidget *table;
2527         GtkWidget *label1;
2528         GtkWidget *label2;
2529         GtkWidget *label3;
2530         GtkWidget *confirm_area;
2531         GtkWidget *ok_btn;
2532         GtkWidget *cancel_btn;
2533         GtkWidget *datefmt_entry;
2534
2535         struct {
2536                 gchar *fmt;
2537                 gchar *txt;
2538         } time_format[] = {
2539                 { "%a", NULL },
2540                 { "%A", NULL },
2541                 { "%b", NULL },
2542                 { "%B", NULL },
2543                 { "%c", NULL },
2544                 { "%C", NULL },
2545                 { "%d", NULL },
2546                 { "%H", NULL },
2547                 { "%I", NULL },
2548                 { "%j", NULL },
2549                 { "%m", NULL },
2550                 { "%M", NULL },
2551                 { "%p", NULL },
2552                 { "%S", NULL },
2553                 { "%w", NULL },
2554                 { "%x", NULL },
2555                 { "%y", NULL },
2556                 { "%Y", NULL },
2557                 { "%Z", NULL }
2558         };
2559
2560         gchar *titles[2];
2561         gint i;
2562         const gint TIME_FORMAT_ELEMS =
2563                 sizeof time_format / sizeof time_format[0];
2564
2565         time_format[0].txt  = _("the full abbreviated weekday name");
2566         time_format[1].txt  = _("the full weekday name");
2567         time_format[2].txt  = _("the abbreviated month name");
2568         time_format[3].txt  = _("the full month name");
2569         time_format[4].txt  = _("the preferred date and time for the current locale");
2570         time_format[5].txt  = _("the century number (year/100)");
2571         time_format[6].txt  = _("the day of the month as a decimal number");
2572         time_format[7].txt  = _("the hour as a decimal number using a 24-hour clock");
2573         time_format[8].txt  = _("the hour as a decimal number using a 12-hour clock");
2574         time_format[9].txt  = _("the day of the year as a decimal number");
2575         time_format[10].txt = _("the month as a decimal number");
2576         time_format[11].txt = _("the minute as a decimal number");
2577         time_format[12].txt = _("either AM or PM");
2578         time_format[13].txt = _("the second as a decimal number");
2579         time_format[14].txt = _("the day of the week as a decimal number");
2580         time_format[15].txt = _("the preferred date for the current locale");
2581         time_format[16].txt = _("the last two digits of a year");
2582         time_format[17].txt = _("the year as a decimal number");
2583         time_format[18].txt = _("the time zone or name or abbreviation");
2584
2585         if (datefmt_win) return datefmt_win;
2586
2587         datefmt_win = gtk_window_new(GTK_WINDOW_DIALOG);
2588         gtk_container_set_border_width(GTK_CONTAINER(datefmt_win), 8);
2589         gtk_window_set_title(GTK_WINDOW(datefmt_win), _("Date format"));
2590         gtk_window_set_position(GTK_WINDOW(datefmt_win), GTK_WIN_POS_CENTER);
2591         gtk_widget_set_usize(datefmt_win, 440, 280);
2592
2593         vbox1 = gtk_vbox_new(FALSE, 10);
2594         gtk_widget_show(vbox1);
2595         gtk_container_add(GTK_CONTAINER(datefmt_win), vbox1);
2596
2597         scrolledwindow1 = gtk_scrolled_window_new(NULL, NULL);
2598         gtk_scrolled_window_set_policy
2599                 (GTK_SCROLLED_WINDOW(scrolledwindow1),
2600                  GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
2601         gtk_widget_show(scrolledwindow1);
2602         gtk_box_pack_start(GTK_BOX(vbox1), scrolledwindow1, TRUE, TRUE, 0);
2603
2604         titles[0] = _("Specifier");
2605         titles[1] = _("Description");
2606         datefmt_clist = gtk_clist_new_with_titles(2, titles);
2607         gtk_widget_show(datefmt_clist);
2608         gtk_container_add(GTK_CONTAINER(scrolledwindow1), datefmt_clist);
2609         /* gtk_clist_set_column_width(GTK_CLIST(datefmt_clist), 0, 80); */
2610         gtk_clist_set_selection_mode(GTK_CLIST(datefmt_clist),
2611                                      GTK_SELECTION_BROWSE);
2612
2613         for (i = 0; i < TIME_FORMAT_ELEMS; i++) {
2614                 gchar *text[2];
2615                 /* phoney casting necessary because of gtk... */
2616                 text[0] = (gchar *)time_format[i].fmt;
2617                 text[1] = (gchar *)time_format[i].txt;
2618                 gtk_clist_append(GTK_CLIST(datefmt_clist), text);
2619         }
2620
2621         table = gtk_table_new(2, 2, FALSE);
2622         gtk_widget_show(table);
2623         gtk_box_pack_start(GTK_BOX(vbox1), table, FALSE, FALSE, 0);
2624         gtk_table_set_row_spacings(GTK_TABLE(table), 4);
2625         gtk_table_set_col_spacings(GTK_TABLE(table), 8);
2626
2627         label1 = gtk_label_new(_("Date format"));
2628         gtk_widget_show(label1);
2629         gtk_table_attach(GTK_TABLE(table), label1, 0, 1, 0, 1,
2630                          GTK_FILL, 0, 0, 0);
2631         gtk_label_set_justify(GTK_LABEL(label1), GTK_JUSTIFY_LEFT);
2632         gtk_misc_set_alignment(GTK_MISC(label1), 0, 0.5);
2633
2634         datefmt_entry = gtk_entry_new_with_max_length(256);
2635         gtk_widget_show(datefmt_entry);
2636         gtk_table_attach(GTK_TABLE(table), datefmt_entry, 1, 2, 0, 1,
2637                          (GTK_EXPAND | GTK_FILL), 0, 0, 0);
2638
2639         /* we need the "sample" entry box; add it as data so callbacks can
2640          * get the entry box */
2641         gtk_object_set_data(GTK_OBJECT(datefmt_win), "datefmt_sample",
2642                             datefmt_entry);
2643
2644         label2 = gtk_label_new(_("Example"));
2645         gtk_widget_show(label2);
2646         gtk_table_attach(GTK_TABLE(table), label2, 0, 1, 1, 2,
2647                          GTK_FILL, 0, 0, 0);
2648         gtk_label_set_justify(GTK_LABEL(label2), GTK_JUSTIFY_LEFT);
2649         gtk_misc_set_alignment(GTK_MISC(label2), 0, 0.5);
2650
2651         label3 = gtk_label_new("");
2652         gtk_widget_show(label3);
2653         gtk_table_attach(GTK_TABLE(table), label3, 1, 2, 1, 2,
2654                          (GTK_EXPAND | GTK_FILL), 0, 0, 0);
2655         gtk_label_set_justify(GTK_LABEL(label3), GTK_JUSTIFY_LEFT);
2656         gtk_misc_set_alignment(GTK_MISC(label3), 0, 0.5);
2657
2658         gtkut_button_set_create(&confirm_area, &ok_btn, _("OK"),
2659                                 &cancel_btn, _("Cancel"), NULL, NULL);
2660         gtk_widget_grab_default(ok_btn);
2661         gtk_widget_show(confirm_area);
2662
2663         gtk_box_pack_start(GTK_BOX(vbox1), confirm_area, FALSE, FALSE, 0);
2664
2665         /* set the current format */
2666         gtk_entry_set_text(GTK_ENTRY(datefmt_entry), prefs_common.date_format);
2667         date_format_entry_on_change(GTK_EDITABLE(datefmt_entry),
2668                                     GTK_LABEL(label3));
2669
2670         gtk_signal_connect(GTK_OBJECT(ok_btn), "clicked",
2671                            GTK_SIGNAL_FUNC(date_format_ok_btn_clicked),
2672                            &datefmt_win);
2673         gtk_signal_connect(GTK_OBJECT(cancel_btn), "clicked",
2674                            GTK_SIGNAL_FUNC(date_format_cancel_btn_clicked),
2675                            &datefmt_win);
2676         gtk_signal_connect(GTK_OBJECT(datefmt_win), "key_press_event",
2677                            GTK_SIGNAL_FUNC(date_format_key_pressed),
2678                            &datefmt_win);
2679         gtk_signal_connect(GTK_OBJECT(datefmt_win), "delete_event",
2680                            GTK_SIGNAL_FUNC(date_format_on_delete),
2681                            &datefmt_win);
2682         gtk_signal_connect(GTK_OBJECT(datefmt_entry), "changed",
2683                            GTK_SIGNAL_FUNC(date_format_entry_on_change),
2684                            label3);
2685
2686         gtk_signal_connect(GTK_OBJECT(datefmt_clist), "select_row",
2687                            GTK_SIGNAL_FUNC(date_format_select_row),
2688                            datefmt_win);
2689
2690         gtk_window_set_position(GTK_WINDOW(datefmt_win), GTK_WIN_POS_CENTER);
2691         gtk_window_set_modal(GTK_WINDOW(datefmt_win), TRUE);
2692
2693         gtk_widget_show(datefmt_win);
2694         manage_window_set_transient(GTK_WINDOW(datefmt_win));
2695
2696         gtk_widget_grab_focus(ok_btn);
2697
2698         return datefmt_win;
2699 }
2700
2701 void prefs_quote_colors_dialog(void)
2702 {
2703         if (!quote_color_win)
2704                 prefs_quote_colors_dialog_create();
2705         gtk_widget_show(quote_color_win);
2706         manage_window_set_transient(GTK_WINDOW(quote_color_win));
2707
2708         gtk_main();
2709         gtk_widget_hide(quote_color_win);
2710
2711         textview_update_message_colors();
2712         main_window_reflect_prefs_all();
2713 }
2714
2715 static void prefs_quote_colors_dialog_create(void)
2716 {
2717         GtkWidget *window;
2718         GtkWidget *vbox;
2719         GtkWidget *table;
2720         GtkWidget *quotelevel1_label;
2721         GtkWidget *quotelevel2_label;
2722         GtkWidget *quotelevel3_label;
2723         GtkWidget *uri_label;
2724         GtkWidget *signature_label;
2725         GtkWidget *tgt_folder_label;
2726         GtkWidget *hbbox;
2727         GtkWidget *ok_btn;
2728         GtkWidget *recycle_colors_btn;
2729         GtkWidget *frame_colors;
2730
2731         window = gtk_window_new(GTK_WINDOW_DIALOG);
2732         gtk_container_set_border_width(GTK_CONTAINER(window), 2);
2733         gtk_window_set_title(GTK_WINDOW(window), _("Set message colors"));
2734         gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);
2735         gtk_window_set_modal(GTK_WINDOW(window), TRUE);
2736         gtk_window_set_policy(GTK_WINDOW(window), FALSE, FALSE, FALSE);
2737
2738         vbox = gtk_vbox_new (FALSE, VSPACING);
2739         gtk_container_add (GTK_CONTAINER (window), vbox);
2740         gtk_container_set_border_width (GTK_CONTAINER (vbox), 8);
2741         PACK_FRAME(vbox, frame_colors, _("Colors"));
2742
2743         table = gtk_table_new (5, 2, FALSE);
2744         gtk_container_add (GTK_CONTAINER (frame_colors), table);
2745         gtk_container_set_border_width (GTK_CONTAINER (table), 8);
2746         gtk_table_set_row_spacings (GTK_TABLE (table), 2);
2747         gtk_table_set_col_spacings (GTK_TABLE (table), 5);
2748
2749
2750         color_buttons.quote_level1_btn = gtk_button_new();
2751         gtk_table_attach (GTK_TABLE (table), color_buttons.quote_level1_btn,
2752                           0, 1, 0, 1, 0, 0, 0, 0);
2753         gtk_widget_set_usize (color_buttons.quote_level1_btn, 40, 30);
2754         gtk_container_set_border_width
2755                 (GTK_CONTAINER (color_buttons.quote_level1_btn), 5);
2756
2757         color_buttons.quote_level2_btn = gtk_button_new();
2758         gtk_table_attach (GTK_TABLE (table), color_buttons.quote_level2_btn,
2759                           0, 1, 1, 2, 0, 0, 0, 0);
2760         gtk_widget_set_usize (color_buttons.quote_level2_btn, 40, 30);
2761         gtk_container_set_border_width (GTK_CONTAINER (color_buttons.quote_level2_btn), 5);
2762
2763         color_buttons.quote_level3_btn = gtk_button_new_with_label ("");
2764         gtk_table_attach (GTK_TABLE (table), color_buttons.quote_level3_btn,
2765                           0, 1, 2, 3, 0, 0, 0, 0);
2766         gtk_widget_set_usize (color_buttons.quote_level3_btn, 40, 30);
2767         gtk_container_set_border_width
2768                 (GTK_CONTAINER (color_buttons.quote_level3_btn), 5);
2769
2770         color_buttons.uri_btn = gtk_button_new_with_label ("");
2771         gtk_table_attach (GTK_TABLE (table), color_buttons.uri_btn,
2772                           0, 1, 3, 4, 0, 0, 0, 0);
2773         gtk_widget_set_usize (color_buttons.uri_btn, 40, 30);
2774         gtk_container_set_border_width (GTK_CONTAINER (color_buttons.uri_btn), 5);
2775
2776         color_buttons.tgt_folder_btn = gtk_button_new_with_label ("");
2777         gtk_table_attach (GTK_TABLE (table), color_buttons.tgt_folder_btn,
2778                           0, 1, 4, 5, 0, 0, 0, 0);
2779         gtk_widget_set_usize (color_buttons.tgt_folder_btn, 40, 30);
2780         gtk_container_set_border_width (GTK_CONTAINER (color_buttons.tgt_folder_btn), 5);
2781
2782         color_buttons.signature_btn = gtk_button_new_with_label ("");
2783         gtk_table_attach (GTK_TABLE (table), color_buttons.signature_btn,
2784                           0, 1, 5, 6, 0, 0, 0, 0);
2785         gtk_widget_set_usize (color_buttons.signature_btn, 40, 30);
2786         gtk_container_set_border_width (GTK_CONTAINER (color_buttons.signature_btn), 5);
2787
2788         quotelevel1_label = gtk_label_new (_("Quoted Text - First Level"));
2789         gtk_table_attach (GTK_TABLE (table), quotelevel1_label, 1, 2, 0, 1,
2790                           (GTK_EXPAND | GTK_FILL), 0, 0, 0);
2791         gtk_label_set_justify (GTK_LABEL (quotelevel1_label), GTK_JUSTIFY_LEFT);
2792         gtk_misc_set_alignment (GTK_MISC (quotelevel1_label), 0, 0.5);
2793
2794         quotelevel2_label = gtk_label_new (_("Quoted Text - Second Level"));
2795         gtk_table_attach (GTK_TABLE (table), quotelevel2_label, 1, 2, 1, 2,
2796                           (GTK_EXPAND | GTK_FILL), 0, 0, 0);
2797         gtk_label_set_justify (GTK_LABEL (quotelevel2_label), GTK_JUSTIFY_LEFT);
2798         gtk_misc_set_alignment (GTK_MISC (quotelevel2_label), 0, 0.5);
2799
2800         quotelevel3_label = gtk_label_new (_("Quoted Text - Third Level"));
2801         gtk_table_attach (GTK_TABLE (table), quotelevel3_label, 1, 2, 2, 3,
2802                           (GTK_EXPAND | GTK_FILL), 0, 0, 0);
2803         gtk_label_set_justify (GTK_LABEL (quotelevel3_label), GTK_JUSTIFY_LEFT);
2804         gtk_misc_set_alignment (GTK_MISC (quotelevel3_label), 0, 0.5);
2805
2806         uri_label = gtk_label_new (_("URI link"));
2807         gtk_table_attach (GTK_TABLE (table), uri_label, 1, 2, 3, 4,
2808                           (GTK_EXPAND | GTK_FILL), 0, 0, 0);
2809         gtk_label_set_justify (GTK_LABEL (uri_label), GTK_JUSTIFY_LEFT);
2810         gtk_misc_set_alignment (GTK_MISC (uri_label), 0, 0.5);
2811
2812         tgt_folder_label = gtk_label_new (_("Target folder"));
2813         gtk_table_attach (GTK_TABLE (table), tgt_folder_label, 1, 2, 4, 5,
2814                           (GTK_EXPAND | GTK_FILL), 0, 0, 0);
2815         gtk_label_set_justify (GTK_LABEL (tgt_folder_label), GTK_JUSTIFY_LEFT);
2816         gtk_misc_set_alignment (GTK_MISC (tgt_folder_label), 0, 0.5);
2817
2818         signature_label = gtk_label_new (_("Signatures"));
2819         gtk_table_attach (GTK_TABLE (table), signature_label, 1, 2, 5, 6,
2820                           (GTK_EXPAND | GTK_FILL), 0, 0, 0);
2821         gtk_label_set_justify (GTK_LABEL (signature_label), GTK_JUSTIFY_LEFT);
2822         gtk_misc_set_alignment (GTK_MISC (signature_label), 0, 0.5);
2823
2824         PACK_CHECK_BUTTON (vbox, recycle_colors_btn,
2825                            _("Recycle quote colors"));
2826
2827         gtkut_button_set_create(&hbbox, &ok_btn, _("OK"),
2828                                 NULL, NULL, NULL, NULL);
2829         gtk_box_pack_end(GTK_BOX(vbox), hbbox, FALSE, FALSE, 0);
2830
2831         gtk_widget_grab_default(ok_btn);
2832         MANAGE_WINDOW_SIGNALS_CONNECT(window);
2833         gtk_signal_connect(GTK_OBJECT(window), "delete_event",
2834                            GTK_SIGNAL_FUNC(gtk_main_quit), NULL);
2835         gtk_signal_connect(GTK_OBJECT(window), "key_press_event",
2836                            GTK_SIGNAL_FUNC(prefs_quote_colors_key_pressed),
2837                            NULL);
2838
2839         gtk_signal_connect(GTK_OBJECT(color_buttons.quote_level1_btn), "clicked",
2840                            GTK_SIGNAL_FUNC(quote_color_set_dialog), "LEVEL1");
2841         gtk_signal_connect(GTK_OBJECT(color_buttons.quote_level2_btn), "clicked",
2842                            GTK_SIGNAL_FUNC(quote_color_set_dialog), "LEVEL2");
2843         gtk_signal_connect(GTK_OBJECT(color_buttons.quote_level3_btn), "clicked",
2844                            GTK_SIGNAL_FUNC(quote_color_set_dialog), "LEVEL3");
2845         gtk_signal_connect(GTK_OBJECT(color_buttons.uri_btn), "clicked",
2846                            GTK_SIGNAL_FUNC(quote_color_set_dialog), "URI");
2847         gtk_signal_connect(GTK_OBJECT(color_buttons.tgt_folder_btn), "clicked",
2848                            GTK_SIGNAL_FUNC(quote_color_set_dialog), "TGTFLD");
2849         gtk_signal_connect(GTK_OBJECT(color_buttons.signature_btn), "clicked",
2850                            GTK_SIGNAL_FUNC(quote_color_set_dialog), "SIGNATURE");
2851         gtk_signal_connect(GTK_OBJECT(recycle_colors_btn), "toggled",
2852                            GTK_SIGNAL_FUNC(prefs_recycle_colors_toggled), NULL);
2853         gtk_signal_connect(GTK_OBJECT(ok_btn), "clicked",
2854                            GTK_SIGNAL_FUNC(gtk_main_quit), NULL);
2855
2856         /* show message button colors and recycle options */
2857         set_button_bg_color(color_buttons.quote_level1_btn,
2858                             prefs_common.quote_level1_col);
2859         set_button_bg_color(color_buttons.quote_level2_btn,
2860                             prefs_common.quote_level2_col);
2861         set_button_bg_color(color_buttons.quote_level3_btn,
2862                             prefs_common.quote_level3_col);
2863         set_button_bg_color(color_buttons.uri_btn,
2864                             prefs_common.uri_col);
2865         set_button_bg_color(color_buttons.tgt_folder_btn,
2866                             prefs_common.tgt_folder_col);
2867         set_button_bg_color(color_buttons.signature_btn,
2868                             prefs_common.signature_col);
2869         gtk_toggle_button_set_active((GtkToggleButton *)recycle_colors_btn,
2870                                      prefs_common.recycle_quote_colors);
2871
2872         gtk_widget_show_all(vbox);
2873         quote_color_win = window;
2874 }
2875
2876 static void prefs_quote_colors_key_pressed(GtkWidget *widget,
2877                                            GdkEventKey *event, gpointer data)
2878 {
2879         if (event && event->keyval == GDK_Escape)
2880                 gtk_main_quit();
2881 }
2882
2883 static void quote_color_set_dialog(GtkWidget *widget, gpointer data)
2884 {
2885         gchar *type = (gchar *)data;
2886         gchar *title = NULL;
2887         gdouble color[4] = {0.0, 0.0, 0.0, 0.0};
2888         gint rgbvalue = 0;
2889         GtkColorSelectionDialog *dialog;
2890
2891         if(g_strcasecmp(type, "LEVEL1") == 0) {
2892                 title = _("Pick color for quotation level 1");
2893                 rgbvalue = prefs_common.quote_level1_col;
2894         } else if(g_strcasecmp(type, "LEVEL2") == 0) {
2895                 title = _("Pick color for quotation level 2");
2896                 rgbvalue = prefs_common.quote_level2_col;
2897         } else if(g_strcasecmp(type, "LEVEL3") == 0) {
2898                 title = _("Pick color for quotation level 3");
2899                 rgbvalue = prefs_common.quote_level3_col;
2900         } else if(g_strcasecmp(type, "URI") == 0) {
2901                 title = _("Pick color for URI");
2902                 rgbvalue = prefs_common.uri_col;
2903         } else if(g_strcasecmp(type, "TGTFLD") == 0) {
2904                 title = _("Pick color for target folder");
2905                 rgbvalue = prefs_common.tgt_folder_col;
2906         } else if(g_strcasecmp(type, "SIGNATURE") == 0) {
2907                 title = _("Pick color for signatures");
2908                 rgbvalue = prefs_common.signature_col;
2909         } else {   /* Should never be called */
2910                 g_warning("Unrecognized datatype '%s' in quote_color_set_dialog\n", type);
2911                 return;
2912         }
2913
2914         color_dialog = gtk_color_selection_dialog_new(title);
2915         gtk_window_set_position(GTK_WINDOW(color_dialog), GTK_WIN_POS_CENTER);
2916         gtk_window_set_modal(GTK_WINDOW(color_dialog), TRUE);
2917         gtk_window_set_policy(GTK_WINDOW(color_dialog), FALSE, FALSE, FALSE);
2918         manage_window_set_transient(GTK_WINDOW(color_dialog));
2919
2920         gtk_signal_connect(GTK_OBJECT(GTK_COLOR_SELECTION_DIALOG(color_dialog)->ok_button),
2921                            "clicked", GTK_SIGNAL_FUNC(quote_colors_set_dialog_ok), data);
2922         gtk_signal_connect(GTK_OBJECT(GTK_COLOR_SELECTION_DIALOG(color_dialog)->cancel_button),
2923                            "clicked", GTK_SIGNAL_FUNC(quote_colors_set_dialog_cancel), data);
2924         gtk_signal_connect(GTK_OBJECT(color_dialog), "key_press_event",
2925                            GTK_SIGNAL_FUNC(quote_colors_set_dialog_key_pressed),
2926                            data);
2927
2928         /* preselect the previous color in the color selection dialog */
2929         color[0] = (gdouble) ((rgbvalue & 0xff0000) >> 16) / 255.0;
2930         color[1] = (gdouble) ((rgbvalue & 0x00ff00) >>  8) / 255.0;
2931         color[2] = (gdouble)  (rgbvalue & 0x0000ff)        / 255.0;
2932         dialog = GTK_COLOR_SELECTION_DIALOG(color_dialog);
2933         gtk_color_selection_set_color
2934                 (GTK_COLOR_SELECTION(dialog->colorsel), color);
2935
2936         gtk_widget_show(color_dialog);
2937 }
2938
2939 static void quote_colors_set_dialog_ok(GtkWidget *widget, gpointer data)
2940 {
2941         GtkColorSelection *colorsel = (GtkColorSelection *)
2942                                                 ((GtkColorSelectionDialog *)color_dialog)->colorsel;
2943         gdouble color[4];
2944         gint red, green, blue, rgbvalue;
2945         gchar *type = (gchar *)data;
2946
2947         gtk_color_selection_get_color(colorsel, color);
2948
2949         red      = (gint) (color[0] * 255.0);
2950         green    = (gint) (color[1] * 255.0);
2951         blue     = (gint) (color[2] * 255.0);
2952         rgbvalue = (gint) ((red * 0x10000) | (green * 0x100) | blue);
2953
2954 #if 0
2955         fprintf(stderr, "redc = %f, greenc = %f, bluec = %f\n", color[0], color[1], color[2]);
2956         fprintf(stderr, "red = %d, green = %d, blue = %d\n", red, green, blue);
2957         fprintf(stderr, "Color is %x\n", rgbvalue);
2958 #endif
2959
2960         if (g_strcasecmp(type, "LEVEL1") == 0) {
2961                 prefs_common.quote_level1_col = rgbvalue;
2962                 set_button_bg_color(color_buttons.quote_level1_btn, rgbvalue);
2963         } else if (g_strcasecmp(type, "LEVEL2") == 0) {
2964                 prefs_common.quote_level2_col = rgbvalue;
2965                 set_button_bg_color(color_buttons.quote_level2_btn, rgbvalue);
2966         } else if (g_strcasecmp(type, "LEVEL3") == 0) {
2967                 prefs_common.quote_level3_col = rgbvalue;
2968                 set_button_bg_color(color_buttons.quote_level3_btn, rgbvalue);
2969         } else if (g_strcasecmp(type, "URI") == 0) {
2970                 prefs_common.uri_col = rgbvalue;
2971                 set_button_bg_color(color_buttons.uri_btn, rgbvalue);
2972         } else if (g_strcasecmp(type, "TGTFLD") == 0) {
2973                 prefs_common.tgt_folder_col = rgbvalue;
2974                 set_button_bg_color(color_buttons.tgt_folder_btn, rgbvalue);
2975                 folderview_set_target_folder_color(prefs_common.tgt_folder_col);
2976         } else if (g_strcasecmp(type, "SIGNATURE") == 0) {
2977                 prefs_common.signature_col = rgbvalue;
2978                 set_button_bg_color(color_buttons.signature_btn, rgbvalue);
2979         } else
2980                 fprintf( stderr, "Unrecognized datatype '%s' in quote_color_set_dialog_ok\n", type );
2981
2982         gtk_widget_destroy(color_dialog);
2983 }
2984
2985 static void quote_colors_set_dialog_cancel(GtkWidget *widget, gpointer data)
2986 {
2987         gtk_widget_destroy(color_dialog);
2988 }
2989
2990 static void quote_colors_set_dialog_key_pressed(GtkWidget *widget,
2991                                                 GdkEventKey *event,
2992                                                 gpointer data)
2993 {
2994         gtk_widget_destroy(color_dialog);
2995 }
2996
2997 static void set_button_bg_color(GtkWidget *widget, gint rgbvalue)
2998 {
2999         GtkStyle *newstyle;
3000         GdkColor color;
3001
3002         gtkut_convert_int_to_gdk_color(rgbvalue, &color);
3003         newstyle = gtk_style_copy(gtk_widget_get_default_style());
3004         newstyle->bg[GTK_STATE_NORMAL]   = color;
3005         newstyle->bg[GTK_STATE_PRELIGHT] = color;
3006         newstyle->bg[GTK_STATE_ACTIVE]   = color;
3007
3008         gtk_widget_set_style(GTK_WIDGET(widget), newstyle);
3009 }
3010
3011 static void prefs_enable_message_color_toggled(void)
3012 {
3013         gboolean is_active;
3014
3015         is_active = gtk_toggle_button_get_active
3016                 (GTK_TOGGLE_BUTTON(message.chkbtn_enablecol));
3017         gtk_widget_set_sensitive(message.button_edit_col, is_active);
3018         prefs_common.enable_color = is_active;
3019 }
3020
3021 static void prefs_recycle_colors_toggled(GtkWidget *widget)
3022 {
3023         gboolean is_active;
3024
3025         is_active = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget));
3026         prefs_common.recycle_quote_colors = is_active;
3027 }
3028
3029 static void prefs_keybind_select(void)
3030 {
3031         GtkWidget *window;
3032         GtkWidget *vbox1;
3033         GtkWidget *hbox1;
3034         GtkWidget *label;
3035         GtkWidget *combo;
3036         GtkWidget *confirm_area;
3037         GtkWidget *ok_btn;
3038         GtkWidget *cancel_btn;
3039
3040         window = gtk_window_new (GTK_WINDOW_DIALOG);
3041         gtk_container_set_border_width (GTK_CONTAINER (window), 8);
3042         gtk_window_set_title (GTK_WINDOW (window), _("Key bindings"));
3043         gtk_window_set_position (GTK_WINDOW (window), GTK_WIN_POS_CENTER);
3044         gtk_window_set_modal (GTK_WINDOW (window), TRUE);
3045         gtk_window_set_policy (GTK_WINDOW (window), FALSE, FALSE, FALSE);
3046         manage_window_set_transient (GTK_WINDOW (window));
3047
3048         vbox1 = gtk_vbox_new (FALSE, VSPACING);
3049         gtk_container_add (GTK_CONTAINER (window), vbox1);
3050         gtk_container_set_border_width (GTK_CONTAINER (vbox1), 2);
3051
3052         hbox1 = gtk_hbox_new (FALSE, 8);
3053         gtk_box_pack_start (GTK_BOX (vbox1), hbox1, FALSE, FALSE, 0);
3054
3055         label = gtk_label_new
3056                 (_("Select preset:"));
3057         gtk_box_pack_start (GTK_BOX (hbox1), label, FALSE, FALSE, 0);
3058         gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT);
3059
3060         hbox1 = gtk_hbox_new (FALSE, 8);
3061         gtk_box_pack_start (GTK_BOX (vbox1), hbox1, FALSE, FALSE, 0);
3062
3063         combo = gtk_combo_new ();
3064         gtk_box_pack_start (GTK_BOX (hbox1), combo, TRUE, TRUE, 0);
3065         gtkut_combo_set_items (GTK_COMBO (combo),
3066                                _("Default"),
3067                                "Mew / Wanderlust",
3068                                "Mutt",
3069                                _("Old Sylpheed"),
3070                                NULL);
3071         gtk_entry_set_editable (GTK_ENTRY (GTK_COMBO (combo)->entry), FALSE);
3072
3073         hbox1 = gtk_hbox_new (FALSE, 8);
3074         gtk_box_pack_start (GTK_BOX (vbox1), hbox1, FALSE, FALSE, 0);
3075
3076         label = gtk_label_new
3077                 (_("You can also modify each menu shortcut by pressing\n"
3078                    "any key(s) when placing the mouse pointer on the item."));
3079         gtk_box_pack_start (GTK_BOX (hbox1), label, FALSE, FALSE, 0);
3080         gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT);
3081
3082         hbox1 = gtk_hbox_new (FALSE, 8);
3083         gtk_box_pack_start (GTK_BOX (vbox1), hbox1, FALSE, FALSE, 0);
3084
3085         gtkut_button_set_create (&confirm_area, &ok_btn, _("OK"),
3086                                  &cancel_btn, _("Cancel"), NULL, NULL);
3087         gtk_box_pack_end (GTK_BOX (hbox1), confirm_area, FALSE, FALSE, 0);
3088         gtk_widget_grab_default (ok_btn);
3089
3090         MANAGE_WINDOW_SIGNALS_CONNECT(window);
3091         gtk_signal_connect (GTK_OBJECT (window), "delete_event",
3092                             GTK_SIGNAL_FUNC (prefs_keybind_deleted), NULL);
3093         gtk_signal_connect (GTK_OBJECT (window), "key_press_event",
3094                             GTK_SIGNAL_FUNC (prefs_keybind_key_pressed), NULL);
3095         gtk_signal_connect (GTK_OBJECT (ok_btn), "clicked",
3096                             GTK_SIGNAL_FUNC (prefs_keybind_apply_clicked),
3097                             NULL);
3098         gtk_signal_connect (GTK_OBJECT (cancel_btn), "clicked",
3099                             GTK_SIGNAL_FUNC (prefs_keybind_cancel),
3100                             NULL);
3101
3102         gtk_widget_show_all(window);
3103
3104         keybind.window = window;
3105         keybind.combo = combo;
3106 }
3107
3108 static void prefs_keybind_key_pressed(GtkWidget *widget, GdkEventKey *event,
3109                                       gpointer data)
3110 {
3111         if (event && event->keyval == GDK_Escape)
3112                 prefs_keybind_cancel();
3113 }
3114
3115 static gint prefs_keybind_deleted(GtkWidget *widget, GdkEventAny *event,
3116                                   gpointer data)
3117 {
3118         prefs_keybind_cancel();
3119         return TRUE;
3120 }
3121
3122 static void prefs_keybind_cancel(void)
3123 {
3124         gtk_widget_destroy(keybind.window);
3125         keybind.window = NULL;
3126         keybind.combo = NULL;
3127 }
3128
3129 static void prefs_keybind_apply_clicked(GtkWidget *widget)
3130 {
3131         GtkEntry *entry = GTK_ENTRY(GTK_COMBO(keybind.combo)->entry);
3132         gchar *text;
3133         gchar *rc_str;
3134
3135         static gchar *default_menurc =
3136                 "(menu-path \"<Main>/File/Empty trash\" \"\")\n"
3137                 "(menu-path \"<Main>/File/Save as...\" \"<control>S\")\n"
3138                 "(menu-path \"<Main>/File/Print...\" \"\")\n"
3139                 "(menu-path \"<Main>/File/Exit\" \"<control>Q\")\n"
3140
3141                 "(menu-path \"<Main>/Edit/Copy\" \"<control>C\")\n"
3142                 "(menu-path \"<Main>/Edit/Select all\" \"<control>A\")\n"
3143                 "(menu-path \"<Main>/Edit/Find in current message...\" \"<control>F\")\n"
3144                 "(menu-path \"<Main>/Edit/Search folder...\" \"<shift><control>F\")\n"
3145
3146                 "(menu-path \"<Main>/View/Expand Summary View\" \"V\")\n"
3147                 "(menu-path \"<Main>/View/Expand Message View\" \"<shift>V\")\n"
3148                 "(menu-path \"<Main>/View/Thread view\" \"<control>T\")\n"
3149                 "(menu-path \"<Main>/View/Go to/Prev message\" \"P\")\n"
3150                 "(menu-path \"<Main>/View/Go to/Next message\" \"N\")\n"
3151                 "(menu-path \"<Main>/View/Go to/Prev unread message\" \"<shift>P\")\n"
3152                 "(menu-path \"<Main>/View/Go to/Next unread message\" \"<shift>N\")\n"
3153                 "(menu-path \"<Main>/View/Go to/Other folder...\" \"G\")\n"
3154                 "(menu-path \"<Main>/View/Open in new window\" \"<control><alt>N\")\n"
3155                 "(menu-path \"<Main>/View/View source\" \"<control>U\")\n"
3156                 "(menu-path \"<Main>/View/Show all headers\" \"<control>H\")\n"
3157                 "(menu-path \"<Main>/View/Update\" \"<control><alt>U\")\n"
3158
3159                 "(menu-path \"<Main>/Message/Receive/Get new mail\" \"<control>I\")\n"
3160                 "(menu-path \"<Main>/Message/Receive/Get from all accounts\" \"<shift><control>I\")\n"
3161                 "(menu-path \"<Main>/Message/Compose an email message\" \"<control>M\")\n"
3162                 "(menu-path \"<Main>/Message/Reply\" \"<control>R\")\n"
3163                 "(menu-path \"<Main>/Message/Reply to/all\" \"<shift><control>R\")\n"
3164                 "(menu-path \"<Main>/Message/Reply to/sender\" \"\")\n"
3165                 "(menu-path \"<Main>/Message/Reply to/mailing list\" \"<control>L\")\n"
3166                 "(menu-path \"<Main>/Message/Forward\" \"<control><alt>F\")\n"
3167                 /* "(menu-path \"<Main>/Message/Forward as attachment\" \"\")\n" */
3168                 "(menu-path \"<Main>/Message/Move...\" \"<control>O\")\n"
3169                 "(menu-path \"<Main>/Message/Copy...\" \"<shift><control>O\")\n"
3170                 "(menu-path \"<Main>/Message/Delete\" \"<control>D\")\n"
3171                 "(menu-path \"<Main>/Message/Mark/Mark\" \"<shift>asterisk\")\n"
3172                 "(menu-path \"<Main>/Message/Mark/Unmark\" \"U\")\n"
3173                 "(menu-path \"<Main>/Message/Mark/Mark as unread\" \"<shift>exclam\")\n"
3174                 "(menu-path \"<Main>/Message/Mark/Mark as read\" \"\")\n"
3175
3176                 "(menu-path \"<Main>/Tools/Address book\" \"<shift><control>A\")\n"
3177                 "(menu-path \"<Main>/Tools/Execute\" \"X\")\n"
3178                 "(menu-path \"<Main>/Tools/Log window\" \"<shift><control>L\")\n"
3179
3180                 "(menu-path \"<Compose>/File/Close\" \"<control>W\")\n"
3181                 "(menu-path \"<Compose>/Edit/Select all\" \"<control>A\")\n"
3182                 "(menu-path \"<Compose>/Edit/Advanced/Move a word backward\" \"\")\n"
3183                 "(menu-path \"<Compose>/Edit/Advanced/Move a word forward\" \"\")\n"
3184                 "(menu-path \"<Compose>/Edit/Advanced/Move to beginning of line\" \"\")\n"
3185                 "(menu-path \"<Compose>/Edit/Advanced/Delete a word backward\" \"\")\n"
3186                 "(menu-path \"<Compose>/Edit/Advanced/Delete a word forward\" \"\")";
3187
3188         static gchar *mew_wl_menurc =
3189                 "(menu-path \"<Main>/File/Empty trash\" \"<shift>D\")\n"
3190                 "(menu-path \"<Main>/File/Save as...\" \"Y\")\n"
3191                 "(menu-path \"<Main>/File/Print...\" \"<shift>numbersign\")\n"
3192                 "(menu-path \"<Main>/File/Exit\" \"<shift>Q\")\n"
3193
3194                 "(menu-path \"<Main>/Edit/Copy\" \"<control>C\")\n"
3195                 "(menu-path \"<Main>/Edit/Select all\" \"<control>A\")\n"
3196                 "(menu-path \"<Main>/Edit/Find in current message...\" \"<control>F\")\n"
3197                 "(menu-path \"<Main>/Edit/Search folder...\" \"<control>S\")\n"
3198
3199                 "(menu-path \"<Main>/View/Expand Summary View\" \"\")\n"
3200                 "(menu-path \"<Main>/View/Expand Message View\" \"\")\n"
3201                 "(menu-path \"<Main>/View/Thread view\" \"<shift>T\")\n"
3202                 "(menu-path \"<Main>/View/Go to/Prev message\" \"P\")\n"
3203                 "(menu-path \"<Main>/View/Go to/Next message\" \"N\")\n"
3204                 "(menu-path \"<Main>/View/Go to/Prev unread message\" \"<shift>P\")\n"
3205                 "(menu-path \"<Main>/View/Go to/Next unread message\" \"<shift>N\")\n"
3206                 "(menu-path \"<Main>/View/Go to/Other folder...\" \"G\")\n"
3207                 "(menu-path \"<Main>/View/Open in new window\" \"<control><alt>N\")\n"
3208                 "(menu-path \"<Main>/View/View source\" \"<control>U\")\n"
3209                 "(menu-path \"<Main>/View/Show all headers\" \"<shift>H\")\n"
3210                 "(menu-path \"<Main>/View/Update\" \"<shift>S\")\n"
3211
3212                 "(menu-path \"<Main>/Message/Receive/Get new mail\" \"<control>I\")\n"
3213                 "(menu-path \"<Main>/Message/Receive/Get from all accounts\" \"<shift><control>I\")\n"
3214                 "(menu-path \"<Main>/Message/Compose an email message\" \"W\")\n"
3215                 "(menu-path \"<Main>/Message/Reply\" \"<control>R\")\n"
3216                 "(menu-path \"<Main>/Message/Reply to/all\" \"<shift>A\")\n"
3217                 "(menu-path \"<Main>/Message/Reply to/sender\" \"\")\n"
3218                 "(menu-path \"<Main>/Message/Reply to/mailing list\" \"<control>L\")\n"
3219                 "(menu-path \"<Main>/Message/Forward\" \"F\")\n"
3220                 /* "(menu-path \"<Main>/Message/Forward as attachment\" \"<shift>F\")\n" */
3221                 "(menu-path \"<Main>/Message/Move...\" \"O\")\n"
3222                 "(menu-path \"<Main>/Message/Copy...\" \"<shift>O\")\n"
3223                 "(menu-path \"<Main>/Message/Delete\" \"D\")\n"
3224                 "(menu-path \"<Main>/Message/Mark/Mark\" \"<shift>asterisk\")\n"
3225                 "(menu-path \"<Main>/Message/Mark/Unmark\" \"U\")\n"
3226                 "(menu-path \"<Main>/Message/Mark/Mark as unread\" \"<shift>exclam\")\n"
3227                 "(menu-path \"<Main>/Message/Mark/Mark as read\" \"<shift>R\")\n"
3228
3229                 "(menu-path \"<Main>/Tools/Address book\" \"<shift><control>A\")\n"
3230                 "(menu-path \"<Main>/Tools/Execute\" \"X\")\n"
3231                 "(menu-path \"<Main>/Tools/Log window\" \"<shift><control>L\")\n"
3232
3233                 "(menu-path \"<Compose>/File/Close\" \"<alt>W\")\n"
3234                 "(menu-path \"<Compose>/Edit/Select all\" \"\")\n"
3235                 "(menu-path \"<Compose>/Edit/Advanced/Move a word backward\" \"<alt>B\")\n"
3236                 "(menu-path \"<Compose>/Edit/Advanced/Move a word forward\" \"<alt>F\")\n"
3237                 "(menu-path \"<Compose>/Edit/Advanced/Move to beginning of line\" \"<control>A\")\n"
3238                 "(menu-path \"<Compose>/Edit/Advanced/Delete a word backward\" \"<control>W\")\n"
3239                 "(menu-path \"<Compose>/Edit/Advanced/Delete a word forward\" \"<alt>D\")";
3240
3241         static gchar *mutt_menurc =
3242                 "(menu-path \"<Main>/File/Empty trash\" \"\")\n"
3243                 "(menu-path \"<Main>/File/Save as...\" \"S\")\n"
3244                 "(menu-path \"<Main>/File/Print...\" \"P\")\n"
3245                 "(menu-path \"<Main>/File/Exit\" \"Q\")\n"
3246
3247                 "(menu-path \"<Main>/Edit/Copy\" \"<control>C\")\n"
3248                 "(menu-path \"<Main>/Edit/Select all\" \"<control>A\")\n"
3249                 "(menu-path \"<Main>/Edit/Find in current message...\" \"<control>F\")\n"
3250                 "(menu-path \"<Main>/Edit/Search messages...\" \"slash\")\n"
3251
3252                 "(menu-path \"<Main>/View/Toggle summary view\" \"V\")\n"
3253                 "(menu-path \"<Main>/View/Thread view\" \"<control>T\")\n"
3254                 "(menu-path \"<Main>/View/Go to/Prev message\" \"\")\n"
3255                 "(menu-path \"<Main>/View/Go to/Next message\" \"\")\n"
3256                 "(menu-path \"<Main>/View/Go to/Prev unread message\" \"\")\n"
3257                 "(menu-path \"<Main>/View/Go to/Next unread message\" \"\")\n"
3258                 "(menu-path \"<Main>/View/Go to/Other folder...\" \"C\")\n"
3259                 "(menu-path \"<Main>/View/Open in new window\" \"<control><alt>N\")\n"
3260                 "(menu-path \"<Main>/View/View source\" \"<control>U\")\n"
3261                 "(menu-path \"<Main>/View/Show all headers\" \"<control>H\")\n"
3262                 "(menu-path \"<Main>/View/Update\" \"<control><alt>U\")\n"
3263
3264                 "(menu-path \"<Main>/Message/Receive/Get new mail\" \"<control>I\")\n"
3265                 "(menu-path \"<Main>/Message/Receive/Get from all accounts\" \"<shift><control>I\")\n"
3266                 "(menu-path \"<Main>/Message/Compose an email message\" \"M\")\n"
3267                 "(menu-path \"<Main>/Message/Reply\" \"R\")\n"
3268                 "(menu-path \"<Main>/Message/Reply to/all\" \"G\")\n"
3269                 "(menu-path \"<Main>/Message/Reply to/sender\" \"\")\n"
3270                 "(menu-path \"<Main>/Message/Reply to/mailing list\" \"<control>L\")\n"
3271                 "(menu-path \"<Main>/Message/Forward\" \"F\")\n"
3272                 "(menu-path \"<Main>/Message/Forward as attachment\" \"\")\n"
3273                 "(menu-path \"<Main>/Message/Move...\" \"<control>O\")\n"
3274                 "(menu-path \"<Main>/Message/Copy...\" \"<shift>C\")\n"
3275                 "(menu-path \"<Main>/Message/Delete\" \"D\")\n"
3276                 "(menu-path \"<Main>/Message/Mark/Mark\" \"<shift>F\")\n"
3277                 "(menu-path \"<Main>/Message/Mark/Unmark\" \"U\")\n"
3278                 "(menu-path \"<Main>/Message/Mark/Mark as unread\" \"<shift>N\")\n"
3279                 "(menu-path \"<Main>/Message/Mark/Mark as read\" \"\")\n"
3280
3281                 "(menu-path \"<Main>/Tools/Address book\" \"<shift><control>A\")\n"
3282                 "(menu-path \"<Main>/Tools/Execute\" \"X\")\n"
3283                 "(menu-path \"<Main>/Tools/Log window\" \"<shift><control>L\")\n"
3284
3285                 "(menu-path \"<Compose>/File/Close\" \"<alt>W\")\n"
3286                 "(menu-path \"<Compose>/Edit/Select all\" \"\")\n"
3287                 "(menu-path \"<Compose>/Edit/Advanced/Move a word backward\" \"<alt>B\")\n"
3288                 "(menu-path \"<Compose>/Edit/Advanced/Move a word forward\" \"<alt>F\")\n"
3289                 "(menu-path \"<Compose>/Edit/Advanced/Move to beginning of line\" \"<control>A\")\n"
3290                 "(menu-path \"<Compose>/Edit/Advanced/Delete a word backward\" \"<control>W\")\n"
3291                 "(menu-path \"<Compose>/Edit/Advanced/Delete a word forward\" \"<alt>D\")";
3292
3293         static gchar *old_sylpheed_menurc =
3294                 "(menu-path \"<Main>/File/Empty trash\" \"\")\n"
3295                 "(menu-path \"<Main>/File/Save as...\" \"\")\n"
3296                 "(menu-path \"<Main>/File/Print...\" \"<alt>P\")\n"
3297                 "(menu-path \"<Main>/File/Exit\" \"<alt>Q\")\n"
3298
3299                 "(menu-path \"<Main>/Edit/Copy\" \"<control>C\")\n"
3300                 "(menu-path \"<Main>/Edit/Select all\" \"<control>A\")\n"
3301                 "(menu-path \"<Main>/Edit/Find in current message...\" \"<control>F\")\n"
3302                 "(menu-path \"<Main>/Edit/Search folder...\" \"<control>S\")\n"
3303
3304                 "(menu-path \"<Main>/View/Expand Summary View\" \"\")\n"
3305                 "(menu-path \"<Main>/View/Expand Message View\" \"\")\n"
3306                 "(menu-path \"<Main>/View/Thread view\" \"<control>T\")\n"
3307                 "(menu-path \"<Main>/View/Go to/Prev message\" \"P\")\n"
3308                 "(menu-path \"<Main>/View/Go to/Next message\" \"N\")\n"
3309                 "(menu-path \"<Main>/View/Go to/Prev unread message\" \"<shift>P\")\n"
3310                 "(menu-path \"<Main>/View/Go to/Next unread message\" \"<shift>N\")\n"
3311                 "(menu-path \"<Main>/View/Go to/Other folder...\" \"<alt>G\")\n"
3312                 "(menu-path \"<Main>/View/Open in new window\" \"<shift><control>N\")\n"
3313                 "(menu-path \"<Main>/View/View source\" \"<control>U\")\n"
3314                 "(menu-path \"<Main>/View/Show all headers\" \"<control>H\")\n"
3315                 "(menu-path \"<Main>/View/Update\" \"<alt>U\")\n"
3316
3317                 "(menu-path \"<Main>/Message/Receive/Get new mail\" \"<alt>I\")\n"
3318                 "(menu-path \"<Main>/Message/Receive/Get from all accounts\" \"<shift><alt>I\")\n"
3319                 "(menu-path \"<Main>/Message/Compose an email message\" \"<alt>N\")\n"
3320                 "(menu-path \"<Main>/Message/Reply\" \"<alt>R\")\n"
3321                 "(menu-path \"<Main>/Message/Reply to/all\" \"<shift><alt>R\")\n"
3322                 "(menu-path \"<Main>/Message/Reply to/sender\" \"<control><alt>R\")\n"
3323                 "(menu-path \"<Main>/Message/Reply to/mailing list\" \"<control>L\")\n"
3324                 "(menu-path \"<Main>/Message/Forward\" \"<shift><alt>F\")\n"
3325                 /* "(menu-path \"<Main>/Message/Forward as attachment\" \"<shift><control>F\")\n" */
3326                 "(menu-path \"<Main>/Message/Move...\" \"<alt>O\")\n"
3327                 "(menu-path \"<Main>/Message/Copy...\" \"\")\n"
3328                 "(menu-path \"<Main>/Message/Delete\" \"<alt>D\")\n"
3329                 "(menu-path \"<Main>/Message/Mark/Mark\" \"<shift>asterisk\")\n"
3330                 "(menu-path \"<Main>/Message/Mark/Unmark\" \"U\")\n"
3331                 "(menu-path \"<Main>/Message/Mark/Mark as unread\" \"<shift>exclam\")\n"
3332                 "(menu-path \"<Main>/Message/Mark/Mark as read\" \"\")\n"
3333
3334                 "(menu-path \"<Main>/Tools/Address book\" \"<alt>A\")\n"
3335                 "(menu-path \"<Main>/Tools/Execute\" \"<alt>X\")\n"
3336                 "(menu-path \"<Main>/Tools/Log window\" \"<alt>L\")\n"
3337
3338                 "(menu-path \"<Compose>/File/Close\" \"<alt>W\")\n"
3339                 "(menu-path \"<Compose>/Edit/Select all\" \"\")\n"
3340                 "(menu-path \"<Compose>/Edit/Advanced/Move a word backward\" \"<alt>B\")\n"
3341                 "(menu-path \"<Compose>/Edit/Advanced/Move a word forward\" \"<alt>F\")\n"
3342                 "(menu-path \"<Compose>/Edit/Advanced/Move to beginning of line\" \"<control>A\")\n"
3343                 "(menu-path \"<Compose>/Edit/Advanced/Delete a word backward\" \"<control>W\")\n"
3344                 "(menu-path \"<Compose>/Edit/Advanced/Delete a word forward\" \"<alt>D\")";
3345
3346         text = gtk_entry_get_text(entry);
3347
3348         if (!strcmp(text, _("Default")))
3349                 rc_str = default_menurc;
3350         else if (!strcmp(text, "Mew / Wanderlust"))
3351                 rc_str = mew_wl_menurc;
3352         else if (!strcmp(text, "Mutt"))
3353                 rc_str = mutt_menurc;
3354         else if (!strcmp(text, _("Old Sylpheed")))
3355                 rc_str = old_sylpheed_menurc;
3356         else
3357                 return;
3358
3359         menu_factory_clear_rc(rc_str);
3360         gtk_item_factory_parse_rc_string(rc_str);
3361
3362         gtk_widget_destroy(keybind.window);
3363         keybind.window = NULL;
3364         keybind.combo = NULL;
3365 }
3366
3367 static void prefs_common_charset_set_data_from_optmenu(PrefParam *pparam)
3368 {
3369         GtkWidget *menu;
3370         GtkWidget *menuitem;
3371         gchar *charset;
3372
3373         menu = gtk_option_menu_get_menu(GTK_OPTION_MENU(*pparam->widget));
3374         menuitem = gtk_menu_get_active(GTK_MENU(menu));
3375         charset = gtk_object_get_user_data(GTK_OBJECT(menuitem));
3376         g_free(*((gchar **)pparam->data));
3377         *((gchar **)pparam->data) = g_strdup(charset);
3378 }
3379
3380 static void prefs_common_charset_set_optmenu(PrefParam *pparam)
3381 {
3382         GtkOptionMenu *optmenu = GTK_OPTION_MENU(*pparam->widget);
3383         gint index;
3384
3385         g_return_if_fail(optmenu != NULL);
3386         g_return_if_fail(*((gchar **)pparam->data) != NULL);
3387
3388         index = menu_find_option_menu_index(optmenu, *((gchar **)pparam->data),
3389                                             (GCompareFunc)strcmp);
3390         if (index >= 0)
3391                 gtk_option_menu_set_history(optmenu, index);
3392         else {
3393                 gtk_option_menu_set_history(optmenu, 0);
3394                 prefs_common_charset_set_data_from_optmenu(pparam);
3395         }
3396 }
3397
3398 static void prefs_common_encoding_set_data_from_optmenu(PrefParam *pparam)
3399 {
3400         GtkWidget *menu;
3401         GtkWidget *menuitem;
3402
3403         menu = gtk_option_menu_get_menu(GTK_OPTION_MENU(*pparam->widget));
3404         menuitem = gtk_menu_get_active(GTK_MENU(menu));
3405         *((TransferEncodingMethod *)pparam->data) = GPOINTER_TO_INT
3406                 (gtk_object_get_user_data(GTK_OBJECT(menuitem)));
3407 }
3408
3409 static void prefs_common_encoding_set_optmenu(PrefParam *pparam)
3410 {
3411         TransferEncodingMethod method =
3412                 *((TransferEncodingMethod *)pparam->data);
3413         GtkOptionMenu *optmenu = GTK_OPTION_MENU(*pparam->widget);
3414         gint index;
3415
3416         g_return_if_fail(optmenu != NULL);
3417
3418         index = menu_find_option_menu_index(optmenu, GINT_TO_POINTER(method),
3419                                             NULL);
3420         if (index >= 0)
3421                 gtk_option_menu_set_history(optmenu, index);
3422         else {
3423                 gtk_option_menu_set_history(optmenu, 0);
3424                 prefs_common_encoding_set_data_from_optmenu(pparam);
3425         }
3426 }
3427
3428 static void prefs_common_recv_dialog_set_data_from_optmenu(PrefParam *pparam)
3429 {
3430         GtkWidget *menu;
3431         GtkWidget *menuitem;
3432
3433         menu = gtk_option_menu_get_menu(GTK_OPTION_MENU(*pparam->widget));
3434         menuitem = gtk_menu_get_active(GTK_MENU(menu));
3435         *((RecvDialogMode *)pparam->data) = GPOINTER_TO_INT
3436                 (gtk_object_get_user_data(GTK_OBJECT(menuitem)));
3437 }
3438
3439 static void prefs_common_recv_dialog_set_optmenu(PrefParam *pparam)
3440 {
3441         RecvDialogMode mode = *((RecvDialogMode *)pparam->data);
3442         GtkOptionMenu *optmenu = GTK_OPTION_MENU(*pparam->widget);
3443         GtkWidget *menu;
3444         GtkWidget *menuitem;
3445         gint index;
3446
3447         index = menu_find_option_menu_index(optmenu, GINT_TO_POINTER(mode),
3448                                             NULL);
3449         if (index >= 0)
3450                 gtk_option_menu_set_history(optmenu, index);
3451         else {
3452                 gtk_option_menu_set_history(optmenu, 0);
3453                 prefs_common_recv_dialog_set_data_from_optmenu(pparam);
3454         }
3455
3456         menu = gtk_option_menu_get_menu(optmenu);
3457         menuitem = gtk_menu_get_active(GTK_MENU(menu));
3458         gtk_menu_item_activate(GTK_MENU_ITEM(menuitem));
3459 }
3460
3461 static void prefs_common_send_dialog_set_data_from_optmenu(PrefParam *pparam)
3462 {
3463         GtkWidget *menu;
3464         GtkWidget *menuitem;
3465
3466         menu = gtk_option_menu_get_menu(GTK_OPTION_MENU(*pparam->widget));
3467         menuitem = gtk_menu_get_active(GTK_MENU(menu));
3468         *((SendDialogMode *)pparam->data) = GPOINTER_TO_INT
3469                 (gtk_object_get_user_data(GTK_OBJECT(menuitem)));
3470 }
3471
3472 static void prefs_common_send_dialog_set_optmenu(PrefParam *pparam)
3473 {
3474         SendDialogMode mode = *((SendDialogMode *)pparam->data);
3475         GtkOptionMenu *optmenu = GTK_OPTION_MENU(*pparam->widget);
3476         GtkWidget *menu;
3477         GtkWidget *menuitem;
3478
3479         switch (mode) {
3480         case SEND_DIALOG_ALWAYS:
3481                 gtk_option_menu_set_history(optmenu, 0);
3482                 break;
3483         case SEND_DIALOG_NEVER:
3484                 gtk_option_menu_set_history(optmenu, 1);
3485                 break;
3486         default:
3487                 break;
3488         }
3489
3490         menu = gtk_option_menu_get_menu(optmenu);
3491         menuitem = gtk_menu_get_active(GTK_MENU(menu));
3492         gtk_menu_item_activate(GTK_MENU_ITEM(menuitem));
3493 }
3494
3495 static gint prefs_common_deleted(GtkWidget *widget, GdkEventAny *event,
3496                                  gpointer data)
3497 {
3498         prefs_common_cancel();
3499         return TRUE;
3500 }
3501
3502 static void prefs_common_key_pressed(GtkWidget *widget, GdkEventKey *event,
3503                                      gpointer data)
3504 {
3505         if (event && event->keyval == GDK_Escape)
3506                 prefs_common_cancel();
3507 }
3508
3509 static void prefs_common_ok(void)
3510 {
3511         prefs_common_apply();
3512         gtk_widget_hide(dialog.window);
3513
3514         inc_unlock();
3515 }
3516
3517 static void prefs_common_apply(void)
3518 {
3519         MainWindow *mainwindow;
3520
3521         prefs_set_data_from_dialog(param);
3522         sock_set_io_timeout(prefs_common.io_timeout_secs);
3523         main_window_reflect_prefs_all_real(FALSE);
3524         prefs_common_save_config();
3525
3526         mainwindow = mainwindow_get_mainwindow();
3527         log_window_set_clipping(mainwindow->logwin, prefs_common.cliplog,
3528                                 prefs_common.loglength);
3529         
3530         inc_autocheck_timer_remove();
3531         inc_autocheck_timer_set();
3532 }
3533
3534 static void prefs_nextunreadmsgdialog_set_data_from_optmenu(PrefParam *pparam)
3535 {
3536         GtkWidget *menu;
3537         GtkWidget *menuitem;
3538
3539         menu = gtk_option_menu_get_menu(GTK_OPTION_MENU(*pparam->widget));
3540         menuitem = gtk_menu_get_active(GTK_MENU(menu));
3541         *((NextUnreadMsgDialogShow *)pparam->data) = GPOINTER_TO_INT
3542                 (gtk_object_get_user_data(GTK_OBJECT(menuitem)));
3543 }
3544
3545 static void prefs_nextunreadmsgdialog_set_optmenu(PrefParam *pparam)
3546 {
3547         NextUnreadMsgDialogShow dialog_show;
3548         GtkOptionMenu *optmenu = GTK_OPTION_MENU(*pparam->widget);
3549         GtkWidget *menu;
3550         GtkWidget *menuitem;
3551
3552         dialog_show = *((NextUnreadMsgDialogShow *)pparam->data);
3553
3554         switch (dialog_show) {
3555         case NEXTUNREADMSGDIALOG_ALWAYS:
3556                 gtk_option_menu_set_history(optmenu, 0);
3557                 break;
3558         case NEXTUNREADMSGDIALOG_ASSUME_YES:
3559                 gtk_option_menu_set_history(optmenu, 1);
3560                 break;
3561         case NEXTUNREADMSGDIALOG_ASSUME_NO:
3562                 gtk_option_menu_set_history(optmenu, 2);
3563                 break;
3564         }
3565
3566         menu = gtk_option_menu_get_menu(optmenu);
3567         menuitem = gtk_menu_get_active(GTK_MENU(menu));
3568         gtk_menu_item_activate(GTK_MENU_ITEM(menuitem));
3569 }
3570
3571 static void prefs_common_cancel(void)
3572 {
3573         gtk_widget_hide(dialog.window);
3574         inc_unlock();
3575 }
3576
3577
3578 /* static void prefs_recvdialog_set_data_from_optmenu(PrefParam *pparam)
3579 {
3580         GtkWidget *menu;
3581         GtkWidget *menuitem;
3582
3583         menu = gtk_option_menu_get_menu(GTK_OPTION_MENU(*pparam->widget));
3584         menuitem = gtk_menu_get_active(GTK_MENU(menu));
3585         *((RecvDialogShow *)pparam->data) = GPOINTER_TO_INT
3586                 (gtk_object_get_user_data(GTK_OBJECT(menuitem)));
3587 }  */
3588
3589 /* static void prefs_recvdialog_set_optmenu(PrefParam *pparam)
3590 {
3591         RecvDialogShow dialog_show;
3592         GtkOptionMenu *optmenu = GTK_OPTION_MENU(*pparam->widget);
3593         GtkWidget *menu;
3594         GtkWidget *menuitem;
3595
3596         dialog_show = *((RecvDialogShow *)pparam->data);
3597
3598         switch (dialog_show) {
3599         case RECVDIALOG_ALWAYS:
3600                 gtk_option_menu_set_history(optmenu, 0);
3601                 break;
3602         case RECVDIALOG_WINDOW_ACTIVE:
3603                 gtk_option_menu_set_history(optmenu, 1);
3604                 break;
3605         case RECVDIALOG_NEVER:
3606                 gtk_option_menu_set_history(optmenu, 2);
3607                 break;
3608         default:
3609         }
3610
3611         menu = gtk_option_menu_get_menu(optmenu);
3612         menuitem = gtk_menu_get_active(GTK_MENU(menu));
3613         gtk_menu_item_activate(GTK_MENU_ITEM(menuitem));
3614 }     */