Statistics
| Revision:

root / src / prefs_common_dialog.c @ 717

History | View | Annotate | Download (118.1 kB)

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