X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/2dc62891c42229d26e0cb1b5c3fb6e37750c01d3..55420742a101b2963c40694cb879ea3de4fb6bb2:/src/common/appbase.cpp diff --git a/src/common/appbase.cpp b/src/common/appbase.cpp index fd408ab0d9..697aa2dd87 100644 --- a/src/common/appbase.cpp +++ b/src/common/appbase.cpp @@ -1,5 +1,5 @@ /////////////////////////////////////////////////////////////////////////////// -// Name: common/base/appbase.cpp +// Name: src/common/appbase.cpp // Purpose: implements wxAppConsole class // Author: Vadim Zeitlin // Modified by: @@ -25,13 +25,16 @@ #endif #ifndef WX_PRECOMP + #ifdef __WXMSW__ + #include "wx/msw/wrapwin.h" // includes windows.h for MessageBox() + #endif + #include "wx/list.h" #include "wx/app.h" #include "wx/intl.h" - #include "wx/list.h" #include "wx/log.h" + #include "wx/utils.h" #endif //WX_PRECOMP -#include "wx/utils.h" #include "wx/apptrait.h" #include "wx/cmdline.h" #include "wx/confbase.h" @@ -43,10 +46,6 @@ #include // for SIGTRAP used by wxTrap() #endif //Win/Unix -#if defined(__WXMSW__) - #include "wx/msw/wrapwin.h" // includes windows.h for MessageBox() -#endif - #if wxUSE_FONTMAP #include "wx/fontmap.h" #endif // wxUSE_FONTMAP @@ -93,6 +92,7 @@ static void ShowAssertDialog(const wxChar *szFile, int nLine, + const wxChar *szFunc, const wxChar *szCond, const wxChar *szMsg, wxAppTraits *traits = NULL); @@ -268,7 +268,7 @@ void wxAppConsole::ProcessPendingEvents() if ( !wxPendingEventsLocker ) return; #endif - + // ensure that we're the only thread to modify the pending events list wxENTER_CRIT_SECT( *wxPendingEventsLocker ); @@ -280,6 +280,15 @@ void wxAppConsole::ProcessPendingEvents() // iterate until the list becomes empty wxList::compatibility_iterator node = wxPendingEvents->GetFirst(); + + while (node && + ((wxEvtHandler *)node->GetData())->IsEventHandlingInProgress() && + ((wxEvtHandler *)node->GetData())->IsReentranceAllowed() == false) + { + // skip over event + node = node->GetNext(); + } + while (node) { wxEvtHandler *handler = (wxEvtHandler *)node->GetData(); @@ -288,12 +297,20 @@ void wxAppConsole::ProcessPendingEvents() // In ProcessPendingEvents(), new handlers might be add // and we can safely leave the critical section here. wxLEAVE_CRIT_SECT( *wxPendingEventsLocker ); - + handler->ProcessPendingEvents(); wxENTER_CRIT_SECT( *wxPendingEventsLocker ); node = wxPendingEvents->GetFirst(); + + while (node && + ((wxEvtHandler *)node->GetData())->IsEventHandlingInProgress() && + ((wxEvtHandler *)node->GetData())->IsReentranceAllowed() == false) + { + // skip over event + node = node->GetNext(); + } } wxLEAVE_CRIT_SECT( *wxPendingEventsLocker ); @@ -434,12 +451,21 @@ bool wxAppConsole::CheckBuildOptions(const char *optionsSignature, #ifdef __WXDEBUG__ +void wxAppConsole::OnAssertFailure(const wxChar *file, + int line, + const wxChar *func, + const wxChar *cond, + const wxChar *msg) +{ + ShowAssertDialog(file, line, func, cond, msg, GetTraits()); +} + void wxAppConsole::OnAssert(const wxChar *file, int line, const wxChar *cond, const wxChar *msg) { - ShowAssertDialog(file, line, cond, msg, GetTraits()); + OnAssertFailure(file, line, NULL, cond, msg); } #endif // __WXDEBUG__ @@ -587,19 +613,10 @@ void wxTrap() #endif // Win/Unix } -void wxAssert(int cond, - const wxChar *szFile, - int nLine, - const wxChar *szCond, - const wxChar *szMsg) -{ - if ( !cond ) - wxOnAssert(szFile, nLine, szCond, szMsg); -} - // this function is called when an assert fails void wxOnAssert(const wxChar *szFile, int nLine, + const char *szFunc, const wxChar *szCond, const wxChar *szMsg) { @@ -618,16 +635,19 @@ void wxOnAssert(const wxChar *szFile, s_bInAssert = true; + // __FUNCTION__ is always in ASCII, convert it to wide char if needed + const wxString strFunc = wxString::FromAscii(szFunc); + if ( !wxTheApp ) { // by default, show the assert dialog box -- we can't customize this // behaviour - ShowAssertDialog(szFile, nLine, szCond, szMsg); + ShowAssertDialog(szFile, nLine, strFunc, szCond, szMsg); } else { // let the app process it as it wants - wxTheApp->OnAssert(szFile, nLine, szCond, szMsg); + wxTheApp->OnAssertFailure(szFile, nLine, strFunc, szCond, szMsg); } s_bInAssert = false; @@ -738,7 +758,7 @@ static wxString GetAssertStackTrace() }; StackDump dump; - dump.Walk(5); // don't show OnAssert() call itself + dump.Walk(2); // don't show OnAssert() call itself stackTrace = dump.GetStackTrace(); // don't show more than maxLines or we could get a dialog too tall to be @@ -757,6 +777,7 @@ static wxString GetAssertStackTrace() static void ShowAssertDialog(const wxChar *szFile, int nLine, + const wxChar *szFunc, const wxChar *szCond, const wxChar *szMsg, wxAppTraits *traits) @@ -772,6 +793,11 @@ void ShowAssertDialog(const wxChar *szFile, // the failed assert msg.Printf(wxT("%s(%d): assert \"%s\" failed"), szFile, nLine, szCond); + // add the function name, if any + if ( szFunc && *szFunc ) + msg << _T(" in ") << szFunc << _T("()"); + + // and the message itself if ( szMsg ) { msg << _T(": ") << szMsg; @@ -829,4 +855,3 @@ void ShowAssertDialog(const wxChar *szFile, } #endif // __WXDEBUG__ -