From 229d9273d7a53cfa6a32dd1d3da73ac1d080cfa2 Mon Sep 17 00:00:00 2001 From: ThorstenB Date: Fri, 30 Dec 2011 00:39:08 +0100 Subject: [PATCH] #545 related: User settings not saved when window was closed via the window buttons instead of pressing ESC or using menu exit. (More code should be moved after the 2.6 release) --- src/Main/fg_commands.cxx | 17 +-------------- src/Main/fg_init.cxx | 10 ++++++--- src/Main/globals.cxx | 47 ++++++++++++++++++++++++++++++++++++---- src/Main/globals.hxx | 12 ++++++++++ 4 files changed, 63 insertions(+), 23 deletions(-) diff --git a/src/Main/fg_commands.cxx b/src/Main/fg_commands.cxx index a07739d2a..2c8c4ed20 100644 --- a/src/Main/fg_commands.cxx +++ b/src/Main/fg_commands.cxx @@ -189,22 +189,7 @@ do_exit (const SGPropertyNode * arg) { SG_LOG(SG_INPUT, SG_INFO, "Program exit requested."); fgSetBool("/sim/signals/exit", true); - - if (fgGetBool("/sim/startup/save-on-exit")) { - SGPath autosaveFile(fgGetString("/sim/fg-home")); - autosaveFile.append( "autosave.xml" ); - autosaveFile.create_dir( 0700 ); - SG_LOG(SG_IO, SG_INFO, "Saving user settings to " << autosaveFile.str()); - try { - writeProperties(autosaveFile.str(), globals->get_props(), false, SGPropertyNode::USERARCHIVE); - } catch (const sg_exception &e) { - guiErrorMessage("Error writing autosave.xml: ", e); - } - - SG_LOG(SG_INPUT, SG_DEBUG, "Finished Saving user settings"); - - } - + globals->saveUserSettings(); fgOSExit(arg->getIntValue("status", 0)); return true; } diff --git a/src/Main/fg_init.cxx b/src/Main/fg_init.cxx index 807606916..cf08e334c 100644 --- a/src/Main/fg_init.cxx +++ b/src/Main/fg_init.cxx @@ -561,10 +561,10 @@ bool fgInitConfig ( int argc, char **argv ) << "(from " << e.getOrigin() << ")"); } } - - // Scan user config files and command line for a specified aircraft. + + // Scan user config files and command line for a specified aircraft. flightgear::Options::sharedInstance()->initAircraft(); - + FindAndCacheAircraft f(&autosave); if (!f.loadAircraft()) { return false; @@ -572,6 +572,10 @@ bool fgInitConfig ( int argc, char **argv ) copyProperties(&autosave, globals->get_props()); + // TODO Move some of the code above into loadUserSettings after the 2.6 release + // call dummy function, for now just to indicate that data was loaded + globals->loadUserSettings(); + // parse options after loading aircraft to ensure any user // overrides of defaults are honored. flightgear::Options::sharedInstance()->processOptions(); diff --git a/src/Main/globals.cxx b/src/Main/globals.cxx index 4eb26f21f..8631fa1b0 100644 --- a/src/Main/globals.cxx +++ b/src/Main/globals.cxx @@ -48,6 +48,7 @@ #include #include #include +#include #include #include #include @@ -150,17 +151,20 @@ FGGlobals::FGGlobals() : dmelist( NULL ), tacanlist( NULL ), carrierlist( NULL ), - channellist( NULL ) + channellist( NULL ), + haveUserSettings(false) { simgear::ResourceManager::instance()->addProvider(new AircraftResourceProvider()); simgear::PropertyObjectBase::setDefaultRoot(props); } - // Destructor FGGlobals::~FGGlobals() -{ -// The AIModels manager performs a number of actions upon +{ + // save user settings (unless already saved) + saveUserSettings(); + + // The AIModels manager performs a number of actions upon // Shutdown that implicitly assume that other subsystems // are still operational (Due to the dynamic allocation and // deallocation of AIModel objects. To ensure we can safely @@ -436,6 +440,41 @@ FGGlobals::restoreInitialState () } +// Load user settings from autosave.xml +void +FGGlobals::loadUserSettings() +{ + // dummy method for now. + //TODO Move code loading autosave.xml in here after the 2.6.0 release. + haveUserSettings = true; +} + +// Save user settings in autosave.xml +void +FGGlobals::saveUserSettings() +{ + // only save settings when we have (tried) to load the previous + // settings (otherwise user data was lost) + if (!haveUserSettings) + return; + + if (fgGetBool("/sim/startup/save-on-exit")) { + // don't save settings more than once on shutdown + haveUserSettings = false; + + SGPath autosaveFile(fgGetString("/sim/fg-home")); + autosaveFile.append( "autosave.xml" ); + autosaveFile.create_dir( 0700 ); + SG_LOG(SG_IO, SG_INFO, "Saving user settings to " << autosaveFile.str()); + try { + writeProperties(autosaveFile.str(), globals->get_props(), false, SGPropertyNode::USERARCHIVE); + } catch (const sg_exception &e) { + guiErrorMessage("Error writing autosave.xml: ", e); + } + SG_LOG(SG_INPUT, SG_DEBUG, "Finished Saving user settings"); + } +} + FGViewer * FGGlobals::get_current_view () const { diff --git a/src/Main/globals.hxx b/src/Main/globals.hxx index 11dc124dc..fd81b0b50 100644 --- a/src/Main/globals.hxx +++ b/src/Main/globals.hxx @@ -164,6 +164,9 @@ private: /// roots of Aircraft trees string_list fg_aircraft_dirs; + + bool haveUserSettings; + public: FGGlobals(); @@ -324,6 +327,15 @@ public: */ void restoreInitialState (); + /** + * Load user settings from autosave.xml + */ + void loadUserSettings(); + + /** + * Save user settings in autosave.xml + */ + void saveUserSettings(); };