- strcpy(name, wxFileNameFromPath(name));
- wxStripExtension(name);
- wxTheApp->SetAppName(name);
-
- /* Break up string */
- // Treat strings enclosed in double-quotes as single arguments
- char* str = buf;
- while (*str)
- {
- while (*str && *str <= ' ') str++; // skip whitespace
- if (*str == '"')
- {
- str++;
- command[count++] = str;
- while (*str && *str != '"') str++;
- }
- else if (*str)
- {
- command[count++] = str;
- while (*str && *str > ' ') str++;
- }
- if (*str) *str++ = '\0';
- }
- command[count] = NULL; /* argv[] is NULL terminated list! */
-
- wxTheApp->argc = count;
- wxTheApp->argv = command;
- wxTheApp->m_nCmdShow = nCmdShow;
-
- // GUI-specific initialisation. In fact on Windows we don't have any,
- // but this call is provided for compatibility across platforms.
- wxTheApp->OnInitGui() ;
-
- if (!wxTheApp->OnInit())
- {
- wxTheApp->DeletePendingObjects();
+ if (wxWinHandleList)
+ delete wxWinHandleList;
+
+ // GL: I'm annoyed ... I don't know where to put this and I don't want to
+ // create a module for that as it's part of the core.
+ delete wxPendingEvents;
+#if wxUSE_THREADS
+ delete wxPendingEventsLocker;
+ // If we don't do the following, we get an apparent memory leak.
+ ((wxEvtHandler&) wxDefaultValidator).ClearEventLocker();
+#endif
+
+ wxClassInfo::CleanUpClasses();
+
+ delete wxTheApp;
+ wxTheApp = NULL;
+
+#if (defined(__WXDEBUG__) && wxUSE_MEMORY_TRACING) || wxUSE_DEBUG_CONTEXT
+ // At this point we want to check if there are any memory
+ // blocks that aren't part of the wxDebugContext itself,
+ // as a special case. Then when dumping we need to ignore
+ // wxDebugContext, too.
+ if (wxDebugContext::CountObjectsLeft(TRUE) > 0)
+ {
+ wxLogDebug(wxT("There were memory leaks."));
+ wxDebugContext::Dump();
+ wxDebugContext::PrintStatistics();
+ }
+ // wxDebugContext::SetStream(NULL, NULL);
+#endif
+
+#if wxUSE_LOG
+ // do it as the very last thing because everything else can log messages
+ delete wxLog::SetActiveTarget(NULL);
+#endif // wxUSE_LOG
+}
+
+#if !defined(_WINDLL) || (defined(_WINDLL) && defined(WXMAKINGDLL))
+
+// temporarily disable this warning which would be generated in release builds
+// because of __try
+#ifdef __VISUALC__
+ #pragma warning(disable: 4715) // not all control paths return a value
+#endif // Visual C++
+
+//// Main wxWindows entry point
+int wxEntry(WXHINSTANCE hInstance,
+ WXHINSTANCE WXUNUSED(hPrevInstance),
+ char *lpCmdLine,
+ int nCmdShow,
+ bool enterLoop)
+{
+ // 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);
+#ifdef __MWERKS__
+#if (defined(__WXDEBUG__) && wxUSE_MEMORY_TRACING) || wxUSE_DEBUG_CONTEXT
+ // This seems to be necessary since there are 'rogue'
+ // objects present at this point (perhaps global objects?)
+ // Setting a checkpoint will ignore them as far as the
+ // memory checking facility is concerned.
+ // Of course you may argue that memory allocated in globals should be
+ // checked, but this is a reasonable compromise.
+ wxDebugContext::SetCheckpoint();
+#endif
+#endif
+ // take everything into a try-except block in release build
+ // FIXME other compilers must support Win32 SEH (structured exception
+ // handling) too, just find the appropriate keyword in their docs!
+ // Please note that it's _not_ the same as C++ exceptions!
+#if !defined(__WXDEBUG__) && defined(__VISUALC__)
+ #define CATCH_PROGRAM_EXCEPTIONS
+
+ __try {
+#else
+ #undef CATCH_PROGRAM_EXCEPTIONS
+#endif
+ wxhInstance = (HINSTANCE) hInstance;
+
+ if (!wxApp::Initialize())
+ return 0;
+
+ // create the application object or ensure that one already exists
+ if (!wxTheApp)
+ {
+ // The app may have declared a global application object, but we recommend
+ // the IMPLEMENT_APP macro is used instead, which sets an initializer
+ // function for delayed, dynamic app object construction.
+ wxCHECK_MSG( wxApp::GetInitializerFunction(), 0,
+ wxT("No initializer - use IMPLEMENT_APP macro.") );
+
+ wxTheApp = (*wxApp::GetInitializerFunction()) ();
+ }
+
+ wxCHECK_MSG( wxTheApp, 0, wxT("You have to define an instance of wxApp!") );
+
+ // save the WinMain() parameters
+ wxTheApp->ConvertToStandardCommandArgs(lpCmdLine);
+ wxTheApp->m_nCmdShow = nCmdShow;
+
+ // GUI-specific initialisation. In fact on Windows we don't have any,
+ // but this call is provided for compatibility across platforms.
+ wxTheApp->OnInitGui();
+
+ // We really don't want timestamps by default, because it means
+ // we can't simply double-click on the error message and get to that
+ // line in the source. So VC++ at least, let's have a sensible default.
+#ifdef __VISUALC__
+ wxLog::SetTimestamp(NULL);
+#endif
+
+ int retValue = 0;
+
+ if ( wxTheApp->OnInit() )
+ {
+ if ( enterLoop )
+ {
+ retValue = wxTheApp->OnRun();
+ }
+ else
+ // We want to initialize, but not run or exit immediately.
+ return 1;
+ }
+ //else: app initialization failed, so we skipped OnRun()
+
+ wxWindow *topWindow = wxTheApp->GetTopWindow();
+ if ( topWindow )
+ {
+ // Forcibly delete the window.
+ if ( topWindow->IsKindOf(CLASSINFO(wxFrame)) ||
+ topWindow->IsKindOf(CLASSINFO(wxDialog)) )
+ {
+ topWindow->Close(TRUE);
+ wxTheApp->DeletePendingObjects();
+ }
+ else
+ {
+ delete topWindow;
+ wxTheApp->SetTopWindow(NULL);
+ }
+ }
+