mirror of
https://github.com/mpv-player/mpv.git
synced 2025-12-28 05:33:14 +00:00
cocoa-cb: remove get_property_* usages and split up mpv helper
all the get_property_* usages were removed because in some circumstances they can lead to deadlocks. they were replaced by accessing the vo and mp_vo_opts structs directly, like on other vos. additionally the mpv helper was split into a mpv and libmpv helper, to differentiate between private and public APIs and for future changes like a macOS vulkan context for vo=gpu.
This commit is contained in:
@@ -19,8 +19,8 @@ import Cocoa
|
||||
|
||||
class EventsView: NSView {
|
||||
|
||||
weak var cocoaCB: CocoaCB!
|
||||
var mpv: MPVHelper { get { return cocoaCB.mpv } }
|
||||
unowned var cocoaCB: CocoaCB
|
||||
var mpv: MPVHelper? { get { return cocoaCB.mpv } }
|
||||
|
||||
var tracker: NSTrackingArea?
|
||||
var hasMouseDown: Bool = false
|
||||
@@ -117,64 +117,64 @@ class EventsView: NSView {
|
||||
}
|
||||
|
||||
override func mouseEntered(with event: NSEvent) {
|
||||
if mpv.getBoolProperty("input-cursor") {
|
||||
if mpv?.mouseEnabled() ?? true {
|
||||
cocoa_put_key_with_modifiers(SWIFT_KEY_MOUSE_ENTER, 0)
|
||||
}
|
||||
}
|
||||
|
||||
override func mouseExited(with event: NSEvent) {
|
||||
if mpv.getBoolProperty("input-cursor") {
|
||||
if mpv?.mouseEnabled() ?? true {
|
||||
cocoa_put_key_with_modifiers(SWIFT_KEY_MOUSE_LEAVE, 0)
|
||||
}
|
||||
cocoaCB.titleBar?.hide()
|
||||
}
|
||||
|
||||
override func mouseMoved(with event: NSEvent) {
|
||||
if mpv.getBoolProperty("input-cursor") {
|
||||
if mpv?.mouseEnabled() ?? true {
|
||||
signalMouseMovement(event)
|
||||
}
|
||||
cocoaCB.titleBar?.show()
|
||||
}
|
||||
|
||||
override func mouseDragged(with event: NSEvent) {
|
||||
if mpv.getBoolProperty("input-cursor") {
|
||||
if mpv?.mouseEnabled() ?? true {
|
||||
signalMouseMovement(event)
|
||||
}
|
||||
}
|
||||
|
||||
override func mouseDown(with event: NSEvent) {
|
||||
if mpv.getBoolProperty("input-cursor") {
|
||||
if mpv?.mouseEnabled() ?? true {
|
||||
signalMouseDown(event)
|
||||
}
|
||||
}
|
||||
|
||||
override func mouseUp(with event: NSEvent) {
|
||||
if mpv.getBoolProperty("input-cursor") {
|
||||
if mpv?.mouseEnabled() ?? true {
|
||||
signalMouseUp(event)
|
||||
}
|
||||
cocoaCB.window?.isMoving = false
|
||||
}
|
||||
|
||||
override func rightMouseDown(with event: NSEvent) {
|
||||
if mpv.getBoolProperty("input-cursor") {
|
||||
if mpv?.mouseEnabled() ?? true {
|
||||
signalMouseDown(event)
|
||||
}
|
||||
}
|
||||
|
||||
override func rightMouseUp(with event: NSEvent) {
|
||||
if mpv.getBoolProperty("input-cursor") {
|
||||
if mpv?.mouseEnabled() ?? true {
|
||||
signalMouseUp(event)
|
||||
}
|
||||
}
|
||||
|
||||
override func otherMouseDown(with event: NSEvent) {
|
||||
if mpv.getBoolProperty("input-cursor") {
|
||||
if mpv?.mouseEnabled() ?? true {
|
||||
signalMouseDown(event)
|
||||
}
|
||||
}
|
||||
|
||||
override func otherMouseUp(with event: NSEvent) {
|
||||
if mpv.getBoolProperty("input-cursor") {
|
||||
if mpv?.mouseEnabled() ?? true {
|
||||
signalMouseUp(event)
|
||||
}
|
||||
}
|
||||
@@ -203,7 +203,7 @@ class EventsView: NSView {
|
||||
|
||||
cocoaCB.window?.updateMovableBackground(point)
|
||||
if !(cocoaCB.window?.isMoving ?? false) {
|
||||
mpv.setMousePosition(point)
|
||||
mpv?.setMousePosition(point)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -219,11 +219,11 @@ class EventsView: NSView {
|
||||
cmd = delta > 0 ? SWIFT_WHEEL_RIGHT : SWIFT_WHEEL_LEFT;
|
||||
}
|
||||
|
||||
mpv.putAxis(cmd, delta: abs(delta))
|
||||
mpv?.putAxis(cmd, delta: abs(delta))
|
||||
}
|
||||
|
||||
override func scrollWheel(with event: NSEvent) {
|
||||
if !mpv.getBoolProperty("input-cursor") {
|
||||
if !(mpv?.mouseEnabled() ?? true) {
|
||||
return
|
||||
}
|
||||
|
||||
@@ -246,7 +246,6 @@ class EventsView: NSView {
|
||||
}
|
||||
|
||||
func containsMouseLocation() -> Bool {
|
||||
if cocoaCB == nil { return false }
|
||||
var topMargin: CGFloat = 0.0
|
||||
let menuBarHeight = NSApp.mainMenu?.menuBarHeight ?? 23.0
|
||||
|
||||
|
||||
@@ -19,8 +19,8 @@ import Cocoa
|
||||
|
||||
class TitleBar: NSVisualEffectView {
|
||||
|
||||
weak var cocoaCB: CocoaCB!
|
||||
var mpv: MPVHelper { get { return cocoaCB.mpv } }
|
||||
unowned var cocoaCB: CocoaCB
|
||||
var libmpv: LibmpvHelper { get { return cocoaCB.libmpv } }
|
||||
|
||||
var systemBar: NSView? {
|
||||
get { return cocoaCB.window?.standardWindowButton(.closeButton)?.superview }
|
||||
@@ -67,9 +67,9 @@ class TitleBar: NSVisualEffectView {
|
||||
window.contentView?.addSubview(self, positioned: .above, relativeTo: nil)
|
||||
window.titlebarAppearsTransparent = true
|
||||
window.styleMask.insert(.fullSizeContentView)
|
||||
set(appearance: Int(mpv.macOpts?.macos_title_bar_appearance ?? 0))
|
||||
set(material: Int(mpv.macOpts?.macos_title_bar_material ?? 0))
|
||||
set(color: mpv.macOpts?.macos_title_bar_color ?? "#00000000")
|
||||
set(appearance: Int(libmpv.macOpts.macos_title_bar_appearance))
|
||||
set(material: Int(libmpv.macOpts.macos_title_bar_material))
|
||||
set(color: libmpv.macOpts.macos_title_bar_color)
|
||||
}
|
||||
|
||||
required init?(coder: NSCoder) {
|
||||
|
||||
@@ -66,8 +66,8 @@ let attributeLookUp: [UInt32:String] = [
|
||||
|
||||
class VideoLayer: CAOpenGLLayer {
|
||||
|
||||
weak var cocoaCB: CocoaCB!
|
||||
var mpv: MPVHelper { get { return cocoaCB.mpv } }
|
||||
unowned var cocoaCB: CocoaCB
|
||||
var libmpv: LibmpvHelper { get { return cocoaCB.libmpv } }
|
||||
|
||||
let displayLock = NSLock()
|
||||
let cglContext: CGLContextObj
|
||||
@@ -101,8 +101,8 @@ class VideoLayer: CAOpenGLLayer {
|
||||
|
||||
init(cocoaCB ccb: CocoaCB) {
|
||||
cocoaCB = ccb
|
||||
(cglPixelFormat, bufferDepth) = VideoLayer.createPixelFormat(ccb.mpv)
|
||||
cglContext = VideoLayer.createContext(ccb.mpv, cglPixelFormat)
|
||||
(cglPixelFormat, bufferDepth) = VideoLayer.createPixelFormat(ccb.libmpv)
|
||||
cglContext = VideoLayer.createContext(ccb.libmpv, cglPixelFormat)
|
||||
super.init()
|
||||
autoresizingMask = [.layerWidthSizable, .layerHeightSizable]
|
||||
backgroundColor = NSColor.black.cgColor
|
||||
@@ -115,9 +115,9 @@ class VideoLayer: CAOpenGLLayer {
|
||||
CGLSetParameter(cglContext, kCGLCPSwapInterval, &i)
|
||||
CGLSetCurrentContext(cglContext)
|
||||
|
||||
mpv.initRender()
|
||||
mpv.setRenderUpdateCallback(updateCallback, context: self)
|
||||
mpv.setRenderControlCallback(cocoaCB.controlCallback, context: cocoaCB)
|
||||
libmpv.initRender()
|
||||
libmpv.setRenderUpdateCallback(updateCallback, context: self)
|
||||
libmpv.setRenderControlCallback(cocoaCB.controlCallback, context: cocoaCB)
|
||||
}
|
||||
|
||||
//necessary for when the layer containing window changes the screen
|
||||
@@ -144,7 +144,7 @@ class VideoLayer: CAOpenGLLayer {
|
||||
isAsynchronous = false
|
||||
}
|
||||
return cocoaCB.backendState == .initialized &&
|
||||
(forceDraw || mpv.isRenderUpdateFrame())
|
||||
(forceDraw || libmpv.isRenderUpdateFrame())
|
||||
}
|
||||
|
||||
override func draw(inCGLContext ctx: CGLContextObj,
|
||||
@@ -163,7 +163,7 @@ class VideoLayer: CAOpenGLLayer {
|
||||
}
|
||||
|
||||
updateSurfaceSize()
|
||||
mpv.drawRender(surfaceSize, bufferDepth, ctx)
|
||||
libmpv.drawRender(surfaceSize, bufferDepth, ctx)
|
||||
|
||||
if needsICCUpdate {
|
||||
needsICCUpdate = false
|
||||
@@ -218,8 +218,8 @@ class VideoLayer: CAOpenGLLayer {
|
||||
CATransaction.flush()
|
||||
if isUpdate && needsFlip {
|
||||
CGLSetCurrentContext(cglContext)
|
||||
if mpv.isRenderUpdateFrame() {
|
||||
mpv.drawRender(NSZeroSize, bufferDepth, cglContext, skip: true)
|
||||
if libmpv.isRenderUpdateFrame() {
|
||||
libmpv.drawRender(NSZeroSize, bufferDepth, cglContext, skip: true)
|
||||
}
|
||||
}
|
||||
displayLock.unlock()
|
||||
@@ -235,29 +235,29 @@ class VideoLayer: CAOpenGLLayer {
|
||||
}
|
||||
}
|
||||
|
||||
class func createPixelFormat(_ mpv: MPVHelper) -> (CGLPixelFormatObj, GLint) {
|
||||
class func createPixelFormat(_ libmpv: LibmpvHelper) -> (CGLPixelFormatObj, GLint) {
|
||||
var pix: CGLPixelFormatObj?
|
||||
var depth: GLint = 8
|
||||
var err: CGLError = CGLError(rawValue: 0)
|
||||
let swRender = mpv.macOpts?.cocoa_cb_sw_renderer ?? -1
|
||||
let swRender = libmpv.macOpts.cocoa_cb_sw_renderer
|
||||
|
||||
if swRender != 1 {
|
||||
(pix, depth, err) = VideoLayer.findPixelFormat(mpv)
|
||||
(pix, depth, err) = VideoLayer.findPixelFormat(libmpv)
|
||||
}
|
||||
|
||||
if (err != kCGLNoError || pix == nil) && swRender != 0 {
|
||||
(pix, depth, err) = VideoLayer.findPixelFormat(mpv, software: true)
|
||||
(pix, depth, err) = VideoLayer.findPixelFormat(libmpv, software: true)
|
||||
}
|
||||
|
||||
guard let pixelFormat = pix, err == kCGLNoError else {
|
||||
mpv.sendError("Couldn't create any CGL pixel format")
|
||||
libmpv.sendError("Couldn't create any CGL pixel format")
|
||||
exit(1)
|
||||
}
|
||||
|
||||
return (pixelFormat, depth)
|
||||
}
|
||||
|
||||
class func findPixelFormat(_ mpv: MPVHelper, software: Bool = false) -> (CGLPixelFormatObj?, GLint, CGLError) {
|
||||
class func findPixelFormat(_ libmpv: LibmpvHelper, software: Bool = false) -> (CGLPixelFormatObj?, GLint, CGLError) {
|
||||
var pix: CGLPixelFormatObj?
|
||||
var err: CGLError = CGLError(rawValue: 0)
|
||||
var npix: GLint = 0
|
||||
@@ -267,7 +267,7 @@ class VideoLayer: CAOpenGLLayer {
|
||||
glBase.insert(CGLPixelFormatAttribute(ver.rawValue), at: 1)
|
||||
|
||||
var glFormat = [glBase]
|
||||
if (mpv.macOpts?.cocoa_cb_10bit_context == 1) {
|
||||
if (libmpv.macOpts.cocoa_cb_10bit_context == 1) {
|
||||
glFormat += [glFormat10Bit]
|
||||
}
|
||||
glFormat += glFormatOptional
|
||||
@@ -283,7 +283,7 @@ class VideoLayer: CAOpenGLLayer {
|
||||
return attributeLookUp[value.rawValue] ?? String(value.rawValue)
|
||||
})
|
||||
|
||||
mpv.sendVerbose("Created CGL pixel format with attributes: " +
|
||||
libmpv.sendVerbose("Created CGL pixel format with attributes: " +
|
||||
"\(attArray.joined(separator: ", "))")
|
||||
return (pix, glFormat.contains(glFormat10Bit) ? 16 : 8, err)
|
||||
}
|
||||
@@ -291,24 +291,23 @@ class VideoLayer: CAOpenGLLayer {
|
||||
}
|
||||
|
||||
let errS = String(cString: CGLErrorString(err))
|
||||
mpv.sendWarning("Couldn't create a " +
|
||||
"\(software ? "software" : "hardware accelerated") " +
|
||||
"CGL pixel format: \(errS) (\(err.rawValue))")
|
||||
|
||||
if software == false && (mpv.macOpts?.cocoa_cb_sw_renderer ?? -1) == -1 {
|
||||
mpv.sendWarning("Falling back to software renderer")
|
||||
libmpv.sendWarning("Couldn't create a " +
|
||||
"\(software ? "software" : "hardware accelerated") " +
|
||||
"CGL pixel format: \(errS) (\(err.rawValue))")
|
||||
if software == false && libmpv.macOpts.cocoa_cb_sw_renderer == -1 {
|
||||
libmpv.sendWarning("Falling back to software renderer")
|
||||
}
|
||||
|
||||
return (pix, 8, err)
|
||||
}
|
||||
|
||||
class func createContext(_ mpv: MPVHelper, _ pixelFormat: CGLPixelFormatObj) -> CGLContextObj {
|
||||
class func createContext(_ libmpv: LibmpvHelper, _ pixelFormat: CGLPixelFormatObj) -> CGLContextObj {
|
||||
var context: CGLContextObj?
|
||||
let error = CGLCreateContext(pixelFormat, nil, &context)
|
||||
|
||||
guard let cglContext = context, error == kCGLNoError else {
|
||||
let errS = String(cString: CGLErrorString(error))
|
||||
mpv.sendError("Couldn't create a CGLContext: " + errS)
|
||||
libmpv.sendError("Couldn't create a CGLContext: " + errS)
|
||||
exit(1)
|
||||
}
|
||||
|
||||
|
||||
@@ -20,7 +20,8 @@ import Cocoa
|
||||
class Window: NSWindow, NSWindowDelegate {
|
||||
|
||||
weak var cocoaCB: CocoaCB! = nil
|
||||
var mpv: MPVHelper { get { return cocoaCB.mpv } }
|
||||
var mpv: MPVHelper? { get { return cocoaCB.mpv } }
|
||||
var libmpv: LibmpvHelper { get { return cocoaCB.libmpv } }
|
||||
|
||||
var targetScreen: NSScreen?
|
||||
var previousScreen: NSScreen?
|
||||
@@ -134,7 +135,7 @@ class Window: NSWindow, NSWindowDelegate {
|
||||
setFrame(frame, display: true)
|
||||
}
|
||||
|
||||
if mpv.getBoolProperty("native-fs") {
|
||||
if Bool(mpv?.opts.native_fs ?? 1) {
|
||||
super.toggleFullScreen(sender)
|
||||
} else {
|
||||
if !isInFullscreen {
|
||||
@@ -245,48 +246,35 @@ class Window: NSWindow, NSWindowDelegate {
|
||||
cocoaCB.layer?.update()
|
||||
}
|
||||
|
||||
func getFsAnimationDuration(_ def: Double) -> Double{
|
||||
let duration = mpv.getStringProperty("macos-fs-animation-duration") ?? "default"
|
||||
if duration == "default" {
|
||||
func getFsAnimationDuration(_ def: Double) -> Double {
|
||||
let duration = libmpv.macOpts.macos_fs_animation_duration
|
||||
if duration < 0 {
|
||||
return def
|
||||
} else {
|
||||
return (Double(duration) ?? 0.2)/1000
|
||||
return Double(duration)/1000
|
||||
}
|
||||
}
|
||||
|
||||
func setOnTop(_ state: Bool, _ ontopLevel: Any) {
|
||||
let stdLevel: NSWindow.Level = .normal
|
||||
|
||||
func setOnTop(_ state: Bool, _ ontopLevel: Int) {
|
||||
if state {
|
||||
if ontopLevel is Int {
|
||||
switch ontopLevel as? Int {
|
||||
case .some(-1):
|
||||
level = .floating
|
||||
case .some(-2):
|
||||
level = .statusBar + 1
|
||||
default:
|
||||
level = NSWindow.Level(ontopLevel as? Int ?? stdLevel.rawValue)
|
||||
}
|
||||
} else {
|
||||
switch ontopLevel as? String {
|
||||
case .some("window"):
|
||||
level = .floating
|
||||
case .some("system"):
|
||||
level = .statusBar + 1
|
||||
default:
|
||||
level = NSWindow.Level(Int(ontopLevel as? String ?? "") ?? stdLevel.rawValue)
|
||||
}
|
||||
switch ontopLevel {
|
||||
case -1:
|
||||
level = .floating
|
||||
case -2:
|
||||
level = .statusBar + 1
|
||||
default:
|
||||
level = NSWindow.Level(ontopLevel)
|
||||
}
|
||||
collectionBehavior.remove(.transient)
|
||||
collectionBehavior.insert(.managed)
|
||||
} else {
|
||||
level = stdLevel
|
||||
level = .normal
|
||||
}
|
||||
}
|
||||
|
||||
func updateMovableBackground(_ pos: NSPoint) {
|
||||
if !isInFullscreen {
|
||||
isMovableByWindowBackground = mpv.canBeDraggedAt(pos)
|
||||
isMovableByWindowBackground = mpv?.canBeDraggedAt(pos) ?? true
|
||||
} else {
|
||||
isMovableByWindowBackground = false
|
||||
}
|
||||
@@ -448,7 +436,7 @@ class Window: NSWindow, NSWindowDelegate {
|
||||
@objc func setDoubleWindowSize() { setWindowScale(2.0) }
|
||||
|
||||
func setWindowScale(_ scale: Double) {
|
||||
mpv.commandAsync(["osd-auto", "set", "window-scale", "\(scale)"])
|
||||
mpv?.command("set window-scale \(scale)")
|
||||
}
|
||||
|
||||
func windowDidChangeScreen(_ notification: Notification) {
|
||||
|
||||
@@ -20,7 +20,8 @@ import IOKit.pwr_mgt
|
||||
|
||||
class CocoaCB: NSObject {
|
||||
|
||||
var mpv: MPVHelper
|
||||
var mpv: MPVHelper?
|
||||
var libmpv: LibmpvHelper
|
||||
var window: Window?
|
||||
var titleBar: TitleBar?
|
||||
var view: EventsView?
|
||||
@@ -53,15 +54,24 @@ class CocoaCB: NSObject {
|
||||
let queue: DispatchQueue = DispatchQueue(label: "io.mpv.queue")
|
||||
|
||||
@objc init(_ mpvHandle: OpaquePointer) {
|
||||
mpv = MPVHelper(mpvHandle)
|
||||
libmpv = LibmpvHelper(mpvHandle, "cocoacb")
|
||||
super.init()
|
||||
layer = VideoLayer(cocoaCB: self)
|
||||
|
||||
libmpv.observeFlag("ontop")
|
||||
libmpv.observeFlag("border")
|
||||
libmpv.observeFlag("keepaspect-window")
|
||||
libmpv.observeString("macos-title-bar-style")
|
||||
libmpv.observeString("macos-title-bar-appearance")
|
||||
libmpv.observeString("macos-title-bar-material")
|
||||
libmpv.observeString("macos-title-bar-color")
|
||||
}
|
||||
|
||||
func preinit(_ vo: UnsafeMutablePointer<vo>) {
|
||||
if backendState == .uninitialized {
|
||||
backendState = .needsInit
|
||||
|
||||
mpv = MPVHelper(vo, "cocoacb")
|
||||
view = EventsView(cocoaCB: self)
|
||||
view?.layer = layer
|
||||
view?.wantsLayer = true
|
||||
@@ -77,7 +87,7 @@ class CocoaCB: NSObject {
|
||||
}
|
||||
|
||||
func reconfig(_ vo: UnsafeMutablePointer<vo>) {
|
||||
mpv.vo = vo
|
||||
mpv?.vo = vo
|
||||
if backendState == .needsInit {
|
||||
DispatchQueue.main.sync { self.initBackend(vo) }
|
||||
} else {
|
||||
@@ -94,18 +104,18 @@ class CocoaCB: NSObject {
|
||||
setAppIcon()
|
||||
|
||||
guard let view = self.view else {
|
||||
mpv.sendError("Something went wrong, no View was initialized")
|
||||
libmpv.sendError("Something went wrong, no View was initialized")
|
||||
exit(1)
|
||||
}
|
||||
guard let targetScreen = getScreenBy(id: Int(opts.screen_id)) ?? NSScreen.main else {
|
||||
mpv.sendError("Something went wrong, no Screen was found")
|
||||
libmpv.sendError("Something went wrong, no Screen was found")
|
||||
exit(1)
|
||||
}
|
||||
|
||||
let wr = getWindowGeometry(forScreen: targetScreen, videoOut: vo)
|
||||
window = Window(contentRect: wr, screen: targetScreen, view: view, cocoaCB: self)
|
||||
guard let window = self.window else {
|
||||
mpv.sendError("Something went wrong, no Window was initialized")
|
||||
libmpv.sendError("Something went wrong, no Window was initialized")
|
||||
exit(1)
|
||||
}
|
||||
|
||||
@@ -136,7 +146,7 @@ class CocoaCB: NSObject {
|
||||
func updateWindowSize(_ vo: UnsafeMutablePointer<vo>) {
|
||||
let opts: mp_vo_opts = vo.pointee.opts.pointee
|
||||
guard let targetScreen = getScreenBy(id: Int(opts.screen_id)) ?? NSScreen.main else {
|
||||
mpv.sendWarning("Couldn't update Window size, no Screen available")
|
||||
libmpv.sendWarning("Couldn't update Window size, no Screen available")
|
||||
return
|
||||
}
|
||||
|
||||
@@ -162,7 +172,7 @@ class CocoaCB: NSObject {
|
||||
flagsOut: UnsafeMutablePointer<CVOptionFlags>,
|
||||
displayLinkContext: UnsafeMutableRawPointer?) -> CVReturn in
|
||||
let ccb = unsafeBitCast(displayLinkContext, to: CocoaCB.self)
|
||||
ccb.mpv.reportRenderFlip()
|
||||
ccb.libmpv.reportRenderFlip()
|
||||
return kCVReturnSuccess
|
||||
}
|
||||
|
||||
@@ -173,14 +183,14 @@ class CocoaCB: NSObject {
|
||||
guard let screen = getScreenBy(id: Int(opts.screen_id)) ?? NSScreen.main,
|
||||
let link = self.link else
|
||||
{
|
||||
mpv.sendWarning("Couldn't start DisplayLink, no Screen or DisplayLink available")
|
||||
libmpv.sendWarning("Couldn't start DisplayLink, no Screen or DisplayLink available")
|
||||
return
|
||||
}
|
||||
|
||||
CVDisplayLinkSetCurrentCGDisplay(link, screen.displayID)
|
||||
if #available(macOS 10.12, *) {
|
||||
CVDisplayLinkSetOutputHandler(link) { link, now, out, inFlags, outFlags -> CVReturn in
|
||||
self.mpv.reportRenderFlip()
|
||||
self.libmpv.reportRenderFlip()
|
||||
return kCVReturnSuccess
|
||||
}
|
||||
} else {
|
||||
@@ -197,7 +207,7 @@ class CocoaCB: NSObject {
|
||||
|
||||
func updateDisplaylink() {
|
||||
guard let screen = window?.screen, let link = self.link else {
|
||||
mpv.sendWarning("Couldn't update DisplayLink, no Screen or DisplayLink available")
|
||||
libmpv.sendWarning("Couldn't update DisplayLink, no Screen or DisplayLink available")
|
||||
return
|
||||
}
|
||||
|
||||
@@ -220,17 +230,17 @@ class CocoaCB: NSObject {
|
||||
}
|
||||
|
||||
if fabs(actualFps - nominalFps) > 0.1 {
|
||||
mpv.sendVerbose("Falling back to nominal display refresh rate: \(nominalFps)")
|
||||
libmpv.sendVerbose("Falling back to nominal display refresh rate: \(nominalFps)")
|
||||
return nominalFps
|
||||
} else {
|
||||
return actualFps
|
||||
}
|
||||
}
|
||||
} else {
|
||||
mpv.sendWarning("No DisplayLink available")
|
||||
libmpv.sendWarning("No DisplayLink available")
|
||||
}
|
||||
|
||||
mpv.sendWarning("Falling back to standard display refresh rate: 60Hz")
|
||||
libmpv.sendWarning("Falling back to standard display refresh rate: 60Hz")
|
||||
return 60.0
|
||||
}
|
||||
|
||||
@@ -265,11 +275,11 @@ class CocoaCB: NSObject {
|
||||
|
||||
func updateICCProfile() {
|
||||
guard let colorSpace = window?.screen?.colorSpace else {
|
||||
mpv.sendWarning("Couldn't update ICC Profile, no color space available")
|
||||
libmpv.sendWarning("Couldn't update ICC Profile, no color space available")
|
||||
return
|
||||
}
|
||||
|
||||
mpv.setRenderICCProfile(colorSpace)
|
||||
libmpv.setRenderICCProfile(colorSpace)
|
||||
if #available(macOS 10.11, *) {
|
||||
layer?.colorspace = colorSpace.cgColorSpace
|
||||
}
|
||||
@@ -305,7 +315,7 @@ class CocoaCB: NSObject {
|
||||
var mean = (values[0] + values[1]) / 2
|
||||
if ccb.lastLmu != mean {
|
||||
ccb.lastLmu = mean
|
||||
ccb.mpv.setRenderLux(ccb.lmuToLux(ccb.lastLmu))
|
||||
ccb.libmpv.setRenderLux(ccb.lmuToLux(ccb.lastLmu))
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -313,7 +323,7 @@ class CocoaCB: NSObject {
|
||||
func initLightSensor() {
|
||||
let srv = IOServiceGetMatchingService(kIOMasterPortDefault, IOServiceMatching("AppleLMUController"))
|
||||
if srv == IO_OBJECT_NULL {
|
||||
mpv.sendVerbose("Can't find an ambient light sensor")
|
||||
libmpv.sendVerbose("Can't find an ambient light sensor")
|
||||
return
|
||||
}
|
||||
|
||||
@@ -325,7 +335,7 @@ class CocoaCB: NSObject {
|
||||
IOObjectRelease(srv)
|
||||
|
||||
if kr != KERN_SUCCESS {
|
||||
mpv.sendVerbose("Can't start ambient light sensor connection")
|
||||
libmpv.sendVerbose("Can't start ambient light sensor connection")
|
||||
return
|
||||
}
|
||||
lightSensorCallback(MPVHelper.bridge(obj: self), 0, 0, nil)
|
||||
@@ -344,7 +354,7 @@ class CocoaCB: NSObject {
|
||||
let displayID = ccb.window?.screen?.displayID ?? display
|
||||
|
||||
if displayID == display {
|
||||
ccb.mpv.sendVerbose("Detected display mode change, updating screen refresh rate");
|
||||
ccb.libmpv.sendVerbose("Detected display mode change, updating screen refresh rate");
|
||||
ccb.flagEvents(VO_EVENT_WIN_STATE)
|
||||
}
|
||||
}
|
||||
@@ -359,20 +369,13 @@ class CocoaCB: NSObject {
|
||||
}
|
||||
|
||||
func getTargetScreen(forFullscreen fs: Bool) -> NSScreen? {
|
||||
let screenType = fs ? "fs-screen" : "screen"
|
||||
let screenID = mpv.getStringProperty(screenType) ?? "current"
|
||||
|
||||
switch screenID {
|
||||
case "current", "default", "all":
|
||||
return getScreenBy(id: -1)
|
||||
default:
|
||||
return getScreenBy(id: Int(screenID) ?? 0)
|
||||
}
|
||||
let screenID = fs ? (mpv?.opts.fsscreen_id ?? 100) : (mpv?.opts.screen_id ?? 100)
|
||||
return getScreenBy(id: Int(screenID))
|
||||
}
|
||||
|
||||
func getScreenBy(id screenID: Int) -> NSScreen? {
|
||||
if screenID >= NSScreen.screens.count {
|
||||
mpv.sendInfo("Screen ID \(screenID) does not exist, falling back to current device")
|
||||
libmpv.sendInfo("Screen ID \(screenID) does not exist, falling back to current device")
|
||||
return nil
|
||||
} else if screenID < 0 {
|
||||
return nil
|
||||
@@ -405,7 +408,12 @@ class CocoaCB: NSObject {
|
||||
eventsLock.lock()
|
||||
events |= ev
|
||||
eventsLock.unlock()
|
||||
vo_wakeup(mpv.vo)
|
||||
|
||||
guard let vout = mpv?.vo else {
|
||||
libmpv.sendWarning("vo nil in flagEvents")
|
||||
return
|
||||
}
|
||||
vo_wakeup(vout)
|
||||
}
|
||||
|
||||
func checkEvents() -> Int {
|
||||
@@ -418,6 +426,10 @@ class CocoaCB: NSObject {
|
||||
|
||||
var controlCallback: mp_render_cb_control_fn = { ( vo, ctx, events, request, data ) -> Int32 in
|
||||
let ccb = unsafeBitCast(ctx, to: CocoaCB.self)
|
||||
guard let vout = vo, let opts: mp_vo_opts = vout.pointee.opts?.pointee else {
|
||||
ccb.libmpv.sendWarning("Nil vo or opts in Control Callback")
|
||||
return VO_FALSE
|
||||
}
|
||||
|
||||
switch mp_voctrl(request) {
|
||||
case VOCTRL_CHECK_EVENTS:
|
||||
@@ -463,7 +475,7 @@ class CocoaCB: NSObject {
|
||||
let size = UnsafeBufferPointer(start: sizeData, count: 2)
|
||||
var rect = NSMakeRect(0, 0, CGFloat(size[0]), CGFloat(size[1]))
|
||||
DispatchQueue.main.async {
|
||||
if let screen = ccb.window?.currentScreen, !ccb.mpv.getBoolProperty("hidpi-window-scale") {
|
||||
if let screen = ccb.window?.currentScreen, !Bool(opts.hidpi_window_scale) {
|
||||
rect = screen.convertRectFromBacking(rect)
|
||||
}
|
||||
ccb.window?.updateSize(rect.size)
|
||||
@@ -479,9 +491,7 @@ class CocoaCB: NSObject {
|
||||
}
|
||||
return VO_FALSE
|
||||
case VOCTRL_GET_DISPLAY_NAMES:
|
||||
if let opts: mp_vo_opts = vo?.pointee.opts?.pointee,
|
||||
let dnames = data?.assumingMemoryBound(to: UnsafeMutablePointer<UnsafeMutablePointer<Int8>?>?.self)
|
||||
{
|
||||
if let dnames = data?.assumingMemoryBound(to: UnsafeMutablePointer<UnsafeMutablePointer<Int8>?>?.self) {
|
||||
var array: UnsafeMutablePointer<UnsafeMutablePointer<Int8>?>? = nil
|
||||
var count: Int32 = 0
|
||||
let screen = ccb.window != nil ? ccb.window?.screen :
|
||||
@@ -504,20 +514,14 @@ class CocoaCB: NSObject {
|
||||
}
|
||||
return VO_FALSE
|
||||
case VOCTRL_PREINIT:
|
||||
if let vout = vo {
|
||||
DispatchQueue.main.sync { ccb.preinit(vout) }
|
||||
return VO_TRUE
|
||||
}
|
||||
return VO_FALSE
|
||||
DispatchQueue.main.sync { ccb.preinit(vout) }
|
||||
return VO_TRUE
|
||||
case VOCTRL_UNINIT:
|
||||
DispatchQueue.main.async { ccb.uninit() }
|
||||
return VO_TRUE
|
||||
case VOCTRL_RECONFIG:
|
||||
if let vout = vo {
|
||||
ccb.reconfig(vout)
|
||||
return VO_TRUE
|
||||
}
|
||||
return VO_FALSE
|
||||
ccb.reconfig(vout)
|
||||
return VO_TRUE
|
||||
default:
|
||||
return VO_NOTIMPL
|
||||
}
|
||||
@@ -525,7 +529,7 @@ class CocoaCB: NSObject {
|
||||
|
||||
func shutdown(_ destroy: Bool = false) {
|
||||
isShuttingDown = window?.isAnimating ?? false ||
|
||||
window?.isInFullscreen ?? false && mpv.getBoolProperty("native-fs")
|
||||
window?.isInFullscreen ?? false && Bool(mpv?.opts.native_fs ?? 1)
|
||||
if window?.isInFullscreen ?? false && !(window?.isAnimating ?? false) {
|
||||
window?.close()
|
||||
}
|
||||
@@ -535,8 +539,8 @@ class CocoaCB: NSObject {
|
||||
stopDisplaylink()
|
||||
uninitLightSensor()
|
||||
removeDisplayReconfigureObserver()
|
||||
mpv.deinitRender()
|
||||
mpv.deinitMPV(destroy)
|
||||
libmpv.deinitRender()
|
||||
libmpv.deinitMPV(destroy)
|
||||
}
|
||||
|
||||
func checkShutdown() {
|
||||
@@ -566,27 +570,27 @@ class CocoaCB: NSObject {
|
||||
|
||||
switch String(cString: property.name) {
|
||||
case "border":
|
||||
if let data = MPVHelper.mpvFlagToBool(property.data) {
|
||||
if let data = LibmpvHelper.mpvFlagToBool(property.data) {
|
||||
window?.border = data
|
||||
}
|
||||
case "ontop":
|
||||
if let data = MPVHelper.mpvFlagToBool(property.data) {
|
||||
window?.setOnTop(data, mpv.getStringProperty("ontop-level") ?? "window")
|
||||
if let data = LibmpvHelper.mpvFlagToBool(property.data) {
|
||||
window?.setOnTop(data, Int(mpv?.opts.ontop_level ?? -1))
|
||||
}
|
||||
case "keepaspect-window":
|
||||
if let data = MPVHelper.mpvFlagToBool(property.data) {
|
||||
if let data = LibmpvHelper.mpvFlagToBool(property.data) {
|
||||
window?.keepAspect = data
|
||||
}
|
||||
case "macos-title-bar-appearance":
|
||||
if let data = MPVHelper.mpvStringArrayToString(property.data) {
|
||||
if let data = LibmpvHelper.mpvStringArrayToString(property.data) {
|
||||
titleBar?.set(appearance: data)
|
||||
}
|
||||
case "macos-title-bar-material":
|
||||
if let data = MPVHelper.mpvStringArrayToString(property.data) {
|
||||
if let data = LibmpvHelper.mpvStringArrayToString(property.data) {
|
||||
titleBar?.set(material: data)
|
||||
}
|
||||
case "macos-title-bar-color":
|
||||
if let data = MPVHelper.mpvStringArrayToString(property.data) {
|
||||
if let data = LibmpvHelper.mpvStringArrayToString(property.data) {
|
||||
titleBar?.set(color: data)
|
||||
}
|
||||
default:
|
||||
|
||||
Reference in New Issue
Block a user