Disable stack execution on plugins
[claws.git] / src / mainwindow.c
blob847511c417f28b317385ec9a95f0e5e6fd74dc1d
1 /*
2 * Claws Mail -- a GTK based, lightweight, and fast e-mail client
3 * Copyright (C) 1999-2023 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 gtk_paned_set_position(GTK_PANED(ppaned),
2732 prefs_common.summaryview_height);
2733 g_object_unref(ppaned);
2735 break;
2736 case WIDE_LAYOUT:
2737 container = mainwin->vpaned;
2738 if (gtk_widget_get_parent(mainwin->messageview->vbox) != NULL) {
2739 mainwin->messageview->visible = FALSE;
2740 summaryview->displayed = NULL;
2741 g_object_ref(mainwin->messageview->vbox);
2742 gtk_container_remove(GTK_CONTAINER(container), mainwin->messageview->vbox);
2743 } else {
2744 mainwin->messageview->visible = TRUE;
2745 gtk_container_add(GTK_CONTAINER(container), mainwin->messageview->vbox);
2746 g_object_unref(mainwin->messageview->vbox);
2748 break;
2749 case WIDE_MSGLIST_LAYOUT:
2750 g_warning("can't hide messageview in this wide msglist layout");
2751 break;
2754 if (messageview_is_visible(mainwin->messageview))
2755 gtk_image_set_from_icon_name(GTK_IMAGE(mainwin->summaryview->toggle_arrow),
2756 "pan-down-symbolic", GTK_ICON_SIZE_MENU);
2757 else
2758 gtk_image_set_from_icon_name(GTK_IMAGE(mainwin->summaryview->toggle_arrow),
2759 "pan-up-symbolic", GTK_ICON_SIZE_MENU);
2761 if (mainwin->messageview->visible == FALSE)
2762 messageview_clear(mainwin->messageview);
2764 main_window_set_menu_sensitive(mainwin);
2766 prefs_common.msgview_visible = mainwin->messageview->visible;
2768 if (messageview_is_visible(mainwin->messageview)) {
2769 gtk_widget_queue_resize(mainwin->hpaned);
2770 gtk_widget_queue_resize(mainwin->vpaned);
2772 summary_grab_focus(summaryview);
2773 if (!summary_is_list(summaryview)) {
2774 summary_show(summaryview, summaryview->folder_item, FALSE);
2778 void main_window_get_size(MainWindow *mainwin)
2780 GtkAllocation allocation;
2782 if (mainwin_list == NULL || mainwin->messageview == NULL) {
2783 debug_print("called after messageview "
2784 "has been deallocated!\n");
2785 return;
2788 if (prefs_common.mainwin_fullscreen) {
2789 debug_print("mainwin in full screen state. "
2790 "Keeping original settings\n");
2793 gtk_widget_get_allocation(GTK_WIDGET_PTR(mainwin->summaryview), &allocation);
2794 if (allocation.width > 1 && allocation.height > 1 && !prefs_common.mainwin_fullscreen) {
2795 prefs_common.summaryview_width = allocation.width;
2797 if (messageview_is_visible(mainwin->messageview))
2798 prefs_common.summaryview_height = allocation.height;
2800 prefs_common.mainview_width = allocation.width;
2803 gtk_window_get_size(GTK_WINDOW(mainwin->window), &allocation.width, &allocation.height);
2804 if (allocation.width > 1 && allocation.height > 1 &&
2805 !prefs_common.mainwin_maximised && !prefs_common.mainwin_fullscreen) {
2806 prefs_common.mainview_height = allocation.height;
2807 prefs_common.mainwin_width = allocation.width;
2808 prefs_common.mainwin_height = allocation.height;
2811 gtk_widget_get_allocation(GTK_WIDGET_PTR(mainwin->folderview), &allocation);
2812 if (allocation.width > 1 && allocation.height > 1 &&
2813 !prefs_common.mainwin_fullscreen) {
2814 prefs_common.folderview_width = allocation.width;
2815 prefs_common.folderview_height = allocation.height;
2818 gtk_widget_get_allocation(GTK_WIDGET_PTR(mainwin->messageview), &allocation);
2819 if (allocation.width > 1 && allocation.height > 1 &&
2820 !prefs_common.mainwin_fullscreen) {
2821 prefs_common.msgview_width = allocation.width;
2822 prefs_common.msgview_height = allocation.height;
2825 /* debug_print("summaryview size: %d x %d\n",
2826 prefs_common.summaryview_width,
2827 prefs_common.summaryview_height);
2828 debug_print("folderview size: %d x %d\n",
2829 prefs_common.folderview_width,
2830 prefs_common.folderview_height);
2831 debug_print("messageview size: %d x %d\n",
2832 prefs_common.msgview_width,
2833 prefs_common.msgview_height); */
2836 void main_window_get_position(MainWindow *mainwin)
2838 gint x, y;
2840 if (prefs_common.mainwin_maximised || prefs_common.mainwin_fullscreen)
2841 return;
2843 gtk_window_get_position(GTK_WINDOW(mainwin->window), &x, &y);
2845 prefs_common.mainview_x = x;
2846 prefs_common.mainview_y = y;
2847 prefs_common.mainwin_x = x;
2848 prefs_common.mainwin_y = y;
2850 debug_print("main window position: %d, %d\n", x, y);
2853 void main_window_progress_on(MainWindow *mainwin)
2855 gtk_progress_bar_set_text(GTK_PROGRESS_BAR(mainwin->progressbar), "");
2858 void main_window_progress_off(MainWindow *mainwin)
2860 gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(mainwin->progressbar), 0.0);
2861 gtk_progress_bar_set_text(GTK_PROGRESS_BAR(mainwin->progressbar), "");
2864 gboolean main_window_empty_trash(MainWindow *mainwin, gboolean confirm, gboolean for_quit)
2866 if (confirm && procmsg_have_trashed_mails_fast()) {
2867 AlertValue val;
2869 if (for_quit)
2870 val = alertpanel(_("Empty trash"),
2871 _("Delete all messages in trash folders?"),
2872 NULL, _("_No"), NULL, _("_Yes"), NULL, _("Don't quit"),
2873 ALERTFOCUS_SECOND);
2874 else
2875 val = alertpanel(_("Empty trash"),
2876 _("Delete all messages in trash folders?"),
2877 NULL, _("_No"), NULL, _("_Yes"), NULL, NULL,
2878 ALERTFOCUS_SECOND);
2879 if (val == G_ALERTALTERNATE) {
2880 debug_print("will empty trash\n");
2881 } else if (val == G_ALERTDEFAULT) {
2882 debug_print("will not empty trash\n");
2883 return TRUE;
2884 } else {
2885 return FALSE; /* cancel exit */
2887 manage_window_focus_in(mainwin->window, NULL, NULL);
2890 procmsg_empty_all_trash();
2892 if (mainwin->summaryview->folder_item &&
2893 mainwin->summaryview->folder_item->stype == F_TRASH)
2894 folderview_grab_focus(mainwin->folderview);
2895 return TRUE;
2898 static void main_window_add_mailbox(MainWindow *mainwin)
2900 gchar *path;
2901 Folder *folder;
2903 path = input_dialog(_("Add mailbox"),
2904 _("Input the location of the mailbox.\n"
2905 "The location can be either the full path or relative to the \n"
2906 "home directory.\n"
2907 "If the location of an existing mailbox is specified, it will be\n"
2908 "scanned automatically."),
2909 "Mail");
2910 if (!path) return;
2911 if (folder_find_from_path(path)) {
2912 alertpanel_error(_("The mailbox '%s' already exists."), path);
2913 g_free(path);
2914 return;
2916 folder = folder_new(folder_get_class_from_string("mh"),
2917 !strcmp(path, "Mail") ? _("Mailbox") :
2918 g_path_get_basename(path), path);
2919 g_free(path);
2921 if (folder->klass->create_tree(folder) < 0) {
2922 alertpanel_error(_("Creation of the mailbox failed.\n"
2923 "Maybe some files already exist, or you don't have the permission to write there."));
2924 folder_destroy(folder);
2925 return;
2928 folder_add(folder);
2929 folder_set_ui_func(folder, scan_tree_func, mainwin);
2930 folder_scan_tree(folder, TRUE);
2931 folder_set_ui_func(folder, NULL, NULL);
2934 SensitiveCondMask main_window_get_current_state(MainWindow *mainwin)
2936 SensitiveCondMask state = 0;
2937 SummarySelection selection;
2938 FolderItem *item = mainwin->summaryview->folder_item;
2939 GList *account_list = account_get_list();
2940 GSList *tmp;
2942 selection = summary_get_selection_type(mainwin->summaryview);
2944 #define UPDATE_STATE(...) \
2945 do { \
2946 state |= main_window_get_mask(__VA_ARGS__, -1); \
2947 } while (0)
2949 if (mainwin->lock_count == 0 && !claws_is_starting())
2950 UPDATE_STATE(M_UNLOCKED);
2951 if (selection != SUMMARY_NONE && selection != SUMMARY_SELECTED_NONE)
2952 UPDATE_STATE(M_MSG_SELECTED);
2953 if (item && item->total_msgs > 0)
2954 UPDATE_STATE(M_MSG_EXIST);
2955 if (item && item->path && folder_item_parent(item) && !item->no_select) {
2956 UPDATE_STATE(M_EXEC);
2957 /* if (item->folder->type != F_NEWS) */
2958 UPDATE_STATE(M_ALLOW_DELETE);
2960 if (prefs_common.immediate_exec == 0
2961 && mainwin->lock_count == 0)
2962 UPDATE_STATE(M_DELAY_EXEC);
2964 if ((selection == SUMMARY_NONE && item->hide_read_msgs)
2965 || selection != SUMMARY_NONE)
2966 UPDATE_STATE(M_HIDE_READ_MSG);
2968 if ((selection == SUMMARY_NONE && item->hide_read_threads)
2969 || selection != SUMMARY_NONE)
2970 UPDATE_STATE(M_HIDE_READ_THREADS);
2972 if (mainwin->summaryview->threaded)
2973 UPDATE_STATE(M_THREADED);
2974 else
2975 UPDATE_STATE(M_UNTHREADED);
2976 if (selection == SUMMARY_SELECTED_SINGLE ||
2977 selection == SUMMARY_SELECTED_MULTIPLE)
2978 UPDATE_STATE(M_TARGET_EXIST);
2979 if (selection == SUMMARY_SELECTED_SINGLE)
2980 UPDATE_STATE(M_SINGLE_TARGET_EXIST);
2981 if (mainwin->summaryview->folder_item &&
2982 mainwin->summaryview->folder_item->folder->klass->type == F_NEWS)
2983 UPDATE_STATE(M_NEWS);
2984 else
2985 UPDATE_STATE(M_NOT_NEWS);
2986 if (mainwin->summaryview->folder_item &&
2987 (mainwin->summaryview->folder_item->stype != F_TRASH ||
2988 !folder_has_parent_of_type(mainwin->summaryview->folder_item, F_TRASH)))
2989 UPDATE_STATE(M_NOT_TRASH);
2991 if (mainwin->summaryview->folder_item
2992 && mainwin->summaryview->folder_item->stype != F_DRAFT)
2993 UPDATE_STATE(M_NOT_DRAFT);
2995 if (prefs_common.actions_list && g_slist_length(prefs_common.actions_list))
2996 UPDATE_STATE(M_ACTIONS_EXIST);
2998 tmp = tags_get_list();
2999 if (tmp && g_slist_length(tmp))
3000 UPDATE_STATE(M_TAGS_EXIST);
3001 g_slist_free(tmp);
3003 if (procmsg_have_queued_mails_fast() && !procmsg_is_sending())
3004 UPDATE_STATE(M_HAVE_QUEUED_MAILS);
3006 if (selection == SUMMARY_SELECTED_SINGLE &&
3007 (item &&
3008 (folder_has_parent_of_type(item, F_DRAFT) ||
3009 folder_has_parent_of_type(item, F_OUTBOX) ||
3010 folder_has_parent_of_type(item, F_QUEUE))))
3011 UPDATE_STATE(M_ALLOW_REEDIT);
3012 if (cur_account)
3013 UPDATE_STATE(M_HAVE_ACCOUNT);
3015 if (cur_account && cur_account->protocol != A_NONE)
3016 UPDATE_STATE(M_HAVE_RETRIEVABLE_ACCOUNT);
3018 if (any_folder_want_synchronise())
3019 UPDATE_STATE(M_WANT_SYNC);
3021 if (item && item->prefs->processing && selection != SUMMARY_NONE)
3022 UPDATE_STATE(M_HAVE_PROCESSING);
3024 if (g_list_length(account_list) > 1)
3025 UPDATE_STATE(M_HAVE_MULTI_ACCOUNT);
3027 for (account_list = account_get_list(); account_list != NULL; account_list = account_list->next) {
3028 if (((PrefsAccount*)account_list->data)->protocol != A_NONE) {
3029 UPDATE_STATE(M_HAVE_ANY_RETRIEVABLE_ACCOUNT);
3030 break;
3034 for (account_list = account_get_list(); account_list != NULL; account_list = account_list->next) {
3035 if (((PrefsAccount*)account_list->data)->protocol == A_NNTP) {
3036 UPDATE_STATE(M_HAVE_NEWS_ACCOUNT);
3037 break;
3041 if (procmsg_spam_can_learn() &&
3042 (mainwin->summaryview->folder_item &&
3043 mainwin->summaryview->folder_item->folder->klass->type != F_UNKNOWN &&
3044 mainwin->summaryview->folder_item->folder->klass->type != F_NEWS)) {
3045 UPDATE_STATE(M_CAN_LEARN_SPAM);
3048 if (mainwin->summaryview->folder_item) {
3049 UPDATE_STATE(M_FOLDER_SELECTED);
3052 if (inc_is_active())
3053 UPDATE_STATE(M_INC_ACTIVE);
3054 if (imap_cancel_all_enabled())
3055 UPDATE_STATE(M_INC_ACTIVE);
3057 if (send_is_active() | procmsg_is_sending())
3058 UPDATE_STATE(M_SEND_ACTIVE);
3060 if (mainwin->summaryview->deleted > 0)
3061 UPDATE_STATE(M_DELETED_EXISTS);
3063 if (mainwin->summaryview->deleted > 0 ||
3064 mainwin->summaryview->moved > 0 ||
3065 mainwin->summaryview->copied > 0)
3066 UPDATE_STATE(M_DELAY_EXEC);
3068 if (summary_is_list(mainwin->summaryview))
3069 UPDATE_STATE(M_SUMMARY_ISLIST);
3071 if (prefs_common.layout_mode != SMALL_LAYOUT || mainwin->in_folder)
3072 UPDATE_STATE(M_IN_MSGLIST);
3074 for (account_list = account_get_list(); account_list != NULL; account_list = account_list->next) {
3075 PrefsAccount *account = account_list->data;
3076 if (account->session_passwd || account->session_smtp_passwd) {
3077 UPDATE_STATE(M_SESSION_PASSWORDS);
3078 break;
3082 #ifndef PASSWORD_CRYPTO_OLD
3083 if (primary_passphrase_is_entered()) {
3084 UPDATE_STATE(M_MASTER_PASSPHRASE);
3086 #endif
3088 #undef UPDATE_STATE
3090 return state;
3093 SensitiveCondMask main_window_get_mask(SensitiveCond cond, ...)
3095 va_list args;
3096 gint i;
3097 SensitiveCondMask value;
3098 static SensitiveCondMask SensitiveCond_table[M_MAX_RESERVED];
3099 static gboolean first_time = TRUE;
3101 if (first_time) {
3102 for (i = 0; i < M_MAX_RESERVED; i++)
3103 SensitiveCond_table[i] = (SensitiveCondMask) ((SensitiveCondMask)1 << i);
3104 first_time = FALSE;
3107 value = 0;
3109 va_start(args, cond);
3110 for (i = (gint) cond; i >= 0; i = va_arg(args, gint))
3111 value |= SensitiveCond_table[i];
3112 va_end(args);
3114 return value;
3117 void main_window_set_menu_sensitive(MainWindow *mainwin)
3119 SensitiveCondMask state;
3120 gboolean sensitive;
3121 SummaryView *summaryview;
3122 gchar *menu_path;
3123 GtkWidget *menu;
3124 GList *children, *cur_item;
3125 gboolean mimepart_selected = FALSE;
3127 state = main_window_get_current_state(mainwin);
3129 #define SET_SENSITIVE(entry_str, ...) \
3131 SensitiveCondMask cond = main_window_get_mask(__VA_ARGS__, -1); \
3132 cm_menu_set_sensitive_full(mainwin->ui_manager, \
3133 (const gchar *) entry_str, \
3134 ((cond & state) == cond)); \
3136 SET_SENSITIVE("Menu/File/SaveAs", M_TARGET_EXIST);
3137 SET_SENSITIVE("Menu/File/SavePartAs", M_SINGLE_TARGET_EXIST);
3138 SET_SENSITIVE("Menu/File/Print", M_TARGET_EXIST);
3139 SET_SENSITIVE("Menu/File/SynchroniseFolders", M_WANT_SYNC);
3140 SET_SENSITIVE("Menu/File/Exit", M_UNLOCKED);
3142 SET_SENSITIVE("Menu/Edit/SelectThread", M_TARGET_EXIST, M_SUMMARY_ISLIST);
3143 SET_SENSITIVE("Menu/Edit/Find", M_SINGLE_TARGET_EXIST);
3144 SET_SENSITIVE("Menu/Edit/QuickSearch", M_IN_MSGLIST);
3145 SET_SENSITIVE("Menu/Edit/SearchFolder", M_TARGET_EXIST, M_SUMMARY_ISLIST);
3147 SET_SENSITIVE("Menu/View/SetColumns/Folderlist", M_UNLOCKED, M_SUMMARY_ISLIST);
3148 SET_SENSITIVE("Menu/View/Sort", M_EXEC, M_SUMMARY_ISLIST);
3149 SET_SENSITIVE("Menu/View/ThreadView", M_EXEC, M_SUMMARY_ISLIST);
3150 SET_SENSITIVE("Menu/View/ExpandThreads", M_MSG_EXIST, M_SUMMARY_ISLIST);
3151 SET_SENSITIVE("Menu/View/CollapseThreads", M_MSG_EXIST, M_SUMMARY_ISLIST);
3152 SET_SENSITIVE("Menu/View/HideReadThreads", M_HIDE_READ_THREADS, M_SUMMARY_ISLIST, M_NOT_DRAFT);
3153 SET_SENSITIVE("Menu/View/HideReadMessages", M_HIDE_READ_MSG, M_SUMMARY_ISLIST, M_NOT_DRAFT);
3154 SET_SENSITIVE("Menu/View/HideDelMessages", M_SUMMARY_ISLIST, M_NOT_DRAFT);
3155 SET_SENSITIVE("Menu/View/Goto/Prev", M_MSG_SELECTED);
3156 SET_SENSITIVE("Menu/View/Goto/Next", M_MSG_SELECTED);
3157 SET_SENSITIVE("Menu/View/Goto/PrevUnread", M_MSG_SELECTED);
3158 SET_SENSITIVE("Menu/View/Goto/NextUnread", M_MSG_SELECTED);
3159 SET_SENSITIVE("Menu/View/Goto/PrevNew", M_MSG_SELECTED);
3160 SET_SENSITIVE("Menu/View/Goto/NextNew", M_MSG_SELECTED);
3161 SET_SENSITIVE("Menu/View/Goto/PrevMarked", M_MSG_SELECTED);
3162 SET_SENSITIVE("Menu/View/Goto/NextMarked", M_MSG_SELECTED);
3163 SET_SENSITIVE("Menu/View/Goto/PrevLabeled", M_MSG_SELECTED);
3164 SET_SENSITIVE("Menu/View/Goto/NextLabeled", M_MSG_SELECTED);
3165 SET_SENSITIVE("Menu/View/Goto/ParentMessage", M_SINGLE_TARGET_EXIST);
3166 SET_SENSITIVE("Menu/View/Goto/NextPart", M_SINGLE_TARGET_EXIST);
3167 SET_SENSITIVE("Menu/View/Goto/PrevPart", M_SINGLE_TARGET_EXIST);
3168 SET_SENSITIVE("Menu/View/OpenNewWindow", M_SINGLE_TARGET_EXIST);
3169 SET_SENSITIVE("Menu/View/MessageSource", M_SINGLE_TARGET_EXIST);
3170 SET_SENSITIVE("Menu/View/Part", M_SINGLE_TARGET_EXIST);
3171 SET_SENSITIVE("Menu/View/AllHeaders", M_SINGLE_TARGET_EXIST);
3172 SET_SENSITIVE("Menu/View/Quotes", M_SINGLE_TARGET_EXIST);
3174 SET_SENSITIVE("Menu/Message/Receive/CurrentAccount", M_HAVE_ACCOUNT, M_UNLOCKED, M_HAVE_RETRIEVABLE_ACCOUNT);
3175 SET_SENSITIVE("Menu/Message/Receive/AllAccounts", M_HAVE_ACCOUNT, M_UNLOCKED, M_HAVE_ANY_RETRIEVABLE_ACCOUNT);
3176 SET_SENSITIVE("Menu/Message/Receive/CancelReceiving", M_INC_ACTIVE);
3177 SET_SENSITIVE("Menu/Message/SendQueue", M_HAVE_ACCOUNT, M_HAVE_QUEUED_MAILS);
3178 SET_SENSITIVE("Menu/Message/CancelSending", M_SEND_ACTIVE);
3179 SET_SENSITIVE("Menu/Message/ComposeEmail", M_HAVE_ACCOUNT);
3180 SET_SENSITIVE("Menu/Message/ComposeNews", M_HAVE_NEWS_ACCOUNT);
3181 SET_SENSITIVE("Menu/Message/Reply", M_HAVE_ACCOUNT, M_TARGET_EXIST, M_SUMMARY_ISLIST);
3182 SET_SENSITIVE("Menu/Message/ReplyTo", M_HAVE_ACCOUNT, M_TARGET_EXIST, M_SUMMARY_ISLIST);
3183 SET_SENSITIVE("Menu/Message/FollowupReply", M_HAVE_ACCOUNT, M_TARGET_EXIST, M_NEWS, M_SUMMARY_ISLIST);
3184 SET_SENSITIVE("Menu/Message/Forward", M_HAVE_ACCOUNT, M_TARGET_EXIST, M_SUMMARY_ISLIST);
3185 SET_SENSITIVE("Menu/Message/ForwardAtt", M_HAVE_ACCOUNT, M_TARGET_EXIST, M_SUMMARY_ISLIST);
3186 SET_SENSITIVE("Menu/Message/Redirect", M_HAVE_ACCOUNT, M_TARGET_EXIST, M_SUMMARY_ISLIST);
3187 SET_SENSITIVE("Menu/Message/Move", M_TARGET_EXIST, M_ALLOW_DELETE, M_NOT_NEWS);
3188 SET_SENSITIVE("Menu/Message/Copy", M_TARGET_EXIST, M_EXEC);
3189 SET_SENSITIVE("Menu/Message/Trash", M_TARGET_EXIST, M_ALLOW_DELETE, M_NOT_NEWS, M_NOT_TRASH);
3190 SET_SENSITIVE("Menu/Message/Delete", M_TARGET_EXIST, M_ALLOW_DELETE);
3191 SET_SENSITIVE("Menu/Message/TrashThread", M_TARGET_EXIST, M_SUMMARY_ISLIST);
3192 SET_SENSITIVE("Menu/Message/DeleteThread", M_TARGET_EXIST, M_SUMMARY_ISLIST);
3193 SET_SENSITIVE("Menu/Message/CancelNews", M_TARGET_EXIST, M_ALLOW_DELETE, M_NEWS);
3194 SET_SENSITIVE("Menu/Message/Mark", M_TARGET_EXIST, M_SUMMARY_ISLIST);
3195 SET_SENSITIVE("Menu/Message/Mark/MarkSpam", M_TARGET_EXIST, M_CAN_LEARN_SPAM);
3196 SET_SENSITIVE("Menu/Message/Mark/MarkHam", M_TARGET_EXIST, M_CAN_LEARN_SPAM);
3197 SET_SENSITIVE("Menu/Message/Mark/IgnoreThread", M_TARGET_EXIST);
3198 SET_SENSITIVE("Menu/Message/Mark/UnignoreThread", M_TARGET_EXIST);
3199 SET_SENSITIVE("Menu/Message/Mark/Lock", M_TARGET_EXIST);
3200 SET_SENSITIVE("Menu/Message/Mark/Unlock", M_TARGET_EXIST);
3201 SET_SENSITIVE("Menu/Message/ColorLabel", M_TARGET_EXIST);
3202 SET_SENSITIVE("Menu/Message/Tags", M_TARGET_EXIST);
3203 SET_SENSITIVE("Menu/Message/Reedit", M_HAVE_ACCOUNT, M_ALLOW_REEDIT);
3204 SET_SENSITIVE("Menu/Message/CheckSignature", M_SINGLE_TARGET_EXIST);
3206 SET_SENSITIVE("Menu/Tools/AddSenderToAB", M_SINGLE_TARGET_EXIST);
3207 SET_SENSITIVE("Menu/Tools/CollectAddresses", M_FOLDER_SELECTED);
3208 SET_SENSITIVE("Menu/Tools/CollectAddresses/FromFolder", M_FOLDER_SELECTED);
3209 SET_SENSITIVE("Menu/Tools/CollectAddresses/FromSelected", M_TARGET_EXIST);
3210 SET_SENSITIVE("Menu/Tools/FilterFolder", M_MSG_EXIST, M_EXEC);
3211 SET_SENSITIVE("Menu/Tools/FilterSelected", M_TARGET_EXIST, M_EXEC);
3212 SET_SENSITIVE("Menu/Tools/RunProcessing", M_HAVE_PROCESSING);
3213 SET_SENSITIVE("Menu/Tools/CreateFilterRule", M_SINGLE_TARGET_EXIST, M_UNLOCKED);
3214 SET_SENSITIVE("Menu/Tools/CreateProcessingRule", M_SINGLE_TARGET_EXIST, M_UNLOCKED);
3215 SET_SENSITIVE("Menu/Tools/ListUrls", M_TARGET_EXIST);
3216 SET_SENSITIVE("Menu/Tools/Actions", M_TARGET_EXIST, M_ACTIONS_EXIST);
3217 SET_SENSITIVE("Menu/Tools/Execute", M_DELAY_EXEC);
3218 SET_SENSITIVE("Menu/Tools/Expunge", M_DELETED_EXISTS);
3219 SET_SENSITIVE("Menu/Tools/ForgetSessionPasswords", M_SESSION_PASSWORDS);
3220 #ifndef PASSWORD_CRYPTO_OLD
3221 SET_SENSITIVE("Menu/Tools/ForgetPrimaryPassphrase", M_MASTER_PASSPHRASE);
3222 #endif
3223 SET_SENSITIVE("Menu/Tools/DeleteDuplicates/SelFolder", M_MSG_EXIST, M_ALLOW_DELETE);
3225 SET_SENSITIVE("Menu/Configuration", M_UNLOCKED);
3226 SET_SENSITIVE("Menu/Configuration/ChangeAccount", M_HAVE_MULTI_ACCOUNT);
3227 SET_SENSITIVE("Menu/Configuration/AccountPrefs", M_UNLOCKED);
3228 SET_SENSITIVE("Menu/Configuration/CreateAccount", M_UNLOCKED);
3229 SET_SENSITIVE("Menu/Configuration/EditAccounts", M_UNLOCKED);
3230 #undef SET_SENSITIVE
3232 menu = gtk_menu_item_get_submenu(GTK_MENU_ITEM(
3233 gtk_ui_manager_get_widget(mainwin->ui_manager, "/Menu/Message/Receive")));
3235 children = gtk_container_get_children(GTK_CONTAINER(menu));
3236 for (cur_item = children; cur_item != NULL; cur_item = cur_item->next) {
3237 if (cur_item->data == gtk_ui_manager_get_widget(mainwin->ui_manager, "/Menu/Message/Receive/Separator1")) {
3238 cur_item = cur_item->next;
3239 break;
3243 for (; cur_item != NULL; cur_item = cur_item->next) {
3244 gtk_widget_set_sensitive(GTK_WIDGET(cur_item->data),
3245 (main_window_get_mask(M_UNLOCKED, -1) & state) != 0);
3248 g_list_free(children);
3250 main_window_menu_callback_block(mainwin);
3252 cm_toggle_menu_set_active_full(mainwin->ui_manager, "Menu/View/ShowHide/MessageView",
3253 messageview_is_visible(mainwin->messageview));
3255 summaryview = mainwin->summaryview;
3257 switch (summaryview->sort_key) {
3258 case SORT_BY_NUMBER:
3259 menu_path = "Menu/View/Sort/Number"; break;
3260 case SORT_BY_SIZE:
3261 menu_path = "Menu/View/Sort/Size"; break;
3262 case SORT_BY_DATE:
3263 menu_path = "Menu/View/Sort/Date"; break;
3264 case SORT_BY_THREAD_DATE:
3265 menu_path = "Menu/View/Sort/ThreadDate"; break;
3266 case SORT_BY_FROM:
3267 menu_path = "Menu/View/Sort/From"; break;
3268 case SORT_BY_TO:
3269 menu_path = "Menu/View/Sort/To"; break;
3270 case SORT_BY_SUBJECT:
3271 menu_path = "Menu/View/Sort/Subject"; break;
3272 case SORT_BY_LABEL:
3273 menu_path = "Menu/View/Sort/Color"; break;
3274 case SORT_BY_MARK:
3275 menu_path = "Menu/View/Sort/Mark"; break;
3276 case SORT_BY_STATUS:
3277 menu_path = "Menu/View/Sort/Status"; break;
3278 case SORT_BY_MIME:
3279 menu_path = "Menu/View/Sort/Attachment"; break;
3280 case SORT_BY_SCORE:
3281 menu_path = "Menu/View/Sort/Score"; break;
3282 case SORT_BY_LOCKED:
3283 menu_path = "Menu/View/Sort/Locked"; break;
3284 case SORT_BY_TAGS:
3285 menu_path = "Menu/View/Sort/Tag"; break;
3286 case SORT_BY_NONE:
3287 default:
3288 menu_path = "Menu/View/Sort/DontSort"; break;
3290 cm_toggle_menu_set_active_full(mainwin->ui_manager, menu_path, TRUE);
3292 if (summaryview->sort_type == SORT_ASCENDING) {
3293 cm_toggle_menu_set_active_full(mainwin->ui_manager, "Menu/View/Sort/Ascending", TRUE);
3294 } else {
3295 cm_toggle_menu_set_active_full(mainwin->ui_manager, "Menu/View/Sort/Descending", TRUE);
3298 if (summaryview->sort_key != SORT_BY_NONE) {
3299 cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/View/Sort/Ascending", TRUE);
3300 cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/View/Sort/Descending", TRUE);
3301 } else {
3302 cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/View/Sort/Ascending", FALSE);
3303 cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/View/Sort/Descending", FALSE);
3306 if (mainwin->messageview
3307 && mainwin->messageview->mimeview
3308 && mainwin->messageview->mimeview->textview)
3309 cm_toggle_menu_set_active_full(mainwin->ui_manager, "Menu/View/AllHeaders",
3310 prefs_common.show_all_headers);
3311 cm_toggle_menu_set_active_full(mainwin->ui_manager, "Menu/View/ThreadView", (state & main_window_get_mask(M_THREADED, -1)) != 0);
3312 cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/View/ExpandThreads", (state & main_window_get_mask(M_THREADED, -1)) != 0);
3313 cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/View/CollapseThreads", (state & main_window_get_mask(M_THREADED, -1)) != 0);
3314 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);
3315 cm_toggle_menu_set_active_full(mainwin->ui_manager, "Menu/View/Quotes/CollapseAll", (prefs_common.hide_quotes == 1));
3316 cm_toggle_menu_set_active_full(mainwin->ui_manager, "Menu/View/Quotes/Collapse2", (prefs_common.hide_quotes == 2));
3317 cm_toggle_menu_set_active_full(mainwin->ui_manager, "Menu/View/Quotes/Collapse3", (prefs_common.hide_quotes == 3));
3319 if (mainwin->summaryview->folder_item && !mainwin->summaryview->folder_item->threaded)
3320 cm_toggle_menu_set_active_full(mainwin->ui_manager, "Menu/View/HideReadThreads", FALSE);
3321 if ((mainwin->summaryview->folder_item && mainwin->summaryview->folder_item->hide_read_msgs) ||
3322 quicksearch_has_sat_predicate(mainwin->summaryview->quicksearch))
3323 cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/View/HideReadThreads", FALSE);
3324 if ((mainwin->summaryview->folder_item && mainwin->summaryview->folder_item->hide_read_threads) ||
3325 quicksearch_has_sat_predicate(mainwin->summaryview->quicksearch))
3326 cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/View/HideReadMessages", FALSE);
3327 if (quicksearch_has_sat_predicate(mainwin->summaryview->quicksearch))
3328 cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/View/HideDelMessages", FALSE);
3330 cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/View/Goto/PrevHistory",
3331 messageview_nav_has_prev(mainwin->messageview));
3332 cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/View/Goto/NextHistory",
3333 messageview_nav_has_next(mainwin->messageview));
3335 if (mainwin->messageview
3336 && mainwin->messageview->mimeview)
3337 mimepart_selected = !mimeview_tree_is_empty(mainwin->messageview->mimeview);
3339 cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/File/SavePartAs", mimepart_selected);
3340 cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/View/Goto/NextPart", mimepart_selected);
3341 cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/View/Goto/PrevPart", mimepart_selected);
3342 cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/View/Part", mimepart_selected);
3343 cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/Message/CheckSignature",
3344 mimepart_selected && mainwin->messageview->mimeview->signed_part);
3346 sensitive = TRUE;
3347 if (mimepart_selected) {
3348 MimeInfo *partinfo = messageview_get_selected_mime_part(mainwin->messageview);
3350 if (partinfo && (partinfo->type == MIMETYPE_MESSAGE ||
3351 partinfo->type == MIMETYPE_IMAGE ||
3352 partinfo->type == MIMETYPE_MULTIPART)) {
3353 sensitive = FALSE;
3356 cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/View/Part/AsText", sensitive);
3358 main_window_menu_callback_unblock(mainwin);
3361 void main_create_mailing_list_menu (MainWindow *mainwin, MsgInfo *msginfo)
3363 gint is_menu = 0;
3365 if (msginfo)
3366 is_menu = mailing_list_create_submenu (mainwin, msginfo);
3367 if (is_menu)
3368 cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/Message/MailingList", TRUE);
3369 else
3370 cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/Message/MailingList", FALSE);
3373 static gint mailing_list_create_submenu (MainWindow *mainwin, MsgInfo *msginfo)
3375 gint menu_nb = 0;
3376 GtkWidget *menuitem;
3378 if (!msginfo || !msginfo->extradata) {
3379 cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/Message/MailingList/Post", FALSE);
3380 cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/Message/MailingList/Help", FALSE);
3381 cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/Message/MailingList/Subscribe", FALSE);
3382 cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/Message/MailingList/Unsubscribe", FALSE);
3383 cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/Message/MailingList/ViewArchive", FALSE);
3384 cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/Message/MailingList/ContactOwner", FALSE);
3385 return 0;
3388 /* Mailing list post */
3389 if (!g_strcmp0 (msginfo->extradata->list_post, "NO")) {
3390 g_free(msginfo->extradata->list_post);
3391 msginfo->extradata->list_post = g_strdup (_("No posting allowed"));
3393 menuitem = gtk_ui_manager_get_widget(mainwin->ui_manager, "/Menu/Message/MailingList/Post");
3395 menu_nb += mailing_list_populate_submenu (menuitem, msginfo->extradata->list_post);
3397 /* Mailing list help */
3398 menuitem = gtk_ui_manager_get_widget(mainwin->ui_manager, "/Menu/Message/MailingList/Help");
3400 menu_nb += mailing_list_populate_submenu (menuitem, msginfo->extradata->list_help);
3402 /* Mailing list subscribe */
3403 menuitem = gtk_ui_manager_get_widget(mainwin->ui_manager, "/Menu/Message/MailingList/Subscribe");
3405 menu_nb += mailing_list_populate_submenu (menuitem, msginfo->extradata->list_subscribe);
3407 /* Mailing list unsubscribe */
3408 menuitem = gtk_ui_manager_get_widget(mainwin->ui_manager, "/Menu/Message/MailingList/Unsubscribe");
3410 menu_nb += mailing_list_populate_submenu (menuitem, msginfo->extradata->list_unsubscribe);
3412 /* Mailing list view archive */
3413 menuitem = gtk_ui_manager_get_widget(mainwin->ui_manager, "/Menu/Message/MailingList/ViewArchive");
3415 menu_nb += mailing_list_populate_submenu (menuitem, msginfo->extradata->list_archive);
3417 /* Mailing list contact owner */
3418 menuitem = gtk_ui_manager_get_widget(mainwin->ui_manager, "/Menu/Message/MailingList/ContactOwner");
3420 menu_nb += mailing_list_populate_submenu (menuitem, msginfo->extradata->list_owner);
3422 return menu_nb;
3425 static gint mailing_list_populate_submenu (GtkWidget *menuitem, const gchar * list_header)
3427 GtkWidget *item, *menu;
3428 const gchar *url_pt ;
3429 gchar url_decoded[BUFFSIZE];
3430 GList *children, *amenu;
3431 gint menu_nb = 0;
3433 menu = gtk_menu_item_get_submenu(GTK_MENU_ITEM(menuitem));
3435 /* First delete old submenu */
3436 /* FIXME: we can optimize this, and only change/add/delete necessary items */
3437 children = gtk_container_get_children(GTK_CONTAINER(menu));
3438 for (amenu = children; amenu; amenu = amenu->next) {
3439 item = GTK_WIDGET (amenu->data);
3440 gtk_widget_destroy (item);
3442 g_list_free(children);
3443 if (list_header) {
3444 for (url_pt = list_header; url_pt && *url_pt;) {
3445 get_url_part (&url_pt, url_decoded);
3446 item = NULL;
3447 if (!g_ascii_strncasecmp(url_decoded, "mailto:", 7)) {
3448 item = cm_menu_item_new_label_from_url ((url_decoded));
3449 g_signal_connect(G_OBJECT(item), "activate",
3450 G_CALLBACK(mailing_list_compose),
3451 NULL);
3453 else if (!g_ascii_strncasecmp(url_decoded, "http:", 5) ||
3454 !g_ascii_strncasecmp(url_decoded, "https:",6)) {
3456 item = cm_menu_item_new_label_from_url ((url_decoded));
3457 g_signal_connect(G_OBJECT(item), "activate",
3458 G_CALLBACK(mailing_list_open_uri),
3459 NULL);
3461 if (item) {
3462 gtk_menu_shell_append(GTK_MENU_SHELL(menu), item);
3463 gtk_widget_show (item);
3464 menu_nb++;
3468 if (menu_nb)
3469 gtk_widget_set_sensitive (menuitem, TRUE);
3470 else
3471 gtk_widget_set_sensitive (menuitem, FALSE);
3474 return menu_nb;
3477 static void get_url_part (const gchar **buffer, gchar *url_decoded)
3479 gchar tmp[BUFFSIZE];
3480 const gchar *buf;
3481 gint i = 0;
3482 buf = *buffer;
3483 gboolean with_plus = TRUE;
3485 if (buf == 0x00) {
3486 *url_decoded = '\0';
3487 *buffer = NULL;
3488 return;
3490 /* Ignore spaces, comments and tabs () */
3491 for (;*buf == ' ' || *buf == '(' || *buf == '\t'; buf++)
3492 if (*buf == '(')
3493 for (;*buf != ')' && *buf != 0x00; buf++);
3495 /* First non space and non comment must be a < */
3496 if (*buf =='<' ) {
3497 buf++;
3498 if (!strncmp(buf, "mailto:", strlen("mailto:")))
3499 with_plus = FALSE;
3500 for (i = 0;
3501 *buf != '>' && *buf != 0x00 && i < BUFFSIZE;
3502 tmp[i++] = *(buf++));
3503 if (*buf == 0) {
3504 *buffer = NULL;
3505 *url_decoded = '\0';
3506 return;
3508 buf++;
3510 else {
3511 *buffer = NULL;
3512 *url_decoded = '\0';
3513 return;
3516 *url_decoded = '\0';
3517 *buffer = NULL;
3519 if (i == BUFFSIZE) {
3520 return;
3522 tmp[i] = 0x00;
3523 decode_uri_with_plus (url_decoded, (const gchar *)tmp, with_plus);
3525 /* Prepare the work for the next url in the list */
3526 /* after the closing bracket >, ignore space, comments and tabs */
3527 for (;buf && *buf && (*buf == ' ' || *buf == '(' || *buf == '\t'); buf++)
3528 if (*buf == '(')
3529 for (;*buf != ')' && *buf != 0x00; buf++);
3531 if (!buf || !*buf) {
3532 *buffer = NULL;
3533 return;
3536 /* now first non space, non comment must be a comma */
3537 if (*buf != ',')
3538 for (;*buf != 0x00; buf++);
3539 else
3540 buf++;
3541 *buffer = buf;
3544 static void mailing_list_compose (GtkWidget *w, gpointer *data)
3546 const gchar *mailto;
3547 PrefsAccount *account = NULL;
3548 FolderItem *folder_item = NULL;
3550 mailto = gtk_label_get_text(GTK_LABEL (gtk_bin_get_child(GTK_BIN((w)))));
3551 if (mainwindow_get_mainwindow()) {
3552 folder_item = mainwindow_get_mainwindow()->summaryview->folder_item;
3553 if (folder_item && folder_item->prefs && folder_item->prefs->enable_default_account)
3554 account = account_find_from_id(folder_item->prefs->default_account);
3555 if (folder_item && !account)
3556 account = account_find_from_item(folder_item);
3558 if (mailto)
3559 compose_new_with_folderitem(account, folder_item, mailto+7);
3562 static void mailing_list_open_uri (GtkWidget *w, gpointer *data)
3565 const gchar *mailto;
3567 mailto = gtk_label_get_text(GTK_LABEL (gtk_bin_get_child(GTK_BIN((w)))));
3568 if (mailto)
3569 open_uri (mailto, prefs_common_get_uri_cmd());
3572 static void fix_folderview_scroll(MainWindow *mainwin)
3574 static gboolean fix_done = FALSE;
3576 if (fix_done)
3577 return;
3579 gtk_widget_queue_resize(mainwin->folderview->ctree);
3581 fix_done = TRUE;
3584 void main_window_popup(MainWindow *mainwin)
3586 static gboolean first_start = TRUE;
3588 if (!gtk_widget_get_visible(GTK_WIDGET(mainwin->window)))
3589 main_window_show(mainwin);
3591 if (prefs_common.mainwin_maximised)
3592 gtk_window_maximize(GTK_WINDOW(mainwin->window));
3594 if (first_start) {
3595 first_start = FALSE;
3596 } else {
3597 gtkut_window_popup(mainwin->window);
3600 if (prefs_common.layout_mode == SMALL_LAYOUT) {
3601 if (mainwin->in_folder) {
3602 mainwindow_enter_folder(mainwin);
3603 } else {
3604 mainwindow_exit_folder(mainwin);
3607 fix_folderview_scroll(mainwin);
3610 void main_window_show(MainWindow *mainwin)
3612 gtk_widget_show(mainwin->window);
3613 gtk_widget_show(mainwin->vbox_body);
3614 #ifndef GENERIC_UMPC
3615 gtk_window_move(GTK_WINDOW(mainwin->window),
3616 prefs_common.mainwin_x,
3617 prefs_common.mainwin_y);
3618 #endif
3621 void main_window_hide(MainWindow *mainwin)
3623 main_window_get_size(mainwin);
3624 main_window_get_position(mainwin);
3626 gtk_widget_hide(mainwin->window);
3627 gtk_widget_hide(mainwin->vbox_body);
3630 static void main_window_set_widgets(MainWindow *mainwin, LayoutType layout_mode)
3632 GtkWidget *folderwin = NULL;
3633 GtkWidget *messagewin = NULL;
3634 GtkWidget *hpaned;
3635 GtkWidget *vpaned;
3636 GtkWidget *vbox_body = mainwin->vbox_body;
3637 gboolean first_set = (mainwin->hpaned == NULL);
3638 debug_print("Setting widgets...\n");
3640 #ifndef GENERIC_UMPC
3641 mainwin->messageview->statusbar = mainwin->statusbar;
3642 mainwin->messageview->statusbar_cid = mainwin->messageview_cid;
3643 #endif
3644 /* clean top-most container */
3645 if (mainwin->hpaned) {
3646 if (gtk_widget_get_parent(mainwin->hpaned) == mainwin->vpaned)
3647 gtk_widget_destroy(mainwin->vpaned);
3648 else
3649 gtk_widget_destroy(mainwin->hpaned);
3652 cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/View/ShowHide/MessageView",
3653 (layout_mode != WIDE_MSGLIST_LAYOUT && layout_mode != SMALL_LAYOUT));
3654 switch (layout_mode) {
3655 case VERTICAL_LAYOUT:
3656 case NORMAL_LAYOUT:
3657 case SMALL_LAYOUT:
3658 hpaned = gtk_paned_new(GTK_ORIENTATION_HORIZONTAL);
3659 if (layout_mode == VERTICAL_LAYOUT)
3660 vpaned = gtk_paned_new(GTK_ORIENTATION_HORIZONTAL);
3661 else
3662 vpaned = gtk_paned_new(GTK_ORIENTATION_VERTICAL);
3663 gtk_box_pack_start(GTK_BOX(vbox_body), hpaned, TRUE, TRUE, 0);
3664 gtk_paned_add1(GTK_PANED(hpaned),
3665 GTK_WIDGET_PTR(mainwin->folderview));
3666 gtk_widget_show(hpaned);
3668 if (messageview_is_visible(mainwin->messageview)) {
3669 gtk_paned_add2(GTK_PANED(hpaned), vpaned);
3670 gtk_paned_pack1(GTK_PANED(vpaned),
3671 GTK_WIDGET_PTR(mainwin->summaryview), TRUE, TRUE);
3672 } else {
3673 gtk_paned_add2(GTK_PANED(hpaned),
3674 GTK_WIDGET_PTR(mainwin->summaryview));
3675 g_object_ref(vpaned);
3677 gtk_paned_add2(GTK_PANED(vpaned),
3678 GTK_WIDGET_PTR(mainwin->messageview));
3679 gtk_widget_show(vpaned);
3680 if (layout_mode == SMALL_LAYOUT && first_set) {
3681 mainwin_paned_show_first(GTK_PANED(hpaned));
3684 gtk_paned_set_position(GTK_PANED(hpaned),
3685 prefs_common_get_prefs()->folderview_width);
3687 if (layout_mode == NORMAL_LAYOUT &&
3688 messageview_is_visible(mainwin->messageview)) {
3689 gtk_paned_set_position(GTK_PANED(vpaned),
3690 prefs_common_get_prefs()->summaryview_height);
3692 if (layout_mode == VERTICAL_LAYOUT &&
3693 messageview_is_visible(mainwin->messageview)) {
3694 gtk_paned_set_position(GTK_PANED(vpaned),
3695 prefs_common_get_prefs()->summaryview_width);
3698 break;
3699 case WIDE_LAYOUT:
3700 vpaned = gtk_paned_new(GTK_ORIENTATION_VERTICAL);
3701 hpaned = gtk_paned_new(GTK_ORIENTATION_HORIZONTAL);
3702 gtk_box_pack_start(GTK_BOX(vbox_body), vpaned, TRUE, TRUE, 0);
3703 gtk_paned_add1(GTK_PANED(vpaned), hpaned);
3705 gtk_paned_add1(GTK_PANED(hpaned),
3706 GTK_WIDGET_PTR(mainwin->folderview));
3707 gtk_paned_add2(GTK_PANED(hpaned),
3708 GTK_WIDGET_PTR(mainwin->summaryview));
3710 gtk_widget_show(hpaned);
3712 if (messageview_is_visible(mainwin->messageview)) {
3713 gtk_paned_add2(GTK_PANED(vpaned),
3714 GTK_WIDGET_PTR(mainwin->messageview));
3715 } else {
3716 g_object_ref(GTK_WIDGET_PTR(mainwin->messageview));
3718 gtk_widget_show(vpaned);
3720 gtk_paned_set_position(GTK_PANED(hpaned),
3721 prefs_common_get_prefs()->folderview_width);
3723 if (messageview_is_visible(mainwin->messageview)) {
3724 gtk_paned_set_position(GTK_PANED(vpaned),
3725 prefs_common_get_prefs()->summaryview_height);
3728 break;
3729 case WIDE_MSGLIST_LAYOUT:
3730 vpaned = gtk_paned_new(GTK_ORIENTATION_VERTICAL);
3731 hpaned = gtk_paned_new(GTK_ORIENTATION_HORIZONTAL);
3732 gtk_box_pack_start(GTK_BOX(vbox_body), vpaned, TRUE, TRUE, 0);
3734 gtk_paned_add1(GTK_PANED(vpaned),
3735 GTK_WIDGET_PTR(mainwin->summaryview));
3736 gtk_paned_add1(GTK_PANED(hpaned),
3737 GTK_WIDGET_PTR(mainwin->folderview));
3739 gtk_widget_show(hpaned);
3741 if (messageview_is_visible(mainwin->messageview)) {
3742 gtk_paned_add2(GTK_PANED(hpaned),
3743 GTK_WIDGET_PTR(mainwin->messageview));
3744 } else {
3745 g_object_ref(GTK_WIDGET_PTR(mainwin->messageview));
3747 gtk_paned_add2(GTK_PANED(vpaned), hpaned);
3748 gtk_widget_show(vpaned);
3750 gtk_paned_set_position(GTK_PANED(hpaned),
3751 prefs_common_get_prefs()->folderview_width);
3752 gtk_paned_set_position(GTK_PANED(vpaned),
3753 prefs_common_get_prefs()->summaryview_height);
3755 break;
3756 default:
3757 g_warning("unknown layout");
3758 return;
3761 mainwin->hpaned = hpaned;
3762 mainwin->vpaned = vpaned;
3764 if (layout_mode == SMALL_LAYOUT) {
3765 if (mainwin->messageview->visible)
3766 main_window_toggle_message_view(mainwin);
3769 if (layout_mode == SMALL_LAYOUT && first_set) {
3770 gtk_widget_realize(mainwin->window);
3771 gtk_widget_realize(mainwin->folderview->ctree);
3772 gtk_widget_realize(mainwin->summaryview->hbox);
3773 gtk_widget_realize(mainwin->summaryview->hbox_l);
3774 gtk_paned_set_position(GTK_PANED(mainwin->hpaned), 800);
3775 } else {
3776 gtk_window_set_default_size(GTK_WINDOW(mainwin->window),
3777 prefs_common.mainwin_width,
3778 prefs_common.mainwin_height);
3780 /* remove headerview if not in prefs */
3781 headerview_set_visibility(mainwin->messageview->headerview,
3782 prefs_common.display_header_pane);
3784 if (messageview_is_visible(mainwin->messageview))
3785 gtk_image_set_from_icon_name(GTK_IMAGE(mainwin->summaryview->toggle_arrow),
3786 "pan-down-symbolic", GTK_ICON_SIZE_MENU);
3787 else
3788 gtk_image_set_from_icon_name(GTK_IMAGE(mainwin->summaryview->toggle_arrow),
3789 "pan-up-symbolic", GTK_ICON_SIZE_MENU);
3791 gtk_window_move(GTK_WINDOW(mainwin->window),
3792 prefs_common.mainwin_x,
3793 prefs_common.mainwin_y);
3795 /* CLAWS: previous "gtk_widget_show_all" makes noticeview
3796 * and mimeview icon list/ctree lose track of their visibility states */
3797 if (!noticeview_is_visible(mainwin->messageview->noticeview))
3798 gtk_widget_hide(GTK_WIDGET_PTR(mainwin->messageview->noticeview));
3799 if (!noticeview_is_visible(mainwin->messageview->mimeview->siginfoview))
3800 gtk_widget_hide(GTK_WIDGET_PTR(mainwin->messageview->mimeview->siginfoview));
3801 if (mainwin->messageview->mimeview->ctree_mode)
3802 gtk_widget_hide(mainwin->messageview->mimeview->icon_mainbox);
3803 else
3804 gtk_widget_hide(mainwin->messageview->mimeview->ctree_mainbox);
3806 prefs_common.layout_mode = layout_mode;
3808 cm_toggle_menu_set_active_full(mainwin->ui_manager, "Menu/View/ShowHide/MessageView",
3809 messageview_is_visible(mainwin->messageview));
3811 #ifndef GENERIC_UMPC
3812 switch (prefs_common.layout_mode) {
3813 case NORMAL_LAYOUT:
3814 cm_toggle_menu_set_active_full(mainwin->ui_manager, "Menu/View/Layout/Standard", TRUE);
3815 break;
3816 case VERTICAL_LAYOUT:
3817 cm_toggle_menu_set_active_full(mainwin->ui_manager, "Menu/View/Layout/ThreeColumns", TRUE);
3818 break;
3819 case WIDE_LAYOUT:
3820 cm_toggle_menu_set_active_full(mainwin->ui_manager, "Menu/View/Layout/WideMessage", TRUE);
3821 break;
3822 case WIDE_MSGLIST_LAYOUT:
3823 cm_toggle_menu_set_active_full(mainwin->ui_manager, "Menu/View/Layout/WideMessageList", TRUE);
3824 break;
3825 case SMALL_LAYOUT:
3826 cm_toggle_menu_set_active_full(mainwin->ui_manager, "Menu/View/Layout/SmallScreen", TRUE);
3827 break;
3829 #endif
3831 if (folderwin) {
3832 g_signal_connect
3833 (G_OBJECT(folderwin), "size_allocate",
3834 G_CALLBACK(folder_window_size_allocate_cb),
3835 mainwin);
3837 if (messagewin) {
3838 g_signal_connect
3839 (G_OBJECT(messagewin), "size_allocate",
3840 G_CALLBACK(message_window_size_allocate_cb),
3841 mainwin);
3844 debug_print("Setting widgets done.\n");
3847 void main_window_destroy_all(void)
3849 while (mainwin_list != NULL) {
3850 MainWindow *mainwin = (MainWindow*)mainwin_list->data;
3852 /* free toolbar stuff */
3853 toolbar_clear_list(TOOLBAR_MAIN);
3854 toolbar_destroy(mainwin->toolbar);
3856 summaryview_destroy(mainwin->summaryview);
3857 mainwin->folderview->mainwin = NULL;
3858 mainwin->summaryview->mainwin = NULL;
3859 mainwin->messageview->mainwin = NULL;
3861 g_free(mainwin->toolbar);
3862 g_free(mainwin);
3864 mainwin_list = g_list_remove(mainwin_list, mainwin);
3866 g_list_free(mainwin_list);
3867 mainwin_list = NULL;
3870 #ifndef GENERIC_UMPC
3871 static gboolean ac_label_button_pressed(GtkWidget *widget, GdkEventButton *event,
3872 gpointer data)
3874 MainWindow *mainwin = (MainWindow *)data;
3875 GtkWidget *menu = NULL;
3877 if (!event) return FALSE;
3879 gtk_button_set_relief(GTK_BUTTON(widget), GTK_RELIEF_NORMAL);
3881 menu = gtk_menu_item_get_submenu(GTK_MENU_ITEM(mainwin->ac_menu));
3883 gtk_menu_popup_at_widget(GTK_MENU(menu), widget, 3, 3, NULL);
3885 return TRUE;
3887 #endif
3888 static gint main_window_close_cb(GtkWidget *widget, GdkEventAny *event,
3889 gpointer data)
3891 MainWindow *mainwin = (MainWindow *)data;
3892 gboolean close_allowed = TRUE;
3894 hooks_invoke(MAIN_WINDOW_CLOSE, &close_allowed);
3896 if (close_allowed && mainwin->lock_count == 0)
3897 app_exit_cb(NULL, data);
3899 return TRUE;
3902 static void main_window_size_allocate_cb(GtkWidget *widget,
3903 GtkAllocation *allocation,
3904 gpointer data)
3906 MainWindow *mainwin = (MainWindow *)data;
3907 main_window_get_size(mainwin);
3910 static void folder_window_size_allocate_cb(GtkWidget *widget,
3911 GtkAllocation *allocation,
3912 gpointer data)
3914 MainWindow *mainwin = (MainWindow *)data;
3916 main_window_get_size(mainwin);
3919 static void message_window_size_allocate_cb(GtkWidget *widget,
3920 GtkAllocation *allocation,
3921 gpointer data)
3923 MainWindow *mainwin = (MainWindow *)data;
3925 main_window_get_size(mainwin);
3928 static void add_mailbox_cb(GtkAction *action, gpointer data)
3930 MainWindow *mainwin = (MainWindow *)data;
3931 main_window_add_mailbox(mainwin);
3934 static void update_folderview_cb(GtkAction *action, gpointer data)
3936 MainWindow *mainwin = (MainWindow *)data;
3937 summary_show(mainwin->summaryview, NULL, FALSE);
3938 folderview_check_new_all();
3941 static void foldersort_cb(GtkAction *action, gpointer data)
3943 foldersort_open();
3946 static void import_mbox_cb(GtkAction *action, gpointer data)
3948 MainWindow *mainwin = (MainWindow *)data;
3949 /* only notify if import has failed */
3950 if (import_mbox(mainwin->summaryview->folder_item) == -1) {
3951 alertpanel_error(_("Mbox import has failed."));
3955 static void export_mbox_cb(GtkAction *action, gpointer data)
3957 MainWindow *mainwin = (MainWindow *)data;
3958 /* only notify if export has failed */
3959 if (export_mbox(mainwin->summaryview->folder_item) == -1) {
3960 alertpanel_error(_("Export to mbox has failed."));
3964 static void export_list_mbox_cb(GtkAction *action, gpointer data)
3966 MainWindow *mainwin = (MainWindow *)data;
3967 /* only notify if export has failed */
3968 if (summaryview_export_mbox_list(mainwin->summaryview) == -1) {
3969 alertpanel_error(_("Export to mbox has failed."));
3973 static void empty_trash_cb(GtkAction *action, gpointer data)
3975 MainWindow *mainwin = (MainWindow *)data;
3976 main_window_empty_trash(mainwin, TRUE, FALSE);
3979 static void save_as_cb(GtkAction *action, gpointer data)
3981 MainWindow *mainwin = (MainWindow *)data;
3982 summary_save_as(mainwin->summaryview);
3985 static void print_cb(GtkAction *action, gpointer data)
3987 MainWindow *mainwin = (MainWindow *)data;
3988 summary_print(mainwin->summaryview);
3991 static void page_setup_cb(GtkAction *action, gpointer data)
3993 MainWindow *mainwin = (MainWindow *)data;
3994 GtkWindow *win;
3996 win = (mainwin ? GTK_WINDOW(mainwin->window) : NULL);
3998 printing_page_setup(win);
4001 static void app_exit_cb(GtkAction *action, gpointer data)
4003 MainWindow *mainwin = (MainWindow *)data;
4004 if (prefs_common.clean_on_exit) {
4005 if (!main_window_empty_trash(mainwin, prefs_common.ask_on_clean, TRUE))
4006 return;
4009 if (prefs_common.confirm_on_exit) {
4010 if (alertpanel(_("Exit"), _("Exit Claws Mail?"),
4011 NULL, _("_Cancel"), NULL, _("_Quit"),
4012 NULL, NULL, ALERTFOCUS_FIRST)
4013 != G_ALERTALTERNATE)
4014 return;
4015 manage_window_focus_in(mainwin->window, NULL, NULL);
4018 app_will_exit(NULL, mainwin);
4021 static void search_cb(GtkAction *action, gpointer data)
4023 MainWindow *mainwin = (MainWindow *)data;
4024 message_search(mainwin->messageview);
4027 static void search_folder_cb(GtkAction *action, gpointer data)
4029 MainWindow *mainwin = (MainWindow *)data;
4030 FolderItem *item = mainwin->summaryview->folder_item;
4031 cm_return_if_fail(item != NULL);
4032 summary_search(mainwin->summaryview);
4035 static void mainwindow_quicksearch(GtkAction *action, gpointer data)
4037 MainWindow *mainwin = (MainWindow *)data;
4038 summaryview_activate_quicksearch(mainwin->summaryview, TRUE);
4041 static void toggle_message_cb(GtkAction *action, gpointer data)
4043 MainWindow *mainwin = (MainWindow *)data;
4044 gboolean active;
4046 active = gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (action));
4048 if (active != messageview_is_visible(mainwin->messageview))
4049 summary_toggle_view(mainwin->summaryview);
4052 static void toggle_toolbar_cb(GtkAction *action, GtkRadioAction *current, gpointer data)
4054 gint value = gtk_radio_action_get_current_value (GTK_RADIO_ACTION (current));
4055 MainWindow *mainwin = (MainWindow *)data;
4056 toolbar_toggle(value, mainwin);
4059 static void main_window_reply_cb(GtkAction *gaction, gpointer data)
4061 MainWindow *mainwin = (MainWindow *)data;
4062 MessageView *msgview = (MessageView*)mainwin->messageview;
4063 GSList *msginfo_list = NULL;
4064 gint action = COMPOSE_REPLY;
4065 const gchar *a_name = gtk_action_get_name(gaction);
4067 DO_ACTION("Message/Reply", COMPOSE_REPLY);
4068 DO_ACTION("Message/ReplyTo/All", COMPOSE_REPLY_TO_ALL);
4069 DO_ACTION("Message/ReplyTo/Sender", COMPOSE_REPLY_TO_SENDER);
4070 DO_ACTION("Message/ReplyTo/List", COMPOSE_REPLY_TO_LIST);
4071 DO_ACTION("Message/Forward", COMPOSE_FORWARD_INLINE);
4072 DO_ACTION("Message/ForwardAtt", COMPOSE_FORWARD_AS_ATTACH);
4073 DO_ACTION("Message/Redirect", COMPOSE_REDIRECT);
4074 DO_ACTION("Message/FollowupReply", COMPOSE_FOLLOWUP_AND_REPLY_TO);
4076 cm_return_if_fail(msgview != NULL);
4078 msginfo_list = summary_get_selection(mainwin->summaryview);
4079 cm_return_if_fail(msginfo_list != NULL);
4081 if (!summary_has_opened_message(mainwin->summaryview)) {
4082 compose_reply_from_messageview(NULL, msginfo_list, action);
4083 } else if (summary_is_opened_message_selected(mainwin->summaryview)) {
4084 compose_reply_from_messageview(msgview, msginfo_list, action);
4085 } else {
4086 compose_reply_from_messageview(msgview, NULL, action);
4089 g_slist_free(msginfo_list);
4092 static void toggle_col_headers_cb(GtkAction *gaction, gpointer data)
4094 MainWindow *mainwin = (MainWindow *)data;
4095 FolderView *folderview = mainwin->folderview;
4096 SummaryView *summaryview = mainwin->summaryview;
4097 MimeView *mimeview = mainwin->messageview->mimeview;
4099 if (gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (gaction))) {
4100 gtk_cmclist_column_titles_show(GTK_CMCLIST(folderview->ctree));
4101 gtk_cmclist_column_titles_show(GTK_CMCLIST(summaryview->ctree));
4102 gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(mimeview->ctree), TRUE);
4103 prefs_common.show_col_headers = TRUE;
4104 } else {
4105 gtk_cmclist_column_titles_hide(GTK_CMCLIST(folderview->ctree));
4106 gtk_cmclist_column_titles_hide(GTK_CMCLIST(summaryview->ctree));
4107 gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(mimeview->ctree), FALSE);
4108 prefs_common.show_col_headers = FALSE;
4112 #ifndef GENERIC_UMPC
4113 static void toggle_statusbar_cb(GtkAction *gaction, gpointer data)
4115 MainWindow *mainwin = (MainWindow *)data;
4116 if (gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (gaction))) {
4117 gtk_widget_show(mainwin->hbox_stat);
4118 prefs_common.show_statusbar = TRUE;
4119 } else {
4120 gtk_widget_hide(mainwin->hbox_stat);
4121 prefs_common.show_statusbar = FALSE;
4125 static void set_layout_cb(GtkAction *action, GtkRadioAction *current, gpointer data)
4127 MainWindow *mainwin = (MainWindow *)data;
4128 gint value = gtk_radio_action_get_current_value (GTK_RADIO_ACTION (current));
4129 LayoutType layout_mode = value;
4130 LayoutType old_layout_mode = prefs_common.layout_mode;
4131 if (mainwin->menu_lock_count) {
4132 return;
4134 if (!gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (current))) {
4135 return;
4138 if (layout_mode == prefs_common.layout_mode) {
4139 return;
4142 if (!mainwin->messageview->visible && layout_mode != SMALL_LAYOUT)
4143 main_window_toggle_message_view(mainwin);
4144 else if (mainwin->messageview->visible && layout_mode == SMALL_LAYOUT)
4145 main_window_toggle_message_view(mainwin);
4147 main_window_separation_change(mainwin, layout_mode);
4148 mainwindow_reset_paned(GTK_PANED(mainwin->vpaned));
4149 if (old_layout_mode == SMALL_LAYOUT && layout_mode != SMALL_LAYOUT) {
4150 mainwindow_reset_paned(GTK_PANED(mainwin->hpaned));
4151 if (layout_mode == VERTICAL_LAYOUT)
4152 mainwindow_reset_paned(GTK_PANED(mainwin->vpaned));
4154 if (old_layout_mode != SMALL_LAYOUT && layout_mode == SMALL_LAYOUT) {
4155 mainwin_paned_show_first(GTK_PANED(mainwin->hpaned));
4156 mainwindow_exit_folder(mainwin);
4158 summary_relayout(mainwin->summaryview);
4159 summary_update_unread(mainwin->summaryview, NULL);
4161 #endif
4163 void main_window_toggle_work_offline (MainWindow *mainwin, gboolean offline,
4164 gboolean ask_sync)
4166 static gboolean switching = FALSE;
4168 if (switching)
4169 return;
4171 switching = TRUE;
4173 offline_ask_sync = ask_sync;
4174 if (offline)
4175 online_switch_clicked (GTK_BUTTON(mainwin->online_switch), mainwin);
4176 else
4177 online_switch_clicked (GTK_BUTTON(mainwin->offline_switch), mainwin);
4178 offline_ask_sync = TRUE;
4180 inc_reset_offline_override_timers();
4182 switching = FALSE;
4185 static void toggle_work_offline_cb (GtkAction *action, gpointer data)
4187 MainWindow *mainwin = (MainWindow *)data;
4188 main_window_toggle_work_offline(mainwin, gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (action)), TRUE);
4191 static gboolean any_folder_want_synchronise(void)
4193 GList *folderlist = folder_get_list();
4195 /* see if there are synchronised folders */
4196 for (; folderlist; folderlist = folderlist->next) {
4197 Folder *folder = (Folder *)folderlist->data;
4198 if (folder_want_synchronise(folder)) {
4199 return TRUE;
4203 return FALSE;
4206 static void mainwindow_check_synchronise(MainWindow *mainwin, gboolean ask)
4209 if (!any_folder_want_synchronise())
4210 return;
4212 if (offline_ask_sync && ask && alertpanel(_("Folder synchronisation"),
4213 _("Do you want to synchronise your folders now?"),
4214 NULL, _("_Cancel"), NULL, _("_Synchronise"), NULL, NULL,
4215 ALERTFOCUS_SECOND) != G_ALERTALTERNATE)
4216 return;
4218 if (offline_ask_sync)
4219 folder_synchronise(NULL);
4222 static void online_switch_clicked (GtkButton *btn, gpointer data)
4224 MainWindow *mainwin;
4225 gboolean have_connectivity;
4227 #ifdef HAVE_NETWORKMANAGER_SUPPORT
4228 have_connectivity = networkmanager_is_online(NULL);
4229 #else
4230 have_connectivity = TRUE;
4231 #endif
4233 mainwin = (MainWindow *) data;
4235 cm_return_if_fail(mainwin != NULL);
4237 if (btn == GTK_BUTTON(mainwin->online_switch)) {
4238 #ifndef GENERIC_UMPC
4239 gtk_widget_hide (mainwin->online_switch);
4240 gtk_widget_show (mainwin->offline_switch);
4241 #endif
4242 cm_toggle_menu_set_active_full(mainwin->ui_manager, "Menu/File/OfflineMode", TRUE);
4244 inc_autocheck_timer_remove();
4246 /* go offline */
4247 if (prefs_common.work_offline)
4248 return;
4250 if(have_connectivity)
4251 mainwindow_check_synchronise(mainwin, TRUE);
4252 prefs_common.work_offline = TRUE;
4253 imap_disconnect_all(have_connectivity);
4254 nntp_disconnect_all(have_connectivity);
4255 hooks_invoke(OFFLINE_SWITCH_HOOKLIST, NULL);
4256 } else {
4257 /*go online */
4258 if (!prefs_common.work_offline)
4259 return;
4260 #ifndef GENERIC_UMPC
4261 gtk_widget_hide (mainwin->offline_switch);
4262 gtk_widget_show (mainwin->online_switch);
4263 #endif
4264 cm_toggle_menu_set_active_full(mainwin->ui_manager, "Menu/File/OfflineMode", FALSE);
4265 prefs_common.work_offline = FALSE;
4266 inc_autocheck_timer_set();
4267 refresh_resolvers();
4268 hooks_invoke(OFFLINE_SWITCH_HOOKLIST, NULL);
4272 static void addressbook_open_cb(GtkAction *action, gpointer data)
4274 #ifndef USE_ALT_ADDRBOOK
4275 addressbook_open(NULL);
4276 #else
4277 GError* error = NULL;
4279 addressbook_dbus_open(FALSE, &error);
4280 if (error) {
4281 g_warning("failed to open address book: %s", error->message);
4282 g_error_free(error);
4284 #endif
4287 static void log_window_show_cb(GtkAction *action, gpointer data)
4289 MainWindow *mainwin = (MainWindow *)data;
4290 log_window_show(mainwin->logwin);
4293 static void filtering_debug_window_show_cb(GtkAction *action, gpointer data)
4295 MainWindow *mainwin = (MainWindow *)data;
4296 log_window_show(mainwin->filtering_debugwin);
4299 #ifdef G_OS_WIN32
4300 static void debug_log_show_cb(GtkAction *action, gpointer data)
4302 GError *error = NULL;
4303 gchar *logpath8 = win32_debug_log_path();
4304 gunichar2 *logpath16;
4306 debug_print("opening '%s'\n", logpath8);
4308 logpath16 = g_utf8_to_utf16(logpath8, -1, NULL, NULL, &error);
4310 if (error != NULL) {
4311 g_warning("couldn't convert debug log path '%s' to UTF-16: %s",
4312 logpath8, error->message);
4313 g_error_free(error);
4314 g_free(logpath16);
4315 return;
4318 HINSTANCE ret = ShellExecute(NULL, NULL, (LPCWSTR)logpath16,
4319 NULL, NULL, SW_SHOW);
4321 g_free(logpath8);
4322 g_free(logpath16);
4323 debug_print("ShellExecute result: %"G_GSIZE_FORMAT"\n", (gsize)ret);
4325 #endif
4327 static void inc_cancel_cb(GtkAction *action, gpointer data)
4329 inc_cancel_all();
4330 imap_cancel_all();
4333 static void send_cancel_cb(GtkAction *action, gpointer data)
4335 send_cancel();
4338 static void move_to_cb(GtkAction *action, gpointer data)
4340 MainWindow *mainwin = (MainWindow *)data;
4341 summary_move_to(mainwin->summaryview);
4344 static void copy_to_cb(GtkAction *action, gpointer data)
4346 MainWindow *mainwin = (MainWindow *)data;
4347 summary_copy_to(mainwin->summaryview);
4350 static void delete_cb(GtkAction *action, gpointer data)
4352 MainWindow *mainwin = (MainWindow *)data;
4353 summary_delete(mainwin->summaryview);
4356 static void delete_trash_cb(GtkAction *action, gpointer data)
4358 MainWindow *mainwin = (MainWindow *)data;
4359 summary_delete_trash(mainwin->summaryview);
4362 static void cancel_cb(GtkAction *action, gpointer data)
4364 MainWindow *mainwin = (MainWindow *)data;
4365 summary_cancel(mainwin->summaryview);
4368 static void open_msg_cb(GtkAction *action, gpointer data)
4370 MainWindow *mainwin = (MainWindow *)data;
4371 summary_open_msg(mainwin->summaryview);
4374 static void view_source_cb(GtkAction *action, gpointer data)
4376 MainWindow *mainwin = (MainWindow *)data;
4377 summary_view_source(mainwin->summaryview);
4380 static void show_all_header_cb(GtkAction *action, gpointer data)
4382 MainWindow *mainwin = (MainWindow *)data;
4383 if (mainwin->menu_lock_count) return;
4384 prefs_common.show_all_headers =
4385 gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (action));
4386 summary_display_msg_selected(mainwin->summaryview,
4387 gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (action)));
4390 static void toggle_fullscreen_cb(GtkAction *action, gpointer data)
4392 MainWindow *mainwin = (MainWindow *)data;
4393 if (mainwin->menu_lock_count) return;
4394 if (!gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (action))) {
4395 gtk_window_unfullscreen(GTK_WINDOW(mainwin->window));
4396 prefs_common.mainwin_fullscreen = FALSE;
4398 else {
4399 prefs_common.mainwin_fullscreen = TRUE;
4400 gtk_window_fullscreen(GTK_WINDOW(mainwin->window));
4404 static void toggle_menubar_cb(GtkAction *action, gpointer data)
4406 MainWindow *mainwin = (MainWindow *)data;
4407 if (mainwin->menu_lock_count) return;
4408 if (!gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (action))) {
4409 gtk_widget_hide(GTK_WIDGET(mainwin->menubar));
4410 prefs_common.mainwin_menubar = FALSE;
4411 } else {
4412 gtk_widget_show(GTK_WIDGET(mainwin->menubar));
4413 prefs_common.mainwin_menubar = TRUE;
4417 static void hide_quotes_cb(GtkAction *action, gpointer data)
4419 MainWindow *mainwin = (MainWindow *)data;
4421 if (mainwin->menu_lock_count) return;
4423 if (gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (action))) {
4424 const gchar *a_name = gtk_action_get_name(GTK_ACTION(action));
4425 if (!strcmp(a_name, "View/Quotes/CollapseAll")) prefs_common.hide_quotes = 1;
4426 else if (!strcmp(a_name, "View/Quotes/Collapse2")) prefs_common.hide_quotes = 2;
4427 else if (!strcmp(a_name, "View/Quotes/Collapse3")) prefs_common.hide_quotes = 3;
4428 } else
4429 prefs_common.hide_quotes = 0;
4431 mainwin->menu_lock_count++;
4432 cm_toggle_menu_set_active_full(mainwin->ui_manager, "Menu/View/Quotes/CollapseAll", (prefs_common.hide_quotes == 1));
4433 cm_toggle_menu_set_active_full(mainwin->ui_manager, "Menu/View/Quotes/Collapse2", (prefs_common.hide_quotes == 2));
4434 cm_toggle_menu_set_active_full(mainwin->ui_manager, "Menu/View/Quotes/Collapse3", (prefs_common.hide_quotes == 3));
4435 mainwin->menu_lock_count--;
4437 summary_redisplay_msg(mainwin->summaryview);
4440 static void mark_cb(GtkAction *action, gpointer data)
4442 MainWindow *mainwin = (MainWindow *)data;
4443 summary_mark(mainwin->summaryview);
4446 static void unmark_cb(GtkAction *action, gpointer data)
4448 MainWindow *mainwin = (MainWindow *)data;
4449 summary_unmark(mainwin->summaryview);
4452 static void mark_as_read_cb(GtkAction *action, gpointer data)
4454 MainWindow *mainwin = (MainWindow *)data;
4455 summary_mark_as_read(mainwin->summaryview);
4458 static void mark_as_unread_cb(GtkAction *action, gpointer data)
4460 MainWindow *mainwin = (MainWindow *)data;
4461 summary_mark_as_unread(mainwin->summaryview);
4464 static void mark_all_read_cb(GtkAction *action, gpointer data)
4466 MainWindow *mainwin = (MainWindow *)data;
4467 summary_mark_all_read(mainwin->summaryview, TRUE);
4470 static void mark_all_unread_cb(GtkAction *action, gpointer data)
4472 MainWindow *mainwin = (MainWindow *)data;
4473 summary_mark_all_unread(mainwin->summaryview, TRUE);
4476 static void mark_as_spam_cb(GtkAction *action, gpointer data)
4478 MainWindow *mainwin = (MainWindow *)data;
4479 summary_mark_as_spam(mainwin->summaryview, TRUE, NULL);
4482 static void mark_as_ham_cb(GtkAction *action, gpointer data)
4484 MainWindow *mainwin = (MainWindow *)data;
4485 summary_mark_as_spam(mainwin->summaryview, FALSE, NULL);
4488 static void ignore_thread_cb(GtkAction *action, gpointer data)
4490 MainWindow *mainwin = (MainWindow *)data;
4491 summary_ignore_thread(mainwin->summaryview);
4494 static void unignore_thread_cb(GtkAction *action, gpointer data)
4496 MainWindow *mainwin = (MainWindow *)data;
4497 summary_unignore_thread(mainwin->summaryview);
4500 static void watch_thread_cb(GtkAction *action, gpointer data)
4502 MainWindow *mainwin = (MainWindow *)data;
4503 summary_watch_thread(mainwin->summaryview);
4506 static void unwatch_thread_cb(GtkAction *action, gpointer data)
4508 MainWindow *mainwin = (MainWindow *)data;
4509 summary_unwatch_thread(mainwin->summaryview);
4512 static void lock_msgs_cb(GtkAction *action, gpointer data)
4514 MainWindow *mainwin = (MainWindow *)data;
4515 summary_msgs_lock(mainwin->summaryview);
4518 static void unlock_msgs_cb(GtkAction *action, gpointer data)
4520 MainWindow *mainwin = (MainWindow *)data;
4521 summary_msgs_unlock(mainwin->summaryview);
4525 static void reedit_cb(GtkAction *action, gpointer data)
4527 MainWindow *mainwin = (MainWindow *)data;
4528 summary_reedit(mainwin->summaryview);
4531 static void open_urls_cb(GtkAction *action, gpointer data)
4533 MainWindow *mainwin = (MainWindow *)data;
4534 if (!mainwin->summaryview->displayed && mainwin->summaryview->selected) {
4535 summary_display_msg_selected(mainwin->summaryview,
4536 prefs_common.show_all_headers);
4538 messageview_list_urls(mainwin->messageview);
4541 static void add_address_cb(GtkAction *action, gpointer data)
4543 MainWindow *mainwin = (MainWindow *)data;
4544 summary_add_address(mainwin->summaryview);
4547 static void set_charset_cb(GtkAction *action, GtkRadioAction *current, gpointer data)
4549 MainWindow *mainwin = (MainWindow *)data;
4550 gint value = gtk_radio_action_get_current_value (GTK_RADIO_ACTION (current));
4551 const gchar *str;
4553 if (gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (current))) {
4554 str = conv_get_charset_str((CharSet)value);
4556 g_free(mainwin->messageview->forced_charset);
4557 mainwin->messageview->forced_charset = str ? g_strdup(str) : NULL;
4558 procmime_force_charset(str);
4560 summary_redisplay_msg(mainwin->summaryview);
4562 debug_print("forced charset: %s\n", str ? str : "Auto-Detect");
4566 static void set_decode_cb(GtkAction *action, GtkRadioAction *current, gpointer data)
4568 MainWindow *mainwin = (MainWindow *)data;
4569 gint value = gtk_radio_action_get_current_value (GTK_RADIO_ACTION (current));
4570 if (gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (current))) {
4571 mainwin->messageview->forced_encoding = (EncodingType)value;
4573 summary_redisplay_msg(mainwin->summaryview);
4575 debug_print("forced encoding: %d\n", value);
4579 static void hide_read_messages (GtkAction *action, gpointer data)
4581 MainWindow *mainwin = (MainWindow *)data;
4582 GtkWidget *menuitem = gtk_ui_manager_get_widget(mainwin->ui_manager, "/Menu/View/HideReadMessages");
4583 if (!mainwin->summaryview->folder_item
4584 || g_object_get_data(G_OBJECT(menuitem), "dont_toggle"))
4585 return;
4586 summary_toggle_show_read_messages(mainwin->summaryview);
4589 static void hide_del_messages (GtkAction *action, gpointer data)
4591 MainWindow *mainwin = (MainWindow *)data;
4592 GtkWidget *menuitem = gtk_ui_manager_get_widget(mainwin->ui_manager, "/Menu/View/HideDelMessages");
4593 if (!mainwin->summaryview->folder_item
4594 || g_object_get_data(G_OBJECT(menuitem), "dont_toggle"))
4595 return;
4596 summary_toggle_show_del_messages(mainwin->summaryview);
4599 static void hide_read_threads (GtkAction *action, gpointer data)
4601 MainWindow *mainwin = (MainWindow *)data;
4602 GtkWidget *menuitem = gtk_ui_manager_get_widget(mainwin->ui_manager, "/Menu/View/HideReadThreads");
4603 if (!mainwin->summaryview->folder_item
4604 || g_object_get_data(G_OBJECT(menuitem), "dont_toggle"))
4605 return;
4606 summary_toggle_show_read_threads(mainwin->summaryview);
4609 static void thread_cb(GtkAction *action, gpointer data)
4611 MainWindow *mainwin = (MainWindow *)data;
4612 gboolean threaded = FALSE;
4613 guint selected_msgnum = 0;
4615 if (mainwin->menu_lock_count) return;
4616 if (!mainwin->summaryview->folder_item) return;
4618 main_window_cursor_wait(mainwin);
4620 selected_msgnum = summary_get_msgnum(mainwin->summaryview, mainwin->summaryview->selected);
4622 threaded = gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (action));
4624 mainwin->summaryview->folder_item->threaded = threaded;
4626 mainwin->summaryview->threaded = threaded;
4628 summary_show(mainwin->summaryview,
4629 mainwin->summaryview->folder_item, FALSE);
4630 summary_select_by_msgnum(mainwin->summaryview, selected_msgnum, FALSE);
4632 main_window_cursor_normal(mainwin);
4635 static void expand_threads_cb(GtkAction *action, gpointer data)
4637 MainWindow *mainwin = (MainWindow *)data;
4638 summary_expand_threads(mainwin->summaryview);
4641 static void collapse_threads_cb(GtkAction *action, gpointer data)
4643 MainWindow *mainwin = (MainWindow *)data;
4644 summary_collapse_threads(mainwin->summaryview);
4647 static void set_summary_display_item_cb(GtkAction *action, gpointer data)
4649 prefs_summary_column_open();
4652 static void set_folder_display_item_cb(GtkAction *action, gpointer data)
4654 prefs_folder_column_open();
4657 static void sort_summary_cb(GtkAction *action, GtkRadioAction *current, gpointer data)
4659 MainWindow *mainwin = (MainWindow *)data;
4660 gint value = gtk_radio_action_get_current_value (GTK_RADIO_ACTION (current));
4662 if (mainwin->menu_lock_count) return;
4664 if (gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (current))) {
4665 summary_sort(mainwin->summaryview, (FolderSortKey)value,
4666 mainwin->summaryview->sort_type);
4670 static void sort_summary_type_cb(GtkAction *gaction, GtkRadioAction *current, gpointer data)
4672 MainWindow *mainwin = (MainWindow *)data;
4673 gint value = gtk_radio_action_get_current_value (GTK_RADIO_ACTION (current));
4675 if (mainwin->menu_lock_count) return;
4677 if (gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (current)))
4678 summary_sort(mainwin->summaryview,
4679 mainwin->summaryview->sort_key, (FolderSortType)value);
4682 static void attract_by_subject_cb(GtkAction *action, gpointer data)
4684 MainWindow *mainwin = (MainWindow *)data;
4685 summary_attract_by_subject(mainwin->summaryview);
4688 void mainwindow_delete_duplicated(MainWindow *mainwin)
4690 FolderItem *item;
4692 item = folderview_get_selected_item(mainwin->folderview);
4693 if (item) {
4694 gint result;
4696 main_window_cursor_wait(mainwin);
4697 STATUSBAR_PUSH(mainwin, _("Deleting duplicated messages..."));
4698 result = folderutils_delete_duplicates(item, prefs_common.immediate_exec ?
4699 DELETE_DUPLICATES_REMOVE : DELETE_DUPLICATES_SETFLAG);
4700 STATUSBAR_POP(mainwin);
4701 main_window_cursor_normal(mainwin);
4703 switch (result) {
4704 case -1:
4705 break;
4706 case 0:
4707 alertpanel_notice(_("No duplicate message found in selected folder.\n"));
4708 break;
4709 default: {
4710 gchar *msg;
4712 if (prefs_common.immediate_exec) {
4713 msg = ngettext("Deleted %d duplicate message in selected folder.\n",
4714 "Deleted %d duplicate messages in selected folder.\n",
4715 result);
4716 } else {
4717 msg = ngettext("Marked %d duplicate message for deletion in selected folder.\n",
4718 "Marked %d duplicate messages for deletion in selected folder.\n",
4719 result);
4721 alertpanel_notice(msg, result);
4727 static void delete_duplicated_cb(GtkAction *action, gpointer data)
4729 mainwindow_delete_duplicated((MainWindow *)data);
4732 struct DelDupsData
4734 guint dups;
4735 guint folders;
4738 static void deldup_all(FolderItem *item, gpointer _data)
4740 struct DelDupsData *data = _data;
4741 gint result;
4743 result = folderutils_delete_duplicates(item, DELETE_DUPLICATES_REMOVE);
4744 if (result >= 0) {
4745 data->dups += result;
4746 data->folders += 1;
4750 void mainwindow_delete_duplicated_all(MainWindow *mainwin)
4752 struct DelDupsData data = {0, 0};
4754 main_window_cursor_wait(mainwin);
4755 STATUSBAR_PUSH(mainwin, _("Deleting duplicated messages in all folders..."));
4756 folder_func_to_all_folders(deldup_all, &data);
4757 STATUSBAR_POP(mainwin);
4758 main_window_cursor_normal(mainwin);
4760 if (data.dups > 0) {
4761 alertpanel_notice(ngettext("Deleted %d duplicate message in %d folders.\n",
4762 "Deleted %d duplicate messages in %d folders.\n",
4763 data.dups),
4764 data.dups, data.folders);
4765 } else {
4766 alertpanel_notice(_("No duplicate message found in %d folders.\n"), data.folders);
4770 static void delete_duplicated_all_cb(GtkAction *action, gpointer mw)
4772 MainWindow *mainwin = (MainWindow *)mw;
4774 mainwindow_delete_duplicated_all(mainwin);
4777 static void filter_cb(GtkAction *action, gpointer data)
4779 MainWindow *mainwin = (MainWindow *)data;
4780 summary_filter(mainwin->summaryview, FALSE);
4783 static void filter_list_cb(GtkAction *action, gpointer data)
4785 MainWindow *mainwin = (MainWindow *)data;
4786 summary_filter(mainwin->summaryview, TRUE);
4789 static void process_cb(GtkAction *action, gpointer data)
4791 MainWindow *mainwin = (MainWindow *)data;
4792 FolderItem *item = mainwin->summaryview->folder_item;
4793 cm_return_if_fail(item != NULL);
4795 item->processing_pending = TRUE;
4796 folder_item_apply_processing(item);
4797 item->processing_pending = FALSE;
4800 static void execute_summary_cb(GtkAction *action, gpointer data)
4802 MainWindow *mainwin = (MainWindow *)data;
4803 summary_execute(mainwin->summaryview);
4806 static void expunge_summary_cb(GtkAction *action, gpointer data)
4808 MainWindow *mainwin = (MainWindow *)data;
4809 summary_expunge(mainwin->summaryview);
4812 static void update_summary_cb(GtkAction *action, gpointer data)
4814 MainWindow *mainwin = (MainWindow *)data;
4815 FolderItem *fitem;
4816 FolderView *folderview = mainwin->folderview;
4818 if (!mainwin->summaryview->folder_item) return;
4819 if ((fitem = folderview_get_opened_item(folderview)) == NULL) return;
4821 folder_update_op_count();
4822 folder_item_scan(fitem);
4823 summary_show(mainwin->summaryview, fitem, FALSE);
4826 static void prev_cb(GtkAction *action, gpointer data)
4828 MainWindow *mainwin = (MainWindow *)data;
4829 summary_select_prev(mainwin->summaryview);
4832 static void next_cb(GtkAction *action, gpointer data)
4834 MainWindow *mainwin = (MainWindow *)data;
4835 summary_select_next(mainwin->summaryview);
4838 static void prev_unread_cb(GtkAction *action, gpointer data)
4840 MainWindow *mainwin = (MainWindow *)data;
4841 summary_select_prev_unread(mainwin->summaryview);
4844 static void next_unread_cb(GtkAction *action, gpointer data)
4846 MainWindow *mainwin = (MainWindow *)data;
4847 summary_select_next_unread(mainwin->summaryview);
4850 static void prev_new_cb(GtkAction *action, gpointer data)
4852 MainWindow *mainwin = (MainWindow *)data;
4853 summary_select_prev_new(mainwin->summaryview);
4856 static void next_new_cb(GtkAction *action, gpointer data)
4858 MainWindow *mainwin = (MainWindow *)data;
4859 summary_select_next_new(mainwin->summaryview);
4862 static void prev_marked_cb(GtkAction *action, gpointer data)
4864 MainWindow *mainwin = (MainWindow *)data;
4865 summary_select_prev_marked(mainwin->summaryview);
4868 static void next_marked_cb(GtkAction *action, gpointer data)
4870 MainWindow *mainwin = (MainWindow *)data;
4871 summary_select_next_marked(mainwin->summaryview);
4874 static void prev_labeled_cb(GtkAction *action, gpointer data)
4876 MainWindow *mainwin = (MainWindow *)data;
4877 summary_select_prev_labeled(mainwin->summaryview);
4880 static void next_labeled_cb(GtkAction *action, gpointer data)
4882 MainWindow *mainwin = (MainWindow *)data;
4883 summary_select_next_labeled(mainwin->summaryview);
4886 static void prev_history_cb(GtkAction *action, gpointer data)
4888 MainWindow *mainwin = (MainWindow *)data;
4889 MsgInfo *info = messageview_nav_get_prev(mainwin->messageview);
4890 if (info) {
4891 if (info->folder != mainwin->summaryview->folder_item)
4892 folderview_select(mainwin->folderview, info->folder);
4893 summary_select_by_msgnum(mainwin->summaryview, info->msgnum,
4894 OPEN_SELECTED_ON_PREVNEXT);
4895 procmsg_msginfo_free(&info);
4896 main_window_set_menu_sensitive(mainwindow_get_mainwindow());
4897 toolbar_main_set_sensitive(mainwindow_get_mainwindow());
4901 static void next_history_cb(GtkAction *action, gpointer data)
4903 MainWindow *mainwin = (MainWindow *)data;
4904 MsgInfo *info = messageview_nav_get_next(mainwin->messageview);
4905 if (info) {
4906 if (info->folder != mainwin->summaryview->folder_item)
4907 folderview_select(mainwin->folderview, info->folder);
4908 summary_select_by_msgnum(mainwin->summaryview, info->msgnum,
4909 OPEN_SELECTED_ON_PREVNEXT);
4910 procmsg_msginfo_free(&info);
4911 main_window_set_menu_sensitive(mainwindow_get_mainwindow());
4912 toolbar_main_set_sensitive(mainwindow_get_mainwindow());
4916 static void parent_cb(GtkAction *action, gpointer data)
4918 MainWindow *mainwin = (MainWindow *)data;
4919 summary_select_parent(mainwin->summaryview);
4922 static void goto_folder_cb(GtkAction *action, gpointer data)
4924 MainWindow *mainwin = (MainWindow *)data;
4925 FolderItem *to_folder;
4927 to_folder = foldersel_folder_sel(NULL, FOLDER_SEL_ALL, NULL, FALSE,
4928 _("Select folder to go to"));
4930 if (to_folder)
4931 folderview_select(mainwin->folderview, to_folder);
4934 static void goto_unread_folder_cb(GtkAction *action, gpointer data)
4936 MainWindow *mainwin = (MainWindow *)data;
4937 folderview_select_next_with_flag(mainwin->folderview, MSG_UNREAD);
4940 static void scroll_prev_line_cb(GtkAction *action, gpointer data)
4942 MainWindow *mainwin = (MainWindow *)data;
4943 mimeview_scroll_one_line(mainwin->messageview->mimeview,TRUE);
4946 static void scroll_next_line_cb(GtkAction *action, gpointer data)
4948 MainWindow *mainwin = (MainWindow *)data;
4949 mimeview_scroll_one_line(mainwin->messageview->mimeview,FALSE);
4952 static void scroll_prev_page_cb(GtkAction *action, gpointer data)
4954 MainWindow *mainwin = (MainWindow *)data;
4955 mimeview_scroll_page(mainwin->messageview->mimeview,TRUE);
4958 static void scroll_next_page_cb(GtkAction *action, gpointer data)
4960 MainWindow *mainwin = (MainWindow *)data;
4961 mimeview_scroll_page(mainwin->messageview->mimeview,FALSE);
4964 static void copy_cb(GtkAction *action, gpointer data)
4966 MainWindow *mainwin = (MainWindow *)data;
4967 messageview_copy_clipboard(mainwin->messageview);
4970 static void allsel_cb(GtkAction *action, gpointer data)
4972 MainWindow *mainwin = (MainWindow *)data;
4973 MessageView *msgview = mainwin->messageview;
4975 if (messageview_is_visible(msgview) &&
4976 (gtk_widget_has_focus(msgview->mimeview->textview->text)))
4977 messageview_select_all(mainwin->messageview);
4978 else
4979 summary_select_all(mainwin->summaryview);
4982 static void select_thread_cb(GtkAction *action, gpointer data)
4984 MainWindow *mainwin = (MainWindow *)data;
4985 summary_select_thread(mainwin->summaryview, FALSE, FALSE);
4988 static void trash_thread_cb(GtkAction *action, gpointer data)
4990 MainWindow *mainwin = (MainWindow *)data;
4991 summary_select_thread(mainwin->summaryview, FALSE, TRUE);
4994 static void delete_thread_cb(GtkAction *action, gpointer data)
4996 MainWindow *mainwin = (MainWindow *)data;
4997 summary_select_thread(mainwin->summaryview, TRUE, FALSE);
5000 static void create_filter_cb(GtkAction *gaction, gpointer data)
5002 MainWindow *mainwin = (MainWindow *)data;
5003 const gchar *a_name = gtk_action_get_name(gaction);
5004 gint action = -1;
5006 DO_ACTION("Tools/CreateFilterRule/Automatically", FILTER_BY_AUTO);
5007 DO_ACTION("Tools/CreateFilterRule/ByFrom", FILTER_BY_FROM);
5008 DO_ACTION("Tools/CreateFilterRule/ByTo", FILTER_BY_TO);
5009 DO_ACTION("Tools/CreateFilterRule/BySubject", FILTER_BY_SUBJECT);
5010 DO_ACTION("Tools/CreateFilterRule/BySender", FILTER_BY_SENDER);
5011 summary_filter_open(mainwin->summaryview, (PrefsFilterType)action, 0);
5014 static void create_processing_cb(GtkAction *gaction, gpointer data)
5016 MainWindow *mainwin = (MainWindow *)data;
5017 const gchar *a_name = gtk_action_get_name(gaction);
5018 gint action = -1;
5020 DO_ACTION("Tools/CreateProcessingRule/Automatically", FILTER_BY_AUTO);
5021 DO_ACTION("Tools/CreateProcessingRule/ByFrom", FILTER_BY_FROM);
5022 DO_ACTION("Tools/CreateProcessingRule/ByTo", FILTER_BY_TO);
5023 DO_ACTION("Tools/CreateProcessingRule/BySubject", FILTER_BY_SUBJECT);
5024 DO_ACTION("Tools/CreateProcessingRule/BySender", FILTER_BY_SENDER);
5025 summary_filter_open(mainwin->summaryview, (PrefsFilterType)action, 1);
5028 static void prefs_pre_processing_open_cb(GtkAction *action, gpointer data)
5030 prefs_filtering_open(&pre_global_processing,
5031 _("Processing rules to apply before folder rules"),
5032 MANUAL_ANCHOR_PROCESSING,
5033 NULL, NULL, FALSE);
5036 static void prefs_post_processing_open_cb(GtkAction *action, gpointer data)
5038 prefs_filtering_open(&post_global_processing,
5039 _("Processing rules to apply after folder rules"),
5040 MANUAL_ANCHOR_PROCESSING,
5041 NULL, NULL, FALSE);
5044 static void prefs_filtering_open_cb(GtkAction *action, gpointer data)
5046 prefs_filtering_open(&filtering_rules,
5047 _("Filtering configuration"),
5048 MANUAL_ANCHOR_FILTERING,
5049 NULL, NULL, TRUE);
5052 static void prefs_template_open_cb(GtkAction *action, gpointer data)
5054 prefs_template_open();
5057 static void prefs_actions_open_cb(GtkAction *action, gpointer data)
5059 MainWindow *mainwin = (MainWindow *)data;
5060 prefs_actions_open(mainwin);
5063 static void prefs_tags_open_cb(GtkAction *action, gpointer data)
5065 tags_window_open(NULL);
5067 #ifdef USE_GNUTLS
5068 static void ssl_manager_open_cb(GtkAction *action, gpointer data)
5070 MainWindow *mainwin = (MainWindow *)data;
5071 ssl_manager_open(mainwin);
5073 #endif
5074 static void prefs_account_open_cb(GtkAction *action, gpointer data)
5076 MainWindow *mainwin = (MainWindow *)data;
5077 if (!cur_account) {
5078 new_account_cb(NULL, mainwin);
5079 } else {
5080 account_open(cur_account, FALSE);
5084 static void new_account_cb(GtkAction *action, gpointer data)
5086 account_edit_open(NULL, NULL);
5087 if (!compose_get_compose_list()) account_add();
5090 static void account_selector_menu_cb(GtkMenuItem *menuitem, gpointer data)
5092 FolderItem *item = NULL;
5093 cur_account = (PrefsAccount *)data;
5095 if (!mainwindow_get_mainwindow())
5096 return;
5097 main_window_show_cur_account(mainwindow_get_mainwindow());
5098 toolbar_update(TOOLBAR_MAIN, mainwindow_get_mainwindow());
5099 main_window_set_menu_sensitive(mainwindow_get_mainwindow());
5100 toolbar_main_set_sensitive(mainwindow_get_mainwindow());
5101 item = folderview_get_selected_item(
5102 mainwindow_get_mainwindow()->folderview);
5103 if (item) {
5104 toolbar_set_compose_button
5105 (mainwindow_get_mainwindow()->toolbar,
5106 FOLDER_TYPE(item->folder) == F_NEWS ?
5107 COMPOSEBUTTON_NEWS : COMPOSEBUTTON_MAIL);
5111 static void account_receive_menu_cb(GtkMenuItem *menuitem, gpointer data)
5113 MainWindow *mainwin = (MainWindow *)mainwin_list->data;
5114 PrefsAccount *account = (PrefsAccount *)data;
5116 inc_account_mail(mainwin, account);
5118 #ifndef GENERIC_UMPC
5119 static void account_compose_menu_cb(GtkMenuItem *menuitem, gpointer data)
5121 PrefsAccount *account = (PrefsAccount *)data;
5123 compose_new_with_folderitem(account, NULL, NULL);
5125 #endif
5126 static void prefs_open_cb(GtkAction *action, gpointer data)
5128 prefs_gtk_open();
5131 static void plugins_open_cb(GtkAction *action, gpointer data)
5133 pluginwindow_create();
5136 static void manual_open_cb(GtkAction *action, gpointer data)
5138 manual_open(MANUAL_MANUAL_CLAWS, NULL);
5141 static void manual_faq_open_cb(GtkAction *action, gpointer data)
5143 manual_open(MANUAL_FAQ_CLAWS, NULL);
5146 static void legend_open_cb(GtkAction *action, gpointer data)
5148 legend_show();
5151 #ifdef G_OS_WIN32
5152 static void set_default_client_cb(GtkAction *action, gpointer data)
5154 char exename[MAX_PATH];
5155 gchar *binary_icon = NULL;
5156 gchar *binary_compose = NULL;
5157 gchar *binary_run = NULL;
5158 gboolean r;
5159 if ( !GetModuleFileNameA (0, exename, sizeof (exename)) ) {
5160 alertpanel_error(_("Can not register as default client: impossible to get executable path."));
5161 return;
5163 binary_icon = g_strconcat(exename, ",0", NULL);
5164 binary_compose = g_strconcat(exename, " --compose %1", NULL);
5165 binary_run = g_strconcat(exename, NULL);
5167 /* Try to set the Mail Start menu item to Claws. It may fail if we're not root; we don't care */
5168 r = write_w32_registry_string(HKEY_LOCAL_MACHINE,
5169 "Software\\Clients\\Mail",
5171 "Claws Mail");
5173 r = write_w32_registry_string(HKEY_CURRENT_USER,
5174 "Software\\Clients\\Mail\\Claws Mail",
5176 "Claws Mail");
5177 if (r)
5178 r = write_w32_registry_string(HKEY_CURRENT_USER,
5179 "Software\\Clients\\Mail\\Claws Mail",
5180 "DLLPath",
5181 "");
5182 if (r)
5183 r = write_w32_registry_string(HKEY_CURRENT_USER,
5184 "Software\\Clients\\Mail\\Claws Mail\\Protocols\\mailto",
5186 "URL:MailTo-Protocol");
5187 if (r)
5188 r = write_w32_registry_string(HKEY_CURRENT_USER,
5189 "Software\\Clients\\Mail\\Claws Mail\\Protocols\\mailto",
5190 "URL Protocol",
5191 "");
5192 if (r)
5193 r = write_w32_registry_dword (HKEY_CURRENT_USER,
5194 "Software\\Clients\\Mail\\Claws Mail\\Protocols\\mailto",
5195 "EditFlags",
5197 if (r)
5198 r = write_w32_registry_string(HKEY_CURRENT_USER,
5199 "Software\\Clients\\Mail\\Claws Mail\\Protocols\\mailto",
5200 "FriendlyTypeName",
5201 "Claws-Mail URL");
5202 if (r)
5203 r = write_w32_registry_string(HKEY_CURRENT_USER,
5204 "Software\\Clients\\Mail\\Claws Mail\\Protocols\\mailto\\DefaultIcon",
5206 binary_icon);
5207 if (r)
5208 r = write_w32_registry_string(HKEY_CURRENT_USER,
5209 "Software\\Clients\\Mail\\Claws Mail\\Protocols\\mailto\\shell\\open\\command",
5211 binary_compose);
5212 if (r)
5213 r = write_w32_registry_string(HKEY_CURRENT_USER,
5214 "Software\\Clients\\Mail\\Claws Mail\\shell\\open\\command",
5216 binary_run);
5218 if (r)
5219 r = write_w32_registry_string(HKEY_CURRENT_USER,
5220 "Software\\Classes\\mailto",
5222 "URL:MailTo-Protocol");
5223 if (r)
5224 r = write_w32_registry_string(HKEY_CURRENT_USER,
5225 "Software\\Classes\\mailto",
5226 "URL Protocol",
5227 "");
5228 if (r)
5229 r = write_w32_registry_dword (HKEY_CURRENT_USER,
5230 "Software\\Classes\\mailto",
5231 "EditFlags",
5233 if (r)
5234 r = write_w32_registry_string(HKEY_CURRENT_USER,
5235 "Software\\Classes\\mailto",
5236 "FriendlyTypeName",
5237 "Claws-Mail URL");
5238 if (r)
5239 r = write_w32_registry_string(HKEY_CURRENT_USER,
5240 "Software\\Classes\\mailto\\DefaultIcon",
5242 binary_icon);
5243 if (r)
5244 r = write_w32_registry_string(HKEY_CURRENT_USER,
5245 "Software\\Classes\\mailto\\shell\\open\\command",
5247 binary_compose);
5249 if (r) {
5250 SendMessage(HWND_BROADCAST, WM_SETTINGCHANGE, 0, (LPARAM)"Software\\Clients\\Mail");
5251 alertpanel_notice(_("Claws Mail has been registered as default client."));
5252 } else {
5253 alertpanel_error(_("Can not register as default client: impossible to write to the registry."));
5255 g_free(binary_icon);
5256 g_free(binary_compose);
5257 g_free(binary_run);
5259 #endif
5261 static void scan_tree_func(Folder *folder, FolderItem *item, gpointer data)
5263 MainWindow *mainwin = (MainWindow *)data;
5264 gchar *str;
5266 if (item->path)
5267 str = g_strdup_printf(_("Scanning folder %s%c%s..."),
5268 LOCAL_FOLDER(folder)->rootpath,
5269 G_DIR_SEPARATOR,
5270 item->path);
5271 else
5272 str = g_strdup_printf(_("Scanning folder %s..."),
5273 LOCAL_FOLDER(folder)->rootpath);
5275 STATUSBAR_PUSH(mainwin, str);
5276 STATUSBAR_POP(mainwin);
5277 g_free(str);
5280 static gboolean mainwindow_focus_in_event(GtkWidget *widget, GdkEventFocus *focus,
5281 gpointer data)
5283 SummaryView *summary;
5285 cm_return_val_if_fail(data, FALSE);
5286 if (!g_list_find(mainwin_list, data))
5287 return TRUE;
5288 summary = ((MainWindow *)data)->summaryview;
5289 cm_return_val_if_fail(summary, FALSE);
5291 if (GTK_CMCLIST(summary->ctree)->selection &&
5292 g_list_length(GTK_CMCLIST(summary->ctree)->selection) > 1)
5293 return FALSE;
5295 return FALSE;
5298 static gboolean mainwindow_visibility_event_cb(GtkWidget *widget, GdkEventVisibility *event,
5299 gpointer data)
5301 is_obscured = (event->state == GDK_VISIBILITY_FULLY_OBSCURED);
5302 return FALSE;
5305 static gboolean mainwindow_state_event_cb(GtkWidget *widget, GdkEventWindowState *state,
5306 gpointer data)
5308 if (!claws_is_starting()
5309 && state->changed_mask&GDK_WINDOW_STATE_ICONIFIED
5310 && state->new_window_state&GDK_WINDOW_STATE_ICONIFIED) {
5312 if (iconified_count > 0)
5313 hooks_invoke(MAIN_WINDOW_GOT_ICONIFIED, NULL);
5314 iconified_count++;
5315 } else if (!claws_is_starting()) {
5316 prefs_common.mainwin_maximised =
5317 ((state->new_window_state&GDK_WINDOW_STATE_MAXIMIZED) != 0);
5319 if (state->new_window_state == 0)
5320 gtk_window_set_skip_taskbar_hint(GTK_WINDOW(widget), FALSE);
5321 return FALSE;
5324 gboolean mainwindow_is_obscured(void)
5326 return is_obscured;
5330 * Harvest addresses for selected folder.
5332 static void addr_harvest_cb( GtkAction *action, gpointer data)
5334 MainWindow *mainwin = (MainWindow *)data;
5336 addressbook_harvest( mainwin->summaryview->folder_item, FALSE, NULL );
5340 * Harvest addresses for selected messages in summary view.
5342 static void addr_harvest_msg_cb( GtkAction *action, gpointer data)
5344 MainWindow *mainwin = (MainWindow *)data;
5345 summary_harvest_address( mainwin->summaryview );
5349 *\brief get a MainWindow
5351 *\return MainWindow * The first mainwindow in the mainwin_list
5353 MainWindow *mainwindow_get_mainwindow(void)
5355 if (mainwin_list && mainwin_list->data)
5356 return (MainWindow *)(mainwin_list->data);
5357 else
5358 return NULL;
5361 static gboolean mainwindow_progressindicator_hook(gpointer source, gpointer userdata)
5363 ProgressData *data = (ProgressData *) source;
5364 MainWindow *mainwin = (MainWindow *) userdata;
5366 switch (data->cmd) {
5367 case PROGRESS_COMMAND_START:
5368 case PROGRESS_COMMAND_STOP:
5369 gtk_progress_bar_set_fraction
5370 (GTK_PROGRESS_BAR(mainwin->progressbar), 0.0);
5371 break;
5372 case PROGRESS_COMMAND_SET_PERCENTAGE:
5373 gtk_progress_bar_set_fraction
5374 (GTK_PROGRESS_BAR(mainwin->progressbar), data->value);
5375 break;
5377 while (gtk_events_pending()) gtk_main_iteration ();
5379 return FALSE;
5382 static void sync_cb(GtkAction *action, gpointer data)
5384 MainWindow *mainwin = (MainWindow *)data;
5385 mainwindow_check_synchronise(mainwin, FALSE);
5388 static void forget_session_passwords_cb(GtkAction *action, gpointer data)
5390 MainWindow *mainwin = (MainWindow *)data;
5391 GList *list = NULL;
5392 gint fgtn = 0;
5393 gint accs = 0;
5395 main_window_lock(mainwin);
5396 for (list = account_get_list(); list != NULL; list = list->next) {
5397 PrefsAccount *account = list->data;
5398 if (account->session_passwd) {
5399 g_free(account->session_passwd);
5400 account->session_passwd = NULL;
5401 ++fgtn;
5403 if (account->session_smtp_passwd) {
5404 g_free(account->session_smtp_passwd);
5405 account->session_smtp_passwd = NULL;
5406 ++fgtn;
5408 ++accs;
5410 main_window_unlock(mainwin);
5411 alertpanel_notice(ngettext("Forgotten %d password in %d accounts.\n",
5412 "Forgotten %d passwords in %d accounts.\n",
5413 fgtn), fgtn, accs);
5416 #ifndef PASSWORD_CRYPTO_OLD
5417 static void forget_primary_passphrase_cb(GtkAction *action, gpointer data)
5419 MainWindow *mainwin = (MainWindow *)data;
5421 main_window_lock(mainwin);
5422 primary_passphrase_forget();
5423 main_window_unlock(mainwin);
5425 #endif
5427 void mainwindow_learn (MainWindow *mainwin, gboolean is_spam)
5429 summary_mark_as_spam(mainwin->summaryview, is_spam, NULL);
5432 void mainwindow_jump_to(const gchar *target, gboolean popup)
5434 gchar *tmp = NULL;
5435 FolderItem *item = NULL;
5436 gchar *msg = NULL;
5437 MainWindow *mainwin = mainwindow_get_mainwindow();
5438 gchar *from_uri = NULL;
5439 if (!target)
5440 return;
5442 if (!mainwin) {
5443 g_print("not initialized\n");
5444 return;
5447 if ((from_uri = g_filename_from_uri(target, NULL, NULL)) != NULL)
5448 tmp = from_uri;
5449 else
5450 tmp = g_strdup(target);
5452 strcrlftrunc(tmp);
5454 if ((item = folder_find_item_from_identifier(tmp))) {
5455 g_print("selecting folder '%s'\n", tmp);
5456 folderview_select(mainwin->folderview, item);
5457 if (popup)
5458 main_window_popup(mainwin);
5459 g_free(tmp);
5460 return;
5463 msg = strrchr(tmp, '/');
5464 if (msg) {
5465 *msg++ = '\0';
5466 if ((item = folder_find_item_from_identifier(tmp))) {
5467 g_print("selecting folder '%s'\n", tmp);
5468 folderview_select(mainwin->folderview, item);
5469 } else if ((item = folder_find_item_from_real_path(tmp))) {
5470 g_print("selecting folder '%s'\n", tmp);
5471 folderview_select(mainwin->folderview, item);
5472 } else {
5473 g_print("'%s' not found\n", tmp);
5475 if (item && msg && atoi(msg)) {
5476 g_print("selecting message %d\n", atoi(msg));
5477 summary_select_by_msgnum(mainwin->summaryview, atoi(msg), TRUE);
5478 if (popup)
5479 main_window_popup(mainwin);
5480 g_free(tmp);
5481 return;
5482 } else if (item && msg[0] == '<' && msg[strlen(msg)-1] == '>') {
5483 MsgInfo *msginfo = NULL;
5484 msg++;
5485 msg[strlen(msg)-1] = '\0';
5486 msginfo = folder_item_get_msginfo_by_msgid(item, msg);
5487 if (msginfo) {
5488 g_print("selecting message %s\n", msg);
5489 summary_select_by_msgnum(mainwin->summaryview, msginfo->msgnum, TRUE);
5490 if (popup)
5491 main_window_popup(mainwin);
5492 g_free(tmp);
5493 procmsg_msginfo_free(&msginfo);
5494 return;
5495 } else {
5496 g_print("'%s' not found\n", msg);
5498 } else {
5499 g_print("'%s' not found\n", msg);
5501 } else {
5502 g_print("'%s' not found\n", tmp);
5505 g_free(tmp);
5508 void mainwindow_exit_folder(MainWindow *mainwin) {
5509 if (prefs_common.layout_mode == SMALL_LAYOUT) {
5510 folderview_close_opened(mainwin->folderview, FALSE);
5511 mainwin_paned_show_first(GTK_PANED(mainwin->hpaned));
5512 folderview_grab_focus(mainwin->folderview);
5514 mainwin->in_folder = FALSE;
5515 main_window_set_menu_sensitive(mainwin);
5518 void mainwindow_enter_folder(MainWindow *mainwin) {
5519 if (prefs_common.layout_mode == SMALL_LAYOUT) {
5520 mainwin_paned_show_last(GTK_PANED(mainwin->hpaned));
5522 mainwin->in_folder = TRUE;
5523 main_window_set_menu_sensitive(mainwin);
5526 static void save_part_as_cb(GtkAction *action, gpointer data)
5528 MainWindow *mainwin = (MainWindow *)data;
5530 if (mainwin->messageview
5531 && mainwin->messageview->mimeview)
5532 mimeview_save_as(mainwin->messageview->mimeview);
5535 static void view_part_as_text_cb(GtkAction *action, gpointer data)
5537 MainWindow *mainwin = (MainWindow *)data;
5539 if (mainwin->messageview
5540 && mainwin->messageview->mimeview)
5541 mimeview_display_as_text(mainwin->messageview->mimeview);
5544 static void open_part_cb(GtkAction *action, gpointer data)
5546 MainWindow *mainwin = (MainWindow *)data;
5548 if (mainwin->messageview
5549 && mainwin->messageview->mimeview)
5550 mimeview_launch(mainwin->messageview->mimeview, NULL);
5552 #ifndef G_OS_WIN32
5553 static void open_part_with_cb(GtkAction *action, gpointer data)
5555 MainWindow *mainwin = (MainWindow *)data;
5557 if (mainwin->messageview
5558 && mainwin->messageview->mimeview)
5559 mimeview_open_with(mainwin->messageview->mimeview);
5561 #endif
5562 static void check_signature_cb(GtkAction *action, gpointer data)
5564 MainWindow *mainwin = (MainWindow *)data;
5566 if (mainwin->messageview
5567 && mainwin->messageview->mimeview)
5568 mimeview_check_signature(mainwin->messageview->mimeview);
5571 static void goto_next_part_cb(GtkAction *action, gpointer data)
5573 MainWindow *mainwin = (MainWindow *)data;
5575 if (mainwin->messageview
5576 && mainwin->messageview->mimeview)
5577 mimeview_select_next_part(mainwin->messageview->mimeview);
5580 static void goto_prev_part_cb(GtkAction *action, gpointer data)
5582 MainWindow *mainwin = (MainWindow *)data;
5584 if (mainwin->messageview
5585 && mainwin->messageview->mimeview)
5586 mimeview_select_prev_part(mainwin->messageview->mimeview);