[gnumeric] Avoid crashing after destroying a SheetWidgetAdjustment associated widget.



commit 5a47a8176bb94ca0433067a337c6457628b4c4e1
Author: Jean Brefort <jean brefort normalesup org>
Date:   Fri Aug 9 18:56:14 2013 +0200

    Avoid crashing after destroying a SheetWidgetAdjustment associated widget.

 ChangeLog                 |    8 ++++++++
 NEWS                      |    2 ++
 src/sheet-object-widget.c |   14 ++++++++++++++
 3 files changed, 24 insertions(+), 0 deletions(-)
---
diff --git a/ChangeLog b/ChangeLog
index c361179..3b18cce 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+2013-08-09  Jean Brefort  <jean brefort normalesup org>
+
+       * src/sheet-object-widget.c (cb_range_destroyed),
+       (sheet_widget_scrollbar_create_widget),
+       (sheet_widget_spinbutton_create_widget),
+       (sheet_widget_slider_create_widget): avoid crashing after destroying a
+       SheetWidgetAdjustment associated widget. [see Gtk+ bug #705677]
+
 2013-08-09  Morten Welinder  <terra gnome org>
 
        * src/sheet-object-widget.c (sheet_widget_button_draw_cairo): Use
diff --git a/NEWS b/NEWS
index efe65bb..7bb5b41 100644
--- a/NEWS
+++ b/NEWS
@@ -27,6 +27,8 @@ Jean:
        * Fix export of scatter/bubble plots to xls. [#705311]
        * Fix crash when importing fuzzed chart from xls. [#705353]
        * Accept <graph:Type> nodes in guppi graphs. [Debian #718594]
+       * Avoid crashing after destroying a SheetWidgetAdjustment associated widget.
+       [see Gtk+ bug #705677]
 
 Morten:
        * Fix crazy parsing problem.  [#704109] [#704140]
diff --git a/src/sheet-object-widget.c b/src/sheet-object-widget.c
index a184d37..3351371 100644
--- a/src/sheet-object-widget.c
+++ b/src/sheet-object-widget.c
@@ -1286,6 +1286,14 @@ enum {
 static GType sheet_widget_adjustment_get_type (void);
 
 static void
+cb_range_destroyed (GtkWidget *w, SheetWidgetAdjustment *swa)
+{
+       GObject *accessible = G_OBJECT (gtk_widget_get_accessible (w));
+       if (accessible)
+               g_signal_handlers_disconnect_by_data (swa->adjustment, accessible);
+}
+
+static void
 sheet_widget_adjustment_set_value (SheetWidgetAdjustment *swa, double new_val)
 {
        if (swa->being_updated)
@@ -1866,6 +1874,8 @@ sheet_widget_scrollbar_create_widget (SheetObjectWidget *sow)
        g_signal_connect (G_OBJECT (bar),
                "value_changed",
                G_CALLBACK (cb_adjustment_widget_value_changed), swa);
+       g_signal_connect (G_OBJECT (bar), "destroy",
+                         G_CALLBACK (cb_range_destroyed), swa);
        swa->being_updated = FALSE;
 
        return bar;
@@ -1971,6 +1981,8 @@ sheet_widget_spinbutton_create_widget (SheetObjectWidget *sow)
        g_signal_connect (G_OBJECT (spinbutton),
                "value_changed",
                G_CALLBACK (cb_adjustment_widget_value_changed), swa);
+       g_signal_connect (G_OBJECT (spinbutton), "destroy",
+                         G_CALLBACK (cb_range_destroyed), swa);
        swa->being_updated = FALSE;
        return spinbutton;
 }
@@ -2075,6 +2087,8 @@ sheet_widget_slider_create_widget (SheetObjectWidget *sow)
        g_signal_connect (G_OBJECT (slider),
                "value_changed",
                G_CALLBACK (cb_adjustment_widget_value_changed), swa);
+       g_signal_connect (G_OBJECT (slider), "destroy",
+                         G_CALLBACK (cb_range_destroyed), swa);
        swa->being_updated = FALSE;
 
        return slider;


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