From 6455999cca6cdae9ef75dacb7bf29f056cf08b92 Mon Sep 17 00:00:00 2001 From: dpsimons Date: Tue, 8 Jun 2010 16:38:30 +0000 Subject: [PATCH] Implement NSUserKeyEquivalents default for providing custom key equivalents for menu items git-svn-id: svn+ssh://svn.gna.org/svn/gnustep/libs/gui/trunk@30620 72102866-910b-0410-8b05-ffd578937521 --- ChangeLog | 6 ++++++ Source/NSMenuItem.m | 48 ++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 53 insertions(+), 1 deletion(-) diff --git a/ChangeLog b/ChangeLog index ca8bd6f4f..bf8405877 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2010-06-07 Doug Simons + + * Source/NSMenuItem.m: + Implement NSUserKeyEquivalents default for providing custom key + equivalents for menu items based on their title. + 2010-06-05 Nicola Pero * Source/GSWindowDecorationView.m ([-removeSubview:]): Uncommented diff --git a/Source/NSMenuItem.m b/Source/NSMenuItem.m index c6e1478e1..17479d66c 100644 --- a/Source/NSMenuItem.m +++ b/Source/NSMenuItem.m @@ -134,9 +134,9 @@ static Class imageClass; return nil; //_menu = nil; - [self setTitle: aString]; [self setKeyEquivalent: charCode]; _keyEquivalentModifierMask = NSCommandKeyMask; + [self setTitle: aString]; // do this AFTER setKeyEquivalent: in case NSUserKeyEquivalents is defined _mnemonicLocation = 255; // No mnemonic _state = NSOffState; _enabled = YES; @@ -151,6 +151,50 @@ static Class imageClass; return self; } +- (void) _updateKeyEquivalent +{ + // Update keyEquivalent based on any entries in NSUserKeyEquivalents in the defaults database + // TODO: also check in other defaults domains, to allow NSUserKeyEquivalents dictionaries + // in different domains to provide overrides of different menu items. + NSString *userKeyEquivalent = [(NSDictionary*)[[NSUserDefaults standardUserDefaults] + objectForKey: @"NSUserKeyEquivalents"] + objectForKey: _title]; + if (userKeyEquivalent) + { + // check for leading symbols representing modifier flags: @, ~, $, ^ + unsigned int modifierMask = 0; + while ([userKeyEquivalent length] > 1) + { + if ([userKeyEquivalent hasPrefix:@"@"]) + { + modifierMask |= NSCommandKeyMask; + userKeyEquivalent = [userKeyEquivalent substringFromIndex:1]; + } + else if ([userKeyEquivalent hasPrefix:@"~"]) + { + modifierMask |= NSAlternateKeyMask; + userKeyEquivalent = [userKeyEquivalent substringFromIndex:1]; + } + else if ([userKeyEquivalent hasPrefix:@"$"]) + { + modifierMask |= NSShiftKeyMask; + userKeyEquivalent = [userKeyEquivalent substringFromIndex:1]; + } + else if ([userKeyEquivalent hasPrefix:@"^"]) + { + modifierMask |= NSControlKeyMask; + userKeyEquivalent = [userKeyEquivalent substringFromIndex:1]; + } + else + { + break; + } + } + [self setKeyEquivalent:userKeyEquivalent]; + [self setKeyEquivalentModifierMask:modifierMask]; + } +} + - (void) setMenu: (NSMenu*)menu { /* The menu is retaining us. Do not retain it. */ @@ -208,6 +252,7 @@ static Class imageClass; return; // no change ASSIGNCOPY(_title, aString); + [self _updateKeyEquivalent]; [_menu itemChanged: self]; } @@ -710,6 +755,7 @@ static Class imageClass; } } + [self _updateKeyEquivalent]; return self; }