diff --git a/QuickDrop.xcodeproj/project.pbxproj b/QuickDrop.xcodeproj/project.pbxproj index c3a180e..cd7aaa8 100644 --- a/QuickDrop.xcodeproj/project.pbxproj +++ b/QuickDrop.xcodeproj/project.pbxproj @@ -930,13 +930,13 @@ GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; LOCALIZATION_PREFERS_STRING_CATALOGS = YES; - MACOSX_DEPLOYMENT_TARGET = 10.15; + MACOSX_DEPLOYMENT_TARGET = 11.5; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; ONLY_ACTIVE_ARCH = YES; SDKROOT = macosx; - SHARED_BUILD = 61; - SHARED_VERSION = 1.12.2; + SHARED_BUILD = 63; + SHARED_VERSION = 1.12.4; SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; SWIFT_EMIT_LOC_STRINGS = YES; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; @@ -993,12 +993,12 @@ GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; LOCALIZATION_PREFERS_STRING_CATALOGS = YES; - MACOSX_DEPLOYMENT_TARGET = 10.15; + MACOSX_DEPLOYMENT_TARGET = 11.5; MTL_ENABLE_DEBUG_INFO = NO; MTL_FAST_MATH = YES; SDKROOT = macosx; - SHARED_BUILD = 61; - SHARED_VERSION = 1.12.2; + SHARED_BUILD = 63; + SHARED_VERSION = 1.12.4; SWIFT_COMPILATION_MODE = wholemodule; SWIFT_EMIT_LOC_STRINGS = YES; SWIFT_OPTIMIZATION_LEVEL = "-O"; diff --git a/QuickDrop/AppDelegate.swift b/QuickDrop/AppDelegate.swift index b1987a2..5d1e3d1 100644 --- a/QuickDrop/AppDelegate.swift +++ b/QuickDrop/AppDelegate.swift @@ -228,6 +228,13 @@ class AppDelegate: NSObject, NSApplicationDelegate, UNUserNotificationCenterDele @objc func openPlusScreen() { + // If window already exists and is visible, just bring it to the front + if let window = plusWindow, window.isVisible { + NSApp.activate(ignoringOtherApps: true) + window.makeKeyAndOrderFront(nil) + return + } + // Create the welcome screen SwiftUI view let plusView = PlusView(closeView: { log("Closing plus screen") @@ -235,26 +242,33 @@ class AppDelegate: NSObject, NSApplicationDelegate, UNUserNotificationCenterDele }) // Create an NSWindow to host the SwiftUI view - plusWindow = NSWindow( + let window = NSWindow( contentRect: NSRect(x: 0, y: 0, width: plusViewWidth, height: plusViewHeight), styleMask: [.titled, .closable], backing: .buffered, defer: false ) - plusWindow?.styleMask.insert(.fullSizeContentView) - plusWindow?.titleVisibility = .hidden - plusWindow?.titlebarAppearsTransparent = true + window.styleMask.insert(.fullSizeContentView) + window.titleVisibility = .hidden + window.titlebarAppearsTransparent = true - plusWindow?.center() - plusWindow?.isReleasedWhenClosed = false - plusWindow?.setFrameAutosaveName("PlusScreen") - plusWindow?.contentView = NSHostingView(rootView: plusView) + window.center() + window.isReleasedWhenClosed = false + window.setFrameAutosaveName("PlusScreen") + window.contentView = NSHostingView(rootView: plusView) + + // Reset reference when closed by red button + NotificationCenter.default.addObserver(forName: NSWindow.willCloseNotification, object: window, queue: .main) { [weak self] _ in + self?.plusWindow = nil + } + + plusWindow = window // Ensure the window is always on top - NSApp.activate(ignoringOtherApps: true) // Brings the whole app to the front - plusWindow?.makeKeyAndOrderFront(nil) - plusWindow?.level = .normal + NSApp.activate(ignoringOtherApps: true) + window.makeKeyAndOrderFront(nil) + window.level = .normal } diff --git a/QuickDrop/View/LicenseWindow.swift b/QuickDrop/View/LicenseWindow.swift index 386c9bd..8e3e81c 100644 --- a/QuickDrop/View/LicenseWindow.swift +++ b/QuickDrop/View/LicenseWindow.swift @@ -24,7 +24,6 @@ struct LicensePage: View { func openLicenseWindow() -> NSWindow { - // Create a new NSWindow and retain it in the `newWindow` property let window = NSWindow( contentRect: NSRect(x: 0, y: 0, width: 500, height: 400), styleMask: [.titled, .closable, .resizable], @@ -37,10 +36,9 @@ func openLicenseWindow() -> NSWindow { window.contentView = NSHostingView(rootView: LicensePage()) // Ensure the window is always on top - NSApp.activate(ignoringOtherApps: true) // Brings the whole app to the front + NSApp.activate(ignoringOtherApps: true) window.makeKeyAndOrderFront(nil) window.level = .normal - // Retain the window to prevent deallocation return window }