notably modify the design and logic of the startup dialog, so that we can handle...
authorPaul Davis <paul@linuxaudiosystems.com>
Thu, 8 Nov 2012 15:54:16 +0000 (15:54 +0000)
committerPaul Davis <paul@linuxaudiosystems.com>
Thu, 8 Nov 2012 15:54:16 +0000 (15:54 +0000)
git-svn-id: svn://localhost/ardour2/branches/3.0@13397 d708f5d6-7413-0410-9779-e7cbd77b26cf

gtk2_ardour/ardour_ui.cc
gtk2_ardour/engine_dialog.cc
gtk2_ardour/engine_dialog.h
gtk2_ardour/startup.cc
gtk2_ardour/startup.h

index 37343c1e1822f160af7bacc5273498b7e1bab11c..143d6219878b4b44f36f508ac7d7a3c082d681d9 100644 (file)
@@ -329,37 +329,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, std::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 ()
 {
@@ -2458,7 +2427,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
@@ -2475,71 +2444,79 @@ 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 {
-
-                       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;
                }
index 615e79e184402b39d53a86a2a871f5f327671c67..f0121f5f421175e20ea1e3f064e1b82baaa8c77a 100644 (file)
@@ -44,6 +44,8 @@
 #include <gtkmm/stock.h>
 #include <gtkmm2ext/utils.h>
 
+#include "ardour/rc_configuration.h"
+
 #include "pbd/convert.h"
 #include "pbd/error.h"
 #include "pbd/pathscanner.h"
@@ -364,6 +366,14 @@ EngineControl::EngineControl ()
 
        set_border_width (12);
        pack_start (notebook);
+
+       /* Pick up any existing audio setup configuration, if appropriate */
+
+       XMLNode* audio_setup = ARDOUR::Config->extra_xml ("AudioSetup");
+       
+       if (audio_setup) {
+               set_state (*audio_setup);
+       }
 }
 
 EngineControl::~EngineControl ()
@@ -579,13 +589,21 @@ EngineControl::build_command_line (vector<string>& cmd)
        }
 }
 
+bool
+EngineControl::need_setup ()
+{
+       return !engine_running();
+}
+
 bool
 EngineControl::engine_running ()
 {
         EnvironmentalProtectionAgency* global_epa = EnvironmentalProtectionAgency::get_global_epa ();
         boost::scoped_ptr<EnvironmentalProtectionAgency> current_epa;
 
-        /* revert all environment settings back to whatever they were when ardour started
+        /* revert all environment settings back to whatever they were when
+        * ardour started, because ardour's startup script may have reset
+        * something in ways that interfere with finding/starting JACK.
          */
 
         if (global_epa) {
index da132cfb4602ee27206efd48101ae5f526e6bf1a..0d7ce29b469f05071a02d8443a5ec5d4b4856adb 100644 (file)
@@ -39,7 +39,7 @@ class EngineControl : public Gtk::VBox {
        EngineControl ();
        ~EngineControl ();
 
-       static bool engine_running ();
+       static bool need_setup ();
        int setup_engine ();
 
        bool was_used() const { return _used; }
@@ -95,6 +95,8 @@ class EngineControl : public Gtk::VBox {
 
        bool _used;
 
+        static bool engine_running ();
+
        void driver_changed ();
        void build_command_line (std::vector<std::string>&);
 
index cab8f6b83c1ce71efbbcc43c6e7b66af1e98561f..6fc68ea1e41a03c440d54c4e48e196ed5737fd28 100644 (file)
@@ -63,97 +63,112 @@ static string poor_mans_glob (string path)
 }
 
 
-ArdourStartup::ArdourStartup ()
+ArdourStartup::ArdourStartup (bool require_new, const std::string& session_name, const std::string& session_path, const std::string& template_name)
        : _response (RESPONSE_OK)
+       , config_modified (false)
+       , new_only (require_new)
+       , default_dir_chooser (0)
        , ic_new_session_button (_("Create a new session"))
        , ic_existing_session_button (_("Open an existing session"))
        , monitor_via_hardware_button (_("Use an external mixer or the hardware mixer of your audio interface.\n\
 Ardour will play NO role in monitoring"))
        , monitor_via_ardour_button (string_compose (_("Ask %1 to play back material as it is being recorded"), PROGRAM_NAME))
+       , engine_dialog (0)
        , new_folder_chooser (FILE_CHOOSER_ACTION_SELECT_FOLDER)
        , more_new_session_options_button (_("I'd like more options for this session"))
        , _output_limit_count_adj (1, 0, 100, 1, 10, 0)
        , _input_limit_count_adj (1, 0, 100, 1, 10, 0)
        , _master_bus_channel_count_adj (2, 0, 100, 1, 10, 0)
+       , audio_page_index (-1)
+       , new_user_page_index (-1)
+       , default_folder_page_index (-1)
+       , monitoring_page_index (-1)
+       , session_page_index (-1)
+       , initial_choice_index (-1)
+       , final_page_index (-1)
+       , session_options_page_index (-1)
        , _existing_session_chooser_used (false)
 {
-       audio_page_index = -1;
-       initial_choice_index = -1;
-       new_user_page_index = -1;
-       default_folder_page_index = -1;
-       monitoring_page_index = -1;
-       session_page_index = -1;
-       final_page_index = -1;
-       session_options_page_index = -1;
-       new_only = false;
-
-       engine_dialog = 0;
-       config_modified = false;
-       default_dir_chooser = 0;
-
-       use_template_button.set_group (session_template_group);
-       use_session_as_template_button.set_group (session_template_group);
-
-       set_keep_above (true);
-       set_position (WIN_POS_CENTER);
-       set_border_width (12);
-
-       if ((icon_pixbuf = ::get_icon ("ardour_icon_48px")) == 0) {
-               throw failed_constructor();
-       }
-
-       list<Glib::RefPtr<Gdk::Pixbuf> > window_icons;
-       Glib::RefPtr<Gdk::Pixbuf> icon;
-
-       if ((icon = ::get_icon ("ardour_icon_16px")) != 0) {
-               window_icons.push_back (icon);
-       }
-       if ((icon = ::get_icon ("ardour_icon_22px")) != 0) {
-               window_icons.push_back (icon);
-       }
-       if ((icon = ::get_icon ("ardour_icon_32px")) != 0) {
-               window_icons.push_back (icon);
-       }
-       if ((icon = ::get_icon ("ardour_icon_48px")) != 0) {
-               window_icons.push_back (icon);
-       }
-       if (!window_icons.empty ()) {
-               set_default_icon_list (window_icons);
-       }
-
-       new_user = !Glib::file_test(been_here_before_path(), Glib::FILE_TEST_EXISTS);
+       new_user = !Glib::file_test (been_here_before_path(), Glib::FILE_TEST_EXISTS);
+       need_audio_setup = EngineControl::need_setup ();
+       need_session_info = (session_name.empty() || require_new);
 
-       bool need_audio_setup = !EngineControl::engine_running();
-
-        // setup_prerelease_page ();
+       _provided_session_name = session_name;
+       _provided_session_path = session_path;
+       
+       if (need_audio_setup || need_session_info || new_user) {
 
-       if (new_user) {
+               use_template_button.set_group (session_template_group);
+               use_session_as_template_button.set_group (session_template_group);
                
-               setup_new_user_page ();
-               setup_first_time_config_page ();
-               setup_monitoring_choice_page ();
-               setup_monitor_section_choice_page ();
-
-               if (need_audio_setup) {
-                       setup_audio_page ();
+               set_keep_above (true);
+               set_position (WIN_POS_CENTER);
+               set_border_width (12);
+               
+               if ((icon_pixbuf = ::get_icon ("ardour_icon_48px")) == 0) {
+                       throw failed_constructor();
                }
-
-               ic_new_session_button.set_active (true); // always create new session on first run
-
-       } else {
-
-               if (need_audio_setup) {
-                       setup_audio_page ();
+               
+               list<Glib::RefPtr<Gdk::Pixbuf> > window_icons;
+               Glib::RefPtr<Gdk::Pixbuf> icon;
+               
+               if ((icon = ::get_icon ("ardour_icon_16px")) != 0) {
+                       window_icons.push_back (icon);
+               }
+               if ((icon = ::get_icon ("ardour_icon_22px")) != 0) {
+                       window_icons.push_back (icon);
+               }
+               if ((icon = ::get_icon ("ardour_icon_32px")) != 0) {
+                       window_icons.push_back (icon);
+               }
+               if ((icon = ::get_icon ("ardour_icon_48px")) != 0) {
+                       window_icons.push_back (icon);
+               }
+               if (!window_icons.empty ()) {
+                       set_default_icon_list (window_icons);
+               }
+               
+               // setup_prerelease_page ();
+               
+               if (new_user) {
+                       
+                       setup_new_user_page ();
+                       setup_first_time_config_page ();
+                       setup_monitoring_choice_page ();
+                       setup_monitor_section_choice_page ();
+                       
+                       if (need_audio_setup) {
+                               setup_audio_page ();
+                       }
+                       
+                       ic_new_session_button.set_active (true); // always create new session on first run
+                       
+               } else {
+                       
+                       if (need_audio_setup) {
+                               setup_audio_page ();
+                       }
+                       
+                       setup_initial_choice_page ();
                }
 
-               setup_initial_choice_page ();
-       }
+               setup_session_page ();
+               setup_more_options_page ();
+               
+               if (new_user) {
+                       setup_final_page ();
+               }
 
-       setup_session_page ();
-       setup_more_options_page ();
+               if (new_only) {
+                       ic_vbox.hide ();
+               } else {
+                       ic_vbox.show ();
+               }
 
-       if (new_user) {
-               setup_final_page ();
+               if (!template_name.empty()) {
+                       use_template_button.set_active (false);
+                       load_template_override = template_name;
+               }
        }
 
        the_startup = this;
@@ -163,6 +178,12 @@ ArdourStartup::~ArdourStartup ()
 {
 }
 
+bool
+ArdourStartup::ready_without_display () const
+{
+       return !new_user && !need_audio_setup && !need_session_info;
+}
+
 void
 ArdourStartup::setup_prerelease_page ()
 {
@@ -198,25 +219,6 @@ Full information on all the above can be found on the support page at\n\
        set_page_complete (*vbox, true);
 }
 
-void
-ArdourStartup::set_new_only (bool yn)
-{
-       new_only = yn;
-
-       if (new_only) {
-               ic_vbox.hide ();
-       } else {
-               ic_vbox.show ();
-       }
-}
-
-void
-ArdourStartup::set_load_template (string load_template)
-{
-       use_template_button.set_active (false);
-       load_template_override = load_template;
-}
-
 bool
 ArdourStartup::use_session_template ()
 {
@@ -235,7 +237,7 @@ std::string
 ArdourStartup::session_template_name ()
 {
        if (!load_template_override.empty()) {
-               string the_path(ARDOUR::user_template_directory());
+               string the_path (ARDOUR::user_template_directory());
                return Glib::build_filename (the_path, load_template_override + ARDOUR::template_suffix);
        }
 
@@ -257,6 +259,10 @@ ArdourStartup::session_template_name ()
 std::string
 ArdourStartup::session_name (bool& should_be_new)
 {
+       if (ready_without_display()) {
+               return _provided_session_name;
+       }
+
        if (ic_new_session_button.get_active()) {
                should_be_new = true;
                string val = new_name_entry.get_text ();
@@ -283,6 +289,10 @@ ArdourStartup::session_name (bool& should_be_new)
 std::string
 ArdourStartup::session_folder ()
 {
+       if (ready_without_display()) {
+               return _provided_session_path;
+       }
+
        if (ic_new_session_button.get_active()) {
                std::string legal_session_folder_name = legalize_for_path (new_name_entry.get_text());
                return Glib::build_filename (new_folder_chooser.get_current_folder(), legal_session_folder_name);
index c2de96c55fc64f7eb4e0eed11795cb5ce39aa3f0..00c0a90d39de7f1a280f09a8382fc42ada9794a4 100644 (file)
@@ -45,11 +45,10 @@ class EngineControl;
 
 class ArdourStartup : public Gtk::Assistant {
   public:
-       ArdourStartup ();
+        ArdourStartup (bool require_new, const std::string& session_name, const std::string& session_path, const std::string& template_name);
        ~ArdourStartup ();
 
-       void set_new_only (bool);
-        void set_load_template( std::string load_template );
+        bool ready_without_display () const;
 
        std::string session_name (bool& should_be_new);
        std::string session_folder ();
@@ -83,7 +82,11 @@ class ArdourStartup : public Gtk::Assistant {
        gint _response;
        bool config_modified;
        bool new_user;
+        bool need_audio_setup;
+        bool need_session_info;
        bool new_only;
+        std::string _provided_session_name;
+        std::string _provided_session_path;
 
        std::string been_here_before_path () const;