]> git.saurik.com Git - wxWidgets.git/blobdiff - src/common/init.cpp
Added chapter on collection and container classes to contents
[wxWidgets.git] / src / common / init.cpp
index 50b8642fbe5798bd720d029dba24e70f05f311b9..390dced3de669ff46f3a40da23f478caf15d049f 100644 (file)
 #ifndef WX_PRECOMP
     #include "wx/app.h"
     #include "wx/debug.h"
-    #include "wx/module.h"
+    #include "wx/filefn.h"
 #endif
 
+#include "wx/module.h"
+
 // ----------------------------------------------------------------------------
 // global vars
 // ----------------------------------------------------------------------------
 
-wxApp * WXDLLEXPORT wxTheApp = NULL;
+WXDLLEXPORT wxApp *wxTheApp = NULL;
 
 wxAppInitializerFunction
     wxAppBase::m_appInitFn = (wxAppInitializerFunction)NULL;
@@ -48,6 +50,13 @@ public:
     virtual int OnRun() { wxFAIL_MSG(wxT("unreachable")); return 0; }
 };
 
+// ----------------------------------------------------------------------------
+// private functions
+// ----------------------------------------------------------------------------
+
+static bool DoInit();
+static void DoCleanUp();
+
 // ----------------------------------------------------------------------------
 // private vars
 // ----------------------------------------------------------------------------
@@ -58,6 +67,32 @@ static size_t gs_nInitCount = 0;
 // implementation
 // ============================================================================
 
+// ----------------------------------------------------------------------------
+// stubs for some GUI functions
+// ----------------------------------------------------------------------------
+
+void WXDLLEXPORT wxExit()
+{
+    abort();
+}
+
+// Yield to other apps/messages
+bool WXDLLEXPORT wxYield()
+{
+    // do nothing
+    return TRUE;
+}
+
+// Yield to other apps/messages
+void WXDLLEXPORT wxWakeUpIdle()
+{
+    // do nothing
+}
+
+// ----------------------------------------------------------------------------
+// wxBase-specific functions
+// ----------------------------------------------------------------------------
+
 bool WXDLLEXPORT wxInitialize()
 {
     if ( gs_nInitCount )
@@ -69,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;
     }
@@ -93,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.") );
 
-        wxClassInfo::CleanUpClasses();
+        wxAppInitializerFunction fnCreate = wxApp::GetInitializerFunction();
 
-        // delete the application object
-        delete wxTheApp;
-        wxTheApp = (wxApp *)NULL;
+        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();
+
+        // app clean up
+        wxTheApp->OnExit();
+    }
+
+    // library clean up
+    DoCleanUp();
+
+    return retValue;
+}
+
+// ----------------------------------------------------------------------------
+// private functions
+// ----------------------------------------------------------------------------
+
+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
 }