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