summaryrefslogtreecommitdiff
path: root/macos/Sources/Helpers/LastWindowPosition.swift
blob: a0dfa90dda5a94b00bb6a1f7d19184f2a2a1d3b5 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
import Cocoa

/// Manages the persistence and restoration of window positions across app launches.
class LastWindowPosition {
    static let shared = LastWindowPosition()

    private let positionKey = "NSWindowLastPosition"

    func save(_ window: NSWindow) {
        let origin = window.frame.origin
        let point = [origin.x, origin.y]
        UserDefaults.standard.set(point, forKey: positionKey)
    }

    func restore(_ window: NSWindow) -> Bool {
        guard let points = UserDefaults.standard.array(forKey: positionKey) as? [Double],
              points.count == 2 else { return false }

        let lastPosition = CGPoint(x: points[0], y: points[1])

        guard let screen = window.screen ?? NSScreen.main else { return false }
        let visibleFrame = screen.visibleFrame

        var newFrame = window.frame
        newFrame.origin = lastPosition
        if !visibleFrame.contains(newFrame.origin) {
            newFrame.origin.x = max(visibleFrame.minX, min(visibleFrame.maxX - newFrame.width, newFrame.origin.x))
            newFrame.origin.y = max(visibleFrame.minY, min(visibleFrame.maxY - newFrame.height, newFrame.origin.y))
        }

        window.setFrame(newFrame, display: true)
        return true
    }
}