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