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