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