diff options
author | Paul Davis <paul@linuxaudiosystems.com> | 2014-06-12 15:58:05 -0400 |
---|---|---|
committer | Paul Davis <paul@linuxaudiosystems.com> | 2014-06-12 15:58:05 -0400 |
commit | ea355bfe15c8490ebc81fd093eeae8359fed77fa (patch) | |
tree | 4145762cef368ab69b0f2ec7676fb201b740a156 /gtk2_ardour/editor_canvas_events.cc | |
parent | 590882f3c8e063528452d71daffb36d3151da05e (diff) |
add canvas rulers event dispatch and reinstate scrolling behaviour
Diffstat (limited to 'gtk2_ardour/editor_canvas_events.cc')
-rw-r--r-- | gtk2_ardour/editor_canvas_events.cc | 57 |
1 files changed, 57 insertions, 0 deletions
diff --git a/gtk2_ardour/editor_canvas_events.cc b/gtk2_ardour/editor_canvas_events.cc index 34c81597be..f8fb2f3511 100644 --- a/gtk2_ardour/editor_canvas_events.cc +++ b/gtk2_ardour/editor_canvas_events.cc @@ -162,6 +162,10 @@ Editor::track_canvas_scroll (GdkEventScroll* ev) bool Editor::canvas_scroll_event (GdkEventScroll *event) { + if (h_scroll_group->covers (Duple (event->x, event->y))) { + return canvas_ruler_event ((GdkEvent*) event, timecode_ruler, TimecodeRulerItem); + } + _track_canvas->grab_focus(); return track_canvas_scroll (event); } @@ -980,6 +984,59 @@ Editor::canvas_meter_marker_event (GdkEvent *event, ArdourCanvas::Item* item, Me } bool +Editor::canvas_ruler_event (GdkEvent *event, ArdourCanvas::Item* item, ItemType type) +{ + framepos_t xdelta; + bool handled = false; + + if (event->type == GDK_SCROLL) { + + /* scroll events in the rulers are handled a little differently from + scrolling elsewhere in the canvas. + */ + + switch (event->scroll.direction) { + case GDK_SCROLL_UP: + temporal_zoom_step (false); + handled = true; + break; + + case GDK_SCROLL_DOWN: + temporal_zoom_step (true); + handled = true; + break; + + case GDK_SCROLL_LEFT: + xdelta = (current_page_samples() / 2); + if (leftmost_frame > xdelta) { + reset_x_origin (leftmost_frame - xdelta); + } else { + reset_x_origin (0); + } + handled = true; + break; + + case GDK_SCROLL_RIGHT: + xdelta = (current_page_samples() / 2); + if (max_framepos - xdelta > leftmost_frame) { + reset_x_origin (leftmost_frame + xdelta); + } else { + reset_x_origin (max_framepos - current_page_samples()); + } + handled = true; + break; + + default: + /* what? */ + break; + } + return handled; + } + + return typed_event (item, event, type); +} + +bool Editor::canvas_tempo_bar_event (GdkEvent *event, ArdourCanvas::Item* item) { return typed_event (item, event, TempoBarItem); |