Ignore Selection::set() without actual changes
authorRobin Gareus <robin@gareus.org>
Sat, 17 Jun 2017 13:51:40 +0000 (15:51 +0200)
committerRobin Gareus <robin@gareus.org>
Sat, 17 Jun 2017 14:11:24 +0000 (16:11 +0200)
gtk2_ardour/selection.cc

index 18ae75b386ede8e50cbb7eafc105d28e79f44d60..a1ba890e576a179291eb8236d1d1d4f8b0c08c05 100644 (file)
@@ -1531,6 +1531,43 @@ Selection::set (const TrackViewList& track_list)
        TrackViewList t = add_grouped_tracks (track_list);
 
        CoreSelection& selection (editor->session()->selection());
+
+#if 1 // crazy optmization hack
+       /* check is the selection actually changed, ignore NO-OPs
+        *
+        * There are excessive calls from EditorRoutes::selection_changed():
+        * Every click calls selection_changed() even if it doesn't change.
+        * Also re-ordering tracks calls into this due to gtk's odd DnD signal
+        * messaging (row removed, re-added).
+        *
+        * Re-ordering a row results in at least 2 calls to selection_changed()
+        * without actual change. Calling selection.clear_stripables()
+        * and re-adding the same tracks every time in turn emits changed signals.
+        */
+       bool changed = false;
+       CoreSelection::StripableAutomationControls sac;
+       selection.get_stripables (sac);
+       for (TrackSelection::const_iterator i = t.begin(); i != t.end(); ++i) {
+               boost::shared_ptr<Stripable> s = (*i)->stripable ();
+               boost::shared_ptr<AutomationControl> c = (*i)->control ();
+               bool found = false;
+               for (CoreSelection::StripableAutomationControls::iterator j = sac.begin (); j != sac.end (); ++j) {
+                       if (j->stripable == s && j->controllable == c) {
+                               found = true;
+                               sac.erase (j);
+                               break;
+                       }
+               }
+               if (!found) {
+                       changed = true;
+                       break;
+               }
+       }
+       if (!changed && sac.size() == 0) {
+               return;
+       }
+#endif
+
        PresentationInfo::ChangeSuspender cs;
 
        selection.clear_stripables ();