From: Ruben Beltran del Rio Date: Thu, 19 Oct 2023 18:57:25 +0000 (+0200) Subject: Save WIP -> Multimonitor change working X-Git-Tag: 1.0.0~1 X-Git-Url: https://git.r.bdr.sh/rbdr/captura/commitdiff_plain/9431168da5eb1338d8c9fc8cc92e6245c539e73d?ds=inline;hp=7ee43fb83799abb89a69cfcd4e2146dd4eaa5045 Save WIP -> Multimonitor change working --- diff --git a/Captura/CapturaApp.swift b/Captura/CapturaApp.swift index 0d22e79..67709a5 100644 --- a/Captura/CapturaApp.swift +++ b/Captura/CapturaApp.swift @@ -326,7 +326,10 @@ struct CapturaApp: App { if now - gifCallbackTimer > .nanoseconds(1_000_000_000 / UInt64(captureSessionConfiguration.frameRate)) { gifCallbackTimer = now DispatchQueue.main.async { - if let cgImage = frame.cgImage?.resize(by: self.pixelDensity) { + if var cgImage = frame.cgImage { + if self.pixelDensity > 1 { + cgImage = cgImage.resize(by: self.pixelDensity) ?? cgImage + } self.images.append(cgImage) } } diff --git a/Captura/Presentation/Windows/RecordingWindow.swift b/Captura/Presentation/Windows/RecordingWindow.swift index 370a47a..b5c4413 100644 --- a/Captura/Presentation/Windows/RecordingWindow.swift +++ b/Captura/Presentation/Windows/RecordingWindow.swift @@ -30,9 +30,8 @@ class RecordingWindow: NSWindow { self.titlebarAppearsTransparent = true self.setFrame(boundingBox, display: true) self.titleVisibility = .hidden - let recordingView = RecordingContentView(configuration, frame: boundingBox) + let recordingView = RecordingContentView(configuration, frame: boundingBox, button: button ?? NSZeroRect) recordingView.frame = boundingBox - recordingView.button = button self.contentView = recordingView //self.backgroundColor = NSColor(white: 1.0, alpha: 0.001) self.backgroundColor = NSColor(red: 1.0, green: 0.0, blue: 1.0, alpha: 0.5) @@ -83,11 +82,33 @@ enum RecordingWindowState { class RecordingContentView: NSView { - init(_ configuration: CaptureSessionConfiguration, frame: NSRect) { + init(_ configuration: CaptureSessionConfiguration, frame: NSRect, button: NSRect) { super.init(frame: frame) preventResize = configuration.preventResize preventMove = configuration.preventMove autoStart = configuration.autoStart + self.button = button + + for screen in NSScreen.screens { + print(screen.frame) + // BEFORE YOU WENT TO BED: + // You were checking which screen contains the button, so you can calculate the offset which should give you + // the location of the button, which you can then use to draw the button at the same offset whenever you need + // to change screen! This would keep the behavior of pressing the record button. + // If this does work, remember to then test it with a Hi DPI display, because we might need to adjust for pixel + // density. + // Finally, if it does work, make sure the alternate monitor still responds, by adjusting the behavior of the + // real button + if screen.frame.intersects(button) { + print("CONTAINS! ->") + let relativeX = screen.frame.width - button.maxX + let relativeY = screen.frame.height - button.maxY + print("The rect is at (\(relativeX), \(relativeY)) relative to the top right of the screen frame.") + } else { + print("NO CONTAINS ->") + } + print(button) + } if configuration.x != nil || configuration.y != nil || configuration.width != nil || configuration.height != nil { box = NSRect( @@ -109,6 +130,7 @@ class RecordingContentView: NSView { fatalError("init(coder:) has not been implemented") } + private var buttons: [NSRect] = [] public var button: NSRect? = nil @Published public var box: NSRect? = nil public var state: RecordingWindowState = .idle @@ -454,8 +476,8 @@ class RecordingContentView: NSView { if let currentScreen = self.window?.screen { if currentScreen != screen { let frame = screen?.frame ?? NSZeroRect - self.frame = frame - self.bounds = frame + self.frame = CGRect(origin: NSZeroPoint, size: frame.size) + self.bounds = CGRect(origin: NSZeroPoint, size: frame.size) self.updateTrackingAreas() if let window = self.window {