fixes for 98% of all the warnings/errors reported by OS X gcc on tiger
[ardour.git] / gtk2_ardour / editor_mouse.cc
index 6bf5d92f998a11708673639bc12992f30f1be233..21f2214a7c2502c18e2429296a67dc6ca37842b3 100644 (file)
@@ -207,7 +207,7 @@ Editor::which_grabber_cursor ()
                        boost::shared_ptr<Movable> m = _movable.lock();
                        if (m && m->locked()) {
                                c = _cursors->speaker;
-                       } 
+                       }
                        break;
                }
        }
@@ -373,24 +373,24 @@ Editor::mouse_mode_toggled (MouseMode m)
        mouse_mode = m;
 
        instant_save ();
-        
+
        if (!internal_editing()) {
                if (mouse_mode != MouseRange && _join_object_range_state == JOIN_OBJECT_RANGE_NONE) {
-                        
+
                        /* in all modes except range and joined object/range, hide the range selection,
                           show the object (region) selection.
                        */
-                        
+
                        for (TrackViewList::iterator i = track_views.begin(); i != track_views.end(); ++i) {
                                (*i)->hide_selection ();
                        }
-                        
+
                } else {
-                        
+
                        /*
                          in range or object/range mode, show the range selection.
                        */
-                        
+
                        for (TrackSelection::iterator i = selection->tracks.begin(); i != selection->tracks.end(); ++i) {
                                (*i)->show_selection (selection->time);
                        }
@@ -589,26 +589,42 @@ Editor::button_press_handler_1 (ArdourCanvas::Item* item, GdkEvent* event, ItemT
                return true;
 
        case TempoMarkerItem:
-               _drags->set (
-                       new TempoMarkerDrag (
-                               this,
-                               item,
-                               Keyboard::modifier_state_contains (event->button.state, Keyboard::CopyModifier)
-                               ),
-                       event
-                       );
-               return true;
+       {
+               TempoMarker* m = reinterpret_cast<TempoMarker*> (item->get_data ("marker"));
+               assert (m);
+               if (m->tempo().movable ()) {
+                       _drags->set (
+                               new TempoMarkerDrag (
+                                       this,
+                                       item,
+                                       Keyboard::modifier_state_contains (event->button.state, Keyboard::CopyModifier)
+                                       ),
+                               event
+                               );
+                       return true;
+               } else {
+                       return false;
+               }
+       }
 
        case MeterMarkerItem:
-               _drags->set (
-                       new MeterMarkerDrag (
-                               this,
-                               item,
-                               Keyboard::modifier_state_contains (event->button.state, Keyboard::CopyModifier)
-                               ),
-                       event
-                       );
-               return true;
+       {
+               MeterMarker* m = reinterpret_cast<MeterMarker*> (item->get_data ("marker"));
+               assert (m);
+               if (m->meter().movable ()) {
+                       _drags->set (
+                               new MeterMarkerDrag (
+                                       this,
+                                       item,
+                                       Keyboard::modifier_state_contains (event->button.state, Keyboard::CopyModifier)
+                                       ),
+                               event
+                               );
+                       return true;
+               } else {
+                       return false;
+               }
+       }
 
        case MarkerBarItem:
        case TempoBarItem:
@@ -725,7 +741,7 @@ Editor::button_press_handler_1 (ArdourCanvas::Item* item, GdkEvent* event, ItemT
                                if (dynamic_cast<MidiTimeAxisView*> (clicked_axisview)) {
                                        _drags->set (new RegionCreateDrag (this, item, clicked_axisview), event);
                                        return true;
-                               }
+                               } 
                        } else {
                                _drags->set (new SelectionDrag (this, item, SelectionDrag::CreateSelection), event);
                                return true;
@@ -770,7 +786,7 @@ Editor::button_press_handler_1 (ArdourCanvas::Item* item, GdkEvent* event, ItemT
                                return true;
                        }
                        break;
-                       
+
                default:
                        break;
                }
@@ -798,12 +814,12 @@ Editor::button_press_handler_1 (ArdourCanvas::Item* item, GdkEvent* event, ItemT
                        }
 
                        case FeatureLineItem:
-                       {                       
+                       {
                                if (Keyboard::modifier_state_contains (event->button.state, Keyboard::TertiaryModifier)) {
                                        remove_transient(item);
                                        return true;
                                }
-                               
+
                                _drags->set (new FeatureLineDrag (this, item), event);
                                return true;
                                break;
@@ -821,7 +837,7 @@ Editor::button_press_handler_1 (ArdourCanvas::Item* item, GdkEvent* event, ItemT
                                        /* no region drags in internal edit mode */
                                        break;
                                }
-                               
+
                                /* click on a normal region view */
                                if (Keyboard::modifier_state_contains (event->button.state, Keyboard::CopyModifier)) {
                                        add_region_copy_drag (item, event, clicked_regionview);
@@ -830,7 +846,7 @@ Editor::button_press_handler_1 (ArdourCanvas::Item* item, GdkEvent* event, ItemT
                                } else {
                                        add_region_drag (item, event, clicked_regionview);
                                }
-                               
+
                                if (_join_object_range_state == JOIN_OBJECT_RANGE_OBJECT && !selection->regions.empty()) {
                                        _drags->add (new SelectionDrag (this, clicked_axisview->get_selection_rect (clicked_selection)->rect, SelectionDrag::SelectionMove));
                                }
@@ -877,11 +893,21 @@ Editor::button_press_handler_1 (ArdourCanvas::Item* item, GdkEvent* event, ItemT
                                        _drags->set (new RubberbandSelectDrag (this, item), event);
                                }
                                break;
-                               
+
                        case AutomationTrackItem:
-                               /* rubberband drag to select automation points */
-                               _drags->set (new RubberbandSelectDrag (this, item), event);
+                       {
+                               TimeAxisView* parent = clicked_axisview->get_parent ();
+                               AutomationTimeAxisView* atv = dynamic_cast<AutomationTimeAxisView*> (clicked_axisview);
+                               assert (atv);
+                               if (parent && dynamic_cast<MidiTimeAxisView*> (parent) && atv->show_regions ()) {
+                                       /* create a MIDI region so that we have somewhere to put automation */
+                                       _drags->set (new RegionCreateDrag (this, item, parent), event);
+                               } else {
+                                       /* rubberband drag to select automation points */
+                                       _drags->set (new RubberbandSelectDrag (this, item), event);
+                               }
                                break;
+                       }
 
                        case SelectionItem:
                        {
@@ -905,7 +931,7 @@ Editor::button_press_handler_1 (ArdourCanvas::Item* item, GdkEvent* event, ItemT
                                                        if (t) {
                                                                boost::shared_ptr<Playlist> pl = t->playlist ();
                                                                if (pl) {
-                                                                       
+
                                                                        boost::shared_ptr<Region> r = pl->top_region_at (event_frame (event));
                                                                        if (r) {
                                                                                RegionView* rv = rtv->view()->find_view (r);
@@ -1054,7 +1080,7 @@ Editor::button_press_handler_2 (ArdourCanvas::Item* item, GdkEvent* event, ItemT
                                /* no region drags in internal edit mode */
                                return false;
                        }
-                       
+
                        if (Keyboard::modifier_state_contains (event->button.state, Keyboard::CopyModifier)) {
                                add_region_copy_drag (item, event, clicked_regionview);
                        } else {
@@ -1332,6 +1358,10 @@ Editor::button_release_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemT
                                popup_track_context_menu (1, event->button.time, item_type, false);
                                break;
 
+                       case ControlPointItem:
+                               popup_control_point_context_menu (item, event);
+                               break;
+
 #ifdef WITH_CMT
                        case ImageFrameItem:
                                popup_imageframe_edit_menu(1, event->button.time, item, true) ;
@@ -1381,11 +1411,7 @@ Editor::button_release_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemT
                        break;
 
                case ControlPointItem:
-                       if (eff == MouseGain) {
-                               remove_gain_control_point (item, event);
-                       } else {
-                               remove_control_point (item, event);
-                       }
+                       remove_control_point (item);
                        break;
 
                case NoteItem:
@@ -1505,7 +1531,7 @@ Editor::button_release_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemT
 
                default:
                        break;
-                        
+
                }
 
                 /* do any (de)selection operations that should occur on button release */
@@ -1751,7 +1777,7 @@ Editor::enter_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemType item_
                        set_canvas_cursor ();
                }
                break;
-               
+
        default:
                break;
        }
@@ -1780,7 +1806,7 @@ Editor::enter_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemType item_
 }
 
 bool
-Editor::leave_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemType item_type)
+Editor::leave_handler (ArdourCanvas::Item* item, GdkEvent*, ItemType item_type)
 {
        AutomationLine* al;
        ControlPoint* cp;
@@ -1821,7 +1847,7 @@ Editor::leave_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemType item_
 #endif
 
                _over_region_trim_target = false;
-               
+
                if (is_drawable()) {
                        set_canvas_cursor (current_canvas_cursor);
                }
@@ -1843,7 +1869,7 @@ Editor::leave_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemType item_
        case RegionViewName:
                /* see enter_handler() for notes */
                _over_region_trim_target = false;
-               
+
                if (!reinterpret_cast<RegionView *> (item->get_data ("regionview"))->name_active()) {
                        if (is_drawable() && mouse_mode == MouseObject) {
                                set_canvas_cursor (current_canvas_cursor);
@@ -2007,7 +2033,7 @@ bool
 Editor::motion_handler (ArdourCanvas::Item* /*item*/, GdkEvent* event, bool from_autoscroll)
 {
        _last_motion_y = event->motion.y;
-       
+
        if (event->motion.is_hint) {
                gint x, y;
 
@@ -2048,7 +2074,7 @@ Editor::motion_handler (ArdourCanvas::Item* /*item*/, GdkEvent* event, bool from
        if (_drags->active ()) {
                handled = _drags->motion_handler (event, from_autoscroll);
        }
-       
+
        if (!handled) {
                return false;
        }
@@ -2057,8 +2083,8 @@ Editor::motion_handler (ArdourCanvas::Item* /*item*/, GdkEvent* event, bool from
        return true;
 }
 
-void
-Editor::remove_gain_control_point (ArdourCanvas::Item*item, GdkEvent* /*event*/)
+bool
+Editor::can_remove_control_point (ArdourCanvas::Item* item)
 {
        ControlPoint* control_point;
 
@@ -2067,18 +2093,24 @@ Editor::remove_gain_control_point (ArdourCanvas::Item*item, GdkEvent* /*event*/)
                /*NOTREACHED*/
        }
 
-       // We shouldn't remove the first or last gain point
-       if (control_point->line().is_last_point(*control_point) ||
-               control_point->line().is_first_point(*control_point)) {
-               return;
+       AutomationLine& line = control_point->line ();
+       if (dynamic_cast<AudioRegionGainLine*> (&line)) {
+               /* we shouldn't remove the first or last gain point in region gain lines */
+               if (line.is_last_point(*control_point) || line.is_first_point(*control_point)) {
+                       return false;
+               }
        }
 
-       control_point->line().remove_point (*control_point);
+       return true;
 }
 
 void
-Editor::remove_control_point (ArdourCanvas::Item* item, GdkEvent* /*event*/)
+Editor::remove_control_point (ArdourCanvas::Item* item)
 {
+       if (!can_remove_control_point (item)) {
+               return;
+       }
+
        ControlPoint* control_point;
 
        if ((control_point = reinterpret_cast<ControlPoint *> (item->get_data ("control_point"))) == 0) {
@@ -2122,7 +2154,7 @@ Editor::edit_note (ArdourCanvas::Item* item)
 
        d.run ();
 }
-       
+
 
 void
 Editor::visible_order_range (int* low, int* high) const
@@ -2385,7 +2417,7 @@ Editor::track_height_step_timeout ()
 }
 
 void
-Editor::add_region_drag (ArdourCanvas::Item* item, GdkEvent* event, RegionView* region_view)
+Editor::add_region_drag (ArdourCanvas::Item* item, GdkEvent*, RegionView* region_view)
 {
        assert (region_view);
 
@@ -2407,7 +2439,7 @@ Editor::add_region_drag (ArdourCanvas::Item* item, GdkEvent* event, RegionView*
 }
 
 void
-Editor::add_region_copy_drag (ArdourCanvas::Item* item, GdkEvent* event, RegionView* region_view)
+Editor::add_region_copy_drag (ArdourCanvas::Item* item, GdkEvent*, RegionView* region_view)
 {
        assert (region_view);
 
@@ -2422,14 +2454,14 @@ Editor::add_region_copy_drag (ArdourCanvas::Item* item, GdkEvent* event, RegionV
 }
 
 void
-Editor::add_region_brush_drag (ArdourCanvas::Item* item, GdkEvent* event, RegionView* region_view)
+Editor::add_region_brush_drag (ArdourCanvas::Item* item, GdkEvent*, RegionView* region_view)
 {
        assert (region_view);
 
        if (!region_view->region()->playlist()) {
                return;
        }
-        
+
        if (Config->get_edit_mode() == Splice) {
                return;
        }
@@ -2552,18 +2584,18 @@ Editor::set_internal_edit (bool yn)
  *  used by the `join object/range' tool mode.
  */
 void
-Editor::update_join_object_range_location (double x, double y)
+Editor::update_join_object_range_location (double /*x*/, double y)
 {
        /* XXX: actually, this decides based on whether the mouse is in the top or bottom half of a RouteTimeAxisView;
           entered_{track,regionview} is not always setup (e.g. if the mouse is over a TimeSelection), and to get a Region
           that we're over requires searching the playlist.
        */
-          
+
        if (join_object_range_button.get_active() == false || (mouse_mode != MouseRange && mouse_mode != MouseObject)) {
                _join_object_range_state = JOIN_OBJECT_RANGE_NONE;
                return;
        }
-       
+
        if (mouse_mode == MouseObject) {
                _join_object_range_state = JOIN_OBJECT_RANGE_OBJECT;
        } else if (mouse_mode == MouseRange) {
@@ -2572,7 +2604,7 @@ Editor::update_join_object_range_location (double x, double y)
 
        /* XXX: maybe we should make entered_track work in all cases, rather than resorting to this */
        pair<TimeAxisView*, int> tvp = trackview_by_y_position (y + vertical_adjustment.get_value() - canvas_timebars_vsize);
-       
+
        if (tvp.first) {
 
                RouteTimeAxisView* rtv = dynamic_cast<RouteTimeAxisView*> (tvp.first);
@@ -2616,7 +2648,7 @@ void
 Editor::set_canvas_cursor_for_region_view (double x, RegionView* rv)
 {
        assert (rv);
-       
+
        ArdourCanvas::Group* g = rv->get_canvas_group ();
        ArdourCanvas::Group* p = g->get_parent_group ();