@@ -1573,177 +1573,38 @@ - (BOOL)performDragOperation:(id <NSDraggingInfo>)sender
1573
1573
#pragma mark - Keyboard Events
1574
1574
1575
1575
#if TARGET_OS_OSX
1576
- NSString * const leftArrowPressKey = @" ArrowLeft" ;
1577
- NSString * const rightArrowPressKey = @" ArrowRight" ;
1578
- NSString * const upArrowPressKey = @" ArrowUp" ;
1579
- NSString * const downArrowPressKey = @" ArrowDown" ;
1580
-
1581
- - (RCTViewKeyboardEvent*)keyboardEvent:(NSEvent *)event downPress:(BOOL )downPress {
1582
- // modifiers
1583
- BOOL capsLockKey = NO ;
1584
- BOOL shiftKey = NO ;
1585
- BOOL controlKey = NO ;
1586
- BOOL optionKey = NO ;
1587
- BOOL commandKey = NO ;
1588
- BOOL numericPadKey = NO ;
1589
- BOOL helpKey = NO ;
1590
- BOOL functionKey = NO ;
1591
- // commonly used key short-cuts
1592
- BOOL leftArrowKey = NO ;
1593
- BOOL rightArrowKey = NO ;
1594
- BOOL upArrowKey = NO ;
1595
- BOOL downArrowKey = NO ;
1596
- BOOL tabKeyPressed = NO ;
1597
- BOOL escapeKeyPressed = NO ;
1598
- NSString *key = event.charactersIgnoringModifiers ;
1599
- if ([key length ] == 0 ) {
1600
- return nil ;
1601
- }
1602
- unichar const code = [key characterAtIndex: 0 ];
1603
-
1604
- // detect arrow key presses
1605
- if (code == NSLeftArrowFunctionKey) {
1606
- leftArrowKey = YES ;
1607
- } else if (code == NSRightArrowFunctionKey) {
1608
- rightArrowKey = YES ;
1609
- } else if (code == NSUpArrowFunctionKey) {
1610
- upArrowKey = YES ;
1611
- } else if (code == NSDownArrowFunctionKey) {
1612
- downArrowKey = YES ;
1613
- }
1614
-
1615
- // detect special key presses via the key code
1616
- switch (event.keyCode ) {
1617
- case 48 : // Tab
1618
- tabKeyPressed = YES ;
1619
- break ;
1620
- case 53 : // Escape
1621
- escapeKeyPressed = YES ;
1622
- break ;
1623
- default :
1624
- break ;
1576
+ - (RCTViewKeyboardEvent*)keyboardEvent:(NSEvent *)event {
1577
+ BOOL keyDown = event.type == NSEventTypeKeyDown;
1578
+ NSArray <NSString *> *validKeys = keyDown ? self.validKeysDown : self.validKeysUp ;
1579
+ NSString *key = [RCTViewKeyboardEvent keyFromEvent: event];
1580
+
1581
+ // Only post events for keys we care about
1582
+ if (![validKeys containsObject: key]) {
1583
+ return nil ;
1625
1584
}
1626
1585
1627
- // detect modifier flags
1628
- if (event.modifierFlags & NSEventModifierFlagCapsLock) {
1629
- capsLockKey = YES ;
1630
- } else if (event.modifierFlags & NSEventModifierFlagShift) {
1631
- shiftKey = YES ;
1632
- } else if (event.modifierFlags & NSEventModifierFlagControl) {
1633
- controlKey = YES ;
1634
- } else if (event.modifierFlags & NSEventModifierFlagOption) {
1635
- optionKey = YES ;
1636
- } else if (event.modifierFlags & NSEventModifierFlagCommand) {
1637
- commandKey = YES ;
1638
- } else if (event.modifierFlags & NSEventModifierFlagNumericPad) {
1639
- numericPadKey = YES ;
1640
- } else if (event.modifierFlags & NSEventModifierFlagHelp) {
1641
- helpKey = YES ;
1642
- } else if (event.modifierFlags & NSEventModifierFlagFunction) {
1643
- functionKey = YES ;
1644
- }
1645
-
1646
- RCTViewKeyboardEvent *keyboardEvent = nil ;
1647
- // only post events for keys we care about
1648
- if (downPress) {
1649
- NSString *keyToReturn = [self keyIsValid: key left: leftArrowKey right: rightArrowKey up: upArrowKey down: downArrowKey tabKey: tabKeyPressed escapeKey: escapeKeyPressed validKeys: [self validKeysDown ]];
1650
- if (keyToReturn != nil ) {
1651
- keyboardEvent = [RCTViewKeyboardEvent keyDownEventWithReactTag: self .reactTag
1652
- capsLockKey: capsLockKey
1653
- shiftKey: shiftKey
1654
- ctrlKey: controlKey
1655
- altKey: optionKey
1656
- metaKey: commandKey
1657
- numericPadKey: numericPadKey
1658
- helpKey: helpKey
1659
- functionKey: functionKey
1660
- leftArrowKey: leftArrowKey
1661
- rightArrowKey: rightArrowKey
1662
- upArrowKey: upArrowKey
1663
- downArrowKey: downArrowKey
1664
- key: keyToReturn];
1665
- }
1666
- } else {
1667
- NSString *keyToReturn = [self keyIsValid: key left: leftArrowKey right: rightArrowKey up: upArrowKey down: downArrowKey tabKey: tabKeyPressed escapeKey: escapeKeyPressed validKeys: [self validKeysUp ]];
1668
- if (keyToReturn != nil ) {
1669
- keyboardEvent = [RCTViewKeyboardEvent keyUpEventWithReactTag: self .reactTag
1670
- capsLockKey: capsLockKey
1671
- shiftKey: shiftKey
1672
- ctrlKey: controlKey
1673
- altKey: optionKey
1674
- metaKey: commandKey
1675
- numericPadKey: numericPadKey
1676
- helpKey: helpKey
1677
- functionKey: functionKey
1678
- leftArrowKey: leftArrowKey
1679
- rightArrowKey: rightArrowKey
1680
- upArrowKey: upArrowKey
1681
- downArrowKey: downArrowKey
1682
- key: keyToReturn];
1586
+ return [RCTViewKeyboardEvent keyEventFromEvent: event reactTag: self .reactTag];
1587
+ }
1588
+
1589
+ - (BOOL )handleKeyboardEvent:(NSEvent *)event {
1590
+ if (event.type == NSEventTypeKeyDown ? self.onKeyDown : self.onKeyUp ) {
1591
+ RCTViewKeyboardEvent *keyboardEvent = [self keyboardEvent: event];
1592
+ if (keyboardEvent) {
1593
+ [_eventDispatcher sendEvent: keyboardEvent];
1594
+ return YES ;
1683
1595
}
1684
1596
}
1685
- return keyboardEvent;
1686
- }
1687
-
1688
- // check if the user typed key matches a key we need to send an event for
1689
- // translate key codes over to JS compatible keys
1690
- - (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 {
1691
- NSString *keyToReturn = key;
1692
-
1693
- // Allow the flexibility of defining special keys in multiple ways
1694
- BOOL enterKeyValidityCheck = [key isEqualToString: @" \r " ] && ([validKeys containsObject: @" Enter" ] || [validKeys containsObject: @" \r " ]);
1695
- 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
1696
- 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
1697
- BOOL leftArrowValidityCheck = [validKeys containsObject: leftArrowPressKey] && leftArrowPressed;
1698
- BOOL rightArrowValidityCheck = [validKeys containsObject: rightArrowPressKey] && rightArrowPressed;
1699
- BOOL upArrowValidityCheck = [validKeys containsObject: upArrowPressKey] && upArrowPressed;
1700
- BOOL downArrowValidityCheck = [validKeys containsObject: downArrowPressKey] && downArrowPressed;
1701
-
1702
- if (tabKeyValidityCheck) {
1703
- keyToReturn = @" Tab" ;
1704
- } else if (escapeKeyValidityCheck) {
1705
- keyToReturn = @" Escape" ;
1706
- } else if (enterKeyValidityCheck) {
1707
- keyToReturn = @" Enter" ;
1708
- } else if (leftArrowValidityCheck) {
1709
- keyToReturn = leftArrowPressKey;
1710
- } else if (rightArrowValidityCheck) {
1711
- keyToReturn = rightArrowPressKey;
1712
- } else if (upArrowValidityCheck) {
1713
- keyToReturn = upArrowPressKey;
1714
- } else if (downArrowValidityCheck) {
1715
- keyToReturn = downArrowPressKey;
1716
- } else if (![validKeys containsObject: key]) {
1717
- keyToReturn = nil ;
1718
- }
1719
-
1720
- return keyToReturn;
1597
+ return NO ;
1721
1598
}
1722
1599
1723
1600
- (void )keyDown:(NSEvent *)event {
1724
- if (self.onKeyDown == nil ) {
1725
- [super keyDown: event];
1726
- return ;
1727
- }
1728
-
1729
- RCTViewKeyboardEvent *keyboardEvent = [self keyboardEvent: event downPress: YES ];
1730
- if (keyboardEvent != nil ) {
1731
- [_eventDispatcher sendEvent: keyboardEvent];
1732
- } else {
1601
+ if (![self handleKeyboardEvent: event]) {
1733
1602
[super keyDown: event];
1734
1603
}
1735
1604
}
1736
1605
1737
1606
- (void )keyUp:(NSEvent *)event {
1738
- if (self.onKeyUp == nil ) {
1739
- [super keyUp: event];
1740
- return ;
1741
- }
1742
-
1743
- RCTViewKeyboardEvent *keyboardEvent = [self keyboardEvent: event downPress: NO ];
1744
- if (keyboardEvent != nil ) {
1745
- [_eventDispatcher sendEvent: keyboardEvent];
1746
- } else {
1607
+ if (![self handleKeyboardEvent: event]) {
1747
1608
[super keyUp: event];
1748
1609
}
1749
1610
}
0 commit comments