protected override bool OnMotionNotifyEvent(Gdk.EventMotion evnt) { double dx = evnt.X; double dy = evnt.Y; if (MouseGrabNode != null) { if (MouseGrabNode.Draggable && evnt.State.HasFlag(Gdk.ModifierType.Button1Mask)) { if (!dragging && (Math.Abs(DragStart.X - dx) > 5 || Math.Abs(DragStart.Y - dy) > 5)) { dragging = true; } if (dragging) { var point = engine.TransformPoint(MouseGrabNode.Parent, dx, dy); MouseGrabNode.X = point.X - DragOffset.X; MouseGrabNode.Y = point.Y - DragOffset.Y; QueueDraw(); } } else { var point = engine.TransformPoint(MouseGrabNode, evnt.X, evnt.Y); MouseGrabNode.MouseMotion(point.X, point.Y, (ModifierType)evnt.State); } } else { HoveredNode = engine.InputNodeAt(root, evnt.X, evnt.Y); if (HoveredNode != null) { var point = engine.TransformPoint(HoveredNode, evnt.X, evnt.Y); HoveredNode.MouseMotion(point.X, point.Y, (ModifierType)evnt.State); } } return(base.OnMotionNotifyEvent(evnt)); }