From 21794dc738fce7caf734cf25ec37dfef72cc992a Mon Sep 17 00:00:00 2001 From: paul Date: Fri, 19 Mar 2010 20:53:22 +0000 Subject: [PATCH] lots of tricks & tweaks related to the monitor section and All That It Uses git-svn-id: http://subversion.ardour.org/svn/ardour2/ardour2/branches/3.0@6777 d708f5d6-7413-0410-9779-e7cbd77b26cf --- gtk2_ardour/ardour3_ui_dark.rc.in | 4 +- gtk2_ardour/ardour_ui.h | 5 +- gtk2_ardour/ardour_ui2.cc | 55 +++++++--- gtk2_ardour/ardour_ui_ed.cc | 6 +- gtk2_ardour/icons/bigknob.png | Bin 69192 -> 69192 bytes gtk2_ardour/mixer_strip.cc | 8 +- gtk2_ardour/mixer_ui.cc | 28 ++--- gtk2_ardour/monitor_section.cc | 204 +++++++++++++++++++------------------ gtk2_ardour/monitor_section.h | 10 +- libs/ardour/session.cc | 10 +- libs/gtkmm2ext/gtkmm2ext/tearoff.h | 5 +- libs/gtkmm2ext/motionfeedback.cc | 5 +- libs/gtkmm2ext/stateful_button.cc | 13 +-- libs/gtkmm2ext/tearoff.cc | 42 ++++++-- 14 files changed, 220 insertions(+), 175 deletions(-) diff --git a/gtk2_ardour/ardour3_ui_dark.rc.in b/gtk2_ardour/ardour3_ui_dark.rc.in index ff7ecc9a3..2ec1f56ee 100644 --- a/gtk2_ardour/ardour3_ui_dark.rc.in +++ b/gtk2_ardour/ardour3_ui_dark.rc.in @@ -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" diff --git a/gtk2_ardour/ardour_ui.h b/gtk2_ardour/ardour_ui.h index e131cf543..a851e0398 100644 --- a/gtk2_ardour/ardour_ui.h +++ b/gtk2_ardour/ardour_ui.h @@ -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 (); diff --git a/gtk2_ardour/ardour_ui2.cc b/gtk2_ardour/ardour_ui2.cc index 52ab0716d..6162ef22d 100644 --- a/gtk2_ardour/ardour_ui2.cc +++ b/gtk2_ardour/ardour_ui2.cc @@ -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_("/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 { diff --git a/gtk2_ardour/ardour_ui_ed.cc b/gtk2_ardour/ardour_ui_ed.cc index 46cd5d952..f3bc96c6c 100644 --- a/gtk2_ardour/ardour_ui_ed.cc +++ b/gtk2_ardour/ardour_ui_ed.cc @@ -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); } diff --git a/gtk2_ardour/icons/bigknob.png b/gtk2_ardour/icons/bigknob.png index a5a3f5df5625ad8b26971227487f83bacd84f2c8..9e26273935de6298db5ae275c8660bd7c3a32b31 100644 GIT binary patch delta 38 ucwRd(hvmc^mWC~i-*`n04MGeotqhE;jLdZnOsxzIcE5R~Go71{(G~y%8w^SS delta 26 icwRd(hvmc^mWC~i-*~61^DzptsOtx@P3Pugv;_cxuLp+! diff --git a/gtk2_ardour/mixer_strip.cc b/gtk2_ardour/mixer_strip.cc index 57faf1c3b..6b9287356 100644 --- a/gtk2_ardour/mixer_strip.cc +++ b/gtk2_ardour/mixer_strip.cc @@ -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 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) { diff --git a/gtk2_ardour/mixer_ui.cc b/gtk2_ardour/mixer_ui.cc index badd96154..6a273434e 100644 --- a/gtk2_ardour/mixer_ui.cc +++ b/gtk2_ardour/mixer_ui.cc @@ -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::iterator i = strips.begin(); i != strips.end(); ++i) { (*i)->fast_update (); } - - if (_monitor_section) { - _monitor_section->fast_update (); - } } } diff --git a/gtk2_ardour/monitor_section.cc b/gtk2_ardour/monitor_section.cc index 480786eb2..5f779c642 100644 --- a/gtk2_ardour/monitor_section.cc +++ b/gtk2_ardour/monitor_section.cc @@ -30,11 +30,31 @@ Glib::RefPtr MonitorSection::monitor_actions; Glib::RefPtr MonitorSection::big_knob_pixbuf; Glib::RefPtr 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 () { @@ -641,17 +651,11 @@ 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; diff --git a/gtk2_ardour/monitor_section.h b/gtk2_ardour/monitor_section.h index 405b8eba8..8af84988f 100644 --- a/gtk2_ardour/monitor_section.h +++ b/gtk2_ardour/monitor_section.h @@ -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 (); diff --git a/libs/ardour/session.cc b/libs/ardour/session.cc index 80a175bf3..1fec3dbcc 100644 --- a/libs/ardour/session.cc +++ b/libs/ardour/session.cc @@ -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 diff --git a/libs/gtkmm2ext/gtkmm2ext/tearoff.h b/libs/gtkmm2ext/gtkmm2ext/tearoff.h index db01684e2..9aff73fbb 100644 --- a/libs/gtkmm2ext/gtkmm2ext/tearoff.h +++ b/libs/gtkmm2ext/gtkmm2ext/tearoff.h @@ -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; diff --git a/libs/gtkmm2ext/motionfeedback.cc b/libs/gtkmm2ext/motionfeedback.cc index 7a10b3f61..8cdaac067 100644 --- a/libs/gtkmm2ext/motionfeedback.cc +++ b/libs/gtkmm2ext/motionfeedback.cc @@ -54,7 +54,10 @@ MotionFeedback::MotionFeedback (Glib::RefPtr 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) { diff --git a/libs/gtkmm2ext/stateful_button.cc b/libs/gtkmm2ext/stateful_button.cc index 66cc2f192..a4503ed86 100644 --- a/libs/gtkmm2ext/stateful_button.cc +++ b/libs/gtkmm2ext/stateful_button.cc @@ -22,8 +22,6 @@ #include -#include "pbd/stacktrace.h" - #include 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); - } + } } diff --git a/libs/gtkmm2ext/tearoff.cc b/libs/gtkmm2ext/tearoff.cc index 28fb5ba4e..32f440f37 100644 --- a/libs/gtkmm2ext/tearoff.cc +++ b/libs/gtkmm2ext/tearoff.cc @@ -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 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 (); +} + + -- 2.11.4.GIT