Skip to content

Commit a88e278

Browse files
committed
MNT: Change if blocks from negated OR to XOR and handle shift key
- This updates the if conditional to use XOR logic instead of the two negated and/or conditions. - It also handles the shift modifier when combined with other modifier keys, as before (ctrl + shift + cmd) would have not printed out the middle shift.
1 parent f00a204 commit a88e278

File tree

1 file changed

+48
-32
lines changed

1 file changed

+48
-32
lines changed

src/_macosx.m

Lines changed: 48 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -1637,23 +1637,44 @@ - (const char*)convertKeyEvent:(NSEvent*)event
16371637
];
16381638

16391639
NSMutableString* returnkey = [NSMutableString string];
1640-
if ([event modifierFlags] & NSEventModifierFlagControl) {
1641-
[returnkey appendString:@"ctrl+" ];
1642-
}
1643-
if ([event modifierFlags] & NSEventModifierFlagOption) {
1640+
if (keyChangeControl) {
1641+
// When control is the key that was pressed, return the full word
1642+
[returnkey appendString:@"control+"];
1643+
} else if (([event modifierFlags] & NSEventModifierFlagControl)) {
1644+
// If control is already pressed, return the shortened version
1645+
[returnkey appendString:@"ctrl+"];
1646+
}
1647+
if (([event modifierFlags] & NSEventModifierFlagOption) || keyChangeOption) {
16441648
[returnkey appendString:@"alt+" ];
16451649
}
1646-
if ([event modifierFlags] & NSEventModifierFlagCommand) {
1650+
if (([event modifierFlags] & NSEventModifierFlagCommand) || keyChangeCommand) {
16471651
[returnkey appendString:@"cmd+" ];
16481652
}
1653+
// Don't print caps_lock unless it was the key that got pressed
1654+
if (keyChangeCapsLock) {
1655+
[returnkey appendString:@"caps_lock+" ];
1656+
}
16491657

1650-
unichar uc = [[event charactersIgnoringModifiers] characterAtIndex:0];
1651-
NSString* specialchar = [specialkeymappings objectForKey:[NSNumber numberWithUnsignedLong:uc]];
1652-
if (specialchar) {
1653-
if ([event modifierFlags] & NSEventModifierFlagShift) {
1654-
[returnkey appendString:@"shift+" ];
1658+
// flagsChanged event can't handle charactersIgnoringModifiers
1659+
// because it was a modifier key that was pressed/released
1660+
if (event.type != NSEventTypeFlagsChanged) {
1661+
unichar uc = [[event charactersIgnoringModifiers] characterAtIndex:0];
1662+
NSString *specialchar = [specialkeymappings objectForKey:[NSNumber numberWithUnsignedLong:uc]];
1663+
if (specialchar) {
1664+
if (([event modifierFlags] & NSEventModifierFlagShift) || keyChangeShift) {
1665+
[returnkey appendString:@"shift+"];
1666+
}
1667+
[returnkey appendString:specialchar];
1668+
} else {
1669+
[returnkey appendString:[event charactersIgnoringModifiers]];
16551670
}
1656-
[returnkey appendString:specialchar];
1671+
} else {
1672+
if (([event modifierFlags] & NSEventModifierFlagShift) || keyChangeShift) {
1673+
[returnkey appendString:@"shift+"];
1674+
}
1675+
// Since it was a modifier event trim the final character of the string
1676+
// because we added in "+" earlier
1677+
[returnkey setString: [returnkey substringToIndex:[returnkey length] - 1]];
16571678
}
16581679

16591680
return [returnkey UTF8String];
@@ -1727,52 +1748,47 @@ - (BOOL)acceptsFirstResponder
17271748
// so we need to handle both cases here
17281749
- (void)flagsChanged:(NSEvent *)event
17291750
{
1730-
bool isPress = false; // true if key is pressed, false is released
1731-
if ((([event modifierFlags] & NSEventModifierFlagCommand) && !lastCommand) ||
1732-
(!([event modifierFlags] & NSEventModifierFlagCommand) && lastCommand)) {
1751+
bool isPress = false; // true if key is pressed, false if key was released
1752+
1753+
// Each if clause tests the two cases for each of the keys we can handle
1754+
// 1. If the modifier flag "command key" is pressed and it was not previously
1755+
// 2. If the modifier flag "command key" is not pressed and it was previously
1756+
// !! converts the result of the bitwise & operator to a logical boolean,
1757+
// which allows us to then bitwise xor (^) the result with a boolean (lastCommand).
1758+
if (!!([event modifierFlags] & NSEventModifierFlagCommand) ^ lastCommand) {
17331759
// Command pressed/released
17341760
lastCommand = !lastCommand;
17351761
keyChangeCommand = true;
17361762
isPress = lastCommand;
1737-
}
1738-
else if ((([event modifierFlags] & NSEventModifierFlagControl) && !lastControl) ||
1739-
(!([event modifierFlags] & NSEventModifierFlagControl) && lastControl)) {
1763+
} else if (!!([event modifierFlags] & NSEventModifierFlagControl) ^ lastControl) {
17401764
// Control pressed/released
17411765
lastControl = !lastControl;
17421766
keyChangeControl = true;
17431767
isPress = lastControl;
1744-
}
1745-
else if ((([event modifierFlags] & NSEventModifierFlagShift) && !lastShift) ||
1746-
(!([event modifierFlags] & NSEventModifierFlagShift) && lastShift)) {
1768+
} else if (!!([event modifierFlags] & NSEventModifierFlagShift) ^ lastShift) {
17471769
// Shift pressed/released
17481770
lastShift = !lastShift;
17491771
keyChangeShift = true;
17501772
isPress = lastShift;
1751-
}
1752-
else if ((([event modifierFlags] & NSEventModifierFlagOption) && !lastOption) ||
1753-
(!([event modifierFlags] & NSEventModifierFlagOption) && lastOption)) {
1773+
} else if (!!([event modifierFlags] & NSEventModifierFlagOption) ^ lastOption) {
17541774
// Option pressed/released
17551775
lastOption = !lastOption;
17561776
keyChangeOption = true;
17571777
isPress = lastOption;
1758-
}
1759-
else if ((([event modifierFlags] & NSEventModifierFlagCapsLock) && !lastCapsLock) ||
1760-
(!([event modifierFlags] & NSEventModifierFlagCapsLock) && lastCapsLock)) {
1778+
} else if (!!([event modifierFlags] & NSEventModifierFlagCapsLock) ^ lastCapsLock) {
17611779
// Capslock pressed/released
17621780
lastCapsLock = !lastCapsLock;
17631781
keyChangeCapsLock = true;
17641782
isPress = lastCapsLock;
1765-
}
1766-
else{
1783+
} else {
17671784
// flag we don't handle
17681785
return;
17691786
}
17701787

17711788
if (isPress) {
1772-
[self keyDown: event];
1773-
}
1774-
else {
1775-
[self keyUp: event];
1789+
[self keyDown:event];
1790+
} else {
1791+
[self keyUp:event];
17761792
}
17771793

17781794
// Reset the state for the key changes after handling the event

0 commit comments

Comments
 (0)