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];
111 NSEventModifierFlags modifierFlags =
event.modifierFlags & ~0x100;
113 switch (event.type) {
114 case NSEventTypeKeyDown:
117 case NSEventTypeKeyUp:
120 case NSEventTypeFlagsChanged:
121 if (modifierFlags < _previouslyPressedFlags) {
123 }
else if (modifierFlags > _previouslyPressedFlags) {
134 NSAssert(
false,
@"Unexpected key event type (got %lu).", event.type);
140 _previouslyPressedFlags = modifierFlags;
141 NSMutableDictionary* keyMessage = [@{
142 @"keymap" : @"macos",
144 @"keyCode" : @(event.keyCode),
145 @"modifiers" : @(modifierFlags),
149 if (event.type == NSEventTypeKeyDown || event.type == NSEventTypeKeyUp) {
150 keyMessage[@"characters"] =
event.characters;
151 keyMessage[@"charactersIgnoringModifiers"] =
event.charactersIgnoringModifiers;
153 NSNumber* specifiedLogicalKey =
layoutMap[@(event.keyCode)];
154 if (specifiedLogicalKey != nil) {
155 keyMessage[@"specifiedLogicalKey"] = specifiedLogicalKey;
157 [
self.channel sendMessage:keyMessage
160 return callback(true);
164 callback([[reply valueForKey:@"handled"] boolValue]);
168 #pragma mark - Private