From 25250d335f869088a3551db226f25079c28f65fb Mon Sep 17 00:00:00 2001 From: Vadim Zeitlin Date: Mon, 22 Sep 2008 00:08:28 +0000 Subject: [PATCH] extracted the part of ProcessEvent() which is repeated multiple times during the handling of a single event in the new ProcessEventHere() method; this ensures that wxApp::FilterEvent() is not called multiple times for the same event unnecessarily git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@55784 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- include/wx/event.h | 19 ++++++++++++++++++- src/common/event.cpp | 24 ++++++++++++++---------- 2 files changed, 32 insertions(+), 11 deletions(-) diff --git a/include/wx/event.h b/include/wx/event.h index da1de711aa..7bc5cd914f 100644 --- a/include/wx/event.h +++ b/include/wx/event.h @@ -2343,6 +2343,10 @@ public: void SetClientData( void *data ) { DoSetClientData(data); } void *GetClientData() const { return DoGetClientData(); } + + // implementation from now on + // -------------------------- + // check if the given event table entry matches this event and call the // handler if it does // @@ -2352,7 +2356,6 @@ public: wxEvtHandler *handler, wxEvent& event); - // implementation from now on virtual bool SearchEventTable(wxEventTable& table, wxEvent& event); bool SearchDynamicEventTable( wxEvent& event ); @@ -2360,6 +2363,20 @@ public: void ClearEventHashTable() { GetEventHashTable().Clear(); } void OnSinkDestroyed( wxEvtHandler *sink ); + + // The method processing the event in this event handler (or rather in this + // event handler chain as it also tries the next handler and so on), i.e. + // it returns true if we processed this event or false if we didn't but + // does not call TryParent() in the latter case. It also doesn't call + // wxApp::FilterEvent() before processing it, this is supposed to be done + // by the public ProcessEvent() only once for every event we handle. + // + // It is meant to be called from ProcessEvent() only and is not virtual, + // additional event handlers can be hooked into the normal event processing + // logic using TryValidator() hook. + bool ProcessEventHere(wxEvent& event); + + private: static const wxEventTableEntry sm_eventTableEntries[]; diff --git a/src/common/event.cpp b/src/common/event.cpp index 63b0d382c1..6c504bc51c 100644 --- a/src/common/event.cpp +++ b/src/common/event.cpp @@ -1304,6 +1304,16 @@ bool wxEvtHandler::ProcessEvent(wxEvent& event) //else: proceed normally } + if ( ProcessEventHere(event) ) + return true; + + // propagate the event upwards the window chain and/or to the application + // object if it wasn't processed at this level + return TryParent(event); +} + +bool wxEvtHandler::ProcessEventHere(wxEvent& event) +{ // An event handler can be enabled or disabled if ( GetEvtHandlerEnabled() ) { @@ -1322,17 +1332,11 @@ bool wxEvtHandler::ProcessEvent(wxEvent& event) } // Try going down the event handler chain - if ( GetNextHandler() ) - { - // notice that we shouldn't let the parent have the event even if the - // next handler does not process it because it will have already passed - // it to the parent in this case - return GetNextHandler()->ProcessEvent(event); - } + if ( GetNextHandler() && GetNextHandler()->ProcessEventHere(event) ) + return true; - // Finally propagate the event upwards the window chain and/or to the - // application object as necessary - return TryParent(event); + // We don't have a handler for this event. + return false; } bool wxEvtHandler::SafelyProcessEvent(wxEvent& event) -- 2.45.2