diff --git a/macos/Sources/Features/Terminal/TerminalController.swift b/macos/Sources/Features/Terminal/TerminalController.swift index 0c1417cd0..66fe9c965 100644 --- a/macos/Sources/Features/Terminal/TerminalController.swift +++ b/macos/Sources/Features/Terminal/TerminalController.swift @@ -96,6 +96,10 @@ class TerminalController: NSWindowController, NSWindowDelegate, TerminalViewDele // If window decorations are disabled, remove our title if (!ghostty.windowDecorations) { window.styleMask.remove(.titled) } + // If we aren't in full screen, then we want to disable tabbing (see comment + // in the delegate function) + if (!window.styleMask.contains(.fullScreen)) { disableTabbing() } + // Terminals typically operate in sRGB color space and macOS defaults // to "native" which is typically P3. There is a lot more resources // covered in thie GitHub issue: https://github.com/mitchellh/ghostty/pull/376 @@ -174,6 +178,27 @@ class TerminalController: NSWindowController, NSWindowDelegate, TerminalViewDele func windowDidBecomeKey(_ notification: Notification) { self.relabelTabs() } + + func windowWillExitFullScreen(_ notification: Notification) { + // See comment in this function + disableTabbing() + } + + func windowWillEnterFullScreen(_ notification: Notification) { + // We re-enable the automatic tabbing mode when we enter full screen otherwise + // every new tab also enters a new screen. + guard let window = self.window else { return } + window.tabbingMode = .automatic + } + + private func disableTabbing() { + // For new windows, explicitly disallow tabbing with other windows. + // This overrides the value of userTabbingPreference. Rationale: + // Ghostty provides separate "New Tab" and "New Window" actions so + // there's no reason to make "New Window" open in a tab. + guard let window = self.window else { return } + window.tabbingMode = .disallowed; + } //MARK: - First Responder diff --git a/macos/Sources/Features/Terminal/TerminalManager.swift b/macos/Sources/Features/Terminal/TerminalManager.swift index d078bc24f..147ae85b1 100644 --- a/macos/Sources/Features/Terminal/TerminalManager.swift +++ b/macos/Sources/Features/Terminal/TerminalManager.swift @@ -95,12 +95,6 @@ class TerminalManager { // Initialize our controller to load the window let c = TerminalController(ghostty, withBaseConfig: base) - // For new windows, explicitly disallow tabbing with other windows. - // This overrides the value of userTabbingPreference. Rationale: - // Ghostty provides separate "New Tab" and "New Window" actions so - // there's no reason to make "New Window" open in a tab. - c.window!.tabbingMode = .disallowed; - // Create a listener for when the window is closed so we can remove it. let pubClose = NotificationCenter.default.publisher( for: NSWindow.willCloseNotification, diff --git a/macos/Sources/Ghostty/SurfaceView.swift b/macos/Sources/Ghostty/SurfaceView.swift index 818520aa3..2f491ae5e 100644 --- a/macos/Sources/Ghostty/SurfaceView.swift +++ b/macos/Sources/Ghostty/SurfaceView.swift @@ -510,6 +510,9 @@ extension Ghostty { guard let windowController = windowControllerRaw as? TerminalController else { return } guard case .noSplit = windowController.surfaceTree else { return } + // If our window is full screen, we do not set the frame + guard !window.styleMask.contains(.fullScreen) else { return } + // Setup our frame. We need to first subtract the views frame so that we can // just get the chrome frame so that we only affect the surface view size. var frame = window.frame