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