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 */ }; |
