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