-bool
-Editor::canvas_crossfade_view_event (GdkEvent* event, ArdourCanvas::Item* item, CrossfadeView* xfv)
-{
- /* we handle only button 3 press/release events */
-
- switch (event->type) {
- case GDK_BUTTON_PRESS:
- clicked_crossfadeview = xfv;
- clicked_axisview = &clicked_crossfadeview->get_time_axis_view();
- if (event->button.button == 3) {
- return button_press_handler (item, event, CrossfadeViewItem);
- }
- break;
-
- case GDK_BUTTON_RELEASE:
- if (event->button.button == 3) {
- bool ret = button_release_handler (item, event, CrossfadeViewItem);
- return ret;
- }
- break;
-
- default:
- break;
-
- }
-
- /* XXX do not forward double clicks */
-
- if (event->type == GDK_2BUTTON_PRESS) {
- return false;
- }
-
- /* proxy for an underlying regionview */
-
- /* XXX really need to check if we are in the name highlight,
- and proxy to that when required.
- */
-
- TimeAxisView& tv (xfv->get_time_axis_view());
- AudioTimeAxisView* atv;
-
- if ((atv = dynamic_cast<AudioTimeAxisView*>(&tv)) != 0) {
-
- if (atv->is_audio_track()) {
-
- boost::shared_ptr<AudioPlaylist> pl;
- if ((pl = boost::dynamic_pointer_cast<AudioPlaylist> (atv->track()->playlist())) != 0) {
-
- Playlist::RegionList* rl = pl->regions_at (event_frame (event));
- if (!rl->empty()) {
-
- if (atv->layer_display() == Overlaid) {
-
- /* we're in overlaid mode; proxy to the uppermost region view */
-
- DescendingRegionLayerSorter cmp;
- rl->sort (cmp);
-
- RegionView* rv = atv->view()->find_view (rl->front());
-
- delete rl;
-
- /* proxy */
- return canvas_region_view_event (event, rv->get_canvas_group(), rv);
-
- } else {
-
- /* we're in stacked mode; proxy to the region view under the mouse */
-
- /* XXX: FIXME: this is an evil hack; it assumes that any event for which
- this proxy is being used has its GdkEvent laid out such that the y
- member is in the same place as that for a GdkEventButton */
-
- /* position of the event within the track */
- double cx = event->button.x;
- double cy = event->button.y;
- atv->view()->canvas_item()->w2i (cx, cy);
-
- /* hence layer that we're over */
- double const c = atv->view()->child_height ();
- layer_t const l = pl->top_layer () + 1 - (cy / c);
-
- /* hence region */
- Playlist::RegionList::iterator i = rl->begin();
- while (i != rl->end() && (*i)->layer() != l) {
- ++i;
- }
-
- if (i != rl->end()) {
- RegionView* rv = atv->view()->find_view (*i);
- delete rl;
-
- /* proxy */
- return canvas_region_view_event (event, rv->get_canvas_group(), rv);
- }
- }
- }
-
- delete rl;
- }
- }
- }
-
- return TRUE;
-}
-