From 9c7bdde7adbecbfe254da6fa92e0f3bdc1f47546 Mon Sep 17 00:00:00 2001 From: knutux Date: Thu, 4 May 2006 11:13:11 +0000 Subject: [PATCH] Temporary fix for broken snap functionality: as named view constructor is never called, virtual tables of Snapper derived classes are never initialized. Fix - calling constructor/destructor on SPNamedView init/release. --- src/grid-snapper.cpp | 4 ++++ src/grid-snapper.h | 1 + src/guide-snapper.cpp | 4 ++++ src/guide-snapper.h | 1 + src/line-snapper.h | 3 ++- src/object-snapper.cpp | 4 ++++ src/object-snapper.h | 3 ++- src/snapper.h | 1 + src/sp-namedview.cpp | 5 +++++ 9 files changed, 24 insertions(+), 2 deletions(-) diff --git a/src/grid-snapper.cpp b/src/grid-snapper.cpp index f1d4e4bf6..419dc4b82 100644 --- a/src/grid-snapper.cpp +++ b/src/grid-snapper.cpp @@ -39,6 +39,10 @@ Inkscape::LineSnapper::LineList Inkscape::GridSnapper::_getSnapLines(NR::Point c { LineList s; + if ( NULL == _named_view ) { + return s; + } + SPCGrid *griditem = NULL; for (GSList *l = _named_view->gridviews; l != NULL; l = l->next) { // FIXME : this is a hack since there is only one view for now diff --git a/src/grid-snapper.h b/src/grid-snapper.h index 247823ac7..73a1f2500 100644 --- a/src/grid-snapper.h +++ b/src/grid-snapper.h @@ -24,6 +24,7 @@ namespace Inkscape class GridSnapper : public LineSnapper { public: + GridSnapper() {} GridSnapper(SPNamedView const *nv, NR::Coord const d); private: diff --git a/src/guide-snapper.cpp b/src/guide-snapper.cpp index fbf1af0af..a05ecd3e6 100644 --- a/src/guide-snapper.cpp +++ b/src/guide-snapper.cpp @@ -26,6 +26,10 @@ Inkscape::GuideSnapper::LineList Inkscape::GuideSnapper::_getSnapLines(NR::Point { LineList s; + if ( NULL == _named_view ) { + return s; + } + for (GSList const *l = _named_view->guides; l != NULL; l = l->next) { SPGuide const *g = SP_GUIDE(l->data); diff --git a/src/guide-snapper.h b/src/guide-snapper.h index f4c7b2de7..654149f5c 100644 --- a/src/guide-snapper.h +++ b/src/guide-snapper.h @@ -28,6 +28,7 @@ namespace Inkscape class GuideSnapper : public LineSnapper { public: + GuideSnapper() {} GuideSnapper(SPNamedView const *nv, NR::Coord const d); private: diff --git a/src/line-snapper.h b/src/line-snapper.h index 581466d33..72afab76d 100644 --- a/src/line-snapper.h +++ b/src/line-snapper.h @@ -19,13 +19,14 @@ namespace Inkscape class LineSnapper : public Snapper { public: + LineSnapper() {} LineSnapper(SPNamedView const *nv, NR::Coord const d); protected: typedef std::list > LineList; private: - SnappedPoint _doFreeSnap(NR::Point const &p, + virtual SnappedPoint _doFreeSnap(NR::Point const &p, std::list const &it) const; SnappedPoint _doConstrainedSnap(NR::Point const &p, diff --git a/src/object-snapper.cpp b/src/object-snapper.cpp index 6146c11b8..9a3f61525 100644 --- a/src/object-snapper.cpp +++ b/src/object-snapper.cpp @@ -144,6 +144,10 @@ void Inkscape::ObjectSnapper::_snapPaths(Inkscape::SnappedPoint &s, Inkscape::SnappedPoint Inkscape::ObjectSnapper::_doFreeSnap(NR::Point const &p, std::list const &it) const { + if ( NULL == _named_view ) { + return SnappedPoint(p, NR_HUGE); + } + /* Get a list of all the SPItems that we will try to snap to */ std::list cand; _findCandidates(cand, sp_document_root(_named_view->document), it, p); diff --git a/src/object-snapper.h b/src/object-snapper.h index 189e96e3e..98d457088 100644 --- a/src/object-snapper.h +++ b/src/object-snapper.h @@ -25,6 +25,7 @@ namespace Inkscape class ObjectSnapper : public Snapper { public: + ObjectSnapper() {} ObjectSnapper(SPNamedView const *nv, NR::Coord const d); void setSnapToNodes(bool s) { @@ -44,7 +45,7 @@ public: } private: - SnappedPoint _doFreeSnap(NR::Point const &p, + virtual SnappedPoint _doFreeSnap(NR::Point const &p, std::list const &it) const; SnappedPoint _doConstrainedSnap(NR::Point const &p, diff --git a/src/snapper.h b/src/snapper.h index 02f7cb7e9..2f3c487d6 100644 --- a/src/snapper.h +++ b/src/snapper.h @@ -27,6 +27,7 @@ namespace Inkscape class Snapper { public: + Snapper() {} Snapper(SPNamedView const *nv, ::NR::Coord const d); virtual ~Snapper() {} diff --git a/src/sp-namedview.cpp b/src/sp-namedview.cpp index bd7793ca1..4be180237 100644 --- a/src/sp-namedview.cpp +++ b/src/sp-namedview.cpp @@ -104,6 +104,9 @@ static void sp_namedview_class_init(SPNamedViewClass * klass) static void sp_namedview_init(SPNamedView *nv) { + // explicitly call a contructor + new(nv) SPNamedView(); + nv->editable = TRUE; nv->showgrid = FALSE; nv->showguides = TRUE; @@ -202,6 +205,8 @@ static void sp_namedview_release(SPObject *object) if (((SPObjectClass *) parent_class)->release) { ((SPObjectClass *) parent_class)->release(object); } + + namedview->~SPNamedView(); } static void sp_namedview_set(SPObject *object, unsigned int key, const gchar *value) -- 2.30.2