From 92fd37ad613d1abd7038d76f38d3c6abfba5a3bf Mon Sep 17 00:00:00 2001 From: Christian Dywan Date: Tue, 20 Jan 2009 22:17:04 +0100 Subject: [PATCH] Remove panel pages implicitly as viewables are destroyed For this to work smoothly, from now on the browser destroys the panel eary, as it does with the tabs, and the panel in turn destroys its pages early. --- extensions/page-holder.c | 9 ++++++ midori/midori-browser.c | 4 ++- midori/midori-panel.c | 59 ++++++++++++++++++++++++++++++++++------ 3 files changed, 62 insertions(+), 10 deletions(-) diff --git a/extensions/page-holder.c b/extensions/page-holder.c index b396b059..2902b78a 100644 --- a/extensions/page-holder.c +++ b/extensions/page-holder.c @@ -64,6 +64,13 @@ page_holder_button_add_clicked_cb (GtkWidget* button, midori_view_set_uri (MIDORI_VIEW (view), uri); } +static void +page_holder_deactivate_cb (MidoriExtension* extension, + GtkWidget* notebook) +{ + gtk_widget_destroy (notebook); +} + static void page_holder_app_add_browser_cb (MidoriApp* app, MidoriBrowser* browser, @@ -107,6 +114,8 @@ page_holder_app_add_browser_cb (MidoriApp* app, midori_panel_append_widget (MIDORI_PANEL (panel), notebook, /* i18n: A panel showing a user specified web page */ STOCK_PAGE_HOLDER, _("Pageholder"), toolbar); + g_signal_connect (extension, "deactivate", + G_CALLBACK (page_holder_deactivate_cb), notebook); } static void diff --git a/midori/midori-browser.c b/midori/midori-browser.c index b19813cb..e8c215e6 100644 --- a/midori/midori-browser.c +++ b/midori/midori-browser.c @@ -3477,7 +3477,9 @@ midori_browser_size_allocate_cb (MidoriBrowser* browser, static void midori_browser_destroy_cb (MidoriBrowser* browser) { - /* Destroy tabs first, so child widgets don't need special care */ + /* Destroy panel first, so panels don't need special care */ + gtk_widget_destroy (browser->panel); + /* Destroy tabs second, so child widgets don't need special care */ gtk_container_foreach (GTK_CONTAINER (browser->notebook), (GtkCallback) gtk_widget_destroy, NULL); } diff --git a/midori/midori-panel.c b/midori/midori-panel.c index de821617..59dd78b7 100644 --- a/midori/midori-panel.c +++ b/midori/midori-panel.c @@ -157,6 +157,14 @@ midori_panel_button_close_clicked_cb (GtkWidget* toolitem, g_signal_emit (panel, signals[CLOSE], 0, &return_value); } +static void +midori_panel_destroy_cb (MidoriPanel* panel) +{ + /* Destroy pages first, so they don't need special care */ + gtk_container_foreach (GTK_CONTAINER (panel->notebook), + (GtkCallback) gtk_widget_destroy, NULL); +} + static void midori_panel_init (MidoriPanel* panel) { @@ -215,18 +223,14 @@ midori_panel_init (MidoriPanel* panel) gtk_container_add (GTK_CONTAINER (panel->frame), panel->notebook); gtk_box_pack_start (GTK_BOX (vbox), panel->frame, TRUE, TRUE, 0); gtk_widget_show_all (panel->frame); + + g_signal_connect (panel, "destroy", + G_CALLBACK (midori_panel_destroy_cb), NULL); } static void midori_panel_finalize (GObject* object) { - MidoriPanel* panel = MIDORI_PANEL (object); - - if (panel->menu) - { - /* FIXME: Remove all menu items */ - } - G_OBJECT_CLASS (midori_panel_parent_class)->finalize (object); } @@ -342,6 +346,26 @@ midori_panel_menu_item_activate_cb (GtkWidget* widget, } } +static void +midori_panel_viewable_destroy_cb (GtkWidget* viewable, + MidoriPanel* panel) +{ + gint i = gtk_notebook_page_num (GTK_NOTEBOOK (panel->notebook), viewable); + if (i > -1) + gtk_notebook_remove_page (GTK_NOTEBOOK (panel->notebook), i); + g_signal_handlers_disconnect_by_func ( + viewable, midori_panel_viewable_destroy_cb, panel); +} + +static void +midori_panel_widget_destroy_cb (GtkWidget* viewable, + GtkWidget* widget) +{ + gtk_widget_destroy (widget); + g_signal_handlers_disconnect_by_func ( + viewable, midori_panel_widget_destroy_cb, widget); +} + /** * midori_panel_append_page: * @panel: a #MidoriPanel @@ -353,6 +377,9 @@ midori_panel_menu_item_activate_cb (GtkWidget* widget, * Appends a new page to the panel. If @toolbar is specified it will * be packed above @viewable. * + * Since 0.1.3 destroying the @viewable implicitly removes + * the page including the menu and eventual toolbar. + * * In the case of an error, -1 is returned. * * Return value: the index of the new page, or -1 @@ -401,6 +428,8 @@ midori_panel_append_page (MidoriPanel* panel, toolbar = midori_viewable_get_toolbar (viewable); gtk_widget_show (toolbar); gtk_container_add (GTK_CONTAINER (panel->toolbook), toolbar); + g_signal_connect (viewable, "destroy", + G_CALLBACK (midori_panel_widget_destroy_cb), toolbar); n = midori_panel_page_num (panel, scrolled); label = midori_viewable_get_label (viewable); @@ -421,6 +450,8 @@ midori_panel_append_page (MidoriPanel* panel, G_CALLBACK (midori_panel_menu_item_activate_cb), panel); gtk_widget_show_all (GTK_WIDGET (toolitem)); gtk_toolbar_insert (GTK_TOOLBAR (panel->toolbar), toolitem, -1); + g_signal_connect (viewable, "destroy", + G_CALLBACK (midori_panel_widget_destroy_cb), toolitem); if (panel->menu) { @@ -432,8 +463,13 @@ midori_panel_append_page (MidoriPanel* panel, G_CALLBACK (midori_panel_menu_item_activate_cb), panel); gtk_menu_shell_append (GTK_MENU_SHELL (panel->menu), menuitem); + g_signal_connect (viewable, "destroy", + G_CALLBACK (midori_panel_widget_destroy_cb), menuitem); } + g_signal_connect (viewable, "destroy", + G_CALLBACK (midori_panel_viewable_destroy_cb), panel); + return n; } @@ -669,8 +705,8 @@ midori_dummy_viewable_finalize (GObject* object) static GtkWidget* midori_dummy_viewable_new (const gchar* stock_id, - const gchar* label, - GtkWidget* toolbar) + const gchar* label, + GtkWidget* toolbar) { GtkWidget* viewable = g_object_new (MIDORI_TYPE_DUMMY_VIEWABLE, NULL); @@ -695,6 +731,9 @@ midori_dummy_viewable_new (const gchar* stock_id, * Actually implementing #MidoriViewable instead of using * this convenience is recommended. * + * Since 0.1.3 destroying the @widget implicitly removes + * the page including the menu and eventual toolbar. + * * In the case of an error, -1 is returned. * * Return value: the index of the new page, or -1 @@ -717,5 +756,7 @@ midori_panel_append_widget (MidoriPanel* panel, viewable = midori_dummy_viewable_new (stock_id, label, toolbar); gtk_widget_show (viewable); gtk_container_add (GTK_CONTAINER (viewable), widget); + g_signal_connect (widget, "destroy", + G_CALLBACK (midori_panel_widget_destroy_cb), viewable); return midori_panel_append_page (panel, MIDORI_VIEWABLE (viewable)); }