From a230daa99833062217a9270e1ef1d3c4e86e2e66 Mon Sep 17 00:00:00 2001 From: Cheng Zhao Date: Mon, 18 Aug 2014 14:52:44 +0800 Subject: [PATCH] views: Pressing "Alt+Key" should bring up the menu bar. --- atom/browser/native_window_views.cc | 12 +++++++++--- atom/browser/ui/views/menu_bar.cc | 18 ++++++++++++------ atom/browser/ui/views/menu_bar.h | 4 ++++ 3 files changed, 25 insertions(+), 9 deletions(-) diff --git a/atom/browser/native_window_views.cc b/atom/browser/native_window_views.cc index 8523d6828391..a2702d36ebe9 100644 --- a/atom/browser/native_window_views.cc +++ b/atom/browser/native_window_views.cc @@ -572,16 +572,22 @@ void NativeWindowViews::HandleKeyboardEvent( const content::NativeWebKeyboardEvent& event) { keyboard_event_handler_->HandleKeyboardEvent(event, GetFocusManager()); - if (menu_bar_ && menu_bar_visible_) { + if (menu_bar_) { // Toggle accelerator when "Alt" is pressed. - if (IsAltKey(event)) + if (menu_bar_visible_ && IsAltKey(event)) menu_bar_->SetAcceleratorVisibility( event.type == blink::WebInputEvent::RawKeyDown); // Show the submenu when "Alt+Key" is pressed. if (event.type == blink::WebInputEvent::RawKeyDown && !IsAltKey(event) && - IsAltModifier(event)) + IsAltModifier(event)) { + if (!menu_bar_visible_ && + (menu_bar_->GetAcceleratorIndex(event.windowsKeyCode) != -1)) { + SetMenuBarVisibility(true); + Layout(); + } menu_bar_->ActivateAccelerator(event.windowsKeyCode); + } } if (!menu_bar_autohide_) diff --git a/atom/browser/ui/views/menu_bar.cc b/atom/browser/ui/views/menu_bar.cc index 0dc1b502f1ae..1397b9013d6a 100644 --- a/atom/browser/ui/views/menu_bar.cc +++ b/atom/browser/ui/views/menu_bar.cc @@ -90,14 +90,20 @@ void MenuBar::SetAcceleratorVisibility(bool visible) { static_cast(child_at(i))->SetAcceleratorVisibility(visible); } -void MenuBar::ActivateAccelerator(base::char16 key) { +int MenuBar::GetAcceleratorIndex(base::char16 key) { for (int i = 0; i < child_count(); ++i) { SubmenuButton* button = static_cast(child_at(i)); - if (button->accelerator() == key) { - SetAcceleratorVisibility(false); - button->Activate(); - return; - } + if (button->accelerator() == key) + return i; + } + return -1; +} + +void MenuBar::ActivateAccelerator(base::char16 key) { + int i = GetAcceleratorIndex(key); + if (i != -1) { + SetAcceleratorVisibility(false); + static_cast(child_at(i))->Activate(); } } diff --git a/atom/browser/ui/views/menu_bar.h b/atom/browser/ui/views/menu_bar.h index ba21c53a4c47..8d9f41d75274 100644 --- a/atom/browser/ui/views/menu_bar.h +++ b/atom/browser/ui/views/menu_bar.h @@ -34,6 +34,10 @@ class MenuBar : public views::View, // Shows underline under accelerators. void SetAcceleratorVisibility(bool visible); + // Returns which submenu has accelerator |key|, -1 would be returned when + // there is no matching submenu. + int GetAcceleratorIndex(base::char16 key); + // Shows the submenu whose accelerator is |key|. void ActivateAccelerator(base::char16 key);