X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/265db88d614412556eaf6671f442ca44d9f19b70..3cfde7c049bddf6fd3b4c2e35a6b8ecdcdc1d74f:/src/common/init.cpp diff --git a/src/common/init.cpp b/src/common/init.cpp index bb5693e4a9..d9d3cf0dc7 100644 --- a/src/common/init.cpp +++ b/src/common/init.cpp @@ -27,12 +27,12 @@ #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/except.h" @@ -179,7 +179,11 @@ static void ConvertArgsToUnicode(int argc, char **argv) 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])); +#endif if ( !buf ) { wxLogWarning(_("Command line argument %d couldn't be converted to Unicode and will be ignored."), @@ -220,6 +224,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 @@ -242,6 +249,44 @@ 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; } @@ -291,6 +336,12 @@ bool wxEntryStart(int& argc, wxChar **argv) return false; } + // remember, possibly modified (e.g. due to removal of toolkit-specific + // parameters), command line arguments in member variables + app->argc = argc; + app->argv = argv; + + wxCallAppCleanup callAppCleanup(app.get()); // for compatibility call the old initialization function too @@ -391,8 +442,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; }