X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=gtk2_ardour%2Fardour_ui.cc;h=5846fa577fb88073a2ba14f8861065124d9b3532;hb=4c42a77441e74356cd909d994e270d1e1314aad4;hp=56eced0d518d06a5842e4c186daca25bc44174f4;hpb=bb98baf4136f00cdad0aa962758aa6231478344a;p=ardour.git diff --git a/gtk2_ardour/ardour_ui.cc b/gtk2_ardour/ardour_ui.cc index 56eced0d51..5846fa577f 100644 --- a/gtk2_ardour/ardour_ui.cc +++ b/gtk2_ardour/ardour_ui.cc @@ -35,6 +35,8 @@ #include #include +#include +#include #include #include @@ -60,26 +62,22 @@ #include "midi++/manager.h" #include "ardour/ardour.h" -#include "ardour/callback.h" +#include "ardour/audioengine.h" +#include "ardour/audiofilesource.h" +#include "ardour/automation_watch.h" +#include "ardour/diskstream.h" +#include "ardour/filename_extensions.h" +#include "ardour/port.h" +#include "ardour/process_thread.h" #include "ardour/profile.h" -#include "ardour/plugin_manager.h" +#include "ardour/recent_sessions.h" #include "ardour/session_directory.h" #include "ardour/session_route.h" #include "ardour/session_state_utils.h" #include "ardour/session_utils.h" -#include "ardour/port.h" -#include "ardour/audioengine.h" -#include "ardour/playlist.h" -#include "ardour/utils.h" -#include "ardour/audio_diskstream.h" -#include "ardour/audiofilesource.h" -#include "ardour/recent_sessions.h" -#include "ardour/port.h" -#include "ardour/audio_track.h" -#include "ardour/midi_track.h" -#include "ardour/filesystem_paths.h" -#include "ardour/filename_extensions.h" -#include "ardour/process_thread.h" +#include "ardour/slave.h" + +#include "timecode/time.h" typedef uint64_t microseconds_t; @@ -97,9 +95,11 @@ typedef uint64_t microseconds_t; #include "gui_thread.h" #include "keyboard.h" #include "location_ui.h" +#include "main_clock.h" #include "missing_file_dialog.h" #include "missing_plugin_dialog.h" #include "mixer_ui.h" +#include "mouse_cursors.h" #include "opts.h" #include "processor_box.h" #include "prompter.h" @@ -121,6 +121,7 @@ using namespace ARDOUR; using namespace PBD; using namespace Gtkmm2ext; using namespace Gtk; +using namespace std; ARDOUR_UI *ARDOUR_UI::theArdourUI = 0; UIConfiguration *ARDOUR_UI::ui_config = 0; @@ -130,15 +131,13 @@ sigc::signal ARDOUR_UI::RapidScreenUpdate; sigc::signal ARDOUR_UI::SuperRapidScreenUpdate; sigc::signal ARDOUR_UI::Clock; -bool could_be_a_valid_path (const string& path); - -ARDOUR_UI::ARDOUR_UI (int *argcp, char **argvp[]) +ARDOUR_UI::ARDOUR_UI (int *argcp, char **argvp[], const char* localedir) : Gtkmm2ext::UI (PROGRAM_NAME, argcp, argvp) , gui_object_state (new GUIObjectState) - , primary_clock (new AudioClock (X_("primary"), false, X_("transport"), true, true, false, true)) - , secondary_clock (new AudioClock (X_("secondary"), false, X_("secondary"), true, true, false, true)) + , primary_clock (new MainClock (X_("primary"), false, X_("transport"), true, true, true, false, true)) + , secondary_clock (new MainClock (X_("secondary"), false, X_("secondary"), true, true, false, false, true)) /* big clock */ @@ -155,7 +154,7 @@ ARDOUR_UI::ARDOUR_UI (int *argcp, char **argvp[]) , rec_controllable (new TransportControllable ("transport rec-enable", *this, TransportControllable::RecordEnable)) , auto_return_button (ArdourButton::led_default_elements) - , auto_play_button (ArdourButton::led_default_elements) + , follow_edits_button (ArdourButton::led_default_elements) , auto_input_button (ArdourButton::led_default_elements) , auditioning_alert_button (_("audition")) @@ -168,19 +167,7 @@ ARDOUR_UI::ARDOUR_UI (int *argcp, char **argvp[]) , _feedback_exists (false) { - using namespace Gtk::Menu_Helpers; - - Gtkmm2ext::init(); - - -#ifdef TOP_MENUBAR - // _auto_display_errors = false; - /* - * This was commented out as it wasn't defined - * in A3 IIRC. If this is not needed it should - * be completely removed. - */ -#endif + Gtkmm2ext::init(localedir); about = 0; splash = 0; @@ -205,7 +192,6 @@ ARDOUR_UI::ARDOUR_UI (int *argcp, char **argvp[]) big_clock_resize_in_progress = false; session_selector_window = 0; last_key_press_time = 0; - _will_create_new_session_automatically = false; add_route_dialog = 0; route_params = 0; bundle_manager = 0; @@ -221,9 +207,6 @@ ARDOUR_UI::ARDOUR_UI (int *argcp, char **argvp[]) original_big_clock_height = -1; original_big_clock_font_size = 0; - roll_button.set_elements (ArdourButton::Element (ArdourButton::Body|ArdourButton::Text)); - play_selection_button.set_elements (ArdourButton::Element (ArdourButton::Body|ArdourButton::Text)); - roll_button.set_controllable (roll_controllable); stop_button.set_controllable (stop_controllable); goto_start_button.set_controllable (goto_start_controllable); @@ -253,7 +236,7 @@ ARDOUR_UI::ARDOUR_UI (int *argcp, char **argvp[]) /* handle dialog requests */ - ARDOUR::Session::Dialog.connect (forever_connections, MISSING_INVALIDATOR, ui_bind (&ARDOUR_UI::session_dialog, this, _1), gui_context()); + ARDOUR::Session::Dialog.connect (forever_connections, MISSING_INVALIDATOR, boost::bind (&ARDOUR_UI::session_dialog, this, _1), gui_context()); /* handle pending state with a dialog (PROBLEM: needs to return a value and thus cannot be x-thread) */ @@ -265,12 +248,12 @@ ARDOUR_UI::ARDOUR_UI (int *argcp, char **argvp[]) /* handle requests to quit (coming from JACK session) */ - ARDOUR::Session::Quit.connect (forever_connections, MISSING_INVALIDATOR, ui_bind (&ARDOUR_UI::finish, this), gui_context ()); + ARDOUR::Session::Quit.connect (forever_connections, MISSING_INVALIDATOR, boost::bind (&ARDOUR_UI::finish, this), gui_context ()); /* tell the user about feedback */ - ARDOUR::Session::FeedbackDetected.connect (forever_connections, MISSING_INVALIDATOR, ui_bind (&ARDOUR_UI::feedback_detected, this), gui_context ()); - ARDOUR::Session::SuccessfulGraphSort.connect (forever_connections, MISSING_INVALIDATOR, ui_bind (&ARDOUR_UI::successful_graph_sort, this), gui_context ()); + ARDOUR::Session::FeedbackDetected.connect (forever_connections, MISSING_INVALIDATOR, boost::bind (&ARDOUR_UI::feedback_detected, this), gui_context ()); + ARDOUR::Session::SuccessfulGraphSort.connect (forever_connections, MISSING_INVALIDATOR, boost::bind (&ARDOUR_UI::successful_graph_sort, this), gui_context ()); /* handle requests to deal with missing files */ @@ -283,16 +266,13 @@ ARDOUR_UI::ARDOUR_UI (int *argcp, char **argvp[]) /* lets get this party started */ try { - if (ARDOUR::init (ARDOUR_COMMAND_LINE::use_vst, ARDOUR_COMMAND_LINE::try_hw_optimization)) { + if (ARDOUR::init (ARDOUR_COMMAND_LINE::use_vst, ARDOUR_COMMAND_LINE::try_hw_optimization, localedir)) { throw failed_constructor (); } setup_gtk_ardour_enums (); setup_profile (); - GainMeter::setup_slider_pix (); - RouteTimeAxisView::setup_slider_pix (); - ProcessorEntry::setup_slider_pix (); SessionEvent::create_per_thread_pool ("GUI", 512); } catch (failed_constructor& err) { @@ -346,36 +326,6 @@ ARDOUR_UI::ARDOUR_UI (int *argcp, char **argvp[]) DPIReset.connect (sigc::mem_fun (*this, &ARDOUR_UI::resize_text_widgets)); } -/** @return true if a session was chosen and `apply' clicked, otherwise false if `cancel' was clicked */ -bool -ARDOUR_UI::run_startup (bool should_be_new, string load_template) -{ - delete _startup; - _startup = new ArdourStartup (); - - XMLNode* audio_setup = Config->extra_xml ("AudioSetup"); - - if (audio_setup && _startup->engine_control()) { - _startup->engine_control()->set_state (*audio_setup); - } - - _startup->set_new_only (should_be_new); - if (!load_template.empty()) { - _startup->set_load_template( load_template ); - } - _startup->present (); - - main().run(); - - _startup->hide (); - - switch (_startup->response()) { - case RESPONSE_OK: - return true; - default: - return false; - } -} int ARDOUR_UI::create_engine () @@ -398,7 +348,7 @@ ARDOUR_UI::create_engine () engine->Stopped.connect (forever_connections, MISSING_INVALIDATOR, boost::bind (&ARDOUR_UI::engine_stopped, this), gui_context()); engine->Running.connect (forever_connections, MISSING_INVALIDATOR, boost::bind (&ARDOUR_UI::engine_running, this), gui_context()); - engine->SampleRateChanged.connect (forever_connections, MISSING_INVALIDATOR, ui_bind (&ARDOUR_UI::update_sample_rate, this, _1), gui_context()); + engine->SampleRateChanged.connect (forever_connections, MISSING_INVALIDATOR, boost::bind (&ARDOUR_UI::update_sample_rate, this, _1), gui_context()); engine->Halted.connect_same_thread (forever_connections, boost::bind (&ARDOUR_UI::engine_halted, this, _1, false)); @@ -449,7 +399,7 @@ ARDOUR_UI::post_engine () vector::iterator n; vector::iterator k; for (n = names.begin(), k = keys.begin(); n != names.end(); ++n, ++k) { - cerr << "Action: " << (*n) << " bound to " << (*k) << endl; + cout << "Action: " << (*n) << " bound to " << (*k) << endl; } exit (0); @@ -477,14 +427,15 @@ ARDOUR_UI::post_engine () #ifndef GTKOSX /* OS X provides a nearly-always visible wallclock, so don't be stupid */ update_wall_clock (); - Glib::signal_timeout().connect (sigc::mem_fun(*this, &ARDOUR_UI::update_wall_clock), 60000); + Glib::signal_timeout().connect_seconds (sigc::mem_fun(*this, &ARDOUR_UI::update_wall_clock), 1); #endif update_disk_space (); update_cpu_load (); update_sample_rate (engine->frame_rate()); + update_timecode_format (); - Config->ParameterChanged.connect (forever_connections, MISSING_INVALIDATOR, ui_bind (&ARDOUR_UI::parameter_changed, this, _1), gui_context()); + Config->ParameterChanged.connect (forever_connections, MISSING_INVALIDATOR, boost::bind (&ARDOUR_UI::parameter_changed, this, _1), gui_context()); boost::function pc (boost::bind (&ARDOUR_UI::parameter_changed, this, _1)); Config->map_parameters (pc); @@ -531,7 +482,6 @@ ARDOUR_UI::configure_timeout () return true; } else { have_configure_timeout = false; - cerr << "config event-driven save\n"; save_ardour_state (); return false; } @@ -579,7 +529,6 @@ ARDOUR_UI::set_transport_controllable_state (const XMLNode& node) if ((prop = node.property ("shuttle")) != 0) { shuttle_box->controllable()->set_id (prop->value()); } - } XMLNode& @@ -651,59 +600,6 @@ ARDOUR_UI::update_autosave () } } -void -ARDOUR_UI::backend_audio_error (bool we_set_params, Gtk::Window* toplevel) -{ - string title; - if (we_set_params) { - title = string_compose (_("%1 could not start JACK"), PROGRAM_NAME); - } else { - title = string_compose (_("%1 could not connect to JACK."), PROGRAM_NAME); - } - - MessageDialog win (title, - false, - Gtk::MESSAGE_INFO, - Gtk::BUTTONS_NONE); - - if (we_set_params) { - win.set_secondary_text(_("There are several possible reasons:\n\ -\n\ -1) You requested audio parameters that are not supported..\n\ -2) JACK is running as another user.\n\ -\n\ -Please consider the possibilities, and perhaps try different parameters.")); - } else { - win.set_secondary_text(_("There are several possible reasons:\n\ -\n\ -1) JACK is not running.\n\ -2) JACK is running as another user, perhaps root.\n\ -3) There is already another client called \"ardour\".\n\ -\n\ -Please consider the possibilities, and perhaps (re)start JACK.")); - } - - if (toplevel) { - win.set_transient_for (*toplevel); - } - - if (we_set_params) { - win.add_button (Stock::OK, RESPONSE_CLOSE); - } else { - win.add_button (Stock::QUIT, RESPONSE_CLOSE); - } - - win.set_default_response (RESPONSE_CLOSE); - - win.show_all (); - win.set_position (Gtk::WIN_POS_CENTER); - pop_back_splash (win); - - /* we just don't care about the result, but we want to block */ - - win.run (); -} - void ARDOUR_UI::startup () { @@ -765,8 +661,14 @@ ARDOUR_UI::check_memory_locking () struct rlimit limits; int64_t ram; long pages, page_size; - - if ((page_size = sysconf (_SC_PAGESIZE)) < 0 ||(pages = sysconf (_SC_PHYS_PAGES)) < 0) { +#ifdef __FreeBSD__ + size_t pages_len=sizeof(pages); + if ((page_size = getpagesize()) < 0 || + sysctlbyname("hw.availpages", &pages, &pages_len, NULL, 0)) +#else + if ((page_size = sysconf (_SC_PAGESIZE)) < 0 ||(pages = sysconf (_SC_PHYS_PAGES)) < 0) +#endif + { ram = 0; } else { ram = (int64_t) pages * (int64_t) page_size; @@ -786,15 +688,23 @@ ARDOUR_UI::check_memory_locking () "This might cause %1 to run out of memory before your system " "runs out of memory. \n\n" "You can view the memory limit with 'ulimit -l', " - "and it is normally controlled by /etc/security/limits.conf"), - PROGRAM_NAME).c_str()); + "and it is normally controlled by %2"), + PROGRAM_NAME).c_str(), +#ifdef __FreeBSD__ + X_("/etc/login.conf") +#else + X_(" /etc/security/limits.conf") +#endif + ); + + msg.set_default_response (RESPONSE_OK); VBox* vbox = msg.get_vbox(); HBox hbox; CheckButton cb (_("Do not show this window again")); cb.signal_toggled().connect (sigc::mem_fun (*this, &ARDOUR_UI::no_memory_warning)); - + hbox.pack_start (cb, true, false); vbox->pack_start (hbox); cb.show(); @@ -829,12 +739,6 @@ void ARDOUR_UI::finish() { if (_session) { - int tries = 0; - - if (_session->transport_rolling() && (++tries < 8)) { - _session->request_stop (false, true); - usleep (10000); - } if (_session->dirty()) { vector actions; @@ -850,10 +754,10 @@ ARDOUR_UI::finish() if (save_state_canfail ("")) { /* failed - don't quit */ MessageDialog msg (*editor, - _("\ -Ardour was unable to save your session.\n\n\ + string_compose (_("\ +%1 was unable to save your session.\n\n\ If you still wish to quit, please use the\n\n\ -\"Just quit\" option.")); +\"Just quit\" option."), PROGRAM_NAME)); pop_back_splash(msg); msg.run (); return; @@ -876,6 +780,8 @@ If you still wish to quit, please use the\n\n\ */ save_ardour_state (); + loading_message (string_compose (_("Please wait while %1 cleans up..."), PROGRAM_NAME)); + if (_session) { // _session->set_deletion_in_progress (); _session->set_clean (); @@ -958,12 +864,14 @@ ARDOUR_UI::ask_about_saving_session (const vector& actions) return -1; } + gint ARDOUR_UI::every_second () { update_cpu_load (); update_buffer_load (); update_disk_space (); + update_timecode_format (); return TRUE; } @@ -993,7 +901,7 @@ ARDOUR_UI::update_sample_rate (framecnt_t) if (!engine->connected()) { - snprintf (buf, sizeof (buf), _("disconnected")); + snprintf (buf, sizeof (buf), "%s", _("disconnected")); } else { @@ -1126,16 +1034,21 @@ ARDOUR_UI::update_disk_space() return; } - framecnt_t frames = _session->available_capture_duration(); + boost::optional opt_frames = _session->available_capture_duration(); char buf[64]; framecnt_t fr = _session->frame_rate(); - if (frames == max_framecnt) { - snprintf (buf, sizeof (buf), _("Disk: 24hrs+")); + if (!opt_frames) { + /* Available space is unknown */ + snprintf (buf, sizeof (buf), "%s", _("Disk: Unknown")); + } else if (opt_frames.get_value_or (0) == max_framecnt) { + snprintf (buf, sizeof (buf), "%s", _("Disk: 24hrs+")); } else { rec_enabled_streams = 0; _session->foreach_route (this, &ARDOUR_UI::count_recenabled_streams); + framecnt_t frames = opt_frames.get_value_or (0); + if (rec_enabled_streams) { frames /= rec_enabled_streams; } @@ -1147,7 +1060,7 @@ ARDOUR_UI::update_disk_space() hrs = frames / (fr * 3600); if (hrs > 24) { - snprintf (buf, sizeof (buf), _("Disk: >24 hrs")); + snprintf (buf, sizeof (buf), "%s", _("Disk: >24 hrs")); } else { frames -= hrs * fr * 3600; mins = frames / (fr * 60); @@ -1166,44 +1079,57 @@ ARDOUR_UI::update_disk_space() } disk_space_label.set_markup (buf); +} - // An attempt to make the disk space label flash red when space has run out. +void +ARDOUR_UI::update_timecode_format () +{ + char buf[64]; - if (frames < fr * 60 * 5) { - /* disk_space_box.style ("disk_space_label_empty"); */ + if (_session) { + bool matching; + TimecodeSlave* tcslave; + SyncSource sync_src = Config->get_sync_source(); + + if ((sync_src == LTC || sync_src == MTC) && (tcslave = dynamic_cast(_session->slave())) != 0) { + matching = (tcslave->apparent_timecode_format() == _session->config.get_timecode_format()); + } else { + matching = true; + } + + snprintf (buf, sizeof (buf), S_("Timecode|TC: %s"), + matching ? X_("green") : X_("red"), + Timecode::timecode_format_name (_session->config.get_timecode_format()).c_str()); } else { - /* disk_space_box.style ("disk_space_label"); */ + snprintf (buf, sizeof (buf), "TC: n/a"); } -} + timecode_format_label.set_markup (buf); +} gint ARDOUR_UI::update_wall_clock () { time_t now; struct tm *tm_now; - char buf[16]; + static int last_min = -1; time (&now); tm_now = localtime (&now); + if (last_min != tm_now->tm_min) { + char buf[16]; + sprintf (buf, "%02d:%02d", tm_now->tm_hour, tm_now->tm_min); + wall_clock_label.set_text (buf); + last_min = tm_now->tm_min; + } - sprintf (buf, "%02d:%02d", tm_now->tm_hour, tm_now->tm_min); - wall_clock_label.set_text (buf); - - return TRUE; -} - -gint -ARDOUR_UI::session_menu (GdkEventButton */*ev*/) -{ - session_popup_menu->popup (0, 0); return TRUE; } void ARDOUR_UI::redisplay_recent_sessions () { - std::vector session_directories; + std::vector session_directories; RecentSessionsSorter cmp; recent_session_display.set_model (Glib::RefPtr(0)); @@ -1216,7 +1142,7 @@ ARDOUR_UI::redisplay_recent_sessions () recent_session_display.set_model (recent_session_model); return; } - // + // sort them alphabetically sort (rs.begin(), rs.end(), cmp); @@ -1224,10 +1150,10 @@ ARDOUR_UI::redisplay_recent_sessions () session_directories.push_back ((*i).second); } - for (vector::const_iterator i = session_directories.begin(); + for (vector::const_iterator i = session_directories.begin(); i != session_directories.end(); ++i) { - std::vector state_file_paths; + std::vector state_file_paths; // now get available states for this session @@ -1235,18 +1161,17 @@ ARDOUR_UI::redisplay_recent_sessions () vector* states; vector item; - string fullpath = (*i).to_string(); + string fullpath = *i; /* remove any trailing / */ - if (fullpath[fullpath.length()-1] == '/') { - fullpath = fullpath.substr (0, fullpath.length()-1); + if (fullpath[fullpath.length() - 1] == '/') { + fullpath = fullpath.substr (0, fullpath.length() - 1); } /* check whether session still exists */ if (!Glib::file_test(fullpath.c_str(), Glib::FILE_TEST_EXISTS)) { /* session doesn't exist */ - cerr << "skipping non-existent session " << fullpath << endl; continue; } @@ -1263,6 +1188,7 @@ ARDOUR_UI::redisplay_recent_sessions () row[recent_session_columns.visible_name] = Glib::path_get_basename (fullpath); row[recent_session_columns.fullpath] = fullpath; + row[recent_session_columns.tip] = Glib::Markup::escape_text (fullpath); if (state_file_names.size() > 1) { @@ -1276,10 +1202,12 @@ ARDOUR_UI::redisplay_recent_sessions () child_row[recent_session_columns.visible_name] = *i2; child_row[recent_session_columns.fullpath] = fullpath; + child_row[recent_session_columns.tip] = Glib::Markup::escape_text (fullpath); } } } + recent_session_display.set_tooltip_column(1); // recent_session_columns.tip recent_session_display.set_model (recent_session_model); } @@ -1309,7 +1237,6 @@ ARDOUR_UI::build_session_selector () recent_session_display.show(); scroller->show(); - //session_selector_window->get_vbox()->show(); } void @@ -1409,6 +1336,17 @@ ARDOUR_UI::open_session () open_session_selector->add_button (Gtk::Stock::CANCEL, Gtk::RESPONSE_CANCEL); open_session_selector->add_button (Gtk::Stock::OPEN, Gtk::RESPONSE_ACCEPT); open_session_selector->set_default_response(Gtk::RESPONSE_ACCEPT); + + if (_session) { + string session_parent_dir = Glib::path_get_dirname(_session->path()); + string::size_type last_dir_sep = session_parent_dir.rfind(G_DIR_SEPARATOR); + session_parent_dir = session_parent_dir.substr(0, last_dir_sep); + open_session_selector->set_current_folder(session_parent_dir); + } else { + open_session_selector->set_current_folder(Config->get_default_session_parent_dir()); + } + + open_session_selector->add_shortcut_folder (Config->get_default_session_parent_dir()); FileFilter session_filter; session_filter.add_pattern ("*.ardour"); @@ -1443,7 +1381,8 @@ ARDOUR_UI::open_session () void -ARDOUR_UI::session_add_midi_route (bool disk, RouteGroup* route_group, uint32_t how_many, const string& name_template, PluginInfoPtr instrument) +ARDOUR_UI::session_add_mixed_track (const ChanCount& input, const ChanCount& output, RouteGroup* route_group, + uint32_t how_many, const string& name_template, PluginInfoPtr instrument) { list > tracks; @@ -1453,23 +1392,11 @@ ARDOUR_UI::session_add_midi_route (bool disk, RouteGroup* route_group, uint32_t } try { - if (disk) { - - tracks = _session->new_midi_track (instrument, ARDOUR::Normal, route_group, how_many, name_template); - - 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; - } - }*/ + tracks = _session->new_midi_track (input, output, instrument, ARDOUR::Normal, route_group, how_many, name_template); + + if (tracks.size() != how_many) { + error << string_compose(P_("could not create %1 new mixed track", "could not create %1 new mixed tracks", how_many), how_many) << endmsg; + } } catch (...) { @@ -1481,7 +1408,18 @@ restart JACK with more ports."), PROGRAM_NAME)); msg.run (); } } + +void +ARDOUR_UI::session_add_midi_route (bool disk, RouteGroup* route_group, uint32_t how_many, const string& name_template, PluginInfoPtr instrument) +{ + ChanCount one_midi_channel; + one_midi_channel.set (DataType::MIDI, 1); + + if (disk) { + session_add_mixed_track (one_midi_channel, one_midi_channel, route_group, how_many, name_template, instrument); + } +} void ARDOUR_UI::session_add_audio_route ( @@ -1507,12 +1445,8 @@ ARDOUR_UI::session_add_audio_route ( tracks = _session->new_audio_track (input_channels, output_channels, mode, route_group, how_many, name_template); if (tracks.size() != how_many) { - if (how_many == 1) { - error << _("could not create a new audio track") << endmsg; - } else { - error << string_compose (_("could only create %1 of %2 new audio %3"), - tracks.size(), how_many, (track ? _("tracks") : _("busses"))) << endmsg; - } + error << string_compose (P_("could not create %1 new audio track", "could not create %1 new audio tracks", how_many), how_many) + << endmsg; } } else { @@ -1520,11 +1454,8 @@ ARDOUR_UI::session_add_audio_route ( routes = _session->new_audio_route (input_channels, output_channels, route_group, how_many, name_template); if (routes.size() != how_many) { - if (how_many == 1) { - error << _("could not create a new audio bus") << endmsg; - } else { - error << string_compose (_("could not create %1 new audio busses"), how_many) << endmsg; - } + error << string_compose (P_("could not create %1 new audio bus", "could not create %1 new audio busses", how_many), how_many) + << endmsg; } } } @@ -1540,25 +1471,6 @@ restart JACK with more ports."), PROGRAM_NAME)); } } -void -ARDOUR_UI::do_transport_locate (framepos_t new_position, bool with_roll) -{ - framecnt_t _preroll = 0; - - if (_session) { - // XXX CONFIG_CHANGE FIX - requires AnyTime handling - // _preroll = _session->convert_to_frames_at (new_position, Config->get_preroll()); - - if (new_position > _preroll) { - new_position -= _preroll; - } else { - new_position = 0; - } - - _session->request_locate (new_position, with_roll); - } -} - void ARDOUR_UI::transport_goto_start () { @@ -1651,22 +1563,6 @@ ARDOUR_UI::transport_stop () _session->request_stop (false, true); } -void -ARDOUR_UI::transport_stop_and_forget_capture () -{ - if (_session) { - _session->request_stop (true, true); - } -} - -void -ARDOUR_UI::remove_last_capture() -{ - if (editor) { - editor->remove_last_capture(); - } -} - void ARDOUR_UI::transport_record (bool roll) { @@ -1696,7 +1592,6 @@ ARDOUR_UI::transport_record (bool roll) _session->disable_record (false, true); } } - //cerr << "ARDOUR_UI::transport_record () called roll = " << roll << " _session->record_status() = " << _session->record_status() << endl; } void @@ -1712,7 +1607,7 @@ ARDOUR_UI::transport_roll () #if 0 if (_session->config.get_external_sync()) { - switch (_session->config.get_sync_source()) { + switch (Config->get_sync_source()) { case JACK: break; default: @@ -1736,15 +1631,18 @@ ARDOUR_UI::transport_roll () _session->request_play_range (0, true); } - if (Config->get_always_play_range()) { - _session->request_play_range (&editor->get_selection().time, true); - } - if (!rolling) { _session->request_transport_speed (1.0f); } } +bool +ARDOUR_UI::get_smart_mode() const +{ + return ( editor->get_smart_mode() ); +} + + void ARDOUR_UI::toggle_roll (bool with_abort, bool roll_out_of_bounded_mode) { @@ -1759,7 +1657,7 @@ ARDOUR_UI::toggle_roll (bool with_abort, bool roll_out_of_bounded_mode) } if (_session->config.get_external_sync()) { - switch (_session->config.get_sync_source()) { + switch (Config->get_sync_source()) { case JACK: break; default: @@ -1795,7 +1693,7 @@ ARDOUR_UI::toggle_roll (bool with_abort, bool roll_out_of_bounded_mode) if (rolling) { _session->request_stop (with_abort, true); } else { - if (Config->get_always_play_range ()) { + if ( Config->get_always_play_range() ) { _session->request_play_range (&editor->get_selection().time, true); } @@ -1807,7 +1705,9 @@ ARDOUR_UI::toggle_roll (bool with_abort, bool roll_out_of_bounded_mode) void ARDOUR_UI::toggle_session_auto_loop () { - if (!_session) { + Location * looploc = _session->locations()->auto_loop_location(); + + if (!_session || !looploc) { return; } @@ -1815,24 +1715,18 @@ ARDOUR_UI::toggle_session_auto_loop () if (_session->transport_rolling()) { - Location * looploc = _session->locations()->auto_loop_location(); - - if (looploc) { - _session->request_locate (looploc->start(), true); - _session->request_play_loop (false); - } + _session->request_locate (looploc->start(), true); + _session->request_play_loop (false); } else { _session->request_play_loop (false); } } else { - - Location * looploc = _session->locations()->auto_loop_location(); - - if (looploc) { - _session->request_play_loop (true); - } + _session->request_play_loop (true); } + + //show the loop markers + looploc->set_hidden (false, this); } void @@ -1845,6 +1739,15 @@ ARDOUR_UI::transport_play_selection () editor->play_selection (); } +void +ARDOUR_UI::transport_play_preroll () +{ + if (!_session) { + return; + } + editor->play_with_preroll (); +} + void ARDOUR_UI::transport_rewind (int option) { @@ -1875,35 +1778,34 @@ ARDOUR_UI::transport_rewind (int option) void ARDOUR_UI::transport_forward (int option) { - float current_transport_speed; - - if (_session) { - current_transport_speed = _session->transport_speed(); - - if (current_transport_speed <= 0.0f) { - switch (option) { - case 0: - _session->request_transport_speed (1.0f); - break; - case 1: - _session->request_transport_speed (4.0f); - break; - case -1: - _session->request_transport_speed (0.5f); - break; - } - } else { - /* speed up */ - _session->request_transport_speed (current_transport_speed * 1.5f); + if (!_session) { + return; + } + + float current_transport_speed = _session->transport_speed(); + + if (current_transport_speed <= 0.0f) { + switch (option) { + case 0: + _session->request_transport_speed (1.0f); + break; + case 1: + _session->request_transport_speed (4.0f); + break; + case -1: + _session->request_transport_speed (0.5f); + break; } - + } else { + /* speed up */ + _session->request_transport_speed (current_transport_speed * 1.5f); } } void ARDOUR_UI::toggle_record_enable (uint32_t rid) { - if (_session == 0) { + if (!_session) { return; } @@ -1917,9 +1819,6 @@ ARDOUR_UI::toggle_record_enable (uint32_t rid) t->set_record_enabled (!t->record_enabled(), this); } } - if (_session == 0) { - return; - } } void @@ -2073,10 +1972,11 @@ JACK, reconnect and save the session."), PROGRAM_NAME); MessageDialog msg (*editor, msgstr); pop_back_splash (msg); + msg.set_keep_above (true); msg.run (); - + if (free_reason) { - free ((char*) reason); + free (const_cast (reason)); } } @@ -2098,12 +1998,6 @@ ARDOUR_UI::do_engine_start () return 0; } -void -ARDOUR_UI::setup_theme () -{ - theme_manager->setup_theme(); -} - void ARDOUR_UI::update_clocks () { @@ -2124,21 +2018,8 @@ ARDOUR_UI::stop_clocking () clock_signal_connection.disconnect (); } -void -ARDOUR_UI::toggle_clocking () -{ -#if 0 - if (clock_button.get_active()) { - start_clocking (); - } else { - stop_clocking (); - } -#endif -} - gint ARDOUR_UI::_blink (void *arg) - { ((ARDOUR_UI *) arg)->blink (); return TRUE; @@ -2216,7 +2097,7 @@ ARDOUR_UI::snapshot_session (bool switch_to_it) } } - vector p; + vector p; get_state_files_in_directory (_session->session_directory().root_path(), p); vector n = get_file_names_no_extension (p); if (find (n.begin(), n.end(), snapname) != n.end()) { @@ -2530,47 +2411,9 @@ ARDOUR_UI::idle_load (const std::string& path) /* /path/to/foo/foo.ardour => /path/to/foo, foo */ load_session (Glib::path_get_dirname (path), basename_nosuffix (path)); } - } else { + } else { ARDOUR_COMMAND_LINE::session_name = path; - - /* - * new_session_dialog doens't exist in A3 - * Try to remove all references to it to - * see if it will compile. NOTE: this will - * likely cause a runtime issue is my somewhat - * uneducated guess. - */ - - //if (new_session_dialog) { - - - /* make it break out of Dialog::run() and - start again. - */ - - //new_session_dialog->response (1); - //} - } -} - -void -ARDOUR_UI::end_loading_messages () -{ - // hide_splash (); -} - -void -ARDOUR_UI::loading_message (const std::string& msg) -{ - if (ARDOUR_COMMAND_LINE::no_splash) { - return; - } - - show_splash (); - if (splash) { - splash->message (msg); - flush_pending (); } } @@ -2584,6 +2427,19 @@ ARDOUR_UI::get_session_parameters (bool quit_on_cancel, bool should_be_new, stri int ret = -1; bool likely_new = false; + /* deal with any existing DIRTY session now, rather than later. don't + * treat a non-dirty session this way, so that it stays visible + * as we bring up the new session dialog. + */ + + if (_session && _session->dirty()) { + if (unload_session (false)) { + /* unload cancelled by user */ + return 0; + } + ARDOUR_COMMAND_LINE::session_name = ""; + } + if (!load_template.empty()) { should_be_new = true; template_name = load_template; @@ -2591,7 +2447,7 @@ ARDOUR_UI::get_session_parameters (bool quit_on_cancel, bool should_be_new, stri while (ret != 0) { - if (!should_be_new && !ARDOUR_COMMAND_LINE::session_name.empty()) { + if (!ARDOUR_COMMAND_LINE::session_name.empty()) { /* if they named a specific statefile, use it, otherwise they are just giving a session folder, and we want to use it as is @@ -2608,71 +2464,82 @@ ARDOUR_UI::get_session_parameters (bool quit_on_cancel, bool should_be_new, stri session_path = ARDOUR_COMMAND_LINE::session_name; session_name = Glib::path_get_basename (ARDOUR_COMMAND_LINE::session_name); } - } else { + session_path = ""; + session_name = ""; + } - bool const apply = run_startup (should_be_new, load_template); - - if (!apply) { - if (quit_on_cancel) { - exit (1); - } else { - return ret; - } - } - - /* if we run the startup dialog again, offer more than just "new session" */ - - should_be_new = false; - - session_name = _startup->session_name (likely_new); - - string::size_type suffix = session_name.find (statefile_suffix); - - if (suffix != string::npos) { - session_name = session_name.substr (0, suffix); + delete _startup; + _startup = new ArdourStartup (should_be_new, session_name, session_path, load_template); + + if (!_startup->ready_without_display()) { + _startup->present (); + main().run(); + _startup->hide (); + } + + switch (_startup->response()) { + case RESPONSE_OK: + break; + default: + if (quit_on_cancel) { + exit (1); + } else { + return ret; } + } - /* this shouldn't happen, but we catch it just in case it does */ + /* if we run the startup dialog again, offer more than just "new session" */ + + should_be_new = false; + + session_name = _startup->session_name (likely_new); + + string::size_type suffix = session_name.find (statefile_suffix); + + if (suffix != string::npos) { + session_name = session_name.substr (0, suffix); + } + + /* this shouldn't happen, but we catch it just in case it does */ + + if (session_name.empty()) { + continue; + } + + if (_startup->use_session_template()) { + template_name = _startup->session_template_name(); + _session_is_new = true; + } + + if (session_name[0] == G_DIR_SEPARATOR || + (session_name.length() > 2 && session_name[0] == '.' && session_name[1] == G_DIR_SEPARATOR) || + (session_name.length() > 3 && session_name[0] == '.' && session_name[1] == '.' && session_name[2] == G_DIR_SEPARATOR)) { + + /* absolute path or cwd-relative path specified for session name: infer session folder + from what was given. + */ + + session_path = Glib::path_get_dirname (session_name); + session_name = Glib::path_get_basename (session_name); + + } else { - if (session_name.empty()) { + session_path = _startup->session_folder(); + + char illegal = Session::session_name_is_legal (session_name); + + if (illegal) { + MessageDialog msg (*_startup, + string_compose (_("To ensure compatibility with various systems\n" + "session names may not contain a '%1' character"), + illegal)); + msg.run (); + ARDOUR_COMMAND_LINE::session_name = ""; // cancel that continue; } - - if (_startup->use_session_template()) { - template_name = _startup->session_template_name(); - _session_is_new = true; - } - - if (session_name[0] == G_DIR_SEPARATOR || - (session_name.length() > 2 && session_name[0] == '.' && session_name[1] == G_DIR_SEPARATOR) || - (session_name.length() > 3 && session_name[0] == '.' && session_name[1] == '.' && session_name[2] == G_DIR_SEPARATOR)) { - - /* absolute path or cwd-relative path specified for session name: infer session folder - from what was given. - */ - - session_path = Glib::path_get_dirname (session_name); - session_name = Glib::path_get_basename (session_name); - - } else { - - session_path = _startup->session_folder(); - - char illegal = Session::session_name_is_legal (session_name); - - if (illegal) { - MessageDialog msg (*_startup, - string_compose (_("To ensure compatibility with various systems\n" - "session names may not contain a '%1' character"), - illegal)); - msg.run (); - ARDOUR_COMMAND_LINE::session_name = ""; // cancel that - continue; - } - } } - + if (create_engine ()) { break; } @@ -2694,25 +2561,23 @@ ARDOUR_UI::get_session_parameters (bool quit_on_cancel, bool should_be_new, stri } else { if (!likely_new) { - MessageDialog msg (string_compose (_("There is no existing session at \"%1\""), session_path)); - msg.run (); - ARDOUR_COMMAND_LINE::session_name = ""; // cancel that - continue; - } + if (_startup) { + pop_back_splash (*_startup); + } else { + hide_splash (); + } - if (session_name.find ('/') != std::string::npos) { - MessageDialog msg (*_startup, - _("To ensure compatibility with various systems\n" - "session names may not contain a '/' character")); + MessageDialog msg (string_compose (_("There is no existing session at \"%1\""), session_path)); msg.run (); ARDOUR_COMMAND_LINE::session_name = ""; // cancel that continue; } - if (session_name.find ('\\') != std::string::npos) { - MessageDialog msg (*_startup, - _("To ensure compatibility with various systems\n" - "session names may not contain a '\\' character")); + char illegal = Session::session_name_is_legal(session_name); + if (illegal) { + pop_back_splash (*_startup); + MessageDialog msg (*_startup, string_compose(_("To ensure compatibility with various systems\n" + "session names may not contain a '%1' character"), illegal)); msg.run (); ARDOUR_COMMAND_LINE::session_name = ""; // cancel that continue; @@ -2964,7 +2829,7 @@ ARDOUR_UI::show_about () { if (about == 0) { about = new About; - about->signal_response().connect(sigc::mem_fun (*this, &ARDOUR_UI::about_signal_response) ); + about->signal_response().connect (sigc::mem_fun (*this, &ARDOUR_UI::about_signal_response)); } about->set_transient_for(*editor); @@ -2980,7 +2845,7 @@ ARDOUR_UI::launch_manual () void ARDOUR_UI::launch_reference () { - PBD::open_uri("http://ardour.org/refmanual"); + PBD::open_uri ("http://ardour.org/refmanual"); } void @@ -2998,6 +2863,20 @@ ARDOUR_UI::about_signal_response (int /*response*/) hide_about(); } +void +ARDOUR_UI::loading_message (const std::string& msg) +{ + if (ARDOUR_COMMAND_LINE::no_splash) { + return; + } + + if (!splash) { + show_splash (); + } + + splash->message (msg); +} + void ARDOUR_UI::show_splash () { @@ -3005,29 +2884,22 @@ ARDOUR_UI::show_splash () try { splash = new Splash; } catch (...) { - cerr << "Splash could not be created\n"; return; } } - splash->present (); - splash->pop_front (); - splash->queue_draw (); - splash->get_window()->process_updates (true); - flush_pending (); + splash->display (); } void ARDOUR_UI::hide_splash () { - if (splash) { - splash->hide(); - } + delete splash; + splash = 0; } void -ARDOUR_UI::display_cleanup_results (ARDOUR::CleanupReport& rep, const gchar* list_title, - const string& plural_msg, const string& singular_msg) +ARDOUR_UI::display_cleanup_results (ARDOUR::CleanupReport& rep, const gchar* list_title, const bool msg_delete) { size_t removed; @@ -3083,7 +2955,7 @@ require some unused files to continue to exist.")); dimage->set_alignment(ALIGN_LEFT, ALIGN_TOP); - const string dead_directory = _session->session_directory().dead_path().to_string(); + const string dead_directory = _session->session_directory().dead_path(); /* subst: %1 - number of files removed @@ -3099,20 +2971,36 @@ require some unused files to continue to exist.")); bprefix = X_(""); space_adjusted = rep.space; } else if (rep.space < 1000000) { - bprefix = X_("kilo"); + bprefix = _("kilo"); space_adjusted = truncf((float)rep.space / 1000.0); } else if (rep.space < 1000000 * 1000) { - bprefix = X_("mega"); + bprefix = _("mega"); space_adjusted = truncf((float)rep.space / (1000.0 * 1000.0)); } else { - bprefix = X_("giga"); + bprefix = _("giga"); space_adjusted = truncf((float)rep.space / (1000.0 * 1000 * 1000.0)); } - if (removed > 1) { - txt.set_text (string_compose (plural_msg, removed, dead_directory, space_adjusted, bprefix, PROGRAM_NAME)); + if (msg_delete) { + txt.set_markup (string_compose (P_("\ +The following file was deleted from %2,\n\ +releasing %3 %4bytes of disk space", "\ +The following %1 files were deleted from %2,\n\ +releasing %3 %4bytes of disk space", removed), + removed, Glib::Markup::escape_text (dead_directory), space_adjusted, bprefix, PROGRAM_NAME)); } else { - txt.set_text (string_compose (singular_msg, removed, dead_directory, space_adjusted, bprefix, PROGRAM_NAME)); + txt.set_markup (string_compose (P_("\ +The following file was not in use and \n\ +has been moved to: %2\n\n\ +After a restart of %5\n\n\ +Session -> Clean-up -> Flush Wastebasket\n\n\ +will release an additional %3 %4bytes of disk space.\n", "\ +The following %1 files were not in use and \n\ +have been moved to: %2\n\n\ +After a restart of %5\n\n\ +Session -> Clean-up -> Flush Wastebasket\n\n\ +will release an additional %3 %4bytes of disk space.\n", removed), + removed, Glib::Markup::escape_text (dead_directory), space_adjusted, bprefix, PROGRAM_NAME)); } dhbox.pack_start (*dimage, true, false, 5); @@ -3206,26 +3094,7 @@ Clean-up will move all unused files to a \"dead\" location.")); editor->finish_cleanup (); checker.hide(); - display_cleanup_results (rep, - _("Cleaned Files"), - _("\ -The following %1 files were not in use and \n\ -have been moved to:\n\n\ -%2\n\n\ -After a restart of %5,\n\n\ -Session -> Clean-up -> Flush Wastebasket\n\n\ -will release an additional\n\ -%3 %4bytes of disk space.\n"), - _("\ -The following file was not in use and \n\ -has been moved to:\n \ -%2\n\n\ -After a restart of %5,\n\n\ -Session -> Clean-up -> Flush Wastebasket\n\n\ -will release an additional\n\ -%3 %4bytes of disk space.\n" - )); - + display_cleanup_results (rep, _("Cleaned Files"), false); } void @@ -3242,14 +3111,7 @@ ARDOUR_UI::flush_trash () return; } - display_cleanup_results (rep, - _("deleted file"), - _("The following %1 files were deleted from\n\ -%2,\n\ -releasing %3 %4bytes of disk space"), - _("The following file was deleted from\n\ -%2,\n\ -releasing %3 %4bytes of disk space")); + display_cleanup_results (rep, _("deleted file"), true); } void @@ -3290,6 +3152,12 @@ ARDOUR_UI::add_route (Gtk::Window* float_window) return; } + PBD::ScopedConnection idle_connection; + + if (count > 8) { + ARDOUR::GUIIdle.connect (idle_connection, MISSING_INVALIDATOR, boost::bind (&Gtkmm2ext::UI::flush_pending, this), gui_context()); + } + string template_path = add_route_dialog->track_template(); if (!template_path.empty()) { @@ -3297,29 +3165,38 @@ ARDOUR_UI::add_route (Gtk::Window* float_window) return; } - uint32_t input_chan = add_route_dialog->channels (); - uint32_t output_chan; + ChanCount input_chan= add_route_dialog->channels (); + ChanCount output_chan; string name_template = add_route_dialog->name_template (); PluginInfoPtr instrument = add_route_dialog->requested_instrument (); RouteGroup* route_group = add_route_dialog->route_group (); - AutoConnectOption oac = Config->get_output_auto_connect(); if (oac & AutoConnectMaster) { - output_chan = (_session->master_out() ? _session->master_out()->n_inputs().n_audio() : input_chan); + output_chan.set (DataType::AUDIO, (_session->master_out() ? _session->master_out()->n_inputs().n_audio() : input_chan.n_audio())); + output_chan.set (DataType::MIDI, 0); } else { output_chan = input_chan; } /* XXX do something with name template */ - if (add_route_dialog->midi_tracks_wanted()) { + switch (add_route_dialog->type_wanted()) { + case AddRouteDialog::AudioTrack: + session_add_audio_track (input_chan.n_audio(), output_chan.n_audio(), add_route_dialog->mode(), route_group, count, name_template); + break; + case AddRouteDialog::MidiTrack: session_add_midi_track (route_group, count, name_template, instrument); - } else if (add_route_dialog->audio_tracks_wanted()) { - session_add_audio_track (input_chan, output_chan, add_route_dialog->mode(), route_group, count, name_template); - } else { - session_add_audio_bus (input_chan, output_chan, route_group, count, name_template); + break; + case AddRouteDialog::MixedTrack: + session_add_mixed_track (input_chan, output_chan, route_group, count, name_template, instrument); + break; + case AddRouteDialog::AudioBus: + session_add_audio_bus (input_chan.n_audio(), output_chan.n_audio(), route_group, count, name_template); + break; } + + /* idle connection will end at scope end */ } XMLNode* @@ -3477,14 +3354,14 @@ ARDOUR_UI::pending_state_dialog () HBox* hbox = new HBox(); Image* image = new Image (Stock::DIALOG_QUESTION, ICON_SIZE_DIALOG); ArdourDialog dialog (_("Crash Recovery"), true); - Label message (_("\ -This session appears to have been in\n\ -middle of recording when ardour or\n\ + Label message (string_compose (_("\ +This session appears to have been in the\n\ +middle of recording when %1 or\n\ the computer was shutdown.\n\ \n\ -Ardour can recover any captured audio for\n\ +%1 can recover any captured audio for\n\ you, or it can ignore it. Please decide\n\ -what you would like to do.\n")); +what you would like to do.\n"), PROGRAM_NAME)); image->set_alignment(ALIGN_CENTER, ALIGN_TOP); hbox->pack_start (*image, PACK_EXPAND_WIDGET, 12); hbox->pack_end (message, PACK_EXPAND_PADDING, 12); @@ -3509,12 +3386,12 @@ int ARDOUR_UI::sr_mismatch_dialog (framecnt_t desired, framecnt_t actual) { HBox* hbox = new HBox(); - Image* image = new Image (Stock::DIALOG_QUESTION, ICON_SIZE_DIALOG); + Image* image = new Image (Stock::DIALOG_WARNING, ICON_SIZE_DIALOG); ArdourDialog dialog (_("Sample Rate Mismatch"), true); Label message (string_compose (_("\ -This session was created with a sample rate of %1 Hz\n\ -\n\ -The audioengine is currently running at %2 Hz\n"), desired, actual)); +This session was created with a sample rate of %1 Hz, but\n\ +%2 is currently running at %3 Hz. If you load this session,\n\ +audio may be played at the wrong sample rate.\n"), desired, PROGRAM_NAME, actual)); image->set_alignment(ALIGN_CENTER, ALIGN_TOP); hbox->pack_start (*image, PACK_EXPAND_WIDGET, 12); @@ -3541,7 +3418,7 @@ void ARDOUR_UI::disconnect_from_jack () { if (engine) { - if( engine->disconnect_from_jack ()) { + if (engine->disconnect_from_jack ()) { MessageDialog msg (*editor, _("Could not disconnect from JACK")); msg.run (); } @@ -3683,16 +3560,16 @@ ARDOUR_UI::TransportControllable::set_value (double val) action = X_("Stop"); break; case GotoStart: - action = X_("Goto Start"); + action = X_("GotoStart"); break; case GotoEnd: - action = X_("Goto End"); + action = X_("GotoEnd"); break; case AutoLoop: action = X_("Loop"); break; case PlaySelection: - action = X_("Play Selection"); + action = X_("PlaySelection"); break; case RecordEnable: action = X_("Record"); @@ -3742,11 +3619,10 @@ ARDOUR_UI::TransportControllable::get_value (void) const void ARDOUR_UI::setup_profile () { - if (gdk_screen_width() < 1200) { + if (gdk_screen_width() < 1200 || getenv ("ARDOUR_NARROW_SCREEN")) { Profile->set_small_screen (); } - if (getenv ("ARDOUR_SAE")) { Profile->set_sae (); Profile->set_single_package (); @@ -3768,11 +3644,11 @@ ARDOUR_UI::toggle_translations () bool already_enabled = !ARDOUR::translations_are_disabled (); if (ract->get_active ()) { -/* we don't care about errors */ + /* we don't care about errors */ int fd = ::open (i18n_killer.c_str(), O_RDONLY|O_CREAT, 0644); close (fd); } else { -/* we don't care about errors */ + /* we don't care about errors */ unlink (i18n_killer.c_str()); }