X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/05e2b077c6187ff4d894e4af58ccd99536c9c584..c2a331e02732bb6a04a42ebf646d54b4373ad122:/src/common/init.cpp diff --git a/src/common/init.cpp b/src/common/init.cpp index ec81ea6ede..2fd5771f04 100644 --- a/src/common/init.cpp +++ b/src/common/init.cpp @@ -31,6 +31,8 @@ #include "wx/thread.h" #endif +#include "wx/init.h" + #include "wx/ptr_scpd.h" #include "wx/module.h" @@ -57,34 +59,40 @@ class wxDummyConsoleApp : public wxAppConsole { public: + wxDummyConsoleApp() { } + virtual int OnRun() { wxFAIL_MSG( _T("unreachable code") ); return 0; } + + DECLARE_NO_COPY_CLASS(wxDummyConsoleApp) }; // we need a special kind of auto pointer to wxApp which not only deletes the -// pointer it holds in its dtor but also resets wxTheApp -wxDECLARE_SCOPED_PTR(wxApp, wxAppPtrBase); -wxDEFINE_SCOPED_PTR(wxApp, wxAppPtrBase); +// pointer it holds in its dtor but also resets the global application pointer +wxDECLARE_SCOPED_PTR(wxAppConsole, wxAppPtrBase); +wxDEFINE_SCOPED_PTR(wxAppConsole, wxAppPtrBase); class wxAppPtr : public wxAppPtrBase { public: - wxEXPLICIT wxAppPtr(wxApp *ptr = NULL) : wxAppPtrBase(ptr) { } + wxEXPLICIT wxAppPtr(wxAppConsole *ptr = NULL) : wxAppPtrBase(ptr) { } ~wxAppPtr() { if ( get() ) { // the pointer is going to be deleted in the base class dtor, don't // leave the dangling pointer! - wxTheApp = NULL; + wxApp::SetInstance(NULL); } } - void Set(wxApp *ptr) + void Set(wxAppConsole *ptr) { reset(ptr); - wxTheApp = ptr; + wxApp::SetInstance(ptr); } + + DECLARE_NO_COPY_CLASS(wxAppPtr) }; // class to ensure that wxAppBase::CleanUp() is called if our Initialize() @@ -92,13 +100,13 @@ public: class wxCallAppCleanup { public: - wxCallAppCleanup(wxApp *app) : m_app(app) { } + wxCallAppCleanup(wxAppConsole *app) : m_app(app) { } ~wxCallAppCleanup() { if ( m_app ) m_app->CleanUp(); } void Dismiss() { m_app = NULL; } private: - wxApp *m_app; + wxAppConsole *m_app; }; // another tiny class which simply exists to ensure that wxEntryCleanup is @@ -109,6 +117,15 @@ public: ~wxCleanupOnExit() { wxEntryCleanup(); } }; +// ---------------------------------------------------------------------------- +// private functions +// ---------------------------------------------------------------------------- + +// suppress warnings about unused variables +static inline void Use(void *) { } + +#define WX_SUPPRESS_UNUSED_WARN(x) Use(&x) + // ---------------------------------------------------------------------------- // initialization data // ---------------------------------------------------------------------------- @@ -139,8 +156,10 @@ static struct InitData // them to Unicode ourselves (this is the case under Unix but not Windows, // for example), we remember the converted argv here because we'll have to // free it when doing cleanup to avoid memory leaks - wchar_t *argv; + wchar_t **argv; #endif // wxUSE_UNICODE + + DECLARE_NO_COPY_CLASS(InitData) } gs_initData; // ============================================================================ @@ -166,9 +185,15 @@ static void ConvertArgsToUnicode(int argc, char **argv) static void FreeConvertedArgs() { - for ( int mb_argc = 0; mb_argc < wxTheApp->argc; mb_argc++ ) + if ( gs_initData.argv ) { - free(wxTheApp->argv[mb_argc]); + for ( int i = 0; i < gs_initData.argc; i++ ) + { + free(gs_initData.argv[i]); + } + + delete [] gs_initData.argv; + gs_initData.argv = NULL; } } @@ -181,8 +206,6 @@ static void FreeConvertedArgs() // initialization which is always done (not customizable) before wxApp creation static bool DoCommonPreInit() { - wxClassInfo::InitializeClasses(); - return true; } @@ -228,25 +251,22 @@ bool wxEntryStart(int& argc, wxChar **argv) { // either IMPLEMENT_APP() was not used at all or it failed -- in any // case we still need something - // - // NB: cast is needed because for the backwards-compatibility reasons - // wxTheApp is really a wxApp and not just wxAppConsole... - app.Set((wxApp *)new wxDummyConsoleApp); + app.Set(new wxDummyConsoleApp); } // wxApp initialization: this can be customized // -------------------------------------------- - if ( !wxTheApp->Initialize(argc, argv) ) + if ( !app->Initialize(argc, argv) ) { return false; } - wxCallAppCleanup callAppCleanup(wxTheApp); + wxCallAppCleanup callAppCleanup(app.get()); // for compatibility call the old initialization function too - if ( !wxTheApp->OnInitGui() ) + if ( !app->OnInitGui() ) return false; @@ -309,7 +329,7 @@ static void DoCommonPreCleanup() // cleanup done after destroying wxTheApp static void DoCommonPostCleanup() { - wxClassInfo::CleanUpClasses(); + wxClassInfo::CleanUp(); // we can't do this in wxApp itself because it doesn't know if argv had // been allocated @@ -317,6 +337,16 @@ static void DoCommonPostCleanup() FreeConvertedArgs(); #endif // wxUSE_UNICODE + // check for memory leaks +#if (defined(__WXDEBUG__) && wxUSE_MEMORY_TRACING) || wxUSE_DEBUG_CONTEXT + if (wxDebugContext::CountObjectsLeft(TRUE) > 0) + { + wxLogDebug(wxT("There were memory leaks.\n")); + wxDebugContext::Dump(); + wxDebugContext::PrintStatistics(); + } +#endif // Debug + #if wxUSE_LOG // and now delete the last logger as well delete wxLog::SetActiveTarget(NULL); @@ -334,22 +364,11 @@ void wxEntryCleanup() wxTheApp->CleanUp(); delete wxTheApp; - wxTheApp = NULL; + wxApp::SetInstance(NULL); } DoCommonPostCleanup(); - - // check for memory leaks -#if (defined(__WXDEBUG__) && wxUSE_MEMORY_TRACING) || wxUSE_DEBUG_CONTEXT - if (wxDebugContext::CountObjectsLeft(TRUE) > 0) - { - wxLogDebug(wxT("There were memory leaks.\n")); - wxDebugContext::Dump(); - wxDebugContext::PrintStatistics(); - } -#endif // Debug - } // ---------------------------------------------------------------------------- @@ -372,8 +391,10 @@ int wxEntryReal(int& argc, wxChar **argv) // below returns or throws wxCleanupOnExit cleanupOnExit; + WX_SUPPRESS_UNUSED_WARN(cleanupOnExit); + // app initialization - if ( !wxTheApp->OnInit() ) + if ( !wxTheApp->CallOnInit() ) { // don't call OnExit() if OnInit() failed return -1; @@ -382,21 +403,6 @@ int wxEntryReal(int& argc, wxChar **argv) // app execution int retValue = wxTheApp->OnRun(); - // why should we do this? it doesn't close all window, just one of them and - // this shouldn't be necessary anyhow... -#if 0 - // close any remaining windows - wxWindow *topWindow = wxTheApp->GetTopWindow(); - if ( topWindow ) - { - // forcibly delete the window. - topWindow->Destroy(); - - // collect the dead objects - wxTheApp->DeletePendingObjects(); - } -#endif // 0 - // app clean up wxTheApp->OnExit(); @@ -407,20 +413,32 @@ int wxEntryReal(int& argc, wxChar **argv) // OnFatalException() if necessary #if defined(__WXMSW__) && wxUSE_ON_FATAL_EXCEPTION -extern unsigned long wxGlobalSEHandler(); +#ifdef __WXWINCE__ +// For ExitThread +#include "wx/msw/private.h" +#endif + +extern unsigned long wxGlobalSEHandler(EXCEPTION_POINTERS *pExcPtrs); -int wxEntry(int argc, wxChar **argv) +int wxEntry(int& argc, wxChar **argv) { __try { return wxEntryReal(argc, argv); } - __except ( wxGlobalSEHandler() ) + __except ( wxGlobalSEHandler(GetExceptionInformation()) ) { +#ifdef __WXWINCE__ + ::ExitThread(3); // the same exit code as abort() +#else ::ExitProcess(3); // the same exit code as abort() +#endif +#if !defined(_MSC_VER) || _MSC_VER < 1300 // this code is unreachable but put it here to suppress warnings + // from some compilers return -1; +#endif } } @@ -429,7 +447,7 @@ int wxEntry(int argc, wxChar **argv) #if wxUSE_UNICODE // as with wxEntryStart, we provide an ANSI wrapper -int wxEntry(int argc, char **argv) +int wxEntry(int& argc, char **argv) { ConvertArgsToUnicode(argc, argv);