X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/34c3ffca5b9a22a972ae0296c8713f8ff1956566..9c136858af7a37b1ed7d5f036f8d6953f7c8d507:/src/common/toplvcmn.cpp diff --git a/src/common/toplvcmn.cpp b/src/common/toplvcmn.cpp index da1e1cb9e0..b1af3fdd14 100644 --- a/src/common/toplvcmn.cpp +++ b/src/common/toplvcmn.cpp @@ -30,6 +30,7 @@ #ifndef WX_PRECOMP #include "wx/toplevel.h" #include "wx/dcclient.h" + #include "wx/app.h" #endif // WX_PRECOMP // ---------------------------------------------------------------------------- @@ -60,7 +61,19 @@ wxTopLevelWindowBase::wxTopLevelWindowBase() wxTopLevelWindowBase::~wxTopLevelWindowBase() { - // this destructor is required for Darwin + // don't let wxTheApp keep any stale pointers to us + if ( wxTheApp && wxTheApp->GetTopWindow() == this ) + wxTheApp->SetTopWindow(NULL); + + bool shouldExit = IsLastBeforeExit(); + + wxTopLevelWindows.DeleteObject(this); + + if ( shouldExit ) + { + // then do it + wxTheApp->ExitMainLoop(); + } } bool wxTopLevelWindowBase::Destroy() @@ -73,6 +86,19 @@ bool wxTopLevelWindowBase::Destroy() return TRUE; } +bool wxTopLevelWindowBase::IsLastBeforeExit() const +{ + // we exit the application if there are no more top level windows left + // normally but wxApp can prevent this from happening + return wxTopLevelWindows.GetCount() == 1 && + wxTopLevelWindows.GetFirst()->GetData() == (wxWindow *)this && + wxTheApp && wxTheApp->GetExitOnFrameDelete(); +} + +// ---------------------------------------------------------------------------- +// wxTopLevelWindow geometry +// ---------------------------------------------------------------------------- + wxSize wxTopLevelWindowBase::GetMaxSize() const { wxSize size( GetMaxWidth(), GetMaxHeight() );