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