//
//  MDisplayLink_macOS.swift
//  Macaw
//
//  Created by Daniil Manin on 8/17/17.
//  Copyright © 2017 Exyte. All rights reserved.
//

import Foundation

#if os(OSX)
    import AppKit

    public class MDisplayLink: MDisplayLinkProtocol {
        private var displayLink: CVDisplayLink?
        private var onUpdate: (() -> Void)?

        // MARK: - Lifecycle
        deinit {
            stop()
        }

        // MARK: - MDisplayLinkProtocol
        func startUpdates(_ onUpdate: @escaping () -> Void) {
            self.onUpdate = onUpdate

            if CVDisplayLinkCreateWithActiveCGDisplays(&displayLink) != kCVReturnSuccess {
                return
            }

            CVDisplayLinkSetOutputCallback(displayLink!, { (_, _, _, _, _, userData) -> CVReturn in

                let `self` = unsafeBitCast(userData, to: MDisplayLink.self)
                `self`.onUpdate?()

                return kCVReturnSuccess
            }, Unmanaged.passUnretained(self).toOpaque())

            if displayLink != nil {
                CVDisplayLinkStart(displayLink!)
            }
        }

        func invalidate() {
            stop()
        }

        private func stop() {
            if displayLink != nil {
                CVDisplayLinkStop(displayLink!)
            }
        }
    }

#endif
