Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 6 additions & 2 deletions Telegram-Mac/AppDelegate.swift
Original file line number Diff line number Diff line change
Expand Up @@ -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)
}
Expand Down
20 changes: 17 additions & 3 deletions Telegram-Mac/GalleryViewer.swift
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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 {
Expand Down Expand Up @@ -1680,6 +1693,7 @@ class GalleryViewer: NSResponder {

})
} else {
pager.selectedItem?.disappear(for: nil)
window.orderOut(nil)
viewer = nil
playPipIfNeeded()
Expand Down
17 changes: 13 additions & 4 deletions Telegram-Mac/SVideoController.swift
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,7 @@ class SVideoController: GenericViewController<SVideoView>, 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

Expand Down Expand Up @@ -162,13 +163,17 @@ class SVideoController: GenericViewController<SVideoView>, PictureInPictureContr


private func updateIdleTimer() {
NSCursor.unhide()
if isCursorHidden {
NSCursor.unhide()
isCursorHidden = false
}
hideOnIdleDisposable.set((Signal<NoValue, NoError>.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
}
}))
}
Expand All @@ -187,9 +192,10 @@ class SVideoController: GenericViewController<SVideoView>, 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
}
}
}
Expand Down Expand Up @@ -334,7 +340,10 @@ class SVideoController: GenericViewController<SVideoView>, PictureInPictureContr
super.viewWillDisappear(animated)
hideOnIdleDisposable.set(nil)
_ = enableScreenSleep()
NSCursor.unhide()
if isCursorHidden {
NSCursor.unhide()
isCursorHidden = false
}
window?.removeAllHandlers(for: self)

}
Expand Down
10 changes: 9 additions & 1 deletion packages/TelegramMedia/Sources/MediaPlayer.swift
Original file line number Diff line number Diff line change
Expand Up @@ -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()
Expand Down