1 /*
2    Claws Mail -- a GTK+ based, lightweight, and fast e-mail client
3    Copyright (C) 1999-2018 the Claws Mail team and Hiroyuki Yamamoto
4 
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.
9 
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.
14 
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/>.
17  */
18 
19 #include "defs.h"
20 
21 #ifdef G_OS_WIN32
22 #define UNICODE
23 #define _UNICODE
24 #endif
25 
26 #include <glib.h>
27 #include <glib/gi18n.h>
28 #include <gdk/gdkkeysyms.h>
29 #include <gtk/gtk.h>
30 #include <string.h>
31 #include <stdarg.h>
32 
33 #include "main.h"
34 #include "mainwindow.h"
35 #include "folderview.h"
36 #include "folder_item_prefs.h"
37 #include "foldersel.h"
38 #include "quicksearch.h"
39 #include "summaryview.h"
40 #include "summary_search.h"
41 #include "messageview.h"
42 #include "mimeview.h"
43 #include "message_search.h"
44 #include "headerview.h"
45 #include "menu.h"
46 #include "stock_pixmap.h"
47 #include "folder.h"
48 #include "inc.h"
49 #include "log.h"
50 #include "compose.h"
51 #include "procmsg.h"
52 #include "import.h"
53 #include "export.h"
54 #include "edittags.h"
55 #include "password.h"
56 #include "prefs_common.h"
57 #include "prefs_actions.h"
58 #include "prefs_filtering.h"
59 #include "prefs_account.h"
60 #include "prefs_summary_column.h"
61 #include "prefs_folder_column.h"
62 #include "prefs_template.h"
63 #include "action.h"
64 #include "account.h"
65 #ifndef USE_ALT_ADDRBOOK
66 	#include "addressbook.h"
67 #else
68 	#include "addressbook-dbus.h"
69 #endif
70 #include "logwindow.h"
71 #include "manage_window.h"
72 #include "alertpanel.h"
73 #include "statusbar.h"
74 #include "inputdialog.h"
75 #include "utils.h"
76 #include "gtkutils.h"
77 #include "codeconv.h"
78 #include "about.h"
79 #include "manual.h"
80 #include "version.h"
81 #include "ssl_manager.h"
82 #include "sslcertwindow.h"
83 #include "prefs_gtk.h"
84 #include "pluginwindow.h"
85 #include "hooks.h"
86 #include "progressindicator.h"
87 #include "localfolder.h"
88 #include "filtering.h"
89 #include "folderutils.h"
90 #include "foldersort.h"
91 #include "icon_legend.h"
92 #include "colorlabel.h"
93 #include "tags.h"
94 #include "textview.h"
95 #include "imap.h"
96 #include "news.h"
97 #include "socket.h"
98 #include "printing.h"
99 #include "send_message.h"
100 #ifdef G_OS_WIN32
101 #include "w32lib.h"
102 #endif
103 
104 #define AC_LABEL_WIDTH	240
105 
106 /* list of all instantiated MainWindow */
107 static GList *mainwin_list = NULL;
108 
109 static GdkCursor *watch_cursor = NULL;
110 static GdkCursor *hand_cursor = NULL;
111 
112 static gint iconified_count = 0;
113 
114 static void main_window_menu_callback_block	(MainWindow	*mainwin);
115 static void main_window_menu_callback_unblock	(MainWindow	*mainwin);
116 
117 static void main_window_show_cur_account	(MainWindow	*mainwin);
118 #ifndef GENERIC_UMPC
119 static void main_window_separation_change	(MainWindow	*mainwin,
120 						 LayoutType	 layout_mode);
121 #endif
122 static void main_window_set_widgets		(MainWindow	*mainwin,
123 						 LayoutType	 layout_mode);
124 
125 static void toolbar_child_attached		(GtkWidget	*widget,
126 						 GtkWidget	*child,
127 						 gpointer	 data);
128 static void toolbar_child_detached		(GtkWidget	*widget,
129 						 GtkWidget	*child,
130 						 gpointer	 data);
131 #ifndef GENERIC_UMPC
132 static gboolean ac_label_button_pressed		(GtkWidget	*widget,
133 						 GdkEventButton	*event,
134 						 gpointer	 data);
135 #endif
136 static gint main_window_close_cb		(GtkWidget	*widget,
137 						 GdkEventAny	*event,
138 						 gpointer	 data);
139 
140 static void main_window_size_allocate_cb	(GtkWidget	*widget,
141 						 GtkAllocation	*allocation,
142 						 gpointer	 data);
143 static void folder_window_size_allocate_cb	(GtkWidget	*widget,
144 						 GtkAllocation	*allocation,
145 						 gpointer	 data);
146 static void message_window_size_allocate_cb	(GtkWidget	*widget,
147 						 GtkAllocation	*allocation,
148 						 gpointer	 data);
149 
150 static void update_folderview_cb (GtkAction	*action,
151 				  gpointer	 data);
152 static void add_mailbox_cb	 (GtkAction	*action,
153 				  gpointer	 data);
154 static void foldersort_cb	 (GtkAction	*action,
155 				  gpointer	 data);
156 static void import_mbox_cb	 (GtkAction	*action,
157 				  gpointer	 data);
158 static void export_mbox_cb	 (GtkAction	*action,
159 				  gpointer	 data);
160 static void export_list_mbox_cb  (GtkAction	*action,
161 				  gpointer	 data);
162 static void empty_trash_cb	 (GtkAction	*action,
163 				  gpointer	 data);
164 static void save_as_cb		 (GtkAction	*action,
165 				  gpointer	 data);
166 static void page_setup_cb	 (GtkAction	*action,
167 				  gpointer	 data);
168 static void print_cb		 (GtkAction	*action,
169 				  gpointer	 data);
170 static void app_exit_cb		 (GtkAction	*action,
171 				  gpointer	 data);
172 
173 
174 static void search_cb		 (GtkAction	*action,
175 				  gpointer	 data);
176 static void search_folder_cb	 (GtkAction	*action,
177 				  gpointer	 data);
178 
179 static void toggle_message_cb	 (GtkAction	*action,
180 				  gpointer	 data);
181 static void toggle_toolbar_cb	 (GtkAction *action, GtkRadioAction *current, gpointer data);
182 static void toggle_col_headers_cb(GtkAction	*action,
183 				  gpointer	 data);
184 #ifndef GENERIC_UMPC
185 static void toggle_statusbar_cb	 (GtkAction	*action,
186 				  gpointer	 data);
187 static void set_layout_cb	 (GtkAction *action, GtkRadioAction *current, gpointer data);
188 #endif
189 static void addressbook_open_cb	(GtkAction	*action,
190 				  gpointer	 data);
191 static void log_window_show_cb	(GtkAction	*action,
192 				  gpointer	 data);
193 static void filtering_debug_window_show_cb	(GtkAction	*action,
194 				  gpointer	 data);
195 #ifdef G_OS_WIN32
196 static void debug_log_show_cb(GtkAction *action, gpointer data);
197 #endif
198 
199 static void inc_cancel_cb		(GtkAction	*action,
200 				  gpointer	 data);
201 static void send_cancel_cb		(GtkAction	*action,
202 				  gpointer	 data);
203 
204 static void open_msg_cb			(GtkAction	*action,
205 				  gpointer	 data);
206 
207 static void view_source_cb		(GtkAction	*action,
208 				  gpointer	 data);
209 
210 static void show_all_header_cb		(GtkAction	*action,
211 				  gpointer	 data);
212 static void toggle_fullscreen_cb	(GtkAction	*action,
213 				  gpointer	 data);
214 static void toggle_menubar_cb	(GtkAction	*action,
215 				  gpointer	 data);
216 
217 static void hide_quotes_cb(GtkAction	*action,
218 				  gpointer	 data);
219 
220 static void move_to_cb			(GtkAction	*action,
221 				  gpointer	 data);
222 static void copy_to_cb			(GtkAction	*action,
223 				  gpointer	 data);
224 static void delete_cb			(GtkAction	*action,
225 				  gpointer	 data);
226 static void delete_trash_cb			(GtkAction	*action,
227 				  gpointer	 data);
228 
229 static void cancel_cb                   (GtkAction	*action,
230 				  gpointer	 data);
231 
232 static void mark_cb			(GtkAction	*action,
233 				  gpointer	 data);
234 static void unmark_cb			(GtkAction	*action,
235 				  gpointer	 data);
236 
237 static void mark_as_unread_cb		(GtkAction	*action,
238 				  gpointer	 data);
239 static void mark_as_read_cb		(GtkAction	*action,
240 				  gpointer	 data);
241 static void mark_all_read_cb		(GtkAction	*action,
242 				  gpointer	 data);
243 static void mark_all_unread_cb		(GtkAction	*action,
244 				  gpointer	 data);
245 static void mark_as_spam_cb		(GtkAction	*action,
246 				  gpointer	 data);
247 static void mark_as_ham_cb		(GtkAction	*action,
248 				  gpointer	 data);
249 
250 static void ignore_thread_cb		(GtkAction	*action,
251 				  gpointer	 data);
252 static void unignore_thread_cb		(GtkAction	*action,
253 				  gpointer	 data);
254 static void watch_thread_cb		(GtkAction	*action,
255 				  gpointer	 data);
256 static void unwatch_thread_cb		(GtkAction	*action,
257 				  gpointer	 data);
258 static void lock_msgs_cb		(GtkAction	*action,
259 				  gpointer	 data);
260 static void unlock_msgs_cb		(GtkAction	*action,
261 				  gpointer	 data);
262 
263 static void reedit_cb			(GtkAction	*action,
264 				  gpointer	 data);
265 
266 static void add_address_cb		(GtkAction	*action,
267 				  gpointer	 data);
268 
269 static void set_charset_cb		(GtkAction *action, GtkRadioAction *current, gpointer data);
270 
271 static void set_decode_cb		(GtkAction *action, GtkRadioAction *current, gpointer data);
272 
273 static void hide_read_messages   (GtkAction	*action,
274 				  gpointer	 data);
275 static void hide_read_threads   (GtkAction	*action,
276 				  gpointer	 data);
277 static void hide_del_messages   (GtkAction	*action,
278 				  gpointer	 data);
279 
280 static void thread_cb		 (GtkAction	*action,
281 				  gpointer	 data);
282 static void expand_threads_cb	 (GtkAction	*action,
283 				  gpointer	 data);
284 static void collapse_threads_cb	 (GtkAction	*action,
285 				  gpointer	 data);
286 
287 static void set_summary_display_item_cb	 (GtkAction	*action,
288 				  gpointer	 data);
289 static void set_folder_display_item_cb	 (GtkAction	*action,
290 				  gpointer	 data);
291 static void sort_summary_cb	 (GtkAction *action, GtkRadioAction *current, gpointer data);
292 static void sort_summary_type_cb (GtkAction *action, GtkRadioAction *current, gpointer data);
293 static void attract_by_subject_cb(GtkAction	*action,
294 				  gpointer	 data);
295 
296 static void delete_duplicated_cb (GtkAction	*action,
297 				  gpointer	 data);
298 static void delete_duplicated_all_cb (GtkAction	*action,
299 				  gpointer	 data);
300 static void filter_cb		 (GtkAction	*action,
301 				  gpointer	 data);
302 static void filter_list_cb	 (GtkAction	*action,
303 				  gpointer	 data);
304 static void process_cb		 (GtkAction	*action,
305 				  gpointer	 data);
306 static void execute_summary_cb	 (GtkAction	*action,
307 				  gpointer	 data);
308 static void expunge_summary_cb	 (GtkAction	*action,
309 				  gpointer	 data);
310 static void update_summary_cb	 (GtkAction	*action,
311 				  gpointer	 data);
312 
313 static void prev_cb		 (GtkAction	*action,
314 				  gpointer	 data);
315 static void next_cb		 (GtkAction	*action,
316 				  gpointer	 data);
317 static void next_unread_cb	 (GtkAction	*action,
318 				  gpointer	 data);
319 static void prev_unread_cb	 (GtkAction	*action,
320 				  gpointer	 data);
321 
322 static void prev_new_cb		 (GtkAction	*action,
323 				  gpointer	 data);
324 static void next_new_cb		 (GtkAction	*action,
325 				  gpointer	 data);
326 static void prev_marked_cb	 (GtkAction	*action,
327 				  gpointer	 data);
328 static void next_marked_cb	 (GtkAction	*action,
329 				  gpointer	 data);
330 static void prev_labeled_cb	 (GtkAction	*action,
331 				  gpointer	 data);
332 static void next_labeled_cb	 (GtkAction	*action,
333 				  gpointer	 data);
334 static void prev_history_cb	 (GtkAction	*action,
335 				  gpointer	 data);
336 static void next_history_cb	 (GtkAction	*action,
337 				  gpointer	 data);
338 static void parent_cb		 (GtkAction	*action,
339 				  gpointer	 data);
340 
341 static void goto_folder_cb	 (GtkAction	*action,
342 				  gpointer	 data);
343 static void goto_unread_folder_cb(GtkAction	*action,
344 				  gpointer	 data);
345 
346 static void scroll_prev_line_cb  (GtkAction      *action,
347                                   gpointer        data);
348 static void scroll_next_line_cb  (GtkAction      *action,
349                                   gpointer        data);
350 static void scroll_prev_page_cb  (GtkAction      *action,
351                                   gpointer        data);
352 static void scroll_next_page_cb  (GtkAction      *action,
353                                   gpointer        data);
354 
355 static void copy_cb		 (GtkAction	*action,
356 				  gpointer	 data);
357 static void allsel_cb		 (GtkAction	*action,
358 				  gpointer	 data);
359 static void select_thread_cb	 (GtkAction	*action,
360 				  gpointer	 data);
361 static void trash_thread_cb	 (GtkAction	*action,
362 				  gpointer	 data);
363 static void delete_thread_cb	 (GtkAction	*action,
364 				  gpointer	 data);
365 
366 static void create_filter_cb	 (GtkAction	*action,
367 				  gpointer	 data);
368 static void create_processing_cb (GtkAction	*action,
369 				  gpointer	 data);
370 static void open_urls_cb	 (GtkAction	*action,
371 				  gpointer	 data);
372 
373 static void prefs_template_open_cb	(GtkAction	*action,
374 				  gpointer	 data);
375 static void prefs_actions_open_cb	(GtkAction	*action,
376 				  gpointer	 data);
377 static void prefs_tags_open_cb		(GtkAction	*action,
378 				  gpointer	 data);
379 static void prefs_account_open_cb	(GtkAction	*action,
380 				  gpointer	 data);
381 
382 static void prefs_pre_processing_open_cb  (GtkAction	*action,
383 				  gpointer	 data);
384 
385 static void prefs_post_processing_open_cb (GtkAction	*action,
386 				  gpointer	 data);
387 
388 static void prefs_filtering_open_cb 	(GtkAction	*action,
389 				  gpointer	 data);
390 #ifdef USE_GNUTLS
391 static void ssl_manager_open_cb 	(GtkAction	*action,
392 				  gpointer	 data);
393 #endif
394 static void new_account_cb	 (GtkAction	*action,
395 				  gpointer	 data);
396 
397 static void account_selector_menu_cb	 (GtkMenuItem	*menuitem,
398 					  gpointer	 data);
399 static void account_receive_menu_cb	 (GtkMenuItem	*menuitem,
400 					  gpointer	 data);
401 #ifndef GENERIC_UMPC
402 static void account_compose_menu_cb	 (GtkMenuItem	*menuitem,
403 					  gpointer	 data);
404 #endif
405 static void prefs_open_cb	(GtkAction	*action,
406 				  gpointer	 data);
407 static void plugins_open_cb	(GtkAction	*action,
408 				  gpointer	 data);
409 
410 static void online_switch_clicked(GtkButton     *btn,
411 				  gpointer data);
412 
413 static void manual_open_cb	 (GtkAction	*action,
414 				  gpointer	 data);
415 static void manual_faq_open_cb	 (GtkAction	*action,
416 				  gpointer	 data);
417 
418 static void legend_open_cb	 (GtkAction	*action,
419 				  gpointer	 data);
420 
421 #ifdef G_OS_WIN32
422 static void set_default_client_cb (GtkAction	*action,
423 				  gpointer	 data);
424 #endif
425 
426 static void scan_tree_func	 (Folder	*folder,
427 				  FolderItem	*item,
428 				  gpointer	 data);
429 
430 static void toggle_work_offline_cb(GtkAction	*action,
431 				  gpointer	 data);
432 
433 static void addr_harvest_cb	 ( GtkAction	*action,
434 				  gpointer	 data );
435 
436 static void addr_harvest_msg_cb	 ( GtkAction	*action,
437 				  gpointer	 data );
438 static void sync_cb		 ( GtkAction	*action,
439 				  gpointer	 data );
440 
441 static void forget_session_passwords_cb	(GtkAction	*action,
442 					 gpointer	 data );
443 #ifndef PASSWORD_CRYPTO_OLD
444 static void forget_master_passphrase_cb	(GtkAction	*action,
445 					 gpointer	 data );
446 #endif
447 static gboolean mainwindow_focus_in_event	(GtkWidget	*widget,
448 						 GdkEventFocus	*focus,
449 						 gpointer	 data);
450 static gboolean mainwindow_visibility_event_cb	(GtkWidget	*widget,
451 						 GdkEventVisibility	*state,
452 						 gpointer	 data);
453 static gboolean mainwindow_state_event_cb	(GtkWidget	*widget,
454 						 GdkEventWindowState	*state,
455 						 gpointer	 data);
456 static void main_window_reply_cb			(GtkAction	*action,
457 				  gpointer	 data);
458 static gboolean mainwindow_progressindicator_hook	(gpointer 	 source,
459 						 gpointer 	 userdata);
460 
461 static gint mailing_list_create_submenu(MainWindow *mainwindow,
462 				       MsgInfo *msginfo);
463 
464 static gint mailing_list_populate_submenu(GtkWidget *menu, const gchar * list_header);
465 
466 static void get_url_part(const gchar **buf, gchar *url_decoded);
467 
468 static void mailing_list_compose(GtkWidget *w, gpointer *data);
469 
470 static void mailing_list_open_uri(GtkWidget *w, gpointer *data);
471 #define  SEPARATE_ACTION 500
472 static void mainwindow_quicksearch		(GtkAction	*action,
473 				  gpointer	 data);
474 static gboolean any_folder_want_synchronise(void);
475 
476 static void save_part_as_cb(GtkAction *action, gpointer data);
477 static void view_part_as_text_cb(GtkAction *action, gpointer data);
478 static void open_part_cb(GtkAction *action, gpointer data);
479 #ifndef G_OS_WIN32
480 static void open_part_with_cb(GtkAction *action, gpointer data);
481 #endif
482 static void check_signature_cb(GtkAction *action, gpointer data);
483 static void goto_next_part_cb(GtkAction *action, gpointer data);
484 static void goto_prev_part_cb(GtkAction *action, gpointer data);
485 #define DO_ACTION(name, act)	{ if (!strcmp(a_name, name)) action = act; }
486 
mainwindow_nothing_cb(GtkAction * action,gpointer data)487 static void mainwindow_nothing_cb	   (GtkAction *action, gpointer data)
488 {
489 
490 }
491 
about_cb(GtkAction * gaction,gpointer data)492 static void about_cb(GtkAction *gaction, gpointer data)
493 {
494 	about_show();
495 }
496 
mw_inc_mail_cb(GtkAction * gaction,gpointer data)497 static void	mw_inc_mail_cb			(GtkAction *gaction, gpointer data)
498 {
499 	inc_mail_cb(data, 0, NULL);
500 }
mw_inc_all_account_mail_cb(GtkAction * gaction,gpointer data)501 static void 	mw_inc_all_account_mail_cb		(GtkAction *gaction, gpointer data)
502 {
503 	inc_all_account_mail_cb(data, 0, NULL);
504 }
mw_send_queue_cb(GtkAction * gaction,gpointer data)505 static void 	mw_send_queue_cb			(GtkAction *gaction, gpointer data)
506 {
507 	send_queue_cb(data, 0, NULL);
508 }
mw_compose_mail_cb(GtkAction * gaction,gpointer data)509 static void 	mw_compose_mail_cb			(GtkAction *gaction, gpointer data)
510 {
511 	compose_mail_cb(data, 0, NULL);
512 }
mw_compose_news_cb(GtkAction * gaction,gpointer data)513 static void 	mw_compose_news_cb			(GtkAction *gaction, gpointer data)
514 {
515 	compose_news_cb(data, 0, NULL);
516 }
517 
518 static GtkActionEntry mainwin_entries[] =
519 {
520 	{"Menu",                        NULL, "Menu", NULL, NULL, NULL },
521 /* menus */
522 	{"File",                        NULL, N_("_File"), NULL, NULL, NULL },
523 	{"Edit",                        NULL, N_("_Edit"), NULL, NULL, NULL },
524 	{"View",                        NULL, N_("_View"), NULL, NULL, NULL },
525 	{"Message",                     NULL, N_("_Message"), NULL, NULL, NULL },
526 	{"Tools",                       NULL, N_("_Tools"), NULL, NULL, NULL },
527 	{"Configuration",               NULL, N_("_Configuration"), NULL, NULL, NULL },
528 	{"Help",                        NULL, N_("_Help"), NULL, NULL, NULL },
529 
530 /* File menu */
531 	{"File/AddMailbox",             NULL, N_("_Add mailbox"), NULL, NULL, NULL },
532 	{"File/AddMailbox/MH",          NULL, N_("MH..."), NULL, NULL, G_CALLBACK(add_mailbox_cb) },
533 	{"File/---",                    NULL, "---", NULL, NULL, NULL },
534 
535 	{"File/SortMailboxes",          NULL, N_("Change mailbox order..."), NULL, NULL, G_CALLBACK(foldersort_cb) },
536 
537 	/* {"File/---",                 NULL, "---", NULL, NULL, NULL }, */
538 	{"File/ImportMbox",             NULL, N_("_Import mbox file..."), NULL, NULL, G_CALLBACK(import_mbox_cb) },
539 	{"File/ExportMbox",             NULL, N_("_Export to mbox file..."), NULL, NULL, G_CALLBACK(export_mbox_cb) },
540 	{"File/ExportSelMbox",          NULL, N_("_Export selected to mbox file..."), NULL, NULL, G_CALLBACK(export_list_mbox_cb) },
541 	/* {"File/---",                 NULL, "---", NULL, NULL, NULL }, */
542 	{"File/EmptyTrashes",           NULL, N_("Empty all _Trash folders"), "<shift>D", NULL, G_CALLBACK(empty_trash_cb) },
543 	/* {"File/---",                 NULL, "---", NULL, NULL, NULL }, */
544 
545 	{"File/SaveAs",                 NULL, N_("_Save email as..."), "<control>S", NULL, G_CALLBACK(save_as_cb) },
546 	{"File/SavePartAs",             NULL, N_("_Save part as..."), "Y", NULL, G_CALLBACK(save_part_as_cb) },
547 	/* {"File/---",                 NULL, "---", NULL, NULL, NULL }, */
548 
549 	{"File/PageSetup",              NULL, N_("Page setup..."), NULL, NULL, G_CALLBACK(page_setup_cb) },
550 	{"File/Print",                  NULL, N_("_Print..."), "<control>P", NULL, G_CALLBACK(print_cb) },
551 	/* {"File/---",                 NULL, "---", NULL, NULL, NULL }, */
552 	{"File/SynchroniseFolders",     NULL, N_("Synchronise folders"), "<control><shift>S", NULL, G_CALLBACK(sync_cb) },
553 	/* {"File/---",                 NULL, "---", NULL, NULL, NULL }, */
554 	{"File/Exit",                   NULL, N_("E_xit"), "<control>Q", NULL, G_CALLBACK(app_exit_cb) },
555 
556 /* Edit menu */
557 	{"Edit/Copy",                   NULL, N_("_Copy"), "<control>C", NULL, G_CALLBACK(copy_cb) },
558 	{"Edit/SelectAll",              NULL, N_("Select _all"), "<control>A", NULL, G_CALLBACK(allsel_cb) },
559 	{"Edit/SelectThread",           NULL, N_("Select _thread"), NULL, NULL, G_CALLBACK(select_thread_cb) },
560 	{"Edit/---",                    NULL, "---", NULL, NULL, NULL },
561 	{"Edit/Find",                   NULL, N_("_Find in current message..."), "<control>F", NULL, G_CALLBACK(search_cb) },
562 	{"Edit/SearchFolder",			NULL, N_("_Search folder..."), "<shift><control>F", NULL, G_CALLBACK(search_folder_cb) },
563 	{"Edit/QuickSearch",			NULL, N_("_Quick search"), "slash", NULL, G_CALLBACK(mainwindow_quicksearch) },
564 
565 /* View menu */
566 	{"View/ShowHide",               NULL, N_("Show or hi_de"), NULL, NULL, NULL },
567 	{"View/ShowHide/Toolbar",       NULL, N_("_Toolbar"), NULL, NULL, NULL },
568 
569 	{"View/SetColumns",             NULL, N_("Set displayed _columns"), NULL, NULL, NULL },
570 	{"View/SetColumns/Folderlist",  NULL, N_("In _folder list..."), NULL, NULL, G_CALLBACK(set_folder_display_item_cb) },
571 	{"View/SetColumns/Messagelist", NULL, N_("In _message list..."), NULL, NULL, G_CALLBACK(set_summary_display_item_cb) },
572 	{"View/---",                    NULL, "---", NULL, NULL, NULL },
573 
574 
575 #ifndef GENERIC_UMPC
576 	{"View/Layout",                 NULL, N_("La_yout"), NULL, NULL, NULL },
577 #endif
578 	{"View/Sort",                   NULL, N_("_Sort"), NULL, NULL, NULL },
579 	{"View/Sort/---",               NULL, "---", NULL, NULL, NULL },
580 	{"View/Sort/AttractSubj",		NULL, N_("_Attract by subject"), NULL, NULL, G_CALLBACK(attract_by_subject_cb) },
581 
582 	{"View/ExpandThreads",			NULL, N_("E_xpand all threads"), NULL, NULL, G_CALLBACK(expand_threads_cb) },
583 	{"View/CollapseThreads",		NULL, N_("Co_llapse all threads"), NULL, NULL, G_CALLBACK(collapse_threads_cb) },
584 
585 	{"View/Goto",                   NULL, N_("_Go to"), NULL, NULL, NULL },
586 	{"View/Goto/Prev",              NULL, N_("_Previous message"), "P", NULL, G_CALLBACK(prev_cb) },
587 	{"View/Goto/Next",              NULL, N_("_Next message"), "N", NULL, G_CALLBACK(next_cb) },
588 	{"View/Goto/---",               NULL, "---", NULL, NULL, NULL },
589 	{"View/Goto/PrevUnread",        NULL, N_("P_revious unread message"), "<shift>P", NULL, G_CALLBACK(prev_unread_cb) },
590 	{"View/Goto/NextUnread",        NULL, N_("N_ext unread message"), "<shift>N", NULL, G_CALLBACK(next_unread_cb) },
591 	/* {"View/Goto/---",            NULL, "---", NULL, NULL, NULL }, */
592 	{"View/Goto/PrevNew",           NULL, N_("Previous ne_w message"), NULL, NULL, G_CALLBACK(prev_new_cb) },
593 	{"View/Goto/NextNew",           NULL, N_("Ne_xt new message"), NULL, NULL, G_CALLBACK(next_new_cb) },
594 	/* {"View/Goto/---",            NULL, "---", NULL, NULL, NULL }, */
595 	{"View/Goto/PrevMarked",        NULL, N_("Previous _marked message"), NULL, NULL, G_CALLBACK(prev_marked_cb) },
596 	{"View/Goto/NextMarked",        NULL, N_("Next m_arked message"), NULL, NULL, G_CALLBACK(next_marked_cb) },
597 	/* {"View/Goto/---",            NULL, "---", NULL, NULL, NULL }, */
598 	{"View/Goto/PrevLabeled",       NULL, N_("Previous _labeled message"), NULL, NULL, G_CALLBACK(prev_labeled_cb) },
599 	{"View/Goto/NextLabeled",       NULL, N_("Next la_beled message"), NULL, NULL, G_CALLBACK(next_labeled_cb) },
600 	/* {"View/Goto/---",            NULL, "---", NULL, NULL, NULL }, */
601 	{"View/Goto/PrevHistory",       NULL, N_("Previous opened message"), "<alt>Left", NULL, G_CALLBACK(prev_history_cb) },
602 	{"View/Goto/NextHistory",       NULL, N_("Next opened message"), "<alt>Right", NULL, G_CALLBACK(next_history_cb) },
603 	/* {"View/Goto/---",            NULL, "---", NULL, NULL, NULL }, */
604 	{"View/Goto/ParentMessage",     NULL, N_("Parent message"), "<control>Up", NULL, G_CALLBACK(parent_cb) },
605 	/* {"View/Goto/---",            NULL, "---", NULL, NULL, NULL }, */
606 	{"View/Goto/NextUnreadFolder",  NULL, N_("Next unread _folder"), "<shift>G", NULL, G_CALLBACK(goto_unread_folder_cb) },
607 	{"View/Goto/Folder",            NULL, N_("F_older..."), "G", NULL, G_CALLBACK(goto_folder_cb) },
608 	/* {"View/Goto/---",            NULL, "---", NULL, NULL, NULL }, */
609 	{"View/Goto/NextPart",          NULL, N_("Next part"), "A", NULL, G_CALLBACK(goto_next_part_cb) },
610 	{"View/Goto/PrevPart",          NULL, N_("Previous part"), "Z", NULL, G_CALLBACK(goto_prev_part_cb) },
611 
612 	/* {"View/Scroll/---",          NULL, "---", NULL, NULL, NULL }, */
613 	{"View/Scroll",                 NULL, N_("Message scroll"), NULL, NULL, NULL },
614 	{"View/Scroll/PrevLine",        NULL, N_("Previous line"), NULL, NULL, G_CALLBACK(scroll_prev_line_cb) },
615 	{"View/Scroll/NextLine",        NULL, N_("Next line"), NULL, NULL, G_CALLBACK(scroll_next_line_cb) },
616 	{"View/Scroll/PrevPage",        NULL, N_("Previous page"), NULL, NULL, G_CALLBACK(scroll_prev_page_cb) },
617 	{"View/Scroll/NextPage",        NULL, N_("Next page"), NULL, NULL, G_CALLBACK(scroll_next_page_cb) },
618 
619 	/* {"View/---",                 NULL, "---", NULL, NULL, NULL }, */
620 	{"View/Encoding",               NULL, N_("Character _encoding"), NULL, NULL, NULL }, /* set_charset_cb */
621 	{"View/Encoding/---",           NULL, "---", NULL, NULL, NULL },
622 #define ENC_ACTION(cs_char,c_char,string) \
623 	{ "View/Encoding/" cs_char, NULL, N_(string), NULL, NULL, c_char }
624 
625 	{"View/Encoding/Western",       NULL, N_("Western European"), NULL, NULL, NULL },
626 	{"View/Encoding/Baltic",        NULL, N_("Baltic"), NULL, NULL, NULL },
627 	{"View/Encoding/Hebrew",        NULL, N_("Hebrew"), NULL, NULL, NULL },
628 	{"View/Encoding/Arabic",        NULL, N_("Arabic"), NULL, NULL, NULL },
629 	{"View/Encoding/Cyrillic",      NULL, N_("Cyrillic"), NULL, NULL, NULL },
630 	{"View/Encoding/Japanese",      NULL, N_("Japanese"), NULL, NULL, NULL },
631 	{"View/Encoding/Chinese",       NULL, N_("Chinese"), NULL, NULL, NULL },
632 	{"View/Encoding/Korean",        NULL, N_("Korean"), NULL, NULL, NULL },
633 	{"View/Encoding/Thai",          NULL, N_("Thai"), NULL, NULL, NULL },
634 
635 	{"View/Decode",                 NULL, N_("Decode"), NULL, NULL, NULL }, /* set_decode_cb */
636 	{"View/Decode/---",             NULL, "---", NULL, NULL, NULL },
637 
638 #define DEC_ACTION(cs_type,c_type,string) \
639 	{ "View/Decode/" cs_type, NULL, N_(string), NULL, NULL, c_type }
640 
641 	/* {"View/---",                 NULL, "---", NULL, NULL, NULL }, */
642 	{"View/OpenNewWindow",          NULL, N_("Open in new _window"), "<control><alt>N", NULL, G_CALLBACK(open_msg_cb) },
643 	{"View/MessageSource",          NULL, N_("Mess_age source"), "<control>U", NULL, G_CALLBACK(view_source_cb) },
644 	/* {"View/---",                 NULL, "---", NULL, NULL, NULL }, */
645 	{"View/Part",                   NULL, N_("Message part"), NULL, NULL, NULL },
646 	{"View/Part/AsText",            NULL, N_("View as text"), "T", NULL, G_CALLBACK(view_part_as_text_cb) },
647 	{"View/Part/Open",              NULL, N_("Open"), "L", NULL, G_CALLBACK(open_part_cb) },
648 #ifndef G_OS_WIN32
649 	{"View/Part/OpenWith",          NULL, N_("Open with..."), "O", NULL, G_CALLBACK(open_part_with_cb) },
650 #endif
651 	/* {"View/---",                 NULL, "---", NULL, NULL, NULL }, */
652 
653 	{"View/Quotes",                 NULL, N_("Quotes"), NULL, NULL, NULL },
654 	/* {"View/---",                 NULL, "---", NULL, NULL, NULL }, */
655 	{"View/UpdateSummary",          NULL, N_("_Update summary"), "<control><alt>U", NULL, G_CALLBACK(update_summary_cb) },
656 
657 /* Message menu */
658 	{"Message/Receive",                              NULL, N_("Recei_ve"), NULL, NULL, NULL },
659 	{"Message/Receive/CurrentAccount",               NULL, N_("Get from _current account"), "<control>I", NULL, G_CALLBACK(mw_inc_mail_cb) },
660 	{"Message/Receive/AllAccounts",                  NULL, N_("Get from _all accounts"), "<shift><control>I", NULL, G_CALLBACK(mw_inc_all_account_mail_cb) },
661 	{"Message/Receive/CancelReceiving",              NULL, N_("Cancel receivin_g"), NULL, NULL, G_CALLBACK(inc_cancel_cb) },
662 	{"Message/Receive/---",                          NULL, "---", NULL, NULL, NULL },
663 	{"Message/Receive/PlaceHolder",                  NULL, "PlaceHolder,", NULL, NULL, G_CALLBACK(mainwindow_nothing_cb) },
664 	{"Message/SendQueue",                            NULL, N_("_Send queued messages"), NULL, NULL, G_CALLBACK(mw_send_queue_cb) },
665 	{"Message/CancelSending",                        NULL, N_("Cancel sending"), NULL, NULL, G_CALLBACK(send_cancel_cb) },
666 
667 	{"Message/---",                                  NULL, "---", NULL, NULL, NULL },
668 
669 	{"Message/ComposeEmail",                         NULL, N_("Compose a_n email message"), "<control>M", NULL, G_CALLBACK(mw_compose_mail_cb) },
670 	{"Message/ComposeNews",                          NULL, N_("Compose a news message"), NULL, NULL, G_CALLBACK(mw_compose_news_cb) },
671 
672 	{"Message/Reply",                                NULL, N_("_Reply"), "<control>R", NULL, G_CALLBACK(main_window_reply_cb) }, /* COMPOSE_REPLY */
673 	{"Message/ReplyTo",                              NULL, N_("Repl_y to"), NULL, NULL, NULL },
674 	{"Message/ReplyTo/All",                          NULL, N_("_All"), "<control><shift>R", NULL, G_CALLBACK(main_window_reply_cb) }, /* COMPOSE_REPLY_TO_ALL */
675 	{"Message/ReplyTo/Sender",                       NULL, N_("_Sender"), NULL, NULL, G_CALLBACK(main_window_reply_cb) }, /* COMPOSE_REPLY_TO_SENDER */
676 	{"Message/ReplyTo/List",                         NULL, N_("Mailing _list"), "<control>L", NULL, G_CALLBACK(main_window_reply_cb) }, /* COMPOSE_REPLY_TO_LIST */
677 	{"Message/FollowupReply",                        NULL, N_("Follow-up and reply to"), NULL, NULL, G_CALLBACK(main_window_reply_cb) }, /* COMPOSE_FOLLOWUP_AND_REPLY_TO */
678 	/* {"Message/---",                               NULL, "---", NULL, NULL, NULL }, */
679 
680 	{"Message/Forward",                              NULL, N_("_Forward"), "<control><alt>F", NULL, G_CALLBACK(main_window_reply_cb) }, /* COMPOSE_FORWARD_INLINE */
681 	{"Message/ForwardAtt",                           NULL, N_("For_ward as attachment"), NULL, NULL, G_CALLBACK(main_window_reply_cb) }, /* COMPOSE_FORWARD_AS_ATTACH */
682 	{"Message/Redirect",                             NULL, N_("Redirec_t"), NULL, NULL, G_CALLBACK(main_window_reply_cb) }, /* COMPOSE_REDIRECT */
683 
684 	{"Message/MailingList",                          NULL, N_("Mailing-_List"), NULL, NULL, NULL },
685 	{"Message/MailingList/Post",                     NULL, N_("Post"), NULL, NULL, NULL },
686 	{"Message/MailingList/Post/PlaceHolder",         NULL, "Placeholder", NULL, NULL, G_CALLBACK(mainwindow_nothing_cb) },
687 	{"Message/MailingList/Help",                     NULL, N_("Help"), NULL, NULL, NULL },
688 	{"Message/MailingList/Help/PlaceHolder",         NULL, "Placeholder", NULL, NULL, G_CALLBACK(mainwindow_nothing_cb) },
689 	{"Message/MailingList/Subscribe",                NULL, N_("Subscribe"), NULL, NULL, NULL },
690 	{"Message/MailingList/Subscribe/PlaceHolder",    NULL, "Placeholder", NULL, NULL, G_CALLBACK(mainwindow_nothing_cb) },
691 	{"Message/MailingList/Unsubscribe",              NULL, N_("Unsubscribe"), NULL, NULL, NULL },
692 	{"Message/MailingList/Unsubscribe/PlaceHolder",  NULL, "Placeholder", NULL, NULL, G_CALLBACK(mainwindow_nothing_cb) },
693 	{"Message/MailingList/ViewArchive",              NULL, N_("View archive"), NULL, NULL, NULL },
694 	{"Message/MailingList/ViewArchive/PlaceHolder",  NULL, "Placeholder", NULL, NULL, G_CALLBACK(mainwindow_nothing_cb) },
695 	{"Message/MailingList/ContactOwner",             NULL, N_("Contact owner"), NULL, NULL, NULL },
696 	{"Message/MailingList/ContactOwner/PlaceHolder", NULL, "Placeholder", NULL, NULL, G_CALLBACK(mainwindow_nothing_cb) },
697 	/* separation */
698 
699 	{"Message/Move",                             NULL, N_("M_ove..."), "<control>O", NULL, G_CALLBACK(move_to_cb) },
700 	{"Message/Copy",                             NULL, N_("_Copy..."), "<shift><control>O", NULL, G_CALLBACK(copy_to_cb) },
701 	{"Message/Trash",                            NULL, N_("Move to _trash"), "<control>D", NULL, G_CALLBACK(delete_trash_cb) },
702 	{"Message/Delete",                           NULL, N_("_Delete..."), NULL, NULL, G_CALLBACK(delete_cb) },
703 	{"Message/TrashThread",                      NULL, N_("Move thread to tr_ash"), NULL, NULL, G_CALLBACK(trash_thread_cb) },
704 	{"Message/DeleteThread",                     NULL, N_("Delete t_hread"), NULL, NULL, G_CALLBACK(delete_thread_cb) },
705 	{"Message/CancelNews",                       NULL, N_("Cancel a news message"), NULL, NULL, G_CALLBACK(cancel_cb) },
706 	/* separation */
707 
708 	{"Message/Mark",                             NULL, N_("_Mark"), NULL, NULL, NULL },
709 	{"Message/Mark/Mark",                        NULL, N_("_Mark"), "<shift>asterisk", NULL, G_CALLBACK(mark_cb) },
710 	{"Message/Mark/Unmark",                      NULL, N_("_Unmark"), "U", NULL, G_CALLBACK(unmark_cb) },
711 	{"Message/Mark/---",                         NULL, "---", NULL, NULL, NULL },
712 
713 	{"Message/Mark/MarkRead",                    NULL, N_("Mark as rea_d"), NULL, NULL, G_CALLBACK(mark_as_read_cb) },
714 	{"Message/Mark/MarkUnread",                  NULL, N_("Mark as unr_ead"), "<shift>exclam", NULL, G_CALLBACK(mark_as_unread_cb) },
715 	/* separation */
716 	{"Message/Mark/MarkAllRead",                 NULL, N_("Mark all read in folder"), NULL, NULL, G_CALLBACK(mark_all_read_cb) },
717 	{"Message/Mark/MarkAllUnread",               NULL, N_("Mark all unread in folder"), NULL, NULL, G_CALLBACK(mark_all_unread_cb) },
718 	/* separation */
719 	{"Message/Mark/IgnoreThread",                NULL, N_("Ignore thread"), NULL, NULL, G_CALLBACK(ignore_thread_cb) },
720 	{"Message/Mark/UnignoreThread",              NULL, N_("Unignore thread"), NULL, NULL, G_CALLBACK(unignore_thread_cb) },
721 	{"Message/Mark/WatchThread",                 NULL, N_("Watch thread"), NULL, NULL, G_CALLBACK(watch_thread_cb) },
722 	{"Message/Mark/UnwatchThread",               NULL, N_("Unwatch thread"), NULL, NULL, G_CALLBACK(unwatch_thread_cb) },
723 	/* separation */
724 
725 	{"Message/Mark/MarkSpam",                    NULL, N_("Mark as _spam"), NULL, NULL, G_CALLBACK(mark_as_spam_cb) },
726 	{"Message/Mark/MarkHam",                     NULL, N_("Mark as _ham"), NULL, NULL, G_CALLBACK(mark_as_ham_cb) },
727 	/* separation */
728 
729 	{"Message/Mark/Lock",                        NULL, N_("Lock"), NULL, NULL, G_CALLBACK(lock_msgs_cb) },
730 	{"Message/Mark/Unlock",                      NULL, N_("Unlock"), NULL, NULL, G_CALLBACK(unlock_msgs_cb) },
731 
732 	{"Message/ColorLabel",                       NULL, N_("Color la_bel"), NULL, NULL, NULL },
733 	{"Message/Tags",                             NULL, N_("Ta_gs"), NULL, NULL, NULL },
734 	/*{"Message/---",                            NULL, "---", NULL, NULL, NULL },*/
735 
736 	{"Message/Reedit",                           NULL, N_("Re-_edit"), NULL, NULL, G_CALLBACK(reedit_cb) },
737 	/*{"Message/---",                            NULL, "---", NULL, NULL, NULL },*/
738 
739 	{"Message/CheckSignature",                   NULL, N_("Check signature"), "C", NULL, G_CALLBACK(check_signature_cb) },
740 
741 /* Tools menu */
742 
743 	{"Tools/AddressBook",                        NULL, N_("_Address book"), "<control><shift>A", NULL, G_CALLBACK(addressbook_open_cb) },
744 	{"Tools/AddSenderToAB",                      NULL, N_("Add sender to address boo_k"), NULL, NULL, G_CALLBACK(add_address_cb) },
745 
746 	{"Tools/CollectAddresses",                   NULL, N_("C_ollect addresses"), NULL, NULL, NULL },
747 	{"Tools/CollectAddresses/FromFolder",        NULL, N_("From current _folder..."), NULL, NULL, G_CALLBACK(addr_harvest_cb) },
748 	{"Tools/CollectAddresses/FromSelected",      NULL, N_("From selected _messages..."), NULL, NULL, G_CALLBACK(addr_harvest_msg_cb) },
749 	{"Tools/---",                                NULL, "---", NULL, NULL, NULL },
750 
751 	{"Tools/FilterFolder",                       NULL, N_("_Filter all messages in folder"), NULL, NULL, G_CALLBACK(filter_cb) },
752 	{"Tools/FilterSelected",                     NULL, N_("Filter _selected messages"), NULL, NULL, G_CALLBACK(filter_list_cb) },
753 	{"Tools/RunProcessing",                      NULL, N_("Run folder pr_ocessing rules"), NULL, NULL, G_CALLBACK(process_cb) },
754 
755 	{"Tools/CreateFilterRule",                   NULL, N_("_Create filter rule"), NULL, NULL, NULL },
756 	{"Tools/CreateFilterRule/Automatically",     NULL, N_("_Automatically"), NULL, NULL, G_CALLBACK(create_filter_cb) }, /* FILTER_BY_AUTO */
757 	{"Tools/CreateFilterRule/ByFrom",            NULL, N_("By _From"), NULL, NULL, G_CALLBACK(create_filter_cb) }, /* FILTER_BY_FROM */
758 	{"Tools/CreateFilterRule/ByTo",              NULL, N_("By _To"), NULL, NULL, G_CALLBACK(create_filter_cb) }, /* FILTER_BY_TO     */
759 	{"Tools/CreateFilterRule/BySubject",         NULL, N_("By _Subject"), NULL, NULL, G_CALLBACK(create_filter_cb) }, /* FILTER_BY_SUBJECT */
760 
761 	{"Tools/CreateProcessingRule",               NULL, N_("Create processing rule"), NULL, NULL, NULL },
762 	{"Tools/CreateProcessingRule/Automatically", NULL, N_("_Automatically"), NULL, NULL, G_CALLBACK(create_processing_cb) },
763 	{"Tools/CreateProcessingRule/ByFrom",        NULL, N_("By _From"), NULL, NULL, G_CALLBACK(create_processing_cb) },
764 	{"Tools/CreateProcessingRule/ByTo",          NULL, N_("By _To"), NULL, NULL, G_CALLBACK(create_processing_cb) },
765 	{"Tools/CreateProcessingRule/BySubject",     NULL, N_("By _Subject"), NULL, NULL, G_CALLBACK(create_processing_cb) },
766 	/* {"Tools/---",                             NULL, "---", NULL, NULL, NULL }, */
767 
768 	{"Tools/ListUrls",                           NULL, N_("List _URLs..."), "<control><shift>U", NULL, G_CALLBACK(open_urls_cb) },
769 
770 	/* {"Tools/---",                             NULL, "---", NULL, NULL, NULL }, */
771 	{"Tools/Actions",                            NULL, N_("Actio_ns"), NULL, NULL, NULL },
772 	{"Tools/Actions/PlaceHolder",                NULL, "Placeholder", NULL, NULL, G_CALLBACK(mainwindow_nothing_cb) },
773 	/* {"Tools/---",                             NULL, "---", NULL, NULL, NULL }, */
774 
775 	{"Tools/CheckNewMessages",                   NULL, N_("Ch_eck for new messages in all folders"), NULL, NULL, G_CALLBACK(update_folderview_cb) },
776 	{"Tools/DeleteDuplicates",                   NULL, N_("Delete du_plicated messages"), NULL, NULL, NULL },
777 	{"Tools/DeleteDuplicates/SelFolder",         NULL, N_("In selected folder"), NULL, NULL, G_CALLBACK(delete_duplicated_cb) },
778 	{"Tools/DeleteDuplicates/AllFolders",        NULL, N_("In all folders"), NULL, NULL, G_CALLBACK(delete_duplicated_all_cb) },
779 	/* {"Tools/---",                             NULL, "---", NULL, NULL, NULL }, */
780 
781 	{"Tools/Execute",                            NULL, N_("E_xecute"), "X", NULL, G_CALLBACK(execute_summary_cb) },
782 	{"Tools/Expunge",                            NULL, N_("Exp_unge"), "<control>E", NULL, G_CALLBACK(expunge_summary_cb) },
783 #ifdef USE_GNUTLS
784 	/* {"Tools/---",                             NULL, "---", NULL, NULL, NULL }, */
785 	{"Tools/SSLCertificates",                    NULL, N_("SSL/TLS cer_tificates"), NULL, NULL, G_CALLBACK(ssl_manager_open_cb) },
786 #endif
787 	/* {"Tools/---",                             NULL, "---", NULL, NULL, NULL }, */
788 	{"Tools/FilteringLog",                       NULL, N_("Filtering Lo_g"), NULL, NULL, G_CALLBACK(filtering_debug_window_show_cb) },
789 	{"Tools/NetworkLog",                         NULL, N_("Network _Log"), "<shift><control>L", NULL, G_CALLBACK(log_window_show_cb) },
790 #ifdef G_OS_WIN32
791 	{"Tools/DebugLog",                           NULL, N_("Debug _Log"), NULL, NULL, G_CALLBACK(debug_log_show_cb) },
792 #endif
793 	/* {"Tools/---",                             NULL, "---", NULL, NULL, NULL }, */
794 	{"Tools/ForgetSessionPasswords",             NULL, N_("_Forget all session passwords"), NULL, NULL, G_CALLBACK(forget_session_passwords_cb) },
795 #ifndef PASSWORD_CRYPTO_OLD
796 	{"Tools/ForgetMasterPassphrase",             NULL, N_("Forget _master passphrase"), NULL, NULL, G_CALLBACK(forget_master_passphrase_cb) },
797 #endif
798 
799 /* Configuration menu */
800 	{"Configuration/ChangeAccount",              NULL, N_("C_hange current account"), NULL, NULL, NULL },
801 	{"Configuration/ChangeAccount/PlaceHolder",  NULL, "Placeholder", NULL, NULL, G_CALLBACK(mainwindow_nothing_cb) },
802 	{"Configuration/AccountPrefs",               NULL, N_("_Preferences for current account..."), NULL, NULL, G_CALLBACK(prefs_account_open_cb) },
803 	{"Configuration/CreateAccount",              NULL, N_("Create _new account..."), NULL, NULL, G_CALLBACK(new_account_cb) },
804 	{"Configuration/EditAccounts",               NULL, N_("_Edit accounts..."), NULL, NULL, G_CALLBACK(account_edit_open) },
805 	{"Configuration/---",                        NULL, "---", NULL, NULL, NULL },
806 
807 	{"Configuration/Preferences",                NULL, N_("P_references..."), NULL, NULL, G_CALLBACK(prefs_open_cb) },
808 	{"Configuration/PreProcessing",              NULL, N_("Pre-pr_ocessing..."), NULL, NULL, G_CALLBACK(prefs_pre_processing_open_cb) },
809 	{"Configuration/PostProcessing",             NULL, N_("Post-pro_cessing..."), NULL, NULL, G_CALLBACK(prefs_post_processing_open_cb) },
810 	{"Configuration/Filtering",                  NULL, N_("_Filtering..."), NULL, NULL, G_CALLBACK(prefs_filtering_open_cb) },
811 	{"Configuration/Templates",                  NULL, N_("_Templates..."), NULL, NULL, G_CALLBACK(prefs_template_open_cb) },
812 	{"Configuration/Actions",                    NULL, N_("_Actions..."), NULL, NULL, G_CALLBACK(prefs_actions_open_cb) },
813 	{"Configuration/Tags",                       NULL, N_("Tag_s..."), NULL, NULL, G_CALLBACK(prefs_tags_open_cb) },
814 	/* {"Configuration/---",                     NULL, "---", NULL, NULL, NULL }, */
815 	{"Configuration/Plugins",                    NULL, N_("Plu_gins..."), NULL, NULL, G_CALLBACK(plugins_open_cb) },
816 
817 /* Help menu */
818 	{"Help/Manual",                              NULL, N_("_Manual"), NULL, NULL, G_CALLBACK(manual_open_cb) },
819 	{"Help/FAQ",                                 NULL, N_("_Online User-contributed FAQ"), NULL, NULL, G_CALLBACK(manual_faq_open_cb) },
820 	{"Help/IconLegend",                          NULL, N_("Icon _Legend"), NULL, NULL, G_CALLBACK(legend_open_cb) },
821 #ifdef G_OS_WIN32
822 	{"Help/SetDefault",                          NULL, N_("Set as default client"), NULL, NULL, G_CALLBACK(set_default_client_cb) },
823 #endif
824 	{"Help/---",                                 NULL, "---", NULL, NULL, NULL },
825 	{"Help/About",                               NULL, N_("_About"), NULL, NULL, G_CALLBACK(about_cb) },
826 };
827 
828 static GtkToggleActionEntry mainwin_toggle_entries[] = {
829 	{"File/OfflineMode",                     NULL, N_("Offline _mode"), "<control>W", NULL, G_CALLBACK(toggle_work_offline_cb), FALSE }, /*toggle*/
830 	{"View/ShowHide/MenuBar",                NULL, N_("Men_ubar"), "<control>F12", NULL, G_CALLBACK(toggle_menubar_cb), FALSE }, /* toggle */
831 	{"View/ShowHide/MessageView",            NULL, N_("_Message view"), "V", NULL, G_CALLBACK(toggle_message_cb), FALSE }, /* toggle */
832 #ifndef GENERIC_UMPC
833 	{"View/ShowHide/StatusBar",              NULL, N_("Status _bar"), NULL, NULL, G_CALLBACK(toggle_statusbar_cb), FALSE }, /* toggle */
834 #endif
835 	{"View/ShowHide/ColumnHeaders",          NULL, N_("Column headers"), NULL, NULL, G_CALLBACK(toggle_col_headers_cb), FALSE }, /* toggle */
836 	{"View/ThreadView",                      NULL, N_("Th_read view"), "<control>T", NULL, G_CALLBACK(thread_cb), FALSE }, /* toggle */
837 	{"View/HideReadThreads",                 NULL, N_("Hide read threads"), NULL, NULL, G_CALLBACK(hide_read_threads), FALSE }, /* toggle */
838 	{"View/HideReadMessages",                NULL, N_("_Hide read messages"), NULL, NULL, G_CALLBACK(hide_read_messages), FALSE }, /* toggle */
839 	{"View/HideDelMessages",                 NULL, N_("Hide deleted messages"), NULL, NULL, G_CALLBACK(hide_del_messages), FALSE }, /* toggle */
840 	{"View/FullScreen",                      NULL, N_("_Fullscreen"), "F11", NULL, G_CALLBACK(toggle_fullscreen_cb), FALSE }, /* toggle */
841 	{"View/AllHeaders",                      NULL, N_("Show all _headers"), "<control>H", NULL, G_CALLBACK(show_all_header_cb), FALSE }, /* toggle */
842 	{"View/Quotes/CollapseAll",              NULL, N_("_Collapse all"), "<control><shift>Q", NULL, G_CALLBACK(hide_quotes_cb), FALSE }, /* 1 toggle */
843 	{"View/Quotes/Collapse2",                NULL, N_("Collapse from level _2"), NULL, NULL, G_CALLBACK(hide_quotes_cb), FALSE }, /* 2 toggle */
844 	{"View/Quotes/Collapse3",                NULL, N_("Collapse from level _3"), NULL, NULL, G_CALLBACK(hide_quotes_cb), FALSE }, /* 3 toggle */
845 };
846 
847 static GtkRadioActionEntry mainwin_showhide_radio_entries[] = { /* toggle_toolbar_cb */
848 	{"View/ShowHide/Toolbar/TextBelowIcon",  NULL, N_("Text _below icons"), NULL, NULL, TOOLBAR_BOTH }, /* radio TOOLBAR_BOTH */
849 	{"View/ShowHide/Toolbar/TextBesideIcon", NULL, N_("Text be_side icons"), NULL, NULL, TOOLBAR_BOTH_HORIZ }, /* radio TOOLBAR_BOTH_HORIZ */
850 	{"View/ShowHide/Toolbar/IconOnly",       NULL, N_("_Icons only"), NULL, NULL, TOOLBAR_ICON }, /* radio TOOLBAR_ICON */
851 	{"View/ShowHide/Toolbar/TextOnly",       NULL, N_("_Text only"), NULL, NULL, TOOLBAR_TEXT }, /* radio TOOLBAR_TEXT */
852 #ifndef GENERIC_UMPC
853 	{"View/ShowHide/Toolbar/Hide",           NULL, N_("_Hide"), NULL, NULL, TOOLBAR_NONE }, /* radio TOOLBAR_NONE */
854 #endif
855 };
856 #ifndef GENERIC_UMPC
857 static GtkRadioActionEntry mainwin_layout_radio_entries[] = { /* set_layout_cb */
858 	{"View/Layout/Standard",                 NULL, N_("_Standard"), NULL, NULL, NORMAL_LAYOUT }, /* radio NORMAL_LAYOUT */
859 	{"View/Layout/ThreeColumns",             NULL, N_("_Three columns"), NULL, NULL, VERTICAL_LAYOUT }, /* radio VERTICAL_LAYOUT */
860 	{"View/Layout/WideMessage",              NULL, N_("_Wide message"), NULL, NULL, WIDE_LAYOUT }, /* radio WIDE_LAYOUT */
861 	{"View/Layout/WideMessageList",          NULL, N_("W_ide message list"), NULL, NULL, WIDE_MSGLIST_LAYOUT }, /* radio WIDE_MSGLIST_LAYOUT */
862 	{"View/Layout/SmallScreen",              NULL, N_("S_mall screen"), NULL, NULL, SMALL_LAYOUT }, /* radio SMALL_LAYOUT */
863 };
864 #endif
865 static GtkRadioActionEntry mainwin_sort_radio_entries[] = { /* sort_summary_cb */
866 	{"View/Sort/Number",                     NULL, N_("By _number"), NULL, NULL, SORT_BY_NUMBER }, /* radio SORT_BY_NUMBER */
867 	{"View/Sort/Size",                       NULL, N_("By s_ize"), NULL, NULL, SORT_BY_SIZE }, /* radio SORT_BY_SIZE */
868 	{"View/Sort/Date",                       NULL, N_("By _date"), NULL, NULL, SORT_BY_DATE }, /* radio SORT_BY_DATE */
869 	{"View/Sort/ThreadDate",                 NULL, N_("By thread date"), NULL, NULL, SORT_BY_THREAD_DATE }, /* radio SORT_BY_THREAD_DATE */
870 	{"View/Sort/From",                       NULL, N_("By _From"), NULL, NULL, SORT_BY_FROM }, /* radio SORT_BY_FROM */
871 	{"View/Sort/To",                         NULL, N_("By _To"), NULL, NULL, SORT_BY_TO }, /* radio SORT_BY_TO */
872 	{"View/Sort/Subject",                    NULL, N_("By s_ubject"), NULL, NULL, SORT_BY_SUBJECT }, /* radio SORT_BY_SUBJECT */
873 	{"View/Sort/Color",                      NULL, N_("By _color label"), NULL, NULL, SORT_BY_LABEL }, /* radio SORT_BY_LABEL */
874 	{"View/Sort/Tag",                        NULL, N_("By tag"), NULL, NULL, SORT_BY_TAGS }, /* radio SORT_BY_TAGS */
875 	{"View/Sort/Mark",                       NULL, N_("By _mark"), NULL, NULL, SORT_BY_MARK }, /* radio SORT_BY_MARK */
876 	{"View/Sort/Status",                     NULL, N_("By _status"), NULL, NULL, SORT_BY_STATUS }, /* radio SORT_BY_STATUS */
877 	{"View/Sort/Attachment",                 NULL, N_("By a_ttachment"), NULL, NULL, SORT_BY_MIME }, /* radio SORT_BY_MIME */
878 	{"View/Sort/Score",                      NULL, N_("By score"), NULL, NULL, SORT_BY_SCORE }, /* radio SORT_BY_SCORE */
879 	{"View/Sort/Locked",                     NULL, N_("By locked"), NULL, NULL, SORT_BY_LOCKED }, /* radio SORT_BY_LOCKED */
880 	{"View/Sort/DontSort",                   NULL, N_("D_on't sort"), NULL, NULL, SORT_BY_NONE }, /* radio SORT_BY_NONE */
881 };
882 
883 static GtkRadioActionEntry mainwin_sorttype_radio_entries[] = { /* sort_summary_type_cb */
884 	{"View/Sort/Ascending",                  NULL, N_("Ascending"), NULL, NULL, SORT_ASCENDING }, /* radio SORT_ASCENDING */
885 	{"View/Sort/Descending",                 NULL, N_("Descending"), NULL, NULL, SORT_DESCENDING }, /* radio SORT_DESCENDING */
886 };
887 
888 static GtkRadioActionEntry mainwin_radio_enc_entries[] =
889 {
890 	ENC_ACTION(CS_AUTO, C_AUTO, N_("_Automatic")), /* RADIO set_charset_cb */
891 	ENC_ACTION(CS_US_ASCII, C_US_ASCII, N_("7bit ASCII (US-ASC_II)")), /* RADIO set_charset_cb */
892 	ENC_ACTION(CS_UTF_8, C_UTF_8, N_("Unicode (_UTF-8)")), /* RADIO set_charset_cb */
893 	ENC_ACTION("Western/"CS_ISO_8859_1, C_ISO_8859_1, "ISO-8859-_1"), /* RADIO set_charset_cb */
894 	ENC_ACTION("Western/"CS_ISO_8859_15, C_ISO_8859_15, "ISO-8859-15"), /* RADIO set_charset_cb */
895 	ENC_ACTION("Western/"CS_WINDOWS_1252, C_WINDOWS_1252, "Windows-1252"), /* RADIO set_charset_cb */
896 	ENC_ACTION(CS_ISO_8859_2, C_ISO_8859_2, N_("Central European (ISO-8859-_2)")), /* RADIO set_charset_cb */
897 	ENC_ACTION("Baltic/"CS_ISO_8859_13, C_ISO_8859_13, "ISO-8859-13"), /* RADIO set_charset_cb */
898 	ENC_ACTION("Baltic/"CS_ISO_8859_4, C_ISO_8859_14, "ISO-8859-_4"), /* RADIO set_charset_cb */
899 	ENC_ACTION(CS_ISO_8859_7, C_ISO_8859_7, N_("Greek (ISO-8859-_7)")), /* RADIO set_charset_cb */
900 	ENC_ACTION("Hebrew/"CS_ISO_8859_8, C_ISO_8859_8, "ISO-8859-_8"), /* RADIO set_charset_cb */
901 	ENC_ACTION("Hebrew/"CS_WINDOWS_1255, C_WINDOWS_1255, "Windows-1255"), /* RADIO set_charset_cb */
902 	ENC_ACTION("Arabic/"CS_ISO_8859_6, C_ISO_8859_6, "ISO-8859-_6"), /* RADIO set_charset_cb */
903 	ENC_ACTION("Arabic/"CS_WINDOWS_1256, C_WINDOWS_1256, "Windows-1256"), /* RADIO set_charset_cb */
904 	ENC_ACTION(CS_ISO_8859_9, C_ISO_8859_9, N_("Turkish (ISO-8859-_9)")), /* RADIO set_charset_cb */
905 	ENC_ACTION("Cyrillic/"CS_ISO_8859_5, C_ISO_8859_5, "ISO-8859-_5"), /* RADIO set_charset_cb */
906 	ENC_ACTION("Cyrillic/"CS_KOI8_R, C_KOI8_R, "KOI8-_R"), /* RADIO set_charset_cb */
907 	ENC_ACTION("Cyrillic/"CS_MACCYR, C_MACCYR, "_Mac-Cyrillic"), /* RADIO set_charset_cb */
908 	ENC_ACTION("Cyrillic/"CS_KOI8_U, C_KOI8_U, "KOI8-_U"), /* RADIO set_charset_cb */
909 	ENC_ACTION("Cyrillic/"CS_WINDOWS_1251, C_WINDOWS_1251, "Windows-1251"), /* RADIO set_charset_cb */
910 	ENC_ACTION("Japanese/"CS_ISO_2022_JP, C_ISO_2022_JP, "ISO-2022-_JP"), /* RADIO set_charset_cb */
911 	ENC_ACTION("Japanese/"CS_ISO_2022_JP_2, C_ISO_2022_JP_2, "ISO-2022-JP-_2"), /* RADIO set_charset_cb */
912 	ENC_ACTION("Japanese/"CS_EUC_JP, C_EUC_JP, "_EUC-JP"), /* RADIO set_charset_cb */
913 	ENC_ACTION("Japanese/"CS_SHIFT_JIS, C_SHIFT_JIS, "_Shift-JIS"), /* RADIO set_charset_cb */
914 	ENC_ACTION("Chinese/"CS_GB18030, C_GB18030, "_GB18030"), /* RADIO set_charset_cb */
915 	ENC_ACTION("Chinese/"CS_GB2312, C_GB2312, "_GB2312"), /* RADIO set_charset_cb */
916 	ENC_ACTION("Chinese/"CS_GBK, C_GBK, "GB_K"), /* RADIO set_charset_cb */
917 	ENC_ACTION("Chinese/"CS_BIG5, C_BIG5, "_Big5-JP"), /* RADIO set_charset_cb */
918 	ENC_ACTION("Chinese/"CS_EUC_TW, C_EUC_TW, "EUC-_TW"), /* RADIO set_charset_cb */
919 	ENC_ACTION("Korean/"CS_EUC_KR, C_EUC_KR, "_EUC-KR"), /* RADIO set_charset_cb */
920 	ENC_ACTION("Korean/"CS_ISO_2022_KR, C_ISO_2022_KR, "_ISO-2022-KR"), /* RADIO set_charset_cb */
921 	ENC_ACTION("Thai/"CS_TIS_620, C_TIS_620, "_TIS-620-KR"), /* RADIO set_charset_cb */
922 	ENC_ACTION("Thai/"CS_WINDOWS_874, C_WINDOWS_874, "_Windows-874"), /* RADIO set_charset_cb */
923 };
924 
925 static GtkRadioActionEntry mainwin_radio_dec_entries[] =
926 {
927 	DEC_ACTION("AutoDetect", 0, N_("_Auto detect")),	/* set_decode_cb */
928 	/* --- */
929 	DEC_ACTION("8bit", ENC_8BIT, "_8bit"),
930 	DEC_ACTION("QP", ENC_QUOTED_PRINTABLE, "_Quoted printable"),
931 	DEC_ACTION("B64", ENC_BASE64, "_Base64"),
932 	DEC_ACTION("Uuencode", ENC_X_UUENCODE, "_Uuencode"),
933 };
934 
935 static gboolean offline_ask_sync = TRUE;
936 static gboolean is_obscured = FALSE;
937 
938 #define N_COLOR_LABELS colorlabel_get_color_count()
939 
mainwindow_colorlabel_menu_item_activate_item_cb(GtkMenuItem * menu_item,gpointer data)940 static void mainwindow_colorlabel_menu_item_activate_item_cb(GtkMenuItem *menu_item,
941 							  gpointer data)
942 {
943 	MainWindow *mainwin;
944 	GtkMenuShell *menu;
945 	GtkCheckMenuItem **items;
946 	gint n;
947 	GList *children, *cur;
948 	GSList *sel;
949 
950 	mainwin = (MainWindow *)data;
951 	cm_return_if_fail(mainwin != NULL);
952 
953 	sel = summary_get_selection(mainwin->summaryview);
954 	if (!sel) return;
955 
956 	menu = GTK_MENU_SHELL(mainwin->colorlabel_menu);
957 	cm_return_if_fail(menu != NULL);
958 
959 	Xalloca(items, (N_COLOR_LABELS + 1) * sizeof(GtkWidget *), return);
960 
961 	/* NOTE: don't return prematurely because we set the "dont_toggle"
962 	 * state for check menu items. This would be bad! */
963 	g_object_set_data(G_OBJECT(menu), "dont_toggle",
964 			  GINT_TO_POINTER(1));
965 
966 	/* clear items. get item pointers. */
967 	children = gtk_container_get_children(GTK_CONTAINER(menu));
968 	for (n = 0, cur = children; cur != NULL && cur->data != NULL; cur = cur->next) {
969 		if (GTK_IS_CHECK_MENU_ITEM(cur->data)) {
970 			gtk_check_menu_item_set_active
971 				(GTK_CHECK_MENU_ITEM(cur->data), FALSE);
972 			items[n] = GTK_CHECK_MENU_ITEM(cur->data);
973 			n++;
974 		}
975 	}
976 
977 	g_list_free(children);
978 
979 	if (n == (N_COLOR_LABELS + 1)) {
980 		/* iterate all messages and set the state of the appropriate
981 		 * items */
982 		for (; sel != NULL; sel = sel->next) {
983 			MsgInfo *msginfo;
984 			gint clabel;
985 
986 			msginfo = (MsgInfo *)sel->data;
987 			if (msginfo) {
988 				clabel = MSG_GET_COLORLABEL_VALUE(msginfo->flags);
989 				if (!gtk_check_menu_item_get_active(items[clabel]))
990 					gtk_check_menu_item_set_active
991 						(items[clabel], TRUE);
992 			}
993 		}
994 	} else
995 		g_warning("invalid number of color elements (%d)", n);
996 
997 	g_slist_free(sel);
998 	/* reset "dont_toggle" state */
999 	g_object_set_data(G_OBJECT(menu), "dont_toggle",
1000 			  GINT_TO_POINTER(0));
1001 }
1002 
mainwindow_colorlabel_menu_item_activate_cb(GtkWidget * widget,gpointer data)1003 static void mainwindow_colorlabel_menu_item_activate_cb(GtkWidget *widget,
1004 						     gpointer data)
1005 {
1006 	guint color = GPOINTER_TO_UINT(data);
1007 	MainWindow *mainwin;
1008 
1009 	mainwin = g_object_get_data(G_OBJECT(widget), "mainwin");
1010 	cm_return_if_fail(mainwin != NULL);
1011 
1012 	/* "dont_toggle" state set? */
1013 	if (g_object_get_data(G_OBJECT(mainwin->colorlabel_menu),
1014 				"dont_toggle"))
1015 		return;
1016 
1017 	summary_set_colorlabel(mainwin->summaryview, color, NULL);
1018 }
1019 
mainwindow_tags_menu_item_activate_item_cb(GtkMenuItem * menu_item,gpointer data)1020 static void mainwindow_tags_menu_item_activate_item_cb(GtkMenuItem *menu_item,
1021 							  gpointer data)
1022 {
1023 	MainWindow *mainwin;
1024 	GtkMenuShell *menu;
1025 	GList *children, *cur;
1026 	GSList *sel;
1027 	GHashTable *menu_table = g_hash_table_new_full(
1028 					g_direct_hash,
1029 					g_direct_equal,
1030 					NULL, NULL);
1031 	GHashTable *menu_allsel_table = g_hash_table_new_full(
1032 					g_direct_hash,
1033 					g_direct_equal,
1034 					NULL, NULL);
1035 	gint sel_len;
1036 	mainwin = (MainWindow *)data;
1037 	cm_return_if_fail(mainwin != NULL);
1038 
1039 	sel = summary_get_selection(mainwin->summaryview);
1040 	if (!sel) return;
1041 
1042 	menu = GTK_MENU_SHELL(mainwin->tags_menu);
1043 	cm_return_if_fail(menu != NULL);
1044 
1045 	/* NOTE: don't return prematurely because we set the "dont_toggle"
1046 	 * state for check menu items */
1047 	g_object_set_data(G_OBJECT(menu), "dont_toggle",
1048 			  GINT_TO_POINTER(1));
1049 
1050 	/* clear items. get item pointers. */
1051 	children = gtk_container_get_children(GTK_CONTAINER(menu));
1052 	for (cur = children; cur != NULL && cur->data != NULL; cur = cur->next) {
1053 		if (GTK_IS_CHECK_MENU_ITEM(cur->data)) {
1054 			gint id = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(cur->data),
1055 				"tag_id"));
1056 			gtk_check_menu_item_set_active
1057 				(GTK_CHECK_MENU_ITEM(cur->data), FALSE);
1058 
1059 			g_hash_table_insert(menu_table, GINT_TO_POINTER(id), GTK_CHECK_MENU_ITEM(cur->data));
1060 			g_hash_table_insert(menu_allsel_table, GINT_TO_POINTER(id), GINT_TO_POINTER(0));
1061 		}
1062 	}
1063 
1064 	g_list_free(children);
1065 
1066 	/* iterate all messages and set the state of the appropriate
1067 	 * items */
1068 	sel_len = 0;
1069 	for (; sel != NULL; sel = sel->next) {
1070 		MsgInfo *msginfo;
1071 		GSList *tags = NULL;
1072 		GtkCheckMenuItem *item;
1073 		msginfo = (MsgInfo *)sel->data;
1074 		sel_len++;
1075 		if (msginfo) {
1076 			tags =  msginfo->tags;
1077 			if (!tags)
1078 				continue;
1079 
1080 			for (; tags; tags = tags->next) {
1081 				gint num_checked = GPOINTER_TO_INT(g_hash_table_lookup(menu_allsel_table, tags->data));
1082 				item = g_hash_table_lookup(menu_table, GINT_TO_POINTER(tags->data));
1083 				if (item && !gtk_check_menu_item_get_active(item)) {
1084 					gtk_check_menu_item_set_active
1085 						(item, TRUE);
1086 				}
1087 				num_checked++;
1088 				g_hash_table_replace(menu_allsel_table, tags->data, GINT_TO_POINTER(num_checked));
1089 			}
1090 		}
1091 	}
1092 
1093 	children = gtk_container_get_children(GTK_CONTAINER(menu));
1094 	for (cur = children; cur != NULL && cur->data != NULL; cur = cur->next) {
1095 		if (GTK_IS_CHECK_MENU_ITEM(cur->data)) {
1096 			gint id = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(cur->data),
1097 				"tag_id"));
1098 			gint num_checked = GPOINTER_TO_INT(g_hash_table_lookup(menu_allsel_table, GINT_TO_POINTER(id)));
1099 			if (num_checked < sel_len && num_checked > 0)
1100 				gtk_check_menu_item_set_inconsistent(GTK_CHECK_MENU_ITEM(cur->data), TRUE);
1101 			else
1102 				gtk_check_menu_item_set_inconsistent(GTK_CHECK_MENU_ITEM(cur->data), FALSE);
1103 		}
1104 	}
1105 	g_list_free(children);
1106 	g_slist_free(sel);
1107 	g_hash_table_destroy(menu_table);
1108 	g_hash_table_destroy(menu_allsel_table);
1109 	/* reset "dont_toggle" state */
1110 	g_object_set_data(G_OBJECT(menu), "dont_toggle",
1111 			  GINT_TO_POINTER(0));
1112 }
1113 
mainwindow_tags_menu_item_activate_cb(GtkWidget * widget,gpointer data)1114 static void mainwindow_tags_menu_item_activate_cb(GtkWidget *widget,
1115 						     gpointer data)
1116 {
1117 	gint id = GPOINTER_TO_INT(data);
1118 	gboolean set = gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(widget));
1119 	MainWindow *mainwin;
1120 
1121 	mainwin = g_object_get_data(G_OBJECT(widget), "mainwin");
1122 	cm_return_if_fail(mainwin != NULL);
1123 
1124 	/* "dont_toggle" state set? */
1125 	if (g_object_get_data(G_OBJECT(mainwin->tags_menu),
1126 				"dont_toggle"))
1127 		return;
1128 
1129 	if (!set)
1130 		id = -id;
1131 	summary_set_tag(mainwin->summaryview, id, NULL);
1132 }
1133 
mainwin_accel_changed_cb(GtkAccelGroup * accelgroup,guint keyval,GdkModifierType modifier,GClosure * closure,GtkMenuItem * item)1134 void mainwin_accel_changed_cb (GtkAccelGroup *accelgroup, guint keyval, GdkModifierType modifier,
1135 				  GClosure *closure, GtkMenuItem *item)
1136 {
1137 	GList *closures = gtk_widget_list_accel_closures(GTK_WIDGET(item));
1138 	GList *cur;
1139 	for (cur = closures; cur; cur = cur->next) {
1140 		if (closure == cur->data) {
1141 			GtkLabel *label = g_object_get_data(G_OBJECT(item), "accel_label");
1142 			gchar *new_accel;
1143 
1144 			if (keyval == GDK_KEY_Delete) {
1145 				const gchar *accel_path;
1146 				accel_path = gtk_menu_item_get_accel_path(item);
1147 				keyval = 0; modifier = 0;
1148 				gtk_accel_map_change_entry (accel_path, keyval, modifier, TRUE);
1149 			}
1150 			new_accel = gtk_accelerator_get_label(keyval, modifier);
1151 			gtk_label_set_text(label, new_accel);
1152 			g_free(new_accel);
1153 		}
1154 	}
1155 	g_list_free(closures);
1156 }
1157 
mainwindow_colorlabel_menu_create(MainWindow * mainwin,gboolean refresh)1158 static void mainwindow_colorlabel_menu_create(MainWindow *mainwin, gboolean refresh)
1159 {
1160 	GtkWidget *label_menuitem;
1161 	GtkWidget *menu;
1162 	GtkWidget *item;
1163 	gint i;
1164 	gchar *accel_path = NULL;
1165 
1166 	label_menuitem = gtk_ui_manager_get_widget(mainwin->ui_manager, "/Menu/Message/ColorLabel");
1167 	g_signal_connect(G_OBJECT(label_menuitem), "activate",
1168 			 G_CALLBACK(mainwindow_colorlabel_menu_item_activate_item_cb),
1169 			   mainwin);
1170 	gtk_widget_show(label_menuitem);
1171 
1172 	menu = gtk_menu_new();
1173 	gtk_menu_set_accel_group (GTK_MENU (menu),
1174 		gtk_ui_manager_get_accel_group(mainwin->ui_manager));
1175 
1176 	/* create sub items. for the menu item activation callback we pass the
1177 	 * index of label_colors[] as data parameter. for the None color we
1178 	 * pass an invalid (high) value. also we attach a data pointer so we
1179 	 * can always get back the Mainwindow pointer. */
1180 
1181 	item = gtk_check_menu_item_new_with_label(_("None"));
1182 	gtk_menu_shell_append(GTK_MENU_SHELL(menu), item);
1183 	g_signal_connect(G_OBJECT(item), "activate",
1184 			 G_CALLBACK(mainwindow_colorlabel_menu_item_activate_cb),
1185 			   GUINT_TO_POINTER(0));
1186 	g_object_set_data(G_OBJECT(item), "mainwin", mainwin);
1187 	gtk_widget_show(item);
1188 
1189 	accel_path = g_strdup_printf("<ClawsColorLabels>/None");
1190 	gtk_menu_item_set_accel_path(GTK_MENU_ITEM(item), accel_path);
1191 	g_free(accel_path);
1192 	gtk_accel_map_add_entry("<ClawsColorLabels>/None", GDK_KEY_0, GDK_CONTROL_MASK);
1193 	item = gtk_menu_item_new();
1194 	gtk_menu_shell_append(GTK_MENU_SHELL(menu), item);
1195 	gtk_widget_show(item);
1196 
1197 	/* create pixmap/label menu items */
1198 	for (i = 0; i < N_COLOR_LABELS; i++) {
1199 		item = colorlabel_create_check_color_menu_item(
1200 			i, refresh, MAINWIN_COLORMENU);
1201 		gtk_menu_shell_append(GTK_MENU_SHELL(menu), item);
1202 		g_signal_connect(G_OBJECT(item), "activate",
1203 				 G_CALLBACK(mainwindow_colorlabel_menu_item_activate_cb),
1204 				 GUINT_TO_POINTER(i + 1));
1205 		g_object_set_data(G_OBJECT(item), "mainwin",
1206 				  mainwin);
1207 		gtk_widget_show(item);
1208 		accel_path = g_strdup_printf("<ClawsColorLabels>/%d", i+1);
1209 		gtk_menu_item_set_accel_path(GTK_MENU_ITEM(item), accel_path);
1210 		if (i < 9)
1211 			gtk_accel_map_add_entry(accel_path, GDK_KEY_1+i, GDK_CONTROL_MASK);
1212 		g_free(accel_path);
1213 		g_signal_connect (gtk_ui_manager_get_accel_group(mainwin->ui_manager),
1214 			"accel-changed", G_CALLBACK (mainwin_accel_changed_cb), item);
1215 
1216 
1217 	}
1218 	gtk_widget_show(menu);
1219 	gtk_menu_item_set_submenu(GTK_MENU_ITEM(label_menuitem), menu);
1220 	mainwin->colorlabel_menu = menu;
1221 }
1222 
mainwindow_tags_menu_item_apply_tags_activate_cb(GtkWidget * widget,gpointer data)1223 static void mainwindow_tags_menu_item_apply_tags_activate_cb(GtkWidget *widget,
1224 						     gpointer data)
1225 {
1226 	MainWindow *mainwin;
1227 
1228 	mainwin = g_object_get_data(G_OBJECT(widget), "mainwin");
1229 	cm_return_if_fail(mainwin != NULL);
1230 
1231 	/* "dont_toggle" state set? */
1232 	if (g_object_get_data(G_OBJECT(mainwin->tags_menu),
1233 				"dont_toggle"))
1234 		return;
1235 
1236 	tag_apply_open(summary_get_selection(mainwin->summaryview));
1237 }
1238 
mainwin_tag_cmp_list(gconstpointer a,gconstpointer b)1239 static gint mainwin_tag_cmp_list(gconstpointer a, gconstpointer b)
1240 {
1241 	gint id_a = GPOINTER_TO_INT(a);
1242 	gint id_b = GPOINTER_TO_INT(b);
1243 	const gchar *tag_a = tags_get_tag(id_a);
1244 	const gchar *tag_b = tags_get_tag(id_b);
1245 
1246 
1247  	if (tag_a == NULL)
1248  		return tag_b == NULL ? 0:1;
1249 
1250  	if (tag_b == NULL)
1251  		return 1;
1252 
1253  	return g_utf8_collate(tag_a, tag_b);
1254 }
1255 
mainwindow_tags_menu_create(MainWindow * mainwin,gboolean refresh)1256 static void mainwindow_tags_menu_create(MainWindow *mainwin, gboolean refresh)
1257 {
1258 	GtkWidget *label_menuitem;
1259 	GtkWidget *menu;
1260 	GtkWidget *item;
1261 	GSList *cur = tags_get_list();
1262 	GSList *orig = NULL;
1263 	gboolean existing_tags = FALSE;
1264 	gchar *accel_path;
1265 	cur = orig = g_slist_sort(cur, mainwin_tag_cmp_list);
1266 
1267 	label_menuitem = gtk_ui_manager_get_widget(mainwin->ui_manager, "/Menu/Message/Tags");
1268 	g_signal_connect(G_OBJECT(label_menuitem), "activate",
1269 			 G_CALLBACK(mainwindow_tags_menu_item_activate_item_cb),
1270 			   mainwin);
1271 
1272 	gtk_widget_show(label_menuitem);
1273 
1274 	menu = gtk_menu_new();
1275 	gtk_menu_set_accel_group (GTK_MENU (menu),
1276 		gtk_ui_manager_get_accel_group(mainwin->ui_manager));
1277 
1278 	/* create tags menu items */
1279 	for (; cur; cur = cur->next) {
1280 		gint id = GPOINTER_TO_INT(cur->data);
1281 		const gchar *tag = tags_get_tag(id);
1282 
1283 		item = gtk_check_menu_item_new_with_label(tag);
1284 		gtk_menu_shell_append(GTK_MENU_SHELL(menu), item);
1285 		g_signal_connect(G_OBJECT(item), "activate",
1286 				 G_CALLBACK(mainwindow_tags_menu_item_activate_cb),
1287 				 GINT_TO_POINTER(id));
1288 		g_object_set_data(G_OBJECT(item), "mainwin",
1289 				  mainwin);
1290 		g_object_set_data(G_OBJECT(item), "tag_id",
1291 				  GINT_TO_POINTER(id));
1292 		gtk_widget_show(item);
1293 		accel_path = g_strconcat("<ClawsTags>/",tag, NULL);
1294 		gtk_menu_item_set_accel_path(GTK_MENU_ITEM(item), accel_path);
1295 		g_free(accel_path);
1296 		existing_tags = TRUE;
1297 	}
1298 	if (existing_tags) {
1299 		/* separator */
1300 		item = gtk_menu_item_new();
1301 		gtk_menu_shell_append(GTK_MENU_SHELL(menu), item);
1302 		gtk_widget_show(item);
1303 	}
1304 
1305 	item = gtk_menu_item_new_with_label(_("Apply tags..."));
1306 	gtk_menu_shell_append(GTK_MENU_SHELL(menu), item);
1307 	g_signal_connect(G_OBJECT(item), "activate",
1308 			 G_CALLBACK(mainwindow_tags_menu_item_apply_tags_activate_cb),
1309 			 NULL);
1310 	g_object_set_data(G_OBJECT(item), "mainwin",
1311 			  mainwin);
1312 	gtk_widget_show(item);
1313 	accel_path = g_strdup_printf("<ClawsTags>/ApplyTags");
1314 	gtk_menu_item_set_accel_path(GTK_MENU_ITEM(item), accel_path);
1315 	g_free(accel_path);
1316 	gtk_accel_map_add_entry("<ClawsTags>/ApplyTags", GDK_KEY_T, GDK_CONTROL_MASK|GDK_SHIFT_MASK);
1317 	g_slist_free(orig);
1318 	gtk_widget_show(menu);
1319 	gtk_menu_item_set_submenu(GTK_MENU_ITEM(label_menuitem), menu);
1320 	mainwin->tags_menu = menu;
1321 }
1322 #ifndef GENERIC_UMPC
warning_icon_pressed(GtkWidget * widget,GdkEventButton * evt,MainWindow * mainwindow)1323 static gboolean warning_icon_pressed(GtkWidget *widget, GdkEventButton *evt,
1324 				    MainWindow *mainwindow)
1325 {
1326 	if (evt && evt->button == 1) {
1327 		log_window_show_error(mainwindow->logwin);
1328 		gtk_widget_hide(mainwindow->warning_btn);
1329 	}
1330 	return FALSE;
1331 }
1332 
warning_visi_notify(GtkWidget * widget,GdkEventVisibility * event,MainWindow * mainwindow)1333 static gboolean warning_visi_notify(GtkWidget *widget,
1334 				       GdkEventVisibility *event,
1335 				       MainWindow *mainwindow)
1336 {
1337 	gdk_window_set_cursor(gtk_widget_get_window(mainwindow->warning_btn), hand_cursor);
1338 	return FALSE;
1339 }
1340 
warning_leave_notify(GtkWidget * widget,GdkEventCrossing * event,MainWindow * mainwindow)1341 static gboolean warning_leave_notify(GtkWidget *widget,
1342 				      GdkEventCrossing *event,
1343 				      MainWindow *mainwindow)
1344 {
1345 	gdk_window_set_cursor(gtk_widget_get_window(mainwindow->warning_btn), NULL);
1346 	return FALSE;
1347 }
1348 
warning_enter_notify(GtkWidget * widget,GdkEventCrossing * event,MainWindow * mainwindow)1349 static gboolean warning_enter_notify(GtkWidget *widget,
1350 				      GdkEventCrossing *event,
1351 				      MainWindow *mainwindow)
1352 {
1353 	gdk_window_set_cursor(gtk_widget_get_window(mainwindow->warning_btn), hand_cursor);
1354 	return FALSE;
1355 }
1356 #endif
mainwindow_show_error(void)1357 void mainwindow_show_error(void)
1358 {
1359 	MainWindow *mainwin = mainwindow_get_mainwindow();
1360 	gtk_widget_show(mainwin->warning_btn);
1361 }
1362 
mainwindow_clear_error(MainWindow * mainwin)1363 void mainwindow_clear_error(MainWindow *mainwin)
1364 {
1365 	gtk_widget_hide(mainwin->warning_btn);
1366 }
1367 
1368 #define BREAK_ON_MODIFIER_KEY() \
1369 	if ((event->state & (GDK_MOD1_MASK|GDK_CONTROL_MASK)) != 0) break
1370 
mainwindow_key_pressed(GtkWidget * widget,GdkEventKey * event,gpointer data)1371 static gboolean mainwindow_key_pressed (GtkWidget *widget, GdkEventKey *event,
1372 				    gpointer data)
1373 {
1374 	MainWindow *mainwin = (MainWindow*) data;
1375 
1376 	if (!mainwin || !event)
1377 		return FALSE;
1378 
1379 	if (quicksearch_has_focus(mainwin->summaryview->quicksearch))
1380 	{
1381 		GtkWidget *entry =
1382 			quicksearch_get_entry(mainwin->summaryview->quicksearch);
1383 		gboolean handled;
1384 		g_signal_emit_by_name(entry, "key-press-event", event, &handled);
1385 		if (handled) {
1386 			return TRUE;
1387 		}
1388 	}
1389 
1390 	switch (event->keyval) {
1391 	case GDK_KEY_Q:             /* Quit */
1392 		BREAK_ON_MODIFIER_KEY();
1393 
1394 		if (gtk_window_is_active(GTK_WINDOW(mainwin->window))) {
1395 			app_exit_cb(NULL, mainwin);
1396 		}
1397 		return FALSE;
1398 	case GDK_KEY_space:
1399 		BREAK_ON_MODIFIER_KEY();
1400 		if (gtk_window_is_active(GTK_WINDOW(mainwin->window))) {
1401 			if (mainwin->folderview != NULL && mainwin->summaryview != NULL
1402 			    && ((!mainwin->summaryview->displayed
1403 		        	&& !mainwin->summaryview->selected)
1404 				|| (mainwin->summaryview->folder_item
1405 				    && mainwin->summaryview->folder_item->total_msgs == 0))) {
1406 				g_signal_stop_emission_by_name(G_OBJECT(widget),
1407                                 	       "key_press_event");
1408 				folderview_select_next_with_flag(mainwin->folderview, MSG_UNREAD);
1409 			}
1410 		}
1411 		break;
1412 	default:
1413 		break;
1414 	}
1415 	return FALSE;
1416 }
1417 
1418 #undef BREAK_ON_MODIFIER_KEY
1419 
main_window_create()1420 MainWindow *main_window_create()
1421 {
1422 	MainWindow *mainwin;
1423 	GtkWidget *window;
1424 	GtkWidget *vbox;
1425 	GtkWidget *menubar;
1426 	GtkWidget *handlebox;
1427 	GtkWidget *vbox_body;
1428 	GtkWidget *menuitem;
1429 #ifndef GENERIC_UMPC
1430 	GtkWidget *hbox_stat;
1431 	GtkWidget *statusbar;
1432 	GtkWidget *progressbar;
1433 	GtkWidget *statuslabel;
1434 	GtkWidget *ac_button;
1435 	GtkWidget *ac_label;
1436  	GtkWidget *online_pixmap;
1437 	GtkWidget *offline_pixmap;
1438 	GtkWidget *warning_icon;
1439 	GtkWidget *warning_btn;
1440 #endif
1441 	GtkWidget *online_switch;
1442 	GtkWidget *offline_switch;
1443 	FolderView *folderview;
1444 	SummaryView *summaryview;
1445 	MessageView *messageview;
1446 	GdkColormap *colormap;
1447 	gboolean success[4];
1448 	GdkColor color[4];
1449 	GtkWidget *ac_menu;
1450 	gint i;
1451 
1452 	static GdkGeometry geometry;
1453 
1454 	debug_print("Creating main window...\n");
1455 	mainwin = g_new0(MainWindow, 1);
1456 
1457 	/* main window */
1458 	window = GTK_WIDGET(gtkut_window_new(GTK_WINDOW_TOPLEVEL, "mainwindow"));
1459 	gtk_window_set_title(GTK_WINDOW(window), PROG_VERSION);
1460 	gtk_window_set_resizable(GTK_WINDOW(window), TRUE);
1461 #ifdef GENERIC_UMPC
1462 	prefs_common.layout_mode = SMALL_LAYOUT;
1463 #endif
1464 	if (!geometry.min_height) {
1465 		geometry.min_width = 320;
1466 		geometry.min_height = 200;
1467 	}
1468 	gtk_window_set_geometry_hints(GTK_WINDOW(window), NULL, &geometry,
1469 				      GDK_HINT_MIN_SIZE);
1470 
1471 	g_signal_connect(G_OBJECT(window), "delete_event",
1472 			 G_CALLBACK(main_window_close_cb), mainwin);
1473 	MANAGE_WINDOW_SIGNALS_CONNECT(window);
1474 	g_signal_connect(G_OBJECT(window), "focus_in_event",
1475 			 G_CALLBACK(mainwindow_focus_in_event),
1476 			 mainwin);
1477 	g_signal_connect(G_OBJECT(window), "key_press_event",
1478 			 G_CALLBACK(mainwindow_key_pressed), mainwin);
1479 
1480 	gtk_widget_realize(window);
1481 	gtk_widget_add_events(window, GDK_KEY_PRESS_MASK|GDK_KEY_RELEASE_MASK);
1482 
1483 
1484 	gtkut_widget_set_app_icon(window);
1485 
1486 	vbox = gtk_vbox_new(FALSE, 0);
1487 	gtk_widget_show(vbox);
1488 	gtk_container_add(GTK_CONTAINER(window), vbox);
1489 
1490 	/* menu bar */
1491 
1492 	mainwin->ui_manager = gtk_ui_manager_new();
1493 	mainwin->action_group = cm_menu_create_action_group_full(mainwin->ui_manager,"Menu", mainwin_entries,
1494 			G_N_ELEMENTS(mainwin_entries), (gpointer)mainwin);
1495 	gtk_action_group_add_toggle_actions(mainwin->action_group, mainwin_toggle_entries,
1496 			G_N_ELEMENTS(mainwin_toggle_entries), (gpointer)mainwin);
1497 	gtk_action_group_add_radio_actions(mainwin->action_group, mainwin_showhide_radio_entries,
1498 			G_N_ELEMENTS(mainwin_showhide_radio_entries), C_AUTO, G_CALLBACK(toggle_toolbar_cb), (gpointer)mainwin);
1499 #ifndef GENERIC_UMPC
1500 	gtk_action_group_add_radio_actions(mainwin->action_group, mainwin_layout_radio_entries,
1501 			G_N_ELEMENTS(mainwin_layout_radio_entries), C_AUTO, G_CALLBACK(set_layout_cb), (gpointer)mainwin);
1502 #endif
1503 	gtk_action_group_add_radio_actions(mainwin->action_group, mainwin_sort_radio_entries,
1504 			G_N_ELEMENTS(mainwin_sort_radio_entries), C_AUTO, G_CALLBACK(sort_summary_cb), (gpointer)mainwin);
1505 	gtk_action_group_add_radio_actions(mainwin->action_group, mainwin_sorttype_radio_entries,
1506 			G_N_ELEMENTS(mainwin_sorttype_radio_entries), C_AUTO, G_CALLBACK(sort_summary_type_cb), (gpointer)mainwin);
1507 	gtk_action_group_add_radio_actions(mainwin->action_group, mainwin_radio_enc_entries,
1508 			G_N_ELEMENTS(mainwin_radio_enc_entries), C_AUTO, G_CALLBACK(set_charset_cb), (gpointer)mainwin);
1509 	gtk_action_group_add_radio_actions(mainwin->action_group, mainwin_radio_dec_entries,
1510 			G_N_ELEMENTS(mainwin_radio_dec_entries), C_AUTO, G_CALLBACK(set_decode_cb), (gpointer)mainwin);
1511 
1512 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/", "Menu", NULL, GTK_UI_MANAGER_MENUBAR)
1513 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu", "File", "File", GTK_UI_MANAGER_MENU)
1514 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu", "Edit", "Edit", GTK_UI_MANAGER_MENU)
1515 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu", "View", "View", GTK_UI_MANAGER_MENU)
1516 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu", "Message", "Message", GTK_UI_MANAGER_MENU)
1517 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu", "Tools", "Tools", GTK_UI_MANAGER_MENU)
1518 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu", "Configuration", "Configuration", GTK_UI_MANAGER_MENU)
1519 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu", "Help", "Help", GTK_UI_MANAGER_MENU)
1520 
1521 /* File menu */
1522 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/File", "AddMailbox", "File/AddMailbox", GTK_UI_MANAGER_MENU)
1523 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/File/AddMailbox", "MH", "File/AddMailbox/MH", GTK_UI_MANAGER_MENUITEM)
1524 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/File", "Separator1", "File/---", GTK_UI_MANAGER_SEPARATOR)
1525 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/File", "SortMailboxes", "File/SortMailboxes", GTK_UI_MANAGER_MENUITEM)
1526 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/File", "Separator2", "File/---", GTK_UI_MANAGER_SEPARATOR)
1527 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/File", "ImportMbox", "File/ImportMbox", GTK_UI_MANAGER_MENUITEM)
1528 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/File", "ExportMbox", "File/ExportMbox", GTK_UI_MANAGER_MENUITEM)
1529 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/File", "ExportSelMbox", "File/ExportSelMbox", GTK_UI_MANAGER_MENUITEM)
1530 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/File", "Separator3", "File/---", GTK_UI_MANAGER_SEPARATOR)
1531 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/File", "EmptyTrashes", "File/EmptyTrashes", GTK_UI_MANAGER_MENUITEM)
1532 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/File", "Separator4", "File/---", GTK_UI_MANAGER_SEPARATOR)
1533 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/File", "SaveAs", "File/SaveAs", GTK_UI_MANAGER_MENUITEM)
1534 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/File", "SavePartAs", "File/SavePartAs", GTK_UI_MANAGER_MENUITEM)
1535 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/File", "Separator5", "File/---", GTK_UI_MANAGER_SEPARATOR)
1536 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/File", "PageSetup", "File/PageSetup", GTK_UI_MANAGER_MENUITEM)
1537 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/File", "Print", "File/Print", GTK_UI_MANAGER_MENUITEM)
1538 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/File", "Separator6", "File/---", GTK_UI_MANAGER_SEPARATOR)
1539 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/File", "OfflineMode", "File/OfflineMode", GTK_UI_MANAGER_MENUITEM)
1540 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/File", "SynchroniseFolders", "File/SynchroniseFolders", GTK_UI_MANAGER_MENUITEM)
1541 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/File", "Separator7", "File/---", GTK_UI_MANAGER_SEPARATOR)
1542 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/File", "Exit", "File/Exit", GTK_UI_MANAGER_MENUITEM)
1543 
1544 /* Edit menu */
1545 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Edit", "Copy", "Edit/Copy", GTK_UI_MANAGER_MENUITEM)
1546 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Edit", "SelectAll", "Edit/SelectAll", GTK_UI_MANAGER_MENUITEM)
1547 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Edit", "SelectThread", "Edit/SelectThread", GTK_UI_MANAGER_MENUITEM)
1548 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Edit", "Separator1", "Edit/---", GTK_UI_MANAGER_SEPARATOR)
1549 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Edit", "Find", "Edit/Find", GTK_UI_MANAGER_MENUITEM)
1550 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Edit", "SearchFolder", "Edit/SearchFolder", GTK_UI_MANAGER_MENUITEM)
1551 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Edit", "QuickSearch", "Edit/QuickSearch", GTK_UI_MANAGER_MENUITEM)
1552 
1553 /* View menu */
1554 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View", "ShowHide", "View/ShowHide", GTK_UI_MANAGER_MENU)
1555 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/ShowHide", "MenuBar", "View/ShowHide/MenuBar", GTK_UI_MANAGER_MENUITEM)
1556 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/ShowHide", "Toolbar", "View/ShowHide/Toolbar", GTK_UI_MANAGER_MENU)
1557 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/ShowHide/Toolbar", "TextBelowIcon", "View/ShowHide/Toolbar/TextBelowIcon", GTK_UI_MANAGER_MENUITEM)
1558 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/ShowHide/Toolbar", "TextBesideIcon", "View/ShowHide/Toolbar/TextBesideIcon", GTK_UI_MANAGER_MENUITEM)
1559 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/ShowHide/Toolbar", "IconOnly", "View/ShowHide/Toolbar/IconOnly", GTK_UI_MANAGER_MENUITEM)
1560 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/ShowHide/Toolbar", "TextOnly", "View/ShowHide/Toolbar/TextOnly", GTK_UI_MANAGER_MENUITEM)
1561 #ifndef GENERIC_UMPC
1562 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/ShowHide/Toolbar", "Hide", "View/ShowHide/Toolbar/Hide", GTK_UI_MANAGER_MENUITEM)
1563 #endif
1564 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/ShowHide", "MessageView", "View/ShowHide/MessageView", GTK_UI_MANAGER_MENUITEM)
1565 #ifndef GENERIC_UMPC
1566 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/ShowHide", "StatusBar", "View/ShowHide/StatusBar", GTK_UI_MANAGER_MENUITEM)
1567 #endif
1568 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/ShowHide", "ColumnHeaders", "View/ShowHide/ColumnHeaders", GTK_UI_MANAGER_MENUITEM)
1569 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View", "SetColumns", "View/SetColumns", GTK_UI_MANAGER_MENU)
1570 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/SetColumns", "Folderlist", "View/SetColumns/Folderlist", GTK_UI_MANAGER_MENUITEM)
1571 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/SetColumns", "Messagelist", "View/SetColumns/Messagelist", GTK_UI_MANAGER_MENUITEM)
1572 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View", "Separator1", "View/---", GTK_UI_MANAGER_SEPARATOR)
1573 
1574 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View", "FullScreen", "View/FullScreen", GTK_UI_MANAGER_MENUITEM)
1575 #ifndef GENERIC_UMPC
1576 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View", "Layout", "View/Layout", GTK_UI_MANAGER_MENU)
1577 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Layout", "Standard", "View/Layout/Standard", GTK_UI_MANAGER_MENUITEM)
1578 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Layout", "ThreeColumns", "View/Layout/ThreeColumns", GTK_UI_MANAGER_MENUITEM)
1579 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Layout", "WideMessage", "View/Layout/WideMessage", GTK_UI_MANAGER_MENUITEM)
1580 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Layout", "WideMessageList", "View/Layout/WideMessageList", GTK_UI_MANAGER_MENUITEM)
1581 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Layout", "SmallScreen", "View/Layout/SmallScreen", GTK_UI_MANAGER_MENUITEM)
1582 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View", "Separator2", "View/---", GTK_UI_MANAGER_SEPARATOR)
1583 #endif
1584 
1585 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View", "Sort", "View/Sort", GTK_UI_MANAGER_MENU)
1586 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Sort", "Number", "View/Sort/Number", GTK_UI_MANAGER_MENUITEM)
1587 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Sort", "Size", "View/Sort/Size", GTK_UI_MANAGER_MENUITEM)
1588 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Sort", "Date", "View/Sort/Date", GTK_UI_MANAGER_MENUITEM)
1589 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Sort", "ThreadDate", "View/Sort/ThreadDate", GTK_UI_MANAGER_MENUITEM)
1590 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Sort", "From", "View/Sort/From", GTK_UI_MANAGER_MENUITEM)
1591 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Sort", "To", "View/Sort/To", GTK_UI_MANAGER_MENUITEM)
1592 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Sort", "Subject", "View/Sort/Subject", GTK_UI_MANAGER_MENUITEM)
1593 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Sort", "Color", "View/Sort/Color", GTK_UI_MANAGER_MENUITEM)
1594 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Sort", "Tag", "View/Sort/Tag", GTK_UI_MANAGER_MENUITEM)
1595 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Sort", "Mark", "View/Sort/Mark", GTK_UI_MANAGER_MENUITEM)
1596 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Sort", "Status", "View/Sort/Status", GTK_UI_MANAGER_MENUITEM)
1597 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Sort", "Attachment", "View/Sort/Attachment", GTK_UI_MANAGER_MENUITEM)
1598 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Sort", "Score", "View/Sort/Score", GTK_UI_MANAGER_MENUITEM)
1599 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Sort", "Locked", "View/Sort/Locked", GTK_UI_MANAGER_MENUITEM)
1600 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Sort", "DontSort", "View/Sort/DontSort", GTK_UI_MANAGER_MENUITEM)
1601 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Sort", "Separator1", "View/Sort/---", GTK_UI_MANAGER_SEPARATOR)
1602 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Sort", "Ascending", "View/Sort/Ascending", GTK_UI_MANAGER_MENUITEM)
1603 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Sort", "Descending", "View/Sort/Descending", GTK_UI_MANAGER_MENUITEM)
1604 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Sort", "Separator2", "View/Sort/---", GTK_UI_MANAGER_SEPARATOR)
1605 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Sort", "AttractSubj", "View/Sort/AttractSubj", GTK_UI_MANAGER_MENUITEM)
1606 
1607 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View", "ThreadView", "View/ThreadView", GTK_UI_MANAGER_MENUITEM)
1608 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View", "ExpandThreads", "View/ExpandThreads", GTK_UI_MANAGER_MENUITEM)
1609 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View", "CollapseThreads", "View/CollapseThreads", GTK_UI_MANAGER_MENUITEM)
1610 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View", "HideReadThreads", "View/HideReadThreads", GTK_UI_MANAGER_MENUITEM)
1611 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View", "HideReadMessages", "View/HideReadMessages", GTK_UI_MANAGER_MENUITEM)
1612 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View", "HideDelMessages", "View/HideDelMessages", GTK_UI_MANAGER_MENUITEM)
1613 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View", "Separator3", "View/---", GTK_UI_MANAGER_SEPARATOR)
1614 
1615 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View", "Goto", "View/Goto", GTK_UI_MANAGER_MENU)
1616 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Goto", "Prev", "View/Goto/Prev", GTK_UI_MANAGER_MENUITEM)
1617 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Goto", "Next", "View/Goto/Next", GTK_UI_MANAGER_MENUITEM)
1618 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Goto", "Separator1", "View/Goto/---", GTK_UI_MANAGER_SEPARATOR)
1619 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Goto", "PrevUnread", "View/Goto/PrevUnread", GTK_UI_MANAGER_MENUITEM)
1620 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Goto", "NextUnread", "View/Goto/NextUnread", GTK_UI_MANAGER_MENUITEM)
1621 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Goto", "Separator2", "View/Goto/---", GTK_UI_MANAGER_SEPARATOR)
1622 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Goto", "PrevNew", "View/Goto/PrevNew", GTK_UI_MANAGER_MENUITEM)
1623 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Goto", "NextNew", "View/Goto/NextNew", GTK_UI_MANAGER_MENUITEM)
1624 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Goto", "Separator3", "View/Goto/---", GTK_UI_MANAGER_SEPARATOR)
1625 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Goto", "PrevMarked", "View/Goto/PrevMarked", GTK_UI_MANAGER_MENUITEM)
1626 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Goto", "NextMarked", "View/Goto/NextMarked", GTK_UI_MANAGER_MENUITEM)
1627 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Goto", "Separator4", "View/Goto/---", GTK_UI_MANAGER_SEPARATOR)
1628 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Goto", "PrevLabeled", "View/Goto/PrevLabeled", GTK_UI_MANAGER_MENUITEM)
1629 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Goto", "NextLabeled", "View/Goto/NextLabeled", GTK_UI_MANAGER_MENUITEM)
1630 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Goto", "Separator5", "View/Goto/---", GTK_UI_MANAGER_SEPARATOR)
1631 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Goto", "PrevHistory", "View/Goto/PrevHistory", GTK_UI_MANAGER_MENUITEM)
1632 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Goto", "NextHistory", "View/Goto/NextHistory", GTK_UI_MANAGER_MENUITEM)
1633 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Goto", "Separator6", "View/Goto/---", GTK_UI_MANAGER_SEPARATOR)
1634 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Goto", "ParentMessage", "View/Goto/ParentMessage", GTK_UI_MANAGER_MENUITEM)
1635 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Goto", "Separator7", "View/Goto/---", GTK_UI_MANAGER_SEPARATOR)
1636 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Goto", "NextUnreadFolder", "View/Goto/NextUnreadFolder", GTK_UI_MANAGER_MENUITEM)
1637 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Goto", "Folder", "View/Goto/Folder", GTK_UI_MANAGER_MENUITEM)
1638 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Goto", "Separator8", "View/Goto/---", GTK_UI_MANAGER_SEPARATOR)
1639 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Goto", "NextPart", "View/Goto/NextPart", GTK_UI_MANAGER_MENUITEM)
1640 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Goto", "PrevPart", "View/Goto/PrevPart", GTK_UI_MANAGER_MENUITEM)
1641 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View", "Scroll", "View/Scroll", GTK_UI_MANAGER_MENU)
1642 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Scroll", "PrevLine", "View/Scroll/PrevLine", GTK_UI_MANAGER_MENUITEM)
1643 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Scroll", "NextLine", "View/Scroll/NextLine", GTK_UI_MANAGER_MENUITEM)
1644 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Scroll", "PrevPage", "View/Scroll/PrevPage", GTK_UI_MANAGER_MENUITEM)
1645 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Scroll", "NextPage", "View/Scroll/NextPage", GTK_UI_MANAGER_MENUITEM)
1646 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View", "Separator4", "View/---", GTK_UI_MANAGER_SEPARATOR)
1647 
1648 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View", "Encoding", "View/Encoding", GTK_UI_MANAGER_MENU)
1649 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding", CS_AUTO, "View/Encoding/"CS_AUTO, GTK_UI_MANAGER_MENUITEM)
1650 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding", "Separator1", "View/Encoding/---", GTK_UI_MANAGER_SEPARATOR)
1651 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding", CS_US_ASCII, "View/Encoding/"CS_US_ASCII, GTK_UI_MANAGER_MENUITEM)
1652 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding", CS_UTF_8, "View/Encoding/"CS_UTF_8, GTK_UI_MANAGER_MENUITEM)
1653 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding", "Separator2", "View/Encoding/---", GTK_UI_MANAGER_SEPARATOR)
1654 
1655 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding", "Western", "View/Encoding/Western", GTK_UI_MANAGER_MENU)
1656 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding/Western", CS_ISO_8859_1, "View/Encoding/Western/"CS_ISO_8859_1, GTK_UI_MANAGER_MENUITEM)
1657 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding/Western", CS_ISO_8859_15, "View/Encoding/Western/"CS_ISO_8859_15, GTK_UI_MANAGER_MENUITEM)
1658 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding/Western", CS_WINDOWS_1252, "View/Encoding/Western/"CS_WINDOWS_1252, GTK_UI_MANAGER_MENUITEM)
1659 
1660 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding", CS_ISO_8859_2, "View/Encoding/"CS_ISO_8859_2, GTK_UI_MANAGER_MENUITEM)
1661 
1662 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding", "Baltic", "View/Encoding/Baltic", GTK_UI_MANAGER_MENU)
1663 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding/Baltic", CS_ISO_8859_13, "View/Encoding/Baltic/"CS_ISO_8859_13, GTK_UI_MANAGER_MENUITEM)
1664 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding/Baltic", CS_ISO_8859_4, "View/Encoding/Baltic/"CS_ISO_8859_4, GTK_UI_MANAGER_MENUITEM)
1665 
1666 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding", CS_ISO_8859_7, "View/Encoding/"CS_ISO_8859_7, GTK_UI_MANAGER_MENUITEM)
1667 
1668 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding", "Hebrew", "View/Encoding/Hebrew", GTK_UI_MANAGER_MENU)
1669 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding/Hebrew", CS_ISO_8859_8, "View/Encoding/Hebrew/"CS_ISO_8859_8, GTK_UI_MANAGER_MENUITEM)
1670 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding/Hebrew", CS_WINDOWS_1255, "View/Encoding/Hebrew/"CS_WINDOWS_1255, GTK_UI_MANAGER_MENUITEM)
1671 
1672 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding", "Arabic", "View/Encoding/Arabic", GTK_UI_MANAGER_MENU)
1673 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding/Arabic", CS_ISO_8859_6, "View/Encoding/Arabic/"CS_ISO_8859_6, GTK_UI_MANAGER_MENUITEM)
1674 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding/Arabic", CS_WINDOWS_1256, "View/Encoding/Arabic/"CS_WINDOWS_1256, GTK_UI_MANAGER_MENUITEM)
1675 
1676 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding", CS_ISO_8859_9, "View/Encoding/"CS_ISO_8859_9, GTK_UI_MANAGER_MENUITEM)
1677 
1678 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding", "Cyrillic", "View/Encoding/Cyrillic", GTK_UI_MANAGER_MENU)
1679 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding/Cyrillic", CS_ISO_8859_5, "View/Encoding/Cyrillic/"CS_ISO_8859_5, GTK_UI_MANAGER_MENUITEM)
1680 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding/Cyrillic", CS_KOI8_R, "View/Encoding/Cyrillic/"CS_KOI8_R, GTK_UI_MANAGER_MENUITEM)
1681 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding/Cyrillic", CS_MACCYR, "View/Encoding/Cyrillic/"CS_MACCYR, GTK_UI_MANAGER_MENUITEM)
1682 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding/Cyrillic", CS_KOI8_U, "View/Encoding/Cyrillic/"CS_KOI8_U, GTK_UI_MANAGER_MENUITEM)
1683 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding/Cyrillic", CS_WINDOWS_1251, "View/Encoding/Cyrillic/"CS_WINDOWS_1251, GTK_UI_MANAGER_MENUITEM)
1684 
1685 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding", "Japanese", "View/Encoding/Japanese", GTK_UI_MANAGER_MENU)
1686 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding/Japanese", CS_ISO_2022_JP, "View/Encoding/Japanese/"CS_ISO_2022_JP, GTK_UI_MANAGER_MENUITEM)
1687 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding/Japanese", CS_ISO_2022_JP_2, "View/Encoding/Japanese/"CS_ISO_2022_JP_2, GTK_UI_MANAGER_MENUITEM)
1688 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding/Japanese", CS_EUC_JP, "View/Encoding/Japanese/"CS_EUC_JP, GTK_UI_MANAGER_MENUITEM)
1689 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding/Japanese", CS_SHIFT_JIS, "View/Encoding/Japanese/"CS_SHIFT_JIS, GTK_UI_MANAGER_MENUITEM)
1690 
1691 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding", "Chinese", "View/Encoding/Chinese", GTK_UI_MANAGER_MENU)
1692 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding/Chinese", CS_GB18030, "View/Encoding/Chinese/"CS_GB18030, GTK_UI_MANAGER_MENUITEM)
1693 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding/Chinese", CS_GB2312, "View/Encoding/Chinese/"CS_GB2312, GTK_UI_MANAGER_MENUITEM)
1694 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding/Chinese", CS_GBK, "View/Encoding/Chinese/"CS_GBK, GTK_UI_MANAGER_MENUITEM)
1695 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding/Chinese", CS_BIG5, "View/Encoding/Chinese/"CS_BIG5, GTK_UI_MANAGER_MENUITEM)
1696 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding/Chinese", CS_EUC_TW, "View/Encoding/Chinese/"CS_EUC_TW, GTK_UI_MANAGER_MENUITEM)
1697 
1698 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding", "Korean", "View/Encoding/Korean", GTK_UI_MANAGER_MENU)
1699 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding/Korean", CS_EUC_KR, "View/Encoding/Korean/"CS_EUC_KR, GTK_UI_MANAGER_MENUITEM)
1700 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding/Korean", CS_ISO_2022_KR, "View/Encoding/Korean/"CS_ISO_2022_KR, GTK_UI_MANAGER_MENUITEM)
1701 
1702 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding", "Thai", "View/Encoding/Thai", GTK_UI_MANAGER_MENU)
1703 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding/Thai", CS_TIS_620, "View/Encoding/Thai/"CS_TIS_620, GTK_UI_MANAGER_MENUITEM)
1704 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding/Thai", CS_WINDOWS_874, "View/Encoding/Thai/"CS_WINDOWS_874, GTK_UI_MANAGER_MENUITEM)
1705 
1706 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View", "Decode", "View/Decode", GTK_UI_MANAGER_MENU)
1707 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Decode", "AutoDetect", "View/Decode/AutoDetect", GTK_UI_MANAGER_MENUITEM)
1708 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Decode", "Separator1", "View/Decode/---", GTK_UI_MANAGER_SEPARATOR)
1709 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Decode", "8bit", "View/Decode/8bit", GTK_UI_MANAGER_MENUITEM)
1710 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Decode", "QP", "View/Decode/QP", GTK_UI_MANAGER_MENUITEM)
1711 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Decode", "B64", "View/Decode/B64", GTK_UI_MANAGER_MENUITEM)
1712 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Decode", "Uuencode", "View/Decode/Uuencode", GTK_UI_MANAGER_MENUITEM)
1713 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View", "Separator5", "View/---", GTK_UI_MANAGER_SEPARATOR)
1714 
1715 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View", "OpenNewWindow", "View/OpenNewWindow", GTK_UI_MANAGER_MENUITEM)
1716 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View", "MessageSource", "View/MessageSource", GTK_UI_MANAGER_MENUITEM)
1717 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View", "AllHeaders", "View/AllHeaders", GTK_UI_MANAGER_MENUITEM)
1718 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View", "Quotes", "View/Quotes", GTK_UI_MANAGER_MENU)
1719 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Quotes", "CollapseAll", "View/Quotes/CollapseAll", GTK_UI_MANAGER_MENUITEM)
1720 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Quotes", "Collapse2", "View/Quotes/Collapse2", GTK_UI_MANAGER_MENUITEM)
1721 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Quotes", "Collapse3", "View/Quotes/Collapse3", GTK_UI_MANAGER_MENUITEM)
1722 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View", "Part", "View/Part", GTK_UI_MANAGER_MENU)
1723 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Part", "AsText", "View/Part/AsText", GTK_UI_MANAGER_MENUITEM)
1724 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Part", "Open", "View/Part/Open", GTK_UI_MANAGER_MENUITEM)
1725 #ifndef G_OS_WIN32
1726 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Part", "OpenWith", "View/Part/OpenWith", GTK_UI_MANAGER_MENUITEM)
1727 #endif
1728 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View", "Separator8", "View/---", GTK_UI_MANAGER_SEPARATOR)
1729 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View", "UpdateSummary", "View/UpdateSummary", GTK_UI_MANAGER_MENUITEM)
1730 
1731 /* Message menu */
1732 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message", "Receive", "Message/Receive", GTK_UI_MANAGER_MENU)
1733 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/Receive", "CurrentAccount", "Message/Receive/CurrentAccount", GTK_UI_MANAGER_MENUITEM)
1734 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/Receive", "AllAccounts", "Message/Receive/AllAccounts", GTK_UI_MANAGER_MENUITEM)
1735 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/Receive", "CancelReceiving", "Message/Receive/CancelReceiving", GTK_UI_MANAGER_MENUITEM)
1736 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/Receive", "Separator1", "Message/Receive/---", GTK_UI_MANAGER_SEPARATOR)
1737 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/Receive", "PlaceHolder", "Message/Receive/PlaceHolder", GTK_UI_MANAGER_MENUITEM)
1738 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message", "SendQueue", "Message/SendQueue", GTK_UI_MANAGER_MENUITEM)
1739 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message", "CancelSending", "Message/CancelSending", GTK_UI_MANAGER_MENUITEM)
1740 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message", "Separator1", "Message/---", GTK_UI_MANAGER_SEPARATOR)
1741 
1742 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message", "ComposeEmail", "Message/ComposeEmail", GTK_UI_MANAGER_MENUITEM)
1743 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message", "ComposeNews", "Message/ComposeNews", GTK_UI_MANAGER_MENUITEM)
1744 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message", "Reply", "Message/Reply", GTK_UI_MANAGER_MENUITEM)
1745 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message", "ReplyTo", "Message/ReplyTo", GTK_UI_MANAGER_MENU)
1746 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/ReplyTo", "All", "Message/ReplyTo/All", GTK_UI_MANAGER_MENUITEM)
1747 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/ReplyTo", "Sender", "Message/ReplyTo/Sender", GTK_UI_MANAGER_MENUITEM)
1748 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/ReplyTo", "List", "Message/ReplyTo/List", GTK_UI_MANAGER_MENUITEM)
1749 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message", "FollowupReply", "Message/FollowupReply", GTK_UI_MANAGER_MENUITEM)
1750 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message", "Separator2", "Message/---", GTK_UI_MANAGER_SEPARATOR)
1751 
1752 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message", "Forward", "Message/Forward", GTK_UI_MANAGER_MENUITEM)
1753 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message", "ForwardAtt", "Message/ForwardAtt", GTK_UI_MANAGER_MENUITEM)
1754 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message", "Redirect", "Message/Redirect", GTK_UI_MANAGER_MENUITEM)
1755 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message", "MailingList", "Message/MailingList", GTK_UI_MANAGER_MENU)
1756 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/MailingList", "Post", "Message/MailingList/Post", GTK_UI_MANAGER_MENU)
1757 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/MailingList", "Help", "Message/MailingList/Help", GTK_UI_MANAGER_MENU)
1758 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/MailingList", "Subscribe", "Message/MailingList/Subscribe", GTK_UI_MANAGER_MENU)
1759 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/MailingList", "Unsubscribe", "Message/MailingList/Unsubscribe", GTK_UI_MANAGER_MENU)
1760 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/MailingList", "ViewArchive", "Message/MailingList/ViewArchive", GTK_UI_MANAGER_MENU)
1761 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/MailingList", "ContactOwner", "Message/MailingList/ContactOwner", GTK_UI_MANAGER_MENU)
1762 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/MailingList/Post", "PlaceHolder", "Message/MailingList/Post/PlaceHolder", GTK_UI_MANAGER_MENUITEM)
1763 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/MailingList/Help", "PlaceHolder", "Message/MailingList/Help/PlaceHolder", GTK_UI_MANAGER_MENUITEM)
1764 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/MailingList/Subscribe", "PlaceHolder", "Message/MailingList/Subscribe/PlaceHolder", GTK_UI_MANAGER_MENUITEM)
1765 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/MailingList/Unsubscribe", "PlaceHolder", "Message/MailingList/Unsubscribe/PlaceHolder", GTK_UI_MANAGER_MENUITEM)
1766 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/MailingList/ViewArchive", "PlaceHolder", "Message/MailingList/ViewArchive/PlaceHolder", GTK_UI_MANAGER_MENUITEM)
1767 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/MailingList/ContactOwner", "PlaceHolder", "Message/MailingList/ContactOwner/PlaceHolder", GTK_UI_MANAGER_MENUITEM)
1768 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message", "Separator3", "Message/---", GTK_UI_MANAGER_SEPARATOR)
1769 
1770 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message", "Move", "Message/Move", GTK_UI_MANAGER_MENUITEM)
1771 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message", "Copy", "Message/Copy", GTK_UI_MANAGER_MENUITEM)
1772 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message", "Trash", "Message/Trash", GTK_UI_MANAGER_MENUITEM)
1773 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message", "Delete", "Message/Delete", GTK_UI_MANAGER_MENUITEM)
1774 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message", "TrashThread", "Message/TrashThread", GTK_UI_MANAGER_MENUITEM)
1775 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message", "DeleteThread", "Message/DeleteThread", GTK_UI_MANAGER_MENUITEM)
1776 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message", "CancelNews", "Message/CancelNews", GTK_UI_MANAGER_MENUITEM)
1777 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message", "Separator4", "Message/---", GTK_UI_MANAGER_SEPARATOR)
1778 
1779 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message", "Mark", "Message/Mark", GTK_UI_MANAGER_MENU)
1780 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/Mark", "Mark", "Message/Mark/Mark", GTK_UI_MANAGER_MENUITEM)
1781 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/Mark", "Unmark", "Message/Mark/Unmark", GTK_UI_MANAGER_MENUITEM)
1782 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/Mark", "Separator1", "Message/Mark/---", GTK_UI_MANAGER_SEPARATOR)
1783 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/Mark", "MarkRead", "Message/Mark/MarkRead", GTK_UI_MANAGER_MENUITEM)
1784 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/Mark", "MarkUnread", "Message/Mark/MarkUnread", GTK_UI_MANAGER_MENUITEM)
1785 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/Mark", "Separator2", "Message/Mark/---", GTK_UI_MANAGER_SEPARATOR)
1786 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/Mark", "MarkAllRead", "Message/Mark/MarkAllRead", GTK_UI_MANAGER_MENUITEM)
1787 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/Mark", "MarkAllUnread", "Message/Mark/MarkAllUnread", GTK_UI_MANAGER_MENUITEM)
1788 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/Mark", "Separator3", "Message/Mark/---", GTK_UI_MANAGER_SEPARATOR)
1789 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/Mark", "IgnoreThread", "Message/Mark/IgnoreThread", GTK_UI_MANAGER_MENUITEM)
1790 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/Mark", "UnignoreThread", "Message/Mark/UnignoreThread", GTK_UI_MANAGER_MENUITEM)
1791 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/Mark", "WatchThread", "Message/Mark/WatchThread", GTK_UI_MANAGER_MENUITEM)
1792 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/Mark", "UnwatchThread", "Message/Mark/UnwatchThread", GTK_UI_MANAGER_MENUITEM)
1793 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/Mark", "Separator4", "Message/Mark/---", GTK_UI_MANAGER_SEPARATOR)
1794 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/Mark", "MarkSpam", "Message/Mark/MarkSpam", GTK_UI_MANAGER_MENUITEM)
1795 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/Mark", "MarkHam", "Message/Mark/MarkHam", GTK_UI_MANAGER_MENUITEM)
1796 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/Mark", "Separator5", "Message/Mark/---", GTK_UI_MANAGER_SEPARATOR)
1797 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/Mark", "Lock", "Message/Mark/Lock", GTK_UI_MANAGER_MENUITEM)
1798 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/Mark", "Unlock", "Message/Mark/Unlock", GTK_UI_MANAGER_MENUITEM)
1799 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message", "ColorLabel", "Message/ColorLabel", GTK_UI_MANAGER_MENUITEM)
1800 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message", "Tags", "Message/Tags", GTK_UI_MANAGER_MENUITEM)
1801 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message", "Separator5", "Message/---", GTK_UI_MANAGER_SEPARATOR)
1802 
1803 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message", "Reedit", "Message/Reedit", GTK_UI_MANAGER_MENUITEM)
1804 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message", "Separator6", "Message/---", GTK_UI_MANAGER_SEPARATOR)
1805 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message", "CheckSignature", "Message/CheckSignature", GTK_UI_MANAGER_MENUITEM)
1806 
1807 /* Tools menu */
1808 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools", "AddressBook", "Tools/AddressBook", GTK_UI_MANAGER_MENUITEM)
1809 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools", "AddSenderToAB", "Tools/AddSenderToAB", GTK_UI_MANAGER_MENUITEM)
1810 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools", "CollectAddresses", "Tools/CollectAddresses", GTK_UI_MANAGER_MENU)
1811 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools/CollectAddresses", "FromFolder", "Tools/CollectAddresses/FromFolder", GTK_UI_MANAGER_MENUITEM)
1812 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools/CollectAddresses", "FromSelected", "Tools/CollectAddresses/FromSelected", GTK_UI_MANAGER_MENUITEM)
1813 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools", "Separator1", "Tools/---", GTK_UI_MANAGER_SEPARATOR)
1814 
1815 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools", "FilterFolder", "Tools/FilterFolder", GTK_UI_MANAGER_MENUITEM)
1816 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools", "FilterSelected", "Tools/FilterSelected", GTK_UI_MANAGER_MENUITEM)
1817 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools", "RunProcessing", "Tools/RunProcessing", GTK_UI_MANAGER_MENUITEM)
1818 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools", "CreateFilterRule", "Tools/CreateFilterRule", GTK_UI_MANAGER_MENU)
1819 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools/CreateFilterRule", "Automatically", "Tools/CreateFilterRule/Automatically", GTK_UI_MANAGER_MENUITEM)
1820 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools/CreateFilterRule", "ByFrom", "Tools/CreateFilterRule/ByFrom", GTK_UI_MANAGER_MENUITEM)
1821 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools/CreateFilterRule", "ByTo", "Tools/CreateFilterRule/ByTo", GTK_UI_MANAGER_MENUITEM)
1822 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools/CreateFilterRule", "BySubject", "Tools/CreateFilterRule/BySubject", GTK_UI_MANAGER_MENUITEM)
1823 
1824 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools", "CreateProcessingRule", "Tools/CreateProcessingRule", GTK_UI_MANAGER_MENU)
1825 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools/CreateProcessingRule", "Automatically", "Tools/CreateProcessingRule/Automatically", GTK_UI_MANAGER_MENUITEM)
1826 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools/CreateProcessingRule", "ByFrom", "Tools/CreateProcessingRule/ByFrom", GTK_UI_MANAGER_MENUITEM)
1827 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools/CreateProcessingRule", "ByTo", "Tools/CreateProcessingRule/ByTo", GTK_UI_MANAGER_MENUITEM)
1828 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools/CreateProcessingRule", "BySubject", "Tools/CreateProcessingRule/BySubject", GTK_UI_MANAGER_MENUITEM)
1829 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools", "Separator2", "Tools/---", GTK_UI_MANAGER_SEPARATOR)
1830 
1831 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools", "ListUrls", "Tools/ListUrls", GTK_UI_MANAGER_MENUITEM)
1832 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools", "Separator3", "Tools/---", GTK_UI_MANAGER_SEPARATOR)
1833 
1834 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools", "Actions", "Tools/Actions", GTK_UI_MANAGER_MENU)
1835 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools/Actions", "PlaceHolder", "Tools/Actions/PlaceHolder", GTK_UI_MANAGER_MENUITEM)
1836 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools", "Separator4", "Tools/---", GTK_UI_MANAGER_SEPARATOR)
1837 
1838 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools", "CheckNewMessages", "Tools/CheckNewMessages", GTK_UI_MANAGER_MENUITEM)
1839 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools", "DeleteDuplicates", "Tools/DeleteDuplicates", GTK_UI_MANAGER_MENU)
1840 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools/DeleteDuplicates", "SelFolder", "Tools/DeleteDuplicates/SelFolder", GTK_UI_MANAGER_MENUITEM)
1841 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools/DeleteDuplicates", "AllFolders", "Tools/DeleteDuplicates/AllFolders", GTK_UI_MANAGER_MENUITEM)
1842 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools", "Separator5", "Tools/---", GTK_UI_MANAGER_SEPARATOR)
1843 
1844 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools", "Execute", "Tools/Execute", GTK_UI_MANAGER_MENUITEM)
1845 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools", "Expunge", "Tools/Expunge", GTK_UI_MANAGER_MENUITEM)
1846 #ifdef USE_GNUTLS
1847 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools", "Separator6", "Tools/---", GTK_UI_MANAGER_SEPARATOR)
1848 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools", "SSLCertificates", "Tools/SSLCertificates", GTK_UI_MANAGER_MENUITEM)
1849 #endif
1850 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools", "Separator7", "Tools/---", GTK_UI_MANAGER_SEPARATOR)
1851 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools", "FilteringLog", "Tools/FilteringLog", GTK_UI_MANAGER_MENUITEM)
1852 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools", "NetworkLog", "Tools/NetworkLog", GTK_UI_MANAGER_MENUITEM)
1853 #ifdef G_OS_WIN32
1854 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools", "DebugLog", "Tools/DebugLog", GTK_UI_MANAGER_MENUITEM)
1855 #endif
1856 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools", "Separator8", "Tools/---", GTK_UI_MANAGER_SEPARATOR)
1857 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools", "ForgetSessionPasswords", "Tools/ForgetSessionPasswords", GTK_UI_MANAGER_MENUITEM)
1858 #ifndef PASSWORD_CRYPTO_OLD
1859 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools", "ForgetMasterPassphrase", "Tools/ForgetMasterPassphrase", GTK_UI_MANAGER_MENUITEM)
1860 #endif
1861 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools", "Separator9", "Tools/---", GTK_UI_MANAGER_SEPARATOR)
1862 
1863 /* Configuration menu */
1864 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Configuration", "ChangeAccount", "Configuration/ChangeAccount", GTK_UI_MANAGER_MENU)
1865 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Configuration/ChangeAccount", "PlaceHolder", "Configuration/ChangeAccount/PlaceHolder", GTK_UI_MANAGER_MENUITEM)
1866 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Configuration", "AccountPrefs", "Configuration/AccountPrefs", GTK_UI_MANAGER_MENUITEM)
1867 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Configuration", "CreateAccount", "Configuration/CreateAccount", GTK_UI_MANAGER_MENUITEM)
1868 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Configuration", "EditAccounts", "Configuration/EditAccounts", GTK_UI_MANAGER_MENUITEM)
1869 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Configuration", "Separator1", "Configuration/---", GTK_UI_MANAGER_SEPARATOR)
1870 
1871 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Configuration", "Preferences", "Configuration/Preferences", GTK_UI_MANAGER_MENUITEM)
1872 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Configuration", "PreProcessing", "Configuration/PreProcessing", GTK_UI_MANAGER_MENUITEM)
1873 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Configuration", "PostProcessing", "Configuration/PostProcessing", GTK_UI_MANAGER_MENUITEM)
1874 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Configuration", "Filtering", "Configuration/Filtering", GTK_UI_MANAGER_MENUITEM)
1875 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Configuration", "Templates", "Configuration/Templates", GTK_UI_MANAGER_MENUITEM)
1876 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Configuration", "Actions", "Configuration/Actions", GTK_UI_MANAGER_MENUITEM)
1877 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Configuration", "Tags", "Configuration/Tags", GTK_UI_MANAGER_MENUITEM)
1878 
1879 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Configuration", "Separator2", "Configuration/---", GTK_UI_MANAGER_SEPARATOR)
1880 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Configuration", "Plugins", "Configuration/Plugins", GTK_UI_MANAGER_MENUITEM)
1881 
1882 /* Help menu */
1883 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Help", "Manual", "Help/Manual", GTK_UI_MANAGER_MENUITEM)
1884 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Help", "FAQ", "Help/FAQ", GTK_UI_MANAGER_MENUITEM)
1885 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Help", "IconLegend", "Help/IconLegend", GTK_UI_MANAGER_MENUITEM)
1886 #ifdef G_OS_WIN32
1887 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Help", "Separator1", "Help/---", GTK_UI_MANAGER_SEPARATOR)
1888 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Help", "SetDefault", "Help/SetDefault", GTK_UI_MANAGER_MENUITEM)
1889 #endif
1890 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Help", "Separator2", "Help/---", GTK_UI_MANAGER_SEPARATOR)
1891 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Help", "About", "Help/About", GTK_UI_MANAGER_MENUITEM)
1892 
1893 
1894 	menubar = gtk_ui_manager_get_widget(mainwin->ui_manager, "/Menu");
1895 	if (prefs_common.mainwin_menubar)
1896 		gtk_widget_show_all(menubar);
1897 	else
1898 		gtk_widget_hide(menubar);
1899 	gtk_window_add_accel_group(GTK_WINDOW(window), gtk_ui_manager_get_accel_group(mainwin->ui_manager));
1900 
1901 	/* Create a menu container for the different popup menus we
1902 	 * will be adding from other UI elements. */
1903 	MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/", "Menus", "Menus", GTK_UI_MANAGER_MENUBAR)
1904 
1905 	gtk_box_pack_start(GTK_BOX(vbox), menubar, FALSE, TRUE, 0);
1906 
1907 	if (prefs_common.toolbar_detachable) {
1908 		handlebox = gtk_handle_box_new();
1909 		gtk_widget_show(handlebox);
1910 		gtk_box_pack_start(GTK_BOX(vbox), handlebox, FALSE, FALSE, 0);
1911 		g_signal_connect(G_OBJECT(handlebox), "child_attached",
1912 				 G_CALLBACK(toolbar_child_attached), mainwin);
1913 		g_signal_connect(G_OBJECT(handlebox), "child_detached",
1914 				 G_CALLBACK(toolbar_child_detached), mainwin);
1915 	} else {
1916 		handlebox = gtk_hbox_new(FALSE, 0);
1917 		gtk_widget_show(handlebox);
1918 		gtk_box_pack_start(GTK_BOX(vbox), handlebox, FALSE, FALSE, 0);
1919 	}
1920 	/* link window to mainwin->window to avoid gdk warnings */
1921 	mainwin->window       = window;
1922 	mainwin_list = g_list_append(mainwin_list, mainwin);
1923 
1924 	mainwin->toolbar = toolbar_create(TOOLBAR_MAIN,
1925 					  handlebox,
1926 					  (gpointer)mainwin);
1927 	toolbar_set_learn_button
1928 		(mainwin->toolbar,
1929 		 LEARN_SPAM);
1930 
1931 	/* vbox that contains body */
1932 	vbox_body = gtk_vbox_new(FALSE, BORDER_WIDTH);
1933 	gtk_widget_show(vbox_body);
1934 	gtk_container_set_border_width(GTK_CONTAINER(vbox_body), BORDER_WIDTH);
1935 	gtk_box_pack_start(GTK_BOX(vbox), vbox_body, TRUE, TRUE, 0);
1936 
1937 #ifndef GENERIC_UMPC
1938 	hbox_stat = gtk_hbox_new(FALSE, 2);
1939 	gtk_box_pack_end(GTK_BOX(vbox_body), hbox_stat, FALSE, FALSE, 0);
1940 
1941 	warning_icon = gtk_image_new_from_stock
1942                         (GTK_STOCK_DIALOG_WARNING, GTK_ICON_SIZE_SMALL_TOOLBAR);
1943 	warning_btn = gtk_event_box_new();
1944 	gtk_event_box_set_visible_window(GTK_EVENT_BOX(warning_btn), FALSE);
1945 
1946 	mainwin->warning_btn      = warning_btn;
1947 
1948 	g_signal_connect(G_OBJECT(warning_btn), "button-press-event",
1949 			 G_CALLBACK(warning_icon_pressed),
1950 			 (gpointer) mainwin);
1951 	g_signal_connect(G_OBJECT(warning_btn), "motion-notify-event",
1952 			 G_CALLBACK(warning_visi_notify), mainwin);
1953 	g_signal_connect(G_OBJECT(warning_btn), "leave-notify-event",
1954 			 G_CALLBACK(warning_leave_notify), mainwin);
1955 	g_signal_connect(G_OBJECT(warning_btn), "enter-notify-event",
1956 			 G_CALLBACK(warning_enter_notify), mainwin);
1957 
1958 	gtk_container_add (GTK_CONTAINER(warning_btn), warning_icon);
1959 
1960 	CLAWS_SET_TIP(warning_btn,
1961 			     _("Some error(s) happened. Click here to view log."));
1962 	gtk_box_pack_start(GTK_BOX(hbox_stat), warning_btn, FALSE, FALSE, 0);
1963 
1964 	statusbar = statusbar_create();
1965 	gtk_box_pack_start(GTK_BOX(hbox_stat), statusbar, TRUE, TRUE, 0);
1966 
1967 	progressbar = gtk_progress_bar_new();
1968 	gtk_widget_set_size_request(progressbar, 120, 1);
1969 	gtk_box_pack_start(GTK_BOX(hbox_stat), progressbar, FALSE, FALSE, 0);
1970 
1971 	online_pixmap = stock_pixmap_widget(STOCK_PIXMAP_ONLINE);
1972 	offline_pixmap = stock_pixmap_widget(STOCK_PIXMAP_OFFLINE);
1973 	online_switch = gtk_button_new ();
1974 	gtk_widget_set_can_focus(online_switch, FALSE);
1975 	CLAWS_SET_TIP(online_switch,
1976 			     _("You are online. Click the icon to go offline"));
1977 	offline_switch = gtk_button_new ();
1978 	CLAWS_SET_TIP(offline_switch,
1979 			     _("You are offline. Click the icon to go online"));
1980 	gtk_container_add (GTK_CONTAINER(online_switch), online_pixmap);
1981 	gtk_button_set_relief (GTK_BUTTON(online_switch), GTK_RELIEF_NONE);
1982 	g_signal_connect (G_OBJECT(online_switch), "clicked", G_CALLBACK(online_switch_clicked), mainwin);
1983 	gtk_box_pack_start (GTK_BOX(hbox_stat), online_switch, FALSE, FALSE, 0);
1984 	gtk_container_add (GTK_CONTAINER(offline_switch), offline_pixmap);
1985 	gtk_button_set_relief (GTK_BUTTON(offline_switch), GTK_RELIEF_NONE);
1986 	g_signal_connect (G_OBJECT(offline_switch), "clicked", G_CALLBACK(online_switch_clicked), mainwin);
1987 	gtk_box_pack_start (GTK_BOX(hbox_stat), offline_switch, FALSE, FALSE, 0);
1988 
1989 	statuslabel = gtk_label_new("");
1990 	gtk_box_pack_start(GTK_BOX(hbox_stat), statuslabel, FALSE, FALSE, 0);
1991 
1992 	ac_button = gtk_button_new();
1993 	CLAWS_SET_TIP(ac_button, _("Select account"));
1994 	gtk_widget_set_can_focus(ac_button, FALSE);
1995 	gtk_widget_set_size_request(ac_button, -1, 0);
1996 	gtk_box_pack_end(GTK_BOX(hbox_stat), ac_button, FALSE, FALSE, 0);
1997 	g_signal_connect(G_OBJECT(ac_button), "button_press_event",
1998 			 G_CALLBACK(ac_label_button_pressed), mainwin);
1999 
2000 	ac_label = gtk_label_new("");
2001 	gtk_container_add(GTK_CONTAINER(ac_button), ac_label);
2002 
2003 	gtk_widget_show_all(hbox_stat);
2004 
2005 	gtk_widget_hide(offline_switch);
2006 	gtk_widget_hide(progressbar);
2007 	gtk_widget_hide(warning_btn);
2008 #else
2009 	online_switch = gtk_button_new ();
2010 	offline_switch = gtk_button_new ();
2011 	g_signal_connect (G_OBJECT(online_switch), "clicked", G_CALLBACK(online_switch_clicked), mainwin);
2012 	g_signal_connect (G_OBJECT(offline_switch), "clicked", G_CALLBACK(online_switch_clicked), mainwin);
2013 #endif
2014 	/* create views */
2015 	mainwin->folderview  = folderview  = folderview_create(mainwin);
2016 	mainwin->summaryview = summaryview = summary_create(mainwin);
2017 	mainwin->messageview = messageview = messageview_create(mainwin);
2018 
2019 	/* init log instances data before creating log views */
2020 	set_log_title(LOG_PROTOCOL, _("Network log"));
2021 	set_log_prefs(LOG_PROTOCOL,
2022 			&prefs_common.logwin_width,
2023 			&prefs_common.logwin_height);
2024 	set_log_title(LOG_DEBUG_FILTERING, _("Filtering/Processing debug log"));
2025 	set_log_prefs(LOG_DEBUG_FILTERING,
2026 			&prefs_common.filtering_debugwin_width,
2027 			&prefs_common.filtering_debugwin_height);
2028 
2029 	/* setup log windows */
2030 	mainwin->logwin = log_window_create(LOG_PROTOCOL);
2031 	log_window_init(mainwin->logwin);
2032 
2033 	mainwin->filtering_debugwin = log_window_create(LOG_DEBUG_FILTERING);
2034 	log_window_set_clipping(mainwin->logwin,
2035 				prefs_common.cliplog,
2036 				prefs_common.loglength);
2037 
2038 	log_window_init(mainwin->filtering_debugwin);
2039 	log_window_set_clipping(mainwin->filtering_debugwin,
2040 				prefs_common.filtering_debug_cliplog,
2041 				prefs_common.filtering_debug_loglength);
2042 	if (prefs_common.enable_filtering_debug)
2043 		log_message(LOG_DEBUG_FILTERING, _("filtering log enabled\n"));
2044 	else
2045 		log_message(LOG_DEBUG_FILTERING, _("filtering log disabled\n"));
2046 
2047 	folderview->mainwin      = mainwin;
2048 	folderview->summaryview  = summaryview;
2049 
2050 	summaryview->mainwin     = mainwin;
2051 	summaryview->folderview  = folderview;
2052 	summaryview->messageview = messageview;
2053 	summaryview->window      = window;
2054 
2055 	mainwin->vbox           = vbox;
2056 	mainwin->menubar        = menubar;
2057 	mainwin->handlebox      = handlebox;
2058 	mainwin->vbox_body      = vbox_body;
2059 	mainwin->online_switch  = online_switch;
2060 	mainwin->offline_switch    = offline_switch;
2061 #ifndef GENERIC_UMPC
2062 	messageview->statusbar  = statusbar;
2063 	mainwin->statusbar      = statusbar;
2064 	mainwin->hbox_stat      = hbox_stat;
2065 	mainwin->progressbar    = progressbar;
2066 	mainwin->statuslabel    = statuslabel;
2067 	mainwin->online_pixmap  = online_pixmap;
2068 	mainwin->offline_pixmap = offline_pixmap;
2069 	mainwin->ac_button      = ac_button;
2070 	mainwin->ac_label       = ac_label;
2071 	/* set context IDs for status bar */
2072 	mainwin->mainwin_cid = gtk_statusbar_get_context_id
2073 		(GTK_STATUSBAR(statusbar), "Main Window");
2074 	mainwin->folderview_cid = gtk_statusbar_get_context_id
2075 		(GTK_STATUSBAR(statusbar), "Folder View");
2076 	mainwin->summaryview_cid = gtk_statusbar_get_context_id
2077 		(GTK_STATUSBAR(statusbar), "Summary View");
2078 	mainwin->messageview_cid = gtk_statusbar_get_context_id
2079 		(GTK_STATUSBAR(statusbar), "Message View");
2080 	messageview->statusbar_cid = mainwin->messageview_cid;
2081 
2082 #else
2083 	messageview->statusbar  = NULL;
2084 	mainwin->statusbar 	= NULL;
2085 	mainwin->hbox_stat	= NULL;
2086 	/* mainwin->progressbar is set in toolbar.c */
2087 	mainwin->statuslabel    = NULL;
2088 	mainwin->online_pixmap  = NULL;
2089 	mainwin->offline_pixmap = NULL;
2090 	mainwin->ac_button      = NULL;
2091 	mainwin->ac_label       = NULL;
2092 #endif
2093 
2094 	/* allocate colors for summary view and folder view */
2095 	summaryview->color_marked.red = summaryview->color_marked.green = 0;
2096 	summaryview->color_marked.blue = (guint16)65535;
2097 
2098 	summaryview->color_dim.red = summaryview->color_dim.green =
2099 		summaryview->color_dim.blue = COLOR_DIM;
2100 
2101 	gtkut_convert_int_to_gdk_color(prefs_common.color[COL_NEW],
2102 				       &folderview->color_new);
2103 
2104 	gtkut_convert_int_to_gdk_color(prefs_common.color[COL_TGT_FOLDER],
2105 				       &folderview->color_op);
2106 
2107 	color[0] = summaryview->color_marked;
2108 	color[1] = summaryview->color_dim;
2109 	color[2] = folderview->color_new;
2110 	color[3] = folderview->color_op;
2111 
2112 	colormap = gdk_drawable_get_colormap(gtk_widget_get_window(window));
2113 	gdk_colormap_alloc_colors(colormap, color, 4, FALSE, TRUE, success);
2114 	for (i = 0; i < 4; i++) {
2115 		if (success[i] == FALSE)
2116 			g_warning("MainWindow: color allocation %d failed", i);
2117 	}
2118 
2119 	debug_print("done.\n");
2120 
2121 	messageview->visible = prefs_common.msgview_visible;
2122 
2123 	main_window_set_widgets(mainwin, prefs_common.layout_mode);
2124 
2125 	g_signal_connect(G_OBJECT(window), "size_allocate",
2126 			 G_CALLBACK(main_window_size_allocate_cb),
2127 			 mainwin);
2128 
2129 	/* set menu items */
2130 	cm_toggle_menu_set_active_full(mainwin->ui_manager, "Menu/View/Encoding/"CS_AUTO, TRUE);
2131 
2132 	menuitem = NULL;
2133 	switch (prefs_common.toolbar_style) {
2134 	case TOOLBAR_NONE:
2135 		menuitem = gtk_ui_manager_get_widget(mainwin->ui_manager, "/Menu/View/ShowHide/Toolbar/Hide");
2136 		break;
2137 	case TOOLBAR_ICON:
2138 		menuitem = gtk_ui_manager_get_widget(mainwin->ui_manager, "/Menu/View/ShowHide/Toolbar/IconOnly");
2139 		break;
2140 	case TOOLBAR_TEXT:
2141 		menuitem = gtk_ui_manager_get_widget(mainwin->ui_manager, "/Menu/View/ShowHide/Toolbar/TextOnly");
2142 		break;
2143 	case TOOLBAR_BOTH:
2144 		menuitem = gtk_ui_manager_get_widget(mainwin->ui_manager, "/Menu/View/ShowHide/Toolbar/TextBelowIcon");
2145 		break;
2146 	case TOOLBAR_BOTH_HORIZ:
2147 		menuitem = gtk_ui_manager_get_widget(mainwin->ui_manager, "/Menu/View/ShowHide/Toolbar/TextBesideIcon");
2148 	}
2149 	gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menuitem), TRUE);
2150 
2151 	toolbar_set_style(mainwin->toolbar->toolbar,
2152 			  mainwin->handlebox,
2153 			  prefs_common.toolbar_style);
2154 #ifndef GENERIC_UMPC
2155 	gtk_widget_hide(mainwin->hbox_stat);
2156 	menuitem = gtk_ui_manager_get_widget(mainwin->ui_manager, "/Menu/View/ShowHide/StatusBar");
2157 	gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menuitem),
2158 				       prefs_common.show_statusbar);
2159 #endif
2160 	menuitem = gtk_ui_manager_get_widget(mainwin->ui_manager, "/Menu/View/ShowHide/ColumnHeaders");
2161 	gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menuitem),
2162 				       prefs_common.show_col_headers);
2163 	/* set account selection menu */
2164 	ac_menu = gtk_ui_manager_get_widget(mainwin->ui_manager, "/Menu/Configuration/ChangeAccount");
2165 	mainwin->ac_menu = ac_menu;
2166 
2167 	toolbar_main_set_sensitive(mainwin);
2168 
2169 	/* create actions menu */
2170 	main_window_update_actions_menu(mainwin);
2171 
2172 	main_create_mailing_list_menu (mainwin, NULL);
2173 
2174 	/* attach accel groups to main window */
2175 #define	ADD_MENU_ACCEL_GROUP_TO_WINDOW(menu,win)			\
2176 	gtk_window_add_accel_group					\
2177 		(GTK_WINDOW(win), 					\
2178 		 gtk_ui_manager_get_accel_group(gtkut_ui_manager()));
2179 
2180 	ADD_MENU_ACCEL_GROUP_TO_WINDOW(summaryview->popupmenu, mainwin->window);
2181 
2182 	g_signal_connect(G_OBJECT(window), "window_state_event",
2183 			 G_CALLBACK(mainwindow_state_event_cb), mainwin);
2184 	g_signal_connect(G_OBJECT(window), "visibility_notify_event",
2185 			 G_CALLBACK(mainwindow_visibility_event_cb), mainwin);
2186 	gtk_widget_add_events(GTK_WIDGET(window), GDK_VISIBILITY_NOTIFY_MASK);
2187 
2188 	if (prefs_common.layout_mode == VERTICAL_LAYOUT ||
2189 	    prefs_common.layout_mode == SMALL_LAYOUT) {
2190 		summary_relayout(mainwin->summaryview);
2191 	}
2192 	summary_update_unread(mainwin->summaryview, NULL);
2193 
2194 	/* initialize views */
2195 	folderview_init(folderview);
2196 	summary_init(summaryview);
2197 	messageview_init(messageview);
2198 #ifdef USE_GNUTLS
2199 	sslcertwindow_register_hook();
2200 #endif
2201 	mainwin->lock_count = 0;
2202 	mainwin->menu_lock_count = 0;
2203 	mainwin->cursor_count = 0;
2204 
2205 	mainwin->progressindicator_hook =
2206 		hooks_register_hook(PROGRESSINDICATOR_HOOKLIST, mainwindow_progressindicator_hook, mainwin);
2207 
2208 	if (!watch_cursor)
2209 		watch_cursor = gdk_cursor_new(GDK_WATCH);
2210 	if (!hand_cursor)
2211 		hand_cursor = gdk_cursor_new(GDK_HAND2);
2212 
2213 	/* init work_offline */
2214 	if (prefs_common.work_offline)
2215 		online_switch_clicked (GTK_BUTTON(online_switch), mainwin);
2216 
2217 	mainwindow_colorlabel_menu_create(mainwin, FALSE);
2218 	mainwindow_tags_menu_create(mainwin, FALSE);
2219 
2220 	if (prefs_common.mainwin_fullscreen) {
2221 		cm_toggle_menu_set_active_full(mainwin->ui_manager,
2222 			"Menu/View/FullScreen",
2223 			TRUE);
2224 	}
2225 	if (prefs_common.mainwin_menubar)
2226 		cm_toggle_menu_set_active_full(mainwin->ui_manager,"Menu/View/ShowHide/MenuBar", TRUE);
2227 
2228 	return mainwin;
2229 }
2230 
main_window_update_actions_menu(MainWindow * mainwin)2231 void main_window_update_actions_menu(MainWindow *mainwin)
2232 {
2233 	action_update_mainwin_menu(mainwin->ui_manager, "/Menu/Tools/Actions", mainwin);
2234 }
2235 
main_window_cursor_wait(MainWindow * mainwin)2236 void main_window_cursor_wait(MainWindow *mainwin)
2237 {
2238 
2239 	if (mainwin->cursor_count == 0) {
2240 		gdk_window_set_cursor(gtk_widget_get_window(mainwin->window), watch_cursor);
2241 		textview_cursor_wait(mainwin->messageview->mimeview->textview);
2242 	}
2243 
2244 	mainwin->cursor_count++;
2245 
2246 	gdk_flush();
2247 }
2248 
main_window_cursor_normal(MainWindow * mainwin)2249 void main_window_cursor_normal(MainWindow *mainwin)
2250 {
2251 	if (mainwin->cursor_count)
2252 		mainwin->cursor_count--;
2253 
2254 	if (mainwin->cursor_count == 0) {
2255 		gdk_window_set_cursor(gtk_widget_get_window(mainwin->window), NULL);
2256 		textview_cursor_normal(mainwin->messageview->mimeview->textview);
2257 	}
2258 	gdk_flush();
2259 }
2260 
2261 /* lock / unlock the user-interface */
main_window_lock(MainWindow * mainwin)2262 void main_window_lock(MainWindow *mainwin)
2263 {
2264 	if (mainwin->lock_count == 0 && mainwin->ac_button)
2265 		gtk_widget_set_sensitive(mainwin->ac_button, FALSE);
2266 
2267 	mainwin->lock_count++;
2268 
2269 	main_window_set_menu_sensitive(mainwin);
2270 	toolbar_main_set_sensitive(mainwin);
2271 }
2272 
main_window_unlock(MainWindow * mainwin)2273 void main_window_unlock(MainWindow *mainwin)
2274 {
2275 	if (mainwin->lock_count)
2276 		mainwin->lock_count--;
2277 
2278 	main_window_set_menu_sensitive(mainwin);
2279 	toolbar_main_set_sensitive(mainwin);
2280 
2281 	if (mainwin->lock_count == 0 && mainwin->ac_button)
2282 		gtk_widget_set_sensitive(mainwin->ac_button, TRUE);
2283 }
2284 
main_window_menu_callback_block(MainWindow * mainwin)2285 static void main_window_menu_callback_block(MainWindow *mainwin)
2286 {
2287 	mainwin->menu_lock_count++;
2288 }
2289 
main_window_menu_callback_unblock(MainWindow * mainwin)2290 static void main_window_menu_callback_unblock(MainWindow *mainwin)
2291 {
2292 	if (mainwin->menu_lock_count)
2293 		mainwin->menu_lock_count--;
2294 }
2295 
2296 static guint prefs_tag = 0;
2297 
main_window_reflect_prefs_all(void)2298 void main_window_reflect_prefs_all(void)
2299 {
2300 	main_window_reflect_prefs_all_real(FALSE);
2301 }
2302 
reflect_prefs_timeout_cb(gpointer data)2303 static gboolean reflect_prefs_timeout_cb(gpointer data)
2304 {
2305 	gboolean pixmap_theme_changed = GPOINTER_TO_INT(data);
2306 	GList *cur;
2307 	MainWindow *mainwin;
2308 #ifndef GENERIC_UMPC
2309 	GtkWidget *pixmap;
2310 #endif
2311 	for (cur = mainwin_list; cur != NULL; cur = cur->next) {
2312 		mainwin = (MainWindow *)cur->data;
2313 
2314 		main_window_show_cur_account(mainwin);
2315 		main_window_set_menu_sensitive(mainwin);
2316 		toolbar_main_set_sensitive(mainwin);
2317 
2318 		/* pixmap themes */
2319 		if (pixmap_theme_changed) {
2320 			toolbar_update(TOOLBAR_MAIN, mainwin);
2321 			messageview_reflect_prefs_pixmap_theme();
2322 			compose_reflect_prefs_pixmap_theme();
2323 			folderview_reinit_fonts(mainwin->folderview);
2324 			summary_reflect_prefs_pixmap_theme(mainwin->summaryview);
2325 			foldersel_reflect_prefs_pixmap_theme();
2326 #ifndef USE_ALT_ADDRBOOK
2327 			addressbook_reflect_prefs_pixmap_theme();
2328 #endif
2329 #ifndef GENERIC_UMPC
2330 			pixmap = stock_pixmap_widget(STOCK_PIXMAP_ONLINE);
2331 			gtk_container_remove(GTK_CONTAINER(mainwin->online_switch),
2332 					     mainwin->online_pixmap);
2333 			gtk_container_add (GTK_CONTAINER(mainwin->online_switch), pixmap);
2334 			gtk_widget_show(pixmap);
2335 			mainwin->online_pixmap = pixmap;
2336 			pixmap = stock_pixmap_widget(STOCK_PIXMAP_OFFLINE);
2337 			gtk_container_remove(GTK_CONTAINER(mainwin->offline_switch),
2338 					     mainwin->offline_pixmap);
2339 			gtk_container_add (GTK_CONTAINER(mainwin->offline_switch), pixmap);
2340 			gtk_widget_show(pixmap);
2341 			mainwin->offline_pixmap = pixmap;
2342 #endif
2343 			hooks_invoke(THEME_CHANGED_HOOKLIST, NULL);
2344 		}
2345 
2346 		headerview_set_font(mainwin->messageview->headerview);
2347 		headerview_set_visibility(mainwin->messageview->headerview,
2348 					  prefs_common.display_header_pane);
2349 		textview_reflect_prefs(mainwin->messageview->mimeview->textview);
2350 		folderview_reflect_prefs();
2351 		summary_reflect_prefs();
2352 #ifndef GENERIC_UMPC
2353 		summary_redisplay_msg(mainwin->summaryview);
2354 #endif
2355 		if (prefs_common.layout_mode == SMALL_LAYOUT) {
2356 			if (mainwin->in_folder) {
2357 				mainwindow_enter_folder(mainwin);
2358 			} else {
2359 				mainwindow_exit_folder(mainwin);
2360 			}
2361 		}
2362 	}
2363 	prefs_tag = 0;
2364 	return FALSE;
2365 }
2366 
main_window_reflect_prefs_all_now(void)2367 void main_window_reflect_prefs_all_now(void)
2368 {
2369 	reflect_prefs_timeout_cb(GINT_TO_POINTER(FALSE));
2370 }
2371 
main_window_reflect_prefs_custom_colors(MainWindow * mainwin)2372 void main_window_reflect_prefs_custom_colors(MainWindow *mainwin)
2373 {
2374 	GtkMenuShell *menu;
2375 	GList *children, *cur;
2376 
2377 	/* re-create colorlabel submenu */
2378 	menu = GTK_MENU_SHELL(mainwin->colorlabel_menu);
2379 	cm_return_if_fail(menu != NULL);
2380 
2381 	/* clear items. get item pointers. */
2382 	children = gtk_container_get_children(GTK_CONTAINER(menu));
2383 	for (cur = children; cur != NULL && cur->data != NULL; cur = cur->next) {
2384 		g_signal_handlers_disconnect_matched
2385 			 (gtk_ui_manager_get_accel_group(mainwin->ui_manager),
2386 			 G_SIGNAL_MATCH_DATA|G_SIGNAL_MATCH_FUNC,
2387 			 0, 0, NULL, mainwin_accel_changed_cb, cur->data);
2388 		gtk_menu_item_set_submenu(GTK_MENU_ITEM(cur->data), NULL);
2389 	}
2390 	g_list_free(children);
2391 	mainwindow_colorlabel_menu_create(mainwin, TRUE);
2392 	summary_reflect_prefs_custom_colors(mainwin->summaryview);
2393 	folderview_reinit_fonts(mainwin->folderview);
2394 }
2395 
2396 static gint tags_tag = 0;
main_window_reflect_tags_changes_real(gpointer data)2397 static gboolean main_window_reflect_tags_changes_real(gpointer data)
2398 {
2399 	GtkMenuShell *menu;
2400 	GList *children, *cur;
2401 	MainWindow *mainwin = (MainWindow *)data;
2402 
2403 	if (summary_is_locked(mainwin->summaryview)) {
2404 		return TRUE;
2405 	}
2406 	/* re-create tags submenu */
2407 	menu = GTK_MENU_SHELL(mainwin->tags_menu);
2408 	cm_return_val_if_fail(menu != NULL, FALSE);
2409 
2410 	/* clear items. get item pointers. */
2411 	children = gtk_container_get_children(GTK_CONTAINER(menu));
2412 	for (cur = children; cur != NULL && cur->data != NULL; cur = cur->next) {
2413 		gtk_menu_item_set_submenu(GTK_MENU_ITEM(cur->data), NULL);
2414 	}
2415 	g_list_free(children);
2416 	mainwindow_tags_menu_create(mainwin, TRUE);
2417 	summary_reflect_tags_changes(mainwin->summaryview);
2418 
2419 	tags_tag = 0;
2420 	return FALSE;
2421 }
2422 
main_window_reflect_tags_changes(MainWindow * mainwin)2423 void main_window_reflect_tags_changes(MainWindow *mainwin)
2424 {
2425 	if (tags_tag == 0) {
2426 		tags_tag = g_timeout_add(100, main_window_reflect_tags_changes_real,
2427 						mainwin);
2428 	}
2429 }
2430 
main_window_reflect_prefs_all_real(gboolean pixmap_theme_changed)2431 void main_window_reflect_prefs_all_real(gboolean pixmap_theme_changed)
2432 {
2433 	if (prefs_tag == 0) {
2434 		prefs_tag = g_timeout_add(100, reflect_prefs_timeout_cb,
2435 						GINT_TO_POINTER(pixmap_theme_changed));
2436 	}
2437 }
2438 
main_window_set_summary_column(void)2439 void main_window_set_summary_column(void)
2440 {
2441 	GList *cur;
2442 	MainWindow *mainwin;
2443 
2444 	for (cur = mainwin_list; cur != NULL; cur = cur->next) {
2445 		mainwin = (MainWindow *)cur->data;
2446 		summary_set_column_order(mainwin->summaryview);
2447 	}
2448 }
2449 
main_window_set_folder_column(void)2450 void main_window_set_folder_column(void)
2451 {
2452 	GList *cur;
2453 	MainWindow *mainwin;
2454 
2455 	for (cur = mainwin_list; cur != NULL; cur = cur->next) {
2456 		mainwin = (MainWindow *)cur->data;
2457 		folderview_set_column_order(mainwin->folderview);
2458 	}
2459 }
2460 
main_window_set_account_selector_menu(MainWindow * mainwin,GList * account_list)2461 static void main_window_set_account_selector_menu(MainWindow *mainwin,
2462 						  GList *account_list)
2463 {
2464 	GList *cur_ac;
2465 	GtkWidget *menuitem;
2466 	PrefsAccount *ac_prefs;
2467 	GtkWidget *menu;
2468 	gchar *accel_path;
2469 
2470 	menu = gtk_menu_new();
2471 	gtk_menu_set_accel_group (GTK_MENU (menu),
2472 		gtk_ui_manager_get_accel_group(mainwin->ui_manager));
2473 
2474 	for (cur_ac = account_list; cur_ac != NULL; cur_ac = cur_ac->next) {
2475 		ac_prefs = (PrefsAccount *)cur_ac->data;
2476 
2477 		menuitem = gtk_menu_item_new_with_label
2478 			(ac_prefs->account_name
2479 			 ? ac_prefs->account_name : _("Untitled"));
2480 		gtk_widget_show(menuitem);
2481 		gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem);
2482 		g_signal_connect(G_OBJECT(menuitem), "activate",
2483 				 G_CALLBACK(account_selector_menu_cb),
2484 				 ac_prefs);
2485 		accel_path = g_strconcat("<Actions>/Menu/Configuration/ChangeAccount/",(ac_prefs->account_name
2486 			 ? ac_prefs->account_name : _("Untitled")), NULL );
2487 		gtk_menu_item_set_accel_path(GTK_MENU_ITEM(menuitem), accel_path);
2488 		g_free(accel_path);
2489 	}
2490 	gtk_menu_item_set_submenu(GTK_MENU_ITEM(mainwin->ac_menu), menu);
2491 }
2492 
main_window_set_account_receive_menu(MainWindow * mainwin,GList * account_list)2493 static void main_window_set_account_receive_menu(MainWindow *mainwin,
2494 						 GList *account_list)
2495 {
2496 	GList *children, *child;
2497 	GtkWidget *menu;
2498 	GtkWidget *menuitem;
2499 	PrefsAccount *ac_prefs;
2500 
2501 	menu = gtk_menu_item_get_submenu(GTK_MENU_ITEM(
2502 		gtk_ui_manager_get_widget(mainwin->ui_manager, "/Menu/Message/Receive")));
2503 
2504 	/* search for separator */
2505 	children = gtk_container_get_children(GTK_CONTAINER(menu));
2506 	for (child = children; child != NULL; child = child->next) {
2507 		if (child->data == gtk_ui_manager_get_widget(mainwin->ui_manager, "/Menu/Message/Receive/Separator1")) {
2508 			child = child->next;
2509 			break;
2510 		}
2511 	}
2512 
2513 	/* destroy all previous menu item */
2514 	while (child != NULL) {
2515 		gtk_widget_destroy(GTK_WIDGET(child->data));
2516 		child = child->next;
2517 	}
2518 
2519 	g_list_free(children);
2520 
2521 	for (child = account_list; child != NULL; child = child->next) {
2522 		ac_prefs = (PrefsAccount *)child->data;
2523 
2524 		if (ac_prefs->protocol == A_NONE)
2525 			continue;
2526 
2527 		menuitem = gtk_menu_item_new_with_label
2528 			(ac_prefs->account_name ? ac_prefs->account_name
2529 			 : _("Untitled"));
2530 		gtk_widget_show(menuitem);
2531 		gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem);
2532 		g_signal_connect(G_OBJECT(menuitem), "activate",
2533 				 G_CALLBACK(account_receive_menu_cb),
2534 				 ac_prefs);
2535 	}
2536 }
2537 
main_window_set_toolbar_combo_receive_menu(MainWindow * mainwin,GList * account_list)2538 static void main_window_set_toolbar_combo_receive_menu(MainWindow *mainwin,
2539 						       GList *account_list)
2540 {
2541 	GList *cur_ac;
2542 	GtkWidget *menuitem;
2543 	PrefsAccount *ac_prefs;
2544 	GtkWidget *menu = NULL;
2545 
2546 	if (mainwin->toolbar->getall_btn == NULL) /* button doesn't exist */
2547 		return;
2548 
2549 	menu = gtk_menu_tool_button_get_menu(GTK_MENU_TOOL_BUTTON(mainwin->toolbar->getall_btn));
2550 	if (menu)
2551 		gtk_widget_destroy(menu);
2552 	menu = gtk_menu_new();
2553 
2554 	for (cur_ac = account_list; cur_ac != NULL; cur_ac = cur_ac->next) {
2555 		ac_prefs = (PrefsAccount *)cur_ac->data;
2556 
2557 		if (ac_prefs->protocol == A_NONE)
2558 			continue;
2559 
2560 		menuitem = gtk_menu_item_new_with_label
2561 			(ac_prefs->account_name
2562 			 ? ac_prefs->account_name : _("Untitled"));
2563 		gtk_widget_show(menuitem);
2564 		gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem);
2565 		g_signal_connect(G_OBJECT(menuitem), "activate",
2566 				 G_CALLBACK(account_receive_menu_cb),
2567 				 ac_prefs);
2568 	}
2569 	gtk_menu_tool_button_set_menu(GTK_MENU_TOOL_BUTTON(mainwin->toolbar->getall_btn), menu);
2570 }
2571 
main_window_set_toolbar_combo_compose_menu(MainWindow * mainwin,GList * account_list)2572 static void main_window_set_toolbar_combo_compose_menu(MainWindow *mainwin,
2573 						       GList *account_list)
2574 {
2575 #ifndef GENERIC_UMPC
2576 	GList *cur_ac;
2577 	GtkWidget *menuitem;
2578 	PrefsAccount *ac_prefs;
2579 	GtkWidget *menu = NULL;
2580 
2581 	if (mainwin->toolbar->compose_mail_btn == NULL) /* button doesn't exist */
2582 		return;
2583 
2584 	menu = gtk_menu_tool_button_get_menu(GTK_MENU_TOOL_BUTTON(mainwin->toolbar->compose_mail_btn));
2585 	if (menu)
2586 		gtk_widget_destroy(menu);
2587 	menu = gtk_menu_new();
2588 
2589 	for (cur_ac = account_list; cur_ac != NULL; cur_ac = cur_ac->next) {
2590 		ac_prefs = (PrefsAccount *)cur_ac->data;
2591 
2592 		menuitem = gtk_menu_item_new_with_label
2593 			(ac_prefs->account_name
2594 			 ? ac_prefs->account_name : _("Untitled"));
2595 		gtk_widget_show(menuitem);
2596 		gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem);
2597 		g_signal_connect(G_OBJECT(menuitem), "activate",
2598 				 G_CALLBACK(account_compose_menu_cb),
2599 				 ac_prefs);
2600 	}
2601 	gtk_menu_tool_button_set_menu(GTK_MENU_TOOL_BUTTON(mainwin->toolbar->compose_mail_btn), menu);
2602 #endif
2603 }
2604 
main_window_set_account_menu(GList * account_list)2605 void main_window_set_account_menu(GList *account_list)
2606 {
2607 	GList *cur;
2608 	MainWindow *mainwin;
2609 
2610 	for (cur = mainwin_list; cur != NULL; cur = cur->next) {
2611 		mainwin = (MainWindow *)cur->data;
2612 		main_window_set_account_selector_menu(mainwin, account_list);
2613 		main_window_set_account_receive_menu(mainwin, account_list);
2614 		main_window_set_toolbar_combo_receive_menu(mainwin, account_list);
2615 		main_window_set_toolbar_combo_compose_menu(mainwin, account_list);
2616 	}
2617 	hooks_invoke(ACCOUNT_LIST_CHANGED_HOOKLIST, NULL);
2618 }
2619 
main_window_set_account_menu_only_toolbar(GList * account_list)2620 void main_window_set_account_menu_only_toolbar(GList *account_list)
2621 {
2622 	GList *cur;
2623 	MainWindow *mainwin;
2624 
2625 	for (cur = mainwin_list; cur != NULL; cur = cur->next) {
2626 		mainwin = (MainWindow *)cur->data;
2627 		main_window_set_toolbar_combo_receive_menu(mainwin, account_list);
2628 		main_window_set_toolbar_combo_compose_menu(mainwin, account_list);
2629 	}
2630 }
2631 
main_window_show_cur_account(MainWindow * mainwin)2632 static void main_window_show_cur_account(MainWindow *mainwin)
2633 {
2634 	gchar *buf;
2635 	gchar *ac_name;
2636 
2637 	ac_name = g_strdup(cur_account
2638 			   ? (cur_account->account_name
2639 			      ? cur_account->account_name : _("Untitled"))
2640 			   : _("none"));
2641 
2642 	if (cur_account)
2643 		buf = g_strdup_printf("%s - %s", ac_name, PROG_VERSION);
2644 	else
2645 		buf = g_strdup(PROG_VERSION);
2646 	gtk_window_set_title(GTK_WINDOW(mainwin->window), buf);
2647 	g_free(buf);
2648 
2649 	if (mainwin->ac_label)
2650 		gtk_label_set_text(GTK_LABEL(mainwin->ac_label), ac_name);
2651 	if (mainwin->ac_button)
2652 		gtk_widget_queue_resize(mainwin->ac_button);
2653 
2654 	g_free(ac_name);
2655 }
2656 #ifndef GENERIC_UMPC
main_window_separation_change(MainWindow * mainwin,LayoutType layout_mode)2657 static void main_window_separation_change(MainWindow *mainwin, LayoutType layout_mode)
2658 {
2659 	GtkWidget *folder_wid  = GTK_WIDGET_PTR(mainwin->folderview);
2660 	GtkWidget *summary_wid = GTK_WIDGET_PTR(mainwin->summaryview);
2661 	GtkWidget *message_wid = mainwin->messageview->vbox;
2662 
2663 	if (layout_mode == prefs_common.layout_mode)
2664 		return;
2665 
2666 	debug_print("Changing window separation type from %d to %d\n",
2667 		    prefs_common.layout_mode, layout_mode);
2668 
2669 	/* remove widgets from those containers */
2670 	g_object_ref(folder_wid);
2671 	g_object_ref(summary_wid);
2672 	g_object_ref(message_wid);
2673 	gtkut_container_remove
2674 		(GTK_CONTAINER(gtk_widget_get_parent(folder_wid)), folder_wid);
2675 	gtkut_container_remove
2676 		(GTK_CONTAINER(gtk_widget_get_parent(summary_wid)), summary_wid);
2677 	gtkut_container_remove
2678 		(GTK_CONTAINER(gtk_widget_get_parent(message_wid)), message_wid);
2679 
2680 	gtk_widget_hide(mainwin->window);
2681 	main_window_set_widgets(mainwin, layout_mode);
2682 	gtk_widget_show(mainwin->window);
2683 
2684 	g_object_unref(folder_wid);
2685 	g_object_unref(summary_wid);
2686 	g_object_unref(message_wid);
2687 }
2688 #endif
mainwindow_reset_paned(GtkPaned * paned)2689 void mainwindow_reset_paned(GtkPaned *paned)
2690 {
2691 		gint min, max, mid;
2692 
2693 		if (gtk_paned_get_child1(GTK_PANED(paned)))
2694 			gtk_widget_show(gtk_paned_get_child1(GTK_PANED(paned)));
2695 		if (gtk_paned_get_child2(GTK_PANED(paned)))
2696 			gtk_widget_show(gtk_paned_get_child2(GTK_PANED(paned)));
2697 
2698 GTK_EVENTS_FLUSH();
2699         	g_object_get (G_OBJECT(paned),
2700                         	"min-position",
2701                         	&min, NULL);
2702         	g_object_get (G_OBJECT(paned),
2703                         	"max-position",
2704                         	&max, NULL);
2705 		mid = (min+max)/2;
2706 		gtk_paned_set_position(GTK_PANED(paned), mid);
2707 }
2708 
mainwin_paned_show_first(GtkPaned * paned)2709 static void mainwin_paned_show_first(GtkPaned *paned)
2710 {
2711 		gint max;
2712         	g_object_get (G_OBJECT(paned),
2713                         	"max-position",
2714                         	&max, NULL);
2715 
2716 		if (gtk_paned_get_child1(GTK_PANED(paned)))
2717 			gtk_widget_show(gtk_paned_get_child1(GTK_PANED(paned)));
2718 		if (gtk_paned_get_child2(GTK_PANED(paned)))
2719 			gtk_widget_hide(gtk_paned_get_child2(GTK_PANED(paned)));
2720 		gtk_paned_set_position(GTK_PANED(paned), max);
2721 }
2722 
mainwin_paned_show_last(GtkPaned * paned)2723 static void mainwin_paned_show_last(GtkPaned *paned)
2724 {
2725 		gint min;
2726         	g_object_get (G_OBJECT(paned),
2727                         	"min-position",
2728                         	&min, NULL);
2729 
2730 		if (gtk_paned_get_child1(GTK_PANED(paned)))
2731 			gtk_widget_hide(gtk_paned_get_child1(GTK_PANED(paned)));
2732 		if (gtk_paned_get_child2(GTK_PANED(paned)))
2733 			gtk_widget_show(gtk_paned_get_child2(GTK_PANED(paned)));
2734 		gtk_paned_set_position(GTK_PANED(paned), min);
2735 }
2736 
main_window_toggle_message_view(MainWindow * mainwin)2737 void main_window_toggle_message_view(MainWindow *mainwin)
2738 {
2739 	SummaryView *summaryview = mainwin->summaryview;
2740 	GtkWidget *ppaned = NULL;
2741 	GtkWidget *container = NULL;
2742 
2743 	switch (prefs_common.layout_mode) {
2744 	case NORMAL_LAYOUT:
2745 	case VERTICAL_LAYOUT:
2746 	case SMALL_LAYOUT:
2747 		ppaned = mainwin->vpaned;
2748 		container = mainwin->hpaned;
2749 		if (gtk_widget_get_parent(ppaned) != NULL) {
2750 			mainwin->messageview->visible = FALSE;
2751 			summaryview->displayed = NULL;
2752 			g_object_ref(ppaned);
2753 			gtkut_container_remove(GTK_CONTAINER(container), ppaned);
2754 			gtk_widget_reparent(GTK_WIDGET_PTR(summaryview), container);
2755 		} else {
2756 			mainwin->messageview->visible = TRUE;
2757 			gtk_widget_reparent(GTK_WIDGET_PTR(summaryview), ppaned);
2758 			gtk_container_add(GTK_CONTAINER(container), ppaned);
2759 			g_object_unref(ppaned);
2760 		}
2761 		break;
2762 	case WIDE_LAYOUT:
2763 		container = mainwin->vpaned;
2764 		if (gtk_widget_get_parent(mainwin->messageview->vbox) != NULL) {
2765 			mainwin->messageview->visible = FALSE;
2766 			summaryview->displayed = NULL;
2767 			g_object_ref(mainwin->messageview->vbox);
2768 			gtkut_container_remove(GTK_CONTAINER(container), mainwin->messageview->vbox);
2769 		} else {
2770 			mainwin->messageview->visible = TRUE;
2771 			gtk_container_add(GTK_CONTAINER(container), mainwin->messageview->vbox);
2772 			g_object_unref(mainwin->messageview->vbox);
2773 		}
2774 		break;
2775 	case WIDE_MSGLIST_LAYOUT:
2776 		g_warning("can't hide messageview in this wide msglist layout");
2777 		break;
2778 	}
2779 
2780 	if (messageview_is_visible(mainwin->messageview))
2781 		gtk_arrow_set(GTK_ARROW(mainwin->summaryview->toggle_arrow),
2782 			      GTK_ARROW_DOWN, GTK_SHADOW_OUT);
2783 	else
2784 		gtk_arrow_set(GTK_ARROW(mainwin->summaryview->toggle_arrow),
2785 			      GTK_ARROW_UP, GTK_SHADOW_OUT);
2786 
2787 	if (mainwin->messageview->visible == FALSE)
2788 		messageview_clear(mainwin->messageview);
2789 
2790 	main_window_set_menu_sensitive(mainwin);
2791 
2792 	prefs_common.msgview_visible = mainwin->messageview->visible;
2793 
2794 	if (messageview_is_visible(mainwin->messageview)) {
2795 		gtk_widget_queue_resize(mainwin->hpaned);
2796 		gtk_widget_queue_resize(mainwin->vpaned);
2797 	}
2798 	summary_grab_focus(summaryview);
2799 	if (!summary_is_list(summaryview)) {
2800 		summary_show(summaryview, summaryview->folder_item, FALSE);
2801 	}
2802 }
2803 
main_window_get_size(MainWindow * mainwin)2804 void main_window_get_size(MainWindow *mainwin)
2805 {
2806 	GtkAllocation allocation;
2807 
2808 	if (mainwin_list == NULL || mainwin->messageview == NULL) {
2809 		debug_print("called after messageview "
2810 			    "has been deallocated!\n");
2811 		return;
2812 	}
2813 
2814 	if (prefs_common.mainwin_fullscreen) {
2815 		debug_print("mainwin in full screen state. "
2816 			    "Keeping original settings\n");
2817 	}
2818 
2819 	gtk_widget_get_allocation(GTK_WIDGET_PTR(mainwin->summaryview), &allocation);
2820 	if (allocation.width > 1 && allocation.height > 1 && !prefs_common.mainwin_fullscreen) {
2821 		prefs_common.summaryview_width = allocation.width;
2822 
2823 		if (messageview_is_visible(mainwin->messageview))
2824 			prefs_common.summaryview_height = allocation.height;
2825 
2826 		prefs_common.mainview_width = allocation.width;
2827 	}
2828 
2829 	gtk_widget_get_allocation(mainwin->window, &allocation);
2830 	if (allocation.width > 1 && allocation.height > 1 &&
2831 	    !prefs_common.mainwin_maximised && !prefs_common.mainwin_fullscreen) {
2832 		prefs_common.mainview_height = allocation.height;
2833 		prefs_common.mainwin_width   = allocation.width;
2834 		prefs_common.mainwin_height  = allocation.height;
2835 	}
2836 
2837 	gtk_widget_get_allocation(GTK_WIDGET_PTR(mainwin->folderview), &allocation);
2838 	if (allocation.width > 1 && allocation.height > 1 &&
2839 	    !prefs_common.mainwin_fullscreen) {
2840 		prefs_common.folderview_width  = allocation.width;
2841 		prefs_common.folderview_height = allocation.height;
2842 	}
2843 
2844 	gtk_widget_get_allocation(GTK_WIDGET_PTR(mainwin->messageview), &allocation);
2845 	if (allocation.width > 1 && allocation.height > 1 &&
2846 	    !prefs_common.mainwin_fullscreen) {
2847 		prefs_common.msgview_width = allocation.width;
2848 		prefs_common.msgview_height = allocation.height;
2849 	}
2850 
2851 /*	debug_print("summaryview size: %d x %d\n",
2852 		    prefs_common.summaryview_width,
2853 		    prefs_common.summaryview_height);
2854 	debug_print("folderview size: %d x %d\n",
2855 		    prefs_common.folderview_width,
2856 		    prefs_common.folderview_height);
2857 	debug_print("messageview size: %d x %d\n",
2858 		    prefs_common.msgview_width,
2859 		    prefs_common.msgview_height); */
2860 }
2861 
main_window_get_position(MainWindow * mainwin)2862 void main_window_get_position(MainWindow *mainwin)
2863 {
2864 	gint x, y;
2865 
2866 	if (prefs_common.mainwin_maximised || prefs_common.mainwin_fullscreen)
2867 		return;
2868 
2869 	gtkut_widget_get_uposition(mainwin->window, &x, &y);
2870 
2871 	prefs_common.mainview_x = x;
2872 	prefs_common.mainview_y = y;
2873 	prefs_common.mainwin_x = x;
2874 	prefs_common.mainwin_y = y;
2875 
2876 	debug_print("main window position: %d, %d\n", x, y);
2877 }
2878 
main_window_progress_on(MainWindow * mainwin)2879 void main_window_progress_on(MainWindow *mainwin)
2880 {
2881 	gtk_progress_bar_set_text(GTK_PROGRESS_BAR(mainwin->progressbar), "");
2882 }
2883 
main_window_progress_off(MainWindow * mainwin)2884 void main_window_progress_off(MainWindow *mainwin)
2885 {
2886 	gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(mainwin->progressbar), 0.0);
2887 	gtk_progress_bar_set_text(GTK_PROGRESS_BAR(mainwin->progressbar), "");
2888 }
2889 
main_window_empty_trash(MainWindow * mainwin,gboolean confirm,gboolean for_quit)2890 gboolean main_window_empty_trash(MainWindow *mainwin, gboolean confirm, gboolean for_quit)
2891 {
2892 	if (confirm && procmsg_have_trashed_mails_fast()) {
2893 		AlertValue val;
2894 
2895 		if (for_quit)
2896 			val = alertpanel(_("Empty trash"),
2897 			       _("Delete all messages in trash folders?"),
2898 			       GTK_STOCK_NO, GTK_STOCK_YES, _("Don't quit"),
2899 						 ALERTFOCUS_SECOND);
2900 		else
2901 			val = alertpanel(_("Empty trash"),
2902 			       _("Delete all messages in trash folders?"),
2903 			       GTK_STOCK_NO, GTK_STOCK_YES, NULL,
2904 						 ALERTFOCUS_SECOND);
2905 		if (val == G_ALERTALTERNATE) {
2906 			debug_print("will empty trash\n");
2907 		} else if (val == G_ALERTDEFAULT) {
2908 			debug_print("will not empty trash\n");
2909 			return TRUE;
2910 		} else {
2911 			return FALSE; /* cancel exit */
2912 		}
2913 		manage_window_focus_in(mainwin->window, NULL, NULL);
2914 	}
2915 
2916 	procmsg_empty_all_trash();
2917 
2918 	if (mainwin->summaryview->folder_item &&
2919 	    mainwin->summaryview->folder_item->stype == F_TRASH)
2920 		folderview_grab_focus(mainwin->folderview);
2921 	return TRUE;
2922 }
2923 
main_window_add_mailbox(MainWindow * mainwin)2924 static void main_window_add_mailbox(MainWindow *mainwin)
2925 {
2926 	gchar *path;
2927 	Folder *folder;
2928 
2929 	path = input_dialog(_("Add mailbox"),
2930 			    _("Input the location of the mailbox.\n"
2931 			      "The location can be either the full path or relative to the \n"
2932 			      "home directory.\n"
2933 			      "If the location of an existing mailbox is specified, it will be\n"
2934 			      "scanned automatically."),
2935 			    "Mail");
2936 	if (!path) return;
2937 	if (folder_find_from_path(path)) {
2938 		alertpanel_error(_("The mailbox '%s' already exists."), path);
2939 		g_free(path);
2940 		return;
2941 	}
2942 	folder = folder_new(folder_get_class_from_string("mh"),
2943 			    !strcmp(path, "Mail") ? _("Mailbox") :
2944 			    g_path_get_basename(path), path);
2945 	g_free(path);
2946 
2947 	if (folder->klass->create_tree(folder) < 0) {
2948 		alertpanel_error(_("Creation of the mailbox failed.\n"
2949 				   "Maybe some files already exist, or you don't have the permission to write there."));
2950 		folder_destroy(folder);
2951 		return;
2952 	}
2953 
2954 	folder_add(folder);
2955 	folder_set_ui_func(folder, scan_tree_func, mainwin);
2956 	folder_scan_tree(folder, TRUE);
2957 	folder_set_ui_func(folder, NULL, NULL);
2958 }
2959 
main_window_get_current_state(MainWindow * mainwin)2960 SensitiveCondMask main_window_get_current_state(MainWindow *mainwin)
2961 {
2962 	SensitiveCondMask state = 0;
2963 	SummarySelection selection;
2964 	FolderItem *item = mainwin->summaryview->folder_item;
2965 	GList *account_list = account_get_list();
2966 	GSList *tmp;
2967 
2968 	selection = summary_get_selection_type(mainwin->summaryview);
2969 
2970 #define UPDATE_STATE(...) \
2971 	do { \
2972 		state |= main_window_get_mask(__VA_ARGS__, -1); \
2973 	} while (0)
2974 
2975 	if (mainwin->lock_count == 0 && !claws_is_starting())
2976 		UPDATE_STATE(M_UNLOCKED);
2977 	if (selection != SUMMARY_NONE && selection != SUMMARY_SELECTED_NONE)
2978 		UPDATE_STATE(M_MSG_EXIST);
2979 	if (item && item->path && folder_item_parent(item) && !item->no_select) {
2980 		UPDATE_STATE(M_EXEC);
2981 		/*		if (item->folder->type != F_NEWS) */
2982 		UPDATE_STATE(M_ALLOW_DELETE);
2983 
2984 		if (prefs_common.immediate_exec == 0
2985 		    && mainwin->lock_count == 0)
2986 			UPDATE_STATE(M_DELAY_EXEC);
2987 
2988 		if ((selection == SUMMARY_NONE && item->hide_read_msgs)
2989 		    || selection != SUMMARY_NONE)
2990 			UPDATE_STATE(M_HIDE_READ_MSG);
2991 
2992 		if ((selection == SUMMARY_NONE && item->hide_read_threads)
2993 		    || selection != SUMMARY_NONE)
2994 			UPDATE_STATE(M_HIDE_READ_THREADS);
2995 	}
2996 	if (mainwin->summaryview->threaded)
2997 		UPDATE_STATE(M_THREADED);
2998 	else
2999 		UPDATE_STATE(M_UNTHREADED);
3000 	if (selection == SUMMARY_SELECTED_SINGLE ||
3001 	    selection == SUMMARY_SELECTED_MULTIPLE)
3002 		UPDATE_STATE(M_TARGET_EXIST);
3003 	if (selection == SUMMARY_SELECTED_SINGLE)
3004 		UPDATE_STATE(M_SINGLE_TARGET_EXIST);
3005 	if (mainwin->summaryview->folder_item &&
3006 	    mainwin->summaryview->folder_item->folder->klass->type == F_NEWS)
3007 		UPDATE_STATE(M_NEWS);
3008 	else
3009 		UPDATE_STATE(M_NOT_NEWS);
3010 	if (mainwin->summaryview->folder_item &&
3011 	    (mainwin->summaryview->folder_item->stype != F_TRASH ||
3012 	     !folder_has_parent_of_type(mainwin->summaryview->folder_item, F_TRASH)))
3013 		UPDATE_STATE(M_NOT_TRASH);
3014 
3015 	if (mainwin->summaryview->folder_item
3016 	    && mainwin->summaryview->folder_item->stype != F_DRAFT)
3017 		UPDATE_STATE(M_NOT_DRAFT);
3018 
3019 	if (prefs_common.actions_list && g_slist_length(prefs_common.actions_list))
3020 		UPDATE_STATE(M_ACTIONS_EXIST);
3021 
3022 	tmp = tags_get_list();
3023 	if (tmp && g_slist_length(tmp))
3024 		UPDATE_STATE(M_TAGS_EXIST);
3025 	g_slist_free(tmp);
3026 
3027 	if (procmsg_have_queued_mails_fast() && !procmsg_is_sending())
3028 		UPDATE_STATE(M_HAVE_QUEUED_MAILS);
3029 
3030 	if (selection == SUMMARY_SELECTED_SINGLE &&
3031 	    (item &&
3032 	     (folder_has_parent_of_type(item, F_DRAFT) ||
3033 	      folder_has_parent_of_type(item, F_OUTBOX) ||
3034 	      folder_has_parent_of_type(item, F_QUEUE))))
3035 		UPDATE_STATE(M_ALLOW_REEDIT);
3036 	if (cur_account)
3037 		UPDATE_STATE(M_HAVE_ACCOUNT);
3038 
3039 	if (cur_account && cur_account->protocol != A_NONE)
3040 		UPDATE_STATE(M_HAVE_RETRIEVABLE_ACCOUNT);
3041 
3042 	if (any_folder_want_synchronise())
3043 		UPDATE_STATE(M_WANT_SYNC);
3044 
3045 	if (item && item->prefs->processing && selection != SUMMARY_NONE)
3046 		UPDATE_STATE(M_HAVE_PROCESSING);
3047 
3048 	if (g_list_length(account_list) > 1)
3049 		UPDATE_STATE(M_HAVE_MULTI_ACCOUNT);
3050 
3051 	for (account_list = account_get_list(); account_list != NULL; account_list = account_list->next) {
3052 		if (((PrefsAccount*)account_list->data)->protocol != A_NONE) {
3053 			UPDATE_STATE(M_HAVE_ANY_RETRIEVABLE_ACCOUNT);
3054 			break;
3055 		}
3056 	}
3057 
3058 	for (account_list = account_get_list(); account_list != NULL; account_list = account_list->next) {
3059 		if (((PrefsAccount*)account_list->data)->protocol == A_NNTP) {
3060 			UPDATE_STATE(M_HAVE_NEWS_ACCOUNT);
3061 			break;
3062 		}
3063 	}
3064 
3065 	if (procmsg_spam_can_learn() &&
3066 	    (mainwin->summaryview->folder_item &&
3067 	     mainwin->summaryview->folder_item->folder->klass->type != F_UNKNOWN &&
3068 	     mainwin->summaryview->folder_item->folder->klass->type != F_NEWS)) {
3069 		UPDATE_STATE(M_CAN_LEARN_SPAM);
3070 	}
3071 
3072 	if (mainwin->summaryview->folder_item) {
3073 		UPDATE_STATE(M_FOLDER_SELECTED);
3074 	}
3075 
3076 	if (inc_is_active())
3077 		UPDATE_STATE(M_INC_ACTIVE);
3078 	if (imap_cancel_all_enabled())
3079 		UPDATE_STATE(M_INC_ACTIVE);
3080 
3081 	if (send_is_active() | procmsg_is_sending())
3082 		UPDATE_STATE(M_SEND_ACTIVE);
3083 
3084 	if (mainwin->summaryview->deleted > 0)
3085 		UPDATE_STATE(M_DELETED_EXISTS);
3086 
3087 	if (mainwin->summaryview->deleted > 0 ||
3088 	    mainwin->summaryview->moved > 0 ||
3089 	    mainwin->summaryview->copied > 0)
3090 		UPDATE_STATE(M_DELAY_EXEC);
3091 
3092 	if (summary_is_list(mainwin->summaryview))
3093 		UPDATE_STATE(M_SUMMARY_ISLIST);
3094 
3095 	if (prefs_common.layout_mode != SMALL_LAYOUT || mainwin->in_folder)
3096 		UPDATE_STATE(M_IN_MSGLIST);
3097 
3098 	for (account_list = account_get_list(); account_list != NULL; account_list = account_list->next) {
3099 		PrefsAccount *account = account_list->data;
3100 		if (account->session_passwd || account->session_smtp_passwd) {
3101 			UPDATE_STATE(M_SESSION_PASSWORDS);
3102 			break;
3103 		}
3104 	}
3105 
3106 #ifndef PASSWORD_CRYPTO_OLD
3107 	if (master_passphrase_is_entered()) {
3108 		UPDATE_STATE(M_MASTER_PASSPHRASE);
3109 	}
3110 #endif
3111 
3112 #undef UPDATE_STATE
3113 
3114 	return state;
3115 }
3116 
main_window_get_mask(SensitiveCond cond,...)3117 SensitiveCondMask main_window_get_mask(SensitiveCond cond, ...)
3118 {
3119 	va_list args;
3120 	gint i;
3121 	SensitiveCondMask value;
3122 	static SensitiveCondMask SensitiveCond_table[M_MAX_RESERVED];
3123 	static gboolean first_time = TRUE;
3124 
3125 	if (first_time) {
3126 		for (i = 0; i < M_MAX_RESERVED; i++)
3127 			SensitiveCond_table[i] = (SensitiveCondMask) ((SensitiveCondMask)1 << i);
3128 		first_time = FALSE;
3129 	}
3130 
3131 	value = 0;
3132 
3133 	va_start(args, cond);
3134 	for (i = (gint) cond; i >= 0; i = va_arg(args, gint))
3135 		value |= SensitiveCond_table[i];
3136 	va_end(args);
3137 
3138 	return value;
3139 }
3140 
main_window_set_menu_sensitive(MainWindow * mainwin)3141 void main_window_set_menu_sensitive(MainWindow *mainwin)
3142 {
3143 	SensitiveCondMask state;
3144 	gboolean sensitive;
3145 	SummaryView *summaryview;
3146 	gchar *menu_path;
3147 	GtkWidget *menu;
3148 	GList *children, *cur_item;
3149 	gboolean mimepart_selected = FALSE;
3150 
3151 	state = main_window_get_current_state(mainwin);
3152 
3153 #define SET_SENSITIVE(entry_str, ...) \
3154 { \
3155 	SensitiveCondMask cond = main_window_get_mask(__VA_ARGS__, -1); \
3156 	cm_menu_set_sensitive_full(mainwin->ui_manager, \
3157 			(const gchar *) entry_str, \
3158 			((cond & state) == cond)); \
3159 }
3160 	SET_SENSITIVE("Menu/File/SaveAs", M_TARGET_EXIST);
3161 	SET_SENSITIVE("Menu/File/SavePartAs", M_SINGLE_TARGET_EXIST);
3162 	SET_SENSITIVE("Menu/File/Print", M_TARGET_EXIST);
3163 	SET_SENSITIVE("Menu/File/SynchroniseFolders", M_WANT_SYNC);
3164 	SET_SENSITIVE("Menu/File/Exit", M_UNLOCKED);
3165 
3166 	SET_SENSITIVE("Menu/Edit/SelectThread", M_TARGET_EXIST, M_SUMMARY_ISLIST);
3167 	SET_SENSITIVE("Menu/Edit/Find", M_SINGLE_TARGET_EXIST);
3168 	SET_SENSITIVE("Menu/Edit/QuickSearch", M_IN_MSGLIST);
3169 	SET_SENSITIVE("Menu/Edit/SearchFolder", M_TARGET_EXIST, M_SUMMARY_ISLIST);
3170 
3171 	SET_SENSITIVE("Menu/View/SetColumns/Folderlist", M_UNLOCKED, M_SUMMARY_ISLIST);
3172 	SET_SENSITIVE("Menu/View/Sort", M_EXEC, M_SUMMARY_ISLIST);
3173 	SET_SENSITIVE("Menu/View/ThreadView", M_EXEC, M_SUMMARY_ISLIST);
3174 	SET_SENSITIVE("Menu/View/ExpandThreads", M_MSG_EXIST, M_SUMMARY_ISLIST);
3175 	SET_SENSITIVE("Menu/View/CollapseThreads", M_MSG_EXIST, M_SUMMARY_ISLIST);
3176 	SET_SENSITIVE("Menu/View/HideReadThreads", M_HIDE_READ_THREADS, M_SUMMARY_ISLIST, M_NOT_DRAFT);
3177 	SET_SENSITIVE("Menu/View/HideReadMessages", M_HIDE_READ_MSG, M_SUMMARY_ISLIST, M_NOT_DRAFT);
3178 	SET_SENSITIVE("Menu/View/HideDelMessages", M_SUMMARY_ISLIST, M_NOT_DRAFT);
3179 	SET_SENSITIVE("Menu/View/Goto/Prev", M_MSG_EXIST);
3180 	SET_SENSITIVE("Menu/View/Goto/Next", M_MSG_EXIST);
3181 	SET_SENSITIVE("Menu/View/Goto/PrevUnread", M_MSG_EXIST);
3182 	SET_SENSITIVE("Menu/View/Goto/NextUnread", M_MSG_EXIST);
3183 	SET_SENSITIVE("Menu/View/Goto/PrevNew", M_MSG_EXIST);
3184 	SET_SENSITIVE("Menu/View/Goto/NextNew", M_MSG_EXIST);
3185 	SET_SENSITIVE("Menu/View/Goto/PrevMarked", M_MSG_EXIST);
3186 	SET_SENSITIVE("Menu/View/Goto/NextMarked", M_MSG_EXIST);
3187 	SET_SENSITIVE("Menu/View/Goto/PrevLabeled", M_MSG_EXIST);
3188 	SET_SENSITIVE("Menu/View/Goto/NextLabeled", M_MSG_EXIST);
3189 	SET_SENSITIVE("Menu/View/Goto/ParentMessage", M_SINGLE_TARGET_EXIST);
3190 	SET_SENSITIVE("Menu/View/Goto/NextPart", M_SINGLE_TARGET_EXIST);
3191 	SET_SENSITIVE("Menu/View/Goto/PrevPart", M_SINGLE_TARGET_EXIST);
3192 	SET_SENSITIVE("Menu/View/OpenNewWindow", M_SINGLE_TARGET_EXIST);
3193 	SET_SENSITIVE("Menu/View/MessageSource", M_SINGLE_TARGET_EXIST);
3194 	SET_SENSITIVE("Menu/View/Part", M_SINGLE_TARGET_EXIST);
3195 	SET_SENSITIVE("Menu/View/AllHeaders", M_SINGLE_TARGET_EXIST);
3196 	SET_SENSITIVE("Menu/View/Quotes", M_SINGLE_TARGET_EXIST);
3197 
3198 	SET_SENSITIVE("Menu/Message/Receive/CurrentAccount", M_HAVE_ACCOUNT, M_UNLOCKED, M_HAVE_RETRIEVABLE_ACCOUNT);
3199 	SET_SENSITIVE("Menu/Message/Receive/AllAccounts", M_HAVE_ACCOUNT, M_UNLOCKED, M_HAVE_ANY_RETRIEVABLE_ACCOUNT);
3200 	SET_SENSITIVE("Menu/Message/Receive/CancelReceiving", M_INC_ACTIVE);
3201 	SET_SENSITIVE("Menu/Message/SendQueue", M_HAVE_ACCOUNT, M_HAVE_QUEUED_MAILS);
3202 	SET_SENSITIVE("Menu/Message/CancelSending", M_SEND_ACTIVE);
3203 	SET_SENSITIVE("Menu/Message/ComposeEmail", M_HAVE_ACCOUNT);
3204 	SET_SENSITIVE("Menu/Message/ComposeNews", M_HAVE_NEWS_ACCOUNT);
3205 	SET_SENSITIVE("Menu/Message/Reply", M_HAVE_ACCOUNT, M_TARGET_EXIST, M_SUMMARY_ISLIST);
3206 	SET_SENSITIVE("Menu/Message/ReplyTo", M_HAVE_ACCOUNT, M_TARGET_EXIST, M_SUMMARY_ISLIST);
3207 	SET_SENSITIVE("Menu/Message/FollowupReply", M_HAVE_ACCOUNT, M_TARGET_EXIST, M_NEWS, M_SUMMARY_ISLIST);
3208 	SET_SENSITIVE("Menu/Message/Forward", M_HAVE_ACCOUNT, M_TARGET_EXIST, M_SUMMARY_ISLIST);
3209 	SET_SENSITIVE("Menu/Message/ForwardAtt", M_HAVE_ACCOUNT, M_TARGET_EXIST, M_SUMMARY_ISLIST);
3210 	SET_SENSITIVE("Menu/Message/Redirect", M_HAVE_ACCOUNT, M_TARGET_EXIST, M_SUMMARY_ISLIST);
3211 	SET_SENSITIVE("Menu/Message/Move", M_TARGET_EXIST, M_ALLOW_DELETE, M_NOT_NEWS);
3212 	SET_SENSITIVE("Menu/Message/Copy", M_TARGET_EXIST, M_EXEC);
3213 	SET_SENSITIVE("Menu/Message/Trash", M_TARGET_EXIST, M_ALLOW_DELETE, M_NOT_NEWS, M_NOT_TRASH);
3214 	SET_SENSITIVE("Menu/Message/Delete", M_TARGET_EXIST, M_ALLOW_DELETE);
3215 	SET_SENSITIVE("Menu/Message/TrashThread", M_TARGET_EXIST, M_SUMMARY_ISLIST);
3216 	SET_SENSITIVE("Menu/Message/DeleteThread", M_TARGET_EXIST, M_SUMMARY_ISLIST);
3217 	SET_SENSITIVE("Menu/Message/CancelNews", M_TARGET_EXIST, M_ALLOW_DELETE, M_NEWS);
3218 	SET_SENSITIVE("Menu/Message/Mark", M_TARGET_EXIST, M_SUMMARY_ISLIST);
3219 	SET_SENSITIVE("Menu/Message/Mark/MarkSpam", M_TARGET_EXIST, M_CAN_LEARN_SPAM);
3220 	SET_SENSITIVE("Menu/Message/Mark/MarkHam", M_TARGET_EXIST, M_CAN_LEARN_SPAM);
3221 	SET_SENSITIVE("Menu/Message/Mark/IgnoreThread", M_TARGET_EXIST);
3222 	SET_SENSITIVE("Menu/Message/Mark/UnignoreThread", M_TARGET_EXIST);
3223 	SET_SENSITIVE("Menu/Message/Mark/Lock", M_TARGET_EXIST);
3224 	SET_SENSITIVE("Menu/Message/Mark/Unlock", M_TARGET_EXIST);
3225 	SET_SENSITIVE("Menu/Message/ColorLabel", M_TARGET_EXIST);
3226 	SET_SENSITIVE("Menu/Message/Tags", M_TARGET_EXIST);
3227 	SET_SENSITIVE("Menu/Message/Reedit", M_HAVE_ACCOUNT, M_ALLOW_REEDIT);
3228 	SET_SENSITIVE("Menu/Message/CheckSignature", M_SINGLE_TARGET_EXIST);
3229 
3230 	SET_SENSITIVE("Menu/Tools/AddSenderToAB", M_SINGLE_TARGET_EXIST);
3231 	SET_SENSITIVE("Menu/Tools/CollectAddresses", M_FOLDER_SELECTED);
3232 	SET_SENSITIVE("Menu/Tools/CollectAddresses/FromFolder", M_FOLDER_SELECTED);
3233 	SET_SENSITIVE("Menu/Tools/CollectAddresses/FromSelected", M_TARGET_EXIST);
3234 	SET_SENSITIVE("Menu/Tools/FilterFolder", M_MSG_EXIST, M_EXEC);
3235 	SET_SENSITIVE("Menu/Tools/FilterSelected", M_TARGET_EXIST, M_EXEC);
3236 	SET_SENSITIVE("Menu/Tools/RunProcessing", M_HAVE_PROCESSING);
3237 	SET_SENSITIVE("Menu/Tools/CreateFilterRule", M_SINGLE_TARGET_EXIST, M_UNLOCKED);
3238 	SET_SENSITIVE("Menu/Tools/CreateProcessingRule", M_SINGLE_TARGET_EXIST, M_UNLOCKED);
3239 	SET_SENSITIVE("Menu/Tools/ListUrls", M_TARGET_EXIST);
3240 	SET_SENSITIVE("Menu/Tools/Actions", M_TARGET_EXIST, M_ACTIONS_EXIST);
3241 	SET_SENSITIVE("Menu/Tools/Execute", M_DELAY_EXEC);
3242 	SET_SENSITIVE("Menu/Tools/Expunge", M_DELETED_EXISTS);
3243 	SET_SENSITIVE("Menu/Tools/ForgetSessionPasswords", M_SESSION_PASSWORDS);
3244 #ifndef PASSWORD_CRYPTO_OLD
3245 	SET_SENSITIVE("Menu/Tools/ForgetMasterPassphrase", M_MASTER_PASSPHRASE);
3246 #endif
3247 	SET_SENSITIVE("Menu/Tools/DeleteDuplicates/SelFolder", M_MSG_EXIST, M_ALLOW_DELETE);
3248 
3249 	SET_SENSITIVE("Menu/Configuration", M_UNLOCKED);
3250 	SET_SENSITIVE("Menu/Configuration/ChangeAccount", M_HAVE_MULTI_ACCOUNT);
3251 	SET_SENSITIVE("Menu/Configuration/AccountPrefs", M_UNLOCKED);
3252 	SET_SENSITIVE("Menu/Configuration/CreateAccount", M_UNLOCKED);
3253 	SET_SENSITIVE("Menu/Configuration/EditAccounts", M_UNLOCKED);
3254 #undef SET_SENSITIVE
3255 
3256 	menu = gtk_menu_item_get_submenu(GTK_MENU_ITEM(
3257 		gtk_ui_manager_get_widget(mainwin->ui_manager, "/Menu/Message/Receive")));
3258 
3259 	children = gtk_container_get_children(GTK_CONTAINER(menu));
3260 	for (cur_item = children; cur_item != NULL; cur_item = cur_item->next) {
3261 		if (cur_item->data == gtk_ui_manager_get_widget(mainwin->ui_manager, "/Menu/Message/Receive/Separator1")) {
3262 			cur_item = cur_item->next;
3263 			break;
3264 		}
3265 	}
3266 
3267 	for (; cur_item != NULL; cur_item = cur_item->next) {
3268 		gtk_widget_set_sensitive(GTK_WIDGET(cur_item->data),
3269 					 (main_window_get_mask(M_UNLOCKED, -1) & state) != 0);
3270 	}
3271 
3272 	g_list_free(children);
3273 
3274 	main_window_menu_callback_block(mainwin);
3275 
3276 	cm_toggle_menu_set_active_full(mainwin->ui_manager, "Menu/View/ShowHide/MessageView",
3277 			      messageview_is_visible(mainwin->messageview));
3278 
3279 	summaryview = mainwin->summaryview;
3280 
3281 	switch (summaryview->sort_key) {
3282 	case SORT_BY_NUMBER:
3283 		menu_path = "Menu/View/Sort/Number"; break;
3284 	case SORT_BY_SIZE:
3285 		menu_path = "Menu/View/Sort/Size"; break;
3286 	case SORT_BY_DATE:
3287 		menu_path = "Menu/View/Sort/Date"; break;
3288 	case SORT_BY_THREAD_DATE:
3289 		menu_path = "Menu/View/Sort/ThreadDate"; break;
3290 	case SORT_BY_FROM:
3291 		menu_path = "Menu/View/Sort/From"; break;
3292 	case SORT_BY_TO:
3293 		menu_path = "Menu/View/Sort/To"; break;
3294 	case SORT_BY_SUBJECT:
3295 		menu_path = "Menu/View/Sort/Subject"; break;
3296 	case SORT_BY_LABEL:
3297 		menu_path = "Menu/View/Sort/Color"; break;
3298 	case SORT_BY_MARK:
3299 		menu_path = "Menu/View/Sort/Mark"; break;
3300 	case SORT_BY_STATUS:
3301 		menu_path = "Menu/View/Sort/Status"; break;
3302 	case SORT_BY_MIME:
3303 		menu_path = "Menu/View/Sort/Attachment"; break;
3304 	case SORT_BY_SCORE:
3305 		menu_path = "Menu/View/Sort/Score"; break;
3306 	case SORT_BY_LOCKED:
3307 		menu_path = "Menu/View/Sort/Locked"; break;
3308 	case SORT_BY_TAGS:
3309 		menu_path = "Menu/View/Sort/Tag"; break;
3310 	case SORT_BY_NONE:
3311 	default:
3312 		menu_path = "Menu/View/Sort/DontSort"; break;
3313 	}
3314 	cm_toggle_menu_set_active_full(mainwin->ui_manager, menu_path, TRUE);
3315 
3316 	if (summaryview->sort_type == SORT_ASCENDING) {
3317 		cm_toggle_menu_set_active_full(mainwin->ui_manager, "Menu/View/Sort/Ascending", TRUE);
3318 	} else {
3319 		cm_toggle_menu_set_active_full(mainwin->ui_manager, "Menu/View/Sort/Descending", TRUE);
3320 	}
3321 
3322 	if (summaryview->sort_key != SORT_BY_NONE) {
3323 		cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/View/Sort/Ascending", TRUE);
3324 		cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/View/Sort/Descending", TRUE);
3325 	} else {
3326 		cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/View/Sort/Ascending", FALSE);
3327 		cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/View/Sort/Descending", FALSE);
3328 	}
3329 
3330 	if (mainwin->messageview
3331 	&&  mainwin->messageview->mimeview
3332 	&&  mainwin->messageview->mimeview->textview)
3333 		cm_toggle_menu_set_active_full(mainwin->ui_manager, "Menu/View/AllHeaders",
3334 			      			prefs_common.show_all_headers);
3335 	cm_toggle_menu_set_active_full(mainwin->ui_manager, "Menu/View/ThreadView", (state & main_window_get_mask(M_THREADED, -1)) != 0);
3336 	cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/View/ExpandThreads", (state & main_window_get_mask(M_THREADED, -1)) != 0);
3337 	cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/View/CollapseThreads", (state & main_window_get_mask(M_THREADED, -1)) != 0);
3338 	cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/View/HideReadThreads", (state & main_window_get_mask(M_THREADED, -1)) != 0 && (state & main_window_get_mask(M_NOT_DRAFT, -1)) != 0);
3339 	cm_toggle_menu_set_active_full(mainwin->ui_manager, "Menu/View/Quotes/CollapseAll", (prefs_common.hide_quotes == 1));
3340 	cm_toggle_menu_set_active_full(mainwin->ui_manager, "Menu/View/Quotes/Collapse2", (prefs_common.hide_quotes == 2));
3341 	cm_toggle_menu_set_active_full(mainwin->ui_manager, "Menu/View/Quotes/Collapse3", (prefs_common.hide_quotes == 3));
3342 
3343 	if (mainwin->summaryview->folder_item && !mainwin->summaryview->folder_item->threaded)
3344 		cm_toggle_menu_set_active_full(mainwin->ui_manager, "Menu/View/HideReadThreads", FALSE);
3345 	if ((mainwin->summaryview->folder_item && mainwin->summaryview->folder_item->hide_read_msgs) ||
3346 	    quicksearch_has_sat_predicate(mainwin->summaryview->quicksearch))
3347 		cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/View/HideReadThreads", FALSE);
3348 	if ((mainwin->summaryview->folder_item && mainwin->summaryview->folder_item->hide_read_threads) ||
3349 	    quicksearch_has_sat_predicate(mainwin->summaryview->quicksearch))
3350 		cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/View/HideReadMessages", FALSE);
3351 	if (quicksearch_has_sat_predicate(mainwin->summaryview->quicksearch))
3352 		cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/View/HideDelMessages", FALSE);
3353 
3354 	cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/View/Goto/PrevHistory",
3355 		messageview_nav_has_prev(mainwin->messageview));
3356 	cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/View/Goto/NextHistory",
3357 		messageview_nav_has_next(mainwin->messageview));
3358 
3359 	if (mainwin->messageview
3360 	&&  mainwin->messageview->mimeview)
3361 		mimepart_selected = !mimeview_tree_is_empty(mainwin->messageview->mimeview);
3362 
3363 	cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/File/SavePartAs", mimepart_selected);
3364 	cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/View/Goto/NextPart", mimepart_selected);
3365 	cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/View/Goto/PrevPart", mimepart_selected);
3366 	cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/View/Part", mimepart_selected);
3367 	cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/Message/CheckSignature",
3368 				   mimepart_selected && mainwin->messageview->mimeview->signed_part);
3369 
3370 	sensitive = TRUE;
3371 	if (mimepart_selected) {
3372 		MimeInfo *partinfo = messageview_get_selected_mime_part(mainwin->messageview);
3373 
3374 		if (partinfo && (partinfo->type == MIMETYPE_MESSAGE ||
3375 				 partinfo->type == MIMETYPE_IMAGE ||
3376 				 partinfo->type == MIMETYPE_MULTIPART)) {
3377 			sensitive = FALSE;
3378 		}
3379 	}
3380 	cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/View/Part/AsText", sensitive);
3381 
3382 	main_window_menu_callback_unblock(mainwin);
3383 }
3384 
main_create_mailing_list_menu(MainWindow * mainwin,MsgInfo * msginfo)3385 void main_create_mailing_list_menu (MainWindow *mainwin, MsgInfo *msginfo)
3386 {
3387 	gint is_menu = 0;
3388 
3389 	if (msginfo)
3390 		is_menu = mailing_list_create_submenu (mainwin, msginfo);
3391 	if (is_menu)
3392 		cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/Message/MailingList", TRUE);
3393 	else
3394 		cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/Message/MailingList", FALSE);
3395 }
3396 
mailing_list_create_submenu(MainWindow * mainwin,MsgInfo * msginfo)3397 static gint mailing_list_create_submenu (MainWindow *mainwin, MsgInfo *msginfo)
3398 {
3399 	gint menu_nb = 0;
3400 	GtkWidget *menuitem;
3401 
3402 	if (!msginfo || !msginfo->extradata) {
3403 		cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/Message/MailingList/Post", FALSE);
3404 		cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/Message/MailingList/Help", FALSE);
3405 		cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/Message/MailingList/Subscribe", FALSE);
3406 		cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/Message/MailingList/Unsubscribe", FALSE);
3407 		cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/Message/MailingList/ViewArchive", FALSE);
3408 		cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/Message/MailingList/ContactOwner", FALSE);
3409 		return 0;
3410 	}
3411 
3412 	/* Mailing list post */
3413 	if (!g_strcmp0 (msginfo->extradata->list_post, "NO")) {
3414 		g_free(msginfo->extradata->list_post);
3415 		msginfo->extradata->list_post = g_strdup (_("No posting allowed"));
3416  	}
3417  	menuitem = gtk_ui_manager_get_widget(mainwin->ui_manager, "/Menu/Message/MailingList/Post");
3418 
3419  	menu_nb += mailing_list_populate_submenu (menuitem, msginfo->extradata->list_post);
3420 
3421  	/* Mailing list help */
3422 	menuitem = gtk_ui_manager_get_widget(mainwin->ui_manager, "/Menu/Message/MailingList/Help");
3423 
3424 	menu_nb += mailing_list_populate_submenu (menuitem, msginfo->extradata->list_help);
3425 
3426 	/* Mailing list subscribe */
3427 	menuitem = gtk_ui_manager_get_widget(mainwin->ui_manager, "/Menu/Message/MailingList/Subscribe");
3428 
3429 	menu_nb += mailing_list_populate_submenu (menuitem, msginfo->extradata->list_subscribe);
3430 
3431 	/* Mailing list unsubscribe */
3432 	menuitem = gtk_ui_manager_get_widget(mainwin->ui_manager, "/Menu/Message/MailingList/Unsubscribe");
3433 
3434 	menu_nb += mailing_list_populate_submenu (menuitem, msginfo->extradata->list_unsubscribe);
3435 
3436 	/* Mailing list view archive */
3437 	menuitem = gtk_ui_manager_get_widget(mainwin->ui_manager, "/Menu/Message/MailingList/ViewArchive");
3438 
3439 	menu_nb += mailing_list_populate_submenu (menuitem, msginfo->extradata->list_archive);
3440 
3441 	/* Mailing list contact owner */
3442 	menuitem = gtk_ui_manager_get_widget(mainwin->ui_manager, "/Menu/Message/MailingList/ContactOwner");
3443 
3444 	menu_nb += mailing_list_populate_submenu (menuitem, msginfo->extradata->list_owner);
3445 
3446 	return menu_nb;
3447 }
3448 
mailing_list_populate_submenu(GtkWidget * menuitem,const gchar * list_header)3449 static gint mailing_list_populate_submenu (GtkWidget *menuitem, const gchar * list_header)
3450 {
3451 	GtkWidget *item, *menu;
3452 	const gchar *url_pt ;
3453 	gchar url_decoded[BUFFSIZE];
3454 	GList *children, *amenu;
3455 	gint menu_nb = 0;
3456 
3457 	menu = gtk_menu_item_get_submenu(GTK_MENU_ITEM(menuitem));
3458 
3459 	/* First delete old submenu */
3460 	/* FIXME: we can optimize this, and only change/add/delete necessary items */
3461 	children = gtk_container_get_children(GTK_CONTAINER(menu));
3462 	for (amenu = children; amenu; amenu = amenu->next) {
3463 		item = GTK_WIDGET (amenu->data);
3464 		gtk_widget_destroy (item);
3465 	}
3466 	g_list_free(children);
3467 	if (list_header) {
3468 		for (url_pt = list_header; url_pt && *url_pt;) {
3469 			get_url_part (&url_pt, url_decoded);
3470 			item = NULL;
3471 			if (!g_ascii_strncasecmp(url_decoded, "mailto:", 7)) {
3472  				item = cm_menu_item_new_label_from_url ((url_decoded));
3473 				g_signal_connect(G_OBJECT(item), "activate",
3474 						 G_CALLBACK(mailing_list_compose),
3475 						 NULL);
3476 			}
3477  			else if (!g_ascii_strncasecmp(url_decoded, "http:", 5) ||
3478 				 !g_ascii_strncasecmp(url_decoded, "https:",6)) {
3479 
3480 				item = cm_menu_item_new_label_from_url ((url_decoded));
3481 				g_signal_connect(G_OBJECT(item), "activate",
3482 						 G_CALLBACK(mailing_list_open_uri),
3483 						 NULL);
3484 			}
3485 			if (item) {
3486 				gtk_menu_shell_append(GTK_MENU_SHELL(menu), item);
3487 				gtk_widget_show (item);
3488 				menu_nb++;
3489 			}
3490 		}
3491 	}
3492 	if (menu_nb)
3493 		gtk_widget_set_sensitive (menuitem, TRUE);
3494 	else
3495 		gtk_widget_set_sensitive (menuitem, FALSE);
3496 
3497 
3498 	return menu_nb;
3499 }
3500 
get_url_part(const gchar ** buffer,gchar * url_decoded)3501 static void get_url_part (const gchar **buffer, gchar *url_decoded)
3502 {
3503 	gchar tmp[BUFFSIZE];
3504 	const gchar *buf;
3505 	gint i = 0;
3506 	buf = *buffer;
3507 	gboolean with_plus = TRUE;
3508 
3509 	if (buf == 0x00) {
3510 		*url_decoded = '\0';
3511 		*buffer = NULL;
3512 		return;
3513 	}
3514 	/* Ignore spaces, comments  and tabs () */
3515 	for (;*buf == ' ' || *buf == '(' || *buf == '\t'; buf++)
3516 		if (*buf == '(')
3517 			for (;*buf != ')' && *buf != 0x00; buf++);
3518 
3519 	/* First non space and non comment must be a < */
3520 	if (*buf =='<' ) {
3521 		buf++;
3522 		if (!strncmp(buf, "mailto:", strlen("mailto:")))
3523 			with_plus = FALSE;
3524 		for (i = 0;
3525 		     *buf != '>' && *buf != 0x00 && i < BUFFSIZE;
3526 			tmp[i++] = *(buf++));
3527 		if (*buf == 0) {
3528 			*buffer = NULL;
3529 			*url_decoded = '\0';
3530 			return;
3531 		}
3532 		buf++;
3533 	}
3534 	else  {
3535 		*buffer = NULL;
3536 		*url_decoded = '\0';
3537 		return;
3538 	}
3539 
3540 	*url_decoded = '\0';
3541 	*buffer = NULL;
3542 
3543 	if (i == BUFFSIZE) {
3544 		return;
3545 	}
3546 	tmp[i] = 0x00;
3547 	decode_uri_with_plus (url_decoded, (const gchar *)tmp, with_plus);
3548 
3549 	/* Prepare the work for the next url in the list */
3550 	/* after the closing bracket >, ignore space, comments and tabs */
3551 	for (;buf && *buf && (*buf == ' ' || *buf == '(' || *buf == '\t'); buf++)
3552 		if (*buf == '(')
3553 			for (;*buf != ')' && *buf != 0x00; buf++);
3554 
3555 	if (!buf || !*buf) {
3556 		*buffer = NULL;
3557 		return;
3558 	}
3559 
3560 	/* now first non space, non comment must be a comma */
3561 	if (*buf != ',')
3562 		for (;*buf != 0x00; buf++);
3563 	else
3564 		buf++;
3565 	*buffer = buf;
3566 }
3567 
mailing_list_compose(GtkWidget * w,gpointer * data)3568 static void mailing_list_compose (GtkWidget *w, gpointer *data)
3569 {
3570 	const gchar *mailto;
3571 	PrefsAccount *account = NULL;
3572 	FolderItem   *folder_item = NULL;
3573 
3574 	mailto = gtk_label_get_text(GTK_LABEL (gtk_bin_get_child(GTK_BIN((w)))));
3575 	if (mainwindow_get_mainwindow()) {
3576 		folder_item = mainwindow_get_mainwindow()->summaryview->folder_item;
3577 		if (folder_item && folder_item->prefs && folder_item->prefs->enable_default_account)
3578 			account = account_find_from_id(folder_item->prefs->default_account);
3579 		if (folder_item && !account)
3580 			account = account_find_from_item(folder_item);
3581 	}
3582 	if (mailto)
3583 		compose_new_with_folderitem(account, folder_item, mailto+7);
3584 }
3585 
mailing_list_open_uri(GtkWidget * w,gpointer * data)3586  static void mailing_list_open_uri (GtkWidget *w, gpointer *data)
3587 {
3588 
3589  	const gchar *mailto;
3590 
3591 	mailto = gtk_label_get_text(GTK_LABEL (gtk_bin_get_child(GTK_BIN((w)))));
3592 	if (mailto)
3593  		open_uri (mailto, prefs_common_get_uri_cmd());
3594 }
3595 
fix_folderview_scroll(MainWindow * mainwin)3596 static void fix_folderview_scroll(MainWindow *mainwin)
3597 {
3598 	static gboolean fix_done = FALSE;
3599 
3600 	if (fix_done)
3601 		return;
3602 
3603 	gtk_widget_queue_resize(mainwin->folderview->ctree);
3604 
3605 	fix_done = TRUE;
3606 }
3607 
main_window_popup(MainWindow * mainwin)3608 void main_window_popup(MainWindow *mainwin)
3609 {
3610 	static gboolean first_start = TRUE;
3611 
3612 	if (!gtk_widget_get_visible(GTK_WIDGET(mainwin->window)))
3613 		main_window_show(mainwin);
3614 
3615 	if (prefs_common.mainwin_maximised)
3616 		gtk_window_maximize(GTK_WINDOW(mainwin->window));
3617 
3618 	if (first_start) {
3619 		first_start = FALSE;
3620 	} else {
3621 		gtkut_window_popup(mainwin->window);
3622 	}
3623 
3624 	if (prefs_common.layout_mode == SMALL_LAYOUT) {
3625 		if (mainwin->in_folder) {
3626 			mainwindow_enter_folder(mainwin);
3627 		} else {
3628 			mainwindow_exit_folder(mainwin);
3629 		}
3630 	}
3631 	fix_folderview_scroll(mainwin);
3632 }
3633 
main_window_show(MainWindow * mainwin)3634 void main_window_show(MainWindow *mainwin)
3635 {
3636 	gtk_widget_show(mainwin->window);
3637 	gtk_widget_show(mainwin->vbox_body);
3638 #ifndef GENERIC_UMPC
3639         gtk_window_move(GTK_WINDOW(mainwin->window),
3640                                  prefs_common.mainwin_x,
3641                                  prefs_common.mainwin_y);
3642 
3643 	gtk_widget_set_size_request(GTK_WIDGET_PTR(mainwin->folderview),
3644 			     prefs_common.folderview_width,
3645 			     prefs_common.folderview_height);
3646 	gtk_widget_set_size_request(GTK_WIDGET_PTR(mainwin->summaryview),
3647 			     prefs_common.summaryview_width,
3648 			     prefs_common.summaryview_height);
3649 	gtk_widget_set_size_request(GTK_WIDGET_PTR(mainwin->messageview),
3650 			     prefs_common.msgview_width,
3651 			     prefs_common.msgview_height);
3652 #endif
3653 }
3654 
main_window_hide(MainWindow * mainwin)3655 void main_window_hide(MainWindow *mainwin)
3656 {
3657 	main_window_get_size(mainwin);
3658 	main_window_get_position(mainwin);
3659 
3660 	gtk_widget_hide(mainwin->window);
3661 	gtk_widget_hide(mainwin->vbox_body);
3662 }
3663 
main_window_set_widgets(MainWindow * mainwin,LayoutType layout_mode)3664 static void main_window_set_widgets(MainWindow *mainwin, LayoutType layout_mode)
3665 {
3666 	GtkWidget *folderwin = NULL;
3667 	GtkWidget *messagewin = NULL;
3668 	GtkWidget *hpaned;
3669 	GtkWidget *vpaned;
3670 	GtkWidget *vbox_body = mainwin->vbox_body;
3671 	gboolean first_set = (mainwin->hpaned == NULL);
3672 	debug_print("Setting widgets...\n");
3673 
3674 #ifndef GENERIC_UMPC
3675 	mainwin->messageview->statusbar = mainwin->statusbar;
3676 	mainwin->messageview->statusbar_cid = mainwin->messageview_cid;
3677 #endif
3678 	/* clean top-most container */
3679 	if (mainwin->hpaned) {
3680 		if (gtk_widget_get_parent(mainwin->hpaned) == mainwin->vpaned)
3681 			gtk_widget_destroy(mainwin->vpaned);
3682 		else
3683 			gtk_widget_destroy(mainwin->hpaned);
3684 	}
3685 
3686 	cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/View/ShowHide/MessageView",
3687 		(layout_mode != WIDE_MSGLIST_LAYOUT && layout_mode != SMALL_LAYOUT));
3688 	switch (layout_mode) {
3689 	case VERTICAL_LAYOUT:
3690 	case NORMAL_LAYOUT:
3691 	case SMALL_LAYOUT:
3692 		hpaned = gtk_hpaned_new();
3693 		if (layout_mode == VERTICAL_LAYOUT)
3694 			vpaned = gtk_hpaned_new();
3695 		else
3696 			vpaned = gtk_vpaned_new();
3697 		gtk_box_pack_start(GTK_BOX(vbox_body), hpaned, TRUE, TRUE, 0);
3698 		gtk_paned_add1(GTK_PANED(hpaned),
3699 			       GTK_WIDGET_PTR(mainwin->folderview));
3700 		gtk_widget_show(hpaned);
3701 		gtk_widget_queue_resize(hpaned);
3702 
3703 		if (messageview_is_visible(mainwin->messageview)) {
3704 			gtk_paned_add2(GTK_PANED(hpaned), vpaned);
3705 			gtk_paned_pack1(GTK_PANED(vpaned),
3706 				       GTK_WIDGET_PTR(mainwin->summaryview), TRUE, TRUE);
3707 		} else {
3708 			gtk_paned_add2(GTK_PANED(hpaned),
3709 				       GTK_WIDGET_PTR(mainwin->summaryview));
3710 			g_object_ref(vpaned);
3711 		}
3712 		gtk_paned_add2(GTK_PANED(vpaned),
3713 			       GTK_WIDGET_PTR(mainwin->messageview));
3714 		gtk_widget_show(vpaned);
3715 		if (layout_mode == SMALL_LAYOUT && first_set) {
3716 			mainwin_paned_show_first(GTK_PANED(hpaned));
3717 		}
3718 		gtk_widget_queue_resize(vpaned);
3719 		break;
3720 	case WIDE_LAYOUT:
3721 		vpaned = gtk_vpaned_new();
3722 		hpaned = gtk_hpaned_new();
3723 		gtk_box_pack_start(GTK_BOX(vbox_body), vpaned, TRUE, TRUE, 0);
3724 		gtk_paned_add1(GTK_PANED(vpaned), hpaned);
3725 
3726 		gtk_paned_add1(GTK_PANED(hpaned),
3727 			       GTK_WIDGET_PTR(mainwin->folderview));
3728 		gtk_paned_add2(GTK_PANED(hpaned),
3729 			       GTK_WIDGET_PTR(mainwin->summaryview));
3730 
3731 		gtk_widget_show(hpaned);
3732 		gtk_widget_queue_resize(hpaned);
3733 
3734 		if (messageview_is_visible(mainwin->messageview)) {
3735 			gtk_paned_add2(GTK_PANED(vpaned),
3736 			       GTK_WIDGET_PTR(mainwin->messageview));
3737 		} else {
3738 			g_object_ref(GTK_WIDGET_PTR(mainwin->messageview));
3739 		}
3740 		gtk_widget_show(vpaned);
3741 		gtk_widget_queue_resize(vpaned);
3742 		break;
3743 	case WIDE_MSGLIST_LAYOUT:
3744 		vpaned = gtk_vpaned_new();
3745 		hpaned = gtk_hpaned_new();
3746 		gtk_box_pack_start(GTK_BOX(vbox_body), vpaned, TRUE, TRUE, 0);
3747 
3748 		gtk_paned_add1(GTK_PANED(vpaned),
3749 			       GTK_WIDGET_PTR(mainwin->summaryview));
3750 		gtk_paned_add1(GTK_PANED(hpaned),
3751 			       GTK_WIDGET_PTR(mainwin->folderview));
3752 
3753 		gtk_widget_show(hpaned);
3754 		gtk_widget_queue_resize(hpaned);
3755 
3756 		if (messageview_is_visible(mainwin->messageview)) {
3757 			gtk_paned_add2(GTK_PANED(hpaned),
3758 			       GTK_WIDGET_PTR(mainwin->messageview));
3759 		} else {
3760 			g_object_ref(GTK_WIDGET_PTR(mainwin->messageview));
3761 		}
3762 		gtk_paned_add2(GTK_PANED(vpaned), hpaned);
3763 
3764 		gtk_widget_show(vpaned);
3765 		gtk_widget_queue_resize(vpaned);
3766 		break;
3767 	default:
3768 		g_warning("Unknown layout");
3769 		return;
3770 	}
3771 
3772 	mainwin->hpaned = hpaned;
3773 	mainwin->vpaned = vpaned;
3774 
3775 	if (layout_mode == SMALL_LAYOUT) {
3776 		if (mainwin->messageview->visible)
3777 			main_window_toggle_message_view(mainwin);
3778 	}
3779 
3780 	if (layout_mode == SMALL_LAYOUT && first_set) {
3781 		gtk_widget_realize(mainwin->window);
3782 		gtk_widget_realize(mainwin->folderview->ctree);
3783 		gtk_widget_realize(mainwin->summaryview->hbox);
3784 		gtk_widget_realize(mainwin->summaryview->hbox_l);
3785 		gtk_widget_set_size_request(GTK_WIDGET_PTR(mainwin->folderview),
3786 				    prefs_common.folderview_width,
3787 				    prefs_common.folderview_height);
3788 		gtk_widget_set_size_request(GTK_WIDGET_PTR(mainwin->summaryview),
3789 				    0,0);
3790 		gtk_widget_set_size_request(GTK_WIDGET_PTR(mainwin->messageview),
3791 				    0,0);
3792 		gtk_widget_set_size_request(GTK_WIDGET(mainwin->window),
3793 				prefs_common.mainwin_width,
3794 				prefs_common.mainwin_height);
3795 		gtk_paned_set_position(GTK_PANED(mainwin->hpaned), 800);
3796 	} else {
3797 		gtk_widget_set_size_request(GTK_WIDGET_PTR(mainwin->folderview),
3798 				    prefs_common.folderview_width,
3799 				    prefs_common.folderview_height);
3800 		gtk_widget_set_size_request(GTK_WIDGET_PTR(mainwin->summaryview),
3801 				    prefs_common.summaryview_width,
3802 				    prefs_common.summaryview_height);
3803 		gtk_widget_set_size_request(GTK_WIDGET_PTR(mainwin->messageview),
3804 				    prefs_common.msgview_width,
3805 				    prefs_common.msgview_height);
3806 		gtk_widget_set_size_request(GTK_WIDGET(mainwin->window),
3807 				    prefs_common.mainwin_width,
3808 				    prefs_common.mainwin_height);
3809 	}
3810 	/* remove headerview if not in prefs */
3811 	headerview_set_visibility(mainwin->messageview->headerview,
3812 				  prefs_common.display_header_pane);
3813 
3814 	if (messageview_is_visible(mainwin->messageview))
3815 		gtk_arrow_set(GTK_ARROW(mainwin->summaryview->toggle_arrow),
3816 			      GTK_ARROW_DOWN, GTK_SHADOW_OUT);
3817 	else
3818 		gtk_arrow_set(GTK_ARROW(mainwin->summaryview->toggle_arrow),
3819 			      GTK_ARROW_UP, GTK_SHADOW_OUT);
3820 
3821 	gtk_window_move(GTK_WINDOW(mainwin->window),
3822 			prefs_common.mainwin_x,
3823 			prefs_common.mainwin_y);
3824 
3825 	gtk_widget_queue_resize(vbox_body);
3826 	gtk_widget_queue_resize(mainwin->vbox);
3827 	gtk_widget_queue_resize(mainwin->window);
3828 	/* CLAWS: previous "gtk_widget_show_all" makes noticeview
3829 	 * and mimeview icon list/ctree lose track of their visibility states */
3830 	if (!noticeview_is_visible(mainwin->messageview->noticeview))
3831 		gtk_widget_hide(GTK_WIDGET_PTR(mainwin->messageview->noticeview));
3832 	if (!noticeview_is_visible(mainwin->messageview->mimeview->siginfoview))
3833 		gtk_widget_hide(GTK_WIDGET_PTR(mainwin->messageview->mimeview->siginfoview));
3834 	if (mainwin->messageview->mimeview->ctree_mode)
3835 		gtk_widget_hide(mainwin->messageview->mimeview->icon_mainbox);
3836 	else
3837 		gtk_widget_hide(mainwin->messageview->mimeview->ctree_mainbox);
3838 
3839 	prefs_common.layout_mode = layout_mode;
3840 
3841 	cm_toggle_menu_set_active_full(mainwin->ui_manager, "Menu/View/ShowHide/MessageView",
3842 		 messageview_is_visible(mainwin->messageview));
3843 
3844 #ifndef GENERIC_UMPC
3845 	switch (prefs_common.layout_mode) {
3846 	case NORMAL_LAYOUT:
3847 		cm_toggle_menu_set_active_full(mainwin->ui_manager, "Menu/View/Layout/Standard", TRUE);
3848 		break;
3849 	case VERTICAL_LAYOUT:
3850 		cm_toggle_menu_set_active_full(mainwin->ui_manager, "Menu/View/Layout/ThreeColumns", TRUE);
3851 		break;
3852 	case WIDE_LAYOUT:
3853 		cm_toggle_menu_set_active_full(mainwin->ui_manager, "Menu/View/Layout/WideMessage", TRUE);
3854 		break;
3855 	case WIDE_MSGLIST_LAYOUT:
3856 		cm_toggle_menu_set_active_full(mainwin->ui_manager, "Menu/View/Layout/WideMessageList", TRUE);
3857 		break;
3858 	case SMALL_LAYOUT:
3859 		cm_toggle_menu_set_active_full(mainwin->ui_manager, "Menu/View/Layout/SmallScreen", TRUE);
3860 		break;
3861 	}
3862 #endif
3863 
3864 	if (folderwin) {
3865 		g_signal_connect
3866 			(G_OBJECT(folderwin), "size_allocate",
3867 			 G_CALLBACK(folder_window_size_allocate_cb),
3868 			 mainwin);
3869 	}
3870 	if (messagewin) {
3871 		g_signal_connect
3872 			(G_OBJECT(messagewin), "size_allocate",
3873 			 G_CALLBACK(message_window_size_allocate_cb),
3874 			 mainwin);
3875 	}
3876 
3877 	debug_print("Setting widgets done.\n");
3878 }
3879 
main_window_destroy_all(void)3880 void main_window_destroy_all(void)
3881 {
3882 	while (mainwin_list != NULL) {
3883 		MainWindow *mainwin = (MainWindow*)mainwin_list->data;
3884 
3885 		/* free toolbar stuff */
3886 		toolbar_clear_list(TOOLBAR_MAIN);
3887 		toolbar_destroy(mainwin->toolbar);
3888 
3889 		summaryview_destroy(mainwin->summaryview);
3890 		mainwin->folderview->mainwin = NULL;
3891 		mainwin->summaryview->mainwin = NULL;
3892 		mainwin->messageview->mainwin = NULL;
3893 
3894 		g_free(mainwin->toolbar);
3895 		g_free(mainwin);
3896 
3897 		mainwin_list = g_list_remove(mainwin_list, mainwin);
3898 	}
3899 	g_list_free(mainwin_list);
3900 	mainwin_list = NULL;
3901 }
3902 
toolbar_child_attached(GtkWidget * widget,GtkWidget * child,gpointer data)3903 static void toolbar_child_attached(GtkWidget *widget, GtkWidget *child,
3904 				   gpointer data)
3905 {
3906 	gtk_widget_set_size_request(child, 1, -1);
3907 }
3908 
toolbar_child_detached(GtkWidget * widget,GtkWidget * child,gpointer data)3909 static void toolbar_child_detached(GtkWidget *widget, GtkWidget *child,
3910 				   gpointer data)
3911 {
3912 	gtk_widget_set_size_request(child, -1, -1);
3913 }
3914 #ifndef GENERIC_UMPC
ac_label_button_pressed(GtkWidget * widget,GdkEventButton * event,gpointer data)3915 static gboolean ac_label_button_pressed(GtkWidget *widget, GdkEventButton *event,
3916 				    gpointer data)
3917 {
3918 	MainWindow *mainwin = (MainWindow *)data;
3919 	GtkWidget *menu = NULL;
3920 
3921 	if (!event) return FALSE;
3922 
3923 	gtk_button_set_relief(GTK_BUTTON(widget), GTK_RELIEF_NORMAL);
3924 
3925 	menu = gtk_menu_item_get_submenu(GTK_MENU_ITEM(mainwin->ac_menu));
3926 
3927 	gtk_menu_popup(GTK_MENU(menu), NULL, NULL,
3928 		       menu_button_position, widget,
3929 		       event->button, event->time);
3930 
3931 	return TRUE;
3932 }
3933 #endif
main_window_close_cb(GtkWidget * widget,GdkEventAny * event,gpointer data)3934 static gint main_window_close_cb(GtkWidget *widget, GdkEventAny *event,
3935 				 gpointer data)
3936 {
3937 	MainWindow *mainwin = (MainWindow *)data;
3938 	gboolean close_allowed = TRUE;
3939 
3940 	hooks_invoke(MAIN_WINDOW_CLOSE, &close_allowed);
3941 
3942 	if (close_allowed && mainwin->lock_count == 0)
3943 		app_exit_cb(NULL, data);
3944 
3945 	return TRUE;
3946 }
3947 
main_window_size_allocate_cb(GtkWidget * widget,GtkAllocation * allocation,gpointer data)3948 static void main_window_size_allocate_cb(GtkWidget *widget,
3949 					 GtkAllocation *allocation,
3950 					 gpointer data)
3951 {
3952 	MainWindow *mainwin = (MainWindow *)data;
3953 	main_window_get_size(mainwin);
3954 }
3955 
folder_window_size_allocate_cb(GtkWidget * widget,GtkAllocation * allocation,gpointer data)3956 static void folder_window_size_allocate_cb(GtkWidget *widget,
3957 					   GtkAllocation *allocation,
3958 					   gpointer data)
3959 {
3960 	MainWindow *mainwin = (MainWindow *)data;
3961 
3962 	main_window_get_size(mainwin);
3963 }
3964 
message_window_size_allocate_cb(GtkWidget * widget,GtkAllocation * allocation,gpointer data)3965 static void message_window_size_allocate_cb(GtkWidget *widget,
3966 					    GtkAllocation *allocation,
3967 					    gpointer data)
3968 {
3969 	MainWindow *mainwin = (MainWindow *)data;
3970 
3971 	main_window_get_size(mainwin);
3972 }
3973 
add_mailbox_cb(GtkAction * action,gpointer data)3974 static void add_mailbox_cb(GtkAction *action, gpointer data)
3975 {
3976 	MainWindow *mainwin = (MainWindow *)data;
3977 	main_window_add_mailbox(mainwin);
3978 }
3979 
update_folderview_cb(GtkAction * action,gpointer data)3980 static void update_folderview_cb(GtkAction *action, gpointer data)
3981 {
3982 	MainWindow *mainwin = (MainWindow *)data;
3983 	summary_show(mainwin->summaryview, NULL, FALSE);
3984 	folderview_check_new_all();
3985 }
3986 
foldersort_cb(GtkAction * action,gpointer data)3987 static void foldersort_cb(GtkAction *action, gpointer data)
3988 {
3989 	foldersort_open();
3990 }
3991 
import_mbox_cb(GtkAction * action,gpointer data)3992 static void import_mbox_cb(GtkAction *action, gpointer data)
3993 {
3994 	MainWindow *mainwin = (MainWindow *)data;
3995 	/* only notify if import has failed */
3996 	if (import_mbox(mainwin->summaryview->folder_item) == -1) {
3997 		alertpanel_error(_("Mbox import has failed."));
3998 	}
3999 }
4000 
export_mbox_cb(GtkAction * action,gpointer data)4001 static void export_mbox_cb(GtkAction *action, gpointer data)
4002 {
4003 	MainWindow *mainwin = (MainWindow *)data;
4004 	/* only notify if export has failed */
4005 	if (export_mbox(mainwin->summaryview->folder_item) == -1) {
4006 		alertpanel_error(_("Export to mbox has failed."));
4007 	}
4008 }
4009 
export_list_mbox_cb(GtkAction * action,gpointer data)4010 static void export_list_mbox_cb(GtkAction *action, gpointer data)
4011 {
4012 	MainWindow *mainwin = (MainWindow *)data;
4013 	/* only notify if export has failed */
4014 	if (summaryview_export_mbox_list(mainwin->summaryview) == -1) {
4015 		alertpanel_error(_("Export to mbox has failed."));
4016 	}
4017 }
4018 
empty_trash_cb(GtkAction * action,gpointer data)4019 static void empty_trash_cb(GtkAction *action, gpointer data)
4020 {
4021 	MainWindow *mainwin = (MainWindow *)data;
4022 	main_window_empty_trash(mainwin, TRUE, FALSE);
4023 }
4024 
save_as_cb(GtkAction * action,gpointer data)4025 static void save_as_cb(GtkAction *action, gpointer data)
4026 {
4027 	MainWindow *mainwin = (MainWindow *)data;
4028 	summary_save_as(mainwin->summaryview);
4029 }
4030 
print_cb(GtkAction * action,gpointer data)4031 static void print_cb(GtkAction *action, gpointer data)
4032 {
4033 	MainWindow *mainwin = (MainWindow *)data;
4034 	summary_print(mainwin->summaryview);
4035 }
4036 
page_setup_cb(GtkAction * action,gpointer data)4037 static void page_setup_cb(GtkAction *action, gpointer data)
4038 {
4039 	MainWindow *mainwin = (MainWindow *)data;
4040 	GtkWindow *win;
4041 
4042 	win = (mainwin ? GTK_WINDOW(mainwin->window) : NULL);
4043 
4044 	printing_page_setup(win);
4045 }
4046 
app_exit_cb(GtkAction * action,gpointer data)4047 static void app_exit_cb(GtkAction *action, gpointer data)
4048 {
4049 	MainWindow *mainwin = (MainWindow *)data;
4050 	if (prefs_common.clean_on_exit) {
4051 		if (!main_window_empty_trash(mainwin, prefs_common.ask_on_clean, TRUE))
4052 			return;
4053 	}
4054 
4055 	if (prefs_common.confirm_on_exit) {
4056 		if (alertpanel(_("Exit"), _("Exit Claws Mail?"),
4057 			       GTK_STOCK_CANCEL, GTK_STOCK_QUIT,  NULL, ALERTFOCUS_FIRST)
4058 		    != G_ALERTALTERNATE)
4059 			return;
4060 		manage_window_focus_in(mainwin->window, NULL, NULL);
4061 	}
4062 
4063 	app_will_exit(NULL, mainwin);
4064 }
4065 
search_cb(GtkAction * action,gpointer data)4066 static void search_cb(GtkAction *action, gpointer data)
4067 {
4068 	MainWindow *mainwin = (MainWindow *)data;
4069 	message_search(mainwin->messageview);
4070 }
4071 
search_folder_cb(GtkAction * action,gpointer data)4072 static void search_folder_cb(GtkAction *action, gpointer data)
4073 {
4074 	MainWindow *mainwin = (MainWindow *)data;
4075 	FolderItem *item = mainwin->summaryview->folder_item;
4076 	cm_return_if_fail(item != NULL);
4077 	summary_search(mainwin->summaryview);
4078 }
4079 
mainwindow_quicksearch(GtkAction * action,gpointer data)4080 static void mainwindow_quicksearch(GtkAction *action, gpointer data)
4081 {
4082 	MainWindow *mainwin = (MainWindow *)data;
4083 	summaryview_activate_quicksearch(mainwin->summaryview, TRUE);
4084 }
4085 
toggle_message_cb(GtkAction * action,gpointer data)4086 static void toggle_message_cb(GtkAction *action, gpointer data)
4087 {
4088 	MainWindow *mainwin = (MainWindow *)data;
4089 	gboolean active;
4090 
4091 	active = gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (action));
4092 
4093 	if (active != messageview_is_visible(mainwin->messageview))
4094 		summary_toggle_view(mainwin->summaryview);
4095 }
4096 
toggle_toolbar_cb(GtkAction * action,GtkRadioAction * current,gpointer data)4097 static void toggle_toolbar_cb(GtkAction *action, GtkRadioAction *current, gpointer data)
4098 {
4099 	gint value = gtk_radio_action_get_current_value (GTK_RADIO_ACTION (current));
4100 	MainWindow *mainwin = (MainWindow *)data;
4101 	toolbar_toggle(value, mainwin);
4102 }
4103 
main_window_reply_cb(GtkAction * gaction,gpointer data)4104 static void main_window_reply_cb(GtkAction *gaction, gpointer data)
4105 {
4106 	MainWindow *mainwin = (MainWindow *)data;
4107 	MessageView *msgview = (MessageView*)mainwin->messageview;
4108 	GSList *msginfo_list = NULL;
4109 	gint action = COMPOSE_REPLY;
4110 	const gchar *a_name = gtk_action_get_name(gaction);
4111 
4112 	DO_ACTION("Message/Reply", COMPOSE_REPLY);
4113 	DO_ACTION("Message/ReplyTo/All", COMPOSE_REPLY_TO_ALL);
4114 	DO_ACTION("Message/ReplyTo/Sender", COMPOSE_REPLY_TO_SENDER);
4115 	DO_ACTION("Message/ReplyTo/List", COMPOSE_REPLY_TO_LIST);
4116 	DO_ACTION("Message/Forward", COMPOSE_FORWARD_INLINE);
4117 	DO_ACTION("Message/ForwardAtt", COMPOSE_FORWARD_AS_ATTACH);
4118 	DO_ACTION("Message/Redirect", COMPOSE_REDIRECT);
4119 	DO_ACTION("Message/FollowupReply", COMPOSE_FOLLOWUP_AND_REPLY_TO);
4120 
4121 	cm_return_if_fail(msgview != NULL);
4122 
4123 	msginfo_list = summary_get_selection(mainwin->summaryview);
4124 	cm_return_if_fail(msginfo_list != NULL);
4125 
4126 	if (!summary_has_opened_message(mainwin->summaryview)) {
4127 		compose_reply_from_messageview(NULL, msginfo_list, action);
4128 	} else if (summary_is_opened_message_selected(mainwin->summaryview)) {
4129 		compose_reply_from_messageview(msgview, msginfo_list, action);
4130 	} else {
4131 		compose_reply_from_messageview(msgview, NULL, action);
4132 	}
4133 
4134 	g_slist_free(msginfo_list);
4135 }
4136 
toggle_col_headers_cb(GtkAction * gaction,gpointer data)4137 static void toggle_col_headers_cb(GtkAction *gaction, gpointer data)
4138 {
4139 	MainWindow *mainwin = (MainWindow *)data;
4140 	FolderView *folderview = mainwin->folderview;
4141 	SummaryView *summaryview = mainwin->summaryview;
4142 	MimeView *mimeview = mainwin->messageview->mimeview;
4143 
4144 	if (gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (gaction))) {
4145 		gtk_cmclist_column_titles_show(GTK_CMCLIST(folderview->ctree));
4146 		gtk_cmclist_column_titles_show(GTK_CMCLIST(summaryview->ctree));
4147   		gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(mimeview->ctree), TRUE);
4148 		prefs_common.show_col_headers = TRUE;
4149 	} else {
4150 		gtk_cmclist_column_titles_hide(GTK_CMCLIST(folderview->ctree));
4151 		gtk_cmclist_column_titles_hide(GTK_CMCLIST(summaryview->ctree));
4152    		gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(mimeview->ctree), FALSE);
4153 		prefs_common.show_col_headers = FALSE;
4154 	}
4155 }
4156 
4157 #ifndef GENERIC_UMPC
toggle_statusbar_cb(GtkAction * gaction,gpointer data)4158 static void toggle_statusbar_cb(GtkAction *gaction, gpointer data)
4159 {
4160 	MainWindow *mainwin = (MainWindow *)data;
4161 	if (gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (gaction))) {
4162 		gtk_widget_show(mainwin->hbox_stat);
4163 		prefs_common.show_statusbar = TRUE;
4164 	} else {
4165 		gtk_widget_hide(mainwin->hbox_stat);
4166 		prefs_common.show_statusbar = FALSE;
4167 	}
4168 }
4169 
set_layout_cb(GtkAction * action,GtkRadioAction * current,gpointer data)4170 static void set_layout_cb(GtkAction *action, GtkRadioAction *current, gpointer data)
4171 {
4172 	MainWindow *mainwin = (MainWindow *)data;
4173 	gint value = gtk_radio_action_get_current_value (GTK_RADIO_ACTION (current));
4174 	LayoutType layout_mode = value;
4175 	LayoutType old_layout_mode = prefs_common.layout_mode;
4176 	if (mainwin->menu_lock_count) {
4177 		return;
4178 	}
4179 	if (!gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (current))) {
4180 		return;
4181 	}
4182 
4183 	if (layout_mode == prefs_common.layout_mode) {
4184 		return;
4185 	}
4186 
4187 	if (!mainwin->messageview->visible && layout_mode != SMALL_LAYOUT)
4188 		main_window_toggle_message_view(mainwin);
4189 	else if (mainwin->messageview->visible && layout_mode == SMALL_LAYOUT)
4190 		main_window_toggle_message_view(mainwin);
4191 
4192 	main_window_separation_change(mainwin, layout_mode);
4193 	mainwindow_reset_paned(GTK_PANED(mainwin->vpaned));
4194 	if (old_layout_mode == SMALL_LAYOUT && layout_mode != SMALL_LAYOUT) {
4195 		mainwindow_reset_paned(GTK_PANED(mainwin->hpaned));
4196 		if (layout_mode == VERTICAL_LAYOUT)
4197 			mainwindow_reset_paned(GTK_PANED(mainwin->vpaned));
4198 	}
4199 	if (old_layout_mode != SMALL_LAYOUT && layout_mode == SMALL_LAYOUT) {
4200 		mainwin_paned_show_first(GTK_PANED(mainwin->hpaned));
4201 		mainwindow_exit_folder(mainwin);
4202 	}
4203 	summary_relayout(mainwin->summaryview);
4204 	summary_update_unread(mainwin->summaryview, NULL);
4205 }
4206 #endif
4207 
main_window_toggle_work_offline(MainWindow * mainwin,gboolean offline,gboolean ask_sync)4208 void main_window_toggle_work_offline (MainWindow *mainwin, gboolean offline,
4209 					gboolean ask_sync)
4210 {
4211 	static gboolean switching = FALSE;
4212 
4213 	if (switching)
4214 		return;
4215 
4216 	switching = TRUE;
4217 
4218 	offline_ask_sync = ask_sync;
4219 	if (offline)
4220 		online_switch_clicked (GTK_BUTTON(mainwin->online_switch), mainwin);
4221 	else
4222 		online_switch_clicked (GTK_BUTTON(mainwin->offline_switch), mainwin);
4223 	offline_ask_sync = TRUE;
4224 
4225 	inc_reset_offline_override_timers();
4226 
4227 	switching = FALSE;
4228 }
4229 
toggle_work_offline_cb(GtkAction * action,gpointer data)4230 static void toggle_work_offline_cb (GtkAction *action, gpointer data)
4231 {
4232 	MainWindow *mainwin = (MainWindow *)data;
4233 	main_window_toggle_work_offline(mainwin, gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (action)), TRUE);
4234 }
4235 
any_folder_want_synchronise(void)4236 static gboolean any_folder_want_synchronise(void)
4237 {
4238 	GList *folderlist = folder_get_list();
4239 
4240 	/* see if there are synchronised folders */
4241 	for (; folderlist; folderlist = folderlist->next) {
4242 		Folder *folder = (Folder *)folderlist->data;
4243 		if (folder_want_synchronise(folder)) {
4244 			return TRUE;
4245 		}
4246 	}
4247 
4248 	return FALSE;
4249 }
4250 
mainwindow_check_synchronise(MainWindow * mainwin,gboolean ask)4251 static void mainwindow_check_synchronise(MainWindow *mainwin, gboolean ask)
4252 {
4253 
4254 	if (!any_folder_want_synchronise())
4255 		return;
4256 
4257 	if (offline_ask_sync && ask && alertpanel(_("Folder synchronisation"),
4258 			_("Do you want to synchronise your folders now?"),
4259 			GTK_STOCK_CANCEL, _("_Synchronise"), NULL, ALERTFOCUS_SECOND) != G_ALERTALTERNATE)
4260 		return;
4261 
4262 	if (offline_ask_sync)
4263 		folder_synchronise(NULL);
4264 }
4265 
online_switch_clicked(GtkButton * btn,gpointer data)4266 static void online_switch_clicked (GtkButton *btn, gpointer data)
4267 {
4268 	MainWindow *mainwin;
4269 	gboolean have_connectivity;
4270 
4271 #ifdef HAVE_NETWORKMANAGER_SUPPORT
4272 	have_connectivity = networkmanager_is_online(NULL);
4273 #else
4274 	have_connectivity = TRUE;
4275 #endif
4276 
4277 	mainwin = (MainWindow *) data;
4278 
4279 	cm_return_if_fail(mainwin != NULL);
4280 
4281 	if (btn == GTK_BUTTON(mainwin->online_switch)) {
4282 #ifndef GENERIC_UMPC
4283 		gtk_widget_hide (mainwin->online_switch);
4284 		gtk_widget_show (mainwin->offline_switch);
4285 #endif
4286 		cm_toggle_menu_set_active_full(mainwin->ui_manager, "Menu/File/OfflineMode", TRUE);
4287 
4288 		inc_autocheck_timer_remove();
4289 
4290 		/* go offline */
4291 		if (prefs_common.work_offline)
4292 			return;
4293 
4294 		if(have_connectivity)
4295 			mainwindow_check_synchronise(mainwin, TRUE);
4296 		prefs_common.work_offline = TRUE;
4297 		imap_disconnect_all(have_connectivity);
4298 		nntp_disconnect_all(have_connectivity);
4299 		hooks_invoke(OFFLINE_SWITCH_HOOKLIST, NULL);
4300 	} else {
4301 		/*go online */
4302 		if (!prefs_common.work_offline)
4303 			return;
4304 #ifndef GENERIC_UMPC
4305 		gtk_widget_hide (mainwin->offline_switch);
4306 		gtk_widget_show (mainwin->online_switch);
4307 #endif
4308 		cm_toggle_menu_set_active_full(mainwin->ui_manager, "Menu/File/OfflineMode", FALSE);
4309 		prefs_common.work_offline = FALSE;
4310 		inc_autocheck_timer_set();
4311 		refresh_resolvers();
4312 		hooks_invoke(OFFLINE_SWITCH_HOOKLIST, NULL);
4313 	}
4314 }
4315 
addressbook_open_cb(GtkAction * action,gpointer data)4316 static void addressbook_open_cb(GtkAction *action, gpointer data)
4317 {
4318 #ifndef USE_ALT_ADDRBOOK
4319 	addressbook_open(NULL);
4320 #else
4321 	GError* error = NULL;
4322 
4323 	addressbook_dbus_open(FALSE, &error);
4324 	if (error) {
4325 		g_warning("Failed to open address book: %s", error->message);
4326 		g_error_free(error);
4327 	}
4328 #endif
4329 }
4330 
log_window_show_cb(GtkAction * action,gpointer data)4331 static void log_window_show_cb(GtkAction *action, gpointer data)
4332 {
4333 	MainWindow *mainwin = (MainWindow *)data;
4334 	log_window_show(mainwin->logwin);
4335 }
4336 
filtering_debug_window_show_cb(GtkAction * action,gpointer data)4337 static void filtering_debug_window_show_cb(GtkAction *action, gpointer data)
4338 {
4339 	MainWindow *mainwin = (MainWindow *)data;
4340 	log_window_show(mainwin->filtering_debugwin);
4341 }
4342 
4343 #ifdef G_OS_WIN32
debug_log_show_cb(GtkAction * action,gpointer data)4344 static void debug_log_show_cb(GtkAction *action, gpointer data)
4345 {
4346 	GError *error = NULL;
4347 	gchar *logpath8 = win32_debug_log_path();
4348 	gunichar2 *logpath16;
4349 
4350 	debug_print("opening '%s'\n", logpath8);
4351 
4352 	logpath16 = g_utf8_to_utf16(logpath8, -1, NULL, NULL, &error);
4353 
4354 	if (error != NULL) {
4355 		g_warning("couldn't convert debug log path '%s' to UTF-16: %s",
4356 				logpath8, error->message);
4357 		g_error_free(error);
4358 		g_free(logpath16);
4359 		return;
4360 	}
4361 
4362 	HINSTANCE ret = ShellExecute(NULL, NULL, (LPCWSTR)logpath16,
4363 			NULL, NULL, SW_SHOW);
4364 
4365 	g_free(logpath8);
4366 	g_free(logpath16);
4367 	debug_print("ShellExecute result: %"G_GSIZE_FORMAT"\n", (gsize)ret);
4368 }
4369 #endif
4370 
inc_cancel_cb(GtkAction * action,gpointer data)4371 static void inc_cancel_cb(GtkAction *action, gpointer data)
4372 {
4373 	inc_cancel_all();
4374 	imap_cancel_all();
4375 }
4376 
send_cancel_cb(GtkAction * action,gpointer data)4377 static void send_cancel_cb(GtkAction *action, gpointer data)
4378 {
4379 	send_cancel();
4380 }
4381 
move_to_cb(GtkAction * action,gpointer data)4382 static void move_to_cb(GtkAction *action, gpointer data)
4383 {
4384 	MainWindow *mainwin = (MainWindow *)data;
4385 	summary_move_to(mainwin->summaryview);
4386 }
4387 
copy_to_cb(GtkAction * action,gpointer data)4388 static void copy_to_cb(GtkAction *action, gpointer data)
4389 {
4390 	MainWindow *mainwin = (MainWindow *)data;
4391 	summary_copy_to(mainwin->summaryview);
4392 }
4393 
delete_cb(GtkAction * action,gpointer data)4394 static void delete_cb(GtkAction *action, gpointer data)
4395 {
4396 	MainWindow *mainwin = (MainWindow *)data;
4397 	summary_delete(mainwin->summaryview);
4398 }
4399 
delete_trash_cb(GtkAction * action,gpointer data)4400 static void delete_trash_cb(GtkAction *action, gpointer data)
4401 {
4402 	MainWindow *mainwin = (MainWindow *)data;
4403 	summary_delete_trash(mainwin->summaryview);
4404 }
4405 
cancel_cb(GtkAction * action,gpointer data)4406 static void cancel_cb(GtkAction *action, gpointer data)
4407 {
4408 	MainWindow *mainwin = (MainWindow *)data;
4409 	summary_cancel(mainwin->summaryview);
4410 }
4411 
open_msg_cb(GtkAction * action,gpointer data)4412 static void open_msg_cb(GtkAction *action, gpointer data)
4413 {
4414 	MainWindow *mainwin = (MainWindow *)data;
4415 	summary_open_msg(mainwin->summaryview);
4416 }
4417 
view_source_cb(GtkAction * action,gpointer data)4418 static void view_source_cb(GtkAction *action, gpointer data)
4419 {
4420 	MainWindow *mainwin = (MainWindow *)data;
4421 	summary_view_source(mainwin->summaryview);
4422 }
4423 
show_all_header_cb(GtkAction * action,gpointer data)4424 static void show_all_header_cb(GtkAction *action, gpointer data)
4425 {
4426 	MainWindow *mainwin = (MainWindow *)data;
4427 	if (mainwin->menu_lock_count) return;
4428 	prefs_common.show_all_headers =
4429 			gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (action));
4430 	summary_display_msg_selected(mainwin->summaryview,
4431 				     gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (action)));
4432 }
4433 
toggle_fullscreen_cb(GtkAction * action,gpointer data)4434 static void toggle_fullscreen_cb(GtkAction *action, gpointer data)
4435 {
4436 	MainWindow *mainwin = (MainWindow *)data;
4437 	if (mainwin->menu_lock_count) return;
4438 	if (!gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (action))) {
4439 		gtk_window_unfullscreen(GTK_WINDOW(mainwin->window));
4440 		prefs_common.mainwin_fullscreen = FALSE;
4441 	}
4442 	else {
4443 		prefs_common.mainwin_fullscreen = TRUE;
4444 		gtk_window_fullscreen(GTK_WINDOW(mainwin->window));
4445 	}
4446 }
4447 
toggle_menubar_cb(GtkAction * action,gpointer data)4448 static void toggle_menubar_cb(GtkAction *action, gpointer data)
4449 {
4450 	MainWindow *mainwin = (MainWindow *)data;
4451 	if (mainwin->menu_lock_count) return;
4452 	if (!gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (action))) {
4453 		gtk_widget_hide(GTK_WIDGET(mainwin->menubar));
4454 		prefs_common.mainwin_menubar = FALSE;
4455 	} else {
4456 		gtk_widget_show(GTK_WIDGET(mainwin->menubar));
4457 		prefs_common.mainwin_menubar = TRUE;
4458 	}
4459 }
4460 
hide_quotes_cb(GtkAction * action,gpointer data)4461 static void hide_quotes_cb(GtkAction *action, gpointer data)
4462 {
4463 	MainWindow *mainwin = (MainWindow *)data;
4464 
4465 	if (mainwin->menu_lock_count) return;
4466 
4467 	if (gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (action))) {
4468 		const gchar *a_name = gtk_action_get_name(GTK_ACTION(action));
4469 		if (!strcmp(a_name, "View/Quotes/CollapseAll")) prefs_common.hide_quotes = 1;
4470 		else if (!strcmp(a_name, "View/Quotes/Collapse2")) prefs_common.hide_quotes = 2;
4471 		else if (!strcmp(a_name, "View/Quotes/Collapse3")) prefs_common.hide_quotes = 3;
4472 	} else
4473 		prefs_common.hide_quotes = 0;
4474 
4475 	mainwin->menu_lock_count++;
4476 	cm_toggle_menu_set_active_full(mainwin->ui_manager, "Menu/View/Quotes/CollapseAll", (prefs_common.hide_quotes == 1));
4477 	cm_toggle_menu_set_active_full(mainwin->ui_manager, "Menu/View/Quotes/Collapse2", (prefs_common.hide_quotes == 2));
4478 	cm_toggle_menu_set_active_full(mainwin->ui_manager, "Menu/View/Quotes/Collapse3", (prefs_common.hide_quotes == 3));
4479 	mainwin->menu_lock_count--;
4480 
4481 	summary_redisplay_msg(mainwin->summaryview);
4482 }
4483 
mark_cb(GtkAction * action,gpointer data)4484 static void mark_cb(GtkAction *action, gpointer data)
4485 {
4486 	MainWindow *mainwin = (MainWindow *)data;
4487 	summary_mark(mainwin->summaryview);
4488 }
4489 
unmark_cb(GtkAction * action,gpointer data)4490 static void unmark_cb(GtkAction *action, gpointer data)
4491 {
4492 	MainWindow *mainwin = (MainWindow *)data;
4493 	summary_unmark(mainwin->summaryview);
4494 }
4495 
mark_as_read_cb(GtkAction * action,gpointer data)4496 static void mark_as_read_cb(GtkAction *action, gpointer data)
4497 {
4498 	MainWindow *mainwin = (MainWindow *)data;
4499 	summary_mark_as_read(mainwin->summaryview);
4500 }
4501 
mark_as_unread_cb(GtkAction * action,gpointer data)4502 static void mark_as_unread_cb(GtkAction *action, gpointer data)
4503 {
4504 	MainWindow *mainwin = (MainWindow *)data;
4505 	summary_mark_as_unread(mainwin->summaryview);
4506 }
4507 
mark_all_read_cb(GtkAction * action,gpointer data)4508 static void mark_all_read_cb(GtkAction *action, gpointer data)
4509 {
4510 	MainWindow *mainwin = (MainWindow *)data;
4511 	summary_mark_all_read(mainwin->summaryview, TRUE);
4512 }
4513 
mark_all_unread_cb(GtkAction * action,gpointer data)4514 static void mark_all_unread_cb(GtkAction *action, gpointer data)
4515 {
4516 	MainWindow *mainwin = (MainWindow *)data;
4517 	summary_mark_all_unread(mainwin->summaryview, TRUE);
4518 }
4519 
mark_as_spam_cb(GtkAction * action,gpointer data)4520 static void mark_as_spam_cb(GtkAction *action, gpointer data)
4521 {
4522 	MainWindow *mainwin = (MainWindow *)data;
4523 	summary_mark_as_spam(mainwin->summaryview, TRUE, NULL);
4524 }
4525 
mark_as_ham_cb(GtkAction * action,gpointer data)4526 static void mark_as_ham_cb(GtkAction *action, gpointer data)
4527 {
4528 	MainWindow *mainwin = (MainWindow *)data;
4529 	summary_mark_as_spam(mainwin->summaryview, FALSE, NULL);
4530 }
4531 
ignore_thread_cb(GtkAction * action,gpointer data)4532 static void ignore_thread_cb(GtkAction *action, gpointer data)
4533 {
4534 	MainWindow *mainwin = (MainWindow *)data;
4535 	summary_ignore_thread(mainwin->summaryview);
4536 }
4537 
unignore_thread_cb(GtkAction * action,gpointer data)4538 static void unignore_thread_cb(GtkAction *action, gpointer data)
4539 {
4540 	MainWindow *mainwin = (MainWindow *)data;
4541 	summary_unignore_thread(mainwin->summaryview);
4542 }
4543 
watch_thread_cb(GtkAction * action,gpointer data)4544 static void watch_thread_cb(GtkAction *action, gpointer data)
4545 {
4546 	MainWindow *mainwin = (MainWindow *)data;
4547 	summary_watch_thread(mainwin->summaryview);
4548 }
4549 
unwatch_thread_cb(GtkAction * action,gpointer data)4550 static void unwatch_thread_cb(GtkAction *action, gpointer data)
4551 {
4552 	MainWindow *mainwin = (MainWindow *)data;
4553 	summary_unwatch_thread(mainwin->summaryview);
4554 }
4555 
lock_msgs_cb(GtkAction * action,gpointer data)4556 static void lock_msgs_cb(GtkAction *action, gpointer data)
4557 {
4558 	MainWindow *mainwin = (MainWindow *)data;
4559 	summary_msgs_lock(mainwin->summaryview);
4560 }
4561 
unlock_msgs_cb(GtkAction * action,gpointer data)4562 static void unlock_msgs_cb(GtkAction *action, gpointer data)
4563 {
4564 	MainWindow *mainwin = (MainWindow *)data;
4565 	summary_msgs_unlock(mainwin->summaryview);
4566 }
4567 
4568 
reedit_cb(GtkAction * action,gpointer data)4569 static void reedit_cb(GtkAction *action, gpointer data)
4570 {
4571 	MainWindow *mainwin = (MainWindow *)data;
4572 	summary_reedit(mainwin->summaryview);
4573 }
4574 
open_urls_cb(GtkAction * action,gpointer data)4575 static void open_urls_cb(GtkAction *action, gpointer data)
4576 {
4577 	MainWindow *mainwin = (MainWindow *)data;
4578 	if (!mainwin->summaryview->displayed && mainwin->summaryview->selected) {
4579 		summary_display_msg_selected(mainwin->summaryview,
4580 					     prefs_common.show_all_headers);
4581 	}
4582 	messageview_list_urls(mainwin->messageview);
4583 }
4584 
add_address_cb(GtkAction * action,gpointer data)4585 static void add_address_cb(GtkAction *action, gpointer data)
4586 {
4587 	MainWindow *mainwin = (MainWindow *)data;
4588 	summary_add_address(mainwin->summaryview);
4589 }
4590 
set_charset_cb(GtkAction * action,GtkRadioAction * current,gpointer data)4591 static void set_charset_cb(GtkAction *action, GtkRadioAction *current, gpointer data)
4592 {
4593 	MainWindow *mainwin = (MainWindow *)data;
4594 	gint value = gtk_radio_action_get_current_value (GTK_RADIO_ACTION (current));
4595 	const gchar *str;
4596 
4597 	if (gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (current))) {
4598 		str = conv_get_charset_str((CharSet)value);
4599 
4600 		g_free(mainwin->messageview->forced_charset);
4601 		mainwin->messageview->forced_charset = str ? g_strdup(str) : NULL;
4602 		procmime_force_charset(str);
4603 
4604 		summary_redisplay_msg(mainwin->summaryview);
4605 
4606 		debug_print("forced charset: %s\n", str ? str : "Auto-Detect");
4607 	}
4608 }
4609 
set_decode_cb(GtkAction * action,GtkRadioAction * current,gpointer data)4610 static void set_decode_cb(GtkAction *action, GtkRadioAction *current, gpointer data)
4611 {
4612 	MainWindow *mainwin = (MainWindow *)data;
4613 	gint value = gtk_radio_action_get_current_value (GTK_RADIO_ACTION (current));
4614 	if (gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (current))) {
4615 		mainwin->messageview->forced_encoding = (EncodingType)value;
4616 
4617 		summary_redisplay_msg(mainwin->summaryview);
4618 
4619 		debug_print("forced encoding: %d\n", value);
4620 	}
4621 }
4622 
hide_read_messages(GtkAction * action,gpointer data)4623 static void hide_read_messages (GtkAction *action, gpointer data)
4624 {
4625 	MainWindow *mainwin = (MainWindow *)data;
4626 	GtkWidget *menuitem = gtk_ui_manager_get_widget(mainwin->ui_manager, "/Menu/View/HideReadMessages");
4627 	if (!mainwin->summaryview->folder_item
4628 	    || g_object_get_data(G_OBJECT(menuitem), "dont_toggle"))
4629 		return;
4630 	summary_toggle_show_read_messages(mainwin->summaryview);
4631 }
4632 
hide_del_messages(GtkAction * action,gpointer data)4633 static void hide_del_messages (GtkAction *action, gpointer data)
4634 {
4635 	MainWindow *mainwin = (MainWindow *)data;
4636 	GtkWidget *menuitem = gtk_ui_manager_get_widget(mainwin->ui_manager, "/Menu/View/HideDelMessages");
4637 	if (!mainwin->summaryview->folder_item
4638 	    || g_object_get_data(G_OBJECT(menuitem), "dont_toggle"))
4639 		return;
4640 	summary_toggle_show_del_messages(mainwin->summaryview);
4641 }
4642 
hide_read_threads(GtkAction * action,gpointer data)4643 static void hide_read_threads (GtkAction *action, gpointer data)
4644 {
4645 	MainWindow *mainwin = (MainWindow *)data;
4646 	GtkWidget *menuitem = gtk_ui_manager_get_widget(mainwin->ui_manager, "/Menu/View/HideReadThreads");
4647 	if (!mainwin->summaryview->folder_item
4648 	    || g_object_get_data(G_OBJECT(menuitem), "dont_toggle"))
4649 		return;
4650 	summary_toggle_show_read_threads(mainwin->summaryview);
4651 }
4652 
thread_cb(GtkAction * action,gpointer data)4653 static void thread_cb(GtkAction *action, gpointer data)
4654 {
4655 	MainWindow *mainwin = (MainWindow *)data;
4656 	gboolean threaded = FALSE;
4657 	guint selected_msgnum = 0;
4658 
4659 	if (mainwin->menu_lock_count) return;
4660 	if (!mainwin->summaryview->folder_item) return;
4661 
4662 	selected_msgnum = summary_get_msgnum(mainwin->summaryview, mainwin->summaryview->selected);
4663 
4664 	threaded = gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (action));
4665 
4666 	mainwin->summaryview->folder_item->threaded = threaded;
4667 
4668 	mainwin->summaryview->threaded = threaded;
4669 
4670 	summary_show(mainwin->summaryview,
4671 			mainwin->summaryview->folder_item, FALSE);
4672 	summary_select_by_msgnum(mainwin->summaryview, selected_msgnum, FALSE);
4673 }
4674 
expand_threads_cb(GtkAction * action,gpointer data)4675 static void expand_threads_cb(GtkAction *action, gpointer data)
4676 {
4677 	MainWindow *mainwin = (MainWindow *)data;
4678 	summary_expand_threads(mainwin->summaryview);
4679 }
4680 
collapse_threads_cb(GtkAction * action,gpointer data)4681 static void collapse_threads_cb(GtkAction *action, gpointer data)
4682 {
4683 	MainWindow *mainwin = (MainWindow *)data;
4684 	summary_collapse_threads(mainwin->summaryview);
4685 }
4686 
set_summary_display_item_cb(GtkAction * action,gpointer data)4687 static void set_summary_display_item_cb(GtkAction *action, gpointer data)
4688 {
4689 	prefs_summary_column_open();
4690 }
4691 
set_folder_display_item_cb(GtkAction * action,gpointer data)4692 static void set_folder_display_item_cb(GtkAction *action, gpointer data)
4693 {
4694 	prefs_folder_column_open();
4695 }
4696 
sort_summary_cb(GtkAction * action,GtkRadioAction * current,gpointer data)4697 static void sort_summary_cb(GtkAction *action, GtkRadioAction *current, gpointer data)
4698 {
4699 	MainWindow *mainwin = (MainWindow *)data;
4700 	gint value = gtk_radio_action_get_current_value (GTK_RADIO_ACTION (current));
4701 
4702 	if (mainwin->menu_lock_count) return;
4703 
4704 	if (gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (current))) {
4705 		summary_sort(mainwin->summaryview, (FolderSortKey)value,
4706 			     mainwin->summaryview->sort_type);
4707 	}
4708 }
4709 
sort_summary_type_cb(GtkAction * gaction,GtkRadioAction * current,gpointer data)4710 static void sort_summary_type_cb(GtkAction *gaction, GtkRadioAction *current, gpointer data)
4711 {
4712 	MainWindow *mainwin = (MainWindow *)data;
4713 	gint value = gtk_radio_action_get_current_value (GTK_RADIO_ACTION (current));
4714 
4715 	if (mainwin->menu_lock_count) return;
4716 
4717 	if (gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (current)))
4718 		summary_sort(mainwin->summaryview,
4719 			     mainwin->summaryview->sort_key, (FolderSortType)value);
4720 }
4721 
attract_by_subject_cb(GtkAction * action,gpointer data)4722 static void attract_by_subject_cb(GtkAction *action, gpointer data)
4723 {
4724 	MainWindow *mainwin = (MainWindow *)data;
4725 	summary_attract_by_subject(mainwin->summaryview);
4726 }
4727 
mainwindow_delete_duplicated(MainWindow * mainwin)4728 void mainwindow_delete_duplicated(MainWindow *mainwin)
4729 {
4730 	FolderItem *item;
4731 
4732 	item = folderview_get_selected_item(mainwin->folderview);
4733 	if (item) {
4734 		gint result;
4735 
4736 		main_window_cursor_wait(mainwin);
4737 		STATUSBAR_PUSH(mainwin, _("Deleting duplicated messages..."));
4738 		result = folderutils_delete_duplicates(item, prefs_common.immediate_exec ?
4739 					      DELETE_DUPLICATES_REMOVE : DELETE_DUPLICATES_SETFLAG);
4740 		STATUSBAR_POP(mainwin);
4741 		main_window_cursor_normal(mainwin);
4742 
4743 		switch (result) {
4744 		case -1:
4745 			break;
4746 		case 0:
4747 			alertpanel_notice(_("No duplicate message found in selected folder.\n"));
4748 			break;
4749 		default: {
4750 				gchar *msg;
4751 
4752 				if (prefs_common.immediate_exec) {
4753 					msg = ngettext("Deleted %d duplicate message in selected folder.\n",
4754 							       "Deleted %d duplicate messages in selected folder.\n",
4755 							   result);
4756 				} else {
4757 					msg = ngettext("Marked %d duplicate message for deletion in selected folder.\n",
4758 							       "Marked %d duplicate messages for deletion in selected folder.\n",
4759 							   result);
4760 				}
4761 				alertpanel_notice(msg, result);
4762 			}
4763 		}
4764 	}
4765 }
4766 
delete_duplicated_cb(GtkAction * action,gpointer data)4767 static void delete_duplicated_cb(GtkAction *action, gpointer data)
4768 {
4769 	mainwindow_delete_duplicated((MainWindow *)data);
4770 }
4771 
4772 struct DelDupsData
4773 {
4774 	guint	dups;
4775 	guint	folders;
4776 };
4777 
deldup_all(FolderItem * item,gpointer _data)4778 static void deldup_all(FolderItem *item, gpointer _data)
4779 {
4780 	struct DelDupsData *data = _data;
4781 	gint result;
4782 
4783 	result = folderutils_delete_duplicates(item, DELETE_DUPLICATES_REMOVE);
4784 	if (result >= 0) {
4785 		data->dups += result;
4786 		data->folders += 1;
4787 	}
4788 }
4789 
mainwindow_delete_duplicated_all(MainWindow * mainwin)4790 void mainwindow_delete_duplicated_all(MainWindow *mainwin)
4791 {
4792 	struct DelDupsData data = {0, 0};
4793 
4794 	main_window_cursor_wait(mainwin);
4795 	STATUSBAR_PUSH(mainwin, _("Deleting duplicated messages in all folders..."));
4796 	folder_func_to_all_folders(deldup_all, &data);
4797 	STATUSBAR_POP(mainwin);
4798 	main_window_cursor_normal(mainwin);
4799 
4800 	if (data.dups > 0) {
4801 		alertpanel_notice(ngettext("Deleted %d duplicate message in %d folders.\n",
4802 				   "Deleted %d duplicate messages in %d folders.\n",
4803 				   data.dups),
4804 				   data.dups, data.folders);
4805 	} else {
4806 		alertpanel_notice(_("No duplicate message found in %d folders.\n"), data.folders);
4807 	}
4808 }
4809 
delete_duplicated_all_cb(GtkAction * action,gpointer mw)4810 static void delete_duplicated_all_cb(GtkAction *action, gpointer mw)
4811 {
4812 	MainWindow *mainwin = (MainWindow *)mw;
4813 
4814 	mainwindow_delete_duplicated_all(mainwin);
4815 }
4816 
filter_cb(GtkAction * action,gpointer data)4817 static void filter_cb(GtkAction *action, gpointer data)
4818 {
4819 	MainWindow *mainwin = (MainWindow *)data;
4820 	summary_filter(mainwin->summaryview, FALSE);
4821 }
4822 
filter_list_cb(GtkAction * action,gpointer data)4823 static void filter_list_cb(GtkAction *action, gpointer data)
4824 {
4825 	MainWindow *mainwin = (MainWindow *)data;
4826 	summary_filter(mainwin->summaryview, TRUE);
4827 }
4828 
process_cb(GtkAction * action,gpointer data)4829 static void process_cb(GtkAction *action, gpointer data)
4830 {
4831 	MainWindow *mainwin = (MainWindow *)data;
4832 	FolderItem *item = mainwin->summaryview->folder_item;
4833 	cm_return_if_fail(item != NULL);
4834 
4835 	item->processing_pending = TRUE;
4836 	folder_item_apply_processing(item);
4837 	item->processing_pending = FALSE;
4838 }
4839 
execute_summary_cb(GtkAction * action,gpointer data)4840 static void execute_summary_cb(GtkAction *action, gpointer data)
4841 {
4842 	MainWindow *mainwin = (MainWindow *)data;
4843 	summary_execute(mainwin->summaryview);
4844 }
4845 
expunge_summary_cb(GtkAction * action,gpointer data)4846 static void expunge_summary_cb(GtkAction *action, gpointer data)
4847 {
4848 	MainWindow *mainwin = (MainWindow *)data;
4849 	summary_expunge(mainwin->summaryview);
4850 }
4851 
update_summary_cb(GtkAction * action,gpointer data)4852 static void update_summary_cb(GtkAction *action, gpointer data)
4853 {
4854 	MainWindow *mainwin = (MainWindow *)data;
4855 	FolderItem *fitem;
4856 	FolderView *folderview = mainwin->folderview;
4857 
4858 	if (!mainwin->summaryview->folder_item) return;
4859 	if ((fitem = folderview_get_opened_item(folderview)) == NULL) return;
4860 
4861 	folder_update_op_count();
4862 	folder_item_scan(fitem);
4863 	summary_show(mainwin->summaryview, fitem, FALSE);
4864 }
4865 
prev_cb(GtkAction * action,gpointer data)4866 static void prev_cb(GtkAction *action, gpointer data)
4867 {
4868 	MainWindow *mainwin = (MainWindow *)data;
4869 	summary_select_prev(mainwin->summaryview);
4870 }
4871 
next_cb(GtkAction * action,gpointer data)4872 static void next_cb(GtkAction *action, gpointer data)
4873 {
4874 	MainWindow *mainwin = (MainWindow *)data;
4875 	summary_select_next(mainwin->summaryview);
4876 }
4877 
prev_unread_cb(GtkAction * action,gpointer data)4878 static void prev_unread_cb(GtkAction *action, gpointer data)
4879 {
4880 	MainWindow *mainwin = (MainWindow *)data;
4881 	summary_select_prev_unread(mainwin->summaryview);
4882 }
4883 
next_unread_cb(GtkAction * action,gpointer data)4884 static void next_unread_cb(GtkAction *action, gpointer data)
4885 {
4886 	MainWindow *mainwin = (MainWindow *)data;
4887 	summary_select_next_unread(mainwin->summaryview);
4888 }
4889 
prev_new_cb(GtkAction * action,gpointer data)4890 static void prev_new_cb(GtkAction *action, gpointer data)
4891 {
4892 	MainWindow *mainwin = (MainWindow *)data;
4893 	summary_select_prev_new(mainwin->summaryview);
4894 }
4895 
next_new_cb(GtkAction * action,gpointer data)4896 static void next_new_cb(GtkAction *action, gpointer data)
4897 {
4898 	MainWindow *mainwin = (MainWindow *)data;
4899 	summary_select_next_new(mainwin->summaryview);
4900 }
4901 
prev_marked_cb(GtkAction * action,gpointer data)4902 static void prev_marked_cb(GtkAction *action, gpointer data)
4903 {
4904 	MainWindow *mainwin = (MainWindow *)data;
4905 	summary_select_prev_marked(mainwin->summaryview);
4906 }
4907 
next_marked_cb(GtkAction * action,gpointer data)4908 static void next_marked_cb(GtkAction *action, gpointer data)
4909 {
4910 	MainWindow *mainwin = (MainWindow *)data;
4911 	summary_select_next_marked(mainwin->summaryview);
4912 }
4913 
prev_labeled_cb(GtkAction * action,gpointer data)4914 static void prev_labeled_cb(GtkAction *action, gpointer data)
4915 {
4916 	MainWindow *mainwin = (MainWindow *)data;
4917 	summary_select_prev_labeled(mainwin->summaryview);
4918 }
4919 
next_labeled_cb(GtkAction * action,gpointer data)4920 static void next_labeled_cb(GtkAction *action, gpointer data)
4921 {
4922 	MainWindow *mainwin = (MainWindow *)data;
4923 	summary_select_next_labeled(mainwin->summaryview);
4924 }
4925 
prev_history_cb(GtkAction * action,gpointer data)4926 static void prev_history_cb(GtkAction *action, gpointer data)
4927 {
4928 	MainWindow *mainwin = (MainWindow *)data;
4929 	MsgInfo *info = messageview_nav_get_prev(mainwin->messageview);
4930 	if (info) {
4931 		if (info->folder != mainwin->summaryview->folder_item)
4932 			folderview_select(mainwin->folderview, info->folder);
4933 		summary_select_by_msgnum(mainwin->summaryview, info->msgnum,
4934 				OPEN_SELECTED_ON_PREVNEXT);
4935 		procmsg_msginfo_free(&info);
4936 		main_window_set_menu_sensitive(mainwindow_get_mainwindow());
4937 		toolbar_main_set_sensitive(mainwindow_get_mainwindow());
4938 	}
4939 }
4940 
next_history_cb(GtkAction * action,gpointer data)4941 static void next_history_cb(GtkAction *action, gpointer data)
4942 {
4943 	MainWindow *mainwin = (MainWindow *)data;
4944 	MsgInfo *info = messageview_nav_get_next(mainwin->messageview);
4945 	if (info) {
4946 		if (info->folder != mainwin->summaryview->folder_item)
4947 			folderview_select(mainwin->folderview, info->folder);
4948 		summary_select_by_msgnum(mainwin->summaryview, info->msgnum,
4949 				OPEN_SELECTED_ON_PREVNEXT);
4950 		procmsg_msginfo_free(&info);
4951 		main_window_set_menu_sensitive(mainwindow_get_mainwindow());
4952 		toolbar_main_set_sensitive(mainwindow_get_mainwindow());
4953 	}
4954 }
4955 
parent_cb(GtkAction * action,gpointer data)4956 static void parent_cb(GtkAction *action, gpointer data)
4957 {
4958 	MainWindow *mainwin = (MainWindow *)data;
4959 	summary_select_parent(mainwin->summaryview);
4960 }
4961 
goto_folder_cb(GtkAction * action,gpointer data)4962 static void goto_folder_cb(GtkAction *action, gpointer data)
4963 {
4964 	MainWindow *mainwin = (MainWindow *)data;
4965 	FolderItem *to_folder;
4966 
4967 	to_folder = foldersel_folder_sel(NULL, FOLDER_SEL_ALL, NULL, FALSE,
4968 			_("Select folder to go to"));
4969 
4970 	if (to_folder)
4971 		folderview_select(mainwin->folderview, to_folder);
4972 }
4973 
goto_unread_folder_cb(GtkAction * action,gpointer data)4974 static void goto_unread_folder_cb(GtkAction *action, gpointer data)
4975 {
4976 	MainWindow *mainwin = (MainWindow *)data;
4977 	folderview_select_next_with_flag(mainwin->folderview, MSG_UNREAD);
4978 }
4979 
scroll_prev_line_cb(GtkAction * action,gpointer data)4980 static void scroll_prev_line_cb(GtkAction *action, gpointer data)
4981 {
4982         MainWindow *mainwin = (MainWindow *)data;
4983         mimeview_scroll_one_line(mainwin->messageview->mimeview,TRUE);
4984 }
4985 
scroll_next_line_cb(GtkAction * action,gpointer data)4986 static void scroll_next_line_cb(GtkAction *action, gpointer data)
4987 {
4988         MainWindow *mainwin = (MainWindow *)data;
4989         mimeview_scroll_one_line(mainwin->messageview->mimeview,FALSE);
4990 }
4991 
scroll_prev_page_cb(GtkAction * action,gpointer data)4992 static void scroll_prev_page_cb(GtkAction *action, gpointer data)
4993 {
4994         MainWindow *mainwin = (MainWindow *)data;
4995         mimeview_scroll_page(mainwin->messageview->mimeview,TRUE);
4996 }
4997 
scroll_next_page_cb(GtkAction * action,gpointer data)4998 static void scroll_next_page_cb(GtkAction *action, gpointer data)
4999 {
5000         MainWindow *mainwin = (MainWindow *)data;
5001         mimeview_scroll_page(mainwin->messageview->mimeview,FALSE);
5002 }
5003 
copy_cb(GtkAction * action,gpointer data)5004 static void copy_cb(GtkAction *action, gpointer data)
5005 {
5006 	MainWindow *mainwin = (MainWindow *)data;
5007 	messageview_copy_clipboard(mainwin->messageview);
5008 }
5009 
allsel_cb(GtkAction * action,gpointer data)5010 static void allsel_cb(GtkAction *action, gpointer data)
5011 {
5012 	MainWindow *mainwin = (MainWindow *)data;
5013 	MessageView *msgview = mainwin->messageview;
5014 
5015 	if (messageview_is_visible(msgview) &&
5016 		 (gtk_widget_has_focus(msgview->mimeview->textview->text)))
5017 		messageview_select_all(mainwin->messageview);
5018 	else
5019 		summary_select_all(mainwin->summaryview);
5020 }
5021 
select_thread_cb(GtkAction * action,gpointer data)5022 static void select_thread_cb(GtkAction *action, gpointer data)
5023 {
5024 	MainWindow *mainwin = (MainWindow *)data;
5025 	summary_select_thread(mainwin->summaryview, FALSE, FALSE);
5026 }
5027 
trash_thread_cb(GtkAction * action,gpointer data)5028 static void trash_thread_cb(GtkAction *action, gpointer data)
5029 {
5030 	MainWindow *mainwin = (MainWindow *)data;
5031 	summary_select_thread(mainwin->summaryview, FALSE, TRUE);
5032 }
5033 
delete_thread_cb(GtkAction * action,gpointer data)5034 static void delete_thread_cb(GtkAction *action, gpointer data)
5035 {
5036 	MainWindow *mainwin = (MainWindow *)data;
5037 	summary_select_thread(mainwin->summaryview, TRUE, FALSE);
5038 }
5039 
create_filter_cb(GtkAction * gaction,gpointer data)5040 static void create_filter_cb(GtkAction *gaction, gpointer data)
5041 {
5042 	MainWindow *mainwin = (MainWindow *)data;
5043 	const gchar *a_name = gtk_action_get_name(gaction);
5044 	gint action = -1;
5045 
5046 	DO_ACTION("Tools/CreateFilterRule/Automatically", FILTER_BY_AUTO);
5047 	DO_ACTION("Tools/CreateFilterRule/ByFrom", FILTER_BY_FROM);
5048 	DO_ACTION("Tools/CreateFilterRule/ByTo", FILTER_BY_TO);
5049 	DO_ACTION("Tools/CreateFilterRule/BySubject", FILTER_BY_SUBJECT);
5050 	summary_filter_open(mainwin->summaryview, (PrefsFilterType)action, 0);
5051 }
5052 
create_processing_cb(GtkAction * gaction,gpointer data)5053 static void create_processing_cb(GtkAction *gaction, gpointer data)
5054 {
5055 	MainWindow *mainwin = (MainWindow *)data;
5056 	const gchar *a_name = gtk_action_get_name(gaction);
5057 	gint action = -1;
5058 
5059 	DO_ACTION("Tools/CreateProcessingRule/Automatically", FILTER_BY_AUTO);
5060 	DO_ACTION("Tools/CreateProcessingRule/ByFrom", FILTER_BY_FROM);
5061 	DO_ACTION("Tools/CreateProcessingRule/ByTo", FILTER_BY_TO);
5062 	DO_ACTION("Tools/CreateProcessingRule/BySubject", FILTER_BY_SUBJECT);
5063 	summary_filter_open(mainwin->summaryview, (PrefsFilterType)action, 1);
5064 }
5065 
prefs_pre_processing_open_cb(GtkAction * action,gpointer data)5066 static void prefs_pre_processing_open_cb(GtkAction *action, gpointer data)
5067 {
5068 	prefs_filtering_open(&pre_global_processing,
5069 			     _("Processing rules to apply before folder rules"),
5070 			     MANUAL_ANCHOR_PROCESSING,
5071 			     NULL, NULL, FALSE);
5072 }
5073 
prefs_post_processing_open_cb(GtkAction * action,gpointer data)5074 static void prefs_post_processing_open_cb(GtkAction *action, gpointer data)
5075 {
5076 	prefs_filtering_open(&post_global_processing,
5077 			     _("Processing rules to apply after folder rules"),
5078 			     MANUAL_ANCHOR_PROCESSING,
5079 			     NULL, NULL, FALSE);
5080 }
5081 
prefs_filtering_open_cb(GtkAction * action,gpointer data)5082 static void prefs_filtering_open_cb(GtkAction *action, gpointer data)
5083 {
5084 	prefs_filtering_open(&filtering_rules,
5085 			     _("Filtering configuration"),
5086 			     MANUAL_ANCHOR_FILTERING,
5087 			     NULL, NULL, TRUE);
5088 }
5089 
prefs_template_open_cb(GtkAction * action,gpointer data)5090 static void prefs_template_open_cb(GtkAction *action, gpointer data)
5091 {
5092 	prefs_template_open();
5093 }
5094 
prefs_actions_open_cb(GtkAction * action,gpointer data)5095 static void prefs_actions_open_cb(GtkAction *action, gpointer data)
5096 {
5097 	MainWindow *mainwin = (MainWindow *)data;
5098 	prefs_actions_open(mainwin);
5099 }
5100 
prefs_tags_open_cb(GtkAction * action,gpointer data)5101 static void prefs_tags_open_cb(GtkAction *action, gpointer data)
5102 {
5103 	MainWindow *mainwin = (MainWindow *)data;
5104 	GSList * list = summary_get_selected_msg_list(mainwin->summaryview);
5105 	tag_apply_open(list);
5106 }
5107 #ifdef USE_GNUTLS
ssl_manager_open_cb(GtkAction * action,gpointer data)5108 static void ssl_manager_open_cb(GtkAction *action, gpointer data)
5109 {
5110 	MainWindow *mainwin = (MainWindow *)data;
5111 	ssl_manager_open(mainwin);
5112 }
5113 #endif
prefs_account_open_cb(GtkAction * action,gpointer data)5114 static void prefs_account_open_cb(GtkAction *action, gpointer data)
5115 {
5116 	MainWindow *mainwin = (MainWindow *)data;
5117 	if (!cur_account) {
5118 		new_account_cb(NULL, mainwin);
5119 	} else {
5120 		account_open(cur_account, FALSE);
5121 	}
5122 }
5123 
new_account_cb(GtkAction * action,gpointer data)5124 static void new_account_cb(GtkAction *action, gpointer data)
5125 {
5126 	account_edit_open(NULL, NULL);
5127 	if (!compose_get_compose_list()) account_add();
5128 }
5129 
account_selector_menu_cb(GtkMenuItem * menuitem,gpointer data)5130 static void account_selector_menu_cb(GtkMenuItem *menuitem, gpointer data)
5131 {
5132 	FolderItem *item = NULL;
5133 	cur_account = (PrefsAccount *)data;
5134 
5135 	if (!mainwindow_get_mainwindow())
5136 		return;
5137 	main_window_show_cur_account(mainwindow_get_mainwindow());
5138 	toolbar_update(TOOLBAR_MAIN, mainwindow_get_mainwindow());
5139 	main_window_set_menu_sensitive(mainwindow_get_mainwindow());
5140 	toolbar_main_set_sensitive(mainwindow_get_mainwindow());
5141 	item = folderview_get_selected_item(
5142 			mainwindow_get_mainwindow()->folderview);
5143 	if (item) {
5144 		toolbar_set_compose_button
5145 			(mainwindow_get_mainwindow()->toolbar,
5146 			 FOLDER_TYPE(item->folder) == F_NEWS ?
5147 			 COMPOSEBUTTON_NEWS : COMPOSEBUTTON_MAIL);
5148 	}
5149 }
5150 
account_receive_menu_cb(GtkMenuItem * menuitem,gpointer data)5151 static void account_receive_menu_cb(GtkMenuItem *menuitem, gpointer data)
5152 {
5153 	MainWindow *mainwin = (MainWindow *)mainwin_list->data;
5154 	PrefsAccount *account = (PrefsAccount *)data;
5155 
5156 	inc_account_mail(mainwin, account);
5157 }
5158 #ifndef GENERIC_UMPC
account_compose_menu_cb(GtkMenuItem * menuitem,gpointer data)5159 static void account_compose_menu_cb(GtkMenuItem *menuitem, gpointer data)
5160 {
5161 	PrefsAccount *account = (PrefsAccount *)data;
5162 
5163 	compose_new_with_folderitem(account, NULL, NULL);
5164 }
5165 #endif
prefs_open_cb(GtkAction * action,gpointer data)5166 static void prefs_open_cb(GtkAction *action, gpointer data)
5167 {
5168 	prefs_gtk_open();
5169 }
5170 
plugins_open_cb(GtkAction * action,gpointer data)5171 static void plugins_open_cb(GtkAction *action, gpointer data)
5172 {
5173 	pluginwindow_create();
5174 }
5175 
manual_open_cb(GtkAction * action,gpointer data)5176 static void manual_open_cb(GtkAction *action, gpointer data)
5177 {
5178 	manual_open(MANUAL_MANUAL_CLAWS, NULL);
5179 }
5180 
manual_faq_open_cb(GtkAction * action,gpointer data)5181 static void manual_faq_open_cb(GtkAction *action, gpointer data)
5182 {
5183 	manual_open(MANUAL_FAQ_CLAWS, NULL);
5184 }
5185 
legend_open_cb(GtkAction * action,gpointer data)5186 static void legend_open_cb(GtkAction *action, gpointer data)
5187 {
5188 	legend_show();
5189 }
5190 
5191 #ifdef G_OS_WIN32
set_default_client_cb(GtkAction * action,gpointer data)5192 static void set_default_client_cb(GtkAction *action, gpointer data)
5193 {
5194 	char exename[MAX_PATH];
5195 	gchar *binary_icon = NULL;
5196 	gchar *binary_compose = NULL;
5197 	gchar *binary_run = NULL;
5198 	int r = 0;
5199 	if ( !GetModuleFileNameA (0, exename, sizeof (exename)) ) {
5200 		alertpanel_error(_("Can not register as default client: impossible to get executable path."));
5201 		return;
5202 	}
5203 	binary_icon = g_strconcat(exename, ",0", NULL);
5204 	binary_compose = g_strconcat(exename, " --compose %1", NULL);
5205 	binary_run = g_strconcat(exename, NULL);
5206 
5207 	/* Try to set the Mail Start menu item to Claws. It may fail if we're not root; we don't care */
5208 	r = write_w32_registry_string("HKLM", "Software\\Clients\\Mail",
5209 			"", "Claws Mail");
5210 
5211 	r = write_w32_registry_string("HKCU", "Software\\Clients\\Mail\\Claws Mail",
5212 				"", "Claws Mail");
5213 	if (!r)
5214 		r = write_w32_registry_string("HKCU", "Software\\Clients\\Mail\\Claws Mail",
5215 				"DLLPath", "");
5216 	if (!r)
5217 		r = write_w32_registry_string("HKCU", "Software\\Clients\\Mail\\Claws Mail\\Protocols\\mailto",
5218 				"", "URL:MailTo-Protocol");
5219 	if (!r)
5220 		r = write_w32_registry_string("HKCU", "Software\\Clients\\Mail\\Claws Mail\\Protocols\\mailto",
5221 				"URL Protocol", "");
5222 	if (!r)
5223 		r = write_w32_registry_dword ("HKCU", "Software\\Clients\\Mail\\Claws Mail\\Protocols\\mailto",
5224 				"EditFlags", 2);
5225 	if (!r)
5226 		r = write_w32_registry_string ("HKCU", "Software\\Clients\\Mail\\Claws Mail\\Protocols\\mailto",
5227 				"FriendlyTypeName", "Claws-Mail URL");
5228 	if (!r)
5229 		r = write_w32_registry_string("HKCU", "Software\\Clients\\Mail\\Claws Mail\\Protocols\\mailto\\DefaultIcon",
5230 				"", binary_icon);
5231 	if (!r)
5232 		r = write_w32_registry_string("HKCU", "Software\\Clients\\Mail\\Claws Mail\\Protocols\\mailto\\shell\\open\\command",
5233 				"", binary_compose);
5234 	if (!r)
5235 		r = write_w32_registry_string("HKCU", "Software\\Clients\\Mail\\Claws Mail\\shell\\open\\command",
5236 				"", binary_run);
5237 
5238 	if (!r)
5239 		r = write_w32_registry_string("HKCU", "Software\\Classes\\mailto",
5240 				"", "URL:MailTo-Protocol");
5241 	if (!r)
5242 		r = write_w32_registry_string("HKCU", "Software\\Classes\\mailto",
5243 				"URL Protocol", "");
5244 	if (!r)
5245 		r = write_w32_registry_dword ("HKCU", "Software\\Classes\\mailto",
5246 				"EditFlags", 2);
5247 	if (!r)
5248 		r = write_w32_registry_string("HKCU", "Software\\Classes\\mailto",
5249 				"FriendlyTypeName", "Claws-Mail URL");
5250 	if (!r)
5251 		r = write_w32_registry_string("HKCU", "Software\\Classes\\mailto\\DefaultIcon",
5252 				"", binary_icon);
5253 	if (!r)
5254 		r = write_w32_registry_string("HKCU", "Software\\Classes\\mailto\\shell\\open\\command",
5255 				"", binary_compose);
5256 
5257 	if (!r) {
5258 		SendMessage(HWND_BROADCAST, WM_SETTINGCHANGE, 0, (LPARAM)"Software\\Clients\\Mail");
5259 		alertpanel_notice(_("Claws Mail has been registered as default client."));
5260 	} else {
5261 		alertpanel_error(_("Can not register as default client: impossible to write to the registry."));
5262 	}
5263 	g_free(binary_icon);
5264 	g_free(binary_compose);
5265 	g_free(binary_run);
5266 }
5267 #endif
5268 
scan_tree_func(Folder * folder,FolderItem * item,gpointer data)5269 static void scan_tree_func(Folder *folder, FolderItem *item, gpointer data)
5270 {
5271 	MainWindow *mainwin = (MainWindow *)data;
5272 	gchar *str;
5273 
5274 	if (item->path)
5275 		str = g_strdup_printf(_("Scanning folder %s%c%s..."),
5276 				      LOCAL_FOLDER(folder)->rootpath,
5277 				      G_DIR_SEPARATOR,
5278 				      item->path);
5279 	else
5280 		str = g_strdup_printf(_("Scanning folder %s..."),
5281 				      LOCAL_FOLDER(folder)->rootpath);
5282 
5283 	STATUSBAR_PUSH(mainwin, str);
5284 	STATUSBAR_POP(mainwin);
5285 	g_free(str);
5286 }
5287 
mainwindow_focus_in_event(GtkWidget * widget,GdkEventFocus * focus,gpointer data)5288 static gboolean mainwindow_focus_in_event(GtkWidget *widget, GdkEventFocus *focus,
5289 					  gpointer data)
5290 {
5291 	SummaryView *summary;
5292 
5293 	cm_return_val_if_fail(data, FALSE);
5294 	if (!g_list_find(mainwin_list, data))
5295 		return TRUE;
5296 	summary = ((MainWindow *)data)->summaryview;
5297 	cm_return_val_if_fail(summary, FALSE);
5298 
5299 	if (GTK_CMCLIST(summary->ctree)->selection &&
5300 	    g_list_length(GTK_CMCLIST(summary->ctree)->selection) > 1)
5301 		return FALSE;
5302 
5303 	return FALSE;
5304 }
5305 
mainwindow_visibility_event_cb(GtkWidget * widget,GdkEventVisibility * event,gpointer data)5306 static gboolean mainwindow_visibility_event_cb(GtkWidget *widget, GdkEventVisibility *event,
5307 					  gpointer data)
5308 {
5309 	is_obscured = (event->state == GDK_VISIBILITY_FULLY_OBSCURED);
5310 	return FALSE;
5311 }
5312 
mainwindow_state_event_cb(GtkWidget * widget,GdkEventWindowState * state,gpointer data)5313 static gboolean mainwindow_state_event_cb(GtkWidget *widget, GdkEventWindowState *state,
5314 					  gpointer data)
5315 {
5316 	if (!claws_is_starting()
5317 		&& state->changed_mask&GDK_WINDOW_STATE_ICONIFIED
5318 		&& state->new_window_state&GDK_WINDOW_STATE_ICONIFIED) {
5319 
5320 		if (iconified_count > 0)
5321 			hooks_invoke(MAIN_WINDOW_GOT_ICONIFIED, NULL);
5322 		iconified_count++;
5323 	} else if (!claws_is_starting()) {
5324 		prefs_common.mainwin_maximised =
5325 			((state->new_window_state&GDK_WINDOW_STATE_MAXIMIZED) != 0);
5326 	}
5327 	if (state->new_window_state == 0)
5328 		gtk_window_set_skip_taskbar_hint(GTK_WINDOW(widget), FALSE);
5329 	return FALSE;
5330 }
5331 
mainwindow_is_obscured(void)5332 gboolean mainwindow_is_obscured(void)
5333 {
5334 	return is_obscured;
5335 }
5336 
5337 /*
5338  * Harvest addresses for selected folder.
5339  */
addr_harvest_cb(GtkAction * action,gpointer data)5340 static void addr_harvest_cb( GtkAction *action, gpointer data)
5341 {
5342 	MainWindow *mainwin = (MainWindow *)data;
5343 
5344 	addressbook_harvest( mainwin->summaryview->folder_item, FALSE, NULL );
5345 }
5346 
5347 /*
5348  * Harvest addresses for selected messages in summary view.
5349  */
addr_harvest_msg_cb(GtkAction * action,gpointer data)5350 static void addr_harvest_msg_cb( GtkAction *action, gpointer data)
5351 {
5352 	MainWindow *mainwin = (MainWindow *)data;
5353 	summary_harvest_address( mainwin->summaryview );
5354 }
5355 
5356 /*!
5357  *\brief	get a MainWindow
5358  *
5359  *\return	MainWindow * The first mainwindow in the mainwin_list
5360  */
mainwindow_get_mainwindow(void)5361 MainWindow *mainwindow_get_mainwindow(void)
5362 {
5363 	if (mainwin_list && mainwin_list->data)
5364 		return (MainWindow *)(mainwin_list->data);
5365 	else
5366 		return NULL;
5367 }
5368 
mainwindow_progressindicator_hook(gpointer source,gpointer userdata)5369 static gboolean mainwindow_progressindicator_hook(gpointer source, gpointer userdata)
5370 {
5371 	ProgressData *data = (ProgressData *) source;
5372 	MainWindow *mainwin = (MainWindow *) userdata;
5373 
5374 	switch (data->cmd) {
5375 	case PROGRESS_COMMAND_START:
5376 	case PROGRESS_COMMAND_STOP:
5377 		gtk_progress_bar_set_fraction
5378 			(GTK_PROGRESS_BAR(mainwin->progressbar), 0.0);
5379 		break;
5380 	case PROGRESS_COMMAND_SET_PERCENTAGE:
5381 		gtk_progress_bar_set_fraction
5382 			(GTK_PROGRESS_BAR(mainwin->progressbar), data->value);
5383 		break;
5384 	}
5385 	while (gtk_events_pending()) gtk_main_iteration ();
5386 
5387 	return FALSE;
5388 }
5389 
sync_cb(GtkAction * action,gpointer data)5390 static void sync_cb(GtkAction *action, gpointer data)
5391 {
5392 	MainWindow *mainwin = (MainWindow *)data;
5393 	mainwindow_check_synchronise(mainwin, FALSE);
5394 }
5395 
forget_session_passwords_cb(GtkAction * action,gpointer data)5396 static void forget_session_passwords_cb(GtkAction *action, gpointer data)
5397 {
5398 	MainWindow *mainwin = (MainWindow *)data;
5399 	GList *list = NULL;
5400         gint fgtn = 0;
5401 	gint accs = 0;
5402 
5403 	main_window_lock(mainwin);
5404 	for (list = account_get_list(); list != NULL; list = list->next) {
5405 		PrefsAccount *account = list->data;
5406 		if (account->session_passwd) {
5407 			g_free(account->session_passwd);
5408 			account->session_passwd = NULL;
5409 			++fgtn;
5410 		}
5411 		if (account->session_smtp_passwd) {
5412 			g_free(account->session_smtp_passwd);
5413 			account->session_smtp_passwd = NULL;
5414 			++fgtn;
5415 		}
5416 		++accs;
5417 	}
5418 	main_window_unlock(mainwin);
5419 	alertpanel_notice(ngettext("Forgotten %d password in %d accounts.\n",
5420 				   "Forgotten %d passwords in %d accounts.\n",
5421 				   fgtn), fgtn, accs);
5422 }
5423 
5424 #ifndef PASSWORD_CRYPTO_OLD
forget_master_passphrase_cb(GtkAction * action,gpointer data)5425 static void forget_master_passphrase_cb(GtkAction *action, gpointer data)
5426 {
5427 	MainWindow *mainwin = (MainWindow *)data;
5428 
5429 	main_window_lock(mainwin);
5430 	master_passphrase_forget();
5431 	main_window_unlock(mainwin);
5432 }
5433 #endif
5434 
mainwindow_learn(MainWindow * mainwin,gboolean is_spam)5435 void mainwindow_learn (MainWindow *mainwin, gboolean is_spam)
5436 {
5437 	summary_mark_as_spam(mainwin->summaryview, is_spam, NULL);
5438 }
5439 
mainwindow_jump_to(const gchar * target,gboolean popup)5440 void mainwindow_jump_to(const gchar *target, gboolean popup)
5441 {
5442 	gchar *tmp = NULL;
5443 	gchar *p = NULL;
5444 	FolderItem *item = NULL;
5445 	gchar *msg = NULL;
5446 	MainWindow *mainwin = mainwindow_get_mainwindow();
5447 	gchar *from_uri = NULL;
5448 	if (!target)
5449 		return;
5450 
5451 	if (!mainwin) {
5452 		g_print("not initialized\n");
5453 		return;
5454 	}
5455 
5456 	if ((from_uri = g_filename_from_uri(target, NULL, NULL)) != NULL)
5457 		tmp = from_uri;
5458 	else
5459 		tmp = g_strdup(target);
5460 
5461 	if ((p = strstr(tmp, "\r")) != NULL)
5462 		*p = '\0';
5463 	if ((p = strstr(tmp, "\n")) != NULL)
5464 		*p = '\0';
5465 
5466 	if ((item = folder_find_item_from_identifier(tmp))) {
5467 		g_print("selecting folder '%s'\n", tmp);
5468 		folderview_select(mainwin->folderview, item);
5469 		if (popup)
5470 			main_window_popup(mainwin);
5471 		g_free(tmp);
5472 		return;
5473 	}
5474 
5475 	msg = strrchr(tmp, '/');
5476 	if (msg) {
5477 		*msg++ = '\0';
5478 		if ((item = folder_find_item_from_identifier(tmp))) {
5479 			g_print("selecting folder '%s'\n", tmp);
5480 			folderview_select(mainwin->folderview, item);
5481 		} else if ((item = folder_find_item_from_real_path(tmp))) {
5482 			g_print("selecting folder '%s'\n", tmp);
5483 			folderview_select(mainwin->folderview, item);
5484 		} else {
5485 			g_print("'%s' not found\n", tmp);
5486 		}
5487 		if (item && msg && atoi(msg)) {
5488 			g_print("selecting message %d\n", atoi(msg));
5489 			summary_select_by_msgnum(mainwin->summaryview, atoi(msg), TRUE);
5490 			if (popup)
5491 				main_window_popup(mainwin);
5492 			g_free(tmp);
5493 			return;
5494 		} else if (item && msg[0] == '<' && msg[strlen(msg)-1] == '>') {
5495 			MsgInfo *msginfo = NULL;
5496 			msg++;
5497 			msg[strlen(msg)-1] = '\0';
5498 			msginfo = folder_item_get_msginfo_by_msgid(item, msg);
5499 			if (msginfo) {
5500 				g_print("selecting message %s\n", msg);
5501 				summary_select_by_msgnum(mainwin->summaryview, msginfo->msgnum, TRUE);
5502 				if (popup)
5503 					main_window_popup(mainwin);
5504 				g_free(tmp);
5505 				procmsg_msginfo_free(&msginfo);
5506 				return;
5507 			} else {
5508 				g_print("'%s' not found\n", msg);
5509 			}
5510 		} else {
5511 			g_print("'%s' not found\n", msg);
5512 		}
5513 	} else {
5514 		g_print("'%s' not found\n", tmp);
5515 	}
5516 
5517 	g_free(tmp);
5518 }
5519 
mainwindow_exit_folder(MainWindow * mainwin)5520 void mainwindow_exit_folder(MainWindow *mainwin) {
5521 	if (prefs_common.layout_mode == SMALL_LAYOUT) {
5522 		folderview_close_opened(mainwin->folderview, FALSE);
5523 		mainwin_paned_show_first(GTK_PANED(mainwin->hpaned));
5524 		folderview_grab_focus(mainwin->folderview);
5525 	}
5526 	mainwin->in_folder = FALSE;
5527 	main_window_set_menu_sensitive(mainwin);
5528 }
5529 
mainwindow_enter_folder(MainWindow * mainwin)5530 void mainwindow_enter_folder(MainWindow *mainwin) {
5531 	if (prefs_common.layout_mode == SMALL_LAYOUT) {
5532 		mainwin_paned_show_last(GTK_PANED(mainwin->hpaned));
5533 	}
5534 	mainwin->in_folder = TRUE;
5535 	main_window_set_menu_sensitive(mainwin);
5536 }
5537 
save_part_as_cb(GtkAction * action,gpointer data)5538 static void save_part_as_cb(GtkAction *action, gpointer data)
5539 {
5540 	MainWindow *mainwin = (MainWindow *)data;
5541 
5542 	if (mainwin->messageview
5543 	&&  mainwin->messageview->mimeview)
5544 		mimeview_save_as(mainwin->messageview->mimeview);
5545 }
5546 
view_part_as_text_cb(GtkAction * action,gpointer data)5547 static void view_part_as_text_cb(GtkAction *action, gpointer data)
5548 {
5549 	MainWindow *mainwin = (MainWindow *)data;
5550 
5551 	if (mainwin->messageview
5552 	&&  mainwin->messageview->mimeview)
5553 		mimeview_display_as_text(mainwin->messageview->mimeview);
5554 }
5555 
open_part_cb(GtkAction * action,gpointer data)5556 static void open_part_cb(GtkAction *action, gpointer data)
5557 {
5558 	MainWindow *mainwin = (MainWindow *)data;
5559 
5560 	if (mainwin->messageview
5561 	&&  mainwin->messageview->mimeview)
5562 		mimeview_launch(mainwin->messageview->mimeview, NULL);
5563 }
5564 #ifndef G_OS_WIN32
open_part_with_cb(GtkAction * action,gpointer data)5565 static void open_part_with_cb(GtkAction *action, gpointer data)
5566 {
5567 	MainWindow *mainwin = (MainWindow *)data;
5568 
5569 	if (mainwin->messageview
5570 	&&  mainwin->messageview->mimeview)
5571 		mimeview_open_with(mainwin->messageview->mimeview);
5572 }
5573 #endif
check_signature_cb(GtkAction * action,gpointer data)5574 static void check_signature_cb(GtkAction *action, gpointer data)
5575 {
5576 	MainWindow *mainwin = (MainWindow *)data;
5577 
5578 	if (mainwin->messageview
5579 	&&  mainwin->messageview->mimeview)
5580 		mimeview_check_signature(mainwin->messageview->mimeview);
5581 }
5582 
goto_next_part_cb(GtkAction * action,gpointer data)5583 static void goto_next_part_cb(GtkAction *action, gpointer data)
5584 {
5585 	MainWindow *mainwin = (MainWindow *)data;
5586 
5587 	if (mainwin->messageview
5588 	&&  mainwin->messageview->mimeview)
5589 		mimeview_select_next_part(mainwin->messageview->mimeview);
5590 }
5591 
goto_prev_part_cb(GtkAction * action,gpointer data)5592 static void goto_prev_part_cb(GtkAction *action, gpointer data)
5593 {
5594 	MainWindow *mainwin = (MainWindow *)data;
5595 
5596 	if (mainwin->messageview
5597 	&&  mainwin->messageview->mimeview)
5598 		mimeview_select_prev_part(mainwin->messageview->mimeview);
5599 }
5600