+void wxAppBase::CleanUp()
+{
+ // clean up all the pending objects
+ DeletePendingObjects();
+
+ // and any remaining TLWs (they remove themselves from wxTopLevelWindows
+ // when destroyed, so iterate until none are left)
+ while ( !wxTopLevelWindows.empty() )
+ {
+ // do not use Destroy() here as it only puts the TLW in pending list
+ // but we want to delete them now
+ delete wxTopLevelWindows.GetFirst()->GetData();
+ }
+
+ // undo everything we did in Initialize() above
+ wxBitmap::CleanUpHandlers();
+
+ wxDeleteStockObjects();
+
+ wxDeleteStockLists();
+
+ delete wxTheColourDatabase;
+ wxTheColourDatabase = NULL;
+
+ delete wxPendingEvents;
+ wxPendingEvents = NULL;
+
+#if wxUSE_THREADS
+ delete wxPendingEventsLocker;
+ wxPendingEventsLocker = NULL;
+
+ #if wxUSE_VALIDATORS
+ // If we don't do the following, we get an apparent memory leak.
+ ((wxEvtHandler&) wxDefaultValidator).ClearEventLocker();
+ #endif // wxUSE_VALIDATORS
+#endif // wxUSE_THREADS
+}
+
+#if wxUSE_CMDLINE_PARSER
+
+// ----------------------------------------------------------------------------
+// GUI-specific command line options handling
+// ----------------------------------------------------------------------------
+
+#define OPTION_THEME _T("theme")
+#define OPTION_MODE _T("mode")
+
+void wxAppBase::OnInitCmdLine(wxCmdLineParser& parser)
+{
+ // first add the standard non GUI options
+ wxAppConsole::OnInitCmdLine(parser);
+
+ // the standard command line options
+ static const wxCmdLineEntryDesc cmdLineGUIDesc[] =
+ {
+#ifdef __WXUNIVERSAL__
+ {
+ wxCMD_LINE_OPTION,
+ wxEmptyString,
+ OPTION_THEME,
+ gettext_noop("specify the theme to use"),
+ wxCMD_LINE_VAL_STRING,
+ 0x0
+ },
+#endif // __WXUNIVERSAL__
+
+#if defined(__WXMGL__)
+ // VS: this is not specific to wxMGL, all fullscreen (framebuffer) ports
+ // should provide this option. That's why it is in common/appcmn.cpp
+ // and not mgl/app.cpp
+ {
+ wxCMD_LINE_OPTION,
+ wxEmptyString,
+ OPTION_MODE,
+ gettext_noop("specify display mode to use (e.g. 640x480-16)"),
+ wxCMD_LINE_VAL_STRING,
+ 0x0
+ },
+#endif // __WXMGL__
+
+ // terminator
+ {
+ wxCMD_LINE_NONE,
+ wxEmptyString,
+ wxEmptyString,
+ wxEmptyString,
+ wxCMD_LINE_VAL_NONE,
+ 0x0
+ }
+ };
+
+ parser.SetDesc(cmdLineGUIDesc);
+}
+
+bool wxAppBase::OnCmdLineParsed(wxCmdLineParser& parser)
+{
+#ifdef __WXUNIVERSAL__
+ wxString themeName;
+ if ( parser.Found(OPTION_THEME, &themeName) )
+ {
+ wxTheme *theme = wxTheme::Create(themeName);
+ if ( !theme )
+ {
+ wxLogError(_("Unsupported theme '%s'."), themeName.c_str());
+ return false;
+ }
+
+ // Delete the defaultly created theme and set the new theme.
+ delete wxTheme::Get();
+ wxTheme::Set(theme);
+ }
+#endif // __WXUNIVERSAL__
+
+#if defined(__WXMGL__)
+ wxString modeDesc;
+ if ( parser.Found(OPTION_MODE, &modeDesc) )
+ {
+ unsigned w, h, bpp;
+ if ( wxSscanf(modeDesc.c_str(), _T("%ux%u-%u"), &w, &h, &bpp) != 3 )
+ {
+ wxLogError(_("Invalid display mode specification '%s'."), modeDesc.c_str());
+ return false;
+ }
+
+ if ( !SetDisplayMode(wxVideoMode(w, h, bpp)) )
+ return false;
+ }
+#endif // __WXMGL__
+
+ return wxAppConsole::OnCmdLineParsed(parser);
+}
+
+#endif // wxUSE_CMDLINE_PARSER
+
+// ----------------------------------------------------------------------------
+// main event loop implementation
+// ----------------------------------------------------------------------------
+
+int wxAppBase::MainLoop()
+{
+#if wxUSE_EVTLOOP_IN_APP
+ wxEventLoopTiedPtr mainLoop(&m_mainLoop, new wxEventLoop);
+
+ return m_mainLoop->Run();
+#else // !wxUSE_EVTLOOP_IN_APP
+ return 0;
+#endif // wxUSE_EVTLOOP_IN_APP/!wxUSE_EVTLOOP_IN_APP
+}
+
+void wxAppBase::ExitMainLoop()
+{
+#if wxUSE_EVTLOOP_IN_APP
+ // we should exit from the main event loop, not just any currently active
+ // (e.g. modal dialog) event loop
+ if ( m_mainLoop && m_mainLoop->IsRunning() )
+ {
+ m_mainLoop->Exit(0);
+ }
+#endif // wxUSE_EVTLOOP_IN_APP
+}
+
+bool wxAppBase::Pending()
+{
+#if wxUSE_EVTLOOP_IN_APP
+ // use the currently active message loop here, not m_mainLoop, because if
+ // we're showing a modal dialog (with its own event loop) currently the
+ // main event loop is not running anyhow
+ wxEventLoop * const loop = wxEventLoop::GetActive();
+
+ return loop && loop->Pending();
+#else // wxUSE_EVTLOOP_IN_APP
+ return false;
+#endif // wxUSE_EVTLOOP_IN_APP/!wxUSE_EVTLOOP_IN_APP
+}
+
+bool wxAppBase::Dispatch()
+{
+#if wxUSE_EVTLOOP_IN_APP
+ // see comment in Pending()
+ wxEventLoop * const loop = wxEventLoop::GetActive();
+
+ return loop && loop->Dispatch();
+#else // wxUSE_EVTLOOP_IN_APP
+ return true;
+#endif // wxUSE_EVTLOOP_IN_APP/!wxUSE_EVTLOOP_IN_APP
+}
+
+// ----------------------------------------------------------------------------
+// OnXXX() hooks
+// ----------------------------------------------------------------------------
+