Refresh browser portal after pane zoom
This commit is contained in:
parent
23484eb01a
commit
e96dc5dd83
1 changed files with 43 additions and 0 deletions
|
|
@ -3220,6 +3220,9 @@ final class Workspace: Identifiable, ObservableObject {
|
|||
guard let paneId = paneId(forPanelId: panelId) else { return false }
|
||||
guard bonsplitController.togglePaneZoom(inPane: paneId) else { return false }
|
||||
focusPanel(panelId)
|
||||
if browserPanel(for: panelId) != nil {
|
||||
scheduleBrowserPortalReconcileAfterSplitZoom(panelId: panelId, remainingPasses: 4)
|
||||
}
|
||||
return true
|
||||
}
|
||||
|
||||
|
|
@ -3482,6 +3485,46 @@ final class Workspace: Identifiable, ObservableObject {
|
|||
}
|
||||
}
|
||||
|
||||
// Browser panes host WKWebView in the window portal. After pane zoom toggles,
|
||||
// force a few post-layout sync passes so the portal does not outlive the omnibar chrome.
|
||||
private func scheduleBrowserPortalReconcileAfterSplitZoom(panelId: UUID, remainingPasses: Int) {
|
||||
guard remainingPasses > 0 else { return }
|
||||
DispatchQueue.main.async { [weak self] in
|
||||
guard let self, let browserPanel = self.browserPanel(for: panelId) else { return }
|
||||
|
||||
for window in NSApp.windows {
|
||||
window.contentView?.layoutSubtreeIfNeeded()
|
||||
window.contentView?.displayIfNeeded()
|
||||
}
|
||||
|
||||
let anchorView = browserPanel.portalAnchorView
|
||||
let anchorReady =
|
||||
anchorView.window != nil &&
|
||||
anchorView.superview != nil &&
|
||||
anchorView.bounds.width > 1 &&
|
||||
anchorView.bounds.height > 1
|
||||
|
||||
if anchorReady {
|
||||
BrowserWindowPortalRegistry.synchronizeForAnchor(anchorView)
|
||||
BrowserWindowPortalRegistry.refresh(
|
||||
webView: browserPanel.webView,
|
||||
reason: "workspace.toggleSplitZoom"
|
||||
)
|
||||
}
|
||||
|
||||
let portalNeedsFollowUpPass =
|
||||
!anchorReady ||
|
||||
browserPanel.webView.window == nil ||
|
||||
browserPanel.webView.superview == nil
|
||||
if portalNeedsFollowUpPass {
|
||||
self.scheduleBrowserPortalReconcileAfterSplitZoom(
|
||||
panelId: panelId,
|
||||
remainingPasses: remainingPasses - 1
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private func scheduleMovedTerminalRefresh(panelId: UUID) {
|
||||
guard terminalPanel(for: panelId) != nil else { return }
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue