| Index: chrome/browser/ui/cocoa/apps/app_shim_menu_controller_mac.mm
|
| diff --git a/chrome/browser/ui/cocoa/apps/app_shim_menu_controller_mac.mm b/chrome/browser/ui/cocoa/apps/app_shim_menu_controller_mac.mm
|
| index 6ecfb4e8556f0f0cea4260ceb724bd829354988f..6cd9a1dbcceec8a81e6bedc6d3930e0be9eba355 100644
|
| --- a/chrome/browser/ui/cocoa/apps/app_shim_menu_controller_mac.mm
|
| +++ b/chrome/browser/ui/cocoa/apps/app_shim_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 AppShimMenuController
|
| @@ -43,10 +47,28 @@
|
| }
|
|
|
| - (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;
|
| + }
|
| + }
|
| + DCHECK(chromeMenuQuitItem_);
|
| +
|
| 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:@"q"];
|
| + [appMenuQuitItem setKeyEquivalentModifierMask:
|
| + [chromeMenuQuitItem_ keyEquivalentModifierMask]];
|
| + [appMenuQuitItem setTarget:self];
|
| [appMenuItem_ setSubmenu:appMenu];
|
| }
|
|
|
| @@ -103,10 +125,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. (This refers to the
|
| + // original keyboard shortcut, regardless of any overrides set in OSX).
|
| + // In order to let the appMenuQuitItem have a different action, we remove the
|
| + // key equivalent from the chromeMenuQuitItem and restore it later.
|
| + [chromeMenuQuitItem_ setKeyEquivalent:@""];
|
| +
|
| [appMenuItem_ setTitle:appId];
|
| [[appMenuItem_ submenu] setTitle:title];
|
| [mainMenu addItem:appMenuItem_];
|
| @@ -124,6 +159,19 @@
|
| // Restore the Chrome main menu bar.
|
| for (NSMenuItem* item in [mainMenu itemArray])
|
| [item setHidden:NO];
|
| +
|
| + // Restore the keyboard shortcut to Chrome. This just needs to be set back to
|
| + // the original keyboard shortcut, regardless of any overrides in OSX. The
|
| + // overrides still work as they are based on the title of the menu item.
|
| + [chromeMenuQuitItem_ setKeyEquivalent:@"q"];
|
| +}
|
| +
|
| +- (void)quitCurrentPlatformApp {
|
| + apps::ShellWindow* shellWindow =
|
| + apps::ShellWindowRegistry::GetShellWindowForNativeWindowAnyProfile(
|
| + [NSApp keyWindow]);
|
| + if (shellWindow)
|
| + apps::ExtensionAppShimHandler::QuitAppForWindow(shellWindow);
|
| }
|
|
|
| @end
|
|
|