diff --git a/Loop/Extensions/NSScreen+Extensions.swift b/Loop/Extensions/NSScreen+Extensions.swift index 24b0353b..676d1bb9 100644 --- a/Loop/Extensions/NSScreen+Extensions.swift +++ b/Loop/Extensions/NSScreen+Extensions.swift @@ -16,6 +16,17 @@ extension NSScreen { return deviceDescription[key] as? CGDirectDisplayID } + var displayMode: CGDisplayMode? { + guard + let id = displayID, + let displayMode = CGDisplayCopyDisplayMode(id) + else { + return nil + } + + return displayMode + } + static var screenWithMouse: NSScreen? { let mouseLocation = NSEvent.mouseLocation let screens = NSScreen.screens diff --git a/Loop/Window Management/WindowTransformAnimation.swift b/Loop/Window Management/WindowTransformAnimation.swift index ea947907..ffffe241 100644 --- a/Loop/Window Management/WindowTransformAnimation.swift +++ b/Loop/Window Management/WindowTransformAnimation.swift @@ -28,7 +28,7 @@ class WindowTransformAnimation: NSAnimation { self.bounds = bounds self.completionHandler = completionHandler super.init(duration: 0.3, animationCurve: .easeOut) - self.frameRate = 60.0 + self.frameRate = Float(NSScreen.main?.displayMode?.refreshRate ?? 60.0) self.animationBlockingMode = .nonblocking self.lastWindowFrame = originalFrame @@ -57,10 +57,10 @@ class WindowTransformAnimation: NSAnimation { let value = CGFloat(1.0 - pow(1.0 - currentValue, 3)) var newFrame = CGRect( - x: originalFrame.origin.x + value * (targetFrame.origin.x - originalFrame.origin.x), - y: originalFrame.origin.y + value * (targetFrame.origin.y - originalFrame.origin.y), - width: originalFrame.size.width + value * (targetFrame.size.width - originalFrame.size.width), - height: originalFrame.size.height + value * (targetFrame.size.height - originalFrame.size.height) + x: round(originalFrame.origin.x + value * (targetFrame.origin.x - originalFrame.origin.x)), + y: round(originalFrame.origin.y + value * (targetFrame.origin.y - originalFrame.origin.y)), + width: round(originalFrame.size.width + value * (targetFrame.size.width - originalFrame.size.width)), + height: round(originalFrame.size.height + value * (targetFrame.size.height - originalFrame.size.height)) ) // Keep the window inside the bounds @@ -78,8 +78,14 @@ class WindowTransformAnimation: NSAnimation { } } - window.position = newFrame.origin - window.size = newFrame.size + if lastWindowFrame.origin != newFrame.origin { + window.position = newFrame.origin + } + + if lastWindowFrame.size != newFrame.size { + window.size = newFrame.size + } + lastWindowFrame = window.frame if currentProgress >= 1.0 {