fix: scope control fades to preserve responsive window animation

This commit is contained in:
2026-10-18 18:43:05 +02:00
parent 29a70678a4
commit c2261ad2f0
5 changed files with 87 additions and 30 deletions
+10 -5
View File
@@ -1,4 +1,5 @@
import AppKit
import QuartzCore
@MainActor
final class CompactWindowController: NSObject {
@@ -378,10 +379,10 @@ final class CompactWindowController: NSObject {
frameAnimationGeneration &+= 1
let generation = frameAnimationGeneration
frameAnimating = true
// Coordinate the resize through NSWindow. Its animator proxy races SwiftUI's
// animated window sizing and can re-enter layout until AppKit aborts.
NSAnimationContext.runAnimationGroup { _ in
window.setFrame(frame, display: true, animate: true)
NSAnimationContext.runAnimationGroup { context in
context.duration = Self.transitionDuration
context.timingFunction = CAMediaTimingFunction(name: .easeInEaseOut)
window.animator().setFrame(frame, display: true)
} completionHandler: { [weak self, weak window] in
MainActor.assumeIsolated {
guard let self, let window, self.window === window, self.frameAnimating,
@@ -396,7 +397,11 @@ final class CompactWindowController: NSObject {
guard frameAnimating else { return }
frameAnimating = false
frameAnimationGeneration &+= 1
// Native resize animation has returned; invalidate only its pending completion.
guard let window else { return }
NSAnimationContext.runAnimationGroup { context in
context.duration = 0
window.animator().setFrame(window.frame, display: true)
}
}
private func setState(compact: Bool, transitioning: Bool) {