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