Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1955)

Unified Diff: services/ui/ws/event_dispatcher.cc

Issue 2125883003: Adds ability for pre-target accelerators to not consume events (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: merge Created 4 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « services/ui/ws/event_dispatcher.h ('k') | services/ui/ws/event_dispatcher_delegate.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: services/ui/ws/event_dispatcher.cc
diff --git a/services/ui/ws/event_dispatcher.cc b/services/ui/ws/event_dispatcher.cc
index 4791478876183e8d72d4ba8b8d7a756cd32ec816..d86edb2b44efee5357231e8ecd2d0cb327ef8143 100644
--- a/services/ui/ws/event_dispatcher.cc
+++ b/services/ui/ws/event_dispatcher.cc
@@ -253,18 +253,35 @@ void EventDispatcher::RemoveAccelerator(uint32_t id) {
accelerators_.erase(it);
}
-void EventDispatcher::ProcessEvent(const ui::Event& event) {
+void EventDispatcher::ProcessEvent(const ui::Event& event,
+ AcceleratorMatchPhase match_phase) {
+#if !defined(NDEBUG)
+ if (match_phase == AcceleratorMatchPhase::POST_ONLY) {
+ // POST_ONLY should always be preceeded by ANY with the same event.
+ DCHECK(previous_event_);
+ // Event doesn't define ==, so this compares the key fields.
+ DCHECK(event.type() == previous_event_->type() &&
+ event.time_stamp() == previous_event_->time_stamp() &&
+ event.flags() == previous_event_->flags());
+ DCHECK_EQ(previous_accelerator_match_phase_, AcceleratorMatchPhase::ANY);
+ }
+ previous_event_ = Event::Clone(event);
+ previous_accelerator_match_phase_ = match_phase;
+#endif
if (event.IsKeyEvent()) {
const ui::KeyEvent* key_event = event.AsKeyEvent();
- if (event.type() == ui::ET_KEY_PRESSED && !key_event->is_char()) {
+ if (event.type() == ui::ET_KEY_PRESSED && !key_event->is_char() &&
+ match_phase == AcceleratorMatchPhase::ANY) {
Accelerator* pre_target =
FindAccelerator(*key_event, ui::mojom::AcceleratorPhase::PRE_TARGET);
if (pre_target) {
- delegate_->OnAccelerator(pre_target->id(), event);
+ delegate_->OnAccelerator(
+ pre_target->id(), event,
+ EventDispatcherDelegate::AcceleratorPhase::PRE);
return;
}
}
- ProcessKeyEvent(*key_event);
+ ProcessKeyEvent(*key_event, match_phase);
return;
}
@@ -276,7 +293,8 @@ void EventDispatcher::ProcessEvent(const ui::Event& event) {
NOTREACHED();
}
-void EventDispatcher::ProcessKeyEvent(const ui::KeyEvent& event) {
+void EventDispatcher::ProcessKeyEvent(const ui::KeyEvent& event,
+ AcceleratorMatchPhase match_phase) {
Accelerator* post_target =
FindAccelerator(event, ui::mojom::AcceleratorPhase::POST_TARGET);
ServerWindow* focused_window =
@@ -292,7 +310,8 @@ void EventDispatcher::ProcessKeyEvent(const ui::KeyEvent& event) {
}
delegate_->OnEventTargetNotFound(event);
if (post_target)
- delegate_->OnAccelerator(post_target->id(), event);
+ delegate_->OnAccelerator(post_target->id(), event,
+ EventDispatcherDelegate::AcceleratorPhase::POST);
}
void EventDispatcher::ProcessLocatedEvent(const ui::LocatedEvent& event) {
@@ -511,9 +530,8 @@ Accelerator* EventDispatcher::FindAccelerator(
const ui::KeyEvent& event,
const ui::mojom::AcceleratorPhase phase) {
for (const auto& pair : accelerators_) {
- if (pair.second->MatchesEvent(event, phase)) {
+ if (pair.second->MatchesEvent(event, phase))
return pair.second.get();
- }
}
return nullptr;
}
« no previous file with comments | « services/ui/ws/event_dispatcher.h ('k') | services/ui/ws/event_dispatcher_delegate.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698