macos: fullscreen=true with non-native fullscreen works

Fixes #1377
This commit is contained in:
Mitchell Hashimoto
2024-09-30 10:02:34 -07:00
parent 718fa6042c
commit 5f9d4f9733
3 changed files with 67 additions and 34 deletions

View File

@ -199,6 +199,34 @@ class TerminalController: BaseTerminalController
}
}
/// Toggle fullscreen for the given mode.
func toggleFullscreen(mode: FullscreenMode) {
// We need a window to fullscreen
guard let window = self.window else { return }
// TODO: handle changing fullscreen modes at runtime
// This is where we'd handle this.
// Initialize our style for the window. This may fail for various reasons so
// we also guard below.
if self.fullscreenStyle == nil {
self.fullscreenStyle = mode.style(for: window)
}
guard let fullscreenStyle else { return }
if fullscreenStyle.isFullscreen {
fullscreenStyle.exit()
} else {
fullscreenStyle.enter()
}
// For some reason focus can get lost when we change fullscreen. Regardless of
// mode above we just move it back.
if let focusedSurface {
Ghostty.moveFocus(to: focusedSurface)
}
}
//MARK: - NSWindowController
override func windowWillLoad() {
@ -531,9 +559,6 @@ class TerminalController: BaseTerminalController
guard let target = notification.object as? Ghostty.SurfaceView else { return }
guard target == self.focusedSurface else { return }
// We need a window to fullscreen
guard let window = self.window else { return }
// Get the fullscreen mode we want to toggle
let fullscreenMode: FullscreenMode
if let any = notification.userInfo?[Ghostty.Notification.FullscreenModeKey],
@ -544,26 +569,6 @@ class TerminalController: BaseTerminalController
return
}
// TODO: handle changing fullscreen modes at runtime
// This is where we'd handle this.
// Initialize our style for the window. This may fail for various reasons so
// we also guard below.
if self.fullscreenStyle == nil {
self.fullscreenStyle = fullscreenMode.style(for: window)
}
guard let fullscreenStyle else { return }
if fullscreenStyle.isFullscreen {
fullscreenStyle.exit()
} else {
fullscreenStyle.enter()
}
// For some reason focus can get lost when we change fullscreen. Regardless of
// mode above we just move it back.
if let focusedSurface {
Ghostty.moveFocus(to: focusedSurface)
}
toggleFullscreen(mode: fullscreenMode)
}
}

View File

@ -65,17 +65,25 @@ class TerminalManager {
let c = createWindow(withBaseConfig: base)
let window = c.window!
// We want to go fullscreen if we're configured for new windows to go fullscreen
var toggleFullScreen = ghostty.config.windowFullscreen
// If the previous focused window prior to creating this window is fullscreen,
// then this window also becomes fullscreen.
if let parent = focusedSurface?.window, parent.styleMask.contains(.fullScreen) {
toggleFullScreen = true
}
if (toggleFullScreen && !window.styleMask.contains(.fullScreen)) {
// If the previous focused window was native fullscreen, the new window also
// becomes native fullscreen.
if let parent = focusedSurface?.window,
parent.styleMask.contains(.fullScreen) {
window.toggleFullScreen(nil)
} else if ghostty.config.windowFullscreen {
switch (ghostty.config.windowFullscreenMode) {
case .native:
// Native has to be done immediately so that our stylemask contains
// fullscreen for the logic later in this method.
c.toggleFullscreen(mode: .native)
case .nonNative, .nonNativeVisibleMenu:
// If we're non-native then we have to do it on a later loop
// so that the content view is setup.
DispatchQueue.main.async {
c.toggleFullscreen(mode: self.ghostty.config.windowFullscreenMode)
}
}
}
// If our app isn't active, we make it active. All new_window actions

View File

@ -219,6 +219,26 @@ extension Ghostty {
return v
}
var windowFullscreenMode: FullscreenMode {
let defaultValue: FullscreenMode = .native
guard let config = self.config else { return defaultValue }
var v: UnsafePointer<Int8>? = nil
let key = "macos-non-native-fullscreen"
guard ghostty_config_get(config, &v, key, UInt(key.count)) else { return defaultValue }
guard let ptr = v else { return defaultValue }
let str = String(cString: ptr)
return switch str {
case "false":
.native
case "true":
.nonNative
case "visible-menu":
.nonNativeVisibleMenu
default:
defaultValue
}
}
var windowTitleFontFamily: String? {
guard let config = self.config else { return nil }
var v: UnsafePointer<Int8>? = nil