Improve some sieve-related translations
[claws.git] / src / mainwindow.c
blob566127558b81802a29ff5f350802ebd351ee1c00
1 /*
2 Claws Mail -- a GTK based, lightweight, and fast e-mail client
3 Copyright (C) 1999-2022 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/>.
19 #include "config.h"
20 #include "defs.h"
22 #ifdef G_OS_WIN32
23 #define UNICODE
24 #define _UNICODE
25 #endif
27 #include <glib.h>
28 #include <glib/gi18n.h>
29 #include <gdk/gdkkeysyms.h>
30 #include <gtk/gtk.h>
31 #include <string.h>
32 #include <stdarg.h>
34 #include "main.h"
35 #include "mainwindow.h"
36 #include "folderview.h"
37 #include "folder_item_prefs.h"
38 #include "foldersel.h"
39 #include "quicksearch.h"
40 #include "summaryview.h"
41 #include "summary_search.h"
42 #include "messageview.h"
43 #include "mimeview.h"
44 #include "message_search.h"
45 #include "headerview.h"
46 #include "menu.h"
47 #include "stock_pixmap.h"
48 #include "folder.h"
49 #include "inc.h"
50 #include "log.h"
51 #include "compose.h"
52 #include "procmsg.h"
53 #include "import.h"
54 #include "export.h"
55 #include "edittags.h"
56 #include "password.h"
57 #include "prefs_common.h"
58 #include "prefs_actions.h"
59 #include "prefs_filtering.h"
60 #include "prefs_account.h"
61 #include "prefs_summary_column.h"
62 #include "prefs_folder_column.h"
63 #include "prefs_template.h"
64 #include "action.h"
65 #include "account.h"
66 #ifndef USE_ALT_ADDRBOOK
67 #include "addressbook.h"
68 #else
69 #include "addressbook-dbus.h"
70 #endif
71 #include "logwindow.h"
72 #include "manage_window.h"
73 #include "alertpanel.h"
74 #include "statusbar.h"
75 #include "inputdialog.h"
76 #include "utils.h"
77 #include "gtkutils.h"
78 #include "codeconv.h"
79 #include "about.h"
80 #include "manual.h"
81 #include "version.h"
82 #include "ssl_manager.h"
83 #include "sslcertwindow.h"
84 #include "prefs_gtk.h"
85 #include "pluginwindow.h"
86 #include "hooks.h"
87 #include "progressindicator.h"
88 #include "localfolder.h"
89 #include "filtering.h"
90 #include "folderutils.h"
91 #include "foldersort.h"
92 #include "icon_legend.h"
93 #include "colorlabel.h"
94 #include "tags.h"
95 #include "textview.h"
96 #include "imap.h"
97 #include "news.h"
98 #include "socket.h"
99 #include "printing.h"
100 #include "send_message.h"
101 #ifdef G_OS_WIN32
102 #include "w32_reg.h"
103 #endif
105 /* list of all instantiated MainWindow */
106 static GList *mainwin_list = NULL;
108 static GdkCursor *watch_cursor = NULL;
109 static GdkCursor *hand_cursor = NULL;
111 static gint iconified_count = 0;
113 static void main_window_menu_callback_block (MainWindow *mainwin);
114 static void main_window_menu_callback_unblock (MainWindow *mainwin);
116 static void main_window_show_cur_account (MainWindow *mainwin);
117 #ifndef GENERIC_UMPC
118 static void main_window_separation_change (MainWindow *mainwin,
119 LayoutType layout_mode);
120 #endif
121 static void main_window_set_widgets (MainWindow *mainwin,
122 LayoutType layout_mode);
124 #ifndef GENERIC_UMPC
125 static gboolean ac_label_button_pressed (GtkWidget *widget,
126 GdkEventButton *event,
127 gpointer data);
128 #endif
129 static gint main_window_close_cb (GtkWidget *widget,
130 GdkEventAny *event,
131 gpointer data);
133 static void main_window_size_allocate_cb (GtkWidget *widget,
134 GtkAllocation *allocation,
135 gpointer data);
136 static void folder_window_size_allocate_cb (GtkWidget *widget,
137 GtkAllocation *allocation,
138 gpointer data);
139 static void message_window_size_allocate_cb (GtkWidget *widget,
140 GtkAllocation *allocation,
141 gpointer data);
143 static void update_folderview_cb (GtkAction *action,
144 gpointer data);
145 static void add_mailbox_cb (GtkAction *action,
146 gpointer data);
147 static void foldersort_cb (GtkAction *action,
148 gpointer data);
149 static void import_mbox_cb (GtkAction *action,
150 gpointer data);
151 static void export_mbox_cb (GtkAction *action,
152 gpointer data);
153 static void export_list_mbox_cb (GtkAction *action,
154 gpointer data);
155 static void empty_trash_cb (GtkAction *action,
156 gpointer data);
157 static void save_as_cb (GtkAction *action,
158 gpointer data);
159 static void page_setup_cb (GtkAction *action,
160 gpointer data);
161 static void print_cb (GtkAction *action,
162 gpointer data);
163 static void app_exit_cb (GtkAction *action,
164 gpointer data);
167 static void search_cb (GtkAction *action,
168 gpointer data);
169 static void search_folder_cb (GtkAction *action,
170 gpointer data);
172 static void toggle_message_cb (GtkAction *action,
173 gpointer data);
174 static void toggle_toolbar_cb (GtkAction *action, GtkRadioAction *current, gpointer data);
175 static void toggle_col_headers_cb(GtkAction *action,
176 gpointer data);
177 #ifndef GENERIC_UMPC
178 static void toggle_statusbar_cb (GtkAction *action,
179 gpointer data);
180 static void set_layout_cb (GtkAction *action, GtkRadioAction *current, gpointer data);
181 #endif
182 static void addressbook_open_cb (GtkAction *action,
183 gpointer data);
184 static void log_window_show_cb (GtkAction *action,
185 gpointer data);
186 static void filtering_debug_window_show_cb (GtkAction *action,
187 gpointer data);
188 #ifdef G_OS_WIN32
189 static void debug_log_show_cb(GtkAction *action, gpointer data);
190 #endif
192 static void inc_cancel_cb (GtkAction *action,
193 gpointer data);
194 static void send_cancel_cb (GtkAction *action,
195 gpointer data);
197 static void open_msg_cb (GtkAction *action,
198 gpointer data);
200 static void view_source_cb (GtkAction *action,
201 gpointer data);
203 static void show_all_header_cb (GtkAction *action,
204 gpointer data);
205 static void toggle_fullscreen_cb (GtkAction *action,
206 gpointer data);
207 static void toggle_menubar_cb (GtkAction *action,
208 gpointer data);
210 static void hide_quotes_cb(GtkAction *action,
211 gpointer data);
213 static void move_to_cb (GtkAction *action,
214 gpointer data);
215 static void copy_to_cb (GtkAction *action,
216 gpointer data);
217 static void delete_cb (GtkAction *action,
218 gpointer data);
219 static void delete_trash_cb (GtkAction *action,
220 gpointer data);
222 static void cancel_cb (GtkAction *action,
223 gpointer data);
225 static void mark_cb (GtkAction *action,
226 gpointer data);
227 static void unmark_cb (GtkAction *action,
228 gpointer data);
230 static void mark_as_unread_cb (GtkAction *action,
231 gpointer data);
232 static void mark_as_read_cb (GtkAction *action,
233 gpointer data);
234 static void mark_all_read_cb (GtkAction *action,
235 gpointer data);
236 static void mark_all_unread_cb (GtkAction *action,
237 gpointer data);
238 static void mark_as_spam_cb (GtkAction *action,
239 gpointer data);
240 static void mark_as_ham_cb (GtkAction *action,
241 gpointer data);
243 static void ignore_thread_cb (GtkAction *action,
244 gpointer data);
245 static void unignore_thread_cb (GtkAction *action,
246 gpointer data);
247 static void watch_thread_cb (GtkAction *action,
248 gpointer data);
249 static void unwatch_thread_cb (GtkAction *action,
250 gpointer data);
251 static void lock_msgs_cb (GtkAction *action,
252 gpointer data);
253 static void unlock_msgs_cb (GtkAction *action,
254 gpointer data);
256 static void reedit_cb (GtkAction *action,
257 gpointer data);
259 static void add_address_cb (GtkAction *action,
260 gpointer data);
262 static void set_charset_cb (GtkAction *action, GtkRadioAction *current, gpointer data);
264 static void set_decode_cb (GtkAction *action, GtkRadioAction *current, gpointer data);
266 static void hide_read_messages (GtkAction *action,
267 gpointer data);
268 static void hide_read_threads (GtkAction *action,
269 gpointer data);
270 static void hide_del_messages (GtkAction *action,
271 gpointer data);
273 static void thread_cb (GtkAction *action,
274 gpointer data);
275 static void expand_threads_cb (GtkAction *action,
276 gpointer data);
277 static void collapse_threads_cb (GtkAction *action,
278 gpointer data);
280 static void set_summary_display_item_cb (GtkAction *action,
281 gpointer data);
282 static void set_folder_display_item_cb (GtkAction *action,
283 gpointer data);
284 static void sort_summary_cb (GtkAction *action, GtkRadioAction *current, gpointer data);
285 static void sort_summary_type_cb (GtkAction *action, GtkRadioAction *current, gpointer data);
286 static void attract_by_subject_cb(GtkAction *action,
287 gpointer data);
289 static void delete_duplicated_cb (GtkAction *action,
290 gpointer data);
291 static void delete_duplicated_all_cb (GtkAction *action,
292 gpointer data);
293 static void filter_cb (GtkAction *action,
294 gpointer data);
295 static void filter_list_cb (GtkAction *action,
296 gpointer data);
297 static void process_cb (GtkAction *action,
298 gpointer data);
299 static void execute_summary_cb (GtkAction *action,
300 gpointer data);
301 static void expunge_summary_cb (GtkAction *action,
302 gpointer data);
303 static void update_summary_cb (GtkAction *action,
304 gpointer data);
306 static void prev_cb (GtkAction *action,
307 gpointer data);
308 static void next_cb (GtkAction *action,
309 gpointer data);
310 static void next_unread_cb (GtkAction *action,
311 gpointer data);
312 static void prev_unread_cb (GtkAction *action,
313 gpointer data);
315 static void prev_new_cb (GtkAction *action,
316 gpointer data);
317 static void next_new_cb (GtkAction *action,
318 gpointer data);
319 static void prev_marked_cb (GtkAction *action,
320 gpointer data);
321 static void next_marked_cb (GtkAction *action,
322 gpointer data);
323 static void prev_labeled_cb (GtkAction *action,
324 gpointer data);
325 static void next_labeled_cb (GtkAction *action,
326 gpointer data);
327 static void prev_history_cb (GtkAction *action,
328 gpointer data);
329 static void next_history_cb (GtkAction *action,
330 gpointer data);
331 static void parent_cb (GtkAction *action,
332 gpointer data);
334 static void goto_folder_cb (GtkAction *action,
335 gpointer data);
336 static void goto_unread_folder_cb(GtkAction *action,
337 gpointer data);
339 static void scroll_prev_line_cb (GtkAction *action,
340 gpointer data);
341 static void scroll_next_line_cb (GtkAction *action,
342 gpointer data);
343 static void scroll_prev_page_cb (GtkAction *action,
344 gpointer data);
345 static void scroll_next_page_cb (GtkAction *action,
346 gpointer data);
348 static void copy_cb (GtkAction *action,
349 gpointer data);
350 static void allsel_cb (GtkAction *action,
351 gpointer data);
352 static void select_thread_cb (GtkAction *action,
353 gpointer data);
354 static void trash_thread_cb (GtkAction *action,
355 gpointer data);
356 static void delete_thread_cb (GtkAction *action,
357 gpointer data);
359 static void create_filter_cb (GtkAction *action,
360 gpointer data);
361 static void create_processing_cb (GtkAction *action,
362 gpointer data);
363 static void open_urls_cb (GtkAction *action,
364 gpointer data);
366 static void prefs_template_open_cb (GtkAction *action,
367 gpointer data);
368 static void prefs_actions_open_cb (GtkAction *action,
369 gpointer data);
370 static void prefs_tags_open_cb (GtkAction *action,
371 gpointer data);
372 static void prefs_account_open_cb (GtkAction *action,
373 gpointer data);
375 static void prefs_pre_processing_open_cb (GtkAction *action,
376 gpointer data);
378 static void prefs_post_processing_open_cb (GtkAction *action,
379 gpointer data);
381 static void prefs_filtering_open_cb (GtkAction *action,
382 gpointer data);
383 #ifdef USE_GNUTLS
384 static void ssl_manager_open_cb (GtkAction *action,
385 gpointer data);
386 #endif
387 static void new_account_cb (GtkAction *action,
388 gpointer data);
390 static void account_selector_menu_cb (GtkMenuItem *menuitem,
391 gpointer data);
392 static void account_receive_menu_cb (GtkMenuItem *menuitem,
393 gpointer data);
394 #ifndef GENERIC_UMPC
395 static void account_compose_menu_cb (GtkMenuItem *menuitem,
396 gpointer data);
397 #endif
398 static void prefs_open_cb (GtkAction *action,
399 gpointer data);
400 static void plugins_open_cb (GtkAction *action,
401 gpointer data);
403 static void online_switch_clicked(GtkButton *btn,
404 gpointer data);
406 static void manual_open_cb (GtkAction *action,
407 gpointer data);
408 static void manual_faq_open_cb (GtkAction *action,
409 gpointer data);
411 static void legend_open_cb (GtkAction *action,
412 gpointer data);
414 #ifdef G_OS_WIN32
415 static void set_default_client_cb (GtkAction *action,
416 gpointer data);
417 #endif
419 static void scan_tree_func (Folder *folder,
420 FolderItem *item,
421 gpointer data);
423 static void toggle_work_offline_cb(GtkAction *action,
424 gpointer data);
426 static void addr_harvest_cb ( GtkAction *action,
427 gpointer data );
429 static void addr_harvest_msg_cb ( GtkAction *action,
430 gpointer data );
431 static void sync_cb ( GtkAction *action,
432 gpointer data );
434 static void forget_session_passwords_cb (GtkAction *action,
435 gpointer data );
436 #ifndef PASSWORD_CRYPTO_OLD
437 static void forget_primary_passphrase_cb (GtkAction *action,
438 gpointer data );
439 #endif
440 static gboolean mainwindow_focus_in_event (GtkWidget *widget,
441 GdkEventFocus *focus,
442 gpointer data);
443 static gboolean mainwindow_visibility_event_cb (GtkWidget *widget,
444 GdkEventVisibility *state,
445 gpointer data);
446 static gboolean mainwindow_state_event_cb (GtkWidget *widget,
447 GdkEventWindowState *state,
448 gpointer data);
449 static void main_window_reply_cb (GtkAction *action,
450 gpointer data);
451 static gboolean mainwindow_progressindicator_hook (gpointer source,
452 gpointer userdata);
454 static gint mailing_list_create_submenu(MainWindow *mainwindow,
455 MsgInfo *msginfo);
457 static gint mailing_list_populate_submenu(GtkWidget *menu, const gchar * list_header);
459 static void get_url_part(const gchar **buf, gchar *url_decoded);
461 static void mailing_list_compose(GtkWidget *w, gpointer *data);
463 static void mailing_list_open_uri(GtkWidget *w, gpointer *data);
465 static void mainwindow_quicksearch (GtkAction *action,
466 gpointer data);
467 static gboolean any_folder_want_synchronise(void);
469 static void save_part_as_cb(GtkAction *action, gpointer data);
470 static void view_part_as_text_cb(GtkAction *action, gpointer data);
471 static void open_part_cb(GtkAction *action, gpointer data);
472 #ifndef G_OS_WIN32
473 static void open_part_with_cb(GtkAction *action, gpointer data);
474 #endif
475 static void check_signature_cb(GtkAction *action, gpointer data);
476 static void goto_next_part_cb(GtkAction *action, gpointer data);
477 static void goto_prev_part_cb(GtkAction *action, gpointer data);
478 #define DO_ACTION(name, act) { if (!strcmp(a_name, name)) action = act; }
480 static void mainwindow_nothing_cb (GtkAction *action, gpointer data)
485 static void about_cb(GtkAction *gaction, gpointer data)
487 about_show();
490 static void mw_inc_mail_cb (GtkAction *gaction, gpointer data)
492 inc_mail_cb(data, 0, NULL);
494 static void mw_inc_all_account_mail_cb (GtkAction *gaction, gpointer data)
496 inc_all_account_mail_cb(data, 0, NULL);
498 static void mw_send_queue_cb (GtkAction *gaction, gpointer data)
500 send_queue_cb(data, 0, NULL);
502 static void mw_compose_mail_cb (GtkAction *gaction, gpointer data)
504 compose_mail_cb(data, 0, NULL);
506 static void mw_compose_news_cb (GtkAction *gaction, gpointer data)
508 compose_news_cb(data, 0, NULL);
511 static GtkActionEntry mainwin_entries[] =
513 {"Menu", NULL, "Menu", NULL, NULL, NULL },
514 /* menus */
515 {"File", NULL, N_("_File"), NULL, NULL, NULL },
516 {"Edit", NULL, N_("_Edit"), NULL, NULL, NULL },
517 {"View", NULL, N_("_View"), NULL, NULL, NULL },
518 {"Message", NULL, N_("_Message"), NULL, NULL, NULL },
519 {"Tools", NULL, N_("_Tools"), NULL, NULL, NULL },
520 {"Configuration", NULL, N_("_Configuration"), NULL, NULL, NULL },
521 {"Help", NULL, N_("_Help"), NULL, NULL, NULL },
523 /* File menu */
524 {"File/AddMailbox", NULL, N_("_Add mailbox"), NULL, NULL, NULL },
525 {"File/AddMailbox/MH", NULL, N_("MH..."), NULL, NULL, G_CALLBACK(add_mailbox_cb) },
526 {"File/---", NULL, "---", NULL, NULL, NULL },
528 {"File/SortMailboxes", NULL, N_("Change mailbox order..."), NULL, NULL, G_CALLBACK(foldersort_cb) },
530 /* {"File/---", NULL, "---", NULL, NULL, NULL }, */
531 {"File/ImportMbox", NULL, N_("_Import mbox file..."), NULL, NULL, G_CALLBACK(import_mbox_cb) },
532 {"File/ExportMbox", NULL, N_("_Export to mbox file..."), NULL, NULL, G_CALLBACK(export_mbox_cb) },
533 {"File/ExportSelMbox", NULL, N_("_Export selected to mbox file..."), NULL, NULL, G_CALLBACK(export_list_mbox_cb) },
534 /* {"File/---", NULL, "---", NULL, NULL, NULL }, */
535 {"File/EmptyTrashes", NULL, N_("Empty all _Trash folders"), "<shift>D", NULL, G_CALLBACK(empty_trash_cb) },
536 /* {"File/---", NULL, "---", NULL, NULL, NULL }, */
538 {"File/SaveAs", NULL, N_("_Save email as..."), "<control>S", NULL, G_CALLBACK(save_as_cb) },
539 {"File/SavePartAs", NULL, N_("_Save part as..."), "Y", NULL, G_CALLBACK(save_part_as_cb) },
540 /* {"File/---", NULL, "---", NULL, NULL, NULL }, */
542 {"File/PageSetup", NULL, N_("Page setup..."), NULL, NULL, G_CALLBACK(page_setup_cb) },
543 {"File/Print", NULL, N_("_Print..."), "<control>P", NULL, G_CALLBACK(print_cb) },
544 /* {"File/---", NULL, "---", NULL, NULL, NULL }, */
545 {"File/SynchroniseFolders", NULL, N_("Synchronise folders"), "<control><shift>S", NULL, G_CALLBACK(sync_cb) },
546 /* {"File/---", NULL, "---", NULL, NULL, NULL }, */
547 {"File/Exit", NULL, N_("E_xit"), "<control>Q", NULL, G_CALLBACK(app_exit_cb) },
549 /* Edit menu */
550 {"Edit/Copy", NULL, N_("_Copy"), "<control>C", NULL, G_CALLBACK(copy_cb) },
551 {"Edit/SelectAll", NULL, N_("Select _all"), "<control>A", NULL, G_CALLBACK(allsel_cb) },
552 {"Edit/SelectThread", NULL, N_("Select _thread"), NULL, NULL, G_CALLBACK(select_thread_cb) },
553 {"Edit/---", NULL, "---", NULL, NULL, NULL },
554 {"Edit/Find", NULL, N_("_Find in current message..."), "<control>F", NULL, G_CALLBACK(search_cb) },
555 {"Edit/SearchFolder", NULL, N_("_Search folder..."), "<shift><control>F", NULL, G_CALLBACK(search_folder_cb) },
556 {"Edit/QuickSearch", NULL, N_("_Quick search"), "slash", NULL, G_CALLBACK(mainwindow_quicksearch) },
558 /* View menu */
559 {"View/ShowHide", NULL, N_("Show or hi_de"), NULL, NULL, NULL },
560 {"View/ShowHide/Toolbar", NULL, N_("_Toolbar"), NULL, NULL, NULL },
562 {"View/SetColumns", NULL, N_("Set displayed _columns"), NULL, NULL, NULL },
563 {"View/SetColumns/Folderlist", NULL, N_("In _folder list..."), NULL, NULL, G_CALLBACK(set_folder_display_item_cb) },
564 {"View/SetColumns/Messagelist", NULL, N_("In _message list..."), NULL, NULL, G_CALLBACK(set_summary_display_item_cb) },
565 {"View/---", NULL, "---", NULL, NULL, NULL },
568 #ifndef GENERIC_UMPC
569 {"View/Layout", NULL, N_("La_yout"), NULL, NULL, NULL },
570 #endif
571 {"View/Sort", NULL, N_("_Sort"), NULL, NULL, NULL },
572 {"View/Sort/---", NULL, "---", NULL, NULL, NULL },
573 {"View/Sort/AttractSubj", NULL, N_("_Attract by subject"), NULL, NULL, G_CALLBACK(attract_by_subject_cb) },
575 {"View/ExpandThreads", NULL, N_("E_xpand all threads"), NULL, NULL, G_CALLBACK(expand_threads_cb) },
576 {"View/CollapseThreads", NULL, N_("Co_llapse all threads"), NULL, NULL, G_CALLBACK(collapse_threads_cb) },
578 {"View/Goto", NULL, N_("_Go to"), NULL, NULL, NULL },
579 {"View/Goto/Prev", NULL, N_("_Previous message"), "P", NULL, G_CALLBACK(prev_cb) },
580 {"View/Goto/Next", NULL, N_("_Next message"), "N", NULL, G_CALLBACK(next_cb) },
581 {"View/Goto/---", NULL, "---", NULL, NULL, NULL },
582 {"View/Goto/PrevUnread", NULL, N_("P_revious unread message"), "<shift>P", NULL, G_CALLBACK(prev_unread_cb) },
583 {"View/Goto/NextUnread", NULL, N_("N_ext unread message"), "<shift>N", NULL, G_CALLBACK(next_unread_cb) },
584 /* {"View/Goto/---", NULL, "---", NULL, NULL, NULL }, */
585 {"View/Goto/PrevNew", NULL, N_("Previous ne_w message"), NULL, NULL, G_CALLBACK(prev_new_cb) },
586 {"View/Goto/NextNew", NULL, N_("Ne_xt new message"), NULL, NULL, G_CALLBACK(next_new_cb) },
587 /* {"View/Goto/---", NULL, "---", NULL, NULL, NULL }, */
588 {"View/Goto/PrevMarked", NULL, N_("Previous _marked message"), NULL, NULL, G_CALLBACK(prev_marked_cb) },
589 {"View/Goto/NextMarked", NULL, N_("Next m_arked message"), NULL, NULL, G_CALLBACK(next_marked_cb) },
590 /* {"View/Goto/---", NULL, "---", NULL, NULL, NULL }, */
591 {"View/Goto/PrevLabeled", NULL, N_("Previous _labeled message"), NULL, NULL, G_CALLBACK(prev_labeled_cb) },
592 {"View/Goto/NextLabeled", NULL, N_("Next la_beled message"), NULL, NULL, G_CALLBACK(next_labeled_cb) },
593 /* {"View/Goto/---", NULL, "---", NULL, NULL, NULL }, */
594 {"View/Goto/PrevHistory", NULL, N_("Previously opened message"), "<alt>Left", NULL, G_CALLBACK(prev_history_cb) },
595 {"View/Goto/NextHistory", NULL, N_("Next opened message"), "<alt>Right", NULL, G_CALLBACK(next_history_cb) },
596 /* {"View/Goto/---", NULL, "---", NULL, NULL, NULL }, */
597 {"View/Goto/ParentMessage", NULL, N_("Parent message"), "<control>Up", NULL, G_CALLBACK(parent_cb) },
598 /* {"View/Goto/---", NULL, "---", NULL, NULL, NULL }, */
599 {"View/Goto/NextUnreadFolder", NULL, N_("Next unread _folder"), "<shift>G", NULL, G_CALLBACK(goto_unread_folder_cb) },
600 {"View/Goto/Folder", NULL, N_("F_older..."), "G", NULL, G_CALLBACK(goto_folder_cb) },
601 /* {"View/Goto/---", NULL, "---", NULL, NULL, NULL }, */
602 {"View/Goto/NextPart", NULL, N_("Next part"), "A", NULL, G_CALLBACK(goto_next_part_cb) },
603 {"View/Goto/PrevPart", NULL, N_("Previous part"), "Z", NULL, G_CALLBACK(goto_prev_part_cb) },
605 /* {"View/Scroll/---", NULL, "---", NULL, NULL, NULL }, */
606 {"View/Scroll", NULL, N_("Message scroll"), NULL, NULL, NULL },
607 {"View/Scroll/PrevLine", NULL, N_("Previous line"), NULL, NULL, G_CALLBACK(scroll_prev_line_cb) },
608 {"View/Scroll/NextLine", NULL, N_("Next line"), NULL, NULL, G_CALLBACK(scroll_next_line_cb) },
609 {"View/Scroll/PrevPage", NULL, N_("Previous page"), NULL, NULL, G_CALLBACK(scroll_prev_page_cb) },
610 {"View/Scroll/NextPage", NULL, N_("Next page"), NULL, NULL, G_CALLBACK(scroll_next_page_cb) },
612 /* {"View/---", NULL, "---", NULL, NULL, NULL }, */
613 {"View/Encoding", NULL, N_("Character _encoding"), NULL, NULL, NULL }, /* set_charset_cb */
614 {"View/Encoding/---", NULL, "---", NULL, NULL, NULL },
615 #define ENC_ACTION(cs_char,c_char,string) \
616 { "View/Encoding/" cs_char, NULL, N_(string), NULL, NULL, c_char }
618 {"View/Encoding/Western", NULL, N_("Western European"), NULL, NULL, NULL },
619 {"View/Encoding/Baltic", NULL, N_("Baltic"), NULL, NULL, NULL },
620 {"View/Encoding/Hebrew", NULL, N_("Hebrew"), NULL, NULL, NULL },
621 {"View/Encoding/Arabic", NULL, N_("Arabic"), NULL, NULL, NULL },
622 {"View/Encoding/Cyrillic", NULL, N_("Cyrillic"), NULL, NULL, NULL },
623 {"View/Encoding/Japanese", NULL, N_("Japanese"), NULL, NULL, NULL },
624 {"View/Encoding/Chinese", NULL, N_("Chinese"), NULL, NULL, NULL },
625 {"View/Encoding/Korean", NULL, N_("Korean"), NULL, NULL, NULL },
626 {"View/Encoding/Thai", NULL, N_("Thai"), NULL, NULL, NULL },
628 {"View/Decode", NULL, N_("Decode"), NULL, NULL, NULL }, /* set_decode_cb */
629 {"View/Decode/---", NULL, "---", NULL, NULL, NULL },
631 #define DEC_ACTION(cs_type,c_type,string) \
632 { "View/Decode/" cs_type, NULL, N_(string), NULL, NULL, c_type }
634 /* {"View/---", NULL, "---", NULL, NULL, NULL }, */
635 {"View/OpenNewWindow", NULL, N_("Open in new _window"), "<control><alt>N", NULL, G_CALLBACK(open_msg_cb) },
636 {"View/MessageSource", NULL, N_("Mess_age source"), "<control>U", NULL, G_CALLBACK(view_source_cb) },
637 /* {"View/---", NULL, "---", NULL, NULL, NULL }, */
638 {"View/Part", NULL, N_("Message part"), NULL, NULL, NULL },
639 {"View/Part/AsText", NULL, N_("View as text"), "T", NULL, G_CALLBACK(view_part_as_text_cb) },
640 {"View/Part/Open", NULL, N_("Open"), "L", NULL, G_CALLBACK(open_part_cb) },
641 #ifndef G_OS_WIN32
642 {"View/Part/OpenWith", NULL, N_("Open with..."), "O", NULL, G_CALLBACK(open_part_with_cb) },
643 #endif
644 /* {"View/---", NULL, "---", NULL, NULL, NULL }, */
646 {"View/Quotes", NULL, N_("Quotes"), NULL, NULL, NULL },
647 /* {"View/---", NULL, "---", NULL, NULL, NULL }, */
648 {"View/UpdateSummary", NULL, N_("_Update summary"), "<control><alt>U", NULL, G_CALLBACK(update_summary_cb) },
650 /* Message menu */
651 {"Message/Receive", NULL, N_("Recei_ve"), NULL, NULL, NULL },
652 {"Message/Receive/CurrentAccount", NULL, N_("Get from _current account"), "<control>I", NULL, G_CALLBACK(mw_inc_mail_cb) },
653 {"Message/Receive/AllAccounts", NULL, N_("Get from _all accounts"), "<shift><control>I", NULL, G_CALLBACK(mw_inc_all_account_mail_cb) },
654 {"Message/Receive/CancelReceiving", NULL, N_("Cancel receivin_g"), NULL, NULL, G_CALLBACK(inc_cancel_cb) },
655 {"Message/Receive/---", NULL, "---", NULL, NULL, NULL },
656 {"Message/Receive/PlaceHolder", NULL, "PlaceHolder,", NULL, NULL, G_CALLBACK(mainwindow_nothing_cb) },
657 {"Message/SendQueue", NULL, N_("_Send queued messages"), NULL, NULL, G_CALLBACK(mw_send_queue_cb) },
658 {"Message/CancelSending", NULL, N_("Cancel sending"), NULL, NULL, G_CALLBACK(send_cancel_cb) },
660 {"Message/---", NULL, "---", NULL, NULL, NULL },
662 {"Message/ComposeEmail", NULL, N_("Compose a_n email message"), "<control>M", NULL, G_CALLBACK(mw_compose_mail_cb) },
663 {"Message/ComposeNews", NULL, N_("Compose a news message"), NULL, NULL, G_CALLBACK(mw_compose_news_cb) },
665 {"Message/Reply", NULL, N_("_Reply"), "<control>R", NULL, G_CALLBACK(main_window_reply_cb) }, /* COMPOSE_REPLY */
666 {"Message/ReplyTo", NULL, N_("Repl_y to"), NULL, NULL, NULL },
667 {"Message/ReplyTo/All", NULL, N_("_All"), "<control><shift>R", NULL, G_CALLBACK(main_window_reply_cb) }, /* COMPOSE_REPLY_TO_ALL */
668 {"Message/ReplyTo/Sender", NULL, N_("_Sender"), NULL, NULL, G_CALLBACK(main_window_reply_cb) }, /* COMPOSE_REPLY_TO_SENDER */
669 {"Message/ReplyTo/List", NULL, N_("Mailing _list"), "<control>L", NULL, G_CALLBACK(main_window_reply_cb) }, /* COMPOSE_REPLY_TO_LIST */
670 {"Message/FollowupReply", NULL, N_("Follow-up and reply to"), NULL, NULL, G_CALLBACK(main_window_reply_cb) }, /* COMPOSE_FOLLOWUP_AND_REPLY_TO */
671 /* {"Message/---", NULL, "---", NULL, NULL, NULL }, */
673 {"Message/Forward", NULL, N_("_Forward"), "<control><alt>F", NULL, G_CALLBACK(main_window_reply_cb) }, /* COMPOSE_FORWARD_INLINE */
674 {"Message/ForwardAtt", NULL, N_("For_ward as attachment"), NULL, NULL, G_CALLBACK(main_window_reply_cb) }, /* COMPOSE_FORWARD_AS_ATTACH */
675 {"Message/Redirect", NULL, N_("Redirec_t"), NULL, NULL, G_CALLBACK(main_window_reply_cb) }, /* COMPOSE_REDIRECT */
677 {"Message/MailingList", NULL, N_("Mailing-_List"), NULL, NULL, NULL },
678 {"Message/MailingList/Post", NULL, N_("Post"), NULL, NULL, NULL },
679 {"Message/MailingList/Post/PlaceHolder", NULL, "Placeholder", NULL, NULL, G_CALLBACK(mainwindow_nothing_cb) },
680 {"Message/MailingList/Help", NULL, N_("Help"), NULL, NULL, NULL },
681 {"Message/MailingList/Help/PlaceHolder", NULL, "Placeholder", NULL, NULL, G_CALLBACK(mainwindow_nothing_cb) },
682 {"Message/MailingList/Subscribe", NULL, N_("Subscribe"), NULL, NULL, NULL },
683 {"Message/MailingList/Subscribe/PlaceHolder", NULL, "Placeholder", NULL, NULL, G_CALLBACK(mainwindow_nothing_cb) },
684 {"Message/MailingList/Unsubscribe", NULL, N_("Unsubscribe"), NULL, NULL, NULL },
685 {"Message/MailingList/Unsubscribe/PlaceHolder", NULL, "Placeholder", NULL, NULL, G_CALLBACK(mainwindow_nothing_cb) },
686 {"Message/MailingList/ViewArchive", NULL, N_("View archive"), NULL, NULL, NULL },
687 {"Message/MailingList/ViewArchive/PlaceHolder", NULL, "Placeholder", NULL, NULL, G_CALLBACK(mainwindow_nothing_cb) },
688 {"Message/MailingList/ContactOwner", NULL, N_("Contact owner"), NULL, NULL, NULL },
689 {"Message/MailingList/ContactOwner/PlaceHolder", NULL, "Placeholder", NULL, NULL, G_CALLBACK(mainwindow_nothing_cb) },
690 /* separation */
692 {"Message/Move", NULL, N_("M_ove..."), "<control>O", NULL, G_CALLBACK(move_to_cb) },
693 {"Message/Copy", NULL, N_("_Copy..."), "<shift><control>O", NULL, G_CALLBACK(copy_to_cb) },
694 {"Message/Trash", NULL, N_("Move to _trash"), "<control>D", NULL, G_CALLBACK(delete_trash_cb) },
695 {"Message/Delete", NULL, N_("_Delete..."), NULL, NULL, G_CALLBACK(delete_cb) },
696 {"Message/TrashThread", NULL, N_("Move thread to tr_ash"), NULL, NULL, G_CALLBACK(trash_thread_cb) },
697 {"Message/DeleteThread", NULL, N_("Delete t_hread"), NULL, NULL, G_CALLBACK(delete_thread_cb) },
698 {"Message/CancelNews", NULL, N_("Cancel a news message"), NULL, NULL, G_CALLBACK(cancel_cb) },
699 /* separation */
701 {"Message/Mark", NULL, N_("_Mark"), NULL, NULL, NULL },
702 {"Message/Mark/Mark", NULL, N_("_Mark"), "<shift>asterisk", NULL, G_CALLBACK(mark_cb) },
703 {"Message/Mark/Unmark", NULL, N_("_Unmark"), "U", NULL, G_CALLBACK(unmark_cb) },
704 {"Message/Mark/---", NULL, "---", NULL, NULL, NULL },
706 {"Message/Mark/MarkRead", NULL, N_("Mark as rea_d"), NULL, NULL, G_CALLBACK(mark_as_read_cb) },
707 {"Message/Mark/MarkUnread", NULL, N_("Mark as unr_ead"), "<shift>exclam", NULL, G_CALLBACK(mark_as_unread_cb) },
708 /* separation */
709 {"Message/Mark/MarkAllRead", NULL, N_("Mark all read in folder"), NULL, NULL, G_CALLBACK(mark_all_read_cb) },
710 {"Message/Mark/MarkAllUnread", NULL, N_("Mark all unread in folder"), NULL, NULL, G_CALLBACK(mark_all_unread_cb) },
711 /* separation */
712 {"Message/Mark/IgnoreThread", NULL, N_("Ignore thread"), NULL, NULL, G_CALLBACK(ignore_thread_cb) },
713 {"Message/Mark/UnignoreThread", NULL, N_("Unignore thread"), NULL, NULL, G_CALLBACK(unignore_thread_cb) },
714 {"Message/Mark/WatchThread", NULL, N_("Watch thread"), NULL, NULL, G_CALLBACK(watch_thread_cb) },
715 {"Message/Mark/UnwatchThread", NULL, N_("Unwatch thread"), NULL, NULL, G_CALLBACK(unwatch_thread_cb) },
716 /* separation */
718 {"Message/Mark/MarkSpam", NULL, N_("Mark as _spam"), NULL, NULL, G_CALLBACK(mark_as_spam_cb) },
719 {"Message/Mark/MarkHam", NULL, N_("Mark as _ham"), NULL, NULL, G_CALLBACK(mark_as_ham_cb) },
720 /* separation */
722 {"Message/Mark/Lock", NULL, N_("Lock"), NULL, NULL, G_CALLBACK(lock_msgs_cb) },
723 {"Message/Mark/Unlock", NULL, N_("Unlock"), NULL, NULL, G_CALLBACK(unlock_msgs_cb) },
725 {"Message/ColorLabel", NULL, N_("Color la_bel"), NULL, NULL, NULL },
726 {"Message/Tags", NULL, N_("Ta_gs"), NULL, NULL, NULL },
727 /*{"Message/---", NULL, "---", NULL, NULL, NULL },*/
729 {"Message/Reedit", NULL, N_("Re-_edit"), NULL, NULL, G_CALLBACK(reedit_cb) },
730 /*{"Message/---", NULL, "---", NULL, NULL, NULL },*/
732 {"Message/CheckSignature", NULL, N_("Check signature"), "C", NULL, G_CALLBACK(check_signature_cb) },
734 /* Tools menu */
736 {"Tools/AddressBook", NULL, N_("_Address book"), "<control><shift>A", NULL, G_CALLBACK(addressbook_open_cb) },
737 {"Tools/AddSenderToAB", NULL, N_("Add sender to address boo_k"), NULL, NULL, G_CALLBACK(add_address_cb) },
739 {"Tools/CollectAddresses", NULL, N_("C_ollect addresses"), NULL, NULL, NULL },
740 {"Tools/CollectAddresses/FromFolder", NULL, N_("From current _folder..."), NULL, NULL, G_CALLBACK(addr_harvest_cb) },
741 {"Tools/CollectAddresses/FromSelected", NULL, N_("From selected _messages..."), NULL, NULL, G_CALLBACK(addr_harvest_msg_cb) },
742 {"Tools/---", NULL, "---", NULL, NULL, NULL },
744 {"Tools/FilterFolder", NULL, N_("_Filter all messages in folder"), NULL, NULL, G_CALLBACK(filter_cb) },
745 {"Tools/FilterSelected", NULL, N_("Filter _selected messages"), NULL, NULL, G_CALLBACK(filter_list_cb) },
746 {"Tools/RunProcessing", NULL, N_("Run folder pr_ocessing rules"), NULL, NULL, G_CALLBACK(process_cb) },
748 {"Tools/CreateFilterRule", NULL, N_("_Create filter rule"), NULL, NULL, NULL },
749 {"Tools/CreateFilterRule/Automatically", NULL, N_("_Automatically"), NULL, NULL, G_CALLBACK(create_filter_cb) }, /* FILTER_BY_AUTO */
750 {"Tools/CreateFilterRule/ByFrom", NULL, N_("By _From"), NULL, NULL, G_CALLBACK(create_filter_cb) }, /* FILTER_BY_FROM */
751 {"Tools/CreateFilterRule/ByTo", NULL, N_("By _To"), NULL, NULL, G_CALLBACK(create_filter_cb) }, /* FILTER_BY_TO */
752 {"Tools/CreateFilterRule/BySubject", NULL, N_("By _Subject"), NULL, NULL, G_CALLBACK(create_filter_cb) }, /* FILTER_BY_SUBJECT */
753 {"Tools/CreateFilterRule/BySender", NULL, N_("By S_ender"), NULL, NULL, G_CALLBACK(create_filter_cb) }, /* FILTER_BY_SENDER */
755 {"Tools/CreateProcessingRule", NULL, N_("Create processing rule"), NULL, NULL, NULL },
756 {"Tools/CreateProcessingRule/Automatically", NULL, N_("_Automatically"), NULL, NULL, G_CALLBACK(create_processing_cb) },
757 {"Tools/CreateProcessingRule/ByFrom", NULL, N_("By _From"), NULL, NULL, G_CALLBACK(create_processing_cb) },
758 {"Tools/CreateProcessingRule/ByTo", NULL, N_("By _To"), NULL, NULL, G_CALLBACK(create_processing_cb) },
759 {"Tools/CreateProcessingRule/BySubject", NULL, N_("By _Subject"), NULL, NULL, G_CALLBACK(create_processing_cb) },
760 {"Tools/CreateProcessingRule/BySender", NULL, N_("By S_ender"), NULL, NULL, G_CALLBACK(create_processing_cb) },
761 /* {"Tools/---", NULL, "---", NULL, NULL, NULL }, */
763 {"Tools/ListUrls", NULL, N_("List _URLs..."), "<control><shift>U", NULL, G_CALLBACK(open_urls_cb) },
765 /* {"Tools/---", NULL, "---", NULL, NULL, NULL }, */
766 {"Tools/Actions", NULL, N_("Actio_ns"), NULL, NULL, NULL },
767 {"Tools/Actions/PlaceHolder", NULL, "Placeholder", NULL, NULL, G_CALLBACK(mainwindow_nothing_cb) },
768 /* {"Tools/---", NULL, "---", NULL, NULL, NULL }, */
770 {"Tools/CheckNewMessages", NULL, N_("Ch_eck for new messages in all folders"), NULL, NULL, G_CALLBACK(update_folderview_cb) },
771 {"Tools/DeleteDuplicates", NULL, N_("Delete du_plicated messages"), NULL, NULL, NULL },
772 {"Tools/DeleteDuplicates/SelFolder", NULL, N_("In selected folder"), NULL, NULL, G_CALLBACK(delete_duplicated_cb) },
773 {"Tools/DeleteDuplicates/AllFolders", NULL, N_("In all folders"), NULL, NULL, G_CALLBACK(delete_duplicated_all_cb) },
774 /* {"Tools/---", NULL, "---", NULL, NULL, NULL }, */
776 {"Tools/Execute", NULL, N_("E_xecute"), "X", NULL, G_CALLBACK(execute_summary_cb) },
777 {"Tools/Expunge", NULL, N_("Exp_unge"), "<control>E", NULL, G_CALLBACK(expunge_summary_cb) },
778 #ifdef USE_GNUTLS
779 /* {"Tools/---", NULL, "---", NULL, NULL, NULL }, */
780 {"Tools/TLSCertificates", NULL, N_("TLS cer_tificates"), NULL, NULL, G_CALLBACK(ssl_manager_open_cb) },
781 #endif
782 /* {"Tools/---", NULL, "---", NULL, NULL, NULL }, */
783 {"Tools/FilteringLog", NULL, N_("Filtering Lo_g"), NULL, NULL, G_CALLBACK(filtering_debug_window_show_cb) },
784 {"Tools/NetworkLog", NULL, N_("Network _Log"), "<shift><control>L", NULL, G_CALLBACK(log_window_show_cb) },
785 #ifdef G_OS_WIN32
786 {"Tools/DebugLog", NULL, N_("Debug _Log"), NULL, NULL, G_CALLBACK(debug_log_show_cb) },
787 #endif
788 /* {"Tools/---", NULL, "---", NULL, NULL, NULL }, */
789 {"Tools/ForgetSessionPasswords", NULL, N_("_Forget all session passwords"), NULL, NULL, G_CALLBACK(forget_session_passwords_cb) },
790 #ifndef PASSWORD_CRYPTO_OLD
791 {"Tools/ForgetPrimaryPassphrase", NULL, N_("Forget _primary passphrase"), NULL, NULL, G_CALLBACK(forget_primary_passphrase_cb) },
792 #endif
794 /* Configuration menu */
795 {"Configuration/ChangeAccount", NULL, N_("C_hange current account"), NULL, NULL, NULL },
796 {"Configuration/ChangeAccount/PlaceHolder", NULL, "Placeholder", NULL, NULL, G_CALLBACK(mainwindow_nothing_cb) },
797 {"Configuration/AccountPrefs", NULL, N_("_Preferences for current account..."), NULL, NULL, G_CALLBACK(prefs_account_open_cb) },
798 {"Configuration/CreateAccount", NULL, N_("Create _new account..."), NULL, NULL, G_CALLBACK(new_account_cb) },
799 {"Configuration/EditAccounts", NULL, N_("_Edit accounts..."), NULL, NULL, G_CALLBACK(account_edit_open) },
800 {"Configuration/---", NULL, "---", NULL, NULL, NULL },
802 {"Configuration/Preferences", NULL, N_("P_references..."), NULL, NULL, G_CALLBACK(prefs_open_cb) },
803 {"Configuration/PreProcessing", NULL, N_("Pre-pr_ocessing..."), NULL, NULL, G_CALLBACK(prefs_pre_processing_open_cb) },
804 {"Configuration/PostProcessing", NULL, N_("Post-pro_cessing..."), NULL, NULL, G_CALLBACK(prefs_post_processing_open_cb) },
805 {"Configuration/Filtering", NULL, N_("_Filtering..."), NULL, NULL, G_CALLBACK(prefs_filtering_open_cb) },
806 {"Configuration/Templates", NULL, N_("_Templates..."), NULL, NULL, G_CALLBACK(prefs_template_open_cb) },
807 {"Configuration/Actions", NULL, N_("_Actions..."), NULL, NULL, G_CALLBACK(prefs_actions_open_cb) },
808 {"Configuration/Tags", NULL, N_("Tag_s..."), NULL, NULL, G_CALLBACK(prefs_tags_open_cb) },
809 /* {"Configuration/---", NULL, "---", NULL, NULL, NULL }, */
810 {"Configuration/Plugins", NULL, N_("Plu_gins..."), NULL, NULL, G_CALLBACK(plugins_open_cb) },
812 /* Help menu */
813 {"Help/Manual", NULL, N_("_Manual"), NULL, NULL, G_CALLBACK(manual_open_cb) },
814 {"Help/FAQ", NULL, N_("_Online User-contributed FAQ"), NULL, NULL, G_CALLBACK(manual_faq_open_cb) },
815 {"Help/IconLegend", NULL, N_("Icon _Legend"), NULL, NULL, G_CALLBACK(legend_open_cb) },
816 #ifdef G_OS_WIN32
817 {"Help/SetDefault", NULL, N_("Set as default client"), NULL, NULL, G_CALLBACK(set_default_client_cb) },
818 #endif
819 {"Help/---", NULL, "---", NULL, NULL, NULL },
820 {"Help/About", NULL, N_("_About"), NULL, NULL, G_CALLBACK(about_cb) },
823 static GtkToggleActionEntry mainwin_toggle_entries[] = {
824 {"File/OfflineMode", NULL, N_("Offline _mode"), "<control>W", NULL, G_CALLBACK(toggle_work_offline_cb), FALSE }, /*toggle*/
825 {"View/ShowHide/MenuBar", NULL, N_("Men_ubar"), "<control>F12", NULL, G_CALLBACK(toggle_menubar_cb), FALSE }, /* toggle */
826 {"View/ShowHide/MessageView", NULL, N_("_Message view"), "V", NULL, G_CALLBACK(toggle_message_cb), FALSE }, /* toggle */
827 #ifndef GENERIC_UMPC
828 {"View/ShowHide/StatusBar", NULL, N_("Status _bar"), NULL, NULL, G_CALLBACK(toggle_statusbar_cb), FALSE }, /* toggle */
829 #endif
830 {"View/ShowHide/ColumnHeaders", NULL, N_("Column headers"), NULL, NULL, G_CALLBACK(toggle_col_headers_cb), FALSE }, /* toggle */
831 {"View/ThreadView", NULL, N_("Th_read view"), "<control>T", NULL, G_CALLBACK(thread_cb), FALSE }, /* toggle */
832 {"View/HideReadThreads", NULL, N_("Hide read threads"), NULL, NULL, G_CALLBACK(hide_read_threads), FALSE }, /* toggle */
833 {"View/HideReadMessages", NULL, N_("_Hide read messages"), NULL, NULL, G_CALLBACK(hide_read_messages), FALSE }, /* toggle */
834 {"View/HideDelMessages", NULL, N_("Hide deleted messages"), NULL, NULL, G_CALLBACK(hide_del_messages), FALSE }, /* toggle */
835 {"View/FullScreen", NULL, N_("_Fullscreen"), "F11", NULL, G_CALLBACK(toggle_fullscreen_cb), FALSE }, /* toggle */
836 {"View/AllHeaders", NULL, N_("Show all _headers"), "<control>H", NULL, G_CALLBACK(show_all_header_cb), FALSE }, /* toggle */
837 {"View/Quotes/CollapseAll", NULL, N_("_Collapse all"), "<control><shift>Q", NULL, G_CALLBACK(hide_quotes_cb), FALSE }, /* 1 toggle */
838 {"View/Quotes/Collapse2", NULL, N_("Collapse from level _2"), NULL, NULL, G_CALLBACK(hide_quotes_cb), FALSE }, /* 2 toggle */
839 {"View/Quotes/Collapse3", NULL, N_("Collapse from level _3"), NULL, NULL, G_CALLBACK(hide_quotes_cb), FALSE }, /* 3 toggle */
842 static GtkRadioActionEntry mainwin_showhide_radio_entries[] = { /* toggle_toolbar_cb */
843 {"View/ShowHide/Toolbar/TextBelowIcon", NULL, N_("Text _below icons"), NULL, NULL, TOOLBAR_BOTH }, /* radio TOOLBAR_BOTH */
844 {"View/ShowHide/Toolbar/TextBesideIcon", NULL, N_("Text be_side icons"), NULL, NULL, TOOLBAR_BOTH_HORIZ }, /* radio TOOLBAR_BOTH_HORIZ */
845 {"View/ShowHide/Toolbar/IconOnly", NULL, N_("_Icons only"), NULL, NULL, TOOLBAR_ICON }, /* radio TOOLBAR_ICON */
846 {"View/ShowHide/Toolbar/TextOnly", NULL, N_("_Text only"), NULL, NULL, TOOLBAR_TEXT }, /* radio TOOLBAR_TEXT */
847 #ifndef GENERIC_UMPC
848 {"View/ShowHide/Toolbar/Hide", NULL, N_("_Hide"), NULL, NULL, TOOLBAR_NONE }, /* radio TOOLBAR_NONE */
849 #endif
851 #ifndef GENERIC_UMPC
852 static GtkRadioActionEntry mainwin_layout_radio_entries[] = { /* set_layout_cb */
853 {"View/Layout/Standard", NULL, N_("_Standard"), NULL, NULL, NORMAL_LAYOUT }, /* radio NORMAL_LAYOUT */
854 {"View/Layout/ThreeColumns", NULL, N_("_Three columns"), NULL, NULL, VERTICAL_LAYOUT }, /* radio VERTICAL_LAYOUT */
855 {"View/Layout/WideMessage", NULL, N_("_Wide message"), NULL, NULL, WIDE_LAYOUT }, /* radio WIDE_LAYOUT */
856 {"View/Layout/WideMessageList", NULL, N_("W_ide message list"), NULL, NULL, WIDE_MSGLIST_LAYOUT }, /* radio WIDE_MSGLIST_LAYOUT */
857 {"View/Layout/SmallScreen", NULL, N_("S_mall screen"), NULL, NULL, SMALL_LAYOUT }, /* radio SMALL_LAYOUT */
859 #endif
860 static GtkRadioActionEntry mainwin_sort_radio_entries[] = { /* sort_summary_cb */
861 {"View/Sort/Number", NULL, N_("By _number"), NULL, NULL, SORT_BY_NUMBER }, /* radio SORT_BY_NUMBER */
862 {"View/Sort/Size", NULL, N_("By s_ize"), NULL, NULL, SORT_BY_SIZE }, /* radio SORT_BY_SIZE */
863 {"View/Sort/Date", NULL, N_("By _date"), NULL, NULL, SORT_BY_DATE }, /* radio SORT_BY_DATE */
864 {"View/Sort/ThreadDate", NULL, N_("By thread date"), NULL, NULL, SORT_BY_THREAD_DATE }, /* radio SORT_BY_THREAD_DATE */
865 {"View/Sort/From", NULL, N_("By _From"), NULL, NULL, SORT_BY_FROM }, /* radio SORT_BY_FROM */
866 {"View/Sort/To", NULL, N_("By _To"), NULL, NULL, SORT_BY_TO }, /* radio SORT_BY_TO */
867 {"View/Sort/Subject", NULL, N_("By s_ubject"), NULL, NULL, SORT_BY_SUBJECT }, /* radio SORT_BY_SUBJECT */
868 {"View/Sort/Color", NULL, N_("By _color label"), NULL, NULL, SORT_BY_LABEL }, /* radio SORT_BY_LABEL */
869 {"View/Sort/Tag", NULL, N_("By tag"), NULL, NULL, SORT_BY_TAGS }, /* radio SORT_BY_TAGS */
870 {"View/Sort/Mark", NULL, N_("By _mark"), NULL, NULL, SORT_BY_MARK }, /* radio SORT_BY_MARK */
871 {"View/Sort/Status", NULL, N_("By _status"), NULL, NULL, SORT_BY_STATUS }, /* radio SORT_BY_STATUS */
872 {"View/Sort/Attachment", NULL, N_("By a_ttachment"), NULL, NULL, SORT_BY_MIME }, /* radio SORT_BY_MIME */
873 {"View/Sort/Score", NULL, N_("By score"), NULL, NULL, SORT_BY_SCORE }, /* radio SORT_BY_SCORE */
874 {"View/Sort/Locked", NULL, N_("By locked"), NULL, NULL, SORT_BY_LOCKED }, /* radio SORT_BY_LOCKED */
875 {"View/Sort/DontSort", NULL, N_("D_on't sort"), NULL, NULL, SORT_BY_NONE }, /* radio SORT_BY_NONE */
878 static GtkRadioActionEntry mainwin_sorttype_radio_entries[] = { /* sort_summary_type_cb */
879 {"View/Sort/Ascending", NULL, N_("Ascending"), NULL, NULL, SORT_ASCENDING }, /* radio SORT_ASCENDING */
880 {"View/Sort/Descending", NULL, N_("Descending"), NULL, NULL, SORT_DESCENDING }, /* radio SORT_DESCENDING */
883 static GtkRadioActionEntry mainwin_radio_enc_entries[] =
885 ENC_ACTION(CS_AUTO, C_AUTO, N_("_Automatic")), /* RADIO set_charset_cb */
886 ENC_ACTION(CS_US_ASCII, C_US_ASCII, N_("7bit ASCII (US-ASC_II)")), /* RADIO set_charset_cb */
887 ENC_ACTION(CS_UTF_8, C_UTF_8, N_("Unicode (_UTF-8)")), /* RADIO set_charset_cb */
888 ENC_ACTION("Western/"CS_ISO_8859_1, C_ISO_8859_1, "ISO-8859-_1"), /* RADIO set_charset_cb */
889 ENC_ACTION("Western/"CS_ISO_8859_15, C_ISO_8859_15, "ISO-8859-15"), /* RADIO set_charset_cb */
890 ENC_ACTION("Western/"CS_WINDOWS_1252, C_WINDOWS_1252, "Windows-1252"), /* RADIO set_charset_cb */
891 ENC_ACTION(CS_ISO_8859_2, C_ISO_8859_2, N_("Central European (ISO-8859-_2)")), /* RADIO set_charset_cb */
892 ENC_ACTION("Baltic/"CS_ISO_8859_13, C_ISO_8859_13, "ISO-8859-13"), /* RADIO set_charset_cb */
893 ENC_ACTION("Baltic/"CS_ISO_8859_4, C_ISO_8859_14, "ISO-8859-_4"), /* RADIO set_charset_cb */
894 ENC_ACTION(CS_ISO_8859_7, C_ISO_8859_7, N_("Greek (ISO-8859-_7)")), /* RADIO set_charset_cb */
895 ENC_ACTION("Hebrew/"CS_ISO_8859_8, C_ISO_8859_8, "ISO-8859-_8"), /* RADIO set_charset_cb */
896 ENC_ACTION("Hebrew/"CS_WINDOWS_1255, C_WINDOWS_1255, "Windows-1255"), /* RADIO set_charset_cb */
897 ENC_ACTION("Arabic/"CS_ISO_8859_6, C_ISO_8859_6, "ISO-8859-_6"), /* RADIO set_charset_cb */
898 ENC_ACTION("Arabic/"CS_WINDOWS_1256, C_WINDOWS_1256, "Windows-1256"), /* RADIO set_charset_cb */
899 ENC_ACTION(CS_ISO_8859_9, C_ISO_8859_9, N_("Turkish (ISO-8859-_9)")), /* RADIO set_charset_cb */
900 ENC_ACTION("Cyrillic/"CS_ISO_8859_5, C_ISO_8859_5, "ISO-8859-_5"), /* RADIO set_charset_cb */
901 ENC_ACTION("Cyrillic/"CS_KOI8_R, C_KOI8_R, "KOI8-_R"), /* RADIO set_charset_cb */
902 ENC_ACTION("Cyrillic/"CS_MACCYR, C_MACCYR, "_Mac-Cyrillic"), /* RADIO set_charset_cb */
903 ENC_ACTION("Cyrillic/"CS_KOI8_U, C_KOI8_U, "KOI8-_U"), /* RADIO set_charset_cb */
904 ENC_ACTION("Cyrillic/"CS_WINDOWS_1251, C_WINDOWS_1251, "Windows-1251"), /* RADIO set_charset_cb */
905 ENC_ACTION("Japanese/"CS_ISO_2022_JP, C_ISO_2022_JP, "ISO-2022-_JP"), /* RADIO set_charset_cb */
906 ENC_ACTION("Japanese/"CS_ISO_2022_JP_2, C_ISO_2022_JP_2, "ISO-2022-JP-_2"), /* RADIO set_charset_cb */
907 ENC_ACTION("Japanese/"CS_EUC_JP, C_EUC_JP, "_EUC-JP"), /* RADIO set_charset_cb */
908 ENC_ACTION("Japanese/"CS_SHIFT_JIS, C_SHIFT_JIS, "_Shift-JIS"), /* RADIO set_charset_cb */
909 ENC_ACTION("Chinese/"CS_GB18030, C_GB18030, "_GB18030"), /* RADIO set_charset_cb */
910 ENC_ACTION("Chinese/"CS_GB2312, C_GB2312, "_GB2312"), /* RADIO set_charset_cb */
911 ENC_ACTION("Chinese/"CS_GBK, C_GBK, "GB_K"), /* RADIO set_charset_cb */
912 ENC_ACTION("Chinese/"CS_BIG5, C_BIG5, "_Big5-JP"), /* RADIO set_charset_cb */
913 ENC_ACTION("Chinese/"CS_EUC_TW, C_EUC_TW, "EUC-_TW"), /* RADIO set_charset_cb */
914 ENC_ACTION("Korean/"CS_EUC_KR, C_EUC_KR, "_EUC-KR"), /* RADIO set_charset_cb */
915 ENC_ACTION("Korean/"CS_ISO_2022_KR, C_ISO_2022_KR, "_ISO-2022-KR"), /* RADIO set_charset_cb */
916 ENC_ACTION("Thai/"CS_TIS_620, C_TIS_620, "_TIS-620-KR"), /* RADIO set_charset_cb */
917 ENC_ACTION("Thai/"CS_WINDOWS_874, C_WINDOWS_874, "_Windows-874"), /* RADIO set_charset_cb */
920 static GtkRadioActionEntry mainwin_radio_dec_entries[] =
922 DEC_ACTION("AutoDetect", 0, N_("_Auto detect")), /* set_decode_cb */
923 /* --- */
924 DEC_ACTION("8bit", ENC_8BIT, "_8bit"),
925 DEC_ACTION("QP", ENC_QUOTED_PRINTABLE, "_Quoted printable"),
926 DEC_ACTION("B64", ENC_BASE64, "_Base64"),
927 DEC_ACTION("Uuencode", ENC_X_UUENCODE, "_Uuencode"),
930 static gboolean offline_ask_sync = TRUE;
931 static gboolean is_obscured = FALSE;
933 #define N_COLOR_LABELS colorlabel_get_color_count()
935 static void mainwindow_colorlabel_menu_item_activate_item_cb(GtkMenuItem *menu_item,
936 gpointer data)
938 MainWindow *mainwin;
939 GtkMenuShell *menu;
940 GtkCheckMenuItem **items;
941 gint n;
942 GList *children, *cur;
943 GSList *sel;
945 mainwin = (MainWindow *)data;
946 cm_return_if_fail(mainwin != NULL);
948 sel = summary_get_selection(mainwin->summaryview);
949 if (!sel) return;
951 menu = GTK_MENU_SHELL(mainwin->colorlabel_menu);
952 cm_return_if_fail(menu != NULL);
954 Xalloca(items, (N_COLOR_LABELS + 1) * sizeof(GtkWidget *), return);
956 /* NOTE: don't return prematurely because we set the "dont_toggle"
957 * state for check menu items. This would be bad! */
958 g_object_set_data(G_OBJECT(menu), "dont_toggle",
959 GINT_TO_POINTER(1));
961 /* clear items. get item pointers. */
962 children = gtk_container_get_children(GTK_CONTAINER(menu));
963 for (n = 0, cur = children; cur != NULL && cur->data != NULL; cur = cur->next) {
964 if (GTK_IS_CHECK_MENU_ITEM(cur->data)) {
965 gtk_check_menu_item_set_active
966 (GTK_CHECK_MENU_ITEM(cur->data), FALSE);
967 items[n] = GTK_CHECK_MENU_ITEM(cur->data);
968 n++;
972 g_list_free(children);
974 if (n == (N_COLOR_LABELS + 1)) {
975 /* iterate all messages and set the state of the appropriate
976 * items */
977 for (; sel != NULL; sel = sel->next) {
978 MsgInfo *msginfo;
979 gint clabel;
981 msginfo = (MsgInfo *)sel->data;
982 if (msginfo) {
983 clabel = MSG_GET_COLORLABEL_VALUE(msginfo->flags);
984 if (!gtk_check_menu_item_get_active(items[clabel]))
985 gtk_check_menu_item_set_active
986 (items[clabel], TRUE);
989 } else
990 g_warning("invalid number of color elements (%d)", n);
992 g_slist_free(sel);
993 /* reset "dont_toggle" state */
994 g_object_set_data(G_OBJECT(menu), "dont_toggle",
995 GINT_TO_POINTER(0));
998 static void mainwindow_colorlabel_menu_item_activate_cb(GtkWidget *widget,
999 gpointer data)
1001 guint color = GPOINTER_TO_UINT(data);
1002 MainWindow *mainwin;
1004 mainwin = g_object_get_data(G_OBJECT(widget), "mainwin");
1005 cm_return_if_fail(mainwin != NULL);
1007 /* "dont_toggle" state set? */
1008 if (g_object_get_data(G_OBJECT(mainwin->colorlabel_menu),
1009 "dont_toggle"))
1010 return;
1012 summary_set_colorlabel(mainwin->summaryview, color, NULL);
1015 static void mainwindow_tags_menu_item_activate_item_cb(GtkMenuItem *menu_item,
1016 gpointer data)
1018 MainWindow *mainwin;
1019 GtkMenuShell *menu;
1020 GList *children, *cur;
1021 GSList *sel;
1022 GHashTable *menu_table = g_hash_table_new_full(
1023 g_direct_hash,
1024 g_direct_equal,
1025 NULL, NULL);
1026 GHashTable *menu_allsel_table = g_hash_table_new_full(
1027 g_direct_hash,
1028 g_direct_equal,
1029 NULL, NULL);
1030 gint sel_len;
1031 mainwin = (MainWindow *)data;
1032 cm_return_if_fail(mainwin != NULL);
1034 sel = summary_get_selection(mainwin->summaryview);
1035 if (!sel) return;
1037 menu = GTK_MENU_SHELL(mainwin->tags_menu);
1038 cm_return_if_fail(menu != NULL);
1040 /* NOTE: don't return prematurely because we set the "dont_toggle"
1041 * state for check menu items */
1042 g_object_set_data(G_OBJECT(menu), "dont_toggle",
1043 GINT_TO_POINTER(1));
1045 /* clear items. get item pointers. */
1046 children = gtk_container_get_children(GTK_CONTAINER(menu));
1047 for (cur = children; cur != NULL && cur->data != NULL; cur = cur->next) {
1048 if (GTK_IS_CHECK_MENU_ITEM(cur->data)) {
1049 gint id = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(cur->data),
1050 "tag_id"));
1051 gtk_check_menu_item_set_active
1052 (GTK_CHECK_MENU_ITEM(cur->data), FALSE);
1054 g_hash_table_insert(menu_table, GINT_TO_POINTER(id), GTK_CHECK_MENU_ITEM(cur->data));
1055 g_hash_table_insert(menu_allsel_table, GINT_TO_POINTER(id), GINT_TO_POINTER(0));
1059 g_list_free(children);
1061 /* iterate all messages and set the state of the appropriate
1062 * items */
1063 sel_len = 0;
1064 for (; sel != NULL; sel = sel->next) {
1065 MsgInfo *msginfo;
1066 GSList *tags = NULL;
1067 GtkCheckMenuItem *item;
1068 msginfo = (MsgInfo *)sel->data;
1069 sel_len++;
1070 if (msginfo) {
1071 tags = msginfo->tags;
1072 if (!tags)
1073 continue;
1075 for (; tags; tags = tags->next) {
1076 gint num_checked = GPOINTER_TO_INT(g_hash_table_lookup(menu_allsel_table, tags->data));
1077 item = g_hash_table_lookup(menu_table, GINT_TO_POINTER(tags->data));
1078 if (item && !gtk_check_menu_item_get_active(item)) {
1079 gtk_check_menu_item_set_active
1080 (item, TRUE);
1082 num_checked++;
1083 g_hash_table_replace(menu_allsel_table, tags->data, GINT_TO_POINTER(num_checked));
1088 children = gtk_container_get_children(GTK_CONTAINER(menu));
1089 for (cur = children; cur != NULL && cur->data != NULL; cur = cur->next) {
1090 if (GTK_IS_CHECK_MENU_ITEM(cur->data)) {
1091 gint id = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(cur->data),
1092 "tag_id"));
1093 gint num_checked = GPOINTER_TO_INT(g_hash_table_lookup(menu_allsel_table, GINT_TO_POINTER(id)));
1094 if (num_checked < sel_len && num_checked > 0)
1095 gtk_check_menu_item_set_inconsistent(GTK_CHECK_MENU_ITEM(cur->data), TRUE);
1096 else
1097 gtk_check_menu_item_set_inconsistent(GTK_CHECK_MENU_ITEM(cur->data), FALSE);
1100 g_list_free(children);
1101 g_slist_free(sel);
1102 g_hash_table_destroy(menu_table);
1103 g_hash_table_destroy(menu_allsel_table);
1104 /* reset "dont_toggle" state */
1105 g_object_set_data(G_OBJECT(menu), "dont_toggle",
1106 GINT_TO_POINTER(0));
1109 static void mainwindow_tags_menu_item_activate_cb(GtkWidget *widget,
1110 gpointer data)
1112 gint id = GPOINTER_TO_INT(data);
1113 gboolean set = gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(widget));
1114 MainWindow *mainwin;
1116 mainwin = g_object_get_data(G_OBJECT(widget), "mainwin");
1117 cm_return_if_fail(mainwin != NULL);
1119 /* "dont_toggle" state set? */
1120 if (g_object_get_data(G_OBJECT(mainwin->tags_menu),
1121 "dont_toggle"))
1122 return;
1124 if (!set)
1125 id = -id;
1126 summary_set_tag(mainwin->summaryview, id, NULL);
1129 void mainwin_accel_changed_cb (GtkAccelGroup *accelgroup, guint keyval, GdkModifierType modifier,
1130 GClosure *closure, GtkMenuItem *item)
1132 GList *closures = gtk_widget_list_accel_closures(GTK_WIDGET(item));
1133 GList *cur;
1134 for (cur = closures; cur; cur = cur->next) {
1135 if (closure == cur->data) {
1136 GtkLabel *label = g_object_get_data(G_OBJECT(item), "accel_label");
1137 gchar *new_accel;
1139 if (keyval == GDK_KEY_Delete) {
1140 const gchar *accel_path;
1141 accel_path = gtk_menu_item_get_accel_path(item);
1142 keyval = 0; modifier = 0;
1143 gtk_accel_map_change_entry (accel_path, keyval, modifier, TRUE);
1145 new_accel = gtk_accelerator_get_label(keyval, modifier);
1146 gtk_label_set_text(label, new_accel);
1147 g_free(new_accel);
1150 g_list_free(closures);
1153 static void mainwindow_colorlabel_menu_create(MainWindow *mainwin, gboolean refresh)
1155 GtkWidget *label_menuitem;
1156 GtkWidget *menu;
1157 GtkWidget *item;
1158 gint i;
1159 gchar *accel_path = NULL;
1161 label_menuitem = gtk_ui_manager_get_widget(mainwin->ui_manager, "/Menu/Message/ColorLabel");
1162 g_signal_connect(G_OBJECT(label_menuitem), "activate",
1163 G_CALLBACK(mainwindow_colorlabel_menu_item_activate_item_cb),
1164 mainwin);
1165 gtk_widget_show(label_menuitem);
1167 menu = gtk_menu_new();
1168 gtk_menu_set_accel_group (GTK_MENU (menu),
1169 gtk_ui_manager_get_accel_group(mainwin->ui_manager));
1171 /* create sub items. for the menu item activation callback we pass the
1172 * index of label_colors[] as data parameter. for the None color we
1173 * pass an invalid (high) value. also we attach a data pointer so we
1174 * can always get back the Mainwindow pointer. */
1176 item = gtk_check_menu_item_new_with_label(_("None"));
1177 gtk_menu_shell_append(GTK_MENU_SHELL(menu), item);
1178 g_signal_connect(G_OBJECT(item), "activate",
1179 G_CALLBACK(mainwindow_colorlabel_menu_item_activate_cb),
1180 GUINT_TO_POINTER(0));
1181 g_object_set_data(G_OBJECT(item), "mainwin", mainwin);
1182 gtk_widget_show(item);
1184 accel_path = g_strdup_printf("<ClawsColorLabels>/None");
1185 gtk_menu_item_set_accel_path(GTK_MENU_ITEM(item), accel_path);
1186 g_free(accel_path);
1187 gtk_accel_map_add_entry("<ClawsColorLabels>/None", GDK_KEY_0, GDK_CONTROL_MASK);
1189 /* create pixmap/label menu items */
1190 for (i = 0; i < N_COLOR_LABELS; i++) {
1191 item = colorlabel_create_check_color_menu_item(
1192 i, refresh, MAINWIN_COLORMENU);
1193 gtk_menu_shell_append(GTK_MENU_SHELL(menu), item);
1194 g_signal_connect(G_OBJECT(item), "activate",
1195 G_CALLBACK(mainwindow_colorlabel_menu_item_activate_cb),
1196 GUINT_TO_POINTER(i + 1));
1197 g_object_set_data(G_OBJECT(item), "mainwin",
1198 mainwin);
1199 gtk_widget_show(item);
1200 accel_path = g_strdup_printf("<ClawsColorLabels>/%d", i+1);
1201 gtk_menu_item_set_accel_path(GTK_MENU_ITEM(item), accel_path);
1202 if (i < 9)
1203 gtk_accel_map_add_entry(accel_path, GDK_KEY_1+i, GDK_CONTROL_MASK);
1204 g_free(accel_path);
1205 g_signal_connect (gtk_ui_manager_get_accel_group(mainwin->ui_manager),
1206 "accel-changed", G_CALLBACK (mainwin_accel_changed_cb), item);
1210 gtk_widget_show(menu);
1211 gtk_menu_item_set_submenu(GTK_MENU_ITEM(label_menuitem), menu);
1212 mainwin->colorlabel_menu = menu;
1215 static void mainwindow_tags_menu_item_apply_tags_activate_cb(GtkWidget *widget,
1216 gpointer data)
1218 MainWindow *mainwin;
1220 mainwin = g_object_get_data(G_OBJECT(widget), "mainwin");
1221 cm_return_if_fail(mainwin != NULL);
1223 /* "dont_toggle" state set? */
1224 if (g_object_get_data(G_OBJECT(mainwin->tags_menu),
1225 "dont_toggle"))
1226 return;
1228 tags_window_open(summary_get_selection(mainwin->summaryview));
1231 static gint mainwin_tag_cmp_list(gconstpointer a, gconstpointer b)
1233 gint id_a = GPOINTER_TO_INT(a);
1234 gint id_b = GPOINTER_TO_INT(b);
1235 const gchar *tag_a = tags_get_tag(id_a);
1236 const gchar *tag_b = tags_get_tag(id_b);
1239 if (tag_a == NULL)
1240 return tag_b == NULL ? 0:1;
1242 if (tag_b == NULL)
1243 return 1;
1245 return g_utf8_collate(tag_a, tag_b);
1248 static void mainwindow_tags_menu_create(MainWindow *mainwin, gboolean refresh)
1250 GtkWidget *label_menuitem;
1251 GtkWidget *menu;
1252 GtkWidget *item;
1253 GSList *cur = tags_get_list();
1254 GSList *orig = NULL;
1255 gboolean existing_tags = FALSE;
1256 gchar *accel_path;
1257 cur = orig = g_slist_sort(cur, mainwin_tag_cmp_list);
1259 label_menuitem = gtk_ui_manager_get_widget(mainwin->ui_manager, "/Menu/Message/Tags");
1260 g_signal_connect(G_OBJECT(label_menuitem), "activate",
1261 G_CALLBACK(mainwindow_tags_menu_item_activate_item_cb),
1262 mainwin);
1264 gtk_widget_show(label_menuitem);
1266 menu = gtk_menu_new();
1267 gtk_menu_set_accel_group (GTK_MENU (menu),
1268 gtk_ui_manager_get_accel_group(mainwin->ui_manager));
1270 /* create tags menu items */
1271 for (; cur; cur = cur->next) {
1272 gint id = GPOINTER_TO_INT(cur->data);
1273 const gchar *tag = tags_get_tag(id);
1275 item = gtk_check_menu_item_new_with_label(tag);
1276 gtk_menu_shell_append(GTK_MENU_SHELL(menu), item);
1277 g_signal_connect(G_OBJECT(item), "activate",
1278 G_CALLBACK(mainwindow_tags_menu_item_activate_cb),
1279 GINT_TO_POINTER(id));
1280 g_object_set_data(G_OBJECT(item), "mainwin",
1281 mainwin);
1282 g_object_set_data(G_OBJECT(item), "tag_id",
1283 GINT_TO_POINTER(id));
1284 gtk_widget_show(item);
1285 accel_path = g_strconcat("<ClawsTags>/",tag, NULL);
1286 gtk_menu_item_set_accel_path(GTK_MENU_ITEM(item), accel_path);
1287 g_free(accel_path);
1288 existing_tags = TRUE;
1290 if (existing_tags) {
1291 /* separator */
1292 item = gtk_separator_menu_item_new();
1293 gtk_menu_shell_append(GTK_MENU_SHELL(menu), item);
1294 gtk_widget_show(item);
1297 item = gtk_menu_item_new_with_label(_("Modify tags..."));
1298 gtk_menu_shell_append(GTK_MENU_SHELL(menu), item);
1299 g_signal_connect(G_OBJECT(item), "activate",
1300 G_CALLBACK(mainwindow_tags_menu_item_apply_tags_activate_cb),
1301 NULL);
1302 g_object_set_data(G_OBJECT(item), "mainwin",
1303 mainwin);
1304 gtk_widget_show(item);
1305 accel_path = g_strdup_printf("<ClawsTags>/ModifyTags");
1306 gtk_menu_item_set_accel_path(GTK_MENU_ITEM(item), accel_path);
1307 g_free(accel_path);
1308 gtk_accel_map_add_entry("<ClawsTags>/ModifyTags", GDK_KEY_T, GDK_CONTROL_MASK|GDK_SHIFT_MASK);
1309 g_slist_free(orig);
1310 gtk_widget_show(menu);
1311 gtk_menu_item_set_submenu(GTK_MENU_ITEM(label_menuitem), menu);
1312 mainwin->tags_menu = menu;
1314 #ifndef GENERIC_UMPC
1315 static void warning_btn_pressed(GtkButton *btn, gpointer data)
1317 MainWindow *mainwin = (MainWindow *)data;
1319 log_window_show_error(mainwin->logwin);
1320 gtk_widget_hide(mainwin->warning_btn);
1323 static gboolean warning_visi_notify(GtkWidget *widget,
1324 GdkEventVisibility *event,
1325 MainWindow *mainwindow)
1327 gdk_window_set_cursor(gtk_widget_get_window(mainwindow->warning_btn), hand_cursor);
1328 return FALSE;
1331 static gboolean warning_leave_notify(GtkWidget *widget,
1332 GdkEventCrossing *event,
1333 MainWindow *mainwindow)
1335 gdk_window_set_cursor(gtk_widget_get_window(mainwindow->warning_btn), NULL);
1336 return FALSE;
1339 static gboolean warning_enter_notify(GtkWidget *widget,
1340 GdkEventCrossing *event,
1341 MainWindow *mainwindow)
1343 gdk_window_set_cursor(gtk_widget_get_window(mainwindow->warning_btn), hand_cursor);
1344 return FALSE;
1346 #endif
1347 void mainwindow_show_error(void)
1349 MainWindow *mainwin = mainwindow_get_mainwindow();
1350 gtk_widget_show(mainwin->warning_btn);
1353 void mainwindow_clear_error(MainWindow *mainwin)
1355 gtk_widget_hide(mainwin->warning_btn);
1358 #define BREAK_ON_MODIFIER_KEY() \
1359 if ((event->state & (GDK_MOD1_MASK|GDK_CONTROL_MASK)) != 0) break
1361 static gboolean mainwindow_key_pressed (GtkWidget *widget, GdkEventKey *event,
1362 gpointer data)
1364 MainWindow *mainwin = (MainWindow*) data;
1366 if (!mainwin || !event)
1367 return FALSE;
1369 if (quicksearch_has_focus(mainwin->summaryview->quicksearch))
1371 GtkWidget *entry =
1372 quicksearch_get_entry(mainwin->summaryview->quicksearch);
1373 gboolean handled;
1374 g_signal_emit_by_name(entry, "key-press-event", event, &handled);
1375 if (handled) {
1376 return TRUE;
1380 switch (event->keyval) {
1381 case GDK_KEY_Q: /* Quit */
1382 BREAK_ON_MODIFIER_KEY();
1384 if (gtk_window_is_active(GTK_WINDOW(mainwin->window))) {
1385 app_exit_cb(NULL, mainwin);
1387 return FALSE;
1388 case GDK_KEY_space:
1389 BREAK_ON_MODIFIER_KEY();
1390 if (gtk_window_is_active(GTK_WINDOW(mainwin->window))) {
1391 if (mainwin->folderview != NULL && mainwin->summaryview != NULL
1392 && ((!mainwin->summaryview->displayed
1393 && !mainwin->summaryview->selected)
1394 || (mainwin->summaryview->folder_item
1395 && mainwin->summaryview->folder_item->total_msgs == 0))) {
1396 g_signal_stop_emission_by_name(G_OBJECT(widget),
1397 "key_press_event");
1398 folderview_select_next_with_flag(mainwin->folderview, MSG_UNREAD);
1401 break;
1402 default:
1403 break;
1405 return FALSE;
1408 #undef BREAK_ON_MODIFIER_KEY
1410 MainWindow *main_window_create()
1412 MainWindow *mainwin;
1413 GtkWidget *window;
1414 GtkWidget *vbox;
1415 GtkWidget *menubar;
1416 GtkWidget *handlebox;
1417 GtkWidget *vbox_body;
1418 GtkWidget *menuitem;
1419 #ifndef GENERIC_UMPC
1420 GtkWidget *hbox_stat;
1421 GtkWidget *statusbar;
1422 GtkWidget *progressbar;
1423 GtkWidget *statuslabel;
1424 GtkWidget *ac_button;
1425 GtkWidget *ac_label;
1426 GtkWidget *online_pixmap;
1427 GtkWidget *offline_pixmap;
1428 GtkWidget *warning_btn;
1429 #endif
1430 GtkWidget *online_switch;
1431 GtkWidget *offline_switch;
1432 FolderView *folderview;
1433 SummaryView *summaryview;
1434 MessageView *messageview;
1435 GtkWidget *ac_menu;
1437 static GdkGeometry geometry;
1439 debug_print("Creating main window...\n");
1440 mainwin = g_new0(MainWindow, 1);
1442 /* main window */
1443 window = GTK_WIDGET(gtkut_window_new(GTK_WINDOW_TOPLEVEL, "mainwindow"));
1444 gtk_window_set_title(GTK_WINDOW(window), PROG_VERSION);
1445 gtk_window_set_resizable(GTK_WINDOW(window), TRUE);
1446 #ifdef GENERIC_UMPC
1447 prefs_common.layout_mode = SMALL_LAYOUT;
1448 #endif
1449 if (!geometry.min_height) {
1450 geometry.min_width = 320;
1451 geometry.min_height = 200;
1453 gtk_window_set_geometry_hints(GTK_WINDOW(window), NULL, &geometry,
1454 GDK_HINT_MIN_SIZE);
1456 g_signal_connect(G_OBJECT(window), "delete_event",
1457 G_CALLBACK(main_window_close_cb), mainwin);
1458 MANAGE_WINDOW_SIGNALS_CONNECT(window);
1459 g_signal_connect(G_OBJECT(window), "focus_in_event",
1460 G_CALLBACK(mainwindow_focus_in_event),
1461 mainwin);
1462 g_signal_connect(G_OBJECT(window), "key_press_event",
1463 G_CALLBACK(mainwindow_key_pressed), mainwin);
1465 gtk_widget_realize(window);
1466 gtk_widget_add_events(window, GDK_KEY_PRESS_MASK|GDK_KEY_RELEASE_MASK);
1469 gtkut_widget_set_app_icon(window);
1471 vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
1472 gtk_widget_show(vbox);
1473 gtk_container_add(GTK_CONTAINER(window), vbox);
1475 /* menu bar */
1477 mainwin->ui_manager = gtk_ui_manager_new();
1478 mainwin->action_group = cm_menu_create_action_group_full(mainwin->ui_manager,"Menu", mainwin_entries,
1479 G_N_ELEMENTS(mainwin_entries), (gpointer)mainwin);
1480 gtk_action_group_add_toggle_actions(mainwin->action_group, mainwin_toggle_entries,
1481 G_N_ELEMENTS(mainwin_toggle_entries), (gpointer)mainwin);
1482 gtk_action_group_add_radio_actions(mainwin->action_group, mainwin_showhide_radio_entries,
1483 G_N_ELEMENTS(mainwin_showhide_radio_entries), C_AUTO, G_CALLBACK(toggle_toolbar_cb), (gpointer)mainwin);
1484 #ifndef GENERIC_UMPC
1485 gtk_action_group_add_radio_actions(mainwin->action_group, mainwin_layout_radio_entries,
1486 G_N_ELEMENTS(mainwin_layout_radio_entries), C_AUTO, G_CALLBACK(set_layout_cb), (gpointer)mainwin);
1487 #endif
1488 gtk_action_group_add_radio_actions(mainwin->action_group, mainwin_sort_radio_entries,
1489 G_N_ELEMENTS(mainwin_sort_radio_entries), C_AUTO, G_CALLBACK(sort_summary_cb), (gpointer)mainwin);
1490 gtk_action_group_add_radio_actions(mainwin->action_group, mainwin_sorttype_radio_entries,
1491 G_N_ELEMENTS(mainwin_sorttype_radio_entries), C_AUTO, G_CALLBACK(sort_summary_type_cb), (gpointer)mainwin);
1492 gtk_action_group_add_radio_actions(mainwin->action_group, mainwin_radio_enc_entries,
1493 G_N_ELEMENTS(mainwin_radio_enc_entries), C_AUTO, G_CALLBACK(set_charset_cb), (gpointer)mainwin);
1494 gtk_action_group_add_radio_actions(mainwin->action_group, mainwin_radio_dec_entries,
1495 G_N_ELEMENTS(mainwin_radio_dec_entries), C_AUTO, G_CALLBACK(set_decode_cb), (gpointer)mainwin);
1497 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/", "Menu", NULL, GTK_UI_MANAGER_MENUBAR)
1498 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu", "File", "File", GTK_UI_MANAGER_MENU)
1499 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu", "Edit", "Edit", GTK_UI_MANAGER_MENU)
1500 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu", "View", "View", GTK_UI_MANAGER_MENU)
1501 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu", "Message", "Message", GTK_UI_MANAGER_MENU)
1502 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu", "Tools", "Tools", GTK_UI_MANAGER_MENU)
1503 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu", "Configuration", "Configuration", GTK_UI_MANAGER_MENU)
1504 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu", "Help", "Help", GTK_UI_MANAGER_MENU)
1506 /* File menu */
1507 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/File", "AddMailbox", "File/AddMailbox", GTK_UI_MANAGER_MENU)
1508 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/File/AddMailbox", "MH", "File/AddMailbox/MH", GTK_UI_MANAGER_MENUITEM)
1509 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/File", "Separator1", "File/---", GTK_UI_MANAGER_SEPARATOR)
1510 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/File", "SortMailboxes", "File/SortMailboxes", GTK_UI_MANAGER_MENUITEM)
1511 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/File", "Separator2", "File/---", GTK_UI_MANAGER_SEPARATOR)
1512 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/File", "ImportMbox", "File/ImportMbox", GTK_UI_MANAGER_MENUITEM)
1513 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/File", "ExportMbox", "File/ExportMbox", GTK_UI_MANAGER_MENUITEM)
1514 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/File", "ExportSelMbox", "File/ExportSelMbox", GTK_UI_MANAGER_MENUITEM)
1515 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/File", "Separator3", "File/---", GTK_UI_MANAGER_SEPARATOR)
1516 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/File", "EmptyTrashes", "File/EmptyTrashes", GTK_UI_MANAGER_MENUITEM)
1517 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/File", "Separator4", "File/---", GTK_UI_MANAGER_SEPARATOR)
1518 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/File", "SaveAs", "File/SaveAs", GTK_UI_MANAGER_MENUITEM)
1519 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/File", "SavePartAs", "File/SavePartAs", GTK_UI_MANAGER_MENUITEM)
1520 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/File", "Separator5", "File/---", GTK_UI_MANAGER_SEPARATOR)
1521 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/File", "PageSetup", "File/PageSetup", GTK_UI_MANAGER_MENUITEM)
1522 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/File", "Print", "File/Print", GTK_UI_MANAGER_MENUITEM)
1523 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/File", "Separator6", "File/---", GTK_UI_MANAGER_SEPARATOR)
1524 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/File", "OfflineMode", "File/OfflineMode", GTK_UI_MANAGER_MENUITEM)
1525 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/File", "SynchroniseFolders", "File/SynchroniseFolders", GTK_UI_MANAGER_MENUITEM)
1526 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/File", "Separator7", "File/---", GTK_UI_MANAGER_SEPARATOR)
1527 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/File", "Exit", "File/Exit", GTK_UI_MANAGER_MENUITEM)
1529 /* Edit menu */
1530 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Edit", "Copy", "Edit/Copy", GTK_UI_MANAGER_MENUITEM)
1531 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Edit", "SelectAll", "Edit/SelectAll", GTK_UI_MANAGER_MENUITEM)
1532 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Edit", "SelectThread", "Edit/SelectThread", GTK_UI_MANAGER_MENUITEM)
1533 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Edit", "Separator1", "Edit/---", GTK_UI_MANAGER_SEPARATOR)
1534 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Edit", "Find", "Edit/Find", GTK_UI_MANAGER_MENUITEM)
1535 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Edit", "SearchFolder", "Edit/SearchFolder", GTK_UI_MANAGER_MENUITEM)
1536 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Edit", "QuickSearch", "Edit/QuickSearch", GTK_UI_MANAGER_MENUITEM)
1538 /* View menu */
1539 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View", "ShowHide", "View/ShowHide", GTK_UI_MANAGER_MENU)
1540 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/ShowHide", "MenuBar", "View/ShowHide/MenuBar", GTK_UI_MANAGER_MENUITEM)
1541 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/ShowHide", "Toolbar", "View/ShowHide/Toolbar", GTK_UI_MANAGER_MENU)
1542 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/ShowHide/Toolbar", "TextBelowIcon", "View/ShowHide/Toolbar/TextBelowIcon", GTK_UI_MANAGER_MENUITEM)
1543 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/ShowHide/Toolbar", "TextBesideIcon", "View/ShowHide/Toolbar/TextBesideIcon", GTK_UI_MANAGER_MENUITEM)
1544 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/ShowHide/Toolbar", "IconOnly", "View/ShowHide/Toolbar/IconOnly", GTK_UI_MANAGER_MENUITEM)
1545 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/ShowHide/Toolbar", "TextOnly", "View/ShowHide/Toolbar/TextOnly", GTK_UI_MANAGER_MENUITEM)
1546 #ifndef GENERIC_UMPC
1547 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/ShowHide/Toolbar", "Hide", "View/ShowHide/Toolbar/Hide", GTK_UI_MANAGER_MENUITEM)
1548 #endif
1549 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/ShowHide", "MessageView", "View/ShowHide/MessageView", GTK_UI_MANAGER_MENUITEM)
1550 #ifndef GENERIC_UMPC
1551 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/ShowHide", "StatusBar", "View/ShowHide/StatusBar", GTK_UI_MANAGER_MENUITEM)
1552 #endif
1553 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/ShowHide", "ColumnHeaders", "View/ShowHide/ColumnHeaders", GTK_UI_MANAGER_MENUITEM)
1554 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View", "SetColumns", "View/SetColumns", GTK_UI_MANAGER_MENU)
1555 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/SetColumns", "Folderlist", "View/SetColumns/Folderlist", GTK_UI_MANAGER_MENUITEM)
1556 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/SetColumns", "Messagelist", "View/SetColumns/Messagelist", GTK_UI_MANAGER_MENUITEM)
1557 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View", "Separator1", "View/---", GTK_UI_MANAGER_SEPARATOR)
1559 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View", "FullScreen", "View/FullScreen", GTK_UI_MANAGER_MENUITEM)
1560 #ifndef GENERIC_UMPC
1561 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View", "Layout", "View/Layout", GTK_UI_MANAGER_MENU)
1562 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Layout", "Standard", "View/Layout/Standard", GTK_UI_MANAGER_MENUITEM)
1563 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Layout", "ThreeColumns", "View/Layout/ThreeColumns", GTK_UI_MANAGER_MENUITEM)
1564 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Layout", "WideMessage", "View/Layout/WideMessage", GTK_UI_MANAGER_MENUITEM)
1565 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Layout", "WideMessageList", "View/Layout/WideMessageList", GTK_UI_MANAGER_MENUITEM)
1566 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Layout", "SmallScreen", "View/Layout/SmallScreen", GTK_UI_MANAGER_MENUITEM)
1567 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View", "Separator2", "View/---", GTK_UI_MANAGER_SEPARATOR)
1568 #endif
1570 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View", "Sort", "View/Sort", GTK_UI_MANAGER_MENU)
1571 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Sort", "Number", "View/Sort/Number", GTK_UI_MANAGER_MENUITEM)
1572 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Sort", "Size", "View/Sort/Size", GTK_UI_MANAGER_MENUITEM)
1573 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Sort", "Date", "View/Sort/Date", GTK_UI_MANAGER_MENUITEM)
1574 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Sort", "ThreadDate", "View/Sort/ThreadDate", GTK_UI_MANAGER_MENUITEM)
1575 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Sort", "From", "View/Sort/From", GTK_UI_MANAGER_MENUITEM)
1576 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Sort", "To", "View/Sort/To", GTK_UI_MANAGER_MENUITEM)
1577 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Sort", "Subject", "View/Sort/Subject", GTK_UI_MANAGER_MENUITEM)
1578 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Sort", "Color", "View/Sort/Color", GTK_UI_MANAGER_MENUITEM)
1579 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Sort", "Tag", "View/Sort/Tag", GTK_UI_MANAGER_MENUITEM)
1580 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Sort", "Mark", "View/Sort/Mark", GTK_UI_MANAGER_MENUITEM)
1581 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Sort", "Status", "View/Sort/Status", GTK_UI_MANAGER_MENUITEM)
1582 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Sort", "Attachment", "View/Sort/Attachment", GTK_UI_MANAGER_MENUITEM)
1583 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Sort", "Score", "View/Sort/Score", GTK_UI_MANAGER_MENUITEM)
1584 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Sort", "Locked", "View/Sort/Locked", GTK_UI_MANAGER_MENUITEM)
1585 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Sort", "DontSort", "View/Sort/DontSort", GTK_UI_MANAGER_MENUITEM)
1586 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Sort", "Separator1", "View/Sort/---", GTK_UI_MANAGER_SEPARATOR)
1587 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Sort", "Ascending", "View/Sort/Ascending", GTK_UI_MANAGER_MENUITEM)
1588 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Sort", "Descending", "View/Sort/Descending", GTK_UI_MANAGER_MENUITEM)
1589 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Sort", "Separator2", "View/Sort/---", GTK_UI_MANAGER_SEPARATOR)
1590 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Sort", "AttractSubj", "View/Sort/AttractSubj", GTK_UI_MANAGER_MENUITEM)
1592 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View", "ThreadView", "View/ThreadView", GTK_UI_MANAGER_MENUITEM)
1593 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View", "ExpandThreads", "View/ExpandThreads", GTK_UI_MANAGER_MENUITEM)
1594 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View", "CollapseThreads", "View/CollapseThreads", GTK_UI_MANAGER_MENUITEM)
1595 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View", "HideReadThreads", "View/HideReadThreads", GTK_UI_MANAGER_MENUITEM)
1596 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View", "HideReadMessages", "View/HideReadMessages", GTK_UI_MANAGER_MENUITEM)
1597 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View", "HideDelMessages", "View/HideDelMessages", GTK_UI_MANAGER_MENUITEM)
1598 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View", "Separator3", "View/---", GTK_UI_MANAGER_SEPARATOR)
1600 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View", "Goto", "View/Goto", GTK_UI_MANAGER_MENU)
1601 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Goto", "Prev", "View/Goto/Prev", GTK_UI_MANAGER_MENUITEM)
1602 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Goto", "Next", "View/Goto/Next", GTK_UI_MANAGER_MENUITEM)
1603 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Goto", "Separator1", "View/Goto/---", GTK_UI_MANAGER_SEPARATOR)
1604 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Goto", "PrevUnread", "View/Goto/PrevUnread", GTK_UI_MANAGER_MENUITEM)
1605 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Goto", "NextUnread", "View/Goto/NextUnread", GTK_UI_MANAGER_MENUITEM)
1606 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Goto", "Separator2", "View/Goto/---", GTK_UI_MANAGER_SEPARATOR)
1607 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Goto", "PrevNew", "View/Goto/PrevNew", GTK_UI_MANAGER_MENUITEM)
1608 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Goto", "NextNew", "View/Goto/NextNew", GTK_UI_MANAGER_MENUITEM)
1609 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Goto", "Separator3", "View/Goto/---", GTK_UI_MANAGER_SEPARATOR)
1610 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Goto", "PrevMarked", "View/Goto/PrevMarked", GTK_UI_MANAGER_MENUITEM)
1611 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Goto", "NextMarked", "View/Goto/NextMarked", GTK_UI_MANAGER_MENUITEM)
1612 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Goto", "Separator4", "View/Goto/---", GTK_UI_MANAGER_SEPARATOR)
1613 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Goto", "PrevLabeled", "View/Goto/PrevLabeled", GTK_UI_MANAGER_MENUITEM)
1614 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Goto", "NextLabeled", "View/Goto/NextLabeled", GTK_UI_MANAGER_MENUITEM)
1615 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Goto", "Separator5", "View/Goto/---", GTK_UI_MANAGER_SEPARATOR)
1616 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Goto", "PrevHistory", "View/Goto/PrevHistory", GTK_UI_MANAGER_MENUITEM)
1617 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Goto", "NextHistory", "View/Goto/NextHistory", GTK_UI_MANAGER_MENUITEM)
1618 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Goto", "Separator6", "View/Goto/---", GTK_UI_MANAGER_SEPARATOR)
1619 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Goto", "ParentMessage", "View/Goto/ParentMessage", GTK_UI_MANAGER_MENUITEM)
1620 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Goto", "Separator7", "View/Goto/---", GTK_UI_MANAGER_SEPARATOR)
1621 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Goto", "NextUnreadFolder", "View/Goto/NextUnreadFolder", GTK_UI_MANAGER_MENUITEM)
1622 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Goto", "Folder", "View/Goto/Folder", GTK_UI_MANAGER_MENUITEM)
1623 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Goto", "Separator8", "View/Goto/---", GTK_UI_MANAGER_SEPARATOR)
1624 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Goto", "NextPart", "View/Goto/NextPart", GTK_UI_MANAGER_MENUITEM)
1625 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Goto", "PrevPart", "View/Goto/PrevPart", GTK_UI_MANAGER_MENUITEM)
1626 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View", "Scroll", "View/Scroll", GTK_UI_MANAGER_MENU)
1627 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Scroll", "PrevLine", "View/Scroll/PrevLine", GTK_UI_MANAGER_MENUITEM)
1628 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Scroll", "NextLine", "View/Scroll/NextLine", GTK_UI_MANAGER_MENUITEM)
1629 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Scroll", "PrevPage", "View/Scroll/PrevPage", GTK_UI_MANAGER_MENUITEM)
1630 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Scroll", "NextPage", "View/Scroll/NextPage", GTK_UI_MANAGER_MENUITEM)
1631 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View", "Separator4", "View/---", GTK_UI_MANAGER_SEPARATOR)
1633 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View", "Encoding", "View/Encoding", GTK_UI_MANAGER_MENU)
1634 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding", CS_AUTO, "View/Encoding/"CS_AUTO, GTK_UI_MANAGER_MENUITEM)
1635 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding", "Separator1", "View/Encoding/---", GTK_UI_MANAGER_SEPARATOR)
1636 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding", CS_US_ASCII, "View/Encoding/"CS_US_ASCII, GTK_UI_MANAGER_MENUITEM)
1637 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding", CS_UTF_8, "View/Encoding/"CS_UTF_8, GTK_UI_MANAGER_MENUITEM)
1638 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding", "Separator2", "View/Encoding/---", GTK_UI_MANAGER_SEPARATOR)
1640 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding", "Western", "View/Encoding/Western", GTK_UI_MANAGER_MENU)
1641 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)
1642 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)
1643 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding/Western", CS_WINDOWS_1252, "View/Encoding/Western/"CS_WINDOWS_1252, GTK_UI_MANAGER_MENUITEM)
1645 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding", CS_ISO_8859_2, "View/Encoding/"CS_ISO_8859_2, GTK_UI_MANAGER_MENUITEM)
1647 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding", "Baltic", "View/Encoding/Baltic", GTK_UI_MANAGER_MENU)
1648 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)
1649 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)
1651 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding", CS_ISO_8859_7, "View/Encoding/"CS_ISO_8859_7, GTK_UI_MANAGER_MENUITEM)
1653 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding", "Hebrew", "View/Encoding/Hebrew", GTK_UI_MANAGER_MENU)
1654 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)
1655 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding/Hebrew", CS_WINDOWS_1255, "View/Encoding/Hebrew/"CS_WINDOWS_1255, GTK_UI_MANAGER_MENUITEM)
1657 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding", "Arabic", "View/Encoding/Arabic", GTK_UI_MANAGER_MENU)
1658 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)
1659 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding/Arabic", CS_WINDOWS_1256, "View/Encoding/Arabic/"CS_WINDOWS_1256, GTK_UI_MANAGER_MENUITEM)
1661 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding", CS_ISO_8859_9, "View/Encoding/"CS_ISO_8859_9, GTK_UI_MANAGER_MENUITEM)
1663 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding", "Cyrillic", "View/Encoding/Cyrillic", GTK_UI_MANAGER_MENU)
1664 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)
1665 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding/Cyrillic", CS_KOI8_R, "View/Encoding/Cyrillic/"CS_KOI8_R, GTK_UI_MANAGER_MENUITEM)
1666 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding/Cyrillic", CS_MACCYR, "View/Encoding/Cyrillic/"CS_MACCYR, GTK_UI_MANAGER_MENUITEM)
1667 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding/Cyrillic", CS_KOI8_U, "View/Encoding/Cyrillic/"CS_KOI8_U, GTK_UI_MANAGER_MENUITEM)
1668 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding/Cyrillic", CS_WINDOWS_1251, "View/Encoding/Cyrillic/"CS_WINDOWS_1251, GTK_UI_MANAGER_MENUITEM)
1670 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding", "Japanese", "View/Encoding/Japanese", GTK_UI_MANAGER_MENU)
1671 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)
1672 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)
1673 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding/Japanese", CS_EUC_JP, "View/Encoding/Japanese/"CS_EUC_JP, GTK_UI_MANAGER_MENUITEM)
1674 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding/Japanese", CS_SHIFT_JIS, "View/Encoding/Japanese/"CS_SHIFT_JIS, GTK_UI_MANAGER_MENUITEM)
1676 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding", "Chinese", "View/Encoding/Chinese", GTK_UI_MANAGER_MENU)
1677 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding/Chinese", CS_GB18030, "View/Encoding/Chinese/"CS_GB18030, GTK_UI_MANAGER_MENUITEM)
1678 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding/Chinese", CS_GB2312, "View/Encoding/Chinese/"CS_GB2312, GTK_UI_MANAGER_MENUITEM)
1679 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding/Chinese", CS_GBK, "View/Encoding/Chinese/"CS_GBK, GTK_UI_MANAGER_MENUITEM)
1680 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding/Chinese", CS_BIG5, "View/Encoding/Chinese/"CS_BIG5, GTK_UI_MANAGER_MENUITEM)
1681 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding/Chinese", CS_EUC_TW, "View/Encoding/Chinese/"CS_EUC_TW, GTK_UI_MANAGER_MENUITEM)
1683 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding", "Korean", "View/Encoding/Korean", GTK_UI_MANAGER_MENU)
1684 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding/Korean", CS_EUC_KR, "View/Encoding/Korean/"CS_EUC_KR, GTK_UI_MANAGER_MENUITEM)
1685 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)
1687 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding", "Thai", "View/Encoding/Thai", GTK_UI_MANAGER_MENU)
1688 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding/Thai", CS_TIS_620, "View/Encoding/Thai/"CS_TIS_620, GTK_UI_MANAGER_MENUITEM)
1689 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding/Thai", CS_WINDOWS_874, "View/Encoding/Thai/"CS_WINDOWS_874, GTK_UI_MANAGER_MENUITEM)
1691 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View", "Decode", "View/Decode", GTK_UI_MANAGER_MENU)
1692 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Decode", "AutoDetect", "View/Decode/AutoDetect", GTK_UI_MANAGER_MENUITEM)
1693 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Decode", "Separator1", "View/Decode/---", GTK_UI_MANAGER_SEPARATOR)
1694 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Decode", "8bit", "View/Decode/8bit", GTK_UI_MANAGER_MENUITEM)
1695 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Decode", "QP", "View/Decode/QP", GTK_UI_MANAGER_MENUITEM)
1696 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Decode", "B64", "View/Decode/B64", GTK_UI_MANAGER_MENUITEM)
1697 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Decode", "Uuencode", "View/Decode/Uuencode", GTK_UI_MANAGER_MENUITEM)
1698 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View", "Separator5", "View/---", GTK_UI_MANAGER_SEPARATOR)
1700 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View", "OpenNewWindow", "View/OpenNewWindow", GTK_UI_MANAGER_MENUITEM)
1701 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View", "MessageSource", "View/MessageSource", GTK_UI_MANAGER_MENUITEM)
1702 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View", "AllHeaders", "View/AllHeaders", GTK_UI_MANAGER_MENUITEM)
1703 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View", "Quotes", "View/Quotes", GTK_UI_MANAGER_MENU)
1704 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Quotes", "CollapseAll", "View/Quotes/CollapseAll", GTK_UI_MANAGER_MENUITEM)
1705 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Quotes", "Collapse2", "View/Quotes/Collapse2", GTK_UI_MANAGER_MENUITEM)
1706 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Quotes", "Collapse3", "View/Quotes/Collapse3", GTK_UI_MANAGER_MENUITEM)
1707 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View", "Part", "View/Part", GTK_UI_MANAGER_MENU)
1708 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Part", "AsText", "View/Part/AsText", GTK_UI_MANAGER_MENUITEM)
1709 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Part", "Open", "View/Part/Open", GTK_UI_MANAGER_MENUITEM)
1710 #ifndef G_OS_WIN32
1711 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Part", "OpenWith", "View/Part/OpenWith", GTK_UI_MANAGER_MENUITEM)
1712 #endif
1713 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View", "Separator8", "View/---", GTK_UI_MANAGER_SEPARATOR)
1714 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View", "UpdateSummary", "View/UpdateSummary", GTK_UI_MANAGER_MENUITEM)
1716 /* Message menu */
1717 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message", "Receive", "Message/Receive", GTK_UI_MANAGER_MENU)
1718 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/Receive", "CurrentAccount", "Message/Receive/CurrentAccount", GTK_UI_MANAGER_MENUITEM)
1719 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/Receive", "AllAccounts", "Message/Receive/AllAccounts", GTK_UI_MANAGER_MENUITEM)
1720 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/Receive", "CancelReceiving", "Message/Receive/CancelReceiving", GTK_UI_MANAGER_MENUITEM)
1721 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/Receive", "Separator1", "Message/Receive/---", GTK_UI_MANAGER_SEPARATOR)
1722 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/Receive", "PlaceHolder", "Message/Receive/PlaceHolder", GTK_UI_MANAGER_MENUITEM)
1723 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message", "SendQueue", "Message/SendQueue", GTK_UI_MANAGER_MENUITEM)
1724 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message", "CancelSending", "Message/CancelSending", GTK_UI_MANAGER_MENUITEM)
1725 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message", "Separator1", "Message/---", GTK_UI_MANAGER_SEPARATOR)
1727 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message", "ComposeEmail", "Message/ComposeEmail", GTK_UI_MANAGER_MENUITEM)
1728 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message", "ComposeNews", "Message/ComposeNews", GTK_UI_MANAGER_MENUITEM)
1729 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message", "Reply", "Message/Reply", GTK_UI_MANAGER_MENUITEM)
1730 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message", "ReplyTo", "Message/ReplyTo", GTK_UI_MANAGER_MENU)
1731 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/ReplyTo", "All", "Message/ReplyTo/All", GTK_UI_MANAGER_MENUITEM)
1732 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/ReplyTo", "Sender", "Message/ReplyTo/Sender", GTK_UI_MANAGER_MENUITEM)
1733 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/ReplyTo", "List", "Message/ReplyTo/List", GTK_UI_MANAGER_MENUITEM)
1734 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message", "FollowupReply", "Message/FollowupReply", GTK_UI_MANAGER_MENUITEM)
1735 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message", "Separator2", "Message/---", GTK_UI_MANAGER_SEPARATOR)
1737 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message", "Forward", "Message/Forward", GTK_UI_MANAGER_MENUITEM)
1738 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message", "ForwardAtt", "Message/ForwardAtt", GTK_UI_MANAGER_MENUITEM)
1739 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message", "Redirect", "Message/Redirect", GTK_UI_MANAGER_MENUITEM)
1740 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message", "MailingList", "Message/MailingList", GTK_UI_MANAGER_MENU)
1741 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/MailingList", "Post", "Message/MailingList/Post", GTK_UI_MANAGER_MENU)
1742 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/MailingList", "Help", "Message/MailingList/Help", GTK_UI_MANAGER_MENU)
1743 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/MailingList", "Subscribe", "Message/MailingList/Subscribe", GTK_UI_MANAGER_MENU)
1744 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/MailingList", "Unsubscribe", "Message/MailingList/Unsubscribe", GTK_UI_MANAGER_MENU)
1745 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/MailingList", "ViewArchive", "Message/MailingList/ViewArchive", GTK_UI_MANAGER_MENU)
1746 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/MailingList", "ContactOwner", "Message/MailingList/ContactOwner", GTK_UI_MANAGER_MENU)
1747 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/MailingList/Post", "PlaceHolder", "Message/MailingList/Post/PlaceHolder", GTK_UI_MANAGER_MENUITEM)
1748 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/MailingList/Help", "PlaceHolder", "Message/MailingList/Help/PlaceHolder", GTK_UI_MANAGER_MENUITEM)
1749 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/MailingList/Subscribe", "PlaceHolder", "Message/MailingList/Subscribe/PlaceHolder", GTK_UI_MANAGER_MENUITEM)
1750 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/MailingList/Unsubscribe", "PlaceHolder", "Message/MailingList/Unsubscribe/PlaceHolder", GTK_UI_MANAGER_MENUITEM)
1751 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/MailingList/ViewArchive", "PlaceHolder", "Message/MailingList/ViewArchive/PlaceHolder", GTK_UI_MANAGER_MENUITEM)
1752 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/MailingList/ContactOwner", "PlaceHolder", "Message/MailingList/ContactOwner/PlaceHolder", GTK_UI_MANAGER_MENUITEM)
1753 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message", "Separator3", "Message/---", GTK_UI_MANAGER_SEPARATOR)
1755 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message", "Move", "Message/Move", GTK_UI_MANAGER_MENUITEM)
1756 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message", "Copy", "Message/Copy", GTK_UI_MANAGER_MENUITEM)
1757 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message", "Trash", "Message/Trash", GTK_UI_MANAGER_MENUITEM)
1758 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message", "Delete", "Message/Delete", GTK_UI_MANAGER_MENUITEM)
1759 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message", "TrashThread", "Message/TrashThread", GTK_UI_MANAGER_MENUITEM)
1760 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message", "DeleteThread", "Message/DeleteThread", GTK_UI_MANAGER_MENUITEM)
1761 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message", "CancelNews", "Message/CancelNews", GTK_UI_MANAGER_MENUITEM)
1762 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message", "Separator4", "Message/---", GTK_UI_MANAGER_SEPARATOR)
1764 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message", "Mark", "Message/Mark", GTK_UI_MANAGER_MENU)
1765 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/Mark", "Mark", "Message/Mark/Mark", GTK_UI_MANAGER_MENUITEM)
1766 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/Mark", "Unmark", "Message/Mark/Unmark", GTK_UI_MANAGER_MENUITEM)
1767 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/Mark", "Separator1", "Message/Mark/---", GTK_UI_MANAGER_SEPARATOR)
1768 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/Mark", "MarkRead", "Message/Mark/MarkRead", GTK_UI_MANAGER_MENUITEM)
1769 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/Mark", "MarkUnread", "Message/Mark/MarkUnread", GTK_UI_MANAGER_MENUITEM)
1770 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/Mark", "Separator2", "Message/Mark/---", GTK_UI_MANAGER_SEPARATOR)
1771 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/Mark", "MarkAllRead", "Message/Mark/MarkAllRead", GTK_UI_MANAGER_MENUITEM)
1772 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/Mark", "MarkAllUnread", "Message/Mark/MarkAllUnread", GTK_UI_MANAGER_MENUITEM)
1773 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/Mark", "Separator3", "Message/Mark/---", GTK_UI_MANAGER_SEPARATOR)
1774 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/Mark", "IgnoreThread", "Message/Mark/IgnoreThread", GTK_UI_MANAGER_MENUITEM)
1775 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/Mark", "UnignoreThread", "Message/Mark/UnignoreThread", GTK_UI_MANAGER_MENUITEM)
1776 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/Mark", "WatchThread", "Message/Mark/WatchThread", GTK_UI_MANAGER_MENUITEM)
1777 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/Mark", "UnwatchThread", "Message/Mark/UnwatchThread", GTK_UI_MANAGER_MENUITEM)
1778 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/Mark", "Separator4", "Message/Mark/---", GTK_UI_MANAGER_SEPARATOR)
1779 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/Mark", "MarkSpam", "Message/Mark/MarkSpam", GTK_UI_MANAGER_MENUITEM)
1780 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/Mark", "MarkHam", "Message/Mark/MarkHam", GTK_UI_MANAGER_MENUITEM)
1781 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/Mark", "Separator5", "Message/Mark/---", GTK_UI_MANAGER_SEPARATOR)
1782 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/Mark", "Lock", "Message/Mark/Lock", GTK_UI_MANAGER_MENUITEM)
1783 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/Mark", "Unlock", "Message/Mark/Unlock", GTK_UI_MANAGER_MENUITEM)
1784 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message", "ColorLabel", "Message/ColorLabel", GTK_UI_MANAGER_MENUITEM)
1785 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message", "Tags", "Message/Tags", GTK_UI_MANAGER_MENUITEM)
1786 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message", "Separator5", "Message/---", GTK_UI_MANAGER_SEPARATOR)
1788 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message", "Reedit", "Message/Reedit", GTK_UI_MANAGER_MENUITEM)
1789 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message", "Separator6", "Message/---", GTK_UI_MANAGER_SEPARATOR)
1790 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message", "CheckSignature", "Message/CheckSignature", GTK_UI_MANAGER_MENUITEM)
1792 /* Tools menu */
1793 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools", "AddressBook", "Tools/AddressBook", GTK_UI_MANAGER_MENUITEM)
1794 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools", "AddSenderToAB", "Tools/AddSenderToAB", GTK_UI_MANAGER_MENUITEM)
1795 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools", "CollectAddresses", "Tools/CollectAddresses", GTK_UI_MANAGER_MENU)
1796 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools/CollectAddresses", "FromFolder", "Tools/CollectAddresses/FromFolder", GTK_UI_MANAGER_MENUITEM)
1797 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools/CollectAddresses", "FromSelected", "Tools/CollectAddresses/FromSelected", GTK_UI_MANAGER_MENUITEM)
1798 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools", "Separator1", "Tools/---", GTK_UI_MANAGER_SEPARATOR)
1800 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools", "FilterFolder", "Tools/FilterFolder", GTK_UI_MANAGER_MENUITEM)
1801 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools", "FilterSelected", "Tools/FilterSelected", GTK_UI_MANAGER_MENUITEM)
1802 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools", "RunProcessing", "Tools/RunProcessing", GTK_UI_MANAGER_MENUITEM)
1803 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools", "CreateFilterRule", "Tools/CreateFilterRule", GTK_UI_MANAGER_MENU)
1804 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools/CreateFilterRule", "Automatically", "Tools/CreateFilterRule/Automatically", GTK_UI_MANAGER_MENUITEM)
1805 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools/CreateFilterRule", "ByFrom", "Tools/CreateFilterRule/ByFrom", GTK_UI_MANAGER_MENUITEM)
1806 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools/CreateFilterRule", "ByTo", "Tools/CreateFilterRule/ByTo", GTK_UI_MANAGER_MENUITEM)
1807 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools/CreateFilterRule", "BySubject", "Tools/CreateFilterRule/BySubject", GTK_UI_MANAGER_MENUITEM)
1808 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools/CreateFilterRule", "BySender", "Tools/CreateFilterRule/BySender", GTK_UI_MANAGER_MENUITEM)
1810 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools", "CreateProcessingRule", "Tools/CreateProcessingRule", GTK_UI_MANAGER_MENU)
1811 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools/CreateProcessingRule", "Automatically", "Tools/CreateProcessingRule/Automatically", GTK_UI_MANAGER_MENUITEM)
1812 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools/CreateProcessingRule", "ByFrom", "Tools/CreateProcessingRule/ByFrom", GTK_UI_MANAGER_MENUITEM)
1813 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools/CreateProcessingRule", "ByTo", "Tools/CreateProcessingRule/ByTo", GTK_UI_MANAGER_MENUITEM)
1814 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools/CreateProcessingRule", "BySubject", "Tools/CreateProcessingRule/BySubject", GTK_UI_MANAGER_MENUITEM)
1815 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools/CreateProcessingRule", "BySender", "Tools/CreateProcessingRule/BySender", GTK_UI_MANAGER_MENUITEM)
1816 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools", "Separator2", "Tools/---", GTK_UI_MANAGER_SEPARATOR)
1818 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools", "ListUrls", "Tools/ListUrls", GTK_UI_MANAGER_MENUITEM)
1819 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools", "Separator3", "Tools/---", GTK_UI_MANAGER_SEPARATOR)
1821 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools", "Actions", "Tools/Actions", GTK_UI_MANAGER_MENU)
1822 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools/Actions", "PlaceHolder", "Tools/Actions/PlaceHolder", GTK_UI_MANAGER_MENUITEM)
1823 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools", "Separator4", "Tools/---", GTK_UI_MANAGER_SEPARATOR)
1825 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools", "CheckNewMessages", "Tools/CheckNewMessages", GTK_UI_MANAGER_MENUITEM)
1826 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools", "DeleteDuplicates", "Tools/DeleteDuplicates", GTK_UI_MANAGER_MENU)
1827 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools/DeleteDuplicates", "SelFolder", "Tools/DeleteDuplicates/SelFolder", GTK_UI_MANAGER_MENUITEM)
1828 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools/DeleteDuplicates", "AllFolders", "Tools/DeleteDuplicates/AllFolders", GTK_UI_MANAGER_MENUITEM)
1829 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools", "Separator5", "Tools/---", GTK_UI_MANAGER_SEPARATOR)
1831 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools", "Execute", "Tools/Execute", GTK_UI_MANAGER_MENUITEM)
1832 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools", "Expunge", "Tools/Expunge", GTK_UI_MANAGER_MENUITEM)
1833 #ifdef USE_GNUTLS
1834 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools", "Separator6", "Tools/---", GTK_UI_MANAGER_SEPARATOR)
1835 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools", "TLSCertificates", "Tools/TLSCertificates", GTK_UI_MANAGER_MENUITEM)
1836 #endif
1837 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools", "Separator7", "Tools/---", GTK_UI_MANAGER_SEPARATOR)
1838 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools", "FilteringLog", "Tools/FilteringLog", GTK_UI_MANAGER_MENUITEM)
1839 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools", "NetworkLog", "Tools/NetworkLog", GTK_UI_MANAGER_MENUITEM)
1840 #ifdef G_OS_WIN32
1841 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools", "DebugLog", "Tools/DebugLog", GTK_UI_MANAGER_MENUITEM)
1842 #endif
1843 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools", "Separator8", "Tools/---", GTK_UI_MANAGER_SEPARATOR)
1844 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools", "ForgetSessionPasswords", "Tools/ForgetSessionPasswords", GTK_UI_MANAGER_MENUITEM)
1845 #ifndef PASSWORD_CRYPTO_OLD
1846 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools", "ForgetPrimaryPassphrase", "Tools/ForgetPrimaryPassphrase", GTK_UI_MANAGER_MENUITEM)
1847 #endif
1848 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools", "Separator9", "Tools/---", GTK_UI_MANAGER_SEPARATOR)
1850 /* Configuration menu */
1851 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Configuration", "ChangeAccount", "Configuration/ChangeAccount", GTK_UI_MANAGER_MENU)
1852 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Configuration/ChangeAccount", "PlaceHolder", "Configuration/ChangeAccount/PlaceHolder", GTK_UI_MANAGER_MENUITEM)
1853 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Configuration", "AccountPrefs", "Configuration/AccountPrefs", GTK_UI_MANAGER_MENUITEM)
1854 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Configuration", "CreateAccount", "Configuration/CreateAccount", GTK_UI_MANAGER_MENUITEM)
1855 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Configuration", "EditAccounts", "Configuration/EditAccounts", GTK_UI_MANAGER_MENUITEM)
1856 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Configuration", "Separator1", "Configuration/---", GTK_UI_MANAGER_SEPARATOR)
1858 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Configuration", "Preferences", "Configuration/Preferences", GTK_UI_MANAGER_MENUITEM)
1859 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Configuration", "PreProcessing", "Configuration/PreProcessing", GTK_UI_MANAGER_MENUITEM)
1860 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Configuration", "PostProcessing", "Configuration/PostProcessing", GTK_UI_MANAGER_MENUITEM)
1861 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Configuration", "Filtering", "Configuration/Filtering", GTK_UI_MANAGER_MENUITEM)
1862 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Configuration", "Templates", "Configuration/Templates", GTK_UI_MANAGER_MENUITEM)
1863 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Configuration", "Actions", "Configuration/Actions", GTK_UI_MANAGER_MENUITEM)
1864 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Configuration", "Tags", "Configuration/Tags", GTK_UI_MANAGER_MENUITEM)
1866 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Configuration", "Separator2", "Configuration/---", GTK_UI_MANAGER_SEPARATOR)
1867 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Configuration", "Plugins", "Configuration/Plugins", GTK_UI_MANAGER_MENUITEM)
1869 /* Help menu */
1870 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Help", "Manual", "Help/Manual", GTK_UI_MANAGER_MENUITEM)
1871 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Help", "FAQ", "Help/FAQ", GTK_UI_MANAGER_MENUITEM)
1872 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Help", "IconLegend", "Help/IconLegend", GTK_UI_MANAGER_MENUITEM)
1873 #ifdef G_OS_WIN32
1874 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Help", "Separator1", "Help/---", GTK_UI_MANAGER_SEPARATOR)
1875 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Help", "SetDefault", "Help/SetDefault", GTK_UI_MANAGER_MENUITEM)
1876 #endif
1877 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Help", "Separator2", "Help/---", GTK_UI_MANAGER_SEPARATOR)
1878 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Help", "About", "Help/About", GTK_UI_MANAGER_MENUITEM)
1881 menubar = gtk_ui_manager_get_widget(mainwin->ui_manager, "/Menu");
1882 if (prefs_common.mainwin_menubar)
1883 gtk_widget_show_all(menubar);
1884 else
1885 gtk_widget_hide(menubar);
1886 gtk_window_add_accel_group(GTK_WINDOW(window), gtk_ui_manager_get_accel_group(mainwin->ui_manager));
1888 /* Create a menu container for the different popup menus we
1889 * will be adding from other UI elements. */
1890 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/", "Menus", "Menus", GTK_UI_MANAGER_MENUBAR)
1892 gtk_box_pack_start(GTK_BOX(vbox), menubar, FALSE, TRUE, 0);
1894 handlebox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
1895 gtk_widget_show(handlebox);
1896 gtk_box_pack_start(GTK_BOX(vbox), handlebox, FALSE, FALSE, 0);
1897 /* link window to mainwin->window to avoid gdk warnings */
1898 mainwin->window = window;
1899 mainwin_list = g_list_append(mainwin_list, mainwin);
1901 mainwin->toolbar = toolbar_create(TOOLBAR_MAIN,
1902 handlebox,
1903 (gpointer)mainwin);
1904 toolbar_set_learn_button
1905 (mainwin->toolbar,
1906 LEARN_SPAM);
1908 /* vbox that contains body */
1909 vbox_body = gtk_box_new(GTK_ORIENTATION_VERTICAL, BORDER_WIDTH);
1910 gtk_widget_show(vbox_body);
1911 gtk_container_set_border_width(GTK_CONTAINER(vbox_body), BORDER_WIDTH);
1912 gtk_box_pack_start(GTK_BOX(vbox), vbox_body, TRUE, TRUE, 0);
1914 #ifndef GENERIC_UMPC
1915 hbox_stat = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 2);
1916 gtk_widget_set_name(GTK_WIDGET(hbox_stat), "hbox_stat");
1917 gtk_box_pack_end(GTK_BOX(vbox_body), hbox_stat, FALSE, FALSE, 0);
1918 warning_btn = gtk_button_new();
1919 gtk_button_set_image(GTK_BUTTON(warning_btn),
1920 gtk_image_new_from_icon_name("dialog-warning", GTK_ICON_SIZE_BUTTON));
1921 CLAWS_SET_TIP(warning_btn,
1922 _("Some error(s) happened. Click here to view log."));
1924 mainwin->warning_btn = warning_btn;
1926 g_signal_connect(G_OBJECT(warning_btn), "clicked",
1927 G_CALLBACK(warning_btn_pressed), mainwin);
1928 g_signal_connect(G_OBJECT(warning_btn), "motion-notify-event",
1929 G_CALLBACK(warning_visi_notify), mainwin);
1930 g_signal_connect(G_OBJECT(warning_btn), "leave-notify-event",
1931 G_CALLBACK(warning_leave_notify), mainwin);
1932 g_signal_connect(G_OBJECT(warning_btn), "enter-notify-event",
1933 G_CALLBACK(warning_enter_notify), mainwin);
1935 gtk_box_pack_start(GTK_BOX(hbox_stat), warning_btn, FALSE, FALSE, 0);
1937 statusbar = statusbar_create();
1938 gtk_widget_set_margin_start(statusbar, 2);
1939 gtk_widget_set_margin_end(statusbar, 0);
1940 gtk_widget_set_margin_top(statusbar, 0);
1941 gtk_widget_set_margin_bottom(statusbar, 0);
1942 gtk_box_pack_start(GTK_BOX(hbox_stat), statusbar, TRUE, TRUE, 0);
1944 progressbar = gtk_progress_bar_new();
1945 gtk_widget_set_size_request(progressbar, 120, 1);
1946 gtk_box_pack_start(GTK_BOX(hbox_stat), progressbar, FALSE, FALSE, 0);
1948 online_pixmap = stock_pixmap_widget(STOCK_PIXMAP_ONLINE);
1949 offline_pixmap = stock_pixmap_widget(STOCK_PIXMAP_OFFLINE);
1950 online_switch = gtk_button_new ();
1951 gtk_widget_set_can_focus(online_switch, FALSE);
1952 CLAWS_SET_TIP(online_switch,
1953 _("You are online. Click the icon to go offline"));
1954 offline_switch = gtk_button_new ();
1955 CLAWS_SET_TIP(offline_switch,
1956 _("You are offline. Click the icon to go online"));
1957 gtk_container_add (GTK_CONTAINER(online_switch), online_pixmap);
1958 gtk_button_set_relief (GTK_BUTTON(online_switch), GTK_RELIEF_NONE);
1959 g_signal_connect (G_OBJECT(online_switch), "clicked", G_CALLBACK(online_switch_clicked), mainwin);
1960 gtk_box_pack_start (GTK_BOX(hbox_stat), online_switch, FALSE, FALSE, 0);
1961 gtk_container_add (GTK_CONTAINER(offline_switch), offline_pixmap);
1962 gtk_button_set_relief (GTK_BUTTON(offline_switch), GTK_RELIEF_NONE);
1963 g_signal_connect (G_OBJECT(offline_switch), "clicked", G_CALLBACK(online_switch_clicked), mainwin);
1964 gtk_box_pack_start (GTK_BOX(hbox_stat), offline_switch, FALSE, FALSE, 0);
1966 statuslabel = gtk_label_new("");
1967 gtk_box_pack_start(GTK_BOX(hbox_stat), statuslabel, FALSE, FALSE, 0);
1969 ac_button = gtk_button_new();
1970 CLAWS_SET_TIP(ac_button, _("Select account"));
1971 gtk_widget_set_can_focus(ac_button, FALSE);
1972 gtk_widget_set_size_request(ac_button, -1, 0);
1973 gtk_box_pack_end(GTK_BOX(hbox_stat), ac_button, FALSE, FALSE, 0);
1974 g_signal_connect(G_OBJECT(ac_button), "button_press_event",
1975 G_CALLBACK(ac_label_button_pressed), mainwin);
1977 ac_label = gtk_label_new("");
1978 gtk_container_add(GTK_CONTAINER(ac_button), ac_label);
1980 gtk_widget_show_all(hbox_stat);
1982 gtk_widget_hide(offline_switch);
1983 gtk_widget_hide(progressbar);
1984 gtk_widget_hide(warning_btn);
1985 #else
1986 online_switch = gtk_button_new ();
1987 offline_switch = gtk_button_new ();
1988 g_signal_connect (G_OBJECT(online_switch), "clicked", G_CALLBACK(online_switch_clicked), mainwin);
1989 g_signal_connect (G_OBJECT(offline_switch), "clicked", G_CALLBACK(online_switch_clicked), mainwin);
1990 #endif
1991 /* create views */
1992 mainwin->folderview = folderview = folderview_create(mainwin);
1993 mainwin->summaryview = summaryview = summary_create(mainwin);
1994 mainwin->messageview = messageview = messageview_create(mainwin);
1996 /* init log instances data before creating log views */
1997 set_log_title(LOG_PROTOCOL, _("Network log"));
1998 set_log_prefs(LOG_PROTOCOL,
1999 &prefs_common.logwin_width,
2000 &prefs_common.logwin_height);
2001 set_log_title(LOG_DEBUG_FILTERING, _("Filtering/Processing debug log"));
2002 set_log_prefs(LOG_DEBUG_FILTERING,
2003 &prefs_common.filtering_debugwin_width,
2004 &prefs_common.filtering_debugwin_height);
2006 /* setup log windows */
2007 mainwin->logwin = log_window_create(LOG_PROTOCOL);
2008 log_window_init(mainwin->logwin);
2010 mainwin->filtering_debugwin = log_window_create(LOG_DEBUG_FILTERING);
2011 log_window_set_clipping(mainwin->logwin,
2012 prefs_common.cliplog,
2013 prefs_common.loglength);
2015 log_window_init(mainwin->filtering_debugwin);
2016 log_window_set_clipping(mainwin->filtering_debugwin,
2017 prefs_common.filtering_debug_cliplog,
2018 prefs_common.filtering_debug_loglength);
2019 if (prefs_common.enable_filtering_debug)
2020 log_message(LOG_DEBUG_FILTERING, _("filtering log enabled\n"));
2021 else
2022 log_message(LOG_DEBUG_FILTERING, _("filtering log disabled\n"));
2024 folderview->mainwin = mainwin;
2025 folderview->summaryview = summaryview;
2027 summaryview->mainwin = mainwin;
2028 summaryview->folderview = folderview;
2029 summaryview->messageview = messageview;
2030 summaryview->window = window;
2032 mainwin->vbox = vbox;
2033 mainwin->menubar = menubar;
2034 mainwin->handlebox = handlebox;
2035 mainwin->vbox_body = vbox_body;
2036 mainwin->online_switch = online_switch;
2037 mainwin->offline_switch = offline_switch;
2038 #ifndef GENERIC_UMPC
2039 messageview->statusbar = statusbar;
2040 mainwin->statusbar = statusbar;
2041 mainwin->hbox_stat = hbox_stat;
2042 mainwin->progressbar = progressbar;
2043 mainwin->statuslabel = statuslabel;
2044 mainwin->online_pixmap = online_pixmap;
2045 mainwin->offline_pixmap = offline_pixmap;
2046 mainwin->ac_button = ac_button;
2047 mainwin->ac_label = ac_label;
2048 /* set context IDs for status bar */
2049 mainwin->mainwin_cid = gtk_statusbar_get_context_id
2050 (GTK_STATUSBAR(statusbar), "Main Window");
2051 mainwin->folderview_cid = gtk_statusbar_get_context_id
2052 (GTK_STATUSBAR(statusbar), "Folder View");
2053 mainwin->summaryview_cid = gtk_statusbar_get_context_id
2054 (GTK_STATUSBAR(statusbar), "Summary View");
2055 mainwin->messageview_cid = gtk_statusbar_get_context_id
2056 (GTK_STATUSBAR(statusbar), "Message View");
2057 messageview->statusbar_cid = mainwin->messageview_cid;
2059 #else
2060 messageview->statusbar = NULL;
2061 mainwin->statusbar = NULL;
2062 mainwin->hbox_stat = NULL;
2063 /* mainwin->progressbar is set in toolbar.c */
2064 mainwin->statuslabel = NULL;
2065 mainwin->online_pixmap = NULL;
2066 mainwin->offline_pixmap = NULL;
2067 mainwin->ac_button = NULL;
2068 mainwin->ac_label = NULL;
2069 #endif
2071 /* allocate colors for summary view and folder view */
2072 summaryview->color_marked.red = summaryview->color_marked.green = 0;
2073 summaryview->color_marked.blue = (guint16)65535;
2075 summaryview->color_dim.red = summaryview->color_dim.green =
2076 summaryview->color_dim.blue = COLOR_DIM;
2078 folderview->color_new = prefs_common.color[COL_NEW];
2079 folderview->color_op = prefs_common.color[COL_TGT_FOLDER];
2081 debug_print("done.\n");
2083 messageview->visible = prefs_common.msgview_visible;
2085 main_window_set_widgets(mainwin, prefs_common.layout_mode);
2087 g_signal_connect(G_OBJECT(window), "size_allocate",
2088 G_CALLBACK(main_window_size_allocate_cb),
2089 mainwin);
2091 /* set menu items */
2092 cm_toggle_menu_set_active_full(mainwin->ui_manager, "Menu/View/Encoding/"CS_AUTO, TRUE);
2094 menuitem = NULL;
2095 switch (prefs_common.toolbar_style) {
2096 case TOOLBAR_NONE:
2097 menuitem = gtk_ui_manager_get_widget(mainwin->ui_manager, "/Menu/View/ShowHide/Toolbar/Hide");
2098 break;
2099 case TOOLBAR_ICON:
2100 menuitem = gtk_ui_manager_get_widget(mainwin->ui_manager, "/Menu/View/ShowHide/Toolbar/IconOnly");
2101 break;
2102 case TOOLBAR_TEXT:
2103 menuitem = gtk_ui_manager_get_widget(mainwin->ui_manager, "/Menu/View/ShowHide/Toolbar/TextOnly");
2104 break;
2105 case TOOLBAR_BOTH:
2106 menuitem = gtk_ui_manager_get_widget(mainwin->ui_manager, "/Menu/View/ShowHide/Toolbar/TextBelowIcon");
2107 break;
2108 case TOOLBAR_BOTH_HORIZ:
2109 menuitem = gtk_ui_manager_get_widget(mainwin->ui_manager, "/Menu/View/ShowHide/Toolbar/TextBesideIcon");
2111 gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menuitem), TRUE);
2113 toolbar_set_style(mainwin->toolbar->toolbar,
2114 mainwin->handlebox,
2115 prefs_common.toolbar_style);
2116 #ifndef GENERIC_UMPC
2117 gtk_widget_hide(mainwin->hbox_stat);
2118 menuitem = gtk_ui_manager_get_widget(mainwin->ui_manager, "/Menu/View/ShowHide/StatusBar");
2119 gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menuitem),
2120 prefs_common.show_statusbar);
2121 #endif
2122 menuitem = gtk_ui_manager_get_widget(mainwin->ui_manager, "/Menu/View/ShowHide/ColumnHeaders");
2123 gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menuitem),
2124 prefs_common.show_col_headers);
2125 /* set account selection menu */
2126 ac_menu = gtk_ui_manager_get_widget(mainwin->ui_manager, "/Menu/Configuration/ChangeAccount");
2127 mainwin->ac_menu = ac_menu;
2129 toolbar_main_set_sensitive(mainwin);
2131 /* create actions menu */
2132 main_window_update_actions_menu(mainwin);
2134 main_create_mailing_list_menu (mainwin, NULL);
2136 /* attach accel groups to main window */
2137 #define ADD_MENU_ACCEL_GROUP_TO_WINDOW(menu,win) \
2138 gtk_window_add_accel_group \
2139 (GTK_WINDOW(win), \
2140 gtk_ui_manager_get_accel_group(gtkut_ui_manager()));
2142 ADD_MENU_ACCEL_GROUP_TO_WINDOW(summaryview->popupmenu, mainwin->window);
2144 g_signal_connect(G_OBJECT(window), "window_state_event",
2145 G_CALLBACK(mainwindow_state_event_cb), mainwin);
2146 g_signal_connect(G_OBJECT(window), "visibility_notify_event",
2147 G_CALLBACK(mainwindow_visibility_event_cb), mainwin);
2148 gtk_widget_add_events(GTK_WIDGET(window), GDK_VISIBILITY_NOTIFY_MASK);
2150 if (prefs_common.layout_mode == VERTICAL_LAYOUT ||
2151 prefs_common.layout_mode == SMALL_LAYOUT) {
2152 summary_relayout(mainwin->summaryview);
2154 summary_update_unread(mainwin->summaryview, NULL);
2156 /* initialize views */
2157 folderview_init(folderview);
2158 summary_init(summaryview);
2159 messageview_init(messageview);
2160 #ifdef USE_GNUTLS
2161 sslcertwindow_register_hook();
2162 #endif
2163 mainwin->lock_count = 0;
2164 mainwin->menu_lock_count = 0;
2165 mainwin->cursor_count = 0;
2167 mainwin->progressindicator_hook =
2168 hooks_register_hook(PROGRESSINDICATOR_HOOKLIST, mainwindow_progressindicator_hook, mainwin);
2170 if (!watch_cursor)
2171 watch_cursor = gdk_cursor_new_for_display(
2172 gtk_widget_get_display(mainwin->window), GDK_WATCH);
2173 if (!hand_cursor)
2174 hand_cursor = gdk_cursor_new_for_display(
2175 gtk_widget_get_display(mainwin->window), GDK_HAND2);
2177 /* init work_offline */
2178 if (prefs_common.work_offline)
2179 online_switch_clicked (GTK_BUTTON(online_switch), mainwin);
2181 mainwindow_colorlabel_menu_create(mainwin, FALSE);
2182 mainwindow_tags_menu_create(mainwin, FALSE);
2184 if (prefs_common.mainwin_fullscreen) {
2185 cm_toggle_menu_set_active_full(mainwin->ui_manager,
2186 "Menu/View/FullScreen",
2187 TRUE);
2189 if (prefs_common.mainwin_menubar)
2190 cm_toggle_menu_set_active_full(mainwin->ui_manager,"Menu/View/ShowHide/MenuBar", TRUE);
2192 return mainwin;
2195 void main_window_update_actions_menu(MainWindow *mainwin)
2197 action_update_mainwin_menu(mainwin->ui_manager, "/Menu/Tools/Actions", mainwin);
2200 void main_window_cursor_wait(MainWindow *mainwin)
2202 GdkDisplay *display;
2204 display = gdk_display_get_default();
2206 if (mainwin->cursor_count == 0) {
2207 gdk_window_set_cursor(gtk_widget_get_window(mainwin->window), watch_cursor);
2208 textview_cursor_wait(mainwin->messageview->mimeview->textview);
2211 mainwin->cursor_count++;
2213 gdk_display_flush(display);
2216 void main_window_cursor_normal(MainWindow *mainwin)
2218 GdkDisplay *display;
2220 display = gdk_display_get_default();
2222 if (mainwin->cursor_count)
2223 mainwin->cursor_count--;
2225 if (mainwin->cursor_count == 0) {
2226 gdk_window_set_cursor(gtk_widget_get_window(mainwin->window), NULL);
2227 textview_cursor_normal(mainwin->messageview->mimeview->textview);
2229 gdk_display_flush(display);
2232 /* lock / unlock the user-interface */
2233 void main_window_lock(MainWindow *mainwin)
2235 if (mainwin->lock_count == 0 && mainwin->ac_button)
2236 gtk_widget_set_sensitive(mainwin->ac_button, FALSE);
2238 mainwin->lock_count++;
2240 main_window_set_menu_sensitive(mainwin);
2241 toolbar_main_set_sensitive(mainwin);
2244 void main_window_unlock(MainWindow *mainwin)
2246 if (mainwin->lock_count)
2247 mainwin->lock_count--;
2249 main_window_set_menu_sensitive(mainwin);
2250 toolbar_main_set_sensitive(mainwin);
2252 if (mainwin->lock_count == 0 && mainwin->ac_button)
2253 gtk_widget_set_sensitive(mainwin->ac_button, TRUE);
2256 static void main_window_menu_callback_block(MainWindow *mainwin)
2258 mainwin->menu_lock_count++;
2261 static void main_window_menu_callback_unblock(MainWindow *mainwin)
2263 if (mainwin->menu_lock_count)
2264 mainwin->menu_lock_count--;
2267 static guint prefs_tag = 0;
2269 void main_window_reflect_prefs_all(void)
2271 main_window_reflect_prefs_all_real(FALSE);
2274 static gboolean reflect_prefs_timeout_cb(gpointer data)
2276 gboolean pixmap_theme_changed = GPOINTER_TO_INT(data);
2277 GList *cur;
2278 MainWindow *mainwin;
2279 #ifndef GENERIC_UMPC
2280 GtkWidget *pixmap;
2281 #endif
2282 for (cur = mainwin_list; cur != NULL; cur = cur->next) {
2283 mainwin = (MainWindow *)cur->data;
2285 main_window_show_cur_account(mainwin);
2286 main_window_set_menu_sensitive(mainwin);
2287 toolbar_main_set_sensitive(mainwin);
2289 /* pixmap themes */
2290 if (pixmap_theme_changed) {
2291 toolbar_update(TOOLBAR_MAIN, mainwin);
2292 messageview_reflect_prefs_pixmap_theme();
2293 compose_reflect_prefs_pixmap_theme();
2294 folderview_reinit_fonts(mainwin->folderview);
2295 folderview_init(mainwin->folderview);
2296 summary_reflect_prefs_pixmap_theme(mainwin->summaryview);
2297 foldersel_reflect_prefs_pixmap_theme();
2298 #ifndef USE_ALT_ADDRBOOK
2299 addressbook_reflect_prefs_pixmap_theme();
2300 #endif
2301 #ifndef GENERIC_UMPC
2302 pixmap = stock_pixmap_widget(STOCK_PIXMAP_ONLINE);
2303 gtk_container_remove(GTK_CONTAINER(mainwin->online_switch),
2304 mainwin->online_pixmap);
2305 gtk_container_add (GTK_CONTAINER(mainwin->online_switch), pixmap);
2306 gtk_widget_show(pixmap);
2307 mainwin->online_pixmap = pixmap;
2308 pixmap = stock_pixmap_widget(STOCK_PIXMAP_OFFLINE);
2309 gtk_container_remove(GTK_CONTAINER(mainwin->offline_switch),
2310 mainwin->offline_pixmap);
2311 gtk_container_add (GTK_CONTAINER(mainwin->offline_switch), pixmap);
2312 gtk_widget_show(pixmap);
2313 mainwin->offline_pixmap = pixmap;
2314 #endif
2315 hooks_invoke(THEME_CHANGED_HOOKLIST, NULL);
2318 headerview_set_font(mainwin->messageview->headerview);
2319 headerview_set_visibility(mainwin->messageview->headerview,
2320 prefs_common.display_header_pane);
2321 textview_reflect_prefs(mainwin->messageview->mimeview->textview);
2322 folderview_reflect_prefs();
2323 summary_reflect_prefs();
2324 #ifndef GENERIC_UMPC
2325 summary_redisplay_msg(mainwin->summaryview);
2326 #endif
2327 if (prefs_common.layout_mode == SMALL_LAYOUT) {
2328 if (mainwin->in_folder) {
2329 mainwindow_enter_folder(mainwin);
2330 } else {
2331 mainwindow_exit_folder(mainwin);
2335 prefs_tag = 0;
2336 return FALSE;
2339 void main_window_reflect_prefs_all_now(void)
2341 reflect_prefs_timeout_cb(GINT_TO_POINTER(FALSE));
2344 void main_window_reflect_prefs_custom_colors(MainWindow *mainwin)
2346 GtkMenuShell *menu;
2347 GList *children, *cur;
2349 /* re-create colorlabel submenu */
2350 menu = GTK_MENU_SHELL(mainwin->colorlabel_menu);
2351 cm_return_if_fail(menu != NULL);
2353 /* clear items. get item pointers. */
2354 children = gtk_container_get_children(GTK_CONTAINER(menu));
2355 for (cur = children; cur != NULL && cur->data != NULL; cur = cur->next) {
2356 g_signal_handlers_disconnect_matched
2357 (gtk_ui_manager_get_accel_group(mainwin->ui_manager),
2358 G_SIGNAL_MATCH_DATA|G_SIGNAL_MATCH_FUNC,
2359 0, 0, NULL, mainwin_accel_changed_cb, cur->data);
2360 gtk_menu_item_set_submenu(GTK_MENU_ITEM(cur->data), NULL);
2362 g_list_free(children);
2363 mainwindow_colorlabel_menu_create(mainwin, TRUE);
2364 summary_reflect_prefs_custom_colors(mainwin->summaryview);
2365 folderview_reinit_fonts(mainwin->folderview);
2368 static gint tags_tag = 0;
2369 static gboolean main_window_reflect_tags_changes_real(gpointer data)
2371 GtkMenuShell *menu;
2372 GList *children, *cur;
2373 MainWindow *mainwin = (MainWindow *)data;
2375 if (summary_is_locked(mainwin->summaryview)) {
2376 return TRUE;
2378 /* re-create tags submenu */
2379 menu = GTK_MENU_SHELL(mainwin->tags_menu);
2380 cm_return_val_if_fail(menu != NULL, FALSE);
2382 /* clear items. get item pointers. */
2383 children = gtk_container_get_children(GTK_CONTAINER(menu));
2384 for (cur = children; cur != NULL && cur->data != NULL; cur = cur->next) {
2385 gtk_menu_item_set_submenu(GTK_MENU_ITEM(cur->data), NULL);
2387 g_list_free(children);
2388 mainwindow_tags_menu_create(mainwin, TRUE);
2389 summary_reflect_tags_changes(mainwin->summaryview);
2391 tags_tag = 0;
2392 return FALSE;
2395 void main_window_reflect_tags_changes(MainWindow *mainwin)
2397 if (tags_tag == 0) {
2398 tags_tag = g_timeout_add(100, main_window_reflect_tags_changes_real,
2399 mainwin);
2403 void main_window_reflect_prefs_all_real(gboolean pixmap_theme_changed)
2405 if (prefs_tag == 0) {
2406 prefs_tag = g_timeout_add(100, reflect_prefs_timeout_cb,
2407 GINT_TO_POINTER(pixmap_theme_changed));
2411 void main_window_set_summary_column(void)
2413 GList *cur;
2414 MainWindow *mainwin;
2416 for (cur = mainwin_list; cur != NULL; cur = cur->next) {
2417 mainwin = (MainWindow *)cur->data;
2418 summary_set_column_order(mainwin->summaryview);
2422 void main_window_set_folder_column(void)
2424 GList *cur;
2425 MainWindow *mainwin;
2427 for (cur = mainwin_list; cur != NULL; cur = cur->next) {
2428 mainwin = (MainWindow *)cur->data;
2429 folderview_set_column_order(mainwin->folderview);
2433 static void main_window_set_account_selector_menu(MainWindow *mainwin,
2434 GList *account_list)
2436 GList *cur_ac;
2437 GtkWidget *menuitem;
2438 PrefsAccount *ac_prefs;
2439 GtkWidget *menu;
2440 gchar *accel_path;
2442 menu = gtk_menu_new();
2443 gtk_menu_set_accel_group (GTK_MENU (menu),
2444 gtk_ui_manager_get_accel_group(mainwin->ui_manager));
2446 for (cur_ac = account_list; cur_ac != NULL; cur_ac = cur_ac->next) {
2447 ac_prefs = (PrefsAccount *)cur_ac->data;
2449 menuitem = gtk_menu_item_new_with_label
2450 (ac_prefs->account_name
2451 ? ac_prefs->account_name : _("Untitled"));
2452 gtk_widget_show(menuitem);
2453 gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem);
2454 g_signal_connect(G_OBJECT(menuitem), "activate",
2455 G_CALLBACK(account_selector_menu_cb),
2456 ac_prefs);
2457 accel_path = g_strconcat("<Actions>/Menu/Configuration/ChangeAccount/",(ac_prefs->account_name
2458 ? ac_prefs->account_name : _("Untitled")), NULL );
2459 gtk_menu_item_set_accel_path(GTK_MENU_ITEM(menuitem), accel_path);
2460 g_free(accel_path);
2462 gtk_menu_item_set_submenu(GTK_MENU_ITEM(mainwin->ac_menu), menu);
2465 static void main_window_set_account_receive_menu(MainWindow *mainwin,
2466 GList *account_list)
2468 GList *children, *child;
2469 GtkWidget *menu;
2470 GtkWidget *menuitem;
2471 PrefsAccount *ac_prefs;
2473 menu = gtk_menu_item_get_submenu(GTK_MENU_ITEM(
2474 gtk_ui_manager_get_widget(mainwin->ui_manager, "/Menu/Message/Receive")));
2476 /* search for separator */
2477 children = gtk_container_get_children(GTK_CONTAINER(menu));
2478 for (child = children; child != NULL; child = child->next) {
2479 if (child->data == gtk_ui_manager_get_widget(mainwin->ui_manager, "/Menu/Message/Receive/Separator1")) {
2480 child = child->next;
2481 break;
2485 /* destroy all previous menu item */
2486 while (child != NULL) {
2487 gtk_widget_destroy(GTK_WIDGET(child->data));
2488 child = child->next;
2491 g_list_free(children);
2493 for (child = account_list; child != NULL; child = child->next) {
2494 ac_prefs = (PrefsAccount *)child->data;
2496 if (ac_prefs->protocol == A_NONE)
2497 continue;
2499 menuitem = gtk_menu_item_new_with_label
2500 (ac_prefs->account_name ? ac_prefs->account_name
2501 : _("Untitled"));
2502 gtk_widget_show(menuitem);
2503 gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem);
2504 g_signal_connect(G_OBJECT(menuitem), "activate",
2505 G_CALLBACK(account_receive_menu_cb),
2506 ac_prefs);
2510 static void main_window_set_toolbar_combo_receive_menu(MainWindow *mainwin,
2511 GList *account_list)
2513 GList *cur_ac;
2514 GtkWidget *menuitem;
2515 PrefsAccount *ac_prefs;
2516 GtkWidget *menu = NULL;
2518 if (mainwin->toolbar->getall_btn == NULL) /* button doesn't exist */
2519 return;
2521 menu = gtk_menu_tool_button_get_menu(GTK_MENU_TOOL_BUTTON(mainwin->toolbar->getall_btn));
2522 if (menu)
2523 gtk_widget_destroy(menu);
2524 menu = gtk_menu_new();
2526 for (cur_ac = account_list; cur_ac != NULL; cur_ac = cur_ac->next) {
2527 ac_prefs = (PrefsAccount *)cur_ac->data;
2529 if (ac_prefs->protocol == A_NONE)
2530 continue;
2532 menuitem = gtk_menu_item_new_with_label
2533 (ac_prefs->account_name
2534 ? ac_prefs->account_name : _("Untitled"));
2535 gtk_widget_show(menuitem);
2536 gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem);
2537 g_signal_connect(G_OBJECT(menuitem), "activate",
2538 G_CALLBACK(account_receive_menu_cb),
2539 ac_prefs);
2541 gtk_menu_tool_button_set_menu(GTK_MENU_TOOL_BUTTON(mainwin->toolbar->getall_btn), menu);
2544 static void main_window_set_toolbar_combo_compose_menu(MainWindow *mainwin,
2545 GList *account_list)
2547 #ifndef GENERIC_UMPC
2548 GList *cur_ac;
2549 GtkWidget *menuitem;
2550 PrefsAccount *ac_prefs;
2551 GtkWidget *menu = NULL;
2553 if (mainwin->toolbar->compose_mail_btn == NULL) /* button doesn't exist */
2554 return;
2556 menu = gtk_menu_tool_button_get_menu(GTK_MENU_TOOL_BUTTON(mainwin->toolbar->compose_mail_btn));
2557 if (menu)
2558 gtk_widget_destroy(menu);
2559 menu = gtk_menu_new();
2561 for (cur_ac = account_list; cur_ac != NULL; cur_ac = cur_ac->next) {
2562 ac_prefs = (PrefsAccount *)cur_ac->data;
2564 menuitem = gtk_menu_item_new_with_label
2565 (ac_prefs->account_name
2566 ? ac_prefs->account_name : _("Untitled"));
2567 gtk_widget_show(menuitem);
2568 gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem);
2569 g_signal_connect(G_OBJECT(menuitem), "activate",
2570 G_CALLBACK(account_compose_menu_cb),
2571 ac_prefs);
2573 gtk_menu_tool_button_set_menu(GTK_MENU_TOOL_BUTTON(mainwin->toolbar->compose_mail_btn), menu);
2574 #endif
2577 void main_window_set_account_menu(GList *account_list)
2579 GList *cur;
2580 MainWindow *mainwin;
2582 for (cur = mainwin_list; cur != NULL; cur = cur->next) {
2583 mainwin = (MainWindow *)cur->data;
2584 main_window_set_account_selector_menu(mainwin, account_list);
2585 main_window_set_account_receive_menu(mainwin, account_list);
2586 main_window_set_toolbar_combo_receive_menu(mainwin, account_list);
2587 main_window_set_toolbar_combo_compose_menu(mainwin, account_list);
2589 hooks_invoke(ACCOUNT_LIST_CHANGED_HOOKLIST, NULL);
2592 void main_window_set_account_menu_only_toolbar(GList *account_list)
2594 GList *cur;
2595 MainWindow *mainwin;
2597 for (cur = mainwin_list; cur != NULL; cur = cur->next) {
2598 mainwin = (MainWindow *)cur->data;
2599 main_window_set_toolbar_combo_receive_menu(mainwin, account_list);
2600 main_window_set_toolbar_combo_compose_menu(mainwin, account_list);
2604 static void main_window_show_cur_account(MainWindow *mainwin)
2606 gchar *buf;
2607 gchar *ac_name;
2609 ac_name = g_strdup(cur_account
2610 ? (cur_account->account_name
2611 ? cur_account->account_name : _("Untitled"))
2612 : _("none"));
2614 if (cur_account)
2615 buf = g_strdup_printf("%s - %s", ac_name, PROG_VERSION);
2616 else
2617 buf = g_strdup(PROG_VERSION);
2618 gtk_window_set_title(GTK_WINDOW(mainwin->window), buf);
2619 g_free(buf);
2621 if (mainwin->ac_label)
2622 gtk_label_set_text(GTK_LABEL(mainwin->ac_label), ac_name);
2623 if (mainwin->ac_button)
2624 gtk_widget_queue_resize(mainwin->ac_button);
2626 g_free(ac_name);
2628 #ifndef GENERIC_UMPC
2629 static void main_window_separation_change(MainWindow *mainwin, LayoutType layout_mode)
2631 GtkWidget *folder_wid = GTK_WIDGET_PTR(mainwin->folderview);
2632 GtkWidget *summary_wid = GTK_WIDGET_PTR(mainwin->summaryview);
2633 GtkWidget *message_wid = mainwin->messageview->vbox;
2635 if (layout_mode == prefs_common.layout_mode)
2636 return;
2638 debug_print("Changing window separation type from %d to %d\n",
2639 prefs_common.layout_mode, layout_mode);
2641 /* remove widgets from those containers */
2642 g_object_ref(folder_wid);
2643 g_object_ref(summary_wid);
2644 g_object_ref(message_wid);
2645 gtk_container_remove
2646 (GTK_CONTAINER(gtk_widget_get_parent(folder_wid)), folder_wid);
2647 gtk_container_remove
2648 (GTK_CONTAINER(gtk_widget_get_parent(summary_wid)), summary_wid);
2649 gtk_container_remove
2650 (GTK_CONTAINER(gtk_widget_get_parent(message_wid)), message_wid);
2652 gtk_widget_hide(mainwin->window);
2653 main_window_set_widgets(mainwin, layout_mode);
2654 gtk_widget_show(mainwin->window);
2656 g_object_unref(folder_wid);
2657 g_object_unref(summary_wid);
2658 g_object_unref(message_wid);
2660 #endif
2661 void mainwindow_reset_paned(GtkPaned *paned)
2663 gint min, max, mid;
2665 if (gtk_paned_get_child1(GTK_PANED(paned)))
2666 gtk_widget_show(gtk_paned_get_child1(GTK_PANED(paned)));
2667 if (gtk_paned_get_child2(GTK_PANED(paned)))
2668 gtk_widget_show(gtk_paned_get_child2(GTK_PANED(paned)));
2670 GTK_EVENTS_FLUSH();
2671 g_object_get (G_OBJECT(paned),
2672 "min-position",
2673 &min, NULL);
2674 g_object_get (G_OBJECT(paned),
2675 "max-position",
2676 &max, NULL);
2677 mid = (min+max)/2;
2678 gtk_paned_set_position(GTK_PANED(paned), mid);
2681 static void mainwin_paned_show_first(GtkPaned *paned)
2683 gint max;
2684 g_object_get (G_OBJECT(paned),
2685 "max-position",
2686 &max, NULL);
2688 if (gtk_paned_get_child1(GTK_PANED(paned)))
2689 gtk_widget_show(gtk_paned_get_child1(GTK_PANED(paned)));
2690 if (gtk_paned_get_child2(GTK_PANED(paned)))
2691 gtk_widget_hide(gtk_paned_get_child2(GTK_PANED(paned)));
2692 gtk_paned_set_position(GTK_PANED(paned), max);
2695 static void mainwin_paned_show_last(GtkPaned *paned)
2697 gint min;
2698 g_object_get (G_OBJECT(paned),
2699 "min-position",
2700 &min, NULL);
2702 if (gtk_paned_get_child1(GTK_PANED(paned)))
2703 gtk_widget_hide(gtk_paned_get_child1(GTK_PANED(paned)));
2704 if (gtk_paned_get_child2(GTK_PANED(paned)))
2705 gtk_widget_show(gtk_paned_get_child2(GTK_PANED(paned)));
2706 gtk_paned_set_position(GTK_PANED(paned), min);
2709 void main_window_toggle_message_view(MainWindow *mainwin)
2711 SummaryView *summaryview = mainwin->summaryview;
2712 GtkWidget *ppaned = NULL;
2713 GtkWidget *container = NULL;
2715 switch (prefs_common.layout_mode) {
2716 case NORMAL_LAYOUT:
2717 case VERTICAL_LAYOUT:
2718 case SMALL_LAYOUT:
2719 ppaned = mainwin->vpaned;
2720 container = mainwin->hpaned;
2721 if (gtk_widget_get_parent(ppaned) != NULL) {
2722 mainwin->messageview->visible = FALSE;
2723 summaryview->displayed = NULL;
2724 g_object_ref(ppaned);
2725 gtk_container_remove(GTK_CONTAINER(container), ppaned);
2726 gtk_widget_reparent(GTK_WIDGET_PTR(summaryview), container);
2727 } else {
2728 mainwin->messageview->visible = TRUE;
2729 gtk_widget_reparent(GTK_WIDGET_PTR(summaryview), ppaned);
2730 gtk_container_add(GTK_CONTAINER(container), ppaned);
2731 g_object_unref(ppaned);
2733 break;
2734 case WIDE_LAYOUT:
2735 container = mainwin->vpaned;
2736 if (gtk_widget_get_parent(mainwin->messageview->vbox) != NULL) {
2737 mainwin->messageview->visible = FALSE;
2738 summaryview->displayed = NULL;
2739 g_object_ref(mainwin->messageview->vbox);
2740 gtk_container_remove(GTK_CONTAINER(container), mainwin->messageview->vbox);
2741 } else {
2742 mainwin->messageview->visible = TRUE;
2743 gtk_container_add(GTK_CONTAINER(container), mainwin->messageview->vbox);
2744 g_object_unref(mainwin->messageview->vbox);
2746 break;
2747 case WIDE_MSGLIST_LAYOUT:
2748 g_warning("can't hide messageview in this wide msglist layout");
2749 break;
2752 if (messageview_is_visible(mainwin->messageview))
2753 gtk_image_set_from_icon_name(GTK_IMAGE(mainwin->summaryview->toggle_arrow),
2754 "pan-down-symbolic", GTK_ICON_SIZE_MENU);
2755 else
2756 gtk_image_set_from_icon_name(GTK_IMAGE(mainwin->summaryview->toggle_arrow),
2757 "pan-up-symbolic", GTK_ICON_SIZE_MENU);
2759 if (mainwin->messageview->visible == FALSE)
2760 messageview_clear(mainwin->messageview);
2762 main_window_set_menu_sensitive(mainwin);
2764 prefs_common.msgview_visible = mainwin->messageview->visible;
2766 if (messageview_is_visible(mainwin->messageview)) {
2767 gtk_widget_queue_resize(mainwin->hpaned);
2768 gtk_widget_queue_resize(mainwin->vpaned);
2770 summary_grab_focus(summaryview);
2771 if (!summary_is_list(summaryview)) {
2772 summary_show(summaryview, summaryview->folder_item, FALSE);
2776 void main_window_get_size(MainWindow *mainwin)
2778 GtkAllocation allocation;
2780 if (mainwin_list == NULL || mainwin->messageview == NULL) {
2781 debug_print("called after messageview "
2782 "has been deallocated!\n");
2783 return;
2786 if (prefs_common.mainwin_fullscreen) {
2787 debug_print("mainwin in full screen state. "
2788 "Keeping original settings\n");
2791 gtk_widget_get_allocation(GTK_WIDGET_PTR(mainwin->summaryview), &allocation);
2792 if (allocation.width > 1 && allocation.height > 1 && !prefs_common.mainwin_fullscreen) {
2793 prefs_common.summaryview_width = allocation.width;
2795 if (messageview_is_visible(mainwin->messageview))
2796 prefs_common.summaryview_height = allocation.height;
2798 prefs_common.mainview_width = allocation.width;
2801 gtk_window_get_size(GTK_WINDOW(mainwin->window), &allocation.width, &allocation.height);
2802 if (allocation.width > 1 && allocation.height > 1 &&
2803 !prefs_common.mainwin_maximised && !prefs_common.mainwin_fullscreen) {
2804 prefs_common.mainview_height = allocation.height;
2805 prefs_common.mainwin_width = allocation.width;
2806 prefs_common.mainwin_height = allocation.height;
2809 gtk_widget_get_allocation(GTK_WIDGET_PTR(mainwin->folderview), &allocation);
2810 if (allocation.width > 1 && allocation.height > 1 &&
2811 !prefs_common.mainwin_fullscreen) {
2812 prefs_common.folderview_width = allocation.width;
2813 prefs_common.folderview_height = allocation.height;
2816 gtk_widget_get_allocation(GTK_WIDGET_PTR(mainwin->messageview), &allocation);
2817 if (allocation.width > 1 && allocation.height > 1 &&
2818 !prefs_common.mainwin_fullscreen) {
2819 prefs_common.msgview_width = allocation.width;
2820 prefs_common.msgview_height = allocation.height;
2823 /* debug_print("summaryview size: %d x %d\n",
2824 prefs_common.summaryview_width,
2825 prefs_common.summaryview_height);
2826 debug_print("folderview size: %d x %d\n",
2827 prefs_common.folderview_width,
2828 prefs_common.folderview_height);
2829 debug_print("messageview size: %d x %d\n",
2830 prefs_common.msgview_width,
2831 prefs_common.msgview_height); */
2834 void main_window_get_position(MainWindow *mainwin)
2836 gint x, y;
2838 if (prefs_common.mainwin_maximised || prefs_common.mainwin_fullscreen)
2839 return;
2841 gtk_window_get_position(GTK_WINDOW(mainwin->window), &x, &y);
2843 prefs_common.mainview_x = x;
2844 prefs_common.mainview_y = y;
2845 prefs_common.mainwin_x = x;
2846 prefs_common.mainwin_y = y;
2848 debug_print("main window position: %d, %d\n", x, y);
2851 void main_window_progress_on(MainWindow *mainwin)
2853 gtk_progress_bar_set_text(GTK_PROGRESS_BAR(mainwin->progressbar), "");
2856 void main_window_progress_off(MainWindow *mainwin)
2858 gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(mainwin->progressbar), 0.0);
2859 gtk_progress_bar_set_text(GTK_PROGRESS_BAR(mainwin->progressbar), "");
2862 gboolean main_window_empty_trash(MainWindow *mainwin, gboolean confirm, gboolean for_quit)
2864 if (confirm && procmsg_have_trashed_mails_fast()) {
2865 AlertValue val;
2867 if (for_quit)
2868 val = alertpanel(_("Empty trash"),
2869 _("Delete all messages in trash folders?"),
2870 NULL, _("_No"), NULL, _("_Yes"), NULL, _("Don't quit"),
2871 ALERTFOCUS_SECOND);
2872 else
2873 val = alertpanel(_("Empty trash"),
2874 _("Delete all messages in trash folders?"),
2875 NULL, _("_No"), NULL, _("_Yes"), NULL, NULL,
2876 ALERTFOCUS_SECOND);
2877 if (val == G_ALERTALTERNATE) {
2878 debug_print("will empty trash\n");
2879 } else if (val == G_ALERTDEFAULT) {
2880 debug_print("will not empty trash\n");
2881 return TRUE;
2882 } else {
2883 return FALSE; /* cancel exit */
2885 manage_window_focus_in(mainwin->window, NULL, NULL);
2888 procmsg_empty_all_trash();
2890 if (mainwin->summaryview->folder_item &&
2891 mainwin->summaryview->folder_item->stype == F_TRASH)
2892 folderview_grab_focus(mainwin->folderview);
2893 return TRUE;
2896 static void main_window_add_mailbox(MainWindow *mainwin)
2898 gchar *path;
2899 Folder *folder;
2901 path = input_dialog(_("Add mailbox"),
2902 _("Input the location of the mailbox.\n"
2903 "The location can be either the full path or relative to the \n"
2904 "home directory.\n"
2905 "If the location of an existing mailbox is specified, it will be\n"
2906 "scanned automatically."),
2907 "Mail");
2908 if (!path) return;
2909 if (folder_find_from_path(path)) {
2910 alertpanel_error(_("The mailbox '%s' already exists."), path);
2911 g_free(path);
2912 return;
2914 folder = folder_new(folder_get_class_from_string("mh"),
2915 !strcmp(path, "Mail") ? _("Mailbox") :
2916 g_path_get_basename(path), path);
2917 g_free(path);
2919 if (folder->klass->create_tree(folder) < 0) {
2920 alertpanel_error(_("Creation of the mailbox failed.\n"
2921 "Maybe some files already exist, or you don't have the permission to write there."));
2922 folder_destroy(folder);
2923 return;
2926 folder_add(folder);
2927 folder_set_ui_func(folder, scan_tree_func, mainwin);
2928 folder_scan_tree(folder, TRUE);
2929 folder_set_ui_func(folder, NULL, NULL);
2932 SensitiveCondMask main_window_get_current_state(MainWindow *mainwin)
2934 SensitiveCondMask state = 0;
2935 SummarySelection selection;
2936 FolderItem *item = mainwin->summaryview->folder_item;
2937 GList *account_list = account_get_list();
2938 GSList *tmp;
2940 selection = summary_get_selection_type(mainwin->summaryview);
2942 #define UPDATE_STATE(...) \
2943 do { \
2944 state |= main_window_get_mask(__VA_ARGS__, -1); \
2945 } while (0)
2947 if (mainwin->lock_count == 0 && !claws_is_starting())
2948 UPDATE_STATE(M_UNLOCKED);
2949 if (selection != SUMMARY_NONE && selection != SUMMARY_SELECTED_NONE)
2950 UPDATE_STATE(M_MSG_EXIST);
2951 if (item && item->path && folder_item_parent(item) && !item->no_select) {
2952 UPDATE_STATE(M_EXEC);
2953 /* if (item->folder->type != F_NEWS) */
2954 UPDATE_STATE(M_ALLOW_DELETE);
2956 if (prefs_common.immediate_exec == 0
2957 && mainwin->lock_count == 0)
2958 UPDATE_STATE(M_DELAY_EXEC);
2960 if ((selection == SUMMARY_NONE && item->hide_read_msgs)
2961 || selection != SUMMARY_NONE)
2962 UPDATE_STATE(M_HIDE_READ_MSG);
2964 if ((selection == SUMMARY_NONE && item->hide_read_threads)
2965 || selection != SUMMARY_NONE)
2966 UPDATE_STATE(M_HIDE_READ_THREADS);
2968 if (mainwin->summaryview->threaded)
2969 UPDATE_STATE(M_THREADED);
2970 else
2971 UPDATE_STATE(M_UNTHREADED);
2972 if (selection == SUMMARY_SELECTED_SINGLE ||
2973 selection == SUMMARY_SELECTED_MULTIPLE)
2974 UPDATE_STATE(M_TARGET_EXIST);
2975 if (selection == SUMMARY_SELECTED_SINGLE)
2976 UPDATE_STATE(M_SINGLE_TARGET_EXIST);
2977 if (mainwin->summaryview->folder_item &&
2978 mainwin->summaryview->folder_item->folder->klass->type == F_NEWS)
2979 UPDATE_STATE(M_NEWS);
2980 else
2981 UPDATE_STATE(M_NOT_NEWS);
2982 if (mainwin->summaryview->folder_item &&
2983 (mainwin->summaryview->folder_item->stype != F_TRASH ||
2984 !folder_has_parent_of_type(mainwin->summaryview->folder_item, F_TRASH)))
2985 UPDATE_STATE(M_NOT_TRASH);
2987 if (mainwin->summaryview->folder_item
2988 && mainwin->summaryview->folder_item->stype != F_DRAFT)
2989 UPDATE_STATE(M_NOT_DRAFT);
2991 if (prefs_common.actions_list && g_slist_length(prefs_common.actions_list))
2992 UPDATE_STATE(M_ACTIONS_EXIST);
2994 tmp = tags_get_list();
2995 if (tmp && g_slist_length(tmp))
2996 UPDATE_STATE(M_TAGS_EXIST);
2997 g_slist_free(tmp);
2999 if (procmsg_have_queued_mails_fast() && !procmsg_is_sending())
3000 UPDATE_STATE(M_HAVE_QUEUED_MAILS);
3002 if (selection == SUMMARY_SELECTED_SINGLE &&
3003 (item &&
3004 (folder_has_parent_of_type(item, F_DRAFT) ||
3005 folder_has_parent_of_type(item, F_OUTBOX) ||
3006 folder_has_parent_of_type(item, F_QUEUE))))
3007 UPDATE_STATE(M_ALLOW_REEDIT);
3008 if (cur_account)
3009 UPDATE_STATE(M_HAVE_ACCOUNT);
3011 if (cur_account && cur_account->protocol != A_NONE)
3012 UPDATE_STATE(M_HAVE_RETRIEVABLE_ACCOUNT);
3014 if (any_folder_want_synchronise())
3015 UPDATE_STATE(M_WANT_SYNC);
3017 if (item && item->prefs->processing && selection != SUMMARY_NONE)
3018 UPDATE_STATE(M_HAVE_PROCESSING);
3020 if (g_list_length(account_list) > 1)
3021 UPDATE_STATE(M_HAVE_MULTI_ACCOUNT);
3023 for (account_list = account_get_list(); account_list != NULL; account_list = account_list->next) {
3024 if (((PrefsAccount*)account_list->data)->protocol != A_NONE) {
3025 UPDATE_STATE(M_HAVE_ANY_RETRIEVABLE_ACCOUNT);
3026 break;
3030 for (account_list = account_get_list(); account_list != NULL; account_list = account_list->next) {
3031 if (((PrefsAccount*)account_list->data)->protocol == A_NNTP) {
3032 UPDATE_STATE(M_HAVE_NEWS_ACCOUNT);
3033 break;
3037 if (procmsg_spam_can_learn() &&
3038 (mainwin->summaryview->folder_item &&
3039 mainwin->summaryview->folder_item->folder->klass->type != F_UNKNOWN &&
3040 mainwin->summaryview->folder_item->folder->klass->type != F_NEWS)) {
3041 UPDATE_STATE(M_CAN_LEARN_SPAM);
3044 if (mainwin->summaryview->folder_item) {
3045 UPDATE_STATE(M_FOLDER_SELECTED);
3048 if (inc_is_active())
3049 UPDATE_STATE(M_INC_ACTIVE);
3050 if (imap_cancel_all_enabled())
3051 UPDATE_STATE(M_INC_ACTIVE);
3053 if (send_is_active() | procmsg_is_sending())
3054 UPDATE_STATE(M_SEND_ACTIVE);
3056 if (mainwin->summaryview->deleted > 0)
3057 UPDATE_STATE(M_DELETED_EXISTS);
3059 if (mainwin->summaryview->deleted > 0 ||
3060 mainwin->summaryview->moved > 0 ||
3061 mainwin->summaryview->copied > 0)
3062 UPDATE_STATE(M_DELAY_EXEC);
3064 if (summary_is_list(mainwin->summaryview))
3065 UPDATE_STATE(M_SUMMARY_ISLIST);
3067 if (prefs_common.layout_mode != SMALL_LAYOUT || mainwin->in_folder)
3068 UPDATE_STATE(M_IN_MSGLIST);
3070 for (account_list = account_get_list(); account_list != NULL; account_list = account_list->next) {
3071 PrefsAccount *account = account_list->data;
3072 if (account->session_passwd || account->session_smtp_passwd) {
3073 UPDATE_STATE(M_SESSION_PASSWORDS);
3074 break;
3078 #ifndef PASSWORD_CRYPTO_OLD
3079 if (primary_passphrase_is_entered()) {
3080 UPDATE_STATE(M_MASTER_PASSPHRASE);
3082 #endif
3084 #undef UPDATE_STATE
3086 return state;
3089 SensitiveCondMask main_window_get_mask(SensitiveCond cond, ...)
3091 va_list args;
3092 gint i;
3093 SensitiveCondMask value;
3094 static SensitiveCondMask SensitiveCond_table[M_MAX_RESERVED];
3095 static gboolean first_time = TRUE;
3097 if (first_time) {
3098 for (i = 0; i < M_MAX_RESERVED; i++)
3099 SensitiveCond_table[i] = (SensitiveCondMask) ((SensitiveCondMask)1 << i);
3100 first_time = FALSE;
3103 value = 0;
3105 va_start(args, cond);
3106 for (i = (gint) cond; i >= 0; i = va_arg(args, gint))
3107 value |= SensitiveCond_table[i];
3108 va_end(args);
3110 return value;
3113 void main_window_set_menu_sensitive(MainWindow *mainwin)
3115 SensitiveCondMask state;
3116 gboolean sensitive;
3117 SummaryView *summaryview;
3118 gchar *menu_path;
3119 GtkWidget *menu;
3120 GList *children, *cur_item;
3121 gboolean mimepart_selected = FALSE;
3123 state = main_window_get_current_state(mainwin);
3125 #define SET_SENSITIVE(entry_str, ...) \
3127 SensitiveCondMask cond = main_window_get_mask(__VA_ARGS__, -1); \
3128 cm_menu_set_sensitive_full(mainwin->ui_manager, \
3129 (const gchar *) entry_str, \
3130 ((cond & state) == cond)); \
3132 SET_SENSITIVE("Menu/File/SaveAs", M_TARGET_EXIST);
3133 SET_SENSITIVE("Menu/File/SavePartAs", M_SINGLE_TARGET_EXIST);
3134 SET_SENSITIVE("Menu/File/Print", M_TARGET_EXIST);
3135 SET_SENSITIVE("Menu/File/SynchroniseFolders", M_WANT_SYNC);
3136 SET_SENSITIVE("Menu/File/Exit", M_UNLOCKED);
3138 SET_SENSITIVE("Menu/Edit/SelectThread", M_TARGET_EXIST, M_SUMMARY_ISLIST);
3139 SET_SENSITIVE("Menu/Edit/Find", M_SINGLE_TARGET_EXIST);
3140 SET_SENSITIVE("Menu/Edit/QuickSearch", M_IN_MSGLIST);
3141 SET_SENSITIVE("Menu/Edit/SearchFolder", M_TARGET_EXIST, M_SUMMARY_ISLIST);
3143 SET_SENSITIVE("Menu/View/SetColumns/Folderlist", M_UNLOCKED, M_SUMMARY_ISLIST);
3144 SET_SENSITIVE("Menu/View/Sort", M_EXEC, M_SUMMARY_ISLIST);
3145 SET_SENSITIVE("Menu/View/ThreadView", M_EXEC, M_SUMMARY_ISLIST);
3146 SET_SENSITIVE("Menu/View/ExpandThreads", M_MSG_EXIST, M_SUMMARY_ISLIST);
3147 SET_SENSITIVE("Menu/View/CollapseThreads", M_MSG_EXIST, M_SUMMARY_ISLIST);
3148 SET_SENSITIVE("Menu/View/HideReadThreads", M_HIDE_READ_THREADS, M_SUMMARY_ISLIST, M_NOT_DRAFT);
3149 SET_SENSITIVE("Menu/View/HideReadMessages", M_HIDE_READ_MSG, M_SUMMARY_ISLIST, M_NOT_DRAFT);
3150 SET_SENSITIVE("Menu/View/HideDelMessages", M_SUMMARY_ISLIST, M_NOT_DRAFT);
3151 SET_SENSITIVE("Menu/View/Goto/Prev", M_MSG_EXIST);
3152 SET_SENSITIVE("Menu/View/Goto/Next", M_MSG_EXIST);
3153 SET_SENSITIVE("Menu/View/Goto/PrevUnread", M_MSG_EXIST);
3154 SET_SENSITIVE("Menu/View/Goto/NextUnread", M_MSG_EXIST);
3155 SET_SENSITIVE("Menu/View/Goto/PrevNew", M_MSG_EXIST);
3156 SET_SENSITIVE("Menu/View/Goto/NextNew", M_MSG_EXIST);
3157 SET_SENSITIVE("Menu/View/Goto/PrevMarked", M_MSG_EXIST);
3158 SET_SENSITIVE("Menu/View/Goto/NextMarked", M_MSG_EXIST);
3159 SET_SENSITIVE("Menu/View/Goto/PrevLabeled", M_MSG_EXIST);
3160 SET_SENSITIVE("Menu/View/Goto/NextLabeled", M_MSG_EXIST);
3161 SET_SENSITIVE("Menu/View/Goto/ParentMessage", M_SINGLE_TARGET_EXIST);
3162 SET_SENSITIVE("Menu/View/Goto/NextPart", M_SINGLE_TARGET_EXIST);
3163 SET_SENSITIVE("Menu/View/Goto/PrevPart", M_SINGLE_TARGET_EXIST);
3164 SET_SENSITIVE("Menu/View/OpenNewWindow", M_SINGLE_TARGET_EXIST);
3165 SET_SENSITIVE("Menu/View/MessageSource", M_SINGLE_TARGET_EXIST);
3166 SET_SENSITIVE("Menu/View/Part", M_SINGLE_TARGET_EXIST);
3167 SET_SENSITIVE("Menu/View/AllHeaders", M_SINGLE_TARGET_EXIST);
3168 SET_SENSITIVE("Menu/View/Quotes", M_SINGLE_TARGET_EXIST);
3170 SET_SENSITIVE("Menu/Message/Receive/CurrentAccount", M_HAVE_ACCOUNT, M_UNLOCKED, M_HAVE_RETRIEVABLE_ACCOUNT);
3171 SET_SENSITIVE("Menu/Message/Receive/AllAccounts", M_HAVE_ACCOUNT, M_UNLOCKED, M_HAVE_ANY_RETRIEVABLE_ACCOUNT);
3172 SET_SENSITIVE("Menu/Message/Receive/CancelReceiving", M_INC_ACTIVE);
3173 SET_SENSITIVE("Menu/Message/SendQueue", M_HAVE_ACCOUNT, M_HAVE_QUEUED_MAILS);
3174 SET_SENSITIVE("Menu/Message/CancelSending", M_SEND_ACTIVE);
3175 SET_SENSITIVE("Menu/Message/ComposeEmail", M_HAVE_ACCOUNT);
3176 SET_SENSITIVE("Menu/Message/ComposeNews", M_HAVE_NEWS_ACCOUNT);
3177 SET_SENSITIVE("Menu/Message/Reply", M_HAVE_ACCOUNT, M_TARGET_EXIST, M_SUMMARY_ISLIST);
3178 SET_SENSITIVE("Menu/Message/ReplyTo", M_HAVE_ACCOUNT, M_TARGET_EXIST, M_SUMMARY_ISLIST);
3179 SET_SENSITIVE("Menu/Message/FollowupReply", M_HAVE_ACCOUNT, M_TARGET_EXIST, M_NEWS, M_SUMMARY_ISLIST);
3180 SET_SENSITIVE("Menu/Message/Forward", M_HAVE_ACCOUNT, M_TARGET_EXIST, M_SUMMARY_ISLIST);
3181 SET_SENSITIVE("Menu/Message/ForwardAtt", M_HAVE_ACCOUNT, M_TARGET_EXIST, M_SUMMARY_ISLIST);
3182 SET_SENSITIVE("Menu/Message/Redirect", M_HAVE_ACCOUNT, M_TARGET_EXIST, M_SUMMARY_ISLIST);
3183 SET_SENSITIVE("Menu/Message/Move", M_TARGET_EXIST, M_ALLOW_DELETE, M_NOT_NEWS);
3184 SET_SENSITIVE("Menu/Message/Copy", M_TARGET_EXIST, M_EXEC);
3185 SET_SENSITIVE("Menu/Message/Trash", M_TARGET_EXIST, M_ALLOW_DELETE, M_NOT_NEWS, M_NOT_TRASH);
3186 SET_SENSITIVE("Menu/Message/Delete", M_TARGET_EXIST, M_ALLOW_DELETE);
3187 SET_SENSITIVE("Menu/Message/TrashThread", M_TARGET_EXIST, M_SUMMARY_ISLIST);
3188 SET_SENSITIVE("Menu/Message/DeleteThread", M_TARGET_EXIST, M_SUMMARY_ISLIST);
3189 SET_SENSITIVE("Menu/Message/CancelNews", M_TARGET_EXIST, M_ALLOW_DELETE, M_NEWS);
3190 SET_SENSITIVE("Menu/Message/Mark", M_TARGET_EXIST, M_SUMMARY_ISLIST);
3191 SET_SENSITIVE("Menu/Message/Mark/MarkSpam", M_TARGET_EXIST, M_CAN_LEARN_SPAM);
3192 SET_SENSITIVE("Menu/Message/Mark/MarkHam", M_TARGET_EXIST, M_CAN_LEARN_SPAM);
3193 SET_SENSITIVE("Menu/Message/Mark/IgnoreThread", M_TARGET_EXIST);
3194 SET_SENSITIVE("Menu/Message/Mark/UnignoreThread", M_TARGET_EXIST);
3195 SET_SENSITIVE("Menu/Message/Mark/Lock", M_TARGET_EXIST);
3196 SET_SENSITIVE("Menu/Message/Mark/Unlock", M_TARGET_EXIST);
3197 SET_SENSITIVE("Menu/Message/ColorLabel", M_TARGET_EXIST);
3198 SET_SENSITIVE("Menu/Message/Tags", M_TARGET_EXIST);
3199 SET_SENSITIVE("Menu/Message/Reedit", M_HAVE_ACCOUNT, M_ALLOW_REEDIT);
3200 SET_SENSITIVE("Menu/Message/CheckSignature", M_SINGLE_TARGET_EXIST);
3202 SET_SENSITIVE("Menu/Tools/AddSenderToAB", M_SINGLE_TARGET_EXIST);
3203 SET_SENSITIVE("Menu/Tools/CollectAddresses", M_FOLDER_SELECTED);
3204 SET_SENSITIVE("Menu/Tools/CollectAddresses/FromFolder", M_FOLDER_SELECTED);
3205 SET_SENSITIVE("Menu/Tools/CollectAddresses/FromSelected", M_TARGET_EXIST);
3206 SET_SENSITIVE("Menu/Tools/FilterFolder", M_MSG_EXIST, M_EXEC);
3207 SET_SENSITIVE("Menu/Tools/FilterSelected", M_TARGET_EXIST, M_EXEC);
3208 SET_SENSITIVE("Menu/Tools/RunProcessing", M_HAVE_PROCESSING);
3209 SET_SENSITIVE("Menu/Tools/CreateFilterRule", M_SINGLE_TARGET_EXIST, M_UNLOCKED);
3210 SET_SENSITIVE("Menu/Tools/CreateProcessingRule", M_SINGLE_TARGET_EXIST, M_UNLOCKED);
3211 SET_SENSITIVE("Menu/Tools/ListUrls", M_TARGET_EXIST);
3212 SET_SENSITIVE("Menu/Tools/Actions", M_TARGET_EXIST, M_ACTIONS_EXIST);
3213 SET_SENSITIVE("Menu/Tools/Execute", M_DELAY_EXEC);
3214 SET_SENSITIVE("Menu/Tools/Expunge", M_DELETED_EXISTS);
3215 SET_SENSITIVE("Menu/Tools/ForgetSessionPasswords", M_SESSION_PASSWORDS);
3216 #ifndef PASSWORD_CRYPTO_OLD
3217 SET_SENSITIVE("Menu/Tools/ForgetPrimaryPassphrase", M_MASTER_PASSPHRASE);
3218 #endif
3219 SET_SENSITIVE("Menu/Tools/DeleteDuplicates/SelFolder", M_MSG_EXIST, M_ALLOW_DELETE);
3221 SET_SENSITIVE("Menu/Configuration", M_UNLOCKED);
3222 SET_SENSITIVE("Menu/Configuration/ChangeAccount", M_HAVE_MULTI_ACCOUNT);
3223 SET_SENSITIVE("Menu/Configuration/AccountPrefs", M_UNLOCKED);
3224 SET_SENSITIVE("Menu/Configuration/CreateAccount", M_UNLOCKED);
3225 SET_SENSITIVE("Menu/Configuration/EditAccounts", M_UNLOCKED);
3226 #undef SET_SENSITIVE
3228 menu = gtk_menu_item_get_submenu(GTK_MENU_ITEM(
3229 gtk_ui_manager_get_widget(mainwin->ui_manager, "/Menu/Message/Receive")));
3231 children = gtk_container_get_children(GTK_CONTAINER(menu));
3232 for (cur_item = children; cur_item != NULL; cur_item = cur_item->next) {
3233 if (cur_item->data == gtk_ui_manager_get_widget(mainwin->ui_manager, "/Menu/Message/Receive/Separator1")) {
3234 cur_item = cur_item->next;
3235 break;
3239 for (; cur_item != NULL; cur_item = cur_item->next) {
3240 gtk_widget_set_sensitive(GTK_WIDGET(cur_item->data),
3241 (main_window_get_mask(M_UNLOCKED, -1) & state) != 0);
3244 g_list_free(children);
3246 main_window_menu_callback_block(mainwin);
3248 cm_toggle_menu_set_active_full(mainwin->ui_manager, "Menu/View/ShowHide/MessageView",
3249 messageview_is_visible(mainwin->messageview));
3251 summaryview = mainwin->summaryview;
3253 switch (summaryview->sort_key) {
3254 case SORT_BY_NUMBER:
3255 menu_path = "Menu/View/Sort/Number"; break;
3256 case SORT_BY_SIZE:
3257 menu_path = "Menu/View/Sort/Size"; break;
3258 case SORT_BY_DATE:
3259 menu_path = "Menu/View/Sort/Date"; break;
3260 case SORT_BY_THREAD_DATE:
3261 menu_path = "Menu/View/Sort/ThreadDate"; break;
3262 case SORT_BY_FROM:
3263 menu_path = "Menu/View/Sort/From"; break;
3264 case SORT_BY_TO:
3265 menu_path = "Menu/View/Sort/To"; break;
3266 case SORT_BY_SUBJECT:
3267 menu_path = "Menu/View/Sort/Subject"; break;
3268 case SORT_BY_LABEL:
3269 menu_path = "Menu/View/Sort/Color"; break;
3270 case SORT_BY_MARK:
3271 menu_path = "Menu/View/Sort/Mark"; break;
3272 case SORT_BY_STATUS:
3273 menu_path = "Menu/View/Sort/Status"; break;
3274 case SORT_BY_MIME:
3275 menu_path = "Menu/View/Sort/Attachment"; break;
3276 case SORT_BY_SCORE:
3277 menu_path = "Menu/View/Sort/Score"; break;
3278 case SORT_BY_LOCKED:
3279 menu_path = "Menu/View/Sort/Locked"; break;
3280 case SORT_BY_TAGS:
3281 menu_path = "Menu/View/Sort/Tag"; break;
3282 case SORT_BY_NONE:
3283 default:
3284 menu_path = "Menu/View/Sort/DontSort"; break;
3286 cm_toggle_menu_set_active_full(mainwin->ui_manager, menu_path, TRUE);
3288 if (summaryview->sort_type == SORT_ASCENDING) {
3289 cm_toggle_menu_set_active_full(mainwin->ui_manager, "Menu/View/Sort/Ascending", TRUE);
3290 } else {
3291 cm_toggle_menu_set_active_full(mainwin->ui_manager, "Menu/View/Sort/Descending", TRUE);
3294 if (summaryview->sort_key != SORT_BY_NONE) {
3295 cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/View/Sort/Ascending", TRUE);
3296 cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/View/Sort/Descending", TRUE);
3297 } else {
3298 cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/View/Sort/Ascending", FALSE);
3299 cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/View/Sort/Descending", FALSE);
3302 if (mainwin->messageview
3303 && mainwin->messageview->mimeview
3304 && mainwin->messageview->mimeview->textview)
3305 cm_toggle_menu_set_active_full(mainwin->ui_manager, "Menu/View/AllHeaders",
3306 prefs_common.show_all_headers);
3307 cm_toggle_menu_set_active_full(mainwin->ui_manager, "Menu/View/ThreadView", (state & main_window_get_mask(M_THREADED, -1)) != 0);
3308 cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/View/ExpandThreads", (state & main_window_get_mask(M_THREADED, -1)) != 0);
3309 cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/View/CollapseThreads", (state & main_window_get_mask(M_THREADED, -1)) != 0);
3310 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);
3311 cm_toggle_menu_set_active_full(mainwin->ui_manager, "Menu/View/Quotes/CollapseAll", (prefs_common.hide_quotes == 1));
3312 cm_toggle_menu_set_active_full(mainwin->ui_manager, "Menu/View/Quotes/Collapse2", (prefs_common.hide_quotes == 2));
3313 cm_toggle_menu_set_active_full(mainwin->ui_manager, "Menu/View/Quotes/Collapse3", (prefs_common.hide_quotes == 3));
3315 if (mainwin->summaryview->folder_item && !mainwin->summaryview->folder_item->threaded)
3316 cm_toggle_menu_set_active_full(mainwin->ui_manager, "Menu/View/HideReadThreads", FALSE);
3317 if ((mainwin->summaryview->folder_item && mainwin->summaryview->folder_item->hide_read_msgs) ||
3318 quicksearch_has_sat_predicate(mainwin->summaryview->quicksearch))
3319 cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/View/HideReadThreads", FALSE);
3320 if ((mainwin->summaryview->folder_item && mainwin->summaryview->folder_item->hide_read_threads) ||
3321 quicksearch_has_sat_predicate(mainwin->summaryview->quicksearch))
3322 cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/View/HideReadMessages", FALSE);
3323 if (quicksearch_has_sat_predicate(mainwin->summaryview->quicksearch))
3324 cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/View/HideDelMessages", FALSE);
3326 cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/View/Goto/PrevHistory",
3327 messageview_nav_has_prev(mainwin->messageview));
3328 cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/View/Goto/NextHistory",
3329 messageview_nav_has_next(mainwin->messageview));
3331 if (mainwin->messageview
3332 && mainwin->messageview->mimeview)
3333 mimepart_selected = !mimeview_tree_is_empty(mainwin->messageview->mimeview);
3335 cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/File/SavePartAs", mimepart_selected);
3336 cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/View/Goto/NextPart", mimepart_selected);
3337 cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/View/Goto/PrevPart", mimepart_selected);
3338 cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/View/Part", mimepart_selected);
3339 cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/Message/CheckSignature",
3340 mimepart_selected && mainwin->messageview->mimeview->signed_part);
3342 sensitive = TRUE;
3343 if (mimepart_selected) {
3344 MimeInfo *partinfo = messageview_get_selected_mime_part(mainwin->messageview);
3346 if (partinfo && (partinfo->type == MIMETYPE_MESSAGE ||
3347 partinfo->type == MIMETYPE_IMAGE ||
3348 partinfo->type == MIMETYPE_MULTIPART)) {
3349 sensitive = FALSE;
3352 cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/View/Part/AsText", sensitive);
3354 main_window_menu_callback_unblock(mainwin);
3357 void main_create_mailing_list_menu (MainWindow *mainwin, MsgInfo *msginfo)
3359 gint is_menu = 0;
3361 if (msginfo)
3362 is_menu = mailing_list_create_submenu (mainwin, msginfo);
3363 if (is_menu)
3364 cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/Message/MailingList", TRUE);
3365 else
3366 cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/Message/MailingList", FALSE);
3369 static gint mailing_list_create_submenu (MainWindow *mainwin, MsgInfo *msginfo)
3371 gint menu_nb = 0;
3372 GtkWidget *menuitem;
3374 if (!msginfo || !msginfo->extradata) {
3375 cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/Message/MailingList/Post", FALSE);
3376 cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/Message/MailingList/Help", FALSE);
3377 cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/Message/MailingList/Subscribe", FALSE);
3378 cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/Message/MailingList/Unsubscribe", FALSE);
3379 cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/Message/MailingList/ViewArchive", FALSE);
3380 cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/Message/MailingList/ContactOwner", FALSE);
3381 return 0;
3384 /* Mailing list post */
3385 if (!g_strcmp0 (msginfo->extradata->list_post, "NO")) {
3386 g_free(msginfo->extradata->list_post);
3387 msginfo->extradata->list_post = g_strdup (_("No posting allowed"));
3389 menuitem = gtk_ui_manager_get_widget(mainwin->ui_manager, "/Menu/Message/MailingList/Post");
3391 menu_nb += mailing_list_populate_submenu (menuitem, msginfo->extradata->list_post);
3393 /* Mailing list help */
3394 menuitem = gtk_ui_manager_get_widget(mainwin->ui_manager, "/Menu/Message/MailingList/Help");
3396 menu_nb += mailing_list_populate_submenu (menuitem, msginfo->extradata->list_help);
3398 /* Mailing list subscribe */
3399 menuitem = gtk_ui_manager_get_widget(mainwin->ui_manager, "/Menu/Message/MailingList/Subscribe");
3401 menu_nb += mailing_list_populate_submenu (menuitem, msginfo->extradata->list_subscribe);
3403 /* Mailing list unsubscribe */
3404 menuitem = gtk_ui_manager_get_widget(mainwin->ui_manager, "/Menu/Message/MailingList/Unsubscribe");
3406 menu_nb += mailing_list_populate_submenu (menuitem, msginfo->extradata->list_unsubscribe);
3408 /* Mailing list view archive */
3409 menuitem = gtk_ui_manager_get_widget(mainwin->ui_manager, "/Menu/Message/MailingList/ViewArchive");
3411 menu_nb += mailing_list_populate_submenu (menuitem, msginfo->extradata->list_archive);
3413 /* Mailing list contact owner */
3414 menuitem = gtk_ui_manager_get_widget(mainwin->ui_manager, "/Menu/Message/MailingList/ContactOwner");
3416 menu_nb += mailing_list_populate_submenu (menuitem, msginfo->extradata->list_owner);
3418 return menu_nb;
3421 static gint mailing_list_populate_submenu (GtkWidget *menuitem, const gchar * list_header)
3423 GtkWidget *item, *menu;
3424 const gchar *url_pt ;
3425 gchar url_decoded[BUFFSIZE];
3426 GList *children, *amenu;
3427 gint menu_nb = 0;
3429 menu = gtk_menu_item_get_submenu(GTK_MENU_ITEM(menuitem));
3431 /* First delete old submenu */
3432 /* FIXME: we can optimize this, and only change/add/delete necessary items */
3433 children = gtk_container_get_children(GTK_CONTAINER(menu));
3434 for (amenu = children; amenu; amenu = amenu->next) {
3435 item = GTK_WIDGET (amenu->data);
3436 gtk_widget_destroy (item);
3438 g_list_free(children);
3439 if (list_header) {
3440 for (url_pt = list_header; url_pt && *url_pt;) {
3441 get_url_part (&url_pt, url_decoded);
3442 item = NULL;
3443 if (!g_ascii_strncasecmp(url_decoded, "mailto:", 7)) {
3444 item = cm_menu_item_new_label_from_url ((url_decoded));
3445 g_signal_connect(G_OBJECT(item), "activate",
3446 G_CALLBACK(mailing_list_compose),
3447 NULL);
3449 else if (!g_ascii_strncasecmp(url_decoded, "http:", 5) ||
3450 !g_ascii_strncasecmp(url_decoded, "https:",6)) {
3452 item = cm_menu_item_new_label_from_url ((url_decoded));
3453 g_signal_connect(G_OBJECT(item), "activate",
3454 G_CALLBACK(mailing_list_open_uri),
3455 NULL);
3457 if (item) {
3458 gtk_menu_shell_append(GTK_MENU_SHELL(menu), item);
3459 gtk_widget_show (item);
3460 menu_nb++;
3464 if (menu_nb)
3465 gtk_widget_set_sensitive (menuitem, TRUE);
3466 else
3467 gtk_widget_set_sensitive (menuitem, FALSE);
3470 return menu_nb;
3473 static void get_url_part (const gchar **buffer, gchar *url_decoded)
3475 gchar tmp[BUFFSIZE];
3476 const gchar *buf;
3477 gint i = 0;
3478 buf = *buffer;
3479 gboolean with_plus = TRUE;
3481 if (buf == 0x00) {
3482 *url_decoded = '\0';
3483 *buffer = NULL;
3484 return;
3486 /* Ignore spaces, comments and tabs () */
3487 for (;*buf == ' ' || *buf == '(' || *buf == '\t'; buf++)
3488 if (*buf == '(')
3489 for (;*buf != ')' && *buf != 0x00; buf++);
3491 /* First non space and non comment must be a < */
3492 if (*buf =='<' ) {
3493 buf++;
3494 if (!strncmp(buf, "mailto:", strlen("mailto:")))
3495 with_plus = FALSE;
3496 for (i = 0;
3497 *buf != '>' && *buf != 0x00 && i < BUFFSIZE;
3498 tmp[i++] = *(buf++));
3499 if (*buf == 0) {
3500 *buffer = NULL;
3501 *url_decoded = '\0';
3502 return;
3504 buf++;
3506 else {
3507 *buffer = NULL;
3508 *url_decoded = '\0';
3509 return;
3512 *url_decoded = '\0';
3513 *buffer = NULL;
3515 if (i == BUFFSIZE) {
3516 return;
3518 tmp[i] = 0x00;
3519 decode_uri_with_plus (url_decoded, (const gchar *)tmp, with_plus);
3521 /* Prepare the work for the next url in the list */
3522 /* after the closing bracket >, ignore space, comments and tabs */
3523 for (;buf && *buf && (*buf == ' ' || *buf == '(' || *buf == '\t'); buf++)
3524 if (*buf == '(')
3525 for (;*buf != ')' && *buf != 0x00; buf++);
3527 if (!buf || !*buf) {
3528 *buffer = NULL;
3529 return;
3532 /* now first non space, non comment must be a comma */
3533 if (*buf != ',')
3534 for (;*buf != 0x00; buf++);
3535 else
3536 buf++;
3537 *buffer = buf;
3540 static void mailing_list_compose (GtkWidget *w, gpointer *data)
3542 const gchar *mailto;
3543 PrefsAccount *account = NULL;
3544 FolderItem *folder_item = NULL;
3546 mailto = gtk_label_get_text(GTK_LABEL (gtk_bin_get_child(GTK_BIN((w)))));
3547 if (mainwindow_get_mainwindow()) {
3548 folder_item = mainwindow_get_mainwindow()->summaryview->folder_item;
3549 if (folder_item && folder_item->prefs && folder_item->prefs->enable_default_account)
3550 account = account_find_from_id(folder_item->prefs->default_account);
3551 if (folder_item && !account)
3552 account = account_find_from_item(folder_item);
3554 if (mailto)
3555 compose_new_with_folderitem(account, folder_item, mailto+7);
3558 static void mailing_list_open_uri (GtkWidget *w, gpointer *data)
3561 const gchar *mailto;
3563 mailto = gtk_label_get_text(GTK_LABEL (gtk_bin_get_child(GTK_BIN((w)))));
3564 if (mailto)
3565 open_uri (mailto, prefs_common_get_uri_cmd());
3568 static void fix_folderview_scroll(MainWindow *mainwin)
3570 static gboolean fix_done = FALSE;
3572 if (fix_done)
3573 return;
3575 gtk_widget_queue_resize(mainwin->folderview->ctree);
3577 fix_done = TRUE;
3580 void main_window_popup(MainWindow *mainwin)
3582 static gboolean first_start = TRUE;
3584 if (!gtk_widget_get_visible(GTK_WIDGET(mainwin->window)))
3585 main_window_show(mainwin);
3587 if (prefs_common.mainwin_maximised)
3588 gtk_window_maximize(GTK_WINDOW(mainwin->window));
3590 if (first_start) {
3591 first_start = FALSE;
3592 } else {
3593 gtkut_window_popup(mainwin->window);
3596 if (prefs_common.layout_mode == SMALL_LAYOUT) {
3597 if (mainwin->in_folder) {
3598 mainwindow_enter_folder(mainwin);
3599 } else {
3600 mainwindow_exit_folder(mainwin);
3603 fix_folderview_scroll(mainwin);
3606 void main_window_show(MainWindow *mainwin)
3608 gtk_widget_show(mainwin->window);
3609 gtk_widget_show(mainwin->vbox_body);
3610 #ifndef GENERIC_UMPC
3611 gtk_window_move(GTK_WINDOW(mainwin->window),
3612 prefs_common.mainwin_x,
3613 prefs_common.mainwin_y);
3614 #endif
3617 void main_window_hide(MainWindow *mainwin)
3619 main_window_get_size(mainwin);
3620 main_window_get_position(mainwin);
3622 gtk_widget_hide(mainwin->window);
3623 gtk_widget_hide(mainwin->vbox_body);
3626 static void main_window_set_widgets(MainWindow *mainwin, LayoutType layout_mode)
3628 GtkWidget *folderwin = NULL;
3629 GtkWidget *messagewin = NULL;
3630 GtkWidget *hpaned;
3631 GtkWidget *vpaned;
3632 GtkWidget *vbox_body = mainwin->vbox_body;
3633 gboolean first_set = (mainwin->hpaned == NULL);
3634 debug_print("Setting widgets...\n");
3636 #ifndef GENERIC_UMPC
3637 mainwin->messageview->statusbar = mainwin->statusbar;
3638 mainwin->messageview->statusbar_cid = mainwin->messageview_cid;
3639 #endif
3640 /* clean top-most container */
3641 if (mainwin->hpaned) {
3642 if (gtk_widget_get_parent(mainwin->hpaned) == mainwin->vpaned)
3643 gtk_widget_destroy(mainwin->vpaned);
3644 else
3645 gtk_widget_destroy(mainwin->hpaned);
3648 cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/View/ShowHide/MessageView",
3649 (layout_mode != WIDE_MSGLIST_LAYOUT && layout_mode != SMALL_LAYOUT));
3650 switch (layout_mode) {
3651 case VERTICAL_LAYOUT:
3652 case NORMAL_LAYOUT:
3653 case SMALL_LAYOUT:
3654 hpaned = gtk_paned_new(GTK_ORIENTATION_HORIZONTAL);
3655 if (layout_mode == VERTICAL_LAYOUT)
3656 vpaned = gtk_paned_new(GTK_ORIENTATION_HORIZONTAL);
3657 else
3658 vpaned = gtk_paned_new(GTK_ORIENTATION_VERTICAL);
3659 gtk_box_pack_start(GTK_BOX(vbox_body), hpaned, TRUE, TRUE, 0);
3660 gtk_paned_add1(GTK_PANED(hpaned),
3661 GTK_WIDGET_PTR(mainwin->folderview));
3662 gtk_widget_show(hpaned);
3664 if (messageview_is_visible(mainwin->messageview)) {
3665 gtk_paned_add2(GTK_PANED(hpaned), vpaned);
3666 gtk_paned_pack1(GTK_PANED(vpaned),
3667 GTK_WIDGET_PTR(mainwin->summaryview), TRUE, TRUE);
3668 } else {
3669 gtk_paned_add2(GTK_PANED(hpaned),
3670 GTK_WIDGET_PTR(mainwin->summaryview));
3671 g_object_ref(vpaned);
3673 gtk_paned_add2(GTK_PANED(vpaned),
3674 GTK_WIDGET_PTR(mainwin->messageview));
3675 gtk_widget_show(vpaned);
3676 if (layout_mode == SMALL_LAYOUT && first_set) {
3677 mainwin_paned_show_first(GTK_PANED(hpaned));
3680 gtk_paned_set_position(GTK_PANED(hpaned),
3681 prefs_common_get_prefs()->folderview_width);
3683 if (layout_mode == NORMAL_LAYOUT &&
3684 messageview_is_visible(mainwin->messageview)) {
3685 gtk_paned_set_position(GTK_PANED(vpaned),
3686 prefs_common_get_prefs()->summaryview_height);
3688 if (layout_mode == VERTICAL_LAYOUT &&
3689 messageview_is_visible(mainwin->messageview)) {
3690 gtk_paned_set_position(GTK_PANED(vpaned),
3691 prefs_common_get_prefs()->summaryview_width);
3694 break;
3695 case WIDE_LAYOUT:
3696 vpaned = gtk_paned_new(GTK_ORIENTATION_VERTICAL);
3697 hpaned = gtk_paned_new(GTK_ORIENTATION_HORIZONTAL);
3698 gtk_box_pack_start(GTK_BOX(vbox_body), vpaned, TRUE, TRUE, 0);
3699 gtk_paned_add1(GTK_PANED(vpaned), hpaned);
3701 gtk_paned_add1(GTK_PANED(hpaned),
3702 GTK_WIDGET_PTR(mainwin->folderview));
3703 gtk_paned_add2(GTK_PANED(hpaned),
3704 GTK_WIDGET_PTR(mainwin->summaryview));
3706 gtk_widget_show(hpaned);
3708 if (messageview_is_visible(mainwin->messageview)) {
3709 gtk_paned_add2(GTK_PANED(vpaned),
3710 GTK_WIDGET_PTR(mainwin->messageview));
3711 } else {
3712 g_object_ref(GTK_WIDGET_PTR(mainwin->messageview));
3714 gtk_widget_show(vpaned);
3716 gtk_paned_set_position(GTK_PANED(hpaned),
3717 prefs_common_get_prefs()->folderview_width);
3719 if (messageview_is_visible(mainwin->messageview)) {
3720 gtk_paned_set_position(GTK_PANED(vpaned),
3721 prefs_common_get_prefs()->summaryview_height);
3724 break;
3725 case WIDE_MSGLIST_LAYOUT:
3726 vpaned = gtk_paned_new(GTK_ORIENTATION_VERTICAL);
3727 hpaned = gtk_paned_new(GTK_ORIENTATION_HORIZONTAL);
3728 gtk_box_pack_start(GTK_BOX(vbox_body), vpaned, TRUE, TRUE, 0);
3730 gtk_paned_add1(GTK_PANED(vpaned),
3731 GTK_WIDGET_PTR(mainwin->summaryview));
3732 gtk_paned_add1(GTK_PANED(hpaned),
3733 GTK_WIDGET_PTR(mainwin->folderview));
3735 gtk_widget_show(hpaned);
3737 if (messageview_is_visible(mainwin->messageview)) {
3738 gtk_paned_add2(GTK_PANED(hpaned),
3739 GTK_WIDGET_PTR(mainwin->messageview));
3740 } else {
3741 g_object_ref(GTK_WIDGET_PTR(mainwin->messageview));
3743 gtk_paned_add2(GTK_PANED(vpaned), hpaned);
3744 gtk_widget_show(vpaned);
3746 gtk_paned_set_position(GTK_PANED(hpaned),
3747 prefs_common_get_prefs()->folderview_width);
3748 gtk_paned_set_position(GTK_PANED(vpaned),
3749 prefs_common_get_prefs()->summaryview_height);
3751 break;
3752 default:
3753 g_warning("unknown layout");
3754 return;
3757 mainwin->hpaned = hpaned;
3758 mainwin->vpaned = vpaned;
3760 if (layout_mode == SMALL_LAYOUT) {
3761 if (mainwin->messageview->visible)
3762 main_window_toggle_message_view(mainwin);
3765 if (layout_mode == SMALL_LAYOUT && first_set) {
3766 gtk_widget_realize(mainwin->window);
3767 gtk_widget_realize(mainwin->folderview->ctree);
3768 gtk_widget_realize(mainwin->summaryview->hbox);
3769 gtk_widget_realize(mainwin->summaryview->hbox_l);
3770 gtk_paned_set_position(GTK_PANED(mainwin->hpaned), 800);
3771 } else {
3772 gtk_window_set_default_size(GTK_WINDOW(mainwin->window),
3773 prefs_common.mainwin_width,
3774 prefs_common.mainwin_height);
3776 /* remove headerview if not in prefs */
3777 headerview_set_visibility(mainwin->messageview->headerview,
3778 prefs_common.display_header_pane);
3780 if (messageview_is_visible(mainwin->messageview))
3781 gtk_image_set_from_icon_name(GTK_IMAGE(mainwin->summaryview->toggle_arrow),
3782 "pan-down-symbolic", GTK_ICON_SIZE_MENU);
3783 else
3784 gtk_image_set_from_icon_name(GTK_IMAGE(mainwin->summaryview->toggle_arrow),
3785 "pan-up-symbolic", GTK_ICON_SIZE_MENU);
3787 gtk_window_move(GTK_WINDOW(mainwin->window),
3788 prefs_common.mainwin_x,
3789 prefs_common.mainwin_y);
3791 /* CLAWS: previous "gtk_widget_show_all" makes noticeview
3792 * and mimeview icon list/ctree lose track of their visibility states */
3793 if (!noticeview_is_visible(mainwin->messageview->noticeview))
3794 gtk_widget_hide(GTK_WIDGET_PTR(mainwin->messageview->noticeview));
3795 if (!noticeview_is_visible(mainwin->messageview->mimeview->siginfoview))
3796 gtk_widget_hide(GTK_WIDGET_PTR(mainwin->messageview->mimeview->siginfoview));
3797 if (mainwin->messageview->mimeview->ctree_mode)
3798 gtk_widget_hide(mainwin->messageview->mimeview->icon_mainbox);
3799 else
3800 gtk_widget_hide(mainwin->messageview->mimeview->ctree_mainbox);
3802 prefs_common.layout_mode = layout_mode;
3804 cm_toggle_menu_set_active_full(mainwin->ui_manager, "Menu/View/ShowHide/MessageView",
3805 messageview_is_visible(mainwin->messageview));
3807 #ifndef GENERIC_UMPC
3808 switch (prefs_common.layout_mode) {
3809 case NORMAL_LAYOUT:
3810 cm_toggle_menu_set_active_full(mainwin->ui_manager, "Menu/View/Layout/Standard", TRUE);
3811 break;
3812 case VERTICAL_LAYOUT:
3813 cm_toggle_menu_set_active_full(mainwin->ui_manager, "Menu/View/Layout/ThreeColumns", TRUE);
3814 break;
3815 case WIDE_LAYOUT:
3816 cm_toggle_menu_set_active_full(mainwin->ui_manager, "Menu/View/Layout/WideMessage", TRUE);
3817 break;
3818 case WIDE_MSGLIST_LAYOUT:
3819 cm_toggle_menu_set_active_full(mainwin->ui_manager, "Menu/View/Layout/WideMessageList", TRUE);
3820 break;
3821 case SMALL_LAYOUT:
3822 cm_toggle_menu_set_active_full(mainwin->ui_manager, "Menu/View/Layout/SmallScreen", TRUE);
3823 break;
3825 #endif
3827 if (folderwin) {
3828 g_signal_connect
3829 (G_OBJECT(folderwin), "size_allocate",
3830 G_CALLBACK(folder_window_size_allocate_cb),
3831 mainwin);
3833 if (messagewin) {
3834 g_signal_connect
3835 (G_OBJECT(messagewin), "size_allocate",
3836 G_CALLBACK(message_window_size_allocate_cb),
3837 mainwin);
3840 debug_print("Setting widgets done.\n");
3843 void main_window_destroy_all(void)
3845 while (mainwin_list != NULL) {
3846 MainWindow *mainwin = (MainWindow*)mainwin_list->data;
3848 /* free toolbar stuff */
3849 toolbar_clear_list(TOOLBAR_MAIN);
3850 toolbar_destroy(mainwin->toolbar);
3852 summaryview_destroy(mainwin->summaryview);
3853 mainwin->folderview->mainwin = NULL;
3854 mainwin->summaryview->mainwin = NULL;
3855 mainwin->messageview->mainwin = NULL;
3857 g_free(mainwin->toolbar);
3858 g_free(mainwin);
3860 mainwin_list = g_list_remove(mainwin_list, mainwin);
3862 g_list_free(mainwin_list);
3863 mainwin_list = NULL;
3866 #ifndef GENERIC_UMPC
3867 static gboolean ac_label_button_pressed(GtkWidget *widget, GdkEventButton *event,
3868 gpointer data)
3870 MainWindow *mainwin = (MainWindow *)data;
3871 GtkWidget *menu = NULL;
3873 if (!event) return FALSE;
3875 gtk_button_set_relief(GTK_BUTTON(widget), GTK_RELIEF_NORMAL);
3877 menu = gtk_menu_item_get_submenu(GTK_MENU_ITEM(mainwin->ac_menu));
3879 gtk_menu_popup_at_widget(GTK_MENU(menu), widget, 3, 3, NULL);
3881 return TRUE;
3883 #endif
3884 static gint main_window_close_cb(GtkWidget *widget, GdkEventAny *event,
3885 gpointer data)
3887 MainWindow *mainwin = (MainWindow *)data;
3888 gboolean close_allowed = TRUE;
3890 hooks_invoke(MAIN_WINDOW_CLOSE, &close_allowed);
3892 if (close_allowed && mainwin->lock_count == 0)
3893 app_exit_cb(NULL, data);
3895 return TRUE;
3898 static void main_window_size_allocate_cb(GtkWidget *widget,
3899 GtkAllocation *allocation,
3900 gpointer data)
3902 MainWindow *mainwin = (MainWindow *)data;
3903 main_window_get_size(mainwin);
3906 static void folder_window_size_allocate_cb(GtkWidget *widget,
3907 GtkAllocation *allocation,
3908 gpointer data)
3910 MainWindow *mainwin = (MainWindow *)data;
3912 main_window_get_size(mainwin);
3915 static void message_window_size_allocate_cb(GtkWidget *widget,
3916 GtkAllocation *allocation,
3917 gpointer data)
3919 MainWindow *mainwin = (MainWindow *)data;
3921 main_window_get_size(mainwin);
3924 static void add_mailbox_cb(GtkAction *action, gpointer data)
3926 MainWindow *mainwin = (MainWindow *)data;
3927 main_window_add_mailbox(mainwin);
3930 static void update_folderview_cb(GtkAction *action, gpointer data)
3932 MainWindow *mainwin = (MainWindow *)data;
3933 summary_show(mainwin->summaryview, NULL, FALSE);
3934 folderview_check_new_all();
3937 static void foldersort_cb(GtkAction *action, gpointer data)
3939 foldersort_open();
3942 static void import_mbox_cb(GtkAction *action, gpointer data)
3944 MainWindow *mainwin = (MainWindow *)data;
3945 /* only notify if import has failed */
3946 if (import_mbox(mainwin->summaryview->folder_item) == -1) {
3947 alertpanel_error(_("Mbox import has failed."));
3951 static void export_mbox_cb(GtkAction *action, gpointer data)
3953 MainWindow *mainwin = (MainWindow *)data;
3954 /* only notify if export has failed */
3955 if (export_mbox(mainwin->summaryview->folder_item) == -1) {
3956 alertpanel_error(_("Export to mbox has failed."));
3960 static void export_list_mbox_cb(GtkAction *action, gpointer data)
3962 MainWindow *mainwin = (MainWindow *)data;
3963 /* only notify if export has failed */
3964 if (summaryview_export_mbox_list(mainwin->summaryview) == -1) {
3965 alertpanel_error(_("Export to mbox has failed."));
3969 static void empty_trash_cb(GtkAction *action, gpointer data)
3971 MainWindow *mainwin = (MainWindow *)data;
3972 main_window_empty_trash(mainwin, TRUE, FALSE);
3975 static void save_as_cb(GtkAction *action, gpointer data)
3977 MainWindow *mainwin = (MainWindow *)data;
3978 summary_save_as(mainwin->summaryview);
3981 static void print_cb(GtkAction *action, gpointer data)
3983 MainWindow *mainwin = (MainWindow *)data;
3984 summary_print(mainwin->summaryview);
3987 static void page_setup_cb(GtkAction *action, gpointer data)
3989 MainWindow *mainwin = (MainWindow *)data;
3990 GtkWindow *win;
3992 win = (mainwin ? GTK_WINDOW(mainwin->window) : NULL);
3994 printing_page_setup(win);
3997 static void app_exit_cb(GtkAction *action, gpointer data)
3999 MainWindow *mainwin = (MainWindow *)data;
4000 if (prefs_common.clean_on_exit) {
4001 if (!main_window_empty_trash(mainwin, prefs_common.ask_on_clean, TRUE))
4002 return;
4005 if (prefs_common.confirm_on_exit) {
4006 if (alertpanel(_("Exit"), _("Exit Claws Mail?"),
4007 NULL, _("_Cancel"), NULL, _("_Quit"),
4008 NULL, NULL, ALERTFOCUS_FIRST)
4009 != G_ALERTALTERNATE)
4010 return;
4011 manage_window_focus_in(mainwin->window, NULL, NULL);
4014 app_will_exit(NULL, mainwin);
4017 static void search_cb(GtkAction *action, gpointer data)
4019 MainWindow *mainwin = (MainWindow *)data;
4020 message_search(mainwin->messageview);
4023 static void search_folder_cb(GtkAction *action, gpointer data)
4025 MainWindow *mainwin = (MainWindow *)data;
4026 FolderItem *item = mainwin->summaryview->folder_item;
4027 cm_return_if_fail(item != NULL);
4028 summary_search(mainwin->summaryview);
4031 static void mainwindow_quicksearch(GtkAction *action, gpointer data)
4033 MainWindow *mainwin = (MainWindow *)data;
4034 summaryview_activate_quicksearch(mainwin->summaryview, TRUE);
4037 static void toggle_message_cb(GtkAction *action, gpointer data)
4039 MainWindow *mainwin = (MainWindow *)data;
4040 gboolean active;
4042 active = gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (action));
4044 if (active != messageview_is_visible(mainwin->messageview))
4045 summary_toggle_view(mainwin->summaryview);
4048 static void toggle_toolbar_cb(GtkAction *action, GtkRadioAction *current, gpointer data)
4050 gint value = gtk_radio_action_get_current_value (GTK_RADIO_ACTION (current));
4051 MainWindow *mainwin = (MainWindow *)data;
4052 toolbar_toggle(value, mainwin);
4055 static void main_window_reply_cb(GtkAction *gaction, gpointer data)
4057 MainWindow *mainwin = (MainWindow *)data;
4058 MessageView *msgview = (MessageView*)mainwin->messageview;
4059 GSList *msginfo_list = NULL;
4060 gint action = COMPOSE_REPLY;
4061 const gchar *a_name = gtk_action_get_name(gaction);
4063 DO_ACTION("Message/Reply", COMPOSE_REPLY);
4064 DO_ACTION("Message/ReplyTo/All", COMPOSE_REPLY_TO_ALL);
4065 DO_ACTION("Message/ReplyTo/Sender", COMPOSE_REPLY_TO_SENDER);
4066 DO_ACTION("Message/ReplyTo/List", COMPOSE_REPLY_TO_LIST);
4067 DO_ACTION("Message/Forward", COMPOSE_FORWARD_INLINE);
4068 DO_ACTION("Message/ForwardAtt", COMPOSE_FORWARD_AS_ATTACH);
4069 DO_ACTION("Message/Redirect", COMPOSE_REDIRECT);
4070 DO_ACTION("Message/FollowupReply", COMPOSE_FOLLOWUP_AND_REPLY_TO);
4072 cm_return_if_fail(msgview != NULL);
4074 msginfo_list = summary_get_selection(mainwin->summaryview);
4075 cm_return_if_fail(msginfo_list != NULL);
4077 if (!summary_has_opened_message(mainwin->summaryview)) {
4078 compose_reply_from_messageview(NULL, msginfo_list, action);
4079 } else if (summary_is_opened_message_selected(mainwin->summaryview)) {
4080 compose_reply_from_messageview(msgview, msginfo_list, action);
4081 } else {
4082 compose_reply_from_messageview(msgview, NULL, action);
4085 g_slist_free(msginfo_list);
4088 static void toggle_col_headers_cb(GtkAction *gaction, gpointer data)
4090 MainWindow *mainwin = (MainWindow *)data;
4091 FolderView *folderview = mainwin->folderview;
4092 SummaryView *summaryview = mainwin->summaryview;
4093 MimeView *mimeview = mainwin->messageview->mimeview;
4095 if (gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (gaction))) {
4096 gtk_cmclist_column_titles_show(GTK_CMCLIST(folderview->ctree));
4097 gtk_cmclist_column_titles_show(GTK_CMCLIST(summaryview->ctree));
4098 gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(mimeview->ctree), TRUE);
4099 prefs_common.show_col_headers = TRUE;
4100 } else {
4101 gtk_cmclist_column_titles_hide(GTK_CMCLIST(folderview->ctree));
4102 gtk_cmclist_column_titles_hide(GTK_CMCLIST(summaryview->ctree));
4103 gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(mimeview->ctree), FALSE);
4104 prefs_common.show_col_headers = FALSE;
4108 #ifndef GENERIC_UMPC
4109 static void toggle_statusbar_cb(GtkAction *gaction, gpointer data)
4111 MainWindow *mainwin = (MainWindow *)data;
4112 if (gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (gaction))) {
4113 gtk_widget_show(mainwin->hbox_stat);
4114 prefs_common.show_statusbar = TRUE;
4115 } else {
4116 gtk_widget_hide(mainwin->hbox_stat);
4117 prefs_common.show_statusbar = FALSE;
4121 static void set_layout_cb(GtkAction *action, GtkRadioAction *current, gpointer data)
4123 MainWindow *mainwin = (MainWindow *)data;
4124 gint value = gtk_radio_action_get_current_value (GTK_RADIO_ACTION (current));
4125 LayoutType layout_mode = value;
4126 LayoutType old_layout_mode = prefs_common.layout_mode;
4127 if (mainwin->menu_lock_count) {
4128 return;
4130 if (!gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (current))) {
4131 return;
4134 if (layout_mode == prefs_common.layout_mode) {
4135 return;
4138 if (!mainwin->messageview->visible && layout_mode != SMALL_LAYOUT)
4139 main_window_toggle_message_view(mainwin);
4140 else if (mainwin->messageview->visible && layout_mode == SMALL_LAYOUT)
4141 main_window_toggle_message_view(mainwin);
4143 main_window_separation_change(mainwin, layout_mode);
4144 mainwindow_reset_paned(GTK_PANED(mainwin->vpaned));
4145 if (old_layout_mode == SMALL_LAYOUT && layout_mode != SMALL_LAYOUT) {
4146 mainwindow_reset_paned(GTK_PANED(mainwin->hpaned));
4147 if (layout_mode == VERTICAL_LAYOUT)
4148 mainwindow_reset_paned(GTK_PANED(mainwin->vpaned));
4150 if (old_layout_mode != SMALL_LAYOUT && layout_mode == SMALL_LAYOUT) {
4151 mainwin_paned_show_first(GTK_PANED(mainwin->hpaned));
4152 mainwindow_exit_folder(mainwin);
4154 summary_relayout(mainwin->summaryview);
4155 summary_update_unread(mainwin->summaryview, NULL);
4157 #endif
4159 void main_window_toggle_work_offline (MainWindow *mainwin, gboolean offline,
4160 gboolean ask_sync)
4162 static gboolean switching = FALSE;
4164 if (switching)
4165 return;
4167 switching = TRUE;
4169 offline_ask_sync = ask_sync;
4170 if (offline)
4171 online_switch_clicked (GTK_BUTTON(mainwin->online_switch), mainwin);
4172 else
4173 online_switch_clicked (GTK_BUTTON(mainwin->offline_switch), mainwin);
4174 offline_ask_sync = TRUE;
4176 inc_reset_offline_override_timers();
4178 switching = FALSE;
4181 static void toggle_work_offline_cb (GtkAction *action, gpointer data)
4183 MainWindow *mainwin = (MainWindow *)data;
4184 main_window_toggle_work_offline(mainwin, gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (action)), TRUE);
4187 static gboolean any_folder_want_synchronise(void)
4189 GList *folderlist = folder_get_list();
4191 /* see if there are synchronised folders */
4192 for (; folderlist; folderlist = folderlist->next) {
4193 Folder *folder = (Folder *)folderlist->data;
4194 if (folder_want_synchronise(folder)) {
4195 return TRUE;
4199 return FALSE;
4202 static void mainwindow_check_synchronise(MainWindow *mainwin, gboolean ask)
4205 if (!any_folder_want_synchronise())
4206 return;
4208 if (offline_ask_sync && ask && alertpanel(_("Folder synchronisation"),
4209 _("Do you want to synchronise your folders now?"),
4210 NULL, _("_Cancel"), NULL, _("_Synchronise"), NULL, NULL,
4211 ALERTFOCUS_SECOND) != G_ALERTALTERNATE)
4212 return;
4214 if (offline_ask_sync)
4215 folder_synchronise(NULL);
4218 static void online_switch_clicked (GtkButton *btn, gpointer data)
4220 MainWindow *mainwin;
4221 gboolean have_connectivity;
4223 #ifdef HAVE_NETWORKMANAGER_SUPPORT
4224 have_connectivity = networkmanager_is_online(NULL);
4225 #else
4226 have_connectivity = TRUE;
4227 #endif
4229 mainwin = (MainWindow *) data;
4231 cm_return_if_fail(mainwin != NULL);
4233 if (btn == GTK_BUTTON(mainwin->online_switch)) {
4234 #ifndef GENERIC_UMPC
4235 gtk_widget_hide (mainwin->online_switch);
4236 gtk_widget_show (mainwin->offline_switch);
4237 #endif
4238 cm_toggle_menu_set_active_full(mainwin->ui_manager, "Menu/File/OfflineMode", TRUE);
4240 inc_autocheck_timer_remove();
4242 /* go offline */
4243 if (prefs_common.work_offline)
4244 return;
4246 if(have_connectivity)
4247 mainwindow_check_synchronise(mainwin, TRUE);
4248 prefs_common.work_offline = TRUE;
4249 imap_disconnect_all(have_connectivity);
4250 nntp_disconnect_all(have_connectivity);
4251 hooks_invoke(OFFLINE_SWITCH_HOOKLIST, NULL);
4252 } else {
4253 /*go online */
4254 if (!prefs_common.work_offline)
4255 return;
4256 #ifndef GENERIC_UMPC
4257 gtk_widget_hide (mainwin->offline_switch);
4258 gtk_widget_show (mainwin->online_switch);
4259 #endif
4260 cm_toggle_menu_set_active_full(mainwin->ui_manager, "Menu/File/OfflineMode", FALSE);
4261 prefs_common.work_offline = FALSE;
4262 inc_autocheck_timer_set();
4263 refresh_resolvers();
4264 hooks_invoke(OFFLINE_SWITCH_HOOKLIST, NULL);
4268 static void addressbook_open_cb(GtkAction *action, gpointer data)
4270 #ifndef USE_ALT_ADDRBOOK
4271 addressbook_open(NULL);
4272 #else
4273 GError* error = NULL;
4275 addressbook_dbus_open(FALSE, &error);
4276 if (error) {
4277 g_warning("failed to open address book: %s", error->message);
4278 g_error_free(error);
4280 #endif
4283 static void log_window_show_cb(GtkAction *action, gpointer data)
4285 MainWindow *mainwin = (MainWindow *)data;
4286 log_window_show(mainwin->logwin);
4289 static void filtering_debug_window_show_cb(GtkAction *action, gpointer data)
4291 MainWindow *mainwin = (MainWindow *)data;
4292 log_window_show(mainwin->filtering_debugwin);
4295 #ifdef G_OS_WIN32
4296 static void debug_log_show_cb(GtkAction *action, gpointer data)
4298 GError *error = NULL;
4299 gchar *logpath8 = win32_debug_log_path();
4300 gunichar2 *logpath16;
4302 debug_print("opening '%s'\n", logpath8);
4304 logpath16 = g_utf8_to_utf16(logpath8, -1, NULL, NULL, &error);
4306 if (error != NULL) {
4307 g_warning("couldn't convert debug log path '%s' to UTF-16: %s",
4308 logpath8, error->message);
4309 g_error_free(error);
4310 g_free(logpath16);
4311 return;
4314 HINSTANCE ret = ShellExecute(NULL, NULL, (LPCWSTR)logpath16,
4315 NULL, NULL, SW_SHOW);
4317 g_free(logpath8);
4318 g_free(logpath16);
4319 debug_print("ShellExecute result: %"G_GSIZE_FORMAT"\n", (gsize)ret);
4321 #endif
4323 static void inc_cancel_cb(GtkAction *action, gpointer data)
4325 inc_cancel_all();
4326 imap_cancel_all();
4329 static void send_cancel_cb(GtkAction *action, gpointer data)
4331 send_cancel();
4334 static void move_to_cb(GtkAction *action, gpointer data)
4336 MainWindow *mainwin = (MainWindow *)data;
4337 summary_move_to(mainwin->summaryview);
4340 static void copy_to_cb(GtkAction *action, gpointer data)
4342 MainWindow *mainwin = (MainWindow *)data;
4343 summary_copy_to(mainwin->summaryview);
4346 static void delete_cb(GtkAction *action, gpointer data)
4348 MainWindow *mainwin = (MainWindow *)data;
4349 summary_delete(mainwin->summaryview);
4352 static void delete_trash_cb(GtkAction *action, gpointer data)
4354 MainWindow *mainwin = (MainWindow *)data;
4355 summary_delete_trash(mainwin->summaryview);
4358 static void cancel_cb(GtkAction *action, gpointer data)
4360 MainWindow *mainwin = (MainWindow *)data;
4361 summary_cancel(mainwin->summaryview);
4364 static void open_msg_cb(GtkAction *action, gpointer data)
4366 MainWindow *mainwin = (MainWindow *)data;
4367 summary_open_msg(mainwin->summaryview);
4370 static void view_source_cb(GtkAction *action, gpointer data)
4372 MainWindow *mainwin = (MainWindow *)data;
4373 summary_view_source(mainwin->summaryview);
4376 static void show_all_header_cb(GtkAction *action, gpointer data)
4378 MainWindow *mainwin = (MainWindow *)data;
4379 if (mainwin->menu_lock_count) return;
4380 prefs_common.show_all_headers =
4381 gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (action));
4382 summary_display_msg_selected(mainwin->summaryview,
4383 gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (action)));
4386 static void toggle_fullscreen_cb(GtkAction *action, gpointer data)
4388 MainWindow *mainwin = (MainWindow *)data;
4389 if (mainwin->menu_lock_count) return;
4390 if (!gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (action))) {
4391 gtk_window_unfullscreen(GTK_WINDOW(mainwin->window));
4392 prefs_common.mainwin_fullscreen = FALSE;
4394 else {
4395 prefs_common.mainwin_fullscreen = TRUE;
4396 gtk_window_fullscreen(GTK_WINDOW(mainwin->window));
4400 static void toggle_menubar_cb(GtkAction *action, gpointer data)
4402 MainWindow *mainwin = (MainWindow *)data;
4403 if (mainwin->menu_lock_count) return;
4404 if (!gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (action))) {
4405 gtk_widget_hide(GTK_WIDGET(mainwin->menubar));
4406 prefs_common.mainwin_menubar = FALSE;
4407 } else {
4408 gtk_widget_show(GTK_WIDGET(mainwin->menubar));
4409 prefs_common.mainwin_menubar = TRUE;
4413 static void hide_quotes_cb(GtkAction *action, gpointer data)
4415 MainWindow *mainwin = (MainWindow *)data;
4417 if (mainwin->menu_lock_count) return;
4419 if (gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (action))) {
4420 const gchar *a_name = gtk_action_get_name(GTK_ACTION(action));
4421 if (!strcmp(a_name, "View/Quotes/CollapseAll")) prefs_common.hide_quotes = 1;
4422 else if (!strcmp(a_name, "View/Quotes/Collapse2")) prefs_common.hide_quotes = 2;
4423 else if (!strcmp(a_name, "View/Quotes/Collapse3")) prefs_common.hide_quotes = 3;
4424 } else
4425 prefs_common.hide_quotes = 0;
4427 mainwin->menu_lock_count++;
4428 cm_toggle_menu_set_active_full(mainwin->ui_manager, "Menu/View/Quotes/CollapseAll", (prefs_common.hide_quotes == 1));
4429 cm_toggle_menu_set_active_full(mainwin->ui_manager, "Menu/View/Quotes/Collapse2", (prefs_common.hide_quotes == 2));
4430 cm_toggle_menu_set_active_full(mainwin->ui_manager, "Menu/View/Quotes/Collapse3", (prefs_common.hide_quotes == 3));
4431 mainwin->menu_lock_count--;
4433 summary_redisplay_msg(mainwin->summaryview);
4436 static void mark_cb(GtkAction *action, gpointer data)
4438 MainWindow *mainwin = (MainWindow *)data;
4439 summary_mark(mainwin->summaryview);
4442 static void unmark_cb(GtkAction *action, gpointer data)
4444 MainWindow *mainwin = (MainWindow *)data;
4445 summary_unmark(mainwin->summaryview);
4448 static void mark_as_read_cb(GtkAction *action, gpointer data)
4450 MainWindow *mainwin = (MainWindow *)data;
4451 summary_mark_as_read(mainwin->summaryview);
4454 static void mark_as_unread_cb(GtkAction *action, gpointer data)
4456 MainWindow *mainwin = (MainWindow *)data;
4457 summary_mark_as_unread(mainwin->summaryview);
4460 static void mark_all_read_cb(GtkAction *action, gpointer data)
4462 MainWindow *mainwin = (MainWindow *)data;
4463 summary_mark_all_read(mainwin->summaryview, TRUE);
4466 static void mark_all_unread_cb(GtkAction *action, gpointer data)
4468 MainWindow *mainwin = (MainWindow *)data;
4469 summary_mark_all_unread(mainwin->summaryview, TRUE);
4472 static void mark_as_spam_cb(GtkAction *action, gpointer data)
4474 MainWindow *mainwin = (MainWindow *)data;
4475 summary_mark_as_spam(mainwin->summaryview, TRUE, NULL);
4478 static void mark_as_ham_cb(GtkAction *action, gpointer data)
4480 MainWindow *mainwin = (MainWindow *)data;
4481 summary_mark_as_spam(mainwin->summaryview, FALSE, NULL);
4484 static void ignore_thread_cb(GtkAction *action, gpointer data)
4486 MainWindow *mainwin = (MainWindow *)data;
4487 summary_ignore_thread(mainwin->summaryview);
4490 static void unignore_thread_cb(GtkAction *action, gpointer data)
4492 MainWindow *mainwin = (MainWindow *)data;
4493 summary_unignore_thread(mainwin->summaryview);
4496 static void watch_thread_cb(GtkAction *action, gpointer data)
4498 MainWindow *mainwin = (MainWindow *)data;
4499 summary_watch_thread(mainwin->summaryview);
4502 static void unwatch_thread_cb(GtkAction *action, gpointer data)
4504 MainWindow *mainwin = (MainWindow *)data;
4505 summary_unwatch_thread(mainwin->summaryview);
4508 static void lock_msgs_cb(GtkAction *action, gpointer data)
4510 MainWindow *mainwin = (MainWindow *)data;
4511 summary_msgs_lock(mainwin->summaryview);
4514 static void unlock_msgs_cb(GtkAction *action, gpointer data)
4516 MainWindow *mainwin = (MainWindow *)data;
4517 summary_msgs_unlock(mainwin->summaryview);
4521 static void reedit_cb(GtkAction *action, gpointer data)
4523 MainWindow *mainwin = (MainWindow *)data;
4524 summary_reedit(mainwin->summaryview);
4527 static void open_urls_cb(GtkAction *action, gpointer data)
4529 MainWindow *mainwin = (MainWindow *)data;
4530 if (!mainwin->summaryview->displayed && mainwin->summaryview->selected) {
4531 summary_display_msg_selected(mainwin->summaryview,
4532 prefs_common.show_all_headers);
4534 messageview_list_urls(mainwin->messageview);
4537 static void add_address_cb(GtkAction *action, gpointer data)
4539 MainWindow *mainwin = (MainWindow *)data;
4540 summary_add_address(mainwin->summaryview);
4543 static void set_charset_cb(GtkAction *action, GtkRadioAction *current, gpointer data)
4545 MainWindow *mainwin = (MainWindow *)data;
4546 gint value = gtk_radio_action_get_current_value (GTK_RADIO_ACTION (current));
4547 const gchar *str;
4549 if (gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (current))) {
4550 str = conv_get_charset_str((CharSet)value);
4552 g_free(mainwin->messageview->forced_charset);
4553 mainwin->messageview->forced_charset = str ? g_strdup(str) : NULL;
4554 procmime_force_charset(str);
4556 summary_redisplay_msg(mainwin->summaryview);
4558 debug_print("forced charset: %s\n", str ? str : "Auto-Detect");
4562 static void set_decode_cb(GtkAction *action, GtkRadioAction *current, gpointer data)
4564 MainWindow *mainwin = (MainWindow *)data;
4565 gint value = gtk_radio_action_get_current_value (GTK_RADIO_ACTION (current));
4566 if (gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (current))) {
4567 mainwin->messageview->forced_encoding = (EncodingType)value;
4569 summary_redisplay_msg(mainwin->summaryview);
4571 debug_print("forced encoding: %d\n", value);
4575 static void hide_read_messages (GtkAction *action, gpointer data)
4577 MainWindow *mainwin = (MainWindow *)data;
4578 GtkWidget *menuitem = gtk_ui_manager_get_widget(mainwin->ui_manager, "/Menu/View/HideReadMessages");
4579 if (!mainwin->summaryview->folder_item
4580 || g_object_get_data(G_OBJECT(menuitem), "dont_toggle"))
4581 return;
4582 summary_toggle_show_read_messages(mainwin->summaryview);
4585 static void hide_del_messages (GtkAction *action, gpointer data)
4587 MainWindow *mainwin = (MainWindow *)data;
4588 GtkWidget *menuitem = gtk_ui_manager_get_widget(mainwin->ui_manager, "/Menu/View/HideDelMessages");
4589 if (!mainwin->summaryview->folder_item
4590 || g_object_get_data(G_OBJECT(menuitem), "dont_toggle"))
4591 return;
4592 summary_toggle_show_del_messages(mainwin->summaryview);
4595 static void hide_read_threads (GtkAction *action, gpointer data)
4597 MainWindow *mainwin = (MainWindow *)data;
4598 GtkWidget *menuitem = gtk_ui_manager_get_widget(mainwin->ui_manager, "/Menu/View/HideReadThreads");
4599 if (!mainwin->summaryview->folder_item
4600 || g_object_get_data(G_OBJECT(menuitem), "dont_toggle"))
4601 return;
4602 summary_toggle_show_read_threads(mainwin->summaryview);
4605 static void thread_cb(GtkAction *action, gpointer data)
4607 MainWindow *mainwin = (MainWindow *)data;
4608 gboolean threaded = FALSE;
4609 guint selected_msgnum = 0;
4611 if (mainwin->menu_lock_count) return;
4612 if (!mainwin->summaryview->folder_item) return;
4614 main_window_cursor_wait(mainwin);
4616 selected_msgnum = summary_get_msgnum(mainwin->summaryview, mainwin->summaryview->selected);
4618 threaded = gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (action));
4620 mainwin->summaryview->folder_item->threaded = threaded;
4622 mainwin->summaryview->threaded = threaded;
4624 summary_show(mainwin->summaryview,
4625 mainwin->summaryview->folder_item, FALSE);
4626 summary_select_by_msgnum(mainwin->summaryview, selected_msgnum, FALSE);
4628 main_window_cursor_normal(mainwin);
4631 static void expand_threads_cb(GtkAction *action, gpointer data)
4633 MainWindow *mainwin = (MainWindow *)data;
4634 summary_expand_threads(mainwin->summaryview);
4637 static void collapse_threads_cb(GtkAction *action, gpointer data)
4639 MainWindow *mainwin = (MainWindow *)data;
4640 summary_collapse_threads(mainwin->summaryview);
4643 static void set_summary_display_item_cb(GtkAction *action, gpointer data)
4645 prefs_summary_column_open();
4648 static void set_folder_display_item_cb(GtkAction *action, gpointer data)
4650 prefs_folder_column_open();
4653 static void sort_summary_cb(GtkAction *action, GtkRadioAction *current, gpointer data)
4655 MainWindow *mainwin = (MainWindow *)data;
4656 gint value = gtk_radio_action_get_current_value (GTK_RADIO_ACTION (current));
4658 if (mainwin->menu_lock_count) return;
4660 if (gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (current))) {
4661 summary_sort(mainwin->summaryview, (FolderSortKey)value,
4662 mainwin->summaryview->sort_type);
4666 static void sort_summary_type_cb(GtkAction *gaction, GtkRadioAction *current, gpointer data)
4668 MainWindow *mainwin = (MainWindow *)data;
4669 gint value = gtk_radio_action_get_current_value (GTK_RADIO_ACTION (current));
4671 if (mainwin->menu_lock_count) return;
4673 if (gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (current)))
4674 summary_sort(mainwin->summaryview,
4675 mainwin->summaryview->sort_key, (FolderSortType)value);
4678 static void attract_by_subject_cb(GtkAction *action, gpointer data)
4680 MainWindow *mainwin = (MainWindow *)data;
4681 summary_attract_by_subject(mainwin->summaryview);
4684 void mainwindow_delete_duplicated(MainWindow *mainwin)
4686 FolderItem *item;
4688 item = folderview_get_selected_item(mainwin->folderview);
4689 if (item) {
4690 gint result;
4692 main_window_cursor_wait(mainwin);
4693 STATUSBAR_PUSH(mainwin, _("Deleting duplicated messages..."));
4694 result = folderutils_delete_duplicates(item, prefs_common.immediate_exec ?
4695 DELETE_DUPLICATES_REMOVE : DELETE_DUPLICATES_SETFLAG);
4696 STATUSBAR_POP(mainwin);
4697 main_window_cursor_normal(mainwin);
4699 switch (result) {
4700 case -1:
4701 break;
4702 case 0:
4703 alertpanel_notice(_("No duplicate message found in selected folder.\n"));
4704 break;
4705 default: {
4706 gchar *msg;
4708 if (prefs_common.immediate_exec) {
4709 msg = ngettext("Deleted %d duplicate message in selected folder.\n",
4710 "Deleted %d duplicate messages in selected folder.\n",
4711 result);
4712 } else {
4713 msg = ngettext("Marked %d duplicate message for deletion in selected folder.\n",
4714 "Marked %d duplicate messages for deletion in selected folder.\n",
4715 result);
4717 alertpanel_notice(msg, result);
4723 static void delete_duplicated_cb(GtkAction *action, gpointer data)
4725 mainwindow_delete_duplicated((MainWindow *)data);
4728 struct DelDupsData
4730 guint dups;
4731 guint folders;
4734 static void deldup_all(FolderItem *item, gpointer _data)
4736 struct DelDupsData *data = _data;
4737 gint result;
4739 result = folderutils_delete_duplicates(item, DELETE_DUPLICATES_REMOVE);
4740 if (result >= 0) {
4741 data->dups += result;
4742 data->folders += 1;
4746 void mainwindow_delete_duplicated_all(MainWindow *mainwin)
4748 struct DelDupsData data = {0, 0};
4750 main_window_cursor_wait(mainwin);
4751 STATUSBAR_PUSH(mainwin, _("Deleting duplicated messages in all folders..."));
4752 folder_func_to_all_folders(deldup_all, &data);
4753 STATUSBAR_POP(mainwin);
4754 main_window_cursor_normal(mainwin);
4756 if (data.dups > 0) {
4757 alertpanel_notice(ngettext("Deleted %d duplicate message in %d folders.\n",
4758 "Deleted %d duplicate messages in %d folders.\n",
4759 data.dups),
4760 data.dups, data.folders);
4761 } else {
4762 alertpanel_notice(_("No duplicate message found in %d folders.\n"), data.folders);
4766 static void delete_duplicated_all_cb(GtkAction *action, gpointer mw)
4768 MainWindow *mainwin = (MainWindow *)mw;
4770 mainwindow_delete_duplicated_all(mainwin);
4773 static void filter_cb(GtkAction *action, gpointer data)
4775 MainWindow *mainwin = (MainWindow *)data;
4776 summary_filter(mainwin->summaryview, FALSE);
4779 static void filter_list_cb(GtkAction *action, gpointer data)
4781 MainWindow *mainwin = (MainWindow *)data;
4782 summary_filter(mainwin->summaryview, TRUE);
4785 static void process_cb(GtkAction *action, gpointer data)
4787 MainWindow *mainwin = (MainWindow *)data;
4788 FolderItem *item = mainwin->summaryview->folder_item;
4789 cm_return_if_fail(item != NULL);
4791 item->processing_pending = TRUE;
4792 folder_item_apply_processing(item);
4793 item->processing_pending = FALSE;
4796 static void execute_summary_cb(GtkAction *action, gpointer data)
4798 MainWindow *mainwin = (MainWindow *)data;
4799 summary_execute(mainwin->summaryview);
4802 static void expunge_summary_cb(GtkAction *action, gpointer data)
4804 MainWindow *mainwin = (MainWindow *)data;
4805 summary_expunge(mainwin->summaryview);
4808 static void update_summary_cb(GtkAction *action, gpointer data)
4810 MainWindow *mainwin = (MainWindow *)data;
4811 FolderItem *fitem;
4812 FolderView *folderview = mainwin->folderview;
4814 if (!mainwin->summaryview->folder_item) return;
4815 if ((fitem = folderview_get_opened_item(folderview)) == NULL) return;
4817 folder_update_op_count();
4818 folder_item_scan(fitem);
4819 summary_show(mainwin->summaryview, fitem, FALSE);
4822 static void prev_cb(GtkAction *action, gpointer data)
4824 MainWindow *mainwin = (MainWindow *)data;
4825 summary_select_prev(mainwin->summaryview);
4828 static void next_cb(GtkAction *action, gpointer data)
4830 MainWindow *mainwin = (MainWindow *)data;
4831 summary_select_next(mainwin->summaryview);
4834 static void prev_unread_cb(GtkAction *action, gpointer data)
4836 MainWindow *mainwin = (MainWindow *)data;
4837 summary_select_prev_unread(mainwin->summaryview);
4840 static void next_unread_cb(GtkAction *action, gpointer data)
4842 MainWindow *mainwin = (MainWindow *)data;
4843 summary_select_next_unread(mainwin->summaryview);
4846 static void prev_new_cb(GtkAction *action, gpointer data)
4848 MainWindow *mainwin = (MainWindow *)data;
4849 summary_select_prev_new(mainwin->summaryview);
4852 static void next_new_cb(GtkAction *action, gpointer data)
4854 MainWindow *mainwin = (MainWindow *)data;
4855 summary_select_next_new(mainwin->summaryview);
4858 static void prev_marked_cb(GtkAction *action, gpointer data)
4860 MainWindow *mainwin = (MainWindow *)data;
4861 summary_select_prev_marked(mainwin->summaryview);
4864 static void next_marked_cb(GtkAction *action, gpointer data)
4866 MainWindow *mainwin = (MainWindow *)data;
4867 summary_select_next_marked(mainwin->summaryview);
4870 static void prev_labeled_cb(GtkAction *action, gpointer data)
4872 MainWindow *mainwin = (MainWindow *)data;
4873 summary_select_prev_labeled(mainwin->summaryview);
4876 static void next_labeled_cb(GtkAction *action, gpointer data)
4878 MainWindow *mainwin = (MainWindow *)data;
4879 summary_select_next_labeled(mainwin->summaryview);
4882 static void prev_history_cb(GtkAction *action, gpointer data)
4884 MainWindow *mainwin = (MainWindow *)data;
4885 MsgInfo *info = messageview_nav_get_prev(mainwin->messageview);
4886 if (info) {
4887 if (info->folder != mainwin->summaryview->folder_item)
4888 folderview_select(mainwin->folderview, info->folder);
4889 summary_select_by_msgnum(mainwin->summaryview, info->msgnum,
4890 OPEN_SELECTED_ON_PREVNEXT);
4891 procmsg_msginfo_free(&info);
4892 main_window_set_menu_sensitive(mainwindow_get_mainwindow());
4893 toolbar_main_set_sensitive(mainwindow_get_mainwindow());
4897 static void next_history_cb(GtkAction *action, gpointer data)
4899 MainWindow *mainwin = (MainWindow *)data;
4900 MsgInfo *info = messageview_nav_get_next(mainwin->messageview);
4901 if (info) {
4902 if (info->folder != mainwin->summaryview->folder_item)
4903 folderview_select(mainwin->folderview, info->folder);
4904 summary_select_by_msgnum(mainwin->summaryview, info->msgnum,
4905 OPEN_SELECTED_ON_PREVNEXT);
4906 procmsg_msginfo_free(&info);
4907 main_window_set_menu_sensitive(mainwindow_get_mainwindow());
4908 toolbar_main_set_sensitive(mainwindow_get_mainwindow());
4912 static void parent_cb(GtkAction *action, gpointer data)
4914 MainWindow *mainwin = (MainWindow *)data;
4915 summary_select_parent(mainwin->summaryview);
4918 static void goto_folder_cb(GtkAction *action, gpointer data)
4920 MainWindow *mainwin = (MainWindow *)data;
4921 FolderItem *to_folder;
4923 to_folder = foldersel_folder_sel(NULL, FOLDER_SEL_ALL, NULL, FALSE,
4924 _("Select folder to go to"));
4926 if (to_folder)
4927 folderview_select(mainwin->folderview, to_folder);
4930 static void goto_unread_folder_cb(GtkAction *action, gpointer data)
4932 MainWindow *mainwin = (MainWindow *)data;
4933 folderview_select_next_with_flag(mainwin->folderview, MSG_UNREAD);
4936 static void scroll_prev_line_cb(GtkAction *action, gpointer data)
4938 MainWindow *mainwin = (MainWindow *)data;
4939 mimeview_scroll_one_line(mainwin->messageview->mimeview,TRUE);
4942 static void scroll_next_line_cb(GtkAction *action, gpointer data)
4944 MainWindow *mainwin = (MainWindow *)data;
4945 mimeview_scroll_one_line(mainwin->messageview->mimeview,FALSE);
4948 static void scroll_prev_page_cb(GtkAction *action, gpointer data)
4950 MainWindow *mainwin = (MainWindow *)data;
4951 mimeview_scroll_page(mainwin->messageview->mimeview,TRUE);
4954 static void scroll_next_page_cb(GtkAction *action, gpointer data)
4956 MainWindow *mainwin = (MainWindow *)data;
4957 mimeview_scroll_page(mainwin->messageview->mimeview,FALSE);
4960 static void copy_cb(GtkAction *action, gpointer data)
4962 MainWindow *mainwin = (MainWindow *)data;
4963 messageview_copy_clipboard(mainwin->messageview);
4966 static void allsel_cb(GtkAction *action, gpointer data)
4968 MainWindow *mainwin = (MainWindow *)data;
4969 MessageView *msgview = mainwin->messageview;
4971 if (messageview_is_visible(msgview) &&
4972 (gtk_widget_has_focus(msgview->mimeview->textview->text)))
4973 messageview_select_all(mainwin->messageview);
4974 else
4975 summary_select_all(mainwin->summaryview);
4978 static void select_thread_cb(GtkAction *action, gpointer data)
4980 MainWindow *mainwin = (MainWindow *)data;
4981 summary_select_thread(mainwin->summaryview, FALSE, FALSE);
4984 static void trash_thread_cb(GtkAction *action, gpointer data)
4986 MainWindow *mainwin = (MainWindow *)data;
4987 summary_select_thread(mainwin->summaryview, FALSE, TRUE);
4990 static void delete_thread_cb(GtkAction *action, gpointer data)
4992 MainWindow *mainwin = (MainWindow *)data;
4993 summary_select_thread(mainwin->summaryview, TRUE, FALSE);
4996 static void create_filter_cb(GtkAction *gaction, gpointer data)
4998 MainWindow *mainwin = (MainWindow *)data;
4999 const gchar *a_name = gtk_action_get_name(gaction);
5000 gint action = -1;
5002 DO_ACTION("Tools/CreateFilterRule/Automatically", FILTER_BY_AUTO);
5003 DO_ACTION("Tools/CreateFilterRule/ByFrom", FILTER_BY_FROM);
5004 DO_ACTION("Tools/CreateFilterRule/ByTo", FILTER_BY_TO);
5005 DO_ACTION("Tools/CreateFilterRule/BySubject", FILTER_BY_SUBJECT);
5006 DO_ACTION("Tools/CreateFilterRule/BySender", FILTER_BY_SENDER);
5007 summary_filter_open(mainwin->summaryview, (PrefsFilterType)action, 0);
5010 static void create_processing_cb(GtkAction *gaction, gpointer data)
5012 MainWindow *mainwin = (MainWindow *)data;
5013 const gchar *a_name = gtk_action_get_name(gaction);
5014 gint action = -1;
5016 DO_ACTION("Tools/CreateProcessingRule/Automatically", FILTER_BY_AUTO);
5017 DO_ACTION("Tools/CreateProcessingRule/ByFrom", FILTER_BY_FROM);
5018 DO_ACTION("Tools/CreateProcessingRule/ByTo", FILTER_BY_TO);
5019 DO_ACTION("Tools/CreateProcessingRule/BySubject", FILTER_BY_SUBJECT);
5020 DO_ACTION("Tools/CreateProcessingRule/BySender", FILTER_BY_SENDER);
5021 summary_filter_open(mainwin->summaryview, (PrefsFilterType)action, 1);
5024 static void prefs_pre_processing_open_cb(GtkAction *action, gpointer data)
5026 prefs_filtering_open(&pre_global_processing,
5027 _("Processing rules to apply before folder rules"),
5028 MANUAL_ANCHOR_PROCESSING,
5029 NULL, NULL, FALSE);
5032 static void prefs_post_processing_open_cb(GtkAction *action, gpointer data)
5034 prefs_filtering_open(&post_global_processing,
5035 _("Processing rules to apply after folder rules"),
5036 MANUAL_ANCHOR_PROCESSING,
5037 NULL, NULL, FALSE);
5040 static void prefs_filtering_open_cb(GtkAction *action, gpointer data)
5042 prefs_filtering_open(&filtering_rules,
5043 _("Filtering configuration"),
5044 MANUAL_ANCHOR_FILTERING,
5045 NULL, NULL, TRUE);
5048 static void prefs_template_open_cb(GtkAction *action, gpointer data)
5050 prefs_template_open();
5053 static void prefs_actions_open_cb(GtkAction *action, gpointer data)
5055 MainWindow *mainwin = (MainWindow *)data;
5056 prefs_actions_open(mainwin);
5059 static void prefs_tags_open_cb(GtkAction *action, gpointer data)
5061 tags_window_open(NULL);
5063 #ifdef USE_GNUTLS
5064 static void ssl_manager_open_cb(GtkAction *action, gpointer data)
5066 MainWindow *mainwin = (MainWindow *)data;
5067 ssl_manager_open(mainwin);
5069 #endif
5070 static void prefs_account_open_cb(GtkAction *action, gpointer data)
5072 MainWindow *mainwin = (MainWindow *)data;
5073 if (!cur_account) {
5074 new_account_cb(NULL, mainwin);
5075 } else {
5076 account_open(cur_account, FALSE);
5080 static void new_account_cb(GtkAction *action, gpointer data)
5082 account_edit_open(NULL, NULL);
5083 if (!compose_get_compose_list()) account_add();
5086 static void account_selector_menu_cb(GtkMenuItem *menuitem, gpointer data)
5088 FolderItem *item = NULL;
5089 cur_account = (PrefsAccount *)data;
5091 if (!mainwindow_get_mainwindow())
5092 return;
5093 main_window_show_cur_account(mainwindow_get_mainwindow());
5094 toolbar_update(TOOLBAR_MAIN, mainwindow_get_mainwindow());
5095 main_window_set_menu_sensitive(mainwindow_get_mainwindow());
5096 toolbar_main_set_sensitive(mainwindow_get_mainwindow());
5097 item = folderview_get_selected_item(
5098 mainwindow_get_mainwindow()->folderview);
5099 if (item) {
5100 toolbar_set_compose_button
5101 (mainwindow_get_mainwindow()->toolbar,
5102 FOLDER_TYPE(item->folder) == F_NEWS ?
5103 COMPOSEBUTTON_NEWS : COMPOSEBUTTON_MAIL);
5107 static void account_receive_menu_cb(GtkMenuItem *menuitem, gpointer data)
5109 MainWindow *mainwin = (MainWindow *)mainwin_list->data;
5110 PrefsAccount *account = (PrefsAccount *)data;
5112 inc_account_mail(mainwin, account);
5114 #ifndef GENERIC_UMPC
5115 static void account_compose_menu_cb(GtkMenuItem *menuitem, gpointer data)
5117 PrefsAccount *account = (PrefsAccount *)data;
5119 compose_new_with_folderitem(account, NULL, NULL);
5121 #endif
5122 static void prefs_open_cb(GtkAction *action, gpointer data)
5124 prefs_gtk_open();
5127 static void plugins_open_cb(GtkAction *action, gpointer data)
5129 pluginwindow_create();
5132 static void manual_open_cb(GtkAction *action, gpointer data)
5134 manual_open(MANUAL_MANUAL_CLAWS, NULL);
5137 static void manual_faq_open_cb(GtkAction *action, gpointer data)
5139 manual_open(MANUAL_FAQ_CLAWS, NULL);
5142 static void legend_open_cb(GtkAction *action, gpointer data)
5144 legend_show();
5147 #ifdef G_OS_WIN32
5148 static void set_default_client_cb(GtkAction *action, gpointer data)
5150 char exename[MAX_PATH];
5151 gchar *binary_icon = NULL;
5152 gchar *binary_compose = NULL;
5153 gchar *binary_run = NULL;
5154 gboolean r;
5155 if ( !GetModuleFileNameA (0, exename, sizeof (exename)) ) {
5156 alertpanel_error(_("Can not register as default client: impossible to get executable path."));
5157 return;
5159 binary_icon = g_strconcat(exename, ",0", NULL);
5160 binary_compose = g_strconcat(exename, " --compose %1", NULL);
5161 binary_run = g_strconcat(exename, NULL);
5163 /* Try to set the Mail Start menu item to Claws. It may fail if we're not root; we don't care */
5164 r = write_w32_registry_string(HKEY_LOCAL_MACHINE,
5165 "Software\\Clients\\Mail",
5167 "Claws Mail");
5169 r = write_w32_registry_string(HKEY_CURRENT_USER,
5170 "Software\\Clients\\Mail\\Claws Mail",
5172 "Claws Mail");
5173 if (r)
5174 r = write_w32_registry_string(HKEY_CURRENT_USER,
5175 "Software\\Clients\\Mail\\Claws Mail",
5176 "DLLPath",
5177 "");
5178 if (r)
5179 r = write_w32_registry_string(HKEY_CURRENT_USER,
5180 "Software\\Clients\\Mail\\Claws Mail\\Protocols\\mailto",
5182 "URL:MailTo-Protocol");
5183 if (r)
5184 r = write_w32_registry_string(HKEY_CURRENT_USER,
5185 "Software\\Clients\\Mail\\Claws Mail\\Protocols\\mailto",
5186 "URL Protocol",
5187 "");
5188 if (r)
5189 r = write_w32_registry_dword (HKEY_CURRENT_USER,
5190 "Software\\Clients\\Mail\\Claws Mail\\Protocols\\mailto",
5191 "EditFlags",
5193 if (r)
5194 r = write_w32_registry_string(HKEY_CURRENT_USER,
5195 "Software\\Clients\\Mail\\Claws Mail\\Protocols\\mailto",
5196 "FriendlyTypeName",
5197 "Claws-Mail URL");
5198 if (r)
5199 r = write_w32_registry_string(HKEY_CURRENT_USER,
5200 "Software\\Clients\\Mail\\Claws Mail\\Protocols\\mailto\\DefaultIcon",
5202 binary_icon);
5203 if (r)
5204 r = write_w32_registry_string(HKEY_CURRENT_USER,
5205 "Software\\Clients\\Mail\\Claws Mail\\Protocols\\mailto\\shell\\open\\command",
5207 binary_compose);
5208 if (r)
5209 r = write_w32_registry_string(HKEY_CURRENT_USER,
5210 "Software\\Clients\\Mail\\Claws Mail\\shell\\open\\command",
5212 binary_run);
5214 if (r)
5215 r = write_w32_registry_string(HKEY_CURRENT_USER,
5216 "Software\\Classes\\mailto",
5218 "URL:MailTo-Protocol");
5219 if (r)
5220 r = write_w32_registry_string(HKEY_CURRENT_USER,
5221 "Software\\Classes\\mailto",
5222 "URL Protocol",
5223 "");
5224 if (r)
5225 r = write_w32_registry_dword (HKEY_CURRENT_USER,
5226 "Software\\Classes\\mailto",
5227 "EditFlags",
5229 if (r)
5230 r = write_w32_registry_string(HKEY_CURRENT_USER,
5231 "Software\\Classes\\mailto",
5232 "FriendlyTypeName",
5233 "Claws-Mail URL");
5234 if (r)
5235 r = write_w32_registry_string(HKEY_CURRENT_USER,
5236 "Software\\Classes\\mailto\\DefaultIcon",
5238 binary_icon);
5239 if (r)
5240 r = write_w32_registry_string(HKEY_CURRENT_USER,
5241 "Software\\Classes\\mailto\\shell\\open\\command",
5243 binary_compose);
5245 if (r) {
5246 SendMessage(HWND_BROADCAST, WM_SETTINGCHANGE, 0, (LPARAM)"Software\\Clients\\Mail");
5247 alertpanel_notice(_("Claws Mail has been registered as default client."));
5248 } else {
5249 alertpanel_error(_("Can not register as default client: impossible to write to the registry."));
5251 g_free(binary_icon);
5252 g_free(binary_compose);
5253 g_free(binary_run);
5255 #endif
5257 static void scan_tree_func(Folder *folder, FolderItem *item, gpointer data)
5259 MainWindow *mainwin = (MainWindow *)data;
5260 gchar *str;
5262 if (item->path)
5263 str = g_strdup_printf(_("Scanning folder %s%c%s..."),
5264 LOCAL_FOLDER(folder)->rootpath,
5265 G_DIR_SEPARATOR,
5266 item->path);
5267 else
5268 str = g_strdup_printf(_("Scanning folder %s..."),
5269 LOCAL_FOLDER(folder)->rootpath);
5271 STATUSBAR_PUSH(mainwin, str);
5272 STATUSBAR_POP(mainwin);
5273 g_free(str);
5276 static gboolean mainwindow_focus_in_event(GtkWidget *widget, GdkEventFocus *focus,
5277 gpointer data)
5279 SummaryView *summary;
5281 cm_return_val_if_fail(data, FALSE);
5282 if (!g_list_find(mainwin_list, data))
5283 return TRUE;
5284 summary = ((MainWindow *)data)->summaryview;
5285 cm_return_val_if_fail(summary, FALSE);
5287 if (GTK_CMCLIST(summary->ctree)->selection &&
5288 g_list_length(GTK_CMCLIST(summary->ctree)->selection) > 1)
5289 return FALSE;
5291 return FALSE;
5294 static gboolean mainwindow_visibility_event_cb(GtkWidget *widget, GdkEventVisibility *event,
5295 gpointer data)
5297 is_obscured = (event->state == GDK_VISIBILITY_FULLY_OBSCURED);
5298 return FALSE;
5301 static gboolean mainwindow_state_event_cb(GtkWidget *widget, GdkEventWindowState *state,
5302 gpointer data)
5304 if (!claws_is_starting()
5305 && state->changed_mask&GDK_WINDOW_STATE_ICONIFIED
5306 && state->new_window_state&GDK_WINDOW_STATE_ICONIFIED) {
5308 if (iconified_count > 0)
5309 hooks_invoke(MAIN_WINDOW_GOT_ICONIFIED, NULL);
5310 iconified_count++;
5311 } else if (!claws_is_starting()) {
5312 prefs_common.mainwin_maximised =
5313 ((state->new_window_state&GDK_WINDOW_STATE_MAXIMIZED) != 0);
5315 if (state->new_window_state == 0)
5316 gtk_window_set_skip_taskbar_hint(GTK_WINDOW(widget), FALSE);
5317 return FALSE;
5320 gboolean mainwindow_is_obscured(void)
5322 return is_obscured;
5326 * Harvest addresses for selected folder.
5328 static void addr_harvest_cb( GtkAction *action, gpointer data)
5330 MainWindow *mainwin = (MainWindow *)data;
5332 addressbook_harvest( mainwin->summaryview->folder_item, FALSE, NULL );
5336 * Harvest addresses for selected messages in summary view.
5338 static void addr_harvest_msg_cb( GtkAction *action, gpointer data)
5340 MainWindow *mainwin = (MainWindow *)data;
5341 summary_harvest_address( mainwin->summaryview );
5345 *\brief get a MainWindow
5347 *\return MainWindow * The first mainwindow in the mainwin_list
5349 MainWindow *mainwindow_get_mainwindow(void)
5351 if (mainwin_list && mainwin_list->data)
5352 return (MainWindow *)(mainwin_list->data);
5353 else
5354 return NULL;
5357 static gboolean mainwindow_progressindicator_hook(gpointer source, gpointer userdata)
5359 ProgressData *data = (ProgressData *) source;
5360 MainWindow *mainwin = (MainWindow *) userdata;
5362 switch (data->cmd) {
5363 case PROGRESS_COMMAND_START:
5364 case PROGRESS_COMMAND_STOP:
5365 gtk_progress_bar_set_fraction
5366 (GTK_PROGRESS_BAR(mainwin->progressbar), 0.0);
5367 break;
5368 case PROGRESS_COMMAND_SET_PERCENTAGE:
5369 gtk_progress_bar_set_fraction
5370 (GTK_PROGRESS_BAR(mainwin->progressbar), data->value);
5371 break;
5373 while (gtk_events_pending()) gtk_main_iteration ();
5375 return FALSE;
5378 static void sync_cb(GtkAction *action, gpointer data)
5380 MainWindow *mainwin = (MainWindow *)data;
5381 mainwindow_check_synchronise(mainwin, FALSE);
5384 static void forget_session_passwords_cb(GtkAction *action, gpointer data)
5386 MainWindow *mainwin = (MainWindow *)data;
5387 GList *list = NULL;
5388 gint fgtn = 0;
5389 gint accs = 0;
5391 main_window_lock(mainwin);
5392 for (list = account_get_list(); list != NULL; list = list->next) {
5393 PrefsAccount *account = list->data;
5394 if (account->session_passwd) {
5395 g_free(account->session_passwd);
5396 account->session_passwd = NULL;
5397 ++fgtn;
5399 if (account->session_smtp_passwd) {
5400 g_free(account->session_smtp_passwd);
5401 account->session_smtp_passwd = NULL;
5402 ++fgtn;
5404 ++accs;
5406 main_window_unlock(mainwin);
5407 alertpanel_notice(ngettext("Forgotten %d password in %d accounts.\n",
5408 "Forgotten %d passwords in %d accounts.\n",
5409 fgtn), fgtn, accs);
5412 #ifndef PASSWORD_CRYPTO_OLD
5413 static void forget_primary_passphrase_cb(GtkAction *action, gpointer data)
5415 MainWindow *mainwin = (MainWindow *)data;
5417 main_window_lock(mainwin);
5418 primary_passphrase_forget();
5419 main_window_unlock(mainwin);
5421 #endif
5423 void mainwindow_learn (MainWindow *mainwin, gboolean is_spam)
5425 summary_mark_as_spam(mainwin->summaryview, is_spam, NULL);
5428 void mainwindow_jump_to(const gchar *target, gboolean popup)
5430 gchar *tmp = NULL;
5431 FolderItem *item = NULL;
5432 gchar *msg = NULL;
5433 MainWindow *mainwin = mainwindow_get_mainwindow();
5434 gchar *from_uri = NULL;
5435 if (!target)
5436 return;
5438 if (!mainwin) {
5439 g_print("not initialized\n");
5440 return;
5443 if ((from_uri = g_filename_from_uri(target, NULL, NULL)) != NULL)
5444 tmp = from_uri;
5445 else
5446 tmp = g_strdup(target);
5448 strcrlftrunc(tmp);
5450 if ((item = folder_find_item_from_identifier(tmp))) {
5451 g_print("selecting folder '%s'\n", tmp);
5452 folderview_select(mainwin->folderview, item);
5453 if (popup)
5454 main_window_popup(mainwin);
5455 g_free(tmp);
5456 return;
5459 msg = strrchr(tmp, '/');
5460 if (msg) {
5461 *msg++ = '\0';
5462 if ((item = folder_find_item_from_identifier(tmp))) {
5463 g_print("selecting folder '%s'\n", tmp);
5464 folderview_select(mainwin->folderview, item);
5465 } else if ((item = folder_find_item_from_real_path(tmp))) {
5466 g_print("selecting folder '%s'\n", tmp);
5467 folderview_select(mainwin->folderview, item);
5468 } else {
5469 g_print("'%s' not found\n", tmp);
5471 if (item && msg && atoi(msg)) {
5472 g_print("selecting message %d\n", atoi(msg));
5473 summary_select_by_msgnum(mainwin->summaryview, atoi(msg), TRUE);
5474 if (popup)
5475 main_window_popup(mainwin);
5476 g_free(tmp);
5477 return;
5478 } else if (item && msg[0] == '<' && msg[strlen(msg)-1] == '>') {
5479 MsgInfo *msginfo = NULL;
5480 msg++;
5481 msg[strlen(msg)-1] = '\0';
5482 msginfo = folder_item_get_msginfo_by_msgid(item, msg);
5483 if (msginfo) {
5484 g_print("selecting message %s\n", msg);
5485 summary_select_by_msgnum(mainwin->summaryview, msginfo->msgnum, TRUE);
5486 if (popup)
5487 main_window_popup(mainwin);
5488 g_free(tmp);
5489 procmsg_msginfo_free(&msginfo);
5490 return;
5491 } else {
5492 g_print("'%s' not found\n", msg);
5494 } else {
5495 g_print("'%s' not found\n", msg);
5497 } else {
5498 g_print("'%s' not found\n", tmp);
5501 g_free(tmp);
5504 void mainwindow_exit_folder(MainWindow *mainwin) {
5505 if (prefs_common.layout_mode == SMALL_LAYOUT) {
5506 folderview_close_opened(mainwin->folderview, FALSE);
5507 mainwin_paned_show_first(GTK_PANED(mainwin->hpaned));
5508 folderview_grab_focus(mainwin->folderview);
5510 mainwin->in_folder = FALSE;
5511 main_window_set_menu_sensitive(mainwin);
5514 void mainwindow_enter_folder(MainWindow *mainwin) {
5515 if (prefs_common.layout_mode == SMALL_LAYOUT) {
5516 mainwin_paned_show_last(GTK_PANED(mainwin->hpaned));
5518 mainwin->in_folder = TRUE;
5519 main_window_set_menu_sensitive(mainwin);
5522 static void save_part_as_cb(GtkAction *action, gpointer data)
5524 MainWindow *mainwin = (MainWindow *)data;
5526 if (mainwin->messageview
5527 && mainwin->messageview->mimeview)
5528 mimeview_save_as(mainwin->messageview->mimeview);
5531 static void view_part_as_text_cb(GtkAction *action, gpointer data)
5533 MainWindow *mainwin = (MainWindow *)data;
5535 if (mainwin->messageview
5536 && mainwin->messageview->mimeview)
5537 mimeview_display_as_text(mainwin->messageview->mimeview);
5540 static void open_part_cb(GtkAction *action, gpointer data)
5542 MainWindow *mainwin = (MainWindow *)data;
5544 if (mainwin->messageview
5545 && mainwin->messageview->mimeview)
5546 mimeview_launch(mainwin->messageview->mimeview, NULL);
5548 #ifndef G_OS_WIN32
5549 static void open_part_with_cb(GtkAction *action, gpointer data)
5551 MainWindow *mainwin = (MainWindow *)data;
5553 if (mainwin->messageview
5554 && mainwin->messageview->mimeview)
5555 mimeview_open_with(mainwin->messageview->mimeview);
5557 #endif
5558 static void check_signature_cb(GtkAction *action, gpointer data)
5560 MainWindow *mainwin = (MainWindow *)data;
5562 if (mainwin->messageview
5563 && mainwin->messageview->mimeview)
5564 mimeview_check_signature(mainwin->messageview->mimeview);
5567 static void goto_next_part_cb(GtkAction *action, gpointer data)
5569 MainWindow *mainwin = (MainWindow *)data;
5571 if (mainwin->messageview
5572 && mainwin->messageview->mimeview)
5573 mimeview_select_next_part(mainwin->messageview->mimeview);
5576 static void goto_prev_part_cb(GtkAction *action, gpointer data)
5578 MainWindow *mainwin = (MainWindow *)data;
5580 if (mainwin->messageview
5581 && mainwin->messageview->mimeview)
5582 mimeview_select_prev_part(mainwin->messageview->mimeview);