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