macos: new tab menu/shortcut works even if no windows are present

This commit is contained in:
Mitchell Hashimoto
2023-08-04 17:45:57 -07:00
parent 8c01160afa
commit 7c98f991db
2 changed files with 21 additions and 14 deletions

View File

@ -76,9 +76,13 @@ class AppDelegate: NSObject, NSApplicationDelegate, ObservableObject {
} }
@IBAction func newTab(_ sender: Any?) { @IBAction func newTab(_ sender: Any?) {
windowManager.addNewTab() if let existingWindow = windowManager.mainWindow {
windowManager.addNewTab(to: existingWindow)
} else {
windowManager.addNewWindow()
}
} }
@IBAction func closeWindow(_ sender: Any) { @IBAction func closeWindow(_ sender: Any) {
guard let currentWindow = NSApp.keyWindow else { return } guard let currentWindow = NSApp.keyWindow else { return }
currentWindow.close() currentWindow.close()

View File

@ -22,6 +22,21 @@ class PrimaryWindowManager {
// windows "cascade" over each other and don't just launch directly on top // windows "cascade" over each other and don't just launch directly on top
// of each other. // of each other.
static var lastCascadePoint = NSPoint(x: 0, y: 0) static var lastCascadePoint = NSPoint(x: 0, y: 0)
/// Returns the main window of the managed window stack.
/// Falls back the first element if no window is main. Note that this would
/// likely be an internal inconsistency we gracefully handle here.
var mainWindow: NSWindow? {
let mainManagedWindow = managedWindows
.first { $0.window.isMainWindow }
// In case we run into the inconsistency, let it crash in debug mode so we
// can fix our window management setup to prevent this from happening.
assert(mainManagedWindow != nil || managedWindows.isEmpty)
return (mainManagedWindow ?? managedWindows.first)
.map { $0.window }
}
private var ghostty: Ghostty.AppState private var ghostty: Ghostty.AppState
private var managedWindows: [ManagedWindow] = [] private var managedWindows: [ManagedWindow] = []
@ -46,24 +61,12 @@ class PrimaryWindowManager {
newWindow.makeKeyAndOrderFront(nil) newWindow.makeKeyAndOrderFront(nil)
} }
func addNewTab() {
guard let existingWindow = mainWindow() else { return }
addNewTab(to: existingWindow)
}
func addNewTab(to window: NSWindow) { func addNewTab(to window: NSWindow) {
guard let controller = createWindowController() else { return } guard let controller = createWindowController() else { return }
guard let newWindow = addManagedWindow(windowController: controller)?.window else { return } guard let newWindow = addManagedWindow(windowController: controller)?.window else { return }
window.addTabbedWindow(newWindow, ordered: .above) window.addTabbedWindow(newWindow, ordered: .above)
newWindow.makeKeyAndOrderFront(nil) newWindow.makeKeyAndOrderFront(nil)
} }
/// Returns the main window of the managed window stack.
/// Falls back the first element if no window is main.
private func mainWindow() -> NSWindow? {
let mainManagedWindow = managedWindows.first { $0.window.isMainWindow }
return (mainManagedWindow ?? managedWindows.first).map { $0.window }
}
private func createWindowController() -> PrimaryWindowController? { private func createWindowController() -> PrimaryWindowController? {
guard let appDelegate = NSApplication.shared.delegate as? AppDelegate else { return nil } guard let appDelegate = NSApplication.shared.delegate as? AppDelegate else { return nil }