OLD | NEW |
---|---|
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "ui/events/event_source.h" | 5 #include "ui/events/event_source.h" |
6 | 6 |
7 #include <algorithm> | |
8 | |
7 #include "ui/events/event_processor.h" | 9 #include "ui/events/event_processor.h" |
10 #include "ui/events/event_rewriter.h" | |
8 | 11 |
9 namespace ui { | 12 namespace ui { |
10 | 13 |
14 void EventSource::AddEventRewriter(EventRewriter* rewriter) { | |
15 DCHECK(rewriter); | |
16 rewriter_list_.push_back(rewriter); | |
17 } | |
18 | |
19 void EventSource::RemoveEventRewriter(EventRewriter* rewriter) { | |
20 EventRewriterList::iterator find = | |
21 std::find(rewriter_list_.begin(), rewriter_list_.end(), rewriter); | |
22 if (find != rewriter_list_.end()) | |
23 rewriter_list_.erase(find); | |
24 } | |
25 | |
11 EventDispatchDetails EventSource::SendEventToProcessor(Event* event) { | 26 EventDispatchDetails EventSource::SendEventToProcessor(Event* event) { |
27 Event* rewritten_event = 0; | |
sadrul
2014/03/24 21:15:38
We should use a scoped_ptr<> to avoid accidentally
| |
28 EventRewriteStatus status = EVENT_REWRITE_CONTINUE; | |
29 for (EventRewriterList::const_iterator it = rewriter_list_.begin(), | |
30 end = rewriter_list_.end(); | |
31 (it != end) && (status == EVENT_REWRITE_CONTINUE); | |
32 ++it) { | |
33 DCHECK(*it); | |
34 status = (*it)->RewriteEvent(*event, &rewritten_event); | |
35 while (status == EVENT_REWRITE_DISPATCH_ANOTHER) { | |
sadrul
2014/03/24 21:15:38
Can we do this more like:
for (....) {
status =
| |
36 DCHECK(rewritten_event); | |
37 EventDispatchDetails details = DeliverEventToProcessor(rewritten_event); | |
38 if (details.dispatcher_destroyed || details.target_destroyed) | |
39 return details; | |
40 Event* last_event = rewritten_event; | |
41 status = (*it)->NextDispatchEvent(*last_event, &rewritten_event); | |
42 delete last_event; | |
43 } | |
44 } | |
45 if (status == EVENT_REWRITE_REWRITTEN) { | |
46 DCHECK(rewritten_event); | |
47 EventDispatchDetails details = DeliverEventToProcessor(rewritten_event); | |
48 delete rewritten_event; | |
49 return details; | |
50 } | |
51 DCHECK(!rewritten_event); | |
52 if (status == EVENT_REWRITE_CONTINUE) { | |
53 return DeliverEventToProcessor(event); | |
54 } | |
55 return EventDispatchDetails(); | |
56 } | |
57 | |
58 EventDispatchDetails EventSource::DeliverEventToProcessor(Event* event) { | |
12 EventProcessor* processor = GetEventProcessor(); | 59 EventProcessor* processor = GetEventProcessor(); |
13 CHECK(processor); | 60 CHECK(processor); |
14 return processor->OnEventFromSource(event); | 61 return processor->OnEventFromSource(event); |
15 } | 62 } |
16 | 63 |
17 } // namespace ui | 64 } // namespace ui |
OLD | NEW |