Basic region naming test.
[ardour.git] / gtk2_ardour / ardour_ui.cc
index 59196c75abcdec151da80efbfa5e697c56ff0349..0a4a4782d2b4f8e426f7f6aabef6e0823bf0f0d8 100644 (file)
 #include "midi++/manager.h"
 
 #include "ardour/ardour.h"
 #include "midi++/manager.h"
 
 #include "ardour/ardour.h"
-#include "ardour/callback.h"
+#include "ardour/audioengine.h"
+#include "ardour/audiofilesource.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/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/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"
 
 typedef uint64_t microseconds_t;
 
 
 typedef uint64_t microseconds_t;
 
@@ -97,6 +89,7 @@ typedef uint64_t microseconds_t;
 #include "gui_thread.h"
 #include "keyboard.h"
 #include "location_ui.h"
 #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 "missing_file_dialog.h"
 #include "missing_plugin_dialog.h"
 #include "mixer_ui.h"
@@ -121,6 +114,7 @@ using namespace ARDOUR;
 using namespace PBD;
 using namespace Gtkmm2ext;
 using namespace Gtk;
 using namespace PBD;
 using namespace Gtkmm2ext;
 using namespace Gtk;
+using namespace std;
 
 ARDOUR_UI *ARDOUR_UI::theArdourUI = 0;
 UIConfiguration *ARDOUR_UI::ui_config = 0;
 
 ARDOUR_UI *ARDOUR_UI::theArdourUI = 0;
 UIConfiguration *ARDOUR_UI::ui_config = 0;
@@ -130,15 +124,13 @@ sigc::signal<void>      ARDOUR_UI::RapidScreenUpdate;
 sigc::signal<void>      ARDOUR_UI::SuperRapidScreenUpdate;
 sigc::signal<void, framepos_t, bool, framepos_t> ARDOUR_UI::Clock;
 
 sigc::signal<void>      ARDOUR_UI::SuperRapidScreenUpdate;
 sigc::signal<void, framepos_t, bool, framepos_t> ARDOUR_UI::Clock;
 
-bool could_be_a_valid_path (const string& path);
-
 ARDOUR_UI::ARDOUR_UI (int *argcp, char **argvp[])
 
        : Gtkmm2ext::UI (PROGRAM_NAME, argcp, argvp)
 
        , gui_object_state (new GUIObjectState)
 ARDOUR_UI::ARDOUR_UI (int *argcp, char **argvp[])
 
        : 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 */
 
 
          /* big clock */
 
@@ -168,20 +160,8 @@ ARDOUR_UI::ARDOUR_UI (int *argcp, char **argvp[])
        , _feedback_exists (false)
 
 {
        , _feedback_exists (false)
 
 {
-       using namespace Gtk::Menu_Helpers;
-
        Gtkmm2ext::init();
 
        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
-
        about = 0;
        splash = 0;
        _startup = 0;
        about = 0;
        splash = 0;
        _startup = 0;
@@ -205,7 +185,6 @@ ARDOUR_UI::ARDOUR_UI (int *argcp, char **argvp[])
        big_clock_resize_in_progress = false;
        session_selector_window = 0;
        last_key_press_time = 0;
        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;
        add_route_dialog = 0;
        route_params = 0;
        bundle_manager = 0;
@@ -221,6 +200,9 @@ ARDOUR_UI::ARDOUR_UI (int *argcp, char **argvp[])
        original_big_clock_height = -1;
        original_big_clock_font_size = 0;
 
        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);
        roll_button.set_controllable (roll_controllable);
        stop_button.set_controllable (stop_controllable);
        goto_start_button.set_controllable (goto_start_controllable);
@@ -236,7 +218,6 @@ ARDOUR_UI::ARDOUR_UI (int *argcp, char **argvp[])
        auto_loop_button.set_name ("transport button");
        play_selection_button.set_name ("transport button");
        rec_button.set_name ("transport recenable button");
        auto_loop_button.set_name ("transport button");
        play_selection_button.set_name ("transport button");
        rec_button.set_name ("transport recenable button");
-       join_play_range_button.set_name ("transport button");
        midi_panic_button.set_name ("transport button");
 
        goto_start_button.set_tweaks (ArdourButton::ShowClick);
        midi_panic_button.set_name ("transport button");
 
        goto_start_button.set_tweaks (ArdourButton::ShowClick);
@@ -251,7 +232,7 @@ ARDOUR_UI::ARDOUR_UI (int *argcp, char **argvp[])
 
        /* handle dialog requests */
 
 
        /* 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) */
 
 
        /* handle pending state with a dialog (PROBLEM: needs to return a value and thus cannot be x-thread) */
 
@@ -263,12 +244,12 @@ ARDOUR_UI::ARDOUR_UI (int *argcp, char **argvp[])
 
        /* handle requests to quit (coming from JACK session) */
 
 
        /* 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 */
 
 
        /* 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 */
 
 
        /* handle requests to deal with missing files */
 
@@ -346,7 +327,7 @@ ARDOUR_UI::ARDOUR_UI (int *argcp, char **argvp[])
 
 /** @return true if a session was chosen and `apply' clicked, otherwise false if `cancel' was clicked */
 bool
 
 /** @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)
+ARDOUR_UI::run_startup (bool should_be_new, std::string load_template)
 {
        delete _startup;
        _startup = new ArdourStartup ();
 {
        delete _startup;
        _startup = new ArdourStartup ();
@@ -359,7 +340,7 @@ ARDOUR_UI::run_startup (bool should_be_new, string load_template)
 
        _startup->set_new_only (should_be_new);
        if (!load_template.empty()) {
 
        _startup->set_new_only (should_be_new);
        if (!load_template.empty()) {
-               _startup->set_load_template( load_template );
+               _startup->set_load_template (load_template);
        }
        _startup->present ();
 
        }
        _startup->present ();
 
@@ -396,7 +377,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->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));
 
 
        engine->Halted.connect_same_thread (forever_connections, boost::bind (&ARDOUR_UI::engine_halted, this, _1, false));
 
@@ -482,7 +463,7 @@ ARDOUR_UI::post_engine ()
        update_cpu_load ();
        update_sample_rate (engine->frame_rate());
 
        update_cpu_load ();
        update_sample_rate (engine->frame_rate());
 
-       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<void (string)> pc (boost::bind (&ARDOUR_UI::parameter_changed, this, _1));
        Config->map_parameters (pc);
 
        boost::function<void (string)> pc (boost::bind (&ARDOUR_UI::parameter_changed, this, _1));
        Config->map_parameters (pc);
 
@@ -529,7 +510,6 @@ ARDOUR_UI::configure_timeout ()
                return true;
        } else {
                have_configure_timeout = false;
                return true;
        } else {
                have_configure_timeout = false;
-               cerr << "config event-driven save\n";
                save_ardour_state ();
                return false;
        }
                save_ardour_state ();
                return false;
        }
@@ -577,7 +557,6 @@ ARDOUR_UI::set_transport_controllable_state (const XMLNode& node)
        if ((prop = node.property ("shuttle")) != 0) {
                shuttle_box->controllable()->set_id (prop->value());
        }
        if ((prop = node.property ("shuttle")) != 0) {
                shuttle_box->controllable()->set_id (prop->value());
        }
-
 }
 
 XMLNode&
 }
 
 XMLNode&
@@ -649,59 +628,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 ()
 {
 void
 ARDOUR_UI::startup ()
 {
@@ -848,10 +774,10 @@ ARDOUR_UI::finish()
                                if (save_state_canfail ("")) {
                                        /* failed - don't quit */
                                        MessageDialog msg (*editor,
                                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\
 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;
                                        pop_back_splash(msg);
                                        msg.run ();
                                        return;
@@ -991,7 +917,7 @@ ARDOUR_UI::update_sample_rate (framecnt_t)
 
        if (!engine->connected()) {
 
 
        if (!engine->connected()) {
 
-               snprintf (buf, sizeof (buf), _("disconnected"));
+               snprintf (buf, sizeof (buf), "%s", _("disconnected"));
 
        } else {
 
 
        } else {
 
@@ -1124,16 +1050,21 @@ ARDOUR_UI::update_disk_space()
                return;
        }
 
                return;
        }
 
-       framecnt_t frames = _session->available_capture_duration();
+       boost::optional<framecnt_t> opt_frames = _session->available_capture_duration();
        char buf[64];
        framecnt_t fr = _session->frame_rate();
 
        char buf[64];
        framecnt_t fr = _session->frame_rate();
 
-       if (frames == max_framecnt) {
-               snprintf (buf, sizeof (buf), _("Disk: <span foreground=\"green\">24hrs+</span>"));
+       if (!opt_frames) {
+               /* Available space is unknown */
+               snprintf (buf, sizeof (buf), "%s", _("Disk: <span foreground=\"green\">Unknown</span>"));
+       } else if (opt_frames.get_value_or (0) == max_framecnt) {
+               snprintf (buf, sizeof (buf), "%s", _("Disk: <span foreground=\"green\">24hrs+</span>"));
        } else {
                rec_enabled_streams = 0;
                _session->foreach_route (this, &ARDOUR_UI::count_recenabled_streams);
 
        } 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;
                }
                if (rec_enabled_streams) {
                        frames /= rec_enabled_streams;
                }
@@ -1145,7 +1076,7 @@ ARDOUR_UI::update_disk_space()
                hrs  = frames / (fr * 3600);
 
                if (hrs > 24) {
                hrs  = frames / (fr * 3600);
 
                if (hrs > 24) {
-                       snprintf (buf, sizeof (buf), _("Disk: <span foreground=\"green\">&gt;24 hrs</span>"));
+                       snprintf (buf, sizeof (buf), "%s", _("Disk: <span foreground=\"green\">&gt;24 hrs</span>"));
                } else {
                        frames -= hrs * fr * 3600;
                        mins = frames / (fr * 60);
                } else {
                        frames -= hrs * fr * 3600;
                        mins = frames / (fr * 60);
@@ -1164,15 +1095,6 @@ ARDOUR_UI::update_disk_space()
        }
 
        disk_space_label.set_markup (buf);
        }
 
        disk_space_label.set_markup (buf);
-
-       // An attempt to make the disk space label flash red when space has run out.
-
-       if (frames < fr * 60 * 5) {
-       /*      disk_space_box.style ("disk_space_label_empty"); */
-       } else {
-       /*      disk_space_box.style ("disk_space_label"); */
-       }
-
 }
 
 gint
 }
 
 gint
@@ -1191,13 +1113,6 @@ ARDOUR_UI::update_wall_clock ()
        return TRUE;
 }
 
        return TRUE;
 }
 
-gint
-ARDOUR_UI::session_menu (GdkEventButton */*ev*/)
-{
-       session_popup_menu->popup (0, 0);
-       return TRUE;
-}
-
 void
 ARDOUR_UI::redisplay_recent_sessions ()
 {
 void
 ARDOUR_UI::redisplay_recent_sessions ()
 {
@@ -1214,7 +1129,7 @@ ARDOUR_UI::redisplay_recent_sessions ()
                recent_session_display.set_model (recent_session_model);
                return;
        }
                recent_session_display.set_model (recent_session_model);
                return;
        }
-       //
+
        // sort them alphabetically
        sort (rs.begin(), rs.end(), cmp);
 
        // sort them alphabetically
        sort (rs.begin(), rs.end(), cmp);
 
@@ -1233,18 +1148,17 @@ ARDOUR_UI::redisplay_recent_sessions ()
 
                vector<string*>* states;
                vector<const gchar*> item;
 
                vector<string*>* states;
                vector<const gchar*> item;
-               string fullpath = (*i).to_string();
+               string fullpath = i->to_string();
 
                /* remove any trailing / */
 
 
                /* 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 */
                }
 
                /* 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;
                }
 
                        continue;
                }
 
@@ -1278,6 +1192,7 @@ ARDOUR_UI::redisplay_recent_sessions ()
                }
        }
 
                }
        }
 
+       recent_session_display.set_tooltip_column(1); // recent_session_columns.fullpath
        recent_session_display.set_model (recent_session_model);
 }
 
        recent_session_display.set_model (recent_session_model);
 }
 
@@ -1307,7 +1222,6 @@ ARDOUR_UI::build_session_selector ()
 
        recent_session_display.show();
        scroller->show();
 
        recent_session_display.show();
        scroller->show();
-       //session_selector_window->get_vbox()->show();
 }
 
 void
 }
 
 void
@@ -1407,6 +1321,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);
                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");
 
                FileFilter session_filter;
                session_filter.add_pattern ("*.ardour");
@@ -1463,11 +1388,7 @@ ARDOUR_UI::session_add_midi_route (bool disk, RouteGroup* route_group, uint32_t
                                }
                        }
                        
                                }
                        }
                        
-               } /*else {
-                       if ((route = _session->new_midi_route ()) == 0) {
-                               error << _("could not create new midi bus") << endmsg;
-                       }
-               }*/
+               }
        }
 
        catch (...) {
        }
 
        catch (...) {
@@ -1538,25 +1459,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 ()
 {
 void
 ARDOUR_UI::transport_goto_start ()
 {
@@ -1649,22 +1551,6 @@ ARDOUR_UI::transport_stop ()
        _session->request_stop (false, true);
 }
 
        _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)
 {
 void
 ARDOUR_UI::transport_record (bool roll)
 {
@@ -1694,7 +1580,6 @@ ARDOUR_UI::transport_record (bool roll)
                        _session->disable_record (false, true);
                }
        }
                        _session->disable_record (false, true);
                }
        }
-       //cerr << "ARDOUR_UI::transport_record () called roll = " << roll << " _session->record_status() = " << _session->record_status() << endl;
 }
 
 void
 }
 
 void
@@ -1805,7 +1690,9 @@ ARDOUR_UI::toggle_roll (bool with_abort, bool roll_out_of_bounded_mode)
 void
 ARDOUR_UI::toggle_session_auto_loop ()
 {
 void
 ARDOUR_UI::toggle_session_auto_loop ()
 {
-       if (!_session) {
+       Location * looploc = _session->locations()->auto_loop_location();
+
+       if (!_session || !looploc) {
                return;
        }
 
                return;
        }
 
@@ -1813,24 +1700,18 @@ ARDOUR_UI::toggle_session_auto_loop ()
 
                if (_session->transport_rolling()) {
 
 
                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 {
 
                } 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
 }
 
 void
@@ -1873,35 +1754,34 @@ ARDOUR_UI::transport_rewind (int option)
 void
 ARDOUR_UI::transport_forward (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)
 {
        }
 }
 
 void
 ARDOUR_UI::toggle_record_enable (uint32_t rid)
 {
-       if (_session == 0) {
+       if (!_session) {
                return;
        }
 
                return;
        }
 
@@ -1915,9 +1795,6 @@ ARDOUR_UI::toggle_record_enable (uint32_t rid)
                        t->set_record_enabled (!t->record_enabled(), this);
                }
        }
                        t->set_record_enabled (!t->record_enabled(), this);
                }
        }
-       if (_session == 0) {
-               return;
-       }
 }
 
 void
 }
 
 void
@@ -1927,7 +1804,7 @@ ARDOUR_UI::map_transport_state ()
                auto_loop_button.unset_active_state ();
                play_selection_button.unset_active_state ();
                roll_button.unset_active_state ();
                auto_loop_button.unset_active_state ();
                play_selection_button.unset_active_state ();
                roll_button.unset_active_state ();
-               stop_button.set_active_state (Gtkmm2ext::Active);
+               stop_button.set_active_state (Gtkmm2ext::ExplicitActive);
                return;
        }
 
                return;
        }
 
@@ -1941,37 +1818,37 @@ ARDOUR_UI::map_transport_state ()
 
                if (_session->get_play_range()) {
 
 
                if (_session->get_play_range()) {
 
-                       play_selection_button.set_active_state (Gtkmm2ext::Active);
+                       play_selection_button.set_active_state (Gtkmm2ext::ExplicitActive);
                        roll_button.unset_active_state ();
                        auto_loop_button.unset_active_state ();
 
                } else if (_session->get_play_loop ()) {
 
                        roll_button.unset_active_state ();
                        auto_loop_button.unset_active_state ();
 
                } else if (_session->get_play_loop ()) {
 
-                       auto_loop_button.set_active_state (Gtkmm2ext::Active);
-                       play_selection_button.unset_active_state ();
-                       roll_button.unset_active_state ();
+                       auto_loop_button.set_active (true);
+                       play_selection_button.set_active (false);
+                       roll_button.set_active (false);
 
                } else {
 
 
                } else {
 
-                       roll_button.set_active_state (Gtkmm2ext::Active);
-                       play_selection_button.unset_active_state ();
-                       auto_loop_button.unset_active_state ();
+                       roll_button.set_active (true);
+                       play_selection_button.set_active (false);
+                       auto_loop_button.set_active (false);
                }
 
                if (Config->get_always_play_range()) {
                        /* light up both roll and play-selection if they are joined */
                }
 
                if (Config->get_always_play_range()) {
                        /* light up both roll and play-selection if they are joined */
-                       roll_button.set_active_state (Gtkmm2ext::Active);
-                       play_selection_button.set_active_state (Gtkmm2ext::Active);
+                       roll_button.set_active (true);
+                       play_selection_button.set_active (true);
                }
 
                }
 
-               stop_button.unset_active_state ();
+               stop_button.set_active (false);
 
        } else {
 
 
        } else {
 
-               stop_button.set_active_state (Gtkmm2ext::Active);
-               roll_button.unset_active_state ();
-               play_selection_button.unset_active_state ();
-               auto_loop_button.unset_active_state ();
+               stop_button.set_active (true);
+               roll_button.set_active (false);
+               play_selection_button.set_active (false);
+               auto_loop_button.set_active (false);
                update_disk_space ();
        }
 }
                update_disk_space ();
        }
 }
@@ -2096,12 +1973,6 @@ ARDOUR_UI::do_engine_start ()
        return 0;
 }
 
        return 0;
 }
 
-void
-ARDOUR_UI::setup_theme ()
-{
-       theme_manager->setup_theme();
-}
-
 void
 ARDOUR_UI::update_clocks ()
 {
 void
 ARDOUR_UI::update_clocks ()
 {
@@ -2122,21 +1993,8 @@ ARDOUR_UI::stop_clocking ()
        clock_signal_connection.disconnect ();
 }
 
        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)
 gint
 ARDOUR_UI::_blink (void *arg)
-
 {
        ((ARDOUR_UI *) arg)->blink ();
        return TRUE;
 {
        ((ARDOUR_UI *) arg)->blink ();
        return TRUE;
@@ -2382,12 +2240,12 @@ ARDOUR_UI::transport_rec_enable_blink (bool onoff)
 
        if (r == Session::Enabled || (r == Session::Recording && !h)) {
                if (onoff) {
 
        if (r == Session::Enabled || (r == Session::Recording && !h)) {
                if (onoff) {
-                       rec_button.set_active_state (Active);
+                       rec_button.set_active_state (Gtkmm2ext::ExplicitActive);
                } else {
                } else {
-                       rec_button.set_active_state (Mid);
+                       rec_button.set_active_state (Gtkmm2ext::ImplicitActive);
                }
        } else if (r == Session::Recording && h) {
                }
        } else if (r == Session::Recording && h) {
-               rec_button.set_active_state (Mid);
+               rec_button.set_active_state (Gtkmm2ext::ExplicitActive);
        } else {
                rec_button.unset_active_state ();
        }
        } else {
                rec_button.unset_active_state ();
        }
@@ -2528,36 +2386,12 @@ 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));
                }
                        /* /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;
                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)
 {
 void
 ARDOUR_UI::loading_message (const std::string& msg)
 {
@@ -2692,25 +2526,23 @@ ARDOUR_UI::get_session_parameters (bool quit_on_cancel, bool should_be_new, stri
                } else {
 
                        if (!likely_new) {
                } 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;
                        }
 
                                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;
                                msg.run ();
                                ARDOUR_COMMAND_LINE::session_name = ""; // cancel that
                                continue;
@@ -2962,7 +2794,7 @@ ARDOUR_UI::show_about ()
 {
        if (about == 0) {
                about = new 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);
        }
 
        about->set_transient_for(*editor);
@@ -3003,7 +2835,6 @@ ARDOUR_UI::show_splash ()
                try {
                        splash = new Splash;
                } catch (...) {
                try {
                        splash = new Splash;
                } catch (...) {
-                       cerr << "Splash could not be created\n";
                        return;
                }
        }
                        return;
                }
        }
@@ -3018,9 +2849,8 @@ ARDOUR_UI::show_splash ()
 void
 ARDOUR_UI::hide_splash ()
 {
 void
 ARDOUR_UI::hide_splash ()
 {
-       if (splash) {
-               splash->hide();
-       }
+        delete splash;
+        splash = 0;
 }
 
 void
 }
 
 void
@@ -3108,9 +2938,9 @@ require some unused files to continue to exist."));
        }
 
        if (removed > 1) {
        }
 
        if (removed > 1) {
-               txt.set_text (string_compose (plural_msg, removed, dead_directory, space_adjusted, bprefix));
+               txt.set_text (string_compose (plural_msg, removed, dead_directory, space_adjusted, bprefix, PROGRAM_NAME));
        } else {
        } else {
-               txt.set_text (string_compose (singular_msg, removed, dead_directory, space_adjusted, bprefix));
+               txt.set_text (string_compose (singular_msg, removed, dead_directory, space_adjusted, bprefix, PROGRAM_NAME));
        }
 
        dhbox.pack_start (*dimage, true, false, 5);
        }
 
        dhbox.pack_start (*dimage, true, false, 5);
@@ -3210,7 +3040,7 @@ Clean-up will move all unused files to a \"dead\" location."));
 The following %1 files were not in use and \n\
 have been moved to:\n\n\
 %2\n\n\
 The following %1 files were not in use and \n\
 have been moved to:\n\n\
 %2\n\n\
-After a restart of Ardour,\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"),
 Session -> Clean-up -> Flush Wastebasket\n\n\
 will release an additional\n\
 %3 %4bytes of disk space.\n"),
@@ -3218,7 +3048,7 @@ will release an additional\n\
 The following file was not in use and \n\
 has been moved to:\n                           \
 %2\n\n\
 The following file was not in use and \n\
 has been moved to:\n                           \
 %2\n\n\
-After a restart of Ardour,\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"
 Session -> Clean-up -> Flush Wastebasket\n\n\
 will release an additional\n\
 %3 %4bytes of disk space.\n"
@@ -3475,14 +3305,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);
        HBox* hbox = new HBox();
        Image* image = new Image (Stock::DIALOG_QUESTION, ICON_SIZE_DIALOG);
        ArdourDialog dialog (_("Crash Recovery"), true);
-       Label  message (_("\
+       Label  message (string_compose (_("\
 This session appears to have been in\n\
 middle of recording when ardour or\n\
 the computer was shutdown.\n\
 \n\
 This session appears to have been in\n\
 middle of recording when ardour 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\
 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);
        image->set_alignment(ALIGN_CENTER, ALIGN_TOP);
        hbox->pack_start (*image, PACK_EXPAND_WIDGET, 12);
        hbox->pack_end (message, PACK_EXPAND_PADDING, 12);
@@ -3510,9 +3340,9 @@ ARDOUR_UI::sr_mismatch_dialog (framecnt_t desired, framecnt_t actual)
        Image* image = new Image (Stock::DIALOG_QUESTION, ICON_SIZE_DIALOG);
        ArdourDialog dialog (_("Sample Rate Mismatch"), true);
        Label  message (string_compose (_("\
        Image* image = new Image (Stock::DIALOG_QUESTION, 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);
 
        image->set_alignment(ALIGN_CENTER, ALIGN_TOP);
        hbox->pack_start (*image, PACK_EXPAND_WIDGET, 12);
@@ -3539,7 +3369,7 @@ void
 ARDOUR_UI::disconnect_from_jack ()
 {
        if (engine) {
 ARDOUR_UI::disconnect_from_jack ()
 {
        if (engine) {
-               ifengine->disconnect_from_jack ()) {
+               if (engine->disconnect_from_jack ()) {
                        MessageDialog msg (*editor, _("Could not disconnect from JACK"));
                        msg.run ();
                }
                        MessageDialog msg (*editor, _("Could not disconnect from JACK"));
                        msg.run ();
                }
@@ -3598,7 +3428,7 @@ ARDOUR_UI::step_edit_status_change (bool yn)
        // we make insensitive
 
        if (yn) {
        // we make insensitive
 
        if (yn) {
-               rec_button.set_active_state (Mid);
+               rec_button.set_active_state (Gtkmm2ext::ImplicitActive);
                rec_button.set_sensitive (false);
        } else {
                rec_button.unset_active_state ();;
                rec_button.set_sensitive (false);
        } else {
                rec_button.unset_active_state ();;
@@ -3740,11 +3570,10 @@ ARDOUR_UI::TransportControllable::get_value (void) const
 void
 ARDOUR_UI::setup_profile ()
 {
 void
 ARDOUR_UI::setup_profile ()
 {
-       if (gdk_screen_width() < 1200) {
+       if (gdk_screen_width() < 1200 || getenv ("ARDOUR_NARROW_SCREEN")) {
                Profile->set_small_screen ();
        }
 
                Profile->set_small_screen ();
        }
 
-
        if (getenv ("ARDOUR_SAE")) {
                Profile->set_sae ();
                Profile->set_single_package ();
        if (getenv ("ARDOUR_SAE")) {
                Profile->set_sae ();
                Profile->set_single_package ();
@@ -3766,11 +3595,11 @@ ARDOUR_UI::toggle_translations ()
                        bool already_enabled = !ARDOUR::translations_are_disabled ();
 
                        if (ract->get_active ()) {
                        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 {
                                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());
                        }
 
                                unlink (i18n_killer.c_str());
                        }