summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorrsesek@chromium.org <rsesek@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-02-15 16:33:13 +0000
committerrsesek@chromium.org <rsesek@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-02-15 16:33:13 +0000
commit7107d9d24e79737ef722239c74a92b962483e199 (patch)
treefbb64d9c8ab76fd93a5effdbb724967af4a5aa2b
parent6e8a8a507dda5146e4d1a56fe0a0d7a44d5bdd29 (diff)
downloadchromium_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.grd2
-rw-r--r--chrome/app/nibs/ConfirmQuitPanel.xib27
-rw-r--r--chrome/browser/ui/cocoa/confirm_quit_panel_controller.h10
-rw-r--r--chrome/browser/ui/cocoa/confirm_quit_panel_controller.mm42
-rw-r--r--chrome/browser/ui/cocoa/confirm_quit_panel_controller_unittest.mm57
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