33 #include "canvas/canvas.h"
34 #include "canvas/text.h"
35 #include "canvas/scroll_group.h"
67 if (Keyboard::some_magic_widget_has_focus()) {
72 int direction = ev->direction;
78 Duple event_coords = _track_canvas->window_to_canvas (Duple (ev->x, ev->y));
83 if (Keyboard::modifier_state_equals (ev->state, Keyboard::ScrollZoomHorizontalModifier)) {
86 zoom_focus = Editing::ZoomFocusMouse;
87 temporal_zoom_step (
false);
88 zoom_focus = temp_focus;
90 }
else if (Keyboard::modifier_state_equals (ev->state, Keyboard::ScrollHorizontalModifier)) {
91 direction = GDK_SCROLL_LEFT;
93 }
else if (Keyboard::modifier_state_equals (ev->state, Keyboard::ScrollZoomVerticalModifier)) {
94 if (!current_stepping_trackview) {
96 std::pair<TimeAxisView*, int>
const p = trackview_by_y_position (event_coords.y,
false);
97 current_stepping_trackview = p.first;
98 if (!current_stepping_trackview) {
103 current_stepping_trackview->step_height (
false);
106 scroll_up_one_track ();
111 case GDK_SCROLL_DOWN:
112 if (Keyboard::modifier_state_equals (ev->state, Keyboard::ScrollZoomHorizontalModifier)) {
115 zoom_focus = Editing::ZoomFocusMouse;
116 temporal_zoom_step (
true);
117 zoom_focus = temp_focus;
119 }
else if (Keyboard::modifier_state_equals (ev->state, Keyboard::ScrollHorizontalModifier)) {
120 direction = GDK_SCROLL_RIGHT;
122 }
else if (Keyboard::modifier_state_equals (ev->state, Keyboard::ScrollZoomVerticalModifier)) {
123 if (!current_stepping_trackview) {
125 std::pair<TimeAxisView*, int>
const p = trackview_by_y_position (event_coords.y,
false);
126 current_stepping_trackview = p.first;
127 if (!current_stepping_trackview) {
132 current_stepping_trackview->step_height (
true);
135 scroll_down_one_track ();
140 case GDK_SCROLL_LEFT:
141 xdelta = (current_page_samples() / 8);
142 if (leftmost_frame > xdelta) {
143 reset_x_origin (leftmost_frame - xdelta);
149 case GDK_SCROLL_RIGHT:
150 xdelta = (current_page_samples() / 8);
152 reset_x_origin (leftmost_frame + xdelta);
170 boost::optional<ArdourCanvas::Rect> rulers = _time_markers_group->bounding_box();
171 if (rulers && rulers->contains (Duple (event->x, event->y))) {
172 return canvas_ruler_event ((GdkEvent*) event, timecode_ruler,
TimecodeRulerItem);
176 _track_canvas->grab_focus();
177 return track_canvas_scroll (event);
183 _track_canvas->grab_focus();
184 if (!Keyboard::is_context_menu_event (event)) {
185 begin_reversible_selection_op (
X_(
"Clear Selection Click (track canvas)"));
187 commit_reversible_selection_op();
195 if (!Keyboard::is_context_menu_event (event)) {
196 if (_drags->active ()) {
197 _drags->end_grab ((GdkEvent*) event);
208 _track_canvas->get_pointer (x, y);
217 switch (event->type) {
218 case GDK_BUTTON_PRESS:
219 case GDK_2BUTTON_PRESS:
220 case GDK_3BUTTON_PRESS:
221 ret = button_press_handler (item, event, type);
223 case GDK_BUTTON_RELEASE:
224 ret = button_release_handler (item, event, type);
226 case GDK_MOTION_NOTIFY:
227 ret = motion_handler (item, event);
230 case GDK_ENTER_NOTIFY:
231 ret = enter_handler (item, event, type);
234 case GDK_LEAVE_NOTIFY:
235 ret = leave_handler (item, event, type);
239 ret = key_press_handler (item, event, type);
242 case GDK_KEY_RELEASE:
243 ret = key_release_handler (item, event, type);
261 switch (event->type) {
262 case GDK_BUTTON_PRESS:
263 case GDK_2BUTTON_PRESS:
264 case GDK_3BUTTON_PRESS:
265 clicked_regionview = rv;
266 clicked_control_point = 0;
269 ret = button_press_handler (item, event,
RegionItem);
272 case GDK_BUTTON_RELEASE:
273 ret = button_release_handler (item, event,
RegionItem);
276 case GDK_MOTION_NOTIFY:
277 ret = motion_handler (item, event);
280 case GDK_ENTER_NOTIFY:
281 set_entered_regionview (rv);
282 ret = enter_handler (item, event,
RegionItem);
285 case GDK_LEAVE_NOTIFY:
286 if (event->crossing.detail != GDK_NOTIFY_INFERIOR) {
287 set_entered_regionview (0);
288 ret = leave_handler (item, event,
RegionItem);
321 switch (event->type) {
322 case GDK_ENTER_NOTIFY:
323 set_entered_regionview (rv);
324 ret = enter_handler (item, event,
WaveItem);
340 switch (event->type) {
341 case GDK_BUTTON_PRESS:
342 case GDK_2BUTTON_PRESS:
343 case GDK_3BUTTON_PRESS:
344 clicked_regionview = 0;
345 clicked_control_point = 0;
346 clicked_axisview = tv;
348 ret = button_press_handler (item, event,
StreamItem);
351 case GDK_BUTTON_RELEASE:
352 ret = button_release_handler (item, event,
StreamItem);
355 case GDK_MOTION_NOTIFY:
356 ret = motion_handler (item, event);
359 case GDK_ENTER_NOTIFY:
360 set_entered_track (tv);
361 ret = enter_handler (item, event,
StreamItem);
364 case GDK_LEAVE_NOTIFY:
365 if (event->crossing.detail != GDK_NOTIFY_INFERIOR) {
366 set_entered_track (0);
368 ret = leave_handler (item, event,
StreamItem);
383 switch (event->type) {
384 case GDK_BUTTON_PRESS:
385 case GDK_2BUTTON_PRESS:
386 case GDK_3BUTTON_PRESS:
387 clicked_regionview = 0;
388 clicked_control_point = 0;
389 clicked_axisview = atv;
390 clicked_routeview = 0;
394 case GDK_BUTTON_RELEASE:
398 case GDK_MOTION_NOTIFY:
399 ret = motion_handler (item, event);
402 case GDK_ENTER_NOTIFY:
406 case GDK_LEAVE_NOTIFY:
424 switch (event->type) {
425 case GDK_BUTTON_PRESS:
426 clicked_regionview = rv;
427 clicked_control_point = 0;
430 if (event->button.button == 3) {
435 case GDK_BUTTON_RELEASE:
436 if (event->button.button == 3) {
459 switch (event->type) {
460 case GDK_BUTTON_PRESS:
461 clicked_regionview = rv;
462 clicked_control_point = 0;
465 if (event->button.button == 3) {
470 case GDK_BUTTON_RELEASE:
471 if (event->button.button == 3) {
496 switch (event->type) {
497 case GDK_BUTTON_PRESS:
498 clicked_regionview = rv;
499 clicked_control_point = 0;
502 if (event->button.button == 3) {
503 return button_press_handler (item, event,
FadeInItem);
507 case GDK_BUTTON_RELEASE:
508 if (event->button.button == 3) {
509 return button_release_handler (item, event,
FadeInItem);
520 if (event->type == GDK_ENTER_NOTIFY || event->type == GDK_LEAVE_NOTIFY) {
536 switch (event->type) {
537 case GDK_BUTTON_PRESS:
538 case GDK_2BUTTON_PRESS:
539 case GDK_3BUTTON_PRESS:
540 clicked_regionview = rv;
541 clicked_control_point = 0;
547 case GDK_BUTTON_RELEASE:
552 case GDK_MOTION_NOTIFY:
553 ret = motion_handler (item, event);
556 case GDK_ENTER_NOTIFY:
560 case GDK_LEAVE_NOTIFY:
580 switch (event->type) {
581 case GDK_BUTTON_PRESS:
582 clicked_regionview = rv;
583 clicked_control_point = 0;
586 if (event->button.button == 3) {
587 return button_press_handler (item, event,
FadeOutItem);
591 case GDK_BUTTON_RELEASE:
592 if (event->button.button == 3) {
593 return button_release_handler (item, event,
FadeOutItem);
604 if (event->type == GDK_ENTER_NOTIFY || event->type == GDK_LEAVE_NOTIFY) {
620 switch (event->type) {
621 case GDK_BUTTON_PRESS:
622 case GDK_2BUTTON_PRESS:
623 case GDK_3BUTTON_PRESS:
624 clicked_regionview = rv;
625 clicked_control_point = 0;
631 case GDK_BUTTON_RELEASE:
636 case GDK_MOTION_NOTIFY:
637 ret = motion_handler (item, event);
640 case GDK_ENTER_NOTIFY:
644 case GDK_LEAVE_NOTIFY:
664 switch (event->type) {
665 case GDK_BUTTON_PRESS:
666 case GDK_2BUTTON_PRESS:
667 case GDK_3BUTTON_PRESS:
668 clicked_control_point = cp;
671 clicked_regionview = 0;
677 case GDK_SCROLL_DOWN:
692 if (dynamic_cast<AudioRegionGainLine*> (al) != 0) {
698 return typed_event (item, event, type);
706 switch (event->type) {
707 case GDK_BUTTON_PRESS:
708 case GDK_2BUTTON_PRESS:
709 case GDK_3BUTTON_PRESS:
710 clicked_selection = rect->
id;
713 case GDK_BUTTON_RELEASE:
716 case GDK_MOTION_NOTIFY:
717 ret = motion_handler (item, event);
720 case GDK_ENTER_NOTIFY:
724 case GDK_LEAVE_NOTIFY:
740 switch (event->type) {
741 case GDK_BUTTON_PRESS:
742 case GDK_2BUTTON_PRESS:
743 case GDK_3BUTTON_PRESS:
744 clicked_selection = rect->
id;
747 case GDK_BUTTON_RELEASE:
750 case GDK_MOTION_NOTIFY:
751 ret = motion_handler (item, event);
753 case GDK_ENTER_NOTIFY:
757 case GDK_LEAVE_NOTIFY:
773 switch (event->type) {
774 case GDK_BUTTON_PRESS:
775 case GDK_2BUTTON_PRESS:
776 case GDK_3BUTTON_PRESS:
777 clicked_selection = rect->
id;
780 case GDK_BUTTON_RELEASE:
783 case GDK_MOTION_NOTIFY:
784 ret = motion_handler (item, event);
786 case GDK_ENTER_NOTIFY:
790 case GDK_LEAVE_NOTIFY:
810 if (internal_editing() || !rv->
sensitive()) {
820 if (item->get_data (
"isleft")) {
826 switch (event->type) {
827 case GDK_BUTTON_PRESS:
828 case GDK_2BUTTON_PRESS:
829 case GDK_3BUTTON_PRESS:
830 clicked_regionview = rv;
831 clicked_control_point = 0;
834 ret = button_press_handler (item, event, type);
836 case GDK_BUTTON_RELEASE:
837 ret = button_release_handler (item, event, type);
839 case GDK_MOTION_NOTIFY:
840 ret = motion_handler (item, event);
842 case GDK_ENTER_NOTIFY:
843 ret = enter_handler (item, event, type);
846 case GDK_LEAVE_NOTIFY:
847 ret = leave_handler (item, event, type);
867 switch (event->type) {
868 case GDK_BUTTON_PRESS:
869 case GDK_2BUTTON_PRESS:
870 case GDK_3BUTTON_PRESS:
871 clicked_regionview = rv;
872 clicked_control_point = 0;
877 case GDK_BUTTON_RELEASE:
880 case GDK_MOTION_NOTIFY:
881 motion_handler (item, event);
884 case GDK_ENTER_NOTIFY:
888 case GDK_LEAVE_NOTIFY:
908 switch (event->type) {
909 case GDK_BUTTON_PRESS:
910 case GDK_2BUTTON_PRESS:
911 case GDK_3BUTTON_PRESS:
912 clicked_regionview = rv;
913 clicked_control_point = 0;
918 case GDK_BUTTON_RELEASE:
921 case GDK_MOTION_NOTIFY:
922 ret = motion_handler (item, event);
924 case GDK_ENTER_NOTIFY:
928 case GDK_LEAVE_NOTIFY:
944 switch (event->type) {
945 case GDK_BUTTON_PRESS:
946 case GDK_2BUTTON_PRESS:
947 case GDK_3BUTTON_PRESS:
948 clicked_regionview = 0;
949 clicked_control_point = 0;
950 clicked_axisview = 0;
951 clicked_routeview = 0;
955 case GDK_BUTTON_RELEASE:
959 case GDK_MOTION_NOTIFY:
960 ret = motion_handler (item, event);
963 case GDK_ENTER_NOTIFY:
967 case GDK_LEAVE_NOTIFY:
1030 bool handled =
false;
1032 if (event->type == GDK_SCROLL) {
1038 switch (event->scroll.direction) {
1044 zoom_focus = Editing::ZoomFocusMouse;
1045 temporal_zoom_step (
false);
1046 zoom_focus = temp_focus;
1048 temporal_zoom_step (
false);
1053 case GDK_SCROLL_DOWN:
1057 zoom_focus = Editing::ZoomFocusMouse;
1058 temporal_zoom_step (
true);
1059 zoom_focus = temp_focus;
1061 temporal_zoom_step (
true);
1066 case GDK_SCROLL_LEFT:
1067 xdelta = (current_page_samples() / 2);
1068 if (leftmost_frame > xdelta) {
1069 reset_x_origin (leftmost_frame - xdelta);
1076 case GDK_SCROLL_RIGHT:
1077 xdelta = (current_page_samples() / 2);
1079 reset_x_origin (leftmost_frame + xdelta);
1081 reset_x_origin (
max_framepos - current_page_samples());
1093 return typed_event (item, event, type);
1117 if (!internal_editing()) {
1121 return typed_event (item, event,
NoteItem);
1127 GdkEventScroll scroll;
1128 ArdourCanvas::Duple winpos;
1130 switch (event->type) {
1131 case GDK_BUTTON_RELEASE:
1132 if (event->button.button == 1) {
1133 begin_reversible_selection_op (
X_(
"Nowhere Click"));
1134 selection->clear_objects ();
1135 selection->clear_tracks ();
1136 commit_reversible_selection_op ();
1144 winpos = _track_canvas->canvas_to_window (Duple (event->scroll.x, event->scroll.y));
1145 scroll =
event->scroll;
1146 scroll.x = winpos.x;
1147 scroll.y = winpos.y;
1148 return canvas_scroll_event (&scroll,
true);
1151 case GDK_ENTER_NOTIFY:
1152 return typed_event (_canvas_drop_zone, event,
DropZoneItem);
1154 case GDK_LEAVE_NOTIFY:
1155 return typed_event (_canvas_drop_zone, event,
DropZoneItem);
1174 string target = _track_canvas->drag_dest_find_target (context, _track_canvas->drag_dest_get_target_list());
1176 if (target.empty()) {
1180 event.type = GDK_MOTION_NOTIFY;
1184 event.motion.state = Gdk::BUTTON1_MASK;
1186 (void) window_event_sample (&event, &px, &py);
1188 std::pair<TimeAxisView*, int>
const tv = trackview_by_y_position (py,
false);
1189 bool can_drop =
false;
1191 if (tv.first != 0) {
1197 if (rtav != 0 && rtav->
is_track ()) {
1209 region = _regions->get_dragged_region ();
1215 boost::dynamic_pointer_cast<AudioRegion> (region) != 0 ||
1216 boost::dynamic_pointer_cast<MidiRegion> (region) != 0
1221 context->drag_status (context->get_suggested_action(), time);
1225 if ((boost::dynamic_pointer_cast<AudioRegion> (region) != 0 &&
1226 dynamic_cast<AudioTimeAxisView*> (tv.first) != 0) ||
1228 dynamic_cast<MidiTimeAxisView*> (tv.first) != 0)) {
1235 context->drag_status (context->get_suggested_action(), time);
1245 context->drag_status(Gdk::ACTION_COPY, time);
1247 if ((context->get_actions() & (Gdk::ACTION_COPY | Gdk::ACTION_LINK | Gdk::ACTION_MOVE)) == Gdk::ACTION_COPY) {
1248 context->drag_status(Gdk::ACTION_COPY, time);
1250 context->drag_status(Gdk::ACTION_LINK, time);
1258 context->drag_status (Gdk::DragAction (0), time);
1265 const SelectionData& ,
1272 event.type = GDK_MOTION_NOTIFY;
1276 event.motion.state = Gdk::BUTTON1_MASK;
1277 framepos_t const pos = window_event_sample (&event, &px, &py);
1280 if (!region) {
return; }
1283 std::pair<TimeAxisView*, int>
const tv = trackview_by_y_position (py,
false);
1285 if (tv.first != 0) {
1289 if (boost::dynamic_pointer_cast<AudioRegion> (region)) {
1292 output_chan = session()->master_out()->n_inputs().n_audio();
1294 list<boost::shared_ptr<AudioTrack> > audio_tracks;
1296 rtav = axis_view_from_route (audio_tracks.front());
1297 }
else if (boost::dynamic_pointer_cast<MidiRegion> (region)) {
1298 ChanCount one_midi_port (DataType::MIDI, 1);
1299 list<boost::shared_ptr<MidiTrack> > midi_tracks;
1301 rtav = axis_view_from_route (midi_tracks.front());
1306 error <<
_(
"Could not create new track after region placed in the drop zone") <<
endmsg;
1311 if (rtav != 0 && rtav->
is_track ()) {
1314 if ((boost::dynamic_pointer_cast<AudioRegion> (region_copy) != 0 && dynamic_cast<AudioTimeAxisView*> (rtav) != 0) ||
1315 (boost::dynamic_pointer_cast<MidiRegion> (region_copy) != 0 && dynamic_cast<MidiTimeAxisView*> (rtav) != 0)) {
1317 _drags->end_grab (0);
1332 bool handled =
false;
1336 switch (event->key.keyval) {
1338 remove_tempo_marker (item);
1347 switch (event->key.keyval) {
1349 remove_meter_marker (item);
bool canvas_fade_in_handle_event(GdkEvent *event, ArdourCanvas::Item *, AudioRegionView *, bool trim=false)
ArdourCanvas::Item * get_canvas_group()
bool operator()(boost::shared_ptr< Region > a, boost::shared_ptr< Region > b)
bool typed_event(ArdourCanvas::Item *, GdkEvent *, ItemType)
TimeAxisView & get_time_axis_view() const
bool canvas_control_point_event(GdkEvent *event, ArdourCanvas::Item *, ControlPoint *)
bool canvas_ruler_event(GdkEvent *event, ArdourCanvas::Item *, ItemType)
bool canvas_scroll_event(GdkEventScroll *event, bool from_canvas)
bool canvas_wave_view_event(GdkEvent *event, ArdourCanvas::Item *, RegionView *)
bool track_canvas_motion_notify_event(GdkEventMotion *event)
gint track_height_step_timeout()
bool canvas_stream_view_event(GdkEvent *event, ArdourCanvas::Item *, RouteTimeAxisView *)
bool canvas_cd_marker_bar_event(GdkEvent *event, ArdourCanvas::Item *)
bool canvas_fade_in_event(GdkEvent *event, ArdourCanvas::Item *, AudioRegionView *)
shared_ptr< T > dynamic_pointer_cast(shared_ptr< U > const &r)
AutomationLine & line() const
bool canvas_selection_end_trim_event(GdkEvent *event, ArdourCanvas::Item *, SelectionRect *)
LIBPBD_API Transmitter error
bool canvas_range_marker_bar_event(GdkEvent *event, ArdourCanvas::Item *)
std::ostream & endmsg(std::ostream &ostr)
bool canvas_drop_zone_event(GdkEvent *event)
bool track_canvas_drag_motion(Glib::RefPtr< Gdk::DragContext > const &, int, int, guint)
bool canvas_region_view_name_event(GdkEvent *event, ArdourCanvas::Item *, RegionView *)
bool track_canvas_button_release_event(GdkEventButton *event)
bool canvas_line_event(GdkEvent *event, ArdourCanvas::Item *, AutomationLine *)
bool canvas_meter_bar_event(GdkEvent *event, ArdourCanvas::Item *)
bool canvas_marker_bar_event(GdkEvent *event, ArdourCanvas::Item *)
bool canvas_videotl_bar_event(GdkEvent *event, ArdourCanvas::Item *)
LIBARDOUR_API microseconds_t get_microseconds()
bool canvas_region_view_event(GdkEvent *event, ArdourCanvas::Item *, RegionView *)
LIBGTKMM2EXT_API uint64_t Keyboard
bool key_release_handler(ArdourCanvas::Item *, GdkEvent *, ItemType)
bool canvas_start_xfade_event(GdkEvent *event, ArdourCanvas::Item *, AudioRegionView *)
LIBARDOUR_API RCConfiguration * Config
framepos_t get_fade_out_shape_width()
boost::shared_ptr< ARDOUR::Region > region() const
bool track_canvas_button_press_event(GdkEventButton *event)
bool canvas_tempo_bar_event(GdkEvent *event, ArdourCanvas::Item *)
bool canvas_selection_start_trim_event(GdkEvent *event, ArdourCanvas::Item *, SelectionRect *)
bool canvas_region_view_name_highlight_event(GdkEvent *event, ArdourCanvas::Item *, RegionView *)
bool canvas_end_xfade_event(GdkEvent *event, ArdourCanvas::Item *, AudioRegionView *)
bool canvas_meter_marker_event(GdkEvent *event, ArdourCanvas::Item *, MeterMarker *)
LIBARDOUR_API RuntimeProfile * Profile
bool canvas_automation_track_event(GdkEvent *event, ArdourCanvas::Item *, AutomationTimeAxisView *)
void drop_regions(const Glib::RefPtr< Gdk::DragContext > &context, gint x, gint y, const Gtk::SelectionData &data, guint info, guint time)
framepos_t position() const
bool canvas_transport_marker_bar_event(GdkEvent *event, ArdourCanvas::Item *)
bool key_press_handler(ArdourCanvas::Item *, GdkEvent *, ItemType)
bool canvas_note_event(GdkEvent *event, ArdourCanvas::Item *)
bool canvas_playhead_cursor_event(GdkEvent *event, ArdourCanvas::Item *)
uint32_t n_channels() const
bool canvas_selection_rect_event(GdkEvent *event, ArdourCanvas::Item *, SelectionRect *)
static UIConfiguration * config()
bool canvas_marker_event(GdkEvent *event, ArdourCanvas::Item *, Marker *)
bool canvas_feature_line_event(GdkEvent *event, ArdourCanvas::Item *, RegionView *)
bool canvas_fade_out_event(GdkEvent *event, ArdourCanvas::Item *, AudioRegionView *)
static const framepos_t max_framepos
bool track_canvas_scroll(GdkEventScroll *event)
LIBARDOUR_API GQuark region_copy
bool canvas_frame_handle_event(GdkEvent *event, ArdourCanvas::Item *, RegionView *)
framepos_t last_frame() const
bool canvas_tempo_marker_event(GdkEvent *event, ArdourCanvas::Item *, TempoMarker *)
bool canvas_fade_out_handle_event(GdkEvent *event, ArdourCanvas::Item *, AudioRegionView *, bool trim=false)