diff --git a/gtk2_ardour/editor.cc b/gtk2_ardour/editor.cc index c248c20913..93564e3313 100644 --- a/gtk2_ardour/editor.cc +++ b/gtk2_ardour/editor.cc @@ -288,6 +288,8 @@ Editor::Editor () verbose_cursor_on = true; route_removal = false; show_automatic_regions_in_region_list = true; + last_item_entered = 0; + last_item_entered_n = 0; region_list_sort_type = (Editing::RegionListSortType) 0; have_pending_keyboard_selection = false; diff --git a/gtk2_ardour/editor.h b/gtk2_ardour/editor.h index 1a78921dff..4ea5ec0cc6 100644 --- a/gtk2_ardour/editor.h +++ b/gtk2_ardour/editor.h @@ -1274,6 +1274,14 @@ class Editor : public PublicEditor bool canvas_fade_in_handle_event (GdkEvent* event,ArdourCanvas::Item*, AudioRegionView*); bool canvas_fade_out_event (GdkEvent* event,ArdourCanvas::Item*, AudioRegionView*); bool canvas_fade_out_handle_event (GdkEvent* event,ArdourCanvas::Item*, AudioRegionView*); + + + // These variables are used to detect a feedback loop and break it to avoid a gui hang +private: + ArdourCanvas::Item *last_item_entered; + int last_item_entered_n; +public: + bool canvas_region_view_event (GdkEvent* event,ArdourCanvas::Item*, RegionView*); bool canvas_region_view_name_highlight_event (GdkEvent* event,ArdourCanvas::Item*, RegionView*); bool canvas_region_view_name_event (GdkEvent* event,ArdourCanvas::Item*, RegionView*); diff --git a/gtk2_ardour/editor_mouse.cc b/gtk2_ardour/editor_mouse.cc index a357a2d1ed..a7dd976266 100644 --- a/gtk2_ardour/editor_mouse.cc +++ b/gtk2_ardour/editor_mouse.cc @@ -1141,6 +1141,11 @@ Editor::enter_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemType item_ Marker * marker; double fraction; + if (last_item_entered != item) { + last_item_entered = item; + last_item_entered_n = 0; + } + switch (item_type) { case GainControlPointItem: if (mouse_mode == MouseGain) { @@ -1156,12 +1161,15 @@ Editor::enter_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemType item_ fraction = 1.0 - (cp->get_y() / cp->line.height()); - set_verbose_canvas_cursor (cp->line.get_verbose_cursor_string (fraction), at_x, at_y); - show_verbose_canvas_cursor (); - if (is_drawable() && !_scrubbing) { track_canvas.get_window()->set_cursor (*fader_cursor); } + + last_item_entered_n++; + set_verbose_canvas_cursor (cp->line.get_verbose_cursor_string (fraction), at_x, at_y); + if (last_item_entered_n < 10) { + show_verbose_canvas_cursor (); + } } break;