fixes for 98% of all the warnings/errors reported by OS X gcc on tiger
[ardour.git] / gtk2_ardour / editor_mouse.cc
index 0d5f75f60d96c49fc732aa7dee4488d0b6cfcd55..21f2214a7c2502c18e2429296a67dc6ca37842b3 100644 (file)
@@ -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;
@@ -879,9 +895,19 @@ Editor::button_press_handler_1 (ArdourCanvas::Item* item, GdkEvent* event, ItemT
                                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:
                        {
@@ -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:
@@ -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;
@@ -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) {
@@ -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,7 +2454,7 @@ 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);
 
@@ -2552,7 +2584,7 @@ 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