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