From c8cc203735d73f62def2692d1027f45ac10c03db Mon Sep 17 00:00:00 2001 From: der richter Date: Sat, 30 Nov 2019 23:47:52 +0100 Subject: cocoa-cb: use m_config_cache and new VOCTRL for option handling this removes the direct access of the mp_vo_opts stuct via the vo struct and replaces it with the m_config_cache usage. this updates the fullscreen and window-minimized property via m_config_cache_write_opt instead of the old mechanism via VOCTRL and event flagging. also use the new VOCTRL_VO_OPTS_CHANGED event for fullscreen and border changes. --- video/out/cocoa_cb_common.swift | 67 +++++++++++++++++++++-------------------- 1 file changed, 34 insertions(+), 33 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 504f0dfad6..aa1315fbbf 100644 --- a/video/out/cocoa_cb_common.swift +++ b/video/out/cocoa_cb_common.swift @@ -59,7 +59,6 @@ class CocoaCB: NSObject { 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") @@ -68,10 +67,10 @@ class CocoaCB: NSObject { } func preinit(_ vo: UnsafeMutablePointer) { + mpv = MPVHelper(vo, "cocoacb") + if backendState == .uninitialized { backendState = .needsInit - - mpv = MPVHelper(vo, "cocoacb") view = EventsView(cocoaCB: self) view?.layer = layer view?.wantsLayer = true @@ -84,6 +83,7 @@ class CocoaCB: NSObject { func uninit() { window?.orderOut(nil) + mpv = nil } func reconfig(_ vo: UnsafeMutablePointer) { @@ -99,10 +99,13 @@ class CocoaCB: NSObject { } func initBackend(_ vo: UnsafeMutablePointer) { - let opts: mp_vo_opts = vo.pointee.opts.pointee NSApp.setActivationPolicy(.regular) setAppIcon() + guard let opts: mp_vo_opts = mpv?.opts else { + libmpv.sendError("Something went wrong, no MPVHelper was initialized") + exit(1) + } guard let view = self.view else { libmpv.sendError("Something went wrong, no View was initialized") exit(1) @@ -144,8 +147,9 @@ class CocoaCB: NSObject { } func updateWindowSize(_ vo: UnsafeMutablePointer) { - let opts: mp_vo_opts = vo.pointee.opts.pointee - guard let targetScreen = getScreenBy(id: Int(opts.screen_id)) ?? NSScreen.main else { + guard let opts: mp_vo_opts = mpv?.opts, + let targetScreen = getScreenBy(id: Int(opts.screen_id)) ?? NSScreen.main else + { libmpv.sendWarning("Couldn't update Window size, no Screen available") return } @@ -177,13 +181,13 @@ class CocoaCB: NSObject { } func startDisplayLink(_ vo: UnsafeMutablePointer) { - let opts: mp_vo_opts = vo.pointee.opts.pointee CVDisplayLinkCreateWithActiveCGDisplays(&link) - guard let screen = getScreenBy(id: Int(opts.screen_id)) ?? NSScreen.main, + guard let opts: mp_vo_opts = mpv?.opts, + let screen = getScreenBy(id: Int(opts.screen_id)) ?? NSScreen.main, let link = self.link else { - libmpv.sendWarning("Couldn't start DisplayLink, no Screen or DisplayLink available") + libmpv.sendWarning("Couldn't start DisplayLink, no MPVHelper, Screen or DisplayLink available") return } @@ -426,8 +430,8 @@ 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") + guard let vout = vo else { + ccb.libmpv.sendWarning("Nil vo in Control Callback") return VO_FALSE } @@ -438,17 +442,25 @@ class CocoaCB: NSObject { return VO_TRUE } return VO_FALSE - case VOCTRL_FULLSCREEN: - DispatchQueue.main.async { - ccb.window?.toggleFullScreen(nil) + case VOCTRL_VO_OPTS_CHANGED: + guard let mpv: MPVHelper = ccb.mpv else { + return VO_FALSE } - return VO_TRUE - case VOCTRL_GET_FULLSCREEN: - if let fsData = data?.assumingMemoryBound(to: Int32.self) { - fsData.pointee = (ccb.window?.isInFullscreen ?? false) ? 1 : 0 - return VO_TRUE + + var opt: UnsafeMutableRawPointer? + while mpv.nextChangedConfig(property: &opt) { + if opt! == UnsafeMutableRawPointer(&mpv.optsPtr.pointee.border) { + DispatchQueue.main.async { + ccb.window?.border = Bool(mpv.opts.border) + } + } + if opt! == UnsafeMutableRawPointer(&mpv.optsPtr.pointee.fullscreen) { + DispatchQueue.main.async { + ccb.window?.toggleFullScreen(nil) + } + } } - return VO_FALSE + return VO_TRUE case VOCTRL_GET_DISPLAY_FPS: if let fps = data?.assumingMemoryBound(to: CDouble.self) { fps.pointee = ccb.currentFps() @@ -475,7 +487,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, !Bool(opts.hidpi_window_scale) { + if let screen = ccb.window?.currentScreen, !Bool(ccb.mpv?.opts.hidpi_window_scale ?? 1) { rect = screen.convertRectFromBacking(rect) } ccb.window?.updateSize(rect.size) @@ -483,19 +495,12 @@ class CocoaCB: NSObject { return VO_TRUE } return VO_FALSE - case VOCTRL_GET_WIN_STATE: - if let minimized = data?.assumingMemoryBound(to: Int32.self) { - minimized.pointee = ccb.window?.isMiniaturized ?? false ? - VO_WIN_STATE_MINIMIZED : Int32(0) - return VO_TRUE - } - return VO_FALSE case VOCTRL_GET_DISPLAY_NAMES: if let dnames = data?.assumingMemoryBound(to: UnsafeMutablePointer?>?.self) { var array: UnsafeMutablePointer?>? = nil var count: Int32 = 0 let screen = ccb.window != nil ? ccb.window?.screen : - ccb.getScreenBy(id: Int(opts.screen_id)) ?? + ccb.getScreenBy(id: Int(ccb.mpv?.opts.screen_id ?? 0)) ?? NSScreen.main let displayName = screen?.displayName ?? "Unknown" @@ -569,10 +574,6 @@ class CocoaCB: NSObject { } switch String(cString: property.name) { - case "border": - if let data = LibmpvHelper.mpvFlagToBool(property.data) { - window?.border = data - } case "ontop": if let data = LibmpvHelper.mpvFlagToBool(property.data) { window?.setOnTop(data, Int(mpv?.opts.ontop_level ?? -1)) -- cgit v1.2.3