X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/4b6a582bef796b43ad4cf0a96bd40bfd631460c6..29a35dd5fee0e33143a39824e71aefd66e3e4851:/src/common/init.cpp diff --git a/src/common/init.cpp b/src/common/init.cpp index a183c256f2..cf36649317 100644 --- a/src/common/init.cpp +++ b/src/common/init.cpp @@ -64,7 +64,7 @@ class wxDummyConsoleApp : public wxAppConsole public: wxDummyConsoleApp() { } - virtual int OnRun() { wxFAIL_MSG( _T("unreachable code") ); return 0; } + virtual int OnRun() { wxFAIL_MSG( wxT("unreachable code") ); return 0; } virtual bool DoYield(bool, long) { return true; } wxDECLARE_NO_COPY_CLASS(wxDummyConsoleApp); @@ -113,14 +113,6 @@ private: wxAppConsole *m_app; }; -// another tiny class which simply exists to ensure that wxEntryCleanup is -// always called -class wxCleanupOnExit -{ -public: - ~wxCleanupOnExit() { wxEntryCleanup(); } -}; - // ---------------------------------------------------------------------------- // private functions // ---------------------------------------------------------------------------- @@ -229,13 +221,6 @@ 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 - // - // note that we will delete this log target below - delete wxLog::SetActiveTarget(new wxLogBuffer); #endif // wxUSE_LOG return true; @@ -252,44 +237,6 @@ static bool DoCommonPostInit() return false; } -#if defined(__WXDEBUG__) - // check if event classes implement Clone() correctly - // NOTE: the check is done against _all_ event classes which are linked to - // the executable currently running, which are not necessarily all - // wxWidgets event classes. - const wxClassInfo *ci = wxClassInfo::GetFirst(); - for (; ci; ci = ci->GetNext()) - { - // is this class derived from wxEvent? - if (!ci->IsKindOf(CLASSINFO(wxEvent)) || wxString(ci->GetClassName()) == "wxEvent") - continue; - - if (!ci->IsDynamic()) - { - wxLogWarning("The event class '%s' should have a DECLARE_DYNAMIC_CLASS macro!", - ci->GetClassName()); - continue; - } - - // yes; test if it implements Clone() correctly - wxEvent* test = wxDynamicCast(ci->CreateObject(),wxEvent); - if (test == NULL) - { - wxLogWarning("The event class '%s' should have a DECLARE_DYNAMIC_CLASS macro!", - ci->GetClassName()); - continue; - } - - wxEvent* cloned = test->Clone(); - if (!cloned || cloned->GetClassInfo() != ci) - wxLogWarning("The event class '%s' does not correctly implement Clone()!", - ci->GetClassName()); - - delete cloned; - delete test; - } -#endif - return true; } @@ -394,14 +341,15 @@ bool wxEntryStart(int& argc, char **argv) static void DoCommonPreCleanup() { #if wxUSE_LOG - // flush the logged messages if any and install a 'safer' log target: the - // default one (wxLogGui) can't be used after the resources are freed just - // below and the user supplied one might be even more unsafe (using any - // wxWidgets GUI function is unsafe starting from now) - wxLog::DontCreateOnDemand(); - - // this will flush the old messages if any - delete wxLog::SetActiveTarget(new wxLogStderr); + // flush the logged messages if any and don't use the current probably + // unsafe log target any more: the default one (wxLogGui) can't be used + // after the resources are freed which happens when we return and the user + // supplied one might be even more unsafe (using any wxWidgets GUI function + // is unsafe starting from now) + // + // notice that wxLog will still recreate a default log target if any + // messages are logged but that one will be safe to use until the very end + delete wxLog::SetActiveTarget(NULL); #endif // wxUSE_LOG } @@ -422,6 +370,12 @@ static void DoCommonPostCleanup() #if wxUSE_LOG // and now delete the last logger as well + // + // we still don't disable log target auto-vivification even if any log + // objects created now will result in memory leaks because it seems better + // to leak memory which doesn't matter much considering the application is + // exiting anyhow than to not show messages which could still be logged + // from the user code (e.g. static dtors and such) delete wxLog::SetActiveTarget(NULL); #endif // wxUSE_LOG } @@ -460,7 +414,9 @@ void wxEntryCleanup() int wxEntryReal(int& argc, wxChar **argv) { // library initialization - if ( !wxEntryStart(argc, argv) ) + wxInitializer initializer(argc, argv); + + if ( !initializer.IsOk() ) { #if wxUSE_LOG // flush any log messages explaining why we failed @@ -469,12 +425,6 @@ int wxEntryReal(int& argc, wxChar **argv) return -1; } - // if wxEntryStart succeeded, we must call wxEntryCleanup even if the code - // below returns or throws - wxCleanupOnExit cleanupOnExit; - - WX_SUPPRESS_UNUSED_WARN(cleanupOnExit); - wxTRY { // app initialization @@ -515,6 +465,11 @@ int wxEntry(int& argc, char **argv) // wxInitialize/wxUninitialize // ---------------------------------------------------------------------------- +bool wxInitialize() +{ + return wxInitialize(0, (wxChar**)NULL); +} + bool wxInitialize(int argc, wxChar **argv) { wxCRIT_SECT_LOCKER(lockInit, gs_initData.csInit); @@ -528,6 +483,21 @@ bool wxInitialize(int argc, wxChar **argv) return wxEntryStart(argc, argv); } +#if wxUSE_UNICODE +bool wxInitialize(int argc, char **argv) +{ + wxCRIT_SECT_LOCKER(lockInit, gs_initData.csInit); + + if ( gs_initData.nInitCount++ ) + { + // already initialized + return true; + } + + return wxEntryStart(argc, argv); +} +#endif // wxUSE_UNICODE + void wxUninitialize() { wxCRIT_SECT_LOCKER(lockInit, gs_initData.csInit);