X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=gtk2_ardour%2Fardour_ui_ed.cc;h=f038897cf7112d636e27437d5b6f2619cb5013c3;hb=b15e1cba3b11f73f3155c5dbd8a162c2512f5641;hp=80950e2d32597c2d01632f38c79495630685a6b4;hpb=ea23298f10e9587eba483cb54a6f7d75ca68126a;p=ardour.git diff --git a/gtk2_ardour/ardour_ui_ed.cc b/gtk2_ardour/ardour_ui_ed.cc index 80950e2d32..f038897cf7 100644 --- a/gtk2_ardour/ardour_ui_ed.cc +++ b/gtk2_ardour/ardour_ui_ed.cc @@ -17,6 +17,10 @@ */ +#ifdef WAF_BUILD +#include "gtk2ardour-config.h" +#endif + /* This file contains any ARDOUR_UI methods that require knowledge of the editor, and exists so that no compilation dependency exists between the main ARDOUR_UI modules and the PublicEditor class. This @@ -47,10 +51,10 @@ #include "mixer_ui.h" #include "startup.h" #include "utils.h" +#include "window_proxy.h" +#include "global_port_matrix.h" -#ifdef GTKOSX -#include -#endif +#include #include "ardour/session.h" #include "ardour/profile.h" @@ -70,7 +74,6 @@ using namespace Glib; int ARDOUR_UI::create_editor () - { try { editor = new Editor (); @@ -158,6 +161,9 @@ ARDOUR_UI::install_actions () act = ActionManager::register_action (main_actions, X_("ExportAudio"), _("Export To Audio File(s)..."), sigc::mem_fun (*editor, &PublicEditor::export_audio)); ActionManager::session_sensitive_actions.push_back (act); + + act = ActionManager::register_action (main_actions, X_("StemExport"), _("Stem export..."), sigc::mem_fun (*editor, &PublicEditor::stem_export)); + ActionManager::session_sensitive_actions.push_back (act); act = ActionManager::register_action (main_actions, X_("Export"), _("Export")); ActionManager::session_sensitive_actions.push_back (act); @@ -184,23 +190,23 @@ ARDOUR_UI::install_actions () RadioAction::Group jack_latency_group; - act = ActionManager::register_radio_action (jack_actions, jack_latency_group, X_("JACKLatency32"), X_("32"), sigc::bind (sigc::mem_fun(*this, &ARDOUR_UI::set_jack_buffer_size), (nframes_t) 32)); + act = ActionManager::register_radio_action (jack_actions, jack_latency_group, X_("JACKLatency32"), X_("32"), sigc::bind (sigc::mem_fun(*this, &ARDOUR_UI::set_jack_buffer_size), (pframes_t) 32)); ActionManager::jack_sensitive_actions.push_back (act); - act = ActionManager::register_radio_action (jack_actions, jack_latency_group, X_("JACKLatency64"), X_("64"), sigc::bind (sigc::mem_fun(*this, &ARDOUR_UI::set_jack_buffer_size), (nframes_t) 64)); + act = ActionManager::register_radio_action (jack_actions, jack_latency_group, X_("JACKLatency64"), X_("64"), sigc::bind (sigc::mem_fun(*this, &ARDOUR_UI::set_jack_buffer_size), (pframes_t) 64)); ActionManager::jack_sensitive_actions.push_back (act); - act = ActionManager::register_radio_action (jack_actions, jack_latency_group, X_("JACKLatency128"), X_("128"), sigc::bind (sigc::mem_fun(*this, &ARDOUR_UI::set_jack_buffer_size), (nframes_t) 128)); + act = ActionManager::register_radio_action (jack_actions, jack_latency_group, X_("JACKLatency128"), X_("128"), sigc::bind (sigc::mem_fun(*this, &ARDOUR_UI::set_jack_buffer_size), (pframes_t) 128)); ActionManager::jack_sensitive_actions.push_back (act); - act = ActionManager::register_radio_action (jack_actions, jack_latency_group, X_("JACKLatency256"), X_("256"), sigc::bind (sigc::mem_fun(*this, &ARDOUR_UI::set_jack_buffer_size), (nframes_t) 256)); + act = ActionManager::register_radio_action (jack_actions, jack_latency_group, X_("JACKLatency256"), X_("256"), sigc::bind (sigc::mem_fun(*this, &ARDOUR_UI::set_jack_buffer_size), (pframes_t) 256)); ActionManager::jack_sensitive_actions.push_back (act); - act = ActionManager::register_radio_action (jack_actions, jack_latency_group, X_("JACKLatency512"), X_("512"), sigc::bind (sigc::mem_fun(*this, &ARDOUR_UI::set_jack_buffer_size), (nframes_t) 512)); + act = ActionManager::register_radio_action (jack_actions, jack_latency_group, X_("JACKLatency512"), X_("512"), sigc::bind (sigc::mem_fun(*this, &ARDOUR_UI::set_jack_buffer_size), (pframes_t) 512)); ActionManager::jack_sensitive_actions.push_back (act); - act = ActionManager::register_radio_action (jack_actions, jack_latency_group, X_("JACKLatency1024"), X_("1024"), sigc::bind (sigc::mem_fun(*this, &ARDOUR_UI::set_jack_buffer_size), (nframes_t) 1024)); + act = ActionManager::register_radio_action (jack_actions, jack_latency_group, X_("JACKLatency1024"), X_("1024"), sigc::bind (sigc::mem_fun(*this, &ARDOUR_UI::set_jack_buffer_size), (pframes_t) 1024)); ActionManager::jack_sensitive_actions.push_back (act); - act = ActionManager::register_radio_action (jack_actions, jack_latency_group, X_("JACKLatency2048"), X_("2048"), sigc::bind (sigc::mem_fun(*this, &ARDOUR_UI::set_jack_buffer_size), (nframes_t) 2048)); + act = ActionManager::register_radio_action (jack_actions, jack_latency_group, X_("JACKLatency2048"), X_("2048"), sigc::bind (sigc::mem_fun(*this, &ARDOUR_UI::set_jack_buffer_size), (pframes_t) 2048)); ActionManager::jack_sensitive_actions.push_back (act); - act = ActionManager::register_radio_action (jack_actions, jack_latency_group, X_("JACKLatency4096"), X_("4096"), sigc::bind (sigc::mem_fun(*this, &ARDOUR_UI::set_jack_buffer_size), (nframes_t) 4096)); + act = ActionManager::register_radio_action (jack_actions, jack_latency_group, X_("JACKLatency4096"), X_("4096"), sigc::bind (sigc::mem_fun(*this, &ARDOUR_UI::set_jack_buffer_size), (pframes_t) 4096)); ActionManager::jack_sensitive_actions.push_back (act); - act = ActionManager::register_radio_action (jack_actions, jack_latency_group, X_("JACKLatency8192"), X_("8192"), sigc::bind (sigc::mem_fun(*this, &ARDOUR_UI::set_jack_buffer_size), (nframes_t) 8192)); + act = ActionManager::register_radio_action (jack_actions, jack_latency_group, X_("JACKLatency8192"), X_("8192"), sigc::bind (sigc::mem_fun(*this, &ARDOUR_UI::set_jack_buffer_size), (pframes_t) 8192)); ActionManager::jack_sensitive_actions.push_back (act); /* these actions are intended to be shared across all windows */ @@ -209,13 +215,14 @@ ARDOUR_UI::install_actions () ActionManager::register_action (main_actions, X_("WindowMenu"), _("Window")); ActionManager::register_action (common_actions, X_("Quit"), _("Quit"), (hide_return (sigc::mem_fun(*this, &ARDOUR_UI::finish)))); - /* windows visibility actions */ + /* windows visibility actions */ ActionManager::register_toggle_action (common_actions, X_("ToggleMaximalEditor"), _("Maximise Editor Space"), sigc::mem_fun (*this, &ARDOUR_UI::toggle_editing_space)); + act = ActionManager::register_toggle_action (common_actions, X_("KeepTearoffs"), _("Toolbars when Maximised"), mem_fun (*this, &ARDOUR_UI::toggle_keep_tearoffs)); + ActionManager::session_sensitive_actions.push_back (act); - ActionManager::register_action (common_actions, X_("goto-editor"), _("Show Editor"), sigc::mem_fun(*this, &ARDOUR_UI::goto_editor_window)); - ActionManager::register_action (common_actions, X_("goto-mixer"), _("Show Mixer"), sigc::mem_fun(*this, &ARDOUR_UI::goto_mixer_window)); - ActionManager::register_action (common_actions, X_("toggle-editor-mixer-on-top"), _("Toggle Editor Mixer on Top"), sigc::mem_fun(*this, &ARDOUR_UI::toggle_editor_mixer_on_top)); + ActionManager::register_toggle_action (common_actions, X_("toggle-mixer"), _("Mixer"), sigc::mem_fun(*this, &ARDOUR_UI::toggle_mixer_window)); + ActionManager::register_toggle_action (common_actions, X_("toggle-mixer-on-top"), _("Mixer on Top"), sigc::mem_fun(*this, &ARDOUR_UI::toggle_mixer_on_top)); ActionManager::register_toggle_action (common_actions, X_("ToggleRCOptionsEditor"), _("Preferences"), sigc::mem_fun(*this, &ARDOUR_UI::toggle_rc_options_window)); ActionManager::register_toggle_action (common_actions, X_("ToggleSessionOptionsEditor"), _("Properties"), sigc::mem_fun(*this, &ARDOUR_UI::toggle_session_options_window)); act = ActionManager::register_toggle_action (common_actions, X_("ToggleInspector"), _("Tracks and Busses"), sigc::mem_fun(*this, &ARDOUR_UI::toggle_route_params_window)); @@ -225,10 +232,18 @@ ARDOUR_UI::install_actions () ActionManager::session_sensitive_actions.push_back (act); act = ActionManager::register_toggle_action (common_actions, X_("ToggleBigClock"), _("Big Clock"), sigc::mem_fun(*this, &ARDOUR_UI::toggle_big_clock_window)); ActionManager::session_sensitive_actions.push_back (act); - act = ActionManager::register_toggle_action (common_actions, X_("ToggleMIDITracer"), _("MIDI Tracer"), sigc::mem_fun(*this, &ARDOUR_UI::toggle_midi_tracer_window)); + act = ActionManager::register_toggle_action (common_actions, X_("toggle-speaker-config"), _("Speaker Config"), sigc::mem_fun(*this, &ARDOUR_UI::toggle_speaker_config_window)); + ActionManager::session_sensitive_actions.push_back (act); + act = ActionManager::register_toggle_action (common_actions, X_("toggle-audio-connection-manager"), _("Audio Connection Manager"), sigc::bind (sigc::mem_fun(*this, &ARDOUR_UI::toggle_global_port_matrix), ARDOUR::DataType::AUDIO)); + ActionManager::session_sensitive_actions.push_back (act); + act = ActionManager::register_toggle_action (common_actions, X_("toggle-midi-connection-manager"), _("MIDI Connection Manager"), sigc::bind (sigc::mem_fun(*this, &ARDOUR_UI::toggle_global_port_matrix), ARDOUR::DataType::MIDI)); + ActionManager::session_sensitive_actions.push_back (act); + act = ActionManager::register_action (common_actions, X_("NewMIDITracer"), _("MIDI Tracer"), sigc::mem_fun(*this, &ARDOUR_UI::new_midi_tracer_window)); ActionManager::session_sensitive_actions.push_back (act); ActionManager::register_action (common_actions, X_("About"), _("About"), sigc::mem_fun(*this, &ARDOUR_UI::show_about)); ActionManager::register_action (common_actions, X_("Chat"), _("Chat"), sigc::mem_fun(*this, &ARDOUR_UI::launch_chat)); + ActionManager::register_action (common_actions, X_("Manual"), _("Manual"), mem_fun(*this, &ARDOUR_UI::launch_manual)); + ActionManager::register_action (common_actions, X_("Reference"), _("Reference"), mem_fun(*this, &ARDOUR_UI::launch_reference)); ActionManager::register_toggle_action (common_actions, X_("ToggleThemeManager"), _("Theme Manager"), sigc::mem_fun(*this, &ARDOUR_UI::toggle_theme_manager)); ActionManager::register_toggle_action (common_actions, X_("ToggleKeyEditor"), _("Key Bindings"), sigc::mem_fun(*this, &ARDOUR_UI::toggle_key_editor)); ActionManager::register_toggle_action (common_actions, X_("ToggleBundleManager"), _("Bundle Manager"), sigc::mem_fun(*this, &ARDOUR_UI::toggle_bundle_manager)); @@ -383,7 +398,7 @@ ARDOUR_UI::install_actions () ActionManager::session_sensitive_actions.push_back (act); act = ActionManager::register_toggle_action (transport_actions, X_("ToggleTimeMaster"), _("Time Master"), sigc::mem_fun(*this, &ARDOUR_UI::toggle_time_master)); ActionManager::session_sensitive_actions.push_back (act); - act = ActionManager::register_toggle_action (transport_actions, X_("ToggleExternalSync"), _(""), sigc::mem_fun(*this, &ARDOUR_UI::toggle_external_sync)); + act = ActionManager::register_toggle_action (transport_actions, X_("ToggleExternalSync"), "", sigc::mem_fun(*this, &ARDOUR_UI::toggle_external_sync)); ActionManager::session_sensitive_actions.push_back (act); for (int i = 1; i <= 32; ++i) { @@ -411,6 +426,17 @@ ARDOUR_UI::install_actions () act = ActionManager::register_toggle_action (option_actions, X_("SendMIDIfeedback"), _("Send MIDI Feedback"), sigc::mem_fun (*this, &ARDOUR_UI::toggle_send_midi_feedback)); ActionManager::session_sensitive_actions.push_back (act); + + if (getenv ("ARDOUR_BUNDLED")) { + act = ActionManager::register_toggle_action (main_actions, X_("EnableTranslation"), _("Enable Translations"), mem_fun (*this, &ARDOUR_UI::toggle_translations)); + if (act) { + RefPtr ract = RefPtr::cast_dynamic (act); + if (ract) { + ract->set_active (!ARDOUR::translations_are_disabled()); + } + } + } + ActionManager::add_action_group (shuttle_actions); ActionManager::add_action_group (option_actions); ActionManager::add_action_group (jack_actions); @@ -420,7 +446,7 @@ ARDOUR_UI::install_actions () } void -ARDOUR_UI::set_jack_buffer_size (nframes_t nframes) +ARDOUR_UI::set_jack_buffer_size (pframes_t nframes) { Glib::RefPtr action; const char* action_name = 0; @@ -510,7 +536,7 @@ ARDOUR_UI::build_menu_bar () sample_rate_label.set_name ("SampleRate"); #ifndef TOP_MENUBAR - menu_hbox.pack_start (*menu_bar, true, true); + menu_hbox.pack_start (*menu_bar, false, false); #else use_menubar_as_top_menubar (); #endif @@ -534,10 +560,26 @@ ARDOUR_UI::build_menu_bar () void ARDOUR_UI::use_menubar_as_top_menubar () { -#ifdef GTKOSX - ige_mac_menu_set_menu_bar ((GtkMenuShell*) menu_bar->gobj()); - // ige_mac_menu_set_quit_menu_item (some_item->gobj()); -#endif + Gtk::Widget* widget; + Application* app = Application::instance (); + + /* Quit will be taken of separately */ + + if ((widget = ActionManager::get_widget ("/ui/Main/Session/Quit"))) { + widget->hide (); + } + + GtkApplicationMenuGroup* group = app->add_app_menu_group (); + + if ((widget = ActionManager::get_widget ("/ui/Main/Help/About"))) { + app->add_app_menu_item (group, dynamic_cast(widget)); + } + + if ((widget = ActionManager::get_widget ("/ui/Main/WindowMenu/ToggleOptionsEditor"))) { + app->add_app_menu_item (group, dynamic_cast(widget)); + } + + app->set_menu_bar (*menu_bar); } void @@ -545,20 +587,20 @@ ARDOUR_UI::setup_clock () { ARDOUR_UI::Clock.connect (sigc::bind (sigc::mem_fun (big_clock, &AudioClock::set), false)); - big_clock_window = new Window (WINDOW_TOPLEVEL); + big_clock_window->set (new Window (WINDOW_TOPLEVEL), false); - big_clock_window->set_keep_above (true); - big_clock_window->set_border_width (0); - big_clock_window->add (big_clock); + big_clock_window->get()->set_keep_above (true); + big_clock_window->get()->set_border_width (0); + big_clock_window->get()->add (big_clock); - big_clock_window->set_title (_("Big Clock")); - big_clock_window->set_type_hint (Gdk::WINDOW_TYPE_HINT_UTILITY); - big_clock_window->signal_realize().connect (sigc::mem_fun (*this, &ARDOUR_UI::big_clock_realized)); - big_clock_window->signal_unmap().connect (sigc::bind (sigc::ptr_fun(&ActionManager::uncheck_toggleaction), X_("/Common/ToggleBigClock"))); - big_clock_window->signal_key_press_event().connect (sigc::bind (sigc::ptr_fun (relay_key_press), big_clock_window), false); - big_clock_window->signal_size_allocate().connect (sigc::mem_fun (*this, &ARDOUR_UI::big_clock_size_allocate)); + big_clock_window->get()->set_title (_("Big Clock")); + big_clock_window->get()->set_type_hint (Gdk::WINDOW_TYPE_HINT_UTILITY); + big_clock_window->get()->signal_realize().connect (sigc::mem_fun (*this, &ARDOUR_UI::big_clock_realized)); + big_clock_window->get()->signal_unmap().connect (sigc::bind (sigc::ptr_fun(&ActionManager::uncheck_toggleaction), X_("/Common/ToggleBigClock"))); + big_clock_window->get()->signal_key_press_event().connect (sigc::bind (sigc::ptr_fun (relay_key_press), big_clock_window->get()), false); + big_clock_window->get()->signal_size_allocate().connect (sigc::mem_fun (*this, &ARDOUR_UI::big_clock_size_allocate)); - manage_window (*big_clock_window); + manage_window (*big_clock_window->get()); } void @@ -566,73 +608,36 @@ ARDOUR_UI::big_clock_realized () { int x, y, w, d; - set_decoration (big_clock_window, (Gdk::DECOR_BORDER|Gdk::DECOR_RESIZEH)); - big_clock_window->get_window()->get_geometry (x, y, w, big_clock_height, d); + set_decoration (big_clock_window->get(), (Gdk::DECOR_BORDER|Gdk::DECOR_RESIZEH)); + big_clock_window->get()->get_window()->get_geometry (x, y, w, big_clock_height, d); - original_big_clock_height = big_clock_height; - original_big_clock_width = w; + original_big_clock_height = big_clock_height; + original_big_clock_width = w; - Pango::FontDescription fd (big_clock.get_style()->get_font()); - original_big_clock_font_size = fd.get_size (); + Pango::FontDescription fd (big_clock.get_style()->get_font()); + original_big_clock_font_size = fd.get_size (); - if (!fd.get_size_is_absolute ()) { - original_big_clock_font_size /= PANGO_SCALE; - } - - /* we can't set the real size until we know the original one, with the UI rc-file-set font - size, so do this here. - */ - - XMLNode* node = Config->extra_xml (X_("UI")); - - if (node) { - - const XMLProperty* prop; - int w, h, x, y; - int have_pos = 0; - - w = h = x = y = 0; - - if ((prop = node->property ("big-clock-x-size")) != 0) { - w = atoi (prop->value()); - } - if ((prop = node->property ("big-clock-y-size")) != 0) { - h = atoi (prop->value()); - } - - if (w && h) { - big_clock_window->set_default_size (w, h); - } - - if ((prop = node->property ("big-clock-x-off")) != 0) { - x = atoi (prop->value()); - have_pos++; - } - if ((prop = node->property ("big-clock-y-off")) != 0) { - y = atoi (prop->value()); - have_pos++; - } - - if (have_pos == 2) { - big_clock_window->move (x, y); - } - } + if (!fd.get_size_is_absolute ()) { + original_big_clock_font_size /= PANGO_SCALE; + } + + big_clock_window->setup (); } void ARDOUR_UI::float_big_clock (Gtk::Window* parent) { - if (big_clock_window) { + if (big_clock_window->get()) { if (parent) { - big_clock_window->set_transient_for (*parent); + big_clock_window->get()->set_transient_for (*parent); } else { - gtk_window_set_transient_for (big_clock_window->gobj(), (GtkWindow*) 0); + gtk_window_set_transient_for (big_clock_window->get()->gobj(), (GtkWindow*) 0); } } } void -ARDOUR_UI::big_clock_size_allocate (Gtk::Allocation& allocation) +ARDOUR_UI::big_clock_size_allocate (Gtk::Allocation&) { if (!big_clock_resize_in_progress) { Glib::signal_idle().connect (sigc::bind (sigc::mem_fun (*this, &ARDOUR_UI::idle_big_clock_text_resizer), 0, 0)); @@ -641,14 +646,14 @@ ARDOUR_UI::big_clock_size_allocate (Gtk::Allocation& allocation) } bool -ARDOUR_UI::idle_big_clock_text_resizer (int win_w, int win_h) +ARDOUR_UI::idle_big_clock_text_resizer (int, int) { big_clock_resize_in_progress = false; - Glib::RefPtr win = big_clock_window->get_window(); + Glib::RefPtr win = big_clock_window->get()->get_window(); Pango::FontDescription fd (big_clock.get_style()->get_font()); int current_size = fd.get_size (); - int x, y, w, h, d; + int x, y, w, h, d; if (!fd.get_size_is_absolute ()) { current_size /= PANGO_SCALE; @@ -656,28 +661,28 @@ ARDOUR_UI::idle_big_clock_text_resizer (int win_w, int win_h) win->get_geometry (x, y, w, h, d); - double scale = min (((double) w / (double) original_big_clock_width), - ((double) h / (double) original_big_clock_height)); + double scale = min (((double) w / (double) original_big_clock_width), + ((double) h / (double) original_big_clock_height)); - int size = (int) lrintf (original_big_clock_font_size * scale); + int size = (int) lrintf (original_big_clock_font_size * scale); - if (size != current_size) { + if (size != current_size) { - string family = fd.get_family(); - char buf[family.length()+16]; - snprintf (buf, family.length()+16, "%s %d", family.c_str(), size); + string family = fd.get_family(); + char buf[family.length()+16]; + snprintf (buf, family.length()+16, "%s %d", family.c_str(), size); - try { - Pango::FontDescription fd (buf); - Glib::RefPtr rcstyle = big_clock.get_modifier_style (); - rcstyle->set_font (fd); - big_clock.modify_style (rcstyle); - } + try { + Pango::FontDescription fd (buf); + Glib::RefPtr rcstyle = big_clock.get_modifier_style (); + rcstyle->set_font (fd); + big_clock.modify_style (rcstyle); + } - catch (...) { - /* oh well, do nothing */ - } - } + catch (...) { + /* oh well, do nothing */ + } + } return false; } @@ -697,56 +702,39 @@ ARDOUR_UI::save_ardour_state () Config->add_extra_xml (*node); Config->add_extra_xml (get_transport_controllable_state()); - XMLNode* window_node = new XMLNode (X_("UI")); + XMLNode* window_node = new XMLNode (X_("UI")); + + for (list::iterator i = _window_proxies.begin(); i != _window_proxies.end(); ++i) { + if ((*i)->rc_configured()) { + window_node->add_child_nocopy (*((*i)->get_state ())); + } + } - window_node->add_property ("show-big-clock", (big_clock_window && big_clock_window->is_visible() ? "yes" : "no")); - - Glib::RefPtr win; - - if (big_clock_window && (win = big_clock_window->get_window())) { - - int w, h; - int xoff, yoff; - char buf[32]; - - win->get_size (w, h); - win->get_position (xoff, yoff); - - snprintf (buf, sizeof (buf), "%d", w); - window_node->add_property ("big-clock-x-size", buf); - snprintf (buf, sizeof (buf), "%d", h); - window_node->add_property ("big-clock-y-size", buf); - snprintf (buf, sizeof (buf), "%d", xoff); - window_node->add_property ("big-clock-x-off", buf); - snprintf (buf, sizeof (buf), "%d", yoff); - window_node->add_property ("big-clock-y-off", buf); - } - - /* tearoffs */ - - XMLNode* tearoff_node = new XMLNode (X_("Tearoffs")); - - if (transport_tearoff) { - XMLNode* t = new XMLNode (X_("transport")); - 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_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_state (*t); - tearoff_node->add_child_nocopy (*t); - } + /* tearoffs */ + + XMLNode* tearoff_node = new XMLNode (X_("Tearoffs")); + + if (transport_tearoff) { + XMLNode* t = new XMLNode (X_("transport")); + 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_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_state (*t); + tearoff_node->add_child_nocopy (*t); + } - window_node->add_child_nocopy (*tearoff_node); + window_node->add_child_nocopy (*tearoff_node); - Config->add_extra_xml (*window_node); + Config->add_extra_xml (*window_node); if (_startup && _startup->engine_control() && _startup->engine_control()->was_used()) { Config->add_extra_xml (_startup->engine_control()->get_state()); @@ -768,3 +756,24 @@ ARDOUR_UI::save_ardour_state () Keyboard::save_keybindings (); } +void +ARDOUR_UI::toggle_global_port_matrix (ARDOUR::DataType t) +{ + std::string const action = string_compose ("toggle-%1-connection-manager", t.to_string ()); + + if (_global_port_matrix[t]->get() == 0) { + _global_port_matrix[t]->set (new GlobalPortMatrixWindow (_session, t)); + _global_port_matrix[t]->get()->signal_unmap().connect(sigc::bind (sigc::ptr_fun (&ActionManager::uncheck_toggleaction), string_compose (X_("/Common/%1"), action))); + } + + RefPtr act = ActionManager::get_action (X_("Common"), action.c_str()); + if (act) { + RefPtr tact = RefPtr::cast_dynamic (act); + + if (tact->get_active()) { + _global_port_matrix[t]->get()->present (); + } else { + _global_port_matrix[t]->get()->hide (); + } + } +}