Browse Source

views: Pressing "Alt+Key" should bring up the menu bar.

Cheng Zhao 10 years ago
parent
commit
a230daa998

+ 9 - 3
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_)

+ 12 - 6
atom/browser/ui/views/menu_bar.cc

@@ -90,14 +90,20 @@ void MenuBar::SetAcceleratorVisibility(bool visible) {
     static_cast<SubmenuButton*>(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<SubmenuButton*>(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<SubmenuButton*>(child_at(i))->Activate();
   }
 }
 

+ 4 - 0
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);