sync with 0.9.4cvs6
[claws.git] / src / prefs_common.c
1 /*
2  * Sylpheed -- a GTK+ based, lightweight, and fast e-mail client
3  * Copyright (C) 1999-2003 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 #include <errno.h>
36
37 #include "intl.h"
38 #include "main.h"
39 #include "prefs_gtk.h"
40 #include "prefs_common.h"
41 #include "prefs_display_header.h"
42 #include "prefs_summary_column.h"
43 #include "mainwindow.h"
44 #include "summaryview.h"
45 #include "messageview.h"
46 #include "manage_window.h"
47 #include "inc.h"
48 #include "menu.h"
49 #include "codeconv.h"
50 #include "utils.h"
51 #include "gtkutils.h"
52 #include "alertpanel.h"
53 #include "folder.h"
54 #include "socket.h"
55 #include "filesel.h"
56 #include "folderview.h"
57 #include "stock_pixmap.h"
58 #include "quote_fmt.h"
59
60 PrefsCommon prefs_common;
61
62 static PrefsDialog dialog;
63
64 static struct Receive {
65         GtkWidget *checkbtn_incext;
66         GtkWidget *entry_incext;
67         GtkWidget *button_incext;
68
69         GtkWidget *checkbtn_local;
70         GtkWidget *checkbtn_filter_on_inc;
71         GtkWidget *entry_spool;
72
73         GtkWidget *checkbtn_autochk;
74         GtkWidget *spinbtn_autochk;
75         GtkObject *spinbtn_autochk_adj;
76
77         GtkWidget *checkbtn_chkonstartup;
78         GtkWidget *checkbtn_scan_after_inc;
79
80
81         GtkWidget *checkbtn_newmail_auto;
82         GtkWidget *checkbtn_newmail_manu;
83         GtkWidget *entry_newmail_notify_cmd;
84         GtkWidget *hbox_newmail_notify;
85         GtkWidget *optmenu_recvdialog;
86         GtkWidget *checkbtn_no_recv_err_panel;
87         GtkWidget *checkbtn_close_recv_dialog;
88 } receive;
89
90 static struct Send {
91         GtkWidget *checkbtn_extsend;
92         GtkWidget *entry_extsend;
93         GtkWidget *button_extsend;
94
95         GtkWidget *checkbtn_savemsg;
96         GtkWidget *checkbtn_queuemsg;
97         GtkWidget *optmenu_senddialog;
98
99         GtkWidget *optmenu_charset;
100         GtkWidget *optmenu_encoding_method;
101 } p_send;
102
103 static struct Compose {
104         GtkWidget *entry_fw_quotemark;
105         GtkWidget *text_fw_quotefmt;
106
107         GtkWidget *checkbtn_autoextedit;
108         GtkWidget *spinbtn_undolevel;
109         GtkObject *spinbtn_undolevel_adj;
110         GtkWidget *spinbtn_linewrap;
111         GtkObject *spinbtn_linewrap_adj;
112         GtkWidget *checkbtn_wrapquote;
113         GtkWidget *checkbtn_autowrap;
114         GtkWidget *checkbtn_wrapatsend;
115
116         GtkWidget *checkbtn_reply_account_autosel;
117         GtkWidget *checkbtn_forward_account_autosel;
118         GtkWidget *checkbtn_reedit_account_autosel;
119         GtkWidget *checkbtn_quote;
120         GtkWidget *checkbtn_default_reply_list;
121         GtkWidget *checkbtn_forward_as_attachment;
122         GtkWidget *checkbtn_redirect_keep_from;
123         GtkWidget *checkbtn_smart_wrapping;
124         GtkWidget *checkbtn_block_cursor;
125         GtkWidget *checkbtn_reply_with_quote;
126         
127         GtkWidget *checkbtn_autosave;
128         GtkWidget *entry_autosave_length;
129 } compose;
130
131 static struct Quote {
132         GtkWidget *entry_quotemark;
133         GtkWidget *text_quotefmt;
134
135         GtkWidget *entry_fw_quotemark;
136         GtkWidget *text_fw_quotefmt;
137         
138         GtkWidget *entry_quote_chars;
139 } quote;
140
141 static struct Display {
142         GtkWidget *entry_textfont;
143         GtkWidget *button_textfont;
144
145         GtkWidget *entry_smallfont;
146         GtkWidget *entry_normalfont;
147         GtkWidget *entry_boldfont;
148
149         GtkWidget *chkbtn_folder_unread;
150         GtkWidget *entry_ng_abbrev_len;
151         GtkWidget *spinbtn_ng_abbrev_len;
152         GtkObject *spinbtn_ng_abbrev_len_adj;
153
154         GtkWidget *chkbtn_transhdr;
155
156         GtkWidget *chkbtn_swapfrom;
157         GtkWidget *chkbtn_useaddrbook;
158         GtkWidget *chkbtn_threadsubj;
159         GtkWidget *entry_datefmt;
160 } display;
161
162 static struct Message {
163         GtkWidget *chkbtn_enablecol;
164         GtkWidget *button_edit_col;
165         GtkWidget *chkbtn_mbalnum;
166         GtkWidget *chkbtn_disphdrpane;
167         GtkWidget *chkbtn_disphdr;
168         GtkWidget *spinbtn_linespc;
169         GtkObject *spinbtn_linespc_adj;
170         GtkWidget *chkbtn_headspc;
171
172         GtkWidget *chkbtn_smoothscroll;
173         GtkWidget *spinbtn_scrollstep;
174         GtkObject *spinbtn_scrollstep_adj;
175         GtkWidget *chkbtn_halfpage;
176
177         GtkWidget *chkbtn_attach_desc;
178 } message;
179
180 #if USE_GPGME
181 static struct Privacy {
182         GtkWidget *checkbtn_auto_check_signatures;
183         GtkWidget *checkbtn_gpg_signature_popup;
184         GtkWidget *checkbtn_store_passphrase;
185         GtkWidget *spinbtn_store_passphrase;
186         GtkObject *spinbtn_store_passphrase_adj;
187         GtkWidget *checkbtn_passphrase_grab;
188         GtkWidget *checkbtn_gpg_warning;
189 } privacy;
190 #endif
191
192 static struct Interface {
193         /* GtkWidget *checkbtn_emacs; */
194         GtkWidget *checkbtn_always_show_msg;
195         GtkWidget *checkbtn_openunread;
196         GtkWidget *checkbtn_mark_as_read_on_newwin;
197         GtkWidget *checkbtn_openinbox;
198         GtkWidget *checkbtn_immedexec;
199         GtkWidget *optmenu_nextunreadmsgdialog;
200         GtkWidget *entry_pixmap_theme;
201         GtkWidget *combo_pixmap_theme;
202 } interface;
203
204 static struct Other {
205         GtkWidget *uri_combo;
206         GtkWidget *uri_entry;
207         GtkWidget *printcmd_entry;
208         GtkWidget *exteditor_combo;
209         GtkWidget *exteditor_entry;
210
211         GtkWidget *checkbtn_addaddrbyclick;
212         GtkWidget *checkbtn_confonexit;
213         GtkWidget *checkbtn_cleanonexit;
214         GtkWidget *checkbtn_askonclean;
215         GtkWidget *checkbtn_warnqueued;
216         GtkWidget *checkbtn_cliplog;
217         GtkWidget *loglength_entry;
218 #if 0
219 #ifdef USE_OPENSSL
220         GtkWidget *checkbtn_ssl_ask_unknown_valid;
221 #endif
222 #endif
223
224         GtkWidget *spinbtn_iotimeout;
225         GtkObject *spinbtn_iotimeout_adj;
226 } other;
227
228 static struct MessageColorButtons {
229         GtkWidget *quote_level1_btn;
230         GtkWidget *quote_level2_btn;
231         GtkWidget *quote_level3_btn;
232         GtkWidget *uri_btn;
233         GtkWidget *tgt_folder_btn;
234         GtkWidget *signature_btn;
235 } color_buttons;
236
237 static struct KeybindDialog {
238         GtkWidget *window;
239         GtkWidget *combo;
240 } keybind;
241
242 static GtkWidget *font_sel_win;
243 static guint font_sel_conn_id; 
244 static GtkWidget *quote_color_win;
245 static GtkWidget *color_dialog;
246
247 static void prefs_common_charset_set_data_from_optmenu     (PrefParam *pparam);
248 static void prefs_common_charset_set_optmenu               (PrefParam *pparam);
249 static void prefs_common_encoding_set_data_from_optmenu    (PrefParam *pparam);
250 static void prefs_common_encoding_set_optmenu              (PrefParam *pparam);
251 static void prefs_common_recv_dialog_set_data_from_optmenu (PrefParam *pparam);
252 static void prefs_common_recv_dialog_set_optmenu           (PrefParam *pparam);
253 static void prefs_common_recv_dialog_newmail_notify_toggle_cb   (GtkWidget *w,
254                                                                  gpointer data);
255 static void prefs_common_recv_dialog_set_data_from_optmenu(PrefParam *pparam);
256 static void prefs_common_recv_dialog_set_optmenu(PrefParam *pparam);
257 static void prefs_common_send_dialog_set_data_from_optmenu(PrefParam *pparam);
258 static void prefs_common_send_dialog_set_optmenu(PrefParam *pparam);
259 static void prefs_nextunreadmsgdialog_set_data_from_optmenu(PrefParam *pparam);
260 static void prefs_nextunreadmsgdialog_set_optmenu(PrefParam *pparam);
261
262 /*
263    parameter name, default value, pointer to the prefs variable, data type,
264    pointer to the widget pointer,
265    pointer to the function for data setting,
266    pointer to the function for widget setting
267  */
268
269 static PrefParam param[] = {
270         /* Receive */
271         {"use_ext_inc", "FALSE", &prefs_common.use_extinc, P_BOOL,
272          &receive.checkbtn_incext,
273          prefs_set_data_from_toggle, prefs_set_toggle},
274         {"ext_inc_path", DEFAULT_INC_PATH, &prefs_common.extinc_cmd, P_STRING,
275          &receive.entry_incext,
276          prefs_set_data_from_entry, prefs_set_entry},
277
278         {"inc_local", "TRUE", &prefs_common.inc_local, P_BOOL,
279          &receive.checkbtn_local,
280          prefs_set_data_from_toggle, prefs_set_toggle},
281         {"filter_on_inc_local", "TRUE", &prefs_common.filter_on_inc, P_BOOL,
282          &receive.checkbtn_filter_on_inc,
283          prefs_set_data_from_toggle, prefs_set_toggle},
284         {"spool_path", DEFAULT_SPOOL_PATH, &prefs_common.spool_path, P_STRING,
285          &receive.entry_spool,
286          prefs_set_data_from_entry, prefs_set_entry},
287
288         {"autochk_newmail", "FALSE", &prefs_common.autochk_newmail, P_BOOL,
289          &receive.checkbtn_autochk,
290          prefs_set_data_from_toggle, prefs_set_toggle},
291         {"autochk_interval", "10", &prefs_common.autochk_itv, P_INT,
292          &receive.spinbtn_autochk,
293          prefs_set_data_from_spinbtn, prefs_set_spinbtn},
294         {"check_on_startup", "FALSE", &prefs_common.chk_on_startup, P_BOOL,
295          &receive.checkbtn_chkonstartup,
296          prefs_set_data_from_toggle, prefs_set_toggle},
297         {"scan_all_after_inc", "FALSE", &prefs_common.scan_all_after_inc,
298          P_BOOL, &receive.checkbtn_scan_after_inc,
299          prefs_set_data_from_toggle, prefs_set_toggle},
300         {"newmail_notify_manu", "FALSE", &prefs_common.newmail_notify_manu,
301          P_BOOL, &receive.checkbtn_newmail_manu,
302          prefs_set_data_from_toggle, prefs_set_toggle},
303         {"newmail_notify_auto", "FALSE", &prefs_common.newmail_notify_auto,
304         P_BOOL, &receive.checkbtn_newmail_auto,
305          prefs_set_data_from_toggle, prefs_set_toggle},
306         {"newmail_notify_cmd", "", &prefs_common.newmail_notify_cmd, P_STRING,
307          &receive.entry_newmail_notify_cmd,
308          prefs_set_data_from_entry, prefs_set_entry},
309         {"receive_dialog_mode", "1", &prefs_common.recv_dialog_mode, P_ENUM,
310          &receive.optmenu_recvdialog,
311          prefs_common_recv_dialog_set_data_from_optmenu,
312          prefs_common_recv_dialog_set_optmenu},
313         {"no_receive_error_panel", "FALSE", &prefs_common.no_recv_err_panel,
314          P_BOOL, &receive.checkbtn_no_recv_err_panel,
315          prefs_set_data_from_toggle, prefs_set_toggle},
316         {"close_receive_dialog", "TRUE", &prefs_common.close_recv_dialog,
317          P_BOOL, &receive.checkbtn_close_recv_dialog,
318          prefs_set_data_from_toggle, prefs_set_toggle},
319  
320         /* Send */
321         {"use_ext_sendmail", "FALSE", &prefs_common.use_extsend, P_BOOL,
322          &p_send.checkbtn_extsend,
323          prefs_set_data_from_toggle, prefs_set_toggle},
324         {"ext_sendmail_cmd", DEFAULT_SENDMAIL_CMD,
325          &prefs_common.extsend_cmd, P_STRING,
326          &p_send.entry_extsend, prefs_set_data_from_entry, prefs_set_entry},
327         {"save_message", "TRUE", &prefs_common.savemsg, P_BOOL,
328          &p_send.checkbtn_savemsg,
329          prefs_set_data_from_toggle, prefs_set_toggle},
330         {"queue_message", "FALSE", &prefs_common.queue_msg, P_BOOL,
331          &p_send.checkbtn_queuemsg,
332          prefs_set_data_from_toggle, prefs_set_toggle},
333         {"send_dialog_mode", "0", &prefs_common.send_dialog_mode, P_ENUM,
334          &p_send.optmenu_senddialog,
335          prefs_common_send_dialog_set_data_from_optmenu,
336          prefs_common_send_dialog_set_optmenu},
337
338         {"outgoing_charset", CS_AUTO, &prefs_common.outgoing_charset, P_STRING,
339          &p_send.optmenu_charset,
340          prefs_common_charset_set_data_from_optmenu,
341          prefs_common_charset_set_optmenu},
342         {"encoding_method", "0", &prefs_common.encoding_method, P_ENUM,
343          &p_send.optmenu_encoding_method,
344          prefs_common_encoding_set_data_from_optmenu,
345          prefs_common_encoding_set_optmenu},
346
347         /* Compose */
348         {"auto_ext_editor", "FALSE", &prefs_common.auto_exteditor, P_BOOL,
349          &compose.checkbtn_autoextedit,
350          prefs_set_data_from_toggle, prefs_set_toggle},
351         {"forward_as_attachment", "FALSE", &prefs_common.forward_as_attachment,
352          P_BOOL, &compose.checkbtn_forward_as_attachment,
353          prefs_set_data_from_toggle, prefs_set_toggle},
354         {"redirect_keep_from", "FALSE",
355          &prefs_common.redirect_keep_from, P_BOOL,
356          &compose.checkbtn_redirect_keep_from,
357          prefs_set_data_from_toggle, prefs_set_toggle},
358         {"undo_level", "50", &prefs_common.undolevels, P_INT,
359          &compose.spinbtn_undolevel,
360          prefs_set_data_from_spinbtn, prefs_set_spinbtn},
361         {"block_cursor", "FALSE", &prefs_common.block_cursor,
362          P_BOOL, &compose.checkbtn_block_cursor,
363          prefs_set_data_from_toggle, prefs_set_toggle},
364
365         {"linewrap_length", "72", &prefs_common.linewrap_len, P_INT,
366          &compose.spinbtn_linewrap,
367          prefs_set_data_from_spinbtn, prefs_set_spinbtn},
368         {"linewrap_quotation", "FALSE", &prefs_common.linewrap_quote, P_BOOL,
369          &compose.checkbtn_wrapquote,
370          prefs_set_data_from_toggle, prefs_set_toggle},
371         {"linewrap_auto", "FALSE", &prefs_common.autowrap, P_BOOL,
372          &compose.checkbtn_autowrap,
373          prefs_set_data_from_toggle, prefs_set_toggle},
374         {"linewrap_before_sending", "FALSE",
375          &prefs_common.linewrap_at_send, P_BOOL,
376          &compose.checkbtn_wrapatsend,
377          prefs_set_data_from_toggle, prefs_set_toggle},
378         {"smart_wrapping", "TRUE", &prefs_common.smart_wrapping,
379          P_BOOL, &compose.checkbtn_smart_wrapping,
380          prefs_set_data_from_toggle, prefs_set_toggle},
381         {"autosave", "FALSE", &prefs_common.autosave,
382          P_BOOL, &compose.checkbtn_autosave,
383          prefs_set_data_from_toggle, prefs_set_toggle},
384         {"autosave_length", "50", &prefs_common.autosave_length,
385          P_INT, &compose.entry_autosave_length,
386          prefs_set_data_from_entry, prefs_set_entry},
387 #if USE_ASPELL
388         {"enable_aspell", "TRUE", &prefs_common.enable_aspell, P_BOOL,
389          NULL, NULL, NULL},
390         {"aspell_path", ASPELL_PATH, &prefs_common.aspell_path, P_STRING,
391          NULL, NULL, NULL},
392         {"dictionary",  "", &prefs_common.dictionary, P_STRING,
393          NULL, NULL, NULL},
394         {"aspell_sugmode", "1", &prefs_common.aspell_sugmode, P_INT,
395          NULL, NULL, NULL},
396         {"use_alternate_dict", "FALSE", &prefs_common.use_alternate, P_BOOL,
397          NULL, NULL, NULL},
398         {"check_while_typing", "TRUE", &prefs_common.check_while_typing, P_BOOL,
399          NULL, NULL, NULL},
400         {"misspelled_color", "16711680", &prefs_common.misspelled_col, P_COLOR,
401          NULL, NULL, NULL},
402 #endif
403         {"reply_with_quote", "TRUE", &prefs_common.reply_with_quote, P_BOOL,
404          &compose.checkbtn_reply_with_quote, prefs_set_data_from_toggle, prefs_set_toggle},
405
406         /* Account autoselection */
407         {"reply_account_autoselect", "TRUE",
408          &prefs_common.reply_account_autosel, P_BOOL,
409          &compose.checkbtn_reply_account_autosel,
410          prefs_set_data_from_toggle, prefs_set_toggle},
411         {"forward_account_autoselect", "TRUE",
412          &prefs_common.forward_account_autosel, P_BOOL,
413          &compose.checkbtn_forward_account_autosel,
414          prefs_set_data_from_toggle, prefs_set_toggle},
415         {"reedit_account_autoselect", "TRUE",
416          &prefs_common.reedit_account_autosel, P_BOOL,
417          &compose.checkbtn_reedit_account_autosel,
418          prefs_set_data_from_toggle, prefs_set_toggle},
419
420         {"default_reply_list", "TRUE", &prefs_common.default_reply_list, P_BOOL,
421          &compose.checkbtn_default_reply_list,
422          prefs_set_data_from_toggle, prefs_set_toggle},
423
424         {"show_ruler", "TRUE", &prefs_common.show_ruler, P_BOOL,
425          NULL, NULL, NULL},
426
427         /* Quote */
428         {"reply_quote_mark", "> ", &prefs_common.quotemark, P_STRING,
429          &quote.entry_quotemark, prefs_set_data_from_entry, prefs_set_entry},
430         {"reply_quote_format", "On %d\\n%f wrote:\\n\\n%Q",
431          &prefs_common.quotefmt, P_STRING, &quote.text_quotefmt,
432          prefs_set_data_from_text, prefs_set_text},
433
434         {"forward_quote_mark", "> ", &prefs_common.fw_quotemark, P_STRING,
435          &quote.entry_fw_quotemark,
436          prefs_set_data_from_entry, prefs_set_entry},
437         {"forward_quote_format",
438          "\\n\\nBegin forwarded message:\\n\\n"
439          "?d{Date: %d\\n}?f{From: %f\\n}?t{To: %t\\n}?c{Cc: %c\\n}"
440          "?n{Newsgroups: %n\\n}?s{Subject: %s\\n}\\n\\n%M",
441          &prefs_common.fw_quotefmt, P_STRING, &quote.text_fw_quotefmt,
442          prefs_set_data_from_text, prefs_set_text},
443         {"quote_chars", ">", &prefs_common.quote_chars, P_STRING,
444          &quote.entry_quote_chars, prefs_set_data_from_entry, prefs_set_entry},
445
446         /* Display */
447         {"widget_font", NULL, &prefs_common.widgetfont, P_STRING,
448          NULL, NULL, NULL},
449         {"message_font", "-misc-fixed-medium-r-normal--14-*-*-*-*-*-*-*",
450          &prefs_common.textfont, P_STRING,
451          &display.entry_textfont,
452          prefs_set_data_from_entry, prefs_set_entry},
453         {"small_font",   "-*-helvetica-medium-r-normal--10-*-*-*-*-*-*-*",
454          &prefs_common.smallfont,   P_STRING,
455          &display.entry_smallfont,
456          prefs_set_data_from_entry, prefs_set_entry},
457         {"bold_font",    "-*-helvetica-bold-r-normal--12-*-*-*-*-*-*-*",
458          &prefs_common.boldfont,    P_STRING,
459          &display.entry_boldfont,
460          prefs_set_data_from_entry, prefs_set_entry},
461         {"normal_font",  "-*-helvetica-medium-r-normal--12-*-*-*-*-*-*-*",
462          &prefs_common.normalfont,  P_STRING,
463          &display.entry_normalfont, 
464          prefs_set_data_from_entry, prefs_set_entry},
465
466
467         {"display_folder_unread_num", "TRUE",
468          &prefs_common.display_folder_unread, P_BOOL,
469          &display.chkbtn_folder_unread,
470          prefs_set_data_from_toggle, prefs_set_toggle},
471         {"newsgroup_abbrev_len", "16",
472          &prefs_common.ng_abbrev_len, P_INT,
473          &display.spinbtn_ng_abbrev_len,
474          prefs_set_data_from_spinbtn, prefs_set_spinbtn},
475
476         {"translate_header", "TRUE", &prefs_common.trans_hdr, P_BOOL,
477          &display.chkbtn_transhdr,
478          prefs_set_data_from_toggle, prefs_set_toggle},
479
480         /* Display: Summary View */
481         {"enable_swap_from", "FALSE", &prefs_common.swap_from, P_BOOL,
482          &display.chkbtn_swapfrom,
483          prefs_set_data_from_toggle, prefs_set_toggle},
484         {"use_address_book", "TRUE", &prefs_common.use_addr_book, P_BOOL,
485          &display.chkbtn_useaddrbook,
486          prefs_set_data_from_toggle, prefs_set_toggle},
487         {"thread_by_subject", "TRUE", &prefs_common.thread_by_subject, P_BOOL,
488          &display.chkbtn_threadsubj,
489          prefs_set_data_from_toggle, prefs_set_toggle},
490         {"date_format", "%y/%m/%d(%a) %H:%M", &prefs_common.date_format,
491          P_STRING, &display.entry_datefmt,
492          prefs_set_data_from_entry, prefs_set_entry},
493
494         {"enable_hscrollbar", "TRUE", &prefs_common.enable_hscrollbar, P_BOOL,
495          NULL, NULL, NULL},
496         {"bold_unread", "TRUE", &prefs_common.bold_unread, P_BOOL,
497          NULL, NULL, NULL},
498         {"thread_by_subject_max_age", "10", &prefs_common.thread_by_subject_max_age,
499         P_INT, NULL, NULL, NULL },
500
501         {"enable_thread", "TRUE", &prefs_common.enable_thread, P_BOOL,
502          NULL, NULL, NULL},
503         {"toolbar_style", "3", &prefs_common.toolbar_style, P_ENUM,
504          NULL, NULL, NULL},
505         {"show_statusbar", "TRUE", &prefs_common.show_statusbar, P_BOOL,
506          NULL, NULL, NULL},
507         {"show_searchbar", "TRUE", &prefs_common.show_searchbar, P_BOOL,
508          NULL, NULL, NULL},
509
510         {"folderview_vscrollbar_policy", "0",
511          &prefs_common.folderview_vscrollbar_policy, P_ENUM,
512          NULL, NULL, NULL},
513
514         {"summary_col_show_mark", "TRUE",
515          &prefs_common.summary_col_visible[S_COL_MARK], P_BOOL, NULL, NULL, NULL},
516         {"summary_col_show_unread", "TRUE",
517          &prefs_common.summary_col_visible[S_COL_STATUS], P_BOOL, NULL, NULL, NULL},
518         {"summary_col_show_mime", "TRUE",
519          &prefs_common.summary_col_visible[S_COL_MIME], P_BOOL, NULL, NULL, NULL},
520         {"summary_col_show_subject", "TRUE",
521          &prefs_common.summary_col_visible[S_COL_SUBJECT], P_BOOL, NULL, NULL, NULL},
522         {"summary_col_show_from", "TRUE",
523          &prefs_common.summary_col_visible[S_COL_FROM], P_BOOL, NULL, NULL, NULL},
524         {"summary_col_show_date", "TRUE",
525          &prefs_common.summary_col_visible[S_COL_DATE], P_BOOL, NULL, NULL, NULL},
526         {"summary_col_show_size", "TRUE",
527          &prefs_common.summary_col_visible[S_COL_SIZE], P_BOOL, NULL, NULL, NULL},
528         {"summary_col_show_number", "FALSE",
529          &prefs_common.summary_col_visible[S_COL_NUMBER], P_BOOL, NULL, NULL, NULL},
530         {"summary_col_show_score", "FALSE",
531          &prefs_common.summary_col_visible[S_COL_SCORE], P_BOOL, NULL, NULL, NULL},
532         {"summary_col_show_locked", "FALSE",
533          &prefs_common.summary_col_visible[S_COL_LOCKED], P_BOOL, NULL, NULL, NULL},
534
535         {"summary_col_pos_mark", "0",
536           &prefs_common.summary_col_pos[S_COL_MARK], P_INT, NULL, NULL, NULL},
537         {"summary_col_pos_unread", "1",
538           &prefs_common.summary_col_pos[S_COL_STATUS], P_INT, NULL, NULL, NULL},
539         {"summary_col_pos_mime", "2",
540           &prefs_common.summary_col_pos[S_COL_MIME], P_INT, NULL, NULL, NULL},
541         {"summary_col_pos_subject", "3",
542           &prefs_common.summary_col_pos[S_COL_SUBJECT], P_INT, NULL, NULL, NULL},
543         {"summary_col_pos_from", "4",
544           &prefs_common.summary_col_pos[S_COL_FROM], P_INT, NULL, NULL, NULL},
545         {"summary_col_pos_date", "5",
546           &prefs_common.summary_col_pos[S_COL_DATE], P_INT, NULL, NULL, NULL},
547         {"summary_col_pos_size", "6",
548           &prefs_common.summary_col_pos[S_COL_SIZE], P_INT, NULL, NULL, NULL},
549         {"summary_col_pos_number", "7",
550           &prefs_common.summary_col_pos[S_COL_NUMBER], P_INT, NULL, NULL, NULL},
551         {"summary_col_pos_score", "8",
552          &prefs_common.summary_col_pos[S_COL_SCORE], P_INT, NULL, NULL, NULL},
553         {"summary_col_pos_locked", "9",
554          &prefs_common.summary_col_pos[S_COL_LOCKED], P_INT, NULL, NULL, NULL},
555
556         {"summary_col_size_mark", "10",
557          &prefs_common.summary_col_size[S_COL_MARK], P_INT, NULL, NULL, NULL},
558         {"summary_col_size_unread", "13",
559          &prefs_common.summary_col_size[S_COL_STATUS], P_INT, NULL, NULL, NULL},
560         {"summary_col_size_mime", "10",
561          &prefs_common.summary_col_size[S_COL_MIME], P_INT, NULL, NULL, NULL},
562         {"summary_col_size_subject", "200",
563          &prefs_common.summary_col_size[S_COL_SUBJECT], P_INT, NULL, NULL, NULL},
564         {"summary_col_size_from", "120",
565          &prefs_common.summary_col_size[S_COL_FROM], P_INT, NULL, NULL, NULL},
566         {"summary_col_size_date", "118",
567          &prefs_common.summary_col_size[S_COL_DATE], P_INT, NULL, NULL, NULL},
568         {"summary_col_size_size", "45",
569          &prefs_common.summary_col_size[S_COL_SIZE], P_INT, NULL, NULL, NULL},
570         {"summary_col_size_number", "40",
571          &prefs_common.summary_col_size[S_COL_NUMBER], P_INT, NULL, NULL, NULL},
572         {"summary_col_size_score", "40",
573          &prefs_common.summary_col_size[S_COL_SCORE], P_INT, NULL, NULL, NULL},
574         {"summary_col_size_locked", "13",
575          &prefs_common.summary_col_size[S_COL_LOCKED], P_INT, NULL, NULL, NULL},
576
577         /* Widget size */
578         {"folderwin_x", "16", &prefs_common.folderwin_x, P_INT,
579          NULL, NULL, NULL},
580         {"folderwin_y", "16", &prefs_common.folderwin_y, P_INT,
581          NULL, NULL, NULL},
582         {"folderview_width", "179", &prefs_common.folderview_width, P_INT,
583          NULL, NULL, NULL},
584         {"folderview_height", "600", &prefs_common.folderview_height, P_INT,
585          NULL, NULL, NULL},
586
587         {"folder_col_folder", "150", &prefs_common.folder_col_folder, P_INT,
588          NULL, NULL, NULL},
589         {"folder_col_new", "32", &prefs_common.folder_col_new, P_INT,
590          NULL, NULL, NULL},
591         {"folder_col_unread", "32", &prefs_common.folder_col_unread, P_INT,
592          NULL, NULL, NULL},
593         {"folder_col_total", "32", &prefs_common.folder_col_total, P_INT,
594          NULL, NULL, NULL},
595
596         {"summaryview_width", "600", &prefs_common.summaryview_width, P_INT,
597          NULL, NULL, NULL},
598         {"summaryview_height", "173", &prefs_common.summaryview_height, P_INT,
599          NULL, NULL, NULL},
600
601         {"main_messagewin_x", "256", &prefs_common.main_msgwin_x, P_INT,
602          NULL, NULL, NULL},
603         {"main_messagewin_y", "210", &prefs_common.main_msgwin_y, P_INT,
604          NULL, NULL, NULL},
605         {"messageview_width", "600", &prefs_common.msgview_width, P_INT,
606          NULL, NULL, NULL},
607         {"messageview_height", "540", &prefs_common.msgview_height, P_INT,
608          NULL, NULL, NULL},
609
610         {"mainview_x", "64", &prefs_common.mainview_x, P_INT,
611          NULL, NULL, NULL},
612         {"mainview_y", "64", &prefs_common.mainview_y, P_INT,
613          NULL, NULL, NULL},
614         {"mainview_width", "600", &prefs_common.mainview_width, P_INT,
615          NULL, NULL, NULL},
616         {"mainview_height", "600", &prefs_common.mainview_height, P_INT,
617          NULL, NULL, NULL},
618         {"mainwin_x", "64", &prefs_common.mainwin_x, P_INT,
619          NULL, NULL, NULL},
620         {"mainwin_y", "64", &prefs_common.mainwin_y, P_INT,
621          NULL, NULL, NULL},
622         {"mainwin_width", "800", &prefs_common.mainwin_width, P_INT,
623          NULL, NULL, NULL},
624         {"mainwin_height", "600", &prefs_common.mainwin_height, P_INT,
625          NULL, NULL, NULL},
626         {"messagewin_width", "600", &prefs_common.msgwin_width, P_INT,
627          NULL, NULL, NULL},
628         {"messagewin_height", "540", &prefs_common.msgwin_height, P_INT,
629          NULL, NULL, NULL},
630         {"sourcewin_width", "600", &prefs_common.sourcewin_width, P_INT,
631          NULL, NULL, NULL},
632         {"sourcewin_height", "500", &prefs_common.sourcewin_height, P_INT,
633          NULL, NULL, NULL},
634         {"compose_width", "600", &prefs_common.compose_width, P_INT,
635          NULL, NULL, NULL},
636         {"compose_height", "560", &prefs_common.compose_height, P_INT,
637          NULL, NULL, NULL},
638
639         /* Message */
640         {"enable_color", "TRUE", &prefs_common.enable_color, P_BOOL,
641          &message.chkbtn_enablecol,
642          prefs_set_data_from_toggle, prefs_set_toggle},
643
644         {"quote_level1_color", "179", &prefs_common.quote_level1_col, P_COLOR,
645          NULL, NULL, NULL},
646         {"quote_level2_color", "179", &prefs_common.quote_level2_col, P_COLOR,
647          NULL, NULL, NULL},
648         {"quote_level3_color", "179", &prefs_common.quote_level3_col, P_COLOR,
649          NULL, NULL, NULL},
650         {"uri_color", "32512", &prefs_common.uri_col, P_COLOR,
651          NULL, NULL, NULL},
652         {"target_folder_color", "14294218", &prefs_common.tgt_folder_col, P_COLOR,
653          NULL, NULL, NULL},
654         {"signature_color", "7960953", &prefs_common.signature_col, P_COLOR,
655          NULL, NULL, NULL},
656         {"recycle_quote_colors", "FALSE", &prefs_common.recycle_quote_colors,
657          P_BOOL, NULL, NULL, NULL},
658
659         {"convert_mb_alnum", "FALSE", &prefs_common.conv_mb_alnum, P_BOOL,
660          &message.chkbtn_mbalnum,
661          prefs_set_data_from_toggle, prefs_set_toggle},
662         {"display_header_pane", "TRUE", &prefs_common.display_header_pane,
663          P_BOOL, &message.chkbtn_disphdrpane,
664          prefs_set_data_from_toggle, prefs_set_toggle},
665         {"display_header", "TRUE", &prefs_common.display_header, P_BOOL,
666          &message.chkbtn_disphdr,
667          prefs_set_data_from_toggle, prefs_set_toggle},
668         {"line_space", "2", &prefs_common.line_space, P_INT,
669          &message.spinbtn_linespc,
670          prefs_set_data_from_spinbtn, prefs_set_spinbtn},
671         {"enable_head_space", "FALSE", &prefs_common.head_space, P_BOOL,
672          &message.chkbtn_headspc,
673          prefs_set_data_from_toggle, prefs_set_toggle},
674
675         {"enable_smooth_scroll", "FALSE",
676          &prefs_common.enable_smooth_scroll, P_BOOL,
677          &message.chkbtn_smoothscroll,
678          prefs_set_data_from_toggle, prefs_set_toggle},
679         {"scroll_step", "1", &prefs_common.scroll_step, P_INT,
680          &message.spinbtn_scrollstep,
681          prefs_set_data_from_spinbtn, prefs_set_spinbtn},
682         {"scroll_half_page", "FALSE", &prefs_common.scroll_halfpage, P_BOOL,
683          &message.chkbtn_halfpage,
684          prefs_set_data_from_toggle, prefs_set_toggle},
685
686         {"show_other_header", "FALSE", &prefs_common.show_other_header, P_BOOL,
687          NULL, NULL, NULL},
688
689         {"attach_desc", "TRUE", &prefs_common.attach_desc, P_BOOL,
690          &message.chkbtn_attach_desc,
691          prefs_set_data_from_toggle, prefs_set_toggle},
692
693         /* MIME viewer */
694         {"mime_image_viewer", "display '%s'",
695          &prefs_common.mime_image_viewer, P_STRING, NULL, NULL, NULL},
696         {"mime_audio_player", "play '%s'",
697          &prefs_common.mime_audio_player, P_STRING, NULL, NULL, NULL},
698         {"mime_open_command", "gedit '%s'",
699          &prefs_common.mime_open_cmd, P_STRING, NULL, NULL, NULL},
700
701 #if USE_GPGME
702         /* Privacy */
703         {"auto_check_signatures", "TRUE",
704          &prefs_common.auto_check_signatures, P_BOOL,
705          &privacy.checkbtn_auto_check_signatures,
706          prefs_set_data_from_toggle, prefs_set_toggle},
707         {"gpg_signature_popup", "FALSE",
708          &prefs_common.gpg_signature_popup, P_BOOL,
709          &privacy.checkbtn_gpg_signature_popup,
710          prefs_set_data_from_toggle, prefs_set_toggle},
711         {"store_passphrase", "FALSE", &prefs_common.store_passphrase, P_BOOL,
712          &privacy.checkbtn_store_passphrase,
713          prefs_set_data_from_toggle, prefs_set_toggle},
714         {"store_passphrase_timeout", "0",
715          &prefs_common.store_passphrase_timeout, P_INT,
716          &privacy.spinbtn_store_passphrase,
717          prefs_set_data_from_spinbtn, prefs_set_spinbtn},
718 #ifndef __MINGW32__
719         {"passphrase_grab", "FALSE", &prefs_common.passphrase_grab, P_BOOL,
720          &privacy.checkbtn_passphrase_grab,
721          prefs_set_data_from_toggle, prefs_set_toggle},
722 #endif /* __MINGW32__ */
723         {"gpg_warning", "TRUE", &prefs_common.gpg_warning, P_BOOL,
724          &privacy.checkbtn_gpg_warning,
725          prefs_set_data_from_toggle, prefs_set_toggle},
726 #endif /* USE_GPGME */
727
728         /* Interface */
729         {"separate_folder", "FALSE", &prefs_common.sep_folder, P_BOOL,
730          NULL, NULL, NULL},
731         {"separate_message", "FALSE", &prefs_common.sep_msg, P_BOOL,
732          NULL, NULL, NULL},
733
734         /* {"emulate_emacs", "FALSE", &prefs_common.emulate_emacs, P_BOOL,
735          NULL, NULL, NULL}, */
736         {"always_show_message_when_selected", "FALSE",
737          &prefs_common.always_show_msg,
738          P_BOOL, &interface.checkbtn_always_show_msg,
739          prefs_set_data_from_toggle, prefs_set_toggle},
740         {"open_unread_on_enter", "FALSE", &prefs_common.open_unread_on_enter,
741          P_BOOL, &interface.checkbtn_openunread,
742          prefs_set_data_from_toggle, prefs_set_toggle},
743         {"mark_as_read_on_new_window", "FALSE",
744          &prefs_common.mark_as_read_on_new_window,
745          P_BOOL, &interface.checkbtn_mark_as_read_on_newwin,
746          prefs_set_data_from_toggle, prefs_set_toggle},
747         {"open_inbox_on_inc", "FALSE", &prefs_common.open_inbox_on_inc,
748          P_BOOL, &interface.checkbtn_openinbox,
749          prefs_set_data_from_toggle, prefs_set_toggle},
750         {"immediate_execution", "TRUE", &prefs_common.immediate_exec, P_BOOL,
751          &interface.checkbtn_immedexec,
752          prefs_set_data_from_toggle, prefs_set_toggle},
753         {"nextunreadmsg_dialog", NULL, &prefs_common.next_unread_msg_dialog, P_ENUM,
754          &interface.optmenu_nextunreadmsgdialog,
755          prefs_nextunreadmsgdialog_set_data_from_optmenu,
756          prefs_nextunreadmsgdialog_set_optmenu},
757
758         {"pixmap_theme_path", DEFAULT_PIXMAP_THEME, 
759          &prefs_common.pixmap_theme_path, P_STRING,
760          &interface.entry_pixmap_theme, prefs_set_data_from_entry, prefs_set_entry},
761
762         {"hover_timeout", "500", &prefs_common.hover_timeout, P_INT,
763          NULL, NULL, NULL},
764         
765         /* Other */
766         {"uri_open_command", DEFAULT_BROWSER_CMD,
767          &prefs_common.uri_cmd, P_STRING,
768          &other.uri_entry, prefs_set_data_from_entry, prefs_set_entry},
769         {"print_command", "lpr %s", &prefs_common.print_cmd, P_STRING,
770          &other.printcmd_entry, prefs_set_data_from_entry, prefs_set_entry},
771         {"ext_editor_command", "gedit %s",
772          &prefs_common.ext_editor_cmd, P_STRING,
773          &other.exteditor_entry, prefs_set_data_from_entry, prefs_set_entry},
774
775         {"add_address_by_click", "FALSE", &prefs_common.add_address_by_click,
776          P_BOOL, &other.checkbtn_addaddrbyclick,
777          prefs_set_data_from_toggle, prefs_set_toggle},
778
779         {"confirm_on_exit", "TRUE", &prefs_common.confirm_on_exit, P_BOOL,
780          &other.checkbtn_confonexit,
781          prefs_set_data_from_toggle, prefs_set_toggle},
782         {"clean_trash_on_exit", "FALSE", &prefs_common.clean_on_exit, P_BOOL,
783          &other.checkbtn_cleanonexit,
784          prefs_set_data_from_toggle, prefs_set_toggle},
785         {"ask_on_cleaning", "TRUE", &prefs_common.ask_on_clean, P_BOOL,
786          &other.checkbtn_askonclean,
787          prefs_set_data_from_toggle, prefs_set_toggle},
788         {"warn_queued_on_exit", "TRUE", &prefs_common.warn_queued_on_exit,
789          P_BOOL, &other.checkbtn_warnqueued,
790          prefs_set_data_from_toggle, prefs_set_toggle},
791 #if 0
792 #ifdef USE_OPENSSL
793         {"ssl_ask_unknown_valid", "TRUE", &prefs_common.ssl_ask_unknown_valid,
794          P_BOOL, &other.checkbtn_ssl_ask_unknown_valid,
795          prefs_set_data_from_toggle, prefs_set_toggle},
796 #endif
797 #endif
798         {"work_offline", "FALSE", &prefs_common.work_offline, P_BOOL,
799          NULL, NULL, NULL},
800         {"summary_quicksearch_type", "0", &prefs_common.summary_quicksearch_type, P_INT,
801          NULL, NULL, NULL},
802
803         {"io_timeout_secs", "60", &prefs_common.io_timeout_secs,
804          P_INT, &other.spinbtn_iotimeout,
805          prefs_set_data_from_spinbtn, prefs_set_spinbtn},
806         {"hide_score", "-9999", &prefs_common.kill_score, P_INT,
807          NULL, NULL, NULL},
808         {"important_score", "1", &prefs_common.important_score, P_INT,
809          NULL, NULL, NULL},
810         {"clip_log", "TRUE", &prefs_common.cliplog, P_BOOL,
811          &other.checkbtn_cliplog,
812          prefs_set_data_from_toggle, prefs_set_toggle},
813         {"log_length", "500", &prefs_common.loglength, P_INT,
814          &other.loglength_entry,
815          prefs_set_data_from_entry, prefs_set_entry},
816
817         {"cache_max_mem_usage", "4096", &prefs_common.cache_max_mem_usage, P_INT,
818          NULL, NULL, NULL},
819         {"cache_min_keep_time", "15", &prefs_common.cache_min_keep_time, P_INT,
820          NULL, NULL, NULL},
821
822         {"color_new", "179", &prefs_common.color_new, P_COLOR,
823          NULL, NULL, NULL},
824
825         {NULL, NULL, NULL, P_OTHER, NULL, NULL, NULL}
826 };
827
828 /* widget creating functions */
829 static void prefs_common_create         (void);
830 static void prefs_receive_create        (void);
831 static void prefs_send_create           (void);
832 static void prefs_compose_create        (void);
833 static void prefs_quote_create          (void);
834 static void prefs_display_create        (void);
835 static void prefs_message_create        (void);
836 #if USE_GPGME
837 static void prefs_privacy_create        (void);
838 #endif
839 static void prefs_interface_create      (void);
840 static void prefs_other_create          (void);
841
842 static void date_format_ok_btn_clicked          (GtkButton      *button,
843                                                  GtkWidget     **widget);
844 static void date_format_cancel_btn_clicked      (GtkButton      *button,
845                                                  GtkWidget     **widget);
846 static void date_format_key_pressed             (GtkWidget      *keywidget,
847                                                  GdkEventKey    *event,
848                                                  GtkWidget     **widget);
849 static gboolean date_format_on_delete           (GtkWidget      *dialogwidget,
850                                                  GdkEventAny    *event,
851                                                  GtkWidget     **widget);
852 static void date_format_entry_on_change         (GtkEditable    *editable,
853                                                  GtkLabel       *example);
854 static void date_format_select_row              (GtkWidget      *date_format_list,
855                                                  gint            row,
856                                                  gint            column,
857                                                  GdkEventButton *event,
858                                                  GtkWidget      *date_format);
859 static GtkWidget *date_format_create            (GtkButton      *button,
860                                                  void           *data);
861
862 static void prefs_quote_colors_dialog           (void);
863 static void prefs_quote_colors_dialog_create    (void);
864 static void prefs_quote_colors_key_pressed      (GtkWidget      *widget,
865                                                  GdkEventKey    *event,
866                                                  gpointer        data);
867 static void quote_color_set_dialog              (GtkWidget      *widget,
868                                                  gpointer        data);
869 static void quote_colors_set_dialog_ok          (GtkWidget      *widget,
870                                                  gpointer        data);
871 static void quote_colors_set_dialog_cancel      (GtkWidget      *widget,
872                                                  gpointer        data);
873 static void quote_colors_set_dialog_key_pressed (GtkWidget      *widget,
874                                                  GdkEventKey    *event,
875                                                  gpointer        data);
876 static void set_button_bg_color                 (GtkWidget      *widget,
877                                                  gint            color);
878 static void prefs_enable_message_color_toggled  (void);
879 static void prefs_recycle_colors_toggled        (GtkWidget      *widget);
880
881 static void prefs_font_select   (GtkButton *button, GtkEntry *entry);
882
883 static void prefs_font_selection_key_pressed    (GtkWidget      *widget,
884                                                  GdkEventKey    *event,
885                                                  gpointer        data);
886 static void prefs_font_selection_ok             (GtkButton      *button, GtkEntry *entry);
887
888 static void prefs_keybind_select                (void);
889 static gint prefs_keybind_deleted               (GtkWidget      *widget,
890                                                  GdkEventAny    *event,
891                                                  gpointer        data);
892 static void prefs_keybind_key_pressed           (GtkWidget      *widget,
893                                                  GdkEventKey    *event,
894                                                  gpointer        data);
895 static void prefs_keybind_cancel                (void);
896 static void prefs_keybind_apply_clicked         (GtkWidget      *widget);
897
898 static gint prefs_common_deleted        (GtkWidget      *widget,
899                                          GdkEventAny    *event,
900                                          gpointer        data);
901 static void prefs_common_key_pressed    (GtkWidget      *widget,
902                                          GdkEventKey    *event,
903                                          gpointer        data);
904 static void prefs_common_ok             (void);
905 static void prefs_common_apply          (void);
906 static void prefs_common_cancel         (void);
907
908 void prefs_common_init(void) 
909 {
910         prefs_common.disphdr_list = NULL;
911 }
912
913 PrefsCommon *prefs_common_get(void)
914 {
915         return &prefs_common;
916 }
917
918 void prefs_common_read_config(void)
919 {
920         FILE *fp;
921         gchar *path;
922         gchar buf[PREFSBUFSIZE];
923
924         prefs_read_config(param, "Common", COMMON_RC);
925
926         path = g_strconcat(get_rc_dir(), G_DIR_SEPARATOR_S, COMMAND_HISTORY,
927                            NULL);
928         if ((fp = fopen(path, "rb")) == NULL) {
929                 if (ENOENT != errno) FILE_OP_ERROR(path, "fopen");
930                 g_free(path);
931                 return;
932         }
933         g_free(path);
934         while (fgets(buf, sizeof(buf), fp) != NULL) {
935                 g_strstrip(buf);
936                 if (buf[0] == '\0') continue;
937                 prefs_common.mime_open_cmd_history =
938                         add_history(prefs_common.mime_open_cmd_history, buf);
939         }
940         fclose(fp);
941
942         prefs_common.mime_open_cmd_history =
943                 g_list_reverse(prefs_common.mime_open_cmd_history);
944 }
945
946 void prefs_common_save_config(void)
947 {
948         GList *cur;
949         FILE *fp;
950         gchar *path;
951
952         prefs_save_config(param, "Common", COMMON_RC);
953
954         path = g_strconcat(get_rc_dir(), G_DIR_SEPARATOR_S, COMMAND_HISTORY,
955                            NULL);
956         if ((fp = fopen(path, "wb")) == NULL) {
957                 FILE_OP_ERROR(path, "fopen");
958                 g_free(path);
959                 return;
960         }
961
962         for (cur = prefs_common.mime_open_cmd_history;
963              cur != NULL; cur = cur->next) {
964                 fputs((gchar *)cur->data, fp);
965                 fputc('\n', fp);
966         }
967
968         fclose(fp);
969         g_free(path);
970 }
971
972 void prefs_common_open(void)
973 {
974         if (prefs_rc_is_readonly(COMMON_RC))
975                 return;
976
977         inc_lock();
978
979         if (!dialog.window) {
980                 prefs_common_create();
981         }
982
983         manage_window_set_transient(GTK_WINDOW(dialog.window));
984         gtk_notebook_set_page(GTK_NOTEBOOK(dialog.notebook), 0);
985         gtk_widget_grab_focus(dialog.ok_btn);
986
987         prefs_set_dialog(param);
988
989         gtk_widget_show(dialog.window);
990 }
991
992 static void prefs_common_create(void)
993 {
994         gint page = 0;
995
996         debug_print("Creating common preferences window...\n");
997
998         prefs_dialog_create(&dialog);
999         gtk_window_set_title (GTK_WINDOW(dialog.window),
1000                               _("Common Preferences"));
1001         gtk_signal_connect (GTK_OBJECT(dialog.window), "delete_event",
1002                             GTK_SIGNAL_FUNC(prefs_common_deleted), NULL);
1003         gtk_signal_connect (GTK_OBJECT(dialog.window), "key_press_event",
1004                             GTK_SIGNAL_FUNC(prefs_common_key_pressed), NULL);
1005         MANAGE_WINDOW_SIGNALS_CONNECT(dialog.window);
1006
1007         gtk_signal_connect (GTK_OBJECT(dialog.ok_btn), "clicked",
1008                             GTK_SIGNAL_FUNC(prefs_common_ok), NULL);
1009         gtk_signal_connect (GTK_OBJECT(dialog.apply_btn), "clicked",
1010                             GTK_SIGNAL_FUNC(prefs_common_apply), NULL);
1011         gtk_signal_connect_object (GTK_OBJECT(dialog.cancel_btn), "clicked",
1012                                    GTK_SIGNAL_FUNC(prefs_common_cancel),
1013                                    GTK_OBJECT(dialog.window));
1014
1015         /* create all widgets on notebook */
1016         prefs_receive_create();
1017         SET_NOTEBOOK_LABEL(dialog.notebook, _("Receive"),   page++);
1018         prefs_send_create();
1019         SET_NOTEBOOK_LABEL(dialog.notebook, _("Send"),      page++);
1020         prefs_compose_create();
1021         SET_NOTEBOOK_LABEL(dialog.notebook, _("Compose"),   page++);
1022         prefs_quote_create();
1023         SET_NOTEBOOK_LABEL(dialog.notebook, _("Quote"),   page++);
1024         prefs_display_create();
1025         SET_NOTEBOOK_LABEL(dialog.notebook, _("Display"),   page++);
1026         prefs_message_create();
1027         SET_NOTEBOOK_LABEL(dialog.notebook, _("Message"),   page++);
1028 #if USE_GPGME
1029         prefs_privacy_create();
1030         SET_NOTEBOOK_LABEL(dialog.notebook, _("Privacy"),   page++);
1031 #endif
1032         prefs_interface_create();
1033         SET_NOTEBOOK_LABEL(dialog.notebook, _("Interface"), page++);
1034         prefs_other_create();
1035         SET_NOTEBOOK_LABEL(dialog.notebook, _("Other"),     page++);
1036
1037         gtk_widget_show_all(dialog.window);
1038 }
1039
1040 static void prefs_receive_create(void)
1041 {
1042         GtkWidget *vbox1;
1043         GtkWidget *vbox2;
1044         GtkWidget *frame_incext;
1045         GtkWidget *checkbtn_incext;
1046         GtkWidget *hbox;
1047         GtkWidget *label_incext;
1048         GtkWidget *entry_incext;
1049         /* GtkWidget *button_incext; */
1050
1051         GtkWidget *frame_spool;
1052         GtkWidget *checkbtn_local;
1053         GtkWidget *checkbtn_filter_on_inc;
1054         GtkWidget *label_spool;
1055         GtkWidget *entry_spool;
1056
1057         GtkWidget *hbox_autochk;
1058         GtkWidget *checkbtn_autochk;
1059         GtkWidget *label_autochk1;
1060         GtkObject *spinbtn_autochk_adj;
1061         GtkWidget *spinbtn_autochk;
1062         GtkWidget *label_autochk2;
1063         GtkWidget *checkbtn_chkonstartup;
1064         GtkWidget *checkbtn_scan_after_inc;
1065
1066
1067         GtkWidget *frame_newmail;
1068         GtkWidget *hbox_newmail_notify;
1069         GtkWidget *checkbtn_newmail_auto;
1070         GtkWidget *checkbtn_newmail_manu;
1071         GtkWidget *entry_newmail_notify_cmd;
1072         GtkWidget *label_newmail_notify_cmd;
1073
1074         GtkWidget *hbox_recvdialog;
1075         GtkWidget *label_recvdialog;
1076         GtkWidget *menu;
1077         GtkWidget *menuitem;
1078         GtkWidget *optmenu_recvdialog;
1079         GtkWidget *checkbtn_no_recv_err_panel;
1080         GtkWidget *checkbtn_close_recv_dialog;
1081
1082         vbox1 = gtk_vbox_new (FALSE, VSPACING);
1083         gtk_widget_show (vbox1);
1084         gtk_container_add (GTK_CONTAINER (dialog.notebook), vbox1);
1085         gtk_container_set_border_width (GTK_CONTAINER (vbox1), VBOX_BORDER);
1086
1087         PACK_FRAME(vbox1, frame_incext, _("External program"));
1088
1089         vbox2 = gtk_vbox_new (FALSE, VSPACING_NARROW);
1090         gtk_widget_show (vbox2);
1091         gtk_container_add (GTK_CONTAINER (frame_incext), vbox2);
1092         gtk_container_set_border_width (GTK_CONTAINER (vbox2), 8);
1093
1094         /* Use of external incorporation program */
1095         PACK_CHECK_BUTTON (vbox2, checkbtn_incext,
1096                            _("Use external program for incorporation"));
1097
1098         hbox = gtk_hbox_new (FALSE, 8);
1099         gtk_widget_show (hbox);
1100         gtk_box_pack_start (GTK_BOX (vbox2), hbox, FALSE, FALSE, 0);
1101         SET_TOGGLE_SENSITIVITY (checkbtn_incext, hbox);
1102
1103         label_incext = gtk_label_new (_("Command"));
1104         gtk_widget_show (label_incext);
1105         gtk_box_pack_start (GTK_BOX (hbox), label_incext, FALSE, FALSE, 0);
1106
1107         entry_incext = gtk_entry_new ();
1108         gtk_widget_show (entry_incext);
1109         gtk_box_pack_start (GTK_BOX (hbox), entry_incext, TRUE, TRUE, 0);
1110
1111 #if 0
1112         button_incext = gtk_button_new_with_label ("... ");
1113         gtk_widget_show (button_incext);
1114         gtk_box_pack_start (GTK_BOX (hbox), button_incext, FALSE, FALSE, 0);
1115 #endif
1116
1117         PACK_FRAME(vbox1, frame_spool, _("Local spool"));
1118
1119         vbox2 = gtk_vbox_new (FALSE, VSPACING_NARROW);
1120         gtk_widget_show (vbox2);
1121         gtk_container_add (GTK_CONTAINER (frame_spool), vbox2);
1122         gtk_container_set_border_width (GTK_CONTAINER (vbox2), 8);
1123
1124         hbox = gtk_hbox_new (FALSE, 32);
1125         gtk_widget_show (hbox);
1126         gtk_box_pack_start (GTK_BOX (vbox2), hbox, FALSE, FALSE, 0);
1127
1128         PACK_CHECK_BUTTON (hbox, checkbtn_local, _("Incorporate from spool"));
1129         PACK_CHECK_BUTTON (hbox, checkbtn_filter_on_inc,
1130                            _("Filter on incorporation"));
1131         SET_TOGGLE_SENSITIVITY (checkbtn_local, checkbtn_filter_on_inc);
1132
1133         hbox = gtk_hbox_new (FALSE, 8);
1134         gtk_widget_show (hbox);
1135         gtk_box_pack_start (GTK_BOX (vbox2), hbox, FALSE, FALSE, 0);
1136         SET_TOGGLE_SENSITIVITY (checkbtn_local, hbox);
1137
1138         label_spool = gtk_label_new (_("Spool directory"));
1139         gtk_widget_show (label_spool);
1140         gtk_box_pack_start (GTK_BOX (hbox), label_spool, FALSE, FALSE, 0);
1141
1142         entry_spool = gtk_entry_new ();
1143         gtk_widget_show (entry_spool);
1144         gtk_box_pack_start (GTK_BOX (hbox), entry_spool, TRUE, TRUE, 0);
1145
1146         vbox2 = gtk_vbox_new (FALSE, 0);
1147         gtk_widget_show (vbox2);
1148         gtk_box_pack_start (GTK_BOX (vbox1), vbox2, FALSE, FALSE, 0);
1149
1150         /* Auto-checking */
1151         hbox_autochk = gtk_hbox_new (FALSE, 8);
1152         gtk_widget_show (hbox_autochk);
1153         gtk_box_pack_start (GTK_BOX (vbox2), hbox_autochk, FALSE, FALSE, 0);
1154
1155         PACK_CHECK_BUTTON (hbox_autochk, checkbtn_autochk,
1156                            _("Auto-check new mail"));
1157
1158         label_autochk1 = gtk_label_new (_("every"));
1159         gtk_widget_show (label_autochk1);
1160         gtk_box_pack_start (GTK_BOX (hbox_autochk), label_autochk1, FALSE, FALSE, 0);
1161
1162         spinbtn_autochk_adj = gtk_adjustment_new (5, 1, 100, 1, 10, 10);
1163         spinbtn_autochk = gtk_spin_button_new
1164                 (GTK_ADJUSTMENT (spinbtn_autochk_adj), 1, 0);
1165         gtk_widget_show (spinbtn_autochk);
1166         gtk_box_pack_start (GTK_BOX (hbox_autochk), spinbtn_autochk, FALSE, FALSE, 0);
1167         gtk_widget_set_usize (spinbtn_autochk, 64, -1);
1168         gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (spinbtn_autochk), TRUE);
1169
1170         label_autochk2 = gtk_label_new (_("minute(s)"));
1171         gtk_widget_show (label_autochk2);
1172         gtk_box_pack_start (GTK_BOX (hbox_autochk), label_autochk2, FALSE, FALSE, 0);
1173
1174         SET_TOGGLE_SENSITIVITY(checkbtn_autochk, label_autochk1);
1175         SET_TOGGLE_SENSITIVITY(checkbtn_autochk, spinbtn_autochk);
1176         SET_TOGGLE_SENSITIVITY(checkbtn_autochk, label_autochk2);
1177
1178         PACK_CHECK_BUTTON (vbox2, checkbtn_chkonstartup,
1179                            _("Check new mail on startup"));
1180         PACK_CHECK_BUTTON (vbox2, checkbtn_scan_after_inc,
1181                            _("Update all local folders after incorporation"));
1182
1183
1184         /* receive dialog */
1185         hbox_recvdialog = gtk_hbox_new (FALSE, 8);
1186         gtk_widget_show (hbox_recvdialog);
1187         gtk_box_pack_start (GTK_BOX (vbox2), hbox_recvdialog, FALSE, FALSE, 0);
1188
1189         label_recvdialog = gtk_label_new (_("Show receive dialog"));
1190         gtk_misc_set_alignment(GTK_MISC(label_recvdialog), 0, 0.5);
1191         gtk_widget_show (label_recvdialog);
1192         gtk_box_pack_start (GTK_BOX (hbox_recvdialog), label_recvdialog, FALSE, FALSE, 0);
1193
1194         optmenu_recvdialog = gtk_option_menu_new ();
1195         gtk_widget_show (optmenu_recvdialog);
1196         gtk_box_pack_start (GTK_BOX (hbox_recvdialog), optmenu_recvdialog, FALSE, FALSE, 0);
1197
1198         menu = gtk_menu_new ();
1199         MENUITEM_ADD (menu, menuitem, _("Always"), RECV_DIALOG_ALWAYS);
1200         MENUITEM_ADD (menu, menuitem, _("Only if a window is active"),
1201                       RECV_DIALOG_ACTIVE);
1202         MENUITEM_ADD (menu, menuitem, _("Never"), RECV_DIALOG_NEVER);
1203
1204         gtk_option_menu_set_menu (GTK_OPTION_MENU (optmenu_recvdialog), menu);
1205
1206         PACK_CHECK_BUTTON (vbox2, checkbtn_no_recv_err_panel,
1207                            _("Don't popup error dialog on receive error"));
1208
1209         PACK_CHECK_BUTTON (vbox2, checkbtn_close_recv_dialog,
1210                            _("Close receive dialog when finished"));
1211         
1212         PACK_FRAME(vbox1, frame_newmail, _("Run command when new mail "
1213                                            "arrives"));
1214         vbox2 = gtk_vbox_new (FALSE, VSPACING_NARROW);
1215         gtk_widget_show (vbox2);
1216         gtk_container_add (GTK_CONTAINER (frame_newmail), vbox2);
1217         gtk_container_set_border_width (GTK_CONTAINER (vbox2), 8);
1218
1219         hbox = gtk_hbox_new (TRUE, 8);
1220         gtk_widget_show (hbox);
1221         PACK_CHECK_BUTTON (hbox, checkbtn_newmail_auto,
1222                            _("after autochecking"));
1223         PACK_CHECK_BUTTON (hbox, checkbtn_newmail_manu,
1224                            _("after manual checking"));
1225         gtk_box_pack_start (GTK_BOX(vbox2), hbox, FALSE, FALSE, 0);
1226         gtk_signal_connect(GTK_OBJECT(checkbtn_newmail_auto), "toggled",
1227                            GTK_SIGNAL_FUNC(prefs_common_recv_dialog_newmail_notify_toggle_cb),
1228                            NULL);
1229         gtk_signal_connect(GTK_OBJECT(checkbtn_newmail_manu), "toggled",
1230                            GTK_SIGNAL_FUNC(prefs_common_recv_dialog_newmail_notify_toggle_cb),
1231                            NULL);
1232
1233         hbox_newmail_notify = gtk_hbox_new (FALSE, 8);
1234         gtk_widget_show (hbox);
1235         gtk_box_pack_start (GTK_BOX (vbox2), hbox_newmail_notify, FALSE, 
1236                             FALSE, 0);
1237
1238         label_newmail_notify_cmd = gtk_label_new (_("Command to execute:\n"
1239                                                     "(use %d as number of new "
1240                                                     "mails)"));
1241         gtk_label_set_justify(GTK_LABEL(label_newmail_notify_cmd), 
1242                               GTK_JUSTIFY_RIGHT);
1243         gtk_widget_show (label_newmail_notify_cmd);
1244         gtk_box_pack_start (GTK_BOX (hbox_newmail_notify), 
1245                             label_newmail_notify_cmd, FALSE, FALSE, 0);
1246
1247         entry_newmail_notify_cmd = gtk_entry_new ();
1248         gtk_widget_show (entry_newmail_notify_cmd);
1249         gtk_box_pack_start (GTK_BOX (hbox_newmail_notify), 
1250                             entry_newmail_notify_cmd, TRUE, TRUE, 0);
1251
1252         gtk_widget_set_sensitive(hbox_newmail_notify, 
1253                                  prefs_common.newmail_notify_auto || 
1254                                  prefs_common.newmail_notify_manu);
1255
1256         receive.checkbtn_incext = checkbtn_incext;
1257         receive.entry_incext    = entry_incext;
1258         /* receive.button_incext   = button_incext; */
1259
1260         receive.checkbtn_local         = checkbtn_local;
1261         receive.checkbtn_filter_on_inc = checkbtn_filter_on_inc;
1262         receive.entry_spool            = entry_spool;
1263
1264         receive.checkbtn_autochk    = checkbtn_autochk;
1265         receive.spinbtn_autochk     = spinbtn_autochk;
1266         receive.spinbtn_autochk_adj = spinbtn_autochk_adj;
1267
1268         receive.checkbtn_chkonstartup = checkbtn_chkonstartup;
1269         receive.checkbtn_scan_after_inc = checkbtn_scan_after_inc;
1270
1271
1272         receive.checkbtn_newmail_auto  = checkbtn_newmail_auto;
1273         receive.checkbtn_newmail_manu  = checkbtn_newmail_manu;
1274         receive.hbox_newmail_notify    = hbox_newmail_notify;
1275         receive.entry_newmail_notify_cmd = entry_newmail_notify_cmd;
1276         receive.optmenu_recvdialog          = optmenu_recvdialog;
1277         receive.checkbtn_no_recv_err_panel  = checkbtn_no_recv_err_panel;
1278         receive.checkbtn_close_recv_dialog  = checkbtn_close_recv_dialog;
1279 }
1280
1281 static void prefs_send_create(void)
1282 {
1283         GtkWidget *vbox1;
1284         GtkWidget *vbox2;
1285         GtkWidget *frame_extsend;
1286         GtkWidget *vbox_extsend;
1287         GtkWidget *checkbtn_extsend;
1288         GtkWidget *hbox1;
1289         GtkWidget *label_extsend;
1290         GtkWidget *entry_extsend;
1291         /* GtkWidget *button_extsend; */
1292         GtkWidget *checkbtn_savemsg;
1293         GtkWidget *checkbtn_queuemsg;
1294         GtkWidget *label_outcharset;
1295         GtkWidget *optmenu_charset;
1296         GtkWidget *optmenu_menu;
1297         GtkWidget *menuitem;
1298         GtkWidget *label_charset_desc;
1299         GtkWidget *optmenu_encoding;
1300         GtkWidget *label_encoding;
1301         GtkWidget *label_encoding_desc;
1302         GtkWidget *label_senddialog;
1303         GtkWidget *menu;
1304         GtkWidget *optmenu_senddialog;
1305         GtkWidget *hbox_senddialog;
1306
1307         vbox1 = gtk_vbox_new (FALSE, VSPACING);
1308         gtk_widget_show (vbox1);
1309         gtk_container_add (GTK_CONTAINER (dialog.notebook), vbox1);
1310         gtk_container_set_border_width (GTK_CONTAINER (vbox1), VBOX_BORDER);
1311
1312         PACK_FRAME(vbox1, frame_extsend, _("External program"));
1313
1314         vbox_extsend = gtk_vbox_new (FALSE, VSPACING_NARROW);
1315         gtk_widget_show (vbox_extsend);
1316         gtk_container_add (GTK_CONTAINER (frame_extsend), vbox_extsend);
1317         gtk_container_set_border_width (GTK_CONTAINER (vbox_extsend), 8);
1318
1319         PACK_CHECK_BUTTON (vbox_extsend, checkbtn_extsend,
1320                            _("Use external program for sending"));
1321
1322         hbox1 = gtk_hbox_new (FALSE, 8);
1323         gtk_widget_show (hbox1);
1324         gtk_box_pack_start (GTK_BOX (vbox_extsend), hbox1, FALSE, FALSE, 0);
1325         SET_TOGGLE_SENSITIVITY(checkbtn_extsend, hbox1);
1326
1327         label_extsend = gtk_label_new (_("Command"));
1328         gtk_widget_show (label_extsend);
1329         gtk_box_pack_start (GTK_BOX (hbox1), label_extsend, FALSE, FALSE, 0);
1330
1331         entry_extsend = gtk_entry_new ();
1332         gtk_widget_show (entry_extsend);
1333         gtk_box_pack_start (GTK_BOX (hbox1), entry_extsend, TRUE, TRUE, 0);
1334
1335 #if 0
1336         button_extsend = gtk_button_new_with_label ("... ");
1337         gtk_widget_show (button_extsend);
1338         gtk_box_pack_start (GTK_BOX (hbox1), button_extsend, FALSE, FALSE, 0);
1339 #endif
1340
1341         vbox2 = gtk_vbox_new (FALSE, 0);
1342         gtk_widget_show (vbox2);
1343         gtk_box_pack_start (GTK_BOX (vbox1), vbox2, FALSE, FALSE, 0);
1344
1345         PACK_CHECK_BUTTON (vbox2, checkbtn_savemsg,
1346                            _("Save sent messages to Sent folder"));
1347         PACK_CHECK_BUTTON (vbox2, checkbtn_queuemsg,
1348                            _("Queue messages that fail to send"));
1349
1350         hbox_senddialog = gtk_hbox_new (FALSE, 8);
1351         gtk_widget_show (hbox1);
1352         gtk_box_pack_start (GTK_BOX (vbox1), hbox_senddialog, FALSE, FALSE, 0);
1353
1354         label_senddialog = gtk_label_new (_("Show send dialog"));
1355         gtk_widget_show (label_senddialog);
1356         gtk_box_pack_start (GTK_BOX (hbox_senddialog), label_senddialog, FALSE, FALSE, 0);
1357
1358         optmenu_senddialog = gtk_option_menu_new ();
1359         gtk_widget_show (optmenu_senddialog);
1360         gtk_box_pack_start (GTK_BOX (hbox_senddialog), optmenu_senddialog, FALSE, FALSE, 0);
1361         
1362         menu = gtk_menu_new ();
1363         MENUITEM_ADD (menu, menuitem, _("Always"), SEND_DIALOG_ALWAYS);
1364         MENUITEM_ADD (menu, menuitem, _("Never"), SEND_DIALOG_NEVER);
1365
1366         gtk_option_menu_set_menu (GTK_OPTION_MENU (optmenu_senddialog), menu);
1367
1368         hbox1 = gtk_hbox_new (FALSE, 8);
1369         gtk_widget_show (hbox1);
1370         gtk_box_pack_start (GTK_BOX (vbox1), hbox1, FALSE, FALSE, 0);
1371
1372         label_outcharset = gtk_label_new (_("Outgoing codeset"));
1373         gtk_widget_show (label_outcharset);
1374         gtk_box_pack_start (GTK_BOX (hbox1), label_outcharset, FALSE, FALSE, 0);
1375
1376         optmenu_charset = gtk_option_menu_new ();
1377         gtk_widget_show (optmenu_charset);
1378         gtk_box_pack_start (GTK_BOX (hbox1), optmenu_charset, FALSE, FALSE, 0);
1379
1380         optmenu_menu = gtk_menu_new ();
1381
1382 #define SET_MENUITEM(str, data) \
1383 { \
1384         MENUITEM_ADD(optmenu_menu, menuitem, str, data); \
1385 }
1386
1387         SET_MENUITEM(_("Automatic (Recommended)"),       CS_AUTO);
1388         SET_MENUITEM(_("7bit ascii (US-ASCII)"),         CS_US_ASCII);
1389 #if HAVE_ICONV
1390         SET_MENUITEM(_("Unicode (UTF-8)"),               CS_UTF_8);
1391 #endif
1392         SET_MENUITEM(_("Western European (ISO-8859-1)"),  CS_ISO_8859_1);
1393         SET_MENUITEM(_("Western European (ISO-8859-15)"), CS_ISO_8859_15);
1394         SET_MENUITEM(_("Central European (ISO-8859-2)"),  CS_ISO_8859_2);
1395         SET_MENUITEM(_("Baltic (ISO-8859-13)"),           CS_ISO_8859_13);
1396         SET_MENUITEM(_("Baltic (ISO-8859-4)"),            CS_ISO_8859_4);
1397         SET_MENUITEM(_("Greek (ISO-8859-7)"),             CS_ISO_8859_7);
1398         SET_MENUITEM(_("Turkish (ISO-8859-9)"),           CS_ISO_8859_9);
1399 #if HAVE_ICONV
1400         SET_MENUITEM(_("Cyrillic (ISO-8859-5)"),          CS_ISO_8859_5);
1401 #endif
1402         SET_MENUITEM(_("Cyrillic (KOI8-R)"),             CS_KOI8_R);
1403 #if HAVE_ICONV
1404         SET_MENUITEM(_("Cyrillic (Windows-1251)"),       CS_WINDOWS_1251);
1405         SET_MENUITEM(_("Cyrillic (KOI8-U)"),             CS_KOI8_U);
1406 #endif
1407         SET_MENUITEM(_("Japanese (ISO-2022-JP)"),        CS_ISO_2022_JP);
1408 #if 0
1409         SET_MENUITEM(_("Japanese (EUC-JP)"),             CS_EUC_JP);
1410         SET_MENUITEM(_("Japanese (Shift_JIS)"),          CS_SHIFT_JIS);
1411 #endif /* 0 */
1412         SET_MENUITEM(_("Simplified Chinese (GB2312)"),   CS_GB2312);
1413         SET_MENUITEM(_("Traditional Chinese (Big5)"),    CS_BIG5);
1414 #if 0
1415         SET_MENUITEM(_("Traditional Chinese (EUC-TW)"),  CS_EUC_TW);
1416         SET_MENUITEM(_("Chinese (ISO-2022-CN)"),         CS_ISO_2022_CN);
1417 #endif /* 0 */
1418         SET_MENUITEM(_("Korean (EUC-KR)"),               CS_EUC_KR);
1419         SET_MENUITEM(_("Thai (TIS-620)"),                CS_TIS_620);
1420         SET_MENUITEM(_("Thai (Windows-874)"),            CS_WINDOWS_874);
1421
1422         gtk_option_menu_set_menu (GTK_OPTION_MENU (optmenu_charset),
1423                                   optmenu_menu);
1424
1425         hbox1 = gtk_hbox_new (FALSE, 8);
1426         gtk_widget_show (hbox1);
1427         gtk_box_pack_start (GTK_BOX (vbox1), hbox1, FALSE, FALSE, 0);
1428
1429         label_charset_desc = gtk_label_new
1430                 (_("If `Automatic' is selected, the optimal encoding\n"
1431                    "for the current locale will be used."));
1432         gtk_widget_show (label_charset_desc);
1433         gtk_box_pack_start (GTK_BOX (hbox1), label_charset_desc,
1434                             FALSE, FALSE, 0);
1435         gtk_label_set_justify (GTK_LABEL (label_charset_desc),
1436                                GTK_JUSTIFY_LEFT);
1437
1438         hbox1 = gtk_hbox_new (FALSE, 8);
1439         gtk_widget_show (hbox1);
1440         gtk_box_pack_start (GTK_BOX (vbox1), hbox1, FALSE, FALSE, 0);
1441
1442         label_encoding = gtk_label_new (_("Transfer encoding"));
1443         gtk_widget_show (label_encoding);
1444         gtk_box_pack_start (GTK_BOX (hbox1), label_encoding, FALSE, FALSE, 0);
1445
1446         optmenu_encoding = gtk_option_menu_new ();
1447         gtk_widget_show (optmenu_encoding);
1448         gtk_box_pack_start (GTK_BOX (hbox1), optmenu_encoding, FALSE, FALSE, 0);
1449
1450         optmenu_menu = gtk_menu_new ();
1451
1452         SET_MENUITEM(_("Automatic"),     CTE_AUTO);
1453         SET_MENUITEM("base64",           CTE_BASE64);
1454         SET_MENUITEM("quoted-printable", CTE_QUOTED_PRINTABLE);
1455         SET_MENUITEM("8bit",             CTE_8BIT);
1456
1457         gtk_option_menu_set_menu (GTK_OPTION_MENU (optmenu_encoding),
1458                                   optmenu_menu);
1459
1460         hbox1 = gtk_hbox_new (FALSE, 8);
1461         gtk_widget_show (hbox1);
1462         gtk_box_pack_start (GTK_BOX (vbox1), hbox1, FALSE, FALSE, 0);
1463
1464         label_encoding_desc = gtk_label_new
1465                 (_("Specify Content-Transfer-Encoding used when\n"
1466                    "message body contains non-ASCII characters."));
1467         gtk_widget_show (label_encoding_desc);
1468         gtk_box_pack_start (GTK_BOX (hbox1), label_encoding_desc,
1469                             FALSE, FALSE, 0);
1470         gtk_label_set_justify (GTK_LABEL (label_encoding_desc),
1471                                GTK_JUSTIFY_LEFT);
1472
1473         p_send.checkbtn_extsend = checkbtn_extsend;
1474         p_send.entry_extsend    = entry_extsend;
1475         /* p_send.button_extsend   = button_extsend; */
1476
1477         p_send.checkbtn_savemsg  = checkbtn_savemsg;
1478         p_send.checkbtn_queuemsg = checkbtn_queuemsg;
1479         p_send.optmenu_senddialog = optmenu_senddialog;
1480
1481         p_send.optmenu_charset = optmenu_charset;
1482         p_send.optmenu_encoding_method = optmenu_encoding;
1483 }
1484
1485 static void prefs_common_recv_dialog_newmail_notify_toggle_cb(GtkWidget *w, gpointer data)
1486 {
1487         gboolean toggled;
1488
1489         toggled = gtk_toggle_button_get_active
1490                         (GTK_TOGGLE_BUTTON(receive.checkbtn_newmail_manu)) ||
1491                   gtk_toggle_button_get_active
1492                         (GTK_TOGGLE_BUTTON(receive.checkbtn_newmail_auto));
1493         gtk_widget_set_sensitive(receive.hbox_newmail_notify, toggled);
1494 }
1495
1496 static void prefs_compose_create(void)
1497 {
1498         GtkWidget *vbox1;
1499         GtkWidget *vbox2;
1500
1501         GtkWidget *checkbtn_autoextedit;
1502
1503         GtkWidget *frame_autosel;
1504         GtkWidget *hbox_autosel;
1505         GtkWidget *checkbtn_reply_account_autosel;
1506         GtkWidget *checkbtn_forward_account_autosel;
1507         GtkWidget *checkbtn_reedit_account_autosel;
1508
1509         GtkWidget *hbox_undolevel;
1510         GtkWidget *label_undolevel;
1511         GtkObject *spinbtn_undolevel_adj;
1512         GtkWidget *spinbtn_undolevel;
1513
1514         GtkWidget *vbox_linewrap;
1515
1516         GtkWidget *hbox3;
1517         GtkWidget *hbox4;
1518         GtkWidget *hbox5;
1519         GtkWidget *label_linewrap;
1520         GtkObject *spinbtn_linewrap_adj;
1521         GtkWidget *spinbtn_linewrap;
1522         GtkWidget *checkbtn_wrapquote;
1523         GtkWidget *checkbtn_autowrap;
1524         GtkWidget *checkbtn_wrapatsend;
1525
1526         GtkWidget *checkbtn_default_reply_list;
1527
1528         GtkWidget *checkbtn_forward_as_attachment;
1529         GtkWidget *checkbtn_redirect_keep_from;
1530         GtkWidget *checkbtn_smart_wrapping;
1531         GtkWidget *checkbtn_block_cursor;
1532         GtkWidget *frame_msgwrap;
1533
1534         GtkWidget *hbox_autosave;
1535         GtkWidget *checkbtn_autosave;
1536         GtkWidget *entry_autosave_length;
1537         GtkWidget *label_autosave_length;
1538         
1539         vbox1 = gtk_vbox_new (FALSE, VSPACING);
1540         gtk_widget_show (vbox1);
1541         gtk_container_add (GTK_CONTAINER (dialog.notebook), vbox1);
1542         gtk_container_set_border_width (GTK_CONTAINER (vbox1), VBOX_BORDER);
1543
1544         /* Account autoselection */
1545         PACK_FRAME(vbox1, frame_autosel, _("Automatic account selection"));
1546
1547         hbox_autosel = gtk_hbox_new (FALSE, VSPACING_NARROW);
1548         gtk_widget_show (hbox_autosel);
1549         gtk_container_add (GTK_CONTAINER (frame_autosel), hbox_autosel);
1550         gtk_container_set_border_width (GTK_CONTAINER (hbox_autosel), 8);
1551
1552         PACK_CHECK_BUTTON (hbox_autosel, checkbtn_reply_account_autosel,
1553                            _("when replying"));
1554         PACK_CHECK_BUTTON (hbox_autosel, checkbtn_forward_account_autosel,
1555                            _("when forwarding"));
1556         PACK_CHECK_BUTTON (hbox_autosel, checkbtn_reedit_account_autosel,
1557                            _("when re-editing"));
1558
1559         vbox2 = gtk_vbox_new (FALSE, 0);
1560         gtk_widget_show (vbox2);
1561         gtk_box_pack_start (GTK_BOX (vbox1), vbox2, FALSE, FALSE, 0);
1562
1563         PACK_CHECK_BUTTON (vbox2, checkbtn_default_reply_list,
1564                            _("Reply button invokes mailing list reply"));
1565
1566         PACK_CHECK_BUTTON (vbox2, checkbtn_autoextedit,
1567                            _("Automatically launch the external editor"));
1568
1569         hbox5 = gtk_hbox_new (FALSE, 8);
1570         gtk_widget_show (hbox5);
1571         gtk_box_pack_start (GTK_BOX (vbox2), hbox5, FALSE, FALSE, 0);
1572
1573         PACK_CHECK_BUTTON (hbox5, checkbtn_forward_as_attachment,
1574                            _("Forward as attachment"));
1575
1576         PACK_CHECK_BUTTON (hbox5, checkbtn_block_cursor,
1577                           _("Block cursor"));
1578
1579         PACK_CHECK_BUTTON (vbox2, checkbtn_redirect_keep_from,
1580                            _("Keep the original 'From' header when redirecting"));
1581
1582         
1583         hbox_autosave = gtk_hbox_new (FALSE, 8);
1584         gtk_widget_show (hbox_autosave);
1585         gtk_box_pack_start (GTK_BOX (vbox1), hbox_autosave, FALSE, FALSE, 0);
1586         
1587         PACK_CHECK_BUTTON (hbox_autosave, checkbtn_autosave,
1588                            _("Autosave to Drafts folder every "));
1589
1590         entry_autosave_length = gtk_entry_new();
1591         gtk_widget_set_usize (entry_autosave_length, 64, -1);   
1592         gtk_widget_show (entry_autosave_length);
1593         gtk_box_pack_start (GTK_BOX (hbox_autosave), entry_autosave_length, FALSE, FALSE, 0);
1594         
1595         label_autosave_length = gtk_label_new(_("characters"));
1596         gtk_widget_show (label_autosave_length);
1597         gtk_box_pack_start (GTK_BOX (hbox_autosave), label_autosave_length, FALSE, FALSE, 0);
1598         
1599         hbox_undolevel = gtk_hbox_new (FALSE, 8);
1600         gtk_widget_show (hbox_undolevel);
1601         gtk_box_pack_start (GTK_BOX (vbox1), hbox_undolevel, FALSE, FALSE, 0);
1602
1603         label_undolevel = gtk_label_new (_("Undo level"));
1604         gtk_widget_show (label_undolevel);
1605         gtk_box_pack_start (GTK_BOX (hbox_undolevel), label_undolevel, FALSE, FALSE, 0);
1606
1607         spinbtn_undolevel_adj = gtk_adjustment_new (50, 0, 100, 1, 10, 10);
1608         spinbtn_undolevel = gtk_spin_button_new
1609                 (GTK_ADJUSTMENT (spinbtn_undolevel_adj), 1, 0);
1610         gtk_widget_show (spinbtn_undolevel);
1611         gtk_box_pack_start (GTK_BOX (hbox_undolevel), spinbtn_undolevel, FALSE, FALSE, 0);
1612         gtk_widget_set_usize (spinbtn_undolevel, 64, -1);
1613         gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (spinbtn_undolevel), TRUE);
1614
1615         /* line-wrapping */
1616         PACK_FRAME(vbox1, frame_msgwrap, _("Message wrapping"));
1617
1618         vbox_linewrap = gtk_vbox_new (FALSE, VSPACING_NARROW);
1619         gtk_widget_show (vbox_linewrap);
1620         gtk_container_add (GTK_CONTAINER (frame_msgwrap), vbox_linewrap);
1621         gtk_container_set_border_width (GTK_CONTAINER (vbox_linewrap), 8);
1622
1623         hbox3 = gtk_hbox_new (FALSE, 8);
1624         gtk_widget_show (hbox3);
1625         gtk_box_pack_start (GTK_BOX (vbox_linewrap), hbox3, FALSE, FALSE, 0);
1626
1627
1628         label_linewrap = gtk_label_new (_("Wrap messages at"));
1629         gtk_widget_show (label_linewrap);
1630         gtk_box_pack_start (GTK_BOX (hbox3), label_linewrap, FALSE, FALSE, 0);
1631
1632         spinbtn_linewrap_adj = gtk_adjustment_new (72, 20, 1024, 1, 10, 10);
1633         spinbtn_linewrap = gtk_spin_button_new
1634                 (GTK_ADJUSTMENT (spinbtn_linewrap_adj), 1, 0);
1635         gtk_widget_show (spinbtn_linewrap);
1636         gtk_box_pack_start (GTK_BOX (hbox3), spinbtn_linewrap, FALSE, FALSE, 0);
1637         gtk_widget_set_usize (spinbtn_linewrap, 64, -1);
1638         gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (spinbtn_linewrap), TRUE);
1639
1640         label_linewrap = gtk_label_new (_("characters"));
1641         gtk_widget_show (label_linewrap);
1642         gtk_box_pack_start (GTK_BOX (hbox3), label_linewrap, FALSE, FALSE, 0);
1643
1644         hbox4 = gtk_hbox_new (FALSE, VSPACING);
1645         gtk_widget_show (hbox4);
1646         gtk_box_pack_start (GTK_BOX (vbox_linewrap), hbox4, FALSE, FALSE, 0);
1647
1648         PACK_CHECK_BUTTON (hbox4, checkbtn_wrapquote, _("Wrap quotation"));
1649
1650         PACK_CHECK_BUTTON (hbox4, checkbtn_autowrap, _("Wrap on input"));
1651
1652         PACK_CHECK_BUTTON
1653                 (hbox4, checkbtn_wrapatsend, _("Wrap before sending"));
1654
1655         PACK_CHECK_BUTTON (vbox_linewrap, checkbtn_smart_wrapping,
1656                            _("Smart wrapping (EXPERIMENTAL)"));
1657         
1658        /*
1659         compose.checkbtn_quote   = checkbtn_quote;
1660         compose.entry_quotemark  = entry_quotemark;
1661         compose.text_quotefmt    = text_quotefmt;
1662         */
1663
1664         compose.checkbtn_autoextedit = checkbtn_autoextedit;
1665
1666         compose.checkbtn_reply_account_autosel   = checkbtn_reply_account_autosel;
1667         compose.checkbtn_forward_account_autosel = checkbtn_forward_account_autosel;
1668         compose.checkbtn_reedit_account_autosel  = checkbtn_reedit_account_autosel;
1669
1670         compose.spinbtn_undolevel     = spinbtn_undolevel;
1671         compose.spinbtn_undolevel_adj = spinbtn_undolevel_adj;
1672
1673         compose.spinbtn_linewrap      = spinbtn_linewrap;
1674         compose.spinbtn_linewrap_adj  = spinbtn_linewrap_adj;
1675         compose.checkbtn_wrapquote    = checkbtn_wrapquote;
1676         compose.checkbtn_autowrap     = checkbtn_autowrap;
1677         compose.checkbtn_wrapatsend   = checkbtn_wrapatsend;
1678
1679         compose.checkbtn_autosave     = checkbtn_autosave;
1680         compose.entry_autosave_length = entry_autosave_length;
1681         
1682         compose.checkbtn_forward_as_attachment =
1683                 checkbtn_forward_as_attachment;
1684         compose.checkbtn_redirect_keep_from =
1685                 checkbtn_redirect_keep_from;
1686         compose.checkbtn_smart_wrapping = 
1687                 checkbtn_smart_wrapping;
1688         compose.checkbtn_block_cursor   =
1689                 checkbtn_block_cursor;
1690         compose.checkbtn_default_reply_list = checkbtn_default_reply_list;
1691 }
1692
1693 static void prefs_quote_create(void)
1694 {
1695         GtkWidget *vbox1;
1696         GtkWidget *frame_quote;
1697         GtkWidget *vbox_quote;
1698         GtkWidget *hbox1;
1699         GtkWidget *hbox2;
1700         GtkWidget *label_quotemark;
1701         GtkWidget *entry_quotemark;
1702         GtkWidget *scrolledwin_quotefmt;
1703         GtkWidget *text_quotefmt;
1704
1705         GtkWidget *entry_fw_quotemark;
1706         GtkWidget *text_fw_quotefmt;
1707
1708         GtkWidget *entry_quote_chars;
1709         GtkWidget *label_quote_chars;
1710         
1711         GtkWidget *btn_quotedesc;
1712
1713         GtkWidget *checkbtn_reply_with_quote;
1714
1715         vbox1 = gtk_vbox_new (FALSE, VSPACING);
1716         gtk_widget_show (vbox1);
1717         gtk_container_add (GTK_CONTAINER (dialog.notebook), vbox1);
1718         gtk_container_set_border_width (GTK_CONTAINER (vbox1), VBOX_BORDER);
1719
1720         /* reply */
1721
1722         PACK_CHECK_BUTTON (vbox1, checkbtn_reply_with_quote, _("Reply will quote by default"));
1723
1724         PACK_FRAME (vbox1, frame_quote, _("Reply format"));
1725
1726         vbox_quote = gtk_vbox_new (FALSE, VSPACING_NARROW);
1727         gtk_widget_show (vbox_quote);
1728         gtk_container_add (GTK_CONTAINER (frame_quote), vbox_quote);
1729         gtk_container_set_border_width (GTK_CONTAINER (vbox_quote), 8);
1730
1731         hbox1 = gtk_hbox_new (FALSE, 32);
1732         gtk_widget_show (hbox1);
1733         gtk_box_pack_start (GTK_BOX (vbox_quote), hbox1, FALSE, FALSE, 0);
1734
1735         hbox2 = gtk_hbox_new (FALSE, 8);
1736         gtk_widget_show (hbox2);
1737         gtk_box_pack_start (GTK_BOX (hbox1), hbox2, FALSE, FALSE, 0);
1738
1739         label_quotemark = gtk_label_new (_("Quotation mark"));
1740         gtk_widget_show (label_quotemark);
1741         gtk_box_pack_start (GTK_BOX (hbox2), label_quotemark, FALSE, FALSE, 0);
1742
1743         entry_quotemark = gtk_entry_new ();
1744         gtk_widget_show (entry_quotemark);
1745         gtk_box_pack_start (GTK_BOX (hbox2), entry_quotemark, FALSE, FALSE, 0);
1746         gtk_widget_set_usize (entry_quotemark, 64, -1);
1747
1748         scrolledwin_quotefmt = gtk_scrolled_window_new (NULL, NULL);
1749         gtk_widget_show (scrolledwin_quotefmt);
1750         gtk_box_pack_start (GTK_BOX (vbox_quote), scrolledwin_quotefmt, TRUE, TRUE, 0);
1751         gtk_scrolled_window_set_policy
1752                 (GTK_SCROLLED_WINDOW (scrolledwin_quotefmt),
1753                  GTK_POLICY_NEVER, GTK_POLICY_ALWAYS);
1754
1755         text_quotefmt = gtk_text_new (NULL, NULL);
1756         gtk_widget_show (text_quotefmt);
1757         gtk_container_add(GTK_CONTAINER(scrolledwin_quotefmt), text_quotefmt);
1758         gtk_text_set_editable (GTK_TEXT (text_quotefmt), TRUE);
1759         gtk_widget_set_usize(text_quotefmt, -1, 60);
1760
1761         /* forward */
1762
1763         PACK_FRAME (vbox1, frame_quote, _("Forward format"));
1764
1765         vbox_quote = gtk_vbox_new (FALSE, VSPACING_NARROW);
1766         gtk_widget_show (vbox_quote);
1767         gtk_container_add (GTK_CONTAINER (frame_quote), vbox_quote);
1768         gtk_container_set_border_width (GTK_CONTAINER (vbox_quote), 8);
1769
1770         hbox1 = gtk_hbox_new (FALSE, 32);
1771         gtk_widget_show (hbox1);
1772         gtk_box_pack_start (GTK_BOX (vbox_quote), hbox1, FALSE, FALSE, 0);
1773
1774         hbox2 = gtk_hbox_new (FALSE, 8);
1775         gtk_widget_show (hbox2);
1776         gtk_box_pack_start (GTK_BOX (hbox1), hbox2, FALSE, FALSE, 0);
1777
1778         label_quotemark = gtk_label_new (_("Quotation mark"));
1779         gtk_widget_show (label_quotemark);
1780         gtk_box_pack_start (GTK_BOX (hbox2), label_quotemark, FALSE, FALSE, 0);
1781
1782         entry_fw_quotemark = gtk_entry_new ();
1783         gtk_widget_show (entry_fw_quotemark);
1784         gtk_box_pack_start (GTK_BOX (hbox2), entry_fw_quotemark,
1785                             FALSE, FALSE, 0);
1786         gtk_widget_set_usize (entry_fw_quotemark, 64, -1);
1787
1788         scrolledwin_quotefmt = gtk_scrolled_window_new (NULL, NULL);
1789         gtk_widget_show (scrolledwin_quotefmt);
1790         gtk_box_pack_start (GTK_BOX (vbox_quote), scrolledwin_quotefmt, TRUE, TRUE, 0);
1791         gtk_scrolled_window_set_policy
1792                 (GTK_SCROLLED_WINDOW (scrolledwin_quotefmt),
1793                  GTK_POLICY_NEVER, GTK_POLICY_ALWAYS);
1794
1795         text_fw_quotefmt = gtk_text_new (NULL, NULL);
1796         gtk_widget_show (text_fw_quotefmt);
1797         gtk_container_add(GTK_CONTAINER(scrolledwin_quotefmt),
1798                           text_fw_quotefmt);
1799         gtk_text_set_editable (GTK_TEXT (text_fw_quotefmt), TRUE);
1800         gtk_widget_set_usize(text_fw_quotefmt, -1, 60);
1801
1802         hbox1 = gtk_hbox_new (FALSE, 32);
1803         gtk_widget_show (hbox1);
1804         gtk_box_pack_start (GTK_BOX (vbox1), hbox1, FALSE, FALSE, 0);
1805
1806         btn_quotedesc =
1807                 gtk_button_new_with_label (_(" Description of symbols "));
1808         gtk_widget_show (btn_quotedesc);
1809         gtk_box_pack_start (GTK_BOX (hbox1), btn_quotedesc, FALSE, FALSE, 0);
1810         gtk_signal_connect(GTK_OBJECT(btn_quotedesc), "clicked",
1811                            GTK_SIGNAL_FUNC(quote_fmt_quote_description), NULL);
1812
1813         /* quote chars */
1814
1815         PACK_FRAME (vbox1, frame_quote, _("Quotation characters"));
1816
1817         vbox_quote = gtk_vbox_new (FALSE, VSPACING_NARROW);
1818         gtk_widget_show (vbox_quote);
1819         gtk_container_add (GTK_CONTAINER (frame_quote), vbox_quote);
1820         gtk_container_set_border_width (GTK_CONTAINER (vbox_quote), 8);
1821
1822         hbox1 = gtk_hbox_new (FALSE, 32);
1823         gtk_widget_show (hbox1);
1824         gtk_box_pack_start (GTK_BOX (vbox_quote), hbox1, FALSE, FALSE, 0);
1825
1826         hbox2 = gtk_hbox_new (FALSE, 8);
1827         gtk_widget_show (hbox2);
1828         gtk_box_pack_start (GTK_BOX (hbox1), hbox2, FALSE, FALSE, 0);
1829
1830         label_quote_chars = gtk_label_new (_("Treat these characters as quotation marks: "));
1831         gtk_widget_show (label_quote_chars);
1832         gtk_box_pack_start (GTK_BOX (hbox2), label_quote_chars, FALSE, FALSE, 0);
1833
1834         entry_quote_chars = gtk_entry_new ();
1835         gtk_widget_show (entry_quote_chars);
1836         gtk_box_pack_start (GTK_BOX (hbox2), entry_quote_chars,
1837                             FALSE, FALSE, 0);
1838         gtk_widget_set_usize (entry_quote_chars, 64, -1);
1839
1840
1841         compose.checkbtn_reply_with_quote= checkbtn_reply_with_quote;
1842         quote.entry_quotemark    = entry_quotemark;
1843         quote.text_quotefmt      = text_quotefmt;
1844         quote.entry_fw_quotemark = entry_fw_quotemark;
1845         quote.text_fw_quotefmt   = text_fw_quotefmt;
1846         quote.entry_quote_chars  = entry_quote_chars;
1847 }
1848
1849 static void prefs_display_create(void)
1850 {
1851         GtkWidget *vbox1;
1852         GtkWidget *frame_font;
1853         GtkWidget *table1;
1854         GtkWidget *label_textfont;
1855         GtkWidget *entry_textfont;
1856         GtkWidget *button_textfont;
1857         GtkWidget *chkbtn_transhdr;
1858         GtkWidget *chkbtn_folder_unread;
1859         GtkWidget *hbox1;
1860         GtkWidget *label_ng_abbrev;
1861         GtkWidget *spinbtn_ng_abbrev_len;
1862         GtkObject *spinbtn_ng_abbrev_len_adj;
1863         GtkWidget *frame_summary;
1864         GtkWidget *vbox2;
1865         GtkWidget *chkbtn_swapfrom;
1866         GtkWidget *chkbtn_useaddrbook;
1867         GtkWidget *chkbtn_threadsubj;
1868         GtkWidget *vbox3;
1869         GtkWidget *label_datefmt;
1870         GtkWidget *button_datefmt;
1871         GtkWidget *entry_datefmt;
1872         GtkWidget *button_dispitem;
1873         GtkWidget *tmplabel, *tmpbutton, *tmpentry;
1874
1875         vbox1 = gtk_vbox_new (FALSE, VSPACING);
1876         gtk_widget_show (vbox1);
1877         gtk_container_add (GTK_CONTAINER (dialog.notebook), vbox1);
1878         gtk_container_set_border_width (GTK_CONTAINER (vbox1), VBOX_BORDER);
1879
1880         PACK_FRAME(vbox1, frame_font, _("Font"));
1881
1882         table1 = gtk_table_new (4, 3, FALSE);
1883
1884         gtk_widget_show (table1);
1885         gtk_container_add (GTK_CONTAINER (frame_font), table1);
1886         gtk_container_set_border_width (GTK_CONTAINER (table1), 8);
1887         gtk_table_set_row_spacings (GTK_TABLE (table1), 8);
1888         gtk_table_set_col_spacings (GTK_TABLE (table1), 8);
1889
1890         label_textfont = gtk_label_new (_("Text"));
1891         gtk_misc_set_alignment(GTK_MISC(label_textfont), 0, 0.5);
1892         gtk_widget_show (label_textfont);
1893         gtk_table_attach (GTK_TABLE (table1), label_textfont, 0, 1, 0, 1,
1894                           GTK_FILL, (GTK_EXPAND | GTK_FILL), 0, 0);
1895
1896         entry_textfont = gtk_entry_new ();
1897         gtk_widget_show (entry_textfont);
1898         gtk_table_attach (GTK_TABLE (table1), entry_textfont, 1, 2, 0, 1,
1899                           (GTK_EXPAND | GTK_FILL), 0, 0, 0);
1900
1901         button_textfont = gtk_button_new_with_label (" ... ");
1902
1903         gtk_widget_show (button_textfont);
1904         gtk_table_attach (GTK_TABLE (table1), button_textfont, 2, 3, 0, 1,
1905                           0, 0, 0, 0);
1906         gtk_signal_connect (GTK_OBJECT (button_textfont), "clicked",
1907                             GTK_SIGNAL_FUNC (prefs_font_select), entry_textfont);
1908
1909         tmplabel = gtk_label_new (_("Small"));
1910         gtk_misc_set_alignment(GTK_MISC(tmplabel), 0, 0.5);
1911         gtk_widget_show (tmplabel);
1912         gtk_table_attach (GTK_TABLE (table1), tmplabel, 0, 1, 1, 2,
1913                           GTK_FILL, (GTK_EXPAND | GTK_FILL), 0, 0);
1914
1915         tmpentry = gtk_entry_new ();
1916         gtk_widget_show (tmpentry);
1917         gtk_table_attach (GTK_TABLE (table1), tmpentry, 1, 2, 1, 2,
1918                           (GTK_EXPAND | GTK_FILL), 0, 0, 0);
1919
1920         tmpbutton = gtk_button_new_with_label (" ... ");
1921         gtk_widget_show (tmpbutton);
1922         gtk_table_attach (GTK_TABLE (table1), tmpbutton, 2, 3, 1, 2,
1923                           0, 0, 0, 0);
1924         gtk_signal_connect (GTK_OBJECT(tmpbutton), "clicked",
1925                             GTK_SIGNAL_FUNC(prefs_font_select), tmpentry);
1926         display.entry_smallfont = tmpentry;                       
1927
1928         tmplabel = gtk_label_new (_("Normal"));
1929         gtk_misc_set_alignment(GTK_MISC(tmplabel), 0, 0.5);
1930         gtk_widget_show (tmplabel);
1931         gtk_table_attach (GTK_TABLE (table1), tmplabel, 0, 1, 2, 3,
1932                           GTK_FILL, (GTK_EXPAND | GTK_FILL), 0, 0);
1933
1934         tmpentry = gtk_entry_new ();
1935         gtk_widget_show (tmpentry);
1936         gtk_table_attach (GTK_TABLE (table1), tmpentry, 1, 2, 2, 3,
1937                           (GTK_EXPAND | GTK_FILL), 0, 0, 0);
1938
1939         tmpbutton = gtk_button_new_with_label (" ... ");
1940         gtk_widget_show (tmpbutton);
1941         gtk_table_attach (GTK_TABLE (table1), tmpbutton, 2, 3, 2, 3,
1942                           0, 0, 0, 0);
1943         gtk_signal_connect (GTK_OBJECT(tmpbutton), "clicked",
1944                                 GTK_SIGNAL_FUNC(prefs_font_select), tmpentry);
1945         display.entry_normalfont = tmpentry;                      
1946
1947         tmplabel = gtk_label_new (_("Bold"));
1948         gtk_misc_set_alignment(GTK_MISC(tmplabel), 0, 0.5);
1949         gtk_widget_show (tmplabel);
1950         gtk_table_attach (GTK_TABLE (table1), tmplabel, 0, 1, 3, 4,
1951                           GTK_FILL, (GTK_EXPAND | GTK_FILL), 0, 0);
1952
1953         tmpentry = gtk_entry_new ();
1954         gtk_widget_show (tmpentry);
1955         gtk_table_attach (GTK_TABLE (table1), tmpentry, 1, 2, 3, 4,
1956                           (GTK_EXPAND | GTK_FILL), 0, 0, 0);
1957
1958         tmpbutton = gtk_button_new_with_label (" ... ");
1959         gtk_widget_show (tmpbutton);
1960         gtk_table_attach (GTK_TABLE (table1), tmpbutton, 2, 3, 3, 4,
1961                           0, 0, 0, 0);
1962         gtk_signal_connect (GTK_OBJECT(tmpbutton), "clicked",
1963                                 GTK_SIGNAL_FUNC(prefs_font_select), tmpentry);
1964         display.entry_boldfont = tmpentry;
1965
1966         vbox2 = gtk_vbox_new (FALSE, 0);
1967         gtk_widget_show (vbox2);
1968         gtk_box_pack_start (GTK_BOX (vbox1), vbox2, FALSE, TRUE, 0);
1969
1970         PACK_CHECK_BUTTON
1971                 (vbox2, chkbtn_transhdr,
1972                  _("Translate header name (such as `From:', `Subject:')"));
1973
1974         PACK_CHECK_BUTTON (vbox2, chkbtn_folder_unread,
1975                            _("Display unread number next to folder name"));
1976
1977         PACK_VSPACER(vbox2, vbox3, VSPACING_NARROW_2);
1978
1979         hbox1 = gtk_hbox_new (FALSE, 8);
1980         gtk_widget_show (hbox1);
1981         gtk_box_pack_start (GTK_BOX (vbox2), hbox1, FALSE, TRUE, 0);
1982
1983         label_ng_abbrev = gtk_label_new
1984                 (_("Abbreviate newsgroup names longer than"));
1985         gtk_widget_show (label_ng_abbrev);
1986         gtk_box_pack_start (GTK_BOX (hbox1), label_ng_abbrev, FALSE, FALSE, 0);
1987
1988         spinbtn_ng_abbrev_len_adj = gtk_adjustment_new (16, 0, 999, 1, 10, 10);
1989         spinbtn_ng_abbrev_len = gtk_spin_button_new
1990                 (GTK_ADJUSTMENT (spinbtn_ng_abbrev_len_adj), 1, 0);
1991         gtk_widget_show (spinbtn_ng_abbrev_len);
1992         gtk_box_pack_start (GTK_BOX (hbox1), spinbtn_ng_abbrev_len,
1993                             FALSE, FALSE, 0);
1994         gtk_widget_set_usize (spinbtn_ng_abbrev_len, 56, -1);
1995         gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (spinbtn_ng_abbrev_len),
1996                                      TRUE);
1997
1998         label_ng_abbrev = gtk_label_new
1999                 (_("letters"));
2000         gtk_widget_show (label_ng_abbrev);
2001         gtk_box_pack_start (GTK_BOX (hbox1), label_ng_abbrev, FALSE, FALSE, 0);
2002
2003         /* ---- Summary ---- */
2004
2005         PACK_FRAME(vbox1, frame_summary, _("Summary View"));
2006
2007         vbox2 = gtk_vbox_new (FALSE, 0);
2008         gtk_widget_show (vbox2);
2009         gtk_container_add (GTK_CONTAINER (frame_summary), vbox2);
2010         gtk_container_set_border_width (GTK_CONTAINER (vbox2), 8);
2011
2012         PACK_CHECK_BUTTON
2013                 (vbox2, chkbtn_swapfrom,
2014                  _("Display recipient in `From' column if sender is yourself"));
2015         PACK_CHECK_BUTTON
2016                 (vbox2, chkbtn_useaddrbook,
2017                  _("Display sender using address book"));
2018         PACK_CHECK_BUTTON
2019                 (vbox2, chkbtn_threadsubj,
2020                  _("Thread using subject in addition to standard headers"));
2021
2022         PACK_VSPACER(vbox2, vbox3, VSPACING_NARROW_2);
2023
2024         hbox1 = gtk_hbox_new (FALSE, 8);
2025         gtk_widget_show (hbox1);
2026         gtk_box_pack_start (GTK_BOX (vbox2), hbox1, FALSE, TRUE, 0);
2027
2028         label_datefmt = gtk_label_new (_("Date format"));
2029         gtk_widget_show (label_datefmt);
2030         gtk_box_pack_start (GTK_BOX (hbox1), label_datefmt, FALSE, FALSE, 0);
2031
2032         entry_datefmt = gtk_entry_new ();
2033         gtk_widget_show (entry_datefmt);
2034         gtk_box_pack_start (GTK_BOX (hbox1), entry_datefmt, TRUE, TRUE, 0);
2035
2036         button_datefmt = gtk_button_new_with_label (" ... ");
2037
2038         gtk_widget_show (button_datefmt);
2039         gtk_box_pack_start (GTK_BOX (hbox1), button_datefmt, FALSE, FALSE, 0);
2040         gtk_signal_connect (GTK_OBJECT (button_datefmt), "clicked",
2041                             GTK_SIGNAL_FUNC (date_format_create), NULL);
2042
2043         PACK_VSPACER(vbox2, vbox3, VSPACING_NARROW);
2044
2045         hbox1 = gtk_hbox_new (FALSE, 8);
2046         gtk_widget_show (hbox1);
2047         gtk_box_pack_start (GTK_BOX (vbox2), hbox1, FALSE, TRUE, 0);
2048
2049         button_dispitem = gtk_button_new_with_label
2050                 (_(" Set displayed items in summary... "));
2051         gtk_widget_show (button_dispitem);
2052         gtk_box_pack_start (GTK_BOX (hbox1), button_dispitem, FALSE, TRUE, 0);
2053         gtk_signal_connect (GTK_OBJECT (button_dispitem), "clicked",
2054                             GTK_SIGNAL_FUNC (prefs_summary_column_open),
2055                             NULL);
2056
2057         display.entry_textfont  = entry_textfont;
2058         display.button_textfont = button_textfont;
2059
2060         display.chkbtn_transhdr           = chkbtn_transhdr;
2061         display.chkbtn_folder_unread      = chkbtn_folder_unread;
2062         display.spinbtn_ng_abbrev_len     = spinbtn_ng_abbrev_len;
2063         display.spinbtn_ng_abbrev_len_adj = spinbtn_ng_abbrev_len_adj;
2064
2065         display.chkbtn_swapfrom      = chkbtn_swapfrom;
2066         display.chkbtn_useaddrbook   = chkbtn_useaddrbook;
2067         display.chkbtn_threadsubj    = chkbtn_threadsubj;
2068         display.entry_datefmt        = entry_datefmt;
2069 }
2070
2071 static void prefs_message_create(void)
2072 {
2073         GtkWidget *vbox1;
2074         GtkWidget *vbox2;
2075         GtkWidget *vbox3;
2076         GtkWidget *hbox1;
2077         GtkWidget *chkbtn_enablecol;
2078         GtkWidget *button_edit_col;
2079         GtkWidget *chkbtn_mbalnum;
2080         GtkWidget *chkbtn_disphdrpane;
2081         GtkWidget *chkbtn_disphdr;
2082         GtkWidget *button_edit_disphdr;
2083         GtkWidget *hbox_linespc;
2084         GtkWidget *label_linespc;
2085         GtkObject *spinbtn_linespc_adj;
2086         GtkWidget *spinbtn_linespc;
2087         GtkWidget *chkbtn_headspc;
2088
2089         GtkWidget *frame_scr;
2090         GtkWidget *vbox_scr;
2091         GtkWidget *chkbtn_smoothscroll;
2092         GtkWidget *hbox_scr;
2093         GtkWidget *label_scr;
2094         GtkObject *spinbtn_scrollstep_adj;
2095         GtkWidget *spinbtn_scrollstep;
2096         GtkWidget *chkbtn_halfpage;
2097
2098         GtkWidget *chkbtn_attach_desc;
2099
2100         vbox1 = gtk_vbox_new (FALSE, VSPACING);
2101         gtk_widget_show (vbox1);
2102         gtk_container_add (GTK_CONTAINER (dialog.notebook), vbox1);
2103         gtk_container_set_border_width (GTK_CONTAINER (vbox1), VBOX_BORDER);
2104
2105         vbox2 = gtk_vbox_new (FALSE, 0);
2106         gtk_widget_show (vbox2);
2107         gtk_box_pack_start (GTK_BOX (vbox1), vbox2, FALSE, FALSE, 0);
2108
2109         hbox1 = gtk_hbox_new (FALSE, 8);
2110         gtk_widget_show (hbox1);
2111         gtk_box_pack_start (GTK_BOX (vbox2), hbox1, FALSE, TRUE, 0);
2112
2113         PACK_CHECK_BUTTON (hbox1, chkbtn_enablecol,
2114                            _("Enable coloration of message"));
2115         gtk_signal_connect (GTK_OBJECT (chkbtn_enablecol), "toggled",
2116                                                 GTK_SIGNAL_FUNC (prefs_enable_message_color_toggled),
2117                                                 NULL);
2118
2119         button_edit_col = gtk_button_new_with_label (_(" Edit... "));
2120         gtk_widget_show (button_edit_col);
2121         gtk_box_pack_end (GTK_BOX (hbox1), button_edit_col, FALSE, TRUE, 0);
2122         gtk_signal_connect (GTK_OBJECT (button_edit_col), "clicked",
2123                             GTK_SIGNAL_FUNC (prefs_quote_colors_dialog), NULL);
2124
2125         SET_TOGGLE_SENSITIVITY(chkbtn_enablecol, button_edit_col);
2126
2127         PACK_CHECK_BUTTON
2128                 (vbox2, chkbtn_mbalnum,
2129                  _("Display multi-byte alphanumeric as\n"
2130                    "ASCII character (Japanese only)"));
2131         gtk_label_set_justify (GTK_LABEL (GTK_BIN(chkbtn_mbalnum)->child),
2132                                GTK_JUSTIFY_LEFT);
2133
2134         PACK_CHECK_BUTTON(vbox2, chkbtn_disphdrpane,
2135                           _("Display header pane above message view"));
2136
2137         hbox1 = gtk_hbox_new (FALSE, 8);
2138         gtk_widget_show (hbox1);
2139         gtk_box_pack_start (GTK_BOX (vbox2), hbox1, FALSE, TRUE, 0);
2140
2141         PACK_CHECK_BUTTON(hbox1, chkbtn_disphdr,
2142                           _("Display short headers on message view"));
2143
2144         button_edit_disphdr = gtk_button_new_with_label (_(" Edit... "));
2145         gtk_widget_show (button_edit_disphdr);
2146         gtk_box_pack_end (GTK_BOX (hbox1), button_edit_disphdr,
2147                           FALSE, TRUE, 0);
2148         gtk_signal_connect (GTK_OBJECT (button_edit_disphdr), "clicked",
2149                             GTK_SIGNAL_FUNC (prefs_display_header_open),
2150                             NULL);
2151
2152         SET_TOGGLE_SENSITIVITY(chkbtn_disphdr, button_edit_disphdr);
2153
2154         PACK_VSPACER(vbox2, vbox3, VSPACING_NARROW_2);
2155
2156         hbox1 = gtk_hbox_new (FALSE, 32);
2157         gtk_widget_show (hbox1);
2158         gtk_box_pack_start (GTK_BOX (vbox2), hbox1, FALSE, TRUE, 0);
2159
2160         hbox_linespc = gtk_hbox_new (FALSE, 8);
2161         gtk_widget_show (hbox1);
2162         gtk_box_pack_start (GTK_BOX (hbox1), hbox_linespc, FALSE, TRUE, 0);
2163
2164         label_linespc = gtk_label_new (_("Line space"));
2165         gtk_widget_show (label_linespc);
2166         gtk_box_pack_start (GTK_BOX (hbox_linespc), label_linespc,
2167                             FALSE, FALSE, 0);
2168
2169         spinbtn_linespc_adj = gtk_adjustment_new (2, 0, 16, 1, 1, 16);
2170         spinbtn_linespc = gtk_spin_button_new
2171                 (GTK_ADJUSTMENT (spinbtn_linespc_adj), 1, 0);
2172         gtk_widget_show (spinbtn_linespc);
2173         gtk_box_pack_start (GTK_BOX (hbox_linespc), spinbtn_linespc,
2174                             FALSE, FALSE, 0);
2175         gtk_widget_set_usize (spinbtn_linespc, 64, -1);
2176         gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (spinbtn_linespc), TRUE);
2177
2178         label_linespc = gtk_label_new (_("pixel(s)"));
2179         gtk_widget_show (label_linespc);
2180         gtk_box_pack_start (GTK_BOX (hbox_linespc), label_linespc,
2181                             FALSE, FALSE, 0);
2182
2183         PACK_CHECK_BUTTON(hbox1, chkbtn_headspc, _("Leave space on head"));
2184
2185         PACK_FRAME(vbox1, frame_scr, _("Scroll"));
2186
2187         vbox_scr = gtk_vbox_new (FALSE, 0);
2188         gtk_widget_show (vbox_scr);
2189         gtk_container_add (GTK_CONTAINER (frame_scr), vbox_scr);
2190         gtk_container_set_border_width (GTK_CONTAINER (vbox_scr), 8);
2191
2192         PACK_CHECK_BUTTON(vbox_scr, chkbtn_halfpage, _("Half page"));
2193
2194         hbox1 = gtk_hbox_new (FALSE, 32);
2195         gtk_widget_show (hbox1);
2196         gtk_box_pack_start (GTK_BOX (vbox_scr), hbox1, FALSE, TRUE, 0);
2197
2198         PACK_CHECK_BUTTON(hbox1, chkbtn_smoothscroll, _("Smooth scroll"));
2199
2200         hbox_scr = gtk_hbox_new (FALSE, 8);
2201         gtk_widget_show (hbox_scr);
2202         gtk_box_pack_start (GTK_BOX (hbox1), hbox_scr, FALSE, FALSE, 0);
2203
2204         label_scr = gtk_label_new (_("Step"));
2205         gtk_widget_show (label_scr);
2206         gtk_box_pack_start (GTK_BOX (hbox_scr), label_scr, FALSE, FALSE, 0);
2207
2208         spinbtn_scrollstep_adj = gtk_adjustment_new (1, 1, 100, 1, 10, 10);
2209         spinbtn_scrollstep = gtk_spin_button_new
2210                 (GTK_ADJUSTMENT (spinbtn_scrollstep_adj), 1, 0);
2211         gtk_widget_show (spinbtn_scrollstep);
2212         gtk_box_pack_start (GTK_BOX (hbox_scr), spinbtn_scrollstep,
2213                             FALSE, FALSE, 0);
2214         gtk_widget_set_usize (spinbtn_scrollstep, 64, -1);
2215         gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (spinbtn_scrollstep),
2216                                      TRUE);
2217
2218         label_scr = gtk_label_new (_("pixel(s)"));
2219         gtk_widget_show (label_scr);
2220         gtk_box_pack_start (GTK_BOX (hbox_scr), label_scr, FALSE, FALSE, 0);
2221
2222         SET_TOGGLE_SENSITIVITY (chkbtn_smoothscroll, hbox_scr)
2223
2224         vbox3 = gtk_vbox_new (FALSE, 0);
2225         gtk_widget_show (vbox3);
2226         gtk_box_pack_start (GTK_BOX (vbox1), vbox3, FALSE, FALSE, 0);
2227
2228         PACK_CHECK_BUTTON(vbox3, chkbtn_attach_desc,
2229                           _("Show attachment descriptions (rather than names)"));
2230
2231
2232         message.chkbtn_enablecol   = chkbtn_enablecol;
2233         message.button_edit_col    = button_edit_col;
2234         message.chkbtn_mbalnum     = chkbtn_mbalnum;
2235         message.chkbtn_disphdrpane = chkbtn_disphdrpane;
2236         message.chkbtn_disphdr     = chkbtn_disphdr;
2237         message.spinbtn_linespc    = spinbtn_linespc;
2238         message.chkbtn_headspc     = chkbtn_headspc;
2239
2240         message.chkbtn_smoothscroll    = chkbtn_smoothscroll;
2241         message.spinbtn_scrollstep     = spinbtn_scrollstep;
2242         message.spinbtn_scrollstep_adj = spinbtn_scrollstep_adj;
2243         message.chkbtn_halfpage        = chkbtn_halfpage;
2244
2245         message.chkbtn_attach_desc  = chkbtn_attach_desc;
2246 }
2247
2248 #if USE_GPGME
2249 static void prefs_privacy_create(void)
2250 {
2251         GtkWidget *vbox1;
2252         GtkWidget *vbox2;
2253         GtkWidget *vbox3;
2254         GtkWidget *hbox1;
2255         GtkWidget *hbox_spc;
2256         GtkWidget *label;
2257         GtkWidget *checkbtn_auto_check_signatures;
2258         GtkWidget *checkbtn_gpg_signature_popup;
2259         GtkWidget *checkbtn_store_passphrase;
2260         GtkObject *spinbtn_store_passphrase_adj;
2261         GtkWidget *spinbtn_store_passphrase;
2262         GtkWidget *checkbtn_passphrase_grab;
2263         GtkWidget *checkbtn_gpg_warning;
2264
2265         vbox1 = gtk_vbox_new (FALSE, VSPACING);
2266         gtk_widget_show (vbox1);
2267         gtk_container_add (GTK_CONTAINER (dialog.notebook), vbox1);
2268         gtk_container_set_border_width (GTK_CONTAINER (vbox1), VBOX_BORDER);
2269
2270         vbox2 = gtk_vbox_new (FALSE, 0);
2271         gtk_widget_show (vbox2);
2272         gtk_box_pack_start (GTK_BOX (vbox1), vbox2, FALSE, FALSE, 0);
2273
2274         PACK_CHECK_BUTTON (vbox2, checkbtn_auto_check_signatures,
2275                            _("Automatically check signatures"));
2276
2277         PACK_CHECK_BUTTON (vbox2, checkbtn_gpg_signature_popup,
2278                            _("Show signature check result in a popup window"));
2279
2280         PACK_CHECK_BUTTON (vbox2, checkbtn_store_passphrase,
2281                            _("Store passphrase in memory temporarily"));
2282
2283         vbox3 = gtk_vbox_new (FALSE, 0);
2284         gtk_widget_show (vbox3);
2285         gtk_box_pack_start (GTK_BOX (vbox2), vbox3, FALSE, FALSE, 0);
2286
2287         hbox1 = gtk_hbox_new (FALSE, 8);
2288         gtk_widget_show (hbox1);
2289         gtk_box_pack_start (GTK_BOX (vbox3), hbox1, FALSE, FALSE, 0);
2290
2291         hbox_spc = gtk_hbox_new (FALSE, 0);
2292         gtk_widget_show (hbox_spc);
2293         gtk_box_pack_start (GTK_BOX (hbox1), hbox_spc, FALSE, FALSE, 0);
2294         gtk_widget_set_usize (hbox_spc, 12, -1);
2295
2296         label = gtk_label_new (_("Expire after"));
2297         gtk_widget_show (label);
2298         gtk_box_pack_start (GTK_BOX (hbox1), label, FALSE, FALSE, 0);
2299
2300         spinbtn_store_passphrase_adj = gtk_adjustment_new (0, 0, 1440, 1, 5, 5);
2301         spinbtn_store_passphrase = gtk_spin_button_new
2302                 (GTK_ADJUSTMENT (spinbtn_store_passphrase_adj), 1, 0);
2303         gtk_widget_show (spinbtn_store_passphrase);
2304         gtk_box_pack_start (GTK_BOX (hbox1), spinbtn_store_passphrase, FALSE, FALSE, 0);
2305         gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (spinbtn_store_passphrase),
2306                                      TRUE);
2307         gtk_widget_set_usize (spinbtn_store_passphrase, 64, -1);
2308
2309         label = gtk_label_new (_("minute(s) "));
2310         gtk_widget_show (label);
2311         gtk_box_pack_start (GTK_BOX (hbox1), label, FALSE, FALSE, 0);
2312
2313         hbox1 = gtk_hbox_new (FALSE, 8);
2314         gtk_widget_show (hbox1);
2315         gtk_box_pack_start (GTK_BOX (vbox3), hbox1, FALSE, FALSE, 0);
2316
2317         hbox_spc = gtk_hbox_new (FALSE, 0);
2318         gtk_widget_show (hbox_spc);
2319         gtk_box_pack_start (GTK_BOX (hbox1), hbox_spc, FALSE, FALSE, 0);
2320         gtk_widget_set_usize (hbox_spc, 12, -1);
2321
2322         label = gtk_label_new (_("(Setting to '0' will store the passphrase\n"
2323                                  " for the whole session)"));
2324         gtk_widget_show (label);
2325         gtk_box_pack_start (GTK_BOX (hbox1), label, FALSE, FALSE, 0);
2326         gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT);
2327
2328         SET_TOGGLE_SENSITIVITY (checkbtn_store_passphrase, vbox3);
2329
2330 #ifndef __MINGW32__
2331         PACK_CHECK_BUTTON (vbox2, checkbtn_passphrase_grab,
2332                            _("Grab input while entering a passphrase"));
2333 #endif
2334
2335         PACK_CHECK_BUTTON
2336                 (vbox2, checkbtn_gpg_warning,
2337                  _("Display warning on startup if GnuPG doesn't work"));
2338
2339         hbox1 = gtk_hbox_new (FALSE, 8);
2340         gtk_widget_show (hbox1);
2341         gtk_box_pack_start (GTK_BOX (vbox1), hbox1, FALSE, FALSE, 0);
2342
2343         privacy.checkbtn_auto_check_signatures
2344                                              = checkbtn_auto_check_signatures;
2345         privacy.checkbtn_gpg_signature_popup
2346                                              = checkbtn_gpg_signature_popup;
2347         privacy.checkbtn_store_passphrase    = checkbtn_store_passphrase;
2348         privacy.spinbtn_store_passphrase     = spinbtn_store_passphrase;
2349         privacy.spinbtn_store_passphrase_adj = spinbtn_store_passphrase_adj;
2350         privacy.checkbtn_passphrase_grab     = checkbtn_passphrase_grab;
2351         privacy.checkbtn_gpg_warning         = checkbtn_gpg_warning;
2352 }
2353 #endif /* USE_GPGME */
2354
2355 static void prefs_interface_create(void)
2356 {
2357         GtkWidget *vbox1;
2358         GtkWidget *vbox2;
2359         GtkWidget *vbox3;
2360         /* GtkWidget *checkbtn_emacs; */
2361         GtkWidget *checkbtn_always_show_msg;
2362         GtkWidget *checkbtn_openunread;
2363         GtkWidget *checkbtn_mark_as_read_on_newwin;
2364         GtkWidget *checkbtn_openinbox;
2365         GtkWidget *checkbtn_immedexec;
2366         GtkWidget *hbox1;
2367         GtkWidget *label;
2368         GtkWidget *menu;
2369         GtkWidget *menuitem;
2370
2371         GtkWidget *button_keybind;
2372
2373         GtkWidget *hbox_nextunreadmsgdialog;
2374         GtkWidget *optmenu_nextunreadmsgdialog;
2375
2376         GtkWidget *frame_pixmap_theme;
2377         GtkWidget *vbox_pixmap_theme;
2378         GtkWidget *entry_pixmap_theme;
2379         GtkWidget *combo_pixmap_theme;
2380         GList *avail_pixmap_themes = NULL;
2381
2382         vbox1 = gtk_vbox_new (FALSE, VSPACING);
2383         gtk_widget_show (vbox1);
2384         gtk_container_add (GTK_CONTAINER (dialog.notebook), vbox1);
2385         gtk_container_set_border_width (GTK_CONTAINER (vbox1), VBOX_BORDER);
2386
2387         vbox2 = gtk_vbox_new (FALSE, 0);
2388         gtk_widget_show (vbox2);
2389         gtk_box_pack_start (GTK_BOX (vbox1), vbox2, FALSE, FALSE, 0);
2390
2391         /* PACK_CHECK_BUTTON (vbox2, checkbtn_emacs,
2392                            _("Emulate the behavior of mouse operation of\n"
2393                              "Emacs-based mailer"));
2394         gtk_label_set_justify (GTK_LABEL (GTK_BIN (checkbtn_emacs)->child),
2395                                GTK_JUSTIFY_LEFT);   */
2396
2397         PACK_CHECK_BUTTON
2398                 (vbox2, checkbtn_always_show_msg,
2399                  _("Always open messages in summary when selected"));
2400
2401         PACK_CHECK_BUTTON
2402                 (vbox2, checkbtn_openunread,
2403                  _("Open first unread message when entering a folder"));
2404
2405         PACK_CHECK_BUTTON
2406                 (vbox2, checkbtn_mark_as_read_on_newwin,
2407                  _("Only mark message as read when opened in new window"));
2408
2409         PACK_CHECK_BUTTON
2410                 (vbox2, checkbtn_openinbox,
2411                  _("Go to inbox after receiving new mail"));
2412
2413         vbox3 = gtk_vbox_new (FALSE, 0);
2414         gtk_widget_show (vbox3);
2415         gtk_box_pack_start (GTK_BOX (vbox2), vbox3, FALSE, FALSE, 0);
2416
2417         PACK_CHECK_BUTTON
2418                 (vbox3, checkbtn_immedexec,
2419                  _("Execute immediately when moving or deleting messages"));
2420
2421         hbox1 = gtk_hbox_new (FALSE, 0);
2422         gtk_widget_show (hbox1);
2423         gtk_box_pack_start (GTK_BOX (vbox3), hbox1, FALSE, FALSE, 0);
2424
2425         label = gtk_label_new
2426                 (_("(Messages will be marked until execution\n"
2427                    " if this is turned off)"));
2428         gtk_widget_show (label);
2429         gtk_box_pack_start (GTK_BOX (hbox1), label, FALSE, FALSE, 8);
2430         gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT);
2431
2432         /* Next Unread Message Dialog */
2433         hbox_nextunreadmsgdialog = gtk_hbox_new (FALSE, 8);
2434         gtk_widget_show (hbox1);
2435         gtk_box_pack_start (GTK_BOX (vbox1), hbox_nextunreadmsgdialog, FALSE, FALSE, 0);
2436
2437         label = gtk_label_new (_("Show no-unread-message dialog"));
2438         gtk_widget_show (label);
2439         gtk_box_pack_start (GTK_BOX (hbox_nextunreadmsgdialog), label, FALSE, FALSE, 8);
2440
2441         optmenu_nextunreadmsgdialog = gtk_option_menu_new ();
2442         gtk_widget_show (optmenu_nextunreadmsgdialog);
2443         gtk_box_pack_start (GTK_BOX (hbox_nextunreadmsgdialog), optmenu_nextunreadmsgdialog, FALSE, FALSE, 8);
2444         
2445         menu = gtk_menu_new ();
2446         MENUITEM_ADD (menu, menuitem, _("Always"), NEXTUNREADMSGDIALOG_ALWAYS);
2447         MENUITEM_ADD (menu, menuitem, _("Assume 'Yes'"), 
2448                       NEXTUNREADMSGDIALOG_ASSUME_YES);
2449         MENUITEM_ADD (menu, menuitem, _("Assume 'No'"), 
2450                       NEXTUNREADMSGDIALOG_ASSUME_NO);
2451
2452         gtk_option_menu_set_menu (GTK_OPTION_MENU (optmenu_nextunreadmsgdialog), menu);
2453
2454         hbox1 = gtk_hbox_new (FALSE, 8);
2455         gtk_widget_show (hbox1);
2456         gtk_box_pack_start (GTK_BOX (vbox1), hbox1, FALSE, FALSE, 0);
2457
2458         button_keybind = gtk_button_new_with_label (_(" Set key bindings... "));
2459         gtk_widget_show (button_keybind);
2460         gtk_box_pack_start (GTK_BOX (hbox1), button_keybind, FALSE, FALSE, 0);
2461         gtk_signal_connect (GTK_OBJECT (button_keybind), "clicked",
2462                             GTK_SIGNAL_FUNC (prefs_keybind_select), NULL);
2463
2464         PACK_FRAME(vbox1, frame_pixmap_theme, _("Icon theme"));
2465         
2466         vbox_pixmap_theme = gtk_vbox_new(FALSE, 0);
2467         gtk_widget_show(vbox_pixmap_theme);
2468         gtk_container_add(GTK_CONTAINER(frame_pixmap_theme), vbox_pixmap_theme);
2469         gtk_container_set_border_width(GTK_CONTAINER(vbox_pixmap_theme), 8);
2470  
2471         avail_pixmap_themes = stock_pixmap_themes_list_new(); 
2472  
2473         combo_pixmap_theme = gtk_combo_new ();
2474         gtk_widget_show (combo_pixmap_theme);
2475         gtk_box_pack_start (GTK_BOX (vbox_pixmap_theme), combo_pixmap_theme, TRUE, TRUE, 0);
2476         gtk_combo_set_popdown_strings(GTK_COMBO(combo_pixmap_theme), avail_pixmap_themes);
2477         entry_pixmap_theme = GTK_COMBO (combo_pixmap_theme)->entry;
2478
2479         stock_pixmap_themes_list_free(avail_pixmap_themes);
2480
2481         /* interface.checkbtn_emacs          = checkbtn_emacs; */
2482         interface.checkbtn_always_show_msg    = checkbtn_always_show_msg;
2483         interface.checkbtn_openunread         = checkbtn_openunread;
2484         interface.checkbtn_mark_as_read_on_newwin
2485                                               = checkbtn_mark_as_read_on_newwin;
2486         interface.checkbtn_openinbox          = checkbtn_openinbox;
2487         interface.checkbtn_immedexec          = checkbtn_immedexec;
2488         interface.optmenu_nextunreadmsgdialog = optmenu_nextunreadmsgdialog;
2489         interface.combo_pixmap_theme          = combo_pixmap_theme;
2490         interface.entry_pixmap_theme          = entry_pixmap_theme;
2491 }
2492
2493 static void prefs_other_create(void)
2494 {
2495         GtkWidget *vbox1;
2496         GtkWidget *ext_frame;
2497         GtkWidget *ext_table;
2498         GtkWidget *hbox1;
2499
2500         GtkWidget *uri_label;
2501         GtkWidget *uri_combo;
2502         GtkWidget *uri_entry;
2503
2504         GtkWidget *printcmd_label;
2505         GtkWidget *printcmd_entry;
2506
2507         GtkWidget *exteditor_label;
2508         GtkWidget *exteditor_combo;
2509         GtkWidget *exteditor_entry;
2510
2511         GtkWidget *frame_addr;
2512         GtkWidget *vbox_addr;
2513         GtkWidget *checkbtn_addaddrbyclick;
2514         
2515         GtkWidget *frame_cliplog;
2516         GtkWidget *vbox_cliplog;
2517         GtkWidget *hbox_cliplog;
2518         GtkWidget *checkbtn_cliplog;
2519         GtkWidget *loglength_label;
2520         GtkWidget *loglength_entry;
2521
2522         GtkWidget *frame_exit;
2523         GtkWidget *vbox_exit;
2524         GtkWidget *checkbtn_confonexit;
2525         GtkWidget *checkbtn_cleanonexit;
2526         GtkWidget *checkbtn_askonclean;
2527         GtkWidget *checkbtn_warnqueued;
2528
2529         GtkWidget *label_iotimeout;
2530         GtkWidget *spinbtn_iotimeout;
2531         GtkObject *spinbtn_iotimeout_adj;
2532
2533 #if 0
2534 #ifdef USE_OPENSSL
2535         GtkWidget *frame_ssl;
2536         GtkWidget *vbox_ssl;
2537         GtkWidget *hbox_ssl;
2538         GtkWidget *checkbtn_ssl_ask_unknown_valid;
2539 #endif
2540 #endif
2541         vbox1 = gtk_vbox_new (FALSE, VSPACING);
2542         gtk_widget_show (vbox1);
2543         gtk_container_add (GTK_CONTAINER (dialog.notebook), vbox1);
2544         gtk_container_set_border_width (GTK_CONTAINER (vbox1), VBOX_BORDER);
2545
2546         PACK_FRAME(vbox1, ext_frame,
2547                    _("External commands (%s will be replaced with file name / URI)"));
2548
2549         ext_table = gtk_table_new (3, 2, FALSE);
2550         gtk_widget_show (ext_table);
2551         gtk_container_add (GTK_CONTAINER (ext_frame), ext_table);
2552         gtk_container_set_border_width (GTK_CONTAINER (ext_table), 8);
2553         gtk_table_set_row_spacings (GTK_TABLE (ext_table), VSPACING_NARROW);
2554         gtk_table_set_col_spacings (GTK_TABLE (ext_table), 8);
2555
2556         uri_label = gtk_label_new (_("Web browser"));
2557         gtk_widget_show(uri_label);
2558         gtk_table_attach (GTK_TABLE (ext_table), uri_label, 0, 1, 0, 1,
2559                           GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
2560         gtk_misc_set_alignment (GTK_MISC (uri_label), 1, 0.5);
2561
2562         uri_combo = gtk_combo_new ();
2563         gtk_widget_show (uri_combo);
2564         gtk_table_attach (GTK_TABLE (ext_table), uri_combo, 1, 2, 0, 1,
2565                           GTK_EXPAND | GTK_FILL, 0, 0, 0);
2566         gtkut_combo_set_items (GTK_COMBO (uri_combo),
2567                                DEFAULT_BROWSER_CMD,
2568                                "galeon --new-tab '%s'",
2569                                "galeon '%s'",
2570                                "mozilla -remote 'openurl(%s,new-window)'",
2571                                "netscape -remote 'openURL(%s, new-window)'",
2572                                "netscape '%s'",
2573                                "gnome-moz-remote --newwin '%s'",
2574                                "kfmclient openURL '%s'",
2575                                "opera -newwindow '%s'",
2576                                "kterm -e w3m '%s'",
2577                                "kterm -e lynx '%s'",
2578                                NULL);
2579         uri_entry = GTK_COMBO (uri_combo)->entry;
2580
2581         printcmd_label = gtk_label_new (_("Print"));
2582         gtk_widget_show (printcmd_label);
2583         gtk_table_attach (GTK_TABLE (ext_table), printcmd_label, 0, 1, 1, 2,
2584                           GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
2585         gtk_misc_set_alignment (GTK_MISC (printcmd_label), 1, 0.5);
2586
2587         printcmd_entry = gtk_entry_new ();
2588         gtk_widget_show (printcmd_entry);
2589         gtk_table_attach (GTK_TABLE (ext_table), printcmd_entry, 1, 2, 1, 2,
2590                           GTK_EXPAND | GTK_FILL, 0, 0, 0);
2591
2592         exteditor_label = gtk_label_new (_("Editor"));
2593         gtk_widget_show (exteditor_label);
2594         gtk_table_attach (GTK_TABLE (ext_table), exteditor_label, 0, 1, 2, 3,
2595                           GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0);
2596         gtk_misc_set_alignment (GTK_MISC (exteditor_label), 1, 0.5);
2597
2598         exteditor_combo = gtk_combo_new ();
2599         gtk_widget_show (exteditor_combo);
2600         gtk_table_attach (GTK_TABLE (ext_table), exteditor_combo, 1, 2, 2, 3,
2601                           GTK_EXPAND | GTK_FILL, 0, 0, 0);
2602         gtkut_combo_set_items (GTK_COMBO (exteditor_combo),
2603                                "gedit %s",
2604                                "kedit %s",
2605                                "mgedit --no-fork %s",
2606                                "emacs %s",
2607                                "xemacs %s",
2608                                "kterm -e jed %s",
2609                                "kterm -e vi %s",
2610                                NULL);
2611         exteditor_entry = GTK_COMBO (exteditor_combo)->entry;
2612
2613         PACK_FRAME (vbox1, frame_addr, _("Address book"));
2614
2615         vbox_addr = gtk_vbox_new (FALSE, 0);
2616         gtk_widget_show (vbox_addr);
2617         gtk_container_add (GTK_CONTAINER (frame_addr), vbox_addr);
2618         gtk_container_set_border_width (GTK_CONTAINER (vbox_addr), 8);
2619
2620         PACK_CHECK_BUTTON
2621                 (vbox_addr, checkbtn_addaddrbyclick,
2622                  _("Add address to destination when double-clicked"));
2623
2624         /* Clip Log */
2625         PACK_FRAME (vbox1, frame_cliplog, _("Log Size"));
2626
2627         vbox_cliplog = gtk_vbox_new (FALSE, 0);
2628         gtk_widget_show (vbox_cliplog);
2629         gtk_container_add (GTK_CONTAINER (frame_cliplog), vbox_cliplog);
2630         gtk_container_set_border_width (GTK_CONTAINER (vbox_cliplog), 8);
2631         PACK_CHECK_BUTTON (vbox_cliplog, checkbtn_cliplog,
2632                            _("Clip the log size"));
2633         hbox_cliplog = gtk_hbox_new (FALSE, 3);
2634         gtk_container_add (GTK_CONTAINER (vbox_cliplog), hbox_cliplog);
2635         gtk_widget_show (hbox_cliplog);
2636         
2637         loglength_label = gtk_label_new (_("Log window length"));
2638         gtk_box_pack_start (GTK_BOX (hbox_cliplog), loglength_label,
2639                             FALSE, TRUE, 0);
2640         gtk_widget_show (GTK_WIDGET (loglength_label));
2641         loglength_entry = gtk_entry_new ();
2642         gtk_widget_set_usize (GTK_WIDGET (loglength_entry), 64, -1);
2643         gtk_box_pack_start (GTK_BOX (hbox_cliplog), loglength_entry,
2644                             FALSE, TRUE, 0);
2645         gtk_widget_show (GTK_WIDGET (loglength_entry));
2646         loglength_label = gtk_label_new (_("(0 to stop logging in the log window)"));
2647         gtk_box_pack_start (GTK_BOX (hbox_cliplog), loglength_label,
2648                             FALSE, TRUE, 0);
2649         SET_TOGGLE_SENSITIVITY(checkbtn_cliplog, loglength_entry);
2650
2651 #if 0
2652 #ifdef USE_OPENSSL
2653         /* SSL */
2654         PACK_FRAME (vbox1, frame_ssl, _("Security"));
2655
2656         vbox_ssl = gtk_vbox_new (FALSE, 0);
2657         gtk_widget_show (vbox_ssl);
2658         gtk_container_add (GTK_CONTAINER (frame_ssl), vbox_ssl);
2659         gtk_container_set_border_width (GTK_CONTAINER (vbox_ssl), 8);
2660         PACK_CHECK_BUTTON (vbox_ssl, checkbtn_ssl_ask_unknown_valid, 
2661                            _("Ask before accepting SSL certificates"));
2662         hbox_ssl = gtk_hbox_new (FALSE, 3);
2663         gtk_container_add (GTK_CONTAINER (vbox_ssl), hbox_ssl);
2664         gtk_widget_show (hbox_ssl);
2665 #endif
2666 #endif
2667         
2668         /* On Exit */
2669         PACK_FRAME (vbox1, frame_exit, _("On exit"));
2670
2671         vbox_exit = gtk_vbox_new (FALSE, 0);
2672         gtk_widget_show (vbox_exit);
2673         gtk_container_add (GTK_CONTAINER (frame_exit), vbox_exit);
2674         gtk_container_set_border_width (GTK_CONTAINER (vbox_exit), 8);
2675
2676         PACK_CHECK_BUTTON (vbox_exit, checkbtn_confonexit,
2677                            _("Confirm on exit"));
2678
2679         hbox1 = gtk_hbox_new (FALSE, 32);
2680         gtk_widget_show (hbox1);
2681         gtk_box_pack_start (GTK_BOX (vbox_exit), hbox1, FALSE, FALSE, 0);
2682
2683         PACK_CHECK_BUTTON (hbox1, checkbtn_cleanonexit,
2684                            _("Empty trash on exit"));
2685         PACK_CHECK_BUTTON (hbox1, checkbtn_askonclean,
2686                            _("Ask before emptying"));
2687         SET_TOGGLE_SENSITIVITY (checkbtn_cleanonexit, checkbtn_askonclean);
2688
2689         PACK_CHECK_BUTTON (vbox_exit, checkbtn_warnqueued,
2690                            _("Warn if there are queued messages"));
2691
2692         hbox1 = gtk_hbox_new (FALSE, 8);
2693         gtk_widget_show (hbox1);
2694         gtk_box_pack_start (GTK_BOX (vbox1), hbox1, FALSE, FALSE, 0);
2695
2696         label_iotimeout = gtk_label_new (_("Socket I/O timeout:"));
2697         gtk_widget_show (label_iotimeout);
2698         gtk_box_pack_start (GTK_BOX (hbox1), label_iotimeout, FALSE, FALSE, 0);
2699
2700         spinbtn_iotimeout_adj = gtk_adjustment_new (60, 0, 1000, 1, 10, 10);
2701         spinbtn_iotimeout = gtk_spin_button_new
2702                 (GTK_ADJUSTMENT (spinbtn_iotimeout_adj), 1, 0);
2703         gtk_widget_show (spinbtn_iotimeout);
2704         gtk_box_pack_start (GTK_BOX (hbox1), spinbtn_iotimeout,
2705                             FALSE, FALSE, 0);
2706         gtk_widget_set_usize (spinbtn_iotimeout, 64, -1);
2707         gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (spinbtn_iotimeout), TRUE);
2708
2709         label_iotimeout = gtk_label_new (_("second(s)"));
2710         gtk_widget_show (label_iotimeout);
2711         gtk_box_pack_start (GTK_BOX (hbox1), label_iotimeout, FALSE, FALSE, 0);
2712
2713         other.uri_combo = uri_combo;
2714         other.uri_entry = uri_entry;
2715         other.printcmd_entry = printcmd_entry;
2716
2717         other.exteditor_combo = exteditor_combo;
2718         other.exteditor_entry = exteditor_entry;
2719
2720         other.checkbtn_addaddrbyclick = checkbtn_addaddrbyclick;
2721         
2722         other.checkbtn_cliplog     = checkbtn_cliplog;
2723         other.loglength_entry      = loglength_entry;
2724
2725         other.checkbtn_confonexit  = checkbtn_confonexit;
2726         other.checkbtn_cleanonexit = checkbtn_cleanonexit;
2727         other.checkbtn_askonclean  = checkbtn_askonclean;
2728         other.checkbtn_warnqueued  = checkbtn_warnqueued;
2729
2730         other.spinbtn_iotimeout     = spinbtn_iotimeout;
2731         other.spinbtn_iotimeout_adj = spinbtn_iotimeout_adj;
2732         
2733 #if 0
2734 #ifdef USE_OPENSSL
2735         other.checkbtn_ssl_ask_unknown_valid = checkbtn_ssl_ask_unknown_valid;
2736 #endif
2737 #endif
2738 }
2739
2740 static void date_format_ok_btn_clicked(GtkButton *button, GtkWidget **widget)
2741 {
2742         GtkWidget *datefmt_sample = NULL;
2743         gchar *text;
2744
2745         g_return_if_fail(widget != NULL);
2746         g_return_if_fail(*widget != NULL);
2747         g_return_if_fail(display.entry_datefmt != NULL);
2748
2749         datefmt_sample = GTK_WIDGET(gtk_object_get_data
2750                                     (GTK_OBJECT(*widget), "datefmt_sample"));
2751         g_return_if_fail(datefmt_sample != NULL);
2752
2753         text = gtk_editable_get_chars(GTK_EDITABLE(datefmt_sample), 0, -1);
2754         g_free(prefs_common.date_format);
2755         prefs_common.date_format = text;
2756         gtk_entry_set_text(GTK_ENTRY(display.entry_datefmt), text);
2757
2758         gtk_widget_destroy(*widget);
2759         *widget = NULL;
2760 }
2761
2762 static void date_format_cancel_btn_clicked(GtkButton *button,
2763                                            GtkWidget **widget)
2764 {
2765         g_return_if_fail(widget != NULL);
2766         g_return_if_fail(*widget != NULL);
2767
2768         gtk_widget_destroy(*widget);
2769         *widget = NULL;
2770 }
2771
2772 static void date_format_key_pressed(GtkWidget *keywidget, GdkEventKey *event,
2773                                     GtkWidget **widget)
2774 {
2775         if (event && event->keyval == GDK_Escape)
2776                 date_format_cancel_btn_clicked(NULL, widget);
2777 }
2778
2779 static gboolean date_format_on_delete(GtkWidget *dialogwidget,
2780                                       GdkEventAny *event, GtkWidget **widget)
2781 {
2782         g_return_val_if_fail(widget != NULL, FALSE);
2783         g_return_val_if_fail(*widget != NULL, FALSE);
2784
2785         *widget = NULL;
2786         return FALSE;
2787 }
2788
2789 static void date_format_entry_on_change(GtkEditable *editable,
2790                                         GtkLabel *example)
2791 {
2792         time_t cur_time;
2793         struct tm *cal_time;
2794         gchar buffer[100];
2795         gchar *text;
2796
2797         cur_time = time(NULL);
2798         cal_time = localtime(&cur_time);
2799         buffer[0] = 0;
2800         text = gtk_editable_get_chars(editable, 0, -1);
2801         if (text)
2802                 strftime(buffer, sizeof buffer, text, cal_time); 
2803         g_free(text);
2804         gtk_label_set_text(example, buffer);
2805 }
2806
2807 static void date_format_select_row(GtkWidget *date_format_list, gint row,
2808                                    gint column, GdkEventButton *event,
2809                                    GtkWidget *date_format)
2810 {
2811         gint cur_pos;
2812         gchar *format;
2813         gchar *old_format;
2814         gchar *new_format;
2815         GtkWidget *datefmt_sample;
2816
2817         /* only on double click */
2818         if (!event || event->type != GDK_2BUTTON_PRESS) return;
2819
2820
2821         datefmt_sample = GTK_WIDGET(gtk_object_get_data
2822                                     (GTK_OBJECT(date_format), "datefmt_sample"));
2823
2824         g_return_if_fail(date_format_list != NULL);
2825         g_return_if_fail(date_format != NULL);
2826         g_return_if_fail(datefmt_sample != NULL);
2827
2828         /* get format from clist */
2829         gtk_clist_get_text(GTK_CLIST(date_format_list), row, 0, &format);
2830
2831         cur_pos = gtk_editable_get_position(GTK_EDITABLE(datefmt_sample));
2832         old_format = gtk_entry_get_text(GTK_ENTRY(datefmt_sample));
2833
2834         /* insert the format into the text entry */
2835         new_format = g_malloc(strlen(old_format) + 3);
2836
2837         strncpy(new_format, old_format, cur_pos);
2838         new_format[cur_pos] = '\0';
2839         strcat(new_format, format);
2840         strcat(new_format, &old_format[cur_pos]);
2841
2842         gtk_entry_set_text(GTK_ENTRY(datefmt_sample), new_format);
2843         gtk_editable_set_position(GTK_EDITABLE(datefmt_sample), cur_pos + 2);
2844
2845         g_free(new_format);
2846 }
2847
2848 static GtkWidget *date_format_create(GtkButton *button, void *data)
2849 {
2850         static GtkWidget *datefmt_win = NULL;
2851         GtkWidget *vbox1;
2852         GtkWidget *scrolledwindow1;
2853         GtkWidget *datefmt_clist;
2854         GtkWidget *table;
2855         GtkWidget *label1;
2856         GtkWidget *label2;
2857         GtkWidget *label3;
2858         GtkWidget *confirm_area;
2859         GtkWidget *ok_btn;
2860         GtkWidget *cancel_btn;
2861         GtkWidget *datefmt_entry;
2862
2863         struct {
2864                 gchar *fmt;
2865                 gchar *txt;
2866         } time_format[] = {
2867                 { "%a", NULL },
2868                 { "%A", NULL },
2869                 { "%b", NULL },
2870                 { "%B", NULL },
2871                 { "%c", NULL },
2872                 { "%C", NULL },
2873                 { "%d", NULL },
2874                 { "%H", NULL },
2875                 { "%I", NULL },
2876                 { "%j", NULL },
2877                 { "%m", NULL },
2878                 { "%M", NULL },
2879                 { "%p", NULL },
2880                 { "%S", NULL },
2881                 { "%w", NULL },
2882                 { "%x", NULL },
2883                 { "%y", NULL },
2884                 { "%Y", NULL },
2885                 { "%Z", NULL }
2886         };
2887
2888         gchar *titles[2];
2889         gint i;
2890         const gint TIME_FORMAT_ELEMS =
2891                 sizeof time_format / sizeof time_format[0];
2892
2893         time_format[0].txt  = _("the full abbreviated weekday name");
2894         time_format[1].txt  = _("the full weekday name");
2895         time_format[2].txt  = _("the abbreviated month name");
2896         time_format[3].txt  = _("the full month name");
2897         time_format[4].txt  = _("the preferred date and time for the current locale");
2898         time_format[5].txt  = _("the century number (year/100)");
2899         time_format[6].txt  = _("the day of the month as a decimal number");
2900         time_format[7].txt  = _("the hour as a decimal number using a 24-hour clock");
2901         time_format[8].txt  = _("the hour as a decimal number using a 12-hour clock");
2902         time_format[9].txt  = _("the day of the year as a decimal number");
2903         time_format[10].txt = _("the month as a decimal number");
2904         time_format[11].txt = _("the minute as a decimal number");
2905         time_format[12].txt = _("either AM or PM");
2906         time_format[13].txt = _("the second as a decimal number");
2907         time_format[14].txt = _("the day of the week as a decimal number");
2908         time_format[15].txt = _("the preferred date for the current locale");
2909         time_format[16].txt = _("the last two digits of a year");
2910         time_format[17].txt = _("the year as a decimal number");
2911         time_format[18].txt = _("the time zone or name or abbreviation");
2912
2913         if (datefmt_win) return datefmt_win;
2914
2915         datefmt_win = gtk_window_new(GTK_WINDOW_DIALOG);
2916         gtk_container_set_border_width(GTK_CONTAINER(datefmt_win), 8);
2917         gtk_window_set_title(GTK_WINDOW(datefmt_win), _("Date format"));
2918         gtk_window_set_position(GTK_WINDOW(datefmt_win), GTK_WIN_POS_CENTER);
2919         gtk_widget_set_usize(datefmt_win, 440, 280);
2920
2921         vbox1 = gtk_vbox_new(FALSE, 10);
2922         gtk_widget_show(vbox1);
2923         gtk_container_add(GTK_CONTAINER(datefmt_win), vbox1);
2924
2925         scrolledwindow1 = gtk_scrolled_window_new(NULL, NULL);
2926         gtk_scrolled_window_set_policy
2927                 (GTK_SCROLLED_WINDOW(scrolledwindow1),
2928                  GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
2929         gtk_widget_show(scrolledwindow1);
2930         gtk_box_pack_start(GTK_BOX(vbox1), scrolledwindow1, TRUE, TRUE, 0);
2931
2932         titles[0] = _("Specifier");
2933         titles[1] = _("Description");
2934         datefmt_clist = gtk_clist_new_with_titles(2, titles);
2935         gtk_widget_show(datefmt_clist);
2936         gtk_container_add(GTK_CONTAINER(scrolledwindow1), datefmt_clist);
2937         /* gtk_clist_set_column_width(GTK_CLIST(datefmt_clist), 0, 80); */
2938         gtk_clist_set_selection_mode(GTK_CLIST(datefmt_clist),
2939                                      GTK_SELECTION_BROWSE);
2940
2941         for (i = 0; i < TIME_FORMAT_ELEMS; i++) {
2942                 gchar *text[2];
2943                 /* phoney casting necessary because of gtk... */
2944                 text[0] = (gchar *)time_format[i].fmt;
2945                 text[1] = (gchar *)time_format[i].txt;
2946                 gtk_clist_append(GTK_CLIST(datefmt_clist), text);
2947         }
2948
2949         table = gtk_table_new(2, 2, FALSE);
2950         gtk_widget_show(table);
2951         gtk_box_pack_start(GTK_BOX(vbox1), table, FALSE, FALSE, 0);
2952         gtk_table_set_row_spacings(GTK_TABLE(table), 4);
2953         gtk_table_set_col_spacings(GTK_TABLE(table), 8);
2954
2955         label1 = gtk_label_new(_("Date format"));
2956         gtk_widget_show(label1);
2957         gtk_table_attach(GTK_TABLE(table), label1, 0, 1, 0, 1,
2958                          GTK_FILL, 0, 0, 0);
2959         gtk_label_set_justify(GTK_LABEL(label1), GTK_JUSTIFY_LEFT);
2960         gtk_misc_set_alignment(GTK_MISC(label1), 0, 0.5);
2961
2962         datefmt_entry = gtk_entry_new_with_max_length(256);
2963         gtk_widget_show(datefmt_entry);
2964         gtk_table_attach(GTK_TABLE(table), datefmt_entry, 1, 2, 0, 1,
2965                          (GTK_EXPAND | GTK_FILL), 0, 0, 0);
2966
2967         /* we need the "sample" entry box; add it as data so callbacks can
2968          * get the entry box */
2969         gtk_object_set_data(GTK_OBJECT(datefmt_win), "datefmt_sample",
2970                             datefmt_entry);
2971
2972         label2 = gtk_label_new(_("Example"));
2973         gtk_widget_show(label2);
2974         gtk_table_attach(GTK_TABLE(table), label2, 0, 1, 1, 2,
2975                          GTK_FILL, 0, 0, 0);
2976         gtk_label_set_justify(GTK_LABEL(label2), GTK_JUSTIFY_LEFT);
2977         gtk_misc_set_alignment(GTK_MISC(label2), 0, 0.5);
2978
2979         label3 = gtk_label_new("");
2980         gtk_widget_show(label3);
2981         gtk_table_attach(GTK_TABLE(table), label3, 1, 2, 1, 2,
2982                          (GTK_EXPAND | GTK_FILL), 0, 0, 0);
2983         gtk_label_set_justify(GTK_LABEL(label3), GTK_JUSTIFY_LEFT);
2984         gtk_misc_set_alignment(GTK_MISC(label3), 0, 0.5);
2985
2986         gtkut_button_set_create(&confirm_area, &ok_btn, _("OK"),
2987                                 &cancel_btn, _("Cancel"), NULL, NULL);
2988         gtk_widget_grab_default(ok_btn);
2989         gtk_widget_show(confirm_area);
2990
2991         gtk_box_pack_start(GTK_BOX(vbox1), confirm_area, FALSE, FALSE, 0);
2992
2993         /* set the current format */
2994         gtk_entry_set_text(GTK_ENTRY(datefmt_entry), prefs_common.date_format);
2995         date_format_entry_on_change(GTK_EDITABLE(datefmt_entry),
2996                                     GTK_LABEL(label3));
2997
2998         gtk_signal_connect(GTK_OBJECT(ok_btn), "clicked",
2999                            GTK_SIGNAL_FUNC(date_format_ok_btn_clicked),
3000                            &datefmt_win);
3001         gtk_signal_connect(GTK_OBJECT(cancel_btn), "clicked",
3002                            GTK_SIGNAL_FUNC(date_format_cancel_btn_clicked),
3003                            &datefmt_win);
3004         gtk_signal_connect(GTK_OBJECT(datefmt_win), "key_press_event",
3005                            GTK_SIGNAL_FUNC(date_format_key_pressed),
3006                            &datefmt_win);
3007         gtk_signal_connect(GTK_OBJECT(datefmt_win), "delete_event",
3008                            GTK_SIGNAL_FUNC(date_format_on_delete),
3009                            &datefmt_win);
3010         gtk_signal_connect(GTK_OBJECT(datefmt_entry), "changed",
3011                            GTK_SIGNAL_FUNC(date_format_entry_on_change),
3012                            label3);
3013
3014         gtk_signal_connect(GTK_OBJECT(datefmt_clist), "select_row",
3015                            GTK_SIGNAL_FUNC(date_format_select_row),
3016                            datefmt_win);
3017
3018         gtk_window_set_position(GTK_WINDOW(datefmt_win), GTK_WIN_POS_CENTER);
3019         gtk_window_set_modal(GTK_WINDOW(datefmt_win), TRUE);
3020
3021         gtk_widget_show(datefmt_win);
3022         manage_window_set_transient(GTK_WINDOW(datefmt_win));
3023
3024         gtk_widget_grab_focus(ok_btn);
3025
3026         return datefmt_win;
3027 }
3028
3029 void prefs_quote_colors_dialog(void)
3030 {
3031         if (!quote_color_win)
3032                 prefs_quote_colors_dialog_create();
3033         gtk_widget_show(quote_color_win);
3034         manage_window_set_transient(GTK_WINDOW(quote_color_win));
3035
3036         gtk_main();
3037         gtk_widget_hide(quote_color_win);
3038
3039         textview_update_message_colors();
3040         main_window_reflect_prefs_all();
3041 }
3042
3043 static void prefs_quote_colors_dialog_create(void)
3044 {
3045         GtkWidget *window;
3046         GtkWidget *vbox;
3047         GtkWidget *table;
3048         GtkWidget *quotelevel1_label;
3049         GtkWidget *quotelevel2_label;
3050         GtkWidget *quotelevel3_label;
3051         GtkWidget *uri_label;
3052         GtkWidget *signature_label;
3053         GtkWidget *tgt_folder_label;
3054         GtkWidget *hbbox;
3055         GtkWidget *ok_btn;
3056         GtkWidget *recycle_colors_btn;
3057         GtkWidget *frame_colors;
3058
3059         window = gtk_window_new(GTK_WINDOW_DIALOG);
3060         gtk_container_set_border_width(GTK_CONTAINER(window), 2);
3061         gtk_window_set_title(GTK_WINDOW(window), _("Set message colors"));
3062         gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);
3063         gtk_window_set_modal(GTK_WINDOW(window), TRUE);
3064         gtk_window_set_policy(GTK_WINDOW(window), FALSE, FALSE, FALSE);
3065
3066         vbox = gtk_vbox_new (FALSE, VSPACING);
3067         gtk_container_add (GTK_CONTAINER (window), vbox);
3068         gtk_container_set_border_width (GTK_CONTAINER (vbox), 8);
3069         PACK_FRAME(vbox, frame_colors, _("Colors"));
3070
3071         table = gtk_table_new (5, 2, FALSE);
3072         gtk_container_add (GTK_CONTAINER (frame_colors), table);
3073         gtk_container_set_border_width (GTK_CONTAINER (table), 8);
3074         gtk_table_set_row_spacings (GTK_TABLE (table), 2);
3075         gtk_table_set_col_spacings (GTK_TABLE (table), 5);
3076
3077
3078         color_buttons.quote_level1_btn = gtk_button_new();
3079         gtk_table_attach (GTK_TABLE (table), color_buttons.quote_level1_btn,
3080                           0, 1, 0, 1, 0, 0, 0, 0);
3081         gtk_widget_set_usize (color_buttons.quote_level1_btn, 40, 30);
3082         gtk_container_set_border_width
3083                 (GTK_CONTAINER (color_buttons.quote_level1_btn), 5);
3084
3085         color_buttons.quote_level2_btn = gtk_button_new();
3086         gtk_table_attach (GTK_TABLE (table), color_buttons.quote_level2_btn,
3087                           0, 1, 1, 2, 0, 0, 0, 0);
3088         gtk_widget_set_usize (color_buttons.quote_level2_btn, 40, 30);
3089         gtk_container_set_border_width (GTK_CONTAINER (color_buttons.quote_level2_btn), 5);
3090
3091         color_buttons.quote_level3_btn = gtk_button_new_with_label ("");
3092         gtk_table_attach (GTK_TABLE (table), color_buttons.quote_level3_btn,
3093                           0, 1, 2, 3, 0, 0, 0, 0);
3094         gtk_widget_set_usize (color_buttons.quote_level3_btn, 40, 30);
3095         gtk_container_set_border_width
3096                 (GTK_CONTAINER (color_buttons.quote_level3_btn), 5);
3097
3098         color_buttons.uri_btn = gtk_button_new_with_label ("");
3099         gtk_table_attach (GTK_TABLE (table), color_buttons.uri_btn,
3100                           0, 1, 3, 4, 0, 0, 0, 0);
3101         gtk_widget_set_usize (color_buttons.uri_btn, 40, 30);
3102         gtk_container_set_border_width (GTK_CONTAINER (color_buttons.uri_btn), 5);
3103
3104         color_buttons.tgt_folder_btn = gtk_button_new_with_label ("");
3105         gtk_table_attach (GTK_TABLE (table), color_buttons.tgt_folder_btn,
3106                           0, 1, 4, 5, 0, 0, 0, 0);
3107         gtk_widget_set_usize (color_buttons.tgt_folder_btn, 40, 30);
3108         gtk_container_set_border_width (GTK_CONTAINER (color_buttons.tgt_folder_btn), 5);
3109
3110         color_buttons.signature_btn = gtk_button_new_with_label ("");
3111         gtk_table_attach (GTK_TABLE (table), color_buttons.signature_btn,
3112                           0, 1, 5, 6, 0, 0, 0, 0);
3113         gtk_widget_set_usize (color_buttons.signature_btn, 40, 30);
3114         gtk_container_set_border_width (GTK_CONTAINER (color_buttons.signature_btn), 5);
3115
3116         quotelevel1_label = gtk_label_new (_("Quoted Text - First Level"));
3117         gtk_table_attach (GTK_TABLE (table), quotelevel1_label, 1, 2, 0, 1,
3118                           (GTK_EXPAND | GTK_FILL), 0, 0, 0);
3119         gtk_label_set_justify (GTK_LABEL (quotelevel1_label), GTK_JUSTIFY_LEFT);
3120         gtk_misc_set_alignment (GTK_MISC (quotelevel1_label), 0, 0.5);
3121
3122         quotelevel2_label = gtk_label_new (_("Quoted Text - Second Level"));
3123         gtk_table_attach (GTK_TABLE (table), quotelevel2_label, 1, 2, 1, 2,
3124                           (GTK_EXPAND | GTK_FILL), 0, 0, 0);
3125         gtk_label_set_justify (GTK_LABEL (quotelevel2_label), GTK_JUSTIFY_LEFT);
3126         gtk_misc_set_alignment (GTK_MISC (quotelevel2_label), 0, 0.5);
3127
3128         quotelevel3_label = gtk_label_new (_("Quoted Text - Third Level"));
3129         gtk_table_attach (GTK_TABLE (table), quotelevel3_label, 1, 2, 2, 3,
3130                           (GTK_EXPAND | GTK_FILL), 0, 0, 0);
3131         gtk_label_set_justify (GTK_LABEL (quotelevel3_label), GTK_JUSTIFY_LEFT);
3132         gtk_misc_set_alignment (GTK_MISC (quotelevel3_label), 0, 0.5);
3133
3134         uri_label = gtk_label_new (_("URI link"));
3135         gtk_table_attach (GTK_TABLE (table), uri_label, 1, 2, 3, 4,
3136                           (GTK_EXPAND | GTK_FILL), 0, 0, 0);
3137         gtk_label_set_justify (GTK_LABEL (uri_label), GTK_JUSTIFY_LEFT);
3138         gtk_misc_set_alignment (GTK_MISC (uri_label), 0, 0.5);
3139
3140         tgt_folder_label = gtk_label_new (_("Target folder"));
3141         gtk_table_attach (GTK_TABLE (table), tgt_folder_label, 1, 2, 4, 5,
3142                           (GTK_EXPAND | GTK_FILL), 0, 0, 0);
3143         gtk_label_set_justify (GTK_LABEL (tgt_folder_label), GTK_JUSTIFY_LEFT);
3144         gtk_misc_set_alignment (GTK_MISC (tgt_folder_label), 0, 0.5);
3145
3146         signature_label = gtk_label_new (_("Signatures"));
3147         gtk_table_attach (GTK_TABLE (table), signature_label, 1, 2, 5, 6,
3148                           (GTK_EXPAND | GTK_FILL), 0, 0, 0);
3149         gtk_label_set_justify (GTK_LABEL (signature_label), GTK_JUSTIFY_LEFT);
3150         gtk_misc_set_alignment (GTK_MISC (signature_label), 0, 0.5);
3151
3152         PACK_CHECK_BUTTON (vbox, recycle_colors_btn,
3153                            _("Recycle quote colors"));
3154
3155         gtkut_button_set_create(&hbbox, &ok_btn, _("OK"),
3156                                 NULL, NULL, NULL, NULL);
3157         gtk_box_pack_end(GTK_BOX(vbox), hbbox, FALSE, FALSE, 0);
3158
3159         gtk_widget_grab_default(ok_btn);
3160         MANAGE_WINDOW_SIGNALS_CONNECT(window);
3161         gtk_signal_connect(GTK_OBJECT(window), "delete_event",
3162                            GTK_SIGNAL_FUNC(gtk_main_quit), NULL);
3163         gtk_signal_connect(GTK_OBJECT(window), "key_press_event",
3164                            GTK_SIGNAL_FUNC(prefs_quote_colors_key_pressed),
3165                            NULL);
3166
3167         gtk_signal_connect(GTK_OBJECT(color_buttons.quote_level1_btn), "clicked",
3168                            GTK_SIGNAL_FUNC(quote_color_set_dialog), "LEVEL1");
3169         gtk_signal_connect(GTK_OBJECT(color_buttons.quote_level2_btn), "clicked",
3170                            GTK_SIGNAL_FUNC(quote_color_set_dialog), "LEVEL2");
3171         gtk_signal_connect(GTK_OBJECT(color_buttons.quote_level3_btn), "clicked",
3172                            GTK_SIGNAL_FUNC(quote_color_set_dialog), "LEVEL3");
3173         gtk_signal_connect(GTK_OBJECT(color_buttons.uri_btn), "clicked",
3174                            GTK_SIGNAL_FUNC(quote_color_set_dialog), "URI");
3175         gtk_signal_connect(GTK_OBJECT(color_buttons.tgt_folder_btn), "clicked",
3176                            GTK_SIGNAL_FUNC(quote_color_set_dialog), "TGTFLD");
3177         gtk_signal_connect(GTK_OBJECT(color_buttons.signature_btn), "clicked",
3178                            GTK_SIGNAL_FUNC(quote_color_set_dialog), "SIGNATURE");
3179         gtk_signal_connect(GTK_OBJECT(recycle_colors_btn), "toggled",
3180                            GTK_SIGNAL_FUNC(prefs_recycle_colors_toggled), NULL);
3181         gtk_signal_connect(GTK_OBJECT(ok_btn), "clicked",
3182                            GTK_SIGNAL_FUNC(gtk_main_quit), NULL);
3183
3184         /* show message button colors and recycle options */
3185         set_button_bg_color(color_buttons.quote_level1_btn,
3186                             prefs_common.quote_level1_col);
3187         set_button_bg_color(color_buttons.quote_level2_btn,
3188                             prefs_common.quote_level2_col);
3189         set_button_bg_color(color_buttons.quote_level3_btn,
3190                             prefs_common.quote_level3_col);
3191         set_button_bg_color(color_buttons.uri_btn,
3192                             prefs_common.uri_col);
3193         set_button_bg_color(color_buttons.tgt_folder_btn,
3194                             prefs_common.tgt_folder_col);
3195         set_button_bg_color(color_buttons.signature_btn,
3196                             prefs_common.signature_col);
3197         gtk_toggle_button_set_active((GtkToggleButton *)recycle_colors_btn,
3198                                      prefs_common.recycle_quote_colors);
3199
3200         gtk_widget_show_all(vbox);
3201         quote_color_win = window;
3202 }
3203
3204 static void prefs_quote_colors_key_pressed(GtkWidget *widget,
3205                                            GdkEventKey *event, gpointer data)
3206 {
3207         if (event && event->keyval == GDK_Escape)
3208                 gtk_main_quit();
3209 }
3210
3211 static void quote_color_set_dialog(GtkWidget *widget, gpointer data)
3212 {
3213         gchar *type = (gchar *)data;
3214         gchar *title = NULL;
3215         gdouble color[4] = {0.0, 0.0, 0.0, 0.0};
3216         gint rgbvalue = 0;
3217         GtkColorSelectionDialog *dialog;
3218
3219         if(g_strcasecmp(type, "LEVEL1") == 0) {
3220                 title = _("Pick color for quotation level 1");
3221                 rgbvalue = prefs_common.quote_level1_col;
3222         } else if(g_strcasecmp(type, "LEVEL2") == 0) {
3223                 title = _("Pick color for quotation level 2");
3224                 rgbvalue = prefs_common.quote_level2_col;
3225         } else if(g_strcasecmp(type, "LEVEL3") == 0) {
3226                 title = _("Pick color for quotation level 3");
3227                 rgbvalue = prefs_common.quote_level3_col;
3228         } else if(g_strcasecmp(type, "URI") == 0) {
3229                 title = _("Pick color for URI");
3230                 rgbvalue = prefs_common.uri_col;
3231         } else if(g_strcasecmp(type, "TGTFLD") == 0) {
3232                 title = _("Pick color for target folder");
3233                 rgbvalue = prefs_common.tgt_folder_col;
3234         } else if(g_strcasecmp(type, "SIGNATURE") == 0) {
3235                 title = _("Pick color for signatures");
3236                 rgbvalue = prefs_common.signature_col;
3237         } else {   /* Should never be called */
3238                 g_warning("Unrecognized datatype '%s' in quote_color_set_dialog\n", type);
3239                 return;
3240         }
3241
3242         color_dialog = gtk_color_selection_dialog_new(title);
3243         gtk_window_set_position(GTK_WINDOW(color_dialog), GTK_WIN_POS_CENTER);
3244         gtk_window_set_modal(GTK_WINDOW(color_dialog), TRUE);
3245         gtk_window_set_policy(GTK_WINDOW(color_dialog), FALSE, FALSE, FALSE);
3246         manage_window_set_transient(GTK_WINDOW(color_dialog));
3247
3248         gtk_signal_connect(GTK_OBJECT(GTK_COLOR_SELECTION_DIALOG(color_dialog)->ok_button),
3249                            "clicked", GTK_SIGNAL_FUNC(quote_colors_set_dialog_ok), data);
3250         gtk_signal_connect(GTK_OBJECT(GTK_COLOR_SELECTION_DIALOG(color_dialog)->cancel_button),
3251                            "clicked", GTK_SIGNAL_FUNC(quote_colors_set_dialog_cancel), data);
3252         gtk_signal_connect(GTK_OBJECT(color_dialog), "key_press_event",
3253                            GTK_SIGNAL_FUNC(quote_colors_set_dialog_key_pressed),
3254                            data);
3255
3256         /* preselect the previous color in the color selection dialog */
3257         color[0] = (gdouble) ((rgbvalue & 0xff0000) >> 16) / 255.0;
3258         color[1] = (gdouble) ((rgbvalue & 0x00ff00) >>  8) / 255.0;
3259         color[2] = (gdouble)  (rgbvalue & 0x0000ff)        / 255.0;
3260         dialog = GTK_COLOR_SELECTION_DIALOG(color_dialog);
3261         gtk_color_selection_set_color
3262                 (GTK_COLOR_SELECTION(dialog->colorsel), color);
3263
3264         gtk_widget_show(color_dialog);
3265 }
3266
3267 static void quote_colors_set_dialog_ok(GtkWidget *widget, gpointer data)
3268 {
3269         GtkColorSelection *colorsel = (GtkColorSelection *)
3270                                                 ((GtkColorSelectionDialog *)color_dialog)->colorsel;
3271         gdouble color[4];
3272         gint red, green, blue, rgbvalue;
3273         gchar *type = (gchar *)data;
3274
3275         gtk_color_selection_get_color(colorsel, color);
3276
3277         red      = (gint) (color[0] * 255.0);
3278         green    = (gint) (color[1] * 255.0);
3279         blue     = (gint) (color[2] * 255.0);
3280         rgbvalue = (gint) ((red * 0x10000) | (green * 0x100) | blue);
3281
3282 #if 0
3283         fprintf(stderr, "redc = %f, greenc = %f, bluec = %f\n", color[0], color[1], color[2]);
3284         fprintf(stderr, "red = %d, green = %d, blue = %d\n", red, green, blue);
3285         fprintf(stderr, "Color is %x\n", rgbvalue);
3286 #endif
3287
3288         if (g_strcasecmp(type, "LEVEL1") == 0) {
3289                 prefs_common.quote_level1_col = rgbvalue;
3290                 set_button_bg_color(color_buttons.quote_level1_btn, rgbvalue);
3291         } else if (g_strcasecmp(type, "LEVEL2") == 0) {
3292                 prefs_common.quote_level2_col = rgbvalue;
3293                 set_button_bg_color(color_buttons.quote_level2_btn, rgbvalue);
3294         } else if (g_strcasecmp(type, "LEVEL3") == 0) {
3295                 prefs_common.quote_level3_col = rgbvalue;
3296                 set_button_bg_color(color_buttons.quote_level3_btn, rgbvalue);
3297         } else if (g_strcasecmp(type, "URI") == 0) {
3298                 prefs_common.uri_col = rgbvalue;
3299                 set_button_bg_color(color_buttons.uri_btn, rgbvalue);
3300         } else if (g_strcasecmp(type, "TGTFLD") == 0) {
3301                 prefs_common.tgt_folder_col = rgbvalue;
3302                 set_button_bg_color(color_buttons.tgt_folder_btn, rgbvalue);
3303                 folderview_set_target_folder_color(prefs_common.tgt_folder_col);
3304         } else if (g_strcasecmp(type, "SIGNATURE") == 0) {
3305                 prefs_common.signature_col = rgbvalue;
3306                 set_button_bg_color(color_buttons.signature_btn, rgbvalue);
3307         } else
3308                 fprintf( stderr, "Unrecognized datatype '%s' in quote_color_set_dialog_ok\n", type );
3309
3310         gtk_widget_destroy(color_dialog);
3311 }
3312
3313 static void quote_colors_set_dialog_cancel(GtkWidget *widget, gpointer data)
3314 {
3315         gtk_widget_destroy(color_dialog);
3316 }
3317
3318 static void quote_colors_set_dialog_key_pressed(GtkWidget *widget,
3319                                                 GdkEventKey *event,
3320                                                 gpointer data)
3321 {
3322         gtk_widget_destroy(color_dialog);
3323 }
3324
3325 static void set_button_bg_color(GtkWidget *widget, gint rgbvalue)
3326 {
3327         GtkStyle *newstyle;
3328         GdkColor color;
3329
3330         gtkut_convert_int_to_gdk_color(rgbvalue, &color);
3331         newstyle = gtk_style_copy(gtk_widget_get_default_style());
3332         newstyle->bg[GTK_STATE_NORMAL]   = color;
3333         newstyle->bg[GTK_STATE_PRELIGHT] = color;
3334         newstyle->bg[GTK_STATE_ACTIVE]   = color;
3335
3336         gtk_widget_set_style(GTK_WIDGET(widget), newstyle);
3337 }
3338
3339 static void prefs_enable_message_color_toggled(void)
3340 {
3341         gboolean is_active;
3342
3343         is_active = gtk_toggle_button_get_active
3344                 (GTK_TOGGLE_BUTTON(message.chkbtn_enablecol));
3345         gtk_widget_set_sensitive(message.button_edit_col, is_active);
3346         prefs_common.enable_color = is_active;
3347 }
3348
3349 static void prefs_recycle_colors_toggled(GtkWidget *widget)
3350 {
3351         gboolean is_active;
3352
3353         is_active = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget));
3354         prefs_common.recycle_quote_colors = is_active;
3355 }
3356
3357 static void prefs_font_select(GtkButton *button, GtkEntry *entry)
3358 {
3359         gchar *font_name;
3360         
3361         g_return_if_fail(entry != NULL);
3362         
3363         if (!font_sel_win) {
3364                 font_sel_win = gtk_font_selection_dialog_new
3365                         (_("Font selection"));
3366                 gtk_window_position(GTK_WINDOW(font_sel_win),
3367                                     GTK_WIN_POS_CENTER);
3368                 gtk_signal_connect(GTK_OBJECT(font_sel_win), "delete_event",
3369                                    GTK_SIGNAL_FUNC(gtk_widget_hide_on_delete),
3370                                    NULL);
3371                 gtk_signal_connect
3372                         (GTK_OBJECT(font_sel_win), "key_press_event",
3373                          GTK_SIGNAL_FUNC(prefs_font_selection_key_pressed),
3374                          NULL);
3375                 gtk_signal_connect_object
3376                         (GTK_OBJECT(GTK_FONT_SELECTION_DIALOG(font_sel_win)->cancel_button),
3377                          "clicked",
3378                          GTK_SIGNAL_FUNC(gtk_widget_hide_on_delete),
3379                          GTK_OBJECT(font_sel_win));
3380         }
3381
3382         if(font_sel_conn_id) {
3383                 gtk_signal_disconnect(GTK_OBJECT(GTK_FONT_SELECTION_DIALOG(font_sel_win)->ok_button), font_sel_conn_id);
3384         }
3385         font_sel_conn_id = gtk_signal_connect
3386                 (GTK_OBJECT(GTK_FONT_SELECTION_DIALOG(font_sel_win)->ok_button),
3387                  "clicked",
3388                  GTK_SIGNAL_FUNC(prefs_font_selection_ok),
3389                  entry);
3390         printf("%i\n", font_sel_conn_id);
3391
3392         font_name = gtk_editable_get_chars(GTK_EDITABLE(entry), 0, -1);
3393         gtk_font_selection_dialog_set_font_name(GTK_FONT_SELECTION_DIALOG(font_sel_win), font_name);
3394         g_free(font_name);
3395         manage_window_set_transient(GTK_WINDOW(font_sel_win));
3396         gtk_window_set_modal(GTK_WINDOW(font_sel_win), TRUE);
3397         gtk_widget_grab_focus
3398                 (GTK_FONT_SELECTION_DIALOG(font_sel_win)->ok_button);
3399         gtk_widget_show(font_sel_win);
3400 }
3401
3402 static void prefs_font_selection_key_pressed(GtkWidget *widget,
3403                                              GdkEventKey *event,
3404                                              gpointer data)
3405 {
3406         if (event && event->keyval == GDK_Escape)
3407                 gtk_widget_hide(font_sel_win);
3408 }
3409
3410 static void prefs_font_selection_ok(GtkButton *button, GtkEntry *entry)
3411 {
3412         gchar *fontname;
3413
3414         fontname = gtk_font_selection_dialog_get_font_name
3415                 (GTK_FONT_SELECTION_DIALOG(font_sel_win));
3416
3417         if (fontname) {
3418                 gtk_entry_set_text(entry, fontname);
3419
3420                 g_free(fontname);
3421         }
3422
3423         gtk_widget_hide(font_sel_win);
3424 }
3425
3426 static void prefs_keybind_select(void)
3427 {
3428         GtkWidget *window;
3429         GtkWidget *vbox1;
3430         GtkWidget *hbox1;
3431         GtkWidget *label;
3432         GtkWidget *combo;
3433         GtkWidget *confirm_area;
3434         GtkWidget *ok_btn;
3435         GtkWidget *cancel_btn;
3436
3437         window = gtk_window_new (GTK_WINDOW_DIALOG);
3438         gtk_container_set_border_width (GTK_CONTAINER (window), 8);
3439         gtk_window_set_title (GTK_WINDOW (window), _("Key bindings"));
3440         gtk_window_set_position (GTK_WINDOW (window), GTK_WIN_POS_CENTER);
3441         gtk_window_set_modal (GTK_WINDOW (window), TRUE);
3442         gtk_window_set_policy (GTK_WINDOW (window), FALSE, FALSE, FALSE);
3443         manage_window_set_transient (GTK_WINDOW (window));
3444
3445         vbox1 = gtk_vbox_new (FALSE, VSPACING);
3446         gtk_container_add (GTK_CONTAINER (window), vbox1);
3447         gtk_container_set_border_width (GTK_CONTAINER (vbox1), 2);
3448
3449         hbox1 = gtk_hbox_new (FALSE, 8);
3450         gtk_box_pack_start (GTK_BOX (vbox1), hbox1, FALSE, FALSE, 0);
3451
3452         label = gtk_label_new
3453                 (_("Select preset:"));
3454         gtk_box_pack_start (GTK_BOX (hbox1), label, FALSE, FALSE, 0);
3455         gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT);
3456
3457         hbox1 = gtk_hbox_new (FALSE, 8);
3458         gtk_box_pack_start (GTK_BOX (vbox1), hbox1, FALSE, FALSE, 0);
3459
3460         combo = gtk_combo_new ();
3461         gtk_box_pack_start (GTK_BOX (hbox1), combo, TRUE, TRUE, 0);
3462         gtkut_combo_set_items (GTK_COMBO (combo),
3463                                _("Default"),
3464                                "Mew / Wanderlust",
3465                                "Mutt",
3466                                _("Old Sylpheed"),
3467                                NULL);
3468         gtk_entry_set_editable (GTK_ENTRY (GTK_COMBO (combo)->entry), FALSE);
3469
3470         hbox1 = gtk_hbox_new (FALSE, 8);
3471         gtk_box_pack_start (GTK_BOX (vbox1), hbox1, FALSE, FALSE, 0);
3472
3473         label = gtk_label_new
3474                 (_("You can also modify each menu shortcut by pressing\n"
3475                    "any key(s) when placing the mouse pointer on the item."));
3476         gtk_box_pack_start (GTK_BOX (hbox1), label, FALSE, FALSE, 0);
3477         gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT);
3478
3479         hbox1 = gtk_hbox_new (FALSE, 8);
3480         gtk_box_pack_start (GTK_BOX (vbox1), hbox1, FALSE, FALSE, 0);
3481
3482         gtkut_button_set_create (&confirm_area, &ok_btn, _("OK"),
3483                                  &cancel_btn, _("Cancel"), NULL, NULL);
3484         gtk_box_pack_end (GTK_BOX (hbox1), confirm_area, FALSE, FALSE, 0);
3485         gtk_widget_grab_default (ok_btn);
3486
3487         MANAGE_WINDOW_SIGNALS_CONNECT(window);
3488         gtk_signal_connect (GTK_OBJECT (window), "delete_event",
3489                             GTK_SIGNAL_FUNC (prefs_keybind_deleted), NULL);
3490         gtk_signal_connect (GTK_OBJECT (window), "key_press_event",
3491                             GTK_SIGNAL_FUNC (prefs_keybind_key_pressed), NULL);
3492         gtk_signal_connect (GTK_OBJECT (ok_btn), "clicked",
3493                             GTK_SIGNAL_FUNC (prefs_keybind_apply_clicked),
3494                             NULL);
3495         gtk_signal_connect (GTK_OBJECT (cancel_btn), "clicked",
3496                             GTK_SIGNAL_FUNC (prefs_keybind_cancel),
3497                             NULL);
3498
3499         gtk_widget_show_all(window);
3500
3501         keybind.window = window;
3502         keybind.combo = combo;
3503 }
3504
3505 static void prefs_keybind_key_pressed(GtkWidget *widget, GdkEventKey *event,
3506                                       gpointer data)
3507 {
3508         if (event && event->keyval == GDK_Escape)
3509                 prefs_keybind_cancel();
3510 }
3511
3512 static gint prefs_keybind_deleted(GtkWidget *widget, GdkEventAny *event,
3513                                   gpointer data)
3514 {
3515         prefs_keybind_cancel();
3516         return TRUE;
3517 }
3518
3519 static void prefs_keybind_cancel(void)
3520 {
3521         gtk_widget_destroy(keybind.window);
3522         keybind.window = NULL;
3523         keybind.combo = NULL;
3524 }
3525
3526 static void prefs_keybind_apply_clicked(GtkWidget *widget)
3527 {
3528         GtkEntry *entry = GTK_ENTRY(GTK_COMBO(keybind.combo)->entry);
3529         gchar *text;
3530         gchar *rc_str;
3531
3532         static gchar *default_menurc =
3533                 "(menu-path \"<Main>/File/Empty trash\" \"\")\n"
3534                 "(menu-path \"<Main>/File/Save as...\" \"<control>S\")\n"
3535                 "(menu-path \"<Main>/File/Print...\" \"\")\n"
3536                 "(menu-path \"<Main>/File/Exit\" \"<control>Q\")\n"
3537
3538                 "(menu-path \"<Main>/Edit/Copy\" \"<control>C\")\n"
3539                 "(menu-path \"<Main>/Edit/Select all\" \"<control>A\")\n"
3540                 "(menu-path \"<Main>/Edit/Find in current message...\" \"<control>F\")\n"
3541                 "(menu-path \"<Main>/Edit/Search folder...\" \"<shift><control>F\")\n"
3542
3543                 "(menu-path \"<Main>/View/Expand Summary View\" \"V\")\n"
3544                 "(menu-path \"<Main>/View/Expand Message View\" \"<shift>V\")\n"
3545                 "(menu-path \"<Main>/View/Thread view\" \"<control>T\")\n"
3546                 "(menu-path \"<Main>/View/Go to/Prev message\" \"P\")\n"
3547                 "(menu-path \"<Main>/View/Go to/Next message\" \"N\")\n"
3548                 "(menu-path \"<Main>/View/Go to/Prev unread message\" \"<shift>P\")\n"
3549                 "(menu-path \"<Main>/View/Go to/Next unread message\" \"<shift>N\")\n"
3550                 "(menu-path \"<Main>/View/Go to/Other folder...\" \"G\")\n"
3551                 "(menu-path \"<Main>/View/Open in new window\" \"<control><alt>N\")\n"
3552                 "(menu-path \"<Main>/View/View source\" \"<control>U\")\n"
3553                 "(menu-path \"<Main>/View/Show all headers\" \"<control>H\")\n"
3554                 "(menu-path \"<Main>/View/Update\" \"<control><alt>U\")\n"
3555
3556                 "(menu-path \"<Main>/Message/Get new mail\" \"<control>I\")\n"
3557                 "(menu-path \"<Main>/Message/Get from all accounts\" \"<shift><control>I\")\n"
3558                 "(menu-path \"<Main>/Message/Compose an email message\" \"<control>M\")\n"
3559                 "(menu-path \"<Main>/Message/Reply\" \"<control>R\")\n"
3560                 "(menu-path \"<Main>/Message/Reply to/all\" \"<shift><control>R\")\n"
3561                 "(menu-path \"<Main>/Message/Reply to/sender\" \"\")\n"
3562                 "(menu-path \"<Main>/Message/Reply to/mailing list\" \"<control>L\")\n"
3563                 "(menu-path \"<Main>/Message/Forward\" \"<control><alt>F\")\n"
3564                 /* "(menu-path \"<Main>/Message/Forward as attachment\" \"\")\n" */
3565                 "(menu-path \"<Main>/Message/Move...\" \"<control>O\")\n"
3566                 "(menu-path \"<Main>/Message/Copy...\" \"<shift><control>O\")\n"
3567                 "(menu-path \"<Main>/Message/Delete\" \"<control>D\")\n"
3568                 "(menu-path \"<Main>/Message/Mark/Mark\" \"<shift>asterisk\")\n"
3569                 "(menu-path \"<Main>/Message/Mark/Unmark\" \"U\")\n"
3570                 "(menu-path \"<Main>/Message/Mark/Mark as unread\" \"<shift>exclam\")\n"
3571                 "(menu-path \"<Main>/Message/Mark/Mark as read\" \"\")\n"
3572
3573                 "(menu-path \"<Main>/Tools/Address book\" \"<shift><control>A\")\n"
3574                 "(menu-path \"<Main>/Tools/Execute\" \"X\")\n"
3575                 "(menu-path \"<Main>/Tools/Log window\" \"<shift><control>L\")\n"
3576
3577                 "(menu-path \"<Compose>/File/Close\" \"<control>W\")\n"
3578                 "(menu-path \"<Compose>/Edit/Select all\" \"<control>A\")\n"
3579                 "(menu-path \"<Compose>/Edit/Advanced/Move a word backward\" \"\")\n"
3580                 "(menu-path \"<Compose>/Edit/Advanced/Move a word forward\" \"\")\n"
3581                 "(menu-path \"<Compose>/Edit/Advanced/Move to beginning of line\" \"\")\n"
3582                 "(menu-path \"<Compose>/Edit/Advanced/Delete a word backward\" \"\")\n"
3583                 "(menu-path \"<Compose>/Edit/Advanced/Delete a word forward\" \"\")";
3584
3585         static gchar *mew_wl_menurc =
3586                 "(menu-path \"<Main>/File/Empty trash\" \"<shift>D\")\n"
3587                 "(menu-path \"<Main>/File/Save as...\" \"Y\")\n"
3588                 "(menu-path \"<Main>/File/Print...\" \"<shift>numbersign\")\n"
3589                 "(menu-path \"<Main>/File/Exit\" \"<shift>Q\")\n"
3590
3591                 "(menu-path \"<Main>/Edit/Copy\" \"<control>C\")\n"
3592                 "(menu-path \"<Main>/Edit/Select all\" \"<control>A\")\n"
3593                 "(menu-path \"<Main>/Edit/Find in current message...\" \"<control>F\")\n"
3594                 "(menu-path \"<Main>/Edit/Search folder...\" \"<control>S\")\n"
3595
3596                 "(menu-path \"<Main>/View/Expand Summary View\" \"\")\n"
3597                 "(menu-path \"<Main>/View/Expand Message View\" \"\")\n"
3598                 "(menu-path \"<Main>/View/Thread view\" \"<shift>T\")\n"
3599                 "(menu-path \"<Main>/View/Go to/Prev message\" \"P\")\n"
3600                 "(menu-path \"<Main>/View/Go to/Next message\" \"N\")\n"
3601                 "(menu-path \"<Main>/View/Go to/Prev unread message\" \"<shift>P\")\n"
3602                 "(menu-path \"<Main>/View/Go to/Next unread message\" \"<shift>N\")\n"
3603                 "(menu-path \"<Main>/View/Go to/Other folder...\" \"G\")\n"
3604                 "(menu-path \"<Main>/View/Open in new window\" \"<control><alt>N\")\n"
3605                 "(menu-path \"<Main>/View/View source\" \"<control>U\")\n"
3606                 "(menu-path \"<Main>/View/Show all headers\" \"<shift>H\")\n"
3607                 "(menu-path \"<Main>/View/Update\" \"<shift>S\")\n"
3608
3609                 "(menu-path \"<Main>/Message/Get new mail\" \"<control>I\")\n"
3610                 "(menu-path \"<Main>/Message/Get from all accounts\" \"<shift><control>I\")\n"
3611                 "(menu-path \"<Main>/Message/Compose an email message\" \"W\")\n"
3612                 "(menu-path \"<Main>/Message/Reply\" \"<control>R\")\n"
3613                 "(menu-path \"<Main>/Message/Reply to/all\" \"<shift>A\")\n"
3614                 "(menu-path \"<Main>/Message/Reply to/sender\" \"\")\n"
3615                 "(menu-path \"<Main>/Message/Reply to/mailing list\" \"<control>L\")\n"
3616                 "(menu-path \"<Main>/Message/Forward\" \"F\")\n"
3617                 /* "(menu-path \"<Main>/Message/Forward as attachment\" \"<shift>F\")\n" */
3618                 "(menu-path \"<Main>/Message/Move...\" \"O\")\n"
3619                 "(menu-path \"<Main>/Message/Copy...\" \"<shift>O\")\n"
3620                 "(menu-path \"<Main>/Message/Delete\" \"D\")\n"
3621                 "(menu-path \"<Main>/Message/Mark/Mark\" \"<shift>asterisk\")\n"
3622                 "(menu-path \"<Main>/Message/Mark/Unmark\" \"U\")\n"
3623                 "(menu-path \"<Main>/Message/Mark/Mark as unread\" \"<shift>exclam\")\n"
3624                 "(menu-path \"<Main>/Message/Mark/Mark as read\" \"<shift>R\")\n"
3625
3626                 "(menu-path \"<Main>/Tools/Address book\" \"<shift><control>A\")\n"
3627                 "(menu-path \"<Main>/Tools/Execute\" \"X\")\n"
3628                 "(menu-path \"<Main>/Tools/Log window\" \"<shift><control>L\")\n"
3629
3630                 "(menu-path \"<Compose>/File/Close\" \"<alt>W\")\n"
3631                 "(menu-path \"<Compose>/Edit/Select all\" \"\")\n"
3632                 "(menu-path \"<Compose>/Edit/Advanced/Move a word backward\" \"<alt>B\")\n"
3633                 "(menu-path \"<Compose>/Edit/Advanced/Move a word forward\" \"<alt>F\")\n"
3634                 "(menu-path \"<Compose>/Edit/Advanced/Move to beginning of line\" \"<control>A\")\n"
3635                 "(menu-path \"<Compose>/Edit/Advanced/Delete a word backward\" \"<control>W\")\n"
3636                 "(menu-path \"<Compose>/Edit/Advanced/Delete a word forward\" \"<alt>D\")";
3637
3638         static gchar *mutt_menurc =
3639                 "(menu-path \"<Main>/File/Empty trash\" \"\")\n"
3640                 "(menu-path \"<Main>/File/Save as...\" \"S\")\n"
3641                 "(menu-path \"<Main>/File/Print...\" \"P\")\n"
3642                 "(menu-path \"<Main>/File/Exit\" \"Q\")\n"
3643
3644                 "(menu-path \"<Main>/Edit/Copy\" \"<control>C\")\n"
3645                 "(menu-path \"<Main>/Edit/Select all\" \"<control>A\")\n"
3646                 "(menu-path \"<Main>/Edit/Find in current message...\" \"<control>F\")\n"
3647                 "(menu-path \"<Main>/Edit/Search messages...\" \"slash\")\n"
3648
3649                 "(menu-path \"<Main>/View/Toggle summary view\" \"V\")\n"
3650                 "(menu-path \"<Main>/View/Thread view\" \"<control>T\")\n"
3651                 "(menu-path \"<Main>/View/Go to/Prev message\" \"\")\n"
3652                 "(menu-path \"<Main>/View/Go to/Next message\" \"\")\n"
3653                 "(menu-path \"<Main>/View/Go to/Prev unread message\" \"\")\n"
3654                 "(menu-path \"<Main>/View/Go to/Next unread message\" \"\")\n"
3655                 "(menu-path \"<Main>/View/Go to/Other folder...\" \"C\")\n"
3656                 "(menu-path \"<Main>/View/Open in new window\" \"<control><alt>N\")\n"
3657                 "(menu-path \"<Main>/View/View source\" \"<control>U\")\n"
3658                 "(menu-path \"<Main>/View/Show all headers\" \"<control>H\")\n"
3659                 "(menu-path \"<Main>/View/Update\" \"<control><alt>U\")\n"
3660
3661                 "(menu-path \"<Main>/Message/Get new mail\" \"<control>I\")\n"
3662                 "(menu-path \"<Main>/Message/Get from all accounts\" \"<shift><control>I\")\n"
3663                 "(menu-path \"<Main>/Message/Compose new message\" \"M\")\n"
3664                 "(menu-path \"<Main>/Message/Reply\" \"R\")\n"
3665                 "(menu-path \"<Main>/Message/Reply to/all\" \"G\")\n"
3666                 "(menu-path \"<Main>/Message/Reply to/sender\" \"\")\n"
3667                 "(menu-path \"<Main>/Message/Reply to/mailing list\" \"<control>L\")\n"
3668                 "(menu-path \"<Main>/Message/Forward\" \"F\")\n"
3669                 "(menu-path \"<Main>/Message/Forward as attachment\" \"\")\n"
3670                 "(menu-path \"<Main>/Message/Move...\" \"<control>O\")\n"
3671                 "(menu-path \"<Main>/Message/Copy...\" \"<shift>C\")\n"
3672                 "(menu-path \"<Main>/Message/Delete\" \"D\")\n"
3673                 "(menu-path \"<Main>/Message/Mark/Mark\" \"<shift>F\")\n"
3674                 "(menu-path \"<Main>/Message/Mark/Unmark\" \"U\")\n"
3675                 "(menu-path \"<Main>/Message/Mark/Mark as unread\" \"<shift>N\")\n"
3676                 "(menu-path \"<Main>/Message/Mark/Mark as read\" \"\")\n"
3677
3678                 "(menu-path \"<Main>/Tools/Address book\" \"<shift><control>A\")\n"
3679                 "(menu-path \"<Main>/Tools/Execute\" \"X\")\n"
3680                 "(menu-path \"<Main>/Tools/Log window\" \"<shift><control>L\")\n"
3681
3682                 "(menu-path \"<Compose>/File/Close\" \"<alt>W\")\n"
3683                 "(menu-path \"<Compose>/Edit/Select all\" \"\")\n"
3684                 "(menu-path \"<Compose>/Edit/Advanced/Move a word backward\" \"<alt>B\")\n"
3685                 "(menu-path \"<Compose>/Edit/Advanced/Move a word forward\" \"<alt>F\")\n"
3686                 "(menu-path \"<Compose>/Edit/Advanced/Move to beginning of line\" \"<control>A\")\n"
3687                 "(menu-path \"<Compose>/Edit/Advanced/Delete a word backward\" \"<control>W\")\n"
3688                 "(menu-path \"<Compose>/Edit/Advanced/Delete a word forward\" \"<alt>D\")";
3689
3690         static gchar *old_sylpheed_menurc =
3691                 "(menu-path \"<Main>/File/Empty trash\" \"\")\n"
3692                 "(menu-path \"<Main>/File/Save as...\" \"\")\n"
3693                 "(menu-path \"<Main>/File/Print...\" \"<alt>P\")\n"
3694                 "(menu-path \"<Main>/File/Exit\" \"<alt>Q\")\n"
3695
3696                 "(menu-path \"<Main>/Edit/Copy\" \"<control>C\")\n"
3697                 "(menu-path \"<Main>/Edit/Select all\" \"<control>A\")\n"
3698                 "(menu-path \"<Main>/Edit/Find in current message...\" \"<control>F\")\n"
3699                 "(menu-path \"<Main>/Edit/Search folder...\" \"<control>S\")\n"
3700
3701                 "(menu-path \"<Main>/View/Expand Summary View\" \"\")\n"
3702                 "(menu-path \"<Main>/View/Expand Message View\" \"\")\n"
3703                 "(menu-path \"<Main>/View/Thread view\" \"<control>T\")\n"
3704                 "(menu-path \"<Main>/View/Go to/Prev message\" \"P\")\n"
3705                 "(menu-path \"<Main>/View/Go to/Next message\" \"N\")\n"
3706                 "(menu-path \"<Main>/View/Go to/Prev unread message\" \"<shift>P\")\n"
3707                 "(menu-path \"<Main>/View/Go to/Next unread message\" \"<shift>N\")\n"
3708                 "(menu-path \"<Main>/View/Go to/Other folder...\" \"<alt>G\")\n"
3709                 "(menu-path \"<Main>/View/Open in new window\" \"<shift><control>N\")\n"
3710                 "(menu-path \"<Main>/View/View source\" \"<control>U\")\n"
3711                 "(menu-path \"<Main>/View/Show all headers\" \"<control>H\")\n"
3712                 "(menu-path \"<Main>/View/Update\" \"<alt>U\")\n"
3713
3714                 "(menu-path \"<Main>/Message/Get new mail\" \"<alt>I\")\n"
3715                 "(menu-path \"<Main>/Message/Get from all accounts\" \"<shift><alt>I\")\n"
3716                 "(menu-path \"<Main>/Message/Compose an email message\" \"<alt>N\")\n"
3717                 "(menu-path \"<Main>/Message/Reply\" \"<alt>R\")\n"
3718                 "(menu-path \"<Main>/Message/Reply to/all\" \"<shift><alt>R\")\n"
3719                 "(menu-path \"<Main>/Message/Reply to/sender\" \"<control><alt>R\")\n"
3720                 "(menu-path \"<Main>/Message/Reply to/mailing list\" \"<control>L\")\n"
3721                 "(menu-path \"<Main>/Message/Forward\" \"<shift><alt>F\")\n"
3722                 /* "(menu-path \"<Main>/Message/Forward as attachment\" \"<shift><control>F\")\n" */
3723                 "(menu-path \"<Main>/Message/Move...\" \"<alt>O\")\n"
3724                 "(menu-path \"<Main>/Message/Copy...\" \"\")\n"
3725                 "(menu-path \"<Main>/Message/Delete\" \"<alt>D\")\n"
3726                 "(menu-path \"<Main>/Message/Mark/Mark\" \"<shift>asterisk\")\n"
3727                 "(menu-path \"<Main>/Message/Mark/Unmark\" \"U\")\n"
3728                 "(menu-path \"<Main>/Message/Mark/Mark as unread\" \"<shift>exclam\")\n"
3729                 "(menu-path \"<Main>/Message/Mark/Mark as read\" \"\")\n"
3730
3731                 "(menu-path \"<Main>/Tools/Address book\" \"<alt>A\")\n"
3732                 "(menu-path \"<Main>/Tools/Execute\" \"<alt>X\")\n"
3733                 "(menu-path \"<Main>/Tools/Log window\" \"<alt>L\")\n"
3734
3735                 "(menu-path \"<Compose>/File/Close\" \"<alt>W\")\n"
3736                 "(menu-path \"<Compose>/Edit/Select all\" \"\")\n"
3737                 "(menu-path \"<Compose>/Edit/Advanced/Move a word backward\" \"<alt>B\")\n"
3738                 "(menu-path \"<Compose>/Edit/Advanced/Move a word forward\" \"<alt>F\")\n"
3739                 "(menu-path \"<Compose>/Edit/Advanced/Move to beginning of line\" \"<control>A\")\n"
3740                 "(menu-path \"<Compose>/Edit/Advanced/Delete a word backward\" \"<control>W\")\n"
3741                 "(menu-path \"<Compose>/Edit/Advanced/Delete a word forward\" \"<alt>D\")";
3742
3743         text = gtk_entry_get_text(entry);
3744
3745         if (!strcmp(text, _("Default")))
3746                 rc_str = default_menurc;
3747         else if (!strcmp(text, "Mew / Wanderlust"))
3748                 rc_str = mew_wl_menurc;
3749         else if (!strcmp(text, "Mutt"))
3750                 rc_str = mutt_menurc;
3751         else if (!strcmp(text, _("Old Sylpheed")))
3752                 rc_str = old_sylpheed_menurc;
3753         else
3754                 return;
3755
3756         menu_factory_clear_rc(rc_str);
3757         gtk_item_factory_parse_rc_string(rc_str);
3758
3759         gtk_widget_destroy(keybind.window);
3760         keybind.window = NULL;
3761         keybind.combo = NULL;
3762 }
3763
3764 static void prefs_common_charset_set_data_from_optmenu(PrefParam *pparam)
3765 {
3766         GtkWidget *menu;
3767         GtkWidget *menuitem;
3768         gchar *charset;
3769
3770         menu = gtk_option_menu_get_menu(GTK_OPTION_MENU(*pparam->widget));
3771         menuitem = gtk_menu_get_active(GTK_MENU(menu));
3772         charset = gtk_object_get_user_data(GTK_OBJECT(menuitem));
3773         g_free(*((gchar **)pparam->data));
3774         *((gchar **)pparam->data) = g_strdup(charset);
3775 }
3776
3777 static void prefs_common_charset_set_optmenu(PrefParam *pparam)
3778 {
3779         GtkOptionMenu *optmenu = GTK_OPTION_MENU(*pparam->widget);
3780         gint index;
3781
3782         g_return_if_fail(optmenu != NULL);
3783         g_return_if_fail(*((gchar **)pparam->data) != NULL);
3784
3785         index = menu_find_option_menu_index(optmenu, *((gchar **)pparam->data),
3786                                             (GCompareFunc)strcmp);
3787         if (index >= 0)
3788                 gtk_option_menu_set_history(optmenu, index);
3789         else {
3790                 gtk_option_menu_set_history(optmenu, 0);
3791                 prefs_common_charset_set_data_from_optmenu(pparam);
3792         }
3793 }
3794
3795 static void prefs_common_encoding_set_data_from_optmenu(PrefParam *pparam)
3796 {
3797         GtkWidget *menu;
3798         GtkWidget *menuitem;
3799
3800         menu = gtk_option_menu_get_menu(GTK_OPTION_MENU(*pparam->widget));
3801         menuitem = gtk_menu_get_active(GTK_MENU(menu));
3802         *((TransferEncodingMethod *)pparam->data) = GPOINTER_TO_INT
3803                 (gtk_object_get_user_data(GTK_OBJECT(menuitem)));
3804 }
3805
3806 static void prefs_common_encoding_set_optmenu(PrefParam *pparam)
3807 {
3808         TransferEncodingMethod method =
3809                 *((TransferEncodingMethod *)pparam->data);
3810         GtkOptionMenu *optmenu = GTK_OPTION_MENU(*pparam->widget);
3811         gint index;
3812
3813         g_return_if_fail(optmenu != NULL);
3814
3815         index = menu_find_option_menu_index(optmenu, GINT_TO_POINTER(method),
3816                                             NULL);
3817         if (index >= 0)
3818                 gtk_option_menu_set_history(optmenu, index);
3819         else {
3820                 gtk_option_menu_set_history(optmenu, 0);
3821                 prefs_common_encoding_set_data_from_optmenu(pparam);
3822         }
3823 }
3824
3825 static void prefs_common_recv_dialog_set_data_from_optmenu(PrefParam *pparam)
3826 {
3827         GtkWidget *menu;
3828         GtkWidget *menuitem;
3829
3830         menu = gtk_option_menu_get_menu(GTK_OPTION_MENU(*pparam->widget));
3831         menuitem = gtk_menu_get_active(GTK_MENU(menu));
3832         *((RecvDialogMode *)pparam->data) = GPOINTER_TO_INT
3833                 (gtk_object_get_user_data(GTK_OBJECT(menuitem)));
3834 }
3835
3836 static void prefs_common_recv_dialog_set_optmenu(PrefParam *pparam)
3837 {
3838         RecvDialogMode mode = *((RecvDialogMode *)pparam->data);
3839         GtkOptionMenu *optmenu = GTK_OPTION_MENU(*pparam->widget);
3840         GtkWidget *menu;
3841         GtkWidget *menuitem;
3842         gint index;
3843
3844         index = menu_find_option_menu_index(optmenu, GINT_TO_POINTER(mode),
3845                                             NULL);
3846         if (index >= 0)
3847                 gtk_option_menu_set_history(optmenu, index);
3848         else {
3849                 gtk_option_menu_set_history(optmenu, 0);
3850                 prefs_common_recv_dialog_set_data_from_optmenu(pparam);
3851         }
3852
3853         menu = gtk_option_menu_get_menu(optmenu);
3854         menuitem = gtk_menu_get_active(GTK_MENU(menu));
3855         gtk_menu_item_activate(GTK_MENU_ITEM(menuitem));
3856 }
3857
3858 static void prefs_common_send_dialog_set_data_from_optmenu(PrefParam *pparam)
3859 {
3860         GtkWidget *menu;
3861         GtkWidget *menuitem;
3862
3863         menu = gtk_option_menu_get_menu(GTK_OPTION_MENU(*pparam->widget));
3864         menuitem = gtk_menu_get_active(GTK_MENU(menu));
3865         *((SendDialogMode *)pparam->data) = GPOINTER_TO_INT
3866                 (gtk_object_get_user_data(GTK_OBJECT(menuitem)));
3867 }
3868
3869 static void prefs_common_send_dialog_set_optmenu(PrefParam *pparam)
3870 {
3871         SendDialogMode mode = *((SendDialogMode *)pparam->data);
3872         GtkOptionMenu *optmenu = GTK_OPTION_MENU(*pparam->widget);
3873         GtkWidget *menu;
3874         GtkWidget *menuitem;
3875
3876         switch (mode) {
3877         case SEND_DIALOG_ALWAYS:
3878                 gtk_option_menu_set_history(optmenu, 0);
3879                 break;
3880         case SEND_DIALOG_NEVER:
3881                 gtk_option_menu_set_history(optmenu, 1);
3882                 break;
3883         default:
3884                 break;
3885         }
3886
3887         menu = gtk_option_menu_get_menu(optmenu);
3888         menuitem = gtk_menu_get_active(GTK_MENU(menu));
3889         gtk_menu_item_activate(GTK_MENU_ITEM(menuitem));
3890 }
3891
3892 static gint prefs_common_deleted(GtkWidget *widget, GdkEventAny *event,
3893                                  gpointer data)
3894 {
3895         prefs_common_cancel();
3896         return TRUE;
3897 }
3898
3899 static void prefs_common_key_pressed(GtkWidget *widget, GdkEventKey *event,
3900                                      gpointer data)
3901 {
3902         if (event && event->keyval == GDK_Escape)
3903                 prefs_common_cancel();
3904 }
3905
3906 static void prefs_common_ok(void)
3907 {
3908         prefs_common_apply();
3909         gtk_widget_hide(dialog.window);
3910
3911         inc_unlock();
3912 }
3913
3914 static void prefs_common_apply(void)
3915 {
3916         gchar *entry_pixmap_theme_str;
3917         gboolean update_pixmap_theme;
3918         gchar *backup_theme_path;
3919         
3920         entry_pixmap_theme_str = gtk_entry_get_text(GTK_ENTRY(interface.entry_pixmap_theme));
3921         if (entry_pixmap_theme_str && 
3922                 (strcmp(prefs_common.pixmap_theme_path, entry_pixmap_theme_str) != 0) )
3923                 update_pixmap_theme = TRUE;
3924         else
3925                 update_pixmap_theme = FALSE;
3926
3927         /*!< FIXME: prefs_set_data_from_dialog() clears and frees all strings, 
3928          * but prefs_common.pixmap_theme_path is stored in the StockPixmapData
3929          * in stock_pixmap.c::pixmaps[].icon_path, and used when reflecting
3930          * the pixmap changes. Work around by saving the old one and freeing 
3931          * it later. */
3932         backup_theme_path = prefs_common.pixmap_theme_path;
3933         prefs_common.pixmap_theme_path = g_strdup(backup_theme_path);
3934         prefs_set_data_from_dialog(param);
3935         sock_set_io_timeout(prefs_common.io_timeout_secs);
3936         
3937         if (update_pixmap_theme) {
3938                 main_window_reflect_prefs_all_real(TRUE);
3939                 compose_reflect_prefs_pixmap_theme();
3940         } else
3941                 main_window_reflect_prefs_all_real(FALSE);
3942
3943         /*!< FIXME: Now it's safe to delete the backup path */
3944         g_free(backup_theme_path);
3945         
3946         prefs_common_save_config();
3947
3948         inc_autocheck_timer_remove();
3949         inc_autocheck_timer_set();
3950 }
3951
3952 static void prefs_nextunreadmsgdialog_set_data_from_optmenu(PrefParam *pparam)
3953 {
3954         GtkWidget *menu;
3955         GtkWidget *menuitem;
3956
3957         menu = gtk_option_menu_get_menu(GTK_OPTION_MENU(*pparam->widget));
3958         menuitem = gtk_menu_get_active(GTK_MENU(menu));
3959         *((NextUnreadMsgDialogShow *)pparam->data) = GPOINTER_TO_INT
3960                 (gtk_object_get_user_data(GTK_OBJECT(menuitem)));
3961 }
3962
3963 static void prefs_nextunreadmsgdialog_set_optmenu(PrefParam *pparam)
3964 {
3965         NextUnreadMsgDialogShow dialog_show;
3966         GtkOptionMenu *optmenu = GTK_OPTION_MENU(*pparam->widget);
3967         GtkWidget *menu;
3968         GtkWidget *menuitem;
3969
3970         dialog_show = *((NextUnreadMsgDialogShow *)pparam->data);
3971
3972         switch (dialog_show) {
3973         case NEXTUNREADMSGDIALOG_ALWAYS:
3974                 gtk_option_menu_set_history(optmenu, 0);
3975                 break;
3976         case NEXTUNREADMSGDIALOG_ASSUME_YES:
3977                 gtk_option_menu_set_history(optmenu, 1);
3978                 break;
3979         case NEXTUNREADMSGDIALOG_ASSUME_NO:
3980                 gtk_option_menu_set_history(optmenu, 2);
3981                 break;
3982         }
3983
3984         menu = gtk_option_menu_get_menu(optmenu);
3985         menuitem = gtk_menu_get_active(GTK_MENU(menu));
3986         gtk_menu_item_activate(GTK_MENU_ITEM(menuitem));
3987 }
3988
3989 static void prefs_common_cancel(void)
3990 {
3991         gtk_widget_hide(dialog.window);
3992         inc_unlock();
3993 }
3994
3995
3996 /* static void prefs_recvdialog_set_data_from_optmenu(PrefParam *pparam)
3997 {
3998         GtkWidget *menu;
3999         GtkWidget *menuitem;
4000
4001         menu = gtk_option_menu_get_menu(GTK_OPTION_MENU(*pparam->widget));
4002         menuitem = gtk_menu_get_active(GTK_MENU(menu));
4003         *((RecvDialogShow *)pparam->data) = GPOINTER_TO_INT
4004                 (gtk_object_get_user_data(GTK_OBJECT(menuitem)));
4005 }  */
4006
4007 /* static void prefs_recvdialog_set_optmenu(PrefParam *pparam)
4008 {
4009         RecvDialogShow dialog_show;
4010         GtkOptionMenu *optmenu = GTK_OPTION_MENU(*pparam->widget);
4011         GtkWidget *menu;
4012         GtkWidget *menuitem;
4013
4014         dialog_show = *((RecvDialogShow *)pparam->data);
4015
4016         switch (dialog_show) {
4017         case RECVDIALOG_ALWAYS:
4018                 gtk_option_menu_set_history(optmenu, 0);
4019                 break;
4020         case RECVDIALOG_WINDOW_ACTIVE:
4021                 gtk_option_menu_set_history(optmenu, 1);
4022                 break;
4023         case RECVDIALOG_NEVER:
4024                 gtk_option_menu_set_history(optmenu, 2);
4025                 break;
4026         default:
4027         }
4028
4029         menu = gtk_option_menu_get_menu(optmenu);
4030         menuitem = gtk_menu_get_active(GTK_MENU(menu));
4031         gtk_menu_item_activate(GTK_MENU_ITEM(menuitem));
4032 }     */