+ _session->set_record_enabled (rl, !rec_enable_button->active_state());
+ }
+ }
+
+ return true;
+}
+
+void
+RouteUI::monitoring_changed ()
+{
+ update_monitoring_display ();
+}
+
+void
+RouteUI::update_monitoring_display ()
+{
+ if (!_route) {
+ return;
+ }
+
+ boost::shared_ptr<Track> t = boost::dynamic_pointer_cast<Track>(_route);
+
+ if (!t) {
+ return;
+ }
+
+ MonitorState ms = t->monitoring_state();
+
+ if (t->monitoring_choice() & MonitorInput) {
+ monitor_input_button->set_active_state (Gtkmm2ext::ExplicitActive);
+ } else {
+ if (ms & MonitoringInput) {
+ monitor_input_button->set_active_state (Gtkmm2ext::ImplicitActive);
+ } else {
+ monitor_input_button->unset_active_state ();
+ }
+ }
+
+ if (t->monitoring_choice() & MonitorDisk) {
+ monitor_disk_button->set_active_state (Gtkmm2ext::ExplicitActive);
+ } else {
+ if (ms & MonitoringDisk) {
+ monitor_disk_button->set_active_state (Gtkmm2ext::ImplicitActive);
+ } else {
+ monitor_disk_button->unset_active_state ();
+ }
+ }
+}
+
+bool
+RouteUI::monitor_input_press(GdkEventButton*)
+{
+ return true;
+}
+
+bool
+RouteUI::monitor_input_release(GdkEventButton* ev)
+{
+ return monitor_release (ev, MonitorInput);
+}
+
+bool
+RouteUI::monitor_disk_press (GdkEventButton*)
+{
+ return true;
+}
+
+bool
+RouteUI::monitor_disk_release (GdkEventButton* ev)
+{
+ return monitor_release (ev, MonitorDisk);
+}
+
+bool
+RouteUI::monitor_release (GdkEventButton* ev, MonitorChoice monitor_choice)
+{
+ if (ev->button != 1) {
+ return false;
+ }
+
+ boost::shared_ptr<Track> t = boost::dynamic_pointer_cast<Track>(_route);
+
+ if (!t) {
+ return true;
+ }
+
+ MonitorChoice mc;
+ boost::shared_ptr<RouteList> rl;
+
+ /* XXX for now, monitoring choices are orthogonal. cue monitoring
+ will follow in 3.X but requires mixing the input and playback (disk)
+ signal together, which requires yet more buffers.
+ */
+
+ if (t->monitoring_choice() & monitor_choice) {
+ mc = MonitorChoice (t->monitoring_choice() & ~monitor_choice);
+ } else {
+ /* this line will change when the options are non-orthogonal */
+ // mc = MonitorChoice (t->monitoring_choice() | monitor_choice);
+ mc = monitor_choice;
+ }
+
+ if (Keyboard::modifier_state_equals (ev->state, Keyboard::ModifierMask (Keyboard::PrimaryModifier|Keyboard::TertiaryModifier))) {
+ rl = _session->get_routes ();
+
+ } else if (Keyboard::modifier_state_equals (ev->state, Keyboard::PrimaryModifier)) {
+ if (_route->route_group() && _route->route_group()->is_monitoring()) {
+ rl = _route->route_group()->route_list();
+ } else {
+ rl.reset (new RouteList);
+ rl->push_back (route());