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