[gnome-builder] layout: remove sidebar when view is closed
- From: Christian Hergert <chergert src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-builder] layout: remove sidebar when view is closed
- Date: Tue, 25 Jul 2017 00:26:08 +0000 (UTC)
commit 479f21703d94de0236216ca53dc8b819be063804
Author: Christian Hergert <chergert redhat com>
Date: Mon Jul 24 17:25:54 2017 -0700
layout: remove sidebar when view is closed
Previously, if the view is closed, and it is the last view, we would end
up not closing the sidebar because the view focus would be NULL, and we
could still have a temporarily "leaked" view.
This watches for destroy so we can clean things up.
libide/layout/ide-layout-transient-sidebar.c | 44 +++++++++++++++++++++++++-
1 files changed, 43 insertions(+), 1 deletions(-)
---
diff --git a/libide/layout/ide-layout-transient-sidebar.c b/libide/layout/ide-layout-transient-sidebar.c
index e1b2da8..d2bc3f7 100644
--- a/libide/layout/ide-layout-transient-sidebar.c
+++ b/libide/layout/ide-layout-transient-sidebar.c
@@ -28,6 +28,9 @@ typedef struct
GWeakRef view_ref;
} IdeLayoutTransientSidebarPrivate;
+static void ide_layout_transient_sidebar_view_destroyed (IdeLayoutTransientSidebar *self,
+ IdeLayoutView *view);
+
G_DEFINE_TYPE_WITH_PRIVATE (IdeLayoutTransientSidebar,
ide_layout_transient_sidebar,
IDE_TYPE_LAYOUT_PANE)
@@ -98,7 +101,7 @@ ide_layout_transient_sidebar_after_set_focus (IdeLayoutTransientSidebar *self,
IdeLayoutTransientSidebarPrivate *priv = ide_layout_transient_sidebar_get_instance_private (self);
g_assert (IDE_IS_LAYOUT_TRANSIENT_SIDEBAR (self));
- g_assert (GTK_IS_WINDOW (toplevel));
+ g_assert (!toplevel || GTK_IS_WINDOW (toplevel));
/*
* If we are currently visible, then check to see if the focus has gone
@@ -112,6 +115,13 @@ ide_layout_transient_sidebar_after_set_focus (IdeLayoutTransientSidebar *self,
{
if (!has_view_related_focus (self))
{
+ g_autoptr(GtkWidget) old_view = g_weak_ref_get (&priv->view_ref);
+
+ if (old_view != NULL)
+ g_signal_handlers_disconnect_by_func (old_view,
+ G_CALLBACK (ide_layout_transient_sidebar_view_destroyed),
+ self);
+
dzl_dock_revealer_set_reveal_child (DZL_DOCK_REVEALER (self), FALSE);
g_weak_ref_set (&priv->view_ref, NULL);
}
@@ -119,6 +129,24 @@ ide_layout_transient_sidebar_after_set_focus (IdeLayoutTransientSidebar *self,
}
static void
+ide_layout_transient_sidebar_view_destroyed (IdeLayoutTransientSidebar *self,
+ IdeLayoutView *view)
+{
+ IdeLayoutTransientSidebarPrivate *priv = ide_layout_transient_sidebar_get_instance_private (self);
+
+ g_assert (IDE_IS_LAYOUT_TRANSIENT_SIDEBAR (self));
+ g_assert (IDE_IS_LAYOUT_VIEW (view));
+
+ g_signal_handlers_disconnect_by_func (view,
+ G_CALLBACK (ide_layout_transient_sidebar_view_destroyed),
+ self);
+
+ g_weak_ref_set (&priv->view_ref, NULL);
+
+ ide_layout_transient_sidebar_after_set_focus (self, NULL, NULL);
+}
+
+static void
ide_layout_transient_sidebar_hierarchy_changed (GtkWidget *widget,
GtkWidget *old_toplevel)
{
@@ -205,10 +233,24 @@ ide_layout_transient_sidebar_set_view (IdeLayoutTransientSidebar *self,
IdeLayoutView *view)
{
IdeLayoutTransientSidebarPrivate *priv = ide_layout_transient_sidebar_get_instance_private (self);
+ g_autoptr(GtkWidget) old_view = NULL;
g_return_if_fail (IDE_IS_LAYOUT_TRANSIENT_SIDEBAR (self));
g_return_if_fail (!view || IDE_IS_LAYOUT_VIEW (view));
+ old_view = g_weak_ref_get (&priv->view_ref);
+ if (old_view != NULL)
+ g_signal_handlers_disconnect_by_func (old_view,
+ G_CALLBACK (ide_layout_transient_sidebar_view_destroyed),
+ self);
+
+ if (view != NULL)
+ g_signal_connect_object (view,
+ "destroy",
+ G_CALLBACK (ide_layout_transient_sidebar_view_destroyed),
+ self,
+ G_CONNECT_SWAPPED);
+
g_weak_ref_set (&priv->view_ref, view);
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]