///////////////////////////////////////////////////////////////////////////////
-// Name: common/base/appbase.cpp
+// Name: src/common/appbase.cpp
// Purpose: implements wxAppConsole class
// Author: Vadim Zeitlin
// Modified by:
#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"
#include <signal.h> // 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
static
void ShowAssertDialog(const wxChar *szFile,
int nLine,
+ const wxChar *szFunc,
const wxChar *szCond,
const wxChar *szMsg,
wxAppTraits *traits = NULL);
if ( !wxPendingEventsLocker )
return;
#endif
-
+
// ensure that we're the only thread to modify the pending events list
wxENTER_CRIT_SECT( *wxPendingEventsLocker );
// 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();
// 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 );
#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__
// this function is called when an assert fails
void wxOnAssert(const wxChar *szFile,
int nLine,
+ const char *szFunc,
const wxChar *szCond,
const wxChar *szMsg)
{
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;
};
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
static
void ShowAssertDialog(const wxChar *szFile,
int nLine,
+ const wxChar *szFunc,
const wxChar *szCond,
const wxChar *szMsg,
wxAppTraits *traits)
// 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;
}
#endif // __WXDEBUG__
-