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