Index: gtk2_ardour/midi_region_view.cc
===================================================================
--- gtk2_ardour/midi_region_view.cc	(revision 7877)
+++ gtk2_ardour/midi_region_view.cc	(working copy)
@@ -312,8 +312,10 @@
         group->w2i (_last_x, _last_y);
         
         if (_mouse_state != SelectTouchDragging && ev->button == 1) {
+	  
                 _pressed_button = ev->button;
                 _mouse_state = Pressed;
+
                 return true;
         }
         
@@ -330,9 +332,11 @@
 
         event_x = ev->x;
         event_y = ev->y;
+	
         group->w2i(event_x, event_y);
         group->ungrab(ev->time);
-        event_frame = trackview.editor().pixel_to_frame(event_x);
+        
+	event_frame = trackview.editor().pixel_to_frame(event_x);
 
         if (ev->button == 3) {
                 return false;
@@ -345,25 +349,50 @@
                 switch (trackview.editor().current_mouse_mode()) {
                 case MouseObject:
                 case MouseTimeFX:
+		{
                         clear_selection();
                         maybe_select_by_position (ev, event_x, event_y);
+			
+			if (Keyboard::modifier_state_contains (ev->state, Keyboard::PrimaryModifier)){
+				
+				double event_x, event_y;
+				
+				event_x = ev->x;
+				event_y = ev->y;
+				group->w2i(event_x, event_y);
+
+				bool success;
+				Evoral::MusicalTime beats = trackview.editor().get_grid_type_as_beats (success, trackview.editor().pixel_to_frame (event_x));
+				
+				if (!success) {
+					beats = 1;
+				}
+				
+				create_note_at (event_x, event_y, beats, true);
+			}
+
                         break;
-
+		}
                 case MouseRange:
                 {
                         bool success;
                         Evoral::MusicalTime beats = trackview.editor().get_grid_type_as_beats (success, trackview.editor().pixel_to_frame (event_x));
-                        if (!success) {
+                        
+			if (!success) {
                                 beats = 1;
                         }
+                        
                         create_note_at (event_x, event_y, beats, true);
-                        break;
+                        
+			break;
                 }
                 default:
                         break;
                 }
+                
                 _mouse_state = None;
                 break;
+		
         case SelectRectDragging: // Select drag done
                 _mouse_state = None;
                 delete _drag_rect;
@@ -372,6 +401,7 @@
 
         case AddDragging: // Add drag done
                 _mouse_state = None;
+		
                 if (_drag_rect->property_x2() > _drag_rect->property_x1() + 2) {
                         const double x      = _drag_rect->property_x1();
                         const double length = trackview.editor().pixel_to_frame 
@@ -405,10 +435,29 @@
         // convert event_x to global frame
         event_frame = trackview.editor().pixel_to_frame(event_x) + _region->position();
         trackview.editor().snap_to(event_frame);
-        // convert event_frame back to local coordinates relative to position
+        
+	// convert event_frame back to local coordinates relative to position
         event_frame -= _region->position();
 
-        if (_ghost_note) {
+        if (!_ghost_note && trackview.editor().current_mouse_mode() != MouseRange &&
+			Keyboard::modifier_state_contains (ev->state, Keyboard::PrimaryModifier)  && 
+			_mouse_state != AddDragging){
+	  
+		create_ghost_note (ev->x, ev->y);
+	}
+        else if (_ghost_note && trackview.editor().current_mouse_mode() != MouseRange &&
+			Keyboard::modifier_state_contains (ev->state, Keyboard::PrimaryModifier)){
+	  
+		update_ghost_note (ev->x, ev->y);
+	}
+        else if (_ghost_note && trackview.editor().current_mouse_mode() != MouseRange){
+		
+		delete _ghost_note;
+                _ghost_note = 0;
+		
+		trackview.editor().hide_verbose_canvas_cursor ();
+	}
+	else if (_ghost_note && trackview.editor().current_mouse_mode() == MouseRange) {
                 update_ghost_note (ev->x, ev->y);
         }
 
@@ -420,15 +469,17 @@
 
         switch (_mouse_state) {
         case Pressed: // Maybe start a drag, if we've moved a bit
-
+	  
                 if (fabs (event_x - _last_x) < 1 && fabs (event_y - _last_y) < 1) {
                         /* no appreciable movement since the button was pressed */
                         return false;
                 }
 
                 // Select drag start
-                if (_pressed_button == 1 && trackview.editor().current_mouse_mode() == MouseObject) {
-                        group->grab(GDK_POINTER_MOTION_MASK | GDK_BUTTON_RELEASE_MASK,
+                if (_pressed_button == 1 && trackview.editor().current_mouse_mode() == MouseObject &&
+			!Keyboard::modifier_state_contains (ev->state, Keyboard::PrimaryModifier)) {
+                        
+			group->grab(GDK_POINTER_MOTION_MASK | GDK_BUTTON_RELEASE_MASK,
                                     Gdk::Cursor(Gdk::FLEUR), ev->time);
                         _last_x = event_x;
                         _last_y = event_y;
@@ -457,6 +508,7 @@
 				
                         group->grab(GDK_POINTER_MOTION_MASK | GDK_BUTTON_RELEASE_MASK,
                                     Gdk::Cursor(Gdk::FLEUR), ev->time);
+				    
                         _last_x = event_x;
                         _last_y = event_y;
                         _drag_start_x = event_x;
@@ -475,6 +527,15 @@
                         _drag_rect->property_fill_color_rgba()    = 0xFFFFFF66;
 
                         _mouse_state = AddDragging;
+
+			if (_ghost_note){
+		
+				delete _ghost_note;
+				_ghost_note = 0;
+		
+				trackview.editor().hide_verbose_canvas_cursor ();
+			}
+
                         return true;
                 }
 
@@ -482,6 +543,7 @@
 
         case SelectRectDragging: // Select drag motion
         case AddDragging: // Add note drag motion
+
                 if (ev->is_hint) {
                         int t_x;
                         int t_y;
@@ -491,23 +553,30 @@
                         event_y = t_y;
                 }
 
-                if (_mouse_state == AddDragging)
+                if (_mouse_state == AddDragging){
                         event_x = trackview.editor().frame_to_pixel(event_frame);
+		}
 
                 if (_drag_rect) {
-                        if (event_x > _drag_start_x)
+		  
+                        if (event_x > _drag_start_x){
                                 _drag_rect->property_x2() = event_x;
-                        else
+			}
+                        else {
                                 _drag_rect->property_x1() = event_x;
+			}
                 }
 
                 if (_drag_rect && _mouse_state == SelectRectDragging) {
-                        if (event_y > _drag_start_y)
+                        
+		  if (event_y > _drag_start_y){
                                 _drag_rect->property_y2() = event_y;
-                        else
+			}
+                        else {
                                 _drag_rect->property_y1() = event_y;
+			}
 
-                        update_drag_selection(_drag_start_x, event_x, _drag_start_y, event_y);
+			update_drag_selection(_drag_start_x, event_x, _drag_start_y, event_y);
                 }
 
                 _last_x = event_x;
@@ -1287,7 +1356,9 @@
 	}
 
 	if (_active_notes && _active_notes[note]) {
+
 		const framepos_t end_time_frames = beats_to_frames(end_time);
+
 		_active_notes[note]->property_x2() = trackview.editor().frame_to_pixel(end_time_frames);
 		_active_notes[note]->property_outline_what() = (guint32) 0xF; // all edges
 		_active_notes[note] = 0;
@@ -1383,11 +1454,13 @@
 
 	ev->property_x1() = x;
 	ev->property_y1() = y1;
+	
 	if (note->length() > 0) {
 		ev->property_x2() = note_endpixel;
 	} else {
 		ev->property_x2() = trackview.editor().frame_to_pixel(_region->length());
 	}
+	
 	ev->property_y2() = y1 + floor(midi_stream_view()->note_height());
 
 	if (note->length() == 0) {
@@ -1438,7 +1511,7 @@
 	assert(note->time() >= 0);
 	assert(midi_view()->note_mode() == Sustained || midi_view()->note_mode() == Percussive);
 
-	ArdourCanvas::Group* const group = (ArdourCanvas::Group*)get_canvas_group();
+	ArdourCanvas::Group* const group = (ArdourCanvas::Group*) get_canvas_group();
 
 	if (midi_view()->note_mode() == Sustained) {
 
@@ -1478,6 +1551,7 @@
 		if (_marked_for_velocity.find(note) != _marked_for_velocity.end()) {
 			event->show_velocity();
 		}
+		
 		event->on_channel_selection_change(_last_channel_selection);
 		_events.push_back(event);
 
@@ -1487,6 +1561,11 @@
 			event->hide ();
 		}
 	}
+	
+	MidiTimeAxisView* const mtv = dynamic_cast<MidiTimeAxisView*>(&trackview);
+	MidiStreamView* const view = mtv->midi_view();
+
+	view->update_note_range(note->note());
 }
 
 void
@@ -1503,7 +1582,12 @@
 	if (end_frame > region_end) {
 		_region->set_length (end_frame - _region->position(), this);
 	}
+	
+	MidiTimeAxisView* const mtv = dynamic_cast<MidiTimeAxisView*>(&trackview);
+	MidiStreamView* const view = mtv->midi_view();
 
+	view->update_note_range(new_note->note());
+
         _marked_for_selection.clear ();
         clear_selection ();
 
@@ -2950,6 +3034,7 @@
 
 	bool success;
 	Evoral::MusicalTime beats = trackview.editor().get_grid_type_as_beats (success, f);
+
 	if (!success) {
 		beats = 1;
 	}
