diff options
author | Christian Persch <chpe@cvs.gnome.org> | 2005-10-03 02:50:51 +0800 |
---|---|---|
committer | Christian Persch <chpe@src.gnome.org> | 2005-10-03 02:50:51 +0800 |
commit | abe1a40d562514cfe6b3c8dae1397d511062ddab (patch) | |
tree | 08fb5018af362336c9b92f0e1d83d25c2bd3b2b8 /src/window-commands.c | |
parent | 8a92076ee578e5c6aa8bb0a39fcdbe8741ce2e52 (diff) | |
download | gsoc2013-epiphany-abe1a40d562514cfe6b3c8dae1397d511062ddab.tar.gz gsoc2013-epiphany-abe1a40d562514cfe6b3c8dae1397d511062ddab.tar.zst gsoc2013-epiphany-abe1a40d562514cfe6b3c8dae1397d511062ddab.zip |
Use nsIDOMWindowInternal::Close to close tabs. Delay tabs destruction to
2005-10-02 Christian Persch <chpe@cvs.gnome.org>
* configure.ac:
* embed/ephy-embed-shell.c: (ephy_embed_shell_dispose),
(ephy_embed_shell_finalize), (ephy_embed_shell_class_init):
* embed/ephy-embed.c: (ephy_embed_base_init),
(ephy_embed_show_page_certificate), (ephy_embed_close):
* embed/ephy-embed.h:
* embed/mozilla/EphyBrowser.cpp:
* embed/mozilla/EphyBrowser.h:
* embed/mozilla/mozilla-embed.cpp:
* src/ephy-notebook.c: (ephy_notebook_class_init),
(close_button_clicked_cb):
* src/ephy-notebook.h:
* src/ephy-python.c: (ephy_python_init), (ephy_python_shutdown),
(ephy_python_schedule_gc):
* src/ephy-shell.c: (ephy_shell_class_init), (gnome_session_init),
(ephy_shell_dispose), (ephy_shell_finalize):
* src/ephy-tab.c: (ephy_tab_init):
* src/ephy-window.c: (construct_confirm_close_dialog),
(confirm_close_with_modified_forms), (embed_modal_alert_cb),
(idle_tab_remove_cb), (schedule_tab_close),
(embed_close_request_cb), (embed_destroy_browser_cb),
(tab_added_cb), (tab_removed_cb), (tab_close_request_cb),
(setup_notebook), (remove_true), (ephy_window_dispose),
(cancel_handler), (ephy_window_init), (ephy_window_finalize):
* src/window-commands.c: (event_with_shift),
(window_cmd_view_reload), (window_cmd_file_close_window):
Use nsIDOMWindowInternal::Close to close tabs. Delay tabs destruction
to an idle handler, to avoid crashes when tabs are closed from signal
handlers (blur, mousedown, keydown etc).
Fixes bug #172878, bug #172879, bug #172882, bug #303254, bug #313425.
Diffstat (limited to 'src/window-commands.c')
-rw-r--r-- | src/window-commands.c | 63 |
1 files changed, 32 insertions, 31 deletions
diff --git a/src/window-commands.c b/src/window-commands.c index 6e119d327..79659dba9 100644 --- a/src/window-commands.c +++ b/src/window-commands.c @@ -165,6 +165,33 @@ window_cmd_go_forward (GtkAction *action, ephy_embed_go_forward (embed); } +static gboolean +event_with_shift (void) +{ + GdkEvent *event; + GdkEventType type = 0; + guint state = 0; + + event = gtk_get_current_event (); + if (event) + { + type = event->type; + + if (type == GDK_BUTTON_RELEASE) + { + state = event->button.state; + } + else if (type == GDK_KEY_PRESS || type == GDK_KEY_RELEASE) + { + state = event->key.state; + } + + gdk_event_free (event); + } + + return (state & GDK_SHIFT_MASK) != 0; +} + void window_cmd_go_location (GtkAction *action, EphyWindow *window) @@ -191,39 +218,13 @@ window_cmd_view_reload (GtkAction *action, EphyWindow *window) { EphyEmbed *embed; - GdkEvent *event; - GdkEventType type; - guint state = 0; - gboolean force = FALSE; embed = ephy_window_get_active_embed (window); g_return_if_fail (embed != NULL); - event = gtk_get_current_event (); - if (event) - { - type = event->type; - - if (type == GDK_BUTTON_RELEASE) - { - state = event->button.state; - } - else if (type == GDK_KEY_RELEASE) - { - state = event->key.state; - } - - gdk_event_free (event); - } - - if (state & GDK_SHIFT_MASK) - { - force = TRUE; - } - gtk_widget_grab_focus (GTK_WIDGET (embed)); - ephy_embed_reload (embed, force); + ephy_embed_reload (embed, event_with_shift ()); } void @@ -387,7 +388,7 @@ void window_cmd_file_close_window (GtkAction *action, EphyWindow *window) { - EphyTab *tab; + EphyEmbed *embed; if (eel_gconf_get_boolean (CONF_LOCKDOWN_DISABLE_QUIT) && gtk_notebook_get_n_pages (GTK_NOTEBOOK (ephy_window_get_notebook (window))) == 1) @@ -395,10 +396,10 @@ window_cmd_file_close_window (GtkAction *action, return; } - tab = ephy_window_get_active_tab (window); - g_return_if_fail (tab != NULL); + embed = ephy_window_get_active_embed (window); + g_return_if_fail (embed != NULL); - ephy_window_remove_tab (window, tab); + ephy_embed_close (embed); } void |