2 Claws Mail -- a GTK+ based, lightweight, and fast e-mail client
3 Copyright (C) 1999-2018 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_("Previous 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"), NULL, NULL, G_CALLBACK(mark_all_read_cb) },
717 {"Message/Mark/MarkAllUnread", NULL, N_("Mark all unread"), 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 */
761 {"Tools/CreateProcessingRule", NULL, N_("Create processing rule"), NULL, NULL, NULL },
762 {"Tools/CreateProcessingRule/Automatically", NULL, N_("_Automatically"), NULL, NULL, G_CALLBACK(create_processing_cb) },
763 {"Tools/CreateProcessingRule/ByFrom", NULL, N_("By _From"), NULL, NULL, G_CALLBACK(create_processing_cb) },
764 {"Tools/CreateProcessingRule/ByTo", NULL, N_("By _To"), NULL, NULL, G_CALLBACK(create_processing_cb) },
765 {"Tools/CreateProcessingRule/BySubject", NULL, N_("By _Subject"), NULL, NULL, G_CALLBACK(create_processing_cb) },
766 /* {"Tools/---", NULL, "---", NULL, NULL, NULL }, */
768 {"Tools/ListUrls", NULL, N_("List _URLs..."), "<control><shift>U", NULL, G_CALLBACK(open_urls_cb) },
770 /* {"Tools/---", NULL, "---", NULL, NULL, NULL }, */
771 {"Tools/Actions", NULL, N_("Actio_ns"), NULL, NULL, NULL },
772 {"Tools/Actions/PlaceHolder", NULL, "Placeholder", NULL, NULL, G_CALLBACK(mainwindow_nothing_cb) },
773 /* {"Tools/---", NULL, "---", NULL, NULL, NULL }, */
775 {"Tools/CheckNewMessages", NULL, N_("Ch_eck for new messages in all folders"), NULL, NULL, G_CALLBACK(update_folderview_cb) },
776 {"Tools/DeleteDuplicates", NULL, N_("Delete du_plicated messages"), NULL, NULL, NULL },
777 {"Tools/DeleteDuplicates/SelFolder", NULL, N_("In selected folder"), NULL, NULL, G_CALLBACK(delete_duplicated_cb) },
778 {"Tools/DeleteDuplicates/AllFolders", NULL, N_("In all folders"), NULL, NULL, G_CALLBACK(delete_duplicated_all_cb) },
779 /* {"Tools/---", NULL, "---", NULL, NULL, NULL }, */
781 {"Tools/Execute", NULL, N_("E_xecute"), "X", NULL, G_CALLBACK(execute_summary_cb) },
782 {"Tools/Expunge", NULL, N_("Exp_unge"), "<control>E", NULL, G_CALLBACK(expunge_summary_cb) },
784 /* {"Tools/---", NULL, "---", NULL, NULL, NULL }, */
785 {"Tools/SSLCertificates", NULL, N_("SSL/TLS cer_tificates"), NULL, NULL, G_CALLBACK(ssl_manager_open_cb) },
787 /* {"Tools/---", NULL, "---", NULL, NULL, NULL }, */
788 {"Tools/FilteringLog", NULL, N_("Filtering Lo_g"), NULL, NULL, G_CALLBACK(filtering_debug_window_show_cb) },
789 {"Tools/NetworkLog", NULL, N_("Network _Log"), "<shift><control>L", NULL, G_CALLBACK(log_window_show_cb) },
791 {"Tools/DebugLog", NULL, N_("Debug _Log"), NULL, NULL, G_CALLBACK(debug_log_show_cb) },
793 /* {"Tools/---", NULL, "---", NULL, NULL, NULL }, */
794 {"Tools/ForgetSessionPasswords", NULL, N_("_Forget all session passwords"), NULL, NULL, G_CALLBACK(forget_session_passwords_cb) },
795 #ifndef PASSWORD_CRYPTO_OLD
796 {"Tools/ForgetMasterPassphrase", NULL, N_("Forget _master passphrase"), NULL, NULL, G_CALLBACK(forget_master_passphrase_cb) },
799 /* Configuration menu */
800 {"Configuration/ChangeAccount", NULL, N_("C_hange current account"), NULL, NULL, NULL },
801 {"Configuration/ChangeAccount/PlaceHolder", NULL, "Placeholder", NULL, NULL, G_CALLBACK(mainwindow_nothing_cb) },
802 {"Configuration/AccountPrefs", NULL, N_("_Preferences for current account..."), NULL, NULL, G_CALLBACK(prefs_account_open_cb) },
803 {"Configuration/CreateAccount", NULL, N_("Create _new account..."), NULL, NULL, G_CALLBACK(new_account_cb) },
804 {"Configuration/EditAccounts", NULL, N_("_Edit accounts..."), NULL, NULL, G_CALLBACK(account_edit_open) },
805 {"Configuration/---", NULL, "---", NULL, NULL, NULL },
807 {"Configuration/Preferences", NULL, N_("P_references..."), NULL, NULL, G_CALLBACK(prefs_open_cb) },
808 {"Configuration/PreProcessing", NULL, N_("Pre-pr_ocessing..."), NULL, NULL, G_CALLBACK(prefs_pre_processing_open_cb) },
809 {"Configuration/PostProcessing", NULL, N_("Post-pro_cessing..."), NULL, NULL, G_CALLBACK(prefs_post_processing_open_cb) },
810 {"Configuration/Filtering", NULL, N_("_Filtering..."), NULL, NULL, G_CALLBACK(prefs_filtering_open_cb) },
811 {"Configuration/Templates", NULL, N_("_Templates..."), NULL, NULL, G_CALLBACK(prefs_template_open_cb) },
812 {"Configuration/Actions", NULL, N_("_Actions..."), NULL, NULL, G_CALLBACK(prefs_actions_open_cb) },
813 {"Configuration/Tags", NULL, N_("Tag_s..."), NULL, NULL, G_CALLBACK(prefs_tags_open_cb) },
814 /* {"Configuration/---", NULL, "---", NULL, NULL, NULL }, */
815 {"Configuration/Plugins", NULL, N_("Plu_gins..."), NULL, NULL, G_CALLBACK(plugins_open_cb) },
818 {"Help/Manual", NULL, N_("_Manual"), NULL, NULL, G_CALLBACK(manual_open_cb) },
819 {"Help/FAQ", NULL, N_("_Online User-contributed FAQ"), NULL, NULL, G_CALLBACK(manual_faq_open_cb) },
820 {"Help/IconLegend", NULL, N_("Icon _Legend"), NULL, NULL, G_CALLBACK(legend_open_cb) },
822 {"Help/SetDefault", NULL, N_("Set as default client"), NULL, NULL, G_CALLBACK(set_default_client_cb) },
824 {"Help/---", NULL, "---", NULL, NULL, NULL },
825 {"Help/About", NULL, N_("_About"), NULL, NULL, G_CALLBACK(about_cb) },
828 static GtkToggleActionEntry mainwin_toggle_entries[] = {
829 {"File/OfflineMode", NULL, N_("Offline _mode"), "<control>W", NULL, G_CALLBACK(toggle_work_offline_cb), FALSE }, /*toggle*/
830 {"View/ShowHide/MenuBar", NULL, N_("Men_ubar"), "<control>F12", NULL, G_CALLBACK(toggle_menubar_cb), FALSE }, /* toggle */
831 {"View/ShowHide/MessageView", NULL, N_("_Message view"), "V", NULL, G_CALLBACK(toggle_message_cb), FALSE }, /* toggle */
833 {"View/ShowHide/StatusBar", NULL, N_("Status _bar"), NULL, NULL, G_CALLBACK(toggle_statusbar_cb), FALSE }, /* toggle */
835 {"View/ShowHide/ColumnHeaders", NULL, N_("Column headers"), NULL, NULL, G_CALLBACK(toggle_col_headers_cb), FALSE }, /* toggle */
836 {"View/ThreadView", NULL, N_("Th_read view"), "<control>T", NULL, G_CALLBACK(thread_cb), FALSE }, /* toggle */
837 {"View/HideReadThreads", NULL, N_("Hide read threads"), NULL, NULL, G_CALLBACK(hide_read_threads), FALSE }, /* toggle */
838 {"View/HideReadMessages", NULL, N_("_Hide read messages"), NULL, NULL, G_CALLBACK(hide_read_messages), FALSE }, /* toggle */
839 {"View/HideDelMessages", NULL, N_("Hide deleted messages"), NULL, NULL, G_CALLBACK(hide_del_messages), FALSE }, /* toggle */
840 {"View/FullScreen", NULL, N_("_Fullscreen"), "F11", NULL, G_CALLBACK(toggle_fullscreen_cb), FALSE }, /* toggle */
841 {"View/AllHeaders", NULL, N_("Show all _headers"), "<control>H", NULL, G_CALLBACK(show_all_header_cb), FALSE }, /* toggle */
842 {"View/Quotes/CollapseAll", NULL, N_("_Collapse all"), "<control><shift>Q", NULL, G_CALLBACK(hide_quotes_cb), FALSE }, /* 1 toggle */
843 {"View/Quotes/Collapse2", NULL, N_("Collapse from level _2"), NULL, NULL, G_CALLBACK(hide_quotes_cb), FALSE }, /* 2 toggle */
844 {"View/Quotes/Collapse3", NULL, N_("Collapse from level _3"), NULL, NULL, G_CALLBACK(hide_quotes_cb), FALSE }, /* 3 toggle */
847 static GtkRadioActionEntry mainwin_showhide_radio_entries[] = { /* toggle_toolbar_cb */
848 {"View/ShowHide/Toolbar/TextBelowIcon", NULL, N_("Text _below icons"), NULL, NULL, TOOLBAR_BOTH }, /* radio TOOLBAR_BOTH */
849 {"View/ShowHide/Toolbar/TextBesideIcon", NULL, N_("Text be_side icons"), NULL, NULL, TOOLBAR_BOTH_HORIZ }, /* radio TOOLBAR_BOTH_HORIZ */
850 {"View/ShowHide/Toolbar/IconOnly", NULL, N_("_Icons only"), NULL, NULL, TOOLBAR_ICON }, /* radio TOOLBAR_ICON */
851 {"View/ShowHide/Toolbar/TextOnly", NULL, N_("_Text only"), NULL, NULL, TOOLBAR_TEXT }, /* radio TOOLBAR_TEXT */
853 {"View/ShowHide/Toolbar/Hide", NULL, N_("_Hide"), NULL, NULL, TOOLBAR_NONE }, /* radio TOOLBAR_NONE */
857 static GtkRadioActionEntry mainwin_layout_radio_entries[] = { /* set_layout_cb */
858 {"View/Layout/Standard", NULL, N_("_Standard"), NULL, NULL, NORMAL_LAYOUT }, /* radio NORMAL_LAYOUT */
859 {"View/Layout/ThreeColumns", NULL, N_("_Three columns"), NULL, NULL, VERTICAL_LAYOUT }, /* radio VERTICAL_LAYOUT */
860 {"View/Layout/WideMessage", NULL, N_("_Wide message"), NULL, NULL, WIDE_LAYOUT }, /* radio WIDE_LAYOUT */
861 {"View/Layout/WideMessageList", NULL, N_("W_ide message list"), NULL, NULL, WIDE_MSGLIST_LAYOUT }, /* radio WIDE_MSGLIST_LAYOUT */
862 {"View/Layout/SmallScreen", NULL, N_("S_mall screen"), NULL, NULL, SMALL_LAYOUT }, /* radio SMALL_LAYOUT */
865 static GtkRadioActionEntry mainwin_sort_radio_entries[] = { /* sort_summary_cb */
866 {"View/Sort/Number", NULL, N_("By _number"), NULL, NULL, SORT_BY_NUMBER }, /* radio SORT_BY_NUMBER */
867 {"View/Sort/Size", NULL, N_("By s_ize"), NULL, NULL, SORT_BY_SIZE }, /* radio SORT_BY_SIZE */
868 {"View/Sort/Date", NULL, N_("By _date"), NULL, NULL, SORT_BY_DATE }, /* radio SORT_BY_DATE */
869 {"View/Sort/ThreadDate", NULL, N_("By thread date"), NULL, NULL, SORT_BY_THREAD_DATE }, /* radio SORT_BY_THREAD_DATE */
870 {"View/Sort/From", NULL, N_("By _From"), NULL, NULL, SORT_BY_FROM }, /* radio SORT_BY_FROM */
871 {"View/Sort/To", NULL, N_("By _To"), NULL, NULL, SORT_BY_TO }, /* radio SORT_BY_TO */
872 {"View/Sort/Subject", NULL, N_("By s_ubject"), NULL, NULL, SORT_BY_SUBJECT }, /* radio SORT_BY_SUBJECT */
873 {"View/Sort/Color", NULL, N_("By _color label"), NULL, NULL, SORT_BY_LABEL }, /* radio SORT_BY_LABEL */
874 {"View/Sort/Tag", NULL, N_("By tag"), NULL, NULL, SORT_BY_TAGS }, /* radio SORT_BY_TAGS */
875 {"View/Sort/Mark", NULL, N_("By _mark"), NULL, NULL, SORT_BY_MARK }, /* radio SORT_BY_MARK */
876 {"View/Sort/Status", NULL, N_("By _status"), NULL, NULL, SORT_BY_STATUS }, /* radio SORT_BY_STATUS */
877 {"View/Sort/Attachment", NULL, N_("By a_ttachment"), NULL, NULL, SORT_BY_MIME }, /* radio SORT_BY_MIME */
878 {"View/Sort/Score", NULL, N_("By score"), NULL, NULL, SORT_BY_SCORE }, /* radio SORT_BY_SCORE */
879 {"View/Sort/Locked", NULL, N_("By locked"), NULL, NULL, SORT_BY_LOCKED }, /* radio SORT_BY_LOCKED */
880 {"View/Sort/DontSort", NULL, N_("D_on't sort"), NULL, NULL, SORT_BY_NONE }, /* radio SORT_BY_NONE */
883 static GtkRadioActionEntry mainwin_sorttype_radio_entries[] = { /* sort_summary_type_cb */
884 {"View/Sort/Ascending", NULL, N_("Ascending"), NULL, NULL, SORT_ASCENDING }, /* radio SORT_ASCENDING */
885 {"View/Sort/Descending", NULL, N_("Descending"), NULL, NULL, SORT_DESCENDING }, /* radio SORT_DESCENDING */
888 static GtkRadioActionEntry mainwin_radio_enc_entries[] =
890 ENC_ACTION(CS_AUTO, C_AUTO, N_("_Automatic")), /* RADIO set_charset_cb */
891 ENC_ACTION(CS_US_ASCII, C_US_ASCII, N_("7bit ASCII (US-ASC_II)")), /* RADIO set_charset_cb */
892 ENC_ACTION(CS_UTF_8, C_UTF_8, N_("Unicode (_UTF-8)")), /* RADIO set_charset_cb */
893 ENC_ACTION("Western/"CS_ISO_8859_1, C_ISO_8859_1, "ISO-8859-_1"), /* RADIO set_charset_cb */
894 ENC_ACTION("Western/"CS_ISO_8859_15, C_ISO_8859_15, "ISO-8859-15"), /* RADIO set_charset_cb */
895 ENC_ACTION("Western/"CS_WINDOWS_1252, C_WINDOWS_1252, "Windows-1252"), /* RADIO set_charset_cb */
896 ENC_ACTION(CS_ISO_8859_2, C_ISO_8859_2, N_("Central European (ISO-8859-_2)")), /* RADIO set_charset_cb */
897 ENC_ACTION("Baltic/"CS_ISO_8859_13, C_ISO_8859_13, "ISO-8859-13"), /* RADIO set_charset_cb */
898 ENC_ACTION("Baltic/"CS_ISO_8859_4, C_ISO_8859_14, "ISO-8859-_4"), /* RADIO set_charset_cb */
899 ENC_ACTION(CS_ISO_8859_7, C_ISO_8859_7, N_("Greek (ISO-8859-_7)")), /* RADIO set_charset_cb */
900 ENC_ACTION("Hebrew/"CS_ISO_8859_8, C_ISO_8859_8, "ISO-8859-_8"), /* RADIO set_charset_cb */
901 ENC_ACTION("Hebrew/"CS_WINDOWS_1255, C_WINDOWS_1255, "Windows-1255"), /* RADIO set_charset_cb */
902 ENC_ACTION("Arabic/"CS_ISO_8859_6, C_ISO_8859_6, "ISO-8859-_6"), /* RADIO set_charset_cb */
903 ENC_ACTION("Arabic/"CS_WINDOWS_1256, C_WINDOWS_1256, "Windows-1256"), /* RADIO set_charset_cb */
904 ENC_ACTION(CS_ISO_8859_9, C_ISO_8859_9, N_("Turkish (ISO-8859-_9)")), /* RADIO set_charset_cb */
905 ENC_ACTION("Cyrillic/"CS_ISO_8859_5, C_ISO_8859_5, "ISO-8859-_5"), /* RADIO set_charset_cb */
906 ENC_ACTION("Cyrillic/"CS_KOI8_R, C_KOI8_R, "KOI8-_R"), /* RADIO set_charset_cb */
907 ENC_ACTION("Cyrillic/"CS_MACCYR, C_MACCYR, "_Mac-Cyrillic"), /* RADIO set_charset_cb */
908 ENC_ACTION("Cyrillic/"CS_KOI8_U, C_KOI8_U, "KOI8-_U"), /* RADIO set_charset_cb */
909 ENC_ACTION("Cyrillic/"CS_WINDOWS_1251, C_WINDOWS_1251, "Windows-1251"), /* RADIO set_charset_cb */
910 ENC_ACTION("Japanese/"CS_ISO_2022_JP, C_ISO_2022_JP, "ISO-2022-_JP"), /* RADIO set_charset_cb */
911 ENC_ACTION("Japanese/"CS_ISO_2022_JP_2, C_ISO_2022_JP_2, "ISO-2022-JP-_2"), /* RADIO set_charset_cb */
912 ENC_ACTION("Japanese/"CS_EUC_JP, C_EUC_JP, "_EUC-JP"), /* RADIO set_charset_cb */
913 ENC_ACTION("Japanese/"CS_SHIFT_JIS, C_SHIFT_JIS, "_Shift-JIS"), /* RADIO set_charset_cb */
914 ENC_ACTION("Chinese/"CS_GB18030, C_GB18030, "_GB18030"), /* RADIO set_charset_cb */
915 ENC_ACTION("Chinese/"CS_GB2312, C_GB2312, "_GB2312"), /* RADIO set_charset_cb */
916 ENC_ACTION("Chinese/"CS_GBK, C_GBK, "GB_K"), /* RADIO set_charset_cb */
917 ENC_ACTION("Chinese/"CS_BIG5, C_BIG5, "_Big5-JP"), /* RADIO set_charset_cb */
918 ENC_ACTION("Chinese/"CS_EUC_TW, C_EUC_TW, "EUC-_TW"), /* RADIO set_charset_cb */
919 ENC_ACTION("Korean/"CS_EUC_KR, C_EUC_KR, "_EUC-KR"), /* RADIO set_charset_cb */
920 ENC_ACTION("Korean/"CS_ISO_2022_KR, C_ISO_2022_KR, "_ISO-2022-KR"), /* RADIO set_charset_cb */
921 ENC_ACTION("Thai/"CS_TIS_620, C_TIS_620, "_TIS-620-KR"), /* RADIO set_charset_cb */
922 ENC_ACTION("Thai/"CS_WINDOWS_874, C_WINDOWS_874, "_Windows-874"), /* RADIO set_charset_cb */
925 static GtkRadioActionEntry mainwin_radio_dec_entries[] =
927 DEC_ACTION("AutoDetect", 0, N_("_Auto detect")), /* set_decode_cb */
929 DEC_ACTION("8bit", ENC_8BIT, "_8bit"),
930 DEC_ACTION("QP", ENC_QUOTED_PRINTABLE, "_Quoted printable"),
931 DEC_ACTION("B64", ENC_BASE64, "_Base64"),
932 DEC_ACTION("Uuencode", ENC_X_UUENCODE, "_Uuencode"),
935 static gboolean offline_ask_sync = TRUE;
936 static gboolean is_obscured = FALSE;
938 #define N_COLOR_LABELS colorlabel_get_color_count()
940 static void mainwindow_colorlabel_menu_item_activate_item_cb(GtkMenuItem *menu_item,
945 GtkCheckMenuItem **items;
947 GList *children, *cur;
950 mainwin = (MainWindow *)data;
951 cm_return_if_fail(mainwin != NULL);
953 sel = summary_get_selection(mainwin->summaryview);
956 menu = GTK_MENU_SHELL(mainwin->colorlabel_menu);
957 cm_return_if_fail(menu != NULL);
959 Xalloca(items, (N_COLOR_LABELS + 1) * sizeof(GtkWidget *), return);
961 /* NOTE: don't return prematurely because we set the "dont_toggle"
962 * state for check menu items. This would be bad! */
963 g_object_set_data(G_OBJECT(menu), "dont_toggle",
966 /* clear items. get item pointers. */
967 children = gtk_container_get_children(GTK_CONTAINER(menu));
968 for (n = 0, cur = children; cur != NULL && cur->data != NULL; cur = cur->next) {
969 if (GTK_IS_CHECK_MENU_ITEM(cur->data)) {
970 gtk_check_menu_item_set_active
971 (GTK_CHECK_MENU_ITEM(cur->data), FALSE);
972 items[n] = GTK_CHECK_MENU_ITEM(cur->data);
977 g_list_free(children);
979 if (n == (N_COLOR_LABELS + 1)) {
980 /* iterate all messages and set the state of the appropriate
982 for (; sel != NULL; sel = sel->next) {
986 msginfo = (MsgInfo *)sel->data;
988 clabel = MSG_GET_COLORLABEL_VALUE(msginfo->flags);
989 if (!gtk_check_menu_item_get_active(items[clabel]))
990 gtk_check_menu_item_set_active
991 (items[clabel], TRUE);
995 g_warning("invalid number of color elements (%d)", n);
998 /* reset "dont_toggle" state */
999 g_object_set_data(G_OBJECT(menu), "dont_toggle",
1000 GINT_TO_POINTER(0));
1003 static void mainwindow_colorlabel_menu_item_activate_cb(GtkWidget *widget,
1006 guint color = GPOINTER_TO_UINT(data);
1007 MainWindow *mainwin;
1009 mainwin = g_object_get_data(G_OBJECT(widget), "mainwin");
1010 cm_return_if_fail(mainwin != NULL);
1012 /* "dont_toggle" state set? */
1013 if (g_object_get_data(G_OBJECT(mainwin->colorlabel_menu),
1017 summary_set_colorlabel(mainwin->summaryview, color, NULL);
1020 static void mainwindow_tags_menu_item_activate_item_cb(GtkMenuItem *menu_item,
1023 MainWindow *mainwin;
1025 GList *children, *cur;
1027 GHashTable *menu_table = g_hash_table_new_full(
1031 GHashTable *menu_allsel_table = g_hash_table_new_full(
1036 mainwin = (MainWindow *)data;
1037 cm_return_if_fail(mainwin != NULL);
1039 sel = summary_get_selection(mainwin->summaryview);
1042 menu = GTK_MENU_SHELL(mainwin->tags_menu);
1043 cm_return_if_fail(menu != NULL);
1045 /* NOTE: don't return prematurely because we set the "dont_toggle"
1046 * state for check menu items */
1047 g_object_set_data(G_OBJECT(menu), "dont_toggle",
1048 GINT_TO_POINTER(1));
1050 /* clear items. get item pointers. */
1051 children = gtk_container_get_children(GTK_CONTAINER(menu));
1052 for (cur = children; cur != NULL && cur->data != NULL; cur = cur->next) {
1053 if (GTK_IS_CHECK_MENU_ITEM(cur->data)) {
1054 gint id = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(cur->data),
1056 gtk_check_menu_item_set_active
1057 (GTK_CHECK_MENU_ITEM(cur->data), FALSE);
1059 g_hash_table_insert(menu_table, GINT_TO_POINTER(id), GTK_CHECK_MENU_ITEM(cur->data));
1060 g_hash_table_insert(menu_allsel_table, GINT_TO_POINTER(id), GINT_TO_POINTER(0));
1064 g_list_free(children);
1066 /* iterate all messages and set the state of the appropriate
1069 for (; sel != NULL; sel = sel->next) {
1071 GSList *tags = NULL;
1072 GtkCheckMenuItem *item;
1073 msginfo = (MsgInfo *)sel->data;
1076 tags = msginfo->tags;
1080 for (; tags; tags = tags->next) {
1081 gint num_checked = GPOINTER_TO_INT(g_hash_table_lookup(menu_allsel_table, tags->data));
1082 item = g_hash_table_lookup(menu_table, GINT_TO_POINTER(tags->data));
1083 if (item && !gtk_check_menu_item_get_active(item)) {
1084 gtk_check_menu_item_set_active
1088 g_hash_table_replace(menu_allsel_table, tags->data, GINT_TO_POINTER(num_checked));
1093 children = gtk_container_get_children(GTK_CONTAINER(menu));
1094 for (cur = children; cur != NULL && cur->data != NULL; cur = cur->next) {
1095 if (GTK_IS_CHECK_MENU_ITEM(cur->data)) {
1096 gint id = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(cur->data),
1098 gint num_checked = GPOINTER_TO_INT(g_hash_table_lookup(menu_allsel_table, GINT_TO_POINTER(id)));
1099 if (num_checked < sel_len && num_checked > 0)
1100 gtk_check_menu_item_set_inconsistent(GTK_CHECK_MENU_ITEM(cur->data), TRUE);
1102 gtk_check_menu_item_set_inconsistent(GTK_CHECK_MENU_ITEM(cur->data), FALSE);
1105 g_list_free(children);
1107 g_hash_table_destroy(menu_table);
1108 g_hash_table_destroy(menu_allsel_table);
1109 /* reset "dont_toggle" state */
1110 g_object_set_data(G_OBJECT(menu), "dont_toggle",
1111 GINT_TO_POINTER(0));
1114 static void mainwindow_tags_menu_item_activate_cb(GtkWidget *widget,
1117 gint id = GPOINTER_TO_INT(data);
1118 gboolean set = gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(widget));
1119 MainWindow *mainwin;
1121 mainwin = g_object_get_data(G_OBJECT(widget), "mainwin");
1122 cm_return_if_fail(mainwin != NULL);
1124 /* "dont_toggle" state set? */
1125 if (g_object_get_data(G_OBJECT(mainwin->tags_menu),
1131 summary_set_tag(mainwin->summaryview, id, NULL);
1134 void mainwin_accel_changed_cb (GtkAccelGroup *accelgroup, guint keyval, GdkModifierType modifier,
1135 GClosure *closure, GtkMenuItem *item)
1137 GList *closures = gtk_widget_list_accel_closures(GTK_WIDGET(item));
1139 for (cur = closures; cur; cur = cur->next) {
1140 if (closure == cur->data) {
1141 GtkLabel *label = g_object_get_data(G_OBJECT(item), "accel_label");
1144 if (keyval == GDK_KEY_Delete) {
1145 const gchar *accel_path;
1146 accel_path = gtk_menu_item_get_accel_path(item);
1147 keyval = 0; modifier = 0;
1148 gtk_accel_map_change_entry (accel_path, keyval, modifier, TRUE);
1150 new_accel = gtk_accelerator_get_label(keyval, modifier);
1151 gtk_label_set_text(label, new_accel);
1155 g_list_free(closures);
1158 static void mainwindow_colorlabel_menu_create(MainWindow *mainwin, gboolean refresh)
1160 GtkWidget *label_menuitem;
1164 gchar *accel_path = NULL;
1166 label_menuitem = gtk_ui_manager_get_widget(mainwin->ui_manager, "/Menu/Message/ColorLabel");
1167 g_signal_connect(G_OBJECT(label_menuitem), "activate",
1168 G_CALLBACK(mainwindow_colorlabel_menu_item_activate_item_cb),
1170 gtk_widget_show(label_menuitem);
1172 menu = gtk_menu_new();
1173 gtk_menu_set_accel_group (GTK_MENU (menu),
1174 gtk_ui_manager_get_accel_group(mainwin->ui_manager));
1176 /* create sub items. for the menu item activation callback we pass the
1177 * index of label_colors[] as data parameter. for the None color we
1178 * pass an invalid (high) value. also we attach a data pointer so we
1179 * can always get back the Mainwindow pointer. */
1181 item = gtk_check_menu_item_new_with_label(_("None"));
1182 gtk_menu_shell_append(GTK_MENU_SHELL(menu), item);
1183 g_signal_connect(G_OBJECT(item), "activate",
1184 G_CALLBACK(mainwindow_colorlabel_menu_item_activate_cb),
1185 GUINT_TO_POINTER(0));
1186 g_object_set_data(G_OBJECT(item), "mainwin", mainwin);
1187 gtk_widget_show(item);
1189 accel_path = g_strdup_printf("<ClawsColorLabels>/None");
1190 gtk_menu_item_set_accel_path(GTK_MENU_ITEM(item), accel_path);
1192 gtk_accel_map_add_entry("<ClawsColorLabels>/None", GDK_KEY_0, GDK_CONTROL_MASK);
1193 item = gtk_menu_item_new();
1194 gtk_menu_shell_append(GTK_MENU_SHELL(menu), item);
1195 gtk_widget_show(item);
1197 /* create pixmap/label menu items */
1198 for (i = 0; i < N_COLOR_LABELS; i++) {
1199 item = colorlabel_create_check_color_menu_item(
1200 i, refresh, MAINWIN_COLORMENU);
1201 gtk_menu_shell_append(GTK_MENU_SHELL(menu), item);
1202 g_signal_connect(G_OBJECT(item), "activate",
1203 G_CALLBACK(mainwindow_colorlabel_menu_item_activate_cb),
1204 GUINT_TO_POINTER(i + 1));
1205 g_object_set_data(G_OBJECT(item), "mainwin",
1207 gtk_widget_show(item);
1208 accel_path = g_strdup_printf("<ClawsColorLabels>/%d", i+1);
1209 gtk_menu_item_set_accel_path(GTK_MENU_ITEM(item), accel_path);
1211 gtk_accel_map_add_entry(accel_path, GDK_KEY_1+i, GDK_CONTROL_MASK);
1213 g_signal_connect (gtk_ui_manager_get_accel_group(mainwin->ui_manager),
1214 "accel-changed", G_CALLBACK (mainwin_accel_changed_cb), item);
1218 gtk_widget_show(menu);
1219 gtk_menu_item_set_submenu(GTK_MENU_ITEM(label_menuitem), menu);
1220 mainwin->colorlabel_menu = menu;
1223 static void mainwindow_tags_menu_item_apply_tags_activate_cb(GtkWidget *widget,
1226 MainWindow *mainwin;
1228 mainwin = g_object_get_data(G_OBJECT(widget), "mainwin");
1229 cm_return_if_fail(mainwin != NULL);
1231 /* "dont_toggle" state set? */
1232 if (g_object_get_data(G_OBJECT(mainwin->tags_menu),
1236 tag_apply_open(summary_get_selection(mainwin->summaryview));
1239 static gint mainwin_tag_cmp_list(gconstpointer a, gconstpointer b)
1241 gint id_a = GPOINTER_TO_INT(a);
1242 gint id_b = GPOINTER_TO_INT(b);
1243 const gchar *tag_a = tags_get_tag(id_a);
1244 const gchar *tag_b = tags_get_tag(id_b);
1248 return tag_b == NULL ? 0:1;
1253 return g_utf8_collate(tag_a, tag_b);
1256 static void mainwindow_tags_menu_create(MainWindow *mainwin, gboolean refresh)
1258 GtkWidget *label_menuitem;
1261 GSList *cur = tags_get_list();
1262 GSList *orig = NULL;
1263 gboolean existing_tags = FALSE;
1265 cur = orig = g_slist_sort(cur, mainwin_tag_cmp_list);
1267 label_menuitem = gtk_ui_manager_get_widget(mainwin->ui_manager, "/Menu/Message/Tags");
1268 g_signal_connect(G_OBJECT(label_menuitem), "activate",
1269 G_CALLBACK(mainwindow_tags_menu_item_activate_item_cb),
1272 gtk_widget_show(label_menuitem);
1274 menu = gtk_menu_new();
1275 gtk_menu_set_accel_group (GTK_MENU (menu),
1276 gtk_ui_manager_get_accel_group(mainwin->ui_manager));
1278 /* create tags menu items */
1279 for (; cur; cur = cur->next) {
1280 gint id = GPOINTER_TO_INT(cur->data);
1281 const gchar *tag = tags_get_tag(id);
1283 item = gtk_check_menu_item_new_with_label(tag);
1284 gtk_menu_shell_append(GTK_MENU_SHELL(menu), item);
1285 g_signal_connect(G_OBJECT(item), "activate",
1286 G_CALLBACK(mainwindow_tags_menu_item_activate_cb),
1287 GINT_TO_POINTER(id));
1288 g_object_set_data(G_OBJECT(item), "mainwin",
1290 g_object_set_data(G_OBJECT(item), "tag_id",
1291 GINT_TO_POINTER(id));
1292 gtk_widget_show(item);
1293 accel_path = g_strconcat("<ClawsTags>/",tag, NULL);
1294 gtk_menu_item_set_accel_path(GTK_MENU_ITEM(item), accel_path);
1296 existing_tags = TRUE;
1298 if (existing_tags) {
1300 item = gtk_menu_item_new();
1301 gtk_menu_shell_append(GTK_MENU_SHELL(menu), item);
1302 gtk_widget_show(item);
1305 item = gtk_menu_item_new_with_label(_("Apply tags..."));
1306 gtk_menu_shell_append(GTK_MENU_SHELL(menu), item);
1307 g_signal_connect(G_OBJECT(item), "activate",
1308 G_CALLBACK(mainwindow_tags_menu_item_apply_tags_activate_cb),
1310 g_object_set_data(G_OBJECT(item), "mainwin",
1312 gtk_widget_show(item);
1313 accel_path = g_strdup_printf("<ClawsTags>/ApplyTags");
1314 gtk_menu_item_set_accel_path(GTK_MENU_ITEM(item), accel_path);
1316 gtk_accel_map_add_entry("<ClawsTags>/ApplyTags", GDK_KEY_T, GDK_CONTROL_MASK|GDK_SHIFT_MASK);
1318 gtk_widget_show(menu);
1319 gtk_menu_item_set_submenu(GTK_MENU_ITEM(label_menuitem), menu);
1320 mainwin->tags_menu = menu;
1322 #ifndef GENERIC_UMPC
1323 static gboolean warning_icon_pressed(GtkWidget *widget, GdkEventButton *evt,
1324 MainWindow *mainwindow)
1326 if (evt && evt->button == 1) {
1327 log_window_show_error(mainwindow->logwin);
1328 gtk_widget_hide(mainwindow->warning_btn);
1333 static gboolean warning_visi_notify(GtkWidget *widget,
1334 GdkEventVisibility *event,
1335 MainWindow *mainwindow)
1337 gdk_window_set_cursor(gtk_widget_get_window(mainwindow->warning_btn), hand_cursor);
1341 static gboolean warning_leave_notify(GtkWidget *widget,
1342 GdkEventCrossing *event,
1343 MainWindow *mainwindow)
1345 gdk_window_set_cursor(gtk_widget_get_window(mainwindow->warning_btn), NULL);
1349 static gboolean warning_enter_notify(GtkWidget *widget,
1350 GdkEventCrossing *event,
1351 MainWindow *mainwindow)
1353 gdk_window_set_cursor(gtk_widget_get_window(mainwindow->warning_btn), hand_cursor);
1357 void mainwindow_show_error(void)
1359 MainWindow *mainwin = mainwindow_get_mainwindow();
1360 gtk_widget_show(mainwin->warning_btn);
1363 void mainwindow_clear_error(MainWindow *mainwin)
1365 gtk_widget_hide(mainwin->warning_btn);
1368 #define BREAK_ON_MODIFIER_KEY() \
1369 if ((event->state & (GDK_MOD1_MASK|GDK_CONTROL_MASK)) != 0) break
1371 static gboolean mainwindow_key_pressed (GtkWidget *widget, GdkEventKey *event,
1374 MainWindow *mainwin = (MainWindow*) data;
1376 if (!mainwin || !event)
1379 if (quicksearch_has_focus(mainwin->summaryview->quicksearch))
1382 quicksearch_get_entry(mainwin->summaryview->quicksearch);
1384 g_signal_emit_by_name(entry, "key-press-event", event, &handled);
1390 switch (event->keyval) {
1391 case GDK_KEY_Q: /* Quit */
1392 BREAK_ON_MODIFIER_KEY();
1394 if (gtk_window_is_active(GTK_WINDOW(mainwin->window))) {
1395 app_exit_cb(NULL, mainwin);
1399 BREAK_ON_MODIFIER_KEY();
1400 if (gtk_window_is_active(GTK_WINDOW(mainwin->window))) {
1401 if (mainwin->folderview != NULL && mainwin->summaryview != NULL
1402 && ((!mainwin->summaryview->displayed
1403 && !mainwin->summaryview->selected)
1404 || (mainwin->summaryview->folder_item
1405 && mainwin->summaryview->folder_item->total_msgs == 0))) {
1406 g_signal_stop_emission_by_name(G_OBJECT(widget),
1408 folderview_select_next_with_flag(mainwin->folderview, MSG_UNREAD);
1418 #undef BREAK_ON_MODIFIER_KEY
1420 MainWindow *main_window_create()
1422 MainWindow *mainwin;
1426 GtkWidget *handlebox;
1427 GtkWidget *vbox_body;
1428 GtkWidget *menuitem;
1429 #ifndef GENERIC_UMPC
1430 GtkWidget *hbox_stat;
1431 GtkWidget *statusbar;
1432 GtkWidget *progressbar;
1433 GtkWidget *statuslabel;
1434 GtkWidget *ac_button;
1435 GtkWidget *ac_label;
1436 GtkWidget *online_pixmap;
1437 GtkWidget *offline_pixmap;
1438 GtkWidget *warning_icon;
1439 GtkWidget *warning_btn;
1441 GtkWidget *online_switch;
1442 GtkWidget *offline_switch;
1443 FolderView *folderview;
1444 SummaryView *summaryview;
1445 MessageView *messageview;
1446 GdkColormap *colormap;
1447 gboolean success[4];
1452 static GdkGeometry geometry;
1454 debug_print("Creating main window...\n");
1455 mainwin = g_new0(MainWindow, 1);
1458 window = GTK_WIDGET(gtkut_window_new(GTK_WINDOW_TOPLEVEL, "mainwindow"));
1459 gtk_window_set_title(GTK_WINDOW(window), PROG_VERSION);
1460 gtk_window_set_resizable(GTK_WINDOW(window), TRUE);
1462 prefs_common.layout_mode = SMALL_LAYOUT;
1464 if (!geometry.min_height) {
1465 geometry.min_width = 320;
1466 geometry.min_height = 200;
1468 gtk_window_set_geometry_hints(GTK_WINDOW(window), NULL, &geometry,
1471 g_signal_connect(G_OBJECT(window), "delete_event",
1472 G_CALLBACK(main_window_close_cb), mainwin);
1473 MANAGE_WINDOW_SIGNALS_CONNECT(window);
1474 g_signal_connect(G_OBJECT(window), "focus_in_event",
1475 G_CALLBACK(mainwindow_focus_in_event),
1477 g_signal_connect(G_OBJECT(window), "key_press_event",
1478 G_CALLBACK(mainwindow_key_pressed), mainwin);
1480 gtk_widget_realize(window);
1481 gtk_widget_add_events(window, GDK_KEY_PRESS_MASK|GDK_KEY_RELEASE_MASK);
1484 gtkut_widget_set_app_icon(window);
1486 vbox = gtk_vbox_new(FALSE, 0);
1487 gtk_widget_show(vbox);
1488 gtk_container_add(GTK_CONTAINER(window), vbox);
1492 mainwin->ui_manager = gtk_ui_manager_new();
1493 mainwin->action_group = cm_menu_create_action_group_full(mainwin->ui_manager,"Menu", mainwin_entries,
1494 G_N_ELEMENTS(mainwin_entries), (gpointer)mainwin);
1495 gtk_action_group_add_toggle_actions(mainwin->action_group, mainwin_toggle_entries,
1496 G_N_ELEMENTS(mainwin_toggle_entries), (gpointer)mainwin);
1497 gtk_action_group_add_radio_actions(mainwin->action_group, mainwin_showhide_radio_entries,
1498 G_N_ELEMENTS(mainwin_showhide_radio_entries), C_AUTO, G_CALLBACK(toggle_toolbar_cb), (gpointer)mainwin);
1499 #ifndef GENERIC_UMPC
1500 gtk_action_group_add_radio_actions(mainwin->action_group, mainwin_layout_radio_entries,
1501 G_N_ELEMENTS(mainwin_layout_radio_entries), C_AUTO, G_CALLBACK(set_layout_cb), (gpointer)mainwin);
1503 gtk_action_group_add_radio_actions(mainwin->action_group, mainwin_sort_radio_entries,
1504 G_N_ELEMENTS(mainwin_sort_radio_entries), C_AUTO, G_CALLBACK(sort_summary_cb), (gpointer)mainwin);
1505 gtk_action_group_add_radio_actions(mainwin->action_group, mainwin_sorttype_radio_entries,
1506 G_N_ELEMENTS(mainwin_sorttype_radio_entries), C_AUTO, G_CALLBACK(sort_summary_type_cb), (gpointer)mainwin);
1507 gtk_action_group_add_radio_actions(mainwin->action_group, mainwin_radio_enc_entries,
1508 G_N_ELEMENTS(mainwin_radio_enc_entries), C_AUTO, G_CALLBACK(set_charset_cb), (gpointer)mainwin);
1509 gtk_action_group_add_radio_actions(mainwin->action_group, mainwin_radio_dec_entries,
1510 G_N_ELEMENTS(mainwin_radio_dec_entries), C_AUTO, G_CALLBACK(set_decode_cb), (gpointer)mainwin);
1512 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/", "Menu", NULL, GTK_UI_MANAGER_MENUBAR)
1513 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu", "File", "File", GTK_UI_MANAGER_MENU)
1514 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu", "Edit", "Edit", GTK_UI_MANAGER_MENU)
1515 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu", "View", "View", GTK_UI_MANAGER_MENU)
1516 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu", "Message", "Message", GTK_UI_MANAGER_MENU)
1517 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu", "Tools", "Tools", GTK_UI_MANAGER_MENU)
1518 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu", "Configuration", "Configuration", GTK_UI_MANAGER_MENU)
1519 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu", "Help", "Help", GTK_UI_MANAGER_MENU)
1522 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/File", "AddMailbox", "File/AddMailbox", GTK_UI_MANAGER_MENU)
1523 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/File/AddMailbox", "MH", "File/AddMailbox/MH", GTK_UI_MANAGER_MENUITEM)
1524 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/File", "Separator1", "File/---", GTK_UI_MANAGER_SEPARATOR)
1525 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/File", "SortMailboxes", "File/SortMailboxes", GTK_UI_MANAGER_MENUITEM)
1526 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/File", "Separator2", "File/---", GTK_UI_MANAGER_SEPARATOR)
1527 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/File", "ImportMbox", "File/ImportMbox", GTK_UI_MANAGER_MENUITEM)
1528 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/File", "ExportMbox", "File/ExportMbox", GTK_UI_MANAGER_MENUITEM)
1529 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/File", "ExportSelMbox", "File/ExportSelMbox", GTK_UI_MANAGER_MENUITEM)
1530 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/File", "Separator3", "File/---", GTK_UI_MANAGER_SEPARATOR)
1531 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/File", "EmptyTrashes", "File/EmptyTrashes", GTK_UI_MANAGER_MENUITEM)
1532 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/File", "Separator4", "File/---", GTK_UI_MANAGER_SEPARATOR)
1533 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/File", "SaveAs", "File/SaveAs", GTK_UI_MANAGER_MENUITEM)
1534 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/File", "SavePartAs", "File/SavePartAs", GTK_UI_MANAGER_MENUITEM)
1535 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/File", "Separator5", "File/---", GTK_UI_MANAGER_SEPARATOR)
1536 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/File", "PageSetup", "File/PageSetup", GTK_UI_MANAGER_MENUITEM)
1537 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/File", "Print", "File/Print", GTK_UI_MANAGER_MENUITEM)
1538 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/File", "Separator6", "File/---", GTK_UI_MANAGER_SEPARATOR)
1539 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/File", "OfflineMode", "File/OfflineMode", GTK_UI_MANAGER_MENUITEM)
1540 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/File", "SynchroniseFolders", "File/SynchroniseFolders", GTK_UI_MANAGER_MENUITEM)
1541 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/File", "Separator7", "File/---", GTK_UI_MANAGER_SEPARATOR)
1542 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/File", "Exit", "File/Exit", GTK_UI_MANAGER_MENUITEM)
1545 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Edit", "Copy", "Edit/Copy", GTK_UI_MANAGER_MENUITEM)
1546 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Edit", "SelectAll", "Edit/SelectAll", GTK_UI_MANAGER_MENUITEM)
1547 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Edit", "SelectThread", "Edit/SelectThread", GTK_UI_MANAGER_MENUITEM)
1548 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Edit", "Separator1", "Edit/---", GTK_UI_MANAGER_SEPARATOR)
1549 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Edit", "Find", "Edit/Find", GTK_UI_MANAGER_MENUITEM)
1550 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Edit", "SearchFolder", "Edit/SearchFolder", GTK_UI_MANAGER_MENUITEM)
1551 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Edit", "QuickSearch", "Edit/QuickSearch", GTK_UI_MANAGER_MENUITEM)
1554 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View", "ShowHide", "View/ShowHide", GTK_UI_MANAGER_MENU)
1555 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/ShowHide", "MenuBar", "View/ShowHide/MenuBar", GTK_UI_MANAGER_MENUITEM)
1556 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/ShowHide", "Toolbar", "View/ShowHide/Toolbar", GTK_UI_MANAGER_MENU)
1557 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/ShowHide/Toolbar", "TextBelowIcon", "View/ShowHide/Toolbar/TextBelowIcon", GTK_UI_MANAGER_MENUITEM)
1558 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/ShowHide/Toolbar", "TextBesideIcon", "View/ShowHide/Toolbar/TextBesideIcon", GTK_UI_MANAGER_MENUITEM)
1559 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/ShowHide/Toolbar", "IconOnly", "View/ShowHide/Toolbar/IconOnly", GTK_UI_MANAGER_MENUITEM)
1560 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/ShowHide/Toolbar", "TextOnly", "View/ShowHide/Toolbar/TextOnly", GTK_UI_MANAGER_MENUITEM)
1561 #ifndef GENERIC_UMPC
1562 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/ShowHide/Toolbar", "Hide", "View/ShowHide/Toolbar/Hide", GTK_UI_MANAGER_MENUITEM)
1564 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/ShowHide", "MessageView", "View/ShowHide/MessageView", GTK_UI_MANAGER_MENUITEM)
1565 #ifndef GENERIC_UMPC
1566 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/ShowHide", "StatusBar", "View/ShowHide/StatusBar", GTK_UI_MANAGER_MENUITEM)
1568 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/ShowHide", "ColumnHeaders", "View/ShowHide/ColumnHeaders", GTK_UI_MANAGER_MENUITEM)
1569 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View", "SetColumns", "View/SetColumns", GTK_UI_MANAGER_MENU)
1570 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/SetColumns", "Folderlist", "View/SetColumns/Folderlist", GTK_UI_MANAGER_MENUITEM)
1571 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/SetColumns", "Messagelist", "View/SetColumns/Messagelist", GTK_UI_MANAGER_MENUITEM)
1572 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View", "Separator1", "View/---", GTK_UI_MANAGER_SEPARATOR)
1574 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View", "FullScreen", "View/FullScreen", GTK_UI_MANAGER_MENUITEM)
1575 #ifndef GENERIC_UMPC
1576 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View", "Layout", "View/Layout", GTK_UI_MANAGER_MENU)
1577 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Layout", "Standard", "View/Layout/Standard", GTK_UI_MANAGER_MENUITEM)
1578 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Layout", "ThreeColumns", "View/Layout/ThreeColumns", GTK_UI_MANAGER_MENUITEM)
1579 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Layout", "WideMessage", "View/Layout/WideMessage", GTK_UI_MANAGER_MENUITEM)
1580 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Layout", "WideMessageList", "View/Layout/WideMessageList", GTK_UI_MANAGER_MENUITEM)
1581 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Layout", "SmallScreen", "View/Layout/SmallScreen", GTK_UI_MANAGER_MENUITEM)
1582 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View", "Separator2", "View/---", GTK_UI_MANAGER_SEPARATOR)
1585 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View", "Sort", "View/Sort", GTK_UI_MANAGER_MENU)
1586 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Sort", "Number", "View/Sort/Number", GTK_UI_MANAGER_MENUITEM)
1587 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Sort", "Size", "View/Sort/Size", GTK_UI_MANAGER_MENUITEM)
1588 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Sort", "Date", "View/Sort/Date", GTK_UI_MANAGER_MENUITEM)
1589 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Sort", "ThreadDate", "View/Sort/ThreadDate", GTK_UI_MANAGER_MENUITEM)
1590 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Sort", "From", "View/Sort/From", GTK_UI_MANAGER_MENUITEM)
1591 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Sort", "To", "View/Sort/To", GTK_UI_MANAGER_MENUITEM)
1592 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Sort", "Subject", "View/Sort/Subject", GTK_UI_MANAGER_MENUITEM)
1593 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Sort", "Color", "View/Sort/Color", GTK_UI_MANAGER_MENUITEM)
1594 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Sort", "Tag", "View/Sort/Tag", GTK_UI_MANAGER_MENUITEM)
1595 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Sort", "Mark", "View/Sort/Mark", GTK_UI_MANAGER_MENUITEM)
1596 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Sort", "Status", "View/Sort/Status", GTK_UI_MANAGER_MENUITEM)
1597 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Sort", "Attachment", "View/Sort/Attachment", GTK_UI_MANAGER_MENUITEM)
1598 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Sort", "Score", "View/Sort/Score", GTK_UI_MANAGER_MENUITEM)
1599 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Sort", "Locked", "View/Sort/Locked", GTK_UI_MANAGER_MENUITEM)
1600 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Sort", "DontSort", "View/Sort/DontSort", GTK_UI_MANAGER_MENUITEM)
1601 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Sort", "Separator1", "View/Sort/---", GTK_UI_MANAGER_SEPARATOR)
1602 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Sort", "Ascending", "View/Sort/Ascending", GTK_UI_MANAGER_MENUITEM)
1603 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Sort", "Descending", "View/Sort/Descending", GTK_UI_MANAGER_MENUITEM)
1604 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Sort", "Separator2", "View/Sort/---", GTK_UI_MANAGER_SEPARATOR)
1605 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Sort", "AttractSubj", "View/Sort/AttractSubj", GTK_UI_MANAGER_MENUITEM)
1607 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View", "ThreadView", "View/ThreadView", GTK_UI_MANAGER_MENUITEM)
1608 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View", "ExpandThreads", "View/ExpandThreads", GTK_UI_MANAGER_MENUITEM)
1609 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View", "CollapseThreads", "View/CollapseThreads", GTK_UI_MANAGER_MENUITEM)
1610 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View", "HideReadThreads", "View/HideReadThreads", GTK_UI_MANAGER_MENUITEM)
1611 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View", "HideReadMessages", "View/HideReadMessages", GTK_UI_MANAGER_MENUITEM)
1612 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View", "HideDelMessages", "View/HideDelMessages", GTK_UI_MANAGER_MENUITEM)
1613 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View", "Separator3", "View/---", GTK_UI_MANAGER_SEPARATOR)
1615 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View", "Goto", "View/Goto", GTK_UI_MANAGER_MENU)
1616 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Goto", "Prev", "View/Goto/Prev", GTK_UI_MANAGER_MENUITEM)
1617 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Goto", "Next", "View/Goto/Next", GTK_UI_MANAGER_MENUITEM)
1618 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Goto", "Separator1", "View/Goto/---", GTK_UI_MANAGER_SEPARATOR)
1619 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Goto", "PrevUnread", "View/Goto/PrevUnread", GTK_UI_MANAGER_MENUITEM)
1620 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Goto", "NextUnread", "View/Goto/NextUnread", GTK_UI_MANAGER_MENUITEM)
1621 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Goto", "Separator2", "View/Goto/---", GTK_UI_MANAGER_SEPARATOR)
1622 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Goto", "PrevNew", "View/Goto/PrevNew", GTK_UI_MANAGER_MENUITEM)
1623 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Goto", "NextNew", "View/Goto/NextNew", GTK_UI_MANAGER_MENUITEM)
1624 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Goto", "Separator3", "View/Goto/---", GTK_UI_MANAGER_SEPARATOR)
1625 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Goto", "PrevMarked", "View/Goto/PrevMarked", GTK_UI_MANAGER_MENUITEM)
1626 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Goto", "NextMarked", "View/Goto/NextMarked", GTK_UI_MANAGER_MENUITEM)
1627 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Goto", "Separator4", "View/Goto/---", GTK_UI_MANAGER_SEPARATOR)
1628 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Goto", "PrevLabeled", "View/Goto/PrevLabeled", GTK_UI_MANAGER_MENUITEM)
1629 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Goto", "NextLabeled", "View/Goto/NextLabeled", GTK_UI_MANAGER_MENUITEM)
1630 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Goto", "Separator5", "View/Goto/---", GTK_UI_MANAGER_SEPARATOR)
1631 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Goto", "PrevHistory", "View/Goto/PrevHistory", GTK_UI_MANAGER_MENUITEM)
1632 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Goto", "NextHistory", "View/Goto/NextHistory", GTK_UI_MANAGER_MENUITEM)
1633 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Goto", "Separator6", "View/Goto/---", GTK_UI_MANAGER_SEPARATOR)
1634 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Goto", "ParentMessage", "View/Goto/ParentMessage", GTK_UI_MANAGER_MENUITEM)
1635 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Goto", "Separator7", "View/Goto/---", GTK_UI_MANAGER_SEPARATOR)
1636 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Goto", "NextUnreadFolder", "View/Goto/NextUnreadFolder", GTK_UI_MANAGER_MENUITEM)
1637 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Goto", "Folder", "View/Goto/Folder", GTK_UI_MANAGER_MENUITEM)
1638 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Goto", "Separator8", "View/Goto/---", GTK_UI_MANAGER_SEPARATOR)
1639 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Goto", "NextPart", "View/Goto/NextPart", GTK_UI_MANAGER_MENUITEM)
1640 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Goto", "PrevPart", "View/Goto/PrevPart", GTK_UI_MANAGER_MENUITEM)
1641 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View", "Scroll", "View/Scroll", GTK_UI_MANAGER_MENU)
1642 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Scroll", "PrevLine", "View/Scroll/PrevLine", GTK_UI_MANAGER_MENUITEM)
1643 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Scroll", "NextLine", "View/Scroll/NextLine", GTK_UI_MANAGER_MENUITEM)
1644 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Scroll", "PrevPage", "View/Scroll/PrevPage", GTK_UI_MANAGER_MENUITEM)
1645 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Scroll", "NextPage", "View/Scroll/NextPage", GTK_UI_MANAGER_MENUITEM)
1646 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View", "Separator4", "View/---", GTK_UI_MANAGER_SEPARATOR)
1648 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View", "Encoding", "View/Encoding", GTK_UI_MANAGER_MENU)
1649 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding", CS_AUTO, "View/Encoding/"CS_AUTO, GTK_UI_MANAGER_MENUITEM)
1650 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding", "Separator1", "View/Encoding/---", GTK_UI_MANAGER_SEPARATOR)
1651 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding", CS_US_ASCII, "View/Encoding/"CS_US_ASCII, GTK_UI_MANAGER_MENUITEM)
1652 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding", CS_UTF_8, "View/Encoding/"CS_UTF_8, GTK_UI_MANAGER_MENUITEM)
1653 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding", "Separator2", "View/Encoding/---", GTK_UI_MANAGER_SEPARATOR)
1655 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding", "Western", "View/Encoding/Western", GTK_UI_MANAGER_MENU)
1656 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)
1657 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)
1658 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding/Western", CS_WINDOWS_1252, "View/Encoding/Western/"CS_WINDOWS_1252, GTK_UI_MANAGER_MENUITEM)
1660 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding", CS_ISO_8859_2, "View/Encoding/"CS_ISO_8859_2, GTK_UI_MANAGER_MENUITEM)
1662 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding", "Baltic", "View/Encoding/Baltic", GTK_UI_MANAGER_MENU)
1663 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)
1664 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)
1666 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding", CS_ISO_8859_7, "View/Encoding/"CS_ISO_8859_7, GTK_UI_MANAGER_MENUITEM)
1668 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding", "Hebrew", "View/Encoding/Hebrew", GTK_UI_MANAGER_MENU)
1669 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)
1670 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding/Hebrew", CS_WINDOWS_1255, "View/Encoding/Hebrew/"CS_WINDOWS_1255, GTK_UI_MANAGER_MENUITEM)
1672 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding", "Arabic", "View/Encoding/Arabic", GTK_UI_MANAGER_MENU)
1673 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)
1674 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding/Arabic", CS_WINDOWS_1256, "View/Encoding/Arabic/"CS_WINDOWS_1256, GTK_UI_MANAGER_MENUITEM)
1676 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding", CS_ISO_8859_9, "View/Encoding/"CS_ISO_8859_9, GTK_UI_MANAGER_MENUITEM)
1678 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding", "Cyrillic", "View/Encoding/Cyrillic", GTK_UI_MANAGER_MENU)
1679 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)
1680 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding/Cyrillic", CS_KOI8_R, "View/Encoding/Cyrillic/"CS_KOI8_R, GTK_UI_MANAGER_MENUITEM)
1681 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding/Cyrillic", CS_MACCYR, "View/Encoding/Cyrillic/"CS_MACCYR, GTK_UI_MANAGER_MENUITEM)
1682 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding/Cyrillic", CS_KOI8_U, "View/Encoding/Cyrillic/"CS_KOI8_U, GTK_UI_MANAGER_MENUITEM)
1683 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding/Cyrillic", CS_WINDOWS_1251, "View/Encoding/Cyrillic/"CS_WINDOWS_1251, GTK_UI_MANAGER_MENUITEM)
1685 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding", "Japanese", "View/Encoding/Japanese", GTK_UI_MANAGER_MENU)
1686 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)
1687 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)
1688 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding/Japanese", CS_EUC_JP, "View/Encoding/Japanese/"CS_EUC_JP, GTK_UI_MANAGER_MENUITEM)
1689 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding/Japanese", CS_SHIFT_JIS, "View/Encoding/Japanese/"CS_SHIFT_JIS, GTK_UI_MANAGER_MENUITEM)
1691 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding", "Chinese", "View/Encoding/Chinese", GTK_UI_MANAGER_MENU)
1692 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding/Chinese", CS_GB18030, "View/Encoding/Chinese/"CS_GB18030, GTK_UI_MANAGER_MENUITEM)
1693 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding/Chinese", CS_GB2312, "View/Encoding/Chinese/"CS_GB2312, GTK_UI_MANAGER_MENUITEM)
1694 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding/Chinese", CS_GBK, "View/Encoding/Chinese/"CS_GBK, GTK_UI_MANAGER_MENUITEM)
1695 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding/Chinese", CS_BIG5, "View/Encoding/Chinese/"CS_BIG5, GTK_UI_MANAGER_MENUITEM)
1696 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding/Chinese", CS_EUC_TW, "View/Encoding/Chinese/"CS_EUC_TW, GTK_UI_MANAGER_MENUITEM)
1698 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding", "Korean", "View/Encoding/Korean", GTK_UI_MANAGER_MENU)
1699 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding/Korean", CS_EUC_KR, "View/Encoding/Korean/"CS_EUC_KR, GTK_UI_MANAGER_MENUITEM)
1700 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)
1702 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding", "Thai", "View/Encoding/Thai", GTK_UI_MANAGER_MENU)
1703 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding/Thai", CS_TIS_620, "View/Encoding/Thai/"CS_TIS_620, GTK_UI_MANAGER_MENUITEM)
1704 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding/Thai", CS_WINDOWS_874, "View/Encoding/Thai/"CS_WINDOWS_874, GTK_UI_MANAGER_MENUITEM)
1706 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View", "Decode", "View/Decode", GTK_UI_MANAGER_MENU)
1707 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Decode", "AutoDetect", "View/Decode/AutoDetect", GTK_UI_MANAGER_MENUITEM)
1708 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Decode", "Separator1", "View/Decode/---", GTK_UI_MANAGER_SEPARATOR)
1709 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Decode", "8bit", "View/Decode/8bit", GTK_UI_MANAGER_MENUITEM)
1710 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Decode", "QP", "View/Decode/QP", GTK_UI_MANAGER_MENUITEM)
1711 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Decode", "B64", "View/Decode/B64", GTK_UI_MANAGER_MENUITEM)
1712 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Decode", "Uuencode", "View/Decode/Uuencode", GTK_UI_MANAGER_MENUITEM)
1713 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View", "Separator5", "View/---", GTK_UI_MANAGER_SEPARATOR)
1715 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View", "OpenNewWindow", "View/OpenNewWindow", GTK_UI_MANAGER_MENUITEM)
1716 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View", "MessageSource", "View/MessageSource", GTK_UI_MANAGER_MENUITEM)
1717 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View", "AllHeaders", "View/AllHeaders", GTK_UI_MANAGER_MENUITEM)
1718 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View", "Quotes", "View/Quotes", GTK_UI_MANAGER_MENU)
1719 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Quotes", "CollapseAll", "View/Quotes/CollapseAll", GTK_UI_MANAGER_MENUITEM)
1720 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Quotes", "Collapse2", "View/Quotes/Collapse2", GTK_UI_MANAGER_MENUITEM)
1721 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Quotes", "Collapse3", "View/Quotes/Collapse3", GTK_UI_MANAGER_MENUITEM)
1722 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View", "Part", "View/Part", GTK_UI_MANAGER_MENU)
1723 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Part", "AsText", "View/Part/AsText", GTK_UI_MANAGER_MENUITEM)
1724 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Part", "Open", "View/Part/Open", GTK_UI_MANAGER_MENUITEM)
1726 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Part", "OpenWith", "View/Part/OpenWith", GTK_UI_MANAGER_MENUITEM)
1728 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View", "Separator8", "View/---", GTK_UI_MANAGER_SEPARATOR)
1729 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View", "UpdateSummary", "View/UpdateSummary", GTK_UI_MANAGER_MENUITEM)
1732 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message", "Receive", "Message/Receive", GTK_UI_MANAGER_MENU)
1733 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/Receive", "CurrentAccount", "Message/Receive/CurrentAccount", GTK_UI_MANAGER_MENUITEM)
1734 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/Receive", "AllAccounts", "Message/Receive/AllAccounts", GTK_UI_MANAGER_MENUITEM)
1735 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/Receive", "CancelReceiving", "Message/Receive/CancelReceiving", GTK_UI_MANAGER_MENUITEM)
1736 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/Receive", "Separator1", "Message/Receive/---", GTK_UI_MANAGER_SEPARATOR)
1737 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/Receive", "PlaceHolder", "Message/Receive/PlaceHolder", GTK_UI_MANAGER_MENUITEM)
1738 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message", "SendQueue", "Message/SendQueue", GTK_UI_MANAGER_MENUITEM)
1739 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message", "CancelSending", "Message/CancelSending", GTK_UI_MANAGER_MENUITEM)
1740 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message", "Separator1", "Message/---", GTK_UI_MANAGER_SEPARATOR)
1742 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message", "ComposeEmail", "Message/ComposeEmail", GTK_UI_MANAGER_MENUITEM)
1743 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message", "ComposeNews", "Message/ComposeNews", GTK_UI_MANAGER_MENUITEM)
1744 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message", "Reply", "Message/Reply", GTK_UI_MANAGER_MENUITEM)
1745 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message", "ReplyTo", "Message/ReplyTo", GTK_UI_MANAGER_MENU)
1746 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/ReplyTo", "All", "Message/ReplyTo/All", GTK_UI_MANAGER_MENUITEM)
1747 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/ReplyTo", "Sender", "Message/ReplyTo/Sender", GTK_UI_MANAGER_MENUITEM)
1748 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/ReplyTo", "List", "Message/ReplyTo/List", GTK_UI_MANAGER_MENUITEM)
1749 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message", "FollowupReply", "Message/FollowupReply", GTK_UI_MANAGER_MENUITEM)
1750 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message", "Separator2", "Message/---", GTK_UI_MANAGER_SEPARATOR)
1752 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message", "Forward", "Message/Forward", GTK_UI_MANAGER_MENUITEM)
1753 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message", "ForwardAtt", "Message/ForwardAtt", GTK_UI_MANAGER_MENUITEM)
1754 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message", "Redirect", "Message/Redirect", GTK_UI_MANAGER_MENUITEM)
1755 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message", "MailingList", "Message/MailingList", GTK_UI_MANAGER_MENU)
1756 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/MailingList", "Post", "Message/MailingList/Post", GTK_UI_MANAGER_MENU)
1757 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/MailingList", "Help", "Message/MailingList/Help", GTK_UI_MANAGER_MENU)
1758 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/MailingList", "Subscribe", "Message/MailingList/Subscribe", GTK_UI_MANAGER_MENU)
1759 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/MailingList", "Unsubscribe", "Message/MailingList/Unsubscribe", GTK_UI_MANAGER_MENU)
1760 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/MailingList", "ViewArchive", "Message/MailingList/ViewArchive", GTK_UI_MANAGER_MENU)
1761 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/MailingList", "ContactOwner", "Message/MailingList/ContactOwner", GTK_UI_MANAGER_MENU)
1762 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/MailingList/Post", "PlaceHolder", "Message/MailingList/Post/PlaceHolder", GTK_UI_MANAGER_MENUITEM)
1763 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/MailingList/Help", "PlaceHolder", "Message/MailingList/Help/PlaceHolder", GTK_UI_MANAGER_MENUITEM)
1764 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/MailingList/Subscribe", "PlaceHolder", "Message/MailingList/Subscribe/PlaceHolder", GTK_UI_MANAGER_MENUITEM)
1765 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/MailingList/Unsubscribe", "PlaceHolder", "Message/MailingList/Unsubscribe/PlaceHolder", GTK_UI_MANAGER_MENUITEM)
1766 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/MailingList/ViewArchive", "PlaceHolder", "Message/MailingList/ViewArchive/PlaceHolder", GTK_UI_MANAGER_MENUITEM)
1767 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/MailingList/ContactOwner", "PlaceHolder", "Message/MailingList/ContactOwner/PlaceHolder", GTK_UI_MANAGER_MENUITEM)
1768 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message", "Separator3", "Message/---", GTK_UI_MANAGER_SEPARATOR)
1770 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message", "Move", "Message/Move", GTK_UI_MANAGER_MENUITEM)
1771 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message", "Copy", "Message/Copy", GTK_UI_MANAGER_MENUITEM)
1772 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message", "Trash", "Message/Trash", GTK_UI_MANAGER_MENUITEM)
1773 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message", "Delete", "Message/Delete", GTK_UI_MANAGER_MENUITEM)
1774 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message", "TrashThread", "Message/TrashThread", GTK_UI_MANAGER_MENUITEM)
1775 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message", "DeleteThread", "Message/DeleteThread", GTK_UI_MANAGER_MENUITEM)
1776 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message", "CancelNews", "Message/CancelNews", GTK_UI_MANAGER_MENUITEM)
1777 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message", "Separator4", "Message/---", GTK_UI_MANAGER_SEPARATOR)
1779 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message", "Mark", "Message/Mark", GTK_UI_MANAGER_MENU)
1780 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/Mark", "Mark", "Message/Mark/Mark", GTK_UI_MANAGER_MENUITEM)
1781 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/Mark", "Unmark", "Message/Mark/Unmark", GTK_UI_MANAGER_MENUITEM)
1782 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/Mark", "Separator1", "Message/Mark/---", GTK_UI_MANAGER_SEPARATOR)
1783 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/Mark", "MarkRead", "Message/Mark/MarkRead", GTK_UI_MANAGER_MENUITEM)
1784 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/Mark", "MarkUnread", "Message/Mark/MarkUnread", GTK_UI_MANAGER_MENUITEM)
1785 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/Mark", "Separator2", "Message/Mark/---", GTK_UI_MANAGER_SEPARATOR)
1786 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/Mark", "MarkAllRead", "Message/Mark/MarkAllRead", GTK_UI_MANAGER_MENUITEM)
1787 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/Mark", "MarkAllUnread", "Message/Mark/MarkAllUnread", GTK_UI_MANAGER_MENUITEM)
1788 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/Mark", "Separator3", "Message/Mark/---", GTK_UI_MANAGER_SEPARATOR)
1789 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/Mark", "IgnoreThread", "Message/Mark/IgnoreThread", GTK_UI_MANAGER_MENUITEM)
1790 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/Mark", "UnignoreThread", "Message/Mark/UnignoreThread", GTK_UI_MANAGER_MENUITEM)
1791 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/Mark", "WatchThread", "Message/Mark/WatchThread", GTK_UI_MANAGER_MENUITEM)
1792 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/Mark", "UnwatchThread", "Message/Mark/UnwatchThread", GTK_UI_MANAGER_MENUITEM)
1793 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/Mark", "Separator4", "Message/Mark/---", GTK_UI_MANAGER_SEPARATOR)
1794 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/Mark", "MarkSpam", "Message/Mark/MarkSpam", GTK_UI_MANAGER_MENUITEM)
1795 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/Mark", "MarkHam", "Message/Mark/MarkHam", GTK_UI_MANAGER_MENUITEM)
1796 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/Mark", "Separator5", "Message/Mark/---", GTK_UI_MANAGER_SEPARATOR)
1797 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/Mark", "Lock", "Message/Mark/Lock", GTK_UI_MANAGER_MENUITEM)
1798 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/Mark", "Unlock", "Message/Mark/Unlock", GTK_UI_MANAGER_MENUITEM)
1799 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message", "ColorLabel", "Message/ColorLabel", GTK_UI_MANAGER_MENUITEM)
1800 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message", "Tags", "Message/Tags", GTK_UI_MANAGER_MENUITEM)
1801 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message", "Separator5", "Message/---", GTK_UI_MANAGER_SEPARATOR)
1803 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message", "Reedit", "Message/Reedit", GTK_UI_MANAGER_MENUITEM)
1804 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message", "Separator6", "Message/---", GTK_UI_MANAGER_SEPARATOR)
1805 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message", "CheckSignature", "Message/CheckSignature", GTK_UI_MANAGER_MENUITEM)
1808 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools", "AddressBook", "Tools/AddressBook", GTK_UI_MANAGER_MENUITEM)
1809 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools", "AddSenderToAB", "Tools/AddSenderToAB", GTK_UI_MANAGER_MENUITEM)
1810 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools", "CollectAddresses", "Tools/CollectAddresses", GTK_UI_MANAGER_MENU)
1811 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools/CollectAddresses", "FromFolder", "Tools/CollectAddresses/FromFolder", GTK_UI_MANAGER_MENUITEM)
1812 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools/CollectAddresses", "FromSelected", "Tools/CollectAddresses/FromSelected", GTK_UI_MANAGER_MENUITEM)
1813 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools", "Separator1", "Tools/---", GTK_UI_MANAGER_SEPARATOR)
1815 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools", "FilterFolder", "Tools/FilterFolder", GTK_UI_MANAGER_MENUITEM)
1816 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools", "FilterSelected", "Tools/FilterSelected", GTK_UI_MANAGER_MENUITEM)
1817 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools", "RunProcessing", "Tools/RunProcessing", GTK_UI_MANAGER_MENUITEM)
1818 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools", "CreateFilterRule", "Tools/CreateFilterRule", GTK_UI_MANAGER_MENU)
1819 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools/CreateFilterRule", "Automatically", "Tools/CreateFilterRule/Automatically", GTK_UI_MANAGER_MENUITEM)
1820 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools/CreateFilterRule", "ByFrom", "Tools/CreateFilterRule/ByFrom", GTK_UI_MANAGER_MENUITEM)
1821 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools/CreateFilterRule", "ByTo", "Tools/CreateFilterRule/ByTo", GTK_UI_MANAGER_MENUITEM)
1822 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools/CreateFilterRule", "BySubject", "Tools/CreateFilterRule/BySubject", GTK_UI_MANAGER_MENUITEM)
1824 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools", "CreateProcessingRule", "Tools/CreateProcessingRule", GTK_UI_MANAGER_MENU)
1825 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools/CreateProcessingRule", "Automatically", "Tools/CreateProcessingRule/Automatically", GTK_UI_MANAGER_MENUITEM)
1826 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools/CreateProcessingRule", "ByFrom", "Tools/CreateProcessingRule/ByFrom", GTK_UI_MANAGER_MENUITEM)
1827 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools/CreateProcessingRule", "ByTo", "Tools/CreateProcessingRule/ByTo", GTK_UI_MANAGER_MENUITEM)
1828 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools/CreateProcessingRule", "BySubject", "Tools/CreateProcessingRule/BySubject", GTK_UI_MANAGER_MENUITEM)
1829 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools", "Separator2", "Tools/---", GTK_UI_MANAGER_SEPARATOR)
1831 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools", "ListUrls", "Tools/ListUrls", GTK_UI_MANAGER_MENUITEM)
1832 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools", "Separator3", "Tools/---", GTK_UI_MANAGER_SEPARATOR)
1834 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools", "Actions", "Tools/Actions", GTK_UI_MANAGER_MENU)
1835 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools/Actions", "PlaceHolder", "Tools/Actions/PlaceHolder", GTK_UI_MANAGER_MENUITEM)
1836 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools", "Separator4", "Tools/---", GTK_UI_MANAGER_SEPARATOR)
1838 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools", "CheckNewMessages", "Tools/CheckNewMessages", GTK_UI_MANAGER_MENUITEM)
1839 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools", "DeleteDuplicates", "Tools/DeleteDuplicates", GTK_UI_MANAGER_MENU)
1840 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools/DeleteDuplicates", "SelFolder", "Tools/DeleteDuplicates/SelFolder", GTK_UI_MANAGER_MENUITEM)
1841 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools/DeleteDuplicates", "AllFolders", "Tools/DeleteDuplicates/AllFolders", GTK_UI_MANAGER_MENUITEM)
1842 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools", "Separator5", "Tools/---", GTK_UI_MANAGER_SEPARATOR)
1844 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools", "Execute", "Tools/Execute", GTK_UI_MANAGER_MENUITEM)
1845 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools", "Expunge", "Tools/Expunge", GTK_UI_MANAGER_MENUITEM)
1847 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools", "Separator6", "Tools/---", GTK_UI_MANAGER_SEPARATOR)
1848 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools", "SSLCertificates", "Tools/SSLCertificates", GTK_UI_MANAGER_MENUITEM)
1850 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools", "Separator7", "Tools/---", GTK_UI_MANAGER_SEPARATOR)
1851 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools", "FilteringLog", "Tools/FilteringLog", GTK_UI_MANAGER_MENUITEM)
1852 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools", "NetworkLog", "Tools/NetworkLog", GTK_UI_MANAGER_MENUITEM)
1854 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools", "DebugLog", "Tools/DebugLog", GTK_UI_MANAGER_MENUITEM)
1856 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools", "Separator8", "Tools/---", GTK_UI_MANAGER_SEPARATOR)
1857 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools", "ForgetSessionPasswords", "Tools/ForgetSessionPasswords", GTK_UI_MANAGER_MENUITEM)
1858 #ifndef PASSWORD_CRYPTO_OLD
1859 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools", "ForgetMasterPassphrase", "Tools/ForgetMasterPassphrase", GTK_UI_MANAGER_MENUITEM)
1861 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools", "Separator9", "Tools/---", GTK_UI_MANAGER_SEPARATOR)
1863 /* Configuration menu */
1864 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Configuration", "ChangeAccount", "Configuration/ChangeAccount", GTK_UI_MANAGER_MENU)
1865 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Configuration/ChangeAccount", "PlaceHolder", "Configuration/ChangeAccount/PlaceHolder", GTK_UI_MANAGER_MENUITEM)
1866 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Configuration", "AccountPrefs", "Configuration/AccountPrefs", GTK_UI_MANAGER_MENUITEM)
1867 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Configuration", "CreateAccount", "Configuration/CreateAccount", GTK_UI_MANAGER_MENUITEM)
1868 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Configuration", "EditAccounts", "Configuration/EditAccounts", GTK_UI_MANAGER_MENUITEM)
1869 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Configuration", "Separator1", "Configuration/---", GTK_UI_MANAGER_SEPARATOR)
1871 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Configuration", "Preferences", "Configuration/Preferences", GTK_UI_MANAGER_MENUITEM)
1872 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Configuration", "PreProcessing", "Configuration/PreProcessing", GTK_UI_MANAGER_MENUITEM)
1873 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Configuration", "PostProcessing", "Configuration/PostProcessing", GTK_UI_MANAGER_MENUITEM)
1874 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Configuration", "Filtering", "Configuration/Filtering", GTK_UI_MANAGER_MENUITEM)
1875 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Configuration", "Templates", "Configuration/Templates", GTK_UI_MANAGER_MENUITEM)
1876 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Configuration", "Actions", "Configuration/Actions", GTK_UI_MANAGER_MENUITEM)
1877 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Configuration", "Tags", "Configuration/Tags", GTK_UI_MANAGER_MENUITEM)
1879 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Configuration", "Separator2", "Configuration/---", GTK_UI_MANAGER_SEPARATOR)
1880 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Configuration", "Plugins", "Configuration/Plugins", GTK_UI_MANAGER_MENUITEM)
1883 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Help", "Manual", "Help/Manual", GTK_UI_MANAGER_MENUITEM)
1884 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Help", "FAQ", "Help/FAQ", GTK_UI_MANAGER_MENUITEM)
1885 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Help", "IconLegend", "Help/IconLegend", GTK_UI_MANAGER_MENUITEM)
1887 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Help", "Separator1", "Help/---", GTK_UI_MANAGER_SEPARATOR)
1888 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Help", "SetDefault", "Help/SetDefault", GTK_UI_MANAGER_MENUITEM)
1890 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Help", "Separator2", "Help/---", GTK_UI_MANAGER_SEPARATOR)
1891 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Help", "About", "Help/About", GTK_UI_MANAGER_MENUITEM)
1894 menubar = gtk_ui_manager_get_widget(mainwin->ui_manager, "/Menu");
1895 if (prefs_common.mainwin_menubar)
1896 gtk_widget_show_all(menubar);
1898 gtk_widget_hide(menubar);
1899 gtk_window_add_accel_group(GTK_WINDOW(window), gtk_ui_manager_get_accel_group(mainwin->ui_manager));
1901 /* Create a menu container for the different popup menus we
1902 * will be adding from other UI elements. */
1903 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/", "Menus", "Menus", GTK_UI_MANAGER_MENUBAR)
1905 gtk_box_pack_start(GTK_BOX(vbox), menubar, FALSE, TRUE, 0);
1907 if (prefs_common.toolbar_detachable) {
1908 handlebox = gtk_handle_box_new();
1909 gtk_widget_show(handlebox);
1910 gtk_box_pack_start(GTK_BOX(vbox), handlebox, FALSE, FALSE, 0);
1911 g_signal_connect(G_OBJECT(handlebox), "child_attached",
1912 G_CALLBACK(toolbar_child_attached), mainwin);
1913 g_signal_connect(G_OBJECT(handlebox), "child_detached",
1914 G_CALLBACK(toolbar_child_detached), mainwin);
1916 handlebox = gtk_hbox_new(FALSE, 0);
1917 gtk_widget_show(handlebox);
1918 gtk_box_pack_start(GTK_BOX(vbox), handlebox, FALSE, FALSE, 0);
1920 /* link window to mainwin->window to avoid gdk warnings */
1921 mainwin->window = window;
1922 mainwin_list = g_list_append(mainwin_list, mainwin);
1924 mainwin->toolbar = toolbar_create(TOOLBAR_MAIN,
1927 toolbar_set_learn_button
1931 /* vbox that contains body */
1932 vbox_body = gtk_vbox_new(FALSE, BORDER_WIDTH);
1933 gtk_widget_show(vbox_body);
1934 gtk_container_set_border_width(GTK_CONTAINER(vbox_body), BORDER_WIDTH);
1935 gtk_box_pack_start(GTK_BOX(vbox), vbox_body, TRUE, TRUE, 0);
1937 #ifndef GENERIC_UMPC
1938 hbox_stat = gtk_hbox_new(FALSE, 2);
1939 gtk_box_pack_end(GTK_BOX(vbox_body), hbox_stat, FALSE, FALSE, 0);
1941 warning_icon = gtk_image_new_from_stock
1942 (GTK_STOCK_DIALOG_WARNING, GTK_ICON_SIZE_SMALL_TOOLBAR);
1943 warning_btn = gtk_event_box_new();
1944 gtk_event_box_set_visible_window(GTK_EVENT_BOX(warning_btn), FALSE);
1946 mainwin->warning_btn = warning_btn;
1948 g_signal_connect(G_OBJECT(warning_btn), "button-press-event",
1949 G_CALLBACK(warning_icon_pressed),
1950 (gpointer) mainwin);
1951 g_signal_connect(G_OBJECT(warning_btn), "motion-notify-event",
1952 G_CALLBACK(warning_visi_notify), mainwin);
1953 g_signal_connect(G_OBJECT(warning_btn), "leave-notify-event",
1954 G_CALLBACK(warning_leave_notify), mainwin);
1955 g_signal_connect(G_OBJECT(warning_btn), "enter-notify-event",
1956 G_CALLBACK(warning_enter_notify), mainwin);
1958 gtk_container_add (GTK_CONTAINER(warning_btn), warning_icon);
1960 CLAWS_SET_TIP(warning_btn,
1961 _("Some error(s) happened. Click here to view log."));
1962 gtk_box_pack_start(GTK_BOX(hbox_stat), warning_btn, FALSE, FALSE, 0);
1964 statusbar = statusbar_create();
1965 gtk_box_pack_start(GTK_BOX(hbox_stat), statusbar, TRUE, TRUE, 0);
1967 progressbar = gtk_progress_bar_new();
1968 gtk_widget_set_size_request(progressbar, 120, 1);
1969 gtk_box_pack_start(GTK_BOX(hbox_stat), progressbar, FALSE, FALSE, 0);
1971 online_pixmap = stock_pixmap_widget(STOCK_PIXMAP_ONLINE);
1972 offline_pixmap = stock_pixmap_widget(STOCK_PIXMAP_OFFLINE);
1973 online_switch = gtk_button_new ();
1974 gtk_widget_set_can_focus(online_switch, FALSE);
1975 CLAWS_SET_TIP(online_switch,
1976 _("You are online. Click the icon to go offline"));
1977 offline_switch = gtk_button_new ();
1978 CLAWS_SET_TIP(offline_switch,
1979 _("You are offline. Click the icon to go online"));
1980 gtk_container_add (GTK_CONTAINER(online_switch), online_pixmap);
1981 gtk_button_set_relief (GTK_BUTTON(online_switch), GTK_RELIEF_NONE);
1982 g_signal_connect (G_OBJECT(online_switch), "clicked", G_CALLBACK(online_switch_clicked), mainwin);
1983 gtk_box_pack_start (GTK_BOX(hbox_stat), online_switch, FALSE, FALSE, 0);
1984 gtk_container_add (GTK_CONTAINER(offline_switch), offline_pixmap);
1985 gtk_button_set_relief (GTK_BUTTON(offline_switch), GTK_RELIEF_NONE);
1986 g_signal_connect (G_OBJECT(offline_switch), "clicked", G_CALLBACK(online_switch_clicked), mainwin);
1987 gtk_box_pack_start (GTK_BOX(hbox_stat), offline_switch, FALSE, FALSE, 0);
1989 statuslabel = gtk_label_new("");
1990 gtk_box_pack_start(GTK_BOX(hbox_stat), statuslabel, FALSE, FALSE, 0);
1992 ac_button = gtk_button_new();
1993 CLAWS_SET_TIP(ac_button, _("Select account"));
1994 gtk_widget_set_can_focus(ac_button, FALSE);
1995 gtk_widget_set_size_request(ac_button, -1, 0);
1996 gtk_box_pack_end(GTK_BOX(hbox_stat), ac_button, FALSE, FALSE, 0);
1997 g_signal_connect(G_OBJECT(ac_button), "button_press_event",
1998 G_CALLBACK(ac_label_button_pressed), mainwin);
2000 ac_label = gtk_label_new("");
2001 gtk_container_add(GTK_CONTAINER(ac_button), ac_label);
2003 gtk_widget_show_all(hbox_stat);
2005 gtk_widget_hide(offline_switch);
2006 gtk_widget_hide(progressbar);
2007 gtk_widget_hide(warning_btn);
2009 online_switch = gtk_button_new ();
2010 offline_switch = gtk_button_new ();
2011 g_signal_connect (G_OBJECT(online_switch), "clicked", G_CALLBACK(online_switch_clicked), mainwin);
2012 g_signal_connect (G_OBJECT(offline_switch), "clicked", G_CALLBACK(online_switch_clicked), mainwin);
2015 mainwin->folderview = folderview = folderview_create(mainwin);
2016 mainwin->summaryview = summaryview = summary_create(mainwin);
2017 mainwin->messageview = messageview = messageview_create(mainwin);
2019 /* init log instances data before creating log views */
2020 set_log_title(LOG_PROTOCOL, _("Network log"));
2021 set_log_prefs(LOG_PROTOCOL,
2022 &prefs_common.logwin_width,
2023 &prefs_common.logwin_height);
2024 set_log_title(LOG_DEBUG_FILTERING, _("Filtering/Processing debug log"));
2025 set_log_prefs(LOG_DEBUG_FILTERING,
2026 &prefs_common.filtering_debugwin_width,
2027 &prefs_common.filtering_debugwin_height);
2029 /* setup log windows */
2030 mainwin->logwin = log_window_create(LOG_PROTOCOL);
2031 log_window_init(mainwin->logwin);
2033 mainwin->filtering_debugwin = log_window_create(LOG_DEBUG_FILTERING);
2034 log_window_set_clipping(mainwin->logwin,
2035 prefs_common.cliplog,
2036 prefs_common.loglength);
2038 log_window_init(mainwin->filtering_debugwin);
2039 log_window_set_clipping(mainwin->filtering_debugwin,
2040 prefs_common.filtering_debug_cliplog,
2041 prefs_common.filtering_debug_loglength);
2042 if (prefs_common.enable_filtering_debug)
2043 log_message(LOG_DEBUG_FILTERING, _("filtering log enabled\n"));
2045 log_message(LOG_DEBUG_FILTERING, _("filtering log disabled\n"));
2047 folderview->mainwin = mainwin;
2048 folderview->summaryview = summaryview;
2050 summaryview->mainwin = mainwin;
2051 summaryview->folderview = folderview;
2052 summaryview->messageview = messageview;
2053 summaryview->window = window;
2055 mainwin->vbox = vbox;
2056 mainwin->menubar = menubar;
2057 mainwin->handlebox = handlebox;
2058 mainwin->vbox_body = vbox_body;
2059 mainwin->online_switch = online_switch;
2060 mainwin->offline_switch = offline_switch;
2061 #ifndef GENERIC_UMPC
2062 messageview->statusbar = statusbar;
2063 mainwin->statusbar = statusbar;
2064 mainwin->hbox_stat = hbox_stat;
2065 mainwin->progressbar = progressbar;
2066 mainwin->statuslabel = statuslabel;
2067 mainwin->online_pixmap = online_pixmap;
2068 mainwin->offline_pixmap = offline_pixmap;
2069 mainwin->ac_button = ac_button;
2070 mainwin->ac_label = ac_label;
2071 /* set context IDs for status bar */
2072 mainwin->mainwin_cid = gtk_statusbar_get_context_id
2073 (GTK_STATUSBAR(statusbar), "Main Window");
2074 mainwin->folderview_cid = gtk_statusbar_get_context_id
2075 (GTK_STATUSBAR(statusbar), "Folder View");
2076 mainwin->summaryview_cid = gtk_statusbar_get_context_id
2077 (GTK_STATUSBAR(statusbar), "Summary View");
2078 mainwin->messageview_cid = gtk_statusbar_get_context_id
2079 (GTK_STATUSBAR(statusbar), "Message View");
2080 messageview->statusbar_cid = mainwin->messageview_cid;
2083 messageview->statusbar = NULL;
2084 mainwin->statusbar = NULL;
2085 mainwin->hbox_stat = NULL;
2086 /* mainwin->progressbar is set in toolbar.c */
2087 mainwin->statuslabel = NULL;
2088 mainwin->online_pixmap = NULL;
2089 mainwin->offline_pixmap = NULL;
2090 mainwin->ac_button = NULL;
2091 mainwin->ac_label = NULL;
2094 /* allocate colors for summary view and folder view */
2095 summaryview->color_marked.red = summaryview->color_marked.green = 0;
2096 summaryview->color_marked.blue = (guint16)65535;
2098 summaryview->color_dim.red = summaryview->color_dim.green =
2099 summaryview->color_dim.blue = COLOR_DIM;
2101 gtkut_convert_int_to_gdk_color(prefs_common.color[COL_NEW],
2102 &folderview->color_new);
2104 gtkut_convert_int_to_gdk_color(prefs_common.color[COL_TGT_FOLDER],
2105 &folderview->color_op);
2107 color[0] = summaryview->color_marked;
2108 color[1] = summaryview->color_dim;
2109 color[2] = folderview->color_new;
2110 color[3] = folderview->color_op;
2112 colormap = gdk_drawable_get_colormap(gtk_widget_get_window(window));
2113 gdk_colormap_alloc_colors(colormap, color, 4, FALSE, TRUE, success);
2114 for (i = 0; i < 4; i++) {
2115 if (success[i] == FALSE)
2116 g_warning("MainWindow: color allocation %d failed", i);
2119 debug_print("done.\n");
2121 messageview->visible = prefs_common.msgview_visible;
2123 main_window_set_widgets(mainwin, prefs_common.layout_mode);
2125 g_signal_connect(G_OBJECT(window), "size_allocate",
2126 G_CALLBACK(main_window_size_allocate_cb),
2129 /* set menu items */
2130 cm_toggle_menu_set_active_full(mainwin->ui_manager, "Menu/View/Encoding/"CS_AUTO, TRUE);
2133 switch (prefs_common.toolbar_style) {
2135 menuitem = gtk_ui_manager_get_widget(mainwin->ui_manager, "/Menu/View/ShowHide/Toolbar/Hide");
2138 menuitem = gtk_ui_manager_get_widget(mainwin->ui_manager, "/Menu/View/ShowHide/Toolbar/IconOnly");
2141 menuitem = gtk_ui_manager_get_widget(mainwin->ui_manager, "/Menu/View/ShowHide/Toolbar/TextOnly");
2144 menuitem = gtk_ui_manager_get_widget(mainwin->ui_manager, "/Menu/View/ShowHide/Toolbar/TextBelowIcon");
2146 case TOOLBAR_BOTH_HORIZ:
2147 menuitem = gtk_ui_manager_get_widget(mainwin->ui_manager, "/Menu/View/ShowHide/Toolbar/TextBesideIcon");
2149 gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menuitem), TRUE);
2151 toolbar_set_style(mainwin->toolbar->toolbar,
2153 prefs_common.toolbar_style);
2154 #ifndef GENERIC_UMPC
2155 gtk_widget_hide(mainwin->hbox_stat);
2156 menuitem = gtk_ui_manager_get_widget(mainwin->ui_manager, "/Menu/View/ShowHide/StatusBar");
2157 gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menuitem),
2158 prefs_common.show_statusbar);
2160 menuitem = gtk_ui_manager_get_widget(mainwin->ui_manager, "/Menu/View/ShowHide/ColumnHeaders");
2161 gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menuitem),
2162 prefs_common.show_col_headers);
2163 /* set account selection menu */
2164 ac_menu = gtk_ui_manager_get_widget(mainwin->ui_manager, "/Menu/Configuration/ChangeAccount");
2165 mainwin->ac_menu = ac_menu;
2167 toolbar_main_set_sensitive(mainwin);
2169 /* create actions menu */
2170 main_window_update_actions_menu(mainwin);
2172 main_create_mailing_list_menu (mainwin, NULL);
2174 /* attach accel groups to main window */
2175 #define ADD_MENU_ACCEL_GROUP_TO_WINDOW(menu,win) \
2176 gtk_window_add_accel_group \
2178 gtk_ui_manager_get_accel_group(gtkut_ui_manager()));
2180 ADD_MENU_ACCEL_GROUP_TO_WINDOW(summaryview->popupmenu, mainwin->window);
2182 g_signal_connect(G_OBJECT(window), "window_state_event",
2183 G_CALLBACK(mainwindow_state_event_cb), mainwin);
2184 g_signal_connect(G_OBJECT(window), "visibility_notify_event",
2185 G_CALLBACK(mainwindow_visibility_event_cb), mainwin);
2186 gtk_widget_add_events(GTK_WIDGET(window), GDK_VISIBILITY_NOTIFY_MASK);
2188 if (prefs_common.layout_mode == VERTICAL_LAYOUT ||
2189 prefs_common.layout_mode == SMALL_LAYOUT) {
2190 summary_relayout(mainwin->summaryview);
2192 summary_update_unread(mainwin->summaryview, NULL);
2194 /* initialize views */
2195 folderview_init(folderview);
2196 summary_init(summaryview);
2197 messageview_init(messageview);
2199 sslcertwindow_register_hook();
2201 mainwin->lock_count = 0;
2202 mainwin->menu_lock_count = 0;
2203 mainwin->cursor_count = 0;
2205 mainwin->progressindicator_hook =
2206 hooks_register_hook(PROGRESSINDICATOR_HOOKLIST, mainwindow_progressindicator_hook, mainwin);
2209 watch_cursor = gdk_cursor_new(GDK_WATCH);
2211 hand_cursor = gdk_cursor_new(GDK_HAND2);
2213 /* init work_offline */
2214 if (prefs_common.work_offline)
2215 online_switch_clicked (GTK_BUTTON(online_switch), mainwin);
2217 mainwindow_colorlabel_menu_create(mainwin, FALSE);
2218 mainwindow_tags_menu_create(mainwin, FALSE);
2220 if (prefs_common.mainwin_fullscreen) {
2221 cm_toggle_menu_set_active_full(mainwin->ui_manager,
2222 "Menu/View/FullScreen",
2225 if (prefs_common.mainwin_menubar)
2226 cm_toggle_menu_set_active_full(mainwin->ui_manager,"Menu/View/ShowHide/MenuBar", TRUE);
2231 void main_window_update_actions_menu(MainWindow *mainwin)
2233 action_update_mainwin_menu(mainwin->ui_manager, "/Menu/Tools/Actions", mainwin);
2236 void main_window_cursor_wait(MainWindow *mainwin)
2239 if (mainwin->cursor_count == 0) {
2240 gdk_window_set_cursor(gtk_widget_get_window(mainwin->window), watch_cursor);
2241 textview_cursor_wait(mainwin->messageview->mimeview->textview);
2244 mainwin->cursor_count++;
2249 void main_window_cursor_normal(MainWindow *mainwin)
2251 if (mainwin->cursor_count)
2252 mainwin->cursor_count--;
2254 if (mainwin->cursor_count == 0) {
2255 gdk_window_set_cursor(gtk_widget_get_window(mainwin->window), NULL);
2256 textview_cursor_normal(mainwin->messageview->mimeview->textview);
2261 /* lock / unlock the user-interface */
2262 void main_window_lock(MainWindow *mainwin)
2264 if (mainwin->lock_count == 0 && mainwin->ac_button)
2265 gtk_widget_set_sensitive(mainwin->ac_button, FALSE);
2267 mainwin->lock_count++;
2269 main_window_set_menu_sensitive(mainwin);
2270 toolbar_main_set_sensitive(mainwin);
2273 void main_window_unlock(MainWindow *mainwin)
2275 if (mainwin->lock_count)
2276 mainwin->lock_count--;
2278 main_window_set_menu_sensitive(mainwin);
2279 toolbar_main_set_sensitive(mainwin);
2281 if (mainwin->lock_count == 0 && mainwin->ac_button)
2282 gtk_widget_set_sensitive(mainwin->ac_button, TRUE);
2285 static void main_window_menu_callback_block(MainWindow *mainwin)
2287 mainwin->menu_lock_count++;
2290 static void main_window_menu_callback_unblock(MainWindow *mainwin)
2292 if (mainwin->menu_lock_count)
2293 mainwin->menu_lock_count--;
2296 static guint prefs_tag = 0;
2298 void main_window_reflect_prefs_all(void)
2300 main_window_reflect_prefs_all_real(FALSE);
2303 static gboolean reflect_prefs_timeout_cb(gpointer data)
2305 gboolean pixmap_theme_changed = GPOINTER_TO_INT(data);
2307 MainWindow *mainwin;
2308 #ifndef GENERIC_UMPC
2311 for (cur = mainwin_list; cur != NULL; cur = cur->next) {
2312 mainwin = (MainWindow *)cur->data;
2314 main_window_show_cur_account(mainwin);
2315 main_window_set_menu_sensitive(mainwin);
2316 toolbar_main_set_sensitive(mainwin);
2319 if (pixmap_theme_changed) {
2320 toolbar_update(TOOLBAR_MAIN, mainwin);
2321 messageview_reflect_prefs_pixmap_theme();
2322 compose_reflect_prefs_pixmap_theme();
2323 folderview_reinit_fonts(mainwin->folderview);
2324 summary_reflect_prefs_pixmap_theme(mainwin->summaryview);
2325 foldersel_reflect_prefs_pixmap_theme();
2326 #ifndef USE_ALT_ADDRBOOK
2327 addressbook_reflect_prefs_pixmap_theme();
2329 #ifndef GENERIC_UMPC
2330 pixmap = stock_pixmap_widget(STOCK_PIXMAP_ONLINE);
2331 gtk_container_remove(GTK_CONTAINER(mainwin->online_switch),
2332 mainwin->online_pixmap);
2333 gtk_container_add (GTK_CONTAINER(mainwin->online_switch), pixmap);
2334 gtk_widget_show(pixmap);
2335 mainwin->online_pixmap = pixmap;
2336 pixmap = stock_pixmap_widget(STOCK_PIXMAP_OFFLINE);
2337 gtk_container_remove(GTK_CONTAINER(mainwin->offline_switch),
2338 mainwin->offline_pixmap);
2339 gtk_container_add (GTK_CONTAINER(mainwin->offline_switch), pixmap);
2340 gtk_widget_show(pixmap);
2341 mainwin->offline_pixmap = pixmap;
2343 hooks_invoke(THEME_CHANGED_HOOKLIST, NULL);
2346 headerview_set_font(mainwin->messageview->headerview);
2347 headerview_set_visibility(mainwin->messageview->headerview,
2348 prefs_common.display_header_pane);
2349 textview_reflect_prefs(mainwin->messageview->mimeview->textview);
2350 folderview_reflect_prefs();
2351 summary_reflect_prefs();
2352 #ifndef GENERIC_UMPC
2353 summary_redisplay_msg(mainwin->summaryview);
2355 if (prefs_common.layout_mode == SMALL_LAYOUT) {
2356 if (mainwin->in_folder) {
2357 mainwindow_enter_folder(mainwin);
2359 mainwindow_exit_folder(mainwin);
2367 void main_window_reflect_prefs_all_now(void)
2369 reflect_prefs_timeout_cb(GINT_TO_POINTER(FALSE));
2372 void main_window_reflect_prefs_custom_colors(MainWindow *mainwin)
2375 GList *children, *cur;
2377 /* re-create colorlabel submenu */
2378 menu = GTK_MENU_SHELL(mainwin->colorlabel_menu);
2379 cm_return_if_fail(menu != NULL);
2381 /* clear items. get item pointers. */
2382 children = gtk_container_get_children(GTK_CONTAINER(menu));
2383 for (cur = children; cur != NULL && cur->data != NULL; cur = cur->next) {
2384 g_signal_handlers_disconnect_matched
2385 (gtk_ui_manager_get_accel_group(mainwin->ui_manager),
2386 G_SIGNAL_MATCH_DATA|G_SIGNAL_MATCH_FUNC,
2387 0, 0, NULL, mainwin_accel_changed_cb, cur->data);
2388 gtk_menu_item_set_submenu(GTK_MENU_ITEM(cur->data), NULL);
2390 g_list_free(children);
2391 mainwindow_colorlabel_menu_create(mainwin, TRUE);
2392 summary_reflect_prefs_custom_colors(mainwin->summaryview);
2393 folderview_reinit_fonts(mainwin->folderview);
2396 static gint tags_tag = 0;
2397 static gboolean main_window_reflect_tags_changes_real(gpointer data)
2400 GList *children, *cur;
2401 MainWindow *mainwin = (MainWindow *)data;
2403 if (summary_is_locked(mainwin->summaryview)) {
2406 /* re-create tags submenu */
2407 menu = GTK_MENU_SHELL(mainwin->tags_menu);
2408 cm_return_val_if_fail(menu != NULL, FALSE);
2410 /* clear items. get item pointers. */
2411 children = gtk_container_get_children(GTK_CONTAINER(menu));
2412 for (cur = children; cur != NULL && cur->data != NULL; cur = cur->next) {
2413 gtk_menu_item_set_submenu(GTK_MENU_ITEM(cur->data), NULL);
2415 g_list_free(children);
2416 mainwindow_tags_menu_create(mainwin, TRUE);
2417 summary_reflect_tags_changes(mainwin->summaryview);
2423 void main_window_reflect_tags_changes(MainWindow *mainwin)
2425 if (tags_tag == 0) {
2426 tags_tag = g_timeout_add(100, main_window_reflect_tags_changes_real,
2431 void main_window_reflect_prefs_all_real(gboolean pixmap_theme_changed)
2433 if (prefs_tag == 0) {
2434 prefs_tag = g_timeout_add(100, reflect_prefs_timeout_cb,
2435 GINT_TO_POINTER(pixmap_theme_changed));
2439 void main_window_set_summary_column(void)
2442 MainWindow *mainwin;
2444 for (cur = mainwin_list; cur != NULL; cur = cur->next) {
2445 mainwin = (MainWindow *)cur->data;
2446 summary_set_column_order(mainwin->summaryview);
2450 void main_window_set_folder_column(void)
2453 MainWindow *mainwin;
2455 for (cur = mainwin_list; cur != NULL; cur = cur->next) {
2456 mainwin = (MainWindow *)cur->data;
2457 folderview_set_column_order(mainwin->folderview);
2461 static void main_window_set_account_selector_menu(MainWindow *mainwin,
2462 GList *account_list)
2465 GtkWidget *menuitem;
2466 PrefsAccount *ac_prefs;
2470 menu = gtk_menu_new();
2471 gtk_menu_set_accel_group (GTK_MENU (menu),
2472 gtk_ui_manager_get_accel_group(mainwin->ui_manager));
2474 for (cur_ac = account_list; cur_ac != NULL; cur_ac = cur_ac->next) {
2475 ac_prefs = (PrefsAccount *)cur_ac->data;
2477 menuitem = gtk_menu_item_new_with_label
2478 (ac_prefs->account_name
2479 ? ac_prefs->account_name : _("Untitled"));
2480 gtk_widget_show(menuitem);
2481 gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem);
2482 g_signal_connect(G_OBJECT(menuitem), "activate",
2483 G_CALLBACK(account_selector_menu_cb),
2485 accel_path = g_strconcat("<Actions>/Menu/Configuration/ChangeAccount/",(ac_prefs->account_name
2486 ? ac_prefs->account_name : _("Untitled")), NULL );
2487 gtk_menu_item_set_accel_path(GTK_MENU_ITEM(menuitem), accel_path);
2490 gtk_menu_item_set_submenu(GTK_MENU_ITEM(mainwin->ac_menu), menu);
2493 static void main_window_set_account_receive_menu(MainWindow *mainwin,
2494 GList *account_list)
2496 GList *children, *child;
2498 GtkWidget *menuitem;
2499 PrefsAccount *ac_prefs;
2501 menu = gtk_menu_item_get_submenu(GTK_MENU_ITEM(
2502 gtk_ui_manager_get_widget(mainwin->ui_manager, "/Menu/Message/Receive")));
2504 /* search for separator */
2505 children = gtk_container_get_children(GTK_CONTAINER(menu));
2506 for (child = children; child != NULL; child = child->next) {
2507 if (child->data == gtk_ui_manager_get_widget(mainwin->ui_manager, "/Menu/Message/Receive/Separator1")) {
2508 child = child->next;
2513 /* destroy all previous menu item */
2514 while (child != NULL) {
2515 gtk_widget_destroy(GTK_WIDGET(child->data));
2516 child = child->next;
2519 g_list_free(children);
2521 for (child = account_list; child != NULL; child = child->next) {
2522 ac_prefs = (PrefsAccount *)child->data;
2524 if (ac_prefs->protocol == A_NONE)
2527 menuitem = gtk_menu_item_new_with_label
2528 (ac_prefs->account_name ? ac_prefs->account_name
2530 gtk_widget_show(menuitem);
2531 gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem);
2532 g_signal_connect(G_OBJECT(menuitem), "activate",
2533 G_CALLBACK(account_receive_menu_cb),
2538 static void main_window_set_toolbar_combo_receive_menu(MainWindow *mainwin,
2539 GList *account_list)
2542 GtkWidget *menuitem;
2543 PrefsAccount *ac_prefs;
2544 GtkWidget *menu = NULL;
2546 if (mainwin->toolbar->getall_btn == NULL) /* button doesn't exist */
2549 menu = gtk_menu_tool_button_get_menu(GTK_MENU_TOOL_BUTTON(mainwin->toolbar->getall_btn));
2551 gtk_widget_destroy(menu);
2552 menu = gtk_menu_new();
2554 for (cur_ac = account_list; cur_ac != NULL; cur_ac = cur_ac->next) {
2555 ac_prefs = (PrefsAccount *)cur_ac->data;
2557 if (ac_prefs->protocol == A_NONE)
2560 menuitem = gtk_menu_item_new_with_label
2561 (ac_prefs->account_name
2562 ? ac_prefs->account_name : _("Untitled"));
2563 gtk_widget_show(menuitem);
2564 gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem);
2565 g_signal_connect(G_OBJECT(menuitem), "activate",
2566 G_CALLBACK(account_receive_menu_cb),
2569 gtk_menu_tool_button_set_menu(GTK_MENU_TOOL_BUTTON(mainwin->toolbar->getall_btn), menu);
2572 static void main_window_set_toolbar_combo_compose_menu(MainWindow *mainwin,
2573 GList *account_list)
2575 #ifndef GENERIC_UMPC
2577 GtkWidget *menuitem;
2578 PrefsAccount *ac_prefs;
2579 GtkWidget *menu = NULL;
2581 if (mainwin->toolbar->compose_mail_btn == NULL) /* button doesn't exist */
2584 menu = gtk_menu_tool_button_get_menu(GTK_MENU_TOOL_BUTTON(mainwin->toolbar->compose_mail_btn));
2586 gtk_widget_destroy(menu);
2587 menu = gtk_menu_new();
2589 for (cur_ac = account_list; cur_ac != NULL; cur_ac = cur_ac->next) {
2590 ac_prefs = (PrefsAccount *)cur_ac->data;
2592 menuitem = gtk_menu_item_new_with_label
2593 (ac_prefs->account_name
2594 ? ac_prefs->account_name : _("Untitled"));
2595 gtk_widget_show(menuitem);
2596 gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem);
2597 g_signal_connect(G_OBJECT(menuitem), "activate",
2598 G_CALLBACK(account_compose_menu_cb),
2601 gtk_menu_tool_button_set_menu(GTK_MENU_TOOL_BUTTON(mainwin->toolbar->compose_mail_btn), menu);
2605 void main_window_set_account_menu(GList *account_list)
2608 MainWindow *mainwin;
2610 for (cur = mainwin_list; cur != NULL; cur = cur->next) {
2611 mainwin = (MainWindow *)cur->data;
2612 main_window_set_account_selector_menu(mainwin, account_list);
2613 main_window_set_account_receive_menu(mainwin, account_list);
2614 main_window_set_toolbar_combo_receive_menu(mainwin, account_list);
2615 main_window_set_toolbar_combo_compose_menu(mainwin, account_list);
2617 hooks_invoke(ACCOUNT_LIST_CHANGED_HOOKLIST, NULL);
2620 void main_window_set_account_menu_only_toolbar(GList *account_list)
2623 MainWindow *mainwin;
2625 for (cur = mainwin_list; cur != NULL; cur = cur->next) {
2626 mainwin = (MainWindow *)cur->data;
2627 main_window_set_toolbar_combo_receive_menu(mainwin, account_list);
2628 main_window_set_toolbar_combo_compose_menu(mainwin, account_list);
2632 static void main_window_show_cur_account(MainWindow *mainwin)
2637 ac_name = g_strdup(cur_account
2638 ? (cur_account->account_name
2639 ? cur_account->account_name : _("Untitled"))
2643 buf = g_strdup_printf("%s - %s", ac_name, PROG_VERSION);
2645 buf = g_strdup(PROG_VERSION);
2646 gtk_window_set_title(GTK_WINDOW(mainwin->window), buf);
2649 if (mainwin->ac_label)
2650 gtk_label_set_text(GTK_LABEL(mainwin->ac_label), ac_name);
2651 if (mainwin->ac_button)
2652 gtk_widget_queue_resize(mainwin->ac_button);
2656 #ifndef GENERIC_UMPC
2657 static void main_window_separation_change(MainWindow *mainwin, LayoutType layout_mode)
2659 GtkWidget *folder_wid = GTK_WIDGET_PTR(mainwin->folderview);
2660 GtkWidget *summary_wid = GTK_WIDGET_PTR(mainwin->summaryview);
2661 GtkWidget *message_wid = mainwin->messageview->vbox;
2663 if (layout_mode == prefs_common.layout_mode)
2666 debug_print("Changing window separation type from %d to %d\n",
2667 prefs_common.layout_mode, layout_mode);
2669 /* remove widgets from those containers */
2670 g_object_ref(folder_wid);
2671 g_object_ref(summary_wid);
2672 g_object_ref(message_wid);
2673 gtkut_container_remove
2674 (GTK_CONTAINER(gtk_widget_get_parent(folder_wid)), folder_wid);
2675 gtkut_container_remove
2676 (GTK_CONTAINER(gtk_widget_get_parent(summary_wid)), summary_wid);
2677 gtkut_container_remove
2678 (GTK_CONTAINER(gtk_widget_get_parent(message_wid)), message_wid);
2680 gtk_widget_hide(mainwin->window);
2681 main_window_set_widgets(mainwin, layout_mode);
2682 gtk_widget_show(mainwin->window);
2684 g_object_unref(folder_wid);
2685 g_object_unref(summary_wid);
2686 g_object_unref(message_wid);
2689 void mainwindow_reset_paned(GtkPaned *paned)
2693 if (gtk_paned_get_child1(GTK_PANED(paned)))
2694 gtk_widget_show(gtk_paned_get_child1(GTK_PANED(paned)));
2695 if (gtk_paned_get_child2(GTK_PANED(paned)))
2696 gtk_widget_show(gtk_paned_get_child2(GTK_PANED(paned)));
2699 g_object_get (G_OBJECT(paned),
2702 g_object_get (G_OBJECT(paned),
2706 gtk_paned_set_position(GTK_PANED(paned), mid);
2709 static void mainwin_paned_show_first(GtkPaned *paned)
2712 g_object_get (G_OBJECT(paned),
2716 if (gtk_paned_get_child1(GTK_PANED(paned)))
2717 gtk_widget_show(gtk_paned_get_child1(GTK_PANED(paned)));
2718 if (gtk_paned_get_child2(GTK_PANED(paned)))
2719 gtk_widget_hide(gtk_paned_get_child2(GTK_PANED(paned)));
2720 gtk_paned_set_position(GTK_PANED(paned), max);
2723 static void mainwin_paned_show_last(GtkPaned *paned)
2726 g_object_get (G_OBJECT(paned),
2730 if (gtk_paned_get_child1(GTK_PANED(paned)))
2731 gtk_widget_hide(gtk_paned_get_child1(GTK_PANED(paned)));
2732 if (gtk_paned_get_child2(GTK_PANED(paned)))
2733 gtk_widget_show(gtk_paned_get_child2(GTK_PANED(paned)));
2734 gtk_paned_set_position(GTK_PANED(paned), min);
2737 void main_window_toggle_message_view(MainWindow *mainwin)
2739 SummaryView *summaryview = mainwin->summaryview;
2740 GtkWidget *ppaned = NULL;
2741 GtkWidget *container = NULL;
2743 switch (prefs_common.layout_mode) {
2745 case VERTICAL_LAYOUT:
2747 ppaned = mainwin->vpaned;
2748 container = mainwin->hpaned;
2749 if (gtk_widget_get_parent(ppaned) != NULL) {
2750 mainwin->messageview->visible = FALSE;
2751 summaryview->displayed = NULL;
2752 g_object_ref(ppaned);
2753 gtkut_container_remove(GTK_CONTAINER(container), ppaned);
2754 gtk_widget_reparent(GTK_WIDGET_PTR(summaryview), container);
2756 mainwin->messageview->visible = TRUE;
2757 gtk_widget_reparent(GTK_WIDGET_PTR(summaryview), ppaned);
2758 gtk_container_add(GTK_CONTAINER(container), ppaned);
2759 g_object_unref(ppaned);
2763 container = mainwin->vpaned;
2764 if (gtk_widget_get_parent(mainwin->messageview->vbox) != NULL) {
2765 mainwin->messageview->visible = FALSE;
2766 summaryview->displayed = NULL;
2767 g_object_ref(mainwin->messageview->vbox);
2768 gtkut_container_remove(GTK_CONTAINER(container), mainwin->messageview->vbox);
2770 mainwin->messageview->visible = TRUE;
2771 gtk_container_add(GTK_CONTAINER(container), mainwin->messageview->vbox);
2772 g_object_unref(mainwin->messageview->vbox);
2775 case WIDE_MSGLIST_LAYOUT:
2776 g_warning("can't hide messageview in this wide msglist layout");
2780 if (messageview_is_visible(mainwin->messageview))
2781 gtk_arrow_set(GTK_ARROW(mainwin->summaryview->toggle_arrow),
2782 GTK_ARROW_DOWN, GTK_SHADOW_OUT);
2784 gtk_arrow_set(GTK_ARROW(mainwin->summaryview->toggle_arrow),
2785 GTK_ARROW_UP, GTK_SHADOW_OUT);
2787 if (mainwin->messageview->visible == FALSE)
2788 messageview_clear(mainwin->messageview);
2790 main_window_set_menu_sensitive(mainwin);
2792 prefs_common.msgview_visible = mainwin->messageview->visible;
2794 if (messageview_is_visible(mainwin->messageview)) {
2795 gtk_widget_queue_resize(mainwin->hpaned);
2796 gtk_widget_queue_resize(mainwin->vpaned);
2798 summary_grab_focus(summaryview);
2799 if (!summary_is_list(summaryview)) {
2800 summary_show(summaryview, summaryview->folder_item);
2804 void main_window_get_size(MainWindow *mainwin)
2806 GtkAllocation allocation;
2808 if (mainwin_list == NULL || mainwin->messageview == NULL) {
2809 debug_print("called after messageview "
2810 "has been deallocated!\n");
2814 if (prefs_common.mainwin_fullscreen) {
2815 debug_print("mainwin in full screen state. "
2816 "Keeping original settings\n");
2819 gtk_widget_get_allocation(GTK_WIDGET_PTR(mainwin->summaryview), &allocation);
2820 if (allocation.width > 1 && allocation.height > 1 && !prefs_common.mainwin_fullscreen) {
2821 prefs_common.summaryview_width = allocation.width;
2823 if (messageview_is_visible(mainwin->messageview))
2824 prefs_common.summaryview_height = allocation.height;
2826 prefs_common.mainview_width = allocation.width;
2829 gtk_widget_get_allocation(mainwin->window, &allocation);
2830 if (allocation.width > 1 && allocation.height > 1 &&
2831 !prefs_common.mainwin_maximised && !prefs_common.mainwin_fullscreen) {
2832 prefs_common.mainview_height = allocation.height;
2833 prefs_common.mainwin_width = allocation.width;
2834 prefs_common.mainwin_height = allocation.height;
2837 gtk_widget_get_allocation(GTK_WIDGET_PTR(mainwin->folderview), &allocation);
2838 if (allocation.width > 1 && allocation.height > 1 &&
2839 !prefs_common.mainwin_fullscreen) {
2840 prefs_common.folderview_width = allocation.width;
2841 prefs_common.folderview_height = allocation.height;
2844 gtk_widget_get_allocation(GTK_WIDGET_PTR(mainwin->messageview), &allocation);
2845 if (allocation.width > 1 && allocation.height > 1 &&
2846 !prefs_common.mainwin_fullscreen) {
2847 prefs_common.msgview_width = allocation.width;
2848 prefs_common.msgview_height = allocation.height;
2851 /* debug_print("summaryview size: %d x %d\n",
2852 prefs_common.summaryview_width,
2853 prefs_common.summaryview_height);
2854 debug_print("folderview size: %d x %d\n",
2855 prefs_common.folderview_width,
2856 prefs_common.folderview_height);
2857 debug_print("messageview size: %d x %d\n",
2858 prefs_common.msgview_width,
2859 prefs_common.msgview_height); */
2862 void main_window_get_position(MainWindow *mainwin)
2866 if (prefs_common.mainwin_maximised || prefs_common.mainwin_fullscreen)
2869 gtkut_widget_get_uposition(mainwin->window, &x, &y);
2871 prefs_common.mainview_x = x;
2872 prefs_common.mainview_y = y;
2873 prefs_common.mainwin_x = x;
2874 prefs_common.mainwin_y = y;
2876 debug_print("main window position: %d, %d\n", x, y);
2879 void main_window_progress_on(MainWindow *mainwin)
2881 gtk_progress_bar_set_text(GTK_PROGRESS_BAR(mainwin->progressbar), "");
2884 void main_window_progress_off(MainWindow *mainwin)
2886 gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(mainwin->progressbar), 0.0);
2887 gtk_progress_bar_set_text(GTK_PROGRESS_BAR(mainwin->progressbar), "");
2890 gboolean main_window_empty_trash(MainWindow *mainwin, gboolean confirm, gboolean for_quit)
2892 if (confirm && procmsg_have_trashed_mails_fast()) {
2896 val = alertpanel(_("Empty trash"),
2897 _("Delete all messages in trash folders?"),
2898 GTK_STOCK_NO, GTK_STOCK_YES, _("Don't quit"),
2901 val = alertpanel(_("Empty trash"),
2902 _("Delete all messages in trash folders?"),
2903 GTK_STOCK_NO, GTK_STOCK_YES, NULL,
2905 if (val == G_ALERTALTERNATE) {
2906 debug_print("will empty trash\n");
2907 } else if (val == G_ALERTDEFAULT) {
2908 debug_print("will not empty trash\n");
2911 return FALSE; /* cancel exit */
2913 manage_window_focus_in(mainwin->window, NULL, NULL);
2916 procmsg_empty_all_trash();
2918 if (mainwin->summaryview->folder_item &&
2919 mainwin->summaryview->folder_item->stype == F_TRASH)
2920 folderview_grab_focus(mainwin->folderview);
2924 static void main_window_add_mailbox(MainWindow *mainwin)
2929 path = input_dialog(_("Add mailbox"),
2930 _("Input the location of the mailbox.\n"
2931 "The location can be either the full path or relative to the \n"
2933 "If the location of an existing mailbox is specified, it will be\n"
2934 "scanned automatically."),
2937 if (folder_find_from_path(path)) {
2938 alertpanel_error(_("The mailbox '%s' already exists."), path);
2942 folder = folder_new(folder_get_class_from_string("mh"),
2943 !strcmp(path, "Mail") ? _("Mailbox") :
2944 g_path_get_basename(path), path);
2947 if (folder->klass->create_tree(folder) < 0) {
2948 alertpanel_error(_("Creation of the mailbox failed.\n"
2949 "Maybe some files already exist, or you don't have the permission to write there."));
2950 folder_destroy(folder);
2955 folder_set_ui_func(folder, scan_tree_func, mainwin);
2956 folder_scan_tree(folder, TRUE);
2957 folder_set_ui_func(folder, NULL, NULL);
2960 SensitiveCondMask main_window_get_current_state(MainWindow *mainwin)
2962 SensitiveCondMask state = 0;
2963 SummarySelection selection;
2964 FolderItem *item = mainwin->summaryview->folder_item;
2965 GList *account_list = account_get_list();
2968 selection = summary_get_selection_type(mainwin->summaryview);
2970 #define UPDATE_STATE(...) \
2972 state |= main_window_get_mask(__VA_ARGS__, -1); \
2975 if (mainwin->lock_count == 0 && !claws_is_starting())
2976 UPDATE_STATE(M_UNLOCKED);
2977 if (selection != SUMMARY_NONE && selection != SUMMARY_SELECTED_NONE)
2978 UPDATE_STATE(M_MSG_EXIST);
2979 if (item && item->path && folder_item_parent(item) && !item->no_select) {
2980 UPDATE_STATE(M_EXEC);
2981 /* if (item->folder->type != F_NEWS) */
2982 UPDATE_STATE(M_ALLOW_DELETE);
2984 if (prefs_common.immediate_exec == 0
2985 && mainwin->lock_count == 0)
2986 UPDATE_STATE(M_DELAY_EXEC);
2988 if ((selection == SUMMARY_NONE && item->hide_read_msgs)
2989 || selection != SUMMARY_NONE)
2990 UPDATE_STATE(M_HIDE_READ_MSG);
2992 if ((selection == SUMMARY_NONE && item->hide_read_threads)
2993 || selection != SUMMARY_NONE)
2994 UPDATE_STATE(M_HIDE_READ_THREADS);
2996 if (mainwin->summaryview->threaded)
2997 UPDATE_STATE(M_THREADED);
2999 UPDATE_STATE(M_UNTHREADED);
3000 if (selection == SUMMARY_SELECTED_SINGLE ||
3001 selection == SUMMARY_SELECTED_MULTIPLE)
3002 UPDATE_STATE(M_TARGET_EXIST);
3003 if (selection == SUMMARY_SELECTED_SINGLE)
3004 UPDATE_STATE(M_SINGLE_TARGET_EXIST);
3005 if (mainwin->summaryview->folder_item &&
3006 mainwin->summaryview->folder_item->folder->klass->type == F_NEWS)
3007 UPDATE_STATE(M_NEWS);
3009 UPDATE_STATE(M_NOT_NEWS);
3010 if (mainwin->summaryview->folder_item &&
3011 (mainwin->summaryview->folder_item->stype != F_TRASH ||
3012 !folder_has_parent_of_type(mainwin->summaryview->folder_item, F_TRASH)))
3013 UPDATE_STATE(M_NOT_TRASH);
3015 if (mainwin->summaryview->folder_item
3016 && mainwin->summaryview->folder_item->stype != F_DRAFT)
3017 UPDATE_STATE(M_NOT_DRAFT);
3019 if (prefs_common.actions_list && g_slist_length(prefs_common.actions_list))
3020 UPDATE_STATE(M_ACTIONS_EXIST);
3022 tmp = tags_get_list();
3023 if (tmp && g_slist_length(tmp))
3024 UPDATE_STATE(M_TAGS_EXIST);
3027 if (procmsg_have_queued_mails_fast() && !procmsg_is_sending())
3028 UPDATE_STATE(M_HAVE_QUEUED_MAILS);
3030 if (selection == SUMMARY_SELECTED_SINGLE &&
3032 (folder_has_parent_of_type(item, F_DRAFT) ||
3033 folder_has_parent_of_type(item, F_OUTBOX) ||
3034 folder_has_parent_of_type(item, F_QUEUE))))
3035 UPDATE_STATE(M_ALLOW_REEDIT);
3037 UPDATE_STATE(M_HAVE_ACCOUNT);
3039 if (cur_account && cur_account->protocol != A_NONE)
3040 UPDATE_STATE(M_HAVE_RETRIEVABLE_ACCOUNT);
3042 if (any_folder_want_synchronise())
3043 UPDATE_STATE(M_WANT_SYNC);
3045 if (item && item->prefs->processing && selection != SUMMARY_NONE)
3046 UPDATE_STATE(M_HAVE_PROCESSING);
3048 if (g_list_length(account_list) > 1)
3049 UPDATE_STATE(M_HAVE_MULTI_ACCOUNT);
3051 for (account_list = account_get_list(); account_list != NULL; account_list = account_list->next) {
3052 if (((PrefsAccount*)account_list->data)->protocol != A_NONE) {
3053 UPDATE_STATE(M_HAVE_ANY_RETRIEVABLE_ACCOUNT);
3058 for (account_list = account_get_list(); account_list != NULL; account_list = account_list->next) {
3059 if (((PrefsAccount*)account_list->data)->protocol == A_NNTP) {
3060 UPDATE_STATE(M_HAVE_NEWS_ACCOUNT);
3065 if (procmsg_spam_can_learn() &&
3066 (mainwin->summaryview->folder_item &&
3067 mainwin->summaryview->folder_item->folder->klass->type != F_UNKNOWN &&
3068 mainwin->summaryview->folder_item->folder->klass->type != F_NEWS)) {
3069 UPDATE_STATE(M_CAN_LEARN_SPAM);
3072 if (mainwin->summaryview->folder_item) {
3073 UPDATE_STATE(M_FOLDER_SELECTED);
3076 if (inc_is_active())
3077 UPDATE_STATE(M_INC_ACTIVE);
3078 if (imap_cancel_all_enabled())
3079 UPDATE_STATE(M_INC_ACTIVE);
3081 if (send_is_active() | procmsg_is_sending())
3082 UPDATE_STATE(M_SEND_ACTIVE);
3084 if (mainwin->summaryview->deleted > 0)
3085 UPDATE_STATE(M_DELETED_EXISTS);
3087 if (mainwin->summaryview->deleted > 0 ||
3088 mainwin->summaryview->moved > 0 ||
3089 mainwin->summaryview->copied > 0)
3090 UPDATE_STATE(M_DELAY_EXEC);
3092 if (summary_is_list(mainwin->summaryview))
3093 UPDATE_STATE(M_SUMMARY_ISLIST);
3095 if (prefs_common.layout_mode != SMALL_LAYOUT || mainwin->in_folder)
3096 UPDATE_STATE(M_IN_MSGLIST);
3098 for (account_list = account_get_list(); account_list != NULL; account_list = account_list->next) {
3099 PrefsAccount *account = account_list->data;
3100 if (account->session_passwd || account->session_smtp_passwd) {
3101 UPDATE_STATE(M_SESSION_PASSWORDS);
3106 #ifndef PASSWORD_CRYPTO_OLD
3107 if (master_passphrase_is_entered()) {
3108 UPDATE_STATE(M_MASTER_PASSPHRASE);
3117 SensitiveCondMask main_window_get_mask(SensitiveCond cond, ...)
3121 SensitiveCondMask value;
3122 static SensitiveCondMask SensitiveCond_table[M_MAX_RESERVED];
3123 static gboolean first_time = TRUE;
3126 for (i = 0; i < M_MAX_RESERVED; i++)
3127 SensitiveCond_table[i] = (SensitiveCondMask) ((SensitiveCondMask)1 << i);
3133 va_start(args, cond);
3134 for (i = (gint) cond; i >= 0; i = va_arg(args, gint))
3135 value |= SensitiveCond_table[i];
3141 void main_window_set_menu_sensitive(MainWindow *mainwin)
3143 SensitiveCondMask state;
3145 SummaryView *summaryview;
3148 GList *children, *cur_item;
3150 gboolean mimepart_selected = FALSE;
3152 #define N_ENTRIES 88
3155 SensitiveCondMask cond;
3159 #define FILL_TABLE(entry_str, ...) \
3161 entry[i].entry = (const gchar *) entry_str; entry[i++].cond = main_window_get_mask(__VA_ARGS__, -1); \
3164 FILL_TABLE("Menu/File/SaveAs", M_TARGET_EXIST);
3165 FILL_TABLE("Menu/File/SavePartAs", M_SINGLE_TARGET_EXIST);
3166 FILL_TABLE("Menu/File/Print", M_TARGET_EXIST);
3167 FILL_TABLE("Menu/File/SynchroniseFolders", M_WANT_SYNC);
3168 FILL_TABLE("Menu/File/Exit", M_UNLOCKED);
3170 FILL_TABLE("Menu/Edit/SelectThread", M_TARGET_EXIST, M_SUMMARY_ISLIST);
3171 FILL_TABLE("Menu/Edit/Find", M_SINGLE_TARGET_EXIST);
3172 FILL_TABLE("Menu/Edit/QuickSearch", M_IN_MSGLIST);
3173 FILL_TABLE("Menu/Edit/SearchFolder", M_TARGET_EXIST, M_SUMMARY_ISLIST);
3175 FILL_TABLE("Menu/View/SetColumns/Folderlist", M_UNLOCKED, M_SUMMARY_ISLIST);
3176 FILL_TABLE("Menu/View/Sort", M_EXEC, M_SUMMARY_ISLIST);
3177 FILL_TABLE("Menu/View/ThreadView", M_EXEC, M_SUMMARY_ISLIST);
3178 FILL_TABLE("Menu/View/ExpandThreads", M_MSG_EXIST, M_SUMMARY_ISLIST);
3179 FILL_TABLE("Menu/View/CollapseThreads", M_MSG_EXIST, M_SUMMARY_ISLIST);
3180 FILL_TABLE("Menu/View/HideReadThreads", M_HIDE_READ_THREADS, M_SUMMARY_ISLIST, M_NOT_DRAFT);
3181 FILL_TABLE("Menu/View/HideReadMessages", M_HIDE_READ_MSG, M_SUMMARY_ISLIST, M_NOT_DRAFT);
3182 FILL_TABLE("Menu/View/HideDelMessages", M_SUMMARY_ISLIST, M_NOT_DRAFT);
3183 FILL_TABLE("Menu/View/Goto/Prev", M_MSG_EXIST);
3184 FILL_TABLE("Menu/View/Goto/Next", M_MSG_EXIST);
3185 FILL_TABLE("Menu/View/Goto/PrevUnread", M_MSG_EXIST);
3186 FILL_TABLE("Menu/View/Goto/NextUnread", M_MSG_EXIST);
3187 FILL_TABLE("Menu/View/Goto/PrevNew", M_MSG_EXIST);
3188 FILL_TABLE("Menu/View/Goto/NextNew", M_MSG_EXIST);
3189 FILL_TABLE("Menu/View/Goto/PrevMarked", M_MSG_EXIST);
3190 FILL_TABLE("Menu/View/Goto/NextMarked", M_MSG_EXIST);
3191 FILL_TABLE("Menu/View/Goto/PrevLabeled", M_MSG_EXIST);
3192 FILL_TABLE("Menu/View/Goto/NextLabeled", M_MSG_EXIST);
3193 FILL_TABLE("Menu/View/Goto/ParentMessage", M_SINGLE_TARGET_EXIST);
3194 FILL_TABLE("Menu/View/Goto/NextPart", M_SINGLE_TARGET_EXIST);
3195 FILL_TABLE("Menu/View/Goto/PrevPart", M_SINGLE_TARGET_EXIST);
3196 FILL_TABLE("Menu/View/OpenNewWindow", M_SINGLE_TARGET_EXIST);
3197 FILL_TABLE("Menu/View/MessageSource", M_SINGLE_TARGET_EXIST);
3198 FILL_TABLE("Menu/View/Part", M_SINGLE_TARGET_EXIST);
3199 FILL_TABLE("Menu/View/AllHeaders", M_SINGLE_TARGET_EXIST);
3200 FILL_TABLE("Menu/View/Quotes", M_SINGLE_TARGET_EXIST);
3202 FILL_TABLE("Menu/Message/Receive/CurrentAccount", M_HAVE_ACCOUNT, M_UNLOCKED, M_HAVE_RETRIEVABLE_ACCOUNT);
3203 FILL_TABLE("Menu/Message/Receive/AllAccounts", M_HAVE_ACCOUNT, M_UNLOCKED, M_HAVE_ANY_RETRIEVABLE_ACCOUNT);
3204 FILL_TABLE("Menu/Message/Receive/CancelReceiving", M_INC_ACTIVE);
3205 FILL_TABLE("Menu/Message/SendQueue", M_HAVE_ACCOUNT, M_HAVE_QUEUED_MAILS);
3206 FILL_TABLE("Menu/Message/CancelSending", M_SEND_ACTIVE);
3207 FILL_TABLE("Menu/Message/ComposeEmail", M_HAVE_ACCOUNT);
3208 FILL_TABLE("Menu/Message/ComposeNews", M_HAVE_NEWS_ACCOUNT);
3209 FILL_TABLE("Menu/Message/Reply", M_HAVE_ACCOUNT, M_TARGET_EXIST, M_SUMMARY_ISLIST);
3210 FILL_TABLE("Menu/Message/ReplyTo", M_HAVE_ACCOUNT, M_TARGET_EXIST, M_SUMMARY_ISLIST);
3211 FILL_TABLE("Menu/Message/FollowupReply", M_HAVE_ACCOUNT, M_TARGET_EXIST, M_NEWS, M_SUMMARY_ISLIST);
3212 FILL_TABLE("Menu/Message/Forward", M_HAVE_ACCOUNT, M_TARGET_EXIST, M_SUMMARY_ISLIST);
3213 FILL_TABLE("Menu/Message/ForwardAtt", M_HAVE_ACCOUNT, M_TARGET_EXIST, M_SUMMARY_ISLIST);
3214 FILL_TABLE("Menu/Message/Redirect", M_HAVE_ACCOUNT, M_TARGET_EXIST, M_SUMMARY_ISLIST);
3215 FILL_TABLE("Menu/Message/Move", M_TARGET_EXIST, M_ALLOW_DELETE, M_NOT_NEWS);
3216 FILL_TABLE("Menu/Message/Copy", M_TARGET_EXIST, M_EXEC);
3217 FILL_TABLE("Menu/Message/Trash", M_TARGET_EXIST, M_ALLOW_DELETE, M_NOT_NEWS, M_NOT_TRASH);
3218 FILL_TABLE("Menu/Message/Delete", M_TARGET_EXIST, M_ALLOW_DELETE);
3219 FILL_TABLE("Menu/Message/TrashThread", M_TARGET_EXIST, M_SUMMARY_ISLIST);
3220 FILL_TABLE("Menu/Message/DeleteThread", M_TARGET_EXIST, M_SUMMARY_ISLIST);
3221 FILL_TABLE("Menu/Message/CancelNews", M_TARGET_EXIST, M_ALLOW_DELETE, M_NEWS);
3222 FILL_TABLE("Menu/Message/Mark", M_TARGET_EXIST, M_SUMMARY_ISLIST);
3223 FILL_TABLE("Menu/Message/Mark/MarkSpam", M_TARGET_EXIST, M_CAN_LEARN_SPAM);
3224 FILL_TABLE("Menu/Message/Mark/MarkHam", M_TARGET_EXIST, M_CAN_LEARN_SPAM);
3225 FILL_TABLE("Menu/Message/Mark/IgnoreThread", M_TARGET_EXIST);
3226 FILL_TABLE("Menu/Message/Mark/UnignoreThread", M_TARGET_EXIST);
3227 FILL_TABLE("Menu/Message/Mark/Lock", M_TARGET_EXIST);
3228 FILL_TABLE("Menu/Message/Mark/Unlock", M_TARGET_EXIST);
3229 FILL_TABLE("Menu/Message/ColorLabel", M_TARGET_EXIST);
3230 FILL_TABLE("Menu/Message/Tags", M_TARGET_EXIST);
3231 FILL_TABLE("Menu/Message/Reedit", M_HAVE_ACCOUNT, M_ALLOW_REEDIT);
3232 FILL_TABLE("Menu/Message/CheckSignature", M_SINGLE_TARGET_EXIST);
3234 FILL_TABLE("Menu/Tools/AddSenderToAB", M_SINGLE_TARGET_EXIST);
3235 FILL_TABLE("Menu/Tools/CollectAddresses", M_FOLDER_SELECTED);
3236 FILL_TABLE("Menu/Tools/CollectAddresses/FromFolder", M_FOLDER_SELECTED);
3237 FILL_TABLE("Menu/Tools/CollectAddresses/FromSelected", M_TARGET_EXIST);
3238 FILL_TABLE("Menu/Tools/FilterFolder", M_MSG_EXIST, M_EXEC);
3239 FILL_TABLE("Menu/Tools/FilterSelected", M_TARGET_EXIST, M_EXEC);
3240 FILL_TABLE("Menu/Tools/RunProcessing", M_HAVE_PROCESSING);
3241 FILL_TABLE("Menu/Tools/CreateFilterRule", M_SINGLE_TARGET_EXIST, M_UNLOCKED);
3242 FILL_TABLE("Menu/Tools/CreateProcessingRule", M_SINGLE_TARGET_EXIST, M_UNLOCKED);
3243 FILL_TABLE("Menu/Tools/ListUrls", M_TARGET_EXIST);
3244 FILL_TABLE("Menu/Tools/Actions", M_TARGET_EXIST, M_ACTIONS_EXIST);
3245 FILL_TABLE("Menu/Tools/Execute", M_DELAY_EXEC);
3246 FILL_TABLE("Menu/Tools/Expunge", M_DELETED_EXISTS);
3247 FILL_TABLE("Menu/Tools/ForgetSessionPasswords", M_SESSION_PASSWORDS);
3248 #ifndef PASSWORD_CRYPTO_OLD
3249 FILL_TABLE("Menu/Tools/ForgetMasterPassphrase", M_MASTER_PASSPHRASE);
3251 FILL_TABLE("Menu/Tools/DeleteDuplicates/SelFolder", M_MSG_EXIST, M_ALLOW_DELETE);
3253 FILL_TABLE("Menu/Configuration", M_UNLOCKED);
3254 FILL_TABLE("Menu/Configuration/ChangeAccount", M_HAVE_MULTI_ACCOUNT);
3255 FILL_TABLE("Menu/Configuration/AccountPrefs", M_UNLOCKED);
3256 FILL_TABLE("Menu/Configuration/CreateAccount", M_UNLOCKED);
3257 FILL_TABLE("Menu/Configuration/EditAccounts", M_UNLOCKED);
3258 FILL_TABLE(NULL, -1);
3261 g_error("main window menu entry table overrun (%d/%d)", i, N_ENTRIES);
3264 state = main_window_get_current_state(mainwin);
3266 for (i = 0; entry[i].entry != NULL; i++) {
3267 sensitive = ((entry[i].cond & state) == entry[i].cond);
3268 cm_menu_set_sensitive_full(mainwin->ui_manager, entry[i].entry, sensitive);
3271 menu = gtk_menu_item_get_submenu(GTK_MENU_ITEM(
3272 gtk_ui_manager_get_widget(mainwin->ui_manager, "/Menu/Message/Receive")));
3274 children = gtk_container_get_children(GTK_CONTAINER(menu));
3275 for (cur_item = children; cur_item != NULL; cur_item = cur_item->next) {
3276 if (cur_item->data == gtk_ui_manager_get_widget(mainwin->ui_manager, "/Menu/Message/Receive/Separator1")) {
3277 cur_item = cur_item->next;
3282 for (; cur_item != NULL; cur_item = cur_item->next) {
3283 gtk_widget_set_sensitive(GTK_WIDGET(cur_item->data),
3284 (main_window_get_mask(M_UNLOCKED, -1) & state) != 0);
3287 g_list_free(children);
3289 main_window_menu_callback_block(mainwin);
3291 cm_toggle_menu_set_active_full(mainwin->ui_manager, "Menu/View/ShowHide/MessageView",
3292 messageview_is_visible(mainwin->messageview));
3294 summaryview = mainwin->summaryview;
3296 switch (summaryview->sort_key) {
3297 case SORT_BY_NUMBER:
3298 menu_path = "Menu/View/Sort/Number"; break;
3300 menu_path = "Menu/View/Sort/Size"; break;
3302 menu_path = "Menu/View/Sort/Date"; break;
3303 case SORT_BY_THREAD_DATE:
3304 menu_path = "Menu/View/Sort/ThreadDate"; break;
3306 menu_path = "Menu/View/Sort/From"; break;
3308 menu_path = "Menu/View/Sort/To"; break;
3309 case SORT_BY_SUBJECT:
3310 menu_path = "Menu/View/Sort/Subject"; break;
3312 menu_path = "Menu/View/Sort/Color"; break;
3314 menu_path = "Menu/View/Sort/Mark"; break;
3315 case SORT_BY_STATUS:
3316 menu_path = "Menu/View/Sort/Status"; break;
3318 menu_path = "Menu/View/Sort/Attachment"; break;
3320 menu_path = "Menu/View/Sort/Score"; break;
3321 case SORT_BY_LOCKED:
3322 menu_path = "Menu/View/Sort/Locked"; break;
3324 menu_path = "Menu/View/Sort/Tag"; break;
3327 menu_path = "Menu/View/Sort/DontSort"; break;
3329 cm_toggle_menu_set_active_full(mainwin->ui_manager, menu_path, TRUE);
3331 if (summaryview->sort_type == SORT_ASCENDING) {
3332 cm_toggle_menu_set_active_full(mainwin->ui_manager, "Menu/View/Sort/Ascending", TRUE);
3334 cm_toggle_menu_set_active_full(mainwin->ui_manager, "Menu/View/Sort/Descending", TRUE);
3337 if (summaryview->sort_key != SORT_BY_NONE) {
3338 cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/View/Sort/Ascending", TRUE);
3339 cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/View/Sort/Descending", TRUE);
3341 cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/View/Sort/Ascending", FALSE);
3342 cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/View/Sort/Descending", FALSE);
3345 if (mainwin->messageview
3346 && mainwin->messageview->mimeview
3347 && mainwin->messageview->mimeview->textview)
3348 cm_toggle_menu_set_active_full(mainwin->ui_manager, "Menu/View/AllHeaders",
3349 prefs_common.show_all_headers);
3350 cm_toggle_menu_set_active_full(mainwin->ui_manager, "Menu/View/ThreadView", (state & main_window_get_mask(M_THREADED, -1)) != 0);
3351 cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/View/ExpandThreads", (state & main_window_get_mask(M_THREADED, -1)) != 0);
3352 cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/View/CollapseThreads", (state & main_window_get_mask(M_THREADED, -1)) != 0);
3353 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);
3354 cm_toggle_menu_set_active_full(mainwin->ui_manager, "Menu/View/Quotes/CollapseAll", (prefs_common.hide_quotes == 1));
3355 cm_toggle_menu_set_active_full(mainwin->ui_manager, "Menu/View/Quotes/Collapse2", (prefs_common.hide_quotes == 2));
3356 cm_toggle_menu_set_active_full(mainwin->ui_manager, "Menu/View/Quotes/Collapse3", (prefs_common.hide_quotes == 3));
3358 if (mainwin->summaryview->folder_item && !mainwin->summaryview->folder_item->threaded)
3359 cm_toggle_menu_set_active_full(mainwin->ui_manager, "Menu/View/HideReadThreads", FALSE);
3360 if ((mainwin->summaryview->folder_item && mainwin->summaryview->folder_item->hide_read_msgs) ||
3361 quicksearch_has_sat_predicate(mainwin->summaryview->quicksearch))
3362 cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/View/HideReadThreads", FALSE);
3363 if ((mainwin->summaryview->folder_item && mainwin->summaryview->folder_item->hide_read_threads) ||
3364 quicksearch_has_sat_predicate(mainwin->summaryview->quicksearch))
3365 cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/View/HideReadMessages", FALSE);
3366 if (quicksearch_has_sat_predicate(mainwin->summaryview->quicksearch))
3367 cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/View/HideDelMessages", FALSE);
3369 cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/View/Goto/PrevHistory",
3370 messageview_nav_has_prev(mainwin->messageview));
3371 cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/View/Goto/NextHistory",
3372 messageview_nav_has_next(mainwin->messageview));
3374 if (mainwin->messageview
3375 && mainwin->messageview->mimeview)
3376 mimepart_selected = !mimeview_tree_is_empty(mainwin->messageview->mimeview);
3378 cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/File/SavePartAs", mimepart_selected);
3379 cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/View/Goto/NextPart", mimepart_selected);
3380 cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/View/Goto/PrevPart", mimepart_selected);
3381 cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/View/Part", mimepart_selected);
3382 cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/Message/CheckSignature",
3383 mimepart_selected && mainwin->messageview->mimeview->signed_part);
3386 if (mimepart_selected) {
3387 MimeInfo *partinfo = messageview_get_selected_mime_part(mainwin->messageview);
3389 if (partinfo && (partinfo->type == MIMETYPE_MESSAGE ||
3390 partinfo->type == MIMETYPE_IMAGE ||
3391 partinfo->type == MIMETYPE_MULTIPART)) {
3395 cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/View/Part/AsText", sensitive);
3397 main_window_menu_callback_unblock(mainwin);
3400 void main_create_mailing_list_menu (MainWindow *mainwin, MsgInfo *msginfo)
3405 is_menu = mailing_list_create_submenu (mainwin, msginfo);
3407 cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/Message/MailingList", TRUE);
3409 cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/Message/MailingList", FALSE);
3412 static gint mailing_list_create_submenu (MainWindow *mainwin, MsgInfo *msginfo)
3415 GtkWidget *menuitem;
3417 if (!msginfo || !msginfo->extradata) {
3418 cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/Message/MailingList/Post", FALSE);
3419 cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/Message/MailingList/Help", FALSE);
3420 cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/Message/MailingList/Subscribe", FALSE);
3421 cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/Message/MailingList/Unsubscribe", FALSE);
3422 cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/Message/MailingList/ViewArchive", FALSE);
3423 cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/Message/MailingList/ContactOwner", FALSE);
3427 /* Mailing list post */
3428 if (!g_strcmp0 (msginfo->extradata->list_post, "NO")) {
3429 g_free(msginfo->extradata->list_post);
3430 msginfo->extradata->list_post = g_strdup (_("No posting allowed"));
3432 menuitem = gtk_ui_manager_get_widget(mainwin->ui_manager, "/Menu/Message/MailingList/Post");
3434 menu_nb += mailing_list_populate_submenu (menuitem, msginfo->extradata->list_post);
3436 /* Mailing list help */
3437 menuitem = gtk_ui_manager_get_widget(mainwin->ui_manager, "/Menu/Message/MailingList/Help");
3439 menu_nb += mailing_list_populate_submenu (menuitem, msginfo->extradata->list_help);
3441 /* Mailing list subscribe */
3442 menuitem = gtk_ui_manager_get_widget(mainwin->ui_manager, "/Menu/Message/MailingList/Subscribe");
3444 menu_nb += mailing_list_populate_submenu (menuitem, msginfo->extradata->list_subscribe);
3446 /* Mailing list unsubscribe */
3447 menuitem = gtk_ui_manager_get_widget(mainwin->ui_manager, "/Menu/Message/MailingList/Unsubscribe");
3449 menu_nb += mailing_list_populate_submenu (menuitem, msginfo->extradata->list_unsubscribe);
3451 /* Mailing list view archive */
3452 menuitem = gtk_ui_manager_get_widget(mainwin->ui_manager, "/Menu/Message/MailingList/ViewArchive");
3454 menu_nb += mailing_list_populate_submenu (menuitem, msginfo->extradata->list_archive);
3456 /* Mailing list contact owner */
3457 menuitem = gtk_ui_manager_get_widget(mainwin->ui_manager, "/Menu/Message/MailingList/ContactOwner");
3459 menu_nb += mailing_list_populate_submenu (menuitem, msginfo->extradata->list_owner);
3464 static gint mailing_list_populate_submenu (GtkWidget *menuitem, const gchar * list_header)
3466 GtkWidget *item, *menu;
3467 const gchar *url_pt ;
3468 gchar url_decoded[BUFFSIZE];
3469 GList *children, *amenu;
3472 menu = gtk_menu_item_get_submenu(GTK_MENU_ITEM(menuitem));
3474 /* First delete old submenu */
3475 /* FIXME: we can optimize this, and only change/add/delete necessary items */
3476 children = gtk_container_get_children(GTK_CONTAINER(menu));
3477 for (amenu = children; amenu; amenu = amenu->next) {
3478 item = GTK_WIDGET (amenu->data);
3479 gtk_widget_destroy (item);
3481 g_list_free(children);
3483 for (url_pt = list_header; url_pt && *url_pt;) {
3484 get_url_part (&url_pt, url_decoded);
3486 if (!g_ascii_strncasecmp(url_decoded, "mailto:", 7)) {
3487 item = cm_menu_item_new_label_from_url ((url_decoded));
3488 g_signal_connect(G_OBJECT(item), "activate",
3489 G_CALLBACK(mailing_list_compose),
3492 else if (!g_ascii_strncasecmp(url_decoded, "http:", 5) ||
3493 !g_ascii_strncasecmp(url_decoded, "https:",6)) {
3495 item = cm_menu_item_new_label_from_url ((url_decoded));
3496 g_signal_connect(G_OBJECT(item), "activate",
3497 G_CALLBACK(mailing_list_open_uri),
3501 gtk_menu_shell_append(GTK_MENU_SHELL(menu), item);
3502 gtk_widget_show (item);
3508 gtk_widget_set_sensitive (menuitem, TRUE);
3510 gtk_widget_set_sensitive (menuitem, FALSE);
3516 static void get_url_part (const gchar **buffer, gchar *url_decoded)
3518 gchar tmp[BUFFSIZE];
3522 gboolean with_plus = TRUE;
3525 *url_decoded = '\0';
3529 /* Ignore spaces, comments and tabs () */
3530 for (;*buf == ' ' || *buf == '(' || *buf == '\t'; buf++)
3532 for (;*buf != ')' && *buf != 0x00; buf++);
3534 /* First non space and non comment must be a < */
3537 if (!strncmp(buf, "mailto:", strlen("mailto:")))
3540 *buf != '>' && *buf != 0x00 && i < BUFFSIZE;
3541 tmp[i++] = *(buf++));
3544 *url_decoded = '\0';
3551 *url_decoded = '\0';
3555 *url_decoded = '\0';
3558 if (i == BUFFSIZE) {
3562 decode_uri_with_plus (url_decoded, (const gchar *)tmp, with_plus);
3564 /* Prepare the work for the next url in the list */
3565 /* after the closing bracket >, ignore space, comments and tabs */
3566 for (;buf && *buf && (*buf == ' ' || *buf == '(' || *buf == '\t'); buf++)
3568 for (;*buf != ')' && *buf != 0x00; buf++);
3570 if (!buf || !*buf) {
3575 /* now first non space, non comment must be a comma */
3577 for (;*buf != 0x00; buf++);
3583 static void mailing_list_compose (GtkWidget *w, gpointer *data)
3585 const gchar *mailto;
3586 PrefsAccount *account = NULL;
3587 FolderItem *folder_item = NULL;
3589 mailto = gtk_label_get_text(GTK_LABEL (gtk_bin_get_child(GTK_BIN((w)))));
3590 if (mainwindow_get_mainwindow()) {
3591 folder_item = mainwindow_get_mainwindow()->summaryview->folder_item;
3592 if (folder_item && folder_item->prefs && folder_item->prefs->enable_default_account)
3593 account = account_find_from_id(folder_item->prefs->default_account);
3594 if (folder_item && !account)
3595 account = account_find_from_item(folder_item);
3598 compose_new_with_folderitem(account, folder_item, mailto+7);
3601 static void mailing_list_open_uri (GtkWidget *w, gpointer *data)
3604 const gchar *mailto;
3606 mailto = gtk_label_get_text(GTK_LABEL (gtk_bin_get_child(GTK_BIN((w)))));
3608 open_uri (mailto, prefs_common_get_uri_cmd());
3611 static void fix_folderview_scroll(MainWindow *mainwin)
3613 static gboolean fix_done = FALSE;
3618 gtk_widget_queue_resize(mainwin->folderview->ctree);
3623 void main_window_popup(MainWindow *mainwin)
3625 static gboolean first_start = TRUE;
3627 if (!gtk_widget_get_visible(GTK_WIDGET(mainwin->window)))
3628 main_window_show(mainwin);
3630 if (prefs_common.mainwin_maximised)
3631 gtk_window_maximize(GTK_WINDOW(mainwin->window));
3634 first_start = FALSE;
3636 gtkut_window_popup(mainwin->window);
3639 if (prefs_common.layout_mode == SMALL_LAYOUT) {
3640 if (mainwin->in_folder) {
3641 mainwindow_enter_folder(mainwin);
3643 mainwindow_exit_folder(mainwin);
3646 fix_folderview_scroll(mainwin);
3649 void main_window_show(MainWindow *mainwin)
3651 gtk_widget_show(mainwin->window);
3652 gtk_widget_show(mainwin->vbox_body);
3653 #ifndef GENERIC_UMPC
3654 gtk_window_move(GTK_WINDOW(mainwin->window),
3655 prefs_common.mainwin_x,
3656 prefs_common.mainwin_y);
3658 gtk_widget_set_size_request(GTK_WIDGET_PTR(mainwin->folderview),
3659 prefs_common.folderview_width,
3660 prefs_common.folderview_height);
3661 gtk_widget_set_size_request(GTK_WIDGET_PTR(mainwin->summaryview),
3662 prefs_common.summaryview_width,
3663 prefs_common.summaryview_height);
3664 gtk_widget_set_size_request(GTK_WIDGET_PTR(mainwin->messageview),
3665 prefs_common.msgview_width,
3666 prefs_common.msgview_height);
3670 void main_window_hide(MainWindow *mainwin)
3672 main_window_get_size(mainwin);
3673 main_window_get_position(mainwin);
3675 gtk_widget_hide(mainwin->window);
3676 gtk_widget_hide(mainwin->vbox_body);
3679 static void main_window_set_widgets(MainWindow *mainwin, LayoutType layout_mode)
3681 GtkWidget *folderwin = NULL;
3682 GtkWidget *messagewin = NULL;
3685 GtkWidget *vbox_body = mainwin->vbox_body;
3686 gboolean first_set = (mainwin->hpaned == NULL);
3687 debug_print("Setting widgets...\n");
3689 #ifndef GENERIC_UMPC
3690 mainwin->messageview->statusbar = mainwin->statusbar;
3691 mainwin->messageview->statusbar_cid = mainwin->messageview_cid;
3693 /* clean top-most container */
3694 if (mainwin->hpaned) {
3695 if (gtk_widget_get_parent(mainwin->hpaned) == mainwin->vpaned)
3696 gtk_widget_destroy(mainwin->vpaned);
3698 gtk_widget_destroy(mainwin->hpaned);
3701 cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/View/ShowHide/MessageView",
3702 (layout_mode != WIDE_MSGLIST_LAYOUT && layout_mode != SMALL_LAYOUT));
3703 switch (layout_mode) {
3704 case VERTICAL_LAYOUT:
3707 hpaned = gtk_hpaned_new();
3708 if (layout_mode == VERTICAL_LAYOUT)
3709 vpaned = gtk_hpaned_new();
3711 vpaned = gtk_vpaned_new();
3712 gtk_box_pack_start(GTK_BOX(vbox_body), hpaned, TRUE, TRUE, 0);
3713 gtk_paned_add1(GTK_PANED(hpaned),
3714 GTK_WIDGET_PTR(mainwin->folderview));
3715 gtk_widget_show(hpaned);
3716 gtk_widget_queue_resize(hpaned);
3718 if (messageview_is_visible(mainwin->messageview)) {
3719 gtk_paned_add2(GTK_PANED(hpaned), vpaned);
3720 gtk_paned_pack1(GTK_PANED(vpaned),
3721 GTK_WIDGET_PTR(mainwin->summaryview), TRUE, TRUE);
3723 gtk_paned_add2(GTK_PANED(hpaned),
3724 GTK_WIDGET_PTR(mainwin->summaryview));
3725 g_object_ref(vpaned);
3727 gtk_paned_add2(GTK_PANED(vpaned),
3728 GTK_WIDGET_PTR(mainwin->messageview));
3729 gtk_widget_show(vpaned);
3730 if (layout_mode == SMALL_LAYOUT && first_set) {
3731 mainwin_paned_show_first(GTK_PANED(hpaned));
3733 gtk_widget_queue_resize(vpaned);
3736 vpaned = gtk_vpaned_new();
3737 hpaned = gtk_hpaned_new();
3738 gtk_box_pack_start(GTK_BOX(vbox_body), vpaned, TRUE, TRUE, 0);
3739 gtk_paned_add1(GTK_PANED(vpaned), hpaned);
3741 gtk_paned_add1(GTK_PANED(hpaned),
3742 GTK_WIDGET_PTR(mainwin->folderview));
3743 gtk_paned_add2(GTK_PANED(hpaned),
3744 GTK_WIDGET_PTR(mainwin->summaryview));
3746 gtk_widget_show(hpaned);
3747 gtk_widget_queue_resize(hpaned);
3749 if (messageview_is_visible(mainwin->messageview)) {
3750 gtk_paned_add2(GTK_PANED(vpaned),
3751 GTK_WIDGET_PTR(mainwin->messageview));
3753 g_object_ref(GTK_WIDGET_PTR(mainwin->messageview));
3755 gtk_widget_show(vpaned);
3756 gtk_widget_queue_resize(vpaned);
3758 case WIDE_MSGLIST_LAYOUT:
3759 vpaned = gtk_vpaned_new();
3760 hpaned = gtk_hpaned_new();
3761 gtk_box_pack_start(GTK_BOX(vbox_body), vpaned, TRUE, TRUE, 0);
3763 gtk_paned_add1(GTK_PANED(vpaned),
3764 GTK_WIDGET_PTR(mainwin->summaryview));
3765 gtk_paned_add1(GTK_PANED(hpaned),
3766 GTK_WIDGET_PTR(mainwin->folderview));
3768 gtk_widget_show(hpaned);
3769 gtk_widget_queue_resize(hpaned);
3771 if (messageview_is_visible(mainwin->messageview)) {
3772 gtk_paned_add2(GTK_PANED(hpaned),
3773 GTK_WIDGET_PTR(mainwin->messageview));
3775 g_object_ref(GTK_WIDGET_PTR(mainwin->messageview));
3777 gtk_paned_add2(GTK_PANED(vpaned), hpaned);
3779 gtk_widget_show(vpaned);
3780 gtk_widget_queue_resize(vpaned);
3783 g_warning("Unknown layout");
3787 mainwin->hpaned = hpaned;
3788 mainwin->vpaned = vpaned;
3790 if (layout_mode == SMALL_LAYOUT) {
3791 if (mainwin->messageview->visible)
3792 main_window_toggle_message_view(mainwin);
3795 if (layout_mode == SMALL_LAYOUT && first_set) {
3796 gtk_widget_realize(mainwin->window);
3797 gtk_widget_realize(mainwin->folderview->ctree);
3798 gtk_widget_realize(mainwin->summaryview->hbox);
3799 gtk_widget_realize(mainwin->summaryview->hbox_l);
3800 gtk_widget_set_size_request(GTK_WIDGET_PTR(mainwin->folderview),
3801 prefs_common.folderview_width,
3802 prefs_common.folderview_height);
3803 gtk_widget_set_size_request(GTK_WIDGET_PTR(mainwin->summaryview),
3805 gtk_widget_set_size_request(GTK_WIDGET_PTR(mainwin->messageview),
3807 gtk_widget_set_size_request(GTK_WIDGET(mainwin->window),
3808 prefs_common.mainwin_width,
3809 prefs_common.mainwin_height);
3810 gtk_paned_set_position(GTK_PANED(mainwin->hpaned), 800);
3812 gtk_widget_set_size_request(GTK_WIDGET_PTR(mainwin->folderview),
3813 prefs_common.folderview_width,
3814 prefs_common.folderview_height);
3815 gtk_widget_set_size_request(GTK_WIDGET_PTR(mainwin->summaryview),
3816 prefs_common.summaryview_width,
3817 prefs_common.summaryview_height);
3818 gtk_widget_set_size_request(GTK_WIDGET_PTR(mainwin->messageview),
3819 prefs_common.msgview_width,
3820 prefs_common.msgview_height);
3821 gtk_widget_set_size_request(GTK_WIDGET(mainwin->window),
3822 prefs_common.mainwin_width,
3823 prefs_common.mainwin_height);
3825 /* remove headerview if not in prefs */
3826 headerview_set_visibility(mainwin->messageview->headerview,
3827 prefs_common.display_header_pane);
3829 if (messageview_is_visible(mainwin->messageview))
3830 gtk_arrow_set(GTK_ARROW(mainwin->summaryview->toggle_arrow),
3831 GTK_ARROW_DOWN, GTK_SHADOW_OUT);
3833 gtk_arrow_set(GTK_ARROW(mainwin->summaryview->toggle_arrow),
3834 GTK_ARROW_UP, GTK_SHADOW_OUT);
3836 gtk_window_move(GTK_WINDOW(mainwin->window),
3837 prefs_common.mainwin_x,
3838 prefs_common.mainwin_y);
3840 gtk_widget_queue_resize(vbox_body);
3841 gtk_widget_queue_resize(mainwin->vbox);
3842 gtk_widget_queue_resize(mainwin->window);
3843 /* CLAWS: previous "gtk_widget_show_all" makes noticeview
3844 * and mimeview icon list/ctree lose track of their visibility states */
3845 if (!noticeview_is_visible(mainwin->messageview->noticeview))
3846 gtk_widget_hide(GTK_WIDGET_PTR(mainwin->messageview->noticeview));
3847 if (!noticeview_is_visible(mainwin->messageview->mimeview->siginfoview))
3848 gtk_widget_hide(GTK_WIDGET_PTR(mainwin->messageview->mimeview->siginfoview));
3849 if (mainwin->messageview->mimeview->ctree_mode)
3850 gtk_widget_hide(mainwin->messageview->mimeview->icon_mainbox);
3852 gtk_widget_hide(mainwin->messageview->mimeview->ctree_mainbox);
3854 prefs_common.layout_mode = layout_mode;
3856 cm_toggle_menu_set_active_full(mainwin->ui_manager, "Menu/View/ShowHide/MessageView",
3857 messageview_is_visible(mainwin->messageview));
3859 #ifndef GENERIC_UMPC
3860 switch (prefs_common.layout_mode) {
3862 cm_toggle_menu_set_active_full(mainwin->ui_manager, "Menu/View/Layout/Standard", TRUE);
3864 case VERTICAL_LAYOUT:
3865 cm_toggle_menu_set_active_full(mainwin->ui_manager, "Menu/View/Layout/ThreeColumns", TRUE);
3868 cm_toggle_menu_set_active_full(mainwin->ui_manager, "Menu/View/Layout/WideMessage", TRUE);
3870 case WIDE_MSGLIST_LAYOUT:
3871 cm_toggle_menu_set_active_full(mainwin->ui_manager, "Menu/View/Layout/WideMessageList", TRUE);
3874 cm_toggle_menu_set_active_full(mainwin->ui_manager, "Menu/View/Layout/SmallScreen", TRUE);
3881 (G_OBJECT(folderwin), "size_allocate",
3882 G_CALLBACK(folder_window_size_allocate_cb),
3887 (G_OBJECT(messagewin), "size_allocate",
3888 G_CALLBACK(message_window_size_allocate_cb),
3892 debug_print("Setting widgets done.\n");
3895 void main_window_destroy_all(void)
3897 while (mainwin_list != NULL) {
3898 MainWindow *mainwin = (MainWindow*)mainwin_list->data;
3900 /* free toolbar stuff */
3901 toolbar_clear_list(TOOLBAR_MAIN);
3902 toolbar_destroy(mainwin->toolbar);
3904 summaryview_destroy(mainwin->summaryview);
3905 mainwin->folderview->mainwin = NULL;
3906 mainwin->summaryview->mainwin = NULL;
3907 mainwin->messageview->mainwin = NULL;
3909 g_free(mainwin->toolbar);
3912 mainwin_list = g_list_remove(mainwin_list, mainwin);
3914 g_list_free(mainwin_list);
3915 mainwin_list = NULL;
3918 static void toolbar_child_attached(GtkWidget *widget, GtkWidget *child,
3921 gtk_widget_set_size_request(child, 1, -1);
3924 static void toolbar_child_detached(GtkWidget *widget, GtkWidget *child,
3927 gtk_widget_set_size_request(child, -1, -1);
3929 #ifndef GENERIC_UMPC
3930 static gboolean ac_label_button_pressed(GtkWidget *widget, GdkEventButton *event,
3933 MainWindow *mainwin = (MainWindow *)data;
3934 GtkWidget *menu = NULL;
3936 if (!event) return FALSE;
3938 gtk_button_set_relief(GTK_BUTTON(widget), GTK_RELIEF_NORMAL);
3940 menu = gtk_menu_item_get_submenu(GTK_MENU_ITEM(mainwin->ac_menu));
3942 gtk_menu_popup(GTK_MENU(menu), NULL, NULL,
3943 menu_button_position, widget,
3944 event->button, event->time);
3949 static gint main_window_close_cb(GtkWidget *widget, GdkEventAny *event,
3952 MainWindow *mainwin = (MainWindow *)data;
3953 gboolean close_allowed = TRUE;
3955 hooks_invoke(MAIN_WINDOW_CLOSE, &close_allowed);
3957 if (close_allowed && mainwin->lock_count == 0)
3958 app_exit_cb(NULL, data);
3963 static void main_window_size_allocate_cb(GtkWidget *widget,
3964 GtkAllocation *allocation,
3967 MainWindow *mainwin = (MainWindow *)data;
3968 main_window_get_size(mainwin);
3971 static void folder_window_size_allocate_cb(GtkWidget *widget,
3972 GtkAllocation *allocation,
3975 MainWindow *mainwin = (MainWindow *)data;
3977 main_window_get_size(mainwin);
3980 static void message_window_size_allocate_cb(GtkWidget *widget,
3981 GtkAllocation *allocation,
3984 MainWindow *mainwin = (MainWindow *)data;
3986 main_window_get_size(mainwin);
3989 static void add_mailbox_cb(GtkAction *action, gpointer data)
3991 MainWindow *mainwin = (MainWindow *)data;
3992 main_window_add_mailbox(mainwin);
3995 static void update_folderview_cb(GtkAction *action, gpointer data)
3997 MainWindow *mainwin = (MainWindow *)data;
3998 summary_show(mainwin->summaryview, NULL);
3999 folderview_check_new_all();
4002 static void foldersort_cb(GtkAction *action, gpointer data)
4007 static void import_mbox_cb(GtkAction *action, gpointer data)
4009 MainWindow *mainwin = (MainWindow *)data;
4010 /* only notify if import has failed */
4011 if (import_mbox(mainwin->summaryview->folder_item) == -1) {
4012 alertpanel_error(_("Mbox import has failed."));
4016 static void export_mbox_cb(GtkAction *action, gpointer data)
4018 MainWindow *mainwin = (MainWindow *)data;
4019 /* only notify if export has failed */
4020 if (export_mbox(mainwin->summaryview->folder_item) == -1) {
4021 alertpanel_error(_("Export to mbox has failed."));
4025 static void export_list_mbox_cb(GtkAction *action, gpointer data)
4027 MainWindow *mainwin = (MainWindow *)data;
4028 /* only notify if export has failed */
4029 if (summaryview_export_mbox_list(mainwin->summaryview) == -1) {
4030 alertpanel_error(_("Export to mbox has failed."));
4034 static void empty_trash_cb(GtkAction *action, gpointer data)
4036 MainWindow *mainwin = (MainWindow *)data;
4037 main_window_empty_trash(mainwin, TRUE, FALSE);
4040 static void save_as_cb(GtkAction *action, gpointer data)
4042 MainWindow *mainwin = (MainWindow *)data;
4043 summary_save_as(mainwin->summaryview);
4046 static void print_cb(GtkAction *action, gpointer data)
4048 MainWindow *mainwin = (MainWindow *)data;
4049 summary_print(mainwin->summaryview);
4052 static void page_setup_cb(GtkAction *action, gpointer data)
4054 MainWindow *mainwin = (MainWindow *)data;
4057 win = (mainwin ? GTK_WINDOW(mainwin->window) : NULL);
4059 printing_page_setup(win);
4062 static void app_exit_cb(GtkAction *action, gpointer data)
4064 MainWindow *mainwin = (MainWindow *)data;
4065 if (prefs_common.clean_on_exit) {
4066 if (!main_window_empty_trash(mainwin, prefs_common.ask_on_clean, TRUE))
4070 if (prefs_common.confirm_on_exit) {
4071 if (alertpanel(_("Exit"), _("Exit Claws Mail?"),
4072 GTK_STOCK_CANCEL, GTK_STOCK_QUIT, NULL, ALERTFOCUS_FIRST)
4073 != G_ALERTALTERNATE)
4075 manage_window_focus_in(mainwin->window, NULL, NULL);
4078 app_will_exit(NULL, mainwin);
4081 static void search_cb(GtkAction *action, gpointer data)
4083 MainWindow *mainwin = (MainWindow *)data;
4084 message_search(mainwin->messageview);
4087 static void search_folder_cb(GtkAction *action, gpointer data)
4089 MainWindow *mainwin = (MainWindow *)data;
4090 FolderItem *item = mainwin->summaryview->folder_item;
4091 cm_return_if_fail(item != NULL);
4092 summary_search(mainwin->summaryview);
4095 static void mainwindow_quicksearch(GtkAction *action, gpointer data)
4097 MainWindow *mainwin = (MainWindow *)data;
4098 summaryview_activate_quicksearch(mainwin->summaryview, TRUE);
4101 static void toggle_message_cb(GtkAction *action, gpointer data)
4103 MainWindow *mainwin = (MainWindow *)data;
4106 active = gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (action));
4108 if (active != messageview_is_visible(mainwin->messageview))
4109 summary_toggle_view(mainwin->summaryview);
4112 static void toggle_toolbar_cb(GtkAction *action, GtkRadioAction *current, gpointer data)
4114 gint value = gtk_radio_action_get_current_value (GTK_RADIO_ACTION (current));
4115 MainWindow *mainwin = (MainWindow *)data;
4116 toolbar_toggle(value, mainwin);
4119 static void main_window_reply_cb(GtkAction *gaction, gpointer data)
4121 MainWindow *mainwin = (MainWindow *)data;
4122 MessageView *msgview = (MessageView*)mainwin->messageview;
4123 GSList *msginfo_list = NULL;
4124 gint action = COMPOSE_REPLY;
4125 const gchar *a_name = gtk_action_get_name(gaction);
4127 DO_ACTION("Message/Reply", COMPOSE_REPLY);
4128 DO_ACTION("Message/ReplyTo/All", COMPOSE_REPLY_TO_ALL);
4129 DO_ACTION("Message/ReplyTo/Sender", COMPOSE_REPLY_TO_SENDER);
4130 DO_ACTION("Message/ReplyTo/List", COMPOSE_REPLY_TO_LIST);
4131 DO_ACTION("Message/Forward", COMPOSE_FORWARD_INLINE);
4132 DO_ACTION("Message/ForwardAtt", COMPOSE_FORWARD_AS_ATTACH);
4133 DO_ACTION("Message/Redirect", COMPOSE_REDIRECT);
4134 DO_ACTION("Message/FollowupReply", COMPOSE_FOLLOWUP_AND_REPLY_TO);
4136 cm_return_if_fail(msgview != NULL);
4138 msginfo_list = summary_get_selection(mainwin->summaryview);
4139 cm_return_if_fail(msginfo_list != NULL);
4141 if (!summary_has_opened_message(mainwin->summaryview)) {
4142 compose_reply_from_messageview(NULL, msginfo_list, action);
4143 } else if (summary_is_opened_message_selected(mainwin->summaryview)) {
4144 compose_reply_from_messageview(msgview, msginfo_list, action);
4146 compose_reply_from_messageview(msgview, NULL, action);
4149 g_slist_free(msginfo_list);
4152 static void toggle_col_headers_cb(GtkAction *gaction, gpointer data)
4154 MainWindow *mainwin = (MainWindow *)data;
4155 FolderView *folderview = mainwin->folderview;
4156 SummaryView *summaryview = mainwin->summaryview;
4157 MimeView *mimeview = mainwin->messageview->mimeview;
4159 if (gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (gaction))) {
4160 gtk_cmclist_column_titles_show(GTK_CMCLIST(folderview->ctree));
4161 gtk_cmclist_column_titles_show(GTK_CMCLIST(summaryview->ctree));
4162 gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(mimeview->ctree), TRUE);
4163 prefs_common.show_col_headers = TRUE;
4165 gtk_cmclist_column_titles_hide(GTK_CMCLIST(folderview->ctree));
4166 gtk_cmclist_column_titles_hide(GTK_CMCLIST(summaryview->ctree));
4167 gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(mimeview->ctree), FALSE);
4168 prefs_common.show_col_headers = FALSE;
4172 #ifndef GENERIC_UMPC
4173 static void toggle_statusbar_cb(GtkAction *gaction, gpointer data)
4175 MainWindow *mainwin = (MainWindow *)data;
4176 if (gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (gaction))) {
4177 gtk_widget_show(mainwin->hbox_stat);
4178 prefs_common.show_statusbar = TRUE;
4180 gtk_widget_hide(mainwin->hbox_stat);
4181 prefs_common.show_statusbar = FALSE;
4185 static void set_layout_cb(GtkAction *action, GtkRadioAction *current, gpointer data)
4187 MainWindow *mainwin = (MainWindow *)data;
4188 gint value = gtk_radio_action_get_current_value (GTK_RADIO_ACTION (current));
4189 LayoutType layout_mode = value;
4190 LayoutType old_layout_mode = prefs_common.layout_mode;
4191 if (mainwin->menu_lock_count) {
4194 if (!gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (current))) {
4198 if (layout_mode == prefs_common.layout_mode) {
4202 if (!mainwin->messageview->visible && layout_mode != SMALL_LAYOUT)
4203 main_window_toggle_message_view(mainwin);
4204 else if (mainwin->messageview->visible && layout_mode == SMALL_LAYOUT)
4205 main_window_toggle_message_view(mainwin);
4207 main_window_separation_change(mainwin, layout_mode);
4208 mainwindow_reset_paned(GTK_PANED(mainwin->vpaned));
4209 if (old_layout_mode == SMALL_LAYOUT && layout_mode != SMALL_LAYOUT) {
4210 mainwindow_reset_paned(GTK_PANED(mainwin->hpaned));
4211 if (layout_mode == VERTICAL_LAYOUT)
4212 mainwindow_reset_paned(GTK_PANED(mainwin->vpaned));
4214 if (old_layout_mode != SMALL_LAYOUT && layout_mode == SMALL_LAYOUT) {
4215 mainwin_paned_show_first(GTK_PANED(mainwin->hpaned));
4216 mainwindow_exit_folder(mainwin);
4218 summary_relayout(mainwin->summaryview);
4219 summary_update_unread(mainwin->summaryview, NULL);
4223 void main_window_toggle_work_offline (MainWindow *mainwin, gboolean offline,
4226 static gboolean switching = FALSE;
4233 offline_ask_sync = ask_sync;
4235 online_switch_clicked (GTK_BUTTON(mainwin->online_switch), mainwin);
4237 online_switch_clicked (GTK_BUTTON(mainwin->offline_switch), mainwin);
4238 offline_ask_sync = TRUE;
4240 inc_reset_offline_override_timers();
4245 static void toggle_work_offline_cb (GtkAction *action, gpointer data)
4247 MainWindow *mainwin = (MainWindow *)data;
4248 main_window_toggle_work_offline(mainwin, gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (action)), TRUE);
4251 static gboolean any_folder_want_synchronise(void)
4253 GList *folderlist = folder_get_list();
4255 /* see if there are synchronised folders */
4256 for (; folderlist; folderlist = folderlist->next) {
4257 Folder *folder = (Folder *)folderlist->data;
4258 if (folder_want_synchronise(folder)) {
4266 static void mainwindow_check_synchronise(MainWindow *mainwin, gboolean ask)
4269 if (!any_folder_want_synchronise())
4272 if (offline_ask_sync && ask && alertpanel(_("Folder synchronisation"),
4273 _("Do you want to synchronise your folders now?"),
4274 GTK_STOCK_CANCEL, _("_Synchronise"), NULL, ALERTFOCUS_SECOND) != G_ALERTALTERNATE)
4277 if (offline_ask_sync)
4278 folder_synchronise(NULL);
4281 static void online_switch_clicked (GtkButton *btn, gpointer data)
4283 MainWindow *mainwin;
4284 gboolean have_connectivity;
4286 #ifdef HAVE_NETWORKMANAGER_SUPPORT
4287 have_connectivity = networkmanager_is_online(NULL);
4289 have_connectivity = TRUE;
4292 mainwin = (MainWindow *) data;
4294 cm_return_if_fail(mainwin != NULL);
4296 if (btn == GTK_BUTTON(mainwin->online_switch)) {
4297 #ifndef GENERIC_UMPC
4298 gtk_widget_hide (mainwin->online_switch);
4299 gtk_widget_show (mainwin->offline_switch);
4301 cm_toggle_menu_set_active_full(mainwin->ui_manager, "Menu/File/OfflineMode", TRUE);
4303 inc_autocheck_timer_remove();
4306 if (prefs_common.work_offline)
4309 if(have_connectivity)
4310 mainwindow_check_synchronise(mainwin, TRUE);
4311 prefs_common.work_offline = TRUE;
4312 imap_disconnect_all(have_connectivity);
4313 nntp_disconnect_all(have_connectivity);
4314 hooks_invoke(OFFLINE_SWITCH_HOOKLIST, NULL);
4317 if (!prefs_common.work_offline)
4319 #ifndef GENERIC_UMPC
4320 gtk_widget_hide (mainwin->offline_switch);
4321 gtk_widget_show (mainwin->online_switch);
4323 cm_toggle_menu_set_active_full(mainwin->ui_manager, "Menu/File/OfflineMode", FALSE);
4324 prefs_common.work_offline = FALSE;
4325 inc_autocheck_timer_set();
4326 refresh_resolvers();
4327 hooks_invoke(OFFLINE_SWITCH_HOOKLIST, NULL);
4331 static void addressbook_open_cb(GtkAction *action, gpointer data)
4333 #ifndef USE_ALT_ADDRBOOK
4334 addressbook_open(NULL);
4336 GError* error = NULL;
4338 addressbook_dbus_open(FALSE, &error);
4340 g_warning("Failed to open address book: %s", error->message);
4341 g_error_free(error);
4346 static void log_window_show_cb(GtkAction *action, gpointer data)
4348 MainWindow *mainwin = (MainWindow *)data;
4349 log_window_show(mainwin->logwin);
4352 static void filtering_debug_window_show_cb(GtkAction *action, gpointer data)
4354 MainWindow *mainwin = (MainWindow *)data;
4355 log_window_show(mainwin->filtering_debugwin);
4359 static void debug_log_show_cb(GtkAction *action, gpointer data)
4361 GError *error = NULL;
4362 gchar *logpath8 = win32_debug_log_path();
4363 gunichar2 *logpath16;
4365 debug_print("opening '%s'\n", logpath8);
4367 logpath16 = g_utf8_to_utf16(logpath8, -1, NULL, NULL, &error);
4369 if (error != NULL) {
4370 g_warning("couldn't convert debug log path '%s' to UTF-16: %s",
4371 logpath8, error->message);
4372 g_error_free(error);
4377 HINSTANCE ret = ShellExecute(NULL, NULL, (LPCWSTR)logpath16,
4378 NULL, NULL, SW_SHOW);
4382 debug_print("ShellExecute result: %"G_GSIZE_FORMAT"\n", (gsize)ret);
4386 static void inc_cancel_cb(GtkAction *action, gpointer data)
4392 static void send_cancel_cb(GtkAction *action, gpointer data)
4397 static void move_to_cb(GtkAction *action, gpointer data)
4399 MainWindow *mainwin = (MainWindow *)data;
4400 summary_move_to(mainwin->summaryview);
4403 static void copy_to_cb(GtkAction *action, gpointer data)
4405 MainWindow *mainwin = (MainWindow *)data;
4406 summary_copy_to(mainwin->summaryview);
4409 static void delete_cb(GtkAction *action, gpointer data)
4411 MainWindow *mainwin = (MainWindow *)data;
4412 summary_delete(mainwin->summaryview);
4415 static void delete_trash_cb(GtkAction *action, gpointer data)
4417 MainWindow *mainwin = (MainWindow *)data;
4418 summary_delete_trash(mainwin->summaryview);
4421 static void cancel_cb(GtkAction *action, gpointer data)
4423 MainWindow *mainwin = (MainWindow *)data;
4424 summary_cancel(mainwin->summaryview);
4427 static void open_msg_cb(GtkAction *action, gpointer data)
4429 MainWindow *mainwin = (MainWindow *)data;
4430 summary_open_msg(mainwin->summaryview);
4433 static void view_source_cb(GtkAction *action, gpointer data)
4435 MainWindow *mainwin = (MainWindow *)data;
4436 summary_view_source(mainwin->summaryview);
4439 static void show_all_header_cb(GtkAction *action, gpointer data)
4441 MainWindow *mainwin = (MainWindow *)data;
4442 if (mainwin->menu_lock_count) return;
4443 prefs_common.show_all_headers =
4444 gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (action));
4445 summary_display_msg_selected(mainwin->summaryview,
4446 gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (action)));
4449 static void toggle_fullscreen_cb(GtkAction *action, gpointer data)
4451 MainWindow *mainwin = (MainWindow *)data;
4452 if (mainwin->menu_lock_count) return;
4453 if (!gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (action))) {
4454 gtk_window_unfullscreen(GTK_WINDOW(mainwin->window));
4455 prefs_common.mainwin_fullscreen = FALSE;
4458 prefs_common.mainwin_fullscreen = TRUE;
4459 gtk_window_fullscreen(GTK_WINDOW(mainwin->window));
4463 static void toggle_menubar_cb(GtkAction *action, gpointer data)
4465 MainWindow *mainwin = (MainWindow *)data;
4466 if (mainwin->menu_lock_count) return;
4467 if (!gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (action))) {
4468 gtk_widget_hide(GTK_WIDGET(mainwin->menubar));
4469 prefs_common.mainwin_menubar = FALSE;
4471 gtk_widget_show(GTK_WIDGET(mainwin->menubar));
4472 prefs_common.mainwin_menubar = TRUE;
4476 static void hide_quotes_cb(GtkAction *action, gpointer data)
4478 MainWindow *mainwin = (MainWindow *)data;
4480 if (mainwin->menu_lock_count) return;
4482 if (gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (action))) {
4483 const gchar *a_name = gtk_action_get_name(GTK_ACTION(action));
4484 if (!strcmp(a_name, "View/Quotes/CollapseAll")) prefs_common.hide_quotes = 1;
4485 else if (!strcmp(a_name, "View/Quotes/Collapse2")) prefs_common.hide_quotes = 2;
4486 else if (!strcmp(a_name, "View/Quotes/Collapse3")) prefs_common.hide_quotes = 3;
4488 prefs_common.hide_quotes = 0;
4490 mainwin->menu_lock_count++;
4491 cm_toggle_menu_set_active_full(mainwin->ui_manager, "Menu/View/Quotes/CollapseAll", (prefs_common.hide_quotes == 1));
4492 cm_toggle_menu_set_active_full(mainwin->ui_manager, "Menu/View/Quotes/Collapse2", (prefs_common.hide_quotes == 2));
4493 cm_toggle_menu_set_active_full(mainwin->ui_manager, "Menu/View/Quotes/Collapse3", (prefs_common.hide_quotes == 3));
4494 mainwin->menu_lock_count--;
4496 summary_redisplay_msg(mainwin->summaryview);
4499 static void mark_cb(GtkAction *action, gpointer data)
4501 MainWindow *mainwin = (MainWindow *)data;
4502 summary_mark(mainwin->summaryview);
4505 static void unmark_cb(GtkAction *action, gpointer data)
4507 MainWindow *mainwin = (MainWindow *)data;
4508 summary_unmark(mainwin->summaryview);
4511 static void mark_as_read_cb(GtkAction *action, gpointer data)
4513 MainWindow *mainwin = (MainWindow *)data;
4514 summary_mark_as_read(mainwin->summaryview);
4517 static void mark_as_unread_cb(GtkAction *action, gpointer data)
4519 MainWindow *mainwin = (MainWindow *)data;
4520 summary_mark_as_unread(mainwin->summaryview);
4523 static void mark_all_read_cb(GtkAction *action, gpointer data)
4525 MainWindow *mainwin = (MainWindow *)data;
4526 summary_mark_all_read(mainwin->summaryview, TRUE);
4529 static void mark_all_unread_cb(GtkAction *action, gpointer data)
4531 MainWindow *mainwin = (MainWindow *)data;
4532 summary_mark_all_unread(mainwin->summaryview, TRUE);
4535 static void mark_as_spam_cb(GtkAction *action, gpointer data)
4537 MainWindow *mainwin = (MainWindow *)data;
4538 summary_mark_as_spam(mainwin->summaryview, TRUE, NULL);
4541 static void mark_as_ham_cb(GtkAction *action, gpointer data)
4543 MainWindow *mainwin = (MainWindow *)data;
4544 summary_mark_as_spam(mainwin->summaryview, FALSE, NULL);
4547 static void ignore_thread_cb(GtkAction *action, gpointer data)
4549 MainWindow *mainwin = (MainWindow *)data;
4550 summary_ignore_thread(mainwin->summaryview);
4553 static void unignore_thread_cb(GtkAction *action, gpointer data)
4555 MainWindow *mainwin = (MainWindow *)data;
4556 summary_unignore_thread(mainwin->summaryview);
4559 static void watch_thread_cb(GtkAction *action, gpointer data)
4561 MainWindow *mainwin = (MainWindow *)data;
4562 summary_watch_thread(mainwin->summaryview);
4565 static void unwatch_thread_cb(GtkAction *action, gpointer data)
4567 MainWindow *mainwin = (MainWindow *)data;
4568 summary_unwatch_thread(mainwin->summaryview);
4571 static void lock_msgs_cb(GtkAction *action, gpointer data)
4573 MainWindow *mainwin = (MainWindow *)data;
4574 summary_msgs_lock(mainwin->summaryview);
4577 static void unlock_msgs_cb(GtkAction *action, gpointer data)
4579 MainWindow *mainwin = (MainWindow *)data;
4580 summary_msgs_unlock(mainwin->summaryview);
4584 static void reedit_cb(GtkAction *action, gpointer data)
4586 MainWindow *mainwin = (MainWindow *)data;
4587 summary_reedit(mainwin->summaryview);
4590 static void open_urls_cb(GtkAction *action, gpointer data)
4592 MainWindow *mainwin = (MainWindow *)data;
4593 if (!mainwin->summaryview->displayed && mainwin->summaryview->selected) {
4594 summary_display_msg_selected(mainwin->summaryview,
4595 prefs_common.show_all_headers);
4597 messageview_list_urls(mainwin->messageview);
4600 static void add_address_cb(GtkAction *action, gpointer data)
4602 MainWindow *mainwin = (MainWindow *)data;
4603 summary_add_address(mainwin->summaryview);
4606 static void set_charset_cb(GtkAction *action, GtkRadioAction *current, gpointer data)
4608 MainWindow *mainwin = (MainWindow *)data;
4609 gint value = gtk_radio_action_get_current_value (GTK_RADIO_ACTION (current));
4612 if (gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (current))) {
4613 str = conv_get_charset_str((CharSet)value);
4615 g_free(mainwin->messageview->forced_charset);
4616 mainwin->messageview->forced_charset = str ? g_strdup(str) : NULL;
4617 procmime_force_charset(str);
4619 summary_redisplay_msg(mainwin->summaryview);
4621 debug_print("forced charset: %s\n", str ? str : "Auto-Detect");
4625 static void set_decode_cb(GtkAction *action, GtkRadioAction *current, gpointer data)
4627 MainWindow *mainwin = (MainWindow *)data;
4628 gint value = gtk_radio_action_get_current_value (GTK_RADIO_ACTION (current));
4629 if (gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (current))) {
4630 mainwin->messageview->forced_encoding = (EncodingType)value;
4632 summary_redisplay_msg(mainwin->summaryview);
4634 debug_print("forced encoding: %d\n", value);
4638 static void hide_read_messages (GtkAction *action, gpointer data)
4640 MainWindow *mainwin = (MainWindow *)data;
4641 GtkWidget *menuitem = gtk_ui_manager_get_widget(mainwin->ui_manager, "/Menu/View/HideReadMessages");
4642 if (!mainwin->summaryview->folder_item
4643 || g_object_get_data(G_OBJECT(menuitem), "dont_toggle"))
4645 summary_toggle_show_read_messages(mainwin->summaryview);
4648 static void hide_del_messages (GtkAction *action, gpointer data)
4650 MainWindow *mainwin = (MainWindow *)data;
4651 GtkWidget *menuitem = gtk_ui_manager_get_widget(mainwin->ui_manager, "/Menu/View/HideDelMessages");
4652 if (!mainwin->summaryview->folder_item
4653 || g_object_get_data(G_OBJECT(menuitem), "dont_toggle"))
4655 summary_toggle_show_del_messages(mainwin->summaryview);
4658 static void hide_read_threads (GtkAction *action, gpointer data)
4660 MainWindow *mainwin = (MainWindow *)data;
4661 GtkWidget *menuitem = gtk_ui_manager_get_widget(mainwin->ui_manager, "/Menu/View/HideReadThreads");
4662 if (!mainwin->summaryview->folder_item
4663 || g_object_get_data(G_OBJECT(menuitem), "dont_toggle"))
4665 summary_toggle_show_read_threads(mainwin->summaryview);
4668 static void thread_cb(GtkAction *action, gpointer data)
4670 MainWindow *mainwin = (MainWindow *)data;
4671 gboolean threaded = FALSE;
4672 if (mainwin->menu_lock_count) return;
4673 if (!mainwin->summaryview->folder_item) return;
4675 threaded = gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (action));
4677 mainwin->summaryview->folder_item->threaded = threaded;
4679 mainwin->summaryview->threaded = threaded;
4681 summary_show(mainwin->summaryview,
4682 mainwin->summaryview->folder_item);
4685 static void expand_threads_cb(GtkAction *action, gpointer data)
4687 MainWindow *mainwin = (MainWindow *)data;
4688 summary_expand_threads(mainwin->summaryview);
4691 static void collapse_threads_cb(GtkAction *action, gpointer data)
4693 MainWindow *mainwin = (MainWindow *)data;
4694 summary_collapse_threads(mainwin->summaryview);
4697 static void set_summary_display_item_cb(GtkAction *action, gpointer data)
4699 prefs_summary_column_open();
4702 static void set_folder_display_item_cb(GtkAction *action, gpointer data)
4704 prefs_folder_column_open();
4707 static void sort_summary_cb(GtkAction *action, GtkRadioAction *current, gpointer data)
4709 MainWindow *mainwin = (MainWindow *)data;
4710 gint value = gtk_radio_action_get_current_value (GTK_RADIO_ACTION (current));
4712 if (mainwin->menu_lock_count) return;
4714 if (gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (current))) {
4715 summary_sort(mainwin->summaryview, (FolderSortKey)value,
4716 mainwin->summaryview->sort_type);
4720 static void sort_summary_type_cb(GtkAction *gaction, GtkRadioAction *current, gpointer data)
4722 MainWindow *mainwin = (MainWindow *)data;
4723 gint value = gtk_radio_action_get_current_value (GTK_RADIO_ACTION (current));
4725 if (mainwin->menu_lock_count) return;
4727 if (gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (current)))
4728 summary_sort(mainwin->summaryview,
4729 mainwin->summaryview->sort_key, (FolderSortType)value);
4732 static void attract_by_subject_cb(GtkAction *action, gpointer data)
4734 MainWindow *mainwin = (MainWindow *)data;
4735 summary_attract_by_subject(mainwin->summaryview);
4738 void mainwindow_delete_duplicated(MainWindow *mainwin)
4742 item = folderview_get_selected_item(mainwin->folderview);
4746 main_window_cursor_wait(mainwin);
4747 STATUSBAR_PUSH(mainwin, _("Deleting duplicated messages..."));
4748 result = folderutils_delete_duplicates(item, prefs_common.immediate_exec ?
4749 DELETE_DUPLICATES_REMOVE : DELETE_DUPLICATES_SETFLAG);
4750 STATUSBAR_POP(mainwin);
4751 main_window_cursor_normal(mainwin);
4757 alertpanel_notice(_("No duplicate message found in selected folder.\n"));
4762 if (prefs_common.immediate_exec) {
4763 msg = ngettext("Deleted %d duplicate message in selected folder.\n",
4764 "Deleted %d duplicate messages in selected folder.\n",
4767 msg = ngettext("Marked %d duplicate message for deletion in selected folder.\n",
4768 "Marked %d duplicate messages for deletion in selected folder.\n",
4771 alertpanel_notice(msg, result);
4777 static void delete_duplicated_cb(GtkAction *action, gpointer data)
4779 mainwindow_delete_duplicated((MainWindow *)data);
4788 static void deldup_all(FolderItem *item, gpointer _data)
4790 struct DelDupsData *data = _data;
4793 result = folderutils_delete_duplicates(item, DELETE_DUPLICATES_REMOVE);
4795 data->dups += result;
4800 void mainwindow_delete_duplicated_all(MainWindow *mainwin)
4802 struct DelDupsData data = {0, 0};
4804 main_window_cursor_wait(mainwin);
4805 STATUSBAR_PUSH(mainwin, _("Deleting duplicated messages in all folders..."));
4806 folder_func_to_all_folders(deldup_all, &data);
4807 STATUSBAR_POP(mainwin);
4808 main_window_cursor_normal(mainwin);
4810 if (data.dups > 0) {
4811 alertpanel_notice(ngettext("Deleted %d duplicate message in %d folders.\n",
4812 "Deleted %d duplicate messages in %d folders.\n",
4814 data.dups, data.folders);
4816 alertpanel_notice(_("No duplicate message found in %d folders.\n"), data.folders);
4820 static void delete_duplicated_all_cb(GtkAction *action, gpointer mw)
4822 MainWindow *mainwin = (MainWindow *)mw;
4824 mainwindow_delete_duplicated_all(mainwin);
4827 static void filter_cb(GtkAction *action, gpointer data)
4829 MainWindow *mainwin = (MainWindow *)data;
4830 summary_filter(mainwin->summaryview, FALSE);
4833 static void filter_list_cb(GtkAction *action, gpointer data)
4835 MainWindow *mainwin = (MainWindow *)data;
4836 summary_filter(mainwin->summaryview, TRUE);
4839 static void process_cb(GtkAction *action, gpointer data)
4841 MainWindow *mainwin = (MainWindow *)data;
4842 FolderItem *item = mainwin->summaryview->folder_item;
4843 cm_return_if_fail(item != NULL);
4845 item->processing_pending = TRUE;
4846 folder_item_apply_processing(item);
4847 item->processing_pending = FALSE;
4850 static void execute_summary_cb(GtkAction *action, gpointer data)
4852 MainWindow *mainwin = (MainWindow *)data;
4853 summary_execute(mainwin->summaryview);
4856 static void expunge_summary_cb(GtkAction *action, gpointer data)
4858 MainWindow *mainwin = (MainWindow *)data;
4859 summary_expunge(mainwin->summaryview);
4862 static void update_summary_cb(GtkAction *action, gpointer data)
4864 MainWindow *mainwin = (MainWindow *)data;
4866 FolderView *folderview = mainwin->folderview;
4868 if (!mainwin->summaryview->folder_item) return;
4869 if ((fitem = folderview_get_opened_item(folderview)) == NULL) return;
4871 folder_update_op_count();
4872 folder_item_scan(fitem);
4873 summary_show(mainwin->summaryview, fitem);
4876 static void prev_cb(GtkAction *action, gpointer data)
4878 MainWindow *mainwin = (MainWindow *)data;
4879 summary_select_prev(mainwin->summaryview);
4882 static void next_cb(GtkAction *action, gpointer data)
4884 MainWindow *mainwin = (MainWindow *)data;
4885 summary_select_next(mainwin->summaryview);
4888 static void prev_unread_cb(GtkAction *action, gpointer data)
4890 MainWindow *mainwin = (MainWindow *)data;
4891 summary_select_prev_unread(mainwin->summaryview);
4894 static void next_unread_cb(GtkAction *action, gpointer data)
4896 MainWindow *mainwin = (MainWindow *)data;
4897 summary_select_next_unread(mainwin->summaryview);
4900 static void prev_new_cb(GtkAction *action, gpointer data)
4902 MainWindow *mainwin = (MainWindow *)data;
4903 summary_select_prev_new(mainwin->summaryview);
4906 static void next_new_cb(GtkAction *action, gpointer data)
4908 MainWindow *mainwin = (MainWindow *)data;
4909 summary_select_next_new(mainwin->summaryview);
4912 static void prev_marked_cb(GtkAction *action, gpointer data)
4914 MainWindow *mainwin = (MainWindow *)data;
4915 summary_select_prev_marked(mainwin->summaryview);
4918 static void next_marked_cb(GtkAction *action, gpointer data)
4920 MainWindow *mainwin = (MainWindow *)data;
4921 summary_select_next_marked(mainwin->summaryview);
4924 static void prev_labeled_cb(GtkAction *action, gpointer data)
4926 MainWindow *mainwin = (MainWindow *)data;
4927 summary_select_prev_labeled(mainwin->summaryview);
4930 static void next_labeled_cb(GtkAction *action, gpointer data)
4932 MainWindow *mainwin = (MainWindow *)data;
4933 summary_select_next_labeled(mainwin->summaryview);
4936 static void prev_history_cb(GtkAction *action, gpointer data)
4938 MainWindow *mainwin = (MainWindow *)data;
4939 MsgInfo *info = messageview_nav_get_prev(mainwin->messageview);
4941 if (info->folder != mainwin->summaryview->folder_item)
4942 folderview_select(mainwin->folderview, info->folder);
4943 summary_select_by_msgnum(mainwin->summaryview, info->msgnum,
4944 OPEN_SELECTED_ON_PREVNEXT);
4945 procmsg_msginfo_free(&info);
4946 main_window_set_menu_sensitive(mainwindow_get_mainwindow());
4947 toolbar_main_set_sensitive(mainwindow_get_mainwindow());
4951 static void next_history_cb(GtkAction *action, gpointer data)
4953 MainWindow *mainwin = (MainWindow *)data;
4954 MsgInfo *info = messageview_nav_get_next(mainwin->messageview);
4956 if (info->folder != mainwin->summaryview->folder_item)
4957 folderview_select(mainwin->folderview, info->folder);
4958 summary_select_by_msgnum(mainwin->summaryview, info->msgnum,
4959 OPEN_SELECTED_ON_PREVNEXT);
4960 procmsg_msginfo_free(&info);
4961 main_window_set_menu_sensitive(mainwindow_get_mainwindow());
4962 toolbar_main_set_sensitive(mainwindow_get_mainwindow());
4966 static void parent_cb(GtkAction *action, gpointer data)
4968 MainWindow *mainwin = (MainWindow *)data;
4969 summary_select_parent(mainwin->summaryview);
4972 static void goto_folder_cb(GtkAction *action, gpointer data)
4974 MainWindow *mainwin = (MainWindow *)data;
4975 FolderItem *to_folder;
4977 to_folder = foldersel_folder_sel(NULL, FOLDER_SEL_ALL, NULL, FALSE,
4978 _("Select folder to go to"));
4981 folderview_select(mainwin->folderview, to_folder);
4984 static void goto_unread_folder_cb(GtkAction *action, gpointer data)
4986 MainWindow *mainwin = (MainWindow *)data;
4987 folderview_select_next_with_flag(mainwin->folderview, MSG_UNREAD);
4990 static void scroll_prev_line_cb(GtkAction *action, gpointer data)
4992 MainWindow *mainwin = (MainWindow *)data;
4993 mimeview_scroll_one_line(mainwin->messageview->mimeview,TRUE);
4996 static void scroll_next_line_cb(GtkAction *action, gpointer data)
4998 MainWindow *mainwin = (MainWindow *)data;
4999 mimeview_scroll_one_line(mainwin->messageview->mimeview,FALSE);
5002 static void scroll_prev_page_cb(GtkAction *action, gpointer data)
5004 MainWindow *mainwin = (MainWindow *)data;
5005 mimeview_scroll_page(mainwin->messageview->mimeview,TRUE);
5008 static void scroll_next_page_cb(GtkAction *action, gpointer data)
5010 MainWindow *mainwin = (MainWindow *)data;
5011 mimeview_scroll_page(mainwin->messageview->mimeview,FALSE);
5014 static void copy_cb(GtkAction *action, gpointer data)
5016 MainWindow *mainwin = (MainWindow *)data;
5017 messageview_copy_clipboard(mainwin->messageview);
5020 static void allsel_cb(GtkAction *action, gpointer data)
5022 MainWindow *mainwin = (MainWindow *)data;
5023 MessageView *msgview = mainwin->messageview;
5025 if (messageview_is_visible(msgview) &&
5026 (gtk_widget_has_focus(msgview->mimeview->textview->text)))
5027 messageview_select_all(mainwin->messageview);
5029 summary_select_all(mainwin->summaryview);
5032 static void select_thread_cb(GtkAction *action, gpointer data)
5034 MainWindow *mainwin = (MainWindow *)data;
5035 summary_select_thread(mainwin->summaryview, FALSE, FALSE);
5038 static void trash_thread_cb(GtkAction *action, gpointer data)
5040 MainWindow *mainwin = (MainWindow *)data;
5041 summary_select_thread(mainwin->summaryview, FALSE, TRUE);
5044 static void delete_thread_cb(GtkAction *action, gpointer data)
5046 MainWindow *mainwin = (MainWindow *)data;
5047 summary_select_thread(mainwin->summaryview, TRUE, FALSE);
5050 static void create_filter_cb(GtkAction *gaction, gpointer data)
5052 MainWindow *mainwin = (MainWindow *)data;
5053 const gchar *a_name = gtk_action_get_name(gaction);
5056 DO_ACTION("Tools/CreateFilterRule/Automatically", FILTER_BY_AUTO);
5057 DO_ACTION("Tools/CreateFilterRule/ByFrom", FILTER_BY_FROM);
5058 DO_ACTION("Tools/CreateFilterRule/ByTo", FILTER_BY_TO);
5059 DO_ACTION("Tools/CreateFilterRule/BySubject", FILTER_BY_SUBJECT);
5060 summary_filter_open(mainwin->summaryview, (PrefsFilterType)action, 0);
5063 static void create_processing_cb(GtkAction *gaction, gpointer data)
5065 MainWindow *mainwin = (MainWindow *)data;
5066 const gchar *a_name = gtk_action_get_name(gaction);
5069 DO_ACTION("Tools/CreateProcessingRule/Automatically", FILTER_BY_AUTO);
5070 DO_ACTION("Tools/CreateProcessingRule/ByFrom", FILTER_BY_FROM);
5071 DO_ACTION("Tools/CreateProcessingRule/ByTo", FILTER_BY_TO);
5072 DO_ACTION("Tools/CreateProcessingRule/BySubject", FILTER_BY_SUBJECT);
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 MainWindow *mainwin = (MainWindow *)data;
5114 GSList * list = summary_get_selected_msg_list(mainwin->summaryview);
5115 tag_apply_open(list);
5118 static void ssl_manager_open_cb(GtkAction *action, gpointer data)
5120 MainWindow *mainwin = (MainWindow *)data;
5121 ssl_manager_open(mainwin);
5124 static void prefs_account_open_cb(GtkAction *action, gpointer data)
5126 MainWindow *mainwin = (MainWindow *)data;
5128 new_account_cb(NULL, mainwin);
5130 account_open(cur_account, FALSE);
5134 static void new_account_cb(GtkAction *action, gpointer data)
5136 account_edit_open(NULL, NULL);
5137 if (!compose_get_compose_list()) account_add();
5140 static void account_selector_menu_cb(GtkMenuItem *menuitem, gpointer data)
5142 FolderItem *item = NULL;
5143 cur_account = (PrefsAccount *)data;
5145 if (!mainwindow_get_mainwindow())
5147 main_window_show_cur_account(mainwindow_get_mainwindow());
5148 toolbar_update(TOOLBAR_MAIN, mainwindow_get_mainwindow());
5149 main_window_set_menu_sensitive(mainwindow_get_mainwindow());
5150 toolbar_main_set_sensitive(mainwindow_get_mainwindow());
5151 item = folderview_get_selected_item(
5152 mainwindow_get_mainwindow()->folderview);
5154 toolbar_set_compose_button
5155 (mainwindow_get_mainwindow()->toolbar,
5156 FOLDER_TYPE(item->folder) == F_NEWS ?
5157 COMPOSEBUTTON_NEWS : COMPOSEBUTTON_MAIL);
5161 static void account_receive_menu_cb(GtkMenuItem *menuitem, gpointer data)
5163 MainWindow *mainwin = (MainWindow *)mainwin_list->data;
5164 PrefsAccount *account = (PrefsAccount *)data;
5166 inc_account_mail(mainwin, account);
5168 #ifndef GENERIC_UMPC
5169 static void account_compose_menu_cb(GtkMenuItem *menuitem, gpointer data)
5171 PrefsAccount *account = (PrefsAccount *)data;
5173 compose_new_with_folderitem(account, NULL, NULL);
5176 static void prefs_open_cb(GtkAction *action, gpointer data)
5181 static void plugins_open_cb(GtkAction *action, gpointer data)
5183 pluginwindow_create();
5186 static void manual_open_cb(GtkAction *action, gpointer data)
5188 manual_open(MANUAL_MANUAL_CLAWS, NULL);
5191 static void manual_faq_open_cb(GtkAction *action, gpointer data)
5193 manual_open(MANUAL_FAQ_CLAWS, NULL);
5196 static void legend_open_cb(GtkAction *action, gpointer data)
5202 static void set_default_client_cb(GtkAction *action, gpointer data)
5204 char exename[MAX_PATH];
5205 gchar *binary_icon = NULL;
5206 gchar *binary_compose = NULL;
5207 gchar *binary_run = NULL;
5209 if ( !GetModuleFileNameA (0, exename, sizeof (exename)) ) {
5210 alertpanel_error(_("Can not register as default client: impossible to get executable path."));
5213 binary_icon = g_strconcat(exename, ",0", NULL);
5214 binary_compose = g_strconcat(exename, " --compose %1", NULL);
5215 binary_run = g_strconcat(exename, NULL);
5217 /* Try to set the Mail Start menu item to Claws. It may fail if we're not root; we don't care */
5218 r = write_w32_registry_string("HKLM", "Software\\Clients\\Mail",
5221 r = write_w32_registry_string("HKCU", "Software\\Clients\\Mail\\Claws Mail",
5224 r = write_w32_registry_string("HKCU", "Software\\Clients\\Mail\\Claws Mail",
5227 r = write_w32_registry_string("HKCU", "Software\\Clients\\Mail\\Claws Mail\\Protocols\\mailto",
5228 "", "URL:MailTo-Protocol");
5230 r = write_w32_registry_string("HKCU", "Software\\Clients\\Mail\\Claws Mail\\Protocols\\mailto",
5231 "URL Protocol", "");
5233 r = write_w32_registry_dword ("HKCU", "Software\\Clients\\Mail\\Claws Mail\\Protocols\\mailto",
5236 r = write_w32_registry_string ("HKCU", "Software\\Clients\\Mail\\Claws Mail\\Protocols\\mailto",
5237 "FriendlyTypeName", "Claws-Mail URL");
5239 r = write_w32_registry_string("HKCU", "Software\\Clients\\Mail\\Claws Mail\\Protocols\\mailto\\DefaultIcon",
5242 r = write_w32_registry_string("HKCU", "Software\\Clients\\Mail\\Claws Mail\\Protocols\\mailto\\shell\\open\\command",
5243 "", binary_compose);
5245 r = write_w32_registry_string("HKCU", "Software\\Clients\\Mail\\Claws Mail\\shell\\open\\command",
5249 r = write_w32_registry_string("HKCU", "Software\\Classes\\mailto",
5250 "", "URL:MailTo-Protocol");
5252 r = write_w32_registry_string("HKCU", "Software\\Classes\\mailto",
5253 "URL Protocol", "");
5255 r = write_w32_registry_dword ("HKCU", "Software\\Classes\\mailto",
5258 r = write_w32_registry_string("HKCU", "Software\\Classes\\mailto",
5259 "FriendlyTypeName", "Claws-Mail URL");
5261 r = write_w32_registry_string("HKCU", "Software\\Classes\\mailto\\DefaultIcon",
5264 r = write_w32_registry_string("HKCU", "Software\\Classes\\mailto\\shell\\open\\command",
5265 "", binary_compose);
5268 SendMessage(HWND_BROADCAST, WM_SETTINGCHANGE, 0, (LPARAM)"Software\\Clients\\Mail");
5269 alertpanel_notice(_("Claws Mail has been registered as default client."));
5271 alertpanel_error(_("Can not register as default client: impossible to write to the registry."));
5273 g_free(binary_icon);
5274 g_free(binary_compose);
5279 static void scan_tree_func(Folder *folder, FolderItem *item, gpointer data)
5281 MainWindow *mainwin = (MainWindow *)data;
5285 str = g_strdup_printf(_("Scanning folder %s%c%s..."),
5286 LOCAL_FOLDER(folder)->rootpath,
5290 str = g_strdup_printf(_("Scanning folder %s..."),
5291 LOCAL_FOLDER(folder)->rootpath);
5293 STATUSBAR_PUSH(mainwin, str);
5294 STATUSBAR_POP(mainwin);
5298 static gboolean mainwindow_focus_in_event(GtkWidget *widget, GdkEventFocus *focus,
5301 SummaryView *summary;
5303 cm_return_val_if_fail(data, FALSE);
5304 if (!g_list_find(mainwin_list, data))
5306 summary = ((MainWindow *)data)->summaryview;
5307 cm_return_val_if_fail(summary, FALSE);
5309 if (GTK_CMCLIST(summary->ctree)->selection &&
5310 g_list_length(GTK_CMCLIST(summary->ctree)->selection) > 1)
5316 static gboolean mainwindow_visibility_event_cb(GtkWidget *widget, GdkEventVisibility *event,
5319 is_obscured = (event->state == GDK_VISIBILITY_FULLY_OBSCURED);
5323 static gboolean mainwindow_state_event_cb(GtkWidget *widget, GdkEventWindowState *state,
5326 if (!claws_is_starting()
5327 && state->changed_mask&GDK_WINDOW_STATE_ICONIFIED
5328 && state->new_window_state&GDK_WINDOW_STATE_ICONIFIED) {
5330 if (iconified_count > 0)
5331 hooks_invoke(MAIN_WINDOW_GOT_ICONIFIED, NULL);
5333 } else if (!claws_is_starting()) {
5334 prefs_common.mainwin_maximised =
5335 ((state->new_window_state&GDK_WINDOW_STATE_MAXIMIZED) != 0);
5337 if (state->new_window_state == 0)
5338 gtk_window_set_skip_taskbar_hint(GTK_WINDOW(widget), FALSE);
5342 gboolean mainwindow_is_obscured(void)
5348 * Harvest addresses for selected folder.
5350 static void addr_harvest_cb( GtkAction *action, gpointer data)
5352 MainWindow *mainwin = (MainWindow *)data;
5354 addressbook_harvest( mainwin->summaryview->folder_item, FALSE, NULL );
5358 * Harvest addresses for selected messages in summary view.
5360 static void addr_harvest_msg_cb( GtkAction *action, gpointer data)
5362 MainWindow *mainwin = (MainWindow *)data;
5363 summary_harvest_address( mainwin->summaryview );
5367 *\brief get a MainWindow
5369 *\return MainWindow * The first mainwindow in the mainwin_list
5371 MainWindow *mainwindow_get_mainwindow(void)
5373 if (mainwin_list && mainwin_list->data)
5374 return (MainWindow *)(mainwin_list->data);
5379 static gboolean mainwindow_progressindicator_hook(gpointer source, gpointer userdata)
5381 ProgressData *data = (ProgressData *) source;
5382 MainWindow *mainwin = (MainWindow *) userdata;
5384 switch (data->cmd) {
5385 case PROGRESS_COMMAND_START:
5386 case PROGRESS_COMMAND_STOP:
5387 gtk_progress_bar_set_fraction
5388 (GTK_PROGRESS_BAR(mainwin->progressbar), 0.0);
5390 case PROGRESS_COMMAND_SET_PERCENTAGE:
5391 gtk_progress_bar_set_fraction
5392 (GTK_PROGRESS_BAR(mainwin->progressbar), data->value);
5395 while (gtk_events_pending()) gtk_main_iteration ();
5400 static void sync_cb(GtkAction *action, gpointer data)
5402 MainWindow *mainwin = (MainWindow *)data;
5403 mainwindow_check_synchronise(mainwin, FALSE);
5406 static void forget_session_passwords_cb(GtkAction *action, gpointer data)
5408 MainWindow *mainwin = (MainWindow *)data;
5413 main_window_lock(mainwin);
5414 for (list = account_get_list(); list != NULL; list = list->next) {
5415 PrefsAccount *account = list->data;
5416 if (account->session_passwd) {
5417 g_free(account->session_passwd);
5418 account->session_passwd = NULL;
5421 if (account->session_smtp_passwd) {
5422 g_free(account->session_smtp_passwd);
5423 account->session_smtp_passwd = NULL;
5428 main_window_unlock(mainwin);
5429 alertpanel_notice(ngettext("Forgotten %d password in %d accounts.\n",
5430 "Forgotten %d passwords in %d accounts.\n",
5434 #ifndef PASSWORD_CRYPTO_OLD
5435 static void forget_master_passphrase_cb(GtkAction *action, gpointer data)
5437 MainWindow *mainwin = (MainWindow *)data;
5439 main_window_lock(mainwin);
5440 master_passphrase_forget();
5441 main_window_unlock(mainwin);
5445 void mainwindow_learn (MainWindow *mainwin, gboolean is_spam)
5447 summary_mark_as_spam(mainwin->summaryview, is_spam, NULL);
5450 void mainwindow_jump_to(const gchar *target, gboolean popup)
5454 FolderItem *item = NULL;
5456 MainWindow *mainwin = mainwindow_get_mainwindow();
5457 gchar *from_uri = NULL;
5462 g_print("not initialized\n");
5466 if ((from_uri = g_filename_from_uri(target, NULL, NULL)) != NULL)
5469 tmp = g_strdup(target);
5471 if ((p = strstr(tmp, "\r")) != NULL)
5473 if ((p = strstr(tmp, "\n")) != NULL)
5476 if ((item = folder_find_item_from_identifier(tmp))) {
5477 g_print("selecting folder '%s'\n", tmp);
5478 folderview_select(mainwin->folderview, item);
5480 main_window_popup(mainwin);
5485 msg = strrchr(tmp, '/');
5488 if ((item = folder_find_item_from_identifier(tmp))) {
5489 g_print("selecting folder '%s'\n", tmp);
5490 folderview_select(mainwin->folderview, item);
5491 } else if ((item = folder_find_item_from_real_path(tmp))) {
5492 g_print("selecting folder '%s'\n", tmp);
5493 folderview_select(mainwin->folderview, item);
5495 g_print("'%s' not found\n", tmp);
5497 if (item && msg && atoi(msg)) {
5498 g_print("selecting message %d\n", atoi(msg));
5499 summary_select_by_msgnum(mainwin->summaryview, atoi(msg), TRUE);
5501 main_window_popup(mainwin);
5504 } else if (item && msg[0] == '<' && msg[strlen(msg)-1] == '>') {
5505 MsgInfo *msginfo = NULL;
5507 msg[strlen(msg)-1] = '\0';
5508 msginfo = folder_item_get_msginfo_by_msgid(item, msg);
5510 g_print("selecting message %s\n", msg);
5511 summary_select_by_msgnum(mainwin->summaryview, msginfo->msgnum, TRUE);
5513 main_window_popup(mainwin);
5515 procmsg_msginfo_free(&msginfo);
5518 g_print("'%s' not found\n", msg);
5521 g_print("'%s' not found\n", msg);
5524 g_print("'%s' not found\n", tmp);
5530 void mainwindow_exit_folder(MainWindow *mainwin) {
5531 if (prefs_common.layout_mode == SMALL_LAYOUT) {
5532 folderview_close_opened(mainwin->folderview, FALSE);
5533 mainwin_paned_show_first(GTK_PANED(mainwin->hpaned));
5534 folderview_grab_focus(mainwin->folderview);
5536 mainwin->in_folder = FALSE;
5537 main_window_set_menu_sensitive(mainwin);
5540 void mainwindow_enter_folder(MainWindow *mainwin) {
5541 if (prefs_common.layout_mode == SMALL_LAYOUT) {
5542 mainwin_paned_show_last(GTK_PANED(mainwin->hpaned));
5544 mainwin->in_folder = TRUE;
5545 main_window_set_menu_sensitive(mainwin);
5548 static void save_part_as_cb(GtkAction *action, gpointer data)
5550 MainWindow *mainwin = (MainWindow *)data;
5552 if (mainwin->messageview
5553 && mainwin->messageview->mimeview)
5554 mimeview_save_as(mainwin->messageview->mimeview);
5557 static void view_part_as_text_cb(GtkAction *action, gpointer data)
5559 MainWindow *mainwin = (MainWindow *)data;
5561 if (mainwin->messageview
5562 && mainwin->messageview->mimeview)
5563 mimeview_display_as_text(mainwin->messageview->mimeview);
5566 static void open_part_cb(GtkAction *action, gpointer data)
5568 MainWindow *mainwin = (MainWindow *)data;
5570 if (mainwin->messageview
5571 && mainwin->messageview->mimeview)
5572 mimeview_launch(mainwin->messageview->mimeview, NULL);
5575 static void open_part_with_cb(GtkAction *action, gpointer data)
5577 MainWindow *mainwin = (MainWindow *)data;
5579 if (mainwin->messageview
5580 && mainwin->messageview->mimeview)
5581 mimeview_open_with(mainwin->messageview->mimeview);
5584 static void check_signature_cb(GtkAction *action, gpointer data)
5586 MainWindow *mainwin = (MainWindow *)data;
5588 if (mainwin->messageview
5589 && mainwin->messageview->mimeview)
5590 mimeview_check_signature(mainwin->messageview->mimeview);
5593 static void goto_next_part_cb(GtkAction *action, gpointer data)
5595 MainWindow *mainwin = (MainWindow *)data;
5597 if (mainwin->messageview
5598 && mainwin->messageview->mimeview)
5599 mimeview_select_next_part(mainwin->messageview->mimeview);
5602 static void goto_prev_part_cb(GtkAction *action, gpointer data)
5604 MainWindow *mainwin = (MainWindow *)data;
5606 if (mainwin->messageview
5607 && mainwin->messageview->mimeview)
5608 mimeview_select_prev_part(mainwin->messageview->mimeview);