From 6d2b9692f074192ae4bb04e96314c084bbf31db6 Mon Sep 17 00:00:00 2001 From: Nathan Lee <2431820-nathanal@users.noreply.gitlab.com> Date: Wed, 27 Feb 2019 16:52:31 +1100 Subject: Stop crash, save dialog pos for floating dialog preference Adds error checking and calls sp_ruler_remove_track_widget before track widget is removed. Fixes: https://gitlab.com/inkscape/inkscape/issues/90 https://bugs.launchpad.net/inkscape/+bug/1674155 --- src/widgets/desktop-widget.cpp | 10 ++++++--- src/widgets/gimp/ruler.cpp | 49 +++++++++++++++++++++--------------------- 2 files changed, 32 insertions(+), 27 deletions(-) diff --git a/src/widgets/desktop-widget.cpp b/src/widgets/desktop-widget.cpp index 13a7b649e..aae6ed9bf 100644 --- a/src/widgets/desktop-widget.cpp +++ b/src/widgets/desktop-widget.cpp @@ -486,8 +486,8 @@ void SPDesktopWidget::init( SPDesktopWidget *dtw ) #endif // defined(HAVE_LIBLCMS1) || defined(HAVE_LIBLCMS2) gtk_widget_set_can_focus (GTK_WIDGET (dtw->_canvas), TRUE); - sp_ruler_add_track_widget (SP_RULER(dtw->_hruler->gobj()), GTK_WIDGET(dtw->_canvas)); - sp_ruler_add_track_widget (SP_RULER(dtw->_vruler->gobj()), GTK_WIDGET(dtw->_canvas)); + sp_ruler_add_track_widget(SP_RULER(dtw->_hruler->gobj()), GTK_WIDGET(dtw->_canvas)); + sp_ruler_add_track_widget(SP_RULER(dtw->_vruler->gobj()), GTK_WIDGET(dtw->_canvas)); auto css_provider = gtk_css_provider_new(); auto style_context = gtk_widget_get_style_context(GTK_WIDGET(dtw->_canvas)); @@ -531,7 +531,7 @@ void SPDesktopWidget::init( SPDesktopWidget *dtw ) } else { dtw->_canvas_tbl->set_hexpand(true); dtw->_canvas_tbl->set_vexpand(true); - gtk_grid_attach(GTK_GRID(tbl_wrapper), GTK_WIDGET (dtw->_canvas_tbl->gobj()), 1, 1, 1, 1); + tbl_wrapper->attach(*(dtw->_canvas_tbl), 1, 1, 1, 1); } // connect scrollbar signals @@ -745,6 +745,10 @@ SPDesktopWidget::dispose(GObject *object) dtw->desktop->destroy(); Inkscape::GC::release (dtw->desktop); dtw->desktop = nullptr; + + // Rulers + sp_ruler_remove_track_widget(SP_RULER(dtw->_hruler->gobj()), GTK_WIDGET(dtw->_canvas)); + sp_ruler_remove_track_widget(SP_RULER(dtw->_vruler->gobj()), GTK_WIDGET(dtw->_canvas)); } dtw->modified_connection.~connection(); diff --git a/src/widgets/gimp/ruler.cpp b/src/widgets/gimp/ruler.cpp index 470cf44f0..1d196d2b0 100644 --- a/src/widgets/gimp/ruler.cpp +++ b/src/widgets/gimp/ruler.cpp @@ -276,20 +276,23 @@ sp_ruler_init (SPRuler *ruler) static void sp_ruler_dispose (GObject *object) { - SPRuler *ruler = SP_RULER (object); - SPRulerPrivate *priv = SP_RULER_GET_PRIVATE (ruler); + SPRuler *ruler = SP_RULER(object); + SPRulerPrivate *priv = SP_RULER_GET_PRIVATE(ruler); - for (auto i:*(priv->track_widgets)) - sp_ruler_remove_track_widget (ruler, i); + if (ruler == nullptr || priv == nullptr || priv->track_widgets == nullptr) { return; } - if (priv->pos_redraw_idle_id) - { - g_source_remove (priv->pos_redraw_idle_id); - priv->pos_redraw_idle_id = 0; + while (!priv->track_widgets->empty()) { + sp_ruler_remove_track_widget(ruler, *(priv->track_widgets->begin())); + } + + if (priv->pos_redraw_idle_id) { + g_source_remove(priv->pos_redraw_idle_id); + priv->pos_redraw_idle_id = 0; } - delete priv->track_widgets; + delete priv->track_widgets; + priv->track_widgets = nullptr; - G_OBJECT_CLASS (parent_class)->dispose (object); + G_OBJECT_CLASS (parent_class)->dispose(object); } @@ -861,8 +864,8 @@ sp_ruler_event_to_widget_coords (GtkWidget *widget, static gboolean sp_ruler_track_widget_motion_notify (GtkWidget *widget, - GdkEventMotion *mevent, - SPRuler *ruler) + GdkEventMotion *mevent, + SPRuler *ruler) { gint widget_x; gint widget_y; @@ -919,25 +922,23 @@ sp_ruler_add_track_widget (SPRuler *ruler, */ void sp_ruler_remove_track_widget (SPRuler *ruler, - GtkWidget *widget) + GtkWidget *widget) { - SPRulerPrivate *priv; - g_return_if_fail (SP_IS_RULER (ruler)); g_return_if_fail (GTK_IS_WIDGET (ruler)); - priv = SP_RULER_GET_PRIVATE (ruler); - - g_return_if_fail (priv->track_widgets->find(widget)!=priv->track_widgets->end()); - - priv->track_widgets->erase(widget); + SPRulerPrivate *priv = SP_RULER_GET_PRIVATE (ruler); + g_return_if_fail(priv->track_widgets->find(widget)!=priv->track_widgets->end()); + g_signal_handlers_disconnect_by_func (widget, - (gpointer) G_CALLBACK (sp_ruler_track_widget_motion_notify), - ruler); + (gpointer) G_CALLBACK (sp_ruler_track_widget_motion_notify), + ruler); g_signal_handlers_disconnect_by_func (widget, - (gpointer) G_CALLBACK (sp_ruler_remove_track_widget), - ruler); + (gpointer) G_CALLBACK (sp_ruler_remove_track_widget), + ruler); + + priv->track_widgets->erase(widget); } /** -- cgit v1.2.3