fix compilation
[ardour.git] / gtk2_ardour / ardour_ui.cc
index e98e3e00a0cc3b0a7cda87f8234f0e38fdb6e8e9..43fd6bf11f97033b02ba41b9848d04fa64a367df 100644 (file)
@@ -214,6 +214,10 @@ ARDOUR_UI::ARDOUR_UI (int *argcp, char **argvp[], const char* localedir)
 
        ui_config = new UIConfiguration();
 
+       ui_config->ParameterChanged.connect (sigc::mem_fun (*this, &ARDOUR_UI::parameter_changed));
+       boost::function<void (string)> pc (boost::bind (&ARDOUR_UI::parameter_changed, this, _1));
+       ui_config->map_parameters (pc);
+
        editor = 0;
        mixer = 0;
        meterbridge = 0;
@@ -361,9 +365,6 @@ ARDOUR_UI::ARDOUR_UI (int *argcp, char **argvp[], const char* localedir)
        
        (void) theme_manager.get (true);
        
-       starting.connect (sigc::mem_fun(*this, &ARDOUR_UI::startup));
-       stopping.connect (sigc::mem_fun(*this, &ARDOUR_UI::shutdown));
-
        _process_thread = new ProcessThread ();
        _process_thread->init ();
 
@@ -438,7 +439,7 @@ ARDOUR_UI::engine_halted (const char* reason, bool free_reason)
                msgstr = string_compose (_("The audio backend was shutdown because:\n\n%1"), reason);
        } else {
                msgstr = string_compose (_("\
-`The audio backend has either been shutdown or it\n\
+The audio backend has either been shutdown or it\n\
 disconnected %1 because %1\n\
 was not fast enough. Try to restart\n\
 the audio backend and save the session."), PROGRAM_NAME);
@@ -536,6 +537,10 @@ ARDOUR_UI::post_engine ()
 
 ARDOUR_UI::~ARDOUR_UI ()
 {
+       if (ui_config->dirty()) {
+               ui_config->save_state();
+       }
+
        delete keyboard;
        delete editor;
        delete mixer;
@@ -712,11 +717,12 @@ ARDOUR_UI::check_announcements ()
 #endif
 }
 
-void
-ARDOUR_UI::startup ()
+int
+ARDOUR_UI::starting ()
 {
        Application* app = Application::instance ();
        char *nsm_url;
+       bool brand_new_user = ArdourStartup::required ();
 
        app->ShouldQuit.connect (sigc::mem_fun (*this, &ARDOUR_UI::queue_finish));
        app->ShouldLoad.connect (sigc::mem_fun (*this, &ARDOUR_UI::idle_load));
@@ -777,17 +783,17 @@ ARDOUR_UI::startup ()
                }
 
        } else  {
-
-               if (ArdourStartup::required()) {
+               
+               if (brand_new_user) {
                        ArdourStartup s;
                        s.present ();
                        main().run();
                        s.hide ();
                        switch (s.response ()) {
-                       case Gtk::RESPONSE_REJECT:
-                               exit (1);
-                       default:
+                       case Gtk::RESPONSE_OK:
                                break;
+                       default:
+                               return -1;
                        }
                }
 
@@ -795,12 +801,18 @@ ARDOUR_UI::startup ()
                 *  audio backend end up.
                 */
 
-               audio_midi_setup.get (true);
+               try {
+                       audio_midi_setup.get (true);
+               } catch (...) {
+                       return -1;
+               }
 
                /* go get a session */
 
-               if (get_session_parameters (true, ARDOUR_COMMAND_LINE::new_session, ARDOUR_COMMAND_LINE::load_template)) {
-                       exit (1);
+               const bool new_session_required = (ARDOUR_COMMAND_LINE::new_session || brand_new_user);
+
+               if (get_session_parameters (false, new_session_required, ARDOUR_COMMAND_LINE::load_template)) {
+                       return -1;
                }
        }
 
@@ -816,6 +828,7 @@ ARDOUR_UI::startup ()
        _status_bar_visibility.update ();
 
        BootMessage (string_compose (_("%1 is ready for use"), PROGRAM_NAME));
+       return 0;
 }
 
 void
@@ -2558,6 +2571,18 @@ ARDOUR_UI::get_session_parameters (bool quit_on_cancel, bool should_be_new, stri
                template_name = load_template;
        }
 
+       session_name = basename_nosuffix (ARDOUR_COMMAND_LINE::session_name);
+       session_path = ARDOUR_COMMAND_LINE::session_name;
+       
+       if (!session_path.empty()) {
+               if (Glib::file_test (session_path.c_str(), Glib::FILE_TEST_EXISTS)) {
+                       if (Glib::file_test (session_path.c_str(), Glib::FILE_TEST_IS_REGULAR)) {
+                               /* session/snapshot file, change path to be dir */
+                               session_path = Glib::path_get_dirname (session_path);
+                       }
+               }
+       }
+
        SessionDialog session_dialog (should_be_new, session_name, session_path, load_template, cancel_not_quit);
 
        while (ret != 0) {
@@ -2582,11 +2607,14 @@ ARDOUR_UI::get_session_parameters (bool quit_on_cancel, bool should_be_new, stri
                } else {
                        session_path = "";
                        session_name = "";
+                       session_dialog.clear_given ();
                }
-
+               
                if (should_be_new || session_name.empty()) {
                        /* need the dialog to get info from user */
-                       
+
+                       cerr << "run dialog\n";
+
                        switch (session_dialog.run()) {
                        case RESPONSE_ACCEPT:
                                break;
@@ -2606,7 +2634,8 @@ ARDOUR_UI::get_session_parameters (bool quit_on_cancel, bool should_be_new, stri
                should_be_new = false;
                
                session_name = session_dialog.session_name (likely_new);
-               
+               session_path = session_dialog.session_folder ();
+
                if (nsm) {
                        likely_new = true;
                }
@@ -2658,6 +2687,7 @@ ARDOUR_UI::get_session_parameters (bool quit_on_cancel, bool should_be_new, stri
        
                if (Glib::file_test (session_path, Glib::FileTest (G_FILE_TEST_EXISTS | G_FILE_TEST_IS_DIR))) {
 
+
                        if (likely_new && !nsm) {
 
                                std::string existing = Glib::build_filename (session_path, session_name);
@@ -2681,10 +2711,11 @@ ARDOUR_UI::get_session_parameters (bool quit_on_cancel, bool should_be_new, stri
                        }
 
                        char illegal = Session::session_name_is_legal(session_name);
+
                        if (illegal) {
                                pop_back_splash (session_dialog);
                                MessageDialog msg (session_dialog, string_compose(_("To ensure compatibility with various systems\n"
-                                                    "session names may not contain a '%1' character"), illegal));
+                                                                                   "session names may not contain a '%1' character"), illegal));
                                msg.run ();
                                ARDOUR_COMMAND_LINE::session_name = ""; // cancel that
                                continue;
@@ -2695,8 +2726,6 @@ ARDOUR_UI::get_session_parameters (bool quit_on_cancel, bool should_be_new, stri
 
                if (likely_new && template_name.empty()) {
 
-                       cerr << "building a session from dialog\n";
-
                        ret = build_session_from_dialog (session_dialog, session_path, session_name);
 
                } else {
@@ -2712,6 +2741,12 @@ ARDOUR_UI::get_session_parameters (bool quit_on_cancel, bool should_be_new, stri
                                _session->save_state (ARDOUR_COMMAND_LINE::immediate_save, false);
                                exit (1);
                        }
+
+                       /* clear this to avoid endless attempts to load the
+                          same session.
+                       */
+
+                       ARDOUR_COMMAND_LINE::session_name = "";
                }
        }
 
@@ -2823,6 +2858,22 @@ ARDOUR_UI::load_session (const std::string& path, const std::string& snap_name,
                }
        }
 
+       if (!new_session->writable()) {
+               MessageDialog msg (_("This session has been opened in read-only mode.\n\nYou will not be able to record or save."),
+                                  true,
+                                  Gtk::MESSAGE_INFO,
+                                  BUTTONS_OK);
+               
+               msg.set_keep_above (true);
+               msg.set_title (_("Read-only Session"));
+               msg.set_position (Gtk::WIN_POS_CENTER);
+               pop_back_splash (msg);
+               msg.present ();
+               (void) msg.run ();
+               msg.hide ();
+       }
+       
+
        /* Now the session been created, add the transport controls */
        new_session->add_controllable(roll_controllable);
        new_session->add_controllable(stop_controllable);
@@ -3760,6 +3811,7 @@ ARDOUR_UI::disconnect_from_engine ()
        /* drop connection to AudioEngine::Halted so that we don't act
         *  as if the engine unexpectedly shut down
         */
+
        halt_connection.disconnect ();
        
        if (AudioEngine::instance()->stop ()) {
@@ -3778,8 +3830,13 @@ int
 ARDOUR_UI::reconnect_to_engine ()
 {
        if (AudioEngine::instance()->start ()) {
-               MessageDialog msg (*editor,  _("Could not reconnect to the Audio/MIDI engine"));
-               msg.run ();
+               if (editor) {
+                       MessageDialog msg (*editor,  _("Could not reconnect to the Audio/MIDI engine"));
+                       msg.run ();
+               } else {
+                       MessageDialog msg (_("Could not reconnect to the Audio/MIDI engine"));
+                       msg.run ();
+               }
                return -1;
        }
        
@@ -4095,9 +4152,8 @@ ARDOUR_UI::reset_route_peak_display (Route* route)
 int
 ARDOUR_UI::do_audio_midi_setup (uint32_t desired_sample_rate)
 {
-       cerr << "Do AMS\n";
-
        audio_midi_setup->set_desired_sample_rate (desired_sample_rate);
+       audio_midi_setup->set_position (WIN_POS_CENTER);
 
        switch (audio_midi_setup->run()) {
        case Gtk::RESPONSE_OK:
@@ -4108,3 +4164,5 @@ ARDOUR_UI::do_audio_midi_setup (uint32_t desired_sample_rate)
                return -1;
        }
 }
+
+