2 Copyright (C) 2000 Paul Davis
4 This program is free software; you can redistribute it and/or modify
5 it under the terms of the GNU General Public License as published by
6 the Free Software Foundation; either version 2 of the License, or
7 (at your option) any later version.
9 This program is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 GNU General Public License for more details.
14 You should have received a copy of the GNU General Public License
15 along with this program; if not, write to the Free Software
16 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
25 #include "pbd/stacktrace.h"
27 #include "ardour/audioplaylist.h"
28 #include "ardour/audioregion.h"
29 #include "ardour/region_factory.h"
30 #include "ardour/midi_region.h"
34 #include "public_editor.h"
35 #include "audio_region_view.h"
36 #include "audio_streamview.h"
37 #include "canvas-noevent-text.h"
38 #include "audio_time_axis.h"
39 #include "region_gain_line.h"
40 #include "automation_line.h"
41 #include "automation_time_axis.h"
42 #include "automation_line.h"
43 #include "control_point.h"
44 #include "canvas_impl.h"
45 #include "simplerect.h"
46 #include "editor_drag.h"
47 #include "midi_time_axis.h"
48 #include "editor_regions.h"
49 #include "verbose_cursor.h"
54 using namespace ARDOUR;
57 using namespace ArdourCanvas;
59 using Gtkmm2ext::Keyboard;
62 Editor::track_canvas_scroll (GdkEventScroll* ev)
65 int direction = ev->direction;
70 if (Keyboard::modifier_state_equals (ev->state, Keyboard::PrimaryModifier)) {
71 temporal_zoom_step (false);
73 } else if (Keyboard::modifier_state_equals (ev->state, Keyboard::SecondaryModifier)) {
74 direction = GDK_SCROLL_LEFT;
76 } else if (Keyboard::modifier_state_equals (ev->state, Keyboard::TertiaryModifier)) {
77 if (!current_stepping_trackview) {
78 step_timeout = Glib::signal_timeout().connect (sigc::mem_fun(*this, &Editor::track_height_step_timeout), 500);
79 std::pair<TimeAxisView*, int> const p = trackview_by_y_position (ev->y + vertical_adjustment.get_value() - canvas_timebars_vsize);
80 current_stepping_trackview = p.first;
81 if (!current_stepping_trackview) {
85 last_track_height_step_timestamp = get_microseconds();
86 current_stepping_trackview->step_height (false);
89 scroll_tracks_up_line ();
95 if (Keyboard::modifier_state_equals (ev->state, Keyboard::PrimaryModifier)) {
96 temporal_zoom_step (true);
98 } else if (Keyboard::modifier_state_equals (ev->state, Keyboard::SecondaryModifier)) {
99 direction = GDK_SCROLL_RIGHT;
101 } else if (Keyboard::modifier_state_equals (ev->state, Keyboard::TertiaryModifier)) {
102 if (!current_stepping_trackview) {
103 step_timeout = Glib::signal_timeout().connect (sigc::mem_fun(*this, &Editor::track_height_step_timeout), 500);
104 std::pair<TimeAxisView*, int> const p = trackview_by_y_position (ev->y + vertical_adjustment.get_value() - canvas_timebars_vsize);
105 current_stepping_trackview = p.first;
106 if (!current_stepping_trackview) {
110 last_track_height_step_timestamp = get_microseconds();
111 current_stepping_trackview->step_height (true);
114 scroll_tracks_down_line ();
119 case GDK_SCROLL_LEFT:
120 xdelta = (current_page_frames() / 8);
121 if (leftmost_frame > xdelta) {
122 reset_x_origin (leftmost_frame - xdelta);
128 case GDK_SCROLL_RIGHT:
129 xdelta = (current_page_frames() / 8);
130 if (max_framepos - xdelta > leftmost_frame) {
131 reset_x_origin (leftmost_frame + xdelta);
133 reset_x_origin (max_framepos - current_page_frames());
146 Editor::track_canvas_scroll_event (GdkEventScroll *event)
148 track_canvas->grab_focus();
149 return track_canvas_scroll (event);
153 Editor::track_canvas_button_press_event (GdkEventButton */*event*/)
156 track_canvas->grab_focus();
161 Editor::track_canvas_button_release_event (GdkEventButton *event)
163 if (_drags->active ()) {
164 _drags->end_grab ((GdkEvent*) event);
170 Editor::track_canvas_motion_notify_event (GdkEventMotion */*event*/)
173 /* keep those motion events coming */
174 track_canvas->get_pointer (x, y);
179 Editor::track_canvas_motion (GdkEvent *ev)
181 if (_verbose_cursor->visible ()) {
182 _verbose_cursor->set_position (ev->motion.x + 10, ev->motion.y + 10);
189 Editor::typed_event (ArdourCanvas::Item* item, GdkEvent *event, ItemType type)
193 switch (event->type) {
194 case GDK_BUTTON_PRESS:
195 case GDK_2BUTTON_PRESS:
196 case GDK_3BUTTON_PRESS:
197 ret = button_press_handler (item, event, type);
199 case GDK_BUTTON_RELEASE:
200 ret = button_release_handler (item, event, type);
202 case GDK_MOTION_NOTIFY:
203 ret = motion_handler (item, event);
206 case GDK_ENTER_NOTIFY:
207 ret = enter_handler (item, event, type);
210 case GDK_LEAVE_NOTIFY:
211 ret = leave_handler (item, event, type);
215 ret = key_press_handler (item, event, type);
218 case GDK_KEY_RELEASE:
219 ret = key_release_handler (item, event, type);
229 Editor::canvas_region_view_event (GdkEvent *event, ArdourCanvas::Item* item, RegionView *rv)
233 if (!rv->sensitive ()) {
237 switch (event->type) {
238 case GDK_BUTTON_PRESS:
239 case GDK_2BUTTON_PRESS:
240 case GDK_3BUTTON_PRESS:
241 clicked_regionview = rv;
242 clicked_control_point = 0;
243 clicked_axisview = &rv->get_time_axis_view();
244 clicked_routeview = dynamic_cast<RouteTimeAxisView*>(clicked_axisview);
245 ret = button_press_handler (item, event, RegionItem);
248 case GDK_BUTTON_RELEASE:
249 ret = button_release_handler (item, event, RegionItem);
252 case GDK_MOTION_NOTIFY:
253 ret = motion_handler (item, event);
256 case GDK_ENTER_NOTIFY:
257 set_entered_track (&rv->get_time_axis_view ());
258 set_entered_regionview (rv);
261 case GDK_LEAVE_NOTIFY:
262 set_entered_track (0);
263 set_entered_regionview (0);
274 Editor::canvas_stream_view_event (GdkEvent *event, ArdourCanvas::Item* item, RouteTimeAxisView *tv)
278 switch (event->type) {
279 case GDK_BUTTON_PRESS:
280 case GDK_2BUTTON_PRESS:
281 case GDK_3BUTTON_PRESS:
282 clicked_regionview = 0;
283 clicked_control_point = 0;
284 clicked_axisview = tv;
285 clicked_routeview = dynamic_cast<RouteTimeAxisView*>(clicked_axisview);
286 ret = button_press_handler (item, event, StreamItem);
289 case GDK_BUTTON_RELEASE:
290 ret = button_release_handler (item, event, StreamItem);
293 case GDK_MOTION_NOTIFY:
294 ret = motion_handler (item, event);
297 case GDK_ENTER_NOTIFY:
298 set_entered_track (tv);
301 case GDK_LEAVE_NOTIFY:
302 set_entered_track (0);
313 Editor::canvas_automation_track_event (GdkEvent *event, ArdourCanvas::Item* item, AutomationTimeAxisView *atv)
317 switch (event->type) {
318 case GDK_BUTTON_PRESS:
319 case GDK_2BUTTON_PRESS:
320 case GDK_3BUTTON_PRESS:
321 clicked_regionview = 0;
322 clicked_control_point = 0;
323 clicked_axisview = atv;
324 clicked_routeview = 0;
325 ret = button_press_handler (item, event, AutomationTrackItem);
328 case GDK_BUTTON_RELEASE:
329 ret = button_release_handler (item, event, AutomationTrackItem);
332 case GDK_MOTION_NOTIFY:
333 ret = motion_handler (item, event);
336 case GDK_ENTER_NOTIFY:
337 ret = enter_handler (item, event, AutomationTrackItem);
340 case GDK_LEAVE_NOTIFY:
341 ret = leave_handler (item, event, AutomationTrackItem);
352 Editor::canvas_start_xfade_event (GdkEvent *event, ArdourCanvas::Item* item, AudioRegionView *rv)
354 if (!rv->sensitive()) {
358 switch (event->type) {
359 case GDK_BUTTON_PRESS:
360 clicked_regionview = rv;
361 clicked_control_point = 0;
362 clicked_axisview = &rv->get_time_axis_view();
363 clicked_routeview = dynamic_cast<RouteTimeAxisView*>(clicked_axisview);
364 if (event->button.button == 3) {
365 return button_press_handler (item, event, StartCrossFadeItem);
369 case GDK_BUTTON_RELEASE:
370 if (event->button.button == 3) {
371 return button_release_handler (item, event, StartCrossFadeItem);
380 return typed_event (item, event, StartCrossFadeItem);
384 Editor::canvas_end_xfade_event (GdkEvent *event, ArdourCanvas::Item* item, AudioRegionView *rv)
386 if (!rv->sensitive()) {
390 switch (event->type) {
391 case GDK_BUTTON_PRESS:
392 clicked_regionview = rv;
393 clicked_control_point = 0;
394 clicked_axisview = &rv->get_time_axis_view();
395 clicked_routeview = dynamic_cast<RouteTimeAxisView*>(clicked_axisview);
396 if (event->button.button == 3) {
397 return button_press_handler (item, event, EndCrossFadeItem);
401 case GDK_BUTTON_RELEASE:
402 if (event->button.button == 3) {
403 return button_release_handler (item, event, EndCrossFadeItem);
412 return typed_event (item, event, EndCrossFadeItem);
416 Editor::canvas_fade_in_event (GdkEvent *event, ArdourCanvas::Item* item, AudioRegionView *rv)
418 /* we handle only button 3 press/release events */
420 if (!rv->sensitive()) {
424 switch (event->type) {
425 case GDK_BUTTON_PRESS:
426 clicked_regionview = rv;
427 clicked_control_point = 0;
428 clicked_axisview = &rv->get_time_axis_view();
429 clicked_routeview = dynamic_cast<RouteTimeAxisView*>(clicked_axisview);
430 if (event->button.button == 3) {
431 return button_press_handler (item, event, FadeInItem);
435 case GDK_BUTTON_RELEASE:
436 if (event->button.button == 3) {
437 return button_release_handler (item, event, FadeInItem);
446 /* proxy for the regionview */
448 return canvas_region_view_event (event, rv->get_canvas_group(), rv);
452 Editor::canvas_fade_in_handle_event (GdkEvent *event, ArdourCanvas::Item* item, AudioRegionView *rv)
456 if (!rv->sensitive()) {
460 switch (event->type) {
461 case GDK_BUTTON_PRESS:
462 case GDK_2BUTTON_PRESS:
463 case GDK_3BUTTON_PRESS:
464 clicked_regionview = rv;
465 clicked_control_point = 0;
466 clicked_axisview = &rv->get_time_axis_view();
467 clicked_routeview = dynamic_cast<RouteTimeAxisView*>(clicked_axisview);
468 ret = button_press_handler (item, event, FadeInHandleItem);
471 case GDK_BUTTON_RELEASE:
472 ret = button_release_handler (item, event, FadeInHandleItem);
475 case GDK_MOTION_NOTIFY:
476 ret = motion_handler (item, event);
479 case GDK_ENTER_NOTIFY:
480 set_entered_regionview (rv);
481 ret = enter_handler (item, event, FadeInHandleItem);
484 case GDK_LEAVE_NOTIFY:
485 set_entered_regionview (0);
486 ret = leave_handler (item, event, FadeInHandleItem);
497 Editor::canvas_fade_out_event (GdkEvent *event, ArdourCanvas::Item* item, AudioRegionView *rv)
499 /* we handle only button 3 press/release events */
501 if (!rv->sensitive()) {
505 switch (event->type) {
506 case GDK_BUTTON_PRESS:
507 clicked_regionview = rv;
508 clicked_control_point = 0;
509 clicked_axisview = &rv->get_time_axis_view();
510 clicked_routeview = dynamic_cast<RouteTimeAxisView*>(clicked_axisview);
511 if (event->button.button == 3) {
512 return button_press_handler (item, event, FadeOutItem);
516 case GDK_BUTTON_RELEASE:
517 if (event->button.button == 3) {
518 return button_release_handler (item, event, FadeOutItem);
527 /* proxy for the regionview */
529 return canvas_region_view_event (event, rv->get_canvas_group(), rv);
533 Editor::canvas_fade_out_handle_event (GdkEvent *event, ArdourCanvas::Item* item, AudioRegionView *rv)
537 if (!rv->sensitive()) {
541 switch (event->type) {
542 case GDK_BUTTON_PRESS:
543 case GDK_2BUTTON_PRESS:
544 case GDK_3BUTTON_PRESS:
545 clicked_regionview = rv;
546 clicked_control_point = 0;
547 clicked_axisview = &rv->get_time_axis_view();
548 clicked_routeview = dynamic_cast<RouteTimeAxisView*>(clicked_axisview);
549 ret = button_press_handler (item, event, FadeOutHandleItem);
552 case GDK_BUTTON_RELEASE:
553 ret = button_release_handler (item, event, FadeOutHandleItem);
556 case GDK_MOTION_NOTIFY:
557 ret = motion_handler (item, event);
560 case GDK_ENTER_NOTIFY:
561 set_entered_regionview (rv);
562 ret = enter_handler (item, event, FadeOutHandleItem);
565 case GDK_LEAVE_NOTIFY:
566 set_entered_regionview (0);
567 ret = leave_handler (item, event, FadeOutHandleItem);
577 struct DescendingRegionLayerSorter {
578 bool operator()(boost::shared_ptr<Region> a, boost::shared_ptr<Region> b) {
579 return a->layer() > b->layer();
584 Editor::canvas_control_point_event (GdkEvent *event, ArdourCanvas::Item* item, ControlPoint* cp)
586 switch (event->type) {
587 case GDK_BUTTON_PRESS:
588 case GDK_2BUTTON_PRESS:
589 case GDK_3BUTTON_PRESS:
590 clicked_control_point = cp;
591 clicked_axisview = &cp->line().trackview;
592 clicked_routeview = dynamic_cast<RouteTimeAxisView*>(clicked_axisview);
593 clicked_regionview = 0;
599 case GDK_SCROLL_DOWN:
606 return typed_event (item, event, ControlPointItem);
610 Editor::canvas_line_event (GdkEvent *event, ArdourCanvas::Item* item, AutomationLine* al)
614 if (dynamic_cast<AudioRegionGainLine*> (al) != 0) {
617 type = AutomationLineItem;
620 return typed_event (item, event, type);
624 Editor::canvas_selection_rect_event (GdkEvent *event, ArdourCanvas::Item* item, SelectionRect* rect)
628 switch (event->type) {
629 case GDK_BUTTON_PRESS:
630 case GDK_2BUTTON_PRESS:
631 case GDK_3BUTTON_PRESS:
632 clicked_selection = rect->id;
633 ret = button_press_handler (item, event, SelectionItem);
635 case GDK_BUTTON_RELEASE:
636 ret = button_release_handler (item, event, SelectionItem);
638 case GDK_MOTION_NOTIFY:
639 ret = motion_handler (item, event);
641 /* Don't need these at the moment. */
642 case GDK_ENTER_NOTIFY:
643 ret = enter_handler (item, event, SelectionItem);
646 case GDK_LEAVE_NOTIFY:
647 ret = leave_handler (item, event, SelectionItem);
658 Editor::canvas_selection_start_trim_event (GdkEvent *event, ArdourCanvas::Item* item, SelectionRect* rect)
662 switch (event->type) {
663 case GDK_BUTTON_PRESS:
664 case GDK_2BUTTON_PRESS:
665 case GDK_3BUTTON_PRESS:
666 clicked_selection = rect->id;
667 ret = button_press_handler (item, event, StartSelectionTrimItem);
669 case GDK_BUTTON_RELEASE:
670 ret = button_release_handler (item, event, StartSelectionTrimItem);
672 case GDK_MOTION_NOTIFY:
673 ret = motion_handler (item, event);
675 case GDK_ENTER_NOTIFY:
676 ret = enter_handler (item, event, StartSelectionTrimItem);
679 case GDK_LEAVE_NOTIFY:
680 ret = leave_handler (item, event, StartSelectionTrimItem);
691 Editor::canvas_selection_end_trim_event (GdkEvent *event, ArdourCanvas::Item* item, SelectionRect* rect)
695 switch (event->type) {
696 case GDK_BUTTON_PRESS:
697 case GDK_2BUTTON_PRESS:
698 case GDK_3BUTTON_PRESS:
699 clicked_selection = rect->id;
700 ret = button_press_handler (item, event, EndSelectionTrimItem);
702 case GDK_BUTTON_RELEASE:
703 ret = button_release_handler (item, event, EndSelectionTrimItem);
705 case GDK_MOTION_NOTIFY:
706 ret = motion_handler (item, event);
708 case GDK_ENTER_NOTIFY:
709 ret = enter_handler (item, event, EndSelectionTrimItem);
712 case GDK_LEAVE_NOTIFY:
713 ret = leave_handler (item, event, EndSelectionTrimItem);
724 Editor::canvas_frame_handle_event (GdkEvent* event, ArdourCanvas::Item* item, RegionView* rv)
728 /* frame handles are not active when in internal edit mode, because actual notes
729 might be in the area occupied by the handle - we want them to be editable as normal.
732 if (internal_editing() || !rv->sensitive()) {
736 /* NOTE: frame handles pretend to be the colored trim bar from an event handling
737 perspective. XXX change this ??
742 if (item->get_data ("isleft")) {
743 type = LeftFrameHandle;
745 type = RightFrameHandle;
748 switch (event->type) {
749 case GDK_BUTTON_PRESS:
750 case GDK_2BUTTON_PRESS:
751 case GDK_3BUTTON_PRESS:
752 clicked_regionview = rv;
753 clicked_control_point = 0;
754 clicked_axisview = &clicked_regionview->get_time_axis_view();
755 clicked_routeview = dynamic_cast<RouteTimeAxisView*>(clicked_axisview);
756 ret = button_press_handler (item, event, type);
758 case GDK_BUTTON_RELEASE:
759 ret = button_release_handler (item, event, type);
761 case GDK_MOTION_NOTIFY:
762 ret = motion_handler (item, event);
764 case GDK_ENTER_NOTIFY:
765 set_entered_regionview (rv);
766 ret = enter_handler (item, event, type);
769 case GDK_LEAVE_NOTIFY:
770 set_entered_regionview (0);
771 ret = leave_handler (item, event, type);
783 Editor::canvas_region_view_name_highlight_event (GdkEvent* event, ArdourCanvas::Item* item, RegionView* rv)
787 if (!rv->sensitive()) {
791 switch (event->type) {
792 case GDK_BUTTON_PRESS:
793 case GDK_2BUTTON_PRESS:
794 case GDK_3BUTTON_PRESS:
795 clicked_regionview = rv;
796 clicked_control_point = 0;
797 clicked_axisview = &clicked_regionview->get_time_axis_view();
798 clicked_routeview = dynamic_cast<RouteTimeAxisView*>(clicked_axisview);
799 ret = button_press_handler (item, event, RegionViewNameHighlight);
801 case GDK_BUTTON_RELEASE:
802 ret = button_release_handler (item, event, RegionViewNameHighlight);
804 case GDK_MOTION_NOTIFY:
805 motion_handler (item, event);
806 ret = true; // force this to avoid progagating the event into the regionview
808 case GDK_ENTER_NOTIFY:
809 set_entered_regionview (rv);
810 ret = enter_handler (item, event, RegionViewNameHighlight);
813 case GDK_LEAVE_NOTIFY:
814 set_entered_regionview (0);
815 ret = leave_handler (item, event, RegionViewNameHighlight);
826 Editor::canvas_region_view_name_event (GdkEvent *event, ArdourCanvas::Item* item, RegionView* rv)
830 if (!rv->sensitive()) {
834 switch (event->type) {
835 case GDK_BUTTON_PRESS:
836 case GDK_2BUTTON_PRESS:
837 case GDK_3BUTTON_PRESS:
838 clicked_regionview = rv;
839 clicked_control_point = 0;
840 clicked_axisview = &clicked_regionview->get_time_axis_view();
841 clicked_routeview = dynamic_cast<RouteTimeAxisView*>(clicked_axisview);
842 ret = button_press_handler (item, event, RegionViewName);
844 case GDK_BUTTON_RELEASE:
845 ret = button_release_handler (item, event, RegionViewName);
847 case GDK_MOTION_NOTIFY:
848 ret = motion_handler (item, event);
850 case GDK_ENTER_NOTIFY:
851 set_entered_regionview (rv);
852 ret = enter_handler (item, event, RegionViewName);
855 case GDK_LEAVE_NOTIFY:
856 set_entered_regionview (0);
857 ret = leave_handler (item, event, RegionViewName);
868 Editor::canvas_feature_line_event (GdkEvent *event, ArdourCanvas::Item* item, RegionView*)
872 switch (event->type) {
873 case GDK_BUTTON_PRESS:
874 case GDK_2BUTTON_PRESS:
875 case GDK_3BUTTON_PRESS:
876 clicked_regionview = 0;
877 clicked_control_point = 0;
878 clicked_axisview = 0;
879 clicked_routeview = 0; //dynamic_cast<RouteTimeAxisView*>(clicked_axisview);
880 ret = button_press_handler (item, event, FeatureLineItem);
883 case GDK_BUTTON_RELEASE:
884 ret = button_release_handler (item, event, FeatureLineItem);
887 case GDK_MOTION_NOTIFY:
888 ret = motion_handler (item, event);
891 case GDK_ENTER_NOTIFY:
892 ret = enter_handler (item, event, FeatureLineItem);
895 case GDK_LEAVE_NOTIFY:
896 ret = leave_handler (item, event, FeatureLineItem);
907 Editor::canvas_marker_event (GdkEvent *event, ArdourCanvas::Item* item, Marker* /*marker*/)
909 return typed_event (item, event, MarkerItem);
913 Editor::canvas_marker_bar_event (GdkEvent *event, ArdourCanvas::Item* item)
915 return typed_event (item, event, MarkerBarItem);
919 Editor::canvas_range_marker_bar_event (GdkEvent *event, ArdourCanvas::Item* item)
921 return typed_event (item, event, RangeMarkerBarItem);
925 Editor::canvas_transport_marker_bar_event (GdkEvent *event, ArdourCanvas::Item* item)
927 return typed_event (item, event, TransportMarkerBarItem);
931 Editor::canvas_cd_marker_bar_event (GdkEvent *event, ArdourCanvas::Item* item)
933 return typed_event (item, event, CdMarkerBarItem);
937 Editor::canvas_tempo_marker_event (GdkEvent *event, ArdourCanvas::Item* item, TempoMarker* /*marker*/)
939 return typed_event (item, event, TempoMarkerItem);
943 Editor::canvas_meter_marker_event (GdkEvent *event, ArdourCanvas::Item* item, MeterMarker* /*marker*/)
945 return typed_event (item, event, MeterMarkerItem);
949 Editor::canvas_tempo_bar_event (GdkEvent *event, ArdourCanvas::Item* item)
951 return typed_event (item, event, TempoBarItem);
955 Editor::canvas_meter_bar_event (GdkEvent *event, ArdourCanvas::Item* item)
957 return typed_event (item, event, MeterBarItem);
961 Editor::canvas_playhead_cursor_event (GdkEvent *event, ArdourCanvas::Item* item)
963 return typed_event (item, event, PlayheadCursorItem);
967 Editor::canvas_zoom_rect_event (GdkEvent *event, ArdourCanvas::Item* item)
969 return typed_event (item, event, NoItem);
973 Editor::canvas_note_event (GdkEvent *event, ArdourCanvas::Item* item)
975 if (!internal_editing()) {
979 return typed_event (item, event, NoteItem);
983 Editor::track_canvas_drag_motion (Glib::RefPtr<Gdk::DragContext> const & /*c*/, int x, int y, guint /*time*/)
987 track_canvas->window_to_world (x, y, wx, wy);
990 event.type = GDK_MOTION_NOTIFY;
993 /* assume we're dragging with button 1 */
994 event.motion.state = Gdk::BUTTON1_MASK;
996 if (!_drags->active ()) {
1000 framepos_t const pos = event_frame (&event, &px, &py);
1002 std::pair<TimeAxisView*, int> const tv = trackview_by_y_position (py);
1003 if (tv.first == 0) {
1007 RouteTimeAxisView* rtav = dynamic_cast<RouteTimeAxisView*> (tv.first);
1008 if (rtav == 0 || !rtav->is_track ()) {
1012 boost::shared_ptr<Region> region = _regions->get_dragged_region ();
1018 boost::shared_ptr<Region> region_copy = RegionFactory::create (region);
1020 if (boost::dynamic_pointer_cast<AudioRegion> (region_copy) != 0 &&
1021 dynamic_cast<AudioTimeAxisView*> (tv.first) == 0) {
1023 /* audio -> non-audio */
1027 if (boost::dynamic_pointer_cast<MidiRegion> (region_copy) != 0 &&
1028 dynamic_cast<MidiTimeAxisView*> (tv.first) == 0) {
1030 /* MIDI -> non-MIDI */
1034 _drags->set (new RegionInsertDrag (this, region_copy, rtav, pos), &event);
1037 _drags->motion_handler (&event, false);
1043 Editor::key_press_handler (ArdourCanvas::Item*, GdkEvent*, ItemType)
1049 Editor::key_release_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemType type)
1052 bool handled = false;
1055 case TempoMarkerItem:
1056 switch (event->key.keyval) {
1058 remove_tempo_marker (item);
1066 case MeterMarkerItem:
1067 switch (event->key.keyval) {
1069 remove_meter_marker (item);