disable clearing event tables by default, only do it if wxUSE_MEMORY_TRACING is used: this fixes the problems with events not being dispatched correctly when the library is reinitialized
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@46201 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -2285,8 +2285,10 @@ public:
|
|||||||
// Clear table
|
// Clear table
|
||||||
void Clear();
|
void Clear();
|
||||||
|
|
||||||
|
#if defined(__WXDEBUG__) && wxUSE_MEMORY_TRACING
|
||||||
// Clear all tables
|
// Clear all tables
|
||||||
static void ClearAll();
|
static void ClearAll();
|
||||||
|
#endif // __WXDEBUG__ && wxUSE_MEMORY_TRACING
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
// Init the hash table with the entries of the static event table.
|
// Init the hash table with the entries of the static event table.
|
||||||
|
@@ -107,22 +107,26 @@ const wxEventTableEntry wxEvtHandler::sm_eventTableEntries[] =
|
|||||||
{ DECLARE_EVENT_TABLE_ENTRY(wxEVT_NULL, 0, 0, (wxObjectEventFunction)NULL, NULL) };
|
{ DECLARE_EVENT_TABLE_ENTRY(wxEVT_NULL, 0, 0, (wxObjectEventFunction)NULL, NULL) };
|
||||||
|
|
||||||
|
|
||||||
#ifdef __WXDEBUG__
|
// wxUSE_MEMORY_TRACING considers memory freed from the static objects dtors
|
||||||
// Clear up event hash table contents or we can get problems
|
// leaked, so we need to manually clean up all event tables before checking for
|
||||||
// when C++ is cleaning up the static object
|
// the memory leaks when using it, however this breaks re-initializing the
|
||||||
|
// library (i.e. repeated calls to wxInitialize/wxUninitialize) because the
|
||||||
|
// event tables won't be rebuilt the next time, so disable this by default
|
||||||
|
#if defined(__WXDEBUG__) && wxUSE_MEMORY_TRACING
|
||||||
|
|
||||||
class wxEventTableEntryModule: public wxModule
|
class wxEventTableEntryModule: public wxModule
|
||||||
{
|
{
|
||||||
DECLARE_DYNAMIC_CLASS(wxEventTableEntryModule)
|
|
||||||
public:
|
public:
|
||||||
wxEventTableEntryModule() { }
|
wxEventTableEntryModule() { }
|
||||||
bool OnInit() { return true; }
|
virtual bool OnInit() { return true; }
|
||||||
void OnExit()
|
virtual void OnExit() { wxEventHashTable::ClearAll(); }
|
||||||
{
|
|
||||||
wxEventHashTable::ClearAll();
|
DECLARE_DYNAMIC_CLASS(wxEventTableEntryModule)
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
IMPLEMENT_DYNAMIC_CLASS(wxEventTableEntryModule, wxModule)
|
IMPLEMENT_DYNAMIC_CLASS(wxEventTableEntryModule, wxModule)
|
||||||
#endif
|
|
||||||
|
#endif // __WXDEBUG__ && wxUSE_MEMORY_TRACING
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
// global variables
|
// global variables
|
||||||
@@ -801,25 +805,20 @@ wxEventHashTable::~wxEventHashTable()
|
|||||||
|
|
||||||
void wxEventHashTable::Clear()
|
void wxEventHashTable::Clear()
|
||||||
{
|
{
|
||||||
size_t i;
|
for ( size_t i = 0; i < m_size; i++ )
|
||||||
for(i = 0; i < m_size; i++)
|
|
||||||
{
|
{
|
||||||
EventTypeTablePointer eTTnode = m_eventTypeTable[i];
|
EventTypeTablePointer eTTnode = m_eventTypeTable[i];
|
||||||
if (eTTnode)
|
|
||||||
{
|
|
||||||
delete eTTnode;
|
delete eTTnode;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
// Necessary in order to not invoke the
|
|
||||||
// overloaded delete operator when statics are cleaned up
|
|
||||||
if (m_eventTypeTable)
|
|
||||||
delete[] m_eventTypeTable;
|
delete[] m_eventTypeTable;
|
||||||
|
|
||||||
m_eventTypeTable = NULL;
|
m_eventTypeTable = NULL;
|
||||||
|
|
||||||
m_size = 0;
|
m_size = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if defined(__WXDEBUG__) && wxUSE_MEMORY_TRACING
|
||||||
|
|
||||||
// Clear all tables
|
// Clear all tables
|
||||||
void wxEventHashTable::ClearAll()
|
void wxEventHashTable::ClearAll()
|
||||||
{
|
{
|
||||||
@@ -831,6 +830,8 @@ void wxEventHashTable::ClearAll()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#endif // __WXDEBUG__ && wxUSE_MEMORY_TRACING
|
||||||
|
|
||||||
bool wxEventHashTable::HandleEvent(wxEvent &event, wxEvtHandler *self)
|
bool wxEventHashTable::HandleEvent(wxEvent &event, wxEvtHandler *self)
|
||||||
{
|
{
|
||||||
if (m_rebuildHash)
|
if (m_rebuildHash)
|
||||||
|
Reference in New Issue
Block a user