Skip to content

Commit 434dd36

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 f61ebba commit 434dd36

File tree

1 file changed

+42
-30
lines changed

1 file changed

+42
-30
lines changed

src/_macosx.m

Lines changed: 42 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -1936,23 +1936,40 @@ - (const char*)convertKeyEvent:(NSEvent*)event
19361936
];
19371937

19381938
NSMutableString* returnkey = [NSMutableString string];
1939-
if ([event modifierFlags] & NSEventModifierFlagControl) {
1939+
if (([event modifierFlags] & NSEventModifierFlagControl) || keyChangeControl) {
19401940
[returnkey appendString:@"ctrl+" ];
19411941
}
1942-
if ([event modifierFlags] & NSEventModifierFlagOption) {
1942+
if (([event modifierFlags] & NSEventModifierFlagOption) || keyChangeOption) {
19431943
[returnkey appendString:@"alt+" ];
19441944
}
1945-
if ([event modifierFlags] & NSEventModifierFlagCommand) {
1945+
if (([event modifierFlags] & NSEventModifierFlagCommand) || keyChangeCommand) {
19461946
[returnkey appendString:@"cmd+" ];
19471947
}
1948+
// Don't print caps_lock unless it was the key that got pressed
1949+
if (keyChangeCapsLock) {
1950+
[returnkey appendString:@"caps_lock+" ];
1951+
}
19481952

1949-
unichar uc = [[event charactersIgnoringModifiers] characterAtIndex:0];
1950-
NSString* specialchar = [specialkeymappings objectForKey:[NSNumber numberWithUnsignedLong:uc]];
1951-
if (specialchar) {
1952-
if ([event modifierFlags] & NSEventModifierFlagShift) {
1953-
[returnkey appendString:@"shift+" ];
1953+
// flagsChanged event can't handle charactersIgnoringModifiers
1954+
// because it was a modifier key that was pressed/released
1955+
if (event.type != NSEventTypeFlagsChanged) {
1956+
unichar uc = [[event charactersIgnoringModifiers] characterAtIndex:0];
1957+
NSString *specialchar = [specialkeymappings objectForKey:[NSNumber numberWithUnsignedLong:uc]];
1958+
if (specialchar) {
1959+
if (([event modifierFlags] & NSEventModifierFlagShift) || keyChangeShift) {
1960+
[returnkey appendString:@"shift+"];
1961+
}
1962+
[returnkey appendString:specialchar];
1963+
} else {
1964+
[returnkey appendString:[event charactersIgnoringModifiers]];
1965+
}
1966+
} else {
1967+
if (([event modifierFlags] & NSEventModifierFlagShift) || keyChangeShift) {
1968+
[returnkey appendString:@"shift+"];
19541969
}
1955-
[returnkey appendString:specialchar];
1970+
// Since it was a modifier event trim the final character of the string
1971+
// because we added in "+" earlier
1972+
returnkey = [returnkey substringToIndex:[returnkey length] - 1];
19561973
}
19571974

19581975
return [returnkey UTF8String];
@@ -2026,52 +2043,47 @@ - (BOOL)acceptsFirstResponder
20262043
// so we need to handle both cases here
20272044
- (void)flagsChanged:(NSEvent *)event
20282045
{
2029-
bool isPress = false; // true if key is pressed, false is released
2030-
if ((([event modifierFlags] & NSEventModifierFlagCommand) && !lastCommand) ||
2031-
(!([event modifierFlags] & NSEventModifierFlagCommand) && lastCommand)) {
2046+
bool isPress = false; // true if key is pressed, false if key was released
2047+
2048+
// Each if clause tests the two cases for each of the keys we can handle
2049+
// 1. If the modifier flag "command key" is pressed and it was not previously
2050+
// 2. If the modifier flag "command key" is not pressed and it was previously
2051+
// !! converts the result of the bitwise & operator to a logical boolean,
2052+
// which allows us to then bitwise xor (^) the result with a boolean (lastCommand).
2053+
if (!!([event modifierFlags] & NSEventModifierFlagCommand) ^ lastCommand) {
20322054
// Command pressed/released
20332055
lastCommand = !lastCommand;
20342056
keyChangeCommand = true;
20352057
isPress = lastCommand;
2036-
}
2037-
else if ((([event modifierFlags] & NSEventModifierFlagControl) && !lastControl) ||
2038-
(!([event modifierFlags] & NSEventModifierFlagControl) && lastControl)) {
2058+
} else if (!!([event modifierFlags] & NSEventModifierFlagControl) ^ lastControl) {
20392059
// Control pressed/released
20402060
lastControl = !lastControl;
20412061
keyChangeControl = true;
20422062
isPress = lastControl;
2043-
}
2044-
else if ((([event modifierFlags] & NSEventModifierFlagShift) && !lastShift) ||
2045-
(!([event modifierFlags] & NSEventModifierFlagShift) && lastShift)) {
2063+
} else if (!!([event modifierFlags] & NSEventModifierFlagShift) ^ lastShift) {
20462064
// Shift pressed/released
20472065
lastShift = !lastShift;
20482066
keyChangeShift = true;
20492067
isPress = lastShift;
2050-
}
2051-
else if ((([event modifierFlags] & NSEventModifierFlagOption) && !lastOption) ||
2052-
(!([event modifierFlags] & NSEventModifierFlagOption) && lastOption)) {
2068+
} else if (!!([event modifierFlags] & NSEventModifierFlagOption) ^ lastOption) {
20532069
// Option pressed/released
20542070
lastOption = !lastOption;
20552071
keyChangeOption = true;
20562072
isPress = lastOption;
2057-
}
2058-
else if ((([event modifierFlags] & NSEventModifierFlagCapsLock) && !lastCapsLock) ||
2059-
(!([event modifierFlags] & NSEventModifierFlagCapsLock) && lastCapsLock)) {
2073+
} else if (!!([event modifierFlags] & NSEventModifierFlagCapsLock) ^ lastCapsLock) {
20602074
// Capslock pressed/released
20612075
lastCapsLock = !lastCapsLock;
20622076
keyChangeCapsLock = true;
20632077
isPress = lastCapsLock;
2064-
}
2065-
else{
2078+
} else {
20662079
// flag we don't handle
20672080
return;
20682081
}
20692082

20702083
if (isPress) {
2071-
[self keyDown: event];
2072-
}
2073-
else {
2074-
[self keyUp: event];
2084+
[self keyDown:event];
2085+
} else {
2086+
[self keyUp:event];
20752087
}
20762088

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

0 commit comments

Comments
 (0)