Skip to content

Commit bb79721

Browse files
amgleitmanAdam Gleitman
andauthored
Send JS blur/focus events when switching to another NSWindow (#2323)
Co-authored-by: Adam Gleitman <[email protected]>
1 parent d924f34 commit bb79721

File tree

1 file changed

+41
-0
lines changed

1 file changed

+41
-0
lines changed

packages/react-native/React/Base/RCTRootView.m

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
#import "RCTBridge.h"
1717
#import "RCTConstants.h"
1818
#import "RCTDevSettings.h" // [macOS]
19+
#import "RCTFocusChangeEvent.h" // [macOS]
1920
// [macOS] remove #import "RCTKeyCommands.h"
2021
#import "RCTLog.h"
2122
#import "RCTPerformanceLogger.h"
@@ -432,6 +433,46 @@ - (void)viewDidChangeEffectiveAppearance
432433
#endif // macOS]
433434

434435

436+
#pragma mark - Key window blur/focus
437+
438+
#if TARGET_OS_OSX // [macOS
439+
- (void)viewDidMoveToWindow {
440+
[super viewDidMoveToWindow];
441+
442+
NSWindow *window = [self window];
443+
if (window == nil) {
444+
return;
445+
}
446+
447+
[[NSNotificationCenter defaultCenter] addObserver:self
448+
selector:@selector(containingWindowDidBecomeKey)
449+
name:NSWindowDidBecomeKeyNotification
450+
object:window];
451+
452+
[[NSNotificationCenter defaultCenter] addObserver:self
453+
selector:@selector(containingWindowDidResignKey)
454+
name:NSWindowDidResignKeyNotification
455+
object:window];
456+
}
457+
458+
- (void)containingWindowDidBecomeKey {
459+
NSResponder *firstResponder = [[self window] firstResponder];
460+
if ([firstResponder isKindOfClass:[RCTPlatformView class]]) {
461+
NSNumber *reactTag = [(RCTPlatformView *)firstResponder reactTag];
462+
[[[self bridge] eventDispatcher] sendEvent:[RCTFocusChangeEvent focusEventWithReactTag:reactTag]];
463+
}
464+
}
465+
466+
- (void)containingWindowDidResignKey {
467+
NSResponder *firstResponder = [[self window] firstResponder];
468+
if ([firstResponder isKindOfClass:[RCTPlatformView class]]) {
469+
NSNumber *reactTag = [(RCTPlatformView *)firstResponder reactTag];
470+
[[[self bridge] eventDispatcher] sendEvent:[RCTFocusChangeEvent blurEventWithReactTag:reactTag]];
471+
}
472+
}
473+
#endif // macOS]
474+
475+
435476
#if TARGET_OS_OSX // [macOS
436477
- (NSMenu *)menuForEvent:(NSEvent *)event
437478
{

0 commit comments

Comments
 (0)