Chromium Code Reviews| 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 c166ab85f9f4e04e811f6ef9bd5022217e8a5cf9..55fdea3b4423d10171dcb997afd13530078675ea 100644 |
| --- a/ui/views/controls/menu/menu_controller.cc |
| +++ b/ui/views/controls/menu/menu_controller.cc |
| @@ -25,6 +25,7 @@ |
| #include "ui/views/widget/widget.h" |
| #if defined(USE_AURA) |
| +#include "ui/aura/client/accelerator_client.h" |
| #include "ui/aura/root_window.h" |
| #elif defined(TOOLKIT_USES_GTK) |
| #include "ui/base/keycodes/keyboard_code_conversion_gtk.h" |
| @@ -51,6 +52,10 @@ namespace views { |
| namespace { |
| +const int kModifierMask = (ui::EF_SHIFT_DOWN | |
| + ui::EF_CONTROL_DOWN | |
| + ui::EF_ALT_DOWN); |
| + |
| // Returns true if the mnemonic of |menu| matches key. |
| bool MatchesMnemonic(MenuItemView* menu, char16 key) { |
| return menu->GetMnemonic() == key; |
| @@ -863,8 +868,16 @@ bool MenuController::Dispatch(const MSG& msg) { |
| TranslateMessage(&msg); |
| return result; |
| } |
| - case WM_CHAR: |
| + case WM_CHAR: { |
| +#if defined(USE_AURA) |
| + ui::Accelerator accelerator(ui::KeyboardCodeFromNative(msg), |
| + ui::EventFlagsFromNative(msg) & kModifierMask); |
| + if (aura::client::GetAcceleratorClient() && |
| + aura::client::GetAcceleratorClient()->Process(accelerator)) |
| + return false; |
| +#endif |
| return !SelectByChar(static_cast<char16>(msg.wParam)); |
| + } |
| case WM_KEYUP: |
| return true; |
| @@ -903,11 +916,12 @@ base::MessagePumpDispatcher::DispatchStatus |
| aura::RootWindow::GetInstance()->GetDispatcher()->Dispatch(xev); |
| return base::MessagePumpDispatcher::EVENT_QUIT; |
| } |
| - switch (ui::EventTypeFromNative(xev)) { |
| - case ui::ET_KEY_PRESSED: |
| - if (!OnKeyDown(ui::KeyboardCodeFromNative(xev))) |
| - return base::MessagePumpDispatcher::EVENT_QUIT; |
| + ui::KeyboardCode keycode = ui::KeyboardCodeFromNative(xev); |
| + switch (ui::EventTypeFromNative(xev)) { |
| + case ui::ET_KEY_PRESSED: { |
| + if (!OnKeyDown(keycode)) |
| + return base::MessagePumpDispatcher::EVENT_QUIT; |
| // OnKeyDown may have set exit_type_. |
| // TODO(sky): This shouldn't be necessary if OnKeyDown returns correct |
| // value for space key on edit menu. Fix OnKeyDown and remove this. |
| @@ -915,9 +929,17 @@ base::MessagePumpDispatcher::DispatchStatus |
| if (exit_type_ != EXIT_NONE) |
| return base::MessagePumpDispatcher::EVENT_QUIT; |
| - return SelectByChar(ui::KeyboardCodeFromNative(xev)) ? |
| - base::MessagePumpDispatcher::EVENT_QUIT : |
| - base::MessagePumpDispatcher::EVENT_PROCESSED; |
| + ui::Accelerator accelerator(keycode, |
| + ui::EventFlagsFromNative(xev) & kModifierMask); |
| + if (aura::client::GetAcceleratorClient() && |
| + aura::client::GetAcceleratorClient()->Process(accelerator)) |
| + return base::MessagePumpDispatcher::EVENT_QUIT; |
| + |
| + if (SelectByChar(keycode)) |
| + return base::MessagePumpDispatcher::EVENT_QUIT; |
| + |
| + return base::MessagePumpDispatcher::EVENT_PROCESSED; |
|
oshima
2012/01/27 21:41:34
I think WM accelerator should be handled before ch
|
| + } |
| case ui::ET_KEY_RELEASED: |
| return base::MessagePumpDispatcher::EVENT_PROCESSED; |
| default: |