Code

Clear pointers in the snapmanager if they're no longer needed.
authorDiederik van Lierop <mailat-signdiedenrezidotnl>
Wed, 11 Aug 2010 06:43:24 +0000 (08:43 +0200)
committerDiederik van Lierop <mailat-signdiedenrezidotnl>
Wed, 11 Aug 2010 06:43:24 +0000 (08:43 +0200)
18 files changed:
src/arc-context.cpp
src/box3d-context.cpp
src/connector-context.cpp
src/context-fns.cpp
src/desktop-events.cpp
src/draw-context.cpp
src/gradient-context.cpp
src/gradient-drag.cpp
src/knot-holder-entity.cpp
src/pen-context.cpp
src/pencil-context.cpp
src/rect-context.cpp
src/seltrans.cpp
src/snap.h
src/spiral-context.cpp
src/star-context.cpp
src/ui/clipboard.cpp
src/ui/tool/node.cpp

index 799167a72a156528d79b5536a604c9d3bb8c75aa..3c0d9ccdaaa98966f37be5a9b7d3d1e55ae2e1da 100644 (file)
@@ -251,6 +251,7 @@ static gint sp_arc_context_root_handler(SPEventContext *event_context, GdkEvent
                                     GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK,
                                     NULL, event->button.time);
                 ret = TRUE;
+                m.unSetup();
             }
             break;
         case GDK_MOTION_NOTIFY:
@@ -281,6 +282,7 @@ static gint sp_arc_context_root_handler(SPEventContext *event_context, GdkEvent
                 Geom::Point const motion_w(event->motion.x, event->motion.y);
                 Geom::Point motion_dt(desktop->w2d(motion_w));
                 m.preSnap(Inkscape::SnapCandidatePoint(motion_dt, Inkscape::SNAPSOURCE_NODE_HANDLE));
+                m.unSetup();
             }
             break;
         case GDK_BUTTON_RELEASE:
index 5534aa4109187b45df4c6d2ae009b06b9d1f171d..37e9e210c47d05a2218dbdf80d3a804dbc75d6b9 100644 (file)
@@ -317,6 +317,7 @@ static gint sp_box3d_context_root_handler(SPEventContext *event_context, GdkEven
             SnapManager &m = desktop->namedview->snap_manager;
             m.setup(desktop, true, bc->item);
             m.freeSnapReturnByRef(button_dt, Inkscape::SNAPSOURCE_NODE_HANDLE);
+            m.unSetup();
             bc->center = from_2geom(button_dt);
 
             sp_canvas_item_grab(SP_CANVAS_ITEM(desktop->acetate),
@@ -349,7 +350,6 @@ static gint sp_box3d_context_root_handler(SPEventContext *event_context, GdkEven
             SnapManager &m = desktop->namedview->snap_manager;
             m.setup(desktop, true, bc->item);
             m.freeSnapReturnByRef(motion_dt, Inkscape::SNAPSOURCE_NODE_HANDLE);
-
             bc->ctrl_dragged  = event->motion.state & GDK_CONTROL_MASK;
 
             if (event->motion.state & GDK_SHIFT_MASK && !bc->extruded && bc->item) {
@@ -383,6 +383,7 @@ static gint sp_box3d_context_root_handler(SPEventContext *event_context, GdkEven
                 }
                 m.freeSnapReturnByRef(bc->drag_ptC, Inkscape::SNAPSOURCE_NODE_HANDLE);
             }
+            m.unSetup();
 
             sp_box3d_drag(*bc, event->motion.state);
 
@@ -394,6 +395,7 @@ static gint sp_box3d_context_root_handler(SPEventContext *event_context, GdkEven
             Geom::Point const motion_w(event->motion.x, event->motion.y);
             Geom::Point motion_dt(desktop->w2d(motion_w));
             m.preSnap(Inkscape::SnapCandidatePoint(motion_dt, Inkscape::SNAPSOURCE_NODE_HANDLE));
+            m.unSetup();
         }
         break;
     case GDK_BUTTON_RELEASE:
index b0e19219039824807761ce3bcb00470e5f6ae5d4..3791034d69687723af5243335d93802e29710f0b 100644 (file)
@@ -824,6 +824,7 @@ connector_handle_button_press(SPConnectorContext *const cc, GdkEventButton const
                 default:
                     break;
             }
+            m.unSetup();
         } else if (bevent.button == 3) {
             if (cc->state == SP_CONNECTOR_CONTEXT_REROUTING) {
                 // A context menu is going to be triggered here,
@@ -997,6 +998,7 @@ connector_handle_motion_notify(SPConnectorContext *const cc, GdkEventMotion cons
                 }
                 break;
         }
+        m.unSetup();
     }
     else if ( cc->mode == SP_CONNECTOR_CONTEXT_EDITING_MODE )
     {
@@ -1121,6 +1123,7 @@ connector_handle_button_release(SPConnectorContext *const cc, GdkEventButton con
                     break;
             }
         }
+        m.unSetup();
     }
 
 
@@ -1207,6 +1210,7 @@ connector_handle_key_press(SPConnectorContext *const cc, guint const keyval)
                         cp.pos = p * sp_item_dt2i_affine(cc->active_shape);
                         cc->active_shape->avoidRef->updateConnectionPoint(cp);
                     }
+                    m.unSetup();
 
                     cc->state = SP_CONNECTOR_CONTEXT_IDLE;
                     ret = TRUE;
@@ -1230,7 +1234,7 @@ connector_handle_key_press(SPConnectorContext *const cc, guint const keyval)
                     Geom::Point p = cc->selected_handle->pos;
 
                     m.freeSnapReturnByRef(p, Inkscape::SNAPSOURCE_OTHER_HANDLE);
-
+                    m.unSetup();
                     sp_knot_set_position(cc->selected_handle, p, 0);
 
                     ConnectionPoint cp;
index b22cd488d79a6a86d20748f1459b511954b9c335..6da1813ca9b2806334e9e4a423f8faf98cdf9bd9 100644 (file)
@@ -209,6 +209,8 @@ Geom::Rect Inkscape::snap_rectangular_box(SPDesktop const *desktop, SPItem *item
     p[0] *= desktop->dt2doc();
     p[1] *= desktop->dt2doc();
 
+    m.unSetup();
+
     return Geom::Rect(Geom::Point(MIN(p[0][Geom::X], p[1][Geom::X]), MIN(p[0][Geom::Y], p[1][Geom::Y])),
                     Geom::Point(MAX(p[0][Geom::X], p[1][Geom::X]), MAX(p[0][Geom::Y], p[1][Geom::Y])));
 }
index bb22b0faa4f65ff2b1cb01f90caf538dce2c7eb2..d5d57717ff396d7ecaec39002f7ae724046cd834 100644 (file)
@@ -150,6 +150,7 @@ static gint sp_dt_ruler_event(GtkWidget *widget, GdkEvent *event, SPDesktopWidge
                     // Because the guide snapper only looks in the document for guides to snap to,
                     // we don't have to worry about a guide snapping to itself here
                     m.guideFreeSnap(event_dt, normal, SP_DRAG_MOVE_ORIGIN);
+                    m.unSetup();
                 }
 
                 sp_guideline_set_position(SP_GUIDELINE(guide), from_2geom(event_dt));
@@ -172,6 +173,7 @@ static gint sp_dt_ruler_event(GtkWidget *widget, GdkEvent *event, SPDesktopWidge
                     // Because the guide snapper only looks in the document for guides to snap to,
                     // we don't have to worry about a guide snapping to itself here
                     m.guideFreeSnap(event_dt, normal, SP_DRAG_MOVE_ORIGIN);
+                    m.unSetup();
                 }
 
                 dragging = false;
@@ -297,9 +299,10 @@ gint sp_dt_guide_event(SPCanvasItem *item, GdkEvent *event, gpointer data)
                         m.guideConstrainedSnap(motion_dt, *guide);
                     }
                 } else if (!((drag_type == SP_DRAG_ROTATE) && (event->motion.state & GDK_CONTROL_MASK))) {
-                                       // cannot use shift here to disable snapping, because we already use it for rotating the guide
-                       m.guideFreeSnap(motion_dt, guide->normal_to_line, drag_type);
+                    // cannot use shift here to disable snapping, because we already use it for rotating the guide
+                    m.guideFreeSnap(motion_dt, guide->normal_to_line, drag_type);
                 }
+                m.unSetup();
 
                 switch (drag_type) {
                     case SP_DRAG_TRANSLATE:
@@ -361,9 +364,10 @@ gint sp_dt_guide_event(SPCanvasItem *item, GdkEvent *event, gpointer data)
                             m.guideConstrainedSnap(event_dt, *guide);
                         }
                     } else if (!((drag_type == SP_DRAG_ROTATE) && (event->motion.state & GDK_CONTROL_MASK))) {
-                       // cannot use shift here to disable snapping, because we already use it for rotating the guide
-                       m.guideFreeSnap(event_dt, guide->normal_to_line, drag_type);
+                        // cannot use shift here to disable snapping, because we already use it for rotating the guide
+                        m.guideFreeSnap(event_dt, guide->normal_to_line, drag_type);
                     }
+                    m.unSetup();
 
                     if (sp_canvas_world_pt_inside_window(item->canvas, event_w)) {
                         switch (drag_type) {
index c0ae626d5f436773fda56d0e34cae72e0d33cce6..9bd67c3dd186f9c2c31062bc7b0cb59fc8378269 100644 (file)
@@ -512,6 +512,7 @@ void spdc_endpoint_snap_rotation(SPEventContext const *const ec, Geom::Point &p,
             SnapManager &m = SP_EVENT_CONTEXT_DESKTOP(ec)->namedview->snap_manager;
             m.setup(SP_EVENT_CONTEXT_DESKTOP(ec));
             m.constrainedSnapReturnByRef(p, Inkscape::SNAPSOURCE_NODE_HANDLE, Inkscape::Snapper::SnapConstraint(o, best));
+            m.unSetup();
         }
     }
 }
@@ -528,6 +529,7 @@ void spdc_endpoint_snap_free(SPEventContext const * const ec, Geom::Point& p, gu
 
     m.setup(dt, true, selection->singleItem());
     m.freeSnapReturnByRef(p, Inkscape::SNAPSOURCE_NODE_HANDLE);
+    m.unSetup();
 }
 
 static SPCurve *
index bf1566b267ad197dfc9ae27781351f9cd37d7e84..013c9bcd8df3c92c49e281603ccf4e9b7edd382a 100644 (file)
@@ -557,6 +557,7 @@ sp_gradient_context_root_handler(SPEventContext *event_context, GdkEvent *event)
                 SnapManager &m = desktop->namedview->snap_manager;
                 m.setup(desktop);
                 m.freeSnapReturnByRef(button_dt, Inkscape::SNAPSOURCE_NODE_HANDLE);
+                m.unSetup();
                 rc->origin = from_2geom(button_dt);
             }
 
@@ -597,7 +598,9 @@ sp_gradient_context_root_handler(SPEventContext *event_context, GdkEvent *event)
 
                 Geom::Point const motion_w(event->motion.x, event->motion.y);
                 Geom::Point const motion_dt = event_context->desktop->w2d(motion_w);
+
                 m.preSnap(Inkscape::SnapCandidatePoint(motion_dt, Inkscape::SNAPSOURCE_NODE_HANDLE));
+                m.unSetup();
             }
 
             bool over_line = false;
index e7536a86ae35684816d05e6f5d86e3d31b074c29..32aa7c084ee63c53eb1447ebe3036a4824c1b65f 100644 (file)
@@ -731,6 +731,8 @@ gr_knot_moved_handler(SPKnot *knot, Geom::Point const &ppointer, guint state, gp
         }
     }
 
+    m.unSetup();
+
     drag->keep_selection = (bool) g_list_find(drag->selected, dragger);
     bool scale_radial = (state & GDK_CONTROL_MASK) && (state & GDK_SHIFT_MASK);
 
@@ -864,6 +866,7 @@ gr_knot_moved_midpoint_handler(SPKnot */*knot*/, Geom::Point const &ppointer, gu
             SnapManager &m = desktop->namedview->snap_manager;
             m.setup(desktop);
             m.constrainedSnapReturnByRef(p, Inkscape::SNAPSOURCE_OTHER_HANDLE, cl);
+            m.unSetup();
         }
     }
     Geom::Point displacement = p - dragger->point;
index be61125c4295e9d8ba6b451db657ec6b208e166c..0a449771e9e95b395045392049b37eb58845560a 100644 (file)
@@ -94,8 +94,8 @@ KnotHolderEntity::snap_knot_position(Geom::Point const &p)
 
     SnapManager &m = desktop->namedview->snap_manager;
     m.setup(desktop, true, item);
-
     m.freeSnapReturnByRef(s, Inkscape::SNAPSOURCE_NODE_HANDLE);
+    m.unSetup();
 
     return s * i2d.inverse();
 }
@@ -126,6 +126,7 @@ KnotHolderEntity::snap_knot_position_constrained(Geom::Point const &p, Inkscape:
         Inkscape::Snapper::SnapConstraint transformed_constraint = Inkscape::Snapper::SnapConstraint(constraint.getPoint() * i2d, (constraint.getPoint() + constraint.getDirection()) * i2d - constraint.getPoint() * i2d);
         m.constrainedSnapReturnByRef(s, Inkscape::SNAPSOURCE_NODE_HANDLE, transformed_constraint);
     }
+    m.unSetup();
 
     return s * i2d.inverse();
 }
index 4a21d7bcbcbc8b797f0e5febd97c74a6cad952fe..bce499615483e97d37a2b32d0a07cab7fe6c256c 100644 (file)
@@ -476,6 +476,7 @@ static gint pen_handle_button_press(SPPenContext *const pc, GdkEventButton const
                                     SnapManager &m = desktop->namedview->snap_manager;
                                     m.setup(desktop);
                                     m.freeSnapReturnByRef(p, Inkscape::SNAPSOURCE_NODE_HANDLE);
+                                    m.unSetup();
                                 }
                               spdc_create_single_dot(event_context, p, "/tools/freehand/pen", bevent.state);
                               ret = TRUE;
@@ -633,6 +634,7 @@ pen_handle_motion_notify(SPPenContext *const pc, GdkEventMotion const &mevent)
                         SnapManager &m = dt->namedview->snap_manager;
                         m.setup(dt);
                         m.preSnap(Inkscape::SnapCandidatePoint(p, Inkscape::SNAPSOURCE_NODE_HANDLE));
+                        m.unSetup();
                     }
                     break;
                 case SP_PEN_CONTEXT_CONTROL:
@@ -683,6 +685,7 @@ pen_handle_motion_notify(SPPenContext *const pc, GdkEventMotion const &mevent)
                             SnapManager &m = dt->namedview->snap_manager;
                             m.setup(dt);
                             m.preSnap(Inkscape::SnapCandidatePoint(p, Inkscape::SNAPSOURCE_NODE_HANDLE));
+                            m.unSetup();
                         }
                     }
                     break;
@@ -709,6 +712,7 @@ pen_handle_motion_notify(SPPenContext *const pc, GdkEventMotion const &mevent)
                         SnapManager &m = dt->namedview->snap_manager;
                         m.setup(dt);
                         m.preSnap(Inkscape::SnapCandidatePoint(p, Inkscape::SNAPSOURCE_NODE_HANDLE));
+                        m.unSetup();
                     }
                     break;
             }
@@ -1481,6 +1485,7 @@ void pen_set_to_nearest_horiz_vert(const SPPenContext *const pc, Geom::Point &pt
 
         m.setup(pc->desktop, true, selection->singleItem());
         m.constrainedSnapReturnByRef(pt, Inkscape::SNAPSOURCE_NODE_HANDLE, cl);
+        m.unSetup();
     }
 }
 
index 9f9c187f37cb6adf1d4e76338222ad2b4d09462b..845f22a21fb36a8915be69b51661b761dbfdff3b 100644 (file)
@@ -290,6 +290,7 @@ pencil_handle_button_press(SPPencilContext *const pc, GdkEventButton const &beve
                         m.freeSnapReturnByRef(p, Inkscape::SNAPSOURCE_NODE_HANDLE);
                     }
                 }
+                m.unSetup();
                 pc->sa = anchor;
                 spdc_set_startpoint(pc, p);
                 ret = TRUE;
@@ -416,6 +417,7 @@ pencil_handle_motion_notify(SPPencilContext *const pc, GdkEventMotion const &mev
                 SnapManager &m = dt->namedview->snap_manager;
                 m.setup(dt);
                 m.preSnap(Inkscape::SnapCandidatePoint(p, Inkscape::SNAPSOURCE_NODE_HANDLE));
+                m.unSetup();
             }
             break;
     }
index 7ae27c13de4327bd5ef3da72083ebe1af389d586..d60a6630bcd3991ca5dcc76fae583386cc258f74 100644 (file)
@@ -284,6 +284,7 @@ static gint sp_rect_context_root_handler(SPEventContext *event_context, GdkEvent
             SnapManager &m = desktop->namedview->snap_manager;
             m.setup(desktop);
             m.freeSnapReturnByRef(button_dt, Inkscape::SNAPSOURCE_NODE_HANDLE);
+            m.unSetup();
             rc->center = from_2geom(button_dt);
 
             sp_canvas_item_grab(SP_CANVAS_ITEM(desktop->acetate),
@@ -323,7 +324,9 @@ static gint sp_rect_context_root_handler(SPEventContext *event_context, GdkEvent
 
             Geom::Point const motion_w(event->motion.x, event->motion.y);
             Geom::Point motion_dt(desktop->w2d(motion_w));
+
             m.preSnap(Inkscape::SnapCandidatePoint(motion_dt, Inkscape::SNAPSOURCE_NODE_HANDLE));
+            m.unSetup();
         }
         break;
     case GDK_BUTTON_RELEASE:
index 764c222a8fe67ba1ea04496e54dfd92002761a8f..7dbeb41739a533b332e37c1f8296cc3f5aaadf55 100644 (file)
@@ -1039,6 +1039,7 @@ gboolean Inkscape::SelTrans::scaleRequest(Geom::Point &pt, guint state)
             geom_scale = Geom::Scale(sn.getTransformation());
             pt = _calcAbsAffineGeom(geom_scale);
         }
+        m.unSetup();
     }
 
     /* Status text */
@@ -1134,6 +1135,8 @@ gboolean Inkscape::SelTrans::stretchRequest(SPSelTransHandle const &handle, Geom
             // will have to calculate pt taking the stroke width into account
             pt = _calcAbsAffineGeom(geom_scale);
         }
+
+        m.unSetup();
     }
 
     // status text
@@ -1226,6 +1229,8 @@ gboolean Inkscape::SelTrans::skewRequest(SPSelTransHandle const &handle, Geom::P
         } else {
             _desktop->snapindicator->remove_snaptarget();
         }
+
+        m.unSetup();
     }
 
     // Update the handle position
@@ -1299,6 +1304,7 @@ gboolean Inkscape::SelTrans::rotateRequest(Geom::Point &pt, guint state)
         m.setup(_desktop, false, _items_const);
         // When rotating, we cannot snap the corners of the bounding box, see the comment in "constrainedSnapRotate" for details
         Inkscape::SnappedPoint sn = m.constrainedSnapRotate(_snap_points, _point, radians, _origin);
+        m.unSetup();
 
         if (sn.getSnapped()) {
             _desktop->snapindicator->set_new_snaptarget(sn);
@@ -1309,6 +1315,7 @@ gboolean Inkscape::SelTrans::rotateRequest(Geom::Point &pt, guint state)
         } else {
             _desktop->snapindicator->remove_snaptarget();
         }
+
     }
 
 
@@ -1331,9 +1338,6 @@ gboolean Inkscape::SelTrans::rotateRequest(Geom::Point &pt, guint state)
 // Move the item's transformation center
 gboolean Inkscape::SelTrans::centerRequest(Geom::Point &pt, guint state)
 {
-    SnapManager &m = _desktop->namedview->snap_manager;
-    m.setup(_desktop);
-
     // Center is being dragged for the first item in the selection only
     // Find out which item is first ...
     GSList *items = (GSList *) const_cast<Selection *>(_selection)->itemList();
@@ -1343,8 +1347,11 @@ gboolean Inkscape::SelTrans::centerRequest(Geom::Point &pt, guint state)
     }
     // ... and store that item because later on we need to make sure that
     // this transformation center won't snap to itself
+    SnapManager &m = _desktop->namedview->snap_manager;
+    m.setup(_desktop);
     m.setRotationCenterSource(first);
     m.freeSnapReturnByRef(pt, Inkscape::SNAPSOURCE_ROTATION_CENTER);
+    m.unSetup();
 
     if (state & GDK_CONTROL_MASK) {
         if ( fabs(_point[Geom::X] - pt[Geom::X]) > fabs(_point[Geom::Y] - pt[Geom::Y]) ) {
@@ -1439,6 +1446,7 @@ void Inkscape::SelTrans::moveTo(Geom::Point const &xy, guint state)
         }
         m.setup(_desktop, true, _items_const);
         dxy = m.multipleOfGridPitch(dxy, _point);
+        m.unSetup();
     } else if (shift) {
         if (control) { // shift & control: constrained movement without snapping
             if (fabs(dxy[Geom::X]) > fabs(dxy[Geom::Y])) {
@@ -1493,6 +1501,7 @@ void Inkscape::SelTrans::moveTo(Geom::Point const &xy, guint state)
               double elapsed = ((((double)endtime.tv_sec - starttime.tv_sec) * G_USEC_PER_SEC + (endtime.tv_usec - starttime.tv_usec))) / 1000.0;
               std::cout << "Time spent snapping: " << elapsed << std::endl; */
         }
+        m.unSetup();
 
         /* Pick one */
         Inkscape::SnappedPoint best_snapped_point;
index c85c51963a9652efd5fdd0408375080e4330d1c9..9a99cea0771e884b9a318b261da5b53dcec52cc4 100644 (file)
@@ -98,6 +98,12 @@ public:
                               std::vector<Inkscape::SnapCandidatePoint> *unselected_nodes = NULL,
                               SPGuide *guide_to_ignore = NULL);
 
+    void unSetup() {_rotation_center_source_item = NULL;
+                    _guide_to_ignore = NULL;
+                    _desktop = NULL;
+                    _named_view = NULL;
+                    _unselected_nodes = NULL;}
+
     // If we're dragging a rotation center, then setRotationCenterSource() stores the parent item
     // of this rotation center; this reference is used to make sure that we do not snap a rotation
     // center to itself
index 7ce9d47107a24c4bcd367195d98316aabe457f14..822fafb75fa13d58eab8fae4f7eaace5e672f856 100644 (file)
@@ -242,7 +242,7 @@ sp_spiral_context_root_handler(SPEventContext *event_context, GdkEvent *event)
                 SnapManager &m = desktop->namedview->snap_manager;
                 m.setup(desktop);
                 m.freeSnapReturnByRef(sc->center, Inkscape::SNAPSOURCE_NODE_HANDLE);
-
+                m.unSetup();
                 sp_canvas_item_grab(SP_CANVAS_ITEM(desktop->acetate),
                                     ( GDK_KEY_PRESS_MASK |
                                       GDK_BUTTON_RELEASE_MASK |
@@ -272,6 +272,7 @@ sp_spiral_context_root_handler(SPEventContext *event_context, GdkEvent *event)
                 SnapManager &m = desktop->namedview->snap_manager;
                 m.setup(desktop, true, sc->item);
                 m.freeSnapReturnByRef(motion_dt, Inkscape::SNAPSOURCE_NODE_HANDLE);
+                m.unSetup();
                 sp_spiral_drag(sc, from_2geom(motion_dt), event->motion.state);
 
                 gobble_motion_events(GDK_BUTTON1_MASK);
@@ -280,10 +281,10 @@ sp_spiral_context_root_handler(SPEventContext *event_context, GdkEvent *event)
             } else if (!sp_event_context_knot_mouseover(sc)) {
                 SnapManager &m = desktop->namedview->snap_manager;
                 m.setup(desktop);
-
                 Geom::Point const motion_w(event->motion.x, event->motion.y);
                 Geom::Point motion_dt(desktop->w2d(motion_w));
                 m.preSnap(Inkscape::SnapCandidatePoint(motion_dt, Inkscape::SNAPSOURCE_NODE_HANDLE));
+                m.unSetup();
             }
             break;
         case GDK_BUTTON_RELEASE:
@@ -430,7 +431,7 @@ sp_spiral_drag(SPSpiralContext *sc, Geom::Point p, guint state)
     m.setup(desktop, true, sc->item);
     Geom::Point pt2g = to_2geom(p);
     m.freeSnapReturnByRef(pt2g, Inkscape::SNAPSOURCE_NODE_HANDLE);
-
+    m.unSetup();
     Geom::Point const p0 = desktop->dt2doc(sc->center);
     Geom::Point const p1 = desktop->dt2doc(pt2g);
 
index 63a15545f78b1deb9263edc4aa0301427dde9a43..9a2a67a57df229203b4d145ac172795d5b56fadb 100644 (file)
@@ -260,7 +260,7 @@ static gint sp_star_context_root_handler(SPEventContext *event_context, GdkEvent
             SnapManager &m = desktop->namedview->snap_manager;
             m.setup(desktop, true);
             m.freeSnapReturnByRef(sc->center, Inkscape::SNAPSOURCE_NODE_HANDLE);
-
+            m.unSetup();
             sp_canvas_item_grab(SP_CANVAS_ITEM(desktop->acetate),
                                 GDK_KEY_PRESS_MASK | GDK_BUTTON_RELEASE_MASK |
                                 GDK_POINTER_MOTION_MASK |
@@ -297,7 +297,9 @@ static gint sp_star_context_root_handler(SPEventContext *event_context, GdkEvent
 
             Geom::Point const motion_w(event->motion.x, event->motion.y);
             Geom::Point motion_dt(desktop->w2d(motion_w));
+
             m.preSnap(Inkscape::SnapCandidatePoint(motion_dt, Inkscape::SNAPSOURCE_NODE_HANDLE));
+            m.unSetup();
         }
         break;
     case GDK_BUTTON_RELEASE:
@@ -443,7 +445,7 @@ static void sp_star_drag(SPStarContext *sc, Geom::Point p, guint state)
     m.setup(desktop, true, sc->item);
     Geom::Point pt2g = to_2geom(p);
     m.freeSnapReturnByRef(pt2g, Inkscape::SNAPSOURCE_NODE_HANDLE);
-
+    m.unSetup();
     Geom::Point const p0 = desktop->dt2doc(sc->center);
     Geom::Point const p1 = desktop->dt2doc(pt2g);
 
index 0a64e7fa794bc83397517da6577943ec17712306..4a71174b7aaffa604b8f9b671293d25cf68878f1 100644 (file)
@@ -875,6 +875,7 @@ void ClipboardManagerImpl::_pasteDocument(SPDesktop *desktop, SPDocument *clipdo
             // get offset from mouse pointer to bbox center, snap to grid if enabled
             Geom::Point mouse_offset = desktop->point() - sel_bbox->midpoint();
             offset = m.multipleOfGridPitch(mouse_offset - offset, sel_bbox->midpoint() + offset) + offset;
+            m.unSetup();
         }
 
         sp_selection_move_relative(selection, offset);
index a8582ccc5d551017508f3f4e7cf49b5fd0f022ef..4c8cc74d8e0320e7a9ce297271f4bb6d1d633ef5 100644 (file)
@@ -274,8 +274,10 @@ void Handle::dragged(Geom::Point &new_pos, GdkEventMotion *event)
         } else {
             sm.freeSnapReturnByRef(new_pos, SNAPSOURCE_NODE_HANDLE);
         }
+        sm.unSetup();
     }
 
+
     // with Shift, if the node is cusp, rotate the other handle as well
     if (_parent->type() == NODE_CUSP && !_drag_out) {
         if (held_shift(*event)) {