Statistics
| Revision:

root / src / prefs_common_dialog.c @ 1124

History | View | Annotate | Download (123.4 kB)

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