X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=gtk2_ardour%2Feditor_canvas_events.cc;h=fd44ed3f2e3780d5fc3c4106675dbdff17517c39;hb=24af570d069ebd5410837dc8e2b5be9756e45d6d;hp=c176652547e3ba9b516d2af89b86ebac06455f90;hpb=bb9cc45cd22af67ac275a5e73accbe14fee664d8;p=ardour.git diff --git a/gtk2_ardour/editor_canvas_events.cc b/gtk2_ardour/editor_canvas_events.cc index c176652547..fd44ed3f2e 100644 --- a/gtk2_ardour/editor_canvas_events.cc +++ b/gtk2_ardour/editor_canvas_events.cc @@ -24,18 +24,16 @@ #include "pbd/stacktrace.h" -#include "ardour/audio_diskstream.h" -#include "ardour/audioplaylist.h" -#include "ardour/audioregion.h" -#include "ardour/region_factory.h" #include "ardour/midi_region.h" +#include "ardour/region_factory.h" +#include "ardour/profile.h" #include "editor.h" #include "keyboard.h" #include "public_editor.h" #include "audio_region_view.h" #include "audio_streamview.h" -#include "crossfade_view.h" +#include "canvas-noevent-text.h" #include "audio_time_axis.h" #include "region_gain_line.h" #include "automation_line.h" @@ -44,61 +42,43 @@ #include "control_point.h" #include "canvas_impl.h" #include "simplerect.h" -#include "interactive-item.h" #include "editor_drag.h" #include "midi_time_axis.h" #include "editor_regions.h" +#include "verbose_cursor.h" #include "i18n.h" -using namespace sigc; using namespace std; using namespace ARDOUR; using namespace PBD; using namespace Gtk; using namespace ArdourCanvas; +using Gtkmm2ext::Keyboard; + bool Editor::track_canvas_scroll (GdkEventScroll* ev) { - int x, y; - double wx, wy; - nframes64_t xdelta; + framepos_t xdelta; int direction = ev->direction; - Gnome::Canvas::Item* item = track_canvas->get_item_at(ev->x, ev->y); - InteractiveItem* interactive_item = dynamic_cast(item); - if (interactive_item) { - return interactive_item->on_event(reinterpret_cast(ev)); - } - retry: switch (direction) { case GDK_SCROLL_UP: if (Keyboard::modifier_state_equals (ev->state, Keyboard::PrimaryModifier)) { - //if (ev->state == GDK_CONTROL_MASK) { - /* XXX - the ev->x will be out of step with the canvas - if we're in mid zoom, so we have to get the damn mouse - pointer again - */ - track_canvas->get_pointer (x, y); - track_canvas->window_to_world (x, y, wx, wy); - - GdkEvent event; - event.type = GDK_BUTTON_RELEASE; - event.button.x = wx; - event.button.y = wy; - - nframes64_t where = event_frame (&event, 0, 0); - temporal_zoom_to_frame (false, where); + //for mouse-wheel zoom, force zoom-focus to mouse + Editing::ZoomFocus temp_focus = zoom_focus; + zoom_focus = Editing::ZoomFocusMouse; + temporal_zoom_step (false); + zoom_focus = temp_focus; return true; - } else if (Keyboard::modifier_state_equals (ev->state, Keyboard::SecondaryModifier)) { + } else if (Keyboard::modifier_state_equals (ev->state, Keyboard::TertiaryModifier)) { direction = GDK_SCROLL_LEFT; goto retry; - } else if (Keyboard::modifier_state_equals (ev->state, Keyboard::TertiaryModifier)) { + } else if (Keyboard::modifier_state_equals (ev->state, Keyboard::SecondaryModifier)) { if (!current_stepping_trackview) { - step_timeout = Glib::signal_timeout().connect (mem_fun(*this, &Editor::track_height_step_timeout), 500); + step_timeout = Glib::signal_timeout().connect (sigc::mem_fun(*this, &Editor::track_height_step_timeout), 500); std::pair const p = trackview_by_y_position (ev->y + vertical_adjustment.get_value() - canvas_timebars_vsize); current_stepping_trackview = p.first; if (!current_stepping_trackview) { @@ -106,7 +86,7 @@ Editor::track_canvas_scroll (GdkEventScroll* ev) } } last_track_height_step_timestamp = get_microseconds(); - current_stepping_trackview->step_height (true); + current_stepping_trackview->step_height (false); return true; } else { scroll_tracks_up_line (); @@ -116,24 +96,18 @@ Editor::track_canvas_scroll (GdkEventScroll* ev) case GDK_SCROLL_DOWN: if (Keyboard::modifier_state_equals (ev->state, Keyboard::PrimaryModifier)) { - //if (ev->state == GDK_CONTROL_MASK) { - track_canvas->get_pointer (x, y); - track_canvas->window_to_world (x, y, wx, wy); - - GdkEvent event; - event.type = GDK_BUTTON_RELEASE; - event.button.x = wx; - event.button.y = wy; - - nframes64_t where = event_frame (&event, 0, 0); - temporal_zoom_to_frame (true, where); + //for mouse-wheel zoom, force zoom-focus to mouse + Editing::ZoomFocus temp_focus = zoom_focus; + zoom_focus = Editing::ZoomFocusMouse; + temporal_zoom_step (true); + zoom_focus = temp_focus; return true; - } else if (Keyboard::modifier_state_equals (ev->state, Keyboard::SecondaryModifier)) { + } else if (Keyboard::modifier_state_equals (ev->state, Keyboard::TertiaryModifier)) { direction = GDK_SCROLL_RIGHT; goto retry; - } else if (Keyboard::modifier_state_equals (ev->state, Keyboard::TertiaryModifier)) { + } else if (Keyboard::modifier_state_equals (ev->state, Keyboard::SecondaryModifier)) { if (!current_stepping_trackview) { - step_timeout = Glib::signal_timeout().connect (mem_fun(*this, &Editor::track_height_step_timeout), 500); + step_timeout = Glib::signal_timeout().connect (sigc::mem_fun(*this, &Editor::track_height_step_timeout), 500); std::pair const p = trackview_by_y_position (ev->y + vertical_adjustment.get_value() - canvas_timebars_vsize); current_stepping_trackview = p.first; if (!current_stepping_trackview) { @@ -141,7 +115,7 @@ Editor::track_canvas_scroll (GdkEventScroll* ev) } } last_track_height_step_timestamp = get_microseconds(); - current_stepping_trackview->step_height (false); + current_stepping_trackview->step_height (true); return true; } else { scroll_tracks_down_line (); @@ -160,10 +134,10 @@ Editor::track_canvas_scroll (GdkEventScroll* ev) case GDK_SCROLL_RIGHT: xdelta = (current_page_frames() / 8); - if (max_frames - xdelta > leftmost_frame) { + if (max_framepos - xdelta > leftmost_frame) { reset_x_origin (leftmost_frame + xdelta); } else { - reset_x_origin (max_frames - current_page_frames()); + reset_x_origin (max_framepos - current_page_frames()); } break; @@ -179,8 +153,7 @@ bool Editor::track_canvas_scroll_event (GdkEventScroll *event) { track_canvas->grab_focus(); - track_canvas_scroll (event); - return false; + return track_canvas_scroll (event); } bool @@ -194,10 +167,8 @@ Editor::track_canvas_button_press_event (GdkEventButton */*event*/) bool Editor::track_canvas_button_release_event (GdkEventButton *event) { - if (_drag) { - _drag->end_grab ((GdkEvent*) event); - delete _drag; - _drag = 0; + if (_drags->active ()) { + _drags->end_grab ((GdkEvent*) event); } return false; } @@ -214,9 +185,8 @@ Editor::track_canvas_motion_notify_event (GdkEventMotion */*event*/) bool Editor::track_canvas_motion (GdkEvent *ev) { - if (verbose_cursor_visible) { - verbose_canvas_cursor->property_x() = clamp_verbose_cursor_x (ev->motion.x + 10); - verbose_canvas_cursor->property_y() = clamp_verbose_cursor_y (ev->motion.y + 10); + if (_verbose_cursor->visible ()) { + _verbose_cursor->set_position (ev->motion.x + 10, ev->motion.y + 10); } return false; @@ -248,6 +218,14 @@ Editor::typed_event (ArdourCanvas::Item* item, GdkEvent *event, ItemType type) ret = leave_handler (item, event, type); break; + case GDK_KEY_PRESS: + ret = key_press_handler (item, event, type); + break; + + case GDK_KEY_RELEASE: + ret = key_release_handler (item, event, type); + break; + default: break; } @@ -263,7 +241,6 @@ Editor::canvas_region_view_event (GdkEvent *event, ArdourCanvas::Item* item, Reg return false; } - switch (event->type) { case GDK_BUTTON_PRESS: case GDK_2BUTTON_PRESS: @@ -312,7 +289,7 @@ Editor::canvas_stream_view_event (GdkEvent *event, ArdourCanvas::Item* item, Rou clicked_regionview = 0; clicked_control_point = 0; clicked_axisview = tv; - clicked_routeview = dynamic_cast(tv); + clicked_routeview = dynamic_cast(clicked_axisview); ret = button_press_handler (item, event, StreamItem); break; @@ -378,6 +355,76 @@ Editor::canvas_automation_track_event (GdkEvent *event, ArdourCanvas::Item* item return ret; } +bool +Editor::canvas_start_xfade_event (GdkEvent *event, ArdourCanvas::Item* item, AudioRegionView *rv) +{ + if (!rv->sensitive()) { + return false; + } + + switch (event->type) { + case GDK_BUTTON_PRESS: + clicked_regionview = rv; + clicked_control_point = 0; + clicked_axisview = &rv->get_time_axis_view(); + clicked_routeview = dynamic_cast(clicked_axisview); + if (event->button.button == 3) { + return button_press_handler (item, event, StartCrossFadeItem); + } + break; + + case GDK_BUTTON_RELEASE: + if (event->button.button == 3) { + return button_release_handler (item, event, StartCrossFadeItem); + } + break; + + default: + break; + + } + + /* In Mixbus, the crossfade area is used to trim the region while leaving the fade anchor intact (see preserve_fade_anchor)*/ + /* however in A3 this feature is unfinished, and it might be better to do it with a modifier-trim instead, anyway */ + /* if we return RegionItem here then we avoid the issue until it is resolved later */ + return typed_event (item, event, RegionItem); // StartCrossFadeItem); +} + +bool +Editor::canvas_end_xfade_event (GdkEvent *event, ArdourCanvas::Item* item, AudioRegionView *rv) +{ + if (!rv->sensitive()) { + return false; + } + + switch (event->type) { + case GDK_BUTTON_PRESS: + clicked_regionview = rv; + clicked_control_point = 0; + clicked_axisview = &rv->get_time_axis_view(); + clicked_routeview = dynamic_cast(clicked_axisview); + if (event->button.button == 3) { + return button_press_handler (item, event, EndCrossFadeItem); + } + break; + + case GDK_BUTTON_RELEASE: + if (event->button.button == 3) { + return button_release_handler (item, event, EndCrossFadeItem); + } + break; + + default: + break; + + } + + /* In Mixbus, the crossfade area is used to trim the region while leaving the fade anchor intact (see preserve_fade_anchor)*/ + /* however in A3 this feature is unfinished, and it might be better to do it with a modifier-trim instead, anyway */ + /* if we return RegionItem here then we avoid the issue until it is resolved later */ + return typed_event (item, event, RegionItem); // EndCrossFadeItem); +} + bool Editor::canvas_fade_in_event (GdkEvent *event, ArdourCanvas::Item* item, AudioRegionView *rv) { @@ -436,6 +483,7 @@ Editor::canvas_fade_in_handle_event (GdkEvent *event, ArdourCanvas::Item* item, case GDK_BUTTON_RELEASE: ret = button_release_handler (item, event, FadeInHandleItem); + maybe_locate_with_edit_preroll ( rv->region()->position() ); break; case GDK_MOTION_NOTIFY: @@ -443,10 +491,12 @@ Editor::canvas_fade_in_handle_event (GdkEvent *event, ArdourCanvas::Item* item, break; case GDK_ENTER_NOTIFY: + set_entered_regionview (rv); ret = enter_handler (item, event, FadeInHandleItem); break; case GDK_LEAVE_NOTIFY: + set_entered_regionview (0); ret = leave_handler (item, event, FadeInHandleItem); break; @@ -515,6 +565,7 @@ Editor::canvas_fade_out_handle_event (GdkEvent *event, ArdourCanvas::Item* item, case GDK_BUTTON_RELEASE: ret = button_release_handler (item, event, FadeOutHandleItem); + maybe_locate_with_edit_preroll ( rv->region()->last_frame() - rv->get_fade_out_shape_width() ); break; case GDK_MOTION_NOTIFY: @@ -522,10 +573,12 @@ Editor::canvas_fade_out_handle_event (GdkEvent *event, ArdourCanvas::Item* item, break; case GDK_ENTER_NOTIFY: + set_entered_regionview (rv); ret = enter_handler (item, event, FadeOutHandleItem); break; case GDK_LEAVE_NOTIFY: + set_entered_regionview (0); ret = leave_handler (item, event, FadeOutHandleItem); break; @@ -542,112 +595,6 @@ struct DescendingRegionLayerSorter { } }; -bool -Editor::canvas_crossfade_view_event (GdkEvent* event, ArdourCanvas::Item* item, CrossfadeView* xfv) -{ - /* we handle only button 3 press/release events */ - - switch (event->type) { - case GDK_BUTTON_PRESS: - clicked_crossfadeview = xfv; - clicked_axisview = &clicked_crossfadeview->get_time_axis_view(); - if (event->button.button == 3) { - return button_press_handler (item, event, CrossfadeViewItem); - } - break; - - case GDK_BUTTON_RELEASE: - if (event->button.button == 3) { - bool ret = button_release_handler (item, event, CrossfadeViewItem); - return ret; - } - break; - - default: - break; - - } - - /* XXX do not forward double clicks */ - - if (event->type == GDK_2BUTTON_PRESS) { - return false; - } - - /* proxy for an underlying regionview */ - - /* XXX really need to check if we are in the name highlight, - and proxy to that when required. - */ - - TimeAxisView& tv (xfv->get_time_axis_view()); - AudioTimeAxisView* atv; - - if ((atv = dynamic_cast(&tv)) != 0) { - - if (atv->is_audio_track()) { - - boost::shared_ptr pl; - if ((pl = boost::dynamic_pointer_cast (atv->get_diskstream()->playlist())) != 0) { - - Playlist::RegionList* rl = pl->regions_at (event_frame (event)); - if (!rl->empty()) { - - if (atv->layer_display() == Overlaid) { - - /* we're in overlaid mode; proxy to the uppermost region view */ - - DescendingRegionLayerSorter cmp; - rl->sort (cmp); - - RegionView* rv = atv->view()->find_view (rl->front()); - - delete rl; - - /* proxy */ - return canvas_region_view_event (event, rv->get_canvas_group(), rv); - - } else { - - /* we're in stacked mode; proxy to the region view under the mouse */ - - /* XXX: FIXME: this is an evil hack; it assumes that any event for which - this proxy is being used has its GdkEvent laid out such that the y - member is in the same place as that for a GdkEventButton */ - - /* position of the event within the track */ - double cx = event->button.x; - double cy = event->button.y; - atv->view()->canvas_item()->w2i (cx, cy); - - /* hence layer that we're over */ - double const c = atv->view()->child_height (); - layer_t const l = pl->top_layer () + 1 - (cy / c); - - /* hence region */ - Playlist::RegionList::iterator i = rl->begin(); - while (i != rl->end() && (*i)->layer() != l) { - ++i; - } - - if (i != rl->end()) { - RegionView* rv = atv->view()->find_view (*i); - delete rl; - - /* proxy */ - return canvas_region_view_event (event, rv->get_canvas_group(), rv); - } - } - } - - delete rl; - } - } - } - - return TRUE; -} - bool Editor::canvas_control_point_event (GdkEvent *event, ArdourCanvas::Item* item, ControlPoint* cp) { @@ -805,6 +752,14 @@ Editor::canvas_frame_handle_event (GdkEvent* event, ArdourCanvas::Item* item, Re perspective. XXX change this ?? */ + ItemType type; + + if (item->get_data ("isleft")) { + type = LeftFrameHandle; + } else { + type = RightFrameHandle; + } + switch (event->type) { case GDK_BUTTON_PRESS: case GDK_2BUTTON_PRESS: @@ -813,20 +768,22 @@ Editor::canvas_frame_handle_event (GdkEvent* event, ArdourCanvas::Item* item, Re clicked_control_point = 0; clicked_axisview = &clicked_regionview->get_time_axis_view(); clicked_routeview = dynamic_cast(clicked_axisview); - ret = button_press_handler (item, event, RegionViewNameHighlight); + ret = button_press_handler (item, event, type); break; case GDK_BUTTON_RELEASE: - ret = button_release_handler (item, event, RegionViewNameHighlight); + ret = button_release_handler (item, event, type); break; case GDK_MOTION_NOTIFY: ret = motion_handler (item, event); break; case GDK_ENTER_NOTIFY: - ret = enter_handler (item, event, RegionViewNameHighlight); + set_entered_regionview (rv); + ret = enter_handler (item, event, type); break; case GDK_LEAVE_NOTIFY: - ret = leave_handler (item, event, RegionViewNameHighlight); + set_entered_regionview (0); + ret = leave_handler (item, event, type); break; default: @@ -860,13 +817,16 @@ Editor::canvas_region_view_name_highlight_event (GdkEvent* event, ArdourCanvas:: ret = button_release_handler (item, event, RegionViewNameHighlight); break; case GDK_MOTION_NOTIFY: - ret = motion_handler (item, event); + motion_handler (item, event); + ret = true; // force this to avoid progagating the event into the regionview break; case GDK_ENTER_NOTIFY: + set_entered_regionview (rv); ret = enter_handler (item, event, RegionViewNameHighlight); break; case GDK_LEAVE_NOTIFY: + set_entered_regionview (0); ret = leave_handler (item, event, RegionViewNameHighlight); break; @@ -903,10 +863,12 @@ Editor::canvas_region_view_name_event (GdkEvent *event, ArdourCanvas::Item* item ret = motion_handler (item, event); break; case GDK_ENTER_NOTIFY: + set_entered_regionview (rv); ret = enter_handler (item, event, RegionViewName); break; case GDK_LEAVE_NOTIFY: + set_entered_regionview (0); ret = leave_handler (item, event, RegionViewName); break; @@ -917,6 +879,45 @@ Editor::canvas_region_view_name_event (GdkEvent *event, ArdourCanvas::Item* item return ret; } +bool +Editor::canvas_feature_line_event (GdkEvent *event, ArdourCanvas::Item* item, RegionView*) +{ + bool ret = false; + + switch (event->type) { + case GDK_BUTTON_PRESS: + case GDK_2BUTTON_PRESS: + case GDK_3BUTTON_PRESS: + clicked_regionview = 0; + clicked_control_point = 0; + clicked_axisview = 0; + clicked_routeview = 0; //dynamic_cast(clicked_axisview); + ret = button_press_handler (item, event, FeatureLineItem); + break; + + case GDK_BUTTON_RELEASE: + ret = button_release_handler (item, event, FeatureLineItem); + break; + + case GDK_MOTION_NOTIFY: + ret = motion_handler (item, event); + break; + + case GDK_ENTER_NOTIFY: + ret = enter_handler (item, event, FeatureLineItem); + break; + + case GDK_LEAVE_NOTIFY: + ret = leave_handler (item, event, FeatureLineItem); + break; + + default: + break; + } + + return ret; +} + bool Editor::canvas_marker_event (GdkEvent *event, ArdourCanvas::Item* item, Marker* /*marker*/) { @@ -947,6 +948,12 @@ Editor::canvas_cd_marker_bar_event (GdkEvent *event, ArdourCanvas::Item* item) return typed_event (item, event, CdMarkerBarItem); } +bool +Editor::canvas_videotl_bar_event (GdkEvent *event, ArdourCanvas::Item* item) +{ + return typed_event (item, event, VideoBarItem); +} + bool Editor::canvas_tempo_marker_event (GdkEvent *event, ArdourCanvas::Item* item, TempoMarker* /*marker*/) { @@ -994,58 +1001,192 @@ Editor::canvas_note_event (GdkEvent *event, ArdourCanvas::Item* item) } bool -Editor::track_canvas_drag_motion (Glib::RefPtr const & /*c*/, int x, int y, guint /*time*/) +Editor::track_canvas_drag_motion (Glib::RefPtr const& context, int x, int y, guint time) { double wx; double wy; + boost::shared_ptr region; + boost::shared_ptr region_copy; + RouteTimeAxisView* rtav; + GdkEvent event; + double px; + double py; + + string target = track_canvas->drag_dest_find_target (context, track_canvas->drag_dest_get_target_list()); + + if (target.empty()) { + return false; + } + 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 (_drag == 0) { + (void) event_frame (&event, &px, &py); - double px; - double py; - nframes64_t const pos = event_frame (&event, &px, &py); + std::pair const tv = trackview_by_y_position (py); + bool can_drop = false; + + if (tv.first != 0) { - std::pair const tv = trackview_by_y_position (py); - if (tv.first == 0) { - return true; + /* over a time axis view of some kind */ + + rtav = dynamic_cast (tv.first); + + if (rtav != 0 && rtav->is_track ()) { + /* over a track, not a bus */ + can_drop = true; } + + + } else { + /* not over a time axis view, so drop is possible */ + can_drop = true; + } - RouteTimeAxisView* rtav = dynamic_cast (tv.first); - if (rtav == 0 || !rtav->is_track ()) { + if (can_drop) { + region = _regions->get_dragged_region (); + + if (region) { + + if ((boost::dynamic_pointer_cast (region) != 0 && + dynamic_cast (tv.first) != 0) || + (boost::dynamic_pointer_cast (region) != 0 && + dynamic_cast (tv.first) != 0)) { + + /* audio to audio + OR + midi to midi + */ + + context->drag_status (context->get_suggested_action(), time); + return true; + } + } else { + /* DND originating from outside ardour + * + * TODO: check if file is audio/midi, allow drops on same track-type only, + * currently: if audio is dropped on a midi-track, it is only added to the region-list + */ + if (Profile->get_sae() || Config->get_only_copy_imported_files()) { + context->drag_status(Gdk::ACTION_COPY, time); + } else { + if ((context->get_actions() & (Gdk::ACTION_COPY | Gdk::ACTION_LINK | Gdk::ACTION_MOVE)) == Gdk::ACTION_COPY) { + context->drag_status(Gdk::ACTION_COPY, time); + } else { + context->drag_status(Gdk::ACTION_LINK, time); + } + } return true; } + } - boost::shared_ptr region = _regions->get_dragged_region (); + /* no drop here */ + context->drag_status (Gdk::DragAction (0), time); + return false; +} - boost::shared_ptr region_copy = RegionFactory::create (region); +void +Editor::drop_regions (const Glib::RefPtr& /*context*/, + int x, int y, + const SelectionData& /*data*/, + guint /*info*/, guint /*time*/) +{ + double wx; + double wy; + boost::shared_ptr region; + boost::shared_ptr region_copy; + RouteTimeAxisView* rtav; + GdkEvent event; + double px; + double py; - if (boost::dynamic_pointer_cast (region_copy) != 0 && - dynamic_cast (tv.first) == 0) { + track_canvas->window_to_world (x, y, wx, wy); - /* audio -> non-audio */ - return true; + 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; + + framepos_t const pos = event_frame (&event, &px, &py); + + std::pair const tv = trackview_by_y_position (py); + + if (tv.first != 0) { + + rtav = dynamic_cast (tv.first); + + if (rtav != 0 && rtav->is_track ()) { + + boost::shared_ptr region = _regions->get_dragged_region (); + + if (region) { + + region_copy = RegionFactory::create (region, true); + + + if ((boost::dynamic_pointer_cast (region_copy) != 0 && + dynamic_cast (tv.first) != 0) || + (boost::dynamic_pointer_cast (region_copy) != 0 && + dynamic_cast (tv.first) != 0)) { + + /* audio to audio + OR + midi to midi + */ + + + _drags->set (new RegionInsertDrag (this, region_copy, rtav, pos), &event); + _drags->end_grab (0); + } + } } + } +} - if (boost::dynamic_pointer_cast (region_copy) == 0 && - dynamic_cast (tv.first) != 0) { +bool +Editor::key_press_handler (ArdourCanvas::Item*, GdkEvent*, ItemType) +{ + return false; +} - /* MIDI -> non-MIDI */ - return true; +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; - _drag = new RegionInsertDrag (this, region_copy, rtav, pos); - _drag->start_grab (&event); - } + case MeterMarkerItem: + switch (event->key.keyval) { + case GDK_Delete: + remove_meter_marker (item); + handled = true; + break; + default: + break; + } + break; - _drag->motion_handler (&event, false); + default: + break; + } - return true; + return handled; }