sync with sylpheed 0.4.66cvs6
[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 gint prefs_common_deleted        (GtkWidget      *widget,
574                                          GdkEventAny    *event,
575                                          gpointer        data);
576 static void prefs_common_key_pressed    (GtkWidget      *widget,
577                                          GdkEventKey    *event,
578                                          gpointer        data);
579 static void prefs_common_ok             (void);
580 static void prefs_common_apply          (void);
581 static void prefs_common_cancel         (void);
582
583 void prefs_common_read_config(void)
584 {
585         prefs_read_config(param, "Common", COMMON_RC);
586 }
587
588 void prefs_common_save_config(void)
589 {
590         prefs_save_config(param, "Common", COMMON_RC);
591 }
592
593 void prefs_common_open(void)
594 {
595         inc_autocheck_timer_remove();
596
597         if (!dialog.window) {
598                 prefs_common_create();
599         }
600
601         manage_window_set_transient(GTK_WINDOW(dialog.window));
602         gtk_notebook_set_page(GTK_NOTEBOOK(dialog.notebook), 0);
603         gtk_widget_grab_focus(dialog.ok_btn);
604
605         prefs_set_dialog(param);
606
607         gtk_widget_show(dialog.window);
608 }
609
610 static void prefs_common_create(void)
611 {
612         gint page = 0;
613
614         debug_print(_("Creating common preferences window...\n"));
615
616         prefs_dialog_create(&dialog);
617         gtk_window_set_title (GTK_WINDOW(dialog.window),
618                               _("Common Preferences"));
619         gtk_signal_connect (GTK_OBJECT(dialog.window), "delete_event",
620                             GTK_SIGNAL_FUNC(prefs_common_deleted), NULL);
621         gtk_signal_connect (GTK_OBJECT(dialog.window), "key_press_event",
622                             GTK_SIGNAL_FUNC(prefs_common_key_pressed), NULL);
623         gtk_signal_connect (GTK_OBJECT(dialog.window), "focus_in_event",
624                             GTK_SIGNAL_FUNC(manage_window_focus_in), NULL);
625         gtk_signal_connect (GTK_OBJECT(dialog.window), "focus_out_event",
626                             GTK_SIGNAL_FUNC(manage_window_focus_out), NULL);
627         gtk_signal_connect (GTK_OBJECT(dialog.ok_btn), "clicked",
628                             GTK_SIGNAL_FUNC(prefs_common_ok), NULL);
629         gtk_signal_connect (GTK_OBJECT(dialog.apply_btn), "clicked",
630                             GTK_SIGNAL_FUNC(prefs_common_apply), NULL);
631         gtk_signal_connect_object (GTK_OBJECT(dialog.cancel_btn), "clicked",
632                                    GTK_SIGNAL_FUNC(prefs_common_cancel),
633                                    GTK_OBJECT(dialog.window));
634
635         /* create all widgets on notebook */
636         prefs_receive_create();
637         SET_NOTEBOOK_LABEL(dialog.notebook, _("Receive"),   page++);
638         prefs_send_create();
639         SET_NOTEBOOK_LABEL(dialog.notebook, _("Send"),      page++);
640         prefs_compose_create();
641         SET_NOTEBOOK_LABEL(dialog.notebook, _("Compose"),   page++);
642         prefs_display_create();
643         SET_NOTEBOOK_LABEL(dialog.notebook, _("Display"),   page++);
644         prefs_message_create();
645         SET_NOTEBOOK_LABEL(dialog.notebook, _("Message"),   page++);
646 #if USE_GPGME
647         prefs_privacy_create();
648         SET_NOTEBOOK_LABEL(dialog.notebook, _("Privacy"),   page++);
649 #endif
650         prefs_interface_create();
651         SET_NOTEBOOK_LABEL(dialog.notebook, _("Interface"), page++);
652         prefs_other_create();
653         SET_NOTEBOOK_LABEL(dialog.notebook, _("Other"),     page++);
654
655         gtk_widget_show_all(dialog.window);
656 }
657
658 static void prefs_receive_create(void)
659 {
660         GtkWidget *vbox1;
661         GtkWidget *vbox2;
662         GtkWidget *frame_incext;
663         GtkWidget *checkbtn_incext;
664         GtkWidget *hbox;
665         GtkWidget *label_incext;
666         GtkWidget *entry_incext;
667         GtkWidget *button_incext;
668
669         GtkWidget *frame_spool;
670         GtkWidget *checkbtn_local;
671         GtkWidget *checkbtn_filter_on_inc;
672         GtkWidget *label_spool;
673         GtkWidget *entry_spool;
674
675         GtkWidget *hbox_autochk;
676         GtkWidget *checkbtn_autochk;
677         GtkWidget *label_autochk1;
678         GtkObject *spinbtn_autochk_adj;
679         GtkWidget *spinbtn_autochk;
680         GtkWidget *label_autochk2;
681         GtkWidget *checkbtn_chkonstartup;
682
683         GtkWidget *frame_news;
684         GtkWidget *label_maxarticle;
685         GtkWidget *spinbtn_maxarticle;
686         GtkObject *spinbtn_maxarticle_adj;
687
688         vbox1 = gtk_vbox_new (FALSE, VSPACING);
689         gtk_widget_show (vbox1);
690         gtk_container_add (GTK_CONTAINER (dialog.notebook), vbox1);
691         gtk_container_set_border_width (GTK_CONTAINER (vbox1), VBOX_BORDER);
692
693         PACK_FRAME(vbox1, frame_incext, _("External program"));
694
695         vbox2 = gtk_vbox_new (FALSE, VSPACING_NARROW);
696         gtk_widget_show (vbox2);
697         gtk_container_add (GTK_CONTAINER (frame_incext), vbox2);
698         gtk_container_set_border_width (GTK_CONTAINER (vbox2), 8);
699
700         /* Use of external incorporation program */
701         PACK_CHECK_BUTTON (vbox2, checkbtn_incext,
702                            _("Use external program for incorporation"));
703
704         hbox = gtk_hbox_new (FALSE, 8);
705         gtk_widget_show (hbox);
706         gtk_box_pack_start (GTK_BOX (vbox2), hbox, FALSE, FALSE, 0);
707         SET_TOGGLE_SENSITIVITY (checkbtn_incext, hbox);
708
709         label_incext = gtk_label_new (_("Program path"));
710         gtk_widget_show (label_incext);
711         gtk_box_pack_start (GTK_BOX (hbox), label_incext, FALSE, FALSE, 0);
712
713         entry_incext = gtk_entry_new ();
714         gtk_widget_show (entry_incext);
715         gtk_box_pack_start (GTK_BOX (hbox), entry_incext, TRUE, TRUE, 0);
716
717         button_incext = gtk_button_new_with_label ("... ");
718         gtk_widget_show (button_incext);
719         gtk_box_pack_start (GTK_BOX (hbox), button_incext, FALSE, FALSE, 0);
720
721         PACK_FRAME(vbox1, frame_spool, _("Local spool"));
722
723         vbox2 = gtk_vbox_new (FALSE, VSPACING_NARROW);
724         gtk_widget_show (vbox2);
725         gtk_container_add (GTK_CONTAINER (frame_spool), vbox2);
726         gtk_container_set_border_width (GTK_CONTAINER (vbox2), 8);
727
728         hbox = gtk_hbox_new (FALSE, 32);
729         gtk_widget_show (hbox);
730         gtk_box_pack_start (GTK_BOX (vbox2), hbox, FALSE, FALSE, 0);
731
732         PACK_CHECK_BUTTON (hbox, checkbtn_local, _("Incorporate from spool"));
733         PACK_CHECK_BUTTON (hbox, checkbtn_filter_on_inc,
734                            _("Filter on incorporation"));
735         SET_TOGGLE_SENSITIVITY (checkbtn_local, checkbtn_filter_on_inc);
736
737         hbox = gtk_hbox_new (FALSE, 8);
738         gtk_widget_show (hbox);
739         gtk_box_pack_start (GTK_BOX (vbox2), hbox, FALSE, FALSE, 0);
740         SET_TOGGLE_SENSITIVITY (checkbtn_local, hbox);
741
742         label_spool = gtk_label_new (_("Spool directory"));
743         gtk_widget_show (label_spool);
744         gtk_box_pack_start (GTK_BOX (hbox), label_spool, FALSE, FALSE, 0);
745
746         entry_spool = gtk_entry_new ();
747         gtk_widget_show (entry_spool);
748         gtk_box_pack_start (GTK_BOX (hbox), entry_spool, TRUE, TRUE, 0);
749
750         vbox2 = gtk_vbox_new (FALSE, VSPACING_NARROW);
751         gtk_widget_show (vbox2);
752         gtk_box_pack_start (GTK_BOX (vbox1), vbox2, FALSE, FALSE, 0);
753
754         /* Auto-checking */
755         hbox_autochk = gtk_hbox_new (FALSE, 8);
756         gtk_widget_show (hbox_autochk);
757         gtk_box_pack_start (GTK_BOX (vbox2), hbox_autochk, FALSE, FALSE, 0);
758
759         PACK_CHECK_BUTTON (hbox_autochk, checkbtn_autochk,
760                            _("Auto-check new mail"));
761
762         label_autochk1 = gtk_label_new (_("each"));
763         gtk_widget_show (label_autochk1);
764         gtk_box_pack_start (GTK_BOX (hbox_autochk), label_autochk1, FALSE, FALSE, 0);
765
766         spinbtn_autochk_adj = gtk_adjustment_new (5, 1, 100, 1, 10, 10);
767         spinbtn_autochk = gtk_spin_button_new
768                 (GTK_ADJUSTMENT (spinbtn_autochk_adj), 1, 0);
769         gtk_widget_show (spinbtn_autochk);
770         gtk_box_pack_start (GTK_BOX (hbox_autochk), spinbtn_autochk, FALSE, FALSE, 0);
771         gtk_widget_set_usize (spinbtn_autochk, 64, -1);
772         gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (spinbtn_autochk), TRUE);
773
774         label_autochk2 = gtk_label_new (_("minute(s)"));
775         gtk_widget_show (label_autochk2);
776         gtk_box_pack_start (GTK_BOX (hbox_autochk), label_autochk2, FALSE, FALSE, 0);
777
778         SET_TOGGLE_SENSITIVITY(checkbtn_autochk, label_autochk1);
779         SET_TOGGLE_SENSITIVITY(checkbtn_autochk, spinbtn_autochk);
780         SET_TOGGLE_SENSITIVITY(checkbtn_autochk, label_autochk2);
781
782         PACK_CHECK_BUTTON (vbox2, checkbtn_chkonstartup,
783                            _("Check new mail on startup"));
784
785         PACK_FRAME(vbox1, frame_news, _("News"));
786
787         hbox = gtk_hbox_new (FALSE, 8);
788         gtk_widget_show (hbox);
789         gtk_container_add (GTK_CONTAINER (frame_news), hbox);
790         gtk_container_set_border_width (GTK_CONTAINER (hbox), 8);
791
792         label_maxarticle = gtk_label_new
793                 (_("Maximum article number to download\n"
794                    "(unlimited if 0 is specified)"));
795         gtk_widget_show (label_maxarticle);
796         gtk_box_pack_start (GTK_BOX (hbox), label_maxarticle, FALSE, FALSE, 0);
797         gtk_label_set_justify (GTK_LABEL (label_maxarticle), GTK_JUSTIFY_LEFT);
798
799         spinbtn_maxarticle_adj =
800                 gtk_adjustment_new (300, 0, 10000, 10, 100, 100);
801         spinbtn_maxarticle = gtk_spin_button_new
802                 (GTK_ADJUSTMENT (spinbtn_maxarticle_adj), 10, 0);
803         gtk_widget_show (spinbtn_maxarticle);
804         gtk_box_pack_start (GTK_BOX (hbox), spinbtn_maxarticle,
805                             FALSE, FALSE, 0);
806         gtk_widget_set_usize (spinbtn_maxarticle, 64, -1);
807         gtk_spin_button_set_numeric
808                 (GTK_SPIN_BUTTON (spinbtn_maxarticle), TRUE);
809
810         receive.checkbtn_incext = checkbtn_incext;
811         receive.entry_incext    = entry_incext;
812         receive.button_incext   = button_incext;
813
814         receive.checkbtn_local         = checkbtn_local;
815         receive.checkbtn_filter_on_inc = checkbtn_filter_on_inc;
816         receive.entry_spool            = entry_spool;
817
818         receive.checkbtn_autochk    = checkbtn_autochk;
819         receive.spinbtn_autochk     = spinbtn_autochk;
820         receive.spinbtn_autochk_adj = spinbtn_autochk_adj;
821
822         receive.checkbtn_chkonstartup = checkbtn_chkonstartup;
823
824         receive.spinbtn_maxarticle     = spinbtn_maxarticle;
825         receive.spinbtn_maxarticle_adj = spinbtn_maxarticle_adj;
826 }
827
828 static void prefs_send_create(void)
829 {
830         GtkWidget *vbox1;
831         GtkWidget *vbox2;
832         GtkWidget *frame_sendext;
833         GtkWidget *vbox_sendext;
834         GtkWidget *checkbtn_sendext;
835         GtkWidget *hbox1;
836         GtkWidget *label_sendext;
837         GtkWidget *entry_sendext;
838         GtkWidget *button_sendext;
839         GtkWidget *checkbtn_savemsg;
840         GtkWidget *checkbtn_queuemsg;
841         GtkWidget *label_outcharset;
842         GtkWidget *optmenu;
843         GtkWidget *optmenu_menu;
844         GtkWidget *menuitem;
845
846         vbox1 = gtk_vbox_new (FALSE, VSPACING);
847         gtk_widget_show (vbox1);
848         gtk_container_add (GTK_CONTAINER (dialog.notebook), vbox1);
849         gtk_container_set_border_width (GTK_CONTAINER (vbox1), VBOX_BORDER);
850
851         PACK_FRAME(vbox1, frame_sendext, _("External program"));
852
853         gtk_widget_set_sensitive(frame_sendext, FALSE);
854
855         vbox_sendext = gtk_vbox_new (FALSE, VSPACING_NARROW);
856         gtk_widget_show (vbox_sendext);
857         gtk_container_add (GTK_CONTAINER (frame_sendext), vbox_sendext);
858         gtk_container_set_border_width (GTK_CONTAINER (vbox_sendext), 8);
859
860         PACK_CHECK_BUTTON (vbox_sendext, checkbtn_sendext,
861                            _("Use external program for sending"));
862
863         hbox1 = gtk_hbox_new (FALSE, 8);
864         gtk_widget_show (hbox1);
865         gtk_box_pack_start (GTK_BOX (vbox_sendext), hbox1, FALSE, FALSE, 0);
866         SET_TOGGLE_SENSITIVITY(checkbtn_sendext, hbox1);
867
868         label_sendext = gtk_label_new (_("Program path"));
869         gtk_widget_show (label_sendext);
870         gtk_box_pack_start (GTK_BOX (hbox1), label_sendext, FALSE, FALSE, 0);
871
872         entry_sendext = gtk_entry_new ();
873         gtk_widget_show (entry_sendext);
874         gtk_box_pack_start (GTK_BOX (hbox1), entry_sendext, TRUE, TRUE, 0);
875
876         button_sendext = gtk_button_new_with_label ("... ");
877         gtk_widget_show (button_sendext);
878         gtk_box_pack_start (GTK_BOX (hbox1), button_sendext, FALSE, FALSE, 0);
879
880         vbox2 = gtk_vbox_new (FALSE, VSPACING_NARROW);
881         gtk_widget_show (vbox2);
882         gtk_box_pack_start (GTK_BOX (vbox1), vbox2, FALSE, FALSE, 0);
883
884         PACK_CHECK_BUTTON (vbox2, checkbtn_savemsg,
885                            _("Save sent message to outbox"));
886         PACK_CHECK_BUTTON (vbox2, checkbtn_queuemsg,
887                            _("Queue message that failed to send"));
888
889         hbox1 = gtk_hbox_new (FALSE, 8);
890         gtk_widget_show (hbox1);
891         gtk_box_pack_start (GTK_BOX (vbox1), hbox1, FALSE, FALSE, 0);
892
893         label_outcharset = gtk_label_new (_("Outgoing codeset"));
894         gtk_widget_show (label_outcharset);
895         gtk_box_pack_start (GTK_BOX (hbox1), label_outcharset, FALSE, FALSE, 0);
896
897         optmenu = gtk_option_menu_new ();
898         gtk_widget_show (optmenu);
899         gtk_box_pack_start(GTK_BOX (hbox1), optmenu, FALSE, FALSE, 0);
900
901         optmenu_menu = gtk_menu_new ();
902
903 #define SET_MENUITEM(str, charset) \
904 { \
905         MENUITEM_ADD(optmenu_menu, menuitem, str, charset); \
906 }
907
908         SET_MENUITEM(_("Automatic"),                     CS_AUTO);
909         SET_MENUITEM(_("7bit ascii (US-ASCII)"),         CS_US_ASCII);
910 #if HAVE_LIBJCONV
911         SET_MENUITEM(_("Unicode (UTF-8)"),               CS_UTF_8);
912 #endif
913         SET_MENUITEM(_("Western European (ISO-8859-1)"), CS_ISO_8859_1);
914 #if HAVE_LIBJCONV
915         SET_MENUITEM(_("Central European (ISO-8859-2)"), CS_ISO_8859_2);
916         SET_MENUITEM(_("Baltic (ISO-8859-13)"),          CS_ISO_8859_13);
917         SET_MENUITEM(_("Baltic (ISO-8859-4)"),           CS_ISO_8859_4);
918         SET_MENUITEM(_("Greek (ISO-8859-7)"),            CS_ISO_8859_7);
919         SET_MENUITEM(_("Turkish (ISO-8859-9)"),          CS_ISO_8859_9);
920         SET_MENUITEM(_("Cyrillic (ISO-8859-5)"),         CS_ISO_8859_5);
921         SET_MENUITEM(_("Cyrillic (KOI8-R)"),             CS_KOI8_R);
922         SET_MENUITEM(_("Cyrillic (Windows-1251)"),       CS_CP1251);
923         SET_MENUITEM(_("Cyrillic (KOI8-U)"),             CS_KOI8_U);
924 #endif /* HAVE_LIBJCONV */
925         SET_MENUITEM(_("Japanese (ISO-2022-JP)"),        CS_ISO_2022_JP);
926 #if 0
927         SET_MENUITEM(_("Japanese (EUC-JP)"),             CS_EUC_JP);
928         SET_MENUITEM(_("Japanese (Shift_JIS)"),          CS_SHIFT_JIS);
929 #endif /* 0 */
930 #if HAVE_LIBJCONV
931         SET_MENUITEM(_("Simplified Chinese (GB2312)"),   CS_GB2312);
932         SET_MENUITEM(_("Traditional Chinese (Big5)"),    CS_BIG5);
933 #if 0
934         SET_MENUITEM(_("Traditional Chinese (EUC-TW)"),  CS_EUC_TW);
935         SET_MENUITEM(_("Chinese (ISO-2022-CN)"),         CS_ISO_2022_CN);
936 #endif /* 0 */
937         SET_MENUITEM(_("Korean (EUC-KR)"),               CS_EUC_KR);
938 #endif /* HAVE_LIBJCONV */
939
940         gtk_option_menu_set_menu (GTK_OPTION_MENU (optmenu), optmenu_menu);
941
942         send.checkbtn_sendext = checkbtn_sendext;
943         send.entry_sendext    = entry_sendext;
944         send.button_sendext   = button_sendext;
945
946         send.checkbtn_savemsg  = checkbtn_savemsg;
947         send.checkbtn_queuemsg = checkbtn_queuemsg;
948
949         send.optmenu_charset = optmenu;
950 }
951
952 static void prefs_compose_create(void)
953 {
954         GtkWidget *vbox1;
955         GtkWidget *frame_quote;
956         GtkWidget *vbox_quote;
957         GtkWidget *checkbtn_quote;
958         GtkWidget *hbox1;
959         GtkWidget *label_quotemark;
960         GtkWidget *entry_quotemark;
961         GtkWidget *hbox2;
962         GtkWidget *label_quotefmt;
963         GtkWidget *btn_quotedesc;
964         GtkWidget *scrolledwin_quotefmt;
965         GtkWidget *text_quotefmt;
966
967         GtkWidget *frame_sig;
968         GtkWidget *vbox_sig;
969         GtkWidget *checkbtn_autosig;
970         GtkWidget *label_sigsep;
971         GtkWidget *entry_sigsep;
972
973         GtkWidget *vbox_linewrap;
974         GtkWidget *hbox3;
975         GtkWidget *hbox4;
976         GtkWidget *label_linewrap;
977         GtkObject *spinbtn_linewrap_adj;
978         GtkWidget *spinbtn_linewrap;
979         GtkWidget *checkbtn_wrapquote;
980         GtkWidget *checkbtn_wrapatsend;
981
982         vbox1 = gtk_vbox_new (FALSE, VSPACING);
983         gtk_widget_show (vbox1);
984         gtk_container_add (GTK_CONTAINER (dialog.notebook), vbox1);
985         gtk_container_set_border_width (GTK_CONTAINER (vbox1), VBOX_BORDER);
986
987         PACK_FRAME(vbox1, frame_quote, _("Quotation"));
988
989         vbox_quote = gtk_vbox_new (FALSE, VSPACING_NARROW);
990         gtk_widget_show (vbox_quote);
991         gtk_container_add (GTK_CONTAINER (frame_quote), vbox_quote);
992         gtk_container_set_border_width (GTK_CONTAINER (vbox_quote), 8);
993
994         PACK_CHECK_BUTTON (vbox_quote, checkbtn_quote,
995                            _("Quote message when replying"));
996
997         hbox1 = gtk_hbox_new (FALSE, 8);
998         gtk_widget_show (hbox1);
999         gtk_box_pack_start (GTK_BOX (vbox_quote), hbox1, TRUE, TRUE, 0);
1000
1001         label_quotemark = gtk_label_new (_("Quotation mark"));
1002         gtk_widget_show (label_quotemark);
1003         gtk_box_pack_start (GTK_BOX (hbox1), label_quotemark, FALSE, FALSE, 0);
1004
1005         entry_quotemark = gtk_entry_new ();
1006         gtk_widget_show (entry_quotemark);
1007         gtk_box_pack_start (GTK_BOX (hbox1), entry_quotemark, FALSE, FALSE, 0);
1008         gtk_widget_set_usize (entry_quotemark, 64, -1);
1009
1010         hbox2 = gtk_hbox_new (FALSE, 0);
1011         gtk_widget_show (hbox2);
1012         gtk_box_pack_start (GTK_BOX (vbox_quote), hbox2, TRUE, TRUE, 0);
1013
1014         label_quotefmt = gtk_label_new (_("Quotation format:"));
1015         gtk_widget_show (label_quotefmt);
1016         gtk_box_pack_start (GTK_BOX (hbox2), label_quotefmt, FALSE, FALSE, 0);
1017
1018         btn_quotedesc =
1019                 gtk_button_new_with_label (_(" Description of symbols "));
1020         gtk_widget_show (btn_quotedesc);
1021         gtk_box_pack_end (GTK_BOX (hbox2), btn_quotedesc, FALSE, FALSE, 0);
1022         gtk_signal_connect(GTK_OBJECT(btn_quotedesc), "clicked",
1023                            GTK_SIGNAL_FUNC(prefs_quote_description), NULL);
1024
1025         scrolledwin_quotefmt = gtk_scrolled_window_new (NULL, NULL);
1026         gtk_widget_show (scrolledwin_quotefmt);
1027         gtk_box_pack_start (GTK_BOX (vbox_quote), scrolledwin_quotefmt, TRUE, TRUE, 0);
1028         gtk_scrolled_window_set_policy
1029                 (GTK_SCROLLED_WINDOW (scrolledwin_quotefmt),
1030                  GTK_POLICY_NEVER, GTK_POLICY_ALWAYS);
1031
1032         text_quotefmt = gtk_text_new (NULL, NULL);
1033         gtk_widget_show (text_quotefmt);
1034         gtk_container_add(GTK_CONTAINER(scrolledwin_quotefmt), text_quotefmt);
1035         gtk_text_set_editable (GTK_TEXT (text_quotefmt), TRUE);
1036         gtk_widget_set_usize(text_quotefmt, -1, 60);
1037
1038         PACK_FRAME(vbox1, frame_sig, _("Signature"));
1039
1040         vbox_sig = gtk_vbox_new (FALSE, VSPACING_NARROW);
1041         gtk_widget_show (vbox_sig);
1042         gtk_container_add (GTK_CONTAINER (frame_sig), vbox_sig);
1043         gtk_container_set_border_width (GTK_CONTAINER (vbox_sig), 8);
1044
1045         PACK_CHECK_BUTTON (vbox_sig, checkbtn_autosig,
1046                            _("Insert signature automatically"));
1047
1048         hbox1 = gtk_hbox_new (FALSE, 8);
1049         gtk_widget_show (hbox1);
1050         gtk_box_pack_start (GTK_BOX (vbox_sig), hbox1, TRUE, TRUE, 0);
1051
1052         label_sigsep = gtk_label_new (_("Signature separator"));
1053         gtk_widget_show (label_sigsep);
1054         gtk_box_pack_start (GTK_BOX (hbox1), label_sigsep, FALSE, FALSE, 0);
1055
1056         entry_sigsep = gtk_entry_new ();
1057         gtk_widget_show (entry_sigsep);
1058         gtk_box_pack_start (GTK_BOX (hbox1), entry_sigsep, FALSE, FALSE, 0);
1059         gtk_widget_set_usize (entry_sigsep, 64, -1);
1060
1061         /* line-wrapping */
1062         vbox_linewrap = gtk_vbox_new (FALSE, VSPACING_NARROW);
1063         gtk_widget_show (vbox_linewrap);
1064         gtk_box_pack_start (GTK_BOX (vbox1), vbox_linewrap, FALSE, FALSE, 0);
1065
1066         hbox3 = gtk_hbox_new (FALSE, 8);
1067         gtk_widget_show (hbox3);
1068         gtk_box_pack_start (GTK_BOX (vbox_linewrap), hbox3, FALSE, FALSE, 0);
1069
1070         label_linewrap = gtk_label_new (_("Wrap messages at"));
1071         gtk_widget_show (label_linewrap);
1072         gtk_box_pack_start (GTK_BOX (hbox3), label_linewrap, FALSE, FALSE, 0);
1073
1074         spinbtn_linewrap_adj = gtk_adjustment_new (72, 20, 1024, 1, 10, 10);
1075         spinbtn_linewrap = gtk_spin_button_new
1076                 (GTK_ADJUSTMENT (spinbtn_linewrap_adj), 1, 0);
1077         gtk_widget_show (spinbtn_linewrap);
1078         gtk_box_pack_start (GTK_BOX (hbox3), spinbtn_linewrap, FALSE, FALSE, 0);
1079         gtk_widget_set_usize (spinbtn_linewrap, 64, -1);
1080         gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (spinbtn_linewrap), TRUE);
1081
1082         label_linewrap = gtk_label_new (_("characters"));
1083         gtk_widget_show (label_linewrap);
1084         gtk_box_pack_start (GTK_BOX (hbox3), label_linewrap, FALSE, FALSE, 0);
1085
1086         hbox4 = gtk_hbox_new (FALSE, 32);
1087         gtk_widget_show (hbox4);
1088         gtk_box_pack_start (GTK_BOX (vbox_linewrap), hbox4, FALSE, FALSE, 0);
1089
1090         PACK_CHECK_BUTTON (hbox4, checkbtn_wrapquote, _("Wrap quotation"));
1091         PACK_CHECK_BUTTON
1092                 (hbox4, checkbtn_wrapatsend, _("Wrap before sending"));
1093
1094         compose.checkbtn_quote   = checkbtn_quote;
1095         compose.entry_quotemark  = entry_quotemark;
1096         compose.text_quotefmt    = text_quotefmt;
1097         compose.checkbtn_autosig = checkbtn_autosig;
1098         compose.entry_sigsep     = entry_sigsep;
1099
1100         compose.spinbtn_linewrap     = spinbtn_linewrap;
1101         compose.spinbtn_linewrap_adj = spinbtn_linewrap_adj;
1102         compose.checkbtn_wrapquote   = checkbtn_wrapquote;
1103         compose.checkbtn_wrapatsend  = checkbtn_wrapatsend;
1104 }
1105
1106
1107 /* alfons - nice ui for darko */
1108
1109 static void date_format_close_btn_clicked(GtkButton *button, GtkWidget **widget)
1110 {
1111         gchar *text;
1112
1113         g_return_if_fail(widget != NULL);
1114         g_return_if_fail(*widget != NULL);
1115         g_return_if_fail(entry_datefmt != NULL);
1116         g_return_if_fail(datefmt_sample != NULL);
1117
1118         text = gtk_editable_get_chars(GTK_EDITABLE(datefmt_sample), 0, -1);
1119         g_free(prefs_common.date_format);
1120         prefs_common.date_format = text;
1121         gtk_entry_set_text(GTK_ENTRY(entry_datefmt), text);
1122
1123         gtk_widget_destroy(*widget);
1124         *widget = NULL;
1125 }
1126
1127 static gboolean date_format_on_delete(GtkWidget *dialogwidget, gpointer d1, GtkWidget **widget)
1128 {
1129         g_return_if_fail(widget != NULL);
1130         g_return_if_fail(*widget != NULL);
1131         *widget = NULL;
1132         return FALSE;
1133 }
1134
1135 static void date_format_entry_on_change(GtkEditable *editable, GtkLabel *example)
1136 {
1137         time_t cur_time;
1138         struct tm *cal_time;
1139         char buffer[100];
1140         char *text;
1141         cur_time = time(NULL);
1142         cal_time = localtime(&cur_time);
1143         buffer[0] = 0;
1144         text = gtk_editable_get_chars(editable, 0, -1);
1145         if (text) {
1146                 strftime(buffer, sizeof buffer, text, cal_time); 
1147         }
1148         gtk_label_set_text(example, buffer);
1149 }
1150
1151 static GtkWidget *create_date_format(GtkButton *button, void *data)
1152 {
1153         static GtkWidget *date_format = NULL;
1154         GtkWidget      *vbox1;
1155         GtkWidget      *scrolledwindow1;
1156         GtkWidget      *date_format_list;
1157         GtkWidget      *label3;
1158         GtkWidget      *label4;
1159         GtkWidget      *table2;
1160         GtkWidget      *vbox2;
1161         GtkWidget      *vbox3;
1162         GtkWidget      *hbox2;
1163         GtkWidget      *label5;
1164         GtkWidget      *hbox1;
1165         GtkWidget      *label6;
1166         GtkWidget      *label7;
1167         GtkWidget      *hbox3;
1168         GtkWidget      *button1;
1169
1170         const struct  {
1171                 gchar *fmt;
1172                 gchar *txt;
1173         } time_format[] = {
1174                 { "%a", _("the full abbreviated weekday name") },
1175                 { "%A", _("the full weekday name") },
1176                 { "%b", _("the abbreviated month name") },
1177                 { "%B", _("the full month name") },
1178                 { "%c", _("the preferred date and time for the current locale") },
1179                 { "%C", _("the century number (year/100)") },
1180                 { "%d", _("the day of the month as a decimal number") },
1181                 { "%H", _("the hour as a decimal number using a 24-hour clock") },
1182                 { "%I", _("the hour as a decimal number using a 12-hour clock") },
1183                 { "%j", _("the day of the year as a decimal number") },
1184                 { "%m", _("the month as a decimal number") },
1185                 { "%M", _("the minute as a decimal number") },
1186                 { "%p", _("either AM or PM") },
1187                 { "%S", _("the second as a decimal number") },
1188                 { "%w", _("the day of the week as a decimal number") },
1189                 { "%x", _("the preferred date for the current locale") },
1190                 { "%y", _("the last two digits of a year") },
1191                 { "%Y", _("the year as a decimal number") },
1192                 { "%Z", _("the time zone or name or abbreviation") }
1193         };
1194         int tmp;
1195         const int TIME_FORMAT_ELEMS = sizeof time_format / sizeof time_format[0];
1196
1197         if (date_format) return date_format;
1198
1199         date_format = gtk_window_new(GTK_WINDOW_DIALOG);
1200         gtk_window_set_title(GTK_WINDOW(date_format), _("Date format"));
1201         gtk_window_set_position(GTK_WINDOW(date_format), GTK_WIN_POS_CENTER);
1202         gtk_window_set_default_size(GTK_WINDOW(date_format), 440, 200);
1203
1204         vbox1 = gtk_vbox_new(FALSE, 10);
1205         gtk_widget_show(vbox1);
1206         gtk_container_add(GTK_CONTAINER(date_format), vbox1);
1207
1208         scrolledwindow1 = gtk_scrolled_window_new(NULL, NULL);
1209         gtk_widget_show(scrolledwindow1);
1210         gtk_box_pack_start(GTK_BOX(vbox1), scrolledwindow1, TRUE, TRUE, 0);
1211
1212         date_format_list = gtk_clist_new(2);
1213         gtk_widget_show(date_format_list);
1214         gtk_container_add(GTK_CONTAINER(scrolledwindow1), date_format_list);
1215         gtk_clist_set_column_width(GTK_CLIST(date_format_list), 0, 80);
1216         gtk_clist_set_column_width(GTK_CLIST(date_format_list), 1, 80);
1217         gtk_clist_column_titles_show(GTK_CLIST(date_format_list));
1218
1219         label3 = gtk_label_new(_("Date Format"));
1220         gtk_widget_show(label3);
1221         gtk_clist_set_column_widget(GTK_CLIST(date_format_list), 0, label3);
1222
1223         label4 = gtk_label_new(_("Date Format Description"));
1224         gtk_widget_show(label4);
1225         gtk_clist_set_column_widget(GTK_CLIST(date_format_list), 1, label4);
1226
1227         for (tmp = 0; tmp < TIME_FORMAT_ELEMS; tmp++) {
1228                 gchar *text[3];
1229                 /* phoney casting necessary because of gtk... */
1230                 text[0] = (gchar *) time_format[tmp].fmt;
1231                 text[1] = (gchar *) time_format[tmp].txt;
1232                 text[2] = NULL;
1233                 gtk_clist_append(GTK_CLIST(date_format_list), text);
1234         }
1235
1236         table2 = gtk_table_new(1, 1, TRUE);
1237         gtk_widget_show(table2);
1238         gtk_box_pack_start(GTK_BOX(vbox1), table2, FALSE, TRUE, 0);
1239
1240         vbox2 = gtk_vbox_new(FALSE, 0);
1241         gtk_widget_show(vbox2);
1242         gtk_table_attach(GTK_TABLE(table2), vbox2, 0, 1, 0, 1,
1243                                          (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
1244                                          (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), 0, 0);
1245
1246         vbox3 = gtk_vbox_new(TRUE, 4);
1247         gtk_widget_show(vbox3);
1248         gtk_box_pack_end(GTK_BOX(vbox2), vbox3, FALSE, FALSE, 10);
1249
1250         hbox2 = gtk_hbox_new(FALSE, 0);
1251         gtk_widget_show(hbox2);
1252         gtk_box_pack_start(GTK_BOX(vbox3), hbox2, TRUE, TRUE, 0);
1253
1254         label5 = gtk_label_new(_("Date format"));
1255         gtk_widget_show(label5);
1256         gtk_box_pack_start(GTK_BOX(hbox2), label5, FALSE, FALSE, 0);
1257         gtk_misc_set_padding(GTK_MISC(label5), 8, 0);
1258
1259         datefmt_sample = gtk_entry_new_with_max_length(300);
1260         gtk_widget_show(datefmt_sample);
1261         gtk_box_pack_start(GTK_BOX(hbox2), datefmt_sample, TRUE, TRUE, 40);
1262
1263         hbox1 = gtk_hbox_new(FALSE, 0);
1264         gtk_widget_show(hbox1);
1265         gtk_box_pack_start(GTK_BOX(vbox3), hbox1, TRUE, TRUE, 0);
1266
1267         label6 = gtk_label_new(_("Example"));
1268         gtk_widget_show(label6);
1269         gtk_box_pack_start(GTK_BOX(hbox1), label6, FALSE, TRUE, 0);
1270         gtk_misc_set_padding(GTK_MISC(label6), 8, 0);
1271
1272         label7 = gtk_label_new(_("label7"));
1273         gtk_widget_show(label7);
1274         gtk_box_pack_start(GTK_BOX(hbox1), label7, TRUE, TRUE, 60);
1275         gtk_label_set_justify(GTK_LABEL(label7), GTK_JUSTIFY_LEFT);
1276
1277         hbox3 = gtk_hbox_new(TRUE, 0);
1278         gtk_widget_show(hbox3);
1279         gtk_box_pack_end(GTK_BOX(vbox3), hbox3, FALSE, FALSE, 0);
1280
1281         button1 = gtk_button_new_with_label(_("Close"));
1282         gtk_widget_show(button1);
1283         gtk_box_pack_start(GTK_BOX(hbox3), button1, FALSE, TRUE, 144);
1284
1285         /* set the current format */
1286         gtk_entry_set_text(GTK_ENTRY(datefmt_sample), prefs_common.date_format);
1287         date_format_entry_on_change(GTK_EDITABLE(datefmt_sample),
1288                                     GTK_LABEL(label7));
1289
1290         gtk_signal_connect(GTK_OBJECT(button1), "clicked",
1291                                   GTK_SIGNAL_FUNC(date_format_close_btn_clicked), &date_format);
1292                                   
1293         gtk_signal_connect(GTK_OBJECT(date_format), "delete_event",
1294                             GTK_SIGNAL_FUNC(date_format_on_delete), &date_format);
1295
1296         gtk_signal_connect(GTK_OBJECT(datefmt_sample), "changed",
1297                                 GTK_SIGNAL_FUNC(date_format_entry_on_change), label7);
1298                                   
1299         gtk_window_set_position(GTK_WINDOW(date_format), GTK_WIN_POS_CENTER);
1300         gtk_window_set_modal(GTK_WINDOW(date_format), TRUE);
1301
1302         gtk_widget_show(date_format);                                   
1303         return date_format;
1304 }
1305
1306 static void prefs_display_create(void)
1307 {
1308         GtkWidget *vbox1;
1309         GtkWidget *frame_font;
1310         GtkWidget *table1;
1311         GtkWidget *label_textfont;
1312         GtkWidget *entry_textfont;
1313         GtkWidget *button_textfont;
1314         GtkWidget *chkbtn_folder_unread;
1315         GtkWidget *chkbtn_transhdr;
1316         GtkWidget *frame_summary;
1317         GtkWidget *vbox2;
1318         GtkWidget *chkbtn_swapfrom;
1319         GtkWidget *chkbtn_hscrollbar;
1320         GtkWidget *chkbtn_useaddrbook;
1321         GtkWidget *hbox1;
1322         GtkWidget *label_datefmt;
1323         GtkWidget *button_dispitem;
1324
1325         vbox1 = gtk_vbox_new (FALSE, VSPACING);
1326         gtk_widget_show (vbox1);
1327         gtk_container_add (GTK_CONTAINER (dialog.notebook), vbox1);
1328         gtk_container_set_border_width (GTK_CONTAINER (vbox1), VBOX_BORDER);
1329
1330         PACK_FRAME(vbox1, frame_font, _("Font"));
1331
1332         table1 = gtk_table_new (1, 3, FALSE);
1333         gtk_widget_show (table1);
1334         gtk_container_add (GTK_CONTAINER (frame_font), table1);
1335         gtk_container_set_border_width (GTK_CONTAINER (table1), 8);
1336         gtk_table_set_row_spacings (GTK_TABLE (table1), 8);
1337         gtk_table_set_col_spacings (GTK_TABLE (table1), 8);
1338
1339         label_textfont = gtk_label_new (_("Text"));
1340         gtk_widget_show (label_textfont);
1341         gtk_table_attach (GTK_TABLE (table1), label_textfont, 0, 1, 0, 1,
1342                           GTK_FILL, (GTK_EXPAND | GTK_FILL), 0, 0);
1343
1344         entry_textfont = gtk_entry_new ();
1345         gtk_widget_show (entry_textfont);
1346         gtk_table_attach (GTK_TABLE (table1), entry_textfont, 1, 2, 0, 1,
1347                           (GTK_EXPAND | GTK_FILL), 0, 0, 0);
1348
1349         button_textfont = gtk_button_new_with_label ("... ");
1350         gtk_widget_show (button_textfont);
1351         gtk_table_attach (GTK_TABLE (table1), button_textfont, 2, 3, 0, 1,
1352                           0, 0, 0, 0);
1353         gtk_signal_connect (GTK_OBJECT (button_textfont), "clicked",
1354                             GTK_SIGNAL_FUNC (prefs_font_select), NULL);
1355
1356         vbox2 = gtk_vbox_new (FALSE, VSPACING_NARROW);
1357         gtk_widget_show (vbox2);
1358         gtk_box_pack_start (GTK_BOX (vbox1), vbox2, FALSE, TRUE, 0);
1359
1360         PACK_CHECK_BUTTON
1361                 (vbox2, chkbtn_transhdr,
1362                  _("Translate header name (such as `From:', `Subject:')"));
1363
1364         PACK_CHECK_BUTTON (vbox2, chkbtn_folder_unread,
1365                            _("Display unread number next to folder name"));
1366
1367         /* ---- Summary ---- */
1368
1369         PACK_FRAME(vbox1, frame_summary, _("Summary View"));
1370
1371         vbox2 = gtk_vbox_new (FALSE, VSPACING_NARROW);
1372         gtk_widget_show (vbox2);
1373         gtk_container_add (GTK_CONTAINER (frame_summary), vbox2);
1374         gtk_container_set_border_width (GTK_CONTAINER (vbox2), 8);
1375
1376         PACK_CHECK_BUTTON
1377                 (vbox2, chkbtn_swapfrom,
1378                  _("Display recipient on `From' column if sender is yourself"));
1379         PACK_CHECK_BUTTON
1380                 (vbox2, chkbtn_useaddrbook,
1381                  _("Display sender using address book"));
1382         PACK_CHECK_BUTTON
1383                 (vbox2, chkbtn_hscrollbar, _("Enable horizontal scroll bar"));
1384
1385         hbox1 = gtk_hbox_new (FALSE, 8);
1386         gtk_widget_show (hbox1);
1387         gtk_box_pack_start (GTK_BOX (vbox2), hbox1, FALSE, TRUE, 0);
1388
1389         label_datefmt = gtk_button_new_with_label (_("Date format"));
1390         gtk_widget_show (label_datefmt);
1391         gtk_box_pack_start (GTK_BOX (hbox1), label_datefmt, FALSE, FALSE, 0);
1392         gtk_signal_connect(GTK_OBJECT(label_datefmt), "clicked",
1393                                   GTK_SIGNAL_FUNC(create_date_format), NULL);
1394
1395         entry_datefmt = gtk_entry_new ();
1396         gtk_widget_show (entry_datefmt);
1397         gtk_box_pack_start (GTK_BOX (hbox1), entry_datefmt, TRUE, TRUE, 0);
1398         
1399         hbox1 = gtk_hbox_new (FALSE, 8);
1400         gtk_widget_show (hbox1);
1401         gtk_box_pack_start (GTK_BOX (vbox2), hbox1, FALSE, TRUE, 0);
1402
1403         button_dispitem = gtk_button_new_with_label
1404                 (_(" Set display item of summary... "));
1405         gtk_widget_show (button_dispitem);
1406         gtk_box_pack_start (GTK_BOX (hbox1), button_dispitem, FALSE, TRUE, 0);
1407         gtk_signal_connect (GTK_OBJECT (button_dispitem), "clicked",
1408                             GTK_SIGNAL_FUNC (prefs_summary_display_item_set),
1409                             NULL);
1410
1411         display.entry_textfont  = entry_textfont;
1412         display.button_textfont = button_textfont;
1413
1414         display.chkbtn_folder_unread = chkbtn_folder_unread;
1415         display.chkbtn_transhdr   = chkbtn_transhdr;
1416
1417         display.chkbtn_swapfrom    = chkbtn_swapfrom;
1418         display.chkbtn_hscrollbar  = chkbtn_hscrollbar;
1419         display.chkbtn_useaddrbook = chkbtn_useaddrbook;
1420 }
1421
1422 static void prefs_message_create(void)
1423 {
1424         GtkWidget *vbox1;
1425         GtkWidget *vbox2;
1426         GtkWidget *hbox1;
1427         GtkWidget *chkbtn_enablecol;
1428         GtkWidget *button_edit_col;
1429         GtkWidget *chkbtn_mbalnum;
1430         GtkWidget *chkbtn_disphdrpane;
1431         GtkWidget *chkbtn_disphdr;
1432         GtkWidget *button_edit_disphdr; 
1433         GtkWidget *hbox_linespc;
1434         GtkWidget *label_linespc;
1435         GtkObject *spinbtn_linespc_adj;
1436         GtkWidget *spinbtn_linespc;
1437         GtkWidget *chkbtn_headspc;
1438
1439         GtkWidget *frame_scr;
1440         GtkWidget *vbox_scr;
1441         GtkWidget *chkbtn_smoothscroll;
1442         GtkWidget *hbox_scr;
1443         GtkWidget *label_scr;
1444         GtkObject *spinbtn_scrollstep_adj;
1445         GtkWidget *spinbtn_scrollstep;
1446         GtkWidget *chkbtn_halfpage;
1447
1448         vbox1 = gtk_vbox_new (FALSE, VSPACING);
1449         gtk_widget_show (vbox1);
1450         gtk_container_add (GTK_CONTAINER (dialog.notebook), vbox1);
1451         gtk_container_set_border_width (GTK_CONTAINER (vbox1), VBOX_BORDER);
1452
1453         hbox1 = gtk_hbox_new (FALSE, 8);
1454         gtk_widget_show (hbox1);
1455         gtk_box_pack_start (GTK_BOX (vbox1), hbox1, FALSE, TRUE, 0);
1456
1457         PACK_CHECK_BUTTON (hbox1, chkbtn_enablecol,
1458                            _("Enable coloration of message"));
1459         gtk_signal_connect (GTK_OBJECT (chkbtn_enablecol), "toggled",
1460                                                 GTK_SIGNAL_FUNC (prefs_enable_message_color_toggled),
1461                                                 NULL);
1462
1463         button_edit_col = gtk_button_new_with_label (_(" Edit... "));
1464         gtk_widget_show (button_edit_col);
1465         gtk_box_pack_end (GTK_BOX (hbox1), button_edit_col, FALSE, TRUE, 0);
1466         gtk_signal_connect (GTK_OBJECT (button_edit_col), "clicked",
1467                             GTK_SIGNAL_FUNC (prefs_quote_colors_dialog), NULL);
1468
1469         SET_TOGGLE_SENSITIVITY(chkbtn_enablecol, button_edit_col);
1470
1471         vbox2 = gtk_vbox_new (FALSE, VSPACING_NARROW);
1472         gtk_widget_show (vbox2);
1473         gtk_box_pack_start (GTK_BOX (vbox1), vbox2, FALSE, FALSE, 0);
1474
1475         PACK_CHECK_BUTTON
1476                 (vbox2, chkbtn_mbalnum,
1477                  _("Display 2-byte alphabet and numeric with 1-byte character"));
1478         PACK_CHECK_BUTTON(vbox2, chkbtn_disphdrpane,
1479                           _("Display header pane above message view"));
1480
1481         hbox1 = gtk_hbox_new (FALSE, 8);
1482         gtk_widget_show (hbox1);
1483         gtk_box_pack_start (GTK_BOX (vbox2), hbox1, FALSE, TRUE, 0);
1484
1485         PACK_CHECK_BUTTON(hbox1, chkbtn_disphdr,
1486                 _("Display short headers on message view"));
1487
1488         button_edit_disphdr = gtk_button_new_with_label (_(" Edit... "));
1489         gtk_widget_show (button_edit_disphdr);
1490         gtk_box_pack_end (GTK_BOX (hbox1), button_edit_disphdr,
1491                                   FALSE, TRUE, 0);
1492         gtk_signal_connect (GTK_OBJECT (button_edit_disphdr), "clicked",
1493                                             GTK_SIGNAL_FUNC (prefs_display_header_open),
1494                                             NULL);
1495
1496         SET_TOGGLE_SENSITIVITY(chkbtn_disphdr, button_edit_disphdr);
1497
1498         hbox1 = gtk_hbox_new (FALSE, 32);
1499         gtk_widget_show (hbox1);
1500         gtk_box_pack_start (GTK_BOX (vbox2), hbox1, FALSE, TRUE, 0);
1501
1502         hbox_linespc = gtk_hbox_new (FALSE, 8);
1503         gtk_widget_show (hbox1);
1504         gtk_box_pack_start (GTK_BOX (hbox1), hbox_linespc, FALSE, TRUE, 0);
1505
1506         label_linespc = gtk_label_new (_("Line space"));
1507         gtk_widget_show (label_linespc);
1508         gtk_box_pack_start (GTK_BOX (hbox_linespc), label_linespc,
1509                             FALSE, FALSE, 0);
1510
1511         spinbtn_linespc_adj = gtk_adjustment_new (2, 0, 16, 1, 1, 16);
1512         spinbtn_linespc = gtk_spin_button_new
1513                 (GTK_ADJUSTMENT (spinbtn_linespc_adj), 1, 0);
1514         gtk_widget_show (spinbtn_linespc);
1515         gtk_box_pack_start (GTK_BOX (hbox_linespc), spinbtn_linespc,
1516                             FALSE, FALSE, 0);
1517         gtk_widget_set_usize (spinbtn_linespc, 64, -1);
1518         gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (spinbtn_linespc), TRUE);
1519
1520         label_linespc = gtk_label_new (_("pixel(s)"));
1521         gtk_widget_show (label_linespc);
1522         gtk_box_pack_start (GTK_BOX (hbox_linespc), label_linespc,
1523                             FALSE, FALSE, 0);
1524
1525         PACK_CHECK_BUTTON(hbox1, chkbtn_headspc, _("Leave space on head"));
1526
1527         PACK_FRAME(vbox1, frame_scr, _("Scroll"));
1528
1529         vbox_scr = gtk_vbox_new (FALSE, VSPACING_NARROW);
1530         gtk_widget_show (vbox_scr);
1531         gtk_container_add (GTK_CONTAINER (frame_scr), vbox_scr);
1532         gtk_container_set_border_width (GTK_CONTAINER (vbox_scr), 8);
1533
1534         PACK_CHECK_BUTTON(vbox_scr, chkbtn_halfpage, _("Half page"));
1535
1536         hbox1 = gtk_hbox_new (FALSE, 32);
1537         gtk_widget_show (hbox1);
1538         gtk_box_pack_start (GTK_BOX (vbox_scr), hbox1, FALSE, TRUE, 0);
1539
1540         PACK_CHECK_BUTTON(hbox1, chkbtn_smoothscroll, _("Smooth scroll"));
1541
1542         hbox_scr = gtk_hbox_new (FALSE, 8);
1543         gtk_widget_show (hbox_scr);
1544         gtk_box_pack_start (GTK_BOX (hbox1), hbox_scr, FALSE, FALSE, 0);
1545
1546         label_scr = gtk_label_new (_("Step"));
1547         gtk_widget_show (label_scr);
1548         gtk_box_pack_start (GTK_BOX (hbox_scr), label_scr, FALSE, FALSE, 0);
1549
1550         spinbtn_scrollstep_adj = gtk_adjustment_new (1, 1, 100, 1, 10, 10);
1551         spinbtn_scrollstep = gtk_spin_button_new
1552                 (GTK_ADJUSTMENT (spinbtn_scrollstep_adj), 1, 0);
1553         gtk_widget_show (spinbtn_scrollstep);
1554         gtk_box_pack_start (GTK_BOX (hbox_scr), spinbtn_scrollstep,
1555                             FALSE, FALSE, 0);
1556         gtk_widget_set_usize (spinbtn_scrollstep, 64, -1);
1557         gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (spinbtn_scrollstep),
1558                                      TRUE);
1559
1560         label_scr = gtk_label_new (_("pixel(s)"));
1561         gtk_widget_show (label_scr);
1562         gtk_box_pack_start (GTK_BOX (hbox_scr), label_scr, FALSE, FALSE, 0);
1563
1564         SET_TOGGLE_SENSITIVITY (chkbtn_smoothscroll, hbox_scr)
1565
1566         message.chkbtn_enablecol   = chkbtn_enablecol;
1567         message.button_edit_col    = button_edit_col;
1568         message.chkbtn_mbalnum     = chkbtn_mbalnum;
1569         message.chkbtn_disphdrpane = chkbtn_disphdrpane;
1570         message.chkbtn_disphdr     = chkbtn_disphdr;
1571         message.spinbtn_linespc    = spinbtn_linespc;
1572         message.chkbtn_headspc     = chkbtn_headspc;
1573
1574         message.chkbtn_smoothscroll    = chkbtn_smoothscroll;
1575         message.spinbtn_scrollstep     = spinbtn_scrollstep;
1576         message.spinbtn_scrollstep_adj = spinbtn_scrollstep_adj;
1577         message.chkbtn_halfpage        = chkbtn_halfpage;
1578 }
1579
1580 #if USE_GPGME
1581 static void prefs_privacy_create(void)
1582 {
1583         GtkWidget *vbox1;
1584         GtkWidget *vbox2;
1585         GtkWidget *hbox1;
1586         GtkWidget *checkbtn_gpgme_warning;
1587         GtkWidget *checkbtn_default_encrypt;
1588         GtkWidget *checkbtn_default_sign;
1589         GtkWidget *checkbtn_auto_check_signatures;
1590         GtkWidget *checkbtn_passphrase_grab;
1591         GtkWidget *label;
1592         GtkWidget *menuitem;
1593         GtkWidget *optmenu;
1594         GtkWidget *optmenu_menu;
1595
1596         vbox1 = gtk_vbox_new (FALSE, VSPACING);
1597         gtk_widget_show (vbox1);
1598         gtk_container_add (GTK_CONTAINER (dialog.notebook), vbox1);
1599         gtk_container_set_border_width (GTK_CONTAINER (vbox1), VBOX_BORDER);
1600
1601         vbox2 = gtk_vbox_new (FALSE, VSPACING_NARROW);
1602         gtk_widget_show (vbox2);
1603         gtk_box_pack_start (GTK_BOX (vbox1), vbox2, FALSE, FALSE, 0);
1604
1605         PACK_CHECK_BUTTON
1606                 (vbox2, checkbtn_gpgme_warning,
1607                  _("Display warning on startup if GnuPG does not work"));
1608
1609         PACK_CHECK_BUTTON (vbox2, checkbtn_default_encrypt,
1610                            _("Encrypt message by default"));
1611
1612         PACK_CHECK_BUTTON (vbox2, checkbtn_default_sign,
1613                            _("Sign message by default"));
1614
1615         PACK_CHECK_BUTTON (vbox2, checkbtn_auto_check_signatures,
1616                            _("Automatically check signatures"));
1617
1618 #ifndef __MINGW32__
1619         PACK_CHECK_BUTTON (vbox2, checkbtn_passphrase_grab,
1620                            _("Grab input while entering a passphrase"));
1621 #endif
1622
1623         hbox1 = gtk_hbox_new (FALSE, 8);
1624         gtk_widget_show (hbox1);
1625         gtk_box_pack_start (GTK_BOX (vbox1), hbox1, FALSE, FALSE, 0);
1626
1627         /* create default signkey box */
1628         label = gtk_label_new (_("Default Sign Key"));
1629         gtk_widget_show (label);
1630         gtk_box_pack_start (GTK_BOX (hbox1), label, FALSE, FALSE, 0);
1631         optmenu = gtk_option_menu_new ();
1632         gtk_widget_show (optmenu);
1633         gtk_box_pack_start(GTK_BOX (hbox1), optmenu, FALSE, FALSE, 0);
1634         optmenu_menu = gtk_menu_new ();
1635
1636         MENUITEM_ADD(optmenu_menu, menuitem, "Default Key", "def_key");
1637         MENUITEM_ADD(optmenu_menu, menuitem, "Second Key", "2nd_key");
1638         gtk_option_menu_set_menu (GTK_OPTION_MENU (optmenu), optmenu_menu);
1639         /* FIXME: disabled because not implemented */
1640         gtk_widget_set_sensitive(optmenu, FALSE);
1641
1642         privacy.checkbtn_gpgme_warning   = checkbtn_gpgme_warning;
1643         privacy.checkbtn_default_encrypt = checkbtn_default_encrypt;
1644         privacy.checkbtn_default_sign    = checkbtn_default_sign;
1645         privacy.checkbtn_auto_check_signatures
1646                                          = checkbtn_auto_check_signatures;
1647         privacy.checkbtn_passphrase_grab = checkbtn_passphrase_grab;
1648         privacy.optmenu_default_signkey  = optmenu;
1649 }
1650
1651 static void
1652 prefs_common_default_signkey_set_data_from_optmenu(PrefParam *pparam)
1653 {
1654 #if 0
1655         GtkWidget *menu;
1656         GtkWidget *menuitem;
1657         gchar *charset;
1658
1659         menu = gtk_option_menu_get_menu(GTK_OPTION_MENU(*pparam->widget));
1660         menuitem = gtk_menu_get_active(GTK_MENU(menu));
1661         charset = gtk_object_get_user_data(GTK_OBJECT(menuitem));
1662         g_free(*((gchar **)pparam->data));
1663         *((gchar **)pparam->data) = g_strdup(charset);
1664 #endif
1665 }
1666
1667 static void prefs_common_default_signkey_set_optmenu(PrefParam *pparam)
1668 {
1669 #if 0
1670         GList *cur;
1671         GtkOptionMenu *optmenu = GTK_OPTION_MENU(*pparam->widget);
1672         GtkWidget *menu;
1673         GtkWidget *menuitem;
1674         gchar *charset;
1675         gint n = 0;
1676
1677         g_return_if_fail(optmenu != NULL);
1678         g_return_if_fail(*((gchar **)pparam->data) != NULL);
1679
1680         menu = gtk_option_menu_get_menu(optmenu);
1681         for (cur = GTK_MENU_SHELL(menu)->children;
1682              cur != NULL; cur = cur->next) {
1683                 menuitem = GTK_WIDGET(cur->data);
1684                 charset = gtk_object_get_user_data(GTK_OBJECT(menuitem));
1685                 if (!strcmp(charset, *((gchar **)pparam->data))) {
1686                         gtk_option_menu_set_history(optmenu, n);
1687                         return;
1688                 }
1689                 n++;
1690         }
1691
1692         gtk_option_menu_set_history(optmenu, 0);
1693         prefs_common_charset_set_data_from_optmenu(pparam);
1694 #endif
1695 }
1696 #endif /* USE_GPGME */
1697
1698 static void prefs_interface_create(void)
1699 {
1700         GtkWidget *vbox1;
1701         GtkWidget *vbox2;
1702         GtkWidget *vbox3;
1703         GtkWidget *checkbtn_emacs;
1704         GtkWidget *checkbtn_openunread;
1705         GtkWidget *checkbtn_openinbox;
1706         GtkWidget *checkbtn_immedexec;
1707         GtkWidget *checkbtn_addaddrbyclick;
1708         GtkWidget *label;
1709
1710         GtkWidget *frame_exit;
1711         GtkWidget *vbox_exit;
1712         GtkWidget *hbox1;
1713         GtkWidget *checkbtn_confonexit;
1714         GtkWidget *checkbtn_cleanonexit;
1715         GtkWidget *checkbtn_askonclean;
1716         GtkWidget *checkbtn_warnqueued;
1717         GtkWidget *checkbtn_returnreceipt;
1718
1719         vbox1 = gtk_vbox_new (FALSE, VSPACING);
1720         gtk_widget_show (vbox1);
1721         gtk_container_add (GTK_CONTAINER (dialog.notebook), vbox1);
1722         gtk_container_set_border_width (GTK_CONTAINER (vbox1), VBOX_BORDER);
1723
1724         vbox2 = gtk_vbox_new (FALSE, VSPACING_NARROW);
1725         gtk_widget_show (vbox2);
1726         gtk_box_pack_start (GTK_BOX (vbox1), vbox2, FALSE, FALSE, 0);
1727
1728         PACK_CHECK_BUTTON (vbox2, checkbtn_emacs,
1729                            _("Emulate the behavior of mouse operation of\n"
1730                              "Emacs-based mailer"));
1731         gtk_label_set_justify (GTK_LABEL (GTK_BIN (checkbtn_emacs)->child),
1732                                GTK_JUSTIFY_LEFT);
1733
1734         PACK_CHECK_BUTTON
1735                 (vbox2, checkbtn_openunread,
1736                  _("Open first unread message when entering a folder"));
1737
1738         PACK_CHECK_BUTTON
1739                 (vbox2, checkbtn_openinbox,
1740                  _("Go to inbox after receiving new mail"));
1741
1742         vbox3 = gtk_vbox_new (FALSE, 0);
1743         gtk_widget_show (vbox3);
1744         gtk_box_pack_start (GTK_BOX (vbox2), vbox3, FALSE, FALSE, 0);
1745
1746         PACK_CHECK_BUTTON
1747                 (vbox3, checkbtn_immedexec,
1748                  _("Execute immediately when moving or deleting messages"));
1749
1750         hbox1 = gtk_hbox_new (FALSE, 0);
1751         gtk_widget_show (hbox1);
1752         gtk_box_pack_start (GTK_BOX (vbox3), hbox1, FALSE, FALSE, 0);
1753
1754         label = gtk_label_new
1755                 (_("(Messages will be just marked till execution\n"
1756                    " if this is turned off)"));
1757         gtk_box_pack_start (GTK_BOX (hbox1), label, FALSE, FALSE, 8);
1758         gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT);
1759
1760         PACK_CHECK_BUTTON
1761                 (vbox2, checkbtn_addaddrbyclick,
1762                  _("Add address to destination when double-clicked"));
1763
1764         PACK_FRAME (vbox1, frame_exit, _("On exit"));
1765
1766         vbox_exit = gtk_vbox_new (FALSE, VSPACING_NARROW);
1767         gtk_widget_show (vbox_exit);
1768         gtk_container_add (GTK_CONTAINER (frame_exit), vbox_exit);
1769         gtk_container_set_border_width (GTK_CONTAINER (vbox_exit), 8);
1770
1771         PACK_CHECK_BUTTON (vbox_exit, checkbtn_confonexit,
1772                            _("Confirm on exit"));
1773
1774         hbox1 = gtk_hbox_new (FALSE, 32);
1775         gtk_widget_show (hbox1);
1776         gtk_box_pack_start (GTK_BOX (vbox_exit), hbox1, FALSE, FALSE, 0);
1777
1778         PACK_CHECK_BUTTON (hbox1, checkbtn_cleanonexit,
1779                            _("Empty trash on exit"));
1780         PACK_CHECK_BUTTON (hbox1, checkbtn_askonclean,
1781                            _("Ask before emptying"));
1782         SET_TOGGLE_SENSITIVITY (checkbtn_cleanonexit, checkbtn_askonclean);
1783
1784         PACK_CHECK_BUTTON (vbox_exit, checkbtn_warnqueued,
1785                            _("Warn if there are queued messages"));
1786
1787         PACK_CHECK_BUTTON (vbox_exit, checkbtn_returnreceipt,
1788                            _("Send return receipt on request"));
1789
1790         interface.checkbtn_emacs          = checkbtn_emacs;
1791         interface.checkbtn_openunread     = checkbtn_openunread;
1792         interface.checkbtn_openinbox      = checkbtn_openinbox;
1793         interface.checkbtn_immedexec      = checkbtn_immedexec;
1794         interface.checkbtn_addaddrbyclick = checkbtn_addaddrbyclick;
1795         interface.checkbtn_confonexit     = checkbtn_confonexit;
1796         interface.checkbtn_cleanonexit    = checkbtn_cleanonexit;
1797         interface.checkbtn_askonclean     = checkbtn_askonclean;
1798         interface.checkbtn_warnqueued     = checkbtn_warnqueued;
1799         interface.checkbtn_returnreceipt  = checkbtn_returnreceipt;
1800 }
1801
1802 static void prefs_other_create(void)
1803 {
1804         GtkWidget *vbox1;
1805         GtkWidget *hbox1;
1806
1807         GtkWidget *uri_frame;
1808         GtkWidget *uri_label;
1809         GtkWidget *uri_combo;
1810         GtkWidget *uri_entry;
1811
1812         GtkWidget *print_frame;
1813         GtkWidget *printcmd_label;
1814         GtkWidget *printcmd_entry;
1815
1816         GtkWidget *exteditor_frame;
1817         GtkWidget *exteditor_label;
1818         GtkWidget *exteditor_combo;
1819         GtkWidget *exteditor_entry;
1820
1821         vbox1 = gtk_vbox_new (FALSE, VSPACING);
1822         gtk_widget_show (vbox1);
1823         gtk_container_add (GTK_CONTAINER (dialog.notebook), vbox1);
1824         gtk_container_set_border_width (GTK_CONTAINER (vbox1), VBOX_BORDER);
1825
1826         PACK_FRAME(vbox1, uri_frame,
1827                    _("External Web browser (%s will be replaced with URI)"));
1828
1829         hbox1 = gtk_hbox_new (FALSE, 8);
1830         gtk_widget_show (hbox1);
1831         gtk_container_add (GTK_CONTAINER (uri_frame), hbox1);
1832         gtk_container_set_border_width (GTK_CONTAINER (hbox1), 8);
1833
1834         uri_label = gtk_label_new (_("Command"));
1835         gtk_widget_show(uri_label);
1836         gtk_box_pack_start (GTK_BOX (hbox1), uri_label, FALSE, TRUE, 0);
1837
1838         uri_combo = gtk_combo_new ();
1839         gtk_widget_show (uri_combo);
1840         gtk_box_pack_start (GTK_BOX (hbox1), uri_combo, TRUE, TRUE, 0);
1841         gtkut_combo_set_items (GTK_COMBO (uri_combo),
1842                                "netscape -remote 'openURL(%s,raise)'",
1843                                "gnome-moz-remote --raise --newwin '%s'",
1844                                "kterm -e w3m '%s'",
1845                                "kterm -e lynx '%s'",
1846                                NULL);
1847
1848         uri_entry = GTK_COMBO (uri_combo)->entry;
1849
1850         PACK_FRAME(vbox1, print_frame,
1851                    _("Printing (%s will be replaced with file name)"));
1852
1853         hbox1 = gtk_hbox_new (FALSE, 8);
1854         gtk_widget_show (hbox1);
1855         gtk_container_add (GTK_CONTAINER (print_frame), hbox1);
1856         gtk_container_set_border_width (GTK_CONTAINER (hbox1), 8);
1857
1858         printcmd_label = gtk_label_new (_("Command"));
1859         gtk_widget_show (printcmd_label);
1860         gtk_box_pack_start (GTK_BOX (hbox1), printcmd_label, FALSE, FALSE, 0);
1861
1862         printcmd_entry = gtk_entry_new ();
1863         gtk_widget_show (printcmd_entry);
1864         gtk_box_pack_start (GTK_BOX (hbox1), printcmd_entry, TRUE, TRUE, 0);
1865
1866         PACK_FRAME(vbox1, exteditor_frame,
1867                    _("External editor (%s will be replaced with file name)"));
1868
1869         hbox1 = gtk_hbox_new (FALSE, 8);
1870         gtk_widget_show (hbox1);
1871         gtk_container_add (GTK_CONTAINER (exteditor_frame), hbox1);
1872         gtk_container_set_border_width (GTK_CONTAINER (hbox1), 8);
1873
1874         exteditor_label = gtk_label_new (_("Command"));
1875         gtk_widget_show (exteditor_label);
1876         gtk_box_pack_start (GTK_BOX (hbox1), exteditor_label, FALSE, FALSE, 0);
1877
1878         exteditor_combo = gtk_combo_new ();
1879         gtk_widget_show (exteditor_combo);
1880         gtk_box_pack_start (GTK_BOX (hbox1), exteditor_combo, TRUE, TRUE, 0);
1881         gtkut_combo_set_items (GTK_COMBO (exteditor_combo),
1882                                "gedit %s",
1883                                "mgedit --no-fork %s",
1884                                "emacs %s",
1885                                "xemacs %s",
1886                                "kterm -e jed %s",
1887                                "kterm -e vi %s",
1888                                NULL);
1889         exteditor_entry = GTK_COMBO (exteditor_combo)->entry;
1890
1891         other.uri_combo = uri_combo;
1892         other.uri_entry = uri_entry;
1893         other.printcmd_entry = printcmd_entry;
1894
1895         other.exteditor_combo = exteditor_combo;
1896         other.exteditor_entry = exteditor_entry;
1897 }
1898
1899 void prefs_quote_colors_dialog(void)
1900 {
1901         if (!quote_color_win)
1902                 prefs_quote_colors_dialog_create();
1903         gtk_widget_show(quote_color_win);
1904
1905         gtk_main();
1906         gtk_widget_hide(quote_color_win);
1907
1908         textview_update_message_colors();
1909         main_window_reflect_prefs_all();
1910 }
1911
1912 static void prefs_quote_colors_dialog_create(void)
1913 {
1914         GtkWidget *window;
1915         GtkWidget *vbox;
1916         GtkWidget *table;
1917         GtkWidget *quotelevel1_label;
1918         GtkWidget *quotelevel2_label;
1919         GtkWidget *quotelevel3_label;
1920         GtkWidget *uri_label;
1921         GtkWidget *hbbox;
1922         GtkWidget *ok_btn;
1923         //GtkWidget *cancel_btn;
1924         GtkWidget *recycle_colors_btn;
1925         GtkWidget *frame_colors;
1926
1927         window = gtk_window_new(GTK_WINDOW_DIALOG);
1928         gtk_container_set_border_width(GTK_CONTAINER(window), 2);
1929         gtk_window_set_title(GTK_WINDOW(window), _("Set message colors"));
1930         gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);
1931         gtk_window_set_modal(GTK_WINDOW(window), TRUE);
1932         gtk_window_set_policy(GTK_WINDOW(window), FALSE, TRUE, FALSE);
1933
1934         vbox = gtk_vbox_new (FALSE, VSPACING);
1935         gtk_container_add (GTK_CONTAINER (window), vbox);
1936         gtk_container_set_border_width (GTK_CONTAINER (vbox), 8);
1937         PACK_FRAME(vbox, frame_colors, _("Colors"));
1938
1939         table = gtk_table_new (4, 2, FALSE);
1940         gtk_container_add (GTK_CONTAINER (frame_colors), table);
1941         gtk_container_set_border_width (GTK_CONTAINER (table), 8);
1942         gtk_table_set_row_spacings (GTK_TABLE (table), 2);
1943         gtk_table_set_col_spacings (GTK_TABLE (table), 4);
1944
1945 /*      gtk_box_pack_start(GTK_BOX(vbox), table, FALSE, FALSE, 0); */
1946
1947         color_buttons.quote_level1_btn = gtk_button_new();
1948         gtk_table_attach(GTK_TABLE (table), color_buttons.quote_level1_btn, 0, 1, 0, 1,
1949                                         (GtkAttachOptions) (0),
1950                                         (GtkAttachOptions) (0), 0, 0);
1951         gtk_widget_set_usize (color_buttons.quote_level1_btn, 40, 30);
1952         gtk_container_set_border_width (GTK_CONTAINER (color_buttons.quote_level1_btn), 5);
1953
1954         color_buttons.quote_level2_btn = gtk_button_new();
1955         gtk_table_attach(GTK_TABLE (table), color_buttons.quote_level2_btn, 0, 1, 1, 2,
1956                                         (GtkAttachOptions) (0),
1957                                         (GtkAttachOptions) (0), 0, 0);
1958         gtk_widget_set_usize (color_buttons.quote_level2_btn, 40, 30);
1959         gtk_container_set_border_width (GTK_CONTAINER (color_buttons.quote_level2_btn), 5);
1960
1961         color_buttons.quote_level3_btn = gtk_button_new_with_label ("");
1962         gtk_table_attach(GTK_TABLE (table), color_buttons.quote_level3_btn, 0, 1, 2, 3,
1963                                         (GtkAttachOptions) (0),
1964                                         (GtkAttachOptions) (0), 0, 0);
1965         gtk_widget_set_usize (color_buttons.quote_level3_btn, 40, 30);
1966         gtk_container_set_border_width (GTK_CONTAINER (color_buttons.quote_level3_btn), 5);
1967
1968         color_buttons.uri_btn = gtk_button_new_with_label ("");
1969         gtk_table_attach(GTK_TABLE (table), color_buttons.uri_btn, 0, 1, 3, 4,
1970                                         (GtkAttachOptions) (0),
1971                                         (GtkAttachOptions) (0), 0, 0);
1972         gtk_widget_set_usize (color_buttons.uri_btn, 40, 30);
1973         gtk_container_set_border_width (GTK_CONTAINER (color_buttons.uri_btn), 5);
1974
1975         quotelevel1_label = gtk_label_new (_("Quoted Text - First Level"));
1976         gtk_table_attach(GTK_TABLE (table), quotelevel1_label, 1, 2, 0, 1,
1977                                         (GTK_EXPAND | GTK_FILL), 0, 0, 0);
1978         gtk_label_set_justify (GTK_LABEL (quotelevel1_label), GTK_JUSTIFY_LEFT);
1979         gtk_misc_set_alignment (GTK_MISC (quotelevel1_label), 0, 0.5);
1980
1981         quotelevel2_label = gtk_label_new (_("Quoted Text - Second Level"));
1982         gtk_table_attach(GTK_TABLE (table), quotelevel2_label, 1, 2, 1, 2,
1983                                         (GTK_EXPAND | GTK_FILL), 0, 0, 0);
1984         gtk_label_set_justify (GTK_LABEL (quotelevel2_label), GTK_JUSTIFY_LEFT);
1985         gtk_misc_set_alignment (GTK_MISC (quotelevel2_label), 0, 0.5);
1986
1987         quotelevel3_label = gtk_label_new (_("Quoted Text - Third Level"));
1988         gtk_table_attach(GTK_TABLE (table), quotelevel3_label, 1, 2, 2, 3,
1989                                         (GTK_EXPAND | GTK_FILL), 0, 0, 0);
1990         gtk_label_set_justify (GTK_LABEL (quotelevel3_label), GTK_JUSTIFY_LEFT);
1991         gtk_misc_set_alignment (GTK_MISC (quotelevel3_label), 0, 0.5);
1992
1993         uri_label = gtk_label_new (_("URI link"));
1994         gtk_table_attach(GTK_TABLE (table), uri_label, 1, 2, 3, 4,
1995                                         (GTK_EXPAND | GTK_FILL), 0, 0, 0);
1996         gtk_label_set_justify (GTK_LABEL (uri_label), GTK_JUSTIFY_LEFT);
1997         gtk_misc_set_alignment (GTK_MISC (uri_label), 0, 0.5);
1998
1999         PACK_CHECK_BUTTON (vbox, recycle_colors_btn,
2000                            _("Recycle quote colors"));
2001
2002         gtkut_button_set_create(&hbbox, &ok_btn, _("OK"),
2003                                 NULL, NULL, NULL, NULL);
2004         gtk_box_pack_end(GTK_BOX(vbox), hbbox, FALSE, FALSE, 0);
2005
2006         gtk_widget_grab_default(ok_btn);
2007         gtk_signal_connect(GTK_OBJECT(ok_btn), "clicked",
2008                                         GTK_SIGNAL_FUNC(gtk_main_quit), NULL);
2009         gtk_signal_connect(GTK_OBJECT(window), "delete_event",
2010                                         GTK_SIGNAL_FUNC(gtk_main_quit), NULL);
2011
2012         gtk_signal_connect(GTK_OBJECT(color_buttons.quote_level1_btn), "clicked",
2013                            GTK_SIGNAL_FUNC(quote_color_set_dialog), "LEVEL1");
2014         gtk_signal_connect(GTK_OBJECT(color_buttons.quote_level2_btn), "clicked",
2015                            GTK_SIGNAL_FUNC(quote_color_set_dialog), "LEVEL2");
2016         gtk_signal_connect(GTK_OBJECT(color_buttons.quote_level3_btn), "clicked",
2017                            GTK_SIGNAL_FUNC(quote_color_set_dialog), "LEVEL3");
2018         gtk_signal_connect(GTK_OBJECT(color_buttons.uri_btn), "clicked",
2019                            GTK_SIGNAL_FUNC(quote_color_set_dialog), "URI");
2020         gtk_signal_connect(GTK_OBJECT(recycle_colors_btn), "toggled",
2021                            GTK_SIGNAL_FUNC(prefs_recycle_colors_toggled), NULL);
2022
2023         /* show message button colors and recycle options */
2024         set_button_bg_color(color_buttons.quote_level1_btn,
2025                             prefs_common.quote_level1_col);
2026         set_button_bg_color(color_buttons.quote_level2_btn,
2027                             prefs_common.quote_level2_col);
2028         set_button_bg_color(color_buttons.quote_level3_btn,
2029                             prefs_common.quote_level3_col);
2030         set_button_bg_color(color_buttons.uri_btn,
2031                             prefs_common.uri_col);
2032         gtk_toggle_button_set_active((GtkToggleButton *)recycle_colors_btn,
2033                                      prefs_common.recycle_quote_colors);
2034
2035         gtk_widget_show_all(vbox);
2036         quote_color_win = window;
2037 }
2038
2039 static void quote_color_set_dialog(GtkWidget *widget, gpointer data)
2040 {
2041         gchar *type = (gchar *)data;
2042         gchar *title = NULL;
2043         gdouble color[4] = {0.0, 0.0, 0.0, 0.0};
2044         gint rgbvalue = 0;
2045         GtkColorSelectionDialog *dialog;
2046
2047         if(g_strcasecmp(type, "LEVEL1") == 0) {
2048                 title = _("Pick color for quotation level 1");
2049                 rgbvalue = prefs_common.quote_level1_col;
2050         } else if(g_strcasecmp(type, "LEVEL2") == 0) {
2051                 title = _("Pick color for quotation level 2");
2052                 rgbvalue = prefs_common.quote_level2_col;
2053         } else if(g_strcasecmp(type, "LEVEL3") == 0) {
2054                 title = _("Pick color for quotation level 3");
2055                 rgbvalue = prefs_common.quote_level3_col;
2056         } else if(g_strcasecmp(type, "URI") == 0) {
2057                 title = _("Pick color for URI");
2058                 rgbvalue = prefs_common.uri_col;
2059         } else {   /* Should never be called */
2060                 fprintf(stderr, "Unrecognized datatype '%s' in quote_color_set_dialog\n", type);
2061                 return;
2062         }
2063
2064         color_dialog = gtk_color_selection_dialog_new(title);
2065         gtk_window_set_position(GTK_WINDOW(color_dialog), GTK_WIN_POS_CENTER);
2066         gtk_window_set_modal(GTK_WINDOW(color_dialog), TRUE);
2067         gtk_window_set_policy(GTK_WINDOW(color_dialog), FALSE, FALSE, FALSE);
2068
2069         gtk_signal_connect(GTK_OBJECT(((GtkColorSelectionDialog *)color_dialog)->ok_button),
2070                            "clicked", GTK_SIGNAL_FUNC(quote_colors_set_dialog_ok), data);
2071         gtk_signal_connect(GTK_OBJECT(((GtkColorSelectionDialog *)color_dialog)->cancel_button),
2072                            "clicked", GTK_SIGNAL_FUNC(quote_colors_set_dialog_cancel), data);
2073
2074         /* preselect the previous color in the color selection dialog */
2075         color[0] = (gdouble) ((rgbvalue & 0xff0000) >> 16) / 255.0;
2076         color[1] = (gdouble) ((rgbvalue & 0x00ff00) >>  8) / 255.0;
2077         color[2] = (gdouble)  (rgbvalue & 0x0000ff)        / 255.0;
2078         dialog = (GtkColorSelectionDialog *)color_dialog;
2079         gtk_color_selection_set_color
2080                 ((GtkColorSelection *)dialog->colorsel, color);
2081
2082         gtk_widget_show(color_dialog);
2083 }
2084
2085 static void quote_colors_set_dialog_ok(GtkWidget *widget, gpointer data)
2086 {
2087         GtkColorSelection *colorsel = (GtkColorSelection *)
2088                                                 ((GtkColorSelectionDialog *)color_dialog)->colorsel;
2089         gdouble color[4];
2090         gint red, green, blue, rgbvalue;
2091         gchar *type = (gchar *)data;
2092
2093         gtk_color_selection_get_color(colorsel, color);
2094
2095         red      = (gint) (color[0] * 255.0);
2096         green    = (gint) (color[1] * 255.0);
2097         blue     = (gint) (color[2] * 255.0);
2098         rgbvalue = (gint) ((red * 0x10000) | (green * 0x100) | blue);
2099
2100 #if 0
2101         fprintf(stderr, "redc = %f, greenc = %f, bluec = %f\n", color[0], color[1], color[2]);
2102         fprintf(stderr, "red = %d, green = %d, blue = %d\n", red, green, blue);
2103         fprintf(stderr, "Color is %x\n", rgbvalue);
2104 #endif
2105
2106         if (g_strcasecmp(type, "LEVEL1") == 0) {
2107                 prefs_common.quote_level1_col = rgbvalue;
2108                 set_button_bg_color(color_buttons.quote_level1_btn, rgbvalue);
2109         } else if (g_strcasecmp(type, "LEVEL2") == 0) {
2110                 prefs_common.quote_level2_col = rgbvalue;
2111                 set_button_bg_color(color_buttons.quote_level2_btn, rgbvalue);
2112         } else if (g_strcasecmp(type, "LEVEL3") == 0) {
2113                 prefs_common.quote_level3_col = rgbvalue;
2114                 set_button_bg_color(color_buttons.quote_level3_btn, rgbvalue);
2115         } else if (g_strcasecmp(type, "URI") == 0) {
2116                 prefs_common.uri_col = rgbvalue;
2117                 set_button_bg_color(color_buttons.uri_btn, rgbvalue);
2118         } else
2119                 fprintf( stderr, "Unrecognized datatype '%s' in quote_color_set_dialog_ok\n", type );
2120
2121         gtk_widget_hide(color_dialog);
2122 }
2123
2124 static void quote_colors_set_dialog_cancel(GtkWidget *widget, gpointer data)
2125 {
2126         gtk_widget_hide(color_dialog);
2127 }
2128
2129 static void set_button_bg_color(GtkWidget *widget, gint rgbvalue)
2130 {
2131         GtkStyle *newstyle;
2132         GdkColor color;
2133
2134         gtkut_convert_int_to_gdk_color(rgbvalue, &color);
2135         newstyle = gtk_style_copy(gtk_widget_get_default_style());
2136         newstyle->bg[GTK_STATE_NORMAL]   = color;
2137         newstyle->bg[GTK_STATE_PRELIGHT] = color;
2138         newstyle->bg[GTK_STATE_ACTIVE]   = color;
2139
2140         gtk_widget_set_style(GTK_WIDGET(widget), newstyle);
2141 }
2142
2143 static void prefs_enable_message_color_toggled(void)
2144 {
2145         gboolean is_active;
2146
2147         is_active = gtk_toggle_button_get_active
2148                 (GTK_TOGGLE_BUTTON(message.chkbtn_enablecol));
2149         gtk_widget_set_sensitive(message.button_edit_col, is_active);
2150         prefs_common.enable_color = is_active;
2151 }
2152
2153 static void prefs_recycle_colors_toggled(GtkWidget *widget)
2154 {
2155         gboolean is_active;
2156
2157         is_active = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget));
2158         prefs_common.recycle_quote_colors = is_active;
2159 }
2160
2161 static void prefs_quote_description(void)
2162 {
2163         if (!quote_desc_win)
2164                 prefs_quote_description_create();
2165
2166         gtk_widget_show(quote_desc_win);
2167         gtk_main();
2168         gtk_widget_hide(quote_desc_win);
2169 }
2170
2171 static void prefs_quote_description_create(void)
2172 {
2173         GtkWidget *vbox;
2174         GtkWidget *hbox;
2175         GtkWidget *hbbox;
2176         GtkWidget *label;
2177         GtkWidget *ok_btn;
2178
2179         quote_desc_win = gtk_window_new(GTK_WINDOW_DIALOG);
2180         gtk_window_set_title(GTK_WINDOW(quote_desc_win),
2181                              _("Description of symbols"));
2182         gtk_container_set_border_width(GTK_CONTAINER(quote_desc_win), 8);
2183         gtk_window_set_position(GTK_WINDOW(quote_desc_win), GTK_WIN_POS_CENTER);
2184         gtk_window_set_modal(GTK_WINDOW(quote_desc_win), TRUE);
2185         gtk_window_set_policy(GTK_WINDOW(quote_desc_win), FALSE, TRUE, FALSE);
2186
2187         vbox = gtk_vbox_new(FALSE, 8);
2188         gtk_container_add(GTK_CONTAINER(quote_desc_win), vbox);
2189
2190         hbox = gtk_hbox_new(FALSE, 4);
2191         gtk_box_pack_start(GTK_BOX(vbox), hbox, TRUE, TRUE, 0);
2192
2193         label = gtk_label_new
2194                 ("%d:\n"
2195                  "%f:\n"
2196                  "%n:\n"
2197                  "%N:\n"
2198                  "%I:\n"
2199                  "%s:\n"
2200                  "%t:\n"
2201                  "%i:\n"
2202                  "%%:");
2203
2204         gtk_box_pack_start(GTK_BOX(hbox), label, TRUE, TRUE, 0);
2205         gtk_label_set_justify(GTK_LABEL(label), GTK_JUSTIFY_LEFT);
2206
2207         label = gtk_label_new
2208                 (_("Date\n"
2209                    "From\n"
2210                    "Full Name of Sender\n"
2211                    "First Name of Sender\n"
2212                    "Initial of Sender\n"
2213                    "Subject\n"
2214                    "To\n"
2215                    "Message-ID\n"
2216                    "%"));
2217
2218         gtk_box_pack_start(GTK_BOX(hbox), label, TRUE, TRUE, 0);
2219         gtk_label_set_justify(GTK_LABEL(label), GTK_JUSTIFY_LEFT);
2220
2221         gtkut_button_set_create(&hbbox, &ok_btn, _("OK"),
2222                                 NULL, NULL, NULL, NULL);
2223         gtk_box_pack_end(GTK_BOX(vbox), hbbox, FALSE, FALSE, 0);
2224
2225         gtk_widget_grab_default(ok_btn);
2226         gtk_signal_connect(GTK_OBJECT(ok_btn), "clicked",
2227                                   GTK_SIGNAL_FUNC(gtk_main_quit), NULL);
2228
2229         gtk_signal_connect(GTK_OBJECT(quote_desc_win), "delete_event",
2230                                           GTK_SIGNAL_FUNC(gtk_main_quit), NULL);
2231
2232         gtk_widget_show_all(vbox);
2233 }
2234
2235 /* functions for setting items of SummaryView */
2236
2237 static struct _SummaryDisplayItem
2238 {
2239         GtkWidget *window;
2240
2241         GtkWidget *chkbtn[N_SUMMARY_COLS];
2242
2243         GtkWidget *ok_btn;
2244         GtkWidget *cancel_btn;
2245 } summarydispitem;
2246
2247 #define SET_ACTIVE(column, var) \
2248         gtk_toggle_button_set_active \
2249                 (GTK_TOGGLE_BUTTON(summarydispitem.chkbtn[column]), \
2250                  prefs_common.var)
2251 #define GET_ACTIVE(column, var) \
2252         prefs_common.var = gtk_toggle_button_get_active \
2253                 (GTK_TOGGLE_BUTTON(summarydispitem.chkbtn[column]))
2254
2255 void prefs_summary_display_item_set(void)
2256 {
2257         static gboolean cancelled;
2258
2259         if (!summarydispitem.window)
2260                 prefs_summary_display_item_dialog_create(&cancelled);
2261         gtk_widget_grab_focus(summarydispitem.ok_btn);
2262         gtk_widget_show(summarydispitem.window);
2263         manage_window_set_transient(GTK_WINDOW(summarydispitem.window));
2264
2265         SET_ACTIVE(S_COL_MARK, show_mark);
2266         SET_ACTIVE(S_COL_UNREAD, show_unread);
2267         SET_ACTIVE(S_COL_MIME, show_mime);
2268         SET_ACTIVE(S_COL_NUMBER, show_number);
2269         SET_ACTIVE(S_COL_SCORE, show_score);
2270         SET_ACTIVE(S_COL_SIZE, show_size);
2271         SET_ACTIVE(S_COL_DATE, show_date);
2272         SET_ACTIVE(S_COL_FROM, show_from);
2273         SET_ACTIVE(S_COL_SUBJECT, show_subject);
2274
2275         gtk_main();
2276         gtk_widget_hide(summarydispitem.window);
2277
2278         if (cancelled != TRUE) {
2279                 GET_ACTIVE(S_COL_MARK, show_mark);
2280                 GET_ACTIVE(S_COL_UNREAD, show_unread);
2281                 GET_ACTIVE(S_COL_MIME, show_mime);
2282                 GET_ACTIVE(S_COL_NUMBER, show_number);
2283                 GET_ACTIVE(S_COL_SCORE, show_score);
2284                 GET_ACTIVE(S_COL_SIZE, show_size);
2285                 GET_ACTIVE(S_COL_DATE, show_date);
2286                 GET_ACTIVE(S_COL_FROM, show_from);
2287                 GET_ACTIVE(S_COL_SUBJECT, show_subject);
2288
2289                 main_window_reflect_prefs_all();
2290         }
2291 }
2292
2293 #define SET_CHECK_BUTTON(column, label) \
2294 { \
2295         summarydispitem.chkbtn[column] = \
2296                 gtk_check_button_new_with_label(label); \
2297         gtk_box_pack_start(GTK_BOX(chkbtn_vbox), \
2298                            summarydispitem.chkbtn[column], \
2299                            FALSE, FALSE, 0); \
2300 }
2301
2302 static void prefs_summary_display_item_dialog_create(gboolean *cancelled)
2303 {
2304         GtkWidget *window;
2305         GtkWidget *vbox;
2306         GtkWidget *chkbtn_vbox;
2307         GtkWidget *hbbox;
2308         GtkWidget *ok_btn;
2309         GtkWidget *cancel_btn;
2310
2311         window = gtk_window_new(GTK_WINDOW_DIALOG);
2312         gtk_container_set_border_width(GTK_CONTAINER(window), 8);
2313         gtk_window_set_title(GTK_WINDOW(window), _("Set display item"));
2314         gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);
2315         gtk_window_set_modal(GTK_WINDOW(window), TRUE);
2316         gtk_window_set_policy(GTK_WINDOW(window), FALSE, FALSE, FALSE);
2317         gtk_signal_connect(GTK_OBJECT(window), "delete_event",
2318                            GTK_SIGNAL_FUNC(display_item_delete_event),
2319                            cancelled);
2320         gtk_signal_connect(GTK_OBJECT(window), "key_press_event",
2321                            GTK_SIGNAL_FUNC(display_item_key_pressed),
2322                            cancelled);
2323
2324         vbox = gtk_vbox_new(FALSE, 8);
2325         gtk_container_add(GTK_CONTAINER(window), vbox);
2326
2327         chkbtn_vbox = gtk_vbox_new(FALSE, 0);
2328         gtk_box_pack_start(GTK_BOX(vbox), chkbtn_vbox, FALSE, FALSE, 0);
2329
2330         SET_CHECK_BUTTON(S_COL_MARK, _("Mark"));
2331         SET_CHECK_BUTTON(S_COL_UNREAD, _("Unread"));
2332         SET_CHECK_BUTTON(S_COL_MIME, _("MIME"));
2333         SET_CHECK_BUTTON(S_COL_NUMBER, _("Number"));
2334         SET_CHECK_BUTTON(S_COL_SCORE, _("Score"));
2335         SET_CHECK_BUTTON(S_COL_SIZE, _("Size"));
2336         SET_CHECK_BUTTON(S_COL_DATE, _("Date"));
2337         SET_CHECK_BUTTON(S_COL_FROM, _("From"));
2338         SET_CHECK_BUTTON(S_COL_SUBJECT, _("Subject"));
2339
2340         gtkut_button_set_create(&hbbox, &ok_btn, _("OK"),
2341                                 &cancel_btn, _("Cancel"), NULL, NULL);
2342         gtk_box_pack_end(GTK_BOX(vbox), hbbox, FALSE, FALSE, 0);
2343         gtk_widget_grab_default(ok_btn);
2344
2345         gtk_signal_connect(GTK_OBJECT(ok_btn), "clicked",
2346                            GTK_SIGNAL_FUNC(display_item_ok), cancelled);
2347         gtk_signal_connect(GTK_OBJECT(cancel_btn), "clicked",
2348                            GTK_SIGNAL_FUNC(display_item_cancel), cancelled);
2349
2350         gtk_widget_show_all(vbox);
2351
2352         summarydispitem.window = window;
2353         summarydispitem.ok_btn = ok_btn;
2354         summarydispitem.cancel_btn = cancel_btn;
2355 }
2356
2357 static void display_item_ok(GtkWidget *widget, gboolean *cancelled)
2358 {
2359         *cancelled = FALSE;
2360         gtk_main_quit();
2361 }
2362
2363 static void display_item_cancel(GtkWidget *widget, gboolean *cancelled)
2364 {
2365         *cancelled = TRUE;
2366         gtk_main_quit();
2367 }
2368
2369 static gint display_item_delete_event(GtkWidget *widget, GdkEventAny *event,
2370                                       gboolean *cancelled)
2371 {
2372         *cancelled = TRUE;
2373         gtk_main_quit();
2374
2375         return TRUE;
2376 }
2377
2378 static void display_item_key_pressed(GtkWidget *widget, GdkEventKey *event,
2379                                      gboolean *cancelled)
2380 {
2381         if (event && event->keyval == GDK_Escape) {
2382                 *cancelled = TRUE;
2383                 gtk_main_quit();
2384         }
2385 }
2386
2387 static void prefs_font_select(GtkButton *button)
2388 {
2389         if (!font_sel_win) {
2390                 font_sel_win = gtk_font_selection_dialog_new
2391                         (_("Font selection"));
2392                 gtk_window_position(GTK_WINDOW(font_sel_win),
2393                                     GTK_WIN_POS_CENTER);
2394                 gtk_signal_connect(GTK_OBJECT(font_sel_win), "delete_event",
2395                                    GTK_SIGNAL_FUNC(gtk_widget_hide_on_delete),
2396                                    NULL);
2397                 gtk_signal_connect
2398                         (GTK_OBJECT(font_sel_win), "key_press_event",
2399                          GTK_SIGNAL_FUNC(prefs_font_selection_key_pressed),
2400                          NULL);
2401                 gtk_signal_connect
2402                         (GTK_OBJECT(GTK_FONT_SELECTION_DIALOG(font_sel_win)->ok_button),
2403                          "clicked",
2404                          GTK_SIGNAL_FUNC(prefs_font_selection_ok),
2405                          NULL);
2406                 gtk_signal_connect_object
2407                         (GTK_OBJECT(GTK_FONT_SELECTION_DIALOG(font_sel_win)->cancel_button),
2408                          "clicked",
2409                          GTK_SIGNAL_FUNC(gtk_widget_hide_on_delete),
2410                          GTK_OBJECT(font_sel_win));
2411         }
2412
2413         manage_window_set_transient(GTK_WINDOW(font_sel_win));
2414         gtk_window_set_modal(GTK_WINDOW(font_sel_win), TRUE);
2415         gtk_widget_grab_focus
2416                 (GTK_FONT_SELECTION_DIALOG(font_sel_win)->ok_button);
2417         gtk_widget_show(font_sel_win);
2418 }
2419
2420 static void prefs_font_selection_key_pressed(GtkWidget *widget,
2421                                              GdkEventKey *event,
2422                                              gpointer data)
2423 {
2424         if (event && event->keyval == GDK_Escape)
2425                 gtk_widget_hide(font_sel_win);
2426 }
2427
2428 static void prefs_font_selection_ok(GtkButton *button)
2429 {
2430         gchar *fontname;
2431
2432         fontname = gtk_font_selection_dialog_get_font_name
2433                 (GTK_FONT_SELECTION_DIALOG(font_sel_win));
2434
2435         if (fontname) {
2436                 gtk_entry_set_text(GTK_ENTRY(display.entry_textfont), fontname);
2437                 g_free(fontname);
2438         }
2439
2440         gtk_widget_hide(font_sel_win);
2441 }
2442
2443 static void prefs_common_charset_set_data_from_optmenu(PrefParam *pparam)
2444 {
2445         GtkWidget *menu;
2446         GtkWidget *menuitem;
2447         gchar *charset;
2448
2449         menu = gtk_option_menu_get_menu(GTK_OPTION_MENU(*pparam->widget));
2450         menuitem = gtk_menu_get_active(GTK_MENU(menu));
2451         charset = gtk_object_get_user_data(GTK_OBJECT(menuitem));
2452         g_free(*((gchar **)pparam->data));
2453         *((gchar **)pparam->data) = g_strdup(charset);
2454 }
2455
2456 static void prefs_common_charset_set_optmenu(PrefParam *pparam)
2457 {
2458         GList *cur;
2459         GtkOptionMenu *optmenu = GTK_OPTION_MENU(*pparam->widget);
2460         GtkWidget *menu;
2461         GtkWidget *menuitem;
2462         gchar *charset;
2463         gint n = 0;
2464
2465         g_return_if_fail(optmenu != NULL);
2466         g_return_if_fail(*((gchar **)pparam->data) != NULL);
2467
2468         menu = gtk_option_menu_get_menu(optmenu);
2469         for (cur = GTK_MENU_SHELL(menu)->children;
2470              cur != NULL; cur = cur->next) {
2471                 menuitem = GTK_WIDGET(cur->data);
2472                 charset = gtk_object_get_user_data(GTK_OBJECT(menuitem));
2473                 if (!strcmp(charset, *((gchar **)pparam->data))) {
2474                         gtk_option_menu_set_history(optmenu, n);
2475                         return;
2476                 }
2477                 n++;
2478         }
2479
2480         gtk_option_menu_set_history(optmenu, 0);
2481         prefs_common_charset_set_data_from_optmenu(pparam);
2482 }
2483
2484 static gint prefs_common_deleted(GtkWidget *widget, GdkEventAny *event,
2485                                  gpointer data)
2486 {
2487         prefs_common_cancel();
2488         return TRUE;
2489 }
2490
2491 static void prefs_common_key_pressed(GtkWidget *widget, GdkEventKey *event,
2492                                      gpointer data)
2493 {
2494         if (event && event->keyval == GDK_Escape)
2495                 prefs_common_cancel();  
2496 }
2497
2498 static void prefs_common_ok(void)
2499 {
2500         prefs_common_apply();
2501         gtk_widget_hide(dialog.window);
2502         if (quote_desc_win && GTK_WIDGET_VISIBLE(quote_desc_win))
2503                 gtk_widget_hide(quote_desc_win);
2504
2505         inc_autocheck_timer_set();
2506 }
2507
2508 static void prefs_common_apply(void)
2509 {
2510         prefs_set_data_from_dialog(param);
2511         main_window_reflect_prefs_all();
2512         prefs_common_save_config();
2513 }
2514
2515 static void prefs_common_cancel(void)
2516 {
2517         gtk_widget_hide(dialog.window);
2518         inc_autocheck_timer_set();
2519 }