diff options
author | Perttu Ahola <celeron55@gmail.com> | 2012-03-11 00:53:39 +0200 |
---|---|---|
committer | Perttu Ahola <celeron55@gmail.com> | 2012-03-11 00:54:51 +0200 |
commit | b485fac33ef961fb5725f3ae34520ee3b2f0339b (patch) | |
tree | 0acb22e66ae9c8a5ff89e1ab29c90ef86e43fc57 | |
parent | 98404ad8ea48a7bb77034a6a2aa1bc7d4be4ddb4 (diff) | |
download | minetest-b485fac33ef961fb5725f3ae34520ee3b2f0339b.tar.gz minetest-b485fac33ef961fb5725f3ae34520ee3b2f0339b.tar.bz2 minetest-b485fac33ef961fb5725f3ae34520ee3b2f0339b.zip |
Fix configuration file behaviour
- Do not rewrite if nothing needs to be changed
- Update at program exit, in addition to updating when continuing from main menu to game
-rw-r--r-- | src/main.cpp | 4 | ||||
-rw-r--r-- | src/settings.h | 29 |
2 files changed, 31 insertions, 2 deletions
diff --git a/src/main.cpp b/src/main.cpp index 10e01be2a..83bca7c44 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1708,6 +1708,10 @@ int main(int argc, char *argv[]) #endif // !SERVER + // Update configuration file + if(configpath != "") + g_settings->updateConfigFile(configpath.c_str()); + END_DEBUG_EXCEPTION_HANDLER(errorstream) debugstreams_deinit(); diff --git a/src/settings.h b/src/settings.h index 4bc22eaa1..c08d54a47 100644 --- a/src/settings.h +++ b/src/settings.h @@ -172,7 +172,8 @@ public: */ bool getUpdatedConfigObject(std::istream &is, core::list<std::string> &dst, - core::map<std::string, bool> &updated) + core::map<std::string, bool> &updated, + bool &value_changed) { JMutexAutoLock lock(m_mutex); @@ -219,6 +220,7 @@ public: infostream<<"Changing value of \""<<name<<"\" = \"" <<value<<"\" -> \""<<newvalue<<"\"" <<std::endl; + value_changed = true; } dst.push_back(name + " = " + newvalue + line_end); @@ -241,6 +243,7 @@ public: core::list<std::string> objects; core::map<std::string, bool> updated; + bool something_actually_changed = false; // Read and modify stuff { @@ -254,12 +257,34 @@ public: } else { - while(getUpdatedConfigObject(is, objects, updated)); + while(getUpdatedConfigObject(is, objects, updated, + something_actually_changed)); } } JMutexAutoLock lock(m_mutex); + // If something not yet determined to have been changed, check if + // any new stuff was added + if(!something_actually_changed){ + for(core::map<std::string, std::string>::Iterator + i = m_settings.getIterator(); + i.atEnd() == false; i++) + { + if(updated.find(i.getNode()->getKey())) + continue; + something_actually_changed = true; + break; + } + } + + // If nothing was actually changed, skip writing the file + if(!something_actually_changed){ + infostream<<"Skipping writing of "<<filename + <<" because content wouldn't be modified"<<std::endl; + return true; + } + // Write stuff back { std::ofstream os(filename); |