aboutsummaryrefslogtreecommitdiffstats
path: root/MASShortcut+UserDefaults.m
diff options
context:
space:
mode:
Diffstat (limited to 'MASShortcut+UserDefaults.m')
-rw-r--r--MASShortcut+UserDefaults.m100
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