diff --git a/src/common/appcmn.cpp b/src/common/appcmn.cpp index 1e30f70f15..cae7033056 100644 --- a/src/common/appcmn.cpp +++ b/src/common/appcmn.cpp @@ -42,6 +42,7 @@ #include "wx/thread.h" #include "wx/utils.h" #include "wx/ptr_scpd.h" +#include "wx/evtloop.h" #if defined(__WXMSW__) #include "wx/msw/private.h" // includes windows.h for LOGFONT @@ -61,7 +62,9 @@ WX_CHECK_BUILD_OPTIONS("wxCore") // ---------------------------------------------------------------------------- // this defines wxEventLoopPtr +#if wxUSE_EVTLOOP_IN_APP wxDEFINE_TIED_SCOPED_PTR_TYPE(wxEventLoop) +#endif // ============================================================================ // wxAppBase implementation @@ -463,6 +466,39 @@ void wxAppBase::OnIdle(wxIdleEvent& WXUNUSED(event)) } +// ---------------------------------------------------------------------------- +// exception handling +// ---------------------------------------------------------------------------- + +#if wxUSE_EXCEPTIONS + +void wxAppBase::HandleEvent(wxEvtHandler *handler, + wxEventFunction func, + wxEvent& event) const +{ + // by default, call wxApp::OnExceptionInMainLoop if an exception occurs + try + { + handler->DoHandleEvent(func, event); + } + catch ( ... ) + { + if ( !wxConstCast(this, wxAppBase)->OnExceptionInMainLoop() ) + { +#if wxUSE_EVTLOOP_IN_APP + wxEventLoop *loop = wxEventLoop::GetActive(); + if ( loop ) + loop->Exit(-1); +#else + wxConstCast(this, wxAppBase)->ExitMainLoop(); +#endif + } + //else: continue running the event loop + } +} + +#endif // wxUSE_EXCEPTIONS + // ---------------------------------------------------------------------------- // wxGUIAppTraitsBase // ----------------------------------------------------------------------------