X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/9a6384ca1e6e9a84f755dbca28875a5e89267766..8f4745feeb2850f3bebb3af45407e164550d541a:/src/common/init.cpp diff --git a/src/common/init.cpp b/src/common/init.cpp index b01d39cd9b..6e9f06fad8 100644 --- a/src/common/init.cpp +++ b/src/common/init.cpp @@ -27,30 +27,32 @@ #include "wx/app.h" #include "wx/filefn.h" #include "wx/log.h" - #include "wx/thread.h" #include "wx/intl.h" + #include "wx/module.h" #endif #include "wx/init.h" +#include "wx/thread.h" -#include "wx/ptr_scpd.h" -#include "wx/module.h" +#include "wx/scopedptr.h" #include "wx/except.h" -#if defined(__WXMSW__) && defined(__WXDEBUG__) +#if defined(__WXMSW__) #include "wx/msw/msvcrt.h" - static struct EnableMemLeakChecking - { - EnableMemLeakChecking() + #ifdef wxCrtSetDbgFlag + static struct EnableMemLeakChecking { - // do check for memory leaks on program exit (another useful flag - // is _CRTDBG_DELAY_FREE_MEM_DF which doesn't free deallocated - // memory which may be used to simulate low-memory condition) - wxCrtSetDbgFlag(_CRTDBG_LEAK_CHECK_DF); - } - } gs_enableLeakChecks; -#endif // __WXMSW__ && __WXDEBUG__ + EnableMemLeakChecking() + { + // check for memory leaks on program exit (another useful flag + // is _CRTDBG_DELAY_FREE_MEM_DF which doesn't free deallocated + // memory which may be used to simulate low-memory condition) + wxCrtSetDbgFlag(_CRTDBG_LEAK_CHECK_DF); + } + } gs_enableLeakChecks; + #endif // wxCrtSetDbgFlag +#endif // __WXMSW__ // ---------------------------------------------------------------------------- // private classes @@ -63,8 +65,9 @@ public: wxDummyConsoleApp() { } virtual int OnRun() { wxFAIL_MSG( _T("unreachable code") ); return 0; } + virtual bool DoYield(bool, long) { return true; } - DECLARE_NO_COPY_CLASS(wxDummyConsoleApp) + wxDECLARE_NO_COPY_CLASS(wxDummyConsoleApp); }; // we need a special kind of auto pointer to wxApp which not only deletes the @@ -93,7 +96,7 @@ public: wxApp::SetInstance(ptr); } - DECLARE_NO_COPY_CLASS(wxAppPtr) + wxDECLARE_NO_COPY_CLASS(wxAppPtr); }; // class to ensure that wxAppBase::CleanUp() is called if our Initialize() @@ -160,7 +163,7 @@ static struct InitData wchar_t **argv; #endif // wxUSE_UNICODE - DECLARE_NO_COPY_CLASS(InitData) + wxDECLARE_NO_COPY_CLASS(InitData); } gs_initData; // ============================================================================ @@ -176,14 +179,27 @@ static struct InitData static void ConvertArgsToUnicode(int argc, char **argv) { gs_initData.argv = new wchar_t *[argc + 1]; + int wargc = 0; for ( int i = 0; i < argc; i++ ) { +#ifdef __DARWIN__ + wxWCharBuffer buf(wxConvFileName->cMB2WX(argv[i])); +#else wxWCharBuffer buf(wxConvLocal.cMB2WX(argv[i])); - gs_initData.argv[i] = buf ? wxStrdup(buf) : NULL; +#endif + if ( !buf ) + { + wxLogWarning(_("Command line argument %d couldn't be converted to Unicode and will be ignored."), + i); + } + else // converted ok + { + gs_initData.argv[wargc++] = wxStrdup(buf); + } } - gs_initData.argc = argc; - gs_initData.argv[argc] = NULL; + gs_initData.argc = wargc; + gs_initData.argv[wargc] = NULL; } static void FreeConvertedArgs() @@ -211,6 +227,9 @@ static void FreeConvertedArgs() static bool DoCommonPreInit() { #if wxUSE_LOG + // Reset logging in case we were cleaned up and are being reinitialized. + wxLog::DoCreateOnDemand(); + // install temporary log sink: we can't use wxLogGui before wxApp is // constructed and if we use wxLogStderr, all messages during // initialization simply disappear under Windows @@ -243,9 +262,7 @@ bool wxEntryStart(int& argc, wxChar **argv) // initialize wxRTTI if ( !DoCommonPreInit() ) - { return false; - } // first of all, we need an application object @@ -278,15 +295,14 @@ bool wxEntryStart(int& argc, wxChar **argv) // -------------------------------------------- if ( !app->Initialize(argc, argv) ) - { return false; - } - wxCallAppCleanup callAppCleanup(app.get()); + // remember, possibly modified (e.g. due to removal of toolkit-specific + // parameters), command line arguments in member variables + app->argc = argc; + app->argv = argv; - // for compatibility call the old initialization function too - if ( !app->OnInitGui() ) - return false; + wxCallAppCleanup callAppCleanup(app.get()); // common initialization after wxTheApp creation @@ -320,7 +336,7 @@ bool wxEntryStart(int& argc, char **argv) { ConvertArgsToUnicode(argc, argv); - if ( !wxEntryStart(argc, gs_initData.argv) ) + if ( !wxEntryStart(gs_initData.argc, gs_initData.argv) ) { FreeConvertedArgs(); @@ -382,8 +398,12 @@ void wxEntryCleanup() { wxTheApp->CleanUp(); - delete wxTheApp; + // reset the global pointer to it to NULL before destroying it as in + // some circumstances this can result in executing the code using + // wxTheApp and using half-destroyed object is no good + wxAppConsole * const app = wxApp::GetInstance(); wxApp::SetInstance(NULL); + delete app; } @@ -419,7 +439,6 @@ int wxEntryReal(int& argc, wxChar **argv) wxTRY { - // app initialization if ( !wxTheApp->CallOnInit() ) { @@ -449,7 +468,7 @@ int wxEntry(int& argc, char **argv) { ConvertArgsToUnicode(argc, argv); - return wxEntry(argc, gs_initData.argv); + return wxEntry(gs_initData.argc, gs_initData.argv); } #endif // wxUSE_UNICODE