X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/f4c890fdbe303c1e3290bc831fd958b26ccd4509..49b0a3aad965b07c9c39ea5038420b15e156324f:/src/common/init.cpp diff --git a/src/common/init.cpp b/src/common/init.cpp index 8af743b0d2..b3cd9aa66d 100644 --- a/src/common/init.cpp +++ b/src/common/init.cpp @@ -17,45 +17,39 @@ // 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" - -// ---------------------------------------------------------------------------- -// global vars -// ---------------------------------------------------------------------------- - -wxApp * WXDLLEXPORT 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 +#include "wx/module.h" // ---------------------------------------------------------------------------- // private classes // ---------------------------------------------------------------------------- -class /* no WXDLLEXPORT */ wxConsoleApp : public wxApp +// we need a dummy app object if the user doesn't want to create a real one +class wxDummyConsoleApp : public wxApp { public: - virtual int OnRun() { wxFAIL_MSG(wxT("unreachable")); return 0; } + virtual int OnRun() { wxFAIL_MSG( _T("unreachable code") ); return 0; } }; +// ---------------------------------------------------------------------------- +// private functions +// ---------------------------------------------------------------------------- + +static bool DoInit(); +static void DoCleanUp(); + // ---------------------------------------------------------------------------- // private vars // ---------------------------------------------------------------------------- @@ -66,6 +60,10 @@ static size_t gs_nInitCount = 0; // implementation // ============================================================================ +// ---------------------------------------------------------------------------- +// wxBase-specific functions +// ---------------------------------------------------------------------------- + bool WXDLLEXPORT wxInitialize() { if ( gs_nInitCount ) @@ -77,15 +75,12 @@ 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; } - wxTheApp = new wxConsoleApp; + wxTheApp = new wxDummyConsoleApp; if ( !wxTheApp ) { @@ -101,12 +96,121 @@ void WXDLLEXPORT wxUninitialize() { if ( !--gs_nInitCount ) { - wxModule::CleanUpModules(); + DoCleanUp(); + } +} - wxClassInfo::CleanUpClasses(); +int wxEntry(int argc, char **argv) +{ + // library initialization + if ( !DoInit() ) + { + return -1; + } - // delete the application object - delete wxTheApp; - wxTheApp = (wxApp *)NULL; + // 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]; + 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 +} +