+bool
+Editor::canvas_note_event (GdkEvent *event, ArdourCanvas::Item* item)
+{
+ if (!internal_editing()) {
+ return false;
+ }
+
+ return typed_event (item, event, NoteItem);
+}
+
+bool
+Editor::track_canvas_drag_motion (Glib::RefPtr<Gdk::DragContext> const & /*c*/, int x, int y, guint /*time*/)
+{
+ double wx;
+ double wy;
+ track_canvas->window_to_world (x, y, wx, wy);
+
+ GdkEvent event;
+ event.type = GDK_MOTION_NOTIFY;
+ event.button.x = wx;
+ event.button.y = wy;
+ /* assume we're dragging with button 1 */
+ event.motion.state = Gdk::BUTTON1_MASK;
+
+ if (!_drags->active ()) {
+
+ double px;
+ double py;
+ framepos_t const pos = event_frame (&event, &px, &py);
+
+ std::pair<TimeAxisView*, int> const tv = trackview_by_y_position (py);
+ if (tv.first == 0) {
+ return true;
+ }
+
+ RouteTimeAxisView* rtav = dynamic_cast<RouteTimeAxisView*> (tv.first);
+ if (rtav == 0 || !rtav->is_track ()) {
+ return true;
+ }
+
+ boost::shared_ptr<Region> region = _regions->get_dragged_region ();
+
+ if (!region) {
+ return true;
+ }
+
+ boost::shared_ptr<Region> region_copy = RegionFactory::create (region);
+
+ if (boost::dynamic_pointer_cast<AudioRegion> (region_copy) != 0 &&
+ dynamic_cast<AudioTimeAxisView*> (tv.first) == 0) {
+
+ /* audio -> non-audio */
+ return true;
+ }
+
+ if (boost::dynamic_pointer_cast<MidiRegion> (region_copy) == 0 &&
+ dynamic_cast<MidiTimeAxisView*> (tv.first) != 0) {
+
+ /* MIDI -> non-MIDI */
+ return true;
+ }
+
+ _drags->set (new RegionInsertDrag (this, region_copy, rtav, pos), &event);
+ }
+
+ _drags->motion_handler (&event, false);
+
+ return true;
+}
+
+bool
+Editor::key_press_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemType type)
+{
+ return false;
+}
+
+bool
+Editor::key_release_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemType type)
+{
+
+ bool handled = false;
+
+ switch (type) {
+ case TempoMarkerItem:
+ switch (event->key.keyval) {
+ case GDK_Delete:
+ remove_tempo_marker (item);
+ handled = true;
+ break;
+ default:
+ break;
+ }
+ break;
+
+ case MeterMarkerItem:
+ switch (event->key.keyval) {
+ case GDK_Delete:
+ remove_meter_marker (item);
+ handled = true;
+ break;
+ default:
+ break;
+ }
+ break;
+
+ default:
+ break;
+ }
+
+ return handled;
+}