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