update clocks and video-frames at FPS
[ardour.git] / gtk2_ardour / route_ui.cc
index 86f8697647b038db6957407fca7a2d65e536efd9..edc1b867ff95d72087e796016f242c31f2ea9d79 100644 (file)
@@ -77,6 +77,9 @@ RouteUI::RouteUI (ARDOUR::Session* sess)
        , sends_menu(0)
        , record_menu(0)
        , comment_window(0)
+       , comment_area(0)
+       , input_selector (0)
+       , output_selector (0)
        , _invert_menu(0)
 {
        if (sess) init ();
@@ -91,10 +94,13 @@ RouteUI::~RouteUI()
        delete mute_menu;
        delete sends_menu;
         delete record_menu;
-       delete _invert_menu;
        delete comment_window;
        delete input_selector;
        delete output_selector;
+       delete _invert_menu;
+       
+       send_blink_connection.disconnect ();
+       rec_blink_connection.disconnect ();
 }
 
 void
@@ -138,9 +144,11 @@ RouteUI::init ()
 
        rec_enable_button = manage (new ArdourButton);
        rec_enable_button->set_name ("record enable button");
-//     rec_enable_button->set_tweaks (ArdourButton::ImplicitUsesSolidColor);
+       rec_enable_button->set_markup ("<span weight=\"bold\" color=\"#f46f6f\">\u2B24</span>");
        UI::instance()->set_tip (rec_enable_button, _("Enable recording on this track"), "");
 
+       rec_blink_connection = ARDOUR_UI::instance()->Blink.connect (sigc::mem_fun (*this, &RouteUI::blink_rec_display));
+
        show_sends_button = manage (new ArdourButton);
        show_sends_button->set_name ("send alert button");
        UI::instance()->set_tip (show_sends_button, _("make mixer strips show sends to this bus"), "");
@@ -168,7 +176,7 @@ RouteUI::init ()
        rec_enable_button->signal_button_release_event().connect (sigc::mem_fun(*this, &RouteUI::rec_enable_release), false);
 
        show_sends_button->signal_button_press_event().connect (sigc::mem_fun(*this, &RouteUI::show_sends_press), false);
-       show_sends_button->signal_button_release_event().connect (sigc::mem_fun(*this, &RouteUI::show_sends_release));
+       show_sends_button->signal_button_release_event().connect (sigc::mem_fun(*this, &RouteUI::show_sends_release), false);
 
        solo_button->signal_button_press_event().connect (sigc::mem_fun(*this, &RouteUI::solo_press), false);
        solo_button->signal_button_release_event().connect (sigc::mem_fun(*this, &RouteUI::solo_release), false);
@@ -178,11 +186,11 @@ RouteUI::init ()
        monitor_input_button->set_distinct_led_click (false);
        monitor_disk_button->set_distinct_led_click (false);
 
-       monitor_input_button->signal_button_press_event().connect (sigc::mem_fun(*this, &RouteUI::monitor_input_press));
-       monitor_input_button->signal_button_release_event().connect (sigc::mem_fun(*this, &RouteUI::monitor_input_release));
+       monitor_input_button->signal_button_press_event().connect (sigc::mem_fun(*this, &RouteUI::monitor_input_press), false);
+       monitor_input_button->signal_button_release_event().connect (sigc::mem_fun(*this, &RouteUI::monitor_input_release), false);
 
-       monitor_disk_button->signal_button_press_event().connect (sigc::mem_fun(*this, &RouteUI::monitor_disk_press));
-       monitor_disk_button->signal_button_release_event().connect (sigc::mem_fun(*this, &RouteUI::monitor_disk_release));
+       monitor_disk_button->signal_button_press_event().connect (sigc::mem_fun(*this, &RouteUI::monitor_disk_press), false);
+       monitor_disk_button->signal_button_release_event().connect (sigc::mem_fun(*this, &RouteUI::monitor_disk_release), false);
 
        BusSendDisplayChanged.connect_same_thread (*this, boost::bind(&RouteUI::bus_send_display_changed, this, _1));
 }
@@ -266,8 +274,6 @@ RouteUI::set_route (boost::shared_ptr<Route> rp)
           set up the name entry/name label display.
        */
 
-       update_rec_display ();
-
        if (is_track()) {
                boost::shared_ptr<Track> t = boost::dynamic_pointer_cast<Track>(_route);
                t->MonitoringChanged.connect (route_connections, invalidator (*this), boost::bind (&RouteUI::monitoring_changed, this), gui_context());
@@ -296,6 +302,8 @@ RouteUI::set_route (boost::shared_ptr<Route> rp)
 
        update_mute_display ();
        update_solo_display ();
+
+       route_color_changed();
 }
 
 void
@@ -315,6 +323,10 @@ RouteUI::mute_press (GdkEventButton* ev)
                return true;
        }
 
+       //if this is a binding action, let the ArdourButton handle it
+       if ( BindingProxy::is_bind_action(ev) )
+               return false;
+                       
        multiple_mute_change = false;
 
        if (Keyboard::is_context_menu_event (ev)) {
@@ -324,18 +336,14 @@ RouteUI::mute_press (GdkEventButton* ev)
                }
 
                mute_menu->popup(0,ev->time);
+               
+               return true;
 
        } else {
 
                if (Keyboard::is_button2_event (ev)) {
-                       // Primary-button2 click is the midi binding click
                        // button2-click is "momentary"
 
-
-                       if (mute_button->on_button_press_event (ev)) {
-                               return true;
-                       }
-
                        _mute_release = new SoloMuteRelease (_route->muted ());
                }
 
@@ -413,11 +421,11 @@ RouteUI::mute_press (GdkEventButton* ev)
                }
        }
 
-       return true;
+       return false;
 }
 
 bool
-RouteUI::mute_release (GdkEventButton*)
+RouteUI::mute_release (GdkEventButton *ev)
 {
        if (_mute_release){
                DisplaySuspender ds;
@@ -426,7 +434,7 @@ RouteUI::mute_release (GdkEventButton*)
                _mute_release = 0;
        }
 
-       return true;
+       return false;
 }
 
 void
@@ -484,6 +492,10 @@ RouteUI::solo_press(GdkEventButton* ev)
                return true;
        }
 
+       //if this is a binding action, let the ArdourButton handle it
+       if ( BindingProxy::is_bind_action(ev) )
+               return false;
+                       
        multiple_solo_change = false;
 
        if (Keyboard::is_context_menu_event (ev)) {
@@ -502,13 +514,7 @@ RouteUI::solo_press(GdkEventButton* ev)
 
                if (Keyboard::is_button2_event (ev)) {
 
-                       // Primary-button2 click is the midi binding click
                        // button2-click is "momentary"
-
-                       if (solo_button->on_button_press_event (ev)) {
-                               return true;
-                       }
-
                        _solo_release = new SoloMuteRelease (_route->self_soloed());
                }
 
@@ -617,11 +623,11 @@ RouteUI::solo_press(GdkEventButton* ev)
                }
        }
 
-       return true;
+       return false;
 }
 
 bool
-RouteUI::solo_release (GdkEventButton*)
+RouteUI::solo_release (GdkEventButton *ev)
 {
        if (_solo_release) {
 
@@ -640,7 +646,7 @@ RouteUI::solo_release (GdkEventButton*)
                _solo_release = 0;
        }
 
-       return true;
+       return false;
 }
 
 bool
@@ -650,10 +656,14 @@ RouteUI::rec_enable_press(GdkEventButton* ev)
                return true;
        }
 
+       //if this is a binding action, let the ArdourButton handle it
+       if ( BindingProxy::is_bind_action(ev) )
+               return false;
+                       
        if (!_session->engine().connected()) {
                MessageDialog msg (_("Not connected to AudioEngine - cannot engage record"));
                msg.run ();
-               return true;
+               return false;
        }
 
         if (is_midi_track()) {
@@ -662,21 +672,21 @@ RouteUI::rec_enable_press(GdkEventButton* ev)
 
                 if (midi_track()->step_editing()) {
                        midi_track()->set_step_editing (false);
-                       return true;
+                       return false;
                 }
         }
 
        if (is_track() && rec_enable_button) {
 
                if (Keyboard::is_button2_event (ev)) {
-
-                       // do nothing on midi sigc::bind event
-                       return rec_enable_button->on_button_press_event (ev);
+                       
+                       //rec arm does not have a momentary mode
+                       return false;
 
                } else if (Keyboard::modifier_state_equals (ev->state, Keyboard::ModifierMask (Keyboard::PrimaryModifier|Keyboard::TertiaryModifier))) {
 
                        DisplaySuspender ds;
-                       _session->set_record_enabled (_session->get_routes(), !rec_enable_button->active_state());
+                       _session->set_record_enabled (_session->get_routes(), !_route->record_enabled());
 
                } else if (Keyboard::modifier_state_equals (ev->state, Keyboard::PrimaryModifier)) {
 
@@ -698,7 +708,7 @@ RouteUI::rec_enable_press(GdkEventButton* ev)
                                }
 
                                DisplaySuspender ds;
-                               _session->set_record_enabled (rl, !rec_enable_button->active_state(), Session::rt_cleanup, true);
+                               _session->set_record_enabled (rl, !_route->record_enabled(), Session::rt_cleanup, true);
                        }
 
                } else if (Keyboard::is_context_menu_event (ev)) {
@@ -710,11 +720,11 @@ RouteUI::rec_enable_press(GdkEventButton* ev)
                        boost::shared_ptr<RouteList> rl (new RouteList);
                        rl->push_back (route());
                        DisplaySuspender ds;
-                       _session->set_record_enabled (rl, !rec_enable_button->active_state());
+                       _session->set_record_enabled (rl, !_route->record_enabled());
                }
        }
 
-       return true;
+       return false;
 }
 
 void
@@ -762,7 +772,7 @@ RouteUI::update_monitoring_display ()
 bool
 RouteUI::monitor_input_press(GdkEventButton*)
 {
-       return true;
+       return false;
 }
 
 bool
@@ -774,7 +784,7 @@ RouteUI::monitor_input_release(GdkEventButton* ev)
 bool
 RouteUI::monitor_disk_press (GdkEventButton*)
 {
-       return true;
+       return false;
 }
 
 bool
@@ -830,7 +840,7 @@ RouteUI::monitor_release (GdkEventButton* ev, MonitorChoice monitor_choice)
        DisplaySuspender ds;
        _session->set_monitoring (rl, mc, Session::rt_cleanup, true);           
 
-       return true;
+       return false;
 }
 
 void
@@ -907,10 +917,10 @@ RouteUI::rec_enable_release (GdkEventButton* ev)
                 if (record_menu) {
                         record_menu->popup (1, ev->time);
                 }
-                return true;
+                return false;
         }
 
-       return true;
+       return false;
 }
 
 void
@@ -1218,19 +1228,18 @@ RouteUI::update_mute_display ()
 void
 RouteUI::route_rec_enable_changed ()
 {
-        update_rec_display ();
+       blink_rec_display(true);  //this lets the button change "immediately" rather than wait for the next blink
        update_monitoring_display ();
 }
 
 void
 RouteUI::session_rec_enable_changed ()
 {
-        update_rec_display ();
        update_monitoring_display ();
 }
 
 void
-RouteUI::update_rec_display ()
+RouteUI::blink_rec_display (bool blinkOn)
 {
        if (!rec_enable_button || !_route) {
                return;
@@ -1244,7 +1253,10 @@ RouteUI::update_rec_display ()
 
                 case Session::Disabled:
                 case Session::Enabled:
-                        rec_enable_button->set_active_state (Gtkmm2ext::ImplicitActive);
+                        if ( ARDOUR_UI::config()->get_blink_rec_arm() )
+                                                       rec_enable_button->set_active_state ( blinkOn ? Gtkmm2ext::ExplicitActive : Gtkmm2ext::Off );
+                                               else
+                                                       rec_enable_button->set_active_state ( ImplicitActive );
                         break;
 
                 }
@@ -1417,7 +1429,7 @@ RouteUI::solo_isolate_button_release (GdkEventButton* ev)
                }
        }
 
-       return true;
+       return false;
 }
 
 bool
@@ -1425,7 +1437,6 @@ RouteUI::solo_safe_button_release (GdkEventButton* ev)
 {
        if (ev->button == 1) {
                _route->set_solo_safe (!solo_safe_led->active_state(), this);
-               return true;
        }
        return false;
 }
@@ -1708,6 +1719,8 @@ RouteUI::comment_changed (void *src)
 void
 RouteUI::comment_editor_done_editing ()
 {
+       ENSURE_GUI_THREAD (*this, &MixerStrip::comment_editor_done_editing, src)
+
        string const str = comment_area->get_buffer()->get_text();
        if (str == _route->comment ()) {
                return;
@@ -1996,8 +2009,8 @@ RouteUI::setup_invert_buttons ()
 
        for (uint32_t i = 0; i < to_add; ++i) {
                ArdourButton* b = manage (new ArdourButton);
-               b->signal_button_press_event().connect (sigc::mem_fun (*this, &RouteUI::invert_press));
-               b->signal_button_release_event().connect (sigc::bind (sigc::mem_fun (*this, &RouteUI::invert_release), i));
+               b->signal_button_press_event().connect (sigc::mem_fun (*this, &RouteUI::invert_press), false);
+               b->signal_button_release_event().connect (sigc::bind (sigc::mem_fun (*this, &RouteUI::invert_release), i), false);
 
                b->set_name (X_("invert button"));
                if (to_add == 1) {
@@ -2064,7 +2077,7 @@ RouteUI::invert_release (GdkEventButton* ev, uint32_t i)
                if (N <= _max_invert_buttons) {
                        /* left-click inverts phase so long as we have a button per channel */
                        _route->set_phase_invert (i, !_invert_buttons[i]->get_active());
-                       return true;
+                       return false;
                }
        }
        return false;
@@ -2082,7 +2095,7 @@ RouteUI::invert_press (GdkEventButton* ev)
                   up a menu on right-click; left click is handled
                   on release.
                */
-               return true;
+               return false;
        }
        
        delete _invert_menu;
@@ -2100,7 +2113,7 @@ RouteUI::invert_press (GdkEventButton* ev)
 
        _invert_menu->popup (0, ev->time);
 
-       return false;
+       return true;
 }
 
 void