| Index: chrome/browser/cocoa/browser_window_cocoa.mm
|
| diff --git a/chrome/browser/cocoa/browser_window_cocoa.mm b/chrome/browser/cocoa/browser_window_cocoa.mm
|
| index cc231c618f0deb159c7d0bd887f11d879fa06f29..25cd6388d6de3a640de31451661e365dd58ce302 100644
|
| --- a/chrome/browser/cocoa/browser_window_cocoa.mm
|
| +++ b/chrome/browser/cocoa/browser_window_cocoa.mm
|
| @@ -11,12 +11,14 @@
|
| #import "chrome/browser/cocoa/clear_browsing_data_controller.h"
|
| #import "chrome/browser/cocoa/download_shelf_controller.h"
|
| #import "chrome/browser/cocoa/keyword_editor_cocoa_controller.h"
|
| +#import "chrome/browser/cocoa/nsmenuitem_additions.h"
|
| #include "chrome/browser/cocoa/page_info_window_mac.h"
|
| #include "chrome/browser/cocoa/status_bubble_mac.h"
|
| #include "chrome/browser/cocoa/task_manager_mac.h"
|
| #import "chrome/browser/cocoa/theme_install_bubble_view.h"
|
| #include "chrome/browser/browser.h"
|
| #include "chrome/browser/download/download_shelf.h"
|
| +#include "chrome/browser/global_keyboard_shortcuts_mac.h"
|
| #include "chrome/common/notification_service.h"
|
| #include "chrome/common/pref_names.h"
|
| #include "chrome/common/pref_service.h"
|
| @@ -323,9 +325,63 @@ void BrowserWindowCocoa::ShowAppMenu() {
|
| // No-op. Mac doesn't support showing the menus via alt keys.
|
| }
|
|
|
| +@interface MenuWalker : NSObject
|
| ++ (NSMenuItem*)itemForKeyEquivalent:(NSEvent*)key
|
| + menu:(NSMenu*)menu;
|
| +@end
|
| +
|
| +@implementation MenuWalker
|
| ++ (NSMenuItem*)itemForKeyEquivalent:(NSEvent*)key
|
| + menu:(NSMenu*)menu {
|
| + NSMenuItem* result = nil;
|
| +
|
| + for (NSMenuItem *item in [menu itemArray]) {
|
| + NSMenu* submenu = [item submenu];
|
| + if (submenu) {
|
| + if (submenu != [NSApp servicesMenu])
|
| + result = [self itemForKeyEquivalent:key
|
| + menu:submenu];
|
| + } else if ([item cr_firesForKeyEvent:key]) {
|
| + result = item;
|
| + }
|
| +
|
| + if (result)
|
| + break;
|
| + }
|
| +
|
| + return result;
|
| +}
|
| +@end
|
| +
|
| int BrowserWindowCocoa::GetCommandId(const NativeWebKeyboardEvent& event) {
|
| - // TODO(port): return the command id if this is a keyboard accelerator.
|
| - // CommandForKeyboardShortcut() doesn't have the full list.
|
| + if ([event.os_event type] != NSKeyDown)
|
| + return -1;
|
| +
|
| + // Look in menu.
|
| + NSMenuItem* item = [MenuWalker itemForKeyEquivalent:event.os_event
|
| + menu:[NSApp mainMenu]];
|
| +
|
| + if (item && [item action] == @selector(commandDispatch:) && [item tag] > 0)
|
| + return [item tag];
|
| +
|
| + // Look in secondary keyboard shortcuts.
|
| + NSUInteger modifiers = [event.os_event modifierFlags];
|
| + const bool cmdKey = (modifiers & NSCommandKeyMask) != 0;
|
| + const bool shiftKey = (modifiers & NSShiftKeyMask) != 0;
|
| + const bool cntrlKey = (modifiers & NSControlKeyMask) != 0;
|
| + const bool optKey = (modifiers & NSAlternateKeyMask) != 0;
|
| + const int keyCode = [event.os_event keyCode];
|
| +
|
| + int cmdNum = CommandForWindowKeyboardShortcut(
|
| + cmdKey, shiftKey, cntrlKey, optKey, keyCode);
|
| + if (cmdNum != -1)
|
| + return cmdNum;
|
| +
|
| + cmdNum = CommandForBrowserKeyboardShortcut(
|
| + cmdKey, shiftKey, cntrlKey, optKey, keyCode);
|
| + if (cmdNum != -1)
|
| + return cmdNum;
|
| +
|
| return -1;
|
| }
|
|
|
|
|