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.
This commit is contained in:
Christian Dywan 2009-01-20 22:17:04 +01:00
parent a81405dcf0
commit 92fd37ad61
3 changed files with 62 additions and 10 deletions

View file

@ -64,6 +64,13 @@ page_holder_button_add_clicked_cb (GtkWidget* button,
midori_view_set_uri (MIDORI_VIEW (view), uri); midori_view_set_uri (MIDORI_VIEW (view), uri);
} }
static void
page_holder_deactivate_cb (MidoriExtension* extension,
GtkWidget* notebook)
{
gtk_widget_destroy (notebook);
}
static void static void
page_holder_app_add_browser_cb (MidoriApp* app, page_holder_app_add_browser_cb (MidoriApp* app,
MidoriBrowser* browser, MidoriBrowser* browser,
@ -107,6 +114,8 @@ page_holder_app_add_browser_cb (MidoriApp* app,
midori_panel_append_widget (MIDORI_PANEL (panel), notebook, midori_panel_append_widget (MIDORI_PANEL (panel), notebook,
/* i18n: A panel showing a user specified web page */ /* i18n: A panel showing a user specified web page */
STOCK_PAGE_HOLDER, _("Pageholder"), toolbar); STOCK_PAGE_HOLDER, _("Pageholder"), toolbar);
g_signal_connect (extension, "deactivate",
G_CALLBACK (page_holder_deactivate_cb), notebook);
} }
static void static void

View file

@ -3477,7 +3477,9 @@ midori_browser_size_allocate_cb (MidoriBrowser* browser,
static void static void
midori_browser_destroy_cb (MidoriBrowser* browser) 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), gtk_container_foreach (GTK_CONTAINER (browser->notebook),
(GtkCallback) gtk_widget_destroy, NULL); (GtkCallback) gtk_widget_destroy, NULL);
} }

View file

@ -157,6 +157,14 @@ midori_panel_button_close_clicked_cb (GtkWidget* toolitem,
g_signal_emit (panel, signals[CLOSE], 0, &return_value); 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 static void
midori_panel_init (MidoriPanel* panel) midori_panel_init (MidoriPanel* panel)
{ {
@ -215,18 +223,14 @@ midori_panel_init (MidoriPanel* panel)
gtk_container_add (GTK_CONTAINER (panel->frame), panel->notebook); gtk_container_add (GTK_CONTAINER (panel->frame), panel->notebook);
gtk_box_pack_start (GTK_BOX (vbox), panel->frame, TRUE, TRUE, 0); gtk_box_pack_start (GTK_BOX (vbox), panel->frame, TRUE, TRUE, 0);
gtk_widget_show_all (panel->frame); gtk_widget_show_all (panel->frame);
g_signal_connect (panel, "destroy",
G_CALLBACK (midori_panel_destroy_cb), NULL);
} }
static void static void
midori_panel_finalize (GObject* object) 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); 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: * midori_panel_append_page:
* @panel: a #MidoriPanel * @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 * Appends a new page to the panel. If @toolbar is specified it will
* be packed above @viewable. * 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. * In the case of an error, -1 is returned.
* *
* Return value: the index of the new page, or -1 * 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); toolbar = midori_viewable_get_toolbar (viewable);
gtk_widget_show (toolbar); gtk_widget_show (toolbar);
gtk_container_add (GTK_CONTAINER (panel->toolbook), 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); n = midori_panel_page_num (panel, scrolled);
label = midori_viewable_get_label (viewable); 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); G_CALLBACK (midori_panel_menu_item_activate_cb), panel);
gtk_widget_show_all (GTK_WIDGET (toolitem)); gtk_widget_show_all (GTK_WIDGET (toolitem));
gtk_toolbar_insert (GTK_TOOLBAR (panel->toolbar), toolitem, -1); 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) if (panel->menu)
{ {
@ -432,8 +463,13 @@ midori_panel_append_page (MidoriPanel* panel,
G_CALLBACK (midori_panel_menu_item_activate_cb), G_CALLBACK (midori_panel_menu_item_activate_cb),
panel); panel);
gtk_menu_shell_append (GTK_MENU_SHELL (panel->menu), menuitem); 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; return n;
} }
@ -669,8 +705,8 @@ midori_dummy_viewable_finalize (GObject* object)
static GtkWidget* static GtkWidget*
midori_dummy_viewable_new (const gchar* stock_id, midori_dummy_viewable_new (const gchar* stock_id,
const gchar* label, const gchar* label,
GtkWidget* toolbar) GtkWidget* toolbar)
{ {
GtkWidget* viewable = g_object_new (MIDORI_TYPE_DUMMY_VIEWABLE, NULL); 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 * Actually implementing #MidoriViewable instead of using
* this convenience is recommended. * 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. * In the case of an error, -1 is returned.
* *
* Return value: the index of the new page, or -1 * 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); viewable = midori_dummy_viewable_new (stock_id, label, toolbar);
gtk_widget_show (viewable); gtk_widget_show (viewable);
gtk_container_add (GTK_CONTAINER (viewable), widget); 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)); return midori_panel_append_page (panel, MIDORI_VIEWABLE (viewable));
} }