+ _gui_track_selection_changed (rl.get(), save_list);
+}
+
+void
+MackieControlProtocol::_gui_track_selection_changed (ARDOUR::RouteNotificationList* rl, bool save_list)
+{
+ /* We need to keep a list of the most recently selected routes around,
+ but we are not allowed to keep shared_ptr<Route> unless we want to
+ handle the complexities of route deletion. So instead, the GUI sends
+ us a notification using weak_ptr<Route>, which we keep a copy
+ of. For efficiency's sake, however, we convert the weak_ptr's into
+ shared_ptr<Route> before passing them to however many surfaces (and
+ thus strips) that we have.
+ */
+
+ StrongRouteNotificationList srl;
+
+ for (ARDOUR::RouteNotificationList::const_iterator i = rl->begin(); i != rl->end(); ++i) {
+ boost::shared_ptr<ARDOUR::Route> r = (*i).lock();
+ if (r) {
+ srl.push_back (r);
+ }
+ }
+
+ {
+ Glib::Threads::Mutex::Lock lm (surfaces_lock);
+
+ for (Surfaces::iterator s = surfaces.begin(); s != surfaces.end(); ++s) {
+ (*s)->gui_selection_changed (srl);
+ }
+ }
+
+ if (save_list) {
+ _last_selected_routes = *rl;