X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FMain%2Fglobals.cxx;h=da3de6a46beeba1fabe72597bd86356dde77e94a;hb=224afcc7e4cb4191be15f3df025164fcd83f5102;hp=c956180a8888646d40f7565289a9ba9bd30ac931;hpb=88839f0b7aba1242dc19f38927624d525ca50607;p=flightgear.git diff --git a/src/Main/globals.cxx b/src/Main/globals.cxx index c956180a8..da3de6a46 100644 --- a/src/Main/globals.cxx +++ b/src/Main/globals.cxx @@ -15,8 +15,8 @@ // General Public License for more details. // // You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +// along with this program; if not, write to the Free Software Foundation, +// Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. // // $Id$ @@ -24,13 +24,15 @@ # include #endif -#include #include #include #include #include #include #include +#include +#include +#include #include #include @@ -45,6 +47,7 @@ #include #include #include +#include #include "globals.hxx" #include "renderer.hxx" @@ -64,14 +67,15 @@ FGGlobals *globals; // Constructor FGGlobals::FGGlobals() : + props( new SGPropertyNode ), + initial_state( NULL ), + locale( NULL ), renderer( new FGRenderer ), subsystem_mgr( new SGSubsystemMgr ), event_mgr( new SGEventMgr ), + soundmgr( new SGSoundMgr ), sim_time_sec( 0.0 ), fg_root( "" ), -#if defined(FX) && defined(XMESA) - fullscreen( true ), -#endif warp( 0 ), warp_delta( 0 ), time_params( NULL ), @@ -80,16 +84,10 @@ FGGlobals::FGGlobals() : matlib( NULL ), route_mgr( NULL ), current_panel( NULL ), - soundmgr( NULL ), - airports( NULL ), - runways( NULL ), ATC_mgr( NULL ), AI_mgr( NULL ), controls( NULL ), viewmgr( NULL ), - props( new SGPropertyNode ), - initial_state( NULL ), - locale( NULL ), commands( SGCommandMgr::instance() ), acmodel( NULL ), model_mgr( NULL ), @@ -97,17 +95,14 @@ FGGlobals::FGGlobals() : initial_waypoints( NULL ), scenery( NULL ), tile_mgr( NULL ), - io( new FGIO ), fontcache ( new FGFontCache ), navlist( NULL ), loclist( NULL ), gslist( NULL ), dmelist( NULL ), - mkrlist( NULL ), tacanlist( NULL ), carrierlist( NULL ), channellist( NULL ), - fixlist( NULL ), airwaynet( NULL ), multiplayer_mgr( NULL ) { @@ -125,6 +120,14 @@ FGGlobals::~FGGlobals() // shut down all subsystems, make sure we take down the // AIModels system first. subsystem_mgr->get_group(SGSubsystemMgr::GENERAL)->remove_subsystem("ai_model"); + // FGInput (FGInputEvent) and FGDialog calls get_subsystem() in their destructors, + // which is not safe since some subsystem are already deleted but can be referred. + // So these subsystems must be deleted prior to deleting subsystem_mgr unless + // ~SGSubsystemGroup and SGSubsystemMgr::get_subsystem are changed not to refer to + // deleted subsystems. + subsystem_mgr->get_group(SGSubsystemMgr::GENERAL)->remove_subsystem("input"); + subsystem_mgr->get_group(SGSubsystemMgr::GENERAL)->remove_subsystem("gui"); + subsystem_mgr->unbind(); delete subsystem_mgr; delete event_mgr; delete time_params; @@ -133,10 +136,7 @@ FGGlobals::~FGGlobals() delete matlib; delete route_mgr; delete current_panel; - delete soundmgr; - delete airports; - delete runways; delete ATC_mgr; delete AI_mgr; delete controls; @@ -149,20 +149,20 @@ FGGlobals::~FGGlobals() delete initial_waypoints; delete tile_mgr; delete scenery; - delete io; delete fontcache; delete navlist; delete loclist; delete gslist; delete dmelist; - delete mkrlist; delete tacanlist; delete carrierlist; delete channellist; - delete fixlist; delete airwaynet; delete multiplayer_mgr; + + soundmgr->unbind(); + delete soundmgr; } @@ -175,7 +175,11 @@ void FGGlobals::set_fg_root (const string &root) { tmp.append( "data" ); tmp.append( "version" ); if ( ulFileExists( tmp.c_str() ) ) { + fgGetNode("BAD_FG_ROOT", true)->setStringValue(fg_root); fg_root += "/data"; + fgGetNode("GOOD_FG_ROOT", true)->setStringValue(fg_root); + SG_LOG(SG_GENERAL, SG_ALERT, "***\n***\n*** Warning: changing bad FG_ROOT/--fg-root to '" + << fg_root << "'\n***\n***"); } // remove /sim/fg-root before writing to prevent hijacking @@ -211,9 +215,11 @@ void FGGlobals::set_fg_scenery (const string &scenery) { ulDir *td = ulOpenDir( pt.c_str() ); ulDir *od = ulOpenDir( po.c_str() ); - if (td == NULL && od == NULL) + // "Terrain" and "Airports" directory don't exist. add directory as is + // otherwise, automatically append either Terrain, Objects, or both + //if (td == NULL && od == NULL) fg_scenery.push_back( path_list[i] ); - else { + //else { if (td != NULL) { fg_scenery.push_back( pt.str() ); ulCloseDir( td ); @@ -222,7 +228,7 @@ void FGGlobals::set_fg_scenery (const string &scenery) { fg_scenery.push_back( po.str() ); ulCloseDir( od ); } - } + //} // insert a marker for FGTileEntry::load(), so that // FG_SCENERY=A:B becomes list ["A/Terrain", "A/Objects", "", // "B/Terrain", "B/Objects", ""] @@ -258,6 +264,11 @@ FGGlobals::add_subsystem (const char * name, subsystem_mgr->add(name, subsystem, type, min_time_sec); } +SGSoundMgr * +FGGlobals::get_soundmgr () const +{ + return soundmgr; +} SGEventMgr * FGGlobals::get_event_mgr () const