1 /*
2 * Sylpheed -- a GTK+ based, lightweight, and fast e-mail client
3 * Copyright (C) 1999-2017 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 2 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, write to the Free Software
17 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
18 */
19
20 #include "defs.h"
21
22 #include <glib.h>
23 #include <glib/gi18n.h>
24 #include <gdk/gdkkeysyms.h>
25 #include <gtk/gtkmain.h>
26 #include <gtk/gtkversion.h>
27 #include <gtk/gtkwindow.h>
28 #include <gtk/gtkwidget.h>
29 #include <gtk/gtksignal.h>
30 #include <gtk/gtkvbox.h>
31 #include <gtk/gtkcontainer.h>
32 #include <gtk/gtkstatusbar.h>
33 #include <gtk/gtkprogressbar.h>
34 #include <gtk/gtkhpaned.h>
35 #include <gtk/gtkvpaned.h>
36 #include <gtk/gtkcheckmenuitem.h>
37 #include <gtk/gtkitemfactory.h>
38 #include <gtk/gtkeditable.h>
39 #include <gtk/gtkmenu.h>
40 #include <gtk/gtkmenuitem.h>
41 #include <gtk/gtktoolbar.h>
42 #include <gtk/gtktoolitem.h>
43 #include <gtk/gtktoolbutton.h>
44 #include <gtk/gtkseparatortoolitem.h>
45 #include <gtk/gtkbutton.h>
46 #include <gtk/gtktooltips.h>
47 #include <gtk/gtkarrow.h>
48 #include <gtk/gtkstock.h>
49 #include <gtk/gtkimage.h>
50 #include <string.h>
51
52 #include "main.h"
53 #include "mainwindow.h"
54 #include "folderview.h"
55 #include "foldersel.h"
56 #include "summaryview.h"
57 #include "quick_search.h"
58 #include "query_search.h"
59 #include "messageview.h"
60 #include "mimeview.h"
61 #include "message_search.h"
62 #include "headerview.h"
63 #include "menu.h"
64 #include "stock_pixmap.h"
65 #include "folder.h"
66 #include "inc.h"
67 #include "rpop3.h"
68 #include "compose.h"
69 #include "procmsg.h"
70 #include "send_message.h"
71 #include "import.h"
72 #include "export.h"
73 #include "prefs_common.h"
74 #include "prefs_common_dialog.h"
75 #include "prefs_filter.h"
76 #include "prefs_actions.h"
77 #include "prefs_account.h"
78 #include "prefs_summary_column.h"
79 #include "prefs_template.h"
80 #include "prefs_search_folder.h"
81 #include "prefs_toolbar.h"
82 #include "plugin_manager.h"
83 #include "action.h"
84 #include "account.h"
85 #include "account_dialog.h"
86 #include "addressbook.h"
87 #include "logwindow.h"
88 #include "manage_window.h"
89 #include "alertpanel.h"
90 #include "statusbar.h"
91 #include "inputdialog.h"
92 #include "trayicon.h"
93 #include "printing.h"
94 #include "utils.h"
95 #include "gtkutils.h"
96 #include "codeconv.h"
97 #include "about.h"
98 #include "manual.h"
99 #include "update_check.h"
100 #include "setup.h"
101 #include "plugin.h"
102 #include "version.h"
103
104 #define AC_LABEL_WIDTH 240
105
106 #define STATUSBAR_PUSH(mainwin, str) \
107 { \
108 gtk_statusbar_push(GTK_STATUSBAR(mainwin->statusbar), \
109 mainwin->mainwin_cid, str); \
110 gtkut_widget_draw_now(mainwin->statusbar); \
111 }
112
113 #define STATUSBAR_POP(mainwin) \
114 { \
115 gtk_statusbar_pop(GTK_STATUSBAR(mainwin->statusbar), \
116 mainwin->mainwin_cid); \
117 }
118
119 /* list of all instantiated MainWindow */
120 static GList *mainwin_list = NULL;
121
122 static GdkCursor *watch_cursor;
123
124 static void main_window_menu_callback_block (MainWindow *mainwin);
125 static void main_window_menu_callback_unblock (MainWindow *mainwin);
126
127 static void main_window_show_cur_account (MainWindow *mainwin);
128
129 static void main_window_set_toolbar_button_visibility
130 (MainWindow *mainwin);
131
132 static void main_window_set_widgets (MainWindow *mainwin,
133 LayoutType layout,
134 SeparateType type);
135 static GtkWidget *main_window_toolbar_create (MainWindow *mainwin);
136 static GtkWidget *main_window_toolbar_create_from_list
137 (MainWindow *mainwin,
138 GList *item_list);
139 static void main_window_toolbar_toggle_menu_set_active
140 (MainWindow *mainwin,
141 ToolbarStyle style);
142
143 /* callback functions */
144 static void toolbar_inc_cb (GtkWidget *widget,
145 gpointer data);
146 static void toolbar_inc_all_cb (GtkWidget *widget,
147 gpointer data);
148 static void toolbar_rpop3_cb (GtkWidget *widget,
149 gpointer data);
150 static void toolbar_send_cb (GtkWidget *widget,
151 gpointer data);
152
153 static void toolbar_compose_cb (GtkWidget *widget,
154 gpointer data);
155 static void toolbar_reply_cb (GtkWidget *widget,
156 gpointer data);
157 static void toolbar_reply_to_all_cb (GtkWidget *widget,
158 gpointer data);
159 static void toolbar_forward_cb (GtkWidget *widget,
160 gpointer data);
161
162 static void toolbar_delete_cb (GtkWidget *widget,
163 gpointer data);
164 static void toolbar_junk_cb (GtkWidget *widget,
165 gpointer data);
166 static void toolbar_notjunk_cb (GtkWidget *widget,
167 gpointer data);
168 static void toolbar_exec_cb (GtkWidget *widget,
169 gpointer data);
170
171 static void toolbar_next_unread_cb (GtkWidget *widget,
172 gpointer data);
173 static void toolbar_prev_unread_cb (GtkWidget *widget,
174 gpointer data);
175 static void toolbar_address_cb (GtkWidget *widget,
176 gpointer data);
177 static void toolbar_search_cb (GtkWidget *widget,
178 gpointer data);
179 static void toolbar_print_cb (GtkWidget *widget,
180 gpointer data);
181 static void toolbar_stop_cb (GtkWidget *widget,
182 gpointer data);
183 static void toolbar_prefs_common_cb (GtkWidget *widget,
184 gpointer data);
185 static void toolbar_prefs_account_cb (GtkWidget *widget,
186 gpointer data);
187
188 static gboolean toolbar_button_pressed (GtkWidget *widget,
189 GdkEventButton *event,
190 gpointer data);
191
192 static void online_switch_clicked (GtkWidget *widget,
193 gpointer data);
194 static gboolean ac_label_button_pressed (GtkWidget *widget,
195 GdkEventButton *event,
196 gpointer data);
197 static void ac_menu_popup_closed (GtkMenuShell *menu_shell,
198 gpointer data);
199
200 static gboolean main_window_key_pressed (GtkWidget *widget,
201 GdkEventKey *event,
202 gpointer data);
203
204 static gint main_window_close_cb (GtkWidget *widget,
205 GdkEventAny *event,
206 gpointer data);
207 static gint folder_window_close_cb (GtkWidget *widget,
208 GdkEventAny *event,
209 gpointer data);
210 static gint message_window_close_cb (GtkWidget *widget,
211 GdkEventAny *event,
212 gpointer data);
213
214 static void main_window_size_allocate_cb (GtkWidget *widget,
215 GtkAllocation *allocation,
216 gpointer data);
217 static void folder_window_size_allocate_cb (GtkWidget *widget,
218 GtkAllocation *allocation,
219 gpointer data);
220 static void message_window_size_allocate_cb (GtkWidget *widget,
221 GtkAllocation *allocation,
222 gpointer data);
223
224 static gboolean main_window_window_state_cb (GtkWidget *widget,
225 GdkEventWindowState *event,
226 gpointer data);
227 static gboolean main_window_visibility_notify_cb(GtkWidget *widget,
228 GdkEventVisibility *event,
229 gpointer data);
230
231 static void new_folder_cb (MainWindow *mainwin,
232 guint action,
233 GtkWidget *widget);
234 static void rename_folder_cb (MainWindow *mainwin,
235 guint action,
236 GtkWidget *widget);
237 static void move_folder_cb (MainWindow *mainwin,
238 guint action,
239 GtkWidget *widget);
240 static void delete_folder_cb (MainWindow *mainwin,
241 guint action,
242 GtkWidget *widget);
243 static void update_folderview_cb (MainWindow *mainwin,
244 guint action,
245 GtkWidget *widget);
246
247 static void add_mailbox_cb (MainWindow *mainwin,
248 guint action,
249 GtkWidget *widget);
250 static void remove_mailbox_cb (MainWindow *mainwin,
251 guint action,
252 GtkWidget *widget);
253 static void rebuild_tree_cb (MainWindow *mainwin,
254 guint action,
255 GtkWidget *widget);
256
257 static void import_mail_cb (MainWindow *mainwin,
258 guint action,
259 GtkWidget *widget);
260 static void export_mail_cb (MainWindow *mainwin,
261 guint action,
262 GtkWidget *widget);
263 static void empty_trash_cb (MainWindow *mainwin,
264 guint action,
265 GtkWidget *widget);
266
267 static void save_as_cb (MainWindow *mainwin,
268 guint action,
269 GtkWidget *widget);
270 #if GTK_CHECK_VERSION(2, 10, 0)
271 static void page_setup_cb (MainWindow *mainwin,
272 guint action,
273 GtkWidget *widget);
274 #endif
275 static void print_cb (MainWindow *mainwin,
276 guint action,
277 GtkWidget *widget);
278 static void toggle_offline_cb (MainWindow *mainwin,
279 guint action,
280 GtkWidget *widget);
281 static void app_exit_cb (MainWindow *mainwin,
282 guint action,
283 GtkWidget *widget);
284
285 static void search_cb (MainWindow *mainwin,
286 guint action,
287 GtkWidget *widget);
288
289 static void toggle_folder_cb (MainWindow *mainwin,
290 guint action,
291 GtkWidget *widget);
292 static void toggle_message_cb (MainWindow *mainwin,
293 guint action,
294 GtkWidget *widget);
295 static void toggle_toolbar_cb (MainWindow *mainwin,
296 guint action,
297 GtkWidget *widget);
298 static void toggle_searchbar_cb (MainWindow *mainwin,
299 guint action,
300 GtkWidget *widget);
301 static void toggle_statusbar_cb (MainWindow *mainwin,
302 guint action,
303 GtkWidget *widget);
304 static void toolbar_customize_cb (MainWindow *mainwin,
305 guint action,
306 GtkWidget *widget);
307 static void change_layout_cb (MainWindow *mainwin,
308 guint action,
309 GtkWidget *widget);
310 static void separate_widget_cb (MainWindow *mainwin,
311 guint action,
312 GtkWidget *widget);
313
314 static void addressbook_open_cb (MainWindow *mainwin,
315 guint action,
316 GtkWidget *widget);
317 static void log_window_show_cb (MainWindow *mainwin,
318 guint action,
319 GtkWidget *widget);
320
321 static void inc_mail_cb (MainWindow *mainwin,
322 guint action,
323 GtkWidget *widget);
324 static void inc_all_account_mail_cb (MainWindow *mainwin,
325 guint action,
326 GtkWidget *widget);
327 static void inc_stop_cb (MainWindow *mainwin,
328 guint action,
329 GtkWidget *widget);
330
331 static void rpop3_cb (MainWindow *mainwin,
332 guint action,
333 GtkWidget *widget);
334
335 static void send_queue_cb (MainWindow *mainwin,
336 guint action,
337 GtkWidget *widget);
338
339 static void compose_cb (MainWindow *mainwin,
340 guint action,
341 GtkWidget *widget);
342 static void reply_cb (MainWindow *mainwin,
343 guint action,
344 GtkWidget *widget);
345
346 static void open_msg_cb (MainWindow *mainwin,
347 guint action,
348 GtkWidget *widget);
349
350 static void view_source_cb (MainWindow *mainwin,
351 guint action,
352 GtkWidget *widget);
353
354 static void show_all_header_cb (MainWindow *mainwin,
355 guint action,
356 GtkWidget *widget);
357
358 static void move_to_cb (MainWindow *mainwin,
359 guint action,
360 GtkWidget *widget);
361 static void copy_to_cb (MainWindow *mainwin,
362 guint action,
363 GtkWidget *widget);
364 static void delete_cb (MainWindow *mainwin,
365 guint action,
366 GtkWidget *widget);
367
368 static void mark_cb (MainWindow *mainwin,
369 guint action,
370 GtkWidget *widget);
371 static void unmark_cb (MainWindow *mainwin,
372 guint action,
373 GtkWidget *widget);
374
375 static void mark_as_unread_cb (MainWindow *mainwin,
376 guint action,
377 GtkWidget *widget);
378 static void mark_as_read_cb (MainWindow *mainwin,
379 guint action,
380 GtkWidget *widget);
381 static void mark_thread_as_read_cb (MainWindow *mainwin,
382 guint action,
383 GtkWidget *widget);
384 static void mark_all_read_cb (MainWindow *mainwin,
385 guint action,
386 GtkWidget *widget);
387
388 static void junk_cb (MainWindow *mainwin,
389 guint action,
390 GtkWidget *widget);
391
392 static void reedit_cb (MainWindow *mainwin,
393 guint action,
394 GtkWidget *widget);
395
396 static void add_address_cb (MainWindow *mainwin,
397 guint action,
398 GtkWidget *widget);
399
400 static void set_charset_cb (MainWindow *mainwin,
401 guint action,
402 GtkWidget *widget);
403
404 static void thread_cb (MainWindow *mainwin,
405 guint action,
406 GtkWidget *widget);
407 static void expand_threads_cb (MainWindow *mainwin,
408 guint action,
409 GtkWidget *widget);
410 static void collapse_threads_cb (MainWindow *mainwin,
411 guint action,
412 GtkWidget *widget);
413
414 static void set_display_item_cb (MainWindow *mainwin,
415 guint action,
416 GtkWidget *widget);
417 static void sort_summary_cb (MainWindow *mainwin,
418 guint action,
419 GtkWidget *widget);
420 static void sort_summary_type_cb (MainWindow *mainwin,
421 guint action,
422 GtkWidget *widget);
423 static void attract_by_subject_cb(MainWindow *mainwin,
424 guint action,
425 GtkWidget *widget);
426
427 static void delete_duplicated_cb (MainWindow *mainwin,
428 guint action,
429 GtkWidget *widget);
430 static void concat_partial_cb (MainWindow *mainwin,
431 guint action,
432 GtkWidget *widget);
433 static void filter_cb (MainWindow *mainwin,
434 guint action,
435 GtkWidget *widget);
436 static void filter_junk_cb (MainWindow *mainwin,
437 guint action,
438 GtkWidget *widget);
439 static void execute_summary_cb (MainWindow *mainwin,
440 guint action,
441 GtkWidget *widget);
442 static void update_summary_cb (MainWindow *mainwin,
443 guint action,
444 GtkWidget *widget);
445 static void open_config_folder_cb(MainWindow *mainwin,
446 guint action,
447 GtkWidget *widget);
448 static void open_attachments_folder_cb
449 (MainWindow *mainwin,
450 guint action,
451 GtkWidget *widget);
452
453 static void prev_cb (MainWindow *mainwin,
454 guint action,
455 GtkWidget *widget);
456 static void next_cb (MainWindow *mainwin,
457 guint action,
458 GtkWidget *widget);
459
460 static void prev_unread_cb (MainWindow *mainwin,
461 guint action,
462 GtkWidget *widget);
463 static void next_unread_cb (MainWindow *mainwin,
464 guint action,
465 GtkWidget *widget);
466 static void prev_new_cb (MainWindow *mainwin,
467 guint action,
468 GtkWidget *widget);
469 static void next_new_cb (MainWindow *mainwin,
470 guint action,
471 GtkWidget *widget);
472 static void prev_marked_cb (MainWindow *mainwin,
473 guint action,
474 GtkWidget *widget);
475 static void next_marked_cb (MainWindow *mainwin,
476 guint action,
477 GtkWidget *widget);
478 static void prev_labeled_cb (MainWindow *mainwin,
479 guint action,
480 GtkWidget *widget);
481 static void next_labeled_cb (MainWindow *mainwin,
482 guint action,
483 GtkWidget *widget);
484
485 static void goto_folder_cb (MainWindow *mainwin,
486 guint action,
487 GtkWidget *widget);
488
489 static void copy_cb (MainWindow *mainwin,
490 guint action,
491 GtkWidget *widget);
492 static void allsel_cb (MainWindow *mainwin,
493 guint action,
494 GtkWidget *widget);
495 static void select_thread_cb (MainWindow *mainwin,
496 guint action,
497 GtkWidget *widget);
498
499 static void create_filter_cb (MainWindow *mainwin,
500 guint action,
501 GtkWidget *widget);
502
503 static void prefs_common_open_cb (MainWindow *mainwin,
504 guint action,
505 GtkWidget *widget);
506 static void prefs_filter_open_cb (MainWindow *mainwin,
507 guint action,
508 GtkWidget *widget);
509 static void prefs_template_open_cb (MainWindow *mainwin,
510 guint action,
511 GtkWidget *widget);
512 static void plugin_manager_open_cb (MainWindow *mainwin,
513 guint action,
514 GtkWidget *widget);
515 #ifndef G_OS_WIN32
516 static void prefs_actions_open_cb (MainWindow *mainwin,
517 guint action,
518 GtkWidget *widget);
519 #endif
520 static void prefs_account_open_cb (MainWindow *mainwin,
521 guint action,
522 GtkWidget *widget);
523
524 static void new_account_cb (MainWindow *mainwin,
525 guint action,
526 GtkWidget *widget);
527
528 static void account_selector_menu_cb (GtkMenuItem *menuitem,
529 gpointer data);
530 static void account_receive_menu_cb (GtkMenuItem *menuitem,
531 gpointer data);
532
533 static void manual_open_cb (MainWindow *mainwin,
534 guint action,
535 GtkWidget *widget);
536 static void faq_open_cb (MainWindow *mainwin,
537 guint action,
538 GtkWidget *widget);
539 static void help_cmdline_cb (MainWindow *mainwin,
540 guint action,
541 GtkWidget *widget);
542 #if USE_UPDATE_CHECK
543 static void update_check_cb (MainWindow *mainwin,
544 guint action,
545 GtkWidget *widget);
546 #ifdef USE_UPDATE_CHECK_PLUGIN
547 static void update_check_plugin_cb(MainWindow *mainwin, guint action,
548 GtkWidget *widget);
549 #endif
550 #endif
551
552 static void scan_tree_func (Folder *folder,
553 FolderItem *item,
554 gpointer data);
555
556 static GtkItemFactoryEntry mainwin_entries[] =
557 {
558 {N_("/_File"), NULL, NULL, 0, "<Branch>"},
559 {N_("/_File/_Folder"), NULL, NULL, 0, "<Branch>"},
560 {N_("/_File/_Folder/Create _new folder..."),
561 NULL, new_folder_cb, 0, NULL},
562 {N_("/_File/_Folder/_Rename folder..."),NULL, rename_folder_cb, 0, NULL},
563 {N_("/_File/_Folder/_Move folder..."), NULL, move_folder_cb, 0, NULL},
564 {N_("/_File/_Folder/_Delete folder"), NULL, delete_folder_cb, 0, NULL},
565 {N_("/_File/_Mailbox"), NULL, NULL, 0, "<Branch>"},
566 {N_("/_File/_Mailbox/Add _mailbox..."), NULL, add_mailbox_cb, 0, NULL},
567 {N_("/_File/_Mailbox/_Remove mailbox"), NULL, remove_mailbox_cb, 0, NULL},
568 {N_("/_File/_Mailbox/---"), NULL, NULL, 0, "<Separator>"},
569 {N_("/_File/_Mailbox/_Check for new messages"),
570 NULL, update_folderview_cb, 0, NULL},
571 {N_("/_File/_Mailbox/Check for new messages in _all mailboxes"),
572 NULL, update_folderview_cb, 1, NULL},
573 {N_("/_File/_Mailbox/---"), NULL, NULL, 0, "<Separator>"},
574 {N_("/_File/_Mailbox/R_ebuild folder tree"),
575 NULL, rebuild_tree_cb, 0, NULL},
576 {N_("/_File/---"), NULL, NULL, 0, "<Separator>"},
577 {N_("/_File/_Import mail data..."), NULL, import_mail_cb, 0, NULL},
578 {N_("/_File/_Export mail data..."), NULL, export_mail_cb, 0, NULL},
579 {N_("/_File/---"), NULL, NULL, 0, "<Separator>"},
580 {N_("/_File/Empty all _trash"), NULL, empty_trash_cb, 0, NULL},
581 {N_("/_File/---"), NULL, NULL, 0, "<Separator>"},
582 {N_("/_File/_Save as..."), "<control>S", save_as_cb, 0, NULL},
583 {N_("/_File/---"), NULL, NULL, 0, "<Separator>"},
584 #if GTK_CHECK_VERSION(2, 10, 0)
585 {N_("/_File/Page set_up..."), NULL, page_setup_cb, 0, NULL},
586 #endif
587 {N_("/_File/_Print..."), NULL, print_cb, 0, NULL},
588 {N_("/_File/---"), NULL, NULL, 0, "<Separator>"},
589 {N_("/_File/_Work offline"), NULL, toggle_offline_cb, 0, "<ToggleItem>"},
590 {N_("/_File/---"), NULL, NULL, 0, "<Separator>"},
591 /* {N_("/_File/_Close"), "<alt>W", app_exit_cb, 0, NULL}, */
592 {N_("/_File/E_xit"), "<control>Q", app_exit_cb, 0, NULL},
593
594 {N_("/_Edit"), NULL, NULL, 0, "<Branch>"},
595 {N_("/_Edit/_Copy"), "<control>C", copy_cb, 0, NULL},
596 {N_("/_Edit/Select _all"), "<control>A", allsel_cb, 0, NULL},
597 {N_("/_Edit/Select _thread"), NULL, select_thread_cb, 0, NULL},
598 {N_("/_Edit/---"), NULL, NULL, 0, "<Separator>"},
599 {N_("/_Edit/_Find in current message..."),
600 "<control>F", search_cb, 0, NULL},
601 {N_("/_Edit/_Search messages..."), "<shift><control>F", search_cb, 1, NULL},
602 {N_("/_Edit/_Quick search"), "<shift><control>S", search_cb, 2, NULL},
603
604 {N_("/_View"), NULL, NULL, 0, "<Branch>"},
605 {N_("/_View/Show or hi_de"), NULL, NULL, 0, "<Branch>"},
606 {N_("/_View/Show or hi_de/_Folder tree"),
607 NULL, toggle_folder_cb, 0, "<ToggleItem>"},
608 {N_("/_View/Show or hi_de/_Message view"),
609 "V", toggle_message_cb, 0, "<ToggleItem>"},
610 {N_("/_View/Show or hi_de/_Toolbar"),
611 NULL, NULL, 0, "<Branch>"},
612 {N_("/_View/Show or hi_de/_Toolbar/Icon _and text"),
613 NULL, toggle_toolbar_cb, TOOLBAR_BOTH, "<RadioItem>"},
614 {N_("/_View/Show or hi_de/_Toolbar/Text at the _right of icon"),
615 NULL, toggle_toolbar_cb, TOOLBAR_BOTH_HORIZ, "/View/Show or hide/Toolbar/Icon and text"},
616 {N_("/_View/Show or hi_de/_Toolbar/_Icon"),
617 NULL, toggle_toolbar_cb, TOOLBAR_ICON, "/View/Show or hide/Toolbar/Icon and text"},
618 {N_("/_View/Show or hi_de/_Toolbar/_Text"),
619 NULL, toggle_toolbar_cb, TOOLBAR_TEXT, "/View/Show or hide/Toolbar/Icon and text"},
620 {N_("/_View/Show or hi_de/_Toolbar/_None"),
621 NULL, toggle_toolbar_cb, TOOLBAR_NONE, "/View/Show or hide/Toolbar/Icon and text"},
622 {N_("/_View/Show or hi_de/_Search bar"),
623 NULL, toggle_searchbar_cb, 0, "<ToggleItem>"},
624 {N_("/_View/Show or hi_de/Status _bar"),
625 NULL, toggle_statusbar_cb, 0, "<ToggleItem>"},
626 {N_("/_View/_Customize toolbar..."), NULL, toolbar_customize_cb, 0, NULL},
627 {N_("/_View/---"), NULL, NULL, 0, "<Separator>"},
628 {N_("/_View/Layou_t"), NULL, NULL, 0, "<Branch>"},
629 {N_("/_View/Layou_t/_Normal"), NULL, change_layout_cb, LAYOUT_NORMAL, "<RadioItem>"},
630 {N_("/_View/Layou_t/_Vertical"), NULL, change_layout_cb, LAYOUT_VERTICAL, "/View/Layout/Normal"},
631 {N_("/_View/Separate f_older tree"), NULL, separate_widget_cb, SEPARATE_FOLDER, "<ToggleItem>"},
632 {N_("/_View/Separate _message view"), NULL, separate_widget_cb, SEPARATE_MESSAGE, "<ToggleItem>"},
633 {N_("/_View/---"), NULL, NULL, 0, "<Separator>"},
634 {N_("/_View/_Sort"), NULL, NULL, 0, "<Branch>"},
635 {N_("/_View/_Sort/by _number"), NULL, sort_summary_cb, SORT_BY_NUMBER, "<RadioItem>"},
636 {N_("/_View/_Sort/by s_ize"), NULL, sort_summary_cb, SORT_BY_SIZE, "/View/Sort/by number"},
637 {N_("/_View/_Sort/by _date"), NULL, sort_summary_cb, SORT_BY_DATE, "/View/Sort/by number"},
638 {N_("/_View/_Sort/by t_hread date"), NULL, sort_summary_cb, SORT_BY_TDATE, "/View/Sort/by number"},
639 {N_("/_View/_Sort/by _from"), NULL, sort_summary_cb, SORT_BY_FROM, "/View/Sort/by number"},
640 {N_("/_View/_Sort/by _recipient"), NULL, sort_summary_cb, SORT_BY_TO, "/View/Sort/by number"},
641 {N_("/_View/_Sort/by _subject"), NULL, sort_summary_cb, SORT_BY_SUBJECT, "/View/Sort/by number"},
642 {N_("/_View/_Sort/by _color label"),
643 NULL, sort_summary_cb, SORT_BY_LABEL, "/View/Sort/by number"},
644 {N_("/_View/_Sort/by _mark"), NULL, sort_summary_cb, SORT_BY_MARK, "/View/Sort/by number"},
645 {N_("/_View/_Sort/by _unread"), NULL, sort_summary_cb, SORT_BY_UNREAD, "/View/Sort/by number"},
646 {N_("/_View/_Sort/by a_ttachment"),
647 NULL, sort_summary_cb, SORT_BY_MIME, "/View/Sort/by number"},
648 {N_("/_View/_Sort/D_on't sort"), NULL, sort_summary_cb, SORT_BY_NONE, "/View/Sort/by number"},
649 {N_("/_View/_Sort/---"), NULL, NULL, 0, "<Separator>"},
650 {N_("/_View/_Sort/Ascending"), NULL, sort_summary_type_cb, SORT_ASCENDING, "<RadioItem>"},
651 {N_("/_View/_Sort/Descending"), NULL, sort_summary_type_cb, SORT_DESCENDING, "/View/Sort/Ascending"},
652 {N_("/_View/_Sort/---"), NULL, NULL, 0, "<Separator>"},
653 {N_("/_View/_Sort/_Attract by subject"),
654 NULL, attract_by_subject_cb, 0, NULL},
655 {N_("/_View/Th_read view"), "<control>T", thread_cb, 0, "<ToggleItem>"},
656 {N_("/_View/E_xpand all threads"), NULL, expand_threads_cb, 0, NULL},
657 {N_("/_View/Co_llapse all threads"), NULL, collapse_threads_cb, 0, NULL},
658 {N_("/_View/Set display _item..."), NULL, set_display_item_cb, 0, NULL},
659
660 {N_("/_View/---"), NULL, NULL, 0, "<Separator>"},
661 {N_("/_View/_Go to"), NULL, NULL, 0, "<Branch>"},
662 {N_("/_View/_Go to/_Prev message"), "P", prev_cb, 0, NULL},
663 {N_("/_View/_Go to/_Next message"), "N", next_cb, 0, NULL},
664 {N_("/_View/_Go to/---"), NULL, NULL, 0, "<Separator>"},
665 {N_("/_View/_Go to/P_rev unread message"),
666 "<shift>P", prev_unread_cb, 0, NULL},
667 {N_("/_View/_Go to/N_ext unread message"),
668 "<shift>N", next_unread_cb, 0, NULL},
669 {N_("/_View/_Go to/---"), NULL, NULL, 0, "<Separator>"},
670 {N_("/_View/_Go to/Prev ne_w message"), NULL, prev_new_cb, 0, NULL},
671 {N_("/_View/_Go to/Ne_xt new message"), NULL, next_new_cb, 0, NULL},
672 {N_("/_View/_Go to/---"), NULL, NULL, 0, "<Separator>"},
673 {N_("/_View/_Go to/Prev _marked message"),
674 NULL, prev_marked_cb, 0, NULL},
675 {N_("/_View/_Go to/Next m_arked message"),
676 NULL, next_marked_cb, 0, NULL},
677 {N_("/_View/_Go to/---"), NULL, NULL, 0, "<Separator>"},
678 {N_("/_View/_Go to/Prev _labeled message"),
679 NULL, prev_labeled_cb, 0, NULL},
680 {N_("/_View/_Go to/Next la_beled message"),
681 NULL, next_labeled_cb, 0, NULL},
682 {N_("/_View/_Go to/---"), NULL, NULL, 0, "<Separator>"},
683 {N_("/_View/_Go to/Other _folder..."), "G", goto_folder_cb, 0, NULL},
684 {N_("/_View/---"), NULL, NULL, 0, "<Separator>"},
685
686 #define ENC_SEPARATOR \
687 {N_("/_View/Character _encoding/---"), NULL, NULL, 0, "<Separator>"}
688 #define ENC_ACTION(action) \
689 NULL, set_charset_cb, action, "/View/Character encoding/Auto detect"
690
691 {N_("/_View/Character _encoding"), NULL, NULL, 0, "<Branch>"},
692 {N_("/_View/Character _encoding/_Auto detect"),
693 NULL, set_charset_cb, C_AUTO, "<RadioItem>"},
694 {N_("/_View/Character _encoding/---"), NULL, NULL, 0, "<Separator>"},
695 {N_("/_View/Character _encoding/7bit ascii (US-ASC_II)"),
696 ENC_ACTION(C_US_ASCII)},
697 {N_("/_View/Character _encoding/Unicode (_UTF-8)"),
698 ENC_ACTION(C_UTF_8)},
699 ENC_SEPARATOR,
700
701 {N_("/_View/Character _encoding/Western European (ISO-8859-_1)"),
702 ENC_ACTION(C_ISO_8859_1)},
703 {N_("/_View/Character _encoding/Western European (ISO-8859-15)"),
704 ENC_ACTION(C_ISO_8859_15)},
705 {N_("/_View/Character _encoding/Western European (Windows-1252)"),
706 ENC_ACTION(C_WINDOWS_1252)},
707 ENC_SEPARATOR,
708
709 {N_("/_View/Character _encoding/Central European (ISO-8859-_2)"),
710 ENC_ACTION(C_ISO_8859_2)},
711 ENC_SEPARATOR,
712
713 {N_("/_View/Character _encoding/_Baltic (ISO-8859-13)"),
714 ENC_ACTION(C_ISO_8859_13)},
715 {N_("/_View/Character _encoding/Baltic (ISO-8859-_4)"),
716 ENC_ACTION(C_ISO_8859_4)},
717 {N_("/_View/Character _encoding/Baltic (Windows-1257)"),
718 ENC_ACTION(C_WINDOWS_1257)},
719 ENC_SEPARATOR,
720
721 {N_("/_View/Character _encoding/Greek (ISO-8859-_7)"),
722 ENC_ACTION(C_ISO_8859_7)},
723 ENC_SEPARATOR,
724
725 {N_("/_View/Character _encoding/Arabic (ISO-8859-_6)"),
726 ENC_ACTION(C_ISO_8859_6)},
727 {N_("/_View/Character _encoding/Arabic (Windows-1256)"),
728 ENC_ACTION(C_CP1256)},
729 ENC_SEPARATOR,
730
731 {N_("/_View/Character _encoding/Hebrew (ISO-8859-_8)"),
732 ENC_ACTION(C_ISO_8859_8)},
733 {N_("/_View/Character _encoding/Hebrew (Windows-1255)"),
734 ENC_ACTION(C_CP1255)},
735 ENC_SEPARATOR,
736
737 {N_("/_View/Character _encoding/Turkish (ISO-8859-_9)"),
738 ENC_ACTION(C_ISO_8859_9)},
739 ENC_SEPARATOR,
740
741 {N_("/_View/Character _encoding/Cyrillic (ISO-8859-_5)"),
742 ENC_ACTION(C_ISO_8859_5)},
743 {N_("/_View/Character _encoding/Cyrillic (KOI8-_R)"),
744 ENC_ACTION(C_KOI8_R)},
745 {N_("/_View/Character _encoding/Cyrillic (KOI8-U)"),
746 ENC_ACTION(C_KOI8_U)},
747 {N_("/_View/Character _encoding/Cyrillic (Windows-1251)"),
748 ENC_ACTION(C_CP1251)},
749 ENC_SEPARATOR,
750
751 {N_("/_View/Character _encoding/Japanese (ISO-2022-_JP)"),
752 ENC_ACTION(C_ISO_2022_JP)},
753 {N_("/_View/Character _encoding/Japanese (ISO-2022-JP-2)"),
754 ENC_ACTION(C_ISO_2022_JP_2)},
755 {N_("/_View/Character _encoding/Japanese (_EUC-JP)"),
756 ENC_ACTION(C_EUC_JP)},
757 {N_("/_View/Character _encoding/Japanese (_Shift__JIS)"),
758 ENC_ACTION(C_SHIFT_JIS)},
759 ENC_SEPARATOR,
760
761 {N_("/_View/Character _encoding/Simplified Chinese (_GB2312)"),
762 ENC_ACTION(C_GB2312)},
763 {N_("/_View/Character _encoding/Simplified Chinese (GBK)"),
764 ENC_ACTION(C_GBK)},
765 {N_("/_View/Character _encoding/Traditional Chinese (_Big5)"),
766 ENC_ACTION(C_BIG5)},
767 {N_("/_View/Character _encoding/Traditional Chinese (EUC-_TW)"),
768 ENC_ACTION(C_EUC_TW)},
769 {N_("/_View/Character _encoding/Chinese (ISO-2022-_CN)"),
770 ENC_ACTION(C_ISO_2022_CN)},
771 ENC_SEPARATOR,
772
773 {N_("/_View/Character _encoding/Korean (EUC-_KR)"),
774 ENC_ACTION(C_EUC_KR)},
775 {N_("/_View/Character _encoding/Korean (ISO-2022-KR)"),
776 ENC_ACTION(C_ISO_2022_KR)},
777 ENC_SEPARATOR,
778
779 {N_("/_View/Character _encoding/Thai (TIS-620)"),
780 ENC_ACTION(C_TIS_620)},
781 {N_("/_View/Character _encoding/Thai (Windows-874)"),
782 ENC_ACTION(C_WINDOWS_874)},
783
784 #undef CODESET_SEPARATOR
785 #undef CODESET_ACTION
786
787 {N_("/_View/---"), NULL, NULL, 0, "<Separator>"},
788 {N_("/_View/Open in new _window"), "<control><alt>N", open_msg_cb, 0, NULL},
789 {N_("/_View/Mess_age source"), "<control>U", view_source_cb, 0, NULL},
790 {N_("/_View/All _headers"), "<control>H", show_all_header_cb, 0, "<ToggleItem>"},
791 {N_("/_View/---"), NULL, NULL, 0, "<Separator>"},
792 {N_("/_View/_Update summary"), "<control><alt>U", update_summary_cb, 0, NULL},
793
794 {N_("/_Message"), NULL, NULL, 0, "<Branch>"},
795 {N_("/_Message/Recei_ve"), NULL, NULL, 0, "<Branch>"},
796 {N_("/_Message/Recei_ve/Get from _current account"),
797 "<control>I", inc_mail_cb, 0, NULL},
798 {N_("/_Message/Recei_ve/Get from _all accounts"),
799 "<shift><control>I", inc_all_account_mail_cb, 0, NULL},
800 {N_("/_Message/Recei_ve/Stop receivin_g"),
801 NULL, inc_stop_cb, 0, NULL},
802 {N_("/_Message/Recei_ve/_Remote mailbox..."),
803 NULL, rpop3_cb, 0, NULL},
804 {N_("/_Message/Recei_ve/---"), NULL, NULL, 0, "<Separator>"},
805 {N_("/_Message/_Send queued messages"), NULL, send_queue_cb, 0, NULL},
806 {N_("/_Message/---"), NULL, NULL, 0, "<Separator>"},
807 {N_("/_Message/Compose _new message"), "<control>M", compose_cb, 0, NULL},
808 {N_("/_Message/---"), NULL, NULL, 0, "<Separator>"},
809 {N_("/_Message/_Reply"), "<control>R", reply_cb, COMPOSE_REPLY, NULL},
810 {N_("/_Message/Repl_y to"), NULL, NULL, 0, "<Branch>"},
811 {N_("/_Message/Repl_y to/_all"), "<shift><control>R", reply_cb, COMPOSE_REPLY_TO_ALL, NULL},
812 {N_("/_Message/Repl_y to/_sender"), NULL, reply_cb, COMPOSE_REPLY_TO_SENDER, NULL},
813 {N_("/_Message/Repl_y to/mailing _list"),
814 "<control>L", reply_cb, COMPOSE_REPLY_TO_LIST, NULL},
815 {N_("/_Message/---"), NULL, NULL, 0, "<Separator>"},
816 {N_("/_Message/_Forward"), "<control><alt>F", reply_cb, COMPOSE_FORWARD, NULL},
817 {N_("/_Message/For_ward as attachment"),
818 "<shift><control><alt>F", reply_cb, COMPOSE_FORWARD_AS_ATTACH, NULL},
819 {N_("/_Message/Redirec_t"), NULL, reply_cb, COMPOSE_REDIRECT, NULL},
820 {N_("/_Message/---"), NULL, NULL, 0, "<Separator>"},
821 {N_("/_Message/M_ove..."), "<control>O", move_to_cb, 0, NULL},
822 {N_("/_Message/_Copy..."), "<shift><control>O", copy_to_cb, 0, NULL},
823 {N_("/_Message/---"), NULL, NULL, 0, "<Separator>"},
824 {N_("/_Message/_Mark"), NULL, NULL, 0, "<Branch>"},
825 {N_("/_Message/_Mark/Set _flag"), "<shift>asterisk", mark_cb, 0, NULL},
826 {N_("/_Message/_Mark/_Unset flag"), "U", unmark_cb, 0, NULL},
827 {N_("/_Message/_Mark/---"), NULL, NULL, 0, "<Separator>"},
828 {N_("/_Message/_Mark/Mark as unr_ead"), "<shift>exclam", mark_as_unread_cb, 0, NULL},
829 {N_("/_Message/_Mark/Mark as rea_d"),
830 NULL, mark_as_read_cb, 0, NULL},
831 {N_("/_Message/_Mark/Mark _thread as read"),
832 NULL, mark_thread_as_read_cb, 0, NULL},
833 {N_("/_Message/_Mark/Mark all _read"), NULL, mark_all_read_cb, 0, NULL},
834 {N_("/_Message/---"), NULL, NULL, 0, "<Separator>"},
835 {N_("/_Message/_Delete"), "<control>D", delete_cb, 0, NULL},
836 {N_("/_Message/---"), NULL, NULL, 0, "<Separator>"},
837 {N_("/_Message/Set as _junk mail"), "<control>J", junk_cb, 0, NULL},
838 {N_("/_Message/Set as not j_unk mail"), "<shift><control>J", junk_cb, 1, NULL},
839 {N_("/_Message/---"), NULL, NULL, 0, "<Separator>"},
840 {N_("/_Message/Re-_edit"), NULL, reedit_cb, 0, NULL},
841
842 {N_("/_Tools"), NULL, NULL, 0, "<Branch>"},
843 {N_("/_Tools/_Address book"), "<shift><control>A", addressbook_open_cb, 0, NULL},
844 {N_("/_Tools/Add sender to address boo_k..."),
845 NULL, add_address_cb, 0, NULL},
846 {N_("/_Tools/---"), NULL, NULL, 0, "<Separator>"},
847 {N_("/_Tools/_Filter all messages in folder"),
848 NULL, filter_cb, 0, NULL},
849 {N_("/_Tools/Filter _selected messages"),
850 NULL, filter_cb, 1, NULL},
851 {N_("/_Tools/_Create filter rule"), NULL, NULL, 0, "<Branch>"},
852 {N_("/_Tools/_Create filter rule/_Automatically"),
853 NULL, create_filter_cb, FLT_BY_AUTO, NULL},
854 {N_("/_Tools/_Create filter rule/by _From"),
855 NULL, create_filter_cb, FLT_BY_FROM, NULL},
856 {N_("/_Tools/_Create filter rule/by _To"),
857 NULL, create_filter_cb, FLT_BY_TO, NULL},
858 {N_("/_Tools/_Create filter rule/by _Subject"),
859 NULL, create_filter_cb, FLT_BY_SUBJECT, NULL},
860 {N_("/_Tools/---"), NULL, NULL, 0, "<Separator>"},
861 {N_("/_Tools/Filter _junk mails in folder"),
862 NULL, filter_junk_cb, 0, NULL},
863 {N_("/_Tools/Filter junk _mails in selected messages"),
864 NULL, filter_junk_cb, 1, NULL},
865 {N_("/_Tools/---"), NULL, NULL, 0, "<Separator>"},
866 #ifndef G_OS_WIN32
867 {N_("/_Tools/Actio_ns"), NULL, NULL, 0, "<Branch>"},
868 {N_("/_Tools/---"), NULL, NULL, 0, "<Separator>"},
869 #endif
870 {N_("/_Tools/Delete du_plicated messages"),
871 NULL, delete_duplicated_cb, 0, NULL},
872 {N_("/_Tools/C_oncatenate separated messages"),
873 NULL, concat_partial_cb, 0, NULL},
874 {N_("/_Tools/---"), NULL, NULL, 0, "<Separator>"},
875 {N_("/_Tools/E_xecute marked process"), "X", execute_summary_cb, 0, NULL},
876 {N_("/_Tools/---"), NULL, NULL, 0, "<Separator>"},
877 {N_("/_Tools/Op_en configuration folder"),
878 NULL, open_config_folder_cb, 0, NULL},
879 {N_("/_Tools/Open a_ttachments folder"),NULL, open_attachments_folder_cb, 0, NULL},
880 {N_("/_Tools/---"), NULL, NULL, 0, "<Separator>"},
881 {N_("/_Tools/_Log window"), "<shift><control>L", log_window_show_cb, 0, NULL},
882
883 {N_("/_Configuration"), NULL, NULL, 0, "<Branch>"},
884 {N_("/_Configuration/_Common preferences..."),
885 NULL, prefs_common_open_cb, 0, NULL},
886 {N_("/_Configuration/_Filter settings..."),
887 NULL, prefs_filter_open_cb, 0, NULL},
888 {N_("/_Configuration/_Template..."), NULL, prefs_template_open_cb, 0, NULL},
889 #ifndef G_OS_WIN32
890 {N_("/_Configuration/_Actions..."), NULL, prefs_actions_open_cb, 0, NULL},
891 #endif
892 {N_("/_Configuration/Plug-in _manager..."),
893 NULL, plugin_manager_open_cb, 0, NULL},
894 {N_("/_Configuration/---"), NULL, NULL, 0, "<Separator>"},
895 {N_("/_Configuration/_Preferences for current account..."),
896 NULL, prefs_account_open_cb, 0, NULL},
897 {N_("/_Configuration/Create _new account..."),
898 NULL, new_account_cb, 0, NULL},
899 {N_("/_Configuration/_Edit accounts..."),
900 NULL, account_edit_open, 0, NULL},
901 {N_("/_Configuration/C_hange current account"),
902 NULL, NULL, 0, "<Branch>"},
903
904 {N_("/_Help"), NULL, NULL, 0, "<Branch>"},
905 {N_("/_Help/_Manual"), NULL, NULL, 0, "<Branch>"},
906 {N_("/_Help/_Manual/_English"), NULL, manual_open_cb, MANUAL_LANG_EN, NULL},
907 {N_("/_Help/_Manual/_Japanese"), NULL, manual_open_cb, MANUAL_LANG_JA, NULL},
908 {N_("/_Help/_FAQ"), NULL, NULL, 0, "<Branch>"},
909 {N_("/_Help/_FAQ/_English"), NULL, faq_open_cb, MANUAL_LANG_EN, NULL},
910 {N_("/_Help/_FAQ/_German"), NULL, faq_open_cb, MANUAL_LANG_DE, NULL},
911 {N_("/_Help/_FAQ/_Spanish"), NULL, faq_open_cb, MANUAL_LANG_ES, NULL},
912 {N_("/_Help/_FAQ/_French"), NULL, faq_open_cb, MANUAL_LANG_FR, NULL},
913 {N_("/_Help/_FAQ/_Italian"), NULL, faq_open_cb, MANUAL_LANG_IT, NULL},
914 {N_("/_Help/_Command line options"), NULL, help_cmdline_cb, 0, NULL},
915 #if USE_UPDATE_CHECK
916 {N_("/_Help/---"), NULL, NULL, 0, "<Separator>"},
917 {N_("/_Help/_Update check..."), NULL, update_check_cb, 0, NULL},
918 #ifdef USE_UPDATE_CHECK_PLUGIN
919 {N_("/_Help/Update check of _plug-ins..."),
920 NULL, update_check_plugin_cb, 0, NULL},
921 #endif
922 #endif
923 {N_("/_Help/---"), NULL, NULL, 0, "<Separator>"},
924 {N_("/_Help/_About"), NULL, about_show, 0, NULL}
925 };
926
main_window_create(SeparateType type)927 MainWindow *main_window_create(SeparateType type)
928 {
929 MainWindow *mainwin;
930 GtkWidget *window;
931 GtkWidget *vbox;
932 GtkWidget *menubar;
933 GtkWidget *toolbar;
934 GtkWidget *hbox_spc;
935 GtkWidget *vbox_body;
936 GtkWidget *statusbar;
937 GtkWidget *progressbar;
938 GtkWidget *statuslabel;
939 GtkWidget *online_hbox;
940 GtkWidget *online_switch;
941 GtkWidget *online_pixmap;
942 GtkWidget *offline_pixmap;
943 GtkTooltips *online_tip;
944 #if !GTK_CHECK_VERSION(2, 6, 0)
945 GtkWidget *spacer_hbox;
946 #endif
947 GtkWidget *ac_button;
948 GtkWidget *ac_label;
949
950 TrayIcon *tray_icon;
951
952 FolderView *folderview;
953 SummaryView *summaryview;
954 MessageView *messageview;
955 GdkColormap *colormap;
956 GdkColor color[3];
957 gboolean success[3];
958 guint n_menu_entries;
959 GtkItemFactory *ifactory;
960 GtkWidget *ac_menu;
961 GtkWidget *menuitem;
962 gint i;
963
964 static GdkGeometry geometry;
965
966 debug_print(_("Creating main window...\n"));
967 mainwin = g_new0(MainWindow, 1);
968
969 /* main window */
970 window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
971 gtk_window_set_title(GTK_WINDOW(window), PROG_VERSION);
972 gtk_window_set_policy(GTK_WINDOW(window), TRUE, TRUE, FALSE);
973 gtk_window_set_wmclass(GTK_WINDOW(window), "main_window", "Sylpheed");
974 gtk_widget_add_events(window, GDK_VISIBILITY_NOTIFY_MASK);
975 g_signal_connect(G_OBJECT(window), "key_press_event",
976 G_CALLBACK(main_window_key_pressed), mainwin);
977
978 if (!geometry.min_height) {
979 geometry.min_width = 320;
980 geometry.min_height = 200;
981 }
982 gtk_window_set_geometry_hints(GTK_WINDOW(window), NULL, &geometry,
983 GDK_HINT_MIN_SIZE);
984
985 g_signal_connect(G_OBJECT(window), "delete_event",
986 G_CALLBACK(main_window_close_cb), mainwin);
987 MANAGE_WINDOW_SIGNALS_CONNECT(window);
988 gtk_widget_realize(window);
989
990 vbox = gtk_vbox_new(FALSE, 0);
991 gtk_widget_show(vbox);
992 gtk_container_add(GTK_CONTAINER(window), vbox);
993
994 /* menu bar */
995 n_menu_entries = sizeof(mainwin_entries) / sizeof(mainwin_entries[0]);
996 menubar = menubar_create(window, mainwin_entries,
997 n_menu_entries, "<Main>", mainwin);
998 gtk_widget_show(menubar);
999 gtk_widget_set_size_request(menubar, 300, -1);
1000 gtk_box_pack_start(GTK_BOX(vbox), menubar, FALSE, TRUE, 0);
1001 ifactory = gtk_item_factory_from_widget(menubar);
1002
1003 /* toolbar */
1004 mainwin->toolbar_tip = gtk_tooltips_new();
1005 toolbar = main_window_toolbar_create(mainwin);
1006 gtk_widget_set_size_request(toolbar, 300, -1);
1007 gtk_box_pack_start(GTK_BOX(vbox), toolbar, FALSE, FALSE, 0);
1008
1009 hbox_spc = gtk_hbox_new(FALSE, 0);
1010 gtk_widget_show(hbox_spc);
1011 gtk_widget_set_size_request(hbox_spc, -1, BORDER_WIDTH);
1012 gtk_box_pack_start(GTK_BOX(vbox), hbox_spc, FALSE, FALSE, 0);
1013
1014 /* vbox that contains body */
1015 vbox_body = gtk_vbox_new(FALSE, BORDER_WIDTH);
1016 gtk_widget_show(vbox_body);
1017 gtk_container_set_border_width(GTK_CONTAINER(vbox_body), 0);
1018 gtk_box_pack_start(GTK_BOX(vbox), vbox_body, TRUE, TRUE, 0);
1019
1020 statusbar = statusbar_create();
1021 gtk_box_pack_end(GTK_BOX(vbox_body), statusbar, FALSE, FALSE, 0);
1022
1023 progressbar = gtk_progress_bar_new();
1024 gtk_widget_set_size_request(progressbar, 120, 1);
1025 gtk_box_pack_start(GTK_BOX(statusbar), progressbar, FALSE, FALSE, 0);
1026
1027 statuslabel = gtk_label_new("");
1028 gtk_box_pack_start(GTK_BOX(statusbar), statuslabel, FALSE, FALSE, 0);
1029
1030 online_hbox = gtk_hbox_new(FALSE, 0);
1031
1032 online_pixmap = stock_pixbuf_widget(statusbar, STOCK_PIXMAP_ONLINE);
1033 offline_pixmap = stock_pixbuf_widget(statusbar, STOCK_PIXMAP_OFFLINE);
1034 gtk_box_pack_start(GTK_BOX(online_hbox), online_pixmap,
1035 FALSE, FALSE, 0);
1036 gtk_box_pack_start(GTK_BOX(online_hbox), offline_pixmap,
1037 FALSE, FALSE, 0);
1038
1039 online_switch = gtk_button_new();
1040 gtk_button_set_relief(GTK_BUTTON(online_switch), GTK_RELIEF_NONE);
1041 GTK_WIDGET_UNSET_FLAGS(online_switch, GTK_CAN_FOCUS);
1042 #ifdef G_OS_WIN32
1043 gtk_widget_set_size_request(online_switch, 34, 20);
1044 #else
1045 gtk_widget_set_size_request(online_switch, 34, 24);
1046 #endif
1047 gtk_container_add(GTK_CONTAINER(online_switch), online_hbox);
1048 g_signal_connect(G_OBJECT(online_switch), "clicked",
1049 G_CALLBACK(online_switch_clicked), mainwin);
1050 gtk_box_pack_start(GTK_BOX(statusbar), online_switch, FALSE, FALSE, 0);
1051
1052 online_tip = gtk_tooltips_new();
1053
1054 #if !GTK_CHECK_VERSION(2, 6, 0)
1055 spacer_hbox = gtk_hbox_new(FALSE, 0);
1056 gtk_box_pack_end(GTK_BOX(statusbar), spacer_hbox, FALSE, FALSE, 0);
1057 #endif
1058
1059 ac_button = gtk_button_new();
1060 gtk_button_set_relief(GTK_BUTTON(ac_button), GTK_RELIEF_NONE);
1061 GTK_WIDGET_UNSET_FLAGS(ac_button, GTK_CAN_FOCUS);
1062 gtk_widget_set_size_request(ac_button, -1, 1);
1063 gtk_box_pack_end(GTK_BOX(statusbar), ac_button, FALSE, FALSE, 0);
1064 g_signal_connect(G_OBJECT(ac_button), "button_press_event",
1065 G_CALLBACK(ac_label_button_pressed), mainwin);
1066
1067 ac_label = gtk_label_new("");
1068 gtk_container_add(GTK_CONTAINER(ac_button), ac_label);
1069
1070 gtk_widget_show_all(statusbar);
1071
1072 tray_icon = trayicon_create(mainwin);
1073 if (tray_icon && prefs_common.show_trayicon)
1074 trayicon_show(tray_icon);
1075
1076 /* create views */
1077 mainwin->folderview = folderview = folderview_create();
1078 mainwin->summaryview = summaryview = summary_create();
1079 mainwin->messageview = messageview = messageview_create();
1080 mainwin->logwin = log_window_create();
1081
1082 quick_search_create(summaryview);
1083
1084 folderview->mainwin = mainwin;
1085 folderview->summaryview = summaryview;
1086
1087 summaryview->mainwin = mainwin;
1088 summaryview->folderview = folderview;
1089 summaryview->messageview = messageview;
1090 summaryview->window = window;
1091
1092 messageview->statusbar = statusbar;
1093 messageview->mainwin = mainwin;
1094
1095 mainwin->window = window;
1096 mainwin->vbox = vbox;
1097 mainwin->menubar = menubar;
1098 mainwin->menu_factory = ifactory;
1099 mainwin->toolbar = toolbar;
1100 mainwin->vbox_body = vbox_body;
1101 mainwin->statusbar = statusbar;
1102 mainwin->progressbar = progressbar;
1103 mainwin->statuslabel = statuslabel;
1104 mainwin->online_switch = online_switch;
1105 mainwin->online_pixmap = online_pixmap;
1106 mainwin->offline_pixmap = offline_pixmap;
1107 mainwin->online_tip = online_tip;
1108 mainwin->ac_button = ac_button;
1109 mainwin->ac_label = ac_label;
1110
1111 mainwin->tray_icon = tray_icon;
1112
1113 /* set context IDs for status bar */
1114 mainwin->mainwin_cid = gtk_statusbar_get_context_id
1115 (GTK_STATUSBAR(statusbar), "Main Window");
1116 mainwin->folderview_cid = gtk_statusbar_get_context_id
1117 (GTK_STATUSBAR(statusbar), "Folder View");
1118 mainwin->summaryview_cid = gtk_statusbar_get_context_id
1119 (GTK_STATUSBAR(statusbar), "Summary View");
1120 mainwin->messageview_cid = gtk_statusbar_get_context_id
1121 (GTK_STATUSBAR(statusbar), "Message View");
1122
1123 messageview->statusbar_cid = mainwin->messageview_cid;
1124
1125 /* allocate colors for summary view and folder view */
1126 summaryview->color_marked.red = summaryview->color_marked.green = 0;
1127 summaryview->color_marked.blue = (guint16)65535;
1128
1129 summaryview->color_dim.red = summaryview->color_dim.green =
1130 summaryview->color_dim.blue = COLOR_DIM;
1131
1132 folderview->color_new.red = (guint16)55000;
1133 folderview->color_new.green = folderview->color_new.blue = 15000;
1134
1135 folderview->color_noselect.red = folderview->color_noselect.green =
1136 folderview->color_noselect.blue = COLOR_DIM;
1137
1138 color[0] = summaryview->color_marked;
1139 color[1] = summaryview->color_dim;
1140 color[2] = folderview->color_new;
1141
1142 colormap = gdk_window_get_colormap(window->window);
1143 gdk_colormap_alloc_colors(colormap, color, 3, FALSE, TRUE, success);
1144 for (i = 0; i < 3; i++) {
1145 if (success[i] == FALSE)
1146 g_warning(_("MainWindow: color allocation %d failed\n"), i);
1147 }
1148
1149 if (prefs_common.layout_type == LAYOUT_VERTICAL)
1150 messageview->visible = TRUE;
1151 else
1152 messageview->visible = prefs_common.msgview_visible;
1153
1154 main_window_set_widgets(mainwin, prefs_common.layout_type, type);
1155
1156 if (prefs_common.mainwin_maximized)
1157 gtk_window_maximize(GTK_WINDOW(window));
1158
1159 g_signal_connect(G_OBJECT(window), "size_allocate",
1160 G_CALLBACK(main_window_size_allocate_cb), mainwin);
1161 g_signal_connect(G_OBJECT(window), "window_state_event",
1162 G_CALLBACK(main_window_window_state_cb), mainwin);
1163 g_signal_connect(G_OBJECT(window), "visibility_notify_event",
1164 G_CALLBACK(main_window_visibility_notify_cb), mainwin);
1165
1166 /* set menu items */
1167 menuitem = gtk_item_factory_get_item
1168 (ifactory, "/View/Character encoding/Auto detect");
1169 gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menuitem), TRUE);
1170
1171 main_window_toolbar_toggle_menu_set_active
1172 (mainwin, prefs_common.toolbar_style);
1173
1174 gtk_widget_hide(GTK_WIDGET_PTR(summaryview->qsearch));
1175 menuitem = gtk_item_factory_get_item
1176 (ifactory, "/View/Show or hide/Search bar");
1177 gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menuitem),
1178 prefs_common.show_searchbar);
1179
1180 gtk_widget_hide(mainwin->statusbar);
1181 menuitem = gtk_item_factory_get_item
1182 (ifactory, "/View/Show or hide/Status bar");
1183 gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menuitem),
1184 prefs_common.show_statusbar);
1185
1186 /* set account selection menu */
1187 ac_menu = gtk_item_factory_get_widget
1188 (ifactory, "/Configuration/Change current account");
1189 g_signal_connect(G_OBJECT(ac_menu), "selection_done",
1190 G_CALLBACK(ac_menu_popup_closed), mainwin);
1191 mainwin->ac_menu = ac_menu;
1192
1193 main_window_set_toolbar_sensitive(mainwin);
1194 main_window_set_toolbar_button_visibility(mainwin);
1195
1196 /* create actions menu */
1197 #ifndef G_OS_WIN32
1198 action_update_mainwin_menu(ifactory, mainwin);
1199 #endif
1200
1201 /* initialize online switch */
1202 if (prefs_common.startup_online_mode == 1)
1203 prefs_common.online_mode = TRUE;
1204 else if (prefs_common.startup_online_mode == 0)
1205 prefs_common.online_mode = FALSE;
1206 prefs_common.online_mode = !prefs_common.online_mode;
1207 online_switch_clicked(online_switch, mainwin);
1208
1209 /* show main window */
1210 gtk_widget_show(mainwin->window);
1211
1212 #if !GTK_CHECK_VERSION(2, 6, 0)
1213 {
1214 gint w, h;
1215 gdk_drawable_get_size
1216 (GDK_DRAWABLE(GTK_STATUSBAR(statusbar)->grip_window),
1217 &w, &h);
1218 gtk_widget_set_size_request(spacer_hbox, w, -1);
1219 }
1220 #endif
1221
1222 /* initialize views */
1223 folderview_init(folderview);
1224 summary_init(summaryview);
1225 messageview_init(messageview);
1226 log_window_init(mainwin->logwin);
1227
1228 mainwin->lock_count = 0;
1229 mainwin->menu_lock_count = 0;
1230 mainwin->cursor_count = 0;
1231
1232 mainwin->window_hidden = FALSE;
1233 mainwin->window_obscured = FALSE;
1234
1235 if (!watch_cursor)
1236 watch_cursor = gdk_cursor_new(GDK_WATCH);
1237
1238 mainwin_list = g_list_append(mainwin_list, mainwin);
1239
1240 debug_print(_("done.\n"));
1241
1242 return mainwin;
1243 }
1244
main_window_cursor_wait(MainWindow * mainwin)1245 void main_window_cursor_wait(MainWindow *mainwin)
1246 {
1247
1248 if (mainwin->cursor_count == 0)
1249 gdk_window_set_cursor(mainwin->window->window, watch_cursor);
1250
1251 mainwin->cursor_count++;
1252
1253 gdk_flush();
1254 }
1255
main_window_cursor_normal(MainWindow * mainwin)1256 void main_window_cursor_normal(MainWindow *mainwin)
1257 {
1258 if (mainwin->cursor_count)
1259 mainwin->cursor_count--;
1260
1261 if (mainwin->cursor_count == 0)
1262 gdk_window_set_cursor(mainwin->window->window, NULL);
1263
1264 gdk_flush();
1265 }
1266
1267 /* lock / unlock the user-interface */
main_window_lock(MainWindow * mainwin)1268 void main_window_lock(MainWindow *mainwin)
1269 {
1270 if (mainwin->lock_count == 0)
1271 gtk_widget_set_sensitive(mainwin->ac_button, FALSE);
1272
1273 mainwin->lock_count++;
1274
1275 main_window_set_menu_sensitive(mainwin);
1276 main_window_set_toolbar_sensitive(mainwin);
1277 }
1278
main_window_unlock(MainWindow * mainwin)1279 void main_window_unlock(MainWindow *mainwin)
1280 {
1281 if (mainwin->lock_count)
1282 mainwin->lock_count--;
1283
1284 main_window_set_menu_sensitive(mainwin);
1285 main_window_set_toolbar_sensitive(mainwin);
1286
1287 if (mainwin->lock_count == 0)
1288 gtk_widget_set_sensitive(mainwin->ac_button, TRUE);
1289 }
1290
main_window_menu_callback_block(MainWindow * mainwin)1291 static void main_window_menu_callback_block(MainWindow *mainwin)
1292 {
1293 mainwin->menu_lock_count++;
1294 }
1295
main_window_menu_callback_unblock(MainWindow * mainwin)1296 static void main_window_menu_callback_unblock(MainWindow *mainwin)
1297 {
1298 if (mainwin->menu_lock_count)
1299 mainwin->menu_lock_count--;
1300 }
1301
main_window_reflect_prefs_all(void)1302 void main_window_reflect_prefs_all(void)
1303 {
1304 MainWindow *mainwin;
1305
1306 mainwin = main_window_get();
1307
1308 main_window_show_cur_account(mainwin);
1309 main_window_set_menu_sensitive(mainwin);
1310 main_window_set_toolbar_sensitive(mainwin);
1311 main_window_set_toolbar_button_visibility(mainwin);
1312
1313 if (mainwin->tray_icon) {
1314 if (prefs_common.show_trayicon)
1315 trayicon_show(mainwin->tray_icon);
1316 else {
1317 /* trayicon is automatically replaced by new one */
1318 trayicon_hide(mainwin->tray_icon);
1319 }
1320 }
1321
1322 folderview_reflect_prefs(mainwin->folderview);
1323
1324 messageview_reflect_prefs(mainwin->messageview);
1325
1326 headerview_set_visibility(mainwin->messageview->headerview,
1327 prefs_common.display_header_pane);
1328
1329 textview_reflect_prefs(mainwin->messageview->textview);
1330 textview_reflect_prefs(mainwin->messageview->mimeview->textview);
1331
1332 summary_redisplay_msg(mainwin->summaryview);
1333 }
1334
main_window_set_summary_column(void)1335 void main_window_set_summary_column(void)
1336 {
1337 summary_set_column_order(main_window_get()->summaryview);
1338 }
1339
main_window_set_account_selector_menu(MainWindow * mainwin,GList * account_list)1340 static void main_window_set_account_selector_menu(MainWindow *mainwin,
1341 GList *account_list)
1342 {
1343 GList *cur_ac, *cur_item;
1344 GtkWidget *menuitem;
1345 PrefsAccount *ac_prefs;
1346
1347 /* destroy all previous menu item */
1348 cur_item = GTK_MENU_SHELL(mainwin->ac_menu)->children;
1349 while (cur_item != NULL) {
1350 GList *next = cur_item->next;
1351 gtk_widget_destroy(GTK_WIDGET(cur_item->data));
1352 cur_item = next;
1353 }
1354
1355 for (cur_ac = account_list; cur_ac != NULL; cur_ac = cur_ac->next) {
1356 ac_prefs = (PrefsAccount *)cur_ac->data;
1357
1358 menuitem = gtk_menu_item_new_with_label
1359 (ac_prefs->account_name
1360 ? ac_prefs->account_name : _("Untitled"));
1361 gtk_widget_show(menuitem);
1362 gtk_menu_append(GTK_MENU(mainwin->ac_menu), menuitem);
1363 g_signal_connect(G_OBJECT(menuitem), "activate",
1364 G_CALLBACK(account_selector_menu_cb),
1365 ac_prefs);
1366 }
1367 }
1368
main_window_set_account_receive_menu(MainWindow * mainwin,GList * account_list)1369 static void main_window_set_account_receive_menu(MainWindow *mainwin,
1370 GList *account_list)
1371 {
1372 GList *cur_ac, *cur_item;
1373 GtkWidget *menu;
1374 GtkWidget *menuitem;
1375 PrefsAccount *ac_prefs;
1376
1377 menu = gtk_item_factory_get_widget(mainwin->menu_factory,
1378 "/Message/Receive");
1379
1380 /* search for separator */
1381 for (cur_item = GTK_MENU_SHELL(menu)->children; cur_item != NULL;
1382 cur_item = cur_item->next) {
1383 if (GTK_BIN(cur_item->data)->child == NULL) {
1384 cur_item = cur_item->next;
1385 break;
1386 }
1387 }
1388
1389 /* destroy all previous menu item */
1390 while (cur_item != NULL) {
1391 GList *next = cur_item->next;
1392 gtk_widget_destroy(GTK_WIDGET(cur_item->data));
1393 cur_item = next;
1394 }
1395
1396 for (cur_ac = account_list; cur_ac != NULL; cur_ac = cur_ac->next) {
1397 ac_prefs = (PrefsAccount *)cur_ac->data;
1398
1399 menuitem = gtk_menu_item_new_with_label
1400 (ac_prefs->account_name ? ac_prefs->account_name
1401 : _("Untitled"));
1402 gtk_widget_show(menuitem);
1403 gtk_menu_append(GTK_MENU(menu), menuitem);
1404 g_signal_connect(G_OBJECT(menuitem), "activate",
1405 G_CALLBACK(account_receive_menu_cb),
1406 ac_prefs);
1407 }
1408 }
1409
main_window_set_account_menu(GList * account_list)1410 void main_window_set_account_menu(GList *account_list)
1411 {
1412 MainWindow *mainwin;
1413
1414 mainwin = main_window_get();
1415 main_window_set_account_selector_menu(mainwin, account_list);
1416 main_window_set_account_receive_menu(mainwin, account_list);
1417 }
1418
main_window_show_cur_account(MainWindow * mainwin)1419 static void main_window_show_cur_account(MainWindow *mainwin)
1420 {
1421 gchar *buf;
1422 gchar *ac_name;
1423
1424 ac_name = g_strdup(cur_account
1425 ? (cur_account->account_name
1426 ? cur_account->account_name : _("Untitled"))
1427 : _("none"));
1428
1429 if (cur_account)
1430 buf = g_strdup_printf("%s - %s", ac_name, PROG_VERSION);
1431 else
1432 buf = g_strdup(PROG_VERSION);
1433 gtk_window_set_title(GTK_WINDOW(mainwin->window), buf);
1434 g_free(buf);
1435
1436 gtk_label_set_text(GTK_LABEL(mainwin->ac_label), ac_name);
1437 gtk_widget_queue_resize(mainwin->ac_button);
1438
1439 g_free(ac_name);
1440 }
1441
main_window_change_cur_account(void)1442 void main_window_change_cur_account(void)
1443 {
1444 MainWindow *mainwin;
1445
1446 mainwin = main_window_get();
1447 main_window_show_cur_account(mainwin);
1448 main_window_set_menu_sensitive(mainwin);
1449 main_window_set_toolbar_sensitive(mainwin);
1450 }
1451
main_window_get(void)1452 MainWindow *main_window_get(void)
1453 {
1454 if (mainwin_list)
1455 return (MainWindow *)mainwin_list->data;
1456 else
1457 return NULL;
1458 }
1459
main_window_get_folder_window(MainWindow * mainwin)1460 GtkWidget *main_window_get_folder_window(MainWindow *mainwin)
1461 {
1462 switch (mainwin->type) {
1463 case SEPARATE_FOLDER:
1464 return mainwin->win.sep_folder.folderwin;
1465 case SEPARATE_BOTH:
1466 return mainwin->win.sep_both.folderwin;
1467 default:
1468 return NULL;
1469 }
1470 }
1471
main_window_get_message_window(MainWindow * mainwin)1472 GtkWidget *main_window_get_message_window(MainWindow *mainwin)
1473 {
1474 switch (mainwin->type) {
1475 case SEPARATE_MESSAGE:
1476 return mainwin->win.sep_message.messagewin;
1477 case SEPARATE_BOTH:
1478 return mainwin->win.sep_both.messagewin;
1479 default:
1480 return NULL;
1481 }
1482 }
1483
main_window_hide(MainWindow * mainwin)1484 void main_window_hide(MainWindow *mainwin)
1485 {
1486 GtkWidget *folder_wid = GTK_WIDGET_PTR(mainwin->folderview);
1487 GtkWidget *summary_wid = GTK_WIDGET_PTR(mainwin->summaryview);
1488 GtkWidget *message_wid = GTK_WIDGET_PTR(mainwin->messageview);
1489 GtkWidget *qsearch_wid = GTK_WIDGET_PTR(mainwin->summaryview->qsearch);
1490 GtkWidget *vbox_summary = qsearch_wid->parent;
1491
1492 /* remove widgets from those containers */
1493 gtkut_container_remove
1494 (GTK_CONTAINER(folder_wid->parent), folder_wid);
1495 gtkut_container_remove
1496 (GTK_CONTAINER(summary_wid->parent), summary_wid);
1497 gtkut_container_remove
1498 (GTK_CONTAINER(message_wid->parent), message_wid);
1499 gtkut_container_remove
1500 (GTK_CONTAINER(qsearch_wid->parent), qsearch_wid);
1501
1502 /* clean containers */
1503 switch (mainwin->type) {
1504 case SEPARATE_NONE:
1505 if (!mainwin->win.sep_none.vpaned->parent)
1506 gtk_widget_destroy(mainwin->win.sep_none.vpaned);
1507 gtk_widget_destroy(mainwin->win.sep_none.hpaned);
1508 mainwin->win.sep_none.hpaned = NULL;
1509 mainwin->win.sep_none.vpaned = NULL;
1510 break;
1511 case SEPARATE_FOLDER:
1512 gtk_widget_destroy(mainwin->win.sep_folder.folderwin);
1513 if (!mainwin->win.sep_folder.vpaned->parent)
1514 gtk_widget_destroy(mainwin->win.sep_folder.vpaned);
1515 gtk_widget_destroy(vbox_summary);
1516 mainwin->win.sep_folder.folderwin = NULL;
1517 mainwin->win.sep_folder.vpaned = NULL;
1518 break;
1519 case SEPARATE_MESSAGE:
1520 gtk_widget_destroy(mainwin->win.sep_message.messagewin);
1521 gtk_widget_destroy(mainwin->win.sep_message.hpaned);
1522 mainwin->win.sep_message.messagewin = NULL;
1523 mainwin->win.sep_message.hpaned = NULL;
1524 break;
1525 case SEPARATE_BOTH:
1526 gtk_widget_destroy(vbox_summary);
1527 gtk_widget_destroy(mainwin->win.sep_both.folderwin);
1528 gtk_widget_destroy(mainwin->win.sep_both.messagewin);
1529 mainwin->win.sep_both.folderwin = NULL;
1530 mainwin->win.sep_both.messagewin = NULL;
1531 break;
1532 }
1533
1534 gtk_widget_hide(mainwin->window);
1535 }
1536
main_window_change_layout(MainWindow * mainwin,LayoutType layout,SeparateType type)1537 void main_window_change_layout(MainWindow *mainwin, LayoutType layout,
1538 SeparateType type)
1539 {
1540 GtkWidget *folder_wid = GTK_WIDGET_PTR(mainwin->folderview);
1541 GtkWidget *summary_wid = GTK_WIDGET_PTR(mainwin->summaryview);
1542 GtkWidget *message_wid = GTK_WIDGET_PTR(mainwin->messageview);
1543 GtkWidget *qsearch_wid = GTK_WIDGET_PTR(mainwin->summaryview->qsearch);
1544 GtkWidget *focus_widget;
1545
1546 debug_print("Changing window layout type (layout: %d -> %d, separation: %d -> %d)\n", prefs_common.layout_type, layout, mainwin->type, type);
1547
1548 if (prefs_common.layout_type == layout && mainwin->type == type)
1549 return;
1550
1551 /* keep previous focus */
1552 focus_widget = gtk_window_get_focus(GTK_WINDOW(mainwin->window));
1553
1554 gtk_widget_ref(folder_wid);
1555 gtk_widget_ref(summary_wid);
1556 gtk_widget_ref(message_wid);
1557 gtk_widget_ref(qsearch_wid);
1558
1559 main_window_hide(mainwin);
1560 main_window_set_widgets(mainwin, layout, type);
1561 gtk_widget_show(mainwin->window);
1562 if (focus_widget)
1563 gtk_widget_grab_focus(focus_widget);
1564
1565 gtk_widget_unref(folder_wid);
1566 gtk_widget_unref(summary_wid);
1567 gtk_widget_unref(message_wid);
1568 gtk_widget_unref(qsearch_wid);
1569 }
1570
main_window_toggle_message_view(MainWindow * mainwin)1571 void main_window_toggle_message_view(MainWindow *mainwin)
1572 {
1573 SummaryView *summaryview = mainwin->summaryview;
1574 union CompositeWin *cwin = &mainwin->win;
1575 GtkWidget *vpaned = NULL;
1576 GtkWidget *container = NULL;
1577 GtkWidget *msgwin = NULL;
1578 gboolean use_vlayout = (prefs_common.layout_type == LAYOUT_VERTICAL);
1579
1580 switch (mainwin->type) {
1581 case SEPARATE_NONE:
1582 vpaned = cwin->sep_none.vpaned;
1583 container = GTK_WIDGET_PTR(summaryview->qsearch)->parent;
1584 break;
1585 case SEPARATE_FOLDER:
1586 vpaned = cwin->sep_folder.vpaned;
1587 container = GTK_WIDGET_PTR(summaryview->qsearch)->parent;
1588 break;
1589 case SEPARATE_MESSAGE:
1590 msgwin = mainwin->win.sep_message.messagewin;
1591 break;
1592 case SEPARATE_BOTH:
1593 msgwin = mainwin->win.sep_both.messagewin;
1594 break;
1595 }
1596
1597 if (msgwin) {
1598 /* separate message view */
1599 if (GTK_WIDGET_VISIBLE(msgwin)) {
1600 gtk_widget_hide(msgwin);
1601 mainwin->messageview->visible = FALSE;
1602 summaryview->displayed = NULL;
1603 } else {
1604 gtk_widget_show(msgwin);
1605 mainwin->messageview->visible = TRUE;
1606 }
1607 } else if (vpaned->parent != NULL) {
1608 /* hide message view */
1609 mainwin->messageview->visible = FALSE;
1610 summaryview->displayed = NULL;
1611 gtk_widget_ref(vpaned);
1612 gtkut_container_remove(GTK_CONTAINER(container), vpaned);
1613 gtk_widget_reparent(GTK_WIDGET_PTR(summaryview), container);
1614 if (!use_vlayout)
1615 gtk_widget_hide(summaryview->hseparator);
1616 } else {
1617 /* show message view */
1618 mainwin->messageview->visible = TRUE;
1619 gtk_widget_reparent(GTK_WIDGET_PTR(summaryview), vpaned);
1620 gtk_container_add(GTK_CONTAINER(container), vpaned);
1621 gtk_widget_unref(vpaned);
1622 if (!use_vlayout)
1623 gtk_widget_show(summaryview->hseparator);
1624 }
1625
1626 if (messageview_is_visible(mainwin->messageview))
1627 gtk_arrow_set(GTK_ARROW(mainwin->summaryview->toggle_arrow),
1628 use_vlayout ? GTK_ARROW_RIGHT : GTK_ARROW_DOWN,
1629 GTK_SHADOW_OUT);
1630 else
1631 gtk_arrow_set(GTK_ARROW(mainwin->summaryview->toggle_arrow),
1632 use_vlayout ? GTK_ARROW_LEFT : GTK_ARROW_UP,
1633 GTK_SHADOW_OUT);
1634
1635 if (mainwin->messageview->visible == FALSE)
1636 messageview_clear(mainwin->messageview);
1637
1638 main_window_set_menu_sensitive(mainwin);
1639
1640 prefs_common.msgview_visible = mainwin->messageview->visible;
1641
1642 gtk_widget_grab_focus(summaryview->treeview);
1643 }
1644
main_window_get_size(MainWindow * mainwin)1645 void main_window_get_size(MainWindow *mainwin)
1646 {
1647 GtkAllocation *allocation;
1648 gboolean vlayout = (prefs_common.layout_type == LAYOUT_VERTICAL);
1649
1650 allocation = &(GTK_WIDGET_PTR(mainwin->summaryview)->allocation);
1651 if (allocation->width > 1 && allocation->height > 1) {
1652 if (vlayout) {
1653 if (!(mainwin->type & SEPARATE_MESSAGE) &&
1654 messageview_is_visible(mainwin->messageview))
1655 prefs_common.summaryview_vwidth = allocation->width;
1656 prefs_common.summaryview_vheight = allocation->height;
1657 } else {
1658 if (!prefs_common.mainwin_maximized) {
1659 prefs_common.summaryview_width = allocation->width;
1660 prefs_common.mainview_width = allocation->width;
1661 }
1662 if ((mainwin->type == SEPARATE_NONE ||
1663 mainwin->type == SEPARATE_FOLDER) &&
1664 messageview_is_visible(mainwin->messageview))
1665 prefs_common.summaryview_height = allocation->height;
1666 }
1667 }
1668
1669 if (prefs_common.mainwin_maximized) {
1670 allocation = &(GTK_WIDGET_PTR(mainwin->folderview)->allocation);
1671 if (allocation->width > 1 && allocation->height > 1)
1672 prefs_common.folderview_width = allocation->width;
1673 return;
1674 }
1675
1676 allocation = &mainwin->window->allocation;
1677 if (allocation->width > 1 && allocation->height > 1) {
1678 prefs_common.mainview_height = allocation->height;
1679 prefs_common.mainwin_width = allocation->width;
1680 prefs_common.mainwin_height = allocation->height;
1681 }
1682
1683 allocation = &(GTK_WIDGET_PTR(mainwin->folderview)->allocation);
1684 if (allocation->width > 1 && allocation->height > 1) {
1685 prefs_common.folderview_width = allocation->width;
1686 prefs_common.folderview_height = allocation->height;
1687 }
1688
1689 allocation = &(GTK_WIDGET_PTR(mainwin->messageview)->allocation);
1690 if (allocation->width > 1 && allocation->height > 1) {
1691 if (vlayout) {
1692 prefs_common.msgview_vwidth = allocation->width;
1693 prefs_common.msgview_vheight = allocation->height;
1694 } else {
1695 prefs_common.msgview_width = allocation->width;
1696 prefs_common.msgview_height = allocation->height;
1697 }
1698 }
1699
1700 #if 0
1701 debug_print("summaryview size: %d x %d\n",
1702 prefs_common.summaryview_width,
1703 prefs_common.summaryview_height);
1704 debug_print("mainwin size: %d x %d\n",
1705 prefs_common.mainwin_width,
1706 prefs_common.mainwin_height);
1707 debug_print("folderview size: %d x %d\n",
1708 prefs_common.folderview_width,
1709 prefs_common.folderview_height);
1710 debug_print("messageview size: %d x %d\n",
1711 prefs_common.msgview_width,
1712 prefs_common.msgview_height);
1713 #endif
1714 }
1715
main_window_get_position(MainWindow * mainwin)1716 void main_window_get_position(MainWindow *mainwin)
1717 {
1718 gint x, y;
1719 GtkWidget *window;
1720
1721 if (prefs_common.mainwin_maximized || mainwin->window_hidden)
1722 return;
1723
1724 gtkut_widget_get_uposition(mainwin->window, &x, &y);
1725
1726 prefs_common.mainview_x = x;
1727 prefs_common.mainview_y = y;
1728 prefs_common.mainwin_x = x;
1729 prefs_common.mainwin_y = y;
1730
1731 debug_print("main window position: %d, %d\n", x, y);
1732
1733 window = main_window_get_folder_window(mainwin);
1734 if (window) {
1735 gtkut_widget_get_uposition(window, &x, &y);
1736 prefs_common.folderwin_x = x;
1737 prefs_common.folderwin_y = y;
1738 debug_print("folder window position: %d, %d\n", x, y);
1739 }
1740 window = main_window_get_message_window(mainwin);
1741 if (window) {
1742 gtkut_widget_get_uposition(window, &x, &y);
1743 prefs_common.main_msgwin_x = x;
1744 prefs_common.main_msgwin_y = y;
1745 debug_print("message window position: %d, %d\n", x, y);
1746 }
1747 }
1748
main_window_progress_on(MainWindow * mainwin)1749 void main_window_progress_on(MainWindow *mainwin)
1750 {
1751 gtk_progress_set_show_text(GTK_PROGRESS(mainwin->progressbar), TRUE);
1752 gtk_progress_set_format_string(GTK_PROGRESS(mainwin->progressbar), "");
1753 }
1754
main_window_progress_off(MainWindow * mainwin)1755 void main_window_progress_off(MainWindow *mainwin)
1756 {
1757 gtk_progress_set_show_text(GTK_PROGRESS(mainwin->progressbar), FALSE);
1758 gtk_progress_bar_update(GTK_PROGRESS_BAR(mainwin->progressbar), 0.0);
1759 gtk_progress_set_format_string(GTK_PROGRESS(mainwin->progressbar), "");
1760 }
1761
main_window_progress_set(MainWindow * mainwin,gint cur,gint total)1762 void main_window_progress_set(MainWindow *mainwin, gint cur, gint total)
1763 {
1764 gchar buf[32];
1765
1766 g_snprintf(buf, sizeof(buf), "%d / %d", cur, total);
1767 gtk_progress_set_format_string(GTK_PROGRESS(mainwin->progressbar), buf);
1768 gtk_progress_bar_update(GTK_PROGRESS_BAR(mainwin->progressbar),
1769 (cur == 0 && total == 0) ? 0 :
1770 (gfloat)cur / (gfloat)total);
1771 }
1772
main_window_progress_show(gint cur,gint total)1773 void main_window_progress_show(gint cur, gint total)
1774 {
1775 MainWindow *mainwin;
1776
1777 mainwin = main_window_get();
1778
1779 if (total > 0) {
1780 gtk_progress_set_show_text(GTK_PROGRESS(mainwin->progressbar),
1781 TRUE);
1782 main_window_progress_set(mainwin, cur, total);
1783 } else
1784 main_window_progress_off(mainwin);
1785 }
1786
main_window_toggle_online(MainWindow * mainwin,gboolean online)1787 void main_window_toggle_online(MainWindow *mainwin, gboolean online)
1788 {
1789 if (prefs_common.online_mode != online)
1790 online_switch_clicked(mainwin->online_switch, mainwin);
1791 }
1792
main_window_toggle_online_if_offline(MainWindow * mainwin)1793 gboolean main_window_toggle_online_if_offline(MainWindow *mainwin)
1794 {
1795 if (!prefs_common.online_mode) {
1796 if (alertpanel(_("Offline"),
1797 _("You are offline. Go online?"),
1798 GTK_STOCK_YES, GTK_STOCK_NO, NULL)
1799 == G_ALERTDEFAULT)
1800 main_window_toggle_online(mainwin, TRUE);
1801 }
1802
1803 return prefs_common.online_mode;
1804 }
1805
main_window_empty_trash(MainWindow * mainwin,gboolean confirm)1806 void main_window_empty_trash(MainWindow *mainwin, gboolean confirm)
1807 {
1808 GList *list;
1809
1810 if (!procmsg_trash_messages_exist())
1811 return;
1812
1813 if (confirm) {
1814 if (alertpanel(_("Empty all trash"),
1815 _("Delete all messages in trash folders?"),
1816 GTK_STOCK_YES, GTK_STOCK_NO, NULL)
1817 != G_ALERTDEFAULT)
1818 return;
1819 manage_window_focus_in(mainwin->window, NULL, NULL);
1820 }
1821
1822 procmsg_empty_all_trash();
1823 statusbar_pop_all();
1824 trayicon_set_tooltip(NULL);
1825 trayicon_set_notify(FALSE);
1826
1827 for (list = folder_get_list(); list != NULL; list = list->next) {
1828 Folder *folder;
1829
1830 folder = list->data;
1831 if (folder->trash)
1832 folderview_update_item(folder->trash, TRUE);
1833 }
1834
1835 if (mainwin->summaryview->folder_item &&
1836 mainwin->summaryview->folder_item->stype == F_TRASH)
1837 gtk_widget_grab_focus(mainwin->folderview->treeview);
1838 }
1839
main_window_add_mailbox(MainWindow * mainwin)1840 void main_window_add_mailbox(MainWindow *mainwin)
1841 {
1842 gchar *path;
1843 Folder *folder;
1844
1845 path = input_dialog_with_filesel
1846 (_("Add mailbox"),
1847 _("Specify the location of mailbox.\n"
1848 "If the existing mailbox is specified, it will be\n"
1849 "scanned automatically."),
1850 "Mail", GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER);
1851 if (!path) return;
1852 if (folder_find_from_path(path)) {
1853 alertpanel_error(_("The mailbox `%s' already exists."), path);
1854 g_free(path);
1855 return;
1856 }
1857 if (!strcmp(path, "Mail"))
1858 folder = folder_new(F_MH, _("Mailbox"), path);
1859 else
1860 folder = folder_new(F_MH, g_basename(path), path);
1861 g_free(path);
1862
1863 if (folder->klass->create_tree(folder) < 0) {
1864 alertpanel_error(_("Creation of the mailbox failed.\n"
1865 "Maybe some files already exist, or you don't have the permission to write there."));
1866 folder_destroy(folder);
1867 return;
1868 }
1869
1870 folder_add(folder);
1871 folder_set_ui_func(folder, scan_tree_func, mainwin);
1872 folder->klass->scan_tree(folder);
1873 folder_set_ui_func(folder, NULL, NULL);
1874
1875 folderview_set(mainwin->folderview);
1876 }
1877
main_window_send_queue(MainWindow * mainwin)1878 void main_window_send_queue(MainWindow *mainwin)
1879 {
1880 GList *list;
1881
1882 if (inc_is_active())
1883 return;
1884 if (!main_window_toggle_online_if_offline(mainwin))
1885 return;
1886
1887 for (list = folder_get_list(); list != NULL; list = list->next) {
1888 Folder *folder = list->data;
1889
1890 if (folder->queue) {
1891 gint ret;
1892
1893 ret = send_message_queue_all(folder->queue,
1894 prefs_common.savemsg,
1895 prefs_common.filter_sent);
1896 statusbar_pop_all();
1897 if (ret > 0)
1898 folder_item_scan(folder->queue);
1899 }
1900 }
1901
1902 folderview_update_all_updated(TRUE);
1903 main_window_set_menu_sensitive(mainwin);
1904 main_window_set_toolbar_sensitive(mainwin);
1905 }
1906
1907 typedef enum
1908 {
1909 M_UNLOCKED = 1 << 0,
1910 M_MSG_EXIST = 1 << 1,
1911 M_TARGET_EXIST = 1 << 2,
1912 M_SINGLE_TARGET_EXIST = 1 << 3,
1913 M_EXEC = 1 << 4,
1914 M_ALLOW_REEDIT = 1 << 5,
1915 M_HAVE_ACCOUNT = 1 << 6,
1916 M_THREADED = 1 << 7,
1917 M_UNTHREADED = 1 << 8,
1918 M_ALLOW_DELETE = 1 << 9,
1919 M_INC_ACTIVE = 1 << 10,
1920 M_ENABLE_JUNK = 1 << 11,
1921 M_HAVE_QUEUED_MSG = 1 << 12,
1922 M_POP3_ACCOUNT = 1 << 13,
1923
1924 M_FOLDER_NEWOK = 1 << 17,
1925 M_FOLDER_RENOK = 1 << 18,
1926 M_FOLDER_MOVEOK = 1 << 19,
1927 M_FOLDER_DELOK = 1 << 20,
1928 M_MBOX_ADDOK = 1 << 21,
1929 M_MBOX_RMOK = 1 << 22,
1930 M_MBOX_CHKOK = 1 << 23,
1931 M_MBOX_CHKALLOK = 1 << 24,
1932 M_MBOX_REBUILDOK = 1 << 25
1933 } SensitiveCond;
1934
main_window_get_current_state(MainWindow * mainwin)1935 static SensitiveCond main_window_get_current_state(MainWindow *mainwin)
1936 {
1937 SensitiveCond state = 0;
1938 SummarySelection selection;
1939 GList *list;
1940 FolderItem *item = mainwin->summaryview->folder_item;
1941
1942 selection = summary_get_selection_type(mainwin->summaryview);
1943
1944 if (mainwin->lock_count == 0)
1945 state |= M_UNLOCKED;
1946 if (selection != SUMMARY_NONE)
1947 state |= M_MSG_EXIST;
1948 if (item && item->path && item->parent && !item->no_select) {
1949 state |= M_EXEC;
1950 if (item->threaded)
1951 state |= M_THREADED;
1952 else
1953 state |= M_UNTHREADED;
1954 if (FOLDER_TYPE(item->folder) != F_NEWS)
1955 state |= M_ALLOW_DELETE;
1956 }
1957 if (selection == SUMMARY_SELECTED_SINGLE ||
1958 selection == SUMMARY_SELECTED_MULTIPLE)
1959 state |= M_TARGET_EXIST;
1960 if (selection == SUMMARY_SELECTED_SINGLE)
1961 state |= M_SINGLE_TARGET_EXIST;
1962 if (selection == SUMMARY_SELECTED_SINGLE &&
1963 FOLDER_ITEM_IS_SENT_FOLDER(item))
1964 state |= M_ALLOW_REEDIT;
1965 if (cur_account) {
1966 state |= M_HAVE_ACCOUNT;
1967 if (cur_account->protocol == A_POP3)
1968 state |= M_POP3_ACCOUNT;
1969 }
1970
1971 if (inc_is_active())
1972 state |= M_INC_ACTIVE;
1973
1974 if (prefs_common.enable_junk)
1975 state |= M_ENABLE_JUNK;
1976
1977 for (list = folder_get_list(); list != NULL; list = list->next) {
1978 Folder *folder = list->data;
1979 if (folder->queue && folder->queue->total > 0) {
1980 state |= M_HAVE_QUEUED_MSG;
1981 break;
1982 }
1983 }
1984
1985 item = folderview_get_selected_item(mainwin->folderview);
1986 if (item) {
1987 state |= M_FOLDER_NEWOK;
1988 if (item->parent == NULL) {
1989 state |= M_MBOX_RMOK;
1990 state |= M_MBOX_CHKOK;
1991 }
1992 if (FOLDER_IS_LOCAL(item->folder) ||
1993 FOLDER_TYPE(item->folder) == F_IMAP) {
1994 if (item->parent == NULL)
1995 state |= M_MBOX_REBUILDOK;
1996 else if (item->stype == F_NORMAL) {
1997 state |= M_FOLDER_RENOK;
1998 state |= M_FOLDER_DELOK;
1999 if (item->folder->klass->move_folder)
2000 state |= M_FOLDER_MOVEOK;
2001 }
2002 } else if (FOLDER_TYPE(item->folder) == F_NEWS) {
2003 if (item->parent != NULL)
2004 state |= M_FOLDER_DELOK;
2005 }
2006 }
2007 state |= M_MBOX_ADDOK;
2008 state |= M_MBOX_CHKALLOK;
2009
2010 return state;
2011 }
2012
main_window_set_toolbar_sensitive(MainWindow * mainwin)2013 void main_window_set_toolbar_sensitive(MainWindow *mainwin)
2014 {
2015 SensitiveCond state;
2016 gboolean sensitive, prev_sensitive;
2017 gint n;
2018 gint i = 0;
2019
2020 struct {
2021 GtkWidget *widget;
2022 SensitiveCond cond;
2023 } entry[20];
2024
2025 #define SET_WIDGET_COND(w, c) \
2026 { \
2027 entry[i].widget = w; \
2028 entry[i].cond = c; \
2029 i++; \
2030 }
2031
2032 SET_WIDGET_COND(mainwin->get_btn, M_HAVE_ACCOUNT|M_UNLOCKED);
2033 SET_WIDGET_COND(mainwin->getall_btn, M_HAVE_ACCOUNT|M_UNLOCKED);
2034 SET_WIDGET_COND(mainwin->rpop3_btn,
2035 M_HAVE_ACCOUNT|M_UNLOCKED|M_POP3_ACCOUNT);
2036 SET_WIDGET_COND(mainwin->send_btn,
2037 M_HAVE_ACCOUNT|M_UNLOCKED|M_HAVE_QUEUED_MSG);
2038 SET_WIDGET_COND(mainwin->compose_btn, M_HAVE_ACCOUNT);
2039 SET_WIDGET_COND(mainwin->reply_btn,
2040 M_HAVE_ACCOUNT|M_SINGLE_TARGET_EXIST);
2041 SET_WIDGET_COND(mainwin->reply_combo ?
2042 GTK_WIDGET_PTR(mainwin->reply_combo) : NULL,
2043 M_HAVE_ACCOUNT|M_SINGLE_TARGET_EXIST);
2044 SET_WIDGET_COND(mainwin->replyall_btn,
2045 M_HAVE_ACCOUNT|M_SINGLE_TARGET_EXIST);
2046 SET_WIDGET_COND(mainwin->fwd_btn, M_HAVE_ACCOUNT|M_TARGET_EXIST);
2047 SET_WIDGET_COND(mainwin->fwd_combo ? GTK_WIDGET_PTR(mainwin->fwd_combo)
2048 : NULL,
2049 M_HAVE_ACCOUNT|M_TARGET_EXIST);
2050 SET_WIDGET_COND(mainwin->delete_btn,
2051 M_TARGET_EXIST|M_ALLOW_DELETE);
2052 SET_WIDGET_COND(mainwin->junk_btn,
2053 M_TARGET_EXIST|M_ALLOW_DELETE|M_ENABLE_JUNK);
2054 SET_WIDGET_COND(mainwin->notjunk_btn,
2055 M_TARGET_EXIST|M_ALLOW_DELETE|M_ENABLE_JUNK);
2056 SET_WIDGET_COND(mainwin->exec_btn, M_MSG_EXIST|M_EXEC);
2057 SET_WIDGET_COND(mainwin->next_btn, M_MSG_EXIST);
2058 SET_WIDGET_COND(mainwin->prev_btn, M_MSG_EXIST);
2059 SET_WIDGET_COND(mainwin->print_btn, M_TARGET_EXIST);
2060 SET_WIDGET_COND(mainwin->stop_btn, M_INC_ACTIVE);
2061 SET_WIDGET_COND(mainwin->prefs_common_btn, M_UNLOCKED);
2062 SET_WIDGET_COND(mainwin->prefs_account_btn, M_HAVE_ACCOUNT|M_UNLOCKED);
2063
2064 #undef SET_WIDGET_COND
2065
2066 state = main_window_get_current_state(mainwin);
2067
2068 n = sizeof(entry) / sizeof(entry[0]);
2069 for (i = 0; i < n; i++) {
2070 if (entry[i].widget) {
2071 prev_sensitive =
2072 GTK_WIDGET_IS_SENSITIVE(entry[i].widget);
2073 sensitive = ((entry[i].cond & state) == entry[i].cond);
2074 if (prev_sensitive != sensitive) {
2075 /* workaround for GTK+ bug (#56070) */
2076 if (!prev_sensitive)
2077 gtk_widget_hide(entry[i].widget);
2078 gtk_widget_set_sensitive(entry[i].widget,
2079 sensitive);
2080 if (!prev_sensitive)
2081 gtk_widget_show(entry[i].widget);
2082 }
2083 }
2084 }
2085 }
2086
main_window_set_toolbar_button_visibility(MainWindow * mainwin)2087 static void main_window_set_toolbar_button_visibility(MainWindow *mainwin)
2088 {
2089 GtkToolbarStyle style = GTK_TOOLBAR_BOTH_HORIZ;
2090
2091 if (prefs_common.toolbar_style == TOOLBAR_NONE)
2092 style = -1;
2093 else if (prefs_common.toolbar_style == TOOLBAR_ICON)
2094 style = GTK_TOOLBAR_ICONS;
2095 else if (prefs_common.toolbar_style == TOOLBAR_TEXT)
2096 style = GTK_TOOLBAR_TEXT;
2097 else if (prefs_common.toolbar_style == TOOLBAR_BOTH)
2098 style = GTK_TOOLBAR_BOTH;
2099 else if (prefs_common.toolbar_style == TOOLBAR_BOTH_HORIZ)
2100 style = GTK_TOOLBAR_BOTH_HORIZ;
2101
2102 if (style != -1) {
2103 gtk_toolbar_set_style(GTK_TOOLBAR(mainwin->toolbar), style);
2104 gtk_widget_show(mainwin->toolbar);
2105 gtk_widget_queue_resize(mainwin->toolbar);
2106 } else
2107 gtk_widget_hide(mainwin->toolbar);
2108
2109 #if 0
2110 if (mainwin->junk_btn) {
2111 if (prefs_common.enable_junk)
2112 gtk_widget_show(mainwin->junk_btn);
2113 else
2114 gtk_widget_hide(mainwin->junk_btn);
2115 }
2116
2117 if (mainwin->exec_btn) {
2118 if (prefs_common.immediate_exec)
2119 gtk_widget_hide(mainwin->exec_btn);
2120 else
2121 gtk_widget_show(mainwin->exec_btn);
2122 }
2123 #endif
2124 }
2125
main_window_set_menu_sensitive(MainWindow * mainwin)2126 void main_window_set_menu_sensitive(MainWindow *mainwin)
2127 {
2128 GtkItemFactory *ifactory = mainwin->menu_factory;
2129 SensitiveCond state;
2130 gboolean sensitive;
2131 GtkWidget *menu;
2132 GtkWidget *menuitem;
2133 FolderItem *item;
2134 gchar *menu_path;
2135 gint i;
2136 GList *cur_item;
2137
2138 static const struct {
2139 gchar *const entry;
2140 SensitiveCond cond;
2141 } entry[] = {
2142 {"/File/Folder/Create new folder...", M_UNLOCKED|M_FOLDER_NEWOK},
2143 {"/File/Folder/Rename folder..." , M_UNLOCKED|M_FOLDER_RENOK},
2144 {"/File/Folder/Move folder..." , M_UNLOCKED|M_FOLDER_MOVEOK},
2145 {"/File/Folder/Delete folder" , M_UNLOCKED|M_FOLDER_DELOK},
2146 {"/File/Mailbox/Add mailbox..." , M_UNLOCKED|M_MBOX_ADDOK},
2147 {"/File/Mailbox/Remove mailbox" , M_UNLOCKED|M_MBOX_RMOK},
2148 {"/File/Mailbox/Check for new messages"
2149 , M_UNLOCKED|M_MBOX_CHKOK},
2150 {"/File/Mailbox/Check for new messages in all mailboxes"
2151 , M_UNLOCKED|M_MBOX_CHKALLOK},
2152 {"/File/Mailbox/Rebuild folder tree", M_UNLOCKED|M_MBOX_REBUILDOK},
2153 {"/File/Import mail data..." , M_UNLOCKED},
2154 {"/File/Export mail data..." , M_UNLOCKED},
2155 {"/File/Empty all trash" , M_UNLOCKED},
2156
2157 {"/File/Save as..." , M_SINGLE_TARGET_EXIST},
2158 {"/File/Print..." , M_TARGET_EXIST},
2159 {"/File/Work offline", M_UNLOCKED},
2160 /* {"/File/Close" , M_UNLOCKED}, */
2161 {"/File/Exit" , M_UNLOCKED},
2162
2163 {"/Edit/Select thread" , M_SINGLE_TARGET_EXIST},
2164
2165 {"/View/Sort" , M_EXEC},
2166 {"/View/Thread view" , M_EXEC},
2167 {"/View/Expand all threads" , M_MSG_EXIST},
2168 {"/View/Collapse all threads" , M_MSG_EXIST},
2169 {"/View/Go to/Prev message" , M_MSG_EXIST},
2170 {"/View/Go to/Next message" , M_MSG_EXIST},
2171 {"/View/Go to/Prev unread message" , M_MSG_EXIST},
2172 {"/View/Go to/Next unread message" , M_MSG_EXIST},
2173 {"/View/Go to/Prev new message" , M_MSG_EXIST},
2174 {"/View/Go to/Next new message" , M_MSG_EXIST},
2175 {"/View/Go to/Prev marked message" , M_MSG_EXIST},
2176 {"/View/Go to/Next marked message" , M_MSG_EXIST},
2177 {"/View/Go to/Prev labeled message", M_MSG_EXIST},
2178 {"/View/Go to/Next labeled message", M_MSG_EXIST},
2179 {"/View/Open in new window" , M_SINGLE_TARGET_EXIST},
2180 {"/View/All headers" , M_SINGLE_TARGET_EXIST},
2181 {"/View/Message source" , M_SINGLE_TARGET_EXIST},
2182
2183 {"/Message/Receive/Get from current account"
2184 , M_HAVE_ACCOUNT|M_UNLOCKED},
2185 {"/Message/Receive/Get from all accounts"
2186 , M_HAVE_ACCOUNT|M_UNLOCKED},
2187 {"/Message/Receive/Stop receiving"
2188 , M_INC_ACTIVE},
2189 {"/Message/Receive/Remote mailbox..."
2190 , M_HAVE_ACCOUNT|M_UNLOCKED|M_POP3_ACCOUNT},
2191 {"/Message/Send queued messages" , M_HAVE_ACCOUNT|M_UNLOCKED|M_HAVE_QUEUED_MSG},
2192
2193 {"/Message/Compose new message" , M_HAVE_ACCOUNT},
2194 {"/Message/Reply" , M_HAVE_ACCOUNT|M_SINGLE_TARGET_EXIST},
2195 {"/Message/Reply to" , M_HAVE_ACCOUNT|M_SINGLE_TARGET_EXIST},
2196 {"/Message/Forward" , M_HAVE_ACCOUNT|M_TARGET_EXIST},
2197 {"/Message/Forward as attachment", M_HAVE_ACCOUNT|M_TARGET_EXIST},
2198 {"/Message/Redirect" , M_HAVE_ACCOUNT|M_SINGLE_TARGET_EXIST},
2199 {"/Message/Move..." , M_TARGET_EXIST|M_ALLOW_DELETE},
2200 {"/Message/Copy..." , M_TARGET_EXIST|M_EXEC},
2201 {"/Message/Delete" , M_TARGET_EXIST|M_ALLOW_DELETE},
2202 {"/Message/Mark" , M_TARGET_EXIST},
2203 {"/Message/Set as junk mail" , M_TARGET_EXIST|M_ALLOW_DELETE|M_ENABLE_JUNK},
2204 {"/Message/Set as not junk mail" , M_TARGET_EXIST|M_ALLOW_DELETE|M_ENABLE_JUNK},
2205 {"/Message/Re-edit" , M_HAVE_ACCOUNT|M_ALLOW_REEDIT},
2206
2207 {"/Tools/Add sender to address book...", M_SINGLE_TARGET_EXIST},
2208 {"/Tools/Filter all messages in folder", M_MSG_EXIST|M_EXEC},
2209 {"/Tools/Filter selected messages" , M_TARGET_EXIST|M_EXEC},
2210 {"/Tools/Create filter rule" , M_SINGLE_TARGET_EXIST|M_UNLOCKED},
2211 {"/Tools/Filter junk mails in folder" , M_MSG_EXIST|M_EXEC|M_ENABLE_JUNK},
2212 {"/Tools/Filter junk mails in selected messages", M_TARGET_EXIST|M_EXEC|M_ENABLE_JUNK},
2213 #ifndef G_OS_WIN32
2214 {"/Tools/Actions" , M_TARGET_EXIST|M_UNLOCKED},
2215 #endif
2216 {"/Tools/Execute marked process" , M_MSG_EXIST|M_EXEC},
2217 {"/Tools/Delete duplicated messages" , M_MSG_EXIST|M_ALLOW_DELETE},
2218 {"/Tools/Concatenate separated messages"
2219 , M_TARGET_EXIST|M_UNLOCKED|M_ALLOW_DELETE},
2220
2221 {"/Configuration/Common preferences...", M_UNLOCKED},
2222 {"/Configuration/Filter settings...", M_UNLOCKED},
2223 {"/Configuration/Preferences for current account...", M_UNLOCKED},
2224 {"/Configuration/Create new account...", M_UNLOCKED},
2225 {"/Configuration/Edit accounts...", M_UNLOCKED},
2226 {"/Configuration/Change current account", M_UNLOCKED},
2227
2228 {NULL, 0}
2229 };
2230
2231 state = main_window_get_current_state(mainwin);
2232
2233 for (i = 0; entry[i].entry != NULL; i++) {
2234 sensitive = ((entry[i].cond & state) == entry[i].cond);
2235 menu_set_sensitive(ifactory, entry[i].entry, sensitive);
2236 }
2237
2238 menu = gtk_item_factory_get_widget(ifactory, "/Message/Receive");
2239
2240 /* search for separator */
2241 for (cur_item = GTK_MENU_SHELL(menu)->children; cur_item != NULL;
2242 cur_item = cur_item->next) {
2243 if (GTK_BIN(cur_item->data)->child == NULL) {
2244 cur_item = cur_item->next;
2245 break;
2246 }
2247 }
2248
2249 for (; cur_item != NULL; cur_item = cur_item->next) {
2250 gtk_widget_set_sensitive(GTK_WIDGET(cur_item->data),
2251 (M_UNLOCKED & state) != 0);
2252 }
2253
2254 main_window_menu_callback_block(mainwin);
2255
2256 #define SET_CHECK_MENU_ACTIVE(path, active) \
2257 { \
2258 menuitem = gtk_item_factory_get_widget(ifactory, path); \
2259 gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menuitem), active); \
2260 }
2261
2262 SET_CHECK_MENU_ACTIVE("/View/Show or hide/Message view",
2263 messageview_is_visible(mainwin->messageview));
2264
2265 item = mainwin->summaryview->folder_item;
2266 menu_path = "/View/Sort/Don't sort";
2267 if (item) {
2268 switch (item->sort_key) {
2269 case SORT_BY_NUMBER:
2270 menu_path = "/View/Sort/by number"; break;
2271 case SORT_BY_SIZE:
2272 menu_path = "/View/Sort/by size"; break;
2273 case SORT_BY_DATE:
2274 menu_path = "/View/Sort/by date"; break;
2275 case SORT_BY_TDATE:
2276 menu_path = "/View/Sort/by thread date"; break;
2277 case SORT_BY_FROM:
2278 menu_path = "/View/Sort/by from"; break;
2279 case SORT_BY_TO:
2280 menu_path = "/View/Sort/by recipient"; break;
2281 case SORT_BY_SUBJECT:
2282 menu_path = "/View/Sort/by subject"; break;
2283 case SORT_BY_LABEL:
2284 menu_path = "/View/Sort/by color label"; break;
2285 case SORT_BY_MARK:
2286 menu_path = "/View/Sort/by mark"; break;
2287 case SORT_BY_UNREAD:
2288 menu_path = "/View/Sort/by unread"; break;
2289 case SORT_BY_MIME:
2290 menu_path = "/View/Sort/by attachment"; break;
2291 case SORT_BY_NONE:
2292 default:
2293 menu_path = "/View/Sort/Don't sort"; break;
2294 }
2295 }
2296 SET_CHECK_MENU_ACTIVE(menu_path, TRUE);
2297
2298 if (!item || item->sort_type == SORT_ASCENDING) {
2299 SET_CHECK_MENU_ACTIVE("/View/Sort/Ascending", TRUE);
2300 } else {
2301 SET_CHECK_MENU_ACTIVE("/View/Sort/Descending", TRUE);
2302 }
2303
2304 if (item && item->sort_key != SORT_BY_NONE) {
2305 menu_set_sensitive(ifactory, "/View/Sort/Ascending", TRUE);
2306 menu_set_sensitive(ifactory, "/View/Sort/Descending", TRUE);
2307 menu_set_sensitive(ifactory, "/View/Sort/Attract by subject",
2308 FALSE);
2309 } else {
2310 menu_set_sensitive(ifactory, "/View/Sort/Ascending", FALSE);
2311 menu_set_sensitive(ifactory, "/View/Sort/Descending", FALSE);
2312 menu_set_sensitive(ifactory, "/View/Sort/Attract by subject",
2313 (item != NULL));
2314 }
2315
2316 SET_CHECK_MENU_ACTIVE("/View/All headers",
2317 mainwin->messageview->textview->show_all_headers);
2318 SET_CHECK_MENU_ACTIVE("/View/Thread view", (state & M_THREADED) != 0);
2319
2320 #undef SET_CHECK_MENU_ACTIVE
2321
2322 main_window_menu_callback_unblock(mainwin);
2323 }
2324
main_window_popup(MainWindow * mainwin)2325 void main_window_popup(MainWindow *mainwin)
2326 {
2327 gtkut_window_popup(mainwin->window);
2328
2329 switch (mainwin->type) {
2330 case SEPARATE_FOLDER:
2331 if (prefs_common.folderview_visible)
2332 gtkut_window_popup(mainwin->win.sep_folder.folderwin);
2333 break;
2334 case SEPARATE_MESSAGE:
2335 if (messageview_is_visible(mainwin->messageview))
2336 gtkut_window_popup(mainwin->win.sep_message.messagewin);
2337 break;
2338 case SEPARATE_BOTH:
2339 if (prefs_common.folderview_visible)
2340 gtkut_window_popup(mainwin->win.sep_both.folderwin);
2341 if (messageview_is_visible(mainwin->messageview))
2342 gtkut_window_popup(mainwin->win.sep_both.messagewin);
2343 break;
2344 default:
2345 break;
2346 }
2347 }
2348
main_window_set_widgets(MainWindow * mainwin,LayoutType layout,SeparateType type)2349 static void main_window_set_widgets(MainWindow *mainwin, LayoutType layout,
2350 SeparateType type)
2351 {
2352 GtkWidget *folderwin = NULL;
2353 GtkWidget *messagewin = NULL;
2354 GtkWidget *hpaned;
2355 GtkWidget *vpaned;
2356 GtkWidget *vbox_body = mainwin->vbox_body;
2357 GtkWidget *vbox_summary;
2358 GtkItemFactory *ifactory = mainwin->menu_factory;
2359 GtkWidget *menuitem;
2360 gboolean use_vlayout = (layout == LAYOUT_VERTICAL);
2361
2362 debug_print("Setting main window widgets...\n");
2363
2364 gtk_widget_set_size_request(GTK_WIDGET_PTR(mainwin->folderview),
2365 prefs_common.folderview_width,
2366 prefs_common.folderview_height);
2367 if (use_vlayout) {
2368 gtk_widget_set_size_request
2369 (GTK_WIDGET_PTR(mainwin->summaryview),
2370 prefs_common.summaryview_vwidth,
2371 prefs_common.summaryview_vheight);
2372 gtk_widget_set_size_request
2373 (GTK_WIDGET_PTR(mainwin->messageview),
2374 prefs_common.msgview_vwidth,
2375 prefs_common.msgview_vheight);
2376 } else {
2377 gtk_widget_set_size_request
2378 (GTK_WIDGET_PTR(mainwin->summaryview),
2379 prefs_common.summaryview_width,
2380 prefs_common.summaryview_height);
2381 gtk_widget_set_size_request
2382 (GTK_WIDGET_PTR(mainwin->messageview),
2383 prefs_common.msgview_width,
2384 prefs_common.msgview_height);
2385 }
2386
2387 /* create separated window(s) if needed */
2388 if (type & SEPARATE_FOLDER) {
2389 folderwin = gtk_window_new(GTK_WINDOW_TOPLEVEL);
2390 gtk_window_set_title(GTK_WINDOW(folderwin),
2391 _("Sylpheed - Folder View"));
2392 gtk_window_set_wmclass(GTK_WINDOW(folderwin),
2393 "folder_view", "Sylpheed");
2394 gtk_window_set_policy(GTK_WINDOW(folderwin),
2395 TRUE, TRUE, FALSE);
2396 gtkut_window_move(GTK_WINDOW(folderwin),
2397 prefs_common.folderwin_x,
2398 prefs_common.folderwin_y);
2399 gtk_container_set_border_width(GTK_CONTAINER(folderwin), 0);
2400 g_signal_connect(G_OBJECT(folderwin), "delete_event",
2401 G_CALLBACK(folder_window_close_cb), mainwin);
2402 gtk_container_add(GTK_CONTAINER(folderwin),
2403 GTK_WIDGET_PTR(mainwin->folderview));
2404 gtk_widget_realize(folderwin);
2405 if (prefs_common.folderview_visible)
2406 gtk_widget_show(folderwin);
2407 }
2408 if (type & SEPARATE_MESSAGE) {
2409 messagewin = gtk_window_new(GTK_WINDOW_TOPLEVEL);
2410 gtk_window_set_title(GTK_WINDOW(messagewin),
2411 _("Sylpheed - Message View"));
2412 gtk_window_set_wmclass(GTK_WINDOW(messagewin),
2413 "message_view", "Sylpheed");
2414 gtk_window_set_policy(GTK_WINDOW(messagewin),
2415 TRUE, TRUE, FALSE);
2416 gtkut_window_move(GTK_WINDOW(messagewin),
2417 prefs_common.main_msgwin_x,
2418 prefs_common.main_msgwin_y);
2419 gtk_container_set_border_width(GTK_CONTAINER(messagewin), 0);
2420 g_signal_connect(G_OBJECT(messagewin), "delete_event",
2421 G_CALLBACK(message_window_close_cb), mainwin);
2422 gtk_container_add(GTK_CONTAINER(messagewin),
2423 GTK_WIDGET_PTR(mainwin->messageview));
2424 gtk_widget_realize(messagewin);
2425 if (messageview_is_visible(mainwin->messageview))
2426 gtk_widget_show(messagewin);
2427 }
2428
2429 vbox_summary = gtk_vbox_new(FALSE, 1);
2430 gtk_box_pack_start(GTK_BOX(vbox_summary),
2431 GTK_WIDGET_PTR(mainwin->summaryview->qsearch),
2432 FALSE, FALSE, 0);
2433 gtk_widget_show(vbox_summary);
2434
2435 switch (type) {
2436 case SEPARATE_NONE:
2437 hpaned = gtk_hpaned_new();
2438 gtk_box_pack_start(GTK_BOX(vbox_body), hpaned, TRUE, TRUE, 0);
2439 gtk_paned_add1(GTK_PANED(hpaned),
2440 GTK_WIDGET_PTR(mainwin->folderview));
2441 gtk_paned_add2(GTK_PANED(hpaned), vbox_summary);
2442 gtk_widget_show(hpaned);
2443 gtk_widget_queue_resize(hpaned);
2444
2445 if (use_vlayout) {
2446 vpaned = gtk_hpaned_new();
2447 gtk_widget_hide(mainwin->summaryview->hseparator);
2448 } else
2449 vpaned = gtk_vpaned_new();
2450 if (messageview_is_visible(mainwin->messageview)) {
2451 gtk_paned_add1(GTK_PANED(vpaned),
2452 GTK_WIDGET_PTR(mainwin->summaryview));
2453 gtk_box_pack_start(GTK_BOX(vbox_summary), vpaned,
2454 TRUE, TRUE, 0);
2455 if (!use_vlayout)
2456 gtk_widget_show
2457 (mainwin->summaryview->hseparator);
2458 } else {
2459 gtk_box_pack_start(GTK_BOX(vbox_summary),
2460 GTK_WIDGET_PTR(mainwin->summaryview),
2461 TRUE, TRUE, 0);
2462 gtk_widget_ref(vpaned);
2463 gtk_widget_hide(mainwin->summaryview->hseparator);
2464 }
2465 gtk_paned_add2(GTK_PANED(vpaned),
2466 GTK_WIDGET_PTR(mainwin->messageview));
2467 gtk_widget_show(vpaned);
2468 gtk_widget_queue_resize(vpaned);
2469
2470 mainwin->win.sep_none.hpaned = hpaned;
2471 mainwin->win.sep_none.vpaned = vpaned;
2472
2473 break;
2474 case SEPARATE_FOLDER:
2475 gtk_box_pack_start(GTK_BOX(vbox_body), vbox_summary,
2476 TRUE, TRUE, 0);
2477
2478 if (use_vlayout) {
2479 vpaned = gtk_hpaned_new();
2480 gtk_widget_hide(mainwin->summaryview->hseparator);
2481 } else
2482 vpaned = gtk_vpaned_new();
2483 if (messageview_is_visible(mainwin->messageview)) {
2484 gtk_paned_add1(GTK_PANED(vpaned),
2485 GTK_WIDGET_PTR(mainwin->summaryview));
2486 gtk_box_pack_start(GTK_BOX(vbox_summary), vpaned,
2487 TRUE, TRUE, 0);
2488 if (!use_vlayout)
2489 gtk_widget_show
2490 (mainwin->summaryview->hseparator);
2491 } else {
2492 gtk_box_pack_start(GTK_BOX(vbox_summary),
2493 GTK_WIDGET_PTR(mainwin->summaryview),
2494 TRUE, TRUE, 0);
2495 gtk_widget_ref(vpaned);
2496 gtk_widget_hide(mainwin->summaryview->hseparator);
2497 }
2498 gtk_paned_add2(GTK_PANED(vpaned),
2499 GTK_WIDGET_PTR(mainwin->messageview));
2500 gtk_widget_show(vpaned);
2501 gtk_widget_queue_resize(vpaned);
2502
2503 mainwin->win.sep_folder.folderwin = folderwin;
2504 mainwin->win.sep_folder.vpaned = vpaned;
2505
2506 break;
2507 case SEPARATE_MESSAGE:
2508 hpaned = gtk_hpaned_new();
2509 gtk_box_pack_start(GTK_BOX(vbox_body), hpaned, TRUE, TRUE, 0);
2510 gtk_paned_add1(GTK_PANED(hpaned),
2511 GTK_WIDGET_PTR(mainwin->folderview));
2512 gtk_paned_add2(GTK_PANED(hpaned), vbox_summary);
2513 gtk_box_pack_start(GTK_BOX(vbox_summary),
2514 GTK_WIDGET_PTR(mainwin->summaryview),
2515 TRUE, TRUE, 0);
2516 gtk_widget_hide(mainwin->summaryview->hseparator);
2517 gtk_widget_show(hpaned);
2518 gtk_widget_queue_resize(hpaned);
2519
2520 mainwin->win.sep_message.messagewin = messagewin;
2521 mainwin->win.sep_message.hpaned = hpaned;
2522
2523 break;
2524 case SEPARATE_BOTH:
2525 gtk_box_pack_start(GTK_BOX(vbox_body), vbox_summary,
2526 TRUE, TRUE, 0);
2527 gtk_box_pack_start(GTK_BOX(vbox_summary),
2528 GTK_WIDGET_PTR(mainwin->summaryview),
2529 TRUE, TRUE, 0);
2530 gtk_widget_hide(mainwin->summaryview->hseparator);
2531
2532 mainwin->win.sep_both.folderwin = folderwin;
2533 mainwin->win.sep_both.messagewin = messagewin;
2534
2535 break;
2536 }
2537
2538 if (messageview_is_visible(mainwin->messageview))
2539 gtk_arrow_set(GTK_ARROW(mainwin->summaryview->toggle_arrow),
2540 use_vlayout ? GTK_ARROW_RIGHT : GTK_ARROW_DOWN,
2541 GTK_SHADOW_OUT);
2542 else
2543 gtk_arrow_set(GTK_ARROW(mainwin->summaryview->toggle_arrow),
2544 use_vlayout ? GTK_ARROW_LEFT : GTK_ARROW_UP,
2545 GTK_SHADOW_OUT);
2546
2547 gtkut_window_move(GTK_WINDOW(mainwin->window),
2548 prefs_common.mainwin_x, prefs_common.mainwin_y);
2549
2550 gtk_widget_queue_resize(vbox_body);
2551 gtk_widget_queue_resize(mainwin->vbox);
2552 gtk_widget_queue_resize(mainwin->window);
2553
2554 mainwin->type = type;
2555 prefs_common.layout_type = layout;
2556
2557 /* toggle menu state */
2558 menuitem = gtk_item_factory_get_item
2559 (ifactory, "/View/Show or hide/Folder tree");
2560 gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menuitem),
2561 (type & SEPARATE_FOLDER) == 0 ? TRUE :
2562 prefs_common.folderview_visible);
2563 gtk_widget_set_sensitive(menuitem, ((type & SEPARATE_FOLDER) != 0));
2564 menuitem = gtk_item_factory_get_item
2565 (ifactory, "/View/Show or hide/Message view");
2566 gtk_check_menu_item_set_active
2567 (GTK_CHECK_MENU_ITEM(menuitem),
2568 messageview_is_visible(mainwin->messageview));
2569
2570 if (layout == LAYOUT_NORMAL) {
2571 menuitem = gtk_item_factory_get_item
2572 (ifactory, "/View/Layout/Normal");
2573 gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menuitem),
2574 TRUE);
2575 } else if (layout == LAYOUT_VERTICAL) {
2576 menuitem = gtk_item_factory_get_item
2577 (ifactory, "/View/Layout/Vertical");
2578 gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menuitem),
2579 TRUE);
2580 }
2581
2582 menuitem = gtk_item_factory_get_item
2583 (ifactory, "/View/Separate folder tree");
2584 gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menuitem),
2585 ((type & SEPARATE_FOLDER) != 0));
2586 menuitem = gtk_item_factory_get_item
2587 (ifactory, "/View/Separate message view");
2588 gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menuitem),
2589 ((type & SEPARATE_MESSAGE) != 0));
2590
2591 if (folderwin) {
2592 g_signal_connect
2593 (G_OBJECT(folderwin), "size_allocate",
2594 G_CALLBACK(folder_window_size_allocate_cb), mainwin);
2595 }
2596 if (messagewin) {
2597 g_signal_connect
2598 (G_OBJECT(messagewin), "size_allocate",
2599 G_CALLBACK(message_window_size_allocate_cb), mainwin);
2600 }
2601
2602 debug_print("done.\n");
2603 }
2604
2605 static GtkItemFactoryEntry reply_entries[] =
2606 {
2607 {N_("/_Reply"), NULL, reply_cb, COMPOSE_REPLY, NULL},
2608 {N_("/Reply to _all"), NULL, reply_cb, COMPOSE_REPLY_TO_ALL, NULL},
2609 {N_("/Reply to _sender"), NULL, reply_cb, COMPOSE_REPLY_TO_SENDER, NULL},
2610 {N_("/Reply to mailing _list"), NULL, reply_cb, COMPOSE_REPLY_TO_LIST, NULL}
2611 };
2612
2613 static GtkItemFactoryEntry forward_entries[] =
2614 {
2615 {N_("/_Forward"), NULL, reply_cb, COMPOSE_FORWARD, NULL},
2616 {N_("/For_ward as attachment"), NULL, reply_cb, COMPOSE_FORWARD_AS_ATTACH, NULL},
2617 {N_("/Redirec_t"), NULL, reply_cb, COMPOSE_REDIRECT, NULL}
2618 };
2619
2620 static PrefsToolbarItem items[] =
2621 {
2622 {T_GET, TRUE, toolbar_inc_cb},
2623 {T_GET_ALL, TRUE, toolbar_inc_all_cb},
2624 {T_SEND_QUEUE, TRUE, toolbar_send_cb},
2625 {T_COMPOSE, TRUE, toolbar_compose_cb},
2626 {T_REPLY, TRUE, toolbar_reply_cb},
2627 {T_REPLY_ALL, TRUE, toolbar_reply_to_all_cb},
2628 {T_FORWARD, TRUE, toolbar_forward_cb},
2629 {T_DELETE, FALSE, toolbar_delete_cb},
2630 {T_JUNK, TRUE, toolbar_junk_cb},
2631 {T_NOTJUNK, FALSE, toolbar_notjunk_cb},
2632 {T_NEXT, FALSE, toolbar_next_unread_cb},
2633 {T_PREV, FALSE, toolbar_prev_unread_cb},
2634 {T_SEARCH, FALSE, toolbar_search_cb},
2635 {T_PRINT, FALSE, toolbar_print_cb},
2636 {T_STOP, FALSE, toolbar_stop_cb},
2637 {T_ADDRESS_BOOK, FALSE, toolbar_address_cb},
2638 {T_EXECUTE, FALSE, toolbar_exec_cb},
2639 {T_COMMON_PREFS, FALSE, toolbar_prefs_common_cb},
2640 {T_ACCOUNT_PREFS, FALSE, toolbar_prefs_account_cb},
2641 {T_REMOTE_MAILBOX, FALSE, toolbar_rpop3_cb},
2642
2643 {-1, FALSE, NULL}
2644 };
2645
main_window_toolbar_create(MainWindow * mainwin)2646 static GtkWidget *main_window_toolbar_create(MainWindow *mainwin)
2647 {
2648 GtkWidget *toolbar;
2649 const gchar *setting;
2650 GList *item_list;
2651
2652 if (prefs_common.main_toolbar_setting &&
2653 *prefs_common.main_toolbar_setting != '\0')
2654 setting = prefs_common.main_toolbar_setting;
2655 else
2656 setting = prefs_toolbar_get_default_main_setting_name_list();
2657
2658 item_list = prefs_toolbar_get_item_list_from_name_list(setting);
2659 toolbar = main_window_toolbar_create_from_list(mainwin, item_list);
2660 g_list_free(item_list);
2661
2662 return toolbar;
2663 }
2664
main_window_toolbar_create_from_list(MainWindow * mainwin,GList * item_list)2665 static GtkWidget *main_window_toolbar_create_from_list(MainWindow *mainwin,
2666 GList *item_list)
2667 {
2668 GtkWidget *toolbar;
2669 GtkWidget *icon_wid;
2670 GtkToolItem *toolitem;
2671 GtkToolItem *comboitem;
2672 ComboButton *combo;
2673 gint n_entries;
2674 gint i;
2675 GList *cur;
2676
2677 toolbar = gtk_toolbar_new();
2678 gtk_toolbar_set_orientation(GTK_TOOLBAR(toolbar),
2679 GTK_ORIENTATION_HORIZONTAL);
2680 gtk_toolbar_set_style(GTK_TOOLBAR(toolbar), GTK_TOOLBAR_BOTH);
2681 g_signal_connect(G_OBJECT(toolbar), "button_press_event",
2682 G_CALLBACK(toolbar_button_pressed), mainwin);
2683
2684 items[0].data = &mainwin->get_btn;
2685 items[1].data = &mainwin->getall_btn;
2686 items[2].data = &mainwin->send_btn;
2687 items[3].data = &mainwin->compose_btn;
2688 items[4].data = &mainwin->reply_btn;
2689 items[5].data = &mainwin->replyall_btn;
2690 items[6].data = &mainwin->fwd_btn;
2691 items[7].data = &mainwin->delete_btn;
2692 items[8].data = &mainwin->junk_btn;
2693 items[9].data = &mainwin->notjunk_btn;
2694 items[10].data = &mainwin->next_btn;
2695 items[11].data = &mainwin->prev_btn;
2696 items[12].data = &mainwin->search_btn;
2697 items[13].data = &mainwin->print_btn;
2698 items[14].data = &mainwin->stop_btn;
2699 items[15].data = &mainwin->address_btn;
2700 items[16].data = &mainwin->exec_btn;
2701 items[17].data = &mainwin->prefs_common_btn;
2702 items[18].data = &mainwin->prefs_account_btn;
2703 items[19].data = &mainwin->rpop3_btn;
2704 for (i = 0; i <= 19; i++)
2705 *(GtkWidget **)items[i].data = NULL;
2706 mainwin->reply_combo = NULL;
2707 mainwin->fwd_combo = NULL;
2708
2709 for (cur = item_list; cur != NULL; cur = cur->next) {
2710 const PrefsDisplayItem *ditem = cur->data;
2711 PrefsToolbarItem *item;
2712 gint width;
2713
2714 if (ditem->id == T_SEPARATOR) {
2715 toolitem = gtk_separator_tool_item_new();
2716 gtk_toolbar_insert(GTK_TOOLBAR(toolbar), toolitem, -1);
2717 continue;
2718 }
2719
2720 for (item = items; item->id != -1; item++) {
2721 if (ditem->id == item->id)
2722 break;
2723 }
2724 if (item->id == -1)
2725 continue;
2726
2727 icon_wid = stock_pixbuf_widget_for_toolbar(ditem->icon);
2728 toolitem = gtk_tool_button_new(icon_wid, gettext(ditem->label));
2729 if (ditem->description) {
2730 gtk_tool_item_set_tooltip(toolitem,
2731 mainwin->toolbar_tip,
2732 gettext(ditem->description),
2733 ditem->name);
2734 }
2735
2736 gtkut_get_str_size(GTK_WIDGET(toolitem), gettext(ditem->label),
2737 &width, NULL);
2738 gtk_tool_item_set_homogeneous
2739 (toolitem, width < 52 ? TRUE : FALSE);
2740 gtk_tool_item_set_is_important(toolitem, item->is_important);
2741
2742 gtk_toolbar_insert(GTK_TOOLBAR(toolbar), toolitem, -1);
2743
2744 g_signal_connect(G_OBJECT(toolitem), "clicked",
2745 G_CALLBACK(item->callback), mainwin);
2746 g_signal_connect(G_OBJECT(GTK_BIN(toolitem)->child),
2747 "button_press_event",
2748 G_CALLBACK(toolbar_button_pressed), mainwin);
2749
2750 if (ditem->id == T_REPLY) {
2751 n_entries = sizeof(reply_entries) /
2752 sizeof(reply_entries[0]);
2753 combo = gtkut_combo_button_create
2754 (GTK_WIDGET(toolitem),
2755 reply_entries, n_entries, "<Reply>", mainwin);
2756 gtk_button_set_relief(GTK_BUTTON(combo->arrow),
2757 GTK_RELIEF_NONE);
2758
2759 comboitem = gtk_tool_item_new();
2760 gtk_tool_item_set_homogeneous(comboitem, FALSE);
2761 gtk_container_add(GTK_CONTAINER(comboitem),
2762 GTK_WIDGET_PTR(combo));
2763 if (ditem->description) {
2764 gtk_tool_item_set_tooltip
2765 (comboitem, mainwin->toolbar_tip,
2766 gettext(ditem->description),
2767 ditem->name);
2768 }
2769
2770 gtk_toolbar_insert(GTK_TOOLBAR(toolbar), comboitem, -1);
2771
2772 mainwin->reply_combo = combo;
2773 } else if (ditem->id == T_FORWARD) {
2774 n_entries = sizeof(forward_entries) /
2775 sizeof(forward_entries[0]);
2776 combo = gtkut_combo_button_create
2777 (GTK_WIDGET(toolitem),
2778 forward_entries, n_entries, "<Forward>",
2779 mainwin);
2780 gtk_button_set_relief(GTK_BUTTON(combo->arrow),
2781 GTK_RELIEF_NONE);
2782
2783 comboitem = gtk_tool_item_new();
2784 gtk_tool_item_set_homogeneous(comboitem, FALSE);
2785 gtk_container_add(GTK_CONTAINER(comboitem),
2786 GTK_WIDGET_PTR(combo));
2787 if (ditem->description) {
2788 gtk_tool_item_set_tooltip
2789 (comboitem, mainwin->toolbar_tip,
2790 gettext(ditem->description),
2791 ditem->name);
2792 }
2793
2794 gtk_toolbar_insert(GTK_TOOLBAR(toolbar), comboitem, -1);
2795
2796 mainwin->fwd_combo = combo;
2797 }
2798
2799 *(GtkWidget **)item->data = GTK_WIDGET(toolitem);
2800 }
2801
2802 gtk_widget_show_all(toolbar);
2803
2804 return toolbar;
2805 }
2806
main_window_toolbar_toggle_menu_set_active(MainWindow * mainwin,ToolbarStyle style)2807 static void main_window_toolbar_toggle_menu_set_active(MainWindow *mainwin,
2808 ToolbarStyle style)
2809 {
2810 GtkWidget *menuitem = NULL;
2811 GtkItemFactory *ifactory = mainwin->menu_factory;
2812
2813 switch (style) {
2814 case TOOLBAR_NONE:
2815 menuitem = gtk_item_factory_get_item
2816 (ifactory, "/View/Show or hide/Toolbar/None");
2817 break;
2818 case TOOLBAR_ICON:
2819 menuitem = gtk_item_factory_get_item
2820 (ifactory, "/View/Show or hide/Toolbar/Icon");
2821 break;
2822 case TOOLBAR_TEXT:
2823 menuitem = gtk_item_factory_get_item
2824 (ifactory, "/View/Show or hide/Toolbar/Text");
2825 break;
2826 case TOOLBAR_BOTH:
2827 menuitem = gtk_item_factory_get_item
2828 (ifactory, "/View/Show or hide/Toolbar/Icon and text");
2829 break;
2830 case TOOLBAR_BOTH_HORIZ:
2831 menuitem = gtk_item_factory_get_item
2832 (ifactory, "/View/Show or hide/Toolbar/Text at the right of icon");
2833 break;
2834 }
2835
2836 if (menuitem)
2837 gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menuitem),
2838 TRUE);
2839 }
2840
2841 /* callback functions */
2842
toolbar_inc_cb(GtkWidget * widget,gpointer data)2843 static void toolbar_inc_cb (GtkWidget *widget,
2844 gpointer data)
2845 {
2846 MainWindow *mainwin = (MainWindow *)data;
2847
2848 inc_mail_cb(mainwin, 0, NULL);
2849 }
2850
toolbar_inc_all_cb(GtkWidget * widget,gpointer data)2851 static void toolbar_inc_all_cb (GtkWidget *widget,
2852 gpointer data)
2853 {
2854 MainWindow *mainwin = (MainWindow *)data;
2855
2856 inc_all_account_mail_cb(mainwin, 0, NULL);
2857 }
2858
toolbar_rpop3_cb(GtkWidget * widget,gpointer data)2859 static void toolbar_rpop3_cb (GtkWidget *widget,
2860 gpointer data)
2861 {
2862 MainWindow *mainwin = (MainWindow *)data;
2863
2864 rpop3_cb(mainwin, 0, NULL);
2865 }
2866
toolbar_send_cb(GtkWidget * widget,gpointer data)2867 static void toolbar_send_cb (GtkWidget *widget,
2868 gpointer data)
2869 {
2870 MainWindow *mainwin = (MainWindow *)data;
2871
2872 send_queue_cb(mainwin, 0, NULL);
2873 }
2874
toolbar_compose_cb(GtkWidget * widget,gpointer data)2875 static void toolbar_compose_cb (GtkWidget *widget,
2876 gpointer data)
2877 {
2878 MainWindow *mainwin = (MainWindow *)data;
2879
2880 compose_cb(mainwin, 0, NULL);
2881 }
2882
toolbar_reply_cb(GtkWidget * widget,gpointer data)2883 static void toolbar_reply_cb (GtkWidget *widget,
2884 gpointer data)
2885 {
2886 MainWindow *mainwin = (MainWindow *)data;
2887
2888 if (prefs_common.default_reply_list)
2889 reply_cb(mainwin, COMPOSE_REPLY_TO_LIST, NULL);
2890 else
2891 reply_cb(mainwin, COMPOSE_REPLY, NULL);
2892 }
2893
toolbar_reply_to_all_cb(GtkWidget * widget,gpointer data)2894 static void toolbar_reply_to_all_cb (GtkWidget *widget,
2895 gpointer data)
2896 {
2897 MainWindow *mainwin = (MainWindow *)data;
2898
2899 reply_cb(mainwin, COMPOSE_REPLY_TO_ALL, NULL);
2900 }
2901
toolbar_forward_cb(GtkWidget * widget,gpointer data)2902 static void toolbar_forward_cb (GtkWidget *widget,
2903 gpointer data)
2904 {
2905 MainWindow *mainwin = (MainWindow *)data;
2906
2907 reply_cb(mainwin, COMPOSE_FORWARD, NULL);
2908 }
2909
toolbar_delete_cb(GtkWidget * widget,gpointer data)2910 static void toolbar_delete_cb (GtkWidget *widget,
2911 gpointer data)
2912 {
2913 MainWindow *mainwin = (MainWindow *)data;
2914
2915 summary_delete(mainwin->summaryview);
2916 }
2917
toolbar_junk_cb(GtkWidget * widget,gpointer data)2918 static void toolbar_junk_cb (GtkWidget *widget,
2919 gpointer data)
2920 {
2921 MainWindow *mainwin = (MainWindow *)data;
2922
2923 summary_junk(mainwin->summaryview);
2924 }
2925
toolbar_notjunk_cb(GtkWidget * widget,gpointer data)2926 static void toolbar_notjunk_cb (GtkWidget *widget,
2927 gpointer data)
2928 {
2929 MainWindow *mainwin = (MainWindow *)data;
2930
2931 summary_not_junk(mainwin->summaryview);
2932 }
2933
toolbar_exec_cb(GtkWidget * widget,gpointer data)2934 static void toolbar_exec_cb (GtkWidget *widget,
2935 gpointer data)
2936 {
2937 MainWindow *mainwin = (MainWindow *)data;
2938
2939 summary_execute(mainwin->summaryview);
2940 }
2941
toolbar_next_unread_cb(GtkWidget * widget,gpointer data)2942 static void toolbar_next_unread_cb (GtkWidget *widget,
2943 gpointer data)
2944 {
2945 MainWindow *mainwin = (MainWindow *)data;
2946
2947 next_unread_cb(mainwin, 0, NULL);
2948 }
2949
toolbar_prev_unread_cb(GtkWidget * widget,gpointer data)2950 static void toolbar_prev_unread_cb(GtkWidget *widget, gpointer data)
2951 {
2952 MainWindow *mainwin = (MainWindow *)data;
2953
2954 prev_unread_cb(mainwin, 0, NULL);
2955 }
2956
toolbar_address_cb(GtkWidget * widget,gpointer data)2957 static void toolbar_address_cb(GtkWidget *widget, gpointer data)
2958 {
2959 MainWindow *mainwin = (MainWindow *)data;
2960
2961 addressbook_open_cb(mainwin, 0, NULL);
2962 }
2963
toolbar_search_cb(GtkWidget * widget,gpointer data)2964 static void toolbar_search_cb(GtkWidget *widget, gpointer data)
2965 {
2966 MainWindow *mainwin = (MainWindow *)data;
2967
2968 search_cb(mainwin, 1, NULL);
2969 }
2970
toolbar_print_cb(GtkWidget * widget,gpointer data)2971 static void toolbar_print_cb(GtkWidget *widget, gpointer data)
2972 {
2973 MainWindow *mainwin = (MainWindow *)data;
2974
2975 print_cb(mainwin, 0, NULL);
2976 }
2977
toolbar_stop_cb(GtkWidget * widget,gpointer data)2978 static void toolbar_stop_cb(GtkWidget *widget, gpointer data)
2979 {
2980 MainWindow *mainwin = (MainWindow *)data;
2981
2982 inc_stop_cb(mainwin, 0, NULL);
2983 }
2984
toolbar_prefs_common_cb(GtkWidget * widget,gpointer data)2985 static void toolbar_prefs_common_cb(GtkWidget *widget, gpointer data)
2986 {
2987 MainWindow *mainwin = (MainWindow *)data;
2988
2989 prefs_common_open_cb(mainwin, 0, NULL);
2990 }
2991
toolbar_prefs_account_cb(GtkWidget * widget,gpointer data)2992 static void toolbar_prefs_account_cb(GtkWidget *widget, gpointer data)
2993 {
2994 MainWindow *mainwin = (MainWindow *)data;
2995
2996 prefs_account_open_cb(mainwin, 0, NULL);
2997 }
2998
toolbar_toggle(GtkWidget * widget,gpointer data)2999 static void toolbar_toggle(GtkWidget *widget, gpointer data)
3000 {
3001 MainWindow *mainwin = (MainWindow *)data;
3002 ToolbarStyle style;
3003
3004 if (!gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(widget)))
3005 return;
3006
3007 style = (ToolbarStyle)g_object_get_data(G_OBJECT(widget), MENU_VAL_ID);
3008 main_window_toolbar_toggle_menu_set_active(mainwin, style);
3009 }
3010
toolbar_customize(GtkWidget * widget,gpointer data)3011 static void toolbar_customize(GtkWidget *widget, gpointer data)
3012 {
3013 MainWindow *mainwin = (MainWindow *)data;
3014 gint *visible_items;
3015 GList *item_list = NULL;
3016 GtkWidget *toolbar;
3017 gint ret;
3018 const gchar *setting;
3019
3020 if (prefs_common.main_toolbar_setting &&
3021 *prefs_common.main_toolbar_setting != '\0')
3022 setting = prefs_common.main_toolbar_setting;
3023 else
3024 setting = prefs_toolbar_get_default_main_setting_name_list();
3025 visible_items = prefs_toolbar_get_id_list_from_name_list(setting);
3026 ret = prefs_toolbar_open(TOOLBAR_MAIN, visible_items, &item_list);
3027 g_free(visible_items);
3028
3029 if (ret == 0) {
3030 gtk_widget_destroy(mainwin->toolbar);
3031 toolbar = main_window_toolbar_create_from_list(mainwin,
3032 item_list);
3033 gtk_widget_set_size_request(toolbar, 300, -1);
3034 gtk_box_pack_start(GTK_BOX(mainwin->vbox), toolbar,
3035 FALSE, FALSE, 0);
3036 gtk_box_reorder_child(GTK_BOX(mainwin->vbox), toolbar, 1);
3037 mainwin->toolbar = toolbar;
3038 main_window_set_toolbar_sensitive(mainwin);
3039 main_window_set_toolbar_button_visibility(mainwin);
3040 g_free(prefs_common.main_toolbar_setting);
3041 prefs_common.main_toolbar_setting =
3042 prefs_toolbar_get_name_list_from_item_list(item_list);
3043 g_list_free(item_list);
3044 prefs_common_write_config();
3045
3046 syl_plugin_signal_emit("main-window-toolbar-changed");
3047 }
3048 }
3049
toolbar_button_pressed(GtkWidget * widget,GdkEventButton * event,gpointer data)3050 static gboolean toolbar_button_pressed(GtkWidget *widget, GdkEventButton *event,
3051 gpointer data)
3052 {
3053 MainWindow *mainwin = (MainWindow *)data;
3054 GtkWidget *menu;
3055 GtkWidget *menuitem;
3056
3057 if (!event) return FALSE;
3058 if (event->button != 3) return FALSE;
3059
3060 menu = gtk_menu_new();
3061 gtk_widget_show(menu);
3062
3063 #define SET_TOOLBAR_MENU(text, style, widget) \
3064 { \
3065 MENUITEM_ADD_RADIO(menu, menuitem, widget, text, style); \
3066 if (prefs_common.toolbar_style == style) \
3067 gtk_check_menu_item_set_active \
3068 (GTK_CHECK_MENU_ITEM(menuitem), TRUE); \
3069 g_signal_connect(G_OBJECT(menuitem), "activate", \
3070 G_CALLBACK(toolbar_toggle), mainwin); \
3071 }
3072
3073 SET_TOOLBAR_MENU(_("Icon _and text"), TOOLBAR_BOTH, NULL);
3074 SET_TOOLBAR_MENU(_("Text at the _right of icon"), TOOLBAR_BOTH_HORIZ,
3075 menuitem);
3076 SET_TOOLBAR_MENU(_("_Icon"), TOOLBAR_ICON, menuitem);
3077 SET_TOOLBAR_MENU(_("_Text"), TOOLBAR_TEXT, menuitem);
3078 SET_TOOLBAR_MENU(_("_None"), TOOLBAR_NONE, menuitem);
3079 MENUITEM_ADD(menu, menuitem, NULL, NULL);
3080 MENUITEM_ADD_WITH_MNEMONIC(menu, menuitem, _("_Customize toolbar..."),
3081 0);
3082 g_signal_connect(G_OBJECT(menuitem), "activate",
3083 G_CALLBACK(toolbar_customize), mainwin);
3084
3085 g_signal_connect(G_OBJECT(menu), "selection_done",
3086 G_CALLBACK(gtk_widget_destroy), NULL);
3087
3088 gtk_menu_popup(GTK_MENU(menu), NULL, NULL, NULL, NULL,
3089 event->button, event->time);
3090
3091 return TRUE;
3092 }
3093
online_switch_clicked(GtkWidget * widget,gpointer data)3094 static void online_switch_clicked(GtkWidget *widget, gpointer data)
3095 {
3096 MainWindow *mainwin = (MainWindow *)data;
3097 GtkWidget *menuitem;
3098
3099 debug_print("Toggle online mode: %d -> %d\n", prefs_common.online_mode,
3100 !prefs_common.online_mode);
3101
3102 menuitem = gtk_item_factory_get_item(mainwin->menu_factory,
3103 "/File/Work offline");
3104
3105 if (prefs_common.online_mode == TRUE) {
3106 if (folder_remote_folder_active_session_exist()) {
3107 debug_print("Active session exist. Cancelling online switch.\n");
3108 return;
3109 }
3110
3111 prefs_common.online_mode = FALSE;
3112 gtk_widget_hide(mainwin->online_pixmap);
3113 gtk_widget_show(mainwin->offline_pixmap);
3114 gtk_tooltips_set_tip
3115 (mainwin->online_tip, mainwin->online_switch,
3116 _("You are offline. Click the icon to go online."),
3117 NULL);
3118 gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menuitem),
3119 TRUE);
3120 inc_autocheck_timer_remove();
3121 folder_remote_folder_destroy_all_sessions();
3122 } else {
3123 prefs_common.online_mode = TRUE;
3124 gtk_widget_hide(mainwin->offline_pixmap);
3125 gtk_widget_show(mainwin->online_pixmap);
3126 gtk_tooltips_set_tip
3127 (mainwin->online_tip, mainwin->online_switch,
3128 _("You are online. Click the icon to go offline."),
3129 NULL);
3130 gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menuitem),
3131 FALSE);
3132 inc_autocheck_timer_set();
3133 }
3134 }
3135
ac_label_button_pressed(GtkWidget * widget,GdkEventButton * event,gpointer data)3136 static gboolean ac_label_button_pressed(GtkWidget *widget,
3137 GdkEventButton *event, gpointer data)
3138 {
3139 MainWindow *mainwin = (MainWindow *)data;
3140
3141 if (!event) return FALSE;
3142
3143 gtk_button_set_relief(GTK_BUTTON(widget), GTK_RELIEF_NORMAL);
3144 g_object_set_data(G_OBJECT(mainwin->ac_menu), "menu_button", widget);
3145
3146 gtk_menu_popup(GTK_MENU(mainwin->ac_menu), NULL, NULL,
3147 menu_button_position, widget,
3148 event->button, event->time);
3149
3150 return TRUE;
3151 }
3152
ac_menu_popup_closed(GtkMenuShell * menu_shell,gpointer data)3153 static void ac_menu_popup_closed(GtkMenuShell *menu_shell, gpointer data)
3154 {
3155 MainWindow *mainwin = (MainWindow *)data;
3156 GtkWidget *button;
3157
3158 button = g_object_get_data(G_OBJECT(menu_shell), "menu_button");
3159 if (!button) return;
3160 gtk_button_set_relief(GTK_BUTTON(button), GTK_RELIEF_NONE);
3161 g_object_set_data(G_OBJECT(mainwin->ac_menu), "menu_button", NULL);
3162 manage_window_focus_in(mainwin->window, NULL, NULL);
3163 }
3164
main_window_key_pressed(GtkWidget * widget,GdkEventKey * event,gpointer data)3165 static gboolean main_window_key_pressed(GtkWidget *widget, GdkEventKey *event,
3166 gpointer data)
3167 {
3168 MainWindow *mainwin = (MainWindow *)data;
3169
3170 if (!mainwin)
3171 return FALSE;
3172
3173 if (!GTK_WIDGET_HAS_FOCUS(mainwin->summaryview->qsearch->entry))
3174 return FALSE;
3175
3176 /* g_print("keyval: %d, state: %d\n", event->keyval, event->state); */
3177 if ((event->state & (GDK_MOD1_MASK|GDK_CONTROL_MASK)) != 0)
3178 return FALSE;
3179 if (event->keyval == GDK_Tab || event->keyval == GDK_KP_Tab ||
3180 event->keyval == GDK_ISO_Left_Tab)
3181 return FALSE;
3182
3183 gtk_window_propagate_key_event(GTK_WINDOW(widget), event);
3184
3185 return TRUE;
3186 }
3187
main_window_close_cb(GtkWidget * widget,GdkEventAny * event,gpointer data)3188 static gint main_window_close_cb(GtkWidget *widget, GdkEventAny *event,
3189 gpointer data)
3190 {
3191 MainWindow *mainwin = (MainWindow *)data;
3192
3193 if (mainwin->lock_count == 0)
3194 app_exit_cb(data, 0, widget);
3195
3196 return TRUE;
3197 }
3198
folder_window_close_cb(GtkWidget * widget,GdkEventAny * event,gpointer data)3199 static gint folder_window_close_cb(GtkWidget *widget, GdkEventAny *event,
3200 gpointer data)
3201 {
3202 MainWindow *mainwin = (MainWindow *)data;
3203 GtkWidget *menuitem;
3204
3205 menuitem = gtk_item_factory_get_item
3206 (mainwin->menu_factory, "/View/Show or hide/Folder tree");
3207 gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menuitem), FALSE);
3208
3209 return TRUE;
3210 }
3211
message_window_close_cb(GtkWidget * widget,GdkEventAny * event,gpointer data)3212 static gint message_window_close_cb(GtkWidget *widget, GdkEventAny *event,
3213 gpointer data)
3214 {
3215 MainWindow *mainwin = (MainWindow *)data;
3216 GtkWidget *menuitem;
3217
3218 menuitem = gtk_item_factory_get_item
3219 (mainwin->menu_factory, "/View/Show or hide/Message view");
3220 gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menuitem), FALSE);
3221
3222 return TRUE;
3223 }
3224
main_window_size_allocate_cb(GtkWidget * widget,GtkAllocation * allocation,gpointer data)3225 static void main_window_size_allocate_cb(GtkWidget *widget,
3226 GtkAllocation *allocation,
3227 gpointer data)
3228 {
3229 MainWindow *mainwin = (MainWindow *)data;
3230
3231 main_window_get_size(mainwin);
3232 }
3233
folder_window_size_allocate_cb(GtkWidget * widget,GtkAllocation * allocation,gpointer data)3234 static void folder_window_size_allocate_cb(GtkWidget *widget,
3235 GtkAllocation *allocation,
3236 gpointer data)
3237 {
3238 MainWindow *mainwin = (MainWindow *)data;
3239
3240 main_window_get_size(mainwin);
3241 }
3242
message_window_size_allocate_cb(GtkWidget * widget,GtkAllocation * allocation,gpointer data)3243 static void message_window_size_allocate_cb(GtkWidget *widget,
3244 GtkAllocation *allocation,
3245 gpointer data)
3246 {
3247 MainWindow *mainwin = (MainWindow *)data;
3248
3249 main_window_get_size(mainwin);
3250 }
3251
main_window_window_state_cb(GtkWidget * widget,GdkEventWindowState * event,gpointer data)3252 static gboolean main_window_window_state_cb(GtkWidget *widget,
3253 GdkEventWindowState *event,
3254 gpointer data)
3255 {
3256 MainWindow *mainwin = (MainWindow *)data;
3257 gboolean minimized = FALSE;
3258
3259 debug_print("main_window_window_state_cb\n");
3260
3261 if ((event->changed_mask & GDK_WINDOW_STATE_MAXIMIZED) != 0) {
3262 if ((event->new_window_state & GDK_WINDOW_STATE_MAXIMIZED) != 0) {
3263 debug_print("main_window_window_state_cb: maximized\n");
3264 prefs_common.mainwin_maximized = TRUE;
3265 } else {
3266 debug_print("main_window_window_state_cb: unmaximized\n");
3267 #ifdef G_OS_WIN32
3268 if ((event->changed_mask & GDK_WINDOW_STATE_ICONIFIED) != 0 &&
3269 (event->new_window_state & GDK_WINDOW_STATE_ICONIFIED) != 0) {
3270 debug_print("main_window_window_state_cb: unmaximized by minimize\n");
3271 /* don't change mainwin_maximized */
3272 } else {
3273 prefs_common.mainwin_maximized = FALSE;
3274 }
3275 #else
3276 prefs_common.mainwin_maximized = FALSE;
3277 #endif
3278 }
3279 }
3280 if ((event->changed_mask & GDK_WINDOW_STATE_ICONIFIED) != 0) {
3281 if ((event->new_window_state & GDK_WINDOW_STATE_ICONIFIED) != 0) {
3282 debug_print("main_window_window_state_cb: iconified\n");
3283 minimized = TRUE;
3284 mainwin->window_hidden = TRUE;
3285 } else {
3286 debug_print("main_window_window_state_cb: deiconified\n");
3287 mainwin->window_hidden = FALSE;
3288 }
3289 }
3290 if ((event->changed_mask & GDK_WINDOW_STATE_WITHDRAWN) != 0) {
3291 if ((event->new_window_state & GDK_WINDOW_STATE_WITHDRAWN) != 0) {
3292 debug_print("main_window_window_state_cb: withdrawn\n");
3293 mainwin->window_hidden = TRUE;
3294 } else {
3295 debug_print("main_window_window_state_cb: unwithdrawn\n");
3296 mainwin->window_hidden = FALSE;
3297 }
3298 }
3299
3300 #ifdef G_OS_WIN32
3301 if (minimized &&
3302 prefs_common.show_trayicon && prefs_common.minimize_to_tray) {
3303 gtk_window_set_skip_taskbar_hint(GTK_WINDOW(widget), TRUE);
3304 debug_print("main_window_window_state_cb: hide window\n");
3305 gtk_widget_hide(widget);
3306 #else
3307 if (mainwin->window_hidden &&
3308 prefs_common.show_trayicon && prefs_common.minimize_to_tray) {
3309 gtk_window_set_skip_taskbar_hint(GTK_WINDOW(widget), TRUE);
3310 #endif
3311 } else if (!mainwin->window_hidden) {
3312 gtk_window_set_skip_taskbar_hint(GTK_WINDOW(widget), FALSE);
3313 #ifdef G_OS_WIN32
3314 if (prefs_common.mainwin_maximized)
3315 gtk_window_maximize(GTK_WINDOW(widget));
3316 #endif
3317 }
3318
3319 return FALSE;
3320 }
3321
3322 static gboolean main_window_visibility_notify_cb(GtkWidget *widget,
3323 GdkEventVisibility *event,
3324 gpointer data)
3325 {
3326 MainWindow *mainwin = (MainWindow *)data;
3327
3328 mainwin->window_obscured =
3329 (event->state == GDK_VISIBILITY_FULLY_OBSCURED ||
3330 event->state == GDK_VISIBILITY_PARTIAL) ? TRUE : FALSE;
3331
3332 return FALSE;
3333 }
3334
3335 static void new_folder_cb(MainWindow *mainwin, guint action,
3336 GtkWidget *widget)
3337 {
3338 folderview_new_folder(mainwin->folderview);
3339 }
3340
3341 static void rename_folder_cb(MainWindow *mainwin, guint action,
3342 GtkWidget *widget)
3343 {
3344 folderview_rename_folder(mainwin->folderview);
3345 }
3346
3347 static void move_folder_cb(MainWindow *mainwin, guint action, GtkWidget *widget)
3348 {
3349 folderview_move_folder(mainwin->folderview);
3350 }
3351
3352 static void delete_folder_cb(MainWindow *mainwin, guint action,
3353 GtkWidget *widget)
3354 {
3355 folderview_delete_folder(mainwin->folderview);
3356 }
3357
3358 static void add_mailbox_cb(MainWindow *mainwin, guint action,
3359 GtkWidget *widget)
3360 {
3361 main_window_add_mailbox(mainwin);
3362 }
3363
3364 static void remove_mailbox_cb(MainWindow *mainwin, guint action,
3365 GtkWidget *widget)
3366 {
3367 folderview_remove_mailbox(mainwin->folderview);
3368 }
3369
3370 static void update_folderview_cb(MainWindow *mainwin, guint action,
3371 GtkWidget *widget)
3372 {
3373 if (action == 0)
3374 folderview_check_new_selected(mainwin->folderview);
3375 else
3376 folderview_check_new_all();
3377 }
3378
3379 static void rebuild_tree_cb(MainWindow *mainwin, guint action,
3380 GtkWidget *widget)
3381 {
3382 folderview_rebuild_tree(mainwin->folderview);
3383 }
3384
3385 static void import_mail_cb(MainWindow *mainwin, guint action,
3386 GtkWidget *widget)
3387 {
3388 import_mail(mainwin->summaryview->folder_item);
3389 main_window_popup(mainwin);
3390 }
3391
3392 static void export_mail_cb(MainWindow *mainwin, guint action,
3393 GtkWidget *widget)
3394 {
3395 export_mail(mainwin->summaryview->folder_item);
3396 main_window_popup(mainwin);
3397 }
3398
3399 static void empty_trash_cb(MainWindow *mainwin, guint action,
3400 GtkWidget *widget)
3401 {
3402 main_window_empty_trash(mainwin, TRUE);
3403 }
3404
3405 static void save_as_cb(MainWindow *mainwin, guint action, GtkWidget *widget)
3406 {
3407 MessageView *messageview = mainwin->messageview;
3408
3409 if (messageview_get_selected_mime_part(messageview) &&
3410 GTK_WIDGET_HAS_FOCUS(messageview->mimeview->treeview))
3411 mimeview_save_as(messageview->mimeview);
3412 else
3413 summary_save_as(mainwin->summaryview);
3414 }
3415
3416 #if GTK_CHECK_VERSION(2, 10, 0)
3417 static void page_setup_cb(MainWindow *mainwin, guint action, GtkWidget *widget)
3418 {
3419 printing_page_setup_gtk();
3420 }
3421 #endif
3422
3423 static void print_cb(MainWindow *mainwin, guint action, GtkWidget *widget)
3424 {
3425 summary_print(mainwin->summaryview);
3426 }
3427
3428 static void toggle_offline_cb(MainWindow *mainwin, guint action,
3429 GtkWidget *widget)
3430 {
3431 if (GTK_CHECK_MENU_ITEM(widget)->active &&
3432 folder_remote_folder_active_session_exist()) {
3433 debug_print("Active session exist. Cancelling online switch.\n");
3434 gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(widget),
3435 FALSE);
3436 return;
3437 }
3438
3439 main_window_toggle_online
3440 (mainwin, !GTK_CHECK_MENU_ITEM(widget)->active);
3441 }
3442
3443 static void app_exit_cb(MainWindow *mainwin, guint action, GtkWidget *widget)
3444 {
3445 if (prefs_common.confirm_on_exit) {
3446 if (alertpanel(_("Exit"), _("Exit this program?"),
3447 GTK_STOCK_OK, GTK_STOCK_CANCEL, NULL)
3448 != G_ALERTDEFAULT)
3449 return;
3450 manage_window_focus_in(mainwin->window, NULL, NULL);
3451 }
3452
3453 app_will_exit(FALSE);
3454 }
3455
3456 static void search_cb(MainWindow *mainwin, guint action, GtkWidget *widget)
3457 {
3458 if (action == 1) {
3459 FolderItem *item;
3460
3461 item = folderview_get_selected_item(mainwin->folderview);
3462 if (item && item->stype == F_VIRTUAL)
3463 prefs_search_folder_open(item);
3464 else
3465 query_search(item);
3466 } else if (action == 2) {
3467 if (!prefs_common.show_searchbar) {
3468 GtkWidget *menuitem;
3469
3470 menuitem = gtk_item_factory_get_item
3471 (mainwin->menu_factory,
3472 "/View/Show or hide/Search bar");
3473 gtk_check_menu_item_set_active
3474 (GTK_CHECK_MENU_ITEM(menuitem), TRUE);
3475 }
3476 gtk_widget_grab_focus(mainwin->summaryview->qsearch->entry);
3477 } else
3478 message_search(mainwin->messageview);
3479 }
3480
3481 static void toggle_folder_cb(MainWindow *mainwin, guint action,
3482 GtkWidget *widget)
3483 {
3484 gboolean active;
3485
3486 active = GTK_CHECK_MENU_ITEM(widget)->active;
3487
3488 switch (mainwin->type) {
3489 case SEPARATE_NONE:
3490 case SEPARATE_MESSAGE:
3491 #if 0
3492 if (active)
3493 gtk_widget_show(GTK_WIDGET_PTR(mainwin->folderview));
3494 else
3495 gtk_widget_hide(GTK_WIDGET_PTR(mainwin->folderview));
3496 #endif
3497 break;
3498 case SEPARATE_FOLDER:
3499 if (active)
3500 gtk_widget_show(mainwin->win.sep_folder.folderwin);
3501 else
3502 gtk_widget_hide(mainwin->win.sep_folder.folderwin);
3503 break;
3504 case SEPARATE_BOTH:
3505 if (active)
3506 gtk_widget_show(mainwin->win.sep_both.folderwin);
3507 else
3508 gtk_widget_hide(mainwin->win.sep_both.folderwin);
3509 break;
3510 }
3511
3512 prefs_common.folderview_visible = active;
3513 }
3514
3515 static void toggle_message_cb(MainWindow *mainwin, guint action,
3516 GtkWidget *widget)
3517 {
3518 gboolean active;
3519
3520 active = GTK_CHECK_MENU_ITEM(widget)->active;
3521
3522 if (active != messageview_is_visible(mainwin->messageview))
3523 summary_toggle_view(mainwin->summaryview);
3524 }
3525
3526 static void toggle_toolbar_cb(MainWindow *mainwin, guint action,
3527 GtkWidget *widget)
3528 {
3529 mainwin->toolbar_style = (ToolbarStyle)action;
3530 prefs_common.toolbar_style = (ToolbarStyle)action;
3531
3532 main_window_set_toolbar_button_visibility(mainwin);
3533 }
3534
3535 static void toggle_searchbar_cb(MainWindow *mainwin, guint action,
3536 GtkWidget *widget)
3537 {
3538 if (GTK_CHECK_MENU_ITEM(widget)->active) {
3539 gtk_widget_show(mainwin->summaryview->qsearch->hbox);
3540 prefs_common.show_searchbar = TRUE;
3541 } else {
3542 gtk_widget_hide(mainwin->summaryview->qsearch->hbox);
3543 summary_qsearch_reset(mainwin->summaryview);
3544 prefs_common.show_searchbar = FALSE;
3545 }
3546 }
3547
3548 static void toggle_statusbar_cb(MainWindow *mainwin, guint action,
3549 GtkWidget *widget)
3550 {
3551 if (GTK_CHECK_MENU_ITEM(widget)->active) {
3552 gtk_widget_show(mainwin->statusbar);
3553 prefs_common.show_statusbar = TRUE;
3554 } else {
3555 gtk_widget_hide(mainwin->statusbar);
3556 prefs_common.show_statusbar = FALSE;
3557 }
3558 }
3559
3560 static void toolbar_customize_cb(MainWindow *mainwin, guint action,
3561 GtkWidget *widget)
3562 {
3563 toolbar_customize(widget, mainwin);
3564 }
3565
3566 static void change_layout_cb(MainWindow *mainwin, guint action,
3567 GtkWidget *widget)
3568 {
3569 LayoutType type = action;
3570
3571 if (GTK_CHECK_MENU_ITEM(widget)->active)
3572 main_window_change_layout(mainwin, type, mainwin->type);
3573 }
3574
3575 static void separate_widget_cb(MainWindow *mainwin, guint action,
3576 GtkWidget *widget)
3577 {
3578 SeparateType type;
3579
3580 if (GTK_CHECK_MENU_ITEM(widget)->active)
3581 type = mainwin->type | action;
3582 else
3583 type = mainwin->type & ~action;
3584
3585 main_window_change_layout(mainwin, prefs_common.layout_type, type);
3586
3587 prefs_common.sep_folder = (type & SEPARATE_FOLDER) != 0;
3588 prefs_common.sep_msg = (type & SEPARATE_MESSAGE) != 0;
3589 }
3590
3591 static void addressbook_open_cb(MainWindow *mainwin, guint action,
3592 GtkWidget *widget)
3593 {
3594 addressbook_open(NULL);
3595 }
3596
3597 static void log_window_show_cb(MainWindow *mainwin, guint action,
3598 GtkWidget *widget)
3599 {
3600 log_window_show(mainwin->logwin);
3601 }
3602
3603 static void inc_mail_cb(MainWindow *mainwin, guint action, GtkWidget *widget)
3604 {
3605 inc_mail(mainwin);
3606 }
3607
3608 static void inc_all_account_mail_cb(MainWindow *mainwin, guint action,
3609 GtkWidget *widget)
3610 {
3611 inc_all_account_mail(mainwin, FALSE);
3612 }
3613
3614 static void inc_stop_cb(MainWindow *mainwin, guint action, GtkWidget *widget)
3615 {
3616 inc_cancel_all();
3617 }
3618
3619 static void rpop3_cb(MainWindow *mainwin, guint action, GtkWidget *widget)
3620 {
3621 rpop3_account(cur_account);
3622 }
3623
3624 static void send_queue_cb(MainWindow *mainwin, guint action, GtkWidget *widget)
3625 {
3626 main_window_send_queue(mainwin);
3627 }
3628
3629 static void compose_cb(MainWindow *mainwin, guint action, GtkWidget *widget)
3630 {
3631 PrefsAccount *ac = NULL;
3632 FolderItem *item = mainwin->summaryview->folder_item;
3633
3634 if (item) {
3635 ac = account_find_from_item(item);
3636 if (ac && ac->protocol == A_NNTP &&
3637 FOLDER_TYPE(item->folder) == F_NEWS) {
3638 compose_new(ac, item, item->path, NULL);
3639 return;
3640 }
3641 }
3642
3643 compose_new(ac, item, NULL, NULL);
3644 }
3645
3646 static void reply_cb(MainWindow *mainwin, guint action, GtkWidget *widget)
3647 {
3648 summary_reply(mainwin->summaryview, (ComposeMode)action);
3649 }
3650
3651 static void move_to_cb(MainWindow *mainwin, guint action, GtkWidget *widget)
3652 {
3653 summary_move_to(mainwin->summaryview);
3654 }
3655
3656 static void copy_to_cb(MainWindow *mainwin, guint action, GtkWidget *widget)
3657 {
3658 summary_copy_to(mainwin->summaryview);
3659 }
3660
3661 static void delete_cb(MainWindow *mainwin, guint action, GtkWidget *widget)
3662 {
3663 summary_delete(mainwin->summaryview);
3664 }
3665
3666 static void open_msg_cb(MainWindow *mainwin, guint action, GtkWidget *widget)
3667 {
3668 summary_open_msg(mainwin->summaryview);
3669 }
3670
3671 static void view_source_cb(MainWindow *mainwin, guint action,
3672 GtkWidget *widget)
3673 {
3674 summary_view_source(mainwin->summaryview);
3675 }
3676
3677 static void show_all_header_cb(MainWindow *mainwin, guint action,
3678 GtkWidget *widget)
3679 {
3680 if (mainwin->menu_lock_count) return;
3681 summary_display_msg_selected(mainwin->summaryview, FALSE,
3682 GTK_CHECK_MENU_ITEM(widget)->active);
3683 }
3684
3685 static void mark_cb(MainWindow *mainwin, guint action, GtkWidget *widget)
3686 {
3687 summary_mark(mainwin->summaryview);
3688 }
3689
3690 static void unmark_cb(MainWindow *mainwin, guint action, GtkWidget *widget)
3691 {
3692 summary_unmark(mainwin->summaryview);
3693 }
3694
3695 static void mark_as_unread_cb(MainWindow *mainwin, guint action,
3696 GtkWidget *widget)
3697 {
3698 summary_mark_as_unread(mainwin->summaryview);
3699 }
3700
3701 static void mark_as_read_cb(MainWindow *mainwin, guint action,
3702 GtkWidget *widget)
3703 {
3704 summary_mark_as_read(mainwin->summaryview);
3705 }
3706
3707 static void mark_thread_as_read_cb(MainWindow *mainwin, guint action,
3708 GtkWidget *widget)
3709 {
3710 summary_mark_thread_as_read(mainwin->summaryview);
3711 }
3712
3713 static void mark_all_read_cb(MainWindow *mainwin, guint action,
3714 GtkWidget *widget)
3715 {
3716 summary_mark_all_read(mainwin->summaryview);
3717 }
3718
3719 static void junk_cb(MainWindow *mainwin, guint action, GtkWidget *widget)
3720 {
3721 if (action == 0)
3722 summary_junk(mainwin->summaryview);
3723 else
3724 summary_not_junk(mainwin->summaryview);
3725 }
3726
3727 static void reedit_cb(MainWindow *mainwin, guint action, GtkWidget *widget)
3728 {
3729 summary_reedit(mainwin->summaryview);
3730 }
3731
3732 static void add_address_cb(MainWindow *mainwin, guint action,
3733 GtkWidget *widget)
3734 {
3735 summary_add_address(mainwin->summaryview);
3736 }
3737
3738 static void set_charset_cb(MainWindow *mainwin, guint action,
3739 GtkWidget *widget)
3740 {
3741 const gchar *str;
3742
3743 if (GTK_CHECK_MENU_ITEM(widget)->active) {
3744 str = conv_get_charset_str((CharSet)action);
3745 g_free(prefs_common.force_charset);
3746 prefs_common.force_charset = str ? g_strdup(str) : NULL;
3747
3748 summary_redisplay_msg(mainwin->summaryview);
3749
3750 debug_print("forced charset: %s\n",
3751 str ? str : "Auto-Detect");
3752 }
3753 }
3754
3755 static void thread_cb(MainWindow *mainwin, guint action, GtkWidget *widget)
3756 {
3757 if (mainwin->menu_lock_count) return;
3758 if (!mainwin->summaryview->folder_item) return;
3759
3760 if (GTK_CHECK_MENU_ITEM(widget)->active)
3761 summary_thread_build(mainwin->summaryview);
3762 else
3763 summary_unthread(mainwin->summaryview);
3764 }
3765
3766 static void expand_threads_cb(MainWindow *mainwin, guint action,
3767 GtkWidget *widget)
3768 {
3769 summary_expand_threads(mainwin->summaryview);
3770 }
3771
3772 static void collapse_threads_cb(MainWindow *mainwin, guint action,
3773 GtkWidget *widget)
3774 {
3775 summary_collapse_threads(mainwin->summaryview);
3776 }
3777
3778 static void set_display_item_cb(MainWindow *mainwin, guint action,
3779 GtkWidget *widget)
3780 {
3781 prefs_summary_column_open
3782 (FOLDER_ITEM_IS_SENT_FOLDER(mainwin->summaryview->folder_item));
3783 }
3784
3785 static void sort_summary_cb(MainWindow *mainwin, guint action,
3786 GtkWidget *widget)
3787 {
3788 FolderItem *item = mainwin->summaryview->folder_item;
3789 GtkWidget *menuitem;
3790
3791 if (mainwin->menu_lock_count) return;
3792
3793 if (GTK_CHECK_MENU_ITEM(widget)->active && item) {
3794 menuitem = gtk_item_factory_get_item
3795 (mainwin->menu_factory, "/View/Sort/Ascending");
3796 summary_sort(mainwin->summaryview, (FolderSortKey)action,
3797 GTK_CHECK_MENU_ITEM(menuitem)->active
3798 ? SORT_ASCENDING : SORT_DESCENDING);
3799 }
3800 }
3801
3802 static void sort_summary_type_cb(MainWindow *mainwin, guint action,
3803 GtkWidget *widget)
3804 {
3805 FolderItem *item = mainwin->summaryview->folder_item;
3806
3807 if (mainwin->menu_lock_count) return;
3808
3809 if (GTK_CHECK_MENU_ITEM(widget)->active && item)
3810 summary_sort(mainwin->summaryview,
3811 item->sort_key, (FolderSortType)action);
3812 }
3813
3814 static void attract_by_subject_cb(MainWindow *mainwin, guint action,
3815 GtkWidget *widget)
3816 {
3817 summary_attract_by_subject(mainwin->summaryview);
3818 }
3819
3820 static void delete_duplicated_cb(MainWindow *mainwin, guint action,
3821 GtkWidget *widget)
3822 {
3823 summary_delete_duplicated(mainwin->summaryview);
3824 }
3825
3826 static void concat_partial_cb(MainWindow *mainwin, guint action,
3827 GtkWidget *widget)
3828 {
3829 GSList *mlist;
3830 gchar *file;
3831 FolderItem *item;
3832
3833 if (summary_is_locked(mainwin->summaryview))
3834 return;
3835
3836 item = mainwin->summaryview->folder_item;
3837 if (!item)
3838 return;
3839 mlist = summary_get_selected_msg_list(mainwin->summaryview);
3840 if (!mlist)
3841 return;
3842
3843 file = get_tmp_file();
3844 if (procmsg_concat_partial_messages(mlist, file) == 0) {
3845 folder_item_add_msg(item, file, NULL, TRUE);
3846 summary_show_queued_msgs(mainwin->summaryview);
3847 } else {
3848 alertpanel_error
3849 (_("The selected messages could not be combined."));
3850 }
3851 g_free(file);
3852
3853 g_slist_free(mlist);
3854 }
3855
3856 static void filter_cb(MainWindow *mainwin, guint action, GtkWidget *widget)
3857 {
3858 summary_filter(mainwin->summaryview, (gboolean)action);
3859 }
3860
3861 static void filter_junk_cb(MainWindow *mainwin, guint action, GtkWidget *widget)
3862 {
3863 summary_filter_junk(mainwin->summaryview, (gboolean)action);
3864 }
3865
3866 static void execute_summary_cb(MainWindow *mainwin, guint action,
3867 GtkWidget *widget)
3868 {
3869 summary_execute(mainwin->summaryview);
3870 }
3871
3872 static void update_summary_cb(MainWindow *mainwin, guint action,
3873 GtkWidget *widget)
3874 {
3875 if (!mainwin->summaryview->folder_item) return;
3876
3877 summary_show(mainwin->summaryview, mainwin->summaryview->folder_item,
3878 TRUE);
3879 }
3880
3881 static void open_config_folder_cb(MainWindow *mainwin, guint action,
3882 GtkWidget *widget)
3883 {
3884 execute_open_file(get_rc_dir(), NULL);
3885 }
3886
3887 static void open_attachments_folder_cb(MainWindow *mainwin, guint action,
3888 GtkWidget *widget)
3889 {
3890 execute_open_file(get_mime_tmp_dir(), NULL);
3891 }
3892
3893 static void prev_cb(MainWindow *mainwin, guint action, GtkWidget *widget)
3894 {
3895 MessageView *messageview = mainwin->messageview;
3896
3897 if (messageview_get_selected_mime_part(messageview) &&
3898 GTK_WIDGET_HAS_FOCUS(messageview->mimeview->treeview) &&
3899 mimeview_step(messageview->mimeview, GTK_SCROLL_STEP_BACKWARD))
3900 return;
3901
3902 if (summary_step(mainwin->summaryview, GTK_SCROLL_STEP_BACKWARD))
3903 summary_mark_displayed_read(mainwin->summaryview, NULL);
3904 }
3905
3906 static void next_cb(MainWindow *mainwin, guint action, GtkWidget *widget)
3907 {
3908 MessageView *messageview = mainwin->messageview;
3909
3910 if (messageview_get_selected_mime_part(messageview) &&
3911 GTK_WIDGET_HAS_FOCUS(messageview->mimeview->treeview) &&
3912 mimeview_step(messageview->mimeview, GTK_SCROLL_STEP_FORWARD))
3913 return;
3914
3915 if (summary_step(mainwin->summaryview, GTK_SCROLL_STEP_FORWARD))
3916 summary_mark_displayed_read(mainwin->summaryview, NULL);
3917 }
3918
3919 static void prev_unread_cb(MainWindow *mainwin, guint action,
3920 GtkWidget *widget)
3921 {
3922 summary_select_prev_unread(mainwin->summaryview);
3923 }
3924
3925 static void next_unread_cb(MainWindow *mainwin, guint action,
3926 GtkWidget *widget)
3927 {
3928 summary_select_next_unread(mainwin->summaryview);
3929 }
3930
3931 static void prev_new_cb(MainWindow *mainwin, guint action, GtkWidget *widget)
3932 {
3933 summary_select_prev_new(mainwin->summaryview);
3934 }
3935
3936 static void next_new_cb(MainWindow *mainwin, guint action, GtkWidget *widget)
3937 {
3938 summary_select_next_new(mainwin->summaryview);
3939 }
3940
3941 static void prev_marked_cb(MainWindow *mainwin, guint action,
3942 GtkWidget *widget)
3943 {
3944 summary_select_prev_marked(mainwin->summaryview);
3945 }
3946
3947 static void next_marked_cb(MainWindow *mainwin, guint action,
3948 GtkWidget *widget)
3949 {
3950 summary_select_next_marked(mainwin->summaryview);
3951 }
3952
3953 static void prev_labeled_cb(MainWindow *mainwin, guint action,
3954 GtkWidget *widget)
3955 {
3956 summary_select_prev_labeled(mainwin->summaryview);
3957 }
3958
3959 static void next_labeled_cb(MainWindow *mainwin, guint action,
3960 GtkWidget *widget)
3961 {
3962 summary_select_next_labeled(mainwin->summaryview);
3963 }
3964
3965 static void goto_folder_cb(MainWindow *mainwin, guint action,
3966 GtkWidget *widget)
3967 {
3968 FolderItem *to_folder;
3969
3970 to_folder = foldersel_folder_sel_full(NULL, FOLDER_SEL_ALL, NULL,
3971 _("Select folder to open"));
3972
3973 if (to_folder)
3974 folderview_select(mainwin->folderview, to_folder);
3975 }
3976
3977 static void copy_cb(MainWindow *mainwin, guint action, GtkWidget *widget)
3978 {
3979 messageview_copy_clipboard(mainwin->messageview);
3980 }
3981
3982 static void allsel_cb(MainWindow *mainwin, guint action, GtkWidget *widget)
3983 {
3984 MessageView *msgview = mainwin->messageview;
3985
3986 if (GTK_WIDGET_HAS_FOCUS(mainwin->summaryview->treeview))
3987 summary_select_all(mainwin->summaryview);
3988 else if (GTK_WIDGET_HAS_FOCUS(mainwin->summaryview->qsearch->entry))
3989 gtk_editable_select_region
3990 (GTK_EDITABLE(mainwin->summaryview->qsearch->entry),
3991 0, -1);
3992 else if (messageview_is_visible(msgview) &&
3993 (GTK_WIDGET_HAS_FOCUS(msgview->textview->text) ||
3994 GTK_WIDGET_HAS_FOCUS(msgview->mimeview->textview->text)))
3995 messageview_select_all(msgview);
3996 }
3997
3998 static void select_thread_cb(MainWindow *mainwin, guint action,
3999 GtkWidget *widget)
4000 {
4001 summary_select_thread(mainwin->summaryview);
4002 }
4003
4004 static void create_filter_cb(MainWindow *mainwin, guint action,
4005 GtkWidget *widget)
4006 {
4007 summary_filter_open(mainwin->summaryview, (FilterCreateType)action);
4008 }
4009
4010 static void prefs_common_open_cb(MainWindow *mainwin, guint action,
4011 GtkWidget *widget)
4012 {
4013 prefs_common_open();
4014 }
4015
4016 static void prefs_filter_open_cb(MainWindow *mainwin, guint action,
4017 GtkWidget *widget)
4018 {
4019 prefs_filter_open(NULL, NULL, NULL);
4020 }
4021
4022 static void prefs_template_open_cb(MainWindow *mainwin, guint action,
4023 GtkWidget *widget)
4024 {
4025 prefs_template_open();
4026 }
4027
4028 static void plugin_manager_open_cb(MainWindow *mainwin, guint action,
4029 GtkWidget *widget)
4030 {
4031 plugin_manager_open();
4032 }
4033
4034 #ifndef G_OS_WIN32
4035 static void prefs_actions_open_cb(MainWindow *mainwin, guint action,
4036 GtkWidget *widget)
4037 {
4038 prefs_actions_open(mainwin);
4039 }
4040 #endif
4041
4042 static void prefs_account_open_cb(MainWindow *mainwin, guint action,
4043 GtkWidget *widget)
4044 {
4045 if (!cur_account) {
4046 new_account_cb(mainwin, 0, widget);
4047 } else {
4048 account_open(cur_account);
4049 }
4050 }
4051
4052 static void new_account_cb(MainWindow *mainwin, guint action,
4053 GtkWidget *widget)
4054 {
4055 PrefsAccount *ac;
4056
4057 if (compose_get_compose_list()) {
4058 alertpanel_notice(_("Some composing windows are open.\n"
4059 "Please close all the composing windows before editing the accounts."));
4060 return;
4061 }
4062
4063 if ((ac = setup_account())) {
4064 account_set_menu();
4065 main_window_reflect_prefs_all();
4066 account_set_missing_folder();
4067 folderview_set(mainwin->folderview);
4068 if (ac->folder)
4069 folder_write_list();
4070 }
4071 }
4072
4073 static void account_selector_menu_cb(GtkMenuItem *menuitem, gpointer data)
4074 {
4075 cur_account = (PrefsAccount *)data;
4076 main_window_change_cur_account();
4077 }
4078
4079 static void account_receive_menu_cb(GtkMenuItem *menuitem, gpointer data)
4080 {
4081 PrefsAccount *account = (PrefsAccount *)data;
4082
4083 inc_account_mail(main_window_get(), account);
4084 }
4085
4086 static void manual_open_cb(MainWindow *mainwin, guint action,
4087 GtkWidget *widget)
4088 {
4089 manual_open((ManualLang)action);
4090 }
4091
4092 static void faq_open_cb(MainWindow *mainwin, guint action, GtkWidget *widget)
4093 {
4094 faq_open((ManualLang)action);
4095 }
4096
4097 static GtkWidget *help_cmdline_window;
4098
4099 static void help_cmdline_ok(GtkWidget *button)
4100 {
4101 gtk_widget_destroy(gtk_widget_get_toplevel(button));
4102 }
4103
4104 static gboolean help_cmdline_key_pressed(GtkWidget *widget, GdkEventKey *event,
4105 gpointer data)
4106 {
4107 if (event && event->keyval == GDK_Escape) {
4108 gtk_widget_destroy(widget);
4109 return TRUE;
4110 }
4111 return FALSE;
4112 }
4113
4114 static gboolean help_cmdline_deleted(GtkWidget *widget, GdkEventAny *event,
4115 gpointer data)
4116 {
4117 return FALSE;
4118 }
4119
4120 static void help_cmdline_destroyed(GtkWidget *widget, gpointer data)
4121 {
4122 help_cmdline_window = NULL;
4123 }
4124
4125 static void help_command_line_show(void)
4126 {
4127 GtkWidget *window;
4128 GtkWidget *vbox;
4129 GtkWidget *vbox2;
4130 GtkWidget *hbox;
4131 GtkWidget *label;
4132 GtkWidget *hbbox;
4133 GtkWidget *ok_btn;
4134
4135 if (help_cmdline_window) {
4136 gtk_window_present(GTK_WINDOW(help_cmdline_window));
4137 return;
4138 }
4139
4140 window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
4141 gtk_window_set_title(GTK_WINDOW(window), _("Command line options"));
4142 gtk_container_set_border_width(GTK_CONTAINER(window), 8);
4143 gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);
4144 gtk_window_set_policy(GTK_WINDOW(window), FALSE, FALSE, FALSE);
4145 help_cmdline_window = window;
4146
4147 vbox = gtk_vbox_new(FALSE, 8);
4148 gtk_container_add(GTK_CONTAINER(window), vbox);
4149
4150 vbox2 = gtk_vbox_new(FALSE, 8);
4151 gtk_container_set_border_width(GTK_CONTAINER(vbox2), 8);
4152 gtk_box_pack_start(GTK_BOX(vbox), vbox2, FALSE, FALSE, 0);
4153
4154 label = gtk_label_new(_("Usage: sylpheed [OPTION]..."));
4155 gtk_box_pack_start(GTK_BOX(vbox2), label, FALSE, FALSE, 0);
4156 gtk_label_set_justify(GTK_LABEL(label), GTK_JUSTIFY_LEFT);
4157 gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5);
4158
4159 hbox = gtk_hbox_new(FALSE, 16);
4160 gtk_box_pack_start(GTK_BOX(vbox2), hbox, FALSE, FALSE, 0);
4161
4162 label = gtk_label_new(_("--compose [address]\n"
4163 "--attach file1 [file2]...\n"
4164 "--receive\n"
4165 "--receive-all\n"
4166 "--send\n"
4167 "--status [folder]...\n"
4168 "--status-full [folder]...\n"
4169 "--open folderid/msgnum\n"
4170 "--open <file URL>\n"
4171 "--configdir dirname\n"
4172 "--exit\n"
4173 "--debug\n"
4174 "--safe-mode\n"
4175 "--help\n"
4176 "--version"));
4177 gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0);
4178 gtk_label_set_justify(GTK_LABEL(label), GTK_JUSTIFY_LEFT);
4179 gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5);
4180
4181 label = gtk_label_new(_("open composition window\n"
4182 "open composition window with specified files attached\n"
4183 "receive new messages\n"
4184 "receive new messages of all accounts\n"
4185 "send all queued messages\n"
4186 "show the total number of messages\n"
4187 "show the status of each folder\n"
4188 "open message in new window\n"
4189 "open an rfc822 message file in a new window\n"
4190 "specify directory which stores configuration files\n"
4191 "exit Sylpheed\n"
4192 "debug mode\n"
4193 "safe mode\n"
4194 "display this help and exit\n"
4195 "output version information and exit"));
4196 gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0);
4197 gtk_label_set_justify(GTK_LABEL(label), GTK_JUSTIFY_LEFT);
4198 gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5);
4199
4200 #ifdef G_OS_WIN32
4201 label = gtk_label_new(_("Windows-only option:"));
4202 gtk_box_pack_start(GTK_BOX(vbox2), label, FALSE, FALSE, 0);
4203 gtk_label_set_justify(GTK_LABEL(label), GTK_JUSTIFY_LEFT);
4204 gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5);
4205
4206 hbox = gtk_hbox_new(FALSE, 32);
4207 gtk_box_pack_start(GTK_BOX(vbox2), hbox, FALSE, FALSE, 0);
4208
4209 label = gtk_label_new(_("--ipcport portnum"));
4210 gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0);
4211 gtk_label_set_justify(GTK_LABEL(label), GTK_JUSTIFY_LEFT);
4212 gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5);
4213
4214 label = gtk_label_new(_("specify port for IPC remote commands"));
4215 gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0);
4216 gtk_label_set_justify(GTK_LABEL(label), GTK_JUSTIFY_LEFT);
4217 gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5);
4218 #endif
4219
4220 gtkut_stock_button_set_create(&hbbox, &ok_btn, GTK_STOCK_OK,
4221 NULL, NULL, NULL, NULL);
4222 gtk_box_pack_end(GTK_BOX(vbox), hbbox, FALSE, FALSE, 0);
4223 gtk_widget_grab_default(ok_btn);
4224
4225 g_signal_connect(G_OBJECT(ok_btn), "clicked",
4226 G_CALLBACK(help_cmdline_ok), NULL);
4227 g_signal_connect(G_OBJECT(window), "key_press_event",
4228 G_CALLBACK(help_cmdline_key_pressed), NULL);
4229 g_signal_connect(G_OBJECT(window), "delete_event",
4230 G_CALLBACK(help_cmdline_deleted), NULL);
4231 g_signal_connect(G_OBJECT(window), "destroy",
4232 G_CALLBACK(help_cmdline_destroyed), NULL);
4233
4234 gtk_widget_show_all(window);
4235 }
4236
4237 static void help_cmdline_cb(MainWindow *mainwin, guint action,
4238 GtkWidget *widget)
4239 {
4240 help_command_line_show();
4241 }
4242
4243 #if USE_UPDATE_CHECK
4244 static void update_check_cb(MainWindow *mainwin, guint action,
4245 GtkWidget *widget)
4246 {
4247 update_check(TRUE);
4248 }
4249
4250 #ifdef USE_UPDATE_CHECK_PLUGIN
4251 static void update_check_plugin_cb(MainWindow *mainwin, guint action,
4252 GtkWidget *widget)
4253 {
4254 update_check_plugin(TRUE);
4255 }
4256 #endif
4257 #endif
4258
4259 static void scan_tree_func(Folder *folder, FolderItem *item, gpointer data)
4260 {
4261 MainWindow *mainwin = (MainWindow *)data;
4262 gchar *str;
4263
4264 if (item->path)
4265 str = g_strdup_printf(_("Scanning folder %s%c%s ..."),
4266 LOCAL_FOLDER(folder)->rootpath,
4267 G_DIR_SEPARATOR,
4268 item->path);
4269 else
4270 str = g_strdup_printf(_("Scanning folder %s ..."),
4271 LOCAL_FOLDER(folder)->rootpath);
4272
4273 STATUSBAR_PUSH(mainwin, str);
4274 STATUSBAR_POP(mainwin);
4275 g_free(str);
4276 }
4277