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