X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=gtk2_ardour%2Fardour_ui_ed.cc;h=b29da7ba70b99a9bed7b11b6fd562d3dfdc07a03;hb=7e3ebe1267405510a528a0721cc61a6686d4efec;hp=f8bf0a2be42b27d85d300cfab464602261630820;hpb=8687895abba4209a6de8d8a8fc1bda5996f0d875;p=ardour.git diff --git a/gtk2_ardour/ardour_ui_ed.cc b/gtk2_ardour/ardour_ui_ed.cc index f8bf0a2be4..b29da7ba70 100644 --- a/gtk2_ardour/ardour_ui_ed.cc +++ b/gtk2_ardour/ardour_ui_ed.cc @@ -23,22 +23,29 @@ is to cut down on the nasty compile times for both these classes. */ -#include "pbd/file_utils.h" -#include "pbd/fpu.h" +#include #include - -#include -#include #include +#include "gtkmm2ext/utils.h" +#include "gtkmm2ext/window_title.h" +#include "gtkmm2ext/tearoff.h" + +#include "pbd/file_utils.h" +#include "pbd/fpu.h" +#include "pbd/convert.h" + #include "ardour_ui.h" #include "public_editor.h" #include "audio_clock.h" +#include "keyboard.h" +#include "monitor_section.h" #include "engine_dialog.h" #include "editor.h" #include "actions.h" #include "mixer_ui.h" +#include "startup.h" #include "utils.h" #ifdef GTKOSX @@ -106,14 +113,14 @@ ARDOUR_UI::install_actions () /* the real actions */ - act = ActionManager::register_action (main_actions, X_("New"), _("New..."), hide_return (sigc::bind (sigc::mem_fun(*this, &ARDOUR_UI::get_session_parameters), false, true))); + act = ActionManager::register_action (main_actions, X_("New"), _("New..."), hide_return (sigc::bind (sigc::mem_fun(*this, &ARDOUR_UI::get_session_parameters), false, true, ""))); ActionManager::register_action (main_actions, X_("Open"), _("Open..."), sigc::mem_fun(*this, &ARDOUR_UI::open_session)); ActionManager::register_action (main_actions, X_("Recent"), _("Recent..."), sigc::mem_fun(*this, &ARDOUR_UI::open_recent_session)); act = ActionManager::register_action (main_actions, X_("Close"), _("Close"), sigc::mem_fun(*this, &ARDOUR_UI::close_session)); ActionManager::session_sensitive_actions.push_back (act); - act = ActionManager::register_action (main_actions, X_("AddTrackBus"), _("Add Track/Bus..."), + act = ActionManager::register_action (main_actions, X_("AddTrackBus"), _("Add Track or Bus..."), sigc::bind (sigc::mem_fun(*this, &ARDOUR_UI::add_route), (Gtk::Window*) 0)); ActionManager::session_sensitive_actions.push_back (act); ActionManager::write_sensitive_actions.push_back (act); @@ -129,7 +136,11 @@ ARDOUR_UI::install_actions () #endif - act = ActionManager::register_action (main_actions, X_("Snapshot"), _("Snapshot..."), sigc::mem_fun(*this, &ARDOUR_UI::snapshot_session)); + act = ActionManager::register_action (main_actions, X_("Snapshot"), _("Snapshot..."), sigc::bind (sigc::mem_fun(*this, &ARDOUR_UI::snapshot_session), false)); + ActionManager::session_sensitive_actions.push_back (act); + ActionManager::write_sensitive_actions.push_back (act); + + act = ActionManager::register_action (main_actions, X_("SaveAs"), _("Save As..."), sigc::bind (sigc::mem_fun(*this, &ARDOUR_UI::snapshot_session), true)); ActionManager::session_sensitive_actions.push_back (act); ActionManager::write_sensitive_actions.push_back (act); @@ -206,8 +217,8 @@ ARDOUR_UI::install_actions () 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_("ToggleRCOptionsEditor"), _("Preferences"), sigc::mem_fun(*this, &ARDOUR_UI::toggle_rc_options_window)); - ActionManager::register_toggle_action (common_actions, X_("ToggleSessionOptionsEditor"), _("Preferences"), sigc::mem_fun(*this, &ARDOUR_UI::toggle_session_options_window)); - act = ActionManager::register_toggle_action (common_actions, X_("ToggleInspector"), _("Track/Bus Inspector"), sigc::mem_fun(*this, &ARDOUR_UI::toggle_route_params_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)); ActionManager::session_sensitive_actions.push_back (act); ActionManager::session_sensitive_actions.push_back (act); act = ActionManager::register_toggle_action (common_actions, X_("ToggleLocations"), _("Locations"), sigc::mem_fun(*this, &ARDOUR_UI::toggle_location_window)); @@ -215,6 +226,7 @@ ARDOUR_UI::install_actions () 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); 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_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)); @@ -229,7 +241,7 @@ ARDOUR_UI::install_actions () //act = ActionManager::register_action (common_actions, X_("AddMidiBus"), _("Add Midi Bus"), sigc::mem_fun(*this, &ARDOUR_UI::session_add_midi_bus)); //ActionManager::session_sensitive_actions.push_back (act); #endif - act = ActionManager::register_action (common_actions, X_("Save"), _("Save"), sigc::bind (sigc::mem_fun(*this, &ARDOUR_UI::save_state), string(""))); + act = ActionManager::register_action (common_actions, X_("Save"), _("Save"), sigc::bind (sigc::mem_fun(*this, &ARDOUR_UI::save_state), string(""), false)); ActionManager::session_sensitive_actions.push_back (act); ActionManager::write_sensitive_actions.push_back (act); act = ActionManager::register_action (common_actions, X_("RemoveLastCapture"), _("Remove Last Capture"), sigc::mem_fun(*this, &ARDOUR_UI::remove_last_capture)); @@ -258,7 +270,7 @@ ARDOUR_UI::install_actions () act = ActionManager::register_action (transport_actions, X_("ToggleRollMaybe"), _("Start/Continue/Stop"), sigc::bind (sigc::mem_fun (*this, &ARDOUR_UI::toggle_roll), false, true)); ActionManager::session_sensitive_actions.push_back (act); ActionManager::transport_sensitive_actions.push_back (act); - act = ActionManager::register_action (transport_actions, X_("ToggleRollForgetCapture"), _("Stop + Forget Capture"), sigc::bind (sigc::mem_fun(*this, &ARDOUR_UI::toggle_roll), true, false)); + act = ActionManager::register_action (transport_actions, X_("ToggleRollForgetCapture"), _("Stop and Forget Capture"), sigc::bind (sigc::mem_fun(*this, &ARDOUR_UI::toggle_roll), true, false)); ActionManager::session_sensitive_actions.push_back (act); ActionManager::transport_sensitive_actions.push_back (act); @@ -365,77 +377,19 @@ ARDOUR_UI::install_actions () ActionManager::session_sensitive_actions.push_back (act); ActionManager::transport_sensitive_actions.push_back (act); - act = ActionManager::register_toggle_action (transport_actions, X_("ToggleVideoSync"), _("Sync startup to video"), sigc::mem_fun(*this, &ARDOUR_UI::toggle_video_sync)); + act = ActionManager::register_toggle_action (transport_actions, X_("ToggleVideoSync"), _("Sync Startup to Video"), sigc::mem_fun(*this, &ARDOUR_UI::toggle_video_sync)); 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)); ActionManager::session_sensitive_actions.push_back (act); - act = ActionManager::register_action (common_actions, X_("ToggleRecordEnableTrack1"), _("Toggle Record Enable Track1"), sigc::bind (sigc::mem_fun(*this, &ARDOUR_UI::toggle_record_enable), 0U)); - ActionManager::session_sensitive_actions.push_back (act); - act = ActionManager::register_action (common_actions, X_("ToggleRecordEnableTrack2"), _("Toggle Record Enable Track2"), sigc::bind (sigc::mem_fun(*this, &ARDOUR_UI::toggle_record_enable), 1U)); - ActionManager::session_sensitive_actions.push_back (act); - act = ActionManager::register_action (common_actions, X_("ToggleRecordEnableTrack3"), _("Toggle Record Enable Track3"), sigc::bind (sigc::mem_fun(*this, &ARDOUR_UI::toggle_record_enable), 2U)); - ActionManager::session_sensitive_actions.push_back (act); - act = ActionManager::register_action (common_actions, X_("ToggleRecordEnableTrack4"), _("Toggle Record Enable Track4"), sigc::bind (sigc::mem_fun(*this, &ARDOUR_UI::toggle_record_enable), 3U)); - ActionManager::session_sensitive_actions.push_back (act); - act = ActionManager::register_action (common_actions, X_("ToggleRecordEnableTrack5"), _("Toggle Record Enable Track5"), sigc::bind (sigc::mem_fun(*this, &ARDOUR_UI::toggle_record_enable), 4U)); - ActionManager::session_sensitive_actions.push_back (act); - act = ActionManager::register_action (common_actions, X_("ToggleRecordEnableTrack6"), _("Toggle Record Enable Track6"), sigc::bind (sigc::mem_fun(*this, &ARDOUR_UI::toggle_record_enable), 5U)); - ActionManager::session_sensitive_actions.push_back (act); - act = ActionManager::register_action (common_actions, X_("ToggleRecordEnableTrack7"), _("Toggle Record Enable Track7"), sigc::bind (sigc::mem_fun(*this, &ARDOUR_UI::toggle_record_enable), 6U)); - ActionManager::session_sensitive_actions.push_back (act); - act = ActionManager::register_action (common_actions, X_("ToggleRecordEnableTrack8"), _("Toggle Record Enable Track8"), sigc::bind (sigc::mem_fun(*this, &ARDOUR_UI::toggle_record_enable), 7U)); - ActionManager::session_sensitive_actions.push_back (act); - act = ActionManager::register_action (common_actions, X_("ToggleRecordEnableTrack9"), _("Toggle Record Enable Track9"), sigc::bind (sigc::mem_fun(*this, &ARDOUR_UI::toggle_record_enable), 8U)); - ActionManager::session_sensitive_actions.push_back (act); - act = ActionManager::register_action (common_actions, X_("ToggleRecordEnableTrack10"), _("Toggle Record Enable Track10"), sigc::bind (sigc::mem_fun(*this, &ARDOUR_UI::toggle_record_enable), 9U)); - ActionManager::session_sensitive_actions.push_back (act); - act = ActionManager::register_action (common_actions, X_("ToggleRecordEnableTrack11"), _("Toggle Record Enable Track11"), sigc::bind (sigc::mem_fun(*this, &ARDOUR_UI::toggle_record_enable), 10U)); - ActionManager::session_sensitive_actions.push_back (act); - act = ActionManager::register_action (common_actions, X_("ToggleRecordEnableTrack12"), _("Toggle Record Enable Track12"), sigc::bind (sigc::mem_fun(*this, &ARDOUR_UI::toggle_record_enable), 11U)); - ActionManager::session_sensitive_actions.push_back (act); - act = ActionManager::register_action (common_actions, X_("ToggleRecordEnableTrack13"), _("Toggle Record Enable Track13"), sigc::bind (sigc::mem_fun(*this, &ARDOUR_UI::toggle_record_enable), 12U)); - ActionManager::session_sensitive_actions.push_back (act); - act = ActionManager::register_action (common_actions, X_("ToggleRecordEnableTrack14"), _("Toggle Record Enable Track14"), sigc::bind (sigc::mem_fun(*this, &ARDOUR_UI::toggle_record_enable), 13U)); - ActionManager::session_sensitive_actions.push_back (act); - act = ActionManager::register_action (common_actions, X_("ToggleRecordEnableTrack15"), _("Toggle Record Enable Track15"), sigc::bind (sigc::mem_fun(*this, &ARDOUR_UI::toggle_record_enable), 14U)); - ActionManager::session_sensitive_actions.push_back (act); - act = ActionManager::register_action (common_actions, X_("ToggleRecordEnableTrack16"), _("Toggle Record Enable Track16"), sigc::bind (sigc::mem_fun(*this, &ARDOUR_UI::toggle_record_enable), 15U)); - ActionManager::session_sensitive_actions.push_back (act); - act = ActionManager::register_action (common_actions, X_("ToggleRecordEnableTrack17"), _("Toggle Record Enable Track17"), sigc::bind (sigc::mem_fun(*this, &ARDOUR_UI::toggle_record_enable), 16U)); - ActionManager::session_sensitive_actions.push_back (act); - act = ActionManager::register_action (common_actions, X_("ToggleRecordEnableTrack18"), _("Toggle Record Enable Track18"), sigc::bind (sigc::mem_fun(*this, &ARDOUR_UI::toggle_record_enable), 17U)); - ActionManager::session_sensitive_actions.push_back (act); - act = ActionManager::register_action (common_actions, X_("ToggleRecordEnableTrack19"), _("Toggle Record Enable Track19"), sigc::bind (sigc::mem_fun(*this, &ARDOUR_UI::toggle_record_enable), 18U)); - ActionManager::session_sensitive_actions.push_back (act); - act = ActionManager::register_action (common_actions, X_("ToggleRecordEnableTrack20"), _("Toggle Record Enable Track20"), sigc::bind (sigc::mem_fun(*this, &ARDOUR_UI::toggle_record_enable), 19U)); - ActionManager::session_sensitive_actions.push_back (act); - act = ActionManager::register_action (common_actions, X_("ToggleRecordEnableTrack21"), _("Toggle Record Enable Track21"), sigc::bind (sigc::mem_fun(*this, &ARDOUR_UI::toggle_record_enable), 20U)); - ActionManager::session_sensitive_actions.push_back (act); - act = ActionManager::register_action (common_actions, X_("ToggleRecordEnableTrack22"), _("Toggle Record Enable Track22"), sigc::bind (sigc::mem_fun(*this, &ARDOUR_UI::toggle_record_enable), 21U)); - ActionManager::session_sensitive_actions.push_back (act); - act = ActionManager::register_action (common_actions, X_("ToggleRecordEnableTrack23"), _("Toggle Record Enable Track23"), sigc::bind (sigc::mem_fun(*this, &ARDOUR_UI::toggle_record_enable), 22U)); - ActionManager::session_sensitive_actions.push_back (act); - act = ActionManager::register_action (common_actions, X_("ToggleRecordEnableTrack24"), _("Toggle Record Enable Track24"), sigc::bind (sigc::mem_fun(*this, &ARDOUR_UI::toggle_record_enable), 23U)); - ActionManager::session_sensitive_actions.push_back (act); - act = ActionManager::register_action (common_actions, X_("ToggleRecordEnableTrack25"), _("Toggle Record Enable Track25"), sigc::bind (sigc::mem_fun(*this, &ARDOUR_UI::toggle_record_enable), 24U)); - ActionManager::session_sensitive_actions.push_back (act); - act = ActionManager::register_action (common_actions, X_("ToggleRecordEnableTrack26"), _("Toggle Record Enable Track26"), sigc::bind (sigc::mem_fun(*this, &ARDOUR_UI::toggle_record_enable), 25U)); - ActionManager::session_sensitive_actions.push_back (act); - act = ActionManager::register_action (common_actions, X_("ToggleRecordEnableTrack27"), _("Toggle Record Enable Track27"), sigc::bind (sigc::mem_fun(*this, &ARDOUR_UI::toggle_record_enable), 26U)); - ActionManager::session_sensitive_actions.push_back (act); - act = ActionManager::register_action (common_actions, X_("ToggleRecordEnableTrack28"), _("Toggle Record Enable Track28"), sigc::bind (sigc::mem_fun(*this, &ARDOUR_UI::toggle_record_enable), 27U)); - ActionManager::session_sensitive_actions.push_back (act); - act = ActionManager::register_action (common_actions, X_("ToggleRecordEnableTrack29"), _("Toggle Record Enable Track29"), sigc::bind (sigc::mem_fun(*this, &ARDOUR_UI::toggle_record_enable), 28U)); - ActionManager::session_sensitive_actions.push_back (act); - act = ActionManager::register_action (common_actions, X_("ToggleRecordEnableTrack30"), _("Toggle Record Enable Track30"), sigc::bind (sigc::mem_fun(*this, &ARDOUR_UI::toggle_record_enable), 29U)); - ActionManager::session_sensitive_actions.push_back (act); - act = ActionManager::register_action (common_actions, X_("ToggleRecordEnableTrack31"), _("Toggle Record Enable Track31"), sigc::bind (sigc::mem_fun(*this, &ARDOUR_UI::toggle_record_enable), 30U)); - ActionManager::session_sensitive_actions.push_back (act); - act = ActionManager::register_action (common_actions, X_("ToggleRecordEnableTrack32"), _("Toggle Record Enable Track32"), sigc::bind (sigc::mem_fun(*this, &ARDOUR_UI::toggle_record_enable), 31U)); - ActionManager::session_sensitive_actions.push_back (act); + for (int i = 1; i <= 32; ++i) { + string const a = string_compose (X_("ToggleRecordEnableTrack%1"), i); + string const n = string_compose (_("Toggle Record Enable Track %1"), i); + act = ActionManager::register_action (common_actions, a.c_str(), n.c_str(), sigc::bind (sigc::mem_fun (*this, &ARDOUR_UI::toggle_record_enable), i - 1)); + ActionManager::session_sensitive_actions.push_back (act); + } Glib::RefPtr shuttle_actions = ActionGroup::create ("ShuttleActions"); @@ -479,6 +433,9 @@ ARDOUR_UI::set_jack_buffer_size (nframes_t nframes) case 128: action_name = X_("JACKLatency128"); break; + case 256: + action_name = X_("JACKLatency256"); + break; case 512: action_name = X_("JACKLatency512"); break; @@ -594,13 +551,72 @@ ARDOUR_UI::setup_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::bind (sigc::ptr_fun (set_decoration), big_clock_window, (Gdk::DECOR_BORDER|Gdk::DECOR_RESIZEH))); + 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)); manage_window (*big_clock_window); } +void +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); + + 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 (); + + 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); + } + } +} + void ARDOUR_UI::float_big_clock (Gtk::Window* parent) { @@ -613,3 +629,140 @@ ARDOUR_UI::float_big_clock (Gtk::Window* parent) } } +void +ARDOUR_UI::big_clock_size_allocate (Gtk::Allocation& 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)); + big_clock_resize_in_progress = true; + } +} + +bool +ARDOUR_UI::idle_big_clock_text_resizer (int win_w, int win_h) +{ + big_clock_resize_in_progress = false; + + Glib::RefPtr win = big_clock_window->get_window(); + Pango::FontDescription fd (big_clock.get_style()->get_font()); + int current_size = fd.get_size (); + int x, y, w, h, d; + + if (!fd.get_size_is_absolute ()) { + current_size /= PANGO_SCALE; + } + + 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)); + + int size = (int) lrintf (original_big_clock_font_size * scale); + + 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); + + 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 */ + } + } + + return false; +} + +void +ARDOUR_UI::save_ardour_state () +{ + if (!keyboard || !mixer || !editor) { + return; + } + + /* XXX this is all a bit dubious. add_extra_xml() uses + a different lifetime model from add_instant_xml(). + */ + + XMLNode* node = new XMLNode (keyboard->get_state()); + Config->add_extra_xml (*node); + Config->add_extra_xml (get_transport_controllable_state()); + + XMLNode* window_node = new XMLNode (X_("UI")); + + 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); + } + + window_node->add_child_nocopy (*tearoff_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()); + } + Config->save_state(); + ui_config->save_state (); + + XMLNode enode(static_cast(editor)->get_state()); + XMLNode mnode(mixer->get_state()); + + if (_session) { + _session->add_instant_xml (enode); + _session->add_instant_xml (mnode); + } else { + Config->add_instant_xml (enode); + Config->add_instant_xml (mnode); + } + + Keyboard::save_keybindings (); +} +