c5f4942b518cda0a2391a2c272db566481aca304
[claws.git] / src / prefs_common.c
1 /*
2  * Sylpheed -- a GTK+ based, lightweight, and fast e-mail client
3  * Copyright (C) 1999-2005 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 <glib/gi18n.h>
28 #include <gtk/gtk.h>
29 #include <gdk/gdkkeysyms.h>
30 #include <stdio.h>
31 #include <stdlib.h>
32 #include <string.h>
33 #include <unistd.h>
34 #include <sys/types.h>
35 #include <sys/stat.h>
36 #include <errno.h>
37
38 #include "main.h"
39 #include "prefs_gtk.h"
40 #include "prefs_common.h"
41 #include "prefs_display_header.h"
42 #include "prefs_summary_column.h"
43 #include "mainwindow.h"
44 #include "summaryview.h"
45 #include "messageview.h"
46 #include "manage_window.h"
47 #include "inc.h"
48 #include "menu.h"
49 #include "codeconv.h"
50 #include "utils.h"
51 #include "gtkutils.h"
52 #include "alertpanel.h"
53 #include "folder.h"
54 #include "socket.h"
55 #include "filesel.h"
56 #include "folderview.h"
57 #include "stock_pixmap.h"
58 #include "prefswindow.h"
59
60 enum {
61         DATEFMT_FMT,
62         DATEFMT_TXT,
63         N_DATEFMT_COLUMNS
64 };
65
66 PrefsCommon prefs_common;
67
68 GtkWidget *notebook;
69
70 static struct Receive {
71         GtkWidget *checkbtn_incext;
72         GtkWidget *entry_incext;
73         GtkWidget *button_incext;
74
75         GtkWidget *checkbtn_autochk;
76         GtkWidget *spinbtn_autochk;
77         GtkObject *spinbtn_autochk_adj;
78
79         GtkWidget *checkbtn_chkonstartup;
80         GtkWidget *checkbtn_scan_after_inc;
81
82
83         GtkWidget *checkbtn_newmail_auto;
84         GtkWidget *checkbtn_newmail_manu;
85         GtkWidget *entry_newmail_notify_cmd;
86         GtkWidget *hbox_newmail_notify;
87         GtkWidget *optmenu_recvdialog;
88         GtkWidget *checkbtn_no_recv_err_panel;
89         GtkWidget *checkbtn_close_recv_dialog;
90 } receive;
91
92 static struct Send {
93         GtkWidget *checkbtn_savemsg;
94         GtkWidget *optmenu_senddialog;
95
96         GtkWidget *optmenu_charset;
97         GtkWidget *optmenu_encoding_method;
98 } p_send;
99
100 static struct Display {
101         GtkWidget *chkbtn_folder_unread;
102         GtkWidget *entry_ng_abbrev_len;
103         GtkWidget *spinbtn_ng_abbrev_len;
104         GtkObject *spinbtn_ng_abbrev_len_adj;
105
106         GtkWidget *chkbtn_transhdr;
107
108         GtkWidget *chkbtn_swapfrom;
109         GtkWidget *chkbtn_useaddrbook;
110         GtkWidget *chkbtn_threadsubj;
111         GtkWidget *entry_datefmt;
112 } display;
113
114 static struct Message {
115         GtkWidget *chkbtn_mbalnum;
116         GtkWidget *chkbtn_disphdrpane;
117         GtkWidget *chkbtn_disphdr;
118         GtkWidget *chkbtn_html;
119         GtkWidget *chkbtn_cursor;
120         GtkWidget *spinbtn_linespc;
121         GtkObject *spinbtn_linespc_adj;
122
123         GtkWidget *chkbtn_smoothscroll;
124         GtkWidget *spinbtn_scrollstep;
125         GtkObject *spinbtn_scrollstep_adj;
126         GtkWidget *chkbtn_halfpage;
127
128         GtkWidget *chkbtn_attach_desc;
129 } message;
130
131 static struct Interface {
132         /* GtkWidget *checkbtn_emacs; */
133         GtkWidget *checkbtn_always_show_msg;
134         GtkWidget *checkbtn_openunread;
135         GtkWidget *checkbtn_mark_as_read_on_newwin;
136         GtkWidget *checkbtn_openinbox;
137         GtkWidget *checkbtn_immedexec;
138         GtkWidget *optmenu_nextunreadmsgdialog;
139 } interface;
140
141 static struct Other {
142         GtkWidget *checkbtn_addaddrbyclick;
143         GtkWidget *checkbtn_confonexit;
144         GtkWidget *checkbtn_cleanonexit;
145         GtkWidget *checkbtn_askonclean;
146         GtkWidget *checkbtn_warnqueued;
147         GtkWidget *checkbtn_cliplog;
148         GtkWidget *loglength_entry;
149 #if 0
150 #ifdef USE_OPENSSL
151         GtkWidget *checkbtn_ssl_ask_unknown_valid;
152 #endif
153 #endif
154
155         GtkWidget *spinbtn_iotimeout;
156         GtkObject *spinbtn_iotimeout_adj;
157 } other;
158
159 static struct KeybindDialog {
160         GtkWidget *window;
161         GtkWidget *combo;
162 } keybind;
163
164 static void prefs_common_charset_set_data_from_optmenu     (PrefParam *pparam);
165 static void prefs_common_charset_set_optmenu               (PrefParam *pparam);
166 static void prefs_common_encoding_set_data_from_optmenu    (PrefParam *pparam);
167 static void prefs_common_encoding_set_optmenu              (PrefParam *pparam);
168 static void prefs_common_recv_dialog_set_data_from_optmenu (PrefParam *pparam);
169 static void prefs_common_recv_dialog_set_optmenu           (PrefParam *pparam);
170 static void prefs_common_recv_dialog_newmail_notify_toggle_cb   (GtkWidget *w,
171                                                                  gpointer data);
172 static void prefs_common_recv_dialog_set_data_from_optmenu(PrefParam *pparam);
173 static void prefs_common_recv_dialog_set_optmenu(PrefParam *pparam);
174 static void prefs_common_send_dialog_set_data_from_optmenu(PrefParam *pparam);
175 static void prefs_common_send_dialog_set_optmenu(PrefParam *pparam);
176 static void prefs_nextunreadmsgdialog_set_data_from_optmenu(PrefParam *pparam);
177 static void prefs_nextunreadmsgdialog_set_optmenu(PrefParam *pparam);
178
179 /*
180    parameter name, default value, pointer to the prefs variable, data type,
181    pointer to the widget pointer,
182    pointer to the function for data setting,
183    pointer to the function for widget setting
184  */
185
186 static PrefParam param[] = {
187         /* Receive */
188         {"use_ext_inc", "FALSE", &prefs_common.use_extinc, P_BOOL,
189          &receive.checkbtn_incext,
190          prefs_set_data_from_toggle, prefs_set_toggle},
191         {"ext_inc_path", DEFAULT_INC_PATH, &prefs_common.extinc_cmd, P_STRING,
192          &receive.entry_incext,
193          prefs_set_data_from_entry, prefs_set_entry},
194
195         {"autochk_newmail", "FALSE", &prefs_common.autochk_newmail, P_BOOL,
196          &receive.checkbtn_autochk,
197          prefs_set_data_from_toggle, prefs_set_toggle},
198         {"autochk_interval", "10", &prefs_common.autochk_itv, P_INT,
199          &receive.spinbtn_autochk,
200          prefs_set_data_from_spinbtn, prefs_set_spinbtn},
201         {"check_on_startup", "FALSE", &prefs_common.chk_on_startup, P_BOOL,
202          &receive.checkbtn_chkonstartup,
203          prefs_set_data_from_toggle, prefs_set_toggle},
204         {"scan_all_after_inc", "FALSE", &prefs_common.scan_all_after_inc,
205          P_BOOL, &receive.checkbtn_scan_after_inc,
206          prefs_set_data_from_toggle, prefs_set_toggle},
207         {"newmail_notify_manu", "FALSE", &prefs_common.newmail_notify_manu,
208          P_BOOL, &receive.checkbtn_newmail_manu,
209          prefs_set_data_from_toggle, prefs_set_toggle},
210         {"newmail_notify_auto", "FALSE", &prefs_common.newmail_notify_auto,
211         P_BOOL, &receive.checkbtn_newmail_auto,
212          prefs_set_data_from_toggle, prefs_set_toggle},
213         {"newmail_notify_cmd", "", &prefs_common.newmail_notify_cmd, P_STRING,
214          &receive.entry_newmail_notify_cmd,
215          prefs_set_data_from_entry, prefs_set_entry},
216         {"receive_dialog_mode", "1", &prefs_common.recv_dialog_mode, P_ENUM,
217          &receive.optmenu_recvdialog,
218          prefs_common_recv_dialog_set_data_from_optmenu,
219          prefs_common_recv_dialog_set_optmenu},
220         {"no_receive_error_panel", "FALSE", &prefs_common.no_recv_err_panel,
221          P_BOOL, &receive.checkbtn_no_recv_err_panel,
222          prefs_set_data_from_toggle, prefs_set_toggle},
223         {"close_receive_dialog", "TRUE", &prefs_common.close_recv_dialog,
224          P_BOOL, &receive.checkbtn_close_recv_dialog,
225          prefs_set_data_from_toggle, prefs_set_toggle},
226  
227         /* Send */
228         {"save_message", "TRUE", &prefs_common.savemsg, P_BOOL,
229          &p_send.checkbtn_savemsg,
230          prefs_set_data_from_toggle, prefs_set_toggle},
231         {"send_dialog_mode", "0", &prefs_common.send_dialog_mode, P_ENUM,
232          &p_send.optmenu_senddialog,
233          prefs_common_send_dialog_set_data_from_optmenu,
234          prefs_common_send_dialog_set_optmenu},
235
236         {"outgoing_charset", CS_AUTO, &prefs_common.outgoing_charset, P_STRING,
237          &p_send.optmenu_charset,
238          prefs_common_charset_set_data_from_optmenu,
239          prefs_common_charset_set_optmenu},
240         {"encoding_method", "0", &prefs_common.encoding_method, P_ENUM,
241          &p_send.optmenu_encoding_method,
242          prefs_common_encoding_set_data_from_optmenu,
243          prefs_common_encoding_set_optmenu},
244
245         {"allow_jisx0201_kana", "FALSE", &prefs_common.allow_jisx0201_kana,
246          P_BOOL, NULL, NULL, NULL},
247
248         /* Compose */
249         {"auto_ext_editor", "FALSE", &prefs_common.auto_exteditor, P_BOOL,
250          NULL, NULL, NULL},
251         {"forward_as_attachment", "FALSE", &prefs_common.forward_as_attachment,
252          P_BOOL, NULL, NULL, NULL},
253         {"redirect_keep_from", "FALSE",
254          &prefs_common.redirect_keep_from, P_BOOL,
255          NULL, NULL, NULL},
256         {"undo_level", "50", &prefs_common.undolevels, P_INT,
257          NULL, NULL, NULL},
258
259         {"linewrap_length", "72", &prefs_common.linewrap_len, P_INT,
260          NULL, NULL, NULL},
261         {"linewrap_quotation", "TRUE", &prefs_common.linewrap_quote, P_BOOL,
262          NULL, NULL, NULL},
263         {"linewrap_auto", "TRUE", &prefs_common.autowrap, P_BOOL,
264          NULL, NULL, NULL},
265         {"linewrap_before_sending", "FALSE", &prefs_common.linewrap_at_send, P_BOOL, 
266          NULL, NULL, NULL},
267         {"autosave", "FALSE", &prefs_common.autosave,
268          P_BOOL, NULL, NULL, NULL},
269         {"autosave_length", "50", &prefs_common.autosave_length, P_INT,
270          NULL, NULL, NULL},
271 #if USE_ASPELL
272         {"enable_aspell", "TRUE", &prefs_common.enable_aspell, P_BOOL,
273          NULL, NULL, NULL},
274         {"aspell_path", ASPELL_PATH, &prefs_common.aspell_path, P_STRING,
275          NULL, NULL, NULL},
276         {"dictionary",  "", &prefs_common.dictionary, P_STRING,
277          NULL, NULL, NULL},
278         {"aspell_sugmode", "1", &prefs_common.aspell_sugmode, P_INT,
279          NULL, NULL, NULL},
280         {"use_alternate_dict", "FALSE", &prefs_common.use_alternate, P_BOOL,
281          NULL, NULL, NULL},
282         {"check_while_typing", "TRUE", &prefs_common.check_while_typing, P_BOOL,
283          NULL, NULL, NULL},
284         {"misspelled_color", "16711680", &prefs_common.misspelled_col, P_COLOR,
285          NULL, NULL, NULL},
286 #endif
287         {"reply_with_quote", "TRUE", &prefs_common.reply_with_quote, P_BOOL,
288          NULL, NULL, NULL},
289
290         /* Account autoselection */
291         {"reply_account_autoselect", "TRUE",
292          &prefs_common.reply_account_autosel, P_BOOL,
293          NULL, NULL, NULL},
294         {"forward_account_autoselect", "TRUE",
295          &prefs_common.forward_account_autosel, P_BOOL,
296          NULL, NULL, NULL},
297         {"reedit_account_autoselect", "TRUE",
298          &prefs_common.reedit_account_autosel, P_BOOL,
299          NULL, NULL, NULL},
300
301         {"default_reply_list", "TRUE", &prefs_common.default_reply_list, P_BOOL,
302          NULL, NULL, NULL},
303
304         {"show_ruler", "TRUE", &prefs_common.show_ruler, P_BOOL,
305          NULL, NULL, NULL},
306
307         /* Quote */
308         {"reply_quote_mark", "> ", &prefs_common.quotemark, P_STRING,
309          NULL, NULL, NULL},
310         {"reply_quote_format", "On %d\\n%f wrote:\\n\\n%q",
311          &prefs_common.quotefmt, P_STRING, NULL, NULL, NULL},
312
313         {"forward_quote_mark", "> ", &prefs_common.fw_quotemark, P_STRING,
314          NULL, NULL, NULL},
315         {"forward_quote_format",
316          "\\n\\nBegin forwarded message:\\n\\n"
317          "?d{Date: %d\\n}?f{From: %f\\n}?t{To: %t\\n}?c{Cc: %c\\n}"
318          "?n{Newsgroups: %n\\n}?s{Subject: %s\\n}\\n\\n%M",
319          &prefs_common.fw_quotefmt, P_STRING, NULL, NULL, NULL},
320         {"quote_chars", ">", &prefs_common.quote_chars, P_STRING,
321          NULL, NULL, NULL},
322
323         /* Display */
324         /* Obsolete fonts. For coexisting with Gtk+-1.2 version */
325         {"widget_font",         NULL,
326           &prefs_common.widgetfont_gtk1,        P_STRING, NULL, NULL, NULL},
327         {"message_font",        "-misc-fixed-medium-r-normal--14-*-*-*-*-*-*-*",
328          &prefs_common.textfont_gtk1,           P_STRING, NULL, NULL, NULL},
329         {"small_font",          "-*-helvetica-medium-r-normal--10-*-*-*-*-*-*-*",
330           &prefs_common.smallfont_gtk1,         P_STRING, NULL, NULL, NULL},
331         {"bold_font",           "-*-helvetica-bold-r-normal--12-*-*-*-*-*-*-*",
332           &prefs_common.boldfont_gtk1,          P_STRING, NULL, NULL, NULL},
333         {"normal_font",         "-*-helvetica-medium-r-normal--12-*-*-*-*-*-*-*",
334           &prefs_common.normalfont_gtk1,        P_STRING, NULL, NULL, NULL},
335
336         /* new fonts */
337         {"widget_font_gtk2",    NULL,
338           &prefs_common.widgetfont,             P_STRING, NULL, NULL, NULL},
339         {"message_font_gtk2",   "Monospace 9",
340          &prefs_common.textfont,                P_STRING, NULL, NULL, NULL},
341         {"small_font_gtk2",     "Sans 9",
342           &prefs_common.smallfont,              P_STRING, NULL, NULL, NULL},
343         {"bold_font_gtk2",      "Sans Bold 9",
344           &prefs_common.boldfont,               P_STRING, NULL, NULL, NULL},
345         {"normal_font_gtk2",    "Sans 9", 
346           &prefs_common.normalfont,             P_STRING, NULL, NULL, NULL},
347
348         /* image viewer */
349         {"display_image", "TRUE", &prefs_common.display_img, P_BOOL,
350          NULL, NULL, NULL},
351         {"resize_image", "TRUE", &prefs_common.resize_img, P_BOOL,
352          NULL, NULL, NULL},
353         {"inline_image", "TRUE", &prefs_common.inline_img, P_BOOL,
354          NULL, NULL, NULL},
355
356         {"display_folder_unread_num", "TRUE",
357          &prefs_common.display_folder_unread, P_BOOL,
358          NULL, NULL, NULL},
359         {"newsgroup_abbrev_len", "16",
360          &prefs_common.ng_abbrev_len, P_INT,
361          NULL, NULL, NULL},
362
363         {"translate_header", "TRUE", &prefs_common.trans_hdr, P_BOOL,
364          NULL, NULL, NULL},
365
366         /* Display: Summary View */
367         {"enable_swap_from", "FALSE", &prefs_common.swap_from, P_BOOL,
368          NULL, NULL, NULL},
369         {"use_address_book", "TRUE", &prefs_common.use_addr_book, P_BOOL,
370          NULL, NULL, NULL},
371         {"thread_by_subject", "TRUE", &prefs_common.thread_by_subject, P_BOOL,
372          NULL, NULL, NULL},
373         {"date_format", "%y/%m/%d(%a) %H:%M", &prefs_common.date_format,
374          P_STRING, NULL, NULL, NULL},
375
376         {"enable_hscrollbar", "TRUE", &prefs_common.enable_hscrollbar, P_BOOL,
377          NULL, NULL, NULL},
378         {"bold_unread", "TRUE", &prefs_common.bold_unread, P_BOOL,
379          NULL, NULL, NULL},
380         {"thread_by_subject_max_age", "10", &prefs_common.thread_by_subject_max_age,
381         P_INT, NULL, NULL, NULL },
382
383         {"enable_thread", "TRUE", &prefs_common.enable_thread, P_BOOL,
384          NULL, NULL, NULL},
385         {"toolbar_style", "3", &prefs_common.toolbar_style, P_ENUM,
386          NULL, NULL, NULL},
387         {"show_statusbar", "TRUE", &prefs_common.show_statusbar, P_BOOL,
388          NULL, NULL, NULL},
389         {"show_searchbar", "TRUE", &prefs_common.show_searchbar, P_BOOL,
390          NULL, NULL, NULL},
391
392         {"folderview_vscrollbar_policy", "0",
393          &prefs_common.folderview_vscrollbar_policy, P_ENUM,
394          NULL, NULL, NULL},
395
396         {"summary_col_show_mark", "TRUE",
397          &prefs_common.summary_col_visible[S_COL_MARK], P_BOOL, NULL, NULL, NULL},
398         {"summary_col_show_unread", "TRUE",
399          &prefs_common.summary_col_visible[S_COL_STATUS], P_BOOL, NULL, NULL, NULL},
400         {"summary_col_show_mime", "TRUE",
401          &prefs_common.summary_col_visible[S_COL_MIME], P_BOOL, NULL, NULL, NULL},
402         {"summary_col_show_subject", "TRUE",
403          &prefs_common.summary_col_visible[S_COL_SUBJECT], P_BOOL, NULL, NULL, NULL},
404         {"summary_col_show_from", "TRUE",
405          &prefs_common.summary_col_visible[S_COL_FROM], P_BOOL, NULL, NULL, NULL},
406         {"summary_col_show_date", "TRUE",
407          &prefs_common.summary_col_visible[S_COL_DATE], P_BOOL, NULL, NULL, NULL},
408         {"summary_col_show_size", "TRUE",
409          &prefs_common.summary_col_visible[S_COL_SIZE], P_BOOL, NULL, NULL, NULL},
410         {"summary_col_show_number", "FALSE",
411          &prefs_common.summary_col_visible[S_COL_NUMBER], P_BOOL, NULL, NULL, NULL},
412         {"summary_col_show_score", "FALSE",
413          &prefs_common.summary_col_visible[S_COL_SCORE], P_BOOL, NULL, NULL, NULL},
414         {"summary_col_show_locked", "FALSE",
415          &prefs_common.summary_col_visible[S_COL_LOCKED], P_BOOL, NULL, NULL, NULL},
416
417         {"summary_col_pos_mark", "0",
418           &prefs_common.summary_col_pos[S_COL_MARK], P_INT, NULL, NULL, NULL},
419         {"summary_col_pos_unread", "1",
420           &prefs_common.summary_col_pos[S_COL_STATUS], P_INT, NULL, NULL, NULL},
421         {"summary_col_pos_mime", "2",
422           &prefs_common.summary_col_pos[S_COL_MIME], P_INT, NULL, NULL, NULL},
423         {"summary_col_pos_subject", "3",
424           &prefs_common.summary_col_pos[S_COL_SUBJECT], P_INT, NULL, NULL, NULL},
425         {"summary_col_pos_from", "4",
426           &prefs_common.summary_col_pos[S_COL_FROM], P_INT, NULL, NULL, NULL},
427         {"summary_col_pos_date", "5",
428           &prefs_common.summary_col_pos[S_COL_DATE], P_INT, NULL, NULL, NULL},
429         {"summary_col_pos_size", "6",
430           &prefs_common.summary_col_pos[S_COL_SIZE], P_INT, NULL, NULL, NULL},
431         {"summary_col_pos_number", "7",
432           &prefs_common.summary_col_pos[S_COL_NUMBER], P_INT, NULL, NULL, NULL},
433         {"summary_col_pos_score", "8",
434          &prefs_common.summary_col_pos[S_COL_SCORE], P_INT, NULL, NULL, NULL},
435         {"summary_col_pos_locked", "9",
436          &prefs_common.summary_col_pos[S_COL_LOCKED], P_INT, NULL, NULL, NULL},
437
438         {"summary_col_size_mark", "10",
439          &prefs_common.summary_col_size[S_COL_MARK], P_INT, NULL, NULL, NULL},
440         {"summary_col_size_unread", "13",
441          &prefs_common.summary_col_size[S_COL_STATUS], P_INT, NULL, NULL, NULL},
442         {"summary_col_size_mime", "10",
443          &prefs_common.summary_col_size[S_COL_MIME], P_INT, NULL, NULL, NULL},
444         {"summary_col_size_subject", "200",
445          &prefs_common.summary_col_size[S_COL_SUBJECT], P_INT, NULL, NULL, NULL},
446         {"summary_col_size_from", "120",
447          &prefs_common.summary_col_size[S_COL_FROM], P_INT, NULL, NULL, NULL},
448         {"summary_col_size_date", "118",
449          &prefs_common.summary_col_size[S_COL_DATE], P_INT, NULL, NULL, NULL},
450         {"summary_col_size_size", "45",
451          &prefs_common.summary_col_size[S_COL_SIZE], P_INT, NULL, NULL, NULL},
452         {"summary_col_size_number", "40",
453          &prefs_common.summary_col_size[S_COL_NUMBER], P_INT, NULL, NULL, NULL},
454         {"summary_col_size_score", "40",
455          &prefs_common.summary_col_size[S_COL_SCORE], P_INT, NULL, NULL, NULL},
456         {"summary_col_size_locked", "13",
457          &prefs_common.summary_col_size[S_COL_LOCKED], P_INT, NULL, NULL, NULL},
458
459         /* Widget size */
460         {"folderwin_x", "16", &prefs_common.folderwin_x, P_INT,
461          NULL, NULL, NULL},
462         {"folderwin_y", "16", &prefs_common.folderwin_y, P_INT,
463          NULL, NULL, NULL},
464         {"folderview_width", "179", &prefs_common.folderview_width, P_INT,
465          NULL, NULL, NULL},
466         {"folderview_height", "450", &prefs_common.folderview_height, P_INT,
467          NULL, NULL, NULL},
468         {"folderview_visible", "TRUE", &prefs_common.folderview_visible, P_BOOL,
469          NULL, NULL, NULL},
470
471         {"folder_col_folder", "150", &prefs_common.folder_col_folder, P_INT,
472          NULL, NULL, NULL},
473         {"folder_col_new", "32", &prefs_common.folder_col_new, P_INT,
474          NULL, NULL, NULL},
475         {"folder_col_unread", "32", &prefs_common.folder_col_unread, P_INT,
476          NULL, NULL, NULL},
477         {"folder_col_total", "32", &prefs_common.folder_col_total, P_INT,
478          NULL, NULL, NULL},
479
480         {"summaryview_width", "600", &prefs_common.summaryview_width, P_INT,
481          NULL, NULL, NULL},
482         {"summaryview_height", "157", &prefs_common.summaryview_height, P_INT,
483          NULL, NULL, NULL},
484
485         {"main_messagewin_x", "256", &prefs_common.main_msgwin_x, P_INT,
486          NULL, NULL, NULL},
487         {"main_messagewin_y", "210", &prefs_common.main_msgwin_y, P_INT,
488          NULL, NULL, NULL},
489         {"messageview_width", "600", &prefs_common.msgview_width, P_INT,
490          NULL, NULL, NULL},
491         {"messageview_height", "300", &prefs_common.msgview_height, P_INT,
492          NULL, NULL, NULL},
493         {"messageview_visible", "TRUE", &prefs_common.msgview_visible, P_BOOL,
494          NULL, NULL, NULL},
495
496         {"mainview_x", "64", &prefs_common.mainview_x, P_INT,
497          NULL, NULL, NULL},
498         {"mainview_y", "64", &prefs_common.mainview_y, P_INT,
499          NULL, NULL, NULL},
500         {"mainview_width", "600", &prefs_common.mainview_width, P_INT,
501          NULL, NULL, NULL},
502         {"mainview_height", "600", &prefs_common.mainview_height, P_INT,
503          NULL, NULL, NULL},
504         {"mainwin_x", "64", &prefs_common.mainwin_x, P_INT,
505          NULL, NULL, NULL},
506         {"mainwin_y", "64", &prefs_common.mainwin_y, P_INT,
507          NULL, NULL, NULL},
508         {"mainwin_width", "800", &prefs_common.mainwin_width, P_INT,
509          NULL, NULL, NULL},
510         {"mainwin_height", "600", &prefs_common.mainwin_height, P_INT,
511          NULL, NULL, NULL},
512         {"messagewin_width", "600", &prefs_common.msgwin_width, P_INT,
513          NULL, NULL, NULL},
514         {"messagewin_height", "540", &prefs_common.msgwin_height, P_INT,
515          NULL, NULL, NULL},
516         {"sourcewin_width", "600", &prefs_common.sourcewin_width, P_INT,
517          NULL, NULL, NULL},
518         {"sourcewin_height", "500", &prefs_common.sourcewin_height, P_INT,
519          NULL, NULL, NULL},
520         {"compose_width", "600", &prefs_common.compose_width, P_INT,
521          NULL, NULL, NULL},
522         {"compose_height", "560", &prefs_common.compose_height, P_INT,
523          NULL, NULL, NULL},
524         {"compose_x", "0", &prefs_common.compose_x, P_INT,
525          NULL, NULL, NULL},
526         {"compose_y", "0", &prefs_common.compose_y, P_INT,
527          NULL, NULL, NULL},
528         /* Message */
529         {"enable_color", "TRUE", &prefs_common.enable_color, P_BOOL,
530          NULL, NULL, NULL},
531
532         {"quote_level1_color", "179", &prefs_common.quote_level1_col, P_COLOR,
533          NULL, NULL, NULL},
534         {"quote_level2_color", "179", &prefs_common.quote_level2_col, P_COLOR,
535          NULL, NULL, NULL},
536         {"quote_level3_color", "179", &prefs_common.quote_level3_col, P_COLOR,
537          NULL, NULL, NULL},
538         {"uri_color", "32512", &prefs_common.uri_col, P_COLOR,
539          NULL, NULL, NULL},
540         {"target_folder_color", "14294218", &prefs_common.tgt_folder_col, P_COLOR,
541          NULL, NULL, NULL},
542         {"signature_color", "7960953", &prefs_common.signature_col, P_COLOR,
543          NULL, NULL, NULL},
544         {"recycle_quote_colors", "FALSE", &prefs_common.recycle_quote_colors,
545          P_BOOL, NULL, NULL, NULL},
546
547         {"convert_mb_alnum", "FALSE", &prefs_common.conv_mb_alnum, P_BOOL,
548          &message.chkbtn_mbalnum,
549          prefs_set_data_from_toggle, prefs_set_toggle},
550         {"display_header_pane", "TRUE", &prefs_common.display_header_pane,
551          P_BOOL, &message.chkbtn_disphdrpane,
552          prefs_set_data_from_toggle, prefs_set_toggle},
553         {"display_header", "TRUE", &prefs_common.display_header, P_BOOL,
554          &message.chkbtn_disphdr,
555          prefs_set_data_from_toggle, prefs_set_toggle},
556         {"render_html", "TRUE", &prefs_common.render_html, P_BOOL,
557          &message.chkbtn_html,
558          prefs_set_data_from_toggle, prefs_set_toggle},
559         {"textview_cursor_visible", "FALSE",
560          &prefs_common.textview_cursor_visible, P_BOOL,
561          &message.chkbtn_cursor, prefs_set_data_from_toggle, prefs_set_toggle},
562         {"line_space", "2", &prefs_common.line_space, P_INT,
563          &message.spinbtn_linespc,
564          prefs_set_data_from_spinbtn, prefs_set_spinbtn},
565
566         {"enable_smooth_scroll", "FALSE",
567          &prefs_common.enable_smooth_scroll, P_BOOL,
568          &message.chkbtn_smoothscroll,
569          prefs_set_data_from_toggle, prefs_set_toggle},
570         {"scroll_step", "1", &prefs_common.scroll_step, P_INT,
571          &message.spinbtn_scrollstep,
572          prefs_set_data_from_spinbtn, prefs_set_spinbtn},
573         {"scroll_half_page", "FALSE", &prefs_common.scroll_halfpage, P_BOOL,
574          &message.chkbtn_halfpage,
575          prefs_set_data_from_toggle, prefs_set_toggle},
576
577         {"show_other_header", "FALSE", &prefs_common.show_other_header, P_BOOL,
578          NULL, NULL, NULL},
579
580         {"attach_desc", "TRUE", &prefs_common.attach_desc, P_BOOL,
581          &message.chkbtn_attach_desc,
582          prefs_set_data_from_toggle, prefs_set_toggle},
583         {"attach_save_directory", NULL,
584          &prefs_common.attach_save_dir, P_STRING, NULL, NULL, NULL},
585
586         /* MIME viewer */
587         {"mime_image_viewer", "display '%s'",
588          &prefs_common.mime_image_viewer, P_STRING, NULL, NULL, NULL},
589         {"mime_audio_player", "play '%s'",
590          &prefs_common.mime_audio_player, P_STRING, NULL, NULL, NULL},
591         {"mime_open_command", "gedit '%s'",
592          &prefs_common.mime_open_cmd, P_STRING, NULL, NULL, NULL},
593
594         /* Interface */
595         {"separate_folder", "FALSE", &prefs_common.sep_folder, P_BOOL,
596          NULL, NULL, NULL},
597         {"separate_message", "FALSE", &prefs_common.sep_msg, P_BOOL,
598          NULL, NULL, NULL},
599
600         /* {"emulate_emacs", "FALSE", &prefs_common.emulate_emacs, P_BOOL,
601          NULL, NULL, NULL}, */
602         {"always_show_message_when_selected", "FALSE",
603          &prefs_common.always_show_msg,
604          P_BOOL, &interface.checkbtn_always_show_msg,
605          prefs_set_data_from_toggle, prefs_set_toggle},
606         {"open_unread_on_enter", "FALSE", &prefs_common.open_unread_on_enter,
607          P_BOOL, &interface.checkbtn_openunread,
608          prefs_set_data_from_toggle, prefs_set_toggle},
609         {"mark_as_read_on_new_window", "FALSE",
610          &prefs_common.mark_as_read_on_new_window,
611          P_BOOL, &interface.checkbtn_mark_as_read_on_newwin,
612          prefs_set_data_from_toggle, prefs_set_toggle},
613         {"mark_as_read_delay", "0",
614          &prefs_common.mark_as_read_delay, P_INT, 
615          NULL, NULL, NULL},
616         {"open_inbox_on_inc", "FALSE", &prefs_common.open_inbox_on_inc,
617          P_BOOL, &interface.checkbtn_openinbox,
618          prefs_set_data_from_toggle, prefs_set_toggle},
619         {"immediate_execution", "TRUE", &prefs_common.immediate_exec, P_BOOL,
620          &interface.checkbtn_immedexec,
621          prefs_set_data_from_toggle, prefs_set_toggle},
622         {"nextunreadmsg_dialog", NULL, &prefs_common.next_unread_msg_dialog, P_ENUM,
623          &interface.optmenu_nextunreadmsgdialog,
624          prefs_nextunreadmsgdialog_set_data_from_optmenu,
625          prefs_nextunreadmsgdialog_set_optmenu},
626
627         {"pixmap_theme_path", DEFAULT_PIXMAP_THEME, 
628          &prefs_common.pixmap_theme_path, P_STRING,
629          NULL, NULL, NULL},
630
631         {"hover_timeout", "500", &prefs_common.hover_timeout, P_INT,
632          NULL, NULL, NULL},
633         
634         /* Other */
635         {"uri_open_command", DEFAULT_BROWSER_CMD,
636          &prefs_common.uri_cmd, P_STRING, NULL, NULL, NULL},
637         {"print_command", "lpr %s", &prefs_common.print_cmd, P_STRING,
638          NULL, NULL, NULL},
639         {"ext_editor_command", "gedit %s",
640          &prefs_common.ext_editor_cmd, P_STRING, NULL, NULL, NULL},
641
642         {"add_address_by_click", "FALSE", &prefs_common.add_address_by_click,
643          P_BOOL, &other.checkbtn_addaddrbyclick,
644          prefs_set_data_from_toggle, prefs_set_toggle},
645
646         {"confirm_on_exit", "FALSE", &prefs_common.confirm_on_exit, P_BOOL,
647          &other.checkbtn_confonexit,
648          prefs_set_data_from_toggle, prefs_set_toggle},
649         {"clean_trash_on_exit", "FALSE", &prefs_common.clean_on_exit, P_BOOL,
650          &other.checkbtn_cleanonexit,
651          prefs_set_data_from_toggle, prefs_set_toggle},
652         {"ask_on_cleaning", "TRUE", &prefs_common.ask_on_clean, P_BOOL,
653          &other.checkbtn_askonclean,
654          prefs_set_data_from_toggle, prefs_set_toggle},
655         {"warn_queued_on_exit", "TRUE", &prefs_common.warn_queued_on_exit,
656          P_BOOL, &other.checkbtn_warnqueued,
657          prefs_set_data_from_toggle, prefs_set_toggle},
658 #if 0
659 #ifdef USE_OPENSSL
660         {"ssl_ask_unknown_valid", "TRUE", &prefs_common.ssl_ask_unknown_valid,
661          P_BOOL, &other.checkbtn_ssl_ask_unknown_valid,
662          prefs_set_data_from_toggle, prefs_set_toggle},
663 #endif
664 #endif
665         {"work_offline", "FALSE", &prefs_common.work_offline, P_BOOL,
666          NULL, NULL, NULL},
667         {"summary_quicksearch_type", "0", &prefs_common.summary_quicksearch_type, P_INT,
668          NULL, NULL, NULL},
669         {"summary_quicksearch_sticky", "1", &prefs_common.summary_quicksearch_sticky, P_INT,
670          NULL, NULL, NULL},
671         {"summary_quicksearch_recurse", "1", &prefs_common.summary_quicksearch_recurse, P_INT,
672          NULL, NULL, NULL},
673
674         {"io_timeout_secs", "60", &prefs_common.io_timeout_secs,
675          P_INT, &other.spinbtn_iotimeout,
676          prefs_set_data_from_spinbtn, prefs_set_spinbtn},
677         {"hide_score", "-9999", &prefs_common.kill_score, P_INT,
678          NULL, NULL, NULL},
679         {"important_score", "1", &prefs_common.important_score, P_INT,
680          NULL, NULL, NULL},
681         {"clip_log", "TRUE", &prefs_common.cliplog, P_BOOL,
682          &other.checkbtn_cliplog,
683          prefs_set_data_from_toggle, prefs_set_toggle},
684         {"log_length", "500", &prefs_common.loglength, P_INT,
685          &other.loglength_entry,
686          prefs_set_data_from_entry, prefs_set_entry},
687
688         {"cache_max_mem_usage", "4096", &prefs_common.cache_max_mem_usage, P_INT,
689          NULL, NULL, NULL},
690         {"cache_min_keep_time", "15", &prefs_common.cache_min_keep_time, P_INT,
691          NULL, NULL, NULL},
692
693         {"color_new", "179", &prefs_common.color_new, P_COLOR,
694          NULL, NULL, NULL},
695
696         {"filteringwin_width", "500", &prefs_common.filteringwin_width, P_INT,
697          NULL, NULL, NULL},
698         {"filteringwin_height", "-1", &prefs_common.filteringwin_height, P_INT,
699          NULL, NULL, NULL},
700         {"warn_dnd", "1", &prefs_common.warn_dnd, P_INT,
701          NULL, NULL, NULL},
702
703         {NULL, NULL, NULL, P_OTHER, NULL, NULL, NULL}
704 };
705
706 /* widget creating functions */
707 static void prefs_common_create         (void);
708 static void prefs_receive_create        (void);
709 static void prefs_send_create           (void);
710 static void prefs_message_create        (void);
711 static void prefs_interface_create      (void);
712 static void prefs_other_create          (void);
713
714 static void date_format_ok_btn_clicked          (GtkButton      *button,
715                                                  GtkWidget     **widget);
716 static void date_format_cancel_btn_clicked      (GtkButton      *button,
717                                                  GtkWidget     **widget);
718 static gboolean date_format_key_pressed         (GtkWidget      *keywidget,
719                                                  GdkEventKey    *event,
720                                                  GtkWidget     **widget);
721 static gboolean date_format_on_delete           (GtkWidget      *dialogwidget,
722                                                  GdkEventAny    *event,
723                                                  GtkWidget     **widget);
724 static void date_format_entry_on_change         (GtkEditable    *editable,
725                                                  GtkLabel       *example);
726 static void date_format_select_row              (GtkTreeView *list_view,
727                                                  GtkTreePath *path,
728                                                  GtkTreeViewColumn *column,
729                                                  GtkWidget *date_format);
730 static void prefs_keybind_select                (void);
731 static gint prefs_keybind_deleted               (GtkWidget      *widget,
732                                                  GdkEventAny    *event,
733                                                  gpointer        data);
734 static gboolean prefs_keybind_key_pressed       (GtkWidget      *widget,
735                                                  GdkEventKey    *event,
736                                                  gpointer        data);
737 static void prefs_keybind_cancel                (void);
738 static void prefs_keybind_apply_clicked         (GtkWidget      *widget);
739
740 static void prefs_common_apply          (void);
741
742 typedef struct CommonPage
743 {
744         PrefsPage page;
745  
746         GtkWidget *vbox;
747 } CommonPage;
748
749 static CommonPage common_page;
750
751 static void create_widget_func(PrefsPage * _page,
752                                            GtkWindow * window,
753                                            gpointer data)
754 {
755         CommonPage *page = (CommonPage *) _page;
756         GtkWidget *vbox;
757
758         vbox = gtk_vbox_new(FALSE, 6);
759         gtk_widget_show(vbox);
760
761         if (notebook == NULL)
762                 prefs_common_create();
763         gtk_box_pack_start (GTK_BOX (vbox), notebook, TRUE, TRUE, 0);
764         gtk_notebook_set_current_page(GTK_NOTEBOOK(notebook), 0);
765
766         prefs_set_dialog(param);
767
768         page->vbox = vbox;
769
770         page->page.widget = vbox;
771 }
772
773 static void destroy_widget_func(PrefsPage *_page)
774 {
775         CommonPage *page = (CommonPage *) _page;
776
777         gtk_container_remove(GTK_CONTAINER (page->vbox), notebook);
778 }
779
780 static void save_func(PrefsPage * _page)
781 {
782         prefs_common_apply();
783 }
784
785 void prefs_common_init(void) 
786 {
787         static gchar *path[2];
788
789         prefs_common.disphdr_list = NULL;
790             
791         path[0] = _("Common");
792         path[2] = NULL;
793         
794         common_page.page.path = path;
795         common_page.page.weight = 1000.0;
796         common_page.page.create_widget = create_widget_func;
797         common_page.page.destroy_widget = destroy_widget_func;
798         common_page.page.save_page = save_func;
799
800         prefs_gtk_register_page((PrefsPage *) &common_page);
801 }
802
803 PrefsCommon *prefs_common_get(void)
804 {
805         return &prefs_common;
806 }
807
808 /*
809  * Read history list from the specified history file
810  */
811 GList *prefs_common_read_history(const gchar *history) 
812 {
813         FILE *fp;
814         gchar *path;
815         gchar buf[PREFSBUFSIZE];
816         GList *tmp = NULL;
817
818         path = g_strconcat(get_rc_dir(), G_DIR_SEPARATOR_S, history,
819                            NULL);
820         if ((fp = fopen(path, "rb")) == NULL) {
821                 if (ENOENT != errno) FILE_OP_ERROR(path, "fopen");
822                 g_free(path);
823                 return NULL;
824         }
825         g_free(path);
826         while (fgets(buf, sizeof(buf), fp) != NULL) {
827                 g_strstrip(buf);
828                 if (buf[0] == '\0') continue;
829                 tmp = add_history(tmp, buf);
830         }
831         fclose(fp);
832
833         tmp = g_list_reverse(tmp);
834
835         return tmp;
836 }
837
838 void prefs_common_read_config(void)
839 {
840         gchar *rcpath;
841         
842         rcpath = g_strconcat(get_rc_dir(), G_DIR_SEPARATOR_S, COMMON_RC, NULL);
843         prefs_read_config(param, "Common", rcpath, NULL);
844         g_free(rcpath);
845         
846         prefs_common.mime_open_cmd_history =
847                 prefs_common_read_history(COMMAND_HISTORY);
848         prefs_common.summary_quicksearch_history =
849                 prefs_common_read_history(QUICKSEARCH_HISTORY);
850 }
851
852 /*
853  * Save history list to the specified history file
854  */
855 void prefs_common_save_history(const gchar *history, GList *list)
856 {
857         GList *cur;
858         FILE *fp;
859         gchar *path;
860
861         path = g_strconcat(get_rc_dir(), G_DIR_SEPARATOR_S, history,
862                            NULL);
863         if ((fp = fopen(path, "wb")) == NULL) {
864                 FILE_OP_ERROR(path, "fopen");
865                 g_free(path);
866                 return;
867         }
868
869         for (cur = list; cur != NULL; cur = cur->next) {
870                 fputs((gchar *)cur->data, fp);
871                 fputc('\n', fp);
872         }
873
874         fclose(fp);
875         g_free(path);
876 }
877
878 void prefs_common_write_config(void)
879 {
880         prefs_write_config(param, "Common", COMMON_RC);
881
882         prefs_common_save_history(COMMAND_HISTORY, 
883                 prefs_common.mime_open_cmd_history);
884         prefs_common_save_history(QUICKSEARCH_HISTORY, 
885                 prefs_common.summary_quicksearch_history);
886 }
887
888 static void prefs_common_create(void)
889 {
890         gint page = 0;
891
892         debug_print("Creating common preferences window...\n");
893
894         notebook = gtk_notebook_new ();
895         gtk_widget_show(notebook);
896         gtk_container_set_border_width (GTK_CONTAINER (notebook), 2);
897         /* GTK_WIDGET_UNSET_FLAGS (notebook, GTK_CAN_FOCUS); */
898         gtk_notebook_set_scrollable (GTK_NOTEBOOK (notebook), TRUE);
899         
900         gtk_notebook_popup_enable (GTK_NOTEBOOK (notebook));
901
902         gtk_widget_ref(notebook);
903
904         /* create all widgets on notebook */
905         prefs_receive_create();
906         SET_NOTEBOOK_LABEL(notebook, _("Receive"),   page++);
907         prefs_send_create();
908         SET_NOTEBOOK_LABEL(notebook, _("Send"),      page++);
909         prefs_message_create();
910         SET_NOTEBOOK_LABEL(notebook, _("Message"),   page++);
911         prefs_interface_create();
912         SET_NOTEBOOK_LABEL(notebook, _("Interface"), page++);
913         prefs_other_create();
914         SET_NOTEBOOK_LABEL(notebook, _("Other"),     page++);
915
916         gtk_widget_show_all(notebook);
917 }
918
919 static void prefs_receive_create(void)
920 {
921         GtkWidget *vbox1;
922         GtkWidget *vbox2;
923         GtkWidget *frame_incext;
924         GtkWidget *checkbtn_incext;
925         GtkWidget *hbox;
926         GtkWidget *label_incext;
927         GtkWidget *entry_incext;
928         /* GtkWidget *button_incext; */
929
930         GtkWidget *hbox_autochk;
931         GtkWidget *checkbtn_autochk;
932         GtkWidget *label_autochk1;
933         GtkObject *spinbtn_autochk_adj;
934         GtkWidget *spinbtn_autochk;
935         GtkWidget *label_autochk2;
936         GtkWidget *checkbtn_chkonstartup;
937         GtkWidget *checkbtn_scan_after_inc;
938
939
940         GtkWidget *frame_newmail;
941         GtkWidget *hbox_newmail_notify;
942         GtkWidget *checkbtn_newmail_auto;
943         GtkWidget *checkbtn_newmail_manu;
944         GtkWidget *entry_newmail_notify_cmd;
945         GtkWidget *label_newmail_notify_cmd;
946
947         GtkWidget *hbox_recvdialog;
948         GtkWidget *label_recvdialog;
949         GtkWidget *menu;
950         GtkWidget *menuitem;
951         GtkWidget *optmenu_recvdialog;
952         GtkWidget *checkbtn_no_recv_err_panel;
953         GtkWidget *checkbtn_close_recv_dialog;
954
955         vbox1 = gtk_vbox_new (FALSE, VSPACING);
956         gtk_widget_show (vbox1);
957         gtk_container_add (GTK_CONTAINER (notebook), vbox1);
958         gtk_container_set_border_width (GTK_CONTAINER (vbox1), VBOX_BORDER);
959
960         PACK_FRAME(vbox1, frame_incext, _("External program"));
961
962         vbox2 = gtk_vbox_new (FALSE, VSPACING_NARROW);
963         gtk_widget_show (vbox2);
964         gtk_container_add (GTK_CONTAINER (frame_incext), vbox2);
965         gtk_container_set_border_width (GTK_CONTAINER (vbox2), 8);
966
967         /* Use of external incorporation program */
968         PACK_CHECK_BUTTON (vbox2, checkbtn_incext,
969                            _("Use external program for incorporation"));
970
971         hbox = gtk_hbox_new (FALSE, 8);
972         gtk_widget_show (hbox);
973         gtk_box_pack_start (GTK_BOX (vbox2), hbox, FALSE, FALSE, 0);
974         SET_TOGGLE_SENSITIVITY (checkbtn_incext, hbox);
975
976         label_incext = gtk_label_new (_("Command"));
977         gtk_widget_show (label_incext);
978         gtk_box_pack_start (GTK_BOX (hbox), label_incext, FALSE, FALSE, 0);
979
980         entry_incext = gtk_entry_new ();
981         gtk_widget_show (entry_incext);
982         gtk_box_pack_start (GTK_BOX (hbox), entry_incext, TRUE, TRUE, 0);
983
984 #if 0
985         button_incext = gtk_button_new_with_label ("... ");
986         gtk_widget_show (button_incext);
987         gtk_box_pack_start (GTK_BOX (hbox), button_incext, FALSE, FALSE, 0);
988 #endif
989
990         vbox2 = gtk_vbox_new (FALSE, 0);
991         gtk_widget_show (vbox2);
992         gtk_box_pack_start (GTK_BOX (vbox1), vbox2, FALSE, FALSE, 0);
993
994         /* Auto-checking */
995         hbox_autochk = gtk_hbox_new (FALSE, 8);
996         gtk_widget_show (hbox_autochk);
997         gtk_box_pack_start (GTK_BOX (vbox2), hbox_autochk, FALSE, FALSE, 0);
998
999         PACK_CHECK_BUTTON (hbox_autochk, checkbtn_autochk,
1000                            _("Auto-check new mail"));
1001
1002         label_autochk1 = gtk_label_new (_("every"));
1003         gtk_widget_show (label_autochk1);
1004         gtk_box_pack_start (GTK_BOX (hbox_autochk), label_autochk1, FALSE, FALSE, 0);
1005
1006         spinbtn_autochk_adj = gtk_adjustment_new (5, 1, 100, 1, 10, 10);
1007         spinbtn_autochk = gtk_spin_button_new
1008                 (GTK_ADJUSTMENT (spinbtn_autochk_adj), 1, 0);
1009         gtk_widget_show (spinbtn_autochk);
1010         gtk_box_pack_start (GTK_BOX (hbox_autochk), spinbtn_autochk, FALSE, FALSE, 0);
1011         gtk_widget_set_size_request (spinbtn_autochk, 64, -1);
1012         gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (spinbtn_autochk), TRUE);
1013
1014         label_autochk2 = gtk_label_new (_("minute(s)"));
1015         gtk_widget_show (label_autochk2);
1016         gtk_box_pack_start (GTK_BOX (hbox_autochk), label_autochk2, FALSE, FALSE, 0);
1017
1018         SET_TOGGLE_SENSITIVITY(checkbtn_autochk, label_autochk1);
1019         SET_TOGGLE_SENSITIVITY(checkbtn_autochk, spinbtn_autochk);
1020         SET_TOGGLE_SENSITIVITY(checkbtn_autochk, label_autochk2);
1021
1022         PACK_CHECK_BUTTON (vbox2, checkbtn_chkonstartup,
1023                            _("Check new mail on startup"));
1024         PACK_CHECK_BUTTON (vbox2, checkbtn_scan_after_inc,
1025                            _("Update all local folders after incorporation"));
1026
1027
1028         /* receive dialog */
1029         hbox_recvdialog = gtk_hbox_new (FALSE, 8);
1030         gtk_widget_show (hbox_recvdialog);
1031         gtk_box_pack_start (GTK_BOX (vbox2), hbox_recvdialog, FALSE, FALSE, 0);
1032
1033         label_recvdialog = gtk_label_new (_("Show receive dialog"));
1034         gtk_misc_set_alignment(GTK_MISC(label_recvdialog), 0, 0.5);
1035         gtk_widget_show (label_recvdialog);
1036         gtk_box_pack_start (GTK_BOX (hbox_recvdialog), label_recvdialog, FALSE, FALSE, 0);
1037
1038         optmenu_recvdialog = gtk_option_menu_new ();
1039         gtk_widget_show (optmenu_recvdialog);
1040         gtk_box_pack_start (GTK_BOX (hbox_recvdialog), optmenu_recvdialog, FALSE, FALSE, 0);
1041
1042         menu = gtk_menu_new ();
1043         MENUITEM_ADD (menu, menuitem, _("Always"), RECV_DIALOG_ALWAYS);
1044         MENUITEM_ADD (menu, menuitem, _("Only on manual receiving"),
1045                       RECV_DIALOG_MANUAL);
1046         MENUITEM_ADD (menu, menuitem, _("Never"), RECV_DIALOG_NEVER);
1047
1048         gtk_option_menu_set_menu (GTK_OPTION_MENU (optmenu_recvdialog), menu);
1049
1050         PACK_CHECK_BUTTON (vbox2, checkbtn_no_recv_err_panel,
1051                            _("Don't popup error dialog on receive error"));
1052
1053         PACK_CHECK_BUTTON (vbox2, checkbtn_close_recv_dialog,
1054                            _("Close receive dialog when finished"));
1055         
1056         PACK_FRAME(vbox1, frame_newmail, _("Run command when new mail "
1057                                            "arrives"));
1058         vbox2 = gtk_vbox_new (FALSE, VSPACING_NARROW);
1059         gtk_widget_show (vbox2);
1060         gtk_container_add (GTK_CONTAINER (frame_newmail), vbox2);
1061         gtk_container_set_border_width (GTK_CONTAINER (vbox2), 8);
1062
1063         hbox = gtk_hbox_new (TRUE, 8);
1064         gtk_widget_show (hbox);
1065         PACK_CHECK_BUTTON (hbox, checkbtn_newmail_auto,
1066                            _("after autochecking"));
1067         PACK_CHECK_BUTTON (hbox, checkbtn_newmail_manu,
1068                            _("after manual checking"));
1069         gtk_box_pack_start (GTK_BOX(vbox2), hbox, FALSE, FALSE, 0);
1070         g_signal_connect(G_OBJECT(checkbtn_newmail_auto), "toggled",
1071                          G_CALLBACK(prefs_common_recv_dialog_newmail_notify_toggle_cb),
1072                          NULL);
1073         g_signal_connect(G_OBJECT(checkbtn_newmail_manu), "toggled",
1074                          G_CALLBACK(prefs_common_recv_dialog_newmail_notify_toggle_cb),
1075                          NULL);
1076
1077         hbox_newmail_notify = gtk_hbox_new (FALSE, 8);
1078         gtk_widget_show (hbox);
1079         gtk_box_pack_start (GTK_BOX (vbox2), hbox_newmail_notify, FALSE, 
1080                             FALSE, 0);
1081
1082         label_newmail_notify_cmd = gtk_label_new (_("Command to execute:\n"
1083                                                     "(use %d as number of new "
1084                                                     "mails)"));
1085         gtk_label_set_justify(GTK_LABEL(label_newmail_notify_cmd), 
1086                               GTK_JUSTIFY_RIGHT);
1087         gtk_widget_show (label_newmail_notify_cmd);
1088         gtk_box_pack_start (GTK_BOX (hbox_newmail_notify), 
1089                             label_newmail_notify_cmd, FALSE, FALSE, 0);
1090
1091         entry_newmail_notify_cmd = gtk_entry_new ();
1092         gtk_widget_show (entry_newmail_notify_cmd);
1093         gtk_box_pack_start (GTK_BOX (hbox_newmail_notify), 
1094                             entry_newmail_notify_cmd, TRUE, TRUE, 0);
1095
1096         gtk_widget_set_sensitive(hbox_newmail_notify, 
1097                                  prefs_common.newmail_notify_auto || 
1098                                  prefs_common.newmail_notify_manu);
1099
1100         receive.checkbtn_incext = checkbtn_incext;
1101         receive.entry_incext    = entry_incext;
1102         /* receive.button_incext   = button_incext; */
1103
1104         receive.checkbtn_autochk    = checkbtn_autochk;
1105         receive.spinbtn_autochk     = spinbtn_autochk;
1106         receive.spinbtn_autochk_adj = spinbtn_autochk_adj;
1107
1108         receive.checkbtn_chkonstartup = checkbtn_chkonstartup;
1109         receive.checkbtn_scan_after_inc = checkbtn_scan_after_inc;
1110
1111
1112         receive.checkbtn_newmail_auto  = checkbtn_newmail_auto;
1113         receive.checkbtn_newmail_manu  = checkbtn_newmail_manu;
1114         receive.hbox_newmail_notify    = hbox_newmail_notify;
1115         receive.entry_newmail_notify_cmd = entry_newmail_notify_cmd;
1116         receive.optmenu_recvdialog          = optmenu_recvdialog;
1117         receive.checkbtn_no_recv_err_panel  = checkbtn_no_recv_err_panel;
1118         receive.checkbtn_close_recv_dialog  = checkbtn_close_recv_dialog;
1119 }
1120
1121 static void prefs_send_create(void)
1122 {
1123         GtkWidget *vbox1;
1124         GtkWidget *vbox2;
1125         GtkWidget *hbox1;
1126         GtkWidget *checkbtn_savemsg;
1127         GtkWidget *label_outcharset;
1128         GtkWidget *optmenu_charset;
1129         GtkWidget *optmenu_menu;
1130         GtkWidget *menuitem;
1131         GtkTooltips *charset_tooltip;
1132         GtkWidget *optmenu_encoding;
1133         GtkWidget *label_encoding;
1134         GtkTooltips *encoding_tooltip;
1135         GtkWidget *label_senddialog;
1136         GtkWidget *menu;
1137         GtkWidget *optmenu_senddialog;
1138         GtkWidget *hbox_senddialog;
1139
1140         vbox1 = gtk_vbox_new (FALSE, VSPACING);
1141         gtk_widget_show (vbox1);
1142         gtk_container_add (GTK_CONTAINER (notebook), vbox1);
1143         gtk_container_set_border_width (GTK_CONTAINER (vbox1), VBOX_BORDER);
1144
1145         vbox2 = gtk_vbox_new (FALSE, 0);
1146         gtk_widget_show (vbox2);
1147         gtk_box_pack_start (GTK_BOX (vbox1), vbox2, FALSE, FALSE, 0);
1148
1149         PACK_CHECK_BUTTON (vbox2, checkbtn_savemsg,
1150                            _("Save sent messages to Sent folder"));
1151
1152         hbox_senddialog = gtk_hbox_new (FALSE, 8);
1153         gtk_box_pack_start (GTK_BOX (vbox1), hbox_senddialog, FALSE, FALSE, 0);
1154
1155         label_senddialog = gtk_label_new (_("Show send dialog"));
1156         gtk_widget_show (label_senddialog);
1157         gtk_box_pack_start (GTK_BOX (hbox_senddialog), label_senddialog, FALSE, FALSE, 0);
1158
1159         optmenu_senddialog = gtk_option_menu_new ();
1160         gtk_widget_show (optmenu_senddialog);
1161         gtk_box_pack_start (GTK_BOX (hbox_senddialog), optmenu_senddialog, FALSE, FALSE, 0);
1162         
1163         menu = gtk_menu_new ();
1164         MENUITEM_ADD (menu, menuitem, _("Always"), SEND_DIALOG_ALWAYS);
1165         MENUITEM_ADD (menu, menuitem, _("Never"), SEND_DIALOG_NEVER);
1166
1167         gtk_option_menu_set_menu (GTK_OPTION_MENU (optmenu_senddialog), menu);
1168
1169         hbox1 = gtk_hbox_new (FALSE, 8);
1170         gtk_widget_show (hbox1);
1171         gtk_box_pack_start (GTK_BOX (vbox1), hbox1, FALSE, FALSE, 0);
1172
1173         label_outcharset = gtk_label_new (_("Outgoing encoding"));
1174         gtk_widget_show (label_outcharset);
1175         gtk_box_pack_start (GTK_BOX (hbox1), label_outcharset, FALSE, FALSE, 0);
1176
1177         charset_tooltip = gtk_tooltips_new();
1178
1179         optmenu_charset = gtk_option_menu_new ();
1180         gtk_widget_show (optmenu_charset);
1181         gtk_tooltips_set_tip(GTK_TOOLTIPS(charset_tooltip), optmenu_charset,
1182                              _("If `Automatic' is selected, the optimal encoding"
1183                                " for the current locale will be used"),
1184                              NULL);
1185         gtk_box_pack_start (GTK_BOX (hbox1), optmenu_charset, FALSE, FALSE, 0);
1186
1187         optmenu_menu = gtk_menu_new ();
1188
1189 #define SET_MENUITEM(str, data) \
1190 { \
1191         MENUITEM_ADD(optmenu_menu, menuitem, str, data); \
1192 }
1193
1194         SET_MENUITEM(_("Automatic (Recommended)"),       CS_AUTO);
1195         SET_MENUITEM(NULL, NULL);
1196         SET_MENUITEM(_("7bit ascii (US-ASCII)"),         CS_US_ASCII);
1197         SET_MENUITEM(NULL, NULL);
1198         SET_MENUITEM(_("Unicode (UTF-8)"),               CS_UTF_8);
1199         SET_MENUITEM(NULL, NULL);
1200         SET_MENUITEM(_("Western European (ISO-8859-1)"),  CS_ISO_8859_1);
1201         SET_MENUITEM(_("Western European (ISO-8859-15)"), CS_ISO_8859_15);
1202         SET_MENUITEM(NULL, NULL);
1203         SET_MENUITEM(_("Central European (ISO-8859-2)"),  CS_ISO_8859_2);
1204         SET_MENUITEM(NULL, NULL);
1205         SET_MENUITEM(_("Baltic (ISO-8859-13)"),           CS_ISO_8859_13);
1206         SET_MENUITEM(_("Baltic (ISO-8859-4)"),            CS_ISO_8859_4);
1207         SET_MENUITEM(NULL, NULL);
1208         SET_MENUITEM(_("Greek (ISO-8859-7)"),             CS_ISO_8859_7);
1209         SET_MENUITEM(NULL, NULL);
1210         SET_MENUITEM(_("Turkish (ISO-8859-9)"),           CS_ISO_8859_9);
1211         SET_MENUITEM(NULL, NULL);
1212         SET_MENUITEM(_("Cyrillic (ISO-8859-5)"),          CS_ISO_8859_5);
1213         SET_MENUITEM(_("Cyrillic (KOI8-R)"),             CS_KOI8_R);
1214         SET_MENUITEM(_("Cyrillic (KOI8-U)"),             CS_KOI8_U);
1215         SET_MENUITEM(_("Cyrillic (Windows-1251)"),       CS_WINDOWS_1251);
1216         SET_MENUITEM(NULL, NULL);
1217         SET_MENUITEM(_("Japanese (ISO-2022-JP)"),        CS_ISO_2022_JP);
1218 #if 0
1219         SET_MENUITEM(_("Japanese (EUC-JP)"),             CS_EUC_JP);
1220         SET_MENUITEM(_("Japanese (Shift_JIS)"),          CS_SHIFT_JIS);
1221 #endif /* 0 */
1222         SET_MENUITEM(NULL, NULL);
1223         SET_MENUITEM(_("Simplified Chinese (GB2312)"),   CS_GB2312);
1224         SET_MENUITEM(_("Simplified Chinese (GBK)"),      CS_GBK);
1225         SET_MENUITEM(_("Traditional Chinese (Big5)"),    CS_BIG5);
1226 #if 0
1227         SET_MENUITEM(_("Traditional Chinese (EUC-TW)"),  CS_EUC_TW);
1228         SET_MENUITEM(_("Chinese (ISO-2022-CN)"),         CS_ISO_2022_CN);
1229 #endif /* 0 */
1230         SET_MENUITEM(NULL, NULL);
1231         SET_MENUITEM(_("Korean (EUC-KR)"),               CS_EUC_KR);
1232         SET_MENUITEM(NULL, NULL);
1233         SET_MENUITEM(_("Thai (TIS-620)"),                CS_TIS_620);
1234         SET_MENUITEM(_("Thai (Windows-874)"),            CS_WINDOWS_874);
1235
1236         gtk_option_menu_set_menu (GTK_OPTION_MENU (optmenu_charset),
1237                                   optmenu_menu);
1238
1239         hbox1 = gtk_hbox_new (FALSE, 8);
1240         gtk_widget_show (hbox1);
1241         gtk_box_pack_start (GTK_BOX (vbox1), hbox1, FALSE, FALSE, 0);
1242
1243         hbox1 = gtk_hbox_new (FALSE, 8);
1244         gtk_widget_show (hbox1);
1245         gtk_box_pack_start (GTK_BOX (vbox1), hbox1, FALSE, FALSE, 0);
1246
1247         label_encoding = gtk_label_new (_("Transfer encoding"));
1248         gtk_widget_show (label_encoding);
1249         gtk_box_pack_start (GTK_BOX (hbox1), label_encoding, FALSE, FALSE, 0);
1250
1251         encoding_tooltip = gtk_tooltips_new();
1252
1253         optmenu_encoding = gtk_option_menu_new ();
1254         gtk_widget_show (optmenu_encoding);
1255         gtk_tooltips_set_tip(GTK_TOOLTIPS(encoding_tooltip), optmenu_encoding,
1256                              _("Specify Content-Transfer-Encoding used when"
1257                                " message body contains non-ASCII characters"),
1258                              NULL);
1259         gtk_box_pack_start (GTK_BOX (hbox1), optmenu_encoding, FALSE, FALSE, 0);
1260
1261         optmenu_menu = gtk_menu_new ();
1262
1263         SET_MENUITEM(_("Automatic"),     CTE_AUTO);
1264         SET_MENUITEM("base64",           CTE_BASE64);
1265         SET_MENUITEM("quoted-printable", CTE_QUOTED_PRINTABLE);
1266         SET_MENUITEM("8bit",             CTE_8BIT);
1267
1268         gtk_option_menu_set_menu (GTK_OPTION_MENU (optmenu_encoding),
1269                                   optmenu_menu);
1270
1271         hbox1 = gtk_hbox_new (FALSE, 8);
1272         gtk_widget_show (hbox1);
1273         gtk_box_pack_start (GTK_BOX (vbox1), hbox1, FALSE, FALSE, 0);
1274
1275         p_send.checkbtn_savemsg  = checkbtn_savemsg;
1276         p_send.optmenu_senddialog = optmenu_senddialog;
1277
1278         p_send.optmenu_charset = optmenu_charset;
1279         p_send.optmenu_encoding_method = optmenu_encoding;
1280 }
1281
1282 static void prefs_common_recv_dialog_newmail_notify_toggle_cb(GtkWidget *w, gpointer data)
1283 {
1284         gboolean toggled;
1285
1286         toggled = gtk_toggle_button_get_active
1287                         (GTK_TOGGLE_BUTTON(receive.checkbtn_newmail_manu)) ||
1288                   gtk_toggle_button_get_active
1289                         (GTK_TOGGLE_BUTTON(receive.checkbtn_newmail_auto));
1290         gtk_widget_set_sensitive(receive.hbox_newmail_notify, toggled);
1291 }
1292
1293 static void prefs_message_create(void)
1294 {
1295         GtkWidget *vbox1;
1296         GtkWidget *vbox2;
1297         GtkWidget *vbox3;
1298         GtkWidget *hbox1;
1299         GtkWidget *chkbtn_mbalnum;
1300         GtkWidget *chkbtn_disphdrpane;
1301         GtkWidget *chkbtn_disphdr;
1302         GtkWidget *button_edit_disphdr;
1303         GtkWidget *chkbtn_html;
1304         GtkWidget *chkbtn_cursor;
1305         GtkWidget *hbox_linespc;
1306         GtkWidget *label_linespc;
1307         GtkObject *spinbtn_linespc_adj;
1308         GtkWidget *spinbtn_linespc;
1309
1310         GtkWidget *frame_scr;
1311         GtkWidget *vbox_scr;
1312         GtkWidget *chkbtn_smoothscroll;
1313         GtkWidget *hbox_scr;
1314         GtkWidget *label_scr;
1315         GtkObject *spinbtn_scrollstep_adj;
1316         GtkWidget *spinbtn_scrollstep;
1317         GtkWidget *chkbtn_halfpage;
1318
1319         GtkWidget *chkbtn_attach_desc;
1320
1321         vbox1 = gtk_vbox_new (FALSE, VSPACING);
1322         gtk_widget_show (vbox1);
1323         gtk_container_add (GTK_CONTAINER (notebook), vbox1);
1324         gtk_container_set_border_width (GTK_CONTAINER (vbox1), VBOX_BORDER);
1325
1326         vbox2 = gtk_vbox_new (FALSE, 0);
1327         gtk_widget_show (vbox2);
1328         gtk_box_pack_start (GTK_BOX (vbox1), vbox2, FALSE, FALSE, 0);
1329
1330         PACK_CHECK_BUTTON
1331                 (vbox2, chkbtn_mbalnum,
1332                  _("Display multi-byte alphanumeric as\n"
1333                    "ASCII character (Japanese only)"));
1334         gtk_label_set_justify (GTK_LABEL (GTK_BIN(chkbtn_mbalnum)->child),
1335                                GTK_JUSTIFY_LEFT);
1336
1337         PACK_CHECK_BUTTON(vbox2, chkbtn_disphdrpane,
1338                           _("Display header pane above message view"));
1339
1340         hbox1 = gtk_hbox_new (FALSE, 8);
1341         gtk_widget_show (hbox1);
1342         gtk_box_pack_start (GTK_BOX (vbox2), hbox1, FALSE, TRUE, 0);
1343
1344         PACK_CHECK_BUTTON(hbox1, chkbtn_disphdr,
1345                           _("Display short headers on message view"));
1346
1347         button_edit_disphdr = gtk_button_new_with_label (_(" Edit... "));
1348         gtk_widget_show (button_edit_disphdr);
1349         gtk_box_pack_end (GTK_BOX (hbox1), button_edit_disphdr,
1350                           FALSE, TRUE, 0);
1351         g_signal_connect (G_OBJECT (button_edit_disphdr), "clicked",
1352                           G_CALLBACK (prefs_display_header_open),
1353                           NULL);
1354
1355         SET_TOGGLE_SENSITIVITY(chkbtn_disphdr, button_edit_disphdr);
1356
1357         PACK_CHECK_BUTTON(vbox2, chkbtn_html,
1358                           _("Render HTML messages as text"));
1359
1360         PACK_CHECK_BUTTON(vbox2, chkbtn_cursor,
1361                           _("Display cursor in message view"));
1362
1363         PACK_VSPACER(vbox2, vbox3, VSPACING_NARROW_2);
1364
1365         hbox1 = gtk_hbox_new (FALSE, 32);
1366         gtk_widget_show (hbox1);
1367         gtk_box_pack_start (GTK_BOX (vbox2), hbox1, FALSE, TRUE, 0);
1368
1369         hbox_linespc = gtk_hbox_new (FALSE, 8);
1370         gtk_widget_show (hbox1);
1371         gtk_box_pack_start (GTK_BOX (hbox1), hbox_linespc, FALSE, TRUE, 0);
1372
1373         label_linespc = gtk_label_new (_("Line space"));
1374         gtk_widget_show (label_linespc);
1375         gtk_box_pack_start (GTK_BOX (hbox_linespc), label_linespc,
1376                             FALSE, FALSE, 0);
1377
1378         spinbtn_linespc_adj = gtk_adjustment_new (2, 0, 16, 1, 1, 16);
1379         spinbtn_linespc = gtk_spin_button_new
1380                 (GTK_ADJUSTMENT (spinbtn_linespc_adj), 1, 0);
1381         gtk_widget_show (spinbtn_linespc);
1382         gtk_box_pack_start (GTK_BOX (hbox_linespc), spinbtn_linespc,
1383                             FALSE, FALSE, 0);
1384         gtk_widget_set_size_request (spinbtn_linespc, 64, -1);
1385         gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (spinbtn_linespc), TRUE);
1386
1387         label_linespc = gtk_label_new (_("pixel(s)"));
1388         gtk_widget_show (label_linespc);
1389         gtk_box_pack_start (GTK_BOX (hbox_linespc), label_linespc,
1390                             FALSE, FALSE, 0);
1391
1392         PACK_FRAME(vbox1, frame_scr, _("Scroll"));
1393
1394         vbox_scr = gtk_vbox_new (FALSE, 0);
1395         gtk_widget_show (vbox_scr);
1396         gtk_container_add (GTK_CONTAINER (frame_scr), vbox_scr);
1397         gtk_container_set_border_width (GTK_CONTAINER (vbox_scr), 8);
1398
1399         PACK_CHECK_BUTTON(vbox_scr, chkbtn_halfpage, _("Half page"));
1400
1401         hbox1 = gtk_hbox_new (FALSE, 32);
1402         gtk_widget_show (hbox1);
1403         gtk_box_pack_start (GTK_BOX (vbox_scr), hbox1, FALSE, TRUE, 0);
1404
1405         PACK_CHECK_BUTTON(hbox1, chkbtn_smoothscroll, _("Smooth scroll"));
1406
1407         hbox_scr = gtk_hbox_new (FALSE, 8);
1408         gtk_widget_show (hbox_scr);
1409         gtk_box_pack_start (GTK_BOX (hbox1), hbox_scr, FALSE, FALSE, 0);
1410
1411         label_scr = gtk_label_new (_("Step"));
1412         gtk_widget_show (label_scr);
1413         gtk_box_pack_start (GTK_BOX (hbox_scr), label_scr, FALSE, FALSE, 0);
1414
1415         spinbtn_scrollstep_adj = gtk_adjustment_new (1, 1, 100, 1, 10, 10);
1416         spinbtn_scrollstep = gtk_spin_button_new
1417                 (GTK_ADJUSTMENT (spinbtn_scrollstep_adj), 1, 0);
1418         gtk_widget_show (spinbtn_scrollstep);
1419         gtk_box_pack_start (GTK_BOX (hbox_scr), spinbtn_scrollstep,
1420                             FALSE, FALSE, 0);
1421         gtk_widget_set_size_request (spinbtn_scrollstep, 64, -1);
1422         gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (spinbtn_scrollstep),
1423                                      TRUE);
1424
1425         label_scr = gtk_label_new (_("pixel(s)"));
1426         gtk_widget_show (label_scr);
1427         gtk_box_pack_start (GTK_BOX (hbox_scr), label_scr, FALSE, FALSE, 0);
1428
1429         SET_TOGGLE_SENSITIVITY (chkbtn_smoothscroll, hbox_scr)
1430
1431         vbox3 = gtk_vbox_new (FALSE, 0);
1432         gtk_widget_show (vbox3);
1433         gtk_box_pack_start (GTK_BOX (vbox1), vbox3, FALSE, FALSE, 0);
1434
1435         PACK_CHECK_BUTTON(vbox3, chkbtn_attach_desc,
1436                           _("Show attachment descriptions (rather than names)"));
1437
1438         message.chkbtn_mbalnum     = chkbtn_mbalnum;
1439         message.chkbtn_disphdrpane = chkbtn_disphdrpane;
1440         message.chkbtn_disphdr     = chkbtn_disphdr;
1441         message.chkbtn_html        = chkbtn_html;
1442         message.chkbtn_cursor      = chkbtn_cursor;
1443         message.spinbtn_linespc    = spinbtn_linespc;
1444
1445         message.chkbtn_smoothscroll    = chkbtn_smoothscroll;
1446         message.spinbtn_scrollstep     = spinbtn_scrollstep;
1447         message.spinbtn_scrollstep_adj = spinbtn_scrollstep_adj;
1448         message.chkbtn_halfpage        = chkbtn_halfpage;
1449
1450         message.chkbtn_attach_desc  = chkbtn_attach_desc;
1451 }
1452
1453 static void prefs_interface_create(void)
1454 {
1455         GtkWidget *vbox1;
1456         GtkWidget *vbox2;
1457         GtkWidget *vbox3;
1458         /* GtkWidget *checkbtn_emacs; */
1459         GtkWidget *checkbtn_always_show_msg;
1460         GtkWidget *checkbtn_openunread;
1461         GtkWidget *checkbtn_mark_as_read_on_newwin;
1462         GtkWidget *checkbtn_openinbox;
1463         GtkWidget *checkbtn_immedexec;
1464         GtkTooltips *immedexec_tooltip;
1465         GtkWidget *hbox1;
1466         GtkWidget *label;
1467         GtkWidget *menu;
1468         GtkWidget *menuitem;
1469
1470         GtkWidget *button_keybind;
1471
1472         GtkWidget *hbox_nextunreadmsgdialog;
1473         GtkWidget *optmenu_nextunreadmsgdialog;
1474
1475         vbox1 = gtk_vbox_new (FALSE, VSPACING);
1476         gtk_widget_show (vbox1);
1477         gtk_container_add (GTK_CONTAINER (notebook), vbox1);
1478         gtk_container_set_border_width (GTK_CONTAINER (vbox1), VBOX_BORDER);
1479
1480         vbox2 = gtk_vbox_new (FALSE, 0);
1481         gtk_widget_show (vbox2);
1482         gtk_box_pack_start (GTK_BOX (vbox1), vbox2, FALSE, FALSE, 0);
1483
1484         /* PACK_CHECK_BUTTON (vbox2, checkbtn_emacs,
1485                            _("Emulate the behavior of mouse operation of\n"
1486                              "Emacs-based mailer"));
1487         gtk_label_set_justify (GTK_LABEL (GTK_BIN (checkbtn_emacs)->child),
1488                                GTK_JUSTIFY_LEFT);   */
1489
1490         PACK_CHECK_BUTTON
1491                 (vbox2, checkbtn_always_show_msg,
1492                  _("Always open messages in summary when selected"));
1493
1494         PACK_CHECK_BUTTON
1495                 (vbox2, checkbtn_openunread,
1496                  _("Open first unread message when entering a folder"));
1497
1498         PACK_CHECK_BUTTON
1499                 (vbox2, checkbtn_mark_as_read_on_newwin,
1500                  _("Only mark message as read when opened in new window"));
1501
1502         PACK_CHECK_BUTTON
1503                 (vbox2, checkbtn_openinbox,
1504                  _("Go to inbox after receiving new mail"));
1505
1506         vbox3 = gtk_vbox_new (FALSE, 0);
1507         gtk_widget_show (vbox3);
1508         gtk_box_pack_start (GTK_BOX (vbox2), vbox3, FALSE, FALSE, 0);
1509
1510         immedexec_tooltip = gtk_tooltips_new();
1511
1512         PACK_CHECK_BUTTON
1513                 (vbox3, checkbtn_immedexec,
1514                  _("Execute immediately when moving or deleting messages"));
1515         gtk_tooltips_set_tip(GTK_TOOLTIPS(immedexec_tooltip), checkbtn_immedexec,
1516                              _("Messages will be marked until execution"
1517                                " if this is turned off"),
1518                              NULL);
1519
1520         hbox1 = gtk_hbox_new (FALSE, 0);
1521         gtk_widget_show (hbox1);
1522         gtk_box_pack_start (GTK_BOX (vbox3), hbox1, FALSE, FALSE, 0);
1523
1524         /* Next Unread Message Dialog */
1525         hbox_nextunreadmsgdialog = gtk_hbox_new (FALSE, 8);
1526         gtk_widget_show (hbox1);
1527         gtk_box_pack_start (GTK_BOX (vbox1), hbox_nextunreadmsgdialog, FALSE, FALSE, 0);
1528
1529         label = gtk_label_new (_("Show no-unread-message dialog"));
1530         gtk_widget_show (label);
1531         gtk_box_pack_start (GTK_BOX (hbox_nextunreadmsgdialog), label, FALSE, FALSE, 8);
1532
1533         optmenu_nextunreadmsgdialog = gtk_option_menu_new ();
1534         gtk_widget_show (optmenu_nextunreadmsgdialog);
1535         gtk_box_pack_start (GTK_BOX (hbox_nextunreadmsgdialog), optmenu_nextunreadmsgdialog, FALSE, FALSE, 8);
1536         
1537         menu = gtk_menu_new ();
1538         MENUITEM_ADD (menu, menuitem, _("Always"), NEXTUNREADMSGDIALOG_ALWAYS);
1539         MENUITEM_ADD (menu, menuitem, _("Assume 'Yes'"), 
1540                       NEXTUNREADMSGDIALOG_ASSUME_YES);
1541         MENUITEM_ADD (menu, menuitem, _("Assume 'No'"), 
1542                       NEXTUNREADMSGDIALOG_ASSUME_NO);
1543
1544         gtk_option_menu_set_menu (GTK_OPTION_MENU (optmenu_nextunreadmsgdialog), menu);
1545
1546         hbox1 = gtk_hbox_new (FALSE, 8);
1547         gtk_widget_show (hbox1);
1548         gtk_box_pack_start (GTK_BOX (vbox1), hbox1, FALSE, FALSE, 0);
1549
1550         button_keybind = gtk_button_new_with_label (_(" Set key bindings... "));
1551         gtk_widget_show (button_keybind);
1552         gtk_box_pack_start (GTK_BOX (hbox1), button_keybind, FALSE, FALSE, 0);
1553         g_signal_connect (G_OBJECT (button_keybind), "clicked",
1554                           G_CALLBACK (prefs_keybind_select), NULL);
1555
1556         /* interface.checkbtn_emacs          = checkbtn_emacs; */
1557         interface.checkbtn_always_show_msg    = checkbtn_always_show_msg;
1558         interface.checkbtn_openunread         = checkbtn_openunread;
1559         interface.checkbtn_mark_as_read_on_newwin
1560                                               = checkbtn_mark_as_read_on_newwin;
1561         interface.checkbtn_openinbox          = checkbtn_openinbox;
1562         interface.checkbtn_immedexec          = checkbtn_immedexec;
1563         interface.optmenu_nextunreadmsgdialog = optmenu_nextunreadmsgdialog;
1564 }
1565
1566 static void prefs_other_create(void)
1567 {
1568         GtkWidget *vbox1;
1569         GtkWidget *hbox1;
1570
1571         GtkWidget *frame_addr;
1572         GtkWidget *vbox_addr;
1573         GtkWidget *checkbtn_addaddrbyclick;
1574         
1575         GtkWidget *frame_cliplog;
1576         GtkWidget *vbox_cliplog;
1577         GtkWidget *hbox_cliplog;
1578         GtkWidget *checkbtn_cliplog;
1579         GtkWidget *loglength_label;
1580         GtkWidget *loglength_entry;
1581         GtkTooltips *loglength_tooltip;
1582
1583         GtkWidget *frame_exit;
1584         GtkWidget *vbox_exit;
1585         GtkWidget *checkbtn_confonexit;
1586         GtkWidget *checkbtn_cleanonexit;
1587         GtkWidget *checkbtn_askonclean;
1588         GtkWidget *checkbtn_warnqueued;
1589
1590         GtkWidget *label_iotimeout;
1591         GtkWidget *spinbtn_iotimeout;
1592         GtkObject *spinbtn_iotimeout_adj;
1593
1594 #if 0
1595 #ifdef USE_OPENSSL
1596         GtkWidget *frame_ssl;
1597         GtkWidget *vbox_ssl;
1598         GtkWidget *hbox_ssl;
1599         GtkWidget *checkbtn_ssl_ask_unknown_valid;
1600 #endif
1601 #endif
1602         vbox1 = gtk_vbox_new (FALSE, VSPACING);
1603         gtk_widget_show (vbox1);
1604         gtk_container_add (GTK_CONTAINER (notebook), vbox1);
1605         gtk_container_set_border_width (GTK_CONTAINER (vbox1), VBOX_BORDER);
1606
1607         PACK_FRAME (vbox1, frame_addr, _("Address book"));
1608
1609         vbox_addr = gtk_vbox_new (FALSE, 0);
1610         gtk_widget_show (vbox_addr);
1611         gtk_container_add (GTK_CONTAINER (frame_addr), vbox_addr);
1612         gtk_container_set_border_width (GTK_CONTAINER (vbox_addr), 8);
1613
1614         PACK_CHECK_BUTTON
1615                 (vbox_addr, checkbtn_addaddrbyclick,
1616                  _("Add address to destination when double-clicked"));
1617
1618         /* Clip Log */
1619         PACK_FRAME (vbox1, frame_cliplog, _("Log Size"));
1620
1621         vbox_cliplog = gtk_vbox_new (FALSE, 0);
1622         gtk_widget_show (vbox_cliplog);
1623         gtk_container_add (GTK_CONTAINER (frame_cliplog), vbox_cliplog);
1624         gtk_container_set_border_width (GTK_CONTAINER (vbox_cliplog), 8);
1625         PACK_CHECK_BUTTON (vbox_cliplog, checkbtn_cliplog,
1626                            _("Clip the log size"));
1627         hbox_cliplog = gtk_hbox_new (FALSE, 3);
1628         gtk_container_add (GTK_CONTAINER (vbox_cliplog), hbox_cliplog);
1629         gtk_widget_show (hbox_cliplog);
1630         
1631         loglength_label = gtk_label_new (_("Log window length"));
1632         gtk_box_pack_start (GTK_BOX (hbox_cliplog), loglength_label,
1633                             FALSE, TRUE, 0);
1634         gtk_widget_show (GTK_WIDGET (loglength_label));
1635         
1636         loglength_tooltip = gtk_tooltips_new();
1637         
1638         loglength_entry = gtk_entry_new ();
1639         gtk_widget_set_size_request (GTK_WIDGET (loglength_entry), 64, -1);
1640         gtk_box_pack_start (GTK_BOX (hbox_cliplog), loglength_entry,
1641                             FALSE, TRUE, 0);
1642         gtk_widget_show (GTK_WIDGET (loglength_entry));
1643         gtk_tooltips_set_tip(GTK_TOOLTIPS(loglength_tooltip), loglength_entry,
1644                              _("0 to stop logging in the log window"),
1645                              NULL);
1646         SET_TOGGLE_SENSITIVITY(checkbtn_cliplog, loglength_entry);
1647
1648 #if 0
1649 #ifdef USE_OPENSSL
1650         /* SSL */
1651         PACK_FRAME (vbox1, frame_ssl, _("Security"));
1652
1653         vbox_ssl = gtk_vbox_new (FALSE, 0);
1654         gtk_widget_show (vbox_ssl);
1655         gtk_container_add (GTK_CONTAINER (frame_ssl), vbox_ssl);
1656         gtk_container_set_border_width (GTK_CONTAINER (vbox_ssl), 8);
1657         PACK_CHECK_BUTTON (vbox_ssl, checkbtn_ssl_ask_unknown_valid, 
1658                            _("Ask before accepting SSL certificates"));
1659         hbox_ssl = gtk_hbox_new (FALSE, 3);
1660         gtk_container_add (GTK_CONTAINER (vbox_ssl), hbox_ssl);
1661         gtk_widget_show (hbox_ssl);
1662 #endif
1663 #endif
1664         
1665         /* On Exit */
1666         PACK_FRAME (vbox1, frame_exit, _("On exit"));
1667
1668         vbox_exit = gtk_vbox_new (FALSE, 0);
1669         gtk_widget_show (vbox_exit);
1670         gtk_container_add (GTK_CONTAINER (frame_exit), vbox_exit);
1671         gtk_container_set_border_width (GTK_CONTAINER (vbox_exit), 8);
1672
1673         PACK_CHECK_BUTTON (vbox_exit, checkbtn_confonexit,
1674                            _("Confirm on exit"));
1675
1676         hbox1 = gtk_hbox_new (FALSE, 32);
1677         gtk_widget_show (hbox1);
1678         gtk_box_pack_start (GTK_BOX (vbox_exit), hbox1, FALSE, FALSE, 0);
1679
1680         PACK_CHECK_BUTTON (hbox1, checkbtn_cleanonexit,
1681                            _("Empty trash on exit"));
1682         PACK_CHECK_BUTTON (hbox1, checkbtn_askonclean,
1683                            _("Ask before emptying"));
1684         SET_TOGGLE_SENSITIVITY (checkbtn_cleanonexit, checkbtn_askonclean);
1685
1686         PACK_CHECK_BUTTON (vbox_exit, checkbtn_warnqueued,
1687                            _("Warn if there are queued messages"));
1688
1689         hbox1 = gtk_hbox_new (FALSE, 8);
1690         gtk_widget_show (hbox1);
1691         gtk_box_pack_start (GTK_BOX (vbox1), hbox1, FALSE, FALSE, 0);
1692
1693         label_iotimeout = gtk_label_new (_("Socket I/O timeout:"));
1694         gtk_widget_show (label_iotimeout);
1695         gtk_box_pack_start (GTK_BOX (hbox1), label_iotimeout, FALSE, FALSE, 0);
1696
1697         spinbtn_iotimeout_adj = gtk_adjustment_new (60, 0, 1000, 1, 10, 10);
1698         spinbtn_iotimeout = gtk_spin_button_new
1699                 (GTK_ADJUSTMENT (spinbtn_iotimeout_adj), 1, 0);
1700         gtk_widget_show (spinbtn_iotimeout);
1701         gtk_box_pack_start (GTK_BOX (hbox1), spinbtn_iotimeout,
1702                             FALSE, FALSE, 0);
1703         gtk_widget_set_size_request (spinbtn_iotimeout, 64, -1);
1704         gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (spinbtn_iotimeout), TRUE);
1705
1706         label_iotimeout = gtk_label_new (_("seconds"));
1707         gtk_widget_show (label_iotimeout);
1708         gtk_box_pack_start (GTK_BOX (hbox1), label_iotimeout, FALSE, FALSE, 0);
1709
1710         other.checkbtn_addaddrbyclick = checkbtn_addaddrbyclick;
1711         
1712         other.checkbtn_cliplog     = checkbtn_cliplog;
1713         other.loglength_entry      = loglength_entry;
1714
1715         other.checkbtn_confonexit  = checkbtn_confonexit;
1716         other.checkbtn_cleanonexit = checkbtn_cleanonexit;
1717         other.checkbtn_askonclean  = checkbtn_askonclean;
1718         other.checkbtn_warnqueued  = checkbtn_warnqueued;
1719
1720         other.spinbtn_iotimeout     = spinbtn_iotimeout;
1721         other.spinbtn_iotimeout_adj = spinbtn_iotimeout_adj;
1722         
1723 #if 0
1724 #ifdef USE_OPENSSL
1725         other.checkbtn_ssl_ask_unknown_valid = checkbtn_ssl_ask_unknown_valid;
1726 #endif
1727 #endif
1728 }
1729
1730 static void date_format_ok_btn_clicked(GtkButton *button, GtkWidget **widget)
1731 {
1732         GtkWidget *datefmt_sample = NULL;
1733         gchar *text;
1734
1735         g_return_if_fail(widget != NULL);
1736         g_return_if_fail(*widget != NULL);
1737         g_return_if_fail(display.entry_datefmt != NULL);
1738
1739         datefmt_sample = GTK_WIDGET(g_object_get_data
1740                                     (G_OBJECT(*widget), "datefmt_sample"));
1741         g_return_if_fail(datefmt_sample != NULL);
1742
1743         text = gtk_editable_get_chars(GTK_EDITABLE(datefmt_sample), 0, -1);
1744         g_free(prefs_common.date_format);
1745         prefs_common.date_format = text;
1746         gtk_entry_set_text(GTK_ENTRY(display.entry_datefmt), text);
1747
1748         gtk_widget_destroy(*widget);
1749         *widget = NULL;
1750 }
1751
1752 static void date_format_cancel_btn_clicked(GtkButton *button,
1753                                            GtkWidget **widget)
1754 {
1755         g_return_if_fail(widget != NULL);
1756         g_return_if_fail(*widget != NULL);
1757
1758         gtk_widget_destroy(*widget);
1759         *widget = NULL;
1760 }
1761
1762 static gboolean date_format_key_pressed(GtkWidget *keywidget, GdkEventKey *event,
1763                                         GtkWidget **widget)
1764 {
1765         if (event && event->keyval == GDK_Escape)
1766                 date_format_cancel_btn_clicked(NULL, widget);
1767         return FALSE;
1768 }
1769
1770 static gboolean date_format_on_delete(GtkWidget *dialogwidget,
1771                                       GdkEventAny *event, GtkWidget **widget)
1772 {
1773         g_return_val_if_fail(widget != NULL, FALSE);
1774         g_return_val_if_fail(*widget != NULL, FALSE);
1775
1776         *widget = NULL;
1777         return FALSE;
1778 }
1779
1780 static void date_format_entry_on_change(GtkEditable *editable,
1781                                         GtkLabel *example)
1782 {
1783         time_t cur_time;
1784         struct tm *cal_time;
1785         gchar buffer[100];
1786         gchar *text;
1787
1788         cur_time = time(NULL);
1789         cal_time = localtime(&cur_time);
1790         buffer[0] = 0;
1791         text = gtk_editable_get_chars(editable, 0, -1);
1792         if (text)
1793                 strftime(buffer, sizeof buffer, text, cal_time); 
1794         g_free(text);
1795
1796         text = conv_codeset_strdup(buffer,
1797                                    conv_get_locale_charset_str(),
1798                                    CS_UTF_8);
1799         if (!text)
1800                 text = g_strdup(buffer);
1801
1802         gtk_label_set_text(example, text);
1803
1804         g_free(text);
1805 }
1806
1807 static void date_format_select_row(GtkTreeView *list_view,
1808                                    GtkTreePath *path,
1809                                    GtkTreeViewColumn *column,
1810                                    GtkWidget *date_format)
1811 {
1812         gint cur_pos;
1813         gchar *format;
1814         const gchar *old_format;
1815         gchar *new_format;
1816         GtkWidget *datefmt_sample;
1817         GtkTreeIter iter;
1818         GtkTreeModel *model;
1819         
1820         g_return_if_fail(date_format != NULL);
1821
1822         /* only on double click */
1823         datefmt_sample = GTK_WIDGET(g_object_get_data(G_OBJECT(date_format), 
1824                                                       "datefmt_sample"));
1825
1826         g_return_if_fail(datefmt_sample != NULL);
1827
1828         model = gtk_tree_view_get_model(list_view);
1829
1830         /* get format from list */
1831         if (!gtk_tree_model_get_iter(model, &iter, path))
1832                 return;
1833
1834         gtk_tree_model_get(model, &iter, DATEFMT_FMT, &format, -1);             
1835         
1836         cur_pos = gtk_editable_get_position(GTK_EDITABLE(datefmt_sample));
1837         old_format = gtk_entry_get_text(GTK_ENTRY(datefmt_sample));
1838
1839         /* insert the format into the text entry */
1840         new_format = g_malloc(strlen(old_format) + 3);
1841
1842         strncpy(new_format, old_format, cur_pos);
1843         new_format[cur_pos] = '\0';
1844         strcat(new_format, format);
1845         strcat(new_format, &old_format[cur_pos]);
1846
1847         gtk_entry_set_text(GTK_ENTRY(datefmt_sample), new_format);
1848         gtk_editable_set_position(GTK_EDITABLE(datefmt_sample), cur_pos + 2);
1849
1850         g_free(new_format);
1851 }
1852
1853 static void prefs_keybind_select(void)
1854 {
1855         GtkWidget *window;
1856         GtkWidget *vbox1;
1857         GtkWidget *hbox1;
1858         GtkWidget *label;
1859         GtkWidget *combo;
1860         GtkWidget *confirm_area;
1861         GtkWidget *ok_btn;
1862         GtkWidget *cancel_btn;
1863
1864         window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
1865         gtk_container_set_border_width (GTK_CONTAINER (window), 8);
1866         gtk_window_set_title (GTK_WINDOW (window), _("Key bindings"));
1867         gtk_window_set_position (GTK_WINDOW (window), GTK_WIN_POS_CENTER);
1868         gtk_window_set_modal (GTK_WINDOW (window), TRUE);
1869         gtk_window_set_resizable(GTK_WINDOW (window), FALSE);
1870         manage_window_set_transient (GTK_WINDOW (window));
1871
1872         vbox1 = gtk_vbox_new (FALSE, VSPACING);
1873         gtk_container_add (GTK_CONTAINER (window), vbox1);
1874         gtk_container_set_border_width (GTK_CONTAINER (vbox1), 2);
1875
1876         hbox1 = gtk_hbox_new (FALSE, 8);
1877         gtk_box_pack_start (GTK_BOX (vbox1), hbox1, FALSE, FALSE, 0);
1878
1879         label = gtk_label_new
1880                 (_("Select preset:"));
1881         gtk_box_pack_start (GTK_BOX (hbox1), label, FALSE, FALSE, 0);
1882         gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT);
1883
1884         hbox1 = gtk_hbox_new (FALSE, 8);
1885         gtk_box_pack_start (GTK_BOX (vbox1), hbox1, FALSE, FALSE, 0);
1886
1887         combo = gtk_combo_new ();
1888         gtk_box_pack_start (GTK_BOX (hbox1), combo, TRUE, TRUE, 0);
1889         gtkut_combo_set_items (GTK_COMBO (combo),
1890                                _("Default"),
1891                                "Mew / Wanderlust",
1892                                "Mutt",
1893                                _("Old Sylpheed"),
1894                                NULL);
1895         gtk_editable_set_editable(GTK_EDITABLE(GTK_COMBO (combo)->entry), FALSE);
1896
1897         hbox1 = gtk_hbox_new (FALSE, 8);
1898         gtk_box_pack_start (GTK_BOX (vbox1), hbox1, FALSE, FALSE, 0);
1899
1900         label = gtk_label_new
1901                 (_("You can also modify each menu shortcut by pressing\n"
1902                    "any key(s) when placing the mouse pointer on the item."));
1903         gtk_box_pack_start (GTK_BOX (hbox1), label, FALSE, FALSE, 0);
1904         gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT);
1905
1906         hbox1 = gtk_hbox_new (FALSE, 8);
1907         gtk_box_pack_start (GTK_BOX (vbox1), hbox1, FALSE, FALSE, 0);
1908
1909         gtkut_stock_button_set_create (&confirm_area, &ok_btn, GTK_STOCK_OK,
1910                                        &cancel_btn, GTK_STOCK_CANCEL,
1911                                        NULL, NULL);
1912         gtk_box_pack_end (GTK_BOX (hbox1), confirm_area, FALSE, FALSE, 0);
1913         gtk_widget_grab_default (ok_btn);
1914
1915         MANAGE_WINDOW_SIGNALS_CONNECT(window);
1916         g_signal_connect (G_OBJECT (window), "delete_event",
1917                           G_CALLBACK (prefs_keybind_deleted), NULL);
1918         g_signal_connect (G_OBJECT (window), "key_press_event",
1919                           G_CALLBACK (prefs_keybind_key_pressed), NULL);
1920         g_signal_connect (G_OBJECT (ok_btn), "clicked",
1921                           G_CALLBACK (prefs_keybind_apply_clicked),
1922                           NULL);
1923         g_signal_connect (G_OBJECT (cancel_btn), "clicked",
1924                           G_CALLBACK (prefs_keybind_cancel),
1925                           NULL);
1926
1927         gtk_widget_show_all(window);
1928
1929         keybind.window = window;
1930         keybind.combo = combo;
1931 }
1932
1933 static gboolean prefs_keybind_key_pressed(GtkWidget *widget, GdkEventKey *event,
1934                                           gpointer data)
1935 {
1936         if (event && event->keyval == GDK_Escape)
1937                 prefs_keybind_cancel();
1938         return FALSE;
1939 }
1940
1941 static gint prefs_keybind_deleted(GtkWidget *widget, GdkEventAny *event,
1942                                   gpointer data)
1943 {
1944         prefs_keybind_cancel();
1945         return TRUE;
1946 }
1947
1948 static void prefs_keybind_cancel(void)
1949 {
1950         gtk_widget_destroy(keybind.window);
1951         keybind.window = NULL;
1952         keybind.combo = NULL;
1953 }
1954   
1955 struct KeyBind {
1956         const gchar *accel_path;
1957         const gchar *accel_key;
1958 };
1959
1960 static void prefs_keybind_apply(struct KeyBind keybind[], gint num)
1961 {
1962         gint i;
1963         guint key;
1964         GdkModifierType mods;
1965
1966         for (i = 0; i < num; i++) {
1967                 const gchar *accel_key
1968                         = keybind[i].accel_key ? keybind[i].accel_key : "";
1969                 gtk_accelerator_parse(accel_key, &key, &mods);
1970                 gtk_accel_map_change_entry(keybind[i].accel_path,
1971                                            key, mods, TRUE);
1972         }
1973 }
1974
1975 static void prefs_keybind_apply_clicked(GtkWidget *widget)
1976 {
1977         GtkEntry *entry = GTK_ENTRY(GTK_COMBO(keybind.combo)->entry);
1978         const gchar *text;
1979         struct KeyBind *menurc;
1980         gint n_menurc;
1981
1982         static struct KeyBind default_menurc[] = {
1983                 {"<Main>/File/Empty all Trash folders",         ""},
1984                 {"<Main>/File/Save as...",                      "<control>S"},
1985                 {"<Main>/File/Print...",                        ""},
1986                 {"<Main>/File/Exit",                            "<control>Q"},
1987
1988                 {"<Main>/Edit/Copy",                            "<control>C"},
1989                 {"<Main>/Edit/Select all",                      "<control>A"},
1990                 {"<Main>/Edit/Find in current message...",      "<control>F"},
1991                 {"<Main>/Edit/Search folder...",                "<shift><control>F"},
1992
1993                 {"<Main>/View/Show or hide/Message View",       "V"},
1994                 {"<Main>/View/Thread view",                     "<control>T"},
1995                 {"<Main>/View/Go to/Prev message",              "P"},
1996                 {"<Main>/View/Go to/Next message",              "N"},
1997                 {"<Main>/View/Go to/Prev unread message",       "<shift>P"},
1998                 {"<Main>/View/Go to/Next unread message",       "<shift>N"},
1999                 {"<Main>/View/Go to/Other folder...",           "G"},
2000                 {"<Main>/View/Open in new window",              "<control><alt>N"},
2001                 {"<Main>/View/Message source",                  "<control>U"},
2002                 {"<Main>/View/Show all headers",                "<control>H"},
2003                 {"<Main>/View/Update summary",                  "<control><alt>U"},
2004
2005                 {"<Main>/Message/Receive/Get from current account",
2006                                                                 "<control>I"},
2007                 {"<Main>/Message/Receive/Get from all accounts","<shift><control>I"},
2008                 {"<Main>/Message/Compose an email message",     "<control>M"},
2009                 {"<Main>/Message/Reply",                        "<control>R"},
2010                 {"<Main>/Message/Reply to/all",                 "<shift><control>R"},
2011                 {"<Main>/Message/Reply to/sender",              ""},
2012                 {"<Main>/Message/Reply to/mailing list",        "<control>L"},
2013                 {"<Main>/Message/Forward",                      "<control><alt>F"},
2014                 /* {"<Main>/Message/Forward as attachment",      ""}, */
2015                 {"<Main>/Message/Move...",                      "<control>O"},
2016                 {"<Main>/Message/Copy...",                      "<shift><control>O"},
2017                 {"<Main>/Message/Delete",                       "<control>D"},
2018                 {"<Main>/Message/Mark/Mark",                    "<shift>asterisk"},
2019                 {"<Main>/Message/Mark/Unmark",                  "U"},
2020                 {"<Main>/Message/Mark/Mark as unread",          "<shift>exclam"},
2021                 {"<Main>/Message/Mark/Mark as read",            ""},
2022
2023                 {"<Main>/Tools/Address book",                   "<shift><control>A"},
2024                 {"<Main>/Tools/Execute",                        "X"},
2025                 {"<Main>/Tools/Log window",                     "<shift><control>L"},
2026
2027                 {"<Compose>/Message/Close",                             "<control>W"},
2028                 {"<Compose>/Edit/Select all",                           "<control>A"},
2029                 {"<Compose>/Edit/Advanced/Move a word backward",        ""},
2030                 {"<Compose>/Edit/Advanced/Move a word forward",         ""},
2031                 {"<Compose>/Edit/Advanced/Move to beginning of line",   ""},
2032                 {"<Compose>/Edit/Advanced/Delete a word backward",      ""},
2033                 {"<Compose>/Edit/Advanced/Delete a word forward",       ""},
2034         };
2035
2036         static struct KeyBind mew_wl_menurc[] = {
2037                 {"<Main>/File/Empty all Trash folders",                 "<shift>D"},
2038                 {"<Main>/File/Save as...",                      "Y"},
2039                 {"<Main>/File/Print...",                        "<shift>numbersign"},
2040                 {"<Main>/File/Exit",                            "<shift>Q"},
2041
2042                 {"<Main>/Edit/Copy",                            "<control>C"},
2043                 {"<Main>/Edit/Select all",                      "<control>A"},
2044                 {"<Main>/Edit/Find in current message...",      "<control>F"},
2045                 {"<Main>/Edit/Search folder...",                "<control>S"},
2046
2047                 {"<Main>/View/Show or hide/Message View",       ""},
2048                 {"<Main>/View/Thread view",                     "<shift>T"},
2049                 {"<Main>/View/Go to/Prev message",              "P"},
2050                 {"<Main>/View/Go to/Next message",              "N"},
2051                 {"<Main>/View/Go to/Prev unread message",       "<shift>P"},
2052                 {"<Main>/View/Go to/Next unread message",       "<shift>N"},
2053                 {"<Main>/View/Go to/Other folder...",           "G"},
2054                 {"<Main>/View/Open in new window",              "<control><alt>N"},
2055                 {"<Main>/View/Message source",                  "<control>U"},
2056                 {"<Main>/View/Show all headers",                "<shift>H"},
2057                 {"<Main>/View/Update summary",                  "<shift>S"},
2058
2059                 {"<Main>/Message/Receive/Get from current account",
2060                                                                 "<control>I"},
2061                 {"<Main>/Message/Receive/Get from all accounts","<shift><control>I"},
2062                 {"<Main>/Message/Compose an email message",     "W"},
2063                 {"<Main>/Message/Reply",                        "<control>R"},
2064                 {"<Main>/Message/Reply to/all",                 "<shift>A"},
2065                 {"<Main>/Message/Reply to/sender",              ""},
2066                 {"<Main>/Message/Reply to/mailing list",        "<control>L"},
2067                 {"<Main>/Message/Forward",                      "F"},
2068                 /* {"<Main>/Message/Forward as attachment", "<shift>F"}, */
2069                 {"<Main>/Message/Move...",                      "O"},
2070                 {"<Main>/Message/Copy...",                      "<shift>O"},
2071                 {"<Main>/Message/Delete",                       "D"},
2072                 {"<Main>/Message/Mark/Mark",                    "<shift>asterisk"},
2073                 {"<Main>/Message/Mark/Unmark",                  "U"},
2074                 {"<Main>/Message/Mark/Mark as unread",          "<shift>exclam"},
2075                 {"<Main>/Message/Mark/Mark as read",            "<shift>R"},
2076
2077                 {"<Main>/Tools/Address book",                   "<shift><control>A"},
2078                 {"<Main>/Tools/Execute",                        "X"},
2079                 {"<Main>/Tools/Log window",                     "<shift><control>L"},
2080
2081                 {"<Compose>/Message/Close",                             "<alt>W"},
2082                 {"<Compose>/Edit/Select all",                           ""},
2083                 {"<Compose>/Edit/Advanced/Move a word backward,"        "<alt>B"},
2084                 {"<Compose>/Edit/Advanced/Move a word forward",         "<alt>F"},
2085                 {"<Compose>/Edit/Advanced/Move to beginning of line",   "<control>A"},
2086                 {"<Compose>/Edit/Advanced/Delete a word backward",      "<control>W"},
2087                 {"<Compose>/Edit/Advanced/Delete a word forward",       "<alt>D"},
2088         };
2089
2090         static struct KeyBind mutt_menurc[] = {
2091                 {"<Main>/File/Empty all Trash folders",         ""},
2092                 {"<Main>/File/Save as...",                      "S"},
2093                 {"<Main>/File/Print...",                        "P"},
2094                 {"<Main>/File/Exit",                            "Q"},
2095
2096                 {"<Main>/Edit/Copy",                            "<control>C"},
2097                 {"<Main>/Edit/Select all",                      "<control>A"},
2098                 {"<Main>/Edit/Find in current message...",      "<control>F"},
2099                 {"<Main>/Edit/Search messages...",              "slash"},
2100
2101                 {"<Main>/View/Show or hide/Message view",       "V"},
2102                 {"<Main>/View/Thread view",                     "<control>T"},
2103                 {"<Main>/View/Go to/Prev message",              ""},
2104                 {"<Main>/View/Go to/Next message",              ""},
2105                 {"<Main>/View/Go to/Prev unread message",       ""},
2106                 {"<Main>/View/Go to/Next unread message",       ""},
2107                 {"<Main>/View/Go to/Other folder...",           "C"},
2108                 {"<Main>/View/Open in new window",              "<control><alt>N"},
2109                 {"<Main>/View/Message source",                  "<control>U"},
2110                 {"<Main>/View/Show all headers",                "<control>H"},
2111                 {"<Main>/View/Update summary",                          "<control><alt>U"},
2112
2113                 {"<Main>/Message/Receive/Get from current account",
2114                                                                 "<control>I"},
2115                 {"<Main>/Message/Receive/Get from all accounts","<shift><control>I"},
2116                 {"<Main>/Message/Compose an email message",             "M"},
2117                 {"<Main>/Message/Reply",                        "R"},
2118                 {"<Main>/Message/Reply to/all",                 "G"},
2119                 {"<Main>/Message/Reply to/sender",              ""},
2120                 {"<Main>/Message/Reply to/mailing list",        "<control>L"},
2121                 {"<Main>/Message/Forward",                      "F"},
2122                 {"<Main>/Message/Forward as attachment",        ""},
2123                 {"<Main>/Message/Move...",                      "<control>O"},
2124                 {"<Main>/Message/Copy...",                      "<shift>C"},
2125                 {"<Main>/Message/Delete",                       "D"},
2126                 {"<Main>/Message/Mark/Mark",                    "<shift>F"},
2127                 {"<Main>/Message/Mark/Unmark",                  "U"},
2128                 {"<Main>/Message/Mark/Mark as unread",          "<shift>N"},
2129                 {"<Main>/Message/Mark/Mark as read",            ""},
2130
2131                 {"<Main>/Tools/Address book",                   "<shift><control>A"},
2132                 {"<Main>/Tools/Execute",                        "X"},
2133                 {"<Main>/Tools/Log window",                     "<shift><control>L"},
2134
2135                 {"<Compose>/Message/Close",                             "<alt>W"},
2136                 {"<Compose>/Edit/Select all",                           ""},
2137                 {"<Compose>/Edit/Advanced/Move a word backward",        "<alt>B"},
2138                 {"<Compose>/Edit/Advanced/Move a word forward",         "<alt>F"},
2139                 {"<Compose>/Edit/Advanced/Move to beginning of line",   "<control>A"},
2140                 {"<Compose>/Edit/Advanced/Delete a word backward",      "<control>W"},
2141                 {"<Compose>/Edit/Advanced/Delete a word forward",       "<alt>D"},
2142         };
2143
2144         static struct KeyBind old_sylpheed_menurc[] = {
2145                 {"<Main>/File/Empty all Trash folders",         ""},
2146                 {"<Main>/File/Save as...",                      ""},
2147                 {"<Main>/File/Print...",                        "<alt>P"},
2148                 {"<Main>/File/Exit",                            "<alt>Q"},
2149
2150                 {"<Main>/Edit/Copy",                            "<control>C"},
2151                 {"<Main>/Edit/Select all",                      "<control>A"},
2152                 {"<Main>/Edit/Find in current message...",      "<control>F"},
2153                 {"<Main>/Edit/Search folder...",                "<control>S"},
2154
2155                 {"<Main>/View/Show or hide/Message View",       ""},
2156                 {"<Main>/View/Thread view",                     "<control>T"},
2157                 {"<Main>/View/Go to/Prev message",              "P"},
2158                 {"<Main>/View/Go to/Next message",              "N"},
2159                 {"<Main>/View/Go to/Prev unread message",       "<shift>P"},
2160                 {"<Main>/View/Go to/Next unread message",       "<shift>N"},
2161                 {"<Main>/View/Go to/Other folder...",           "<alt>G"},
2162                 {"<Main>/View/Open in new window",              "<shift><control>N"},
2163                 {"<Main>/View/Message source",                  "<control>U"},
2164                 {"<Main>/View/Show all headers",                "<control>H"},
2165                 {"<Main>/View/Update summary",                  "<alt>U"},
2166
2167                 {"<Main>/Message/Receive/Get from current account",
2168                                                                 "<alt>I"},
2169                 {"<Main>/Message/Receive/Get from all accounts","<shift><alt>I"},
2170                 {"<Main>/Message/Compose an email message",     "<alt>N"},
2171                 {"<Main>/Message/Reply",                        "<alt>R"},
2172                 {"<Main>/Message/Reply to/all",                 "<shift><alt>R"},
2173                 {"<Main>/Message/Reply to/sender",              "<control><alt>R"},
2174                 {"<Main>/Message/Reply to/mailing list",        "<control>L"},
2175                 {"<Main>/Message/Forward",                       "<shift><alt>F"},
2176                 /* "(menu-path \"<Main>/Message/Forward as attachment", "<shift><control>F"}, */
2177                 {"<Main>/Message/Move...",                      "<alt>O"},
2178                 {"<Main>/Message/Copy...",                      ""},
2179                 {"<Main>/Message/Delete",                       "<alt>D"},
2180                 {"<Main>/Message/Mark/Mark",                    "<shift>asterisk"},
2181                 {"<Main>/Message/Mark/Unmark",                  "U"},
2182                 {"<Main>/Message/Mark/Mark as unread",          "<shift>exclam"},
2183                 {"<Main>/Message/Mark/Mark as read",            ""},
2184
2185                 {"<Main>/Tools/Address book",                   "<alt>A"},
2186                 {"<Main>/Tools/Execute",                        "<alt>X"},
2187                 {"<Main>/Tools/Log window",                     "<alt>L"},
2188
2189                 {"<Compose>/Message/Close",                             "<alt>W"},
2190                 {"<Compose>/Edit/Select all",                           ""},
2191                 {"<Compose>/Edit/Advanced/Move a word backward",        "<alt>B"},
2192                 {"<Compose>/Edit/Advanced/Move a word forward",         "<alt>F"},
2193                 {"<Compose>/Edit/Advanced/Move to beginning of line",   "<control>A"},
2194                 {"<Compose>/Edit/Advanced/Delete a word backward",      "<control>W"},
2195                 {"<Compose>/Edit/Advanced/Delete a word forward",       "<alt>D"},
2196         };
2197   
2198         text = gtk_entry_get_text(entry);
2199   
2200         if (!strcmp(text, _("Default"))) {
2201                 menurc = default_menurc;
2202                 n_menurc = G_N_ELEMENTS(default_menurc);
2203         } else if (!strcmp(text, "Mew / Wanderlust")) {
2204                 menurc = mew_wl_menurc;
2205                 n_menurc = G_N_ELEMENTS(mew_wl_menurc);
2206         } else if (!strcmp(text, "Mutt")) {
2207                 menurc = mutt_menurc;
2208                 n_menurc = G_N_ELEMENTS(mutt_menurc);
2209         } else if (!strcmp(text, _("Old Sylpheed"))) {
2210                 menurc = old_sylpheed_menurc;
2211                 n_menurc = G_N_ELEMENTS(old_sylpheed_menurc);
2212         } else {
2213                 return;
2214         }
2215
2216         /* prefs_keybind_apply(empty_menurc, G_N_ELEMENTS(empty_menurc)); */
2217         prefs_keybind_apply(menurc, n_menurc);
2218
2219         gtk_widget_destroy(keybind.window);
2220         keybind.window = NULL;
2221         keybind.combo = NULL;
2222 }
2223
2224 static void prefs_common_charset_set_data_from_optmenu(PrefParam *pparam)
2225 {
2226         GtkWidget *menu;
2227         GtkWidget *menuitem;
2228         gchar *charset;
2229
2230         menu = gtk_option_menu_get_menu(GTK_OPTION_MENU(*pparam->widget));
2231         menuitem = gtk_menu_get_active(GTK_MENU(menu));
2232         charset = g_object_get_data(G_OBJECT(menuitem), MENU_VAL_ID);
2233         g_free(*((gchar **)pparam->data));
2234         *((gchar **)pparam->data) = g_strdup(charset);
2235 }
2236
2237 static void prefs_common_charset_set_optmenu(PrefParam *pparam)
2238 {
2239         GtkOptionMenu *optmenu = GTK_OPTION_MENU(*pparam->widget);
2240         gint index;
2241
2242         g_return_if_fail(optmenu != NULL);
2243         g_return_if_fail(*((gchar **)pparam->data) != NULL);
2244
2245         index = menu_find_option_menu_index(optmenu, *((gchar **)pparam->data),
2246                                             (GCompareFunc)strcmp2);
2247         if (index >= 0)
2248                 gtk_option_menu_set_history(optmenu, index);
2249         else {
2250                 gtk_option_menu_set_history(optmenu, 0);
2251                 prefs_common_charset_set_data_from_optmenu(pparam);
2252         }
2253 }
2254
2255 static void prefs_common_encoding_set_data_from_optmenu(PrefParam *pparam)
2256 {
2257         GtkWidget *menu;
2258         GtkWidget *menuitem;
2259
2260         menu = gtk_option_menu_get_menu(GTK_OPTION_MENU(*pparam->widget));
2261         menuitem = gtk_menu_get_active(GTK_MENU(menu));
2262         *((TransferEncodingMethod *)pparam->data) = GPOINTER_TO_INT
2263                 (g_object_get_data(G_OBJECT(menuitem), MENU_VAL_ID));
2264 }
2265
2266 static void prefs_common_encoding_set_optmenu(PrefParam *pparam)
2267 {
2268         TransferEncodingMethod method =
2269                 *((TransferEncodingMethod *)pparam->data);
2270         GtkOptionMenu *optmenu = GTK_OPTION_MENU(*pparam->widget);
2271         gint index;
2272
2273         g_return_if_fail(optmenu != NULL);
2274
2275         index = menu_find_option_menu_index(optmenu, GINT_TO_POINTER(method),
2276                                             NULL);
2277         if (index >= 0)
2278                 gtk_option_menu_set_history(optmenu, index);
2279         else {
2280                 gtk_option_menu_set_history(optmenu, 0);
2281                 prefs_common_encoding_set_data_from_optmenu(pparam);
2282         }
2283 }
2284
2285 static void prefs_common_recv_dialog_set_data_from_optmenu(PrefParam *pparam)
2286 {
2287         GtkWidget *menu;
2288         GtkWidget *menuitem;
2289
2290         menu = gtk_option_menu_get_menu(GTK_OPTION_MENU(*pparam->widget));
2291         menuitem = gtk_menu_get_active(GTK_MENU(menu));
2292         *((RecvDialogMode *)pparam->data) = GPOINTER_TO_INT
2293                 (g_object_get_data(G_OBJECT(menuitem), MENU_VAL_ID));
2294 }
2295
2296 static void prefs_common_recv_dialog_set_optmenu(PrefParam *pparam)
2297 {
2298         RecvDialogMode mode = *((RecvDialogMode *)pparam->data);
2299         GtkOptionMenu *optmenu = GTK_OPTION_MENU(*pparam->widget);
2300         GtkWidget *menu;
2301         GtkWidget *menuitem;
2302         gint index;
2303
2304         index = menu_find_option_menu_index(optmenu, GINT_TO_POINTER(mode),
2305                                             NULL);
2306         if (index >= 0)
2307                 gtk_option_menu_set_history(optmenu, index);
2308         else {
2309                 gtk_option_menu_set_history(optmenu, 0);
2310                 prefs_common_recv_dialog_set_data_from_optmenu(pparam);
2311         }
2312
2313         menu = gtk_option_menu_get_menu(optmenu);
2314         menuitem = gtk_menu_get_active(GTK_MENU(menu));
2315         gtk_menu_item_activate(GTK_MENU_ITEM(menuitem));
2316 }
2317
2318 static void prefs_common_send_dialog_set_data_from_optmenu(PrefParam *pparam)
2319 {
2320         GtkWidget *menu;
2321         GtkWidget *menuitem;
2322
2323         menu = gtk_option_menu_get_menu(GTK_OPTION_MENU(*pparam->widget));
2324         menuitem = gtk_menu_get_active(GTK_MENU(menu));
2325         *((SendDialogMode *)pparam->data) = GPOINTER_TO_INT
2326                 (g_object_get_data(G_OBJECT(menuitem), MENU_VAL_ID));
2327 }
2328
2329 static void prefs_common_send_dialog_set_optmenu(PrefParam *pparam)
2330 {
2331         SendDialogMode mode = *((SendDialogMode *)pparam->data);
2332         GtkOptionMenu *optmenu = GTK_OPTION_MENU(*pparam->widget);
2333         GtkWidget *menu;
2334         GtkWidget *menuitem;
2335
2336         switch (mode) {
2337         case SEND_DIALOG_ALWAYS:
2338                 gtk_option_menu_set_history(optmenu, 0);
2339                 break;
2340         case SEND_DIALOG_NEVER:
2341                 gtk_option_menu_set_history(optmenu, 1);
2342                 break;
2343         default:
2344                 break;
2345         }
2346
2347         menu = gtk_option_menu_get_menu(optmenu);
2348         menuitem = gtk_menu_get_active(GTK_MENU(menu));
2349         gtk_menu_item_activate(GTK_MENU_ITEM(menuitem));
2350 }
2351
2352 static void prefs_common_apply(void)
2353 {
2354         MainWindow *mainwindow;
2355
2356         prefs_set_data_from_dialog(param);
2357         sock_set_io_timeout(prefs_common.io_timeout_secs);
2358         main_window_reflect_prefs_all_real(FALSE);
2359         prefs_common_write_config();
2360
2361         mainwindow = mainwindow_get_mainwindow();
2362         log_window_set_clipping(mainwindow->logwin, prefs_common.cliplog,
2363                                 prefs_common.loglength);
2364         
2365         inc_autocheck_timer_remove();
2366         inc_autocheck_timer_set();
2367 }
2368
2369 static void prefs_nextunreadmsgdialog_set_data_from_optmenu(PrefParam *pparam)
2370 {
2371         GtkWidget *menu;
2372         GtkWidget *menuitem;
2373
2374         menu = gtk_option_menu_get_menu(GTK_OPTION_MENU(*pparam->widget));
2375         menuitem = gtk_menu_get_active(GTK_MENU(menu));
2376         *((NextUnreadMsgDialogShow *)pparam->data) = GPOINTER_TO_INT
2377                 (g_object_get_data(G_OBJECT(menuitem), MENU_VAL_ID));
2378 }
2379
2380 static void prefs_nextunreadmsgdialog_set_optmenu(PrefParam *pparam)
2381 {
2382         NextUnreadMsgDialogShow dialog_show;
2383         GtkOptionMenu *optmenu = GTK_OPTION_MENU(*pparam->widget);
2384         GtkWidget *menu;
2385         GtkWidget *menuitem;
2386
2387         dialog_show = *((NextUnreadMsgDialogShow *)pparam->data);
2388
2389         switch (dialog_show) {
2390         case NEXTUNREADMSGDIALOG_ALWAYS:
2391                 gtk_option_menu_set_history(optmenu, 0);
2392                 break;
2393         case NEXTUNREADMSGDIALOG_ASSUME_YES:
2394                 gtk_option_menu_set_history(optmenu, 1);
2395                 break;
2396         case NEXTUNREADMSGDIALOG_ASSUME_NO:
2397                 gtk_option_menu_set_history(optmenu, 2);
2398                 break;
2399         }
2400
2401         menu = gtk_option_menu_get_menu(optmenu);
2402         menuitem = gtk_menu_get_active(GTK_MENU(menu));
2403         gtk_menu_item_activate(GTK_MENU_ITEM(menuitem));
2404 }
2405
2406 void pref_set_textview_from_pref(GtkTextView *textview, gchar *txt)
2407 {
2408         GtkTextBuffer *buffer = gtk_text_view_get_buffer(textview);
2409         gchar *o_out, *out = malloc(txt?(strlen(txt)+1):1);
2410         gchar *t = txt;
2411         memset(out, 0, strlen(txt)+1);
2412         o_out = out;
2413         while (*t != '\0') {
2414                 if (*t == '\\' && *(t+1) == 'n') {
2415                         *out++ = '\n';
2416                         t++;
2417                 } else if (*t == '\\') {
2418                         t++;
2419                 } else {
2420                         *out++ = *t;
2421                 }
2422                 t++;
2423         }
2424         *out='\0';
2425
2426         gtk_text_buffer_set_text(buffer, o_out?o_out:"", -1);
2427         g_free(o_out);
2428 }
2429
2430 gchar *pref_get_pref_from_textview(GtkTextView *textview) 
2431 {
2432         GtkTextBuffer *buffer;
2433         GtkTextIter start, end;
2434         gchar *o_out, *out, *tmp, *t;
2435         
2436         buffer = gtk_text_view_get_buffer(textview);
2437         gtk_text_buffer_get_start_iter(buffer, &start);
2438         gtk_text_buffer_get_iter_at_offset(buffer, &end, -1);
2439         tmp = gtk_text_buffer_get_text(buffer, &start, &end, FALSE);
2440         t = tmp;
2441         o_out = out = malloc(2*strlen(tmp)+1);
2442         
2443         while (*t != '\0') {
2444                 if (*t == '\n') {
2445                         *out++ = '\\';
2446                         *out++ = 'n';
2447                 } else if (*t == '\\') {
2448                         *out++ = '\\';
2449                         *out++ = '\\';
2450                 } else {
2451                         *out++ = *t;
2452                 }
2453                 t++;
2454         }
2455         *out = '\0';
2456         g_free(tmp);
2457
2458         return o_out;
2459 }