summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Davis <paul@linuxaudiosystems.com>2014-02-11 22:49:10 -0500
committerPaul Davis <paul@linuxaudiosystems.com>2014-02-11 22:49:10 -0500
commita329a44cc10c7b0772dc1dc5d3c66a90b117d346 (patch)
treea25bfb3d64e27335835082339646c942b44b38e1
parent50a014acf0d7a3d9c57fd36e32836400eeefbd59 (diff)
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
-rw-r--r--libs/canvas/canvas.cc19
1 files 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<Item*> (_current_item);
+ Item* item = const_cast<Item*> (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<GdkEvent*> (&copy));
- }
-
pick_current_item (where, ev->state);
/* Now deliver the motion event. It may seem a little inefficient