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