OLD | NEW |
1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 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 <algorithm> |
| 6 |
5 #include "components/mus/ws/event_matcher.h" | 7 #include "components/mus/ws/event_matcher.h" |
6 | 8 |
7 namespace mus { | 9 namespace mus { |
8 namespace ws { | 10 namespace ws { |
9 | 11 |
10 EventMatcher::EventMatcher(const mojom::EventMatcher& matcher) | 12 EventMatcher::EventMatcher(const mojom::EventMatcher& matcher) |
11 : fields_to_match_(NONE), | 13 : fields_to_match_(NONE), |
12 event_type_(ui::ET_UNKNOWN), | |
13 event_flags_(ui::EF_NONE), | 14 event_flags_(ui::EF_NONE), |
14 ignore_event_flags_(ui::EF_NONE), | 15 ignore_event_flags_(ui::EF_NONE), |
15 keyboard_code_(ui::VKEY_UNKNOWN), | 16 keyboard_code_(ui::VKEY_UNKNOWN), |
16 pointer_type_(ui::EventPointerType::POINTER_TYPE_UNKNOWN) { | 17 pointer_type_(ui::EventPointerType::POINTER_TYPE_UNKNOWN) { |
17 if (matcher.type_matcher) { | 18 if (matcher.type_matcher || matcher.types_matcher) { |
18 fields_to_match_ |= TYPE; | 19 fields_to_match_ |= TYPE; |
19 switch (matcher.type_matcher->type) { | 20 std::vector<ui::mojom::EventType> event_types; |
20 case ui::mojom::EventType::POINTER_DOWN: | 21 if (matcher.type_matcher) { |
21 event_type_ = ui::ET_POINTER_DOWN; | 22 event_types.push_back(matcher.type_matcher->type); |
22 break; | 23 } else { |
23 case ui::mojom::EventType::POINTER_MOVE: | 24 for (ui::mojom::EventType event_type : matcher.types_matcher->types) { |
24 event_type_ = ui::ET_POINTER_MOVED; | 25 event_types.push_back(event_type); |
25 break; | 26 } |
26 case ui::mojom::EventType::MOUSE_EXIT: | 27 } |
27 event_type_ = ui::ET_POINTER_EXITED; | 28 for (ui::mojom::EventType event_type : event_types) { |
28 break; | 29 switch (event_type) { |
29 case ui::mojom::EventType::POINTER_UP: | 30 case ui::mojom::EventType::POINTER_DOWN: |
30 event_type_ = ui::ET_POINTER_UP; | 31 event_types_.push_back(ui::ET_POINTER_DOWN); |
31 break; | 32 break; |
32 case ui::mojom::EventType::POINTER_CANCEL: | 33 case ui::mojom::EventType::POINTER_MOVE: |
33 event_type_ = ui::ET_POINTER_CANCELLED; | 34 event_types_.push_back(ui::ET_POINTER_MOVED); |
34 break; | 35 break; |
35 case ui::mojom::EventType::KEY_PRESSED: | 36 case ui::mojom::EventType::MOUSE_EXIT: |
36 event_type_ = ui::ET_KEY_PRESSED; | 37 event_types_.push_back(ui::ET_POINTER_EXITED); |
37 break; | 38 break; |
38 case ui::mojom::EventType::KEY_RELEASED: | 39 case ui::mojom::EventType::POINTER_UP: |
39 event_type_ = ui::ET_KEY_RELEASED; | 40 event_types_.push_back(ui::ET_POINTER_UP); |
40 break; | 41 break; |
41 default: | 42 case ui::mojom::EventType::POINTER_CANCEL: |
42 NOTREACHED(); | 43 event_types_.push_back(ui::ET_POINTER_CANCELLED); |
| 44 break; |
| 45 case ui::mojom::EventType::KEY_PRESSED: |
| 46 event_types_.push_back(ui::ET_KEY_PRESSED); |
| 47 break; |
| 48 case ui::mojom::EventType::KEY_RELEASED: |
| 49 event_types_.push_back(ui::ET_KEY_RELEASED); |
| 50 break; |
| 51 default: |
| 52 NOTREACHED(); |
| 53 } |
43 } | 54 } |
44 } | 55 } |
45 if (matcher.flags_matcher) { | 56 if (matcher.flags_matcher) { |
46 fields_to_match_ |= FLAGS; | 57 fields_to_match_ |= FLAGS; |
47 event_flags_ = matcher.flags_matcher->flags; | 58 event_flags_ = matcher.flags_matcher->flags; |
48 if (matcher.ignore_flags_matcher) | 59 if (matcher.ignore_flags_matcher) |
49 ignore_event_flags_ = matcher.ignore_flags_matcher->flags; | 60 ignore_event_flags_ = matcher.ignore_flags_matcher->flags; |
50 } | 61 } |
51 if (matcher.key_matcher) { | 62 if (matcher.key_matcher) { |
52 fields_to_match_ |= KEYBOARD_CODE; | 63 fields_to_match_ |= KEYBOARD_CODE; |
(...skipping 14 matching lines...) Expand all Loading... |
67 } | 78 } |
68 if (matcher.pointer_location_matcher) { | 79 if (matcher.pointer_location_matcher) { |
69 fields_to_match_ |= POINTER_LOCATION; | 80 fields_to_match_ |= POINTER_LOCATION; |
70 pointer_region_ = matcher.pointer_location_matcher->region; | 81 pointer_region_ = matcher.pointer_location_matcher->region; |
71 } | 82 } |
72 } | 83 } |
73 | 84 |
74 EventMatcher::~EventMatcher() {} | 85 EventMatcher::~EventMatcher() {} |
75 | 86 |
76 bool EventMatcher::MatchesEvent(const ui::Event& event) const { | 87 bool EventMatcher::MatchesEvent(const ui::Event& event) const { |
77 if ((fields_to_match_ & TYPE) && event.type() != event_type_) | 88 if ((fields_to_match_ & TYPE) && |
| 89 std::find(event_types_.begin(), event_types_.end(), event.type()) |
| 90 == event_types_.end()) |
78 return false; | 91 return false; |
79 int flags = event.flags() & ~ignore_event_flags_; | 92 int flags = event.flags() & ~ignore_event_flags_; |
80 if ((fields_to_match_ & FLAGS) && flags != event_flags_) | 93 if ((fields_to_match_ & FLAGS) && flags != event_flags_) |
81 return false; | 94 return false; |
82 if (fields_to_match_ & KEYBOARD_CODE) { | 95 if (fields_to_match_ & KEYBOARD_CODE) { |
83 if (!event.IsKeyEvent()) | 96 if (!event.IsKeyEvent()) |
84 return false; | 97 return false; |
85 if (keyboard_code_ != event.AsKeyEvent()->GetConflatedWindowsKeyCode()) | 98 if (keyboard_code_ != event.AsKeyEvent()->GetConflatedWindowsKeyCode()) |
86 return false; | 99 return false; |
87 } | 100 } |
88 if (fields_to_match_ & POINTER_KIND) { | 101 if (fields_to_match_ & POINTER_KIND) { |
89 if (!event.IsPointerEvent() || | 102 if (!event.IsPointerEvent() || |
90 pointer_type_ != event.AsPointerEvent()->pointer_details().pointer_type) | 103 pointer_type_ != event.AsPointerEvent()->pointer_details().pointer_type) |
91 return false; | 104 return false; |
92 } | 105 } |
93 if (fields_to_match_ & POINTER_LOCATION) { | 106 if (fields_to_match_ & POINTER_LOCATION) { |
94 // TODO(sad): The tricky part here is to make sure the same coord-space is | 107 // TODO(sad): The tricky part here is to make sure the same coord-space is |
95 // used for the location-region and the event-location. | 108 // used for the location-region and the event-location. |
96 NOTIMPLEMENTED(); | 109 NOTIMPLEMENTED(); |
97 return false; | 110 return false; |
98 } | 111 } |
99 return true; | 112 return true; |
100 } | 113 } |
101 | 114 |
102 bool EventMatcher::Equals(const EventMatcher& other) const { | 115 bool EventMatcher::Equals(const EventMatcher& other) const { |
103 return fields_to_match_ == other.fields_to_match_ && | 116 return fields_to_match_ == other.fields_to_match_ && |
104 event_type_ == other.event_type_ && | 117 event_types_ == other.event_types_ && |
105 event_flags_ == other.event_flags_ && | 118 event_flags_ == other.event_flags_ && |
106 ignore_event_flags_ == other.ignore_event_flags_ && | 119 ignore_event_flags_ == other.ignore_event_flags_ && |
107 keyboard_code_ == other.keyboard_code_ && | 120 keyboard_code_ == other.keyboard_code_ && |
108 pointer_type_ == other.pointer_type_ && | 121 pointer_type_ == other.pointer_type_ && |
109 pointer_region_ == other.pointer_region_; | 122 pointer_region_ == other.pointer_region_; |
110 } | 123 } |
111 | 124 |
112 } // namespace ws | 125 } // namespace ws |
113 } // namespace mus | 126 } // namespace mus |
OLD | NEW |