mirror of
https://github.com/ghostty-org/ghostty.git
synced 2025-08-02 14:57:31 +03:00
macos: properly lose focus on previous split when new split
This commit is contained in:
@ -159,25 +159,34 @@ extension Ghostty {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// See fixFocus comment, we have to run this whenever split changes.
|
// See fixFocus comment, we have to run this whenever split changes.
|
||||||
Self.fixFocus(container.bottomRight)
|
Self.fixFocus(container.bottomRight, previous: node)
|
||||||
}
|
}
|
||||||
|
|
||||||
/// There is a bug I can't figure out where when changing the split state, the terminal view
|
/// There is a bug I can't figure out where when changing the split state, the terminal view
|
||||||
/// will lose focus. There has to be some nice SwiftUI-native way to fix this but I can't
|
/// will lose focus. There has to be some nice SwiftUI-native way to fix this but I can't
|
||||||
/// figure it out so we're going to do this hacky thing to bring focus back to the terminal
|
/// figure it out so we're going to do this hacky thing to bring focus back to the terminal
|
||||||
/// that should have it.
|
/// that should have it.
|
||||||
fileprivate static func fixFocus(_ target: SplitNode) {
|
fileprivate static func fixFocus(_ target: SplitNode, previous: SplitNode) {
|
||||||
let view = target.preferredFocus()
|
let view = target.preferredFocus()
|
||||||
|
|
||||||
DispatchQueue.main.async {
|
DispatchQueue.main.async {
|
||||||
// If the callback runs before the surface is attached to a view
|
// If the callback runs before the surface is attached to a view
|
||||||
// then the window will be nil. We just reschedule in that case.
|
// then the window will be nil. We just reschedule in that case.
|
||||||
guard let window = view.window else {
|
guard let window = view.window else {
|
||||||
self.fixFocus(target)
|
self.fixFocus(target, previous: previous)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
window.makeFirstResponder(view)
|
window.makeFirstResponder(view)
|
||||||
|
|
||||||
|
// If we had a previously focused node and its not where we're sending
|
||||||
|
// focus, make sure that we explicitly tell it to lose focus. In theory
|
||||||
|
// we should NOT have to do this but the focus callback isn't getting
|
||||||
|
// called for some reason.
|
||||||
|
let previous = previous.preferredFocus()
|
||||||
|
if previous != view {
|
||||||
|
_ = previous.resignFirstResponder()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -199,7 +208,7 @@ extension Ghostty {
|
|||||||
|
|
||||||
// When closing the topLeft, our parent becomes the bottomRight.
|
// When closing the topLeft, our parent becomes the bottomRight.
|
||||||
node = container.bottomRight
|
node = container.bottomRight
|
||||||
TerminalSplitLeaf.fixFocus(node)
|
TerminalSplitLeaf.fixFocus(node, previous: container.topLeft)
|
||||||
}
|
}
|
||||||
}, right: {
|
}, right: {
|
||||||
TerminalSplitNested(node: $container.bottomRight, requestClose: $closeBottomRight)
|
TerminalSplitNested(node: $container.bottomRight, requestClose: $closeBottomRight)
|
||||||
@ -208,7 +217,7 @@ extension Ghostty {
|
|||||||
|
|
||||||
// When closing the bottomRight, our parent becomes the topLeft.
|
// When closing the bottomRight, our parent becomes the topLeft.
|
||||||
node = container.topLeft
|
node = container.topLeft
|
||||||
TerminalSplitLeaf.fixFocus(node)
|
TerminalSplitLeaf.fixFocus(node, previous: container.bottomRight)
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user