diff --git a/Telegram-Mac/AppDelegate.swift b/Telegram-Mac/AppDelegate.swift index 978c2c0e88..e734d068ab 100644 --- a/Telegram-Mac/AppDelegate.swift +++ b/Telegram-Mac/AppDelegate.swift @@ -1495,8 +1495,12 @@ class AppDelegate: NSResponder, NSApplicationDelegate, NSUserNotificationCenterD func applicationDidResignActive(_ notification: Notification) { updatePeerPresence() - if viewer != nil, NSScreen.main == viewer?.window.screen { - viewer?.window.orderOut(nil) + if let viewer = viewer { + if let appScreen = self.window.screen, let viewerScreen = viewer.window.screen, appScreen != viewerScreen { + viewer.close(false) + } else { + viewer.window.orderOut(nil) + } } self.activeValue.set(false) } diff --git a/Telegram-Mac/GalleryViewer.swift b/Telegram-Mac/GalleryViewer.swift index eb24658faf..9e6b6ac9b9 100644 --- a/Telegram-Mac/GalleryViewer.swift +++ b/Telegram-Mac/GalleryViewer.swift @@ -262,7 +262,8 @@ class GalleryViewer: NSResponder { self.chatLocation = chatLocation self.reversed = reversed self.contentInteractions = contentInteractions - if let screen = NSScreen.main { + let galleryScreen = context.window.screen ?? NSScreen.main + if let screen = galleryScreen { let bounds = NSMakeRect(0, 0, screen.frame.width, screen.frame.height) self.window = Window(contentRect: bounds, styleMask: [.borderless], backing: .buffered, defer: false, screen: screen) self.window.contentView?.wantsLayer = true @@ -295,6 +296,7 @@ class GalleryViewer: NSResponder { NotificationCenter.default.addObserver(self, selector: #selector(windowDidBecomeKey), name: NSWindow.didBecomeKeyNotification, object: window) NotificationCenter.default.addObserver(self, selector: #selector(windowDidResignKey), name: NSWindow.didResignKeyNotification, object: window) + NotificationCenter.default.addObserver(self, selector: #selector(screenParametersDidChange), name: NSApplication.didChangeScreenParametersNotification, object: nil) interactions.dismiss = { [weak self] _ -> KeyHandlerResult in @@ -470,8 +472,19 @@ class GalleryViewer: NSResponder { @objc open func windowDidResignKey() { - self.window.makeKeyAndOrderFront(self) - // window.makeFirstResponder(self) + // Keep system focus behavior intact to avoid stuck key-window state across displays. + } + + @objc private func screenParametersDidChange() { + guard self.window.isVisible else { + return + } + guard let appScreen = self.context.window.screen, let viewerScreen = self.window.screen else { + return + } + if appScreen != viewerScreen { + self.close(false) + } } var pagerSize: NSSize { @@ -1680,6 +1693,7 @@ class GalleryViewer: NSResponder { }) } else { + pager.selectedItem?.disappear(for: nil) window.orderOut(nil) viewer = nil playPipIfNeeded() diff --git a/Telegram-Mac/SVideoController.swift b/Telegram-Mac/SVideoController.swift index ffe7154cd1..8c1b3e04ee 100644 --- a/Telegram-Mac/SVideoController.swift +++ b/Telegram-Mac/SVideoController.swift @@ -58,6 +58,7 @@ class SVideoController: GenericViewController, PictureInPictureContr private var isPaused: Bool = true private var forceHiddenControls: Bool = false + private var isCursorHidden: Bool = false private var _videoFramePreview: MediaPlayerFramePreview? private var mode: PictureInPictureControlMode = .normal @@ -162,13 +163,17 @@ class SVideoController: GenericViewController, PictureInPictureContr private func updateIdleTimer() { - NSCursor.unhide() + if isCursorHidden { + NSCursor.unhide() + isCursorHidden = false + } hideOnIdleDisposable.set((Signal.complete() |> delay(1.0, queue: Queue.mainQueue())).start(completed: { [weak self] in guard let `self` = self else {return} let hide = !self.genericView.isInMenu && !self.genericView.insideControls && !contextMenuOnScreen() self.hideControls.set(hide) - if !self.pictureInPicture, hide { + if !self.pictureInPicture, hide, !self.isCursorHidden { NSCursor.hide() + self.isCursorHidden = true } })) } @@ -187,9 +192,10 @@ class SVideoController: GenericViewController, PictureInPictureContr if self.fullScreenWindow != nil && isMouseUpOrDown, !genericView.insideControls { hide = true - if !self.isPaused { + if !self.isPaused, !self.isCursorHidden { if !contextMenuOnScreen() { NSCursor.hide() + self.isCursorHidden = true } } } @@ -334,7 +340,10 @@ class SVideoController: GenericViewController, PictureInPictureContr super.viewWillDisappear(animated) hideOnIdleDisposable.set(nil) _ = enableScreenSleep() - NSCursor.unhide() + if isCursorHidden { + NSCursor.unhide() + isCursorHidden = false + } window?.removeAllHandlers(for: self) } diff --git a/packages/TelegramMedia/Sources/MediaPlayer.swift b/packages/TelegramMedia/Sources/MediaPlayer.swift index f6d7129d71..f93c335427 100755 --- a/packages/TelegramMedia/Sources/MediaPlayer.swift +++ b/packages/TelegramMedia/Sources/MediaPlayer.swift @@ -376,7 +376,15 @@ private final class MediaPlayerContext { if let strongSelf = self { if let loadedState = loadedState { - switch action { + // Re-read the current action from state so that a pause() call made + // between seekingCompleted() and the flush completing is respected. + let currentAction: MediaPlayerPlaybackAction + if case let .seeking(_, _, _, stateAction, _) = strongSelf.state { + currentAction = stateAction + } else { + currentAction = action + } + switch currentAction { case .play: strongSelf.state = .playing(loadedState) strongSelf.audioRenderer?.renderer.start()