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