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/midi_region.h"
28 #include "ardour/region_factory.h"
32 #include "public_editor.h"
33 #include "audio_region_view.h"
34 #include "audio_streamview.h"
35 #include "canvas-noevent-text.h"
36 #include "audio_time_axis.h"
37 #include "region_gain_line.h"
38 #include "automation_line.h"
39 #include "automation_time_axis.h"
40 #include "automation_line.h"
41 #include "control_point.h"
42 #include "canvas_impl.h"
43 #include "simplerect.h"
44 #include "editor_drag.h"
45 #include "midi_time_axis.h"
46 #include "editor_regions.h"
47 #include "verbose_cursor.h"
52 using namespace ARDOUR;
55 using namespace ArdourCanvas;
57 using Gtkmm2ext::Keyboard;
60 Editor::track_canvas_scroll (GdkEventScroll* ev)
63 int direction = ev->direction;
68 if (Keyboard::modifier_state_equals (ev->state, Keyboard::PrimaryModifier)) {
69 //for mouse-wheel zoom, force zoom-focus to mouse
70 Editing::ZoomFocus temp_focus = zoom_focus;
71 zoom_focus = Editing::ZoomFocusMouse;
72 temporal_zoom_step (false);
73 zoom_focus = temp_focus;
75 } else if (Keyboard::modifier_state_equals (ev->state, Keyboard::SecondaryModifier)) {
76 direction = GDK_SCROLL_LEFT;
78 } else if (Keyboard::modifier_state_equals (ev->state, Keyboard::TertiaryModifier)) {
79 if (!current_stepping_trackview) {
80 step_timeout = Glib::signal_timeout().connect (sigc::mem_fun(*this, &Editor::track_height_step_timeout), 500);
81 std::pair<TimeAxisView*, int> const p = trackview_by_y_position (ev->y + vertical_adjustment.get_value() - canvas_timebars_vsize);
82 current_stepping_trackview = p.first;
83 if (!current_stepping_trackview) {
87 last_track_height_step_timestamp = get_microseconds();
88 current_stepping_trackview->step_height (false);
91 scroll_tracks_up_line ();
97 if (Keyboard::modifier_state_equals (ev->state, Keyboard::PrimaryModifier)) {
98 //for mouse-wheel zoom, force zoom-focus to mouse
99 Editing::ZoomFocus temp_focus = zoom_focus;
100 zoom_focus = Editing::ZoomFocusMouse;
101 temporal_zoom_step (true);
102 zoom_focus = temp_focus;
104 } else if (Keyboard::modifier_state_equals (ev->state, Keyboard::SecondaryModifier)) {
105 direction = GDK_SCROLL_RIGHT;
107 } else if (Keyboard::modifier_state_equals (ev->state, Keyboard::TertiaryModifier)) {
108 if (!current_stepping_trackview) {
109 step_timeout = Glib::signal_timeout().connect (sigc::mem_fun(*this, &Editor::track_height_step_timeout), 500);
110 std::pair<TimeAxisView*, int> const p = trackview_by_y_position (ev->y + vertical_adjustment.get_value() - canvas_timebars_vsize);
111 current_stepping_trackview = p.first;
112 if (!current_stepping_trackview) {
116 last_track_height_step_timestamp = get_microseconds();
117 current_stepping_trackview->step_height (true);
120 scroll_tracks_down_line ();
125 case GDK_SCROLL_LEFT:
126 xdelta = (current_page_frames() / 8);
127 if (leftmost_frame > xdelta) {
128 reset_x_origin (leftmost_frame - xdelta);
134 case GDK_SCROLL_RIGHT:
135 xdelta = (current_page_frames() / 8);
136 if (max_framepos - xdelta > leftmost_frame) {
137 reset_x_origin (leftmost_frame + xdelta);
139 reset_x_origin (max_framepos - current_page_frames());
152 Editor::track_canvas_scroll_event (GdkEventScroll *event)
154 track_canvas->grab_focus();
155 return track_canvas_scroll (event);
159 Editor::track_canvas_button_press_event (GdkEventButton */*event*/)
162 track_canvas->grab_focus();
167 Editor::track_canvas_button_release_event (GdkEventButton *event)
169 if (_drags->active ()) {
170 _drags->end_grab ((GdkEvent*) event);
176 Editor::track_canvas_motion_notify_event (GdkEventMotion */*event*/)
179 /* keep those motion events coming */
180 track_canvas->get_pointer (x, y);
185 Editor::track_canvas_motion (GdkEvent *ev)
187 if (_verbose_cursor->visible ()) {
188 _verbose_cursor->set_position (ev->motion.x + 10, ev->motion.y + 10);
195 Editor::typed_event (ArdourCanvas::Item* item, GdkEvent *event, ItemType type)
199 switch (event->type) {
200 case GDK_BUTTON_PRESS:
201 case GDK_2BUTTON_PRESS:
202 case GDK_3BUTTON_PRESS:
203 ret = button_press_handler (item, event, type);
205 case GDK_BUTTON_RELEASE:
206 ret = button_release_handler (item, event, type);
208 case GDK_MOTION_NOTIFY:
209 ret = motion_handler (item, event);
212 case GDK_ENTER_NOTIFY:
213 ret = enter_handler (item, event, type);
216 case GDK_LEAVE_NOTIFY:
217 ret = leave_handler (item, event, type);
221 ret = key_press_handler (item, event, type);
224 case GDK_KEY_RELEASE:
225 ret = key_release_handler (item, event, type);
235 Editor::canvas_region_view_event (GdkEvent *event, ArdourCanvas::Item* item, RegionView *rv)
239 if (!rv->sensitive ()) {
243 switch (event->type) {
244 case GDK_BUTTON_PRESS:
245 case GDK_2BUTTON_PRESS:
246 case GDK_3BUTTON_PRESS:
247 clicked_regionview = rv;
248 clicked_control_point = 0;
249 clicked_axisview = &rv->get_time_axis_view();
250 clicked_routeview = dynamic_cast<RouteTimeAxisView*>(clicked_axisview);
251 ret = button_press_handler (item, event, RegionItem);
254 case GDK_BUTTON_RELEASE:
255 ret = button_release_handler (item, event, RegionItem);
258 case GDK_MOTION_NOTIFY:
259 ret = motion_handler (item, event);
262 case GDK_ENTER_NOTIFY:
263 set_entered_track (&rv->get_time_axis_view ());
264 set_entered_regionview (rv);
267 case GDK_LEAVE_NOTIFY:
268 set_entered_track (0);
269 set_entered_regionview (0);
280 Editor::canvas_stream_view_event (GdkEvent *event, ArdourCanvas::Item* item, RouteTimeAxisView *tv)
284 switch (event->type) {
285 case GDK_BUTTON_PRESS:
286 case GDK_2BUTTON_PRESS:
287 case GDK_3BUTTON_PRESS:
288 clicked_regionview = 0;
289 clicked_control_point = 0;
290 clicked_axisview = tv;
291 clicked_routeview = dynamic_cast<RouteTimeAxisView*>(clicked_axisview);
292 ret = button_press_handler (item, event, StreamItem);
295 case GDK_BUTTON_RELEASE:
296 ret = button_release_handler (item, event, StreamItem);
299 case GDK_MOTION_NOTIFY:
300 ret = motion_handler (item, event);
303 case GDK_ENTER_NOTIFY:
304 set_entered_track (tv);
307 case GDK_LEAVE_NOTIFY:
308 set_entered_track (0);
319 Editor::canvas_automation_track_event (GdkEvent *event, ArdourCanvas::Item* item, AutomationTimeAxisView *atv)
323 switch (event->type) {
324 case GDK_BUTTON_PRESS:
325 case GDK_2BUTTON_PRESS:
326 case GDK_3BUTTON_PRESS:
327 clicked_regionview = 0;
328 clicked_control_point = 0;
329 clicked_axisview = atv;
330 clicked_routeview = 0;
331 ret = button_press_handler (item, event, AutomationTrackItem);
334 case GDK_BUTTON_RELEASE:
335 ret = button_release_handler (item, event, AutomationTrackItem);
338 case GDK_MOTION_NOTIFY:
339 ret = motion_handler (item, event);
342 case GDK_ENTER_NOTIFY:
343 ret = enter_handler (item, event, AutomationTrackItem);
346 case GDK_LEAVE_NOTIFY:
347 ret = leave_handler (item, event, AutomationTrackItem);
358 Editor::canvas_start_xfade_event (GdkEvent *event, ArdourCanvas::Item* item, AudioRegionView *rv)
360 if (!rv->sensitive()) {
364 switch (event->type) {
365 case GDK_BUTTON_PRESS:
366 clicked_regionview = rv;
367 clicked_control_point = 0;
368 clicked_axisview = &rv->get_time_axis_view();
369 clicked_routeview = dynamic_cast<RouteTimeAxisView*>(clicked_axisview);
370 if (event->button.button == 3) {
371 return button_press_handler (item, event, StartCrossFadeItem);
375 case GDK_BUTTON_RELEASE:
376 if (event->button.button == 3) {
377 return button_release_handler (item, event, StartCrossFadeItem);
386 /* In Mixbus, the crossfade area is used to trim the region while leaving the fade anchor intact (see preserve_fade_anchor)*/
387 /* however in A3 this feature is unfinished, and it might be better to do it with a modifier-trim instead, anyway */
388 /* if we return RegionItem here then we avoid the issue until it is resolved later */
389 return typed_event (item, event, RegionItem); // StartCrossFadeItem);
393 Editor::canvas_end_xfade_event (GdkEvent *event, ArdourCanvas::Item* item, AudioRegionView *rv)
395 if (!rv->sensitive()) {
399 switch (event->type) {
400 case GDK_BUTTON_PRESS:
401 clicked_regionview = rv;
402 clicked_control_point = 0;
403 clicked_axisview = &rv->get_time_axis_view();
404 clicked_routeview = dynamic_cast<RouteTimeAxisView*>(clicked_axisview);
405 if (event->button.button == 3) {
406 return button_press_handler (item, event, EndCrossFadeItem);
410 case GDK_BUTTON_RELEASE:
411 if (event->button.button == 3) {
412 return button_release_handler (item, event, EndCrossFadeItem);
421 /* In Mixbus, the crossfade area is used to trim the region while leaving the fade anchor intact (see preserve_fade_anchor)*/
422 /* however in A3 this feature is unfinished, and it might be better to do it with a modifier-trim instead, anyway */
423 /* if we return RegionItem here then we avoid the issue until it is resolved later */
424 return typed_event (item, event, RegionItem); // EndCrossFadeItem);
428 Editor::canvas_fade_in_event (GdkEvent *event, ArdourCanvas::Item* item, AudioRegionView *rv)
430 /* we handle only button 3 press/release events */
432 if (!rv->sensitive()) {
436 switch (event->type) {
437 case GDK_BUTTON_PRESS:
438 clicked_regionview = rv;
439 clicked_control_point = 0;
440 clicked_axisview = &rv->get_time_axis_view();
441 clicked_routeview = dynamic_cast<RouteTimeAxisView*>(clicked_axisview);
442 if (event->button.button == 3) {
443 return button_press_handler (item, event, FadeInItem);
447 case GDK_BUTTON_RELEASE:
448 if (event->button.button == 3) {
449 return button_release_handler (item, event, FadeInItem);
458 /* proxy for the regionview */
460 return canvas_region_view_event (event, rv->get_canvas_group(), rv);
464 Editor::canvas_fade_in_handle_event (GdkEvent *event, ArdourCanvas::Item* item, AudioRegionView *rv)
468 if (!rv->sensitive()) {
472 switch (event->type) {
473 case GDK_BUTTON_PRESS:
474 case GDK_2BUTTON_PRESS:
475 case GDK_3BUTTON_PRESS:
476 clicked_regionview = rv;
477 clicked_control_point = 0;
478 clicked_axisview = &rv->get_time_axis_view();
479 clicked_routeview = dynamic_cast<RouteTimeAxisView*>(clicked_axisview);
480 ret = button_press_handler (item, event, FadeInHandleItem);
483 case GDK_BUTTON_RELEASE:
484 ret = button_release_handler (item, event, FadeInHandleItem);
485 maybe_locate_with_edit_preroll ( rv->region()->position() );
488 case GDK_MOTION_NOTIFY:
489 ret = motion_handler (item, event);
492 case GDK_ENTER_NOTIFY:
493 set_entered_regionview (rv);
494 ret = enter_handler (item, event, FadeInHandleItem);
497 case GDK_LEAVE_NOTIFY:
498 set_entered_regionview (0);
499 ret = leave_handler (item, event, FadeInHandleItem);
510 Editor::canvas_fade_out_event (GdkEvent *event, ArdourCanvas::Item* item, AudioRegionView *rv)
512 /* we handle only button 3 press/release events */
514 if (!rv->sensitive()) {
518 switch (event->type) {
519 case GDK_BUTTON_PRESS:
520 clicked_regionview = rv;
521 clicked_control_point = 0;
522 clicked_axisview = &rv->get_time_axis_view();
523 clicked_routeview = dynamic_cast<RouteTimeAxisView*>(clicked_axisview);
524 if (event->button.button == 3) {
525 return button_press_handler (item, event, FadeOutItem);
529 case GDK_BUTTON_RELEASE:
530 if (event->button.button == 3) {
531 return button_release_handler (item, event, FadeOutItem);
540 /* proxy for the regionview */
542 return canvas_region_view_event (event, rv->get_canvas_group(), rv);
546 Editor::canvas_fade_out_handle_event (GdkEvent *event, ArdourCanvas::Item* item, AudioRegionView *rv)
550 if (!rv->sensitive()) {
554 switch (event->type) {
555 case GDK_BUTTON_PRESS:
556 case GDK_2BUTTON_PRESS:
557 case GDK_3BUTTON_PRESS:
558 clicked_regionview = rv;
559 clicked_control_point = 0;
560 clicked_axisview = &rv->get_time_axis_view();
561 clicked_routeview = dynamic_cast<RouteTimeAxisView*>(clicked_axisview);
562 ret = button_press_handler (item, event, FadeOutHandleItem);
565 case GDK_BUTTON_RELEASE:
566 ret = button_release_handler (item, event, FadeOutHandleItem);
567 maybe_locate_with_edit_preroll ( rv->region()->last_frame() - rv->get_fade_out_shape_width() );
570 case GDK_MOTION_NOTIFY:
571 ret = motion_handler (item, event);
574 case GDK_ENTER_NOTIFY:
575 set_entered_regionview (rv);
576 ret = enter_handler (item, event, FadeOutHandleItem);
579 case GDK_LEAVE_NOTIFY:
580 set_entered_regionview (0);
581 ret = leave_handler (item, event, FadeOutHandleItem);
591 struct DescendingRegionLayerSorter {
592 bool operator()(boost::shared_ptr<Region> a, boost::shared_ptr<Region> b) {
593 return a->layer() > b->layer();
598 Editor::canvas_control_point_event (GdkEvent *event, ArdourCanvas::Item* item, ControlPoint* cp)
600 switch (event->type) {
601 case GDK_BUTTON_PRESS:
602 case GDK_2BUTTON_PRESS:
603 case GDK_3BUTTON_PRESS:
604 clicked_control_point = cp;
605 clicked_axisview = &cp->line().trackview;
606 clicked_routeview = dynamic_cast<RouteTimeAxisView*>(clicked_axisview);
607 clicked_regionview = 0;
613 case GDK_SCROLL_DOWN:
620 return typed_event (item, event, ControlPointItem);
624 Editor::canvas_line_event (GdkEvent *event, ArdourCanvas::Item* item, AutomationLine* al)
628 if (dynamic_cast<AudioRegionGainLine*> (al) != 0) {
631 type = AutomationLineItem;
634 return typed_event (item, event, type);
638 Editor::canvas_selection_rect_event (GdkEvent *event, ArdourCanvas::Item* item, SelectionRect* rect)
642 switch (event->type) {
643 case GDK_BUTTON_PRESS:
644 case GDK_2BUTTON_PRESS:
645 case GDK_3BUTTON_PRESS:
646 clicked_selection = rect->id;
647 ret = button_press_handler (item, event, SelectionItem);
649 case GDK_BUTTON_RELEASE:
650 ret = button_release_handler (item, event, SelectionItem);
652 case GDK_MOTION_NOTIFY:
653 ret = motion_handler (item, event);
655 /* Don't need these at the moment. */
656 case GDK_ENTER_NOTIFY:
657 ret = enter_handler (item, event, SelectionItem);
660 case GDK_LEAVE_NOTIFY:
661 ret = leave_handler (item, event, SelectionItem);
672 Editor::canvas_selection_start_trim_event (GdkEvent *event, ArdourCanvas::Item* item, SelectionRect* rect)
676 switch (event->type) {
677 case GDK_BUTTON_PRESS:
678 case GDK_2BUTTON_PRESS:
679 case GDK_3BUTTON_PRESS:
680 clicked_selection = rect->id;
681 ret = button_press_handler (item, event, StartSelectionTrimItem);
683 case GDK_BUTTON_RELEASE:
684 ret = button_release_handler (item, event, StartSelectionTrimItem);
686 case GDK_MOTION_NOTIFY:
687 ret = motion_handler (item, event);
689 case GDK_ENTER_NOTIFY:
690 ret = enter_handler (item, event, StartSelectionTrimItem);
693 case GDK_LEAVE_NOTIFY:
694 ret = leave_handler (item, event, StartSelectionTrimItem);
705 Editor::canvas_selection_end_trim_event (GdkEvent *event, ArdourCanvas::Item* item, SelectionRect* rect)
709 switch (event->type) {
710 case GDK_BUTTON_PRESS:
711 case GDK_2BUTTON_PRESS:
712 case GDK_3BUTTON_PRESS:
713 clicked_selection = rect->id;
714 ret = button_press_handler (item, event, EndSelectionTrimItem);
716 case GDK_BUTTON_RELEASE:
717 ret = button_release_handler (item, event, EndSelectionTrimItem);
719 case GDK_MOTION_NOTIFY:
720 ret = motion_handler (item, event);
722 case GDK_ENTER_NOTIFY:
723 ret = enter_handler (item, event, EndSelectionTrimItem);
726 case GDK_LEAVE_NOTIFY:
727 ret = leave_handler (item, event, EndSelectionTrimItem);
738 Editor::canvas_frame_handle_event (GdkEvent* event, ArdourCanvas::Item* item, RegionView* rv)
742 /* frame handles are not active when in internal edit mode, because actual notes
743 might be in the area occupied by the handle - we want them to be editable as normal.
746 if (internal_editing() || !rv->sensitive()) {
750 /* NOTE: frame handles pretend to be the colored trim bar from an event handling
751 perspective. XXX change this ??
756 if (item->get_data ("isleft")) {
757 type = LeftFrameHandle;
759 type = RightFrameHandle;
762 switch (event->type) {
763 case GDK_BUTTON_PRESS:
764 case GDK_2BUTTON_PRESS:
765 case GDK_3BUTTON_PRESS:
766 clicked_regionview = rv;
767 clicked_control_point = 0;
768 clicked_axisview = &clicked_regionview->get_time_axis_view();
769 clicked_routeview = dynamic_cast<RouteTimeAxisView*>(clicked_axisview);
770 ret = button_press_handler (item, event, type);
772 case GDK_BUTTON_RELEASE:
773 ret = button_release_handler (item, event, type);
775 case GDK_MOTION_NOTIFY:
776 ret = motion_handler (item, event);
778 case GDK_ENTER_NOTIFY:
779 set_entered_regionview (rv);
780 ret = enter_handler (item, event, type);
783 case GDK_LEAVE_NOTIFY:
784 set_entered_regionview (0);
785 ret = leave_handler (item, event, type);
797 Editor::canvas_region_view_name_highlight_event (GdkEvent* event, ArdourCanvas::Item* item, RegionView* rv)
801 if (!rv->sensitive()) {
805 switch (event->type) {
806 case GDK_BUTTON_PRESS:
807 case GDK_2BUTTON_PRESS:
808 case GDK_3BUTTON_PRESS:
809 clicked_regionview = rv;
810 clicked_control_point = 0;
811 clicked_axisview = &clicked_regionview->get_time_axis_view();
812 clicked_routeview = dynamic_cast<RouteTimeAxisView*>(clicked_axisview);
813 ret = button_press_handler (item, event, RegionViewNameHighlight);
815 case GDK_BUTTON_RELEASE:
816 ret = button_release_handler (item, event, RegionViewNameHighlight);
818 case GDK_MOTION_NOTIFY:
819 motion_handler (item, event);
820 ret = true; // force this to avoid progagating the event into the regionview
822 case GDK_ENTER_NOTIFY:
823 set_entered_regionview (rv);
824 ret = enter_handler (item, event, RegionViewNameHighlight);
827 case GDK_LEAVE_NOTIFY:
828 set_entered_regionview (0);
829 ret = leave_handler (item, event, RegionViewNameHighlight);
840 Editor::canvas_region_view_name_event (GdkEvent *event, ArdourCanvas::Item* item, RegionView* rv)
844 if (!rv->sensitive()) {
848 switch (event->type) {
849 case GDK_BUTTON_PRESS:
850 case GDK_2BUTTON_PRESS:
851 case GDK_3BUTTON_PRESS:
852 clicked_regionview = rv;
853 clicked_control_point = 0;
854 clicked_axisview = &clicked_regionview->get_time_axis_view();
855 clicked_routeview = dynamic_cast<RouteTimeAxisView*>(clicked_axisview);
856 ret = button_press_handler (item, event, RegionViewName);
858 case GDK_BUTTON_RELEASE:
859 ret = button_release_handler (item, event, RegionViewName);
861 case GDK_MOTION_NOTIFY:
862 ret = motion_handler (item, event);
864 case GDK_ENTER_NOTIFY:
865 set_entered_regionview (rv);
866 ret = enter_handler (item, event, RegionViewName);
869 case GDK_LEAVE_NOTIFY:
870 set_entered_regionview (0);
871 ret = leave_handler (item, event, RegionViewName);
882 Editor::canvas_feature_line_event (GdkEvent *event, ArdourCanvas::Item* item, RegionView*)
886 switch (event->type) {
887 case GDK_BUTTON_PRESS:
888 case GDK_2BUTTON_PRESS:
889 case GDK_3BUTTON_PRESS:
890 clicked_regionview = 0;
891 clicked_control_point = 0;
892 clicked_axisview = 0;
893 clicked_routeview = 0; //dynamic_cast<RouteTimeAxisView*>(clicked_axisview);
894 ret = button_press_handler (item, event, FeatureLineItem);
897 case GDK_BUTTON_RELEASE:
898 ret = button_release_handler (item, event, FeatureLineItem);
901 case GDK_MOTION_NOTIFY:
902 ret = motion_handler (item, event);
905 case GDK_ENTER_NOTIFY:
906 ret = enter_handler (item, event, FeatureLineItem);
909 case GDK_LEAVE_NOTIFY:
910 ret = leave_handler (item, event, FeatureLineItem);
921 Editor::canvas_marker_event (GdkEvent *event, ArdourCanvas::Item* item, Marker* /*marker*/)
923 return typed_event (item, event, MarkerItem);
927 Editor::canvas_marker_bar_event (GdkEvent *event, ArdourCanvas::Item* item)
929 return typed_event (item, event, MarkerBarItem);
933 Editor::canvas_range_marker_bar_event (GdkEvent *event, ArdourCanvas::Item* item)
935 return typed_event (item, event, RangeMarkerBarItem);
939 Editor::canvas_transport_marker_bar_event (GdkEvent *event, ArdourCanvas::Item* item)
941 return typed_event (item, event, TransportMarkerBarItem);
945 Editor::canvas_cd_marker_bar_event (GdkEvent *event, ArdourCanvas::Item* item)
947 return typed_event (item, event, CdMarkerBarItem);
951 Editor::canvas_tempo_marker_event (GdkEvent *event, ArdourCanvas::Item* item, TempoMarker* /*marker*/)
953 return typed_event (item, event, TempoMarkerItem);
957 Editor::canvas_meter_marker_event (GdkEvent *event, ArdourCanvas::Item* item, MeterMarker* /*marker*/)
959 return typed_event (item, event, MeterMarkerItem);
963 Editor::canvas_tempo_bar_event (GdkEvent *event, ArdourCanvas::Item* item)
965 return typed_event (item, event, TempoBarItem);
969 Editor::canvas_meter_bar_event (GdkEvent *event, ArdourCanvas::Item* item)
971 return typed_event (item, event, MeterBarItem);
975 Editor::canvas_playhead_cursor_event (GdkEvent *event, ArdourCanvas::Item* item)
977 return typed_event (item, event, PlayheadCursorItem);
981 Editor::canvas_zoom_rect_event (GdkEvent *event, ArdourCanvas::Item* item)
983 return typed_event (item, event, NoItem);
987 Editor::canvas_note_event (GdkEvent *event, ArdourCanvas::Item* item)
989 if (!internal_editing()) {
993 return typed_event (item, event, NoteItem);
997 Editor::track_canvas_drag_motion (Glib::RefPtr<Gdk::DragContext> const & /*c*/, int x, int y, guint /*time*/)
1001 track_canvas->window_to_world (x, y, wx, wy);
1004 event.type = GDK_MOTION_NOTIFY;
1005 event.button.x = wx;
1006 event.button.y = wy;
1007 /* assume we're dragging with button 1 */
1008 event.motion.state = Gdk::BUTTON1_MASK;
1010 if (!_drags->active ()) {
1014 framepos_t const pos = event_frame (&event, &px, &py);
1016 std::pair<TimeAxisView*, int> const tv = trackview_by_y_position (py);
1017 if (tv.first == 0) {
1021 RouteTimeAxisView* rtav = dynamic_cast<RouteTimeAxisView*> (tv.first);
1022 if (rtav == 0 || !rtav->is_track ()) {
1026 boost::shared_ptr<Region> region = _regions->get_dragged_region ();
1032 boost::shared_ptr<Region> region_copy = RegionFactory::create (region, true);
1034 if (boost::dynamic_pointer_cast<AudioRegion> (region_copy) != 0 &&
1035 dynamic_cast<AudioTimeAxisView*> (tv.first) == 0) {
1037 /* audio -> non-audio */
1041 if (boost::dynamic_pointer_cast<MidiRegion> (region_copy) != 0 &&
1042 dynamic_cast<MidiTimeAxisView*> (tv.first) == 0) {
1044 /* MIDI -> non-MIDI */
1048 _drags->set (new RegionInsertDrag (this, region_copy, rtav, pos), &event);
1051 _drags->motion_handler (&event, false);
1057 Editor::key_press_handler (ArdourCanvas::Item*, GdkEvent*, ItemType)
1063 Editor::key_release_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemType type)
1066 bool handled = false;
1069 case TempoMarkerItem:
1070 switch (event->key.keyval) {
1072 remove_tempo_marker (item);
1080 case MeterMarkerItem:
1081 switch (event->key.keyval) {
1083 remove_meter_marker (item);