mirror of
https://github.com/ghostty-org/ghostty.git
synced 2025-08-02 14:57:31 +03:00
@ -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
|
//MARK: - NSWindowController
|
||||||
|
|
||||||
override func windowWillLoad() {
|
override func windowWillLoad() {
|
||||||
@ -531,9 +559,6 @@ class TerminalController: BaseTerminalController
|
|||||||
guard let target = notification.object as? Ghostty.SurfaceView else { return }
|
guard let target = notification.object as? Ghostty.SurfaceView else { return }
|
||||||
guard target == self.focusedSurface 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
|
// Get the fullscreen mode we want to toggle
|
||||||
let fullscreenMode: FullscreenMode
|
let fullscreenMode: FullscreenMode
|
||||||
if let any = notification.userInfo?[Ghostty.Notification.FullscreenModeKey],
|
if let any = notification.userInfo?[Ghostty.Notification.FullscreenModeKey],
|
||||||
@ -544,26 +569,6 @@ class TerminalController: BaseTerminalController
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: handle changing fullscreen modes at runtime
|
toggleFullscreen(mode: fullscreenMode)
|
||||||
// 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)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -65,17 +65,25 @@ class TerminalManager {
|
|||||||
let c = createWindow(withBaseConfig: base)
|
let c = createWindow(withBaseConfig: base)
|
||||||
let window = c.window!
|
let window = c.window!
|
||||||
|
|
||||||
// We want to go fullscreen if we're configured for new windows to go fullscreen
|
// If the previous focused window was native fullscreen, the new window also
|
||||||
var toggleFullScreen = ghostty.config.windowFullscreen
|
// becomes native fullscreen.
|
||||||
|
if let parent = focusedSurface?.window,
|
||||||
// If the previous focused window prior to creating this window is fullscreen,
|
parent.styleMask.contains(.fullScreen) {
|
||||||
// then this window also becomes fullscreen.
|
|
||||||
if let parent = focusedSurface?.window, parent.styleMask.contains(.fullScreen) {
|
|
||||||
toggleFullScreen = true
|
|
||||||
}
|
|
||||||
|
|
||||||
if (toggleFullScreen && !window.styleMask.contains(.fullScreen)) {
|
|
||||||
window.toggleFullScreen(nil)
|
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
|
// If our app isn't active, we make it active. All new_window actions
|
||||||
|
@ -219,6 +219,26 @@ extension Ghostty {
|
|||||||
return v
|
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? {
|
var windowTitleFontFamily: String? {
|
||||||
guard let config = self.config else { return nil }
|
guard let config = self.config else { return nil }
|
||||||
var v: UnsafePointer<Int8>? = nil
|
var v: UnsafePointer<Int8>? = nil
|
||||||
|
Reference in New Issue
Block a user