From 5865086aa84cae5e5505698ccf115a53a1b6b4fa Mon Sep 17 00:00:00 2001 From: Akemi Date: Wed, 6 Jun 2018 17:04:40 +0200 Subject: 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. --- video/out/cocoa_cb_common.swift | 104 ++++++++++++++++++++-------------------- 1 file changed, 51 insertions(+), 53 deletions(-) (limited to 'video/out/cocoa_cb_common.swift') 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) { 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(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) { 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) { 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) { - 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) { + 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) { 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) { -- cgit v1.2.3