save and restore clock modes
[ardour.git] / gtk2_ardour / ardour_ui.cc
index 39dd6ac1560a2e30eeb029705466bad23ffcadeb..8d7e48bc1b7f0b9b7d9ff373b6250a497cc3c7ae 100644 (file)
@@ -35,6 +35,7 @@
 #include <pbd/compose.h>
 #include <pbd/pathscanner.h>
 #include <pbd/failed_constructor.h>
+#include <pbd/enumwriter.h>
 #include <gtkmm2ext/gtk_ui.h>
 #include <gtkmm2ext/utils.h>
 #include <gtkmm2ext/click_box.h>
@@ -92,10 +93,10 @@ ARDOUR_UI::ARDOUR_UI (int *argcp, char **argvp[], string rcfile)
 
        : Gtkmm2ext::UI ("ardour", argcp, argvp, rcfile),
          
-         primary_clock (X_("TransportClockDisplay"), true, false, true),
-         secondary_clock (X_("SecondaryClockDisplay"), true, false, true),
-         preroll_clock (X_("PreRollClock"), true, true),
-         postroll_clock (X_("PostRollClock"), true, true),
+         primary_clock (X_("primary"), false, X_("TransportClockDisplay"), true, false, true),
+         secondary_clock (X_("secondary"), false, X_("SecondaryClockDisplay"), true, false, true),
+         preroll_clock (X_("preroll"), false, X_("PreRollClock"), true, true),
+         postroll_clock (X_("postroll"), false, X_("PostRollClock"), true, true),
 
          /* adjuster table */
 
@@ -108,7 +109,7 @@ ARDOUR_UI::ARDOUR_UI (int *argcp, char **argvp[], string rcfile)
 
          /* big clock */
 
-         big_clock ("BigClockNonRecording", true, false, true),
+         big_clock (X_("bigclock"), false, "BigClockNonRecording", true, false, true),
 
          /* transport */
 
@@ -165,6 +166,9 @@ ARDOUR_UI::ARDOUR_UI (int *argcp, char **argvp[], string rcfile)
        last_speed_displayed = -1.0f;
        keybindings_path = ARDOUR::find_config_file ("ardour.bindings");
 
+       can_save_keybindings = false;
+       Glib::signal_idle().connect (mem_fun (*this, &ARDOUR_UI::first_idle));
+
        last_configure_time.tv_sec = 0;
        last_configure_time.tv_usec = 0;
 
@@ -244,6 +248,10 @@ ARDOUR_UI::set_engine (AudioEngine& e)
                throw failed_constructor();
        }
 
+       /* listen to clock mode changes */
+
+       AudioClock::ModeChanged.connect (mem_fun (*this, &ARDOUR_UI::store_clock_modes));
+
        /* start the time-of-day-clock */
        
        update_wall_clock ();
@@ -1262,14 +1270,6 @@ ARDOUR_UI::do_engine_start ()
                engine->start();
        }
 
-       catch (AudioEngine::PortRegistrationFailure& err) {
-               engine->stop ();
-               error << _("Unable to create all required ports")
-                     << endmsg;
-               unload_session ();
-               return -1;
-       }
-
        catch (...) {
                engine->stop ();
                error << _("Unable to start the session running")
@@ -1588,7 +1588,7 @@ ARDOUR_UI::save_template ()
 }
 
 void
-ARDOUR_UI::new_session (bool startup, std::string predetermined_path)
+ARDOUR_UI::new_session (std::string predetermined_path)
 {
        string session_name;
        string session_path;
@@ -1701,7 +1701,7 @@ ARDOUR_UI::new_session (bool startup, std::string predetermined_path)
 
 
                                        msg.set_name (X_("CleanupDialog"));
-                                       msg.set_wmclass (_("existing_session"), "Ardour");
+                                       msg.set_wmclass (X_("existing_session"), "Ardour");
                                        msg.set_position (Gtk::WIN_POS_MOUSE);
                                        
                                        switch (msg.run()) {
@@ -1807,9 +1807,8 @@ ARDOUR_UI::load_session (const string & path, const string & snap_name, string*
        /* if it already exists, we must have write access */
 
        if (::access (path.c_str(), F_OK) == 0 && ::access (path.c_str(), W_OK)) {
-               MessageDialog msg (*editor, _("\
-You do not have write access to this session.\n\
-This prevents the session from being loaded."));
+               MessageDialog msg (*editor, _("You do not have write access to this session.\n"
+                                             "This prevents the session from being loaded."));
                msg.run ();
                return -1;
        }
@@ -2041,7 +2040,7 @@ After cleanup, unused audio files will be moved to a \
        checker.set_default_response (RESPONSE_CANCEL);
 
        checker.set_name (_("CleanupDialog"));
-       checker.set_wmclass (_("ardour_cleanup"), "Ardour");
+       checker.set_wmclass (X_("ardour_cleanup"), "Ardour");
        checker.set_position (Gtk::WIN_POS_MOUSE);
 
        switch (checker.run()) {
@@ -2330,7 +2329,7 @@ ARDOUR_UI::cmdline_new_session (string path)
                path = str;
        }
 
-       new_session (false, path);
+       new_session (path);
 
        _will_create_new_session_automatically = false; /* done it */
        return FALSE; /* don't call it again */
@@ -2423,5 +2422,30 @@ ARDOUR_UI::set_keybindings_path (string path)
 void
 ARDOUR_UI::save_keybindings ()
 {
-       AccelMap::save (keybindings_path);
+       if (can_save_keybindings) {
+               AccelMap::save (keybindings_path);
+       } 
+}
+
+bool
+ARDOUR_UI::first_idle ()
+{
+       can_save_keybindings = true;
+       return false;
+}
+
+void
+ARDOUR_UI::store_clock_modes ()
+{
+       XMLNode* node = new XMLNode(X_("ClockModes"));
+
+       for (vector<AudioClock*>::iterator x = AudioClock::clocks.begin(); x != AudioClock::clocks.end(); ++x) {
+               node->add_property ((*x)->name().c_str(), enum_2_string ((*x)->mode()));
+       }
+
+       session->add_extra_xml (*node);
+       session->set_dirty ();
 }
+
+
+