mirror of
https://github.com/ghostty-org/ghostty.git
synced 2025-08-02 14:57:31 +03:00
macos: new tab menu/shortcut works even if no windows are present
This commit is contained in:
@ -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()
|
||||||
|
@ -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 }
|
||||||
|
Reference in New Issue
Block a user