From 5fb0f36937cc38b9db88dc9b8631cba75536c5be Mon Sep 17 00:00:00 2001 From: der richter Date: Fri, 31 Jul 2020 10:37:02 +0200 Subject: mac: use config cache und wakeup for mac option runtime changes remove the libmpv observer for the macOS specific options and use a config cache + change callback for runtime changes. this is also a preparation for new backends and generalises even more, since libmpv functions can't and shouldn't be used in usual vo backends. for feature parity the config cache is used. --- osdep/macos/libmpv_helper.swift | 8 -------- osdep/macos/mpv_helper.swift | 34 ++++++++++++++++++++++++---------- video/out/cocoa_cb_common.swift | 33 --------------------------------- video/out/mac/common.swift | 41 ++++++++++++++++++++++++++++++++++++++++- video/out/mac/window.swift | 16 ++++++++-------- 5 files changed, 72 insertions(+), 60 deletions(-) diff --git a/osdep/macos/libmpv_helper.swift b/osdep/macos/libmpv_helper.swift index 61c8483022..d1b00cf304 100644 --- a/osdep/macos/libmpv_helper.swift +++ b/osdep/macos/libmpv_helper.swift @@ -182,14 +182,6 @@ class LibmpvHelper { for ptr in cargs { free(UnsafeMutablePointer(mutating: ptr)) } } - func observeString(_ property: String) { - mpv_observe_property(mpvHandle, 0, property, MPV_FORMAT_STRING) - } - - func observeFlag(_ property: String) { - mpv_observe_property(mpvHandle, 0, property, MPV_FORMAT_FLAG) - } - // Unsafe function when called while using the render API func command(_ cmd: String) { if mpvHandle == nil { return } diff --git a/osdep/macos/mpv_helper.swift b/osdep/macos/mpv_helper.swift index 8a05f26cb1..0e207b994b 100644 --- a/osdep/macos/mpv_helper.swift +++ b/osdep/macos/mpv_helper.swift @@ -17,11 +17,15 @@ import Cocoa +typealias swift_wakeup_cb_fn = (@convention(c) (UnsafeMutableRawPointer?) -> Void)? + class MPVHelper { var log: LogHelper var vo: UnsafeMutablePointer var optsCachePtr: UnsafeMutablePointer var optsPtr: UnsafeMutablePointer + var macOptsCachePtr: UnsafeMutablePointer + var macOptsPtr: UnsafeMutablePointer // these computed properties return a local copy of the struct accessed: // - don't use if you rely on the pointers @@ -29,9 +33,10 @@ class MPVHelper { var vout: vo { get { return vo.pointee } } var optsCache: m_config_cache { get { return optsCachePtr.pointee } } var opts: mp_vo_opts { get { return optsPtr.pointee } } + var macOptsCache: m_config_cache { get { return macOptsCachePtr.pointee } } + var macOpts: macos_opts { get { return macOptsPtr.pointee } } var input: OpaquePointer { get { return vout.input_ctx } } - var macOpts: macos_opts = macos_opts() init(_ vo: UnsafeMutablePointer, _ log: LogHelper) { self.vo = vo @@ -47,14 +52,15 @@ class MPVHelper { optsCachePtr = cache optsPtr = UnsafeMutablePointer(OpaquePointer(cache.pointee.opts)) - guard let ptr = mp_get_config_group(vo, - vo.pointee.global, - app.getMacOSConf()) else + guard let macCache = m_config_cache_alloc(vo, + vo.pointee.global, + app.getMacOSConf()) else { // will never be hit, mp_get_config_group asserts for invalid groups - return + exit(1) } - macOpts = UnsafeMutablePointer(OpaquePointer(ptr)).pointee + macOptsCachePtr = macCache + macOptsPtr = UnsafeMutablePointer(OpaquePointer(macCache.pointee.opts)) } func canBeDraggedAt(_ pos: NSPoint) -> Bool { @@ -74,25 +80,33 @@ class MPVHelper { mp_input_put_wheel(input, mpkey, delta) } - func nextChangedConfig(property: inout UnsafeMutableRawPointer?) -> Bool { + func nextChangedOption(property: inout UnsafeMutableRawPointer?) -> Bool { return m_config_cache_get_next_changed(optsCachePtr, &property) } - func setConfigProperty(fullscreen: Bool) { + func setOption(fullscreen: Bool) { optsPtr.pointee.fullscreen = fullscreen m_config_cache_write_opt(optsCachePtr, UnsafeMutableRawPointer(&optsPtr.pointee.fullscreen)) } - func setConfigProperty(minimized: Bool) { + func setOption(minimized: Bool) { optsPtr.pointee.window_minimized = Int32(minimized) m_config_cache_write_opt(optsCachePtr, UnsafeMutableRawPointer(&optsPtr.pointee.window_minimized)) } - func setConfigProperty(maximized: Bool) { + func setOption(maximized: Bool) { optsPtr.pointee.window_maximized = Int32(maximized) m_config_cache_write_opt(optsCachePtr, UnsafeMutableRawPointer(&optsPtr.pointee.window_maximized)) } + func setMacOptionCallback(_ callback: swift_wakeup_cb_fn, context object: AnyObject) { + m_config_cache_set_wakeup_cb(macOptsCachePtr, callback, MPVHelper.bridge(obj: object)) + } + + func nextChangedMacOption(property: inout UnsafeMutableRawPointer?) -> Bool { + return m_config_cache_get_next_changed(macOptsCachePtr, &property) + } + func command(_ cmd: String) { let cCmd = UnsafePointer(strdup(cmd)) let mpvCmd = mp_input_parse_cmd(input, bstr0(cCmd), "") diff --git a/video/out/cocoa_cb_common.swift b/video/out/cocoa_cb_common.swift index 10e3c30cc1..fb868e5c1f 100644 --- a/video/out/cocoa_cb_common.swift +++ b/video/out/cocoa_cb_common.swift @@ -36,11 +36,6 @@ class CocoaCB: Common { libmpv = LibmpvHelper(mpvHandle, newlog) super.init(newlog) layer = GLLayer(cocoaCB: self) - - 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) { @@ -238,34 +233,6 @@ class CocoaCB: Common { switch event.pointee.event_id { case MPV_EVENT_SHUTDOWN: shutdown() - case MPV_EVENT_PROPERTY_CHANGE: - if backendState == .initialized { - handlePropertyChange(event) - } - default: - break - } - } - - func handlePropertyChange(_ event: UnsafePointer) { - let pData = OpaquePointer(event.pointee.data) - guard let property = UnsafePointer(pData)?.pointee else { - return - } - - switch String(cString: property.name) { - case "macos-title-bar-appearance": - if let data = LibmpvHelper.mpvStringArrayToString(property.data) { - titleBar?.set(appearance: data) - } - case "macos-title-bar-material": - if let data = LibmpvHelper.mpvStringArrayToString(property.data) { - titleBar?.set(material: data) - } - case "macos-title-bar-color": - if let data = LibmpvHelper.mpvStringArrayToString(property.data) { - titleBar?.set(color: data) - } default: break } diff --git a/video/out/mac/common.swift b/video/out/mac/common.swift index c5b99bc0fd..28898c2840 100644 --- a/video/out/mac/common.swift +++ b/video/out/mac/common.swift @@ -49,9 +49,15 @@ class Common: NSObject { } func initMisc(_ vo: UnsafeMutablePointer) { + guard let mpv = mpv else { + log.sendError("Something went wrong, no MPVHelper was initialized") + exit(1) + } + startDisplayLink(vo) initLightSensor() addDisplayReconfigureObserver() + mpv.setMacOptionCallback(macOptsWakeupCallback, context: self) } func initApp() { @@ -438,7 +444,7 @@ class Common: NSObject { return VO_TRUE case VOCTRL_VO_OPTS_CHANGED: var o: UnsafeMutableRawPointer? - while mpv.nextChangedConfig(property: &o) { + while mpv.nextChangedOption(property: &o) { guard let opt = o else { log.sendError("No changed options was retrieved") return VO_TRUE @@ -546,4 +552,37 @@ class Common: NSObject { return VO_NOTIMPL } } + + let macOptsWakeupCallback: swift_wakeup_cb_fn = { ( ctx ) in + let com = unsafeBitCast(ctx, to: Common.self) + DispatchQueue.main.async { + com.macOptsUpdate() + } + } + + func macOptsUpdate() { + guard let mpv = mpv else { + log.sendWarning("Unexpected nil value in mac opts update") + return + } + + var o: UnsafeMutableRawPointer? + while mpv.nextChangedMacOption(property: &o) { + guard let opt = o else { + log.sendWarning("Could not retrieve changed mac option") + return + } + + switch opt { + case UnsafeMutableRawPointer(&mpv.macOptsPtr.pointee.macos_title_bar_appearance): + titleBar?.set(appearance: Int(mpv.macOpts.macos_title_bar_appearance)) + case UnsafeMutableRawPointer(&mpv.macOptsPtr.pointee.macos_title_bar_material): + titleBar?.set(material: Int(mpv.macOpts.macos_title_bar_material)) + case UnsafeMutableRawPointer(&mpv.macOptsPtr.pointee.macos_title_bar_color): + titleBar?.set(color: mpv.macOpts.macos_title_bar_color) + default: + break + } + } + } } diff --git a/video/out/mac/window.swift b/video/out/mac/window.swift index 8ba9031101..5b7e77dcff 100644 --- a/video/out/mac/window.swift +++ b/video/out/mac/window.swift @@ -183,7 +183,7 @@ class Window: NSWindow, NSWindowDelegate { func windowDidEnterFullScreen(_ notification: Notification) { isInFullscreen = true - mpv?.setConfigProperty(fullscreen: isInFullscreen) + mpv?.setOption(fullscreen: isInFullscreen) common.updateCursorVisibility() endAnimation(frame) common.titleBar?.show() @@ -192,7 +192,7 @@ class Window: NSWindow, NSWindowDelegate { func windowDidExitFullScreen(_ notification: Notification) { guard let tScreen = targetScreen else { return } isInFullscreen = false - mpv?.setConfigProperty(fullscreen: isInFullscreen) + mpv?.setOption(fullscreen: isInFullscreen) endAnimation(calculateWindowPosition(for: tScreen, withoutBounds: targetScreen == screen)) common.view?.layerContentsPlacement = .scaleProportionallyToFit } @@ -230,7 +230,7 @@ class Window: NSWindow, NSWindowDelegate { setFrame(targetFrame, display: true) endAnimation() isInFullscreen = true - mpv?.setConfigProperty(fullscreen: isInFullscreen) + mpv?.setOption(fullscreen: isInFullscreen) common.windowSetToFullScreen() } @@ -242,7 +242,7 @@ class Window: NSWindow, NSWindowDelegate { styleMask.remove(.fullScreen) endAnimation() isInFullscreen = false - mpv?.setConfigProperty(fullscreen: isInFullscreen) + mpv?.setOption(fullscreen: isInFullscreen) common.windowSetToWindow() } @@ -496,7 +496,7 @@ class Window: NSWindow, NSWindowDelegate { func windowDidEndLiveResize(_ notification: Notification) { common.windowDidEndLiveResize() - mpv?.setConfigProperty(maximized: isZoomed) + mpv?.setOption(maximized: isZoomed) if let contentViewFrame = contentView?.frame, !isAnimating && !isInFullscreen @@ -515,11 +515,11 @@ class Window: NSWindow, NSWindowDelegate { } func windowDidMiniaturize(_ notification: Notification) { - mpv?.setConfigProperty(minimized: true) + mpv?.setOption(minimized: true) } func windowDidDeminiaturize(_ notification: Notification) { - mpv?.setConfigProperty(minimized: false) + mpv?.setOption(minimized: false) } func windowDidResignKey(_ notification: Notification) { @@ -542,6 +542,6 @@ class Window: NSWindow, NSWindowDelegate { } func windowDidMove(_ notification: Notification) { - mpv?.setConfigProperty(maximized: isZoomed) + mpv?.setOption(maximized: isZoomed) } } -- cgit v1.2.3