Index: ui/events/event_source.cc |
diff --git a/ui/events/event_source.cc b/ui/events/event_source.cc |
index a40813079d837398644acc295b54fba54f865f6c..b072898e5af9647d352115cf56138fa82127c05d 100644 |
--- a/ui/events/event_source.cc |
+++ b/ui/events/event_source.cc |
@@ -4,11 +4,58 @@ |
#include "ui/events/event_source.h" |
+#include <algorithm> |
+ |
#include "ui/events/event_processor.h" |
+#include "ui/events/event_rewriter.h" |
namespace ui { |
+void EventSource::AddEventRewriter(EventRewriter* rewriter) { |
+ DCHECK(rewriter); |
+ rewriter_list_.push_back(rewriter); |
+} |
+ |
+void EventSource::RemoveEventRewriter(EventRewriter* rewriter) { |
+ EventRewriterList::iterator find = |
+ std::find(rewriter_list_.begin(), rewriter_list_.end(), rewriter); |
+ if (find != rewriter_list_.end()) |
+ rewriter_list_.erase(find); |
+} |
+ |
EventDispatchDetails EventSource::SendEventToProcessor(Event* event) { |
+ Event* rewritten_event = 0; |
sadrul
2014/03/24 21:15:38
We should use a scoped_ptr<> to avoid accidentally
|
+ EventRewriteStatus status = EVENT_REWRITE_CONTINUE; |
+ for (EventRewriterList::const_iterator it = rewriter_list_.begin(), |
+ end = rewriter_list_.end(); |
+ (it != end) && (status == EVENT_REWRITE_CONTINUE); |
+ ++it) { |
+ DCHECK(*it); |
+ status = (*it)->RewriteEvent(*event, &rewritten_event); |
+ while (status == EVENT_REWRITE_DISPATCH_ANOTHER) { |
sadrul
2014/03/24 21:15:38
Can we do this more like:
for (....) {
status =
|
+ DCHECK(rewritten_event); |
+ EventDispatchDetails details = DeliverEventToProcessor(rewritten_event); |
+ if (details.dispatcher_destroyed || details.target_destroyed) |
+ return details; |
+ Event* last_event = rewritten_event; |
+ status = (*it)->NextDispatchEvent(*last_event, &rewritten_event); |
+ delete last_event; |
+ } |
+ } |
+ if (status == EVENT_REWRITE_REWRITTEN) { |
+ DCHECK(rewritten_event); |
+ EventDispatchDetails details = DeliverEventToProcessor(rewritten_event); |
+ delete rewritten_event; |
+ return details; |
+ } |
+ DCHECK(!rewritten_event); |
+ if (status == EVENT_REWRITE_CONTINUE) { |
+ return DeliverEventToProcessor(event); |
+ } |
+ return EventDispatchDetails(); |
+} |
+ |
+EventDispatchDetails EventSource::DeliverEventToProcessor(Event* event) { |
EventProcessor* processor = GetEventProcessor(); |
CHECK(processor); |
return processor->OnEventFromSource(event); |