Skip to content

Commit bf75f52

Browse files
trflynn89tcl3
authored andcommitted
UI/AppKit: Store the original key-down event for WebContent processing
When a shortcut is an alternative key, macOS first fires a key event for the primary key. Then if it is not handled, it fires an event for the alternative key. For example, we see these two events in a row when we press cmd and =/+: NSEvent: type=KeyDown flags=0x100108 chars="=" keyCode=25 NSEvent: type=KeyDown flags=0x100108 chars="+" keyCode=24 For dead key processing, we don't handle these events right away. By the time we get to doCommandBySelector, when we call [NSApp currentEvent], we see the following events: NSEvent: type=KeyDown flags=0x100108 chars="=" keyCode=24 NSEvent: type=AppDefined flags=0 The AppDefined event is internally posted by our event loop. So it seems we cannot rely on currentEvent being the key-down event we are looking for. Instead, we can store the key-down event that we last saw.
1 parent 934817d commit bf75f52

File tree

1 file changed

+17
-10
lines changed

1 file changed

+17
-10
lines changed

UI/AppKit/Interface/LadybirdWebView.mm

Lines changed: 17 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,9 @@ @interface LadybirdWebView () <NSDraggingDestination>
6262
// event ourselves to prevent indefinitely repeating the event.
6363
@property (nonatomic, strong) NSEvent* event_being_redispatched;
6464

65+
// To handle key events after dead key processing, we need to hold onto the originating key-down event.
66+
@property (nonatomic, strong) NSEvent* current_key_down_event;
67+
6568
@end
6669

6770
@implementation LadybirdWebView
@@ -842,6 +845,17 @@ - (void)setWebViewCallbacks
842845
};
843846
}
844847

848+
- (void)handleCurrentKeyDownEvent
849+
{
850+
if (!self.current_key_down_event)
851+
return;
852+
853+
auto key_event = Ladybird::ns_event_to_key_event(Web::KeyEvent::Type::KeyDown, self.current_key_down_event);
854+
m_web_view_bridge->enqueue_input_event(move(key_event));
855+
856+
self.current_key_down_event = nil;
857+
}
858+
845859
- (void)selectDropdownAction:(NSMenuItem*)menuItem
846860
{
847861
NSNumber* data = [menuItem representedObject];
@@ -1072,6 +1086,7 @@ - (void)keyDown:(NSEvent*)event
10721086
return;
10731087
}
10741088

1089+
self.current_key_down_event = event;
10751090
[self interpretKeyEvents:@[ event ]];
10761091
}
10771092

@@ -1138,20 +1153,12 @@ - (BOOL)acceptsFirstResponder
11381153

11391154
- (void)insertText:(id)string replacementRange:(NSRange)replacementRange
11401155
{
1141-
auto* event = [NSApp currentEvent];
1142-
if (event && event.type == NSEventTypeKeyDown) {
1143-
auto key_event = Ladybird::ns_event_to_key_event(Web::KeyEvent::Type::KeyDown, event);
1144-
m_web_view_bridge->enqueue_input_event(move(key_event));
1145-
}
1156+
[self handleCurrentKeyDownEvent];
11461157
}
11471158

11481159
- (void)doCommandBySelector:(SEL)selector
11491160
{
1150-
auto* event = [NSApp currentEvent];
1151-
if (event && event.type == NSEventTypeKeyDown) {
1152-
auto key_event = Ladybird::ns_event_to_key_event(Web::KeyEvent::Type::KeyDown, event);
1153-
m_web_view_bridge->enqueue_input_event(move(key_event));
1154-
}
1161+
[self handleCurrentKeyDownEvent];
11551162
}
11561163

11571164
- (BOOL)hasMarkedText

0 commit comments

Comments
 (0)