diff options
| -rw-r--r-- | Framework/MASKeyCodes.h | 19 | ||||
| -rw-r--r-- | Framework/MASShortcut.h | 10 | ||||
| -rw-r--r-- | Framework/MASShortcut.m | 82 | ||||
| -rw-r--r-- | Framework/MASShortcutView.h | 2 | ||||
| -rw-r--r-- | Framework/MASShortcutView.m | 4 | ||||
| -rw-r--r-- | Framework/Prefix.pch | 1 | ||||
| -rw-r--r-- | MASShortcut.xcodeproj/project.pbxproj | 7 | 
7 files changed, 70 insertions, 55 deletions
| diff --git a/Framework/MASKeyCodes.h b/Framework/MASKeyCodes.h index 69b2a97..9fb5b02 100644 --- a/Framework/MASKeyCodes.h +++ b/Framework/MASKeyCodes.h @@ -21,3 +21,22 @@ enum {  	kMASShortcutGlyphNorthwestArrow = 0x2196,  	kMASShortcutGlyphSoutheastArrow = 0x2198,  } MASShortcutGlyph; + +NS_INLINE NSString* NSStringFromMASKeyCode(unsigned short ch) +{ +    return [NSString stringWithFormat:@"%C", ch]; +} + +NS_INLINE NSUInteger MASPickCocoaModifiers(NSUInteger flags) +{ +    return (flags & (NSControlKeyMask | NSShiftKeyMask | NSAlternateKeyMask | NSCommandKeyMask)); +} + +NS_INLINE UInt32 MASCarbonModifiersFromCocoaModifiers(NSUInteger cocoaFlags) +{ +    return +          (cocoaFlags & NSCommandKeyMask ? cmdKey : 0) +        | (cocoaFlags & NSAlternateKeyMask ? optionKey : 0) +        | (cocoaFlags & NSControlKeyMask ? controlKey : 0) +        | (cocoaFlags & NSShiftKeyMask ? shiftKey : 0); +} diff --git a/Framework/MASShortcut.h b/Framework/MASShortcut.h index f1e489c..b7ed55c 100644 --- a/Framework/MASShortcut.h +++ b/Framework/MASShortcut.h @@ -1,14 +1,4 @@  #import "MASKeyCodes.h" -#import <AppKit/AppKit.h> - -#define MASShortcutChar(char) [NSString stringWithFormat:@"%C", (unsigned short)(char)] -#define MASShortcutClear(flags) (flags & (NSControlKeyMask | NSShiftKeyMask | NSAlternateKeyMask | NSCommandKeyMask)) -#define MASShortcutCarbonFlags(cocoaFlags) (\ -    (cocoaFlags & NSCommandKeyMask ? cmdKey : 0) | \ -    (cocoaFlags & NSAlternateKeyMask ? optionKey : 0) | \ -    (cocoaFlags & NSControlKeyMask ? controlKey : 0) | \ -    (cocoaFlags & NSShiftKeyMask ? shiftKey : 0)) -  @interface MASShortcut : NSObject <NSSecureCoding> diff --git a/Framework/MASShortcut.m b/Framework/MASShortcut.m index ccc2035..3e1e498 100644 --- a/Framework/MASShortcut.m +++ b/Framework/MASShortcut.m @@ -40,7 +40,7 @@ NSString *const MASShortcutModifierFlags = @"ModifierFlags";      self = [super init];      if (self) {          _keyCode = code; -        _modifierFlags = MASShortcutClear(flags); +        _modifierFlags = MASPickCocoaModifiers(flags);      }      return self;  } @@ -70,7 +70,7 @@ NSString *const MASShortcutModifierFlags = @"ModifierFlags";  - (void)setModifierFlags:(NSUInteger)value  { -    _modifierFlags = MASShortcutClear(value); +    _modifierFlags = MASPickCocoaModifiers(value);  }  - (UInt32)carbonKeyCode @@ -80,7 +80,7 @@ NSString *const MASShortcutModifierFlags = @"ModifierFlags";  - (UInt32)carbonFlags  { -    return MASShortcutCarbonFlags(self.modifierFlags); +    return MASCarbonModifiersFromCocoaModifiers(self.modifierFlags);  }  - (NSString *)description @@ -93,27 +93,27 @@ NSString *const MASShortcutModifierFlags = @"ModifierFlags";      NSString *keyCodeString = self.keyCodeString;      if (keyCodeString.length > 1) {          switch (self.keyCode) { -            case kVK_F1: return MASShortcutChar(0xF704); -            case kVK_F2: return MASShortcutChar(0xF705); -            case kVK_F3: return MASShortcutChar(0xF706); -            case kVK_F4: return MASShortcutChar(0xF707); -            case kVK_F5: return MASShortcutChar(0xF708); -            case kVK_F6: return MASShortcutChar(0xF709); -            case kVK_F7: return MASShortcutChar(0xF70a); -            case kVK_F8: return MASShortcutChar(0xF70b); -            case kVK_F9: return MASShortcutChar(0xF70c); -            case kVK_F10: return MASShortcutChar(0xF70d); -            case kVK_F11: return MASShortcutChar(0xF70e); -            case kVK_F12: return MASShortcutChar(0xF70f); +            case kVK_F1: return NSStringFromMASKeyCode(0xF704); +            case kVK_F2: return NSStringFromMASKeyCode(0xF705); +            case kVK_F3: return NSStringFromMASKeyCode(0xF706); +            case kVK_F4: return NSStringFromMASKeyCode(0xF707); +            case kVK_F5: return NSStringFromMASKeyCode(0xF708); +            case kVK_F6: return NSStringFromMASKeyCode(0xF709); +            case kVK_F7: return NSStringFromMASKeyCode(0xF70a); +            case kVK_F8: return NSStringFromMASKeyCode(0xF70b); +            case kVK_F9: return NSStringFromMASKeyCode(0xF70c); +            case kVK_F10: return NSStringFromMASKeyCode(0xF70d); +            case kVK_F11: return NSStringFromMASKeyCode(0xF70e); +            case kVK_F12: return NSStringFromMASKeyCode(0xF70f);              // From this point down I am guessing F13 etc come sequentially, I don't have a keyboard to test. -            case kVK_F13: return MASShortcutChar(0xF710); -            case kVK_F14: return MASShortcutChar(0xF711); -            case kVK_F15: return MASShortcutChar(0xF712); -            case kVK_F16: return MASShortcutChar(0xF713); -            case kVK_F17: return MASShortcutChar(0xF714); -            case kVK_F18: return MASShortcutChar(0xF715); -            case kVK_F19: return MASShortcutChar(0xF716); -            case kVK_Space: return MASShortcutChar(0x20); +            case kVK_F13: return NSStringFromMASKeyCode(0xF710); +            case kVK_F14: return NSStringFromMASKeyCode(0xF711); +            case kVK_F15: return NSStringFromMASKeyCode(0xF712); +            case kVK_F16: return NSStringFromMASKeyCode(0xF713); +            case kVK_F17: return NSStringFromMASKeyCode(0xF714); +            case kVK_F18: return NSStringFromMASKeyCode(0xF715); +            case kVK_F19: return NSStringFromMASKeyCode(0xF716); +            case kVK_Space: return NSStringFromMASKeyCode(0x20);              default: return @"";          }      } @@ -145,18 +145,18 @@ NSString *const MASShortcutModifierFlags = @"ModifierFlags";          case kVK_F18: return @"F18";          case kVK_F19: return @"F19";          case kVK_Space: return NSLocalizedString(@"Space", @"Shortcut glyph name for SPACE key"); -        case kVK_Escape: return MASShortcutChar(kMASShortcutGlyphEscape); -        case kVK_Delete: return MASShortcutChar(kMASShortcutGlyphDeleteLeft); -        case kVK_ForwardDelete: return MASShortcutChar(kMASShortcutGlyphDeleteRight); -        case kVK_LeftArrow: return MASShortcutChar(kMASShortcutGlyphLeftArrow); -        case kVK_RightArrow: return MASShortcutChar(kMASShortcutGlyphRightArrow); -        case kVK_UpArrow: return MASShortcutChar(kMASShortcutGlyphUpArrow); -        case kVK_DownArrow: return MASShortcutChar(kMASShortcutGlyphDownArrow); -        case kVK_Help: return MASShortcutChar(kMASShortcutGlyphHelp); -        case kVK_PageUp: return MASShortcutChar(kMASShortcutGlyphPageUp); -        case kVK_PageDown: return MASShortcutChar(kMASShortcutGlyphPageDown); -        case kVK_Tab: return MASShortcutChar(kMASShortcutGlyphTabRight); -        case kVK_Return: return MASShortcutChar(kMASShortcutGlyphReturnR2L); +        case kVK_Escape: return NSStringFromMASKeyCode(kMASShortcutGlyphEscape); +        case kVK_Delete: return NSStringFromMASKeyCode(kMASShortcutGlyphDeleteLeft); +        case kVK_ForwardDelete: return NSStringFromMASKeyCode(kMASShortcutGlyphDeleteRight); +        case kVK_LeftArrow: return NSStringFromMASKeyCode(kMASShortcutGlyphLeftArrow); +        case kVK_RightArrow: return NSStringFromMASKeyCode(kMASShortcutGlyphRightArrow); +        case kVK_UpArrow: return NSStringFromMASKeyCode(kMASShortcutGlyphUpArrow); +        case kVK_DownArrow: return NSStringFromMASKeyCode(kMASShortcutGlyphDownArrow); +        case kVK_Help: return NSStringFromMASKeyCode(kMASShortcutGlyphHelp); +        case kVK_PageUp: return NSStringFromMASKeyCode(kMASShortcutGlyphPageUp); +        case kVK_PageDown: return NSStringFromMASKeyCode(kMASShortcutGlyphPageDown); +        case kVK_Tab: return NSStringFromMASKeyCode(kMASShortcutGlyphTabRight); +        case kVK_Return: return NSStringFromMASKeyCode(kMASShortcutGlyphReturnR2L);          // Keypad          case kVK_ANSI_Keypad0: return @"0"; @@ -172,15 +172,15 @@ NSString *const MASShortcutModifierFlags = @"ModifierFlags";          case kVK_ANSI_KeypadDecimal: return @".";          case kVK_ANSI_KeypadMultiply: return @"*";          case kVK_ANSI_KeypadPlus: return @"+"; -        case kVK_ANSI_KeypadClear: return MASShortcutChar(kMASShortcutGlyphPadClear); +        case kVK_ANSI_KeypadClear: return NSStringFromMASKeyCode(kMASShortcutGlyphPadClear);          case kVK_ANSI_KeypadDivide: return @"/"; -        case kVK_ANSI_KeypadEnter: return MASShortcutChar(kMASShortcutGlyphReturn); +        case kVK_ANSI_KeypadEnter: return NSStringFromMASKeyCode(kMASShortcutGlyphReturn);          case kVK_ANSI_KeypadMinus: return @"–";          case kVK_ANSI_KeypadEquals: return @"=";          // Hardcode -        case 119: return MASShortcutChar(kMASShortcutGlyphSoutheastArrow); -        case 115: return MASShortcutChar(kMASShortcutGlyphNorthwestArrow); +        case 119: return NSStringFromMASKeyCode(kMASShortcutGlyphSoutheastArrow); +        case 115: return NSStringFromMASKeyCode(kMASShortcutGlyphNorthwestArrow);      }      // Everything else should be printable so look it up in the current keyboard @@ -294,13 +294,13 @@ BOOL MASShortcutAllowsAnyHotkeyWithOptionModifier = NO;      for (NSMenuItem *menuItem in menu.itemArray) {          if (menuItem.hasSubmenu && [self isKeyEquivalent:keyEquivalent flags:flags takenInMenu:menuItem.submenu error:outError]) return YES; -        BOOL equalFlags = (MASShortcutClear(menuItem.keyEquivalentModifierMask) == flags); +        BOOL equalFlags = (MASPickCocoaModifiers(menuItem.keyEquivalentModifierMask) == flags);          BOOL equalHotkeyLowercase = [menuItem.keyEquivalent.lowercaseString isEqualToString:keyEquivalent];          // Check if the cases are different, we know ours is lower and that shift is included in our modifiers          // If theirs is capitol, we need to add shift to their modifiers          if (equalHotkeyLowercase && ![menuItem.keyEquivalent isEqualToString:keyEquivalent]) { -            equalFlags = (MASShortcutClear(menuItem.keyEquivalentModifierMask | NSShiftKeyMask) == flags); +            equalFlags = (MASPickCocoaModifiers(menuItem.keyEquivalentModifierMask | NSShiftKeyMask) == flags);          }          if (equalFlags && equalHotkeyLowercase) { diff --git a/Framework/MASShortcutView.h b/Framework/MASShortcutView.h index c8a46bb..9f94bf5 100644 --- a/Framework/MASShortcutView.h +++ b/Framework/MASShortcutView.h @@ -1,5 +1,3 @@ -#import <AppKit/AppKit.h> -  @class MASShortcut;  typedef enum { diff --git a/Framework/MASShortcutView.m b/Framework/MASShortcutView.m index dd75729..0212271 100644 --- a/Framework/MASShortcutView.m +++ b/Framework/MASShortcutView.m @@ -192,7 +192,7 @@  - (void)drawRect:(CGRect)dirtyRect  {      if (self.shortcutValue) { -        [self drawInRect:self.bounds withTitle:MASShortcutChar(self.recording ? kMASShortcutGlyphEscape : kMASShortcutGlyphDeleteLeft) +        [self drawInRect:self.bounds withTitle:NSStringFromMASKeyCode(self.recording ? kMASShortcutGlyphEscape : kMASShortcutGlyphDeleteLeft)                 alignment:NSRightTextAlignment state:NSOffState];          CGRect shortcutRect; @@ -209,7 +209,7 @@      else {          if (self.recording)          { -            [self drawInRect:self.bounds withTitle:MASShortcutChar(kMASShortcutGlyphEscape) alignment:NSRightTextAlignment state:NSOffState]; +            [self drawInRect:self.bounds withTitle:NSStringFromMASKeyCode(kMASShortcutGlyphEscape) alignment:NSRightTextAlignment state:NSOffState];              CGRect shortcutRect;              [self getShortcutRect:&shortcutRect hintRect:NULL]; diff --git a/Framework/Prefix.pch b/Framework/Prefix.pch new file mode 100644 index 0000000..7f2c544 --- /dev/null +++ b/Framework/Prefix.pch @@ -0,0 +1 @@ +#import <AppKit/AppKit.h> diff --git a/MASShortcut.xcodeproj/project.pbxproj b/MASShortcut.xcodeproj/project.pbxproj index b55ace6..ece9dbf 100644 --- a/MASShortcut.xcodeproj/project.pbxproj +++ b/MASShortcut.xcodeproj/project.pbxproj @@ -29,6 +29,7 @@  		0D827D9419910B740010B8EF /* MASShortcutTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 0D827D9319910B740010B8EF /* MASShortcutTests.m */; };  		0D827D9519910C1E0010B8EF /* MASShortcut.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0D827CD31990D4420010B8EF /* MASShortcut.framework */; };  		0D827D9719910FF70010B8EF /* MASKeyCodes.h in Headers */ = {isa = PBXBuildFile; fileRef = 0D827D9619910FF70010B8EF /* MASKeyCodes.h */; }; +		0D827D99199110F60010B8EF /* Prefix.pch in Headers */ = {isa = PBXBuildFile; fileRef = 0D827D98199110F60010B8EF /* Prefix.pch */; };  /* End PBXBuildFile section */  /* Begin PBXContainerItemProxy section */ @@ -86,6 +87,7 @@  		0D827D8D19910AFF0010B8EF /* Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = Prefix.pch; sourceTree = "<group>"; };  		0D827D9319910B740010B8EF /* MASShortcutTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = MASShortcutTests.m; path = Framework/MASShortcutTests.m; sourceTree = "<group>"; };  		0D827D9619910FF70010B8EF /* MASKeyCodes.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = MASKeyCodes.h; path = Framework/MASKeyCodes.h; sourceTree = "<group>"; }; +		0D827D98199110F60010B8EF /* Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Prefix.pch; path = Framework/Prefix.pch; sourceTree = "<group>"; };  /* End PBXFileReference section */  /* Begin PBXFrameworksBuildPhase section */ @@ -167,6 +169,7 @@  				0D827D231990D55E0010B8EF /* MASShortcutView+UserDefaults.h */,  				0D827D241990D55E0010B8EF /* MASShortcutView+UserDefaults.m */,  				0D827D2F1990D5640010B8EF /* Info.plist */, +				0D827D98199110F60010B8EF /* Prefix.pch */,  				0D827D761990F81E0010B8EF /* Shortcut.h */,  			);  			name = Framework; @@ -203,6 +206,7 @@  			buildActionMask = 2147483647;  			files = (  				0D827D2B1990D55E0010B8EF /* MASShortcutView.h in Headers */, +				0D827D99199110F60010B8EF /* Prefix.pch in Headers */,  				0D827D9719910FF70010B8EF /* MASKeyCodes.h in Headers */,  				0D827D251990D55E0010B8EF /* MASShortcut.h in Headers */,  				0D827D2D1990D55E0010B8EF /* MASShortcutView+UserDefaults.h in Headers */, @@ -447,6 +451,7 @@  				DYLIB_CURRENT_VERSION = 1;  				FRAMEWORK_VERSION = A;  				GCC_PRECOMPILE_PREFIX_HEADER = YES; +				GCC_PREFIX_HEADER = Framework/Prefix.pch;  				INFOPLIST_FILE = Framework/Info.plist;  				INSTALL_PATH = "@executable_path/../Frameworks";  				PRODUCT_NAME = "$(TARGET_NAME)"; @@ -463,6 +468,7 @@  				DYLIB_CURRENT_VERSION = 1;  				FRAMEWORK_VERSION = A;  				GCC_PRECOMPILE_PREFIX_HEADER = YES; +				GCC_PREFIX_HEADER = Framework/Prefix.pch;  				INFOPLIST_FILE = Framework/Info.plist;  				INSTALL_PATH = "@executable_path/../Frameworks";  				PRODUCT_NAME = "$(TARGET_NAME)"; @@ -572,6 +578,7 @@  				0D827D9119910AFF0010B8EF /* Release */,  			);  			defaultConfigurationIsVisible = 0; +			defaultConfigurationName = Release;  		};  /* End XCConfigurationList section */  	}; | 
