5 #import <objc/message.h>
11 #import "flutter/shell/platform/embedder/embedder.h"
26 @property(nonatomic) uint64_t previouslyPressedFlags;
39 _previouslyPressedFlags = 0;
46 - (void)checkModifierFlag:(NSUInteger)targetMask
47 forEventFlags:(NSEventModifierFlags)eventFlags
48 keyCode:(NSUInteger)keyCode
49 timestamp:(NSTimeInterval)timestamp {
50 NSAssert((targetMask & (targetMask - 1)) == 0,
@"targetMask must only have one bit set");
51 if ((eventFlags & targetMask) != (_previouslyPressedFlags & targetMask)) {
52 uint64_t newFlags = (_previouslyPressedFlags & ~targetMask) | (eventFlags & targetMask);
55 auto updateCombinedFlag = [&](uint64_t side1, uint64_t side2, NSEventModifierFlags flag) {
56 if (newFlags & (side1 | side2)) {
63 NSEventModifierFlagShift);
65 NSEventModifierFlagControl);
67 NSEventModifierFlagOption);
69 NSEventModifierFlagCommand);
71 NSEvent*
event = [NSEvent keyEventWithType:NSEventTypeFlagsChanged
73 modifierFlags:newFlags
78 charactersIgnoringModifiers:@""
81 [
self handleEvent:event
87 - (void)syncModifiersIfNeeded:(NSEventModifierFlags)modifierFlags
88 timestamp:(NSTimeInterval)timestamp {
89 modifierFlags = modifierFlags & ~0x100;
90 if (_previouslyPressedFlags == modifierFlags) {
94 [flutter::modifierFlagToKeyCode
95 enumerateKeysAndObjectsUsingBlock:^(NSNumber* flag, NSNumber* keyCode, BOOL* stop) {
96 [
self checkModifierFlag:[flag unsignedShortValue]
97 forEventFlags:modifierFlags
98 keyCode:[keyCode unsignedShortValue]
103 [
self checkModifierFlag:NSEventModifierFlagCapsLock
104 forEventFlags:modifierFlags
106 timestamp:timestamp];
109 FML_DCHECK(_previouslyPressedFlags == modifierFlags);
114 NSEventModifierFlags modifierFlags =
event.modifierFlags & ~0x100;
116 switch (event.type) {
117 case NSEventTypeKeyDown:
120 case NSEventTypeKeyUp:
123 case NSEventTypeFlagsChanged:
124 if (modifierFlags < _previouslyPressedFlags) {
126 }
else if (modifierFlags > _previouslyPressedFlags) {
137 NSAssert(
false,
@"Unexpected key event type (got %lu).", event.type);
143 _previouslyPressedFlags = modifierFlags;
144 NSMutableDictionary* keyMessage = [@{
145 @"keymap" : @"macos",
147 @"keyCode" : @(event.keyCode),
148 @"modifiers" : @(modifierFlags),
152 if (event.type == NSEventTypeKeyDown || event.type == NSEventTypeKeyUp) {
153 keyMessage[@"characters"] =
event.characters;
154 keyMessage[@"charactersIgnoringModifiers"] =
event.charactersIgnoringModifiers;
156 NSNumber* specifiedLogicalKey =
layoutMap[@(event.keyCode)];
157 if (specifiedLogicalKey != nil) {
158 keyMessage[@"specifiedLogicalKey"] = specifiedLogicalKey;
160 [
self.channel sendMessage:keyMessage
163 return callback(true);
167 callback([[reply valueForKey:@"handled"] boolValue]);
171 #pragma mark - Private