]> git.mxchange.org Git - flightgear.git/commitdiff
Reset: explicit close-window function.
authorJames Turner <zakalawe@mac.com>
Tue, 12 Nov 2013 22:26:37 +0000 (22:26 +0000)
committerJames Turner <zakalawe@mac.com>
Tue, 12 Nov 2013 22:57:13 +0000 (22:57 +0000)
Allow orderly shutdown of OSG before cxa_finalize

src/Main/fg_os.hxx
src/Main/main.cxx
src/Scenery/scenery.cxx
src/Scenery/scenery.hxx
src/Viewer/fg_os_osgviewer.cxx

index 46bc235a7ce09cd25502df73dc1bb1063a4759b5..70ffb1b6cecaa34821efc5ea32835c67a739bbfa 100644 (file)
@@ -59,6 +59,7 @@ enum { KEYMOD_NONE     = 0,
 
 void fgOSInit(int* argc, char** argv);
 void fgOSOpenWindow(bool stencil);
+void fgOSCloseWindow();
 void fgOSFullScreen();
 int fgOSMainLoop();
 void fgOSExit(int code);
index 26ac132abfff94463e61d5509c23e68e7aa1a1bf..bb3a6457eeaae71f8c04ab87c35d904874e49919 100644 (file)
@@ -391,6 +391,7 @@ int fgMainInit( int argc, char **argv ) {
     
     // pass control off to the master event handler
     int result = fgOSMainLoop();
+    fgOSCloseWindow();
     
     // clean up here; ensure we null globals to avoid
     // confusing the atexit() handler
index 47a08763ef8cec8b70cedf86a50a7b826d4fbdd7..a9dd67cdcf5b14bb6db1d978a9a86ba159ad8eae 100644 (file)
@@ -379,9 +379,17 @@ bool FGScenery::scenery_available(const SGGeod& position, double range_m)
   return false;
 }
 
+static osg::ref_ptr<SceneryPager> pager;
+
 SceneryPager* FGScenery::getPagerSingleton()
 {
-    static osg::ref_ptr<SceneryPager> pager = new SceneryPager;
+    if (!pager)
+        pager = new SceneryPager;
     return pager.get();
 }
 
+void FGScenery::resetPagerSingleton()
+{
+    pager = NULL;
+}
+
index e6a2d70515db27877f661bb18d47dbc807291627..be4ed4e6011e6c86bce3eb813c4568a64d1900a1 100644 (file)
@@ -119,6 +119,8 @@ public:
     // Static because access to the pager is needed before the rest of
     // the scenery is initialized.
     static flightgear::SceneryPager* getPagerSingleton();
+    static void resetPagerSingleton();
+    
     flightgear::SceneryPager* getPager() { return _pager.get(); }
 };
 
index e48e940c2e55d5c2be8ea471e82c32bd06cedbc5..01c646cd826c643fdb124069a8af48217ccec84c 100644 (file)
@@ -386,6 +386,15 @@ void fgOSInit(int* argc, char** argv)
     WindowSystemAdapter::setWSA(new WindowSystemAdapter);
 }
 
+void fgOSCloseWindow()
+{
+    FGScenery::resetPagerSingleton();
+    mainCamera = NULL;
+    flightgear::CameraGroup::setDefault(NULL);
+    WindowSystemAdapter::setWSA(NULL);
+    viewer = NULL;
+}
+
 void fgOSFullScreen()
 {
     std::vector<osgViewer::GraphicsWindow*> windows;
@@ -521,7 +530,9 @@ static int _cursor = -1;
 void fgSetMouseCursor(int cursor)
 {
     _cursor = cursor;
-  
+    if (!viewer)
+        return;
+    
     std::vector<osgViewer::GraphicsWindow*> windows;
     viewer->getWindows(windows);
     BOOST_FOREACH(osgViewer::GraphicsWindow* gw, windows) {