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