]> git.saurik.com Git - wxWidgets.git/blobdiff - src/common/init.cpp
made the #error message less self-contradictory
[wxWidgets.git] / src / common / init.cpp
index 8af743b0d2fe4012f4b02423368a9db492bd64b9..4f0aed6e49c55831e14f83e71621116449589d3e 100644 (file)
 // headers
 // ----------------------------------------------------------------------------
 
-#ifdef __GNUG__
-    #pragma implementation "appbase.h"
-#endif
-
 #include "wx/wxprec.h"
 
 #ifdef    __BORLANDC__
   #pragma hdrstop
 #endif  //__BORLANDC__
 
+#ifndef WX_PRECOMP
+    #include "wx/app.h"
+    #include "wx/debug.h"
+    #include "wx/filefn.h"
+    #include "wx/log.h"
+#endif
 
-#include "wx/app.h"
-#include "wx/debug.h"
+#include "wx/module.h"
 
 // ----------------------------------------------------------------------------
 // global vars
 // ----------------------------------------------------------------------------
 
-wxApp * WXDLLEXPORT wxTheApp = NULL;
+WXDLLEXPORT wxApp *wxTheApp = NULL;
 
 wxAppInitializerFunction
     wxAppBase::m_appInitFn = (wxAppInitializerFunction)NULL;
 
-#if wxUSE_THREADS
-    // List of events pending processing
-    wxList *wxPendingEvents = NULL;
-    wxCriticalSection *wxPendingEventsLocker = NULL;
-#endif // wxUSE_THREADS
-
 // ----------------------------------------------------------------------------
 // private classes
 // ----------------------------------------------------------------------------
@@ -56,6 +51,13 @@ public:
     virtual int OnRun() { wxFAIL_MSG(wxT("unreachable")); return 0; }
 };
 
+// ----------------------------------------------------------------------------
+// private functions
+// ----------------------------------------------------------------------------
+
+static bool DoInit();
+static void DoCleanUp();
+
 // ----------------------------------------------------------------------------
 // private vars
 // ----------------------------------------------------------------------------
@@ -66,6 +68,25 @@ static size_t gs_nInitCount = 0;
 // implementation
 // ============================================================================
 
+// ----------------------------------------------------------------------------
+// stubs for some GUI functions
+// ----------------------------------------------------------------------------
+
+void WXDLLEXPORT wxExit()
+{
+    abort();
+}
+
+// Yield to other apps/messages
+void WXDLLEXPORT wxWakeUpIdle()
+{
+    // do nothing
+}
+
+// ----------------------------------------------------------------------------
+// wxBase-specific functions
+// ----------------------------------------------------------------------------
+
 bool WXDLLEXPORT wxInitialize()
 {
     if ( gs_nInitCount )
@@ -77,10 +98,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;
     }
@@ -101,12 +119,121 @@ void WXDLLEXPORT wxUninitialize()
 {
     if ( !--gs_nInitCount )
     {
-        wxModule::CleanUpModules();
+        DoCleanUp();
+    }
+}
+
+int wxEntry(int argc, char **argv)
+{
+    // library initialization
+    if ( !DoInit() )
+    {
+        return -1;
+    }
 
-        wxClassInfo::CleanUpClasses();
+    // create the app
+    if ( !wxTheApp )
+    {
+        wxCHECK_MSG( wxApp::GetInitializerFunction(), -1,
+                wxT("No application object: use IMPLEMENT_APP macro.") );
 
-        // delete the application object
-        delete wxTheApp;
-        wxTheApp = (wxApp *)NULL;
+        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];
+    for ( int mb_argc = 0; mb_argc < argc; mb_argc++ )
+    {
+        wxTheApp->argv[mb_argc] = wxStrdup(wxConvLocal.cMB2WX(argv[mb_argc]));
+    }
+    wxTheApp->argv[mb_argc] = (wxChar *)NULL;
+#else
+    wxTheApp->argv = argv;
+#endif
+
+    wxString name = wxFileNameFromPath(wxTheApp->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();
+
+    // TODO: this should really be done in ~wxApp
+#if wxUSE_UNICODE
+    for ( int mb_argc = 0; mb_argc < wxTheApp->argc; mb_argc++ )
+    {
+        free(wxTheApp->argv[mb_argc]);
+    }
+#endif // wxUSE_UNICODE
+
+    // 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
+}
+