UI/AppKit: Support dead keys on MacOS

This commit is contained in:
Tim Ledbetter 2025-10-29 05:42:36 +00:00 committed by Tim Flynn
parent 35254d17d1
commit e4e18ca84b
2 changed files with 78 additions and 4 deletions

View File

@ -38,7 +38,7 @@
@end
@interface LadybirdWebView : NSView <NSMenuDelegate>
@interface LadybirdWebView : NSView <NSMenuDelegate, NSTextInputClient>
- (instancetype)init:(id<LadybirdWebViewObserver>)observer;
- (instancetype)initAsChild:(id<LadybirdWebViewObserver>)observer

View File

@ -321,7 +321,7 @@ struct HideCursor {
if (self == nil) {
return;
}
NSEvent* event = Ladybird::key_event_to_ns_event(key_event);
auto* event = Ladybird::key_event_to_ns_event(key_event);
self.event_being_redispatched = event;
[NSApp sendEvent:event];
@ -1072,8 +1072,7 @@ struct HideCursor {
return;
}
auto key_event = Ladybird::ns_event_to_key_event(Web::KeyEvent::Type::KeyDown, event);
m_web_view_bridge->enqueue_input_event(move(key_event));
[self interpretKeyEvents:@[ event ]];
}
- (void)keyUp:(NSEvent*)event
@ -1123,6 +1122,81 @@ struct HideCursor {
// prevent this from happening. See: https://stackoverflow.com/a/20197686
}
- (BOOL)canBecomeKeyView
{
return YES;
}
#pragma mark - NSResponder
- (BOOL)acceptsFirstResponder
{
return YES;
}
#pragma mark - NSTextInputClient
- (void)insertText:(id)string replacementRange:(NSRange)replacementRange
{
auto* event = [NSApp currentEvent];
if (event && event.type == NSEventTypeKeyDown) {
auto key_event = Ladybird::ns_event_to_key_event(Web::KeyEvent::Type::KeyDown, event);
m_web_view_bridge->enqueue_input_event(move(key_event));
}
}
- (void)doCommandBySelector:(SEL)selector
{
auto* event = [NSApp currentEvent];
if (event && event.type == NSEventTypeKeyDown) {
auto key_event = Ladybird::ns_event_to_key_event(Web::KeyEvent::Type::KeyDown, event);
m_web_view_bridge->enqueue_input_event(move(key_event));
}
}
- (BOOL)hasMarkedText
{
return NO;
}
- (NSRange)markedRange
{
return NSMakeRange(NSNotFound, 0);
}
- (NSRange)selectedRange
{
return NSMakeRange(NSNotFound, 0);
}
- (void)setMarkedText:(id)string selectedRange:(NSRange)selectedRange replacementRange:(NSRange)replacementRange
{
}
- (void)unmarkText
{
}
- (NSArray<NSAttributedStringKey>*)validAttributesForMarkedText
{
return @[];
}
- (NSAttributedString*)attributedSubstringForProposedRange:(NSRange)range actualRange:(NSRangePointer)actualRange
{
return nil;
}
- (NSUInteger)characterIndexForPoint:(NSPoint)point
{
return NSNotFound;
}
- (NSRect)firstRectForCharacterRange:(NSRange)range actualRange:(NSRangePointer)actualRange
{
return NSZeroRect;
}
#pragma mark - NSDraggingDestination
- (NSDragOperation)draggingEntered:(id<NSDraggingInfo>)event