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