aboutsummaryrefslogtreecommitdiffstats
path: root/src/window-commands.c
diff options
context:
space:
mode:
authorChristian Persch <chpe@cvs.gnome.org>2005-10-03 02:50:51 +0800
committerChristian Persch <chpe@src.gnome.org>2005-10-03 02:50:51 +0800
commitabe1a40d562514cfe6b3c8dae1397d511062ddab (patch)
tree08fb5018af362336c9b92f0e1d83d25c2bd3b2b8 /src/window-commands.c
parent8a92076ee578e5c6aa8bb0a39fcdbe8741ce2e52 (diff)
downloadgsoc2013-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.c63
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