Added option to warn about queued messages on exit.
[claws.git] / src / prefs_common.c
1 /*
2  * Sylpheed -- a GTK+ based, lightweight, and fast e-mail client
3  * Copyright (C) 1999-2001 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
36 #include "intl.h"
37 #include "main.h"
38 #include "prefs.h"
39 #include "prefs_common.h"
40 #include "mainwindow.h"
41 #include "summaryview.h"
42 #include "messageview.h"
43 #include "manage_window.h"
44 #include "menu.h"
45 #include "codeconv.h"
46 #include "utils.h"
47 #include "gtkutils.h"
48 #include "alertpanel.h"
49 #include "folder.h"
50
51 PrefsCommon prefs_common;
52
53 static PrefsDialog dialog;
54
55 static struct Receive {
56         GtkWidget *checkbtn_incext;
57         GtkWidget *entry_incext;
58         GtkWidget *button_incext;
59
60         GtkWidget *checkbtn_local;
61         GtkWidget *checkbtn_filter_on_inc;
62         GtkWidget *entry_spool;
63
64         GtkWidget *checkbtn_autochk;
65         GtkWidget *spinbtn_autochk;
66         GtkObject *spinbtn_autochk_adj;
67
68         GtkWidget *checkbtn_chkonstartup;
69
70         GtkWidget *spinbtn_maxarticle;
71         GtkObject *spinbtn_maxarticle_adj;
72 } receive;
73
74 static struct Send {
75         GtkWidget *checkbtn_sendext;
76         GtkWidget *entry_sendext;
77         GtkWidget *button_sendext;
78
79         GtkWidget *checkbtn_savemsg;
80         GtkWidget *checkbtn_queuemsg;
81
82         GtkWidget *optmenu_charset;
83 } send;
84
85 static struct Compose {
86         GtkWidget *checkbtn_quote;
87         GtkWidget *entry_quotemark;
88         GtkWidget *text_quotefmt;
89         GtkWidget *checkbtn_autosig;
90         GtkWidget *entry_sigsep;
91
92         GtkWidget *spinbtn_linewrap;
93         GtkObject *spinbtn_linewrap_adj;
94         GtkWidget *checkbtn_wrapquote;
95         GtkWidget *checkbtn_wrapatsend;
96 } compose;
97
98 static struct Display {
99         GtkWidget *entry_textfont;
100         GtkWidget *button_textfont;
101
102         GtkWidget *chkbtn_folder_unread;
103
104         GtkWidget *chkbtn_transhdr;
105         GtkWidget *chkbtn_swapfrom;
106         GtkWidget *chkbtn_hscrollbar;
107 } display;
108
109 static struct Message {
110         GtkWidget *chkbtn_enablecol;
111         GtkWidget *button_edit_col;
112         GtkWidget *chkbtn_mbalnum;
113         GtkWidget *chkbtn_disphdrpane;
114         GtkWidget *chkbtn_disphdr;
115         GtkWidget *spinbtn_linespc;
116         GtkObject *spinbtn_linespc_adj;
117         GtkWidget *chkbtn_headspc;
118
119         GtkWidget *chkbtn_smoothscroll;
120         GtkWidget *spinbtn_scrollstep;
121         GtkObject *spinbtn_scrollstep_adj;
122         GtkWidget *chkbtn_halfpage;
123 } message;
124
125 #if USE_GPGME
126 static struct Privacy {
127         GtkWidget *checkbtn_default_encrypt;
128         GtkWidget *checkbtn_default_sign;
129         GtkWidget *checkbtn_auto_check_signatures;
130         GtkWidget *checkbtn_passphrase_grab;
131         GtkWidget *optmenu_default_signkey;
132 } privacy;
133 #endif
134
135 static struct Interface {
136         GtkWidget *checkbtn_emacs;
137         GtkWidget *checkbtn_openunread;
138         GtkWidget *checkbtn_openinbox;
139         GtkWidget *checkbtn_immedexec;
140         GtkWidget *checkbtn_confonexit;
141         GtkWidget *checkbtn_cleanonexit;
142         GtkWidget *checkbtn_askonclean;
143         GtkWidget *checkbtn_warnqueued;
144         GtkWidget *checkbtn_addaddrbyclick;
145 } interface;
146
147 static struct Other {
148         GtkWidget *uri_combo;
149         GtkWidget *uri_entry;
150         GtkWidget *printcmd_entry;
151         GtkWidget *exteditor_combo;
152         GtkWidget *exteditor_entry;
153 } other;
154
155 static struct MessageColorButtons {
156         GtkWidget *quote_level1_btn;
157         GtkWidget *quote_level2_btn;
158         GtkWidget *quote_level3_btn;
159         GtkWidget *uri_btn;
160 } color_buttons;
161
162 static GtkWidget *quote_desc_win;
163 static GtkWidget *font_sel_win;
164 static GtkWidget *quote_color_win;
165 static GtkWidget *color_dialog;
166
167 static void prefs_common_charset_set_data_from_optmenu(PrefParam *pparam);
168 static void prefs_common_charset_set_optmenu          (PrefParam *pparam);
169 #if USE_GPGME
170 static void prefs_common_default_signkey_set_data_from_optmenu
171                                                         (PrefParam *pparam);
172 static void prefs_common_default_signkey_set_optmenu    (PrefParam *pparam);
173 #endif
174
175 /*
176    parameter name, default value, pointer to the prefs variable, data type,
177    pointer to the widget pointer,
178    pointer to the function for data setting,
179    pointer to the function for widget setting
180  */
181
182 static PrefParam param[] = {
183         /* Receive */
184         {"use_ext_inc", "FALSE", &prefs_common.use_extinc, P_BOOL,
185          &receive.checkbtn_incext,
186          prefs_set_data_from_toggle, prefs_set_toggle},
187         {"ext_inc_path", DEFAULT_INC_PATH, &prefs_common.extinc_path, P_STRING,
188          &receive.entry_incext,
189          prefs_set_data_from_entry, prefs_set_entry},
190
191         {"inc_local", "TRUE", &prefs_common.inc_local, P_BOOL,
192          &receive.checkbtn_local,
193          prefs_set_data_from_toggle, prefs_set_toggle},
194         {"filter_on_inc_local", "FALSE", &prefs_common.filter_on_inc, P_BOOL,
195          &receive.checkbtn_filter_on_inc,
196          prefs_set_data_from_toggle, prefs_set_toggle},
197         {"spool_path", DEFAULT_SPOOL_PATH, &prefs_common.spool_path, P_STRING,
198          &receive.entry_spool,
199          prefs_set_data_from_entry, prefs_set_entry},
200
201         {"autochk_newmail", "FALSE", &prefs_common.autochk_newmail, P_BOOL,
202          &receive.checkbtn_autochk,
203          prefs_set_data_from_toggle, prefs_set_toggle},
204         {"autochk_interval", "10", &prefs_common.autochk_itv, P_INT,
205          &receive.spinbtn_autochk,
206          prefs_set_data_from_spinbtn, prefs_set_spinbtn},
207         {"check_on_startup", "FALSE", &prefs_common.chk_on_startup, P_BOOL,
208          &receive.checkbtn_chkonstartup,
209          prefs_set_data_from_toggle, prefs_set_toggle},
210
211         {"max_news_articles", "300", &prefs_common.max_articles, P_INT,
212          &receive.spinbtn_maxarticle,
213          prefs_set_data_from_spinbtn, prefs_set_spinbtn},
214
215         /* Send */
216         {"use_ext_send", "FALSE", &prefs_common.use_extsend, P_BOOL,
217          &send.checkbtn_sendext,
218          prefs_set_data_from_toggle, prefs_set_toggle},
219         {"ext_send_path", NULL, &prefs_common.extsend_path, P_STRING,
220          &send.entry_sendext, prefs_set_data_from_entry, prefs_set_entry},
221         {"save_message", "TRUE", &prefs_common.savemsg, P_BOOL,
222          &send.checkbtn_savemsg,
223          prefs_set_data_from_toggle, prefs_set_toggle},
224         {"queue_message", "FALSE", &prefs_common.queue_msg, P_BOOL,
225          &send.checkbtn_queuemsg,
226          prefs_set_data_from_toggle, prefs_set_toggle},
227
228         {"outgoing_charset", CS_AUTO, &prefs_common.outgoing_charset, P_STRING,
229          &send.optmenu_charset,
230          prefs_common_charset_set_data_from_optmenu,
231          prefs_common_charset_set_optmenu},
232
233         /* Compose */
234         {"reply_with_quote", "TRUE", &prefs_common.reply_with_quote, P_BOOL,
235          &compose.checkbtn_quote,
236          prefs_set_data_from_toggle, prefs_set_toggle},
237         {"quote_mark", "> ", &prefs_common.quotemark, P_STRING,
238          &compose.entry_quotemark, prefs_set_data_from_entry, prefs_set_entry},
239         {"quote_format", "On %d\\n%f wrote:\\n\\n",
240          &prefs_common.quotefmt, P_STRING, &compose.text_quotefmt,
241          prefs_set_data_from_text, prefs_set_text},
242
243         {"auto_signature", "TRUE", &prefs_common.auto_sig, P_BOOL,
244          &compose.checkbtn_autosig,
245          prefs_set_data_from_toggle, prefs_set_toggle},
246         {"signature_separator", "-- ", &prefs_common.sig_sep, P_STRING,
247          &compose.entry_sigsep, prefs_set_data_from_entry, prefs_set_entry},
248
249         {"linewrap_length", "74", &prefs_common.linewrap_len, P_INT,
250          &compose.spinbtn_linewrap,
251          prefs_set_data_from_spinbtn, prefs_set_spinbtn},
252         {"linewrap_quotation", "FALSE", &prefs_common.linewrap_quote, P_BOOL,
253          &compose.checkbtn_wrapquote,
254          prefs_set_data_from_toggle, prefs_set_toggle},
255         {"linewrap_before_sending", "FALSE",
256          &prefs_common.linewrap_at_send, P_BOOL,
257          &compose.checkbtn_wrapatsend,
258          prefs_set_data_from_toggle, prefs_set_toggle},
259
260         {"show_ruler", "TRUE", &prefs_common.show_ruler, P_BOOL,
261          NULL, NULL, NULL},
262
263         /* Display */
264         {"widget_font", NULL, &prefs_common.widgetfont, P_STRING,
265          NULL, NULL, NULL},
266         {"message_font", "-misc-fixed-medium-r-normal--14-*-*-*-*-*-*-*",
267          &prefs_common.textfont, P_STRING,
268          &display.entry_textfont,
269          prefs_set_data_from_entry, prefs_set_entry},
270
271         {"display_folder_unread_num", "TRUE",
272          &prefs_common.display_folder_unread, P_BOOL,
273          &display.chkbtn_folder_unread,
274          prefs_set_data_from_toggle, prefs_set_toggle},
275
276         /* Display: Summary View */
277         {"translate_header", "TRUE", &prefs_common.trans_hdr, P_BOOL,
278          &display.chkbtn_transhdr,
279          prefs_set_data_from_toggle, prefs_set_toggle},
280         {"enable_swap_from", "TRUE", &prefs_common.swap_from, P_BOOL,
281          &display.chkbtn_swapfrom,
282          prefs_set_data_from_toggle, prefs_set_toggle},
283         {"enable_hscrollbar", "TRUE", &prefs_common.enable_hscrollbar, P_BOOL,
284          &display.chkbtn_hscrollbar,
285          prefs_set_data_from_toggle, prefs_set_toggle},
286
287         {"enable_thread", "TRUE", &prefs_common.enable_thread, P_BOOL,
288          NULL, NULL, NULL},
289         {"toolbar_style", "3", &prefs_common.toolbar_style, P_ENUM,
290          NULL, NULL, NULL},
291         {"show_statusbar", "TRUE", &prefs_common.show_statusbar, P_BOOL,
292          NULL, NULL, NULL},
293
294         {"show_mark", "TRUE", &prefs_common.show_mark, P_BOOL,
295          NULL, NULL, NULL},
296         {"show_unread", "TRUE", &prefs_common.show_unread, P_BOOL,
297          NULL, NULL, NULL},
298         {"show_mime", "TRUE", &prefs_common.show_mime, P_BOOL,
299          NULL, NULL, NULL},
300         {"show_number", "TRUE", &prefs_common.show_number, P_BOOL,
301          NULL, NULL, NULL},
302         {"show_size", "FALSE", &prefs_common.show_size, P_BOOL,
303          NULL, NULL, NULL},
304         {"show_date", "TRUE", &prefs_common.show_date, P_BOOL,
305          NULL, NULL, NULL},
306         {"show_from", "TRUE", &prefs_common.show_from, P_BOOL,
307          NULL, NULL, NULL},
308         {"show_subject", "TRUE", &prefs_common.show_subject, P_BOOL,
309          NULL, NULL, NULL},
310
311         /* Widget size */
312         {"folderview_width", "179", &prefs_common.folderview_width, P_INT,
313          NULL, NULL, NULL},
314         {"folderview_height", "600", &prefs_common.folderview_height, P_INT,
315          NULL, NULL, NULL},
316         {"folder_col_folder", "150", &prefs_common.folder_col_folder, P_INT,
317          NULL, NULL, NULL},
318         {"folder_col_new", "32", &prefs_common.folder_col_new, P_INT,
319          NULL, NULL, NULL},
320         {"folder_col_unread", "32", &prefs_common.folder_col_unread, P_INT,
321          NULL, NULL, NULL},
322         {"folder_col_total", "32", &prefs_common.folder_col_total, P_INT,
323          NULL, NULL, NULL},
324         {"summaryview_width", "600", &prefs_common.summaryview_width, P_INT,
325          NULL, NULL, NULL},
326         {"summaryview_height", "173", &prefs_common.summaryview_height, P_INT,
327          NULL, NULL, NULL},
328         {"summary_col_mark", "10", &prefs_common.summary_col_mark, P_INT,
329          NULL, NULL, NULL},
330         {"summary_col_unread", "13", &prefs_common.summary_col_unread, P_INT,
331          NULL, NULL, NULL},
332         {"summary_col_mime", "10", &prefs_common.summary_col_mime, P_INT,
333          NULL, NULL, NULL},
334         {"summary_col_number", "40", &prefs_common.summary_col_number, P_INT,
335          NULL, NULL, NULL},
336         {"summary_col_size", "48", &prefs_common.summary_col_size, P_INT,
337          NULL, NULL, NULL},
338         {"summary_col_date", "120", &prefs_common.summary_col_date, P_INT,
339          NULL, NULL, NULL},
340         {"summary_col_from", "140", &prefs_common.summary_col_from, P_INT,
341          NULL, NULL, NULL},
342         {"summary_col_subject", "200", &prefs_common.summary_col_subject,
343          P_INT, NULL, NULL, NULL},
344         {"mainview_x", "64", &prefs_common.mainview_x, P_INT,
345          NULL, NULL, NULL},
346         {"mainview_y", "64", &prefs_common.mainview_y, P_INT,
347          NULL, NULL, NULL},
348         {"mainview_width", "600", &prefs_common.mainview_width, P_INT,
349          NULL, NULL, NULL},
350         {"mainview_height", "600", &prefs_common.mainview_height, P_INT,
351          NULL, NULL, NULL},
352         {"mainwin_x", "64", &prefs_common.mainwin_x, P_INT,
353          NULL, NULL, NULL},
354         {"mainwin_y", "64", &prefs_common.mainwin_y, P_INT,
355          NULL, NULL, NULL},
356         {"mainwin_width", "800", &prefs_common.mainwin_width, P_INT,
357          NULL, NULL, NULL},
358         {"mainwin_height", "600", &prefs_common.mainwin_height, P_INT,
359          NULL, NULL, NULL},
360         {"messagewin_width", "600", &prefs_common.msgwin_width, P_INT,
361          NULL, NULL, NULL},
362         {"messagewin_height", "540", &prefs_common.msgwin_height, P_INT,
363          NULL, NULL, NULL},
364         {"compose_width", "600", &prefs_common.compose_width, P_INT,
365          NULL, NULL, NULL},
366         {"compose_height", "560", &prefs_common.compose_height, P_INT,
367          NULL, NULL, NULL},
368
369         /* Message */
370         {"enable_color", "TRUE", &prefs_common.enable_color, P_BOOL,
371          &message.chkbtn_enablecol,
372          prefs_set_data_from_toggle, prefs_set_toggle},
373
374         {"quote_level1_color", "179", &prefs_common.quote_level1_col, P_INT,
375          NULL, NULL, NULL},
376         {"quote_level2_color", "179", &prefs_common.quote_level2_col, P_INT,
377          NULL, NULL, NULL},
378         {"quote_level3_color", "179", &prefs_common.quote_level3_col, P_INT,
379          NULL, NULL, NULL},
380         {"uri_color", "32512", &prefs_common.uri_col, P_INT,
381          NULL, NULL, NULL},
382         {"signature_color", "0", &prefs_common.sig_col, P_USHORT,
383          NULL, NULL, NULL},
384         {"recycle_quote_colors", "FALSE", &prefs_common.recycle_quote_colors,
385          P_BOOL, NULL, NULL, NULL},
386
387         {"convert_mb_alnum", "FALSE", &prefs_common.conv_mb_alnum, P_BOOL,
388          &message.chkbtn_mbalnum,
389          prefs_set_data_from_toggle, prefs_set_toggle},
390         {"display_header_pane", "TRUE", &prefs_common.display_header_pane,
391          P_BOOL, &message.chkbtn_disphdrpane,
392          prefs_set_data_from_toggle, prefs_set_toggle},
393         {"display_header", "TRUE", &prefs_common.display_header, P_BOOL,
394          &message.chkbtn_disphdr,
395          prefs_set_data_from_toggle, prefs_set_toggle},
396         {"line_space", "2", &prefs_common.line_space, P_INT,
397          &message.spinbtn_linespc,
398          prefs_set_data_from_spinbtn, prefs_set_spinbtn},
399         {"enable_head_space", "FALSE", &prefs_common.head_space, P_BOOL,
400          &message.chkbtn_headspc,
401          prefs_set_data_from_toggle, prefs_set_toggle},
402
403         {"enable_smooth_scroll", "FALSE",
404          &prefs_common.enable_smooth_scroll, P_BOOL,
405          &message.chkbtn_smoothscroll,
406          prefs_set_data_from_toggle, prefs_set_toggle},
407         {"scroll_step", "1", &prefs_common.scroll_step, P_INT,
408          &message.spinbtn_scrollstep,
409          prefs_set_data_from_spinbtn, prefs_set_spinbtn},
410         {"scroll_half_page", "FALSE", &prefs_common.scroll_halfpage, P_BOOL,
411          &message.chkbtn_halfpage,
412          prefs_set_data_from_toggle, prefs_set_toggle},
413
414         /* MIME viewer */
415         {"mime_image_viewer", "display '%s'",
416          &prefs_common.mime_image_viewer, P_STRING, NULL, NULL, NULL},
417         {"mime_audio_player", "play '%s'",
418          &prefs_common.mime_audio_player, P_STRING, NULL, NULL, NULL},
419
420 #if USE_GPGME
421         /* Privacy */
422         {"default_encrypt", "FALSE", &prefs_common.default_encrypt, P_BOOL,
423          &privacy.checkbtn_default_encrypt,
424          prefs_set_data_from_toggle, prefs_set_toggle},
425         {"default_sign", "FALSE", &prefs_common.default_sign, P_BOOL,
426          &privacy.checkbtn_default_sign,
427          prefs_set_data_from_toggle, prefs_set_toggle},
428         {"auto_check_signatures", "TRUE",
429          &prefs_common.auto_check_signatures, P_BOOL,
430          &privacy.checkbtn_auto_check_signatures,
431          prefs_set_data_from_toggle, prefs_set_toggle},
432         {"passphrase_grab", "FALSE", &prefs_common.passphrase_grab, P_BOOL,
433          &privacy.checkbtn_passphrase_grab,
434          prefs_set_data_from_toggle, prefs_set_toggle},
435         {"default_signkey", CS_AUTO, &prefs_common.default_signkey, P_STRING,
436          &privacy.optmenu_default_signkey,
437          prefs_common_default_signkey_set_data_from_optmenu,
438          prefs_common_default_signkey_set_optmenu},
439 #endif /* USE_GPGME */
440
441         /* Interface */
442         {"separate_folder", "FALSE", &prefs_common.sep_folder, P_BOOL,
443          NULL, NULL, NULL},
444         {"separate_message", "FALSE", &prefs_common.sep_msg, P_BOOL,
445          NULL, NULL, NULL},
446
447         {"emulate_emacs", "FALSE", &prefs_common.emulate_emacs, P_BOOL,
448          &interface.checkbtn_emacs,
449          prefs_set_data_from_toggle, prefs_set_toggle},
450         {"open_unread_on_enter", "FALSE", &prefs_common.open_unread_on_enter,
451          P_BOOL, &interface.checkbtn_openunread,
452          prefs_set_data_from_toggle, prefs_set_toggle},
453         {"open_inbox_on_inc", "TRUE", &prefs_common.open_inbox_on_inc,
454          P_BOOL, &interface.checkbtn_openinbox,
455          prefs_set_data_from_toggle, prefs_set_toggle},
456         {"immediate_execution", "TRUE", &prefs_common.immediate_exec, P_BOOL,
457          &interface.checkbtn_immedexec,
458          prefs_set_data_from_toggle, prefs_set_toggle},
459         {"add_address_by_click", "FALSE", &prefs_common.add_address_by_click,
460          P_BOOL, &interface.checkbtn_addaddrbyclick,
461          prefs_set_data_from_toggle, prefs_set_toggle},
462
463         {"confirm_on_exit", "TRUE", &prefs_common.confirm_on_exit, P_BOOL,
464          &interface.checkbtn_confonexit,
465          prefs_set_data_from_toggle, prefs_set_toggle},
466         {"clean_trash_on_exit", "FALSE", &prefs_common.clean_on_exit, P_BOOL,
467          &interface.checkbtn_cleanonexit,
468          prefs_set_data_from_toggle, prefs_set_toggle},
469         {"ask_on_cleaning", "TRUE", &prefs_common.ask_on_clean, P_BOOL,
470          &interface.checkbtn_askonclean,
471          prefs_set_data_from_toggle, prefs_set_toggle},
472         {"warn_queued_on_exit", "TRUE", &prefs_common.warn_queued_on_exit,
473          P_BOOL, &interface.checkbtn_warnqueued,
474          prefs_set_data_from_toggle, prefs_set_toggle},
475
476         /* Other */
477         {"uri_open_command", "netscape -remote 'openURL(%s,raise)'",
478          &prefs_common.uri_cmd, P_STRING,
479          &other.uri_entry, prefs_set_data_from_entry, prefs_set_entry},
480         {"print_command", "lpr %s", &prefs_common.print_cmd, P_STRING,
481          &other.printcmd_entry, prefs_set_data_from_entry, prefs_set_entry},
482         {"ext_editor_command", "gedit %s",
483          &prefs_common.ext_editor_cmd, P_STRING,
484          &other.exteditor_entry, prefs_set_data_from_entry, prefs_set_entry},
485
486         {NULL, NULL, NULL, P_OTHER, NULL, NULL, NULL}
487 };
488
489 #define VSPACING                12
490 #define VSPACING_NARROW         4
491 #define VBOX_BORDER             16
492 #define DEFAULT_ENTRY_WIDTH     80
493 #define PREFSBUFSIZE            1024
494
495 /* widget creating functions */
496 static void prefs_common_create         (void);
497 static void prefs_receive_create        (void);
498 static void prefs_send_create           (void);
499 static void prefs_compose_create        (void);
500 static void prefs_display_create        (void);
501 static void prefs_message_create        (void);
502 #if USE_GPGME
503 static void prefs_privacy_create        (void);
504 #endif
505 static void prefs_interface_create      (void);
506 static void prefs_other_create          (void);
507
508 static void prefs_quote_description             (void);
509 static void prefs_quote_description_create      (void);
510 static void prefs_quote_colors_dialog           (void);
511 static void prefs_quote_colors_dialog_create    (void);
512 static void quote_color_set_dialog              (GtkWidget      *widget,
513                                                  gpointer        data);
514 static void quote_colors_set_dialog_ok          (GtkWidget      *widget,
515                                                  gpointer        data);
516 static void quote_colors_set_dialog_cancel      (GtkWidget      *widget,
517                                                  gpointer        data);
518 static void set_button_bg_color                 (GtkWidget      *widget,
519                                                  gint            color);
520 static void prefs_enable_message_color_toggled  (void);
521 static void prefs_recycle_colors_toggled        (GtkWidget      *widget);
522
523 /* functions for setting items of SummaryView */
524 static void prefs_summary_display_item_dialog_create
525                                         (gboolean       *cancelled);
526 static void display_item_ok             (GtkWidget      *widget,
527                                          gboolean       *cancelled);
528 static void display_item_cancel         (GtkWidget      *widget,
529                                          gboolean       *cancelled);
530 static gint display_item_delete_event   (GtkWidget      *widget,
531                                          GdkEventAny    *event,
532                                          gboolean       *cancelled);
533 static void display_item_key_pressed    (GtkWidget      *widget,
534                                          GdkEventKey    *event,
535                                          gboolean       *cancelled);
536
537 static void prefs_font_select                   (GtkButton      *button);
538 static void prefs_font_selection_key_pressed    (GtkWidget      *widget,
539                                                  GdkEventKey    *event,
540                                                  gpointer        data);
541 static void prefs_font_selection_ok             (GtkButton      *button);
542
543 static void prefs_common_key_pressed    (GtkWidget      *widget,
544                                          GdkEventKey    *event,
545                                          gpointer        data);
546 static void prefs_common_ok             (GtkButton      *button);
547 static void prefs_common_apply          (GtkButton      *button);
548
549 void prefs_common_read_config(void)
550 {
551         prefs_read_config(param, "Common", COMMON_RC);
552 }
553
554 void prefs_common_save_config(void)
555 {
556         prefs_save_config(param, "Common", COMMON_RC);
557 }
558
559 void prefs_common_open(void)
560 {
561         if (!dialog.window) {
562                 prefs_common_create();
563         }
564
565         manage_window_set_transient(GTK_WINDOW(dialog.window));
566         gtk_notebook_set_page(GTK_NOTEBOOK(dialog.notebook), 0);
567         gtk_widget_grab_focus(dialog.ok_btn);
568
569         prefs_set_dialog(param);
570
571         gtk_widget_show(dialog.window);
572 }
573
574 static void prefs_common_create(void)
575 {
576         gint page = 0;
577
578         debug_print(_("Creating common preferences window...\n"));
579
580         prefs_dialog_create(&dialog);
581         gtk_window_set_title (GTK_WINDOW(dialog.window),
582                               _("Common Preferences"));
583         gtk_signal_connect (GTK_OBJECT(dialog.window), "delete_event",
584                             GTK_SIGNAL_FUNC(gtk_widget_hide_on_delete), NULL);
585         gtk_signal_connect (GTK_OBJECT(dialog.window), "key_press_event",
586                             GTK_SIGNAL_FUNC(prefs_common_key_pressed), NULL);
587         gtk_signal_connect (GTK_OBJECT(dialog.window), "focus_in_event",
588                             GTK_SIGNAL_FUNC(manage_window_focus_in), NULL);
589         gtk_signal_connect (GTK_OBJECT(dialog.window), "focus_out_event",
590                             GTK_SIGNAL_FUNC(manage_window_focus_out), NULL);
591         gtk_signal_connect (GTK_OBJECT(dialog.ok_btn), "clicked",
592                             GTK_SIGNAL_FUNC(prefs_common_ok), NULL);
593         gtk_signal_connect (GTK_OBJECT(dialog.apply_btn), "clicked",
594                             GTK_SIGNAL_FUNC(prefs_common_apply), NULL);
595         gtk_signal_connect_object (GTK_OBJECT(dialog.cancel_btn), "clicked",
596                                    GTK_SIGNAL_FUNC(gtk_widget_hide_on_delete),
597                                    GTK_OBJECT(dialog.window));
598
599         /* create all widgets on notebook */
600         prefs_receive_create();
601         SET_NOTEBOOK_LABEL(dialog.notebook, _("Receive"),   page++);
602         prefs_send_create();
603         SET_NOTEBOOK_LABEL(dialog.notebook, _("Send"),      page++);
604         prefs_compose_create();
605         SET_NOTEBOOK_LABEL(dialog.notebook, _("Compose"),   page++);
606         prefs_display_create();
607         SET_NOTEBOOK_LABEL(dialog.notebook, _("Display"),   page++);
608         prefs_message_create();
609         SET_NOTEBOOK_LABEL(dialog.notebook, _("Message"),   page++);
610 #if USE_GPGME
611         prefs_privacy_create();
612         SET_NOTEBOOK_LABEL(dialog.notebook, _("Privacy"),   page++);
613 #endif
614         prefs_interface_create();
615         SET_NOTEBOOK_LABEL(dialog.notebook, _("Interface"), page++);
616         prefs_other_create();
617         SET_NOTEBOOK_LABEL(dialog.notebook, _("Other"),     page++);
618
619         gtk_widget_show_all(dialog.window);
620 }
621
622 static void prefs_receive_create(void)
623 {
624         GtkWidget *vbox1;
625         GtkWidget *vbox2;
626         GtkWidget *frame_incext;
627         GtkWidget *checkbtn_incext;
628         GtkWidget *hbox;
629         GtkWidget *label_incext;
630         GtkWidget *entry_incext;
631         GtkWidget *button_incext;
632
633         GtkWidget *frame_spool;
634         GtkWidget *checkbtn_local;
635         GtkWidget *checkbtn_filter_on_inc;
636         GtkWidget *label_spool;
637         GtkWidget *entry_spool;
638
639         GtkWidget *hbox_autochk;
640         GtkWidget *checkbtn_autochk;
641         GtkWidget *label_autochk1;
642         GtkObject *spinbtn_autochk_adj;
643         GtkWidget *spinbtn_autochk;
644         GtkWidget *label_autochk2;
645         GtkWidget *checkbtn_chkonstartup;
646
647         GtkWidget *frame_news;
648         GtkWidget *label_maxarticle;
649         GtkWidget *spinbtn_maxarticle;
650         GtkObject *spinbtn_maxarticle_adj;
651
652         vbox1 = gtk_vbox_new (FALSE, VSPACING);
653         gtk_widget_show (vbox1);
654         gtk_container_add (GTK_CONTAINER (dialog.notebook), vbox1);
655         gtk_container_set_border_width (GTK_CONTAINER (vbox1), VBOX_BORDER);
656
657         PACK_FRAME(vbox1, frame_incext, _("External program"));
658
659         vbox2 = gtk_vbox_new (FALSE, VSPACING_NARROW);
660         gtk_widget_show (vbox2);
661         gtk_container_add (GTK_CONTAINER (frame_incext), vbox2);
662         gtk_container_set_border_width (GTK_CONTAINER (vbox2), 8);
663
664         /* Use of external incorporation program */
665         PACK_CHECK_BUTTON (vbox2, checkbtn_incext,
666                            _("Use external program for incorporation"));
667
668         hbox = gtk_hbox_new (FALSE, 8);
669         gtk_widget_show (hbox);
670         gtk_box_pack_start (GTK_BOX (vbox2), hbox, FALSE, FALSE, 0);
671         SET_TOGGLE_SENSITIVITY (checkbtn_incext, hbox);
672
673         label_incext = gtk_label_new (_("Program path"));
674         gtk_widget_show (label_incext);
675         gtk_box_pack_start (GTK_BOX (hbox), label_incext, FALSE, FALSE, 0);
676
677         entry_incext = gtk_entry_new ();
678         gtk_widget_show (entry_incext);
679         gtk_box_pack_start (GTK_BOX (hbox), entry_incext, TRUE, TRUE, 0);
680
681         button_incext = gtk_button_new_with_label ("... ");
682         gtk_widget_show (button_incext);
683         gtk_box_pack_start (GTK_BOX (hbox), button_incext, FALSE, FALSE, 0);
684
685         PACK_FRAME(vbox1, frame_spool, _("Local spool"));
686
687         vbox2 = gtk_vbox_new (FALSE, VSPACING_NARROW);
688         gtk_widget_show (vbox2);
689         gtk_container_add (GTK_CONTAINER (frame_spool), vbox2);
690         gtk_container_set_border_width (GTK_CONTAINER (vbox2), 8);
691
692         hbox = gtk_hbox_new (FALSE, 32);
693         gtk_widget_show (hbox);
694         gtk_box_pack_start (GTK_BOX (vbox2), hbox, FALSE, FALSE, 0);
695
696         PACK_CHECK_BUTTON (hbox, checkbtn_local, _("Incorporate from spool"));
697         PACK_CHECK_BUTTON (hbox, checkbtn_filter_on_inc,
698                            _("Filter on incorporation"));
699         SET_TOGGLE_SENSITIVITY (checkbtn_local, checkbtn_filter_on_inc);
700
701         hbox = gtk_hbox_new (FALSE, 8);
702         gtk_widget_show (hbox);
703         gtk_box_pack_start (GTK_BOX (vbox2), hbox, FALSE, FALSE, 0);
704         SET_TOGGLE_SENSITIVITY (checkbtn_local, hbox);
705
706         label_spool = gtk_label_new (_("Spool directory"));
707         gtk_widget_show (label_spool);
708         gtk_box_pack_start (GTK_BOX (hbox), label_spool, FALSE, FALSE, 0);
709
710         entry_spool = gtk_entry_new ();
711         gtk_widget_show (entry_spool);
712         gtk_box_pack_start (GTK_BOX (hbox), entry_spool, TRUE, TRUE, 0);
713
714         vbox2 = gtk_vbox_new (FALSE, VSPACING_NARROW);
715         gtk_widget_show (vbox2);
716         gtk_box_pack_start (GTK_BOX (vbox1), vbox2, FALSE, FALSE, 0);
717
718         /* Auto-checking */
719         hbox_autochk = gtk_hbox_new (FALSE, 8);
720         gtk_widget_show (hbox_autochk);
721         gtk_box_pack_start (GTK_BOX (vbox2), hbox_autochk, FALSE, FALSE, 0);
722
723         gtk_widget_set_sensitive(hbox_autochk, FALSE);
724
725         PACK_CHECK_BUTTON (hbox_autochk, checkbtn_autochk,
726                            _("Auto-check new mail"));
727
728         label_autochk1 = gtk_label_new (_("each"));
729         gtk_widget_show (label_autochk1);
730         gtk_box_pack_start (GTK_BOX (hbox_autochk), label_autochk1, FALSE, FALSE, 0);
731
732         spinbtn_autochk_adj = gtk_adjustment_new (5, 1, 100, 1, 10, 10);
733         spinbtn_autochk = gtk_spin_button_new
734                 (GTK_ADJUSTMENT (spinbtn_autochk_adj), 1, 0);
735         gtk_widget_show (spinbtn_autochk);
736         gtk_box_pack_start (GTK_BOX (hbox_autochk), spinbtn_autochk, FALSE, FALSE, 0);
737         gtk_widget_set_usize (spinbtn_autochk, 64, -1);
738         gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (spinbtn_autochk), TRUE);
739
740         label_autochk2 = gtk_label_new (_("minute(s)"));
741         gtk_widget_show (label_autochk2);
742         gtk_box_pack_start (GTK_BOX (hbox_autochk), label_autochk2, FALSE, FALSE, 0);
743
744         SET_TOGGLE_SENSITIVITY(checkbtn_autochk, label_autochk1);
745         SET_TOGGLE_SENSITIVITY(checkbtn_autochk, spinbtn_autochk);
746         SET_TOGGLE_SENSITIVITY(checkbtn_autochk, label_autochk2);
747
748         PACK_CHECK_BUTTON (vbox2, checkbtn_chkonstartup,
749                            _("Check new mail on startup"));
750
751         PACK_FRAME(vbox1, frame_news, _("News"));
752
753         hbox = gtk_hbox_new (FALSE, 8);
754         gtk_widget_show (hbox);
755         gtk_container_add (GTK_CONTAINER (frame_news), hbox);
756         gtk_container_set_border_width (GTK_CONTAINER (hbox), 8);
757
758         label_maxarticle = gtk_label_new
759                 (_("Maximum article number to download\n"
760                    "(unlimited if 0 is specified)"));
761         gtk_widget_show (label_maxarticle);
762         gtk_box_pack_start (GTK_BOX (hbox), label_maxarticle, FALSE, FALSE, 0);
763         gtk_label_set_justify (GTK_LABEL (label_maxarticle), GTK_JUSTIFY_LEFT);
764
765         spinbtn_maxarticle_adj =
766                 gtk_adjustment_new (300, 0, 10000, 10, 100, 100);
767         spinbtn_maxarticle = gtk_spin_button_new
768                 (GTK_ADJUSTMENT (spinbtn_maxarticle_adj), 10, 0);
769         gtk_widget_show (spinbtn_maxarticle);
770         gtk_box_pack_start (GTK_BOX (hbox), spinbtn_maxarticle,
771                             FALSE, FALSE, 0);
772         gtk_widget_set_usize (spinbtn_maxarticle, 64, -1);
773         gtk_spin_button_set_numeric
774                 (GTK_SPIN_BUTTON (spinbtn_maxarticle), TRUE);
775
776         receive.checkbtn_incext = checkbtn_incext;
777         receive.entry_incext    = entry_incext;
778         receive.button_incext   = button_incext;
779
780         receive.checkbtn_local         = checkbtn_local;
781         receive.checkbtn_filter_on_inc = checkbtn_filter_on_inc;
782         receive.entry_spool            = entry_spool;
783
784         receive.checkbtn_autochk    = checkbtn_autochk;
785         receive.spinbtn_autochk     = spinbtn_autochk;
786         receive.spinbtn_autochk_adj = spinbtn_autochk_adj;
787
788         receive.checkbtn_chkonstartup = checkbtn_chkonstartup;
789
790         receive.spinbtn_maxarticle     = spinbtn_maxarticle;
791         receive.spinbtn_maxarticle_adj = spinbtn_maxarticle_adj;
792 }
793
794 static void prefs_send_create(void)
795 {
796         GtkWidget *vbox1;
797         GtkWidget *vbox2;
798         GtkWidget *frame_sendext;
799         GtkWidget *vbox_sendext;
800         GtkWidget *checkbtn_sendext;
801         GtkWidget *hbox1;
802         GtkWidget *label_sendext;
803         GtkWidget *entry_sendext;
804         GtkWidget *button_sendext;
805         GtkWidget *checkbtn_savemsg;
806         GtkWidget *checkbtn_queuemsg;
807         GtkWidget *label_outcharset;
808         GtkWidget *optmenu;
809         GtkWidget *optmenu_menu;
810         GtkWidget *menuitem;
811
812         vbox1 = gtk_vbox_new (FALSE, VSPACING);
813         gtk_widget_show (vbox1);
814         gtk_container_add (GTK_CONTAINER (dialog.notebook), vbox1);
815         gtk_container_set_border_width (GTK_CONTAINER (vbox1), VBOX_BORDER);
816
817         PACK_FRAME(vbox1, frame_sendext, _("External program"));
818
819         gtk_widget_set_sensitive(frame_sendext, FALSE);
820
821         vbox_sendext = gtk_vbox_new (FALSE, VSPACING_NARROW);
822         gtk_widget_show (vbox_sendext);
823         gtk_container_add (GTK_CONTAINER (frame_sendext), vbox_sendext);
824         gtk_container_set_border_width (GTK_CONTAINER (vbox_sendext), 8);
825
826         PACK_CHECK_BUTTON (vbox_sendext, checkbtn_sendext,
827                            _("Use external program for sending"));
828
829         hbox1 = gtk_hbox_new (FALSE, 8);
830         gtk_widget_show (hbox1);
831         gtk_box_pack_start (GTK_BOX (vbox_sendext), hbox1, FALSE, FALSE, 0);
832         SET_TOGGLE_SENSITIVITY(checkbtn_sendext, hbox1);
833
834         label_sendext = gtk_label_new (_("Program path"));
835         gtk_widget_show (label_sendext);
836         gtk_box_pack_start (GTK_BOX (hbox1), label_sendext, FALSE, FALSE, 0);
837
838         entry_sendext = gtk_entry_new ();
839         gtk_widget_show (entry_sendext);
840         gtk_box_pack_start (GTK_BOX (hbox1), entry_sendext, TRUE, TRUE, 0);
841
842         button_sendext = gtk_button_new_with_label ("... ");
843         gtk_widget_show (button_sendext);
844         gtk_box_pack_start (GTK_BOX (hbox1), button_sendext, FALSE, FALSE, 0);
845
846         vbox2 = gtk_vbox_new (FALSE, VSPACING_NARROW);
847         gtk_widget_show (vbox2);
848         gtk_box_pack_start (GTK_BOX (vbox1), vbox2, FALSE, FALSE, 0);
849
850         PACK_CHECK_BUTTON (vbox2, checkbtn_savemsg,
851                            _("Save sent message to outbox"));
852         PACK_CHECK_BUTTON (vbox2, checkbtn_queuemsg,
853                            _("Queue message that failed to send"));
854
855         hbox1 = gtk_hbox_new (FALSE, 8);
856         gtk_widget_show (hbox1);
857         gtk_box_pack_start (GTK_BOX (vbox1), hbox1, FALSE, FALSE, 0);
858
859         label_outcharset = gtk_label_new (_("Outgoing codeset"));
860         gtk_widget_show (label_outcharset);
861         gtk_box_pack_start (GTK_BOX (hbox1), label_outcharset, FALSE, FALSE, 0);
862
863         optmenu = gtk_option_menu_new ();
864         gtk_widget_show (optmenu);
865         gtk_box_pack_start(GTK_BOX (hbox1), optmenu, FALSE, FALSE, 0);
866
867         optmenu_menu = gtk_menu_new ();
868
869 #define SET_MENUITEM(str, charset) \
870 { \
871         MENUITEM_ADD(optmenu_menu, menuitem, str, charset); \
872 }
873
874         SET_MENUITEM(_("Automatic"),                     CS_AUTO);
875         SET_MENUITEM(_("7bit ascii (US-ASCII)"),         CS_US_ASCII);
876 #if HAVE_LIBJCONV
877         SET_MENUITEM(_("Unicode (UTF-8)"),               CS_UTF_8);
878 #endif
879         SET_MENUITEM(_("Western European (ISO-8859-1)"), CS_ISO_8859_1);
880 #if HAVE_LIBJCONV
881         SET_MENUITEM(_("Central European (ISO-8859-2)"), CS_ISO_8859_2);
882         SET_MENUITEM(_("Baltic (ISO-8859-13)"),          CS_ISO_8859_13);
883         SET_MENUITEM(_("Baltic (ISO-8859-4)"),           CS_ISO_8859_4);
884         SET_MENUITEM(_("Greek (ISO-8859-7)"),            CS_ISO_8859_7);
885         SET_MENUITEM(_("Turkish (ISO-8859-9)"),          CS_ISO_8859_9);
886         SET_MENUITEM(_("Cyrillic (ISO-8859-5)"),         CS_ISO_8859_5);
887         SET_MENUITEM(_("Cyrillic (KOI8-R)"),             CS_KOI8_R);
888         SET_MENUITEM(_("Cyrillic (Windows-1251)"),       CS_CP1251);
889         SET_MENUITEM(_("Cyrillic (KOI8-U)"),             CS_KOI8_U);
890 #endif /* HAVE_LIBJCONV */
891         SET_MENUITEM(_("Japanese (ISO-2022-JP)"),        CS_ISO_2022_JP);
892 #if 0
893         SET_MENUITEM(_("Japanese (EUC-JP)"),             CS_EUC_JP);
894         SET_MENUITEM(_("Japanese (Shift_JIS)"),          CS_SHIFT_JIS);
895 #endif /* 0 */
896 #if HAVE_LIBJCONV
897         SET_MENUITEM(_("Simplified Chinese (GB2312)"),   CS_GB2312);
898         SET_MENUITEM(_("Traditional Chinese (Big5)"),    CS_BIG5);
899 #if 0
900         SET_MENUITEM(_("Traditional Chinese (EUC-TW)"),  CS_EUC_TW);
901         SET_MENUITEM(_("Chinese (ISO-2022-CN)"),         CS_ISO_2022_CN);
902 #endif /* 0 */
903         SET_MENUITEM(_("Korean (EUC-KR)"),               CS_EUC_KR);
904 #endif /* HAVE_LIBJCONV */
905
906         gtk_option_menu_set_menu (GTK_OPTION_MENU (optmenu), optmenu_menu);
907
908         send.checkbtn_sendext = checkbtn_sendext;
909         send.entry_sendext    = entry_sendext;
910         send.button_sendext   = button_sendext;
911
912         send.checkbtn_savemsg  = checkbtn_savemsg;
913         send.checkbtn_queuemsg = checkbtn_queuemsg;
914
915         send.optmenu_charset = optmenu;
916 }
917
918 static void prefs_compose_create(void)
919 {
920         GtkWidget *vbox1;
921         GtkWidget *frame_quote;
922         GtkWidget *vbox_quote;
923         GtkWidget *checkbtn_quote;
924         GtkWidget *hbox1;
925         GtkWidget *label_quotemark;
926         GtkWidget *entry_quotemark;
927         GtkWidget *hbox2;
928         GtkWidget *label_quotefmt;
929         GtkWidget *btn_quotedesc;
930         GtkWidget *scrolledwin_quotefmt;
931         GtkWidget *text_quotefmt;
932
933         GtkWidget *frame_sig;
934         GtkWidget *vbox_sig;
935         GtkWidget *checkbtn_autosig;
936         GtkWidget *label_sigsep;
937         GtkWidget *entry_sigsep;
938
939         GtkWidget *vbox_linewrap;
940         GtkWidget *hbox3;
941         GtkWidget *hbox4;
942         GtkWidget *label_linewrap;
943         GtkObject *spinbtn_linewrap_adj;
944         GtkWidget *spinbtn_linewrap;
945         GtkWidget *checkbtn_wrapquote;
946         GtkWidget *checkbtn_wrapatsend;
947
948         vbox1 = gtk_vbox_new (FALSE, VSPACING);
949         gtk_widget_show (vbox1);
950         gtk_container_add (GTK_CONTAINER (dialog.notebook), vbox1);
951         gtk_container_set_border_width (GTK_CONTAINER (vbox1), VBOX_BORDER);
952
953         PACK_FRAME(vbox1, frame_quote, _("Quotation"));
954
955         vbox_quote = gtk_vbox_new (FALSE, VSPACING_NARROW);
956         gtk_widget_show (vbox_quote);
957         gtk_container_add (GTK_CONTAINER (frame_quote), vbox_quote);
958         gtk_container_set_border_width (GTK_CONTAINER (vbox_quote), 8);
959
960         PACK_CHECK_BUTTON (vbox_quote, checkbtn_quote,
961                            _("Quote message when replying"));
962
963         hbox1 = gtk_hbox_new (FALSE, 8);
964         gtk_widget_show (hbox1);
965         gtk_box_pack_start (GTK_BOX (vbox_quote), hbox1, TRUE, TRUE, 0);
966
967         label_quotemark = gtk_label_new (_("Quotation mark"));
968         gtk_widget_show (label_quotemark);
969         gtk_box_pack_start (GTK_BOX (hbox1), label_quotemark, FALSE, FALSE, 0);
970
971         entry_quotemark = gtk_entry_new ();
972         gtk_widget_show (entry_quotemark);
973         gtk_box_pack_start (GTK_BOX (hbox1), entry_quotemark, FALSE, FALSE, 0);
974         gtk_widget_set_usize (entry_quotemark, 64, -1);
975
976         hbox2 = gtk_hbox_new (FALSE, 0);
977         gtk_widget_show (hbox2);
978         gtk_box_pack_start (GTK_BOX (vbox_quote), hbox2, TRUE, TRUE, 0);
979
980         label_quotefmt = gtk_label_new (_("Quotation format:"));
981         gtk_widget_show (label_quotefmt);
982         gtk_box_pack_start (GTK_BOX (hbox2), label_quotefmt, FALSE, FALSE, 0);
983
984         btn_quotedesc =
985                 gtk_button_new_with_label (_(" Description of symbols "));
986         gtk_widget_show (btn_quotedesc);
987         gtk_box_pack_end (GTK_BOX (hbox2), btn_quotedesc, FALSE, FALSE, 0);
988         gtk_signal_connect(GTK_OBJECT(btn_quotedesc), "clicked",
989                            GTK_SIGNAL_FUNC(prefs_quote_description), NULL);
990
991         scrolledwin_quotefmt = gtk_scrolled_window_new (NULL, NULL);
992         gtk_widget_show (scrolledwin_quotefmt);
993         gtk_box_pack_start (GTK_BOX (vbox_quote), scrolledwin_quotefmt, TRUE, TRUE, 0);
994         gtk_scrolled_window_set_policy
995                 (GTK_SCROLLED_WINDOW (scrolledwin_quotefmt),
996                  GTK_POLICY_NEVER, GTK_POLICY_ALWAYS);
997
998         text_quotefmt = gtk_text_new (NULL, NULL);
999         gtk_widget_show (text_quotefmt);
1000         gtk_container_add(GTK_CONTAINER(scrolledwin_quotefmt), text_quotefmt);
1001         gtk_text_set_editable (GTK_TEXT (text_quotefmt), TRUE);
1002         gtk_widget_set_usize(text_quotefmt, -1, 60);
1003
1004         PACK_FRAME(vbox1, frame_sig, _("Signature"));
1005
1006         vbox_sig = gtk_vbox_new (FALSE, VSPACING_NARROW);
1007         gtk_widget_show (vbox_sig);
1008         gtk_container_add (GTK_CONTAINER (frame_sig), vbox_sig);
1009         gtk_container_set_border_width (GTK_CONTAINER (vbox_sig), 8);
1010
1011         PACK_CHECK_BUTTON (vbox_sig, checkbtn_autosig,
1012                            _("Insert signature automatically"));
1013
1014         hbox1 = gtk_hbox_new (FALSE, 8);
1015         gtk_widget_show (hbox1);
1016         gtk_box_pack_start (GTK_BOX (vbox_sig), hbox1, TRUE, TRUE, 0);
1017
1018         label_sigsep = gtk_label_new (_("Signature separator"));
1019         gtk_widget_show (label_sigsep);
1020         gtk_box_pack_start (GTK_BOX (hbox1), label_sigsep, FALSE, FALSE, 0);
1021
1022         entry_sigsep = gtk_entry_new ();
1023         gtk_widget_show (entry_sigsep);
1024         gtk_box_pack_start (GTK_BOX (hbox1), entry_sigsep, FALSE, FALSE, 0);
1025         gtk_widget_set_usize (entry_sigsep, 64, -1);
1026
1027         /* line-wrapping */
1028         vbox_linewrap = gtk_vbox_new (FALSE, VSPACING_NARROW);
1029         gtk_widget_show (vbox_linewrap);
1030         gtk_box_pack_start (GTK_BOX (vbox1), vbox_linewrap, FALSE, FALSE, 0);
1031
1032         hbox3 = gtk_hbox_new (FALSE, 8);
1033         gtk_widget_show (hbox3);
1034         gtk_box_pack_start (GTK_BOX (vbox_linewrap), hbox3, FALSE, FALSE, 0);
1035
1036         label_linewrap = gtk_label_new (_("Wrap messages at"));
1037         gtk_widget_show (label_linewrap);
1038         gtk_box_pack_start (GTK_BOX (hbox3), label_linewrap, FALSE, FALSE, 0);
1039
1040         spinbtn_linewrap_adj = gtk_adjustment_new (72, 20, 1024, 1, 10, 10);
1041         spinbtn_linewrap = gtk_spin_button_new
1042                 (GTK_ADJUSTMENT (spinbtn_linewrap_adj), 1, 0);
1043         gtk_widget_show (spinbtn_linewrap);
1044         gtk_box_pack_start (GTK_BOX (hbox3), spinbtn_linewrap, FALSE, FALSE, 0);
1045         gtk_widget_set_usize (spinbtn_linewrap, 64, -1);
1046         gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (spinbtn_linewrap), TRUE);
1047
1048         label_linewrap = gtk_label_new (_("characters"));
1049         gtk_widget_show (label_linewrap);
1050         gtk_box_pack_start (GTK_BOX (hbox3), label_linewrap, FALSE, FALSE, 0);
1051
1052         hbox4 = gtk_hbox_new (FALSE, 32);
1053         gtk_widget_show (hbox4);
1054         gtk_box_pack_start (GTK_BOX (vbox_linewrap), hbox4, FALSE, FALSE, 0);
1055
1056         PACK_CHECK_BUTTON (hbox4, checkbtn_wrapquote, _("Wrap quotation"));
1057         PACK_CHECK_BUTTON
1058                 (hbox4, checkbtn_wrapatsend, _("Wrap before sending"));
1059
1060         compose.checkbtn_quote   = checkbtn_quote;
1061         compose.entry_quotemark  = entry_quotemark;
1062         compose.text_quotefmt    = text_quotefmt;
1063         compose.checkbtn_autosig = checkbtn_autosig;
1064         compose.entry_sigsep     = entry_sigsep;
1065
1066         compose.spinbtn_linewrap     = spinbtn_linewrap;
1067         compose.spinbtn_linewrap_adj = spinbtn_linewrap_adj;
1068         compose.checkbtn_wrapquote   = checkbtn_wrapquote;
1069         compose.checkbtn_wrapatsend  = checkbtn_wrapatsend;
1070 }
1071
1072 static void prefs_display_create(void)
1073 {
1074         GtkWidget *vbox1;
1075         GtkWidget *frame_font;
1076         GtkWidget *table1;
1077         GtkWidget *label_textfont;
1078         GtkWidget *entry_textfont;
1079         GtkWidget *button_textfont;
1080         GtkWidget *chkbtn_folder_unread;
1081         GtkWidget *chkbtn_transhdr;
1082         GtkWidget *frame_summary;
1083         GtkWidget *vbox2;
1084         GtkWidget *chkbtn_swapfrom;
1085         GtkWidget *chkbtn_hscrollbar;
1086         GtkWidget *hbox1;
1087         GtkWidget *button_dispitem;
1088
1089         vbox1 = gtk_vbox_new (FALSE, VSPACING);
1090         gtk_widget_show (vbox1);
1091         gtk_container_add (GTK_CONTAINER (dialog.notebook), vbox1);
1092         gtk_container_set_border_width (GTK_CONTAINER (vbox1), VBOX_BORDER);
1093
1094         PACK_FRAME(vbox1, frame_font, _("Font"));
1095
1096         table1 = gtk_table_new (1, 3, FALSE);
1097         gtk_widget_show (table1);
1098         gtk_container_add (GTK_CONTAINER (frame_font), table1);
1099         gtk_container_set_border_width (GTK_CONTAINER (table1), 8);
1100         gtk_table_set_row_spacings (GTK_TABLE (table1), 8);
1101         gtk_table_set_col_spacings (GTK_TABLE (table1), 8);
1102
1103         label_textfont = gtk_label_new (_("Text"));
1104         gtk_widget_show (label_textfont);
1105         gtk_table_attach (GTK_TABLE (table1), label_textfont, 0, 1, 0, 1,
1106                           GTK_FILL, (GTK_EXPAND | GTK_FILL), 0, 0);
1107
1108         entry_textfont = gtk_entry_new ();
1109         gtk_widget_show (entry_textfont);
1110         gtk_table_attach (GTK_TABLE (table1), entry_textfont, 1, 2, 0, 1,
1111                           (GTK_EXPAND | GTK_FILL), 0, 0, 0);
1112
1113         button_textfont = gtk_button_new_with_label ("... ");
1114         gtk_widget_show (button_textfont);
1115         gtk_table_attach (GTK_TABLE (table1), button_textfont, 2, 3, 0, 1,
1116                           0, 0, 0, 0);
1117         gtk_signal_connect (GTK_OBJECT (button_textfont), "clicked",
1118                             GTK_SIGNAL_FUNC (prefs_font_select), NULL);
1119
1120         vbox2 = gtk_vbox_new (FALSE, VSPACING_NARROW);
1121         gtk_widget_show (vbox2);
1122         gtk_box_pack_start (GTK_BOX (vbox1), vbox2, FALSE, TRUE, 0);
1123
1124         PACK_CHECK_BUTTON
1125                 (vbox2, chkbtn_transhdr,
1126                  _("Translate header name (such as `From:', `Subject:')"));
1127
1128         PACK_CHECK_BUTTON (vbox2, chkbtn_folder_unread,
1129                            _("Display unread number next to folder name"));
1130
1131         /* ---- Summary ---- */
1132
1133         PACK_FRAME(vbox1, frame_summary, _("Summary View"));
1134
1135         vbox2 = gtk_vbox_new (FALSE, VSPACING_NARROW);
1136         gtk_widget_show (vbox2);
1137         gtk_container_add (GTK_CONTAINER (frame_summary), vbox2);
1138         gtk_container_set_border_width (GTK_CONTAINER (vbox2), 8);
1139
1140         PACK_CHECK_BUTTON
1141                 (vbox2, chkbtn_swapfrom,
1142                  _("Display recipient on `From' column if sender is yourself"));
1143         PACK_CHECK_BUTTON
1144                 (vbox2, chkbtn_hscrollbar, _("Enable horizontal scroll bar"));
1145
1146         hbox1 = gtk_hbox_new (FALSE, 8);
1147         gtk_widget_show (hbox1);
1148         gtk_box_pack_start (GTK_BOX (vbox2), hbox1, FALSE, TRUE, 0);
1149
1150         button_dispitem = gtk_button_new_with_label
1151                 (_(" Set display item of summary... "));
1152         gtk_widget_show (button_dispitem);
1153         gtk_box_pack_start (GTK_BOX (hbox1), button_dispitem, FALSE, TRUE, 0);
1154         gtk_signal_connect (GTK_OBJECT (button_dispitem), "clicked",
1155                             GTK_SIGNAL_FUNC (prefs_summary_display_item_set),
1156                             NULL);
1157
1158         display.entry_textfont  = entry_textfont;
1159         display.button_textfont = button_textfont;
1160
1161         display.chkbtn_folder_unread = chkbtn_folder_unread;
1162
1163         display.chkbtn_transhdr   = chkbtn_transhdr;
1164         display.chkbtn_swapfrom   = chkbtn_swapfrom;
1165         display.chkbtn_hscrollbar = chkbtn_hscrollbar;
1166 }
1167
1168 static void prefs_message_create(void)
1169 {
1170         GtkWidget *vbox1;
1171         GtkWidget *vbox2;
1172         GtkWidget *hbox1;
1173         GtkWidget *chkbtn_enablecol;
1174         GtkWidget *button_edit_col;
1175         GtkWidget *chkbtn_mbalnum;
1176         GtkWidget *chkbtn_disphdrpane;
1177         GtkWidget *chkbtn_disphdr;
1178         GtkWidget *hbox_linespc;
1179         GtkWidget *label_linespc;
1180         GtkObject *spinbtn_linespc_adj;
1181         GtkWidget *spinbtn_linespc;
1182         GtkWidget *chkbtn_headspc;
1183
1184         GtkWidget *frame_scr;
1185         GtkWidget *vbox_scr;
1186         GtkWidget *chkbtn_smoothscroll;
1187         GtkWidget *hbox_scr;
1188         GtkWidget *label_scr;
1189         GtkObject *spinbtn_scrollstep_adj;
1190         GtkWidget *spinbtn_scrollstep;
1191         GtkWidget *chkbtn_halfpage;
1192
1193         vbox1 = gtk_vbox_new (FALSE, VSPACING);
1194         gtk_widget_show (vbox1);
1195         gtk_container_add (GTK_CONTAINER (dialog.notebook), vbox1);
1196         gtk_container_set_border_width (GTK_CONTAINER (vbox1), VBOX_BORDER);
1197
1198         hbox1 = gtk_hbox_new (FALSE, 8);
1199         gtk_widget_show (hbox1);
1200         gtk_box_pack_start (GTK_BOX (vbox1), hbox1, FALSE, TRUE, 0);
1201
1202         PACK_CHECK_BUTTON (hbox1, chkbtn_enablecol,
1203                            _("Enable coloration of message"));
1204         gtk_signal_connect (GTK_OBJECT (chkbtn_enablecol), "toggled",
1205                                                 GTK_SIGNAL_FUNC (prefs_enable_message_color_toggled),
1206                                                 NULL);
1207
1208         button_edit_col = gtk_button_new_with_label (_(" Edit... "));
1209         gtk_widget_show (button_edit_col);
1210         gtk_box_pack_end (GTK_BOX (hbox1), button_edit_col, FALSE, TRUE, 0);
1211         gtk_signal_connect (GTK_OBJECT (button_edit_col), "clicked",
1212                             GTK_SIGNAL_FUNC (prefs_quote_colors_dialog), NULL);
1213
1214         SET_TOGGLE_SENSITIVITY(chkbtn_enablecol, button_edit_col);
1215
1216         vbox2 = gtk_vbox_new (FALSE, VSPACING_NARROW);
1217         gtk_widget_show (vbox2);
1218         gtk_box_pack_start (GTK_BOX (vbox1), vbox2, FALSE, FALSE, 0);
1219
1220         PACK_CHECK_BUTTON
1221                 (vbox2, chkbtn_mbalnum,
1222                  _("Display 2-byte alphabet and numeric with 1-byte character"));
1223         PACK_CHECK_BUTTON(vbox2, chkbtn_disphdrpane,
1224                           _("Display header pane above message view"));
1225         PACK_CHECK_BUTTON(vbox2, chkbtn_disphdr,
1226                           _("Display short headers on message view"));
1227
1228         hbox1 = gtk_hbox_new (FALSE, 32);
1229         gtk_widget_show (hbox1);
1230         gtk_box_pack_start (GTK_BOX (vbox2), hbox1, FALSE, TRUE, 0);
1231
1232         hbox_linespc = gtk_hbox_new (FALSE, 8);
1233         gtk_widget_show (hbox1);
1234         gtk_box_pack_start (GTK_BOX (hbox1), hbox_linespc, FALSE, TRUE, 0);
1235
1236         label_linespc = gtk_label_new (_("Line space"));
1237         gtk_widget_show (label_linespc);
1238         gtk_box_pack_start (GTK_BOX (hbox_linespc), label_linespc,
1239                             FALSE, FALSE, 0);
1240
1241         spinbtn_linespc_adj = gtk_adjustment_new (2, 0, 16, 1, 1, 16);
1242         spinbtn_linespc = gtk_spin_button_new
1243                 (GTK_ADJUSTMENT (spinbtn_linespc_adj), 1, 0);
1244         gtk_widget_show (spinbtn_linespc);
1245         gtk_box_pack_start (GTK_BOX (hbox_linespc), spinbtn_linespc,
1246                             FALSE, FALSE, 0);
1247         gtk_widget_set_usize (spinbtn_linespc, 64, -1);
1248         gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (spinbtn_linespc), TRUE);
1249
1250         label_linespc = gtk_label_new (_("pixel(s)"));
1251         gtk_widget_show (label_linespc);
1252         gtk_box_pack_start (GTK_BOX (hbox_linespc), label_linespc,
1253                             FALSE, FALSE, 0);
1254
1255         PACK_CHECK_BUTTON(hbox1, chkbtn_headspc, _("Leave space on head"));
1256
1257         PACK_FRAME(vbox1, frame_scr, _("Scroll"));
1258
1259         vbox_scr = gtk_vbox_new (FALSE, VSPACING_NARROW);
1260         gtk_widget_show (vbox_scr);
1261         gtk_container_add (GTK_CONTAINER (frame_scr), vbox_scr);
1262         gtk_container_set_border_width (GTK_CONTAINER (vbox_scr), 8);
1263
1264         PACK_CHECK_BUTTON(vbox_scr, chkbtn_halfpage, _("Half page"));
1265
1266         hbox1 = gtk_hbox_new (FALSE, 32);
1267         gtk_widget_show (hbox1);
1268         gtk_box_pack_start (GTK_BOX (vbox_scr), hbox1, FALSE, TRUE, 0);
1269
1270         PACK_CHECK_BUTTON(hbox1, chkbtn_smoothscroll, _("Smooth scroll"));
1271
1272         hbox_scr = gtk_hbox_new (FALSE, 8);
1273         gtk_widget_show (hbox_scr);
1274         gtk_box_pack_start (GTK_BOX (hbox1), hbox_scr, FALSE, FALSE, 0);
1275
1276         label_scr = gtk_label_new (_("Step"));
1277         gtk_widget_show (label_scr);
1278         gtk_box_pack_start (GTK_BOX (hbox_scr), label_scr, FALSE, FALSE, 0);
1279
1280         spinbtn_scrollstep_adj = gtk_adjustment_new (1, 1, 100, 1, 10, 10);
1281         spinbtn_scrollstep = gtk_spin_button_new
1282                 (GTK_ADJUSTMENT (spinbtn_scrollstep_adj), 1, 0);
1283         gtk_widget_show (spinbtn_scrollstep);
1284         gtk_box_pack_start (GTK_BOX (hbox_scr), spinbtn_scrollstep,
1285                             FALSE, FALSE, 0);
1286         gtk_widget_set_usize (spinbtn_scrollstep, 64, -1);
1287         gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (spinbtn_scrollstep),
1288                                      TRUE);
1289
1290         label_scr = gtk_label_new (_("pixel(s)"));
1291         gtk_widget_show (label_scr);
1292         gtk_box_pack_start (GTK_BOX (hbox_scr), label_scr, FALSE, FALSE, 0);
1293
1294         SET_TOGGLE_SENSITIVITY (chkbtn_smoothscroll, hbox_scr)
1295
1296         message.chkbtn_enablecol   = chkbtn_enablecol;
1297         message.button_edit_col    = button_edit_col;
1298         message.chkbtn_mbalnum     = chkbtn_mbalnum;
1299         message.chkbtn_disphdrpane = chkbtn_disphdrpane;
1300         message.chkbtn_disphdr     = chkbtn_disphdr;
1301         message.spinbtn_linespc    = spinbtn_linespc;
1302         message.chkbtn_headspc     = chkbtn_headspc;
1303
1304         message.chkbtn_smoothscroll    = chkbtn_smoothscroll;
1305         message.spinbtn_scrollstep     = spinbtn_scrollstep;
1306         message.spinbtn_scrollstep_adj = spinbtn_scrollstep_adj;
1307         message.chkbtn_halfpage        = chkbtn_halfpage;
1308 }
1309
1310 #if USE_GPGME
1311 static void prefs_privacy_create(void)
1312 {
1313         GtkWidget *vbox1;
1314         GtkWidget *vbox2;
1315         GtkWidget *hbox1;
1316         GtkWidget *checkbtn_default_encrypt;
1317         GtkWidget *checkbtn_default_sign;
1318         GtkWidget *checkbtn_auto_check_signatures;
1319         GtkWidget *checkbtn_passphrase_grab;
1320         GtkWidget *label;
1321         GtkWidget *menuitem;
1322         GtkWidget *optmenu;
1323         GtkWidget *optmenu_menu;
1324
1325         vbox1 = gtk_vbox_new (FALSE, VSPACING);
1326         gtk_widget_show (vbox1);
1327         gtk_container_add (GTK_CONTAINER (dialog.notebook), vbox1);
1328         gtk_container_set_border_width (GTK_CONTAINER (vbox1), VBOX_BORDER);
1329
1330         vbox2 = gtk_vbox_new (FALSE, VSPACING_NARROW);
1331         gtk_widget_show (vbox2);
1332         gtk_box_pack_start (GTK_BOX (vbox1), vbox2, FALSE, FALSE, 0);
1333
1334         PACK_CHECK_BUTTON (vbox2, checkbtn_default_encrypt,
1335                            _("Encrypt message by default"));
1336
1337         PACK_CHECK_BUTTON (vbox2, checkbtn_default_sign,
1338                            _("Sign message by default"));
1339
1340         PACK_CHECK_BUTTON (vbox2, checkbtn_auto_check_signatures,
1341                            _("Automatically check signatures"));
1342
1343         PACK_CHECK_BUTTON (vbox2, checkbtn_passphrase_grab,
1344                            _("Grab input while entering a passphrase"));
1345
1346         hbox1 = gtk_hbox_new (FALSE, 8);
1347         gtk_widget_show (hbox1);
1348         gtk_box_pack_start (GTK_BOX (vbox1), hbox1, FALSE, FALSE, 0);
1349
1350         /* create default signkey box */
1351         label = gtk_label_new (_("Default Sign Key"));
1352         gtk_widget_show (label);
1353         gtk_box_pack_start (GTK_BOX (hbox1), label, FALSE, FALSE, 0);
1354         optmenu = gtk_option_menu_new ();
1355         gtk_widget_show (optmenu);
1356         gtk_box_pack_start(GTK_BOX (hbox1), optmenu, FALSE, FALSE, 0);
1357         optmenu_menu = gtk_menu_new ();
1358
1359         MENUITEM_ADD(optmenu_menu, menuitem, "Default Key", "def_key");
1360         MENUITEM_ADD(optmenu_menu, menuitem, "Second Key", "2nd_key");
1361         gtk_option_menu_set_menu (GTK_OPTION_MENU (optmenu), optmenu_menu);
1362         /* FIXME: disabled because not implemented */
1363         gtk_widget_set_sensitive(optmenu, FALSE);
1364
1365         privacy.checkbtn_default_encrypt = checkbtn_default_encrypt;
1366         privacy.checkbtn_default_sign    = checkbtn_default_sign;
1367         privacy.checkbtn_auto_check_signatures
1368                                          = checkbtn_auto_check_signatures;
1369         privacy.checkbtn_passphrase_grab = checkbtn_passphrase_grab;
1370         privacy.optmenu_default_signkey  = optmenu;
1371 }
1372
1373 static void
1374 prefs_common_default_signkey_set_data_from_optmenu(PrefParam *pparam)
1375 {
1376 #if 0
1377         GtkWidget *menu;
1378         GtkWidget *menuitem;
1379         gchar *charset;
1380
1381         menu = gtk_option_menu_get_menu(GTK_OPTION_MENU(*pparam->widget));
1382         menuitem = gtk_menu_get_active(GTK_MENU(menu));
1383         charset = gtk_object_get_user_data(GTK_OBJECT(menuitem));
1384         g_free(*((gchar **)pparam->data));
1385         *((gchar **)pparam->data) = g_strdup(charset);
1386 #endif
1387 }
1388
1389 static void prefs_common_default_signkey_set_optmenu(PrefParam *pparam)
1390 {
1391 #if 0
1392         GList *cur;
1393         GtkOptionMenu *optmenu = GTK_OPTION_MENU(*pparam->widget);
1394         GtkWidget *menu;
1395         GtkWidget *menuitem;
1396         gchar *charset;
1397         gint n = 0;
1398
1399         g_return_if_fail(optmenu != NULL);
1400         g_return_if_fail(*((gchar **)pparam->data) != NULL);
1401
1402         menu = gtk_option_menu_get_menu(optmenu);
1403         for (cur = GTK_MENU_SHELL(menu)->children;
1404              cur != NULL; cur = cur->next) {
1405                 menuitem = GTK_WIDGET(cur->data);
1406                 charset = gtk_object_get_user_data(GTK_OBJECT(menuitem));
1407                 if (!strcmp(charset, *((gchar **)pparam->data))) {
1408                         gtk_option_menu_set_history(optmenu, n);
1409                         return;
1410                 }
1411                 n++;
1412         }
1413
1414         gtk_option_menu_set_history(optmenu, 0);
1415         prefs_common_charset_set_data_from_optmenu(pparam);
1416 #endif
1417 }
1418 #endif /* USE_GPGME */
1419
1420 static void prefs_interface_create(void)
1421 {
1422         GtkWidget *vbox1;
1423         GtkWidget *vbox2;
1424         GtkWidget *vbox3;
1425         GtkWidget *checkbtn_emacs;
1426         GtkWidget *checkbtn_openunread;
1427         GtkWidget *checkbtn_openinbox;
1428         GtkWidget *checkbtn_immedexec;
1429         GtkWidget *checkbtn_addaddrbyclick;
1430         GtkWidget *label;
1431
1432         GtkWidget *frame_exit;
1433         GtkWidget *vbox_exit;
1434         GtkWidget *hbox1;
1435         GtkWidget *checkbtn_confonexit;
1436         GtkWidget *checkbtn_cleanonexit;
1437         GtkWidget *checkbtn_askonclean;
1438         GtkWidget *checkbtn_warnqueued;
1439
1440         vbox1 = gtk_vbox_new (FALSE, VSPACING);
1441         gtk_widget_show (vbox1);
1442         gtk_container_add (GTK_CONTAINER (dialog.notebook), vbox1);
1443         gtk_container_set_border_width (GTK_CONTAINER (vbox1), VBOX_BORDER);
1444
1445         vbox2 = gtk_vbox_new (FALSE, VSPACING_NARROW);
1446         gtk_widget_show (vbox2);
1447         gtk_box_pack_start (GTK_BOX (vbox1), vbox2, FALSE, FALSE, 0);
1448
1449         PACK_CHECK_BUTTON (vbox2, checkbtn_emacs,
1450                            _("Emulate the behavior of mouse operation of\n"
1451                              "Emacs-based mailer"));
1452         gtk_label_set_justify (GTK_LABEL (GTK_BIN (checkbtn_emacs)->child),
1453                                GTK_JUSTIFY_LEFT);
1454
1455         PACK_CHECK_BUTTON
1456                 (vbox2, checkbtn_openunread,
1457                  _("Open first unread message when entering a folder"));
1458
1459         PACK_CHECK_BUTTON
1460                 (vbox2, checkbtn_openinbox,
1461                  _("Go to inbox after receiving new mail"));
1462
1463         vbox3 = gtk_vbox_new (FALSE, 0);
1464         gtk_widget_show (vbox3);
1465         gtk_box_pack_start (GTK_BOX (vbox2), vbox3, FALSE, FALSE, 0);
1466
1467         PACK_CHECK_BUTTON
1468                 (vbox3, checkbtn_immedexec,
1469                  _("Execute immediately when moving or deleting messages"));
1470
1471         hbox1 = gtk_hbox_new (FALSE, 0);
1472         gtk_widget_show (hbox1);
1473         gtk_box_pack_start (GTK_BOX (vbox3), hbox1, FALSE, FALSE, 0);
1474
1475         label = gtk_label_new
1476                 (_("(Messages will be just marked till execution\n"
1477                    " if this is turned off)"));
1478         gtk_box_pack_start (GTK_BOX (hbox1), label, FALSE, FALSE, 8);
1479         gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT);
1480
1481         PACK_CHECK_BUTTON
1482                 (vbox2, checkbtn_addaddrbyclick,
1483                  _("Add address to destination when double-clicked"));
1484
1485         PACK_FRAME (vbox1, frame_exit, _("On exit"));
1486
1487         vbox_exit = gtk_vbox_new (FALSE, VSPACING_NARROW);
1488         gtk_widget_show (vbox_exit);
1489         gtk_container_add (GTK_CONTAINER (frame_exit), vbox_exit);
1490         gtk_container_set_border_width (GTK_CONTAINER (vbox_exit), 8);
1491
1492         PACK_CHECK_BUTTON (vbox_exit, checkbtn_confonexit,
1493                            _("Confirm on exit"));
1494
1495         hbox1 = gtk_hbox_new (FALSE, 32);
1496         gtk_widget_show (hbox1);
1497         gtk_box_pack_start (GTK_BOX (vbox_exit), hbox1, FALSE, FALSE, 0);
1498
1499         PACK_CHECK_BUTTON (hbox1, checkbtn_cleanonexit,
1500                            _("Empty trash on exit"));
1501         PACK_CHECK_BUTTON (hbox1, checkbtn_askonclean,
1502                            _("Ask before emptying"));
1503         SET_TOGGLE_SENSITIVITY (checkbtn_cleanonexit, checkbtn_askonclean);
1504
1505         PACK_CHECK_BUTTON (vbox_exit, checkbtn_warnqueued,
1506                            _("Warn if there are queued messages on exit"));
1507
1508         interface.checkbtn_emacs          = checkbtn_emacs;
1509         interface.checkbtn_openunread     = checkbtn_openunread;
1510         interface.checkbtn_openinbox      = checkbtn_openinbox;
1511         interface.checkbtn_immedexec      = checkbtn_immedexec;
1512         interface.checkbtn_addaddrbyclick = checkbtn_addaddrbyclick;
1513         interface.checkbtn_confonexit     = checkbtn_confonexit;
1514         interface.checkbtn_cleanonexit    = checkbtn_cleanonexit;
1515         interface.checkbtn_askonclean     = checkbtn_askonclean;
1516         interface.checkbtn_warnqueued     = checkbtn_warnqueued;
1517 }
1518
1519 static void prefs_other_create(void)
1520 {
1521         GtkWidget *vbox1;
1522         GtkWidget *hbox1;
1523
1524         GtkWidget *uri_frame;
1525         GtkWidget *uri_label;
1526         GtkWidget *uri_combo;
1527         GtkWidget *uri_entry;
1528
1529         GtkWidget *print_frame;
1530         GtkWidget *printcmd_label;
1531         GtkWidget *printcmd_entry;
1532
1533         GtkWidget *exteditor_frame;
1534         GtkWidget *exteditor_label;
1535         GtkWidget *exteditor_combo;
1536         GtkWidget *exteditor_entry;
1537
1538         vbox1 = gtk_vbox_new (FALSE, VSPACING);
1539         gtk_widget_show (vbox1);
1540         gtk_container_add (GTK_CONTAINER (dialog.notebook), vbox1);
1541         gtk_container_set_border_width (GTK_CONTAINER (vbox1), VBOX_BORDER);
1542
1543         PACK_FRAME(vbox1, uri_frame,
1544                    _("External Web browser (%s will be replaced with URI)"));
1545
1546         hbox1 = gtk_hbox_new (FALSE, 8);
1547         gtk_widget_show (hbox1);
1548         gtk_container_add (GTK_CONTAINER (uri_frame), hbox1);
1549         gtk_container_set_border_width (GTK_CONTAINER (hbox1), 8);
1550
1551         uri_label = gtk_label_new (_("Command"));
1552         gtk_widget_show(uri_label);
1553         gtk_box_pack_start (GTK_BOX (hbox1), uri_label, FALSE, TRUE, 0);
1554
1555         uri_combo = gtk_combo_new ();
1556         gtk_widget_show (uri_combo);
1557         gtk_box_pack_start (GTK_BOX (hbox1), uri_combo, TRUE, TRUE, 0);
1558         gtkut_combo_set_items (GTK_COMBO (uri_combo),
1559                                "netscape -remote 'openURL(%s,raise)'",
1560                                "gnome-moz-remote --raise --newwin '%s'",
1561                                "kterm -e w3m '%s'",
1562                                "kterm -e lynx '%s'",
1563                                NULL);
1564
1565         uri_entry = GTK_COMBO (uri_combo)->entry;
1566
1567         PACK_FRAME(vbox1, print_frame,
1568                    _("Printing (%s will be replaced with file name)"));
1569
1570         hbox1 = gtk_hbox_new (FALSE, 8);
1571         gtk_widget_show (hbox1);
1572         gtk_container_add (GTK_CONTAINER (print_frame), hbox1);
1573         gtk_container_set_border_width (GTK_CONTAINER (hbox1), 8);
1574
1575         printcmd_label = gtk_label_new (_("Command"));
1576         gtk_widget_show (printcmd_label);
1577         gtk_box_pack_start (GTK_BOX (hbox1), printcmd_label, FALSE, FALSE, 0);
1578
1579         printcmd_entry = gtk_entry_new ();
1580         gtk_widget_show (printcmd_entry);
1581         gtk_box_pack_start (GTK_BOX (hbox1), printcmd_entry, TRUE, TRUE, 0);
1582
1583         PACK_FRAME(vbox1, exteditor_frame,
1584                    _("External editor (%s will be replaced with file name)"));
1585
1586         hbox1 = gtk_hbox_new (FALSE, 8);
1587         gtk_widget_show (hbox1);
1588         gtk_container_add (GTK_CONTAINER (exteditor_frame), hbox1);
1589         gtk_container_set_border_width (GTK_CONTAINER (hbox1), 8);
1590
1591         exteditor_label = gtk_label_new (_("Command"));
1592         gtk_widget_show (exteditor_label);
1593         gtk_box_pack_start (GTK_BOX (hbox1), exteditor_label, FALSE, FALSE, 0);
1594
1595         exteditor_combo = gtk_combo_new ();
1596         gtk_widget_show (exteditor_combo);
1597         gtk_box_pack_start (GTK_BOX (hbox1), exteditor_combo, TRUE, TRUE, 0);
1598         gtkut_combo_set_items (GTK_COMBO (exteditor_combo),
1599                                "gedit %s",
1600                                "mgedit --no-fork %s",
1601                                "emacs %s",
1602                                "xemacs %s",
1603                                "kterm -e jed %s",
1604                                "kterm -e vi %s",
1605                                NULL);
1606         exteditor_entry = GTK_COMBO (exteditor_combo)->entry;
1607
1608         other.uri_combo = uri_combo;
1609         other.uri_entry = uri_entry;
1610         other.printcmd_entry = printcmd_entry;
1611
1612         other.exteditor_combo = exteditor_combo;
1613         other.exteditor_entry = exteditor_entry;
1614 }
1615
1616 void prefs_quote_colors_dialog(void)
1617 {
1618         if (!quote_color_win)
1619                 prefs_quote_colors_dialog_create();
1620         gtk_widget_show(quote_color_win);
1621
1622         gtk_main();
1623         gtk_widget_hide(quote_color_win);
1624
1625         textview_update_message_colors();
1626 }
1627
1628 static void prefs_quote_colors_dialog_create(void)
1629 {
1630         GtkWidget *window;
1631         GtkWidget *vbox;
1632         GtkWidget *table;
1633         GtkWidget *quotelevel1_label;
1634         GtkWidget *quotelevel2_label;
1635         GtkWidget *quotelevel3_label;
1636         GtkWidget *uri_label;
1637         GtkWidget *hbbox;
1638         GtkWidget *ok_btn;
1639         //GtkWidget *cancel_btn;
1640         GtkWidget *recycle_colors_btn;
1641         GtkWidget *frame_colors;
1642
1643         window = gtk_window_new(GTK_WINDOW_DIALOG);
1644         gtk_container_set_border_width(GTK_CONTAINER(window), 2);
1645         gtk_window_set_title(GTK_WINDOW(window), _("Set message colors"));
1646         gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);
1647         gtk_window_set_modal(GTK_WINDOW(window), TRUE);
1648         gtk_window_set_policy(GTK_WINDOW(window), FALSE, TRUE, FALSE);
1649
1650         vbox = gtk_vbox_new (FALSE, VSPACING);
1651         gtk_container_add (GTK_CONTAINER (window), vbox);
1652         gtk_container_set_border_width (GTK_CONTAINER (vbox), 8);
1653         PACK_FRAME(vbox, frame_colors, _("Colors"));
1654
1655         table = gtk_table_new (4, 2, FALSE);
1656         gtk_container_add (GTK_CONTAINER (frame_colors), table);
1657         gtk_container_set_border_width (GTK_CONTAINER (table), 8);
1658         gtk_table_set_row_spacings (GTK_TABLE (table), 2);
1659         gtk_table_set_col_spacings (GTK_TABLE (table), 4);
1660
1661 /*      gtk_box_pack_start(GTK_BOX(vbox), table, FALSE, FALSE, 0); */
1662
1663         color_buttons.quote_level1_btn = gtk_button_new();
1664         gtk_table_attach(GTK_TABLE (table), color_buttons.quote_level1_btn, 0, 1, 0, 1,
1665                                         (GtkAttachOptions) (0),
1666                                         (GtkAttachOptions) (0), 0, 0);
1667         gtk_widget_set_usize (color_buttons.quote_level1_btn, 40, 30);
1668         gtk_container_set_border_width (GTK_CONTAINER (color_buttons.quote_level1_btn), 5);
1669
1670         color_buttons.quote_level2_btn = gtk_button_new();
1671         gtk_table_attach(GTK_TABLE (table), color_buttons.quote_level2_btn, 0, 1, 1, 2,
1672                                         (GtkAttachOptions) (0),
1673                                         (GtkAttachOptions) (0), 0, 0);
1674         gtk_widget_set_usize (color_buttons.quote_level2_btn, 40, 30);
1675         gtk_container_set_border_width (GTK_CONTAINER (color_buttons.quote_level2_btn), 5);
1676
1677         color_buttons.quote_level3_btn = gtk_button_new_with_label ("");
1678         gtk_table_attach(GTK_TABLE (table), color_buttons.quote_level3_btn, 0, 1, 2, 3,
1679                                         (GtkAttachOptions) (0),
1680                                         (GtkAttachOptions) (0), 0, 0);
1681         gtk_widget_set_usize (color_buttons.quote_level3_btn, 40, 30);
1682         gtk_container_set_border_width (GTK_CONTAINER (color_buttons.quote_level3_btn), 5);
1683
1684         color_buttons.uri_btn = gtk_button_new_with_label ("");
1685         gtk_table_attach(GTK_TABLE (table), color_buttons.uri_btn, 0, 1, 3, 4,
1686                                         (GtkAttachOptions) (0),
1687                                         (GtkAttachOptions) (0), 0, 0);
1688         gtk_widget_set_usize (color_buttons.uri_btn, 40, 30);
1689         gtk_container_set_border_width (GTK_CONTAINER (color_buttons.uri_btn), 5);
1690
1691         quotelevel1_label = gtk_label_new (_("Quoted Text - First Level"));
1692         gtk_table_attach(GTK_TABLE (table), quotelevel1_label, 1, 2, 0, 1,
1693                                         (GTK_EXPAND | GTK_FILL), 0, 0, 0);
1694         gtk_label_set_justify (GTK_LABEL (quotelevel1_label), GTK_JUSTIFY_LEFT);
1695         gtk_misc_set_alignment (GTK_MISC (quotelevel1_label), 0, 0.5);
1696
1697         quotelevel2_label = gtk_label_new (_("Quoted Text - Second Level"));
1698         gtk_table_attach(GTK_TABLE (table), quotelevel2_label, 1, 2, 1, 2,
1699                                         (GTK_EXPAND | GTK_FILL), 0, 0, 0);
1700         gtk_label_set_justify (GTK_LABEL (quotelevel2_label), GTK_JUSTIFY_LEFT);
1701         gtk_misc_set_alignment (GTK_MISC (quotelevel2_label), 0, 0.5);
1702
1703         quotelevel3_label = gtk_label_new (_("Quoted Text - Third Level"));
1704         gtk_table_attach(GTK_TABLE (table), quotelevel3_label, 1, 2, 2, 3,
1705                                         (GTK_EXPAND | GTK_FILL), 0, 0, 0);
1706         gtk_label_set_justify (GTK_LABEL (quotelevel3_label), GTK_JUSTIFY_LEFT);
1707         gtk_misc_set_alignment (GTK_MISC (quotelevel3_label), 0, 0.5);
1708
1709         uri_label = gtk_label_new (_("URI link"));
1710         gtk_table_attach(GTK_TABLE (table), uri_label, 1, 2, 3, 4,
1711                                         (GTK_EXPAND | GTK_FILL), 0, 0, 0);
1712         gtk_label_set_justify (GTK_LABEL (uri_label), GTK_JUSTIFY_LEFT);
1713         gtk_misc_set_alignment (GTK_MISC (uri_label), 0, 0.5);
1714
1715         PACK_CHECK_BUTTON (vbox, recycle_colors_btn,
1716                            _("Recycle quote colors"));
1717
1718         gtkut_button_set_create(&hbbox, &ok_btn, _("OK"),
1719                                 NULL, NULL, NULL, NULL);
1720         gtk_box_pack_end(GTK_BOX(vbox), hbbox, FALSE, FALSE, 0);
1721
1722         gtk_widget_grab_default(ok_btn);
1723         gtk_signal_connect(GTK_OBJECT(ok_btn), "clicked",
1724                                         GTK_SIGNAL_FUNC(gtk_main_quit), NULL);
1725         gtk_signal_connect(GTK_OBJECT(window), "delete_event",
1726                                         GTK_SIGNAL_FUNC(gtk_main_quit), NULL);
1727
1728         gtk_signal_connect(GTK_OBJECT(color_buttons.quote_level1_btn), "clicked",
1729                            GTK_SIGNAL_FUNC(quote_color_set_dialog), "LEVEL1");
1730         gtk_signal_connect(GTK_OBJECT(color_buttons.quote_level2_btn), "clicked",
1731                            GTK_SIGNAL_FUNC(quote_color_set_dialog), "LEVEL2");
1732         gtk_signal_connect(GTK_OBJECT(color_buttons.quote_level3_btn), "clicked",
1733                            GTK_SIGNAL_FUNC(quote_color_set_dialog), "LEVEL3");
1734         gtk_signal_connect(GTK_OBJECT(color_buttons.uri_btn), "clicked",
1735                            GTK_SIGNAL_FUNC(quote_color_set_dialog), "URI");
1736         gtk_signal_connect(GTK_OBJECT(recycle_colors_btn), "toggled",
1737                            GTK_SIGNAL_FUNC(prefs_recycle_colors_toggled), NULL);
1738
1739         /* show message button colors and recycle options */
1740         set_button_bg_color(color_buttons.quote_level1_btn,
1741                             prefs_common.quote_level1_col);
1742         set_button_bg_color(color_buttons.quote_level2_btn,
1743                             prefs_common.quote_level2_col);
1744         set_button_bg_color(color_buttons.quote_level3_btn,
1745                             prefs_common.quote_level3_col);
1746         set_button_bg_color(color_buttons.uri_btn,
1747                             prefs_common.uri_col);
1748         gtk_toggle_button_set_active((GtkToggleButton *)recycle_colors_btn,
1749                                      prefs_common.recycle_quote_colors);
1750
1751         gtk_widget_show_all(vbox);
1752         quote_color_win = window;
1753 }
1754
1755 static void quote_color_set_dialog(GtkWidget *widget, gpointer data)
1756 {
1757         gchar *type = (gchar *)data;
1758         gchar *title = NULL;
1759         gdouble color[4] = {0.0, 0.0, 0.0, 0.0};
1760         gint rgbvalue = 0;
1761         GtkColorSelectionDialog *dialog;
1762
1763         if(g_strcasecmp(type, "LEVEL1") == 0) {
1764                 title = _("Pick color for quotation level 1");
1765                 rgbvalue = prefs_common.quote_level1_col;
1766         } else if(g_strcasecmp(type, "LEVEL2") == 0) {
1767                 title = _("Pick color for quotation level 2");
1768                 rgbvalue = prefs_common.quote_level2_col;
1769         } else if(g_strcasecmp(type, "LEVEL3") == 0) {
1770                 title = _("Pick color for quotation level 3");
1771                 rgbvalue = prefs_common.quote_level3_col;
1772         } else if(g_strcasecmp(type, "URI") == 0) {
1773                 title = _("Pick color for URI");
1774                 rgbvalue = prefs_common.uri_col;
1775         } else {   /* Should never be called */
1776                 fprintf(stderr, "Unrecognized datatype '%s' in quote_color_set_dialog\n", type);
1777                 return;
1778         }
1779
1780         color_dialog = gtk_color_selection_dialog_new(title);
1781         gtk_window_set_position(GTK_WINDOW(color_dialog), GTK_WIN_POS_CENTER);
1782         gtk_window_set_modal(GTK_WINDOW(color_dialog), TRUE);
1783         gtk_window_set_policy(GTK_WINDOW(color_dialog), FALSE, FALSE, FALSE);
1784
1785         gtk_signal_connect(GTK_OBJECT(((GtkColorSelectionDialog *)color_dialog)->ok_button),
1786                            "clicked", GTK_SIGNAL_FUNC(quote_colors_set_dialog_ok), data);
1787         gtk_signal_connect(GTK_OBJECT(((GtkColorSelectionDialog *)color_dialog)->cancel_button),
1788                            "clicked", GTK_SIGNAL_FUNC(quote_colors_set_dialog_cancel), data);
1789
1790         /* preselect the previous color in the color selection dialog */
1791         color[0] = (gdouble) ((rgbvalue & 0xff0000) >> 16) / 255.0;
1792         color[1] = (gdouble) ((rgbvalue & 0x00ff00) >>  8) / 255.0;
1793         color[2] = (gdouble)  (rgbvalue & 0x0000ff)        / 255.0;
1794         dialog = (GtkColorSelectionDialog *)color_dialog;
1795         gtk_color_selection_set_color
1796                 ((GtkColorSelection *)dialog->colorsel, color);
1797
1798         gtk_widget_show(color_dialog);
1799 }
1800
1801 static void quote_colors_set_dialog_ok(GtkWidget *widget, gpointer data)
1802 {
1803         GtkColorSelection *colorsel = (GtkColorSelection *)
1804                                                 ((GtkColorSelectionDialog *)color_dialog)->colorsel;
1805         gdouble color[4];
1806         gint red, green, blue, rgbvalue;
1807         gchar *type = (gchar *)data;
1808
1809         gtk_color_selection_get_color(colorsel, color);
1810
1811         red      = (gint) (color[0] * 255.0);
1812         green    = (gint) (color[1] * 255.0);
1813         blue     = (gint) (color[2] * 255.0);
1814         rgbvalue = (gint) ((red * 0x10000) | (green * 0x100) | blue);
1815
1816 #if 0
1817         fprintf(stderr, "redc = %f, greenc = %f, bluec = %f\n", color[0], color[1], color[2]);
1818         fprintf(stderr, "red = %d, green = %d, blue = %d\n", red, green, blue);
1819         fprintf(stderr, "Color is %x\n", rgbvalue);
1820 #endif
1821
1822         if (g_strcasecmp(type, "LEVEL1") == 0) {
1823                 prefs_common.quote_level1_col = rgbvalue;
1824                 set_button_bg_color(color_buttons.quote_level1_btn, rgbvalue);
1825         } else if (g_strcasecmp(type, "LEVEL2") == 0) {
1826                 prefs_common.quote_level2_col = rgbvalue;
1827                 set_button_bg_color(color_buttons.quote_level2_btn, rgbvalue);
1828         } else if (g_strcasecmp(type, "LEVEL3") == 0) {
1829                 prefs_common.quote_level3_col = rgbvalue;
1830                 set_button_bg_color(color_buttons.quote_level3_btn, rgbvalue);
1831         } else if (g_strcasecmp(type, "URI") == 0) {
1832                 prefs_common.uri_col = rgbvalue;
1833                 set_button_bg_color(color_buttons.uri_btn, rgbvalue);
1834         } else
1835                 fprintf( stderr, "Unrecognized datatype '%s' in quote_color_set_dialog_ok\n", type );
1836
1837         gtk_widget_hide(color_dialog);
1838 }
1839
1840 static void quote_colors_set_dialog_cancel(GtkWidget *widget, gpointer data)
1841 {
1842         gtk_widget_hide(color_dialog);
1843 }
1844
1845 static void set_button_bg_color(GtkWidget *widget, gint rgbvalue)
1846 {
1847         GtkStyle *newstyle;
1848         GdkColor color;
1849
1850         gtkut_convert_int_to_gdk_color(rgbvalue, &color);
1851         newstyle = gtk_style_copy(gtk_widget_get_default_style());
1852         newstyle->bg[GTK_STATE_NORMAL]   = color;
1853         newstyle->bg[GTK_STATE_PRELIGHT] = color;
1854         newstyle->bg[GTK_STATE_ACTIVE]   = color;
1855
1856         gtk_widget_set_style(GTK_WIDGET(widget), newstyle);
1857 }
1858
1859 static void prefs_enable_message_color_toggled(void)
1860 {
1861         gboolean is_active;
1862
1863         is_active = gtk_toggle_button_get_active
1864                 (GTK_TOGGLE_BUTTON(message.chkbtn_enablecol));
1865         gtk_widget_set_sensitive(message.button_edit_col, is_active);
1866         prefs_common.enable_color = is_active;
1867 }
1868
1869 static void prefs_recycle_colors_toggled(GtkWidget *widget)
1870 {
1871         gboolean is_active;
1872
1873         is_active = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget));
1874         prefs_common.recycle_quote_colors = is_active;
1875 }
1876
1877 static void prefs_quote_description(void)
1878 {
1879         if (!quote_desc_win)
1880                 prefs_quote_description_create();
1881
1882         gtk_widget_show(quote_desc_win);
1883         gtk_main();
1884         gtk_widget_hide(quote_desc_win);
1885 }
1886
1887 static void prefs_quote_description_create(void)
1888 {
1889         GtkWidget *vbox;
1890         GtkWidget *hbox;
1891         GtkWidget *hbbox;
1892         GtkWidget *label;
1893         GtkWidget *ok_btn;
1894
1895         quote_desc_win = gtk_window_new(GTK_WINDOW_DIALOG);
1896         gtk_window_set_title(GTK_WINDOW(quote_desc_win),
1897                              _("Description of symbols"));
1898         gtk_container_set_border_width(GTK_CONTAINER(quote_desc_win), 8);
1899         gtk_window_set_position(GTK_WINDOW(quote_desc_win), GTK_WIN_POS_CENTER);
1900         gtk_window_set_modal(GTK_WINDOW(quote_desc_win), TRUE);
1901         gtk_window_set_policy(GTK_WINDOW(quote_desc_win), FALSE, TRUE, FALSE);
1902
1903         vbox = gtk_vbox_new(FALSE, 8);
1904         gtk_container_add(GTK_CONTAINER(quote_desc_win), vbox);
1905
1906         hbox = gtk_hbox_new(FALSE, 4);
1907         gtk_box_pack_start(GTK_BOX(vbox), hbox, TRUE, TRUE, 0);
1908
1909         label = gtk_label_new
1910                 ("%d:\n"
1911                  "%f:\n"
1912                  "%n:\n"
1913                  "%N:\n"
1914                  "%I:\n"
1915                  "%s:\n"
1916                  "%t:\n"
1917                  "%i:\n"
1918                  "%%:");
1919
1920         gtk_box_pack_start(GTK_BOX(hbox), label, TRUE, TRUE, 0);
1921         gtk_label_set_justify(GTK_LABEL(label), GTK_JUSTIFY_LEFT);
1922
1923         label = gtk_label_new
1924                 (_("Date\n"
1925                    "From\n"
1926                    "Full Name of Sender\n"
1927                    "First Name of Sender\n"
1928                    "Initial of Sender\n"
1929                    "Subject\n"
1930                    "To\n"
1931                    "Message-ID\n"
1932                    "%"));
1933
1934         gtk_box_pack_start(GTK_BOX(hbox), label, TRUE, TRUE, 0);
1935         gtk_label_set_justify(GTK_LABEL(label), GTK_JUSTIFY_LEFT);
1936
1937         gtkut_button_set_create(&hbbox, &ok_btn, _("OK"),
1938                                 NULL, NULL, NULL, NULL);
1939         gtk_box_pack_end(GTK_BOX(vbox), hbbox, FALSE, FALSE, 0);
1940
1941         gtk_widget_grab_default(ok_btn);
1942         gtk_signal_connect(GTK_OBJECT(ok_btn), "clicked",
1943                                   GTK_SIGNAL_FUNC(gtk_main_quit), NULL);
1944
1945         gtk_signal_connect(GTK_OBJECT(quote_desc_win), "delete_event",
1946                                           GTK_SIGNAL_FUNC(gtk_main_quit), NULL);
1947
1948         gtk_widget_show_all(vbox);
1949 }
1950
1951 /* functions for setting items of SummaryView */
1952
1953 static struct _SummaryDisplayItem
1954 {
1955         GtkWidget *window;
1956
1957         GtkWidget *chkbtn[N_SUMMARY_COLS];
1958
1959         GtkWidget *ok_btn;
1960         GtkWidget *cancel_btn;
1961 } summarydispitem;
1962
1963 #define SET_ACTIVE(column, var) \
1964         gtk_toggle_button_set_active \
1965                 (GTK_TOGGLE_BUTTON(summarydispitem.chkbtn[column]), \
1966                  prefs_common.var)
1967 #define GET_ACTIVE(column, var) \
1968         prefs_common.var = gtk_toggle_button_get_active \
1969                 (GTK_TOGGLE_BUTTON(summarydispitem.chkbtn[column]))
1970
1971 void prefs_summary_display_item_set(void)
1972 {
1973         static gboolean cancelled;
1974
1975         if (!summarydispitem.window)
1976                 prefs_summary_display_item_dialog_create(&cancelled);
1977         gtk_widget_grab_focus(summarydispitem.ok_btn);
1978         gtk_widget_show(summarydispitem.window);
1979         manage_window_set_transient(GTK_WINDOW(summarydispitem.window));
1980
1981         SET_ACTIVE(S_COL_MARK, show_mark);
1982         SET_ACTIVE(S_COL_UNREAD, show_unread);
1983         SET_ACTIVE(S_COL_MIME, show_mime);
1984         SET_ACTIVE(S_COL_NUMBER, show_number);
1985         SET_ACTIVE(S_COL_SIZE, show_size);
1986         SET_ACTIVE(S_COL_DATE, show_date);
1987         SET_ACTIVE(S_COL_FROM, show_from);
1988         SET_ACTIVE(S_COL_SUBJECT, show_subject);
1989
1990         gtk_main();
1991         gtk_widget_hide(summarydispitem.window);
1992
1993         if (cancelled != TRUE) {
1994                 GET_ACTIVE(S_COL_MARK, show_mark);
1995                 GET_ACTIVE(S_COL_UNREAD, show_unread);
1996                 GET_ACTIVE(S_COL_MIME, show_mime);
1997                 GET_ACTIVE(S_COL_NUMBER, show_number);
1998                 GET_ACTIVE(S_COL_SIZE, show_size);
1999                 GET_ACTIVE(S_COL_DATE, show_date);
2000                 GET_ACTIVE(S_COL_FROM, show_from);
2001                 GET_ACTIVE(S_COL_SUBJECT, show_subject);
2002
2003                 main_window_reflect_prefs_all();
2004         }
2005 }
2006
2007 #define SET_CHECK_BUTTON(column, label) \
2008 { \
2009         summarydispitem.chkbtn[column] = \
2010                 gtk_check_button_new_with_label(label); \
2011         gtk_box_pack_start(GTK_BOX(chkbtn_vbox), \
2012                            summarydispitem.chkbtn[column], \
2013                            FALSE, FALSE, 0); \
2014 }
2015
2016 static void prefs_summary_display_item_dialog_create(gboolean *cancelled)
2017 {
2018         GtkWidget *window;
2019         GtkWidget *vbox;
2020         GtkWidget *chkbtn_vbox;
2021         GtkWidget *hbbox;
2022         GtkWidget *ok_btn;
2023         GtkWidget *cancel_btn;
2024
2025         window = gtk_window_new(GTK_WINDOW_DIALOG);
2026         gtk_container_set_border_width(GTK_CONTAINER(window), 8);
2027         gtk_window_set_title(GTK_WINDOW(window), _("Set display item"));
2028         gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);
2029         gtk_window_set_modal(GTK_WINDOW(window), TRUE);
2030         gtk_window_set_policy(GTK_WINDOW(window), FALSE, FALSE, FALSE);
2031         gtk_signal_connect(GTK_OBJECT(window), "delete_event",
2032                            GTK_SIGNAL_FUNC(display_item_delete_event),
2033                            cancelled);
2034         gtk_signal_connect(GTK_OBJECT(window), "key_press_event",
2035                            GTK_SIGNAL_FUNC(display_item_key_pressed),
2036                            cancelled);
2037
2038         vbox = gtk_vbox_new(FALSE, 8);
2039         gtk_container_add(GTK_CONTAINER(window), vbox);
2040
2041         chkbtn_vbox = gtk_vbox_new(FALSE, 0);
2042         gtk_box_pack_start(GTK_BOX(vbox), chkbtn_vbox, FALSE, FALSE, 0);
2043
2044         SET_CHECK_BUTTON(S_COL_MARK, _("Mark"));
2045         SET_CHECK_BUTTON(S_COL_UNREAD, _("Unread"));
2046         SET_CHECK_BUTTON(S_COL_MIME, _("MIME"));
2047         SET_CHECK_BUTTON(S_COL_NUMBER, _("Number"));
2048         SET_CHECK_BUTTON(S_COL_SIZE, _("Size"));
2049         SET_CHECK_BUTTON(S_COL_DATE, _("Date"));
2050         SET_CHECK_BUTTON(S_COL_FROM, _("From"));
2051         SET_CHECK_BUTTON(S_COL_SUBJECT, _("Subject"));
2052
2053         gtkut_button_set_create(&hbbox, &ok_btn, _("OK"),
2054                                 &cancel_btn, _("Cancel"), NULL, NULL);
2055         gtk_box_pack_end(GTK_BOX(vbox), hbbox, FALSE, FALSE, 0);
2056         gtk_widget_grab_default(ok_btn);
2057
2058         gtk_signal_connect(GTK_OBJECT(ok_btn), "clicked",
2059                            GTK_SIGNAL_FUNC(display_item_ok), cancelled);
2060         gtk_signal_connect(GTK_OBJECT(cancel_btn), "clicked",
2061                            GTK_SIGNAL_FUNC(display_item_cancel), cancelled);
2062
2063         gtk_widget_show_all(vbox);
2064
2065         summarydispitem.window = window;
2066         summarydispitem.ok_btn = ok_btn;
2067         summarydispitem.cancel_btn = cancel_btn;
2068 }
2069
2070 static void display_item_ok(GtkWidget *widget, gboolean *cancelled)
2071 {
2072         *cancelled = FALSE;
2073         gtk_main_quit();
2074 }
2075
2076 static void display_item_cancel(GtkWidget *widget, gboolean *cancelled)
2077 {
2078         *cancelled = TRUE;
2079         gtk_main_quit();
2080 }
2081
2082 static gint display_item_delete_event(GtkWidget *widget, GdkEventAny *event,
2083                                       gboolean *cancelled)
2084 {
2085         *cancelled = TRUE;
2086         gtk_main_quit();
2087
2088         return TRUE;
2089 }
2090
2091 static void display_item_key_pressed(GtkWidget *widget, GdkEventKey *event,
2092                                      gboolean *cancelled)
2093 {
2094         if (event && event->keyval == GDK_Escape) {
2095                 *cancelled = TRUE;
2096                 gtk_main_quit();
2097         }
2098 }
2099
2100 static void prefs_font_select(GtkButton *button)
2101 {
2102         if (!font_sel_win) {
2103                 font_sel_win = gtk_font_selection_dialog_new
2104                         (_("Font selection"));
2105                 gtk_window_position(GTK_WINDOW(font_sel_win),
2106                                     GTK_WIN_POS_CENTER);
2107                 gtk_signal_connect(GTK_OBJECT(font_sel_win), "delete_event",
2108                                    GTK_SIGNAL_FUNC(gtk_widget_hide_on_delete),
2109                                    NULL);
2110                 gtk_signal_connect
2111                         (GTK_OBJECT(font_sel_win), "key_press_event",
2112                          GTK_SIGNAL_FUNC(prefs_font_selection_key_pressed),
2113                          NULL);
2114                 gtk_signal_connect
2115                         (GTK_OBJECT(GTK_FONT_SELECTION_DIALOG(font_sel_win)->ok_button),
2116                          "clicked",
2117                          GTK_SIGNAL_FUNC(prefs_font_selection_ok),
2118                          NULL);
2119                 gtk_signal_connect_object
2120                         (GTK_OBJECT(GTK_FONT_SELECTION_DIALOG(font_sel_win)->cancel_button),
2121                          "clicked",
2122                          GTK_SIGNAL_FUNC(gtk_widget_hide_on_delete),
2123                          GTK_OBJECT(font_sel_win));
2124         }
2125
2126         manage_window_set_transient(GTK_WINDOW(font_sel_win));
2127         gtk_window_set_modal(GTK_WINDOW(font_sel_win), TRUE);
2128         gtk_widget_grab_focus
2129                 (GTK_FONT_SELECTION_DIALOG(font_sel_win)->ok_button);
2130         gtk_widget_show(font_sel_win);
2131 }
2132
2133 static void prefs_font_selection_key_pressed(GtkWidget *widget,
2134                                              GdkEventKey *event,
2135                                              gpointer data)
2136 {
2137         if (event && event->keyval == GDK_Escape)
2138                 gtk_widget_hide(font_sel_win);
2139 }
2140
2141 static void prefs_font_selection_ok(GtkButton *button)
2142 {
2143         gchar *fontname;
2144
2145         fontname = gtk_font_selection_dialog_get_font_name
2146                 (GTK_FONT_SELECTION_DIALOG(font_sel_win));
2147
2148         if (fontname) {
2149                 gtk_entry_set_text(GTK_ENTRY(display.entry_textfont), fontname);
2150                 g_free(fontname);
2151         }
2152
2153         gtk_widget_hide(font_sel_win);
2154 }
2155
2156 static void prefs_common_charset_set_data_from_optmenu(PrefParam *pparam)
2157 {
2158         GtkWidget *menu;
2159         GtkWidget *menuitem;
2160         gchar *charset;
2161
2162         menu = gtk_option_menu_get_menu(GTK_OPTION_MENU(*pparam->widget));
2163         menuitem = gtk_menu_get_active(GTK_MENU(menu));
2164         charset = gtk_object_get_user_data(GTK_OBJECT(menuitem));
2165         g_free(*((gchar **)pparam->data));
2166         *((gchar **)pparam->data) = g_strdup(charset);
2167 }
2168
2169 static void prefs_common_charset_set_optmenu(PrefParam *pparam)
2170 {
2171         GList *cur;
2172         GtkOptionMenu *optmenu = GTK_OPTION_MENU(*pparam->widget);
2173         GtkWidget *menu;
2174         GtkWidget *menuitem;
2175         gchar *charset;
2176         gint n = 0;
2177
2178         g_return_if_fail(optmenu != NULL);
2179         g_return_if_fail(*((gchar **)pparam->data) != NULL);
2180
2181         menu = gtk_option_menu_get_menu(optmenu);
2182         for (cur = GTK_MENU_SHELL(menu)->children;
2183              cur != NULL; cur = cur->next) {
2184                 menuitem = GTK_WIDGET(cur->data);
2185                 charset = gtk_object_get_user_data(GTK_OBJECT(menuitem));
2186                 if (!strcmp(charset, *((gchar **)pparam->data))) {
2187                         gtk_option_menu_set_history(optmenu, n);
2188                         return;
2189                 }
2190                 n++;
2191         }
2192
2193         gtk_option_menu_set_history(optmenu, 0);
2194         prefs_common_charset_set_data_from_optmenu(pparam);
2195 }
2196
2197 static void prefs_common_key_pressed(GtkWidget *widget, GdkEventKey *event,
2198                                      gpointer data)
2199 {
2200         if (event && event->keyval == GDK_Escape)
2201                 gtk_widget_hide(dialog.window);
2202 }
2203
2204 static void prefs_common_ok(GtkButton *button)
2205 {
2206         prefs_common_apply(button);
2207         gtk_widget_hide(dialog.window);
2208         if (quote_desc_win && GTK_WIDGET_VISIBLE(quote_desc_win))
2209                 gtk_widget_hide(quote_desc_win);
2210 }
2211
2212 static void prefs_common_apply(GtkButton *button)
2213 {
2214         prefs_set_data_from_dialog(param);
2215         main_window_reflect_prefs_all();
2216         prefs_common_save_config();
2217 }