Chromium Code Reviews| Index: chrome/browser/ui/cocoa/apps/app_menu_controller_mac.mm |
| diff --git a/chrome/browser/ui/cocoa/apps/app_menu_controller_mac.mm b/chrome/browser/ui/cocoa/apps/app_menu_controller_mac.mm |
| index 69622b078eb9f623d25e406297505324e321ed93..d1ff9cbde395ffa62836c5c8d5cccaaa2facbc27 100644 |
| --- a/chrome/browser/ui/cocoa/apps/app_menu_controller_mac.mm |
| +++ b/chrome/browser/ui/cocoa/apps/app_menu_controller_mac.mm |
| @@ -8,8 +8,10 @@ |
| #include "apps/shell_window.h" |
| #include "apps/shell_window_registry.h" |
| #include "base/strings/sys_string_conversions.h" |
| +#include "base/strings/utf_string_conversions.h" |
| #import "chrome/browser/ui/cocoa/apps/native_app_window_cocoa.h" |
| #include "chrome/common/extensions/extension.h" |
| +#include "grit/generated_resources.h" |
| #include "ui/base/l10n/l10n_util.h" |
| #include "ui/base/l10n/l10n_util_mac.h" |
| @@ -25,6 +27,8 @@ |
| // If the window belongs to the currently focused app, remove the menu items and |
| // unhide Chrome menu items. |
| - (void)removeMenuItems:(NSString*)appId; |
| +// If the currently focused window belongs to a platform app, quit the app. |
| +- (void)quitCurrentPlatformApp; |
| @end |
| @implementation AppMenuController |
| @@ -43,10 +47,27 @@ |
| } |
| - (void)buildAppMenuItems { |
| + // Find the "Quit Chrome" menu item. |
| + NSMenu* chromeMenu = [[[NSApp mainMenu] itemAtIndex:0] submenu]; |
| + for (NSMenuItem* item in [chromeMenu itemArray]) { |
| + if ([item action] == @selector(terminate:)) { |
| + chromeMenuQuitItem_.reset([item retain]); |
| + break; |
| + } |
| + } |
| + |
|
tapted
2013/08/22 07:20:15
Hm.. what to do if it's not found. Perhaps DCHECK
jackhou1
2013/08/23 05:31:56
Done.
|
| appMenuItem_.reset([[NSMenuItem alloc] initWithTitle:@"" |
| action:nil |
| keyEquivalent:@""]); |
| base::scoped_nsobject<NSMenu> appMenu([[NSMenu alloc] initWithTitle:@""]); |
| + [appMenu setAutoenablesItems:NO]; |
| + NSMenuItem* appMenuQuitItem = |
| + [appMenu addItemWithTitle:@"" |
| + action:@selector(quitCurrentPlatformApp) |
| + keyEquivalent:@""]; |
| + [appMenuQuitItem setKeyEquivalentModifierMask: |
| + [chromeMenuQuitItem_ keyEquivalentModifierMask]]; |
| + [appMenuQuitItem setTarget:self]; |
| [appMenuItem_ setSubmenu:appMenu]; |
| } |
| @@ -103,10 +124,23 @@ |
| [self removeMenuItems:appId_]; |
| appId_.reset([appId copy]); |
| + // Hide Chrome menu items. |
| NSMenu* mainMenu = [NSApp mainMenu]; |
| for (NSMenuItem* item in [mainMenu itemArray]) |
| [item setHidden:YES]; |
| + NSString* localizedQuitApp = |
| + l10n_util::GetNSStringF(IDS_EXIT_MAC, base::UTF8ToUTF16(app->name())); |
| + NSMenuItem* appMenuQuitItem = [[[appMenuItem_ submenu] itemArray] lastObject]; |
| + [appMenuQuitItem setTitle:localizedQuitApp]; |
| + |
| + // It seems that two menu items that have the same key equivalent must also |
| + // have the same action for the keyboard shortcut to work. |
| + // In order to let the appMenuQuitItem have a different action, we 'steal' |
| + // the key equivalent from the chromeMenuQuitItem and restore it later. |
| + [appMenuQuitItem setKeyEquivalent:[chromeMenuQuitItem_ keyEquivalent]]; |
| + [chromeMenuQuitItem_ setKeyEquivalent:@""]; |
| + |
| [appMenuItem_ setTitle:appId]; |
| [[appMenuItem_ submenu] setTitle:title]; |
| [mainMenu addItem:appMenuItem_]; |
| @@ -124,6 +158,19 @@ |
| // Restore the Chrome main menu bar. |
| for (NSMenuItem* item in [mainMenu itemArray]) |
| [item setHidden:NO]; |
| + |
| + // Restore the keyboard shortcut to Chrome. |
| + NSMenuItem* appMenuQuitItem = [[[appMenuItem_ submenu] itemArray] lastObject]; |
| + [chromeMenuQuitItem_ setKeyEquivalent:[appMenuQuitItem keyEquivalent]]; |
| + [appMenuQuitItem setKeyEquivalent:@""]; |
| +} |
| + |
| +- (void)quitCurrentPlatformApp { |
| + apps::ShellWindow* shellWindow = |
| + apps::ShellWindowRegistry::GetShellWindowForNativeWindowAnyProfile( |
| + [NSApp keyWindow]); |
| + if (shellWindow) |
| + apps::ExtensionAppShimHandler::QuitAppForWindow(shellWindow); |
| } |
| @end |