keep newsgroup subscription window on top when 'subscribe to newsgroup...' fails...
[claws.git] / src / mainwindow.c
blobc1857f8c5668028f082956a7e0fc64eccff4514b
1 /*
2 * Claws Mail -- a GTK based, lightweight, and fast e-mail client
3 * Copyright (C) 1999-2024 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 /* make sure to keep the tables below in sync with the default_menurc[] in prefs_other.c */
512 static GtkActionEntry mainwin_entries[] =
514 {"Menu", NULL, "Menu", NULL, NULL, NULL },
515 /* menus */
516 {"File", NULL, N_("_File"), NULL, NULL, NULL },
517 {"Edit", NULL, N_("_Edit"), NULL, NULL, NULL },
518 {"View", NULL, N_("_View"), NULL, NULL, NULL },
519 {"Message", NULL, N_("_Message"), NULL, NULL, NULL },
520 {"Tools", NULL, N_("_Tools"), NULL, NULL, NULL },
521 {"Configuration", NULL, N_("_Configuration"), NULL, NULL, NULL },
522 {"Help", NULL, N_("_Help"), NULL, NULL, NULL },
524 /* File menu */
525 {"File/AddMailbox", NULL, N_("_Add mailbox"), NULL, NULL, NULL },
526 {"File/AddMailbox/MH", NULL, N_("MH..."), NULL, NULL, G_CALLBACK(add_mailbox_cb) },
527 {"File/---", NULL, "---", NULL, NULL, NULL },
529 {"File/SortMailboxes", NULL, N_("Change mailbox order..."), NULL, NULL, G_CALLBACK(foldersort_cb) },
531 /* {"File/---", NULL, "---", NULL, NULL, NULL }, */
532 {"File/ImportMbox", NULL, N_("_Import mbox file..."), NULL, NULL, G_CALLBACK(import_mbox_cb) },
533 {"File/ExportMbox", NULL, N_("_Export to mbox file..."), NULL, NULL, G_CALLBACK(export_mbox_cb) },
534 {"File/ExportSelMbox", NULL, N_("_Export selected to mbox file..."), NULL, NULL, G_CALLBACK(export_list_mbox_cb) },
535 /* {"File/---", NULL, "---", NULL, NULL, NULL }, */
536 {"File/EmptyTrashes", NULL, N_("Empty all _Trash folders"), "<shift>D", NULL, G_CALLBACK(empty_trash_cb) },
537 /* {"File/---", NULL, "---", NULL, NULL, NULL }, */
539 {"File/SaveAs", NULL, N_("_Save email as..."), "<control>S", NULL, G_CALLBACK(save_as_cb) },
540 {"File/SavePartAs", NULL, N_("_Save part as..."), "Y", NULL, G_CALLBACK(save_part_as_cb) },
541 /* {"File/---", NULL, "---", NULL, NULL, NULL }, */
543 {"File/PageSetup", NULL, N_("Page setup..."), NULL, NULL, G_CALLBACK(page_setup_cb) },
544 {"File/Print", NULL, N_("_Print..."), "<control>P", NULL, G_CALLBACK(print_cb) },
545 /* {"File/---", NULL, "---", NULL, NULL, NULL }, */
546 {"File/SynchroniseFolders", NULL, N_("Synchronise folders"), "<shift><control>S", NULL, G_CALLBACK(sync_cb) },
547 /* {"File/---", NULL, "---", NULL, NULL, NULL }, */
548 {"File/Exit", NULL, N_("E_xit"), "<control>Q", NULL, G_CALLBACK(app_exit_cb) },
550 /* Edit menu */
551 {"Edit/Copy", NULL, N_("_Copy"), "<control>C", NULL, G_CALLBACK(copy_cb) },
552 {"Edit/SelectAll", NULL, N_("Select _all"), "<control>A", NULL, G_CALLBACK(allsel_cb) },
553 {"Edit/SelectThread", NULL, N_("Select _thread"), NULL, NULL, G_CALLBACK(select_thread_cb) },
554 {"Edit/---", NULL, "---", NULL, NULL, NULL },
555 {"Edit/Find", NULL, N_("_Find in current message..."), "<control>F", NULL, G_CALLBACK(search_cb) },
556 {"Edit/SearchFolder", NULL, N_("_Search folder..."), "<shift><control>F", NULL, G_CALLBACK(search_folder_cb) },
557 {"Edit/QuickSearch", NULL, N_("_Quick search"), "slash", NULL, G_CALLBACK(mainwindow_quicksearch) },
559 /* View menu */
560 {"View/ShowHide", NULL, N_("Show or hi_de"), NULL, NULL, NULL },
561 {"View/ShowHide/Toolbar", NULL, N_("_Toolbar"), NULL, NULL, NULL },
563 {"View/SetColumns", NULL, N_("Set displayed _columns"), NULL, NULL, NULL },
564 {"View/SetColumns/Folderlist", NULL, N_("In _folder list..."), NULL, NULL, G_CALLBACK(set_folder_display_item_cb) },
565 {"View/SetColumns/Messagelist", NULL, N_("In _message list..."), NULL, NULL, G_CALLBACK(set_summary_display_item_cb) },
566 {"View/---", NULL, "---", NULL, NULL, NULL },
569 #ifndef GENERIC_UMPC
570 {"View/Layout", NULL, N_("La_yout"), NULL, NULL, NULL },
571 #endif
572 {"View/Sort", NULL, N_("_Sort"), NULL, NULL, NULL },
573 {"View/Sort/---", NULL, "---", NULL, NULL, NULL },
574 {"View/Sort/AttractSubj", NULL, N_("_Attract by subject"), NULL, NULL, G_CALLBACK(attract_by_subject_cb) },
576 {"View/ExpandThreads", NULL, N_("E_xpand all threads"), NULL, NULL, G_CALLBACK(expand_threads_cb) },
577 {"View/CollapseThreads", NULL, N_("Co_llapse all threads"), NULL, NULL, G_CALLBACK(collapse_threads_cb) },
579 {"View/Goto", NULL, N_("_Go to"), NULL, NULL, NULL },
580 {"View/Goto/Prev", NULL, N_("_Previous message"), "P", NULL, G_CALLBACK(prev_cb) },
581 {"View/Goto/Next", NULL, N_("_Next message"), "N", NULL, G_CALLBACK(next_cb) },
582 {"View/Goto/---", NULL, "---", NULL, NULL, NULL },
583 {"View/Goto/PrevUnread", NULL, N_("P_revious unread message"), "<shift>P", NULL, G_CALLBACK(prev_unread_cb) },
584 {"View/Goto/NextUnread", NULL, N_("N_ext unread message"), "<shift>N", NULL, G_CALLBACK(next_unread_cb) },
585 /* {"View/Goto/---", NULL, "---", NULL, NULL, NULL }, */
586 {"View/Goto/PrevNew", NULL, N_("Previous ne_w message"), NULL, NULL, G_CALLBACK(prev_new_cb) },
587 {"View/Goto/NextNew", NULL, N_("Ne_xt new message"), NULL, NULL, G_CALLBACK(next_new_cb) },
588 /* {"View/Goto/---", NULL, "---", NULL, NULL, NULL }, */
589 {"View/Goto/PrevMarked", NULL, N_("Previous _marked message"), NULL, NULL, G_CALLBACK(prev_marked_cb) },
590 {"View/Goto/NextMarked", NULL, N_("Next m_arked message"), NULL, NULL, G_CALLBACK(next_marked_cb) },
591 /* {"View/Goto/---", NULL, "---", NULL, NULL, NULL }, */
592 {"View/Goto/PrevLabeled", NULL, N_("Previous _labeled message"), NULL, NULL, G_CALLBACK(prev_labeled_cb) },
593 {"View/Goto/NextLabeled", NULL, N_("Next la_beled message"), NULL, NULL, G_CALLBACK(next_labeled_cb) },
594 /* {"View/Goto/---", NULL, "---", NULL, NULL, NULL }, */
595 {"View/Goto/PrevHistory", NULL, N_("Previously opened message"), "<alt>Left", NULL, G_CALLBACK(prev_history_cb) },
596 {"View/Goto/NextHistory", NULL, N_("Next opened message"), "<alt>Right", NULL, G_CALLBACK(next_history_cb) },
597 /* {"View/Goto/---", NULL, "---", NULL, NULL, NULL }, */
598 {"View/Goto/ParentMessage", NULL, N_("Parent message"), "<control>Up", NULL, G_CALLBACK(parent_cb) },
599 /* {"View/Goto/---", NULL, "---", NULL, NULL, NULL }, */
600 {"View/Goto/NextUnreadFolder", NULL, N_("Next unread _folder"), "<shift>G", NULL, G_CALLBACK(goto_unread_folder_cb) },
601 {"View/Goto/Folder", NULL, N_("F_older..."), "G", NULL, G_CALLBACK(goto_folder_cb) },
602 /* {"View/Goto/---", NULL, "---", NULL, NULL, NULL }, */
603 {"View/Goto/NextPart", NULL, N_("Next part"), "A", NULL, G_CALLBACK(goto_next_part_cb) },
604 {"View/Goto/PrevPart", NULL, N_("Previous part"), "Z", NULL, G_CALLBACK(goto_prev_part_cb) },
606 /* {"View/Scroll/---", NULL, "---", NULL, NULL, NULL }, */
607 {"View/Scroll", NULL, N_("Message scroll"), NULL, NULL, NULL },
608 {"View/Scroll/PrevLine", NULL, N_("Previous line"), NULL, NULL, G_CALLBACK(scroll_prev_line_cb) },
609 {"View/Scroll/NextLine", NULL, N_("Next line"), NULL, NULL, G_CALLBACK(scroll_next_line_cb) },
610 {"View/Scroll/PrevPage", NULL, N_("Previous page"), NULL, NULL, G_CALLBACK(scroll_prev_page_cb) },
611 {"View/Scroll/NextPage", NULL, N_("Next page"), NULL, NULL, G_CALLBACK(scroll_next_page_cb) },
613 /* {"View/---", NULL, "---", NULL, NULL, NULL }, */
614 {"View/Encoding", NULL, N_("Character _encoding"), NULL, NULL, NULL }, /* set_charset_cb */
615 {"View/Encoding/---", NULL, "---", NULL, NULL, NULL },
616 #define ENC_ACTION(cs_char,c_char,string) \
617 { "View/Encoding/" cs_char, NULL, N_(string), NULL, NULL, c_char }
619 {"View/Encoding/Western", NULL, N_("Western European"), NULL, NULL, NULL },
620 {"View/Encoding/Baltic", NULL, N_("Baltic"), NULL, NULL, NULL },
621 {"View/Encoding/Hebrew", NULL, N_("Hebrew"), NULL, NULL, NULL },
622 {"View/Encoding/Arabic", NULL, N_("Arabic"), NULL, NULL, NULL },
623 {"View/Encoding/Cyrillic", NULL, N_("Cyrillic"), NULL, NULL, NULL },
624 {"View/Encoding/Japanese", NULL, N_("Japanese"), NULL, NULL, NULL },
625 {"View/Encoding/Chinese", NULL, N_("Chinese"), NULL, NULL, NULL },
626 {"View/Encoding/Korean", NULL, N_("Korean"), NULL, NULL, NULL },
627 {"View/Encoding/Thai", NULL, N_("Thai"), NULL, NULL, NULL },
629 {"View/Decode", NULL, N_("Decode"), NULL, NULL, NULL }, /* set_decode_cb */
630 {"View/Decode/---", NULL, "---", NULL, NULL, NULL },
632 #define DEC_ACTION(cs_type,c_type,string) \
633 { "View/Decode/" cs_type, NULL, N_(string), NULL, NULL, c_type }
635 /* {"View/---", NULL, "---", NULL, NULL, NULL }, */
636 {"View/OpenNewWindow", NULL, N_("Open in new _window"), "<control><alt>N", NULL, G_CALLBACK(open_msg_cb) },
637 {"View/MessageSource", NULL, N_("Mess_age source"), "<control>U", NULL, G_CALLBACK(view_source_cb) },
638 /* {"View/---", NULL, "---", NULL, NULL, NULL }, */
639 {"View/Part", NULL, N_("Message part"), NULL, NULL, NULL },
640 {"View/Part/AsText", NULL, N_("View as text"), "T", NULL, G_CALLBACK(view_part_as_text_cb) },
641 {"View/Part/Open", NULL, N_("Open"), "L", NULL, G_CALLBACK(open_part_cb) },
642 #ifndef G_OS_WIN32
643 {"View/Part/OpenWith", NULL, N_("Open with..."), "O", NULL, G_CALLBACK(open_part_with_cb) },
644 #endif
645 /* {"View/---", NULL, "---", NULL, NULL, NULL }, */
647 {"View/Quotes", NULL, N_("Quotes"), NULL, NULL, NULL },
648 /* {"View/---", NULL, "---", NULL, NULL, NULL }, */
649 {"View/UpdateSummary", NULL, N_("_Update summary"), "<control><alt>U", NULL, G_CALLBACK(update_summary_cb) },
651 /* Message menu */
652 {"Message/Receive", NULL, N_("Recei_ve"), NULL, NULL, NULL },
653 {"Message/Receive/CurrentAccount", NULL, N_("Get from _current account"), "<control>I", NULL, G_CALLBACK(mw_inc_mail_cb) },
654 {"Message/Receive/AllAccounts", NULL, N_("Get from _all accounts"), "<shift><control>I", NULL, G_CALLBACK(mw_inc_all_account_mail_cb) },
655 {"Message/Receive/CancelReceiving", NULL, N_("Cancel receivin_g"), NULL, NULL, G_CALLBACK(inc_cancel_cb) },
656 {"Message/Receive/---", NULL, "---", NULL, NULL, NULL },
657 {"Message/Receive/PlaceHolder", NULL, "PlaceHolder,", NULL, NULL, G_CALLBACK(mainwindow_nothing_cb) },
658 {"Message/SendQueue", NULL, N_("_Send queued messages"), NULL, NULL, G_CALLBACK(mw_send_queue_cb) },
659 {"Message/CancelSending", NULL, N_("Cancel sending"), NULL, NULL, G_CALLBACK(send_cancel_cb) },
661 {"Message/---", NULL, "---", NULL, NULL, NULL },
663 {"Message/ComposeEmail", NULL, N_("Compose a_n email message"), "<control>M", NULL, G_CALLBACK(mw_compose_mail_cb) },
664 {"Message/ComposeNews", NULL, N_("Compose a news message"), NULL, NULL, G_CALLBACK(mw_compose_news_cb) },
666 {"Message/Reply", NULL, N_("_Reply"), "<control>R", NULL, G_CALLBACK(main_window_reply_cb) }, /* COMPOSE_REPLY */
667 {"Message/ReplyTo", NULL, N_("Repl_y to"), NULL, NULL, NULL },
668 {"Message/ReplyTo/All", NULL, N_("_All"), "<shift><control>R", NULL, G_CALLBACK(main_window_reply_cb) }, /* COMPOSE_REPLY_TO_ALL */
669 {"Message/ReplyTo/Sender", NULL, N_("_Sender"), NULL, NULL, G_CALLBACK(main_window_reply_cb) }, /* COMPOSE_REPLY_TO_SENDER */
670 {"Message/ReplyTo/List", NULL, N_("Mailing _list"), "<control>L", NULL, G_CALLBACK(main_window_reply_cb) }, /* COMPOSE_REPLY_TO_LIST */
671 {"Message/FollowupReply", NULL, N_("Follow-up and reply to"), NULL, NULL, G_CALLBACK(main_window_reply_cb) }, /* COMPOSE_FOLLOWUP_AND_REPLY_TO */
672 /* {"Message/---", NULL, "---", NULL, NULL, NULL }, */
674 {"Message/Forward", NULL, N_("_Forward"), "<control><alt>F", NULL, G_CALLBACK(main_window_reply_cb) }, /* COMPOSE_FORWARD_INLINE */
675 {"Message/ForwardAtt", NULL, N_("For_ward as attachment"), NULL, NULL, G_CALLBACK(main_window_reply_cb) }, /* COMPOSE_FORWARD_AS_ATTACH */
676 {"Message/Redirect", NULL, N_("Redirec_t"), NULL, NULL, G_CALLBACK(main_window_reply_cb) }, /* COMPOSE_REDIRECT */
678 {"Message/MailingList", NULL, N_("Mailing-_List"), NULL, NULL, NULL },
679 {"Message/MailingList/Post", NULL, N_("Post"), NULL, NULL, NULL },
680 {"Message/MailingList/Post/PlaceHolder", NULL, "Placeholder", NULL, NULL, G_CALLBACK(mainwindow_nothing_cb) },
681 {"Message/MailingList/Help", NULL, N_("Help"), NULL, NULL, NULL },
682 {"Message/MailingList/Help/PlaceHolder", NULL, "Placeholder", NULL, NULL, G_CALLBACK(mainwindow_nothing_cb) },
683 {"Message/MailingList/Subscribe", NULL, N_("Subscribe"), NULL, NULL, NULL },
684 {"Message/MailingList/Subscribe/PlaceHolder", NULL, "Placeholder", NULL, NULL, G_CALLBACK(mainwindow_nothing_cb) },
685 {"Message/MailingList/Unsubscribe", NULL, N_("Unsubscribe"), NULL, NULL, NULL },
686 {"Message/MailingList/Unsubscribe/PlaceHolder", NULL, "Placeholder", NULL, NULL, G_CALLBACK(mainwindow_nothing_cb) },
687 {"Message/MailingList/ViewArchive", NULL, N_("View archive"), NULL, NULL, NULL },
688 {"Message/MailingList/ViewArchive/PlaceHolder", NULL, "Placeholder", NULL, NULL, G_CALLBACK(mainwindow_nothing_cb) },
689 {"Message/MailingList/ContactOwner", NULL, N_("Contact owner"), NULL, NULL, NULL },
690 {"Message/MailingList/ContactOwner/PlaceHolder", NULL, "Placeholder", NULL, NULL, G_CALLBACK(mainwindow_nothing_cb) },
691 /* separation */
693 {"Message/Move", NULL, N_("M_ove..."), "<control>O", NULL, G_CALLBACK(move_to_cb) },
694 {"Message/Copy", NULL, N_("_Copy..."), "<shift><control>O", NULL, G_CALLBACK(copy_to_cb) },
695 {"Message/Trash", NULL, N_("Move to _trash"), "<control>D", NULL, G_CALLBACK(delete_trash_cb) },
696 {"Message/Delete", NULL, N_("_Delete..."), NULL, NULL, G_CALLBACK(delete_cb) },
697 {"Message/TrashThread", NULL, N_("Move thread to tr_ash"), NULL, NULL, G_CALLBACK(trash_thread_cb) },
698 {"Message/DeleteThread", NULL, N_("Delete t_hread"), NULL, NULL, G_CALLBACK(delete_thread_cb) },
699 {"Message/CancelNews", NULL, N_("Cancel a news message"), NULL, NULL, G_CALLBACK(cancel_cb) },
700 /* separation */
701 {"Message/Mark", NULL, NC_("Menu Item", "_Mark"), NULL, NULL, NULL },
702 {"Message/Mark/Mark", NULL, NC_("Sub-Menu Item", "_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"), "<shift><control>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..."), "<shift><control>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"), "<shift><control>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 gtk_widget_get_allocation(GTK_WIDGET_PTR(mainwin->summaryview), &allocation);
2789 if (allocation.width > 1 && allocation.height > 1) {
2790 prefs_common.summaryview_width = allocation.width;
2792 if (messageview_is_visible(mainwin->messageview))
2793 prefs_common.summaryview_height = allocation.height;
2795 prefs_common.mainview_width = allocation.width;
2798 gtk_window_get_size(GTK_WINDOW(mainwin->window), &allocation.width, &allocation.height);
2799 if (allocation.width > 1 && allocation.height > 1) {
2800 prefs_common.mainview_height = allocation.height;
2801 prefs_common.mainwin_width = allocation.width;
2802 prefs_common.mainwin_height = allocation.height;
2805 gtk_widget_get_allocation(GTK_WIDGET_PTR(mainwin->folderview), &allocation);
2806 if (allocation.width > 1 && allocation.height > 1) {
2807 prefs_common.folderview_width = allocation.width;
2808 prefs_common.folderview_height = allocation.height;
2811 gtk_widget_get_allocation(GTK_WIDGET_PTR(mainwin->messageview), &allocation);
2812 if (allocation.width > 1 && allocation.height > 1) {
2813 prefs_common.msgview_width = allocation.width;
2814 prefs_common.msgview_height = allocation.height;
2817 /* debug_print("summaryview size: %d x %d\n",
2818 prefs_common.summaryview_width,
2819 prefs_common.summaryview_height);
2820 debug_print("folderview size: %d x %d\n",
2821 prefs_common.folderview_width,
2822 prefs_common.folderview_height);
2823 debug_print("messageview size: %d x %d\n",
2824 prefs_common.msgview_width,
2825 prefs_common.msgview_height); */
2828 void main_window_get_position(MainWindow *mainwin)
2830 gint x, y;
2832 if (prefs_common.mainwin_maximised || prefs_common.mainwin_fullscreen)
2833 return;
2835 gtk_window_get_position(GTK_WINDOW(mainwin->window), &x, &y);
2837 prefs_common.mainview_x = x;
2838 prefs_common.mainview_y = y;
2839 prefs_common.mainwin_x = x;
2840 prefs_common.mainwin_y = y;
2842 debug_print("main window position: %d, %d\n", x, y);
2845 void main_window_progress_on(MainWindow *mainwin)
2847 gtk_progress_bar_set_text(GTK_PROGRESS_BAR(mainwin->progressbar), "");
2850 void main_window_progress_off(MainWindow *mainwin)
2852 gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(mainwin->progressbar), 0.0);
2853 gtk_progress_bar_set_text(GTK_PROGRESS_BAR(mainwin->progressbar), "");
2856 gboolean main_window_empty_trash(MainWindow *mainwin, gboolean confirm, gboolean for_quit)
2858 if (confirm && procmsg_have_trashed_mails_fast()) {
2859 AlertValue val;
2861 if (for_quit)
2862 val = alertpanel(_("Empty trash"),
2863 _("Delete all messages in trash folders?"),
2864 NULL, _("_No"), NULL, _("_Yes"), NULL, _("Don't quit"),
2865 ALERTFOCUS_SECOND);
2866 else
2867 val = alertpanel(_("Empty trash"),
2868 _("Delete all messages in trash folders?"),
2869 NULL, _("_No"), NULL, _("_Yes"), NULL, NULL,
2870 ALERTFOCUS_SECOND);
2871 if (val == G_ALERTALTERNATE) {
2872 debug_print("will empty trash\n");
2873 } else if (val == G_ALERTDEFAULT) {
2874 debug_print("will not empty trash\n");
2875 return TRUE;
2876 } else {
2877 return FALSE; /* cancel exit */
2879 manage_window_focus_in(mainwin->window, NULL, NULL);
2882 procmsg_empty_all_trash();
2884 if (mainwin->summaryview->folder_item &&
2885 mainwin->summaryview->folder_item->stype == F_TRASH)
2886 folderview_grab_focus(mainwin->folderview);
2887 return TRUE;
2890 static void main_window_add_mailbox(MainWindow *mainwin)
2892 gchar *path;
2893 Folder *folder;
2895 path = input_dialog(_("Add mailbox"),
2896 _("Input the location of the mailbox.\n"
2897 "The location can be either the full path or relative to the \n"
2898 "home directory.\n"
2899 "If the location of an existing mailbox is specified, it will be\n"
2900 "scanned automatically."),
2901 "Mail");
2902 if (!path) return;
2903 if (folder_find_from_path(path)) {
2904 alertpanel_error(_("The mailbox '%s' already exists."), path);
2905 g_free(path);
2906 return;
2908 folder = folder_new(folder_get_class_from_string("mh"),
2909 !strcmp(path, "Mail") ? _("Mailbox") :
2910 g_path_get_basename(path), path);
2911 g_free(path);
2913 if (folder->klass->create_tree(folder) < 0) {
2914 alertpanel_error(_("Creation of the mailbox failed.\n"
2915 "Maybe some files already exist, or you don't have the permission to write there."));
2916 folder_destroy(folder);
2917 return;
2920 folder_add(folder);
2921 folder_set_ui_func(folder, scan_tree_func, mainwin);
2922 folder_scan_tree(folder, TRUE);
2923 folder_set_ui_func(folder, NULL, NULL);
2926 SensitiveCondMask main_window_get_current_state(MainWindow *mainwin)
2928 SensitiveCondMask state = 0;
2929 SummarySelection selection;
2930 FolderItem *item = mainwin->summaryview->folder_item;
2931 GList *account_list = account_get_list();
2932 GSList *tmp;
2934 selection = summary_get_selection_type(mainwin->summaryview);
2936 #define UPDATE_STATE(...) \
2937 do { \
2938 state |= main_window_get_mask(__VA_ARGS__, -1); \
2939 } while (0)
2941 if (mainwin->lock_count == 0 && !claws_is_starting())
2942 UPDATE_STATE(M_UNLOCKED);
2943 if (selection != SUMMARY_NONE && selection != SUMMARY_SELECTED_NONE)
2944 UPDATE_STATE(M_MSG_SELECTED);
2945 if (item && item->total_msgs > 0)
2946 UPDATE_STATE(M_MSG_EXIST);
2947 if (item && item->path && folder_item_parent(item) && !item->no_select) {
2948 UPDATE_STATE(M_EXEC);
2949 /* if (item->folder->type != F_NEWS) */
2950 UPDATE_STATE(M_ALLOW_DELETE);
2952 if (prefs_common.immediate_exec == 0
2953 && mainwin->lock_count == 0)
2954 UPDATE_STATE(M_DELAY_EXEC);
2956 if ((selection == SUMMARY_NONE && item->hide_read_msgs)
2957 || selection != SUMMARY_NONE)
2958 UPDATE_STATE(M_HIDE_READ_MSG);
2960 if ((selection == SUMMARY_NONE && item->hide_read_threads)
2961 || selection != SUMMARY_NONE)
2962 UPDATE_STATE(M_HIDE_READ_THREADS);
2964 if (mainwin->summaryview->threaded)
2965 UPDATE_STATE(M_THREADED);
2966 else
2967 UPDATE_STATE(M_UNTHREADED);
2968 if (selection == SUMMARY_SELECTED_SINGLE ||
2969 selection == SUMMARY_SELECTED_MULTIPLE)
2970 UPDATE_STATE(M_TARGET_EXIST);
2971 if (selection == SUMMARY_SELECTED_SINGLE)
2972 UPDATE_STATE(M_SINGLE_TARGET_EXIST);
2973 if (mainwin->summaryview->folder_item &&
2974 mainwin->summaryview->folder_item->folder->klass->type == F_NEWS)
2975 UPDATE_STATE(M_NEWS);
2976 else
2977 UPDATE_STATE(M_NOT_NEWS);
2978 if (mainwin->summaryview->folder_item &&
2979 (mainwin->summaryview->folder_item->stype != F_TRASH ||
2980 !folder_has_parent_of_type(mainwin->summaryview->folder_item, F_TRASH)))
2981 UPDATE_STATE(M_NOT_TRASH);
2983 if (mainwin->summaryview->folder_item
2984 && mainwin->summaryview->folder_item->stype != F_DRAFT)
2985 UPDATE_STATE(M_NOT_DRAFT);
2987 if (prefs_common.actions_list && g_slist_length(prefs_common.actions_list))
2988 UPDATE_STATE(M_ACTIONS_EXIST);
2990 tmp = tags_get_list();
2991 if (tmp && g_slist_length(tmp))
2992 UPDATE_STATE(M_TAGS_EXIST);
2993 g_slist_free(tmp);
2995 if (procmsg_have_queued_mails_fast() && !procmsg_is_sending())
2996 UPDATE_STATE(M_HAVE_QUEUED_MAILS);
2998 if (selection == SUMMARY_SELECTED_SINGLE &&
2999 (item &&
3000 (folder_has_parent_of_type(item, F_DRAFT) ||
3001 folder_has_parent_of_type(item, F_OUTBOX) ||
3002 folder_has_parent_of_type(item, F_QUEUE))))
3003 UPDATE_STATE(M_ALLOW_REEDIT);
3004 if (cur_account)
3005 UPDATE_STATE(M_HAVE_ACCOUNT);
3007 if (cur_account && cur_account->protocol != A_NONE)
3008 UPDATE_STATE(M_HAVE_RETRIEVABLE_ACCOUNT);
3010 if (any_folder_want_synchronise())
3011 UPDATE_STATE(M_WANT_SYNC);
3013 if (item && item->prefs->processing && selection != SUMMARY_NONE)
3014 UPDATE_STATE(M_HAVE_PROCESSING);
3016 if (g_list_length(account_list) > 1)
3017 UPDATE_STATE(M_HAVE_MULTI_ACCOUNT);
3019 for (account_list = account_get_list(); account_list != NULL; account_list = account_list->next) {
3020 if (((PrefsAccount*)account_list->data)->protocol != A_NONE) {
3021 UPDATE_STATE(M_HAVE_ANY_RETRIEVABLE_ACCOUNT);
3022 break;
3026 for (account_list = account_get_list(); account_list != NULL; account_list = account_list->next) {
3027 if (((PrefsAccount*)account_list->data)->protocol == A_NNTP) {
3028 UPDATE_STATE(M_HAVE_NEWS_ACCOUNT);
3029 break;
3033 if (procmsg_spam_can_learn() &&
3034 (mainwin->summaryview->folder_item &&
3035 mainwin->summaryview->folder_item->folder->klass->type != F_UNKNOWN &&
3036 mainwin->summaryview->folder_item->folder->klass->type != F_NEWS)) {
3037 UPDATE_STATE(M_CAN_LEARN_SPAM);
3040 if (mainwin->summaryview->folder_item) {
3041 UPDATE_STATE(M_FOLDER_SELECTED);
3044 if (inc_is_active())
3045 UPDATE_STATE(M_INC_ACTIVE);
3046 if (imap_cancel_all_enabled())
3047 UPDATE_STATE(M_INC_ACTIVE);
3049 if (send_is_active() | procmsg_is_sending())
3050 UPDATE_STATE(M_SEND_ACTIVE);
3052 if (mainwin->summaryview->deleted > 0)
3053 UPDATE_STATE(M_DELETED_EXISTS);
3055 if (mainwin->summaryview->deleted > 0 ||
3056 mainwin->summaryview->moved > 0 ||
3057 mainwin->summaryview->copied > 0)
3058 UPDATE_STATE(M_DELAY_EXEC);
3060 if (summary_is_list(mainwin->summaryview))
3061 UPDATE_STATE(M_SUMMARY_ISLIST);
3063 if (prefs_common.layout_mode != SMALL_LAYOUT || mainwin->in_folder)
3064 UPDATE_STATE(M_IN_MSGLIST);
3066 for (account_list = account_get_list(); account_list != NULL; account_list = account_list->next) {
3067 PrefsAccount *account = account_list->data;
3068 if (account->session_passwd || account->session_smtp_passwd) {
3069 UPDATE_STATE(M_SESSION_PASSWORDS);
3070 break;
3074 #ifndef PASSWORD_CRYPTO_OLD
3075 if (primary_passphrase_is_entered()) {
3076 UPDATE_STATE(M_MASTER_PASSPHRASE);
3078 #endif
3080 #undef UPDATE_STATE
3082 return state;
3085 SensitiveCondMask main_window_get_mask(SensitiveCond cond, ...)
3087 va_list args;
3088 gint i;
3089 SensitiveCondMask value;
3090 static SensitiveCondMask SensitiveCond_table[M_MAX_RESERVED];
3091 static gboolean first_time = TRUE;
3093 if (first_time) {
3094 for (i = 0; i < M_MAX_RESERVED; i++)
3095 SensitiveCond_table[i] = (SensitiveCondMask) ((SensitiveCondMask)1 << i);
3096 first_time = FALSE;
3099 value = 0;
3101 va_start(args, cond);
3102 for (i = (gint) cond; i >= 0 && i < M_MAX_RESERVED; i = va_arg(args, gint))
3103 value |= SensitiveCond_table[i];
3104 va_end(args);
3106 return value;
3109 void main_window_set_menu_sensitive(MainWindow *mainwin)
3111 SensitiveCondMask state;
3112 gboolean sensitive;
3113 SummaryView *summaryview;
3114 gchar *menu_path;
3115 GtkWidget *menu;
3116 GList *children, *cur_item;
3117 gboolean mimepart_selected = FALSE;
3119 state = main_window_get_current_state(mainwin);
3121 #define SET_SENSITIVE(entry_str, ...) \
3123 SensitiveCondMask cond = main_window_get_mask(__VA_ARGS__, -1); \
3124 cm_menu_set_sensitive_full(mainwin->ui_manager, \
3125 (const gchar *) entry_str, \
3126 ((cond & state) == cond)); \
3128 SET_SENSITIVE("Menu/File/SaveAs", M_TARGET_EXIST);
3129 SET_SENSITIVE("Menu/File/SavePartAs", M_SINGLE_TARGET_EXIST);
3130 SET_SENSITIVE("Menu/File/Print", M_TARGET_EXIST);
3131 SET_SENSITIVE("Menu/File/SynchroniseFolders", M_WANT_SYNC);
3132 SET_SENSITIVE("Menu/File/Exit", M_UNLOCKED);
3134 SET_SENSITIVE("Menu/Edit/SelectThread", M_TARGET_EXIST, M_SUMMARY_ISLIST);
3135 SET_SENSITIVE("Menu/Edit/Find", M_SINGLE_TARGET_EXIST);
3136 SET_SENSITIVE("Menu/Edit/QuickSearch", M_IN_MSGLIST);
3137 SET_SENSITIVE("Menu/Edit/SearchFolder", M_TARGET_EXIST, M_SUMMARY_ISLIST);
3139 SET_SENSITIVE("Menu/View/SetColumns/Folderlist", M_UNLOCKED, M_SUMMARY_ISLIST);
3140 SET_SENSITIVE("Menu/View/Sort", M_EXEC, M_SUMMARY_ISLIST);
3141 SET_SENSITIVE("Menu/View/ThreadView", M_EXEC, M_SUMMARY_ISLIST);
3142 SET_SENSITIVE("Menu/View/ExpandThreads", M_MSG_EXIST, M_SUMMARY_ISLIST);
3143 SET_SENSITIVE("Menu/View/CollapseThreads", M_MSG_EXIST, M_SUMMARY_ISLIST);
3144 SET_SENSITIVE("Menu/View/HideReadThreads", M_HIDE_READ_THREADS, M_SUMMARY_ISLIST, M_NOT_DRAFT);
3145 SET_SENSITIVE("Menu/View/HideReadMessages", M_HIDE_READ_MSG, M_SUMMARY_ISLIST, M_NOT_DRAFT);
3146 SET_SENSITIVE("Menu/View/HideDelMessages", M_SUMMARY_ISLIST, M_NOT_DRAFT);
3147 SET_SENSITIVE("Menu/View/Goto/Prev", M_MSG_SELECTED);
3148 SET_SENSITIVE("Menu/View/Goto/Next", M_MSG_SELECTED);
3149 SET_SENSITIVE("Menu/View/Goto/PrevUnread", M_MSG_SELECTED);
3150 SET_SENSITIVE("Menu/View/Goto/NextUnread", M_MSG_SELECTED);
3151 SET_SENSITIVE("Menu/View/Goto/PrevNew", M_MSG_SELECTED);
3152 SET_SENSITIVE("Menu/View/Goto/NextNew", M_MSG_SELECTED);
3153 SET_SENSITIVE("Menu/View/Goto/PrevMarked", M_MSG_SELECTED);
3154 SET_SENSITIVE("Menu/View/Goto/NextMarked", M_MSG_SELECTED);
3155 SET_SENSITIVE("Menu/View/Goto/PrevLabeled", M_MSG_SELECTED);
3156 SET_SENSITIVE("Menu/View/Goto/NextLabeled", M_MSG_SELECTED);
3157 SET_SENSITIVE("Menu/View/Goto/ParentMessage", M_SINGLE_TARGET_EXIST);
3158 SET_SENSITIVE("Menu/View/Goto/NextPart", M_SINGLE_TARGET_EXIST);
3159 SET_SENSITIVE("Menu/View/Goto/PrevPart", M_SINGLE_TARGET_EXIST);
3160 SET_SENSITIVE("Menu/View/OpenNewWindow", M_SINGLE_TARGET_EXIST);
3161 SET_SENSITIVE("Menu/View/MessageSource", M_SINGLE_TARGET_EXIST);
3162 SET_SENSITIVE("Menu/View/Part", M_SINGLE_TARGET_EXIST);
3163 SET_SENSITIVE("Menu/View/AllHeaders", M_SINGLE_TARGET_EXIST);
3164 SET_SENSITIVE("Menu/View/Quotes", M_SINGLE_TARGET_EXIST);
3166 SET_SENSITIVE("Menu/Message/Receive/CurrentAccount", M_HAVE_ACCOUNT, M_UNLOCKED, M_HAVE_RETRIEVABLE_ACCOUNT);
3167 SET_SENSITIVE("Menu/Message/Receive/AllAccounts", M_HAVE_ACCOUNT, M_UNLOCKED, M_HAVE_ANY_RETRIEVABLE_ACCOUNT);
3168 SET_SENSITIVE("Menu/Message/Receive/CancelReceiving", M_INC_ACTIVE);
3169 SET_SENSITIVE("Menu/Message/SendQueue", M_HAVE_ACCOUNT, M_HAVE_QUEUED_MAILS);
3170 SET_SENSITIVE("Menu/Message/CancelSending", M_SEND_ACTIVE);
3171 SET_SENSITIVE("Menu/Message/ComposeEmail", M_HAVE_ACCOUNT);
3172 SET_SENSITIVE("Menu/Message/ComposeNews", M_HAVE_NEWS_ACCOUNT);
3173 SET_SENSITIVE("Menu/Message/Reply", M_HAVE_ACCOUNT, M_TARGET_EXIST, M_SUMMARY_ISLIST);
3174 SET_SENSITIVE("Menu/Message/ReplyTo", M_HAVE_ACCOUNT, M_TARGET_EXIST, M_SUMMARY_ISLIST);
3175 SET_SENSITIVE("Menu/Message/FollowupReply", M_HAVE_ACCOUNT, M_TARGET_EXIST, M_NEWS, M_SUMMARY_ISLIST);
3176 SET_SENSITIVE("Menu/Message/Forward", M_HAVE_ACCOUNT, M_TARGET_EXIST, M_SUMMARY_ISLIST);
3177 SET_SENSITIVE("Menu/Message/ForwardAtt", M_HAVE_ACCOUNT, M_TARGET_EXIST, M_SUMMARY_ISLIST);
3178 SET_SENSITIVE("Menu/Message/Redirect", M_HAVE_ACCOUNT, M_TARGET_EXIST, M_SUMMARY_ISLIST);
3179 SET_SENSITIVE("Menu/Message/Move", M_TARGET_EXIST, M_ALLOW_DELETE, M_NOT_NEWS);
3180 SET_SENSITIVE("Menu/Message/Copy", M_TARGET_EXIST, M_EXEC);
3181 SET_SENSITIVE("Menu/Message/Trash", M_TARGET_EXIST, M_ALLOW_DELETE, M_NOT_NEWS, M_NOT_TRASH);
3182 SET_SENSITIVE("Menu/Message/Delete", M_TARGET_EXIST, M_ALLOW_DELETE);
3183 SET_SENSITIVE("Menu/Message/TrashThread", M_TARGET_EXIST, M_SUMMARY_ISLIST);
3184 SET_SENSITIVE("Menu/Message/DeleteThread", M_TARGET_EXIST, M_SUMMARY_ISLIST);
3185 SET_SENSITIVE("Menu/Message/CancelNews", M_TARGET_EXIST, M_ALLOW_DELETE, M_NEWS);
3186 SET_SENSITIVE("Menu/Message/Mark", M_TARGET_EXIST, M_SUMMARY_ISLIST);
3187 SET_SENSITIVE("Menu/Message/Mark/MarkSpam", M_TARGET_EXIST, M_CAN_LEARN_SPAM);
3188 SET_SENSITIVE("Menu/Message/Mark/MarkHam", M_TARGET_EXIST, M_CAN_LEARN_SPAM);
3189 SET_SENSITIVE("Menu/Message/Mark/IgnoreThread", M_TARGET_EXIST);
3190 SET_SENSITIVE("Menu/Message/Mark/UnignoreThread", M_TARGET_EXIST);
3191 SET_SENSITIVE("Menu/Message/Mark/Lock", M_TARGET_EXIST);
3192 SET_SENSITIVE("Menu/Message/Mark/Unlock", M_TARGET_EXIST);
3193 SET_SENSITIVE("Menu/Message/ColorLabel", M_TARGET_EXIST);
3194 SET_SENSITIVE("Menu/Message/Tags", M_TARGET_EXIST);
3195 SET_SENSITIVE("Menu/Message/Reedit", M_HAVE_ACCOUNT, M_ALLOW_REEDIT);
3196 SET_SENSITIVE("Menu/Message/CheckSignature", M_SINGLE_TARGET_EXIST);
3198 SET_SENSITIVE("Menu/Tools/AddSenderToAB", M_SINGLE_TARGET_EXIST);
3199 SET_SENSITIVE("Menu/Tools/CollectAddresses", M_FOLDER_SELECTED);
3200 SET_SENSITIVE("Menu/Tools/CollectAddresses/FromFolder", M_FOLDER_SELECTED);
3201 SET_SENSITIVE("Menu/Tools/CollectAddresses/FromSelected", M_TARGET_EXIST);
3202 SET_SENSITIVE("Menu/Tools/FilterFolder", M_MSG_EXIST, M_EXEC);
3203 SET_SENSITIVE("Menu/Tools/FilterSelected", M_TARGET_EXIST, M_EXEC);
3204 SET_SENSITIVE("Menu/Tools/RunProcessing", M_HAVE_PROCESSING);
3205 SET_SENSITIVE("Menu/Tools/CreateFilterRule", M_SINGLE_TARGET_EXIST, M_UNLOCKED);
3206 SET_SENSITIVE("Menu/Tools/CreateProcessingRule", M_SINGLE_TARGET_EXIST, M_UNLOCKED);
3207 SET_SENSITIVE("Menu/Tools/ListUrls", M_TARGET_EXIST);
3208 SET_SENSITIVE("Menu/Tools/Actions", M_TARGET_EXIST, M_ACTIONS_EXIST);
3209 SET_SENSITIVE("Menu/Tools/Execute", M_DELAY_EXEC);
3210 SET_SENSITIVE("Menu/Tools/Expunge", M_DELETED_EXISTS);
3211 SET_SENSITIVE("Menu/Tools/ForgetSessionPasswords", M_SESSION_PASSWORDS);
3212 #ifndef PASSWORD_CRYPTO_OLD
3213 SET_SENSITIVE("Menu/Tools/ForgetPrimaryPassphrase", M_MASTER_PASSPHRASE);
3214 #endif
3215 SET_SENSITIVE("Menu/Tools/DeleteDuplicates/SelFolder", M_MSG_EXIST, M_ALLOW_DELETE);
3217 SET_SENSITIVE("Menu/Configuration", M_UNLOCKED);
3218 SET_SENSITIVE("Menu/Configuration/ChangeAccount", M_HAVE_MULTI_ACCOUNT);
3219 SET_SENSITIVE("Menu/Configuration/AccountPrefs", M_UNLOCKED);
3220 SET_SENSITIVE("Menu/Configuration/CreateAccount", M_UNLOCKED);
3221 SET_SENSITIVE("Menu/Configuration/EditAccounts", M_UNLOCKED);
3222 #undef SET_SENSITIVE
3224 menu = gtk_menu_item_get_submenu(GTK_MENU_ITEM(
3225 gtk_ui_manager_get_widget(mainwin->ui_manager, "/Menu/Message/Receive")));
3227 children = gtk_container_get_children(GTK_CONTAINER(menu));
3228 for (cur_item = children; cur_item != NULL; cur_item = cur_item->next) {
3229 if (cur_item->data == gtk_ui_manager_get_widget(mainwin->ui_manager, "/Menu/Message/Receive/Separator1")) {
3230 cur_item = cur_item->next;
3231 break;
3235 for (; cur_item != NULL; cur_item = cur_item->next) {
3236 gtk_widget_set_sensitive(GTK_WIDGET(cur_item->data),
3237 (main_window_get_mask(M_UNLOCKED, -1) & state) != 0);
3240 g_list_free(children);
3242 main_window_menu_callback_block(mainwin);
3244 cm_toggle_menu_set_active_full(mainwin->ui_manager, "Menu/View/ShowHide/MessageView",
3245 messageview_is_visible(mainwin->messageview));
3247 summaryview = mainwin->summaryview;
3249 switch (summaryview->sort_key) {
3250 case SORT_BY_NUMBER:
3251 menu_path = "Menu/View/Sort/Number"; break;
3252 case SORT_BY_SIZE:
3253 menu_path = "Menu/View/Sort/Size"; break;
3254 case SORT_BY_DATE:
3255 menu_path = "Menu/View/Sort/Date"; break;
3256 case SORT_BY_THREAD_DATE:
3257 menu_path = "Menu/View/Sort/ThreadDate"; break;
3258 case SORT_BY_FROM:
3259 menu_path = "Menu/View/Sort/From"; break;
3260 case SORT_BY_TO:
3261 menu_path = "Menu/View/Sort/To"; break;
3262 case SORT_BY_SUBJECT:
3263 menu_path = "Menu/View/Sort/Subject"; break;
3264 case SORT_BY_LABEL:
3265 menu_path = "Menu/View/Sort/Color"; break;
3266 case SORT_BY_MARK:
3267 menu_path = "Menu/View/Sort/Mark"; break;
3268 case SORT_BY_STATUS:
3269 menu_path = "Menu/View/Sort/Status"; break;
3270 case SORT_BY_MIME:
3271 menu_path = "Menu/View/Sort/Attachment"; break;
3272 case SORT_BY_SCORE:
3273 menu_path = "Menu/View/Sort/Score"; break;
3274 case SORT_BY_LOCKED:
3275 menu_path = "Menu/View/Sort/Locked"; break;
3276 case SORT_BY_TAGS:
3277 menu_path = "Menu/View/Sort/Tag"; break;
3278 case SORT_BY_NONE:
3279 default:
3280 menu_path = "Menu/View/Sort/DontSort"; break;
3282 cm_toggle_menu_set_active_full(mainwin->ui_manager, menu_path, TRUE);
3284 if (summaryview->sort_type == SORT_ASCENDING) {
3285 cm_toggle_menu_set_active_full(mainwin->ui_manager, "Menu/View/Sort/Ascending", TRUE);
3286 } else {
3287 cm_toggle_menu_set_active_full(mainwin->ui_manager, "Menu/View/Sort/Descending", TRUE);
3290 if (summaryview->sort_key != SORT_BY_NONE) {
3291 cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/View/Sort/Ascending", TRUE);
3292 cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/View/Sort/Descending", TRUE);
3293 } else {
3294 cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/View/Sort/Ascending", FALSE);
3295 cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/View/Sort/Descending", FALSE);
3298 if (mainwin->messageview
3299 && mainwin->messageview->mimeview
3300 && mainwin->messageview->mimeview->textview)
3301 cm_toggle_menu_set_active_full(mainwin->ui_manager, "Menu/View/AllHeaders",
3302 prefs_common.show_all_headers);
3303 cm_toggle_menu_set_active_full(mainwin->ui_manager, "Menu/View/ThreadView", (state & main_window_get_mask(M_THREADED, -1)) != 0);
3304 cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/View/ExpandThreads", (state & main_window_get_mask(M_THREADED, -1)) != 0);
3305 cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/View/CollapseThreads", (state & main_window_get_mask(M_THREADED, -1)) != 0);
3306 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);
3307 cm_toggle_menu_set_active_full(mainwin->ui_manager, "Menu/View/Quotes/CollapseAll", (prefs_common.hide_quotes == 1));
3308 cm_toggle_menu_set_active_full(mainwin->ui_manager, "Menu/View/Quotes/Collapse2", (prefs_common.hide_quotes == 2));
3309 cm_toggle_menu_set_active_full(mainwin->ui_manager, "Menu/View/Quotes/Collapse3", (prefs_common.hide_quotes == 3));
3311 if (mainwin->summaryview->folder_item && !mainwin->summaryview->folder_item->threaded)
3312 cm_toggle_menu_set_active_full(mainwin->ui_manager, "Menu/View/HideReadThreads", FALSE);
3313 if ((mainwin->summaryview->folder_item && mainwin->summaryview->folder_item->hide_read_msgs) ||
3314 quicksearch_has_sat_predicate(mainwin->summaryview->quicksearch))
3315 cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/View/HideReadThreads", FALSE);
3316 if ((mainwin->summaryview->folder_item && mainwin->summaryview->folder_item->hide_read_threads) ||
3317 quicksearch_has_sat_predicate(mainwin->summaryview->quicksearch))
3318 cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/View/HideReadMessages", FALSE);
3319 if (quicksearch_has_sat_predicate(mainwin->summaryview->quicksearch))
3320 cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/View/HideDelMessages", FALSE);
3322 cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/View/Goto/PrevHistory",
3323 messageview_nav_has_prev(mainwin->messageview));
3324 cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/View/Goto/NextHistory",
3325 messageview_nav_has_next(mainwin->messageview));
3327 if (mainwin->messageview
3328 && mainwin->messageview->mimeview)
3329 mimepart_selected = !mimeview_tree_is_empty(mainwin->messageview->mimeview);
3331 cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/File/SavePartAs", mimepart_selected);
3332 cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/View/Goto/NextPart", mimepart_selected);
3333 cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/View/Goto/PrevPart", mimepart_selected);
3334 cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/View/Part", mimepart_selected);
3335 cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/Message/CheckSignature",
3336 mimepart_selected && mainwin->messageview->mimeview->signed_part);
3338 sensitive = TRUE;
3339 if (mimepart_selected) {
3340 MimeInfo *partinfo = messageview_get_selected_mime_part(mainwin->messageview);
3342 if (partinfo && (partinfo->type == MIMETYPE_MESSAGE ||
3343 partinfo->type == MIMETYPE_IMAGE ||
3344 partinfo->type == MIMETYPE_MULTIPART)) {
3345 sensitive = FALSE;
3348 cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/View/Part/AsText", sensitive);
3350 main_window_menu_callback_unblock(mainwin);
3353 void main_create_mailing_list_menu (MainWindow *mainwin, MsgInfo *msginfo)
3355 gint is_menu = 0;
3357 if (msginfo)
3358 is_menu = mailing_list_create_submenu (mainwin, msginfo);
3359 if (is_menu)
3360 cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/Message/MailingList", TRUE);
3361 else
3362 cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/Message/MailingList", FALSE);
3365 static gint mailing_list_create_submenu (MainWindow *mainwin, MsgInfo *msginfo)
3367 gint menu_nb = 0;
3368 GtkWidget *menuitem;
3370 if (!msginfo || !msginfo->extradata) {
3371 cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/Message/MailingList/Post", FALSE);
3372 cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/Message/MailingList/Help", FALSE);
3373 cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/Message/MailingList/Subscribe", FALSE);
3374 cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/Message/MailingList/Unsubscribe", FALSE);
3375 cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/Message/MailingList/ViewArchive", FALSE);
3376 cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/Message/MailingList/ContactOwner", FALSE);
3377 return 0;
3380 /* Mailing list post */
3381 if (!g_strcmp0 (msginfo->extradata->list_post, "NO")) {
3382 g_free(msginfo->extradata->list_post);
3383 msginfo->extradata->list_post = g_strdup (_("No posting allowed"));
3385 menuitem = gtk_ui_manager_get_widget(mainwin->ui_manager, "/Menu/Message/MailingList/Post");
3387 menu_nb += mailing_list_populate_submenu (menuitem, msginfo->extradata->list_post);
3389 /* Mailing list help */
3390 menuitem = gtk_ui_manager_get_widget(mainwin->ui_manager, "/Menu/Message/MailingList/Help");
3392 menu_nb += mailing_list_populate_submenu (menuitem, msginfo->extradata->list_help);
3394 /* Mailing list subscribe */
3395 menuitem = gtk_ui_manager_get_widget(mainwin->ui_manager, "/Menu/Message/MailingList/Subscribe");
3397 menu_nb += mailing_list_populate_submenu (menuitem, msginfo->extradata->list_subscribe);
3399 /* Mailing list unsubscribe */
3400 menuitem = gtk_ui_manager_get_widget(mainwin->ui_manager, "/Menu/Message/MailingList/Unsubscribe");
3402 menu_nb += mailing_list_populate_submenu (menuitem, msginfo->extradata->list_unsubscribe);
3404 /* Mailing list view archive */
3405 menuitem = gtk_ui_manager_get_widget(mainwin->ui_manager, "/Menu/Message/MailingList/ViewArchive");
3407 menu_nb += mailing_list_populate_submenu (menuitem, msginfo->extradata->list_archive);
3409 /* Mailing list contact owner */
3410 menuitem = gtk_ui_manager_get_widget(mainwin->ui_manager, "/Menu/Message/MailingList/ContactOwner");
3412 menu_nb += mailing_list_populate_submenu (menuitem, msginfo->extradata->list_owner);
3414 return menu_nb;
3417 static gint mailing_list_populate_submenu (GtkWidget *menuitem, const gchar * list_header)
3419 GtkWidget *item, *menu;
3420 const gchar *url_pt ;
3421 gchar url_decoded[BUFFSIZE];
3422 GList *children, *amenu;
3423 gint menu_nb = 0;
3425 menu = gtk_menu_item_get_submenu(GTK_MENU_ITEM(menuitem));
3427 /* First delete old submenu */
3428 /* FIXME: we can optimize this, and only change/add/delete necessary items */
3429 children = gtk_container_get_children(GTK_CONTAINER(menu));
3430 for (amenu = children; amenu; amenu = amenu->next) {
3431 item = GTK_WIDGET (amenu->data);
3432 gtk_widget_destroy (item);
3434 g_list_free(children);
3435 if (list_header) {
3436 for (url_pt = list_header; url_pt && *url_pt;) {
3437 get_url_part (&url_pt, url_decoded);
3438 item = NULL;
3439 if (!g_ascii_strncasecmp(url_decoded, "mailto:", 7)) {
3440 item = cm_menu_item_new_label_from_url ((url_decoded));
3441 g_signal_connect(G_OBJECT(item), "activate",
3442 G_CALLBACK(mailing_list_compose),
3443 NULL);
3445 else if (!g_ascii_strncasecmp(url_decoded, "http:", 5) ||
3446 !g_ascii_strncasecmp(url_decoded, "https:",6)) {
3448 item = cm_menu_item_new_label_from_url ((url_decoded));
3449 g_signal_connect(G_OBJECT(item), "activate",
3450 G_CALLBACK(mailing_list_open_uri),
3451 NULL);
3453 if (item) {
3454 gtk_menu_shell_append(GTK_MENU_SHELL(menu), item);
3455 gtk_widget_show (item);
3456 menu_nb++;
3460 if (menu_nb)
3461 gtk_widget_set_sensitive (menuitem, TRUE);
3462 else
3463 gtk_widget_set_sensitive (menuitem, FALSE);
3466 return menu_nb;
3469 static void get_url_part (const gchar **buffer, gchar *url_decoded)
3471 gchar tmp[BUFFSIZE];
3472 const gchar *buf;
3473 gint i = 0;
3474 buf = *buffer;
3475 gboolean with_plus = TRUE;
3477 if (buf == 0x00) {
3478 *url_decoded = '\0';
3479 *buffer = NULL;
3480 return;
3482 /* Ignore spaces, comments and tabs () */
3483 for (;*buf == ' ' || *buf == '(' || *buf == '\t'; buf++)
3484 if (*buf == '(')
3485 for (;*buf != ')' && *buf != 0x00; buf++);
3487 /* First non space and non comment must be a < */
3488 if (*buf =='<' ) {
3489 buf++;
3490 if (!strncmp(buf, "mailto:", strlen("mailto:")))
3491 with_plus = FALSE;
3492 for (i = 0;
3493 *buf != '>' && *buf != 0x00 && i < BUFFSIZE;
3494 tmp[i++] = *(buf++));
3495 if (*buf == 0) {
3496 *buffer = NULL;
3497 *url_decoded = '\0';
3498 return;
3500 buf++;
3502 else {
3503 *buffer = NULL;
3504 *url_decoded = '\0';
3505 return;
3508 *url_decoded = '\0';
3509 *buffer = NULL;
3511 if (i == BUFFSIZE) {
3512 return;
3514 tmp[i] = 0x00;
3515 decode_uri_with_plus (url_decoded, (const gchar *)tmp, with_plus);
3517 /* Prepare the work for the next url in the list */
3518 /* after the closing bracket >, ignore space, comments and tabs */
3519 for (;buf && *buf && (*buf == ' ' || *buf == '(' || *buf == '\t'); buf++)
3520 if (*buf == '(')
3521 for (;*buf != ')' && *buf != 0x00; buf++);
3523 if (!buf || !*buf) {
3524 *buffer = NULL;
3525 return;
3528 /* now first non space, non comment must be a comma */
3529 if (*buf != ',')
3530 for (;*buf != 0x00; buf++);
3531 else
3532 buf++;
3533 *buffer = buf;
3536 static void mailing_list_compose (GtkWidget *w, gpointer *data)
3538 const gchar *mailto;
3539 PrefsAccount *account = NULL;
3540 FolderItem *folder_item = NULL;
3542 mailto = gtk_label_get_text(GTK_LABEL (gtk_bin_get_child(GTK_BIN((w)))));
3543 if (mainwindow_get_mainwindow()) {
3544 folder_item = mainwindow_get_mainwindow()->summaryview->folder_item;
3545 if (folder_item && folder_item->prefs && folder_item->prefs->enable_default_account)
3546 account = account_find_from_id(folder_item->prefs->default_account);
3547 if (folder_item && !account)
3548 account = account_find_from_item(folder_item);
3550 if (mailto)
3551 compose_new_with_folderitem(account, folder_item, mailto+7);
3554 static void mailing_list_open_uri (GtkWidget *w, gpointer *data)
3557 const gchar *mailto;
3559 mailto = gtk_label_get_text(GTK_LABEL (gtk_bin_get_child(GTK_BIN((w)))));
3560 if (mailto)
3561 open_uri (mailto, prefs_common_get_uri_cmd());
3564 static void fix_folderview_scroll(MainWindow *mainwin)
3566 static gboolean fix_done = FALSE;
3568 if (fix_done)
3569 return;
3571 gtk_widget_queue_resize(mainwin->folderview->ctree);
3573 fix_done = TRUE;
3576 void main_window_popup(MainWindow *mainwin)
3578 static gboolean first_start = TRUE;
3580 if (!gtk_widget_get_visible(GTK_WIDGET(mainwin->window)))
3581 main_window_show(mainwin);
3583 if (prefs_common.mainwin_maximised)
3584 gtk_window_maximize(GTK_WINDOW(mainwin->window));
3586 if (first_start) {
3587 first_start = FALSE;
3588 } else {
3589 gtkut_window_popup(mainwin->window);
3592 if (prefs_common.layout_mode == SMALL_LAYOUT) {
3593 if (mainwin->in_folder) {
3594 mainwindow_enter_folder(mainwin);
3595 } else {
3596 mainwindow_exit_folder(mainwin);
3599 fix_folderview_scroll(mainwin);
3602 void main_window_show(MainWindow *mainwin)
3604 gtk_widget_show(mainwin->window);
3605 gtk_widget_show(mainwin->vbox_body);
3606 #ifndef GENERIC_UMPC
3607 gtk_window_move(GTK_WINDOW(mainwin->window),
3608 prefs_common.mainwin_x,
3609 prefs_common.mainwin_y);
3610 #endif
3613 void main_window_hide(MainWindow *mainwin)
3615 main_window_get_size(mainwin);
3616 main_window_get_position(mainwin);
3618 gtk_widget_hide(mainwin->window);
3619 gtk_widget_hide(mainwin->vbox_body);
3622 static void main_window_set_widgets(MainWindow *mainwin, LayoutType layout_mode)
3624 GtkWidget *folderwin = NULL;
3625 GtkWidget *messagewin = NULL;
3626 GtkWidget *hpaned;
3627 GtkWidget *vpaned;
3628 GtkWidget *vbox_body = mainwin->vbox_body;
3629 gboolean first_set = (mainwin->hpaned == NULL);
3630 debug_print("Setting widgets...\n");
3632 #ifndef GENERIC_UMPC
3633 mainwin->messageview->statusbar = mainwin->statusbar;
3634 mainwin->messageview->statusbar_cid = mainwin->messageview_cid;
3635 #endif
3636 /* clean top-most container */
3637 if (mainwin->hpaned) {
3638 if (gtk_widget_get_parent(mainwin->hpaned) == mainwin->vpaned)
3639 gtk_widget_destroy(mainwin->vpaned);
3640 else
3641 gtk_widget_destroy(mainwin->hpaned);
3644 cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/View/ShowHide/MessageView",
3645 (layout_mode != WIDE_MSGLIST_LAYOUT && layout_mode != SMALL_LAYOUT));
3646 switch (layout_mode) {
3647 case VERTICAL_LAYOUT:
3648 case NORMAL_LAYOUT:
3649 case SMALL_LAYOUT:
3650 hpaned = gtk_paned_new(GTK_ORIENTATION_HORIZONTAL);
3651 if (layout_mode == VERTICAL_LAYOUT)
3652 vpaned = gtk_paned_new(GTK_ORIENTATION_HORIZONTAL);
3653 else
3654 vpaned = gtk_paned_new(GTK_ORIENTATION_VERTICAL);
3655 gtk_box_pack_start(GTK_BOX(vbox_body), hpaned, TRUE, TRUE, 0);
3656 gtk_paned_add1(GTK_PANED(hpaned),
3657 GTK_WIDGET_PTR(mainwin->folderview));
3658 gtk_widget_show(hpaned);
3660 if (messageview_is_visible(mainwin->messageview)) {
3661 gtk_paned_add2(GTK_PANED(hpaned), vpaned);
3662 gtk_paned_pack1(GTK_PANED(vpaned),
3663 GTK_WIDGET_PTR(mainwin->summaryview), TRUE, TRUE);
3664 } else {
3665 gtk_paned_add2(GTK_PANED(hpaned),
3666 GTK_WIDGET_PTR(mainwin->summaryview));
3667 g_object_ref(vpaned);
3669 gtk_paned_add2(GTK_PANED(vpaned),
3670 GTK_WIDGET_PTR(mainwin->messageview));
3671 gtk_widget_show(vpaned);
3672 if (layout_mode == SMALL_LAYOUT && first_set) {
3673 mainwin_paned_show_first(GTK_PANED(hpaned));
3676 gtk_paned_set_position(GTK_PANED(hpaned),
3677 prefs_common_get_prefs()->folderview_width);
3679 if (layout_mode == NORMAL_LAYOUT &&
3680 messageview_is_visible(mainwin->messageview)) {
3681 gtk_paned_set_position(GTK_PANED(vpaned),
3682 prefs_common_get_prefs()->summaryview_height);
3684 if (layout_mode == VERTICAL_LAYOUT &&
3685 messageview_is_visible(mainwin->messageview)) {
3686 gtk_paned_set_position(GTK_PANED(vpaned),
3687 prefs_common_get_prefs()->summaryview_width);
3690 break;
3691 case WIDE_LAYOUT:
3692 vpaned = gtk_paned_new(GTK_ORIENTATION_VERTICAL);
3693 hpaned = gtk_paned_new(GTK_ORIENTATION_HORIZONTAL);
3694 gtk_box_pack_start(GTK_BOX(vbox_body), vpaned, TRUE, TRUE, 0);
3695 gtk_paned_add1(GTK_PANED(vpaned), hpaned);
3697 gtk_paned_add1(GTK_PANED(hpaned),
3698 GTK_WIDGET_PTR(mainwin->folderview));
3699 gtk_paned_add2(GTK_PANED(hpaned),
3700 GTK_WIDGET_PTR(mainwin->summaryview));
3702 gtk_widget_show(hpaned);
3704 if (messageview_is_visible(mainwin->messageview)) {
3705 gtk_paned_add2(GTK_PANED(vpaned),
3706 GTK_WIDGET_PTR(mainwin->messageview));
3707 } else {
3708 g_object_ref(GTK_WIDGET_PTR(mainwin->messageview));
3710 gtk_widget_show(vpaned);
3712 gtk_paned_set_position(GTK_PANED(hpaned),
3713 prefs_common_get_prefs()->folderview_width);
3715 if (messageview_is_visible(mainwin->messageview)) {
3716 gtk_paned_set_position(GTK_PANED(vpaned),
3717 prefs_common_get_prefs()->summaryview_height);
3720 break;
3721 case WIDE_MSGLIST_LAYOUT:
3722 vpaned = gtk_paned_new(GTK_ORIENTATION_VERTICAL);
3723 hpaned = gtk_paned_new(GTK_ORIENTATION_HORIZONTAL);
3724 gtk_box_pack_start(GTK_BOX(vbox_body), vpaned, TRUE, TRUE, 0);
3726 gtk_paned_add1(GTK_PANED(vpaned),
3727 GTK_WIDGET_PTR(mainwin->summaryview));
3728 gtk_paned_add1(GTK_PANED(hpaned),
3729 GTK_WIDGET_PTR(mainwin->folderview));
3731 gtk_widget_show(hpaned);
3733 if (messageview_is_visible(mainwin->messageview)) {
3734 gtk_paned_add2(GTK_PANED(hpaned),
3735 GTK_WIDGET_PTR(mainwin->messageview));
3736 } else {
3737 g_object_ref(GTK_WIDGET_PTR(mainwin->messageview));
3739 gtk_paned_add2(GTK_PANED(vpaned), hpaned);
3740 gtk_widget_show(vpaned);
3742 gtk_paned_set_position(GTK_PANED(hpaned),
3743 prefs_common_get_prefs()->folderview_width);
3744 gtk_paned_set_position(GTK_PANED(vpaned),
3745 prefs_common_get_prefs()->summaryview_height);
3747 break;
3748 default:
3749 g_warning("unknown layout");
3750 return;
3753 mainwin->hpaned = hpaned;
3754 mainwin->vpaned = vpaned;
3756 if (layout_mode == SMALL_LAYOUT) {
3757 if (mainwin->messageview->visible)
3758 main_window_toggle_message_view(mainwin);
3761 if (layout_mode == SMALL_LAYOUT && first_set) {
3762 gtk_widget_realize(mainwin->window);
3763 gtk_widget_realize(mainwin->folderview->ctree);
3764 gtk_widget_realize(mainwin->summaryview->hbox);
3765 gtk_widget_realize(mainwin->summaryview->hbox_l);
3766 gtk_paned_set_position(GTK_PANED(mainwin->hpaned), 800);
3767 } else {
3768 gtk_window_set_default_size(GTK_WINDOW(mainwin->window),
3769 prefs_common.mainwin_width,
3770 prefs_common.mainwin_height);
3772 /* remove headerview if not in prefs */
3773 headerview_set_visibility(mainwin->messageview->headerview,
3774 prefs_common.display_header_pane);
3776 if (messageview_is_visible(mainwin->messageview))
3777 gtk_image_set_from_icon_name(GTK_IMAGE(mainwin->summaryview->toggle_arrow),
3778 "pan-down-symbolic", GTK_ICON_SIZE_MENU);
3779 else
3780 gtk_image_set_from_icon_name(GTK_IMAGE(mainwin->summaryview->toggle_arrow),
3781 "pan-up-symbolic", GTK_ICON_SIZE_MENU);
3783 gtk_window_move(GTK_WINDOW(mainwin->window),
3784 prefs_common.mainwin_x,
3785 prefs_common.mainwin_y);
3787 /* CLAWS: previous "gtk_widget_show_all" makes noticeview
3788 * and mimeview icon list/ctree lose track of their visibility states */
3789 if (!noticeview_is_visible(mainwin->messageview->noticeview))
3790 gtk_widget_hide(GTK_WIDGET_PTR(mainwin->messageview->noticeview));
3791 if (!noticeview_is_visible(mainwin->messageview->mimeview->siginfoview))
3792 gtk_widget_hide(GTK_WIDGET_PTR(mainwin->messageview->mimeview->siginfoview));
3793 if (mainwin->messageview->mimeview->ctree_mode)
3794 gtk_widget_hide(mainwin->messageview->mimeview->icon_mainbox);
3795 else
3796 gtk_widget_hide(mainwin->messageview->mimeview->ctree_mainbox);
3798 prefs_common.layout_mode = layout_mode;
3800 cm_toggle_menu_set_active_full(mainwin->ui_manager, "Menu/View/ShowHide/MessageView",
3801 messageview_is_visible(mainwin->messageview));
3803 #ifndef GENERIC_UMPC
3804 switch (prefs_common.layout_mode) {
3805 case NORMAL_LAYOUT:
3806 cm_toggle_menu_set_active_full(mainwin->ui_manager, "Menu/View/Layout/Standard", TRUE);
3807 break;
3808 case VERTICAL_LAYOUT:
3809 cm_toggle_menu_set_active_full(mainwin->ui_manager, "Menu/View/Layout/ThreeColumns", TRUE);
3810 break;
3811 case WIDE_LAYOUT:
3812 cm_toggle_menu_set_active_full(mainwin->ui_manager, "Menu/View/Layout/WideMessage", TRUE);
3813 break;
3814 case WIDE_MSGLIST_LAYOUT:
3815 cm_toggle_menu_set_active_full(mainwin->ui_manager, "Menu/View/Layout/WideMessageList", TRUE);
3816 break;
3817 case SMALL_LAYOUT:
3818 cm_toggle_menu_set_active_full(mainwin->ui_manager, "Menu/View/Layout/SmallScreen", TRUE);
3819 break;
3821 #endif
3823 if (folderwin) {
3824 g_signal_connect
3825 (G_OBJECT(folderwin), "size_allocate",
3826 G_CALLBACK(folder_window_size_allocate_cb),
3827 mainwin);
3829 if (messagewin) {
3830 g_signal_connect
3831 (G_OBJECT(messagewin), "size_allocate",
3832 G_CALLBACK(message_window_size_allocate_cb),
3833 mainwin);
3836 debug_print("Setting widgets done.\n");
3839 void main_window_destroy_all(void)
3841 while (mainwin_list != NULL) {
3842 MainWindow *mainwin = (MainWindow*)mainwin_list->data;
3844 /* free toolbar stuff */
3845 toolbar_clear_list(TOOLBAR_MAIN);
3846 toolbar_destroy(mainwin->toolbar);
3848 summaryview_destroy(mainwin->summaryview);
3849 mainwin->folderview->mainwin = NULL;
3850 mainwin->summaryview->mainwin = NULL;
3851 mainwin->messageview->mainwin = NULL;
3853 g_free(mainwin->toolbar);
3854 mainwin_list = g_list_remove(mainwin_list, mainwin);
3855 g_free(mainwin);
3857 g_list_free(mainwin_list);
3858 mainwin_list = NULL;
3861 #ifndef GENERIC_UMPC
3862 static gboolean ac_label_button_pressed(GtkWidget *widget, GdkEventButton *event,
3863 gpointer data)
3865 MainWindow *mainwin = (MainWindow *)data;
3866 GtkWidget *menu = NULL;
3868 if (!event) return FALSE;
3870 gtk_button_set_relief(GTK_BUTTON(widget), GTK_RELIEF_NORMAL);
3872 menu = gtk_menu_item_get_submenu(GTK_MENU_ITEM(mainwin->ac_menu));
3874 gtk_menu_popup_at_widget(GTK_MENU(menu), widget, 3, 3, NULL);
3876 return TRUE;
3878 #endif
3879 static gint main_window_close_cb(GtkWidget *widget, GdkEventAny *event,
3880 gpointer data)
3882 MainWindow *mainwin = (MainWindow *)data;
3883 gboolean close_allowed = TRUE;
3885 hooks_invoke(MAIN_WINDOW_CLOSE, &close_allowed);
3887 if (close_allowed && mainwin->lock_count == 0)
3888 app_exit_cb(NULL, data);
3890 return TRUE;
3893 static void main_window_size_allocate_cb(GtkWidget *widget,
3894 GtkAllocation *allocation,
3895 gpointer data)
3897 MainWindow *mainwin = (MainWindow *)data;
3898 main_window_get_size(mainwin);
3901 static void folder_window_size_allocate_cb(GtkWidget *widget,
3902 GtkAllocation *allocation,
3903 gpointer data)
3905 MainWindow *mainwin = (MainWindow *)data;
3907 main_window_get_size(mainwin);
3910 static void message_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 add_mailbox_cb(GtkAction *action, gpointer data)
3921 MainWindow *mainwin = (MainWindow *)data;
3922 main_window_add_mailbox(mainwin);
3925 static void update_folderview_cb(GtkAction *action, gpointer data)
3927 MainWindow *mainwin = (MainWindow *)data;
3928 summary_show(mainwin->summaryview, NULL, FALSE);
3929 folderview_check_new_all();
3932 static void foldersort_cb(GtkAction *action, gpointer data)
3934 foldersort_open();
3937 static void import_mbox_cb(GtkAction *action, gpointer data)
3939 MainWindow *mainwin = (MainWindow *)data;
3940 /* only notify if import has failed */
3941 if (import_mbox(mainwin->summaryview->folder_item, NULL) == -1) {
3942 alertpanel_error(_("Mbox import has failed."));
3946 static void export_mbox_cb(GtkAction *action, gpointer data)
3948 MainWindow *mainwin = (MainWindow *)data;
3949 /* only notify if export has failed */
3950 if (export_mbox(mainwin->summaryview->folder_item) == -1) {
3951 alertpanel_error(_("Export to mbox has failed."));
3955 static void export_list_mbox_cb(GtkAction *action, gpointer data)
3957 MainWindow *mainwin = (MainWindow *)data;
3958 /* only notify if export has failed */
3959 if (summaryview_export_mbox_list(mainwin->summaryview) == -1) {
3960 alertpanel_error(_("Export to mbox has failed."));
3964 static void empty_trash_cb(GtkAction *action, gpointer data)
3966 MainWindow *mainwin = (MainWindow *)data;
3967 main_window_empty_trash(mainwin, TRUE, FALSE);
3970 static void save_as_cb(GtkAction *action, gpointer data)
3972 MainWindow *mainwin = (MainWindow *)data;
3973 summary_save_as(mainwin->summaryview);
3976 static void print_cb(GtkAction *action, gpointer data)
3978 MainWindow *mainwin = (MainWindow *)data;
3979 summary_print(mainwin->summaryview);
3982 static void page_setup_cb(GtkAction *action, gpointer data)
3984 MainWindow *mainwin = (MainWindow *)data;
3985 GtkWindow *win;
3987 win = (mainwin ? GTK_WINDOW(mainwin->window) : NULL);
3989 printing_page_setup(win);
3992 static void app_exit_cb(GtkAction *action, gpointer data)
3994 MainWindow *mainwin = (MainWindow *)data;
3995 if (prefs_common.clean_on_exit) {
3996 if (!main_window_empty_trash(mainwin, prefs_common.ask_on_clean, TRUE))
3997 return;
4000 if (prefs_common.confirm_on_exit) {
4001 if (alertpanel(_("Exit"), _("Exit Claws Mail?"),
4002 NULL, _("_Cancel"), NULL, _("_Quit"),
4003 NULL, NULL, ALERTFOCUS_FIRST)
4004 != G_ALERTALTERNATE)
4005 return;
4006 manage_window_focus_in(mainwin->window, NULL, NULL);
4009 app_will_exit(NULL, mainwin);
4012 static void search_cb(GtkAction *action, gpointer data)
4014 MainWindow *mainwin = (MainWindow *)data;
4015 message_search(mainwin->messageview);
4018 static void search_folder_cb(GtkAction *action, gpointer data)
4020 MainWindow *mainwin = (MainWindow *)data;
4021 FolderItem *item = mainwin->summaryview->folder_item;
4022 cm_return_if_fail(item != NULL);
4023 summary_search(mainwin->summaryview);
4026 static void mainwindow_quicksearch(GtkAction *action, gpointer data)
4028 MainWindow *mainwin = (MainWindow *)data;
4029 summaryview_activate_quicksearch(mainwin->summaryview, TRUE);
4032 static void toggle_message_cb(GtkAction *action, gpointer data)
4034 MainWindow *mainwin = (MainWindow *)data;
4035 gboolean active;
4037 active = gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (action));
4039 if (active != messageview_is_visible(mainwin->messageview))
4040 summary_toggle_view(mainwin->summaryview);
4043 static void toggle_toolbar_cb(GtkAction *action, GtkRadioAction *current, gpointer data)
4045 gint value = gtk_radio_action_get_current_value (GTK_RADIO_ACTION (current));
4046 MainWindow *mainwin = (MainWindow *)data;
4047 toolbar_toggle(value, mainwin);
4050 static void main_window_reply_cb(GtkAction *gaction, gpointer data)
4052 MainWindow *mainwin = (MainWindow *)data;
4053 MessageView *msgview = (MessageView*)mainwin->messageview;
4054 GSList *msginfo_list = NULL;
4055 gint action = COMPOSE_REPLY;
4056 const gchar *a_name = gtk_action_get_name(gaction);
4058 DO_ACTION("Message/Reply", COMPOSE_REPLY);
4059 DO_ACTION("Message/ReplyTo/All", COMPOSE_REPLY_TO_ALL);
4060 DO_ACTION("Message/ReplyTo/Sender", COMPOSE_REPLY_TO_SENDER);
4061 DO_ACTION("Message/ReplyTo/List", COMPOSE_REPLY_TO_LIST);
4062 DO_ACTION("Message/Forward", COMPOSE_FORWARD_INLINE);
4063 DO_ACTION("Message/ForwardAtt", COMPOSE_FORWARD_AS_ATTACH);
4064 DO_ACTION("Message/Redirect", COMPOSE_REDIRECT);
4065 DO_ACTION("Message/FollowupReply", COMPOSE_FOLLOWUP_AND_REPLY_TO);
4067 cm_return_if_fail(msgview != NULL);
4069 msginfo_list = summary_get_selection(mainwin->summaryview);
4070 cm_return_if_fail(msginfo_list != NULL);
4072 if (!summary_has_opened_message(mainwin->summaryview)) {
4073 compose_reply_from_messageview(NULL, msginfo_list, action);
4074 } else if (summary_is_opened_message_selected(mainwin->summaryview)) {
4075 compose_reply_from_messageview(msgview, msginfo_list, action);
4076 } else {
4077 compose_reply_from_messageview(msgview, NULL, action);
4080 g_slist_free(msginfo_list);
4083 static void toggle_col_headers_cb(GtkAction *gaction, gpointer data)
4085 MainWindow *mainwin = (MainWindow *)data;
4086 FolderView *folderview = mainwin->folderview;
4087 SummaryView *summaryview = mainwin->summaryview;
4088 MimeView *mimeview = mainwin->messageview->mimeview;
4090 if (gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (gaction))) {
4091 gtk_cmclist_column_titles_show(GTK_CMCLIST(folderview->ctree));
4092 gtk_cmclist_column_titles_show(GTK_CMCLIST(summaryview->ctree));
4093 gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(mimeview->ctree), TRUE);
4094 prefs_common.show_col_headers = TRUE;
4095 } else {
4096 gtk_cmclist_column_titles_hide(GTK_CMCLIST(folderview->ctree));
4097 gtk_cmclist_column_titles_hide(GTK_CMCLIST(summaryview->ctree));
4098 gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(mimeview->ctree), FALSE);
4099 prefs_common.show_col_headers = FALSE;
4103 #ifndef GENERIC_UMPC
4104 static void toggle_statusbar_cb(GtkAction *gaction, gpointer data)
4106 MainWindow *mainwin = (MainWindow *)data;
4107 if (gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (gaction))) {
4108 gtk_widget_show(mainwin->hbox_stat);
4109 prefs_common.show_statusbar = TRUE;
4110 } else {
4111 gtk_widget_hide(mainwin->hbox_stat);
4112 prefs_common.show_statusbar = FALSE;
4116 static void set_layout_cb(GtkAction *action, GtkRadioAction *current, gpointer data)
4118 MainWindow *mainwin = (MainWindow *)data;
4119 gint value = gtk_radio_action_get_current_value (GTK_RADIO_ACTION (current));
4120 LayoutType layout_mode = value;
4121 LayoutType old_layout_mode = prefs_common.layout_mode;
4122 if (mainwin->menu_lock_count) {
4123 return;
4125 if (!gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (current))) {
4126 return;
4129 if (layout_mode == prefs_common.layout_mode) {
4130 return;
4133 if (!mainwin->messageview->visible && layout_mode != SMALL_LAYOUT)
4134 main_window_toggle_message_view(mainwin);
4135 else if (mainwin->messageview->visible && layout_mode == SMALL_LAYOUT)
4136 main_window_toggle_message_view(mainwin);
4138 main_window_separation_change(mainwin, layout_mode);
4139 mainwindow_reset_paned(GTK_PANED(mainwin->vpaned));
4140 if (old_layout_mode == SMALL_LAYOUT && layout_mode != SMALL_LAYOUT) {
4141 mainwindow_reset_paned(GTK_PANED(mainwin->hpaned));
4142 if (layout_mode == VERTICAL_LAYOUT)
4143 mainwindow_reset_paned(GTK_PANED(mainwin->vpaned));
4145 if (old_layout_mode != SMALL_LAYOUT && layout_mode == SMALL_LAYOUT) {
4146 mainwin_paned_show_first(GTK_PANED(mainwin->hpaned));
4147 mainwindow_exit_folder(mainwin);
4149 summary_relayout(mainwin->summaryview);
4150 summary_update_unread(mainwin->summaryview, NULL);
4152 #endif
4154 void main_window_toggle_work_offline (MainWindow *mainwin, gboolean offline,
4155 gboolean ask_sync)
4157 static gboolean switching = FALSE;
4159 if (switching)
4160 return;
4162 switching = TRUE;
4164 offline_ask_sync = ask_sync;
4165 if (offline)
4166 online_switch_clicked (GTK_BUTTON(mainwin->online_switch), mainwin);
4167 else
4168 online_switch_clicked (GTK_BUTTON(mainwin->offline_switch), mainwin);
4169 offline_ask_sync = TRUE;
4171 inc_reset_offline_override_timers();
4173 switching = FALSE;
4176 static void toggle_work_offline_cb (GtkAction *action, gpointer data)
4178 MainWindow *mainwin = (MainWindow *)data;
4179 main_window_toggle_work_offline(mainwin, gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (action)), TRUE);
4182 static gboolean any_folder_want_synchronise(void)
4184 GList *folderlist = folder_get_list();
4186 /* see if there are synchronised folders */
4187 for (; folderlist; folderlist = folderlist->next) {
4188 Folder *folder = (Folder *)folderlist->data;
4189 if (folder_want_synchronise(folder)) {
4190 return TRUE;
4194 return FALSE;
4197 static void mainwindow_check_synchronise(MainWindow *mainwin, gboolean ask)
4200 if (!any_folder_want_synchronise())
4201 return;
4203 if (offline_ask_sync && ask && alertpanel(_("Folder synchronisation"),
4204 _("Do you want to synchronise your folders now?"),
4205 NULL, _("_Cancel"), NULL, _("_Synchronise"), NULL, NULL,
4206 ALERTFOCUS_SECOND) != G_ALERTALTERNATE)
4207 return;
4209 if (offline_ask_sync)
4210 folder_synchronise(NULL);
4213 static void online_switch_clicked (GtkButton *btn, gpointer data)
4215 MainWindow *mainwin;
4216 gboolean have_connectivity;
4218 #ifdef HAVE_NETWORKMANAGER_SUPPORT
4219 have_connectivity = networkmanager_is_online(NULL);
4220 #else
4221 have_connectivity = TRUE;
4222 #endif
4224 mainwin = (MainWindow *) data;
4226 cm_return_if_fail(mainwin != NULL);
4228 if (btn == GTK_BUTTON(mainwin->online_switch)) {
4229 #ifndef GENERIC_UMPC
4230 gtk_widget_hide (mainwin->online_switch);
4231 gtk_widget_show (mainwin->offline_switch);
4232 #endif
4233 cm_toggle_menu_set_active_full(mainwin->ui_manager, "Menu/File/OfflineMode", TRUE);
4235 inc_autocheck_timer_remove();
4237 /* go offline */
4238 if (prefs_common.work_offline)
4239 return;
4241 if(have_connectivity)
4242 mainwindow_check_synchronise(mainwin, TRUE);
4243 prefs_common.work_offline = TRUE;
4244 imap_disconnect_all(have_connectivity);
4245 nntp_disconnect_all(have_connectivity);
4246 hooks_invoke(OFFLINE_SWITCH_HOOKLIST, NULL);
4247 } else {
4248 /*go online */
4249 if (!prefs_common.work_offline)
4250 return;
4251 #ifndef GENERIC_UMPC
4252 gtk_widget_hide (mainwin->offline_switch);
4253 gtk_widget_show (mainwin->online_switch);
4254 #endif
4255 cm_toggle_menu_set_active_full(mainwin->ui_manager, "Menu/File/OfflineMode", FALSE);
4256 prefs_common.work_offline = FALSE;
4257 inc_autocheck_timer_set();
4258 refresh_resolvers();
4259 hooks_invoke(OFFLINE_SWITCH_HOOKLIST, NULL);
4263 static void addressbook_open_cb(GtkAction *action, gpointer data)
4265 #ifndef USE_ALT_ADDRBOOK
4266 addressbook_open(NULL);
4267 #else
4268 GError* error = NULL;
4270 addressbook_dbus_open(FALSE, &error);
4271 if (error) {
4272 g_warning("failed to open address book: %s", error->message);
4273 g_error_free(error);
4275 #endif
4278 static void log_window_show_cb(GtkAction *action, gpointer data)
4280 MainWindow *mainwin = (MainWindow *)data;
4281 log_window_show(mainwin->logwin);
4284 static void filtering_debug_window_show_cb(GtkAction *action, gpointer data)
4286 MainWindow *mainwin = (MainWindow *)data;
4287 log_window_show(mainwin->filtering_debugwin);
4290 #ifdef G_OS_WIN32
4291 static void debug_log_show_cb(GtkAction *action, gpointer data)
4293 GError *error = NULL;
4294 gchar *logpath8 = win32_debug_log_path();
4295 gunichar2 *logpath16;
4297 debug_print("opening '%s'\n", logpath8);
4299 logpath16 = g_utf8_to_utf16(logpath8, -1, NULL, NULL, &error);
4301 if (error != NULL) {
4302 g_warning("couldn't convert debug log path '%s' to UTF-16: %s",
4303 logpath8, error->message);
4304 g_error_free(error);
4305 g_free(logpath16);
4306 return;
4309 HINSTANCE ret = ShellExecute(NULL, NULL, (LPCWSTR)logpath16,
4310 NULL, NULL, SW_SHOW);
4312 g_free(logpath8);
4313 g_free(logpath16);
4314 debug_print("ShellExecute result: %"G_GSIZE_FORMAT"\n", (gsize)ret);
4316 #endif
4318 static void inc_cancel_cb(GtkAction *action, gpointer data)
4320 inc_cancel_all();
4321 imap_cancel_all();
4324 static void send_cancel_cb(GtkAction *action, gpointer data)
4326 send_cancel();
4329 static void move_to_cb(GtkAction *action, gpointer data)
4331 MainWindow *mainwin = (MainWindow *)data;
4332 summary_move_to(mainwin->summaryview);
4335 static void copy_to_cb(GtkAction *action, gpointer data)
4337 MainWindow *mainwin = (MainWindow *)data;
4338 summary_copy_to(mainwin->summaryview);
4341 static void delete_cb(GtkAction *action, gpointer data)
4343 MainWindow *mainwin = (MainWindow *)data;
4344 summary_delete(mainwin->summaryview);
4347 static void delete_trash_cb(GtkAction *action, gpointer data)
4349 MainWindow *mainwin = (MainWindow *)data;
4350 summary_delete_trash(mainwin->summaryview);
4353 static void cancel_cb(GtkAction *action, gpointer data)
4355 MainWindow *mainwin = (MainWindow *)data;
4356 summary_cancel(mainwin->summaryview);
4359 static void open_msg_cb(GtkAction *action, gpointer data)
4361 MainWindow *mainwin = (MainWindow *)data;
4362 summary_open_msg(mainwin->summaryview);
4365 static void view_source_cb(GtkAction *action, gpointer data)
4367 MainWindow *mainwin = (MainWindow *)data;
4368 summary_view_source(mainwin->summaryview);
4371 static void show_all_header_cb(GtkAction *action, gpointer data)
4373 MainWindow *mainwin = (MainWindow *)data;
4374 if (mainwin->menu_lock_count) return;
4375 prefs_common.show_all_headers =
4376 gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (action));
4377 summary_display_msg_selected(mainwin->summaryview,
4378 gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (action)));
4381 static void toggle_fullscreen_cb(GtkAction *action, gpointer data)
4383 MainWindow *mainwin = (MainWindow *)data;
4384 if (mainwin->menu_lock_count) return;
4385 if (!gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (action))) {
4386 gtk_window_unfullscreen(GTK_WINDOW(mainwin->window));
4387 prefs_common.mainwin_fullscreen = FALSE;
4389 else {
4390 prefs_common.mainwin_fullscreen = TRUE;
4391 gtk_window_fullscreen(GTK_WINDOW(mainwin->window));
4395 static void toggle_menubar_cb(GtkAction *action, gpointer data)
4397 MainWindow *mainwin = (MainWindow *)data;
4398 if (mainwin->menu_lock_count) return;
4399 if (!gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (action))) {
4400 gtk_widget_hide(GTK_WIDGET(mainwin->menubar));
4401 prefs_common.mainwin_menubar = FALSE;
4402 } else {
4403 gtk_widget_show(GTK_WIDGET(mainwin->menubar));
4404 prefs_common.mainwin_menubar = TRUE;
4408 static void hide_quotes_cb(GtkAction *action, gpointer data)
4410 MainWindow *mainwin = (MainWindow *)data;
4412 if (mainwin->menu_lock_count) return;
4414 if (gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (action))) {
4415 const gchar *a_name = gtk_action_get_name(GTK_ACTION(action));
4416 if (!strcmp(a_name, "View/Quotes/CollapseAll")) prefs_common.hide_quotes = 1;
4417 else if (!strcmp(a_name, "View/Quotes/Collapse2")) prefs_common.hide_quotes = 2;
4418 else if (!strcmp(a_name, "View/Quotes/Collapse3")) prefs_common.hide_quotes = 3;
4419 } else
4420 prefs_common.hide_quotes = 0;
4422 mainwin->menu_lock_count++;
4423 cm_toggle_menu_set_active_full(mainwin->ui_manager, "Menu/View/Quotes/CollapseAll", (prefs_common.hide_quotes == 1));
4424 cm_toggle_menu_set_active_full(mainwin->ui_manager, "Menu/View/Quotes/Collapse2", (prefs_common.hide_quotes == 2));
4425 cm_toggle_menu_set_active_full(mainwin->ui_manager, "Menu/View/Quotes/Collapse3", (prefs_common.hide_quotes == 3));
4426 mainwin->menu_lock_count--;
4428 summary_redisplay_msg(mainwin->summaryview);
4431 static void mark_cb(GtkAction *action, gpointer data)
4433 MainWindow *mainwin = (MainWindow *)data;
4434 summary_mark(mainwin->summaryview);
4437 static void unmark_cb(GtkAction *action, gpointer data)
4439 MainWindow *mainwin = (MainWindow *)data;
4440 summary_unmark(mainwin->summaryview);
4443 static void mark_as_read_cb(GtkAction *action, gpointer data)
4445 MainWindow *mainwin = (MainWindow *)data;
4446 summary_mark_as_read(mainwin->summaryview);
4449 static void mark_as_unread_cb(GtkAction *action, gpointer data)
4451 MainWindow *mainwin = (MainWindow *)data;
4452 summary_mark_as_unread(mainwin->summaryview);
4455 static void mark_all_read_cb(GtkAction *action, gpointer data)
4457 MainWindow *mainwin = (MainWindow *)data;
4458 summary_mark_all_read(mainwin->summaryview, TRUE);
4461 static void mark_all_unread_cb(GtkAction *action, gpointer data)
4463 MainWindow *mainwin = (MainWindow *)data;
4464 summary_mark_all_unread(mainwin->summaryview, TRUE);
4467 static void mark_as_spam_cb(GtkAction *action, gpointer data)
4469 MainWindow *mainwin = (MainWindow *)data;
4470 summary_mark_as_spam(mainwin->summaryview, TRUE, NULL);
4473 static void mark_as_ham_cb(GtkAction *action, gpointer data)
4475 MainWindow *mainwin = (MainWindow *)data;
4476 summary_mark_as_spam(mainwin->summaryview, FALSE, NULL);
4479 static void ignore_thread_cb(GtkAction *action, gpointer data)
4481 MainWindow *mainwin = (MainWindow *)data;
4482 summary_ignore_thread(mainwin->summaryview);
4485 static void unignore_thread_cb(GtkAction *action, gpointer data)
4487 MainWindow *mainwin = (MainWindow *)data;
4488 summary_unignore_thread(mainwin->summaryview);
4491 static void watch_thread_cb(GtkAction *action, gpointer data)
4493 MainWindow *mainwin = (MainWindow *)data;
4494 summary_watch_thread(mainwin->summaryview);
4497 static void unwatch_thread_cb(GtkAction *action, gpointer data)
4499 MainWindow *mainwin = (MainWindow *)data;
4500 summary_unwatch_thread(mainwin->summaryview);
4503 static void lock_msgs_cb(GtkAction *action, gpointer data)
4505 MainWindow *mainwin = (MainWindow *)data;
4506 summary_msgs_lock(mainwin->summaryview);
4509 static void unlock_msgs_cb(GtkAction *action, gpointer data)
4511 MainWindow *mainwin = (MainWindow *)data;
4512 summary_msgs_unlock(mainwin->summaryview);
4516 static void reedit_cb(GtkAction *action, gpointer data)
4518 MainWindow *mainwin = (MainWindow *)data;
4519 summary_reedit(mainwin->summaryview);
4522 static void open_urls_cb(GtkAction *action, gpointer data)
4524 MainWindow *mainwin = (MainWindow *)data;
4525 if (!mainwin->summaryview->displayed && mainwin->summaryview->selected) {
4526 summary_display_msg_selected(mainwin->summaryview,
4527 prefs_common.show_all_headers);
4529 messageview_list_urls(mainwin->messageview);
4532 static void add_address_cb(GtkAction *action, gpointer data)
4534 MainWindow *mainwin = (MainWindow *)data;
4535 summary_add_address(mainwin->summaryview);
4538 static void set_charset_cb(GtkAction *action, GtkRadioAction *current, gpointer data)
4540 MainWindow *mainwin = (MainWindow *)data;
4541 gint value = gtk_radio_action_get_current_value (GTK_RADIO_ACTION (current));
4542 const gchar *str;
4544 if (gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (current))) {
4545 str = conv_get_charset_str((CharSet)value);
4547 g_free(mainwin->messageview->forced_charset);
4548 mainwin->messageview->forced_charset = str ? g_strdup(str) : NULL;
4549 procmime_force_charset(str);
4551 summary_redisplay_msg(mainwin->summaryview);
4553 debug_print("forced charset: %s\n", str ? str : "Auto-Detect");
4557 static void set_decode_cb(GtkAction *action, GtkRadioAction *current, gpointer data)
4559 MainWindow *mainwin = (MainWindow *)data;
4560 gint value = gtk_radio_action_get_current_value (GTK_RADIO_ACTION (current));
4561 if (gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (current))) {
4562 mainwin->messageview->forced_encoding = (EncodingType)value;
4564 summary_redisplay_msg(mainwin->summaryview);
4566 debug_print("forced encoding: %d\n", value);
4570 static void hide_read_messages (GtkAction *action, gpointer data)
4572 MainWindow *mainwin = (MainWindow *)data;
4573 GtkWidget *menuitem = gtk_ui_manager_get_widget(mainwin->ui_manager, "/Menu/View/HideReadMessages");
4574 if (!mainwin->summaryview->folder_item
4575 || g_object_get_data(G_OBJECT(menuitem), "dont_toggle"))
4576 return;
4577 summary_toggle_show_read_messages(mainwin->summaryview);
4580 static void hide_del_messages (GtkAction *action, gpointer data)
4582 MainWindow *mainwin = (MainWindow *)data;
4583 GtkWidget *menuitem = gtk_ui_manager_get_widget(mainwin->ui_manager, "/Menu/View/HideDelMessages");
4584 if (!mainwin->summaryview->folder_item
4585 || g_object_get_data(G_OBJECT(menuitem), "dont_toggle"))
4586 return;
4587 summary_toggle_show_del_messages(mainwin->summaryview);
4590 static void hide_read_threads (GtkAction *action, gpointer data)
4592 MainWindow *mainwin = (MainWindow *)data;
4593 GtkWidget *menuitem = gtk_ui_manager_get_widget(mainwin->ui_manager, "/Menu/View/HideReadThreads");
4594 if (!mainwin->summaryview->folder_item
4595 || g_object_get_data(G_OBJECT(menuitem), "dont_toggle"))
4596 return;
4597 summary_toggle_show_read_threads(mainwin->summaryview);
4600 static void thread_cb(GtkAction *action, gpointer data)
4602 MainWindow *mainwin = (MainWindow *)data;
4603 gboolean threaded = FALSE;
4604 guint selected_msgnum = 0;
4606 if (mainwin->menu_lock_count) return;
4607 if (!mainwin->summaryview->folder_item) return;
4609 main_window_cursor_wait(mainwin);
4611 selected_msgnum = summary_get_msgnum(mainwin->summaryview, mainwin->summaryview->selected);
4613 threaded = gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (action));
4615 mainwin->summaryview->folder_item->threaded = threaded;
4617 mainwin->summaryview->threaded = threaded;
4619 summary_show(mainwin->summaryview,
4620 mainwin->summaryview->folder_item, FALSE);
4621 summary_select_by_msgnum(mainwin->summaryview, selected_msgnum, FALSE);
4623 main_window_cursor_normal(mainwin);
4626 static void expand_threads_cb(GtkAction *action, gpointer data)
4628 MainWindow *mainwin = (MainWindow *)data;
4629 summary_expand_threads(mainwin->summaryview);
4632 static void collapse_threads_cb(GtkAction *action, gpointer data)
4634 MainWindow *mainwin = (MainWindow *)data;
4635 summary_collapse_threads(mainwin->summaryview);
4638 static void set_summary_display_item_cb(GtkAction *action, gpointer data)
4640 prefs_summary_column_open();
4643 static void set_folder_display_item_cb(GtkAction *action, gpointer data)
4645 prefs_folder_column_open();
4648 static void sort_summary_cb(GtkAction *action, GtkRadioAction *current, gpointer data)
4650 MainWindow *mainwin = (MainWindow *)data;
4651 gint value = gtk_radio_action_get_current_value (GTK_RADIO_ACTION (current));
4653 if (mainwin->menu_lock_count) return;
4655 if (gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (current))) {
4656 summary_sort(mainwin->summaryview, (FolderSortKey)value,
4657 mainwin->summaryview->sort_type);
4661 static void sort_summary_type_cb(GtkAction *gaction, GtkRadioAction *current, gpointer data)
4663 MainWindow *mainwin = (MainWindow *)data;
4664 gint value = gtk_radio_action_get_current_value (GTK_RADIO_ACTION (current));
4666 if (mainwin->menu_lock_count) return;
4668 if (gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (current)))
4669 summary_sort(mainwin->summaryview,
4670 mainwin->summaryview->sort_key, (FolderSortType)value);
4673 static void attract_by_subject_cb(GtkAction *action, gpointer data)
4675 MainWindow *mainwin = (MainWindow *)data;
4676 summary_attract_by_subject(mainwin->summaryview);
4679 void mainwindow_delete_duplicated(MainWindow *mainwin)
4681 FolderItem *item;
4683 item = folderview_get_selected_item(mainwin->folderview);
4684 if (item) {
4685 gint result;
4687 main_window_cursor_wait(mainwin);
4688 STATUSBAR_PUSH(mainwin, _("Deleting duplicated messages..."));
4689 result = folderutils_delete_duplicates(item, prefs_common.immediate_exec ?
4690 DELETE_DUPLICATES_REMOVE : DELETE_DUPLICATES_SETFLAG);
4691 STATUSBAR_POP(mainwin);
4692 main_window_cursor_normal(mainwin);
4694 switch (result) {
4695 case -1:
4696 break;
4697 case 0:
4698 alertpanel_notice(_("No duplicate message found in selected folder.\n"));
4699 break;
4700 default: {
4701 gchar *msg;
4703 if (prefs_common.immediate_exec) {
4704 msg = ngettext("Deleted %d duplicate message in selected folder.\n",
4705 "Deleted %d duplicate messages in selected folder.\n",
4706 result);
4707 } else {
4708 msg = ngettext("Marked %d duplicate message for deletion in selected folder.\n",
4709 "Marked %d duplicate messages for deletion in selected folder.\n",
4710 result);
4712 alertpanel_notice(msg, result);
4718 static void delete_duplicated_cb(GtkAction *action, gpointer data)
4720 mainwindow_delete_duplicated((MainWindow *)data);
4723 struct DelDupsData
4725 guint dups;
4726 guint folders;
4729 static void deldup_all(FolderItem *item, gpointer _data)
4731 struct DelDupsData *data = _data;
4732 gint result;
4734 result = folderutils_delete_duplicates(item, DELETE_DUPLICATES_REMOVE);
4735 if (result >= 0) {
4736 data->dups += result;
4737 data->folders += 1;
4741 void mainwindow_delete_duplicated_all(MainWindow *mainwin)
4743 struct DelDupsData data = {0, 0};
4745 main_window_cursor_wait(mainwin);
4746 STATUSBAR_PUSH(mainwin, _("Deleting duplicated messages in all folders..."));
4747 folder_func_to_all_folders(deldup_all, &data);
4748 STATUSBAR_POP(mainwin);
4749 main_window_cursor_normal(mainwin);
4751 if (data.dups > 0) {
4752 alertpanel_notice(ngettext("Deleted %d duplicate message in %d folders.\n",
4753 "Deleted %d duplicate messages in %d folders.\n",
4754 data.dups),
4755 data.dups, data.folders);
4756 } else {
4757 alertpanel_notice(_("No duplicate message found in %d folders.\n"), data.folders);
4761 static void delete_duplicated_all_cb(GtkAction *action, gpointer mw)
4763 MainWindow *mainwin = (MainWindow *)mw;
4765 mainwindow_delete_duplicated_all(mainwin);
4768 static void filter_cb(GtkAction *action, gpointer data)
4770 MainWindow *mainwin = (MainWindow *)data;
4771 summary_filter(mainwin->summaryview, FALSE);
4774 static void filter_list_cb(GtkAction *action, gpointer data)
4776 MainWindow *mainwin = (MainWindow *)data;
4777 summary_filter(mainwin->summaryview, TRUE);
4780 static void process_cb(GtkAction *action, gpointer data)
4782 MainWindow *mainwin = (MainWindow *)data;
4783 FolderItem *item = mainwin->summaryview->folder_item;
4784 cm_return_if_fail(item != NULL);
4786 item->processing_pending = TRUE;
4787 folder_item_apply_processing(item);
4788 item->processing_pending = FALSE;
4791 static void execute_summary_cb(GtkAction *action, gpointer data)
4793 MainWindow *mainwin = (MainWindow *)data;
4794 summary_execute(mainwin->summaryview);
4797 static void expunge_summary_cb(GtkAction *action, gpointer data)
4799 MainWindow *mainwin = (MainWindow *)data;
4800 summary_expunge(mainwin->summaryview);
4803 static void update_summary_cb(GtkAction *action, gpointer data)
4805 MainWindow *mainwin = (MainWindow *)data;
4806 FolderItem *fitem;
4807 FolderView *folderview = mainwin->folderview;
4809 if (!mainwin->summaryview->folder_item) return;
4810 if ((fitem = folderview_get_opened_item(folderview)) == NULL) return;
4812 folder_update_op_count();
4813 folder_item_scan(fitem);
4814 summary_show(mainwin->summaryview, fitem, FALSE);
4817 static void prev_cb(GtkAction *action, gpointer data)
4819 MainWindow *mainwin = (MainWindow *)data;
4820 summary_select_prev(mainwin->summaryview);
4823 static void next_cb(GtkAction *action, gpointer data)
4825 MainWindow *mainwin = (MainWindow *)data;
4826 summary_select_next(mainwin->summaryview);
4829 static void prev_unread_cb(GtkAction *action, gpointer data)
4831 MainWindow *mainwin = (MainWindow *)data;
4832 summary_select_prev_unread(mainwin->summaryview);
4835 static void next_unread_cb(GtkAction *action, gpointer data)
4837 MainWindow *mainwin = (MainWindow *)data;
4838 summary_select_next_unread(mainwin->summaryview);
4841 static void prev_new_cb(GtkAction *action, gpointer data)
4843 MainWindow *mainwin = (MainWindow *)data;
4844 summary_select_prev_new(mainwin->summaryview);
4847 static void next_new_cb(GtkAction *action, gpointer data)
4849 MainWindow *mainwin = (MainWindow *)data;
4850 summary_select_next_new(mainwin->summaryview);
4853 static void prev_marked_cb(GtkAction *action, gpointer data)
4855 MainWindow *mainwin = (MainWindow *)data;
4856 summary_select_prev_marked(mainwin->summaryview);
4859 static void next_marked_cb(GtkAction *action, gpointer data)
4861 MainWindow *mainwin = (MainWindow *)data;
4862 summary_select_next_marked(mainwin->summaryview);
4865 static void prev_labeled_cb(GtkAction *action, gpointer data)
4867 MainWindow *mainwin = (MainWindow *)data;
4868 summary_select_prev_labeled(mainwin->summaryview);
4871 static void next_labeled_cb(GtkAction *action, gpointer data)
4873 MainWindow *mainwin = (MainWindow *)data;
4874 summary_select_next_labeled(mainwin->summaryview);
4877 static void prev_history_cb(GtkAction *action, gpointer data)
4879 MainWindow *mainwin = (MainWindow *)data;
4880 MsgInfo *info = messageview_nav_get_prev(mainwin->messageview);
4881 if (info) {
4882 if (info->folder != mainwin->summaryview->folder_item)
4883 folderview_select(mainwin->folderview, info->folder);
4884 summary_select_by_msgnum(mainwin->summaryview, info->msgnum,
4885 OPEN_SELECTED_ON_PREVNEXT);
4886 procmsg_msginfo_free(&info);
4887 main_window_set_menu_sensitive(mainwindow_get_mainwindow());
4888 toolbar_main_set_sensitive(mainwindow_get_mainwindow());
4892 static void next_history_cb(GtkAction *action, gpointer data)
4894 MainWindow *mainwin = (MainWindow *)data;
4895 MsgInfo *info = messageview_nav_get_next(mainwin->messageview);
4896 if (info) {
4897 if (info->folder != mainwin->summaryview->folder_item)
4898 folderview_select(mainwin->folderview, info->folder);
4899 summary_select_by_msgnum(mainwin->summaryview, info->msgnum,
4900 OPEN_SELECTED_ON_PREVNEXT);
4901 procmsg_msginfo_free(&info);
4902 main_window_set_menu_sensitive(mainwindow_get_mainwindow());
4903 toolbar_main_set_sensitive(mainwindow_get_mainwindow());
4907 static void parent_cb(GtkAction *action, gpointer data)
4909 MainWindow *mainwin = (MainWindow *)data;
4910 summary_select_parent(mainwin->summaryview);
4913 static void goto_folder_cb(GtkAction *action, gpointer data)
4915 MainWindow *mainwin = (MainWindow *)data;
4916 FolderItem *to_folder;
4918 to_folder = foldersel_folder_sel(NULL, FOLDER_SEL_ALL, NULL, FALSE,
4919 _("Select folder to go to"));
4921 if (to_folder)
4922 folderview_select(mainwin->folderview, to_folder);
4925 static void goto_unread_folder_cb(GtkAction *action, gpointer data)
4927 MainWindow *mainwin = (MainWindow *)data;
4928 folderview_select_next_with_flag(mainwin->folderview, MSG_UNREAD);
4931 static void scroll_prev_line_cb(GtkAction *action, gpointer data)
4933 MainWindow *mainwin = (MainWindow *)data;
4934 mimeview_scroll_one_line(mainwin->messageview->mimeview,TRUE);
4937 static void scroll_next_line_cb(GtkAction *action, gpointer data)
4939 MainWindow *mainwin = (MainWindow *)data;
4940 mimeview_scroll_one_line(mainwin->messageview->mimeview,FALSE);
4943 static void scroll_prev_page_cb(GtkAction *action, gpointer data)
4945 MainWindow *mainwin = (MainWindow *)data;
4946 mimeview_scroll_page(mainwin->messageview->mimeview,TRUE);
4949 static void scroll_next_page_cb(GtkAction *action, gpointer data)
4951 MainWindow *mainwin = (MainWindow *)data;
4952 mimeview_scroll_page(mainwin->messageview->mimeview,FALSE);
4955 static void copy_cb(GtkAction *action, gpointer data)
4957 MainWindow *mainwin = (MainWindow *)data;
4958 messageview_copy_clipboard(mainwin->messageview);
4961 static void allsel_cb(GtkAction *action, gpointer data)
4963 MainWindow *mainwin = (MainWindow *)data;
4964 MessageView *msgview = mainwin->messageview;
4966 if (messageview_is_visible(msgview) &&
4967 (gtk_widget_has_focus(msgview->mimeview->textview->text)))
4968 messageview_select_all(mainwin->messageview);
4969 else
4970 summary_select_all(mainwin->summaryview);
4973 static void select_thread_cb(GtkAction *action, gpointer data)
4975 MainWindow *mainwin = (MainWindow *)data;
4976 summary_select_thread(mainwin->summaryview, FALSE, FALSE);
4979 static void trash_thread_cb(GtkAction *action, gpointer data)
4981 MainWindow *mainwin = (MainWindow *)data;
4982 summary_select_thread(mainwin->summaryview, FALSE, TRUE);
4985 static void delete_thread_cb(GtkAction *action, gpointer data)
4987 MainWindow *mainwin = (MainWindow *)data;
4988 summary_select_thread(mainwin->summaryview, TRUE, FALSE);
4991 static void create_filter_cb(GtkAction *gaction, gpointer data)
4993 MainWindow *mainwin = (MainWindow *)data;
4994 const gchar *a_name = gtk_action_get_name(gaction);
4995 gint action = -1;
4997 DO_ACTION("Tools/CreateFilterRule/Automatically", FILTER_BY_AUTO);
4998 DO_ACTION("Tools/CreateFilterRule/ByFrom", FILTER_BY_FROM);
4999 DO_ACTION("Tools/CreateFilterRule/ByTo", FILTER_BY_TO);
5000 DO_ACTION("Tools/CreateFilterRule/BySubject", FILTER_BY_SUBJECT);
5001 DO_ACTION("Tools/CreateFilterRule/BySender", FILTER_BY_SENDER);
5002 summary_filter_open(mainwin->summaryview, (PrefsFilterType)action, 0);
5005 static void create_processing_cb(GtkAction *gaction, gpointer data)
5007 MainWindow *mainwin = (MainWindow *)data;
5008 const gchar *a_name = gtk_action_get_name(gaction);
5009 gint action = -1;
5011 DO_ACTION("Tools/CreateProcessingRule/Automatically", FILTER_BY_AUTO);
5012 DO_ACTION("Tools/CreateProcessingRule/ByFrom", FILTER_BY_FROM);
5013 DO_ACTION("Tools/CreateProcessingRule/ByTo", FILTER_BY_TO);
5014 DO_ACTION("Tools/CreateProcessingRule/BySubject", FILTER_BY_SUBJECT);
5015 DO_ACTION("Tools/CreateProcessingRule/BySender", FILTER_BY_SENDER);
5016 summary_filter_open(mainwin->summaryview, (PrefsFilterType)action, 1);
5019 static void prefs_pre_processing_open_cb(GtkAction *action, gpointer data)
5021 prefs_filtering_open(&pre_global_processing,
5022 _("Processing rules to apply before folder rules"),
5023 MANUAL_ANCHOR_PROCESSING,
5024 NULL, NULL, FALSE);
5027 static void prefs_post_processing_open_cb(GtkAction *action, gpointer data)
5029 prefs_filtering_open(&post_global_processing,
5030 _("Processing rules to apply after folder rules"),
5031 MANUAL_ANCHOR_PROCESSING,
5032 NULL, NULL, FALSE);
5035 static void prefs_filtering_open_cb(GtkAction *action, gpointer data)
5037 prefs_filtering_open(&filtering_rules,
5038 _("Filtering configuration"),
5039 MANUAL_ANCHOR_FILTERING,
5040 NULL, NULL, TRUE);
5043 static void prefs_template_open_cb(GtkAction *action, gpointer data)
5045 prefs_template_open();
5048 static void prefs_actions_open_cb(GtkAction *action, gpointer data)
5050 MainWindow *mainwin = (MainWindow *)data;
5051 prefs_actions_open(mainwin);
5054 static void prefs_tags_open_cb(GtkAction *action, gpointer data)
5056 tags_window_open(NULL);
5058 #ifdef USE_GNUTLS
5059 static void ssl_manager_open_cb(GtkAction *action, gpointer data)
5061 MainWindow *mainwin = (MainWindow *)data;
5062 ssl_manager_open(mainwin);
5064 #endif
5065 static void prefs_account_open_cb(GtkAction *action, gpointer data)
5067 MainWindow *mainwin = (MainWindow *)data;
5068 if (!cur_account) {
5069 new_account_cb(NULL, mainwin);
5070 } else {
5071 account_open(cur_account, FALSE);
5075 static void new_account_cb(GtkAction *action, gpointer data)
5077 account_edit_open(NULL, NULL);
5078 if (!compose_get_compose_list()) account_add();
5081 static void account_selector_menu_cb(GtkMenuItem *menuitem, gpointer data)
5083 FolderItem *item = NULL;
5084 cur_account = (PrefsAccount *)data;
5086 if (!mainwindow_get_mainwindow())
5087 return;
5088 main_window_show_cur_account(mainwindow_get_mainwindow());
5089 toolbar_update(TOOLBAR_MAIN, mainwindow_get_mainwindow());
5090 main_window_set_menu_sensitive(mainwindow_get_mainwindow());
5091 toolbar_main_set_sensitive(mainwindow_get_mainwindow());
5092 item = folderview_get_selected_item(
5093 mainwindow_get_mainwindow()->folderview);
5094 if (item) {
5095 toolbar_set_compose_button
5096 (mainwindow_get_mainwindow()->toolbar,
5097 FOLDER_TYPE(item->folder) == F_NEWS ?
5098 COMPOSEBUTTON_NEWS : COMPOSEBUTTON_MAIL);
5102 static void account_receive_menu_cb(GtkMenuItem *menuitem, gpointer data)
5104 MainWindow *mainwin = (MainWindow *)mainwin_list->data;
5105 PrefsAccount *account = (PrefsAccount *)data;
5107 inc_account_mail(mainwin, account);
5109 #ifndef GENERIC_UMPC
5110 static void account_compose_menu_cb(GtkMenuItem *menuitem, gpointer data)
5112 PrefsAccount *account = (PrefsAccount *)data;
5114 compose_new_with_folderitem(account, NULL, NULL);
5116 #endif
5117 static void prefs_open_cb(GtkAction *action, gpointer data)
5119 prefs_gtk_open();
5122 static void plugins_open_cb(GtkAction *action, gpointer data)
5124 pluginwindow_create();
5127 static void manual_open_cb(GtkAction *action, gpointer data)
5129 manual_open(MANUAL_MANUAL_CLAWS, NULL);
5132 static void manual_faq_open_cb(GtkAction *action, gpointer data)
5134 manual_open(MANUAL_FAQ_CLAWS, NULL);
5137 static void legend_open_cb(GtkAction *action, gpointer data)
5139 legend_show();
5142 #ifdef G_OS_WIN32
5143 static void set_default_client_cb(GtkAction *action, gpointer data)
5145 char exename[MAX_PATH];
5146 gchar *binary_icon = NULL;
5147 gchar *binary_compose = NULL;
5148 gchar *binary_run = NULL;
5149 gboolean r;
5150 if ( !GetModuleFileNameA (0, exename, sizeof (exename)) ) {
5151 alertpanel_error(_("Can not register as default client: impossible to get executable path."));
5152 return;
5154 binary_icon = g_strconcat(exename, ",0", NULL);
5155 binary_compose = g_strconcat(exename, " --compose %1", NULL);
5156 binary_run = g_strconcat(exename, NULL);
5158 /* Try to set the Mail Start menu item to Claws. It may fail if we're not root; we don't care */
5159 r = write_w32_registry_string(HKEY_LOCAL_MACHINE,
5160 "Software\\Clients\\Mail",
5162 "Claws Mail");
5164 r = write_w32_registry_string(HKEY_CURRENT_USER,
5165 "Software\\Clients\\Mail\\Claws Mail",
5167 "Claws Mail");
5168 if (r)
5169 r = write_w32_registry_string(HKEY_CURRENT_USER,
5170 "Software\\Clients\\Mail\\Claws Mail",
5171 "DLLPath",
5172 "");
5173 if (r)
5174 r = write_w32_registry_string(HKEY_CURRENT_USER,
5175 "Software\\Clients\\Mail\\Claws Mail\\Protocols\\mailto",
5177 "URL:MailTo-Protocol");
5178 if (r)
5179 r = write_w32_registry_string(HKEY_CURRENT_USER,
5180 "Software\\Clients\\Mail\\Claws Mail\\Protocols\\mailto",
5181 "URL Protocol",
5182 "");
5183 if (r)
5184 r = write_w32_registry_dword (HKEY_CURRENT_USER,
5185 "Software\\Clients\\Mail\\Claws Mail\\Protocols\\mailto",
5186 "EditFlags",
5188 if (r)
5189 r = write_w32_registry_string(HKEY_CURRENT_USER,
5190 "Software\\Clients\\Mail\\Claws Mail\\Protocols\\mailto",
5191 "FriendlyTypeName",
5192 "Claws-Mail URL");
5193 if (r)
5194 r = write_w32_registry_string(HKEY_CURRENT_USER,
5195 "Software\\Clients\\Mail\\Claws Mail\\Protocols\\mailto\\DefaultIcon",
5197 binary_icon);
5198 if (r)
5199 r = write_w32_registry_string(HKEY_CURRENT_USER,
5200 "Software\\Clients\\Mail\\Claws Mail\\Protocols\\mailto\\shell\\open\\command",
5202 binary_compose);
5203 if (r)
5204 r = write_w32_registry_string(HKEY_CURRENT_USER,
5205 "Software\\Clients\\Mail\\Claws Mail\\shell\\open\\command",
5207 binary_run);
5209 if (r)
5210 r = write_w32_registry_string(HKEY_CURRENT_USER,
5211 "Software\\Classes\\mailto",
5213 "URL:MailTo-Protocol");
5214 if (r)
5215 r = write_w32_registry_string(HKEY_CURRENT_USER,
5216 "Software\\Classes\\mailto",
5217 "URL Protocol",
5218 "");
5219 if (r)
5220 r = write_w32_registry_dword (HKEY_CURRENT_USER,
5221 "Software\\Classes\\mailto",
5222 "EditFlags",
5224 if (r)
5225 r = write_w32_registry_string(HKEY_CURRENT_USER,
5226 "Software\\Classes\\mailto",
5227 "FriendlyTypeName",
5228 "Claws-Mail URL");
5229 if (r)
5230 r = write_w32_registry_string(HKEY_CURRENT_USER,
5231 "Software\\Classes\\mailto\\DefaultIcon",
5233 binary_icon);
5234 if (r)
5235 r = write_w32_registry_string(HKEY_CURRENT_USER,
5236 "Software\\Classes\\mailto\\shell\\open\\command",
5238 binary_compose);
5240 if (r) {
5241 SendMessage(HWND_BROADCAST, WM_SETTINGCHANGE, 0, (LPARAM)"Software\\Clients\\Mail");
5242 alertpanel_notice(_("Claws Mail has been registered as default client."));
5243 } else {
5244 alertpanel_error(_("Can not register as default client: impossible to write to the registry."));
5246 g_free(binary_icon);
5247 g_free(binary_compose);
5248 g_free(binary_run);
5250 #endif
5252 static void scan_tree_func(Folder *folder, FolderItem *item, gpointer data)
5254 MainWindow *mainwin = (MainWindow *)data;
5255 gchar *str;
5257 if (item->path)
5258 str = g_strdup_printf(_("Scanning folder %s%c%s..."),
5259 LOCAL_FOLDER(folder)->rootpath,
5260 G_DIR_SEPARATOR,
5261 item->path);
5262 else
5263 str = g_strdup_printf(_("Scanning folder %s..."),
5264 LOCAL_FOLDER(folder)->rootpath);
5266 STATUSBAR_PUSH(mainwin, str);
5267 STATUSBAR_POP(mainwin);
5268 g_free(str);
5271 static gboolean mainwindow_focus_in_event(GtkWidget *widget, GdkEventFocus *focus,
5272 gpointer data)
5274 SummaryView *summary;
5276 cm_return_val_if_fail(data, FALSE);
5277 if (!g_list_find(mainwin_list, data))
5278 return TRUE;
5279 summary = ((MainWindow *)data)->summaryview;
5280 cm_return_val_if_fail(summary, FALSE);
5282 if (GTK_CMCLIST(summary->ctree)->selection &&
5283 g_list_length(GTK_CMCLIST(summary->ctree)->selection) > 1)
5284 return FALSE;
5286 return FALSE;
5289 static gboolean mainwindow_visibility_event_cb(GtkWidget *widget, GdkEventVisibility *event,
5290 gpointer data)
5292 is_obscured = (event->state == GDK_VISIBILITY_FULLY_OBSCURED);
5293 return FALSE;
5296 static gboolean mainwindow_state_event_cb(GtkWidget *widget, GdkEventWindowState *state,
5297 gpointer data)
5299 if (!claws_is_starting()
5300 && state->changed_mask&GDK_WINDOW_STATE_ICONIFIED
5301 && state->new_window_state&GDK_WINDOW_STATE_ICONIFIED) {
5303 if (iconified_count > 0)
5304 hooks_invoke(MAIN_WINDOW_GOT_ICONIFIED, NULL);
5305 iconified_count++;
5306 } else if (!claws_is_starting()) {
5307 prefs_common.mainwin_maximised =
5308 ((state->new_window_state&GDK_WINDOW_STATE_MAXIMIZED) != 0);
5310 if (state->new_window_state == 0)
5311 gtk_window_set_skip_taskbar_hint(GTK_WINDOW(widget), FALSE);
5312 return FALSE;
5315 gboolean mainwindow_is_obscured(void)
5317 return is_obscured;
5321 * Harvest addresses for selected folder.
5323 static void addr_harvest_cb( GtkAction *action, gpointer data)
5325 MainWindow *mainwin = (MainWindow *)data;
5327 addressbook_harvest( mainwin->summaryview->folder_item, FALSE, NULL );
5331 * Harvest addresses for selected messages in summary view.
5333 static void addr_harvest_msg_cb( GtkAction *action, gpointer data)
5335 MainWindow *mainwin = (MainWindow *)data;
5336 summary_harvest_address( mainwin->summaryview );
5340 *\brief get a MainWindow
5342 *\return MainWindow * The first mainwindow in the mainwin_list
5344 MainWindow *mainwindow_get_mainwindow(void)
5346 if (mainwin_list && mainwin_list->data)
5347 return (MainWindow *)(mainwin_list->data);
5348 else
5349 return NULL;
5352 static gboolean mainwindow_progressindicator_hook(gpointer source, gpointer userdata)
5354 ProgressData *data = (ProgressData *) source;
5355 MainWindow *mainwin = (MainWindow *) userdata;
5357 switch (data->cmd) {
5358 case PROGRESS_COMMAND_START:
5359 case PROGRESS_COMMAND_STOP:
5360 gtk_progress_bar_set_fraction
5361 (GTK_PROGRESS_BAR(mainwin->progressbar), 0.0);
5362 break;
5363 case PROGRESS_COMMAND_SET_PERCENTAGE:
5364 gtk_progress_bar_set_fraction
5365 (GTK_PROGRESS_BAR(mainwin->progressbar), data->value);
5366 break;
5368 while (gtk_events_pending()) gtk_main_iteration ();
5370 return FALSE;
5373 static void sync_cb(GtkAction *action, gpointer data)
5375 MainWindow *mainwin = (MainWindow *)data;
5376 mainwindow_check_synchronise(mainwin, FALSE);
5379 static void forget_session_passwords_cb(GtkAction *action, gpointer data)
5381 MainWindow *mainwin = (MainWindow *)data;
5382 GList *list = NULL;
5383 gint fgtn = 0;
5384 gint accs = 0;
5386 main_window_lock(mainwin);
5387 for (list = account_get_list(); list != NULL; list = list->next) {
5388 PrefsAccount *account = list->data;
5389 if (account->session_passwd) {
5390 g_free(account->session_passwd);
5391 account->session_passwd = NULL;
5392 ++fgtn;
5394 if (account->session_smtp_passwd) {
5395 g_free(account->session_smtp_passwd);
5396 account->session_smtp_passwd = NULL;
5397 ++fgtn;
5399 ++accs;
5401 main_window_unlock(mainwin);
5402 alertpanel_notice(ngettext("Forgotten %d password in %d accounts.\n",
5403 "Forgotten %d passwords in %d accounts.\n",
5404 fgtn), fgtn, accs);
5407 #ifndef PASSWORD_CRYPTO_OLD
5408 static void forget_primary_passphrase_cb(GtkAction *action, gpointer data)
5410 MainWindow *mainwin = (MainWindow *)data;
5412 main_window_lock(mainwin);
5413 primary_passphrase_forget();
5414 main_window_unlock(mainwin);
5416 #endif
5418 void mainwindow_learn (MainWindow *mainwin, gboolean is_spam)
5420 summary_mark_as_spam(mainwin->summaryview, is_spam, NULL);
5423 void mainwindow_jump_to(const gchar *target, gboolean popup)
5425 gchar *tmp = NULL;
5426 FolderItem *item = NULL;
5427 gchar *msg = NULL;
5428 MainWindow *mainwin = mainwindow_get_mainwindow();
5429 gchar *from_uri = NULL;
5430 if (!target)
5431 return;
5433 if (!mainwin) {
5434 g_print("not initialized\n");
5435 return;
5438 if ((from_uri = g_filename_from_uri(target, NULL, NULL)) != NULL)
5439 tmp = from_uri;
5440 else
5441 tmp = g_strdup(target);
5443 strcrlftrunc(tmp);
5445 if ((item = folder_find_item_from_identifier(tmp))) {
5446 g_print("selecting folder '%s'\n", tmp);
5447 folderview_select(mainwin->folderview, item);
5448 if (popup)
5449 main_window_popup(mainwin);
5450 g_free(tmp);
5451 return;
5454 msg = strrchr(tmp, '/');
5455 if (msg) {
5456 *msg++ = '\0';
5457 if ((item = folder_find_item_from_identifier(tmp))) {
5458 g_print("selecting folder '%s'\n", tmp);
5459 folderview_select(mainwin->folderview, item);
5460 } else if ((item = folder_find_item_from_real_path(tmp))) {
5461 g_print("selecting folder '%s'\n", tmp);
5462 folderview_select(mainwin->folderview, item);
5463 } else {
5464 g_print("'%s' not found\n", tmp);
5466 if (item && msg && atoi(msg)) {
5467 g_print("selecting message %d\n", atoi(msg));
5468 summary_select_by_msgnum(mainwin->summaryview, atoi(msg), TRUE);
5469 if (popup)
5470 main_window_popup(mainwin);
5471 g_free(tmp);
5472 return;
5473 } else if (item && msg[0] == '<' && msg[strlen(msg)-1] == '>') {
5474 MsgInfo *msginfo = NULL;
5475 msg++;
5476 msg[strlen(msg)-1] = '\0';
5477 msginfo = folder_item_get_msginfo_by_msgid(item, msg);
5478 if (msginfo) {
5479 g_print("selecting message %s\n", msg);
5480 summary_select_by_msgnum(mainwin->summaryview, msginfo->msgnum, TRUE);
5481 if (popup)
5482 main_window_popup(mainwin);
5483 g_free(tmp);
5484 procmsg_msginfo_free(&msginfo);
5485 return;
5486 } else {
5487 g_print("'%s' not found\n", msg);
5489 } else {
5490 g_print("'%s' not found\n", msg);
5492 } else {
5493 g_print("'%s' not found\n", tmp);
5496 g_free(tmp);
5499 void mainwindow_exit_folder(MainWindow *mainwin) {
5500 if (prefs_common.layout_mode == SMALL_LAYOUT) {
5501 folderview_close_opened(mainwin->folderview, FALSE);
5502 mainwin_paned_show_first(GTK_PANED(mainwin->hpaned));
5503 folderview_grab_focus(mainwin->folderview);
5505 mainwin->in_folder = FALSE;
5506 main_window_set_menu_sensitive(mainwin);
5509 void mainwindow_enter_folder(MainWindow *mainwin) {
5510 if (prefs_common.layout_mode == SMALL_LAYOUT) {
5511 mainwin_paned_show_last(GTK_PANED(mainwin->hpaned));
5513 mainwin->in_folder = TRUE;
5514 main_window_set_menu_sensitive(mainwin);
5517 static void save_part_as_cb(GtkAction *action, gpointer data)
5519 MainWindow *mainwin = (MainWindow *)data;
5521 if (mainwin->messageview
5522 && mainwin->messageview->mimeview)
5523 mimeview_save_as(mainwin->messageview->mimeview);
5526 static void view_part_as_text_cb(GtkAction *action, gpointer data)
5528 MainWindow *mainwin = (MainWindow *)data;
5530 if (mainwin->messageview
5531 && mainwin->messageview->mimeview)
5532 mimeview_display_as_text(mainwin->messageview->mimeview);
5535 static void open_part_cb(GtkAction *action, gpointer data)
5537 MainWindow *mainwin = (MainWindow *)data;
5539 if (mainwin->messageview
5540 && mainwin->messageview->mimeview)
5541 mimeview_launch(mainwin->messageview->mimeview, NULL);
5543 #ifndef G_OS_WIN32
5544 static void open_part_with_cb(GtkAction *action, gpointer data)
5546 MainWindow *mainwin = (MainWindow *)data;
5548 if (mainwin->messageview
5549 && mainwin->messageview->mimeview)
5550 mimeview_open_with(mainwin->messageview->mimeview);
5552 #endif
5553 static void check_signature_cb(GtkAction *action, gpointer data)
5555 MainWindow *mainwin = (MainWindow *)data;
5557 if (mainwin->messageview
5558 && mainwin->messageview->mimeview)
5559 mimeview_check_signature(mainwin->messageview->mimeview);
5562 static void goto_next_part_cb(GtkAction *action, gpointer data)
5564 MainWindow *mainwin = (MainWindow *)data;
5566 if (mainwin->messageview
5567 && mainwin->messageview->mimeview)
5568 mimeview_select_next_part(mainwin->messageview->mimeview);
5571 static void goto_prev_part_cb(GtkAction *action, gpointer data)
5573 MainWindow *mainwin = (MainWindow *)data;
5575 if (mainwin->messageview
5576 && mainwin->messageview->mimeview)
5577 mimeview_select_prev_part(mainwin->messageview->mimeview);
5580 void mainwindow_import_mbox(const gchar* mbox_file)
5582 MainWindow *mainwin = mainwindow_get_mainwindow();
5584 strcrlftrunc((gchar *) mbox_file);
5585 /* only notify if import has failed */
5586 if (import_mbox(mainwin->summaryview->folder_item, mbox_file) == -1) {
5587 alertpanel_error(_("Mbox import has failed."));