Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Make Fn key work #135

Open
wants to merge 6 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions Sources/ShortcutRecorder/SRCommon.m
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@
SRModifierFlagString const SRModifierFlagStringOption = @"⌥";
SRModifierFlagString const SRModifierFlagStringShift = @"⇧";
SRModifierFlagString const SRModifierFlagStringControl = @"⌃";
SRModifierFlagString const SRModifierFlagStringFunction = @"fn";


NSBundle *SRBundle()
Expand Down
6 changes: 6 additions & 0 deletions Sources/ShortcutRecorder/SRKeyBindingTransformer.m
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,9 @@ - (SRShortcut *)transformedValue:(NSString *)aValue

if ([modifierFlagsString containsString:@"@"])
modifierFlags |= NSEventModifierFlagCommand;

if ([modifierFlagsString containsString:@"_"])
modifierFlags |= NSEventModifierFlagFunction;

keyCodeString = keyCodeString.lowercaseString;
NSNumber *keyCode = [SRASCIISymbolicKeyCodeTransformer.sharedTransformer reverseTransformedValue:keyCodeString];
Expand Down Expand Up @@ -214,6 +217,9 @@ - (NSString *)reverseTransformedValue:(SRShortcut *)aValue

if (modifierFlagsValue & NSEventModifierFlagCommand)
[keyBinding appendString:@"@"];

if (modifierFlagsValue & NSEventModifierFlagFunction)
[keyBinding appendString:@"_"];

if (isNumPad)
[keyBinding appendString:@"#"];
Expand Down
44 changes: 27 additions & 17 deletions Sources/ShortcutRecorder/SRModifierFlagsTransformer.m
Original file line number Diff line number Diff line change
Expand Up @@ -107,6 +107,9 @@ - (NSString *)transformedValue:(NSNumber *)aValue layoutDirection:(NSUserInterfa

if (flags & NSEventModifierFlagCommand)
[flagsStringComponents addObject:SRLoc(@"Command")];

if (flags & NSEventModifierFlagFunction)
[flagsStringComponents addObject:SRLoc(@"Function")];

if (aDirection == NSUserInterfaceLayoutDirectionRightToLeft)
return [[[flagsStringComponents reverseObjectEnumerator] allObjects] componentsJoinedByString:SRLoc(@"-")];
Expand Down Expand Up @@ -146,7 +149,10 @@ - (NSString *)transformedValue:(NSNumber *)aValue layoutDirection:(NSUserInterfa

NSEventModifierFlags flags = aValue.unsignedIntegerValue;
NSMutableArray<NSString *> *flagsStringFragments = NSMutableArray.array;


if (flags & NSEventModifierFlagFunction)
[flagsStringFragments addObject:SRModifierFlagStringFunction];

if (flags & NSEventModifierFlagControl)
[flagsStringFragments addObject:SRModifierFlagStringControl];

Expand Down Expand Up @@ -174,12 +180,25 @@ - (NSNumber *)reverseTransformedValue:(NSString *)aValue
}

__block NSEventModifierFlags flags = 0;
__block BOOL foundInvalidSubstring = NO;

NSError *error = NULL;
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern: [NSString stringWithFormat: @"(?:%@|%@|%@|%@|%@)", SRModifierFlagStringFunction, SRModifierFlagStringControl, SRModifierFlagStringOption, SRModifierFlagStringShift, SRModifierFlagStringCommand]
options:NSRegularExpressionCaseInsensitive
error:&error];

if (error != NULL) {
NSLog(@"Got an error making a regex: %@", error);
panic("bad modifier transformer regex");
}

[aValue enumerateSubstringsInRange:NSMakeRange(0, aValue.length)
options:NSStringEnumerationByComposedCharacterSequences
usingBlock:^(NSString *substring, NSRange substringRange, NSRange enclosingRange, BOOL *stop)
{
NSArray *matches = [regex matchesInString:aValue
options:0
range:NSMakeRange(0, [aValue length])];

for (NSTextCheckingResult *match in matches) {

NSString *substring = [aValue substringWithRange: [match rangeAtIndex:0]];

if ([substring isEqualToString:SRModifierFlagStringControl] && (flags & NSEventModifierFlagControl) == 0)
flags |= NSEventModifierFlagControl;
else if ([substring isEqualToString:SRModifierFlagStringOption] && (flags & NSEventModifierFlagOption) == 0)
Expand All @@ -188,17 +207,8 @@ - (NSNumber *)reverseTransformedValue:(NSString *)aValue
flags |= NSEventModifierFlagShift;
else if ([substring isEqualToString:SRModifierFlagStringCommand] && (flags & NSEventModifierFlagCommand) == 0)
flags |= NSEventModifierFlagCommand;
else
{
foundInvalidSubstring = YES;
*stop = YES;
}
}];

if (foundInvalidSubstring)
{
os_trace_error("#Error Invalid value for reverse transformation");
return nil;
else if ([substring isEqualToString:SRModifierFlagStringFunction] && (flags & NSEventModifierFlagFunction) == 0)
flags |= NSEventModifierFlagFunction;
}

return @(flags);
Expand Down
6 changes: 4 additions & 2 deletions Sources/ShortcutRecorder/SRRecorderControl.m
Original file line number Diff line number Diff line change
Expand Up @@ -573,7 +573,7 @@ - (BOOL)beginRecording
if (self.pausesGlobalShortcutMonitorWhileRecording)
{
_didPauseGlobalShortcutMonitor = YES;
[SRGlobalShortcutMonitor.sharedMonitor pause];
[SRAXGlobalShortcutMonitor.sharedMonitor pause];
}

NSDictionary *bindingInfo = [self infoForBinding:NSValueBinding];
Expand Down Expand Up @@ -650,7 +650,7 @@ - (void)endRecordingWithObjectValue:(SRShortcut *)anObjectValue
if (_didPauseGlobalShortcutMonitor)
{
_didPauseGlobalShortcutMonitor = NO;
[SRGlobalShortcutMonitor.sharedMonitor resume];
[SRAXGlobalShortcutMonitor.sharedMonitor resume];
}

NSDictionary *bindingInfo = [self infoForBinding:NSValueBinding];
Expand Down Expand Up @@ -1803,6 +1803,8 @@ - (void)flagsChanged:(NSEvent *)anEvent
nextModifierFlags ^= NSEventModifierFlagShift;
else if ((modifierFlags & NSEventModifierFlagControl) && (keyCode == kVK_Control || keyCode == kVK_RightControl))
nextModifierFlags ^= NSEventModifierFlagControl;
else if ((modifierFlags & NSEventModifierFlagFunction) && (keyCode == kVK_Function))
nextModifierFlags ^= NSEventModifierFlagFunction;
else if (modifierFlags == 0 && _lastSeenModifierFlags != 0)
{
SRShortcut *newObjectValue = [SRShortcut shortcutWithCode:SRKeyCodeNone
Expand Down
81 changes: 61 additions & 20 deletions Sources/ShortcutRecorder/SRShortcut.m
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,8 @@ + (instancetype)shortcutWithEvent:(NSEvent *)aKeyboardEvent ignoringCharacters:(
modifierFlags |= NSEventModifierFlagShift;
else if (keyCode == kVK_Control || keyCode == kVK_RightControl)
modifierFlags |= NSEventModifierFlagControl;
else if (keyCode == kVK_Function)
modifierFlags |= NSEventModifierFlagFunction;

keyCode = SRKeyCodeNone;
}
Expand Down Expand Up @@ -134,23 +136,14 @@ + (instancetype)shortcutWithDictionary:(NSDictionary *)aDictionary

+ (instancetype)shortcutWithKeyEquivalent:(NSString *)aKeyEquivalent
{
static NSCharacterSet *PossibleFlags = nil;
static dispatch_once_t OnceToken;
dispatch_once(&OnceToken, ^{
PossibleFlags = [NSCharacterSet characterSetWithCharactersInString:[NSString stringWithFormat:@"%C%C%C%C",
SRModifierFlagGlyphCommand,
SRModifierFlagGlyphOption,
SRModifierFlagGlyphShift,
SRModifierFlagGlyphControl]];
});

NSScanner *parser = [NSScanner scannerWithString:aKeyEquivalent];
parser.caseSensitive = NO;

NSString *modifierFlagsString = @"";
[parser scanCharactersFromSet:PossibleFlags intoString:&modifierFlagsString];
NSString *keyCodeString = [aKeyEquivalent substringFromIndex:parser.scanLocation];

NSString *both = SRSplitKeycodeEquivalent(aKeyEquivalent);

NSArray<NSString *> *splits = [both componentsSeparatedByString:SRSplitKeycodeSeparator];
assert([splits count] == 2);

NSString *modifierFlagsString = splits[0];
NSString *keyCodeString = splits[1];

if (!modifierFlagsString.length && !keyCodeString.length)
return nil;

Expand Down Expand Up @@ -241,6 +234,38 @@ - (NSString *)readableStringRepresentation:(BOOL)isASCII
#pragma clang diagnostic pop
}

- (BOOL) shouldFireForShortcut:(SRShortcut *)shortcut {

if (self.keyCode != SRKeyCodeNone) {
return [self isEqualToShortcut:shortcut];
}

// for a modifier only shortcut, we fire if the incoming shortcut is
// 1. also a modifier only shortcut
// 2. the currently pressed modifiers &'s cleanly with self
// This way, if you have extranious modifiers pressed, we still fire when you hit the target ones.

if (shortcut.keyCode == SRKeyCodeNone) {
if ((self.modifierFlags & shortcut.modifierFlags) == self.modifierFlags) {
return true;
} else {
return false;
}
} else {
return false;
}

}

// for non-modifiers, it's just if the keycode matches.
// for modifiers, it's the key is in the set, it's an up.
- (BOOL) keyBreaksShortcut:(SRKeyCode)keyCode {
if (self.keyCode != SRKeyCodeNone) {
return self.keyCode == keyCode;
} else {
return (SRKeyCodeToCocoaFlag(keyCode) & self.modifierFlags) != 0;
}
}

#pragma mark Equality

Expand Down Expand Up @@ -321,16 +346,30 @@ - (BOOL)isEqualToKeyEquivalent:(NSString *)aKeyEquivalent
NSEventModifierFlagCommand,
NSEventModifierFlagShift,
NSEventModifierFlagOption,
NSEventModifierFlagFunction,
NSEventModifierFlagControl | NSEventModifierFlagCommand,
NSEventModifierFlagControl | NSEventModifierFlagShift,
NSEventModifierFlagControl | NSEventModifierFlagOption,
NSEventModifierFlagControl | NSEventModifierFlagFunction,
NSEventModifierFlagCommand | NSEventModifierFlagShift,
NSEventModifierFlagCommand | NSEventModifierFlagOption,
NSEventModifierFlagCommand | NSEventModifierFlagFunction,
NSEventModifierFlagShift | NSEventModifierFlagOption,
NSEventModifierFlagShift | NSEventModifierFlagFunction,
NSEventModifierFlagOption | NSEventModifierFlagFunction,
NSEventModifierFlagControl | NSEventModifierFlagCommand | NSEventModifierFlagShift,
NSEventModifierFlagControl | NSEventModifierFlagCommand | NSEventModifierFlagOption,
NSEventModifierFlagControl | NSEventModifierFlagCommand | NSEventModifierFlagFunction,
NSEventModifierFlagCommand | NSEventModifierFlagShift | NSEventModifierFlagOption,
NSEventModifierFlagControl | NSEventModifierFlagCommand | NSEventModifierFlagShift | NSEventModifierFlagOption
NSEventModifierFlagCommand | NSEventModifierFlagShift | NSEventModifierFlagFunction,
NSEventModifierFlagShift | NSEventModifierFlagOption | NSEventModifierFlagFunction,
NSEventModifierFlagControl | NSEventModifierFlagCommand | NSEventModifierFlagShift | NSEventModifierFlagOption,
NSEventModifierFlagFunction | NSEventModifierFlagCommand | NSEventModifierFlagShift | NSEventModifierFlagOption,
NSEventModifierFlagControl | NSEventModifierFlagFunction | NSEventModifierFlagShift | NSEventModifierFlagOption,
NSEventModifierFlagControl | NSEventModifierFlagCommand | NSEventModifierFlagFunction | NSEventModifierFlagOption,
NSEventModifierFlagControl | NSEventModifierFlagCommand | NSEventModifierFlagShift | NSEventModifierFlagFunction,
NSEventModifierFlagControl | NSEventModifierFlagCommand | NSEventModifierFlagShift | NSEventModifierFlagOption, NSEventModifierFlagFunction

};
static const size_t PossibleFlagsSize = sizeof(PossibleFlags) / sizeof(NSEventModifierFlags);

Expand Down Expand Up @@ -509,11 +548,12 @@ - (UInt32)carbonModifierFlags
if (!c)
c = [NSString stringWithFormat:@"<%hu>", aKeyCode];

return [NSString stringWithFormat:@"%@%@%@%@%@",
return [NSString stringWithFormat:@"%@%@%@%@%@%@",
(aModifierFlags & NSEventModifierFlagCommand ? SRLoc(@"Command-") : @""),
(aModifierFlags & NSEventModifierFlagOption ? SRLoc(@"Option-") : @""),
(aModifierFlags & NSEventModifierFlagControl ? SRLoc(@"Control-") : @""),
(aModifierFlags & NSEventModifierFlagShift ? SRLoc(@"Shift-") : @""),
(aModifierFlags & NSEventModifierFlagFunction ? SRLoc(@"Fn-") : @""),
c];
}

Expand All @@ -526,11 +566,12 @@ - (UInt32)carbonModifierFlags
if (!c)
c = [NSString stringWithFormat:@"<%hu>", aKeyCode];

return [NSString stringWithFormat:@"%@%@%@%@%@",
return [NSString stringWithFormat:@"%@%@%@%@%@%@",
(aModifierFlags & NSEventModifierFlagCommand ? SRLoc(@"Command-") : @""),
(aModifierFlags & NSEventModifierFlagOption ? SRLoc(@"Option-") : @""),
(aModifierFlags & NSEventModifierFlagControl ? SRLoc(@"Control-") : @""),
(aModifierFlags & NSEventModifierFlagShift ? SRLoc(@"Shift-") : @""),
(aModifierFlags & NSEventModifierFlagFunction ? SRLoc(@"Fn-") : @""),
c];
}

Expand Down
Loading