Skip to content
This repository was archived by the owner on Feb 25, 2025. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions shell/platform/darwin/ios/framework/Headers/FlutterEngine.h
Original file line number Diff line number Diff line change
Expand Up @@ -322,6 +322,14 @@ FLUTTER_EXPORT
*/
@property(nonatomic, readonly) FlutterBasicMessageChannel* settingsChannel;

/**
* The `FlutterBasicMessageChannel` used for communicating key events
* from physical keyboards
*
* Can be nil after `destroyContext` is called.
*/
@property(nonatomic, readonly) FlutterBasicMessageChannel* keyEventChannel;

/**
* The `NSURL` of the observatory for the service isolate.
*
Expand Down
10 changes: 10 additions & 0 deletions shell/platform/darwin/ios/framework/Source/FlutterEngine.mm
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,7 @@ @implementation FlutterEngine {
fml::scoped_nsobject<FlutterBasicMessageChannel> _lifecycleChannel;
fml::scoped_nsobject<FlutterBasicMessageChannel> _systemChannel;
fml::scoped_nsobject<FlutterBasicMessageChannel> _settingsChannel;
fml::scoped_nsobject<FlutterBasicMessageChannel> _keyEventChannel;

int64_t _nextTextureId;

Expand Down Expand Up @@ -326,6 +327,9 @@ - (FlutterBasicMessageChannel*)systemChannel {
- (FlutterBasicMessageChannel*)settingsChannel {
return _settingsChannel.get();
}
- (FlutterBasicMessageChannel*)keyEventChannel {
return _keyEventChannel.get();
}

- (NSURL*)observatoryUrl {
return [_publisher.get() url];
Expand All @@ -340,6 +344,7 @@ - (void)resetChannels {
_lifecycleChannel.reset();
_systemChannel.reset();
_settingsChannel.reset();
_keyEventChannel.reset();
}

- (void)startProfiler:(NSString*)threadLabel {
Expand Down Expand Up @@ -412,6 +417,11 @@ - (void)setupChannels {
binaryMessenger:self.binaryMessenger
codec:[FlutterJSONMessageCodec sharedInstance]]);

_keyEventChannel.reset([[FlutterBasicMessageChannel alloc]
initWithName:@"flutter/keyevent"
binaryMessenger:self.binaryMessenger
codec:[FlutterJSONMessageCodec sharedInstance]]);

_textInputPlugin.reset([[FlutterTextInputPlugin alloc] init]);
_textInputPlugin.get().textInputDelegate = self;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -964,6 +964,57 @@ - (void)keyboardWillBeHidden:(NSNotification*)notification {
[self updateViewportMetrics];
}

- (void)dispatchPresses:(NSSet<UIPress*>*)presses API_AVAILABLE(ios(13.4)) {
if (@available(iOS 13.4, *)) {
for (UIPress* press in presses) {
if (press.key == nil) {
continue;
}
NSMutableDictionary* keyMessage = [@{
@"keymap" : @"ios",
@"type" : @"unknown",
@"keyCode" : @(press.key.keyCode),
@"modifiers" : @(press.key.modifierFlags),
@"characters" : press.key.characters,
@"charactersIgnoringModifiers" : press.key.charactersIgnoringModifiers
} mutableCopy];

if (press.phase == UIPressPhaseBegan) {
keyMessage[@"type"] = @"keydown";
} else if (press.phase == UIPressPhaseEnded || press.phase == UIPressPhaseCancelled) {
keyMessage[@"type"] = @"keyup";
}

[[_engine.get() keyEventChannel] sendMessage:keyMessage];
}
}
}

- (void)pressesBegan:(NSSet<UIPress*>*)presses withEvent:(UIEvent*)event API_AVAILABLE(ios(9.0)) {
if (@available(iOS 13.4, *)) {
[self dispatchPresses:presses];
}
}

- (void)pressesChanged:(NSSet<UIPress*>*)presses withEvent:(UIEvent*)event API_AVAILABLE(ios(9.0)) {
if (@available(iOS 13.4, *)) {
[self dispatchPresses:presses];
}
}

- (void)pressesEnded:(NSSet<UIPress*>*)presses withEvent:(UIEvent*)event API_AVAILABLE(ios(9.0)) {
if (@available(iOS 13.4, *)) {
[self dispatchPresses:presses];
}
}

- (void)pressesCancelled:(NSSet<UIPress*>*)presses
withEvent:(UIEvent*)event API_AVAILABLE(ios(9.0)) {
if (@available(iOS 13.4, *)) {
[self dispatchPresses:presses];
}
}

#pragma mark - Orientation updates

- (void)onOrientationPreferencesUpdated:(NSNotification*)notification {
Expand Down