Chromium Code Reviews| Index: services/ui/ws/display.cc |
| diff --git a/services/ui/ws/display.cc b/services/ui/ws/display.cc |
| index 7fc5771a689b12454b47d45b124b35f174ac2284..f2cc26f61624911b188dd8fa175ffa909f66599d 100644 |
| --- a/services/ui/ws/display.cc |
| +++ b/services/ui/ws/display.cc |
| @@ -8,6 +8,7 @@ |
| #include <utility> |
| #include <vector> |
| +#include "base/callback_helpers.h" |
| #include "base/memory/ptr_util.h" |
| #include "base/strings/utf_string_conversions.h" |
| #include "services/service_manager/public/interfaces/connector.mojom.h" |
| @@ -28,6 +29,7 @@ |
| #include "services/ui/ws/window_tree_binding.h" |
| #include "ui/base/cursor/cursor.h" |
| #include "ui/display/screen.h" |
| +#include "ui/events/event_rewriter.h" |
| namespace ui { |
| namespace ws { |
| @@ -270,13 +272,55 @@ bool Display::IsInHighContrastMode() { |
| } |
| void Display::OnEvent(const ui::Event& event) { |
| + // Run UserActivityMonitor::OnUserActivity() for active user before exiting |
| + // this function. |
| + UserActivityMonitor* activity_monitor = |
| + window_server_->GetUserActivityMonitorForUser( |
| + window_server_->user_id_tracker()->active_id()); |
| + base::ScopedClosureRunner scoped_runner( |
| + base::Bind(&UserActivityMonitor::OnUserActivity, |
| + base::Unretained(activity_monitor))); |
| + |
| WindowManagerDisplayRoot* display_root = GetActiveWindowManagerDisplayRoot(); |
| - if (display_root) |
| - display_root->window_manager_state()->ProcessEvent(event, GetId()); |
| - window_server_ |
| - ->GetUserActivityMonitorForUser( |
| - window_server_->user_id_tracker()->active_id()) |
| - ->OnUserActivity(); |
| + if (!display_root) |
| + return; |
| + |
| + std::unique_ptr<ui::Event> rewritten_event; |
| + ui::EventRewriteStatus status = ui::EVENT_REWRITE_CONTINUE; |
| + ui::EventRewriter* event_rewriter = display_manager()->event_rewriter(); |
| + |
| + // |event_rewriter| is null for non-ChromeOS build. |
|
Daniel Erat
2017/03/16 16:11:03
nit: non-Chrome-OS (since there's a space between
Peng
2017/03/16 17:28:57
non-ChromeOS vs non-chrome-os [1] vs [2]. Seems no
|
| + if (event_rewriter) |
| + status = event_rewriter->RewriteEvent(event, &rewritten_event); |
| + |
| + if (status == ui::EVENT_REWRITE_DISCARD) { |
| + DCHECK(!rewritten_event); |
| + return; |
| + } |
| + |
| + WindowManagerState* wm_state = display_root->window_manager_state(); |
| + if (status == ui::EVENT_REWRITE_CONTINUE) { |
| + DCHECK(!rewritten_event); |
| + wm_state->ProcessEvent(event, GetId()); |
| + return; |
| + } |
| + |
| + DCHECK(status == ui::EVENT_REWRITE_REWRITTEN || |
| + status == ui::EVENT_REWRITE_DISPATCH_ANOTHER); |
| + DCHECK(rewritten_event); |
| + wm_state->ProcessEvent(*rewritten_event, GetId()); |
| + |
| + while (status == ui::EVENT_REWRITE_DISPATCH_ANOTHER) { |
| + std::unique_ptr<Event> new_event; |
| + status = event_rewriter->NextDispatchEvent(*rewritten_event, &new_event); |
| + if (status == ui::EVENT_REWRITE_DISCARD) |
| + break; |
| + DCHECK_NE(EVENT_REWRITE_CONTINUE, status); |
| + |
| + DCHECK(new_event); |
| + wm_state->ProcessEvent(*new_event, GetId()); |
| + rewritten_event = std::move(new_event); |
| + } |
| } |
| void Display::OnNativeCaptureLost() { |