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 (mainwin->summaryview->folder_item &&
3020 mainwin->summaryview->folder_item->stype == F_DRAFT)
3021 UPDATE_STATE(M_DRAFT);
3023 if (prefs_common.actions_list && g_slist_length(prefs_common.actions_list))
3024 UPDATE_STATE(M_ACTIONS_EXIST);
3026 tmp = tags_get_list();
3027 if (tmp && g_slist_length(tmp))
3028 UPDATE_STATE(M_TAGS_EXIST);
3031 if (procmsg_have_queued_mails_fast() && !procmsg_is_sending())
3032 UPDATE_STATE(M_HAVE_QUEUED_MAILS);
3034 if (selection == SUMMARY_SELECTED_SINGLE &&
3036 (folder_has_parent_of_type(item, F_DRAFT) ||
3037 folder_has_parent_of_type(item, F_OUTBOX) ||
3038 folder_has_parent_of_type(item, F_QUEUE))))
3039 UPDATE_STATE(M_ALLOW_REEDIT);
3041 UPDATE_STATE(M_HAVE_ACCOUNT);
3043 if (cur_account && cur_account->protocol != A_NONE)
3044 UPDATE_STATE(M_HAVE_RETRIEVABLE_ACCOUNT);
3046 if (any_folder_want_synchronise())
3047 UPDATE_STATE(M_WANT_SYNC);
3049 if (item && item->prefs->processing && selection != SUMMARY_NONE)
3050 UPDATE_STATE(M_HAVE_PROCESSING);
3052 if (g_list_length(account_list) > 1)
3053 UPDATE_STATE(M_HAVE_MULTI_ACCOUNT);
3055 for (account_list = account_get_list(); account_list != NULL; account_list = account_list->next) {
3056 if (((PrefsAccount*)account_list->data)->protocol != A_NONE) {
3057 UPDATE_STATE(M_HAVE_ANY_RETRIEVABLE_ACCOUNT);
3062 for (account_list = account_get_list(); account_list != NULL; account_list = account_list->next) {
3063 if (((PrefsAccount*)account_list->data)->protocol == A_NNTP) {
3064 UPDATE_STATE(M_HAVE_NEWS_ACCOUNT);
3069 if (procmsg_spam_can_learn() &&
3070 (mainwin->summaryview->folder_item &&
3071 mainwin->summaryview->folder_item->folder->klass->type != F_UNKNOWN &&
3072 mainwin->summaryview->folder_item->folder->klass->type != F_NEWS)) {
3073 UPDATE_STATE(M_CAN_LEARN_SPAM);
3076 if (mainwin->summaryview->folder_item) {
3077 UPDATE_STATE(M_FOLDER_SELECTED);
3080 if (inc_is_active())
3081 UPDATE_STATE(M_INC_ACTIVE);
3082 if (imap_cancel_all_enabled())
3083 UPDATE_STATE(M_INC_ACTIVE);
3085 if (send_is_active() | procmsg_is_sending())
3086 UPDATE_STATE(M_SEND_ACTIVE);
3088 if (mainwin->summaryview->deleted > 0)
3089 UPDATE_STATE(M_DELETED_EXISTS);
3091 if (mainwin->summaryview->deleted > 0 ||
3092 mainwin->summaryview->moved > 0 ||
3093 mainwin->summaryview->copied > 0)
3094 UPDATE_STATE(M_DELAY_EXEC);
3096 if (summary_is_list(mainwin->summaryview))
3097 UPDATE_STATE(M_SUMMARY_ISLIST);
3099 if (prefs_common.layout_mode != SMALL_LAYOUT || mainwin->in_folder)
3100 UPDATE_STATE(M_IN_MSGLIST);
3102 for (account_list = account_get_list(); account_list != NULL; account_list = account_list->next) {
3103 PrefsAccount *account = account_list->data;
3104 if (account->session_passwd || account->session_smtp_passwd) {
3105 UPDATE_STATE(M_SESSION_PASSWORDS);
3110 #ifndef PASSWORD_CRYPTO_OLD
3111 if (master_passphrase_is_entered()) {
3112 UPDATE_STATE(M_MASTER_PASSPHRASE);
3121 SensitiveCondMask main_window_get_mask(SensitiveCond cond, ...)
3125 SensitiveCondMask value;
3126 static SensitiveCondMask SensitiveCond_table[M_MAX_RESERVED];
3127 static gboolean first_time = TRUE;
3130 for (i = 0; i < M_MAX_RESERVED; i++)
3131 SensitiveCond_table[i] = (SensitiveCondMask) ((SensitiveCondMask)1 << i);
3137 va_start(args, cond);
3138 for (i = (gint) cond; i >= 0; i = va_arg(args, gint))
3139 value |= SensitiveCond_table[i];
3145 void main_window_set_menu_sensitive(MainWindow *mainwin)
3147 SensitiveCondMask state;
3149 SummaryView *summaryview;
3152 GList *children, *cur_item;
3154 gboolean mimepart_selected = FALSE;
3156 #define N_ENTRIES 88
3159 SensitiveCondMask cond;
3163 #define FILL_TABLE(entry_str, ...) \
3165 entry[i].entry = (const gchar *) entry_str; entry[i++].cond = main_window_get_mask(__VA_ARGS__, -1); \
3168 FILL_TABLE("Menu/File/SaveAs", M_TARGET_EXIST);
3169 FILL_TABLE("Menu/File/SavePartAs", M_SINGLE_TARGET_EXIST);
3170 FILL_TABLE("Menu/File/Print", M_TARGET_EXIST);
3171 FILL_TABLE("Menu/File/SynchroniseFolders", M_WANT_SYNC);
3172 FILL_TABLE("Menu/File/Exit", M_UNLOCKED);
3174 FILL_TABLE("Menu/Edit/SelectThread", M_TARGET_EXIST, M_SUMMARY_ISLIST);
3175 FILL_TABLE("Menu/Edit/Find", M_SINGLE_TARGET_EXIST);
3176 FILL_TABLE("Menu/Edit/QuickSearch", M_IN_MSGLIST);
3177 FILL_TABLE("Menu/Edit/SearchFolder", M_TARGET_EXIST, M_SUMMARY_ISLIST);
3179 FILL_TABLE("Menu/View/SetColumns/Folderlist", M_UNLOCKED, M_SUMMARY_ISLIST);
3180 FILL_TABLE("Menu/View/Sort", M_EXEC, M_SUMMARY_ISLIST);
3181 FILL_TABLE("Menu/View/ThreadView", M_EXEC, M_SUMMARY_ISLIST);
3182 FILL_TABLE("Menu/View/ExpandThreads", M_MSG_EXIST, M_SUMMARY_ISLIST);
3183 FILL_TABLE("Menu/View/CollapseThreads", M_MSG_EXIST, M_SUMMARY_ISLIST);
3184 FILL_TABLE("Menu/View/HideReadThreads", M_HIDE_READ_THREADS, M_SUMMARY_ISLIST, M_NOT_DRAFT);
3185 FILL_TABLE("Menu/View/HideReadMessages", M_HIDE_READ_MSG, M_SUMMARY_ISLIST, M_NOT_DRAFT);
3186 FILL_TABLE("Menu/View/HideDelMessages", M_SUMMARY_ISLIST, M_NOT_DRAFT);
3187 FILL_TABLE("Menu/View/Goto/Prev", M_MSG_EXIST);
3188 FILL_TABLE("Menu/View/Goto/Next", M_MSG_EXIST);
3189 FILL_TABLE("Menu/View/Goto/PrevUnread", M_MSG_EXIST);
3190 FILL_TABLE("Menu/View/Goto/NextUnread", M_MSG_EXIST);
3191 FILL_TABLE("Menu/View/Goto/PrevNew", M_MSG_EXIST);
3192 FILL_TABLE("Menu/View/Goto/NextNew", M_MSG_EXIST);
3193 FILL_TABLE("Menu/View/Goto/PrevMarked", M_MSG_EXIST);
3194 FILL_TABLE("Menu/View/Goto/NextMarked", M_MSG_EXIST);
3195 FILL_TABLE("Menu/View/Goto/PrevLabeled", M_MSG_EXIST);
3196 FILL_TABLE("Menu/View/Goto/NextLabeled", M_MSG_EXIST);
3197 FILL_TABLE("Menu/View/Goto/ParentMessage", M_SINGLE_TARGET_EXIST);
3198 FILL_TABLE("Menu/View/Goto/NextPart", M_SINGLE_TARGET_EXIST);
3199 FILL_TABLE("Menu/View/Goto/PrevPart", M_SINGLE_TARGET_EXIST);
3200 FILL_TABLE("Menu/View/OpenNewWindow", M_SINGLE_TARGET_EXIST);
3201 FILL_TABLE("Menu/View/MessageSource", M_SINGLE_TARGET_EXIST);
3202 FILL_TABLE("Menu/View/Part", M_SINGLE_TARGET_EXIST);
3203 FILL_TABLE("Menu/View/AllHeaders", M_SINGLE_TARGET_EXIST);
3204 FILL_TABLE("Menu/View/Quotes", M_SINGLE_TARGET_EXIST);
3206 FILL_TABLE("Menu/Message/Receive/CurrentAccount", M_HAVE_ACCOUNT, M_UNLOCKED, M_HAVE_RETRIEVABLE_ACCOUNT);
3207 FILL_TABLE("Menu/Message/Receive/AllAccounts", M_HAVE_ACCOUNT, M_UNLOCKED, M_HAVE_ANY_RETRIEVABLE_ACCOUNT);
3208 FILL_TABLE("Menu/Message/Receive/CancelReceiving", M_INC_ACTIVE);
3209 FILL_TABLE("Menu/Message/SendQueue", M_HAVE_ACCOUNT, M_HAVE_QUEUED_MAILS);
3210 FILL_TABLE("Menu/Message/CancelSending", M_SEND_ACTIVE);
3211 FILL_TABLE("Menu/Message/ComposeEmail", M_HAVE_ACCOUNT);
3212 FILL_TABLE("Menu/Message/ComposeNews", M_HAVE_NEWS_ACCOUNT);
3213 FILL_TABLE("Menu/Message/Reply", M_HAVE_ACCOUNT, M_TARGET_EXIST, M_SUMMARY_ISLIST);
3214 FILL_TABLE("Menu/Message/ReplyTo", M_HAVE_ACCOUNT, M_TARGET_EXIST, M_SUMMARY_ISLIST);
3215 FILL_TABLE("Menu/Message/FollowupReply", M_HAVE_ACCOUNT, M_TARGET_EXIST, M_NEWS, M_SUMMARY_ISLIST);
3216 FILL_TABLE("Menu/Message/Forward", M_HAVE_ACCOUNT, M_TARGET_EXIST, M_SUMMARY_ISLIST);
3217 FILL_TABLE("Menu/Message/ForwardAtt", M_HAVE_ACCOUNT, M_TARGET_EXIST, M_SUMMARY_ISLIST);
3218 FILL_TABLE("Menu/Message/Redirect", M_HAVE_ACCOUNT, M_TARGET_EXIST, M_SUMMARY_ISLIST);
3219 FILL_TABLE("Menu/Message/Move", M_TARGET_EXIST, M_ALLOW_DELETE, M_NOT_NEWS);
3220 FILL_TABLE("Menu/Message/Copy", M_TARGET_EXIST, M_EXEC);
3221 FILL_TABLE("Menu/Message/Trash", M_TARGET_EXIST, M_ALLOW_DELETE, M_NOT_NEWS, M_NOT_TRASH);
3222 FILL_TABLE("Menu/Message/Delete", M_TARGET_EXIST, M_ALLOW_DELETE);
3223 FILL_TABLE("Menu/Message/TrashThread", M_TARGET_EXIST, M_SUMMARY_ISLIST);
3224 FILL_TABLE("Menu/Message/DeleteThread", M_TARGET_EXIST, M_SUMMARY_ISLIST);
3225 FILL_TABLE("Menu/Message/CancelNews", M_TARGET_EXIST, M_ALLOW_DELETE, M_NEWS);
3226 FILL_TABLE("Menu/Message/Mark", M_TARGET_EXIST, M_SUMMARY_ISLIST);
3227 FILL_TABLE("Menu/Message/Mark/MarkSpam", M_TARGET_EXIST, M_CAN_LEARN_SPAM);
3228 FILL_TABLE("Menu/Message/Mark/MarkHam", M_TARGET_EXIST, M_CAN_LEARN_SPAM);
3229 FILL_TABLE("Menu/Message/Mark/IgnoreThread", M_TARGET_EXIST);
3230 FILL_TABLE("Menu/Message/Mark/UnignoreThread", M_TARGET_EXIST);
3231 FILL_TABLE("Menu/Message/Mark/Lock", M_TARGET_EXIST);
3232 FILL_TABLE("Menu/Message/Mark/Unlock", M_TARGET_EXIST);
3233 FILL_TABLE("Menu/Message/ColorLabel", M_TARGET_EXIST);
3234 FILL_TABLE("Menu/Message/Tags", M_TARGET_EXIST);
3235 FILL_TABLE("Menu/Message/Reedit", M_HAVE_ACCOUNT, M_ALLOW_REEDIT);
3236 FILL_TABLE("Menu/Message/CheckSignature", M_SINGLE_TARGET_EXIST);
3238 FILL_TABLE("Menu/Tools/AddSenderToAB", M_SINGLE_TARGET_EXIST);
3239 FILL_TABLE("Menu/Tools/CollectAddresses", M_FOLDER_SELECTED);
3240 FILL_TABLE("Menu/Tools/CollectAddresses/FromFolder", M_FOLDER_SELECTED);
3241 FILL_TABLE("Menu/Tools/CollectAddresses/FromSelected", M_TARGET_EXIST);
3242 FILL_TABLE("Menu/Tools/FilterFolder", M_MSG_EXIST, M_EXEC);
3243 FILL_TABLE("Menu/Tools/FilterSelected", M_TARGET_EXIST, M_EXEC);
3244 FILL_TABLE("Menu/Tools/RunProcessing", M_HAVE_PROCESSING);
3245 FILL_TABLE("Menu/Tools/CreateFilterRule", M_SINGLE_TARGET_EXIST, M_UNLOCKED);
3246 FILL_TABLE("Menu/Tools/CreateProcessingRule", M_SINGLE_TARGET_EXIST, M_UNLOCKED);
3247 FILL_TABLE("Menu/Tools/ListUrls", M_TARGET_EXIST);
3248 FILL_TABLE("Menu/Tools/Actions", M_TARGET_EXIST, M_ACTIONS_EXIST);
3249 FILL_TABLE("Menu/Tools/Execute", M_DELAY_EXEC);
3250 FILL_TABLE("Menu/Tools/Expunge", M_DELETED_EXISTS);
3251 FILL_TABLE("Menu/Tools/ForgetSessionPasswords", M_SESSION_PASSWORDS);
3252 #ifndef PASSWORD_CRYPTO_OLD
3253 FILL_TABLE("Menu/Tools/ForgetMasterPassphrase", M_MASTER_PASSPHRASE);
3255 FILL_TABLE("Menu/Tools/DeleteDuplicates/SelFolder", M_MSG_EXIST, M_ALLOW_DELETE);
3257 FILL_TABLE("Menu/Configuration", M_UNLOCKED);
3258 FILL_TABLE("Menu/Configuration/ChangeAccount", M_HAVE_MULTI_ACCOUNT);
3259 FILL_TABLE("Menu/Configuration/AccountPrefs", M_UNLOCKED);
3260 FILL_TABLE("Menu/Configuration/CreateAccount", M_UNLOCKED);
3261 FILL_TABLE("Menu/Configuration/EditAccounts", M_UNLOCKED);
3262 FILL_TABLE(NULL, -1);
3265 g_error("main window menu entry table overrun (%d/%d)", i, N_ENTRIES);
3268 state = main_window_get_current_state(mainwin);
3270 for (i = 0; entry[i].entry != NULL; i++) {
3271 sensitive = ((entry[i].cond & state) == entry[i].cond);
3272 cm_menu_set_sensitive_full(mainwin->ui_manager, entry[i].entry, sensitive);
3275 menu = gtk_menu_item_get_submenu(GTK_MENU_ITEM(
3276 gtk_ui_manager_get_widget(mainwin->ui_manager, "/Menu/Message/Receive")));
3278 children = gtk_container_get_children(GTK_CONTAINER(menu));
3279 for (cur_item = children; cur_item != NULL; cur_item = cur_item->next) {
3280 if (cur_item->data == gtk_ui_manager_get_widget(mainwin->ui_manager, "/Menu/Message/Receive/Separator1")) {
3281 cur_item = cur_item->next;
3286 for (; cur_item != NULL; cur_item = cur_item->next) {
3287 gtk_widget_set_sensitive(GTK_WIDGET(cur_item->data),
3288 (main_window_get_mask(M_UNLOCKED, -1) & state) != 0);
3291 g_list_free(children);
3293 main_window_menu_callback_block(mainwin);
3295 cm_toggle_menu_set_active_full(mainwin->ui_manager, "Menu/View/ShowHide/MessageView",
3296 messageview_is_visible(mainwin->messageview));
3298 summaryview = mainwin->summaryview;
3300 switch (summaryview->sort_key) {
3301 case SORT_BY_NUMBER:
3302 menu_path = "Menu/View/Sort/Number"; break;
3304 menu_path = "Menu/View/Sort/Size"; break;
3306 menu_path = "Menu/View/Sort/Date"; break;
3307 case SORT_BY_THREAD_DATE:
3308 menu_path = "Menu/View/Sort/ThreadDate"; break;
3310 menu_path = "Menu/View/Sort/From"; break;
3312 menu_path = "Menu/View/Sort/To"; break;
3313 case SORT_BY_SUBJECT:
3314 menu_path = "Menu/View/Sort/Subject"; break;
3316 menu_path = "Menu/View/Sort/Color"; break;
3318 menu_path = "Menu/View/Sort/Mark"; break;
3319 case SORT_BY_STATUS:
3320 menu_path = "Menu/View/Sort/Status"; break;
3322 menu_path = "Menu/View/Sort/Attachment"; break;
3324 menu_path = "Menu/View/Sort/Score"; break;
3325 case SORT_BY_LOCKED:
3326 menu_path = "Menu/View/Sort/Locked"; break;
3328 menu_path = "Menu/View/Sort/Tag"; break;
3331 menu_path = "Menu/View/Sort/DontSort"; break;
3333 cm_toggle_menu_set_active_full(mainwin->ui_manager, menu_path, TRUE);
3335 if (summaryview->sort_type == SORT_ASCENDING) {
3336 cm_toggle_menu_set_active_full(mainwin->ui_manager, "Menu/View/Sort/Ascending", TRUE);
3338 cm_toggle_menu_set_active_full(mainwin->ui_manager, "Menu/View/Sort/Descending", TRUE);
3341 if (summaryview->sort_key != SORT_BY_NONE) {
3342 cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/View/Sort/Ascending", TRUE);
3343 cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/View/Sort/Descending", TRUE);
3345 cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/View/Sort/Ascending", FALSE);
3346 cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/View/Sort/Descending", FALSE);
3349 if (mainwin->messageview
3350 && mainwin->messageview->mimeview
3351 && mainwin->messageview->mimeview->textview)
3352 cm_toggle_menu_set_active_full(mainwin->ui_manager, "Menu/View/AllHeaders",
3353 prefs_common.show_all_headers);
3354 cm_toggle_menu_set_active_full(mainwin->ui_manager, "Menu/View/ThreadView", (state & main_window_get_mask(M_THREADED, -1)) != 0);
3355 cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/View/ExpandThreads", (state & main_window_get_mask(M_THREADED, -1)) != 0);
3356 cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/View/CollapseThreads", (state & main_window_get_mask(M_THREADED, -1)) != 0);
3357 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);
3358 cm_toggle_menu_set_active_full(mainwin->ui_manager, "Menu/View/Quotes/CollapseAll", (prefs_common.hide_quotes == 1));
3359 cm_toggle_menu_set_active_full(mainwin->ui_manager, "Menu/View/Quotes/Collapse2", (prefs_common.hide_quotes == 2));
3360 cm_toggle_menu_set_active_full(mainwin->ui_manager, "Menu/View/Quotes/Collapse3", (prefs_common.hide_quotes == 3));
3362 if (mainwin->summaryview->folder_item && !mainwin->summaryview->folder_item->threaded)
3363 cm_toggle_menu_set_active_full(mainwin->ui_manager, "Menu/View/HideReadThreads", FALSE);
3364 if ((mainwin->summaryview->folder_item && mainwin->summaryview->folder_item->hide_read_msgs) ||
3365 quicksearch_has_sat_predicate(mainwin->summaryview->quicksearch))
3366 cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/View/HideReadThreads", FALSE);
3367 if ((mainwin->summaryview->folder_item && mainwin->summaryview->folder_item->hide_read_threads) ||
3368 quicksearch_has_sat_predicate(mainwin->summaryview->quicksearch))
3369 cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/View/HideReadMessages", FALSE);
3370 if (quicksearch_has_sat_predicate(mainwin->summaryview->quicksearch))
3371 cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/View/HideDelMessages", FALSE);
3373 cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/View/Goto/PrevHistory",
3374 messageview_nav_has_prev(mainwin->messageview));
3375 cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/View/Goto/NextHistory",
3376 messageview_nav_has_next(mainwin->messageview));
3378 if (mainwin->messageview
3379 && mainwin->messageview->mimeview)
3380 mimepart_selected = !mimeview_tree_is_empty(mainwin->messageview->mimeview);
3382 cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/File/SavePartAs", mimepart_selected);
3383 cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/View/Goto/NextPart", mimepart_selected);
3384 cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/View/Goto/PrevPart", mimepart_selected);
3385 cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/View/Part", mimepart_selected);
3386 cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/Message/CheckSignature",
3387 mimepart_selected && mainwin->messageview->mimeview->signed_part);
3390 if (mimepart_selected) {
3391 MimeInfo *partinfo = messageview_get_selected_mime_part(mainwin->messageview);
3393 if (partinfo && (partinfo->type == MIMETYPE_MESSAGE ||
3394 partinfo->type == MIMETYPE_IMAGE ||
3395 partinfo->type == MIMETYPE_MULTIPART)) {
3399 cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/View/Part/AsText", sensitive);
3401 main_window_menu_callback_unblock(mainwin);
3404 void main_create_mailing_list_menu (MainWindow *mainwin, MsgInfo *msginfo)
3409 is_menu = mailing_list_create_submenu (mainwin, msginfo);
3411 cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/Message/MailingList", TRUE);
3413 cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/Message/MailingList", FALSE);
3416 static gint mailing_list_create_submenu (MainWindow *mainwin, MsgInfo *msginfo)
3419 GtkWidget *menuitem;
3421 if (!msginfo || !msginfo->extradata) {
3422 cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/Message/MailingList/Post", FALSE);
3423 cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/Message/MailingList/Help", FALSE);
3424 cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/Message/MailingList/Subscribe", FALSE);
3425 cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/Message/MailingList/Unsubscribe", FALSE);
3426 cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/Message/MailingList/ViewArchive", FALSE);
3427 cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/Message/MailingList/ContactOwner", FALSE);
3431 /* Mailing list post */
3432 if (!g_strcmp0 (msginfo->extradata->list_post, "NO")) {
3433 g_free(msginfo->extradata->list_post);
3434 msginfo->extradata->list_post = g_strdup (_("No posting allowed"));
3436 menuitem = gtk_ui_manager_get_widget(mainwin->ui_manager, "/Menu/Message/MailingList/Post");
3438 menu_nb += mailing_list_populate_submenu (menuitem, msginfo->extradata->list_post);
3440 /* Mailing list help */
3441 menuitem = gtk_ui_manager_get_widget(mainwin->ui_manager, "/Menu/Message/MailingList/Help");
3443 menu_nb += mailing_list_populate_submenu (menuitem, msginfo->extradata->list_help);
3445 /* Mailing list subscribe */
3446 menuitem = gtk_ui_manager_get_widget(mainwin->ui_manager, "/Menu/Message/MailingList/Subscribe");
3448 menu_nb += mailing_list_populate_submenu (menuitem, msginfo->extradata->list_subscribe);
3450 /* Mailing list unsubscribe */
3451 menuitem = gtk_ui_manager_get_widget(mainwin->ui_manager, "/Menu/Message/MailingList/Unsubscribe");
3453 menu_nb += mailing_list_populate_submenu (menuitem, msginfo->extradata->list_unsubscribe);
3455 /* Mailing list view archive */
3456 menuitem = gtk_ui_manager_get_widget(mainwin->ui_manager, "/Menu/Message/MailingList/ViewArchive");
3458 menu_nb += mailing_list_populate_submenu (menuitem, msginfo->extradata->list_archive);
3460 /* Mailing list contact owner */
3461 menuitem = gtk_ui_manager_get_widget(mainwin->ui_manager, "/Menu/Message/MailingList/ContactOwner");
3463 menu_nb += mailing_list_populate_submenu (menuitem, msginfo->extradata->list_owner);
3468 static gint mailing_list_populate_submenu (GtkWidget *menuitem, const gchar * list_header)
3470 GtkWidget *item, *menu;
3471 const gchar *url_pt ;
3472 gchar url_decoded[BUFFSIZE];
3473 GList *children, *amenu;
3476 menu = gtk_menu_item_get_submenu(GTK_MENU_ITEM(menuitem));
3478 /* First delete old submenu */
3479 /* FIXME: we can optimize this, and only change/add/delete necessary items */
3480 children = gtk_container_get_children(GTK_CONTAINER(menu));
3481 for (amenu = children; amenu; amenu = amenu->next) {
3482 item = GTK_WIDGET (amenu->data);
3483 gtk_widget_destroy (item);
3485 g_list_free(children);
3487 for (url_pt = list_header; url_pt && *url_pt;) {
3488 get_url_part (&url_pt, url_decoded);
3490 if (!g_ascii_strncasecmp(url_decoded, "mailto:", 7)) {
3491 item = cm_menu_item_new_label_from_url ((url_decoded));
3492 g_signal_connect(G_OBJECT(item), "activate",
3493 G_CALLBACK(mailing_list_compose),
3496 else if (!g_ascii_strncasecmp(url_decoded, "http:", 5) ||
3497 !g_ascii_strncasecmp(url_decoded, "https:",6)) {
3499 item = cm_menu_item_new_label_from_url ((url_decoded));
3500 g_signal_connect(G_OBJECT(item), "activate",
3501 G_CALLBACK(mailing_list_open_uri),
3505 gtk_menu_shell_append(GTK_MENU_SHELL(menu), item);
3506 gtk_widget_show (item);
3512 gtk_widget_set_sensitive (menuitem, TRUE);
3514 gtk_widget_set_sensitive (menuitem, FALSE);
3520 static void get_url_part (const gchar **buffer, gchar *url_decoded)
3522 gchar tmp[BUFFSIZE];
3526 gboolean with_plus = TRUE;
3529 *url_decoded = '\0';
3533 /* Ignore spaces, comments and tabs () */
3534 for (;*buf == ' ' || *buf == '(' || *buf == '\t'; buf++)
3536 for (;*buf != ')' && *buf != 0x00; buf++);
3538 /* First non space and non comment must be a < */
3541 if (!strncmp(buf, "mailto:", strlen("mailto:")))
3544 *buf != '>' && *buf != 0x00 && i < BUFFSIZE;
3545 tmp[i++] = *(buf++));
3548 *url_decoded = '\0';
3555 *url_decoded = '\0';
3559 *url_decoded = '\0';
3562 if (i == BUFFSIZE) {
3566 decode_uri_with_plus (url_decoded, (const gchar *)tmp, with_plus);
3568 /* Prepare the work for the next url in the list */
3569 /* after the closing bracket >, ignore space, comments and tabs */
3570 for (;buf && *buf && (*buf == ' ' || *buf == '(' || *buf == '\t'); buf++)
3572 for (;*buf != ')' && *buf != 0x00; buf++);
3574 if (!buf || !*buf) {
3579 /* now first non space, non comment must be a comma */
3581 for (;*buf != 0x00; buf++);
3587 static void mailing_list_compose (GtkWidget *w, gpointer *data)
3589 const gchar *mailto;
3590 PrefsAccount *account = NULL;
3591 FolderItem *folder_item = NULL;
3593 mailto = gtk_label_get_text(GTK_LABEL (gtk_bin_get_child(GTK_BIN((w)))));
3594 if (mainwindow_get_mainwindow()) {
3595 folder_item = mainwindow_get_mainwindow()->summaryview->folder_item;
3596 if (folder_item && folder_item->prefs && folder_item->prefs->enable_default_account)
3597 account = account_find_from_id(folder_item->prefs->default_account);
3598 if (folder_item && !account)
3599 account = account_find_from_item(folder_item);
3602 compose_new_with_folderitem(account, folder_item, mailto+7);
3605 static void mailing_list_open_uri (GtkWidget *w, gpointer *data)
3608 const gchar *mailto;
3610 mailto = gtk_label_get_text(GTK_LABEL (gtk_bin_get_child(GTK_BIN((w)))));
3612 open_uri (mailto, prefs_common_get_uri_cmd());
3615 static void fix_folderview_scroll(MainWindow *mainwin)
3617 static gboolean fix_done = FALSE;
3622 gtk_widget_queue_resize(mainwin->folderview->ctree);
3627 void main_window_popup(MainWindow *mainwin)
3629 static gboolean first_start = TRUE;
3631 if (!gtk_widget_get_visible(GTK_WIDGET(mainwin->window)))
3632 main_window_show(mainwin);
3634 if (prefs_common.mainwin_maximised)
3635 gtk_window_maximize(GTK_WINDOW(mainwin->window));
3638 first_start = FALSE;
3640 gtkut_window_popup(mainwin->window);
3643 if (prefs_common.layout_mode == SMALL_LAYOUT) {
3644 if (mainwin->in_folder) {
3645 mainwindow_enter_folder(mainwin);
3647 mainwindow_exit_folder(mainwin);
3650 fix_folderview_scroll(mainwin);
3653 void main_window_show(MainWindow *mainwin)
3655 gtk_widget_show(mainwin->window);
3656 gtk_widget_show(mainwin->vbox_body);
3657 #ifndef GENERIC_UMPC
3658 gtk_window_move(GTK_WINDOW(mainwin->window),
3659 prefs_common.mainwin_x,
3660 prefs_common.mainwin_y);
3662 gtk_widget_set_size_request(GTK_WIDGET_PTR(mainwin->folderview),
3663 prefs_common.folderview_width,
3664 prefs_common.folderview_height);
3665 gtk_widget_set_size_request(GTK_WIDGET_PTR(mainwin->summaryview),
3666 prefs_common.summaryview_width,
3667 prefs_common.summaryview_height);
3668 gtk_widget_set_size_request(GTK_WIDGET_PTR(mainwin->messageview),
3669 prefs_common.msgview_width,
3670 prefs_common.msgview_height);
3674 void main_window_hide(MainWindow *mainwin)
3676 main_window_get_size(mainwin);
3677 main_window_get_position(mainwin);
3679 gtk_widget_hide(mainwin->window);
3680 gtk_widget_hide(mainwin->vbox_body);
3683 static void main_window_set_widgets(MainWindow *mainwin, LayoutType layout_mode)
3685 GtkWidget *folderwin = NULL;
3686 GtkWidget *messagewin = NULL;
3689 GtkWidget *vbox_body = mainwin->vbox_body;
3690 gboolean first_set = (mainwin->hpaned == NULL);
3691 debug_print("Setting widgets...\n");
3693 #ifndef GENERIC_UMPC
3694 mainwin->messageview->statusbar = mainwin->statusbar;
3695 mainwin->messageview->statusbar_cid = mainwin->messageview_cid;
3697 /* clean top-most container */
3698 if (mainwin->hpaned) {
3699 if (gtk_widget_get_parent(mainwin->hpaned) == mainwin->vpaned)
3700 gtk_widget_destroy(mainwin->vpaned);
3702 gtk_widget_destroy(mainwin->hpaned);
3705 cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/View/ShowHide/MessageView",
3706 (layout_mode != WIDE_MSGLIST_LAYOUT && layout_mode != SMALL_LAYOUT));
3707 switch (layout_mode) {
3708 case VERTICAL_LAYOUT:
3711 hpaned = gtk_hpaned_new();
3712 if (layout_mode == VERTICAL_LAYOUT)
3713 vpaned = gtk_hpaned_new();
3715 vpaned = gtk_vpaned_new();
3716 gtk_box_pack_start(GTK_BOX(vbox_body), hpaned, TRUE, TRUE, 0);
3717 gtk_paned_add1(GTK_PANED(hpaned),
3718 GTK_WIDGET_PTR(mainwin->folderview));
3719 gtk_widget_show(hpaned);
3720 gtk_widget_queue_resize(hpaned);
3722 if (messageview_is_visible(mainwin->messageview)) {
3723 gtk_paned_add2(GTK_PANED(hpaned), vpaned);
3724 gtk_paned_pack1(GTK_PANED(vpaned),
3725 GTK_WIDGET_PTR(mainwin->summaryview), TRUE, TRUE);
3727 gtk_paned_add2(GTK_PANED(hpaned),
3728 GTK_WIDGET_PTR(mainwin->summaryview));
3729 g_object_ref(vpaned);
3731 gtk_paned_add2(GTK_PANED(vpaned),
3732 GTK_WIDGET_PTR(mainwin->messageview));
3733 gtk_widget_show(vpaned);
3734 if (layout_mode == SMALL_LAYOUT && first_set) {
3735 mainwin_paned_show_first(GTK_PANED(hpaned));
3737 gtk_widget_queue_resize(vpaned);
3740 vpaned = gtk_vpaned_new();
3741 hpaned = gtk_hpaned_new();
3742 gtk_box_pack_start(GTK_BOX(vbox_body), vpaned, TRUE, TRUE, 0);
3743 gtk_paned_add1(GTK_PANED(vpaned), hpaned);
3745 gtk_paned_add1(GTK_PANED(hpaned),
3746 GTK_WIDGET_PTR(mainwin->folderview));
3747 gtk_paned_add2(GTK_PANED(hpaned),
3748 GTK_WIDGET_PTR(mainwin->summaryview));
3750 gtk_widget_show(hpaned);
3751 gtk_widget_queue_resize(hpaned);
3753 if (messageview_is_visible(mainwin->messageview)) {
3754 gtk_paned_add2(GTK_PANED(vpaned),
3755 GTK_WIDGET_PTR(mainwin->messageview));
3757 g_object_ref(GTK_WIDGET_PTR(mainwin->messageview));
3759 gtk_widget_show(vpaned);
3760 gtk_widget_queue_resize(vpaned);
3762 case WIDE_MSGLIST_LAYOUT:
3763 vpaned = gtk_vpaned_new();
3764 hpaned = gtk_hpaned_new();
3765 gtk_box_pack_start(GTK_BOX(vbox_body), vpaned, TRUE, TRUE, 0);
3767 gtk_paned_add1(GTK_PANED(vpaned),
3768 GTK_WIDGET_PTR(mainwin->summaryview));
3769 gtk_paned_add1(GTK_PANED(hpaned),
3770 GTK_WIDGET_PTR(mainwin->folderview));
3772 gtk_widget_show(hpaned);
3773 gtk_widget_queue_resize(hpaned);
3775 if (messageview_is_visible(mainwin->messageview)) {
3776 gtk_paned_add2(GTK_PANED(hpaned),
3777 GTK_WIDGET_PTR(mainwin->messageview));
3779 g_object_ref(GTK_WIDGET_PTR(mainwin->messageview));
3781 gtk_paned_add2(GTK_PANED(vpaned), hpaned);
3783 gtk_widget_show(vpaned);
3784 gtk_widget_queue_resize(vpaned);
3787 g_warning("Unknown layout");
3791 mainwin->hpaned = hpaned;
3792 mainwin->vpaned = vpaned;
3794 if (layout_mode == SMALL_LAYOUT) {
3795 if (mainwin->messageview->visible)
3796 main_window_toggle_message_view(mainwin);
3799 if (layout_mode == SMALL_LAYOUT && first_set) {
3800 gtk_widget_realize(mainwin->window);
3801 gtk_widget_realize(mainwin->folderview->ctree);
3802 gtk_widget_realize(mainwin->summaryview->hbox);
3803 gtk_widget_realize(mainwin->summaryview->hbox_l);
3804 gtk_widget_set_size_request(GTK_WIDGET_PTR(mainwin->folderview),
3805 prefs_common.folderview_width,
3806 prefs_common.folderview_height);
3807 gtk_widget_set_size_request(GTK_WIDGET_PTR(mainwin->summaryview),
3809 gtk_widget_set_size_request(GTK_WIDGET_PTR(mainwin->messageview),
3811 gtk_widget_set_size_request(GTK_WIDGET(mainwin->window),
3812 prefs_common.mainwin_width,
3813 prefs_common.mainwin_height);
3814 gtk_paned_set_position(GTK_PANED(mainwin->hpaned), 800);
3816 gtk_widget_set_size_request(GTK_WIDGET_PTR(mainwin->folderview),
3817 prefs_common.folderview_width,
3818 prefs_common.folderview_height);
3819 gtk_widget_set_size_request(GTK_WIDGET_PTR(mainwin->summaryview),
3820 prefs_common.summaryview_width,
3821 prefs_common.summaryview_height);
3822 gtk_widget_set_size_request(GTK_WIDGET_PTR(mainwin->messageview),
3823 prefs_common.msgview_width,
3824 prefs_common.msgview_height);
3825 gtk_widget_set_size_request(GTK_WIDGET(mainwin->window),
3826 prefs_common.mainwin_width,
3827 prefs_common.mainwin_height);
3829 /* remove headerview if not in prefs */
3830 headerview_set_visibility(mainwin->messageview->headerview,
3831 prefs_common.display_header_pane);
3833 if (messageview_is_visible(mainwin->messageview))
3834 gtk_arrow_set(GTK_ARROW(mainwin->summaryview->toggle_arrow),
3835 GTK_ARROW_DOWN, GTK_SHADOW_OUT);
3837 gtk_arrow_set(GTK_ARROW(mainwin->summaryview->toggle_arrow),
3838 GTK_ARROW_UP, GTK_SHADOW_OUT);
3840 gtk_window_move(GTK_WINDOW(mainwin->window),
3841 prefs_common.mainwin_x,
3842 prefs_common.mainwin_y);
3844 gtk_widget_queue_resize(vbox_body);
3845 gtk_widget_queue_resize(mainwin->vbox);
3846 gtk_widget_queue_resize(mainwin->window);
3847 /* CLAWS: previous "gtk_widget_show_all" makes noticeview
3848 * and mimeview icon list/ctree lose track of their visibility states */
3849 if (!noticeview_is_visible(mainwin->messageview->noticeview))
3850 gtk_widget_hide(GTK_WIDGET_PTR(mainwin->messageview->noticeview));
3851 if (!noticeview_is_visible(mainwin->messageview->mimeview->siginfoview))
3852 gtk_widget_hide(GTK_WIDGET_PTR(mainwin->messageview->mimeview->siginfoview));
3853 if (mainwin->messageview->mimeview->ctree_mode)
3854 gtk_widget_hide(mainwin->messageview->mimeview->icon_mainbox);
3856 gtk_widget_hide(mainwin->messageview->mimeview->ctree_mainbox);
3858 prefs_common.layout_mode = layout_mode;
3860 cm_toggle_menu_set_active_full(mainwin->ui_manager, "Menu/View/ShowHide/MessageView",
3861 messageview_is_visible(mainwin->messageview));
3863 #ifndef GENERIC_UMPC
3864 switch (prefs_common.layout_mode) {
3866 cm_toggle_menu_set_active_full(mainwin->ui_manager, "Menu/View/Layout/Standard", TRUE);
3868 case VERTICAL_LAYOUT:
3869 cm_toggle_menu_set_active_full(mainwin->ui_manager, "Menu/View/Layout/ThreeColumns", TRUE);
3872 cm_toggle_menu_set_active_full(mainwin->ui_manager, "Menu/View/Layout/WideMessage", TRUE);
3874 case WIDE_MSGLIST_LAYOUT:
3875 cm_toggle_menu_set_active_full(mainwin->ui_manager, "Menu/View/Layout/WideMessageList", TRUE);
3878 cm_toggle_menu_set_active_full(mainwin->ui_manager, "Menu/View/Layout/SmallScreen", TRUE);
3885 (G_OBJECT(folderwin), "size_allocate",
3886 G_CALLBACK(folder_window_size_allocate_cb),
3891 (G_OBJECT(messagewin), "size_allocate",
3892 G_CALLBACK(message_window_size_allocate_cb),
3896 debug_print("Setting widgets done.\n");
3899 void main_window_destroy_all(void)
3901 while (mainwin_list != NULL) {
3902 MainWindow *mainwin = (MainWindow*)mainwin_list->data;
3904 /* free toolbar stuff */
3905 toolbar_clear_list(TOOLBAR_MAIN);
3906 toolbar_destroy(mainwin->toolbar);
3908 summaryview_destroy(mainwin->summaryview);
3909 mainwin->folderview->mainwin = NULL;
3910 mainwin->summaryview->mainwin = NULL;
3911 mainwin->messageview->mainwin = NULL;
3913 g_free(mainwin->toolbar);
3916 mainwin_list = g_list_remove(mainwin_list, mainwin);
3918 g_list_free(mainwin_list);
3919 mainwin_list = NULL;
3922 static void toolbar_child_attached(GtkWidget *widget, GtkWidget *child,
3925 gtk_widget_set_size_request(child, 1, -1);
3928 static void toolbar_child_detached(GtkWidget *widget, GtkWidget *child,
3931 gtk_widget_set_size_request(child, -1, -1);
3933 #ifndef GENERIC_UMPC
3934 static gboolean ac_label_button_pressed(GtkWidget *widget, GdkEventButton *event,
3937 MainWindow *mainwin = (MainWindow *)data;
3938 GtkWidget *menu = NULL;
3940 if (!event) return FALSE;
3942 gtk_button_set_relief(GTK_BUTTON(widget), GTK_RELIEF_NORMAL);
3944 menu = gtk_menu_item_get_submenu(GTK_MENU_ITEM(mainwin->ac_menu));
3946 gtk_menu_popup(GTK_MENU(menu), NULL, NULL,
3947 menu_button_position, widget,
3948 event->button, event->time);
3953 static gint main_window_close_cb(GtkWidget *widget, GdkEventAny *event,
3956 MainWindow *mainwin = (MainWindow *)data;
3957 gboolean close_allowed = TRUE;
3959 hooks_invoke(MAIN_WINDOW_CLOSE, &close_allowed);
3961 if (close_allowed && mainwin->lock_count == 0)
3962 app_exit_cb(NULL, data);
3967 static void main_window_size_allocate_cb(GtkWidget *widget,
3968 GtkAllocation *allocation,
3971 MainWindow *mainwin = (MainWindow *)data;
3972 main_window_get_size(mainwin);
3975 static void folder_window_size_allocate_cb(GtkWidget *widget,
3976 GtkAllocation *allocation,
3979 MainWindow *mainwin = (MainWindow *)data;
3981 main_window_get_size(mainwin);
3984 static void message_window_size_allocate_cb(GtkWidget *widget,
3985 GtkAllocation *allocation,
3988 MainWindow *mainwin = (MainWindow *)data;
3990 main_window_get_size(mainwin);
3993 static void add_mailbox_cb(GtkAction *action, gpointer data)
3995 MainWindow *mainwin = (MainWindow *)data;
3996 main_window_add_mailbox(mainwin);
3999 static void update_folderview_cb(GtkAction *action, gpointer data)
4001 MainWindow *mainwin = (MainWindow *)data;
4002 summary_show(mainwin->summaryview, NULL);
4003 folderview_check_new_all();
4006 static void foldersort_cb(GtkAction *action, gpointer data)
4011 static void import_mbox_cb(GtkAction *action, gpointer data)
4013 MainWindow *mainwin = (MainWindow *)data;
4014 /* only notify if import has failed */
4015 if (import_mbox(mainwin->summaryview->folder_item) == -1) {
4016 alertpanel_error(_("Mbox import has failed."));
4020 static void export_mbox_cb(GtkAction *action, gpointer data)
4022 MainWindow *mainwin = (MainWindow *)data;
4023 /* only notify if export has failed */
4024 if (export_mbox(mainwin->summaryview->folder_item) == -1) {
4025 alertpanel_error(_("Export to mbox has failed."));
4029 static void export_list_mbox_cb(GtkAction *action, gpointer data)
4031 MainWindow *mainwin = (MainWindow *)data;
4032 /* only notify if export has failed */
4033 if (summaryview_export_mbox_list(mainwin->summaryview) == -1) {
4034 alertpanel_error(_("Export to mbox has failed."));
4038 static void empty_trash_cb(GtkAction *action, gpointer data)
4040 MainWindow *mainwin = (MainWindow *)data;
4041 main_window_empty_trash(mainwin, TRUE, FALSE);
4044 static void save_as_cb(GtkAction *action, gpointer data)
4046 MainWindow *mainwin = (MainWindow *)data;
4047 summary_save_as(mainwin->summaryview);
4050 static void print_cb(GtkAction *action, gpointer data)
4052 MainWindow *mainwin = (MainWindow *)data;
4053 summary_print(mainwin->summaryview);
4056 static void page_setup_cb(GtkAction *action, gpointer data)
4058 MainWindow *mainwin = (MainWindow *)data;
4061 win = (mainwin ? GTK_WINDOW(mainwin->window) : NULL);
4063 printing_page_setup(win);
4066 static void app_exit_cb(GtkAction *action, gpointer data)
4068 MainWindow *mainwin = (MainWindow *)data;
4069 if (prefs_common.clean_on_exit) {
4070 if (!main_window_empty_trash(mainwin, prefs_common.ask_on_clean, TRUE))
4074 if (prefs_common.confirm_on_exit) {
4075 if (alertpanel(_("Exit"), _("Exit Claws Mail?"),
4076 GTK_STOCK_CANCEL, GTK_STOCK_QUIT, NULL, ALERTFOCUS_FIRST)
4077 != G_ALERTALTERNATE)
4079 manage_window_focus_in(mainwin->window, NULL, NULL);
4082 app_will_exit(NULL, mainwin);
4085 static void search_cb(GtkAction *action, gpointer data)
4087 MainWindow *mainwin = (MainWindow *)data;
4088 message_search(mainwin->messageview);
4091 static void search_folder_cb(GtkAction *action, gpointer data)
4093 MainWindow *mainwin = (MainWindow *)data;
4094 FolderItem *item = mainwin->summaryview->folder_item;
4095 cm_return_if_fail(item != NULL);
4096 summary_search(mainwin->summaryview);
4099 static void mainwindow_quicksearch(GtkAction *action, gpointer data)
4101 MainWindow *mainwin = (MainWindow *)data;
4102 summaryview_activate_quicksearch(mainwin->summaryview, TRUE);
4105 static void toggle_message_cb(GtkAction *action, gpointer data)
4107 MainWindow *mainwin = (MainWindow *)data;
4110 active = gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (action));
4112 if (active != messageview_is_visible(mainwin->messageview))
4113 summary_toggle_view(mainwin->summaryview);
4116 static void toggle_toolbar_cb(GtkAction *action, GtkRadioAction *current, gpointer data)
4118 gint value = gtk_radio_action_get_current_value (GTK_RADIO_ACTION (current));
4119 MainWindow *mainwin = (MainWindow *)data;
4120 toolbar_toggle(value, mainwin);
4123 static void main_window_reply_cb(GtkAction *gaction, gpointer data)
4125 MainWindow *mainwin = (MainWindow *)data;
4126 MessageView *msgview = (MessageView*)mainwin->messageview;
4127 GSList *msginfo_list = NULL;
4128 gint action = COMPOSE_REPLY;
4129 const gchar *a_name = gtk_action_get_name(gaction);
4131 DO_ACTION("Message/Reply", COMPOSE_REPLY);
4132 DO_ACTION("Message/ReplyTo/All", COMPOSE_REPLY_TO_ALL);
4133 DO_ACTION("Message/ReplyTo/Sender", COMPOSE_REPLY_TO_SENDER);
4134 DO_ACTION("Message/ReplyTo/List", COMPOSE_REPLY_TO_LIST);
4135 DO_ACTION("Message/Forward", COMPOSE_FORWARD_INLINE);
4136 DO_ACTION("Message/ForwardAtt", COMPOSE_FORWARD_AS_ATTACH);
4137 DO_ACTION("Message/Redirect", COMPOSE_REDIRECT);
4138 DO_ACTION("Message/FollowupReply", COMPOSE_FOLLOWUP_AND_REPLY_TO);
4140 cm_return_if_fail(msgview != NULL);
4142 msginfo_list = summary_get_selection(mainwin->summaryview);
4143 cm_return_if_fail(msginfo_list != NULL);
4145 if (!summary_has_opened_message(mainwin->summaryview)) {
4146 compose_reply_from_messageview(NULL, msginfo_list, action);
4147 } else if (summary_is_opened_message_selected(mainwin->summaryview)) {
4148 compose_reply_from_messageview(msgview, msginfo_list, action);
4150 compose_reply_from_messageview(msgview, NULL, action);
4153 g_slist_free(msginfo_list);
4156 static void toggle_col_headers_cb(GtkAction *gaction, gpointer data)
4158 MainWindow *mainwin = (MainWindow *)data;
4159 FolderView *folderview = mainwin->folderview;
4160 SummaryView *summaryview = mainwin->summaryview;
4161 MimeView *mimeview = mainwin->messageview->mimeview;
4163 if (gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (gaction))) {
4164 gtk_cmclist_column_titles_show(GTK_CMCLIST(folderview->ctree));
4165 gtk_cmclist_column_titles_show(GTK_CMCLIST(summaryview->ctree));
4166 gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(mimeview->ctree), TRUE);
4167 prefs_common.show_col_headers = TRUE;
4169 gtk_cmclist_column_titles_hide(GTK_CMCLIST(folderview->ctree));
4170 gtk_cmclist_column_titles_hide(GTK_CMCLIST(summaryview->ctree));
4171 gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(mimeview->ctree), FALSE);
4172 prefs_common.show_col_headers = FALSE;
4176 #ifndef GENERIC_UMPC
4177 static void toggle_statusbar_cb(GtkAction *gaction, gpointer data)
4179 MainWindow *mainwin = (MainWindow *)data;
4180 if (gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (gaction))) {
4181 gtk_widget_show(mainwin->hbox_stat);
4182 prefs_common.show_statusbar = TRUE;
4184 gtk_widget_hide(mainwin->hbox_stat);
4185 prefs_common.show_statusbar = FALSE;
4189 static void set_layout_cb(GtkAction *action, GtkRadioAction *current, gpointer data)
4191 MainWindow *mainwin = (MainWindow *)data;
4192 gint value = gtk_radio_action_get_current_value (GTK_RADIO_ACTION (current));
4193 LayoutType layout_mode = value;
4194 LayoutType old_layout_mode = prefs_common.layout_mode;
4195 if (mainwin->menu_lock_count) {
4198 if (!gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (current))) {
4202 if (layout_mode == prefs_common.layout_mode) {
4206 if (!mainwin->messageview->visible && layout_mode != SMALL_LAYOUT)
4207 main_window_toggle_message_view(mainwin);
4208 else if (mainwin->messageview->visible && layout_mode == SMALL_LAYOUT)
4209 main_window_toggle_message_view(mainwin);
4211 main_window_separation_change(mainwin, layout_mode);
4212 mainwindow_reset_paned(GTK_PANED(mainwin->vpaned));
4213 if (old_layout_mode == SMALL_LAYOUT && layout_mode != SMALL_LAYOUT) {
4214 mainwindow_reset_paned(GTK_PANED(mainwin->hpaned));
4215 if (layout_mode == VERTICAL_LAYOUT)
4216 mainwindow_reset_paned(GTK_PANED(mainwin->vpaned));
4218 if (old_layout_mode != SMALL_LAYOUT && layout_mode == SMALL_LAYOUT) {
4219 mainwin_paned_show_first(GTK_PANED(mainwin->hpaned));
4220 mainwindow_exit_folder(mainwin);
4222 summary_relayout(mainwin->summaryview);
4223 summary_update_unread(mainwin->summaryview, NULL);
4227 void main_window_toggle_work_offline (MainWindow *mainwin, gboolean offline,
4230 static gboolean switching = FALSE;
4237 offline_ask_sync = ask_sync;
4239 online_switch_clicked (GTK_BUTTON(mainwin->online_switch), mainwin);
4241 online_switch_clicked (GTK_BUTTON(mainwin->offline_switch), mainwin);
4242 offline_ask_sync = TRUE;
4244 inc_reset_offline_override_timers();
4249 static void toggle_work_offline_cb (GtkAction *action, gpointer data)
4251 MainWindow *mainwin = (MainWindow *)data;
4252 main_window_toggle_work_offline(mainwin, gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (action)), TRUE);
4255 static gboolean any_folder_want_synchronise(void)
4257 GList *folderlist = folder_get_list();
4259 /* see if there are synchronised folders */
4260 for (; folderlist; folderlist = folderlist->next) {
4261 Folder *folder = (Folder *)folderlist->data;
4262 if (folder_want_synchronise(folder)) {
4270 static void mainwindow_check_synchronise(MainWindow *mainwin, gboolean ask)
4273 if (!any_folder_want_synchronise())
4276 if (offline_ask_sync && ask && alertpanel(_("Folder synchronisation"),
4277 _("Do you want to synchronise your folders now?"),
4278 GTK_STOCK_CANCEL, _("_Synchronise"), NULL, ALERTFOCUS_SECOND) != G_ALERTALTERNATE)
4281 if (offline_ask_sync)
4282 folder_synchronise(NULL);
4285 static void online_switch_clicked (GtkButton *btn, gpointer data)
4287 MainWindow *mainwin;
4288 gboolean have_connectivity;
4290 #ifdef HAVE_NETWORKMANAGER_SUPPORT
4291 have_connectivity = networkmanager_is_online(NULL);
4293 have_connectivity = TRUE;
4296 mainwin = (MainWindow *) data;
4298 cm_return_if_fail(mainwin != NULL);
4300 if (btn == GTK_BUTTON(mainwin->online_switch)) {
4301 #ifndef GENERIC_UMPC
4302 gtk_widget_hide (mainwin->online_switch);
4303 gtk_widget_show (mainwin->offline_switch);
4305 cm_toggle_menu_set_active_full(mainwin->ui_manager, "Menu/File/OfflineMode", TRUE);
4307 inc_autocheck_timer_remove();
4310 if (prefs_common.work_offline)
4313 if(have_connectivity)
4314 mainwindow_check_synchronise(mainwin, TRUE);
4315 prefs_common.work_offline = TRUE;
4316 imap_disconnect_all(have_connectivity);
4317 nntp_disconnect_all(have_connectivity);
4318 hooks_invoke(OFFLINE_SWITCH_HOOKLIST, NULL);
4321 if (!prefs_common.work_offline)
4323 #ifndef GENERIC_UMPC
4324 gtk_widget_hide (mainwin->offline_switch);
4325 gtk_widget_show (mainwin->online_switch);
4327 cm_toggle_menu_set_active_full(mainwin->ui_manager, "Menu/File/OfflineMode", FALSE);
4328 prefs_common.work_offline = FALSE;
4329 inc_autocheck_timer_set();
4330 refresh_resolvers();
4331 hooks_invoke(OFFLINE_SWITCH_HOOKLIST, NULL);
4335 static void addressbook_open_cb(GtkAction *action, gpointer data)
4337 #ifndef USE_ALT_ADDRBOOK
4338 addressbook_open(NULL);
4340 GError* error = NULL;
4342 addressbook_dbus_open(FALSE, &error);
4344 g_warning("Failed to open address book: %s", error->message);
4345 g_error_free(error);
4350 static void log_window_show_cb(GtkAction *action, gpointer data)
4352 MainWindow *mainwin = (MainWindow *)data;
4353 log_window_show(mainwin->logwin);
4356 static void filtering_debug_window_show_cb(GtkAction *action, gpointer data)
4358 MainWindow *mainwin = (MainWindow *)data;
4359 log_window_show(mainwin->filtering_debugwin);
4363 static void debug_log_show_cb(GtkAction *action, gpointer data)
4365 GError *error = NULL;
4366 gchar *logpath8 = win32_debug_log_path();
4367 gunichar2 *logpath16;
4369 debug_print("opening '%s'\n", logpath8);
4371 logpath16 = g_utf8_to_utf16(logpath8, -1, NULL, NULL, &error);
4373 if (error != NULL) {
4374 g_warning("couldn't convert debug log path '%s' to UTF-16: %s",
4375 logpath8, error->message);
4376 g_error_free(error);
4381 HINSTANCE ret = ShellExecute(NULL, NULL, (LPCWSTR)logpath16,
4382 NULL, NULL, SW_SHOW);
4386 debug_print("ShellExecute result: %"G_GSIZE_FORMAT"\n", (gsize)ret);
4390 static void inc_cancel_cb(GtkAction *action, gpointer data)
4396 static void send_cancel_cb(GtkAction *action, gpointer data)
4401 static void move_to_cb(GtkAction *action, gpointer data)
4403 MainWindow *mainwin = (MainWindow *)data;
4404 summary_move_to(mainwin->summaryview);
4407 static void copy_to_cb(GtkAction *action, gpointer data)
4409 MainWindow *mainwin = (MainWindow *)data;
4410 summary_copy_to(mainwin->summaryview);
4413 static void delete_cb(GtkAction *action, gpointer data)
4415 MainWindow *mainwin = (MainWindow *)data;
4416 summary_delete(mainwin->summaryview);
4419 static void delete_trash_cb(GtkAction *action, gpointer data)
4421 MainWindow *mainwin = (MainWindow *)data;
4422 summary_delete_trash(mainwin->summaryview);
4425 static void cancel_cb(GtkAction *action, gpointer data)
4427 MainWindow *mainwin = (MainWindow *)data;
4428 summary_cancel(mainwin->summaryview);
4431 static void open_msg_cb(GtkAction *action, gpointer data)
4433 MainWindow *mainwin = (MainWindow *)data;
4434 summary_open_msg(mainwin->summaryview);
4437 static void view_source_cb(GtkAction *action, gpointer data)
4439 MainWindow *mainwin = (MainWindow *)data;
4440 summary_view_source(mainwin->summaryview);
4443 static void show_all_header_cb(GtkAction *action, gpointer data)
4445 MainWindow *mainwin = (MainWindow *)data;
4446 if (mainwin->menu_lock_count) return;
4447 prefs_common.show_all_headers =
4448 gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (action));
4449 summary_display_msg_selected(mainwin->summaryview,
4450 gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (action)));
4453 static void toggle_fullscreen_cb(GtkAction *action, gpointer data)
4455 MainWindow *mainwin = (MainWindow *)data;
4456 if (mainwin->menu_lock_count) return;
4457 if (!gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (action))) {
4458 gtk_window_unfullscreen(GTK_WINDOW(mainwin->window));
4459 prefs_common.mainwin_fullscreen = FALSE;
4462 prefs_common.mainwin_fullscreen = TRUE;
4463 gtk_window_fullscreen(GTK_WINDOW(mainwin->window));
4467 static void toggle_menubar_cb(GtkAction *action, gpointer data)
4469 MainWindow *mainwin = (MainWindow *)data;
4470 if (mainwin->menu_lock_count) return;
4471 if (!gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (action))) {
4472 gtk_widget_hide(GTK_WIDGET(mainwin->menubar));
4473 prefs_common.mainwin_menubar = FALSE;
4475 gtk_widget_show(GTK_WIDGET(mainwin->menubar));
4476 prefs_common.mainwin_menubar = TRUE;
4480 static void hide_quotes_cb(GtkAction *action, gpointer data)
4482 MainWindow *mainwin = (MainWindow *)data;
4484 if (mainwin->menu_lock_count) return;
4486 if (gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (action))) {
4487 const gchar *a_name = gtk_action_get_name(GTK_ACTION(action));
4488 if (!strcmp(a_name, "View/Quotes/CollapseAll")) prefs_common.hide_quotes = 1;
4489 else if (!strcmp(a_name, "View/Quotes/Collapse2")) prefs_common.hide_quotes = 2;
4490 else if (!strcmp(a_name, "View/Quotes/Collapse3")) prefs_common.hide_quotes = 3;
4492 prefs_common.hide_quotes = 0;
4494 mainwin->menu_lock_count++;
4495 cm_toggle_menu_set_active_full(mainwin->ui_manager, "Menu/View/Quotes/CollapseAll", (prefs_common.hide_quotes == 1));
4496 cm_toggle_menu_set_active_full(mainwin->ui_manager, "Menu/View/Quotes/Collapse2", (prefs_common.hide_quotes == 2));
4497 cm_toggle_menu_set_active_full(mainwin->ui_manager, "Menu/View/Quotes/Collapse3", (prefs_common.hide_quotes == 3));
4498 mainwin->menu_lock_count--;
4500 summary_redisplay_msg(mainwin->summaryview);
4503 static void mark_cb(GtkAction *action, gpointer data)
4505 MainWindow *mainwin = (MainWindow *)data;
4506 summary_mark(mainwin->summaryview);
4509 static void unmark_cb(GtkAction *action, gpointer data)
4511 MainWindow *mainwin = (MainWindow *)data;
4512 summary_unmark(mainwin->summaryview);
4515 static void mark_as_read_cb(GtkAction *action, gpointer data)
4517 MainWindow *mainwin = (MainWindow *)data;
4518 summary_mark_as_read(mainwin->summaryview);
4521 static void mark_as_unread_cb(GtkAction *action, gpointer data)
4523 MainWindow *mainwin = (MainWindow *)data;
4524 summary_mark_as_unread(mainwin->summaryview);
4527 static void mark_all_read_cb(GtkAction *action, gpointer data)
4529 MainWindow *mainwin = (MainWindow *)data;
4530 summary_mark_all_read(mainwin->summaryview, TRUE);
4533 static void mark_all_unread_cb(GtkAction *action, gpointer data)
4535 MainWindow *mainwin = (MainWindow *)data;
4536 summary_mark_all_unread(mainwin->summaryview, TRUE);
4539 static void mark_as_spam_cb(GtkAction *action, gpointer data)
4541 MainWindow *mainwin = (MainWindow *)data;
4542 summary_mark_as_spam(mainwin->summaryview, TRUE, NULL);
4545 static void mark_as_ham_cb(GtkAction *action, gpointer data)
4547 MainWindow *mainwin = (MainWindow *)data;
4548 summary_mark_as_spam(mainwin->summaryview, FALSE, NULL);
4551 static void ignore_thread_cb(GtkAction *action, gpointer data)
4553 MainWindow *mainwin = (MainWindow *)data;
4554 summary_ignore_thread(mainwin->summaryview);
4557 static void unignore_thread_cb(GtkAction *action, gpointer data)
4559 MainWindow *mainwin = (MainWindow *)data;
4560 summary_unignore_thread(mainwin->summaryview);
4563 static void watch_thread_cb(GtkAction *action, gpointer data)
4565 MainWindow *mainwin = (MainWindow *)data;
4566 summary_watch_thread(mainwin->summaryview);
4569 static void unwatch_thread_cb(GtkAction *action, gpointer data)
4571 MainWindow *mainwin = (MainWindow *)data;
4572 summary_unwatch_thread(mainwin->summaryview);
4575 static void lock_msgs_cb(GtkAction *action, gpointer data)
4577 MainWindow *mainwin = (MainWindow *)data;
4578 summary_msgs_lock(mainwin->summaryview);
4581 static void unlock_msgs_cb(GtkAction *action, gpointer data)
4583 MainWindow *mainwin = (MainWindow *)data;
4584 summary_msgs_unlock(mainwin->summaryview);
4588 static void reedit_cb(GtkAction *action, gpointer data)
4590 MainWindow *mainwin = (MainWindow *)data;
4591 summary_reedit(mainwin->summaryview);
4594 static void open_urls_cb(GtkAction *action, gpointer data)
4596 MainWindow *mainwin = (MainWindow *)data;
4597 if (!mainwin->summaryview->displayed && mainwin->summaryview->selected) {
4598 summary_display_msg_selected(mainwin->summaryview,
4599 prefs_common.show_all_headers);
4601 messageview_list_urls(mainwin->messageview);
4604 static void add_address_cb(GtkAction *action, gpointer data)
4606 MainWindow *mainwin = (MainWindow *)data;
4607 summary_add_address(mainwin->summaryview);
4610 static void set_charset_cb(GtkAction *action, GtkRadioAction *current, gpointer data)
4612 MainWindow *mainwin = (MainWindow *)data;
4613 gint value = gtk_radio_action_get_current_value (GTK_RADIO_ACTION (current));
4616 if (gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (current))) {
4617 str = conv_get_charset_str((CharSet)value);
4619 g_free(mainwin->messageview->forced_charset);
4620 mainwin->messageview->forced_charset = str ? g_strdup(str) : NULL;
4621 procmime_force_charset(str);
4623 summary_redisplay_msg(mainwin->summaryview);
4625 debug_print("forced charset: %s\n", str ? str : "Auto-Detect");
4629 static void set_decode_cb(GtkAction *action, GtkRadioAction *current, gpointer data)
4631 MainWindow *mainwin = (MainWindow *)data;
4632 gint value = gtk_radio_action_get_current_value (GTK_RADIO_ACTION (current));
4633 if (gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (current))) {
4634 mainwin->messageview->forced_encoding = (EncodingType)value;
4636 summary_redisplay_msg(mainwin->summaryview);
4638 debug_print("forced encoding: %d\n", value);
4642 static void hide_read_messages (GtkAction *action, gpointer data)
4644 MainWindow *mainwin = (MainWindow *)data;
4645 GtkWidget *menuitem = gtk_ui_manager_get_widget(mainwin->ui_manager, "/Menu/View/HideReadMessages");
4646 if (!mainwin->summaryview->folder_item
4647 || g_object_get_data(G_OBJECT(menuitem), "dont_toggle"))
4649 summary_toggle_show_read_messages(mainwin->summaryview);
4652 static void hide_del_messages (GtkAction *action, gpointer data)
4654 MainWindow *mainwin = (MainWindow *)data;
4655 GtkWidget *menuitem = gtk_ui_manager_get_widget(mainwin->ui_manager, "/Menu/View/HideDelMessages");
4656 if (!mainwin->summaryview->folder_item
4657 || g_object_get_data(G_OBJECT(menuitem), "dont_toggle"))
4659 summary_toggle_show_del_messages(mainwin->summaryview);
4662 static void hide_read_threads (GtkAction *action, gpointer data)
4664 MainWindow *mainwin = (MainWindow *)data;
4665 GtkWidget *menuitem = gtk_ui_manager_get_widget(mainwin->ui_manager, "/Menu/View/HideReadThreads");
4666 if (!mainwin->summaryview->folder_item
4667 || g_object_get_data(G_OBJECT(menuitem), "dont_toggle"))
4669 summary_toggle_show_read_threads(mainwin->summaryview);
4672 static void thread_cb(GtkAction *action, gpointer data)
4674 MainWindow *mainwin = (MainWindow *)data;
4675 gboolean threaded = FALSE;
4676 if (mainwin->menu_lock_count) return;
4677 if (!mainwin->summaryview->folder_item) return;
4679 threaded = gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (action));
4681 mainwin->summaryview->folder_item->threaded = threaded;
4683 mainwin->summaryview->threaded = threaded;
4685 summary_show(mainwin->summaryview,
4686 mainwin->summaryview->folder_item);
4689 static void expand_threads_cb(GtkAction *action, gpointer data)
4691 MainWindow *mainwin = (MainWindow *)data;
4692 summary_expand_threads(mainwin->summaryview);
4695 static void collapse_threads_cb(GtkAction *action, gpointer data)
4697 MainWindow *mainwin = (MainWindow *)data;
4698 summary_collapse_threads(mainwin->summaryview);
4701 static void set_summary_display_item_cb(GtkAction *action, gpointer data)
4703 prefs_summary_column_open();
4706 static void set_folder_display_item_cb(GtkAction *action, gpointer data)
4708 prefs_folder_column_open();
4711 static void sort_summary_cb(GtkAction *action, GtkRadioAction *current, gpointer data)
4713 MainWindow *mainwin = (MainWindow *)data;
4714 gint value = gtk_radio_action_get_current_value (GTK_RADIO_ACTION (current));
4716 if (mainwin->menu_lock_count) return;
4718 if (gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (current))) {
4719 summary_sort(mainwin->summaryview, (FolderSortKey)value,
4720 mainwin->summaryview->sort_type);
4724 static void sort_summary_type_cb(GtkAction *gaction, GtkRadioAction *current, gpointer data)
4726 MainWindow *mainwin = (MainWindow *)data;
4727 gint value = gtk_radio_action_get_current_value (GTK_RADIO_ACTION (current));
4729 if (mainwin->menu_lock_count) return;
4731 if (gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (current)))
4732 summary_sort(mainwin->summaryview,
4733 mainwin->summaryview->sort_key, (FolderSortType)value);
4736 static void attract_by_subject_cb(GtkAction *action, gpointer data)
4738 MainWindow *mainwin = (MainWindow *)data;
4739 summary_attract_by_subject(mainwin->summaryview);
4742 void mainwindow_delete_duplicated(MainWindow *mainwin)
4746 item = folderview_get_selected_item(mainwin->folderview);
4750 main_window_cursor_wait(mainwin);
4751 STATUSBAR_PUSH(mainwin, _("Deleting duplicated messages..."));
4752 result = folderutils_delete_duplicates(item, prefs_common.immediate_exec ?
4753 DELETE_DUPLICATES_REMOVE : DELETE_DUPLICATES_SETFLAG);
4754 STATUSBAR_POP(mainwin);
4755 main_window_cursor_normal(mainwin);
4761 alertpanel_notice(_("No duplicate message found in selected folder.\n"));
4766 if (prefs_common.immediate_exec) {
4767 msg = ngettext("Deleted %d duplicate message in selected folder.\n",
4768 "Deleted %d duplicate messages in selected folder.\n",
4771 msg = ngettext("Marked %d duplicate message for deletion in selected folder.\n",
4772 "Marked %d duplicate messages for deletion in selected folder.\n",
4775 alertpanel_notice(msg, result);
4781 static void delete_duplicated_cb(GtkAction *action, gpointer data)
4783 mainwindow_delete_duplicated((MainWindow *)data);
4792 static void deldup_all(FolderItem *item, gpointer _data)
4794 struct DelDupsData *data = _data;
4797 result = folderutils_delete_duplicates(item, DELETE_DUPLICATES_REMOVE);
4799 data->dups += result;
4804 void mainwindow_delete_duplicated_all(MainWindow *mainwin)
4806 struct DelDupsData data = {0, 0};
4808 main_window_cursor_wait(mainwin);
4809 STATUSBAR_PUSH(mainwin, _("Deleting duplicated messages in all folders..."));
4810 folder_func_to_all_folders(deldup_all, &data);
4811 STATUSBAR_POP(mainwin);
4812 main_window_cursor_normal(mainwin);
4814 if (data.dups > 0) {
4815 alertpanel_notice(ngettext("Deleted %d duplicate message in %d folders.\n",
4816 "Deleted %d duplicate messages in %d folders.\n",
4818 data.dups, data.folders);
4820 alertpanel_notice(_("No duplicate message found in %d folders.\n"), data.folders);
4824 static void delete_duplicated_all_cb(GtkAction *action, gpointer mw)
4826 MainWindow *mainwin = (MainWindow *)mw;
4828 mainwindow_delete_duplicated_all(mainwin);
4831 static void filter_cb(GtkAction *action, gpointer data)
4833 MainWindow *mainwin = (MainWindow *)data;
4834 summary_filter(mainwin->summaryview, FALSE);
4837 static void filter_list_cb(GtkAction *action, gpointer data)
4839 MainWindow *mainwin = (MainWindow *)data;
4840 summary_filter(mainwin->summaryview, TRUE);
4843 static void process_cb(GtkAction *action, gpointer data)
4845 MainWindow *mainwin = (MainWindow *)data;
4846 FolderItem *item = mainwin->summaryview->folder_item;
4847 cm_return_if_fail(item != NULL);
4849 item->processing_pending = TRUE;
4850 folder_item_apply_processing(item);
4851 item->processing_pending = FALSE;
4854 static void execute_summary_cb(GtkAction *action, gpointer data)
4856 MainWindow *mainwin = (MainWindow *)data;
4857 summary_execute(mainwin->summaryview);
4860 static void expunge_summary_cb(GtkAction *action, gpointer data)
4862 MainWindow *mainwin = (MainWindow *)data;
4863 summary_expunge(mainwin->summaryview);
4866 static void update_summary_cb(GtkAction *action, gpointer data)
4868 MainWindow *mainwin = (MainWindow *)data;
4870 FolderView *folderview = mainwin->folderview;
4872 if (!mainwin->summaryview->folder_item) return;
4873 if ((fitem = folderview_get_opened_item(folderview)) == NULL) return;
4875 folder_update_op_count();
4876 folder_item_scan(fitem);
4877 summary_show(mainwin->summaryview, fitem);
4880 static void prev_cb(GtkAction *action, gpointer data)
4882 MainWindow *mainwin = (MainWindow *)data;
4883 summary_select_prev(mainwin->summaryview);
4886 static void next_cb(GtkAction *action, gpointer data)
4888 MainWindow *mainwin = (MainWindow *)data;
4889 summary_select_next(mainwin->summaryview);
4892 static void prev_unread_cb(GtkAction *action, gpointer data)
4894 MainWindow *mainwin = (MainWindow *)data;
4895 summary_select_prev_unread(mainwin->summaryview);
4898 static void next_unread_cb(GtkAction *action, gpointer data)
4900 MainWindow *mainwin = (MainWindow *)data;
4901 summary_select_next_unread(mainwin->summaryview);
4904 static void prev_new_cb(GtkAction *action, gpointer data)
4906 MainWindow *mainwin = (MainWindow *)data;
4907 summary_select_prev_new(mainwin->summaryview);
4910 static void next_new_cb(GtkAction *action, gpointer data)
4912 MainWindow *mainwin = (MainWindow *)data;
4913 summary_select_next_new(mainwin->summaryview);
4916 static void prev_marked_cb(GtkAction *action, gpointer data)
4918 MainWindow *mainwin = (MainWindow *)data;
4919 summary_select_prev_marked(mainwin->summaryview);
4922 static void next_marked_cb(GtkAction *action, gpointer data)
4924 MainWindow *mainwin = (MainWindow *)data;
4925 summary_select_next_marked(mainwin->summaryview);
4928 static void prev_labeled_cb(GtkAction *action, gpointer data)
4930 MainWindow *mainwin = (MainWindow *)data;
4931 summary_select_prev_labeled(mainwin->summaryview);
4934 static void next_labeled_cb(GtkAction *action, gpointer data)
4936 MainWindow *mainwin = (MainWindow *)data;
4937 summary_select_next_labeled(mainwin->summaryview);
4940 static void prev_history_cb(GtkAction *action, gpointer data)
4942 MainWindow *mainwin = (MainWindow *)data;
4943 MsgInfo *info = messageview_nav_get_prev(mainwin->messageview);
4945 if (info->folder != mainwin->summaryview->folder_item)
4946 folderview_select(mainwin->folderview, info->folder);
4947 summary_select_by_msgnum(mainwin->summaryview, info->msgnum,
4948 OPEN_SELECTED_ON_PREVNEXT);
4949 procmsg_msginfo_free(&info);
4950 main_window_set_menu_sensitive(mainwindow_get_mainwindow());
4951 toolbar_main_set_sensitive(mainwindow_get_mainwindow());
4955 static void next_history_cb(GtkAction *action, gpointer data)
4957 MainWindow *mainwin = (MainWindow *)data;
4958 MsgInfo *info = messageview_nav_get_next(mainwin->messageview);
4960 if (info->folder != mainwin->summaryview->folder_item)
4961 folderview_select(mainwin->folderview, info->folder);
4962 summary_select_by_msgnum(mainwin->summaryview, info->msgnum,
4963 OPEN_SELECTED_ON_PREVNEXT);
4964 procmsg_msginfo_free(&info);
4965 main_window_set_menu_sensitive(mainwindow_get_mainwindow());
4966 toolbar_main_set_sensitive(mainwindow_get_mainwindow());
4970 static void parent_cb(GtkAction *action, gpointer data)
4972 MainWindow *mainwin = (MainWindow *)data;
4973 summary_select_parent(mainwin->summaryview);
4976 static void goto_folder_cb(GtkAction *action, gpointer data)
4978 MainWindow *mainwin = (MainWindow *)data;
4979 FolderItem *to_folder;
4981 to_folder = foldersel_folder_sel(NULL, FOLDER_SEL_ALL, NULL, FALSE,
4982 _("Select folder to go to"));
4985 folderview_select(mainwin->folderview, to_folder);
4988 static void goto_unread_folder_cb(GtkAction *action, gpointer data)
4990 MainWindow *mainwin = (MainWindow *)data;
4991 folderview_select_next_with_flag(mainwin->folderview, MSG_UNREAD);
4994 static void scroll_prev_line_cb(GtkAction *action, gpointer data)
4996 MainWindow *mainwin = (MainWindow *)data;
4997 mimeview_scroll_one_line(mainwin->messageview->mimeview,TRUE);
5000 static void scroll_next_line_cb(GtkAction *action, gpointer data)
5002 MainWindow *mainwin = (MainWindow *)data;
5003 mimeview_scroll_one_line(mainwin->messageview->mimeview,FALSE);
5006 static void scroll_prev_page_cb(GtkAction *action, gpointer data)
5008 MainWindow *mainwin = (MainWindow *)data;
5009 mimeview_scroll_page(mainwin->messageview->mimeview,TRUE);
5012 static void scroll_next_page_cb(GtkAction *action, gpointer data)
5014 MainWindow *mainwin = (MainWindow *)data;
5015 mimeview_scroll_page(mainwin->messageview->mimeview,FALSE);
5018 static void copy_cb(GtkAction *action, gpointer data)
5020 MainWindow *mainwin = (MainWindow *)data;
5021 messageview_copy_clipboard(mainwin->messageview);
5024 static void allsel_cb(GtkAction *action, gpointer data)
5026 MainWindow *mainwin = (MainWindow *)data;
5027 MessageView *msgview = mainwin->messageview;
5029 if (messageview_is_visible(msgview) &&
5030 (gtk_widget_has_focus(msgview->mimeview->textview->text)))
5031 messageview_select_all(mainwin->messageview);
5033 summary_select_all(mainwin->summaryview);
5036 static void select_thread_cb(GtkAction *action, gpointer data)
5038 MainWindow *mainwin = (MainWindow *)data;
5039 summary_select_thread(mainwin->summaryview, FALSE, FALSE);
5042 static void trash_thread_cb(GtkAction *action, gpointer data)
5044 MainWindow *mainwin = (MainWindow *)data;
5045 summary_select_thread(mainwin->summaryview, FALSE, TRUE);
5048 static void delete_thread_cb(GtkAction *action, gpointer data)
5050 MainWindow *mainwin = (MainWindow *)data;
5051 summary_select_thread(mainwin->summaryview, TRUE, FALSE);
5054 static void create_filter_cb(GtkAction *gaction, gpointer data)
5056 MainWindow *mainwin = (MainWindow *)data;
5057 const gchar *a_name = gtk_action_get_name(gaction);
5060 DO_ACTION("Tools/CreateFilterRule/Automatically", FILTER_BY_AUTO);
5061 DO_ACTION("Tools/CreateFilterRule/ByFrom", FILTER_BY_FROM);
5062 DO_ACTION("Tools/CreateFilterRule/ByTo", FILTER_BY_TO);
5063 DO_ACTION("Tools/CreateFilterRule/BySubject", FILTER_BY_SUBJECT);
5064 summary_filter_open(mainwin->summaryview, (PrefsFilterType)action, 0);
5067 static void create_processing_cb(GtkAction *gaction, gpointer data)
5069 MainWindow *mainwin = (MainWindow *)data;
5070 const gchar *a_name = gtk_action_get_name(gaction);
5073 DO_ACTION("Tools/CreateProcessingRule/Automatically", FILTER_BY_AUTO);
5074 DO_ACTION("Tools/CreateProcessingRule/ByFrom", FILTER_BY_FROM);
5075 DO_ACTION("Tools/CreateProcessingRule/ByTo", FILTER_BY_TO);
5076 DO_ACTION("Tools/CreateProcessingRule/BySubject", FILTER_BY_SUBJECT);
5077 summary_filter_open(mainwin->summaryview, (PrefsFilterType)action, 1);
5080 static void prefs_pre_processing_open_cb(GtkAction *action, gpointer data)
5082 prefs_filtering_open(&pre_global_processing,
5083 _("Processing rules to apply before folder rules"),
5084 MANUAL_ANCHOR_PROCESSING,
5088 static void prefs_post_processing_open_cb(GtkAction *action, gpointer data)
5090 prefs_filtering_open(&post_global_processing,
5091 _("Processing rules to apply after folder rules"),
5092 MANUAL_ANCHOR_PROCESSING,
5096 static void prefs_filtering_open_cb(GtkAction *action, gpointer data)
5098 prefs_filtering_open(&filtering_rules,
5099 _("Filtering configuration"),
5100 MANUAL_ANCHOR_FILTERING,
5104 static void prefs_template_open_cb(GtkAction *action, gpointer data)
5106 prefs_template_open();
5109 static void prefs_actions_open_cb(GtkAction *action, gpointer data)
5111 MainWindow *mainwin = (MainWindow *)data;
5112 prefs_actions_open(mainwin);
5115 static void prefs_tags_open_cb(GtkAction *action, gpointer data)
5117 MainWindow *mainwin = (MainWindow *)data;
5118 GSList * list = summary_get_selected_msg_list(mainwin->summaryview);
5119 tag_apply_open(list);
5122 static void ssl_manager_open_cb(GtkAction *action, gpointer data)
5124 MainWindow *mainwin = (MainWindow *)data;
5125 ssl_manager_open(mainwin);
5128 static void prefs_account_open_cb(GtkAction *action, gpointer data)
5130 MainWindow *mainwin = (MainWindow *)data;
5132 new_account_cb(NULL, mainwin);
5134 account_open(cur_account, FALSE);
5138 static void new_account_cb(GtkAction *action, gpointer data)
5140 account_edit_open(NULL, NULL);
5141 if (!compose_get_compose_list()) account_add();
5144 static void account_selector_menu_cb(GtkMenuItem *menuitem, gpointer data)
5146 FolderItem *item = NULL;
5147 cur_account = (PrefsAccount *)data;
5149 if (!mainwindow_get_mainwindow())
5151 main_window_show_cur_account(mainwindow_get_mainwindow());
5152 toolbar_update(TOOLBAR_MAIN, mainwindow_get_mainwindow());
5153 main_window_set_menu_sensitive(mainwindow_get_mainwindow());
5154 toolbar_main_set_sensitive(mainwindow_get_mainwindow());
5155 item = folderview_get_selected_item(
5156 mainwindow_get_mainwindow()->folderview);
5158 toolbar_set_compose_button
5159 (mainwindow_get_mainwindow()->toolbar,
5160 FOLDER_TYPE(item->folder) == F_NEWS ?
5161 COMPOSEBUTTON_NEWS : COMPOSEBUTTON_MAIL);
5165 static void account_receive_menu_cb(GtkMenuItem *menuitem, gpointer data)
5167 MainWindow *mainwin = (MainWindow *)mainwin_list->data;
5168 PrefsAccount *account = (PrefsAccount *)data;
5170 inc_account_mail(mainwin, account);
5172 #ifndef GENERIC_UMPC
5173 static void account_compose_menu_cb(GtkMenuItem *menuitem, gpointer data)
5175 PrefsAccount *account = (PrefsAccount *)data;
5177 compose_new_with_folderitem(account, NULL, NULL);
5180 static void prefs_open_cb(GtkAction *action, gpointer data)
5185 static void plugins_open_cb(GtkAction *action, gpointer data)
5187 pluginwindow_create();
5190 static void manual_open_cb(GtkAction *action, gpointer data)
5192 manual_open(MANUAL_MANUAL_CLAWS, NULL);
5195 static void manual_faq_open_cb(GtkAction *action, gpointer data)
5197 manual_open(MANUAL_FAQ_CLAWS, NULL);
5200 static void legend_open_cb(GtkAction *action, gpointer data)
5206 static void set_default_client_cb(GtkAction *action, gpointer data)
5208 char exename[MAX_PATH];
5209 gchar *binary_icon = NULL;
5210 gchar *binary_compose = NULL;
5211 gchar *binary_run = NULL;
5213 if ( !GetModuleFileNameA (0, exename, sizeof (exename)) ) {
5214 alertpanel_error(_("Can not register as default client: impossible to get executable path."));
5217 binary_icon = g_strconcat(exename, ",0", NULL);
5218 binary_compose = g_strconcat(exename, " --compose %1", NULL);
5219 binary_run = g_strconcat(exename, NULL);
5221 /* Try to set the Mail Start menu item to Claws. It may fail if we're not root; we don't care */
5222 r = write_w32_registry_string("HKLM", "Software\\Clients\\Mail",
5225 r = write_w32_registry_string("HKCU", "Software\\Clients\\Mail\\Claws Mail",
5228 r = write_w32_registry_string("HKCU", "Software\\Clients\\Mail\\Claws Mail",
5231 r = write_w32_registry_string("HKCU", "Software\\Clients\\Mail\\Claws Mail\\Protocols\\mailto",
5232 "", "URL:MailTo-Protocol");
5234 r = write_w32_registry_string("HKCU", "Software\\Clients\\Mail\\Claws Mail\\Protocols\\mailto",
5235 "URL Protocol", "");
5237 r = write_w32_registry_dword ("HKCU", "Software\\Clients\\Mail\\Claws Mail\\Protocols\\mailto",
5240 r = write_w32_registry_string ("HKCU", "Software\\Clients\\Mail\\Claws Mail\\Protocols\\mailto",
5241 "FriendlyTypeName", "Claws-Mail URL");
5243 r = write_w32_registry_string("HKCU", "Software\\Clients\\Mail\\Claws Mail\\Protocols\\mailto\\DefaultIcon",
5246 r = write_w32_registry_string("HKCU", "Software\\Clients\\Mail\\Claws Mail\\Protocols\\mailto\\shell\\open\\command",
5247 "", binary_compose);
5249 r = write_w32_registry_string("HKCU", "Software\\Clients\\Mail\\Claws Mail\\shell\\open\\command",
5253 r = write_w32_registry_string("HKCU", "Software\\Classes\\mailto",
5254 "", "URL:MailTo-Protocol");
5256 r = write_w32_registry_string("HKCU", "Software\\Classes\\mailto",
5257 "URL Protocol", "");
5259 r = write_w32_registry_dword ("HKCU", "Software\\Classes\\mailto",
5262 r = write_w32_registry_string("HKCU", "Software\\Classes\\mailto",
5263 "FriendlyTypeName", "Claws-Mail URL");
5265 r = write_w32_registry_string("HKCU", "Software\\Classes\\mailto\\DefaultIcon",
5268 r = write_w32_registry_string("HKCU", "Software\\Classes\\mailto\\shell\\open\\command",
5269 "", binary_compose);
5272 SendMessage(HWND_BROADCAST, WM_SETTINGCHANGE, 0, (LPARAM)"Software\\Clients\\Mail");
5273 alertpanel_notice(_("Claws Mail has been registered as default client."));
5275 alertpanel_error(_("Can not register as default client: impossible to write to the registry."));
5277 g_free(binary_icon);
5278 g_free(binary_compose);
5283 static void scan_tree_func(Folder *folder, FolderItem *item, gpointer data)
5285 MainWindow *mainwin = (MainWindow *)data;
5289 str = g_strdup_printf(_("Scanning folder %s%c%s..."),
5290 LOCAL_FOLDER(folder)->rootpath,
5294 str = g_strdup_printf(_("Scanning folder %s..."),
5295 LOCAL_FOLDER(folder)->rootpath);
5297 STATUSBAR_PUSH(mainwin, str);
5298 STATUSBAR_POP(mainwin);
5302 static gboolean mainwindow_focus_in_event(GtkWidget *widget, GdkEventFocus *focus,
5305 SummaryView *summary;
5307 cm_return_val_if_fail(data, FALSE);
5308 if (!g_list_find(mainwin_list, data))
5310 summary = ((MainWindow *)data)->summaryview;
5311 cm_return_val_if_fail(summary, FALSE);
5313 if (GTK_CMCLIST(summary->ctree)->selection &&
5314 g_list_length(GTK_CMCLIST(summary->ctree)->selection) > 1)
5320 static gboolean mainwindow_visibility_event_cb(GtkWidget *widget, GdkEventVisibility *event,
5323 is_obscured = (event->state == GDK_VISIBILITY_FULLY_OBSCURED);
5327 static gboolean mainwindow_state_event_cb(GtkWidget *widget, GdkEventWindowState *state,
5330 if (!claws_is_starting()
5331 && state->changed_mask&GDK_WINDOW_STATE_ICONIFIED
5332 && state->new_window_state&GDK_WINDOW_STATE_ICONIFIED) {
5334 if (iconified_count > 0)
5335 hooks_invoke(MAIN_WINDOW_GOT_ICONIFIED, NULL);
5337 } else if (!claws_is_starting()) {
5338 prefs_common.mainwin_maximised =
5339 ((state->new_window_state&GDK_WINDOW_STATE_MAXIMIZED) != 0);
5341 if (state->new_window_state == 0)
5342 gtk_window_set_skip_taskbar_hint(GTK_WINDOW(widget), FALSE);
5346 gboolean mainwindow_is_obscured(void)
5352 * Harvest addresses for selected folder.
5354 static void addr_harvest_cb( GtkAction *action, gpointer data)
5356 MainWindow *mainwin = (MainWindow *)data;
5358 addressbook_harvest( mainwin->summaryview->folder_item, FALSE, NULL );
5362 * Harvest addresses for selected messages in summary view.
5364 static void addr_harvest_msg_cb( GtkAction *action, gpointer data)
5366 MainWindow *mainwin = (MainWindow *)data;
5367 summary_harvest_address( mainwin->summaryview );
5371 *\brief get a MainWindow
5373 *\return MainWindow * The first mainwindow in the mainwin_list
5375 MainWindow *mainwindow_get_mainwindow(void)
5377 if (mainwin_list && mainwin_list->data)
5378 return (MainWindow *)(mainwin_list->data);
5383 static gboolean mainwindow_progressindicator_hook(gpointer source, gpointer userdata)
5385 ProgressData *data = (ProgressData *) source;
5386 MainWindow *mainwin = (MainWindow *) userdata;
5388 switch (data->cmd) {
5389 case PROGRESS_COMMAND_START:
5390 case PROGRESS_COMMAND_STOP:
5391 gtk_progress_bar_set_fraction
5392 (GTK_PROGRESS_BAR(mainwin->progressbar), 0.0);
5394 case PROGRESS_COMMAND_SET_PERCENTAGE:
5395 gtk_progress_bar_set_fraction
5396 (GTK_PROGRESS_BAR(mainwin->progressbar), data->value);
5399 while (gtk_events_pending()) gtk_main_iteration ();
5404 static void sync_cb(GtkAction *action, gpointer data)
5406 MainWindow *mainwin = (MainWindow *)data;
5407 mainwindow_check_synchronise(mainwin, FALSE);
5410 static void forget_session_passwords_cb(GtkAction *action, gpointer data)
5412 MainWindow *mainwin = (MainWindow *)data;
5417 main_window_lock(mainwin);
5418 for (list = account_get_list(); list != NULL; list = list->next) {
5419 PrefsAccount *account = list->data;
5420 if (account->session_passwd) {
5421 g_free(account->session_passwd);
5422 account->session_passwd = NULL;
5425 if (account->session_smtp_passwd) {
5426 g_free(account->session_smtp_passwd);
5427 account->session_smtp_passwd = NULL;
5432 main_window_unlock(mainwin);
5433 alertpanel_notice(ngettext("Forgotten %d password in %d accounts.\n",
5434 "Forgotten %d passwords in %d accounts.\n",
5438 #ifndef PASSWORD_CRYPTO_OLD
5439 static void forget_master_passphrase_cb(GtkAction *action, gpointer data)
5441 MainWindow *mainwin = (MainWindow *)data;
5443 main_window_lock(mainwin);
5444 master_passphrase_forget();
5445 main_window_unlock(mainwin);
5449 void mainwindow_learn (MainWindow *mainwin, gboolean is_spam)
5451 summary_mark_as_spam(mainwin->summaryview, is_spam, NULL);
5454 void mainwindow_jump_to(const gchar *target, gboolean popup)
5458 FolderItem *item = NULL;
5460 MainWindow *mainwin = mainwindow_get_mainwindow();
5461 gchar *from_uri = NULL;
5466 g_print("not initialized\n");
5470 if ((from_uri = g_filename_from_uri(target, NULL, NULL)) != NULL)
5473 tmp = g_strdup(target);
5475 if ((p = strstr(tmp, "\r")) != NULL)
5477 if ((p = strstr(tmp, "\n")) != NULL)
5480 if ((item = folder_find_item_from_identifier(tmp))) {
5481 g_print("selecting folder '%s'\n", tmp);
5482 folderview_select(mainwin->folderview, item);
5484 main_window_popup(mainwin);
5489 msg = strrchr(tmp, '/');
5492 if ((item = folder_find_item_from_identifier(tmp))) {
5493 g_print("selecting folder '%s'\n", tmp);
5494 folderview_select(mainwin->folderview, item);
5495 } else if ((item = folder_find_item_from_real_path(tmp))) {
5496 g_print("selecting folder '%s'\n", tmp);
5497 folderview_select(mainwin->folderview, item);
5499 g_print("'%s' not found\n", tmp);
5501 if (item && msg && atoi(msg)) {
5502 g_print("selecting message %d\n", atoi(msg));
5503 summary_select_by_msgnum(mainwin->summaryview, atoi(msg), TRUE);
5505 main_window_popup(mainwin);
5508 } else if (item && msg[0] == '<' && msg[strlen(msg)-1] == '>') {
5509 MsgInfo *msginfo = NULL;
5511 msg[strlen(msg)-1] = '\0';
5512 msginfo = folder_item_get_msginfo_by_msgid(item, msg);
5514 g_print("selecting message %s\n", msg);
5515 summary_select_by_msgnum(mainwin->summaryview, msginfo->msgnum, TRUE);
5517 main_window_popup(mainwin);
5519 procmsg_msginfo_free(&msginfo);
5522 g_print("'%s' not found\n", msg);
5525 g_print("'%s' not found\n", msg);
5528 g_print("'%s' not found\n", tmp);
5534 void mainwindow_exit_folder(MainWindow *mainwin) {
5535 if (prefs_common.layout_mode == SMALL_LAYOUT) {
5536 folderview_close_opened(mainwin->folderview, FALSE);
5537 mainwin_paned_show_first(GTK_PANED(mainwin->hpaned));
5538 folderview_grab_focus(mainwin->folderview);
5540 mainwin->in_folder = FALSE;
5541 main_window_set_menu_sensitive(mainwin);
5544 void mainwindow_enter_folder(MainWindow *mainwin) {
5545 if (prefs_common.layout_mode == SMALL_LAYOUT) {
5546 mainwin_paned_show_last(GTK_PANED(mainwin->hpaned));
5548 mainwin->in_folder = TRUE;
5549 main_window_set_menu_sensitive(mainwin);
5552 static void save_part_as_cb(GtkAction *action, gpointer data)
5554 MainWindow *mainwin = (MainWindow *)data;
5556 if (mainwin->messageview
5557 && mainwin->messageview->mimeview)
5558 mimeview_save_as(mainwin->messageview->mimeview);
5561 static void view_part_as_text_cb(GtkAction *action, gpointer data)
5563 MainWindow *mainwin = (MainWindow *)data;
5565 if (mainwin->messageview
5566 && mainwin->messageview->mimeview)
5567 mimeview_display_as_text(mainwin->messageview->mimeview);
5570 static void open_part_cb(GtkAction *action, gpointer data)
5572 MainWindow *mainwin = (MainWindow *)data;
5574 if (mainwin->messageview
5575 && mainwin->messageview->mimeview)
5576 mimeview_launch(mainwin->messageview->mimeview, NULL);
5579 static void open_part_with_cb(GtkAction *action, gpointer data)
5581 MainWindow *mainwin = (MainWindow *)data;
5583 if (mainwin->messageview
5584 && mainwin->messageview->mimeview)
5585 mimeview_open_with(mainwin->messageview->mimeview);
5588 static void check_signature_cb(GtkAction *action, gpointer data)
5590 MainWindow *mainwin = (MainWindow *)data;
5592 if (mainwin->messageview
5593 && mainwin->messageview->mimeview)
5594 mimeview_check_signature(mainwin->messageview->mimeview);
5597 static void goto_next_part_cb(GtkAction *action, gpointer data)
5599 MainWindow *mainwin = (MainWindow *)data;
5601 if (mainwin->messageview
5602 && mainwin->messageview->mimeview)
5603 mimeview_select_next_part(mainwin->messageview->mimeview);
5606 static void goto_prev_part_cb(GtkAction *action, gpointer data)
5608 MainWindow *mainwin = (MainWindow *)data;
5610 if (mainwin->messageview
5611 && mainwin->messageview->mimeview)
5612 mimeview_select_prev_part(mainwin->messageview->mimeview);