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