From e4e18ca84b51ee95dd4ebf27c63c0b01ae8c0b4b Mon Sep 17 00:00:00 2001 From: Tim Ledbetter Date: Wed, 29 Oct 2025 05:42:36 +0000 Subject: [PATCH] UI/AppKit: Support dead keys on MacOS --- UI/AppKit/Interface/LadybirdWebView.h | 2 +- UI/AppKit/Interface/LadybirdWebView.mm | 80 +++++++++++++++++++++++++- 2 files changed, 78 insertions(+), 4 deletions(-) diff --git a/UI/AppKit/Interface/LadybirdWebView.h b/UI/AppKit/Interface/LadybirdWebView.h index 9235c59f929..956b00f9143 100644 --- a/UI/AppKit/Interface/LadybirdWebView.h +++ b/UI/AppKit/Interface/LadybirdWebView.h @@ -38,7 +38,7 @@ @end -@interface LadybirdWebView : NSView +@interface LadybirdWebView : NSView - (instancetype)init:(id)observer; - (instancetype)initAsChild:(id)observer diff --git a/UI/AppKit/Interface/LadybirdWebView.mm b/UI/AppKit/Interface/LadybirdWebView.mm index 4bfde0d5655..a7204e31917 100644 --- a/UI/AppKit/Interface/LadybirdWebView.mm +++ b/UI/AppKit/Interface/LadybirdWebView.mm @@ -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*)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)event