]> git.saurik.com Git - wxWidgets.git/blobdiff - src/common/init.cpp
wxMessageBox off the main thread lost result code.
[wxWidgets.git] / src / common / init.cpp
index aca0a833060a0d27e5659fb80d0ac4c87fc2d176..e00daeb7013a1c83db8175f2ac0bfb1171906488 100644 (file)
@@ -4,7 +4,6 @@
 // Author:      Vadim Zeitlin
 // Modified by:
 // Created:     04.10.99
-// RCS-ID:      $Id$
 // Copyright:   (c) Vadim Zeitlin
 // Licence:     wxWindows licence
 /////////////////////////////////////////////////////////////////////////////
@@ -37,7 +36,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
             }
         } gs_enableLeakChecks;
     #endif // wxCrtSetDbgFlag
-#endif // __WXMSW__
+#endif // __WINDOWS__
+
+#if wxUSE_UNICODE && defined(__WXOSX__)
+    #include <locale.h>
+#endif
 
 // ----------------------------------------------------------------------------
 // private classes
@@ -203,8 +207,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,6 +221,18 @@ 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();
@@ -238,6 +253,16 @@ static bool DoCommonPreInit()
     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;
 }
 
@@ -384,6 +409,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
@@ -422,9 +452,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)
 {
@@ -442,6 +472,9 @@ int wxEntryReal(int& argc, wxChar **argv)
 
     wxTRY
     {
+#if 0 // defined(__WXOSX__) && wxOSX_USE_COCOA_OR_IPHONE
+        // everything done in OnRun using native callbacks
+#else
         // app initialization
         if ( !wxTheApp->CallOnInit() )
         {
@@ -457,7 +490,7 @@ int wxEntryReal(int& argc, wxChar **argv)
         } callOnExit;
 
         WX_SUPPRESS_UNUSED_WARN(callOnExit);
-
+#endif
         // app execution
         return wxTheApp->OnRun();
     }