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