Remove wrong initialization from max_message_size
[claws.git] / src / mainwindow.c
blobf960ac38e7e2957a45a6a76d8c03b9283e4f4687
1 /*
2 * Claws Mail -- a GTK based, lightweight, and fast e-mail client
3 * Copyright (C) 1999-2023 the Claws Mail team and Hiroyuki Yamamoto
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 3 of the License, or
8 * (at your option) any later version.
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
15 * You should have received a copy of the GNU General Public License
16 * along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #include "config.h"
20 #include "defs.h"
22 #ifdef G_OS_WIN32
23 #define UNICODE
24 #define _UNICODE
25 #endif
27 #include <glib.h>
28 #include <glib/gi18n.h>
29 #include <gdk/gdkkeysyms.h>
30 #include <gtk/gtk.h>
31 #include <string.h>
32 #include <stdarg.h>
34 #include "main.h"
35 #include "mainwindow.h"
36 #include "folderview.h"
37 #include "folder_item_prefs.h"
38 #include "foldersel.h"
39 #include "quicksearch.h"
40 #include "summaryview.h"
41 #include "summary_search.h"
42 #include "messageview.h"
43 #include "mimeview.h"
44 #include "message_search.h"
45 #include "headerview.h"
46 #include "menu.h"
47 #include "stock_pixmap.h"
48 #include "folder.h"
49 #include "inc.h"
50 #include "log.h"
51 #include "compose.h"
52 #include "procmsg.h"
53 #include "import.h"
54 #include "export.h"
55 #include "edittags.h"
56 #include "password.h"
57 #include "prefs_common.h"
58 #include "prefs_actions.h"
59 #include "prefs_filtering.h"
60 #include "prefs_account.h"
61 #include "prefs_summary_column.h"
62 #include "prefs_folder_column.h"
63 #include "prefs_template.h"
64 #include "action.h"
65 #include "account.h"
66 #ifndef USE_ALT_ADDRBOOK
67 #include "addressbook.h"
68 #else
69 #include "addressbook-dbus.h"
70 #endif
71 #include "logwindow.h"
72 #include "manage_window.h"
73 #include "alertpanel.h"
74 #include "statusbar.h"
75 #include "inputdialog.h"
76 #include "utils.h"
77 #include "gtkutils.h"
78 #include "codeconv.h"
79 #include "about.h"
80 #include "manual.h"
81 #include "version.h"
82 #include "ssl_manager.h"
83 #include "sslcertwindow.h"
84 #include "prefs_gtk.h"
85 #include "pluginwindow.h"
86 #include "hooks.h"
87 #include "progressindicator.h"
88 #include "localfolder.h"
89 #include "filtering.h"
90 #include "folderutils.h"
91 #include "foldersort.h"
92 #include "icon_legend.h"
93 #include "colorlabel.h"
94 #include "tags.h"
95 #include "textview.h"
96 #include "imap.h"
97 #include "news.h"
98 #include "socket.h"
99 #include "printing.h"
100 #include "send_message.h"
101 #ifdef G_OS_WIN32
102 #include "w32_reg.h"
103 #endif
105 /* list of all instantiated MainWindow */
106 static GList *mainwin_list = NULL;
108 static GdkCursor *watch_cursor = NULL;
109 static GdkCursor *hand_cursor = NULL;
111 static gint iconified_count = 0;
113 static void main_window_menu_callback_block (MainWindow *mainwin);
114 static void main_window_menu_callback_unblock (MainWindow *mainwin);
116 static void main_window_show_cur_account (MainWindow *mainwin);
117 #ifndef GENERIC_UMPC
118 static void main_window_separation_change (MainWindow *mainwin,
119 LayoutType layout_mode);
120 #endif
121 static void main_window_set_widgets (MainWindow *mainwin,
122 LayoutType layout_mode);
124 #ifndef GENERIC_UMPC
125 static gboolean ac_label_button_pressed (GtkWidget *widget,
126 GdkEventButton *event,
127 gpointer data);
128 #endif
129 static gint main_window_close_cb (GtkWidget *widget,
130 GdkEventAny *event,
131 gpointer data);
133 static void main_window_size_allocate_cb (GtkWidget *widget,
134 GtkAllocation *allocation,
135 gpointer data);
136 static void folder_window_size_allocate_cb (GtkWidget *widget,
137 GtkAllocation *allocation,
138 gpointer data);
139 static void message_window_size_allocate_cb (GtkWidget *widget,
140 GtkAllocation *allocation,
141 gpointer data);
143 static void update_folderview_cb (GtkAction *action,
144 gpointer data);
145 static void add_mailbox_cb (GtkAction *action,
146 gpointer data);
147 static void foldersort_cb (GtkAction *action,
148 gpointer data);
149 static void import_mbox_cb (GtkAction *action,
150 gpointer data);
151 static void export_mbox_cb (GtkAction *action,
152 gpointer data);
153 static void export_list_mbox_cb (GtkAction *action,
154 gpointer data);
155 static void empty_trash_cb (GtkAction *action,
156 gpointer data);
157 static void save_as_cb (GtkAction *action,
158 gpointer data);
159 static void page_setup_cb (GtkAction *action,
160 gpointer data);
161 static void print_cb (GtkAction *action,
162 gpointer data);
163 static void app_exit_cb (GtkAction *action,
164 gpointer data);
167 static void search_cb (GtkAction *action,
168 gpointer data);
169 static void search_folder_cb (GtkAction *action,
170 gpointer data);
172 static void toggle_message_cb (GtkAction *action,
173 gpointer data);
174 static void toggle_toolbar_cb (GtkAction *action, GtkRadioAction *current, gpointer data);
175 static void toggle_col_headers_cb(GtkAction *action,
176 gpointer data);
177 #ifndef GENERIC_UMPC
178 static void toggle_statusbar_cb (GtkAction *action,
179 gpointer data);
180 static void set_layout_cb (GtkAction *action, GtkRadioAction *current, gpointer data);
181 #endif
182 static void addressbook_open_cb (GtkAction *action,
183 gpointer data);
184 static void log_window_show_cb (GtkAction *action,
185 gpointer data);
186 static void filtering_debug_window_show_cb (GtkAction *action,
187 gpointer data);
188 #ifdef G_OS_WIN32
189 static void debug_log_show_cb(GtkAction *action, gpointer data);
190 #endif
192 static void inc_cancel_cb (GtkAction *action,
193 gpointer data);
194 static void send_cancel_cb (GtkAction *action,
195 gpointer data);
197 static void open_msg_cb (GtkAction *action,
198 gpointer data);
200 static void view_source_cb (GtkAction *action,
201 gpointer data);
203 static void show_all_header_cb (GtkAction *action,
204 gpointer data);
205 static void toggle_fullscreen_cb (GtkAction *action,
206 gpointer data);
207 static void toggle_menubar_cb (GtkAction *action,
208 gpointer data);
210 static void hide_quotes_cb(GtkAction *action,
211 gpointer data);
213 static void move_to_cb (GtkAction *action,
214 gpointer data);
215 static void copy_to_cb (GtkAction *action,
216 gpointer data);
217 static void delete_cb (GtkAction *action,
218 gpointer data);
219 static void delete_trash_cb (GtkAction *action,
220 gpointer data);
222 static void cancel_cb (GtkAction *action,
223 gpointer data);
225 static void mark_cb (GtkAction *action,
226 gpointer data);
227 static void unmark_cb (GtkAction *action,
228 gpointer data);
230 static void mark_as_unread_cb (GtkAction *action,
231 gpointer data);
232 static void mark_as_read_cb (GtkAction *action,
233 gpointer data);
234 static void mark_all_read_cb (GtkAction *action,
235 gpointer data);
236 static void mark_all_unread_cb (GtkAction *action,
237 gpointer data);
238 static void mark_as_spam_cb (GtkAction *action,
239 gpointer data);
240 static void mark_as_ham_cb (GtkAction *action,
241 gpointer data);
243 static void ignore_thread_cb (GtkAction *action,
244 gpointer data);
245 static void unignore_thread_cb (GtkAction *action,
246 gpointer data);
247 static void watch_thread_cb (GtkAction *action,
248 gpointer data);
249 static void unwatch_thread_cb (GtkAction *action,
250 gpointer data);
251 static void lock_msgs_cb (GtkAction *action,
252 gpointer data);
253 static void unlock_msgs_cb (GtkAction *action,
254 gpointer data);
256 static void reedit_cb (GtkAction *action,
257 gpointer data);
259 static void add_address_cb (GtkAction *action,
260 gpointer data);
262 static void set_charset_cb (GtkAction *action, GtkRadioAction *current, gpointer data);
264 static void set_decode_cb (GtkAction *action, GtkRadioAction *current, gpointer data);
266 static void hide_read_messages (GtkAction *action,
267 gpointer data);
268 static void hide_read_threads (GtkAction *action,
269 gpointer data);
270 static void hide_del_messages (GtkAction *action,
271 gpointer data);
273 static void thread_cb (GtkAction *action,
274 gpointer data);
275 static void expand_threads_cb (GtkAction *action,
276 gpointer data);
277 static void collapse_threads_cb (GtkAction *action,
278 gpointer data);
280 static void set_summary_display_item_cb (GtkAction *action,
281 gpointer data);
282 static void set_folder_display_item_cb (GtkAction *action,
283 gpointer data);
284 static void sort_summary_cb (GtkAction *action, GtkRadioAction *current, gpointer data);
285 static void sort_summary_type_cb (GtkAction *action, GtkRadioAction *current, gpointer data);
286 static void attract_by_subject_cb(GtkAction *action,
287 gpointer data);
289 static void delete_duplicated_cb (GtkAction *action,
290 gpointer data);
291 static void delete_duplicated_all_cb (GtkAction *action,
292 gpointer data);
293 static void filter_cb (GtkAction *action,
294 gpointer data);
295 static void filter_list_cb (GtkAction *action,
296 gpointer data);
297 static void process_cb (GtkAction *action,
298 gpointer data);
299 static void execute_summary_cb (GtkAction *action,
300 gpointer data);
301 static void expunge_summary_cb (GtkAction *action,
302 gpointer data);
303 static void update_summary_cb (GtkAction *action,
304 gpointer data);
306 static void prev_cb (GtkAction *action,
307 gpointer data);
308 static void next_cb (GtkAction *action,
309 gpointer data);
310 static void next_unread_cb (GtkAction *action,
311 gpointer data);
312 static void prev_unread_cb (GtkAction *action,
313 gpointer data);
315 static void prev_new_cb (GtkAction *action,
316 gpointer data);
317 static void next_new_cb (GtkAction *action,
318 gpointer data);
319 static void prev_marked_cb (GtkAction *action,
320 gpointer data);
321 static void next_marked_cb (GtkAction *action,
322 gpointer data);
323 static void prev_labeled_cb (GtkAction *action,
324 gpointer data);
325 static void next_labeled_cb (GtkAction *action,
326 gpointer data);
327 static void prev_history_cb (GtkAction *action,
328 gpointer data);
329 static void next_history_cb (GtkAction *action,
330 gpointer data);
331 static void parent_cb (GtkAction *action,
332 gpointer data);
334 static void goto_folder_cb (GtkAction *action,
335 gpointer data);
336 static void goto_unread_folder_cb(GtkAction *action,
337 gpointer data);
339 static void scroll_prev_line_cb (GtkAction *action,
340 gpointer data);
341 static void scroll_next_line_cb (GtkAction *action,
342 gpointer data);
343 static void scroll_prev_page_cb (GtkAction *action,
344 gpointer data);
345 static void scroll_next_page_cb (GtkAction *action,
346 gpointer data);
348 static void copy_cb (GtkAction *action,
349 gpointer data);
350 static void allsel_cb (GtkAction *action,
351 gpointer data);
352 static void select_thread_cb (GtkAction *action,
353 gpointer data);
354 static void trash_thread_cb (GtkAction *action,
355 gpointer data);
356 static void delete_thread_cb (GtkAction *action,
357 gpointer data);
359 static void create_filter_cb (GtkAction *action,
360 gpointer data);
361 static void create_processing_cb (GtkAction *action,
362 gpointer data);
363 static void open_urls_cb (GtkAction *action,
364 gpointer data);
366 static void prefs_template_open_cb (GtkAction *action,
367 gpointer data);
368 static void prefs_actions_open_cb (GtkAction *action,
369 gpointer data);
370 static void prefs_tags_open_cb (GtkAction *action,
371 gpointer data);
372 static void prefs_account_open_cb (GtkAction *action,
373 gpointer data);
375 static void prefs_pre_processing_open_cb (GtkAction *action,
376 gpointer data);
378 static void prefs_post_processing_open_cb (GtkAction *action,
379 gpointer data);
381 static void prefs_filtering_open_cb (GtkAction *action,
382 gpointer data);
383 #ifdef USE_GNUTLS
384 static void ssl_manager_open_cb (GtkAction *action,
385 gpointer data);
386 #endif
387 static void new_account_cb (GtkAction *action,
388 gpointer data);
390 static void account_selector_menu_cb (GtkMenuItem *menuitem,
391 gpointer data);
392 static void account_receive_menu_cb (GtkMenuItem *menuitem,
393 gpointer data);
394 #ifndef GENERIC_UMPC
395 static void account_compose_menu_cb (GtkMenuItem *menuitem,
396 gpointer data);
397 #endif
398 static void prefs_open_cb (GtkAction *action,
399 gpointer data);
400 static void plugins_open_cb (GtkAction *action,
401 gpointer data);
403 static void online_switch_clicked(GtkButton *btn,
404 gpointer data);
406 static void manual_open_cb (GtkAction *action,
407 gpointer data);
408 static void manual_faq_open_cb (GtkAction *action,
409 gpointer data);
411 static void legend_open_cb (GtkAction *action,
412 gpointer data);
414 #ifdef G_OS_WIN32
415 static void set_default_client_cb (GtkAction *action,
416 gpointer data);
417 #endif
419 static void scan_tree_func (Folder *folder,
420 FolderItem *item,
421 gpointer data);
423 static void toggle_work_offline_cb(GtkAction *action,
424 gpointer data);
426 static void addr_harvest_cb ( GtkAction *action,
427 gpointer data );
429 static void addr_harvest_msg_cb ( GtkAction *action,
430 gpointer data );
431 static void sync_cb ( GtkAction *action,
432 gpointer data );
434 static void forget_session_passwords_cb (GtkAction *action,
435 gpointer data );
436 #ifndef PASSWORD_CRYPTO_OLD
437 static void forget_primary_passphrase_cb (GtkAction *action,
438 gpointer data );
439 #endif
440 static gboolean mainwindow_focus_in_event (GtkWidget *widget,
441 GdkEventFocus *focus,
442 gpointer data);
443 static gboolean mainwindow_visibility_event_cb (GtkWidget *widget,
444 GdkEventVisibility *state,
445 gpointer data);
446 static gboolean mainwindow_state_event_cb (GtkWidget *widget,
447 GdkEventWindowState *state,
448 gpointer data);
449 static void main_window_reply_cb (GtkAction *action,
450 gpointer data);
451 static gboolean mainwindow_progressindicator_hook (gpointer source,
452 gpointer userdata);
454 static gint mailing_list_create_submenu(MainWindow *mainwindow,
455 MsgInfo *msginfo);
457 static gint mailing_list_populate_submenu(GtkWidget *menu, const gchar * list_header);
459 static void get_url_part(const gchar **buf, gchar *url_decoded);
461 static void mailing_list_compose(GtkWidget *w, gpointer *data);
463 static void mailing_list_open_uri(GtkWidget *w, gpointer *data);
465 static void mainwindow_quicksearch (GtkAction *action,
466 gpointer data);
467 static gboolean any_folder_want_synchronise(void);
469 static void save_part_as_cb(GtkAction *action, gpointer data);
470 static void view_part_as_text_cb(GtkAction *action, gpointer data);
471 static void open_part_cb(GtkAction *action, gpointer data);
472 #ifndef G_OS_WIN32
473 static void open_part_with_cb(GtkAction *action, gpointer data);
474 #endif
475 static void check_signature_cb(GtkAction *action, gpointer data);
476 static void goto_next_part_cb(GtkAction *action, gpointer data);
477 static void goto_prev_part_cb(GtkAction *action, gpointer data);
478 #define DO_ACTION(name, act) { if (!strcmp(a_name, name)) action = act; }
480 static void mainwindow_nothing_cb (GtkAction *action, gpointer data)
485 static void about_cb(GtkAction *gaction, gpointer data)
487 about_show();
490 static void mw_inc_mail_cb (GtkAction *gaction, gpointer data)
492 inc_mail_cb(data, 0, NULL);
494 static void mw_inc_all_account_mail_cb (GtkAction *gaction, gpointer data)
496 inc_all_account_mail_cb(data, 0, NULL);
498 static void mw_send_queue_cb (GtkAction *gaction, gpointer data)
500 send_queue_cb(data, 0, NULL);
502 static void mw_compose_mail_cb (GtkAction *gaction, gpointer data)
504 compose_mail_cb(data, 0, NULL);
506 static void mw_compose_news_cb (GtkAction *gaction, gpointer data)
508 compose_news_cb(data, 0, NULL);
511 static GtkActionEntry mainwin_entries[] =
513 {"Menu", NULL, "Menu", NULL, NULL, NULL },
514 /* menus */
515 {"File", NULL, N_("_File"), NULL, NULL, NULL },
516 {"Edit", NULL, N_("_Edit"), NULL, NULL, NULL },
517 {"View", NULL, N_("_View"), NULL, NULL, NULL },
518 {"Message", NULL, N_("_Message"), NULL, NULL, NULL },
519 {"Tools", NULL, N_("_Tools"), NULL, NULL, NULL },
520 {"Configuration", NULL, N_("_Configuration"), NULL, NULL, NULL },
521 {"Help", NULL, N_("_Help"), NULL, NULL, NULL },
523 /* File menu */
524 {"File/AddMailbox", NULL, N_("_Add mailbox"), NULL, NULL, NULL },
525 {"File/AddMailbox/MH", NULL, N_("MH..."), NULL, NULL, G_CALLBACK(add_mailbox_cb) },
526 {"File/---", NULL, "---", NULL, NULL, NULL },
528 {"File/SortMailboxes", NULL, N_("Change mailbox order..."), NULL, NULL, G_CALLBACK(foldersort_cb) },
530 /* {"File/---", NULL, "---", NULL, NULL, NULL }, */
531 {"File/ImportMbox", NULL, N_("_Import mbox file..."), NULL, NULL, G_CALLBACK(import_mbox_cb) },
532 {"File/ExportMbox", NULL, N_("_Export to mbox file..."), NULL, NULL, G_CALLBACK(export_mbox_cb) },
533 {"File/ExportSelMbox", NULL, N_("_Export selected to mbox file..."), NULL, NULL, G_CALLBACK(export_list_mbox_cb) },
534 /* {"File/---", NULL, "---", NULL, NULL, NULL }, */
535 {"File/EmptyTrashes", NULL, N_("Empty all _Trash folders"), "<shift>D", NULL, G_CALLBACK(empty_trash_cb) },
536 /* {"File/---", NULL, "---", NULL, NULL, NULL }, */
538 {"File/SaveAs", NULL, N_("_Save email as..."), "<control>S", NULL, G_CALLBACK(save_as_cb) },
539 {"File/SavePartAs", NULL, N_("_Save part as..."), "Y", NULL, G_CALLBACK(save_part_as_cb) },
540 /* {"File/---", NULL, "---", NULL, NULL, NULL }, */
542 {"File/PageSetup", NULL, N_("Page setup..."), NULL, NULL, G_CALLBACK(page_setup_cb) },
543 {"File/Print", NULL, N_("_Print..."), "<control>P", NULL, G_CALLBACK(print_cb) },
544 /* {"File/---", NULL, "---", NULL, NULL, NULL }, */
545 {"File/SynchroniseFolders", NULL, N_("Synchronise folders"), "<control><shift>S", NULL, G_CALLBACK(sync_cb) },
546 /* {"File/---", NULL, "---", NULL, NULL, NULL }, */
547 {"File/Exit", NULL, N_("E_xit"), "<control>Q", NULL, G_CALLBACK(app_exit_cb) },
549 /* Edit menu */
550 {"Edit/Copy", NULL, N_("_Copy"), "<control>C", NULL, G_CALLBACK(copy_cb) },
551 {"Edit/SelectAll", NULL, N_("Select _all"), "<control>A", NULL, G_CALLBACK(allsel_cb) },
552 {"Edit/SelectThread", NULL, N_("Select _thread"), NULL, NULL, G_CALLBACK(select_thread_cb) },
553 {"Edit/---", NULL, "---", NULL, NULL, NULL },
554 {"Edit/Find", NULL, N_("_Find in current message..."), "<control>F", NULL, G_CALLBACK(search_cb) },
555 {"Edit/SearchFolder", NULL, N_("_Search folder..."), "<shift><control>F", NULL, G_CALLBACK(search_folder_cb) },
556 {"Edit/QuickSearch", NULL, N_("_Quick search"), "slash", NULL, G_CALLBACK(mainwindow_quicksearch) },
558 /* View menu */
559 {"View/ShowHide", NULL, N_("Show or hi_de"), NULL, NULL, NULL },
560 {"View/ShowHide/Toolbar", NULL, N_("_Toolbar"), NULL, NULL, NULL },
562 {"View/SetColumns", NULL, N_("Set displayed _columns"), NULL, NULL, NULL },
563 {"View/SetColumns/Folderlist", NULL, N_("In _folder list..."), NULL, NULL, G_CALLBACK(set_folder_display_item_cb) },
564 {"View/SetColumns/Messagelist", NULL, N_("In _message list..."), NULL, NULL, G_CALLBACK(set_summary_display_item_cb) },
565 {"View/---", NULL, "---", NULL, NULL, NULL },
568 #ifndef GENERIC_UMPC
569 {"View/Layout", NULL, N_("La_yout"), NULL, NULL, NULL },
570 #endif
571 {"View/Sort", NULL, N_("_Sort"), NULL, NULL, NULL },
572 {"View/Sort/---", NULL, "---", NULL, NULL, NULL },
573 {"View/Sort/AttractSubj", NULL, N_("_Attract by subject"), NULL, NULL, G_CALLBACK(attract_by_subject_cb) },
575 {"View/ExpandThreads", NULL, N_("E_xpand all threads"), NULL, NULL, G_CALLBACK(expand_threads_cb) },
576 {"View/CollapseThreads", NULL, N_("Co_llapse all threads"), NULL, NULL, G_CALLBACK(collapse_threads_cb) },
578 {"View/Goto", NULL, N_("_Go to"), NULL, NULL, NULL },
579 {"View/Goto/Prev", NULL, N_("_Previous message"), "P", NULL, G_CALLBACK(prev_cb) },
580 {"View/Goto/Next", NULL, N_("_Next message"), "N", NULL, G_CALLBACK(next_cb) },
581 {"View/Goto/---", NULL, "---", NULL, NULL, NULL },
582 {"View/Goto/PrevUnread", NULL, N_("P_revious unread message"), "<shift>P", NULL, G_CALLBACK(prev_unread_cb) },
583 {"View/Goto/NextUnread", NULL, N_("N_ext unread message"), "<shift>N", NULL, G_CALLBACK(next_unread_cb) },
584 /* {"View/Goto/---", NULL, "---", NULL, NULL, NULL }, */
585 {"View/Goto/PrevNew", NULL, N_("Previous ne_w message"), NULL, NULL, G_CALLBACK(prev_new_cb) },
586 {"View/Goto/NextNew", NULL, N_("Ne_xt new message"), NULL, NULL, G_CALLBACK(next_new_cb) },
587 /* {"View/Goto/---", NULL, "---", NULL, NULL, NULL }, */
588 {"View/Goto/PrevMarked", NULL, N_("Previous _marked message"), NULL, NULL, G_CALLBACK(prev_marked_cb) },
589 {"View/Goto/NextMarked", NULL, N_("Next m_arked message"), NULL, NULL, G_CALLBACK(next_marked_cb) },
590 /* {"View/Goto/---", NULL, "---", NULL, NULL, NULL }, */
591 {"View/Goto/PrevLabeled", NULL, N_("Previous _labeled message"), NULL, NULL, G_CALLBACK(prev_labeled_cb) },
592 {"View/Goto/NextLabeled", NULL, N_("Next la_beled message"), NULL, NULL, G_CALLBACK(next_labeled_cb) },
593 /* {"View/Goto/---", NULL, "---", NULL, NULL, NULL }, */
594 {"View/Goto/PrevHistory", NULL, N_("Previously opened message"), "<alt>Left", NULL, G_CALLBACK(prev_history_cb) },
595 {"View/Goto/NextHistory", NULL, N_("Next opened message"), "<alt>Right", NULL, G_CALLBACK(next_history_cb) },
596 /* {"View/Goto/---", NULL, "---", NULL, NULL, NULL }, */
597 {"View/Goto/ParentMessage", NULL, N_("Parent message"), "<control>Up", NULL, G_CALLBACK(parent_cb) },
598 /* {"View/Goto/---", NULL, "---", NULL, NULL, NULL }, */
599 {"View/Goto/NextUnreadFolder", NULL, N_("Next unread _folder"), "<shift>G", NULL, G_CALLBACK(goto_unread_folder_cb) },
600 {"View/Goto/Folder", NULL, N_("F_older..."), "G", NULL, G_CALLBACK(goto_folder_cb) },
601 /* {"View/Goto/---", NULL, "---", NULL, NULL, NULL }, */
602 {"View/Goto/NextPart", NULL, N_("Next part"), "A", NULL, G_CALLBACK(goto_next_part_cb) },
603 {"View/Goto/PrevPart", NULL, N_("Previous part"), "Z", NULL, G_CALLBACK(goto_prev_part_cb) },
605 /* {"View/Scroll/---", NULL, "---", NULL, NULL, NULL }, */
606 {"View/Scroll", NULL, N_("Message scroll"), NULL, NULL, NULL },
607 {"View/Scroll/PrevLine", NULL, N_("Previous line"), NULL, NULL, G_CALLBACK(scroll_prev_line_cb) },
608 {"View/Scroll/NextLine", NULL, N_("Next line"), NULL, NULL, G_CALLBACK(scroll_next_line_cb) },
609 {"View/Scroll/PrevPage", NULL, N_("Previous page"), NULL, NULL, G_CALLBACK(scroll_prev_page_cb) },
610 {"View/Scroll/NextPage", NULL, N_("Next page"), NULL, NULL, G_CALLBACK(scroll_next_page_cb) },
612 /* {"View/---", NULL, "---", NULL, NULL, NULL }, */
613 {"View/Encoding", NULL, N_("Character _encoding"), NULL, NULL, NULL }, /* set_charset_cb */
614 {"View/Encoding/---", NULL, "---", NULL, NULL, NULL },
615 #define ENC_ACTION(cs_char,c_char,string) \
616 { "View/Encoding/" cs_char, NULL, N_(string), NULL, NULL, c_char }
618 {"View/Encoding/Western", NULL, N_("Western European"), NULL, NULL, NULL },
619 {"View/Encoding/Baltic", NULL, N_("Baltic"), NULL, NULL, NULL },
620 {"View/Encoding/Hebrew", NULL, N_("Hebrew"), NULL, NULL, NULL },
621 {"View/Encoding/Arabic", NULL, N_("Arabic"), NULL, NULL, NULL },
622 {"View/Encoding/Cyrillic", NULL, N_("Cyrillic"), NULL, NULL, NULL },
623 {"View/Encoding/Japanese", NULL, N_("Japanese"), NULL, NULL, NULL },
624 {"View/Encoding/Chinese", NULL, N_("Chinese"), NULL, NULL, NULL },
625 {"View/Encoding/Korean", NULL, N_("Korean"), NULL, NULL, NULL },
626 {"View/Encoding/Thai", NULL, N_("Thai"), NULL, NULL, NULL },
628 {"View/Decode", NULL, N_("Decode"), NULL, NULL, NULL }, /* set_decode_cb */
629 {"View/Decode/---", NULL, "---", NULL, NULL, NULL },
631 #define DEC_ACTION(cs_type,c_type,string) \
632 { "View/Decode/" cs_type, NULL, N_(string), NULL, NULL, c_type }
634 /* {"View/---", NULL, "---", NULL, NULL, NULL }, */
635 {"View/OpenNewWindow", NULL, N_("Open in new _window"), "<control><alt>N", NULL, G_CALLBACK(open_msg_cb) },
636 {"View/MessageSource", NULL, N_("Mess_age source"), "<control>U", NULL, G_CALLBACK(view_source_cb) },
637 /* {"View/---", NULL, "---", NULL, NULL, NULL }, */
638 {"View/Part", NULL, N_("Message part"), NULL, NULL, NULL },
639 {"View/Part/AsText", NULL, N_("View as text"), "T", NULL, G_CALLBACK(view_part_as_text_cb) },
640 {"View/Part/Open", NULL, N_("Open"), "L", NULL, G_CALLBACK(open_part_cb) },
641 #ifndef G_OS_WIN32
642 {"View/Part/OpenWith", NULL, N_("Open with..."), "O", NULL, G_CALLBACK(open_part_with_cb) },
643 #endif
644 /* {"View/---", NULL, "---", NULL, NULL, NULL }, */
646 {"View/Quotes", NULL, N_("Quotes"), NULL, NULL, NULL },
647 /* {"View/---", NULL, "---", NULL, NULL, NULL }, */
648 {"View/UpdateSummary", NULL, N_("_Update summary"), "<control><alt>U", NULL, G_CALLBACK(update_summary_cb) },
650 /* Message menu */
651 {"Message/Receive", NULL, N_("Recei_ve"), NULL, NULL, NULL },
652 {"Message/Receive/CurrentAccount", NULL, N_("Get from _current account"), "<control>I", NULL, G_CALLBACK(mw_inc_mail_cb) },
653 {"Message/Receive/AllAccounts", NULL, N_("Get from _all accounts"), "<shift><control>I", NULL, G_CALLBACK(mw_inc_all_account_mail_cb) },
654 {"Message/Receive/CancelReceiving", NULL, N_("Cancel receivin_g"), NULL, NULL, G_CALLBACK(inc_cancel_cb) },
655 {"Message/Receive/---", NULL, "---", NULL, NULL, NULL },
656 {"Message/Receive/PlaceHolder", NULL, "PlaceHolder,", NULL, NULL, G_CALLBACK(mainwindow_nothing_cb) },
657 {"Message/SendQueue", NULL, N_("_Send queued messages"), NULL, NULL, G_CALLBACK(mw_send_queue_cb) },
658 {"Message/CancelSending", NULL, N_("Cancel sending"), NULL, NULL, G_CALLBACK(send_cancel_cb) },
660 {"Message/---", NULL, "---", NULL, NULL, NULL },
662 {"Message/ComposeEmail", NULL, N_("Compose a_n email message"), "<control>M", NULL, G_CALLBACK(mw_compose_mail_cb) },
663 {"Message/ComposeNews", NULL, N_("Compose a news message"), NULL, NULL, G_CALLBACK(mw_compose_news_cb) },
665 {"Message/Reply", NULL, N_("_Reply"), "<control>R", NULL, G_CALLBACK(main_window_reply_cb) }, /* COMPOSE_REPLY */
666 {"Message/ReplyTo", NULL, N_("Repl_y to"), NULL, NULL, NULL },
667 {"Message/ReplyTo/All", NULL, N_("_All"), "<control><shift>R", NULL, G_CALLBACK(main_window_reply_cb) }, /* COMPOSE_REPLY_TO_ALL */
668 {"Message/ReplyTo/Sender", NULL, N_("_Sender"), NULL, NULL, G_CALLBACK(main_window_reply_cb) }, /* COMPOSE_REPLY_TO_SENDER */
669 {"Message/ReplyTo/List", NULL, N_("Mailing _list"), "<control>L", NULL, G_CALLBACK(main_window_reply_cb) }, /* COMPOSE_REPLY_TO_LIST */
670 {"Message/FollowupReply", NULL, N_("Follow-up and reply to"), NULL, NULL, G_CALLBACK(main_window_reply_cb) }, /* COMPOSE_FOLLOWUP_AND_REPLY_TO */
671 /* {"Message/---", NULL, "---", NULL, NULL, NULL }, */
673 {"Message/Forward", NULL, N_("_Forward"), "<control><alt>F", NULL, G_CALLBACK(main_window_reply_cb) }, /* COMPOSE_FORWARD_INLINE */
674 {"Message/ForwardAtt", NULL, N_("For_ward as attachment"), NULL, NULL, G_CALLBACK(main_window_reply_cb) }, /* COMPOSE_FORWARD_AS_ATTACH */
675 {"Message/Redirect", NULL, N_("Redirec_t"), NULL, NULL, G_CALLBACK(main_window_reply_cb) }, /* COMPOSE_REDIRECT */
677 {"Message/MailingList", NULL, N_("Mailing-_List"), NULL, NULL, NULL },
678 {"Message/MailingList/Post", NULL, N_("Post"), NULL, NULL, NULL },
679 {"Message/MailingList/Post/PlaceHolder", NULL, "Placeholder", NULL, NULL, G_CALLBACK(mainwindow_nothing_cb) },
680 {"Message/MailingList/Help", NULL, N_("Help"), NULL, NULL, NULL },
681 {"Message/MailingList/Help/PlaceHolder", NULL, "Placeholder", NULL, NULL, G_CALLBACK(mainwindow_nothing_cb) },
682 {"Message/MailingList/Subscribe", NULL, N_("Subscribe"), NULL, NULL, NULL },
683 {"Message/MailingList/Subscribe/PlaceHolder", NULL, "Placeholder", NULL, NULL, G_CALLBACK(mainwindow_nothing_cb) },
684 {"Message/MailingList/Unsubscribe", NULL, N_("Unsubscribe"), NULL, NULL, NULL },
685 {"Message/MailingList/Unsubscribe/PlaceHolder", NULL, "Placeholder", NULL, NULL, G_CALLBACK(mainwindow_nothing_cb) },
686 {"Message/MailingList/ViewArchive", NULL, N_("View archive"), NULL, NULL, NULL },
687 {"Message/MailingList/ViewArchive/PlaceHolder", NULL, "Placeholder", NULL, NULL, G_CALLBACK(mainwindow_nothing_cb) },
688 {"Message/MailingList/ContactOwner", NULL, N_("Contact owner"), NULL, NULL, NULL },
689 {"Message/MailingList/ContactOwner/PlaceHolder", NULL, "Placeholder", NULL, NULL, G_CALLBACK(mainwindow_nothing_cb) },
690 /* separation */
692 {"Message/Move", NULL, N_("M_ove..."), "<control>O", NULL, G_CALLBACK(move_to_cb) },
693 {"Message/Copy", NULL, N_("_Copy..."), "<shift><control>O", NULL, G_CALLBACK(copy_to_cb) },
694 {"Message/Trash", NULL, N_("Move to _trash"), "<control>D", NULL, G_CALLBACK(delete_trash_cb) },
695 {"Message/Delete", NULL, N_("_Delete..."), NULL, NULL, G_CALLBACK(delete_cb) },
696 {"Message/TrashThread", NULL, N_("Move thread to tr_ash"), NULL, NULL, G_CALLBACK(trash_thread_cb) },
697 {"Message/DeleteThread", NULL, N_("Delete t_hread"), NULL, NULL, G_CALLBACK(delete_thread_cb) },
698 {"Message/CancelNews", NULL, N_("Cancel a news message"), NULL, NULL, G_CALLBACK(cancel_cb) },
699 /* separation */
700 {"Message/Mark", NULL, NC_("Menu Item", "_Mark"), NULL, NULL, NULL },
701 {"Message/Mark/Mark", NULL, NC_("Sub-Menu Item", "_Mark"), "<shift>asterisk", NULL, G_CALLBACK(mark_cb) },
702 {"Message/Mark/Unmark", NULL, N_("_Unmark"), "U", NULL, G_CALLBACK(unmark_cb) },
703 {"Message/Mark/---", NULL, "---", NULL, NULL, NULL },
705 {"Message/Mark/MarkRead", NULL, N_("Mark as rea_d"), NULL, NULL, G_CALLBACK(mark_as_read_cb) },
706 {"Message/Mark/MarkUnread", NULL, N_("Mark as unr_ead"), "<shift>exclam", NULL, G_CALLBACK(mark_as_unread_cb) },
707 /* separation */
708 {"Message/Mark/MarkAllRead", NULL, N_("Mark all read in folder"), NULL, NULL, G_CALLBACK(mark_all_read_cb) },
709 {"Message/Mark/MarkAllUnread", NULL, N_("Mark all unread in folder"), NULL, NULL, G_CALLBACK(mark_all_unread_cb) },
710 /* separation */
711 {"Message/Mark/IgnoreThread", NULL, N_("Ignore thread"), NULL, NULL, G_CALLBACK(ignore_thread_cb) },
712 {"Message/Mark/UnignoreThread", NULL, N_("Unignore thread"), NULL, NULL, G_CALLBACK(unignore_thread_cb) },
713 {"Message/Mark/WatchThread", NULL, N_("Watch thread"), NULL, NULL, G_CALLBACK(watch_thread_cb) },
714 {"Message/Mark/UnwatchThread", NULL, N_("Unwatch thread"), NULL, NULL, G_CALLBACK(unwatch_thread_cb) },
715 /* separation */
717 {"Message/Mark/MarkSpam", NULL, N_("Mark as _spam"), NULL, NULL, G_CALLBACK(mark_as_spam_cb) },
718 {"Message/Mark/MarkHam", NULL, N_("Mark as _ham"), NULL, NULL, G_CALLBACK(mark_as_ham_cb) },
719 /* separation */
721 {"Message/Mark/Lock", NULL, N_("Lock"), NULL, NULL, G_CALLBACK(lock_msgs_cb) },
722 {"Message/Mark/Unlock", NULL, N_("Unlock"), NULL, NULL, G_CALLBACK(unlock_msgs_cb) },
724 {"Message/ColorLabel", NULL, N_("Color la_bel"), NULL, NULL, NULL },
725 {"Message/Tags", NULL, N_("Ta_gs"), NULL, NULL, NULL },
726 /*{"Message/---", NULL, "---", NULL, NULL, NULL },*/
728 {"Message/Reedit", NULL, N_("Re-_edit"), NULL, NULL, G_CALLBACK(reedit_cb) },
729 /*{"Message/---", NULL, "---", NULL, NULL, NULL },*/
731 {"Message/CheckSignature", NULL, N_("Check signature"), "C", NULL, G_CALLBACK(check_signature_cb) },
733 /* Tools menu */
735 {"Tools/AddressBook", NULL, N_("_Address book"), "<control><shift>A", NULL, G_CALLBACK(addressbook_open_cb) },
736 {"Tools/AddSenderToAB", NULL, N_("Add sender to address boo_k"), NULL, NULL, G_CALLBACK(add_address_cb) },
738 {"Tools/CollectAddresses", NULL, N_("C_ollect addresses"), NULL, NULL, NULL },
739 {"Tools/CollectAddresses/FromFolder", NULL, N_("From current _folder..."), NULL, NULL, G_CALLBACK(addr_harvest_cb) },
740 {"Tools/CollectAddresses/FromSelected", NULL, N_("From selected _messages..."), NULL, NULL, G_CALLBACK(addr_harvest_msg_cb) },
741 {"Tools/---", NULL, "---", NULL, NULL, NULL },
743 {"Tools/FilterFolder", NULL, N_("_Filter all messages in folder"), NULL, NULL, G_CALLBACK(filter_cb) },
744 {"Tools/FilterSelected", NULL, N_("Filter _selected messages"), NULL, NULL, G_CALLBACK(filter_list_cb) },
745 {"Tools/RunProcessing", NULL, N_("Run folder pr_ocessing rules"), NULL, NULL, G_CALLBACK(process_cb) },
747 {"Tools/CreateFilterRule", NULL, N_("_Create filter rule"), NULL, NULL, NULL },
748 {"Tools/CreateFilterRule/Automatically", NULL, N_("_Automatically"), NULL, NULL, G_CALLBACK(create_filter_cb) }, /* FILTER_BY_AUTO */
749 {"Tools/CreateFilterRule/ByFrom", NULL, N_("By _From"), NULL, NULL, G_CALLBACK(create_filter_cb) }, /* FILTER_BY_FROM */
750 {"Tools/CreateFilterRule/ByTo", NULL, N_("By _To"), NULL, NULL, G_CALLBACK(create_filter_cb) }, /* FILTER_BY_TO */
751 {"Tools/CreateFilterRule/BySubject", NULL, N_("By _Subject"), NULL, NULL, G_CALLBACK(create_filter_cb) }, /* FILTER_BY_SUBJECT */
752 {"Tools/CreateFilterRule/BySender", NULL, N_("By S_ender"), NULL, NULL, G_CALLBACK(create_filter_cb) }, /* FILTER_BY_SENDER */
754 {"Tools/CreateProcessingRule", NULL, N_("Create processing rule"), NULL, NULL, NULL },
755 {"Tools/CreateProcessingRule/Automatically", NULL, N_("_Automatically"), NULL, NULL, G_CALLBACK(create_processing_cb) },
756 {"Tools/CreateProcessingRule/ByFrom", NULL, N_("By _From"), NULL, NULL, G_CALLBACK(create_processing_cb) },
757 {"Tools/CreateProcessingRule/ByTo", NULL, N_("By _To"), NULL, NULL, G_CALLBACK(create_processing_cb) },
758 {"Tools/CreateProcessingRule/BySubject", NULL, N_("By _Subject"), NULL, NULL, G_CALLBACK(create_processing_cb) },
759 {"Tools/CreateProcessingRule/BySender", NULL, N_("By S_ender"), NULL, NULL, G_CALLBACK(create_processing_cb) },
760 /* {"Tools/---", NULL, "---", NULL, NULL, NULL }, */
762 {"Tools/ListUrls", NULL, N_("List _URLs..."), "<control><shift>U", NULL, G_CALLBACK(open_urls_cb) },
764 /* {"Tools/---", NULL, "---", NULL, NULL, NULL }, */
765 {"Tools/Actions", NULL, N_("Actio_ns"), NULL, NULL, NULL },
766 {"Tools/Actions/PlaceHolder", NULL, "Placeholder", NULL, NULL, G_CALLBACK(mainwindow_nothing_cb) },
767 /* {"Tools/---", NULL, "---", NULL, NULL, NULL }, */
769 {"Tools/CheckNewMessages", NULL, N_("Ch_eck for new messages in all folders"), NULL, NULL, G_CALLBACK(update_folderview_cb) },
770 {"Tools/DeleteDuplicates", NULL, N_("Delete du_plicated messages"), NULL, NULL, NULL },
771 {"Tools/DeleteDuplicates/SelFolder", NULL, N_("In selected folder"), NULL, NULL, G_CALLBACK(delete_duplicated_cb) },
772 {"Tools/DeleteDuplicates/AllFolders", NULL, N_("In all folders"), NULL, NULL, G_CALLBACK(delete_duplicated_all_cb) },
773 /* {"Tools/---", NULL, "---", NULL, NULL, NULL }, */
775 {"Tools/Execute", NULL, N_("E_xecute"), "X", NULL, G_CALLBACK(execute_summary_cb) },
776 {"Tools/Expunge", NULL, N_("Exp_unge"), "<control>E", NULL, G_CALLBACK(expunge_summary_cb) },
777 #ifdef USE_GNUTLS
778 /* {"Tools/---", NULL, "---", NULL, NULL, NULL }, */
779 {"Tools/TLSCertificates", NULL, N_("TLS cer_tificates"), NULL, NULL, G_CALLBACK(ssl_manager_open_cb) },
780 #endif
781 /* {"Tools/---", NULL, "---", NULL, NULL, NULL }, */
782 {"Tools/FilteringLog", NULL, N_("Filtering Lo_g"), NULL, NULL, G_CALLBACK(filtering_debug_window_show_cb) },
783 {"Tools/NetworkLog", NULL, N_("Network _Log"), "<shift><control>L", NULL, G_CALLBACK(log_window_show_cb) },
784 #ifdef G_OS_WIN32
785 {"Tools/DebugLog", NULL, N_("Debug _Log"), NULL, NULL, G_CALLBACK(debug_log_show_cb) },
786 #endif
787 /* {"Tools/---", NULL, "---", NULL, NULL, NULL }, */
788 {"Tools/ForgetSessionPasswords", NULL, N_("_Forget all session passwords"), NULL, NULL, G_CALLBACK(forget_session_passwords_cb) },
789 #ifndef PASSWORD_CRYPTO_OLD
790 {"Tools/ForgetPrimaryPassphrase", NULL, N_("Forget _primary passphrase"), NULL, NULL, G_CALLBACK(forget_primary_passphrase_cb) },
791 #endif
793 /* Configuration menu */
794 {"Configuration/ChangeAccount", NULL, N_("C_hange current account"), NULL, NULL, NULL },
795 {"Configuration/ChangeAccount/PlaceHolder", NULL, "Placeholder", NULL, NULL, G_CALLBACK(mainwindow_nothing_cb) },
796 {"Configuration/AccountPrefs", NULL, N_("_Preferences for current account..."), NULL, NULL, G_CALLBACK(prefs_account_open_cb) },
797 {"Configuration/CreateAccount", NULL, N_("Create _new account..."), NULL, NULL, G_CALLBACK(new_account_cb) },
798 {"Configuration/EditAccounts", NULL, N_("_Edit accounts..."), NULL, NULL, G_CALLBACK(account_edit_open) },
799 {"Configuration/---", NULL, "---", NULL, NULL, NULL },
801 {"Configuration/Preferences", NULL, N_("P_references..."), NULL, NULL, G_CALLBACK(prefs_open_cb) },
802 {"Configuration/PreProcessing", NULL, N_("Pre-pr_ocessing..."), NULL, NULL, G_CALLBACK(prefs_pre_processing_open_cb) },
803 {"Configuration/PostProcessing", NULL, N_("Post-pro_cessing..."), NULL, NULL, G_CALLBACK(prefs_post_processing_open_cb) },
804 {"Configuration/Filtering", NULL, N_("_Filtering..."), NULL, NULL, G_CALLBACK(prefs_filtering_open_cb) },
805 {"Configuration/Templates", NULL, N_("_Templates..."), NULL, NULL, G_CALLBACK(prefs_template_open_cb) },
806 {"Configuration/Actions", NULL, N_("_Actions..."), NULL, NULL, G_CALLBACK(prefs_actions_open_cb) },
807 {"Configuration/Tags", NULL, N_("Tag_s..."), NULL, NULL, G_CALLBACK(prefs_tags_open_cb) },
808 /* {"Configuration/---", NULL, "---", NULL, NULL, NULL }, */
809 {"Configuration/Plugins", NULL, N_("Plu_gins..."), NULL, NULL, G_CALLBACK(plugins_open_cb) },
811 /* Help menu */
812 {"Help/Manual", NULL, N_("_Manual"), NULL, NULL, G_CALLBACK(manual_open_cb) },
813 {"Help/FAQ", NULL, N_("_Online User-contributed FAQ"), NULL, NULL, G_CALLBACK(manual_faq_open_cb) },
814 {"Help/IconLegend", NULL, N_("Icon _Legend"), NULL, NULL, G_CALLBACK(legend_open_cb) },
815 #ifdef G_OS_WIN32
816 {"Help/SetDefault", NULL, N_("Set as default client"), NULL, NULL, G_CALLBACK(set_default_client_cb) },
817 #endif
818 {"Help/---", NULL, "---", NULL, NULL, NULL },
819 {"Help/About", NULL, N_("_About"), NULL, NULL, G_CALLBACK(about_cb) },
822 static GtkToggleActionEntry mainwin_toggle_entries[] = {
823 {"File/OfflineMode", NULL, N_("Offline _mode"), "<control>W", NULL, G_CALLBACK(toggle_work_offline_cb), FALSE }, /*toggle*/
824 {"View/ShowHide/MenuBar", NULL, N_("Men_ubar"), "<control>F12", NULL, G_CALLBACK(toggle_menubar_cb), FALSE }, /* toggle */
825 {"View/ShowHide/MessageView", NULL, N_("_Message view"), "V", NULL, G_CALLBACK(toggle_message_cb), FALSE }, /* toggle */
826 #ifndef GENERIC_UMPC
827 {"View/ShowHide/StatusBar", NULL, N_("Status _bar"), NULL, NULL, G_CALLBACK(toggle_statusbar_cb), FALSE }, /* toggle */
828 #endif
829 {"View/ShowHide/ColumnHeaders", NULL, N_("Column headers"), NULL, NULL, G_CALLBACK(toggle_col_headers_cb), FALSE }, /* toggle */
830 {"View/ThreadView", NULL, N_("Th_read view"), "<control>T", NULL, G_CALLBACK(thread_cb), FALSE }, /* toggle */
831 {"View/HideReadThreads", NULL, N_("Hide read threads"), NULL, NULL, G_CALLBACK(hide_read_threads), FALSE }, /* toggle */
832 {"View/HideReadMessages", NULL, N_("_Hide read messages"), NULL, NULL, G_CALLBACK(hide_read_messages), FALSE }, /* toggle */
833 {"View/HideDelMessages", NULL, N_("Hide deleted messages"), NULL, NULL, G_CALLBACK(hide_del_messages), FALSE }, /* toggle */
834 {"View/FullScreen", NULL, N_("_Fullscreen"), "F11", NULL, G_CALLBACK(toggle_fullscreen_cb), FALSE }, /* toggle */
835 {"View/AllHeaders", NULL, N_("Show all _headers"), "<control>H", NULL, G_CALLBACK(show_all_header_cb), FALSE }, /* toggle */
836 {"View/Quotes/CollapseAll", NULL, N_("_Collapse all"), "<control><shift>Q", NULL, G_CALLBACK(hide_quotes_cb), FALSE }, /* 1 toggle */
837 {"View/Quotes/Collapse2", NULL, N_("Collapse from level _2"), NULL, NULL, G_CALLBACK(hide_quotes_cb), FALSE }, /* 2 toggle */
838 {"View/Quotes/Collapse3", NULL, N_("Collapse from level _3"), NULL, NULL, G_CALLBACK(hide_quotes_cb), FALSE }, /* 3 toggle */
841 static GtkRadioActionEntry mainwin_showhide_radio_entries[] = { /* toggle_toolbar_cb */
842 {"View/ShowHide/Toolbar/TextBelowIcon", NULL, N_("Text _below icons"), NULL, NULL, TOOLBAR_BOTH }, /* radio TOOLBAR_BOTH */
843 {"View/ShowHide/Toolbar/TextBesideIcon", NULL, N_("Text be_side icons"), NULL, NULL, TOOLBAR_BOTH_HORIZ }, /* radio TOOLBAR_BOTH_HORIZ */
844 {"View/ShowHide/Toolbar/IconOnly", NULL, N_("_Icons only"), NULL, NULL, TOOLBAR_ICON }, /* radio TOOLBAR_ICON */
845 {"View/ShowHide/Toolbar/TextOnly", NULL, N_("_Text only"), NULL, NULL, TOOLBAR_TEXT }, /* radio TOOLBAR_TEXT */
846 #ifndef GENERIC_UMPC
847 {"View/ShowHide/Toolbar/Hide", NULL, N_("_Hide"), NULL, NULL, TOOLBAR_NONE }, /* radio TOOLBAR_NONE */
848 #endif
850 #ifndef GENERIC_UMPC
851 static GtkRadioActionEntry mainwin_layout_radio_entries[] = { /* set_layout_cb */
852 {"View/Layout/Standard", NULL, N_("_Standard"), NULL, NULL, NORMAL_LAYOUT }, /* radio NORMAL_LAYOUT */
853 {"View/Layout/ThreeColumns", NULL, N_("_Three columns"), NULL, NULL, VERTICAL_LAYOUT }, /* radio VERTICAL_LAYOUT */
854 {"View/Layout/WideMessage", NULL, N_("_Wide message"), NULL, NULL, WIDE_LAYOUT }, /* radio WIDE_LAYOUT */
855 {"View/Layout/WideMessageList", NULL, N_("W_ide message list"), NULL, NULL, WIDE_MSGLIST_LAYOUT }, /* radio WIDE_MSGLIST_LAYOUT */
856 {"View/Layout/SmallScreen", NULL, N_("S_mall screen"), NULL, NULL, SMALL_LAYOUT }, /* radio SMALL_LAYOUT */
858 #endif
859 static GtkRadioActionEntry mainwin_sort_radio_entries[] = { /* sort_summary_cb */
860 {"View/Sort/Number", NULL, N_("By _number"), NULL, NULL, SORT_BY_NUMBER }, /* radio SORT_BY_NUMBER */
861 {"View/Sort/Size", NULL, N_("By s_ize"), NULL, NULL, SORT_BY_SIZE }, /* radio SORT_BY_SIZE */
862 {"View/Sort/Date", NULL, N_("By _date"), NULL, NULL, SORT_BY_DATE }, /* radio SORT_BY_DATE */
863 {"View/Sort/ThreadDate", NULL, N_("By thread date"), NULL, NULL, SORT_BY_THREAD_DATE }, /* radio SORT_BY_THREAD_DATE */
864 {"View/Sort/From", NULL, N_("By _From"), NULL, NULL, SORT_BY_FROM }, /* radio SORT_BY_FROM */
865 {"View/Sort/To", NULL, N_("By _To"), NULL, NULL, SORT_BY_TO }, /* radio SORT_BY_TO */
866 {"View/Sort/Subject", NULL, N_("By s_ubject"), NULL, NULL, SORT_BY_SUBJECT }, /* radio SORT_BY_SUBJECT */
867 {"View/Sort/Color", NULL, N_("By _color label"), NULL, NULL, SORT_BY_LABEL }, /* radio SORT_BY_LABEL */
868 {"View/Sort/Tag", NULL, N_("By tag"), NULL, NULL, SORT_BY_TAGS }, /* radio SORT_BY_TAGS */
869 {"View/Sort/Mark", NULL, N_("By _mark"), NULL, NULL, SORT_BY_MARK }, /* radio SORT_BY_MARK */
870 {"View/Sort/Status", NULL, N_("By _status"), NULL, NULL, SORT_BY_STATUS }, /* radio SORT_BY_STATUS */
871 {"View/Sort/Attachment", NULL, N_("By a_ttachment"), NULL, NULL, SORT_BY_MIME }, /* radio SORT_BY_MIME */
872 {"View/Sort/Score", NULL, N_("By score"), NULL, NULL, SORT_BY_SCORE }, /* radio SORT_BY_SCORE */
873 {"View/Sort/Locked", NULL, N_("By locked"), NULL, NULL, SORT_BY_LOCKED }, /* radio SORT_BY_LOCKED */
874 {"View/Sort/DontSort", NULL, N_("D_on't sort"), NULL, NULL, SORT_BY_NONE }, /* radio SORT_BY_NONE */
877 static GtkRadioActionEntry mainwin_sorttype_radio_entries[] = { /* sort_summary_type_cb */
878 {"View/Sort/Ascending", NULL, N_("Ascending"), NULL, NULL, SORT_ASCENDING }, /* radio SORT_ASCENDING */
879 {"View/Sort/Descending", NULL, N_("Descending"), NULL, NULL, SORT_DESCENDING }, /* radio SORT_DESCENDING */
882 static GtkRadioActionEntry mainwin_radio_enc_entries[] =
884 ENC_ACTION(CS_AUTO, C_AUTO, N_("_Automatic")), /* RADIO set_charset_cb */
885 ENC_ACTION(CS_US_ASCII, C_US_ASCII, N_("7bit ASCII (US-ASC_II)")), /* RADIO set_charset_cb */
886 ENC_ACTION(CS_UTF_8, C_UTF_8, N_("Unicode (_UTF-8)")), /* RADIO set_charset_cb */
887 ENC_ACTION("Western/"CS_ISO_8859_1, C_ISO_8859_1, "ISO-8859-_1"), /* RADIO set_charset_cb */
888 ENC_ACTION("Western/"CS_ISO_8859_15, C_ISO_8859_15, "ISO-8859-15"), /* RADIO set_charset_cb */
889 ENC_ACTION("Western/"CS_WINDOWS_1252, C_WINDOWS_1252, "Windows-1252"), /* RADIO set_charset_cb */
890 ENC_ACTION(CS_ISO_8859_2, C_ISO_8859_2, N_("Central European (ISO-8859-_2)")), /* RADIO set_charset_cb */
891 ENC_ACTION("Baltic/"CS_ISO_8859_13, C_ISO_8859_13, "ISO-8859-13"), /* RADIO set_charset_cb */
892 ENC_ACTION("Baltic/"CS_ISO_8859_4, C_ISO_8859_14, "ISO-8859-_4"), /* RADIO set_charset_cb */
893 ENC_ACTION(CS_ISO_8859_7, C_ISO_8859_7, N_("Greek (ISO-8859-_7)")), /* RADIO set_charset_cb */
894 ENC_ACTION("Hebrew/"CS_ISO_8859_8, C_ISO_8859_8, "ISO-8859-_8"), /* RADIO set_charset_cb */
895 ENC_ACTION("Hebrew/"CS_WINDOWS_1255, C_WINDOWS_1255, "Windows-1255"), /* RADIO set_charset_cb */
896 ENC_ACTION("Arabic/"CS_ISO_8859_6, C_ISO_8859_6, "ISO-8859-_6"), /* RADIO set_charset_cb */
897 ENC_ACTION("Arabic/"CS_WINDOWS_1256, C_WINDOWS_1256, "Windows-1256"), /* RADIO set_charset_cb */
898 ENC_ACTION(CS_ISO_8859_9, C_ISO_8859_9, N_("Turkish (ISO-8859-_9)")), /* RADIO set_charset_cb */
899 ENC_ACTION("Cyrillic/"CS_ISO_8859_5, C_ISO_8859_5, "ISO-8859-_5"), /* RADIO set_charset_cb */
900 ENC_ACTION("Cyrillic/"CS_KOI8_R, C_KOI8_R, "KOI8-_R"), /* RADIO set_charset_cb */
901 ENC_ACTION("Cyrillic/"CS_MACCYR, C_MACCYR, "_Mac-Cyrillic"), /* RADIO set_charset_cb */
902 ENC_ACTION("Cyrillic/"CS_KOI8_U, C_KOI8_U, "KOI8-_U"), /* RADIO set_charset_cb */
903 ENC_ACTION("Cyrillic/"CS_WINDOWS_1251, C_WINDOWS_1251, "Windows-1251"), /* RADIO set_charset_cb */
904 ENC_ACTION("Japanese/"CS_ISO_2022_JP, C_ISO_2022_JP, "ISO-2022-_JP"), /* RADIO set_charset_cb */
905 ENC_ACTION("Japanese/"CS_ISO_2022_JP_2, C_ISO_2022_JP_2, "ISO-2022-JP-_2"), /* RADIO set_charset_cb */
906 ENC_ACTION("Japanese/"CS_EUC_JP, C_EUC_JP, "_EUC-JP"), /* RADIO set_charset_cb */
907 ENC_ACTION("Japanese/"CS_SHIFT_JIS, C_SHIFT_JIS, "_Shift-JIS"), /* RADIO set_charset_cb */
908 ENC_ACTION("Chinese/"CS_GB18030, C_GB18030, "_GB18030"), /* RADIO set_charset_cb */
909 ENC_ACTION("Chinese/"CS_GB2312, C_GB2312, "_GB2312"), /* RADIO set_charset_cb */
910 ENC_ACTION("Chinese/"CS_GBK, C_GBK, "GB_K"), /* RADIO set_charset_cb */
911 ENC_ACTION("Chinese/"CS_BIG5, C_BIG5, "_Big5-JP"), /* RADIO set_charset_cb */
912 ENC_ACTION("Chinese/"CS_EUC_TW, C_EUC_TW, "EUC-_TW"), /* RADIO set_charset_cb */
913 ENC_ACTION("Korean/"CS_EUC_KR, C_EUC_KR, "_EUC-KR"), /* RADIO set_charset_cb */
914 ENC_ACTION("Korean/"CS_ISO_2022_KR, C_ISO_2022_KR, "_ISO-2022-KR"), /* RADIO set_charset_cb */
915 ENC_ACTION("Thai/"CS_TIS_620, C_TIS_620, "_TIS-620-KR"), /* RADIO set_charset_cb */
916 ENC_ACTION("Thai/"CS_WINDOWS_874, C_WINDOWS_874, "_Windows-874"), /* RADIO set_charset_cb */
919 static GtkRadioActionEntry mainwin_radio_dec_entries[] =
921 DEC_ACTION("AutoDetect", 0, N_("_Auto detect")), /* set_decode_cb */
922 /* --- */
923 DEC_ACTION("8bit", ENC_8BIT, "_8bit"),
924 DEC_ACTION("QP", ENC_QUOTED_PRINTABLE, "_Quoted printable"),
925 DEC_ACTION("B64", ENC_BASE64, "_Base64"),
926 DEC_ACTION("Uuencode", ENC_X_UUENCODE, "_Uuencode"),
929 static gboolean offline_ask_sync = TRUE;
930 static gboolean is_obscured = FALSE;
932 #define N_COLOR_LABELS colorlabel_get_color_count()
934 static void mainwindow_colorlabel_menu_item_activate_item_cb(GtkMenuItem *menu_item,
935 gpointer data)
937 MainWindow *mainwin;
938 GtkMenuShell *menu;
939 GtkCheckMenuItem **items;
940 gint n;
941 GList *children, *cur;
942 GSList *sel;
944 mainwin = (MainWindow *)data;
945 cm_return_if_fail(mainwin != NULL);
947 sel = summary_get_selection(mainwin->summaryview);
948 if (!sel) return;
950 menu = GTK_MENU_SHELL(mainwin->colorlabel_menu);
951 cm_return_if_fail(menu != NULL);
953 Xalloca(items, (N_COLOR_LABELS + 1) * sizeof(GtkWidget *), return);
955 /* NOTE: don't return prematurely because we set the "dont_toggle"
956 * state for check menu items. This would be bad! */
957 g_object_set_data(G_OBJECT(menu), "dont_toggle",
958 GINT_TO_POINTER(1));
960 /* clear items. get item pointers. */
961 children = gtk_container_get_children(GTK_CONTAINER(menu));
962 for (n = 0, cur = children; cur != NULL && cur->data != NULL; cur = cur->next) {
963 if (GTK_IS_CHECK_MENU_ITEM(cur->data)) {
964 gtk_check_menu_item_set_active
965 (GTK_CHECK_MENU_ITEM(cur->data), FALSE);
966 items[n] = GTK_CHECK_MENU_ITEM(cur->data);
967 n++;
971 g_list_free(children);
973 if (n == (N_COLOR_LABELS + 1)) {
974 /* iterate all messages and set the state of the appropriate
975 * items */
976 for (; sel != NULL; sel = sel->next) {
977 MsgInfo *msginfo;
978 gint clabel;
980 msginfo = (MsgInfo *)sel->data;
981 if (msginfo) {
982 clabel = MSG_GET_COLORLABEL_VALUE(msginfo->flags);
983 if (!gtk_check_menu_item_get_active(items[clabel]))
984 gtk_check_menu_item_set_active
985 (items[clabel], TRUE);
988 } else
989 g_warning("invalid number of color elements (%d)", n);
991 g_slist_free(sel);
992 /* reset "dont_toggle" state */
993 g_object_set_data(G_OBJECT(menu), "dont_toggle",
994 GINT_TO_POINTER(0));
997 static void mainwindow_colorlabel_menu_item_activate_cb(GtkWidget *widget,
998 gpointer data)
1000 guint color = GPOINTER_TO_UINT(data);
1001 MainWindow *mainwin;
1003 mainwin = g_object_get_data(G_OBJECT(widget), "mainwin");
1004 cm_return_if_fail(mainwin != NULL);
1006 /* "dont_toggle" state set? */
1007 if (g_object_get_data(G_OBJECT(mainwin->colorlabel_menu),
1008 "dont_toggle"))
1009 return;
1011 summary_set_colorlabel(mainwin->summaryview, color, NULL);
1014 static void mainwindow_tags_menu_item_activate_item_cb(GtkMenuItem *menu_item,
1015 gpointer data)
1017 MainWindow *mainwin;
1018 GtkMenuShell *menu;
1019 GList *children, *cur;
1020 GSList *sel;
1021 GHashTable *menu_table = g_hash_table_new_full(
1022 g_direct_hash,
1023 g_direct_equal,
1024 NULL, NULL);
1025 GHashTable *menu_allsel_table = g_hash_table_new_full(
1026 g_direct_hash,
1027 g_direct_equal,
1028 NULL, NULL);
1029 gint sel_len;
1030 mainwin = (MainWindow *)data;
1031 cm_return_if_fail(mainwin != NULL);
1033 sel = summary_get_selection(mainwin->summaryview);
1034 if (!sel) return;
1036 menu = GTK_MENU_SHELL(mainwin->tags_menu);
1037 cm_return_if_fail(menu != NULL);
1039 /* NOTE: don't return prematurely because we set the "dont_toggle"
1040 * state for check menu items */
1041 g_object_set_data(G_OBJECT(menu), "dont_toggle",
1042 GINT_TO_POINTER(1));
1044 /* clear items. get item pointers. */
1045 children = gtk_container_get_children(GTK_CONTAINER(menu));
1046 for (cur = children; cur != NULL && cur->data != NULL; cur = cur->next) {
1047 if (GTK_IS_CHECK_MENU_ITEM(cur->data)) {
1048 gint id = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(cur->data),
1049 "tag_id"));
1050 gtk_check_menu_item_set_active
1051 (GTK_CHECK_MENU_ITEM(cur->data), FALSE);
1053 g_hash_table_insert(menu_table, GINT_TO_POINTER(id), GTK_CHECK_MENU_ITEM(cur->data));
1054 g_hash_table_insert(menu_allsel_table, GINT_TO_POINTER(id), GINT_TO_POINTER(0));
1058 g_list_free(children);
1060 /* iterate all messages and set the state of the appropriate
1061 * items */
1062 sel_len = 0;
1063 for (; sel != NULL; sel = sel->next) {
1064 MsgInfo *msginfo;
1065 GSList *tags = NULL;
1066 GtkCheckMenuItem *item;
1067 msginfo = (MsgInfo *)sel->data;
1068 sel_len++;
1069 if (msginfo) {
1070 tags = msginfo->tags;
1071 if (!tags)
1072 continue;
1074 for (; tags; tags = tags->next) {
1075 gint num_checked = GPOINTER_TO_INT(g_hash_table_lookup(menu_allsel_table, tags->data));
1076 item = g_hash_table_lookup(menu_table, GINT_TO_POINTER(tags->data));
1077 if (item && !gtk_check_menu_item_get_active(item)) {
1078 gtk_check_menu_item_set_active
1079 (item, TRUE);
1081 num_checked++;
1082 g_hash_table_replace(menu_allsel_table, tags->data, GINT_TO_POINTER(num_checked));
1087 children = gtk_container_get_children(GTK_CONTAINER(menu));
1088 for (cur = children; cur != NULL && cur->data != NULL; cur = cur->next) {
1089 if (GTK_IS_CHECK_MENU_ITEM(cur->data)) {
1090 gint id = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(cur->data),
1091 "tag_id"));
1092 gint num_checked = GPOINTER_TO_INT(g_hash_table_lookup(menu_allsel_table, GINT_TO_POINTER(id)));
1093 if (num_checked < sel_len && num_checked > 0)
1094 gtk_check_menu_item_set_inconsistent(GTK_CHECK_MENU_ITEM(cur->data), TRUE);
1095 else
1096 gtk_check_menu_item_set_inconsistent(GTK_CHECK_MENU_ITEM(cur->data), FALSE);
1099 g_list_free(children);
1100 g_slist_free(sel);
1101 g_hash_table_destroy(menu_table);
1102 g_hash_table_destroy(menu_allsel_table);
1103 /* reset "dont_toggle" state */
1104 g_object_set_data(G_OBJECT(menu), "dont_toggle",
1105 GINT_TO_POINTER(0));
1108 static void mainwindow_tags_menu_item_activate_cb(GtkWidget *widget,
1109 gpointer data)
1111 gint id = GPOINTER_TO_INT(data);
1112 gboolean set = gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(widget));
1113 MainWindow *mainwin;
1115 mainwin = g_object_get_data(G_OBJECT(widget), "mainwin");
1116 cm_return_if_fail(mainwin != NULL);
1118 /* "dont_toggle" state set? */
1119 if (g_object_get_data(G_OBJECT(mainwin->tags_menu),
1120 "dont_toggle"))
1121 return;
1123 if (!set)
1124 id = -id;
1125 summary_set_tag(mainwin->summaryview, id, NULL);
1128 void mainwin_accel_changed_cb (GtkAccelGroup *accelgroup, guint keyval, GdkModifierType modifier,
1129 GClosure *closure, GtkMenuItem *item)
1131 GList *closures = gtk_widget_list_accel_closures(GTK_WIDGET(item));
1132 GList *cur;
1133 for (cur = closures; cur; cur = cur->next) {
1134 if (closure == cur->data) {
1135 GtkLabel *label = g_object_get_data(G_OBJECT(item), "accel_label");
1136 gchar *new_accel;
1138 if (keyval == GDK_KEY_Delete) {
1139 const gchar *accel_path;
1140 accel_path = gtk_menu_item_get_accel_path(item);
1141 keyval = 0; modifier = 0;
1142 gtk_accel_map_change_entry (accel_path, keyval, modifier, TRUE);
1144 new_accel = gtk_accelerator_get_label(keyval, modifier);
1145 gtk_label_set_text(label, new_accel);
1146 g_free(new_accel);
1149 g_list_free(closures);
1152 static void mainwindow_colorlabel_menu_create(MainWindow *mainwin, gboolean refresh)
1154 GtkWidget *label_menuitem;
1155 GtkWidget *menu;
1156 GtkWidget *item;
1157 gint i;
1158 gchar *accel_path = NULL;
1160 label_menuitem = gtk_ui_manager_get_widget(mainwin->ui_manager, "/Menu/Message/ColorLabel");
1161 g_signal_connect(G_OBJECT(label_menuitem), "activate",
1162 G_CALLBACK(mainwindow_colorlabel_menu_item_activate_item_cb),
1163 mainwin);
1164 gtk_widget_show(label_menuitem);
1166 menu = gtk_menu_new();
1167 gtk_menu_set_accel_group (GTK_MENU (menu),
1168 gtk_ui_manager_get_accel_group(mainwin->ui_manager));
1170 /* create sub items. for the menu item activation callback we pass the
1171 * index of label_colors[] as data parameter. for the None color we
1172 * pass an invalid (high) value. also we attach a data pointer so we
1173 * can always get back the Mainwindow pointer. */
1175 item = gtk_check_menu_item_new_with_label(_("None"));
1176 gtk_menu_shell_append(GTK_MENU_SHELL(menu), item);
1177 g_signal_connect(G_OBJECT(item), "activate",
1178 G_CALLBACK(mainwindow_colorlabel_menu_item_activate_cb),
1179 GUINT_TO_POINTER(0));
1180 g_object_set_data(G_OBJECT(item), "mainwin", mainwin);
1181 gtk_widget_show(item);
1183 accel_path = g_strdup_printf("<ClawsColorLabels>/None");
1184 gtk_menu_item_set_accel_path(GTK_MENU_ITEM(item), accel_path);
1185 g_free(accel_path);
1186 gtk_accel_map_add_entry("<ClawsColorLabels>/None", GDK_KEY_0, GDK_CONTROL_MASK);
1188 /* create pixmap/label menu items */
1189 for (i = 0; i < N_COLOR_LABELS; i++) {
1190 item = colorlabel_create_check_color_menu_item(
1191 i, refresh, MAINWIN_COLORMENU);
1192 gtk_menu_shell_append(GTK_MENU_SHELL(menu), item);
1193 g_signal_connect(G_OBJECT(item), "activate",
1194 G_CALLBACK(mainwindow_colorlabel_menu_item_activate_cb),
1195 GUINT_TO_POINTER(i + 1));
1196 g_object_set_data(G_OBJECT(item), "mainwin",
1197 mainwin);
1198 gtk_widget_show(item);
1199 accel_path = g_strdup_printf("<ClawsColorLabels>/%d", i+1);
1200 gtk_menu_item_set_accel_path(GTK_MENU_ITEM(item), accel_path);
1201 if (i < 9)
1202 gtk_accel_map_add_entry(accel_path, GDK_KEY_1+i, GDK_CONTROL_MASK);
1203 g_free(accel_path);
1204 g_signal_connect (gtk_ui_manager_get_accel_group(mainwin->ui_manager),
1205 "accel-changed", G_CALLBACK (mainwin_accel_changed_cb), item);
1209 gtk_widget_show(menu);
1210 gtk_menu_item_set_submenu(GTK_MENU_ITEM(label_menuitem), menu);
1211 mainwin->colorlabel_menu = menu;
1214 static void mainwindow_tags_menu_item_apply_tags_activate_cb(GtkWidget *widget,
1215 gpointer data)
1217 MainWindow *mainwin;
1219 mainwin = g_object_get_data(G_OBJECT(widget), "mainwin");
1220 cm_return_if_fail(mainwin != NULL);
1222 /* "dont_toggle" state set? */
1223 if (g_object_get_data(G_OBJECT(mainwin->tags_menu),
1224 "dont_toggle"))
1225 return;
1227 tags_window_open(summary_get_selection(mainwin->summaryview));
1230 static gint mainwin_tag_cmp_list(gconstpointer a, gconstpointer b)
1232 gint id_a = GPOINTER_TO_INT(a);
1233 gint id_b = GPOINTER_TO_INT(b);
1234 const gchar *tag_a = tags_get_tag(id_a);
1235 const gchar *tag_b = tags_get_tag(id_b);
1238 if (tag_a == NULL)
1239 return tag_b == NULL ? 0:1;
1241 if (tag_b == NULL)
1242 return 1;
1244 return g_utf8_collate(tag_a, tag_b);
1247 static void mainwindow_tags_menu_create(MainWindow *mainwin, gboolean refresh)
1249 GtkWidget *label_menuitem;
1250 GtkWidget *menu;
1251 GtkWidget *item;
1252 GSList *cur = tags_get_list();
1253 GSList *orig = NULL;
1254 gboolean existing_tags = FALSE;
1255 gchar *accel_path;
1256 cur = orig = g_slist_sort(cur, mainwin_tag_cmp_list);
1258 label_menuitem = gtk_ui_manager_get_widget(mainwin->ui_manager, "/Menu/Message/Tags");
1259 g_signal_connect(G_OBJECT(label_menuitem), "activate",
1260 G_CALLBACK(mainwindow_tags_menu_item_activate_item_cb),
1261 mainwin);
1263 gtk_widget_show(label_menuitem);
1265 menu = gtk_menu_new();
1266 gtk_menu_set_accel_group (GTK_MENU (menu),
1267 gtk_ui_manager_get_accel_group(mainwin->ui_manager));
1269 /* create tags menu items */
1270 for (; cur; cur = cur->next) {
1271 gint id = GPOINTER_TO_INT(cur->data);
1272 const gchar *tag = tags_get_tag(id);
1274 item = gtk_check_menu_item_new_with_label(tag);
1275 gtk_menu_shell_append(GTK_MENU_SHELL(menu), item);
1276 g_signal_connect(G_OBJECT(item), "activate",
1277 G_CALLBACK(mainwindow_tags_menu_item_activate_cb),
1278 GINT_TO_POINTER(id));
1279 g_object_set_data(G_OBJECT(item), "mainwin",
1280 mainwin);
1281 g_object_set_data(G_OBJECT(item), "tag_id",
1282 GINT_TO_POINTER(id));
1283 gtk_widget_show(item);
1284 accel_path = g_strconcat("<ClawsTags>/",tag, NULL);
1285 gtk_menu_item_set_accel_path(GTK_MENU_ITEM(item), accel_path);
1286 g_free(accel_path);
1287 existing_tags = TRUE;
1289 if (existing_tags) {
1290 /* separator */
1291 item = gtk_separator_menu_item_new();
1292 gtk_menu_shell_append(GTK_MENU_SHELL(menu), item);
1293 gtk_widget_show(item);
1296 item = gtk_menu_item_new_with_label(_("Modify tags..."));
1297 gtk_menu_shell_append(GTK_MENU_SHELL(menu), item);
1298 g_signal_connect(G_OBJECT(item), "activate",
1299 G_CALLBACK(mainwindow_tags_menu_item_apply_tags_activate_cb),
1300 NULL);
1301 g_object_set_data(G_OBJECT(item), "mainwin",
1302 mainwin);
1303 gtk_widget_show(item);
1304 accel_path = g_strdup_printf("<ClawsTags>/ModifyTags");
1305 gtk_menu_item_set_accel_path(GTK_MENU_ITEM(item), accel_path);
1306 g_free(accel_path);
1307 gtk_accel_map_add_entry("<ClawsTags>/ModifyTags", GDK_KEY_T, GDK_CONTROL_MASK|GDK_SHIFT_MASK);
1308 g_slist_free(orig);
1309 gtk_widget_show(menu);
1310 gtk_menu_item_set_submenu(GTK_MENU_ITEM(label_menuitem), menu);
1311 mainwin->tags_menu = menu;
1313 #ifndef GENERIC_UMPC
1314 static void warning_btn_pressed(GtkButton *btn, gpointer data)
1316 MainWindow *mainwin = (MainWindow *)data;
1318 log_window_show_error(mainwin->logwin);
1319 gtk_widget_hide(mainwin->warning_btn);
1322 static gboolean warning_visi_notify(GtkWidget *widget,
1323 GdkEventVisibility *event,
1324 MainWindow *mainwindow)
1326 gdk_window_set_cursor(gtk_widget_get_window(mainwindow->warning_btn), hand_cursor);
1327 return FALSE;
1330 static gboolean warning_leave_notify(GtkWidget *widget,
1331 GdkEventCrossing *event,
1332 MainWindow *mainwindow)
1334 gdk_window_set_cursor(gtk_widget_get_window(mainwindow->warning_btn), NULL);
1335 return FALSE;
1338 static gboolean warning_enter_notify(GtkWidget *widget,
1339 GdkEventCrossing *event,
1340 MainWindow *mainwindow)
1342 gdk_window_set_cursor(gtk_widget_get_window(mainwindow->warning_btn), hand_cursor);
1343 return FALSE;
1345 #endif
1346 void mainwindow_show_error(void)
1348 MainWindow *mainwin = mainwindow_get_mainwindow();
1349 gtk_widget_show(mainwin->warning_btn);
1352 void mainwindow_clear_error(MainWindow *mainwin)
1354 gtk_widget_hide(mainwin->warning_btn);
1357 #define BREAK_ON_MODIFIER_KEY() \
1358 if ((event->state & (GDK_MOD1_MASK|GDK_CONTROL_MASK)) != 0) break
1360 static gboolean mainwindow_key_pressed (GtkWidget *widget, GdkEventKey *event,
1361 gpointer data)
1363 MainWindow *mainwin = (MainWindow*) data;
1365 if (!mainwin || !event)
1366 return FALSE;
1368 if (quicksearch_has_focus(mainwin->summaryview->quicksearch))
1370 GtkWidget *entry =
1371 quicksearch_get_entry(mainwin->summaryview->quicksearch);
1372 gboolean handled;
1373 g_signal_emit_by_name(entry, "key-press-event", event, &handled);
1374 if (handled) {
1375 return TRUE;
1379 switch (event->keyval) {
1380 case GDK_KEY_Q: /* Quit */
1381 BREAK_ON_MODIFIER_KEY();
1383 if (gtk_window_is_active(GTK_WINDOW(mainwin->window))) {
1384 app_exit_cb(NULL, mainwin);
1386 return FALSE;
1387 case GDK_KEY_space:
1388 BREAK_ON_MODIFIER_KEY();
1389 if (gtk_window_is_active(GTK_WINDOW(mainwin->window))) {
1390 if (mainwin->folderview != NULL && mainwin->summaryview != NULL
1391 && ((!mainwin->summaryview->displayed
1392 && !mainwin->summaryview->selected)
1393 || (mainwin->summaryview->folder_item
1394 && mainwin->summaryview->folder_item->total_msgs == 0))) {
1395 g_signal_stop_emission_by_name(G_OBJECT(widget),
1396 "key_press_event");
1397 folderview_select_next_with_flag(mainwin->folderview, MSG_UNREAD);
1400 break;
1401 default:
1402 break;
1404 return FALSE;
1407 #undef BREAK_ON_MODIFIER_KEY
1409 MainWindow *main_window_create()
1411 MainWindow *mainwin;
1412 GtkWidget *window;
1413 GtkWidget *vbox;
1414 GtkWidget *menubar;
1415 GtkWidget *handlebox;
1416 GtkWidget *vbox_body;
1417 GtkWidget *menuitem;
1418 #ifndef GENERIC_UMPC
1419 GtkWidget *hbox_stat;
1420 GtkWidget *statusbar;
1421 GtkWidget *progressbar;
1422 GtkWidget *statuslabel;
1423 GtkWidget *ac_button;
1424 GtkWidget *ac_label;
1425 GtkWidget *online_pixmap;
1426 GtkWidget *offline_pixmap;
1427 GtkWidget *warning_btn;
1428 #endif
1429 GtkWidget *online_switch;
1430 GtkWidget *offline_switch;
1431 FolderView *folderview;
1432 SummaryView *summaryview;
1433 MessageView *messageview;
1434 GtkWidget *ac_menu;
1436 static GdkGeometry geometry;
1438 debug_print("Creating main window...\n");
1439 mainwin = g_new0(MainWindow, 1);
1441 /* main window */
1442 window = GTK_WIDGET(gtkut_window_new(GTK_WINDOW_TOPLEVEL, "mainwindow"));
1443 gtk_window_set_title(GTK_WINDOW(window), PROG_VERSION);
1444 gtk_window_set_resizable(GTK_WINDOW(window), TRUE);
1445 #ifdef GENERIC_UMPC
1446 prefs_common.layout_mode = SMALL_LAYOUT;
1447 #endif
1448 if (!geometry.min_height) {
1449 geometry.min_width = 320;
1450 geometry.min_height = 200;
1452 gtk_window_set_geometry_hints(GTK_WINDOW(window), NULL, &geometry,
1453 GDK_HINT_MIN_SIZE);
1455 g_signal_connect(G_OBJECT(window), "delete_event",
1456 G_CALLBACK(main_window_close_cb), mainwin);
1457 MANAGE_WINDOW_SIGNALS_CONNECT(window);
1458 g_signal_connect(G_OBJECT(window), "focus_in_event",
1459 G_CALLBACK(mainwindow_focus_in_event),
1460 mainwin);
1461 g_signal_connect(G_OBJECT(window), "key_press_event",
1462 G_CALLBACK(mainwindow_key_pressed), mainwin);
1464 gtk_widget_realize(window);
1465 gtk_widget_add_events(window, GDK_KEY_PRESS_MASK|GDK_KEY_RELEASE_MASK);
1468 gtkut_widget_set_app_icon(window);
1470 vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
1471 gtk_widget_show(vbox);
1472 gtk_container_add(GTK_CONTAINER(window), vbox);
1474 /* menu bar */
1476 mainwin->ui_manager = gtk_ui_manager_new();
1477 mainwin->action_group = cm_menu_create_action_group_full(mainwin->ui_manager,"Menu", mainwin_entries,
1478 G_N_ELEMENTS(mainwin_entries), (gpointer)mainwin);
1479 gtk_action_group_add_toggle_actions(mainwin->action_group, mainwin_toggle_entries,
1480 G_N_ELEMENTS(mainwin_toggle_entries), (gpointer)mainwin);
1481 gtk_action_group_add_radio_actions(mainwin->action_group, mainwin_showhide_radio_entries,
1482 G_N_ELEMENTS(mainwin_showhide_radio_entries), C_AUTO, G_CALLBACK(toggle_toolbar_cb), (gpointer)mainwin);
1483 #ifndef GENERIC_UMPC
1484 gtk_action_group_add_radio_actions(mainwin->action_group, mainwin_layout_radio_entries,
1485 G_N_ELEMENTS(mainwin_layout_radio_entries), C_AUTO, G_CALLBACK(set_layout_cb), (gpointer)mainwin);
1486 #endif
1487 gtk_action_group_add_radio_actions(mainwin->action_group, mainwin_sort_radio_entries,
1488 G_N_ELEMENTS(mainwin_sort_radio_entries), C_AUTO, G_CALLBACK(sort_summary_cb), (gpointer)mainwin);
1489 gtk_action_group_add_radio_actions(mainwin->action_group, mainwin_sorttype_radio_entries,
1490 G_N_ELEMENTS(mainwin_sorttype_radio_entries), C_AUTO, G_CALLBACK(sort_summary_type_cb), (gpointer)mainwin);
1491 gtk_action_group_add_radio_actions(mainwin->action_group, mainwin_radio_enc_entries,
1492 G_N_ELEMENTS(mainwin_radio_enc_entries), C_AUTO, G_CALLBACK(set_charset_cb), (gpointer)mainwin);
1493 gtk_action_group_add_radio_actions(mainwin->action_group, mainwin_radio_dec_entries,
1494 G_N_ELEMENTS(mainwin_radio_dec_entries), C_AUTO, G_CALLBACK(set_decode_cb), (gpointer)mainwin);
1496 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/", "Menu", NULL, GTK_UI_MANAGER_MENUBAR)
1497 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu", "File", "File", GTK_UI_MANAGER_MENU)
1498 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu", "Edit", "Edit", GTK_UI_MANAGER_MENU)
1499 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu", "View", "View", GTK_UI_MANAGER_MENU)
1500 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu", "Message", "Message", GTK_UI_MANAGER_MENU)
1501 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu", "Tools", "Tools", GTK_UI_MANAGER_MENU)
1502 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu", "Configuration", "Configuration", GTK_UI_MANAGER_MENU)
1503 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu", "Help", "Help", GTK_UI_MANAGER_MENU)
1505 /* File menu */
1506 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/File", "AddMailbox", "File/AddMailbox", GTK_UI_MANAGER_MENU)
1507 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/File/AddMailbox", "MH", "File/AddMailbox/MH", GTK_UI_MANAGER_MENUITEM)
1508 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/File", "Separator1", "File/---", GTK_UI_MANAGER_SEPARATOR)
1509 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/File", "SortMailboxes", "File/SortMailboxes", GTK_UI_MANAGER_MENUITEM)
1510 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/File", "Separator2", "File/---", GTK_UI_MANAGER_SEPARATOR)
1511 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/File", "ImportMbox", "File/ImportMbox", GTK_UI_MANAGER_MENUITEM)
1512 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/File", "ExportMbox", "File/ExportMbox", GTK_UI_MANAGER_MENUITEM)
1513 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/File", "ExportSelMbox", "File/ExportSelMbox", GTK_UI_MANAGER_MENUITEM)
1514 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/File", "Separator3", "File/---", GTK_UI_MANAGER_SEPARATOR)
1515 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/File", "EmptyTrashes", "File/EmptyTrashes", GTK_UI_MANAGER_MENUITEM)
1516 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/File", "Separator4", "File/---", GTK_UI_MANAGER_SEPARATOR)
1517 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/File", "SaveAs", "File/SaveAs", GTK_UI_MANAGER_MENUITEM)
1518 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/File", "SavePartAs", "File/SavePartAs", GTK_UI_MANAGER_MENUITEM)
1519 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/File", "Separator5", "File/---", GTK_UI_MANAGER_SEPARATOR)
1520 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/File", "PageSetup", "File/PageSetup", GTK_UI_MANAGER_MENUITEM)
1521 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/File", "Print", "File/Print", GTK_UI_MANAGER_MENUITEM)
1522 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/File", "Separator6", "File/---", GTK_UI_MANAGER_SEPARATOR)
1523 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/File", "OfflineMode", "File/OfflineMode", GTK_UI_MANAGER_MENUITEM)
1524 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/File", "SynchroniseFolders", "File/SynchroniseFolders", GTK_UI_MANAGER_MENUITEM)
1525 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/File", "Separator7", "File/---", GTK_UI_MANAGER_SEPARATOR)
1526 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/File", "Exit", "File/Exit", GTK_UI_MANAGER_MENUITEM)
1528 /* Edit menu */
1529 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Edit", "Copy", "Edit/Copy", GTK_UI_MANAGER_MENUITEM)
1530 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Edit", "SelectAll", "Edit/SelectAll", GTK_UI_MANAGER_MENUITEM)
1531 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Edit", "SelectThread", "Edit/SelectThread", GTK_UI_MANAGER_MENUITEM)
1532 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Edit", "Separator1", "Edit/---", GTK_UI_MANAGER_SEPARATOR)
1533 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Edit", "Find", "Edit/Find", GTK_UI_MANAGER_MENUITEM)
1534 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Edit", "SearchFolder", "Edit/SearchFolder", GTK_UI_MANAGER_MENUITEM)
1535 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Edit", "QuickSearch", "Edit/QuickSearch", GTK_UI_MANAGER_MENUITEM)
1537 /* View menu */
1538 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View", "ShowHide", "View/ShowHide", GTK_UI_MANAGER_MENU)
1539 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/ShowHide", "MenuBar", "View/ShowHide/MenuBar", GTK_UI_MANAGER_MENUITEM)
1540 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/ShowHide", "Toolbar", "View/ShowHide/Toolbar", GTK_UI_MANAGER_MENU)
1541 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/ShowHide/Toolbar", "TextBelowIcon", "View/ShowHide/Toolbar/TextBelowIcon", GTK_UI_MANAGER_MENUITEM)
1542 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/ShowHide/Toolbar", "TextBesideIcon", "View/ShowHide/Toolbar/TextBesideIcon", GTK_UI_MANAGER_MENUITEM)
1543 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/ShowHide/Toolbar", "IconOnly", "View/ShowHide/Toolbar/IconOnly", GTK_UI_MANAGER_MENUITEM)
1544 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/ShowHide/Toolbar", "TextOnly", "View/ShowHide/Toolbar/TextOnly", GTK_UI_MANAGER_MENUITEM)
1545 #ifndef GENERIC_UMPC
1546 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/ShowHide/Toolbar", "Hide", "View/ShowHide/Toolbar/Hide", GTK_UI_MANAGER_MENUITEM)
1547 #endif
1548 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/ShowHide", "MessageView", "View/ShowHide/MessageView", GTK_UI_MANAGER_MENUITEM)
1549 #ifndef GENERIC_UMPC
1550 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/ShowHide", "StatusBar", "View/ShowHide/StatusBar", GTK_UI_MANAGER_MENUITEM)
1551 #endif
1552 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/ShowHide", "ColumnHeaders", "View/ShowHide/ColumnHeaders", GTK_UI_MANAGER_MENUITEM)
1553 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View", "SetColumns", "View/SetColumns", GTK_UI_MANAGER_MENU)
1554 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/SetColumns", "Folderlist", "View/SetColumns/Folderlist", GTK_UI_MANAGER_MENUITEM)
1555 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/SetColumns", "Messagelist", "View/SetColumns/Messagelist", GTK_UI_MANAGER_MENUITEM)
1556 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View", "Separator1", "View/---", GTK_UI_MANAGER_SEPARATOR)
1558 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View", "FullScreen", "View/FullScreen", GTK_UI_MANAGER_MENUITEM)
1559 #ifndef GENERIC_UMPC
1560 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View", "Layout", "View/Layout", GTK_UI_MANAGER_MENU)
1561 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Layout", "Standard", "View/Layout/Standard", GTK_UI_MANAGER_MENUITEM)
1562 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Layout", "ThreeColumns", "View/Layout/ThreeColumns", GTK_UI_MANAGER_MENUITEM)
1563 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Layout", "WideMessage", "View/Layout/WideMessage", GTK_UI_MANAGER_MENUITEM)
1564 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Layout", "WideMessageList", "View/Layout/WideMessageList", GTK_UI_MANAGER_MENUITEM)
1565 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Layout", "SmallScreen", "View/Layout/SmallScreen", GTK_UI_MANAGER_MENUITEM)
1566 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View", "Separator2", "View/---", GTK_UI_MANAGER_SEPARATOR)
1567 #endif
1569 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View", "Sort", "View/Sort", GTK_UI_MANAGER_MENU)
1570 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Sort", "Number", "View/Sort/Number", GTK_UI_MANAGER_MENUITEM)
1571 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Sort", "Size", "View/Sort/Size", GTK_UI_MANAGER_MENUITEM)
1572 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Sort", "Date", "View/Sort/Date", GTK_UI_MANAGER_MENUITEM)
1573 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Sort", "ThreadDate", "View/Sort/ThreadDate", GTK_UI_MANAGER_MENUITEM)
1574 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Sort", "From", "View/Sort/From", GTK_UI_MANAGER_MENUITEM)
1575 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Sort", "To", "View/Sort/To", GTK_UI_MANAGER_MENUITEM)
1576 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Sort", "Subject", "View/Sort/Subject", GTK_UI_MANAGER_MENUITEM)
1577 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Sort", "Color", "View/Sort/Color", GTK_UI_MANAGER_MENUITEM)
1578 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Sort", "Tag", "View/Sort/Tag", GTK_UI_MANAGER_MENUITEM)
1579 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Sort", "Mark", "View/Sort/Mark", GTK_UI_MANAGER_MENUITEM)
1580 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Sort", "Status", "View/Sort/Status", GTK_UI_MANAGER_MENUITEM)
1581 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Sort", "Attachment", "View/Sort/Attachment", GTK_UI_MANAGER_MENUITEM)
1582 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Sort", "Score", "View/Sort/Score", GTK_UI_MANAGER_MENUITEM)
1583 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Sort", "Locked", "View/Sort/Locked", GTK_UI_MANAGER_MENUITEM)
1584 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Sort", "DontSort", "View/Sort/DontSort", GTK_UI_MANAGER_MENUITEM)
1585 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Sort", "Separator1", "View/Sort/---", GTK_UI_MANAGER_SEPARATOR)
1586 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Sort", "Ascending", "View/Sort/Ascending", GTK_UI_MANAGER_MENUITEM)
1587 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Sort", "Descending", "View/Sort/Descending", GTK_UI_MANAGER_MENUITEM)
1588 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Sort", "Separator2", "View/Sort/---", GTK_UI_MANAGER_SEPARATOR)
1589 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Sort", "AttractSubj", "View/Sort/AttractSubj", GTK_UI_MANAGER_MENUITEM)
1591 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View", "ThreadView", "View/ThreadView", GTK_UI_MANAGER_MENUITEM)
1592 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View", "ExpandThreads", "View/ExpandThreads", GTK_UI_MANAGER_MENUITEM)
1593 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View", "CollapseThreads", "View/CollapseThreads", GTK_UI_MANAGER_MENUITEM)
1594 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View", "HideReadThreads", "View/HideReadThreads", GTK_UI_MANAGER_MENUITEM)
1595 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View", "HideReadMessages", "View/HideReadMessages", GTK_UI_MANAGER_MENUITEM)
1596 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View", "HideDelMessages", "View/HideDelMessages", GTK_UI_MANAGER_MENUITEM)
1597 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View", "Separator3", "View/---", GTK_UI_MANAGER_SEPARATOR)
1599 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View", "Goto", "View/Goto", GTK_UI_MANAGER_MENU)
1600 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Goto", "Prev", "View/Goto/Prev", GTK_UI_MANAGER_MENUITEM)
1601 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Goto", "Next", "View/Goto/Next", GTK_UI_MANAGER_MENUITEM)
1602 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Goto", "Separator1", "View/Goto/---", GTK_UI_MANAGER_SEPARATOR)
1603 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Goto", "PrevUnread", "View/Goto/PrevUnread", GTK_UI_MANAGER_MENUITEM)
1604 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Goto", "NextUnread", "View/Goto/NextUnread", GTK_UI_MANAGER_MENUITEM)
1605 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Goto", "Separator2", "View/Goto/---", GTK_UI_MANAGER_SEPARATOR)
1606 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Goto", "PrevNew", "View/Goto/PrevNew", GTK_UI_MANAGER_MENUITEM)
1607 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Goto", "NextNew", "View/Goto/NextNew", GTK_UI_MANAGER_MENUITEM)
1608 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Goto", "Separator3", "View/Goto/---", GTK_UI_MANAGER_SEPARATOR)
1609 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Goto", "PrevMarked", "View/Goto/PrevMarked", GTK_UI_MANAGER_MENUITEM)
1610 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Goto", "NextMarked", "View/Goto/NextMarked", GTK_UI_MANAGER_MENUITEM)
1611 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Goto", "Separator4", "View/Goto/---", GTK_UI_MANAGER_SEPARATOR)
1612 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Goto", "PrevLabeled", "View/Goto/PrevLabeled", GTK_UI_MANAGER_MENUITEM)
1613 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Goto", "NextLabeled", "View/Goto/NextLabeled", GTK_UI_MANAGER_MENUITEM)
1614 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Goto", "Separator5", "View/Goto/---", GTK_UI_MANAGER_SEPARATOR)
1615 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Goto", "PrevHistory", "View/Goto/PrevHistory", GTK_UI_MANAGER_MENUITEM)
1616 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Goto", "NextHistory", "View/Goto/NextHistory", GTK_UI_MANAGER_MENUITEM)
1617 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Goto", "Separator6", "View/Goto/---", GTK_UI_MANAGER_SEPARATOR)
1618 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Goto", "ParentMessage", "View/Goto/ParentMessage", GTK_UI_MANAGER_MENUITEM)
1619 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Goto", "Separator7", "View/Goto/---", GTK_UI_MANAGER_SEPARATOR)
1620 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Goto", "NextUnreadFolder", "View/Goto/NextUnreadFolder", GTK_UI_MANAGER_MENUITEM)
1621 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Goto", "Folder", "View/Goto/Folder", GTK_UI_MANAGER_MENUITEM)
1622 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Goto", "Separator8", "View/Goto/---", GTK_UI_MANAGER_SEPARATOR)
1623 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Goto", "NextPart", "View/Goto/NextPart", GTK_UI_MANAGER_MENUITEM)
1624 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Goto", "PrevPart", "View/Goto/PrevPart", GTK_UI_MANAGER_MENUITEM)
1625 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View", "Scroll", "View/Scroll", GTK_UI_MANAGER_MENU)
1626 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Scroll", "PrevLine", "View/Scroll/PrevLine", GTK_UI_MANAGER_MENUITEM)
1627 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Scroll", "NextLine", "View/Scroll/NextLine", GTK_UI_MANAGER_MENUITEM)
1628 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Scroll", "PrevPage", "View/Scroll/PrevPage", GTK_UI_MANAGER_MENUITEM)
1629 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Scroll", "NextPage", "View/Scroll/NextPage", GTK_UI_MANAGER_MENUITEM)
1630 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View", "Separator4", "View/---", GTK_UI_MANAGER_SEPARATOR)
1632 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View", "Encoding", "View/Encoding", GTK_UI_MANAGER_MENU)
1633 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding", CS_AUTO, "View/Encoding/"CS_AUTO, GTK_UI_MANAGER_MENUITEM)
1634 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding", "Separator1", "View/Encoding/---", GTK_UI_MANAGER_SEPARATOR)
1635 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding", CS_US_ASCII, "View/Encoding/"CS_US_ASCII, GTK_UI_MANAGER_MENUITEM)
1636 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding", CS_UTF_8, "View/Encoding/"CS_UTF_8, GTK_UI_MANAGER_MENUITEM)
1637 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding", "Separator2", "View/Encoding/---", GTK_UI_MANAGER_SEPARATOR)
1639 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding", "Western", "View/Encoding/Western", GTK_UI_MANAGER_MENU)
1640 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)
1641 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)
1642 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding/Western", CS_WINDOWS_1252, "View/Encoding/Western/"CS_WINDOWS_1252, GTK_UI_MANAGER_MENUITEM)
1644 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding", CS_ISO_8859_2, "View/Encoding/"CS_ISO_8859_2, GTK_UI_MANAGER_MENUITEM)
1646 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding", "Baltic", "View/Encoding/Baltic", GTK_UI_MANAGER_MENU)
1647 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)
1648 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)
1650 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding", CS_ISO_8859_7, "View/Encoding/"CS_ISO_8859_7, GTK_UI_MANAGER_MENUITEM)
1652 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding", "Hebrew", "View/Encoding/Hebrew", GTK_UI_MANAGER_MENU)
1653 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)
1654 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding/Hebrew", CS_WINDOWS_1255, "View/Encoding/Hebrew/"CS_WINDOWS_1255, GTK_UI_MANAGER_MENUITEM)
1656 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding", "Arabic", "View/Encoding/Arabic", GTK_UI_MANAGER_MENU)
1657 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)
1658 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding/Arabic", CS_WINDOWS_1256, "View/Encoding/Arabic/"CS_WINDOWS_1256, GTK_UI_MANAGER_MENUITEM)
1660 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding", CS_ISO_8859_9, "View/Encoding/"CS_ISO_8859_9, GTK_UI_MANAGER_MENUITEM)
1662 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding", "Cyrillic", "View/Encoding/Cyrillic", GTK_UI_MANAGER_MENU)
1663 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)
1664 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding/Cyrillic", CS_KOI8_R, "View/Encoding/Cyrillic/"CS_KOI8_R, GTK_UI_MANAGER_MENUITEM)
1665 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding/Cyrillic", CS_MACCYR, "View/Encoding/Cyrillic/"CS_MACCYR, GTK_UI_MANAGER_MENUITEM)
1666 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding/Cyrillic", CS_KOI8_U, "View/Encoding/Cyrillic/"CS_KOI8_U, GTK_UI_MANAGER_MENUITEM)
1667 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding/Cyrillic", CS_WINDOWS_1251, "View/Encoding/Cyrillic/"CS_WINDOWS_1251, GTK_UI_MANAGER_MENUITEM)
1669 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding", "Japanese", "View/Encoding/Japanese", GTK_UI_MANAGER_MENU)
1670 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)
1671 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)
1672 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding/Japanese", CS_EUC_JP, "View/Encoding/Japanese/"CS_EUC_JP, GTK_UI_MANAGER_MENUITEM)
1673 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding/Japanese", CS_SHIFT_JIS, "View/Encoding/Japanese/"CS_SHIFT_JIS, GTK_UI_MANAGER_MENUITEM)
1675 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding", "Chinese", "View/Encoding/Chinese", GTK_UI_MANAGER_MENU)
1676 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding/Chinese", CS_GB18030, "View/Encoding/Chinese/"CS_GB18030, GTK_UI_MANAGER_MENUITEM)
1677 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding/Chinese", CS_GB2312, "View/Encoding/Chinese/"CS_GB2312, GTK_UI_MANAGER_MENUITEM)
1678 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding/Chinese", CS_GBK, "View/Encoding/Chinese/"CS_GBK, GTK_UI_MANAGER_MENUITEM)
1679 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding/Chinese", CS_BIG5, "View/Encoding/Chinese/"CS_BIG5, GTK_UI_MANAGER_MENUITEM)
1680 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding/Chinese", CS_EUC_TW, "View/Encoding/Chinese/"CS_EUC_TW, GTK_UI_MANAGER_MENUITEM)
1682 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding", "Korean", "View/Encoding/Korean", GTK_UI_MANAGER_MENU)
1683 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding/Korean", CS_EUC_KR, "View/Encoding/Korean/"CS_EUC_KR, GTK_UI_MANAGER_MENUITEM)
1684 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)
1686 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding", "Thai", "View/Encoding/Thai", GTK_UI_MANAGER_MENU)
1687 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding/Thai", CS_TIS_620, "View/Encoding/Thai/"CS_TIS_620, GTK_UI_MANAGER_MENUITEM)
1688 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Encoding/Thai", CS_WINDOWS_874, "View/Encoding/Thai/"CS_WINDOWS_874, GTK_UI_MANAGER_MENUITEM)
1690 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View", "Decode", "View/Decode", GTK_UI_MANAGER_MENU)
1691 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Decode", "AutoDetect", "View/Decode/AutoDetect", GTK_UI_MANAGER_MENUITEM)
1692 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Decode", "Separator1", "View/Decode/---", GTK_UI_MANAGER_SEPARATOR)
1693 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Decode", "8bit", "View/Decode/8bit", GTK_UI_MANAGER_MENUITEM)
1694 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Decode", "QP", "View/Decode/QP", GTK_UI_MANAGER_MENUITEM)
1695 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Decode", "B64", "View/Decode/B64", GTK_UI_MANAGER_MENUITEM)
1696 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Decode", "Uuencode", "View/Decode/Uuencode", GTK_UI_MANAGER_MENUITEM)
1697 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View", "Separator5", "View/---", GTK_UI_MANAGER_SEPARATOR)
1699 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View", "OpenNewWindow", "View/OpenNewWindow", GTK_UI_MANAGER_MENUITEM)
1700 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View", "MessageSource", "View/MessageSource", GTK_UI_MANAGER_MENUITEM)
1701 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View", "AllHeaders", "View/AllHeaders", GTK_UI_MANAGER_MENUITEM)
1702 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View", "Quotes", "View/Quotes", GTK_UI_MANAGER_MENU)
1703 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Quotes", "CollapseAll", "View/Quotes/CollapseAll", GTK_UI_MANAGER_MENUITEM)
1704 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Quotes", "Collapse2", "View/Quotes/Collapse2", GTK_UI_MANAGER_MENUITEM)
1705 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Quotes", "Collapse3", "View/Quotes/Collapse3", GTK_UI_MANAGER_MENUITEM)
1706 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View", "Part", "View/Part", GTK_UI_MANAGER_MENU)
1707 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Part", "AsText", "View/Part/AsText", GTK_UI_MANAGER_MENUITEM)
1708 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Part", "Open", "View/Part/Open", GTK_UI_MANAGER_MENUITEM)
1709 #ifndef G_OS_WIN32
1710 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View/Part", "OpenWith", "View/Part/OpenWith", GTK_UI_MANAGER_MENUITEM)
1711 #endif
1712 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View", "Separator8", "View/---", GTK_UI_MANAGER_SEPARATOR)
1713 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View", "UpdateSummary", "View/UpdateSummary", GTK_UI_MANAGER_MENUITEM)
1715 /* Message menu */
1716 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message", "Receive", "Message/Receive", GTK_UI_MANAGER_MENU)
1717 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/Receive", "CurrentAccount", "Message/Receive/CurrentAccount", GTK_UI_MANAGER_MENUITEM)
1718 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/Receive", "AllAccounts", "Message/Receive/AllAccounts", GTK_UI_MANAGER_MENUITEM)
1719 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/Receive", "CancelReceiving", "Message/Receive/CancelReceiving", GTK_UI_MANAGER_MENUITEM)
1720 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/Receive", "Separator1", "Message/Receive/---", GTK_UI_MANAGER_SEPARATOR)
1721 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/Receive", "PlaceHolder", "Message/Receive/PlaceHolder", GTK_UI_MANAGER_MENUITEM)
1722 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message", "SendQueue", "Message/SendQueue", GTK_UI_MANAGER_MENUITEM)
1723 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message", "CancelSending", "Message/CancelSending", GTK_UI_MANAGER_MENUITEM)
1724 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message", "Separator1", "Message/---", GTK_UI_MANAGER_SEPARATOR)
1726 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message", "ComposeEmail", "Message/ComposeEmail", GTK_UI_MANAGER_MENUITEM)
1727 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message", "ComposeNews", "Message/ComposeNews", GTK_UI_MANAGER_MENUITEM)
1728 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message", "Reply", "Message/Reply", GTK_UI_MANAGER_MENUITEM)
1729 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message", "ReplyTo", "Message/ReplyTo", GTK_UI_MANAGER_MENU)
1730 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/ReplyTo", "All", "Message/ReplyTo/All", GTK_UI_MANAGER_MENUITEM)
1731 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/ReplyTo", "Sender", "Message/ReplyTo/Sender", GTK_UI_MANAGER_MENUITEM)
1732 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/ReplyTo", "List", "Message/ReplyTo/List", GTK_UI_MANAGER_MENUITEM)
1733 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message", "FollowupReply", "Message/FollowupReply", GTK_UI_MANAGER_MENUITEM)
1734 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message", "Separator2", "Message/---", GTK_UI_MANAGER_SEPARATOR)
1736 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message", "Forward", "Message/Forward", GTK_UI_MANAGER_MENUITEM)
1737 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message", "ForwardAtt", "Message/ForwardAtt", GTK_UI_MANAGER_MENUITEM)
1738 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message", "Redirect", "Message/Redirect", GTK_UI_MANAGER_MENUITEM)
1739 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message", "MailingList", "Message/MailingList", GTK_UI_MANAGER_MENU)
1740 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/MailingList", "Post", "Message/MailingList/Post", GTK_UI_MANAGER_MENU)
1741 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/MailingList", "Help", "Message/MailingList/Help", GTK_UI_MANAGER_MENU)
1742 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/MailingList", "Subscribe", "Message/MailingList/Subscribe", GTK_UI_MANAGER_MENU)
1743 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/MailingList", "Unsubscribe", "Message/MailingList/Unsubscribe", GTK_UI_MANAGER_MENU)
1744 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/MailingList", "ViewArchive", "Message/MailingList/ViewArchive", GTK_UI_MANAGER_MENU)
1745 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/MailingList", "ContactOwner", "Message/MailingList/ContactOwner", GTK_UI_MANAGER_MENU)
1746 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/MailingList/Post", "PlaceHolder", "Message/MailingList/Post/PlaceHolder", GTK_UI_MANAGER_MENUITEM)
1747 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/MailingList/Help", "PlaceHolder", "Message/MailingList/Help/PlaceHolder", GTK_UI_MANAGER_MENUITEM)
1748 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/MailingList/Subscribe", "PlaceHolder", "Message/MailingList/Subscribe/PlaceHolder", GTK_UI_MANAGER_MENUITEM)
1749 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/MailingList/Unsubscribe", "PlaceHolder", "Message/MailingList/Unsubscribe/PlaceHolder", GTK_UI_MANAGER_MENUITEM)
1750 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/MailingList/ViewArchive", "PlaceHolder", "Message/MailingList/ViewArchive/PlaceHolder", GTK_UI_MANAGER_MENUITEM)
1751 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/MailingList/ContactOwner", "PlaceHolder", "Message/MailingList/ContactOwner/PlaceHolder", GTK_UI_MANAGER_MENUITEM)
1752 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message", "Separator3", "Message/---", GTK_UI_MANAGER_SEPARATOR)
1754 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message", "Move", "Message/Move", GTK_UI_MANAGER_MENUITEM)
1755 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message", "Copy", "Message/Copy", GTK_UI_MANAGER_MENUITEM)
1756 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message", "Trash", "Message/Trash", GTK_UI_MANAGER_MENUITEM)
1757 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message", "Delete", "Message/Delete", GTK_UI_MANAGER_MENUITEM)
1758 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message", "TrashThread", "Message/TrashThread", GTK_UI_MANAGER_MENUITEM)
1759 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message", "DeleteThread", "Message/DeleteThread", GTK_UI_MANAGER_MENUITEM)
1760 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message", "CancelNews", "Message/CancelNews", GTK_UI_MANAGER_MENUITEM)
1761 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message", "Separator4", "Message/---", GTK_UI_MANAGER_SEPARATOR)
1763 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message", "Mark", "Message/Mark", GTK_UI_MANAGER_MENU)
1764 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/Mark", "Mark", "Message/Mark/Mark", GTK_UI_MANAGER_MENUITEM)
1765 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/Mark", "Unmark", "Message/Mark/Unmark", GTK_UI_MANAGER_MENUITEM)
1766 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/Mark", "Separator1", "Message/Mark/---", GTK_UI_MANAGER_SEPARATOR)
1767 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/Mark", "MarkRead", "Message/Mark/MarkRead", GTK_UI_MANAGER_MENUITEM)
1768 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/Mark", "MarkUnread", "Message/Mark/MarkUnread", GTK_UI_MANAGER_MENUITEM)
1769 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/Mark", "Separator2", "Message/Mark/---", GTK_UI_MANAGER_SEPARATOR)
1770 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/Mark", "MarkAllRead", "Message/Mark/MarkAllRead", GTK_UI_MANAGER_MENUITEM)
1771 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/Mark", "MarkAllUnread", "Message/Mark/MarkAllUnread", GTK_UI_MANAGER_MENUITEM)
1772 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/Mark", "Separator3", "Message/Mark/---", GTK_UI_MANAGER_SEPARATOR)
1773 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/Mark", "IgnoreThread", "Message/Mark/IgnoreThread", GTK_UI_MANAGER_MENUITEM)
1774 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/Mark", "UnignoreThread", "Message/Mark/UnignoreThread", GTK_UI_MANAGER_MENUITEM)
1775 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/Mark", "WatchThread", "Message/Mark/WatchThread", GTK_UI_MANAGER_MENUITEM)
1776 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/Mark", "UnwatchThread", "Message/Mark/UnwatchThread", GTK_UI_MANAGER_MENUITEM)
1777 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/Mark", "Separator4", "Message/Mark/---", GTK_UI_MANAGER_SEPARATOR)
1778 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/Mark", "MarkSpam", "Message/Mark/MarkSpam", GTK_UI_MANAGER_MENUITEM)
1779 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/Mark", "MarkHam", "Message/Mark/MarkHam", GTK_UI_MANAGER_MENUITEM)
1780 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/Mark", "Separator5", "Message/Mark/---", GTK_UI_MANAGER_SEPARATOR)
1781 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/Mark", "Lock", "Message/Mark/Lock", GTK_UI_MANAGER_MENUITEM)
1782 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message/Mark", "Unlock", "Message/Mark/Unlock", GTK_UI_MANAGER_MENUITEM)
1783 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message", "ColorLabel", "Message/ColorLabel", GTK_UI_MANAGER_MENUITEM)
1784 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message", "Tags", "Message/Tags", GTK_UI_MANAGER_MENUITEM)
1785 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message", "Separator5", "Message/---", GTK_UI_MANAGER_SEPARATOR)
1787 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message", "Reedit", "Message/Reedit", GTK_UI_MANAGER_MENUITEM)
1788 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message", "Separator6", "Message/---", GTK_UI_MANAGER_SEPARATOR)
1789 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Message", "CheckSignature", "Message/CheckSignature", GTK_UI_MANAGER_MENUITEM)
1791 /* Tools menu */
1792 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools", "AddressBook", "Tools/AddressBook", GTK_UI_MANAGER_MENUITEM)
1793 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools", "AddSenderToAB", "Tools/AddSenderToAB", GTK_UI_MANAGER_MENUITEM)
1794 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools", "CollectAddresses", "Tools/CollectAddresses", GTK_UI_MANAGER_MENU)
1795 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools/CollectAddresses", "FromFolder", "Tools/CollectAddresses/FromFolder", GTK_UI_MANAGER_MENUITEM)
1796 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools/CollectAddresses", "FromSelected", "Tools/CollectAddresses/FromSelected", GTK_UI_MANAGER_MENUITEM)
1797 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools", "Separator1", "Tools/---", GTK_UI_MANAGER_SEPARATOR)
1799 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools", "FilterFolder", "Tools/FilterFolder", GTK_UI_MANAGER_MENUITEM)
1800 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools", "FilterSelected", "Tools/FilterSelected", GTK_UI_MANAGER_MENUITEM)
1801 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools", "RunProcessing", "Tools/RunProcessing", GTK_UI_MANAGER_MENUITEM)
1802 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools", "CreateFilterRule", "Tools/CreateFilterRule", GTK_UI_MANAGER_MENU)
1803 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools/CreateFilterRule", "Automatically", "Tools/CreateFilterRule/Automatically", GTK_UI_MANAGER_MENUITEM)
1804 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools/CreateFilterRule", "ByFrom", "Tools/CreateFilterRule/ByFrom", GTK_UI_MANAGER_MENUITEM)
1805 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools/CreateFilterRule", "ByTo", "Tools/CreateFilterRule/ByTo", GTK_UI_MANAGER_MENUITEM)
1806 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools/CreateFilterRule", "BySubject", "Tools/CreateFilterRule/BySubject", GTK_UI_MANAGER_MENUITEM)
1807 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools/CreateFilterRule", "BySender", "Tools/CreateFilterRule/BySender", GTK_UI_MANAGER_MENUITEM)
1809 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools", "CreateProcessingRule", "Tools/CreateProcessingRule", GTK_UI_MANAGER_MENU)
1810 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools/CreateProcessingRule", "Automatically", "Tools/CreateProcessingRule/Automatically", GTK_UI_MANAGER_MENUITEM)
1811 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools/CreateProcessingRule", "ByFrom", "Tools/CreateProcessingRule/ByFrom", GTK_UI_MANAGER_MENUITEM)
1812 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools/CreateProcessingRule", "ByTo", "Tools/CreateProcessingRule/ByTo", GTK_UI_MANAGER_MENUITEM)
1813 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools/CreateProcessingRule", "BySubject", "Tools/CreateProcessingRule/BySubject", GTK_UI_MANAGER_MENUITEM)
1814 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools/CreateProcessingRule", "BySender", "Tools/CreateProcessingRule/BySender", GTK_UI_MANAGER_MENUITEM)
1815 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools", "Separator2", "Tools/---", GTK_UI_MANAGER_SEPARATOR)
1817 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools", "ListUrls", "Tools/ListUrls", GTK_UI_MANAGER_MENUITEM)
1818 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools", "Separator3", "Tools/---", GTK_UI_MANAGER_SEPARATOR)
1820 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools", "Actions", "Tools/Actions", GTK_UI_MANAGER_MENU)
1821 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools/Actions", "PlaceHolder", "Tools/Actions/PlaceHolder", GTK_UI_MANAGER_MENUITEM)
1822 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools", "Separator4", "Tools/---", GTK_UI_MANAGER_SEPARATOR)
1824 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools", "CheckNewMessages", "Tools/CheckNewMessages", GTK_UI_MANAGER_MENUITEM)
1825 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools", "DeleteDuplicates", "Tools/DeleteDuplicates", GTK_UI_MANAGER_MENU)
1826 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools/DeleteDuplicates", "SelFolder", "Tools/DeleteDuplicates/SelFolder", GTK_UI_MANAGER_MENUITEM)
1827 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools/DeleteDuplicates", "AllFolders", "Tools/DeleteDuplicates/AllFolders", GTK_UI_MANAGER_MENUITEM)
1828 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools", "Separator5", "Tools/---", GTK_UI_MANAGER_SEPARATOR)
1830 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools", "Execute", "Tools/Execute", GTK_UI_MANAGER_MENUITEM)
1831 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools", "Expunge", "Tools/Expunge", GTK_UI_MANAGER_MENUITEM)
1832 #ifdef USE_GNUTLS
1833 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools", "Separator6", "Tools/---", GTK_UI_MANAGER_SEPARATOR)
1834 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools", "TLSCertificates", "Tools/TLSCertificates", GTK_UI_MANAGER_MENUITEM)
1835 #endif
1836 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools", "Separator7", "Tools/---", GTK_UI_MANAGER_SEPARATOR)
1837 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools", "FilteringLog", "Tools/FilteringLog", GTK_UI_MANAGER_MENUITEM)
1838 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools", "NetworkLog", "Tools/NetworkLog", GTK_UI_MANAGER_MENUITEM)
1839 #ifdef G_OS_WIN32
1840 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools", "DebugLog", "Tools/DebugLog", GTK_UI_MANAGER_MENUITEM)
1841 #endif
1842 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools", "Separator8", "Tools/---", GTK_UI_MANAGER_SEPARATOR)
1843 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools", "ForgetSessionPasswords", "Tools/ForgetSessionPasswords", GTK_UI_MANAGER_MENUITEM)
1844 #ifndef PASSWORD_CRYPTO_OLD
1845 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools", "ForgetPrimaryPassphrase", "Tools/ForgetPrimaryPassphrase", GTK_UI_MANAGER_MENUITEM)
1846 #endif
1847 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Tools", "Separator9", "Tools/---", GTK_UI_MANAGER_SEPARATOR)
1849 /* Configuration menu */
1850 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Configuration", "ChangeAccount", "Configuration/ChangeAccount", GTK_UI_MANAGER_MENU)
1851 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Configuration/ChangeAccount", "PlaceHolder", "Configuration/ChangeAccount/PlaceHolder", GTK_UI_MANAGER_MENUITEM)
1852 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Configuration", "AccountPrefs", "Configuration/AccountPrefs", GTK_UI_MANAGER_MENUITEM)
1853 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Configuration", "CreateAccount", "Configuration/CreateAccount", GTK_UI_MANAGER_MENUITEM)
1854 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Configuration", "EditAccounts", "Configuration/EditAccounts", GTK_UI_MANAGER_MENUITEM)
1855 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Configuration", "Separator1", "Configuration/---", GTK_UI_MANAGER_SEPARATOR)
1857 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Configuration", "Preferences", "Configuration/Preferences", GTK_UI_MANAGER_MENUITEM)
1858 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Configuration", "PreProcessing", "Configuration/PreProcessing", GTK_UI_MANAGER_MENUITEM)
1859 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Configuration", "PostProcessing", "Configuration/PostProcessing", GTK_UI_MANAGER_MENUITEM)
1860 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Configuration", "Filtering", "Configuration/Filtering", GTK_UI_MANAGER_MENUITEM)
1861 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Configuration", "Templates", "Configuration/Templates", GTK_UI_MANAGER_MENUITEM)
1862 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Configuration", "Actions", "Configuration/Actions", GTK_UI_MANAGER_MENUITEM)
1863 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Configuration", "Tags", "Configuration/Tags", GTK_UI_MANAGER_MENUITEM)
1865 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Configuration", "Separator2", "Configuration/---", GTK_UI_MANAGER_SEPARATOR)
1866 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Configuration", "Plugins", "Configuration/Plugins", GTK_UI_MANAGER_MENUITEM)
1868 /* Help menu */
1869 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Help", "Manual", "Help/Manual", GTK_UI_MANAGER_MENUITEM)
1870 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Help", "FAQ", "Help/FAQ", GTK_UI_MANAGER_MENUITEM)
1871 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Help", "IconLegend", "Help/IconLegend", GTK_UI_MANAGER_MENUITEM)
1872 #ifdef G_OS_WIN32
1873 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Help", "Separator1", "Help/---", GTK_UI_MANAGER_SEPARATOR)
1874 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Help", "SetDefault", "Help/SetDefault", GTK_UI_MANAGER_MENUITEM)
1875 #endif
1876 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Help", "Separator2", "Help/---", GTK_UI_MANAGER_SEPARATOR)
1877 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Help", "About", "Help/About", GTK_UI_MANAGER_MENUITEM)
1880 menubar = gtk_ui_manager_get_widget(mainwin->ui_manager, "/Menu");
1881 if (prefs_common.mainwin_menubar)
1882 gtk_widget_show_all(menubar);
1883 else
1884 gtk_widget_hide(menubar);
1885 gtk_window_add_accel_group(GTK_WINDOW(window), gtk_ui_manager_get_accel_group(mainwin->ui_manager));
1887 /* Create a menu container for the different popup menus we
1888 * will be adding from other UI elements. */
1889 MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/", "Menus", "Menus", GTK_UI_MANAGER_MENUBAR)
1891 gtk_box_pack_start(GTK_BOX(vbox), menubar, FALSE, TRUE, 0);
1893 handlebox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
1894 gtk_widget_show(handlebox);
1895 gtk_box_pack_start(GTK_BOX(vbox), handlebox, FALSE, FALSE, 0);
1896 /* link window to mainwin->window to avoid gdk warnings */
1897 mainwin->window = window;
1898 mainwin_list = g_list_append(mainwin_list, mainwin);
1900 mainwin->toolbar = toolbar_create(TOOLBAR_MAIN,
1901 handlebox,
1902 (gpointer)mainwin);
1903 toolbar_set_learn_button
1904 (mainwin->toolbar,
1905 LEARN_SPAM);
1907 /* vbox that contains body */
1908 vbox_body = gtk_box_new(GTK_ORIENTATION_VERTICAL, BORDER_WIDTH);
1909 gtk_widget_show(vbox_body);
1910 gtk_container_set_border_width(GTK_CONTAINER(vbox_body), BORDER_WIDTH);
1911 gtk_box_pack_start(GTK_BOX(vbox), vbox_body, TRUE, TRUE, 0);
1913 #ifndef GENERIC_UMPC
1914 hbox_stat = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 2);
1915 gtk_widget_set_name(GTK_WIDGET(hbox_stat), "hbox_stat");
1916 gtk_box_pack_end(GTK_BOX(vbox_body), hbox_stat, FALSE, FALSE, 0);
1917 warning_btn = gtk_button_new();
1918 gtk_button_set_image(GTK_BUTTON(warning_btn),
1919 gtk_image_new_from_icon_name("dialog-warning", GTK_ICON_SIZE_BUTTON));
1920 CLAWS_SET_TIP(warning_btn,
1921 _("Some error(s) happened. Click here to view log."));
1923 mainwin->warning_btn = warning_btn;
1925 g_signal_connect(G_OBJECT(warning_btn), "clicked",
1926 G_CALLBACK(warning_btn_pressed), mainwin);
1927 g_signal_connect(G_OBJECT(warning_btn), "motion-notify-event",
1928 G_CALLBACK(warning_visi_notify), mainwin);
1929 g_signal_connect(G_OBJECT(warning_btn), "leave-notify-event",
1930 G_CALLBACK(warning_leave_notify), mainwin);
1931 g_signal_connect(G_OBJECT(warning_btn), "enter-notify-event",
1932 G_CALLBACK(warning_enter_notify), mainwin);
1934 gtk_box_pack_start(GTK_BOX(hbox_stat), warning_btn, FALSE, FALSE, 0);
1936 statusbar = statusbar_create();
1937 gtk_widget_set_margin_start(statusbar, 2);
1938 gtk_widget_set_margin_end(statusbar, 0);
1939 gtk_widget_set_margin_top(statusbar, 0);
1940 gtk_widget_set_margin_bottom(statusbar, 0);
1941 gtk_box_pack_start(GTK_BOX(hbox_stat), statusbar, TRUE, TRUE, 0);
1943 progressbar = gtk_progress_bar_new();
1944 gtk_widget_set_size_request(progressbar, 120, 1);
1945 gtk_box_pack_start(GTK_BOX(hbox_stat), progressbar, FALSE, FALSE, 0);
1947 online_pixmap = stock_pixmap_widget(STOCK_PIXMAP_ONLINE);
1948 offline_pixmap = stock_pixmap_widget(STOCK_PIXMAP_OFFLINE);
1949 online_switch = gtk_button_new ();
1950 gtk_widget_set_can_focus(online_switch, FALSE);
1951 CLAWS_SET_TIP(online_switch,
1952 _("You are online. Click the icon to go offline"));
1953 offline_switch = gtk_button_new ();
1954 CLAWS_SET_TIP(offline_switch,
1955 _("You are offline. Click the icon to go online"));
1956 gtk_container_add (GTK_CONTAINER(online_switch), online_pixmap);
1957 gtk_button_set_relief (GTK_BUTTON(online_switch), GTK_RELIEF_NONE);
1958 g_signal_connect (G_OBJECT(online_switch), "clicked", G_CALLBACK(online_switch_clicked), mainwin);
1959 gtk_box_pack_start (GTK_BOX(hbox_stat), online_switch, FALSE, FALSE, 0);
1960 gtk_container_add (GTK_CONTAINER(offline_switch), offline_pixmap);
1961 gtk_button_set_relief (GTK_BUTTON(offline_switch), GTK_RELIEF_NONE);
1962 g_signal_connect (G_OBJECT(offline_switch), "clicked", G_CALLBACK(online_switch_clicked), mainwin);
1963 gtk_box_pack_start (GTK_BOX(hbox_stat), offline_switch, FALSE, FALSE, 0);
1965 statuslabel = gtk_label_new("");
1966 gtk_box_pack_start(GTK_BOX(hbox_stat), statuslabel, FALSE, FALSE, 0);
1968 ac_button = gtk_button_new();
1969 CLAWS_SET_TIP(ac_button, _("Select account"));
1970 gtk_widget_set_can_focus(ac_button, FALSE);
1971 gtk_widget_set_size_request(ac_button, -1, 0);
1972 gtk_box_pack_end(GTK_BOX(hbox_stat), ac_button, FALSE, FALSE, 0);
1973 g_signal_connect(G_OBJECT(ac_button), "button_press_event",
1974 G_CALLBACK(ac_label_button_pressed), mainwin);
1976 ac_label = gtk_label_new("");
1977 gtk_container_add(GTK_CONTAINER(ac_button), ac_label);
1979 gtk_widget_show_all(hbox_stat);
1981 gtk_widget_hide(offline_switch);
1982 gtk_widget_hide(progressbar);
1983 gtk_widget_hide(warning_btn);
1984 #else
1985 online_switch = gtk_button_new ();
1986 offline_switch = gtk_button_new ();
1987 g_signal_connect (G_OBJECT(online_switch), "clicked", G_CALLBACK(online_switch_clicked), mainwin);
1988 g_signal_connect (G_OBJECT(offline_switch), "clicked", G_CALLBACK(online_switch_clicked), mainwin);
1989 #endif
1990 /* create views */
1991 mainwin->folderview = folderview = folderview_create(mainwin);
1992 mainwin->summaryview = summaryview = summary_create(mainwin);
1993 mainwin->messageview = messageview = messageview_create(mainwin);
1995 /* init log instances data before creating log views */
1996 set_log_title(LOG_PROTOCOL, _("Network log"));
1997 set_log_prefs(LOG_PROTOCOL,
1998 &prefs_common.logwin_width,
1999 &prefs_common.logwin_height);
2000 set_log_title(LOG_DEBUG_FILTERING, _("Filtering/Processing debug log"));
2001 set_log_prefs(LOG_DEBUG_FILTERING,
2002 &prefs_common.filtering_debugwin_width,
2003 &prefs_common.filtering_debugwin_height);
2005 /* setup log windows */
2006 mainwin->logwin = log_window_create(LOG_PROTOCOL);
2007 log_window_init(mainwin->logwin);
2009 mainwin->filtering_debugwin = log_window_create(LOG_DEBUG_FILTERING);
2010 log_window_set_clipping(mainwin->logwin,
2011 prefs_common.cliplog,
2012 prefs_common.loglength);
2014 log_window_init(mainwin->filtering_debugwin);
2015 log_window_set_clipping(mainwin->filtering_debugwin,
2016 prefs_common.filtering_debug_cliplog,
2017 prefs_common.filtering_debug_loglength);
2018 if (prefs_common.enable_filtering_debug)
2019 log_message(LOG_DEBUG_FILTERING, _("filtering log enabled\n"));
2020 else
2021 log_message(LOG_DEBUG_FILTERING, _("filtering log disabled\n"));
2023 folderview->mainwin = mainwin;
2024 folderview->summaryview = summaryview;
2026 summaryview->mainwin = mainwin;
2027 summaryview->folderview = folderview;
2028 summaryview->messageview = messageview;
2029 summaryview->window = window;
2031 mainwin->vbox = vbox;
2032 mainwin->menubar = menubar;
2033 mainwin->handlebox = handlebox;
2034 mainwin->vbox_body = vbox_body;
2035 mainwin->online_switch = online_switch;
2036 mainwin->offline_switch = offline_switch;
2037 #ifndef GENERIC_UMPC
2038 messageview->statusbar = statusbar;
2039 mainwin->statusbar = statusbar;
2040 mainwin->hbox_stat = hbox_stat;
2041 mainwin->progressbar = progressbar;
2042 mainwin->statuslabel = statuslabel;
2043 mainwin->online_pixmap = online_pixmap;
2044 mainwin->offline_pixmap = offline_pixmap;
2045 mainwin->ac_button = ac_button;
2046 mainwin->ac_label = ac_label;
2047 /* set context IDs for status bar */
2048 mainwin->mainwin_cid = gtk_statusbar_get_context_id
2049 (GTK_STATUSBAR(statusbar), "Main Window");
2050 mainwin->folderview_cid = gtk_statusbar_get_context_id
2051 (GTK_STATUSBAR(statusbar), "Folder View");
2052 mainwin->summaryview_cid = gtk_statusbar_get_context_id
2053 (GTK_STATUSBAR(statusbar), "Summary View");
2054 mainwin->messageview_cid = gtk_statusbar_get_context_id
2055 (GTK_STATUSBAR(statusbar), "Message View");
2056 messageview->statusbar_cid = mainwin->messageview_cid;
2058 #else
2059 messageview->statusbar = NULL;
2060 mainwin->statusbar = NULL;
2061 mainwin->hbox_stat = NULL;
2062 /* mainwin->progressbar is set in toolbar.c */
2063 mainwin->statuslabel = NULL;
2064 mainwin->online_pixmap = NULL;
2065 mainwin->offline_pixmap = NULL;
2066 mainwin->ac_button = NULL;
2067 mainwin->ac_label = NULL;
2068 #endif
2070 /* allocate colors for summary view and folder view */
2071 summaryview->color_marked.red = summaryview->color_marked.green = 0;
2072 summaryview->color_marked.blue = (guint16)65535;
2074 summaryview->color_dim.red = summaryview->color_dim.green =
2075 summaryview->color_dim.blue = COLOR_DIM;
2077 folderview->color_new = prefs_common.color[COL_NEW];
2078 folderview->color_op = prefs_common.color[COL_TGT_FOLDER];
2080 debug_print("done.\n");
2082 messageview->visible = prefs_common.msgview_visible;
2084 main_window_set_widgets(mainwin, prefs_common.layout_mode);
2086 g_signal_connect(G_OBJECT(window), "size_allocate",
2087 G_CALLBACK(main_window_size_allocate_cb),
2088 mainwin);
2090 /* set menu items */
2091 cm_toggle_menu_set_active_full(mainwin->ui_manager, "Menu/View/Encoding/"CS_AUTO, TRUE);
2093 menuitem = NULL;
2094 switch (prefs_common.toolbar_style) {
2095 case TOOLBAR_NONE:
2096 menuitem = gtk_ui_manager_get_widget(mainwin->ui_manager, "/Menu/View/ShowHide/Toolbar/Hide");
2097 break;
2098 case TOOLBAR_ICON:
2099 menuitem = gtk_ui_manager_get_widget(mainwin->ui_manager, "/Menu/View/ShowHide/Toolbar/IconOnly");
2100 break;
2101 case TOOLBAR_TEXT:
2102 menuitem = gtk_ui_manager_get_widget(mainwin->ui_manager, "/Menu/View/ShowHide/Toolbar/TextOnly");
2103 break;
2104 case TOOLBAR_BOTH:
2105 menuitem = gtk_ui_manager_get_widget(mainwin->ui_manager, "/Menu/View/ShowHide/Toolbar/TextBelowIcon");
2106 break;
2107 case TOOLBAR_BOTH_HORIZ:
2108 menuitem = gtk_ui_manager_get_widget(mainwin->ui_manager, "/Menu/View/ShowHide/Toolbar/TextBesideIcon");
2110 gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menuitem), TRUE);
2112 toolbar_set_style(mainwin->toolbar->toolbar,
2113 mainwin->handlebox,
2114 prefs_common.toolbar_style);
2115 #ifndef GENERIC_UMPC
2116 gtk_widget_hide(mainwin->hbox_stat);
2117 menuitem = gtk_ui_manager_get_widget(mainwin->ui_manager, "/Menu/View/ShowHide/StatusBar");
2118 gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menuitem),
2119 prefs_common.show_statusbar);
2120 #endif
2121 menuitem = gtk_ui_manager_get_widget(mainwin->ui_manager, "/Menu/View/ShowHide/ColumnHeaders");
2122 gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menuitem),
2123 prefs_common.show_col_headers);
2124 /* set account selection menu */
2125 ac_menu = gtk_ui_manager_get_widget(mainwin->ui_manager, "/Menu/Configuration/ChangeAccount");
2126 mainwin->ac_menu = ac_menu;
2128 toolbar_main_set_sensitive(mainwin);
2130 /* create actions menu */
2131 main_window_update_actions_menu(mainwin);
2133 main_create_mailing_list_menu (mainwin, NULL);
2135 /* attach accel groups to main window */
2136 #define ADD_MENU_ACCEL_GROUP_TO_WINDOW(menu,win) \
2137 gtk_window_add_accel_group \
2138 (GTK_WINDOW(win), \
2139 gtk_ui_manager_get_accel_group(gtkut_ui_manager()));
2141 ADD_MENU_ACCEL_GROUP_TO_WINDOW(summaryview->popupmenu, mainwin->window);
2143 g_signal_connect(G_OBJECT(window), "window_state_event",
2144 G_CALLBACK(mainwindow_state_event_cb), mainwin);
2145 g_signal_connect(G_OBJECT(window), "visibility_notify_event",
2146 G_CALLBACK(mainwindow_visibility_event_cb), mainwin);
2147 gtk_widget_add_events(GTK_WIDGET(window), GDK_VISIBILITY_NOTIFY_MASK);
2149 if (prefs_common.layout_mode == VERTICAL_LAYOUT ||
2150 prefs_common.layout_mode == SMALL_LAYOUT) {
2151 summary_relayout(mainwin->summaryview);
2153 summary_update_unread(mainwin->summaryview, NULL);
2155 /* initialize views */
2156 folderview_init(folderview);
2157 summary_init(summaryview);
2158 messageview_init(messageview);
2159 #ifdef USE_GNUTLS
2160 sslcertwindow_register_hook();
2161 #endif
2162 mainwin->lock_count = 0;
2163 mainwin->menu_lock_count = 0;
2164 mainwin->cursor_count = 0;
2166 mainwin->progressindicator_hook =
2167 hooks_register_hook(PROGRESSINDICATOR_HOOKLIST, mainwindow_progressindicator_hook, mainwin);
2169 if (!watch_cursor)
2170 watch_cursor = gdk_cursor_new_for_display(
2171 gtk_widget_get_display(mainwin->window), GDK_WATCH);
2172 if (!hand_cursor)
2173 hand_cursor = gdk_cursor_new_for_display(
2174 gtk_widget_get_display(mainwin->window), GDK_HAND2);
2176 /* init work_offline */
2177 if (prefs_common.work_offline)
2178 online_switch_clicked (GTK_BUTTON(online_switch), mainwin);
2180 mainwindow_colorlabel_menu_create(mainwin, FALSE);
2181 mainwindow_tags_menu_create(mainwin, FALSE);
2183 if (prefs_common.mainwin_fullscreen) {
2184 cm_toggle_menu_set_active_full(mainwin->ui_manager,
2185 "Menu/View/FullScreen",
2186 TRUE);
2188 if (prefs_common.mainwin_menubar)
2189 cm_toggle_menu_set_active_full(mainwin->ui_manager,"Menu/View/ShowHide/MenuBar", TRUE);
2191 return mainwin;
2194 void main_window_update_actions_menu(MainWindow *mainwin)
2196 action_update_mainwin_menu(mainwin->ui_manager, "/Menu/Tools/Actions", mainwin);
2199 void main_window_cursor_wait(MainWindow *mainwin)
2201 GdkDisplay *display;
2203 display = gdk_display_get_default();
2205 if (mainwin->cursor_count == 0) {
2206 gdk_window_set_cursor(gtk_widget_get_window(mainwin->window), watch_cursor);
2207 textview_cursor_wait(mainwin->messageview->mimeview->textview);
2210 mainwin->cursor_count++;
2212 gdk_display_flush(display);
2215 void main_window_cursor_normal(MainWindow *mainwin)
2217 GdkDisplay *display;
2219 display = gdk_display_get_default();
2221 if (mainwin->cursor_count)
2222 mainwin->cursor_count--;
2224 if (mainwin->cursor_count == 0) {
2225 gdk_window_set_cursor(gtk_widget_get_window(mainwin->window), NULL);
2226 textview_cursor_normal(mainwin->messageview->mimeview->textview);
2228 gdk_display_flush(display);
2231 /* lock / unlock the user-interface */
2232 void main_window_lock(MainWindow *mainwin)
2234 if (mainwin->lock_count == 0 && mainwin->ac_button)
2235 gtk_widget_set_sensitive(mainwin->ac_button, FALSE);
2237 mainwin->lock_count++;
2239 main_window_set_menu_sensitive(mainwin);
2240 toolbar_main_set_sensitive(mainwin);
2243 void main_window_unlock(MainWindow *mainwin)
2245 if (mainwin->lock_count)
2246 mainwin->lock_count--;
2248 main_window_set_menu_sensitive(mainwin);
2249 toolbar_main_set_sensitive(mainwin);
2251 if (mainwin->lock_count == 0 && mainwin->ac_button)
2252 gtk_widget_set_sensitive(mainwin->ac_button, TRUE);
2255 static void main_window_menu_callback_block(MainWindow *mainwin)
2257 mainwin->menu_lock_count++;
2260 static void main_window_menu_callback_unblock(MainWindow *mainwin)
2262 if (mainwin->menu_lock_count)
2263 mainwin->menu_lock_count--;
2266 static guint prefs_tag = 0;
2268 void main_window_reflect_prefs_all(void)
2270 main_window_reflect_prefs_all_real(FALSE);
2273 static gboolean reflect_prefs_timeout_cb(gpointer data)
2275 gboolean pixmap_theme_changed = GPOINTER_TO_INT(data);
2276 GList *cur;
2277 MainWindow *mainwin;
2278 #ifndef GENERIC_UMPC
2279 GtkWidget *pixmap;
2280 #endif
2281 for (cur = mainwin_list; cur != NULL; cur = cur->next) {
2282 mainwin = (MainWindow *)cur->data;
2284 main_window_show_cur_account(mainwin);
2285 main_window_set_menu_sensitive(mainwin);
2286 toolbar_main_set_sensitive(mainwin);
2288 /* pixmap themes */
2289 if (pixmap_theme_changed) {
2290 toolbar_update(TOOLBAR_MAIN, mainwin);
2291 messageview_reflect_prefs_pixmap_theme();
2292 compose_reflect_prefs_pixmap_theme();
2293 folderview_reinit_fonts(mainwin->folderview);
2294 folderview_init(mainwin->folderview);
2295 summary_reflect_prefs_pixmap_theme(mainwin->summaryview);
2296 foldersel_reflect_prefs_pixmap_theme();
2297 #ifndef USE_ALT_ADDRBOOK
2298 addressbook_reflect_prefs_pixmap_theme();
2299 #endif
2300 #ifndef GENERIC_UMPC
2301 pixmap = stock_pixmap_widget(STOCK_PIXMAP_ONLINE);
2302 gtk_container_remove(GTK_CONTAINER(mainwin->online_switch),
2303 mainwin->online_pixmap);
2304 gtk_container_add (GTK_CONTAINER(mainwin->online_switch), pixmap);
2305 gtk_widget_show(pixmap);
2306 mainwin->online_pixmap = pixmap;
2307 pixmap = stock_pixmap_widget(STOCK_PIXMAP_OFFLINE);
2308 gtk_container_remove(GTK_CONTAINER(mainwin->offline_switch),
2309 mainwin->offline_pixmap);
2310 gtk_container_add (GTK_CONTAINER(mainwin->offline_switch), pixmap);
2311 gtk_widget_show(pixmap);
2312 mainwin->offline_pixmap = pixmap;
2313 #endif
2314 hooks_invoke(THEME_CHANGED_HOOKLIST, NULL);
2317 headerview_set_font(mainwin->messageview->headerview);
2318 headerview_set_visibility(mainwin->messageview->headerview,
2319 prefs_common.display_header_pane);
2320 textview_reflect_prefs(mainwin->messageview->mimeview->textview);
2321 folderview_reflect_prefs();
2322 summary_reflect_prefs();
2323 #ifndef GENERIC_UMPC
2324 summary_redisplay_msg(mainwin->summaryview);
2325 #endif
2326 if (prefs_common.layout_mode == SMALL_LAYOUT) {
2327 if (mainwin->in_folder) {
2328 mainwindow_enter_folder(mainwin);
2329 } else {
2330 mainwindow_exit_folder(mainwin);
2334 prefs_tag = 0;
2335 return FALSE;
2338 void main_window_reflect_prefs_all_now(void)
2340 reflect_prefs_timeout_cb(GINT_TO_POINTER(FALSE));
2343 void main_window_reflect_prefs_custom_colors(MainWindow *mainwin)
2345 GtkMenuShell *menu;
2346 GList *children, *cur;
2348 /* re-create colorlabel submenu */
2349 menu = GTK_MENU_SHELL(mainwin->colorlabel_menu);
2350 cm_return_if_fail(menu != NULL);
2352 /* clear items. get item pointers. */
2353 children = gtk_container_get_children(GTK_CONTAINER(menu));
2354 for (cur = children; cur != NULL && cur->data != NULL; cur = cur->next) {
2355 g_signal_handlers_disconnect_matched
2356 (gtk_ui_manager_get_accel_group(mainwin->ui_manager),
2357 G_SIGNAL_MATCH_DATA|G_SIGNAL_MATCH_FUNC,
2358 0, 0, NULL, mainwin_accel_changed_cb, cur->data);
2359 gtk_menu_item_set_submenu(GTK_MENU_ITEM(cur->data), NULL);
2361 g_list_free(children);
2362 mainwindow_colorlabel_menu_create(mainwin, TRUE);
2363 summary_reflect_prefs_custom_colors(mainwin->summaryview);
2364 folderview_reinit_fonts(mainwin->folderview);
2367 static gint tags_tag = 0;
2368 static gboolean main_window_reflect_tags_changes_real(gpointer data)
2370 GtkMenuShell *menu;
2371 GList *children, *cur;
2372 MainWindow *mainwin = (MainWindow *)data;
2374 if (summary_is_locked(mainwin->summaryview)) {
2375 return TRUE;
2377 /* re-create tags submenu */
2378 menu = GTK_MENU_SHELL(mainwin->tags_menu);
2379 cm_return_val_if_fail(menu != NULL, FALSE);
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 gtk_menu_item_set_submenu(GTK_MENU_ITEM(cur->data), NULL);
2386 g_list_free(children);
2387 mainwindow_tags_menu_create(mainwin, TRUE);
2388 summary_reflect_tags_changes(mainwin->summaryview);
2390 tags_tag = 0;
2391 return FALSE;
2394 void main_window_reflect_tags_changes(MainWindow *mainwin)
2396 if (tags_tag == 0) {
2397 tags_tag = g_timeout_add(100, main_window_reflect_tags_changes_real,
2398 mainwin);
2402 void main_window_reflect_prefs_all_real(gboolean pixmap_theme_changed)
2404 if (prefs_tag == 0) {
2405 prefs_tag = g_timeout_add(100, reflect_prefs_timeout_cb,
2406 GINT_TO_POINTER(pixmap_theme_changed));
2410 void main_window_set_summary_column(void)
2412 GList *cur;
2413 MainWindow *mainwin;
2415 for (cur = mainwin_list; cur != NULL; cur = cur->next) {
2416 mainwin = (MainWindow *)cur->data;
2417 summary_set_column_order(mainwin->summaryview);
2421 void main_window_set_folder_column(void)
2423 GList *cur;
2424 MainWindow *mainwin;
2426 for (cur = mainwin_list; cur != NULL; cur = cur->next) {
2427 mainwin = (MainWindow *)cur->data;
2428 folderview_set_column_order(mainwin->folderview);
2432 static void main_window_set_account_selector_menu(MainWindow *mainwin,
2433 GList *account_list)
2435 GList *cur_ac;
2436 GtkWidget *menuitem;
2437 PrefsAccount *ac_prefs;
2438 GtkWidget *menu;
2439 gchar *accel_path;
2441 menu = gtk_menu_new();
2442 gtk_menu_set_accel_group (GTK_MENU (menu),
2443 gtk_ui_manager_get_accel_group(mainwin->ui_manager));
2445 for (cur_ac = account_list; cur_ac != NULL; cur_ac = cur_ac->next) {
2446 ac_prefs = (PrefsAccount *)cur_ac->data;
2448 menuitem = gtk_menu_item_new_with_label
2449 (ac_prefs->account_name
2450 ? ac_prefs->account_name : _("Untitled"));
2451 gtk_widget_show(menuitem);
2452 gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem);
2453 g_signal_connect(G_OBJECT(menuitem), "activate",
2454 G_CALLBACK(account_selector_menu_cb),
2455 ac_prefs);
2456 accel_path = g_strconcat("<Actions>/Menu/Configuration/ChangeAccount/",(ac_prefs->account_name
2457 ? ac_prefs->account_name : _("Untitled")), NULL );
2458 gtk_menu_item_set_accel_path(GTK_MENU_ITEM(menuitem), accel_path);
2459 g_free(accel_path);
2461 gtk_menu_item_set_submenu(GTK_MENU_ITEM(mainwin->ac_menu), menu);
2464 static void main_window_set_account_receive_menu(MainWindow *mainwin,
2465 GList *account_list)
2467 GList *children, *child;
2468 GtkWidget *menu;
2469 GtkWidget *menuitem;
2470 PrefsAccount *ac_prefs;
2472 menu = gtk_menu_item_get_submenu(GTK_MENU_ITEM(
2473 gtk_ui_manager_get_widget(mainwin->ui_manager, "/Menu/Message/Receive")));
2475 /* search for separator */
2476 children = gtk_container_get_children(GTK_CONTAINER(menu));
2477 for (child = children; child != NULL; child = child->next) {
2478 if (child->data == gtk_ui_manager_get_widget(mainwin->ui_manager, "/Menu/Message/Receive/Separator1")) {
2479 child = child->next;
2480 break;
2484 /* destroy all previous menu item */
2485 while (child != NULL) {
2486 gtk_widget_destroy(GTK_WIDGET(child->data));
2487 child = child->next;
2490 g_list_free(children);
2492 for (child = account_list; child != NULL; child = child->next) {
2493 ac_prefs = (PrefsAccount *)child->data;
2495 if (ac_prefs->protocol == A_NONE)
2496 continue;
2498 menuitem = gtk_menu_item_new_with_label
2499 (ac_prefs->account_name ? ac_prefs->account_name
2500 : _("Untitled"));
2501 gtk_widget_show(menuitem);
2502 gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem);
2503 g_signal_connect(G_OBJECT(menuitem), "activate",
2504 G_CALLBACK(account_receive_menu_cb),
2505 ac_prefs);
2509 static void main_window_set_toolbar_combo_receive_menu(MainWindow *mainwin,
2510 GList *account_list)
2512 GList *cur_ac;
2513 GtkWidget *menuitem;
2514 PrefsAccount *ac_prefs;
2515 GtkWidget *menu = NULL;
2517 if (mainwin->toolbar->getall_btn == NULL) /* button doesn't exist */
2518 return;
2520 menu = gtk_menu_tool_button_get_menu(GTK_MENU_TOOL_BUTTON(mainwin->toolbar->getall_btn));
2521 if (menu)
2522 gtk_widget_destroy(menu);
2523 menu = gtk_menu_new();
2525 for (cur_ac = account_list; cur_ac != NULL; cur_ac = cur_ac->next) {
2526 ac_prefs = (PrefsAccount *)cur_ac->data;
2528 if (ac_prefs->protocol == A_NONE)
2529 continue;
2531 menuitem = gtk_menu_item_new_with_label
2532 (ac_prefs->account_name
2533 ? ac_prefs->account_name : _("Untitled"));
2534 gtk_widget_show(menuitem);
2535 gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem);
2536 g_signal_connect(G_OBJECT(menuitem), "activate",
2537 G_CALLBACK(account_receive_menu_cb),
2538 ac_prefs);
2540 gtk_menu_tool_button_set_menu(GTK_MENU_TOOL_BUTTON(mainwin->toolbar->getall_btn), menu);
2543 static void main_window_set_toolbar_combo_compose_menu(MainWindow *mainwin,
2544 GList *account_list)
2546 #ifndef GENERIC_UMPC
2547 GList *cur_ac;
2548 GtkWidget *menuitem;
2549 PrefsAccount *ac_prefs;
2550 GtkWidget *menu = NULL;
2552 if (mainwin->toolbar->compose_mail_btn == NULL) /* button doesn't exist */
2553 return;
2555 menu = gtk_menu_tool_button_get_menu(GTK_MENU_TOOL_BUTTON(mainwin->toolbar->compose_mail_btn));
2556 if (menu)
2557 gtk_widget_destroy(menu);
2558 menu = gtk_menu_new();
2560 for (cur_ac = account_list; cur_ac != NULL; cur_ac = cur_ac->next) {
2561 ac_prefs = (PrefsAccount *)cur_ac->data;
2563 menuitem = gtk_menu_item_new_with_label
2564 (ac_prefs->account_name
2565 ? ac_prefs->account_name : _("Untitled"));
2566 gtk_widget_show(menuitem);
2567 gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem);
2568 g_signal_connect(G_OBJECT(menuitem), "activate",
2569 G_CALLBACK(account_compose_menu_cb),
2570 ac_prefs);
2572 gtk_menu_tool_button_set_menu(GTK_MENU_TOOL_BUTTON(mainwin->toolbar->compose_mail_btn), menu);
2573 #endif
2576 void main_window_set_account_menu(GList *account_list)
2578 GList *cur;
2579 MainWindow *mainwin;
2581 for (cur = mainwin_list; cur != NULL; cur = cur->next) {
2582 mainwin = (MainWindow *)cur->data;
2583 main_window_set_account_selector_menu(mainwin, account_list);
2584 main_window_set_account_receive_menu(mainwin, account_list);
2585 main_window_set_toolbar_combo_receive_menu(mainwin, account_list);
2586 main_window_set_toolbar_combo_compose_menu(mainwin, account_list);
2588 hooks_invoke(ACCOUNT_LIST_CHANGED_HOOKLIST, NULL);
2591 void main_window_set_account_menu_only_toolbar(GList *account_list)
2593 GList *cur;
2594 MainWindow *mainwin;
2596 for (cur = mainwin_list; cur != NULL; cur = cur->next) {
2597 mainwin = (MainWindow *)cur->data;
2598 main_window_set_toolbar_combo_receive_menu(mainwin, account_list);
2599 main_window_set_toolbar_combo_compose_menu(mainwin, account_list);
2603 static void main_window_show_cur_account(MainWindow *mainwin)
2605 gchar *buf;
2606 gchar *ac_name;
2608 ac_name = g_strdup(cur_account
2609 ? (cur_account->account_name
2610 ? cur_account->account_name : _("Untitled"))
2611 : _("none"));
2613 if (cur_account)
2614 buf = g_strdup_printf("%s - %s", ac_name, PROG_VERSION);
2615 else
2616 buf = g_strdup(PROG_VERSION);
2617 gtk_window_set_title(GTK_WINDOW(mainwin->window), buf);
2618 g_free(buf);
2620 if (mainwin->ac_label)
2621 gtk_label_set_text(GTK_LABEL(mainwin->ac_label), ac_name);
2622 if (mainwin->ac_button)
2623 gtk_widget_queue_resize(mainwin->ac_button);
2625 g_free(ac_name);
2627 #ifndef GENERIC_UMPC
2628 static void main_window_separation_change(MainWindow *mainwin, LayoutType layout_mode)
2630 GtkWidget *folder_wid = GTK_WIDGET_PTR(mainwin->folderview);
2631 GtkWidget *summary_wid = GTK_WIDGET_PTR(mainwin->summaryview);
2632 GtkWidget *message_wid = mainwin->messageview->vbox;
2634 if (layout_mode == prefs_common.layout_mode)
2635 return;
2637 debug_print("Changing window separation type from %d to %d\n",
2638 prefs_common.layout_mode, layout_mode);
2640 /* remove widgets from those containers */
2641 g_object_ref(folder_wid);
2642 g_object_ref(summary_wid);
2643 g_object_ref(message_wid);
2644 gtk_container_remove
2645 (GTK_CONTAINER(gtk_widget_get_parent(folder_wid)), folder_wid);
2646 gtk_container_remove
2647 (GTK_CONTAINER(gtk_widget_get_parent(summary_wid)), summary_wid);
2648 gtk_container_remove
2649 (GTK_CONTAINER(gtk_widget_get_parent(message_wid)), message_wid);
2651 gtk_widget_hide(mainwin->window);
2652 main_window_set_widgets(mainwin, layout_mode);
2653 gtk_widget_show(mainwin->window);
2655 g_object_unref(folder_wid);
2656 g_object_unref(summary_wid);
2657 g_object_unref(message_wid);
2659 #endif
2660 void mainwindow_reset_paned(GtkPaned *paned)
2662 gint min, max, mid;
2664 if (gtk_paned_get_child1(GTK_PANED(paned)))
2665 gtk_widget_show(gtk_paned_get_child1(GTK_PANED(paned)));
2666 if (gtk_paned_get_child2(GTK_PANED(paned)))
2667 gtk_widget_show(gtk_paned_get_child2(GTK_PANED(paned)));
2669 GTK_EVENTS_FLUSH();
2670 g_object_get (G_OBJECT(paned),
2671 "min-position",
2672 &min, NULL);
2673 g_object_get (G_OBJECT(paned),
2674 "max-position",
2675 &max, NULL);
2676 mid = (min+max)/2;
2677 gtk_paned_set_position(GTK_PANED(paned), mid);
2680 static void mainwin_paned_show_first(GtkPaned *paned)
2682 gint max;
2683 g_object_get (G_OBJECT(paned),
2684 "max-position",
2685 &max, NULL);
2687 if (gtk_paned_get_child1(GTK_PANED(paned)))
2688 gtk_widget_show(gtk_paned_get_child1(GTK_PANED(paned)));
2689 if (gtk_paned_get_child2(GTK_PANED(paned)))
2690 gtk_widget_hide(gtk_paned_get_child2(GTK_PANED(paned)));
2691 gtk_paned_set_position(GTK_PANED(paned), max);
2694 static void mainwin_paned_show_last(GtkPaned *paned)
2696 gint min;
2697 g_object_get (G_OBJECT(paned),
2698 "min-position",
2699 &min, NULL);
2701 if (gtk_paned_get_child1(GTK_PANED(paned)))
2702 gtk_widget_hide(gtk_paned_get_child1(GTK_PANED(paned)));
2703 if (gtk_paned_get_child2(GTK_PANED(paned)))
2704 gtk_widget_show(gtk_paned_get_child2(GTK_PANED(paned)));
2705 gtk_paned_set_position(GTK_PANED(paned), min);
2708 void main_window_toggle_message_view(MainWindow *mainwin)
2710 SummaryView *summaryview = mainwin->summaryview;
2711 GtkWidget *ppaned = NULL;
2712 GtkWidget *container = NULL;
2714 switch (prefs_common.layout_mode) {
2715 case NORMAL_LAYOUT:
2716 case VERTICAL_LAYOUT:
2717 case SMALL_LAYOUT:
2718 ppaned = mainwin->vpaned;
2719 container = mainwin->hpaned;
2720 if (gtk_widget_get_parent(ppaned) != NULL) {
2721 mainwin->messageview->visible = FALSE;
2722 summaryview->displayed = NULL;
2723 g_object_ref(ppaned);
2724 gtk_container_remove(GTK_CONTAINER(container), ppaned);
2725 gtk_widget_reparent(GTK_WIDGET_PTR(summaryview), container);
2726 } else {
2727 mainwin->messageview->visible = TRUE;
2728 gtk_widget_reparent(GTK_WIDGET_PTR(summaryview), ppaned);
2729 gtk_container_add(GTK_CONTAINER(container), ppaned);
2730 gtk_paned_set_position(GTK_PANED(ppaned),
2731 prefs_common.summaryview_height);
2732 g_object_unref(ppaned);
2734 break;
2735 case WIDE_LAYOUT:
2736 container = mainwin->vpaned;
2737 if (gtk_widget_get_parent(mainwin->messageview->vbox) != NULL) {
2738 mainwin->messageview->visible = FALSE;
2739 summaryview->displayed = NULL;
2740 g_object_ref(mainwin->messageview->vbox);
2741 gtk_container_remove(GTK_CONTAINER(container), mainwin->messageview->vbox);
2742 } else {
2743 mainwin->messageview->visible = TRUE;
2744 gtk_container_add(GTK_CONTAINER(container), mainwin->messageview->vbox);
2745 g_object_unref(mainwin->messageview->vbox);
2747 break;
2748 case WIDE_MSGLIST_LAYOUT:
2749 g_warning("can't hide messageview in this wide msglist layout");
2750 break;
2753 if (messageview_is_visible(mainwin->messageview))
2754 gtk_image_set_from_icon_name(GTK_IMAGE(mainwin->summaryview->toggle_arrow),
2755 "pan-down-symbolic", GTK_ICON_SIZE_MENU);
2756 else
2757 gtk_image_set_from_icon_name(GTK_IMAGE(mainwin->summaryview->toggle_arrow),
2758 "pan-up-symbolic", GTK_ICON_SIZE_MENU);
2760 if (mainwin->messageview->visible == FALSE)
2761 messageview_clear(mainwin->messageview);
2763 main_window_set_menu_sensitive(mainwin);
2765 prefs_common.msgview_visible = mainwin->messageview->visible;
2767 if (messageview_is_visible(mainwin->messageview)) {
2768 gtk_widget_queue_resize(mainwin->hpaned);
2769 gtk_widget_queue_resize(mainwin->vpaned);
2771 summary_grab_focus(summaryview);
2772 if (!summary_is_list(summaryview)) {
2773 summary_show(summaryview, summaryview->folder_item, FALSE);
2777 void main_window_get_size(MainWindow *mainwin)
2779 GtkAllocation allocation;
2781 if (mainwin_list == NULL || mainwin->messageview == NULL) {
2782 debug_print("called after messageview "
2783 "has been deallocated!\n");
2784 return;
2787 gtk_widget_get_allocation(GTK_WIDGET_PTR(mainwin->summaryview), &allocation);
2788 if (allocation.width > 1 && allocation.height > 1) {
2789 prefs_common.summaryview_width = allocation.width;
2791 if (messageview_is_visible(mainwin->messageview))
2792 prefs_common.summaryview_height = allocation.height;
2794 prefs_common.mainview_width = allocation.width;
2797 gtk_window_get_size(GTK_WINDOW(mainwin->window), &allocation.width, &allocation.height);
2798 if (allocation.width > 1 && allocation.height > 1) {
2799 prefs_common.mainview_height = allocation.height;
2800 prefs_common.mainwin_width = allocation.width;
2801 prefs_common.mainwin_height = allocation.height;
2804 gtk_widget_get_allocation(GTK_WIDGET_PTR(mainwin->folderview), &allocation);
2805 if (allocation.width > 1 && allocation.height > 1) {
2806 prefs_common.folderview_width = allocation.width;
2807 prefs_common.folderview_height = allocation.height;
2810 gtk_widget_get_allocation(GTK_WIDGET_PTR(mainwin->messageview), &allocation);
2811 if (allocation.width > 1 && allocation.height > 1) {
2812 prefs_common.msgview_width = allocation.width;
2813 prefs_common.msgview_height = allocation.height;
2816 /* debug_print("summaryview size: %d x %d\n",
2817 prefs_common.summaryview_width,
2818 prefs_common.summaryview_height);
2819 debug_print("folderview size: %d x %d\n",
2820 prefs_common.folderview_width,
2821 prefs_common.folderview_height);
2822 debug_print("messageview size: %d x %d\n",
2823 prefs_common.msgview_width,
2824 prefs_common.msgview_height); */
2827 void main_window_get_position(MainWindow *mainwin)
2829 gint x, y;
2831 if (prefs_common.mainwin_maximised || prefs_common.mainwin_fullscreen)
2832 return;
2834 gtk_window_get_position(GTK_WINDOW(mainwin->window), &x, &y);
2836 prefs_common.mainview_x = x;
2837 prefs_common.mainview_y = y;
2838 prefs_common.mainwin_x = x;
2839 prefs_common.mainwin_y = y;
2841 debug_print("main window position: %d, %d\n", x, y);
2844 void main_window_progress_on(MainWindow *mainwin)
2846 gtk_progress_bar_set_text(GTK_PROGRESS_BAR(mainwin->progressbar), "");
2849 void main_window_progress_off(MainWindow *mainwin)
2851 gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(mainwin->progressbar), 0.0);
2852 gtk_progress_bar_set_text(GTK_PROGRESS_BAR(mainwin->progressbar), "");
2855 gboolean main_window_empty_trash(MainWindow *mainwin, gboolean confirm, gboolean for_quit)
2857 if (confirm && procmsg_have_trashed_mails_fast()) {
2858 AlertValue val;
2860 if (for_quit)
2861 val = alertpanel(_("Empty trash"),
2862 _("Delete all messages in trash folders?"),
2863 NULL, _("_No"), NULL, _("_Yes"), NULL, _("Don't quit"),
2864 ALERTFOCUS_SECOND);
2865 else
2866 val = alertpanel(_("Empty trash"),
2867 _("Delete all messages in trash folders?"),
2868 NULL, _("_No"), NULL, _("_Yes"), NULL, NULL,
2869 ALERTFOCUS_SECOND);
2870 if (val == G_ALERTALTERNATE) {
2871 debug_print("will empty trash\n");
2872 } else if (val == G_ALERTDEFAULT) {
2873 debug_print("will not empty trash\n");
2874 return TRUE;
2875 } else {
2876 return FALSE; /* cancel exit */
2878 manage_window_focus_in(mainwin->window, NULL, NULL);
2881 procmsg_empty_all_trash();
2883 if (mainwin->summaryview->folder_item &&
2884 mainwin->summaryview->folder_item->stype == F_TRASH)
2885 folderview_grab_focus(mainwin->folderview);
2886 return TRUE;
2889 static void main_window_add_mailbox(MainWindow *mainwin)
2891 gchar *path;
2892 Folder *folder;
2894 path = input_dialog(_("Add mailbox"),
2895 _("Input the location of the mailbox.\n"
2896 "The location can be either the full path or relative to the \n"
2897 "home directory.\n"
2898 "If the location of an existing mailbox is specified, it will be\n"
2899 "scanned automatically."),
2900 "Mail");
2901 if (!path) return;
2902 if (folder_find_from_path(path)) {
2903 alertpanel_error(_("The mailbox '%s' already exists."), path);
2904 g_free(path);
2905 return;
2907 folder = folder_new(folder_get_class_from_string("mh"),
2908 !strcmp(path, "Mail") ? _("Mailbox") :
2909 g_path_get_basename(path), path);
2910 g_free(path);
2912 if (folder->klass->create_tree(folder) < 0) {
2913 alertpanel_error(_("Creation of the mailbox failed.\n"
2914 "Maybe some files already exist, or you don't have the permission to write there."));
2915 folder_destroy(folder);
2916 return;
2919 folder_add(folder);
2920 folder_set_ui_func(folder, scan_tree_func, mainwin);
2921 folder_scan_tree(folder, TRUE);
2922 folder_set_ui_func(folder, NULL, NULL);
2925 SensitiveCondMask main_window_get_current_state(MainWindow *mainwin)
2927 SensitiveCondMask state = 0;
2928 SummarySelection selection;
2929 FolderItem *item = mainwin->summaryview->folder_item;
2930 GList *account_list = account_get_list();
2931 GSList *tmp;
2933 selection = summary_get_selection_type(mainwin->summaryview);
2935 #define UPDATE_STATE(...) \
2936 do { \
2937 state |= main_window_get_mask(__VA_ARGS__, -1); \
2938 } while (0)
2940 if (mainwin->lock_count == 0 && !claws_is_starting())
2941 UPDATE_STATE(M_UNLOCKED);
2942 if (selection != SUMMARY_NONE && selection != SUMMARY_SELECTED_NONE)
2943 UPDATE_STATE(M_MSG_SELECTED);
2944 if (item && item->total_msgs > 0)
2945 UPDATE_STATE(M_MSG_EXIST);
2946 if (item && item->path && folder_item_parent(item) && !item->no_select) {
2947 UPDATE_STATE(M_EXEC);
2948 /* if (item->folder->type != F_NEWS) */
2949 UPDATE_STATE(M_ALLOW_DELETE);
2951 if (prefs_common.immediate_exec == 0
2952 && mainwin->lock_count == 0)
2953 UPDATE_STATE(M_DELAY_EXEC);
2955 if ((selection == SUMMARY_NONE && item->hide_read_msgs)
2956 || selection != SUMMARY_NONE)
2957 UPDATE_STATE(M_HIDE_READ_MSG);
2959 if ((selection == SUMMARY_NONE && item->hide_read_threads)
2960 || selection != SUMMARY_NONE)
2961 UPDATE_STATE(M_HIDE_READ_THREADS);
2963 if (mainwin->summaryview->threaded)
2964 UPDATE_STATE(M_THREADED);
2965 else
2966 UPDATE_STATE(M_UNTHREADED);
2967 if (selection == SUMMARY_SELECTED_SINGLE ||
2968 selection == SUMMARY_SELECTED_MULTIPLE)
2969 UPDATE_STATE(M_TARGET_EXIST);
2970 if (selection == SUMMARY_SELECTED_SINGLE)
2971 UPDATE_STATE(M_SINGLE_TARGET_EXIST);
2972 if (mainwin->summaryview->folder_item &&
2973 mainwin->summaryview->folder_item->folder->klass->type == F_NEWS)
2974 UPDATE_STATE(M_NEWS);
2975 else
2976 UPDATE_STATE(M_NOT_NEWS);
2977 if (mainwin->summaryview->folder_item &&
2978 (mainwin->summaryview->folder_item->stype != F_TRASH ||
2979 !folder_has_parent_of_type(mainwin->summaryview->folder_item, F_TRASH)))
2980 UPDATE_STATE(M_NOT_TRASH);
2982 if (mainwin->summaryview->folder_item
2983 && mainwin->summaryview->folder_item->stype != F_DRAFT)
2984 UPDATE_STATE(M_NOT_DRAFT);
2986 if (prefs_common.actions_list && g_slist_length(prefs_common.actions_list))
2987 UPDATE_STATE(M_ACTIONS_EXIST);
2989 tmp = tags_get_list();
2990 if (tmp && g_slist_length(tmp))
2991 UPDATE_STATE(M_TAGS_EXIST);
2992 g_slist_free(tmp);
2994 if (procmsg_have_queued_mails_fast() && !procmsg_is_sending())
2995 UPDATE_STATE(M_HAVE_QUEUED_MAILS);
2997 if (selection == SUMMARY_SELECTED_SINGLE &&
2998 (item &&
2999 (folder_has_parent_of_type(item, F_DRAFT) ||
3000 folder_has_parent_of_type(item, F_OUTBOX) ||
3001 folder_has_parent_of_type(item, F_QUEUE))))
3002 UPDATE_STATE(M_ALLOW_REEDIT);
3003 if (cur_account)
3004 UPDATE_STATE(M_HAVE_ACCOUNT);
3006 if (cur_account && cur_account->protocol != A_NONE)
3007 UPDATE_STATE(M_HAVE_RETRIEVABLE_ACCOUNT);
3009 if (any_folder_want_synchronise())
3010 UPDATE_STATE(M_WANT_SYNC);
3012 if (item && item->prefs->processing && selection != SUMMARY_NONE)
3013 UPDATE_STATE(M_HAVE_PROCESSING);
3015 if (g_list_length(account_list) > 1)
3016 UPDATE_STATE(M_HAVE_MULTI_ACCOUNT);
3018 for (account_list = account_get_list(); account_list != NULL; account_list = account_list->next) {
3019 if (((PrefsAccount*)account_list->data)->protocol != A_NONE) {
3020 UPDATE_STATE(M_HAVE_ANY_RETRIEVABLE_ACCOUNT);
3021 break;
3025 for (account_list = account_get_list(); account_list != NULL; account_list = account_list->next) {
3026 if (((PrefsAccount*)account_list->data)->protocol == A_NNTP) {
3027 UPDATE_STATE(M_HAVE_NEWS_ACCOUNT);
3028 break;
3032 if (procmsg_spam_can_learn() &&
3033 (mainwin->summaryview->folder_item &&
3034 mainwin->summaryview->folder_item->folder->klass->type != F_UNKNOWN &&
3035 mainwin->summaryview->folder_item->folder->klass->type != F_NEWS)) {
3036 UPDATE_STATE(M_CAN_LEARN_SPAM);
3039 if (mainwin->summaryview->folder_item) {
3040 UPDATE_STATE(M_FOLDER_SELECTED);
3043 if (inc_is_active())
3044 UPDATE_STATE(M_INC_ACTIVE);
3045 if (imap_cancel_all_enabled())
3046 UPDATE_STATE(M_INC_ACTIVE);
3048 if (send_is_active() | procmsg_is_sending())
3049 UPDATE_STATE(M_SEND_ACTIVE);
3051 if (mainwin->summaryview->deleted > 0)
3052 UPDATE_STATE(M_DELETED_EXISTS);
3054 if (mainwin->summaryview->deleted > 0 ||
3055 mainwin->summaryview->moved > 0 ||
3056 mainwin->summaryview->copied > 0)
3057 UPDATE_STATE(M_DELAY_EXEC);
3059 if (summary_is_list(mainwin->summaryview))
3060 UPDATE_STATE(M_SUMMARY_ISLIST);
3062 if (prefs_common.layout_mode != SMALL_LAYOUT || mainwin->in_folder)
3063 UPDATE_STATE(M_IN_MSGLIST);
3065 for (account_list = account_get_list(); account_list != NULL; account_list = account_list->next) {
3066 PrefsAccount *account = account_list->data;
3067 if (account->session_passwd || account->session_smtp_passwd) {
3068 UPDATE_STATE(M_SESSION_PASSWORDS);
3069 break;
3073 #ifndef PASSWORD_CRYPTO_OLD
3074 if (primary_passphrase_is_entered()) {
3075 UPDATE_STATE(M_MASTER_PASSPHRASE);
3077 #endif
3079 #undef UPDATE_STATE
3081 return state;
3084 SensitiveCondMask main_window_get_mask(SensitiveCond cond, ...)
3086 va_list args;
3087 gint i;
3088 SensitiveCondMask value;
3089 static SensitiveCondMask SensitiveCond_table[M_MAX_RESERVED];
3090 static gboolean first_time = TRUE;
3092 if (first_time) {
3093 for (i = 0; i < M_MAX_RESERVED; i++)
3094 SensitiveCond_table[i] = (SensitiveCondMask) ((SensitiveCondMask)1 << i);
3095 first_time = FALSE;
3098 value = 0;
3100 va_start(args, cond);
3101 for (i = (gint) cond; i >= 0 && i < M_MAX_RESERVED; i = va_arg(args, gint))
3102 value |= SensitiveCond_table[i];
3103 va_end(args);
3105 return value;
3108 void main_window_set_menu_sensitive(MainWindow *mainwin)
3110 SensitiveCondMask state;
3111 gboolean sensitive;
3112 SummaryView *summaryview;
3113 gchar *menu_path;
3114 GtkWidget *menu;
3115 GList *children, *cur_item;
3116 gboolean mimepart_selected = FALSE;
3118 state = main_window_get_current_state(mainwin);
3120 #define SET_SENSITIVE(entry_str, ...) \
3122 SensitiveCondMask cond = main_window_get_mask(__VA_ARGS__, -1); \
3123 cm_menu_set_sensitive_full(mainwin->ui_manager, \
3124 (const gchar *) entry_str, \
3125 ((cond & state) == cond)); \
3127 SET_SENSITIVE("Menu/File/SaveAs", M_TARGET_EXIST);
3128 SET_SENSITIVE("Menu/File/SavePartAs", M_SINGLE_TARGET_EXIST);
3129 SET_SENSITIVE("Menu/File/Print", M_TARGET_EXIST);
3130 SET_SENSITIVE("Menu/File/SynchroniseFolders", M_WANT_SYNC);
3131 SET_SENSITIVE("Menu/File/Exit", M_UNLOCKED);
3133 SET_SENSITIVE("Menu/Edit/SelectThread", M_TARGET_EXIST, M_SUMMARY_ISLIST);
3134 SET_SENSITIVE("Menu/Edit/Find", M_SINGLE_TARGET_EXIST);
3135 SET_SENSITIVE("Menu/Edit/QuickSearch", M_IN_MSGLIST);
3136 SET_SENSITIVE("Menu/Edit/SearchFolder", M_TARGET_EXIST, M_SUMMARY_ISLIST);
3138 SET_SENSITIVE("Menu/View/SetColumns/Folderlist", M_UNLOCKED, M_SUMMARY_ISLIST);
3139 SET_SENSITIVE("Menu/View/Sort", M_EXEC, M_SUMMARY_ISLIST);
3140 SET_SENSITIVE("Menu/View/ThreadView", M_EXEC, M_SUMMARY_ISLIST);
3141 SET_SENSITIVE("Menu/View/ExpandThreads", M_MSG_EXIST, M_SUMMARY_ISLIST);
3142 SET_SENSITIVE("Menu/View/CollapseThreads", M_MSG_EXIST, M_SUMMARY_ISLIST);
3143 SET_SENSITIVE("Menu/View/HideReadThreads", M_HIDE_READ_THREADS, M_SUMMARY_ISLIST, M_NOT_DRAFT);
3144 SET_SENSITIVE("Menu/View/HideReadMessages", M_HIDE_READ_MSG, M_SUMMARY_ISLIST, M_NOT_DRAFT);
3145 SET_SENSITIVE("Menu/View/HideDelMessages", M_SUMMARY_ISLIST, M_NOT_DRAFT);
3146 SET_SENSITIVE("Menu/View/Goto/Prev", M_MSG_SELECTED);
3147 SET_SENSITIVE("Menu/View/Goto/Next", M_MSG_SELECTED);
3148 SET_SENSITIVE("Menu/View/Goto/PrevUnread", M_MSG_SELECTED);
3149 SET_SENSITIVE("Menu/View/Goto/NextUnread", M_MSG_SELECTED);
3150 SET_SENSITIVE("Menu/View/Goto/PrevNew", M_MSG_SELECTED);
3151 SET_SENSITIVE("Menu/View/Goto/NextNew", M_MSG_SELECTED);
3152 SET_SENSITIVE("Menu/View/Goto/PrevMarked", M_MSG_SELECTED);
3153 SET_SENSITIVE("Menu/View/Goto/NextMarked", M_MSG_SELECTED);
3154 SET_SENSITIVE("Menu/View/Goto/PrevLabeled", M_MSG_SELECTED);
3155 SET_SENSITIVE("Menu/View/Goto/NextLabeled", M_MSG_SELECTED);
3156 SET_SENSITIVE("Menu/View/Goto/ParentMessage", M_SINGLE_TARGET_EXIST);
3157 SET_SENSITIVE("Menu/View/Goto/NextPart", M_SINGLE_TARGET_EXIST);
3158 SET_SENSITIVE("Menu/View/Goto/PrevPart", M_SINGLE_TARGET_EXIST);
3159 SET_SENSITIVE("Menu/View/OpenNewWindow", M_SINGLE_TARGET_EXIST);
3160 SET_SENSITIVE("Menu/View/MessageSource", M_SINGLE_TARGET_EXIST);
3161 SET_SENSITIVE("Menu/View/Part", M_SINGLE_TARGET_EXIST);
3162 SET_SENSITIVE("Menu/View/AllHeaders", M_SINGLE_TARGET_EXIST);
3163 SET_SENSITIVE("Menu/View/Quotes", M_SINGLE_TARGET_EXIST);
3165 SET_SENSITIVE("Menu/Message/Receive/CurrentAccount", M_HAVE_ACCOUNT, M_UNLOCKED, M_HAVE_RETRIEVABLE_ACCOUNT);
3166 SET_SENSITIVE("Menu/Message/Receive/AllAccounts", M_HAVE_ACCOUNT, M_UNLOCKED, M_HAVE_ANY_RETRIEVABLE_ACCOUNT);
3167 SET_SENSITIVE("Menu/Message/Receive/CancelReceiving", M_INC_ACTIVE);
3168 SET_SENSITIVE("Menu/Message/SendQueue", M_HAVE_ACCOUNT, M_HAVE_QUEUED_MAILS);
3169 SET_SENSITIVE("Menu/Message/CancelSending", M_SEND_ACTIVE);
3170 SET_SENSITIVE("Menu/Message/ComposeEmail", M_HAVE_ACCOUNT);
3171 SET_SENSITIVE("Menu/Message/ComposeNews", M_HAVE_NEWS_ACCOUNT);
3172 SET_SENSITIVE("Menu/Message/Reply", M_HAVE_ACCOUNT, M_TARGET_EXIST, M_SUMMARY_ISLIST);
3173 SET_SENSITIVE("Menu/Message/ReplyTo", M_HAVE_ACCOUNT, M_TARGET_EXIST, M_SUMMARY_ISLIST);
3174 SET_SENSITIVE("Menu/Message/FollowupReply", M_HAVE_ACCOUNT, M_TARGET_EXIST, M_NEWS, M_SUMMARY_ISLIST);
3175 SET_SENSITIVE("Menu/Message/Forward", M_HAVE_ACCOUNT, M_TARGET_EXIST, M_SUMMARY_ISLIST);
3176 SET_SENSITIVE("Menu/Message/ForwardAtt", M_HAVE_ACCOUNT, M_TARGET_EXIST, M_SUMMARY_ISLIST);
3177 SET_SENSITIVE("Menu/Message/Redirect", M_HAVE_ACCOUNT, M_TARGET_EXIST, M_SUMMARY_ISLIST);
3178 SET_SENSITIVE("Menu/Message/Move", M_TARGET_EXIST, M_ALLOW_DELETE, M_NOT_NEWS);
3179 SET_SENSITIVE("Menu/Message/Copy", M_TARGET_EXIST, M_EXEC);
3180 SET_SENSITIVE("Menu/Message/Trash", M_TARGET_EXIST, M_ALLOW_DELETE, M_NOT_NEWS, M_NOT_TRASH);
3181 SET_SENSITIVE("Menu/Message/Delete", M_TARGET_EXIST, M_ALLOW_DELETE);
3182 SET_SENSITIVE("Menu/Message/TrashThread", M_TARGET_EXIST, M_SUMMARY_ISLIST);
3183 SET_SENSITIVE("Menu/Message/DeleteThread", M_TARGET_EXIST, M_SUMMARY_ISLIST);
3184 SET_SENSITIVE("Menu/Message/CancelNews", M_TARGET_EXIST, M_ALLOW_DELETE, M_NEWS);
3185 SET_SENSITIVE("Menu/Message/Mark", M_TARGET_EXIST, M_SUMMARY_ISLIST);
3186 SET_SENSITIVE("Menu/Message/Mark/MarkSpam", M_TARGET_EXIST, M_CAN_LEARN_SPAM);
3187 SET_SENSITIVE("Menu/Message/Mark/MarkHam", M_TARGET_EXIST, M_CAN_LEARN_SPAM);
3188 SET_SENSITIVE("Menu/Message/Mark/IgnoreThread", M_TARGET_EXIST);
3189 SET_SENSITIVE("Menu/Message/Mark/UnignoreThread", M_TARGET_EXIST);
3190 SET_SENSITIVE("Menu/Message/Mark/Lock", M_TARGET_EXIST);
3191 SET_SENSITIVE("Menu/Message/Mark/Unlock", M_TARGET_EXIST);
3192 SET_SENSITIVE("Menu/Message/ColorLabel", M_TARGET_EXIST);
3193 SET_SENSITIVE("Menu/Message/Tags", M_TARGET_EXIST);
3194 SET_SENSITIVE("Menu/Message/Reedit", M_HAVE_ACCOUNT, M_ALLOW_REEDIT);
3195 SET_SENSITIVE("Menu/Message/CheckSignature", M_SINGLE_TARGET_EXIST);
3197 SET_SENSITIVE("Menu/Tools/AddSenderToAB", M_SINGLE_TARGET_EXIST);
3198 SET_SENSITIVE("Menu/Tools/CollectAddresses", M_FOLDER_SELECTED);
3199 SET_SENSITIVE("Menu/Tools/CollectAddresses/FromFolder", M_FOLDER_SELECTED);
3200 SET_SENSITIVE("Menu/Tools/CollectAddresses/FromSelected", M_TARGET_EXIST);
3201 SET_SENSITIVE("Menu/Tools/FilterFolder", M_MSG_EXIST, M_EXEC);
3202 SET_SENSITIVE("Menu/Tools/FilterSelected", M_TARGET_EXIST, M_EXEC);
3203 SET_SENSITIVE("Menu/Tools/RunProcessing", M_HAVE_PROCESSING);
3204 SET_SENSITIVE("Menu/Tools/CreateFilterRule", M_SINGLE_TARGET_EXIST, M_UNLOCKED);
3205 SET_SENSITIVE("Menu/Tools/CreateProcessingRule", M_SINGLE_TARGET_EXIST, M_UNLOCKED);
3206 SET_SENSITIVE("Menu/Tools/ListUrls", M_TARGET_EXIST);
3207 SET_SENSITIVE("Menu/Tools/Actions", M_TARGET_EXIST, M_ACTIONS_EXIST);
3208 SET_SENSITIVE("Menu/Tools/Execute", M_DELAY_EXEC);
3209 SET_SENSITIVE("Menu/Tools/Expunge", M_DELETED_EXISTS);
3210 SET_SENSITIVE("Menu/Tools/ForgetSessionPasswords", M_SESSION_PASSWORDS);
3211 #ifndef PASSWORD_CRYPTO_OLD
3212 SET_SENSITIVE("Menu/Tools/ForgetPrimaryPassphrase", M_MASTER_PASSPHRASE);
3213 #endif
3214 SET_SENSITIVE("Menu/Tools/DeleteDuplicates/SelFolder", M_MSG_EXIST, M_ALLOW_DELETE);
3216 SET_SENSITIVE("Menu/Configuration", M_UNLOCKED);
3217 SET_SENSITIVE("Menu/Configuration/ChangeAccount", M_HAVE_MULTI_ACCOUNT);
3218 SET_SENSITIVE("Menu/Configuration/AccountPrefs", M_UNLOCKED);
3219 SET_SENSITIVE("Menu/Configuration/CreateAccount", M_UNLOCKED);
3220 SET_SENSITIVE("Menu/Configuration/EditAccounts", M_UNLOCKED);
3221 #undef SET_SENSITIVE
3223 menu = gtk_menu_item_get_submenu(GTK_MENU_ITEM(
3224 gtk_ui_manager_get_widget(mainwin->ui_manager, "/Menu/Message/Receive")));
3226 children = gtk_container_get_children(GTK_CONTAINER(menu));
3227 for (cur_item = children; cur_item != NULL; cur_item = cur_item->next) {
3228 if (cur_item->data == gtk_ui_manager_get_widget(mainwin->ui_manager, "/Menu/Message/Receive/Separator1")) {
3229 cur_item = cur_item->next;
3230 break;
3234 for (; cur_item != NULL; cur_item = cur_item->next) {
3235 gtk_widget_set_sensitive(GTK_WIDGET(cur_item->data),
3236 (main_window_get_mask(M_UNLOCKED, -1) & state) != 0);
3239 g_list_free(children);
3241 main_window_menu_callback_block(mainwin);
3243 cm_toggle_menu_set_active_full(mainwin->ui_manager, "Menu/View/ShowHide/MessageView",
3244 messageview_is_visible(mainwin->messageview));
3246 summaryview = mainwin->summaryview;
3248 switch (summaryview->sort_key) {
3249 case SORT_BY_NUMBER:
3250 menu_path = "Menu/View/Sort/Number"; break;
3251 case SORT_BY_SIZE:
3252 menu_path = "Menu/View/Sort/Size"; break;
3253 case SORT_BY_DATE:
3254 menu_path = "Menu/View/Sort/Date"; break;
3255 case SORT_BY_THREAD_DATE:
3256 menu_path = "Menu/View/Sort/ThreadDate"; break;
3257 case SORT_BY_FROM:
3258 menu_path = "Menu/View/Sort/From"; break;
3259 case SORT_BY_TO:
3260 menu_path = "Menu/View/Sort/To"; break;
3261 case SORT_BY_SUBJECT:
3262 menu_path = "Menu/View/Sort/Subject"; break;
3263 case SORT_BY_LABEL:
3264 menu_path = "Menu/View/Sort/Color"; break;
3265 case SORT_BY_MARK:
3266 menu_path = "Menu/View/Sort/Mark"; break;
3267 case SORT_BY_STATUS:
3268 menu_path = "Menu/View/Sort/Status"; break;
3269 case SORT_BY_MIME:
3270 menu_path = "Menu/View/Sort/Attachment"; break;
3271 case SORT_BY_SCORE:
3272 menu_path = "Menu/View/Sort/Score"; break;
3273 case SORT_BY_LOCKED:
3274 menu_path = "Menu/View/Sort/Locked"; break;
3275 case SORT_BY_TAGS:
3276 menu_path = "Menu/View/Sort/Tag"; break;
3277 case SORT_BY_NONE:
3278 default:
3279 menu_path = "Menu/View/Sort/DontSort"; break;
3281 cm_toggle_menu_set_active_full(mainwin->ui_manager, menu_path, TRUE);
3283 if (summaryview->sort_type == SORT_ASCENDING) {
3284 cm_toggle_menu_set_active_full(mainwin->ui_manager, "Menu/View/Sort/Ascending", TRUE);
3285 } else {
3286 cm_toggle_menu_set_active_full(mainwin->ui_manager, "Menu/View/Sort/Descending", TRUE);
3289 if (summaryview->sort_key != SORT_BY_NONE) {
3290 cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/View/Sort/Ascending", TRUE);
3291 cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/View/Sort/Descending", TRUE);
3292 } else {
3293 cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/View/Sort/Ascending", FALSE);
3294 cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/View/Sort/Descending", FALSE);
3297 if (mainwin->messageview
3298 && mainwin->messageview->mimeview
3299 && mainwin->messageview->mimeview->textview)
3300 cm_toggle_menu_set_active_full(mainwin->ui_manager, "Menu/View/AllHeaders",
3301 prefs_common.show_all_headers);
3302 cm_toggle_menu_set_active_full(mainwin->ui_manager, "Menu/View/ThreadView", (state & main_window_get_mask(M_THREADED, -1)) != 0);
3303 cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/View/ExpandThreads", (state & main_window_get_mask(M_THREADED, -1)) != 0);
3304 cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/View/CollapseThreads", (state & main_window_get_mask(M_THREADED, -1)) != 0);
3305 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);
3306 cm_toggle_menu_set_active_full(mainwin->ui_manager, "Menu/View/Quotes/CollapseAll", (prefs_common.hide_quotes == 1));
3307 cm_toggle_menu_set_active_full(mainwin->ui_manager, "Menu/View/Quotes/Collapse2", (prefs_common.hide_quotes == 2));
3308 cm_toggle_menu_set_active_full(mainwin->ui_manager, "Menu/View/Quotes/Collapse3", (prefs_common.hide_quotes == 3));
3310 if (mainwin->summaryview->folder_item && !mainwin->summaryview->folder_item->threaded)
3311 cm_toggle_menu_set_active_full(mainwin->ui_manager, "Menu/View/HideReadThreads", FALSE);
3312 if ((mainwin->summaryview->folder_item && mainwin->summaryview->folder_item->hide_read_msgs) ||
3313 quicksearch_has_sat_predicate(mainwin->summaryview->quicksearch))
3314 cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/View/HideReadThreads", FALSE);
3315 if ((mainwin->summaryview->folder_item && mainwin->summaryview->folder_item->hide_read_threads) ||
3316 quicksearch_has_sat_predicate(mainwin->summaryview->quicksearch))
3317 cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/View/HideReadMessages", FALSE);
3318 if (quicksearch_has_sat_predicate(mainwin->summaryview->quicksearch))
3319 cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/View/HideDelMessages", FALSE);
3321 cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/View/Goto/PrevHistory",
3322 messageview_nav_has_prev(mainwin->messageview));
3323 cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/View/Goto/NextHistory",
3324 messageview_nav_has_next(mainwin->messageview));
3326 if (mainwin->messageview
3327 && mainwin->messageview->mimeview)
3328 mimepart_selected = !mimeview_tree_is_empty(mainwin->messageview->mimeview);
3330 cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/File/SavePartAs", mimepart_selected);
3331 cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/View/Goto/NextPart", mimepart_selected);
3332 cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/View/Goto/PrevPart", mimepart_selected);
3333 cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/View/Part", mimepart_selected);
3334 cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/Message/CheckSignature",
3335 mimepart_selected && mainwin->messageview->mimeview->signed_part);
3337 sensitive = TRUE;
3338 if (mimepart_selected) {
3339 MimeInfo *partinfo = messageview_get_selected_mime_part(mainwin->messageview);
3341 if (partinfo && (partinfo->type == MIMETYPE_MESSAGE ||
3342 partinfo->type == MIMETYPE_IMAGE ||
3343 partinfo->type == MIMETYPE_MULTIPART)) {
3344 sensitive = FALSE;
3347 cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/View/Part/AsText", sensitive);
3349 main_window_menu_callback_unblock(mainwin);
3352 void main_create_mailing_list_menu (MainWindow *mainwin, MsgInfo *msginfo)
3354 gint is_menu = 0;
3356 if (msginfo)
3357 is_menu = mailing_list_create_submenu (mainwin, msginfo);
3358 if (is_menu)
3359 cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/Message/MailingList", TRUE);
3360 else
3361 cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/Message/MailingList", FALSE);
3364 static gint mailing_list_create_submenu (MainWindow *mainwin, MsgInfo *msginfo)
3366 gint menu_nb = 0;
3367 GtkWidget *menuitem;
3369 if (!msginfo || !msginfo->extradata) {
3370 cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/Message/MailingList/Post", FALSE);
3371 cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/Message/MailingList/Help", FALSE);
3372 cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/Message/MailingList/Subscribe", FALSE);
3373 cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/Message/MailingList/Unsubscribe", FALSE);
3374 cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/Message/MailingList/ViewArchive", FALSE);
3375 cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/Message/MailingList/ContactOwner", FALSE);
3376 return 0;
3379 /* Mailing list post */
3380 if (!g_strcmp0 (msginfo->extradata->list_post, "NO")) {
3381 g_free(msginfo->extradata->list_post);
3382 msginfo->extradata->list_post = g_strdup (_("No posting allowed"));
3384 menuitem = gtk_ui_manager_get_widget(mainwin->ui_manager, "/Menu/Message/MailingList/Post");
3386 menu_nb += mailing_list_populate_submenu (menuitem, msginfo->extradata->list_post);
3388 /* Mailing list help */
3389 menuitem = gtk_ui_manager_get_widget(mainwin->ui_manager, "/Menu/Message/MailingList/Help");
3391 menu_nb += mailing_list_populate_submenu (menuitem, msginfo->extradata->list_help);
3393 /* Mailing list subscribe */
3394 menuitem = gtk_ui_manager_get_widget(mainwin->ui_manager, "/Menu/Message/MailingList/Subscribe");
3396 menu_nb += mailing_list_populate_submenu (menuitem, msginfo->extradata->list_subscribe);
3398 /* Mailing list unsubscribe */
3399 menuitem = gtk_ui_manager_get_widget(mainwin->ui_manager, "/Menu/Message/MailingList/Unsubscribe");
3401 menu_nb += mailing_list_populate_submenu (menuitem, msginfo->extradata->list_unsubscribe);
3403 /* Mailing list view archive */
3404 menuitem = gtk_ui_manager_get_widget(mainwin->ui_manager, "/Menu/Message/MailingList/ViewArchive");
3406 menu_nb += mailing_list_populate_submenu (menuitem, msginfo->extradata->list_archive);
3408 /* Mailing list contact owner */
3409 menuitem = gtk_ui_manager_get_widget(mainwin->ui_manager, "/Menu/Message/MailingList/ContactOwner");
3411 menu_nb += mailing_list_populate_submenu (menuitem, msginfo->extradata->list_owner);
3413 return menu_nb;
3416 static gint mailing_list_populate_submenu (GtkWidget *menuitem, const gchar * list_header)
3418 GtkWidget *item, *menu;
3419 const gchar *url_pt ;
3420 gchar url_decoded[BUFFSIZE];
3421 GList *children, *amenu;
3422 gint menu_nb = 0;
3424 menu = gtk_menu_item_get_submenu(GTK_MENU_ITEM(menuitem));
3426 /* First delete old submenu */
3427 /* FIXME: we can optimize this, and only change/add/delete necessary items */
3428 children = gtk_container_get_children(GTK_CONTAINER(menu));
3429 for (amenu = children; amenu; amenu = amenu->next) {
3430 item = GTK_WIDGET (amenu->data);
3431 gtk_widget_destroy (item);
3433 g_list_free(children);
3434 if (list_header) {
3435 for (url_pt = list_header; url_pt && *url_pt;) {
3436 get_url_part (&url_pt, url_decoded);
3437 item = NULL;
3438 if (!g_ascii_strncasecmp(url_decoded, "mailto:", 7)) {
3439 item = cm_menu_item_new_label_from_url ((url_decoded));
3440 g_signal_connect(G_OBJECT(item), "activate",
3441 G_CALLBACK(mailing_list_compose),
3442 NULL);
3444 else if (!g_ascii_strncasecmp(url_decoded, "http:", 5) ||
3445 !g_ascii_strncasecmp(url_decoded, "https:",6)) {
3447 item = cm_menu_item_new_label_from_url ((url_decoded));
3448 g_signal_connect(G_OBJECT(item), "activate",
3449 G_CALLBACK(mailing_list_open_uri),
3450 NULL);
3452 if (item) {
3453 gtk_menu_shell_append(GTK_MENU_SHELL(menu), item);
3454 gtk_widget_show (item);
3455 menu_nb++;
3459 if (menu_nb)
3460 gtk_widget_set_sensitive (menuitem, TRUE);
3461 else
3462 gtk_widget_set_sensitive (menuitem, FALSE);
3465 return menu_nb;
3468 static void get_url_part (const gchar **buffer, gchar *url_decoded)
3470 gchar tmp[BUFFSIZE];
3471 const gchar *buf;
3472 gint i = 0;
3473 buf = *buffer;
3474 gboolean with_plus = TRUE;
3476 if (buf == 0x00) {
3477 *url_decoded = '\0';
3478 *buffer = NULL;
3479 return;
3481 /* Ignore spaces, comments and tabs () */
3482 for (;*buf == ' ' || *buf == '(' || *buf == '\t'; buf++)
3483 if (*buf == '(')
3484 for (;*buf != ')' && *buf != 0x00; buf++);
3486 /* First non space and non comment must be a < */
3487 if (*buf =='<' ) {
3488 buf++;
3489 if (!strncmp(buf, "mailto:", strlen("mailto:")))
3490 with_plus = FALSE;
3491 for (i = 0;
3492 *buf != '>' && *buf != 0x00 && i < BUFFSIZE;
3493 tmp[i++] = *(buf++));
3494 if (*buf == 0) {
3495 *buffer = NULL;
3496 *url_decoded = '\0';
3497 return;
3499 buf++;
3501 else {
3502 *buffer = NULL;
3503 *url_decoded = '\0';
3504 return;
3507 *url_decoded = '\0';
3508 *buffer = NULL;
3510 if (i == BUFFSIZE) {
3511 return;
3513 tmp[i] = 0x00;
3514 decode_uri_with_plus (url_decoded, (const gchar *)tmp, with_plus);
3516 /* Prepare the work for the next url in the list */
3517 /* after the closing bracket >, ignore space, comments and tabs */
3518 for (;buf && *buf && (*buf == ' ' || *buf == '(' || *buf == '\t'); buf++)
3519 if (*buf == '(')
3520 for (;*buf != ')' && *buf != 0x00; buf++);
3522 if (!buf || !*buf) {
3523 *buffer = NULL;
3524 return;
3527 /* now first non space, non comment must be a comma */
3528 if (*buf != ',')
3529 for (;*buf != 0x00; buf++);
3530 else
3531 buf++;
3532 *buffer = buf;
3535 static void mailing_list_compose (GtkWidget *w, gpointer *data)
3537 const gchar *mailto;
3538 PrefsAccount *account = NULL;
3539 FolderItem *folder_item = NULL;
3541 mailto = gtk_label_get_text(GTK_LABEL (gtk_bin_get_child(GTK_BIN((w)))));
3542 if (mainwindow_get_mainwindow()) {
3543 folder_item = mainwindow_get_mainwindow()->summaryview->folder_item;
3544 if (folder_item && folder_item->prefs && folder_item->prefs->enable_default_account)
3545 account = account_find_from_id(folder_item->prefs->default_account);
3546 if (folder_item && !account)
3547 account = account_find_from_item(folder_item);
3549 if (mailto)
3550 compose_new_with_folderitem(account, folder_item, mailto+7);
3553 static void mailing_list_open_uri (GtkWidget *w, gpointer *data)
3556 const gchar *mailto;
3558 mailto = gtk_label_get_text(GTK_LABEL (gtk_bin_get_child(GTK_BIN((w)))));
3559 if (mailto)
3560 open_uri (mailto, prefs_common_get_uri_cmd());
3563 static void fix_folderview_scroll(MainWindow *mainwin)
3565 static gboolean fix_done = FALSE;
3567 if (fix_done)
3568 return;
3570 gtk_widget_queue_resize(mainwin->folderview->ctree);
3572 fix_done = TRUE;
3575 void main_window_popup(MainWindow *mainwin)
3577 static gboolean first_start = TRUE;
3579 if (!gtk_widget_get_visible(GTK_WIDGET(mainwin->window)))
3580 main_window_show(mainwin);
3582 if (prefs_common.mainwin_maximised)
3583 gtk_window_maximize(GTK_WINDOW(mainwin->window));
3585 if (first_start) {
3586 first_start = FALSE;
3587 } else {
3588 gtkut_window_popup(mainwin->window);
3591 if (prefs_common.layout_mode == SMALL_LAYOUT) {
3592 if (mainwin->in_folder) {
3593 mainwindow_enter_folder(mainwin);
3594 } else {
3595 mainwindow_exit_folder(mainwin);
3598 fix_folderview_scroll(mainwin);
3601 void main_window_show(MainWindow *mainwin)
3603 gtk_widget_show(mainwin->window);
3604 gtk_widget_show(mainwin->vbox_body);
3605 #ifndef GENERIC_UMPC
3606 gtk_window_move(GTK_WINDOW(mainwin->window),
3607 prefs_common.mainwin_x,
3608 prefs_common.mainwin_y);
3609 #endif
3612 void main_window_hide(MainWindow *mainwin)
3614 main_window_get_size(mainwin);
3615 main_window_get_position(mainwin);
3617 gtk_widget_hide(mainwin->window);
3618 gtk_widget_hide(mainwin->vbox_body);
3621 static void main_window_set_widgets(MainWindow *mainwin, LayoutType layout_mode)
3623 GtkWidget *folderwin = NULL;
3624 GtkWidget *messagewin = NULL;
3625 GtkWidget *hpaned;
3626 GtkWidget *vpaned;
3627 GtkWidget *vbox_body = mainwin->vbox_body;
3628 gboolean first_set = (mainwin->hpaned == NULL);
3629 debug_print("Setting widgets...\n");
3631 #ifndef GENERIC_UMPC
3632 mainwin->messageview->statusbar = mainwin->statusbar;
3633 mainwin->messageview->statusbar_cid = mainwin->messageview_cid;
3634 #endif
3635 /* clean top-most container */
3636 if (mainwin->hpaned) {
3637 if (gtk_widget_get_parent(mainwin->hpaned) == mainwin->vpaned)
3638 gtk_widget_destroy(mainwin->vpaned);
3639 else
3640 gtk_widget_destroy(mainwin->hpaned);
3643 cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/View/ShowHide/MessageView",
3644 (layout_mode != WIDE_MSGLIST_LAYOUT && layout_mode != SMALL_LAYOUT));
3645 switch (layout_mode) {
3646 case VERTICAL_LAYOUT:
3647 case NORMAL_LAYOUT:
3648 case SMALL_LAYOUT:
3649 hpaned = gtk_paned_new(GTK_ORIENTATION_HORIZONTAL);
3650 if (layout_mode == VERTICAL_LAYOUT)
3651 vpaned = gtk_paned_new(GTK_ORIENTATION_HORIZONTAL);
3652 else
3653 vpaned = gtk_paned_new(GTK_ORIENTATION_VERTICAL);
3654 gtk_box_pack_start(GTK_BOX(vbox_body), hpaned, TRUE, TRUE, 0);
3655 gtk_paned_add1(GTK_PANED(hpaned),
3656 GTK_WIDGET_PTR(mainwin->folderview));
3657 gtk_widget_show(hpaned);
3659 if (messageview_is_visible(mainwin->messageview)) {
3660 gtk_paned_add2(GTK_PANED(hpaned), vpaned);
3661 gtk_paned_pack1(GTK_PANED(vpaned),
3662 GTK_WIDGET_PTR(mainwin->summaryview), TRUE, TRUE);
3663 } else {
3664 gtk_paned_add2(GTK_PANED(hpaned),
3665 GTK_WIDGET_PTR(mainwin->summaryview));
3666 g_object_ref(vpaned);
3668 gtk_paned_add2(GTK_PANED(vpaned),
3669 GTK_WIDGET_PTR(mainwin->messageview));
3670 gtk_widget_show(vpaned);
3671 if (layout_mode == SMALL_LAYOUT && first_set) {
3672 mainwin_paned_show_first(GTK_PANED(hpaned));
3675 gtk_paned_set_position(GTK_PANED(hpaned),
3676 prefs_common_get_prefs()->folderview_width);
3678 if (layout_mode == NORMAL_LAYOUT &&
3679 messageview_is_visible(mainwin->messageview)) {
3680 gtk_paned_set_position(GTK_PANED(vpaned),
3681 prefs_common_get_prefs()->summaryview_height);
3683 if (layout_mode == VERTICAL_LAYOUT &&
3684 messageview_is_visible(mainwin->messageview)) {
3685 gtk_paned_set_position(GTK_PANED(vpaned),
3686 prefs_common_get_prefs()->summaryview_width);
3689 break;
3690 case WIDE_LAYOUT:
3691 vpaned = gtk_paned_new(GTK_ORIENTATION_VERTICAL);
3692 hpaned = gtk_paned_new(GTK_ORIENTATION_HORIZONTAL);
3693 gtk_box_pack_start(GTK_BOX(vbox_body), vpaned, TRUE, TRUE, 0);
3694 gtk_paned_add1(GTK_PANED(vpaned), hpaned);
3696 gtk_paned_add1(GTK_PANED(hpaned),
3697 GTK_WIDGET_PTR(mainwin->folderview));
3698 gtk_paned_add2(GTK_PANED(hpaned),
3699 GTK_WIDGET_PTR(mainwin->summaryview));
3701 gtk_widget_show(hpaned);
3703 if (messageview_is_visible(mainwin->messageview)) {
3704 gtk_paned_add2(GTK_PANED(vpaned),
3705 GTK_WIDGET_PTR(mainwin->messageview));
3706 } else {
3707 g_object_ref(GTK_WIDGET_PTR(mainwin->messageview));
3709 gtk_widget_show(vpaned);
3711 gtk_paned_set_position(GTK_PANED(hpaned),
3712 prefs_common_get_prefs()->folderview_width);
3714 if (messageview_is_visible(mainwin->messageview)) {
3715 gtk_paned_set_position(GTK_PANED(vpaned),
3716 prefs_common_get_prefs()->summaryview_height);
3719 break;
3720 case WIDE_MSGLIST_LAYOUT:
3721 vpaned = gtk_paned_new(GTK_ORIENTATION_VERTICAL);
3722 hpaned = gtk_paned_new(GTK_ORIENTATION_HORIZONTAL);
3723 gtk_box_pack_start(GTK_BOX(vbox_body), vpaned, TRUE, TRUE, 0);
3725 gtk_paned_add1(GTK_PANED(vpaned),
3726 GTK_WIDGET_PTR(mainwin->summaryview));
3727 gtk_paned_add1(GTK_PANED(hpaned),
3728 GTK_WIDGET_PTR(mainwin->folderview));
3730 gtk_widget_show(hpaned);
3732 if (messageview_is_visible(mainwin->messageview)) {
3733 gtk_paned_add2(GTK_PANED(hpaned),
3734 GTK_WIDGET_PTR(mainwin->messageview));
3735 } else {
3736 g_object_ref(GTK_WIDGET_PTR(mainwin->messageview));
3738 gtk_paned_add2(GTK_PANED(vpaned), hpaned);
3739 gtk_widget_show(vpaned);
3741 gtk_paned_set_position(GTK_PANED(hpaned),
3742 prefs_common_get_prefs()->folderview_width);
3743 gtk_paned_set_position(GTK_PANED(vpaned),
3744 prefs_common_get_prefs()->summaryview_height);
3746 break;
3747 default:
3748 g_warning("unknown layout");
3749 return;
3752 mainwin->hpaned = hpaned;
3753 mainwin->vpaned = vpaned;
3755 if (layout_mode == SMALL_LAYOUT) {
3756 if (mainwin->messageview->visible)
3757 main_window_toggle_message_view(mainwin);
3760 if (layout_mode == SMALL_LAYOUT && first_set) {
3761 gtk_widget_realize(mainwin->window);
3762 gtk_widget_realize(mainwin->folderview->ctree);
3763 gtk_widget_realize(mainwin->summaryview->hbox);
3764 gtk_widget_realize(mainwin->summaryview->hbox_l);
3765 gtk_paned_set_position(GTK_PANED(mainwin->hpaned), 800);
3766 } else {
3767 gtk_window_set_default_size(GTK_WINDOW(mainwin->window),
3768 prefs_common.mainwin_width,
3769 prefs_common.mainwin_height);
3771 /* remove headerview if not in prefs */
3772 headerview_set_visibility(mainwin->messageview->headerview,
3773 prefs_common.display_header_pane);
3775 if (messageview_is_visible(mainwin->messageview))
3776 gtk_image_set_from_icon_name(GTK_IMAGE(mainwin->summaryview->toggle_arrow),
3777 "pan-down-symbolic", GTK_ICON_SIZE_MENU);
3778 else
3779 gtk_image_set_from_icon_name(GTK_IMAGE(mainwin->summaryview->toggle_arrow),
3780 "pan-up-symbolic", GTK_ICON_SIZE_MENU);
3782 gtk_window_move(GTK_WINDOW(mainwin->window),
3783 prefs_common.mainwin_x,
3784 prefs_common.mainwin_y);
3786 /* CLAWS: previous "gtk_widget_show_all" makes noticeview
3787 * and mimeview icon list/ctree lose track of their visibility states */
3788 if (!noticeview_is_visible(mainwin->messageview->noticeview))
3789 gtk_widget_hide(GTK_WIDGET_PTR(mainwin->messageview->noticeview));
3790 if (!noticeview_is_visible(mainwin->messageview->mimeview->siginfoview))
3791 gtk_widget_hide(GTK_WIDGET_PTR(mainwin->messageview->mimeview->siginfoview));
3792 if (mainwin->messageview->mimeview->ctree_mode)
3793 gtk_widget_hide(mainwin->messageview->mimeview->icon_mainbox);
3794 else
3795 gtk_widget_hide(mainwin->messageview->mimeview->ctree_mainbox);
3797 prefs_common.layout_mode = layout_mode;
3799 cm_toggle_menu_set_active_full(mainwin->ui_manager, "Menu/View/ShowHide/MessageView",
3800 messageview_is_visible(mainwin->messageview));
3802 #ifndef GENERIC_UMPC
3803 switch (prefs_common.layout_mode) {
3804 case NORMAL_LAYOUT:
3805 cm_toggle_menu_set_active_full(mainwin->ui_manager, "Menu/View/Layout/Standard", TRUE);
3806 break;
3807 case VERTICAL_LAYOUT:
3808 cm_toggle_menu_set_active_full(mainwin->ui_manager, "Menu/View/Layout/ThreeColumns", TRUE);
3809 break;
3810 case WIDE_LAYOUT:
3811 cm_toggle_menu_set_active_full(mainwin->ui_manager, "Menu/View/Layout/WideMessage", TRUE);
3812 break;
3813 case WIDE_MSGLIST_LAYOUT:
3814 cm_toggle_menu_set_active_full(mainwin->ui_manager, "Menu/View/Layout/WideMessageList", TRUE);
3815 break;
3816 case SMALL_LAYOUT:
3817 cm_toggle_menu_set_active_full(mainwin->ui_manager, "Menu/View/Layout/SmallScreen", TRUE);
3818 break;
3820 #endif
3822 if (folderwin) {
3823 g_signal_connect
3824 (G_OBJECT(folderwin), "size_allocate",
3825 G_CALLBACK(folder_window_size_allocate_cb),
3826 mainwin);
3828 if (messagewin) {
3829 g_signal_connect
3830 (G_OBJECT(messagewin), "size_allocate",
3831 G_CALLBACK(message_window_size_allocate_cb),
3832 mainwin);
3835 debug_print("Setting widgets done.\n");
3838 void main_window_destroy_all(void)
3840 while (mainwin_list != NULL) {
3841 MainWindow *mainwin = (MainWindow*)mainwin_list->data;
3843 /* free toolbar stuff */
3844 toolbar_clear_list(TOOLBAR_MAIN);
3845 toolbar_destroy(mainwin->toolbar);
3847 summaryview_destroy(mainwin->summaryview);
3848 mainwin->folderview->mainwin = NULL;
3849 mainwin->summaryview->mainwin = NULL;
3850 mainwin->messageview->mainwin = NULL;
3852 g_free(mainwin->toolbar);
3853 g_free(mainwin);
3855 mainwin_list = g_list_remove(mainwin_list, mainwin);
3857 g_list_free(mainwin_list);
3858 mainwin_list = NULL;
3861 #ifndef GENERIC_UMPC
3862 static gboolean ac_label_button_pressed(GtkWidget *widget, GdkEventButton *event,
3863 gpointer data)
3865 MainWindow *mainwin = (MainWindow *)data;
3866 GtkWidget *menu = NULL;
3868 if (!event) return FALSE;
3870 gtk_button_set_relief(GTK_BUTTON(widget), GTK_RELIEF_NORMAL);
3872 menu = gtk_menu_item_get_submenu(GTK_MENU_ITEM(mainwin->ac_menu));
3874 gtk_menu_popup_at_widget(GTK_MENU(menu), widget, 3, 3, NULL);
3876 return TRUE;
3878 #endif
3879 static gint main_window_close_cb(GtkWidget *widget, GdkEventAny *event,
3880 gpointer data)
3882 MainWindow *mainwin = (MainWindow *)data;
3883 gboolean close_allowed = TRUE;
3885 hooks_invoke(MAIN_WINDOW_CLOSE, &close_allowed);
3887 if (close_allowed && mainwin->lock_count == 0)
3888 app_exit_cb(NULL, data);
3890 return TRUE;
3893 static void main_window_size_allocate_cb(GtkWidget *widget,
3894 GtkAllocation *allocation,
3895 gpointer data)
3897 MainWindow *mainwin = (MainWindow *)data;
3898 main_window_get_size(mainwin);
3901 static void folder_window_size_allocate_cb(GtkWidget *widget,
3902 GtkAllocation *allocation,
3903 gpointer data)
3905 MainWindow *mainwin = (MainWindow *)data;
3907 main_window_get_size(mainwin);
3910 static void message_window_size_allocate_cb(GtkWidget *widget,
3911 GtkAllocation *allocation,
3912 gpointer data)
3914 MainWindow *mainwin = (MainWindow *)data;
3916 main_window_get_size(mainwin);
3919 static void add_mailbox_cb(GtkAction *action, gpointer data)
3921 MainWindow *mainwin = (MainWindow *)data;
3922 main_window_add_mailbox(mainwin);
3925 static void update_folderview_cb(GtkAction *action, gpointer data)
3927 MainWindow *mainwin = (MainWindow *)data;
3928 summary_show(mainwin->summaryview, NULL, FALSE);
3929 folderview_check_new_all();
3932 static void foldersort_cb(GtkAction *action, gpointer data)
3934 foldersort_open();
3937 static void import_mbox_cb(GtkAction *action, gpointer data)
3939 MainWindow *mainwin = (MainWindow *)data;
3940 /* only notify if import has failed */
3941 if (import_mbox(mainwin->summaryview->folder_item) == -1) {
3942 alertpanel_error(_("Mbox import has failed."));
3946 static void export_mbox_cb(GtkAction *action, gpointer data)
3948 MainWindow *mainwin = (MainWindow *)data;
3949 /* only notify if export has failed */
3950 if (export_mbox(mainwin->summaryview->folder_item) == -1) {
3951 alertpanel_error(_("Export to mbox has failed."));
3955 static void export_list_mbox_cb(GtkAction *action, gpointer data)
3957 MainWindow *mainwin = (MainWindow *)data;
3958 /* only notify if export has failed */
3959 if (summaryview_export_mbox_list(mainwin->summaryview) == -1) {
3960 alertpanel_error(_("Export to mbox has failed."));
3964 static void empty_trash_cb(GtkAction *action, gpointer data)
3966 MainWindow *mainwin = (MainWindow *)data;
3967 main_window_empty_trash(mainwin, TRUE, FALSE);
3970 static void save_as_cb(GtkAction *action, gpointer data)
3972 MainWindow *mainwin = (MainWindow *)data;
3973 summary_save_as(mainwin->summaryview);
3976 static void print_cb(GtkAction *action, gpointer data)
3978 MainWindow *mainwin = (MainWindow *)data;
3979 summary_print(mainwin->summaryview);
3982 static void page_setup_cb(GtkAction *action, gpointer data)
3984 MainWindow *mainwin = (MainWindow *)data;
3985 GtkWindow *win;
3987 win = (mainwin ? GTK_WINDOW(mainwin->window) : NULL);
3989 printing_page_setup(win);
3992 static void app_exit_cb(GtkAction *action, gpointer data)
3994 MainWindow *mainwin = (MainWindow *)data;
3995 if (prefs_common.clean_on_exit) {
3996 if (!main_window_empty_trash(mainwin, prefs_common.ask_on_clean, TRUE))
3997 return;
4000 if (prefs_common.confirm_on_exit) {
4001 if (alertpanel(_("Exit"), _("Exit Claws Mail?"),
4002 NULL, _("_Cancel"), NULL, _("_Quit"),
4003 NULL, NULL, ALERTFOCUS_FIRST)
4004 != G_ALERTALTERNATE)
4005 return;
4006 manage_window_focus_in(mainwin->window, NULL, NULL);
4009 app_will_exit(NULL, mainwin);
4012 static void search_cb(GtkAction *action, gpointer data)
4014 MainWindow *mainwin = (MainWindow *)data;
4015 message_search(mainwin->messageview);
4018 static void search_folder_cb(GtkAction *action, gpointer data)
4020 MainWindow *mainwin = (MainWindow *)data;
4021 FolderItem *item = mainwin->summaryview->folder_item;
4022 cm_return_if_fail(item != NULL);
4023 summary_search(mainwin->summaryview);
4026 static void mainwindow_quicksearch(GtkAction *action, gpointer data)
4028 MainWindow *mainwin = (MainWindow *)data;
4029 summaryview_activate_quicksearch(mainwin->summaryview, TRUE);
4032 static void toggle_message_cb(GtkAction *action, gpointer data)
4034 MainWindow *mainwin = (MainWindow *)data;
4035 gboolean active;
4037 active = gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (action));
4039 if (active != messageview_is_visible(mainwin->messageview))
4040 summary_toggle_view(mainwin->summaryview);
4043 static void toggle_toolbar_cb(GtkAction *action, GtkRadioAction *current, gpointer data)
4045 gint value = gtk_radio_action_get_current_value (GTK_RADIO_ACTION (current));
4046 MainWindow *mainwin = (MainWindow *)data;
4047 toolbar_toggle(value, mainwin);
4050 static void main_window_reply_cb(GtkAction *gaction, gpointer data)
4052 MainWindow *mainwin = (MainWindow *)data;
4053 MessageView *msgview = (MessageView*)mainwin->messageview;
4054 GSList *msginfo_list = NULL;
4055 gint action = COMPOSE_REPLY;
4056 const gchar *a_name = gtk_action_get_name(gaction);
4058 DO_ACTION("Message/Reply", COMPOSE_REPLY);
4059 DO_ACTION("Message/ReplyTo/All", COMPOSE_REPLY_TO_ALL);
4060 DO_ACTION("Message/ReplyTo/Sender", COMPOSE_REPLY_TO_SENDER);
4061 DO_ACTION("Message/ReplyTo/List", COMPOSE_REPLY_TO_LIST);
4062 DO_ACTION("Message/Forward", COMPOSE_FORWARD_INLINE);
4063 DO_ACTION("Message/ForwardAtt", COMPOSE_FORWARD_AS_ATTACH);
4064 DO_ACTION("Message/Redirect", COMPOSE_REDIRECT);
4065 DO_ACTION("Message/FollowupReply", COMPOSE_FOLLOWUP_AND_REPLY_TO);
4067 cm_return_if_fail(msgview != NULL);
4069 msginfo_list = summary_get_selection(mainwin->summaryview);
4070 cm_return_if_fail(msginfo_list != NULL);
4072 if (!summary_has_opened_message(mainwin->summaryview)) {
4073 compose_reply_from_messageview(NULL, msginfo_list, action);
4074 } else if (summary_is_opened_message_selected(mainwin->summaryview)) {
4075 compose_reply_from_messageview(msgview, msginfo_list, action);
4076 } else {
4077 compose_reply_from_messageview(msgview, NULL, action);
4080 g_slist_free(msginfo_list);
4083 static void toggle_col_headers_cb(GtkAction *gaction, gpointer data)
4085 MainWindow *mainwin = (MainWindow *)data;
4086 FolderView *folderview = mainwin->folderview;
4087 SummaryView *summaryview = mainwin->summaryview;
4088 MimeView *mimeview = mainwin->messageview->mimeview;
4090 if (gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (gaction))) {
4091 gtk_cmclist_column_titles_show(GTK_CMCLIST(folderview->ctree));
4092 gtk_cmclist_column_titles_show(GTK_CMCLIST(summaryview->ctree));
4093 gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(mimeview->ctree), TRUE);
4094 prefs_common.show_col_headers = TRUE;
4095 } else {
4096 gtk_cmclist_column_titles_hide(GTK_CMCLIST(folderview->ctree));
4097 gtk_cmclist_column_titles_hide(GTK_CMCLIST(summaryview->ctree));
4098 gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(mimeview->ctree), FALSE);
4099 prefs_common.show_col_headers = FALSE;
4103 #ifndef GENERIC_UMPC
4104 static void toggle_statusbar_cb(GtkAction *gaction, gpointer data)
4106 MainWindow *mainwin = (MainWindow *)data;
4107 if (gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (gaction))) {
4108 gtk_widget_show(mainwin->hbox_stat);
4109 prefs_common.show_statusbar = TRUE;
4110 } else {
4111 gtk_widget_hide(mainwin->hbox_stat);
4112 prefs_common.show_statusbar = FALSE;
4116 static void set_layout_cb(GtkAction *action, GtkRadioAction *current, gpointer data)
4118 MainWindow *mainwin = (MainWindow *)data;
4119 gint value = gtk_radio_action_get_current_value (GTK_RADIO_ACTION (current));
4120 LayoutType layout_mode = value;
4121 LayoutType old_layout_mode = prefs_common.layout_mode;
4122 if (mainwin->menu_lock_count) {
4123 return;
4125 if (!gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (current))) {
4126 return;
4129 if (layout_mode == prefs_common.layout_mode) {
4130 return;
4133 if (!mainwin->messageview->visible && layout_mode != SMALL_LAYOUT)
4134 main_window_toggle_message_view(mainwin);
4135 else if (mainwin->messageview->visible && layout_mode == SMALL_LAYOUT)
4136 main_window_toggle_message_view(mainwin);
4138 main_window_separation_change(mainwin, layout_mode);
4139 mainwindow_reset_paned(GTK_PANED(mainwin->vpaned));
4140 if (old_layout_mode == SMALL_LAYOUT && layout_mode != SMALL_LAYOUT) {
4141 mainwindow_reset_paned(GTK_PANED(mainwin->hpaned));
4142 if (layout_mode == VERTICAL_LAYOUT)
4143 mainwindow_reset_paned(GTK_PANED(mainwin->vpaned));
4145 if (old_layout_mode != SMALL_LAYOUT && layout_mode == SMALL_LAYOUT) {
4146 mainwin_paned_show_first(GTK_PANED(mainwin->hpaned));
4147 mainwindow_exit_folder(mainwin);
4149 summary_relayout(mainwin->summaryview);
4150 summary_update_unread(mainwin->summaryview, NULL);
4152 #endif
4154 void main_window_toggle_work_offline (MainWindow *mainwin, gboolean offline,
4155 gboolean ask_sync)
4157 static gboolean switching = FALSE;
4159 if (switching)
4160 return;
4162 switching = TRUE;
4164 offline_ask_sync = ask_sync;
4165 if (offline)
4166 online_switch_clicked (GTK_BUTTON(mainwin->online_switch), mainwin);
4167 else
4168 online_switch_clicked (GTK_BUTTON(mainwin->offline_switch), mainwin);
4169 offline_ask_sync = TRUE;
4171 inc_reset_offline_override_timers();
4173 switching = FALSE;
4176 static void toggle_work_offline_cb (GtkAction *action, gpointer data)
4178 MainWindow *mainwin = (MainWindow *)data;
4179 main_window_toggle_work_offline(mainwin, gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (action)), TRUE);
4182 static gboolean any_folder_want_synchronise(void)
4184 GList *folderlist = folder_get_list();
4186 /* see if there are synchronised folders */
4187 for (; folderlist; folderlist = folderlist->next) {
4188 Folder *folder = (Folder *)folderlist->data;
4189 if (folder_want_synchronise(folder)) {
4190 return TRUE;
4194 return FALSE;
4197 static void mainwindow_check_synchronise(MainWindow *mainwin, gboolean ask)
4200 if (!any_folder_want_synchronise())
4201 return;
4203 if (offline_ask_sync && ask && alertpanel(_("Folder synchronisation"),
4204 _("Do you want to synchronise your folders now?"),
4205 NULL, _("_Cancel"), NULL, _("_Synchronise"), NULL, NULL,
4206 ALERTFOCUS_SECOND) != G_ALERTALTERNATE)
4207 return;
4209 if (offline_ask_sync)
4210 folder_synchronise(NULL);
4213 static void online_switch_clicked (GtkButton *btn, gpointer data)
4215 MainWindow *mainwin;
4216 gboolean have_connectivity;
4218 #ifdef HAVE_NETWORKMANAGER_SUPPORT
4219 have_connectivity = networkmanager_is_online(NULL);
4220 #else
4221 have_connectivity = TRUE;
4222 #endif
4224 mainwin = (MainWindow *) data;
4226 cm_return_if_fail(mainwin != NULL);
4228 if (btn == GTK_BUTTON(mainwin->online_switch)) {
4229 #ifndef GENERIC_UMPC
4230 gtk_widget_hide (mainwin->online_switch);
4231 gtk_widget_show (mainwin->offline_switch);
4232 #endif
4233 cm_toggle_menu_set_active_full(mainwin->ui_manager, "Menu/File/OfflineMode", TRUE);
4235 inc_autocheck_timer_remove();
4237 /* go offline */
4238 if (prefs_common.work_offline)
4239 return;
4241 if(have_connectivity)
4242 mainwindow_check_synchronise(mainwin, TRUE);
4243 prefs_common.work_offline = TRUE;
4244 imap_disconnect_all(have_connectivity);
4245 nntp_disconnect_all(have_connectivity);
4246 hooks_invoke(OFFLINE_SWITCH_HOOKLIST, NULL);
4247 } else {
4248 /*go online */
4249 if (!prefs_common.work_offline)
4250 return;
4251 #ifndef GENERIC_UMPC
4252 gtk_widget_hide (mainwin->offline_switch);
4253 gtk_widget_show (mainwin->online_switch);
4254 #endif
4255 cm_toggle_menu_set_active_full(mainwin->ui_manager, "Menu/File/OfflineMode", FALSE);
4256 prefs_common.work_offline = FALSE;
4257 inc_autocheck_timer_set();
4258 refresh_resolvers();
4259 hooks_invoke(OFFLINE_SWITCH_HOOKLIST, NULL);
4263 static void addressbook_open_cb(GtkAction *action, gpointer data)
4265 #ifndef USE_ALT_ADDRBOOK
4266 addressbook_open(NULL);
4267 #else
4268 GError* error = NULL;
4270 addressbook_dbus_open(FALSE, &error);
4271 if (error) {
4272 g_warning("failed to open address book: %s", error->message);
4273 g_error_free(error);
4275 #endif
4278 static void log_window_show_cb(GtkAction *action, gpointer data)
4280 MainWindow *mainwin = (MainWindow *)data;
4281 log_window_show(mainwin->logwin);
4284 static void filtering_debug_window_show_cb(GtkAction *action, gpointer data)
4286 MainWindow *mainwin = (MainWindow *)data;
4287 log_window_show(mainwin->filtering_debugwin);
4290 #ifdef G_OS_WIN32
4291 static void debug_log_show_cb(GtkAction *action, gpointer data)
4293 GError *error = NULL;
4294 gchar *logpath8 = win32_debug_log_path();
4295 gunichar2 *logpath16;
4297 debug_print("opening '%s'\n", logpath8);
4299 logpath16 = g_utf8_to_utf16(logpath8, -1, NULL, NULL, &error);
4301 if (error != NULL) {
4302 g_warning("couldn't convert debug log path '%s' to UTF-16: %s",
4303 logpath8, error->message);
4304 g_error_free(error);
4305 g_free(logpath16);
4306 return;
4309 HINSTANCE ret = ShellExecute(NULL, NULL, (LPCWSTR)logpath16,
4310 NULL, NULL, SW_SHOW);
4312 g_free(logpath8);
4313 g_free(logpath16);
4314 debug_print("ShellExecute result: %"G_GSIZE_FORMAT"\n", (gsize)ret);
4316 #endif
4318 static void inc_cancel_cb(GtkAction *action, gpointer data)
4320 inc_cancel_all();
4321 imap_cancel_all();
4324 static void send_cancel_cb(GtkAction *action, gpointer data)
4326 send_cancel();
4329 static void move_to_cb(GtkAction *action, gpointer data)
4331 MainWindow *mainwin = (MainWindow *)data;
4332 summary_move_to(mainwin->summaryview);
4335 static void copy_to_cb(GtkAction *action, gpointer data)
4337 MainWindow *mainwin = (MainWindow *)data;
4338 summary_copy_to(mainwin->summaryview);
4341 static void delete_cb(GtkAction *action, gpointer data)
4343 MainWindow *mainwin = (MainWindow *)data;
4344 summary_delete(mainwin->summaryview);
4347 static void delete_trash_cb(GtkAction *action, gpointer data)
4349 MainWindow *mainwin = (MainWindow *)data;
4350 summary_delete_trash(mainwin->summaryview);
4353 static void cancel_cb(GtkAction *action, gpointer data)
4355 MainWindow *mainwin = (MainWindow *)data;
4356 summary_cancel(mainwin->summaryview);
4359 static void open_msg_cb(GtkAction *action, gpointer data)
4361 MainWindow *mainwin = (MainWindow *)data;
4362 summary_open_msg(mainwin->summaryview);
4365 static void view_source_cb(GtkAction *action, gpointer data)
4367 MainWindow *mainwin = (MainWindow *)data;
4368 summary_view_source(mainwin->summaryview);
4371 static void show_all_header_cb(GtkAction *action, gpointer data)
4373 MainWindow *mainwin = (MainWindow *)data;
4374 if (mainwin->menu_lock_count) return;
4375 prefs_common.show_all_headers =
4376 gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (action));
4377 summary_display_msg_selected(mainwin->summaryview,
4378 gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (action)));
4381 static void toggle_fullscreen_cb(GtkAction *action, gpointer data)
4383 MainWindow *mainwin = (MainWindow *)data;
4384 if (mainwin->menu_lock_count) return;
4385 if (!gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (action))) {
4386 gtk_window_unfullscreen(GTK_WINDOW(mainwin->window));
4387 prefs_common.mainwin_fullscreen = FALSE;
4389 else {
4390 prefs_common.mainwin_fullscreen = TRUE;
4391 gtk_window_fullscreen(GTK_WINDOW(mainwin->window));
4395 static void toggle_menubar_cb(GtkAction *action, gpointer data)
4397 MainWindow *mainwin = (MainWindow *)data;
4398 if (mainwin->menu_lock_count) return;
4399 if (!gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (action))) {
4400 gtk_widget_hide(GTK_WIDGET(mainwin->menubar));
4401 prefs_common.mainwin_menubar = FALSE;
4402 } else {
4403 gtk_widget_show(GTK_WIDGET(mainwin->menubar));
4404 prefs_common.mainwin_menubar = TRUE;
4408 static void hide_quotes_cb(GtkAction *action, gpointer data)
4410 MainWindow *mainwin = (MainWindow *)data;
4412 if (mainwin->menu_lock_count) return;
4414 if (gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (action))) {
4415 const gchar *a_name = gtk_action_get_name(GTK_ACTION(action));
4416 if (!strcmp(a_name, "View/Quotes/CollapseAll")) prefs_common.hide_quotes = 1;
4417 else if (!strcmp(a_name, "View/Quotes/Collapse2")) prefs_common.hide_quotes = 2;
4418 else if (!strcmp(a_name, "View/Quotes/Collapse3")) prefs_common.hide_quotes = 3;
4419 } else
4420 prefs_common.hide_quotes = 0;
4422 mainwin->menu_lock_count++;
4423 cm_toggle_menu_set_active_full(mainwin->ui_manager, "Menu/View/Quotes/CollapseAll", (prefs_common.hide_quotes == 1));
4424 cm_toggle_menu_set_active_full(mainwin->ui_manager, "Menu/View/Quotes/Collapse2", (prefs_common.hide_quotes == 2));
4425 cm_toggle_menu_set_active_full(mainwin->ui_manager, "Menu/View/Quotes/Collapse3", (prefs_common.hide_quotes == 3));
4426 mainwin->menu_lock_count--;
4428 summary_redisplay_msg(mainwin->summaryview);
4431 static void mark_cb(GtkAction *action, gpointer data)
4433 MainWindow *mainwin = (MainWindow *)data;
4434 summary_mark(mainwin->summaryview);
4437 static void unmark_cb(GtkAction *action, gpointer data)
4439 MainWindow *mainwin = (MainWindow *)data;
4440 summary_unmark(mainwin->summaryview);
4443 static void mark_as_read_cb(GtkAction *action, gpointer data)
4445 MainWindow *mainwin = (MainWindow *)data;
4446 summary_mark_as_read(mainwin->summaryview);
4449 static void mark_as_unread_cb(GtkAction *action, gpointer data)
4451 MainWindow *mainwin = (MainWindow *)data;
4452 summary_mark_as_unread(mainwin->summaryview);
4455 static void mark_all_read_cb(GtkAction *action, gpointer data)
4457 MainWindow *mainwin = (MainWindow *)data;
4458 summary_mark_all_read(mainwin->summaryview, TRUE);
4461 static void mark_all_unread_cb(GtkAction *action, gpointer data)
4463 MainWindow *mainwin = (MainWindow *)data;
4464 summary_mark_all_unread(mainwin->summaryview, TRUE);
4467 static void mark_as_spam_cb(GtkAction *action, gpointer data)
4469 MainWindow *mainwin = (MainWindow *)data;
4470 summary_mark_as_spam(mainwin->summaryview, TRUE, NULL);
4473 static void mark_as_ham_cb(GtkAction *action, gpointer data)
4475 MainWindow *mainwin = (MainWindow *)data;
4476 summary_mark_as_spam(mainwin->summaryview, FALSE, NULL);
4479 static void ignore_thread_cb(GtkAction *action, gpointer data)
4481 MainWindow *mainwin = (MainWindow *)data;
4482 summary_ignore_thread(mainwin->summaryview);
4485 static void unignore_thread_cb(GtkAction *action, gpointer data)
4487 MainWindow *mainwin = (MainWindow *)data;
4488 summary_unignore_thread(mainwin->summaryview);
4491 static void watch_thread_cb(GtkAction *action, gpointer data)
4493 MainWindow *mainwin = (MainWindow *)data;
4494 summary_watch_thread(mainwin->summaryview);
4497 static void unwatch_thread_cb(GtkAction *action, gpointer data)
4499 MainWindow *mainwin = (MainWindow *)data;
4500 summary_unwatch_thread(mainwin->summaryview);
4503 static void lock_msgs_cb(GtkAction *action, gpointer data)
4505 MainWindow *mainwin = (MainWindow *)data;
4506 summary_msgs_lock(mainwin->summaryview);
4509 static void unlock_msgs_cb(GtkAction *action, gpointer data)
4511 MainWindow *mainwin = (MainWindow *)data;
4512 summary_msgs_unlock(mainwin->summaryview);
4516 static void reedit_cb(GtkAction *action, gpointer data)
4518 MainWindow *mainwin = (MainWindow *)data;
4519 summary_reedit(mainwin->summaryview);
4522 static void open_urls_cb(GtkAction *action, gpointer data)
4524 MainWindow *mainwin = (MainWindow *)data;
4525 if (!mainwin->summaryview->displayed && mainwin->summaryview->selected) {
4526 summary_display_msg_selected(mainwin->summaryview,
4527 prefs_common.show_all_headers);
4529 messageview_list_urls(mainwin->messageview);
4532 static void add_address_cb(GtkAction *action, gpointer data)
4534 MainWindow *mainwin = (MainWindow *)data;
4535 summary_add_address(mainwin->summaryview);
4538 static void set_charset_cb(GtkAction *action, GtkRadioAction *current, gpointer data)
4540 MainWindow *mainwin = (MainWindow *)data;
4541 gint value = gtk_radio_action_get_current_value (GTK_RADIO_ACTION (current));
4542 const gchar *str;
4544 if (gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (current))) {
4545 str = conv_get_charset_str((CharSet)value);
4547 g_free(mainwin->messageview->forced_charset);
4548 mainwin->messageview->forced_charset = str ? g_strdup(str) : NULL;
4549 procmime_force_charset(str);
4551 summary_redisplay_msg(mainwin->summaryview);
4553 debug_print("forced charset: %s\n", str ? str : "Auto-Detect");
4557 static void set_decode_cb(GtkAction *action, GtkRadioAction *current, gpointer data)
4559 MainWindow *mainwin = (MainWindow *)data;
4560 gint value = gtk_radio_action_get_current_value (GTK_RADIO_ACTION (current));
4561 if (gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (current))) {
4562 mainwin->messageview->forced_encoding = (EncodingType)value;
4564 summary_redisplay_msg(mainwin->summaryview);
4566 debug_print("forced encoding: %d\n", value);
4570 static void hide_read_messages (GtkAction *action, gpointer data)
4572 MainWindow *mainwin = (MainWindow *)data;
4573 GtkWidget *menuitem = gtk_ui_manager_get_widget(mainwin->ui_manager, "/Menu/View/HideReadMessages");
4574 if (!mainwin->summaryview->folder_item
4575 || g_object_get_data(G_OBJECT(menuitem), "dont_toggle"))
4576 return;
4577 summary_toggle_show_read_messages(mainwin->summaryview);
4580 static void hide_del_messages (GtkAction *action, gpointer data)
4582 MainWindow *mainwin = (MainWindow *)data;
4583 GtkWidget *menuitem = gtk_ui_manager_get_widget(mainwin->ui_manager, "/Menu/View/HideDelMessages");
4584 if (!mainwin->summaryview->folder_item
4585 || g_object_get_data(G_OBJECT(menuitem), "dont_toggle"))
4586 return;
4587 summary_toggle_show_del_messages(mainwin->summaryview);
4590 static void hide_read_threads (GtkAction *action, gpointer data)
4592 MainWindow *mainwin = (MainWindow *)data;
4593 GtkWidget *menuitem = gtk_ui_manager_get_widget(mainwin->ui_manager, "/Menu/View/HideReadThreads");
4594 if (!mainwin->summaryview->folder_item
4595 || g_object_get_data(G_OBJECT(menuitem), "dont_toggle"))
4596 return;
4597 summary_toggle_show_read_threads(mainwin->summaryview);
4600 static void thread_cb(GtkAction *action, gpointer data)
4602 MainWindow *mainwin = (MainWindow *)data;
4603 gboolean threaded = FALSE;
4604 guint selected_msgnum = 0;
4606 if (mainwin->menu_lock_count) return;
4607 if (!mainwin->summaryview->folder_item) return;
4609 main_window_cursor_wait(mainwin);
4611 selected_msgnum = summary_get_msgnum(mainwin->summaryview, mainwin->summaryview->selected);
4613 threaded = gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (action));
4615 mainwin->summaryview->folder_item->threaded = threaded;
4617 mainwin->summaryview->threaded = threaded;
4619 summary_show(mainwin->summaryview,
4620 mainwin->summaryview->folder_item, FALSE);
4621 summary_select_by_msgnum(mainwin->summaryview, selected_msgnum, FALSE);
4623 main_window_cursor_normal(mainwin);
4626 static void expand_threads_cb(GtkAction *action, gpointer data)
4628 MainWindow *mainwin = (MainWindow *)data;
4629 summary_expand_threads(mainwin->summaryview);
4632 static void collapse_threads_cb(GtkAction *action, gpointer data)
4634 MainWindow *mainwin = (MainWindow *)data;
4635 summary_collapse_threads(mainwin->summaryview);
4638 static void set_summary_display_item_cb(GtkAction *action, gpointer data)
4640 prefs_summary_column_open();
4643 static void set_folder_display_item_cb(GtkAction *action, gpointer data)
4645 prefs_folder_column_open();
4648 static void sort_summary_cb(GtkAction *action, GtkRadioAction *current, gpointer data)
4650 MainWindow *mainwin = (MainWindow *)data;
4651 gint value = gtk_radio_action_get_current_value (GTK_RADIO_ACTION (current));
4653 if (mainwin->menu_lock_count) return;
4655 if (gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (current))) {
4656 summary_sort(mainwin->summaryview, (FolderSortKey)value,
4657 mainwin->summaryview->sort_type);
4661 static void sort_summary_type_cb(GtkAction *gaction, GtkRadioAction *current, gpointer data)
4663 MainWindow *mainwin = (MainWindow *)data;
4664 gint value = gtk_radio_action_get_current_value (GTK_RADIO_ACTION (current));
4666 if (mainwin->menu_lock_count) return;
4668 if (gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (current)))
4669 summary_sort(mainwin->summaryview,
4670 mainwin->summaryview->sort_key, (FolderSortType)value);
4673 static void attract_by_subject_cb(GtkAction *action, gpointer data)
4675 MainWindow *mainwin = (MainWindow *)data;
4676 summary_attract_by_subject(mainwin->summaryview);
4679 void mainwindow_delete_duplicated(MainWindow *mainwin)
4681 FolderItem *item;
4683 item = folderview_get_selected_item(mainwin->folderview);
4684 if (item) {
4685 gint result;
4687 main_window_cursor_wait(mainwin);
4688 STATUSBAR_PUSH(mainwin, _("Deleting duplicated messages..."));
4689 result = folderutils_delete_duplicates(item, prefs_common.immediate_exec ?
4690 DELETE_DUPLICATES_REMOVE : DELETE_DUPLICATES_SETFLAG);
4691 STATUSBAR_POP(mainwin);
4692 main_window_cursor_normal(mainwin);
4694 switch (result) {
4695 case -1:
4696 break;
4697 case 0:
4698 alertpanel_notice(_("No duplicate message found in selected folder.\n"));
4699 break;
4700 default: {
4701 gchar *msg;
4703 if (prefs_common.immediate_exec) {
4704 msg = ngettext("Deleted %d duplicate message in selected folder.\n",
4705 "Deleted %d duplicate messages in selected folder.\n",
4706 result);
4707 } else {
4708 msg = ngettext("Marked %d duplicate message for deletion in selected folder.\n",
4709 "Marked %d duplicate messages for deletion in selected folder.\n",
4710 result);
4712 alertpanel_notice(msg, result);
4718 static void delete_duplicated_cb(GtkAction *action, gpointer data)
4720 mainwindow_delete_duplicated((MainWindow *)data);
4723 struct DelDupsData
4725 guint dups;
4726 guint folders;
4729 static void deldup_all(FolderItem *item, gpointer _data)
4731 struct DelDupsData *data = _data;
4732 gint result;
4734 result = folderutils_delete_duplicates(item, DELETE_DUPLICATES_REMOVE);
4735 if (result >= 0) {
4736 data->dups += result;
4737 data->folders += 1;
4741 void mainwindow_delete_duplicated_all(MainWindow *mainwin)
4743 struct DelDupsData data = {0, 0};
4745 main_window_cursor_wait(mainwin);
4746 STATUSBAR_PUSH(mainwin, _("Deleting duplicated messages in all folders..."));
4747 folder_func_to_all_folders(deldup_all, &data);
4748 STATUSBAR_POP(mainwin);
4749 main_window_cursor_normal(mainwin);
4751 if (data.dups > 0) {
4752 alertpanel_notice(ngettext("Deleted %d duplicate message in %d folders.\n",
4753 "Deleted %d duplicate messages in %d folders.\n",
4754 data.dups),
4755 data.dups, data.folders);
4756 } else {
4757 alertpanel_notice(_("No duplicate message found in %d folders.\n"), data.folders);
4761 static void delete_duplicated_all_cb(GtkAction *action, gpointer mw)
4763 MainWindow *mainwin = (MainWindow *)mw;
4765 mainwindow_delete_duplicated_all(mainwin);
4768 static void filter_cb(GtkAction *action, gpointer data)
4770 MainWindow *mainwin = (MainWindow *)data;
4771 summary_filter(mainwin->summaryview, FALSE);
4774 static void filter_list_cb(GtkAction *action, gpointer data)
4776 MainWindow *mainwin = (MainWindow *)data;
4777 summary_filter(mainwin->summaryview, TRUE);
4780 static void process_cb(GtkAction *action, gpointer data)
4782 MainWindow *mainwin = (MainWindow *)data;
4783 FolderItem *item = mainwin->summaryview->folder_item;
4784 cm_return_if_fail(item != NULL);
4786 item->processing_pending = TRUE;
4787 folder_item_apply_processing(item);
4788 item->processing_pending = FALSE;
4791 static void execute_summary_cb(GtkAction *action, gpointer data)
4793 MainWindow *mainwin = (MainWindow *)data;
4794 summary_execute(mainwin->summaryview);
4797 static void expunge_summary_cb(GtkAction *action, gpointer data)
4799 MainWindow *mainwin = (MainWindow *)data;
4800 summary_expunge(mainwin->summaryview);
4803 static void update_summary_cb(GtkAction *action, gpointer data)
4805 MainWindow *mainwin = (MainWindow *)data;
4806 FolderItem *fitem;
4807 FolderView *folderview = mainwin->folderview;
4809 if (!mainwin->summaryview->folder_item) return;
4810 if ((fitem = folderview_get_opened_item(folderview)) == NULL) return;
4812 folder_update_op_count();
4813 folder_item_scan(fitem);
4814 summary_show(mainwin->summaryview, fitem, FALSE);
4817 static void prev_cb(GtkAction *action, gpointer data)
4819 MainWindow *mainwin = (MainWindow *)data;
4820 summary_select_prev(mainwin->summaryview);
4823 static void next_cb(GtkAction *action, gpointer data)
4825 MainWindow *mainwin = (MainWindow *)data;
4826 summary_select_next(mainwin->summaryview);
4829 static void prev_unread_cb(GtkAction *action, gpointer data)
4831 MainWindow *mainwin = (MainWindow *)data;
4832 summary_select_prev_unread(mainwin->summaryview);
4835 static void next_unread_cb(GtkAction *action, gpointer data)
4837 MainWindow *mainwin = (MainWindow *)data;
4838 summary_select_next_unread(mainwin->summaryview);
4841 static void prev_new_cb(GtkAction *action, gpointer data)
4843 MainWindow *mainwin = (MainWindow *)data;
4844 summary_select_prev_new(mainwin->summaryview);
4847 static void next_new_cb(GtkAction *action, gpointer data)
4849 MainWindow *mainwin = (MainWindow *)data;
4850 summary_select_next_new(mainwin->summaryview);
4853 static void prev_marked_cb(GtkAction *action, gpointer data)
4855 MainWindow *mainwin = (MainWindow *)data;
4856 summary_select_prev_marked(mainwin->summaryview);
4859 static void next_marked_cb(GtkAction *action, gpointer data)
4861 MainWindow *mainwin = (MainWindow *)data;
4862 summary_select_next_marked(mainwin->summaryview);
4865 static void prev_labeled_cb(GtkAction *action, gpointer data)
4867 MainWindow *mainwin = (MainWindow *)data;
4868 summary_select_prev_labeled(mainwin->summaryview);
4871 static void next_labeled_cb(GtkAction *action, gpointer data)
4873 MainWindow *mainwin = (MainWindow *)data;
4874 summary_select_next_labeled(mainwin->summaryview);
4877 static void prev_history_cb(GtkAction *action, gpointer data)
4879 MainWindow *mainwin = (MainWindow *)data;
4880 MsgInfo *info = messageview_nav_get_prev(mainwin->messageview);
4881 if (info) {
4882 if (info->folder != mainwin->summaryview->folder_item)
4883 folderview_select(mainwin->folderview, info->folder);
4884 summary_select_by_msgnum(mainwin->summaryview, info->msgnum,
4885 OPEN_SELECTED_ON_PREVNEXT);
4886 procmsg_msginfo_free(&info);
4887 main_window_set_menu_sensitive(mainwindow_get_mainwindow());
4888 toolbar_main_set_sensitive(mainwindow_get_mainwindow());
4892 static void next_history_cb(GtkAction *action, gpointer data)
4894 MainWindow *mainwin = (MainWindow *)data;
4895 MsgInfo *info = messageview_nav_get_next(mainwin->messageview);
4896 if (info) {
4897 if (info->folder != mainwin->summaryview->folder_item)
4898 folderview_select(mainwin->folderview, info->folder);
4899 summary_select_by_msgnum(mainwin->summaryview, info->msgnum,
4900 OPEN_SELECTED_ON_PREVNEXT);
4901 procmsg_msginfo_free(&info);
4902 main_window_set_menu_sensitive(mainwindow_get_mainwindow());
4903 toolbar_main_set_sensitive(mainwindow_get_mainwindow());
4907 static void parent_cb(GtkAction *action, gpointer data)
4909 MainWindow *mainwin = (MainWindow *)data;
4910 summary_select_parent(mainwin->summaryview);
4913 static void goto_folder_cb(GtkAction *action, gpointer data)
4915 MainWindow *mainwin = (MainWindow *)data;
4916 FolderItem *to_folder;
4918 to_folder = foldersel_folder_sel(NULL, FOLDER_SEL_ALL, NULL, FALSE,
4919 _("Select folder to go to"));
4921 if (to_folder)
4922 folderview_select(mainwin->folderview, to_folder);
4925 static void goto_unread_folder_cb(GtkAction *action, gpointer data)
4927 MainWindow *mainwin = (MainWindow *)data;
4928 folderview_select_next_with_flag(mainwin->folderview, MSG_UNREAD);
4931 static void scroll_prev_line_cb(GtkAction *action, gpointer data)
4933 MainWindow *mainwin = (MainWindow *)data;
4934 mimeview_scroll_one_line(mainwin->messageview->mimeview,TRUE);
4937 static void scroll_next_line_cb(GtkAction *action, gpointer data)
4939 MainWindow *mainwin = (MainWindow *)data;
4940 mimeview_scroll_one_line(mainwin->messageview->mimeview,FALSE);
4943 static void scroll_prev_page_cb(GtkAction *action, gpointer data)
4945 MainWindow *mainwin = (MainWindow *)data;
4946 mimeview_scroll_page(mainwin->messageview->mimeview,TRUE);
4949 static void scroll_next_page_cb(GtkAction *action, gpointer data)
4951 MainWindow *mainwin = (MainWindow *)data;
4952 mimeview_scroll_page(mainwin->messageview->mimeview,FALSE);
4955 static void copy_cb(GtkAction *action, gpointer data)
4957 MainWindow *mainwin = (MainWindow *)data;
4958 messageview_copy_clipboard(mainwin->messageview);
4961 static void allsel_cb(GtkAction *action, gpointer data)
4963 MainWindow *mainwin = (MainWindow *)data;
4964 MessageView *msgview = mainwin->messageview;
4966 if (messageview_is_visible(msgview) &&
4967 (gtk_widget_has_focus(msgview->mimeview->textview->text)))
4968 messageview_select_all(mainwin->messageview);
4969 else
4970 summary_select_all(mainwin->summaryview);
4973 static void select_thread_cb(GtkAction *action, gpointer data)
4975 MainWindow *mainwin = (MainWindow *)data;
4976 summary_select_thread(mainwin->summaryview, FALSE, FALSE);
4979 static void trash_thread_cb(GtkAction *action, gpointer data)
4981 MainWindow *mainwin = (MainWindow *)data;
4982 summary_select_thread(mainwin->summaryview, FALSE, TRUE);
4985 static void delete_thread_cb(GtkAction *action, gpointer data)
4987 MainWindow *mainwin = (MainWindow *)data;
4988 summary_select_thread(mainwin->summaryview, TRUE, FALSE);
4991 static void create_filter_cb(GtkAction *gaction, gpointer data)
4993 MainWindow *mainwin = (MainWindow *)data;
4994 const gchar *a_name = gtk_action_get_name(gaction);
4995 gint action = -1;
4997 DO_ACTION("Tools/CreateFilterRule/Automatically", FILTER_BY_AUTO);
4998 DO_ACTION("Tools/CreateFilterRule/ByFrom", FILTER_BY_FROM);
4999 DO_ACTION("Tools/CreateFilterRule/ByTo", FILTER_BY_TO);
5000 DO_ACTION("Tools/CreateFilterRule/BySubject", FILTER_BY_SUBJECT);
5001 DO_ACTION("Tools/CreateFilterRule/BySender", FILTER_BY_SENDER);
5002 summary_filter_open(mainwin->summaryview, (PrefsFilterType)action, 0);
5005 static void create_processing_cb(GtkAction *gaction, gpointer data)
5007 MainWindow *mainwin = (MainWindow *)data;
5008 const gchar *a_name = gtk_action_get_name(gaction);
5009 gint action = -1;
5011 DO_ACTION("Tools/CreateProcessingRule/Automatically", FILTER_BY_AUTO);
5012 DO_ACTION("Tools/CreateProcessingRule/ByFrom", FILTER_BY_FROM);
5013 DO_ACTION("Tools/CreateProcessingRule/ByTo", FILTER_BY_TO);
5014 DO_ACTION("Tools/CreateProcessingRule/BySubject", FILTER_BY_SUBJECT);
5015 DO_ACTION("Tools/CreateProcessingRule/BySender", FILTER_BY_SENDER);
5016 summary_filter_open(mainwin->summaryview, (PrefsFilterType)action, 1);
5019 static void prefs_pre_processing_open_cb(GtkAction *action, gpointer data)
5021 prefs_filtering_open(&pre_global_processing,
5022 _("Processing rules to apply before folder rules"),
5023 MANUAL_ANCHOR_PROCESSING,
5024 NULL, NULL, FALSE);
5027 static void prefs_post_processing_open_cb(GtkAction *action, gpointer data)
5029 prefs_filtering_open(&post_global_processing,
5030 _("Processing rules to apply after folder rules"),
5031 MANUAL_ANCHOR_PROCESSING,
5032 NULL, NULL, FALSE);
5035 static void prefs_filtering_open_cb(GtkAction *action, gpointer data)
5037 prefs_filtering_open(&filtering_rules,
5038 _("Filtering configuration"),
5039 MANUAL_ANCHOR_FILTERING,
5040 NULL, NULL, TRUE);
5043 static void prefs_template_open_cb(GtkAction *action, gpointer data)
5045 prefs_template_open();
5048 static void prefs_actions_open_cb(GtkAction *action, gpointer data)
5050 MainWindow *mainwin = (MainWindow *)data;
5051 prefs_actions_open(mainwin);
5054 static void prefs_tags_open_cb(GtkAction *action, gpointer data)
5056 tags_window_open(NULL);
5058 #ifdef USE_GNUTLS
5059 static void ssl_manager_open_cb(GtkAction *action, gpointer data)
5061 MainWindow *mainwin = (MainWindow *)data;
5062 ssl_manager_open(mainwin);
5064 #endif
5065 static void prefs_account_open_cb(GtkAction *action, gpointer data)
5067 MainWindow *mainwin = (MainWindow *)data;
5068 if (!cur_account) {
5069 new_account_cb(NULL, mainwin);
5070 } else {
5071 account_open(cur_account, FALSE);
5075 static void new_account_cb(GtkAction *action, gpointer data)
5077 account_edit_open(NULL, NULL);
5078 if (!compose_get_compose_list()) account_add();
5081 static void account_selector_menu_cb(GtkMenuItem *menuitem, gpointer data)
5083 FolderItem *item = NULL;
5084 cur_account = (PrefsAccount *)data;
5086 if (!mainwindow_get_mainwindow())
5087 return;
5088 main_window_show_cur_account(mainwindow_get_mainwindow());
5089 toolbar_update(TOOLBAR_MAIN, mainwindow_get_mainwindow());
5090 main_window_set_menu_sensitive(mainwindow_get_mainwindow());
5091 toolbar_main_set_sensitive(mainwindow_get_mainwindow());
5092 item = folderview_get_selected_item(
5093 mainwindow_get_mainwindow()->folderview);
5094 if (item) {
5095 toolbar_set_compose_button
5096 (mainwindow_get_mainwindow()->toolbar,
5097 FOLDER_TYPE(item->folder) == F_NEWS ?
5098 COMPOSEBUTTON_NEWS : COMPOSEBUTTON_MAIL);
5102 static void account_receive_menu_cb(GtkMenuItem *menuitem, gpointer data)
5104 MainWindow *mainwin = (MainWindow *)mainwin_list->data;
5105 PrefsAccount *account = (PrefsAccount *)data;
5107 inc_account_mail(mainwin, account);
5109 #ifndef GENERIC_UMPC
5110 static void account_compose_menu_cb(GtkMenuItem *menuitem, gpointer data)
5112 PrefsAccount *account = (PrefsAccount *)data;
5114 compose_new_with_folderitem(account, NULL, NULL);
5116 #endif
5117 static void prefs_open_cb(GtkAction *action, gpointer data)
5119 prefs_gtk_open();
5122 static void plugins_open_cb(GtkAction *action, gpointer data)
5124 pluginwindow_create();
5127 static void manual_open_cb(GtkAction *action, gpointer data)
5129 manual_open(MANUAL_MANUAL_CLAWS, NULL);
5132 static void manual_faq_open_cb(GtkAction *action, gpointer data)
5134 manual_open(MANUAL_FAQ_CLAWS, NULL);
5137 static void legend_open_cb(GtkAction *action, gpointer data)
5139 legend_show();
5142 #ifdef G_OS_WIN32
5143 static void set_default_client_cb(GtkAction *action, gpointer data)
5145 char exename[MAX_PATH];
5146 gchar *binary_icon = NULL;
5147 gchar *binary_compose = NULL;
5148 gchar *binary_run = NULL;
5149 gboolean r;
5150 if ( !GetModuleFileNameA (0, exename, sizeof (exename)) ) {
5151 alertpanel_error(_("Can not register as default client: impossible to get executable path."));
5152 return;
5154 binary_icon = g_strconcat(exename, ",0", NULL);
5155 binary_compose = g_strconcat(exename, " --compose %1", NULL);
5156 binary_run = g_strconcat(exename, NULL);
5158 /* Try to set the Mail Start menu item to Claws. It may fail if we're not root; we don't care */
5159 r = write_w32_registry_string(HKEY_LOCAL_MACHINE,
5160 "Software\\Clients\\Mail",
5162 "Claws Mail");
5164 r = write_w32_registry_string(HKEY_CURRENT_USER,
5165 "Software\\Clients\\Mail\\Claws Mail",
5167 "Claws Mail");
5168 if (r)
5169 r = write_w32_registry_string(HKEY_CURRENT_USER,
5170 "Software\\Clients\\Mail\\Claws Mail",
5171 "DLLPath",
5172 "");
5173 if (r)
5174 r = write_w32_registry_string(HKEY_CURRENT_USER,
5175 "Software\\Clients\\Mail\\Claws Mail\\Protocols\\mailto",
5177 "URL:MailTo-Protocol");
5178 if (r)
5179 r = write_w32_registry_string(HKEY_CURRENT_USER,
5180 "Software\\Clients\\Mail\\Claws Mail\\Protocols\\mailto",
5181 "URL Protocol",
5182 "");
5183 if (r)
5184 r = write_w32_registry_dword (HKEY_CURRENT_USER,
5185 "Software\\Clients\\Mail\\Claws Mail\\Protocols\\mailto",
5186 "EditFlags",
5188 if (r)
5189 r = write_w32_registry_string(HKEY_CURRENT_USER,
5190 "Software\\Clients\\Mail\\Claws Mail\\Protocols\\mailto",
5191 "FriendlyTypeName",
5192 "Claws-Mail URL");
5193 if (r)
5194 r = write_w32_registry_string(HKEY_CURRENT_USER,
5195 "Software\\Clients\\Mail\\Claws Mail\\Protocols\\mailto\\DefaultIcon",
5197 binary_icon);
5198 if (r)
5199 r = write_w32_registry_string(HKEY_CURRENT_USER,
5200 "Software\\Clients\\Mail\\Claws Mail\\Protocols\\mailto\\shell\\open\\command",
5202 binary_compose);
5203 if (r)
5204 r = write_w32_registry_string(HKEY_CURRENT_USER,
5205 "Software\\Clients\\Mail\\Claws Mail\\shell\\open\\command",
5207 binary_run);
5209 if (r)
5210 r = write_w32_registry_string(HKEY_CURRENT_USER,
5211 "Software\\Classes\\mailto",
5213 "URL:MailTo-Protocol");
5214 if (r)
5215 r = write_w32_registry_string(HKEY_CURRENT_USER,
5216 "Software\\Classes\\mailto",
5217 "URL Protocol",
5218 "");
5219 if (r)
5220 r = write_w32_registry_dword (HKEY_CURRENT_USER,
5221 "Software\\Classes\\mailto",
5222 "EditFlags",
5224 if (r)
5225 r = write_w32_registry_string(HKEY_CURRENT_USER,
5226 "Software\\Classes\\mailto",
5227 "FriendlyTypeName",
5228 "Claws-Mail URL");
5229 if (r)
5230 r = write_w32_registry_string(HKEY_CURRENT_USER,
5231 "Software\\Classes\\mailto\\DefaultIcon",
5233 binary_icon);
5234 if (r)
5235 r = write_w32_registry_string(HKEY_CURRENT_USER,
5236 "Software\\Classes\\mailto\\shell\\open\\command",
5238 binary_compose);
5240 if (r) {
5241 SendMessage(HWND_BROADCAST, WM_SETTINGCHANGE, 0, (LPARAM)"Software\\Clients\\Mail");
5242 alertpanel_notice(_("Claws Mail has been registered as default client."));
5243 } else {
5244 alertpanel_error(_("Can not register as default client: impossible to write to the registry."));
5246 g_free(binary_icon);
5247 g_free(binary_compose);
5248 g_free(binary_run);
5250 #endif
5252 static void scan_tree_func(Folder *folder, FolderItem *item, gpointer data)
5254 MainWindow *mainwin = (MainWindow *)data;
5255 gchar *str;
5257 if (item->path)
5258 str = g_strdup_printf(_("Scanning folder %s%c%s..."),
5259 LOCAL_FOLDER(folder)->rootpath,
5260 G_DIR_SEPARATOR,
5261 item->path);
5262 else
5263 str = g_strdup_printf(_("Scanning folder %s..."),
5264 LOCAL_FOLDER(folder)->rootpath);
5266 STATUSBAR_PUSH(mainwin, str);
5267 STATUSBAR_POP(mainwin);
5268 g_free(str);
5271 static gboolean mainwindow_focus_in_event(GtkWidget *widget, GdkEventFocus *focus,
5272 gpointer data)
5274 SummaryView *summary;
5276 cm_return_val_if_fail(data, FALSE);
5277 if (!g_list_find(mainwin_list, data))
5278 return TRUE;
5279 summary = ((MainWindow *)data)->summaryview;
5280 cm_return_val_if_fail(summary, FALSE);
5282 if (GTK_CMCLIST(summary->ctree)->selection &&
5283 g_list_length(GTK_CMCLIST(summary->ctree)->selection) > 1)
5284 return FALSE;
5286 return FALSE;
5289 static gboolean mainwindow_visibility_event_cb(GtkWidget *widget, GdkEventVisibility *event,
5290 gpointer data)
5292 is_obscured = (event->state == GDK_VISIBILITY_FULLY_OBSCURED);
5293 return FALSE;
5296 static gboolean mainwindow_state_event_cb(GtkWidget *widget, GdkEventWindowState *state,
5297 gpointer data)
5299 if (!claws_is_starting()
5300 && state->changed_mask&GDK_WINDOW_STATE_ICONIFIED
5301 && state->new_window_state&GDK_WINDOW_STATE_ICONIFIED) {
5303 if (iconified_count > 0)
5304 hooks_invoke(MAIN_WINDOW_GOT_ICONIFIED, NULL);
5305 iconified_count++;
5306 } else if (!claws_is_starting()) {
5307 prefs_common.mainwin_maximised =
5308 ((state->new_window_state&GDK_WINDOW_STATE_MAXIMIZED) != 0);
5310 if (state->new_window_state == 0)
5311 gtk_window_set_skip_taskbar_hint(GTK_WINDOW(widget), FALSE);
5312 return FALSE;
5315 gboolean mainwindow_is_obscured(void)
5317 return is_obscured;
5321 * Harvest addresses for selected folder.
5323 static void addr_harvest_cb( GtkAction *action, gpointer data)
5325 MainWindow *mainwin = (MainWindow *)data;
5327 addressbook_harvest( mainwin->summaryview->folder_item, FALSE, NULL );
5331 * Harvest addresses for selected messages in summary view.
5333 static void addr_harvest_msg_cb( GtkAction *action, gpointer data)
5335 MainWindow *mainwin = (MainWindow *)data;
5336 summary_harvest_address( mainwin->summaryview );
5340 *\brief get a MainWindow
5342 *\return MainWindow * The first mainwindow in the mainwin_list
5344 MainWindow *mainwindow_get_mainwindow(void)
5346 if (mainwin_list && mainwin_list->data)
5347 return (MainWindow *)(mainwin_list->data);
5348 else
5349 return NULL;
5352 static gboolean mainwindow_progressindicator_hook(gpointer source, gpointer userdata)
5354 ProgressData *data = (ProgressData *) source;
5355 MainWindow *mainwin = (MainWindow *) userdata;
5357 switch (data->cmd) {
5358 case PROGRESS_COMMAND_START:
5359 case PROGRESS_COMMAND_STOP:
5360 gtk_progress_bar_set_fraction
5361 (GTK_PROGRESS_BAR(mainwin->progressbar), 0.0);
5362 break;
5363 case PROGRESS_COMMAND_SET_PERCENTAGE:
5364 gtk_progress_bar_set_fraction
5365 (GTK_PROGRESS_BAR(mainwin->progressbar), data->value);
5366 break;
5368 while (gtk_events_pending()) gtk_main_iteration ();
5370 return FALSE;
5373 static void sync_cb(GtkAction *action, gpointer data)
5375 MainWindow *mainwin = (MainWindow *)data;
5376 mainwindow_check_synchronise(mainwin, FALSE);
5379 static void forget_session_passwords_cb(GtkAction *action, gpointer data)
5381 MainWindow *mainwin = (MainWindow *)data;
5382 GList *list = NULL;
5383 gint fgtn = 0;
5384 gint accs = 0;
5386 main_window_lock(mainwin);
5387 for (list = account_get_list(); list != NULL; list = list->next) {
5388 PrefsAccount *account = list->data;
5389 if (account->session_passwd) {
5390 g_free(account->session_passwd);
5391 account->session_passwd = NULL;
5392 ++fgtn;
5394 if (account->session_smtp_passwd) {
5395 g_free(account->session_smtp_passwd);
5396 account->session_smtp_passwd = NULL;
5397 ++fgtn;
5399 ++accs;
5401 main_window_unlock(mainwin);
5402 alertpanel_notice(ngettext("Forgotten %d password in %d accounts.\n",
5403 "Forgotten %d passwords in %d accounts.\n",
5404 fgtn), fgtn, accs);
5407 #ifndef PASSWORD_CRYPTO_OLD
5408 static void forget_primary_passphrase_cb(GtkAction *action, gpointer data)
5410 MainWindow *mainwin = (MainWindow *)data;
5412 main_window_lock(mainwin);
5413 primary_passphrase_forget();
5414 main_window_unlock(mainwin);
5416 #endif
5418 void mainwindow_learn (MainWindow *mainwin, gboolean is_spam)
5420 summary_mark_as_spam(mainwin->summaryview, is_spam, NULL);
5423 void mainwindow_jump_to(const gchar *target, gboolean popup)
5425 gchar *tmp = NULL;
5426 FolderItem *item = NULL;
5427 gchar *msg = NULL;
5428 MainWindow *mainwin = mainwindow_get_mainwindow();
5429 gchar *from_uri = NULL;
5430 if (!target)
5431 return;
5433 if (!mainwin) {
5434 g_print("not initialized\n");
5435 return;
5438 if ((from_uri = g_filename_from_uri(target, NULL, NULL)) != NULL)
5439 tmp = from_uri;
5440 else
5441 tmp = g_strdup(target);
5443 strcrlftrunc(tmp);
5445 if ((item = folder_find_item_from_identifier(tmp))) {
5446 g_print("selecting folder '%s'\n", tmp);
5447 folderview_select(mainwin->folderview, item);
5448 if (popup)
5449 main_window_popup(mainwin);
5450 g_free(tmp);
5451 return;
5454 msg = strrchr(tmp, '/');
5455 if (msg) {
5456 *msg++ = '\0';
5457 if ((item = folder_find_item_from_identifier(tmp))) {
5458 g_print("selecting folder '%s'\n", tmp);
5459 folderview_select(mainwin->folderview, item);
5460 } else if ((item = folder_find_item_from_real_path(tmp))) {
5461 g_print("selecting folder '%s'\n", tmp);
5462 folderview_select(mainwin->folderview, item);
5463 } else {
5464 g_print("'%s' not found\n", tmp);
5466 if (item && msg && atoi(msg)) {
5467 g_print("selecting message %d\n", atoi(msg));
5468 summary_select_by_msgnum(mainwin->summaryview, atoi(msg), TRUE);
5469 if (popup)
5470 main_window_popup(mainwin);
5471 g_free(tmp);
5472 return;
5473 } else if (item && msg[0] == '<' && msg[strlen(msg)-1] == '>') {
5474 MsgInfo *msginfo = NULL;
5475 msg++;
5476 msg[strlen(msg)-1] = '\0';
5477 msginfo = folder_item_get_msginfo_by_msgid(item, msg);
5478 if (msginfo) {
5479 g_print("selecting message %s\n", msg);
5480 summary_select_by_msgnum(mainwin->summaryview, msginfo->msgnum, TRUE);
5481 if (popup)
5482 main_window_popup(mainwin);
5483 g_free(tmp);
5484 procmsg_msginfo_free(&msginfo);
5485 return;
5486 } else {
5487 g_print("'%s' not found\n", msg);
5489 } else {
5490 g_print("'%s' not found\n", msg);
5492 } else {
5493 g_print("'%s' not found\n", tmp);
5496 g_free(tmp);
5499 void mainwindow_exit_folder(MainWindow *mainwin) {
5500 if (prefs_common.layout_mode == SMALL_LAYOUT) {
5501 folderview_close_opened(mainwin->folderview, FALSE);
5502 mainwin_paned_show_first(GTK_PANED(mainwin->hpaned));
5503 folderview_grab_focus(mainwin->folderview);
5505 mainwin->in_folder = FALSE;
5506 main_window_set_menu_sensitive(mainwin);
5509 void mainwindow_enter_folder(MainWindow *mainwin) {
5510 if (prefs_common.layout_mode == SMALL_LAYOUT) {
5511 mainwin_paned_show_last(GTK_PANED(mainwin->hpaned));
5513 mainwin->in_folder = TRUE;
5514 main_window_set_menu_sensitive(mainwin);
5517 static void save_part_as_cb(GtkAction *action, gpointer data)
5519 MainWindow *mainwin = (MainWindow *)data;
5521 if (mainwin->messageview
5522 && mainwin->messageview->mimeview)
5523 mimeview_save_as(mainwin->messageview->mimeview);
5526 static void view_part_as_text_cb(GtkAction *action, gpointer data)
5528 MainWindow *mainwin = (MainWindow *)data;
5530 if (mainwin->messageview
5531 && mainwin->messageview->mimeview)
5532 mimeview_display_as_text(mainwin->messageview->mimeview);
5535 static void open_part_cb(GtkAction *action, gpointer data)
5537 MainWindow *mainwin = (MainWindow *)data;
5539 if (mainwin->messageview
5540 && mainwin->messageview->mimeview)
5541 mimeview_launch(mainwin->messageview->mimeview, NULL);
5543 #ifndef G_OS_WIN32
5544 static void open_part_with_cb(GtkAction *action, gpointer data)
5546 MainWindow *mainwin = (MainWindow *)data;
5548 if (mainwin->messageview
5549 && mainwin->messageview->mimeview)
5550 mimeview_open_with(mainwin->messageview->mimeview);
5552 #endif
5553 static void check_signature_cb(GtkAction *action, gpointer data)
5555 MainWindow *mainwin = (MainWindow *)data;
5557 if (mainwin->messageview
5558 && mainwin->messageview->mimeview)
5559 mimeview_check_signature(mainwin->messageview->mimeview);
5562 static void goto_next_part_cb(GtkAction *action, gpointer data)
5564 MainWindow *mainwin = (MainWindow *)data;
5566 if (mainwin->messageview
5567 && mainwin->messageview->mimeview)
5568 mimeview_select_next_part(mainwin->messageview->mimeview);
5571 static void goto_prev_part_cb(GtkAction *action, gpointer data)
5573 MainWindow *mainwin = (MainWindow *)data;
5575 if (mainwin->messageview
5576 && mainwin->messageview->mimeview)
5577 mimeview_select_prev_part(mainwin->messageview->mimeview);