[gnome-builder] layout: remove sidebar when view is closed



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]