X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=gtk2_ardour%2Feditor_canvas_events.cc;h=f7e7a590dd39596ad8887304c6bc061dd0ab8e37;hb=5119d48267be90aa4af3daa91f8bb72e6ab57c2c;hp=ec4115f352b7b90be892ba0e21cdd28144e85bb6;hpb=4b233612261e2d13ebbd1931f4d999c6da1451e9;p=ardour.git diff --git a/gtk2_ardour/editor_canvas_events.cc b/gtk2_ardour/editor_canvas_events.cc index ec4115f352..f7e7a590dd 100644 --- a/gtk2_ardour/editor_canvas_events.cc +++ b/gtk2_ardour/editor_canvas_events.cc @@ -15,21 +15,21 @@ along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - $Id$ */ #include #include -#include +#include -#include +#include #include #include "editor.h" +#include "keyboard.h" #include "public_editor.h" -#include "regionview.h" -#include "streamview.h" +#include "audio_region_view.h" +#include "audio_streamview.h" #include "crossfade_view.h" #include "audio_time_axis.h" #include "region_gain_line.h" @@ -37,296 +37,177 @@ #include "automation_pan_line.h" #include "automation_time_axis.h" #include "redirect_automation_line.h" +#include "canvas_impl.h" +#include "simplerect.h" #include "i18n.h" using namespace sigc; using namespace ARDOUR; +using namespace PBD; using namespace Gtk; -gint -Editor::_canvas_copy_region_event (GnomeCanvasItem *item, GdkEvent *event, gpointer data) -{ - Editor* editor = (Editor*)data; - return editor->signal_canvas_copy_region_event() (item, event); -} - -gint -Editor::_canvas_crossfade_view_event (GnomeCanvasItem *item, GdkEvent *event, gpointer data) -{ - CrossfadeView* xfv = static_cast (data); - Editor* editor = dynamic_cast(&xfv->get_time_axis_view().editor); - return editor->signal_canvas_crossfade_view_event() (item, event, xfv); -} - -gint -Editor::_canvas_fade_in_event (GnomeCanvasItem *item, GdkEvent *event, gpointer data) -{ - AudioRegionView* rv = static_cast (data); - Editor* editor = dynamic_cast(&rv->get_time_axis_view().editor); - return editor->signal_canvas_fade_in_event() (item, event, rv); -} - -gint -Editor::_canvas_fade_in_handle_event (GnomeCanvasItem *item, GdkEvent *event, gpointer data) -{ - AudioRegionView* rv = static_cast (data); - Editor* editor = dynamic_cast(&rv->get_time_axis_view().editor); - return editor->signal_canvas_fade_in_handle_event() (item, event, rv); -} - -gint -Editor::_canvas_fade_out_event (GnomeCanvasItem *item, GdkEvent *event, gpointer data) -{ - AudioRegionView* rv = static_cast (data); - Editor* editor = dynamic_cast(&rv->get_time_axis_view().editor); - return editor->signal_canvas_fade_out_event() (item, event, rv); -} - -gint -Editor::_canvas_fade_out_handle_event (GnomeCanvasItem *item, GdkEvent *event, gpointer data) -{ - AudioRegionView* rv = static_cast (data); - Editor* editor = dynamic_cast(&rv->get_time_axis_view().editor); - return editor->signal_canvas_fade_out_handle_event() (item, event, rv); -} - -gint -Editor::_canvas_region_view_event (GnomeCanvasItem *item, GdkEvent *event, gpointer data) -{ - AudioRegionView *rv = reinterpret_cast(data); - Editor* editor = dynamic_cast(&rv->get_time_axis_view().editor); - - return editor->signal_canvas_region_view_event() (item, event, rv); -} - -gint -Editor::_canvas_region_view_name_highlight_event (GnomeCanvasItem *item, GdkEvent *event, gpointer data) -{ - AudioRegionView *rv = reinterpret_cast (data); - Editor* editor = dynamic_cast(&rv->get_time_axis_view().editor); - - return editor->signal_canvas_region_view_name_highlight_event() (item, event); -} - -gint -Editor::_canvas_region_view_name_event (GnomeCanvasItem *item, GdkEvent *event, gpointer data) -{ - AudioRegionView *rv = reinterpret_cast (data); - Editor* editor = dynamic_cast(&rv->get_time_axis_view().editor); - - return editor->signal_canvas_region_view_name_event() (item, event); -} - -gint -Editor::_canvas_stream_view_event (GnomeCanvasItem *item, GdkEvent *event, gpointer data) -{ - /* note that stream views are by definition audio track views */ - - AudioTimeAxisView *tv = (AudioTimeAxisView *) data; - Editor* editor = dynamic_cast(&tv->editor); - - return editor->signal_canvas_stream_view_event() (item, event, tv); -} - -gint -Editor::_canvas_automation_track_event (GnomeCanvasItem *item, GdkEvent *event, gpointer data) -{ - AutomationTimeAxisView* atv = (AutomationTimeAxisView*) data; - Editor* editor = dynamic_cast(&atv->editor); - - return editor->signal_canvas_automation_track_event() (item, event, atv); -} +bool +Editor::track_canvas_scroll (GdkEventScroll* ev) +{ + int x, y; + double wx, wy; + nframes_t xdelta; + int direction = ev->direction; + + retry: + switch (direction) { + case GDK_SCROLL_UP: + if (Keyboard::modifier_state_equals (ev->state, Keyboard::PrimaryModifier)) { + //if (ev->state == GDK_CONTROL_MASK) { + /* XXX + the ev->x will be out of step with the canvas + if we're in mid zoom, so we have to get the damn mouse + pointer again + */ + track_canvas.get_pointer (x, y); + track_canvas.window_to_world (x, y, wx, wy); + wx += horizontal_adjustment.get_value(); + wy += vertical_adjustment.get_value(); + + GdkEvent event; + event.type = GDK_BUTTON_RELEASE; + event.button.x = wx; + event.button.y = wy; + + nframes_t where = event_frame (&event, 0, 0); + temporal_zoom_to_frame (false, where); + return true; + } else if (Keyboard::modifier_state_equals (ev->state, Keyboard::SecondaryModifier)) { + direction = GDK_SCROLL_LEFT; + goto retry; + } else if (Keyboard::modifier_state_equals (ev->state, Keyboard::TertiaryModifier)) { + if (!current_stepping_trackview) { + step_timeout = Glib::signal_timeout().connect (mem_fun(*this, &Editor::track_height_step_timeout), 500); + if (!(current_stepping_trackview = trackview_by_y_position (ev->y))) { + return false; + } + } + gettimeofday (&last_track_height_step_timestamp, 0); + current_stepping_trackview->step_height (true); + return true; + } else { + scroll_tracks_up_line (); + return true; + } + break; -gint -Editor::_canvas_control_point_event (GnomeCanvasItem *item, GdkEvent *event, gpointer data) -{ - ControlPoint *cp = reinterpret_cast(data); - Editor* editor = dynamic_cast(&cp->line.trackview.editor); + case GDK_SCROLL_DOWN: + if (Keyboard::modifier_state_equals (ev->state, Keyboard::PrimaryModifier)) { + //if (ev->state == GDK_CONTROL_MASK) { + track_canvas.get_pointer (x, y); + track_canvas.window_to_world (x, y, wx, wy); + wx += horizontal_adjustment.get_value(); + wy += vertical_adjustment.get_value(); + + GdkEvent event; + event.type = GDK_BUTTON_RELEASE; + event.button.x = wx; + event.button.y = wy; + + nframes_t where = event_frame (&event, 0, 0); + temporal_zoom_to_frame (true, where); + return true; + } else if (Keyboard::modifier_state_equals (ev->state, Keyboard::SecondaryModifier)) { + direction = GDK_SCROLL_RIGHT; + goto retry; + } else if (Keyboard::modifier_state_equals (ev->state, Keyboard::TertiaryModifier)) { + if (!current_stepping_trackview) { + step_timeout = Glib::signal_timeout().connect (mem_fun(*this, &Editor::track_height_step_timeout), 500); + if (!(current_stepping_trackview = trackview_by_y_position (ev->y))) { + return false; + } + } + gettimeofday (&last_track_height_step_timestamp, 0); + current_stepping_trackview->step_height (false); + return true; + } else { + scroll_tracks_down_line (); + return true; + } + break; + + case GDK_SCROLL_LEFT: + xdelta = (current_page_frames() / 2); + if (leftmost_frame > xdelta) { + reset_x_origin (leftmost_frame - xdelta); + } else { + reset_x_origin (0); + } + break; - switch (event->type) { - case GDK_BUTTON_PRESS: - case GDK_2BUTTON_PRESS: - case GDK_3BUTTON_PRESS: - clicked_control_point = cp; - clicked_trackview = &cp->line.trackview; - clicked_audio_trackview = dynamic_cast(clicked_trackview); - clicked_regionview = 0; + case GDK_SCROLL_RIGHT: + xdelta = (current_page_frames() / 2); + if (max_frames - xdelta > leftmost_frame) { + reset_x_origin (leftmost_frame + xdelta); + } else { + reset_x_origin (max_frames - current_page_frames()); + } break; default: + /* what? */ break; } - return editor->signal_canvas_control_point_event() (item, event); + return false; } - -gint -Editor::_canvas_line_event (GnomeCanvasItem *item, GdkEvent *event, gpointer data) +bool +Editor::track_canvas_scroll_event (GdkEventScroll *event) { - AutomationLine *line = reinterpret_cast (data); - Editor* editor = dynamic_cast(&line->trackview.editor); - - return editor->signal_canvas_line_event() (item, event); + track_canvas.grab_focus(); + track_canvas_scroll (event); + return false; } -gint -Editor::_canvas_tempo_marker_event (GnomeCanvasItem *item, GdkEvent *event, gpointer data) +bool +Editor::track_canvas_button_press_event (GdkEventButton *event) { - Editor* editor = dynamic_cast((PublicEditor*) data); - return editor->signal_canvas_tempo_marker_event() (item, event); + selection->clear (); + track_canvas.grab_focus(); + return false; } -gint -Editor::_canvas_meter_marker_event (GnomeCanvasItem *item, GdkEvent *event, gpointer data) +bool +Editor::track_canvas_button_release_event (GdkEventButton *event) { - Editor* editor = dynamic_cast((PublicEditor *) data); - return editor->signal_canvas_meter_marker_event() (item, event); -} - -gint -Editor::_canvas_tempo_bar_event (GnomeCanvasItem *item, GdkEvent *event, gpointer data) -{ - /* XXX NO CAST */ - Editor* editor = (Editor*) data; - return editor->signal_canvas_tempo_bar_event() (item, event); -} - -gint -Editor::_canvas_meter_bar_event (GnomeCanvasItem *item, GdkEvent *event, gpointer data) -{ - /* XXX NO CAST */ - Editor* editor = (Editor*) data; - return editor->signal_canvas_meter_bar_event() (item, event); -} - -gint -Editor::_canvas_marker_event (GnomeCanvasItem *item, GdkEvent *event, gpointer data) -{ - Editor* editor = dynamic_cast((PublicEditor*) data); - return editor->signal_canvas_marker_event() (item, event); -} - -gint -Editor::_canvas_marker_bar_event (GnomeCanvasItem *item, GdkEvent *event, gpointer data) -{ - /* NO CAST */ - Editor* editor = (Editor*) data; - return editor->signal_canvas_marker_bar_event() (item, event); -} - -gint -Editor::_canvas_range_marker_bar_event (GnomeCanvasItem *item, GdkEvent *event, gpointer data) -{ - /* NO CAST */ - Editor* editor = (Editor*) data; - return editor->signal_canvas_range_marker_bar_event() (item, event); -} - -gint -Editor::_canvas_transport_marker_bar_event (GnomeCanvasItem *item, GdkEvent *event, gpointer data) -{ - /* NO CAST */ - Editor* editor = (Editor*) data; - return editor->signal_canvas_transport_marker_bar_event() (item, event); -} - -gint -Editor::_canvas_playhead_cursor_event (GnomeCanvasItem *item, GdkEvent *event, gpointer data) -{ - /* NO CAST */ - Editor* editor = (Editor*) data; - return editor->signal_canvas_playhead_cursor_event() (item, event); -} - -gint -Editor::_canvas_edit_cursor_event (GnomeCanvasItem *item, GdkEvent *event, gpointer data) -{ - /* NO CAST */ - Editor* editor = (Editor*) data; - return editor->signal_canvas_edit_cursor_event() (item, event); -} - -gint -Editor::_canvas_zoom_rect_event (GnomeCanvasItem *item, GdkEvent *event, gpointer data) -{ - Editor* editor = dynamic_cast((PublicEditor*) data); - return editor->signal_canvas_zoom_rect_event() (item, event); -} - -gint -Editor::_canvas_selection_rect_event (GnomeCanvasItem *item, GdkEvent *event, gpointer data) -{ - Editor* editor = dynamic_cast((PublicEditor*) data); - return editor->signal_canvas_selection_rect_event() (item, event); -} - -gint -Editor::_canvas_selection_start_trim_event (GnomeCanvasItem *item, GdkEvent *event, gpointer data) -{ - Editor* editor = dynamic_cast((PublicEditor*) data); - return editor->signal_canvas_selection_start_trim_event() (item, event); + if (drag_info.item) { + end_grab (drag_info.item, (GdkEvent*) event); + } + return false; } -gint -Editor::_canvas_selection_end_trim_event (GnomeCanvasItem *item, GdkEvent *event, gpointer data) +bool +Editor::track_canvas_motion_notify_event (GdkEventMotion *event) { - Editor* editor = dynamic_cast((PublicEditor*) data); - return editor->signal_canvas_selection_end_trim_event() (item, event); + int x, y; + /* keep those motion events coming */ + track_canvas.get_pointer (x, y); + return false; } -gint -Editor::_track_canvas_event (GnomeCanvasItem *item, GdkEvent *event, gpointer data) +bool +Editor::track_canvas_motion (GdkEvent *ev) { - /* NO CAST */ - - Editor* editor = (Editor*) data; - return editor->signal_track_canvas_event() (item, event); -} - -/********** END OF.TATIC EVENT HANDLERS */ - -gint -Editor::track_canvas_event (GnomeCanvasItem *item, GdkEvent *event) -{ - gint x, y; - - switch (event->type) { - case GDK_MOTION_NOTIFY: - /* keep those motion events coming */ - track_canvas->get_pointer (x, y); - return track_canvas_motion (item, event); - - case GDK_BUTTON_RELEASE: - switch (event->button.button) { - case 4: - case 5: - button_release_handler (item, event, NoItem); - break; - } - break; - - default: - break; + if (verbose_cursor_visible) { + verbose_canvas_cursor->property_x() = ev->motion.x + 20; + verbose_canvas_cursor->property_y() = ev->motion.y + 20; } - return FALSE; -} +#ifdef GTKOSX + flush_canvas (); +#endif -gint -Editor::track_canvas_motion (GnomeCanvasItem *item, GdkEvent *ev) -{ - if (verbose_cursor_visible) { - gnome_canvas_item_set (verbose_canvas_cursor, - "x", ev->motion.x + 20, - "y", ev->motion.y + 20, - NULL); - } - return FALSE; + return false; } -gint -Editor::typed_event (GnomeCanvasItem *item, GdkEvent *event, ItemType type) +bool +Editor::typed_event (ArdourCanvas::Item* item, GdkEvent *event, ItemType type) { gint ret = FALSE; @@ -354,15 +235,19 @@ Editor::typed_event (GnomeCanvasItem *item, GdkEvent *event, ItemType type) default: break; } - return ret; } -gint -Editor::canvas_region_view_event (GnomeCanvasItem *item, GdkEvent *event, AudioRegionView *rv) +bool +Editor::canvas_region_view_event (GdkEvent *event, ArdourCanvas::Item* item, RegionView *rv) { - gint ret = FALSE; - + bool ret = false; + + if (!rv->sensitive ()) { + return false; + } + + switch (event->type) { case GDK_BUTTON_PRESS: case GDK_2BUTTON_PRESS: @@ -383,10 +268,12 @@ Editor::canvas_region_view_event (GnomeCanvasItem *item, GdkEvent *event, AudioR break; case GDK_ENTER_NOTIFY: + set_entered_track (&rv->get_time_axis_view ()); set_entered_regionview (rv); break; case GDK_LEAVE_NOTIFY: + set_entered_track (0); set_entered_regionview (0); break; @@ -397,10 +284,10 @@ Editor::canvas_region_view_event (GnomeCanvasItem *item, GdkEvent *event, AudioR return ret; } -gint -Editor::canvas_stream_view_event (GnomeCanvasItem *item, GdkEvent *event, AudioTimeAxisView *tv) +bool +Editor::canvas_stream_view_event (GdkEvent *event, ArdourCanvas::Item* item, RouteTimeAxisView *tv) { - gint ret = FALSE; + bool ret = FALSE; switch (event->type) { case GDK_BUTTON_PRESS: @@ -409,7 +296,7 @@ Editor::canvas_stream_view_event (GnomeCanvasItem *item, GdkEvent *event, AudioT clicked_regionview = 0; clicked_control_point = 0; clicked_trackview = tv; - clicked_audio_trackview = tv; + clicked_audio_trackview = dynamic_cast(tv); ret = button_press_handler (item, event, StreamItem); break; @@ -422,6 +309,11 @@ Editor::canvas_stream_view_event (GnomeCanvasItem *item, GdkEvent *event, AudioT break; case GDK_ENTER_NOTIFY: + set_entered_track (tv); + break; + + case GDK_LEAVE_NOTIFY: + set_entered_track (0); break; default: @@ -431,12 +323,11 @@ Editor::canvas_stream_view_event (GnomeCanvasItem *item, GdkEvent *event, AudioT return ret; } - - -gint -Editor::canvas_automation_track_event (GnomeCanvasItem *item, GdkEvent *event, AutomationTimeAxisView *atv) +bool +Editor::canvas_automation_track_event (GdkEvent *event, ArdourCanvas::Item* item, AutomationTimeAxisView *atv) { - gint ret = FALSE; + bool ret = false; + switch (event->type) { case GDK_BUTTON_PRESS: @@ -472,11 +363,15 @@ Editor::canvas_automation_track_event (GnomeCanvasItem *item, GdkEvent *event, A return ret; } -gint -Editor::canvas_fade_in_event (GnomeCanvasItem *item, GdkEvent *event, AudioRegionView *rv) +bool +Editor::canvas_fade_in_event (GdkEvent *event, ArdourCanvas::Item* item, AudioRegionView *rv) { /* we handle only button 3 press/release events */ + if (!rv->sensitive()) { + return false; + } + switch (event->type) { case GDK_BUTTON_PRESS: clicked_regionview = rv; @@ -501,14 +396,18 @@ Editor::canvas_fade_in_event (GnomeCanvasItem *item, GdkEvent *event, AudioRegio /* proxy for the regionview */ - return canvas_region_view_event (rv->get_canvas_group(), event, rv); + return canvas_region_view_event (event, rv->get_canvas_group(), rv); } -gint -Editor::canvas_fade_in_handle_event (GnomeCanvasItem *item, GdkEvent *event, AudioRegionView *rv) +bool +Editor::canvas_fade_in_handle_event (GdkEvent *event, ArdourCanvas::Item* item, AudioRegionView *rv) { - gint ret = FALSE; + bool ret = false; + if (!rv->sensitive()) { + return false; + } + switch (event->type) { case GDK_BUTTON_PRESS: case GDK_2BUTTON_PRESS: @@ -543,11 +442,15 @@ Editor::canvas_fade_in_handle_event (GnomeCanvasItem *item, GdkEvent *event, Aud return ret; } -gint -Editor::canvas_fade_out_event (GnomeCanvasItem *item, GdkEvent *event, AudioRegionView *rv) +bool +Editor::canvas_fade_out_event (GdkEvent *event, ArdourCanvas::Item* item, AudioRegionView *rv) { /* we handle only button 3 press/release events */ + if (!rv->sensitive()) { + return false; + } + switch (event->type) { case GDK_BUTTON_PRESS: clicked_regionview = rv; @@ -572,14 +475,18 @@ Editor::canvas_fade_out_event (GnomeCanvasItem *item, GdkEvent *event, AudioRegi /* proxy for the regionview */ - return canvas_region_view_event (rv->get_canvas_group(), event, rv); + return canvas_region_view_event (event, rv->get_canvas_group(), rv); } -gint -Editor::canvas_fade_out_handle_event (GnomeCanvasItem *item, GdkEvent *event, AudioRegionView *rv) +bool +Editor::canvas_fade_out_handle_event (GdkEvent *event, ArdourCanvas::Item* item, AudioRegionView *rv) { - gint ret = FALSE; + bool ret = false; + if (!rv->sensitive()) { + return false; + } + switch (event->type) { case GDK_BUTTON_PRESS: case GDK_2BUTTON_PRESS: @@ -615,13 +522,13 @@ Editor::canvas_fade_out_handle_event (GnomeCanvasItem *item, GdkEvent *event, Au } struct DescendingRegionLayerSorter { - bool operator()(Region* a, Region* b) { + bool operator()(boost::shared_ptr a, boost::shared_ptr b) { return a->layer() > b->layer(); } }; -gint -Editor::canvas_crossfade_view_event (GnomeCanvasItem* item, GdkEvent* event, CrossfadeView* xfv) +bool +Editor::canvas_crossfade_view_event (GdkEvent* event, ArdourCanvas::Item* item, CrossfadeView* xfv) { /* we handle only button 3 press/release events */ @@ -636,7 +543,7 @@ Editor::canvas_crossfade_view_event (GnomeCanvasItem* item, GdkEvent* event, Cro case GDK_BUTTON_RELEASE: if (event->button.button == 3) { - gint ret = button_release_handler (item, event, CrossfadeViewItem); + bool ret = button_release_handler (item, event, CrossfadeViewItem); return ret; } break; @@ -646,6 +553,11 @@ Editor::canvas_crossfade_view_event (GnomeCanvasItem* item, GdkEvent* event, Cro } + /* XXX do not forward double clicks */ + + if (event->type == GDK_2BUTTON_PRESS) { + return false; + } /* proxy for the upper most regionview */ @@ -660,20 +572,25 @@ Editor::canvas_crossfade_view_event (GnomeCanvasItem* item, GdkEvent* event, Cro if (atv->is_audio_track()) { - AudioPlaylist* pl = atv->get_diskstream()->playlist(); - Playlist::RegionList* rl = pl->regions_at (event_frame (event)); + boost::shared_ptr pl; + if ((pl = boost::dynamic_pointer_cast (atv->get_diskstream()->playlist())) != 0) { - if (!rl->empty()) { - DescendingRegionLayerSorter cmp; - rl->sort (cmp); + Playlist::RegionList* rl = pl->regions_at (event_frame (event)); - AudioRegionView* arv = atv->view->find_view (*(dynamic_cast (rl->front()))); + if (!rl->empty()) { + DescendingRegionLayerSorter cmp; + rl->sort (cmp); - /* proxy */ - - delete rl; + RegionView* rv = atv->view()->find_view (rl->front()); + + delete rl; - return canvas_region_view_event (arv->get_canvas_group(), event, arv); + /* proxy */ + + return canvas_region_view_event (event, rv->get_canvas_group(), rv); + } + + delete rl; } } } @@ -681,15 +598,29 @@ Editor::canvas_crossfade_view_event (GnomeCanvasItem* item, GdkEvent* event, Cro return TRUE; } -gint -Editor::canvas_control_point_event (GnomeCanvasItem *item, GdkEvent *event) +bool +Editor::canvas_control_point_event (GdkEvent *event, ArdourCanvas::Item* item, ControlPoint* cp) { ItemType type; - ControlPoint *cp; - - if ((cp = static_cast (gtk_object_get_data (GTK_OBJECT(item), "control_point"))) == 0) { - fatal << _("programming error: control point canvas item has no control point object pointer!") << endmsg; - /*NOTREACHED*/ + + switch (event->type) { + case GDK_BUTTON_PRESS: + case GDK_2BUTTON_PRESS: + case GDK_3BUTTON_PRESS: + clicked_control_point = cp; + clicked_trackview = &cp->line.trackview; + clicked_audio_trackview = dynamic_cast(clicked_trackview); + clicked_regionview = 0; + break; + + case GDK_SCROLL_UP: + break; + + case GDK_SCROLL_DOWN: + break; + + default: + break; } if (dynamic_cast (&cp->line) != 0) { @@ -701,22 +632,16 @@ Editor::canvas_control_point_event (GnomeCanvasItem *item, GdkEvent *event) } else if (dynamic_cast (&cp->line) != 0) { type = RedirectAutomationControlPointItem; } else { - return FALSE; + return false; } return typed_event (item, event, type); } -gint -Editor::canvas_line_event (GnomeCanvasItem *item, GdkEvent *event) +bool +Editor::canvas_line_event (GdkEvent *event, ArdourCanvas::Item* item, AutomationLine* al) { ItemType type; - AutomationLine *al; - - if ((al = static_cast (gtk_object_get_data (GTK_OBJECT(item), "line"))) == 0) { - fatal << _("programming error: line canvas item has no line object pointer!") << endmsg; - /*NOTREACHED*/ - } if (dynamic_cast (al) != 0) { type = GainLineItem; @@ -727,24 +652,17 @@ Editor::canvas_line_event (GnomeCanvasItem *item, GdkEvent *event) } else if (dynamic_cast (al) != 0) { type = RedirectAutomationLineItem; } else { - return FALSE; + return false; } return typed_event (item, event, type); } - -gint -Editor::canvas_selection_rect_event (GnomeCanvasItem *item, GdkEvent *event) +bool +Editor::canvas_selection_rect_event (GdkEvent *event, ArdourCanvas::Item* item, SelectionRect* rect) { - gint ret = FALSE; - SelectionRect *rect = 0; - - if ((rect = reinterpret_cast (gtk_object_get_data (GTK_OBJECT(item), "rect"))) == 0) { - fatal << _("programming error: no \"rect\" pointer associated with selection item") << endmsg; - /*NOTREACHED*/ - } - + bool ret = false; + switch (event->type) { case GDK_BUTTON_PRESS: case GDK_2BUTTON_PRESS: @@ -774,16 +692,10 @@ Editor::canvas_selection_rect_event (GnomeCanvasItem *item, GdkEvent *event) return ret; } -gint -Editor::canvas_selection_start_trim_event (GnomeCanvasItem *item, GdkEvent *event) +bool +Editor::canvas_selection_start_trim_event (GdkEvent *event, ArdourCanvas::Item* item, SelectionRect* rect) { - gint ret = FALSE; - SelectionRect *rect = 0; - - if ((rect = reinterpret_cast (gtk_object_get_data (GTK_OBJECT(item), "rect"))) == 0) { - fatal << _("programming error: no \"rect\" pointer associated with selection item") << endmsg; - /*NOTREACHED*/ - } + bool ret = false; switch (event->type) { case GDK_BUTTON_PRESS: @@ -813,16 +725,10 @@ Editor::canvas_selection_start_trim_event (GnomeCanvasItem *item, GdkEvent *even return ret; } -gint -Editor::canvas_selection_end_trim_event (GnomeCanvasItem *item, GdkEvent *event) +bool +Editor::canvas_selection_end_trim_event (GdkEvent *event, ArdourCanvas::Item* item, SelectionRect* rect) { - gint ret = FALSE; - SelectionRect *rect = 0; - - if ((rect = reinterpret_cast (gtk_object_get_data (GTK_OBJECT(item), "rect"))) == 0) { - fatal << _("programming error: no \"rect\" pointer associated with selection item") << endmsg; - /*NOTREACHED*/ - } + bool ret = false; switch (event->type) { case GDK_BUTTON_PRESS: @@ -853,33 +759,37 @@ Editor::canvas_selection_end_trim_event (GnomeCanvasItem *item, GdkEvent *event) } -gint -Editor::canvas_region_view_name_highlight_event (GnomeCanvasItem *item, GdkEvent *event) +bool +Editor::canvas_region_view_name_highlight_event (GdkEvent* event, ArdourCanvas::Item* item, RegionView* rv) { - gint ret = FALSE; + bool ret = false; + + if (!rv->sensitive()) { + return false; + } switch (event->type) { case GDK_BUTTON_PRESS: case GDK_2BUTTON_PRESS: case GDK_3BUTTON_PRESS: - clicked_regionview = reinterpret_cast (gtk_object_get_data(GTK_OBJECT(item), "regionview")); + clicked_regionview = rv; clicked_control_point = 0; clicked_trackview = &clicked_regionview->get_time_axis_view(); clicked_audio_trackview = dynamic_cast(clicked_trackview); - ret = button_press_handler (item, event, AudioRegionViewNameHighlight); + ret = button_press_handler (item, event, RegionViewNameHighlight); break; case GDK_BUTTON_RELEASE: - ret = button_release_handler (item, event, AudioRegionViewNameHighlight); + ret = button_release_handler (item, event, RegionViewNameHighlight); break; case GDK_MOTION_NOTIFY: - ret = motion_handler (item, event, AudioRegionViewNameHighlight); + ret = motion_handler (item, event, RegionViewNameHighlight); break; case GDK_ENTER_NOTIFY: - ret = enter_handler (item, event, AudioRegionViewNameHighlight); + ret = enter_handler (item, event, RegionViewNameHighlight); break; case GDK_LEAVE_NOTIFY: - ret = leave_handler (item, event, AudioRegionViewNameHighlight); + ret = leave_handler (item, event, RegionViewNameHighlight); break; default: @@ -889,33 +799,37 @@ Editor::canvas_region_view_name_highlight_event (GnomeCanvasItem *item, GdkEvent return ret; } -gint -Editor::canvas_region_view_name_event (GnomeCanvasItem *item, GdkEvent *event) +bool +Editor::canvas_region_view_name_event (GdkEvent *event, ArdourCanvas::Item* item, RegionView* rv) { - gint ret = FALSE; + bool ret = false; + + if (!rv->sensitive()) { + return false; + } switch (event->type) { case GDK_BUTTON_PRESS: case GDK_2BUTTON_PRESS: case GDK_3BUTTON_PRESS: - clicked_regionview = reinterpret_cast (gtk_object_get_data(GTK_OBJECT(item), "regionview")); + clicked_regionview = rv; clicked_control_point = 0; clicked_trackview = &clicked_regionview->get_time_axis_view(); clicked_audio_trackview = dynamic_cast(clicked_trackview); - ret = button_press_handler (item, event, AudioRegionViewName); + ret = button_press_handler (item, event, RegionViewName); break; case GDK_BUTTON_RELEASE: - ret = button_release_handler (item, event, AudioRegionViewName); + ret = button_release_handler (item, event, RegionViewName); break; case GDK_MOTION_NOTIFY: - ret = motion_handler (item, event, AudioRegionViewName); + ret = motion_handler (item, event, RegionViewName); break; case GDK_ENTER_NOTIFY: - ret = enter_handler (item, event, AudioRegionViewName); + ret = enter_handler (item, event, RegionViewName); break; case GDK_LEAVE_NOTIFY: - ret = leave_handler (item, event, AudioRegionViewName); + ret = leave_handler (item, event, RegionViewName); break; default: @@ -925,75 +839,69 @@ Editor::canvas_region_view_name_event (GnomeCanvasItem *item, GdkEvent *event) return ret; } -gint -Editor::canvas_marker_event (GnomeCanvasItem *item, GdkEvent *event) +bool +Editor::canvas_marker_event (GdkEvent *event, ArdourCanvas::Item* item, Marker* marker) { return typed_event (item, event, MarkerItem); } -gint -Editor::canvas_marker_bar_event (GnomeCanvasItem *item, GdkEvent *event) +bool +Editor::canvas_marker_bar_event (GdkEvent *event, ArdourCanvas::Item* item) { return typed_event (item, event, MarkerBarItem); } -gint -Editor::canvas_range_marker_bar_event (GnomeCanvasItem *item, GdkEvent *event) +bool +Editor::canvas_range_marker_bar_event (GdkEvent *event, ArdourCanvas::Item* item) { return typed_event (item, event, RangeMarkerBarItem); } -gint -Editor::canvas_transport_marker_bar_event (GnomeCanvasItem *item, GdkEvent *event) +bool +Editor::canvas_transport_marker_bar_event (GdkEvent *event, ArdourCanvas::Item* item) { return typed_event (item, event, TransportMarkerBarItem); } -gint -Editor::canvas_tempo_marker_event (GnomeCanvasItem *item, GdkEvent *event) +bool +Editor::canvas_cd_marker_bar_event (GdkEvent *event, ArdourCanvas::Item* item) +{ + return typed_event (item, event, CdMarkerBarItem); +} + +bool +Editor::canvas_tempo_marker_event (GdkEvent *event, ArdourCanvas::Item* item, TempoMarker* marker) { return typed_event (item, event, TempoMarkerItem); } -gint -Editor::canvas_meter_marker_event (GnomeCanvasItem *item, GdkEvent *event) +bool +Editor::canvas_meter_marker_event (GdkEvent *event, ArdourCanvas::Item* item, MeterMarker* marker) { return typed_event (item, event, MeterMarkerItem); } -gint -Editor::canvas_tempo_bar_event (GnomeCanvasItem *item, GdkEvent *event) +bool +Editor::canvas_tempo_bar_event (GdkEvent *event, ArdourCanvas::Item* item) { return typed_event (item, event, TempoBarItem); } -gint -Editor::canvas_meter_bar_event (GnomeCanvasItem *item, GdkEvent *event) +bool +Editor::canvas_meter_bar_event (GdkEvent *event, ArdourCanvas::Item* item) { return typed_event (item, event, MeterBarItem); } -gint -Editor::canvas_playhead_cursor_event (GnomeCanvasItem *item, GdkEvent *event) +bool +Editor::canvas_playhead_cursor_event (GdkEvent *event, ArdourCanvas::Item* item) { return typed_event (item, event, PlayheadCursorItem); } -gint -Editor::canvas_edit_cursor_event (GnomeCanvasItem *item, GdkEvent *event) -{ - return typed_event (item, event, EditCursorItem); -} - -gint -Editor::canvas_zoom_rect_event (GnomeCanvasItem *item, GdkEvent *event) +bool +Editor::canvas_zoom_rect_event (GdkEvent *event, ArdourCanvas::Item* item) { return typed_event (item, event, NoItem); } -gint -Editor::canvas_copy_region_event (GnomeCanvasItem *item, GdkEvent *event) -{ - return typed_event (item, event, RegionItem); -} -