summaryrefslogtreecommitdiffstats
path: root/video/out/cocoa_cb_common.swift
diff options
context:
space:
mode:
authorAkemi <der.richter@gmx.de>2018-06-06 17:04:40 +0200
committerJan Ekström <jeebjp@gmail.com>2018-06-12 01:51:01 +0300
commit5865086aa84cae5e5505698ccf115a53a1b6b4fa (patch)
tree416b5ce30ae4c4d35af4130aa1956757fb6252ff /video/out/cocoa_cb_common.swift
parent20dffe0621b3e26674850ef0b46ba3e689931d87 (diff)
downloadmpv-5865086aa84cae5e5505698ccf115a53a1b6b4fa.tar.bz2
mpv-5865086aa84cae5e5505698ccf115a53a1b6b4fa.tar.xz
cocoa-cb: remove pre-allocation of window, view and layer
the pre-allocation was needed because the layer allocated a opengl context async itself and we couldn't influence that. so we had to start the core after the context was actually allocated. furthermore a window, view and layer hierarchy had to be created so the layer would create a context. now, instead of relying on the layer to create a context we do this manually and re-use that context later when the layer wants to create one async itself.
Diffstat (limited to 'video/out/cocoa_cb_common.swift')
-rw-r--r--video/out/cocoa_cb_common.swift104
1 files changed, 51 insertions, 53 deletions
diff --git a/video/out/cocoa_cb_common.swift b/video/out/cocoa_cb_common.swift
index 32e1d42b28..e6705902c4 100644
--- a/video/out/cocoa_cb_common.swift
+++ b/video/out/cocoa_cb_common.swift
@@ -30,6 +30,10 @@ class CocoaCB: NSObject {
var cursorVisibilityWanted: Bool = true
var isShuttingDown: Bool = false
+ var title: String = "mpv" {
+ didSet { if window != nil { window.title = title } }
+ }
+
enum State {
case uninit
case needsInit
@@ -47,31 +51,29 @@ class CocoaCB: NSObject {
let queue: DispatchQueue = DispatchQueue(label: "io.mpv.queue")
- override init() {
- super.init()
- window = Window(cocoaCB: self)
-
- view = EventsView(frame: window.contentView!.bounds, cocoaCB: self)
- window.contentView!.addSubview(view)
-
+ convenience init(_ mpvHandle: OpaquePointer) {
+ self.init()
+ mpv = MPVHelper(mpvHandle)
layer = VideoLayer(cocoaCB: self)
- view.layer = layer
- view.wantsLayer = true
- view.layerContentsPlacement = .scaleProportionallyToFit
- }
-
- func setMpvHandle(_ ctx: OpaquePointer) {
- mpv = MPVHelper(ctx)
- layer.setUpRender()
}
- func preinit() {
+ func preinit(_ vo: UnsafeMutablePointer<vo>) {
if backendState == .uninit {
backendState = .needsInit
- DispatchQueue.main.async {
- self.updateICCProfile()
+
+ if let app = NSApp as? Application {
+ let ptr = mp_get_config_group(mpv.mpctx!, vo.pointee.global,
+ app.getMacOSConf())
+ mpv.macOpts = UnsafeMutablePointer<macos_opts>(OpaquePointer(ptr))!.pointee
}
- startDisplayLink()
+
+ view = EventsView(cocoaCB: self)
+ view.layer = layer
+ view.wantsLayer = true
+ view.layerContentsPlacement = .scaleProportionallyToFit
+ startDisplayLink(vo)
+ initLightSensor()
+ addDisplayReconfigureObserver()
}
}
@@ -82,39 +84,37 @@ class CocoaCB: NSObject {
func reconfig(_ vo: UnsafeMutablePointer<vo>) {
if backendState == .needsInit {
- initBackend(vo)
+ DispatchQueue.main.sync { self.initBackend(vo) }
} else {
- layer.setVideo(true)
- updateWindowSize(vo)
- layer.update()
+ DispatchQueue.main.async {
+ self.layer.setVideo(true)
+ self.updateWindowSize(vo)
+ self.layer.update()
+ }
}
}
func initBackend(_ vo: UnsafeMutablePointer<vo>) {
let opts: mp_vo_opts = vo.pointee.opts.pointee
NSApp.setActivationPolicy(.regular)
+ setAppIcon()
- let targetScreen = getTargetScreen(forFullscreen: false) ?? NSScreen.main()
+ let targetScreen = getScreenBy(id: Int(opts.screen_id)) ?? NSScreen.main()
let wr = getWindowGeometry(forScreen: targetScreen!, videoOut: vo)
- let win = Window(contentRect: wr, styleMask: window.styleMask,
- screen: targetScreen, cocoaCB: self)
- win.title = window.title
- win.setOnTop(mpv.getBoolProperty("ontop"))
- win.keepAspect = mpv.getBoolProperty("keepaspect-window")
- window.close()
- window = win
- window.contentView!.addSubview(view)
- view.frame = window.contentView!.frame
- window.initTitleBar()
+ window = Window(contentRect: wr, screen: targetScreen, view: view, cocoaCB: self)
+ updateICCProfile()
+ window.setOnTop(Bool(opts.ontop), Int(opts.ontop_level))
+ window.keepAspect = Bool(opts.keepaspect_window)
+ window.title = title
+ window.border = Bool(opts.border)
- setAppIcon()
window.isRestorable = false
window.makeMain()
window.makeKeyAndOrderFront(nil)
NSApp.activate(ignoringOtherApps: true)
layer.setVideo(true)
- if mpv.getBoolProperty("fullscreen") {
+ if Bool(opts.fullscreen) {
DispatchQueue.main.async {
self.window.toggleFullScreen(nil)
}
@@ -122,13 +122,12 @@ class CocoaCB: NSObject {
window.isMovableByWindowBackground = true
}
- initLightSensor()
- addDisplayReconfigureObserver()
backendState = .init
}
func updateWindowSize(_ vo: UnsafeMutablePointer<vo>) {
- let targetScreen = getTargetScreen(forFullscreen: false) ?? NSScreen.main()
+ let opts: mp_vo_opts = vo.pointee.opts.pointee
+ let targetScreen = getScreenBy(id: Int(opts.screen_id)) ?? NSScreen.main()
let wr = getWindowGeometry(forScreen: targetScreen!, videoOut: vo)
if !window.isVisible {
window.makeKeyAndOrderFront(nil)
@@ -155,8 +154,11 @@ class CocoaCB: NSObject {
return kCVReturnSuccess
}
- func startDisplayLink() {
- let displayId = UInt32(window.screen!.deviceDescription["NSScreenNumber"] as! Int)
+ func startDisplayLink(_ vo: UnsafeMutablePointer<vo>) {
+ let opts: mp_vo_opts = vo.pointee.opts.pointee
+ let screen = getScreenBy(id: Int(opts.screen_id)) ?? NSScreen.main()
+ let displayId = screen!.deviceDescription["NSScreenNumber"] as! UInt32
+
CVDisplayLinkCreateWithActiveCGDisplays(&link)
CVDisplayLinkSetCurrentCGDisplay(link!, displayId)
if #available(macOS 10.12, *) {
@@ -324,8 +326,8 @@ class CocoaCB: NSObject {
}
func getTargetScreen(forFullscreen fs: Bool) -> NSScreen? {
- let screenID = fs ? mpv.getStringProperty("fs-screen") ?? "current":
- mpv.getStringProperty("screen") ?? "current"
+ let screenType = fs ? "fs-screen" : "screen"
+ let screenID = mpv.getStringProperty(screenType) ?? "current"
switch screenID {
case "current", "default", "all":
@@ -432,21 +434,17 @@ class CocoaCB: NSObject {
let titleData = data!.assumingMemoryBound(to: Int8.self)
let title = String(cString: titleData)
DispatchQueue.main.async {
- ccb.window.title = String(cString: titleData)
+ ccb.title = String(cString: titleData)
}
return VO_TRUE
case VOCTRL_PREINIT:
- ccb.preinit()
+ DispatchQueue.main.sync { ccb.preinit(vo!) }
return VO_TRUE
case VOCTRL_UNINIT:
- DispatchQueue.main.async {
- ccb.uninit()
- }
+ DispatchQueue.main.async { ccb.uninit() }
return VO_TRUE
case VOCTRL_RECONFIG:
- DispatchQueue.main.async {
- ccb.reconfig(vo!)
- }
+ ccb.reconfig(vo!)
return VO_TRUE
default:
return VO_NOTIMPL
@@ -472,7 +470,7 @@ class CocoaCB: NSObject {
func processEvent(_ event: UnsafePointer<mpv_event>) {
switch event.pointee.event_id {
case MPV_EVENT_SHUTDOWN:
- if window.isAnimating {
+ if window != nil && window.isAnimating {
isShuttingDown = true
return
}
@@ -499,7 +497,7 @@ class CocoaCB: NSObject {
}
case "ontop":
if let data = MPVHelper.mpvFlagToBool(property.data) {
- window.setOnTop(data)
+ window.setOnTop(data, mpv.getStringProperty("ontop-level") ?? "window")
}
case "keepaspect-window":
if let data = MPVHelper.mpvFlagToBool(property.data) {