'libs/ardour' - Compiler specific includes and includes
[ardour.git] / gtk2_ardour / port_matrix.cc
index 0fbbc03fb0a46827f73f644b0a153b46f2ec294c..5c21d7ff2506c4b6cac73b80e81289baf71131c1 100644 (file)
@@ -152,6 +152,7 @@ PortMatrix::init ()
 
        /* and also bundles */
        _session->BundleAdded.connect (_session_connections, invalidator (*this), boost::bind (&PortMatrix::setup_global_ports, this), gui_context());
+       _session->BundleRemoved.connect (_session_connections, invalidator (*this), boost::bind (&PortMatrix::setup_global_ports, this), gui_context());
 
        /* and also ports */
        _session->engine().PortRegisteredOrUnregistered.connect (_session_connections, invalidator (*this), boost::bind (&PortMatrix::setup_global_ports, this), gui_context());
@@ -180,6 +181,7 @@ PortMatrix::reconnect_to_routes ()
        boost::shared_ptr<RouteList> routes = _session->get_routes ();
        for (RouteList::iterator i = routes->begin(); i != routes->end(); ++i) {
                (*i)->processors_changed.connect (_route_connections, invalidator (*this), boost::bind (&PortMatrix::route_processors_changed, this, _1), gui_context());
+               (*i)->DropReferences.connect (_route_connections, invalidator (*this), boost::bind (&PortMatrix::routes_changed, this), gui_context());
        }
 }
 
@@ -198,6 +200,7 @@ PortMatrix::route_processors_changed (RouteProcessorChange c)
 void
 PortMatrix::routes_changed ()
 {
+       if (!_session) return;
        reconnect_to_routes ();
        setup_global_ports ();
 }
@@ -206,6 +209,11 @@ PortMatrix::routes_changed ()
 void
 PortMatrix::setup ()
 {
+       if (!_session) {
+               _route_connections.drop_connections ();
+               return; // session went away
+       }
+
        /* this needs to be done first, as the visible_ports() method uses the
           notebook state to decide which ports are being shown */
 
@@ -506,7 +514,7 @@ PortMatrix::popup_menu (BundleChannel column, BundleChannel row, uint32_t t)
        items.push_back (MenuElem (_("Rescan"), sigc::mem_fun (*this, &PortMatrix::setup_all_ports)));
 
        items.push_back (CheckMenuElem (_("Show individual ports"), sigc::mem_fun (*this, &PortMatrix::toggle_show_only_bundles)));
-       CheckMenuItem* i = dynamic_cast<CheckMenuItem*> (&items.back());
+       Gtk::CheckMenuItem* i = dynamic_cast<Gtk::CheckMenuItem*> (&items.back());
        _inhibit_toggle_show_only_bundles = true;
        i->set_active (!_show_only_bundles);
        _inhibit_toggle_show_only_bundles = false;