@@ -1824,23 +1824,40 @@ - (const char*)convertKeyEvent:(NSEvent*)event
1824
1824
];
1825
1825
1826
1826
NSMutableString * returnkey = [NSMutableString string ];
1827
- if ([event modifierFlags ] & NSEventModifierFlagControl) {
1827
+ if (( [event modifierFlags ] & NSEventModifierFlagControl) || keyChangeControl ) {
1828
1828
[returnkey appendString: @" ctrl+" ];
1829
1829
}
1830
- if ([event modifierFlags ] & NSEventModifierFlagOption) {
1830
+ if (( [event modifierFlags ] & NSEventModifierFlagOption) || keyChangeOption ) {
1831
1831
[returnkey appendString: @" alt+" ];
1832
1832
}
1833
- if ([event modifierFlags ] & NSEventModifierFlagCommand) {
1833
+ if (( [event modifierFlags ] & NSEventModifierFlagCommand) || keyChangeCommand ) {
1834
1834
[returnkey appendString: @" cmd+" ];
1835
1835
}
1836
+ // Don't print caps_lock unless it was the key that got pressed
1837
+ if (keyChangeCapsLock) {
1838
+ [returnkey appendString: @" caps_lock+" ];
1839
+ }
1836
1840
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+" ];
1842
1857
}
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 ];
1844
1861
}
1845
1862
1846
1863
return [returnkey UTF8String ];
@@ -1914,52 +1931,47 @@ - (BOOL)acceptsFirstResponder
1914
1931
// so we need to handle both cases here
1915
1932
- (void )flagsChanged : (NSEvent *)event
1916
1933
{
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) {
1920
1942
// Command pressed/released
1921
1943
lastCommand = !lastCommand;
1922
1944
keyChangeCommand = true ;
1923
1945
isPress = lastCommand;
1924
- }
1925
- else if ((([event modifierFlags ] & NSEventModifierFlagControl) && !lastControl) ||
1926
- (!([event modifierFlags ] & NSEventModifierFlagControl) && lastControl)) {
1946
+ } else if (!!([event modifierFlags ] & NSEventModifierFlagControl) ^ lastControl) {
1927
1947
// Control pressed/released
1928
1948
lastControl = !lastControl;
1929
1949
keyChangeControl = true ;
1930
1950
isPress = lastControl;
1931
- }
1932
- else if ((([event modifierFlags ] & NSEventModifierFlagShift) && !lastShift) ||
1933
- (!([event modifierFlags ] & NSEventModifierFlagShift) && lastShift)) {
1951
+ } else if (!!([event modifierFlags ] & NSEventModifierFlagShift) ^ lastShift) {
1934
1952
// Shift pressed/released
1935
1953
lastShift = !lastShift;
1936
1954
keyChangeShift = true ;
1937
1955
isPress = lastShift;
1938
- }
1939
- else if ((([event modifierFlags ] & NSEventModifierFlagOption) && !lastOption) ||
1940
- (!([event modifierFlags ] & NSEventModifierFlagOption) && lastOption)) {
1956
+ } else if (!!([event modifierFlags ] & NSEventModifierFlagOption) ^ lastOption) {
1941
1957
// Option pressed/released
1942
1958
lastOption = !lastOption;
1943
1959
keyChangeOption = true ;
1944
1960
isPress = lastOption;
1945
- }
1946
- else if ((([event modifierFlags ] & NSEventModifierFlagCapsLock) && !lastCapsLock) ||
1947
- (!([event modifierFlags ] & NSEventModifierFlagCapsLock) && lastCapsLock)) {
1961
+ } else if (!!([event modifierFlags ] & NSEventModifierFlagCapsLock) ^ lastCapsLock) {
1948
1962
// Capslock pressed/released
1949
1963
lastCapsLock = !lastCapsLock;
1950
1964
keyChangeCapsLock = true ;
1951
1965
isPress = lastCapsLock;
1952
- }
1953
- else {
1966
+ } else {
1954
1967
// flag we don't handle
1955
1968
return ;
1956
1969
}
1957
1970
1958
1971
if (isPress) {
1959
- [self keyDown: event];
1960
- }
1961
- else {
1962
- [self keyUp: event];
1972
+ [self keyDown: event];
1973
+ } else {
1974
+ [self keyUp: event];
1963
1975
}
1964
1976
1965
1977
// Reset the state for the key changes after handling the event
0 commit comments