move message colouring options to '/Other Preferences/Message View/Colors'
[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         {"open_inbox_on_inc", "FALSE", &prefs_common.open_inbox_on_inc,
675          P_BOOL, &interface.checkbtn_openinbox,
676          prefs_set_data_from_toggle, prefs_set_toggle},
677         {"immediate_execution", "TRUE", &prefs_common.immediate_exec, P_BOOL,
678          &interface.checkbtn_immedexec,
679          prefs_set_data_from_toggle, prefs_set_toggle},
680         {"nextunreadmsg_dialog", NULL, &prefs_common.next_unread_msg_dialog, P_ENUM,
681          &interface.optmenu_nextunreadmsgdialog,
682          prefs_nextunreadmsgdialog_set_data_from_optmenu,
683          prefs_nextunreadmsgdialog_set_optmenu},
684
685         {"pixmap_theme_path", DEFAULT_PIXMAP_THEME, 
686          &prefs_common.pixmap_theme_path, P_STRING,
687          NULL, NULL, NULL},
688
689         {"hover_timeout", "500", &prefs_common.hover_timeout, P_INT,
690          NULL, NULL, NULL},
691         
692         /* Other */
693         {"uri_open_command", DEFAULT_BROWSER_CMD,
694          &prefs_common.uri_cmd, P_STRING, NULL, NULL, NULL},
695         {"print_command", "lpr %s", &prefs_common.print_cmd, P_STRING,
696          NULL, NULL, NULL},
697         {"ext_editor_command", "gedit %s",
698          &prefs_common.ext_editor_cmd, P_STRING, NULL, NULL, NULL},
699
700         {"add_address_by_click", "FALSE", &prefs_common.add_address_by_click,
701          P_BOOL, &other.checkbtn_addaddrbyclick,
702          prefs_set_data_from_toggle, prefs_set_toggle},
703
704         {"confirm_on_exit", "FALSE", &prefs_common.confirm_on_exit, P_BOOL,
705          &other.checkbtn_confonexit,
706          prefs_set_data_from_toggle, prefs_set_toggle},
707         {"clean_trash_on_exit", "FALSE", &prefs_common.clean_on_exit, P_BOOL,
708          &other.checkbtn_cleanonexit,
709          prefs_set_data_from_toggle, prefs_set_toggle},
710         {"ask_on_cleaning", "TRUE", &prefs_common.ask_on_clean, P_BOOL,
711          &other.checkbtn_askonclean,
712          prefs_set_data_from_toggle, prefs_set_toggle},
713         {"warn_queued_on_exit", "TRUE", &prefs_common.warn_queued_on_exit,
714          P_BOOL, &other.checkbtn_warnqueued,
715          prefs_set_data_from_toggle, prefs_set_toggle},
716 #if 0
717 #ifdef USE_OPENSSL
718         {"ssl_ask_unknown_valid", "TRUE", &prefs_common.ssl_ask_unknown_valid,
719          P_BOOL, &other.checkbtn_ssl_ask_unknown_valid,
720          prefs_set_data_from_toggle, prefs_set_toggle},
721 #endif
722 #endif
723         {"work_offline", "FALSE", &prefs_common.work_offline, P_BOOL,
724          NULL, NULL, NULL},
725         {"summary_quicksearch_type", "0", &prefs_common.summary_quicksearch_type, P_INT,
726          NULL, NULL, NULL},
727
728         {"io_timeout_secs", "60", &prefs_common.io_timeout_secs,
729          P_INT, &other.spinbtn_iotimeout,
730          prefs_set_data_from_spinbtn, prefs_set_spinbtn},
731         {"hide_score", "-9999", &prefs_common.kill_score, P_INT,
732          NULL, NULL, NULL},
733         {"important_score", "1", &prefs_common.important_score, P_INT,
734          NULL, NULL, NULL},
735         {"clip_log", "TRUE", &prefs_common.cliplog, P_BOOL,
736          &other.checkbtn_cliplog,
737          prefs_set_data_from_toggle, prefs_set_toggle},
738         {"log_length", "500", &prefs_common.loglength, P_INT,
739          &other.loglength_entry,
740          prefs_set_data_from_entry, prefs_set_entry},
741
742         {"cache_max_mem_usage", "4096", &prefs_common.cache_max_mem_usage, P_INT,
743          NULL, NULL, NULL},
744         {"cache_min_keep_time", "15", &prefs_common.cache_min_keep_time, P_INT,
745          NULL, NULL, NULL},
746
747         {"color_new", "179", &prefs_common.color_new, P_COLOR,
748          NULL, NULL, NULL},
749
750         {NULL, NULL, NULL, P_OTHER, NULL, NULL, NULL}
751 };
752
753 /* widget creating functions */
754 static void prefs_common_create         (void);
755 static void prefs_receive_create        (void);
756 static void prefs_send_create           (void);
757 static void prefs_compose_create        (void);
758 static void prefs_quote_create          (void);
759 static void prefs_display_create        (void);
760 static void prefs_message_create        (void);
761 #if USE_GPGME
762 static void prefs_privacy_create        (void);
763 #endif
764 static void prefs_interface_create      (void);
765 static void prefs_other_create          (void);
766
767 static void date_format_ok_btn_clicked          (GtkButton      *button,
768                                                  GtkWidget     **widget);
769 static void date_format_cancel_btn_clicked      (GtkButton      *button,
770                                                  GtkWidget     **widget);
771 static void date_format_key_pressed             (GtkWidget      *keywidget,
772                                                  GdkEventKey    *event,
773                                                  GtkWidget     **widget);
774 static gboolean date_format_on_delete           (GtkWidget      *dialogwidget,
775                                                  GdkEventAny    *event,
776                                                  GtkWidget     **widget);
777 static void date_format_entry_on_change         (GtkEditable    *editable,
778                                                  GtkLabel       *example);
779 static void date_format_select_row              (GtkWidget      *date_format_list,
780                                                  gint            row,
781                                                  gint            column,
782                                                  GdkEventButton *event,
783                                                  GtkWidget      *date_format);
784 static GtkWidget *date_format_create            (GtkButton      *button,
785                                                  void           *data);
786
787 static void prefs_keybind_select                (void);
788 static gint prefs_keybind_deleted               (GtkWidget      *widget,
789                                                  GdkEventAny    *event,
790                                                  gpointer        data);
791 static void prefs_keybind_key_pressed           (GtkWidget      *widget,
792                                                  GdkEventKey    *event,
793                                                  gpointer        data);
794 static void prefs_keybind_cancel                (void);
795 static void prefs_keybind_apply_clicked         (GtkWidget      *widget);
796
797 static gint prefs_common_deleted        (GtkWidget      *widget,
798                                          GdkEventAny    *event,
799                                          gpointer        data);
800 static void prefs_common_key_pressed    (GtkWidget      *widget,
801                                          GdkEventKey    *event,
802                                          gpointer        data);
803 static void prefs_common_ok             (void);
804 static void prefs_common_apply          (void);
805 static void prefs_common_cancel         (void);
806
807 void prefs_common_init(void) 
808 {
809         prefs_common.disphdr_list = NULL;
810 }
811
812 PrefsCommon *prefs_common_get(void)
813 {
814         return &prefs_common;
815 }
816
817 /*
818  * Read history list from the specified history file
819  */
820 GList *prefs_common_read_history(const gchar *history) 
821 {
822         FILE *fp;
823         gchar *path;
824         gchar buf[PREFSBUFSIZE];
825         GList *tmp = NULL;
826
827         path = g_strconcat(get_rc_dir(), G_DIR_SEPARATOR_S, history,
828                            NULL);
829         if ((fp = fopen(path, "rb")) == NULL) {
830                 if (ENOENT != errno) FILE_OP_ERROR(path, "fopen");
831                 g_free(path);
832                 return NULL;
833         }
834         g_free(path);
835         while (fgets(buf, sizeof(buf), fp) != NULL) {
836                 g_strstrip(buf);
837                 if (buf[0] == '\0') continue;
838                 tmp = add_history(tmp, buf);
839         }
840         fclose(fp);
841
842         tmp = g_list_reverse(tmp);
843
844         return tmp;
845 }
846
847 void prefs_common_read_config(void)
848 {
849         prefs_read_config(param, "Common", COMMON_RC);
850
851         prefs_common.mime_open_cmd_history =
852                 prefs_common_read_history(COMMAND_HISTORY);
853         prefs_common.summary_quicksearch_history =
854                 prefs_common_read_history(QUICKSEARCH_HISTORY);
855 }
856
857 /*
858  * Save history list to the specified history file
859  */
860 void prefs_common_save_history(const gchar *history, GList *list)
861 {
862         GList *cur;
863         FILE *fp;
864         gchar *path;
865
866         path = g_strconcat(get_rc_dir(), G_DIR_SEPARATOR_S, history,
867                            NULL);
868         if ((fp = fopen(path, "wb")) == NULL) {
869                 FILE_OP_ERROR(path, "fopen");
870                 g_free(path);
871                 return;
872         }
873
874         for (cur = list; cur != NULL; cur = cur->next) {
875                 fputs((gchar *)cur->data, fp);
876                 fputc('\n', fp);
877         }
878
879         fclose(fp);
880         g_free(path);
881 }
882
883 void prefs_common_save_config(void)
884 {
885         prefs_save_config(param, "Common", COMMON_RC);
886
887         prefs_common_save_history(COMMAND_HISTORY, 
888                 prefs_common.mime_open_cmd_history);
889         prefs_common_save_history(QUICKSEARCH_HISTORY, 
890                 prefs_common.summary_quicksearch_history);
891 }
892
893 void prefs_common_open(void)
894 {
895         if (prefs_rc_is_readonly(COMMON_RC))
896                 return;
897
898         inc_lock();
899
900         if (!dialog.window) {
901                 prefs_common_create();
902         }
903
904         manage_window_set_transient(GTK_WINDOW(dialog.window));
905         gtk_notebook_set_page(GTK_NOTEBOOK(dialog.notebook), 0);
906         gtk_widget_grab_focus(dialog.ok_btn);
907
908         prefs_set_dialog(param);
909
910         gtk_widget_show(dialog.window);
911 }
912
913 static void prefs_common_create(void)
914 {
915         gint page = 0;
916
917         debug_print("Creating common preferences window...\n");
918
919         prefs_dialog_create(&dialog);
920         gtk_window_set_title (GTK_WINDOW(dialog.window),
921                               _("Common Preferences"));
922         gtk_signal_connect (GTK_OBJECT(dialog.window), "delete_event",
923                             GTK_SIGNAL_FUNC(prefs_common_deleted), NULL);
924         gtk_signal_connect (GTK_OBJECT(dialog.window), "key_press_event",
925                             GTK_SIGNAL_FUNC(prefs_common_key_pressed), NULL);
926         MANAGE_WINDOW_SIGNALS_CONNECT(dialog.window);
927
928         gtk_signal_connect (GTK_OBJECT(dialog.ok_btn), "clicked",
929                             GTK_SIGNAL_FUNC(prefs_common_ok), NULL);
930         gtk_signal_connect (GTK_OBJECT(dialog.apply_btn), "clicked",
931                             GTK_SIGNAL_FUNC(prefs_common_apply), NULL);
932         gtk_signal_connect_object (GTK_OBJECT(dialog.cancel_btn), "clicked",
933                                    GTK_SIGNAL_FUNC(prefs_common_cancel),
934                                    GTK_OBJECT(dialog.window));
935
936         /* create all widgets on notebook */
937         prefs_receive_create();
938         SET_NOTEBOOK_LABEL(dialog.notebook, _("Receive"),   page++);
939         prefs_send_create();
940         SET_NOTEBOOK_LABEL(dialog.notebook, _("Send"),      page++);
941         prefs_compose_create();
942         SET_NOTEBOOK_LABEL(dialog.notebook, _("Compose"),   page++);
943         prefs_quote_create();
944         SET_NOTEBOOK_LABEL(dialog.notebook, _("Quote"),   page++);
945         prefs_display_create();
946         SET_NOTEBOOK_LABEL(dialog.notebook, _("Display"),   page++);
947         prefs_message_create();
948         SET_NOTEBOOK_LABEL(dialog.notebook, _("Message"),   page++);
949 #if USE_GPGME
950         prefs_privacy_create();
951         SET_NOTEBOOK_LABEL(dialog.notebook, _("Privacy"),   page++);
952 #endif
953         prefs_interface_create();
954         SET_NOTEBOOK_LABEL(dialog.notebook, _("Interface"), page++);
955         prefs_other_create();
956         SET_NOTEBOOK_LABEL(dialog.notebook, _("Other"),     page++);
957
958         gtk_widget_show_all(dialog.window);
959 }
960
961 static void prefs_receive_create(void)
962 {
963         GtkWidget *vbox1;
964         GtkWidget *vbox2;
965         GtkWidget *frame_incext;
966         GtkWidget *checkbtn_incext;
967         GtkWidget *hbox;
968         GtkWidget *label_incext;
969         GtkWidget *entry_incext;
970         /* GtkWidget *button_incext; */
971
972         GtkWidget *hbox_autochk;
973         GtkWidget *checkbtn_autochk;
974         GtkWidget *label_autochk1;
975         GtkObject *spinbtn_autochk_adj;
976         GtkWidget *spinbtn_autochk;
977         GtkWidget *label_autochk2;
978         GtkWidget *checkbtn_chkonstartup;
979         GtkWidget *checkbtn_scan_after_inc;
980
981
982         GtkWidget *frame_newmail;
983         GtkWidget *hbox_newmail_notify;
984         GtkWidget *checkbtn_newmail_auto;
985         GtkWidget *checkbtn_newmail_manu;
986         GtkWidget *entry_newmail_notify_cmd;
987         GtkWidget *label_newmail_notify_cmd;
988
989         GtkWidget *hbox_recvdialog;
990         GtkWidget *label_recvdialog;
991         GtkWidget *menu;
992         GtkWidget *menuitem;
993         GtkWidget *optmenu_recvdialog;
994         GtkWidget *checkbtn_no_recv_err_panel;
995         GtkWidget *checkbtn_close_recv_dialog;
996
997         vbox1 = gtk_vbox_new (FALSE, VSPACING);
998         gtk_widget_show (vbox1);
999         gtk_container_add (GTK_CONTAINER (dialog.notebook), vbox1);
1000         gtk_container_set_border_width (GTK_CONTAINER (vbox1), VBOX_BORDER);
1001
1002         PACK_FRAME(vbox1, frame_incext, _("External program"));
1003
1004         vbox2 = gtk_vbox_new (FALSE, VSPACING_NARROW);
1005         gtk_widget_show (vbox2);
1006         gtk_container_add (GTK_CONTAINER (frame_incext), vbox2);
1007         gtk_container_set_border_width (GTK_CONTAINER (vbox2), 8);
1008
1009         /* Use of external incorporation program */
1010         PACK_CHECK_BUTTON (vbox2, checkbtn_incext,
1011                            _("Use external program for incorporation"));
1012
1013         hbox = gtk_hbox_new (FALSE, 8);
1014         gtk_widget_show (hbox);
1015         gtk_box_pack_start (GTK_BOX (vbox2), hbox, FALSE, FALSE, 0);
1016         SET_TOGGLE_SENSITIVITY (checkbtn_incext, hbox);
1017
1018         label_incext = gtk_label_new (_("Command"));
1019         gtk_widget_show (label_incext);
1020         gtk_box_pack_start (GTK_BOX (hbox), label_incext, FALSE, FALSE, 0);
1021
1022         entry_incext = gtk_entry_new ();
1023         gtk_widget_show (entry_incext);
1024         gtk_box_pack_start (GTK_BOX (hbox), entry_incext, TRUE, TRUE, 0);
1025
1026 #if 0
1027         button_incext = gtk_button_new_with_label ("... ");
1028         gtk_widget_show (button_incext);
1029         gtk_box_pack_start (GTK_BOX (hbox), button_incext, FALSE, FALSE, 0);
1030 #endif
1031
1032         vbox2 = gtk_vbox_new (FALSE, 0);
1033         gtk_widget_show (vbox2);
1034         gtk_box_pack_start (GTK_BOX (vbox1), vbox2, FALSE, FALSE, 0);
1035
1036         /* Auto-checking */
1037         hbox_autochk = gtk_hbox_new (FALSE, 8);
1038         gtk_widget_show (hbox_autochk);
1039         gtk_box_pack_start (GTK_BOX (vbox2), hbox_autochk, FALSE, FALSE, 0);
1040
1041         PACK_CHECK_BUTTON (hbox_autochk, checkbtn_autochk,
1042                            _("Auto-check new mail"));
1043
1044         label_autochk1 = gtk_label_new (_("every"));
1045         gtk_widget_show (label_autochk1);
1046         gtk_box_pack_start (GTK_BOX (hbox_autochk), label_autochk1, FALSE, FALSE, 0);
1047
1048         spinbtn_autochk_adj = gtk_adjustment_new (5, 1, 100, 1, 10, 10);
1049         spinbtn_autochk = gtk_spin_button_new
1050                 (GTK_ADJUSTMENT (spinbtn_autochk_adj), 1, 0);
1051         gtk_widget_show (spinbtn_autochk);
1052         gtk_box_pack_start (GTK_BOX (hbox_autochk), spinbtn_autochk, FALSE, FALSE, 0);
1053         gtk_widget_set_usize (spinbtn_autochk, 64, -1);
1054         gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (spinbtn_autochk), TRUE);
1055
1056         label_autochk2 = gtk_label_new (_("minute(s)"));
1057         gtk_widget_show (label_autochk2);
1058         gtk_box_pack_start (GTK_BOX (hbox_autochk), label_autochk2, FALSE, FALSE, 0);
1059
1060         SET_TOGGLE_SENSITIVITY(checkbtn_autochk, label_autochk1);
1061         SET_TOGGLE_SENSITIVITY(checkbtn_autochk, spinbtn_autochk);
1062         SET_TOGGLE_SENSITIVITY(checkbtn_autochk, label_autochk2);
1063
1064         PACK_CHECK_BUTTON (vbox2, checkbtn_chkonstartup,
1065                            _("Check new mail on startup"));
1066         PACK_CHECK_BUTTON (vbox2, checkbtn_scan_after_inc,
1067                            _("Update all local folders after incorporation"));
1068
1069
1070         /* receive dialog */
1071         hbox_recvdialog = gtk_hbox_new (FALSE, 8);
1072         gtk_widget_show (hbox_recvdialog);
1073         gtk_box_pack_start (GTK_BOX (vbox2), hbox_recvdialog, FALSE, FALSE, 0);
1074
1075         label_recvdialog = gtk_label_new (_("Show receive dialog"));
1076         gtk_misc_set_alignment(GTK_MISC(label_recvdialog), 0, 0.5);
1077         gtk_widget_show (label_recvdialog);
1078         gtk_box_pack_start (GTK_BOX (hbox_recvdialog), label_recvdialog, FALSE, FALSE, 0);
1079
1080         optmenu_recvdialog = gtk_option_menu_new ();
1081         gtk_widget_show (optmenu_recvdialog);
1082         gtk_box_pack_start (GTK_BOX (hbox_recvdialog), optmenu_recvdialog, FALSE, FALSE, 0);
1083
1084         menu = gtk_menu_new ();
1085         MENUITEM_ADD (menu, menuitem, _("Always"), RECV_DIALOG_ALWAYS);
1086         MENUITEM_ADD (menu, menuitem, _("Only on manual receiving"),
1087                       RECV_DIALOG_MANUAL);
1088         MENUITEM_ADD (menu, menuitem, _("Never"), RECV_DIALOG_NEVER);
1089
1090         gtk_option_menu_set_menu (GTK_OPTION_MENU (optmenu_recvdialog), menu);
1091
1092         PACK_CHECK_BUTTON (vbox2, checkbtn_no_recv_err_panel,
1093                            _("Don't popup error dialog on receive error"));
1094
1095         PACK_CHECK_BUTTON (vbox2, checkbtn_close_recv_dialog,
1096                            _("Close receive dialog when finished"));
1097         
1098         PACK_FRAME(vbox1, frame_newmail, _("Run command when new mail "
1099                                            "arrives"));
1100         vbox2 = gtk_vbox_new (FALSE, VSPACING_NARROW);
1101         gtk_widget_show (vbox2);
1102         gtk_container_add (GTK_CONTAINER (frame_newmail), vbox2);
1103         gtk_container_set_border_width (GTK_CONTAINER (vbox2), 8);
1104
1105         hbox = gtk_hbox_new (TRUE, 8);
1106         gtk_widget_show (hbox);
1107         PACK_CHECK_BUTTON (hbox, checkbtn_newmail_auto,
1108                            _("after autochecking"));
1109         PACK_CHECK_BUTTON (hbox, checkbtn_newmail_manu,
1110                            _("after manual checking"));
1111         gtk_box_pack_start (GTK_BOX(vbox2), hbox, FALSE, FALSE, 0);
1112         gtk_signal_connect(GTK_OBJECT(checkbtn_newmail_auto), "toggled",
1113                            GTK_SIGNAL_FUNC(prefs_common_recv_dialog_newmail_notify_toggle_cb),
1114                            NULL);
1115         gtk_signal_connect(GTK_OBJECT(checkbtn_newmail_manu), "toggled",
1116                            GTK_SIGNAL_FUNC(prefs_common_recv_dialog_newmail_notify_toggle_cb),
1117                            NULL);
1118
1119         hbox_newmail_notify = gtk_hbox_new (FALSE, 8);
1120         gtk_widget_show (hbox);
1121         gtk_box_pack_start (GTK_BOX (vbox2), hbox_newmail_notify, FALSE, 
1122                             FALSE, 0);
1123
1124         label_newmail_notify_cmd = gtk_label_new (_("Command to execute:\n"
1125                                                     "(use %d as number of new "
1126                                                     "mails)"));
1127         gtk_label_set_justify(GTK_LABEL(label_newmail_notify_cmd), 
1128                               GTK_JUSTIFY_RIGHT);
1129         gtk_widget_show (label_newmail_notify_cmd);
1130         gtk_box_pack_start (GTK_BOX (hbox_newmail_notify), 
1131                             label_newmail_notify_cmd, FALSE, FALSE, 0);
1132
1133         entry_newmail_notify_cmd = gtk_entry_new ();
1134         gtk_widget_show (entry_newmail_notify_cmd);
1135         gtk_box_pack_start (GTK_BOX (hbox_newmail_notify), 
1136                             entry_newmail_notify_cmd, TRUE, TRUE, 0);
1137
1138         gtk_widget_set_sensitive(hbox_newmail_notify, 
1139                                  prefs_common.newmail_notify_auto || 
1140                                  prefs_common.newmail_notify_manu);
1141
1142         receive.checkbtn_incext = checkbtn_incext;
1143         receive.entry_incext    = entry_incext;
1144         /* receive.button_incext   = button_incext; */
1145
1146         receive.checkbtn_autochk    = checkbtn_autochk;
1147         receive.spinbtn_autochk     = spinbtn_autochk;
1148         receive.spinbtn_autochk_adj = spinbtn_autochk_adj;
1149
1150         receive.checkbtn_chkonstartup = checkbtn_chkonstartup;
1151         receive.checkbtn_scan_after_inc = checkbtn_scan_after_inc;
1152
1153
1154         receive.checkbtn_newmail_auto  = checkbtn_newmail_auto;
1155         receive.checkbtn_newmail_manu  = checkbtn_newmail_manu;
1156         receive.hbox_newmail_notify    = hbox_newmail_notify;
1157         receive.entry_newmail_notify_cmd = entry_newmail_notify_cmd;
1158         receive.optmenu_recvdialog          = optmenu_recvdialog;
1159         receive.checkbtn_no_recv_err_panel  = checkbtn_no_recv_err_panel;
1160         receive.checkbtn_close_recv_dialog  = checkbtn_close_recv_dialog;
1161 }
1162
1163 static void prefs_send_create(void)
1164 {
1165         GtkWidget *vbox1;
1166         GtkWidget *vbox2;
1167         GtkWidget *hbox1;
1168         GtkWidget *checkbtn_savemsg;
1169         GtkWidget *label_outcharset;
1170         GtkWidget *optmenu_charset;
1171         GtkWidget *optmenu_menu;
1172         GtkWidget *menuitem;
1173         GtkTooltips *charset_tooltip;
1174         GtkWidget *optmenu_encoding;
1175         GtkWidget *label_encoding;
1176         GtkTooltips *encoding_tooltip;
1177         GtkWidget *label_senddialog;
1178         GtkWidget *menu;
1179         GtkWidget *optmenu_senddialog;
1180         GtkWidget *hbox_senddialog;
1181
1182         vbox1 = gtk_vbox_new (FALSE, VSPACING);
1183         gtk_widget_show (vbox1);
1184         gtk_container_add (GTK_CONTAINER (dialog.notebook), vbox1);
1185         gtk_container_set_border_width (GTK_CONTAINER (vbox1), VBOX_BORDER);
1186
1187         vbox2 = gtk_vbox_new (FALSE, 0);
1188         gtk_widget_show (vbox2);
1189         gtk_box_pack_start (GTK_BOX (vbox1), vbox2, FALSE, FALSE, 0);
1190
1191         PACK_CHECK_BUTTON (vbox2, checkbtn_savemsg,
1192                            _("Save sent messages to Sent folder"));
1193
1194         hbox_senddialog = gtk_hbox_new (FALSE, 8);
1195         gtk_box_pack_start (GTK_BOX (vbox1), hbox_senddialog, FALSE, FALSE, 0);
1196
1197         label_senddialog = gtk_label_new (_("Show send dialog"));
1198         gtk_widget_show (label_senddialog);
1199         gtk_box_pack_start (GTK_BOX (hbox_senddialog), label_senddialog, FALSE, FALSE, 0);
1200
1201         optmenu_senddialog = gtk_option_menu_new ();
1202         gtk_widget_show (optmenu_senddialog);
1203         gtk_box_pack_start (GTK_BOX (hbox_senddialog), optmenu_senddialog, FALSE, FALSE, 0);
1204         
1205         menu = gtk_menu_new ();
1206         MENUITEM_ADD (menu, menuitem, _("Always"), SEND_DIALOG_ALWAYS);
1207         MENUITEM_ADD (menu, menuitem, _("Never"), SEND_DIALOG_NEVER);
1208
1209         gtk_option_menu_set_menu (GTK_OPTION_MENU (optmenu_senddialog), menu);
1210
1211         hbox1 = gtk_hbox_new (FALSE, 8);
1212         gtk_widget_show (hbox1);
1213         gtk_box_pack_start (GTK_BOX (vbox1), hbox1, FALSE, FALSE, 0);
1214
1215         label_outcharset = gtk_label_new (_("Outgoing codeset"));
1216         gtk_widget_show (label_outcharset);
1217         gtk_box_pack_start (GTK_BOX (hbox1), label_outcharset, FALSE, FALSE, 0);
1218
1219         charset_tooltip = gtk_tooltips_new();
1220
1221         optmenu_charset = gtk_option_menu_new ();
1222         gtk_widget_show (optmenu_charset);
1223         gtk_tooltips_set_tip(GTK_TOOLTIPS(charset_tooltip), optmenu_charset,
1224                              _("If `Automatic' is selected, the optimal encoding"
1225                                " for the current locale will be used"),
1226                              NULL);
1227         gtk_box_pack_start (GTK_BOX (hbox1), optmenu_charset, FALSE, FALSE, 0);
1228
1229         optmenu_menu = gtk_menu_new ();
1230
1231 #define SET_MENUITEM(str, data) \
1232 { \
1233         MENUITEM_ADD(optmenu_menu, menuitem, str, data); \
1234 }
1235
1236         SET_MENUITEM(_("Automatic (Recommended)"),       CS_AUTO);
1237         SET_MENUITEM(_("7bit ascii (US-ASCII)"),         CS_US_ASCII);
1238 #if HAVE_ICONV
1239         SET_MENUITEM(_("Unicode (UTF-8)"),               CS_UTF_8);
1240 #endif
1241         SET_MENUITEM(_("Western European (ISO-8859-1)"),  CS_ISO_8859_1);
1242         SET_MENUITEM(_("Western European (ISO-8859-15)"), CS_ISO_8859_15);
1243         SET_MENUITEM(_("Central European (ISO-8859-2)"),  CS_ISO_8859_2);
1244         SET_MENUITEM(_("Baltic (ISO-8859-13)"),           CS_ISO_8859_13);
1245         SET_MENUITEM(_("Baltic (ISO-8859-4)"),            CS_ISO_8859_4);
1246         SET_MENUITEM(_("Greek (ISO-8859-7)"),             CS_ISO_8859_7);
1247         SET_MENUITEM(_("Turkish (ISO-8859-9)"),           CS_ISO_8859_9);
1248 #if HAVE_ICONV
1249         SET_MENUITEM(_("Cyrillic (ISO-8859-5)"),          CS_ISO_8859_5);
1250 #endif
1251         SET_MENUITEM(_("Cyrillic (KOI8-R)"),             CS_KOI8_R);
1252 #if HAVE_ICONV
1253         SET_MENUITEM(_("Cyrillic (Windows-1251)"),       CS_WINDOWS_1251);
1254         SET_MENUITEM(_("Cyrillic (KOI8-U)"),             CS_KOI8_U);
1255 #endif
1256         SET_MENUITEM(_("Japanese (ISO-2022-JP)"),        CS_ISO_2022_JP);
1257 #if 0
1258         SET_MENUITEM(_("Japanese (EUC-JP)"),             CS_EUC_JP);
1259         SET_MENUITEM(_("Japanese (Shift_JIS)"),          CS_SHIFT_JIS);
1260 #endif /* 0 */
1261         SET_MENUITEM(_("Simplified Chinese (GB2312)"),   CS_GB2312);
1262         SET_MENUITEM(_("Traditional Chinese (Big5)"),    CS_BIG5);
1263 #if 0
1264         SET_MENUITEM(_("Traditional Chinese (EUC-TW)"),  CS_EUC_TW);
1265         SET_MENUITEM(_("Chinese (ISO-2022-CN)"),         CS_ISO_2022_CN);
1266 #endif /* 0 */
1267         SET_MENUITEM(_("Korean (EUC-KR)"),               CS_EUC_KR);
1268         SET_MENUITEM(_("Thai (TIS-620)"),                CS_TIS_620);
1269         SET_MENUITEM(_("Thai (Windows-874)"),            CS_WINDOWS_874);
1270
1271         gtk_option_menu_set_menu (GTK_OPTION_MENU (optmenu_charset),
1272                                   optmenu_menu);
1273
1274         hbox1 = gtk_hbox_new (FALSE, 8);
1275         gtk_widget_show (hbox1);
1276         gtk_box_pack_start (GTK_BOX (vbox1), hbox1, FALSE, FALSE, 0);
1277
1278         hbox1 = gtk_hbox_new (FALSE, 8);
1279         gtk_widget_show (hbox1);
1280         gtk_box_pack_start (GTK_BOX (vbox1), hbox1, FALSE, FALSE, 0);
1281
1282         label_encoding = gtk_label_new (_("Transfer encoding"));
1283         gtk_widget_show (label_encoding);
1284         gtk_box_pack_start (GTK_BOX (hbox1), label_encoding, FALSE, FALSE, 0);
1285
1286         encoding_tooltip = gtk_tooltips_new();
1287
1288         optmenu_encoding = gtk_option_menu_new ();
1289         gtk_widget_show (optmenu_encoding);
1290         gtk_tooltips_set_tip(GTK_TOOLTIPS(encoding_tooltip), optmenu_encoding,
1291                              _("Specify Content-Transfer-Encoding used when"
1292                                " message body contains non-ASCII characters"),
1293                              NULL);
1294         gtk_box_pack_start (GTK_BOX (hbox1), optmenu_encoding, FALSE, FALSE, 0);
1295
1296         optmenu_menu = gtk_menu_new ();
1297
1298         SET_MENUITEM(_("Automatic"),     CTE_AUTO);
1299         SET_MENUITEM("base64",           CTE_BASE64);
1300         SET_MENUITEM("quoted-printable", CTE_QUOTED_PRINTABLE);
1301         SET_MENUITEM("8bit",             CTE_8BIT);
1302
1303         gtk_option_menu_set_menu (GTK_OPTION_MENU (optmenu_encoding),
1304                                   optmenu_menu);
1305
1306         hbox1 = gtk_hbox_new (FALSE, 8);
1307         gtk_widget_show (hbox1);
1308         gtk_box_pack_start (GTK_BOX (vbox1), hbox1, FALSE, FALSE, 0);
1309
1310         p_send.checkbtn_savemsg  = checkbtn_savemsg;
1311         p_send.optmenu_senddialog = optmenu_senddialog;
1312
1313         p_send.optmenu_charset = optmenu_charset;
1314         p_send.optmenu_encoding_method = optmenu_encoding;
1315 }
1316
1317 static void prefs_common_recv_dialog_newmail_notify_toggle_cb(GtkWidget *w, gpointer data)
1318 {
1319         gboolean toggled;
1320
1321         toggled = gtk_toggle_button_get_active
1322                         (GTK_TOGGLE_BUTTON(receive.checkbtn_newmail_manu)) ||
1323                   gtk_toggle_button_get_active
1324                         (GTK_TOGGLE_BUTTON(receive.checkbtn_newmail_auto));
1325         gtk_widget_set_sensitive(receive.hbox_newmail_notify, toggled);
1326 }
1327
1328 static void prefs_compose_create(void)
1329 {
1330         GtkWidget *vbox1;
1331         GtkWidget *vbox2;
1332
1333         GtkWidget *checkbtn_autoextedit;
1334
1335         GtkWidget *frame_autosel;
1336         GtkWidget *hbox_autosel;
1337         GtkWidget *checkbtn_reply_account_autosel;
1338         GtkWidget *checkbtn_forward_account_autosel;
1339         GtkWidget *checkbtn_reedit_account_autosel;
1340
1341         GtkWidget *hbox_undolevel;
1342         GtkWidget *label_undolevel;
1343         GtkObject *spinbtn_undolevel_adj;
1344         GtkWidget *spinbtn_undolevel;
1345
1346         GtkWidget *hbox5;
1347
1348         GtkWidget *checkbtn_default_reply_list;
1349
1350         GtkWidget *checkbtn_forward_as_attachment;
1351         GtkWidget *checkbtn_redirect_keep_from;
1352         GtkWidget *checkbtn_block_cursor;
1353
1354         GtkWidget *hbox_autosave;
1355         GtkWidget *checkbtn_autosave;
1356         GtkWidget *entry_autosave_length;
1357         GtkWidget *label_autosave_length;
1358         
1359         vbox1 = gtk_vbox_new (FALSE, VSPACING);
1360         gtk_widget_show (vbox1);
1361         gtk_container_add (GTK_CONTAINER (dialog.notebook), vbox1);
1362         gtk_container_set_border_width (GTK_CONTAINER (vbox1), VBOX_BORDER);
1363
1364         /* Account autoselection */
1365         PACK_FRAME(vbox1, frame_autosel, _("Automatic account selection"));
1366
1367         hbox_autosel = gtk_hbox_new (FALSE, VSPACING_NARROW);
1368         gtk_widget_show (hbox_autosel);
1369         gtk_container_add (GTK_CONTAINER (frame_autosel), hbox_autosel);
1370         gtk_container_set_border_width (GTK_CONTAINER (hbox_autosel), 8);
1371
1372         PACK_CHECK_BUTTON (hbox_autosel, checkbtn_reply_account_autosel,
1373                            _("when replying"));
1374         PACK_CHECK_BUTTON (hbox_autosel, checkbtn_forward_account_autosel,
1375                            _("when forwarding"));
1376         PACK_CHECK_BUTTON (hbox_autosel, checkbtn_reedit_account_autosel,
1377                            _("when re-editing"));
1378
1379         vbox2 = gtk_vbox_new (FALSE, 0);
1380         gtk_widget_show (vbox2);
1381         gtk_box_pack_start (GTK_BOX (vbox1), vbox2, FALSE, FALSE, 0);
1382
1383         PACK_CHECK_BUTTON (vbox2, checkbtn_default_reply_list,
1384                            _("Reply button invokes mailing list reply"));
1385
1386         PACK_CHECK_BUTTON (vbox2, checkbtn_autoextedit,
1387                            _("Automatically launch the external editor"));
1388
1389         hbox5 = gtk_hbox_new (FALSE, 8);
1390         gtk_widget_show (hbox5);
1391         gtk_box_pack_start (GTK_BOX (vbox2), hbox5, FALSE, FALSE, 0);
1392
1393         PACK_CHECK_BUTTON (hbox5, checkbtn_forward_as_attachment,
1394                            _("Forward as attachment"));
1395
1396         PACK_CHECK_BUTTON (hbox5, checkbtn_block_cursor,
1397                           _("Block cursor"));
1398
1399         PACK_CHECK_BUTTON (vbox2, checkbtn_redirect_keep_from,
1400                            _("Keep the original 'From' header when redirecting"));
1401
1402         
1403         hbox_autosave = gtk_hbox_new (FALSE, 8);
1404         gtk_widget_show (hbox_autosave);
1405         gtk_box_pack_start (GTK_BOX (vbox1), hbox_autosave, FALSE, FALSE, 0);
1406         
1407         PACK_CHECK_BUTTON (hbox_autosave, checkbtn_autosave,
1408                            _("Autosave to Drafts folder every "));
1409
1410         entry_autosave_length = gtk_entry_new();
1411         gtk_widget_set_usize (entry_autosave_length, 64, -1);   
1412         gtk_widget_show (entry_autosave_length);
1413         gtk_box_pack_start (GTK_BOX (hbox_autosave), entry_autosave_length, FALSE, FALSE, 0);
1414         
1415         label_autosave_length = gtk_label_new(_("characters"));
1416         gtk_widget_show (label_autosave_length);
1417         gtk_box_pack_start (GTK_BOX (hbox_autosave), label_autosave_length, FALSE, FALSE, 0);
1418         
1419         hbox_undolevel = gtk_hbox_new (FALSE, 8);
1420         gtk_widget_show (hbox_undolevel);
1421         gtk_box_pack_start (GTK_BOX (vbox1), hbox_undolevel, FALSE, FALSE, 0);
1422
1423         label_undolevel = gtk_label_new (_("Undo level"));
1424         gtk_widget_show (label_undolevel);
1425         gtk_box_pack_start (GTK_BOX (hbox_undolevel), label_undolevel, FALSE, FALSE, 0);
1426
1427         spinbtn_undolevel_adj = gtk_adjustment_new (50, 0, 100, 1, 10, 10);
1428         spinbtn_undolevel = gtk_spin_button_new
1429                 (GTK_ADJUSTMENT (spinbtn_undolevel_adj), 1, 0);
1430         gtk_widget_show (spinbtn_undolevel);
1431         gtk_box_pack_start (GTK_BOX (hbox_undolevel), spinbtn_undolevel, FALSE, FALSE, 0);
1432         gtk_widget_set_usize (spinbtn_undolevel, 64, -1);
1433         gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (spinbtn_undolevel), TRUE);
1434
1435        /*
1436         compose.checkbtn_quote   = checkbtn_quote;
1437         compose.entry_quotemark  = entry_quotemark;
1438         compose.text_quotefmt    = text_quotefmt;
1439         */
1440
1441         compose.checkbtn_autoextedit = checkbtn_autoextedit;
1442
1443         compose.checkbtn_reply_account_autosel   = checkbtn_reply_account_autosel;
1444         compose.checkbtn_forward_account_autosel = checkbtn_forward_account_autosel;
1445         compose.checkbtn_reedit_account_autosel  = checkbtn_reedit_account_autosel;
1446
1447         compose.spinbtn_undolevel     = spinbtn_undolevel;
1448         compose.spinbtn_undolevel_adj = spinbtn_undolevel_adj;
1449
1450         compose.checkbtn_autosave     = checkbtn_autosave;
1451         compose.entry_autosave_length = entry_autosave_length;
1452         
1453         compose.checkbtn_forward_as_attachment =
1454                 checkbtn_forward_as_attachment;
1455         compose.checkbtn_redirect_keep_from =
1456                 checkbtn_redirect_keep_from;
1457         compose.checkbtn_block_cursor   =
1458                 checkbtn_block_cursor;
1459         compose.checkbtn_default_reply_list = checkbtn_default_reply_list;
1460 }
1461
1462 static void prefs_quote_create(void)
1463 {
1464         GtkWidget *vbox1;
1465         GtkWidget *frame_quote;
1466         GtkWidget *vbox_quote;
1467         GtkWidget *hbox1;
1468         GtkWidget *hbox2;
1469         GtkWidget *label_quotemark;
1470         GtkWidget *entry_quotemark;
1471         GtkWidget *scrolledwin_quotefmt;
1472         GtkWidget *text_quotefmt;
1473
1474         GtkWidget *entry_fw_quotemark;
1475         GtkWidget *text_fw_quotefmt;
1476
1477         GtkWidget *entry_quote_chars;
1478         GtkWidget *label_quote_chars;
1479         
1480         GtkWidget *btn_quotedesc;
1481
1482         GtkWidget *checkbtn_reply_with_quote;
1483
1484         vbox1 = gtk_vbox_new (FALSE, VSPACING);
1485         gtk_widget_show (vbox1);
1486         gtk_container_add (GTK_CONTAINER (dialog.notebook), vbox1);
1487         gtk_container_set_border_width (GTK_CONTAINER (vbox1), VBOX_BORDER);
1488
1489         /* reply */
1490
1491         PACK_CHECK_BUTTON (vbox1, checkbtn_reply_with_quote, _("Reply will quote by default"));
1492
1493         PACK_FRAME (vbox1, frame_quote, _("Reply format"));
1494
1495         vbox_quote = gtk_vbox_new (FALSE, VSPACING_NARROW);
1496         gtk_widget_show (vbox_quote);
1497         gtk_container_add (GTK_CONTAINER (frame_quote), vbox_quote);
1498         gtk_container_set_border_width (GTK_CONTAINER (vbox_quote), 8);
1499
1500         hbox1 = gtk_hbox_new (FALSE, 32);
1501         gtk_widget_show (hbox1);
1502         gtk_box_pack_start (GTK_BOX (vbox_quote), hbox1, FALSE, FALSE, 0);
1503
1504         hbox2 = gtk_hbox_new (FALSE, 8);
1505         gtk_widget_show (hbox2);
1506         gtk_box_pack_start (GTK_BOX (hbox1), hbox2, FALSE, FALSE, 0);
1507
1508         label_quotemark = gtk_label_new (_("Quotation mark"));
1509         gtk_widget_show (label_quotemark);
1510         gtk_box_pack_start (GTK_BOX (hbox2), label_quotemark, FALSE, FALSE, 0);
1511
1512         entry_quotemark = gtk_entry_new ();
1513         gtk_widget_show (entry_quotemark);
1514         gtk_box_pack_start (GTK_BOX (hbox2), entry_quotemark, FALSE, FALSE, 0);
1515         gtk_widget_set_usize (entry_quotemark, 64, -1);
1516
1517         scrolledwin_quotefmt = gtk_scrolled_window_new (NULL, NULL);
1518         gtk_widget_show (scrolledwin_quotefmt);
1519         gtk_box_pack_start (GTK_BOX (vbox_quote), scrolledwin_quotefmt, TRUE, TRUE, 0);
1520         gtk_scrolled_window_set_policy
1521                 (GTK_SCROLLED_WINDOW (scrolledwin_quotefmt),
1522                  GTK_POLICY_NEVER, GTK_POLICY_ALWAYS);
1523
1524         text_quotefmt = gtk_text_new (NULL, NULL);
1525         gtk_widget_show (text_quotefmt);
1526         gtk_container_add(GTK_CONTAINER(scrolledwin_quotefmt), text_quotefmt);
1527         gtk_text_set_editable (GTK_TEXT (text_quotefmt), TRUE);
1528         gtk_widget_set_usize(text_quotefmt, -1, 60);
1529
1530         /* forward */
1531
1532         PACK_FRAME (vbox1, frame_quote, _("Forward format"));
1533
1534         vbox_quote = gtk_vbox_new (FALSE, VSPACING_NARROW);
1535         gtk_widget_show (vbox_quote);
1536         gtk_container_add (GTK_CONTAINER (frame_quote), vbox_quote);
1537         gtk_container_set_border_width (GTK_CONTAINER (vbox_quote), 8);
1538
1539         hbox1 = gtk_hbox_new (FALSE, 32);
1540         gtk_widget_show (hbox1);
1541         gtk_box_pack_start (GTK_BOX (vbox_quote), hbox1, FALSE, FALSE, 0);
1542
1543         hbox2 = gtk_hbox_new (FALSE, 8);
1544         gtk_widget_show (hbox2);
1545         gtk_box_pack_start (GTK_BOX (hbox1), hbox2, FALSE, FALSE, 0);
1546
1547         label_quotemark = gtk_label_new (_("Quotation mark"));
1548         gtk_widget_show (label_quotemark);
1549         gtk_box_pack_start (GTK_BOX (hbox2), label_quotemark, FALSE, FALSE, 0);
1550
1551         entry_fw_quotemark = gtk_entry_new ();
1552         gtk_widget_show (entry_fw_quotemark);
1553         gtk_box_pack_start (GTK_BOX (hbox2), entry_fw_quotemark,
1554                             FALSE, FALSE, 0);
1555         gtk_widget_set_usize (entry_fw_quotemark, 64, -1);
1556
1557         scrolledwin_quotefmt = gtk_scrolled_window_new (NULL, NULL);
1558         gtk_widget_show (scrolledwin_quotefmt);
1559         gtk_box_pack_start (GTK_BOX (vbox_quote), scrolledwin_quotefmt, TRUE, TRUE, 0);
1560         gtk_scrolled_window_set_policy
1561                 (GTK_SCROLLED_WINDOW (scrolledwin_quotefmt),
1562                  GTK_POLICY_NEVER, GTK_POLICY_ALWAYS);
1563
1564         text_fw_quotefmt = gtk_text_new (NULL, NULL);
1565         gtk_widget_show (text_fw_quotefmt);
1566         gtk_container_add(GTK_CONTAINER(scrolledwin_quotefmt),
1567                           text_fw_quotefmt);
1568         gtk_text_set_editable (GTK_TEXT (text_fw_quotefmt), TRUE);
1569         gtk_widget_set_usize(text_fw_quotefmt, -1, 60);
1570
1571         hbox1 = gtk_hbox_new (FALSE, 32);
1572         gtk_widget_show (hbox1);
1573         gtk_box_pack_start (GTK_BOX (vbox1), hbox1, FALSE, FALSE, 0);
1574
1575         btn_quotedesc =
1576                 gtk_button_new_with_label (_(" Description of symbols "));
1577         gtk_widget_show (btn_quotedesc);
1578         gtk_box_pack_start (GTK_BOX (hbox1), btn_quotedesc, FALSE, FALSE, 0);
1579         gtk_signal_connect(GTK_OBJECT(btn_quotedesc), "clicked",
1580                            GTK_SIGNAL_FUNC(quote_fmt_quote_description), NULL);
1581
1582         /* quote chars */
1583
1584         PACK_FRAME (vbox1, frame_quote, _("Quotation characters"));
1585
1586         vbox_quote = gtk_vbox_new (FALSE, VSPACING_NARROW);
1587         gtk_widget_show (vbox_quote);
1588         gtk_container_add (GTK_CONTAINER (frame_quote), vbox_quote);
1589         gtk_container_set_border_width (GTK_CONTAINER (vbox_quote), 8);
1590
1591         hbox1 = gtk_hbox_new (FALSE, 32);
1592         gtk_widget_show (hbox1);
1593         gtk_box_pack_start (GTK_BOX (vbox_quote), hbox1, FALSE, FALSE, 0);
1594
1595         hbox2 = gtk_hbox_new (FALSE, 8);
1596         gtk_widget_show (hbox2);
1597         gtk_box_pack_start (GTK_BOX (hbox1), hbox2, FALSE, FALSE, 0);
1598
1599         label_quote_chars = gtk_label_new (_("Treat these characters as quotation marks: "));
1600         gtk_widget_show (label_quote_chars);
1601         gtk_box_pack_start (GTK_BOX (hbox2), label_quote_chars, FALSE, FALSE, 0);
1602
1603         entry_quote_chars = gtk_entry_new ();
1604         gtk_widget_show (entry_quote_chars);
1605         gtk_box_pack_start (GTK_BOX (hbox2), entry_quote_chars,
1606                             FALSE, FALSE, 0);
1607         gtk_widget_set_usize (entry_quote_chars, 64, -1);
1608
1609
1610         compose.checkbtn_reply_with_quote= checkbtn_reply_with_quote;
1611         quote.entry_quotemark    = entry_quotemark;
1612         quote.text_quotefmt      = text_quotefmt;
1613         quote.entry_fw_quotemark = entry_fw_quotemark;
1614         quote.text_fw_quotefmt   = text_fw_quotefmt;
1615         quote.entry_quote_chars  = entry_quote_chars;
1616 }
1617
1618 static void prefs_display_create(void)
1619 {
1620         GtkWidget *vbox1;
1621         GtkWidget *chkbtn_transhdr;
1622         GtkWidget *chkbtn_folder_unread;
1623         GtkWidget *hbox1;
1624         GtkWidget *label_ng_abbrev;
1625         GtkWidget *spinbtn_ng_abbrev_len;
1626         GtkObject *spinbtn_ng_abbrev_len_adj;
1627         GtkWidget *frame_summary;
1628         GtkWidget *vbox2;
1629         GtkWidget *chkbtn_swapfrom;
1630         GtkWidget *chkbtn_useaddrbook;
1631         GtkWidget *chkbtn_threadsubj;
1632         GtkWidget *vbox3;
1633         GtkWidget *label_datefmt;
1634         GtkWidget *button_datefmt;
1635         GtkWidget *entry_datefmt;
1636         GtkWidget *button_dispitem;
1637
1638         vbox1 = gtk_vbox_new (FALSE, VSPACING);
1639         gtk_widget_show (vbox1);
1640         gtk_container_add (GTK_CONTAINER (dialog.notebook), vbox1);
1641         gtk_container_set_border_width (GTK_CONTAINER (vbox1), VBOX_BORDER);
1642
1643         vbox2 = gtk_vbox_new (FALSE, 0);
1644         gtk_widget_show (vbox2);
1645         gtk_box_pack_start (GTK_BOX (vbox1), vbox2, FALSE, TRUE, 0);
1646
1647         PACK_CHECK_BUTTON
1648                 (vbox2, chkbtn_transhdr,
1649                  _("Translate header name (such as `From:', `Subject:')"));
1650
1651         PACK_CHECK_BUTTON (vbox2, chkbtn_folder_unread,
1652                            _("Display unread number next to folder name"));
1653
1654         PACK_VSPACER(vbox2, vbox3, VSPACING_NARROW_2);
1655
1656         hbox1 = gtk_hbox_new (FALSE, 8);
1657         gtk_widget_show (hbox1);
1658         gtk_box_pack_start (GTK_BOX (vbox2), hbox1, FALSE, TRUE, 0);
1659
1660         label_ng_abbrev = gtk_label_new
1661                 (_("Abbreviate newsgroup names longer than"));
1662         gtk_widget_show (label_ng_abbrev);
1663         gtk_box_pack_start (GTK_BOX (hbox1), label_ng_abbrev, FALSE, FALSE, 0);
1664
1665         spinbtn_ng_abbrev_len_adj = gtk_adjustment_new (16, 0, 999, 1, 10, 10);
1666         spinbtn_ng_abbrev_len = gtk_spin_button_new
1667                 (GTK_ADJUSTMENT (spinbtn_ng_abbrev_len_adj), 1, 0);
1668         gtk_widget_show (spinbtn_ng_abbrev_len);
1669         gtk_box_pack_start (GTK_BOX (hbox1), spinbtn_ng_abbrev_len,
1670                             FALSE, FALSE, 0);
1671         gtk_widget_set_usize (spinbtn_ng_abbrev_len, 56, -1);
1672         gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (spinbtn_ng_abbrev_len),
1673                                      TRUE);
1674
1675         label_ng_abbrev = gtk_label_new
1676                 (_("letters"));
1677         gtk_widget_show (label_ng_abbrev);
1678         gtk_box_pack_start (GTK_BOX (hbox1), label_ng_abbrev, FALSE, FALSE, 0);
1679
1680         /* ---- Summary ---- */
1681
1682         PACK_FRAME(vbox1, frame_summary, _("Summary View"));
1683
1684         vbox2 = gtk_vbox_new (FALSE, 0);
1685         gtk_widget_show (vbox2);
1686         gtk_container_add (GTK_CONTAINER (frame_summary), vbox2);
1687         gtk_container_set_border_width (GTK_CONTAINER (vbox2), 8);
1688
1689         PACK_CHECK_BUTTON
1690                 (vbox2, chkbtn_swapfrom,
1691                  _("Display recipient in `From' column if sender is yourself"));
1692         PACK_CHECK_BUTTON
1693                 (vbox2, chkbtn_useaddrbook,
1694                  _("Display sender using address book"));
1695         PACK_CHECK_BUTTON
1696                 (vbox2, chkbtn_threadsubj,
1697                  _("Thread using subject in addition to standard headers"));
1698
1699         PACK_VSPACER(vbox2, vbox3, VSPACING_NARROW_2);
1700
1701         hbox1 = gtk_hbox_new (FALSE, 8);
1702         gtk_widget_show (hbox1);
1703         gtk_box_pack_start (GTK_BOX (vbox2), hbox1, FALSE, TRUE, 0);
1704
1705         label_datefmt = gtk_label_new (_("Date format"));
1706         gtk_widget_show (label_datefmt);
1707         gtk_box_pack_start (GTK_BOX (hbox1), label_datefmt, FALSE, FALSE, 0);
1708
1709         entry_datefmt = gtk_entry_new ();
1710         gtk_widget_show (entry_datefmt);
1711         gtk_box_pack_start (GTK_BOX (hbox1), entry_datefmt, TRUE, TRUE, 0);
1712
1713         button_datefmt = gtk_button_new_with_label (" ... ");
1714
1715         gtk_widget_show (button_datefmt);
1716         gtk_box_pack_start (GTK_BOX (hbox1), button_datefmt, FALSE, FALSE, 0);
1717         gtk_signal_connect (GTK_OBJECT (button_datefmt), "clicked",
1718                             GTK_SIGNAL_FUNC (date_format_create), NULL);
1719
1720         PACK_VSPACER(vbox2, vbox3, VSPACING_NARROW);
1721
1722         hbox1 = gtk_hbox_new (FALSE, 8);
1723         gtk_widget_show (hbox1);
1724         gtk_box_pack_start (GTK_BOX (vbox2), hbox1, FALSE, TRUE, 0);
1725
1726         button_dispitem = gtk_button_new_with_label
1727                 (_(" Set displayed items in summary... "));
1728         gtk_widget_show (button_dispitem);
1729         gtk_box_pack_start (GTK_BOX (hbox1), button_dispitem, FALSE, TRUE, 0);
1730         gtk_signal_connect (GTK_OBJECT (button_dispitem), "clicked",
1731                             GTK_SIGNAL_FUNC (prefs_summary_column_open),
1732                             NULL);
1733
1734         display.chkbtn_transhdr           = chkbtn_transhdr;
1735         display.chkbtn_folder_unread      = chkbtn_folder_unread;
1736         display.spinbtn_ng_abbrev_len     = spinbtn_ng_abbrev_len;
1737         display.spinbtn_ng_abbrev_len_adj = spinbtn_ng_abbrev_len_adj;
1738
1739         display.chkbtn_swapfrom      = chkbtn_swapfrom;
1740         display.chkbtn_useaddrbook   = chkbtn_useaddrbook;
1741         display.chkbtn_threadsubj    = chkbtn_threadsubj;
1742         display.entry_datefmt        = entry_datefmt;
1743 }
1744
1745 static void prefs_message_create(void)
1746 {
1747         GtkWidget *vbox1;
1748         GtkWidget *vbox2;
1749         GtkWidget *vbox3;
1750         GtkWidget *hbox1;
1751         GtkWidget *chkbtn_mbalnum;
1752         GtkWidget *chkbtn_disphdrpane;
1753         GtkWidget *chkbtn_disphdr;
1754         GtkWidget *button_edit_disphdr;
1755         GtkWidget *hbox_linespc;
1756         GtkWidget *label_linespc;
1757         GtkObject *spinbtn_linespc_adj;
1758         GtkWidget *spinbtn_linespc;
1759         GtkWidget *chkbtn_headspc;
1760
1761         GtkWidget *frame_scr;
1762         GtkWidget *vbox_scr;
1763         GtkWidget *chkbtn_smoothscroll;
1764         GtkWidget *hbox_scr;
1765         GtkWidget *label_scr;
1766         GtkObject *spinbtn_scrollstep_adj;
1767         GtkWidget *spinbtn_scrollstep;
1768         GtkWidget *chkbtn_halfpage;
1769
1770         GtkWidget *chkbtn_attach_desc;
1771
1772         vbox1 = gtk_vbox_new (FALSE, VSPACING);
1773         gtk_widget_show (vbox1);
1774         gtk_container_add (GTK_CONTAINER (dialog.notebook), vbox1);
1775         gtk_container_set_border_width (GTK_CONTAINER (vbox1), VBOX_BORDER);
1776
1777         vbox2 = gtk_vbox_new (FALSE, 0);
1778         gtk_widget_show (vbox2);
1779         gtk_box_pack_start (GTK_BOX (vbox1), vbox2, FALSE, FALSE, 0);
1780
1781         PACK_CHECK_BUTTON
1782                 (vbox2, chkbtn_mbalnum,
1783                  _("Display multi-byte alphanumeric as\n"
1784                    "ASCII character (Japanese only)"));
1785         gtk_label_set_justify (GTK_LABEL (GTK_BIN(chkbtn_mbalnum)->child),
1786                                GTK_JUSTIFY_LEFT);
1787
1788         PACK_CHECK_BUTTON(vbox2, chkbtn_disphdrpane,
1789                           _("Display header pane above message view"));
1790
1791         hbox1 = gtk_hbox_new (FALSE, 8);
1792         gtk_widget_show (hbox1);
1793         gtk_box_pack_start (GTK_BOX (vbox2), hbox1, FALSE, TRUE, 0);
1794
1795         PACK_CHECK_BUTTON(hbox1, chkbtn_disphdr,
1796                           _("Display short headers on message view"));
1797
1798         button_edit_disphdr = gtk_button_new_with_label (_(" Edit... "));
1799         gtk_widget_show (button_edit_disphdr);
1800         gtk_box_pack_end (GTK_BOX (hbox1), button_edit_disphdr,
1801                           FALSE, TRUE, 0);
1802         gtk_signal_connect (GTK_OBJECT (button_edit_disphdr), "clicked",
1803                             GTK_SIGNAL_FUNC (prefs_display_header_open),
1804                             NULL);
1805
1806         SET_TOGGLE_SENSITIVITY(chkbtn_disphdr, button_edit_disphdr);
1807
1808         PACK_VSPACER(vbox2, vbox3, VSPACING_NARROW_2);
1809
1810         hbox1 = gtk_hbox_new (FALSE, 32);
1811         gtk_widget_show (hbox1);
1812         gtk_box_pack_start (GTK_BOX (vbox2), hbox1, FALSE, TRUE, 0);
1813
1814         hbox_linespc = gtk_hbox_new (FALSE, 8);
1815         gtk_widget_show (hbox1);
1816         gtk_box_pack_start (GTK_BOX (hbox1), hbox_linespc, FALSE, TRUE, 0);
1817
1818         label_linespc = gtk_label_new (_("Line space"));
1819         gtk_widget_show (label_linespc);
1820         gtk_box_pack_start (GTK_BOX (hbox_linespc), label_linespc,
1821                             FALSE, FALSE, 0);
1822
1823         spinbtn_linespc_adj = gtk_adjustment_new (2, 0, 16, 1, 1, 16);
1824         spinbtn_linespc = gtk_spin_button_new
1825                 (GTK_ADJUSTMENT (spinbtn_linespc_adj), 1, 0);
1826         gtk_widget_show (spinbtn_linespc);
1827         gtk_box_pack_start (GTK_BOX (hbox_linespc), spinbtn_linespc,
1828                             FALSE, FALSE, 0);
1829         gtk_widget_set_usize (spinbtn_linespc, 64, -1);
1830         gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (spinbtn_linespc), TRUE);
1831
1832         label_linespc = gtk_label_new (_("pixel(s)"));
1833         gtk_widget_show (label_linespc);
1834         gtk_box_pack_start (GTK_BOX (hbox_linespc), label_linespc,
1835                             FALSE, FALSE, 0);
1836
1837         PACK_CHECK_BUTTON(hbox1, chkbtn_headspc, _("Indent text"));
1838
1839         PACK_FRAME(vbox1, frame_scr, _("Scroll"));
1840
1841         vbox_scr = gtk_vbox_new (FALSE, 0);
1842         gtk_widget_show (vbox_scr);
1843         gtk_container_add (GTK_CONTAINER (frame_scr), vbox_scr);
1844         gtk_container_set_border_width (GTK_CONTAINER (vbox_scr), 8);
1845
1846         PACK_CHECK_BUTTON(vbox_scr, chkbtn_halfpage, _("Half page"));
1847
1848         hbox1 = gtk_hbox_new (FALSE, 32);
1849         gtk_widget_show (hbox1);
1850         gtk_box_pack_start (GTK_BOX (vbox_scr), hbox1, FALSE, TRUE, 0);
1851
1852         PACK_CHECK_BUTTON(hbox1, chkbtn_smoothscroll, _("Smooth scroll"));
1853
1854         hbox_scr = gtk_hbox_new (FALSE, 8);
1855         gtk_widget_show (hbox_scr);
1856         gtk_box_pack_start (GTK_BOX (hbox1), hbox_scr, FALSE, FALSE, 0);
1857
1858         label_scr = gtk_label_new (_("Step"));
1859         gtk_widget_show (label_scr);
1860         gtk_box_pack_start (GTK_BOX (hbox_scr), label_scr, FALSE, FALSE, 0);
1861
1862         spinbtn_scrollstep_adj = gtk_adjustment_new (1, 1, 100, 1, 10, 10);
1863         spinbtn_scrollstep = gtk_spin_button_new
1864                 (GTK_ADJUSTMENT (spinbtn_scrollstep_adj), 1, 0);
1865         gtk_widget_show (spinbtn_scrollstep);
1866         gtk_box_pack_start (GTK_BOX (hbox_scr), spinbtn_scrollstep,
1867                             FALSE, FALSE, 0);
1868         gtk_widget_set_usize (spinbtn_scrollstep, 64, -1);
1869         gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (spinbtn_scrollstep),
1870                                      TRUE);
1871
1872         label_scr = gtk_label_new (_("pixel(s)"));
1873         gtk_widget_show (label_scr);
1874         gtk_box_pack_start (GTK_BOX (hbox_scr), label_scr, FALSE, FALSE, 0);
1875
1876         SET_TOGGLE_SENSITIVITY (chkbtn_smoothscroll, hbox_scr)
1877
1878         vbox3 = gtk_vbox_new (FALSE, 0);
1879         gtk_widget_show (vbox3);
1880         gtk_box_pack_start (GTK_BOX (vbox1), vbox3, FALSE, FALSE, 0);
1881
1882         PACK_CHECK_BUTTON(vbox3, chkbtn_attach_desc,
1883                           _("Show attachment descriptions (rather than names)"));
1884
1885         message.chkbtn_mbalnum     = chkbtn_mbalnum;
1886         message.chkbtn_disphdrpane = chkbtn_disphdrpane;
1887         message.chkbtn_disphdr     = chkbtn_disphdr;
1888         message.spinbtn_linespc    = spinbtn_linespc;
1889         message.chkbtn_headspc     = chkbtn_headspc;
1890
1891         message.chkbtn_smoothscroll    = chkbtn_smoothscroll;
1892         message.spinbtn_scrollstep     = spinbtn_scrollstep;
1893         message.spinbtn_scrollstep_adj = spinbtn_scrollstep_adj;
1894         message.chkbtn_halfpage        = chkbtn_halfpage;
1895
1896         message.chkbtn_attach_desc  = chkbtn_attach_desc;
1897 }
1898
1899 #if USE_GPGME
1900 static void prefs_privacy_create(void)
1901 {
1902         GtkWidget *vbox1;
1903         GtkWidget *vbox2;
1904         GtkWidget *vbox3;
1905         GtkWidget *hbox1;
1906         GtkWidget *hbox_spc;
1907         GtkWidget *label;
1908         GtkWidget *checkbtn_auto_check_signatures;
1909         GtkWidget *checkbtn_store_passphrase;
1910         GtkObject *spinbtn_store_passphrase_adj;
1911         GtkWidget *spinbtn_store_passphrase;
1912         GtkTooltips *store_tooltip;
1913         GtkWidget *checkbtn_passphrase_grab;
1914         GtkWidget *checkbtn_gpg_warning;
1915
1916         vbox1 = gtk_vbox_new (FALSE, VSPACING);
1917         gtk_widget_show (vbox1);
1918         gtk_container_add (GTK_CONTAINER (dialog.notebook), vbox1);
1919         gtk_container_set_border_width (GTK_CONTAINER (vbox1), VBOX_BORDER);
1920
1921         vbox2 = gtk_vbox_new (FALSE, 0);
1922         gtk_widget_show (vbox2);
1923         gtk_box_pack_start (GTK_BOX (vbox1), vbox2, FALSE, FALSE, 0);
1924
1925         PACK_CHECK_BUTTON (vbox2, checkbtn_auto_check_signatures,
1926                            _("Automatically check signatures"));
1927
1928         PACK_CHECK_BUTTON (vbox2, checkbtn_store_passphrase,
1929                            _("Store passphrase in memory temporarily"));
1930
1931         vbox3 = gtk_vbox_new (FALSE, 0);
1932         gtk_widget_show (vbox3);
1933         gtk_box_pack_start (GTK_BOX (vbox2), vbox3, FALSE, FALSE, 0);
1934
1935         hbox1 = gtk_hbox_new (FALSE, 8);
1936         gtk_widget_show (hbox1);
1937         gtk_box_pack_start (GTK_BOX (vbox3), hbox1, FALSE, FALSE, 0);
1938
1939         hbox_spc = gtk_hbox_new (FALSE, 0);
1940         gtk_widget_show (hbox_spc);
1941         gtk_box_pack_start (GTK_BOX (hbox1), hbox_spc, FALSE, FALSE, 0);
1942         gtk_widget_set_usize (hbox_spc, 12, -1);
1943
1944         label = gtk_label_new (_("Expire after"));
1945         gtk_widget_show (label);
1946         gtk_box_pack_start (GTK_BOX (hbox1), label, FALSE, FALSE, 0);
1947
1948         store_tooltip = gtk_tooltips_new();
1949
1950         spinbtn_store_passphrase_adj = gtk_adjustment_new (0, 0, 1440, 1, 5, 5);
1951         spinbtn_store_passphrase = gtk_spin_button_new
1952                 (GTK_ADJUSTMENT (spinbtn_store_passphrase_adj), 1, 0);
1953         gtk_widget_show (spinbtn_store_passphrase);
1954         gtk_tooltips_set_tip(GTK_TOOLTIPS(store_tooltip), spinbtn_store_passphrase,
1955                              _("Setting to '0' will store the passphrase"
1956                                " for the whole session"),
1957                              NULL);
1958         gtk_box_pack_start (GTK_BOX (hbox1), spinbtn_store_passphrase, FALSE, FALSE, 0);
1959         gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (spinbtn_store_passphrase),
1960                                      TRUE);
1961         gtk_widget_set_usize (spinbtn_store_passphrase, 64, -1);
1962
1963         label = gtk_label_new (_("minute(s) "));
1964         gtk_widget_show (label);
1965         gtk_box_pack_start (GTK_BOX (hbox1), label, FALSE, FALSE, 0);
1966
1967         hbox1 = gtk_hbox_new (FALSE, 8);
1968         gtk_widget_show (hbox1);
1969         gtk_box_pack_start (GTK_BOX (vbox3), hbox1, FALSE, FALSE, 0);
1970
1971         hbox_spc = gtk_hbox_new (FALSE, 0);
1972         gtk_widget_show (hbox_spc);
1973         gtk_box_pack_start (GTK_BOX (hbox1), hbox_spc, FALSE, FALSE, 0);
1974         gtk_widget_set_usize (hbox_spc, 12, -1);
1975
1976         SET_TOGGLE_SENSITIVITY (checkbtn_store_passphrase, vbox3);
1977
1978 #ifndef __MINGW32__
1979         PACK_CHECK_BUTTON (vbox2, checkbtn_passphrase_grab,
1980                            _("Grab input while entering a passphrase"));
1981 #endif
1982
1983         PACK_CHECK_BUTTON
1984                 (vbox2, checkbtn_gpg_warning,
1985                  _("Display warning on startup if GnuPG doesn't work"));
1986
1987         hbox1 = gtk_hbox_new (FALSE, 8);
1988         gtk_widget_show (hbox1);
1989         gtk_box_pack_start (GTK_BOX (vbox1), hbox1, FALSE, FALSE, 0);
1990
1991         privacy.checkbtn_auto_check_signatures
1992                                              = checkbtn_auto_check_signatures;
1993         privacy.checkbtn_store_passphrase    = checkbtn_store_passphrase;
1994         privacy.spinbtn_store_passphrase     = spinbtn_store_passphrase;
1995         privacy.spinbtn_store_passphrase_adj = spinbtn_store_passphrase_adj;
1996         privacy.checkbtn_passphrase_grab     = checkbtn_passphrase_grab;
1997         privacy.checkbtn_gpg_warning         = checkbtn_gpg_warning;
1998 }
1999 #endif /* USE_GPGME */
2000
2001 static void prefs_interface_create(void)
2002 {
2003         GtkWidget *vbox1;
2004         GtkWidget *vbox2;
2005         GtkWidget *vbox3;
2006         /* GtkWidget *checkbtn_emacs; */
2007         GtkWidget *checkbtn_always_show_msg;
2008         GtkWidget *checkbtn_openunread;
2009         GtkWidget *checkbtn_mark_as_read_on_newwin;
2010         GtkWidget *checkbtn_openinbox;
2011         GtkWidget *checkbtn_immedexec;
2012         GtkTooltips *immedexec_tooltip;
2013         GtkWidget *hbox1;
2014         GtkWidget *label;
2015         GtkWidget *menu;
2016         GtkWidget *menuitem;
2017
2018         GtkWidget *button_keybind;
2019
2020         GtkWidget *hbox_nextunreadmsgdialog;
2021         GtkWidget *optmenu_nextunreadmsgdialog;
2022
2023         vbox1 = gtk_vbox_new (FALSE, VSPACING);
2024         gtk_widget_show (vbox1);
2025         gtk_container_add (GTK_CONTAINER (dialog.notebook), vbox1);
2026         gtk_container_set_border_width (GTK_CONTAINER (vbox1), VBOX_BORDER);
2027
2028         vbox2 = gtk_vbox_new (FALSE, 0);
2029         gtk_widget_show (vbox2);
2030         gtk_box_pack_start (GTK_BOX (vbox1), vbox2, FALSE, FALSE, 0);
2031
2032         /* PACK_CHECK_BUTTON (vbox2, checkbtn_emacs,
2033                            _("Emulate the behavior of mouse operation of\n"
2034                              "Emacs-based mailer"));
2035         gtk_label_set_justify (GTK_LABEL (GTK_BIN (checkbtn_emacs)->child),
2036                                GTK_JUSTIFY_LEFT);   */
2037
2038         PACK_CHECK_BUTTON
2039                 (vbox2, checkbtn_always_show_msg,
2040                  _("Always open messages in summary when selected"));
2041
2042         PACK_CHECK_BUTTON
2043                 (vbox2, checkbtn_openunread,
2044                  _("Open first unread message when entering a folder"));
2045
2046         PACK_CHECK_BUTTON
2047                 (vbox2, checkbtn_mark_as_read_on_newwin,
2048                  _("Only mark message as read when opened in new window"));
2049
2050         PACK_CHECK_BUTTON
2051                 (vbox2, checkbtn_openinbox,
2052                  _("Go to inbox after receiving new mail"));
2053
2054         vbox3 = gtk_vbox_new (FALSE, 0);
2055         gtk_widget_show (vbox3);
2056         gtk_box_pack_start (GTK_BOX (vbox2), vbox3, FALSE, FALSE, 0);
2057
2058         immedexec_tooltip = gtk_tooltips_new();
2059
2060         PACK_CHECK_BUTTON
2061                 (vbox3, checkbtn_immedexec,
2062                  _("Execute immediately when moving or deleting messages"));
2063         gtk_tooltips_set_tip(GTK_TOOLTIPS(immedexec_tooltip), checkbtn_immedexec,
2064                              _("Messages will be marked until execution"
2065                                " if this is turned off"),
2066                              NULL);
2067
2068         hbox1 = gtk_hbox_new (FALSE, 0);
2069         gtk_widget_show (hbox1);
2070         gtk_box_pack_start (GTK_BOX (vbox3), hbox1, FALSE, FALSE, 0);
2071
2072         /* Next Unread Message Dialog */
2073         hbox_nextunreadmsgdialog = gtk_hbox_new (FALSE, 8);
2074         gtk_widget_show (hbox1);
2075         gtk_box_pack_start (GTK_BOX (vbox1), hbox_nextunreadmsgdialog, FALSE, FALSE, 0);
2076
2077         label = gtk_label_new (_("Show no-unread-message dialog"));
2078         gtk_widget_show (label);
2079         gtk_box_pack_start (GTK_BOX (hbox_nextunreadmsgdialog), label, FALSE, FALSE, 8);
2080
2081         optmenu_nextunreadmsgdialog = gtk_option_menu_new ();
2082         gtk_widget_show (optmenu_nextunreadmsgdialog);
2083         gtk_box_pack_start (GTK_BOX (hbox_nextunreadmsgdialog), optmenu_nextunreadmsgdialog, FALSE, FALSE, 8);
2084         
2085         menu = gtk_menu_new ();
2086         MENUITEM_ADD (menu, menuitem, _("Always"), NEXTUNREADMSGDIALOG_ALWAYS);
2087         MENUITEM_ADD (menu, menuitem, _("Assume 'Yes'"), 
2088                       NEXTUNREADMSGDIALOG_ASSUME_YES);
2089         MENUITEM_ADD (menu, menuitem, _("Assume 'No'"), 
2090                       NEXTUNREADMSGDIALOG_ASSUME_NO);
2091
2092         gtk_option_menu_set_menu (GTK_OPTION_MENU (optmenu_nextunreadmsgdialog), menu);
2093
2094         hbox1 = gtk_hbox_new (FALSE, 8);
2095         gtk_widget_show (hbox1);
2096         gtk_box_pack_start (GTK_BOX (vbox1), hbox1, FALSE, FALSE, 0);
2097
2098         button_keybind = gtk_button_new_with_label (_(" Set key bindings... "));
2099         gtk_widget_show (button_keybind);
2100         gtk_box_pack_start (GTK_BOX (hbox1), button_keybind, FALSE, FALSE, 0);
2101         gtk_signal_connect (GTK_OBJECT (button_keybind), "clicked",
2102                             GTK_SIGNAL_FUNC (prefs_keybind_select), NULL);
2103
2104         /* interface.checkbtn_emacs          = checkbtn_emacs; */
2105         interface.checkbtn_always_show_msg    = checkbtn_always_show_msg;
2106         interface.checkbtn_openunread         = checkbtn_openunread;
2107         interface.checkbtn_mark_as_read_on_newwin
2108                                               = checkbtn_mark_as_read_on_newwin;
2109         interface.checkbtn_openinbox          = checkbtn_openinbox;
2110         interface.checkbtn_immedexec          = checkbtn_immedexec;
2111         interface.optmenu_nextunreadmsgdialog = optmenu_nextunreadmsgdialog;
2112 }
2113
2114 static void prefs_other_create(void)
2115 {
2116         GtkWidget *vbox1;
2117         GtkWidget *hbox1;
2118
2119         GtkWidget *frame_addr;
2120         GtkWidget *vbox_addr;
2121         GtkWidget *checkbtn_addaddrbyclick;
2122         
2123         GtkWidget *frame_cliplog;
2124         GtkWidget *vbox_cliplog;
2125         GtkWidget *hbox_cliplog;
2126         GtkWidget *checkbtn_cliplog;
2127         GtkWidget *loglength_label;
2128         GtkWidget *loglength_entry;
2129         GtkTooltips *loglength_tooltip;
2130
2131         GtkWidget *frame_exit;
2132         GtkWidget *vbox_exit;
2133         GtkWidget *checkbtn_confonexit;
2134         GtkWidget *checkbtn_cleanonexit;
2135         GtkWidget *checkbtn_askonclean;
2136         GtkWidget *checkbtn_warnqueued;
2137
2138         GtkWidget *label_iotimeout;
2139         GtkWidget *spinbtn_iotimeout;
2140         GtkObject *spinbtn_iotimeout_adj;
2141
2142 #if 0
2143 #ifdef USE_OPENSSL
2144         GtkWidget *frame_ssl;
2145         GtkWidget *vbox_ssl;
2146         GtkWidget *hbox_ssl;
2147         GtkWidget *checkbtn_ssl_ask_unknown_valid;
2148 #endif
2149 #endif
2150         vbox1 = gtk_vbox_new (FALSE, VSPACING);
2151         gtk_widget_show (vbox1);
2152         gtk_container_add (GTK_CONTAINER (dialog.notebook), vbox1);
2153         gtk_container_set_border_width (GTK_CONTAINER (vbox1), VBOX_BORDER);
2154
2155         PACK_FRAME (vbox1, frame_addr, _("Address book"));
2156
2157         vbox_addr = gtk_vbox_new (FALSE, 0);
2158         gtk_widget_show (vbox_addr);
2159         gtk_container_add (GTK_CONTAINER (frame_addr), vbox_addr);
2160         gtk_container_set_border_width (GTK_CONTAINER (vbox_addr), 8);
2161
2162         PACK_CHECK_BUTTON
2163                 (vbox_addr, checkbtn_addaddrbyclick,
2164                  _("Add address to destination when double-clicked"));
2165
2166         /* Clip Log */
2167         PACK_FRAME (vbox1, frame_cliplog, _("Log Size"));
2168
2169         vbox_cliplog = gtk_vbox_new (FALSE, 0);
2170         gtk_widget_show (vbox_cliplog);
2171         gtk_container_add (GTK_CONTAINER (frame_cliplog), vbox_cliplog);
2172         gtk_container_set_border_width (GTK_CONTAINER (vbox_cliplog), 8);
2173         PACK_CHECK_BUTTON (vbox_cliplog, checkbtn_cliplog,
2174                            _("Clip the log size"));
2175         hbox_cliplog = gtk_hbox_new (FALSE, 3);
2176         gtk_container_add (GTK_CONTAINER (vbox_cliplog), hbox_cliplog);
2177         gtk_widget_show (hbox_cliplog);
2178         
2179         loglength_label = gtk_label_new (_("Log window length"));
2180         gtk_box_pack_start (GTK_BOX (hbox_cliplog), loglength_label,
2181                             FALSE, TRUE, 0);
2182         gtk_widget_show (GTK_WIDGET (loglength_label));
2183         
2184         loglength_tooltip = gtk_tooltips_new();
2185         
2186         loglength_entry = gtk_entry_new ();
2187         gtk_widget_set_usize (GTK_WIDGET (loglength_entry), 64, -1);
2188         gtk_box_pack_start (GTK_BOX (hbox_cliplog), loglength_entry,
2189                             FALSE, TRUE, 0);
2190         gtk_widget_show (GTK_WIDGET (loglength_entry));
2191         gtk_tooltips_set_tip(GTK_TOOLTIPS(loglength_tooltip), loglength_entry,
2192                              _("0 to stop logging in the log window"),
2193                              NULL);
2194         gtk_box_pack_start (GTK_BOX (hbox_cliplog), loglength_label,
2195                             FALSE, TRUE, 0);
2196         SET_TOGGLE_SENSITIVITY(checkbtn_cliplog, loglength_entry);
2197
2198 #if 0
2199 #ifdef USE_OPENSSL
2200         /* SSL */
2201         PACK_FRAME (vbox1, frame_ssl, _("Security"));
2202
2203         vbox_ssl = gtk_vbox_new (FALSE, 0);
2204         gtk_widget_show (vbox_ssl);
2205         gtk_container_add (GTK_CONTAINER (frame_ssl), vbox_ssl);
2206         gtk_container_set_border_width (GTK_CONTAINER (vbox_ssl), 8);
2207         PACK_CHECK_BUTTON (vbox_ssl, checkbtn_ssl_ask_unknown_valid, 
2208                            _("Ask before accepting SSL certificates"));
2209         hbox_ssl = gtk_hbox_new (FALSE, 3);
2210         gtk_container_add (GTK_CONTAINER (vbox_ssl), hbox_ssl);
2211         gtk_widget_show (hbox_ssl);
2212 #endif
2213 #endif
2214         
2215         /* On Exit */
2216         PACK_FRAME (vbox1, frame_exit, _("On exit"));
2217
2218         vbox_exit = gtk_vbox_new (FALSE, 0);
2219         gtk_widget_show (vbox_exit);
2220         gtk_container_add (GTK_CONTAINER (frame_exit), vbox_exit);
2221         gtk_container_set_border_width (GTK_CONTAINER (vbox_exit), 8);
2222
2223         PACK_CHECK_BUTTON (vbox_exit, checkbtn_confonexit,
2224                            _("Confirm on exit"));
2225
2226         hbox1 = gtk_hbox_new (FALSE, 32);
2227         gtk_widget_show (hbox1);
2228         gtk_box_pack_start (GTK_BOX (vbox_exit), hbox1, FALSE, FALSE, 0);
2229
2230         PACK_CHECK_BUTTON (hbox1, checkbtn_cleanonexit,
2231                            _("Empty trash on exit"));
2232         PACK_CHECK_BUTTON (hbox1, checkbtn_askonclean,
2233                            _("Ask before emptying"));
2234         SET_TOGGLE_SENSITIVITY (checkbtn_cleanonexit, checkbtn_askonclean);
2235
2236         PACK_CHECK_BUTTON (vbox_exit, checkbtn_warnqueued,
2237                            _("Warn if there are queued messages"));
2238
2239         hbox1 = gtk_hbox_new (FALSE, 8);
2240         gtk_widget_show (hbox1);
2241         gtk_box_pack_start (GTK_BOX (vbox1), hbox1, FALSE, FALSE, 0);
2242
2243         label_iotimeout = gtk_label_new (_("Socket I/O timeout:"));
2244         gtk_widget_show (label_iotimeout);
2245         gtk_box_pack_start (GTK_BOX (hbox1), label_iotimeout, FALSE, FALSE, 0);
2246
2247         spinbtn_iotimeout_adj = gtk_adjustment_new (60, 0, 1000, 1, 10, 10);
2248         spinbtn_iotimeout = gtk_spin_button_new
2249                 (GTK_ADJUSTMENT (spinbtn_iotimeout_adj), 1, 0);
2250         gtk_widget_show (spinbtn_iotimeout);
2251         gtk_box_pack_start (GTK_BOX (hbox1), spinbtn_iotimeout,
2252                             FALSE, FALSE, 0);
2253         gtk_widget_set_usize (spinbtn_iotimeout, 64, -1);
2254         gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (spinbtn_iotimeout), TRUE);
2255
2256         label_iotimeout = gtk_label_new (_("seconds"));
2257         gtk_widget_show (label_iotimeout);
2258         gtk_box_pack_start (GTK_BOX (hbox1), label_iotimeout, FALSE, FALSE, 0);
2259
2260         other.checkbtn_addaddrbyclick = checkbtn_addaddrbyclick;
2261         
2262         other.checkbtn_cliplog     = checkbtn_cliplog;
2263         other.loglength_entry      = loglength_entry;
2264
2265         other.checkbtn_confonexit  = checkbtn_confonexit;
2266         other.checkbtn_cleanonexit = checkbtn_cleanonexit;
2267         other.checkbtn_askonclean  = checkbtn_askonclean;
2268         other.checkbtn_warnqueued  = checkbtn_warnqueued;
2269
2270         other.spinbtn_iotimeout     = spinbtn_iotimeout;
2271         other.spinbtn_iotimeout_adj = spinbtn_iotimeout_adj;
2272         
2273 #if 0
2274 #ifdef USE_OPENSSL
2275         other.checkbtn_ssl_ask_unknown_valid = checkbtn_ssl_ask_unknown_valid;
2276 #endif
2277 #endif
2278 }
2279
2280 static void date_format_ok_btn_clicked(GtkButton *button, GtkWidget **widget)
2281 {
2282         GtkWidget *datefmt_sample = NULL;
2283         gchar *text;
2284
2285         g_return_if_fail(widget != NULL);
2286         g_return_if_fail(*widget != NULL);
2287         g_return_if_fail(display.entry_datefmt != NULL);
2288
2289         datefmt_sample = GTK_WIDGET(gtk_object_get_data
2290                                     (GTK_OBJECT(*widget), "datefmt_sample"));
2291         g_return_if_fail(datefmt_sample != NULL);
2292
2293         text = gtk_editable_get_chars(GTK_EDITABLE(datefmt_sample), 0, -1);
2294         g_free(prefs_common.date_format);
2295         prefs_common.date_format = text;
2296         gtk_entry_set_text(GTK_ENTRY(display.entry_datefmt), text);
2297
2298         gtk_widget_destroy(*widget);
2299         *widget = NULL;
2300 }
2301
2302 static void date_format_cancel_btn_clicked(GtkButton *button,
2303                                            GtkWidget **widget)
2304 {
2305         g_return_if_fail(widget != NULL);
2306         g_return_if_fail(*widget != NULL);
2307
2308         gtk_widget_destroy(*widget);
2309         *widget = NULL;
2310 }
2311
2312 static void date_format_key_pressed(GtkWidget *keywidget, GdkEventKey *event,
2313                                     GtkWidget **widget)
2314 {
2315         if (event && event->keyval == GDK_Escape)
2316                 date_format_cancel_btn_clicked(NULL, widget);
2317 }
2318
2319 static gboolean date_format_on_delete(GtkWidget *dialogwidget,
2320                                       GdkEventAny *event, GtkWidget **widget)
2321 {
2322         g_return_val_if_fail(widget != NULL, FALSE);
2323         g_return_val_if_fail(*widget != NULL, FALSE);
2324
2325         *widget = NULL;
2326         return FALSE;
2327 }
2328
2329 static void date_format_entry_on_change(GtkEditable *editable,
2330                                         GtkLabel *example)
2331 {
2332         time_t cur_time;
2333         struct tm *cal_time;
2334         gchar buffer[100];
2335         gchar *text;
2336
2337         cur_time = time(NULL);
2338         cal_time = localtime(&cur_time);
2339         buffer[0] = 0;
2340         text = gtk_editable_get_chars(editable, 0, -1);
2341         if (text)
2342                 strftime(buffer, sizeof buffer, text, cal_time); 
2343         g_free(text);
2344         gtk_label_set_text(example, buffer);
2345 }
2346
2347 static void date_format_select_row(GtkWidget *date_format_list, gint row,
2348                                    gint column, GdkEventButton *event,
2349                                    GtkWidget *date_format)
2350 {
2351         gint cur_pos;
2352         gchar *format;
2353         gchar *old_format;
2354         gchar *new_format;
2355         GtkWidget *datefmt_sample;
2356
2357         /* only on double click */
2358         if (!event || event->type != GDK_2BUTTON_PRESS) return;
2359
2360
2361         datefmt_sample = GTK_WIDGET(gtk_object_get_data
2362                                     (GTK_OBJECT(date_format), "datefmt_sample"));
2363
2364         g_return_if_fail(date_format_list != NULL);
2365         g_return_if_fail(date_format != NULL);
2366         g_return_if_fail(datefmt_sample != NULL);
2367
2368         /* get format from clist */
2369         gtk_clist_get_text(GTK_CLIST(date_format_list), row, 0, &format);
2370
2371         cur_pos = gtk_editable_get_position(GTK_EDITABLE(datefmt_sample));
2372         old_format = gtk_entry_get_text(GTK_ENTRY(datefmt_sample));
2373
2374         /* insert the format into the text entry */
2375         new_format = g_malloc(strlen(old_format) + 3);
2376
2377         strncpy(new_format, old_format, cur_pos);
2378         new_format[cur_pos] = '\0';
2379         strcat(new_format, format);
2380         strcat(new_format, &old_format[cur_pos]);
2381
2382         gtk_entry_set_text(GTK_ENTRY(datefmt_sample), new_format);
2383         gtk_editable_set_position(GTK_EDITABLE(datefmt_sample), cur_pos + 2);
2384
2385         g_free(new_format);
2386 }
2387
2388 static GtkWidget *date_format_create(GtkButton *button, void *data)
2389 {
2390         static GtkWidget *datefmt_win = NULL;
2391         GtkWidget *vbox1;
2392         GtkWidget *scrolledwindow1;
2393         GtkWidget *datefmt_clist;
2394         GtkWidget *table;
2395         GtkWidget *label1;
2396         GtkWidget *label2;
2397         GtkWidget *label3;
2398         GtkWidget *confirm_area;
2399         GtkWidget *ok_btn;
2400         GtkWidget *cancel_btn;
2401         GtkWidget *datefmt_entry;
2402
2403         struct {
2404                 gchar *fmt;
2405                 gchar *txt;
2406         } time_format[] = {
2407                 { "%a", NULL },
2408                 { "%A", NULL },
2409                 { "%b", NULL },
2410                 { "%B", NULL },
2411                 { "%c", NULL },
2412                 { "%C", NULL },
2413                 { "%d", NULL },
2414                 { "%H", NULL },
2415                 { "%I", NULL },
2416                 { "%j", NULL },
2417                 { "%m", NULL },
2418                 { "%M", NULL },
2419                 { "%p", NULL },
2420                 { "%S", NULL },
2421                 { "%w", NULL },
2422                 { "%x", NULL },
2423                 { "%y", NULL },
2424                 { "%Y", NULL },
2425                 { "%Z", NULL }
2426         };
2427
2428         gchar *titles[2];
2429         gint i;
2430         const gint TIME_FORMAT_ELEMS =
2431                 sizeof time_format / sizeof time_format[0];
2432
2433         time_format[0].txt  = _("the full abbreviated weekday name");
2434         time_format[1].txt  = _("the full weekday name");
2435         time_format[2].txt  = _("the abbreviated month name");
2436         time_format[3].txt  = _("the full month name");
2437         time_format[4].txt  = _("the preferred date and time for the current locale");
2438         time_format[5].txt  = _("the century number (year/100)");
2439         time_format[6].txt  = _("the day of the month as a decimal number");
2440         time_format[7].txt  = _("the hour as a decimal number using a 24-hour clock");
2441         time_format[8].txt  = _("the hour as a decimal number using a 12-hour clock");
2442         time_format[9].txt  = _("the day of the year as a decimal number");
2443         time_format[10].txt = _("the month as a decimal number");
2444         time_format[11].txt = _("the minute as a decimal number");
2445         time_format[12].txt = _("either AM or PM");
2446         time_format[13].txt = _("the second as a decimal number");
2447         time_format[14].txt = _("the day of the week as a decimal number");
2448         time_format[15].txt = _("the preferred date for the current locale");
2449         time_format[16].txt = _("the last two digits of a year");
2450         time_format[17].txt = _("the year as a decimal number");
2451         time_format[18].txt = _("the time zone or name or abbreviation");
2452
2453         if (datefmt_win) return datefmt_win;
2454
2455         datefmt_win = gtk_window_new(GTK_WINDOW_DIALOG);
2456         gtk_container_set_border_width(GTK_CONTAINER(datefmt_win), 8);
2457         gtk_window_set_title(GTK_WINDOW(datefmt_win), _("Date format"));
2458         gtk_window_set_position(GTK_WINDOW(datefmt_win), GTK_WIN_POS_CENTER);
2459         gtk_widget_set_usize(datefmt_win, 440, 280);
2460
2461         vbox1 = gtk_vbox_new(FALSE, 10);
2462         gtk_widget_show(vbox1);
2463         gtk_container_add(GTK_CONTAINER(datefmt_win), vbox1);
2464
2465         scrolledwindow1 = gtk_scrolled_window_new(NULL, NULL);
2466         gtk_scrolled_window_set_policy
2467                 (GTK_SCROLLED_WINDOW(scrolledwindow1),
2468                  GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
2469         gtk_widget_show(scrolledwindow1);
2470         gtk_box_pack_start(GTK_BOX(vbox1), scrolledwindow1, TRUE, TRUE, 0);
2471
2472         titles[0] = _("Specifier");
2473         titles[1] = _("Description");
2474         datefmt_clist = gtk_clist_new_with_titles(2, titles);
2475         gtk_widget_show(datefmt_clist);
2476         gtk_container_add(GTK_CONTAINER(scrolledwindow1), datefmt_clist);
2477         /* gtk_clist_set_column_width(GTK_CLIST(datefmt_clist), 0, 80); */
2478         gtk_clist_set_selection_mode(GTK_CLIST(datefmt_clist),
2479                                      GTK_SELECTION_BROWSE);
2480
2481         for (i = 0; i < TIME_FORMAT_ELEMS; i++) {
2482                 gchar *text[2];
2483                 /* phoney casting necessary because of gtk... */
2484                 text[0] = (gchar *)time_format[i].fmt;
2485                 text[1] = (gchar *)time_format[i].txt;
2486                 gtk_clist_append(GTK_CLIST(datefmt_clist), text);
2487         }
2488
2489         table = gtk_table_new(2, 2, FALSE);
2490         gtk_widget_show(table);
2491         gtk_box_pack_start(GTK_BOX(vbox1), table, FALSE, FALSE, 0);
2492         gtk_table_set_row_spacings(GTK_TABLE(table), 4);
2493         gtk_table_set_col_spacings(GTK_TABLE(table), 8);
2494
2495         label1 = gtk_label_new(_("Date format"));
2496         gtk_widget_show(label1);
2497         gtk_table_attach(GTK_TABLE(table), label1, 0, 1, 0, 1,
2498                          GTK_FILL, 0, 0, 0);
2499         gtk_label_set_justify(GTK_LABEL(label1), GTK_JUSTIFY_LEFT);
2500         gtk_misc_set_alignment(GTK_MISC(label1), 0, 0.5);
2501
2502         datefmt_entry = gtk_entry_new_with_max_length(256);
2503         gtk_widget_show(datefmt_entry);
2504         gtk_table_attach(GTK_TABLE(table), datefmt_entry, 1, 2, 0, 1,
2505                          (GTK_EXPAND | GTK_FILL), 0, 0, 0);
2506
2507         /* we need the "sample" entry box; add it as data so callbacks can
2508          * get the entry box */
2509         gtk_object_set_data(GTK_OBJECT(datefmt_win), "datefmt_sample",
2510                             datefmt_entry);
2511
2512         label2 = gtk_label_new(_("Example"));
2513         gtk_widget_show(label2);
2514         gtk_table_attach(GTK_TABLE(table), label2, 0, 1, 1, 2,
2515                          GTK_FILL, 0, 0, 0);
2516         gtk_label_set_justify(GTK_LABEL(label2), GTK_JUSTIFY_LEFT);
2517         gtk_misc_set_alignment(GTK_MISC(label2), 0, 0.5);
2518
2519         label3 = gtk_label_new("");
2520         gtk_widget_show(label3);
2521         gtk_table_attach(GTK_TABLE(table), label3, 1, 2, 1, 2,
2522                          (GTK_EXPAND | GTK_FILL), 0, 0, 0);
2523         gtk_label_set_justify(GTK_LABEL(label3), GTK_JUSTIFY_LEFT);
2524         gtk_misc_set_alignment(GTK_MISC(label3), 0, 0.5);
2525
2526         gtkut_button_set_create(&confirm_area, &ok_btn, _("OK"),
2527                                 &cancel_btn, _("Cancel"), NULL, NULL);
2528         gtk_widget_grab_default(ok_btn);
2529         gtk_widget_show(confirm_area);
2530
2531         gtk_box_pack_start(GTK_BOX(vbox1), confirm_area, FALSE, FALSE, 0);
2532
2533         /* set the current format */
2534         gtk_entry_set_text(GTK_ENTRY(datefmt_entry), prefs_common.date_format);
2535         date_format_entry_on_change(GTK_EDITABLE(datefmt_entry),
2536                                     GTK_LABEL(label3));
2537
2538         gtk_signal_connect(GTK_OBJECT(ok_btn), "clicked",
2539                            GTK_SIGNAL_FUNC(date_format_ok_btn_clicked),
2540                            &datefmt_win);
2541         gtk_signal_connect(GTK_OBJECT(cancel_btn), "clicked",
2542                            GTK_SIGNAL_FUNC(date_format_cancel_btn_clicked),
2543                            &datefmt_win);
2544         gtk_signal_connect(GTK_OBJECT(datefmt_win), "key_press_event",
2545                            GTK_SIGNAL_FUNC(date_format_key_pressed),
2546                            &datefmt_win);
2547         gtk_signal_connect(GTK_OBJECT(datefmt_win), "delete_event",
2548                            GTK_SIGNAL_FUNC(date_format_on_delete),
2549                            &datefmt_win);
2550         gtk_signal_connect(GTK_OBJECT(datefmt_entry), "changed",
2551                            GTK_SIGNAL_FUNC(date_format_entry_on_change),
2552                            label3);
2553
2554         gtk_signal_connect(GTK_OBJECT(datefmt_clist), "select_row",
2555                            GTK_SIGNAL_FUNC(date_format_select_row),
2556                            datefmt_win);
2557
2558         gtk_window_set_position(GTK_WINDOW(datefmt_win), GTK_WIN_POS_CENTER);
2559         gtk_window_set_modal(GTK_WINDOW(datefmt_win), TRUE);
2560
2561         gtk_widget_show(datefmt_win);
2562         manage_window_set_transient(GTK_WINDOW(datefmt_win));
2563
2564         gtk_widget_grab_focus(ok_btn);
2565
2566         return datefmt_win;
2567 }
2568
2569 static void prefs_keybind_select(void)
2570 {
2571         GtkWidget *window;
2572         GtkWidget *vbox1;
2573         GtkWidget *hbox1;
2574         GtkWidget *label;
2575         GtkWidget *combo;
2576         GtkWidget *confirm_area;
2577         GtkWidget *ok_btn;
2578         GtkWidget *cancel_btn;
2579
2580         window = gtk_window_new (GTK_WINDOW_DIALOG);
2581         gtk_container_set_border_width (GTK_CONTAINER (window), 8);
2582         gtk_window_set_title (GTK_WINDOW (window), _("Key bindings"));
2583         gtk_window_set_position (GTK_WINDOW (window), GTK_WIN_POS_CENTER);
2584         gtk_window_set_modal (GTK_WINDOW (window), TRUE);
2585         gtk_window_set_policy (GTK_WINDOW (window), FALSE, FALSE, FALSE);
2586         manage_window_set_transient (GTK_WINDOW (window));
2587
2588         vbox1 = gtk_vbox_new (FALSE, VSPACING);
2589         gtk_container_add (GTK_CONTAINER (window), vbox1);
2590         gtk_container_set_border_width (GTK_CONTAINER (vbox1), 2);
2591
2592         hbox1 = gtk_hbox_new (FALSE, 8);
2593         gtk_box_pack_start (GTK_BOX (vbox1), hbox1, FALSE, FALSE, 0);
2594
2595         label = gtk_label_new
2596                 (_("Select preset:"));
2597         gtk_box_pack_start (GTK_BOX (hbox1), label, FALSE, FALSE, 0);
2598         gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT);
2599
2600         hbox1 = gtk_hbox_new (FALSE, 8);
2601         gtk_box_pack_start (GTK_BOX (vbox1), hbox1, FALSE, FALSE, 0);
2602
2603         combo = gtk_combo_new ();
2604         gtk_box_pack_start (GTK_BOX (hbox1), combo, TRUE, TRUE, 0);
2605         gtkut_combo_set_items (GTK_COMBO (combo),
2606                                _("Default"),
2607                                "Mew / Wanderlust",
2608                                "Mutt",
2609                                _("Old Sylpheed"),
2610                                NULL);
2611         gtk_entry_set_editable (GTK_ENTRY (GTK_COMBO (combo)->entry), FALSE);
2612
2613         hbox1 = gtk_hbox_new (FALSE, 8);
2614         gtk_box_pack_start (GTK_BOX (vbox1), hbox1, FALSE, FALSE, 0);
2615
2616         label = gtk_label_new
2617                 (_("You can also modify each menu shortcut by pressing\n"
2618                    "any key(s) when placing the mouse pointer on the item."));
2619         gtk_box_pack_start (GTK_BOX (hbox1), label, FALSE, FALSE, 0);
2620         gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT);
2621
2622         hbox1 = gtk_hbox_new (FALSE, 8);
2623         gtk_box_pack_start (GTK_BOX (vbox1), hbox1, FALSE, FALSE, 0);
2624
2625         gtkut_button_set_create (&confirm_area, &ok_btn, _("OK"),
2626                                  &cancel_btn, _("Cancel"), NULL, NULL);
2627         gtk_box_pack_end (GTK_BOX (hbox1), confirm_area, FALSE, FALSE, 0);
2628         gtk_widget_grab_default (ok_btn);
2629
2630         MANAGE_WINDOW_SIGNALS_CONNECT(window);
2631         gtk_signal_connect (GTK_OBJECT (window), "delete_event",
2632                             GTK_SIGNAL_FUNC (prefs_keybind_deleted), NULL);
2633         gtk_signal_connect (GTK_OBJECT (window), "key_press_event",
2634                             GTK_SIGNAL_FUNC (prefs_keybind_key_pressed), NULL);
2635         gtk_signal_connect (GTK_OBJECT (ok_btn), "clicked",
2636                             GTK_SIGNAL_FUNC (prefs_keybind_apply_clicked),
2637                             NULL);
2638         gtk_signal_connect (GTK_OBJECT (cancel_btn), "clicked",
2639                             GTK_SIGNAL_FUNC (prefs_keybind_cancel),
2640                             NULL);
2641
2642         gtk_widget_show_all(window);
2643
2644         keybind.window = window;
2645         keybind.combo = combo;
2646 }
2647
2648 static void prefs_keybind_key_pressed(GtkWidget *widget, GdkEventKey *event,
2649                                       gpointer data)
2650 {
2651         if (event && event->keyval == GDK_Escape)
2652                 prefs_keybind_cancel();
2653 }
2654
2655 static gint prefs_keybind_deleted(GtkWidget *widget, GdkEventAny *event,
2656                                   gpointer data)
2657 {
2658         prefs_keybind_cancel();
2659         return TRUE;
2660 }
2661
2662 static void prefs_keybind_cancel(void)
2663 {
2664         gtk_widget_destroy(keybind.window);
2665         keybind.window = NULL;
2666         keybind.combo = NULL;
2667 }
2668
2669 static void prefs_keybind_apply_clicked(GtkWidget *widget)
2670 {
2671         GtkEntry *entry = GTK_ENTRY(GTK_COMBO(keybind.combo)->entry);
2672         gchar *text;
2673         gchar *rc_str;
2674
2675         static gchar *default_menurc =
2676                 "(menu-path \"<Main>/File/Empty trash\" \"\")\n"
2677                 "(menu-path \"<Main>/File/Save as...\" \"<control>S\")\n"
2678                 "(menu-path \"<Main>/File/Print...\" \"\")\n"
2679                 "(menu-path \"<Main>/File/Exit\" \"<control>Q\")\n"
2680
2681                 "(menu-path \"<Main>/Edit/Copy\" \"<control>C\")\n"
2682                 "(menu-path \"<Main>/Edit/Select all\" \"<control>A\")\n"
2683                 "(menu-path \"<Main>/Edit/Find in current message...\" \"<control>F\")\n"
2684                 "(menu-path \"<Main>/Edit/Search folder...\" \"<shift><control>F\")\n"
2685
2686                 "(menu-path \"<Main>/View/Expand Summary View\" \"V\")\n"
2687                 "(menu-path \"<Main>/View/Expand Message View\" \"<shift>V\")\n"
2688                 "(menu-path \"<Main>/View/Thread view\" \"<control>T\")\n"
2689                 "(menu-path \"<Main>/View/Go to/Prev message\" \"P\")\n"
2690                 "(menu-path \"<Main>/View/Go to/Next message\" \"N\")\n"
2691                 "(menu-path \"<Main>/View/Go to/Prev unread message\" \"<shift>P\")\n"
2692                 "(menu-path \"<Main>/View/Go to/Next unread message\" \"<shift>N\")\n"
2693                 "(menu-path \"<Main>/View/Go to/Other folder...\" \"G\")\n"
2694                 "(menu-path \"<Main>/View/Open in new window\" \"<control><alt>N\")\n"
2695                 "(menu-path \"<Main>/View/View source\" \"<control>U\")\n"
2696                 "(menu-path \"<Main>/View/Show all headers\" \"<control>H\")\n"
2697                 "(menu-path \"<Main>/View/Update\" \"<control><alt>U\")\n"
2698
2699                 "(menu-path \"<Main>/Message/Receive/Get new mail\" \"<control>I\")\n"
2700                 "(menu-path \"<Main>/Message/Receive/Get from all accounts\" \"<shift><control>I\")\n"
2701                 "(menu-path \"<Main>/Message/Compose an email message\" \"<control>M\")\n"
2702                 "(menu-path \"<Main>/Message/Reply\" \"<control>R\")\n"
2703                 "(menu-path \"<Main>/Message/Reply to/all\" \"<shift><control>R\")\n"
2704                 "(menu-path \"<Main>/Message/Reply to/sender\" \"\")\n"
2705                 "(menu-path \"<Main>/Message/Reply to/mailing list\" \"<control>L\")\n"
2706                 "(menu-path \"<Main>/Message/Forward\" \"<control><alt>F\")\n"
2707                 /* "(menu-path \"<Main>/Message/Forward as attachment\" \"\")\n" */
2708                 "(menu-path \"<Main>/Message/Move...\" \"<control>O\")\n"
2709                 "(menu-path \"<Main>/Message/Copy...\" \"<shift><control>O\")\n"
2710                 "(menu-path \"<Main>/Message/Delete\" \"<control>D\")\n"
2711                 "(menu-path \"<Main>/Message/Mark/Mark\" \"<shift>asterisk\")\n"
2712                 "(menu-path \"<Main>/Message/Mark/Unmark\" \"U\")\n"
2713                 "(menu-path \"<Main>/Message/Mark/Mark as unread\" \"<shift>exclam\")\n"
2714                 "(menu-path \"<Main>/Message/Mark/Mark as read\" \"\")\n"
2715
2716                 "(menu-path \"<Main>/Tools/Address book\" \"<shift><control>A\")\n"
2717                 "(menu-path \"<Main>/Tools/Execute\" \"X\")\n"
2718                 "(menu-path \"<Main>/Tools/Log window\" \"<shift><control>L\")\n"
2719
2720                 "(menu-path \"<Compose>/File/Close\" \"<control>W\")\n"
2721                 "(menu-path \"<Compose>/Edit/Select all\" \"<control>A\")\n"
2722                 "(menu-path \"<Compose>/Edit/Advanced/Move a word backward\" \"\")\n"
2723                 "(menu-path \"<Compose>/Edit/Advanced/Move a word forward\" \"\")\n"
2724                 "(menu-path \"<Compose>/Edit/Advanced/Move to beginning of line\" \"\")\n"
2725                 "(menu-path \"<Compose>/Edit/Advanced/Delete a word backward\" \"\")\n"
2726                 "(menu-path \"<Compose>/Edit/Advanced/Delete a word forward\" \"\")";
2727
2728         static gchar *mew_wl_menurc =
2729                 "(menu-path \"<Main>/File/Empty trash\" \"<shift>D\")\n"
2730                 "(menu-path \"<Main>/File/Save as...\" \"Y\")\n"
2731                 "(menu-path \"<Main>/File/Print...\" \"<shift>numbersign\")\n"
2732                 "(menu-path \"<Main>/File/Exit\" \"<shift>Q\")\n"
2733
2734                 "(menu-path \"<Main>/Edit/Copy\" \"<control>C\")\n"
2735                 "(menu-path \"<Main>/Edit/Select all\" \"<control>A\")\n"
2736                 "(menu-path \"<Main>/Edit/Find in current message...\" \"<control>F\")\n"
2737                 "(menu-path \"<Main>/Edit/Search folder...\" \"<control>S\")\n"
2738
2739                 "(menu-path \"<Main>/View/Expand Summary View\" \"\")\n"
2740                 "(menu-path \"<Main>/View/Expand Message View\" \"\")\n"
2741                 "(menu-path \"<Main>/View/Thread view\" \"<shift>T\")\n"
2742                 "(menu-path \"<Main>/View/Go to/Prev message\" \"P\")\n"
2743                 "(menu-path \"<Main>/View/Go to/Next message\" \"N\")\n"
2744                 "(menu-path \"<Main>/View/Go to/Prev unread message\" \"<shift>P\")\n"
2745                 "(menu-path \"<Main>/View/Go to/Next unread message\" \"<shift>N\")\n"
2746                 "(menu-path \"<Main>/View/Go to/Other folder...\" \"G\")\n"
2747                 "(menu-path \"<Main>/View/Open in new window\" \"<control><alt>N\")\n"
2748                 "(menu-path \"<Main>/View/View source\" \"<control>U\")\n"
2749                 "(menu-path \"<Main>/View/Show all headers\" \"<shift>H\")\n"
2750                 "(menu-path \"<Main>/View/Update\" \"<shift>S\")\n"
2751
2752                 "(menu-path \"<Main>/Message/Receive/Get new mail\" \"<control>I\")\n"
2753                 "(menu-path \"<Main>/Message/Receive/Get from all accounts\" \"<shift><control>I\")\n"
2754                 "(menu-path \"<Main>/Message/Compose an email message\" \"W\")\n"
2755                 "(menu-path \"<Main>/Message/Reply\" \"<control>R\")\n"
2756                 "(menu-path \"<Main>/Message/Reply to/all\" \"<shift>A\")\n"
2757                 "(menu-path \"<Main>/Message/Reply to/sender\" \"\")\n"
2758                 "(menu-path \"<Main>/Message/Reply to/mailing list\" \"<control>L\")\n"
2759                 "(menu-path \"<Main>/Message/Forward\" \"F\")\n"
2760                 /* "(menu-path \"<Main>/Message/Forward as attachment\" \"<shift>F\")\n" */
2761                 "(menu-path \"<Main>/Message/Move...\" \"O\")\n"
2762                 "(menu-path \"<Main>/Message/Copy...\" \"<shift>O\")\n"
2763                 "(menu-path \"<Main>/Message/Delete\" \"D\")\n"
2764                 "(menu-path \"<Main>/Message/Mark/Mark\" \"<shift>asterisk\")\n"
2765                 "(menu-path \"<Main>/Message/Mark/Unmark\" \"U\")\n"
2766                 "(menu-path \"<Main>/Message/Mark/Mark as unread\" \"<shift>exclam\")\n"
2767                 "(menu-path \"<Main>/Message/Mark/Mark as read\" \"<shift>R\")\n"
2768
2769                 "(menu-path \"<Main>/Tools/Address book\" \"<shift><control>A\")\n"
2770                 "(menu-path \"<Main>/Tools/Execute\" \"X\")\n"
2771                 "(menu-path \"<Main>/Tools/Log window\" \"<shift><control>L\")\n"
2772
2773                 "(menu-path \"<Compose>/File/Close\" \"<alt>W\")\n"
2774                 "(menu-path \"<Compose>/Edit/Select all\" \"\")\n"
2775                 "(menu-path \"<Compose>/Edit/Advanced/Move a word backward\" \"<alt>B\")\n"
2776                 "(menu-path \"<Compose>/Edit/Advanced/Move a word forward\" \"<alt>F\")\n"
2777                 "(menu-path \"<Compose>/Edit/Advanced/Move to beginning of line\" \"<control>A\")\n"
2778                 "(menu-path \"<Compose>/Edit/Advanced/Delete a word backward\" \"<control>W\")\n"
2779                 "(menu-path \"<Compose>/Edit/Advanced/Delete a word forward\" \"<alt>D\")";
2780
2781         static gchar *mutt_menurc =
2782                 "(menu-path \"<Main>/File/Empty trash\" \"\")\n"
2783                 "(menu-path \"<Main>/File/Save as...\" \"S\")\n"
2784                 "(menu-path \"<Main>/File/Print...\" \"P\")\n"
2785                 "(menu-path \"<Main>/File/Exit\" \"Q\")\n"
2786
2787                 "(menu-path \"<Main>/Edit/Copy\" \"<control>C\")\n"
2788                 "(menu-path \"<Main>/Edit/Select all\" \"<control>A\")\n"
2789                 "(menu-path \"<Main>/Edit/Find in current message...\" \"<control>F\")\n"
2790                 "(menu-path \"<Main>/Edit/Search messages...\" \"slash\")\n"
2791
2792                 "(menu-path \"<Main>/View/Toggle summary view\" \"V\")\n"
2793                 "(menu-path \"<Main>/View/Thread view\" \"<control>T\")\n"
2794                 "(menu-path \"<Main>/View/Go to/Prev message\" \"\")\n"
2795                 "(menu-path \"<Main>/View/Go to/Next message\" \"\")\n"
2796                 "(menu-path \"<Main>/View/Go to/Prev unread message\" \"\")\n"
2797                 "(menu-path \"<Main>/View/Go to/Next unread message\" \"\")\n"
2798                 "(menu-path \"<Main>/View/Go to/Other folder...\" \"C\")\n"
2799                 "(menu-path \"<Main>/View/Open in new window\" \"<control><alt>N\")\n"
2800                 "(menu-path \"<Main>/View/View source\" \"<control>U\")\n"
2801                 "(menu-path \"<Main>/View/Show all headers\" \"<control>H\")\n"
2802                 "(menu-path \"<Main>/View/Update\" \"<control><alt>U\")\n"
2803
2804                 "(menu-path \"<Main>/Message/Receive/Get new mail\" \"<control>I\")\n"
2805                 "(menu-path \"<Main>/Message/Receive/Get from all accounts\" \"<shift><control>I\")\n"
2806                 "(menu-path \"<Main>/Message/Compose an email message\" \"M\")\n"
2807                 "(menu-path \"<Main>/Message/Reply\" \"R\")\n"
2808                 "(menu-path \"<Main>/Message/Reply to/all\" \"G\")\n"
2809                 "(menu-path \"<Main>/Message/Reply to/sender\" \"\")\n"
2810                 "(menu-path \"<Main>/Message/Reply to/mailing list\" \"<control>L\")\n"
2811                 "(menu-path \"<Main>/Message/Forward\" \"F\")\n"
2812                 "(menu-path \"<Main>/Message/Forward as attachment\" \"\")\n"
2813                 "(menu-path \"<Main>/Message/Move...\" \"<control>O\")\n"
2814                 "(menu-path \"<Main>/Message/Copy...\" \"<shift>C\")\n"
2815                 "(menu-path \"<Main>/Message/Delete\" \"D\")\n"
2816                 "(menu-path \"<Main>/Message/Mark/Mark\" \"<shift>F\")\n"
2817                 "(menu-path \"<Main>/Message/Mark/Unmark\" \"U\")\n"
2818                 "(menu-path \"<Main>/Message/Mark/Mark as unread\" \"<shift>N\")\n"
2819                 "(menu-path \"<Main>/Message/Mark/Mark as read\" \"\")\n"
2820
2821                 "(menu-path \"<Main>/Tools/Address book\" \"<shift><control>A\")\n"
2822                 "(menu-path \"<Main>/Tools/Execute\" \"X\")\n"
2823                 "(menu-path \"<Main>/Tools/Log window\" \"<shift><control>L\")\n"
2824
2825                 "(menu-path \"<Compose>/File/Close\" \"<alt>W\")\n"
2826                 "(menu-path \"<Compose>/Edit/Select all\" \"\")\n"
2827                 "(menu-path \"<Compose>/Edit/Advanced/Move a word backward\" \"<alt>B\")\n"
2828                 "(menu-path \"<Compose>/Edit/Advanced/Move a word forward\" \"<alt>F\")\n"
2829                 "(menu-path \"<Compose>/Edit/Advanced/Move to beginning of line\" \"<control>A\")\n"
2830                 "(menu-path \"<Compose>/Edit/Advanced/Delete a word backward\" \"<control>W\")\n"
2831                 "(menu-path \"<Compose>/Edit/Advanced/Delete a word forward\" \"<alt>D\")";
2832
2833         static gchar *old_sylpheed_menurc =
2834                 "(menu-path \"<Main>/File/Empty trash\" \"\")\n"
2835                 "(menu-path \"<Main>/File/Save as...\" \"\")\n"
2836                 "(menu-path \"<Main>/File/Print...\" \"<alt>P\")\n"
2837                 "(menu-path \"<Main>/File/Exit\" \"<alt>Q\")\n"
2838
2839                 "(menu-path \"<Main>/Edit/Copy\" \"<control>C\")\n"
2840                 "(menu-path \"<Main>/Edit/Select all\" \"<control>A\")\n"
2841                 "(menu-path \"<Main>/Edit/Find in current message...\" \"<control>F\")\n"
2842                 "(menu-path \"<Main>/Edit/Search folder...\" \"<control>S\")\n"
2843
2844                 "(menu-path \"<Main>/View/Expand Summary View\" \"\")\n"
2845                 "(menu-path \"<Main>/View/Expand Message View\" \"\")\n"
2846                 "(menu-path \"<Main>/View/Thread view\" \"<control>T\")\n"
2847                 "(menu-path \"<Main>/View/Go to/Prev message\" \"P\")\n"
2848                 "(menu-path \"<Main>/View/Go to/Next message\" \"N\")\n"
2849                 "(menu-path \"<Main>/View/Go to/Prev unread message\" \"<shift>P\")\n"
2850                 "(menu-path \"<Main>/View/Go to/Next unread message\" \"<shift>N\")\n"
2851                 "(menu-path \"<Main>/View/Go to/Other folder...\" \"<alt>G\")\n"
2852                 "(menu-path \"<Main>/View/Open in new window\" \"<shift><control>N\")\n"
2853                 "(menu-path \"<Main>/View/View source\" \"<control>U\")\n"
2854                 "(menu-path \"<Main>/View/Show all headers\" \"<control>H\")\n"
2855                 "(menu-path \"<Main>/View/Update\" \"<alt>U\")\n"
2856
2857                 "(menu-path \"<Main>/Message/Receive/Get new mail\" \"<alt>I\")\n"
2858                 "(menu-path \"<Main>/Message/Receive/Get from all accounts\" \"<shift><alt>I\")\n"
2859                 "(menu-path \"<Main>/Message/Compose an email message\" \"<alt>N\")\n"
2860                 "(menu-path \"<Main>/Message/Reply\" \"<alt>R\")\n"
2861                 "(menu-path \"<Main>/Message/Reply to/all\" \"<shift><alt>R\")\n"
2862                 "(menu-path \"<Main>/Message/Reply to/sender\" \"<control><alt>R\")\n"
2863                 "(menu-path \"<Main>/Message/Reply to/mailing list\" \"<control>L\")\n"
2864                 "(menu-path \"<Main>/Message/Forward\" \"<shift><alt>F\")\n"
2865                 /* "(menu-path \"<Main>/Message/Forward as attachment\" \"<shift><control>F\")\n" */
2866                 "(menu-path \"<Main>/Message/Move...\" \"<alt>O\")\n"
2867                 "(menu-path \"<Main>/Message/Copy...\" \"\")\n"
2868                 "(menu-path \"<Main>/Message/Delete\" \"<alt>D\")\n"
2869                 "(menu-path \"<Main>/Message/Mark/Mark\" \"<shift>asterisk\")\n"
2870                 "(menu-path \"<Main>/Message/Mark/Unmark\" \"U\")\n"
2871                 "(menu-path \"<Main>/Message/Mark/Mark as unread\" \"<shift>exclam\")\n"
2872                 "(menu-path \"<Main>/Message/Mark/Mark as read\" \"\")\n"
2873
2874                 "(menu-path \"<Main>/Tools/Address book\" \"<alt>A\")\n"
2875                 "(menu-path \"<Main>/Tools/Execute\" \"<alt>X\")\n"
2876                 "(menu-path \"<Main>/Tools/Log window\" \"<alt>L\")\n"
2877
2878                 "(menu-path \"<Compose>/File/Close\" \"<alt>W\")\n"
2879                 "(menu-path \"<Compose>/Edit/Select all\" \"\")\n"
2880                 "(menu-path \"<Compose>/Edit/Advanced/Move a word backward\" \"<alt>B\")\n"
2881                 "(menu-path \"<Compose>/Edit/Advanced/Move a word forward\" \"<alt>F\")\n"
2882                 "(menu-path \"<Compose>/Edit/Advanced/Move to beginning of line\" \"<control>A\")\n"
2883                 "(menu-path \"<Compose>/Edit/Advanced/Delete a word backward\" \"<control>W\")\n"
2884                 "(menu-path \"<Compose>/Edit/Advanced/Delete a word forward\" \"<alt>D\")";
2885
2886         text = gtk_entry_get_text(entry);
2887
2888         if (!strcmp(text, _("Default")))
2889                 rc_str = default_menurc;
2890         else if (!strcmp(text, "Mew / Wanderlust"))
2891                 rc_str = mew_wl_menurc;
2892         else if (!strcmp(text, "Mutt"))
2893                 rc_str = mutt_menurc;
2894         else if (!strcmp(text, _("Old Sylpheed")))
2895                 rc_str = old_sylpheed_menurc;
2896         else
2897                 return;
2898
2899         menu_factory_clear_rc(rc_str);
2900         gtk_item_factory_parse_rc_string(rc_str);
2901
2902         gtk_widget_destroy(keybind.window);
2903         keybind.window = NULL;
2904         keybind.combo = NULL;
2905 }
2906
2907 static void prefs_common_charset_set_data_from_optmenu(PrefParam *pparam)
2908 {
2909         GtkWidget *menu;
2910         GtkWidget *menuitem;
2911         gchar *charset;
2912
2913         menu = gtk_option_menu_get_menu(GTK_OPTION_MENU(*pparam->widget));
2914         menuitem = gtk_menu_get_active(GTK_MENU(menu));
2915         charset = gtk_object_get_user_data(GTK_OBJECT(menuitem));
2916         g_free(*((gchar **)pparam->data));
2917         *((gchar **)pparam->data) = g_strdup(charset);
2918 }
2919
2920 static void prefs_common_charset_set_optmenu(PrefParam *pparam)
2921 {
2922         GtkOptionMenu *optmenu = GTK_OPTION_MENU(*pparam->widget);
2923         gint index;
2924
2925         g_return_if_fail(optmenu != NULL);
2926         g_return_if_fail(*((gchar **)pparam->data) != NULL);
2927
2928         index = menu_find_option_menu_index(optmenu, *((gchar **)pparam->data),
2929                                             (GCompareFunc)strcmp);
2930         if (index >= 0)
2931                 gtk_option_menu_set_history(optmenu, index);
2932         else {
2933                 gtk_option_menu_set_history(optmenu, 0);
2934                 prefs_common_charset_set_data_from_optmenu(pparam);
2935         }
2936 }
2937
2938 static void prefs_common_encoding_set_data_from_optmenu(PrefParam *pparam)
2939 {
2940         GtkWidget *menu;
2941         GtkWidget *menuitem;
2942
2943         menu = gtk_option_menu_get_menu(GTK_OPTION_MENU(*pparam->widget));
2944         menuitem = gtk_menu_get_active(GTK_MENU(menu));
2945         *((TransferEncodingMethod *)pparam->data) = GPOINTER_TO_INT
2946                 (gtk_object_get_user_data(GTK_OBJECT(menuitem)));
2947 }
2948
2949 static void prefs_common_encoding_set_optmenu(PrefParam *pparam)
2950 {
2951         TransferEncodingMethod method =
2952                 *((TransferEncodingMethod *)pparam->data);
2953         GtkOptionMenu *optmenu = GTK_OPTION_MENU(*pparam->widget);
2954         gint index;
2955
2956         g_return_if_fail(optmenu != NULL);
2957
2958         index = menu_find_option_menu_index(optmenu, GINT_TO_POINTER(method),
2959                                             NULL);
2960         if (index >= 0)
2961                 gtk_option_menu_set_history(optmenu, index);
2962         else {
2963                 gtk_option_menu_set_history(optmenu, 0);
2964                 prefs_common_encoding_set_data_from_optmenu(pparam);
2965         }
2966 }
2967
2968 static void prefs_common_recv_dialog_set_data_from_optmenu(PrefParam *pparam)
2969 {
2970         GtkWidget *menu;
2971         GtkWidget *menuitem;
2972
2973         menu = gtk_option_menu_get_menu(GTK_OPTION_MENU(*pparam->widget));
2974         menuitem = gtk_menu_get_active(GTK_MENU(menu));
2975         *((RecvDialogMode *)pparam->data) = GPOINTER_TO_INT
2976                 (gtk_object_get_user_data(GTK_OBJECT(menuitem)));
2977 }
2978
2979 static void prefs_common_recv_dialog_set_optmenu(PrefParam *pparam)
2980 {
2981         RecvDialogMode mode = *((RecvDialogMode *)pparam->data);
2982         GtkOptionMenu *optmenu = GTK_OPTION_MENU(*pparam->widget);
2983         GtkWidget *menu;
2984         GtkWidget *menuitem;
2985         gint index;
2986
2987         index = menu_find_option_menu_index(optmenu, GINT_TO_POINTER(mode),
2988                                             NULL);
2989         if (index >= 0)
2990                 gtk_option_menu_set_history(optmenu, index);
2991         else {
2992                 gtk_option_menu_set_history(optmenu, 0);
2993                 prefs_common_recv_dialog_set_data_from_optmenu(pparam);
2994         }
2995
2996         menu = gtk_option_menu_get_menu(optmenu);
2997         menuitem = gtk_menu_get_active(GTK_MENU(menu));
2998         gtk_menu_item_activate(GTK_MENU_ITEM(menuitem));
2999 }
3000
3001 static void prefs_common_send_dialog_set_data_from_optmenu(PrefParam *pparam)
3002 {
3003         GtkWidget *menu;
3004         GtkWidget *menuitem;
3005
3006         menu = gtk_option_menu_get_menu(GTK_OPTION_MENU(*pparam->widget));
3007         menuitem = gtk_menu_get_active(GTK_MENU(menu));
3008         *((SendDialogMode *)pparam->data) = GPOINTER_TO_INT
3009                 (gtk_object_get_user_data(GTK_OBJECT(menuitem)));
3010 }
3011
3012 static void prefs_common_send_dialog_set_optmenu(PrefParam *pparam)
3013 {
3014         SendDialogMode mode = *((SendDialogMode *)pparam->data);
3015         GtkOptionMenu *optmenu = GTK_OPTION_MENU(*pparam->widget);
3016         GtkWidget *menu;
3017         GtkWidget *menuitem;
3018
3019         switch (mode) {
3020         case SEND_DIALOG_ALWAYS:
3021                 gtk_option_menu_set_history(optmenu, 0);
3022                 break;
3023         case SEND_DIALOG_NEVER:
3024                 gtk_option_menu_set_history(optmenu, 1);
3025                 break;
3026         default:
3027                 break;
3028         }
3029
3030         menu = gtk_option_menu_get_menu(optmenu);
3031         menuitem = gtk_menu_get_active(GTK_MENU(menu));
3032         gtk_menu_item_activate(GTK_MENU_ITEM(menuitem));
3033 }
3034
3035 static gint prefs_common_deleted(GtkWidget *widget, GdkEventAny *event,
3036                                  gpointer data)
3037 {
3038         prefs_common_cancel();
3039         return TRUE;
3040 }
3041
3042 static void prefs_common_key_pressed(GtkWidget *widget, GdkEventKey *event,
3043                                      gpointer data)
3044 {
3045         if (event && event->keyval == GDK_Escape)
3046                 prefs_common_cancel();
3047 }
3048
3049 static void prefs_common_ok(void)
3050 {
3051         prefs_common_apply();
3052         gtk_widget_hide(dialog.window);
3053
3054         inc_unlock();
3055 }
3056
3057 static void prefs_common_apply(void)
3058 {
3059         MainWindow *mainwindow;
3060
3061         prefs_set_data_from_dialog(param);
3062         sock_set_io_timeout(prefs_common.io_timeout_secs);
3063         main_window_reflect_prefs_all_real(FALSE);
3064         prefs_common_save_config();
3065
3066         mainwindow = mainwindow_get_mainwindow();
3067         log_window_set_clipping(mainwindow->logwin, prefs_common.cliplog,
3068                                 prefs_common.loglength);
3069         
3070         inc_autocheck_timer_remove();
3071         inc_autocheck_timer_set();
3072 }
3073
3074 static void prefs_nextunreadmsgdialog_set_data_from_optmenu(PrefParam *pparam)
3075 {
3076         GtkWidget *menu;
3077         GtkWidget *menuitem;
3078
3079         menu = gtk_option_menu_get_menu(GTK_OPTION_MENU(*pparam->widget));
3080         menuitem = gtk_menu_get_active(GTK_MENU(menu));
3081         *((NextUnreadMsgDialogShow *)pparam->data) = GPOINTER_TO_INT
3082                 (gtk_object_get_user_data(GTK_OBJECT(menuitem)));
3083 }
3084
3085 static void prefs_nextunreadmsgdialog_set_optmenu(PrefParam *pparam)
3086 {
3087         NextUnreadMsgDialogShow dialog_show;
3088         GtkOptionMenu *optmenu = GTK_OPTION_MENU(*pparam->widget);
3089         GtkWidget *menu;
3090         GtkWidget *menuitem;
3091
3092         dialog_show = *((NextUnreadMsgDialogShow *)pparam->data);
3093
3094         switch (dialog_show) {
3095         case NEXTUNREADMSGDIALOG_ALWAYS:
3096                 gtk_option_menu_set_history(optmenu, 0);
3097                 break;
3098         case NEXTUNREADMSGDIALOG_ASSUME_YES:
3099                 gtk_option_menu_set_history(optmenu, 1);
3100                 break;
3101         case NEXTUNREADMSGDIALOG_ASSUME_NO:
3102                 gtk_option_menu_set_history(optmenu, 2);
3103                 break;
3104         }
3105
3106         menu = gtk_option_menu_get_menu(optmenu);
3107         menuitem = gtk_menu_get_active(GTK_MENU(menu));
3108         gtk_menu_item_activate(GTK_MENU_ITEM(menuitem));
3109 }
3110
3111 static void prefs_common_cancel(void)
3112 {
3113         gtk_widget_hide(dialog.window);
3114         inc_unlock();
3115 }
3116
3117
3118 /* static void prefs_recvdialog_set_data_from_optmenu(PrefParam *pparam)
3119 {
3120         GtkWidget *menu;
3121         GtkWidget *menuitem;
3122
3123         menu = gtk_option_menu_get_menu(GTK_OPTION_MENU(*pparam->widget));
3124         menuitem = gtk_menu_get_active(GTK_MENU(menu));
3125         *((RecvDialogShow *)pparam->data) = GPOINTER_TO_INT
3126                 (gtk_object_get_user_data(GTK_OBJECT(menuitem)));
3127 }  */
3128
3129 /* static void prefs_recvdialog_set_optmenu(PrefParam *pparam)
3130 {
3131         RecvDialogShow dialog_show;
3132         GtkOptionMenu *optmenu = GTK_OPTION_MENU(*pparam->widget);
3133         GtkWidget *menu;
3134         GtkWidget *menuitem;
3135
3136         dialog_show = *((RecvDialogShow *)pparam->data);
3137
3138         switch (dialog_show) {
3139         case RECVDIALOG_ALWAYS:
3140                 gtk_option_menu_set_history(optmenu, 0);
3141                 break;
3142         case RECVDIALOG_WINDOW_ACTIVE:
3143                 gtk_option_menu_set_history(optmenu, 1);
3144                 break;
3145         case RECVDIALOG_NEVER:
3146                 gtk_option_menu_set_history(optmenu, 2);
3147                 break;
3148         default:
3149         }
3150
3151         menu = gtk_option_menu_get_menu(optmenu);
3152         menuitem = gtk_menu_get_active(GTK_MENU(menu));
3153         gtk_menu_item_activate(GTK_MENU_ITEM(menuitem));
3154 }     */