+ // 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();
+
+ wxStockGDI::DeleteAll();
+
+ wxDeleteStockLists();
+
+ delete wxTheColourDatabase;
+ wxTheColourDatabase = NULL;
+
+ wxAppConsole::CleanUp();
+}
+
+// ----------------------------------------------------------------------------
+// various accessors
+// ----------------------------------------------------------------------------
+
+wxWindow* wxAppBase::GetTopWindow() const
+{
+ wxWindow* window = m_topWindow;
+ if (window == NULL && wxTopLevelWindows.GetCount() > 0)
+ window = wxTopLevelWindows.GetFirst()->GetData();
+ return window;
+}
+
+wxVideoMode wxAppBase::GetDisplayMode() const
+{
+ return wxVideoMode();
+}
+
+wxLayoutDirection wxAppBase::GetLayoutDirection() const
+{
+#if wxUSE_INTL
+ const wxLocale *const locale = wxGetLocale();
+ if ( locale )
+ {
+ const wxLanguageInfo *const
+ info = wxLocale::GetLanguageInfo(locale->GetLanguage());
+
+ if ( info )
+ return info->LayoutDirection;
+ }
+#endif // wxUSE_INTL
+
+ // we don't know
+ return wxLayout_Default;
+}
+
+#if wxUSE_CMDLINE_PARSER
+
+// ----------------------------------------------------------------------------
+// GUI-specific command line options handling
+// ----------------------------------------------------------------------------
+
+#define OPTION_THEME "theme"
+#define OPTION_MODE "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,
+ NULL,
+ 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,
+ NULL,
+ OPTION_MODE,
+ gettext_noop("specify display mode to use (e.g. 640x480-16)"),
+ wxCMD_LINE_VAL_STRING,
+ 0x0
+ },
+#endif // __WXMGL__
+
+ // terminator
+ wxCMD_LINE_DESC_END
+ };
+
+ 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
+
+// ----------------------------------------------------------------------------
+// OnXXX() hooks
+// ----------------------------------------------------------------------------
+
+bool wxAppBase::OnInitGui()
+{
+#ifdef __WXUNIVERSAL__
+ if ( !wxTheme::Get() && !wxTheme::CreateDefault() )
+ return false;
+#endif // __WXUNIVERSAL__
+
+ return true;
+}
+
+int wxAppBase::OnRun()
+{
+ // see the comment in ctor: if the initial value hasn't been changed, use
+ // the default Yes from now on
+ if ( m_exitOnFrameDelete == Later )
+ {
+ m_exitOnFrameDelete = Yes;
+ }
+ //else: it has been changed, assume the user knows what he is doing