\helpref{wxTopLevelWindow::GetTitle}{wxtoplevelwindowgettitle}
+\membersection{wxTopLevelWindow::ShouldPreventAppExit}\label{wxtoplevelwindowshouldpreventappexit}
+
+\constfunc{virtual bool}{ShouldPreventAppExit}{\void}
+
+This virtual function is not meant to be called directly but can be overridden
+to return \false (it returns \true by default) to allow the application to
+close even if this, presumably not very important, window is still opened.
+By default, the application stays alive as long as there are any open top level
+windows.
+
+
\membersection{wxTopLevelWindow::ShowFullScreen}\label{wxtoplevelwindowshowfullscreen}
\func{bool}{ShowFullScreen}{\param{bool}{ show}, \param{long}{ style = wxFULLSCREEN\_ALL}}
virtual bool IsOneOfBars(const wxWindow *WXUNUSED(win)) const
{ return false; }
- // check if we should exit the program after deleting this top level
- // window (this is used in common dtor and wxMSW code)
+ // this function may be overridden to return false to allow closing the
+ // application even when this top level window is still open
+ //
+ // notice that the window is still closed prior to the application exit and
+ // so it can still veto it even if it returns false from here
+ virtual bool ShouldPreventAppExit() const { return true; }
+
+ // check if we should exit the program after deleting this window
bool IsLastBeforeExit() const;
// send the iconize event, return true if processed
if ( wxTheApp && wxTheApp->GetTopWindow() == this )
wxTheApp->SetTopWindow(NULL);
- bool shouldExit = IsLastBeforeExit();
-
wxTopLevelWindows.DeleteObject(this);
- if ( shouldExit )
+ if ( IsLastBeforeExit() )
{
- // then do it
+ // no other (important) windows left, quit the app
wxTheApp->ExitMainLoop();
}
}
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();
+ // first of all, automatically exiting the app on last window close can be
+ // completely disabled at wxTheApp level
+ if ( !wxTheApp || !wxTheApp->GetExitOnFrameDelete() )
+ return false;
+
+ wxWindowList::const_iterator i;
+ const wxWindowList::const_iterator end = wxTopLevelWindows.end();
+
+ // then decide whether we should exit at all
+ for ( i = wxTopLevelWindows.begin(); i != end; ++i )
+ {
+ wxTopLevelWindow * const win = wx_static_cast(wxTopLevelWindow *, *i);
+ if ( win->ShouldPreventAppExit() )
+ {
+ // there remains at least one important TLW, don't exit
+ return false;
+ }
+ }
+
+ // if yes, close all the other windows: this could still fail
+ for ( i = wxTopLevelWindows.begin(); i != end; ++i )
+ {
+ // don't close twice the windows which are already marked for deletion
+ wxTopLevelWindow * const win = wx_static_cast(wxTopLevelWindow *, *i);
+ if ( !wxPendingDelete.Member(win) && !win->Close() )
+ {
+ // one of the windows refused to close, don't exit
+ //
+ // NB: of course, by now some other windows could have been already
+ // closed but there is really nothing we can do about it as we
+ // have no way just to ask the window if it can close without
+ // forcing it to do it
+ return false;
+ }
+ }
+
+ return true;
}
// ----------------------------------------------------------------------------