mirror of
https://github.com/FBukovina/Atoll.git
synced 2026-10-27 15:14:33 +00:00
BugFix: Display wake lock screen indicator flying away issue
This commit is contained in:
parent
ff3bdde7d3
commit
70d0f016dc
1 changed files with 44 additions and 1 deletions
|
|
@ -22,8 +22,12 @@ class LockScreenLiveActivityWindowManager {
|
||||||
private let overlayModel = LockScreenLiveActivityOverlayModel()
|
private let overlayModel = LockScreenLiveActivityOverlayModel()
|
||||||
private let overlayAnimator = LockIconAnimator(initiallyLocked: LockScreenManager.shared.isLocked)
|
private let overlayAnimator = LockIconAnimator(initiallyLocked: LockScreenManager.shared.isLocked)
|
||||||
private weak var viewModel: DynamicIslandViewModel?
|
private weak var viewModel: DynamicIslandViewModel?
|
||||||
|
private var screenChangeObserver: NSObjectProtocol?
|
||||||
|
private var workspaceObservers: [NSObjectProtocol] = []
|
||||||
|
|
||||||
private init() {}
|
private init() {
|
||||||
|
registerScreenChangeObservers()
|
||||||
|
}
|
||||||
|
|
||||||
private func timestamp() -> String {
|
private func timestamp() -> String {
|
||||||
let formatter = DateFormatter()
|
let formatter = DateFormatter()
|
||||||
|
|
@ -96,6 +100,45 @@ class LockScreenLiveActivityWindowManager {
|
||||||
return (notchSize, screen)
|
return (notchSize, screen)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private func registerScreenChangeObservers() {
|
||||||
|
screenChangeObserver = NotificationCenter.default.addObserver(
|
||||||
|
forName: NSApplication.didChangeScreenParametersNotification,
|
||||||
|
object: nil,
|
||||||
|
queue: .main
|
||||||
|
) { [weak self] _ in
|
||||||
|
self?.handleScreenGeometryChange(reason: "screen-parameters")
|
||||||
|
}
|
||||||
|
|
||||||
|
let workspaceCenter = NSWorkspace.shared.notificationCenter
|
||||||
|
let wakeObserver = workspaceCenter.addObserver(
|
||||||
|
forName: NSWorkspace.screensDidWakeNotification,
|
||||||
|
object: nil,
|
||||||
|
queue: .main
|
||||||
|
) { [weak self] _ in
|
||||||
|
self?.handleScreenGeometryChange(reason: "screens-did-wake")
|
||||||
|
}
|
||||||
|
workspaceObservers = [wakeObserver]
|
||||||
|
}
|
||||||
|
|
||||||
|
private func handleScreenGeometryChange(reason: String) {
|
||||||
|
guard let window else { return }
|
||||||
|
guard window.isVisible || window.alphaValue > 0.01 else { return }
|
||||||
|
guard let context = lockContext() else { return }
|
||||||
|
|
||||||
|
let windowSize = windowSize(for: context.notchSize)
|
||||||
|
let targetFrame = frame(for: windowSize, on: context.screen)
|
||||||
|
if window.frame != targetFrame {
|
||||||
|
window.setFrame(targetFrame, display: true)
|
||||||
|
}
|
||||||
|
|
||||||
|
if let hostingView {
|
||||||
|
hostingView.frame = CGRect(origin: .zero, size: targetFrame.size)
|
||||||
|
hostingView.rootView = LockScreenLiveActivityOverlay(model: overlayModel, animator: overlayAnimator, notchSize: context.notchSize)
|
||||||
|
}
|
||||||
|
|
||||||
|
print("[\(timestamp())] LockScreenLiveActivityWindowManager: realigned window due to \(reason)")
|
||||||
|
}
|
||||||
|
|
||||||
private func present(notchSize: CGSize, on screen: NSScreen) {
|
private func present(notchSize: CGSize, on screen: NSScreen) {
|
||||||
guard Defaults[.enableLockScreenLiveActivity] else {
|
guard Defaults[.enableLockScreenLiveActivity] else {
|
||||||
hideImmediately()
|
hideImmediately()
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue