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