X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=gtk2_ardour%2Fardour_ui_ed.cc;h=b29da7ba70b99a9bed7b11b6fd562d3dfdc07a03;hb=7e3ebe1267405510a528a0721cc61a6686d4efec;hp=deb2cfc3dd69ab47b32c9f2b001073709e2af105;hpb=cd12fdf447936b6998901cde5cd5946bca2c9cfc;p=ardour.git diff --git a/gtk2_ardour/ardour_ui_ed.cc b/gtk2_ardour/ardour_ui_ed.cc index deb2cfc3dd..b29da7ba70 100644 --- a/gtk2_ardour/ardour_ui_ed.cc +++ b/gtk2_ardour/ardour_ui_ed.cc @@ -26,21 +26,26 @@ #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 @@ -108,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); @@ -131,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); @@ -208,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)); @@ -217,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)); @@ -231,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)); @@ -552,9 +562,59 @@ ARDOUR_UI::setup_clock () void ARDOUR_UI::big_clock_realized () { - set_decoration (big_clock_window, (Gdk::DECOR_BORDER|Gdk::DECOR_RESIZEH)); 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 @@ -576,55 +636,32 @@ ARDOUR_UI::big_clock_size_allocate (Gtk::Allocation& allocation) 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; } - - big_clock_window->set_size_request (allocation.get_width() - 2, allocation.get_height() - 1); } -static int old_big_clock_width = -1; -static int old_big_clock_height = -1; - 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(); - - int x, y, winw, winh, d; - - win->get_geometry (x, y, winw, winh, d); - - if (old_big_clock_width < 0 || old_big_clock_height < 0) { - old_big_clock_height = winh; - old_big_clock_width = winw; - return false; - } - - double scale; - - scale = min (((double) winw / (double)old_big_clock_width), - ((double) winh / (double) old_big_clock_height)); - - cerr << "Window scaled by " << scale << endl; - Pango::FontDescription fd (big_clock.get_style()->get_font()); - string family = fd.get_family(); - int size = fd.get_size (); - bool absolute = fd.get_size_is_absolute (); - int original_size; + int current_size = fd.get_size (); + int x, y, w, h, d; - if (!absolute) { - size /= PANGO_SCALE; + if (!fd.get_size_is_absolute ()) { + current_size /= PANGO_SCALE; } - original_size = size; - size = lrintf (size * scale); - size -= 2; + 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)); - if (size != original_size) { + int size = (int) lrintf (original_big_clock_font_size * scale); - cerr << "new font size = " << size << endl; + 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); @@ -642,3 +679,90 @@ ARDOUR_UI::idle_big_clock_text_resizer (int win_w, int win_h) 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 (); +} +