X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=gtk2_ardour%2Fardour_ui.cc;h=7359b4908170c73b47f1fc07d360e348d8e0d434;hb=e0b7de13b7e704fcdd401dc0a109c499dda70d73;hp=92eb4e1343aa35f0214eba5b3f3b2cf0fc43af39;hpb=29f6f0cf05893371a64fb14f8868a3e0e4effd39;p=ardour.git diff --git a/gtk2_ardour/ardour_ui.cc b/gtk2_ardour/ardour_ui.cc index 92eb4e1343..7359b49081 100644 --- a/gtk2_ardour/ardour_ui.cc +++ b/gtk2_ardour/ardour_ui.cc @@ -17,6 +17,9 @@ */ +#define __STDC_FORMAT_MACROS 1 +#include + #include #include #include @@ -34,22 +37,27 @@ #include #include -#include #include #include -#include +#include +#include + #include #include #include #include #include #include +#include #include #include #include +#include +#include #include +#include #include #include #include @@ -59,6 +67,8 @@ #include #include #include +#include +#include #include "actions.h" #include "ardour_ui.h" @@ -73,7 +83,8 @@ #include "about.h" #include "utils.h" #include "gui_thread.h" -#include "color_manager.h" +#include "theme_manager.h" + #include "i18n.h" @@ -84,16 +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::MidRapidScreenUpdate; 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 ("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), @@ -157,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; @@ -180,13 +186,18 @@ 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; - Glib::signal_idle().connect (mem_fun (*this, &ARDOUR_UI::first_idle)); last_configure_time.tv_sec = 0; last_configure_time.tv_usec = 0; @@ -221,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(); @@ -418,16 +429,49 @@ 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 (); } +gint +ARDOUR_UI::autosave_session () +{ + if (!Config->get_periodic_safety_backups()) + 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(); + } + + _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(); + } + } +} + void ARDOUR_UI::startup () { @@ -438,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 @@ -449,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) { @@ -528,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 (); } @@ -619,13 +664,6 @@ ARDOUR_UI::every_point_one_seconds () return TRUE; } -gint -ARDOUR_UI::every_point_oh_five_seconds () -{ - MidRapidScreenUpdate(); /* EMIT_SIGNAL */ - return true; -} - gint ARDOUR_UI::every_point_zero_one_seconds () { @@ -649,11 +687,11 @@ ARDOUR_UI::update_sample_rate (nframes_t ignored) nframes_t rate = engine->frame_rate(); if (fmod (rate, 1000.0) != 0.0) { - snprintf (buf, sizeof (buf), _("%.1f kHz / %4.1f msecs"), + snprintf (buf, sizeof (buf), _("%.1f kHz / %4.1f ms"), (float) rate/1000.0f, (engine->frames_per_cycle() / (float) rate) * 1000.0f); } else { - snprintf (buf, sizeof (buf), _("%u kHz / %4.1f msecs"), + snprintf (buf, sizeof (buf), _("%u kHz / %4.1f ms"), rate/1000, (engine->frames_per_cycle() / (float) rate) * 1000.0f); } @@ -666,7 +704,7 @@ void ARDOUR_UI::update_cpu_load () { char buf[32]; - snprintf (buf, sizeof (buf), _("DSP: %.1f%%"), engine->get_cpu_load()); + snprintf (buf, sizeof (buf), _("DSP: %5.1f%%"), engine->get_cpu_load()); cpu_load_label.set_text (buf); } @@ -689,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(); + rec_enabled_streams += track->n_inputs().n_total(); } } @@ -921,9 +959,30 @@ ARDOUR_UI::filter_ardour_session_dirs (const FileFilter::Info& info) return S_ISREG (statbuf.st_mode); } +bool +ARDOUR_UI::check_audioengine () +{ + if (engine) { + if (!engine->connected()) { + MessageDialog msg (_("Ardour is not connected to JACK\n" + "You cannot open or close sessions in this condition")); + msg.run (); + return false; + } + return true; + } else { + return false; + } +} + void ARDOUR_UI::open_session () { + if (!check_audioengine()) { + return; + + } + /* popup selector window */ if (open_session_selector == 0) { @@ -958,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); } @@ -967,11 +1026,45 @@ ARDOUR_UI::open_session () void -ARDOUR_UI::session_add_midi_track () +ARDOUR_UI::session_add_midi_route (bool disk, uint32_t how_many) { - cerr << _("Patience is a virtue.\n"); + list > tracks; + + if (session == 0) { + warning << _("You cannot add a track without a session already loaded.") << endmsg; + return; + } + + try { + if (disk) { + + tracks = session->new_midi_track (ARDOUR::Normal, how_many); + + if (tracks.size() != how_many) { + if (how_many == 1) { + error << _("could not create a new midi track") << endmsg; + } else { + error << string_compose (_("could not create %1 new midi tracks"), how_many) << endmsg; + } + } + } /*else { + if ((route = session->new_midi_route ()) == 0) { + error << _("could not create new midi bus") << endmsg; + } + }*/ + } + + catch (...) { + MessageDialog msg (*editor, + _("There are insufficient JACK ports available\n\ +to create a new track or bus.\n\ +You should save Ardour, exit and\n\ +restart JACK with more ports.")); + msg.run (); + } } + void ARDOUR_UI::session_add_audio_route (bool track, int32_t input_channels, int32_t output_channels, ARDOUR::TrackMode mode, uint32_t how_many) { @@ -1153,7 +1246,7 @@ ARDOUR_UI::transport_record () break; case Session::Recording: case Session::Enabled: - session->disable_record (true); + session->disable_record (false, true); } } } @@ -1416,6 +1509,12 @@ ARDOUR_UI::do_engine_start () return 0; } +void +ARDOUR_UI::setup_theme () +{ + theme_manager->setup_theme(); +} + gint ARDOUR_UI::start_engine () { @@ -1435,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 */ } } @@ -1506,7 +1605,7 @@ ARDOUR_UI::name_io_setup (AudioEngine& engine, bool in) { if (in) { - if (io.n_inputs() == 0) { + if (io.n_inputs().n_total() == 0) { buf = _("none"); return; } @@ -1525,7 +1624,7 @@ ARDOUR_UI::name_io_setup (AudioEngine& engine, } else { - if (io.n_outputs() == 0) { + if (io.n_outputs().n_total() == 0) { buf = _("none"); return; } @@ -1544,6 +1643,8 @@ ARDOUR_UI::name_io_setup (AudioEngine& engine, } } +/** Ask the user for the name of a new shapshot and then take it. + */ void ARDOUR_UI::snapshot_session () { @@ -1717,16 +1818,14 @@ ARDOUR_UI::save_template () } } -void +bool ARDOUR_UI::new_session (std::string predetermined_path) { string session_name; string session_path; - if (!engine->connected()) { - MessageDialog msg (_("Ardour is not connected to JACK at this time. Creating new sessions is not possible.")); - msg.run (); - return; + if (!check_audioengine()) { + return false; } int response = Gtk::RESPONSE_NONE; @@ -1735,17 +1834,16 @@ ARDOUR_UI::new_session (std::string predetermined_path) new_session_dialog->set_name (predetermined_path); new_session_dialog->reset_recent(); new_session_dialog->show(); + new_session_dialog->set_current_page (0); do { - response = new_session_dialog->run (); + response = new_session_dialog->run (); - if (!engine->connected()) { + if (!check_audioengine()) { new_session_dialog->hide (); - MessageDialog msg (_("Ardour is not connected to JACK at this time. Creating new sessions is not possible.")); - msg.run (); - return; + return false; } - + _session_is_new = false; if (response == Gtk::RESPONSE_CANCEL || response == Gtk::RESPONSE_DELETE_EVENT) { @@ -1754,59 +1852,59 @@ ARDOUR_UI::new_session (std::string predetermined_path) quit(); } new_session_dialog->hide (); - return; + return false; } 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()) { @@ -1815,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); @@ -1826,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()) { @@ -1901,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 (); @@ -1922,18 +2020,23 @@ ARDOUR_UI::new_session (std::string predetermined_path) } } } - + } while (response == Gtk::RESPONSE_NONE); done: show(); new_session_dialog->get_window()->set_cursor(); new_session_dialog->hide(); + return true; } void ARDOUR_UI::close_session() { + if (!check_audioengine()) { + return; + } + unload_session(); new_session (); } @@ -1942,17 +2045,14 @@ int ARDOUR_UI::load_session (const string & path, const string & snap_name, string* mix_template) { Session *new_session; - int x; session_loaded = false; - x = unload_session (); - - if (x < 0) { + if (!check_audioengine()) { return -1; - } else if (x > 0) { - return 0; } + if(!unload_session ()) return -1; + /* if it already exists, we must have write access */ if (::access (path.c_str(), F_OK) == 0 && ::access (path.c_str(), W_OK)) { @@ -1988,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, @@ -1999,15 +2099,14 @@ ARDOUR_UI::build_session (const string & path, const string & snap_name, nframes_t initial_length) { Session *new_session; - int x; - session_loaded = false; - x = unload_session (); - if (x < 0) { - return -1; - } else if (x > 0) { - return 0; + if (!check_audioengine()) { + return false; } + + session_loaded = false; + + if (!unload_session ()) return false; _session_is_new = true; @@ -2020,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 @@ -2125,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")); } } @@ -2275,15 +2376,15 @@ ARDOUR_UI::add_route (Gtk::Window* float_window) } ResponseType r = (ResponseType) add_route_dialog->run (); - + add_route_dialog->hide(); switch (r) { - case RESPONSE_ACCEPT: - break; - default: - return; - break; + case RESPONSE_ACCEPT: + break; + default: + return; + break; } if ((count = add_route_dialog->count()) <= 0) { @@ -2298,17 +2399,28 @@ ARDOUR_UI::add_route (Gtk::Window* float_window) AutoConnectOption oac = Config->get_output_auto_connect(); if (oac & AutoConnectMaster) { - output_chan = (session->master_out() ? session->master_out()->n_inputs() : input_chan); + output_chan = (session->master_out() ? session->master_out()->n_inputs().n_audio() : input_chan); } else { output_chan = input_chan; } /* XXX do something with name template */ - if (track) { - session_add_audio_track (input_chan, output_chan, add_route_dialog->mode(), count); - } else { - session_add_audio_bus (input_chan, output_chan, count); + if (add_route_dialog->type() == ARDOUR::DataType::MIDI) { + if (track) { + session_add_midi_track(count); + } else { + MessageDialog msg (*editor, + _("Sorry, MIDI Busses are not supported at this time.")); + msg.run (); + //session_add_midi_bus(); + } + } else { + if (track) { + session_add_audio_track (input_chan, output_chan, add_route_dialog->mode(), count); + } else { + session_add_audio_bus (input_chan, output_chan, count); + } } } @@ -2318,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) { @@ -2336,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) { @@ -2377,7 +2489,7 @@ ARDOUR_UI::disk_overrun_handler () if (!have_disk_speed_dialog_displayed) { have_disk_speed_dialog_displayed = true; - MessageDialog* msg = new MessageDialog (*editor, X_("diskrate dialog"), _("\ + MessageDialog* msg = new MessageDialog (*editor, _("\ The disk system on your computer\n\ was not able to keep up with Ardour.\n\ \n\ @@ -2482,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 */ } @@ -2544,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); @@ -2589,6 +2709,9 @@ ARDOUR_UI::save_keybindings () bool ARDOUR_UI::first_idle () { + if (session) { + session->allow_auto_play (true); + } can_save_keybindings = true; return false; } @@ -2712,3 +2835,50 @@ ARDOUR_UI::TransportControllable::set_id (const string& str) { _id = str; } + +void +ARDOUR_UI::setup_profile () +{ + if (gdk_screen_width() < 1200) { + 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; +}