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