summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorder richter <der.richter@gmx.de>2020-07-31 10:37:02 +0200
committerder richter <der.richter@gmx.de>2020-08-22 14:22:49 +0200
commit5fb0f36937cc38b9db88dc9b8631cba75536c5be (patch)
tree00c7792bf3f0ef93ff142ec419bc20a64e177424
parent9035a51b133dbf288818a871f040413d80c2d3b0 (diff)
downloadmpv-5fb0f36937cc38b9db88dc9b8631cba75536c5be.tar.bz2
mpv-5fb0f36937cc38b9db88dc9b8631cba75536c5be.tar.xz
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.
-rw-r--r--osdep/macos/libmpv_helper.swift8
-rw-r--r--osdep/macos/mpv_helper.swift34
-rw-r--r--video/out/cocoa_cb_common.swift33
-rw-r--r--video/out/mac/common.swift41
-rw-r--r--video/out/mac/window.swift16
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<vo>
var optsCachePtr: UnsafeMutablePointer<m_config_cache>
var optsPtr: UnsafeMutablePointer<mp_vo_opts>
+ var macOptsCachePtr: UnsafeMutablePointer<m_config_cache>
+ var macOptsPtr: UnsafeMutablePointer<macos_opts>
// 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<vo>, _ log: LogHelper) {
self.vo = vo
@@ -47,14 +52,15 @@ class MPVHelper {
optsCachePtr = cache
optsPtr = UnsafeMutablePointer<mp_vo_opts>(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<macos_opts>(OpaquePointer(ptr)).pointee
+ macOptsCachePtr = macCache
+ macOptsPtr = UnsafeMutablePointer<macos_opts>(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<Int8>(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<vo>) {
@@ -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<mpv_event>) {
- let pData = OpaquePointer(event.pointee.data)
- guard let property = UnsafePointer<mpv_event_property>(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<vo>) {
+ 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)
}
}