Index: ash/accelerators/accelerator_delegate.cc |
diff --git a/ash/accelerators/accelerator_delegate.cc b/ash/accelerators/accelerator_delegate.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..dc83437aceef6f0d5863cfbd4a42a14e9081e8be |
--- /dev/null |
+++ b/ash/accelerators/accelerator_delegate.cc |
@@ -0,0 +1,79 @@ |
+// Copyright 2014 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#include "ash/accelerators/accelerator_delegate.h" |
+ |
+#include "ash/accelerators/accelerator_controller.h" |
+#include "ash/shell.h" |
+#include "ash/wm/window_state.h" |
+#include "ui/base/accelerators/accelerator.h" |
+#include "ui/events/event.h" |
+#include "ui/wm/core/window_util.h" |
+ |
+namespace ash { |
+namespace {} // namespace |
+ |
+AcceleratorDelegate::AcceleratorDelegate() { |
+} |
+AcceleratorDelegate::~AcceleratorDelegate() { |
+} |
+ |
+void AcceleratorDelegate::PreProcessAccelerator( |
+ const ui::Accelerator& accelerator) { |
+ // Fill out context object so AcceleratorController will know what |
+ // was the previous accelerator or if the current accelerator is repeated. |
+ Shell::GetInstance()->accelerator_controller()->context()->UpdateContext( |
+ accelerator); |
+} |
+ |
+// Uses the top level window so if the target is a web contents window the |
+// containing parent window will be checked for the property. |
+bool AcceleratorDelegate::CanConsumeSystemKeys(const ui::KeyEvent& event) { |
+ aura::Window* target = static_cast<aura::Window*>(event.target()); |
+ if (!target) // Can be NULL in tests. |
+ return false; |
+ aura::Window* top_level = ::wm::GetToplevelWindow(target); |
+ return top_level && wm::GetWindowState(top_level)->can_consume_system_keys(); |
+} |
+ |
+// Returns true if the |accelerator| should be processed now, inside Ash's env |
+// event filter. |
+bool AcceleratorDelegate::ShouldProcessAcceleratorNow( |
+ const ui::KeyEvent& event, |
+ const ui::Accelerator& accelerator) { |
+ aura::Window* target = static_cast<aura::Window*>(event.target()); |
+ if (!target) |
+ return true; |
+ |
+ aura::Window::Windows root_windows = Shell::GetAllRootWindows(); |
+ if (std::find(root_windows.begin(), root_windows.end(), target) != |
+ root_windows.end()) |
+ return true; |
+ |
+ // A full screen window should be able to handle all key events including the |
+ // reserved ones. |
+ if (wm::GetWindowState(target)->IsFullscreen()) { |
+ // TODO(yusukes): On Chrome OS, only browser and flash windows can be full |
+ // screen. Launching an app in "open full-screen" mode is not supported yet. |
+ // That makes the IsWindowFullscreen() check above almost meaningless |
+ // because a browser and flash window do handle Ash accelerators anyway |
+ // before they're passed to a page or flash content. |
+ return false; |
+ } |
+ |
+ if (Shell::GetInstance()->GetAppListTargetVisibility()) |
+ return true; |
+ |
+ // Unless |target| is in the full screen state, handle reserved accelerators |
+ // such as Alt+Tab now. |
+ return Shell::GetInstance()->accelerator_controller()->IsReservedAccelerator( |
+ accelerator); |
+} |
+ |
+bool AcceleratorDelegate::ProcessAccelerator( |
+ const ui::Accelerator& accelerator) { |
+ return Shell::GetInstance()->accelerator_controller()->Process(accelerator); |
+} |
+ |
+} // namespace ash |