macOS: fix responder chain

pull/7153/head
Mitchell Hashimoto 2025-04-21 10:16:52 -07:00
parent 6d2685b5a2
commit 63b4cb4ead
No known key found for this signature in database
GPG Key ID: 523D5DC389D273BC
3 changed files with 20 additions and 2 deletions

View File

@ -43,6 +43,9 @@ struct TerminalCommandPaletteView: View {
VStack { VStack {
Spacer().frame(height: geometry.size.height * 0.1) Spacer().frame(height: geometry.size.height * 0.1)
ResponderChainInjector(responder: surfaceView)
.frame(width: 0, height: 0)
CommandPaletteView( CommandPaletteView(
isPresented: $isPresented, isPresented: $isPresented,
backgroundColor: ghosttyConfig.backgroundColor, backgroundColor: ghosttyConfig.backgroundColor,
@ -75,3 +78,18 @@ struct TerminalCommandPaletteView: View {
} }
} }
} }
/// This is done to ensure that the given view is in the responder chain.
fileprivate struct ResponderChainInjector: NSViewRepresentable {
let responder: NSResponder
func makeNSView(context: Context) -> NSView {
let dummy = NSView()
DispatchQueue.main.async {
dummy.nextResponder = responder
}
return dummy
}
func updateNSView(_ nsView: NSView, context: Context) {}
}

View File

@ -152,6 +152,7 @@ class BaseTerminalController: NSWindowController,
// Our focus state requires that this window is key and our currently // Our focus state requires that this window is key and our currently
// focused surface is the surface in this leaf. // focused surface is the surface in this leaf.
let focused: Bool = (window?.isKeyWindow ?? false) && let focused: Bool = (window?.isKeyWindow ?? false) &&
!commandPaletteIsShowing &&
focusedSurface != nil && focusedSurface != nil &&
leaf.surface == focusedSurface! leaf.surface == focusedSurface!
leaf.surface.focusDidChange(focused) leaf.surface.focusDidChange(focused)

View File

@ -102,9 +102,8 @@ struct TerminalView<ViewModel: TerminalViewModel>: View {
// we lose focus we keep this set to the last non-nil value. // we lose focus we keep this set to the last non-nil value.
if newValue != nil { if newValue != nil {
lastFocusedSurface = .init(newValue) lastFocusedSurface = .init(newValue)
self.delegate?.focusedSurfaceDidChange(to: newValue)
} }
self.delegate?.focusedSurfaceDidChange(to: newValue)
} }
.onChange(of: title) { newValue in .onChange(of: title) { newValue in
self.delegate?.titleDidChange(to: newValue) self.delegate?.titleDidChange(to: newValue)