Skip to content

Commit

Permalink
[Issue jigish#125] add ability to use modifiers with
Browse files Browse the repository at this point in the history
modal keys
  • Loading branch information
Jigish Patel committed Oct 16, 2012
1 parent 9771813 commit 0dbbd67
Show file tree
Hide file tree
Showing 5 changed files with 35 additions and 13 deletions.
2 changes: 2 additions & 0 deletions Slate/Binding.h
Original file line number Diff line number Diff line change
Expand Up @@ -43,5 +43,7 @@
+ (NSDictionary *)asciiToCodeDict;
- (id)initWithString:(NSString *)binding;
- (BOOL)doOperation;
- (NSString *)modalHashKey;
+ (NSArray *)modalHashKeyToKeyAndModifiers:(NSString *)modalHashKey;

@end
20 changes: 19 additions & 1 deletion Slate/Binding.m
Original file line number Diff line number Diff line change
Expand Up @@ -64,14 +64,15 @@ - (id)initWithString:(NSString *)binding {
if ([keyAndModifiers count] >= 2) {
NSNumber *theModalKey = [[Binding asciiToCodeDict] objectForKey:[keyAndModifiers objectAtIndex:1]];
if (theModalKey != nil) {
// modal case
// modal no modifier case
[self setModalKey:theModalKey];
} else {
// normal case
NSArray *modifiersArray = [[keyAndModifiers objectAtIndex:1] componentsSeparatedByCharactersInSet:[NSCharacterSet characterSetWithCharactersInString:@",;"]];
NSEnumerator *modEnum = [modifiersArray objectEnumerator];
NSString *mod = [modEnum nextObject];
while (mod) {
theModalKey = [[Binding asciiToCodeDict] objectForKey:mod];
if ([mod isEqualToString:CONTROL]) {
modifiers += controlKey;
} else if ([mod isEqualToString:OPTION]) {
Expand All @@ -80,6 +81,8 @@ - (id)initWithString:(NSString *)binding {
modifiers += cmdKey;
} else if ([mod isEqualToString:SHIFT]) {
modifiers += shiftKey;
} else if (theModalKey != nil) { // modal key with modifiers
[self setModalKey:theModalKey];
} else {
SlateLogger(@"ERROR: Unrecognized modifier '%@'", mod);
@throw([NSException exceptionWithName:@"Unrecognized Modifier" reason:[NSString stringWithFormat:@"Unrecognized modifier '%@' in '%@'", mod, binding] userInfo:nil]);
Expand Down Expand Up @@ -126,6 +129,21 @@ - (BOOL)doOperation {
return [op doOperation];
}

- (NSString *)modalHashKey {
if ([self modalKey] == nil) {
return nil;
}
return [NSString stringWithFormat:@"%@%@%u", [self modalKey], PLUS, [self modifiers]];
}

+ (NSArray *)modalHashKeyToKeyAndModifiers:(NSString *)modalHashKey {
NSArray *modalKeyArr = [modalHashKey componentsSeparatedByString:PLUS];
NSNumberFormatter *nf = [[NSNumberFormatter alloc] init];
NSNumber *theKey = [nf numberFromString:[modalKeyArr objectAtIndex:0]];
NSNumber *theModifiers = [nf numberFromString:[modalKeyArr objectAtIndex:1]];
return [NSArray arrayWithObjects:theKey, theModifiers, nil];
}

- (void)dealloc {
[self setHotKeyRef:nil];
}
Expand Down
4 changes: 2 additions & 2 deletions Slate/SlateAppDelegate.h
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@
NSInteger cmdShiftTabBinding;
NSMutableDictionary *modalHotKeyRefs;
NSMutableDictionary *modalIdToKey;
NSNumber *currentModalKey;
NSString *currentModalKey;
NSMutableArray *currentModalHotKeyRefs;
}

Expand All @@ -61,7 +61,7 @@
@property (assign) NSInteger cmdShiftTabBinding;
@property NSMutableDictionary *modalHotKeyRefs;
@property NSMutableDictionary *modalIdToKey;
@property NSNumber *currentModalKey;
@property NSString *currentModalKey;
@property NSMutableArray *currentModalHotKeyRefs;


Expand Down
18 changes: 10 additions & 8 deletions Slate/SlateAppDelegate.m
Original file line number Diff line number Diff line change
Expand Up @@ -120,15 +120,17 @@ - (void)registerHotKeys {

NSArray *modalKeys = [[[SlateConfig getInstance] modalBindings] allKeys];
NSInteger i = MODAL_BEGIN_ID;
for (NSNumber *modalKey in modalKeys) {
SlateLogger(@"REGISTERING MODAL KEY: %@", modalKey);
for (NSString *modalHashKey in modalKeys) {
SlateLogger(@"REGISTERING MODAL KEY: %@", modalHashKey);
NSArray *modalKeyArr = [Binding modalHashKeyToKeyAndModifiers:modalHashKey];
if (modalKeyArr == nil) continue;
EventHotKeyID myHotKeyID;
EventHotKeyRef myHotKeyRef;
myHotKeyID.signature = *[[NSString stringWithFormat:@"hotkey%li",i] cStringUsingEncoding:NSASCIIStringEncoding];
myHotKeyID.id = (UInt32)i;
RegisterEventHotKey([modalKey unsignedIntValue], 0, myHotKeyID, GetEventMonitorTarget(), 0, &myHotKeyRef);
[[self modalHotKeyRefs] setObject:[NSValue valueWithPointer:myHotKeyRef] forKey:modalKey];
[[self modalIdToKey] setObject:modalKey forKey:[NSNumber numberWithInteger:i]];
RegisterEventHotKey([[modalKeyArr objectAtIndex:0] unsignedIntValue], [[modalKeyArr objectAtIndex:1] unsignedIntValue], myHotKeyID, GetEventMonitorTarget(), 0, &myHotKeyRef);
[[self modalHotKeyRefs] setObject:[NSValue valueWithPointer:myHotKeyRef] forKey:modalHashKey];
[[self modalIdToKey] setObject:modalHashKey forKey:[NSNumber numberWithInteger:i]];
i++;
}
SlateLogger(@"HotKeys registered.");
Expand Down Expand Up @@ -203,9 +205,9 @@ - (OSStatus)activateBinding:(EventHotKeyID)hkCom isRepeat:(BOOL)isRepeat {

// check modal stuffs
NSNumber *hkId = [NSNumber numberWithInteger:hkCom.id];
NSNumber *modalKey = [[self modalIdToKey] objectForKey:hkId];
NSString *modalKey = [[self modalIdToKey] objectForKey:hkId];
if (modalKey != nil) {
if (currentModalKey != nil && [modalKey isEqualToNumber:currentModalKey]) {
if (currentModalKey != nil && [modalKey isEqualToString:currentModalKey]) {
[self resetModalKey];
return noErr;
} else if (currentModalKey == nil) {
Expand All @@ -219,7 +221,7 @@ - (OSStatus)activateBinding:(EventHotKeyID)hkCom isRepeat:(BOOL)isRepeat {
EventHotKeyRef myHotKeyRef;
myHotKeyID.signature = *[[NSString stringWithFormat:@"hotkey%li",i] cStringUsingEncoding:NSASCIIStringEncoding];
myHotKeyID.id = (UInt32)i;
RegisterEventHotKey([binding keyCode], [binding modifiers], myHotKeyID, GetEventMonitorTarget(), 0, &myHotKeyRef);
RegisterEventHotKey([binding keyCode], 0, myHotKeyID, GetEventMonitorTarget(), 0, &myHotKeyRef);
[binding setHotKeyRef:myHotKeyRef];
[[self currentModalHotKeyRefs] addObject:[NSValue valueWithPointer:myHotKeyRef]];
i++;
Expand Down
4 changes: 2 additions & 2 deletions Slate/SlateConfig.m
Original file line number Diff line number Diff line change
Expand Up @@ -242,10 +242,10 @@ - (BOOL)append:(NSString *)configString {
SlateLogger(@" LoadingB: %@",line);
Binding *bind = [[Binding alloc] initWithString:line];
if ([bind modalKey] != nil) {
NSMutableArray *theBindings = [modalBindings objectForKey:[bind modalKey]];
NSMutableArray *theBindings = [modalBindings objectForKey:[bind modalHashKey]];
if (theBindings == nil) theBindings = [NSMutableArray array];
[theBindings addObject:bind];
[modalBindings setObject:theBindings forKey:[bind modalKey]];
[modalBindings setObject:theBindings forKey:[bind modalHashKey]];
} else {
[bindings addObject:bind];
}
Expand Down

0 comments on commit 0dbbd67

Please sign in to comment.