From 3ad9c32a5fabdfb1ca0a8e5766704042dfa995e6 Mon Sep 17 00:00:00 2001 From: der richter Date: Sat, 1 Feb 2020 13:02:58 +0100 Subject: cocoa-cb: simplify cursor hiding and make it less greedy for reasons unknown to me the NSCursor (un)hide functions can be completely unreliable and the cursor can have an unknown state. this only happens on some system and wasn't able to reproduce this. it's probably some dumb race condition that might be possible to work around, though because of the lack of reproducibility on my end it's hard to test. i decided to rework the cursor hiding code yet again and make it a lot less greedy. the cursor will now always unhide when moved and there will never be a situation again the cursor can't be unhidden again. on the other hand there might be edge cases now where the cursor won't hide immediately and you have to move it slightly to make it disappear again. this should be an acceptable tradeoff. Fixes #6886 --- video/out/cocoa-cb/events_view.swift | 2 ++ video/out/cocoa-cb/window.swift | 5 +++-- video/out/cocoa_cb_common.swift | 12 ++---------- 3 files changed, 7 insertions(+), 12 deletions(-) diff --git a/video/out/cocoa-cb/events_view.swift b/video/out/cocoa-cb/events_view.swift index 124a7a028d..296d447634 100644 --- a/video/out/cocoa-cb/events_view.swift +++ b/video/out/cocoa-cb/events_view.swift @@ -120,6 +120,7 @@ class EventsView: NSView { if mpv?.mouseEnabled() ?? true { cocoa_put_key_with_modifiers(SWIFT_KEY_MOUSE_ENTER, 0) } + cocoaCB.updateCursorVisibility() } override func mouseExited(with event: NSEvent) { @@ -127,6 +128,7 @@ class EventsView: NSView { cocoa_put_key_with_modifiers(SWIFT_KEY_MOUSE_LEAVE, 0) } cocoaCB.titleBar?.hide() + cocoaCB.setCursorVisiblility(true) } override func mouseMoved(with event: NSEvent) { diff --git a/video/out/cocoa-cb/window.swift b/video/out/cocoa-cb/window.swift index 2dbac9751d..ce7947cb90 100644 --- a/video/out/cocoa-cb/window.swift +++ b/video/out/cocoa-cb/window.swift @@ -183,7 +183,7 @@ class Window: NSWindow, NSWindowDelegate { func windowDidEnterFullScreen(_ notification: Notification) { isInFullscreen = true cocoaCB.mpv?.setConfigProperty(fullscreen: isInFullscreen) - cocoaCB.updateCusorVisibility() + cocoaCB.updateCursorVisibility() endAnimation(frame) cocoaCB.titleBar?.show() } @@ -517,12 +517,13 @@ class Window: NSWindow, NSWindowDelegate { } func windowDidBecomeKey(_ notification: Notification) { - cocoaCB.updateCusorVisibility() + cocoaCB.updateCursorVisibility() } func windowDidChangeOcclusionState(_ notification: Notification) { if occlusionState.contains(.visible) { cocoaCB.layer?.update(force: true) + cocoaCB.updateCursorVisibility() } } diff --git a/video/out/cocoa_cb_common.swift b/video/out/cocoa_cb_common.swift index 64cd013fae..a8be13c41f 100644 --- a/video/out/cocoa_cb_common.swift +++ b/video/out/cocoa_cb_common.swift @@ -28,7 +28,6 @@ class CocoaCB: NSObject { var layer: VideoLayer? var link: CVDisplayLink? - var cursorHidden: Bool = false var cursorVisibilityWanted: Bool = true @objc var isShuttingDown: Bool = false @@ -267,19 +266,12 @@ class CocoaCB: NSObject { &displaySleepAssertion) } - func updateCusorVisibility() { + func updateCursorVisibility() { setCursorVisiblility(cursorVisibilityWanted) } func setCursorVisiblility(_ visible: Bool) { - let visibility = visible ? true : !(view?.canHideCursor() ?? false) - if visibility && cursorHidden { - NSCursor.unhide() - cursorHidden = false; - } else if !visibility && !cursorHidden { - NSCursor.hide() - cursorHidden = true - } + NSCursor.setHiddenUntilMouseMoves(!visible && (view?.canHideCursor() ?? false)) } func updateICCProfile() { -- cgit v1.2.3