2 Copyright (C) 2000 Paul Davis
4 This program is free software; you can redistribute it and/or modify
5 it under the terms of the GNU General Public License as published by
6 the Free Software Foundation; either version 2 of the License, or
7 (at your option) any later version.
9 This program is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 GNU General Public License for more details.
14 You should have received a copy of the GNU General Public License
15 along with this program; if not, write to the Free Software
16 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
20 /* This file contains any ARDOUR_UI methods that require knowledge of
21 the various dialog boxes, and exists so that no compilation dependency
22 exists between the main ARDOUR_UI modules and their respective classes.
23 This is to cut down on the compile times. It also helps with my sanity.
28 #include "pbd/convert.h"
30 #include "ardour/audioengine.h"
31 #include "ardour/automation_watch.h"
32 #include "ardour/control_protocol_manager.h"
33 #include "ardour/profile.h"
34 #include "ardour/session.h"
36 #include "control_protocol/control_protocol.h"
38 #include "gtkmm2ext/keyboard.h"
39 #include "gtkmm2ext/utils.h"
42 #include "add_route_dialog.h"
43 #include "add_video_dialog.h"
44 #include "ardour_ui.h"
45 #include "big_clock_window.h"
46 #include "bundle_manager.h"
47 #include "global_port_matrix.h"
48 #include "gui_object.h"
49 #include "gui_thread.h"
50 #include "keyeditor.h"
51 #include "location_ui.h"
52 #include "luawindow.h"
53 #include "main_clock.h"
54 #include "meterbridge.h"
55 #include "meter_patterns.h"
56 #include "midi_tracer.h"
58 #include "public_editor.h"
59 #include "rc_option_editor.h"
60 #include "route_params_ui.h"
61 #include "shuttle_control.h"
62 #include "session_option_editor.h"
63 #include "speaker_dialog.h"
66 #include "theme_manager.h"
67 #include "time_info_box.h"
72 using namespace ARDOUR;
76 using namespace Gtkmm2ext;
79 ARDOUR_UI::set_session (Session *s)
81 SessionHandlePtr::set_session (s);
84 WM::Manager::instance().set_session (s);
85 /* Session option editor cannot exist across change-of-session */
86 session_option_editor.drop_window ();
87 /* Ditto for AddVideoDialog */
88 add_video_dialog.drop_window ();
92 const XMLNode* node = _session->extra_xml (X_("UI"));
95 const XMLNodeList& children = node->children();
96 for (XMLNodeList::const_iterator i = children.begin(); i != children.end(); ++i) {
97 if ((*i)->name() == GUIObjectState::xml_node_name) {
98 gui_object_state->load (**i);
104 WM::Manager::instance().set_session (s);
106 AutomationWatch::instance().set_session (s);
109 shuttle_box->set_session (s);
112 primary_clock->set_session (s);
113 secondary_clock->set_session (s);
114 big_clock->set_session (s);
115 time_info_box->set_session (s);
116 video_timeline->set_session (s);
118 /* sensitize menu bar options that are now valid */
120 ActionManager::set_sensitive (ActionManager::session_sensitive_actions, true);
121 ActionManager::set_sensitive (ActionManager::write_sensitive_actions, _session->writable());
123 if (_session->locations()->num_range_markers()) {
124 ActionManager::set_sensitive (ActionManager::range_sensitive_actions, true);
126 ActionManager::set_sensitive (ActionManager::range_sensitive_actions, false);
129 if (!_session->monitor_out()) {
130 Glib::RefPtr<Action> act = ActionManager::get_action (X_("options"), X_("SoloViaBus"));
132 act->set_sensitive (false);
136 /* allow wastebasket flush again */
138 Glib::RefPtr<Action> act = ActionManager::get_action (X_("Main"), X_("FlushWastebasket"));
140 act->set_sensitive (true);
143 /* there are never any selections on startup */
145 ActionManager::set_sensitive (ActionManager::time_selection_sensitive_actions, false);
146 ActionManager::set_sensitive (ActionManager::track_selection_sensitive_actions, false);
147 ActionManager::set_sensitive (ActionManager::line_selection_sensitive_actions, false);
148 ActionManager::set_sensitive (ActionManager::point_selection_sensitive_actions, false);
149 ActionManager::set_sensitive (ActionManager::playlist_selection_sensitive_actions, false);
151 rec_button.set_sensitive (true);
153 solo_alert_button.set_active (_session->soloing());
155 setup_session_options ();
157 blink_connection = Timers::blink_connect (sigc::mem_fun(*this, &ARDOUR_UI::blink_handler));
159 _session->SaveSessionRequested.connect (_session_connections, MISSING_INVALIDATOR, boost::bind (&ARDOUR_UI::save_session_at_its_request, this, _1), gui_context());
160 _session->RecordStateChanged.connect (_session_connections, MISSING_INVALIDATOR, boost::bind (&ARDOUR_UI::record_state_changed, this), gui_context());
161 _session->StepEditStatusChange.connect (_session_connections, MISSING_INVALIDATOR, boost::bind (&ARDOUR_UI::step_edit_status_change, this, _1), gui_context());
162 _session->TransportStateChange.connect (_session_connections, MISSING_INVALIDATOR, boost::bind (&ARDOUR_UI::map_transport_state, this), gui_context());
163 _session->DirtyChanged.connect (_session_connections, MISSING_INVALIDATOR, boost::bind (&ARDOUR_UI::session_dirty_changed, this), gui_context());
165 _session->Xrun.connect (_session_connections, MISSING_INVALIDATOR, boost::bind (&ARDOUR_UI::xrun_handler, this, _1), gui_context());
166 _session->SoloActive.connect (_session_connections, MISSING_INVALIDATOR, boost::bind (&ARDOUR_UI::soloing_changed, this, _1), gui_context());
167 _session->AuditionActive.connect (_session_connections, MISSING_INVALIDATOR, boost::bind (&ARDOUR_UI::auditioning_changed, this, _1), gui_context());
168 _session->locations()->added.connect (_session_connections, MISSING_INVALIDATOR, boost::bind (&ARDOUR_UI::handle_locations_change, this, _1), gui_context());
169 _session->locations()->removed.connect (_session_connections, MISSING_INVALIDATOR, boost::bind (&ARDOUR_UI::handle_locations_change, this, _1), gui_context());
170 _session->config.ParameterChanged.connect (_session_connections, MISSING_INVALIDATOR, boost::bind (&ARDOUR_UI::session_parameter_changed, this, _1), gui_context ());
172 /* Clocks are on by default after we are connected to a session, so show that here.
175 connect_dependents_to_session (s);
177 /* listen to clock mode changes. don't do this earlier because otherwise as the clocks
178 restore their modes or are explicitly set, we will cause the "new" mode to be saved
179 back to the session XML ("Extra") state.
182 AudioClock::ModeChanged.connect (sigc::mem_fun (*this, &ARDOUR_UI::store_clock_modes));
184 Glib::signal_idle().connect (sigc::mem_fun (*this, &ARDOUR_UI::first_idle));
188 map_transport_state ();
190 second_connection = Timers::second_connect (sigc::mem_fun(*this, &ARDOUR_UI::every_second));
191 point_one_second_connection = Timers::rapid_connect (sigc::mem_fun(*this, &ARDOUR_UI::every_point_one_seconds));
192 point_zero_something_second_connection = Timers::super_rapid_connect (sigc::mem_fun(*this, &ARDOUR_UI::every_point_zero_something_seconds));
193 set_fps_timeout_connection();
197 if (meter_box.get_parent()) {
198 transport_hbox.remove (meter_box);
199 transport_hbox.remove (editor_meter_peak_display);
203 meter_box.remove(*editor_meter);
206 editor_meter_peak_display.hide();
209 if (meter_box.get_parent()) {
210 transport_hbox.remove (meter_box);
211 transport_hbox.remove (editor_meter_peak_display);
215 _session->master_out() &&
216 _session->master_out()->n_outputs().n(DataType::AUDIO) > 0) {
218 if (!ARDOUR::Profile->get_trx()) {
219 editor_meter = new LevelMeterHBox(_session);
220 editor_meter->set_meter (_session->master_out()->shared_peak_meter().get());
221 editor_meter->clear_meters();
222 editor_meter->set_type (_session->master_out()->meter_type());
223 editor_meter->setup_meters (30, 12, 6);
224 editor_meter->show();
225 meter_box.pack_start(*editor_meter);
228 ArdourMeter::ResetAllPeakDisplays.connect (sigc::mem_fun(*this, &ARDOUR_UI::reset_peak_display));
229 ArdourMeter::ResetRoutePeakDisplays.connect (sigc::mem_fun(*this, &ARDOUR_UI::reset_route_peak_display));
230 ArdourMeter::ResetGroupPeakDisplays.connect (sigc::mem_fun(*this, &ARDOUR_UI::reset_group_peak_display));
232 editor_meter_peak_display.set_name ("meterbridge peakindicator");
233 editor_meter_peak_display.unset_flags (Gtk::CAN_FOCUS);
234 editor_meter_peak_display.set_size_request (std::max(9.f, rintf(8.f * UIConfiguration::instance().get_ui_scale())), -1);
235 editor_meter_peak_display.set_corner_radius (3.0);
237 editor_meter_max_peak = -INFINITY;
238 editor_meter_peak_display.signal_button_release_event().connect (sigc::mem_fun(*this, &ARDOUR_UI::editor_meter_peak_button_release), false);
240 if (UIConfiguration::instance().get_show_editor_meter() && !ARDOUR::Profile->get_trx()) {
241 transport_hbox.pack_start (meter_box, false, false);
242 transport_hbox.pack_start (editor_meter_peak_display, false, false);
244 editor_meter_peak_display.show();
252 ARDOUR_UI::unload_session (bool hide_stuff)
255 ARDOUR_UI::instance()->video_timeline->sync_session_state();
258 if (_session && _session->dirty()) {
259 std::vector<std::string> actions;
260 actions.push_back (_("Don't close"));
261 actions.push_back (_("Just close"));
262 actions.push_back (_("Save and close"));
263 switch (ask_about_saving_session (actions)) {
269 _session->save_state ("");
275 // tear down session specific CPI (owned by rc_config_editor which can remain)
276 ControlProtocolManager& m = ControlProtocolManager::instance ();
277 for (std::list<ControlProtocolInfo*>::iterator i = m.control_protocol_info.begin(); i != m.control_protocol_info.end(); ++i) {
278 if (*i && (*i)->protocol && (*i)->protocol->has_editor ()) {
279 (*i)->protocol->tear_down_gui ();
287 meterbridge->hide ();
288 audio_port_matrix->hide();
289 midi_port_matrix->hide();
290 route_params->hide();
293 second_connection.disconnect ();
294 point_one_second_connection.disconnect ();
295 point_zero_something_second_connection.disconnect();
296 fps_connection.disconnect();
299 meter_box.remove(*editor_meter);
302 editor_meter_peak_display.hide();
305 ActionManager::set_sensitive (ActionManager::session_sensitive_actions, false);
307 rec_button.set_sensitive (false);
309 WM::Manager::instance().set_session ((ARDOUR::Session*) 0);
311 if (ARDOUR_UI::instance()->video_timeline) {
312 ARDOUR_UI::instance()->video_timeline->close_session();
317 /* drop everything attached to the blink signal */
319 blink_connection.disconnect ();
324 session_loaded = false;
326 update_buffer_load ();
333 ARDOUR_UI::toggle_editor_and_mixer ()
335 if (editor->tabbed() && mixer->tabbed()) {
336 if (_tabs.get_current_page() == _tabs.page_num (editor->contents())) {
337 _tabs.set_current_page (_tabs.page_num (mixer->contents()));
338 } else if (_tabs.get_current_page() == _tabs.page_num (mixer->contents())) {
339 _tabs.set_current_page (_tabs.page_num (editor->contents()));
346 if (editor->tabbed() && !mixer->tabbed()) {
347 if (!editor->fully_visible()) {
348 if (_tabs.get_current_page() == _tabs.page_num (editor->contents())) {
349 mixer->make_visible ();
352 _main_window.present ();
357 if (mixer->tabbed () && !editor->tabbed()) {
358 if (!editor->fully_visible()) {
359 if (_tabs.get_current_page() == _tabs.page_num (mixer->contents())) {
360 editor->make_visible ();
363 _main_window.present ();
368 if (editor->fully_visible()) {
369 mixer->make_visible ();
371 editor->make_visible ();
376 ARDOUR_UI::key_change_tabbable_visibility (Tabbable* t)
383 _tabs.set_current_page (_tabs.page_num (t->contents()));
384 } else if (!t->fully_visible()) {
387 _main_window.present ();
392 ARDOUR_UI::button_change_tabbable_visibility (Tabbable* t)
394 /* For many/most users, clicking a button in the main window will make it
395 the main/front/key window, which will change any stacking relationship they
396 were trying to modify by clicking on the button in the first
397 place. This button-aware method knows that click on
398 a button designed to show/hide a Tabbable that has its own window
399 will have made that window be obscured (as the main window comes to
400 the front). We therefore *hide* the Tabbable's window if it is even
401 partially visible, believing that this is likely because the
402 Tabbable window used to be front, the user clicked to change that,
403 and before we even get here, the main window has become front.
411 _tabs.set_current_page (_tabs.page_num (t->contents()));
412 } else if (t->visible()) {
420 ARDOUR_UI::show_tabbable (Tabbable* t)
430 ARDOUR_UI::hide_tabbable (Tabbable* t)
435 t->make_invisible ();
439 ARDOUR_UI::attach_tabbable (Tabbable* t)
449 ARDOUR_UI::detach_tabbable (Tabbable* t)
458 ARDOUR_UI::tabs_page_added (Widget*,guint)
460 if (_tabs.get_n_pages() > 1) {
462 std::vector<TargetEntry> drag_target_entries;
463 drag_target_entries.push_back (TargetEntry ("tabbable"));
465 editor_visibility_button.drag_source_set (drag_target_entries);
466 mixer_visibility_button.drag_source_set (drag_target_entries);
467 prefs_visibility_button.drag_source_set (drag_target_entries);
469 editor_visibility_button.drag_source_set_icon (Gtkmm2ext::pixbuf_from_string (editor->name(),
470 Pango::FontDescription ("Sans 24"),
472 Gdk::Color ("red")));
473 mixer_visibility_button.drag_source_set_icon (Gtkmm2ext::pixbuf_from_string (mixer->name(),
474 Pango::FontDescription ("Sans 24"),
476 Gdk::Color ("red")));
477 prefs_visibility_button.drag_source_set_icon (Gtkmm2ext::pixbuf_from_string (rc_option_editor->name(),
478 Pango::FontDescription ("Sans 24"),
480 Gdk::Color ("red")));
485 ARDOUR_UI::tabs_page_removed (Widget*, guint)
487 if (_tabs.get_n_pages() < 2) {
488 editor_visibility_button.drag_source_unset ();
489 mixer_visibility_button.drag_source_unset ();
490 prefs_visibility_button.drag_source_unset ();
495 ARDOUR_UI::tabs_switch (GtkNotebookPage*, guint page)
497 if (page == (guint) _tabs.page_num (editor->contents())) {
498 editor_visibility_button.set_active_state (Gtkmm2ext::ImplicitActive);
499 if (mixer && (mixer->tabbed() || mixer->tabbed_by_default())) {
500 mixer_visibility_button.set_active_state (Gtkmm2ext::Off);
502 if (rc_option_editor && (rc_option_editor->tabbed() || rc_option_editor->tabbed_by_default())) {
503 prefs_visibility_button.set_active_state (Gtkmm2ext::Off);
505 } else if (page == (guint) _tabs.page_num (mixer->contents())) {
506 if (editor && (editor->tabbed() || editor->tabbed_by_default())) {
507 editor_visibility_button.set_active_state (Gtkmm2ext::Off);
509 mixer_visibility_button.set_active_state (Gtkmm2ext::ImplicitActive);
511 if (rc_option_editor && (rc_option_editor->tabbed() || rc_option_editor->tabbed_by_default())) {
512 prefs_visibility_button.set_active_state (Gtkmm2ext::Off);
515 if (editor && (editor->tabbed() || editor->tabbed_by_default())) {
516 editor_visibility_button.set_active_state (Gtkmm2ext::Off);
518 if (mixer && (mixer->tabbed() || mixer->tabbed_by_default())) {
519 mixer_visibility_button.set_active_state (Gtkmm2ext::Off);
521 prefs_visibility_button.set_active_state (Gtkmm2ext::ImplicitActive);
527 ARDOUR_UI::tabbable_state_change (Tabbable& t)
529 std::vector<std::string> insensitive_action_names;
530 std::vector<std::string> sensitive_action_names;
531 std::vector<std::string> active_action_names;
532 std::vector<std::string> inactive_action_names;
533 Glib::RefPtr<Action> action;
534 std::string downcased_name = downcase (t.name());
544 insensitive_action_names.push_back (string_compose ("attach-%1", downcased_name));
545 sensitive_action_names.push_back (string_compose ("show-%1", downcased_name));
546 sensitive_action_names.push_back (string_compose ("detach-%1", downcased_name));
547 sensitive_action_names.push_back (string_compose ("hide-%1", downcased_name));
551 } else if (t.tabbed_by_default ()) {
553 insensitive_action_names.push_back (string_compose ("attach-%1", downcased_name));
554 insensitive_action_names.push_back (string_compose ("hide-%1", downcased_name));
555 sensitive_action_names.push_back (string_compose ("show-%1", downcased_name));
556 sensitive_action_names.push_back (string_compose ("detach-%1", downcased_name));
560 } else if (t.window_visible()) {
562 insensitive_action_names.push_back (string_compose ("detach-%1", downcased_name));
563 sensitive_action_names.push_back (string_compose ("show-%1", downcased_name));
564 sensitive_action_names.push_back (string_compose ("attach-%1", downcased_name));
565 sensitive_action_names.push_back (string_compose ("hide-%1", downcased_name));
567 active_action_names.push_back (string_compose ("show-%1", downcased_name));
568 inactive_action_names.push_back (string_compose ("hide-%1", downcased_name));
574 /* not currently visible. allow user to retab it or just make
578 insensitive_action_names.push_back (string_compose ("detach-%1", downcased_name));
579 insensitive_action_names.push_back (string_compose ("hide-%1", downcased_name));
580 sensitive_action_names.push_back (string_compose ("show-%1", downcased_name));
581 sensitive_action_names.push_back (string_compose ("attach-%1", downcased_name));
583 active_action_names.push_back (string_compose ("hide-%1", downcased_name));
584 inactive_action_names.push_back (string_compose ("show-%1", downcased_name));
589 for (std::vector<std::string>::iterator s = insensitive_action_names.begin(); s != insensitive_action_names.end(); ++s) {
590 action = ActionManager::get_action (X_("Common"), (*s).c_str());
592 action->set_sensitive (false);
596 for (std::vector<std::string>::iterator s = sensitive_action_names.begin(); s != sensitive_action_names.end(); ++s) {
597 action = ActionManager::get_action (X_("Common"), (*s).c_str());
599 action->set_sensitive (true);
603 ArdourButton* vis_button = 0;
604 std::vector<ArdourButton*> other_vis_buttons;
607 vis_button = &editor_visibility_button;
608 other_vis_buttons.push_back (&mixer_visibility_button);
609 other_vis_buttons.push_back (&prefs_visibility_button);
610 } else if (&t == mixer) {
611 vis_button = &mixer_visibility_button;
612 other_vis_buttons.push_back (&editor_visibility_button);
613 other_vis_buttons.push_back (&prefs_visibility_button);
615 vis_button = &prefs_visibility_button;
616 other_vis_buttons.push_back (&editor_visibility_button);
617 other_vis_buttons.push_back (&mixer_visibility_button);
626 vis_button->set_active_state (Gtkmm2ext::ImplicitActive);
629 vis_button->set_active_state (Gtkmm2ext::ExplicitActive);
632 vis_button->set_active_state (Gtkmm2ext::Off);
636 for (std::vector<ArdourButton*>::iterator b = other_vis_buttons.begin(); b != other_vis_buttons.end(); ++b) {
637 (*b)->set_active_state (Gtkmm2ext::Off);
642 ARDOUR_UI::toggle_meterbridge ()
644 assert (editor && mixer && meterbridge);
647 bool obscuring = false;
649 if (meterbridge->not_visible ()) {
651 } else if ((editor->window_visible() && ARDOUR_UI_UTILS::windows_overlap (editor->own_window(), meterbridge)) ||
652 (mixer->window_visible () && ARDOUR_UI_UTILS::windows_overlap (mixer->own_window(), meterbridge))) {
656 if (obscuring && ((editor->own_window() && editor->own_window()->property_has_toplevel_focus()) ||
657 (mixer->own_window() && mixer->own_window()->property_has_toplevel_focus()))) {
662 meterbridge->show_window ();
663 meterbridge->present ();
664 meterbridge->raise ();
666 meterbridge->hide_window (NULL);
671 ARDOUR_UI::toggle_luawindow ()
673 assert (editor && luawindow);
676 bool obscuring = false;
678 if (luawindow->not_visible ()) {
681 // TODO check overlap
684 luawindow->show_window ();
685 luawindow->present ();
688 luawindow->hide_window (NULL);
694 ARDOUR_UI::new_midi_tracer_window ()
696 RefPtr<Action> act = ActionManager::get_action (X_("Common"), X_("NewMIDITracer"));
701 std::list<MidiTracer*>::iterator i = _midi_tracer_windows.begin ();
702 while (i != _midi_tracer_windows.end() && (*i)->get_visible() == true) {
706 if (i == _midi_tracer_windows.end()) {
707 /* all our MIDITracer windows are visible; make a new one */
708 MidiTracer* t = new MidiTracer ();
710 _midi_tracer_windows.push_back (t);
712 /* re-use the hidden one */
718 ARDOUR_UI::create_key_editor ()
720 KeyEditor* kedit = new KeyEditor;
722 if (global_bindings) {
723 kedit->add_tab (_("Global"), *global_bindings);
726 if (editor->bindings) {
727 kedit->add_tab (_("Editing"), *editor->bindings);
730 if (mixer->bindings) {
731 kedit->add_tab (_("Mixing"), *mixer->bindings);
738 ARDOUR_UI::create_bundle_manager ()
740 return new BundleManager (_session);
744 ARDOUR_UI::create_add_video_dialog ()
746 return new AddVideoDialog (_session);
750 ARDOUR_UI::create_session_option_editor ()
752 return new SessionOptionEditor (_session);
756 ARDOUR_UI::create_big_clock_window ()
758 return new BigClockWindow (*big_clock);
762 ARDOUR_UI::handle_locations_change (Location *)
765 if (_session->locations()->num_range_markers()) {
766 ActionManager::set_sensitive (ActionManager::range_sensitive_actions, true);
768 ActionManager::set_sensitive (ActionManager::range_sensitive_actions, false);
774 ARDOUR_UI::tabbed_window_state_event_handler (GdkEventWindowState* ev, void* object)
776 if (object == editor) {
778 if ((ev->changed_mask & GDK_WINDOW_STATE_FULLSCREEN) &&
779 (ev->new_window_state & GDK_WINDOW_STATE_FULLSCREEN)) {
780 if (big_clock_window) {
781 big_clock_window->set_transient_for (*editor->own_window());
785 } else if (object == mixer) {
787 if ((ev->changed_mask & GDK_WINDOW_STATE_FULLSCREEN) &&
788 (ev->new_window_state & GDK_WINDOW_STATE_FULLSCREEN)) {
789 if (big_clock_window) {
790 big_clock_window->set_transient_for (*mixer->own_window());
799 ARDOUR_UI::editor_meter_peak_button_release (GdkEventButton* ev)
801 if (ev->button == 1 && Gtkmm2ext::Keyboard::modifier_state_equals (ev->state, Gtkmm2ext::Keyboard::PrimaryModifier|Gtkmm2ext::Keyboard::TertiaryModifier)) {
802 ArdourMeter::ResetAllPeakDisplays ();
803 } else if (ev->button == 1 && Gtkmm2ext::Keyboard::modifier_state_equals (ev->state, Gtkmm2ext::Keyboard::PrimaryModifier)) {
804 if (_session->master_out()) {
805 ArdourMeter::ResetGroupPeakDisplays (_session->master_out()->route_group());
807 } else if (_session->master_out()) {
808 ArdourMeter::ResetRoutePeakDisplays (_session->master_out().get());
814 ARDOUR_UI::toggle_mixer_space()
816 Glib::RefPtr<Action> act = ActionManager::get_action ("Common", "ToggleMaximalMixer");
819 Glib::RefPtr<ToggleAction> tact = Glib::RefPtr<ToggleAction>::cast_dynamic(act);
820 if (tact->get_active()) {
821 mixer->maximise_mixer_space ();
823 mixer->restore_mixer_space ();
829 ARDOUR_UI::toggle_mixer_list()
831 Glib::RefPtr<Action> act = ActionManager::get_action ("Common", "ToggleMixerList");
834 Glib::RefPtr<ToggleAction> tact = Glib::RefPtr<ToggleAction>::cast_dynamic(act);
835 mixer->show_mixer_list (tact->get_active());
840 ARDOUR_UI::toggle_monitor_section_visibility ()
842 Glib::RefPtr<Action> act = ActionManager::get_action ("Common", "ToggleMonitorSection");
845 Glib::RefPtr<ToggleAction> tact = Glib::RefPtr<ToggleAction>::cast_dynamic(act);
846 mixer->show_monitor_section (tact->get_active());