Index: ash/accelerators/ash_menu_event_filter_delegate.cc |
diff --git a/ash/accelerators/ash_menu_event_filter_delegate.cc b/ash/accelerators/ash_menu_event_filter_delegate.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..015f390778f271b7fc0970f3477105707d654cb1 |
--- /dev/null |
+++ b/ash/accelerators/ash_menu_event_filter_delegate.cc |
@@ -0,0 +1,65 @@ |
+// Copyright 2015 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/ash_menu_event_filter_delegate.h" |
+ |
+#include "ash/accelerators/accelerator_controller.h" |
+#include "ash/shell.h" |
+#include "ash/wm/window_util.h" |
+#include "ui/aura/window.h" |
+#include "ui/views/controls/menu/menu_event_filter.h" |
+#include "ui/views/focus/focus_manager.h" |
+#include "ui/views/widget/widget.h" |
+ |
+namespace ash { |
+ |
+AshMenuEventFilterDelegate::AshMenuEventFilterDelegate( |
+ ui::AcceleratorHistory* history) |
+ : accelerator_history_(history) { |
+ DCHECK(history); |
+} |
+ |
+AshMenuEventFilterDelegate::~AshMenuEventFilterDelegate() {} |
+ |
+void AshMenuEventFilterDelegate::StoreInHistory( |
+ const ui::Accelerator& accelerator) { |
+ accelerator_history_->StoreCurrentAccelerator(accelerator); |
+} |
+ |
+views::MenuEventFilter::Delegate::Result |
+AshMenuEventFilterDelegate::ProcessAccelerator( |
+ const ui::Accelerator& accelerator) { |
+ ash::AcceleratorController* accelerator_controller = |
+ ash::Shell::GetInstance()->accelerator_controller(); |
+ if (accelerator_controller->ShouldMenuBeKeptOpenForAccelerator(accelerator)) { |
+ // Menu will be kept open and accelerator will be handled now. |
+ ProcessAcceleratorNow(accelerator); |
+ return views::MenuEventFilter::Delegate::RESULT_PROCESSED; |
+ } |
+ |
+ // Menu should be closed and the accelerator should be reposted for processing |
+ // later by the MenuEventFilter after the menu's nested runloop exits. |
+ return views::MenuEventFilter::Delegate::RESULT_PROCESS_LATER; |
+} |
+ |
+void AshMenuEventFilterDelegate::ProcessAcceleratorNow( |
+ const ui::Accelerator& accelerator) { |
+ aura::Window* active_window = ash::wm::GetActiveWindow(); |
+ if (active_window) { |
+ views::Widget* widget = |
+ views::Widget::GetWidgetForNativeWindow(active_window); |
+ if (widget) { |
+ views::FocusManager* focus_manager = widget->GetFocusManager(); |
+ DCHECK(focus_manager); |
+ if (focus_manager->ProcessAccelerator(accelerator)) |
pkotwicz
2015/08/26 01:26:54
What's the thinking behind calling FocusManager::P
afakhry
2015/08/26 18:39:21
Exactly. I did this after a discussion with Oshima
oshima
2015/09/02 17:08:21
The whole point of this work is that an accelerato
|
+ return; |
+ } |
+ } |
+ |
+ ash::AcceleratorController* accelerator_controller = |
+ ash::Shell::GetInstance()->accelerator_controller(); |
+ accelerator_controller->Process(accelerator); |
+} |
+ |
+} // namespace ash |