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