X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/b0d8bfa6cd4042d3ea8680ad0145f79e3cb15268..ce7208d49d5ce2ca1dc0b3b83f14f1d04f29c4bf:/src/common/appbase.cpp?ds=sidebyside diff --git a/src/common/appbase.cpp b/src/common/appbase.cpp index c1bbddd326..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 @@ -269,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 ); @@ -281,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(); @@ -289,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 ); @@ -449,7 +465,7 @@ void wxAppConsole::OnAssert(const wxChar *file, const wxChar *cond, const wxChar *msg) { - OnAssertFailure(file, line, _T(""), cond, msg); + OnAssertFailure(file, line, NULL, cond, msg); } #endif // __WXDEBUG__ @@ -600,7 +616,7 @@ void wxTrap() // this function is called when an assert fails void wxOnAssert(const wxChar *szFile, int nLine, - const wxChar *szFunc, + const char *szFunc, const wxChar *szCond, const wxChar *szMsg) { @@ -619,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, szFunc, szCond, szMsg); + ShowAssertDialog(szFile, nLine, strFunc, szCond, szMsg); } else { // let the app process it as it wants - wxTheApp->OnAssertFailure(szFile, nLine, szFunc, szCond, szMsg); + wxTheApp->OnAssertFailure(szFile, nLine, strFunc, szCond, szMsg); } s_bInAssert = false; @@ -836,4 +855,3 @@ void ShowAssertDialog(const wxChar *szFile, } #endif // __WXDEBUG__ -