X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/4b6d82c73925712233e68a773f6099f5de8b9222..cc2aecdef579e57f84eaa07cc72f62a43fc474ba:/src/common/event.cpp diff --git a/src/common/event.cpp b/src/common/event.cpp index dd439f8427..ce1e145c79 100644 --- a/src/common/event.cpp +++ b/src/common/event.cpp @@ -25,6 +25,7 @@ #endif #include "wx/event.h" +#include "wx/eventfilter.h" #include "wx/evtloop.h" #ifndef WX_PRECOMP @@ -62,11 +63,11 @@ IMPLEMENT_DYNAMIC_CLASS(wxEvtHandler, wxObject) IMPLEMENT_ABSTRACT_CLASS(wxEvent, wxObject) IMPLEMENT_DYNAMIC_CLASS(wxIdleEvent, wxEvent) + IMPLEMENT_DYNAMIC_CLASS(wxThreadEvent, wxEvent) #endif // wxUSE_BASE #if wxUSE_GUI IMPLEMENT_DYNAMIC_CLASS(wxCommandEvent, wxEvent) - IMPLEMENT_DYNAMIC_CLASS(wxThreadEvent, wxCommandEvent) IMPLEMENT_DYNAMIC_CLASS(wxNotifyEvent, wxCommandEvent) IMPLEMENT_DYNAMIC_CLASS(wxScrollEvent, wxCommandEvent) IMPLEMENT_DYNAMIC_CLASS(wxScrollWinEvent, wxEvent) @@ -155,6 +156,9 @@ const wxEventType wxEVT_NULL = wxNewEventType(); wxDEFINE_EVENT( wxEVT_IDLE, wxIdleEvent ); +// Thread event +wxDEFINE_EVENT( wxEVT_THREAD, wxThreadEvent ); + #endif // wxUSE_BASE #if wxUSE_GUI @@ -206,6 +210,7 @@ wxDEFINE_EVENT( wxEVT_AUX2_DCLICK, wxMouseEvent ); // Character input event type wxDEFINE_EVENT( wxEVT_CHAR, wxKeyEvent ); +wxDEFINE_EVENT( wxEVT_AFTER_CHAR, wxKeyEvent ); wxDEFINE_EVENT( wxEVT_CHAR_HOOK, wxKeyEvent ); wxDEFINE_EVENT( wxEVT_NAVIGATION_KEY, wxNavigationKeyEvent ); wxDEFINE_EVENT( wxEVT_KEY_DOWN, wxKeyEvent ); @@ -311,9 +316,6 @@ wxDEFINE_EVENT( wxEVT_COMMAND_ENTER, wxCommandEvent ); wxDEFINE_EVENT( wxEVT_HELP, wxHelpEvent ); wxDEFINE_EVENT( wxEVT_DETAILED_HELP, wxHelpEvent ); -// Thread event -wxDEFINE_EVENT( wxEVT_COMMAND_THREAD, wxThreadEvent ); - #endif // wxUSE_GUI #if wxUSE_BASE @@ -411,28 +413,17 @@ wxEvent& wxEvent::operator=(const wxEvent& src) // wxCommandEvent // ---------------------------------------------------------------------------- -#ifdef __VISUALC__ - // 'this' : used in base member initializer list (for m_commandString) - #pragma warning(disable:4355) -#endif - wxCommandEvent::wxCommandEvent(wxEventType commandType, int theId) : wxEvent(theId, commandType) { m_clientData = NULL; m_clientObject = NULL; - m_extraLong = 0; - m_commandInt = 0; m_isCommandEvent = true; // the command events are propagated upwards by default m_propagationLevel = wxEVENT_PROPAGATE_MAX; } -#ifdef __VISUALC__ - #pragma warning(default:4355) -#endif - wxString wxCommandEvent::GetString() const { if (m_eventType != wxEVT_COMMAND_TEXT_UPDATED || !m_eventObject) @@ -473,6 +464,13 @@ bool wxUpdateUIEvent::CanUpdate(wxWindowBase *win) ((win->GetExtraStyle() & wxWS_EX_PROCESS_UI_UPDATES) == 0))) return false; + // Don't update children of the hidden windows: this is useless as any + // change to their state won't be seen by the user anyhow. Notice that this + // argument doesn't apply to the hidden windows (with visible parent) + // themselves as they could be shown by their EVT_UPDATE_UI handler. + if ( win->GetParent() && !win->GetParent()->IsShownOnScreen() ) + return false; + if (sm_updateInterval == -1) return false; @@ -733,26 +731,32 @@ wxPoint wxMouseEvent::GetLogicalPosition(const wxDC& dc) const wxKeyEvent::wxKeyEvent(wxEventType type) { m_eventType = type; - m_keyCode = 0; + m_keyCode = WXK_NONE; #if wxUSE_UNICODE - m_uniChar = 0; + m_uniChar = WXK_NONE; #endif + + InitPropagation(); } wxKeyEvent::wxKeyEvent(const wxKeyEvent& evt) : wxEvent(evt), wxKeyboardState(evt) { - m_x = evt.m_x; - m_y = evt.m_y; + DoAssignMembers(evt); - m_keyCode = evt.m_keyCode; - m_rawCode = evt.m_rawCode; - m_rawFlags = evt.m_rawFlags; + InitPropagation(); +} -#if wxUSE_UNICODE - m_uniChar = evt.m_uniChar; -#endif +wxKeyEvent::wxKeyEvent(wxEventType eventType, const wxKeyEvent& evt) + : wxEvent(evt), + wxKeyboardState(evt) +{ + DoAssignMembers(evt); + + m_eventType = eventType; + + InitPropagation(); } bool wxKeyEvent::IsKeyInCategory(int category) const @@ -959,7 +963,7 @@ void wxEventHashTable::InitHashTable() table = table->baseTable; } - // Lets free some memory. + // Let's free some memory. size_t i; for(i = 0; i < m_size; i++) { @@ -1126,6 +1130,43 @@ bool wxEvtHandler::IsUnlinked() const m_nextHandler == NULL; } +wxEventFilter* wxEvtHandler::ms_filterList = NULL; + +/* static */ void wxEvtHandler::AddFilter(wxEventFilter* filter) +{ + wxCHECK_RET( filter, "NULL filter" ); + + filter->m_next = ms_filterList; + ms_filterList = filter; +} + +/* static */ void wxEvtHandler::RemoveFilter(wxEventFilter* filter) +{ + wxEventFilter* prev = NULL; + for ( wxEventFilter* f = ms_filterList; f; f = f->m_next ) + { + if ( f == filter ) + { + // Set the previous list element or the list head to the next + // element. + if ( prev ) + prev->m_next = f->m_next; + else + ms_filterList = f->m_next; + + // Also reset the next pointer in the filter itself just to avoid + // having possibly dangling pointers, even though it's not strictly + // necessary. + f->m_next = NULL; + + // Skip the assert below. + return; + } + } + + wxFAIL_MSG( "Filter not found" ); +} + #if wxUSE_THREADS bool wxEvtHandler::ProcessThreadEvent(const wxEvent& event) @@ -1354,23 +1395,24 @@ bool wxEvtHandler::TryAfter(wxEvent& event) bool wxEvtHandler::ProcessEvent(wxEvent& event) { - // The very first thing we do is to allow the application to hook into - // event processing in order to globally pre-process all events. + // The very first thing we do is to allow any registered filters to hook + // into event processing in order to globally pre-process all events. // // Note that we should only do it if we're the first event handler called // to avoid calling FilterEvent() multiple times as the event goes through // the event handler chain and possibly upwards the window hierarchy. if ( !event.WasProcessed() ) { - if ( wxTheApp ) + for ( wxEventFilter* f = ms_filterList; f; f = f->m_next ) { - int rc = wxTheApp->FilterEvent(event); - if ( rc != -1 ) + int rc = f->FilterEvent(event); + if ( rc != wxEventFilter::Event_Skip ) { - wxASSERT_MSG( rc == 1 || rc == 0, - "unexpected wxApp::FilterEvent return value" ); + wxASSERT_MSG( rc == wxEventFilter::Event_Ignore || + rc == wxEventFilter::Event_Processed, + "unexpected FilterEvent() return value" ); - return rc != 0; + return rc != wxEventFilter::Event_Ignore; } //else: proceed normally }