forked from eczarny/spectacle
-
Notifications
You must be signed in to change notification settings - Fork 0
/
ZKHotKey.m
132 lines (98 loc) · 3.13 KB
/
ZKHotKey.m
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
#import "ZKHotKey.h"
#import "ZKHotKeyTranslator.h"
@implementation ZKHotKey
- (id)initWithHotKeyCode: (NSInteger)hotKeyCode hotKeyModifiers: (NSUInteger)hotKeyModifiers {
if (self = [super init]) {
_handle = -1;
_hotKeyName = nil;
_hotKeyAction = nil;
_hotKeyCode = hotKeyCode;
_hotKeyModifiers = [ZKHotKeyTranslator convertModifiersToCarbonIfNecessary: hotKeyModifiers];
_hotKeyRef = NULL;
}
return self;
}
#pragma mark -
- (id)initWithCoder: (NSCoder *)coder {
if (self = [super init]) {
if ([coder allowsKeyedCoding]) {
_hotKeyName = [coder decodeObjectForKey: @"name"];
_hotKeyCode = [coder decodeIntegerForKey: @"keyCode"];
_hotKeyModifiers = [coder decodeIntegerForKey: @"modifiers"];
} else {
_hotKeyName = [coder decodeObject];
[coder decodeValueOfObjCType: @encode(NSInteger) at: &_hotKeyCode];
[coder decodeValueOfObjCType: @encode(NSUInteger) at: &_hotKeyModifiers];
}
}
return self;
}
#pragma mark -
- (void)encodeWithCoder: (NSCoder *)coder {
if ([coder allowsKeyedCoding]) {
[coder encodeObject: _hotKeyName forKey: @"name"];
[coder encodeInteger: _hotKeyCode forKey: @"keyCode"];
[coder encodeInteger: _hotKeyModifiers forKey: @"modifiers"];
} else {
[coder encodeObject: _hotKeyName];
[coder encodeValueOfObjCType: @encode(NSInteger) at: &_hotKeyCode];
[coder encodeValueOfObjCType: @encode(NSUInteger) at: &_hotKeyModifiers];
}
}
#pragma mark -
- (id)replacementObjectForPortCoder: (NSPortCoder *)encoder {
if (encoder.isBycopy) {
return self;
}
return [super replacementObjectForPortCoder: encoder];
}
#pragma mark -
+ (ZKHotKey *)clearedHotKey {
return [[ZKHotKey alloc] initWithHotKeyCode: 0 hotKeyModifiers: 0];
}
+ (ZKHotKey *)clearedHotKeyWithName: (NSString *)name {
ZKHotKey *hotKey = [[ZKHotKey alloc] initWithHotKeyCode: 0 hotKeyModifiers: 0];
hotKey.hotKeyName = name;
return hotKey;
}
#pragma mark -
- (void)triggerHotKeyAction {
if (_hotKeyAction) {
_hotKeyAction(self);
}
}
#pragma mark -
- (BOOL)isClearedHotKey {
return (_hotKeyCode == 0) && (_hotKeyModifiers == 0);
}
#pragma mark -
- (NSString *)displayString {
return [ZKHotKeyTranslator.sharedTranslator translateHotKey: self];
}
#pragma mark -
+ (BOOL)validCocoaModifiers: (NSUInteger)modifiers {
return (modifiers & NSAlternateKeyMask) || (modifiers & NSCommandKeyMask) || (modifiers & NSControlKeyMask) || (modifiers & NSShiftKeyMask);
}
#pragma mark -
- (BOOL)isEqual: (id)object {
if (object == self) {
return YES;
}
if (!object || ![object isKindOfClass: [self class]]) {
return NO;
}
return [self isEqualToHotKey: object];
}
- (BOOL)isEqualToHotKey: (ZKHotKey *)hotKey {
if (hotKey == self) {
return YES;
}
if (hotKey.hotKeyCode != _hotKeyCode) {
return NO;
}
if (hotKey.hotKeyModifiers != _hotKeyModifiers) {
return NO;
}
return YES;
}
@end