|
|
@@ -5,6 +5,7 @@ final class AppDelegate: NSObject, NSApplicationDelegate, NSWindowDelegate {
|
|
|
private var windowObservers: [NSObjectProtocol] = []
|
|
|
private var shouldCenterMainWindowOnShow = true
|
|
|
private var centeringDeadline: Date?
|
|
|
+ private weak var trackedMainWindow: NSWindow?
|
|
|
|
|
|
func applicationShouldTerminateAfterLastWindowClosed(_ sender: NSApplication) -> Bool {
|
|
|
false
|
|
|
@@ -31,6 +32,7 @@ final class AppDelegate: NSObject, NSApplicationDelegate, NSWindowDelegate {
|
|
|
|
|
|
func windowShouldClose(_ sender: NSWindow) -> Bool {
|
|
|
if isMainAppWindow(sender) {
|
|
|
+ trackedMainWindow = sender
|
|
|
shouldCenterMainWindowOnShow = true
|
|
|
centeringDeadline = nil
|
|
|
}
|
|
|
@@ -55,6 +57,7 @@ final class AppDelegate: NSObject, NSApplicationDelegate, NSWindowDelegate {
|
|
|
|
|
|
func configureMainWindows() {
|
|
|
for window in NSApp.windows where isMainAppWindow(window) {
|
|
|
+ trackedMainWindow = window
|
|
|
window.isReleasedWhenClosed = false
|
|
|
window.isRestorable = false
|
|
|
window.setFrameAutosaveName("")
|
|
|
@@ -130,21 +133,47 @@ final class AppDelegate: NSObject, NSApplicationDelegate, NSWindowDelegate {
|
|
|
]
|
|
|
}
|
|
|
|
|
|
- private func showMainWindowIfNeeded() {
|
|
|
- guard !NSApp.windows.contains(where: { isMainAppWindow($0) && $0.isVisible }) else { return }
|
|
|
- showMainWindow()
|
|
|
- }
|
|
|
+ func showMainWindow() {
|
|
|
+ configureMainWindows()
|
|
|
|
|
|
- private func showMainWindow() {
|
|
|
- guard let window = NSApp.windows.first(where: isMainAppWindow) else { return }
|
|
|
+ guard let window = resolvedMainWindow() else { return }
|
|
|
+
|
|
|
+ trackedMainWindow = window
|
|
|
beginCenteringMainWindow()
|
|
|
+
|
|
|
+ if window.isMiniaturized {
|
|
|
+ window.deminiaturize(nil)
|
|
|
+ }
|
|
|
+
|
|
|
+ window.collectionBehavior.insert(.moveToActiveSpace)
|
|
|
+ window.orderFrontRegardless()
|
|
|
window.makeKeyAndOrderFront(nil)
|
|
|
NSApp.activate(ignoringOtherApps: true)
|
|
|
}
|
|
|
|
|
|
+ private func showMainWindowIfNeeded() {
|
|
|
+ guard !NSApp.windows.contains(where: { isMainAppWindow($0) && $0.isVisible && !$0.isMiniaturized }) else {
|
|
|
+ return
|
|
|
+ }
|
|
|
+ showMainWindow()
|
|
|
+ }
|
|
|
+
|
|
|
+ private func resolvedMainWindow() -> NSWindow? {
|
|
|
+ if let trackedMainWindow, NSApp.windows.contains(trackedMainWindow) {
|
|
|
+ return trackedMainWindow
|
|
|
+ }
|
|
|
+
|
|
|
+ if let visible = NSApp.windows.first(where: { isMainAppWindow($0) && $0.isVisible }) {
|
|
|
+ return visible
|
|
|
+ }
|
|
|
+
|
|
|
+ return NSApp.windows.first(where: isMainAppWindow)
|
|
|
+ }
|
|
|
+
|
|
|
private func isMainAppWindow(_ window: NSWindow) -> Bool {
|
|
|
- guard window.canBecomeMain, !(window is NSPanel) else { return false }
|
|
|
+ if window === trackedMainWindow { return true }
|
|
|
+ guard !(window is NSPanel), window.level == .normal else { return false }
|
|
|
if window.title == "Sign in to Reddit" { return false }
|
|
|
- return window.level == .normal
|
|
|
+ return window.canBecomeKey || window.canBecomeMain
|
|
|
}
|
|
|
}
|