summaryrefslogtreecommitdiffstats
path: root/src/ui/tool/control-point.cpp
diff options
context:
space:
mode:
authorKris De Gussem <kris.degussem@gmail.com>2012-07-12 22:10:43 +0000
committerKris <Kris.De.Gussem@hotmail.com>2012-07-12 22:10:43 +0000
commitdd870f605bac1a4c16611969ea8e57021b99887b (patch)
tree184528ee762119634ac580b42d0b9a64de7089fd /src/ui/tool/control-point.cpp
parentTranslations. Fix for Bug #425202 (Script messages not translated). (diff)
downloadinkscape-dd870f605bac1a4c16611969ea8e57021b99887b.tar.gz
inkscape-dd870f605bac1a4c16611969ea8e57021b99887b.zip
Bug #781893 (Crash after moving a Bezier node after Knot path effect)
Although issue not solved, prevent Inkscape from crashing. Add some code to make code more robust. (bzr r11547)
Diffstat (limited to 'src/ui/tool/control-point.cpp')
-rw-r--r--src/ui/tool/control-point.cpp64
1 files changed, 47 insertions, 17 deletions
diff --git a/src/ui/tool/control-point.cpp b/src/ui/tool/control-point.cpp
index fbc9858cc..8c4924f26 100644
--- a/src/ui/tool/control-point.cpp
+++ b/src/ui/tool/control-point.cpp
@@ -211,6 +211,9 @@ void ControlPoint::_setPixbuf(Glib::RefPtr<Gdk::Pixbuf> p)
// re-routes events into the virtual function
int ControlPoint::_event_handler(SPCanvasItem */*item*/, GdkEvent *event, ControlPoint *point)
{
+ if ((point == NULL) || (point->_desktop == NULL)) {
+ return FALSE;
+ }
return point->_eventHandler(point->_desktop->event_context, event) ? TRUE : FALSE;
}
@@ -220,6 +223,24 @@ bool ControlPoint::_eventHandler(SPEventContext *event_context, GdkEvent *event)
// NOTE the static variables below are shared for all points!
// TODO handle clicks and drags from other buttons too
+ if (event == NULL)
+ {
+ return false;
+ }
+
+ if (event_context == NULL)
+ {
+ return false;
+ }
+ if (_desktop == NULL)
+ {
+ return false;
+ }
+ if(event_context->desktop !=_desktop)
+ {
+ g_warning ("ControlPoint: desktop pointers not equal!");
+ //return false;
+ }
// offset from the pointer hotspot to the center of the grabbed knot in desktop coords
static Geom::Point pointer_offset;
// number of last doubleclicked button
@@ -227,7 +248,8 @@ bool ControlPoint::_eventHandler(SPEventContext *event_context, GdkEvent *event)
Inkscape::Preferences *prefs = Inkscape::Preferences::get();
int drag_tolerance = prefs->getIntLimited("/options/dragtolerance/value", 0, 0, 100);
-
+ GdkEventMotion em;
+ SPCanvas* Ca;
switch(event->type)
{
case GDK_BUTTON_PRESS:
@@ -253,18 +275,22 @@ bool ControlPoint::_eventHandler(SPEventContext *event_context, GdkEvent *event)
return true;
case GDK_MOTION_NOTIFY:
- combine_motion_events(_desktop->canvas, event->motion, 0);
- if (_event_grab && !_desktop->event_context->space_panning) {
+ Ca = _desktop->canvas;
+ em = event->motion;
+ combine_motion_events(Ca, em, 0);
+ if (_event_grab && ! event_context->space_panning) {
_desktop->snapindicator->remove_snaptarget();
bool transferred = false;
if (!_drag_initiated) {
- bool t = fabs(event->motion.x - _drag_event_origin[Geom::X]) <= drag_tolerance &&
- fabs(event->motion.y - _drag_event_origin[Geom::Y]) <= drag_tolerance;
- if (t) return true;
+ bool t = fabs(em.x - _drag_event_origin[Geom::X]) <= drag_tolerance &&
+ fabs(em.y - _drag_event_origin[Geom::Y]) <= drag_tolerance;
+ if (t){
+ return true;
+ }
// if we are here, it means the tolerance was just exceeded.
_drag_origin = _position;
- transferred = grabbed(&event->motion);
+ transferred = grabbed(&em);
// _drag_initiated might change during the above virtual call
if (!_drag_initiated) {
// this guarantees smooth redraws while dragging
@@ -275,15 +301,14 @@ bool ControlPoint::_eventHandler(SPEventContext *event_context, GdkEvent *event)
if (!transferred) {
// dragging in progress
Geom::Point new_pos = _desktop->w2d(event_point(event->motion)) + pointer_offset;
-
// the new position is passed by reference and can be changed in the handlers.
- dragged(new_pos, &event->motion);
+ dragged(new_pos, &em);
move(new_pos);
- _updateDragTip(&event->motion); // update dragging tip after moving to new position
+ _updateDragTip(&em); // update dragging tip after moving to new position
_desktop->scroll_to_point(new_pos);
_desktop->set_coordinate_status(_position);
- sp_event_context_snap_delay_handler(_desktop->event_context, NULL,
+ sp_event_context_snap_delay_handler(event_context, NULL,
(gpointer) this, &event->motion,
DelayedSnapEvent::CONTROL_POINT_HANDLER);
}
@@ -299,8 +324,9 @@ bool ControlPoint::_eventHandler(SPEventContext *event_context, GdkEvent *event)
// We must snap at some point in time though, and this is our last chance)
// PS: For other contexts this is handled already in sp_event_context_item_handler or
// sp_event_context_root_handler
- if (_desktop->event_context->_delayed_snap_event) {
- sp_event_context_snap_watchdog_callback(_desktop->event_context->_delayed_snap_event);
+ //if (_desktop && _desktop->event_context && _desktop->event_context->_delayed_snap_event) {
+ if (event_context->_delayed_snap_event) {
+ sp_event_context_snap_watchdog_callback(event_context->_delayed_snap_event);
}
sp_canvas_item_ungrab(_canvas_item, event->button.time);
@@ -335,8 +361,9 @@ bool ControlPoint::_eventHandler(SPEventContext *event_context, GdkEvent *event)
if (_event_grab && !event->grab_broken.keyboard) {
{
ungrabbed(NULL);
- if (_drag_initiated)
+ if (_drag_initiated) {
_desktop->canvas->endForcedFullRedraws();
+ }
}
_setState(STATE_NORMAL);
_event_grab = false;
@@ -355,7 +382,7 @@ bool ControlPoint::_eventHandler(SPEventContext *event_context, GdkEvent *event)
if (!_drag_initiated) break;
// temporarily disable snapping - we might snap to a different place than we were initially
- sp_event_context_discard_delayed_snap_event(_desktop->event_context);
+ sp_event_context_discard_delayed_snap_event(event_context);
SnapPreferences &snapprefs = _desktop->namedview->snap_manager.snapprefs;
bool snap_save = snapprefs.getSnapEnabledGlobally();
snapprefs.setSnapEnabledGlobally(false);
@@ -389,7 +416,8 @@ bool ControlPoint::_eventHandler(SPEventContext *event_context, GdkEvent *event)
ungrabbed(NULL); // ungrabbed handlers can handle a NULL event
snapprefs.setSnapEnabledGlobally(snap_save);
- } return true;
+ }
+ return true;
case GDK_KEY_Tab:
{// Downcast from ControlPoint to TransformHandle, if possible
// This is an ugly hack; we should have the transform handle intercept the keystrokes itself
@@ -415,7 +443,9 @@ bool ControlPoint::_eventHandler(SPEventContext *event_context, GdkEvent *event)
}
// Do not break here, to allow for updating tooltips and such
case GDK_KEY_RELEASE:
- if (mouseovered_point != this) return false;
+ if (mouseovered_point != this){
+ return false;
+ }
if (_drag_initiated) {
return true; // this prevents the tool from overwriting the drag tip
} else {