Initial commit

This commit is contained in:
Julian-Marius-Fairfax
2020-04-01 00:06:29 +02:00
commit 24ffd8a991
931 changed files with 185516 additions and 0 deletions

View File

@@ -0,0 +1 @@
Versions/Current/Headers

View File

@@ -0,0 +1 @@
Versions/Current/PTHotKey

View File

@@ -0,0 +1 @@
Versions/Current/Resources

View File

@@ -0,0 +1,52 @@
//
// PTHotKey.h
// Protein
//
// Created by Quentin Carnicelli on Sat Aug 02 2003.
// Copyright (c) 2003 Quentin D. Carnicelli. All rights reserved.
//
// Contributors:
// Andy Kim
#import <Foundation/Foundation.h>
#import <Carbon/Carbon.h>
#import "PTKeyCombo.h"
@interface PTHotKey : NSObject
{
NSString* mIdentifier;
NSString* mName;
PTKeyCombo* mKeyCombo;
id mTarget;
SEL mAction;
UInt32 mCarbonHotKeyID;
EventHotKeyRef mCarbonEventHotKeyRef;
}
- (id)initWithIdentifier: (id)identifier keyCombo: (PTKeyCombo*)combo;
- (id)init;
- (void)setIdentifier: (id)ident;
- (id)identifier;
- (void)setName: (NSString*)name;
- (NSString*)name;
- (void)setKeyCombo: (PTKeyCombo*)combo;
- (PTKeyCombo*)keyCombo;
- (void)setTarget: (id)target;
- (id)target;
- (void)setAction: (SEL)action;
- (SEL)action;
- (UInt32)carbonHotKeyID;
- (void)setCarbonHotKeyID: (UInt32)hotKeyID;
- (EventHotKeyRef)carbonEventHotKeyRef;
- (void)setCarbonEventHotKeyRef:(EventHotKeyRef)hotKeyRef;
- (void)invoke;
@end

View File

@@ -0,0 +1,44 @@
//
// PTHotKeyCenter.h
// Protein
//
// Created by Quentin Carnicelli on Sat Aug 02 2003.
// Copyright (c) 2003 Quentin D. Carnicelli. All rights reserved.
//
// Contributors:
// Quentin D. Carnicelli
// Finlay Dobbie
// Vincent Pottier
// Andy Kim
#import <Cocoa/Cocoa.h>
#import <Carbon/Carbon.h>
@class PTHotKey;
@interface PTHotKeyCenter : NSObject
{
NSMutableDictionary* mHotKeys; //Keys are carbon hot key IDs
BOOL mEventHandlerInstalled;
UInt32 mHotKeyCount; // Used to assign new hot key ID
BOOL mIsPaused;
EventHandlerRef mEventHandler;
}
+ (PTHotKeyCenter *)sharedCenter;
- (BOOL)registerHotKey: (PTHotKey*)hotKey;
- (void)unregisterHotKey: (PTHotKey*)hotKey;
- (NSArray*)allHotKeys;
- (PTHotKey*)hotKeyWithIdentifier: (id)ident;
- (void)sendEvent: (NSEvent*)event;
- (void)pause;
- (void)resume;
- (BOOL)isPaused;
@end

View File

@@ -0,0 +1,26 @@
//
// PTKeyCodeTranslator.h
// Chercher
//
// Created by Finlay Dobbie on Sat Oct 11 2003.
// Copyright (c) 2003 Cliché Software. All rights reserved.
//
#import <Carbon/Carbon.h>
@interface PTKeyCodeTranslator : NSObject
{
TISInputSourceRef keyboardLayout;
const UCKeyboardLayout *uchrData;
UInt32 keyTranslateState;
UInt32 deadKeyState;
}
+ (id)currentTranslator;
- (id)initWithKeyboardLayout:(TISInputSourceRef)aLayout;
- (NSString *)translateKeyCode:(short)keyCode;
- (TISInputSourceRef)keyboardLayout;
@end

View File

@@ -0,0 +1,38 @@
//
// PTKeyCombo.h
// Protein
//
// Created by Quentin Carnicelli on Sat Aug 02 2003.
// Copyright (c) 2003 Quentin D. Carnicelli. All rights reserved.
//
#import <Cocoa/Cocoa.h>
@interface PTKeyCombo : NSObject <NSCopying>
{
NSInteger mKeyCode;
NSUInteger mModifiers;
}
+ (id)clearKeyCombo;
+ (id)keyComboWithKeyCode: (NSInteger)keyCode modifiers: (NSUInteger)modifiers;
- (id)initWithKeyCode: (NSInteger)keyCode modifiers: (NSUInteger)modifiers;
- (id)initWithPlistRepresentation: (id)plist;
- (id)plistRepresentation;
- (BOOL)isEqual: (PTKeyCombo*)combo;
- (NSInteger)keyCode;
- (NSUInteger)modifiers;
- (BOOL)isClearCombo;
- (BOOL)isValidHotKeyCombo;
@end
@interface PTKeyCombo (UserDisplayAdditions)
- (NSString*)keyCodeString;
- (NSUInteger)modifierMask;
@end

View File

@@ -0,0 +1,36 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>BuildMachineOSBuild</key>
<string>11G63b</string>
<key>CFBundleDevelopmentRegion</key>
<string>English</string>
<key>CFBundleExecutable</key>
<string>PTHotKey</string>
<key>CFBundleIdentifier</key>
<string>com.kulakov.PTHotKey</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundlePackageType</key>
<string>FMWK</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleVersion</key>
<string>2.0</string>
<key>DTCompiler</key>
<string></string>
<key>DTPlatformBuild</key>
<string>4G2008a</string>
<key>DTPlatformVersion</key>
<string>GM</string>
<key>DTSDKBuild</key>
<string>12C37</string>
<key>DTSDKName</key>
<string>macosx10.8</string>
<key>DTXcode</key>
<string>0452</string>
<key>DTXcodeBuild</key>
<string>4G2008a</string>
</dict>
</plist>

View File

@@ -0,0 +1,131 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>files</key>
<dict>
<key>Resources/Info.plist</key>
<data>
KAlVmLjRawatocesuOKshOjbeoY=
</data>
</dict>
<key>files2</key>
<dict>
<key>Headers/PTHotKey.h</key>
<data>
2L1jddThAYyZqth0XaCZxyX+nRU=
</data>
<key>Headers/PTHotKeyCenter.h</key>
<data>
jy8+von9mAuccSclPr4UGMBFxCc=
</data>
<key>Headers/PTKeyCodeTranslator.h</key>
<data>
KqsYBW/pDRQIbKg3whyIfIkHCio=
</data>
<key>Headers/PTKeyCombo.h</key>
<data>
gVK2rqlzbkMMltt0V0JMMp9wK94=
</data>
<key>Resources/Info.plist</key>
<data>
KAlVmLjRawatocesuOKshOjbeoY=
</data>
</dict>
<key>rules</key>
<dict>
<key>^Resources/</key>
<true/>
<key>^Resources/.*\.lproj/</key>
<dict>
<key>optional</key>
<true/>
<key>weight</key>
<real>1000</real>
</dict>
<key>^Resources/.*\.lproj/locversion.plist$</key>
<dict>
<key>omit</key>
<true/>
<key>weight</key>
<real>1100</real>
</dict>
<key>^version.plist$</key>
<true/>
</dict>
<key>rules2</key>
<dict>
<key>.*\.dSYM($|/)</key>
<dict>
<key>weight</key>
<real>11</real>
</dict>
<key>^(.*/)?\.DS_Store$</key>
<dict>
<key>omit</key>
<true/>
<key>weight</key>
<real>2000</real>
</dict>
<key>^(Frameworks|SharedFrameworks|PlugIns|Plug-ins|XPCServices|Helpers|MacOS|Library/(Automator|Spotlight|LoginItems))/</key>
<dict>
<key>nested</key>
<true/>
<key>weight</key>
<real>10</real>
</dict>
<key>^.*</key>
<true/>
<key>^Info\.plist$</key>
<dict>
<key>omit</key>
<true/>
<key>weight</key>
<real>20</real>
</dict>
<key>^PkgInfo$</key>
<dict>
<key>omit</key>
<true/>
<key>weight</key>
<real>20</real>
</dict>
<key>^Resources/</key>
<dict>
<key>weight</key>
<real>20</real>
</dict>
<key>^Resources/.*\.lproj/</key>
<dict>
<key>optional</key>
<true/>
<key>weight</key>
<real>1000</real>
</dict>
<key>^Resources/.*\.lproj/locversion.plist$</key>
<dict>
<key>omit</key>
<true/>
<key>weight</key>
<real>1100</real>
</dict>
<key>^[^/]+$</key>
<dict>
<key>nested</key>
<true/>
<key>weight</key>
<real>10</real>
</dict>
<key>^embedded\.provisionprofile$</key>
<dict>
<key>weight</key>
<real>20</real>
</dict>
<key>^version\.plist$</key>
<dict>
<key>weight</key>
<real>20</real>
</dict>
</dict>
</dict>
</plist>

View File

@@ -0,0 +1 @@
Versions/Current/Headers

View File

@@ -0,0 +1 @@
Versions/Current/Resources

View File

@@ -0,0 +1 @@
Versions/Current/ShortcutRecorder

View File

@@ -0,0 +1,111 @@
//
// SRCommon.h
// ShortcutRecorder
//
// Copyright 2006-2012 Contributors. All rights reserved.
//
// License: BSD
//
// Contributors:
// David Dauer
// Jesper
// Jamie Kirkpatrick
// Andy Kim
// Ilya Kulakov
#import <Cocoa/Cocoa.h>
#import <Carbon/Carbon.h>
/*!
@brief Mask representing subset of Cocoa modifier flags suitable for shortcuts.
*/
static const NSUInteger SRCocoaModifierFlagsMask = NSCommandKeyMask | NSAlternateKeyMask | NSShiftKeyMask | NSControlKeyMask;
/*!
@brief Mask representing subset of Carbon modifier flags suitable for shortcuts.
*/
static const NSUInteger SRCarbonModifierFlagsMask = cmdKey | optionKey | shiftKey | controlKey;
/*!
@brief Converts carbon modifier flags to cocoa.
*/
FOUNDATION_STATIC_INLINE NSUInteger SRCarbonToCocoaFlags(NSUInteger aCarbonFlags)
{
NSUInteger cocoaFlags = 0;
if (aCarbonFlags & cmdKey)
cocoaFlags |= NSCommandKeyMask;
if (aCarbonFlags & optionKey)
cocoaFlags |= NSAlternateKeyMask;
if (aCarbonFlags & controlKey)
cocoaFlags |= NSControlKeyMask;
if (aCarbonFlags & shiftKey)
cocoaFlags |= NSShiftKeyMask;
return cocoaFlags;
}
/*!
@brief Converts cocoa modifier flags to carbon.
*/
FOUNDATION_STATIC_INLINE NSUInteger SRCocoaToCarbonFlags(NSUInteger aCocoaFlags)
{
NSUInteger carbonFlags = 0;
if (aCocoaFlags & NSCommandKeyMask)
carbonFlags |= cmdKey;
if (aCocoaFlags & NSAlternateKeyMask)
carbonFlags |= optionKey;
if (aCocoaFlags & NSControlKeyMask)
carbonFlags |= controlKey;
if (aCocoaFlags & NSShiftKeyMask)
carbonFlags |= shiftKey;
return carbonFlags;
}
/*!
@brief Convenient method to get localized string from the framework bundle.
*/
FOUNDATION_STATIC_INLINE NSString *SRLoc(NSString *aKey)
{
return NSLocalizedStringFromTableInBundle(aKey,
@"ShortcutRecorder",
[NSBundle bundleWithIdentifier:@"com.kulakov.ShortcutRecorder"],
nil);
}
/*!
@brief Convenient method to get image from the framework bundle.
*/
FOUNDATION_STATIC_INLINE NSImage *SRImage(NSString *anImageName)
{
NSBundle *b = [NSBundle bundleWithIdentifier:@"com.kulakov.ShortcutRecorder"];
if (floor(NSAppKitVersionNumber) <= NSAppKitVersionNumber10_6)
return [[NSImage alloc] initByReferencingURL:[b URLForImageResource:anImageName]];
else
return [b imageForResource:anImageName];
}
/*!
@brief Returns string representation of shortcut with modifier flags replaced with their localized
readable equivalents (e.g. ? -> Option).
*/
NSString *SRReadableStringForCocoaModifierFlagsAndKeyCode(NSUInteger aModifierFlags, NSInteger aKeyCode);
/*!
@brief Returns string representation of shortcut with modifier flags replaced with their localized
readable equivalents (e.g. ? -> Option) and ASCII character for key code.
*/
NSString *SRReadableASCIIStringForCocoaModifierFlagsAndKeyCode(NSUInteger aModifierFlags, NSInteger aKeyCode);

View File

@@ -0,0 +1,106 @@
//
// SRKeyCodeTransformer.h
// ShortcutRecorder
//
// Copyright 2006-2012 Contributors. All rights reserved.
//
// License: BSD
//
// Contributors:
// David Dauer
// Jesper
// Jamie Kirkpatrick
// Ilya Kulakov
// Silvio Rizzi
#import <Cocoa/Cocoa.h>
#import <Carbon/Carbon.h>
/*!
@brief Transforms key code into unicode character.
*/
@interface SRKeyCodeTransformer : NSValueTransformer
/*!
@brief Returns initialized key code transformer.
@param aUsesASCII Determines whether transformer uses only ASCII capable keyboard input source.
@param aUsesPlainStrings Determines whether key codes without readable glyphs (e.g. F1...F19) are transformed to
to unicode characters (NSF1FunctionKey...NSF19FunctionKey) suitable for setting key equivalents
of Cocoa controls or to plain strings (@"F1"...@"F19") suitable for drawing, logging and accessibility.
@discussion This method is the designated initializer for SRKeyCodeTransformer.
*/
- (instancetype)initWithASCIICapableKeyboardInputSource:(BOOL)aUsesASCII plainStrings:(BOOL)aUsesPlainStrings;
/*!
@brief Determines whether transformer uses ASCII capable keyboard input source.
*/
@property (readonly) BOOL usesASCIICapableKeyboardInputSource;
/*!
@brief Determines whether key codes without readable glyphs are transformed to unicode characters or to plain strings.
*/
@property (readonly) BOOL usesPlainStrings;
/*!
@brief Returns the shared transformer.
*/
+ (instancetype)sharedTransformer;
/*!
@brief Returns the shared transformer configured to use only ASCII capable keyboard input source.
*/
+ (instancetype)sharedASCIITransformer;
/*!
@brief Returns the shared transformer configured to transform key codes to plain strings.
*/
+ (SRKeyCodeTransformer *)sharedPlainTransformer;
/*!
@brief Returns the shared transformer configured to use only ASCII capable keyboard input source
and to transform key codes to plain strings.
*/
+ (SRKeyCodeTransformer *)sharedPlainASCIITransformer;
/*!
@brief Returns mapping from special key codes to unicode characters.
*/
+ (NSDictionary *)specialKeyCodesToUnicodeCharactersMapping;
/*!
@brief Returns mapping from special key codes to plain strings.
*/
+ (NSDictionary *)specialKeyCodesToPlainStringsMapping;
@end
/*!
@brief These constants represents unicode characters for key codes that do not have appropriate constants
in Carbon or Cocoa.
*/
unichar SRKeyCodeGlyph; enum
{
SRKeyCodeGlyphRight = 0x21E5,
SRKeyCodeGlyphReturn = 0x2305,
SRKeyCodeGlyphReturnR2L = 0x21A9,
SRKeyCodeGlyphDeleteLeft = 0x232B,
SRKeyCodeGlyphDeleteRight = 0x2326,
SRKeyCodeGlyphPadClear = 0x2327,
SRKeyCodeGlyphLeftArrow = 0x2190,
SRKeyCodeGlyphRightArrow = 0x2192,
SRKeyCodeGlyphUpArrow = 0x2191,
SRKeyCodeGlyphDownArrow = 0x2193,
SRKeyCodeGlyphPageDown = 0x21DF,
SRKeyCodeGlyphPageUp = 0x21DE,
SRKeyCodeGlyphNorthwestArrow = 0x2196,
SRKeyCodeGlyphSoutheastArrow = 0x2198,
SRKeyCodeGlyphEscape = 0x238B,
SRKeyCodeGlyphHelp = 0x003F,
SRKeyCodeGlyphSpace = 0x23B5,
};

View File

@@ -0,0 +1,37 @@
//
// SRModifierFlagsTransformer.h
// ShortcutRecorder
//
// Copyright 2006-2012 Contributors. All rights reserved.
//
// License: BSD
//
// Contributors:
// Ilya Kulakov
#import <Cocoa/Cocoa.h>
/*!
@brief Transforms mask of Cocoa modifier flags to string of unicode characters.
*/
@interface SRModifierFlagsTransformer : NSValueTransformer
- (instancetype)initWithPlainStrings:(BOOL)aUsesPlainStrings;
/*!
@brief Determines whether modifier flags are transformed to unicode characters or to plain strings.
*/
@property (readonly) BOOL usesPlainStrings;
/*!
@brief Returns the shared transformer.
*/
+ (instancetype)sharedTransformer;
/*!
@brief Returns the shared plain transformer.
*/
+ (instancetype)sharedPlainTransformer;
@end

View File

@@ -0,0 +1,202 @@
//
// SRRecorderControl.h
// ShortcutRecorder
//
// Copyright 2006-2012 Contributors. All rights reserved.
//
// License: BSD
//
// Contributors:
// David Dauer
// Jesper
// Jamie Kirkpatrick
// Ilya Kulakov
#import <Cocoa/Cocoa.h>
#import <ShortcutRecorder/SRCommon.h>
/*!
@brief Key code.
@discussion NSNumber representation of unsigned short.
Required key of SRRecorderControl's objectValue.
*/
extern NSString *const SRShortcutKeyCode;
/*!
@brief Modifier flags.
@discussion NSNumber representation of NSUInteger.
Optional key of SRRecorderControl's objectValue.
*/
extern NSString *const SRShortcutModifierFlagsKey;
/*!
@brief Interpretation of key code and modifier flags depending on system locale and input source
used when shortcut was taken.
@discussion NSString.
Optional key of SRRecorderControl's objectValue.
*/
extern NSString *const SRShortcutCharacters;
/*!
@brief Interpretation of key code without modifier flags depending on system locale and input source
used when shortcut was taken.
@discussion NSString.
Optional key of SRRecorderControl's objectValue.
*/
extern NSString *const SRShortcutCharactersIgnoringModifiers;
@protocol SRRecorderControlDelegate;
/*!
@brief An SRRecorderControl object is a control (but not a subclass of NSControl) that allows you to record shortcuts.
*/
@interface SRRecorderControl : NSView /* <NSToolTipOwner> */
/*!
@brief The receivers delegate.
@discussion A recorder control delegate responds to editing-related messages. You can use to to prevent editing
in some cases or to validate typed shortcuts.
*/
@property (assign) IBOutlet NSObject<SRRecorderControlDelegate> *delegate;
/*!
@brief Returns an integer bit field indicating allowed modifier flags.
@discussion Defaults to SRCocoaModifierFlagsMask.
*/
@property (readonly) NSUInteger allowedModifierFlags;
/*!
@brief Returns an integer bit field indicating required modifier flags.
@discussion Defaults to 0.
*/
@property (readonly) NSUInteger requiredModifierFlags;
/*!
@brief Determines whether shortcuts without modifier flags are allowed.
@discussion Defaults to NO.
*/
@property (readonly) BOOL allowsEmptyModifierFlags;
/*!
@brief Determines whether the control reinterpret key code and modifier flags
using ASCII capable input source.
@discussion Defaults to YES.
If not set, the same key code may be draw differently depending on current input source.
E.g. with US English input source key code 0x0 is interpreted as "a",
however with Russian input source, it's interpreted as "ф".
*/
@property BOOL drawsASCIIEquivalentOfShortcut;
/*!
@brief Determines whether Escape is used to cancel recording.
@discussion Defaults to YES.
If set, Escape without modifier flags cannot be recorded as shortcut.
*/
@property BOOL allowsEscapeToCancelRecording;
/*!
@brief Determines whether delete (or forward delete) is used to remove current shortcut and end recording.
@discussion Defaults to YES.
If set, neither Delete nor Forward Delete without modifier flags can be recorded as shortcut.
*/
@property BOOL allowsDeleteToClearShortcutAndEndRecording;
/*!
@brief Determines whether recording is in process.
*/
@property (readonly) BOOL isRecording;
/*!
@brief Returns dictionary representation of receiver's shortcut.
*/
@property (nonatomic, copy) NSDictionary *objectValue;
/*!
@brief Configures recording behavior of the control.
@param newAllowedModifierFlags New allowed modifier flags.
@param newRequiredModifierFlags New required modifier flags.
@param newAllowsEmptyModifierFlags Determines whether empty modifier flags are allowed.
@discussion Flags are filtered using SRCocoaModifierFlagsMask. Flags does not affect object values set manually.
Throws NSInvalidArgumentException if either required flags are not allowed
or required flags are not empty and no modifier flags are allowed.
*/
- (void)setAllowedModifierFlags:(NSUInteger)newAllowedModifierFlags
requiredModifierFlags:(NSUInteger)newRequiredModifierFlags
allowsEmptyModifierFlags:(BOOL)newAllowsEmptyModifierFlags;
- (BOOL)beginRecording;
- (void)endRecording;
- (void)clearAndEndRecording;
- (BOOL)areModifierFlagsValid:(NSUInteger)aModifierFlags;
- (NSBezierPath *)controlShape;
- (NSRect)enclosingLabelRect;
- (NSRect)rectForLabel:(NSString *)aLabel withAttributes:(NSDictionary *)anAttributes;
- (NSRect)snapBackButtonRect;
- (NSRect)clearButtonRect;
- (NSString *)label;
- (NSString *)plainLabel;
- (NSDictionary *)labelAttributes;
- (void)drawBackground:(NSRect)aDirtyRect;
- (void)drawInterior:(NSRect)aDirtyRect;
- (void)drawLabel:(NSRect)aDirtyRect;
- (void)drawSnapBackButton:(NSRect)aDirtyRect;
- (void)drawClearButton:(NSRect)aDirtyRect;
- (BOOL)isMainButtonHighlighted;
- (BOOL)isSnapBackButtonHighlighted;
- (BOOL)isClearButtonHighlighted;
@end
@protocol SRRecorderControlDelegate <NSObject>
@optional
- (BOOL)shortcutRecorderShouldBeginRecording:(SRRecorderControl *)aRecorder;
- (BOOL)shortcutRecorder:(SRRecorderControl *)aRecorder canRecordShortcut:(NSDictionary *)aShortcut;
- (void)shortcutRecorderDidEndRecording:(SRRecorderControl *)aRecorder;
@end

View File

@@ -0,0 +1,91 @@
//
// SRValidator.h
// ShortcutRecorder
//
// Copyright 2006-2012 Contributors. All rights reserved.
//
// License: BSD
//
// Contributors:
// David Dauer
// Jesper
// Jamie Kirkpatrick
// Andy Kim
// Silvio Rizzi
// Ilya Kulakov
#import <Cocoa/Cocoa.h>
@protocol SRValidatorDelegate;
/*!
@brief Implements logic to check whether shortcut is taken by other parts of the application and system.
*/
@interface SRValidator : NSObject
@property (assign) NSObject<SRValidatorDelegate> *delegate;
- (instancetype)initWithDelegate:(NSObject<SRValidatorDelegate> *)aDelegate;
/*!
@brief Determines whether shortcut is taken.
@discussion Key is checked in the following order:
1. If delegate implements shortcutValidator:isKeyCode:andFlagsTaken:reason:
2. If delegate allows system-wide shortcuts are checked
3. If delegate allows application menu it checked
@see SRValidatorDelegate
*/
- (BOOL)isKeyCode:(NSInteger)aKeyCode andFlagsTaken:(NSUInteger)aFlags error:(NSError **)outError;
/*!
@brief Determines whether shortcut is taken in delegate.
@discussion If delegate does not implement appropriate method, returns immediately.
*/
- (BOOL)isKeyCode:(NSInteger)aKeyCode andFlagTakenInDelegate:(NSUInteger)aFlags error:(NSError **)outError;
/*!
@brief Determines whether shortcut is taken by system-wide shortcuts.
@discussion Does not check whether delegate allows or disallows checking in system shortcuts.
*/
- (BOOL)isKeyCode:(NSInteger)aKeyCode andFlagsTakenInSystemShortcuts:(NSUInteger)aFlags error:(NSError **)outError;
/*!
@brief Determines whether shortcut is taken by application menu item.
@discussion Does not check whether delegate allows or disallows checking in application menu.
*/
- (BOOL)isKeyCode:(NSInteger)aKeyCode andFlags:(NSUInteger)aFlags takenInMenu:(NSMenu *)aMenu error:(NSError **)outError;
@end
@protocol SRValidatorDelegate
@optional
/*!
@brief Delegate may implement this method to provide custom shortcut check.
*/
- (BOOL)shortcutValidator:(SRValidator *)aValidator isKeyCode:(NSInteger)aKeyCode andFlagsTaken:(NSUInteger)aFlags reason:(NSString **)outReason;
/*!
@brief Delegate may implement this method to allow the validator to check in system shortcuts.
*/
- (BOOL)shortcutValidatorShouldCheckMenu:(SRValidator *)aValidator;
/*!
@brief Delegate may implement this method to prevent the validator to check in system shortcuts.
*/
- (BOOL)shortcutValidatorShouldCheckSystemShortcuts:(SRValidator *)aValidator;
/*!
@brief Delegate may implement this method to force the validator to show ASCII representation of keyCode in errors.
*/
- (BOOL)shortcutValidatorShouldUseASCIIStringForKeyCodes:(SRValidator *)aValidator;
@end

View File

@@ -0,0 +1,16 @@
//
// ShortcutRecorder.h
// ShortcutRecorder
// Copyright 2012 Contributors. All rights reserved.
//
// License: BSD
//
// Contributors to this file:
// Jesper
// Ilya Kulakov
#import <ShortcutRecorder/SRCommon.h>
#import <ShortcutRecorder/SRKeyCodeTransformer.h>
#import <ShortcutRecorder/SRModifierFlagsTransformer.h>
#import <ShortcutRecorder/SRValidator.h>
#import <ShortcutRecorder/SRRecorderControl.h>

View File

@@ -0,0 +1,36 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>BuildMachineOSBuild</key>
<string>11G63b</string>
<key>CFBundleDevelopmentRegion</key>
<string>English</string>
<key>CFBundleExecutable</key>
<string>ShortcutRecorder</string>
<key>CFBundleIdentifier</key>
<string>com.kulakov.ShortcutRecorder</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundlePackageType</key>
<string>FMWK</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleVersion</key>
<string>2.0</string>
<key>DTCompiler</key>
<string></string>
<key>DTPlatformBuild</key>
<string>4G2008a</string>
<key>DTPlatformVersion</key>
<string>GM</string>
<key>DTSDKBuild</key>
<string>12C37</string>
<key>DTSDKName</key>
<string>macosx10.8</string>
<key>DTXcode</key>
<string>0452</string>
<key>DTXcodeBuild</key>
<string>4G2008a</string>
</dict>
</plist>

View File

@@ -0,0 +1,40 @@
Copyright (c) 2006, contributors to ShortcutRecorder. (See the contributors listed in detail later in the file, or see <http://wafflesoftware.net/shortcut/contributors/>.)
All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
* Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in the
documentation and/or other materials provided with the distribution.
* The name of the contributors may not be used to endorse or promote
products derived from this software without specific prior written
permission.
THIS SOFTWARE IS PROVIDED BY THE CONTRIBUTORS "AS IS" AND ANY
EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
=====================================================================
Contributors to Shortcut Recorder, in no order in particular:
Jesper, waffle software, <wootest+shortcutrecorder@gmail.com>. Initial idea and concept, first shot at implementation using NSView.
David Dauer, <david@daviddauer.de>. Refinement, cleaner reimplementation, documentation, IB Palette.
Jamie Kirkpatrick, Kirk Consulting Ltd, <jkp@kirkconsulting.co.uk>. Further modularisation and re-factoring, and general bug fixes.
Ilya Kulakov, <kulakov.ilya@gmail.com>. ShortcutRecorder 2.0 and further support.
Alexander Ljungberg, <aljungberg@wireload.net>. Graphics for ShortcutRecorder 2.0
=====================================================================
Some rights reserved: <http://creativecommons.org/licenses/by/3.0/>
For more information, visit <http://blog.oofn.net/projects/misc/>

View File

@@ -0,0 +1,689 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>files</key>
<dict>
<key>Resources/Info.plist</key>
<data>
YFzLyUre+ui+8sHfJcU+MVnX/bk=
</data>
<key>Resources/LICENSE.txt</key>
<data>
mLubXjIQQmhxVIpFKfixv43ml10=
</data>
<key>Resources/ca.lproj/ShortcutRecorder.strings</key>
<dict>
<key>hash</key>
<data>
g08NIGHne0LE4iF9UYDXXrynNV8=
</data>
<key>optional</key>
<true/>
</dict>
<key>Resources/cs.lproj/ShortcutRecorder.strings</key>
<dict>
<key>hash</key>
<data>
s2fctmNAtmT89gKZ8dlaqDm+EF4=
</data>
<key>optional</key>
<true/>
</dict>
<key>Resources/de.lproj/ShortcutRecorder.strings</key>
<dict>
<key>hash</key>
<data>
fLYhzBQucDTHa19V7T82P5Zs+xk=
</data>
<key>optional</key>
<true/>
</dict>
<key>Resources/el.lproj/ShortcutRecorder.strings</key>
<dict>
<key>hash</key>
<data>
WEKmCoJWOq/sUiT2Wyy0uBRBaRk=
</data>
<key>optional</key>
<true/>
</dict>
<key>Resources/en.lproj/ShortcutRecorder.strings</key>
<dict>
<key>hash</key>
<data>
748uivvl5+w8Kyr5okiDwSimNiE=
</data>
<key>optional</key>
<true/>
</dict>
<key>Resources/es-MX.lproj/ShortcutRecorder.strings</key>
<dict>
<key>hash</key>
<data>
BUblY/3eu18QGoh//9veN0nDcso=
</data>
<key>optional</key>
<true/>
</dict>
<key>Resources/es.lproj/ShortcutRecorder.strings</key>
<dict>
<key>hash</key>
<data>
Xxkgf5J9Nkemnd+pzto9Uk5xZlE=
</data>
<key>optional</key>
<true/>
</dict>
<key>Resources/fr.lproj/ShortcutRecorder.strings</key>
<dict>
<key>hash</key>
<data>
CRE0wTWUb4sic7g/wJZqhUG/tmc=
</data>
<key>optional</key>
<true/>
</dict>
<key>Resources/it.lproj/ShortcutRecorder.strings</key>
<dict>
<key>hash</key>
<data>
CitSEqXqrDMJ7w1vlDcNIQXvzvg=
</data>
<key>optional</key>
<true/>
</dict>
<key>Resources/ja.lproj/ShortcutRecorder.strings</key>
<dict>
<key>hash</key>
<data>
7wXTnK7EgtvVTBaflJVclU27UDM=
</data>
<key>optional</key>
<true/>
</dict>
<key>Resources/ko.lproj/ShortcutRecorder.strings</key>
<dict>
<key>hash</key>
<data>
7/iXK6oM6xYV0LY5y5pCW/1fH9c=
</data>
<key>optional</key>
<true/>
</dict>
<key>Resources/nb.lproj/ShortcutRecorder.strings</key>
<dict>
<key>hash</key>
<data>
a2oQQtbPA+wzCzwzYWCRcxv8bdE=
</data>
<key>optional</key>
<true/>
</dict>
<key>Resources/nl.lproj/ShortcutRecorder.strings</key>
<dict>
<key>hash</key>
<data>
5dPqeIpJ+ErvUlUaz7z3xjb+N9k=
</data>
<key>optional</key>
<true/>
</dict>
<key>Resources/pl.lproj/ShortcutRecorder.strings</key>
<dict>
<key>hash</key>
<data>
XntxOvhPuh9GMwEOKp3wRBL6ZmI=
</data>
<key>optional</key>
<true/>
</dict>
<key>Resources/pt-BR.lproj/ShortcutRecorder.strings</key>
<dict>
<key>hash</key>
<data>
iUFq27/FuClOexD/kp4BR0FL2sU=
</data>
<key>optional</key>
<true/>
</dict>
<key>Resources/pt.lproj/ShortcutRecorder.strings</key>
<dict>
<key>hash</key>
<data>
/0qAKy2DAv0ZOEe7VluSnys8qzw=
</data>
<key>optional</key>
<true/>
</dict>
<key>Resources/ro.lproj/ShortcutRecorder.strings</key>
<dict>
<key>hash</key>
<data>
w+40iAh2nGEkG3eP+2VtyG4AV+I=
</data>
<key>optional</key>
<true/>
</dict>
<key>Resources/ru.lproj/ShortcutRecorder.strings</key>
<dict>
<key>hash</key>
<data>
EjPuA5q+l76JRQurG+3wxjt5SYU=
</data>
<key>optional</key>
<true/>
</dict>
<key>Resources/shortcut-recorder-bezel-blue-highlighted-left.tiff</key>
<data>
J7GfSObmF96Dl6B4/j4ALNlwhRU=
</data>
<key>Resources/shortcut-recorder-bezel-blue-highlighted-middle.tiff</key>
<data>
l0VwqvkY2I2mhCq956iWK/SjL7I=
</data>
<key>Resources/shortcut-recorder-bezel-blue-highlighted-right.tiff</key>
<data>
vSTGIqKwq4OGDTt02E/M7aRj8sI=
</data>
<key>Resources/shortcut-recorder-bezel-editing-left.tiff</key>
<data>
4a8vjKfdtSiwV1ljhhA/CfzCUtc=
</data>
<key>Resources/shortcut-recorder-bezel-editing-middle.tiff</key>
<data>
VrST6Dl1AYLoc0tbKhfj+w0ucmE=
</data>
<key>Resources/shortcut-recorder-bezel-editing-right.tiff</key>
<data>
GC3/qlOjT3VfojQb6Lw/mVYmXJY=
</data>
<key>Resources/shortcut-recorder-bezel-graphite-highlight-mask-left.tiff</key>
<data>
jY7IQoOa5FJ85l2WYpskOO4pg7U=
</data>
<key>Resources/shortcut-recorder-bezel-graphite-highlight-mask-middle.tiff</key>
<data>
y4oot3drb8MnENvYMz0QI3folWM=
</data>
<key>Resources/shortcut-recorder-bezel-graphite-highlight-mask-right.tiff</key>
<data>
R0BovoRuN4AiPYYJFxM4dy1HVeU=
</data>
<key>Resources/shortcut-recorder-bezel-left.tiff</key>
<data>
2nG7qm7YOScL5bslY4D/IrMmSvg=
</data>
<key>Resources/shortcut-recorder-bezel-middle.tiff</key>
<data>
BJ3ASm0ZfuOotFkf8OdlvupGM6k=
</data>
<key>Resources/shortcut-recorder-bezel-right.tiff</key>
<data>
heZRwswH3niHE6hkDMTaxM88LRk=
</data>
<key>Resources/shortcut-recorder-clear-highlighted.tiff</key>
<data>
PwlxzGGmzD2NfFHVqPojd/Feh6w=
</data>
<key>Resources/shortcut-recorder-clear.tiff</key>
<data>
Mohrdn0RxnNLMdHCcKl/Zxbn22E=
</data>
<key>Resources/shortcut-recorder-snapback-highlighted.tiff</key>
<data>
/NxAqLzupdJlyVvEj4AxspDi448=
</data>
<key>Resources/shortcut-recorder-snapback.tiff</key>
<data>
sel80jk3XaFC+yuEbbw1tCKc/Zk=
</data>
<key>Resources/sk.lproj/ShortcutRecorder.strings</key>
<dict>
<key>hash</key>
<data>
Km3Yz9FB3Ac5zN/VLBZmKfyuQj0=
</data>
<key>optional</key>
<true/>
</dict>
<key>Resources/sv.lproj/ShortcutRecorder.strings</key>
<dict>
<key>hash</key>
<data>
krbpjnSXvY8ozqgUm2eTk8CsnXM=
</data>
<key>optional</key>
<true/>
</dict>
<key>Resources/th.lproj/ShortcutRecorder.strings</key>
<dict>
<key>hash</key>
<data>
sT8TAz8Dc71iYvYpfnAMzSmjpAU=
</data>
<key>optional</key>
<true/>
</dict>
<key>Resources/zh-Hans.lproj/ShortcutRecorder.strings</key>
<dict>
<key>hash</key>
<data>
P3pz5woprJDAZ+dMpjzYG3cuWk8=
</data>
<key>optional</key>
<true/>
</dict>
<key>Resources/zh-Hant.lproj/ShortcutRecorder.strings</key>
<dict>
<key>hash</key>
<data>
WvETNiMkYOHD9EbC8Ma7ZMWTkrQ=
</data>
<key>optional</key>
<true/>
</dict>
</dict>
<key>files2</key>
<dict>
<key>Headers/SRCommon.h</key>
<data>
pQkzvv1bgXH0CFrWvYkgep/Ksmw=
</data>
<key>Headers/SRKeyCodeTransformer.h</key>
<data>
rFTlEnt++GMRf1igGGWApaLD2n8=
</data>
<key>Headers/SRModifierFlagsTransformer.h</key>
<data>
10yV9V44Lr7AjTQx046y4XUMRcg=
</data>
<key>Headers/SRRecorderControl.h</key>
<data>
j4eVgR1kmVuxRVW0HDVifNRzbQI=
</data>
<key>Headers/SRValidator.h</key>
<data>
ouptVbTXozlQTJjMKdo8CEvFzRQ=
</data>
<key>Headers/ShortcutRecorder.h</key>
<data>
n1kuUYTC1cn/J1IsE1y77oMgVds=
</data>
<key>Resources/Info.plist</key>
<data>
YFzLyUre+ui+8sHfJcU+MVnX/bk=
</data>
<key>Resources/LICENSE.txt</key>
<data>
mLubXjIQQmhxVIpFKfixv43ml10=
</data>
<key>Resources/ca.lproj/ShortcutRecorder.strings</key>
<dict>
<key>hash</key>
<data>
g08NIGHne0LE4iF9UYDXXrynNV8=
</data>
<key>optional</key>
<true/>
</dict>
<key>Resources/cs.lproj/ShortcutRecorder.strings</key>
<dict>
<key>hash</key>
<data>
s2fctmNAtmT89gKZ8dlaqDm+EF4=
</data>
<key>optional</key>
<true/>
</dict>
<key>Resources/de.lproj/ShortcutRecorder.strings</key>
<dict>
<key>hash</key>
<data>
fLYhzBQucDTHa19V7T82P5Zs+xk=
</data>
<key>optional</key>
<true/>
</dict>
<key>Resources/el.lproj/ShortcutRecorder.strings</key>
<dict>
<key>hash</key>
<data>
WEKmCoJWOq/sUiT2Wyy0uBRBaRk=
</data>
<key>optional</key>
<true/>
</dict>
<key>Resources/en.lproj/ShortcutRecorder.strings</key>
<dict>
<key>hash</key>
<data>
748uivvl5+w8Kyr5okiDwSimNiE=
</data>
<key>optional</key>
<true/>
</dict>
<key>Resources/es-MX.lproj/ShortcutRecorder.strings</key>
<dict>
<key>hash</key>
<data>
BUblY/3eu18QGoh//9veN0nDcso=
</data>
<key>optional</key>
<true/>
</dict>
<key>Resources/es.lproj/ShortcutRecorder.strings</key>
<dict>
<key>hash</key>
<data>
Xxkgf5J9Nkemnd+pzto9Uk5xZlE=
</data>
<key>optional</key>
<true/>
</dict>
<key>Resources/fr.lproj/ShortcutRecorder.strings</key>
<dict>
<key>hash</key>
<data>
CRE0wTWUb4sic7g/wJZqhUG/tmc=
</data>
<key>optional</key>
<true/>
</dict>
<key>Resources/it.lproj/ShortcutRecorder.strings</key>
<dict>
<key>hash</key>
<data>
CitSEqXqrDMJ7w1vlDcNIQXvzvg=
</data>
<key>optional</key>
<true/>
</dict>
<key>Resources/ja.lproj/ShortcutRecorder.strings</key>
<dict>
<key>hash</key>
<data>
7wXTnK7EgtvVTBaflJVclU27UDM=
</data>
<key>optional</key>
<true/>
</dict>
<key>Resources/ko.lproj/ShortcutRecorder.strings</key>
<dict>
<key>hash</key>
<data>
7/iXK6oM6xYV0LY5y5pCW/1fH9c=
</data>
<key>optional</key>
<true/>
</dict>
<key>Resources/nb.lproj/ShortcutRecorder.strings</key>
<dict>
<key>hash</key>
<data>
a2oQQtbPA+wzCzwzYWCRcxv8bdE=
</data>
<key>optional</key>
<true/>
</dict>
<key>Resources/nl.lproj/ShortcutRecorder.strings</key>
<dict>
<key>hash</key>
<data>
5dPqeIpJ+ErvUlUaz7z3xjb+N9k=
</data>
<key>optional</key>
<true/>
</dict>
<key>Resources/pl.lproj/ShortcutRecorder.strings</key>
<dict>
<key>hash</key>
<data>
XntxOvhPuh9GMwEOKp3wRBL6ZmI=
</data>
<key>optional</key>
<true/>
</dict>
<key>Resources/pt-BR.lproj/ShortcutRecorder.strings</key>
<dict>
<key>hash</key>
<data>
iUFq27/FuClOexD/kp4BR0FL2sU=
</data>
<key>optional</key>
<true/>
</dict>
<key>Resources/pt.lproj/ShortcutRecorder.strings</key>
<dict>
<key>hash</key>
<data>
/0qAKy2DAv0ZOEe7VluSnys8qzw=
</data>
<key>optional</key>
<true/>
</dict>
<key>Resources/ro.lproj/ShortcutRecorder.strings</key>
<dict>
<key>hash</key>
<data>
w+40iAh2nGEkG3eP+2VtyG4AV+I=
</data>
<key>optional</key>
<true/>
</dict>
<key>Resources/ru.lproj/ShortcutRecorder.strings</key>
<dict>
<key>hash</key>
<data>
EjPuA5q+l76JRQurG+3wxjt5SYU=
</data>
<key>optional</key>
<true/>
</dict>
<key>Resources/shortcut-recorder-bezel-blue-highlighted-left.tiff</key>
<data>
J7GfSObmF96Dl6B4/j4ALNlwhRU=
</data>
<key>Resources/shortcut-recorder-bezel-blue-highlighted-middle.tiff</key>
<data>
l0VwqvkY2I2mhCq956iWK/SjL7I=
</data>
<key>Resources/shortcut-recorder-bezel-blue-highlighted-right.tiff</key>
<data>
vSTGIqKwq4OGDTt02E/M7aRj8sI=
</data>
<key>Resources/shortcut-recorder-bezel-editing-left.tiff</key>
<data>
4a8vjKfdtSiwV1ljhhA/CfzCUtc=
</data>
<key>Resources/shortcut-recorder-bezel-editing-middle.tiff</key>
<data>
VrST6Dl1AYLoc0tbKhfj+w0ucmE=
</data>
<key>Resources/shortcut-recorder-bezel-editing-right.tiff</key>
<data>
GC3/qlOjT3VfojQb6Lw/mVYmXJY=
</data>
<key>Resources/shortcut-recorder-bezel-graphite-highlight-mask-left.tiff</key>
<data>
jY7IQoOa5FJ85l2WYpskOO4pg7U=
</data>
<key>Resources/shortcut-recorder-bezel-graphite-highlight-mask-middle.tiff</key>
<data>
y4oot3drb8MnENvYMz0QI3folWM=
</data>
<key>Resources/shortcut-recorder-bezel-graphite-highlight-mask-right.tiff</key>
<data>
R0BovoRuN4AiPYYJFxM4dy1HVeU=
</data>
<key>Resources/shortcut-recorder-bezel-left.tiff</key>
<data>
2nG7qm7YOScL5bslY4D/IrMmSvg=
</data>
<key>Resources/shortcut-recorder-bezel-middle.tiff</key>
<data>
BJ3ASm0ZfuOotFkf8OdlvupGM6k=
</data>
<key>Resources/shortcut-recorder-bezel-right.tiff</key>
<data>
heZRwswH3niHE6hkDMTaxM88LRk=
</data>
<key>Resources/shortcut-recorder-clear-highlighted.tiff</key>
<data>
PwlxzGGmzD2NfFHVqPojd/Feh6w=
</data>
<key>Resources/shortcut-recorder-clear.tiff</key>
<data>
Mohrdn0RxnNLMdHCcKl/Zxbn22E=
</data>
<key>Resources/shortcut-recorder-snapback-highlighted.tiff</key>
<data>
/NxAqLzupdJlyVvEj4AxspDi448=
</data>
<key>Resources/shortcut-recorder-snapback.tiff</key>
<data>
sel80jk3XaFC+yuEbbw1tCKc/Zk=
</data>
<key>Resources/sk.lproj/ShortcutRecorder.strings</key>
<dict>
<key>hash</key>
<data>
Km3Yz9FB3Ac5zN/VLBZmKfyuQj0=
</data>
<key>optional</key>
<true/>
</dict>
<key>Resources/sv.lproj/ShortcutRecorder.strings</key>
<dict>
<key>hash</key>
<data>
krbpjnSXvY8ozqgUm2eTk8CsnXM=
</data>
<key>optional</key>
<true/>
</dict>
<key>Resources/th.lproj/ShortcutRecorder.strings</key>
<dict>
<key>hash</key>
<data>
sT8TAz8Dc71iYvYpfnAMzSmjpAU=
</data>
<key>optional</key>
<true/>
</dict>
<key>Resources/zh-Hans.lproj/ShortcutRecorder.strings</key>
<dict>
<key>hash</key>
<data>
P3pz5woprJDAZ+dMpjzYG3cuWk8=
</data>
<key>optional</key>
<true/>
</dict>
<key>Resources/zh-Hant.lproj/ShortcutRecorder.strings</key>
<dict>
<key>hash</key>
<data>
WvETNiMkYOHD9EbC8Ma7ZMWTkrQ=
</data>
<key>optional</key>
<true/>
</dict>
</dict>
<key>rules</key>
<dict>
<key>^Resources/</key>
<true/>
<key>^Resources/.*\.lproj/</key>
<dict>
<key>optional</key>
<true/>
<key>weight</key>
<real>1000</real>
</dict>
<key>^Resources/.*\.lproj/locversion.plist$</key>
<dict>
<key>omit</key>
<true/>
<key>weight</key>
<real>1100</real>
</dict>
<key>^version.plist$</key>
<true/>
</dict>
<key>rules2</key>
<dict>
<key>.*\.dSYM($|/)</key>
<dict>
<key>weight</key>
<real>11</real>
</dict>
<key>^(.*/)?\.DS_Store$</key>
<dict>
<key>omit</key>
<true/>
<key>weight</key>
<real>2000</real>
</dict>
<key>^(Frameworks|SharedFrameworks|PlugIns|Plug-ins|XPCServices|Helpers|MacOS|Library/(Automator|Spotlight|LoginItems))/</key>
<dict>
<key>nested</key>
<true/>
<key>weight</key>
<real>10</real>
</dict>
<key>^.*</key>
<true/>
<key>^Info\.plist$</key>
<dict>
<key>omit</key>
<true/>
<key>weight</key>
<real>20</real>
</dict>
<key>^PkgInfo$</key>
<dict>
<key>omit</key>
<true/>
<key>weight</key>
<real>20</real>
</dict>
<key>^Resources/</key>
<dict>
<key>weight</key>
<real>20</real>
</dict>
<key>^Resources/.*\.lproj/</key>
<dict>
<key>optional</key>
<true/>
<key>weight</key>
<real>1000</real>
</dict>
<key>^Resources/.*\.lproj/locversion.plist$</key>
<dict>
<key>omit</key>
<true/>
<key>weight</key>
<real>1100</real>
</dict>
<key>^[^/]+$</key>
<dict>
<key>nested</key>
<true/>
<key>weight</key>
<real>10</real>
</dict>
<key>^embedded\.provisionprofile$</key>
<dict>
<key>weight</key>
<real>20</real>
</dict>
<key>^version\.plist$</key>
<dict>
<key>weight</key>
<real>20</real>
</dict>
</dict>
</dict>
</plist>