@@ -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