lots of tricks & tweaks related to the monitor section and All That It Uses
authorPaul Davis <paul@linuxaudiosystems.com>
Fri, 19 Mar 2010 20:53:22 +0000 (20:53 +0000)
committerPaul Davis <paul@linuxaudiosystems.com>
Fri, 19 Mar 2010 20:53:22 +0000 (20:53 +0000)
git-svn-id: svn://localhost/ardour2/branches/3.0@6777 d708f5d6-7413-0410-9779-e7cbd77b26cf

14 files changed:
gtk2_ardour/ardour3_ui_dark.rc.in
gtk2_ardour/ardour_ui.h
gtk2_ardour/ardour_ui2.cc
gtk2_ardour/ardour_ui_ed.cc
gtk2_ardour/icons/bigknob.png
gtk2_ardour/mixer_strip.cc
gtk2_ardour/mixer_ui.cc
gtk2_ardour/monitor_section.cc
gtk2_ardour/monitor_section.h
libs/ardour/session.cc
libs/gtkmm2ext/gtkmm2ext/tearoff.h
libs/gtkmm2ext/motionfeedback.cc
libs/gtkmm2ext/stateful_button.cc
libs/gtkmm2ext/tearoff.cc

index ff7ecc9a3cd9ef143b69bfdfb415d0d0307524eb..2ec1f56eeea348e9bca723e19d1bcea23c9b771e 100644 (file)
@@ -1132,7 +1132,7 @@ style "flashing_alert" = "very_small_text"
 {
        fg[NORMAL] = { 0.80, 0.80, 0.80 }
        bg[NORMAL] = { 0.26, 0.26, 0.31 }
-
+        
        fg[ACTIVE] = { 0.80, 0.80, 0.80 }
        bg[ACTIVE] = { 1.0, 0, 0}
 }
@@ -1585,6 +1585,8 @@ widget "*BypassButton" style:highest "red_when_active"
 widget "*BypassButton*" style:highest "red_when_active"
 widget "*TransportSoloAlert" style:highest "flashing_alert"
 widget "*TransportSoloAlert.*" style:highest "flashing_alert"
+widget "*TransportSoloAlert-active" style:highest "flashing_alert"
+widget "*TransportSoloAlert-alternate" style:highest "flashing_alert"
 widget "*SendAlert" style:highest "green_flashing_alert"
 widget "*SendAlert.*" style:highest "green_flashing_alert"
 widget "*TransportAuditioningAlert" style:highest "flashing_alert"
index e131cf5431eed14da21008c54eb48eace42880bb..a851e03981f6bb7c382113510248fe5a617f4723 100644 (file)
@@ -184,6 +184,7 @@ class ARDOUR_UI : public Gtkmm2ext::UI, public ARDOUR::SessionHandlePtr
        XMLNode* editor_settings() const;
        XMLNode* mixer_settings () const;
        XMLNode* keyboard_settings () const;
+        XMLNode* tearoff_settings (const char*) const;
 
        void save_ardour_state ();
        gboolean configure_handler (GdkEventConfigure* conf);
@@ -455,8 +456,8 @@ class ARDOUR_UI : public Gtkmm2ext::UI, public ARDOUR::SessionHandlePtr
        void auditioning_changed (bool);
        void _auditioning_changed (bool);
 
-       void solo_alert_toggle ();
-       void audition_alert_toggle ();
+       bool solo_alert_press (GdkEventButton* ev);
+       bool audition_alert_press (GdkEventButton* ev);
 
        void big_clock_value_changed ();
        void primary_clock_value_changed ();
index 52ab0716d8c2e365b4155e50719d64f621b118b7..6162ef22d9ff87ca98979905e1954262235c22d3 100644 (file)
@@ -72,10 +72,6 @@ ARDOUR_UI::setup_windows ()
 
        we_have_dependents ();
 
-       setup_clock ();
-       setup_transport();
-       build_menu_bar ();
-
        theme_manager->signal_unmap().connect (sigc::bind (sigc::ptr_fun(&ActionManager::uncheck_toggleaction), X_("<Actions>/Common/ToggleThemeManager")));
 
 #ifdef TOP_MENUBAR
@@ -97,6 +93,10 @@ ARDOUR_UI::setup_windows ()
 
        editor->add_toplevel_controls (top_packer);
 
+       setup_clock ();
+       setup_transport();
+       build_menu_bar ();
+
        setup_tooltips ();
 
        return 0;
@@ -174,6 +174,22 @@ block_prelight (Gtk::Widget& w)
 }
 #endif
 
+XMLNode*
+ARDOUR_UI::tearoff_settings (const char* name) const
+{
+        XMLNode* ui_node = Config->extra_xml(X_("UI"));
+        
+        if (ui_node) {
+                XMLNode* tearoff_node = ui_node->child (X_("Tearoffs"));
+                if (tearoff_node) {
+                        XMLNode* mnode = tearoff_node->child (name);
+                        return mnode;
+                }
+        }
+
+        return 0;
+}
+
 void
 ARDOUR_UI::setup_transport ()
 {
@@ -319,9 +335,9 @@ ARDOUR_UI::setup_transport ()
        /* CANNOT sigc::bind these to clicked or toggled, must use pressed or released */
 
        solo_alert_button.set_name ("TransportSoloAlert");
-       solo_alert_button.signal_pressed().connect (sigc::mem_fun(*this,&ARDOUR_UI::solo_alert_toggle));
+       solo_alert_button.signal_button_press_event().connect (sigc::mem_fun(*this,&ARDOUR_UI::solo_alert_press), false);
        auditioning_alert_button.set_name ("TransportAuditioningAlert");
-       auditioning_alert_button.signal_pressed().connect (sigc::mem_fun(*this,&ARDOUR_UI::audition_alert_toggle));
+       auditioning_alert_button.signal_button_press_event().connect (sigc::mem_fun(*this,&ARDOUR_UI::audition_alert_press), false);
 
        alert_box.pack_start (solo_alert_button, false, false);
        alert_box.pack_start (auditioning_alert_button, false, false);
@@ -435,6 +451,11 @@ ARDOUR_UI::setup_transport ()
                Image* img = manage (new Image ((::get_icon (X_("sae")))));
                transport_tearoff_hbox.pack_end (*img, false, false, 6);
        }
+
+        XMLNode* tnode = tearoff_settings ("transport");
+        if (tnode) {
+                transport_tearoff->set_state (*tnode);
+        }
 }
 
 void
@@ -482,20 +503,26 @@ ARDOUR_UI::auditioning_changed (bool onoff)
        UI::instance()->call_slot (boost::bind (&ARDOUR_UI::_auditioning_changed, this, onoff));
 }
 
-void
-ARDOUR_UI::audition_alert_toggle ()
+bool
+ARDOUR_UI::audition_alert_press (GdkEventButton* ev)
 {
        if (_session) {
                _session->cancel_audition();
        }
+        return true;
 }
 
-void
-ARDOUR_UI::solo_alert_toggle ()
+bool
+ARDOUR_UI::solo_alert_press (GdkEventButton* ev)
 {
-       if (_session) {
-               _session->set_solo (_session->get_routes(), !_session->soloing());
-       }
+        if (_session) {
+                if (_session->soloing()) {
+                        _session->set_solo (_session->get_routes(), false);
+                } else if (_session->listening()) {
+                        _session->set_listen (_session->get_routes(), false);
+                }
+        }
+        return true;
 }
 
 void
@@ -505,7 +532,7 @@ ARDOUR_UI::solo_blink (bool onoff)
                return;
        }
 
-       if (_session->soloing()) {
+       if (_session->soloing() || _session->listening()) {
                if (onoff) {
                        solo_alert_button.set_state (STATE_ACTIVE);
                } else {
index 46cd5d952d504e75dea503a86b0b568f9f98334d..f3bc96c6c53b32e56d66b8f8c15446e66a222d77 100644 (file)
@@ -722,19 +722,19 @@ ARDOUR_UI::save_ardour_state ()
 
         if (transport_tearoff) {
                 XMLNode* t = new XMLNode (X_("transport"));
-                transport_tearoff->add_tornoff_state (*t);
+                transport_tearoff->add_state (*t);
                 tearoff_node->add_child_nocopy (*t);
         } 
 
         if (mixer && mixer->monitor_section()) {
                 XMLNode* t = new XMLNode (X_("monitor-section"));
-                mixer->monitor_section()->tearoff()->add_tornoff_state (*t);
+                mixer->monitor_section()->tearoff().add_state (*t);
                 tearoff_node->add_child_nocopy (*t);
         } 
 
         if (editor && editor->mouse_mode_tearoff()) {
                 XMLNode* t = new XMLNode (X_("mouse-mode"));
-                editor->mouse_mode_tearoff ()->add_tornoff_state (*t);
+                editor->mouse_mode_tearoff ()->add_state (*t);
                 tearoff_node->add_child_nocopy (*t);
         } 
         
index a5a3f5df5625ad8b26971227487f83bacd84f2c8..9e26273935de6298db5ae275c8660bd7c3a32b31 100644 (file)
Binary files a/gtk2_ardour/icons/bigknob.png and b/gtk2_ardour/icons/bigknob.png differ
index 57faf1c3bb1946ceabbdf84c93c9320fb4969cbb..6b92873569c8b2e7414c7d80d1904924cc152124 100644 (file)
@@ -193,7 +193,7 @@ MixerStrip::init ()
        middle_button_table.set_homogeneous (true);
        middle_button_table.set_spacings (0);
        middle_button_table.attach (*mute_button, 0, 1, 0, 1);
-       middle_button_table.attach (*solo_button, 1, 2, 0, 1);
+        middle_button_table.attach (*solo_button, 1, 2, 0, 1);
 
        bottom_button_table.set_col_spacings (0);
        bottom_button_table.set_homogeneous (true);
@@ -338,6 +338,12 @@ MixerStrip::set_route (boost::shared_ptr<Route> rt)
                set_color (unique_random_color());
        }
 
+        if (route()->is_master()) {
+                solo_button->hide ();
+        } else {
+                solo_button->show ();
+        }
+
        if (_mixer_owned && (route()->is_master() || route()->is_control())) {
 
                if (scrollbar_height == 0) {
index badd96154a88025f4fbcf4ad1b305c6182d0055d..6a273434e3bba9d7f345e23170443f12a0183d05 100644 (file)
@@ -324,26 +324,16 @@ Mixer_UI::add_strip (RouteList& routes)
                 if (route->is_control()) {
                         if (!_monitor_section) {
                                 _monitor_section = new MonitorSection (_session);
-                                out_packer.pack_end (_monitor_section->pack_widget(), false, false);
+                                out_packer.pack_end (_monitor_section->tearoff(), false, false);
                         } else {
                                 _monitor_section->set_session (_session);
                         }
 
-                        _monitor_section->pack_widget().show_all ();
-
-                        XMLNode* ui_node = Config->extra_xml(X_("UI"));
-
-                        if (ui_node) {
-                                cerr << "Got UI node\n";
-                                XMLNode* tearoff_node = ui_node->child (X_("Tearoffs"));
-                                if (tearoff_node) {
-                                        cerr << "Got tearoff node\n";
-                                        XMLNode* mnode = tearoff_node->child (X_("monitor-section"));
-                                        if (mnode) {
-                                                cerr << "got mndeo\n";
-                                                _monitor_section->tearoff()->set_tornoff_state (*mnode);
-                                        }
-                                }
+                        _monitor_section->tearoff().show_all ();
+
+                        XMLNode* mnode = ARDOUR_UI::instance()->tearoff_settings (X_("monitor-section"));
+                        if (mnode) {
+                                _monitor_section->tearoff().set_state (*mnode);
                         }
 
                         /* no regular strip shown for control out */
@@ -548,7 +538,7 @@ Mixer_UI::session_going_away ()
                delete (*i);
        }
 
-        _monitor_section->pack_widget().hide ();
+        _monitor_section->tearoff().hide_visible ();
 
        strips.clear ();
 
@@ -614,10 +604,6 @@ Mixer_UI::fast_update_strips ()
                for (list<MixerStrip *>::iterator i = strips.begin(); i != strips.end(); ++i) {
                        (*i)->fast_update ();
                }
-
-                if (_monitor_section) {
-                        _monitor_section->fast_update ();
-                }
        }
 }
 
index 480786eb2c3317a0917b7e2a08ecffa89c33b060..5f779c6422a6441478e522e56b4be49a277f6b2a 100644 (file)
@@ -30,11 +30,31 @@ Glib::RefPtr<ActionGroup> MonitorSection::monitor_actions;
 Glib::RefPtr<Gdk::Pixbuf> MonitorSection::big_knob_pixbuf;
 Glib::RefPtr<Gdk::Pixbuf> MonitorSection::little_knob_pixbuf;
 
+static bool
+fixup_prelight (GdkEventCrossing* /* ignored */, GtkWidget* widget)
+{
+        GtkRcStyle* style = gtk_rc_style_copy (gtk_widget_get_modifier_style (widget));
+        int current = gtk_widget_get_state (widget);
+
+        style->fg[GTK_STATE_PRELIGHT] = style->fg[current];
+        style->bg[GTK_STATE_PRELIGHT] = style->bg[current];
+
+        gtk_widget_modify_style(widget, style);
+        g_object_unref(style);
+
+       return false;
+}
+
+static void
+block_prelight (Gtk::Widget& w)
+{
+       w.signal_enter_notify_event().connect (sigc::bind (sigc::ptr_fun (fixup_prelight), w.gobj()), false);
+}
+
 MonitorSection::MonitorSection (Session* s)
         : AxisView (s)
         , RouteUI (s)
         , main_table (2, 3)
-        , meter (s)
         , _tearoff (0)
         , gain_adjustment (1.0, 0.0, 1.0, 0.01, 0.1)
         , gain_control (0)
@@ -42,6 +62,8 @@ MonitorSection::MonitorSection (Session* s)
         , dim_control (0)
         , solo_boost_adjustment (1.0, 1.0, 2.0, 0.01, 0.1) 
         , solo_boost_control (0)
+        , solo_cut_adjustment (0.0, 0.0, 1.0, 0.01, 0.1) 
+        , solo_cut_control (0)
         , solo_in_place_button (solo_model_group, _("SiP"))
         , afl_button (solo_model_group, _("AFL"))
         , pfl_button (solo_model_group, _("PFL"))
@@ -63,35 +85,18 @@ MonitorSection::MonitorSection (Session* s)
         
         set_session (s);
         
-        VBox* sub_knob_packer = manage (new VBox);
-        sub_knob_packer->set_spacing (12);
-
         VBox* spin_packer;
         Label* spin_label;
 
-        gain_control = new VolumeController (big_knob_pixbuf, &gain_adjustment, true);
-        gain_adjustment.signal_value_changed().connect (sigc::mem_fun (*this, &MonitorSection::gain_value_changed));
-        gain_control->spinner().signal_output().connect (sigc::bind (sigc::mem_fun (*this, &MonitorSection::nonlinear_gain_printer), 
-                                                                     &gain_control->spinner()));
+        /* Dim */
 
-        spin_label = manage (new Label (_("Gain (dB)")));
-        spin_packer = manage (new VBox);
-        spin_packer->show ();
-        spin_packer->set_spacing (6);
-        spin_packer->pack_start (*gain_control, false, false);
-        spin_packer->pack_start (*spin_label, false, false);
-
-        sub_knob_packer->pack_start (*spin_packer, false, false);
-                
-        dim_control = new VolumeController (little_knob_pixbuf, &dim_adjustment, true, 30, 30);
+        dim_control = new VolumeController (little_knob_pixbuf, &dim_adjustment, false, 30, 30);
         dim_adjustment.signal_value_changed().connect (sigc::mem_fun (*this, &MonitorSection::dim_level_changed));
-        dim_control->spinner().signal_output().connect (sigc::bind (sigc::mem_fun (*this, &MonitorSection::linear_gain_printer), 
-                                                                    &dim_control->spinner()));
 
         HBox* dim_packer = manage (new HBox);
         dim_packer->show ();
 
-        spin_label = manage (new Label (_("Dim Cut (dB)")));
+        spin_label = manage (new Label (_("Dim Cut")));
         spin_packer = manage (new VBox);
         spin_packer->show ();
         spin_packer->set_spacing (6);
@@ -99,64 +104,18 @@ MonitorSection::MonitorSection (Session* s)
         spin_packer->pack_start (*spin_label, false, false); 
 
         dim_packer->set_spacing (12);
-        dim_packer->pack_start (*spin_packer, false, false);
-
-        VBox* keep_dim_under_vertical_size_control = manage (new VBox);
-        keep_dim_under_vertical_size_control->pack_start (dim_all_button, true, false);
-        keep_dim_under_vertical_size_control->show ();
-        dim_all_button.set_size_request (40,40);
-        dim_all_button.show ();
-
-        dim_packer->pack_start (*keep_dim_under_vertical_size_control, false, false);
-        sub_knob_packer->pack_start (*dim_packer, false, true);
-
-        solo_boost_control = new VolumeController (little_knob_pixbuf, &solo_boost_adjustment, true, 30, 30);
-        solo_boost_adjustment.signal_value_changed().connect (sigc::mem_fun (*this, &MonitorSection::solo_boost_changed));
-        solo_boost_control->spinner().signal_output().connect (sigc::bind (sigc::mem_fun (*this, &MonitorSection::linear_gain_printer),
-                                                                           &solo_boost_control->spinner()));
-
-        HBox* solo_packer = manage (new HBox);
-        solo_packer->show ();
-
-        spin_label = manage (new Label (_("Solo Boost (dB)")));
-        spin_packer = manage (new VBox);
-        spin_packer->show ();
-        spin_packer->set_spacing (6);
-        spin_packer->pack_start (*solo_boost_control, false, false);
-        spin_packer->pack_start (*spin_label, false, false); 
-
-        VBox* keep_rude_solo_under_vertical_size_control = manage (new VBox);
-        keep_rude_solo_under_vertical_size_control->show ();
-        keep_rude_solo_under_vertical_size_control->pack_start (rude_solo_button, true, false);
+        dim_packer->pack_start (*spin_packer, true, true);
 
-        solo_packer->set_spacing (12);
-        solo_packer->pack_start (*spin_packer, false, false);
-        solo_packer->pack_start (*keep_rude_solo_under_vertical_size_control, true, false);
+        /* Rude Solo */
 
        rude_solo_button.set_name ("TransportSoloAlert");
         rude_solo_button.show ();
+        block_prelight (rude_solo_button);
 
         ARDOUR_UI::Blink.connect (sigc::mem_fun (*this, &MonitorSection::solo_blink));
-       rude_solo_button.signal_button_press_event().connect (sigc::mem_fun(*this, &MonitorSection::cancel_solo));
+       rude_solo_button.signal_button_press_event().connect (sigc::mem_fun(*this, &MonitorSection::cancel_solo), false);
         UI::instance()->set_tip (rude_solo_button, _("When active, something is soloed.\nClick to de-solo everything"));
 
-        sub_knob_packer->pack_start (*solo_packer, false, true);
-
-        knob_packer.pack_start (*sub_knob_packer, false, true);
-
-        sub_knob_packer->show ();
-        knob_packer.show ();
-        gain_control->show_all ();
-        dim_control->show_all ();
-        solo_boost_control->show_all ();
-
-        meter.set_meter (&_route->peak_meter());
-        meter.setup_meters (300, 5);
-        
-        table_knob_packer.pack_start (main_table, true, true);
-        table_knob_packer.pack_start (knob_packer, false, false);
-
-        table_knob_packer.show ();
 
         solo_model_box.set_spacing (6);
         solo_model_box.pack_start (solo_in_place_button, false, false);
@@ -183,7 +142,43 @@ MonitorSection::MonitorSection (Session* s)
                 act->connect_proxy (pfl_button);
         } 
 
+
+        /* Solo Boost */
+
+        solo_boost_control = new VolumeController (little_knob_pixbuf, &solo_boost_adjustment, false, 30, 30);
+        solo_boost_adjustment.signal_value_changed().connect (sigc::mem_fun (*this, &MonitorSection::solo_boost_changed));
+
+        HBox* solo_packer = manage (new HBox);
+        solo_packer->set_spacing (12);
+        solo_packer->show ();
+
+        spin_label = manage (new Label (_("Solo Boost")));
+        spin_packer = manage (new VBox);
+        spin_packer->show ();
+        spin_packer->set_spacing (6);
+        spin_packer->pack_start (*solo_boost_control, false, false);
+        spin_packer->pack_start (*spin_label, false, false); 
+
+        solo_packer->pack_start (*spin_packer, true, true);
+
+        /* Solo (SiP) cut */
+
+        solo_cut_control = new VolumeController (little_knob_pixbuf, &solo_cut_adjustment, false, 30, 30);
+        // solo_cut_adjustment.signal_value_changed().connect (sigc::mem_fun (*this, &MonitorSection::solo_cut_changed));
+
+        spin_label = manage (new Label (_("SiP Cut")));
+        spin_packer = manage (new VBox);
+        spin_packer->show ();
+        spin_packer->set_spacing (6);
+        spin_packer->pack_start (*solo_cut_control, false, false);
+        spin_packer->pack_start (*spin_label, false, false); 
+
+        solo_packer->pack_start (*spin_packer, true, true);
+
+        upper_packer.set_spacing (12);
+        upper_packer.pack_start (rude_solo_button, false, false);
         upper_packer.pack_start (solo_model_box, false, false);
+        upper_packer.pack_start (*solo_packer, false, false);
 
         act = ActionManager::get_action (X_("Monitor"), X_("monitor-cut-all"));
         if (act) {
@@ -203,31 +198,50 @@ MonitorSection::MonitorSection (Session* s)
         cut_all_button.set_size_request (50,50);
         cut_all_button.show ();
 
+        HBox* bbox = manage (new HBox);
+
+        bbox->set_spacing (12);
+        bbox->pack_start (mono_button, true, true);
+        bbox->pack_start (dim_all_button, true, true);
+
         lower_packer.set_spacing (12);
-        lower_packer.pack_start (mono_button, false, false);
+        lower_packer.pack_start (*bbox, false, false);
         lower_packer.pack_start (cut_all_button, false, false);
 
+        /* Gain */
+
+        gain_control = new VolumeController (big_knob_pixbuf, &gain_adjustment, false, 80, 80);
+        gain_adjustment.signal_value_changed().connect (sigc::mem_fun (*this, &MonitorSection::gain_value_changed));
+
+        spin_label = manage (new Label (_("Gain")));
+        spin_packer = manage (new VBox);
+        spin_packer->show ();
+        spin_packer->set_spacing (6);
+        spin_packer->pack_start (*gain_control, false, false);
+        spin_packer->pack_start (*spin_label, false, false);
+
+        lower_packer.pack_start (*spin_packer, true, true);
+
         vpacker.set_border_width (12);
         vpacker.set_spacing (12);
         vpacker.pack_start (upper_packer, false, false);
-        vpacker.pack_start (table_knob_packer, false, false);
+        vpacker.pack_start (*dim_packer, false, false);
+        vpacker.pack_start (main_table, false, false);
         vpacker.pack_start (lower_packer, false, false);
 
-        VBox* keep_meter_under_control = manage (new VBox);
-        keep_meter_under_control->pack_start (meter, false, false);
-        keep_meter_under_control->show ();
-
         hpacker.set_border_width (12);
         hpacker.set_spacing (12);
-        hpacker.pack_start (*keep_meter_under_control, false, false);
         hpacker.pack_start (vpacker, true, true);
 
+        gain_control->show_all ();
+        dim_control->show_all ();
+        solo_boost_control->show_all ();
+
         main_table.show ();
         hpacker.show ();
         upper_packer.show ();
         lower_packer.show ();
         vpacker.show ();
-        meter.show_all ();
 
         populate_buttons ();
         map_state ();
@@ -266,19 +280,16 @@ MonitorSection::set_session (Session* s)
                 if (_route) {
                         /* session with control outs */
                         _monitor = _route->monitor_control ();
-                        meter.set_meter (&_route->peak_meter());
                 } else { 
                         /* session with no control outs */
                         _monitor.reset ();
                         _route.reset ();
-                        meter.set_meter (0);
                 }
                         
         } else {
                 /* no session */
                 _monitor.reset ();
                 _route.reset ();
-                meter.set_meter (0);
         }
 
         /* both might be null */
@@ -298,6 +309,11 @@ MonitorSection::ChannelButtonSet::ChannelButtonSet ()
         gtk_activatable_set_use_action_appearance (GTK_ACTIVATABLE (dim.gobj()), false);
         gtk_activatable_set_use_action_appearance (GTK_ACTIVATABLE (invert.gobj()), false);
         gtk_activatable_set_use_action_appearance (GTK_ACTIVATABLE (solo.gobj()), false);
+
+        block_prelight (cut);
+        block_prelight (dim);
+        block_prelight (solo);
+        block_prelight (invert);
 }
 
 void
@@ -393,12 +409,6 @@ MonitorSection::set_button_names ()
         solo_button_label.set_text ("rec");
 }
 
-Widget&
-MonitorSection::pack_widget () const
-{
-        return *_tearoff;
-}
-
 void
 MonitorSection::dim_all ()
 {
@@ -640,18 +650,12 @@ MonitorSection::solo_use_pfl ()
         }
 }
 
-void
-MonitorSection::fast_update ()
-{
-        meter.update_meters ();
-}
-
 void
 MonitorSection::setup_knob_images ()
 {
         try {
                 
-                big_knob_pixbuf = ::get_icon ("knob");
+                big_knob_pixbuf = ::get_icon ("bigknob");
                 
         }  catch (...) {
                 
@@ -843,7 +847,7 @@ MonitorSection::solo_blink (bool onoff)
                        rude_solo_button.set_state (STATE_NORMAL);
                }
        } else {
-               rude_solo_button.set_active (false);
+               // rude_solo_button.set_active (false);
                rude_solo_button.set_state (STATE_NORMAL);
        }
 }
@@ -851,8 +855,12 @@ MonitorSection::solo_blink (bool onoff)
 bool
 MonitorSection::cancel_solo (GdkEventButton* ev)
 {
-        if (_session && _session->soloing()) {
-                _session->set_solo (_session->get_routes(), false);
+        if (_session) {
+                if (_session->soloing()) {
+                        _session->set_solo (_session->get_routes(), false);
+                } else if (_session->listening()) {
+                        _session->set_listen (_session->get_routes(), false);
+                }
         }
 
         return true;
index 405b8eba87015315da4ad4650bb376bdbfa145bf..8af84988f14ce609c43c0243a8127671ee44c5b6 100644 (file)
@@ -39,12 +39,9 @@ class MonitorSection : public RouteUI
         ~MonitorSection ();
 
         void set_session (ARDOUR::Session*);
-
-        Gtk::Widget& pack_widget () const;
-        void fast_update ();
         static void setup_knob_images ();
 
-        Gtkmm2ext::TearOff* tearoff() const { return _tearoff; }
+        Gtkmm2ext::TearOff& tearoff() const { return *_tearoff; }
 
   private:
         Gtk::VBox vpacker;
@@ -52,9 +49,6 @@ class MonitorSection : public RouteUI
         Gtk::Table main_table;
         Gtk::VBox upper_packer;
         Gtk::VBox lower_packer;
-        Gtk::VBox table_knob_packer;
-        Gtk::HBox knob_packer;
-        LevelMeter meter;
         Gtkmm2ext::TearOff* _tearoff;
 
         struct ChannelButtonSet { 
@@ -75,6 +69,8 @@ class MonitorSection : public RouteUI
         VolumeController* dim_control;
         Gtk::Adjustment   solo_boost_adjustment;
         VolumeController* solo_boost_control;
+        Gtk::Adjustment   solo_cut_adjustment;
+        VolumeController* solo_cut_control;
 
         void populate_buttons ();
        void set_button_names ();
index 80a175bf307f4f8fefdf26115f52288488c2bbae..1fec3dbcc67a9dd5997a68460ff8142a7f07df24 100644 (file)
@@ -4104,11 +4104,11 @@ Session::solo_control_mode_changed ()
 {
        /* cancel all solo or all listen when solo control mode changes */
 
-       if (Config->get_solo_control_is_listen_control()) {
-               set_solo (routes.reader(), false);
-       } else {
-               set_listen (routes.reader(), false);
-       }
+        if (soloing()) {
+                set_solo (get_routes(), false);
+        } else if (listening()) {
+                set_listen (get_routes(), false);
+        }
 }
 
 void
index db01684e2f2f825ab1aa0ebb067d618aadb74648..9aff73fbb16ee238258628462b48118c42a42e27 100644 (file)
@@ -48,9 +48,10 @@ class TearOff : public Gtk::HBox
        bool torn_off() const;
         void tear_it_off ();
         void put_it_back ();
+        void hide_visible ();
 
-        void set_tornoff_state (const XMLNode&);
-        void add_tornoff_state (XMLNode&) const;
+        void set_state (const XMLNode&);
+        void add_state (XMLNode&) const;
 
   private:
        Gtk::Widget&   contents;
index 7a10b3f614c9e8d505201a4d9f9fc0795d89e795..8cdaac067c613535876a58b06c774fa710c02a14 100644 (file)
@@ -54,7 +54,10 @@ MotionFeedback::MotionFeedback (Glib::RefPtr<Gdk::Pixbuf> pix,
            set_adjustment (adj);
        }
 
-       pack_start (pixwin, false, false);
+        HBox* hpacker = manage (new HBox);
+        hpacker->pack_start (pixwin, true, false);
+        hpacker->show ();
+       pack_start (*hpacker, false, false);
        pixwin.show ();
 
        if (with_numeric_display) {
index 66cc2f192aa045d6153bc1693627c4adafa0cce7..a4503ed863c033570d3a317690752bc8ea4a43f9 100644 (file)
@@ -22,8 +22,6 @@
 
 #include <gtkmm/main.h>
 
-#include "pbd/stacktrace.h"
-
 #include <gtkmm2ext/stateful_button.h>
 
 using namespace Gtk;
@@ -65,6 +63,7 @@ StateButton::set_visual_state (int n)
        }
 
        set_widget_name (name);
+
        visual_state = n;
 }
 
@@ -110,10 +109,7 @@ StatefulToggleButton::set_widget_name (const std::string& name)
 
        if (w) {
                w->set_name (name); 
-       } else {
-               cerr << "Statefull TOggle button - no child\n";
-               PBD::stacktrace (cerr, 20);
-       }
+       } 
 }
 
 void
@@ -124,8 +120,5 @@ StatefulButton::set_widget_name (const std::string& name)
 
        if (w) {
                w->set_name (name); 
-       } else {
-               cerr << "Stateful button - no child\n";
-               PBD::stacktrace (cerr, 20);
-       }
+       } 
 }
index 28fb5ba4ef60f37e987c8d79886a73de654eae12..32f440f37978ca3903b2661fd3aba53909183dfb 100644 (file)
@@ -56,24 +56,25 @@ TearOff::TearOff (Widget& c, bool allow_resize)
        close_event_box.set_events (BUTTON_PRESS_MASK|BUTTON_RELEASE_MASK);
        close_event_box.signal_button_release_event().connect (mem_fun (*this, &TearOff::close_click));
        
-       own_window.add_events (KEY_PRESS_MASK|KEY_RELEASE_MASK|BUTTON_PRESS_MASK|BUTTON_RELEASE_MASK|POINTER_MOTION_MASK|POINTER_MOTION_HINT_MASK);
-       own_window.set_resizable (allow_resize);
-       own_window.set_type_hint (WINDOW_TYPE_HINT_TOOLBAR);
-        own_window.signal_realize().connect (sigc::mem_fun (*this, &TearOff::own_window_realized));
-        own_window.signal_configure_event().connect (sigc::mem_fun (*this, &TearOff::own_window_configured), false);
 
        VBox* box1;
        box1 = manage (new VBox);
        box1->pack_start (close_event_box, false, false, 2);
        
        window_box.pack_end (*box1, false, false, 2);
+
+       own_window.add_events (KEY_PRESS_MASK|KEY_RELEASE_MASK|BUTTON_PRESS_MASK|BUTTON_RELEASE_MASK|POINTER_MOTION_MASK|POINTER_MOTION_HINT_MASK);
+       own_window.set_resizable (allow_resize);
+       own_window.set_type_hint (WINDOW_TYPE_HINT_TOOLBAR);
+
        own_window.add (window_box);
        
        own_window.signal_button_press_event().connect (mem_fun (*this, &TearOff::window_button_press));
        own_window.signal_button_release_event().connect (mem_fun (*this, &TearOff::window_button_release));
        own_window.signal_motion_notify_event().connect (mem_fun (*this, &TearOff::window_motion));
        own_window.signal_delete_event().connect (mem_fun (*this, &TearOff::window_delete_event));
-       own_window.signal_realize().connect (bind (sigc::ptr_fun (Gtkmm2ext::set_decoration), &own_window, WMDecoration (DECOR_BORDER|DECOR_RESIZEH)));
+        own_window.signal_realize().connect (sigc::mem_fun (*this, &TearOff::own_window_realized));
+        own_window.signal_configure_event().connect (sigc::mem_fun (*this, &TearOff::own_window_configured), false);
 
        tearoff_arrow.set_name ("TearOffArrow");
        close_arrow.set_name ("TearOffArrow");
@@ -249,7 +250,7 @@ TearOff::torn_off() const
 }
 
 void
-TearOff::add_tornoff_state (XMLNode& node) const
+TearOff::add_state (XMLNode& node) const
 {
         node.add_property ("tornoff", (own_window.is_visible() ? "yes" : "no"));
 
@@ -268,7 +269,7 @@ TearOff::add_tornoff_state (XMLNode& node) const
 }        
 
 void
-TearOff::set_tornoff_state (const XMLNode& node)
+TearOff::set_state (const XMLNode& node)
 {
         Glib::RefPtr<Gdk::Window> win;
         const XMLProperty* prop;
@@ -278,8 +279,10 @@ TearOff::set_tornoff_state (const XMLNode& node)
         }
 
         if (prop->value() == "yes") {
+                cerr << "Tearing off " << node.name() << endl;
                 tear_it_off ();
         } else {
+                cerr << "Putting back " << node.name() << endl;
                 put_it_back ();
         }
 
@@ -296,13 +299,20 @@ TearOff::set_tornoff_state (const XMLNode& node)
                 sscanf (prop->value().c_str(), "%d", &own_window_ypos);
         }
 
-        own_window.set_default_size (own_window_width, own_window_height);
-        own_window.move (own_window_xpos, own_window_ypos);
+        if (own_window.is_realized()) {
+                own_window.set_default_size (own_window_width, own_window_height);
+                own_window.move (own_window_xpos, own_window_ypos);
+        }
+        /* otherwise do it once the window is realized, see below */
 }        
 
 void
 TearOff::own_window_realized ()
 {
+        cerr << "tearoff realized\n";
+
+       own_window.get_window()->set_decorations (WMDecoration (DECOR_BORDER|DECOR_RESIZEH));
+
         if (own_window_width > 0) {
                 own_window.set_default_size (own_window_width, own_window_height);
                 own_window.move (own_window_xpos, own_window_ypos);
@@ -323,3 +333,15 @@ TearOff::own_window_configured (GdkEventConfigure*)
 
         return false;
 }
+
+void
+TearOff::hide_visible ()
+{
+        if (torn_off()) {
+                own_window.hide ();
+        }
+
+        hide ();
+}
+
+