diff options
author | rsesek@chromium.org <rsesek@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-02-15 16:33:13 +0000 |
---|---|---|
committer | rsesek@chromium.org <rsesek@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-02-15 16:33:13 +0000 |
commit | 7107d9d24e79737ef722239c74a92b962483e199 (patch) | |
tree | fbb64d9c8ab76fd93a5effdbb724967af4a5aa2b | |
parent | 6e8a8a507dda5146e4d1a56fe0a0d7a44d5bdd29 (diff) | |
download | chromium_src-7107d9d24e79737ef722239c74a92b962483e199.zip chromium_src-7107d9d24e79737ef722239c74a92b962483e199.tar.gz chromium_src-7107d9d24e79737ef722239c74a92b962483e199.tar.bz2 |
[Mac] Confirm-to-quit: show the right key combo if it has been remapped.
BUG=65209
TEST=Add a custom keyboard shortcut to override the "Quit Chromium" menu item in System Prefs. Run with --enable-confirm-to-quit. Hit the key combination and the panel now shows the right key combination.
Review URL: http://codereview.chromium.org/6525001
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@74954 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r-- | chrome/app/generated_resources.grd | 2 | ||||
-rw-r--r-- | chrome/app/nibs/ConfirmQuitPanel.xib | 27 | ||||
-rw-r--r-- | chrome/browser/ui/cocoa/confirm_quit_panel_controller.h | 10 | ||||
-rw-r--r-- | chrome/browser/ui/cocoa/confirm_quit_panel_controller.mm | 42 | ||||
-rw-r--r-- | chrome/browser/ui/cocoa/confirm_quit_panel_controller_unittest.mm | 57 |
5 files changed, 133 insertions, 5 deletions
diff --git a/chrome/app/generated_resources.grd b/chrome/app/generated_resources.grd index 4c12985..0f14aeb 100644 --- a/chrome/app/generated_resources.grd +++ b/chrome/app/generated_resources.grd @@ -4678,7 +4678,7 @@ Keep your key file in a safe place. You will need it to create new versions of y <!-- Confirm to quit panel --> <message name="IDS_CONFIRM_TO_QUIT_DESCRIPTION" desc="Instructions for how the user should confirm quitting."> - Hold ⌘Q to Quit. + Hold <ph name="KEY_EQUIVALENT">$1<ex>⌘Q</ex></ph> to Quit. </message> <!-- Importer Lock Dialog --> diff --git a/chrome/app/nibs/ConfirmQuitPanel.xib b/chrome/app/nibs/ConfirmQuitPanel.xib index 4fc4240..a88cc05 100644 --- a/chrome/app/nibs/ConfirmQuitPanel.xib +++ b/chrome/app/nibs/ConfirmQuitPanel.xib @@ -2,10 +2,10 @@ <archive type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="7.10"> <data> <int key="IBDocument.SystemTarget">1050</int> - <string key="IBDocument.SystemVersion">10F2108</string> + <string key="IBDocument.SystemVersion">10J567</string> <string key="IBDocument.InterfaceBuilderVersion">823</string> - <string key="IBDocument.AppKitVersion">1038.29</string> - <string key="IBDocument.HIToolboxVersion">461.00</string> + <string key="IBDocument.AppKitVersion">1038.35</string> + <string key="IBDocument.HIToolboxVersion">462.00</string> <object class="NSMutableDictionary" key="IBDocument.PluginVersions"> <string key="NS.key.0">com.apple.InterfaceBuilder.CocoaPlugin</string> <string key="NS.object.0">823</string> @@ -121,6 +121,14 @@ </object> <int key="connectionID">11</int> </object> + <object class="IBConnectionRecord"> + <object class="IBOutletConnection" key="connection"> + <string key="label">message_</string> + <reference key="source" ref="1001"/> + <reference key="destination" ref="369287154"/> + </object> + <int key="connectionID">12</int> + </object> </object> <object class="IBMutableOrderedSet" key="objectRecords"> <object class="NSArray" key="orderedObjects"> @@ -239,7 +247,7 @@ </object> </object> <nil key="sourceID"/> - <int key="maxID">11</int> + <int key="maxID">12</int> </object> <object class="IBClassDescriber" key="IBDocument.Classes"> <object class="NSMutableArray" key="referencedPartialClassDescriptions"> @@ -266,6 +274,17 @@ <string key="candidateClassName">id</string> </object> </object> + <object class="NSMutableDictionary" key="outlets"> + <string key="NS.key.0">message_</string> + <string key="NS.object.0">NSTextField</string> + </object> + <object class="NSMutableDictionary" key="toOneOutletInfosByName"> + <string key="NS.key.0">message_</string> + <object class="IBToOneOutletInfo" key="NS.object.0"> + <string key="name">message_</string> + <string key="candidateClassName">NSTextField</string> + </object> + </object> <object class="IBClassDescriptionSource" key="sourceIdentifier"> <string key="majorKey">IBProjectSource</string> <string key="minorKey">browser/ui/cocoa/confirm_quit_panel_controller.h</string> diff --git a/chrome/browser/ui/cocoa/confirm_quit_panel_controller.h b/chrome/browser/ui/cocoa/confirm_quit_panel_controller.h index b7201e1..85f52d9 100644 --- a/chrome/browser/ui/cocoa/confirm_quit_panel_controller.h +++ b/chrome/browser/ui/cocoa/confirm_quit_panel_controller.h @@ -2,6 +2,9 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +#ifndef CHROME_BROWSER_UI_COCOA_CONFIRM_QUIT_PANEL_CONTROLLER_H_ +#define CHROME_BROWSER_UI_COCOA_CONFIRM_QUIT_PANEL_CONTROLLER_H_ + #import <Cocoa/Cocoa.h> #import "base/mac/cocoa_protocols.h" @@ -9,6 +12,7 @@ // The ConfirmQuitPanelController manages the black HUD window that tells users // to "Hold Cmd+Q to Quit". @interface ConfirmQuitPanelController : NSWindowController<NSWindowDelegate> { + IBOutlet NSTextField* message_; } // Returns a singleton instance of the Controller. This will create one if it @@ -23,3 +27,9 @@ - (void)dismissPanel; @end + +@interface ConfirmQuitPanelController (UnitTesting) +- (NSString*)keyCombinationForMenuItem:(NSMenuItem*)item; +@end + +#endif // CHROME_BROWSER_UI_COCOA_CONFIRM_QUIT_PANEL_CONTROLLER_H_ diff --git a/chrome/browser/ui/cocoa/confirm_quit_panel_controller.mm b/chrome/browser/ui/cocoa/confirm_quit_panel_controller.mm index 6ad363b..a8fa616 100644 --- a/chrome/browser/ui/cocoa/confirm_quit_panel_controller.mm +++ b/chrome/browser/ui/cocoa/confirm_quit_panel_controller.mm @@ -8,11 +8,15 @@ #include "base/logging.h" #include "base/mac/mac_util.h" #include "base/scoped_nsobject.h" +#include "base/sys_string_conversions.h" #import "chrome/browser/ui/cocoa/confirm_quit_panel_controller.h" +#include "grit/generated_resources.h" +#include "ui/base/l10n/l10n_util_mac.h" @interface ConfirmQuitPanelController (Private) - (id)initInternal; - (void)animateFadeOut; +- (NSString*)keyCommandString; @end ConfirmQuitPanelController* g_confirmQuitPanelController = nil; @@ -39,6 +43,9 @@ ConfirmQuitPanelController* g_confirmQuitPanelController = nil; - (void)awakeFromNib { DCHECK([self window]); DCHECK_EQ(self, [[self window] delegate]); + NSString* message = l10n_util::GetNSStringF(IDS_CONFIRM_TO_QUIT_DESCRIPTION, + base::SysNSStringToUTF16([self keyCommandString])); + [message_ setStringValue:message]; } - (void)windowWillClose:(NSNotification*)notif { @@ -82,4 +89,39 @@ ConfirmQuitPanelController* g_confirmQuitPanelController = nil; [self close]; } +// This looks at the Main Menu and determines what the user has set as the +// key combination for quit. It then gets the modifiers and builds a string +// to display them. +- (NSString*)keyCommandString { + NSMenu* mainMenu = [NSApp mainMenu]; + // Get the application menu (i.e. Chromium). + NSMenu* appMenu = [[mainMenu itemAtIndex:0] submenu]; + for (NSMenuItem* item in [appMenu itemArray]) { + // Find the Quit item. + if ([item action] == @selector(terminate:)) { + return [self keyCombinationForMenuItem:item]; + } + } + // Default to Cmd+Q. + return @"\u2318Q"; +} + +- (NSString*)keyCombinationForMenuItem:(NSMenuItem*)item { + NSMutableString* string = [NSMutableString string]; + NSUInteger modifiers = [item keyEquivalentModifierMask]; + + if (modifiers & NSCommandKeyMask) + [string appendString:@"\u2318"]; + if (modifiers & NSControlKeyMask) + [string appendString:@"\u2303"]; + if (modifiers & NSAlternateKeyMask) + [string appendString:@"\u2325"]; + if (modifiers & NSShiftKeyMask) + [string appendString:@"\u21E7"]; + + [string appendString:[[item keyEquivalent] uppercaseString]]; + + return string; +} + @end diff --git a/chrome/browser/ui/cocoa/confirm_quit_panel_controller_unittest.mm b/chrome/browser/ui/cocoa/confirm_quit_panel_controller_unittest.mm index 0426149..c015ede 100644 --- a/chrome/browser/ui/cocoa/confirm_quit_panel_controller_unittest.mm +++ b/chrome/browser/ui/cocoa/confirm_quit_panel_controller_unittest.mm @@ -4,10 +4,31 @@ #import "chrome/browser/ui/cocoa/cocoa_test_helper.h" #include "chrome/browser/ui/cocoa/confirm_quit_panel_controller.h" +#include "testing/gtest_mac.h" namespace { class ConfirmQuitPanelControllerTest : public CocoaTest { + public: + NSMenuItem* MakeMenuItem(NSString* keyEquivalent, NSUInteger modifiers) { + NSMenuItem* item = [[NSMenuItem alloc] initWithTitle:@"Test" + action:NULL + keyEquivalent:keyEquivalent]; + [item setKeyEquivalentModifierMask:modifiers]; + return [item autorelease]; + } + + NSString* TestString(NSString* str) { + str = [str stringByReplacingOccurrencesOfString:@"{Cmd}" + withString:@"\u2318"]; + str = [str stringByReplacingOccurrencesOfString:@"{Ctrl}" + withString:@"\u2303"]; + str = [str stringByReplacingOccurrencesOfString:@"{Opt}" + withString:@"\u2325"]; + str = [str stringByReplacingOccurrencesOfString:@"{Shift}" + withString:@"\u21E7"]; + return str; + } }; @@ -24,4 +45,40 @@ TEST_F(ConfirmQuitPanelControllerTest, ShowAndDismiss) { EXPECT_EQ(controller, [ConfirmQuitPanelController sharedController]); } +TEST_F(ConfirmQuitPanelControllerTest, KeyCombinationForMenuItem) { + ConfirmQuitPanelController* controller = + [ConfirmQuitPanelController sharedController]; + + NSMenuItem* item = MakeMenuItem(@"q", NSCommandKeyMask); + EXPECT_NSEQ(TestString(@"{Cmd}Q"), + [controller keyCombinationForMenuItem:item]); + + item = MakeMenuItem(@"c", NSCommandKeyMask | NSShiftKeyMask); + EXPECT_NSEQ(TestString(@"{Cmd}{Shift}C"), + [controller keyCombinationForMenuItem:item]); + + item = MakeMenuItem(@"h", + NSCommandKeyMask | NSShiftKeyMask | NSAlternateKeyMask); + EXPECT_NSEQ(TestString(@"{Cmd}{Opt}{Shift}H"), + [controller keyCombinationForMenuItem:item]); + + item = MakeMenuItem(@"r", + NSCommandKeyMask | NSShiftKeyMask | NSAlternateKeyMask | + NSControlKeyMask); + EXPECT_NSEQ(TestString(@"{Cmd}{Ctrl}{Opt}{Shift}R"), + [controller keyCombinationForMenuItem:item]); + + item = MakeMenuItem(@"o", NSControlKeyMask); + EXPECT_NSEQ(TestString(@"{Ctrl}O"), + [controller keyCombinationForMenuItem:item]); + + item = MakeMenuItem(@"m", NSShiftKeyMask | NSControlKeyMask); + EXPECT_NSEQ(TestString(@"{Ctrl}{Shift}M"), + [controller keyCombinationForMenuItem:item]); + + item = MakeMenuItem(@"e", NSCommandKeyMask | NSAlternateKeyMask); + EXPECT_NSEQ(TestString(@"{Cmd}{Opt}E"), + [controller keyCombinationForMenuItem:item]); +} + } // namespace |