| Index: ui/views/controls/menu/menu_controller.cc
|
| diff --git a/ui/views/controls/menu/menu_controller.cc b/ui/views/controls/menu/menu_controller.cc
|
| index d1547c41a8c3d4aaec0de657a595a2777328e742..a4874802c450bbdb87f0063e6436722bcea76792 100644
|
| --- a/ui/views/controls/menu/menu_controller.cc
|
| +++ b/ui/views/controls/menu/menu_controller.cc
|
| @@ -12,6 +12,7 @@
|
| #include "ui/base/dragdrop/os_exchange_data.h"
|
| #include "ui/events/event.h"
|
| #include "ui/events/event_utils.h"
|
| +#include "ui/events/keycodes/keyboard_code_conversion.h"
|
| #include "ui/gfx/canvas.h"
|
| #include "ui/gfx/geometry/point.h"
|
| #include "ui/gfx/geometry/vector2d.h"
|
| @@ -804,6 +805,54 @@ void MenuController::OnDragComplete(bool should_close) {
|
| }
|
| }
|
|
|
| +ui::PostDispatchAction MenuController::OnWillDispatchEvent(
|
| + const ui::Event& event) {
|
| + if (exit_type() == MenuController::EXIT_ALL ||
|
| + exit_type() == MenuController::EXIT_DESTROYED) {
|
| + TerminateNestedMessageLoop();
|
| + return ui::POST_DISPATCH_PERFORM_DEFAULT;
|
| + }
|
| +
|
| + bool should_quit = false;
|
| + bool should_perform_default = true;
|
| + switch (event.type()) {
|
| + case ui::ET_KEY_PRESSED: {
|
| + const ui::KeyEvent& key_event = static_cast<const ui::KeyEvent&>(event);
|
| + if (!OnKeyDown(key_event.key_code())) {
|
| + should_quit = true;
|
| + should_perform_default = false;
|
| + break;
|
| + }
|
| +
|
| + // Do not check mnemonics if the Alt or Ctrl modifiers are pressed.
|
| + int flags = key_event.flags();
|
| + if ((flags & (ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN)) == 0) {
|
| + char c = ui::GetCharacterFromKeyCode(key_event.key_code(), flags);
|
| + if (SelectByChar(c)) {
|
| + should_quit = true;
|
| + should_perform_default = false;
|
| + break;
|
| + }
|
| + }
|
| + should_quit = false;
|
| + should_perform_default = false;
|
| + break;
|
| + }
|
| + case ui::ET_KEY_RELEASED:
|
| + should_quit = false;
|
| + should_perform_default = false;
|
| + break;
|
| + default:
|
| + break;
|
| + }
|
| +
|
| + if (should_quit || exit_type() != MenuController::EXIT_NONE)
|
| + TerminateNestedMessageLoop();
|
| +
|
| + return should_perform_default ? ui::POST_DISPATCH_PERFORM_DEFAULT
|
| + : ui::POST_DISPATCH_NONE;
|
| +}
|
| +
|
| void MenuController::UpdateSubmenuSelection(SubmenuView* submenu) {
|
| if (submenu->IsShowing()) {
|
| gfx::Point point = GetScreen()->GetCursorScreenPoint();
|
| @@ -1028,16 +1077,22 @@ bool MenuController::OnKeyDown(ui::KeyboardCode key_code) {
|
| CloseSubmenu();
|
| break;
|
|
|
| +// On Mac, treat space the same as return.
|
| +#if !defined(OS_MACOSX)
|
| case ui::VKEY_SPACE:
|
| if (SendAcceleratorToHotTrackedView() == ACCELERATOR_PROCESSED_EXIT)
|
| return false;
|
| break;
|
| +#endif
|
|
|
| case ui::VKEY_F4:
|
| if (!is_combobox_)
|
| break;
|
| // Fallthrough to accept or dismiss combobox menus on F4, like windows.
|
| case ui::VKEY_RETURN:
|
| +#if defined(OS_MACOSX)
|
| + case ui::VKEY_SPACE:
|
| +#endif
|
| if (pending_state_.item) {
|
| if (pending_state_.item->HasSubmenu()) {
|
| if (key_code == ui::VKEY_F4 &&
|
|
|