X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/924ef85080e1b257900110f0c3298a8c19acaeab..6342bd1ab36c1957684c00d408d09fba65d33db6:/src/common/event.cpp diff --git a/src/common/event.cpp b/src/common/event.cpp index 5a420067a3..3ace246251 100644 --- a/src/common/event.cpp +++ b/src/common/event.cpp @@ -50,48 +50,48 @@ // wxWin macros // ---------------------------------------------------------------------------- - IMPLEMENT_DYNAMIC_CLASS(wxEvtHandler, wxObject) - IMPLEMENT_ABSTRACT_CLASS(wxEvent, wxObject) - IMPLEMENT_DYNAMIC_CLASS(wxIdleEvent, wxEvent) +IMPLEMENT_DYNAMIC_CLASS(wxEvtHandler, wxObject) +IMPLEMENT_ABSTRACT_CLASS(wxEvent, wxObject) +IMPLEMENT_DYNAMIC_CLASS(wxIdleEvent, wxEvent) - #if wxUSE_GUI - IMPLEMENT_DYNAMIC_CLASS(wxCommandEvent, wxEvent) - IMPLEMENT_DYNAMIC_CLASS(wxNotifyEvent, wxCommandEvent) - IMPLEMENT_DYNAMIC_CLASS(wxScrollEvent, wxCommandEvent) - IMPLEMENT_DYNAMIC_CLASS(wxScrollWinEvent, wxEvent) - IMPLEMENT_DYNAMIC_CLASS(wxMouseEvent, wxEvent) - IMPLEMENT_DYNAMIC_CLASS(wxKeyEvent, wxEvent) - IMPLEMENT_DYNAMIC_CLASS(wxSizeEvent, wxEvent) - IMPLEMENT_DYNAMIC_CLASS(wxPaintEvent, wxEvent) - IMPLEMENT_DYNAMIC_CLASS(wxEraseEvent, wxEvent) - IMPLEMENT_DYNAMIC_CLASS(wxMoveEvent, wxEvent) - IMPLEMENT_DYNAMIC_CLASS(wxFocusEvent, wxEvent) - IMPLEMENT_DYNAMIC_CLASS(wxCloseEvent, wxEvent) - IMPLEMENT_DYNAMIC_CLASS(wxShowEvent, wxEvent) - IMPLEMENT_DYNAMIC_CLASS(wxMaximizeEvent, wxEvent) - IMPLEMENT_DYNAMIC_CLASS(wxIconizeEvent, wxEvent) - IMPLEMENT_DYNAMIC_CLASS(wxMenuEvent, wxEvent) - IMPLEMENT_DYNAMIC_CLASS(wxJoystickEvent, wxEvent) - IMPLEMENT_DYNAMIC_CLASS(wxDropFilesEvent, wxEvent) - IMPLEMENT_DYNAMIC_CLASS(wxActivateEvent, wxEvent) - IMPLEMENT_DYNAMIC_CLASS(wxInitDialogEvent, wxEvent) - IMPLEMENT_DYNAMIC_CLASS(wxSysColourChangedEvent, wxEvent) - IMPLEMENT_DYNAMIC_CLASS(wxUpdateUIEvent, wxCommandEvent) - IMPLEMENT_DYNAMIC_CLASS(wxNavigationKeyEvent, wxCommandEvent) - IMPLEMENT_DYNAMIC_CLASS(wxPaletteChangedEvent, wxEvent) - IMPLEMENT_DYNAMIC_CLASS(wxQueryNewPaletteEvent, wxEvent) - IMPLEMENT_DYNAMIC_CLASS(wxWindowCreateEvent, wxEvent) - IMPLEMENT_DYNAMIC_CLASS(wxWindowDestroyEvent, wxEvent) - #endif // wxUSE_GUI +#if wxUSE_GUI + IMPLEMENT_DYNAMIC_CLASS(wxCommandEvent, wxEvent) + IMPLEMENT_DYNAMIC_CLASS(wxNotifyEvent, wxCommandEvent) + IMPLEMENT_DYNAMIC_CLASS(wxScrollEvent, wxCommandEvent) + IMPLEMENT_DYNAMIC_CLASS(wxScrollWinEvent, wxEvent) + IMPLEMENT_DYNAMIC_CLASS(wxMouseEvent, wxEvent) + IMPLEMENT_DYNAMIC_CLASS(wxKeyEvent, wxEvent) + IMPLEMENT_DYNAMIC_CLASS(wxSizeEvent, wxEvent) + IMPLEMENT_DYNAMIC_CLASS(wxPaintEvent, wxEvent) + IMPLEMENT_DYNAMIC_CLASS(wxEraseEvent, wxEvent) + IMPLEMENT_DYNAMIC_CLASS(wxMoveEvent, wxEvent) + IMPLEMENT_DYNAMIC_CLASS(wxFocusEvent, wxEvent) + IMPLEMENT_DYNAMIC_CLASS(wxCloseEvent, wxEvent) + IMPLEMENT_DYNAMIC_CLASS(wxShowEvent, wxEvent) + IMPLEMENT_DYNAMIC_CLASS(wxMaximizeEvent, wxEvent) + IMPLEMENT_DYNAMIC_CLASS(wxIconizeEvent, wxEvent) + IMPLEMENT_DYNAMIC_CLASS(wxMenuEvent, wxEvent) + IMPLEMENT_DYNAMIC_CLASS(wxJoystickEvent, wxEvent) + IMPLEMENT_DYNAMIC_CLASS(wxDropFilesEvent, wxEvent) + IMPLEMENT_DYNAMIC_CLASS(wxActivateEvent, wxEvent) + IMPLEMENT_DYNAMIC_CLASS(wxInitDialogEvent, wxEvent) + IMPLEMENT_DYNAMIC_CLASS(wxSysColourChangedEvent, wxEvent) + IMPLEMENT_DYNAMIC_CLASS(wxUpdateUIEvent, wxCommandEvent) + IMPLEMENT_DYNAMIC_CLASS(wxNavigationKeyEvent, wxCommandEvent) + IMPLEMENT_DYNAMIC_CLASS(wxPaletteChangedEvent, wxEvent) + IMPLEMENT_DYNAMIC_CLASS(wxQueryNewPaletteEvent, wxEvent) + IMPLEMENT_DYNAMIC_CLASS(wxWindowCreateEvent, wxEvent) + IMPLEMENT_DYNAMIC_CLASS(wxWindowDestroyEvent, wxEvent) +#endif // wxUSE_GUI - const wxEventTable *wxEvtHandler::GetEventTable() const - { return &wxEvtHandler::sm_eventTable; } +const wxEventTable *wxEvtHandler::GetEventTable() const + { return &wxEvtHandler::sm_eventTable; } - const wxEventTable wxEvtHandler::sm_eventTable = - { (const wxEventTable *)NULL, &wxEvtHandler::sm_eventTableEntries[0] }; +const wxEventTable wxEvtHandler::sm_eventTable = + { (const wxEventTable *)NULL, &wxEvtHandler::sm_eventTableEntries[0] }; - const wxEventTableEntry wxEvtHandler::sm_eventTableEntries[] = - { { 0, 0, 0, (wxObjectEventFunction) NULL, (wxObject*) NULL } }; +const wxEventTableEntry wxEvtHandler::sm_eventTableEntries[] = + { { 0, 0, 0, (wxObjectEventFunction) NULL, (wxObject*) NULL } }; // ---------------------------------------------------------------------------- @@ -524,14 +524,14 @@ void wxQueryNewPaletteEvent::CopyObject(wxObject& obj_d) const } wxWindowCreateEvent::wxWindowCreateEvent(wxWindow *win) - : wxEvent(wxEVT_CREATE) { + SetEventType(wxEVT_CREATE); SetEventObject(win); } wxWindowDestroyEvent::wxWindowDestroyEvent(wxWindow *win) - : wxEvent(wxEVT_DESTROY) { + SetEventType(wxEVT_DESTROY); SetEventObject(win); } @@ -635,19 +635,18 @@ void wxEvtHandler::AddPendingEvent(wxEvent& event) // 2) Add this event handler to list of event handlers that // have pending events. - + wxENTER_CRIT_SECT(*wxPendingEventsLocker); if ( !wxPendingEvents ) wxPendingEvents = new wxList; wxPendingEvents->Append(this); + wxLEAVE_CRIT_SECT(*wxPendingEventsLocker); + // 3) Inform the system that new pending events are somwehere, // and that these should be processed in idle time. - wxWakeUpIdle(); - - wxLEAVE_CRIT_SECT(*wxPendingEventsLocker); } void wxEvtHandler::ProcessPendingEvents() @@ -663,9 +662,9 @@ void wxEvtHandler::ProcessPendingEvents() { wxEvent *event = (wxEvent *)node->Data(); delete node; - + // In ProcessEvent, new events might get added and - // we can safely leave the crtical section here. + // we can safely leave the crtical section here. #if defined(__VISAGECPP__) wxLEAVE_CRIT_SECT( m_eventsLocker); #else @@ -678,10 +677,10 @@ void wxEvtHandler::ProcessPendingEvents() #else wxENTER_CRIT_SECT( *m_eventsLocker); #endif - + node = m_pendingEvents->First(); } - + #if defined(__VISAGECPP__) wxLEAVE_CRIT_SECT( m_eventsLocker); #else @@ -796,35 +795,45 @@ bool wxEvtHandler::ProcessEvent(wxEvent& event) bool wxEvtHandler::SearchEventTable(wxEventTable& table, wxEvent& event) { - int i = 0; - int commandId = event.GetId(); + wxEventType eventType = event.GetEventType(); + int eventId = event.GetId(); - // BC++ doesn't like while (table.entries[i].m_fn) - -#ifdef __SC__ - while (table.entries[i].m_fn != 0) + // BC++ doesn't like testing for m_fn without != 0 + for ( int i = 0; table.entries[i].m_fn != 0; i++ ) + { + // the line using reference exposes a bug in gcc: although it _seems_ + // to work, it leads to weird crashes later on during program + // execution +#ifdef __GNUG__ + wxEventTableEntry entry = table.entries[i]; #else - while (table.entries[i].m_fn != 0L) + const wxEventTableEntry& entry = table.entries[i]; #endif - { - if ((event.GetEventType() == table.entries[i].m_eventType) && - (table.entries[i].m_id == -1 || // Match, if event spec says any id will do (id == -1) - (table.entries[i].m_lastId == -1 && commandId == table.entries[i].m_id) || - (table.entries[i].m_lastId != -1 && - (commandId >= table.entries[i].m_id && commandId <= table.entries[i].m_lastId)))) + + // match only if the event type is the same and the id is either -1 in + // the event table (meaning "any") or the event id matches the id + // specified in the event table either exactly or by falling into + // range between first and last + if ( eventType == entry.m_eventType ) { - event.Skip(FALSE); - event.m_callbackUserData = table.entries[i].m_callbackUserData; + int tableId1 = entry.m_id, + tableId2 = entry.m_lastId; - (this->*((wxEventFunction) (table.entries[i].m_fn)))(event); + if ( (tableId1 == -1) || + (tableId2 == -1 && eventId == tableId1) || + (tableId2 != -1 && + (eventId >= tableId1 && eventId <= tableId2)) ) + { + event.Skip(FALSE); + event.m_callbackUserData = entry.m_callbackUserData; - if ( event.GetSkipped() ) - return FALSE; - else - return TRUE; + (this->*((wxEventFunction) (entry.m_fn)))(event); + + return !event.GetSkipped(); + } } - i++; } + return FALSE; } @@ -852,7 +861,7 @@ bool wxEvtHandler::Disconnect( int id, int lastId, wxEventType eventType, { if (!m_dynamicEvents) return FALSE; - + wxNode *node = m_dynamicEvents->First(); while (node) {