From 836360db360af00b072995f8ab94d6331f5b4cb4 Mon Sep 17 00:00:00 2001 From: austinpower1258 Date: Mon, 23 Mar 2026 19:19:05 -0700 Subject: [PATCH] fix: hide stale terminal portal after restore churn --- Sources/TerminalWindowPortal.swift | 33 ++++++++++++++++++++++-------- 1 file changed, 24 insertions(+), 9 deletions(-) diff --git a/Sources/TerminalWindowPortal.swift b/Sources/TerminalWindowPortal.swift index 4c4588a8..4d5d843d 100644 --- a/Sources/TerminalWindowPortal.swift +++ b/Sources/TerminalWindowPortal.swift @@ -1211,18 +1211,33 @@ final class WindowTerminalPortal: NSObject { return } guard let anchorView = entry.anchorView, let window else { - // Only hide if the entry is not marked visibleInUI. When a workspace is - // remounting, updateNSView sets visibleInUI=true before the deferred bind - // provides an anchor — hiding here would race with that and cause a flash. - if !entry.visibleInUI { + if entry.visibleInUI { + let shouldPreserveVisibleOnTransient = !hostedView.isHidden && + scheduleTransientRecoveryRetryIfNeeded( + forHostedId: hostedId, + entry: &entry, + hostedView: hostedView, + reason: "missingAnchorOrWindow" + ) + if shouldPreserveVisibleOnTransient { #if DEBUG - if !hostedView.isHidden { - dlog("portal.hidden hosted=\(portalDebugToken(hostedView)) value=1 reason=missingAnchorOrWindow") - } + dlog( + "portal.hidden.deferKeep hosted=\(portalDebugToken(hostedView)) " + + "reason=missingAnchorOrWindow frame=\(portalDebugFrame(hostedView.frame))" + ) #endif - hostedView.isHidden = true - resetTransientRecoveryRetryIfNeeded(forHostedId: hostedId, entry: &entry) + return + } } else { + resetTransientRecoveryRetryIfNeeded(forHostedId: hostedId, entry: &entry) + } +#if DEBUG + if !hostedView.isHidden { + dlog("portal.hidden hosted=\(portalDebugToken(hostedView)) value=1 reason=missingAnchorOrWindow") + } +#endif + hostedView.isHidden = true + if entry.visibleInUI { _ = scheduleTransientRecoveryRetryIfNeeded( forHostedId: hostedId, entry: &entry,