X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/d368860323bf1f7e03e8ece4e8ce75f88d5ef7dc..ccc040255c07064f2ed96f1a345d21860b202cb6:/src/common/init.cpp diff --git a/src/common/init.cpp b/src/common/init.cpp index cf36649317..ee45254523 100644 --- a/src/common/init.cpp +++ b/src/common/init.cpp @@ -37,7 +37,8 @@ #include "wx/scopedptr.h" #include "wx/except.h" -#if defined(__WXMSW__) +#if defined(__WINDOWS__) + #include "wx/msw/private.h" #include "wx/msw/msvcrt.h" #ifdef wxCrtSetDbgFlag @@ -52,7 +53,11 @@ } } gs_enableLeakChecks; #endif // wxCrtSetDbgFlag -#endif // __WXMSW__ +#endif // __WINDOWS__ + +#if wxUSE_UNICODE && defined(__WXOSX__) + #include +#endif // ---------------------------------------------------------------------------- // private classes @@ -203,8 +208,7 @@ static void FreeConvertedArgs() free(gs_initData.argv[i]); } - delete [] gs_initData.argv; - gs_initData.argv = NULL; + wxDELETEA(gs_initData.argv); gs_initData.argc = 0; } } @@ -218,11 +222,48 @@ static void FreeConvertedArgs() // initialization which is always done (not customizable) before wxApp creation static bool DoCommonPreInit() { +#if wxUSE_UNICODE && defined(__WXOSX__) + // In OS X and iOS, wchar_t CRT functions convert to char* and fail under + // some locales. The safest fix is to set LC_CTYPE to UTF-8 to ensure that + // they can handle any input. + // + // Note that this must be done for any app, Cocoa or console, whether or + // not it uses wxLocale. + // + // See http://stackoverflow.com/questions/11713745/why-does-the-printf-family-of-functions-care-about-locale + setlocale(LC_CTYPE, "UTF-8"); +#endif // wxUSE_UNICODE && defined(__WXOSX__) + #if wxUSE_LOG // Reset logging in case we were cleaned up and are being reinitialized. wxLog::DoCreateOnDemand(); + + // force wxLog to create a log target now: we do it because wxTheApp + // doesn't exist yet so wxLog will create a special log target which is + // safe to use even when the GUI is not available while without this call + // we could create wxApp in wxEntryStart() below, then log an error about + // e.g. failure to establish connection to the X server and wxLog would + // send it to wxLogGui (because wxTheApp does exist already) which, of + // course, can't be used in this case + // + // notice also that this does nothing if the user had set up a custom log + // target before -- which is fine as we want to give him this possibility + // (as it's impossible to override logging by overriding wxAppTraits:: + // CreateLogTarget() before wxApp is created) and we just assume he knows + // what he is doing + wxLog::GetActiveTarget(); #endif // wxUSE_LOG +#ifdef __WINDOWS__ + // GUI applications obtain HINSTANCE in their WinMain() but we also need to + // initialize the global wxhInstance variable for the console programs as + // they may need it too, so set it here if it wasn't done yet + if ( !wxGetInstance() ) + { + wxSetInstance(::GetModuleHandle(NULL)); + } +#endif // __WINDOWS__ + return true; } @@ -369,6 +410,11 @@ static void DoCommonPostCleanup() delete wxMessageOutput::Set(NULL); #if wxUSE_LOG + // call this first as it has a side effect: in addition to flushing all + // logs for this thread, it also flushes everything logged from other + // threads + wxLog::FlushActive(); + // and now delete the last logger as well // // we still don't disable log target auto-vivification even if any log @@ -407,9 +453,9 @@ void wxEntryCleanup() // ---------------------------------------------------------------------------- // for MSW the real wxEntry is defined in msw/main.cpp -#ifndef __WXMSW__ +#ifndef __WINDOWS__ #define wxEntryReal wxEntry -#endif // !__WXMSW__ +#endif // !__WINDOWS__ int wxEntryReal(int& argc, wxChar **argv) {