+void
+MixerStrip::switch_io (boost::shared_ptr<Route> target)
+{
+ /* don't respond to switch IO signal outside of the mixer window */
+
+ if (!_mixer_owned) {
+ return;
+ }
+
+ if (_route == target || _route->is_master()) {
+ /* don't change the display for the target or the master bus */
+ return;
+ } else if (!is_track() && show_sends_button) {
+ /* make sure our show sends button is inactive, and we no longer blink,
+ since we're not the target.
+ */
+ send_blink_connection.disconnect ();
+ show_sends_button->set_active (false);
+ show_sends_button->set_state (STATE_NORMAL);
+ }
+
+ if (!target) {
+ /* switch back to default */
+ revert_to_default_display ();
+ return;
+ }
+
+ boost::shared_ptr<Send> send = _route->internal_send_for (target);
+
+ if (send) {
+ show_send (send);
+ } else {
+ revert_to_default_display ();
+ }
+}
+
+void
+MixerStrip::drop_send ()
+{
+ boost::shared_ptr<Send> current_send;
+
+ if (_current_delivery && (current_send = boost::dynamic_pointer_cast<Send>(_current_delivery))) {
+ current_send->set_metering (false);
+ }
+
+ send_gone_connection.disconnect ();
+ input_button.set_sensitive (true);
+ output_button.set_sensitive (true);
+}
+
+void
+MixerStrip::show_send (boost::shared_ptr<Send> send)
+{
+ assert (send != 0);
+
+ drop_send ();
+
+ _current_delivery = send;
+
+ send->set_metering (true);
+ send_gone_connection = _current_delivery->GoingAway.connect (mem_fun (*this, &MixerStrip::revert_to_default_display));
+
+ gain_meter().set_controls (_route, send->meter(), send->amp());
+ gain_meter().setup_meters ();
+
+ panner_ui().set_panner (_current_delivery->panner());
+ panner_ui().setup_pan ();
+
+ input_button.set_sensitive (false);
+
+ if (boost::dynamic_pointer_cast<InternalSend>(send)) {
+ output_button.set_sensitive (false);
+ }
+
+ reset_strip_style ();
+}
+
+void
+MixerStrip::revert_to_default_display ()
+{
+ if (show_sends_button) {
+ show_sends_button->set_active (false);
+ }
+
+ drop_send ();
+
+ _current_delivery = _route->main_outs();
+
+ gain_meter().set_controls (_route, _route->shared_peak_meter(), _route->amp());
+ gain_meter().setup_meters ();
+
+ panner_ui().set_panner (_route->main_outs()->panner());
+ panner_ui().setup_pan ();
+
+ reset_strip_style ();
+}
+
+void
+MixerStrip::set_button_names ()
+{
+ switch (_width) {
+ case Wide:
+ rec_enable_button_label.set_text (_("Rec"));
+ mute_button_label.set_text (_("Mute"));
+ if (!Config->get_solo_control_is_listen_control()) {
+ solo_button_label.set_text (_("Solo"));
+ } else {
+ switch (Config->get_listen_position()) {
+ case AfterFaderListen:
+ solo_button_label.set_text (_("AFL"));
+ break;
+ case PreFaderListen:
+ solo_button_label.set_text (_("PFL"));
+ break;
+ }
+ }
+ break;
+
+ default:
+ rec_enable_button_label.set_text (_("R"));
+ mute_button_label.set_text (_("M"));
+ if (!Config->get_solo_control_is_listen_control()) {
+ solo_button_label.set_text (_("S"));
+ } else {
+ switch (Config->get_listen_position()) {
+ case AfterFaderListen:
+ solo_button_label.set_text (_("A"));
+ break;
+ case PreFaderListen:
+ solo_button_label.set_text (_("P"));
+ break;
+ }
+ }
+ break;
+
+ }
+}
+
+bool
+MixerStrip::on_key_press_event (GdkEventKey* ev)
+{
+ GdkEventButton fake;
+ fake.type = GDK_BUTTON_PRESS;
+ fake.button = 1;
+ fake.state = ev->state;
+
+ switch (ev->keyval) {
+ case GDK_m:
+ mute_press (&fake);
+ return true;
+ break;
+
+ case GDK_s:
+ solo_press (&fake);
+ return true;
+ break;
+
+ case GDK_r:
+ rec_enable_press (&fake);
+ return true;
+ break;
+
+ case GDK_e:
+ show_sends_press (&fake);
+ return true;
+ break;
+
+ case GDK_g:
+ if (ev->state & Keyboard::PrimaryModifier) {
+ step_gain_down ();
+ } else {
+ step_gain_up ();
+ }
+ return true;
+ break;
+
+ case GDK_0:
+ if (_route) {
+ _route->set_gain (1.0, this);
+ }
+ return true;
+
+ default:
+ break;
+ }
+
+ return false;
+}
+
+
+bool
+MixerStrip::on_key_release_event (GdkEventKey* ev)
+{
+ GdkEventButton fake;
+ fake.type = GDK_BUTTON_RELEASE;
+ fake.button = 1;
+ fake.state = ev->state;
+
+ switch (ev->keyval) {
+ case GDK_m:
+ mute_release (&fake);
+ return true;
+ break;
+
+ case GDK_s:
+ solo_release (&fake);
+ return true;
+ break;
+
+ case GDK_r:
+ rec_enable_release (&fake);
+ return true;
+ break;
+
+ case GDK_e:
+ show_sends_release (&fake);
+ return true;
+ break;
+
+ case GDK_g:
+ return true;
+ break;
+
+ default:
+ break;
+ }
+
+ return false;
+}
+
+bool
+MixerStrip::on_enter_notify_event (GdkEventCrossing*)
+{
+ Keyboard::magic_widget_grab_focus ();
+ grab_focus ();
+ return false;
+}
+
+bool
+MixerStrip::on_leave_notify_event (GdkEventCrossing* ev)
+{
+ switch (ev->detail) {
+ case GDK_NOTIFY_INFERIOR:
+ break;
+ default:
+ Keyboard::magic_widget_drop_focus ();
+ }
+
+ return false;
+}
+
+void
+MixerStrip::mono_button_clicked ()
+{
+ panners.set_mono (_mono_button.get_active ());
+}
+
+PluginSelector*
+MixerStrip::plugin_selector()
+{
+ return _mixer.plugin_selector();
+}