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 "crossfade_view.h"
39 #include "audio_time_axis.h"
40 #include "region_gain_line.h"
41 #include "automation_line.h"
42 #include "automation_time_axis.h"
43 #include "automation_line.h"
44 #include "control_point.h"
45 #include "canvas_impl.h"
46 #include "simplerect.h"
47 #include "editor_drag.h"
48 #include "midi_time_axis.h"
49 #include "editor_regions.h"
50 #include "verbose_cursor.h"
55 using namespace ARDOUR;
58 using namespace ArdourCanvas;
60 using Gtkmm2ext::Keyboard;
63 Editor::track_canvas_scroll (GdkEventScroll* ev)
66 int direction = ev->direction;
71 if (Keyboard::modifier_state_equals (ev->state, Keyboard::PrimaryModifier)) {
72 temporal_zoom_step (false);
74 } else if (Keyboard::modifier_state_equals (ev->state, Keyboard::SecondaryModifier)) {
75 direction = GDK_SCROLL_LEFT;
77 } else if (Keyboard::modifier_state_equals (ev->state, Keyboard::TertiaryModifier)) {
78 if (!current_stepping_trackview) {
79 step_timeout = Glib::signal_timeout().connect (sigc::mem_fun(*this, &Editor::track_height_step_timeout), 500);
80 std::pair<TimeAxisView*, int> const p = trackview_by_y_position (ev->y + vertical_adjustment.get_value() - canvas_timebars_vsize);
81 current_stepping_trackview = p.first;
82 if (!current_stepping_trackview) {
86 last_track_height_step_timestamp = get_microseconds();
87 current_stepping_trackview->step_height (false);
90 scroll_tracks_up_line ();
96 if (Keyboard::modifier_state_equals (ev->state, Keyboard::PrimaryModifier)) {
97 temporal_zoom_step (true);
99 } else if (Keyboard::modifier_state_equals (ev->state, Keyboard::SecondaryModifier)) {
100 direction = GDK_SCROLL_RIGHT;
102 } else if (Keyboard::modifier_state_equals (ev->state, Keyboard::TertiaryModifier)) {
103 if (!current_stepping_trackview) {
104 step_timeout = Glib::signal_timeout().connect (sigc::mem_fun(*this, &Editor::track_height_step_timeout), 500);
105 std::pair<TimeAxisView*, int> const p = trackview_by_y_position (ev->y + vertical_adjustment.get_value() - canvas_timebars_vsize);
106 current_stepping_trackview = p.first;
107 if (!current_stepping_trackview) {
111 last_track_height_step_timestamp = get_microseconds();
112 current_stepping_trackview->step_height (true);
115 scroll_tracks_down_line ();
120 case GDK_SCROLL_LEFT:
121 xdelta = (current_page_frames() / 8);
122 if (leftmost_frame > xdelta) {
123 reset_x_origin (leftmost_frame - xdelta);
129 case GDK_SCROLL_RIGHT:
130 xdelta = (current_page_frames() / 8);
131 if (max_framepos - xdelta > leftmost_frame) {
132 reset_x_origin (leftmost_frame + xdelta);
134 reset_x_origin (max_framepos - current_page_frames());
147 Editor::track_canvas_scroll_event (GdkEventScroll *event)
149 track_canvas->grab_focus();
150 return track_canvas_scroll (event);
154 Editor::track_canvas_button_press_event (GdkEventButton */*event*/)
157 track_canvas->grab_focus();
162 Editor::track_canvas_button_release_event (GdkEventButton *event)
164 if (_drags->active ()) {
165 _drags->end_grab ((GdkEvent*) event);
171 Editor::track_canvas_motion_notify_event (GdkEventMotion */*event*/)
174 /* keep those motion events coming */
175 track_canvas->get_pointer (x, y);
180 Editor::track_canvas_motion (GdkEvent *ev)
182 if (_verbose_cursor->visible ()) {
183 _verbose_cursor->set_position (ev->motion.x + 10, ev->motion.y + 10);
190 Editor::typed_event (ArdourCanvas::Item* item, GdkEvent *event, ItemType type)
194 switch (event->type) {
195 case GDK_BUTTON_PRESS:
196 case GDK_2BUTTON_PRESS:
197 case GDK_3BUTTON_PRESS:
198 ret = button_press_handler (item, event, type);
200 case GDK_BUTTON_RELEASE:
201 ret = button_release_handler (item, event, type);
203 case GDK_MOTION_NOTIFY:
204 ret = motion_handler (item, event);
207 case GDK_ENTER_NOTIFY:
208 ret = enter_handler (item, event, type);
211 case GDK_LEAVE_NOTIFY:
212 ret = leave_handler (item, event, type);
216 ret = key_press_handler (item, event, type);
219 case GDK_KEY_RELEASE:
220 ret = key_release_handler (item, event, type);
230 Editor::canvas_region_view_event (GdkEvent *event, ArdourCanvas::Item* item, RegionView *rv)
234 if (!rv->sensitive ()) {
238 switch (event->type) {
239 case GDK_BUTTON_PRESS:
240 case GDK_2BUTTON_PRESS:
241 case GDK_3BUTTON_PRESS:
242 clicked_regionview = rv;
243 clicked_control_point = 0;
244 clicked_axisview = &rv->get_time_axis_view();
245 clicked_routeview = dynamic_cast<RouteTimeAxisView*>(clicked_axisview);
246 ret = button_press_handler (item, event, RegionItem);
249 case GDK_BUTTON_RELEASE:
250 ret = button_release_handler (item, event, RegionItem);
253 case GDK_MOTION_NOTIFY:
254 ret = motion_handler (item, event);
257 case GDK_ENTER_NOTIFY:
258 set_entered_track (&rv->get_time_axis_view ());
259 set_entered_regionview (rv);
262 case GDK_LEAVE_NOTIFY:
263 set_entered_track (0);
264 set_entered_regionview (0);
275 Editor::canvas_stream_view_event (GdkEvent *event, ArdourCanvas::Item* item, RouteTimeAxisView *tv)
279 switch (event->type) {
280 case GDK_BUTTON_PRESS:
281 case GDK_2BUTTON_PRESS:
282 case GDK_3BUTTON_PRESS:
283 clicked_regionview = 0;
284 clicked_control_point = 0;
285 clicked_axisview = tv;
286 clicked_routeview = dynamic_cast<RouteTimeAxisView*>(clicked_axisview);
287 ret = button_press_handler (item, event, StreamItem);
290 case GDK_BUTTON_RELEASE:
291 ret = button_release_handler (item, event, StreamItem);
294 case GDK_MOTION_NOTIFY:
295 ret = motion_handler (item, event);
298 case GDK_ENTER_NOTIFY:
299 set_entered_track (tv);
302 case GDK_LEAVE_NOTIFY:
303 set_entered_track (0);
314 Editor::canvas_automation_track_event (GdkEvent *event, ArdourCanvas::Item* item, AutomationTimeAxisView *atv)
318 switch (event->type) {
319 case GDK_BUTTON_PRESS:
320 case GDK_2BUTTON_PRESS:
321 case GDK_3BUTTON_PRESS:
322 clicked_regionview = 0;
323 clicked_control_point = 0;
324 clicked_axisview = atv;
325 clicked_routeview = 0;
326 ret = button_press_handler (item, event, AutomationTrackItem);
329 case GDK_BUTTON_RELEASE:
330 ret = button_release_handler (item, event, AutomationTrackItem);
333 case GDK_MOTION_NOTIFY:
334 ret = motion_handler (item, event);
337 case GDK_ENTER_NOTIFY:
338 ret = enter_handler (item, event, AutomationTrackItem);
341 case GDK_LEAVE_NOTIFY:
342 ret = leave_handler (item, event, AutomationTrackItem);
353 Editor::canvas_fade_in_event (GdkEvent *event, ArdourCanvas::Item* item, AudioRegionView *rv)
355 /* we handle only button 3 press/release events */
357 if (!rv->sensitive()) {
361 switch (event->type) {
362 case GDK_BUTTON_PRESS:
363 clicked_regionview = rv;
364 clicked_control_point = 0;
365 clicked_axisview = &rv->get_time_axis_view();
366 clicked_routeview = dynamic_cast<RouteTimeAxisView*>(clicked_axisview);
367 if (event->button.button == 3) {
368 return button_press_handler (item, event, FadeInItem);
372 case GDK_BUTTON_RELEASE:
373 if (event->button.button == 3) {
374 return button_release_handler (item, event, FadeInItem);
383 /* proxy for the regionview */
385 return canvas_region_view_event (event, rv->get_canvas_group(), rv);
389 Editor::canvas_fade_in_handle_event (GdkEvent *event, ArdourCanvas::Item* item, AudioRegionView *rv)
393 if (!rv->sensitive()) {
397 switch (event->type) {
398 case GDK_BUTTON_PRESS:
399 case GDK_2BUTTON_PRESS:
400 case GDK_3BUTTON_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 ret = button_press_handler (item, event, FadeInHandleItem);
408 case GDK_BUTTON_RELEASE:
409 ret = button_release_handler (item, event, FadeInHandleItem);
412 case GDK_MOTION_NOTIFY:
413 ret = motion_handler (item, event);
416 case GDK_ENTER_NOTIFY:
417 set_entered_regionview (rv);
418 ret = enter_handler (item, event, FadeInHandleItem);
421 case GDK_LEAVE_NOTIFY:
422 set_entered_regionview (0);
423 ret = leave_handler (item, event, FadeInHandleItem);
434 Editor::canvas_fade_out_event (GdkEvent *event, ArdourCanvas::Item* item, AudioRegionView *rv)
436 /* we handle only button 3 press/release events */
438 if (!rv->sensitive()) {
442 switch (event->type) {
443 case GDK_BUTTON_PRESS:
444 clicked_regionview = rv;
445 clicked_control_point = 0;
446 clicked_axisview = &rv->get_time_axis_view();
447 clicked_routeview = dynamic_cast<RouteTimeAxisView*>(clicked_axisview);
448 if (event->button.button == 3) {
449 return button_press_handler (item, event, FadeOutItem);
453 case GDK_BUTTON_RELEASE:
454 if (event->button.button == 3) {
455 return button_release_handler (item, event, FadeOutItem);
464 /* proxy for the regionview */
466 return canvas_region_view_event (event, rv->get_canvas_group(), rv);
470 Editor::canvas_fade_out_handle_event (GdkEvent *event, ArdourCanvas::Item* item, AudioRegionView *rv)
474 if (!rv->sensitive()) {
478 switch (event->type) {
479 case GDK_BUTTON_PRESS:
480 case GDK_2BUTTON_PRESS:
481 case GDK_3BUTTON_PRESS:
482 clicked_regionview = rv;
483 clicked_control_point = 0;
484 clicked_axisview = &rv->get_time_axis_view();
485 clicked_routeview = dynamic_cast<RouteTimeAxisView*>(clicked_axisview);
486 ret = button_press_handler (item, event, FadeOutHandleItem);
489 case GDK_BUTTON_RELEASE:
490 ret = button_release_handler (item, event, FadeOutHandleItem);
493 case GDK_MOTION_NOTIFY:
494 ret = motion_handler (item, event);
497 case GDK_ENTER_NOTIFY:
498 set_entered_regionview (rv);
499 ret = enter_handler (item, event, FadeOutHandleItem);
502 case GDK_LEAVE_NOTIFY:
503 set_entered_regionview (0);
504 ret = leave_handler (item, event, FadeOutHandleItem);
514 struct DescendingRegionLayerSorter {
515 bool operator()(boost::shared_ptr<Region> a, boost::shared_ptr<Region> b) {
516 return a->layer() > b->layer();
521 Editor::canvas_crossfade_view_event (GdkEvent* event, ArdourCanvas::Item* item, CrossfadeView* xfv)
523 /* we handle only button 3 press/release events */
525 switch (event->type) {
526 case GDK_BUTTON_PRESS:
527 clicked_crossfadeview = xfv;
528 clicked_axisview = &clicked_crossfadeview->get_time_axis_view();
529 clicked_routeview = dynamic_cast<RouteTimeAxisView*>(clicked_axisview);
530 if (event->button.button == 3) {
531 return button_press_handler (item, event, CrossfadeViewItem);
535 case GDK_BUTTON_RELEASE:
536 if (event->button.button == 3) {
537 bool ret = button_release_handler (item, event, CrossfadeViewItem);
547 /* XXX do not forward double clicks */
549 if (event->type == GDK_2BUTTON_PRESS) {
553 /* proxy for an underlying regionview */
555 /* XXX really need to check if we are in the name highlight,
556 and proxy to that when required.
558 XXX or in the trim rectangles
561 TimeAxisView& tv (xfv->get_time_axis_view());
562 AudioTimeAxisView* atv;
564 if ((atv = dynamic_cast<AudioTimeAxisView*>(&tv)) != 0) {
566 if (atv->is_audio_track()) {
568 boost::shared_ptr<AudioPlaylist> pl;
569 if ((pl = boost::dynamic_pointer_cast<AudioPlaylist> (atv->track()->playlist())) != 0) {
571 Playlist::RegionList* rl = pl->regions_at (event_frame (event));
574 if (atv->layer_display() == Overlaid) {
576 /* we're in overlaid mode; proxy to the uppermost region view */
578 DescendingRegionLayerSorter cmp;
581 RegionView* rv = atv->view()->find_view (rl->front());
586 return canvas_region_view_event (event, rv->get_canvas_group(), rv);
590 /* we're in stacked mode; proxy to the region view under the mouse */
594 switch (event->type) {
595 case GDK_BUTTON_PRESS:
596 case GDK_BUTTON_RELEASE:
597 cx = event->button.x;
598 cy = event->button.y;
600 case GDK_MOTION_NOTIFY:
601 cx = event->motion.x;
602 cy = event->motion.y;
604 case GDK_ENTER_NOTIFY:
605 case GDK_LEAVE_NOTIFY:
606 cx = event->crossing.x;
607 cy = event->crossing.y;
610 /* XXX: this may be wrong for some events */
611 cx = event->button.x;
612 cy = event->button.y;
615 /* position of the event within the track */
616 atv->view()->canvas_item()->w2i (cx, cy);
618 /* hence layer that we're over */
619 double const c = atv->view()->child_height ();
620 layer_t const l = pl->top_layer () + 1 - (cy / c);
623 Playlist::RegionList::iterator i = rl->begin();
624 while (i != rl->end() && (*i)->layer() != l) {
628 if (i != rl->end()) {
629 RegionView* rv = atv->view()->find_view (*i);
633 return canvas_region_view_event (event, rv->get_canvas_group(), rv);
647 Editor::canvas_control_point_event (GdkEvent *event, ArdourCanvas::Item* item, ControlPoint* cp)
649 switch (event->type) {
650 case GDK_BUTTON_PRESS:
651 case GDK_2BUTTON_PRESS:
652 case GDK_3BUTTON_PRESS:
653 clicked_control_point = cp;
654 clicked_axisview = &cp->line().trackview;
655 clicked_routeview = dynamic_cast<RouteTimeAxisView*>(clicked_axisview);
656 clicked_regionview = 0;
662 case GDK_SCROLL_DOWN:
669 return typed_event (item, event, ControlPointItem);
673 Editor::canvas_line_event (GdkEvent *event, ArdourCanvas::Item* item, AutomationLine* al)
677 if (dynamic_cast<AudioRegionGainLine*> (al) != 0) {
680 type = AutomationLineItem;
683 return typed_event (item, event, type);
687 Editor::canvas_selection_rect_event (GdkEvent *event, ArdourCanvas::Item* item, SelectionRect* rect)
691 switch (event->type) {
692 case GDK_BUTTON_PRESS:
693 case GDK_2BUTTON_PRESS:
694 case GDK_3BUTTON_PRESS:
695 clicked_selection = rect->id;
696 ret = button_press_handler (item, event, SelectionItem);
698 case GDK_BUTTON_RELEASE:
699 ret = button_release_handler (item, event, SelectionItem);
701 case GDK_MOTION_NOTIFY:
702 ret = motion_handler (item, event);
704 /* Don't need these at the moment. */
705 case GDK_ENTER_NOTIFY:
706 ret = enter_handler (item, event, SelectionItem);
709 case GDK_LEAVE_NOTIFY:
710 ret = leave_handler (item, event, SelectionItem);
721 Editor::canvas_selection_start_trim_event (GdkEvent *event, ArdourCanvas::Item* item, SelectionRect* rect)
725 switch (event->type) {
726 case GDK_BUTTON_PRESS:
727 case GDK_2BUTTON_PRESS:
728 case GDK_3BUTTON_PRESS:
729 clicked_selection = rect->id;
730 ret = button_press_handler (item, event, StartSelectionTrimItem);
732 case GDK_BUTTON_RELEASE:
733 ret = button_release_handler (item, event, StartSelectionTrimItem);
735 case GDK_MOTION_NOTIFY:
736 ret = motion_handler (item, event);
738 case GDK_ENTER_NOTIFY:
739 ret = enter_handler (item, event, StartSelectionTrimItem);
742 case GDK_LEAVE_NOTIFY:
743 ret = leave_handler (item, event, StartSelectionTrimItem);
754 Editor::canvas_selection_end_trim_event (GdkEvent *event, ArdourCanvas::Item* item, SelectionRect* rect)
758 switch (event->type) {
759 case GDK_BUTTON_PRESS:
760 case GDK_2BUTTON_PRESS:
761 case GDK_3BUTTON_PRESS:
762 clicked_selection = rect->id;
763 ret = button_press_handler (item, event, EndSelectionTrimItem);
765 case GDK_BUTTON_RELEASE:
766 ret = button_release_handler (item, event, EndSelectionTrimItem);
768 case GDK_MOTION_NOTIFY:
769 ret = motion_handler (item, event);
771 case GDK_ENTER_NOTIFY:
772 ret = enter_handler (item, event, EndSelectionTrimItem);
775 case GDK_LEAVE_NOTIFY:
776 ret = leave_handler (item, event, EndSelectionTrimItem);
787 Editor::canvas_frame_handle_event (GdkEvent* event, ArdourCanvas::Item* item, RegionView* rv)
791 /* frame handles are not active when in internal edit mode, because actual notes
792 might be in the area occupied by the handle - we want them to be editable as normal.
795 if (internal_editing() || !rv->sensitive()) {
799 /* NOTE: frame handles pretend to be the colored trim bar from an event handling
800 perspective. XXX change this ??
805 if (item->get_data ("isleft")) {
806 type = LeftFrameHandle;
808 type = RightFrameHandle;
811 switch (event->type) {
812 case GDK_BUTTON_PRESS:
813 case GDK_2BUTTON_PRESS:
814 case GDK_3BUTTON_PRESS:
815 clicked_regionview = rv;
816 clicked_control_point = 0;
817 clicked_axisview = &clicked_regionview->get_time_axis_view();
818 clicked_routeview = dynamic_cast<RouteTimeAxisView*>(clicked_axisview);
819 ret = button_press_handler (item, event, type);
821 case GDK_BUTTON_RELEASE:
822 ret = button_release_handler (item, event, type);
824 case GDK_MOTION_NOTIFY:
825 ret = motion_handler (item, event);
827 case GDK_ENTER_NOTIFY:
828 set_entered_regionview (rv);
829 ret = enter_handler (item, event, type);
832 case GDK_LEAVE_NOTIFY:
833 set_entered_regionview (0);
834 ret = leave_handler (item, event, type);
846 Editor::canvas_region_view_name_highlight_event (GdkEvent* event, ArdourCanvas::Item* item, RegionView* rv)
850 if (!rv->sensitive()) {
854 switch (event->type) {
855 case GDK_BUTTON_PRESS:
856 case GDK_2BUTTON_PRESS:
857 case GDK_3BUTTON_PRESS:
858 clicked_regionview = rv;
859 clicked_control_point = 0;
860 clicked_axisview = &clicked_regionview->get_time_axis_view();
861 clicked_routeview = dynamic_cast<RouteTimeAxisView*>(clicked_axisview);
862 ret = button_press_handler (item, event, RegionViewNameHighlight);
864 case GDK_BUTTON_RELEASE:
865 ret = button_release_handler (item, event, RegionViewNameHighlight);
867 case GDK_MOTION_NOTIFY:
868 motion_handler (item, event);
869 ret = true; // force this to avoid progagating the event into the regionview
871 case GDK_ENTER_NOTIFY:
872 set_entered_regionview (rv);
873 ret = enter_handler (item, event, RegionViewNameHighlight);
876 case GDK_LEAVE_NOTIFY:
877 set_entered_regionview (0);
878 ret = leave_handler (item, event, RegionViewNameHighlight);
889 Editor::canvas_region_view_name_event (GdkEvent *event, ArdourCanvas::Item* item, RegionView* rv)
893 if (!rv->sensitive()) {
897 switch (event->type) {
898 case GDK_BUTTON_PRESS:
899 case GDK_2BUTTON_PRESS:
900 case GDK_3BUTTON_PRESS:
901 clicked_regionview = rv;
902 clicked_control_point = 0;
903 clicked_axisview = &clicked_regionview->get_time_axis_view();
904 clicked_routeview = dynamic_cast<RouteTimeAxisView*>(clicked_axisview);
905 ret = button_press_handler (item, event, RegionViewName);
907 case GDK_BUTTON_RELEASE:
908 ret = button_release_handler (item, event, RegionViewName);
910 case GDK_MOTION_NOTIFY:
911 ret = motion_handler (item, event);
913 case GDK_ENTER_NOTIFY:
914 set_entered_regionview (rv);
915 ret = enter_handler (item, event, RegionViewName);
918 case GDK_LEAVE_NOTIFY:
919 set_entered_regionview (0);
920 ret = leave_handler (item, event, RegionViewName);
931 Editor::canvas_feature_line_event (GdkEvent *event, ArdourCanvas::Item* item, RegionView*)
935 switch (event->type) {
936 case GDK_BUTTON_PRESS:
937 case GDK_2BUTTON_PRESS:
938 case GDK_3BUTTON_PRESS:
939 clicked_regionview = 0;
940 clicked_control_point = 0;
941 clicked_axisview = 0;
942 clicked_routeview = 0; //dynamic_cast<RouteTimeAxisView*>(clicked_axisview);
943 ret = button_press_handler (item, event, FeatureLineItem);
946 case GDK_BUTTON_RELEASE:
947 ret = button_release_handler (item, event, FeatureLineItem);
950 case GDK_MOTION_NOTIFY:
951 ret = motion_handler (item, event);
954 case GDK_ENTER_NOTIFY:
955 ret = enter_handler (item, event, FeatureLineItem);
958 case GDK_LEAVE_NOTIFY:
959 ret = leave_handler (item, event, FeatureLineItem);
970 Editor::canvas_marker_event (GdkEvent *event, ArdourCanvas::Item* item, Marker* /*marker*/)
972 return typed_event (item, event, MarkerItem);
976 Editor::canvas_marker_bar_event (GdkEvent *event, ArdourCanvas::Item* item)
978 return typed_event (item, event, MarkerBarItem);
982 Editor::canvas_range_marker_bar_event (GdkEvent *event, ArdourCanvas::Item* item)
984 return typed_event (item, event, RangeMarkerBarItem);
988 Editor::canvas_transport_marker_bar_event (GdkEvent *event, ArdourCanvas::Item* item)
990 return typed_event (item, event, TransportMarkerBarItem);
994 Editor::canvas_cd_marker_bar_event (GdkEvent *event, ArdourCanvas::Item* item)
996 return typed_event (item, event, CdMarkerBarItem);
1000 Editor::canvas_tempo_marker_event (GdkEvent *event, ArdourCanvas::Item* item, TempoMarker* /*marker*/)
1002 return typed_event (item, event, TempoMarkerItem);
1006 Editor::canvas_meter_marker_event (GdkEvent *event, ArdourCanvas::Item* item, MeterMarker* /*marker*/)
1008 return typed_event (item, event, MeterMarkerItem);
1012 Editor::canvas_tempo_bar_event (GdkEvent *event, ArdourCanvas::Item* item)
1014 return typed_event (item, event, TempoBarItem);
1018 Editor::canvas_meter_bar_event (GdkEvent *event, ArdourCanvas::Item* item)
1020 return typed_event (item, event, MeterBarItem);
1024 Editor::canvas_playhead_cursor_event (GdkEvent *event, ArdourCanvas::Item* item)
1026 return typed_event (item, event, PlayheadCursorItem);
1030 Editor::canvas_zoom_rect_event (GdkEvent *event, ArdourCanvas::Item* item)
1032 return typed_event (item, event, NoItem);
1036 Editor::canvas_note_event (GdkEvent *event, ArdourCanvas::Item* item)
1038 if (!internal_editing()) {
1042 return typed_event (item, event, NoteItem);
1046 Editor::track_canvas_drag_motion (Glib::RefPtr<Gdk::DragContext> const & /*c*/, int x, int y, guint /*time*/)
1050 track_canvas->window_to_world (x, y, wx, wy);
1053 event.type = GDK_MOTION_NOTIFY;
1054 event.button.x = wx;
1055 event.button.y = wy;
1056 /* assume we're dragging with button 1 */
1057 event.motion.state = Gdk::BUTTON1_MASK;
1059 if (!_drags->active ()) {
1063 framepos_t const pos = event_frame (&event, &px, &py);
1065 std::pair<TimeAxisView*, int> const tv = trackview_by_y_position (py);
1066 if (tv.first == 0) {
1070 RouteTimeAxisView* rtav = dynamic_cast<RouteTimeAxisView*> (tv.first);
1071 if (rtav == 0 || !rtav->is_track ()) {
1075 boost::shared_ptr<Region> region = _regions->get_dragged_region ();
1081 boost::shared_ptr<Region> region_copy = RegionFactory::create (region);
1083 if (boost::dynamic_pointer_cast<AudioRegion> (region_copy) != 0 &&
1084 dynamic_cast<AudioTimeAxisView*> (tv.first) == 0) {
1086 /* audio -> non-audio */
1090 if (boost::dynamic_pointer_cast<MidiRegion> (region_copy) == 0 &&
1091 dynamic_cast<MidiTimeAxisView*> (tv.first) != 0) {
1093 /* MIDI -> non-MIDI */
1097 _drags->set (new RegionInsertDrag (this, region_copy, rtav, pos), &event);
1100 _drags->motion_handler (&event, false);
1106 Editor::key_press_handler (ArdourCanvas::Item*, GdkEvent*, ItemType)
1112 Editor::key_release_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemType type)
1115 bool handled = false;
1118 case TempoMarkerItem:
1119 switch (event->key.keyval) {
1121 remove_tempo_marker (item);
1129 case MeterMarkerItem:
1130 switch (event->key.keyval) {
1132 remove_meter_marker (item);