@@ -1643,177 +1643,38 @@ - (BOOL)performDragOperation:(id <NSDraggingInfo>)sender
1643
1643
#pragma mark - Keyboard Events
1644
1644
1645
1645
#if TARGET_OS_OSX
1646
- NSString * const leftArrowPressKey = @" ArrowLeft" ;
1647
- NSString * const rightArrowPressKey = @" ArrowRight" ;
1648
- NSString * const upArrowPressKey = @" ArrowUp" ;
1649
- NSString * const downArrowPressKey = @" ArrowDown" ;
1650
-
1651
- - (RCTViewKeyboardEvent*)keyboardEvent:(NSEvent *)event downPress:(BOOL )downPress {
1652
- // modifiers
1653
- BOOL capsLockKey = NO ;
1654
- BOOL shiftKey = NO ;
1655
- BOOL controlKey = NO ;
1656
- BOOL optionKey = NO ;
1657
- BOOL commandKey = NO ;
1658
- BOOL numericPadKey = NO ;
1659
- BOOL helpKey = NO ;
1660
- BOOL functionKey = NO ;
1661
- // commonly used key short-cuts
1662
- BOOL leftArrowKey = NO ;
1663
- BOOL rightArrowKey = NO ;
1664
- BOOL upArrowKey = NO ;
1665
- BOOL downArrowKey = NO ;
1666
- BOOL tabKeyPressed = NO ;
1667
- BOOL escapeKeyPressed = NO ;
1668
- NSString *key = event.charactersIgnoringModifiers ;
1669
- if ([key length ] == 0 ) {
1670
- return nil ;
1671
- }
1672
- unichar const code = [key characterAtIndex: 0 ];
1673
-
1674
- // detect arrow key presses
1675
- if (code == NSLeftArrowFunctionKey) {
1676
- leftArrowKey = YES ;
1677
- } else if (code == NSRightArrowFunctionKey) {
1678
- rightArrowKey = YES ;
1679
- } else if (code == NSUpArrowFunctionKey) {
1680
- upArrowKey = YES ;
1681
- } else if (code == NSDownArrowFunctionKey) {
1682
- downArrowKey = YES ;
1683
- }
1684
-
1685
- // detect special key presses via the key code
1686
- switch (event.keyCode ) {
1687
- case 48 : // Tab
1688
- tabKeyPressed = YES ;
1689
- break ;
1690
- case 53 : // Escape
1691
- escapeKeyPressed = YES ;
1692
- break ;
1693
- default :
1694
- break ;
1646
+ - (RCTViewKeyboardEvent*)keyboardEvent:(NSEvent *)event {
1647
+ BOOL keyDown = event.type == NSEventTypeKeyDown;
1648
+ NSArray <NSString *> *validKeys = keyDown ? self.validKeysDown : self.validKeysUp ;
1649
+ NSString *key = [RCTViewKeyboardEvent keyFromEvent: event];
1650
+
1651
+ // Only post events for keys we care about
1652
+ if (![validKeys containsObject: key]) {
1653
+ return nil ;
1695
1654
}
1696
1655
1697
- // detect modifier flags
1698
- if (event.modifierFlags & NSEventModifierFlagCapsLock) {
1699
- capsLockKey = YES ;
1700
- } else if (event.modifierFlags & NSEventModifierFlagShift) {
1701
- shiftKey = YES ;
1702
- } else if (event.modifierFlags & NSEventModifierFlagControl) {
1703
- controlKey = YES ;
1704
- } else if (event.modifierFlags & NSEventModifierFlagOption) {
1705
- optionKey = YES ;
1706
- } else if (event.modifierFlags & NSEventModifierFlagCommand) {
1707
- commandKey = YES ;
1708
- } else if (event.modifierFlags & NSEventModifierFlagNumericPad) {
1709
- numericPadKey = YES ;
1710
- } else if (event.modifierFlags & NSEventModifierFlagHelp) {
1711
- helpKey = YES ;
1712
- } else if (event.modifierFlags & NSEventModifierFlagFunction) {
1713
- functionKey = YES ;
1714
- }
1715
-
1716
- RCTViewKeyboardEvent *keyboardEvent = nil ;
1717
- // only post events for keys we care about
1718
- if (downPress) {
1719
- NSString *keyToReturn = [self keyIsValid: key left: leftArrowKey right: rightArrowKey up: upArrowKey down: downArrowKey tabKey: tabKeyPressed escapeKey: escapeKeyPressed validKeys: [self validKeysDown ]];
1720
- if (keyToReturn != nil ) {
1721
- keyboardEvent = [RCTViewKeyboardEvent keyDownEventWithReactTag: self .reactTag
1722
- capsLockKey: capsLockKey
1723
- shiftKey: shiftKey
1724
- ctrlKey: controlKey
1725
- altKey: optionKey
1726
- metaKey: commandKey
1727
- numericPadKey: numericPadKey
1728
- helpKey: helpKey
1729
- functionKey: functionKey
1730
- leftArrowKey: leftArrowKey
1731
- rightArrowKey: rightArrowKey
1732
- upArrowKey: upArrowKey
1733
- downArrowKey: downArrowKey
1734
- key: keyToReturn];
1735
- }
1736
- } else {
1737
- NSString *keyToReturn = [self keyIsValid: key left: leftArrowKey right: rightArrowKey up: upArrowKey down: downArrowKey tabKey: tabKeyPressed escapeKey: escapeKeyPressed validKeys: [self validKeysUp ]];
1738
- if (keyToReturn != nil ) {
1739
- keyboardEvent = [RCTViewKeyboardEvent keyUpEventWithReactTag: self .reactTag
1740
- capsLockKey: capsLockKey
1741
- shiftKey: shiftKey
1742
- ctrlKey: controlKey
1743
- altKey: optionKey
1744
- metaKey: commandKey
1745
- numericPadKey: numericPadKey
1746
- helpKey: helpKey
1747
- functionKey: functionKey
1748
- leftArrowKey: leftArrowKey
1749
- rightArrowKey: rightArrowKey
1750
- upArrowKey: upArrowKey
1751
- downArrowKey: downArrowKey
1752
- key: keyToReturn];
1656
+ return [RCTViewKeyboardEvent keyEventFromEvent: event reactTag: self .reactTag];
1657
+ }
1658
+
1659
+ - (BOOL )handleKeyboardEvent:(NSEvent *)event {
1660
+ if (event.type == NSEventTypeKeyDown ? self.onKeyDown : self.onKeyUp ) {
1661
+ RCTViewKeyboardEvent *keyboardEvent = [self keyboardEvent: event];
1662
+ if (keyboardEvent) {
1663
+ [_eventDispatcher sendEvent: keyboardEvent];
1664
+ return YES ;
1753
1665
}
1754
1666
}
1755
- return keyboardEvent;
1756
- }
1757
-
1758
- // check if the user typed key matches a key we need to send an event for
1759
- // translate key codes over to JS compatible keys
1760
- - (NSString *)keyIsValid:(NSString *)key left:(BOOL )leftArrowPressed right:(BOOL )rightArrowPressed up:(BOOL )upArrowPressed down:(BOOL )downArrowPressed tabKey:(BOOL )tabKeyPressed escapeKey:(BOOL )escapeKeyPressed validKeys:(NSArray <NSString *>*)validKeys {
1761
- NSString *keyToReturn = key;
1762
-
1763
- // Allow the flexibility of defining special keys in multiple ways
1764
- BOOL enterKeyValidityCheck = [key isEqualToString: @" \r " ] && ([validKeys containsObject: @" Enter" ] || [validKeys containsObject: @" \r " ]);
1765
- BOOL tabKeyValidityCheck = tabKeyPressed && ([validKeys containsObject: @" Tab" ]); // tab has to be checked via a key code so we can't just use the key itself here
1766
- BOOL escapeKeyValidityCheck = escapeKeyPressed && ([validKeys containsObject: @" Esc" ] || [validKeys containsObject: @" Escape" ]); // escape has to be checked via a key code so we can't just use the key itself here
1767
- BOOL leftArrowValidityCheck = [validKeys containsObject: leftArrowPressKey] && leftArrowPressed;
1768
- BOOL rightArrowValidityCheck = [validKeys containsObject: rightArrowPressKey] && rightArrowPressed;
1769
- BOOL upArrowValidityCheck = [validKeys containsObject: upArrowPressKey] && upArrowPressed;
1770
- BOOL downArrowValidityCheck = [validKeys containsObject: downArrowPressKey] && downArrowPressed;
1771
-
1772
- if (tabKeyValidityCheck) {
1773
- keyToReturn = @" Tab" ;
1774
- } else if (escapeKeyValidityCheck) {
1775
- keyToReturn = @" Escape" ;
1776
- } else if (enterKeyValidityCheck) {
1777
- keyToReturn = @" Enter" ;
1778
- } else if (leftArrowValidityCheck) {
1779
- keyToReturn = leftArrowPressKey;
1780
- } else if (rightArrowValidityCheck) {
1781
- keyToReturn = rightArrowPressKey;
1782
- } else if (upArrowValidityCheck) {
1783
- keyToReturn = upArrowPressKey;
1784
- } else if (downArrowValidityCheck) {
1785
- keyToReturn = downArrowPressKey;
1786
- } else if (![validKeys containsObject: key]) {
1787
- keyToReturn = nil ;
1788
- }
1789
-
1790
- return keyToReturn;
1667
+ return NO ;
1791
1668
}
1792
1669
1793
1670
- (void )keyDown:(NSEvent *)event {
1794
- if (self.onKeyDown == nil ) {
1795
- [super keyDown: event];
1796
- return ;
1797
- }
1798
-
1799
- RCTViewKeyboardEvent *keyboardEvent = [self keyboardEvent: event downPress: YES ];
1800
- if (keyboardEvent != nil ) {
1801
- [_eventDispatcher sendEvent: keyboardEvent];
1802
- } else {
1671
+ if (![self handleKeyboardEvent: event]) {
1803
1672
[super keyDown: event];
1804
1673
}
1805
1674
}
1806
1675
1807
1676
- (void )keyUp:(NSEvent *)event {
1808
- if (self.onKeyUp == nil ) {
1809
- [super keyUp: event];
1810
- return ;
1811
- }
1812
-
1813
- RCTViewKeyboardEvent *keyboardEvent = [self keyboardEvent: event downPress: NO ];
1814
- if (keyboardEvent != nil ) {
1815
- [_eventDispatcher sendEvent: keyboardEvent];
1816
- } else {
1677
+ if (![self handleKeyboardEvent: event]) {
1817
1678
[super keyUp: event];
1818
1679
}
1819
1680
}
0 commit comments