Index: chrome/browser/ui/views/frame/browser_view.cc |
diff --git a/chrome/browser/ui/views/frame/browser_view.cc b/chrome/browser/ui/views/frame/browser_view.cc |
index da1f15abd35003c7314583e53a07b10e41ffaa90..f5f476db1fa4b9e1e38f9cc5aed81e50f353d52c 100644 |
--- a/chrome/browser/ui/views/frame/browser_view.cc |
+++ b/chrome/browser/ui/views/frame/browser_view.cc |
@@ -102,6 +102,7 @@ |
#include "ui/views/window/dialog_delegate.h" |
#if defined(USE_ASH) |
+#include "ash/accelerators/accelerator_controller.h" |
#include "ash/launcher/launcher.h" |
#include "ash/launcher/launcher_model.h" |
#include "ash/shell.h" |
@@ -117,6 +118,7 @@ |
#if defined(USE_AURA) |
#include "chrome/browser/ui/views/accelerator_table.h" |
+#include "ui/aura/event.h" |
#include "ui/gfx/screen.h" |
#endif |
@@ -188,6 +190,52 @@ bool AdjustFrameForImmersiveMode(BrowserFrame* frame) { |
} |
#endif |
+#if defined(USE_ASH) |
+// Do not call this function directly. |
+bool ProcessAshAcceleratorInternal(const NativeWebKeyboardEvent& event, |
Ben Goodger (Google)
2012/05/01 16:00:37
Can we move this back to src/ash?
I don't like ha
Yusuke Sato
2012/05/02 16:40:11
Thanks for the suggestion. Migrated to Ash-only so
|
+ bool check_only) { |
+ ui::Accelerator accelerator( |
+ static_cast<ui::KeyboardCode>(event.windowsKeyCode), |
+ (event.modifiers & NativeWebKeyboardEvent::ShiftKey) == |
+ NativeWebKeyboardEvent::ShiftKey, |
+ (event.modifiers & NativeWebKeyboardEvent::ControlKey) == |
+ NativeWebKeyboardEvent::ControlKey, |
+ (event.modifiers & NativeWebKeyboardEvent::AltKey) == |
+ NativeWebKeyboardEvent::AltKey); |
+ |
+ if (event.type == WebKit::WebInputEvent::KeyUp) |
+ accelerator.set_type(ui::ET_KEY_RELEASED); |
+ else if (event.type != WebKit::WebInputEvent::RawKeyDown) |
+ return false; |
+ |
+ const aura::KeyEvent* aura_event = |
+ static_cast<const aura::KeyEvent*>(event.os_event); |
+ ash::AcceleratorController* accelerator_controller = |
+ ash::Shell::GetInstance()->accelerator_controller(); |
+ |
+ // |aura_event| could be NULL when the keyboard |event| is a fabricated one. |
+ // See RenderWidgetHostViewAura::OnKeyEvent() for details. |
+ if (!aura_event || !accelerator_controller) |
+ return false; |
+ |
+ if (check_only && accelerator_controller->IsAccelerator(accelerator)) |
+ return true; |
+ if (!check_only && accelerator_controller->Process(accelerator)) |
+ return true; |
+ |
+ return false; |
+} |
+ |
+bool ProcessAshAccelerator(const NativeWebKeyboardEvent& event) { |
+ return ProcessAshAcceleratorInternal(event, false); |
+} |
+ |
+bool IsAshAccelerator(const NativeWebKeyboardEvent& event) { |
+ return ProcessAshAcceleratorInternal(event, true); |
+} |
+ |
+#endif |
+ |
} // namespace |
// Returned from BrowserView::GetClassName. |
@@ -1190,6 +1238,15 @@ void BrowserView::ShowAppMenu() { |
bool BrowserView::PreHandleKeyboardEvent(const NativeWebKeyboardEvent& event, |
bool* is_keyboard_shortcut) { |
+#if defined(USE_ASH) |
+ if (!browser_->is_app() && ProcessAshAccelerator(event)) |
+ return true; |
+ if (browser_->is_app() && IsAshAccelerator(event)) { |
+ *is_keyboard_shortcut = true; |
+ return false; |
+ } |
+#endif |
+ |
if (event.type != WebKit::WebInputEvent::RawKeyDown) |
return false; |
@@ -1252,6 +1309,10 @@ bool BrowserView::PreHandleKeyboardEvent(const NativeWebKeyboardEvent& event, |
} |
void BrowserView::HandleKeyboardEvent(const NativeWebKeyboardEvent& event) { |
+#if defined(USE_ASH) |
+ if (browser_->is_app() && ProcessAshAccelerator(event)) |
+ return; |
+#endif |
unhandled_keyboard_event_handler_.HandleKeyboardEvent(event, |
GetFocusManager()); |
} |