macos: modify tabbing mode when entering/exiting fullscreen

Related to #799

With tabbing mode disabled, fullscreen (native) windows when creating a
new tab creates a window in the tab bar, but ALSO puts the window into a
new "screen" on macOS. When you click the tab bar, macOS animates
between screens. Its jarring!

This commit makes it so that in fullscreen we go back to automatic
tabbing even for new windows, which produces new windows within a tab.
This is normal default behavior for macOS tabbed programs. When you are
not in fullscreen or exit fullscreen, then the tabbing mode returns to
disabled so Ghostty can manage it.
This commit is contained in:
Mitchell Hashimoto
2023-11-03 09:14:57 -07:00
parent c6ce9aea4a
commit cad461fff7
2 changed files with 25 additions and 6 deletions

View File

@ -96,6 +96,10 @@ class TerminalController: NSWindowController, NSWindowDelegate, TerminalViewDele
// If window decorations are disabled, remove our title // If window decorations are disabled, remove our title
if (!ghostty.windowDecorations) { window.styleMask.remove(.titled) } 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 // Terminals typically operate in sRGB color space and macOS defaults
// to "native" which is typically P3. There is a lot more resources // to "native" which is typically P3. There is a lot more resources
// covered in thie GitHub issue: https://github.com/mitchellh/ghostty/pull/376 // 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) { func windowDidBecomeKey(_ notification: Notification) {
self.relabelTabs() 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 //MARK: - First Responder

View File

@ -95,12 +95,6 @@ class TerminalManager {
// Initialize our controller to load the window // Initialize our controller to load the window
let c = TerminalController(ghostty, withBaseConfig: base) 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. // Create a listener for when the window is closed so we can remove it.
let pubClose = NotificationCenter.default.publisher( let pubClose = NotificationCenter.default.publisher(
for: NSWindow.willCloseNotification, for: NSWindow.willCloseNotification,