@@ -1637,23 +1637,44 @@ - (const char*)convertKeyEvent:(NSEvent*)event
1637
1637
];
1638
1638
1639
1639
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) {
1644
1648
[returnkey appendString: @" alt+" ];
1645
1649
}
1646
- if ([event modifierFlags ] & NSEventModifierFlagCommand) {
1650
+ if (( [event modifierFlags ] & NSEventModifierFlagCommand) || keyChangeCommand ) {
1647
1651
[returnkey appendString: @" cmd+" ];
1648
1652
}
1653
+ // Don't print caps_lock unless it was the key that got pressed
1654
+ if (keyChangeCapsLock) {
1655
+ [returnkey appendString: @" caps_lock+" ];
1656
+ }
1649
1657
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 ]];
1655
1670
}
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 ]];
1657
1678
}
1658
1679
1659
1680
return [returnkey UTF8String ];
@@ -1727,52 +1748,47 @@ - (BOOL)acceptsFirstResponder
1727
1748
// so we need to handle both cases here
1728
1749
- (void )flagsChanged : (NSEvent *)event
1729
1750
{
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) {
1733
1759
// Command pressed/released
1734
1760
lastCommand = !lastCommand;
1735
1761
keyChangeCommand = true ;
1736
1762
isPress = lastCommand;
1737
- }
1738
- else if ((([event modifierFlags ] & NSEventModifierFlagControl) && !lastControl) ||
1739
- (!([event modifierFlags ] & NSEventModifierFlagControl) && lastControl)) {
1763
+ } else if (!!([event modifierFlags ] & NSEventModifierFlagControl) ^ lastControl) {
1740
1764
// Control pressed/released
1741
1765
lastControl = !lastControl;
1742
1766
keyChangeControl = true ;
1743
1767
isPress = lastControl;
1744
- }
1745
- else if ((([event modifierFlags ] & NSEventModifierFlagShift) && !lastShift) ||
1746
- (!([event modifierFlags ] & NSEventModifierFlagShift) && lastShift)) {
1768
+ } else if (!!([event modifierFlags ] & NSEventModifierFlagShift) ^ lastShift) {
1747
1769
// Shift pressed/released
1748
1770
lastShift = !lastShift;
1749
1771
keyChangeShift = true ;
1750
1772
isPress = lastShift;
1751
- }
1752
- else if ((([event modifierFlags ] & NSEventModifierFlagOption) && !lastOption) ||
1753
- (!([event modifierFlags ] & NSEventModifierFlagOption) && lastOption)) {
1773
+ } else if (!!([event modifierFlags ] & NSEventModifierFlagOption) ^ lastOption) {
1754
1774
// Option pressed/released
1755
1775
lastOption = !lastOption;
1756
1776
keyChangeOption = true ;
1757
1777
isPress = lastOption;
1758
- }
1759
- else if ((([event modifierFlags ] & NSEventModifierFlagCapsLock) && !lastCapsLock) ||
1760
- (!([event modifierFlags ] & NSEventModifierFlagCapsLock) && lastCapsLock)) {
1778
+ } else if (!!([event modifierFlags ] & NSEventModifierFlagCapsLock) ^ lastCapsLock) {
1761
1779
// Capslock pressed/released
1762
1780
lastCapsLock = !lastCapsLock;
1763
1781
keyChangeCapsLock = true ;
1764
1782
isPress = lastCapsLock;
1765
- }
1766
- else {
1783
+ } else {
1767
1784
// flag we don't handle
1768
1785
return ;
1769
1786
}
1770
1787
1771
1788
if (isPress) {
1772
- [self keyDown: event];
1773
- }
1774
- else {
1775
- [self keyUp: event];
1789
+ [self keyDown: event];
1790
+ } else {
1791
+ [self keyUp: event];
1776
1792
}
1777
1793
1778
1794
// Reset the state for the key changes after handling the event
0 commit comments