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