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/>.
22 #include <glib/gi18n.h>
23 #include <gdk/gdkkeysyms.h>
29 #include "mainwindow.h"
30 #include "folderview.h"
31 #include "folder_item_prefs.h"
32 #include "foldersel.h"
33 #include "quicksearch.h"
34 #include "summaryview.h"
35 #include "summary_search.h"
36 #include "messageview.h"
38 #include "message_search.h"
39 #include "headerview.h"
41 #include "stock_pixmap.h"
51 #include "prefs_common.h"
52 #include "prefs_actions.h"
53 #include "prefs_filtering.h"
54 #include "prefs_account.h"
55 #include "prefs_summary_column.h"
56 #include "prefs_folder_column.h"
57 #include "prefs_template.h"
60 #ifndef USE_ALT_ADDRBOOK
61 #include "addressbook.h"
63 #include "addressbook-dbus.h"
65 #include "logwindow.h"
66 #include "manage_window.h"
67 #include "alertpanel.h"
68 #include "statusbar.h"
69 #include "inputdialog.h"
76 #include "ssl_manager.h"
77 #include "sslcertwindow.h"
78 #include "prefs_gtk.h"
79 #include "pluginwindow.h"
81 #include "progressindicator.h"
82 #include "localfolder.h"
83 #include "filtering.h"
84 #include "folderutils.h"
85 #include "foldersort.h"
86 #include "icon_legend.h"
87 #include "colorlabel.h"
94 #include "send_message.h"
99 #define AC_LABEL_WIDTH 240
101 /* list of all instantiated MainWindow */
102 static GList *mainwin_list = NULL;
104 static GdkCursor *watch_cursor = NULL;
105 static GdkCursor *hand_cursor = NULL;
107 static gint iconified_count = 0;
109 static void main_window_menu_callback_block (MainWindow *mainwin);
110 static void main_window_menu_callback_unblock (MainWindow *mainwin);
112 static void main_window_show_cur_account (MainWindow *mainwin);
114 static void main_window_separation_change (MainWindow *mainwin,
115 LayoutType layout_mode);
117 static void main_window_set_widgets (MainWindow *mainwin,
118 LayoutType layout_mode);
120 static void toolbar_child_attached (GtkWidget *widget,
123 static void toolbar_child_detached (GtkWidget *widget,
127 static gboolean ac_label_button_pressed (GtkWidget *widget,
128 GdkEventButton *event,
131 static gint main_window_close_cb (GtkWidget *widget,
135 static void main_window_size_allocate_cb (GtkWidget *widget,
136 GtkAllocation *allocation,
138 static void folder_window_size_allocate_cb (GtkWidget *widget,
139 GtkAllocation *allocation,
141 static void message_window_size_allocate_cb (GtkWidget *widget,
142 GtkAllocation *allocation,
145 static void update_folderview_cb (GtkAction *action,
147 static void add_mailbox_cb (GtkAction *action,
149 static void foldersort_cb (GtkAction *action,
151 static void import_mbox_cb (GtkAction *action,
153 static void export_mbox_cb (GtkAction *action,
155 static void export_list_mbox_cb (GtkAction *action,
157 static void empty_trash_cb (GtkAction *action,
159 static void save_as_cb (GtkAction *action,
161 static void page_setup_cb (GtkAction *action,
163 static void print_cb (GtkAction *action,
165 static void app_exit_cb (GtkAction *action,
169 static void search_cb (GtkAction *action,
171 static void search_folder_cb (GtkAction *action,
174 static void toggle_message_cb (GtkAction *action,
176 static void toggle_toolbar_cb (GtkAction *action, GtkRadioAction *current, gpointer data);
177 static void toggle_col_headers_cb(GtkAction *action,
180 static void toggle_statusbar_cb (GtkAction *action,
182 static void set_layout_cb (GtkAction *action, GtkRadioAction *current, gpointer data);
184 static void addressbook_open_cb (GtkAction *action,
186 static void log_window_show_cb (GtkAction *action,
188 static void filtering_debug_window_show_cb (GtkAction *action,
191 static void inc_cancel_cb (GtkAction *action,
193 static void send_cancel_cb (GtkAction *action,
196 static void open_msg_cb (GtkAction *action,
199 static void view_source_cb (GtkAction *action,
202 static void show_all_header_cb (GtkAction *action,
204 static void toggle_fullscreen_cb (GtkAction *action,
206 static void toggle_menubar_cb (GtkAction *action,
209 static void hide_quotes_cb(GtkAction *action,
212 static void move_to_cb (GtkAction *action,
214 static void copy_to_cb (GtkAction *action,
216 static void delete_cb (GtkAction *action,
218 static void delete_trash_cb (GtkAction *action,
221 static void cancel_cb (GtkAction *action,
224 static void mark_cb (GtkAction *action,
226 static void unmark_cb (GtkAction *action,
229 static void mark_as_unread_cb (GtkAction *action,
231 static void mark_as_read_cb (GtkAction *action,
233 static void mark_all_read_cb (GtkAction *action,
235 static void mark_all_unread_cb (GtkAction *action,
237 static void mark_as_spam_cb (GtkAction *action,
239 static void mark_as_ham_cb (GtkAction *action,
242 static void ignore_thread_cb (GtkAction *action,
244 static void unignore_thread_cb (GtkAction *action,
246 static void watch_thread_cb (GtkAction *action,
248 static void unwatch_thread_cb (GtkAction *action,
250 static void lock_msgs_cb (GtkAction *action,
252 static void unlock_msgs_cb (GtkAction *action,
255 static void reedit_cb (GtkAction *action,
258 static void add_address_cb (GtkAction *action,
261 static void set_charset_cb (GtkAction *action, GtkRadioAction *current, gpointer data);
263 static void set_decode_cb (GtkAction *action, GtkRadioAction *current, gpointer data);
265 static void hide_read_messages (GtkAction *action,
267 static void hide_read_threads (GtkAction *action,
269 static void hide_del_messages (GtkAction *action,
272 static void thread_cb (GtkAction *action,
274 static void expand_threads_cb (GtkAction *action,
276 static void collapse_threads_cb (GtkAction *action,
279 static void set_summary_display_item_cb (GtkAction *action,
281 static void set_folder_display_item_cb (GtkAction *action,
283 static void sort_summary_cb (GtkAction *action, GtkRadioAction *current, gpointer data);
284 static void sort_summary_type_cb (GtkAction *action, GtkRadioAction *current, gpointer data);
285 static void attract_by_subject_cb(GtkAction *action,
288 static void delete_duplicated_cb (GtkAction *action,
290 static void delete_duplicated_all_cb (GtkAction *action,
292 static void filter_cb (GtkAction *action,
294 static void filter_list_cb (GtkAction *action,
296 static void process_cb (GtkAction *action,
298 static void execute_summary_cb (GtkAction *action,
300 static void expunge_summary_cb (GtkAction *action,
302 static void update_summary_cb (GtkAction *action,
305 static void prev_cb (GtkAction *action,
307 static void next_cb (GtkAction *action,
309 static void next_unread_cb (GtkAction *action,
311 static void prev_unread_cb (GtkAction *action,
314 static void prev_new_cb (GtkAction *action,
316 static void next_new_cb (GtkAction *action,
318 static void prev_marked_cb (GtkAction *action,
320 static void next_marked_cb (GtkAction *action,
322 static void prev_labeled_cb (GtkAction *action,
324 static void next_labeled_cb (GtkAction *action,
326 static void prev_history_cb (GtkAction *action,
328 static void next_history_cb (GtkAction *action,
330 static void parent_cb (GtkAction *action,
333 static void goto_folder_cb (GtkAction *action,
335 static void goto_unread_folder_cb(GtkAction *action,
338 static void scroll_prev_line_cb (GtkAction *action,
340 static void scroll_next_line_cb (GtkAction *action,
342 static void scroll_prev_page_cb (GtkAction *action,
344 static void scroll_next_page_cb (GtkAction *action,
347 static void copy_cb (GtkAction *action,
349 static void allsel_cb (GtkAction *action,
351 static void select_thread_cb (GtkAction *action,
353 static void trash_thread_cb (GtkAction *action,
355 static void delete_thread_cb (GtkAction *action,
358 static void create_filter_cb (GtkAction *action,
360 static void create_processing_cb (GtkAction *action,
362 static void open_urls_cb (GtkAction *action,
365 static void prefs_template_open_cb (GtkAction *action,
367 static void prefs_actions_open_cb (GtkAction *action,
369 static void prefs_tags_open_cb (GtkAction *action,
371 static void prefs_account_open_cb (GtkAction *action,
374 static void prefs_pre_processing_open_cb (GtkAction *action,
377 static void prefs_post_processing_open_cb (GtkAction *action,
380 static void prefs_filtering_open_cb (GtkAction *action,
383 static void ssl_manager_open_cb (GtkAction *action,
386 static void new_account_cb (GtkAction *action,
389 static void account_selector_menu_cb (GtkMenuItem *menuitem,
391 static void account_receive_menu_cb (GtkMenuItem *menuitem,
394 static void account_compose_menu_cb (GtkMenuItem *menuitem,
397 static void prefs_open_cb (GtkAction *action,
399 static void plugins_open_cb (GtkAction *action,
402 static void online_switch_clicked(GtkButton *btn,
405 static void manual_open_cb (GtkAction *action,
407 static void manual_faq_open_cb (GtkAction *action,
410 static void legend_open_cb (GtkAction *action,
414 static void set_default_client_cb (GtkAction *action,
418 static void scan_tree_func (Folder *folder,
422 static void toggle_work_offline_cb(GtkAction *action,
425 static void addr_harvest_cb ( GtkAction *action,
428 static void addr_harvest_msg_cb ( GtkAction *action,
430 static void sync_cb ( GtkAction *action,
433 static void forget_session_passwords_cb (GtkAction *action,
435 #ifndef PASSWORD_CRYPTO_OLD
436 static void forget_master_passphrase_cb (GtkAction *action,
439 static gboolean mainwindow_focus_in_event (GtkWidget *widget,
440 GdkEventFocus *focus,
442 static gboolean mainwindow_visibility_event_cb (GtkWidget *widget,
443 GdkEventVisibility *state,
445 static gboolean mainwindow_state_event_cb (GtkWidget *widget,
446 GdkEventWindowState *state,
448 static void main_window_reply_cb (GtkAction *action,
450 static gboolean mainwindow_progressindicator_hook (gpointer source,
453 static gint mailing_list_create_submenu(MainWindow *mainwindow,
456 static gint mailing_list_populate_submenu(GtkWidget *menu, const gchar * list_header);
458 static void get_url_part(const gchar **buf, gchar *url_decoded);
460 static void mailing_list_compose(GtkWidget *w, gpointer *data);
462 static void mailing_list_open_uri(GtkWidget *w, gpointer *data);
463 #define SEPARATE_ACTION 500
464 static void mainwindow_quicksearch (GtkAction *action,
466 static gboolean any_folder_want_synchronise(void);
468 static void save_part_as_cb(GtkAction *action, gpointer data);
469 static void view_part_as_text_cb(GtkAction *action, gpointer data);
470 static void open_part_cb(GtkAction *action, gpointer data);
472 static void open_part_with_cb(GtkAction *action, gpointer data);
474 static void check_signature_cb(GtkAction *action, gpointer data);
475 static void goto_next_part_cb(GtkAction *action, gpointer data);
476 static void goto_prev_part_cb(GtkAction *action, gpointer data);
477 #define DO_ACTION(name, act) { if (!strcmp(a_name, name)) action = act; }
479 static void mainwindow_nothing_cb (GtkAction *action, gpointer data)
484 static void about_cb(GtkAction *gaction, gpointer data)
489 static void mw_inc_mail_cb (GtkAction *gaction, gpointer data)
491 inc_mail_cb(data, 0, NULL);
493 static void mw_inc_all_account_mail_cb (GtkAction *gaction, gpointer data)
495 inc_all_account_mail_cb(data, 0, NULL);
497 static void mw_send_queue_cb (GtkAction *gaction, gpointer data)
499 send_queue_cb(data, 0, NULL);
501 static void mw_compose_mail_cb (GtkAction *gaction, gpointer data)
503 compose_mail_cb(data, 0, NULL);
505 static void mw_compose_news_cb (GtkAction *gaction, gpointer data)
507 compose_news_cb(data, 0, NULL);
510 static GtkActionEntry mainwin_entries[] =
512 {"Menu", NULL, "Menu", NULL, NULL, NULL },
514 {"File", NULL, N_("_File"), NULL, NULL, NULL },
515 {"Edit", NULL, N_("_Edit"), NULL, NULL, NULL },
516 {"View", NULL, N_("_View"), NULL, NULL, NULL },
517 {"Message", NULL, N_("_Message"), NULL, NULL, NULL },
518 {"Tools", NULL, N_("_Tools"), NULL, NULL, NULL },
519 {"Configuration", NULL, N_("_Configuration"), NULL, NULL, NULL },
520 {"Help", NULL, N_("_Help"), NULL, NULL, NULL },
523 {"File/AddMailbox", NULL, N_("_Add mailbox"), NULL, NULL, NULL },
524 {"File/AddMailbox/MH", NULL, N_("MH..."), NULL, NULL, G_CALLBACK(add_mailbox_cb) },
525 {"File/---", NULL, "---", NULL, NULL, NULL },
527 {"File/SortMailboxes", NULL, N_("Change mailbox order..."), NULL, NULL, G_CALLBACK(foldersort_cb) },
529 /* {"File/---", NULL, "---", NULL, NULL, NULL }, */
530 {"File/ImportMbox", NULL, N_("_Import mbox file..."), NULL, NULL, G_CALLBACK(import_mbox_cb) },
531 {"File/ExportMbox", NULL, N_("_Export to mbox file..."), NULL, NULL, G_CALLBACK(export_mbox_cb) },
532 {"File/ExportSelMbox", NULL, N_("_Export selected to mbox file..."), NULL, NULL, G_CALLBACK(export_list_mbox_cb) },
533 /* {"File/---", NULL, "---", NULL, NULL, NULL }, */
534 {"File/EmptyTrashes", NULL, N_("Empty all _Trash folders"), "<shift>D", NULL, G_CALLBACK(empty_trash_cb) },
535 /* {"File/---", NULL, "---", NULL, NULL, NULL }, */
537 {"File/SaveAs", NULL, N_("_Save email as..."), "<control>S", NULL, G_CALLBACK(save_as_cb) },
538 {"File/SavePartAs", NULL, N_("_Save part as..."), "Y", NULL, G_CALLBACK(save_part_as_cb) },
539 /* {"File/---", NULL, "---", NULL, NULL, NULL }, */
541 {"File/PageSetup", NULL, N_("Page setup..."), NULL, NULL, G_CALLBACK(page_setup_cb) },
542 {"File/Print", NULL, N_("_Print..."), "<control>P", NULL, G_CALLBACK(print_cb) },
543 /* {"File/---", NULL, "---", NULL, NULL, NULL }, */
544 {"File/SynchroniseFolders", NULL, N_("Synchronise folders"), "<control><shift>S", NULL, G_CALLBACK(sync_cb) },
545 /* {"File/---", NULL, "---", NULL, NULL, NULL }, */
546 {"File/Exit", NULL, N_("E_xit"), "<control>Q", NULL, G_CALLBACK(app_exit_cb) },
549 {"Edit/Copy", NULL, N_("_Copy"), "<control>C", NULL, G_CALLBACK(copy_cb) },
550 {"Edit/SelectAll", NULL, N_("Select _all"), "<control>A", NULL, G_CALLBACK(allsel_cb) },
551 {"Edit/SelectThread", NULL, N_("Select _thread"), NULL, NULL, G_CALLBACK(select_thread_cb) },
552 {"Edit/---", NULL, "---", NULL, NULL, NULL },
553 {"Edit/Find", NULL, N_("_Find in current message..."), "<control>F", NULL, G_CALLBACK(search_cb) },
554 {"Edit/SearchFolder", NULL, N_("_Search folder..."), "<shift><control>F", NULL, G_CALLBACK(search_folder_cb) },
555 {"Edit/QuickSearch", NULL, N_("_Quick search"), "slash", NULL, G_CALLBACK(mainwindow_quicksearch) },
558 {"View/ShowHide", NULL, N_("Show or hi_de"), NULL, NULL, NULL },
559 {"View/ShowHide/Toolbar", NULL, N_("_Toolbar"), NULL, NULL, NULL },
561 {"View/SetColumns", NULL, N_("Set displayed _columns"), NULL, NULL, NULL },
562 {"View/SetColumns/Folderlist", NULL, N_("In _folder list..."), NULL, NULL, G_CALLBACK(set_folder_display_item_cb) },
563 {"View/SetColumns/Messagelist", NULL, N_("In _message list..."), NULL, NULL, G_CALLBACK(set_summary_display_item_cb) },
564 {"View/---", NULL, "---", NULL, NULL, NULL },
568 {"View/Layout", NULL, N_("La_yout"), NULL, NULL, NULL },
570 {"View/Sort", NULL, N_("_Sort"), NULL, NULL, NULL },
571 {"View/Sort/---", NULL, "---", NULL, NULL, NULL },
572 {"View/Sort/AttractSubj", NULL, N_("_Attract by subject"), NULL, NULL, G_CALLBACK(attract_by_subject_cb) },
574 {"View/ExpandThreads", NULL, N_("E_xpand all threads"), NULL, NULL, G_CALLBACK(expand_threads_cb) },
575 {"View/CollapseThreads", NULL, N_("Co_llapse all threads"), NULL, NULL, G_CALLBACK(collapse_threads_cb) },
577 {"View/Goto", NULL, N_("_Go to"), NULL, NULL, NULL },
578 {"View/Goto/Prev", NULL, N_("_Previous message"), "P", NULL, G_CALLBACK(prev_cb) },
579 {"View/Goto/Next", NULL, N_("_Next message"), "N", NULL, G_CALLBACK(next_cb) },
580 {"View/Goto/---", NULL, "---", NULL, NULL, NULL },
581 {"View/Goto/PrevUnread", NULL, N_("P_revious unread message"), "<shift>P", NULL, G_CALLBACK(prev_unread_cb) },
582 {"View/Goto/NextUnread", NULL, N_("N_ext unread message"), "<shift>N", NULL, G_CALLBACK(next_unread_cb) },
583 /* {"View/Goto/---", NULL, "---", NULL, NULL, NULL }, */
584 {"View/Goto/PrevNew", NULL, N_("Previous ne_w message"), NULL, NULL, G_CALLBACK(prev_new_cb) },
585 {"View/Goto/NextNew", NULL, N_("Ne_xt new message"), NULL, NULL, G_CALLBACK(next_new_cb) },
586 /* {"View/Goto/---", NULL, "---", NULL, NULL, NULL }, */
587 {"View/Goto/PrevMarked", NULL, N_("Previous _marked message"), NULL, NULL, G_CALLBACK(prev_marked_cb) },
588 {"View/Goto/NextMarked", NULL, N_("Next m_arked message"), NULL, NULL, G_CALLBACK(next_marked_cb) },
589 /* {"View/Goto/---", NULL, "---", NULL, NULL, NULL }, */
590 {"View/Goto/PrevLabeled", NULL, N_("Previous _labeled message"), NULL, NULL, G_CALLBACK(prev_labeled_cb) },
591 {"View/Goto/NextLabeled", NULL, N_("Next la_beled message"), NULL, NULL, G_CALLBACK(next_labeled_cb) },
592 /* {"View/Goto/---", NULL, "---", NULL, NULL, NULL }, */
593 {"View/Goto/PrevHistory", NULL, N_("Previous opened message"), "<alt>Left", NULL, G_CALLBACK(prev_history_cb) },
594 {"View/Goto/NextHistory", NULL, N_("Next opened message"), "<alt>Right", NULL, G_CALLBACK(next_history_cb) },
595 /* {"View/Goto/---", NULL, "---", NULL, NULL, NULL }, */
596 {"View/Goto/ParentMessage", NULL, N_("Parent message"), "<control>Up", NULL, G_CALLBACK(parent_cb) },
597 /* {"View/Goto/---", NULL, "---", NULL, NULL, NULL }, */
598 {"View/Goto/NextUnreadFolder", NULL, N_("Next unread _folder"), "<shift>G", NULL, G_CALLBACK(goto_unread_folder_cb) },
599 {"View/Goto/Folder", NULL, N_("F_older..."), "G", NULL, G_CALLBACK(goto_folder_cb) },
600 /* {"View/Goto/---", NULL, "---", NULL, NULL, NULL }, */
601 {"View/Goto/NextPart", NULL, N_("Next part"), "A", NULL, G_CALLBACK(goto_next_part_cb) },
602 {"View/Goto/PrevPart", NULL, N_("Previous part"), "Z", NULL, G_CALLBACK(goto_prev_part_cb) },
604 /* {"View/Scroll/---", NULL, "---", NULL, NULL, NULL }, */
605 {"View/Scroll", NULL, N_("Message scroll"), NULL, NULL, NULL },
606 {"View/Scroll/PrevLine", NULL, N_("Previous line"), NULL, NULL, G_CALLBACK(scroll_prev_line_cb) },
607 {"View/Scroll/NextLine", NULL, N_("Next line"), NULL, NULL, G_CALLBACK(scroll_next_line_cb) },
608 {"View/Scroll/PrevPage", NULL, N_("Previous page"), NULL, NULL, G_CALLBACK(scroll_prev_page_cb) },
609 {"View/Scroll/NextPage", NULL, N_("Next page"), NULL, NULL, G_CALLBACK(scroll_next_page_cb) },
611 /* {"View/---", NULL, "---", NULL, NULL, NULL }, */
612 {"View/Encoding", NULL, N_("Character _encoding"), NULL, NULL, NULL }, /* set_charset_cb */
613 {"View/Encoding/---", NULL, "---", NULL, NULL, NULL },
614 #define ENC_ACTION(cs_char,c_char,string) \
615 { "View/Encoding/" cs_char, NULL, N_(string), NULL, NULL, c_char }
617 {"View/Encoding/Western", NULL, N_("Western European"), NULL, NULL, NULL },
618 {"View/Encoding/Baltic", NULL, N_("Baltic"), NULL, NULL, NULL },
619 {"View/Encoding/Hebrew", NULL, N_("Hebrew"), NULL, NULL, NULL },
620 {"View/Encoding/Arabic", NULL, N_("Arabic"), NULL, NULL, NULL },
621 {"View/Encoding/Cyrillic", NULL, N_("Cyrillic"), NULL, NULL, NULL },
622 {"View/Encoding/Japanese", NULL, N_("Japanese"), NULL, NULL, NULL },
623 {"View/Encoding/Chinese", NULL, N_("Chinese"), NULL, NULL, NULL },
624 {"View/Encoding/Korean", NULL, N_("Korean"), NULL, NULL, NULL },
625 {"View/Encoding/Thai", NULL, N_("Thai"), NULL, NULL, NULL },
627 {"View/Decode", NULL, N_("Decode"), NULL, NULL, NULL }, /* set_decode_cb */
628 {"View/Decode/---", NULL, "---", NULL, NULL, NULL },
630 #define DEC_ACTION(cs_type,c_type,string) \
631 { "View/Decode/" cs_type, NULL, N_(string), NULL, NULL, c_type }
633 /* {"View/---", NULL, "---", NULL, NULL, NULL }, */
634 {"View/OpenNewWindow", NULL, N_("Open in new _window"), "<control><alt>N", NULL, G_CALLBACK(open_msg_cb) },
635 {"View/MessageSource", NULL, N_("Mess_age source"), "<control>U", NULL, G_CALLBACK(view_source_cb) },
636 /* {"View/---", NULL, "---", NULL, NULL, NULL }, */
637 {"View/Part", NULL, N_("Message part"), NULL, NULL, NULL },
638 {"View/Part/AsText", NULL, N_("View as text"), "T", NULL, G_CALLBACK(view_part_as_text_cb) },
639 {"View/Part/Open", NULL, N_("Open"), "L", NULL, G_CALLBACK(open_part_cb) },
641 {"View/Part/OpenWith", NULL, N_("Open with..."), "O", NULL, G_CALLBACK(open_part_with_cb) },
643 /* {"View/---", NULL, "---", NULL, NULL, NULL }, */
645 {"View/Quotes", NULL, N_("Quotes"), NULL, NULL, NULL },
646 /* {"View/---", NULL, "---", NULL, NULL, NULL }, */
647 {"View/UpdateSummary", NULL, N_("_Update summary"), "<control><alt>U", NULL, G_CALLBACK(update_summary_cb) },
650 {"Message/Receive", NULL, N_("Recei_ve"), NULL, NULL, NULL },
651 {"Message/Receive/CurrentAccount", NULL, N_("Get from _current account"), "<control>I", NULL, G_CALLBACK(mw_inc_mail_cb) },
652 {"Message/Receive/AllAccounts", NULL, N_("Get from _all accounts"), "<shift><control>I", NULL, G_CALLBACK(mw_inc_all_account_mail_cb) },
653 {"Message/Receive/CancelReceiving", NULL, N_("Cancel receivin_g"), NULL, NULL, G_CALLBACK(inc_cancel_cb) },
654 {"Message/Receive/---", NULL, "---", NULL, NULL, NULL },
655 {"Message/Receive/PlaceHolder", NULL, "PlaceHolder,", NULL, NULL, G_CALLBACK(mainwindow_nothing_cb) },
656 {"Message/SendQueue", NULL, N_("_Send queued messages"), NULL, NULL, G_CALLBACK(mw_send_queue_cb) },
657 {"Message/CancelSending", NULL, N_("Cancel sending"), NULL, NULL, G_CALLBACK(send_cancel_cb) },
659 {"Message/---", NULL, "---", NULL, NULL, NULL },
661 {"Message/ComposeEmail", NULL, N_("Compose a_n email message"), "<control>M", NULL, G_CALLBACK(mw_compose_mail_cb) },
662 {"Message/ComposeNews", NULL, N_("Compose a news message"), NULL, NULL, G_CALLBACK(mw_compose_news_cb) },
664 {"Message/Reply", NULL, N_("_Reply"), "<control>R", NULL, G_CALLBACK(main_window_reply_cb) }, /* COMPOSE_REPLY */
665 {"Message/ReplyTo", NULL, N_("Repl_y to"), NULL, NULL, NULL },
666 {"Message/ReplyTo/All", NULL, N_("_All"), "<control><shift>R", NULL, G_CALLBACK(main_window_reply_cb) }, /* COMPOSE_REPLY_TO_ALL */
667 {"Message/ReplyTo/Sender", NULL, N_("_Sender"), NULL, NULL, G_CALLBACK(main_window_reply_cb) }, /* COMPOSE_REPLY_TO_SENDER */
668 {"Message/ReplyTo/List", NULL, N_("Mailing _list"), "<control>L", NULL, G_CALLBACK(main_window_reply_cb) }, /* COMPOSE_REPLY_TO_LIST */
669 {"Message/FollowupReply", NULL, N_("Follow-up and reply to"), NULL, NULL, G_CALLBACK(main_window_reply_cb) }, /* COMPOSE_FOLLOWUP_AND_REPLY_TO */
670 /* {"Message/---", NULL, "---", NULL, NULL, NULL }, */
672 {"Message/Forward", NULL, N_("_Forward"), "<control><alt>F", NULL, G_CALLBACK(main_window_reply_cb) }, /* COMPOSE_FORWARD_INLINE */
673 {"Message/ForwardAtt", NULL, N_("For_ward as attachment"), NULL, NULL, G_CALLBACK(main_window_reply_cb) }, /* COMPOSE_FORWARD_AS_ATTACH */
674 {"Message/Redirect", NULL, N_("Redirec_t"), NULL, NULL, G_CALLBACK(main_window_reply_cb) }, /* COMPOSE_REDIRECT */
676 {"Message/MailingList", NULL, N_("Mailing-_List"), NULL, NULL, NULL },
677 {"Message/MailingList/Post", NULL, N_("Post"), NULL, NULL, NULL },
678 {"Message/MailingList/Post/PlaceHolder", NULL, "Placeholder", NULL, NULL, G_CALLBACK(mainwindow_nothing_cb) },
679 {"Message/MailingList/Help", NULL, N_("Help"), NULL, NULL, NULL },
680 {"Message/MailingList/Help/PlaceHolder", NULL, "Placeholder", NULL, NULL, G_CALLBACK(mainwindow_nothing_cb) },
681 {"Message/MailingList/Subscribe", NULL, N_("Subscribe"), NULL, NULL, NULL },
682 {"Message/MailingList/Subscribe/PlaceHolder", NULL, "Placeholder", NULL, NULL, G_CALLBACK(mainwindow_nothing_cb) },
683 {"Message/MailingList/Unsubscribe", NULL, N_("Unsubscribe"), NULL, NULL, NULL },
684 {"Message/MailingList/Unsubscribe/PlaceHolder", NULL, "Placeholder", NULL, NULL, G_CALLBACK(mainwindow_nothing_cb) },
685 {"Message/MailingList/ViewArchive", NULL, N_("View archive"), NULL, NULL, NULL },
686 {"Message/MailingList/ViewArchive/PlaceHolder", NULL, "Placeholder", NULL, NULL, G_CALLBACK(mainwindow_nothing_cb) },
687 {"Message/MailingList/ContactOwner", NULL, N_("Contact owner"), NULL, NULL, NULL },
688 {"Message/MailingList/ContactOwner/PlaceHolder", NULL, "Placeholder", NULL, NULL, G_CALLBACK(mainwindow_nothing_cb) },
691 {"Message/Move", NULL, N_("M_ove..."), "<control>O", NULL, G_CALLBACK(move_to_cb) },
692 {"Message/Copy", NULL, N_("_Copy..."), "<shift><control>O", NULL, G_CALLBACK(copy_to_cb) },
693 {"Message/Trash", NULL, N_("Move to _trash"), "<control>D", NULL, G_CALLBACK(delete_trash_cb) },
694 {"Message/Delete", NULL, N_("_Delete..."), NULL, NULL, G_CALLBACK(delete_cb) },
695 {"Message/TrashThread", NULL, N_("Move thread to tr_ash"), NULL, NULL, G_CALLBACK(trash_thread_cb) },
696 {"Message/DeleteThread", NULL, N_("Delete t_hread"), NULL, NULL, G_CALLBACK(delete_thread_cb) },
697 {"Message/CancelNews", NULL, N_("Cancel a news message"), NULL, NULL, G_CALLBACK(cancel_cb) },
700 {"Message/Mark", NULL, N_("_Mark"), NULL, NULL, NULL },
701 {"Message/Mark/Mark", NULL, N_("_Mark"), "<shift>asterisk", NULL, G_CALLBACK(mark_cb) },
702 {"Message/Mark/Unmark", NULL, N_("_Unmark"), "U", NULL, G_CALLBACK(unmark_cb) },
703 {"Message/Mark/---", NULL, "---", NULL, NULL, NULL },
705 {"Message/Mark/MarkRead", NULL, N_("Mark as rea_d"), NULL, NULL, G_CALLBACK(mark_as_read_cb) },
706 {"Message/Mark/MarkUnread", NULL, N_("Mark as unr_ead"), "<shift>exclam", NULL, G_CALLBACK(mark_as_unread_cb) },
708 {"Message/Mark/MarkAllRead", NULL, N_("Mark all read"), NULL, NULL, G_CALLBACK(mark_all_read_cb) },
709 {"Message/Mark/MarkAllUnread", NULL, N_("Mark all unread"), NULL, NULL, G_CALLBACK(mark_all_unread_cb) },
711 {"Message/Mark/IgnoreThread", NULL, N_("Ignore thread"), NULL, NULL, G_CALLBACK(ignore_thread_cb) },
712 {"Message/Mark/UnignoreThread", NULL, N_("Unignore thread"), NULL, NULL, G_CALLBACK(unignore_thread_cb) },
713 {"Message/Mark/WatchThread", NULL, N_("Watch thread"), NULL, NULL, G_CALLBACK(watch_thread_cb) },
714 {"Message/Mark/UnwatchThread", NULL, N_("Unwatch thread"), NULL, NULL, G_CALLBACK(unwatch_thread_cb) },
717 {"Message/Mark/MarkSpam", NULL, N_("Mark as _spam"), NULL, NULL, G_CALLBACK(mark_as_spam_cb) },
718 {"Message/Mark/MarkHam", NULL, N_("Mark as _ham"), NULL, NULL, G_CALLBACK(mark_as_ham_cb) },
721 {"Message/Mark/Lock", NULL, N_("Lock"), NULL, NULL, G_CALLBACK(lock_msgs_cb) },
722 {"Message/Mark/Unlock", NULL, N_("Unlock"), NULL, NULL, G_CALLBACK(unlock_msgs_cb) },
724 {"Message/ColorLabel", NULL, N_("Color la_bel"), NULL, NULL, NULL },
725 {"Message/Tags", NULL, N_("Ta_gs"), NULL, NULL, NULL },
726 /*{"Message/---", NULL, "---", NULL, NULL, NULL },*/
728 {"Message/Reedit", NULL, N_("Re-_edit"), NULL, NULL, G_CALLBACK(reedit_cb) },
729 /*{"Message/---", NULL, "---", NULL, NULL, NULL },*/
731 {"Message/CheckSignature", NULL, N_("Check signature"), "C", NULL, G_CALLBACK(check_signature_cb) },
735 {"Tools/AddressBook", NULL, N_("_Address book"), "<control><shift>A", NULL, G_CALLBACK(addressbook_open_cb) },
736 {"Tools/AddSenderToAB", NULL, N_("Add sender to address boo_k"), NULL, NULL, G_CALLBACK(add_address_cb) },
738 {"Tools/CollectAddresses", NULL, N_("C_ollect addresses"), NULL, NULL, NULL },
739 {"Tools/CollectAddresses/FromFolder", NULL, N_("From current _folder..."), NULL, NULL, G_CALLBACK(addr_harvest_cb) },
740 {"Tools/CollectAddresses/FromSelected", NULL, N_("From selected _messages..."), NULL, NULL, G_CALLBACK(addr_harvest_msg_cb) },
741 {"Tools/---", NULL, "---", NULL, NULL, NULL },
743 {"Tools/FilterFolder", NULL, N_("_Filter all messages in folder"), NULL, NULL, G_CALLBACK(filter_cb) },
744 {"Tools/FilterSelected", NULL, N_("Filter _selected messages"), NULL, NULL, G_CALLBACK(filter_list_cb) },
745 {"Tools/RunProcessing", NULL, N_("Run folder pr_ocessing rules"), NULL, NULL, G_CALLBACK(process_cb) },
747 {"Tools/CreateFilterRule", NULL, N_("_Create filter rule"), NULL, NULL, NULL },
748 {"Tools/CreateFilterRule/Automatically", NULL, N_("_Automatically"), NULL, NULL, G_CALLBACK(create_filter_cb) }, /* FILTER_BY_AUTO */
749 {"Tools/CreateFilterRule/ByFrom", NULL, N_("By _From"), NULL, NULL, G_CALLBACK(create_filter_cb) }, /* FILTER_BY_FROM */
750 {"Tools/CreateFilterRule/ByTo", NULL, N_("By _To"), NULL, NULL, G_CALLBACK(create_filter_cb) }, /* FILTER_BY_TO */
751 {"Tools/CreateFilterRule/BySubject", NULL, N_("By _Subject"), NULL, NULL, G_CALLBACK(create_filter_cb) }, /* FILTER_BY_SUBJECT */
753 {"Tools/CreateProcessingRule", NULL, N_("Create processing rule"), NULL, NULL, NULL },
754 {"Tools/CreateProcessingRule/Automatically", NULL, N_("_Automatically"), NULL, NULL, G_CALLBACK(create_processing_cb) },
755 {"Tools/CreateProcessingRule/ByFrom", NULL, N_("By _From"), NULL, NULL, G_CALLBACK(create_processing_cb) },
756 {"Tools/CreateProcessingRule/ByTo", NULL, N_("By _To"), NULL, NULL, G_CALLBACK(create_processing_cb) },
757 {"Tools/CreateProcessingRule/BySubject", NULL, N_("By _Subject"), NULL, NULL, G_CALLBACK(create_processing_cb) },
758 /* {"Tools/---", NULL, "---", NULL, NULL, NULL }, */
760 {"Tools/ListUrls", NULL, N_("List _URLs..."), "<control><shift>U", NULL, G_CALLBACK(open_urls_cb) },
762 /* {"Tools/---", NULL, "---", NULL, NULL, NULL }, */
763 {"Tools/Actions", NULL, N_("Actio_ns"), NULL, NULL, NULL },
764 {"Tools/Actions/PlaceHolder", NULL, "Placeholder", NULL, NULL, G_CALLBACK(mainwindow_nothing_cb) },
765 /* {"Tools/---", NULL, "---", NULL, NULL, NULL }, */
767 {"Tools/CheckNewMessages", NULL, N_("Ch_eck for new messages in all folders"), NULL, NULL, G_CALLBACK(update_folderview_cb) },
768 {"Tools/DeleteDuplicates", NULL, N_("Delete du_plicated messages"), NULL, NULL, NULL },
769 {"Tools/DeleteDuplicates/SelFolder", NULL, N_("In selected folder"), NULL, NULL, G_CALLBACK(delete_duplicated_cb) },
770 {"Tools/DeleteDuplicates/AllFolders", NULL, N_("In all folders"), NULL, NULL, G_CALLBACK(delete_duplicated_all_cb) },
771 /* {"Tools/---", NULL, "---", NULL, NULL, NULL }, */
773 {"Tools/Execute", NULL, N_("E_xecute"), "X", NULL, G_CALLBACK(execute_summary_cb) },
774 {"Tools/Expunge", NULL, N_("Exp_unge"), "<control>E", NULL, G_CALLBACK(expunge_summary_cb) },
776 /* {"Tools/---", NULL, "---", NULL, NULL, NULL }, */
777 {"Tools/SSLCertificates", NULL, N_("SSL/TLS cer_tificates"), NULL, NULL, G_CALLBACK(ssl_manager_open_cb) },
779 /* {"Tools/---", NULL, "---", NULL, NULL, NULL }, */
780 {"Tools/FilteringLog", NULL, N_("Filtering Lo_g"), NULL, NULL, G_CALLBACK(filtering_debug_window_show_cb) },
781 {"Tools/NetworkLog", NULL, N_("Network _Log"), "<shift><control>L", NULL, G_CALLBACK(log_window_show_cb) },
782 /* {"Tools/---", NULL, "---", NULL, NULL, NULL }, */
783 {"Tools/ForgetSessionPasswords", NULL, N_("_Forget all session passwords"), NULL, NULL, G_CALLBACK(forget_session_passwords_cb) },
784 #ifndef PASSWORD_CRYPTO_OLD
785 {"Tools/ForgetMasterPassphrase", NULL, N_("Forget _master passphrase"), NULL, NULL, G_CALLBACK(forget_master_passphrase_cb) },
788 /* Configuration menu */
789 {"Configuration/ChangeAccount", NULL, N_("C_hange current account"), NULL, NULL, NULL },
790 {"Configuration/ChangeAccount/PlaceHolder", NULL, "Placeholder", NULL, NULL, G_CALLBACK(mainwindow_nothing_cb) },
791 {"Configuration/AccountPrefs", NULL, N_("_Preferences for current account..."), NULL, NULL, G_CALLBACK(prefs_account_open_cb) },
792 {"Configuration/CreateAccount", NULL, N_("Create _new account..."), NULL, NULL, G_CALLBACK(new_account_cb) },
793 {"Configuration/EditAccounts", NULL, N_("_Edit accounts..."), NULL, NULL, G_CALLBACK(account_edit_open) },
794 {"Configuration/---", NULL, "---", NULL, NULL, NULL },
796 {"Configuration/Preferences", NULL, N_("P_references..."), NULL, NULL, G_CALLBACK(prefs_open_cb) },
797 {"Configuration/PreProcessing", NULL, N_("Pre-pr_ocessing..."), NULL, NULL, G_CALLBACK(prefs_pre_processing_open_cb) },
798 {"Configuration/PostProcessing", NULL, N_("Post-pro_cessing..."), NULL, NULL, G_CALLBACK(prefs_post_processing_open_cb) },
799 {"Configuration/Filtering", NULL, N_("_Filtering..."), NULL, NULL, G_CALLBACK(prefs_filtering_open_cb) },
800 {"Configuration/Templates", NULL, N_("_Templates..."), NULL, NULL, G_CALLBACK(prefs_template_open_cb) },
801 {"Configuration/Actions", NULL, N_("_Actions..."), NULL, NULL, G_CALLBACK(prefs_actions_open_cb) },
802 {"Configuration/Tags", NULL, N_("Tag_s..."), NULL, NULL, G_CALLBACK(prefs_tags_open_cb) },
803 /* {"Configuration/---", NULL, "---", NULL, NULL, NULL }, */
804 {"Configuration/Plugins", NULL, N_("Plu_gins..."), NULL, NULL, G_CALLBACK(plugins_open_cb) },
807 {"Help/Manual", NULL, N_("_Manual"), NULL, NULL, G_CALLBACK(manual_open_cb) },
808 {"Help/FAQ", NULL, N_("_Online User-contributed FAQ"), NULL, NULL, G_CALLBACK(manual_faq_open_cb) },
809 {"Help/IconLegend", NULL, N_("Icon _Legend"), NULL, NULL, G_CALLBACK(legend_open_cb) },
811 {"Help/SetDefault", NULL, N_("Set as default client"), NULL, NULL, G_CALLBACK(set_default_client_cb) },
813 {"Help/---", NULL, "---", NULL, NULL, NULL },
814 {"Help/About", NULL, N_("_About"), NULL, NULL, G_CALLBACK(about_cb) },
817 static GtkToggleActionEntry mainwin_toggle_entries[] = {
818 {"File/OfflineMode", NULL, N_("Offline _mode"), "<control>W", NULL, G_CALLBACK(toggle_work_offline_cb), FALSE }, /*toggle*/
819 {"View/ShowHide/MenuBar", NULL, N_("Men_ubar"), "<control>F12", NULL, G_CALLBACK(toggle_menubar_cb), FALSE }, /* toggle */
820 {"View/ShowHide/MessageView", NULL, N_("_Message view"), "V", NULL, G_CALLBACK(toggle_message_cb), FALSE }, /* toggle */
822 {"View/ShowHide/StatusBar", NULL, N_("Status _bar"), NULL, NULL, G_CALLBACK(toggle_statusbar_cb), FALSE }, /* toggle */
824 {"View/ShowHide/ColumnHeaders", NULL, N_("Column headers"), NULL, NULL, G_CALLBACK(toggle_col_headers_cb), FALSE }, /* toggle */
825 {"View/ThreadView", NULL, N_("Th_read view"), "<control>T", NULL, G_CALLBACK(thread_cb), FALSE }, /* toggle */
826 {"View/HideReadThreads", NULL, N_("Hide read threads"), NULL, NULL, G_CALLBACK(hide_read_threads), FALSE }, /* toggle */
827 {"View/HideReadMessages", NULL, N_("_Hide read messages"), NULL, NULL, G_CALLBACK(hide_read_messages), FALSE }, /* toggle */
828 {"View/HideDelMessages", NULL, N_("Hide deleted messages"), NULL, NULL, G_CALLBACK(hide_del_messages), FALSE }, /* toggle */
829 {"View/FullScreen", NULL, N_("_Fullscreen"), "F11", NULL, G_CALLBACK(toggle_fullscreen_cb), FALSE }, /* toggle */
830 {"View/AllHeaders", NULL, N_("Show all _headers"), "<control>H", NULL, G_CALLBACK(show_all_header_cb), FALSE }, /* toggle */
831 {"View/Quotes/CollapseAll", NULL, N_("_Collapse all"), "<control><shift>Q", NULL, G_CALLBACK(hide_quotes_cb), FALSE }, /* 1 toggle */
832 {"View/Quotes/Collapse2", NULL, N_("Collapse from level _2"), NULL, NULL, G_CALLBACK(hide_quotes_cb), FALSE }, /* 2 toggle */
833 {"View/Quotes/Collapse3", NULL, N_("Collapse from level _3"), NULL, NULL, G_CALLBACK(hide_quotes_cb), FALSE }, /* 3 toggle */
836 static GtkRadioActionEntry mainwin_showhide_radio_entries[] = { /* toggle_toolbar_cb */
837 {"View/ShowHide/Toolbar/TextBelowIcon", NULL, N_("Text _below icons"), NULL, NULL, TOOLBAR_BOTH }, /* radio TOOLBAR_BOTH */
838 {"View/ShowHide/Toolbar/TextBesideIcon", NULL, N_("Text be_side icons"), NULL, NULL, TOOLBAR_BOTH_HORIZ }, /* radio TOOLBAR_BOTH_HORIZ */
839 {"View/ShowHide/Toolbar/IconOnly", NULL, N_("_Icons only"), NULL, NULL, TOOLBAR_ICON }, /* radio TOOLBAR_ICON */
840 {"View/ShowHide/Toolbar/TextOnly", NULL, N_("_Text only"), NULL, NULL, TOOLBAR_TEXT }, /* radio TOOLBAR_TEXT */
842 {"View/ShowHide/Toolbar/Hide", NULL, N_("_Hide"), NULL, NULL, TOOLBAR_NONE }, /* radio TOOLBAR_NONE */
846 static GtkRadioActionEntry mainwin_layout_radio_entries[] = { /* set_layout_cb */
847 {"View/Layout/Standard", NULL, N_("_Standard"), NULL, NULL, NORMAL_LAYOUT }, /* radio NORMAL_LAYOUT */
848 {"View/Layout/ThreeColumns", NULL, N_("_Three columns"), NULL, NULL, VERTICAL_LAYOUT }, /* radio VERTICAL_LAYOUT */
849 {"View/Layout/WideMessage", NULL, N_("_Wide message"), NULL, NULL, WIDE_LAYOUT }, /* radio WIDE_LAYOUT */
850 {"View/Layout/WideMessageList", NULL, N_("W_ide message list"), NULL, NULL, WIDE_MSGLIST_LAYOUT }, /* radio WIDE_MSGLIST_LAYOUT */
851 {"View/Layout/SmallScreen", NULL, N_("S_mall screen"), NULL, NULL, SMALL_LAYOUT }, /* radio SMALL_LAYOUT */
854 static GtkRadioActionEntry mainwin_sort_radio_entries[] = { /* sort_summary_cb */
855 {"View/Sort/Number", NULL, N_("By _number"), NULL, NULL, SORT_BY_NUMBER }, /* radio SORT_BY_NUMBER */
856 {"View/Sort/Size", NULL, N_("By s_ize"), NULL, NULL, SORT_BY_SIZE }, /* radio SORT_BY_SIZE */
857 {"View/Sort/Date", NULL, N_("By _date"), NULL, NULL, SORT_BY_DATE }, /* radio SORT_BY_DATE */
858 {"View/Sort/ThreadDate", NULL, N_("By thread date"), NULL, NULL, SORT_BY_THREAD_DATE }, /* radio SORT_BY_THREAD_DATE */
859 {"View/Sort/From", NULL, N_("By _From"), NULL, NULL, SORT_BY_FROM }, /* radio SORT_BY_FROM */
860 {"View/Sort/To", NULL, N_("By _To"), NULL, NULL, SORT_BY_TO }, /* radio SORT_BY_TO */
861 {"View/Sort/Subject", NULL, N_("By s_ubject"), NULL, NULL, SORT_BY_SUBJECT }, /* radio SORT_BY_SUBJECT */
862 {"View/Sort/Color", NULL, N_("By _color label"), NULL, NULL, SORT_BY_LABEL }, /* radio SORT_BY_LABEL */
863 {"View/Sort/Tag", NULL, N_("By tag"), NULL, NULL, SORT_BY_TAGS }, /* radio SORT_BY_TAGS */
864 {"View/Sort/Mark", NULL, N_("By _mark"), NULL, NULL, SORT_BY_MARK }, /* radio SORT_BY_MARK */
865 {"View/Sort/Status", NULL, N_("By _status"), NULL, NULL, SORT_BY_STATUS }, /* radio SORT_BY_STATUS */
866 {"View/Sort/Attachment", NULL, N_("By a_ttachment"), NULL, NULL, SORT_BY_MIME }, /* radio SORT_BY_MIME */
867 {"View/Sort/Score", NULL, N_("By score"), NULL, NULL, SORT_BY_SCORE }, /* radio SORT_BY_SCORE */
868 {"View/Sort/Locked", NULL, N_("By locked"), NULL, NULL, SORT_BY_LOCKED }, /* radio SORT_BY_LOCKED */
869 {"View/Sort/DontSort", NULL, N_("D_on't sort"), NULL, NULL, SORT_BY_NONE }, /* radio SORT_BY_NONE */
872 static GtkRadioActionEntry mainwin_sorttype_radio_entries[] = { /* sort_summary_type_cb */
873 {"View/Sort/Ascending", NULL, N_("Ascending"), NULL, NULL, SORT_ASCENDING }, /* radio SORT_ASCENDING */
874 {"View/Sort/Descending", NULL, N_("Descending"), NULL, NULL, SORT_DESCENDING }, /* radio SORT_DESCENDING */
877 static GtkRadioActionEntry mainwin_radio_enc_entries[] =
879 ENC_ACTION(CS_AUTO, C_AUTO, N_("_Automatic")), /* RADIO set_charset_cb */
880 ENC_ACTION(CS_US_ASCII, C_US_ASCII, N_("7bit ASCII (US-ASC_II)")), /* RADIO set_charset_cb */
881 ENC_ACTION(CS_UTF_8, C_UTF_8, N_("Unicode (_UTF-8)")), /* RADIO set_charset_cb */
882 ENC_ACTION("Western/"CS_ISO_8859_1, C_ISO_8859_1, "ISO-8859-_1"), /* RADIO set_charset_cb */
883 ENC_ACTION("Western/"CS_ISO_8859_15, C_ISO_8859_15, "ISO-8859-15"), /* RADIO set_charset_cb */
884 ENC_ACTION("Western/"CS_WINDOWS_1252, C_WINDOWS_1252, "Windows-1252"), /* RADIO set_charset_cb */
885 ENC_ACTION(CS_ISO_8859_2, C_ISO_8859_2, N_("Central European (ISO-8859-_2)")), /* RADIO set_charset_cb */
886 ENC_ACTION("Baltic/"CS_ISO_8859_13, C_ISO_8859_13, "ISO-8859-13"), /* RADIO set_charset_cb */
887 ENC_ACTION("Baltic/"CS_ISO_8859_4, C_ISO_8859_14, "ISO-8859-_4"), /* RADIO set_charset_cb */
888 ENC_ACTION(CS_ISO_8859_7, C_ISO_8859_7, N_("Greek (ISO-8859-_7)")), /* RADIO set_charset_cb */
889 ENC_ACTION("Hebrew/"CS_ISO_8859_8, C_ISO_8859_8, "ISO-8859-_8"), /* RADIO set_charset_cb */
890 ENC_ACTION("Hebrew/"CS_WINDOWS_1255, C_WINDOWS_1255, "Windows-1255"), /* RADIO set_charset_cb */
891 ENC_ACTION("Arabic/"CS_ISO_8859_6, C_ISO_8859_6, "ISO-8859-_6"), /* RADIO set_charset_cb */
892 ENC_ACTION("Arabic/"CS_WINDOWS_1256, C_WINDOWS_1256, "Windows-1256"), /* RADIO set_charset_cb */
893 ENC_ACTION(CS_ISO_8859_9, C_ISO_8859_9, N_("Turkish (ISO-8859-_9)")), /* RADIO set_charset_cb */
894 ENC_ACTION("Cyrillic/"CS_ISO_8859_5, C_ISO_8859_5, "ISO-8859-_5"), /* RADIO set_charset_cb */
895 ENC_ACTION("Cyrillic/"CS_KOI8_R, C_KOI8_R, "KOI8-_R"), /* RADIO set_charset_cb */
896 ENC_ACTION("Cyrillic/"CS_MACCYR, C_MACCYR, "_Mac-Cyrillic"), /* RADIO set_charset_cb */
897 ENC_ACTION("Cyrillic/"CS_KOI8_U, C_KOI8_U, "KOI8-_U"), /* RADIO set_charset_cb */
898 ENC_ACTION("Cyrillic/"CS_WINDOWS_1251, C_WINDOWS_1251, "Windows-1251"), /* RADIO set_charset_cb */
899 ENC_ACTION("Japanese/"CS_ISO_2022_JP, C_ISO_2022_JP, "ISO-2022-_JP"), /* RADIO set_charset_cb */
900 ENC_ACTION("Japanese/"CS_ISO_2022_JP_2, C_ISO_2022_JP_2, "ISO-2022-JP-_2"), /* RADIO set_charset_cb */
901 ENC_ACTION("Japanese/"CS_EUC_JP, C_EUC_JP, "_EUC-JP"), /* RADIO set_charset_cb */
902 ENC_ACTION("Japanese/"CS_SHIFT_JIS, C_SHIFT_JIS, "_Shift-JIS"), /* RADIO set_charset_cb */
903 ENC_ACTION("Chinese/"CS_GB18030, C_GB18030, "_GB18030"), /* RADIO set_charset_cb */
904 ENC_ACTION("Chinese/"CS_GB2312, C_GB2312, "_GB2312"), /* RADIO set_charset_cb */
905 ENC_ACTION("Chinese/"CS_GBK, C_GBK, "GB_K"), /* RADIO set_charset_cb */
906 ENC_ACTION("Chinese/"CS_BIG5, C_BIG5, "_Big5-JP"), /* RADIO set_charset_cb */
907 ENC_ACTION("Chinese/"CS_EUC_TW, C_EUC_TW, "EUC-_TW"), /* RADIO set_charset_cb */
908 ENC_ACTION("Korean/"CS_EUC_KR, C_EUC_KR, "_EUC-KR"), /* RADIO set_charset_cb */
909 ENC_ACTION("Korean/"CS_ISO_2022_KR, C_ISO_2022_KR, "_ISO-2022-KR"), /* RADIO set_charset_cb */
910 ENC_ACTION("Thai/"CS_TIS_620, C_TIS_620, "_TIS-620-KR"), /* RADIO set_charset_cb */
911 ENC_ACTION("Thai/"CS_WINDOWS_874, C_WINDOWS_874, "_Windows-874"), /* RADIO set_charset_cb */
914 static GtkRadioActionEntry mainwin_radio_dec_entries[] =
916 DEC_ACTION("AutoDetect", 0, N_("_Auto detect")), /* set_decode_cb */
918 DEC_ACTION("8bit", ENC_8BIT, "_8bit"),
919 DEC_ACTION("QP", ENC_QUOTED_PRINTABLE, "_Quoted printable"),
920 DEC_ACTION("B64", ENC_BASE64, "_Base64"),
921 DEC_ACTION("Uuencode", ENC_X_UUENCODE, "_Uuencode"),
924 static gboolean offline_ask_sync = TRUE;
925 static gboolean is_obscured = FALSE;
927 #define N_COLOR_LABELS colorlabel_get_color_count()
929 static void mainwindow_colorlabel_menu_item_activate_item_cb(GtkMenuItem *menu_item,
934 GtkCheckMenuItem **items;
936 GList *children, *cur;
939 mainwin = (MainWindow *)data;
940 cm_return_if_fail(mainwin != NULL);
942 sel = summary_get_selection(mainwin->summaryview);
945 menu = GTK_MENU_SHELL(mainwin->colorlabel_menu);
946 cm_return_if_fail(menu != NULL);
948 Xalloca(items, (N_COLOR_LABELS + 1) * sizeof(GtkWidget *), return);
950 /* NOTE: don't return prematurely because we set the "dont_toggle"
951 * state for check menu items. This would be bad! */
952 g_object_set_data(G_OBJECT(menu), "dont_toggle",
955 /* clear items. get item pointers. */
956 children = gtk_container_get_children(GTK_CONTAINER(menu));
957 for (n = 0, cur = children; cur != NULL && cur->data != NULL; cur = cur->next) {
958 if (GTK_IS_CHECK_MENU_ITEM(cur->data)) {
959 gtk_check_menu_item_set_active
960 (GTK_CHECK_MENU_ITEM(cur->data), FALSE);
961 items[n] = GTK_CHECK_MENU_ITEM(cur->data);
966 g_list_free(children);
968 if (n == (N_COLOR_LABELS + 1)) {
969 /* iterate all messages and set the state of the appropriate
971 for (; sel != NULL; sel = sel->next) {
975 msginfo = (MsgInfo *)sel->data;
977 clabel = MSG_GET_COLORLABEL_VALUE(msginfo->flags);
978 if (!gtk_check_menu_item_get_active(items[clabel]))
979 gtk_check_menu_item_set_active
980 (items[clabel], TRUE);
984 g_warning("invalid number of color elements (%d)", n);
987 /* reset "dont_toggle" state */
988 g_object_set_data(G_OBJECT(menu), "dont_toggle",
992 static void mainwindow_colorlabel_menu_item_activate_cb(GtkWidget *widget,
995 guint color = GPOINTER_TO_UINT(data);
998 mainwin = g_object_get_data(G_OBJECT(widget), "mainwin");
999 cm_return_if_fail(mainwin != NULL);
1001 /* "dont_toggle" state set? */
1002 if (g_object_get_data(G_OBJECT(mainwin->colorlabel_menu),
1006 summary_set_colorlabel(mainwin->summaryview, color, NULL);
1009 static void mainwindow_tags_menu_item_activate_item_cb(GtkMenuItem *menu_item,
1012 MainWindow *mainwin;
1014 GList *children, *cur;
1016 GHashTable *menu_table = g_hash_table_new_full(
1020 GHashTable *menu_allsel_table = g_hash_table_new_full(
1025 mainwin = (MainWindow *)data;
1026 cm_return_if_fail(mainwin != NULL);
1028 sel = summary_get_selection(mainwin->summaryview);
1031 menu = GTK_MENU_SHELL(mainwin->tags_menu);
1032 cm_return_if_fail(menu != NULL);
1034 /* NOTE: don't return prematurely because we set the "dont_toggle"
1035 * state for check menu items */
1036 g_object_set_data(G_OBJECT(menu), "dont_toggle",
1037 GINT_TO_POINTER(1));
1039 /* clear items. get item pointers. */
1040 children = gtk_container_get_children(GTK_CONTAINER(menu));
1041 for (cur = children; cur != NULL && cur->data != NULL; cur = cur->next) {
1042 if (GTK_IS_CHECK_MENU_ITEM(cur->data)) {
1043 gint id = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(cur->data),
1045 gtk_check_menu_item_set_active
1046 (GTK_CHECK_MENU_ITEM(cur->data), FALSE);
1048 g_hash_table_insert(menu_table, GINT_TO_POINTER(id), GTK_CHECK_MENU_ITEM(cur->data));
1049 g_hash_table_insert(menu_allsel_table, GINT_TO_POINTER(id), GINT_TO_POINTER(0));
1053 g_list_free(children);
1055 /* iterate all messages and set the state of the appropriate
1058 for (; sel != NULL; sel = sel->next) {
1060 GSList *tags = NULL;
1061 GtkCheckMenuItem *item;
1062 msginfo = (MsgInfo *)sel->data;
1065 tags = msginfo->tags;
1069 for (; tags; tags = tags->next) {
1070 gint num_checked = GPOINTER_TO_INT(g_hash_table_lookup(menu_allsel_table, tags->data));
1071 item = g_hash_table_lookup(menu_table, GINT_TO_POINTER(tags->data));
1072 if (item && !gtk_check_menu_item_get_active(item)) {
1073 gtk_check_menu_item_set_active
1077 g_hash_table_replace(menu_allsel_table, tags->data, GINT_TO_POINTER(num_checked));
1082 children = gtk_container_get_children(GTK_CONTAINER(menu));
1083 for (cur = children; cur != NULL && cur->data != NULL; cur = cur->next) {
1084 if (GTK_IS_CHECK_MENU_ITEM(cur->data)) {
1085 gint id = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(cur->data),
1087 gint num_checked = GPOINTER_TO_INT(g_hash_table_lookup(menu_allsel_table, GINT_TO_POINTER(id)));
1088 if (num_checked < sel_len && num_checked > 0)
1089 gtk_check_menu_item_set_inconsistent(GTK_CHECK_MENU_ITEM(cur->data), TRUE);
1091 gtk_check_menu_item_set_inconsistent(GTK_CHECK_MENU_ITEM(cur->data), FALSE);
1094 g_list_free(children);
1096 g_hash_table_destroy(menu_table);
1097 g_hash_table_destroy(menu_allsel_table);
1098 /* reset "dont_toggle" state */
1099 g_object_set_data(G_OBJECT(menu), "dont_toggle",
1100 GINT_TO_POINTER(0));
1103 static void mainwindow_tags_menu_item_activate_cb(GtkWidget *widget,
1106 gint id = GPOINTER_TO_INT(data);
1107 gboolean set = gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(widget));
1108 MainWindow *mainwin;
1110 mainwin = g_object_get_data(G_OBJECT(widget), "mainwin");
1111 cm_return_if_fail(mainwin != NULL);
1113 /* "dont_toggle" state set? */
1114 if (g_object_get_data(G_OBJECT(mainwin->tags_menu),
1120 summary_set_tag(mainwin->summaryview, id, NULL);
1123 void mainwin_accel_changed_cb (GtkAccelGroup *accelgroup, guint keyval, GdkModifierType modifier,
1124 GClosure *closure, GtkMenuItem *item)
1126 GList *closures = gtk_widget_list_accel_closures(GTK_WIDGET(item));
1128 for (cur = closures; cur; cur = cur->next) {
1129 if (closure == cur->data) {
1130 GtkLabel *label = g_object_get_data(G_OBJECT(item), "accel_label");
1133 if (keyval == GDK_KEY_Delete) {
1134 const gchar *accel_path;
1135 accel_path = gtk_menu_item_get_accel_path(item);
1136 keyval = 0; modifier = 0;
1137 gtk_accel_map_change_entry (accel_path, keyval, modifier, TRUE);
1139 new_accel = gtk_accelerator_get_label(keyval, modifier);
1140 gtk_label_set_text(label, new_accel);
1144 g_list_free(closures);
1147 static void mainwindow_colorlabel_menu_create(MainWindow *mainwin, gboolean refresh)
1149 GtkWidget *label_menuitem;
1153 gchar *accel_path = NULL;
1155 label_menuitem = gtk_ui_manager_get_widget(mainwin->ui_manager, "/Menu/Message/ColorLabel");
1156 g_signal_connect(G_OBJECT(label_menuitem), "activate",
1157 G_CALLBACK(mainwindow_colorlabel_menu_item_activate_item_cb),
1159 gtk_widget_show(label_menuitem);
1161 menu = gtk_menu_new();
1162 gtk_menu_set_accel_group (GTK_MENU (menu),
1163 gtk_ui_manager_get_accel_group(mainwin->ui_manager));
1165 /* create sub items. for the menu item activation callback we pass the
1166 * index of label_colors[] as data parameter. for the None color we
1167 * pass an invalid (high) value. also we attach a data pointer so we
1168 * can always get back the Mainwindow pointer. */
1170 item = gtk_check_menu_item_new_with_label(_("None"));
1171 gtk_menu_shell_append(GTK_MENU_SHELL(menu), item);
1172 g_signal_connect(G_OBJECT(item), "activate",
1173 G_CALLBACK(mainwindow_colorlabel_menu_item_activate_cb),
1174 GUINT_TO_POINTER(0));
1175 g_object_set_data(G_OBJECT(item), "mainwin", mainwin);
1176 gtk_widget_show(item);
1178 accel_path = g_strdup_printf("<ClawsColorLabels>/None");
1179 gtk_menu_item_set_accel_path(GTK_MENU_ITEM(item), accel_path);
1181 gtk_accel_map_add_entry("<ClawsColorLabels>/None", GDK_KEY_0, GDK_CONTROL_MASK);
1182 item = gtk_menu_item_new();
1183 gtk_menu_shell_append(GTK_MENU_SHELL(menu), item);
1184 gtk_widget_show(item);
1186 /* create pixmap/label menu items */
1187 for (i = 0; i < N_COLOR_LABELS; i++) {
1188 item = colorlabel_create_check_color_menu_item(
1189 i, refresh, MAINWIN_COLORMENU);
1190 gtk_menu_shell_append(GTK_MENU_SHELL(menu), item);
1191 g_signal_connect(G_OBJECT(item), "activate",
1192 G_CALLBACK(mainwindow_colorlabel_menu_item_activate_cb),
1193 GUINT_TO_POINTER(i + 1));
1194 g_object_set_data(G_OBJECT(item), "mainwin",
1196 gtk_widget_show(item);
1197 accel_path = g_strdup_printf("<ClawsColorLabels>/%d", i+1);
1198 gtk_menu_item_set_accel_path(GTK_MENU_ITEM(item), accel_path);
1200 gtk_accel_map_add_entry(accel_path, GDK_KEY_1+i, GDK_CONTROL_MASK);
1202 g_signal_connect (gtk_ui_manager_get_accel_group(mainwin->ui_manager),
1203 "accel-changed", G_CALLBACK (mainwin_accel_changed_cb), item);
1207 gtk_widget_show(menu);
1208 gtk_menu_item_set_submenu(GTK_MENU_ITEM(label_menuitem), menu);
1209 mainwin->colorlabel_menu = menu;
1212 static void mainwindow_tags_menu_item_apply_tags_activate_cb(GtkWidget *widget,
1215 MainWindow *mainwin;
1217 mainwin = g_object_get_data(G_OBJECT(widget), "mainwin");
1218 cm_return_if_fail(mainwin != NULL);
1220 /* "dont_toggle" state set? */
1221 if (g_object_get_data(G_OBJECT(mainwin->tags_menu),
1225 tag_apply_open(summary_get_selection(mainwin->summaryview));
1228 static gint mainwin_tag_cmp_list(gconstpointer a, gconstpointer b)
1230 gint id_a = GPOINTER_TO_INT(a);
1231 gint id_b = GPOINTER_TO_INT(b);
1232 const gchar *tag_a = tags_get_tag(id_a);
1233 const gchar *tag_b = tags_get_tag(id_b);
1237 return tag_b == NULL ? 0:1;
1242 return g_utf8_collate(tag_a, tag_b);
1245 static void mainwindow_tags_menu_create(MainWindow *mainwin, gboolean refresh)
1247 GtkWidget *label_menuitem;
1250 GSList *cur = tags_get_list();
1251 GSList *orig = NULL;
1252 gboolean existing_tags = FALSE;
1254 cur = orig = g_slist_sort(cur, mainwin_tag_cmp_list);
1256 label_menuitem = gtk_ui_manager_get_widget(mainwin->ui_manager, "/Menu/Message/Tags");
1257 g_signal_connect(G_OBJECT(label_menuitem), "activate",
1258 G_CALLBACK(mainwindow_tags_menu_item_activate_item_cb),
1261 gtk_widget_show(label_menuitem);
1263 menu = gtk_menu_new();
1264 gtk_menu_set_accel_group (GTK_MENU (menu),
1265 gtk_ui_manager_get_accel_group(mainwin->ui_manager));
1267 /* create tags menu items */
1268 for (; cur; cur = cur->next) {
1269 gint id = GPOINTER_TO_INT(cur->data);
1270 const gchar *tag = tags_get_tag(id);
1272 item = gtk_check_menu_item_new_with_label(tag);
1273 gtk_menu_shell_append(GTK_MENU_SHELL(menu), item);
1274 g_signal_connect(G_OBJECT(item), "activate",
1275 G_CALLBACK(mainwindow_tags_menu_item_activate_cb),
1276 GINT_TO_POINTER(id));
1277 g_object_set_data(G_OBJECT(item), "mainwin",
1279 g_object_set_data(G_OBJECT(item), "tag_id",
1280 GINT_TO_POINTER(id));
1281 gtk_widget_show(item);
1282 accel_path = g_strconcat("<ClawsTags>/",tag, NULL);
1283 gtk_menu_item_set_accel_path(GTK_MENU_ITEM(item), accel_path);
1285 existing_tags = TRUE;
1287 if (existing_tags) {
1289 item = gtk_menu_item_new();
1290 gtk_menu_shell_append(GTK_MENU_SHELL(menu), item);
1291 gtk_widget_show(item);
1294 item = gtk_menu_item_new_with_label(_("Apply tags..."));
1295 gtk_menu_shell_append(GTK_MENU_SHELL(menu), item);
1296 g_signal_connect(G_OBJECT(item), "activate",
1297 G_CALLBACK(mainwindow_tags_menu_item_apply_tags_activate_cb),
1299 g_object_set_data(G_OBJECT(item), "mainwin",
1301 gtk_widget_show(item);
1302 accel_path = g_strdup_printf("<ClawsTags>/ApplyTags");
1303 gtk_menu_item_set_accel_path(GTK_MENU_ITEM(item), accel_path);
1305 gtk_accel_map_add_entry("<ClawsTags>/ApplyTags", GDK_KEY_T, GDK_CONTROL_MASK|GDK_SHIFT_MASK);
1307 gtk_widget_show(menu);
1308 gtk_menu_item_set_submenu(GTK_MENU_ITEM(label_menuitem), menu);
1309 mainwin->tags_menu = menu;
1311 #ifndef GENERIC_UMPC
1312 static gboolean warning_icon_pressed(GtkWidget *widget, GdkEventButton *evt,
1313 MainWindow *mainwindow)
1315 if (evt && evt->button == 1) {
1316 log_window_show_error(mainwindow->logwin);
1317 gtk_widget_hide(mainwindow->warning_btn);
1322 static gboolean warning_visi_notify(GtkWidget *widget,
1323 GdkEventVisibility *event,
1324 MainWindow *mainwindow)
1326 gdk_window_set_cursor(gtk_widget_get_window(mainwindow->warning_btn), hand_cursor);
1330 static gboolean warning_leave_notify(GtkWidget *widget,
1331 GdkEventCrossing *event,
1332 MainWindow *mainwindow)
1334 gdk_window_set_cursor(gtk_widget_get_window(mainwindow->warning_btn), NULL);
1338 static gboolean warning_enter_notify(GtkWidget *widget,
1339 GdkEventCrossing *event,
1340 MainWindow *mainwindow)
1342 gdk_window_set_cursor(gtk_widget_get_window(mainwindow->warning_btn), hand_cursor);
1346 void mainwindow_show_error(void)
1348 MainWindow *mainwin = mainwindow_get_mainwindow();
1349 gtk_widget_show(mainwin->warning_btn);
1352 void mainwindow_clear_error(MainWindow *mainwin)
1354 gtk_widget_hide(mainwin->warning_btn);
1357 #define BREAK_ON_MODIFIER_KEY() \
1358 if ((event->state & (GDK_MOD1_MASK|GDK_CONTROL_MASK)) != 0) break
1360 static gboolean mainwindow_key_pressed (GtkWidget *widget, GdkEventKey *event,
1363 MainWindow *mainwin = (MainWindow*) data;
1365 if (!mainwin || !event)
1368 if (quicksearch_has_focus(mainwin->summaryview->quicksearch))
1371 quicksearch_get_entry(mainwin->summaryview->quicksearch);
1373 g_signal_emit_by_name(entry, "key-press-event", event, &handled);
1379 switch (event->keyval) {
1380 case GDK_KEY_Q: /* Quit */
1381 BREAK_ON_MODIFIER_KEY();
1383 if (gtk_window_is_active(GTK_WINDOW(mainwin->window))) {
1384 app_exit_cb(NULL, mainwin);
1388 BREAK_ON_MODIFIER_KEY();
1389 if (gtk_window_is_active(GTK_WINDOW(mainwin->window))) {
1390 if (mainwin->folderview != NULL && mainwin->summaryview != NULL
1391 && ((!mainwin->summaryview->displayed
1392 && !mainwin->summaryview->selected)
1393 || (mainwin->summaryview->folder_item
1394 && mainwin->summaryview->folder_item->total_msgs == 0))) {
1395 g_signal_stop_emission_by_name(G_OBJECT(widget),
1397 folderview_select_next_with_flag(mainwin->folderview, MSG_UNREAD);
1407 #undef BREAK_ON_MODIFIER_KEY
1409 MainWindow *main_window_create()
1411 MainWindow *mainwin;
1415 GtkWidget *handlebox;
1416 GtkWidget *vbox_body;
1417 GtkWidget *menuitem;
1418 #ifndef GENERIC_UMPC
1419 GtkWidget *hbox_stat;
1420 GtkWidget *statusbar;
1421 GtkWidget *progressbar;
1422 GtkWidget *statuslabel;
1423 GtkWidget *ac_button;
1424 GtkWidget *ac_label;
1425 GtkWidget *online_pixmap;
1426 GtkWidget *offline_pixmap;
1427 GtkWidget *warning_icon;
1428 GtkWidget *warning_btn;
1430 GtkWidget *online_switch;
1431 GtkWidget *offline_switch;
1432 FolderView *folderview;
1433 SummaryView *summaryview;
1434 MessageView *messageview;
1435 GdkColormap *colormap;
1436 gboolean success[4];
1441 static GdkGeometry geometry;
1443 debug_print("Creating main window...\n");
1444 mainwin = g_new0(MainWindow, 1);
1447 window = GTK_WIDGET(gtkut_window_new(GTK_WINDOW_TOPLEVEL, "mainwindow"));
1448 gtk_window_set_title(GTK_WINDOW(window), PROG_VERSION);
1449 gtk_window_set_resizable(GTK_WINDOW(window), TRUE);
1451 prefs_common.layout_mode = SMALL_LAYOUT;
1453 if (!geometry.min_height) {
1454 geometry.min_width = 320;
1455 geometry.min_height = 200;
1457 gtk_window_set_geometry_hints(GTK_WINDOW(window), NULL, &geometry,
1460 g_signal_connect(G_OBJECT(window), "delete_event",
1461 G_CALLBACK(main_window_close_cb), mainwin);
1462 MANAGE_WINDOW_SIGNALS_CONNECT(window);
1463 g_signal_connect(G_OBJECT(window), "focus_in_event",
1464 G_CALLBACK(mainwindow_focus_in_event),
1466 g_signal_connect(G_OBJECT(window), "key_press_event",
1467 G_CALLBACK(mainwindow_key_pressed), mainwin);
1469 gtk_widget_realize(window);
1470 gtk_widget_add_events(window, GDK_KEY_PRESS_MASK|GDK_KEY_RELEASE_MASK);
1473 gtkut_widget_set_app_icon(window);
1475 vbox = gtk_vbox_new(FALSE, 0);
1476 gtk_widget_show(vbox);
1477 gtk_container_add(GTK_CONTAINER(window), vbox);
1481 mainwin->ui_manager = gtk_ui_manager_new();
1482 mainwin->action_group = cm_menu_create_action_group_full(mainwin->ui_manager,"Menu", mainwin_entries,
1483 G_N_ELEMENTS(mainwin_entries), (gpointer)mainwin);
1484 gtk_action_group_add_toggle_actions(mainwin->action_group, mainwin_toggle_entries,
1485 G_N_ELEMENTS(mainwin_toggle_entries), (gpointer)mainwin);
1486 gtk_action_group_add_radio_actions(mainwin->action_group, mainwin_showhide_radio_entries,
1487 G_N_ELEMENTS(mainwin_showhide_radio_entries), C_AUTO, G_CALLBACK(toggle_toolbar_cb), (gpointer)mainwin);
1488 #ifndef GENERIC_UMPC
1489 gtk_action_group_add_radio_actions(mainwin->action_group, mainwin_layout_radio_entries,
1490 G_N_ELEMENTS(mainwin_layout_radio_entries), C_AUTO, G_CALLBACK(set_layout_cb), (gpointer)mainwin);
1492 gtk_action_group_add_radio_actions(mainwin->action_group, mainwin_sort_radio_entries,
1493 G_N_ELEMENTS(mainwin_sort_radio_entries), C_AUTO, G_CALLBACK(sort_summary_cb), (gpointer)mainwin);
1494 gtk_action_group_add_radio_actions(mainwin->action_group, mainwin_sorttype_radio_entries,
1495 G_N_ELEMENTS(mainwin_sorttype_radio_entries), C_AUTO, G_CALLBACK(sort_summary_type_cb), (gpointer)mainwin);
1496 gtk_action_group_add_radio_actions(mainwin->action_group, mainwin_radio_enc_entries,
1497 G_N_ELEMENTS(mainwin_radio_enc_entries), C_AUTO, G_CALLBACK(set_charset_cb), (gpointer)mainwin);
1498 gtk_action_group_add_radio_actions(mainwin->action_group, mainwin_radio_dec_entries,
1499 G_N_ELEMENTS(mainwin_radio_dec_entries), C_AUTO, G_CALLBACK(set_decode_cb), (gpointer)mainwin);
1501 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/", "Menu", NULL, GTK_UI_MANAGER_MENUBAR)
1502 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu", "File", "File", GTK_UI_MANAGER_MENU)
1503 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu", "Edit", "Edit", GTK_UI_MANAGER_MENU)
1504 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu", "View", "View", GTK_UI_MANAGER_MENU)
1505 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu", "Message", "Message", GTK_UI_MANAGER_MENU)
1506 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu", "Tools", "Tools", GTK_UI_MANAGER_MENU)
1507 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu", "Configuration", "Configuration", GTK_UI_MANAGER_MENU)
1508 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu", "Help", "Help", GTK_UI_MANAGER_MENU)
1511 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/File", "AddMailbox", "File/AddMailbox", GTK_UI_MANAGER_MENU)
1512 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/File/AddMailbox", "MH", "File/AddMailbox/MH", GTK_UI_MANAGER_MENUITEM)
1513 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/File", "Separator1", "File/---", GTK_UI_MANAGER_SEPARATOR)
1514 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/File", "SortMailboxes", "File/SortMailboxes", GTK_UI_MANAGER_MENUITEM)
1515 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/File", "Separator2", "File/---", GTK_UI_MANAGER_SEPARATOR)
1516 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/File", "ImportMbox", "File/ImportMbox", GTK_UI_MANAGER_MENUITEM)
1517 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/File", "ExportMbox", "File/ExportMbox", GTK_UI_MANAGER_MENUITEM)
1518 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/File", "ExportSelMbox", "File/ExportSelMbox", GTK_UI_MANAGER_MENUITEM)
1519 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/File", "Separator3", "File/---", GTK_UI_MANAGER_SEPARATOR)
1520 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/File", "EmptyTrashes", "File/EmptyTrashes", GTK_UI_MANAGER_MENUITEM)
1521 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/File", "Separator4", "File/---", GTK_UI_MANAGER_SEPARATOR)
1522 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/File", "SaveAs", "File/SaveAs", GTK_UI_MANAGER_MENUITEM)
1523 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/File", "SavePartAs", "File/SavePartAs", GTK_UI_MANAGER_MENUITEM)
1524 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/File", "Separator5", "File/---", GTK_UI_MANAGER_SEPARATOR)
1525 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/File", "PageSetup", "File/PageSetup", GTK_UI_MANAGER_MENUITEM)
1526 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/File", "Print", "File/Print", GTK_UI_MANAGER_MENUITEM)
1527 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/File", "Separator6", "File/---", GTK_UI_MANAGER_SEPARATOR)
1528 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/File", "OfflineMode", "File/OfflineMode", GTK_UI_MANAGER_MENUITEM)
1529 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/File", "SynchroniseFolders", "File/SynchroniseFolders", GTK_UI_MANAGER_MENUITEM)
1530 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/File", "Separator7", "File/---", GTK_UI_MANAGER_SEPARATOR)
1531 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/File", "Exit", "File/Exit", GTK_UI_MANAGER_MENUITEM)
1534 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Edit", "Copy", "Edit/Copy", GTK_UI_MANAGER_MENUITEM)
1535 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Edit", "SelectAll", "Edit/SelectAll", GTK_UI_MANAGER_MENUITEM)
1536 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Edit", "SelectThread", "Edit/SelectThread", GTK_UI_MANAGER_MENUITEM)
1537 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Edit", "Separator1", "Edit/---", GTK_UI_MANAGER_SEPARATOR)
1538 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Edit", "Find", "Edit/Find", GTK_UI_MANAGER_MENUITEM)
1539 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Edit", "SearchFolder", "Edit/SearchFolder", GTK_UI_MANAGER_MENUITEM)
1540 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Edit", "QuickSearch", "Edit/QuickSearch", GTK_UI_MANAGER_MENUITEM)
1543 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View", "ShowHide", "View/ShowHide", GTK_UI_MANAGER_MENU)
1544 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/ShowHide", "MenuBar", "View/ShowHide/MenuBar", GTK_UI_MANAGER_MENUITEM)
1545 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/ShowHide", "Toolbar", "View/ShowHide/Toolbar", GTK_UI_MANAGER_MENU)
1546 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/ShowHide/Toolbar", "TextBelowIcon", "View/ShowHide/Toolbar/TextBelowIcon", GTK_UI_MANAGER_MENUITEM)
1547 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/ShowHide/Toolbar", "TextBesideIcon", "View/ShowHide/Toolbar/TextBesideIcon", GTK_UI_MANAGER_MENUITEM)
1548 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/ShowHide/Toolbar", "IconOnly", "View/ShowHide/Toolbar/IconOnly", GTK_UI_MANAGER_MENUITEM)
1549 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/ShowHide/Toolbar", "TextOnly", "View/ShowHide/Toolbar/TextOnly", GTK_UI_MANAGER_MENUITEM)
1550 #ifndef GENERIC_UMPC
1551 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/ShowHide/Toolbar", "Hide", "View/ShowHide/Toolbar/Hide", GTK_UI_MANAGER_MENUITEM)
1553 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/ShowHide", "MessageView", "View/ShowHide/MessageView", GTK_UI_MANAGER_MENUITEM)
1554 #ifndef GENERIC_UMPC
1555 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/ShowHide", "StatusBar", "View/ShowHide/StatusBar", GTK_UI_MANAGER_MENUITEM)
1557 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/ShowHide", "ColumnHeaders", "View/ShowHide/ColumnHeaders", GTK_UI_MANAGER_MENUITEM)
1558 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View", "SetColumns", "View/SetColumns", GTK_UI_MANAGER_MENU)
1559 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/SetColumns", "Folderlist", "View/SetColumns/Folderlist", GTK_UI_MANAGER_MENUITEM)
1560 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/SetColumns", "Messagelist", "View/SetColumns/Messagelist", GTK_UI_MANAGER_MENUITEM)
1561 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View", "Separator1", "View/---", GTK_UI_MANAGER_SEPARATOR)
1563 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View", "FullScreen", "View/FullScreen", GTK_UI_MANAGER_MENUITEM)
1564 #ifndef GENERIC_UMPC
1565 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View", "Layout", "View/Layout", GTK_UI_MANAGER_MENU)
1566 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Layout", "Standard", "View/Layout/Standard", GTK_UI_MANAGER_MENUITEM)
1567 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Layout", "ThreeColumns", "View/Layout/ThreeColumns", GTK_UI_MANAGER_MENUITEM)
1568 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Layout", "WideMessage", "View/Layout/WideMessage", GTK_UI_MANAGER_MENUITEM)
1569 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Layout", "WideMessageList", "View/Layout/WideMessageList", GTK_UI_MANAGER_MENUITEM)
1570 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Layout", "SmallScreen", "View/Layout/SmallScreen", GTK_UI_MANAGER_MENUITEM)
1571 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View", "Separator2", "View/---", GTK_UI_MANAGER_SEPARATOR)
1574 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View", "Sort", "View/Sort", GTK_UI_MANAGER_MENU)
1575 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Sort", "Number", "View/Sort/Number", GTK_UI_MANAGER_MENUITEM)
1576 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Sort", "Size", "View/Sort/Size", GTK_UI_MANAGER_MENUITEM)
1577 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Sort", "Date", "View/Sort/Date", GTK_UI_MANAGER_MENUITEM)
1578 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Sort", "ThreadDate", "View/Sort/ThreadDate", GTK_UI_MANAGER_MENUITEM)
1579 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Sort", "From", "View/Sort/From", GTK_UI_MANAGER_MENUITEM)
1580 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Sort", "To", "View/Sort/To", GTK_UI_MANAGER_MENUITEM)
1581 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Sort", "Subject", "View/Sort/Subject", GTK_UI_MANAGER_MENUITEM)
1582 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Sort", "Color", "View/Sort/Color", GTK_UI_MANAGER_MENUITEM)
1583 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Sort", "Tag", "View/Sort/Tag", GTK_UI_MANAGER_MENUITEM)
1584 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Sort", "Mark", "View/Sort/Mark", GTK_UI_MANAGER_MENUITEM)
1585 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Sort", "Status", "View/Sort/Status", GTK_UI_MANAGER_MENUITEM)
1586 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Sort", "Attachment", "View/Sort/Attachment", GTK_UI_MANAGER_MENUITEM)
1587 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Sort", "Score", "View/Sort/Score", GTK_UI_MANAGER_MENUITEM)
1588 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Sort", "Locked", "View/Sort/Locked", GTK_UI_MANAGER_MENUITEM)
1589 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Sort", "DontSort", "View/Sort/DontSort", GTK_UI_MANAGER_MENUITEM)
1590 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Sort", "Separator1", "View/Sort/---", GTK_UI_MANAGER_SEPARATOR)
1591 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Sort", "Ascending", "View/Sort/Ascending", GTK_UI_MANAGER_MENUITEM)
1592 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Sort", "Descending", "View/Sort/Descending", GTK_UI_MANAGER_MENUITEM)
1593 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Sort", "Separator2", "View/Sort/---", GTK_UI_MANAGER_SEPARATOR)
1594 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Sort", "AttractSubj", "View/Sort/AttractSubj", GTK_UI_MANAGER_MENUITEM)
1596 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View", "ThreadView", "View/ThreadView", GTK_UI_MANAGER_MENUITEM)
1597 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View", "ExpandThreads", "View/ExpandThreads", GTK_UI_MANAGER_MENUITEM)
1598 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View", "CollapseThreads", "View/CollapseThreads", GTK_UI_MANAGER_MENUITEM)
1599 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View", "HideReadThreads", "View/HideReadThreads", GTK_UI_MANAGER_MENUITEM)
1600 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View", "HideReadMessages", "View/HideReadMessages", GTK_UI_MANAGER_MENUITEM)
1601 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View", "HideDelMessages", "View/HideDelMessages", GTK_UI_MANAGER_MENUITEM)
1602 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View", "Separator3", "View/---", GTK_UI_MANAGER_SEPARATOR)
1604 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View", "Goto", "View/Goto", GTK_UI_MANAGER_MENU)
1605 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Goto", "Prev", "View/Goto/Prev", GTK_UI_MANAGER_MENUITEM)
1606 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Goto", "Next", "View/Goto/Next", GTK_UI_MANAGER_MENUITEM)
1607 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Goto", "Separator1", "View/Goto/---", GTK_UI_MANAGER_SEPARATOR)
1608 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Goto", "PrevUnread", "View/Goto/PrevUnread", GTK_UI_MANAGER_MENUITEM)
1609 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Goto", "NextUnread", "View/Goto/NextUnread", GTK_UI_MANAGER_MENUITEM)
1610 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Goto", "Separator2", "View/Goto/---", GTK_UI_MANAGER_SEPARATOR)
1611 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Goto", "PrevNew", "View/Goto/PrevNew", GTK_UI_MANAGER_MENUITEM)
1612 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Goto", "NextNew", "View/Goto/NextNew", GTK_UI_MANAGER_MENUITEM)
1613 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Goto", "Separator3", "View/Goto/---", GTK_UI_MANAGER_SEPARATOR)
1614 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Goto", "PrevMarked", "View/Goto/PrevMarked", GTK_UI_MANAGER_MENUITEM)
1615 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Goto", "NextMarked", "View/Goto/NextMarked", GTK_UI_MANAGER_MENUITEM)
1616 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Goto", "Separator4", "View/Goto/---", GTK_UI_MANAGER_SEPARATOR)
1617 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Goto", "PrevLabeled", "View/Goto/PrevLabeled", GTK_UI_MANAGER_MENUITEM)
1618 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Goto", "NextLabeled", "View/Goto/NextLabeled", GTK_UI_MANAGER_MENUITEM)
1619 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Goto", "Separator5", "View/Goto/---", GTK_UI_MANAGER_SEPARATOR)
1620 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Goto", "PrevHistory", "View/Goto/PrevHistory", GTK_UI_MANAGER_MENUITEM)
1621 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Goto", "NextHistory", "View/Goto/NextHistory", GTK_UI_MANAGER_MENUITEM)
1622 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Goto", "Separator6", "View/Goto/---", GTK_UI_MANAGER_SEPARATOR)
1623 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Goto", "ParentMessage", "View/Goto/ParentMessage", GTK_UI_MANAGER_MENUITEM)
1624 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Goto", "Separator7", "View/Goto/---", GTK_UI_MANAGER_SEPARATOR)
1625 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Goto", "NextUnreadFolder", "View/Goto/NextUnreadFolder", GTK_UI_MANAGER_MENUITEM)
1626 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Goto", "Folder", "View/Goto/Folder", GTK_UI_MANAGER_MENUITEM)
1627 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Goto", "Separator8", "View/Goto/---", GTK_UI_MANAGER_SEPARATOR)
1628 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Goto", "NextPart", "View/Goto/NextPart", GTK_UI_MANAGER_MENUITEM)
1629 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Goto", "PrevPart", "View/Goto/PrevPart", GTK_UI_MANAGER_MENUITEM)
1630 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View", "Scroll", "View/Scroll", GTK_UI_MANAGER_MENU)
1631 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Scroll", "PrevLine", "View/Scroll/PrevLine", GTK_UI_MANAGER_MENUITEM)
1632 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Scroll", "NextLine", "View/Scroll/NextLine", GTK_UI_MANAGER_MENUITEM)
1633 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Scroll", "PrevPage", "View/Scroll/PrevPage", GTK_UI_MANAGER_MENUITEM)
1634 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Scroll", "NextPage", "View/Scroll/NextPage", GTK_UI_MANAGER_MENUITEM)
1635 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View", "Separator4", "View/---", GTK_UI_MANAGER_SEPARATOR)
1637 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View", "Encoding", "View/Encoding", GTK_UI_MANAGER_MENU)
1638 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding", CS_AUTO, "View/Encoding/"CS_AUTO, GTK_UI_MANAGER_MENUITEM)
1639 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding", "Separator1", "View/Encoding/---", GTK_UI_MANAGER_SEPARATOR)
1640 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding", CS_US_ASCII, "View/Encoding/"CS_US_ASCII, GTK_UI_MANAGER_MENUITEM)
1641 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding", CS_UTF_8, "View/Encoding/"CS_UTF_8, GTK_UI_MANAGER_MENUITEM)
1642 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding", "Separator2", "View/Encoding/---", GTK_UI_MANAGER_SEPARATOR)
1644 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding", "Western", "View/Encoding/Western", GTK_UI_MANAGER_MENU)
1645 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)
1646 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)
1647 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding/Western", CS_WINDOWS_1252, "View/Encoding/Western/"CS_WINDOWS_1252, GTK_UI_MANAGER_MENUITEM)
1649 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding", CS_ISO_8859_2, "View/Encoding/"CS_ISO_8859_2, GTK_UI_MANAGER_MENUITEM)
1651 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding", "Baltic", "View/Encoding/Baltic", GTK_UI_MANAGER_MENU)
1652 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)
1653 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)
1655 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding", CS_ISO_8859_7, "View/Encoding/"CS_ISO_8859_7, GTK_UI_MANAGER_MENUITEM)
1657 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding", "Hebrew", "View/Encoding/Hebrew", GTK_UI_MANAGER_MENU)
1658 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)
1659 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding/Hebrew", CS_WINDOWS_1255, "View/Encoding/Hebrew/"CS_WINDOWS_1255, GTK_UI_MANAGER_MENUITEM)
1661 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding", "Arabic", "View/Encoding/Arabic", GTK_UI_MANAGER_MENU)
1662 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)
1663 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding/Arabic", CS_WINDOWS_1256, "View/Encoding/Arabic/"CS_WINDOWS_1256, GTK_UI_MANAGER_MENUITEM)
1665 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding", CS_ISO_8859_9, "View/Encoding/"CS_ISO_8859_9, GTK_UI_MANAGER_MENUITEM)
1667 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding", "Cyrillic", "View/Encoding/Cyrillic", GTK_UI_MANAGER_MENU)
1668 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)
1669 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding/Cyrillic", CS_KOI8_R, "View/Encoding/Cyrillic/"CS_KOI8_R, GTK_UI_MANAGER_MENUITEM)
1670 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding/Cyrillic", CS_MACCYR, "View/Encoding/Cyrillic/"CS_MACCYR, GTK_UI_MANAGER_MENUITEM)
1671 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding/Cyrillic", CS_KOI8_U, "View/Encoding/Cyrillic/"CS_KOI8_U, GTK_UI_MANAGER_MENUITEM)
1672 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding/Cyrillic", CS_WINDOWS_1251, "View/Encoding/Cyrillic/"CS_WINDOWS_1251, GTK_UI_MANAGER_MENUITEM)
1674 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding", "Japanese", "View/Encoding/Japanese", GTK_UI_MANAGER_MENU)
1675 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)
1676 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)
1677 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding/Japanese", CS_EUC_JP, "View/Encoding/Japanese/"CS_EUC_JP, GTK_UI_MANAGER_MENUITEM)
1678 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding/Japanese", CS_SHIFT_JIS, "View/Encoding/Japanese/"CS_SHIFT_JIS, GTK_UI_MANAGER_MENUITEM)
1680 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding", "Chinese", "View/Encoding/Chinese", GTK_UI_MANAGER_MENU)
1681 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding/Chinese", CS_GB18030, "View/Encoding/Chinese/"CS_GB18030, GTK_UI_MANAGER_MENUITEM)
1682 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding/Chinese", CS_GB2312, "View/Encoding/Chinese/"CS_GB2312, GTK_UI_MANAGER_MENUITEM)
1683 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding/Chinese", CS_GBK, "View/Encoding/Chinese/"CS_GBK, GTK_UI_MANAGER_MENUITEM)
1684 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding/Chinese", CS_BIG5, "View/Encoding/Chinese/"CS_BIG5, GTK_UI_MANAGER_MENUITEM)
1685 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding/Chinese", CS_EUC_TW, "View/Encoding/Chinese/"CS_EUC_TW, GTK_UI_MANAGER_MENUITEM)
1687 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding", "Korean", "View/Encoding/Korean", GTK_UI_MANAGER_MENU)
1688 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding/Korean", CS_EUC_KR, "View/Encoding/Korean/"CS_EUC_KR, GTK_UI_MANAGER_MENUITEM)
1689 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)
1691 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding", "Thai", "View/Encoding/Thai", GTK_UI_MANAGER_MENU)
1692 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding/Thai", CS_TIS_620, "View/Encoding/Thai/"CS_TIS_620, GTK_UI_MANAGER_MENUITEM)
1693 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding/Thai", CS_WINDOWS_874, "View/Encoding/Thai/"CS_WINDOWS_874, GTK_UI_MANAGER_MENUITEM)
1695 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View", "Decode", "View/Decode", GTK_UI_MANAGER_MENU)
1696 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Decode", "AutoDetect", "View/Decode/AutoDetect", GTK_UI_MANAGER_MENUITEM)
1697 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Decode", "Separator1", "View/Decode/---", GTK_UI_MANAGER_SEPARATOR)
1698 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Decode", "8bit", "View/Decode/8bit", GTK_UI_MANAGER_MENUITEM)
1699 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Decode", "QP", "View/Decode/QP", GTK_UI_MANAGER_MENUITEM)
1700 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Decode", "B64", "View/Decode/B64", GTK_UI_MANAGER_MENUITEM)
1701 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Decode", "Uuencode", "View/Decode/Uuencode", GTK_UI_MANAGER_MENUITEM)
1702 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View", "Separator5", "View/---", GTK_UI_MANAGER_SEPARATOR)
1704 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View", "OpenNewWindow", "View/OpenNewWindow", GTK_UI_MANAGER_MENUITEM)
1705 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View", "MessageSource", "View/MessageSource", GTK_UI_MANAGER_MENUITEM)
1706 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View", "AllHeaders", "View/AllHeaders", GTK_UI_MANAGER_MENUITEM)
1707 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View", "Quotes", "View/Quotes", GTK_UI_MANAGER_MENU)
1708 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Quotes", "CollapseAll", "View/Quotes/CollapseAll", GTK_UI_MANAGER_MENUITEM)
1709 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Quotes", "Collapse2", "View/Quotes/Collapse2", GTK_UI_MANAGER_MENUITEM)
1710 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Quotes", "Collapse3", "View/Quotes/Collapse3", GTK_UI_MANAGER_MENUITEM)
1711 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View", "Part", "View/Part", GTK_UI_MANAGER_MENU)
1712 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Part", "AsText", "View/Part/AsText", GTK_UI_MANAGER_MENUITEM)
1713 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Part", "Open", "View/Part/Open", GTK_UI_MANAGER_MENUITEM)
1715 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Part", "OpenWith", "View/Part/OpenWith", GTK_UI_MANAGER_MENUITEM)
1717 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View", "Separator8", "View/---", GTK_UI_MANAGER_SEPARATOR)
1718 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View", "UpdateSummary", "View/UpdateSummary", GTK_UI_MANAGER_MENUITEM)
1721 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message", "Receive", "Message/Receive", GTK_UI_MANAGER_MENU)
1722 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/Receive", "CurrentAccount", "Message/Receive/CurrentAccount", GTK_UI_MANAGER_MENUITEM)
1723 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/Receive", "AllAccounts", "Message/Receive/AllAccounts", GTK_UI_MANAGER_MENUITEM)
1724 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/Receive", "CancelReceiving", "Message/Receive/CancelReceiving", GTK_UI_MANAGER_MENUITEM)
1725 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/Receive", "Separator1", "Message/Receive/---", GTK_UI_MANAGER_SEPARATOR)
1726 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/Receive", "PlaceHolder", "Message/Receive/PlaceHolder", GTK_UI_MANAGER_MENUITEM)
1727 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message", "SendQueue", "Message/SendQueue", GTK_UI_MANAGER_MENUITEM)
1728 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message", "CancelSending", "Message/CancelSending", GTK_UI_MANAGER_MENUITEM)
1729 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message", "Separator1", "Message/---", GTK_UI_MANAGER_SEPARATOR)
1731 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message", "ComposeEmail", "Message/ComposeEmail", GTK_UI_MANAGER_MENUITEM)
1732 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message", "ComposeNews", "Message/ComposeNews", GTK_UI_MANAGER_MENUITEM)
1733 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message", "Reply", "Message/Reply", GTK_UI_MANAGER_MENUITEM)
1734 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message", "ReplyTo", "Message/ReplyTo", GTK_UI_MANAGER_MENU)
1735 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/ReplyTo", "All", "Message/ReplyTo/All", GTK_UI_MANAGER_MENUITEM)
1736 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/ReplyTo", "Sender", "Message/ReplyTo/Sender", GTK_UI_MANAGER_MENUITEM)
1737 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/ReplyTo", "List", "Message/ReplyTo/List", GTK_UI_MANAGER_MENUITEM)
1738 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message", "FollowupReply", "Message/FollowupReply", GTK_UI_MANAGER_MENUITEM)
1739 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message", "Separator2", "Message/---", GTK_UI_MANAGER_SEPARATOR)
1741 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message", "Forward", "Message/Forward", GTK_UI_MANAGER_MENUITEM)
1742 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message", "ForwardAtt", "Message/ForwardAtt", GTK_UI_MANAGER_MENUITEM)
1743 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message", "Redirect", "Message/Redirect", GTK_UI_MANAGER_MENUITEM)
1744 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message", "MailingList", "Message/MailingList", GTK_UI_MANAGER_MENU)
1745 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/MailingList", "Post", "Message/MailingList/Post", GTK_UI_MANAGER_MENU)
1746 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/MailingList", "Help", "Message/MailingList/Help", GTK_UI_MANAGER_MENU)
1747 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/MailingList", "Subscribe", "Message/MailingList/Subscribe", GTK_UI_MANAGER_MENU)
1748 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/MailingList", "Unsubscribe", "Message/MailingList/Unsubscribe", GTK_UI_MANAGER_MENU)
1749 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/MailingList", "ViewArchive", "Message/MailingList/ViewArchive", GTK_UI_MANAGER_MENU)
1750 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/MailingList", "ContactOwner", "Message/MailingList/ContactOwner", GTK_UI_MANAGER_MENU)
1751 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/MailingList/Post", "PlaceHolder", "Message/MailingList/Post/PlaceHolder", GTK_UI_MANAGER_MENUITEM)
1752 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/MailingList/Help", "PlaceHolder", "Message/MailingList/Help/PlaceHolder", GTK_UI_MANAGER_MENUITEM)
1753 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/MailingList/Subscribe", "PlaceHolder", "Message/MailingList/Subscribe/PlaceHolder", GTK_UI_MANAGER_MENUITEM)
1754 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/MailingList/Unsubscribe", "PlaceHolder", "Message/MailingList/Unsubscribe/PlaceHolder", GTK_UI_MANAGER_MENUITEM)
1755 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/MailingList/ViewArchive", "PlaceHolder", "Message/MailingList/ViewArchive/PlaceHolder", GTK_UI_MANAGER_MENUITEM)
1756 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/MailingList/ContactOwner", "PlaceHolder", "Message/MailingList/ContactOwner/PlaceHolder", GTK_UI_MANAGER_MENUITEM)
1757 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message", "Separator3", "Message/---", GTK_UI_MANAGER_SEPARATOR)
1759 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message", "Move", "Message/Move", GTK_UI_MANAGER_MENUITEM)
1760 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message", "Copy", "Message/Copy", GTK_UI_MANAGER_MENUITEM)
1761 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message", "Trash", "Message/Trash", GTK_UI_MANAGER_MENUITEM)
1762 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message", "Delete", "Message/Delete", GTK_UI_MANAGER_MENUITEM)
1763 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message", "TrashThread", "Message/TrashThread", GTK_UI_MANAGER_MENUITEM)
1764 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message", "DeleteThread", "Message/DeleteThread", GTK_UI_MANAGER_MENUITEM)
1765 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message", "CancelNews", "Message/CancelNews", GTK_UI_MANAGER_MENUITEM)
1766 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message", "Separator4", "Message/---", GTK_UI_MANAGER_SEPARATOR)
1768 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message", "Mark", "Message/Mark", GTK_UI_MANAGER_MENU)
1769 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/Mark", "Mark", "Message/Mark/Mark", GTK_UI_MANAGER_MENUITEM)
1770 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/Mark", "Unmark", "Message/Mark/Unmark", GTK_UI_MANAGER_MENUITEM)
1771 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/Mark", "Separator1", "Message/Mark/---", GTK_UI_MANAGER_SEPARATOR)
1772 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/Mark", "MarkRead", "Message/Mark/MarkRead", GTK_UI_MANAGER_MENUITEM)
1773 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/Mark", "MarkUnread", "Message/Mark/MarkUnread", GTK_UI_MANAGER_MENUITEM)
1774 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/Mark", "Separator2", "Message/Mark/---", GTK_UI_MANAGER_SEPARATOR)
1775 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/Mark", "MarkAllRead", "Message/Mark/MarkAllRead", GTK_UI_MANAGER_MENUITEM)
1776 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/Mark", "MarkAllUnread", "Message/Mark/MarkAllUnread", GTK_UI_MANAGER_MENUITEM)
1777 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/Mark", "Separator3", "Message/Mark/---", GTK_UI_MANAGER_SEPARATOR)
1778 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/Mark", "IgnoreThread", "Message/Mark/IgnoreThread", GTK_UI_MANAGER_MENUITEM)
1779 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/Mark", "UnignoreThread", "Message/Mark/UnignoreThread", GTK_UI_MANAGER_MENUITEM)
1780 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/Mark", "WatchThread", "Message/Mark/WatchThread", GTK_UI_MANAGER_MENUITEM)
1781 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/Mark", "UnwatchThread", "Message/Mark/UnwatchThread", GTK_UI_MANAGER_MENUITEM)
1782 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/Mark", "Separator4", "Message/Mark/---", GTK_UI_MANAGER_SEPARATOR)
1783 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/Mark", "MarkSpam", "Message/Mark/MarkSpam", GTK_UI_MANAGER_MENUITEM)
1784 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/Mark", "MarkHam", "Message/Mark/MarkHam", GTK_UI_MANAGER_MENUITEM)
1785 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/Mark", "Separator5", "Message/Mark/---", GTK_UI_MANAGER_SEPARATOR)
1786 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/Mark", "Lock", "Message/Mark/Lock", GTK_UI_MANAGER_MENUITEM)
1787 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/Mark", "Unlock", "Message/Mark/Unlock", GTK_UI_MANAGER_MENUITEM)
1788 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message", "ColorLabel", "Message/ColorLabel", GTK_UI_MANAGER_MENUITEM)
1789 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message", "Tags", "Message/Tags", GTK_UI_MANAGER_MENUITEM)
1790 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message", "Separator5", "Message/---", GTK_UI_MANAGER_SEPARATOR)
1792 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message", "Reedit", "Message/Reedit", GTK_UI_MANAGER_MENUITEM)
1793 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message", "Separator6", "Message/---", GTK_UI_MANAGER_SEPARATOR)
1794 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message", "CheckSignature", "Message/CheckSignature", GTK_UI_MANAGER_MENUITEM)
1797 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools", "AddressBook", "Tools/AddressBook", GTK_UI_MANAGER_MENUITEM)
1798 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools", "AddSenderToAB", "Tools/AddSenderToAB", GTK_UI_MANAGER_MENUITEM)
1799 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools", "CollectAddresses", "Tools/CollectAddresses", GTK_UI_MANAGER_MENU)
1800 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools/CollectAddresses", "FromFolder", "Tools/CollectAddresses/FromFolder", GTK_UI_MANAGER_MENUITEM)
1801 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools/CollectAddresses", "FromSelected", "Tools/CollectAddresses/FromSelected", GTK_UI_MANAGER_MENUITEM)
1802 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools", "Separator1", "Tools/---", GTK_UI_MANAGER_SEPARATOR)
1804 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools", "FilterFolder", "Tools/FilterFolder", GTK_UI_MANAGER_MENUITEM)
1805 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools", "FilterSelected", "Tools/FilterSelected", GTK_UI_MANAGER_MENUITEM)
1806 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools", "RunProcessing", "Tools/RunProcessing", GTK_UI_MANAGER_MENUITEM)
1807 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools", "CreateFilterRule", "Tools/CreateFilterRule", GTK_UI_MANAGER_MENU)
1808 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools/CreateFilterRule", "Automatically", "Tools/CreateFilterRule/Automatically", GTK_UI_MANAGER_MENUITEM)
1809 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools/CreateFilterRule", "ByFrom", "Tools/CreateFilterRule/ByFrom", GTK_UI_MANAGER_MENUITEM)
1810 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools/CreateFilterRule", "ByTo", "Tools/CreateFilterRule/ByTo", GTK_UI_MANAGER_MENUITEM)
1811 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools/CreateFilterRule", "BySubject", "Tools/CreateFilterRule/BySubject", GTK_UI_MANAGER_MENUITEM)
1813 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools", "CreateProcessingRule", "Tools/CreateProcessingRule", GTK_UI_MANAGER_MENU)
1814 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools/CreateProcessingRule", "Automatically", "Tools/CreateProcessingRule/Automatically", GTK_UI_MANAGER_MENUITEM)
1815 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools/CreateProcessingRule", "ByFrom", "Tools/CreateProcessingRule/ByFrom", GTK_UI_MANAGER_MENUITEM)
1816 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools/CreateProcessingRule", "ByTo", "Tools/CreateProcessingRule/ByTo", GTK_UI_MANAGER_MENUITEM)
1817 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools/CreateProcessingRule", "BySubject", "Tools/CreateProcessingRule/BySubject", GTK_UI_MANAGER_MENUITEM)
1818 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools", "Separator2", "Tools/---", GTK_UI_MANAGER_SEPARATOR)
1820 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools", "ListUrls", "Tools/ListUrls", GTK_UI_MANAGER_MENUITEM)
1821 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools", "Separator3", "Tools/---", GTK_UI_MANAGER_SEPARATOR)
1823 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools", "Actions", "Tools/Actions", GTK_UI_MANAGER_MENU)
1824 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools/Actions", "PlaceHolder", "Tools/Actions/PlaceHolder", GTK_UI_MANAGER_MENUITEM)
1825 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools", "Separator4", "Tools/---", GTK_UI_MANAGER_SEPARATOR)
1827 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools", "CheckNewMessages", "Tools/CheckNewMessages", GTK_UI_MANAGER_MENUITEM)
1828 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools", "DeleteDuplicates", "Tools/DeleteDuplicates", GTK_UI_MANAGER_MENU)
1829 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools/DeleteDuplicates", "SelFolder", "Tools/DeleteDuplicates/SelFolder", GTK_UI_MANAGER_MENUITEM)
1830 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools/DeleteDuplicates", "AllFolders", "Tools/DeleteDuplicates/AllFolders", GTK_UI_MANAGER_MENUITEM)
1831 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools", "Separator5", "Tools/---", GTK_UI_MANAGER_SEPARATOR)
1833 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools", "Execute", "Tools/Execute", GTK_UI_MANAGER_MENUITEM)
1834 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools", "Expunge", "Tools/Expunge", GTK_UI_MANAGER_MENUITEM)
1836 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools", "Separator6", "Tools/---", GTK_UI_MANAGER_SEPARATOR)
1837 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools", "SSLCertificates", "Tools/SSLCertificates", GTK_UI_MANAGER_MENUITEM)
1839 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools", "Separator7", "Tools/---", GTK_UI_MANAGER_SEPARATOR)
1840 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools", "FilteringLog", "Tools/FilteringLog", GTK_UI_MANAGER_MENUITEM)
1841 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools", "NetworkLog", "Tools/NetworkLog", GTK_UI_MANAGER_MENUITEM)
1842 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools", "Separator8", "Tools/---", GTK_UI_MANAGER_SEPARATOR)
1843 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools", "ForgetSessionPasswords", "Tools/ForgetSessionPasswords", GTK_UI_MANAGER_MENUITEM)
1844 #ifndef PASSWORD_CRYPTO_OLD
1845 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools", "ForgetMasterPassphrase", "Tools/ForgetMasterPassphrase", GTK_UI_MANAGER_MENUITEM)
1847 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools", "Separator9", "Tools/---", GTK_UI_MANAGER_SEPARATOR)
1849 /* Configuration menu */
1850 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Configuration", "ChangeAccount", "Configuration/ChangeAccount", GTK_UI_MANAGER_MENU)
1851 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Configuration/ChangeAccount", "PlaceHolder", "Configuration/ChangeAccount/PlaceHolder", GTK_UI_MANAGER_MENUITEM)
1852 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Configuration", "AccountPrefs", "Configuration/AccountPrefs", GTK_UI_MANAGER_MENUITEM)
1853 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Configuration", "CreateAccount", "Configuration/CreateAccount", GTK_UI_MANAGER_MENUITEM)
1854 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Configuration", "EditAccounts", "Configuration/EditAccounts", GTK_UI_MANAGER_MENUITEM)
1855 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Configuration", "Separator1", "Configuration/---", GTK_UI_MANAGER_SEPARATOR)
1857 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Configuration", "Preferences", "Configuration/Preferences", GTK_UI_MANAGER_MENUITEM)
1858 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Configuration", "PreProcessing", "Configuration/PreProcessing", GTK_UI_MANAGER_MENUITEM)
1859 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Configuration", "PostProcessing", "Configuration/PostProcessing", GTK_UI_MANAGER_MENUITEM)
1860 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Configuration", "Filtering", "Configuration/Filtering", GTK_UI_MANAGER_MENUITEM)
1861 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Configuration", "Templates", "Configuration/Templates", GTK_UI_MANAGER_MENUITEM)
1862 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Configuration", "Actions", "Configuration/Actions", GTK_UI_MANAGER_MENUITEM)
1863 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Configuration", "Tags", "Configuration/Tags", GTK_UI_MANAGER_MENUITEM)
1865 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Configuration", "Separator2", "Configuration/---", GTK_UI_MANAGER_SEPARATOR)
1866 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Configuration", "Plugins", "Configuration/Plugins", GTK_UI_MANAGER_MENUITEM)
1869 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Help", "Manual", "Help/Manual", GTK_UI_MANAGER_MENUITEM)
1870 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Help", "FAQ", "Help/FAQ", GTK_UI_MANAGER_MENUITEM)
1871 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Help", "IconLegend", "Help/IconLegend", GTK_UI_MANAGER_MENUITEM)
1873 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Help", "Separator1", "Help/---", GTK_UI_MANAGER_SEPARATOR)
1874 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Help", "SetDefault", "Help/SetDefault", GTK_UI_MANAGER_MENUITEM)
1876 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Help", "Separator2", "Help/---", GTK_UI_MANAGER_SEPARATOR)
1877 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Help", "About", "Help/About", GTK_UI_MANAGER_MENUITEM)
1880 menubar = gtk_ui_manager_get_widget(mainwin->ui_manager, "/Menu");
1881 if (prefs_common.mainwin_menubar)
1882 gtk_widget_show_all(menubar);
1884 gtk_widget_hide(menubar);
1885 gtk_window_add_accel_group(GTK_WINDOW(window), gtk_ui_manager_get_accel_group(mainwin->ui_manager));
1887 /* Create a menu container for the different popup menus we
1888 * will be adding from other UI elements. */
1889 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/", "Menus", "Menus", GTK_UI_MANAGER_MENUBAR)
1891 gtk_box_pack_start(GTK_BOX(vbox), menubar, FALSE, TRUE, 0);
1893 if (prefs_common.toolbar_detachable) {
1894 handlebox = gtk_handle_box_new();
1895 gtk_widget_show(handlebox);
1896 gtk_box_pack_start(GTK_BOX(vbox), handlebox, FALSE, FALSE, 0);
1897 g_signal_connect(G_OBJECT(handlebox), "child_attached",
1898 G_CALLBACK(toolbar_child_attached), mainwin);
1899 g_signal_connect(G_OBJECT(handlebox), "child_detached",
1900 G_CALLBACK(toolbar_child_detached), mainwin);
1902 handlebox = gtk_hbox_new(FALSE, 0);
1903 gtk_widget_show(handlebox);
1904 gtk_box_pack_start(GTK_BOX(vbox), handlebox, FALSE, FALSE, 0);
1906 /* link window to mainwin->window to avoid gdk warnings */
1907 mainwin->window = window;
1908 mainwin_list = g_list_append(mainwin_list, mainwin);
1910 mainwin->toolbar = toolbar_create(TOOLBAR_MAIN,
1913 toolbar_set_learn_button
1917 /* vbox that contains body */
1918 vbox_body = gtk_vbox_new(FALSE, BORDER_WIDTH);
1919 gtk_widget_show(vbox_body);
1920 gtk_container_set_border_width(GTK_CONTAINER(vbox_body), BORDER_WIDTH);
1921 gtk_box_pack_start(GTK_BOX(vbox), vbox_body, TRUE, TRUE, 0);
1923 #ifndef GENERIC_UMPC
1924 hbox_stat = gtk_hbox_new(FALSE, 2);
1925 gtk_box_pack_end(GTK_BOX(vbox_body), hbox_stat, FALSE, FALSE, 0);
1927 warning_icon = gtk_image_new_from_stock
1928 (GTK_STOCK_DIALOG_WARNING, GTK_ICON_SIZE_SMALL_TOOLBAR);
1929 warning_btn = gtk_event_box_new();
1930 gtk_event_box_set_visible_window(GTK_EVENT_BOX(warning_btn), FALSE);
1932 mainwin->warning_btn = warning_btn;
1934 g_signal_connect(G_OBJECT(warning_btn), "button-press-event",
1935 G_CALLBACK(warning_icon_pressed),
1936 (gpointer) mainwin);
1937 g_signal_connect(G_OBJECT(warning_btn), "motion-notify-event",
1938 G_CALLBACK(warning_visi_notify), mainwin);
1939 g_signal_connect(G_OBJECT(warning_btn), "leave-notify-event",
1940 G_CALLBACK(warning_leave_notify), mainwin);
1941 g_signal_connect(G_OBJECT(warning_btn), "enter-notify-event",
1942 G_CALLBACK(warning_enter_notify), mainwin);
1944 gtk_container_add (GTK_CONTAINER(warning_btn), warning_icon);
1946 CLAWS_SET_TIP(warning_btn,
1947 _("Some error(s) happened. Click here to view log."));
1948 gtk_box_pack_start(GTK_BOX(hbox_stat), warning_btn, FALSE, FALSE, 0);
1950 statusbar = statusbar_create();
1951 gtk_box_pack_start(GTK_BOX(hbox_stat), statusbar, TRUE, TRUE, 0);
1953 progressbar = gtk_progress_bar_new();
1954 gtk_widget_set_size_request(progressbar, 120, 1);
1955 gtk_box_pack_start(GTK_BOX(hbox_stat), progressbar, FALSE, FALSE, 0);
1957 online_pixmap = stock_pixmap_widget(STOCK_PIXMAP_ONLINE);
1958 offline_pixmap = stock_pixmap_widget(STOCK_PIXMAP_OFFLINE);
1959 online_switch = gtk_button_new ();
1960 gtk_widget_set_can_focus(online_switch, FALSE);
1961 CLAWS_SET_TIP(online_switch,
1962 _("You are online. Click the icon to go offline"));
1963 offline_switch = gtk_button_new ();
1964 CLAWS_SET_TIP(offline_switch,
1965 _("You are offline. Click the icon to go online"));
1966 gtk_container_add (GTK_CONTAINER(online_switch), online_pixmap);
1967 gtk_button_set_relief (GTK_BUTTON(online_switch), GTK_RELIEF_NONE);
1968 g_signal_connect (G_OBJECT(online_switch), "clicked", G_CALLBACK(online_switch_clicked), mainwin);
1969 gtk_box_pack_start (GTK_BOX(hbox_stat), online_switch, FALSE, FALSE, 0);
1970 gtk_container_add (GTK_CONTAINER(offline_switch), offline_pixmap);
1971 gtk_button_set_relief (GTK_BUTTON(offline_switch), GTK_RELIEF_NONE);
1972 g_signal_connect (G_OBJECT(offline_switch), "clicked", G_CALLBACK(online_switch_clicked), mainwin);
1973 gtk_box_pack_start (GTK_BOX(hbox_stat), offline_switch, FALSE, FALSE, 0);
1975 statuslabel = gtk_label_new("");
1976 gtk_box_pack_start(GTK_BOX(hbox_stat), statuslabel, FALSE, FALSE, 0);
1978 ac_button = gtk_button_new();
1979 CLAWS_SET_TIP(ac_button, _("Select account"));
1980 gtk_widget_set_can_focus(ac_button, FALSE);
1981 gtk_widget_set_size_request(ac_button, -1, 0);
1982 gtk_box_pack_end(GTK_BOX(hbox_stat), ac_button, FALSE, FALSE, 0);
1983 g_signal_connect(G_OBJECT(ac_button), "button_press_event",
1984 G_CALLBACK(ac_label_button_pressed), mainwin);
1986 ac_label = gtk_label_new("");
1987 gtk_container_add(GTK_CONTAINER(ac_button), ac_label);
1989 gtk_widget_show_all(hbox_stat);
1991 gtk_widget_hide(offline_switch);
1992 gtk_widget_hide(progressbar);
1993 gtk_widget_hide(warning_btn);
1995 online_switch = gtk_button_new ();
1996 offline_switch = gtk_button_new ();
1997 g_signal_connect (G_OBJECT(online_switch), "clicked", G_CALLBACK(online_switch_clicked), mainwin);
1998 g_signal_connect (G_OBJECT(offline_switch), "clicked", G_CALLBACK(online_switch_clicked), mainwin);
2001 mainwin->folderview = folderview = folderview_create(mainwin);
2002 mainwin->summaryview = summaryview = summary_create(mainwin);
2003 mainwin->messageview = messageview = messageview_create(mainwin);
2005 /* init log instances data before creating log views */
2006 set_log_title(LOG_PROTOCOL, _("Network log"));
2007 set_log_prefs(LOG_PROTOCOL,
2008 &prefs_common.logwin_width,
2009 &prefs_common.logwin_height);
2010 set_log_title(LOG_DEBUG_FILTERING, _("Filtering/Processing debug log"));
2011 set_log_prefs(LOG_DEBUG_FILTERING,
2012 &prefs_common.filtering_debugwin_width,
2013 &prefs_common.filtering_debugwin_height);
2015 /* setup log windows */
2016 mainwin->logwin = log_window_create(LOG_PROTOCOL);
2017 log_window_init(mainwin->logwin);
2019 mainwin->filtering_debugwin = log_window_create(LOG_DEBUG_FILTERING);
2020 log_window_set_clipping(mainwin->logwin,
2021 prefs_common.cliplog,
2022 prefs_common.loglength);
2024 log_window_init(mainwin->filtering_debugwin);
2025 log_window_set_clipping(mainwin->filtering_debugwin,
2026 prefs_common.filtering_debug_cliplog,
2027 prefs_common.filtering_debug_loglength);
2028 if (prefs_common.enable_filtering_debug)
2029 log_message(LOG_DEBUG_FILTERING, _("filtering log enabled\n"));
2031 log_message(LOG_DEBUG_FILTERING, _("filtering log disabled\n"));
2033 folderview->mainwin = mainwin;
2034 folderview->summaryview = summaryview;
2036 summaryview->mainwin = mainwin;
2037 summaryview->folderview = folderview;
2038 summaryview->messageview = messageview;
2039 summaryview->window = window;
2041 mainwin->vbox = vbox;
2042 mainwin->menubar = menubar;
2043 mainwin->handlebox = handlebox;
2044 mainwin->vbox_body = vbox_body;
2045 mainwin->online_switch = online_switch;
2046 mainwin->offline_switch = offline_switch;
2047 #ifndef GENERIC_UMPC
2048 messageview->statusbar = statusbar;
2049 mainwin->statusbar = statusbar;
2050 mainwin->hbox_stat = hbox_stat;
2051 mainwin->progressbar = progressbar;
2052 mainwin->statuslabel = statuslabel;
2053 mainwin->online_pixmap = online_pixmap;
2054 mainwin->offline_pixmap = offline_pixmap;
2055 mainwin->ac_button = ac_button;
2056 mainwin->ac_label = ac_label;
2057 /* set context IDs for status bar */
2058 mainwin->mainwin_cid = gtk_statusbar_get_context_id
2059 (GTK_STATUSBAR(statusbar), "Main Window");
2060 mainwin->folderview_cid = gtk_statusbar_get_context_id
2061 (GTK_STATUSBAR(statusbar), "Folder View");
2062 mainwin->summaryview_cid = gtk_statusbar_get_context_id
2063 (GTK_STATUSBAR(statusbar), "Summary View");
2064 mainwin->messageview_cid = gtk_statusbar_get_context_id
2065 (GTK_STATUSBAR(statusbar), "Message View");
2066 messageview->statusbar_cid = mainwin->messageview_cid;
2069 messageview->statusbar = NULL;
2070 mainwin->statusbar = NULL;
2071 mainwin->hbox_stat = NULL;
2072 /* mainwin->progressbar is set in toolbar.c */
2073 mainwin->statuslabel = NULL;
2074 mainwin->online_pixmap = NULL;
2075 mainwin->offline_pixmap = NULL;
2076 mainwin->ac_button = NULL;
2077 mainwin->ac_label = NULL;
2080 /* allocate colors for summary view and folder view */
2081 summaryview->color_marked.red = summaryview->color_marked.green = 0;
2082 summaryview->color_marked.blue = (guint16)65535;
2084 summaryview->color_dim.red = summaryview->color_dim.green =
2085 summaryview->color_dim.blue = COLOR_DIM;
2087 gtkut_convert_int_to_gdk_color(prefs_common.color[COL_NEW],
2088 &folderview->color_new);
2090 gtkut_convert_int_to_gdk_color(prefs_common.color[COL_TGT_FOLDER],
2091 &folderview->color_op);
2093 color[0] = summaryview->color_marked;
2094 color[1] = summaryview->color_dim;
2095 color[2] = folderview->color_new;
2096 color[3] = folderview->color_op;
2098 colormap = gdk_drawable_get_colormap(gtk_widget_get_window(window));
2099 gdk_colormap_alloc_colors(colormap, color, 4, FALSE, TRUE, success);
2100 for (i = 0; i < 4; i++) {
2101 if (success[i] == FALSE)
2102 g_warning("MainWindow: color allocation %d failed", i);
2105 debug_print("done.\n");
2107 messageview->visible = prefs_common.msgview_visible;
2109 main_window_set_widgets(mainwin, prefs_common.layout_mode);
2111 g_signal_connect(G_OBJECT(window), "size_allocate",
2112 G_CALLBACK(main_window_size_allocate_cb),
2115 /* set menu items */
2116 cm_toggle_menu_set_active_full(mainwin->ui_manager, "Menu/View/Encoding/"CS_AUTO, TRUE);
2119 switch (prefs_common.toolbar_style) {
2121 menuitem = gtk_ui_manager_get_widget(mainwin->ui_manager, "/Menu/View/ShowHide/Toolbar/Hide");
2124 menuitem = gtk_ui_manager_get_widget(mainwin->ui_manager, "/Menu/View/ShowHide/Toolbar/IconOnly");
2127 menuitem = gtk_ui_manager_get_widget(mainwin->ui_manager, "/Menu/View/ShowHide/Toolbar/TextOnly");
2130 menuitem = gtk_ui_manager_get_widget(mainwin->ui_manager, "/Menu/View/ShowHide/Toolbar/TextBelowIcon");
2132 case TOOLBAR_BOTH_HORIZ:
2133 menuitem = gtk_ui_manager_get_widget(mainwin->ui_manager, "/Menu/View/ShowHide/Toolbar/TextBesideIcon");
2135 gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menuitem), TRUE);
2137 toolbar_set_style(mainwin->toolbar->toolbar,
2139 prefs_common.toolbar_style);
2140 #ifndef GENERIC_UMPC
2141 gtk_widget_hide(mainwin->hbox_stat);
2142 menuitem = gtk_ui_manager_get_widget(mainwin->ui_manager, "/Menu/View/ShowHide/StatusBar");
2143 gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menuitem),
2144 prefs_common.show_statusbar);
2146 menuitem = gtk_ui_manager_get_widget(mainwin->ui_manager, "/Menu/View/ShowHide/ColumnHeaders");
2147 gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menuitem),
2148 prefs_common.show_col_headers);
2149 /* set account selection menu */
2150 ac_menu = gtk_ui_manager_get_widget(mainwin->ui_manager, "/Menu/Configuration/ChangeAccount");
2151 mainwin->ac_menu = ac_menu;
2153 toolbar_main_set_sensitive(mainwin);
2155 /* create actions menu */
2156 main_window_update_actions_menu(mainwin);
2158 main_create_mailing_list_menu (mainwin, NULL);
2160 /* attach accel groups to main window */
2161 #define ADD_MENU_ACCEL_GROUP_TO_WINDOW(menu,win) \
2162 gtk_window_add_accel_group \
2164 gtk_ui_manager_get_accel_group(gtkut_ui_manager()));
2166 ADD_MENU_ACCEL_GROUP_TO_WINDOW(summaryview->popupmenu, mainwin->window);
2168 g_signal_connect(G_OBJECT(window), "window_state_event",
2169 G_CALLBACK(mainwindow_state_event_cb), mainwin);
2170 g_signal_connect(G_OBJECT(window), "visibility_notify_event",
2171 G_CALLBACK(mainwindow_visibility_event_cb), mainwin);
2172 gtk_widget_add_events(GTK_WIDGET(window), GDK_VISIBILITY_NOTIFY_MASK);
2174 if (prefs_common.layout_mode == VERTICAL_LAYOUT ||
2175 prefs_common.layout_mode == SMALL_LAYOUT) {
2176 summary_relayout(mainwin->summaryview);
2178 summary_update_unread(mainwin->summaryview, NULL);
2180 /* initialize views */
2181 folderview_init(folderview);
2182 summary_init(summaryview);
2183 messageview_init(messageview);
2185 sslcertwindow_register_hook();
2187 mainwin->lock_count = 0;
2188 mainwin->menu_lock_count = 0;
2189 mainwin->cursor_count = 0;
2191 mainwin->progressindicator_hook =
2192 hooks_register_hook(PROGRESSINDICATOR_HOOKLIST, mainwindow_progressindicator_hook, mainwin);
2195 watch_cursor = gdk_cursor_new(GDK_WATCH);
2197 hand_cursor = gdk_cursor_new(GDK_HAND2);
2199 /* init work_offline */
2200 if (prefs_common.work_offline)
2201 online_switch_clicked (GTK_BUTTON(online_switch), mainwin);
2203 mainwindow_colorlabel_menu_create(mainwin, FALSE);
2204 mainwindow_tags_menu_create(mainwin, FALSE);
2206 if (prefs_common.mainwin_fullscreen) {
2207 cm_toggle_menu_set_active_full(mainwin->ui_manager,
2208 "Menu/View/FullScreen",
2211 if (prefs_common.mainwin_menubar)
2212 cm_toggle_menu_set_active_full(mainwin->ui_manager,"Menu/View/ShowHide/MenuBar", TRUE);
2217 void main_window_update_actions_menu(MainWindow *mainwin)
2219 action_update_mainwin_menu(mainwin->ui_manager, "/Menu/Tools/Actions", mainwin);
2222 void main_window_cursor_wait(MainWindow *mainwin)
2225 if (mainwin->cursor_count == 0) {
2226 gdk_window_set_cursor(gtk_widget_get_window(mainwin->window), watch_cursor);
2227 textview_cursor_wait(mainwin->messageview->mimeview->textview);
2230 mainwin->cursor_count++;
2235 void main_window_cursor_normal(MainWindow *mainwin)
2237 if (mainwin->cursor_count)
2238 mainwin->cursor_count--;
2240 if (mainwin->cursor_count == 0) {
2241 gdk_window_set_cursor(gtk_widget_get_window(mainwin->window), NULL);
2242 textview_cursor_normal(mainwin->messageview->mimeview->textview);
2247 /* lock / unlock the user-interface */
2248 void main_window_lock(MainWindow *mainwin)
2250 if (mainwin->lock_count == 0 && mainwin->ac_button)
2251 gtk_widget_set_sensitive(mainwin->ac_button, FALSE);
2253 mainwin->lock_count++;
2255 main_window_set_menu_sensitive(mainwin);
2256 toolbar_main_set_sensitive(mainwin);
2259 void main_window_unlock(MainWindow *mainwin)
2261 if (mainwin->lock_count)
2262 mainwin->lock_count--;
2264 main_window_set_menu_sensitive(mainwin);
2265 toolbar_main_set_sensitive(mainwin);
2267 if (mainwin->lock_count == 0 && mainwin->ac_button)
2268 gtk_widget_set_sensitive(mainwin->ac_button, TRUE);
2271 static void main_window_menu_callback_block(MainWindow *mainwin)
2273 mainwin->menu_lock_count++;
2276 static void main_window_menu_callback_unblock(MainWindow *mainwin)
2278 if (mainwin->menu_lock_count)
2279 mainwin->menu_lock_count--;
2282 static guint prefs_tag = 0;
2284 void main_window_reflect_prefs_all(void)
2286 main_window_reflect_prefs_all_real(FALSE);
2289 static gboolean reflect_prefs_timeout_cb(gpointer data)
2291 gboolean pixmap_theme_changed = GPOINTER_TO_INT(data);
2293 MainWindow *mainwin;
2294 #ifndef GENERIC_UMPC
2297 for (cur = mainwin_list; cur != NULL; cur = cur->next) {
2298 mainwin = (MainWindow *)cur->data;
2300 main_window_show_cur_account(mainwin);
2301 main_window_set_menu_sensitive(mainwin);
2302 toolbar_main_set_sensitive(mainwin);
2305 if (pixmap_theme_changed) {
2306 toolbar_update(TOOLBAR_MAIN, mainwin);
2307 messageview_reflect_prefs_pixmap_theme();
2308 compose_reflect_prefs_pixmap_theme();
2309 folderview_reinit_fonts(mainwin->folderview);
2310 summary_reflect_prefs_pixmap_theme(mainwin->summaryview);
2311 foldersel_reflect_prefs_pixmap_theme();
2312 #ifndef USE_ALT_ADDRBOOK
2313 addressbook_reflect_prefs_pixmap_theme();
2315 #ifndef GENERIC_UMPC
2316 pixmap = stock_pixmap_widget(STOCK_PIXMAP_ONLINE);
2317 gtk_container_remove(GTK_CONTAINER(mainwin->online_switch),
2318 mainwin->online_pixmap);
2319 gtk_container_add (GTK_CONTAINER(mainwin->online_switch), pixmap);
2320 gtk_widget_show(pixmap);
2321 mainwin->online_pixmap = pixmap;
2322 pixmap = stock_pixmap_widget(STOCK_PIXMAP_OFFLINE);
2323 gtk_container_remove(GTK_CONTAINER(mainwin->offline_switch),
2324 mainwin->offline_pixmap);
2325 gtk_container_add (GTK_CONTAINER(mainwin->offline_switch), pixmap);
2326 gtk_widget_show(pixmap);
2327 mainwin->offline_pixmap = pixmap;
2329 hooks_invoke(THEME_CHANGED_HOOKLIST, NULL);
2332 headerview_set_font(mainwin->messageview->headerview);
2333 headerview_set_visibility(mainwin->messageview->headerview,
2334 prefs_common.display_header_pane);
2335 textview_reflect_prefs(mainwin->messageview->mimeview->textview);
2336 folderview_reflect_prefs();
2337 summary_reflect_prefs();
2338 #ifndef GENERIC_UMPC
2339 summary_redisplay_msg(mainwin->summaryview);
2341 if (prefs_common.layout_mode == SMALL_LAYOUT) {
2342 if (mainwin->in_folder) {
2343 mainwindow_enter_folder(mainwin);
2345 mainwindow_exit_folder(mainwin);
2353 void main_window_reflect_prefs_all_now(void)
2355 reflect_prefs_timeout_cb(GINT_TO_POINTER(FALSE));
2358 void main_window_reflect_prefs_custom_colors(MainWindow *mainwin)
2361 GList *children, *cur;
2363 /* re-create colorlabel submenu */
2364 menu = GTK_MENU_SHELL(mainwin->colorlabel_menu);
2365 cm_return_if_fail(menu != NULL);
2367 /* clear items. get item pointers. */
2368 children = gtk_container_get_children(GTK_CONTAINER(menu));
2369 for (cur = children; cur != NULL && cur->data != NULL; cur = cur->next) {
2370 g_signal_handlers_disconnect_matched
2371 (gtk_ui_manager_get_accel_group(mainwin->ui_manager),
2372 G_SIGNAL_MATCH_DATA|G_SIGNAL_MATCH_FUNC,
2373 0, 0, NULL, mainwin_accel_changed_cb, cur->data);
2374 gtk_menu_item_set_submenu(GTK_MENU_ITEM(cur->data), NULL);
2376 g_list_free(children);
2377 mainwindow_colorlabel_menu_create(mainwin, TRUE);
2378 summary_reflect_prefs_custom_colors(mainwin->summaryview);
2379 folderview_reinit_fonts(mainwin->folderview);
2382 static gint tags_tag = 0;
2383 static gboolean main_window_reflect_tags_changes_real(gpointer data)
2386 GList *children, *cur;
2387 MainWindow *mainwin = (MainWindow *)data;
2389 if (summary_is_locked(mainwin->summaryview)) {
2392 /* re-create tags submenu */
2393 menu = GTK_MENU_SHELL(mainwin->tags_menu);
2394 cm_return_val_if_fail(menu != NULL, FALSE);
2396 /* clear items. get item pointers. */
2397 children = gtk_container_get_children(GTK_CONTAINER(menu));
2398 for (cur = children; cur != NULL && cur->data != NULL; cur = cur->next) {
2399 gtk_menu_item_set_submenu(GTK_MENU_ITEM(cur->data), NULL);
2401 g_list_free(children);
2402 mainwindow_tags_menu_create(mainwin, TRUE);
2403 summary_reflect_tags_changes(mainwin->summaryview);
2409 void main_window_reflect_tags_changes(MainWindow *mainwin)
2411 if (tags_tag == 0) {
2412 tags_tag = g_timeout_add(100, main_window_reflect_tags_changes_real,
2417 void main_window_reflect_prefs_all_real(gboolean pixmap_theme_changed)
2419 if (prefs_tag == 0) {
2420 prefs_tag = g_timeout_add(100, reflect_prefs_timeout_cb,
2421 GINT_TO_POINTER(pixmap_theme_changed));
2425 void main_window_set_summary_column(void)
2428 MainWindow *mainwin;
2430 for (cur = mainwin_list; cur != NULL; cur = cur->next) {
2431 mainwin = (MainWindow *)cur->data;
2432 summary_set_column_order(mainwin->summaryview);
2436 void main_window_set_folder_column(void)
2439 MainWindow *mainwin;
2441 for (cur = mainwin_list; cur != NULL; cur = cur->next) {
2442 mainwin = (MainWindow *)cur->data;
2443 folderview_set_column_order(mainwin->folderview);
2447 static void main_window_set_account_selector_menu(MainWindow *mainwin,
2448 GList *account_list)
2451 GtkWidget *menuitem;
2452 PrefsAccount *ac_prefs;
2456 menu = gtk_menu_new();
2457 gtk_menu_set_accel_group (GTK_MENU (menu),
2458 gtk_ui_manager_get_accel_group(mainwin->ui_manager));
2460 for (cur_ac = account_list; cur_ac != NULL; cur_ac = cur_ac->next) {
2461 ac_prefs = (PrefsAccount *)cur_ac->data;
2463 menuitem = gtk_menu_item_new_with_label
2464 (ac_prefs->account_name
2465 ? ac_prefs->account_name : _("Untitled"));
2466 gtk_widget_show(menuitem);
2467 gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem);
2468 g_signal_connect(G_OBJECT(menuitem), "activate",
2469 G_CALLBACK(account_selector_menu_cb),
2471 accel_path = g_strconcat("<Actions>/Menu/Configuration/ChangeAccount/",(ac_prefs->account_name
2472 ? ac_prefs->account_name : _("Untitled")), NULL );
2473 gtk_menu_item_set_accel_path(GTK_MENU_ITEM(menuitem), accel_path);
2476 gtk_menu_item_set_submenu(GTK_MENU_ITEM(mainwin->ac_menu), menu);
2479 static void main_window_set_account_receive_menu(MainWindow *mainwin,
2480 GList *account_list)
2482 GList *children, *child;
2484 GtkWidget *menuitem;
2485 PrefsAccount *ac_prefs;
2487 menu = gtk_menu_item_get_submenu(GTK_MENU_ITEM(
2488 gtk_ui_manager_get_widget(mainwin->ui_manager, "/Menu/Message/Receive")));
2490 /* search for separator */
2491 children = gtk_container_get_children(GTK_CONTAINER(menu));
2492 for (child = children; child != NULL; child = child->next) {
2493 if (child->data == gtk_ui_manager_get_widget(mainwin->ui_manager, "/Menu/Message/Receive/Separator1")) {
2494 child = child->next;
2499 /* destroy all previous menu item */
2500 while (child != NULL) {
2501 gtk_widget_destroy(GTK_WIDGET(child->data));
2502 child = child->next;
2505 g_list_free(children);
2507 for (child = account_list; child != NULL; child = child->next) {
2508 ac_prefs = (PrefsAccount *)child->data;
2510 if (ac_prefs->protocol == A_NONE)
2513 menuitem = gtk_menu_item_new_with_label
2514 (ac_prefs->account_name ? ac_prefs->account_name
2516 gtk_widget_show(menuitem);
2517 gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem);
2518 g_signal_connect(G_OBJECT(menuitem), "activate",
2519 G_CALLBACK(account_receive_menu_cb),
2524 static void main_window_set_toolbar_combo_receive_menu(MainWindow *mainwin,
2525 GList *account_list)
2528 GtkWidget *menuitem;
2529 PrefsAccount *ac_prefs;
2530 GtkWidget *menu = NULL;
2532 if (mainwin->toolbar->getall_btn == NULL) /* button doesn't exist */
2535 menu = gtk_menu_tool_button_get_menu(GTK_MENU_TOOL_BUTTON(mainwin->toolbar->getall_btn));
2537 gtk_widget_destroy(menu);
2538 menu = gtk_menu_new();
2540 for (cur_ac = account_list; cur_ac != NULL; cur_ac = cur_ac->next) {
2541 ac_prefs = (PrefsAccount *)cur_ac->data;
2543 if (ac_prefs->protocol == A_NONE)
2546 menuitem = gtk_menu_item_new_with_label
2547 (ac_prefs->account_name
2548 ? ac_prefs->account_name : _("Untitled"));
2549 gtk_widget_show(menuitem);
2550 gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem);
2551 g_signal_connect(G_OBJECT(menuitem), "activate",
2552 G_CALLBACK(account_receive_menu_cb),
2555 gtk_menu_tool_button_set_menu(GTK_MENU_TOOL_BUTTON(mainwin->toolbar->getall_btn), menu);
2558 static void main_window_set_toolbar_combo_compose_menu(MainWindow *mainwin,
2559 GList *account_list)
2561 #ifndef GENERIC_UMPC
2563 GtkWidget *menuitem;
2564 PrefsAccount *ac_prefs;
2565 GtkWidget *menu = NULL;
2567 if (mainwin->toolbar->compose_mail_btn == NULL) /* button doesn't exist */
2570 menu = gtk_menu_tool_button_get_menu(GTK_MENU_TOOL_BUTTON(mainwin->toolbar->compose_mail_btn));
2572 gtk_widget_destroy(menu);
2573 menu = gtk_menu_new();
2575 for (cur_ac = account_list; cur_ac != NULL; cur_ac = cur_ac->next) {
2576 ac_prefs = (PrefsAccount *)cur_ac->data;
2578 menuitem = gtk_menu_item_new_with_label
2579 (ac_prefs->account_name
2580 ? ac_prefs->account_name : _("Untitled"));
2581 gtk_widget_show(menuitem);
2582 gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem);
2583 g_signal_connect(G_OBJECT(menuitem), "activate",
2584 G_CALLBACK(account_compose_menu_cb),
2587 gtk_menu_tool_button_set_menu(GTK_MENU_TOOL_BUTTON(mainwin->toolbar->compose_mail_btn), menu);
2591 void main_window_set_account_menu(GList *account_list)
2594 MainWindow *mainwin;
2596 for (cur = mainwin_list; cur != NULL; cur = cur->next) {
2597 mainwin = (MainWindow *)cur->data;
2598 main_window_set_account_selector_menu(mainwin, account_list);
2599 main_window_set_account_receive_menu(mainwin, account_list);
2600 main_window_set_toolbar_combo_receive_menu(mainwin, account_list);
2601 main_window_set_toolbar_combo_compose_menu(mainwin, account_list);
2603 hooks_invoke(ACCOUNT_LIST_CHANGED_HOOKLIST, NULL);
2606 void main_window_set_account_menu_only_toolbar(GList *account_list)
2609 MainWindow *mainwin;
2611 for (cur = mainwin_list; cur != NULL; cur = cur->next) {
2612 mainwin = (MainWindow *)cur->data;
2613 main_window_set_toolbar_combo_receive_menu(mainwin, account_list);
2614 main_window_set_toolbar_combo_compose_menu(mainwin, account_list);
2618 static void main_window_show_cur_account(MainWindow *mainwin)
2623 ac_name = g_strdup(cur_account
2624 ? (cur_account->account_name
2625 ? cur_account->account_name : _("Untitled"))
2629 buf = g_strdup_printf("%s - %s", ac_name, PROG_VERSION);
2631 buf = g_strdup(PROG_VERSION);
2632 gtk_window_set_title(GTK_WINDOW(mainwin->window), buf);
2635 if (mainwin->ac_label)
2636 gtk_label_set_text(GTK_LABEL(mainwin->ac_label), ac_name);
2637 if (mainwin->ac_button)
2638 gtk_widget_queue_resize(mainwin->ac_button);
2642 #ifndef GENERIC_UMPC
2643 static void main_window_separation_change(MainWindow *mainwin, LayoutType layout_mode)
2645 GtkWidget *folder_wid = GTK_WIDGET_PTR(mainwin->folderview);
2646 GtkWidget *summary_wid = GTK_WIDGET_PTR(mainwin->summaryview);
2647 GtkWidget *message_wid = mainwin->messageview->vbox;
2649 if (layout_mode == prefs_common.layout_mode)
2652 debug_print("Changing window separation type from %d to %d\n",
2653 prefs_common.layout_mode, layout_mode);
2655 /* remove widgets from those containers */
2656 g_object_ref(folder_wid);
2657 g_object_ref(summary_wid);
2658 g_object_ref(message_wid);
2659 gtkut_container_remove
2660 (GTK_CONTAINER(gtk_widget_get_parent(folder_wid)), folder_wid);
2661 gtkut_container_remove
2662 (GTK_CONTAINER(gtk_widget_get_parent(summary_wid)), summary_wid);
2663 gtkut_container_remove
2664 (GTK_CONTAINER(gtk_widget_get_parent(message_wid)), message_wid);
2666 gtk_widget_hide(mainwin->window);
2667 main_window_set_widgets(mainwin, layout_mode);
2668 gtk_widget_show(mainwin->window);
2670 g_object_unref(folder_wid);
2671 g_object_unref(summary_wid);
2672 g_object_unref(message_wid);
2675 void mainwindow_reset_paned(GtkPaned *paned)
2679 if (gtk_paned_get_child1(GTK_PANED(paned)))
2680 gtk_widget_show(gtk_paned_get_child1(GTK_PANED(paned)));
2681 if (gtk_paned_get_child2(GTK_PANED(paned)))
2682 gtk_widget_show(gtk_paned_get_child2(GTK_PANED(paned)));
2685 g_object_get (G_OBJECT(paned),
2688 g_object_get (G_OBJECT(paned),
2692 gtk_paned_set_position(GTK_PANED(paned), mid);
2695 static void mainwin_paned_show_first(GtkPaned *paned)
2698 g_object_get (G_OBJECT(paned),
2702 if (gtk_paned_get_child1(GTK_PANED(paned)))
2703 gtk_widget_show(gtk_paned_get_child1(GTK_PANED(paned)));
2704 if (gtk_paned_get_child2(GTK_PANED(paned)))
2705 gtk_widget_hide(gtk_paned_get_child2(GTK_PANED(paned)));
2706 gtk_paned_set_position(GTK_PANED(paned), max);
2709 static void mainwin_paned_show_last(GtkPaned *paned)
2712 g_object_get (G_OBJECT(paned),
2716 if (gtk_paned_get_child1(GTK_PANED(paned)))
2717 gtk_widget_hide(gtk_paned_get_child1(GTK_PANED(paned)));
2718 if (gtk_paned_get_child2(GTK_PANED(paned)))
2719 gtk_widget_show(gtk_paned_get_child2(GTK_PANED(paned)));
2720 gtk_paned_set_position(GTK_PANED(paned), min);
2723 void main_window_toggle_message_view(MainWindow *mainwin)
2725 SummaryView *summaryview = mainwin->summaryview;
2726 GtkWidget *ppaned = NULL;
2727 GtkWidget *container = NULL;
2729 switch (prefs_common.layout_mode) {
2731 case VERTICAL_LAYOUT:
2733 ppaned = mainwin->vpaned;
2734 container = mainwin->hpaned;
2735 if (gtk_widget_get_parent(ppaned) != NULL) {
2736 mainwin->messageview->visible = FALSE;
2737 summaryview->displayed = NULL;
2738 g_object_ref(ppaned);
2739 gtkut_container_remove(GTK_CONTAINER(container), ppaned);
2740 gtk_widget_reparent(GTK_WIDGET_PTR(summaryview), container);
2742 mainwin->messageview->visible = TRUE;
2743 gtk_widget_reparent(GTK_WIDGET_PTR(summaryview), ppaned);
2744 gtk_container_add(GTK_CONTAINER(container), ppaned);
2745 g_object_unref(ppaned);
2749 container = mainwin->vpaned;
2750 if (gtk_widget_get_parent(mainwin->messageview->vbox) != NULL) {
2751 mainwin->messageview->visible = FALSE;
2752 summaryview->displayed = NULL;
2753 g_object_ref(mainwin->messageview->vbox);
2754 gtkut_container_remove(GTK_CONTAINER(container), mainwin->messageview->vbox);
2756 mainwin->messageview->visible = TRUE;
2757 gtk_container_add(GTK_CONTAINER(container), mainwin->messageview->vbox);
2758 g_object_unref(mainwin->messageview->vbox);
2761 case WIDE_MSGLIST_LAYOUT:
2762 g_warning("can't hide messageview in this wide msglist layout");
2766 if (messageview_is_visible(mainwin->messageview))
2767 gtk_arrow_set(GTK_ARROW(mainwin->summaryview->toggle_arrow),
2768 GTK_ARROW_DOWN, GTK_SHADOW_OUT);
2770 gtk_arrow_set(GTK_ARROW(mainwin->summaryview->toggle_arrow),
2771 GTK_ARROW_UP, GTK_SHADOW_OUT);
2773 if (mainwin->messageview->visible == FALSE)
2774 messageview_clear(mainwin->messageview);
2776 main_window_set_menu_sensitive(mainwin);
2778 prefs_common.msgview_visible = mainwin->messageview->visible;
2780 if (messageview_is_visible(mainwin->messageview)) {
2781 gtk_widget_queue_resize(mainwin->hpaned);
2782 gtk_widget_queue_resize(mainwin->vpaned);
2784 summary_grab_focus(summaryview);
2785 if (!summary_is_list(summaryview)) {
2786 summary_show(summaryview, summaryview->folder_item);
2790 void main_window_get_size(MainWindow *mainwin)
2792 GtkAllocation allocation;
2794 if (mainwin_list == NULL || mainwin->messageview == NULL) {
2795 debug_print("called after messageview "
2796 "has been deallocated!\n");
2800 if (prefs_common.mainwin_fullscreen) {
2801 debug_print("mainwin in full screen state. "
2802 "Keeping original settings\n");
2805 gtk_widget_get_allocation(GTK_WIDGET_PTR(mainwin->summaryview), &allocation);
2806 if (allocation.width > 1 && allocation.height > 1 && !prefs_common.mainwin_fullscreen) {
2807 prefs_common.summaryview_width = allocation.width;
2809 if (messageview_is_visible(mainwin->messageview))
2810 prefs_common.summaryview_height = allocation.height;
2812 prefs_common.mainview_width = allocation.width;
2815 gtk_widget_get_allocation(mainwin->window, &allocation);
2816 if (allocation.width > 1 && allocation.height > 1 &&
2817 !prefs_common.mainwin_maximised && !prefs_common.mainwin_fullscreen) {
2818 prefs_common.mainview_height = allocation.height;
2819 prefs_common.mainwin_width = allocation.width;
2820 prefs_common.mainwin_height = allocation.height;
2823 gtk_widget_get_allocation(GTK_WIDGET_PTR(mainwin->folderview), &allocation);
2824 if (allocation.width > 1 && allocation.height > 1 &&
2825 !prefs_common.mainwin_fullscreen) {
2826 prefs_common.folderview_width = allocation.width;
2827 prefs_common.folderview_height = allocation.height;
2830 gtk_widget_get_allocation(GTK_WIDGET_PTR(mainwin->messageview), &allocation);
2831 if (allocation.width > 1 && allocation.height > 1 &&
2832 !prefs_common.mainwin_fullscreen) {
2833 prefs_common.msgview_width = allocation.width;
2834 prefs_common.msgview_height = allocation.height;
2837 /* debug_print("summaryview size: %d x %d\n",
2838 prefs_common.summaryview_width,
2839 prefs_common.summaryview_height);
2840 debug_print("folderview size: %d x %d\n",
2841 prefs_common.folderview_width,
2842 prefs_common.folderview_height);
2843 debug_print("messageview size: %d x %d\n",
2844 prefs_common.msgview_width,
2845 prefs_common.msgview_height); */
2848 void main_window_get_position(MainWindow *mainwin)
2852 if (prefs_common.mainwin_maximised || prefs_common.mainwin_fullscreen)
2855 gtkut_widget_get_uposition(mainwin->window, &x, &y);
2857 prefs_common.mainview_x = x;
2858 prefs_common.mainview_y = y;
2859 prefs_common.mainwin_x = x;
2860 prefs_common.mainwin_y = y;
2862 debug_print("main window position: %d, %d\n", x, y);
2865 void main_window_progress_on(MainWindow *mainwin)
2867 gtk_progress_bar_set_text(GTK_PROGRESS_BAR(mainwin->progressbar), "");
2870 void main_window_progress_off(MainWindow *mainwin)
2872 gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(mainwin->progressbar), 0.0);
2873 gtk_progress_bar_set_text(GTK_PROGRESS_BAR(mainwin->progressbar), "");
2876 gboolean main_window_empty_trash(MainWindow *mainwin, gboolean confirm, gboolean for_quit)
2878 if (confirm && procmsg_have_trashed_mails_fast()) {
2882 val = alertpanel(_("Empty trash"),
2883 _("Delete all messages in trash folders?"),
2884 GTK_STOCK_NO, GTK_STOCK_YES, _("Don't quit"),
2887 val = alertpanel(_("Empty trash"),
2888 _("Delete all messages in trash folders?"),
2889 GTK_STOCK_NO, GTK_STOCK_YES, NULL,
2891 if (val == G_ALERTALTERNATE) {
2892 debug_print("will empty trash\n");
2893 } else if (val == G_ALERTDEFAULT) {
2894 debug_print("will not empty trash\n");
2897 return FALSE; /* cancel exit */
2899 manage_window_focus_in(mainwin->window, NULL, NULL);
2902 procmsg_empty_all_trash();
2904 if (mainwin->summaryview->folder_item &&
2905 mainwin->summaryview->folder_item->stype == F_TRASH)
2906 folderview_grab_focus(mainwin->folderview);
2910 static void main_window_add_mailbox(MainWindow *mainwin)
2915 path = input_dialog(_("Add mailbox"),
2916 _("Input the location of the mailbox.\n"
2917 "The location can be either the full path or relative to the \n"
2919 "If the location of an existing mailbox is specified, it will be\n"
2920 "scanned automatically."),
2923 if (folder_find_from_path(path)) {
2924 alertpanel_error(_("The mailbox '%s' already exists."), path);
2928 folder = folder_new(folder_get_class_from_string("mh"),
2929 !strcmp(path, "Mail") ? _("Mailbox") :
2930 g_path_get_basename(path), path);
2933 if (folder->klass->create_tree(folder) < 0) {
2934 alertpanel_error(_("Creation of the mailbox failed.\n"
2935 "Maybe some files already exist, or you don't have the permission to write there."));
2936 folder_destroy(folder);
2941 folder_set_ui_func(folder, scan_tree_func, mainwin);
2942 folder_scan_tree(folder, TRUE);
2943 folder_set_ui_func(folder, NULL, NULL);
2946 SensitiveCondMask main_window_get_current_state(MainWindow *mainwin)
2948 SensitiveCondMask state = 0;
2949 SummarySelection selection;
2950 FolderItem *item = mainwin->summaryview->folder_item;
2951 GList *account_list = account_get_list();
2954 selection = summary_get_selection_type(mainwin->summaryview);
2956 #define UPDATE_STATE(...) \
2958 state |= main_window_get_mask(__VA_ARGS__, -1); \
2961 if (mainwin->lock_count == 0 && !claws_is_starting())
2962 UPDATE_STATE(M_UNLOCKED);
2963 if (selection != SUMMARY_NONE && selection != SUMMARY_SELECTED_NONE)
2964 UPDATE_STATE(M_MSG_EXIST);
2965 if (item && item->path && folder_item_parent(item) && !item->no_select) {
2966 UPDATE_STATE(M_EXEC);
2967 /* if (item->folder->type != F_NEWS) */
2968 UPDATE_STATE(M_ALLOW_DELETE);
2970 if (prefs_common.immediate_exec == 0
2971 && mainwin->lock_count == 0)
2972 UPDATE_STATE(M_DELAY_EXEC);
2974 if ((selection == SUMMARY_NONE && item->hide_read_msgs)
2975 || selection != SUMMARY_NONE)
2976 UPDATE_STATE(M_HIDE_READ_MSG);
2978 if ((selection == SUMMARY_NONE && item->hide_read_threads)
2979 || selection != SUMMARY_NONE)
2980 UPDATE_STATE(M_HIDE_READ_THREADS);
2982 if (mainwin->summaryview->threaded)
2983 UPDATE_STATE(M_THREADED);
2985 UPDATE_STATE(M_UNTHREADED);
2986 if (selection == SUMMARY_SELECTED_SINGLE ||
2987 selection == SUMMARY_SELECTED_MULTIPLE)
2988 UPDATE_STATE(M_TARGET_EXIST);
2989 if (selection == SUMMARY_SELECTED_SINGLE)
2990 UPDATE_STATE(M_SINGLE_TARGET_EXIST);
2991 if (mainwin->summaryview->folder_item &&
2992 mainwin->summaryview->folder_item->folder->klass->type == F_NEWS)
2993 UPDATE_STATE(M_NEWS);
2995 UPDATE_STATE(M_NOT_NEWS);
2996 if (mainwin->summaryview->folder_item &&
2997 (mainwin->summaryview->folder_item->stype != F_TRASH ||
2998 !folder_has_parent_of_type(mainwin->summaryview->folder_item, F_TRASH)))
2999 UPDATE_STATE(M_NOT_TRASH);
3001 if (mainwin->summaryview->folder_item
3002 && mainwin->summaryview->folder_item->stype != F_DRAFT)
3003 UPDATE_STATE(M_NOT_DRAFT);
3005 if (prefs_common.actions_list && g_slist_length(prefs_common.actions_list))
3006 UPDATE_STATE(M_ACTIONS_EXIST);
3008 tmp = tags_get_list();
3009 if (tmp && g_slist_length(tmp))
3010 UPDATE_STATE(M_TAGS_EXIST);
3013 if (procmsg_have_queued_mails_fast() && !procmsg_is_sending())
3014 UPDATE_STATE(M_HAVE_QUEUED_MAILS);
3016 if (selection == SUMMARY_SELECTED_SINGLE &&
3018 (folder_has_parent_of_type(item, F_DRAFT) ||
3019 folder_has_parent_of_type(item, F_OUTBOX) ||
3020 folder_has_parent_of_type(item, F_QUEUE))))
3021 UPDATE_STATE(M_ALLOW_REEDIT);
3023 UPDATE_STATE(M_HAVE_ACCOUNT);
3025 if (cur_account && cur_account->protocol != A_NONE)
3026 UPDATE_STATE(M_HAVE_RETRIEVABLE_ACCOUNT);
3028 if (any_folder_want_synchronise())
3029 UPDATE_STATE(M_WANT_SYNC);
3031 if (item && item->prefs->processing && selection != SUMMARY_NONE)
3032 UPDATE_STATE(M_HAVE_PROCESSING);
3034 if (g_list_length(account_list) > 1)
3035 UPDATE_STATE(M_HAVE_MULTI_ACCOUNT);
3037 for (account_list = account_get_list(); account_list != NULL; account_list = account_list->next) {
3038 if (((PrefsAccount*)account_list->data)->protocol != A_NONE) {
3039 UPDATE_STATE(M_HAVE_ANY_RETRIEVABLE_ACCOUNT);
3044 for (account_list = account_get_list(); account_list != NULL; account_list = account_list->next) {
3045 if (((PrefsAccount*)account_list->data)->protocol == A_NNTP) {
3046 UPDATE_STATE(M_HAVE_NEWS_ACCOUNT);
3051 if (procmsg_spam_can_learn() &&
3052 (mainwin->summaryview->folder_item &&
3053 mainwin->summaryview->folder_item->folder->klass->type != F_UNKNOWN &&
3054 mainwin->summaryview->folder_item->folder->klass->type != F_NEWS)) {
3055 UPDATE_STATE(M_CAN_LEARN_SPAM);
3058 if (mainwin->summaryview->folder_item) {
3059 UPDATE_STATE(M_FOLDER_SELECTED);
3062 if (inc_is_active())
3063 UPDATE_STATE(M_INC_ACTIVE);
3064 if (imap_cancel_all_enabled())
3065 UPDATE_STATE(M_INC_ACTIVE);
3067 if (send_is_active() | procmsg_is_sending())
3068 UPDATE_STATE(M_SEND_ACTIVE);
3070 if (mainwin->summaryview->deleted > 0)
3071 UPDATE_STATE(M_DELETED_EXISTS);
3073 if (mainwin->summaryview->deleted > 0 ||
3074 mainwin->summaryview->moved > 0 ||
3075 mainwin->summaryview->copied > 0)
3076 UPDATE_STATE(M_DELAY_EXEC);
3078 if (summary_is_list(mainwin->summaryview))
3079 UPDATE_STATE(M_SUMMARY_ISLIST);
3081 if (prefs_common.layout_mode != SMALL_LAYOUT || mainwin->in_folder)
3082 UPDATE_STATE(M_IN_MSGLIST);
3084 for (account_list = account_get_list(); account_list != NULL; account_list = account_list->next) {
3085 PrefsAccount *account = account_list->data;
3086 if (account->session_passwd || account->session_smtp_passwd) {
3087 UPDATE_STATE(M_SESSION_PASSWORDS);
3092 #ifndef PASSWORD_CRYPTO_OLD
3093 if (master_passphrase_is_entered()) {
3094 UPDATE_STATE(M_MASTER_PASSPHRASE);
3102 SensitiveCondMask main_window_get_mask(SensitiveCond cond, ...)
3106 SensitiveCondMask value;
3107 static SensitiveCondMask SensitiveCond_table[M_MAX_RESERVED];
3108 static gboolean first_time = TRUE;
3111 for (i = 0; i < M_MAX_RESERVED; i++)
3112 SensitiveCond_table[i] = (SensitiveCondMask) ((SensitiveCondMask)1 << i);
3118 va_start(args, cond);
3119 for (i = (gint) cond; i >= 0; i = va_arg(args, gint))
3120 value |= SensitiveCond_table[i];
3126 void main_window_set_menu_sensitive(MainWindow *mainwin)
3128 SensitiveCondMask state;
3130 SummaryView *summaryview;
3133 GList *children, *cur_item;
3135 gboolean mimepart_selected = FALSE;
3137 #define N_ENTRIES 88
3140 SensitiveCondMask cond;
3144 #define FILL_TABLE(entry_str, ...) \
3146 entry[i].entry = (const gchar *) entry_str; entry[i++].cond = main_window_get_mask(__VA_ARGS__, -1); \
3149 FILL_TABLE("Menu/File/SaveAs", M_TARGET_EXIST);
3150 FILL_TABLE("Menu/File/SavePartAs", M_SINGLE_TARGET_EXIST);
3151 FILL_TABLE("Menu/File/Print", M_TARGET_EXIST);
3152 FILL_TABLE("Menu/File/SynchroniseFolders", M_WANT_SYNC);
3153 FILL_TABLE("Menu/File/Exit", M_UNLOCKED);
3155 FILL_TABLE("Menu/Edit/SelectThread", M_TARGET_EXIST, M_SUMMARY_ISLIST);
3156 FILL_TABLE("Menu/Edit/Find", M_SINGLE_TARGET_EXIST);
3157 FILL_TABLE("Menu/Edit/QuickSearch", M_IN_MSGLIST);
3158 FILL_TABLE("Menu/Edit/SearchFolder", M_TARGET_EXIST, M_SUMMARY_ISLIST);
3160 FILL_TABLE("Menu/View/SetColumns/Folderlist", M_UNLOCKED, M_SUMMARY_ISLIST);
3161 FILL_TABLE("Menu/View/Sort", M_EXEC, M_SUMMARY_ISLIST);
3162 FILL_TABLE("Menu/View/ThreadView", M_EXEC, M_SUMMARY_ISLIST);
3163 FILL_TABLE("Menu/View/ExpandThreads", M_MSG_EXIST, M_SUMMARY_ISLIST);
3164 FILL_TABLE("Menu/View/CollapseThreads", M_MSG_EXIST, M_SUMMARY_ISLIST);
3165 FILL_TABLE("Menu/View/HideReadThreads", M_HIDE_READ_THREADS, M_SUMMARY_ISLIST, M_NOT_DRAFT);
3166 FILL_TABLE("Menu/View/HideReadMessages", M_HIDE_READ_MSG, M_SUMMARY_ISLIST, M_NOT_DRAFT);
3167 FILL_TABLE("Menu/View/HideDelMessages", M_SUMMARY_ISLIST, M_NOT_DRAFT);
3168 FILL_TABLE("Menu/View/Goto/Prev", M_MSG_EXIST);
3169 FILL_TABLE("Menu/View/Goto/Next", M_MSG_EXIST);
3170 FILL_TABLE("Menu/View/Goto/PrevUnread", M_MSG_EXIST);
3171 FILL_TABLE("Menu/View/Goto/NextUnread", M_MSG_EXIST);
3172 FILL_TABLE("Menu/View/Goto/PrevNew", M_MSG_EXIST);
3173 FILL_TABLE("Menu/View/Goto/NextNew", M_MSG_EXIST);
3174 FILL_TABLE("Menu/View/Goto/PrevMarked", M_MSG_EXIST);
3175 FILL_TABLE("Menu/View/Goto/NextMarked", M_MSG_EXIST);
3176 FILL_TABLE("Menu/View/Goto/PrevLabeled", M_MSG_EXIST);
3177 FILL_TABLE("Menu/View/Goto/NextLabeled", M_MSG_EXIST);
3178 FILL_TABLE("Menu/View/Goto/ParentMessage", M_SINGLE_TARGET_EXIST);
3179 FILL_TABLE("Menu/View/Goto/NextPart", M_SINGLE_TARGET_EXIST);
3180 FILL_TABLE("Menu/View/Goto/PrevPart", M_SINGLE_TARGET_EXIST);
3181 FILL_TABLE("Menu/View/OpenNewWindow", M_SINGLE_TARGET_EXIST);
3182 FILL_TABLE("Menu/View/MessageSource", M_SINGLE_TARGET_EXIST);
3183 FILL_TABLE("Menu/View/Part", M_SINGLE_TARGET_EXIST);
3184 FILL_TABLE("Menu/View/AllHeaders", M_SINGLE_TARGET_EXIST);
3185 FILL_TABLE("Menu/View/Quotes", M_SINGLE_TARGET_EXIST);
3187 FILL_TABLE("Menu/Message/Receive/CurrentAccount", M_HAVE_ACCOUNT, M_UNLOCKED, M_HAVE_RETRIEVABLE_ACCOUNT);
3188 FILL_TABLE("Menu/Message/Receive/AllAccounts", M_HAVE_ACCOUNT, M_UNLOCKED, M_HAVE_ANY_RETRIEVABLE_ACCOUNT);
3189 FILL_TABLE("Menu/Message/Receive/CancelReceiving", M_INC_ACTIVE);
3190 FILL_TABLE("Menu/Message/SendQueue", M_HAVE_ACCOUNT, M_HAVE_QUEUED_MAILS);
3191 FILL_TABLE("Menu/Message/CancelSending", M_SEND_ACTIVE);
3192 FILL_TABLE("Menu/Message/ComposeEmail", M_HAVE_ACCOUNT);
3193 FILL_TABLE("Menu/Message/ComposeNews", M_HAVE_NEWS_ACCOUNT);
3194 FILL_TABLE("Menu/Message/Reply", M_HAVE_ACCOUNT, M_TARGET_EXIST, M_SUMMARY_ISLIST);
3195 FILL_TABLE("Menu/Message/ReplyTo", M_HAVE_ACCOUNT, M_TARGET_EXIST, M_SUMMARY_ISLIST);
3196 FILL_TABLE("Menu/Message/FollowupReply", M_HAVE_ACCOUNT, M_TARGET_EXIST, M_NEWS, M_SUMMARY_ISLIST);
3197 FILL_TABLE("Menu/Message/Forward", M_HAVE_ACCOUNT, M_TARGET_EXIST, M_SUMMARY_ISLIST);
3198 FILL_TABLE("Menu/Message/ForwardAtt", M_HAVE_ACCOUNT, M_TARGET_EXIST, M_SUMMARY_ISLIST);
3199 FILL_TABLE("Menu/Message/Redirect", M_HAVE_ACCOUNT, M_TARGET_EXIST, M_SUMMARY_ISLIST);
3200 FILL_TABLE("Menu/Message/Move", M_TARGET_EXIST, M_ALLOW_DELETE, M_NOT_NEWS);
3201 FILL_TABLE("Menu/Message/Copy", M_TARGET_EXIST, M_EXEC);
3202 FILL_TABLE("Menu/Message/Trash", M_TARGET_EXIST, M_ALLOW_DELETE, M_NOT_NEWS, M_NOT_TRASH);
3203 FILL_TABLE("Menu/Message/Delete", M_TARGET_EXIST, M_ALLOW_DELETE);
3204 FILL_TABLE("Menu/Message/TrashThread", M_TARGET_EXIST, M_SUMMARY_ISLIST);
3205 FILL_TABLE("Menu/Message/DeleteThread", M_TARGET_EXIST, M_SUMMARY_ISLIST);
3206 FILL_TABLE("Menu/Message/CancelNews", M_TARGET_EXIST, M_ALLOW_DELETE, M_NEWS);
3207 FILL_TABLE("Menu/Message/Mark", M_TARGET_EXIST, M_SUMMARY_ISLIST);
3208 FILL_TABLE("Menu/Message/Mark/MarkSpam", M_TARGET_EXIST, M_CAN_LEARN_SPAM);
3209 FILL_TABLE("Menu/Message/Mark/MarkHam", M_TARGET_EXIST, M_CAN_LEARN_SPAM);
3210 FILL_TABLE("Menu/Message/Mark/IgnoreThread", M_TARGET_EXIST);
3211 FILL_TABLE("Menu/Message/Mark/UnignoreThread", M_TARGET_EXIST);
3212 FILL_TABLE("Menu/Message/Mark/Lock", M_TARGET_EXIST);
3213 FILL_TABLE("Menu/Message/Mark/Unlock", M_TARGET_EXIST);
3214 FILL_TABLE("Menu/Message/ColorLabel", M_TARGET_EXIST);
3215 FILL_TABLE("Menu/Message/Tags", M_TARGET_EXIST);
3216 FILL_TABLE("Menu/Message/Reedit", M_HAVE_ACCOUNT, M_ALLOW_REEDIT);
3217 FILL_TABLE("Menu/Message/CheckSignature", M_SINGLE_TARGET_EXIST);
3219 FILL_TABLE("Menu/Tools/AddSenderToAB", M_SINGLE_TARGET_EXIST);
3220 FILL_TABLE("Menu/Tools/CollectAddresses", M_FOLDER_SELECTED);
3221 FILL_TABLE("Menu/Tools/CollectAddresses/FromFolder", M_FOLDER_SELECTED);
3222 FILL_TABLE("Menu/Tools/CollectAddresses/FromSelected", M_TARGET_EXIST);
3223 FILL_TABLE("Menu/Tools/FilterFolder", M_MSG_EXIST, M_EXEC);
3224 FILL_TABLE("Menu/Tools/FilterSelected", M_TARGET_EXIST, M_EXEC);
3225 FILL_TABLE("Menu/Tools/RunProcessing", M_HAVE_PROCESSING);
3226 FILL_TABLE("Menu/Tools/CreateFilterRule", M_SINGLE_TARGET_EXIST, M_UNLOCKED);
3227 FILL_TABLE("Menu/Tools/CreateProcessingRule", M_SINGLE_TARGET_EXIST, M_UNLOCKED);
3228 FILL_TABLE("Menu/Tools/ListUrls", M_TARGET_EXIST);
3229 FILL_TABLE("Menu/Tools/Actions", M_TARGET_EXIST, M_ACTIONS_EXIST);
3230 FILL_TABLE("Menu/Tools/Execute", M_DELAY_EXEC);
3231 FILL_TABLE("Menu/Tools/Expunge", M_DELETED_EXISTS);
3232 FILL_TABLE("Menu/Tools/ForgetSessionPasswords", M_SESSION_PASSWORDS);
3233 #ifndef PASSWORD_CRYPTO_OLD
3234 FILL_TABLE("Menu/Tools/ForgetMasterPassphrase", M_MASTER_PASSPHRASE);
3236 FILL_TABLE("Menu/Tools/DeleteDuplicates/SelFolder", M_MSG_EXIST, M_ALLOW_DELETE);
3238 FILL_TABLE("Menu/Configuration", M_UNLOCKED);
3239 FILL_TABLE("Menu/Configuration/ChangeAccount", M_HAVE_MULTI_ACCOUNT);
3240 FILL_TABLE("Menu/Configuration/AccountPrefs", M_UNLOCKED);
3241 FILL_TABLE("Menu/Configuration/CreateAccount", M_UNLOCKED);
3242 FILL_TABLE("Menu/Configuration/EditAccounts", M_UNLOCKED);
3243 FILL_TABLE(NULL, -1);
3246 g_error("main window menu entry table overrun (%d/%d)", i, N_ENTRIES);
3249 state = main_window_get_current_state(mainwin);
3251 for (i = 0; entry[i].entry != NULL; i++) {
3252 sensitive = ((entry[i].cond & state) == entry[i].cond);
3253 cm_menu_set_sensitive_full(mainwin->ui_manager, entry[i].entry, sensitive);
3256 menu = gtk_menu_item_get_submenu(GTK_MENU_ITEM(
3257 gtk_ui_manager_get_widget(mainwin->ui_manager, "/Menu/Message/Receive")));
3259 children = gtk_container_get_children(GTK_CONTAINER(menu));
3260 for (cur_item = children; cur_item != NULL; cur_item = cur_item->next) {
3261 if (cur_item->data == gtk_ui_manager_get_widget(mainwin->ui_manager, "/Menu/Message/Receive/Separator1")) {
3262 cur_item = cur_item->next;
3267 for (; cur_item != NULL; cur_item = cur_item->next) {
3268 gtk_widget_set_sensitive(GTK_WIDGET(cur_item->data),
3269 (main_window_get_mask(M_UNLOCKED, -1) & state) != 0);
3272 g_list_free(children);
3274 main_window_menu_callback_block(mainwin);
3276 cm_toggle_menu_set_active_full(mainwin->ui_manager, "Menu/View/ShowHide/MessageView",
3277 messageview_is_visible(mainwin->messageview));
3279 summaryview = mainwin->summaryview;
3281 switch (summaryview->sort_key) {
3282 case SORT_BY_NUMBER:
3283 menu_path = "Menu/View/Sort/Number"; break;
3285 menu_path = "Menu/View/Sort/Size"; break;
3287 menu_path = "Menu/View/Sort/Date"; break;
3288 case SORT_BY_THREAD_DATE:
3289 menu_path = "Menu/View/Sort/ThreadDate"; break;
3291 menu_path = "Menu/View/Sort/From"; break;
3293 menu_path = "Menu/View/Sort/To"; break;
3294 case SORT_BY_SUBJECT:
3295 menu_path = "Menu/View/Sort/Subject"; break;
3297 menu_path = "Menu/View/Sort/Color"; break;
3299 menu_path = "Menu/View/Sort/Mark"; break;
3300 case SORT_BY_STATUS:
3301 menu_path = "Menu/View/Sort/Status"; break;
3303 menu_path = "Menu/View/Sort/Attachment"; break;
3305 menu_path = "Menu/View/Sort/Score"; break;
3306 case SORT_BY_LOCKED:
3307 menu_path = "Menu/View/Sort/Locked"; break;
3309 menu_path = "Menu/View/Sort/Tag"; break;
3312 menu_path = "Menu/View/Sort/DontSort"; break;
3314 cm_toggle_menu_set_active_full(mainwin->ui_manager, menu_path, TRUE);
3316 if (summaryview->sort_type == SORT_ASCENDING) {
3317 cm_toggle_menu_set_active_full(mainwin->ui_manager, "Menu/View/Sort/Ascending", TRUE);
3319 cm_toggle_menu_set_active_full(mainwin->ui_manager, "Menu/View/Sort/Descending", TRUE);
3322 if (summaryview->sort_key != SORT_BY_NONE) {
3323 cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/View/Sort/Ascending", TRUE);
3324 cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/View/Sort/Descending", TRUE);
3326 cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/View/Sort/Ascending", FALSE);
3327 cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/View/Sort/Descending", FALSE);
3330 if (mainwin->messageview
3331 && mainwin->messageview->mimeview
3332 && mainwin->messageview->mimeview->textview)
3333 cm_toggle_menu_set_active_full(mainwin->ui_manager, "Menu/View/AllHeaders",
3334 prefs_common.show_all_headers);
3335 cm_toggle_menu_set_active_full(mainwin->ui_manager, "Menu/View/ThreadView", (state & main_window_get_mask(M_THREADED, -1)) != 0);
3336 cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/View/ExpandThreads", (state & main_window_get_mask(M_THREADED, -1)) != 0);
3337 cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/View/CollapseThreads", (state & main_window_get_mask(M_THREADED, -1)) != 0);
3338 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);
3339 cm_toggle_menu_set_active_full(mainwin->ui_manager, "Menu/View/Quotes/CollapseAll", (prefs_common.hide_quotes == 1));
3340 cm_toggle_menu_set_active_full(mainwin->ui_manager, "Menu/View/Quotes/Collapse2", (prefs_common.hide_quotes == 2));
3341 cm_toggle_menu_set_active_full(mainwin->ui_manager, "Menu/View/Quotes/Collapse3", (prefs_common.hide_quotes == 3));
3343 if (mainwin->summaryview->folder_item && !mainwin->summaryview->folder_item->threaded)
3344 cm_toggle_menu_set_active_full(mainwin->ui_manager, "Menu/View/HideReadThreads", FALSE);
3345 if ((mainwin->summaryview->folder_item && mainwin->summaryview->folder_item->hide_read_msgs) ||
3346 quicksearch_has_sat_predicate(mainwin->summaryview->quicksearch))
3347 cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/View/HideReadThreads", FALSE);
3348 if ((mainwin->summaryview->folder_item && mainwin->summaryview->folder_item->hide_read_threads) ||
3349 quicksearch_has_sat_predicate(mainwin->summaryview->quicksearch))
3350 cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/View/HideReadMessages", FALSE);
3351 if (quicksearch_has_sat_predicate(mainwin->summaryview->quicksearch))
3352 cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/View/HideDelMessages", FALSE);
3354 cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/View/Goto/PrevHistory",
3355 messageview_nav_has_prev(mainwin->messageview));
3356 cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/View/Goto/NextHistory",
3357 messageview_nav_has_next(mainwin->messageview));
3359 if (mainwin->messageview
3360 && mainwin->messageview->mimeview)
3361 mimepart_selected = !mimeview_tree_is_empty(mainwin->messageview->mimeview);
3363 cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/File/SavePartAs", mimepart_selected);
3364 cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/View/Goto/NextPart", mimepart_selected);
3365 cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/View/Goto/PrevPart", mimepart_selected);
3366 cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/View/Part", mimepart_selected);
3367 cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/Message/CheckSignature",
3368 mimepart_selected && mainwin->messageview->mimeview->signed_part);
3371 if (mimepart_selected) {
3372 MimeInfo *partinfo = messageview_get_selected_mime_part(mainwin->messageview);
3374 if (partinfo && (partinfo->type == MIMETYPE_MESSAGE ||
3375 partinfo->type == MIMETYPE_IMAGE ||
3376 partinfo->type == MIMETYPE_MULTIPART)) {
3380 cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/View/Part/AsText", sensitive);
3382 main_window_menu_callback_unblock(mainwin);
3385 void main_create_mailing_list_menu (MainWindow *mainwin, MsgInfo *msginfo)
3390 is_menu = mailing_list_create_submenu (mainwin, msginfo);
3392 cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/Message/MailingList", TRUE);
3394 cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/Message/MailingList", FALSE);
3397 static gint mailing_list_create_submenu (MainWindow *mainwin, MsgInfo *msginfo)
3400 GtkWidget *menuitem;
3402 if (!msginfo || !msginfo->extradata) {
3403 cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/Message/MailingList/Post", FALSE);
3404 cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/Message/MailingList/Help", FALSE);
3405 cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/Message/MailingList/Subscribe", FALSE);
3406 cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/Message/MailingList/Unsubscribe", FALSE);
3407 cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/Message/MailingList/ViewArchive", FALSE);
3408 cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/Message/MailingList/ContactOwner", FALSE);
3412 /* Mailing list post */
3413 if (!g_strcmp0 (msginfo->extradata->list_post, "NO")) {
3414 g_free(msginfo->extradata->list_post);
3415 msginfo->extradata->list_post = g_strdup (_("No posting allowed"));
3417 menuitem = gtk_ui_manager_get_widget(mainwin->ui_manager, "/Menu/Message/MailingList/Post");
3419 menu_nb += mailing_list_populate_submenu (menuitem, msginfo->extradata->list_post);
3421 /* Mailing list help */
3422 menuitem = gtk_ui_manager_get_widget(mainwin->ui_manager, "/Menu/Message/MailingList/Help");
3424 menu_nb += mailing_list_populate_submenu (menuitem, msginfo->extradata->list_help);
3426 /* Mailing list subscribe */
3427 menuitem = gtk_ui_manager_get_widget(mainwin->ui_manager, "/Menu/Message/MailingList/Subscribe");
3429 menu_nb += mailing_list_populate_submenu (menuitem, msginfo->extradata->list_subscribe);
3431 /* Mailing list unsubscribe */
3432 menuitem = gtk_ui_manager_get_widget(mainwin->ui_manager, "/Menu/Message/MailingList/Unsubscribe");
3434 menu_nb += mailing_list_populate_submenu (menuitem, msginfo->extradata->list_unsubscribe);
3436 /* Mailing list view archive */
3437 menuitem = gtk_ui_manager_get_widget(mainwin->ui_manager, "/Menu/Message/MailingList/ViewArchive");
3439 menu_nb += mailing_list_populate_submenu (menuitem, msginfo->extradata->list_archive);
3441 /* Mailing list contact owner */
3442 menuitem = gtk_ui_manager_get_widget(mainwin->ui_manager, "/Menu/Message/MailingList/ContactOwner");
3444 menu_nb += mailing_list_populate_submenu (menuitem, msginfo->extradata->list_owner);
3449 static gint mailing_list_populate_submenu (GtkWidget *menuitem, const gchar * list_header)
3451 GtkWidget *item, *menu;
3452 const gchar *url_pt ;
3453 gchar url_decoded[BUFFSIZE];
3454 GList *children, *amenu;
3457 menu = gtk_menu_item_get_submenu(GTK_MENU_ITEM(menuitem));
3459 /* First delete old submenu */
3460 /* FIXME: we can optimize this, and only change/add/delete necessary items */
3461 children = gtk_container_get_children(GTK_CONTAINER(menu));
3462 for (amenu = children; amenu; amenu = amenu->next) {
3463 item = GTK_WIDGET (amenu->data);
3464 gtk_widget_destroy (item);
3466 g_list_free(children);
3468 for (url_pt = list_header; url_pt && *url_pt;) {
3469 get_url_part (&url_pt, url_decoded);
3471 if (!g_ascii_strncasecmp(url_decoded, "mailto:", 7)) {
3472 item = cm_menu_item_new_label_from_url ((url_decoded));
3473 g_signal_connect(G_OBJECT(item), "activate",
3474 G_CALLBACK(mailing_list_compose),
3477 else if (!g_ascii_strncasecmp(url_decoded, "http:", 5) ||
3478 !g_ascii_strncasecmp(url_decoded, "https:",6)) {
3480 item = cm_menu_item_new_label_from_url ((url_decoded));
3481 g_signal_connect(G_OBJECT(item), "activate",
3482 G_CALLBACK(mailing_list_open_uri),
3486 gtk_menu_shell_append(GTK_MENU_SHELL(menu), item);
3487 gtk_widget_show (item);
3493 gtk_widget_set_sensitive (menuitem, TRUE);
3495 gtk_widget_set_sensitive (menuitem, FALSE);
3501 static void get_url_part (const gchar **buffer, gchar *url_decoded)
3503 gchar tmp[BUFFSIZE];
3507 gboolean with_plus = TRUE;
3510 *url_decoded = '\0';
3514 /* Ignore spaces, comments and tabs () */
3515 for (;*buf == ' ' || *buf == '(' || *buf == '\t'; buf++)
3517 for (;*buf != ')' && *buf != 0x00; buf++);
3519 /* First non space and non comment must be a < */
3522 if (!strncmp(buf, "mailto:", strlen("mailto:")))
3525 *buf != '>' && *buf != 0x00 && i < BUFFSIZE;
3526 tmp[i++] = *(buf++));
3529 *url_decoded = '\0';
3536 *url_decoded = '\0';
3540 *url_decoded = '\0';
3543 if (i == BUFFSIZE) {
3547 decode_uri_with_plus (url_decoded, (const gchar *)tmp, with_plus);
3549 /* Prepare the work for the next url in the list */
3550 /* after the closing bracket >, ignore space, comments and tabs */
3551 for (;buf && *buf && (*buf == ' ' || *buf == '(' || *buf == '\t'); buf++)
3553 for (;*buf != ')' && *buf != 0x00; buf++);
3555 if (!buf || !*buf) {
3560 /* now first non space, non comment must be a comma */
3562 for (;*buf != 0x00; buf++);
3568 static void mailing_list_compose (GtkWidget *w, gpointer *data)
3570 const gchar *mailto;
3571 PrefsAccount *account = NULL;
3572 FolderItem *folder_item = NULL;
3574 mailto = gtk_label_get_text(GTK_LABEL (gtk_bin_get_child(GTK_BIN((w)))));
3575 if (mainwindow_get_mainwindow()) {
3576 folder_item = mainwindow_get_mainwindow()->summaryview->folder_item;
3577 if (folder_item && folder_item->prefs && folder_item->prefs->enable_default_account)
3578 account = account_find_from_id(folder_item->prefs->default_account);
3579 if (folder_item && !account)
3580 account = account_find_from_item(folder_item);
3583 compose_new_with_folderitem(account, folder_item, mailto+7);
3586 static void mailing_list_open_uri (GtkWidget *w, gpointer *data)
3589 const gchar *mailto;
3591 mailto = gtk_label_get_text(GTK_LABEL (gtk_bin_get_child(GTK_BIN((w)))));
3593 open_uri (mailto, prefs_common_get_uri_cmd());
3596 static void fix_folderview_scroll(MainWindow *mainwin)
3598 static gboolean fix_done = FALSE;
3603 gtk_widget_queue_resize(mainwin->folderview->ctree);
3608 void main_window_popup(MainWindow *mainwin)
3610 static gboolean first_start = TRUE;
3612 if (!gtk_widget_get_visible(GTK_WIDGET(mainwin->window)))
3613 main_window_show(mainwin);
3615 if (prefs_common.mainwin_maximised)
3616 gtk_window_maximize(GTK_WINDOW(mainwin->window));
3619 first_start = FALSE;
3621 gtkut_window_popup(mainwin->window);
3624 if (prefs_common.layout_mode == SMALL_LAYOUT) {
3625 if (mainwin->in_folder) {
3626 mainwindow_enter_folder(mainwin);
3628 mainwindow_exit_folder(mainwin);
3631 fix_folderview_scroll(mainwin);
3634 void main_window_show(MainWindow *mainwin)
3636 gtk_widget_show(mainwin->window);
3637 gtk_widget_show(mainwin->vbox_body);
3638 #ifndef GENERIC_UMPC
3639 gtk_window_move(GTK_WINDOW(mainwin->window),
3640 prefs_common.mainwin_x,
3641 prefs_common.mainwin_y);
3643 gtk_widget_set_size_request(GTK_WIDGET_PTR(mainwin->folderview),
3644 prefs_common.folderview_width,
3645 prefs_common.folderview_height);
3646 gtk_widget_set_size_request(GTK_WIDGET_PTR(mainwin->summaryview),
3647 prefs_common.summaryview_width,
3648 prefs_common.summaryview_height);
3649 gtk_widget_set_size_request(GTK_WIDGET_PTR(mainwin->messageview),
3650 prefs_common.msgview_width,
3651 prefs_common.msgview_height);
3655 void main_window_hide(MainWindow *mainwin)
3657 main_window_get_size(mainwin);
3658 main_window_get_position(mainwin);
3660 gtk_widget_hide(mainwin->window);
3661 gtk_widget_hide(mainwin->vbox_body);
3664 static void main_window_set_widgets(MainWindow *mainwin, LayoutType layout_mode)
3666 GtkWidget *folderwin = NULL;
3667 GtkWidget *messagewin = NULL;
3670 GtkWidget *vbox_body = mainwin->vbox_body;
3671 gboolean first_set = (mainwin->hpaned == NULL);
3672 debug_print("Setting widgets...\n");
3674 #ifndef GENERIC_UMPC
3675 mainwin->messageview->statusbar = mainwin->statusbar;
3676 mainwin->messageview->statusbar_cid = mainwin->messageview_cid;
3678 /* clean top-most container */
3679 if (mainwin->hpaned) {
3680 if (gtk_widget_get_parent(mainwin->hpaned) == mainwin->vpaned)
3681 gtk_widget_destroy(mainwin->vpaned);
3683 gtk_widget_destroy(mainwin->hpaned);
3686 cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/View/ShowHide/MessageView",
3687 (layout_mode != WIDE_MSGLIST_LAYOUT && layout_mode != SMALL_LAYOUT));
3688 switch (layout_mode) {
3689 case VERTICAL_LAYOUT:
3692 hpaned = gtk_hpaned_new();
3693 if (layout_mode == VERTICAL_LAYOUT)
3694 vpaned = gtk_hpaned_new();
3696 vpaned = gtk_vpaned_new();
3697 gtk_box_pack_start(GTK_BOX(vbox_body), hpaned, TRUE, TRUE, 0);
3698 gtk_paned_add1(GTK_PANED(hpaned),
3699 GTK_WIDGET_PTR(mainwin->folderview));
3700 gtk_widget_show(hpaned);
3701 gtk_widget_queue_resize(hpaned);
3703 if (messageview_is_visible(mainwin->messageview)) {
3704 gtk_paned_add2(GTK_PANED(hpaned), vpaned);
3705 gtk_paned_pack1(GTK_PANED(vpaned),
3706 GTK_WIDGET_PTR(mainwin->summaryview), TRUE, TRUE);
3708 gtk_paned_add2(GTK_PANED(hpaned),
3709 GTK_WIDGET_PTR(mainwin->summaryview));
3710 g_object_ref(vpaned);
3712 gtk_paned_add2(GTK_PANED(vpaned),
3713 GTK_WIDGET_PTR(mainwin->messageview));
3714 gtk_widget_show(vpaned);
3715 if (layout_mode == SMALL_LAYOUT && first_set) {
3716 mainwin_paned_show_first(GTK_PANED(hpaned));
3718 gtk_widget_queue_resize(vpaned);
3721 vpaned = gtk_vpaned_new();
3722 hpaned = gtk_hpaned_new();
3723 gtk_box_pack_start(GTK_BOX(vbox_body), vpaned, TRUE, TRUE, 0);
3724 gtk_paned_add1(GTK_PANED(vpaned), hpaned);
3726 gtk_paned_add1(GTK_PANED(hpaned),
3727 GTK_WIDGET_PTR(mainwin->folderview));
3728 gtk_paned_add2(GTK_PANED(hpaned),
3729 GTK_WIDGET_PTR(mainwin->summaryview));
3731 gtk_widget_show(hpaned);
3732 gtk_widget_queue_resize(hpaned);
3734 if (messageview_is_visible(mainwin->messageview)) {
3735 gtk_paned_add2(GTK_PANED(vpaned),
3736 GTK_WIDGET_PTR(mainwin->messageview));
3738 g_object_ref(GTK_WIDGET_PTR(mainwin->messageview));
3740 gtk_widget_show(vpaned);
3741 gtk_widget_queue_resize(vpaned);
3743 case WIDE_MSGLIST_LAYOUT:
3744 vpaned = gtk_vpaned_new();
3745 hpaned = gtk_hpaned_new();
3746 gtk_box_pack_start(GTK_BOX(vbox_body), vpaned, TRUE, TRUE, 0);
3748 gtk_paned_add1(GTK_PANED(vpaned),
3749 GTK_WIDGET_PTR(mainwin->summaryview));
3750 gtk_paned_add1(GTK_PANED(hpaned),
3751 GTK_WIDGET_PTR(mainwin->folderview));
3753 gtk_widget_show(hpaned);
3754 gtk_widget_queue_resize(hpaned);
3756 if (messageview_is_visible(mainwin->messageview)) {
3757 gtk_paned_add2(GTK_PANED(hpaned),
3758 GTK_WIDGET_PTR(mainwin->messageview));
3760 g_object_ref(GTK_WIDGET_PTR(mainwin->messageview));
3762 gtk_paned_add2(GTK_PANED(vpaned), hpaned);
3764 gtk_widget_show(vpaned);
3765 gtk_widget_queue_resize(vpaned);
3768 g_warning("Unknown layout");
3772 mainwin->hpaned = hpaned;
3773 mainwin->vpaned = vpaned;
3775 if (layout_mode == SMALL_LAYOUT) {
3776 if (mainwin->messageview->visible)
3777 main_window_toggle_message_view(mainwin);
3780 if (layout_mode == SMALL_LAYOUT && first_set) {
3781 gtk_widget_realize(mainwin->window);
3782 gtk_widget_realize(mainwin->folderview->ctree);
3783 gtk_widget_realize(mainwin->summaryview->hbox);
3784 gtk_widget_realize(mainwin->summaryview->hbox_l);
3785 gtk_widget_set_size_request(GTK_WIDGET_PTR(mainwin->folderview),
3786 prefs_common.folderview_width,
3787 prefs_common.folderview_height);
3788 gtk_widget_set_size_request(GTK_WIDGET_PTR(mainwin->summaryview),
3790 gtk_widget_set_size_request(GTK_WIDGET_PTR(mainwin->messageview),
3792 gtk_widget_set_size_request(GTK_WIDGET(mainwin->window),
3793 prefs_common.mainwin_width,
3794 prefs_common.mainwin_height);
3795 gtk_paned_set_position(GTK_PANED(mainwin->hpaned), 800);
3797 gtk_widget_set_size_request(GTK_WIDGET_PTR(mainwin->folderview),
3798 prefs_common.folderview_width,
3799 prefs_common.folderview_height);
3800 gtk_widget_set_size_request(GTK_WIDGET_PTR(mainwin->summaryview),
3801 prefs_common.summaryview_width,
3802 prefs_common.summaryview_height);
3803 gtk_widget_set_size_request(GTK_WIDGET_PTR(mainwin->messageview),
3804 prefs_common.msgview_width,
3805 prefs_common.msgview_height);
3806 gtk_widget_set_size_request(GTK_WIDGET(mainwin->window),
3807 prefs_common.mainwin_width,
3808 prefs_common.mainwin_height);
3810 /* remove headerview if not in prefs */
3811 headerview_set_visibility(mainwin->messageview->headerview,
3812 prefs_common.display_header_pane);
3814 if (messageview_is_visible(mainwin->messageview))
3815 gtk_arrow_set(GTK_ARROW(mainwin->summaryview->toggle_arrow),
3816 GTK_ARROW_DOWN, GTK_SHADOW_OUT);
3818 gtk_arrow_set(GTK_ARROW(mainwin->summaryview->toggle_arrow),
3819 GTK_ARROW_UP, GTK_SHADOW_OUT);
3821 gtk_window_move(GTK_WINDOW(mainwin->window),
3822 prefs_common.mainwin_x,
3823 prefs_common.mainwin_y);
3825 gtk_widget_queue_resize(vbox_body);
3826 gtk_widget_queue_resize(mainwin->vbox);
3827 gtk_widget_queue_resize(mainwin->window);
3828 /* CLAWS: previous "gtk_widget_show_all" makes noticeview
3829 * and mimeview icon list/ctree lose track of their visibility states */
3830 if (!noticeview_is_visible(mainwin->messageview->noticeview))
3831 gtk_widget_hide(GTK_WIDGET_PTR(mainwin->messageview->noticeview));
3832 if (!noticeview_is_visible(mainwin->messageview->mimeview->siginfoview))
3833 gtk_widget_hide(GTK_WIDGET_PTR(mainwin->messageview->mimeview->siginfoview));
3834 if (mainwin->messageview->mimeview->ctree_mode)
3835 gtk_widget_hide(mainwin->messageview->mimeview->icon_mainbox);
3837 gtk_widget_hide(mainwin->messageview->mimeview->ctree_mainbox);
3839 prefs_common.layout_mode = layout_mode;
3841 cm_toggle_menu_set_active_full(mainwin->ui_manager, "Menu/View/ShowHide/MessageView",
3842 messageview_is_visible(mainwin->messageview));
3844 #ifndef GENERIC_UMPC
3845 switch (prefs_common.layout_mode) {
3847 cm_toggle_menu_set_active_full(mainwin->ui_manager, "Menu/View/Layout/Standard", TRUE);
3849 case VERTICAL_LAYOUT:
3850 cm_toggle_menu_set_active_full(mainwin->ui_manager, "Menu/View/Layout/ThreeColumns", TRUE);
3853 cm_toggle_menu_set_active_full(mainwin->ui_manager, "Menu/View/Layout/WideMessage", TRUE);
3855 case WIDE_MSGLIST_LAYOUT:
3856 cm_toggle_menu_set_active_full(mainwin->ui_manager, "Menu/View/Layout/WideMessageList", TRUE);
3859 cm_toggle_menu_set_active_full(mainwin->ui_manager, "Menu/View/Layout/SmallScreen", TRUE);
3866 (G_OBJECT(folderwin), "size_allocate",
3867 G_CALLBACK(folder_window_size_allocate_cb),
3872 (G_OBJECT(messagewin), "size_allocate",
3873 G_CALLBACK(message_window_size_allocate_cb),
3877 debug_print("Setting widgets done.\n");
3880 void main_window_destroy_all(void)
3882 while (mainwin_list != NULL) {
3883 MainWindow *mainwin = (MainWindow*)mainwin_list->data;
3885 /* free toolbar stuff */
3886 toolbar_clear_list(TOOLBAR_MAIN);
3887 toolbar_destroy(mainwin->toolbar);
3889 summaryview_destroy(mainwin->summaryview);
3890 mainwin->folderview->mainwin = NULL;
3891 mainwin->summaryview->mainwin = NULL;
3892 mainwin->messageview->mainwin = NULL;
3894 g_free(mainwin->toolbar);
3897 mainwin_list = g_list_remove(mainwin_list, mainwin);
3899 g_list_free(mainwin_list);
3900 mainwin_list = NULL;
3903 static void toolbar_child_attached(GtkWidget *widget, GtkWidget *child,
3906 gtk_widget_set_size_request(child, 1, -1);
3909 static void toolbar_child_detached(GtkWidget *widget, GtkWidget *child,
3912 gtk_widget_set_size_request(child, -1, -1);
3914 #ifndef GENERIC_UMPC
3915 static gboolean ac_label_button_pressed(GtkWidget *widget, GdkEventButton *event,
3918 MainWindow *mainwin = (MainWindow *)data;
3919 GtkWidget *menu = NULL;
3921 if (!event) return FALSE;
3923 gtk_button_set_relief(GTK_BUTTON(widget), GTK_RELIEF_NORMAL);
3925 menu = gtk_menu_item_get_submenu(GTK_MENU_ITEM(mainwin->ac_menu));
3927 gtk_menu_popup(GTK_MENU(menu), NULL, NULL,
3928 menu_button_position, widget,
3929 event->button, event->time);
3934 static gint main_window_close_cb(GtkWidget *widget, GdkEventAny *event,
3937 MainWindow *mainwin = (MainWindow *)data;
3938 gboolean close_allowed = TRUE;
3940 hooks_invoke(MAIN_WINDOW_CLOSE, &close_allowed);
3942 if (close_allowed && mainwin->lock_count == 0)
3943 app_exit_cb(NULL, data);
3948 static void main_window_size_allocate_cb(GtkWidget *widget,
3949 GtkAllocation *allocation,
3952 MainWindow *mainwin = (MainWindow *)data;
3953 main_window_get_size(mainwin);
3956 static void folder_window_size_allocate_cb(GtkWidget *widget,
3957 GtkAllocation *allocation,
3960 MainWindow *mainwin = (MainWindow *)data;
3962 main_window_get_size(mainwin);
3965 static void message_window_size_allocate_cb(GtkWidget *widget,
3966 GtkAllocation *allocation,
3969 MainWindow *mainwin = (MainWindow *)data;
3971 main_window_get_size(mainwin);
3974 static void add_mailbox_cb(GtkAction *action, gpointer data)
3976 MainWindow *mainwin = (MainWindow *)data;
3977 main_window_add_mailbox(mainwin);
3980 static void update_folderview_cb(GtkAction *action, gpointer data)
3982 MainWindow *mainwin = (MainWindow *)data;
3983 summary_show(mainwin->summaryview, NULL);
3984 folderview_check_new_all();
3987 static void foldersort_cb(GtkAction *action, gpointer data)
3992 static void import_mbox_cb(GtkAction *action, gpointer data)
3994 MainWindow *mainwin = (MainWindow *)data;
3995 /* only notify if import has failed */
3996 if (import_mbox(mainwin->summaryview->folder_item) == -1) {
3997 alertpanel_error(_("Mbox import has failed."));
4001 static void export_mbox_cb(GtkAction *action, gpointer data)
4003 MainWindow *mainwin = (MainWindow *)data;
4004 /* only notify if export has failed */
4005 if (export_mbox(mainwin->summaryview->folder_item) == -1) {
4006 alertpanel_error(_("Export to mbox has failed."));
4010 static void export_list_mbox_cb(GtkAction *action, gpointer data)
4012 MainWindow *mainwin = (MainWindow *)data;
4013 /* only notify if export has failed */
4014 if (summaryview_export_mbox_list(mainwin->summaryview) == -1) {
4015 alertpanel_error(_("Export to mbox has failed."));
4019 static void empty_trash_cb(GtkAction *action, gpointer data)
4021 MainWindow *mainwin = (MainWindow *)data;
4022 main_window_empty_trash(mainwin, TRUE, FALSE);
4025 static void save_as_cb(GtkAction *action, gpointer data)
4027 MainWindow *mainwin = (MainWindow *)data;
4028 summary_save_as(mainwin->summaryview);
4031 static void print_cb(GtkAction *action, gpointer data)
4033 MainWindow *mainwin = (MainWindow *)data;
4034 summary_print(mainwin->summaryview);
4037 static void page_setup_cb(GtkAction *action, gpointer data)
4039 MainWindow *mainwin = (MainWindow *)data;
4042 win = (mainwin ? GTK_WINDOW(mainwin->window) : NULL);
4044 printing_page_setup(win);
4047 static void app_exit_cb(GtkAction *action, gpointer data)
4049 MainWindow *mainwin = (MainWindow *)data;
4050 if (prefs_common.clean_on_exit) {
4051 if (!main_window_empty_trash(mainwin, prefs_common.ask_on_clean, TRUE))
4055 if (prefs_common.confirm_on_exit) {
4056 if (alertpanel(_("Exit"), _("Exit Claws Mail?"),
4057 GTK_STOCK_CANCEL, GTK_STOCK_QUIT, NULL, ALERTFOCUS_FIRST)
4058 != G_ALERTALTERNATE)
4060 manage_window_focus_in(mainwin->window, NULL, NULL);
4063 app_will_exit(NULL, mainwin);
4066 static void search_cb(GtkAction *action, gpointer data)
4068 MainWindow *mainwin = (MainWindow *)data;
4069 message_search(mainwin->messageview);
4072 static void search_folder_cb(GtkAction *action, gpointer data)
4074 MainWindow *mainwin = (MainWindow *)data;
4075 FolderItem *item = mainwin->summaryview->folder_item;
4076 cm_return_if_fail(item != NULL);
4077 summary_search(mainwin->summaryview);
4080 static void mainwindow_quicksearch(GtkAction *action, gpointer data)
4082 MainWindow *mainwin = (MainWindow *)data;
4083 summaryview_activate_quicksearch(mainwin->summaryview, TRUE);
4086 static void toggle_message_cb(GtkAction *action, gpointer data)
4088 MainWindow *mainwin = (MainWindow *)data;
4091 active = gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (action));
4093 if (active != messageview_is_visible(mainwin->messageview))
4094 summary_toggle_view(mainwin->summaryview);
4097 static void toggle_toolbar_cb(GtkAction *action, GtkRadioAction *current, gpointer data)
4099 gint value = gtk_radio_action_get_current_value (GTK_RADIO_ACTION (current));
4100 MainWindow *mainwin = (MainWindow *)data;
4101 toolbar_toggle(value, mainwin);
4104 static void main_window_reply_cb(GtkAction *gaction, gpointer data)
4106 MainWindow *mainwin = (MainWindow *)data;
4107 MessageView *msgview = (MessageView*)mainwin->messageview;
4108 GSList *msginfo_list = NULL;
4109 gint action = COMPOSE_REPLY;
4110 const gchar *a_name = gtk_action_get_name(gaction);
4112 DO_ACTION("Message/Reply", COMPOSE_REPLY);
4113 DO_ACTION("Message/ReplyTo/All", COMPOSE_REPLY_TO_ALL);
4114 DO_ACTION("Message/ReplyTo/Sender", COMPOSE_REPLY_TO_SENDER);
4115 DO_ACTION("Message/ReplyTo/List", COMPOSE_REPLY_TO_LIST);
4116 DO_ACTION("Message/Forward", COMPOSE_FORWARD_INLINE);
4117 DO_ACTION("Message/ForwardAtt", COMPOSE_FORWARD_AS_ATTACH);
4118 DO_ACTION("Message/Redirect", COMPOSE_REDIRECT);
4119 DO_ACTION("Message/FollowupReply", COMPOSE_FOLLOWUP_AND_REPLY_TO);
4121 cm_return_if_fail(msgview != NULL);
4123 msginfo_list = summary_get_selection(mainwin->summaryview);
4124 cm_return_if_fail(msginfo_list != NULL);
4126 if (!summary_has_opened_message(mainwin->summaryview)) {
4127 compose_reply_from_messageview(NULL, msginfo_list, action);
4128 } else if (summary_is_opened_message_selected(mainwin->summaryview)) {
4129 compose_reply_from_messageview(msgview, msginfo_list, action);
4131 compose_reply_from_messageview(msgview, NULL, action);
4134 g_slist_free(msginfo_list);
4137 static void toggle_col_headers_cb(GtkAction *gaction, gpointer data)
4139 MainWindow *mainwin = (MainWindow *)data;
4140 FolderView *folderview = mainwin->folderview;
4141 SummaryView *summaryview = mainwin->summaryview;
4142 MimeView *mimeview = mainwin->messageview->mimeview;
4144 if (gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (gaction))) {
4145 gtk_cmclist_column_titles_show(GTK_CMCLIST(folderview->ctree));
4146 gtk_cmclist_column_titles_show(GTK_CMCLIST(summaryview->ctree));
4147 gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(mimeview->ctree), TRUE);
4148 prefs_common.show_col_headers = TRUE;
4150 gtk_cmclist_column_titles_hide(GTK_CMCLIST(folderview->ctree));
4151 gtk_cmclist_column_titles_hide(GTK_CMCLIST(summaryview->ctree));
4152 gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(mimeview->ctree), FALSE);
4153 prefs_common.show_col_headers = FALSE;
4157 #ifndef GENERIC_UMPC
4158 static void toggle_statusbar_cb(GtkAction *gaction, gpointer data)
4160 MainWindow *mainwin = (MainWindow *)data;
4161 if (gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (gaction))) {
4162 gtk_widget_show(mainwin->hbox_stat);
4163 prefs_common.show_statusbar = TRUE;
4165 gtk_widget_hide(mainwin->hbox_stat);
4166 prefs_common.show_statusbar = FALSE;
4170 static void set_layout_cb(GtkAction *action, GtkRadioAction *current, gpointer data)
4172 MainWindow *mainwin = (MainWindow *)data;
4173 gint value = gtk_radio_action_get_current_value (GTK_RADIO_ACTION (current));
4174 LayoutType layout_mode = value;
4175 LayoutType old_layout_mode = prefs_common.layout_mode;
4176 if (mainwin->menu_lock_count) {
4179 if (!gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (current))) {
4183 if (layout_mode == prefs_common.layout_mode) {
4187 if (!mainwin->messageview->visible && layout_mode != SMALL_LAYOUT)
4188 main_window_toggle_message_view(mainwin);
4189 else if (mainwin->messageview->visible && layout_mode == SMALL_LAYOUT)
4190 main_window_toggle_message_view(mainwin);
4192 main_window_separation_change(mainwin, layout_mode);
4193 mainwindow_reset_paned(GTK_PANED(mainwin->vpaned));
4194 if (old_layout_mode == SMALL_LAYOUT && layout_mode != SMALL_LAYOUT) {
4195 mainwindow_reset_paned(GTK_PANED(mainwin->hpaned));
4196 if (layout_mode == VERTICAL_LAYOUT)
4197 mainwindow_reset_paned(GTK_PANED(mainwin->vpaned));
4199 if (old_layout_mode != SMALL_LAYOUT && layout_mode == SMALL_LAYOUT) {
4200 mainwin_paned_show_first(GTK_PANED(mainwin->hpaned));
4201 mainwindow_exit_folder(mainwin);
4203 summary_relayout(mainwin->summaryview);
4204 summary_update_unread(mainwin->summaryview, NULL);
4208 void main_window_toggle_work_offline (MainWindow *mainwin, gboolean offline,
4211 static gboolean switching = FALSE;
4218 offline_ask_sync = ask_sync;
4220 online_switch_clicked (GTK_BUTTON(mainwin->online_switch), mainwin);
4222 online_switch_clicked (GTK_BUTTON(mainwin->offline_switch), mainwin);
4223 offline_ask_sync = TRUE;
4225 inc_reset_offline_override_timers();
4230 static void toggle_work_offline_cb (GtkAction *action, gpointer data)
4232 MainWindow *mainwin = (MainWindow *)data;
4233 main_window_toggle_work_offline(mainwin, gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (action)), TRUE);
4236 static gboolean any_folder_want_synchronise(void)
4238 GList *folderlist = folder_get_list();
4240 /* see if there are synchronised folders */
4241 for (; folderlist; folderlist = folderlist->next) {
4242 Folder *folder = (Folder *)folderlist->data;
4243 if (folder_want_synchronise(folder)) {
4251 static void mainwindow_check_synchronise(MainWindow *mainwin, gboolean ask)
4254 if (!any_folder_want_synchronise())
4257 if (offline_ask_sync && ask && alertpanel(_("Folder synchronisation"),
4258 _("Do you want to synchronise your folders now?"),
4259 GTK_STOCK_CANCEL, _("_Synchronise"), NULL, ALERTFOCUS_SECOND) != G_ALERTALTERNATE)
4262 if (offline_ask_sync)
4263 folder_synchronise(NULL);
4266 static void online_switch_clicked (GtkButton *btn, gpointer data)
4268 MainWindow *mainwin;
4269 gboolean have_connectivity;
4271 #ifdef HAVE_NETWORKMANAGER_SUPPORT
4272 have_connectivity = networkmanager_is_online(NULL);
4274 have_connectivity = TRUE;
4277 mainwin = (MainWindow *) data;
4279 cm_return_if_fail(mainwin != NULL);
4281 if (btn == GTK_BUTTON(mainwin->online_switch)) {
4282 #ifndef GENERIC_UMPC
4283 gtk_widget_hide (mainwin->online_switch);
4284 gtk_widget_show (mainwin->offline_switch);
4286 cm_toggle_menu_set_active_full(mainwin->ui_manager, "Menu/File/OfflineMode", TRUE);
4288 inc_autocheck_timer_remove();
4291 if (prefs_common.work_offline)
4294 if(have_connectivity)
4295 mainwindow_check_synchronise(mainwin, TRUE);
4296 prefs_common.work_offline = TRUE;
4297 imap_disconnect_all(have_connectivity);
4298 nntp_disconnect_all(have_connectivity);
4299 hooks_invoke(OFFLINE_SWITCH_HOOKLIST, NULL);
4302 if (!prefs_common.work_offline)
4304 #ifndef GENERIC_UMPC
4305 gtk_widget_hide (mainwin->offline_switch);
4306 gtk_widget_show (mainwin->online_switch);
4308 cm_toggle_menu_set_active_full(mainwin->ui_manager, "Menu/File/OfflineMode", FALSE);
4309 prefs_common.work_offline = FALSE;
4310 inc_autocheck_timer_set();
4311 refresh_resolvers();
4312 hooks_invoke(OFFLINE_SWITCH_HOOKLIST, NULL);
4316 static void addressbook_open_cb(GtkAction *action, gpointer data)
4318 #ifndef USE_ALT_ADDRBOOK
4319 addressbook_open(NULL);
4321 GError* error = NULL;
4323 addressbook_dbus_open(FALSE, &error);
4325 g_warning("Failed to open address book: %s", error->message);
4326 g_error_free(error);
4331 static void log_window_show_cb(GtkAction *action, gpointer data)
4333 MainWindow *mainwin = (MainWindow *)data;
4334 log_window_show(mainwin->logwin);
4337 static void filtering_debug_window_show_cb(GtkAction *action, gpointer data)
4339 MainWindow *mainwin = (MainWindow *)data;
4340 log_window_show(mainwin->filtering_debugwin);
4343 static void inc_cancel_cb(GtkAction *action, gpointer data)
4349 static void send_cancel_cb(GtkAction *action, gpointer data)
4354 static void move_to_cb(GtkAction *action, gpointer data)
4356 MainWindow *mainwin = (MainWindow *)data;
4357 summary_move_to(mainwin->summaryview);
4360 static void copy_to_cb(GtkAction *action, gpointer data)
4362 MainWindow *mainwin = (MainWindow *)data;
4363 summary_copy_to(mainwin->summaryview);
4366 static void delete_cb(GtkAction *action, gpointer data)
4368 MainWindow *mainwin = (MainWindow *)data;
4369 summary_delete(mainwin->summaryview);
4372 static void delete_trash_cb(GtkAction *action, gpointer data)
4374 MainWindow *mainwin = (MainWindow *)data;
4375 summary_delete_trash(mainwin->summaryview);
4378 static void cancel_cb(GtkAction *action, gpointer data)
4380 MainWindow *mainwin = (MainWindow *)data;
4381 summary_cancel(mainwin->summaryview);
4384 static void open_msg_cb(GtkAction *action, gpointer data)
4386 MainWindow *mainwin = (MainWindow *)data;
4387 summary_open_msg(mainwin->summaryview);
4390 static void view_source_cb(GtkAction *action, gpointer data)
4392 MainWindow *mainwin = (MainWindow *)data;
4393 summary_view_source(mainwin->summaryview);
4396 static void show_all_header_cb(GtkAction *action, gpointer data)
4398 MainWindow *mainwin = (MainWindow *)data;
4399 if (mainwin->menu_lock_count) return;
4400 prefs_common.show_all_headers =
4401 gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (action));
4402 summary_display_msg_selected(mainwin->summaryview,
4403 gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (action)));
4406 static void toggle_fullscreen_cb(GtkAction *action, gpointer data)
4408 MainWindow *mainwin = (MainWindow *)data;
4409 if (mainwin->menu_lock_count) return;
4410 if (!gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (action))) {
4411 gtk_window_unfullscreen(GTK_WINDOW(mainwin->window));
4412 prefs_common.mainwin_fullscreen = FALSE;
4415 prefs_common.mainwin_fullscreen = TRUE;
4416 gtk_window_fullscreen(GTK_WINDOW(mainwin->window));
4420 static void toggle_menubar_cb(GtkAction *action, gpointer data)
4422 MainWindow *mainwin = (MainWindow *)data;
4423 if (mainwin->menu_lock_count) return;
4424 if (!gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (action))) {
4425 gtk_widget_hide(GTK_WIDGET(mainwin->menubar));
4426 prefs_common.mainwin_menubar = FALSE;
4428 gtk_widget_show(GTK_WIDGET(mainwin->menubar));
4429 prefs_common.mainwin_menubar = TRUE;
4433 static void hide_quotes_cb(GtkAction *action, gpointer data)
4435 MainWindow *mainwin = (MainWindow *)data;
4437 if (mainwin->menu_lock_count) return;
4439 if (gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (action))) {
4440 const gchar *a_name = gtk_action_get_name(GTK_ACTION(action));
4441 if (!strcmp(a_name, "View/Quotes/CollapseAll")) prefs_common.hide_quotes = 1;
4442 else if (!strcmp(a_name, "View/Quotes/Collapse2")) prefs_common.hide_quotes = 2;
4443 else if (!strcmp(a_name, "View/Quotes/Collapse3")) prefs_common.hide_quotes = 3;
4445 prefs_common.hide_quotes = 0;
4447 mainwin->menu_lock_count++;
4448 cm_toggle_menu_set_active_full(mainwin->ui_manager, "Menu/View/Quotes/CollapseAll", (prefs_common.hide_quotes == 1));
4449 cm_toggle_menu_set_active_full(mainwin->ui_manager, "Menu/View/Quotes/Collapse2", (prefs_common.hide_quotes == 2));
4450 cm_toggle_menu_set_active_full(mainwin->ui_manager, "Menu/View/Quotes/Collapse3", (prefs_common.hide_quotes == 3));
4451 mainwin->menu_lock_count--;
4453 summary_redisplay_msg(mainwin->summaryview);
4456 static void mark_cb(GtkAction *action, gpointer data)
4458 MainWindow *mainwin = (MainWindow *)data;
4459 summary_mark(mainwin->summaryview);
4462 static void unmark_cb(GtkAction *action, gpointer data)
4464 MainWindow *mainwin = (MainWindow *)data;
4465 summary_unmark(mainwin->summaryview);
4468 static void mark_as_read_cb(GtkAction *action, gpointer data)
4470 MainWindow *mainwin = (MainWindow *)data;
4471 summary_mark_as_read(mainwin->summaryview);
4474 static void mark_as_unread_cb(GtkAction *action, gpointer data)
4476 MainWindow *mainwin = (MainWindow *)data;
4477 summary_mark_as_unread(mainwin->summaryview);
4480 static void mark_all_read_cb(GtkAction *action, gpointer data)
4482 MainWindow *mainwin = (MainWindow *)data;
4483 summary_mark_all_read(mainwin->summaryview, TRUE);
4486 static void mark_all_unread_cb(GtkAction *action, gpointer data)
4488 MainWindow *mainwin = (MainWindow *)data;
4489 summary_mark_all_unread(mainwin->summaryview, TRUE);
4492 static void mark_as_spam_cb(GtkAction *action, gpointer data)
4494 MainWindow *mainwin = (MainWindow *)data;
4495 summary_mark_as_spam(mainwin->summaryview, TRUE, NULL);
4498 static void mark_as_ham_cb(GtkAction *action, gpointer data)
4500 MainWindow *mainwin = (MainWindow *)data;
4501 summary_mark_as_spam(mainwin->summaryview, FALSE, NULL);
4504 static void ignore_thread_cb(GtkAction *action, gpointer data)
4506 MainWindow *mainwin = (MainWindow *)data;
4507 summary_ignore_thread(mainwin->summaryview);
4510 static void unignore_thread_cb(GtkAction *action, gpointer data)
4512 MainWindow *mainwin = (MainWindow *)data;
4513 summary_unignore_thread(mainwin->summaryview);
4516 static void watch_thread_cb(GtkAction *action, gpointer data)
4518 MainWindow *mainwin = (MainWindow *)data;
4519 summary_watch_thread(mainwin->summaryview);
4522 static void unwatch_thread_cb(GtkAction *action, gpointer data)
4524 MainWindow *mainwin = (MainWindow *)data;
4525 summary_unwatch_thread(mainwin->summaryview);
4528 static void lock_msgs_cb(GtkAction *action, gpointer data)
4530 MainWindow *mainwin = (MainWindow *)data;
4531 summary_msgs_lock(mainwin->summaryview);
4534 static void unlock_msgs_cb(GtkAction *action, gpointer data)
4536 MainWindow *mainwin = (MainWindow *)data;
4537 summary_msgs_unlock(mainwin->summaryview);
4541 static void reedit_cb(GtkAction *action, gpointer data)
4543 MainWindow *mainwin = (MainWindow *)data;
4544 summary_reedit(mainwin->summaryview);
4547 static void open_urls_cb(GtkAction *action, gpointer data)
4549 MainWindow *mainwin = (MainWindow *)data;
4550 if (!mainwin->summaryview->displayed && mainwin->summaryview->selected) {
4551 summary_display_msg_selected(mainwin->summaryview,
4552 prefs_common.show_all_headers);
4554 messageview_list_urls(mainwin->messageview);
4557 static void add_address_cb(GtkAction *action, gpointer data)
4559 MainWindow *mainwin = (MainWindow *)data;
4560 summary_add_address(mainwin->summaryview);
4563 static void set_charset_cb(GtkAction *action, GtkRadioAction *current, gpointer data)
4565 MainWindow *mainwin = (MainWindow *)data;
4566 gint value = gtk_radio_action_get_current_value (GTK_RADIO_ACTION (current));
4569 if (gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (current))) {
4570 str = conv_get_charset_str((CharSet)value);
4572 g_free(mainwin->messageview->forced_charset);
4573 mainwin->messageview->forced_charset = str ? g_strdup(str) : NULL;
4574 procmime_force_charset(str);
4576 summary_redisplay_msg(mainwin->summaryview);
4578 debug_print("forced charset: %s\n", str ? str : "Auto-Detect");
4582 static void set_decode_cb(GtkAction *action, GtkRadioAction *current, gpointer data)
4584 MainWindow *mainwin = (MainWindow *)data;
4585 gint value = gtk_radio_action_get_current_value (GTK_RADIO_ACTION (current));
4586 if (gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (current))) {
4587 mainwin->messageview->forced_encoding = (EncodingType)value;
4589 summary_redisplay_msg(mainwin->summaryview);
4591 debug_print("forced encoding: %d\n", value);
4595 static void hide_read_messages (GtkAction *action, gpointer data)
4597 MainWindow *mainwin = (MainWindow *)data;
4598 GtkWidget *menuitem = gtk_ui_manager_get_widget(mainwin->ui_manager, "/Menu/View/HideReadMessages");
4599 if (!mainwin->summaryview->folder_item
4600 || g_object_get_data(G_OBJECT(menuitem), "dont_toggle"))
4602 summary_toggle_show_read_messages(mainwin->summaryview);
4605 static void hide_del_messages (GtkAction *action, gpointer data)
4607 MainWindow *mainwin = (MainWindow *)data;
4608 GtkWidget *menuitem = gtk_ui_manager_get_widget(mainwin->ui_manager, "/Menu/View/HideDelMessages");
4609 if (!mainwin->summaryview->folder_item
4610 || g_object_get_data(G_OBJECT(menuitem), "dont_toggle"))
4612 summary_toggle_show_del_messages(mainwin->summaryview);
4615 static void hide_read_threads (GtkAction *action, gpointer data)
4617 MainWindow *mainwin = (MainWindow *)data;
4618 GtkWidget *menuitem = gtk_ui_manager_get_widget(mainwin->ui_manager, "/Menu/View/HideReadThreads");
4619 if (!mainwin->summaryview->folder_item
4620 || g_object_get_data(G_OBJECT(menuitem), "dont_toggle"))
4622 summary_toggle_show_read_threads(mainwin->summaryview);
4625 static void thread_cb(GtkAction *action, gpointer data)
4627 MainWindow *mainwin = (MainWindow *)data;
4628 gboolean threaded = FALSE;
4629 if (mainwin->menu_lock_count) return;
4630 if (!mainwin->summaryview->folder_item) return;
4632 threaded = gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (action));
4634 mainwin->summaryview->folder_item->threaded = threaded;
4636 mainwin->summaryview->threaded = threaded;
4638 summary_show(mainwin->summaryview,
4639 mainwin->summaryview->folder_item);
4642 static void expand_threads_cb(GtkAction *action, gpointer data)
4644 MainWindow *mainwin = (MainWindow *)data;
4645 summary_expand_threads(mainwin->summaryview);
4648 static void collapse_threads_cb(GtkAction *action, gpointer data)
4650 MainWindow *mainwin = (MainWindow *)data;
4651 summary_collapse_threads(mainwin->summaryview);
4654 static void set_summary_display_item_cb(GtkAction *action, gpointer data)
4656 prefs_summary_column_open();
4659 static void set_folder_display_item_cb(GtkAction *action, gpointer data)
4661 prefs_folder_column_open();
4664 static void sort_summary_cb(GtkAction *action, GtkRadioAction *current, gpointer data)
4666 MainWindow *mainwin = (MainWindow *)data;
4667 gint value = gtk_radio_action_get_current_value (GTK_RADIO_ACTION (current));
4669 if (mainwin->menu_lock_count) return;
4671 if (gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (current))) {
4672 summary_sort(mainwin->summaryview, (FolderSortKey)value,
4673 mainwin->summaryview->sort_type);
4677 static void sort_summary_type_cb(GtkAction *gaction, GtkRadioAction *current, gpointer data)
4679 MainWindow *mainwin = (MainWindow *)data;
4680 gint value = gtk_radio_action_get_current_value (GTK_RADIO_ACTION (current));
4682 if (mainwin->menu_lock_count) return;
4684 if (gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (current)))
4685 summary_sort(mainwin->summaryview,
4686 mainwin->summaryview->sort_key, (FolderSortType)value);
4689 static void attract_by_subject_cb(GtkAction *action, gpointer data)
4691 MainWindow *mainwin = (MainWindow *)data;
4692 summary_attract_by_subject(mainwin->summaryview);
4695 void mainwindow_delete_duplicated(MainWindow *mainwin)
4699 item = folderview_get_selected_item(mainwin->folderview);
4703 main_window_cursor_wait(mainwin);
4704 STATUSBAR_PUSH(mainwin, _("Deleting duplicated messages..."));
4705 result = folderutils_delete_duplicates(item, prefs_common.immediate_exec ?
4706 DELETE_DUPLICATES_REMOVE : DELETE_DUPLICATES_SETFLAG);
4707 STATUSBAR_POP(mainwin);
4708 main_window_cursor_normal(mainwin);
4714 alertpanel_notice(_("No duplicate message found in selected folder.\n"));
4719 if (prefs_common.immediate_exec) {
4720 msg = ngettext("Deleted %d duplicate message in selected folder.\n",
4721 "Deleted %d duplicate messages in selected folder.\n",
4724 msg = ngettext("Marked %d duplicate message for deletion in selected folder.\n",
4725 "Marked %d duplicate messages for deletion in selected folder.\n",
4728 alertpanel_notice(msg, result);
4734 static void delete_duplicated_cb(GtkAction *action, gpointer data)
4736 mainwindow_delete_duplicated((MainWindow *)data);
4745 static void deldup_all(FolderItem *item, gpointer _data)
4747 struct DelDupsData *data = _data;
4750 result = folderutils_delete_duplicates(item, DELETE_DUPLICATES_REMOVE);
4752 data->dups += result;
4757 void mainwindow_delete_duplicated_all(MainWindow *mainwin)
4759 struct DelDupsData data = {0, 0};
4761 main_window_cursor_wait(mainwin);
4762 STATUSBAR_PUSH(mainwin, _("Deleting duplicated messages in all folders..."));
4763 folder_func_to_all_folders(deldup_all, &data);
4764 STATUSBAR_POP(mainwin);
4765 main_window_cursor_normal(mainwin);
4767 if (data.dups > 0) {
4768 alertpanel_notice(ngettext("Deleted %d duplicate message in %d folders.\n",
4769 "Deleted %d duplicate messages in %d folders.\n",
4771 data.dups, data.folders);
4773 alertpanel_notice(_("No duplicate message found in %d folders.\n"), data.folders);
4777 static void delete_duplicated_all_cb(GtkAction *action, gpointer mw)
4779 MainWindow *mainwin = (MainWindow *)mw;
4781 mainwindow_delete_duplicated_all(mainwin);
4784 static void filter_cb(GtkAction *action, gpointer data)
4786 MainWindow *mainwin = (MainWindow *)data;
4787 summary_filter(mainwin->summaryview, FALSE);
4790 static void filter_list_cb(GtkAction *action, gpointer data)
4792 MainWindow *mainwin = (MainWindow *)data;
4793 summary_filter(mainwin->summaryview, TRUE);
4796 static void process_cb(GtkAction *action, gpointer data)
4798 MainWindow *mainwin = (MainWindow *)data;
4799 FolderItem *item = mainwin->summaryview->folder_item;
4800 cm_return_if_fail(item != NULL);
4802 item->processing_pending = TRUE;
4803 folder_item_apply_processing(item);
4804 item->processing_pending = FALSE;
4807 static void execute_summary_cb(GtkAction *action, gpointer data)
4809 MainWindow *mainwin = (MainWindow *)data;
4810 summary_execute(mainwin->summaryview);
4813 static void expunge_summary_cb(GtkAction *action, gpointer data)
4815 MainWindow *mainwin = (MainWindow *)data;
4816 summary_expunge(mainwin->summaryview);
4819 static void update_summary_cb(GtkAction *action, gpointer data)
4821 MainWindow *mainwin = (MainWindow *)data;
4823 FolderView *folderview = mainwin->folderview;
4825 if (!mainwin->summaryview->folder_item) return;
4826 if ((fitem = folderview_get_opened_item(folderview)) == NULL) return;
4828 folder_update_op_count();
4829 folder_item_scan(fitem);
4830 summary_show(mainwin->summaryview, fitem);
4833 static void prev_cb(GtkAction *action, gpointer data)
4835 MainWindow *mainwin = (MainWindow *)data;
4836 summary_select_prev(mainwin->summaryview);
4839 static void next_cb(GtkAction *action, gpointer data)
4841 MainWindow *mainwin = (MainWindow *)data;
4842 summary_select_next(mainwin->summaryview);
4845 static void prev_unread_cb(GtkAction *action, gpointer data)
4847 MainWindow *mainwin = (MainWindow *)data;
4848 summary_select_prev_unread(mainwin->summaryview);
4851 static void next_unread_cb(GtkAction *action, gpointer data)
4853 MainWindow *mainwin = (MainWindow *)data;
4854 summary_select_next_unread(mainwin->summaryview);
4857 static void prev_new_cb(GtkAction *action, gpointer data)
4859 MainWindow *mainwin = (MainWindow *)data;
4860 summary_select_prev_new(mainwin->summaryview);
4863 static void next_new_cb(GtkAction *action, gpointer data)
4865 MainWindow *mainwin = (MainWindow *)data;
4866 summary_select_next_new(mainwin->summaryview);
4869 static void prev_marked_cb(GtkAction *action, gpointer data)
4871 MainWindow *mainwin = (MainWindow *)data;
4872 summary_select_prev_marked(mainwin->summaryview);
4875 static void next_marked_cb(GtkAction *action, gpointer data)
4877 MainWindow *mainwin = (MainWindow *)data;
4878 summary_select_next_marked(mainwin->summaryview);
4881 static void prev_labeled_cb(GtkAction *action, gpointer data)
4883 MainWindow *mainwin = (MainWindow *)data;
4884 summary_select_prev_labeled(mainwin->summaryview);
4887 static void next_labeled_cb(GtkAction *action, gpointer data)
4889 MainWindow *mainwin = (MainWindow *)data;
4890 summary_select_next_labeled(mainwin->summaryview);
4893 static void prev_history_cb(GtkAction *action, gpointer data)
4895 MainWindow *mainwin = (MainWindow *)data;
4896 MsgInfo *info = messageview_nav_get_prev(mainwin->messageview);
4898 if (info->folder != mainwin->summaryview->folder_item)
4899 folderview_select(mainwin->folderview, info->folder);
4900 summary_select_by_msgnum(mainwin->summaryview, info->msgnum,
4901 OPEN_SELECTED_ON_PREVNEXT);
4902 procmsg_msginfo_free(&info);
4903 main_window_set_menu_sensitive(mainwindow_get_mainwindow());
4904 toolbar_main_set_sensitive(mainwindow_get_mainwindow());
4908 static void next_history_cb(GtkAction *action, gpointer data)
4910 MainWindow *mainwin = (MainWindow *)data;
4911 MsgInfo *info = messageview_nav_get_next(mainwin->messageview);
4913 if (info->folder != mainwin->summaryview->folder_item)
4914 folderview_select(mainwin->folderview, info->folder);
4915 summary_select_by_msgnum(mainwin->summaryview, info->msgnum,
4916 OPEN_SELECTED_ON_PREVNEXT);
4917 procmsg_msginfo_free(&info);
4918 main_window_set_menu_sensitive(mainwindow_get_mainwindow());
4919 toolbar_main_set_sensitive(mainwindow_get_mainwindow());
4923 static void parent_cb(GtkAction *action, gpointer data)
4925 MainWindow *mainwin = (MainWindow *)data;
4926 summary_select_parent(mainwin->summaryview);
4929 static void goto_folder_cb(GtkAction *action, gpointer data)
4931 MainWindow *mainwin = (MainWindow *)data;
4932 FolderItem *to_folder;
4934 to_folder = foldersel_folder_sel(NULL, FOLDER_SEL_ALL, NULL, FALSE,
4935 _("Select folder to go to"));
4938 folderview_select(mainwin->folderview, to_folder);
4941 static void goto_unread_folder_cb(GtkAction *action, gpointer data)
4943 MainWindow *mainwin = (MainWindow *)data;
4944 folderview_select_next_with_flag(mainwin->folderview, MSG_UNREAD);
4947 static void scroll_prev_line_cb(GtkAction *action, gpointer data)
4949 MainWindow *mainwin = (MainWindow *)data;
4950 mimeview_scroll_one_line(mainwin->messageview->mimeview,TRUE);
4953 static void scroll_next_line_cb(GtkAction *action, gpointer data)
4955 MainWindow *mainwin = (MainWindow *)data;
4956 mimeview_scroll_one_line(mainwin->messageview->mimeview,FALSE);
4959 static void scroll_prev_page_cb(GtkAction *action, gpointer data)
4961 MainWindow *mainwin = (MainWindow *)data;
4962 mimeview_scroll_page(mainwin->messageview->mimeview,TRUE);
4965 static void scroll_next_page_cb(GtkAction *action, gpointer data)
4967 MainWindow *mainwin = (MainWindow *)data;
4968 mimeview_scroll_page(mainwin->messageview->mimeview,FALSE);
4971 static void copy_cb(GtkAction *action, gpointer data)
4973 MainWindow *mainwin = (MainWindow *)data;
4974 messageview_copy_clipboard(mainwin->messageview);
4977 static void allsel_cb(GtkAction *action, gpointer data)
4979 MainWindow *mainwin = (MainWindow *)data;
4980 MessageView *msgview = mainwin->messageview;
4982 if (messageview_is_visible(msgview) &&
4983 (gtk_widget_has_focus(msgview->mimeview->textview->text)))
4984 messageview_select_all(mainwin->messageview);
4986 summary_select_all(mainwin->summaryview);
4989 static void select_thread_cb(GtkAction *action, gpointer data)
4991 MainWindow *mainwin = (MainWindow *)data;
4992 summary_select_thread(mainwin->summaryview, FALSE, FALSE);
4995 static void trash_thread_cb(GtkAction *action, gpointer data)
4997 MainWindow *mainwin = (MainWindow *)data;
4998 summary_select_thread(mainwin->summaryview, FALSE, TRUE);
5001 static void delete_thread_cb(GtkAction *action, gpointer data)
5003 MainWindow *mainwin = (MainWindow *)data;
5004 summary_select_thread(mainwin->summaryview, TRUE, FALSE);
5007 static void create_filter_cb(GtkAction *gaction, gpointer data)
5009 MainWindow *mainwin = (MainWindow *)data;
5010 const gchar *a_name = gtk_action_get_name(gaction);
5013 DO_ACTION("Tools/CreateFilterRule/Automatically", FILTER_BY_AUTO);
5014 DO_ACTION("Tools/CreateFilterRule/ByFrom", FILTER_BY_FROM);
5015 DO_ACTION("Tools/CreateFilterRule/ByTo", FILTER_BY_TO);
5016 DO_ACTION("Tools/CreateFilterRule/BySubject", FILTER_BY_SUBJECT);
5017 summary_filter_open(mainwin->summaryview, (PrefsFilterType)action, 0);
5020 static void create_processing_cb(GtkAction *gaction, gpointer data)
5022 MainWindow *mainwin = (MainWindow *)data;
5023 const gchar *a_name = gtk_action_get_name(gaction);
5026 DO_ACTION("Tools/CreateProcessingRule/Automatically", FILTER_BY_AUTO);
5027 DO_ACTION("Tools/CreateProcessingRule/ByFrom", FILTER_BY_FROM);
5028 DO_ACTION("Tools/CreateProcessingRule/ByTo", FILTER_BY_TO);
5029 DO_ACTION("Tools/CreateProcessingRule/BySubject", FILTER_BY_SUBJECT);
5030 summary_filter_open(mainwin->summaryview, (PrefsFilterType)action, 1);
5033 static void prefs_pre_processing_open_cb(GtkAction *action, gpointer data)
5035 prefs_filtering_open(&pre_global_processing,
5036 _("Processing rules to apply before folder rules"),
5037 MANUAL_ANCHOR_PROCESSING,
5041 static void prefs_post_processing_open_cb(GtkAction *action, gpointer data)
5043 prefs_filtering_open(&post_global_processing,
5044 _("Processing rules to apply after folder rules"),
5045 MANUAL_ANCHOR_PROCESSING,
5049 static void prefs_filtering_open_cb(GtkAction *action, gpointer data)
5051 prefs_filtering_open(&filtering_rules,
5052 _("Filtering configuration"),
5053 MANUAL_ANCHOR_FILTERING,
5057 static void prefs_template_open_cb(GtkAction *action, gpointer data)
5059 prefs_template_open();
5062 static void prefs_actions_open_cb(GtkAction *action, gpointer data)
5064 MainWindow *mainwin = (MainWindow *)data;
5065 prefs_actions_open(mainwin);
5068 static void prefs_tags_open_cb(GtkAction *action, gpointer data)
5070 MainWindow *mainwin = (MainWindow *)data;
5071 GSList * list = summary_get_selected_msg_list(mainwin->summaryview);
5072 tag_apply_open(list);
5075 static void ssl_manager_open_cb(GtkAction *action, gpointer data)
5077 MainWindow *mainwin = (MainWindow *)data;
5078 ssl_manager_open(mainwin);
5081 static void prefs_account_open_cb(GtkAction *action, gpointer data)
5083 MainWindow *mainwin = (MainWindow *)data;
5085 new_account_cb(NULL, mainwin);
5087 account_open(cur_account, FALSE);
5091 static void new_account_cb(GtkAction *action, gpointer data)
5093 account_edit_open(NULL, NULL);
5094 if (!compose_get_compose_list()) account_add();
5097 static void account_selector_menu_cb(GtkMenuItem *menuitem, gpointer data)
5099 FolderItem *item = NULL;
5100 cur_account = (PrefsAccount *)data;
5102 if (!mainwindow_get_mainwindow())
5104 main_window_show_cur_account(mainwindow_get_mainwindow());
5105 toolbar_update(TOOLBAR_MAIN, mainwindow_get_mainwindow());
5106 main_window_set_menu_sensitive(mainwindow_get_mainwindow());
5107 toolbar_main_set_sensitive(mainwindow_get_mainwindow());
5108 item = folderview_get_selected_item(
5109 mainwindow_get_mainwindow()->folderview);
5111 toolbar_set_compose_button
5112 (mainwindow_get_mainwindow()->toolbar,
5113 FOLDER_TYPE(item->folder) == F_NEWS ?
5114 COMPOSEBUTTON_NEWS : COMPOSEBUTTON_MAIL);
5118 static void account_receive_menu_cb(GtkMenuItem *menuitem, gpointer data)
5120 MainWindow *mainwin = (MainWindow *)mainwin_list->data;
5121 PrefsAccount *account = (PrefsAccount *)data;
5123 inc_account_mail(mainwin, account);
5125 #ifndef GENERIC_UMPC
5126 static void account_compose_menu_cb(GtkMenuItem *menuitem, gpointer data)
5128 PrefsAccount *account = (PrefsAccount *)data;
5130 compose_new_with_folderitem(account, NULL, NULL);
5133 static void prefs_open_cb(GtkAction *action, gpointer data)
5138 static void plugins_open_cb(GtkAction *action, gpointer data)
5140 pluginwindow_create();
5143 static void manual_open_cb(GtkAction *action, gpointer data)
5145 manual_open(MANUAL_MANUAL_CLAWS, NULL);
5148 static void manual_faq_open_cb(GtkAction *action, gpointer data)
5150 manual_open(MANUAL_FAQ_CLAWS, NULL);
5153 static void legend_open_cb(GtkAction *action, gpointer data)
5159 static void set_default_client_cb(GtkAction *action, gpointer data)
5161 char exename[MAX_PATH];
5162 gchar *binary_icon = NULL;
5163 gchar *binary_compose = NULL;
5164 gchar *binary_run = NULL;
5166 if ( !GetModuleFileNameA (0, exename, sizeof (exename)) ) {
5167 alertpanel_error(_("Can not register as default client: impossible to get executable path."));
5170 binary_icon = g_strconcat(exename, ",0", NULL);
5171 binary_compose = g_strconcat(exename, " --compose %1", NULL);
5172 binary_run = g_strconcat(exename, NULL);
5174 /* Try to set the Mail Start menu item to Claws. It may fail if we're not root; we don't care */
5175 r = write_w32_registry_string("HKLM", "Software\\Clients\\Mail",
5178 r = write_w32_registry_string("HKCU", "Software\\Clients\\Mail\\Claws Mail",
5181 r = write_w32_registry_string("HKCU", "Software\\Clients\\Mail\\Claws Mail",
5184 r = write_w32_registry_string("HKCU", "Software\\Clients\\Mail\\Claws Mail\\Protocols\\mailto",
5185 "", "URL:MailTo-Protocol");
5187 r = write_w32_registry_string("HKCU", "Software\\Clients\\Mail\\Claws Mail\\Protocols\\mailto",
5188 "URL Protocol", "");
5190 r = write_w32_registry_dword ("HKCU", "Software\\Clients\\Mail\\Claws Mail\\Protocols\\mailto",
5193 r = write_w32_registry_string ("HKCU", "Software\\Clients\\Mail\\Claws Mail\\Protocols\\mailto",
5194 "FriendlyTypeName", "Claws-Mail URL");
5196 r = write_w32_registry_string("HKCU", "Software\\Clients\\Mail\\Claws Mail\\Protocols\\mailto\\DefaultIcon",
5199 r = write_w32_registry_string("HKCU", "Software\\Clients\\Mail\\Claws Mail\\Protocols\\mailto\\shell\\open\\command",
5200 "", binary_compose);
5202 r = write_w32_registry_string("HKCU", "Software\\Clients\\Mail\\Claws Mail\\shell\\open\\command",
5206 r = write_w32_registry_string("HKCU", "Software\\Classes\\mailto",
5207 "", "URL:MailTo-Protocol");
5209 r = write_w32_registry_string("HKCU", "Software\\Classes\\mailto",
5210 "URL Protocol", "");
5212 r = write_w32_registry_dword ("HKCU", "Software\\Classes\\mailto",
5215 r = write_w32_registry_string("HKCU", "Software\\Classes\\mailto",
5216 "FriendlyTypeName", "Claws-Mail URL");
5218 r = write_w32_registry_string("HKCU", "Software\\Classes\\mailto\\DefaultIcon",
5221 r = write_w32_registry_string("HKCU", "Software\\Classes\\mailto\\shell\\open\\command",
5222 "", binary_compose);
5225 SendMessage(HWND_BROADCAST, WM_SETTINGCHANGE, 0, (LPARAM)"Software\\Clients\\Mail");
5226 alertpanel_notice(_("Claws Mail has been registered as default client."));
5228 alertpanel_error(_("Can not register as default client: impossible to write to the registry."));
5230 g_free(binary_icon);
5231 g_free(binary_compose);
5236 static void scan_tree_func(Folder *folder, FolderItem *item, gpointer data)
5238 MainWindow *mainwin = (MainWindow *)data;
5242 str = g_strdup_printf(_("Scanning folder %s%c%s..."),
5243 LOCAL_FOLDER(folder)->rootpath,
5247 str = g_strdup_printf(_("Scanning folder %s..."),
5248 LOCAL_FOLDER(folder)->rootpath);
5250 STATUSBAR_PUSH(mainwin, str);
5251 STATUSBAR_POP(mainwin);
5255 static gboolean mainwindow_focus_in_event(GtkWidget *widget, GdkEventFocus *focus,
5258 SummaryView *summary;
5260 cm_return_val_if_fail(data, FALSE);
5261 if (!g_list_find(mainwin_list, data))
5263 summary = ((MainWindow *)data)->summaryview;
5264 cm_return_val_if_fail(summary, FALSE);
5266 if (GTK_CMCLIST(summary->ctree)->selection &&
5267 g_list_length(GTK_CMCLIST(summary->ctree)->selection) > 1)
5273 static gboolean mainwindow_visibility_event_cb(GtkWidget *widget, GdkEventVisibility *event,
5276 is_obscured = (event->state == GDK_VISIBILITY_FULLY_OBSCURED);
5280 static gboolean mainwindow_state_event_cb(GtkWidget *widget, GdkEventWindowState *state,
5283 if (!claws_is_starting()
5284 && state->changed_mask&GDK_WINDOW_STATE_ICONIFIED
5285 && state->new_window_state&GDK_WINDOW_STATE_ICONIFIED) {
5287 if (iconified_count > 0)
5288 hooks_invoke(MAIN_WINDOW_GOT_ICONIFIED, NULL);
5290 } else if (!claws_is_starting()) {
5291 prefs_common.mainwin_maximised =
5292 ((state->new_window_state&GDK_WINDOW_STATE_MAXIMIZED) != 0);
5294 if (state->new_window_state == 0)
5295 gtk_window_set_skip_taskbar_hint(GTK_WINDOW(widget), FALSE);
5299 gboolean mainwindow_is_obscured(void)
5305 * Harvest addresses for selected folder.
5307 static void addr_harvest_cb( GtkAction *action, gpointer data)
5309 MainWindow *mainwin = (MainWindow *)data;
5311 addressbook_harvest( mainwin->summaryview->folder_item, FALSE, NULL );
5315 * Harvest addresses for selected messages in summary view.
5317 static void addr_harvest_msg_cb( GtkAction *action, gpointer data)
5319 MainWindow *mainwin = (MainWindow *)data;
5320 summary_harvest_address( mainwin->summaryview );
5324 *\brief get a MainWindow
5326 *\return MainWindow * The first mainwindow in the mainwin_list
5328 MainWindow *mainwindow_get_mainwindow(void)
5330 if (mainwin_list && mainwin_list->data)
5331 return (MainWindow *)(mainwin_list->data);
5336 static gboolean mainwindow_progressindicator_hook(gpointer source, gpointer userdata)
5338 ProgressData *data = (ProgressData *) source;
5339 MainWindow *mainwin = (MainWindow *) userdata;
5341 switch (data->cmd) {
5342 case PROGRESS_COMMAND_START:
5343 case PROGRESS_COMMAND_STOP:
5344 gtk_progress_bar_set_fraction
5345 (GTK_PROGRESS_BAR(mainwin->progressbar), 0.0);
5347 case PROGRESS_COMMAND_SET_PERCENTAGE:
5348 gtk_progress_bar_set_fraction
5349 (GTK_PROGRESS_BAR(mainwin->progressbar), data->value);
5352 while (gtk_events_pending()) gtk_main_iteration ();
5357 static void sync_cb(GtkAction *action, gpointer data)
5359 MainWindow *mainwin = (MainWindow *)data;
5360 mainwindow_check_synchronise(mainwin, FALSE);
5363 static void forget_session_passwords_cb(GtkAction *action, gpointer data)
5365 MainWindow *mainwin = (MainWindow *)data;
5370 main_window_lock(mainwin);
5371 for (list = account_get_list(); list != NULL; list = list->next) {
5372 PrefsAccount *account = list->data;
5373 if (account->session_passwd) {
5374 g_free(account->session_passwd);
5375 account->session_passwd = NULL;
5378 if (account->session_smtp_passwd) {
5379 g_free(account->session_smtp_passwd);
5380 account->session_smtp_passwd = NULL;
5385 main_window_unlock(mainwin);
5386 alertpanel_notice(ngettext("Forgotten %d password in %d accounts.\n",
5387 "Forgotten %d passwords in %d accounts.\n",
5391 #ifndef PASSWORD_CRYPTO_OLD
5392 static void forget_master_passphrase_cb(GtkAction *action, gpointer data)
5394 MainWindow *mainwin = (MainWindow *)data;
5396 main_window_lock(mainwin);
5397 master_passphrase_forget();
5398 main_window_unlock(mainwin);
5402 void mainwindow_learn (MainWindow *mainwin, gboolean is_spam)
5404 summary_mark_as_spam(mainwin->summaryview, is_spam, NULL);
5407 void mainwindow_jump_to(const gchar *target, gboolean popup)
5411 FolderItem *item = NULL;
5413 MainWindow *mainwin = mainwindow_get_mainwindow();
5414 gchar *from_uri = NULL;
5419 g_print("not initialized\n");
5423 if ((from_uri = g_filename_from_uri(target, NULL, NULL)) != NULL)
5426 tmp = g_strdup(target);
5428 if ((p = strstr(tmp, "\r")) != NULL)
5430 if ((p = strstr(tmp, "\n")) != NULL)
5433 if ((item = folder_find_item_from_identifier(tmp))) {
5434 g_print("selecting folder '%s'\n", tmp);
5435 folderview_select(mainwin->folderview, item);
5437 main_window_popup(mainwin);
5442 msg = strrchr(tmp, '/');
5445 if ((item = folder_find_item_from_identifier(tmp))) {
5446 g_print("selecting folder '%s'\n", tmp);
5447 folderview_select(mainwin->folderview, item);
5448 } else if ((item = folder_find_item_from_real_path(tmp))) {
5449 g_print("selecting folder '%s'\n", tmp);
5450 folderview_select(mainwin->folderview, item);
5452 g_print("'%s' not found\n", tmp);
5454 if (item && msg && atoi(msg)) {
5455 g_print("selecting message %d\n", atoi(msg));
5456 summary_select_by_msgnum(mainwin->summaryview, atoi(msg), TRUE);
5458 main_window_popup(mainwin);
5461 } else if (item && msg[0] == '<' && msg[strlen(msg)-1] == '>') {
5462 MsgInfo *msginfo = NULL;
5464 msg[strlen(msg)-1] = '\0';
5465 msginfo = folder_item_get_msginfo_by_msgid(item, msg);
5467 g_print("selecting message %s\n", msg);
5468 summary_select_by_msgnum(mainwin->summaryview, msginfo->msgnum, TRUE);
5470 main_window_popup(mainwin);
5472 procmsg_msginfo_free(&msginfo);
5475 g_print("'%s' not found\n", msg);
5478 g_print("'%s' not found\n", msg);
5481 g_print("'%s' not found\n", tmp);
5487 void mainwindow_exit_folder(MainWindow *mainwin) {
5488 if (prefs_common.layout_mode == SMALL_LAYOUT) {
5489 folderview_close_opened(mainwin->folderview, FALSE);
5490 mainwin_paned_show_first(GTK_PANED(mainwin->hpaned));
5491 folderview_grab_focus(mainwin->folderview);
5493 mainwin->in_folder = FALSE;
5494 main_window_set_menu_sensitive(mainwin);
5497 void mainwindow_enter_folder(MainWindow *mainwin) {
5498 if (prefs_common.layout_mode == SMALL_LAYOUT) {
5499 mainwin_paned_show_last(GTK_PANED(mainwin->hpaned));
5501 mainwin->in_folder = TRUE;
5502 main_window_set_menu_sensitive(mainwin);
5505 static void save_part_as_cb(GtkAction *action, gpointer data)
5507 MainWindow *mainwin = (MainWindow *)data;
5509 if (mainwin->messageview
5510 && mainwin->messageview->mimeview)
5511 mimeview_save_as(mainwin->messageview->mimeview);
5514 static void view_part_as_text_cb(GtkAction *action, gpointer data)
5516 MainWindow *mainwin = (MainWindow *)data;
5518 if (mainwin->messageview
5519 && mainwin->messageview->mimeview)
5520 mimeview_display_as_text(mainwin->messageview->mimeview);
5523 static void open_part_cb(GtkAction *action, gpointer data)
5525 MainWindow *mainwin = (MainWindow *)data;
5527 if (mainwin->messageview
5528 && mainwin->messageview->mimeview)
5529 mimeview_launch(mainwin->messageview->mimeview, NULL);
5532 static void open_part_with_cb(GtkAction *action, gpointer data)
5534 MainWindow *mainwin = (MainWindow *)data;
5536 if (mainwin->messageview
5537 && mainwin->messageview->mimeview)
5538 mimeview_open_with(mainwin->messageview->mimeview);
5541 static void check_signature_cb(GtkAction *action, gpointer data)
5543 MainWindow *mainwin = (MainWindow *)data;
5545 if (mainwin->messageview
5546 && mainwin->messageview->mimeview)
5547 mimeview_check_signature(mainwin->messageview->mimeview);
5550 static void goto_next_part_cb(GtkAction *action, gpointer data)
5552 MainWindow *mainwin = (MainWindow *)data;
5554 if (mainwin->messageview
5555 && mainwin->messageview->mimeview)
5556 mimeview_select_next_part(mainwin->messageview->mimeview);
5559 static void goto_prev_part_cb(GtkAction *action, gpointer data)
5561 MainWindow *mainwin = (MainWindow *)data;
5563 if (mainwin->messageview
5564 && mainwin->messageview->mimeview)
5565 mimeview_select_prev_part(mainwin->messageview->mimeview);