mac/option: make option helper none optional

gets rid of some unwrapping boilerplate and nil coalescing operators.
This commit is contained in:
der richter 2024-03-19 22:25:39 +01:00
parent 6defd49aa1
commit b480daad88
7 changed files with 50 additions and 80 deletions

View File

@ -24,7 +24,7 @@ struct Timing {
class PreciseTimer {
unowned var common: Common
var option: OptionHelper? { get { return common.option } }
var option: OptionHelper { get { return common.option } }
let nanoPerSecond: Double = 1e+9
let machToNano: Double = {

View File

@ -32,10 +32,10 @@ class CocoaCB: Common {
@objc init(_ mpvHandle: OpaquePointer) {
let newlog = mp_log_new(UnsafeMutablePointer<MPContext>(mpvHandle), mp_client_get_log(mpvHandle), "cocoacb")
let newlog = mp_log_new(UnsafeMutablePointer(mpvHandle), mp_client_get_log(mpvHandle), "cocoacb")
let option = OptionHelper(UnsafeMutablePointer(mpvHandle), mp_client_get_global(mpvHandle))
libmpv = LibmpvHelper(mpvHandle, newlog)
super.init(newlog)
option = OptionHelper(UnsafeMutablePointer(mpvHandle), mp_client_get_global(mpvHandle))
super.init(option, newlog)
layer = GLLayer(cocoaCB: self)
}
@ -59,18 +59,17 @@ class CocoaCB: Common {
func uninit() {
window?.orderOut(nil)
window?.close()
option = nil
}
func reconfig(_ vo: UnsafeMutablePointer<vo>) {
self.vo = vo
if backendState == .needsInit {
DispatchQueue.main.sync { self.initBackend(vo) }
} else if option?.opts.auto_window_resize ?? true {
} else if option.opts.auto_window_resize {
DispatchQueue.main.async {
self.updateWindowSize(vo)
self.layer?.update(force: true)
if self.option?.opts.focus_on ?? 1 == 2 {
if self.option.opts.focus_on == 2 {
NSApp.activate(ignoringOtherApps: true)
}
}
@ -205,7 +204,7 @@ class CocoaCB: Common {
func shutdown(_ destroy: Bool = false) {
isShuttingDown = window?.isAnimating ?? false ||
window?.isInFullscreen ?? false && option?.opts.native_fs ?? true
window?.isInFullscreen ?? false && option.opts.native_fs
if window?.isInFullscreen ?? false && !(window?.isAnimating ?? false) {
window?.close()
}

View File

@ -19,7 +19,7 @@ import Cocoa
import IOKit.pwr_mgt
class Common: NSObject {
var option: OptionHelper?
var option: OptionHelper
var input: InputHelper?
var log: LogHelper
var vo: UnsafeMutablePointer<vo>?
@ -48,16 +48,12 @@ class Common: NSObject {
didSet { if let window = window { window.title = title } }
}
init(_ mpLog: OpaquePointer?) {
init(_ opt: OptionHelper, _ mpLog: OpaquePointer?) {
option = opt
log = LogHelper(mpLog)
}
func initMisc(_ vo: UnsafeMutablePointer<vo>) {
guard let option = option else {
log.sendError("Something went wrong, no OptionHelper was initialized")
exit(1)
}
startDisplayLink(vo)
initLightSensor()
addDisplayReconfigureObserver()
@ -66,11 +62,6 @@ class Common: NSObject {
}
func initApp() {
guard let option = option else {
log.sendError("Something went wrong, no OptionHelper was initialized")
exit(1)
}
var policy: NSApplication.ActivationPolicy = .regular
switch option.macOpts.macos_app_activation_policy {
case 0:
@ -88,7 +79,7 @@ class Common: NSObject {
}
func initWindow(_ vo: UnsafeMutablePointer<vo>, _ previousActiveApp: NSRunningApplication?) {
let (option, targetScreen, wr) = getInitProperties(vo)
let (targetScreen, wr) = getInitProperties(vo)
guard let view = self.view else {
log.sendError("Something went wrong, no View was initialized")
@ -133,7 +124,7 @@ class Common: NSObject {
}
func initView(_ vo: UnsafeMutablePointer<vo>, _ layer: CALayer) {
let (_, _, wr) = getInitProperties(vo)
let (_, wr) = getInitProperties(vo)
view = View(frame: wr, common: self)
guard let view = self.view else {
@ -148,7 +139,7 @@ class Common: NSObject {
}
func initWindowState() {
if option?.opts.fullscreen ?? false {
if option.opts.fullscreen {
DispatchQueue.main.async {
self.window?.toggleFullScreen(nil)
}
@ -410,11 +401,6 @@ class Common: NSObject {
}
func getTargetScreen(forFullscreen fs: Bool) -> NSScreen? {
guard let option = option else {
log.sendWarning("Unexpected nil value in getTargetScreen")
return nil
}
let screenID = fs ? option.opts.fsscreen_id : option.opts.screen_id
var name: String?
if let screenName = fs ? option.opts.fsscreen_name : option.opts.screen_name {
@ -432,7 +418,7 @@ class Common: NSObject {
func getWindowGeometry(forScreen screen: NSScreen,
videoOut vo: UnsafeMutablePointer<vo>) -> NSRect {
let r = screen.convertRectToBacking(screen.frame)
let targetFrame = (option?.macOpts.macos_geometry_calculation ?? Int32(FRAME_VISIBLE)) == FRAME_VISIBLE
let targetFrame = option.macOpts.macos_geometry_calculation == FRAME_VISIBLE
? screen.visibleFrame : screen.frame
let rv = screen.convertRectToBacking(targetFrame)
@ -459,11 +445,7 @@ class Common: NSObject {
return screen.convertRectFromBacking(NSMakeRect(x, y, width, height))
}
func getInitProperties(_ vo: UnsafeMutablePointer<vo>) -> (OptionHelper, NSScreen, NSRect) {
guard let option = option else {
log.sendError("Something went wrong, no OptionHelper was initialized")
exit(1)
}
func getInitProperties(_ vo: UnsafeMutablePointer<vo>) -> (NSScreen, NSRect) {
guard let targetScreen = getTargetScreen(forFullscreen: false) ?? NSScreen.main else {
log.sendError("Something went wrong, no Screen was found")
exit(1)
@ -471,7 +453,7 @@ class Common: NSObject {
let wr = getWindowGeometry(forScreen: targetScreen, videoOut: vo)
return (option, targetScreen, wr)
return (targetScreen, wr)
}
// call before initApp, because on macOS +10.15 it changes the active App
@ -516,11 +498,6 @@ class Common: NSObject {
request: UInt32,
data: UnsafeMutableRawPointer?) -> Int32
{
guard let option = option else {
log.sendWarning("Unexpected nil value in Control Callback")
return VO_FALSE
}
switch mp_voctrl(request) {
case VOCTRL_CHECK_EVENTS:
events.pointee |= Int32(checkEvents())
@ -531,7 +508,7 @@ class Common: NSObject {
switch opt {
case TypeHelper.toPointer(&option.optsPtr.pointee.border):
DispatchQueue.main.async {
self.window?.border = Bool(option.opts.border)
self.window?.border = Bool(self.option.opts.border)
}
case TypeHelper.toPointer(&option.optsPtr.pointee.fullscreen):
DispatchQueue.main.async {
@ -540,34 +517,34 @@ class Common: NSObject {
case TypeHelper.toPointer(&option.optsPtr.pointee.ontop): fallthrough
case TypeHelper.toPointer(&option.optsPtr.pointee.ontop_level):
DispatchQueue.main.async {
self.window?.setOnTop(Bool(option.opts.ontop), Int(option.opts.ontop_level))
self.window?.setOnTop(Bool(self.option.opts.ontop), Int(self.option.opts.ontop_level))
}
case TypeHelper.toPointer(&option.optsPtr.pointee.all_workspaces):
DispatchQueue.main.async {
self.window?.setOnAllWorkspaces(Bool(option.opts.all_workspaces))
self.window?.setOnAllWorkspaces(Bool(self.option.opts.all_workspaces))
}
case TypeHelper.toPointer(&option.optsPtr.pointee.keepaspect_window):
DispatchQueue.main.async {
self.window?.keepAspect = Bool(option.opts.keepaspect_window)
self.window?.keepAspect = Bool(self.option.opts.keepaspect_window)
}
case TypeHelper.toPointer(&option.optsPtr.pointee.window_minimized):
DispatchQueue.main.async {
self.window?.setMinimized(Bool(option.opts.window_minimized))
self.window?.setMinimized(Bool(self.option.opts.window_minimized))
}
case TypeHelper.toPointer(&option.optsPtr.pointee.window_maximized):
DispatchQueue.main.async {
self.window?.setMaximized(Bool(option.opts.window_maximized))
self.window?.setMaximized(Bool(self.option.opts.window_maximized))
}
case TypeHelper.toPointer(&option.optsPtr.pointee.cursor_passthrough):
DispatchQueue.main.async {
self.window?.ignoresMouseEvents = option.opts.cursor_passthrough
self.window?.ignoresMouseEvents = self.option.opts.cursor_passthrough
}
case TypeHelper.toPointer(&option.optsPtr.pointee.geometry): fallthrough
case TypeHelper.toPointer(&option.optsPtr.pointee.autofit): fallthrough
case TypeHelper.toPointer(&option.optsPtr.pointee.autofit_smaller): fallthrough
case TypeHelper.toPointer(&option.optsPtr.pointee.autofit_larger):
DispatchQueue.main.async {
let (_, _, wr) = self.getInitProperties(vo)
let (_, wr) = self.getInitProperties(vo)
self.window?.updateFrame(wr)
}
default:
@ -643,7 +620,7 @@ class Common: 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 = self.window?.currentScreen, !Bool(self.option?.opts.hidpi_window_scale ?? true) {
if let screen = self.window?.currentScreen, !Bool(self.option.opts.hidpi_window_scale) {
rect = screen.convertRectFromBacking(rect)
}
self.window?.updateSize(rect.size)
@ -693,11 +670,6 @@ class Common: NSObject {
}
func macOptsUpdate() {
guard let option = option else {
log.sendWarning("Unexpected nil value in mac opts update")
return
}
var opt: UnsafeMutableRawPointer?
while option.nextChangedMacOption(property: &opt) {
switch opt {

View File

@ -19,7 +19,7 @@ import Cocoa
class TitleBar: NSVisualEffectView {
unowned var common: Common
var option: OptionHelper? { get { return common.option } }
var option: OptionHelper { get { return common.option } }
var systemBar: NSView? {
get { return common.window?.standardWindowButton(.closeButton)?.superview }
@ -64,9 +64,9 @@ class TitleBar: NSVisualEffectView {
window.contentView?.addSubview(self, positioned: .above, relativeTo: nil)
window.titlebarAppearsTransparent = true
window.styleMask.insert(.fullSizeContentView)
set(appearance: Int(option?.macOpts.macos_title_bar_appearance ?? 0))
set(material: Int(option?.macOpts.macos_title_bar_material ?? 0))
set(color: option?.macOpts.macos_title_bar_color ?? "#00000000")
set(appearance: Int(option.macOpts.macos_title_bar_appearance))
set(material: Int(option.macOpts.macos_title_bar_material))
set(color: option.macOpts.macos_title_bar_color)
}
required init?(coder: NSCoder) {

View File

@ -19,7 +19,7 @@ import Cocoa
class View: NSView, CALayerDelegate {
unowned var common: Common
var option: OptionHelper? { get { return common.option } }
var option: OptionHelper { get { return common.option } }
var input: InputHelper? { get { return common.input } }
var tracker: NSTrackingArea?

View File

@ -19,7 +19,7 @@ import Cocoa
class Window: NSWindow, NSWindowDelegate {
weak var common: Common! = nil
var option: OptionHelper? { get { return common.option } }
var option: OptionHelper { get { return common.option } }
var input: InputHelper? { get { return common.input } }
var targetScreen: NSScreen?
@ -92,7 +92,7 @@ class Window: NSWindow, NSWindowDelegate {
title = com.title
minSize = NSMakeSize(160, 90)
collectionBehavior = .fullScreenPrimary
ignoresMouseEvents = option?.opts.cursor_passthrough ?? false
ignoresMouseEvents = option.opts.cursor_passthrough
delegate = self
if let cView = contentView {
@ -143,7 +143,7 @@ class Window: NSWindow, NSWindowDelegate {
setFrame(frame, display: true)
}
if Bool(option?.opts.native_fs ?? true) {
if Bool(option.opts.native_fs) {
super.toggleFullScreen(sender)
} else {
if !isInFullscreen {
@ -194,7 +194,7 @@ class Window: NSWindow, NSWindowDelegate {
func windowDidEnterFullScreen(_ notification: Notification) {
isInFullscreen = true
option?.setOption(fullscreen: isInFullscreen)
option.setOption(fullscreen: isInFullscreen)
common.updateCursorVisibility()
endAnimation(frame)
common.titleBar?.show()
@ -203,7 +203,7 @@ class Window: NSWindow, NSWindowDelegate {
func windowDidExitFullScreen(_ notification: Notification) {
guard let tScreen = targetScreen else { return }
isInFullscreen = false
option?.setOption(fullscreen: isInFullscreen)
option.setOption(fullscreen: isInFullscreen)
endAnimation(calculateWindowPosition(for: tScreen, withoutBounds: targetScreen == screen))
common.view?.layerContentsPlacement = .scaleProportionallyToFit
}
@ -251,7 +251,7 @@ class Window: NSWindow, NSWindowDelegate {
setFrame(targetFrame, display: true)
endAnimation()
isInFullscreen = true
option?.setOption(fullscreen: isInFullscreen)
option.setOption(fullscreen: isInFullscreen)
common.windowSetToFullScreen()
}
@ -270,7 +270,7 @@ class Window: NSWindow, NSWindowDelegate {
setFrame(newFrame, display: true)
endAnimation()
isInFullscreen = false
option?.setOption(fullscreen: isInFullscreen)
option.setOption(fullscreen: isInFullscreen)
common.windowSetToWindow()
}
@ -283,7 +283,7 @@ class Window: NSWindow, NSWindowDelegate {
}
func getFsAnimationDuration(_ def: Double) -> Double {
let duration = option?.macOpts.macos_fs_animation_duration ?? -1
let duration = option.macOpts.macos_fs_animation_duration
if duration < 0 {
return def
} else {
@ -542,7 +542,7 @@ class Window: NSWindow, NSWindowDelegate {
func windowDidEndLiveResize(_ notification: Notification) {
common.windowDidEndLiveResize()
option?.setOption(maximized: isZoomed)
option.setOption(maximized: isZoomed)
if let contentViewFrame = contentView?.frame,
!isAnimating && !isInFullscreen
@ -561,11 +561,11 @@ class Window: NSWindow, NSWindowDelegate {
}
func windowDidMiniaturize(_ notification: Notification) {
option?.setOption(minimized: true)
option.setOption(minimized: true)
}
func windowDidDeminiaturize(_ notification: Notification) {
option?.setOption(minimized: false)
option.setOption(minimized: false)
}
func windowDidResignKey(_ notification: Notification) {
@ -588,6 +588,6 @@ class Window: NSWindow, NSWindowDelegate {
}
func windowDidMove(_ notification: Notification) {
option?.setOption(maximized: isZoomed)
option.setOption(maximized: isZoomed)
}
}

View File

@ -26,9 +26,9 @@ class MacCommon: Common {
@objc init(_ vo: UnsafeMutablePointer<vo>) {
let newlog = mp_log_new(vo, vo.pointee.log, "mac")
super.init(newlog)
let option = OptionHelper(vo, vo.pointee.global)
super.init(option, newlog)
self.vo = vo
option = OptionHelper(vo, vo.pointee.global)
input = InputHelper(vo.pointee.input_ctx, option)
timer = PreciseTimer(common: self)
@ -45,7 +45,7 @@ class MacCommon: Common {
let previousActiveApp = getActiveApp()
initApp()
let (_, _, wr) = getInitProperties(vo)
let (_, wr) = getInitProperties(vo)
guard let layer = self.layer else {
log.sendError("Something went wrong, no MetalLayer was initialized")
@ -59,12 +59,12 @@ class MacCommon: Common {
}
if !NSEqualSizes(window?.unfsContentFramePixel.size ?? NSZeroSize, wr.size) &&
option?.opts.auto_window_resize ?? true
option.opts.auto_window_resize
{
window?.updateSize(wr.size)
}
if option?.opts.focus_on ?? 1 == 2 {
if option.opts.focus_on == 2 {
NSApp.activate(ignoringOtherApps: true)
}
@ -89,7 +89,7 @@ class MacCommon: Common {
}
@objc func swapBuffer() {
if option?.macOpts.macos_render_timer ?? Int32(RENDER_TIMER_CALLBACK) != RENDER_TIMER_SYSTEM {
if option.macOpts.macos_render_timer != RENDER_TIMER_SYSTEM {
swapLock.lock()
while(swapTime < 1) {
swapLock.wait()
@ -105,7 +105,6 @@ class MacCommon: Common {
_ flagsIn: CVOptionFlags,
_ flagsOut: UnsafeMutablePointer<CVOptionFlags>) -> CVReturn
{
let frameTimer = option?.macOpts.macos_render_timer ?? Int32(RENDER_TIMER_CALLBACK)
let signalSwap = {
self.swapLock.lock()
self.swapTime += 1
@ -113,8 +112,8 @@ class MacCommon: Common {
self.swapLock.unlock()
}
if frameTimer != RENDER_TIMER_SYSTEM {
if let timer = self.timer, frameTimer == RENDER_TIMER_PRECISE {
if option.macOpts.macos_render_timer != RENDER_TIMER_SYSTEM {
if let timer = self.timer, option.macOpts.macos_render_timer == RENDER_TIMER_PRECISE {
timer.scheduleAt(time: inOutputTime.pointee.hostTime, closure: signalSwap)
return kCVReturnSuccess
}