fixes for destructive track offsets of various kinds; move from jack_nframes_t -...
[ardour.git] / libs / ardour / state_manager.cc
index 4bb44dbc950721332bca98c2b55ffb0a717bb2ff..153773ed30c8cc54778b69793de93b03d144126f 100644 (file)
@@ -5,9 +5,10 @@
 
 using namespace ARDOUR;
 using namespace std;
+using namespace PBD;
 
 bool StateManager::_allow_save = true;
-vector<StateManager::DeferredSave> StateManager::deferred;
+sigc::signal<void,const char*> StateManager::SaveAllowed;
 
 StateManager::StateManager ()
 {
@@ -19,15 +20,18 @@ StateManager::~StateManager()
 }
 
 void
-StateManager::set_allow_save (bool yn)
+StateManager::prohibit_save ()
 {
-       _allow_save = yn;
+       _allow_save = false;
+}
 
-       if (yn) {
-               for (vector<DeferredSave>::iterator x = deferred.begin(); x != deferred.end(); ++x) {
-                       (*x).first->save_state ((*x).second);
-               }
-               deferred.clear ();
+void
+StateManager::allow_save (const char* why, bool do_save)
+{
+       _allow_save = true;
+       if (do_save) {
+               SaveAllowed (why);
+               SaveAllowed.slots().erase (SaveAllowed.slots().begin(), SaveAllowed.slots().end());
        }
 }
 
@@ -68,8 +72,11 @@ StateManager::use_state (state_id_t id)
 void
 StateManager::save_state (std::string why)
 {
+       if (!should_save_state())
+               return;
+
        if (!_allow_save) {
-               deferred.push_back (DeferredSave (this, why));
+               SaveAllowed.connect (mem_fun (*this, &StateManager::save_state));
                return;
        }