From be114e792fb9d662ed71c81476ff732b0827338e Mon Sep 17 00:00:00 2001 From: Thorsten Ball Date: Sat, 19 Aug 2023 20:21:20 +0200 Subject: [PATCH] macOS: fix cascading windows when using tabs and closing windows This fixes two things: 1. Issue #294: cascade point for new windows is set when creating new tabs 2. Cascade point was *not* reset when closing windows, which lead to a big "gap" appearing when, say, opening 5 windows, closing 4, opening a new window. --- .../Primary Window/PrimaryWindowManager.swift | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/macos/Sources/Features/Primary Window/PrimaryWindowManager.swift b/macos/Sources/Features/Primary Window/PrimaryWindowManager.swift index 343a77918..6a0a6595f 100644 --- a/macos/Sources/Features/Primary Window/PrimaryWindowManager.swift +++ b/macos/Sources/Features/Primary Window/PrimaryWindowManager.swift @@ -137,16 +137,20 @@ class PrimaryWindowManager { } private func addNewTab(to window: NSWindow, withBaseConfig config: ghostty_surface_config_s? = nil) { - guard let controller = createWindowController(withBaseConfig: config) else { return } + guard let controller = createWindowController(withBaseConfig: config, cascade: false) else { return } guard let newWindow = addManagedWindow(windowController: controller)?.window else { return } window.addTabbedWindow(newWindow, ordered: .above) newWindow.makeKeyAndOrderFront(nil) } - private func createWindowController(withBaseConfig config: ghostty_surface_config_s? = nil) -> PrimaryWindowController? { + private func createWindowController(withBaseConfig config: ghostty_surface_config_s? = nil, cascade: Bool = true) -> PrimaryWindowController? { guard let appDelegate = NSApplication.shared.delegate as? AppDelegate else { return nil } + let window = PrimaryWindow.create(ghostty: ghostty, appDelegate: appDelegate, baseConfig: config) - Self.lastCascadePoint = window.cascadeTopLeft(from: Self.lastCascadePoint) + if (cascade) { + Self.lastCascadePoint = window.cascadeTopLeft(from: Self.lastCascadePoint) + } + let controller = PrimaryWindowController(window: window) controller.windowManager = self return controller @@ -169,5 +173,12 @@ class PrimaryWindowManager { private func removeWindow(window: NSWindow) { self.managedWindows.removeAll(where: { $0.window === window }) + + // If we remove a window, we reset the cascade point to the key window so that + // the next window cascade's from that one. + if let focusedWindow = NSApplication.shared.keyWindow { + let frame = focusedWindow.frame + Self.lastCascadePoint = NSPoint(x: frame.minX, y: frame.maxY) + } } }