X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=gtk2_ardour%2Fardour_ui.cc;h=7359b4908170c73b47f1fc07d360e348d8e0d434;hb=e0b7de13b7e704fcdd401dc0a109c499dda70d73;hp=a38196d642c6bf3194c3b9a1d0198a1012674b99;hpb=9a4a9cbb63958484553ed981822ca97ceb1dc4f5;p=ardour.git diff --git a/gtk2_ardour/ardour_ui.cc b/gtk2_ardour/ardour_ui.cc index a38196d642..7359b49081 100644 --- a/gtk2_ardour/ardour_ui.cc +++ b/gtk2_ardour/ardour_ui.cc @@ -37,10 +37,11 @@ #include #include -#include #include #include -#include +#include +#include + #include #include #include @@ -54,7 +55,9 @@ #include #include +#include #include +#include #include #include #include @@ -65,6 +68,7 @@ #include #include #include +#include #include "actions.h" #include "ardour_ui.h" @@ -79,7 +83,8 @@ #include "about.h" #include "utils.h" #include "gui_thread.h" -#include "color_manager.h" +#include "theme_manager.h" + #include "i18n.h" @@ -90,15 +95,16 @@ using namespace Gtk; using namespace sigc; ARDOUR_UI *ARDOUR_UI::theArdourUI = 0; +UIConfiguration *ARDOUR_UI::ui_config = 0; sigc::signal ARDOUR_UI::Blink; sigc::signal ARDOUR_UI::RapidScreenUpdate; sigc::signal ARDOUR_UI::SuperRapidScreenUpdate; -sigc::signal ARDOUR_UI::Clock; +sigc::signal ARDOUR_UI::Clock; -ARDOUR_UI::ARDOUR_UI (int *argcp, char **argvp[], string rcfile) +ARDOUR_UI::ARDOUR_UI (int *argcp, char **argvp[]) - : Gtkmm2ext::UI (X_("Ardour"), argcp, argvp, rcfile), + : Gtkmm2ext::UI (X_("Ardour"), argcp, argvp), primary_clock (X_("primary"), false, X_("TransportClockDisplay"), true, false, true), secondary_clock (X_("secondary"), false, X_("SecondaryClockDisplay"), true, false, true), @@ -162,14 +168,9 @@ ARDOUR_UI::ARDOUR_UI (int *argcp, char **argvp[], string rcfile) theArdourUI = this; } - /* load colors */ - - color_manager = new ColorManager(); - - std::string color_file = ARDOUR::find_config_file("ardour.colors"); - - color_manager->load (color_file); - + ui_config = new UIConfiguration(); + theme_manager = new ThemeManager(); + editor = 0; mixer = 0; session = 0; @@ -185,10 +186,16 @@ ARDOUR_UI::ARDOUR_UI (int *argcp, char **argvp[], string rcfile) open_session_selector = 0; have_configure_timeout = false; have_disk_speed_dialog_displayed = false; - _will_create_new_session_automatically = false; session_loaded = false; last_speed_displayed = -1.0f; - keybindings_path = ARDOUR::find_config_file ("ardour.bindings"); + ab_direction = true; + + sys::path key_bindings_file; + + find_file_in_search_path (ardour_search_path() + system_config_search_path(), + "ardour.bindings", key_bindings_file); + + keybindings_path = key_bindings_file.to_string(); can_save_keybindings = false; @@ -225,7 +232,7 @@ ARDOUR_UI::set_engine (AudioEngine& e) engine->Halted.connect (mem_fun(*this, &ARDOUR_UI::engine_halted)); engine->SampleRateChanged.connect (mem_fun(*this, &ARDOUR_UI::update_sample_rate)); - ActionManager::init (); + ActionManager::init (); new_session_dialog = new NewSessionDialog(); _tooltips.enable(); @@ -422,11 +429,11 @@ ARDOUR_UI::save_ardour_state () XMLNode mnode(mixer->get_state()); if (session) { - session->add_instant_xml (enode, session->path()); - session->add_instant_xml (mnode, session->path()); + session->add_instant_xml (enode); + session->add_instant_xml (mnode); } else { - Config->add_instant_xml (enode, get_user_ardour_path()); - Config->add_instant_xml (mnode, get_user_ardour_path()); + Config->add_instant_xml (enode); + Config->add_instant_xml (mnode); } save_keybindings (); @@ -435,34 +442,34 @@ ARDOUR_UI::save_ardour_state () gint ARDOUR_UI::autosave_session () { - if (!Config->get_periodic_safety_backups()) - return 1; - - if (session) { - session->maybe_write_autosave(); - } + if (!Config->get_periodic_safety_backups()) + return 1; - return 1; + if (session) { + session->maybe_write_autosave(); + } + + return 1; } void ARDOUR_UI::update_autosave () { - ENSURE_GUI_THREAD (mem_fun (*this, &ARDOUR_UI::update_autosave)); - - if (session->dirty()) { - if (_autosave_connection.connected()) { - _autosave_connection.disconnect(); - } + ENSURE_GUI_THREAD (mem_fun (*this, &ARDOUR_UI::update_autosave)); + + if (session->dirty()) { + if (_autosave_connection.connected()) { + _autosave_connection.disconnect(); + } - _autosave_connection = Glib::signal_timeout().connect (mem_fun (*this, &ARDOUR_UI::autosave_session), - Config->get_periodic_safety_backup_interval() * 1000); + _autosave_connection = Glib::signal_timeout().connect (mem_fun (*this, &ARDOUR_UI::autosave_session), + Config->get_periodic_safety_backup_interval() * 1000); - } else { - if (_autosave_connection.connected()) { - _autosave_connection.disconnect(); - } - } + } else { + if (_autosave_connection.connected()) { + _autosave_connection.disconnect(); + } + } } void @@ -475,7 +482,7 @@ void ARDOUR_UI::no_memory_warning () { XMLNode node (X_("no-memory-warning")); - Config->add_instant_xml (node, get_user_ardour_path()); + Config->add_instant_xml (node); } void @@ -486,7 +493,7 @@ ARDOUR_UI::check_memory_locking () return; #else // !__APPLE__ - XMLNode* memory_warning_node = Config->instant_xml (X_("no-memory-warning"), get_user_ardour_path()); + XMLNode* memory_warning_node = Config->instant_xml (X_("no-memory-warning")); if (engine->is_realtime() && memory_warning_node == 0) { @@ -565,6 +572,7 @@ If you still wish to quit, please use the\n\n\ } engine->stop (true); Config->save_state(); + ARDOUR_UI::config()->save_state(); quit (); } @@ -719,7 +727,7 @@ ARDOUR_UI::count_recenabled_streams (Route& route) { Track* track = dynamic_cast(&route); if (track && track->diskstream()->record_enabled()) { - rec_enabled_streams += track->n_inputs().get_total(); + rec_enabled_streams += track->n_inputs().n_total(); } } @@ -1009,7 +1017,7 @@ ARDOUR_UI::open_session () bool isnew; if (session_path.length() > 0) { - if (Session::find_session (session_path, path, name, isnew) == 0) { + if (ARDOUR::find_session (session_path, path, name, isnew) == 0) { _session_is_new = isnew; load_session (path, name); } @@ -1238,7 +1246,7 @@ ARDOUR_UI::transport_record () break; case Session::Recording: case Session::Enabled: - session->disable_record (true); + session->disable_record (false, true); } } } @@ -1501,6 +1509,12 @@ ARDOUR_UI::do_engine_start () return 0; } +void +ARDOUR_UI::setup_theme () +{ + theme_manager->setup_theme(); +} + gint ARDOUR_UI::start_engine () { @@ -1520,7 +1534,7 @@ void ARDOUR_UI::update_clocks () { if (!editor || !editor->dragging_playhead()) { - Clock (session->audible_frame()); /* EMIT_SIGNAL */ + Clock (session->audible_frame(), false, editor->edit_cursor_position(false)); /* EMIT_SIGNAL */ } } @@ -1591,7 +1605,7 @@ ARDOUR_UI::name_io_setup (AudioEngine& engine, bool in) { if (in) { - if (io.n_inputs().get_total() == 0) { + if (io.n_inputs().n_total() == 0) { buf = _("none"); return; } @@ -1610,7 +1624,7 @@ ARDOUR_UI::name_io_setup (AudioEngine& engine, } else { - if (io.n_outputs().get_total() == 0) { + if (io.n_outputs().n_total() == 0) { buf = _("none"); return; } @@ -1823,13 +1837,13 @@ ARDOUR_UI::new_session (std::string predetermined_path) new_session_dialog->set_current_page (0); do { - response = new_session_dialog->run (); + response = new_session_dialog->run (); if (!check_audioengine()) { new_session_dialog->hide (); return false; } - + _session_is_new = false; if (response == Gtk::RESPONSE_CANCEL || response == Gtk::RESPONSE_DELETE_EVENT) { @@ -1842,55 +1856,55 @@ ARDOUR_UI::new_session (std::string predetermined_path) } else if (response == Gtk::RESPONSE_NONE) { - /* Clear was pressed */ - new_session_dialog->reset(); + /* Clear was pressed */ + new_session_dialog->reset(); } else if (response == Gtk::RESPONSE_YES) { - /* YES == OPEN, but there's no enum for that */ + /* YES == OPEN, but there's no enum for that */ + + session_name = new_session_dialog->session_name(); - session_name = new_session_dialog->session_name(); - if (session_name.empty()) { response = Gtk::RESPONSE_NONE; continue; } if (session_name[0] == '/' || - (session_name.length() > 2 && session_name[0] == '.' && session_name[1] == '/') || - (session_name.length() > 3 && session_name[0] == '.' && session_name[1] == '.' && session_name[2] == '/')) { + (session_name.length() > 2 && session_name[0] == '.' && session_name[1] == '/') || + (session_name.length() > 3 && session_name[0] == '.' && session_name[1] == '.' && session_name[2] == '/')) { load_session (Glib::path_get_dirname (session_name), session_name); } else { session_path = new_session_dialog->session_folder(); load_session (session_path, session_name); } - + } else if (response == Gtk::RESPONSE_OK) { session_name = new_session_dialog->session_name(); - - if (new_session_dialog->get_current_page() == 1) { - - /* XXX this is a bit of a hack.. + + if (!new_session_dialog->on_new_session_page ()) { + + /* XXX this is a bit of a hack.. i really want the new sesion dialog to return RESPONSE_YES if we're on page 1 (the load page) Unfortunately i can't see how atm.. */ - + if (session_name.empty()) { response = Gtk::RESPONSE_NONE; continue; } - + if (session_name[0] == '/' || - (session_name.length() > 2 && session_name[0] == '.' && session_name[1] == '/') || - (session_name.length() > 3 && session_name[0] == '.' && session_name[1] == '.' && session_name[2] == '/')) { + (session_name.length() > 2 && session_name[0] == '.' && session_name[1] == '/') || + (session_name.length() > 3 && session_name[0] == '.' && session_name[1] == '.' && session_name[2] == '/')) { load_session (Glib::path_get_dirname (session_name), session_name); } else { session_path = new_session_dialog->session_folder(); load_session (session_path, session_name); } - + } else { if (session_name.empty()) { @@ -1899,8 +1913,8 @@ ARDOUR_UI::new_session (std::string predetermined_path) } if (session_name[0] == '/' || - (session_name.length() > 2 && session_name[0] == '.' && session_name[1] == '/') || - (session_name.length() > 3 && session_name[0] == '.' && session_name[1] == '.' && session_name[2] == '/')) { + (session_name.length() > 2 && session_name[0] == '.' && session_name[1] == '/') || + (session_name.length() > 3 && session_name[0] == '.' && session_name[1] == '.' && session_name[2] == '/')) { session_path = Glib::path_get_dirname (session_name); session_name = Glib::path_get_basename (session_name); @@ -1910,74 +1924,74 @@ ARDOUR_UI::new_session (std::string predetermined_path) session_path = new_session_dialog->session_folder(); } - + //XXX This is needed because session constructor wants a //non-existant path. hopefully this will be fixed at some point. - + session_path = Glib::build_filename (session_path, session_name); - + if (g_file_test (session_path.c_str(), GFileTest (G_FILE_TEST_EXISTS | G_FILE_TEST_IS_DIR))) { Glib::ustring str = string_compose (_("This session\n%1\nalready exists. Do you want to open it?"), session_path); MessageDialog msg (str, - false, - Gtk::MESSAGE_WARNING, - Gtk::BUTTONS_YES_NO, - true); + false, + Gtk::MESSAGE_WARNING, + Gtk::BUTTONS_YES_NO, + true); msg.set_name (X_("CleanupDialog")); msg.set_wmclass (X_("existing_session"), "Ardour"); msg.set_position (Gtk::WIN_POS_MOUSE); - + switch (msg.run()) { - case RESPONSE_YES: - load_session (session_path, session_name); - goto done; - break; - default: - response = RESPONSE_NONE; - new_session_dialog->reset (); - continue; + case RESPONSE_YES: + load_session (session_path, session_name); + goto done; + break; + default: + response = RESPONSE_NONE; + new_session_dialog->reset (); + continue; } } - _session_is_new = true; + _session_is_new = true; std::string template_name = new_session_dialog->session_template_name(); - + if (new_session_dialog->use_session_template()) { - + load_session (session_path, session_name, &template_name); - + } else { - + uint32_t cchns; uint32_t mchns; AutoConnectOption iconnect; AutoConnectOption oconnect; - + if (new_session_dialog->create_control_bus()) { cchns = (uint32_t) new_session_dialog->control_channel_count(); } else { cchns = 0; } - + if (new_session_dialog->create_master_bus()) { mchns = (uint32_t) new_session_dialog->master_channel_count(); } else { mchns = 0; } - + if (new_session_dialog->connect_inputs()) { iconnect = AutoConnectPhysical; } else { iconnect = AutoConnectOption (0); } - + /// @todo some minor tweaks. - + if (new_session_dialog->connect_outs_to_master()) { oconnect = AutoConnectMaster; } else if (new_session_dialog->connect_outs_to_physical()) { @@ -1985,19 +1999,19 @@ ARDOUR_UI::new_session (std::string predetermined_path) } else { oconnect = AutoConnectOption (0); } - + uint32_t nphysin = (uint32_t) new_session_dialog->input_limit_count(); uint32_t nphysout = (uint32_t) new_session_dialog->output_limit_count(); - - if (build_session (session_path, - session_name, - cchns, - mchns, - iconnect, - oconnect, - nphysin, - nphysout, - engine->frame_rate() * 60 * 5)) { + + if (!build_session (session_path, + session_name, + cchns, + mchns, + iconnect, + oconnect, + nphysin, + nphysout, + engine->frame_rate() * 60 * 5)) { response = Gtk::RESPONSE_NONE; new_session_dialog->reset (); @@ -2006,7 +2020,7 @@ ARDOUR_UI::new_session (std::string predetermined_path) } } } - + } while (response == Gtk::RESPONSE_NONE); done: @@ -2031,20 +2045,13 @@ int ARDOUR_UI::load_session (const string & path, const string & snap_name, string* mix_template) { Session *new_session; - int x; session_loaded = false; if (!check_audioengine()) { return -1; } - x = unload_session (); - - if (x < 0) { - return -1; - } else if (x > 0) { - return 0; - } + if(!unload_session ()) return -1; /* if it already exists, we must have write access */ @@ -2081,7 +2088,7 @@ ARDOUR_UI::load_session (const string & path, const string & snap_name, string* return 0; } -int +bool ARDOUR_UI::build_session (const string & path, const string & snap_name, uint32_t control_channels, uint32_t master_channels, @@ -2092,21 +2099,14 @@ ARDOUR_UI::build_session (const string & path, const string & snap_name, nframes_t initial_length) { Session *new_session; - int x; if (!check_audioengine()) { - return -1; + return false; } session_loaded = false; - x = unload_session (); - - if (x < 0) { - return -1; - } else if (x > 0) { - return 0; - } + if (!unload_session ()) return false; _session_is_new = true; @@ -2119,13 +2119,13 @@ ARDOUR_UI::build_session (const string & path, const string & snap_name, MessageDialog msg (string_compose(_("Could not create session in \"%1\""), path)); msg.run (); - return -1; + return false; } connect_to_session (new_session); session_loaded = true; - return 0; + return true; } void @@ -2224,17 +2224,19 @@ require some unused files to continue to exist.")); dimage->set_alignment(ALIGN_LEFT, ALIGN_TOP); + const string dead_sound_directory = session->session_directory().dead_sound_path().to_string(); + if (rep.space < 1048576.0f) { if (removed > 1) { - txt.set_text (string_compose (msg, removed, _("files were"), session->path() + "dead_sounds", (float) rep.space / 1024.0f, "kilo")); + txt.set_text (string_compose (msg, removed, _("files were"), dead_sound_directory, (float) rep.space / 1024.0f, "kilo")); } else { - txt.set_text (string_compose (msg, removed, _("file was"), session->path() + "dead_sounds", (float) rep.space / 1024.0f, "kilo")); + txt.set_text (string_compose (msg, removed, _("file was"), dead_sound_directory, (float) rep.space / 1024.0f, "kilo")); } } else { if (removed > 1) { - txt.set_text (string_compose (msg, removed, _("files were"), session->path() + "dead_sounds", (float) rep.space / 1048576.0f, "mega")); + txt.set_text (string_compose (msg, removed, _("files were"), dead_sound_directory, (float) rep.space / 1048576.0f, "mega")); } else { - txt.set_text (string_compose (msg, removed, _("file was"), session->path() + "dead_sounds", (float) rep.space / 1048576.0f, "mega")); + txt.set_text (string_compose (msg, removed, _("file was"), dead_sound_directory, (float) rep.space / 1048576.0f, "mega")); } } @@ -2428,9 +2430,9 @@ ARDOUR_UI::mixer_settings () const XMLNode* node = 0; if (session) { - node = session->instant_xml(X_("Mixer"), session->path()); + node = session->instant_xml(X_("Mixer")); } else { - node = Config->instant_xml(X_("Mixer"), get_user_ardour_path()); + node = Config->instant_xml(X_("Mixer")); } if (!node) { @@ -2446,9 +2448,9 @@ ARDOUR_UI::editor_settings () const XMLNode* node = 0; if (session) { - node = session->instant_xml(X_("Editor"), session->path()); + node = session->instant_xml(X_("Editor")); } else { - node = Config->instant_xml(X_("Editor"), get_user_ardour_path()); + node = Config->instant_xml(X_("Editor")); } if (!node) { @@ -2592,8 +2594,7 @@ ARDOUR_UI::cmdline_new_session (string path) } new_session (path); - - _will_create_new_session_automatically = false; /* done it */ + return FALSE; /* don't call it again */ } @@ -2654,8 +2655,17 @@ ARDOUR_UI::use_config () void ARDOUR_UI::update_transport_clocks (nframes_t pos) { - primary_clock.set (pos); - secondary_clock.set (pos); + if (Config->get_primary_clock_delta_edit_cursor()) { + primary_clock.set (pos, false, editor->edit_cursor_position(false), 'p'); + } else { + primary_clock.set (pos, 0, true); + } + + if (Config->get_secondary_clock_delta_edit_cursor()) { + secondary_clock.set (pos, false, editor->edit_cursor_position(false), 's'); + } else { + secondary_clock.set (pos); + } if (big_clock_window) { big_clock.set (pos); @@ -2833,3 +2843,42 @@ ARDOUR_UI::setup_profile () Profile->set_small_screen (); } } + +void +ARDOUR_UI::disable_all_plugins () +{ + if (!session) { + return; + } + + // session->begin_reversible_command (_("Disable all plugins")); + + boost::shared_ptr routes = session->get_routes (); + + for (Session::RouteList::iterator i = routes->begin(); i != routes->end(); ++i) { + // XMLNode& before = (*i)->get_redirect_state (); + // session->add_command (new MementoCommand(**i, &before, 0)); + (*i)->disable_plugins (); + // XMLNode& after = (*i)->get_redirect_state (); + // session->add_command (new MementoCommand(**i, 0, &after)); + + } + + // session->commit_reversible_command (); +} + +void +ARDOUR_UI::ab_all_plugins () +{ + if (!session) { + return; + } + + boost::shared_ptr routes = session->get_routes (); + + for (Session::RouteList::iterator i = routes->begin(); i != routes->end(); ++i) { + (*i)->ab_plugins (ab_direction); + } + + ab_direction = !ab_direction; +}