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; |
} |