2 Claws Mail -- a GTK+ based, lightweight, and fast e-mail client
3 Copyright (C) 1999-2021 the Claws Mail team and Hiroyuki Yamamoto
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 3 of the License, or
8 (at your option) any later version.
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.
15 You should have received a copy of the GNU General Public License
16 along with this program. If not, see <http://www.gnu.org/licenses/>.
27 #include <glib/gi18n.h>
28 #include <gdk/gdkkeysyms.h>
34 #include "mainwindow.h"
35 #include "folderview.h"
36 #include "folder_item_prefs.h"
37 #include "foldersel.h"
38 #include "quicksearch.h"
39 #include "summaryview.h"
40 #include "summary_search.h"
41 #include "messageview.h"
43 #include "message_search.h"
44 #include "headerview.h"
46 #include "stock_pixmap.h"
56 #include "prefs_common.h"
57 #include "prefs_actions.h"
58 #include "prefs_filtering.h"
59 #include "prefs_account.h"
60 #include "prefs_summary_column.h"
61 #include "prefs_folder_column.h"
62 #include "prefs_template.h"
65 #ifndef USE_ALT_ADDRBOOK
66 #include "addressbook.h"
68 #include "addressbook-dbus.h"
70 #include "logwindow.h"
71 #include "manage_window.h"
72 #include "alertpanel.h"
73 #include "statusbar.h"
74 #include "inputdialog.h"
81 #include "ssl_manager.h"
82 #include "sslcertwindow.h"
83 #include "prefs_gtk.h"
84 #include "pluginwindow.h"
86 #include "progressindicator.h"
87 #include "localfolder.h"
88 #include "filtering.h"
89 #include "folderutils.h"
90 #include "foldersort.h"
91 #include "icon_legend.h"
92 #include "colorlabel.h"
99 #include "send_message.h"
104 #define AC_LABEL_WIDTH 240
106 /* list of all instantiated MainWindow */
107 static GList *mainwin_list = NULL;
109 static GdkCursor *watch_cursor = NULL;
110 static GdkCursor *hand_cursor = NULL;
112 static gint iconified_count = 0;
114 static void main_window_menu_callback_block (MainWindow *mainwin);
115 static void main_window_menu_callback_unblock (MainWindow *mainwin);
117 static void main_window_show_cur_account (MainWindow *mainwin);
119 static void main_window_separation_change (MainWindow *mainwin,
120 LayoutType layout_mode);
122 static void main_window_set_widgets (MainWindow *mainwin,
123 LayoutType layout_mode);
125 static void toolbar_child_attached (GtkWidget *widget,
128 static void toolbar_child_detached (GtkWidget *widget,
132 static gboolean ac_label_button_pressed (GtkWidget *widget,
133 GdkEventButton *event,
136 static gint main_window_close_cb (GtkWidget *widget,
140 static void main_window_size_allocate_cb (GtkWidget *widget,
141 GtkAllocation *allocation,
143 static void folder_window_size_allocate_cb (GtkWidget *widget,
144 GtkAllocation *allocation,
146 static void message_window_size_allocate_cb (GtkWidget *widget,
147 GtkAllocation *allocation,
150 static void update_folderview_cb (GtkAction *action,
152 static void add_mailbox_cb (GtkAction *action,
154 static void foldersort_cb (GtkAction *action,
156 static void import_mbox_cb (GtkAction *action,
158 static void export_mbox_cb (GtkAction *action,
160 static void export_list_mbox_cb (GtkAction *action,
162 static void empty_trash_cb (GtkAction *action,
164 static void save_as_cb (GtkAction *action,
166 static void page_setup_cb (GtkAction *action,
168 static void print_cb (GtkAction *action,
170 static void app_exit_cb (GtkAction *action,
174 static void search_cb (GtkAction *action,
176 static void search_folder_cb (GtkAction *action,
179 static void toggle_message_cb (GtkAction *action,
181 static void toggle_toolbar_cb (GtkAction *action, GtkRadioAction *current, gpointer data);
182 static void toggle_col_headers_cb(GtkAction *action,
185 static void toggle_statusbar_cb (GtkAction *action,
187 static void set_layout_cb (GtkAction *action, GtkRadioAction *current, gpointer data);
189 static void addressbook_open_cb (GtkAction *action,
191 static void log_window_show_cb (GtkAction *action,
193 static void filtering_debug_window_show_cb (GtkAction *action,
196 static void debug_log_show_cb(GtkAction *action, gpointer data);
199 static void inc_cancel_cb (GtkAction *action,
201 static void send_cancel_cb (GtkAction *action,
204 static void open_msg_cb (GtkAction *action,
207 static void view_source_cb (GtkAction *action,
210 static void show_all_header_cb (GtkAction *action,
212 static void toggle_fullscreen_cb (GtkAction *action,
214 static void toggle_menubar_cb (GtkAction *action,
217 static void hide_quotes_cb(GtkAction *action,
220 static void move_to_cb (GtkAction *action,
222 static void copy_to_cb (GtkAction *action,
224 static void delete_cb (GtkAction *action,
226 static void delete_trash_cb (GtkAction *action,
229 static void cancel_cb (GtkAction *action,
232 static void mark_cb (GtkAction *action,
234 static void unmark_cb (GtkAction *action,
237 static void mark_as_unread_cb (GtkAction *action,
239 static void mark_as_read_cb (GtkAction *action,
241 static void mark_all_read_cb (GtkAction *action,
243 static void mark_all_unread_cb (GtkAction *action,
245 static void mark_as_spam_cb (GtkAction *action,
247 static void mark_as_ham_cb (GtkAction *action,
250 static void ignore_thread_cb (GtkAction *action,
252 static void unignore_thread_cb (GtkAction *action,
254 static void watch_thread_cb (GtkAction *action,
256 static void unwatch_thread_cb (GtkAction *action,
258 static void lock_msgs_cb (GtkAction *action,
260 static void unlock_msgs_cb (GtkAction *action,
263 static void reedit_cb (GtkAction *action,
266 static void add_address_cb (GtkAction *action,
269 static void set_charset_cb (GtkAction *action, GtkRadioAction *current, gpointer data);
271 static void set_decode_cb (GtkAction *action, GtkRadioAction *current, gpointer data);
273 static void hide_read_messages (GtkAction *action,
275 static void hide_read_threads (GtkAction *action,
277 static void hide_del_messages (GtkAction *action,
280 static void thread_cb (GtkAction *action,
282 static void expand_threads_cb (GtkAction *action,
284 static void collapse_threads_cb (GtkAction *action,
287 static void set_summary_display_item_cb (GtkAction *action,
289 static void set_folder_display_item_cb (GtkAction *action,
291 static void sort_summary_cb (GtkAction *action, GtkRadioAction *current, gpointer data);
292 static void sort_summary_type_cb (GtkAction *action, GtkRadioAction *current, gpointer data);
293 static void attract_by_subject_cb(GtkAction *action,
296 static void delete_duplicated_cb (GtkAction *action,
298 static void delete_duplicated_all_cb (GtkAction *action,
300 static void filter_cb (GtkAction *action,
302 static void filter_list_cb (GtkAction *action,
304 static void process_cb (GtkAction *action,
306 static void execute_summary_cb (GtkAction *action,
308 static void expunge_summary_cb (GtkAction *action,
310 static void update_summary_cb (GtkAction *action,
313 static void prev_cb (GtkAction *action,
315 static void next_cb (GtkAction *action,
317 static void next_unread_cb (GtkAction *action,
319 static void prev_unread_cb (GtkAction *action,
322 static void prev_new_cb (GtkAction *action,
324 static void next_new_cb (GtkAction *action,
326 static void prev_marked_cb (GtkAction *action,
328 static void next_marked_cb (GtkAction *action,
330 static void prev_labeled_cb (GtkAction *action,
332 static void next_labeled_cb (GtkAction *action,
334 static void prev_history_cb (GtkAction *action,
336 static void next_history_cb (GtkAction *action,
338 static void parent_cb (GtkAction *action,
341 static void goto_folder_cb (GtkAction *action,
343 static void goto_unread_folder_cb(GtkAction *action,
346 static void scroll_prev_line_cb (GtkAction *action,
348 static void scroll_next_line_cb (GtkAction *action,
350 static void scroll_prev_page_cb (GtkAction *action,
352 static void scroll_next_page_cb (GtkAction *action,
355 static void copy_cb (GtkAction *action,
357 static void allsel_cb (GtkAction *action,
359 static void select_thread_cb (GtkAction *action,
361 static void trash_thread_cb (GtkAction *action,
363 static void delete_thread_cb (GtkAction *action,
366 static void create_filter_cb (GtkAction *action,
368 static void create_processing_cb (GtkAction *action,
370 static void open_urls_cb (GtkAction *action,
373 static void prefs_template_open_cb (GtkAction *action,
375 static void prefs_actions_open_cb (GtkAction *action,
377 static void prefs_tags_open_cb (GtkAction *action,
379 static void prefs_account_open_cb (GtkAction *action,
382 static void prefs_pre_processing_open_cb (GtkAction *action,
385 static void prefs_post_processing_open_cb (GtkAction *action,
388 static void prefs_filtering_open_cb (GtkAction *action,
391 static void ssl_manager_open_cb (GtkAction *action,
394 static void new_account_cb (GtkAction *action,
397 static void account_selector_menu_cb (GtkMenuItem *menuitem,
399 static void account_receive_menu_cb (GtkMenuItem *menuitem,
402 static void account_compose_menu_cb (GtkMenuItem *menuitem,
405 static void prefs_open_cb (GtkAction *action,
407 static void plugins_open_cb (GtkAction *action,
410 static void online_switch_clicked(GtkButton *btn,
413 static void manual_open_cb (GtkAction *action,
415 static void manual_faq_open_cb (GtkAction *action,
418 static void legend_open_cb (GtkAction *action,
422 static void set_default_client_cb (GtkAction *action,
426 static void scan_tree_func (Folder *folder,
430 static void toggle_work_offline_cb(GtkAction *action,
433 static void addr_harvest_cb ( GtkAction *action,
436 static void addr_harvest_msg_cb ( GtkAction *action,
438 static void sync_cb ( GtkAction *action,
441 static void forget_session_passwords_cb (GtkAction *action,
443 #ifndef PASSWORD_CRYPTO_OLD
444 static void forget_master_passphrase_cb (GtkAction *action,
447 static gboolean mainwindow_focus_in_event (GtkWidget *widget,
448 GdkEventFocus *focus,
450 static gboolean mainwindow_visibility_event_cb (GtkWidget *widget,
451 GdkEventVisibility *state,
453 static gboolean mainwindow_state_event_cb (GtkWidget *widget,
454 GdkEventWindowState *state,
456 static void main_window_reply_cb (GtkAction *action,
458 static gboolean mainwindow_progressindicator_hook (gpointer source,
461 static gint mailing_list_create_submenu(MainWindow *mainwindow,
464 static gint mailing_list_populate_submenu(GtkWidget *menu, const gchar * list_header);
466 static void get_url_part(const gchar **buf, gchar *url_decoded);
468 static void mailing_list_compose(GtkWidget *w, gpointer *data);
470 static void mailing_list_open_uri(GtkWidget *w, gpointer *data);
471 #define SEPARATE_ACTION 500
472 static void mainwindow_quicksearch (GtkAction *action,
474 static gboolean any_folder_want_synchronise(void);
476 static void save_part_as_cb(GtkAction *action, gpointer data);
477 static void view_part_as_text_cb(GtkAction *action, gpointer data);
478 static void open_part_cb(GtkAction *action, gpointer data);
480 static void open_part_with_cb(GtkAction *action, gpointer data);
482 static void check_signature_cb(GtkAction *action, gpointer data);
483 static void goto_next_part_cb(GtkAction *action, gpointer data);
484 static void goto_prev_part_cb(GtkAction *action, gpointer data);
485 #define DO_ACTION(name, act) { if (!strcmp(a_name, name)) action = act; }
487 static void mainwindow_nothing_cb (GtkAction *action, gpointer data)
492 static void about_cb(GtkAction *gaction, gpointer data)
497 static void mw_inc_mail_cb (GtkAction *gaction, gpointer data)
499 inc_mail_cb(data, 0, NULL);
501 static void mw_inc_all_account_mail_cb (GtkAction *gaction, gpointer data)
503 inc_all_account_mail_cb(data, 0, NULL);
505 static void mw_send_queue_cb (GtkAction *gaction, gpointer data)
507 send_queue_cb(data, 0, NULL);
509 static void mw_compose_mail_cb (GtkAction *gaction, gpointer data)
511 compose_mail_cb(data, 0, NULL);
513 static void mw_compose_news_cb (GtkAction *gaction, gpointer data)
515 compose_news_cb(data, 0, NULL);
518 static GtkActionEntry mainwin_entries[] =
520 {"Menu", NULL, "Menu", NULL, NULL, NULL },
522 {"File", NULL, N_("_File"), NULL, NULL, NULL },
523 {"Edit", NULL, N_("_Edit"), NULL, NULL, NULL },
524 {"View", NULL, N_("_View"), NULL, NULL, NULL },
525 {"Message", NULL, N_("_Message"), NULL, NULL, NULL },
526 {"Tools", NULL, N_("_Tools"), NULL, NULL, NULL },
527 {"Configuration", NULL, N_("_Configuration"), NULL, NULL, NULL },
528 {"Help", NULL, N_("_Help"), NULL, NULL, NULL },
531 {"File/AddMailbox", NULL, N_("_Add mailbox"), NULL, NULL, NULL },
532 {"File/AddMailbox/MH", NULL, N_("MH..."), NULL, NULL, G_CALLBACK(add_mailbox_cb) },
533 {"File/---", NULL, "---", NULL, NULL, NULL },
535 {"File/SortMailboxes", NULL, N_("Change mailbox order..."), NULL, NULL, G_CALLBACK(foldersort_cb) },
537 /* {"File/---", NULL, "---", NULL, NULL, NULL }, */
538 {"File/ImportMbox", NULL, N_("_Import mbox file..."), NULL, NULL, G_CALLBACK(import_mbox_cb) },
539 {"File/ExportMbox", NULL, N_("_Export to mbox file..."), NULL, NULL, G_CALLBACK(export_mbox_cb) },
540 {"File/ExportSelMbox", NULL, N_("_Export selected to mbox file..."), NULL, NULL, G_CALLBACK(export_list_mbox_cb) },
541 /* {"File/---", NULL, "---", NULL, NULL, NULL }, */
542 {"File/EmptyTrashes", NULL, N_("Empty all _Trash folders"), "<shift>D", NULL, G_CALLBACK(empty_trash_cb) },
543 /* {"File/---", NULL, "---", NULL, NULL, NULL }, */
545 {"File/SaveAs", NULL, N_("_Save email as..."), "<control>S", NULL, G_CALLBACK(save_as_cb) },
546 {"File/SavePartAs", NULL, N_("_Save part as..."), "Y", NULL, G_CALLBACK(save_part_as_cb) },
547 /* {"File/---", NULL, "---", NULL, NULL, NULL }, */
549 {"File/PageSetup", NULL, N_("Page setup..."), NULL, NULL, G_CALLBACK(page_setup_cb) },
550 {"File/Print", NULL, N_("_Print..."), "<control>P", NULL, G_CALLBACK(print_cb) },
551 /* {"File/---", NULL, "---", NULL, NULL, NULL }, */
552 {"File/SynchroniseFolders", NULL, N_("Synchronise folders"), "<control><shift>S", NULL, G_CALLBACK(sync_cb) },
553 /* {"File/---", NULL, "---", NULL, NULL, NULL }, */
554 {"File/Exit", NULL, N_("E_xit"), "<control>Q", NULL, G_CALLBACK(app_exit_cb) },
557 {"Edit/Copy", NULL, N_("_Copy"), "<control>C", NULL, G_CALLBACK(copy_cb) },
558 {"Edit/SelectAll", NULL, N_("Select _all"), "<control>A", NULL, G_CALLBACK(allsel_cb) },
559 {"Edit/SelectThread", NULL, N_("Select _thread"), NULL, NULL, G_CALLBACK(select_thread_cb) },
560 {"Edit/---", NULL, "---", NULL, NULL, NULL },
561 {"Edit/Find", NULL, N_("_Find in current message..."), "<control>F", NULL, G_CALLBACK(search_cb) },
562 {"Edit/SearchFolder", NULL, N_("_Search folder..."), "<shift><control>F", NULL, G_CALLBACK(search_folder_cb) },
563 {"Edit/QuickSearch", NULL, N_("_Quick search"), "slash", NULL, G_CALLBACK(mainwindow_quicksearch) },
566 {"View/ShowHide", NULL, N_("Show or hi_de"), NULL, NULL, NULL },
567 {"View/ShowHide/Toolbar", NULL, N_("_Toolbar"), NULL, NULL, NULL },
569 {"View/SetColumns", NULL, N_("Set displayed _columns"), NULL, NULL, NULL },
570 {"View/SetColumns/Folderlist", NULL, N_("In _folder list..."), NULL, NULL, G_CALLBACK(set_folder_display_item_cb) },
571 {"View/SetColumns/Messagelist", NULL, N_("In _message list..."), NULL, NULL, G_CALLBACK(set_summary_display_item_cb) },
572 {"View/---", NULL, "---", NULL, NULL, NULL },
576 {"View/Layout", NULL, N_("La_yout"), NULL, NULL, NULL },
578 {"View/Sort", NULL, N_("_Sort"), NULL, NULL, NULL },
579 {"View/Sort/---", NULL, "---", NULL, NULL, NULL },
580 {"View/Sort/AttractSubj", NULL, N_("_Attract by subject"), NULL, NULL, G_CALLBACK(attract_by_subject_cb) },
582 {"View/ExpandThreads", NULL, N_("E_xpand all threads"), NULL, NULL, G_CALLBACK(expand_threads_cb) },
583 {"View/CollapseThreads", NULL, N_("Co_llapse all threads"), NULL, NULL, G_CALLBACK(collapse_threads_cb) },
585 {"View/Goto", NULL, N_("_Go to"), NULL, NULL, NULL },
586 {"View/Goto/Prev", NULL, N_("_Previous message"), "P", NULL, G_CALLBACK(prev_cb) },
587 {"View/Goto/Next", NULL, N_("_Next message"), "N", NULL, G_CALLBACK(next_cb) },
588 {"View/Goto/---", NULL, "---", NULL, NULL, NULL },
589 {"View/Goto/PrevUnread", NULL, N_("P_revious unread message"), "<shift>P", NULL, G_CALLBACK(prev_unread_cb) },
590 {"View/Goto/NextUnread", NULL, N_("N_ext unread message"), "<shift>N", NULL, G_CALLBACK(next_unread_cb) },
591 /* {"View/Goto/---", NULL, "---", NULL, NULL, NULL }, */
592 {"View/Goto/PrevNew", NULL, N_("Previous ne_w message"), NULL, NULL, G_CALLBACK(prev_new_cb) },
593 {"View/Goto/NextNew", NULL, N_("Ne_xt new message"), NULL, NULL, G_CALLBACK(next_new_cb) },
594 /* {"View/Goto/---", NULL, "---", NULL, NULL, NULL }, */
595 {"View/Goto/PrevMarked", NULL, N_("Previous _marked message"), NULL, NULL, G_CALLBACK(prev_marked_cb) },
596 {"View/Goto/NextMarked", NULL, N_("Next m_arked message"), NULL, NULL, G_CALLBACK(next_marked_cb) },
597 /* {"View/Goto/---", NULL, "---", NULL, NULL, NULL }, */
598 {"View/Goto/PrevLabeled", NULL, N_("Previous _labeled message"), NULL, NULL, G_CALLBACK(prev_labeled_cb) },
599 {"View/Goto/NextLabeled", NULL, N_("Next la_beled message"), NULL, NULL, G_CALLBACK(next_labeled_cb) },
600 /* {"View/Goto/---", NULL, "---", NULL, NULL, NULL }, */
601 {"View/Goto/PrevHistory", NULL, N_("Previously opened message"), "<alt>Left", NULL, G_CALLBACK(prev_history_cb) },
602 {"View/Goto/NextHistory", NULL, N_("Next opened message"), "<alt>Right", NULL, G_CALLBACK(next_history_cb) },
603 /* {"View/Goto/---", NULL, "---", NULL, NULL, NULL }, */
604 {"View/Goto/ParentMessage", NULL, N_("Parent message"), "<control>Up", NULL, G_CALLBACK(parent_cb) },
605 /* {"View/Goto/---", NULL, "---", NULL, NULL, NULL }, */
606 {"View/Goto/NextUnreadFolder", NULL, N_("Next unread _folder"), "<shift>G", NULL, G_CALLBACK(goto_unread_folder_cb) },
607 {"View/Goto/Folder", NULL, N_("F_older..."), "G", NULL, G_CALLBACK(goto_folder_cb) },
608 /* {"View/Goto/---", NULL, "---", NULL, NULL, NULL }, */
609 {"View/Goto/NextPart", NULL, N_("Next part"), "A", NULL, G_CALLBACK(goto_next_part_cb) },
610 {"View/Goto/PrevPart", NULL, N_("Previous part"), "Z", NULL, G_CALLBACK(goto_prev_part_cb) },
612 /* {"View/Scroll/---", NULL, "---", NULL, NULL, NULL }, */
613 {"View/Scroll", NULL, N_("Message scroll"), NULL, NULL, NULL },
614 {"View/Scroll/PrevLine", NULL, N_("Previous line"), NULL, NULL, G_CALLBACK(scroll_prev_line_cb) },
615 {"View/Scroll/NextLine", NULL, N_("Next line"), NULL, NULL, G_CALLBACK(scroll_next_line_cb) },
616 {"View/Scroll/PrevPage", NULL, N_("Previous page"), NULL, NULL, G_CALLBACK(scroll_prev_page_cb) },
617 {"View/Scroll/NextPage", NULL, N_("Next page"), NULL, NULL, G_CALLBACK(scroll_next_page_cb) },
619 /* {"View/---", NULL, "---", NULL, NULL, NULL }, */
620 {"View/Encoding", NULL, N_("Character _encoding"), NULL, NULL, NULL }, /* set_charset_cb */
621 {"View/Encoding/---", NULL, "---", NULL, NULL, NULL },
622 #define ENC_ACTION(cs_char,c_char,string) \
623 { "View/Encoding/" cs_char, NULL, N_(string), NULL, NULL, c_char }
625 {"View/Encoding/Western", NULL, N_("Western European"), NULL, NULL, NULL },
626 {"View/Encoding/Baltic", NULL, N_("Baltic"), NULL, NULL, NULL },
627 {"View/Encoding/Hebrew", NULL, N_("Hebrew"), NULL, NULL, NULL },
628 {"View/Encoding/Arabic", NULL, N_("Arabic"), NULL, NULL, NULL },
629 {"View/Encoding/Cyrillic", NULL, N_("Cyrillic"), NULL, NULL, NULL },
630 {"View/Encoding/Japanese", NULL, N_("Japanese"), NULL, NULL, NULL },
631 {"View/Encoding/Chinese", NULL, N_("Chinese"), NULL, NULL, NULL },
632 {"View/Encoding/Korean", NULL, N_("Korean"), NULL, NULL, NULL },
633 {"View/Encoding/Thai", NULL, N_("Thai"), NULL, NULL, NULL },
635 {"View/Decode", NULL, N_("Decode"), NULL, NULL, NULL }, /* set_decode_cb */
636 {"View/Decode/---", NULL, "---", NULL, NULL, NULL },
638 #define DEC_ACTION(cs_type,c_type,string) \
639 { "View/Decode/" cs_type, NULL, N_(string), NULL, NULL, c_type }
641 /* {"View/---", NULL, "---", NULL, NULL, NULL }, */
642 {"View/OpenNewWindow", NULL, N_("Open in new _window"), "<control><alt>N", NULL, G_CALLBACK(open_msg_cb) },
643 {"View/MessageSource", NULL, N_("Mess_age source"), "<control>U", NULL, G_CALLBACK(view_source_cb) },
644 /* {"View/---", NULL, "---", NULL, NULL, NULL }, */
645 {"View/Part", NULL, N_("Message part"), NULL, NULL, NULL },
646 {"View/Part/AsText", NULL, N_("View as text"), "T", NULL, G_CALLBACK(view_part_as_text_cb) },
647 {"View/Part/Open", NULL, N_("Open"), "L", NULL, G_CALLBACK(open_part_cb) },
649 {"View/Part/OpenWith", NULL, N_("Open with..."), "O", NULL, G_CALLBACK(open_part_with_cb) },
651 /* {"View/---", NULL, "---", NULL, NULL, NULL }, */
653 {"View/Quotes", NULL, N_("Quotes"), NULL, NULL, NULL },
654 /* {"View/---", NULL, "---", NULL, NULL, NULL }, */
655 {"View/UpdateSummary", NULL, N_("_Update summary"), "<control><alt>U", NULL, G_CALLBACK(update_summary_cb) },
658 {"Message/Receive", NULL, N_("Recei_ve"), NULL, NULL, NULL },
659 {"Message/Receive/CurrentAccount", NULL, N_("Get from _current account"), "<control>I", NULL, G_CALLBACK(mw_inc_mail_cb) },
660 {"Message/Receive/AllAccounts", NULL, N_("Get from _all accounts"), "<shift><control>I", NULL, G_CALLBACK(mw_inc_all_account_mail_cb) },
661 {"Message/Receive/CancelReceiving", NULL, N_("Cancel receivin_g"), NULL, NULL, G_CALLBACK(inc_cancel_cb) },
662 {"Message/Receive/---", NULL, "---", NULL, NULL, NULL },
663 {"Message/Receive/PlaceHolder", NULL, "PlaceHolder,", NULL, NULL, G_CALLBACK(mainwindow_nothing_cb) },
664 {"Message/SendQueue", NULL, N_("_Send queued messages"), NULL, NULL, G_CALLBACK(mw_send_queue_cb) },
665 {"Message/CancelSending", NULL, N_("Cancel sending"), NULL, NULL, G_CALLBACK(send_cancel_cb) },
667 {"Message/---", NULL, "---", NULL, NULL, NULL },
669 {"Message/ComposeEmail", NULL, N_("Compose a_n email message"), "<control>M", NULL, G_CALLBACK(mw_compose_mail_cb) },
670 {"Message/ComposeNews", NULL, N_("Compose a news message"), NULL, NULL, G_CALLBACK(mw_compose_news_cb) },
672 {"Message/Reply", NULL, N_("_Reply"), "<control>R", NULL, G_CALLBACK(main_window_reply_cb) }, /* COMPOSE_REPLY */
673 {"Message/ReplyTo", NULL, N_("Repl_y to"), NULL, NULL, NULL },
674 {"Message/ReplyTo/All", NULL, N_("_All"), "<control><shift>R", NULL, G_CALLBACK(main_window_reply_cb) }, /* COMPOSE_REPLY_TO_ALL */
675 {"Message/ReplyTo/Sender", NULL, N_("_Sender"), NULL, NULL, G_CALLBACK(main_window_reply_cb) }, /* COMPOSE_REPLY_TO_SENDER */
676 {"Message/ReplyTo/List", NULL, N_("Mailing _list"), "<control>L", NULL, G_CALLBACK(main_window_reply_cb) }, /* COMPOSE_REPLY_TO_LIST */
677 {"Message/FollowupReply", NULL, N_("Follow-up and reply to"), NULL, NULL, G_CALLBACK(main_window_reply_cb) }, /* COMPOSE_FOLLOWUP_AND_REPLY_TO */
678 /* {"Message/---", NULL, "---", NULL, NULL, NULL }, */
680 {"Message/Forward", NULL, N_("_Forward"), "<control><alt>F", NULL, G_CALLBACK(main_window_reply_cb) }, /* COMPOSE_FORWARD_INLINE */
681 {"Message/ForwardAtt", NULL, N_("For_ward as attachment"), NULL, NULL, G_CALLBACK(main_window_reply_cb) }, /* COMPOSE_FORWARD_AS_ATTACH */
682 {"Message/Redirect", NULL, N_("Redirec_t"), NULL, NULL, G_CALLBACK(main_window_reply_cb) }, /* COMPOSE_REDIRECT */
684 {"Message/MailingList", NULL, N_("Mailing-_List"), NULL, NULL, NULL },
685 {"Message/MailingList/Post", NULL, N_("Post"), NULL, NULL, NULL },
686 {"Message/MailingList/Post/PlaceHolder", NULL, "Placeholder", NULL, NULL, G_CALLBACK(mainwindow_nothing_cb) },
687 {"Message/MailingList/Help", NULL, N_("Help"), NULL, NULL, NULL },
688 {"Message/MailingList/Help/PlaceHolder", NULL, "Placeholder", NULL, NULL, G_CALLBACK(mainwindow_nothing_cb) },
689 {"Message/MailingList/Subscribe", NULL, N_("Subscribe"), NULL, NULL, NULL },
690 {"Message/MailingList/Subscribe/PlaceHolder", NULL, "Placeholder", NULL, NULL, G_CALLBACK(mainwindow_nothing_cb) },
691 {"Message/MailingList/Unsubscribe", NULL, N_("Unsubscribe"), NULL, NULL, NULL },
692 {"Message/MailingList/Unsubscribe/PlaceHolder", NULL, "Placeholder", NULL, NULL, G_CALLBACK(mainwindow_nothing_cb) },
693 {"Message/MailingList/ViewArchive", NULL, N_("View archive"), NULL, NULL, NULL },
694 {"Message/MailingList/ViewArchive/PlaceHolder", NULL, "Placeholder", NULL, NULL, G_CALLBACK(mainwindow_nothing_cb) },
695 {"Message/MailingList/ContactOwner", NULL, N_("Contact owner"), NULL, NULL, NULL },
696 {"Message/MailingList/ContactOwner/PlaceHolder", NULL, "Placeholder", NULL, NULL, G_CALLBACK(mainwindow_nothing_cb) },
699 {"Message/Move", NULL, N_("M_ove..."), "<control>O", NULL, G_CALLBACK(move_to_cb) },
700 {"Message/Copy", NULL, N_("_Copy..."), "<shift><control>O", NULL, G_CALLBACK(copy_to_cb) },
701 {"Message/Trash", NULL, N_("Move to _trash"), "<control>D", NULL, G_CALLBACK(delete_trash_cb) },
702 {"Message/Delete", NULL, N_("_Delete..."), NULL, NULL, G_CALLBACK(delete_cb) },
703 {"Message/TrashThread", NULL, N_("Move thread to tr_ash"), NULL, NULL, G_CALLBACK(trash_thread_cb) },
704 {"Message/DeleteThread", NULL, N_("Delete t_hread"), NULL, NULL, G_CALLBACK(delete_thread_cb) },
705 {"Message/CancelNews", NULL, N_("Cancel a news message"), NULL, NULL, G_CALLBACK(cancel_cb) },
708 {"Message/Mark", NULL, N_("_Mark"), NULL, NULL, NULL },
709 {"Message/Mark/Mark", NULL, N_("_Mark"), "<shift>asterisk", NULL, G_CALLBACK(mark_cb) },
710 {"Message/Mark/Unmark", NULL, N_("_Unmark"), "U", NULL, G_CALLBACK(unmark_cb) },
711 {"Message/Mark/---", NULL, "---", NULL, NULL, NULL },
713 {"Message/Mark/MarkRead", NULL, N_("Mark as rea_d"), NULL, NULL, G_CALLBACK(mark_as_read_cb) },
714 {"Message/Mark/MarkUnread", NULL, N_("Mark as unr_ead"), "<shift>exclam", NULL, G_CALLBACK(mark_as_unread_cb) },
716 {"Message/Mark/MarkAllRead", NULL, N_("Mark all read in folder"), NULL, NULL, G_CALLBACK(mark_all_read_cb) },
717 {"Message/Mark/MarkAllUnread", NULL, N_("Mark all unread in folder"), NULL, NULL, G_CALLBACK(mark_all_unread_cb) },
719 {"Message/Mark/IgnoreThread", NULL, N_("Ignore thread"), NULL, NULL, G_CALLBACK(ignore_thread_cb) },
720 {"Message/Mark/UnignoreThread", NULL, N_("Unignore thread"), NULL, NULL, G_CALLBACK(unignore_thread_cb) },
721 {"Message/Mark/WatchThread", NULL, N_("Watch thread"), NULL, NULL, G_CALLBACK(watch_thread_cb) },
722 {"Message/Mark/UnwatchThread", NULL, N_("Unwatch thread"), NULL, NULL, G_CALLBACK(unwatch_thread_cb) },
725 {"Message/Mark/MarkSpam", NULL, N_("Mark as _spam"), NULL, NULL, G_CALLBACK(mark_as_spam_cb) },
726 {"Message/Mark/MarkHam", NULL, N_("Mark as _ham"), NULL, NULL, G_CALLBACK(mark_as_ham_cb) },
729 {"Message/Mark/Lock", NULL, N_("Lock"), NULL, NULL, G_CALLBACK(lock_msgs_cb) },
730 {"Message/Mark/Unlock", NULL, N_("Unlock"), NULL, NULL, G_CALLBACK(unlock_msgs_cb) },
732 {"Message/ColorLabel", NULL, N_("Color la_bel"), NULL, NULL, NULL },
733 {"Message/Tags", NULL, N_("Ta_gs"), NULL, NULL, NULL },
734 /*{"Message/---", NULL, "---", NULL, NULL, NULL },*/
736 {"Message/Reedit", NULL, N_("Re-_edit"), NULL, NULL, G_CALLBACK(reedit_cb) },
737 /*{"Message/---", NULL, "---", NULL, NULL, NULL },*/
739 {"Message/CheckSignature", NULL, N_("Check signature"), "C", NULL, G_CALLBACK(check_signature_cb) },
743 {"Tools/AddressBook", NULL, N_("_Address book"), "<control><shift>A", NULL, G_CALLBACK(addressbook_open_cb) },
744 {"Tools/AddSenderToAB", NULL, N_("Add sender to address boo_k"), NULL, NULL, G_CALLBACK(add_address_cb) },
746 {"Tools/CollectAddresses", NULL, N_("C_ollect addresses"), NULL, NULL, NULL },
747 {"Tools/CollectAddresses/FromFolder", NULL, N_("From current _folder..."), NULL, NULL, G_CALLBACK(addr_harvest_cb) },
748 {"Tools/CollectAddresses/FromSelected", NULL, N_("From selected _messages..."), NULL, NULL, G_CALLBACK(addr_harvest_msg_cb) },
749 {"Tools/---", NULL, "---", NULL, NULL, NULL },
751 {"Tools/FilterFolder", NULL, N_("_Filter all messages in folder"), NULL, NULL, G_CALLBACK(filter_cb) },
752 {"Tools/FilterSelected", NULL, N_("Filter _selected messages"), NULL, NULL, G_CALLBACK(filter_list_cb) },
753 {"Tools/RunProcessing", NULL, N_("Run folder pr_ocessing rules"), NULL, NULL, G_CALLBACK(process_cb) },
755 {"Tools/CreateFilterRule", NULL, N_("_Create filter rule"), NULL, NULL, NULL },
756 {"Tools/CreateFilterRule/Automatically", NULL, N_("_Automatically"), NULL, NULL, G_CALLBACK(create_filter_cb) }, /* FILTER_BY_AUTO */
757 {"Tools/CreateFilterRule/ByFrom", NULL, N_("By _From"), NULL, NULL, G_CALLBACK(create_filter_cb) }, /* FILTER_BY_FROM */
758 {"Tools/CreateFilterRule/ByTo", NULL, N_("By _To"), NULL, NULL, G_CALLBACK(create_filter_cb) }, /* FILTER_BY_TO */
759 {"Tools/CreateFilterRule/BySubject", NULL, N_("By _Subject"), NULL, NULL, G_CALLBACK(create_filter_cb) }, /* FILTER_BY_SUBJECT */
760 {"Tools/CreateFilterRule/BySender", NULL, N_("By S_ender"), NULL, NULL, G_CALLBACK(create_filter_cb) }, /* FILTER_BY_SENDER */
762 {"Tools/CreateProcessingRule", NULL, N_("Create processing rule"), NULL, NULL, NULL },
763 {"Tools/CreateProcessingRule/Automatically", NULL, N_("_Automatically"), NULL, NULL, G_CALLBACK(create_processing_cb) },
764 {"Tools/CreateProcessingRule/ByFrom", NULL, N_("By _From"), NULL, NULL, G_CALLBACK(create_processing_cb) },
765 {"Tools/CreateProcessingRule/ByTo", NULL, N_("By _To"), NULL, NULL, G_CALLBACK(create_processing_cb) },
766 {"Tools/CreateProcessingRule/BySubject", NULL, N_("By _Subject"), NULL, NULL, G_CALLBACK(create_processing_cb) },
767 {"Tools/CreateProcessingRule/BySender", NULL, N_("By S_ender"), NULL, NULL, G_CALLBACK(create_processing_cb) },
768 /* {"Tools/---", NULL, "---", NULL, NULL, NULL }, */
770 {"Tools/ListUrls", NULL, N_("List _URLs..."), "<control><shift>U", NULL, G_CALLBACK(open_urls_cb) },
772 /* {"Tools/---", NULL, "---", NULL, NULL, NULL }, */
773 {"Tools/Actions", NULL, N_("Actio_ns"), NULL, NULL, NULL },
774 {"Tools/Actions/PlaceHolder", NULL, "Placeholder", NULL, NULL, G_CALLBACK(mainwindow_nothing_cb) },
775 /* {"Tools/---", NULL, "---", NULL, NULL, NULL }, */
777 {"Tools/CheckNewMessages", NULL, N_("Ch_eck for new messages in all folders"), NULL, NULL, G_CALLBACK(update_folderview_cb) },
778 {"Tools/DeleteDuplicates", NULL, N_("Delete du_plicated messages"), NULL, NULL, NULL },
779 {"Tools/DeleteDuplicates/SelFolder", NULL, N_("In selected folder"), NULL, NULL, G_CALLBACK(delete_duplicated_cb) },
780 {"Tools/DeleteDuplicates/AllFolders", NULL, N_("In all folders"), NULL, NULL, G_CALLBACK(delete_duplicated_all_cb) },
781 /* {"Tools/---", NULL, "---", NULL, NULL, NULL }, */
783 {"Tools/Execute", NULL, N_("E_xecute"), "X", NULL, G_CALLBACK(execute_summary_cb) },
784 {"Tools/Expunge", NULL, N_("Exp_unge"), "<control>E", NULL, G_CALLBACK(expunge_summary_cb) },
786 /* {"Tools/---", NULL, "---", NULL, NULL, NULL }, */
787 {"Tools/SSLCertificates", NULL, N_("TLS cer_tificates"), NULL, NULL, G_CALLBACK(ssl_manager_open_cb) },
789 /* {"Tools/---", NULL, "---", NULL, NULL, NULL }, */
790 {"Tools/FilteringLog", NULL, N_("Filtering Lo_g"), NULL, NULL, G_CALLBACK(filtering_debug_window_show_cb) },
791 {"Tools/NetworkLog", NULL, N_("Network _Log"), "<shift><control>L", NULL, G_CALLBACK(log_window_show_cb) },
793 {"Tools/DebugLog", NULL, N_("Debug _Log"), NULL, NULL, G_CALLBACK(debug_log_show_cb) },
795 /* {"Tools/---", NULL, "---", NULL, NULL, NULL }, */
796 {"Tools/ForgetSessionPasswords", NULL, N_("_Forget all session passwords"), NULL, NULL, G_CALLBACK(forget_session_passwords_cb) },
797 #ifndef PASSWORD_CRYPTO_OLD
798 {"Tools/ForgetMasterPassphrase", NULL, N_("Forget _master passphrase"), NULL, NULL, G_CALLBACK(forget_master_passphrase_cb) },
801 /* Configuration menu */
802 {"Configuration/ChangeAccount", NULL, N_("C_hange current account"), NULL, NULL, NULL },
803 {"Configuration/ChangeAccount/PlaceHolder", NULL, "Placeholder", NULL, NULL, G_CALLBACK(mainwindow_nothing_cb) },
804 {"Configuration/AccountPrefs", NULL, N_("_Preferences for current account..."), NULL, NULL, G_CALLBACK(prefs_account_open_cb) },
805 {"Configuration/CreateAccount", NULL, N_("Create _new account..."), NULL, NULL, G_CALLBACK(new_account_cb) },
806 {"Configuration/EditAccounts", NULL, N_("_Edit accounts..."), NULL, NULL, G_CALLBACK(account_edit_open) },
807 {"Configuration/---", NULL, "---", NULL, NULL, NULL },
809 {"Configuration/Preferences", NULL, N_("P_references..."), NULL, NULL, G_CALLBACK(prefs_open_cb) },
810 {"Configuration/PreProcessing", NULL, N_("Pre-pr_ocessing..."), NULL, NULL, G_CALLBACK(prefs_pre_processing_open_cb) },
811 {"Configuration/PostProcessing", NULL, N_("Post-pro_cessing..."), NULL, NULL, G_CALLBACK(prefs_post_processing_open_cb) },
812 {"Configuration/Filtering", NULL, N_("_Filtering..."), NULL, NULL, G_CALLBACK(prefs_filtering_open_cb) },
813 {"Configuration/Templates", NULL, N_("_Templates..."), NULL, NULL, G_CALLBACK(prefs_template_open_cb) },
814 {"Configuration/Actions", NULL, N_("_Actions..."), NULL, NULL, G_CALLBACK(prefs_actions_open_cb) },
815 {"Configuration/Tags", NULL, N_("Tag_s..."), NULL, NULL, G_CALLBACK(prefs_tags_open_cb) },
816 /* {"Configuration/---", NULL, "---", NULL, NULL, NULL }, */
817 {"Configuration/Plugins", NULL, N_("Plu_gins..."), NULL, NULL, G_CALLBACK(plugins_open_cb) },
820 {"Help/Manual", NULL, N_("_Manual"), NULL, NULL, G_CALLBACK(manual_open_cb) },
821 {"Help/FAQ", NULL, N_("_Online User-contributed FAQ"), NULL, NULL, G_CALLBACK(manual_faq_open_cb) },
822 {"Help/IconLegend", NULL, N_("Icon _Legend"), NULL, NULL, G_CALLBACK(legend_open_cb) },
824 {"Help/SetDefault", NULL, N_("Set as default client"), NULL, NULL, G_CALLBACK(set_default_client_cb) },
826 {"Help/---", NULL, "---", NULL, NULL, NULL },
827 {"Help/About", NULL, N_("_About"), NULL, NULL, G_CALLBACK(about_cb) },
830 static GtkToggleActionEntry mainwin_toggle_entries[] = {
831 {"File/OfflineMode", NULL, N_("Offline _mode"), "<control>W", NULL, G_CALLBACK(toggle_work_offline_cb), FALSE }, /*toggle*/
832 {"View/ShowHide/MenuBar", NULL, N_("Men_ubar"), "<control>F12", NULL, G_CALLBACK(toggle_menubar_cb), FALSE }, /* toggle */
833 {"View/ShowHide/MessageView", NULL, N_("_Message view"), "V", NULL, G_CALLBACK(toggle_message_cb), FALSE }, /* toggle */
835 {"View/ShowHide/StatusBar", NULL, N_("Status _bar"), NULL, NULL, G_CALLBACK(toggle_statusbar_cb), FALSE }, /* toggle */
837 {"View/ShowHide/ColumnHeaders", NULL, N_("Column headers"), NULL, NULL, G_CALLBACK(toggle_col_headers_cb), FALSE }, /* toggle */
838 {"View/ThreadView", NULL, N_("Th_read view"), "<control>T", NULL, G_CALLBACK(thread_cb), FALSE }, /* toggle */
839 {"View/HideReadThreads", NULL, N_("Hide read threads"), NULL, NULL, G_CALLBACK(hide_read_threads), FALSE }, /* toggle */
840 {"View/HideReadMessages", NULL, N_("_Hide read messages"), NULL, NULL, G_CALLBACK(hide_read_messages), FALSE }, /* toggle */
841 {"View/HideDelMessages", NULL, N_("Hide deleted messages"), NULL, NULL, G_CALLBACK(hide_del_messages), FALSE }, /* toggle */
842 {"View/FullScreen", NULL, N_("_Fullscreen"), "F11", NULL, G_CALLBACK(toggle_fullscreen_cb), FALSE }, /* toggle */
843 {"View/AllHeaders", NULL, N_("Show all _headers"), "<control>H", NULL, G_CALLBACK(show_all_header_cb), FALSE }, /* toggle */
844 {"View/Quotes/CollapseAll", NULL, N_("_Collapse all"), "<control><shift>Q", NULL, G_CALLBACK(hide_quotes_cb), FALSE }, /* 1 toggle */
845 {"View/Quotes/Collapse2", NULL, N_("Collapse from level _2"), NULL, NULL, G_CALLBACK(hide_quotes_cb), FALSE }, /* 2 toggle */
846 {"View/Quotes/Collapse3", NULL, N_("Collapse from level _3"), NULL, NULL, G_CALLBACK(hide_quotes_cb), FALSE }, /* 3 toggle */
849 static GtkRadioActionEntry mainwin_showhide_radio_entries[] = { /* toggle_toolbar_cb */
850 {"View/ShowHide/Toolbar/TextBelowIcon", NULL, N_("Text _below icons"), NULL, NULL, TOOLBAR_BOTH }, /* radio TOOLBAR_BOTH */
851 {"View/ShowHide/Toolbar/TextBesideIcon", NULL, N_("Text be_side icons"), NULL, NULL, TOOLBAR_BOTH_HORIZ }, /* radio TOOLBAR_BOTH_HORIZ */
852 {"View/ShowHide/Toolbar/IconOnly", NULL, N_("_Icons only"), NULL, NULL, TOOLBAR_ICON }, /* radio TOOLBAR_ICON */
853 {"View/ShowHide/Toolbar/TextOnly", NULL, N_("_Text only"), NULL, NULL, TOOLBAR_TEXT }, /* radio TOOLBAR_TEXT */
855 {"View/ShowHide/Toolbar/Hide", NULL, N_("_Hide"), NULL, NULL, TOOLBAR_NONE }, /* radio TOOLBAR_NONE */
859 static GtkRadioActionEntry mainwin_layout_radio_entries[] = { /* set_layout_cb */
860 {"View/Layout/Standard", NULL, N_("_Standard"), NULL, NULL, NORMAL_LAYOUT }, /* radio NORMAL_LAYOUT */
861 {"View/Layout/ThreeColumns", NULL, N_("_Three columns"), NULL, NULL, VERTICAL_LAYOUT }, /* radio VERTICAL_LAYOUT */
862 {"View/Layout/WideMessage", NULL, N_("_Wide message"), NULL, NULL, WIDE_LAYOUT }, /* radio WIDE_LAYOUT */
863 {"View/Layout/WideMessageList", NULL, N_("W_ide message list"), NULL, NULL, WIDE_MSGLIST_LAYOUT }, /* radio WIDE_MSGLIST_LAYOUT */
864 {"View/Layout/SmallScreen", NULL, N_("S_mall screen"), NULL, NULL, SMALL_LAYOUT }, /* radio SMALL_LAYOUT */
867 static GtkRadioActionEntry mainwin_sort_radio_entries[] = { /* sort_summary_cb */
868 {"View/Sort/Number", NULL, N_("By _number"), NULL, NULL, SORT_BY_NUMBER }, /* radio SORT_BY_NUMBER */
869 {"View/Sort/Size", NULL, N_("By s_ize"), NULL, NULL, SORT_BY_SIZE }, /* radio SORT_BY_SIZE */
870 {"View/Sort/Date", NULL, N_("By _date"), NULL, NULL, SORT_BY_DATE }, /* radio SORT_BY_DATE */
871 {"View/Sort/ThreadDate", NULL, N_("By thread date"), NULL, NULL, SORT_BY_THREAD_DATE }, /* radio SORT_BY_THREAD_DATE */
872 {"View/Sort/From", NULL, N_("By _From"), NULL, NULL, SORT_BY_FROM }, /* radio SORT_BY_FROM */
873 {"View/Sort/To", NULL, N_("By _To"), NULL, NULL, SORT_BY_TO }, /* radio SORT_BY_TO */
874 {"View/Sort/Subject", NULL, N_("By s_ubject"), NULL, NULL, SORT_BY_SUBJECT }, /* radio SORT_BY_SUBJECT */
875 {"View/Sort/Color", NULL, N_("By _color label"), NULL, NULL, SORT_BY_LABEL }, /* radio SORT_BY_LABEL */
876 {"View/Sort/Tag", NULL, N_("By tag"), NULL, NULL, SORT_BY_TAGS }, /* radio SORT_BY_TAGS */
877 {"View/Sort/Mark", NULL, N_("By _mark"), NULL, NULL, SORT_BY_MARK }, /* radio SORT_BY_MARK */
878 {"View/Sort/Status", NULL, N_("By _status"), NULL, NULL, SORT_BY_STATUS }, /* radio SORT_BY_STATUS */
879 {"View/Sort/Attachment", NULL, N_("By a_ttachment"), NULL, NULL, SORT_BY_MIME }, /* radio SORT_BY_MIME */
880 {"View/Sort/Score", NULL, N_("By score"), NULL, NULL, SORT_BY_SCORE }, /* radio SORT_BY_SCORE */
881 {"View/Sort/Locked", NULL, N_("By locked"), NULL, NULL, SORT_BY_LOCKED }, /* radio SORT_BY_LOCKED */
882 {"View/Sort/DontSort", NULL, N_("D_on't sort"), NULL, NULL, SORT_BY_NONE }, /* radio SORT_BY_NONE */
885 static GtkRadioActionEntry mainwin_sorttype_radio_entries[] = { /* sort_summary_type_cb */
886 {"View/Sort/Ascending", NULL, N_("Ascending"), NULL, NULL, SORT_ASCENDING }, /* radio SORT_ASCENDING */
887 {"View/Sort/Descending", NULL, N_("Descending"), NULL, NULL, SORT_DESCENDING }, /* radio SORT_DESCENDING */
890 static GtkRadioActionEntry mainwin_radio_enc_entries[] =
892 ENC_ACTION(CS_AUTO, C_AUTO, N_("_Automatic")), /* RADIO set_charset_cb */
893 ENC_ACTION(CS_US_ASCII, C_US_ASCII, N_("7bit ASCII (US-ASC_II)")), /* RADIO set_charset_cb */
894 ENC_ACTION(CS_UTF_8, C_UTF_8, N_("Unicode (_UTF-8)")), /* RADIO set_charset_cb */
895 ENC_ACTION("Western/"CS_ISO_8859_1, C_ISO_8859_1, "ISO-8859-_1"), /* RADIO set_charset_cb */
896 ENC_ACTION("Western/"CS_ISO_8859_15, C_ISO_8859_15, "ISO-8859-15"), /* RADIO set_charset_cb */
897 ENC_ACTION("Western/"CS_WINDOWS_1252, C_WINDOWS_1252, "Windows-1252"), /* RADIO set_charset_cb */
898 ENC_ACTION(CS_ISO_8859_2, C_ISO_8859_2, N_("Central European (ISO-8859-_2)")), /* RADIO set_charset_cb */
899 ENC_ACTION("Baltic/"CS_ISO_8859_13, C_ISO_8859_13, "ISO-8859-13"), /* RADIO set_charset_cb */
900 ENC_ACTION("Baltic/"CS_ISO_8859_4, C_ISO_8859_14, "ISO-8859-_4"), /* RADIO set_charset_cb */
901 ENC_ACTION(CS_ISO_8859_7, C_ISO_8859_7, N_("Greek (ISO-8859-_7)")), /* RADIO set_charset_cb */
902 ENC_ACTION("Hebrew/"CS_ISO_8859_8, C_ISO_8859_8, "ISO-8859-_8"), /* RADIO set_charset_cb */
903 ENC_ACTION("Hebrew/"CS_WINDOWS_1255, C_WINDOWS_1255, "Windows-1255"), /* RADIO set_charset_cb */
904 ENC_ACTION("Arabic/"CS_ISO_8859_6, C_ISO_8859_6, "ISO-8859-_6"), /* RADIO set_charset_cb */
905 ENC_ACTION("Arabic/"CS_WINDOWS_1256, C_WINDOWS_1256, "Windows-1256"), /* RADIO set_charset_cb */
906 ENC_ACTION(CS_ISO_8859_9, C_ISO_8859_9, N_("Turkish (ISO-8859-_9)")), /* RADIO set_charset_cb */
907 ENC_ACTION("Cyrillic/"CS_ISO_8859_5, C_ISO_8859_5, "ISO-8859-_5"), /* RADIO set_charset_cb */
908 ENC_ACTION("Cyrillic/"CS_KOI8_R, C_KOI8_R, "KOI8-_R"), /* RADIO set_charset_cb */
909 ENC_ACTION("Cyrillic/"CS_MACCYR, C_MACCYR, "_Mac-Cyrillic"), /* RADIO set_charset_cb */
910 ENC_ACTION("Cyrillic/"CS_KOI8_U, C_KOI8_U, "KOI8-_U"), /* RADIO set_charset_cb */
911 ENC_ACTION("Cyrillic/"CS_WINDOWS_1251, C_WINDOWS_1251, "Windows-1251"), /* RADIO set_charset_cb */
912 ENC_ACTION("Japanese/"CS_ISO_2022_JP, C_ISO_2022_JP, "ISO-2022-_JP"), /* RADIO set_charset_cb */
913 ENC_ACTION("Japanese/"CS_ISO_2022_JP_2, C_ISO_2022_JP_2, "ISO-2022-JP-_2"), /* RADIO set_charset_cb */
914 ENC_ACTION("Japanese/"CS_EUC_JP, C_EUC_JP, "_EUC-JP"), /* RADIO set_charset_cb */
915 ENC_ACTION("Japanese/"CS_SHIFT_JIS, C_SHIFT_JIS, "_Shift-JIS"), /* RADIO set_charset_cb */
916 ENC_ACTION("Chinese/"CS_GB18030, C_GB18030, "_GB18030"), /* RADIO set_charset_cb */
917 ENC_ACTION("Chinese/"CS_GB2312, C_GB2312, "_GB2312"), /* RADIO set_charset_cb */
918 ENC_ACTION("Chinese/"CS_GBK, C_GBK, "GB_K"), /* RADIO set_charset_cb */
919 ENC_ACTION("Chinese/"CS_BIG5, C_BIG5, "_Big5-JP"), /* RADIO set_charset_cb */
920 ENC_ACTION("Chinese/"CS_EUC_TW, C_EUC_TW, "EUC-_TW"), /* RADIO set_charset_cb */
921 ENC_ACTION("Korean/"CS_EUC_KR, C_EUC_KR, "_EUC-KR"), /* RADIO set_charset_cb */
922 ENC_ACTION("Korean/"CS_ISO_2022_KR, C_ISO_2022_KR, "_ISO-2022-KR"), /* RADIO set_charset_cb */
923 ENC_ACTION("Thai/"CS_TIS_620, C_TIS_620, "_TIS-620-KR"), /* RADIO set_charset_cb */
924 ENC_ACTION("Thai/"CS_WINDOWS_874, C_WINDOWS_874, "_Windows-874"), /* RADIO set_charset_cb */
927 static GtkRadioActionEntry mainwin_radio_dec_entries[] =
929 DEC_ACTION("AutoDetect", 0, N_("_Auto detect")), /* set_decode_cb */
931 DEC_ACTION("8bit", ENC_8BIT, "_8bit"),
932 DEC_ACTION("QP", ENC_QUOTED_PRINTABLE, "_Quoted printable"),
933 DEC_ACTION("B64", ENC_BASE64, "_Base64"),
934 DEC_ACTION("Uuencode", ENC_X_UUENCODE, "_Uuencode"),
937 static gboolean offline_ask_sync = TRUE;
938 static gboolean is_obscured = FALSE;
940 #define N_COLOR_LABELS colorlabel_get_color_count()
942 static void mainwindow_colorlabel_menu_item_activate_item_cb(GtkMenuItem *menu_item,
947 GtkCheckMenuItem **items;
949 GList *children, *cur;
952 mainwin = (MainWindow *)data;
953 cm_return_if_fail(mainwin != NULL);
955 sel = summary_get_selection(mainwin->summaryview);
958 menu = GTK_MENU_SHELL(mainwin->colorlabel_menu);
959 cm_return_if_fail(menu != NULL);
961 Xalloca(items, (N_COLOR_LABELS + 1) * sizeof(GtkWidget *), return);
963 /* NOTE: don't return prematurely because we set the "dont_toggle"
964 * state for check menu items. This would be bad! */
965 g_object_set_data(G_OBJECT(menu), "dont_toggle",
968 /* clear items. get item pointers. */
969 children = gtk_container_get_children(GTK_CONTAINER(menu));
970 for (n = 0, cur = children; cur != NULL && cur->data != NULL; cur = cur->next) {
971 if (GTK_IS_CHECK_MENU_ITEM(cur->data)) {
972 gtk_check_menu_item_set_active
973 (GTK_CHECK_MENU_ITEM(cur->data), FALSE);
974 items[n] = GTK_CHECK_MENU_ITEM(cur->data);
979 g_list_free(children);
981 if (n == (N_COLOR_LABELS + 1)) {
982 /* iterate all messages and set the state of the appropriate
984 for (; sel != NULL; sel = sel->next) {
988 msginfo = (MsgInfo *)sel->data;
990 clabel = MSG_GET_COLORLABEL_VALUE(msginfo->flags);
991 if (!gtk_check_menu_item_get_active(items[clabel]))
992 gtk_check_menu_item_set_active
993 (items[clabel], TRUE);
997 g_warning("invalid number of color elements (%d)", n);
1000 /* reset "dont_toggle" state */
1001 g_object_set_data(G_OBJECT(menu), "dont_toggle",
1002 GINT_TO_POINTER(0));
1005 static void mainwindow_colorlabel_menu_item_activate_cb(GtkWidget *widget,
1008 guint color = GPOINTER_TO_UINT(data);
1009 MainWindow *mainwin;
1011 mainwin = g_object_get_data(G_OBJECT(widget), "mainwin");
1012 cm_return_if_fail(mainwin != NULL);
1014 /* "dont_toggle" state set? */
1015 if (g_object_get_data(G_OBJECT(mainwin->colorlabel_menu),
1019 summary_set_colorlabel(mainwin->summaryview, color, NULL);
1022 static void mainwindow_tags_menu_item_activate_item_cb(GtkMenuItem *menu_item,
1025 MainWindow *mainwin;
1027 GList *children, *cur;
1029 GHashTable *menu_table = g_hash_table_new_full(
1033 GHashTable *menu_allsel_table = g_hash_table_new_full(
1038 mainwin = (MainWindow *)data;
1039 cm_return_if_fail(mainwin != NULL);
1041 sel = summary_get_selection(mainwin->summaryview);
1044 menu = GTK_MENU_SHELL(mainwin->tags_menu);
1045 cm_return_if_fail(menu != NULL);
1047 /* NOTE: don't return prematurely because we set the "dont_toggle"
1048 * state for check menu items */
1049 g_object_set_data(G_OBJECT(menu), "dont_toggle",
1050 GINT_TO_POINTER(1));
1052 /* clear items. get item pointers. */
1053 children = gtk_container_get_children(GTK_CONTAINER(menu));
1054 for (cur = children; cur != NULL && cur->data != NULL; cur = cur->next) {
1055 if (GTK_IS_CHECK_MENU_ITEM(cur->data)) {
1056 gint id = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(cur->data),
1058 gtk_check_menu_item_set_active
1059 (GTK_CHECK_MENU_ITEM(cur->data), FALSE);
1061 g_hash_table_insert(menu_table, GINT_TO_POINTER(id), GTK_CHECK_MENU_ITEM(cur->data));
1062 g_hash_table_insert(menu_allsel_table, GINT_TO_POINTER(id), GINT_TO_POINTER(0));
1066 g_list_free(children);
1068 /* iterate all messages and set the state of the appropriate
1071 for (; sel != NULL; sel = sel->next) {
1073 GSList *tags = NULL;
1074 GtkCheckMenuItem *item;
1075 msginfo = (MsgInfo *)sel->data;
1078 tags = msginfo->tags;
1082 for (; tags; tags = tags->next) {
1083 gint num_checked = GPOINTER_TO_INT(g_hash_table_lookup(menu_allsel_table, tags->data));
1084 item = g_hash_table_lookup(menu_table, GINT_TO_POINTER(tags->data));
1085 if (item && !gtk_check_menu_item_get_active(item)) {
1086 gtk_check_menu_item_set_active
1090 g_hash_table_replace(menu_allsel_table, tags->data, GINT_TO_POINTER(num_checked));
1095 children = gtk_container_get_children(GTK_CONTAINER(menu));
1096 for (cur = children; cur != NULL && cur->data != NULL; cur = cur->next) {
1097 if (GTK_IS_CHECK_MENU_ITEM(cur->data)) {
1098 gint id = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(cur->data),
1100 gint num_checked = GPOINTER_TO_INT(g_hash_table_lookup(menu_allsel_table, GINT_TO_POINTER(id)));
1101 if (num_checked < sel_len && num_checked > 0)
1102 gtk_check_menu_item_set_inconsistent(GTK_CHECK_MENU_ITEM(cur->data), TRUE);
1104 gtk_check_menu_item_set_inconsistent(GTK_CHECK_MENU_ITEM(cur->data), FALSE);
1107 g_list_free(children);
1109 g_hash_table_destroy(menu_table);
1110 g_hash_table_destroy(menu_allsel_table);
1111 /* reset "dont_toggle" state */
1112 g_object_set_data(G_OBJECT(menu), "dont_toggle",
1113 GINT_TO_POINTER(0));
1116 static void mainwindow_tags_menu_item_activate_cb(GtkWidget *widget,
1119 gint id = GPOINTER_TO_INT(data);
1120 gboolean set = gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(widget));
1121 MainWindow *mainwin;
1123 mainwin = g_object_get_data(G_OBJECT(widget), "mainwin");
1124 cm_return_if_fail(mainwin != NULL);
1126 /* "dont_toggle" state set? */
1127 if (g_object_get_data(G_OBJECT(mainwin->tags_menu),
1133 summary_set_tag(mainwin->summaryview, id, NULL);
1136 void mainwin_accel_changed_cb (GtkAccelGroup *accelgroup, guint keyval, GdkModifierType modifier,
1137 GClosure *closure, GtkMenuItem *item)
1139 GList *closures = gtk_widget_list_accel_closures(GTK_WIDGET(item));
1141 for (cur = closures; cur; cur = cur->next) {
1142 if (closure == cur->data) {
1143 GtkLabel *label = g_object_get_data(G_OBJECT(item), "accel_label");
1146 if (keyval == GDK_KEY_Delete) {
1147 const gchar *accel_path;
1148 accel_path = gtk_menu_item_get_accel_path(item);
1149 keyval = 0; modifier = 0;
1150 gtk_accel_map_change_entry (accel_path, keyval, modifier, TRUE);
1152 new_accel = gtk_accelerator_get_label(keyval, modifier);
1153 gtk_label_set_text(label, new_accel);
1157 g_list_free(closures);
1160 static void mainwindow_colorlabel_menu_create(MainWindow *mainwin, gboolean refresh)
1162 GtkWidget *label_menuitem;
1166 gchar *accel_path = NULL;
1168 label_menuitem = gtk_ui_manager_get_widget(mainwin->ui_manager, "/Menu/Message/ColorLabel");
1169 g_signal_connect(G_OBJECT(label_menuitem), "activate",
1170 G_CALLBACK(mainwindow_colorlabel_menu_item_activate_item_cb),
1172 gtk_widget_show(label_menuitem);
1174 menu = gtk_menu_new();
1175 gtk_menu_set_accel_group (GTK_MENU (menu),
1176 gtk_ui_manager_get_accel_group(mainwin->ui_manager));
1178 /* create sub items. for the menu item activation callback we pass the
1179 * index of label_colors[] as data parameter. for the None color we
1180 * pass an invalid (high) value. also we attach a data pointer so we
1181 * can always get back the Mainwindow pointer. */
1183 item = gtk_check_menu_item_new_with_label(_("None"));
1184 gtk_menu_shell_append(GTK_MENU_SHELL(menu), item);
1185 g_signal_connect(G_OBJECT(item), "activate",
1186 G_CALLBACK(mainwindow_colorlabel_menu_item_activate_cb),
1187 GUINT_TO_POINTER(0));
1188 g_object_set_data(G_OBJECT(item), "mainwin", mainwin);
1189 gtk_widget_show(item);
1191 accel_path = g_strdup_printf("<ClawsColorLabels>/None");
1192 gtk_menu_item_set_accel_path(GTK_MENU_ITEM(item), accel_path);
1194 gtk_accel_map_add_entry("<ClawsColorLabels>/None", GDK_KEY_0, GDK_CONTROL_MASK);
1195 item = gtk_menu_item_new();
1196 gtk_menu_shell_append(GTK_MENU_SHELL(menu), item);
1197 gtk_widget_show(item);
1199 /* create pixmap/label menu items */
1200 for (i = 0; i < N_COLOR_LABELS; i++) {
1201 item = colorlabel_create_check_color_menu_item(
1202 i, refresh, MAINWIN_COLORMENU);
1203 gtk_menu_shell_append(GTK_MENU_SHELL(menu), item);
1204 g_signal_connect(G_OBJECT(item), "activate",
1205 G_CALLBACK(mainwindow_colorlabel_menu_item_activate_cb),
1206 GUINT_TO_POINTER(i + 1));
1207 g_object_set_data(G_OBJECT(item), "mainwin",
1209 gtk_widget_show(item);
1210 accel_path = g_strdup_printf("<ClawsColorLabels>/%d", i+1);
1211 gtk_menu_item_set_accel_path(GTK_MENU_ITEM(item), accel_path);
1213 gtk_accel_map_add_entry(accel_path, GDK_KEY_1+i, GDK_CONTROL_MASK);
1215 g_signal_connect (gtk_ui_manager_get_accel_group(mainwin->ui_manager),
1216 "accel-changed", G_CALLBACK (mainwin_accel_changed_cb), item);
1220 gtk_widget_show(menu);
1221 gtk_menu_item_set_submenu(GTK_MENU_ITEM(label_menuitem), menu);
1222 mainwin->colorlabel_menu = menu;
1225 static void mainwindow_tags_menu_item_apply_tags_activate_cb(GtkWidget *widget,
1228 MainWindow *mainwin;
1230 mainwin = g_object_get_data(G_OBJECT(widget), "mainwin");
1231 cm_return_if_fail(mainwin != NULL);
1233 /* "dont_toggle" state set? */
1234 if (g_object_get_data(G_OBJECT(mainwin->tags_menu),
1238 tags_window_open(summary_get_selection(mainwin->summaryview));
1241 static gint mainwin_tag_cmp_list(gconstpointer a, gconstpointer b)
1243 gint id_a = GPOINTER_TO_INT(a);
1244 gint id_b = GPOINTER_TO_INT(b);
1245 const gchar *tag_a = tags_get_tag(id_a);
1246 const gchar *tag_b = tags_get_tag(id_b);
1250 return tag_b == NULL ? 0:1;
1255 return g_utf8_collate(tag_a, tag_b);
1258 static void mainwindow_tags_menu_create(MainWindow *mainwin, gboolean refresh)
1260 GtkWidget *label_menuitem;
1263 GSList *cur = tags_get_list();
1264 GSList *orig = NULL;
1265 gboolean existing_tags = FALSE;
1267 cur = orig = g_slist_sort(cur, mainwin_tag_cmp_list);
1269 label_menuitem = gtk_ui_manager_get_widget(mainwin->ui_manager, "/Menu/Message/Tags");
1270 g_signal_connect(G_OBJECT(label_menuitem), "activate",
1271 G_CALLBACK(mainwindow_tags_menu_item_activate_item_cb),
1274 gtk_widget_show(label_menuitem);
1276 menu = gtk_menu_new();
1277 gtk_menu_set_accel_group (GTK_MENU (menu),
1278 gtk_ui_manager_get_accel_group(mainwin->ui_manager));
1280 /* create tags menu items */
1281 for (; cur; cur = cur->next) {
1282 gint id = GPOINTER_TO_INT(cur->data);
1283 const gchar *tag = tags_get_tag(id);
1285 item = gtk_check_menu_item_new_with_label(tag);
1286 gtk_menu_shell_append(GTK_MENU_SHELL(menu), item);
1287 g_signal_connect(G_OBJECT(item), "activate",
1288 G_CALLBACK(mainwindow_tags_menu_item_activate_cb),
1289 GINT_TO_POINTER(id));
1290 g_object_set_data(G_OBJECT(item), "mainwin",
1292 g_object_set_data(G_OBJECT(item), "tag_id",
1293 GINT_TO_POINTER(id));
1294 gtk_widget_show(item);
1295 accel_path = g_strconcat("<ClawsTags>/",tag, NULL);
1296 gtk_menu_item_set_accel_path(GTK_MENU_ITEM(item), accel_path);
1298 existing_tags = TRUE;
1300 if (existing_tags) {
1302 item = gtk_menu_item_new();
1303 gtk_menu_shell_append(GTK_MENU_SHELL(menu), item);
1304 gtk_widget_show(item);
1307 item = gtk_menu_item_new_with_label(_("Modify tags..."));
1308 gtk_menu_shell_append(GTK_MENU_SHELL(menu), item);
1309 g_signal_connect(G_OBJECT(item), "activate",
1310 G_CALLBACK(mainwindow_tags_menu_item_apply_tags_activate_cb),
1312 g_object_set_data(G_OBJECT(item), "mainwin",
1314 gtk_widget_show(item);
1315 accel_path = g_strdup_printf("<ClawsTags>/ModifyTags");
1316 gtk_menu_item_set_accel_path(GTK_MENU_ITEM(item), accel_path);
1318 gtk_accel_map_add_entry("<ClawsTags>/ModifyTags", GDK_KEY_T, GDK_CONTROL_MASK|GDK_SHIFT_MASK);
1320 gtk_widget_show(menu);
1321 gtk_menu_item_set_submenu(GTK_MENU_ITEM(label_menuitem), menu);
1322 mainwin->tags_menu = menu;
1324 #ifndef GENERIC_UMPC
1325 static gboolean warning_icon_pressed(GtkWidget *widget, GdkEventButton *evt,
1326 MainWindow *mainwindow)
1328 if (evt && evt->button == 1) {
1329 log_window_show_error(mainwindow->logwin);
1330 gtk_widget_hide(mainwindow->warning_btn);
1335 static gboolean warning_visi_notify(GtkWidget *widget,
1336 GdkEventVisibility *event,
1337 MainWindow *mainwindow)
1339 gdk_window_set_cursor(gtk_widget_get_window(mainwindow->warning_btn), hand_cursor);
1343 static gboolean warning_leave_notify(GtkWidget *widget,
1344 GdkEventCrossing *event,
1345 MainWindow *mainwindow)
1347 gdk_window_set_cursor(gtk_widget_get_window(mainwindow->warning_btn), NULL);
1351 static gboolean warning_enter_notify(GtkWidget *widget,
1352 GdkEventCrossing *event,
1353 MainWindow *mainwindow)
1355 gdk_window_set_cursor(gtk_widget_get_window(mainwindow->warning_btn), hand_cursor);
1359 void mainwindow_show_error(void)
1361 MainWindow *mainwin = mainwindow_get_mainwindow();
1362 gtk_widget_show(mainwin->warning_btn);
1365 void mainwindow_clear_error(MainWindow *mainwin)
1367 gtk_widget_hide(mainwin->warning_btn);
1370 #define BREAK_ON_MODIFIER_KEY() \
1371 if ((event->state & (GDK_MOD1_MASK|GDK_CONTROL_MASK)) != 0) break
1373 static gboolean mainwindow_key_pressed (GtkWidget *widget, GdkEventKey *event,
1376 MainWindow *mainwin = (MainWindow*) data;
1378 if (!mainwin || !event)
1381 if (quicksearch_has_focus(mainwin->summaryview->quicksearch))
1384 quicksearch_get_entry(mainwin->summaryview->quicksearch);
1386 g_signal_emit_by_name(entry, "key-press-event", event, &handled);
1392 switch (event->keyval) {
1393 case GDK_KEY_Q: /* Quit */
1394 BREAK_ON_MODIFIER_KEY();
1396 if (gtk_window_is_active(GTK_WINDOW(mainwin->window))) {
1397 app_exit_cb(NULL, mainwin);
1401 BREAK_ON_MODIFIER_KEY();
1402 if (gtk_window_is_active(GTK_WINDOW(mainwin->window))) {
1403 if (mainwin->folderview != NULL && mainwin->summaryview != NULL
1404 && ((!mainwin->summaryview->displayed
1405 && !mainwin->summaryview->selected)
1406 || (mainwin->summaryview->folder_item
1407 && mainwin->summaryview->folder_item->total_msgs == 0))) {
1408 g_signal_stop_emission_by_name(G_OBJECT(widget),
1410 folderview_select_next_with_flag(mainwin->folderview, MSG_UNREAD);
1420 #undef BREAK_ON_MODIFIER_KEY
1422 MainWindow *main_window_create()
1424 MainWindow *mainwin;
1428 GtkWidget *handlebox;
1429 GtkWidget *vbox_body;
1430 GtkWidget *menuitem;
1431 #ifndef GENERIC_UMPC
1432 GtkWidget *hbox_stat;
1433 GtkWidget *statusbar;
1434 GtkWidget *progressbar;
1435 GtkWidget *statuslabel;
1436 GtkWidget *ac_button;
1437 GtkWidget *ac_label;
1438 GtkWidget *online_pixmap;
1439 GtkWidget *offline_pixmap;
1440 GtkWidget *warning_icon;
1441 GtkWidget *warning_btn;
1443 GtkWidget *online_switch;
1444 GtkWidget *offline_switch;
1445 FolderView *folderview;
1446 SummaryView *summaryview;
1447 MessageView *messageview;
1448 GdkColormap *colormap;
1449 gboolean success[4];
1454 static GdkGeometry geometry;
1456 debug_print("Creating main window...\n");
1457 mainwin = g_new0(MainWindow, 1);
1460 window = GTK_WIDGET(gtkut_window_new(GTK_WINDOW_TOPLEVEL, "mainwindow"));
1461 gtk_window_set_title(GTK_WINDOW(window), PROG_VERSION);
1462 gtk_window_set_resizable(GTK_WINDOW(window), TRUE);
1464 prefs_common.layout_mode = SMALL_LAYOUT;
1466 if (!geometry.min_height) {
1467 geometry.min_width = 320;
1468 geometry.min_height = 200;
1470 gtk_window_set_geometry_hints(GTK_WINDOW(window), NULL, &geometry,
1473 g_signal_connect(G_OBJECT(window), "delete_event",
1474 G_CALLBACK(main_window_close_cb), mainwin);
1475 MANAGE_WINDOW_SIGNALS_CONNECT(window);
1476 g_signal_connect(G_OBJECT(window), "focus_in_event",
1477 G_CALLBACK(mainwindow_focus_in_event),
1479 g_signal_connect(G_OBJECT(window), "key_press_event",
1480 G_CALLBACK(mainwindow_key_pressed), mainwin);
1482 gtk_widget_realize(window);
1483 gtk_widget_add_events(window, GDK_KEY_PRESS_MASK|GDK_KEY_RELEASE_MASK);
1486 gtkut_widget_set_app_icon(window);
1488 vbox = gtk_vbox_new(FALSE, 0);
1489 gtk_widget_show(vbox);
1490 gtk_container_add(GTK_CONTAINER(window), vbox);
1494 mainwin->ui_manager = gtk_ui_manager_new();
1495 mainwin->action_group = cm_menu_create_action_group_full(mainwin->ui_manager,"Menu", mainwin_entries,
1496 G_N_ELEMENTS(mainwin_entries), (gpointer)mainwin);
1497 gtk_action_group_add_toggle_actions(mainwin->action_group, mainwin_toggle_entries,
1498 G_N_ELEMENTS(mainwin_toggle_entries), (gpointer)mainwin);
1499 gtk_action_group_add_radio_actions(mainwin->action_group, mainwin_showhide_radio_entries,
1500 G_N_ELEMENTS(mainwin_showhide_radio_entries), C_AUTO, G_CALLBACK(toggle_toolbar_cb), (gpointer)mainwin);
1501 #ifndef GENERIC_UMPC
1502 gtk_action_group_add_radio_actions(mainwin->action_group, mainwin_layout_radio_entries,
1503 G_N_ELEMENTS(mainwin_layout_radio_entries), C_AUTO, G_CALLBACK(set_layout_cb), (gpointer)mainwin);
1505 gtk_action_group_add_radio_actions(mainwin->action_group, mainwin_sort_radio_entries,
1506 G_N_ELEMENTS(mainwin_sort_radio_entries), C_AUTO, G_CALLBACK(sort_summary_cb), (gpointer)mainwin);
1507 gtk_action_group_add_radio_actions(mainwin->action_group, mainwin_sorttype_radio_entries,
1508 G_N_ELEMENTS(mainwin_sorttype_radio_entries), C_AUTO, G_CALLBACK(sort_summary_type_cb), (gpointer)mainwin);
1509 gtk_action_group_add_radio_actions(mainwin->action_group, mainwin_radio_enc_entries,
1510 G_N_ELEMENTS(mainwin_radio_enc_entries), C_AUTO, G_CALLBACK(set_charset_cb), (gpointer)mainwin);
1511 gtk_action_group_add_radio_actions(mainwin->action_group, mainwin_radio_dec_entries,
1512 G_N_ELEMENTS(mainwin_radio_dec_entries), C_AUTO, G_CALLBACK(set_decode_cb), (gpointer)mainwin);
1514 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/", "Menu", NULL, GTK_UI_MANAGER_MENUBAR)
1515 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu", "File", "File", GTK_UI_MANAGER_MENU)
1516 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu", "Edit", "Edit", GTK_UI_MANAGER_MENU)
1517 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu", "View", "View", GTK_UI_MANAGER_MENU)
1518 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu", "Message", "Message", GTK_UI_MANAGER_MENU)
1519 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu", "Tools", "Tools", GTK_UI_MANAGER_MENU)
1520 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu", "Configuration", "Configuration", GTK_UI_MANAGER_MENU)
1521 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu", "Help", "Help", GTK_UI_MANAGER_MENU)
1524 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/File", "AddMailbox", "File/AddMailbox", GTK_UI_MANAGER_MENU)
1525 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/File/AddMailbox", "MH", "File/AddMailbox/MH", GTK_UI_MANAGER_MENUITEM)
1526 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/File", "Separator1", "File/---", GTK_UI_MANAGER_SEPARATOR)
1527 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/File", "SortMailboxes", "File/SortMailboxes", GTK_UI_MANAGER_MENUITEM)
1528 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/File", "Separator2", "File/---", GTK_UI_MANAGER_SEPARATOR)
1529 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/File", "ImportMbox", "File/ImportMbox", GTK_UI_MANAGER_MENUITEM)
1530 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/File", "ExportMbox", "File/ExportMbox", GTK_UI_MANAGER_MENUITEM)
1531 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/File", "ExportSelMbox", "File/ExportSelMbox", GTK_UI_MANAGER_MENUITEM)
1532 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/File", "Separator3", "File/---", GTK_UI_MANAGER_SEPARATOR)
1533 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/File", "EmptyTrashes", "File/EmptyTrashes", GTK_UI_MANAGER_MENUITEM)
1534 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/File", "Separator4", "File/---", GTK_UI_MANAGER_SEPARATOR)
1535 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/File", "SaveAs", "File/SaveAs", GTK_UI_MANAGER_MENUITEM)
1536 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/File", "SavePartAs", "File/SavePartAs", GTK_UI_MANAGER_MENUITEM)
1537 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/File", "Separator5", "File/---", GTK_UI_MANAGER_SEPARATOR)
1538 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/File", "PageSetup", "File/PageSetup", GTK_UI_MANAGER_MENUITEM)
1539 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/File", "Print", "File/Print", GTK_UI_MANAGER_MENUITEM)
1540 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/File", "Separator6", "File/---", GTK_UI_MANAGER_SEPARATOR)
1541 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/File", "OfflineMode", "File/OfflineMode", GTK_UI_MANAGER_MENUITEM)
1542 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/File", "SynchroniseFolders", "File/SynchroniseFolders", GTK_UI_MANAGER_MENUITEM)
1543 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/File", "Separator7", "File/---", GTK_UI_MANAGER_SEPARATOR)
1544 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/File", "Exit", "File/Exit", GTK_UI_MANAGER_MENUITEM)
1547 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Edit", "Copy", "Edit/Copy", GTK_UI_MANAGER_MENUITEM)
1548 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Edit", "SelectAll", "Edit/SelectAll", GTK_UI_MANAGER_MENUITEM)
1549 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Edit", "SelectThread", "Edit/SelectThread", GTK_UI_MANAGER_MENUITEM)
1550 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Edit", "Separator1", "Edit/---", GTK_UI_MANAGER_SEPARATOR)
1551 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Edit", "Find", "Edit/Find", GTK_UI_MANAGER_MENUITEM)
1552 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Edit", "SearchFolder", "Edit/SearchFolder", GTK_UI_MANAGER_MENUITEM)
1553 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Edit", "QuickSearch", "Edit/QuickSearch", GTK_UI_MANAGER_MENUITEM)
1556 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View", "ShowHide", "View/ShowHide", GTK_UI_MANAGER_MENU)
1557 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/ShowHide", "MenuBar", "View/ShowHide/MenuBar", GTK_UI_MANAGER_MENUITEM)
1558 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/ShowHide", "Toolbar", "View/ShowHide/Toolbar", GTK_UI_MANAGER_MENU)
1559 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/ShowHide/Toolbar", "TextBelowIcon", "View/ShowHide/Toolbar/TextBelowIcon", GTK_UI_MANAGER_MENUITEM)
1560 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/ShowHide/Toolbar", "TextBesideIcon", "View/ShowHide/Toolbar/TextBesideIcon", GTK_UI_MANAGER_MENUITEM)
1561 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/ShowHide/Toolbar", "IconOnly", "View/ShowHide/Toolbar/IconOnly", GTK_UI_MANAGER_MENUITEM)
1562 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/ShowHide/Toolbar", "TextOnly", "View/ShowHide/Toolbar/TextOnly", GTK_UI_MANAGER_MENUITEM)
1563 #ifndef GENERIC_UMPC
1564 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/ShowHide/Toolbar", "Hide", "View/ShowHide/Toolbar/Hide", GTK_UI_MANAGER_MENUITEM)
1566 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/ShowHide", "MessageView", "View/ShowHide/MessageView", GTK_UI_MANAGER_MENUITEM)
1567 #ifndef GENERIC_UMPC
1568 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/ShowHide", "StatusBar", "View/ShowHide/StatusBar", GTK_UI_MANAGER_MENUITEM)
1570 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/ShowHide", "ColumnHeaders", "View/ShowHide/ColumnHeaders", GTK_UI_MANAGER_MENUITEM)
1571 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View", "SetColumns", "View/SetColumns", GTK_UI_MANAGER_MENU)
1572 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/SetColumns", "Folderlist", "View/SetColumns/Folderlist", GTK_UI_MANAGER_MENUITEM)
1573 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/SetColumns", "Messagelist", "View/SetColumns/Messagelist", GTK_UI_MANAGER_MENUITEM)
1574 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View", "Separator1", "View/---", GTK_UI_MANAGER_SEPARATOR)
1576 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View", "FullScreen", "View/FullScreen", GTK_UI_MANAGER_MENUITEM)
1577 #ifndef GENERIC_UMPC
1578 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View", "Layout", "View/Layout", GTK_UI_MANAGER_MENU)
1579 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Layout", "Standard", "View/Layout/Standard", GTK_UI_MANAGER_MENUITEM)
1580 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Layout", "ThreeColumns", "View/Layout/ThreeColumns", GTK_UI_MANAGER_MENUITEM)
1581 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Layout", "WideMessage", "View/Layout/WideMessage", GTK_UI_MANAGER_MENUITEM)
1582 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Layout", "WideMessageList", "View/Layout/WideMessageList", GTK_UI_MANAGER_MENUITEM)
1583 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Layout", "SmallScreen", "View/Layout/SmallScreen", GTK_UI_MANAGER_MENUITEM)
1584 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View", "Separator2", "View/---", GTK_UI_MANAGER_SEPARATOR)
1587 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View", "Sort", "View/Sort", GTK_UI_MANAGER_MENU)
1588 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Sort", "Number", "View/Sort/Number", GTK_UI_MANAGER_MENUITEM)
1589 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Sort", "Size", "View/Sort/Size", GTK_UI_MANAGER_MENUITEM)
1590 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Sort", "Date", "View/Sort/Date", GTK_UI_MANAGER_MENUITEM)
1591 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Sort", "ThreadDate", "View/Sort/ThreadDate", GTK_UI_MANAGER_MENUITEM)
1592 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Sort", "From", "View/Sort/From", GTK_UI_MANAGER_MENUITEM)
1593 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Sort", "To", "View/Sort/To", GTK_UI_MANAGER_MENUITEM)
1594 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Sort", "Subject", "View/Sort/Subject", GTK_UI_MANAGER_MENUITEM)
1595 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Sort", "Color", "View/Sort/Color", GTK_UI_MANAGER_MENUITEM)
1596 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Sort", "Tag", "View/Sort/Tag", GTK_UI_MANAGER_MENUITEM)
1597 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Sort", "Mark", "View/Sort/Mark", GTK_UI_MANAGER_MENUITEM)
1598 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Sort", "Status", "View/Sort/Status", GTK_UI_MANAGER_MENUITEM)
1599 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Sort", "Attachment", "View/Sort/Attachment", GTK_UI_MANAGER_MENUITEM)
1600 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Sort", "Score", "View/Sort/Score", GTK_UI_MANAGER_MENUITEM)
1601 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Sort", "Locked", "View/Sort/Locked", GTK_UI_MANAGER_MENUITEM)
1602 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Sort", "DontSort", "View/Sort/DontSort", GTK_UI_MANAGER_MENUITEM)
1603 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Sort", "Separator1", "View/Sort/---", GTK_UI_MANAGER_SEPARATOR)
1604 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Sort", "Ascending", "View/Sort/Ascending", GTK_UI_MANAGER_MENUITEM)
1605 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Sort", "Descending", "View/Sort/Descending", GTK_UI_MANAGER_MENUITEM)
1606 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Sort", "Separator2", "View/Sort/---", GTK_UI_MANAGER_SEPARATOR)
1607 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Sort", "AttractSubj", "View/Sort/AttractSubj", GTK_UI_MANAGER_MENUITEM)
1609 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View", "ThreadView", "View/ThreadView", GTK_UI_MANAGER_MENUITEM)
1610 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View", "ExpandThreads", "View/ExpandThreads", GTK_UI_MANAGER_MENUITEM)
1611 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View", "CollapseThreads", "View/CollapseThreads", GTK_UI_MANAGER_MENUITEM)
1612 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View", "HideReadThreads", "View/HideReadThreads", GTK_UI_MANAGER_MENUITEM)
1613 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View", "HideReadMessages", "View/HideReadMessages", GTK_UI_MANAGER_MENUITEM)
1614 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View", "HideDelMessages", "View/HideDelMessages", GTK_UI_MANAGER_MENUITEM)
1615 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View", "Separator3", "View/---", GTK_UI_MANAGER_SEPARATOR)
1617 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View", "Goto", "View/Goto", GTK_UI_MANAGER_MENU)
1618 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Goto", "Prev", "View/Goto/Prev", GTK_UI_MANAGER_MENUITEM)
1619 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Goto", "Next", "View/Goto/Next", GTK_UI_MANAGER_MENUITEM)
1620 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Goto", "Separator1", "View/Goto/---", GTK_UI_MANAGER_SEPARATOR)
1621 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Goto", "PrevUnread", "View/Goto/PrevUnread", GTK_UI_MANAGER_MENUITEM)
1622 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Goto", "NextUnread", "View/Goto/NextUnread", GTK_UI_MANAGER_MENUITEM)
1623 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Goto", "Separator2", "View/Goto/---", GTK_UI_MANAGER_SEPARATOR)
1624 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Goto", "PrevNew", "View/Goto/PrevNew", GTK_UI_MANAGER_MENUITEM)
1625 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Goto", "NextNew", "View/Goto/NextNew", GTK_UI_MANAGER_MENUITEM)
1626 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Goto", "Separator3", "View/Goto/---", GTK_UI_MANAGER_SEPARATOR)
1627 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Goto", "PrevMarked", "View/Goto/PrevMarked", GTK_UI_MANAGER_MENUITEM)
1628 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Goto", "NextMarked", "View/Goto/NextMarked", GTK_UI_MANAGER_MENUITEM)
1629 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Goto", "Separator4", "View/Goto/---", GTK_UI_MANAGER_SEPARATOR)
1630 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Goto", "PrevLabeled", "View/Goto/PrevLabeled", GTK_UI_MANAGER_MENUITEM)
1631 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Goto", "NextLabeled", "View/Goto/NextLabeled", GTK_UI_MANAGER_MENUITEM)
1632 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Goto", "Separator5", "View/Goto/---", GTK_UI_MANAGER_SEPARATOR)
1633 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Goto", "PrevHistory", "View/Goto/PrevHistory", GTK_UI_MANAGER_MENUITEM)
1634 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Goto", "NextHistory", "View/Goto/NextHistory", GTK_UI_MANAGER_MENUITEM)
1635 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Goto", "Separator6", "View/Goto/---", GTK_UI_MANAGER_SEPARATOR)
1636 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Goto", "ParentMessage", "View/Goto/ParentMessage", GTK_UI_MANAGER_MENUITEM)
1637 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Goto", "Separator7", "View/Goto/---", GTK_UI_MANAGER_SEPARATOR)
1638 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Goto", "NextUnreadFolder", "View/Goto/NextUnreadFolder", GTK_UI_MANAGER_MENUITEM)
1639 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Goto", "Folder", "View/Goto/Folder", GTK_UI_MANAGER_MENUITEM)
1640 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Goto", "Separator8", "View/Goto/---", GTK_UI_MANAGER_SEPARATOR)
1641 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Goto", "NextPart", "View/Goto/NextPart", GTK_UI_MANAGER_MENUITEM)
1642 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Goto", "PrevPart", "View/Goto/PrevPart", GTK_UI_MANAGER_MENUITEM)
1643 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View", "Scroll", "View/Scroll", GTK_UI_MANAGER_MENU)
1644 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Scroll", "PrevLine", "View/Scroll/PrevLine", GTK_UI_MANAGER_MENUITEM)
1645 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Scroll", "NextLine", "View/Scroll/NextLine", GTK_UI_MANAGER_MENUITEM)
1646 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Scroll", "PrevPage", "View/Scroll/PrevPage", GTK_UI_MANAGER_MENUITEM)
1647 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Scroll", "NextPage", "View/Scroll/NextPage", GTK_UI_MANAGER_MENUITEM)
1648 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View", "Separator4", "View/---", GTK_UI_MANAGER_SEPARATOR)
1650 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View", "Encoding", "View/Encoding", GTK_UI_MANAGER_MENU)
1651 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding", CS_AUTO, "View/Encoding/"CS_AUTO, GTK_UI_MANAGER_MENUITEM)
1652 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding", "Separator1", "View/Encoding/---", GTK_UI_MANAGER_SEPARATOR)
1653 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding", CS_US_ASCII, "View/Encoding/"CS_US_ASCII, GTK_UI_MANAGER_MENUITEM)
1654 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding", CS_UTF_8, "View/Encoding/"CS_UTF_8, GTK_UI_MANAGER_MENUITEM)
1655 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding", "Separator2", "View/Encoding/---", GTK_UI_MANAGER_SEPARATOR)
1657 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding", "Western", "View/Encoding/Western", GTK_UI_MANAGER_MENU)
1658 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding/Western", CS_ISO_8859_1, "View/Encoding/Western/"CS_ISO_8859_1, GTK_UI_MANAGER_MENUITEM)
1659 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding/Western", CS_ISO_8859_15, "View/Encoding/Western/"CS_ISO_8859_15, GTK_UI_MANAGER_MENUITEM)
1660 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding/Western", CS_WINDOWS_1252, "View/Encoding/Western/"CS_WINDOWS_1252, GTK_UI_MANAGER_MENUITEM)
1662 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding", CS_ISO_8859_2, "View/Encoding/"CS_ISO_8859_2, GTK_UI_MANAGER_MENUITEM)
1664 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding", "Baltic", "View/Encoding/Baltic", GTK_UI_MANAGER_MENU)
1665 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding/Baltic", CS_ISO_8859_13, "View/Encoding/Baltic/"CS_ISO_8859_13, GTK_UI_MANAGER_MENUITEM)
1666 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding/Baltic", CS_ISO_8859_4, "View/Encoding/Baltic/"CS_ISO_8859_4, GTK_UI_MANAGER_MENUITEM)
1668 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding", CS_ISO_8859_7, "View/Encoding/"CS_ISO_8859_7, GTK_UI_MANAGER_MENUITEM)
1670 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding", "Hebrew", "View/Encoding/Hebrew", GTK_UI_MANAGER_MENU)
1671 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding/Hebrew", CS_ISO_8859_8, "View/Encoding/Hebrew/"CS_ISO_8859_8, GTK_UI_MANAGER_MENUITEM)
1672 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding/Hebrew", CS_WINDOWS_1255, "View/Encoding/Hebrew/"CS_WINDOWS_1255, GTK_UI_MANAGER_MENUITEM)
1674 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding", "Arabic", "View/Encoding/Arabic", GTK_UI_MANAGER_MENU)
1675 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding/Arabic", CS_ISO_8859_6, "View/Encoding/Arabic/"CS_ISO_8859_6, GTK_UI_MANAGER_MENUITEM)
1676 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding/Arabic", CS_WINDOWS_1256, "View/Encoding/Arabic/"CS_WINDOWS_1256, GTK_UI_MANAGER_MENUITEM)
1678 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding", CS_ISO_8859_9, "View/Encoding/"CS_ISO_8859_9, GTK_UI_MANAGER_MENUITEM)
1680 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding", "Cyrillic", "View/Encoding/Cyrillic", GTK_UI_MANAGER_MENU)
1681 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding/Cyrillic", CS_ISO_8859_5, "View/Encoding/Cyrillic/"CS_ISO_8859_5, GTK_UI_MANAGER_MENUITEM)
1682 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding/Cyrillic", CS_KOI8_R, "View/Encoding/Cyrillic/"CS_KOI8_R, GTK_UI_MANAGER_MENUITEM)
1683 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding/Cyrillic", CS_MACCYR, "View/Encoding/Cyrillic/"CS_MACCYR, GTK_UI_MANAGER_MENUITEM)
1684 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding/Cyrillic", CS_KOI8_U, "View/Encoding/Cyrillic/"CS_KOI8_U, GTK_UI_MANAGER_MENUITEM)
1685 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding/Cyrillic", CS_WINDOWS_1251, "View/Encoding/Cyrillic/"CS_WINDOWS_1251, GTK_UI_MANAGER_MENUITEM)
1687 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding", "Japanese", "View/Encoding/Japanese", GTK_UI_MANAGER_MENU)
1688 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding/Japanese", CS_ISO_2022_JP, "View/Encoding/Japanese/"CS_ISO_2022_JP, GTK_UI_MANAGER_MENUITEM)
1689 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding/Japanese", CS_ISO_2022_JP_2, "View/Encoding/Japanese/"CS_ISO_2022_JP_2, GTK_UI_MANAGER_MENUITEM)
1690 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding/Japanese", CS_EUC_JP, "View/Encoding/Japanese/"CS_EUC_JP, GTK_UI_MANAGER_MENUITEM)
1691 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding/Japanese", CS_SHIFT_JIS, "View/Encoding/Japanese/"CS_SHIFT_JIS, GTK_UI_MANAGER_MENUITEM)
1693 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding", "Chinese", "View/Encoding/Chinese", GTK_UI_MANAGER_MENU)
1694 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding/Chinese", CS_GB18030, "View/Encoding/Chinese/"CS_GB18030, GTK_UI_MANAGER_MENUITEM)
1695 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding/Chinese", CS_GB2312, "View/Encoding/Chinese/"CS_GB2312, GTK_UI_MANAGER_MENUITEM)
1696 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding/Chinese", CS_GBK, "View/Encoding/Chinese/"CS_GBK, GTK_UI_MANAGER_MENUITEM)
1697 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding/Chinese", CS_BIG5, "View/Encoding/Chinese/"CS_BIG5, GTK_UI_MANAGER_MENUITEM)
1698 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding/Chinese", CS_EUC_TW, "View/Encoding/Chinese/"CS_EUC_TW, GTK_UI_MANAGER_MENUITEM)
1700 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding", "Korean", "View/Encoding/Korean", GTK_UI_MANAGER_MENU)
1701 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding/Korean", CS_EUC_KR, "View/Encoding/Korean/"CS_EUC_KR, GTK_UI_MANAGER_MENUITEM)
1702 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding/Korean", CS_ISO_2022_KR, "View/Encoding/Korean/"CS_ISO_2022_KR, GTK_UI_MANAGER_MENUITEM)
1704 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding", "Thai", "View/Encoding/Thai", GTK_UI_MANAGER_MENU)
1705 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding/Thai", CS_TIS_620, "View/Encoding/Thai/"CS_TIS_620, GTK_UI_MANAGER_MENUITEM)
1706 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding/Thai", CS_WINDOWS_874, "View/Encoding/Thai/"CS_WINDOWS_874, GTK_UI_MANAGER_MENUITEM)
1708 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View", "Decode", "View/Decode", GTK_UI_MANAGER_MENU)
1709 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Decode", "AutoDetect", "View/Decode/AutoDetect", GTK_UI_MANAGER_MENUITEM)
1710 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Decode", "Separator1", "View/Decode/---", GTK_UI_MANAGER_SEPARATOR)
1711 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Decode", "8bit", "View/Decode/8bit", GTK_UI_MANAGER_MENUITEM)
1712 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Decode", "QP", "View/Decode/QP", GTK_UI_MANAGER_MENUITEM)
1713 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Decode", "B64", "View/Decode/B64", GTK_UI_MANAGER_MENUITEM)
1714 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Decode", "Uuencode", "View/Decode/Uuencode", GTK_UI_MANAGER_MENUITEM)
1715 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View", "Separator5", "View/---", GTK_UI_MANAGER_SEPARATOR)
1717 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View", "OpenNewWindow", "View/OpenNewWindow", GTK_UI_MANAGER_MENUITEM)
1718 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View", "MessageSource", "View/MessageSource", GTK_UI_MANAGER_MENUITEM)
1719 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View", "AllHeaders", "View/AllHeaders", GTK_UI_MANAGER_MENUITEM)
1720 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View", "Quotes", "View/Quotes", GTK_UI_MANAGER_MENU)
1721 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Quotes", "CollapseAll", "View/Quotes/CollapseAll", GTK_UI_MANAGER_MENUITEM)
1722 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Quotes", "Collapse2", "View/Quotes/Collapse2", GTK_UI_MANAGER_MENUITEM)
1723 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Quotes", "Collapse3", "View/Quotes/Collapse3", GTK_UI_MANAGER_MENUITEM)
1724 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View", "Part", "View/Part", GTK_UI_MANAGER_MENU)
1725 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Part", "AsText", "View/Part/AsText", GTK_UI_MANAGER_MENUITEM)
1726 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Part", "Open", "View/Part/Open", GTK_UI_MANAGER_MENUITEM)
1728 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Part", "OpenWith", "View/Part/OpenWith", GTK_UI_MANAGER_MENUITEM)
1730 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View", "Separator8", "View/---", GTK_UI_MANAGER_SEPARATOR)
1731 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View", "UpdateSummary", "View/UpdateSummary", GTK_UI_MANAGER_MENUITEM)
1734 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message", "Receive", "Message/Receive", GTK_UI_MANAGER_MENU)
1735 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/Receive", "CurrentAccount", "Message/Receive/CurrentAccount", GTK_UI_MANAGER_MENUITEM)
1736 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/Receive", "AllAccounts", "Message/Receive/AllAccounts", GTK_UI_MANAGER_MENUITEM)
1737 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/Receive", "CancelReceiving", "Message/Receive/CancelReceiving", GTK_UI_MANAGER_MENUITEM)
1738 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/Receive", "Separator1", "Message/Receive/---", GTK_UI_MANAGER_SEPARATOR)
1739 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/Receive", "PlaceHolder", "Message/Receive/PlaceHolder", GTK_UI_MANAGER_MENUITEM)
1740 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message", "SendQueue", "Message/SendQueue", GTK_UI_MANAGER_MENUITEM)
1741 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message", "CancelSending", "Message/CancelSending", GTK_UI_MANAGER_MENUITEM)
1742 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message", "Separator1", "Message/---", GTK_UI_MANAGER_SEPARATOR)
1744 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message", "ComposeEmail", "Message/ComposeEmail", GTK_UI_MANAGER_MENUITEM)
1745 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message", "ComposeNews", "Message/ComposeNews", GTK_UI_MANAGER_MENUITEM)
1746 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message", "Reply", "Message/Reply", GTK_UI_MANAGER_MENUITEM)
1747 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message", "ReplyTo", "Message/ReplyTo", GTK_UI_MANAGER_MENU)
1748 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/ReplyTo", "All", "Message/ReplyTo/All", GTK_UI_MANAGER_MENUITEM)
1749 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/ReplyTo", "Sender", "Message/ReplyTo/Sender", GTK_UI_MANAGER_MENUITEM)
1750 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/ReplyTo", "List", "Message/ReplyTo/List", GTK_UI_MANAGER_MENUITEM)
1751 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message", "FollowupReply", "Message/FollowupReply", GTK_UI_MANAGER_MENUITEM)
1752 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message", "Separator2", "Message/---", GTK_UI_MANAGER_SEPARATOR)
1754 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message", "Forward", "Message/Forward", GTK_UI_MANAGER_MENUITEM)
1755 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message", "ForwardAtt", "Message/ForwardAtt", GTK_UI_MANAGER_MENUITEM)
1756 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message", "Redirect", "Message/Redirect", GTK_UI_MANAGER_MENUITEM)
1757 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message", "MailingList", "Message/MailingList", GTK_UI_MANAGER_MENU)
1758 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/MailingList", "Post", "Message/MailingList/Post", GTK_UI_MANAGER_MENU)
1759 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/MailingList", "Help", "Message/MailingList/Help", GTK_UI_MANAGER_MENU)
1760 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/MailingList", "Subscribe", "Message/MailingList/Subscribe", GTK_UI_MANAGER_MENU)
1761 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/MailingList", "Unsubscribe", "Message/MailingList/Unsubscribe", GTK_UI_MANAGER_MENU)
1762 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/MailingList", "ViewArchive", "Message/MailingList/ViewArchive", GTK_UI_MANAGER_MENU)
1763 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/MailingList", "ContactOwner", "Message/MailingList/ContactOwner", GTK_UI_MANAGER_MENU)
1764 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/MailingList/Post", "PlaceHolder", "Message/MailingList/Post/PlaceHolder", GTK_UI_MANAGER_MENUITEM)
1765 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/MailingList/Help", "PlaceHolder", "Message/MailingList/Help/PlaceHolder", GTK_UI_MANAGER_MENUITEM)
1766 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/MailingList/Subscribe", "PlaceHolder", "Message/MailingList/Subscribe/PlaceHolder", GTK_UI_MANAGER_MENUITEM)
1767 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/MailingList/Unsubscribe", "PlaceHolder", "Message/MailingList/Unsubscribe/PlaceHolder", GTK_UI_MANAGER_MENUITEM)
1768 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/MailingList/ViewArchive", "PlaceHolder", "Message/MailingList/ViewArchive/PlaceHolder", GTK_UI_MANAGER_MENUITEM)
1769 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/MailingList/ContactOwner", "PlaceHolder", "Message/MailingList/ContactOwner/PlaceHolder", GTK_UI_MANAGER_MENUITEM)
1770 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message", "Separator3", "Message/---", GTK_UI_MANAGER_SEPARATOR)
1772 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message", "Move", "Message/Move", GTK_UI_MANAGER_MENUITEM)
1773 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message", "Copy", "Message/Copy", GTK_UI_MANAGER_MENUITEM)
1774 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message", "Trash", "Message/Trash", GTK_UI_MANAGER_MENUITEM)
1775 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message", "Delete", "Message/Delete", GTK_UI_MANAGER_MENUITEM)
1776 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message", "TrashThread", "Message/TrashThread", GTK_UI_MANAGER_MENUITEM)
1777 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message", "DeleteThread", "Message/DeleteThread", GTK_UI_MANAGER_MENUITEM)
1778 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message", "CancelNews", "Message/CancelNews", GTK_UI_MANAGER_MENUITEM)
1779 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message", "Separator4", "Message/---", GTK_UI_MANAGER_SEPARATOR)
1781 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message", "Mark", "Message/Mark", GTK_UI_MANAGER_MENU)
1782 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/Mark", "Mark", "Message/Mark/Mark", GTK_UI_MANAGER_MENUITEM)
1783 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/Mark", "Unmark", "Message/Mark/Unmark", GTK_UI_MANAGER_MENUITEM)
1784 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/Mark", "Separator1", "Message/Mark/---", GTK_UI_MANAGER_SEPARATOR)
1785 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/Mark", "MarkRead", "Message/Mark/MarkRead", GTK_UI_MANAGER_MENUITEM)
1786 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/Mark", "MarkUnread", "Message/Mark/MarkUnread", GTK_UI_MANAGER_MENUITEM)
1787 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/Mark", "Separator2", "Message/Mark/---", GTK_UI_MANAGER_SEPARATOR)
1788 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/Mark", "MarkAllRead", "Message/Mark/MarkAllRead", GTK_UI_MANAGER_MENUITEM)
1789 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/Mark", "MarkAllUnread", "Message/Mark/MarkAllUnread", GTK_UI_MANAGER_MENUITEM)
1790 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/Mark", "Separator3", "Message/Mark/---", GTK_UI_MANAGER_SEPARATOR)
1791 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/Mark", "IgnoreThread", "Message/Mark/IgnoreThread", GTK_UI_MANAGER_MENUITEM)
1792 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/Mark", "UnignoreThread", "Message/Mark/UnignoreThread", GTK_UI_MANAGER_MENUITEM)
1793 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/Mark", "WatchThread", "Message/Mark/WatchThread", GTK_UI_MANAGER_MENUITEM)
1794 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/Mark", "UnwatchThread", "Message/Mark/UnwatchThread", GTK_UI_MANAGER_MENUITEM)
1795 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/Mark", "Separator4", "Message/Mark/---", GTK_UI_MANAGER_SEPARATOR)
1796 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/Mark", "MarkSpam", "Message/Mark/MarkSpam", GTK_UI_MANAGER_MENUITEM)
1797 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/Mark", "MarkHam", "Message/Mark/MarkHam", GTK_UI_MANAGER_MENUITEM)
1798 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/Mark", "Separator5", "Message/Mark/---", GTK_UI_MANAGER_SEPARATOR)
1799 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/Mark", "Lock", "Message/Mark/Lock", GTK_UI_MANAGER_MENUITEM)
1800 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/Mark", "Unlock", "Message/Mark/Unlock", GTK_UI_MANAGER_MENUITEM)
1801 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message", "ColorLabel", "Message/ColorLabel", GTK_UI_MANAGER_MENUITEM)
1802 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message", "Tags", "Message/Tags", GTK_UI_MANAGER_MENUITEM)
1803 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message", "Separator5", "Message/---", GTK_UI_MANAGER_SEPARATOR)
1805 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message", "Reedit", "Message/Reedit", GTK_UI_MANAGER_MENUITEM)
1806 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message", "Separator6", "Message/---", GTK_UI_MANAGER_SEPARATOR)
1807 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message", "CheckSignature", "Message/CheckSignature", GTK_UI_MANAGER_MENUITEM)
1810 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools", "AddressBook", "Tools/AddressBook", GTK_UI_MANAGER_MENUITEM)
1811 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools", "AddSenderToAB", "Tools/AddSenderToAB", GTK_UI_MANAGER_MENUITEM)
1812 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools", "CollectAddresses", "Tools/CollectAddresses", GTK_UI_MANAGER_MENU)
1813 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools/CollectAddresses", "FromFolder", "Tools/CollectAddresses/FromFolder", GTK_UI_MANAGER_MENUITEM)
1814 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools/CollectAddresses", "FromSelected", "Tools/CollectAddresses/FromSelected", GTK_UI_MANAGER_MENUITEM)
1815 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools", "Separator1", "Tools/---", GTK_UI_MANAGER_SEPARATOR)
1817 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools", "FilterFolder", "Tools/FilterFolder", GTK_UI_MANAGER_MENUITEM)
1818 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools", "FilterSelected", "Tools/FilterSelected", GTK_UI_MANAGER_MENUITEM)
1819 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools", "RunProcessing", "Tools/RunProcessing", GTK_UI_MANAGER_MENUITEM)
1820 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools", "CreateFilterRule", "Tools/CreateFilterRule", GTK_UI_MANAGER_MENU)
1821 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools/CreateFilterRule", "Automatically", "Tools/CreateFilterRule/Automatically", GTK_UI_MANAGER_MENUITEM)
1822 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools/CreateFilterRule", "ByFrom", "Tools/CreateFilterRule/ByFrom", GTK_UI_MANAGER_MENUITEM)
1823 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools/CreateFilterRule", "ByTo", "Tools/CreateFilterRule/ByTo", GTK_UI_MANAGER_MENUITEM)
1824 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools/CreateFilterRule", "BySubject", "Tools/CreateFilterRule/BySubject", GTK_UI_MANAGER_MENUITEM)
1825 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools/CreateFilterRule", "BySender", "Tools/CreateFilterRule/BySender", GTK_UI_MANAGER_MENUITEM)
1827 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools", "CreateProcessingRule", "Tools/CreateProcessingRule", GTK_UI_MANAGER_MENU)
1828 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools/CreateProcessingRule", "Automatically", "Tools/CreateProcessingRule/Automatically", GTK_UI_MANAGER_MENUITEM)
1829 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools/CreateProcessingRule", "ByFrom", "Tools/CreateProcessingRule/ByFrom", GTK_UI_MANAGER_MENUITEM)
1830 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools/CreateProcessingRule", "ByTo", "Tools/CreateProcessingRule/ByTo", GTK_UI_MANAGER_MENUITEM)
1831 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools/CreateProcessingRule", "BySubject", "Tools/CreateProcessingRule/BySubject", GTK_UI_MANAGER_MENUITEM)
1832 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools/CreateProcessingRule", "BySender", "Tools/CreateProcessingRule/BySender", GTK_UI_MANAGER_MENUITEM)
1833 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools", "Separator2", "Tools/---", GTK_UI_MANAGER_SEPARATOR)
1835 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools", "ListUrls", "Tools/ListUrls", GTK_UI_MANAGER_MENUITEM)
1836 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools", "Separator3", "Tools/---", GTK_UI_MANAGER_SEPARATOR)
1838 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools", "Actions", "Tools/Actions", GTK_UI_MANAGER_MENU)
1839 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools/Actions", "PlaceHolder", "Tools/Actions/PlaceHolder", GTK_UI_MANAGER_MENUITEM)
1840 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools", "Separator4", "Tools/---", GTK_UI_MANAGER_SEPARATOR)
1842 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools", "CheckNewMessages", "Tools/CheckNewMessages", GTK_UI_MANAGER_MENUITEM)
1843 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools", "DeleteDuplicates", "Tools/DeleteDuplicates", GTK_UI_MANAGER_MENU)
1844 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools/DeleteDuplicates", "SelFolder", "Tools/DeleteDuplicates/SelFolder", GTK_UI_MANAGER_MENUITEM)
1845 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools/DeleteDuplicates", "AllFolders", "Tools/DeleteDuplicates/AllFolders", GTK_UI_MANAGER_MENUITEM)
1846 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools", "Separator5", "Tools/---", GTK_UI_MANAGER_SEPARATOR)
1848 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools", "Execute", "Tools/Execute", GTK_UI_MANAGER_MENUITEM)
1849 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools", "Expunge", "Tools/Expunge", GTK_UI_MANAGER_MENUITEM)
1851 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools", "Separator6", "Tools/---", GTK_UI_MANAGER_SEPARATOR)
1852 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools", "SSLCertificates", "Tools/SSLCertificates", GTK_UI_MANAGER_MENUITEM)
1854 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools", "Separator7", "Tools/---", GTK_UI_MANAGER_SEPARATOR)
1855 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools", "FilteringLog", "Tools/FilteringLog", GTK_UI_MANAGER_MENUITEM)
1856 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools", "NetworkLog", "Tools/NetworkLog", GTK_UI_MANAGER_MENUITEM)
1858 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools", "DebugLog", "Tools/DebugLog", GTK_UI_MANAGER_MENUITEM)
1860 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools", "Separator8", "Tools/---", GTK_UI_MANAGER_SEPARATOR)
1861 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools", "ForgetSessionPasswords", "Tools/ForgetSessionPasswords", GTK_UI_MANAGER_MENUITEM)
1862 #ifndef PASSWORD_CRYPTO_OLD
1863 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools", "ForgetMasterPassphrase", "Tools/ForgetMasterPassphrase", GTK_UI_MANAGER_MENUITEM)
1865 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools", "Separator9", "Tools/---", GTK_UI_MANAGER_SEPARATOR)
1867 /* Configuration menu */
1868 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Configuration", "ChangeAccount", "Configuration/ChangeAccount", GTK_UI_MANAGER_MENU)
1869 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Configuration/ChangeAccount", "PlaceHolder", "Configuration/ChangeAccount/PlaceHolder", GTK_UI_MANAGER_MENUITEM)
1870 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Configuration", "AccountPrefs", "Configuration/AccountPrefs", GTK_UI_MANAGER_MENUITEM)
1871 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Configuration", "CreateAccount", "Configuration/CreateAccount", GTK_UI_MANAGER_MENUITEM)
1872 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Configuration", "EditAccounts", "Configuration/EditAccounts", GTK_UI_MANAGER_MENUITEM)
1873 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Configuration", "Separator1", "Configuration/---", GTK_UI_MANAGER_SEPARATOR)
1875 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Configuration", "Preferences", "Configuration/Preferences", GTK_UI_MANAGER_MENUITEM)
1876 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Configuration", "PreProcessing", "Configuration/PreProcessing", GTK_UI_MANAGER_MENUITEM)
1877 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Configuration", "PostProcessing", "Configuration/PostProcessing", GTK_UI_MANAGER_MENUITEM)
1878 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Configuration", "Filtering", "Configuration/Filtering", GTK_UI_MANAGER_MENUITEM)
1879 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Configuration", "Templates", "Configuration/Templates", GTK_UI_MANAGER_MENUITEM)
1880 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Configuration", "Actions", "Configuration/Actions", GTK_UI_MANAGER_MENUITEM)
1881 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Configuration", "Tags", "Configuration/Tags", GTK_UI_MANAGER_MENUITEM)
1883 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Configuration", "Separator2", "Configuration/---", GTK_UI_MANAGER_SEPARATOR)
1884 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Configuration", "Plugins", "Configuration/Plugins", GTK_UI_MANAGER_MENUITEM)
1887 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Help", "Manual", "Help/Manual", GTK_UI_MANAGER_MENUITEM)
1888 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Help", "FAQ", "Help/FAQ", GTK_UI_MANAGER_MENUITEM)
1889 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Help", "IconLegend", "Help/IconLegend", GTK_UI_MANAGER_MENUITEM)
1891 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Help", "Separator1", "Help/---", GTK_UI_MANAGER_SEPARATOR)
1892 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Help", "SetDefault", "Help/SetDefault", GTK_UI_MANAGER_MENUITEM)
1894 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Help", "Separator2", "Help/---", GTK_UI_MANAGER_SEPARATOR)
1895 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Help", "About", "Help/About", GTK_UI_MANAGER_MENUITEM)
1898 menubar = gtk_ui_manager_get_widget(mainwin->ui_manager, "/Menu");
1899 if (prefs_common.mainwin_menubar)
1900 gtk_widget_show_all(menubar);
1902 gtk_widget_hide(menubar);
1903 gtk_window_add_accel_group(GTK_WINDOW(window), gtk_ui_manager_get_accel_group(mainwin->ui_manager));
1905 /* Create a menu container for the different popup menus we
1906 * will be adding from other UI elements. */
1907 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/", "Menus", "Menus", GTK_UI_MANAGER_MENUBAR)
1909 gtk_box_pack_start(GTK_BOX(vbox), menubar, FALSE, TRUE, 0);
1911 if (prefs_common.toolbar_detachable) {
1912 handlebox = gtk_handle_box_new();
1913 gtk_widget_show(handlebox);
1914 gtk_box_pack_start(GTK_BOX(vbox), handlebox, FALSE, FALSE, 0);
1915 g_signal_connect(G_OBJECT(handlebox), "child_attached",
1916 G_CALLBACK(toolbar_child_attached), mainwin);
1917 g_signal_connect(G_OBJECT(handlebox), "child_detached",
1918 G_CALLBACK(toolbar_child_detached), mainwin);
1920 handlebox = gtk_hbox_new(FALSE, 0);
1921 gtk_widget_show(handlebox);
1922 gtk_box_pack_start(GTK_BOX(vbox), handlebox, FALSE, FALSE, 0);
1924 /* link window to mainwin->window to avoid gdk warnings */
1925 mainwin->window = window;
1926 mainwin_list = g_list_append(mainwin_list, mainwin);
1928 mainwin->toolbar = toolbar_create(TOOLBAR_MAIN,
1931 toolbar_set_learn_button
1935 /* vbox that contains body */
1936 vbox_body = gtk_vbox_new(FALSE, BORDER_WIDTH);
1937 gtk_widget_show(vbox_body);
1938 gtk_container_set_border_width(GTK_CONTAINER(vbox_body), BORDER_WIDTH);
1939 gtk_box_pack_start(GTK_BOX(vbox), vbox_body, TRUE, TRUE, 0);
1941 #ifndef GENERIC_UMPC
1942 hbox_stat = gtk_hbox_new(FALSE, 2);
1943 gtk_box_pack_end(GTK_BOX(vbox_body), hbox_stat, FALSE, FALSE, 0);
1945 warning_icon = gtk_image_new_from_stock
1946 (GTK_STOCK_DIALOG_WARNING, GTK_ICON_SIZE_SMALL_TOOLBAR);
1947 warning_btn = gtk_event_box_new();
1948 gtk_event_box_set_visible_window(GTK_EVENT_BOX(warning_btn), FALSE);
1950 mainwin->warning_btn = warning_btn;
1952 g_signal_connect(G_OBJECT(warning_btn), "button-press-event",
1953 G_CALLBACK(warning_icon_pressed),
1954 (gpointer) mainwin);
1955 g_signal_connect(G_OBJECT(warning_btn), "motion-notify-event",
1956 G_CALLBACK(warning_visi_notify), mainwin);
1957 g_signal_connect(G_OBJECT(warning_btn), "leave-notify-event",
1958 G_CALLBACK(warning_leave_notify), mainwin);
1959 g_signal_connect(G_OBJECT(warning_btn), "enter-notify-event",
1960 G_CALLBACK(warning_enter_notify), mainwin);
1962 gtk_container_add (GTK_CONTAINER(warning_btn), warning_icon);
1964 CLAWS_SET_TIP(warning_btn,
1965 _("Some error(s) happened. Click here to view log."));
1966 gtk_box_pack_start(GTK_BOX(hbox_stat), warning_btn, FALSE, FALSE, 0);
1968 statusbar = statusbar_create();
1969 gtk_box_pack_start(GTK_BOX(hbox_stat), statusbar, TRUE, TRUE, 0);
1971 progressbar = gtk_progress_bar_new();
1972 gtk_widget_set_size_request(progressbar, 120, 1);
1973 gtk_box_pack_start(GTK_BOX(hbox_stat), progressbar, FALSE, FALSE, 0);
1975 online_pixmap = stock_pixmap_widget(STOCK_PIXMAP_ONLINE);
1976 offline_pixmap = stock_pixmap_widget(STOCK_PIXMAP_OFFLINE);
1977 online_switch = gtk_button_new ();
1978 gtk_widget_set_can_focus(online_switch, FALSE);
1979 CLAWS_SET_TIP(online_switch,
1980 _("You are online. Click the icon to go offline"));
1981 offline_switch = gtk_button_new ();
1982 CLAWS_SET_TIP(offline_switch,
1983 _("You are offline. Click the icon to go online"));
1984 gtk_container_add (GTK_CONTAINER(online_switch), online_pixmap);
1985 gtk_button_set_relief (GTK_BUTTON(online_switch), GTK_RELIEF_NONE);
1986 g_signal_connect (G_OBJECT(online_switch), "clicked", G_CALLBACK(online_switch_clicked), mainwin);
1987 gtk_box_pack_start (GTK_BOX(hbox_stat), online_switch, FALSE, FALSE, 0);
1988 gtk_container_add (GTK_CONTAINER(offline_switch), offline_pixmap);
1989 gtk_button_set_relief (GTK_BUTTON(offline_switch), GTK_RELIEF_NONE);
1990 g_signal_connect (G_OBJECT(offline_switch), "clicked", G_CALLBACK(online_switch_clicked), mainwin);
1991 gtk_box_pack_start (GTK_BOX(hbox_stat), offline_switch, FALSE, FALSE, 0);
1993 statuslabel = gtk_label_new("");
1994 gtk_box_pack_start(GTK_BOX(hbox_stat), statuslabel, FALSE, FALSE, 0);
1996 ac_button = gtk_button_new();
1997 CLAWS_SET_TIP(ac_button, _("Select account"));
1998 gtk_widget_set_can_focus(ac_button, FALSE);
1999 gtk_widget_set_size_request(ac_button, -1, 0);
2000 gtk_box_pack_end(GTK_BOX(hbox_stat), ac_button, FALSE, FALSE, 0);
2001 g_signal_connect(G_OBJECT(ac_button), "button_press_event",
2002 G_CALLBACK(ac_label_button_pressed), mainwin);
2004 ac_label = gtk_label_new("");
2005 gtk_container_add(GTK_CONTAINER(ac_button), ac_label);
2007 gtk_widget_show_all(hbox_stat);
2009 gtk_widget_hide(offline_switch);
2010 gtk_widget_hide(progressbar);
2011 gtk_widget_hide(warning_btn);
2013 online_switch = gtk_button_new ();
2014 offline_switch = gtk_button_new ();
2015 g_signal_connect (G_OBJECT(online_switch), "clicked", G_CALLBACK(online_switch_clicked), mainwin);
2016 g_signal_connect (G_OBJECT(offline_switch), "clicked", G_CALLBACK(online_switch_clicked), mainwin);
2019 mainwin->folderview = folderview = folderview_create(mainwin);
2020 mainwin->summaryview = summaryview = summary_create(mainwin);
2021 mainwin->messageview = messageview = messageview_create(mainwin);
2023 /* init log instances data before creating log views */
2024 set_log_title(LOG_PROTOCOL, _("Network log"));
2025 set_log_prefs(LOG_PROTOCOL,
2026 &prefs_common.logwin_width,
2027 &prefs_common.logwin_height);
2028 set_log_title(LOG_DEBUG_FILTERING, _("Filtering/Processing debug log"));
2029 set_log_prefs(LOG_DEBUG_FILTERING,
2030 &prefs_common.filtering_debugwin_width,
2031 &prefs_common.filtering_debugwin_height);
2033 /* setup log windows */
2034 mainwin->logwin = log_window_create(LOG_PROTOCOL);
2035 log_window_init(mainwin->logwin);
2037 mainwin->filtering_debugwin = log_window_create(LOG_DEBUG_FILTERING);
2038 log_window_set_clipping(mainwin->logwin,
2039 prefs_common.cliplog,
2040 prefs_common.loglength);
2042 log_window_init(mainwin->filtering_debugwin);
2043 log_window_set_clipping(mainwin->filtering_debugwin,
2044 prefs_common.filtering_debug_cliplog,
2045 prefs_common.filtering_debug_loglength);
2046 if (prefs_common.enable_filtering_debug)
2047 log_message(LOG_DEBUG_FILTERING, _("filtering log enabled\n"));
2049 log_message(LOG_DEBUG_FILTERING, _("filtering log disabled\n"));
2051 folderview->mainwin = mainwin;
2052 folderview->summaryview = summaryview;
2054 summaryview->mainwin = mainwin;
2055 summaryview->folderview = folderview;
2056 summaryview->messageview = messageview;
2057 summaryview->window = window;
2059 mainwin->vbox = vbox;
2060 mainwin->menubar = menubar;
2061 mainwin->handlebox = handlebox;
2062 mainwin->vbox_body = vbox_body;
2063 mainwin->online_switch = online_switch;
2064 mainwin->offline_switch = offline_switch;
2065 #ifndef GENERIC_UMPC
2066 messageview->statusbar = statusbar;
2067 mainwin->statusbar = statusbar;
2068 mainwin->hbox_stat = hbox_stat;
2069 mainwin->progressbar = progressbar;
2070 mainwin->statuslabel = statuslabel;
2071 mainwin->online_pixmap = online_pixmap;
2072 mainwin->offline_pixmap = offline_pixmap;
2073 mainwin->ac_button = ac_button;
2074 mainwin->ac_label = ac_label;
2075 /* set context IDs for status bar */
2076 mainwin->mainwin_cid = gtk_statusbar_get_context_id
2077 (GTK_STATUSBAR(statusbar), "Main Window");
2078 mainwin->folderview_cid = gtk_statusbar_get_context_id
2079 (GTK_STATUSBAR(statusbar), "Folder View");
2080 mainwin->summaryview_cid = gtk_statusbar_get_context_id
2081 (GTK_STATUSBAR(statusbar), "Summary View");
2082 mainwin->messageview_cid = gtk_statusbar_get_context_id
2083 (GTK_STATUSBAR(statusbar), "Message View");
2084 messageview->statusbar_cid = mainwin->messageview_cid;
2087 messageview->statusbar = NULL;
2088 mainwin->statusbar = NULL;
2089 mainwin->hbox_stat = NULL;
2090 /* mainwin->progressbar is set in toolbar.c */
2091 mainwin->statuslabel = NULL;
2092 mainwin->online_pixmap = NULL;
2093 mainwin->offline_pixmap = NULL;
2094 mainwin->ac_button = NULL;
2095 mainwin->ac_label = NULL;
2098 /* allocate colors for summary view and folder view */
2099 summaryview->color_marked.red = summaryview->color_marked.green = 0;
2100 summaryview->color_marked.blue = (guint16)65535;
2102 summaryview->color_dim.red = summaryview->color_dim.green =
2103 summaryview->color_dim.blue = COLOR_DIM;
2105 gtkut_convert_int_to_gdk_color(prefs_common.color[COL_NEW],
2106 &folderview->color_new);
2108 gtkut_convert_int_to_gdk_color(prefs_common.color[COL_TGT_FOLDER],
2109 &folderview->color_op);
2111 color[0] = summaryview->color_marked;
2112 color[1] = summaryview->color_dim;
2113 color[2] = folderview->color_new;
2114 color[3] = folderview->color_op;
2116 colormap = gdk_drawable_get_colormap(gtk_widget_get_window(window));
2117 gdk_colormap_alloc_colors(colormap, color, 4, FALSE, TRUE, success);
2118 for (i = 0; i < 4; i++) {
2119 if (success[i] == FALSE)
2120 g_warning("MainWindow: color allocation %d failed", i);
2123 debug_print("done.\n");
2125 messageview->visible = prefs_common.msgview_visible;
2127 main_window_set_widgets(mainwin, prefs_common.layout_mode);
2129 g_signal_connect(G_OBJECT(window), "size_allocate",
2130 G_CALLBACK(main_window_size_allocate_cb),
2133 /* set menu items */
2134 cm_toggle_menu_set_active_full(mainwin->ui_manager, "Menu/View/Encoding/"CS_AUTO, TRUE);
2137 switch (prefs_common.toolbar_style) {
2139 menuitem = gtk_ui_manager_get_widget(mainwin->ui_manager, "/Menu/View/ShowHide/Toolbar/Hide");
2142 menuitem = gtk_ui_manager_get_widget(mainwin->ui_manager, "/Menu/View/ShowHide/Toolbar/IconOnly");
2145 menuitem = gtk_ui_manager_get_widget(mainwin->ui_manager, "/Menu/View/ShowHide/Toolbar/TextOnly");
2148 menuitem = gtk_ui_manager_get_widget(mainwin->ui_manager, "/Menu/View/ShowHide/Toolbar/TextBelowIcon");
2150 case TOOLBAR_BOTH_HORIZ:
2151 menuitem = gtk_ui_manager_get_widget(mainwin->ui_manager, "/Menu/View/ShowHide/Toolbar/TextBesideIcon");
2153 gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menuitem), TRUE);
2155 toolbar_set_style(mainwin->toolbar->toolbar,
2157 prefs_common.toolbar_style);
2158 #ifndef GENERIC_UMPC
2159 gtk_widget_hide(mainwin->hbox_stat);
2160 menuitem = gtk_ui_manager_get_widget(mainwin->ui_manager, "/Menu/View/ShowHide/StatusBar");
2161 gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menuitem),
2162 prefs_common.show_statusbar);
2164 menuitem = gtk_ui_manager_get_widget(mainwin->ui_manager, "/Menu/View/ShowHide/ColumnHeaders");
2165 gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menuitem),
2166 prefs_common.show_col_headers);
2167 /* set account selection menu */
2168 ac_menu = gtk_ui_manager_get_widget(mainwin->ui_manager, "/Menu/Configuration/ChangeAccount");
2169 mainwin->ac_menu = ac_menu;
2171 toolbar_main_set_sensitive(mainwin);
2173 /* create actions menu */
2174 main_window_update_actions_menu(mainwin);
2176 main_create_mailing_list_menu (mainwin, NULL);
2178 /* attach accel groups to main window */
2179 #define ADD_MENU_ACCEL_GROUP_TO_WINDOW(menu,win) \
2180 gtk_window_add_accel_group \
2182 gtk_ui_manager_get_accel_group(gtkut_ui_manager()));
2184 ADD_MENU_ACCEL_GROUP_TO_WINDOW(summaryview->popupmenu, mainwin->window);
2186 g_signal_connect(G_OBJECT(window), "window_state_event",
2187 G_CALLBACK(mainwindow_state_event_cb), mainwin);
2188 g_signal_connect(G_OBJECT(window), "visibility_notify_event",
2189 G_CALLBACK(mainwindow_visibility_event_cb), mainwin);
2190 gtk_widget_add_events(GTK_WIDGET(window), GDK_VISIBILITY_NOTIFY_MASK);
2192 if (prefs_common.layout_mode == VERTICAL_LAYOUT ||
2193 prefs_common.layout_mode == SMALL_LAYOUT) {
2194 summary_relayout(mainwin->summaryview);
2196 summary_update_unread(mainwin->summaryview, NULL);
2198 /* initialize views */
2199 folderview_init(folderview);
2200 summary_init(summaryview);
2201 messageview_init(messageview);
2203 sslcertwindow_register_hook();
2205 mainwin->lock_count = 0;
2206 mainwin->menu_lock_count = 0;
2207 mainwin->cursor_count = 0;
2209 mainwin->progressindicator_hook =
2210 hooks_register_hook(PROGRESSINDICATOR_HOOKLIST, mainwindow_progressindicator_hook, mainwin);
2213 watch_cursor = gdk_cursor_new(GDK_WATCH);
2215 hand_cursor = gdk_cursor_new(GDK_HAND2);
2217 /* init work_offline */
2218 if (prefs_common.work_offline)
2219 online_switch_clicked (GTK_BUTTON(online_switch), mainwin);
2221 mainwindow_colorlabel_menu_create(mainwin, FALSE);
2222 mainwindow_tags_menu_create(mainwin, FALSE);
2224 if (prefs_common.mainwin_fullscreen) {
2225 cm_toggle_menu_set_active_full(mainwin->ui_manager,
2226 "Menu/View/FullScreen",
2229 if (prefs_common.mainwin_menubar)
2230 cm_toggle_menu_set_active_full(mainwin->ui_manager,"Menu/View/ShowHide/MenuBar", TRUE);
2235 void main_window_update_actions_menu(MainWindow *mainwin)
2237 action_update_mainwin_menu(mainwin->ui_manager, "/Menu/Tools/Actions", mainwin);
2240 void main_window_cursor_wait(MainWindow *mainwin)
2243 if (mainwin->cursor_count == 0) {
2244 gdk_window_set_cursor(gtk_widget_get_window(mainwin->window), watch_cursor);
2245 textview_cursor_wait(mainwin->messageview->mimeview->textview);
2248 mainwin->cursor_count++;
2253 void main_window_cursor_normal(MainWindow *mainwin)
2255 if (mainwin->cursor_count)
2256 mainwin->cursor_count--;
2258 if (mainwin->cursor_count == 0) {
2259 gdk_window_set_cursor(gtk_widget_get_window(mainwin->window), NULL);
2260 textview_cursor_normal(mainwin->messageview->mimeview->textview);
2265 /* lock / unlock the user-interface */
2266 void main_window_lock(MainWindow *mainwin)
2268 if (mainwin->lock_count == 0 && mainwin->ac_button)
2269 gtk_widget_set_sensitive(mainwin->ac_button, FALSE);
2271 mainwin->lock_count++;
2273 main_window_set_menu_sensitive(mainwin);
2274 toolbar_main_set_sensitive(mainwin);
2277 void main_window_unlock(MainWindow *mainwin)
2279 if (mainwin->lock_count)
2280 mainwin->lock_count--;
2282 main_window_set_menu_sensitive(mainwin);
2283 toolbar_main_set_sensitive(mainwin);
2285 if (mainwin->lock_count == 0 && mainwin->ac_button)
2286 gtk_widget_set_sensitive(mainwin->ac_button, TRUE);
2289 static void main_window_menu_callback_block(MainWindow *mainwin)
2291 mainwin->menu_lock_count++;
2294 static void main_window_menu_callback_unblock(MainWindow *mainwin)
2296 if (mainwin->menu_lock_count)
2297 mainwin->menu_lock_count--;
2300 static guint prefs_tag = 0;
2302 void main_window_reflect_prefs_all(void)
2304 main_window_reflect_prefs_all_real(FALSE);
2307 static gboolean reflect_prefs_timeout_cb(gpointer data)
2309 gboolean pixmap_theme_changed = GPOINTER_TO_INT(data);
2311 MainWindow *mainwin;
2312 #ifndef GENERIC_UMPC
2315 for (cur = mainwin_list; cur != NULL; cur = cur->next) {
2316 mainwin = (MainWindow *)cur->data;
2318 main_window_show_cur_account(mainwin);
2319 main_window_set_menu_sensitive(mainwin);
2320 toolbar_main_set_sensitive(mainwin);
2323 if (pixmap_theme_changed) {
2324 toolbar_update(TOOLBAR_MAIN, mainwin);
2325 messageview_reflect_prefs_pixmap_theme();
2326 compose_reflect_prefs_pixmap_theme();
2327 folderview_reinit_fonts(mainwin->folderview);
2328 summary_reflect_prefs_pixmap_theme(mainwin->summaryview);
2329 foldersel_reflect_prefs_pixmap_theme();
2330 #ifndef USE_ALT_ADDRBOOK
2331 addressbook_reflect_prefs_pixmap_theme();
2333 #ifndef GENERIC_UMPC
2334 pixmap = stock_pixmap_widget(STOCK_PIXMAP_ONLINE);
2335 gtk_container_remove(GTK_CONTAINER(mainwin->online_switch),
2336 mainwin->online_pixmap);
2337 gtk_container_add (GTK_CONTAINER(mainwin->online_switch), pixmap);
2338 gtk_widget_show(pixmap);
2339 mainwin->online_pixmap = pixmap;
2340 pixmap = stock_pixmap_widget(STOCK_PIXMAP_OFFLINE);
2341 gtk_container_remove(GTK_CONTAINER(mainwin->offline_switch),
2342 mainwin->offline_pixmap);
2343 gtk_container_add (GTK_CONTAINER(mainwin->offline_switch), pixmap);
2344 gtk_widget_show(pixmap);
2345 mainwin->offline_pixmap = pixmap;
2347 hooks_invoke(THEME_CHANGED_HOOKLIST, NULL);
2350 headerview_set_font(mainwin->messageview->headerview);
2351 headerview_set_visibility(mainwin->messageview->headerview,
2352 prefs_common.display_header_pane);
2353 textview_reflect_prefs(mainwin->messageview->mimeview->textview);
2354 folderview_reflect_prefs();
2355 summary_reflect_prefs();
2356 #ifndef GENERIC_UMPC
2357 summary_redisplay_msg(mainwin->summaryview);
2359 if (prefs_common.layout_mode == SMALL_LAYOUT) {
2360 if (mainwin->in_folder) {
2361 mainwindow_enter_folder(mainwin);
2363 mainwindow_exit_folder(mainwin);
2371 void main_window_reflect_prefs_all_now(void)
2373 reflect_prefs_timeout_cb(GINT_TO_POINTER(FALSE));
2376 void main_window_reflect_prefs_custom_colors(MainWindow *mainwin)
2379 GList *children, *cur;
2381 /* re-create colorlabel submenu */
2382 menu = GTK_MENU_SHELL(mainwin->colorlabel_menu);
2383 cm_return_if_fail(menu != NULL);
2385 /* clear items. get item pointers. */
2386 children = gtk_container_get_children(GTK_CONTAINER(menu));
2387 for (cur = children; cur != NULL && cur->data != NULL; cur = cur->next) {
2388 g_signal_handlers_disconnect_matched
2389 (gtk_ui_manager_get_accel_group(mainwin->ui_manager),
2390 G_SIGNAL_MATCH_DATA|G_SIGNAL_MATCH_FUNC,
2391 0, 0, NULL, mainwin_accel_changed_cb, cur->data);
2392 gtk_menu_item_set_submenu(GTK_MENU_ITEM(cur->data), NULL);
2394 g_list_free(children);
2395 mainwindow_colorlabel_menu_create(mainwin, TRUE);
2396 summary_reflect_prefs_custom_colors(mainwin->summaryview);
2397 folderview_reinit_fonts(mainwin->folderview);
2400 static gint tags_tag = 0;
2401 static gboolean main_window_reflect_tags_changes_real(gpointer data)
2404 GList *children, *cur;
2405 MainWindow *mainwin = (MainWindow *)data;
2407 if (summary_is_locked(mainwin->summaryview)) {
2410 /* re-create tags submenu */
2411 menu = GTK_MENU_SHELL(mainwin->tags_menu);
2412 cm_return_val_if_fail(menu != NULL, FALSE);
2414 /* clear items. get item pointers. */
2415 children = gtk_container_get_children(GTK_CONTAINER(menu));
2416 for (cur = children; cur != NULL && cur->data != NULL; cur = cur->next) {
2417 gtk_menu_item_set_submenu(GTK_MENU_ITEM(cur->data), NULL);
2419 g_list_free(children);
2420 mainwindow_tags_menu_create(mainwin, TRUE);
2421 summary_reflect_tags_changes(mainwin->summaryview);
2427 void main_window_reflect_tags_changes(MainWindow *mainwin)
2429 if (tags_tag == 0) {
2430 tags_tag = g_timeout_add(100, main_window_reflect_tags_changes_real,
2435 void main_window_reflect_prefs_all_real(gboolean pixmap_theme_changed)
2437 if (prefs_tag == 0) {
2438 prefs_tag = g_timeout_add(100, reflect_prefs_timeout_cb,
2439 GINT_TO_POINTER(pixmap_theme_changed));
2443 void main_window_set_summary_column(void)
2446 MainWindow *mainwin;
2448 for (cur = mainwin_list; cur != NULL; cur = cur->next) {
2449 mainwin = (MainWindow *)cur->data;
2450 summary_set_column_order(mainwin->summaryview);
2454 void main_window_set_folder_column(void)
2457 MainWindow *mainwin;
2459 for (cur = mainwin_list; cur != NULL; cur = cur->next) {
2460 mainwin = (MainWindow *)cur->data;
2461 folderview_set_column_order(mainwin->folderview);
2465 static void main_window_set_account_selector_menu(MainWindow *mainwin,
2466 GList *account_list)
2469 GtkWidget *menuitem;
2470 PrefsAccount *ac_prefs;
2474 menu = gtk_menu_new();
2475 gtk_menu_set_accel_group (GTK_MENU (menu),
2476 gtk_ui_manager_get_accel_group(mainwin->ui_manager));
2478 for (cur_ac = account_list; cur_ac != NULL; cur_ac = cur_ac->next) {
2479 ac_prefs = (PrefsAccount *)cur_ac->data;
2481 menuitem = gtk_menu_item_new_with_label
2482 (ac_prefs->account_name
2483 ? ac_prefs->account_name : _("Untitled"));
2484 gtk_widget_show(menuitem);
2485 gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem);
2486 g_signal_connect(G_OBJECT(menuitem), "activate",
2487 G_CALLBACK(account_selector_menu_cb),
2489 accel_path = g_strconcat("<Actions>/Menu/Configuration/ChangeAccount/",(ac_prefs->account_name
2490 ? ac_prefs->account_name : _("Untitled")), NULL );
2491 gtk_menu_item_set_accel_path(GTK_MENU_ITEM(menuitem), accel_path);
2494 gtk_menu_item_set_submenu(GTK_MENU_ITEM(mainwin->ac_menu), menu);
2497 static void main_window_set_account_receive_menu(MainWindow *mainwin,
2498 GList *account_list)
2500 GList *children, *child;
2502 GtkWidget *menuitem;
2503 PrefsAccount *ac_prefs;
2505 menu = gtk_menu_item_get_submenu(GTK_MENU_ITEM(
2506 gtk_ui_manager_get_widget(mainwin->ui_manager, "/Menu/Message/Receive")));
2508 /* search for separator */
2509 children = gtk_container_get_children(GTK_CONTAINER(menu));
2510 for (child = children; child != NULL; child = child->next) {
2511 if (child->data == gtk_ui_manager_get_widget(mainwin->ui_manager, "/Menu/Message/Receive/Separator1")) {
2512 child = child->next;
2517 /* destroy all previous menu item */
2518 while (child != NULL) {
2519 gtk_widget_destroy(GTK_WIDGET(child->data));
2520 child = child->next;
2523 g_list_free(children);
2525 for (child = account_list; child != NULL; child = child->next) {
2526 ac_prefs = (PrefsAccount *)child->data;
2528 if (ac_prefs->protocol == A_NONE)
2531 menuitem = gtk_menu_item_new_with_label
2532 (ac_prefs->account_name ? ac_prefs->account_name
2534 gtk_widget_show(menuitem);
2535 gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem);
2536 g_signal_connect(G_OBJECT(menuitem), "activate",
2537 G_CALLBACK(account_receive_menu_cb),
2542 static void main_window_set_toolbar_combo_receive_menu(MainWindow *mainwin,
2543 GList *account_list)
2546 GtkWidget *menuitem;
2547 PrefsAccount *ac_prefs;
2548 GtkWidget *menu = NULL;
2550 if (mainwin->toolbar->getall_btn == NULL) /* button doesn't exist */
2553 menu = gtk_menu_tool_button_get_menu(GTK_MENU_TOOL_BUTTON(mainwin->toolbar->getall_btn));
2555 gtk_widget_destroy(menu);
2556 menu = gtk_menu_new();
2558 for (cur_ac = account_list; cur_ac != NULL; cur_ac = cur_ac->next) {
2559 ac_prefs = (PrefsAccount *)cur_ac->data;
2561 if (ac_prefs->protocol == A_NONE)
2564 menuitem = gtk_menu_item_new_with_label
2565 (ac_prefs->account_name
2566 ? ac_prefs->account_name : _("Untitled"));
2567 gtk_widget_show(menuitem);
2568 gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem);
2569 g_signal_connect(G_OBJECT(menuitem), "activate",
2570 G_CALLBACK(account_receive_menu_cb),
2573 gtk_menu_tool_button_set_menu(GTK_MENU_TOOL_BUTTON(mainwin->toolbar->getall_btn), menu);
2576 static void main_window_set_toolbar_combo_compose_menu(MainWindow *mainwin,
2577 GList *account_list)
2579 #ifndef GENERIC_UMPC
2581 GtkWidget *menuitem;
2582 PrefsAccount *ac_prefs;
2583 GtkWidget *menu = NULL;
2585 if (mainwin->toolbar->compose_mail_btn == NULL) /* button doesn't exist */
2588 menu = gtk_menu_tool_button_get_menu(GTK_MENU_TOOL_BUTTON(mainwin->toolbar->compose_mail_btn));
2590 gtk_widget_destroy(menu);
2591 menu = gtk_menu_new();
2593 for (cur_ac = account_list; cur_ac != NULL; cur_ac = cur_ac->next) {
2594 ac_prefs = (PrefsAccount *)cur_ac->data;
2596 menuitem = gtk_menu_item_new_with_label
2597 (ac_prefs->account_name
2598 ? ac_prefs->account_name : _("Untitled"));
2599 gtk_widget_show(menuitem);
2600 gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem);
2601 g_signal_connect(G_OBJECT(menuitem), "activate",
2602 G_CALLBACK(account_compose_menu_cb),
2605 gtk_menu_tool_button_set_menu(GTK_MENU_TOOL_BUTTON(mainwin->toolbar->compose_mail_btn), menu);
2609 void main_window_set_account_menu(GList *account_list)
2612 MainWindow *mainwin;
2614 for (cur = mainwin_list; cur != NULL; cur = cur->next) {
2615 mainwin = (MainWindow *)cur->data;
2616 main_window_set_account_selector_menu(mainwin, account_list);
2617 main_window_set_account_receive_menu(mainwin, account_list);
2618 main_window_set_toolbar_combo_receive_menu(mainwin, account_list);
2619 main_window_set_toolbar_combo_compose_menu(mainwin, account_list);
2621 hooks_invoke(ACCOUNT_LIST_CHANGED_HOOKLIST, NULL);
2624 void main_window_set_account_menu_only_toolbar(GList *account_list)
2627 MainWindow *mainwin;
2629 for (cur = mainwin_list; cur != NULL; cur = cur->next) {
2630 mainwin = (MainWindow *)cur->data;
2631 main_window_set_toolbar_combo_receive_menu(mainwin, account_list);
2632 main_window_set_toolbar_combo_compose_menu(mainwin, account_list);
2636 static void main_window_show_cur_account(MainWindow *mainwin)
2641 ac_name = g_strdup(cur_account
2642 ? (cur_account->account_name
2643 ? cur_account->account_name : _("Untitled"))
2647 buf = g_strdup_printf("%s - %s", ac_name, PROG_VERSION);
2649 buf = g_strdup(PROG_VERSION);
2650 gtk_window_set_title(GTK_WINDOW(mainwin->window), buf);
2653 if (mainwin->ac_label)
2654 gtk_label_set_text(GTK_LABEL(mainwin->ac_label), ac_name);
2655 if (mainwin->ac_button)
2656 gtk_widget_queue_resize(mainwin->ac_button);
2660 #ifndef GENERIC_UMPC
2661 static void main_window_separation_change(MainWindow *mainwin, LayoutType layout_mode)
2663 GtkWidget *folder_wid = GTK_WIDGET_PTR(mainwin->folderview);
2664 GtkWidget *summary_wid = GTK_WIDGET_PTR(mainwin->summaryview);
2665 GtkWidget *message_wid = mainwin->messageview->vbox;
2667 if (layout_mode == prefs_common.layout_mode)
2670 debug_print("Changing window separation type from %d to %d\n",
2671 prefs_common.layout_mode, layout_mode);
2673 /* remove widgets from those containers */
2674 g_object_ref(folder_wid);
2675 g_object_ref(summary_wid);
2676 g_object_ref(message_wid);
2677 gtkut_container_remove
2678 (GTK_CONTAINER(gtk_widget_get_parent(folder_wid)), folder_wid);
2679 gtkut_container_remove
2680 (GTK_CONTAINER(gtk_widget_get_parent(summary_wid)), summary_wid);
2681 gtkut_container_remove
2682 (GTK_CONTAINER(gtk_widget_get_parent(message_wid)), message_wid);
2684 gtk_widget_hide(mainwin->window);
2685 main_window_set_widgets(mainwin, layout_mode);
2686 gtk_widget_show(mainwin->window);
2688 g_object_unref(folder_wid);
2689 g_object_unref(summary_wid);
2690 g_object_unref(message_wid);
2693 void mainwindow_reset_paned(GtkPaned *paned)
2697 if (gtk_paned_get_child1(GTK_PANED(paned)))
2698 gtk_widget_show(gtk_paned_get_child1(GTK_PANED(paned)));
2699 if (gtk_paned_get_child2(GTK_PANED(paned)))
2700 gtk_widget_show(gtk_paned_get_child2(GTK_PANED(paned)));
2703 g_object_get (G_OBJECT(paned),
2706 g_object_get (G_OBJECT(paned),
2710 gtk_paned_set_position(GTK_PANED(paned), mid);
2713 static void mainwin_paned_show_first(GtkPaned *paned)
2716 g_object_get (G_OBJECT(paned),
2720 if (gtk_paned_get_child1(GTK_PANED(paned)))
2721 gtk_widget_show(gtk_paned_get_child1(GTK_PANED(paned)));
2722 if (gtk_paned_get_child2(GTK_PANED(paned)))
2723 gtk_widget_hide(gtk_paned_get_child2(GTK_PANED(paned)));
2724 gtk_paned_set_position(GTK_PANED(paned), max);
2727 static void mainwin_paned_show_last(GtkPaned *paned)
2730 g_object_get (G_OBJECT(paned),
2734 if (gtk_paned_get_child1(GTK_PANED(paned)))
2735 gtk_widget_hide(gtk_paned_get_child1(GTK_PANED(paned)));
2736 if (gtk_paned_get_child2(GTK_PANED(paned)))
2737 gtk_widget_show(gtk_paned_get_child2(GTK_PANED(paned)));
2738 gtk_paned_set_position(GTK_PANED(paned), min);
2741 void main_window_toggle_message_view(MainWindow *mainwin)
2743 SummaryView *summaryview = mainwin->summaryview;
2744 GtkWidget *ppaned = NULL;
2745 GtkWidget *container = NULL;
2747 switch (prefs_common.layout_mode) {
2749 case VERTICAL_LAYOUT:
2751 ppaned = mainwin->vpaned;
2752 container = mainwin->hpaned;
2753 if (gtk_widget_get_parent(ppaned) != NULL) {
2754 mainwin->messageview->visible = FALSE;
2755 summaryview->displayed = NULL;
2756 g_object_ref(ppaned);
2757 gtkut_container_remove(GTK_CONTAINER(container), ppaned);
2758 gtk_widget_reparent(GTK_WIDGET_PTR(summaryview), container);
2760 mainwin->messageview->visible = TRUE;
2761 gtk_widget_reparent(GTK_WIDGET_PTR(summaryview), ppaned);
2762 gtk_container_add(GTK_CONTAINER(container), ppaned);
2763 g_object_unref(ppaned);
2767 container = mainwin->vpaned;
2768 if (gtk_widget_get_parent(mainwin->messageview->vbox) != NULL) {
2769 mainwin->messageview->visible = FALSE;
2770 summaryview->displayed = NULL;
2771 g_object_ref(mainwin->messageview->vbox);
2772 gtkut_container_remove(GTK_CONTAINER(container), mainwin->messageview->vbox);
2774 mainwin->messageview->visible = TRUE;
2775 gtk_container_add(GTK_CONTAINER(container), mainwin->messageview->vbox);
2776 g_object_unref(mainwin->messageview->vbox);
2779 case WIDE_MSGLIST_LAYOUT:
2780 g_warning("can't hide messageview in this wide msglist layout");
2784 if (messageview_is_visible(mainwin->messageview))
2785 gtk_arrow_set(GTK_ARROW(mainwin->summaryview->toggle_arrow),
2786 GTK_ARROW_DOWN, GTK_SHADOW_OUT);
2788 gtk_arrow_set(GTK_ARROW(mainwin->summaryview->toggle_arrow),
2789 GTK_ARROW_UP, GTK_SHADOW_OUT);
2791 if (mainwin->messageview->visible == FALSE)
2792 messageview_clear(mainwin->messageview);
2794 main_window_set_menu_sensitive(mainwin);
2796 prefs_common.msgview_visible = mainwin->messageview->visible;
2798 if (messageview_is_visible(mainwin->messageview)) {
2799 gtk_widget_queue_resize(mainwin->hpaned);
2800 gtk_widget_queue_resize(mainwin->vpaned);
2802 summary_grab_focus(summaryview);
2803 if (!summary_is_list(summaryview)) {
2804 summary_show(summaryview, summaryview->folder_item, FALSE);
2808 void main_window_get_size(MainWindow *mainwin)
2810 GtkAllocation allocation;
2812 if (mainwin_list == NULL || mainwin->messageview == NULL) {
2813 debug_print("called after messageview "
2814 "has been deallocated!\n");
2818 if (prefs_common.mainwin_fullscreen) {
2819 debug_print("mainwin in full screen state. "
2820 "Keeping original settings\n");
2823 gtk_widget_get_allocation(GTK_WIDGET_PTR(mainwin->summaryview), &allocation);
2824 if (allocation.width > 1 && allocation.height > 1 && !prefs_common.mainwin_fullscreen) {
2825 prefs_common.summaryview_width = allocation.width;
2827 if (messageview_is_visible(mainwin->messageview))
2828 prefs_common.summaryview_height = allocation.height;
2830 prefs_common.mainview_width = allocation.width;
2833 gtk_widget_get_allocation(mainwin->window, &allocation);
2834 if (allocation.width > 1 && allocation.height > 1 &&
2835 !prefs_common.mainwin_maximised && !prefs_common.mainwin_fullscreen) {
2836 prefs_common.mainview_height = allocation.height;
2837 prefs_common.mainwin_width = allocation.width;
2838 prefs_common.mainwin_height = allocation.height;
2841 gtk_widget_get_allocation(GTK_WIDGET_PTR(mainwin->folderview), &allocation);
2842 if (allocation.width > 1 && allocation.height > 1 &&
2843 !prefs_common.mainwin_fullscreen) {
2844 prefs_common.folderview_width = allocation.width;
2845 prefs_common.folderview_height = allocation.height;
2848 gtk_widget_get_allocation(GTK_WIDGET_PTR(mainwin->messageview), &allocation);
2849 if (allocation.width > 1 && allocation.height > 1 &&
2850 !prefs_common.mainwin_fullscreen) {
2851 prefs_common.msgview_width = allocation.width;
2852 prefs_common.msgview_height = allocation.height;
2855 /* debug_print("summaryview size: %d x %d\n",
2856 prefs_common.summaryview_width,
2857 prefs_common.summaryview_height);
2858 debug_print("folderview size: %d x %d\n",
2859 prefs_common.folderview_width,
2860 prefs_common.folderview_height);
2861 debug_print("messageview size: %d x %d\n",
2862 prefs_common.msgview_width,
2863 prefs_common.msgview_height); */
2866 void main_window_get_position(MainWindow *mainwin)
2870 if (prefs_common.mainwin_maximised || prefs_common.mainwin_fullscreen)
2873 gtkut_widget_get_uposition(mainwin->window, &x, &y);
2875 prefs_common.mainview_x = x;
2876 prefs_common.mainview_y = y;
2877 prefs_common.mainwin_x = x;
2878 prefs_common.mainwin_y = y;
2880 debug_print("main window position: %d, %d\n", x, y);
2883 void main_window_progress_on(MainWindow *mainwin)
2885 gtk_progress_bar_set_text(GTK_PROGRESS_BAR(mainwin->progressbar), "");
2888 void main_window_progress_off(MainWindow *mainwin)
2890 gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(mainwin->progressbar), 0.0);
2891 gtk_progress_bar_set_text(GTK_PROGRESS_BAR(mainwin->progressbar), "");
2894 gboolean main_window_empty_trash(MainWindow *mainwin, gboolean confirm, gboolean for_quit)
2896 if (confirm && procmsg_have_trashed_mails_fast()) {
2900 val = alertpanel(_("Empty trash"),
2901 _("Delete all messages in trash folders?"),
2902 GTK_STOCK_NO, GTK_STOCK_YES, _("Don't quit"),
2905 val = alertpanel(_("Empty trash"),
2906 _("Delete all messages in trash folders?"),
2907 GTK_STOCK_NO, GTK_STOCK_YES, NULL,
2909 if (val == G_ALERTALTERNATE) {
2910 debug_print("will empty trash\n");
2911 } else if (val == G_ALERTDEFAULT) {
2912 debug_print("will not empty trash\n");
2915 return FALSE; /* cancel exit */
2917 manage_window_focus_in(mainwin->window, NULL, NULL);
2920 procmsg_empty_all_trash();
2922 if (mainwin->summaryview->folder_item &&
2923 mainwin->summaryview->folder_item->stype == F_TRASH)
2924 folderview_grab_focus(mainwin->folderview);
2928 static void main_window_add_mailbox(MainWindow *mainwin)
2933 path = input_dialog(_("Add mailbox"),
2934 _("Input the location of the mailbox.\n"
2935 "The location can be either the full path or relative to the \n"
2937 "If the location of an existing mailbox is specified, it will be\n"
2938 "scanned automatically."),
2941 if (folder_find_from_path(path)) {
2942 alertpanel_error(_("The mailbox '%s' already exists."), path);
2946 folder = folder_new(folder_get_class_from_string("mh"),
2947 !strcmp(path, "Mail") ? _("Mailbox") :
2948 g_path_get_basename(path), path);
2951 if (folder->klass->create_tree(folder) < 0) {
2952 alertpanel_error(_("Creation of the mailbox failed.\n"
2953 "Maybe some files already exist, or you don't have the permission to write there."));
2954 folder_destroy(folder);
2959 folder_set_ui_func(folder, scan_tree_func, mainwin);
2960 folder_scan_tree(folder, TRUE);
2961 folder_set_ui_func(folder, NULL, NULL);
2964 SensitiveCondMask main_window_get_current_state(MainWindow *mainwin)
2966 SensitiveCondMask state = 0;
2967 SummarySelection selection;
2968 FolderItem *item = mainwin->summaryview->folder_item;
2969 GList *account_list = account_get_list();
2972 selection = summary_get_selection_type(mainwin->summaryview);
2974 #define UPDATE_STATE(...) \
2976 state |= main_window_get_mask(__VA_ARGS__, -1); \
2979 if (mainwin->lock_count == 0 && !claws_is_starting())
2980 UPDATE_STATE(M_UNLOCKED);
2981 if (selection != SUMMARY_NONE && selection != SUMMARY_SELECTED_NONE)
2982 UPDATE_STATE(M_MSG_EXIST);
2983 if (item && item->path && folder_item_parent(item) && !item->no_select) {
2984 UPDATE_STATE(M_EXEC);
2985 /* if (item->folder->type != F_NEWS) */
2986 UPDATE_STATE(M_ALLOW_DELETE);
2988 if (prefs_common.immediate_exec == 0
2989 && mainwin->lock_count == 0)
2990 UPDATE_STATE(M_DELAY_EXEC);
2992 if ((selection == SUMMARY_NONE && item->hide_read_msgs)
2993 || selection != SUMMARY_NONE)
2994 UPDATE_STATE(M_HIDE_READ_MSG);
2996 if ((selection == SUMMARY_NONE && item->hide_read_threads)
2997 || selection != SUMMARY_NONE)
2998 UPDATE_STATE(M_HIDE_READ_THREADS);
3000 if (mainwin->summaryview->threaded)
3001 UPDATE_STATE(M_THREADED);
3003 UPDATE_STATE(M_UNTHREADED);
3004 if (selection == SUMMARY_SELECTED_SINGLE ||
3005 selection == SUMMARY_SELECTED_MULTIPLE)
3006 UPDATE_STATE(M_TARGET_EXIST);
3007 if (selection == SUMMARY_SELECTED_SINGLE)
3008 UPDATE_STATE(M_SINGLE_TARGET_EXIST);
3009 if (mainwin->summaryview->folder_item &&
3010 mainwin->summaryview->folder_item->folder->klass->type == F_NEWS)
3011 UPDATE_STATE(M_NEWS);
3013 UPDATE_STATE(M_NOT_NEWS);
3014 if (mainwin->summaryview->folder_item &&
3015 (mainwin->summaryview->folder_item->stype != F_TRASH ||
3016 !folder_has_parent_of_type(mainwin->summaryview->folder_item, F_TRASH)))
3017 UPDATE_STATE(M_NOT_TRASH);
3019 if (mainwin->summaryview->folder_item
3020 && mainwin->summaryview->folder_item->stype != F_DRAFT)
3021 UPDATE_STATE(M_NOT_DRAFT);
3023 if (prefs_common.actions_list && g_slist_length(prefs_common.actions_list))
3024 UPDATE_STATE(M_ACTIONS_EXIST);
3026 tmp = tags_get_list();
3027 if (tmp && g_slist_length(tmp))
3028 UPDATE_STATE(M_TAGS_EXIST);
3031 if (procmsg_have_queued_mails_fast() && !procmsg_is_sending())
3032 UPDATE_STATE(M_HAVE_QUEUED_MAILS);
3034 if (selection == SUMMARY_SELECTED_SINGLE &&
3036 (folder_has_parent_of_type(item, F_DRAFT) ||
3037 folder_has_parent_of_type(item, F_OUTBOX) ||
3038 folder_has_parent_of_type(item, F_QUEUE))))
3039 UPDATE_STATE(M_ALLOW_REEDIT);
3041 UPDATE_STATE(M_HAVE_ACCOUNT);
3043 if (cur_account && cur_account->protocol != A_NONE)
3044 UPDATE_STATE(M_HAVE_RETRIEVABLE_ACCOUNT);
3046 if (any_folder_want_synchronise())
3047 UPDATE_STATE(M_WANT_SYNC);
3049 if (item && item->prefs->processing && selection != SUMMARY_NONE)
3050 UPDATE_STATE(M_HAVE_PROCESSING);
3052 if (g_list_length(account_list) > 1)
3053 UPDATE_STATE(M_HAVE_MULTI_ACCOUNT);
3055 for (account_list = account_get_list(); account_list != NULL; account_list = account_list->next) {
3056 if (((PrefsAccount*)account_list->data)->protocol != A_NONE) {
3057 UPDATE_STATE(M_HAVE_ANY_RETRIEVABLE_ACCOUNT);
3062 for (account_list = account_get_list(); account_list != NULL; account_list = account_list->next) {
3063 if (((PrefsAccount*)account_list->data)->protocol == A_NNTP) {
3064 UPDATE_STATE(M_HAVE_NEWS_ACCOUNT);
3069 if (procmsg_spam_can_learn() &&
3070 (mainwin->summaryview->folder_item &&
3071 mainwin->summaryview->folder_item->folder->klass->type != F_UNKNOWN &&
3072 mainwin->summaryview->folder_item->folder->klass->type != F_NEWS)) {
3073 UPDATE_STATE(M_CAN_LEARN_SPAM);
3076 if (mainwin->summaryview->folder_item) {
3077 UPDATE_STATE(M_FOLDER_SELECTED);
3080 if (inc_is_active())
3081 UPDATE_STATE(M_INC_ACTIVE);
3082 if (imap_cancel_all_enabled())
3083 UPDATE_STATE(M_INC_ACTIVE);
3085 if (send_is_active() | procmsg_is_sending())
3086 UPDATE_STATE(M_SEND_ACTIVE);
3088 if (mainwin->summaryview->deleted > 0)
3089 UPDATE_STATE(M_DELETED_EXISTS);
3091 if (mainwin->summaryview->deleted > 0 ||
3092 mainwin->summaryview->moved > 0 ||
3093 mainwin->summaryview->copied > 0)
3094 UPDATE_STATE(M_DELAY_EXEC);
3096 if (summary_is_list(mainwin->summaryview))
3097 UPDATE_STATE(M_SUMMARY_ISLIST);
3099 if (prefs_common.layout_mode != SMALL_LAYOUT || mainwin->in_folder)
3100 UPDATE_STATE(M_IN_MSGLIST);
3102 for (account_list = account_get_list(); account_list != NULL; account_list = account_list->next) {
3103 PrefsAccount *account = account_list->data;
3104 if (account->session_passwd || account->session_smtp_passwd) {
3105 UPDATE_STATE(M_SESSION_PASSWORDS);
3110 #ifndef PASSWORD_CRYPTO_OLD
3111 if (master_passphrase_is_entered()) {
3112 UPDATE_STATE(M_MASTER_PASSPHRASE);
3121 SensitiveCondMask main_window_get_mask(SensitiveCond cond, ...)
3125 SensitiveCondMask value;
3126 static SensitiveCondMask SensitiveCond_table[M_MAX_RESERVED];
3127 static gboolean first_time = TRUE;
3130 for (i = 0; i < M_MAX_RESERVED; i++)
3131 SensitiveCond_table[i] = (SensitiveCondMask) ((SensitiveCondMask)1 << i);
3137 va_start(args, cond);
3138 for (i = (gint) cond; i >= 0; i = va_arg(args, gint))
3139 value |= SensitiveCond_table[i];
3145 void main_window_set_menu_sensitive(MainWindow *mainwin)
3147 SensitiveCondMask state;
3149 SummaryView *summaryview;
3152 GList *children, *cur_item;
3153 gboolean mimepart_selected = FALSE;
3155 state = main_window_get_current_state(mainwin);
3157 #define SET_SENSITIVE(entry_str, ...) \
3159 SensitiveCondMask cond = main_window_get_mask(__VA_ARGS__, -1); \
3160 cm_menu_set_sensitive_full(mainwin->ui_manager, \
3161 (const gchar *) entry_str, \
3162 ((cond & state) == cond)); \
3164 SET_SENSITIVE("Menu/File/SaveAs", M_TARGET_EXIST);
3165 SET_SENSITIVE("Menu/File/SavePartAs", M_SINGLE_TARGET_EXIST);
3166 SET_SENSITIVE("Menu/File/Print", M_TARGET_EXIST);
3167 SET_SENSITIVE("Menu/File/SynchroniseFolders", M_WANT_SYNC);
3168 SET_SENSITIVE("Menu/File/Exit", M_UNLOCKED);
3170 SET_SENSITIVE("Menu/Edit/SelectThread", M_TARGET_EXIST, M_SUMMARY_ISLIST);
3171 SET_SENSITIVE("Menu/Edit/Find", M_SINGLE_TARGET_EXIST);
3172 SET_SENSITIVE("Menu/Edit/QuickSearch", M_IN_MSGLIST);
3173 SET_SENSITIVE("Menu/Edit/SearchFolder", M_TARGET_EXIST, M_SUMMARY_ISLIST);
3175 SET_SENSITIVE("Menu/View/SetColumns/Folderlist", M_UNLOCKED, M_SUMMARY_ISLIST);
3176 SET_SENSITIVE("Menu/View/Sort", M_EXEC, M_SUMMARY_ISLIST);
3177 SET_SENSITIVE("Menu/View/ThreadView", M_EXEC, M_SUMMARY_ISLIST);
3178 SET_SENSITIVE("Menu/View/ExpandThreads", M_MSG_EXIST, M_SUMMARY_ISLIST);
3179 SET_SENSITIVE("Menu/View/CollapseThreads", M_MSG_EXIST, M_SUMMARY_ISLIST);
3180 SET_SENSITIVE("Menu/View/HideReadThreads", M_HIDE_READ_THREADS, M_SUMMARY_ISLIST, M_NOT_DRAFT);
3181 SET_SENSITIVE("Menu/View/HideReadMessages", M_HIDE_READ_MSG, M_SUMMARY_ISLIST, M_NOT_DRAFT);
3182 SET_SENSITIVE("Menu/View/HideDelMessages", M_SUMMARY_ISLIST, M_NOT_DRAFT);
3183 SET_SENSITIVE("Menu/View/Goto/Prev", M_MSG_EXIST);
3184 SET_SENSITIVE("Menu/View/Goto/Next", M_MSG_EXIST);
3185 SET_SENSITIVE("Menu/View/Goto/PrevUnread", M_MSG_EXIST);
3186 SET_SENSITIVE("Menu/View/Goto/NextUnread", M_MSG_EXIST);
3187 SET_SENSITIVE("Menu/View/Goto/PrevNew", M_MSG_EXIST);
3188 SET_SENSITIVE("Menu/View/Goto/NextNew", M_MSG_EXIST);
3189 SET_SENSITIVE("Menu/View/Goto/PrevMarked", M_MSG_EXIST);
3190 SET_SENSITIVE("Menu/View/Goto/NextMarked", M_MSG_EXIST);
3191 SET_SENSITIVE("Menu/View/Goto/PrevLabeled", M_MSG_EXIST);
3192 SET_SENSITIVE("Menu/View/Goto/NextLabeled", M_MSG_EXIST);
3193 SET_SENSITIVE("Menu/View/Goto/ParentMessage", M_SINGLE_TARGET_EXIST);
3194 SET_SENSITIVE("Menu/View/Goto/NextPart", M_SINGLE_TARGET_EXIST);
3195 SET_SENSITIVE("Menu/View/Goto/PrevPart", M_SINGLE_TARGET_EXIST);
3196 SET_SENSITIVE("Menu/View/OpenNewWindow", M_SINGLE_TARGET_EXIST);
3197 SET_SENSITIVE("Menu/View/MessageSource", M_SINGLE_TARGET_EXIST);
3198 SET_SENSITIVE("Menu/View/Part", M_SINGLE_TARGET_EXIST);
3199 SET_SENSITIVE("Menu/View/AllHeaders", M_SINGLE_TARGET_EXIST);
3200 SET_SENSITIVE("Menu/View/Quotes", M_SINGLE_TARGET_EXIST);
3202 SET_SENSITIVE("Menu/Message/Receive/CurrentAccount", M_HAVE_ACCOUNT, M_UNLOCKED, M_HAVE_RETRIEVABLE_ACCOUNT);
3203 SET_SENSITIVE("Menu/Message/Receive/AllAccounts", M_HAVE_ACCOUNT, M_UNLOCKED, M_HAVE_ANY_RETRIEVABLE_ACCOUNT);
3204 SET_SENSITIVE("Menu/Message/Receive/CancelReceiving", M_INC_ACTIVE);
3205 SET_SENSITIVE("Menu/Message/SendQueue", M_HAVE_ACCOUNT, M_HAVE_QUEUED_MAILS);
3206 SET_SENSITIVE("Menu/Message/CancelSending", M_SEND_ACTIVE);
3207 SET_SENSITIVE("Menu/Message/ComposeEmail", M_HAVE_ACCOUNT);
3208 SET_SENSITIVE("Menu/Message/ComposeNews", M_HAVE_NEWS_ACCOUNT);
3209 SET_SENSITIVE("Menu/Message/Reply", M_HAVE_ACCOUNT, M_TARGET_EXIST, M_SUMMARY_ISLIST);
3210 SET_SENSITIVE("Menu/Message/ReplyTo", M_HAVE_ACCOUNT, M_TARGET_EXIST, M_SUMMARY_ISLIST);
3211 SET_SENSITIVE("Menu/Message/FollowupReply", M_HAVE_ACCOUNT, M_TARGET_EXIST, M_NEWS, M_SUMMARY_ISLIST);
3212 SET_SENSITIVE("Menu/Message/Forward", M_HAVE_ACCOUNT, M_TARGET_EXIST, M_SUMMARY_ISLIST);
3213 SET_SENSITIVE("Menu/Message/ForwardAtt", M_HAVE_ACCOUNT, M_TARGET_EXIST, M_SUMMARY_ISLIST);
3214 SET_SENSITIVE("Menu/Message/Redirect", M_HAVE_ACCOUNT, M_TARGET_EXIST, M_SUMMARY_ISLIST);
3215 SET_SENSITIVE("Menu/Message/Move", M_TARGET_EXIST, M_ALLOW_DELETE, M_NOT_NEWS);
3216 SET_SENSITIVE("Menu/Message/Copy", M_TARGET_EXIST, M_EXEC);
3217 SET_SENSITIVE("Menu/Message/Trash", M_TARGET_EXIST, M_ALLOW_DELETE, M_NOT_NEWS, M_NOT_TRASH);
3218 SET_SENSITIVE("Menu/Message/Delete", M_TARGET_EXIST, M_ALLOW_DELETE);
3219 SET_SENSITIVE("Menu/Message/TrashThread", M_TARGET_EXIST, M_SUMMARY_ISLIST);
3220 SET_SENSITIVE("Menu/Message/DeleteThread", M_TARGET_EXIST, M_SUMMARY_ISLIST);
3221 SET_SENSITIVE("Menu/Message/CancelNews", M_TARGET_EXIST, M_ALLOW_DELETE, M_NEWS);
3222 SET_SENSITIVE("Menu/Message/Mark", M_TARGET_EXIST, M_SUMMARY_ISLIST);
3223 SET_SENSITIVE("Menu/Message/Mark/MarkSpam", M_TARGET_EXIST, M_CAN_LEARN_SPAM);
3224 SET_SENSITIVE("Menu/Message/Mark/MarkHam", M_TARGET_EXIST, M_CAN_LEARN_SPAM);
3225 SET_SENSITIVE("Menu/Message/Mark/IgnoreThread", M_TARGET_EXIST);
3226 SET_SENSITIVE("Menu/Message/Mark/UnignoreThread", M_TARGET_EXIST);
3227 SET_SENSITIVE("Menu/Message/Mark/Lock", M_TARGET_EXIST);
3228 SET_SENSITIVE("Menu/Message/Mark/Unlock", M_TARGET_EXIST);
3229 SET_SENSITIVE("Menu/Message/ColorLabel", M_TARGET_EXIST);
3230 SET_SENSITIVE("Menu/Message/Tags", M_TARGET_EXIST);
3231 SET_SENSITIVE("Menu/Message/Reedit", M_HAVE_ACCOUNT, M_ALLOW_REEDIT);
3232 SET_SENSITIVE("Menu/Message/CheckSignature", M_SINGLE_TARGET_EXIST);
3234 SET_SENSITIVE("Menu/Tools/AddSenderToAB", M_SINGLE_TARGET_EXIST);
3235 SET_SENSITIVE("Menu/Tools/CollectAddresses", M_FOLDER_SELECTED);
3236 SET_SENSITIVE("Menu/Tools/CollectAddresses/FromFolder", M_FOLDER_SELECTED);
3237 SET_SENSITIVE("Menu/Tools/CollectAddresses/FromSelected", M_TARGET_EXIST);
3238 SET_SENSITIVE("Menu/Tools/FilterFolder", M_MSG_EXIST, M_EXEC);
3239 SET_SENSITIVE("Menu/Tools/FilterSelected", M_TARGET_EXIST, M_EXEC);
3240 SET_SENSITIVE("Menu/Tools/RunProcessing", M_HAVE_PROCESSING);
3241 SET_SENSITIVE("Menu/Tools/CreateFilterRule", M_SINGLE_TARGET_EXIST, M_UNLOCKED);
3242 SET_SENSITIVE("Menu/Tools/CreateProcessingRule", M_SINGLE_TARGET_EXIST, M_UNLOCKED);
3243 SET_SENSITIVE("Menu/Tools/ListUrls", M_TARGET_EXIST);
3244 SET_SENSITIVE("Menu/Tools/Actions", M_TARGET_EXIST, M_ACTIONS_EXIST);
3245 SET_SENSITIVE("Menu/Tools/Execute", M_DELAY_EXEC);
3246 SET_SENSITIVE("Menu/Tools/Expunge", M_DELETED_EXISTS);
3247 SET_SENSITIVE("Menu/Tools/ForgetSessionPasswords", M_SESSION_PASSWORDS);
3248 #ifndef PASSWORD_CRYPTO_OLD
3249 SET_SENSITIVE("Menu/Tools/ForgetMasterPassphrase", M_MASTER_PASSPHRASE);
3251 SET_SENSITIVE("Menu/Tools/DeleteDuplicates/SelFolder", M_MSG_EXIST, M_ALLOW_DELETE);
3253 SET_SENSITIVE("Menu/Configuration", M_UNLOCKED);
3254 SET_SENSITIVE("Menu/Configuration/ChangeAccount", M_HAVE_MULTI_ACCOUNT);
3255 SET_SENSITIVE("Menu/Configuration/AccountPrefs", M_UNLOCKED);
3256 SET_SENSITIVE("Menu/Configuration/CreateAccount", M_UNLOCKED);
3257 SET_SENSITIVE("Menu/Configuration/EditAccounts", M_UNLOCKED);
3258 #undef SET_SENSITIVE
3260 menu = gtk_menu_item_get_submenu(GTK_MENU_ITEM(
3261 gtk_ui_manager_get_widget(mainwin->ui_manager, "/Menu/Message/Receive")));
3263 children = gtk_container_get_children(GTK_CONTAINER(menu));
3264 for (cur_item = children; cur_item != NULL; cur_item = cur_item->next) {
3265 if (cur_item->data == gtk_ui_manager_get_widget(mainwin->ui_manager, "/Menu/Message/Receive/Separator1")) {
3266 cur_item = cur_item->next;
3271 for (; cur_item != NULL; cur_item = cur_item->next) {
3272 gtk_widget_set_sensitive(GTK_WIDGET(cur_item->data),
3273 (main_window_get_mask(M_UNLOCKED, -1) & state) != 0);
3276 g_list_free(children);
3278 main_window_menu_callback_block(mainwin);
3280 cm_toggle_menu_set_active_full(mainwin->ui_manager, "Menu/View/ShowHide/MessageView",
3281 messageview_is_visible(mainwin->messageview));
3283 summaryview = mainwin->summaryview;
3285 switch (summaryview->sort_key) {
3286 case SORT_BY_NUMBER:
3287 menu_path = "Menu/View/Sort/Number"; break;
3289 menu_path = "Menu/View/Sort/Size"; break;
3291 menu_path = "Menu/View/Sort/Date"; break;
3292 case SORT_BY_THREAD_DATE:
3293 menu_path = "Menu/View/Sort/ThreadDate"; break;
3295 menu_path = "Menu/View/Sort/From"; break;
3297 menu_path = "Menu/View/Sort/To"; break;
3298 case SORT_BY_SUBJECT:
3299 menu_path = "Menu/View/Sort/Subject"; break;
3301 menu_path = "Menu/View/Sort/Color"; break;
3303 menu_path = "Menu/View/Sort/Mark"; break;
3304 case SORT_BY_STATUS:
3305 menu_path = "Menu/View/Sort/Status"; break;
3307 menu_path = "Menu/View/Sort/Attachment"; break;
3309 menu_path = "Menu/View/Sort/Score"; break;
3310 case SORT_BY_LOCKED:
3311 menu_path = "Menu/View/Sort/Locked"; break;
3313 menu_path = "Menu/View/Sort/Tag"; break;
3316 menu_path = "Menu/View/Sort/DontSort"; break;
3318 cm_toggle_menu_set_active_full(mainwin->ui_manager, menu_path, TRUE);
3320 if (summaryview->sort_type == SORT_ASCENDING) {
3321 cm_toggle_menu_set_active_full(mainwin->ui_manager, "Menu/View/Sort/Ascending", TRUE);
3323 cm_toggle_menu_set_active_full(mainwin->ui_manager, "Menu/View/Sort/Descending", TRUE);
3326 if (summaryview->sort_key != SORT_BY_NONE) {
3327 cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/View/Sort/Ascending", TRUE);
3328 cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/View/Sort/Descending", TRUE);
3330 cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/View/Sort/Ascending", FALSE);
3331 cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/View/Sort/Descending", FALSE);
3334 if (mainwin->messageview
3335 && mainwin->messageview->mimeview
3336 && mainwin->messageview->mimeview->textview)
3337 cm_toggle_menu_set_active_full(mainwin->ui_manager, "Menu/View/AllHeaders",
3338 prefs_common.show_all_headers);
3339 cm_toggle_menu_set_active_full(mainwin->ui_manager, "Menu/View/ThreadView", (state & main_window_get_mask(M_THREADED, -1)) != 0);
3340 cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/View/ExpandThreads", (state & main_window_get_mask(M_THREADED, -1)) != 0);
3341 cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/View/CollapseThreads", (state & main_window_get_mask(M_THREADED, -1)) != 0);
3342 cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/View/HideReadThreads", (state & main_window_get_mask(M_THREADED, -1)) != 0 && (state & main_window_get_mask(M_NOT_DRAFT, -1)) != 0);
3343 cm_toggle_menu_set_active_full(mainwin->ui_manager, "Menu/View/Quotes/CollapseAll", (prefs_common.hide_quotes == 1));
3344 cm_toggle_menu_set_active_full(mainwin->ui_manager, "Menu/View/Quotes/Collapse2", (prefs_common.hide_quotes == 2));
3345 cm_toggle_menu_set_active_full(mainwin->ui_manager, "Menu/View/Quotes/Collapse3", (prefs_common.hide_quotes == 3));
3347 if (mainwin->summaryview->folder_item && !mainwin->summaryview->folder_item->threaded)
3348 cm_toggle_menu_set_active_full(mainwin->ui_manager, "Menu/View/HideReadThreads", FALSE);
3349 if ((mainwin->summaryview->folder_item && mainwin->summaryview->folder_item->hide_read_msgs) ||
3350 quicksearch_has_sat_predicate(mainwin->summaryview->quicksearch))
3351 cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/View/HideReadThreads", FALSE);
3352 if ((mainwin->summaryview->folder_item && mainwin->summaryview->folder_item->hide_read_threads) ||
3353 quicksearch_has_sat_predicate(mainwin->summaryview->quicksearch))
3354 cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/View/HideReadMessages", FALSE);
3355 if (quicksearch_has_sat_predicate(mainwin->summaryview->quicksearch))
3356 cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/View/HideDelMessages", FALSE);
3358 cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/View/Goto/PrevHistory",
3359 messageview_nav_has_prev(mainwin->messageview));
3360 cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/View/Goto/NextHistory",
3361 messageview_nav_has_next(mainwin->messageview));
3363 if (mainwin->messageview
3364 && mainwin->messageview->mimeview)
3365 mimepart_selected = !mimeview_tree_is_empty(mainwin->messageview->mimeview);
3367 cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/File/SavePartAs", mimepart_selected);
3368 cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/View/Goto/NextPart", mimepart_selected);
3369 cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/View/Goto/PrevPart", mimepart_selected);
3370 cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/View/Part", mimepart_selected);
3371 cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/Message/CheckSignature",
3372 mimepart_selected && mainwin->messageview->mimeview->signed_part);
3375 if (mimepart_selected) {
3376 MimeInfo *partinfo = messageview_get_selected_mime_part(mainwin->messageview);
3378 if (partinfo && (partinfo->type == MIMETYPE_MESSAGE ||
3379 partinfo->type == MIMETYPE_IMAGE ||
3380 partinfo->type == MIMETYPE_MULTIPART)) {
3384 cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/View/Part/AsText", sensitive);
3386 main_window_menu_callback_unblock(mainwin);
3389 void main_create_mailing_list_menu (MainWindow *mainwin, MsgInfo *msginfo)
3394 is_menu = mailing_list_create_submenu (mainwin, msginfo);
3396 cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/Message/MailingList", TRUE);
3398 cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/Message/MailingList", FALSE);
3401 static gint mailing_list_create_submenu (MainWindow *mainwin, MsgInfo *msginfo)
3404 GtkWidget *menuitem;
3406 if (!msginfo || !msginfo->extradata) {
3407 cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/Message/MailingList/Post", FALSE);
3408 cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/Message/MailingList/Help", FALSE);
3409 cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/Message/MailingList/Subscribe", FALSE);
3410 cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/Message/MailingList/Unsubscribe", FALSE);
3411 cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/Message/MailingList/ViewArchive", FALSE);
3412 cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/Message/MailingList/ContactOwner", FALSE);
3416 /* Mailing list post */
3417 if (!g_strcmp0 (msginfo->extradata->list_post, "NO")) {
3418 g_free(msginfo->extradata->list_post);
3419 msginfo->extradata->list_post = g_strdup (_("No posting allowed"));
3421 menuitem = gtk_ui_manager_get_widget(mainwin->ui_manager, "/Menu/Message/MailingList/Post");
3423 menu_nb += mailing_list_populate_submenu (menuitem, msginfo->extradata->list_post);
3425 /* Mailing list help */
3426 menuitem = gtk_ui_manager_get_widget(mainwin->ui_manager, "/Menu/Message/MailingList/Help");
3428 menu_nb += mailing_list_populate_submenu (menuitem, msginfo->extradata->list_help);
3430 /* Mailing list subscribe */
3431 menuitem = gtk_ui_manager_get_widget(mainwin->ui_manager, "/Menu/Message/MailingList/Subscribe");
3433 menu_nb += mailing_list_populate_submenu (menuitem, msginfo->extradata->list_subscribe);
3435 /* Mailing list unsubscribe */
3436 menuitem = gtk_ui_manager_get_widget(mainwin->ui_manager, "/Menu/Message/MailingList/Unsubscribe");
3438 menu_nb += mailing_list_populate_submenu (menuitem, msginfo->extradata->list_unsubscribe);
3440 /* Mailing list view archive */
3441 menuitem = gtk_ui_manager_get_widget(mainwin->ui_manager, "/Menu/Message/MailingList/ViewArchive");
3443 menu_nb += mailing_list_populate_submenu (menuitem, msginfo->extradata->list_archive);
3445 /* Mailing list contact owner */
3446 menuitem = gtk_ui_manager_get_widget(mainwin->ui_manager, "/Menu/Message/MailingList/ContactOwner");
3448 menu_nb += mailing_list_populate_submenu (menuitem, msginfo->extradata->list_owner);
3453 static gint mailing_list_populate_submenu (GtkWidget *menuitem, const gchar * list_header)
3455 GtkWidget *item, *menu;
3456 const gchar *url_pt ;
3457 gchar url_decoded[BUFFSIZE];
3458 GList *children, *amenu;
3461 menu = gtk_menu_item_get_submenu(GTK_MENU_ITEM(menuitem));
3463 /* First delete old submenu */
3464 /* FIXME: we can optimize this, and only change/add/delete necessary items */
3465 children = gtk_container_get_children(GTK_CONTAINER(menu));
3466 for (amenu = children; amenu; amenu = amenu->next) {
3467 item = GTK_WIDGET (amenu->data);
3468 gtk_widget_destroy (item);
3470 g_list_free(children);
3472 for (url_pt = list_header; url_pt && *url_pt;) {
3473 get_url_part (&url_pt, url_decoded);
3475 if (!g_ascii_strncasecmp(url_decoded, "mailto:", 7)) {
3476 item = cm_menu_item_new_label_from_url ((url_decoded));
3477 g_signal_connect(G_OBJECT(item), "activate",
3478 G_CALLBACK(mailing_list_compose),
3481 else if (!g_ascii_strncasecmp(url_decoded, "http:", 5) ||
3482 !g_ascii_strncasecmp(url_decoded, "https:",6)) {
3484 item = cm_menu_item_new_label_from_url ((url_decoded));
3485 g_signal_connect(G_OBJECT(item), "activate",
3486 G_CALLBACK(mailing_list_open_uri),
3490 gtk_menu_shell_append(GTK_MENU_SHELL(menu), item);
3491 gtk_widget_show (item);
3497 gtk_widget_set_sensitive (menuitem, TRUE);
3499 gtk_widget_set_sensitive (menuitem, FALSE);
3505 static void get_url_part (const gchar **buffer, gchar *url_decoded)
3507 gchar tmp[BUFFSIZE];
3511 gboolean with_plus = TRUE;
3514 *url_decoded = '\0';
3518 /* Ignore spaces, comments and tabs () */
3519 for (;*buf == ' ' || *buf == '(' || *buf == '\t'; buf++)
3521 for (;*buf != ')' && *buf != 0x00; buf++);
3523 /* First non space and non comment must be a < */
3526 if (!strncmp(buf, "mailto:", strlen("mailto:")))
3529 *buf != '>' && *buf != 0x00 && i < BUFFSIZE;
3530 tmp[i++] = *(buf++));
3533 *url_decoded = '\0';
3540 *url_decoded = '\0';
3544 *url_decoded = '\0';
3547 if (i == BUFFSIZE) {
3551 decode_uri_with_plus (url_decoded, (const gchar *)tmp, with_plus);
3553 /* Prepare the work for the next url in the list */
3554 /* after the closing bracket >, ignore space, comments and tabs */
3555 for (;buf && *buf && (*buf == ' ' || *buf == '(' || *buf == '\t'); buf++)
3557 for (;*buf != ')' && *buf != 0x00; buf++);
3559 if (!buf || !*buf) {
3564 /* now first non space, non comment must be a comma */
3566 for (;*buf != 0x00; buf++);
3572 static void mailing_list_compose (GtkWidget *w, gpointer *data)
3574 const gchar *mailto;
3575 PrefsAccount *account = NULL;
3576 FolderItem *folder_item = NULL;
3578 mailto = gtk_label_get_text(GTK_LABEL (gtk_bin_get_child(GTK_BIN((w)))));
3579 if (mainwindow_get_mainwindow()) {
3580 folder_item = mainwindow_get_mainwindow()->summaryview->folder_item;
3581 if (folder_item && folder_item->prefs && folder_item->prefs->enable_default_account)
3582 account = account_find_from_id(folder_item->prefs->default_account);
3583 if (folder_item && !account)
3584 account = account_find_from_item(folder_item);
3587 compose_new_with_folderitem(account, folder_item, mailto+7);
3590 static void mailing_list_open_uri (GtkWidget *w, gpointer *data)
3593 const gchar *mailto;
3595 mailto = gtk_label_get_text(GTK_LABEL (gtk_bin_get_child(GTK_BIN((w)))));
3597 open_uri (mailto, prefs_common_get_uri_cmd());
3600 static void fix_folderview_scroll(MainWindow *mainwin)
3602 static gboolean fix_done = FALSE;
3607 gtk_widget_queue_resize(mainwin->folderview->ctree);
3612 void main_window_popup(MainWindow *mainwin)
3614 static gboolean first_start = TRUE;
3616 if (!gtk_widget_get_visible(GTK_WIDGET(mainwin->window)))
3617 main_window_show(mainwin);
3619 if (prefs_common.mainwin_maximised)
3620 gtk_window_maximize(GTK_WINDOW(mainwin->window));
3623 first_start = FALSE;
3625 gtkut_window_popup(mainwin->window);
3628 if (prefs_common.layout_mode == SMALL_LAYOUT) {
3629 if (mainwin->in_folder) {
3630 mainwindow_enter_folder(mainwin);
3632 mainwindow_exit_folder(mainwin);
3635 fix_folderview_scroll(mainwin);
3638 void main_window_show(MainWindow *mainwin)
3640 gtk_widget_show(mainwin->window);
3641 gtk_widget_show(mainwin->vbox_body);
3642 #ifndef GENERIC_UMPC
3643 gtk_window_move(GTK_WINDOW(mainwin->window),
3644 prefs_common.mainwin_x,
3645 prefs_common.mainwin_y);
3647 gtk_widget_set_size_request(GTK_WIDGET_PTR(mainwin->folderview),
3648 prefs_common.folderview_width,
3649 prefs_common.folderview_height);
3650 gtk_widget_set_size_request(GTK_WIDGET_PTR(mainwin->summaryview),
3651 prefs_common.summaryview_width,
3652 prefs_common.summaryview_height);
3653 gtk_widget_set_size_request(GTK_WIDGET_PTR(mainwin->messageview),
3654 prefs_common.msgview_width,
3655 prefs_common.msgview_height);
3659 void main_window_hide(MainWindow *mainwin)
3661 main_window_get_size(mainwin);
3662 main_window_get_position(mainwin);
3664 gtk_widget_hide(mainwin->window);
3665 gtk_widget_hide(mainwin->vbox_body);
3668 static void main_window_set_widgets(MainWindow *mainwin, LayoutType layout_mode)
3670 GtkWidget *folderwin = NULL;
3671 GtkWidget *messagewin = NULL;
3674 GtkWidget *vbox_body = mainwin->vbox_body;
3675 gboolean first_set = (mainwin->hpaned == NULL);
3676 debug_print("Setting widgets...\n");
3678 #ifndef GENERIC_UMPC
3679 mainwin->messageview->statusbar = mainwin->statusbar;
3680 mainwin->messageview->statusbar_cid = mainwin->messageview_cid;
3682 /* clean top-most container */
3683 if (mainwin->hpaned) {
3684 if (gtk_widget_get_parent(mainwin->hpaned) == mainwin->vpaned)
3685 gtk_widget_destroy(mainwin->vpaned);
3687 gtk_widget_destroy(mainwin->hpaned);
3690 cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/View/ShowHide/MessageView",
3691 (layout_mode != WIDE_MSGLIST_LAYOUT && layout_mode != SMALL_LAYOUT));
3692 switch (layout_mode) {
3693 case VERTICAL_LAYOUT:
3696 hpaned = gtk_hpaned_new();
3697 if (layout_mode == VERTICAL_LAYOUT)
3698 vpaned = gtk_hpaned_new();
3700 vpaned = gtk_vpaned_new();
3701 gtk_box_pack_start(GTK_BOX(vbox_body), hpaned, TRUE, TRUE, 0);
3702 gtk_paned_add1(GTK_PANED(hpaned),
3703 GTK_WIDGET_PTR(mainwin->folderview));
3704 gtk_widget_show(hpaned);
3705 gtk_widget_queue_resize(hpaned);
3707 if (messageview_is_visible(mainwin->messageview)) {
3708 gtk_paned_add2(GTK_PANED(hpaned), vpaned);
3709 gtk_paned_pack1(GTK_PANED(vpaned),
3710 GTK_WIDGET_PTR(mainwin->summaryview), TRUE, TRUE);
3712 gtk_paned_add2(GTK_PANED(hpaned),
3713 GTK_WIDGET_PTR(mainwin->summaryview));
3714 g_object_ref(vpaned);
3716 gtk_paned_add2(GTK_PANED(vpaned),
3717 GTK_WIDGET_PTR(mainwin->messageview));
3718 gtk_widget_show(vpaned);
3719 if (layout_mode == SMALL_LAYOUT && first_set) {
3720 mainwin_paned_show_first(GTK_PANED(hpaned));
3722 gtk_widget_queue_resize(vpaned);
3725 vpaned = gtk_vpaned_new();
3726 hpaned = gtk_hpaned_new();
3727 gtk_box_pack_start(GTK_BOX(vbox_body), vpaned, TRUE, TRUE, 0);
3728 gtk_paned_add1(GTK_PANED(vpaned), hpaned);
3730 gtk_paned_add1(GTK_PANED(hpaned),
3731 GTK_WIDGET_PTR(mainwin->folderview));
3732 gtk_paned_add2(GTK_PANED(hpaned),
3733 GTK_WIDGET_PTR(mainwin->summaryview));
3735 gtk_widget_show(hpaned);
3736 gtk_widget_queue_resize(hpaned);
3738 if (messageview_is_visible(mainwin->messageview)) {
3739 gtk_paned_add2(GTK_PANED(vpaned),
3740 GTK_WIDGET_PTR(mainwin->messageview));
3742 g_object_ref(GTK_WIDGET_PTR(mainwin->messageview));
3744 gtk_widget_show(vpaned);
3745 gtk_widget_queue_resize(vpaned);
3747 case WIDE_MSGLIST_LAYOUT:
3748 vpaned = gtk_vpaned_new();
3749 hpaned = gtk_hpaned_new();
3750 gtk_box_pack_start(GTK_BOX(vbox_body), vpaned, TRUE, TRUE, 0);
3752 gtk_paned_add1(GTK_PANED(vpaned),
3753 GTK_WIDGET_PTR(mainwin->summaryview));
3754 gtk_paned_add1(GTK_PANED(hpaned),
3755 GTK_WIDGET_PTR(mainwin->folderview));
3757 gtk_widget_show(hpaned);
3758 gtk_widget_queue_resize(hpaned);
3760 if (messageview_is_visible(mainwin->messageview)) {
3761 gtk_paned_add2(GTK_PANED(hpaned),
3762 GTK_WIDGET_PTR(mainwin->messageview));
3764 g_object_ref(GTK_WIDGET_PTR(mainwin->messageview));
3766 gtk_paned_add2(GTK_PANED(vpaned), hpaned);
3768 gtk_widget_show(vpaned);
3769 gtk_widget_queue_resize(vpaned);
3772 g_warning("unknown layout");
3776 mainwin->hpaned = hpaned;
3777 mainwin->vpaned = vpaned;
3779 if (layout_mode == SMALL_LAYOUT) {
3780 if (mainwin->messageview->visible)
3781 main_window_toggle_message_view(mainwin);
3784 if (layout_mode == SMALL_LAYOUT && first_set) {
3785 gtk_widget_realize(mainwin->window);
3786 gtk_widget_realize(mainwin->folderview->ctree);
3787 gtk_widget_realize(mainwin->summaryview->hbox);
3788 gtk_widget_realize(mainwin->summaryview->hbox_l);
3789 gtk_widget_set_size_request(GTK_WIDGET_PTR(mainwin->folderview),
3790 prefs_common.folderview_width,
3791 prefs_common.folderview_height);
3792 gtk_widget_set_size_request(GTK_WIDGET_PTR(mainwin->summaryview),
3794 gtk_widget_set_size_request(GTK_WIDGET_PTR(mainwin->messageview),
3796 gtk_widget_set_size_request(GTK_WIDGET(mainwin->window),
3797 prefs_common.mainwin_width,
3798 prefs_common.mainwin_height);
3799 gtk_paned_set_position(GTK_PANED(mainwin->hpaned), 800);
3801 gtk_widget_set_size_request(GTK_WIDGET_PTR(mainwin->folderview),
3802 prefs_common.folderview_width,
3803 prefs_common.folderview_height);
3804 gtk_widget_set_size_request(GTK_WIDGET_PTR(mainwin->summaryview),
3805 prefs_common.summaryview_width,
3806 prefs_common.summaryview_height);
3807 gtk_widget_set_size_request(GTK_WIDGET_PTR(mainwin->messageview),
3808 prefs_common.msgview_width,
3809 prefs_common.msgview_height);
3810 gtk_widget_set_size_request(GTK_WIDGET(mainwin->window),
3811 prefs_common.mainwin_width,
3812 prefs_common.mainwin_height);
3814 /* remove headerview if not in prefs */
3815 headerview_set_visibility(mainwin->messageview->headerview,
3816 prefs_common.display_header_pane);
3818 if (messageview_is_visible(mainwin->messageview))
3819 gtk_arrow_set(GTK_ARROW(mainwin->summaryview->toggle_arrow),
3820 GTK_ARROW_DOWN, GTK_SHADOW_OUT);
3822 gtk_arrow_set(GTK_ARROW(mainwin->summaryview->toggle_arrow),
3823 GTK_ARROW_UP, GTK_SHADOW_OUT);
3825 gtk_window_move(GTK_WINDOW(mainwin->window),
3826 prefs_common.mainwin_x,
3827 prefs_common.mainwin_y);
3829 gtk_widget_queue_resize(vbox_body);
3830 gtk_widget_queue_resize(mainwin->vbox);
3831 gtk_widget_queue_resize(mainwin->window);
3832 /* CLAWS: previous "gtk_widget_show_all" makes noticeview
3833 * and mimeview icon list/ctree lose track of their visibility states */
3834 if (!noticeview_is_visible(mainwin->messageview->noticeview))
3835 gtk_widget_hide(GTK_WIDGET_PTR(mainwin->messageview->noticeview));
3836 if (!noticeview_is_visible(mainwin->messageview->mimeview->siginfoview))
3837 gtk_widget_hide(GTK_WIDGET_PTR(mainwin->messageview->mimeview->siginfoview));
3838 if (mainwin->messageview->mimeview->ctree_mode)
3839 gtk_widget_hide(mainwin->messageview->mimeview->icon_mainbox);
3841 gtk_widget_hide(mainwin->messageview->mimeview->ctree_mainbox);
3843 prefs_common.layout_mode = layout_mode;
3845 cm_toggle_menu_set_active_full(mainwin->ui_manager, "Menu/View/ShowHide/MessageView",
3846 messageview_is_visible(mainwin->messageview));
3848 #ifndef GENERIC_UMPC
3849 switch (prefs_common.layout_mode) {
3851 cm_toggle_menu_set_active_full(mainwin->ui_manager, "Menu/View/Layout/Standard", TRUE);
3853 case VERTICAL_LAYOUT:
3854 cm_toggle_menu_set_active_full(mainwin->ui_manager, "Menu/View/Layout/ThreeColumns", TRUE);
3857 cm_toggle_menu_set_active_full(mainwin->ui_manager, "Menu/View/Layout/WideMessage", TRUE);
3859 case WIDE_MSGLIST_LAYOUT:
3860 cm_toggle_menu_set_active_full(mainwin->ui_manager, "Menu/View/Layout/WideMessageList", TRUE);
3863 cm_toggle_menu_set_active_full(mainwin->ui_manager, "Menu/View/Layout/SmallScreen", TRUE);
3870 (G_OBJECT(folderwin), "size_allocate",
3871 G_CALLBACK(folder_window_size_allocate_cb),
3876 (G_OBJECT(messagewin), "size_allocate",
3877 G_CALLBACK(message_window_size_allocate_cb),
3881 debug_print("Setting widgets done.\n");
3884 void main_window_destroy_all(void)
3886 while (mainwin_list != NULL) {
3887 MainWindow *mainwin = (MainWindow*)mainwin_list->data;
3889 /* free toolbar stuff */
3890 toolbar_clear_list(TOOLBAR_MAIN);
3891 toolbar_destroy(mainwin->toolbar);
3893 summaryview_destroy(mainwin->summaryview);
3894 mainwin->folderview->mainwin = NULL;
3895 mainwin->summaryview->mainwin = NULL;
3896 mainwin->messageview->mainwin = NULL;
3898 g_free(mainwin->toolbar);
3901 mainwin_list = g_list_remove(mainwin_list, mainwin);
3903 g_list_free(mainwin_list);
3904 mainwin_list = NULL;
3907 static void toolbar_child_attached(GtkWidget *widget, GtkWidget *child,
3910 gtk_widget_set_size_request(child, 1, -1);
3913 static void toolbar_child_detached(GtkWidget *widget, GtkWidget *child,
3916 gtk_widget_set_size_request(child, -1, -1);
3918 #ifndef GENERIC_UMPC
3919 static gboolean ac_label_button_pressed(GtkWidget *widget, GdkEventButton *event,
3922 MainWindow *mainwin = (MainWindow *)data;
3923 GtkWidget *menu = NULL;
3925 if (!event) return FALSE;
3927 gtk_button_set_relief(GTK_BUTTON(widget), GTK_RELIEF_NORMAL);
3929 menu = gtk_menu_item_get_submenu(GTK_MENU_ITEM(mainwin->ac_menu));
3931 gtk_menu_popup(GTK_MENU(menu), NULL, NULL,
3932 menu_button_position, widget,
3933 event->button, event->time);
3938 static gint main_window_close_cb(GtkWidget *widget, GdkEventAny *event,
3941 MainWindow *mainwin = (MainWindow *)data;
3942 gboolean close_allowed = TRUE;
3944 hooks_invoke(MAIN_WINDOW_CLOSE, &close_allowed);
3946 if (close_allowed && mainwin->lock_count == 0)
3947 app_exit_cb(NULL, data);
3952 static void main_window_size_allocate_cb(GtkWidget *widget,
3953 GtkAllocation *allocation,
3956 MainWindow *mainwin = (MainWindow *)data;
3957 main_window_get_size(mainwin);
3960 static void folder_window_size_allocate_cb(GtkWidget *widget,
3961 GtkAllocation *allocation,
3964 MainWindow *mainwin = (MainWindow *)data;
3966 main_window_get_size(mainwin);
3969 static void message_window_size_allocate_cb(GtkWidget *widget,
3970 GtkAllocation *allocation,
3973 MainWindow *mainwin = (MainWindow *)data;
3975 main_window_get_size(mainwin);
3978 static void add_mailbox_cb(GtkAction *action, gpointer data)
3980 MainWindow *mainwin = (MainWindow *)data;
3981 main_window_add_mailbox(mainwin);
3984 static void update_folderview_cb(GtkAction *action, gpointer data)
3986 MainWindow *mainwin = (MainWindow *)data;
3987 summary_show(mainwin->summaryview, NULL, FALSE);
3988 folderview_check_new_all();
3991 static void foldersort_cb(GtkAction *action, gpointer data)
3996 static void import_mbox_cb(GtkAction *action, gpointer data)
3998 MainWindow *mainwin = (MainWindow *)data;
3999 /* only notify if import has failed */
4000 if (import_mbox(mainwin->summaryview->folder_item) == -1) {
4001 alertpanel_error(_("Mbox import has failed."));
4005 static void export_mbox_cb(GtkAction *action, gpointer data)
4007 MainWindow *mainwin = (MainWindow *)data;
4008 /* only notify if export has failed */
4009 if (export_mbox(mainwin->summaryview->folder_item) == -1) {
4010 alertpanel_error(_("Export to mbox has failed."));
4014 static void export_list_mbox_cb(GtkAction *action, gpointer data)
4016 MainWindow *mainwin = (MainWindow *)data;
4017 /* only notify if export has failed */
4018 if (summaryview_export_mbox_list(mainwin->summaryview) == -1) {
4019 alertpanel_error(_("Export to mbox has failed."));
4023 static void empty_trash_cb(GtkAction *action, gpointer data)
4025 MainWindow *mainwin = (MainWindow *)data;
4026 main_window_empty_trash(mainwin, TRUE, FALSE);
4029 static void save_as_cb(GtkAction *action, gpointer data)
4031 MainWindow *mainwin = (MainWindow *)data;
4032 summary_save_as(mainwin->summaryview);
4035 static void print_cb(GtkAction *action, gpointer data)
4037 MainWindow *mainwin = (MainWindow *)data;
4038 summary_print(mainwin->summaryview);
4041 static void page_setup_cb(GtkAction *action, gpointer data)
4043 MainWindow *mainwin = (MainWindow *)data;
4046 win = (mainwin ? GTK_WINDOW(mainwin->window) : NULL);
4048 printing_page_setup(win);
4051 static void app_exit_cb(GtkAction *action, gpointer data)
4053 MainWindow *mainwin = (MainWindow *)data;
4054 if (prefs_common.clean_on_exit) {
4055 if (!main_window_empty_trash(mainwin, prefs_common.ask_on_clean, TRUE))
4059 if (prefs_common.confirm_on_exit) {
4060 if (alertpanel(_("Exit"), _("Exit Claws Mail?"),
4061 GTK_STOCK_CANCEL, GTK_STOCK_QUIT, NULL, ALERTFOCUS_FIRST)
4062 != G_ALERTALTERNATE)
4064 manage_window_focus_in(mainwin->window, NULL, NULL);
4067 app_will_exit(NULL, mainwin);
4070 static void search_cb(GtkAction *action, gpointer data)
4072 MainWindow *mainwin = (MainWindow *)data;
4073 message_search(mainwin->messageview);
4076 static void search_folder_cb(GtkAction *action, gpointer data)
4078 MainWindow *mainwin = (MainWindow *)data;
4079 FolderItem *item = mainwin->summaryview->folder_item;
4080 cm_return_if_fail(item != NULL);
4081 summary_search(mainwin->summaryview);
4084 static void mainwindow_quicksearch(GtkAction *action, gpointer data)
4086 MainWindow *mainwin = (MainWindow *)data;
4087 summaryview_activate_quicksearch(mainwin->summaryview, TRUE);
4090 static void toggle_message_cb(GtkAction *action, gpointer data)
4092 MainWindow *mainwin = (MainWindow *)data;
4095 active = gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (action));
4097 if (active != messageview_is_visible(mainwin->messageview))
4098 summary_toggle_view(mainwin->summaryview);
4101 static void toggle_toolbar_cb(GtkAction *action, GtkRadioAction *current, gpointer data)
4103 gint value = gtk_radio_action_get_current_value (GTK_RADIO_ACTION (current));
4104 MainWindow *mainwin = (MainWindow *)data;
4105 toolbar_toggle(value, mainwin);
4108 static void main_window_reply_cb(GtkAction *gaction, gpointer data)
4110 MainWindow *mainwin = (MainWindow *)data;
4111 MessageView *msgview = (MessageView*)mainwin->messageview;
4112 GSList *msginfo_list = NULL;
4113 gint action = COMPOSE_REPLY;
4114 const gchar *a_name = gtk_action_get_name(gaction);
4116 DO_ACTION("Message/Reply", COMPOSE_REPLY);
4117 DO_ACTION("Message/ReplyTo/All", COMPOSE_REPLY_TO_ALL);
4118 DO_ACTION("Message/ReplyTo/Sender", COMPOSE_REPLY_TO_SENDER);
4119 DO_ACTION("Message/ReplyTo/List", COMPOSE_REPLY_TO_LIST);
4120 DO_ACTION("Message/Forward", COMPOSE_FORWARD_INLINE);
4121 DO_ACTION("Message/ForwardAtt", COMPOSE_FORWARD_AS_ATTACH);
4122 DO_ACTION("Message/Redirect", COMPOSE_REDIRECT);
4123 DO_ACTION("Message/FollowupReply", COMPOSE_FOLLOWUP_AND_REPLY_TO);
4125 cm_return_if_fail(msgview != NULL);
4127 msginfo_list = summary_get_selection(mainwin->summaryview);
4128 cm_return_if_fail(msginfo_list != NULL);
4130 if (!summary_has_opened_message(mainwin->summaryview)) {
4131 compose_reply_from_messageview(NULL, msginfo_list, action);
4132 } else if (summary_is_opened_message_selected(mainwin->summaryview)) {
4133 compose_reply_from_messageview(msgview, msginfo_list, action);
4135 compose_reply_from_messageview(msgview, NULL, action);
4138 g_slist_free(msginfo_list);
4141 static void toggle_col_headers_cb(GtkAction *gaction, gpointer data)
4143 MainWindow *mainwin = (MainWindow *)data;
4144 FolderView *folderview = mainwin->folderview;
4145 SummaryView *summaryview = mainwin->summaryview;
4146 MimeView *mimeview = mainwin->messageview->mimeview;
4148 if (gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (gaction))) {
4149 gtk_cmclist_column_titles_show(GTK_CMCLIST(folderview->ctree));
4150 gtk_cmclist_column_titles_show(GTK_CMCLIST(summaryview->ctree));
4151 gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(mimeview->ctree), TRUE);
4152 prefs_common.show_col_headers = TRUE;
4154 gtk_cmclist_column_titles_hide(GTK_CMCLIST(folderview->ctree));
4155 gtk_cmclist_column_titles_hide(GTK_CMCLIST(summaryview->ctree));
4156 gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(mimeview->ctree), FALSE);
4157 prefs_common.show_col_headers = FALSE;
4161 #ifndef GENERIC_UMPC
4162 static void toggle_statusbar_cb(GtkAction *gaction, gpointer data)
4164 MainWindow *mainwin = (MainWindow *)data;
4165 if (gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (gaction))) {
4166 gtk_widget_show(mainwin->hbox_stat);
4167 prefs_common.show_statusbar = TRUE;
4169 gtk_widget_hide(mainwin->hbox_stat);
4170 prefs_common.show_statusbar = FALSE;
4174 static void set_layout_cb(GtkAction *action, GtkRadioAction *current, gpointer data)
4176 MainWindow *mainwin = (MainWindow *)data;
4177 gint value = gtk_radio_action_get_current_value (GTK_RADIO_ACTION (current));
4178 LayoutType layout_mode = value;
4179 LayoutType old_layout_mode = prefs_common.layout_mode;
4180 if (mainwin->menu_lock_count) {
4183 if (!gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (current))) {
4187 if (layout_mode == prefs_common.layout_mode) {
4191 if (!mainwin->messageview->visible && layout_mode != SMALL_LAYOUT)
4192 main_window_toggle_message_view(mainwin);
4193 else if (mainwin->messageview->visible && layout_mode == SMALL_LAYOUT)
4194 main_window_toggle_message_view(mainwin);
4196 main_window_separation_change(mainwin, layout_mode);
4197 mainwindow_reset_paned(GTK_PANED(mainwin->vpaned));
4198 if (old_layout_mode == SMALL_LAYOUT && layout_mode != SMALL_LAYOUT) {
4199 mainwindow_reset_paned(GTK_PANED(mainwin->hpaned));
4200 if (layout_mode == VERTICAL_LAYOUT)
4201 mainwindow_reset_paned(GTK_PANED(mainwin->vpaned));
4203 if (old_layout_mode != SMALL_LAYOUT && layout_mode == SMALL_LAYOUT) {
4204 mainwin_paned_show_first(GTK_PANED(mainwin->hpaned));
4205 mainwindow_exit_folder(mainwin);
4207 summary_relayout(mainwin->summaryview);
4208 summary_update_unread(mainwin->summaryview, NULL);
4212 void main_window_toggle_work_offline (MainWindow *mainwin, gboolean offline,
4215 static gboolean switching = FALSE;
4222 offline_ask_sync = ask_sync;
4224 online_switch_clicked (GTK_BUTTON(mainwin->online_switch), mainwin);
4226 online_switch_clicked (GTK_BUTTON(mainwin->offline_switch), mainwin);
4227 offline_ask_sync = TRUE;
4229 inc_reset_offline_override_timers();
4234 static void toggle_work_offline_cb (GtkAction *action, gpointer data)
4236 MainWindow *mainwin = (MainWindow *)data;
4237 main_window_toggle_work_offline(mainwin, gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (action)), TRUE);
4240 static gboolean any_folder_want_synchronise(void)
4242 GList *folderlist = folder_get_list();
4244 /* see if there are synchronised folders */
4245 for (; folderlist; folderlist = folderlist->next) {
4246 Folder *folder = (Folder *)folderlist->data;
4247 if (folder_want_synchronise(folder)) {
4255 static void mainwindow_check_synchronise(MainWindow *mainwin, gboolean ask)
4258 if (!any_folder_want_synchronise())
4261 if (offline_ask_sync && ask && alertpanel(_("Folder synchronisation"),
4262 _("Do you want to synchronise your folders now?"),
4263 GTK_STOCK_CANCEL, _("_Synchronise"), NULL, ALERTFOCUS_SECOND) != G_ALERTALTERNATE)
4266 if (offline_ask_sync)
4267 folder_synchronise(NULL);
4270 static void online_switch_clicked (GtkButton *btn, gpointer data)
4272 MainWindow *mainwin;
4273 gboolean have_connectivity;
4275 #ifdef HAVE_NETWORKMANAGER_SUPPORT
4276 have_connectivity = networkmanager_is_online(NULL);
4278 have_connectivity = TRUE;
4281 mainwin = (MainWindow *) data;
4283 cm_return_if_fail(mainwin != NULL);
4285 if (btn == GTK_BUTTON(mainwin->online_switch)) {
4286 #ifndef GENERIC_UMPC
4287 gtk_widget_hide (mainwin->online_switch);
4288 gtk_widget_show (mainwin->offline_switch);
4290 cm_toggle_menu_set_active_full(mainwin->ui_manager, "Menu/File/OfflineMode", TRUE);
4292 inc_autocheck_timer_remove();
4295 if (prefs_common.work_offline)
4298 if(have_connectivity)
4299 mainwindow_check_synchronise(mainwin, TRUE);
4300 prefs_common.work_offline = TRUE;
4301 imap_disconnect_all(have_connectivity);
4302 nntp_disconnect_all(have_connectivity);
4303 hooks_invoke(OFFLINE_SWITCH_HOOKLIST, NULL);
4306 if (!prefs_common.work_offline)
4308 #ifndef GENERIC_UMPC
4309 gtk_widget_hide (mainwin->offline_switch);
4310 gtk_widget_show (mainwin->online_switch);
4312 cm_toggle_menu_set_active_full(mainwin->ui_manager, "Menu/File/OfflineMode", FALSE);
4313 prefs_common.work_offline = FALSE;
4314 inc_autocheck_timer_set();
4315 refresh_resolvers();
4316 hooks_invoke(OFFLINE_SWITCH_HOOKLIST, NULL);
4320 static void addressbook_open_cb(GtkAction *action, gpointer data)
4322 #ifndef USE_ALT_ADDRBOOK
4323 addressbook_open(NULL);
4325 GError* error = NULL;
4327 addressbook_dbus_open(FALSE, &error);
4329 g_warning("failed to open address book: %s", error->message);
4330 g_error_free(error);
4335 static void log_window_show_cb(GtkAction *action, gpointer data)
4337 MainWindow *mainwin = (MainWindow *)data;
4338 log_window_show(mainwin->logwin);
4341 static void filtering_debug_window_show_cb(GtkAction *action, gpointer data)
4343 MainWindow *mainwin = (MainWindow *)data;
4344 log_window_show(mainwin->filtering_debugwin);
4348 static void debug_log_show_cb(GtkAction *action, gpointer data)
4350 GError *error = NULL;
4351 gchar *logpath8 = win32_debug_log_path();
4352 gunichar2 *logpath16;
4354 debug_print("opening '%s'\n", logpath8);
4356 logpath16 = g_utf8_to_utf16(logpath8, -1, NULL, NULL, &error);
4358 if (error != NULL) {
4359 g_warning("couldn't convert debug log path '%s' to UTF-16: %s",
4360 logpath8, error->message);
4361 g_error_free(error);
4366 HINSTANCE ret = ShellExecute(NULL, NULL, (LPCWSTR)logpath16,
4367 NULL, NULL, SW_SHOW);
4371 debug_print("ShellExecute result: %"G_GSIZE_FORMAT"\n", (gsize)ret);
4375 static void inc_cancel_cb(GtkAction *action, gpointer data)
4381 static void send_cancel_cb(GtkAction *action, gpointer data)
4386 static void move_to_cb(GtkAction *action, gpointer data)
4388 MainWindow *mainwin = (MainWindow *)data;
4389 summary_move_to(mainwin->summaryview);
4392 static void copy_to_cb(GtkAction *action, gpointer data)
4394 MainWindow *mainwin = (MainWindow *)data;
4395 summary_copy_to(mainwin->summaryview);
4398 static void delete_cb(GtkAction *action, gpointer data)
4400 MainWindow *mainwin = (MainWindow *)data;
4401 summary_delete(mainwin->summaryview);
4404 static void delete_trash_cb(GtkAction *action, gpointer data)
4406 MainWindow *mainwin = (MainWindow *)data;
4407 summary_delete_trash(mainwin->summaryview);
4410 static void cancel_cb(GtkAction *action, gpointer data)
4412 MainWindow *mainwin = (MainWindow *)data;
4413 summary_cancel(mainwin->summaryview);
4416 static void open_msg_cb(GtkAction *action, gpointer data)
4418 MainWindow *mainwin = (MainWindow *)data;
4419 summary_open_msg(mainwin->summaryview);
4422 static void view_source_cb(GtkAction *action, gpointer data)
4424 MainWindow *mainwin = (MainWindow *)data;
4425 summary_view_source(mainwin->summaryview);
4428 static void show_all_header_cb(GtkAction *action, gpointer data)
4430 MainWindow *mainwin = (MainWindow *)data;
4431 if (mainwin->menu_lock_count) return;
4432 prefs_common.show_all_headers =
4433 gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (action));
4434 summary_display_msg_selected(mainwin->summaryview,
4435 gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (action)));
4438 static void toggle_fullscreen_cb(GtkAction *action, gpointer data)
4440 MainWindow *mainwin = (MainWindow *)data;
4441 if (mainwin->menu_lock_count) return;
4442 if (!gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (action))) {
4443 gtk_window_unfullscreen(GTK_WINDOW(mainwin->window));
4444 prefs_common.mainwin_fullscreen = FALSE;
4447 prefs_common.mainwin_fullscreen = TRUE;
4448 gtk_window_fullscreen(GTK_WINDOW(mainwin->window));
4452 static void toggle_menubar_cb(GtkAction *action, gpointer data)
4454 MainWindow *mainwin = (MainWindow *)data;
4455 if (mainwin->menu_lock_count) return;
4456 if (!gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (action))) {
4457 gtk_widget_hide(GTK_WIDGET(mainwin->menubar));
4458 prefs_common.mainwin_menubar = FALSE;
4460 gtk_widget_show(GTK_WIDGET(mainwin->menubar));
4461 prefs_common.mainwin_menubar = TRUE;
4465 static void hide_quotes_cb(GtkAction *action, gpointer data)
4467 MainWindow *mainwin = (MainWindow *)data;
4469 if (mainwin->menu_lock_count) return;
4471 if (gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (action))) {
4472 const gchar *a_name = gtk_action_get_name(GTK_ACTION(action));
4473 if (!strcmp(a_name, "View/Quotes/CollapseAll")) prefs_common.hide_quotes = 1;
4474 else if (!strcmp(a_name, "View/Quotes/Collapse2")) prefs_common.hide_quotes = 2;
4475 else if (!strcmp(a_name, "View/Quotes/Collapse3")) prefs_common.hide_quotes = 3;
4477 prefs_common.hide_quotes = 0;
4479 mainwin->menu_lock_count++;
4480 cm_toggle_menu_set_active_full(mainwin->ui_manager, "Menu/View/Quotes/CollapseAll", (prefs_common.hide_quotes == 1));
4481 cm_toggle_menu_set_active_full(mainwin->ui_manager, "Menu/View/Quotes/Collapse2", (prefs_common.hide_quotes == 2));
4482 cm_toggle_menu_set_active_full(mainwin->ui_manager, "Menu/View/Quotes/Collapse3", (prefs_common.hide_quotes == 3));
4483 mainwin->menu_lock_count--;
4485 summary_redisplay_msg(mainwin->summaryview);
4488 static void mark_cb(GtkAction *action, gpointer data)
4490 MainWindow *mainwin = (MainWindow *)data;
4491 summary_mark(mainwin->summaryview);
4494 static void unmark_cb(GtkAction *action, gpointer data)
4496 MainWindow *mainwin = (MainWindow *)data;
4497 summary_unmark(mainwin->summaryview);
4500 static void mark_as_read_cb(GtkAction *action, gpointer data)
4502 MainWindow *mainwin = (MainWindow *)data;
4503 summary_mark_as_read(mainwin->summaryview);
4506 static void mark_as_unread_cb(GtkAction *action, gpointer data)
4508 MainWindow *mainwin = (MainWindow *)data;
4509 summary_mark_as_unread(mainwin->summaryview);
4512 static void mark_all_read_cb(GtkAction *action, gpointer data)
4514 MainWindow *mainwin = (MainWindow *)data;
4515 summary_mark_all_read(mainwin->summaryview, TRUE);
4518 static void mark_all_unread_cb(GtkAction *action, gpointer data)
4520 MainWindow *mainwin = (MainWindow *)data;
4521 summary_mark_all_unread(mainwin->summaryview, TRUE);
4524 static void mark_as_spam_cb(GtkAction *action, gpointer data)
4526 MainWindow *mainwin = (MainWindow *)data;
4527 summary_mark_as_spam(mainwin->summaryview, TRUE, NULL);
4530 static void mark_as_ham_cb(GtkAction *action, gpointer data)
4532 MainWindow *mainwin = (MainWindow *)data;
4533 summary_mark_as_spam(mainwin->summaryview, FALSE, NULL);
4536 static void ignore_thread_cb(GtkAction *action, gpointer data)
4538 MainWindow *mainwin = (MainWindow *)data;
4539 summary_ignore_thread(mainwin->summaryview);
4542 static void unignore_thread_cb(GtkAction *action, gpointer data)
4544 MainWindow *mainwin = (MainWindow *)data;
4545 summary_unignore_thread(mainwin->summaryview);
4548 static void watch_thread_cb(GtkAction *action, gpointer data)
4550 MainWindow *mainwin = (MainWindow *)data;
4551 summary_watch_thread(mainwin->summaryview);
4554 static void unwatch_thread_cb(GtkAction *action, gpointer data)
4556 MainWindow *mainwin = (MainWindow *)data;
4557 summary_unwatch_thread(mainwin->summaryview);
4560 static void lock_msgs_cb(GtkAction *action, gpointer data)
4562 MainWindow *mainwin = (MainWindow *)data;
4563 summary_msgs_lock(mainwin->summaryview);
4566 static void unlock_msgs_cb(GtkAction *action, gpointer data)
4568 MainWindow *mainwin = (MainWindow *)data;
4569 summary_msgs_unlock(mainwin->summaryview);
4573 static void reedit_cb(GtkAction *action, gpointer data)
4575 MainWindow *mainwin = (MainWindow *)data;
4576 summary_reedit(mainwin->summaryview);
4579 static void open_urls_cb(GtkAction *action, gpointer data)
4581 MainWindow *mainwin = (MainWindow *)data;
4582 if (!mainwin->summaryview->displayed && mainwin->summaryview->selected) {
4583 summary_display_msg_selected(mainwin->summaryview,
4584 prefs_common.show_all_headers);
4586 messageview_list_urls(mainwin->messageview);
4589 static void add_address_cb(GtkAction *action, gpointer data)
4591 MainWindow *mainwin = (MainWindow *)data;
4592 summary_add_address(mainwin->summaryview);
4595 static void set_charset_cb(GtkAction *action, GtkRadioAction *current, gpointer data)
4597 MainWindow *mainwin = (MainWindow *)data;
4598 gint value = gtk_radio_action_get_current_value (GTK_RADIO_ACTION (current));
4601 if (gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (current))) {
4602 str = conv_get_charset_str((CharSet)value);
4604 g_free(mainwin->messageview->forced_charset);
4605 mainwin->messageview->forced_charset = str ? g_strdup(str) : NULL;
4606 procmime_force_charset(str);
4608 summary_redisplay_msg(mainwin->summaryview);
4610 debug_print("forced charset: %s\n", str ? str : "Auto-Detect");
4614 static void set_decode_cb(GtkAction *action, GtkRadioAction *current, gpointer data)
4616 MainWindow *mainwin = (MainWindow *)data;
4617 gint value = gtk_radio_action_get_current_value (GTK_RADIO_ACTION (current));
4618 if (gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (current))) {
4619 mainwin->messageview->forced_encoding = (EncodingType)value;
4621 summary_redisplay_msg(mainwin->summaryview);
4623 debug_print("forced encoding: %d\n", value);
4627 static void hide_read_messages (GtkAction *action, gpointer data)
4629 MainWindow *mainwin = (MainWindow *)data;
4630 GtkWidget *menuitem = gtk_ui_manager_get_widget(mainwin->ui_manager, "/Menu/View/HideReadMessages");
4631 if (!mainwin->summaryview->folder_item
4632 || g_object_get_data(G_OBJECT(menuitem), "dont_toggle"))
4634 summary_toggle_show_read_messages(mainwin->summaryview);
4637 static void hide_del_messages (GtkAction *action, gpointer data)
4639 MainWindow *mainwin = (MainWindow *)data;
4640 GtkWidget *menuitem = gtk_ui_manager_get_widget(mainwin->ui_manager, "/Menu/View/HideDelMessages");
4641 if (!mainwin->summaryview->folder_item
4642 || g_object_get_data(G_OBJECT(menuitem), "dont_toggle"))
4644 summary_toggle_show_del_messages(mainwin->summaryview);
4647 static void hide_read_threads (GtkAction *action, gpointer data)
4649 MainWindow *mainwin = (MainWindow *)data;
4650 GtkWidget *menuitem = gtk_ui_manager_get_widget(mainwin->ui_manager, "/Menu/View/HideReadThreads");
4651 if (!mainwin->summaryview->folder_item
4652 || g_object_get_data(G_OBJECT(menuitem), "dont_toggle"))
4654 summary_toggle_show_read_threads(mainwin->summaryview);
4657 static void thread_cb(GtkAction *action, gpointer data)
4659 MainWindow *mainwin = (MainWindow *)data;
4660 gboolean threaded = FALSE;
4661 guint selected_msgnum = 0;
4663 if (mainwin->menu_lock_count) return;
4664 if (!mainwin->summaryview->folder_item) return;
4666 main_window_cursor_wait(mainwin);
4668 selected_msgnum = summary_get_msgnum(mainwin->summaryview, mainwin->summaryview->selected);
4670 threaded = gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (action));
4672 mainwin->summaryview->folder_item->threaded = threaded;
4674 mainwin->summaryview->threaded = threaded;
4676 summary_show(mainwin->summaryview,
4677 mainwin->summaryview->folder_item, FALSE);
4678 summary_select_by_msgnum(mainwin->summaryview, selected_msgnum, FALSE);
4680 main_window_cursor_normal(mainwin);
4683 static void expand_threads_cb(GtkAction *action, gpointer data)
4685 MainWindow *mainwin = (MainWindow *)data;
4686 summary_expand_threads(mainwin->summaryview);
4689 static void collapse_threads_cb(GtkAction *action, gpointer data)
4691 MainWindow *mainwin = (MainWindow *)data;
4692 summary_collapse_threads(mainwin->summaryview);
4695 static void set_summary_display_item_cb(GtkAction *action, gpointer data)
4697 prefs_summary_column_open();
4700 static void set_folder_display_item_cb(GtkAction *action, gpointer data)
4702 prefs_folder_column_open();
4705 static void sort_summary_cb(GtkAction *action, GtkRadioAction *current, gpointer data)
4707 MainWindow *mainwin = (MainWindow *)data;
4708 gint value = gtk_radio_action_get_current_value (GTK_RADIO_ACTION (current));
4710 if (mainwin->menu_lock_count) return;
4712 if (gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (current))) {
4713 summary_sort(mainwin->summaryview, (FolderSortKey)value,
4714 mainwin->summaryview->sort_type);
4718 static void sort_summary_type_cb(GtkAction *gaction, GtkRadioAction *current, gpointer data)
4720 MainWindow *mainwin = (MainWindow *)data;
4721 gint value = gtk_radio_action_get_current_value (GTK_RADIO_ACTION (current));
4723 if (mainwin->menu_lock_count) return;
4725 if (gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (current)))
4726 summary_sort(mainwin->summaryview,
4727 mainwin->summaryview->sort_key, (FolderSortType)value);
4730 static void attract_by_subject_cb(GtkAction *action, gpointer data)
4732 MainWindow *mainwin = (MainWindow *)data;
4733 summary_attract_by_subject(mainwin->summaryview);
4736 void mainwindow_delete_duplicated(MainWindow *mainwin)
4740 item = folderview_get_selected_item(mainwin->folderview);
4744 main_window_cursor_wait(mainwin);
4745 STATUSBAR_PUSH(mainwin, _("Deleting duplicated messages..."));
4746 result = folderutils_delete_duplicates(item, prefs_common.immediate_exec ?
4747 DELETE_DUPLICATES_REMOVE : DELETE_DUPLICATES_SETFLAG);
4748 STATUSBAR_POP(mainwin);
4749 main_window_cursor_normal(mainwin);
4755 alertpanel_notice(_("No duplicate message found in selected folder.\n"));
4760 if (prefs_common.immediate_exec) {
4761 msg = ngettext("Deleted %d duplicate message in selected folder.\n",
4762 "Deleted %d duplicate messages in selected folder.\n",
4765 msg = ngettext("Marked %d duplicate message for deletion in selected folder.\n",
4766 "Marked %d duplicate messages for deletion in selected folder.\n",
4769 alertpanel_notice(msg, result);
4775 static void delete_duplicated_cb(GtkAction *action, gpointer data)
4777 mainwindow_delete_duplicated((MainWindow *)data);
4786 static void deldup_all(FolderItem *item, gpointer _data)
4788 struct DelDupsData *data = _data;
4791 result = folderutils_delete_duplicates(item, DELETE_DUPLICATES_REMOVE);
4793 data->dups += result;
4798 void mainwindow_delete_duplicated_all(MainWindow *mainwin)
4800 struct DelDupsData data = {0, 0};
4802 main_window_cursor_wait(mainwin);
4803 STATUSBAR_PUSH(mainwin, _("Deleting duplicated messages in all folders..."));
4804 folder_func_to_all_folders(deldup_all, &data);
4805 STATUSBAR_POP(mainwin);
4806 main_window_cursor_normal(mainwin);
4808 if (data.dups > 0) {
4809 alertpanel_notice(ngettext("Deleted %d duplicate message in %d folders.\n",
4810 "Deleted %d duplicate messages in %d folders.\n",
4812 data.dups, data.folders);
4814 alertpanel_notice(_("No duplicate message found in %d folders.\n"), data.folders);
4818 static void delete_duplicated_all_cb(GtkAction *action, gpointer mw)
4820 MainWindow *mainwin = (MainWindow *)mw;
4822 mainwindow_delete_duplicated_all(mainwin);
4825 static void filter_cb(GtkAction *action, gpointer data)
4827 MainWindow *mainwin = (MainWindow *)data;
4828 summary_filter(mainwin->summaryview, FALSE);
4831 static void filter_list_cb(GtkAction *action, gpointer data)
4833 MainWindow *mainwin = (MainWindow *)data;
4834 summary_filter(mainwin->summaryview, TRUE);
4837 static void process_cb(GtkAction *action, gpointer data)
4839 MainWindow *mainwin = (MainWindow *)data;
4840 FolderItem *item = mainwin->summaryview->folder_item;
4841 cm_return_if_fail(item != NULL);
4843 item->processing_pending = TRUE;
4844 folder_item_apply_processing(item);
4845 item->processing_pending = FALSE;
4848 static void execute_summary_cb(GtkAction *action, gpointer data)
4850 MainWindow *mainwin = (MainWindow *)data;
4851 summary_execute(mainwin->summaryview);
4854 static void expunge_summary_cb(GtkAction *action, gpointer data)
4856 MainWindow *mainwin = (MainWindow *)data;
4857 summary_expunge(mainwin->summaryview);
4860 static void update_summary_cb(GtkAction *action, gpointer data)
4862 MainWindow *mainwin = (MainWindow *)data;
4864 FolderView *folderview = mainwin->folderview;
4866 if (!mainwin->summaryview->folder_item) return;
4867 if ((fitem = folderview_get_opened_item(folderview)) == NULL) return;
4869 folder_update_op_count();
4870 folder_item_scan(fitem);
4871 summary_show(mainwin->summaryview, fitem, FALSE);
4874 static void prev_cb(GtkAction *action, gpointer data)
4876 MainWindow *mainwin = (MainWindow *)data;
4877 summary_select_prev(mainwin->summaryview);
4880 static void next_cb(GtkAction *action, gpointer data)
4882 MainWindow *mainwin = (MainWindow *)data;
4883 summary_select_next(mainwin->summaryview);
4886 static void prev_unread_cb(GtkAction *action, gpointer data)
4888 MainWindow *mainwin = (MainWindow *)data;
4889 summary_select_prev_unread(mainwin->summaryview);
4892 static void next_unread_cb(GtkAction *action, gpointer data)
4894 MainWindow *mainwin = (MainWindow *)data;
4895 summary_select_next_unread(mainwin->summaryview);
4898 static void prev_new_cb(GtkAction *action, gpointer data)
4900 MainWindow *mainwin = (MainWindow *)data;
4901 summary_select_prev_new(mainwin->summaryview);
4904 static void next_new_cb(GtkAction *action, gpointer data)
4906 MainWindow *mainwin = (MainWindow *)data;
4907 summary_select_next_new(mainwin->summaryview);
4910 static void prev_marked_cb(GtkAction *action, gpointer data)
4912 MainWindow *mainwin = (MainWindow *)data;
4913 summary_select_prev_marked(mainwin->summaryview);
4916 static void next_marked_cb(GtkAction *action, gpointer data)
4918 MainWindow *mainwin = (MainWindow *)data;
4919 summary_select_next_marked(mainwin->summaryview);
4922 static void prev_labeled_cb(GtkAction *action, gpointer data)
4924 MainWindow *mainwin = (MainWindow *)data;
4925 summary_select_prev_labeled(mainwin->summaryview);
4928 static void next_labeled_cb(GtkAction *action, gpointer data)
4930 MainWindow *mainwin = (MainWindow *)data;
4931 summary_select_next_labeled(mainwin->summaryview);
4934 static void prev_history_cb(GtkAction *action, gpointer data)
4936 MainWindow *mainwin = (MainWindow *)data;
4937 MsgInfo *info = messageview_nav_get_prev(mainwin->messageview);
4939 if (info->folder != mainwin->summaryview->folder_item)
4940 folderview_select(mainwin->folderview, info->folder);
4941 summary_select_by_msgnum(mainwin->summaryview, info->msgnum,
4942 OPEN_SELECTED_ON_PREVNEXT);
4943 procmsg_msginfo_free(&info);
4944 main_window_set_menu_sensitive(mainwindow_get_mainwindow());
4945 toolbar_main_set_sensitive(mainwindow_get_mainwindow());
4949 static void next_history_cb(GtkAction *action, gpointer data)
4951 MainWindow *mainwin = (MainWindow *)data;
4952 MsgInfo *info = messageview_nav_get_next(mainwin->messageview);
4954 if (info->folder != mainwin->summaryview->folder_item)
4955 folderview_select(mainwin->folderview, info->folder);
4956 summary_select_by_msgnum(mainwin->summaryview, info->msgnum,
4957 OPEN_SELECTED_ON_PREVNEXT);
4958 procmsg_msginfo_free(&info);
4959 main_window_set_menu_sensitive(mainwindow_get_mainwindow());
4960 toolbar_main_set_sensitive(mainwindow_get_mainwindow());
4964 static void parent_cb(GtkAction *action, gpointer data)
4966 MainWindow *mainwin = (MainWindow *)data;
4967 summary_select_parent(mainwin->summaryview);
4970 static void goto_folder_cb(GtkAction *action, gpointer data)
4972 MainWindow *mainwin = (MainWindow *)data;
4973 FolderItem *to_folder;
4975 to_folder = foldersel_folder_sel(NULL, FOLDER_SEL_ALL, NULL, FALSE,
4976 _("Select folder to go to"));
4979 folderview_select(mainwin->folderview, to_folder);
4982 static void goto_unread_folder_cb(GtkAction *action, gpointer data)
4984 MainWindow *mainwin = (MainWindow *)data;
4985 folderview_select_next_with_flag(mainwin->folderview, MSG_UNREAD);
4988 static void scroll_prev_line_cb(GtkAction *action, gpointer data)
4990 MainWindow *mainwin = (MainWindow *)data;
4991 mimeview_scroll_one_line(mainwin->messageview->mimeview,TRUE);
4994 static void scroll_next_line_cb(GtkAction *action, gpointer data)
4996 MainWindow *mainwin = (MainWindow *)data;
4997 mimeview_scroll_one_line(mainwin->messageview->mimeview,FALSE);
5000 static void scroll_prev_page_cb(GtkAction *action, gpointer data)
5002 MainWindow *mainwin = (MainWindow *)data;
5003 mimeview_scroll_page(mainwin->messageview->mimeview,TRUE);
5006 static void scroll_next_page_cb(GtkAction *action, gpointer data)
5008 MainWindow *mainwin = (MainWindow *)data;
5009 mimeview_scroll_page(mainwin->messageview->mimeview,FALSE);
5012 static void copy_cb(GtkAction *action, gpointer data)
5014 MainWindow *mainwin = (MainWindow *)data;
5015 messageview_copy_clipboard(mainwin->messageview);
5018 static void allsel_cb(GtkAction *action, gpointer data)
5020 MainWindow *mainwin = (MainWindow *)data;
5021 MessageView *msgview = mainwin->messageview;
5023 if (messageview_is_visible(msgview) &&
5024 (gtk_widget_has_focus(msgview->mimeview->textview->text)))
5025 messageview_select_all(mainwin->messageview);
5027 summary_select_all(mainwin->summaryview);
5030 static void select_thread_cb(GtkAction *action, gpointer data)
5032 MainWindow *mainwin = (MainWindow *)data;
5033 summary_select_thread(mainwin->summaryview, FALSE, FALSE);
5036 static void trash_thread_cb(GtkAction *action, gpointer data)
5038 MainWindow *mainwin = (MainWindow *)data;
5039 summary_select_thread(mainwin->summaryview, FALSE, TRUE);
5042 static void delete_thread_cb(GtkAction *action, gpointer data)
5044 MainWindow *mainwin = (MainWindow *)data;
5045 summary_select_thread(mainwin->summaryview, TRUE, FALSE);
5048 static void create_filter_cb(GtkAction *gaction, gpointer data)
5050 MainWindow *mainwin = (MainWindow *)data;
5051 const gchar *a_name = gtk_action_get_name(gaction);
5054 DO_ACTION("Tools/CreateFilterRule/Automatically", FILTER_BY_AUTO);
5055 DO_ACTION("Tools/CreateFilterRule/ByFrom", FILTER_BY_FROM);
5056 DO_ACTION("Tools/CreateFilterRule/ByTo", FILTER_BY_TO);
5057 DO_ACTION("Tools/CreateFilterRule/BySubject", FILTER_BY_SUBJECT);
5058 DO_ACTION("Tools/CreateFilterRule/BySender", FILTER_BY_SENDER);
5059 summary_filter_open(mainwin->summaryview, (PrefsFilterType)action, 0);
5062 static void create_processing_cb(GtkAction *gaction, gpointer data)
5064 MainWindow *mainwin = (MainWindow *)data;
5065 const gchar *a_name = gtk_action_get_name(gaction);
5068 DO_ACTION("Tools/CreateProcessingRule/Automatically", FILTER_BY_AUTO);
5069 DO_ACTION("Tools/CreateProcessingRule/ByFrom", FILTER_BY_FROM);
5070 DO_ACTION("Tools/CreateProcessingRule/ByTo", FILTER_BY_TO);
5071 DO_ACTION("Tools/CreateProcessingRule/BySubject", FILTER_BY_SUBJECT);
5072 DO_ACTION("Tools/CreateProcessingRule/BySender", FILTER_BY_SENDER);
5073 summary_filter_open(mainwin->summaryview, (PrefsFilterType)action, 1);
5076 static void prefs_pre_processing_open_cb(GtkAction *action, gpointer data)
5078 prefs_filtering_open(&pre_global_processing,
5079 _("Processing rules to apply before folder rules"),
5080 MANUAL_ANCHOR_PROCESSING,
5084 static void prefs_post_processing_open_cb(GtkAction *action, gpointer data)
5086 prefs_filtering_open(&post_global_processing,
5087 _("Processing rules to apply after folder rules"),
5088 MANUAL_ANCHOR_PROCESSING,
5092 static void prefs_filtering_open_cb(GtkAction *action, gpointer data)
5094 prefs_filtering_open(&filtering_rules,
5095 _("Filtering configuration"),
5096 MANUAL_ANCHOR_FILTERING,
5100 static void prefs_template_open_cb(GtkAction *action, gpointer data)
5102 prefs_template_open();
5105 static void prefs_actions_open_cb(GtkAction *action, gpointer data)
5107 MainWindow *mainwin = (MainWindow *)data;
5108 prefs_actions_open(mainwin);
5111 static void prefs_tags_open_cb(GtkAction *action, gpointer data)
5113 tags_window_open(NULL);
5116 static void ssl_manager_open_cb(GtkAction *action, gpointer data)
5118 MainWindow *mainwin = (MainWindow *)data;
5119 ssl_manager_open(mainwin);
5122 static void prefs_account_open_cb(GtkAction *action, gpointer data)
5124 MainWindow *mainwin = (MainWindow *)data;
5126 new_account_cb(NULL, mainwin);
5128 account_open(cur_account, FALSE);
5132 static void new_account_cb(GtkAction *action, gpointer data)
5134 account_edit_open(NULL, NULL);
5135 if (!compose_get_compose_list()) account_add();
5138 static void account_selector_menu_cb(GtkMenuItem *menuitem, gpointer data)
5140 FolderItem *item = NULL;
5141 cur_account = (PrefsAccount *)data;
5143 if (!mainwindow_get_mainwindow())
5145 main_window_show_cur_account(mainwindow_get_mainwindow());
5146 toolbar_update(TOOLBAR_MAIN, mainwindow_get_mainwindow());
5147 main_window_set_menu_sensitive(mainwindow_get_mainwindow());
5148 toolbar_main_set_sensitive(mainwindow_get_mainwindow());
5149 item = folderview_get_selected_item(
5150 mainwindow_get_mainwindow()->folderview);
5152 toolbar_set_compose_button
5153 (mainwindow_get_mainwindow()->toolbar,
5154 FOLDER_TYPE(item->folder) == F_NEWS ?
5155 COMPOSEBUTTON_NEWS : COMPOSEBUTTON_MAIL);
5159 static void account_receive_menu_cb(GtkMenuItem *menuitem, gpointer data)
5161 MainWindow *mainwin = (MainWindow *)mainwin_list->data;
5162 PrefsAccount *account = (PrefsAccount *)data;
5164 inc_account_mail(mainwin, account);
5166 #ifndef GENERIC_UMPC
5167 static void account_compose_menu_cb(GtkMenuItem *menuitem, gpointer data)
5169 PrefsAccount *account = (PrefsAccount *)data;
5171 compose_new_with_folderitem(account, NULL, NULL);
5174 static void prefs_open_cb(GtkAction *action, gpointer data)
5179 static void plugins_open_cb(GtkAction *action, gpointer data)
5181 pluginwindow_create();
5184 static void manual_open_cb(GtkAction *action, gpointer data)
5186 manual_open(MANUAL_MANUAL_CLAWS, NULL);
5189 static void manual_faq_open_cb(GtkAction *action, gpointer data)
5191 manual_open(MANUAL_FAQ_CLAWS, NULL);
5194 static void legend_open_cb(GtkAction *action, gpointer data)
5200 static void set_default_client_cb(GtkAction *action, gpointer data)
5202 char exename[MAX_PATH];
5203 gchar *binary_icon = NULL;
5204 gchar *binary_compose = NULL;
5205 gchar *binary_run = NULL;
5207 if ( !GetModuleFileNameA (0, exename, sizeof (exename)) ) {
5208 alertpanel_error(_("Can not register as default client: impossible to get executable path."));
5211 binary_icon = g_strconcat(exename, ",0", NULL);
5212 binary_compose = g_strconcat(exename, " --compose %1", NULL);
5213 binary_run = g_strconcat(exename, NULL);
5215 /* Try to set the Mail Start menu item to Claws. It may fail if we're not root; we don't care */
5216 r = write_w32_registry_string(HKEY_LOCAL_MACHINE,
5217 "Software\\Clients\\Mail",
5221 r = write_w32_registry_string(HKEY_CURRENT_USER,
5222 "Software\\Clients\\Mail\\Claws Mail",
5226 r = write_w32_registry_string(HKEY_CURRENT_USER,
5227 "Software\\Clients\\Mail\\Claws Mail",
5231 r = write_w32_registry_string(HKEY_CURRENT_USER,
5232 "Software\\Clients\\Mail\\Claws Mail\\Protocols\\mailto",
5234 "URL:MailTo-Protocol");
5236 r = write_w32_registry_string(HKEY_CURRENT_USER,
5237 "Software\\Clients\\Mail\\Claws Mail\\Protocols\\mailto",
5241 r = write_w32_registry_dword (HKEY_CURRENT_USER,
5242 "Software\\Clients\\Mail\\Claws Mail\\Protocols\\mailto",
5246 r = write_w32_registry_string(HKEY_CURRENT_USER,
5247 "Software\\Clients\\Mail\\Claws Mail\\Protocols\\mailto",
5251 r = write_w32_registry_string(HKEY_CURRENT_USER,
5252 "Software\\Clients\\Mail\\Claws Mail\\Protocols\\mailto\\DefaultIcon",
5256 r = write_w32_registry_string(HKEY_CURRENT_USER,
5257 "Software\\Clients\\Mail\\Claws Mail\\Protocols\\mailto\\shell\\open\\command",
5261 r = write_w32_registry_string(HKEY_CURRENT_USER,
5262 "Software\\Clients\\Mail\\Claws Mail\\shell\\open\\command",
5267 r = write_w32_registry_string(HKEY_CURRENT_USER,
5268 "Software\\Classes\\mailto",
5270 "URL:MailTo-Protocol");
5272 r = write_w32_registry_string(HKEY_CURRENT_USER,
5273 "Software\\Classes\\mailto",
5277 r = write_w32_registry_dword (HKEY_CURRENT_USER,
5278 "Software\\Classes\\mailto",
5282 r = write_w32_registry_string(HKEY_CURRENT_USER,
5283 "Software\\Classes\\mailto",
5287 r = write_w32_registry_string(HKEY_CURRENT_USER,
5288 "Software\\Classes\\mailto\\DefaultIcon",
5292 r = write_w32_registry_string(HKEY_CURRENT_USER,
5293 "Software\\Classes\\mailto\\shell\\open\\command",
5298 SendMessage(HWND_BROADCAST, WM_SETTINGCHANGE, 0, (LPARAM)"Software\\Clients\\Mail");
5299 alertpanel_notice(_("Claws Mail has been registered as default client."));
5301 alertpanel_error(_("Can not register as default client: impossible to write to the registry."));
5303 g_free(binary_icon);
5304 g_free(binary_compose);
5309 static void scan_tree_func(Folder *folder, FolderItem *item, gpointer data)
5311 MainWindow *mainwin = (MainWindow *)data;
5315 str = g_strdup_printf(_("Scanning folder %s%c%s..."),
5316 LOCAL_FOLDER(folder)->rootpath,
5320 str = g_strdup_printf(_("Scanning folder %s..."),
5321 LOCAL_FOLDER(folder)->rootpath);
5323 STATUSBAR_PUSH(mainwin, str);
5324 STATUSBAR_POP(mainwin);
5328 static gboolean mainwindow_focus_in_event(GtkWidget *widget, GdkEventFocus *focus,
5331 SummaryView *summary;
5333 cm_return_val_if_fail(data, FALSE);
5334 if (!g_list_find(mainwin_list, data))
5336 summary = ((MainWindow *)data)->summaryview;
5337 cm_return_val_if_fail(summary, FALSE);
5339 if (GTK_CMCLIST(summary->ctree)->selection &&
5340 g_list_length(GTK_CMCLIST(summary->ctree)->selection) > 1)
5346 static gboolean mainwindow_visibility_event_cb(GtkWidget *widget, GdkEventVisibility *event,
5349 is_obscured = (event->state == GDK_VISIBILITY_FULLY_OBSCURED);
5353 static gboolean mainwindow_state_event_cb(GtkWidget *widget, GdkEventWindowState *state,
5356 if (!claws_is_starting()
5357 && state->changed_mask&GDK_WINDOW_STATE_ICONIFIED
5358 && state->new_window_state&GDK_WINDOW_STATE_ICONIFIED) {
5360 if (iconified_count > 0)
5361 hooks_invoke(MAIN_WINDOW_GOT_ICONIFIED, NULL);
5363 } else if (!claws_is_starting()) {
5364 prefs_common.mainwin_maximised =
5365 ((state->new_window_state&GDK_WINDOW_STATE_MAXIMIZED) != 0);
5367 if (state->new_window_state == 0)
5368 gtk_window_set_skip_taskbar_hint(GTK_WINDOW(widget), FALSE);
5372 gboolean mainwindow_is_obscured(void)
5378 * Harvest addresses for selected folder.
5380 static void addr_harvest_cb( GtkAction *action, gpointer data)
5382 MainWindow *mainwin = (MainWindow *)data;
5384 addressbook_harvest( mainwin->summaryview->folder_item, FALSE, NULL );
5388 * Harvest addresses for selected messages in summary view.
5390 static void addr_harvest_msg_cb( GtkAction *action, gpointer data)
5392 MainWindow *mainwin = (MainWindow *)data;
5393 summary_harvest_address( mainwin->summaryview );
5397 *\brief get a MainWindow
5399 *\return MainWindow * The first mainwindow in the mainwin_list
5401 MainWindow *mainwindow_get_mainwindow(void)
5403 if (mainwin_list && mainwin_list->data)
5404 return (MainWindow *)(mainwin_list->data);
5409 static gboolean mainwindow_progressindicator_hook(gpointer source, gpointer userdata)
5411 ProgressData *data = (ProgressData *) source;
5412 MainWindow *mainwin = (MainWindow *) userdata;
5414 switch (data->cmd) {
5415 case PROGRESS_COMMAND_START:
5416 case PROGRESS_COMMAND_STOP:
5417 gtk_progress_bar_set_fraction
5418 (GTK_PROGRESS_BAR(mainwin->progressbar), 0.0);
5420 case PROGRESS_COMMAND_SET_PERCENTAGE:
5421 gtk_progress_bar_set_fraction
5422 (GTK_PROGRESS_BAR(mainwin->progressbar), data->value);
5425 while (gtk_events_pending()) gtk_main_iteration ();
5430 static void sync_cb(GtkAction *action, gpointer data)
5432 MainWindow *mainwin = (MainWindow *)data;
5433 mainwindow_check_synchronise(mainwin, FALSE);
5436 static void forget_session_passwords_cb(GtkAction *action, gpointer data)
5438 MainWindow *mainwin = (MainWindow *)data;
5443 main_window_lock(mainwin);
5444 for (list = account_get_list(); list != NULL; list = list->next) {
5445 PrefsAccount *account = list->data;
5446 if (account->session_passwd) {
5447 g_free(account->session_passwd);
5448 account->session_passwd = NULL;
5451 if (account->session_smtp_passwd) {
5452 g_free(account->session_smtp_passwd);
5453 account->session_smtp_passwd = NULL;
5458 main_window_unlock(mainwin);
5459 alertpanel_notice(ngettext("Forgotten %d password in %d accounts.\n",
5460 "Forgotten %d passwords in %d accounts.\n",
5464 #ifndef PASSWORD_CRYPTO_OLD
5465 static void forget_master_passphrase_cb(GtkAction *action, gpointer data)
5467 MainWindow *mainwin = (MainWindow *)data;
5469 main_window_lock(mainwin);
5470 master_passphrase_forget();
5471 main_window_unlock(mainwin);
5475 void mainwindow_learn (MainWindow *mainwin, gboolean is_spam)
5477 summary_mark_as_spam(mainwin->summaryview, is_spam, NULL);
5480 void mainwindow_jump_to(const gchar *target, gboolean popup)
5484 FolderItem *item = NULL;
5486 MainWindow *mainwin = mainwindow_get_mainwindow();
5487 gchar *from_uri = NULL;
5492 g_print("not initialized\n");
5496 if ((from_uri = g_filename_from_uri(target, NULL, NULL)) != NULL)
5499 tmp = g_strdup(target);
5501 if ((p = strstr(tmp, "\r")) != NULL)
5503 if ((p = strstr(tmp, "\n")) != NULL)
5506 if ((item = folder_find_item_from_identifier(tmp))) {
5507 g_print("selecting folder '%s'\n", tmp);
5508 folderview_select(mainwin->folderview, item);
5510 main_window_popup(mainwin);
5515 msg = strrchr(tmp, '/');
5518 if ((item = folder_find_item_from_identifier(tmp))) {
5519 g_print("selecting folder '%s'\n", tmp);
5520 folderview_select(mainwin->folderview, item);
5521 } else if ((item = folder_find_item_from_real_path(tmp))) {
5522 g_print("selecting folder '%s'\n", tmp);
5523 folderview_select(mainwin->folderview, item);
5525 g_print("'%s' not found\n", tmp);
5527 if (item && msg && atoi(msg)) {
5528 g_print("selecting message %d\n", atoi(msg));
5529 summary_select_by_msgnum(mainwin->summaryview, atoi(msg), TRUE);
5531 main_window_popup(mainwin);
5534 } else if (item && msg[0] == '<' && msg[strlen(msg)-1] == '>') {
5535 MsgInfo *msginfo = NULL;
5537 msg[strlen(msg)-1] = '\0';
5538 msginfo = folder_item_get_msginfo_by_msgid(item, msg);
5540 g_print("selecting message %s\n", msg);
5541 summary_select_by_msgnum(mainwin->summaryview, msginfo->msgnum, TRUE);
5543 main_window_popup(mainwin);
5545 procmsg_msginfo_free(&msginfo);
5548 g_print("'%s' not found\n", msg);
5551 g_print("'%s' not found\n", msg);
5554 g_print("'%s' not found\n", tmp);
5560 void mainwindow_exit_folder(MainWindow *mainwin) {
5561 if (prefs_common.layout_mode == SMALL_LAYOUT) {
5562 folderview_close_opened(mainwin->folderview, FALSE);
5563 mainwin_paned_show_first(GTK_PANED(mainwin->hpaned));
5564 folderview_grab_focus(mainwin->folderview);
5566 mainwin->in_folder = FALSE;
5567 main_window_set_menu_sensitive(mainwin);
5570 void mainwindow_enter_folder(MainWindow *mainwin) {
5571 if (prefs_common.layout_mode == SMALL_LAYOUT) {
5572 mainwin_paned_show_last(GTK_PANED(mainwin->hpaned));
5574 mainwin->in_folder = TRUE;
5575 main_window_set_menu_sensitive(mainwin);
5578 static void save_part_as_cb(GtkAction *action, gpointer data)
5580 MainWindow *mainwin = (MainWindow *)data;
5582 if (mainwin->messageview
5583 && mainwin->messageview->mimeview)
5584 mimeview_save_as(mainwin->messageview->mimeview);
5587 static void view_part_as_text_cb(GtkAction *action, gpointer data)
5589 MainWindow *mainwin = (MainWindow *)data;
5591 if (mainwin->messageview
5592 && mainwin->messageview->mimeview)
5593 mimeview_display_as_text(mainwin->messageview->mimeview);
5596 static void open_part_cb(GtkAction *action, gpointer data)
5598 MainWindow *mainwin = (MainWindow *)data;
5600 if (mainwin->messageview
5601 && mainwin->messageview->mimeview)
5602 mimeview_launch(mainwin->messageview->mimeview, NULL);
5605 static void open_part_with_cb(GtkAction *action, gpointer data)
5607 MainWindow *mainwin = (MainWindow *)data;
5609 if (mainwin->messageview
5610 && mainwin->messageview->mimeview)
5611 mimeview_open_with(mainwin->messageview->mimeview);
5614 static void check_signature_cb(GtkAction *action, gpointer data)
5616 MainWindow *mainwin = (MainWindow *)data;
5618 if (mainwin->messageview
5619 && mainwin->messageview->mimeview)
5620 mimeview_check_signature(mainwin->messageview->mimeview);
5623 static void goto_next_part_cb(GtkAction *action, gpointer data)
5625 MainWindow *mainwin = (MainWindow *)data;
5627 if (mainwin->messageview
5628 && mainwin->messageview->mimeview)
5629 mimeview_select_next_part(mainwin->messageview->mimeview);
5632 static void goto_prev_part_cb(GtkAction *action, gpointer data)
5634 MainWindow *mainwin = (MainWindow *)data;
5636 if (mainwin->messageview
5637 && mainwin->messageview->mimeview)
5638 mimeview_select_prev_part(mainwin->messageview->mimeview);