]> git.saurik.com Git - wxWidgets.git/blobdiff - src/common/init.cpp
fixes from the 2.2 branch
[wxWidgets.git] / src / common / init.cpp
index 0fa42d7d8f7fda405c2e1cf19e7e720218d753d7..390dced3de669ff46f3a40da23f478caf15d049f 100644 (file)
@@ -26,6 +26,7 @@
 #ifndef WX_PRECOMP
     #include "wx/app.h"
     #include "wx/debug.h"
+    #include "wx/filefn.h"
 #endif
 
 #include "wx/module.h"
@@ -34,7 +35,7 @@
 // global vars
 // ----------------------------------------------------------------------------
 
-wxApp * WXDLLEXPORT wxTheApp = NULL;
+WXDLLEXPORT wxApp *wxTheApp = NULL;
 
 wxAppInitializerFunction
     wxAppBase::m_appInitFn = (wxAppInitializerFunction)NULL;
@@ -49,6 +50,13 @@ public:
     virtual int OnRun() { wxFAIL_MSG(wxT("unreachable")); return 0; }
 };
 
+// ----------------------------------------------------------------------------
+// private functions
+// ----------------------------------------------------------------------------
+
+static bool DoInit();
+static void DoCleanUp();
+
 // ----------------------------------------------------------------------------
 // private vars
 // ----------------------------------------------------------------------------
@@ -96,10 +104,7 @@ bool WXDLLEXPORT wxInitialize()
     wxASSERT_MSG( !wxTheApp,
                   wxT("either call wxInitialize or create app, not both!") );
 
-    wxClassInfo::InitializeClasses();
-
-    wxModule::RegisterModules();
-    if ( !wxModule::InitializeModules() )
+    if ( !DoInit() )
     {
         return FALSE;
     }
@@ -120,12 +125,114 @@ void WXDLLEXPORT wxUninitialize()
 {
     if ( !--gs_nInitCount )
     {
-        wxModule::CleanUpModules();
+        DoCleanUp();
+    }
+}
+
+int wxEntry(int argc, char **argv)
+{
+    // library initialization
+    if ( !DoInit() )
+    {
+        return -1;
+    }
+
+    // create the app
+    if ( !wxTheApp )
+    {
+        wxCHECK_MSG( wxApp::GetInitializerFunction(), -1,
+                wxT("No application object: use IMPLEMENT_APP macro.") );
+
+        wxAppInitializerFunction fnCreate = wxApp::GetInitializerFunction();
+
+        wxTheApp = (wxApp *)fnCreate();
+    }
+
+    wxCHECK_MSG( wxTheApp, -1, wxT("wxWindows error: no application object") );
+
+    // app preinitialization
+    wxTheApp->argc = argc;
+
+#if wxUSE_UNICODE
+    wxTheApp->argv = new wxChar*[argc+1];
+    int mb_argc = 0;
+    while (mb_argc < argc)
+    {
+        wxTheApp->argv[mb_argc] = wxStrdup(wxConvLibc.cMB2WX(argv[mb_argc]));
+        mb_argc++;
+    }
+    wxTheApp->argv[mb_argc] = (wxChar *)NULL;
+#else
+    wxTheApp->argv = argv;
+#endif
+
+    wxString name = wxFileNameFromPath(argv[0]);
+    wxStripExtension(name);
+    wxTheApp->SetAppName(name);
+
+    int retValue = 0;
+
+    // app initialization
+    if ( !wxTheApp->OnInit() )
+        retValue = -1;
+
+    // app execution
+    if ( retValue == 0 )
+    {
+        retValue = wxTheApp->OnRun();
 
-        wxClassInfo::CleanUpClasses();
+        // app clean up
+        wxTheApp->OnExit();
+    }
+
+    // library clean up
+    DoCleanUp();
+
+    return retValue;
+}
+
+// ----------------------------------------------------------------------------
+// private functions
+// ----------------------------------------------------------------------------
 
-        // delete the application object
-        delete wxTheApp;
-        wxTheApp = (wxApp *)NULL;
+static bool DoInit()
+{
+    wxClassInfo::InitializeClasses();
+
+    wxModule::RegisterModules();
+    if ( !wxModule::InitializeModules() )
+    {
+        return FALSE;
     }
+
+    return TRUE;
+}
+
+static void DoCleanUp()
+{
+#if wxUSE_LOG
+    // flush the logged messages if any
+    wxLog *log = wxLog::GetActiveTarget();
+    if (log != NULL && log->HasPendingMessages())
+        log->Flush();
+
+    // continuing to use user defined log target is unsafe from now on because
+    // some resources may be already unavailable, so replace it by something
+    // more safe
+    wxLog::DontCreateOnDemand();
+    delete wxLog::SetActiveTarget(new wxLogStderr);
+#endif // wxUSE_LOG
+
+    wxModule::CleanUpModules();
+
+    wxClassInfo::CleanUpClasses();
+
+    // delete the application object
+    delete wxTheApp;
+    wxTheApp = (wxApp *)NULL;
+
+#if wxUSE_LOG
+    // and now delete the last logger as well
+    delete wxLog::SetActiveTarget(NULL);
+#endif // wxUSE_LOG
 }