Fix various sticky/broken cursor issues.
authorDavid Robillard <d@drobilla.net>
Fri, 14 Nov 2014 07:28:15 +0000 (02:28 -0500)
committerDavid Robillard <d@drobilla.net>
Fri, 14 Nov 2014 07:37:36 +0000 (02:37 -0500)
This still isn't quite right, but it's a lot less broken than before, at least.

gtk2_ardour/editor_canvas.cc
gtk2_ardour/editor_mouse.cc
gtk2_ardour/midi_region_view.cc
gtk2_ardour/midi_region_view.h
gtk2_ardour/note_base.cc

index 7eeeba2ed0811cb0cff3dfcb04215de56b6ae90a..482ada3cbcb7e0b074b20c3aa5b4b422e68b6fb4 100644 (file)
@@ -1348,7 +1348,7 @@ Editor::choose_canvas_cursor_on_entry (GdkEventCrossing* /*event*/, ItemType typ
        }
 
        if (cursor) {
-               set_canvas_cursor (cursor, false);
+               set_canvas_cursor (cursor, true);
        }
 }
 
index c4e19b15a88714e086854db017178d8eb09ec7fd..52486a1322ac8aa46ae80be77659537317268276 100644 (file)
@@ -1813,6 +1813,8 @@ Editor::leave_handler (ArdourCanvas::Item* item, GdkEvent*, ItemType item_type)
        bool is_start;
        bool ret = true;
 
+       reset_canvas_cursor ();
+
        switch (item_type) {
        case ControlPointItem:
                _verbose_cursor->hide (); 
index 40c4af0924c2591870c956c77caf1ce56ced3bea..81248c958598fda27de5183c9882c7c11f574964 100644 (file)
@@ -112,6 +112,7 @@ MidiRegionView::MidiRegionView (ArdourCanvas::Container *parent, RouteTimeAxisVi
        , _last_event_y (0)
        , pre_enter_cursor (0)
        , pre_press_cursor (0)
+       , pre_note_enter_cursor (0)
        , _note_player (0)
 {
        CANVAS_DEBUG_NAME (_note_group, string_compose ("note group for %1", get_item_name()));
@@ -149,6 +150,7 @@ MidiRegionView::MidiRegionView (ArdourCanvas::Container *parent, RouteTimeAxisVi
        , _last_event_y (0)
        , pre_enter_cursor (0)
        , pre_press_cursor (0)
+       , pre_note_enter_cursor (0)
        , _note_player (0)
 {
        CANVAS_DEBUG_NAME (_note_group, string_compose ("note group for %1", get_item_name()));
@@ -195,6 +197,7 @@ MidiRegionView::MidiRegionView (const MidiRegionView& other)
        , _last_event_y (0)
        , pre_enter_cursor (0)
        , pre_press_cursor (0)
+       , pre_note_enter_cursor (0)
        , _note_player (0)
 {
        init (false);
@@ -223,6 +226,7 @@ MidiRegionView::MidiRegionView (const MidiRegionView& other, boost::shared_ptr<M
        , _last_event_y (0)
        , pre_enter_cursor (0)
        , pre_press_cursor (0)
+       , pre_note_enter_cursor (0)
        , _note_player (0)
 {
        init (true);
@@ -420,6 +424,7 @@ MidiRegionView::leave_notify (GdkEventCrossing*)
        if (pre_enter_cursor) {
                Editor* editor = dynamic_cast<Editor *> (&trackview.editor());
                editor->set_canvas_cursor(pre_enter_cursor);
+               pre_enter_cursor = 0;
        }
 
        return false;
@@ -456,7 +461,7 @@ MidiRegionView::button_press (GdkEventButton* ev)
        if (m == MouseObject && Keyboard::modifier_state_contains (ev->state, Keyboard::insert_note_modifier())) {
                pre_press_cursor = editor->get_canvas_cursor ();
                editor->set_canvas_cursor (editor->cursors()->midi_pencil);
-       } 
+       }
 
        if (_mouse_state != SelectTouchDragging) {
                
@@ -3116,7 +3121,7 @@ MidiRegionView::note_entered(NoteBase* ev)
 {
        Editor* editor = dynamic_cast<Editor*>(&trackview.editor());
 
-       pre_enter_cursor = editor->get_canvas_cursor ();
+       pre_note_enter_cursor = editor->get_canvas_cursor ();
 
        if (_mouse_state == SelectTouchDragging) {
                note_selected (ev, true);
@@ -3136,9 +3141,9 @@ MidiRegionView::note_left (NoteBase*)
 
        editor->verbose_cursor()->hide ();
 
-       if (pre_enter_cursor) {
-               editor->set_canvas_cursor (pre_enter_cursor);
-               pre_enter_cursor = 0;
+       if (pre_note_enter_cursor) {
+               editor->set_canvas_cursor (pre_note_enter_cursor);
+               pre_note_enter_cursor = 0;
        }
 }
 
@@ -3190,13 +3195,13 @@ MidiRegionView::note_mouse_position (float x_fraction, float /*y_fraction*/, boo
        Editing::MouseMode mm = editor->current_mouse_mode();
        bool trimmable = (mm == MouseObject || mm == MouseTimeFX || mm == MouseDraw);
 
-       if (trimmable && x_fraction > 0.0 && x_fraction < 0.2) {
-               editor->set_canvas_cursor (editor->cursors()->left_side_trim);
-       } else if (trimmable && x_fraction >= 0.8 && x_fraction < 1.0) {
-               editor->set_canvas_cursor (editor->cursors()->right_side_trim);
-       } else {
-               if (pre_enter_cursor && can_set_cursor) {
-                       editor->set_canvas_cursor (pre_enter_cursor);
+       if (can_set_cursor) {
+               if (trimmable && x_fraction > 0.0 && x_fraction < 0.2) {
+                       editor->set_canvas_cursor (editor->cursors()->left_side_trim);
+               } else if (trimmable && x_fraction >= 0.8 && x_fraction < 1.0) {
+                       editor->set_canvas_cursor (editor->cursors()->right_side_trim);
+               } else if (pre_note_enter_cursor) {
+                       editor->set_canvas_cursor (pre_note_enter_cursor);
                }
        }
 }
index 3fd6625ce90c18c4103788ac5b7fb2e946657324..65ca7df7abda498d91a90826e40af970aff5764c 100644 (file)
@@ -473,6 +473,7 @@ private:
 
        Gdk::Cursor* pre_enter_cursor;
        Gdk::Cursor* pre_press_cursor;
+       Gdk::Cursor* pre_note_enter_cursor;
 
        NotePlayer* _note_player;
 
index 7bc45a4b258c091b2cbcfc987dd7dd5f3a6fc923..5e5d83e5004b3cc467bb8ea330decf00cae82471 100644 (file)
@@ -262,8 +262,8 @@ NoteBase::event_handler (GdkEvent* ev)
 
        switch (ev->type) {
        case GDK_ENTER_NOTIFY:
-               set_mouse_fractions (ev);
                _region.note_entered (this);
+               set_mouse_fractions (ev);
                break;
 
        case GDK_LEAVE_NOTIFY: