Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 52ef7d7

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 3ff87cf commit 52ef7d7

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
@@ -1824,23 +1824,40 @@ - (const char*)convertKeyEvent:(NSEvent*)event
18241824
];
18251825

18261826
NSMutableString* returnkey = [NSMutableString string];
1827-
if ([event modifierFlags] & NSEventModifierFlagControl) {
1827+
if (([event modifierFlags] & NSEventModifierFlagControl) || keyChangeControl) {
18281828
[returnkey appendString:@"ctrl+" ];
18291829
}
1830-
if ([event modifierFlags] & NSEventModifierFlagOption) {
1830+
if (([event modifierFlags] & NSEventModifierFlagOption) || keyChangeOption) {
18311831
[returnkey appendString:@"alt+" ];
18321832
}
1833-
if ([event modifierFlags] & NSEventModifierFlagCommand) {
1833+
if (([event modifierFlags] & NSEventModifierFlagCommand) || keyChangeCommand) {
18341834
[returnkey appendString:@"cmd+" ];
18351835
}
1836+
// Don't print caps_lock unless it was the key that got pressed
1837+
if (keyChangeCapsLock) {
1838+
[returnkey appendString:@"caps_lock+" ];
1839+
}
18361840

1837-
unichar uc = [[event charactersIgnoringModifiers] characterAtIndex:0];
1838-
NSString* specialchar = [specialkeymappings objectForKey:[NSNumber numberWithUnsignedLong:uc]];
1839-
if (specialchar) {
1840-
if ([event modifierFlags] & NSEventModifierFlagShift) {
1841-
[returnkey appendString:@"shift+" ];
1841+
// flagsChanged event can't handle charactersIgnoringModifiers
1842+
// because it was a modifier key that was pressed/released
1843+
if (event.type != NSEventTypeFlagsChanged) {
1844+
unichar uc = [[event charactersIgnoringModifiers] characterAtIndex:0];
1845+
NSString *specialchar = [specialkeymappings objectForKey:[NSNumber numberWithUnsignedLong:uc]];
1846+
if (specialchar) {
1847+
if (([event modifierFlags] & NSEventModifierFlagShift) || keyChangeShift) {
1848+
[returnkey appendString:@"shift+"];
1849+
}
1850+
[returnkey appendString:specialchar];
1851+
} else {
1852+
[returnkey appendString:[event charactersIgnoringModifiers]];
1853+
}
1854+
} else {
1855+
if (([event modifierFlags] & NSEventModifierFlagShift) || keyChangeShift) {
1856+
[returnkey appendString:@"shift+"];
18421857
}
1843-
[returnkey appendString:specialchar];
1858+
// Since it was a modifier event trim the final character of the string
1859+
// because we added in "+" earlier
1860+
returnkey = [returnkey substringToIndex:[returnkey length] - 1];
18441861
}
18451862

18461863
return [returnkey UTF8String];
@@ -1914,52 +1931,47 @@ - (BOOL)acceptsFirstResponder
19141931
// so we need to handle both cases here
19151932
- (void)flagsChanged:(NSEvent *)event
19161933
{
1917-
bool isPress = false; // true if key is pressed, false is released
1918-
if ((([event modifierFlags] & NSEventModifierFlagCommand) && !lastCommand) ||
1919-
(!([event modifierFlags] & NSEventModifierFlagCommand) && lastCommand)) {
1934+
bool isPress = false; // true if key is pressed, false if key was released
1935+
1936+
// Each if clause tests the two cases for each of the keys we can handle
1937+
// 1. If the modifier flag "command key" is pressed and it was not previously
1938+
// 2. If the modifier flag "command key" is not pressed and it was previously
1939+
// !! converts the result of the bitwise & operator to a logical boolean,
1940+
// which allows us to then bitwise xor (^) the result with a boolean (lastCommand).
1941+
if (!!([event modifierFlags] & NSEventModifierFlagCommand) ^ lastCommand) {
19201942
// Command pressed/released
19211943
lastCommand = !lastCommand;
19221944
keyChangeCommand = true;
19231945
isPress = lastCommand;
1924-
}
1925-
else if ((([event modifierFlags] & NSEventModifierFlagControl) && !lastControl) ||
1926-
(!([event modifierFlags] & NSEventModifierFlagControl) && lastControl)) {
1946+
} else if (!!([event modifierFlags] & NSEventModifierFlagControl) ^ lastControl) {
19271947
// Control pressed/released
19281948
lastControl = !lastControl;
19291949
keyChangeControl = true;
19301950
isPress = lastControl;
1931-
}
1932-
else if ((([event modifierFlags] & NSEventModifierFlagShift) && !lastShift) ||
1933-
(!([event modifierFlags] & NSEventModifierFlagShift) && lastShift)) {
1951+
} else if (!!([event modifierFlags] & NSEventModifierFlagShift) ^ lastShift) {
19341952
// Shift pressed/released
19351953
lastShift = !lastShift;
19361954
keyChangeShift = true;
19371955
isPress = lastShift;
1938-
}
1939-
else if ((([event modifierFlags] & NSEventModifierFlagOption) && !lastOption) ||
1940-
(!([event modifierFlags] & NSEventModifierFlagOption) && lastOption)) {
1956+
} else if (!!([event modifierFlags] & NSEventModifierFlagOption) ^ lastOption) {
19411957
// Option pressed/released
19421958
lastOption = !lastOption;
19431959
keyChangeOption = true;
19441960
isPress = lastOption;
1945-
}
1946-
else if ((([event modifierFlags] & NSEventModifierFlagCapsLock) && !lastCapsLock) ||
1947-
(!([event modifierFlags] & NSEventModifierFlagCapsLock) && lastCapsLock)) {
1961+
} else if (!!([event modifierFlags] & NSEventModifierFlagCapsLock) ^ lastCapsLock) {
19481962
// Capslock pressed/released
19491963
lastCapsLock = !lastCapsLock;
19501964
keyChangeCapsLock = true;
19511965
isPress = lastCapsLock;
1952-
}
1953-
else{
1966+
} else {
19541967
// flag we don't handle
19551968
return;
19561969
}
19571970

19581971
if (isPress) {
1959-
[self keyDown: event];
1960-
}
1961-
else {
1962-
[self keyUp: event];
1972+
[self keyDown:event];
1973+
} else {
1974+
[self keyUp:event];
19631975
}
19641976

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

0 commit comments

Comments
 (0)