From a329a44cc10c7b0772dc1dc5d3c66a90b117d346 Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Tue, 11 Feb 2014 22:49:10 -0500 Subject: [PATCH] when delivering canvas events, if an item is grabbed, use it in preference to Canvas::_current_item, but still propagate to its ancestors if left unhandled --- libs/canvas/canvas.cc | 19 +++++++------------ 1 file changed, 7 insertions(+), 12 deletions(-) diff --git a/libs/canvas/canvas.cc b/libs/canvas/canvas.cc index 8a31d1fa9f..e08ef8d653 100644 --- a/libs/canvas/canvas.cc +++ b/libs/canvas/canvas.cc @@ -506,20 +506,24 @@ GtkCanvas::deliver_event (GdkEvent* event) { /* Point in in canvas coordinate space */ + const Item* event_item; + if (_grabbed_item) { /* we have a grabbed item, so everything gets sent there */ DEBUG_TRACE (PBD::DEBUG::CanvasEvents, string_compose ("%1 %2 (%3) was grabbed, send event there\n", _grabbed_item, _grabbed_item->whatami(), _grabbed_item->name)); - return _grabbed_item->Event (event); + event_item = _grabbed_item; + } else { + event_item = _current_item; } - if (!_current_item) { + if (!event_item) { return false; } /* run through the items from child to parent, until one claims the event */ - Item* item = const_cast (_current_item); + Item* item = const_cast (event_item); while (item) { @@ -677,15 +681,6 @@ GtkCanvas::on_motion_notify_event (GdkEventMotion* ev) // DEBUG_TRACE (PBD::DEBUG::CanvasEvents, string_compose ("canvas motion @ %1, %2\n", ev->x, ev->y)); - if (_grabbed_item) { - /* if we have a grabbed item, it gets just the motion event, - since no enter/leave events can have happened. - */ - DEBUG_TRACE (PBD::DEBUG::CanvasEvents, string_compose ("%1 %2 (%3) was grabbed, send MOTION event there\n", - _grabbed_item, _grabbed_item->whatami(), _grabbed_item->name)); - return _grabbed_item->Event (reinterpret_cast (©)); - } - pick_current_item (where, ev->state); /* Now deliver the motion event. It may seem a little inefficient -- 2.30.2