[bijiben] scrolled window: do not crash application with signals when closing
- From: Pierre-Yves Luyten <pyluyten src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [bijiben] scrolled window: do not crash application with signals when closing
- Date: Sat, 1 Mar 2014 00:04:37 +0000 (UTC)
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]