From aa24f1239b80437c177e45a41912438219d07834 Mon Sep 17 00:00:00 2001 From: austinpower1258 Date: Sun, 22 Mar 2026 17:47:45 -0700 Subject: [PATCH] Fix blank terminal renders after workspace switches --- Sources/GhosttyTerminalView.swift | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/Sources/GhosttyTerminalView.swift b/Sources/GhosttyTerminalView.swift index 067622f4ff..83f36adf53 100644 --- a/Sources/GhosttyTerminalView.swift +++ b/Sources/GhosttyTerminalView.swift @@ -4015,7 +4015,9 @@ class GhosttyNSView: NSView, NSUserInterfaceValidations { return true } - // Visibility is used for focus gating, not for libghostty occlusion. + // Visibility is used for focus gating. Explicit portal visibility transitions + // also drive Ghostty occlusion so hidden workspace/split surfaces pause and + // queue a redraw when they become visible again. fileprivate var isVisibleInUI: Bool { visibleInUI } fileprivate func setVisibleInUI(_ visible: Bool) { visibleInUI = visible @@ -6590,6 +6592,7 @@ final class GhosttySurfaceScrollView: NSView { private static let scrollToBottomThreshold: CGFloat = 5.0 private var isActive = true private var lastFocusRefreshAt: CFTimeInterval = 0 + private var lastRequestedPortalOcclusionVisible: Bool? private var activeDropZone: DropZone? private var pendingDropZone: DropZone? private var dropZoneOverlayAnimationGeneration: UInt64 = 0 @@ -7909,6 +7912,10 @@ final class GhosttySurfaceScrollView: NSView { let wasVisible = surfaceView.isVisibleInUI surfaceView.setVisibleInUI(visible) isHidden = !visible + if wasVisible != visible, lastRequestedPortalOcclusionVisible != visible { + lastRequestedPortalOcclusionVisible = visible + surfaceView.terminalSurface?.setOcclusion(visible) + } #if DEBUG if wasVisible != visible { let transition = "\(wasVisible ? 1 : 0)->\(visible ? 1 : 0)"