[bijiben] scrolled window: do not crash application with signals when closing



commit 71f21bde91b0f2a1e515c612b5539fe7f25600c3
Author: Pierre-Yves Luyten <py luyten fr>
Date:   Sat Mar 1 01:03:09 2014 +0100

    scrolled window: do not crash application with signals when closing
    
    We are listening to signals from scrolled window. It is necessary
    to disconnect early while closing the application.
    See 725285

 src/bjb-main-view.c   |   41 +++++++++++++++++++++++++++++++++++++----
 src/bjb-main-view.h   |    2 ++
 src/bjb-window-base.c |    1 +
 3 files changed, 40 insertions(+), 4 deletions(-)
---
diff --git a/src/bjb-main-view.c b/src/bjb-main-view.c
index 6b5a19d..de2f626 100644
--- a/src/bjb-main-view.c
+++ b/src/bjb-main-view.c
@@ -79,6 +79,10 @@ struct _BjbMainViewPriv {
 
 G_DEFINE_TYPE (BjbMainView, bjb_main_view, GTK_TYPE_GRID);
 
+
+static void bjb_main_view_view_changed (BjbMainView *self);
+
+
 static void
 bjb_main_view_init (BjbMainView *object)
 {
@@ -91,12 +95,28 @@ bjb_main_view_init (BjbMainView *object)
   object->priv->view_selection_changed =0;
 }
 
-static void
-bjb_main_view_finalize (GObject *object)
+
+
+void
+bjb_main_view_disconnect_scrolled_window (BjbMainView *self)
 {
-  G_OBJECT_CLASS (bjb_main_view_parent_class)->finalize (object);
+  GtkAdjustment *vadjustment;
+  GtkWidget *vscrollbar;
+  BjbMainViewPriv *priv = self->priv;
+
+  if (priv->view == NULL ||
+      !GTK_IS_SCROLLED_WINDOW (priv->view))
+    return;
+
+  vadjustment = gtk_scrolled_window_get_vadjustment (GTK_SCROLLED_WINDOW (priv->view));
+  vscrollbar = gtk_scrolled_window_get_vscrollbar (GTK_SCROLLED_WINDOW (priv->view));
+
+  g_signal_handlers_disconnect_by_func (vadjustment, bjb_main_view_view_changed, self);
+  g_signal_handlers_disconnect_by_func (vscrollbar, bjb_main_view_view_changed, self);
 }
 
+
+
 static void
 bjb_main_view_disconnect_handlers (BjbMainView *self)
 {
@@ -113,6 +133,16 @@ bjb_main_view_disconnect_handlers (BjbMainView *self)
   priv->view_selection_changed =0;
 }
 
+
+
+static void
+bjb_main_view_finalize (GObject *object)
+{
+  bjb_main_view_disconnect_handlers (BJB_MAIN_VIEW (object));
+  bjb_main_view_disconnect_scrolled_window (BJB_MAIN_VIEW (object));
+  G_OBJECT_CLASS (bjb_main_view_parent_class)->finalize (object);
+}
+
 static void
 bjb_main_view_set_controller ( BjbMainView *self, BjbController *controller)
 {
@@ -601,6 +631,9 @@ bjb_main_view_view_changed (BjbMainView *self)
   priv = self->priv;
   reveal_area_height = 32;
   end = FALSE;
+  if (priv->view == NULL)
+    return;
+
   vscrollbar = gtk_scrolled_window_get_vscrollbar (GTK_SCROLLED_WINDOW (priv->view));
 
   if (vscrollbar == NULL || !gtk_widget_get_visible (GTK_WIDGET (vscrollbar)))
@@ -640,6 +673,7 @@ bjb_main_view_constructed(GObject *o)
 
   gtk_orientable_set_orientation (GTK_ORIENTABLE (self), GTK_ORIENTATION_VERTICAL);
   priv->view = gd_main_view_new (DEFAULT_VIEW);
+  g_object_add_weak_pointer (G_OBJECT (priv->view), (gpointer*) &(priv->view));
 
   /* Main view */
   gd_main_view_set_selection_mode (priv->view, FALSE);
@@ -668,7 +702,6 @@ bjb_main_view_constructed(GObject *o)
                            self,
                            G_CONNECT_SWAPPED);
 
-
   /* Load more */
   priv->load_more = bjb_load_more_button_new (priv->controller);
   button = bjb_load_more_button_get_revealer (BJB_LOAD_MORE_BUTTON (priv->load_more));
diff --git a/src/bjb-main-view.h b/src/bjb-main-view.h
index aa62ef9..b7fd7c5 100644
--- a/src/bjb-main-view.h
+++ b/src/bjb-main-view.h
@@ -86,6 +86,8 @@ GdMainViewType bjb_main_view_get_view_type (BjbMainView *view);
 void bjb_main_view_set_view_type (BjbMainView *view, GdMainViewType type);
 
 
+void bjb_main_view_disconnect_scrolled_window (BjbMainView *self);
+
 
 G_END_DECLS
 
diff --git a/src/bjb-window-base.c b/src/bjb-window-base.c
index afed953..f4ffe96 100644
--- a/src/bjb-window-base.c
+++ b/src/bjb-window-base.c
@@ -148,6 +148,7 @@ bjb_window_base_set_property (GObject  *object,
 static void
 bjb_window_base_destroy (gpointer a, BjbWindowBase * self)
 {
+  bjb_main_view_disconnect_scrolled_window (self->priv->view);
   bjb_controller_disconnect (self->priv->controller);
 }
 


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]