// 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
+#if wxUSE_MEMORY_TRACING
class wxEventTableEntryModule: public wxModule
{
IMPLEMENT_DYNAMIC_CLASS(wxEventTableEntryModule, wxModule)
-#endif // __WXDEBUG__ && wxUSE_MEMORY_TRACING
+#endif // wxUSE_MEMORY_TRACING
// ----------------------------------------------------------------------------
// global variables
wxDEFINE_EVENT( wxEVT_COMMAND_SPINCTRL_UPDATED, wxCommandEvent );
wxDEFINE_EVENT( wxEVT_COMMAND_SPINCTRLDOUBLE_UPDATED, wxCommandEvent );
wxDEFINE_EVENT( wxEVT_COMMAND_TOOL_DROPDOWN_CLICKED, wxCommandEvent );
+wxDEFINE_EVENT( wxEVT_COMMAND_COMBOBOX_DROPDOWN, wxCommandEvent);
+wxDEFINE_EVENT( wxEVT_COMMAND_COMBOBOX_CLOSEUP, wxCommandEvent);
// Mouse event types
wxDEFINE_EVENT( wxEVT_LEFT_DOWN, wxMouseEvent );
}
}
-bool wxMouseEvent::ButtonIsDown(int but) const
-{
- switch (but)
- {
- default:
- wxFAIL_MSG(wxT("invalid parameter in wxMouseEvent::ButtonIsDown"));
- // fall through
-
- case wxMOUSE_BTN_ANY:
- return LeftIsDown() || MiddleIsDown() || RightIsDown() || Aux1Down() || Aux2Down();
-
- case wxMOUSE_BTN_LEFT:
- return LeftIsDown();
-
- case wxMOUSE_BTN_MIDDLE:
- return MiddleIsDown();
-
- case wxMOUSE_BTN_RIGHT:
- return RightIsDown();
-
- case wxMOUSE_BTN_AUX1:
- return Aux1IsDown();
-
- case wxMOUSE_BTN_AUX2:
- return Aux2IsDown();
- }
-}
-
int wxMouseEvent::GetButton() const
{
for ( int i = 1; i < wxMOUSE_BTN_MAX; i++ )
#endif
}
+bool wxKeyEvent::IsKeyInCategory(int category) const
+{
+ switch ( GetKeyCode() )
+ {
+ case WXK_LEFT:
+ case WXK_RIGHT:
+ case WXK_UP:
+ case WXK_DOWN:
+ case WXK_NUMPAD_LEFT:
+ case WXK_NUMPAD_RIGHT:
+ case WXK_NUMPAD_UP:
+ case WXK_NUMPAD_DOWN:
+ return (category & WXK_CATEGORY_ARROW) != 0;
+
+ case WXK_PAGEDOWN:
+ case WXK_END:
+ case WXK_NUMPAD_PAGEUP:
+ case WXK_NUMPAD_PAGEDOWN:
+ return (category & WXK_CATEGORY_PAGING) != 0;
+
+ case WXK_HOME:
+ case WXK_PAGEUP:
+ case WXK_NUMPAD_HOME:
+ case WXK_NUMPAD_END:
+ return (category & WXK_CATEGORY_JUMP) != 0;
+
+ case WXK_TAB:
+ case WXK_NUMPAD_TAB:
+ return (category & WXK_CATEGORY_TAB) != 0;
+
+ case WXK_BACK:
+ case WXK_DELETE:
+ case WXK_NUMPAD_DELETE:
+ return (category & WXK_CATEGORY_CUT) != 0;
+
+ default:
+ return false;
+ }
+}
+
// ----------------------------------------------------------------------------
// wxWindowCreateEvent
// ----------------------------------------------------------------------------
m_size = 0;
}
-#if defined(__WXDEBUG__) && wxUSE_MEMORY_TRACING
+#if wxUSE_MEMORY_TRACING
// Clear all tables
void wxEventHashTable::ClearAll()
}
}
-#endif // __WXDEBUG__ && wxUSE_MEMORY_TRACING
+#endif // wxUSE_MEMORY_TRACING
bool wxEventHashTable::HandleEvent(wxEvent &event, wxEvtHandler *self)
{
delete m_dynamicEvents;
}
- if (m_pendingEvents)
- m_pendingEvents->DeleteContents(true);
- delete m_pendingEvents;
-
// Remove us from the list of the pending events if necessary.
if (wxTheApp)
wxTheApp->RemovePendingEventHandler(this);
+ DeletePendingEvents();
+
// we only delete object data, not untyped
if ( m_clientDataType == wxClientData_Object )
delete m_clientObject;
wxENTER_CRIT_SECT( m_pendingEventsLock );
if ( !m_pendingEvents )
- m_pendingEvents = new wxList;
+ m_pendingEvents = new wxList;
m_pendingEvents->Append(event);
wxWakeUpIdle();
}
+void wxEvtHandler::DeletePendingEvents()
+{
+ if (m_pendingEvents)
+ m_pendingEvents->DeleteContents(true);
+ wxDELETE(m_pendingEvents);
+}
+
void wxEvtHandler::ProcessPendingEvents()
{
if (!wxTheApp)
bool wxEvtHandler::TryBefore(wxEvent& event)
{
-#ifdef WXWIN_COMPATIBILITY_2_8
+#if WXWIN_COMPATIBILITY_2_8
// call the old virtual function to keep the code overriding it working
return TryValidator(event);
#else
bool wxEvtHandler::TryAfter(wxEvent& event)
{
-#ifdef WXWIN_COMPATIBILITY_2_8
+#if WXWIN_COMPATIBILITY_2_8
// as above, call the old virtual function for compatibility
return TryParent(event);
#else
}
catch ( ... )
{
- wxEventLoopBase *loop = wxEventLoopBase::GetActive();
+ // notice that we do it in 2 steps to avoid warnings about possibly
+ // uninitialized loop variable from some versions of g++ which are not
+ // smart enough to figure out that GetActive() doesn't throw and so
+ // that loop will always be initialized
+ wxEventLoopBase *loop = NULL;
try
{
+ loop = wxEventLoopBase::GetActive();
+
if ( !wxTheApp || !wxTheApp->OnExceptionInMainLoop() )
{
if ( loop )
return false;
}
-void wxEvtHandler::DoConnect(int id,
- int lastId,
- wxEventType eventType,
- wxEventFunctor *func,
- wxObject *userData)
+void wxEvtHandler::DoBind(int id,
+ int lastId,
+ wxEventType eventType,
+ wxEventFunctor *func,
+ wxObject *userData)
{
wxDynamicEventTableEntry *entry =
new wxDynamicEventTableEntry(eventType, id, lastId, func, userData);
}
bool
-wxEvtHandler::DoDisconnect(int id,
- int lastId,
- wxEventType eventType,
- const wxEventFunctor& func,
- wxObject *userData)
+wxEvtHandler::DoUnbind(int id,
+ int lastId,
+ wxEventType eventType,
+ const wxEventFunctor& func,
+ wxObject *userData)
{
if (!m_dynamicEvents)
return false;
if ((entry->m_id == id) &&
((entry->m_lastId == lastId) || (lastId == wxID_ANY)) &&
((entry->m_eventType == eventType) || (eventType == wxEVT_NULL)) &&
- entry->m_fn->Matches(func) &&
+ entry->m_fn->IsMatching(func) &&
((entry->m_callbackUserData == userData) || !userData))
{
delete entry->m_callbackUserData;