diff options
| author | Vadim Shpakovski | 2012-09-19 12:36:53 +0300 |
|---|---|---|
| committer | Vadim Shpakovski | 2012-09-19 12:36:53 +0300 |
| commit | 243aee3038ed23c7f8b96f54871bae00a3be8a41 (patch) | |
| tree | dc993f7c1230ee02971271418585a7e33ab6af02 /MASShortcut+UserDefaults.m | |
| parent | 723eeb43460c219310c77b3ba369efb0326137aa (diff) | |
| download | MASShortcut-243aee3038ed23c7f8b96f54871bae00a3be8a41.tar.bz2 | |
Adds support for direct monitoring shortcuts.
Diffstat (limited to 'MASShortcut+UserDefaults.m')
| -rw-r--r-- | MASShortcut+UserDefaults.m | 100 |
1 files changed, 14 insertions, 86 deletions
diff --git a/MASShortcut+UserDefaults.m b/MASShortcut+UserDefaults.m index 28fd633..38d3707 100644 --- a/MASShortcut+UserDefaults.m +++ b/MASShortcut+UserDefaults.m @@ -1,23 +1,20 @@ #import "MASShortcut+UserDefaults.h" -@interface MASShortcutHotKey : NSObject +@interface MASShortcutUserDefaultsHotKey : NSObject @property (nonatomic, readonly) NSString *userDefaultsKey; -@property (nonatomic, readonly, copy) void (^handler)(); -@property (nonatomic, readonly) EventHotKeyRef carbonHotKey; -@property (nonatomic, readonly) UInt32 carbonHotKeyID; +@property (nonatomic, copy) void (^handler)(); +@property (nonatomic, weak) id monitor; - (id)initWithUserDefaultsKey:(NSString *)userDefaultsKey handler:(void (^)())handler; -+ (void)uninstallEventHandler; - @end #pragma mark - @implementation MASShortcut (UserDefaults) -+ (NSMutableDictionary *)registeredHotKeys ++ (NSMutableDictionary *)registeredUserDefaultsHotKeys { static NSMutableDictionary *shared = nil; static dispatch_once_t onceToken; @@ -29,29 +26,25 @@ + (void)registerGlobalShortcutWithUserDefaultsKey:(NSString *)userDefaultsKey handler:(void (^)())handler; { - MASShortcutHotKey *hotKey = [[MASShortcutHotKey alloc] initWithUserDefaultsKey:userDefaultsKey handler:handler]; - [[self registeredHotKeys] setObject:hotKey forKey:userDefaultsKey]; + MASShortcutUserDefaultsHotKey *hotKey = [[MASShortcutUserDefaultsHotKey alloc] initWithUserDefaultsKey:userDefaultsKey handler:handler]; + [[self registeredUserDefaultsHotKeys] setObject:hotKey forKey:userDefaultsKey]; } + (void)unregisterGlobalShortcutWithUserDefaultsKey:(NSString *)userDefaultsKey { - NSMutableDictionary *registeredHotKeys = [self registeredHotKeys]; + NSMutableDictionary *registeredHotKeys = [self registeredUserDefaultsHotKeys]; [registeredHotKeys removeObjectForKey:userDefaultsKey]; - if (registeredHotKeys.count == 0) { - [MASShortcutHotKey uninstallEventHandler]; - } } @end #pragma mark - -@implementation MASShortcutHotKey +@implementation MASShortcutUserDefaultsHotKey -@synthesize carbonHotKeyID = _carbonHotKeyID; +@synthesize monitor = _monitor; @synthesize handler = _handler; @synthesize userDefaultsKey = _userDefaultsKey; -@synthesize carbonHotKey = _carbonHotKey; #pragma mark - @@ -71,88 +64,23 @@ - (void)dealloc { [[NSNotificationCenter defaultCenter] removeObserver:self name:NSUserDefaultsDidChangeNotification object:[NSUserDefaults standardUserDefaults]]; - [self uninstallExisitingHotKey]; + [MASShortcut removeGlobalHotkeyMonitor:self.monitor]; } #pragma mark - - (void)userDefaultsDidChange:(NSNotification *)note { - [self uninstallExisitingHotKey]; + [MASShortcut removeGlobalHotkeyMonitor:self.monitor]; [self installHotKeyFromUserDefaults]; } -#pragma mark - Carbon events - -static EventHandlerRef sEventHandler = NULL; - -+ (BOOL)installCommonEventHandler -{ - if (sEventHandler == NULL) { - EventTypeSpec hotKeyPressedSpec = { .eventClass = kEventClassKeyboard, .eventKind = kEventHotKeyPressed }; - OSStatus status = InstallEventHandler(GetEventDispatcherTarget(), CarbonCallback, 1, &hotKeyPressedSpec, NULL, &sEventHandler); - if (status != noErr) { - sEventHandler = NULL; - return NO; - } - } - return YES; -} - -+ (void)uninstallEventHandler -{ - if (sEventHandler) { - RemoveEventHandler(sEventHandler); - sEventHandler = NULL; - } -} - -#pragma mark - - -- (void)uninstallExisitingHotKey -{ - if (_carbonHotKey) { - UnregisterEventHotKey(_carbonHotKey); - _carbonHotKey = NULL; - } -} - -FourCharCode const kMASShortcutSignature = 'MASS'; - - (void)installHotKeyFromUserDefaults { NSData *data = [[NSUserDefaults standardUserDefaults] dataForKey:_userDefaultsKey]; MASShortcut *shortcut = [MASShortcut shortcutWithData:data]; - if ((shortcut == nil) || ![[self class] installCommonEventHandler]) return; - - static UInt32 sCarbonHotKeyID = 0; - _carbonHotKeyID = ++ sCarbonHotKeyID; - EventHotKeyID hotKeyID = { .signature = kMASShortcutSignature, .id = _carbonHotKeyID }; - if (RegisterEventHotKey(shortcut.carbonKeyCode, shortcut.carbonFlags, hotKeyID, GetEventDispatcherTarget(), kEventHotKeyExclusive, &_carbonHotKey) != noErr) { - _carbonHotKey = NULL; - } -} - -static OSStatus CarbonCallback(EventHandlerCallRef inHandlerCallRef, EventRef inEvent, void *inUserData) -{ - if (GetEventClass(inEvent) != kEventClassKeyboard) return noErr; - - EventHotKeyID hotKeyID; - OSStatus status = GetEventParameter(inEvent, kEventParamDirectObject, typeEventHotKeyID, NULL, sizeof(hotKeyID), NULL, &hotKeyID); - if (status != noErr) return status; - - if (hotKeyID.signature != kMASShortcutSignature) return noErr; - - [[MASShortcut registeredHotKeys] enumerateKeysAndObjectsUsingBlock:^(id key, MASShortcutHotKey *hotKey, BOOL *stop) { - if (hotKeyID.id == hotKey.carbonHotKeyID) { - if (hotKey.handler) { - hotKey.handler(); - } - *stop = YES; - } - }]; - - return noErr; + if (shortcut == nil) return; + self.monitor = [MASShortcut addGlobalHotkeyMonitorWithShortcut:shortcut handler:self.handler]; } -@end
\ No newline at end of file +@end |
