config: support quick terminal position

This commit is contained in:
Mitchell Hashimoto
2024-09-28 18:42:13 -07:00
parent 13eb8ac6e2
commit 11d5ec7dc1
5 changed files with 72 additions and 24 deletions

View File

@ -553,7 +553,10 @@ class AppDelegate: NSObject,
@IBAction func toggleQuickTerminal(_ sender: Any) {
if quickController == nil {
quickController = QuickTerminalController(ghostty, baseConfig: nil)
quickController = QuickTerminalController(
ghostty,
position: ghostty.config.quickTerminalPosition
)
}
guard let quickController = self.quickController else { return }

View File

@ -1,19 +1,30 @@
import Cocoa
enum QuickTerminalPosition {
enum QuickTerminalPosition : String {
case top
case bottom
case left
case right
/// Set the loaded state for a window.
func setLoaded(_ window: NSWindow) {
guard let screen = window.screen ?? NSScreen.main else { return }
switch (self) {
case .top:
case .top, .bottom:
window.setFrame(.init(
origin: window.frame.origin,
size: .init(
width: screen.frame.width,
height: screen.frame.height / 4)
), display: false)
case .left, .right:
window.setFrame(.init(
origin: window.frame.origin,
size: .init(
width: screen.frame.width / 4,
height: screen.frame.height)
), display: false)
}
}
@ -23,16 +34,11 @@ enum QuickTerminalPosition {
window.alphaValue = 0
// Position depends
switch (self) {
case .top:
window.setFrame(.init(
origin: initialOrigin(for: window, on: screen),
size: .init(
width: screen.frame.width,
height: window.frame.height)
size: window.frame.size
), display: false)
}
}
/// Set the final state for a window in this position.
func setFinal(in window: NSWindow, on screen: NSScreen) {
@ -40,21 +46,21 @@ enum QuickTerminalPosition {
window.alphaValue = 1
// Position depends
switch (self) {
case .top:
window.setFrame(.init(
origin: finalOrigin(for: window, on: screen),
size: window.frame.size
), display: true)
}
}
/// Restrict the frame size during resizing.
func restrictFrameSize(_ size: NSSize, on screen: NSScreen) -> NSSize {
var finalSize = size
switch (self) {
case .top:
case .top, .bottom:
finalSize.width = screen.frame.width
case .left, .right:
finalSize.height = screen.frame.height
}
return finalSize
@ -65,6 +71,15 @@ enum QuickTerminalPosition {
switch (self) {
case .top:
return .init(x: 0, y: screen.frame.maxY)
case .bottom:
return .init(x: 0, y: -window.frame.height)
case .left:
return .init(x: -window.frame.width, y: 0)
case .right:
return .init(x: screen.frame.maxX, y: 0)
}
}
@ -73,6 +88,15 @@ enum QuickTerminalPosition {
switch (self) {
case .top:
return .init(x: window.frame.origin.x, y: screen.visibleFrame.maxY - window.frame.height)
case .bottom:
return .init(x: window.frame.origin.x, y: 0)
case .left:
return .init(x: 0, y: window.frame.origin.y)
case .right:
return .init(x: screen.visibleFrame.maxX - window.frame.width, y: window.frame.origin.y)
}
}
}

View File

@ -332,6 +332,16 @@ extension Ghostty {
return Color(newColor)
}
var quickTerminalPosition: QuickTerminalPosition {
guard let config = self.config else { return .top }
var v: UnsafePointer<Int8>? = nil
let key = "quick-terminal-position"
guard ghostty_config_get(config, &v, key, UInt(key.count)) else { return .top }
guard let ptr = v else { return .top }
let str = String(cString: ptr)
return QuickTerminalPosition(rawValue: str) ?? .top
}
var resizeOverlay: ResizeOverlay {
guard let config = self.config else { return .after_first }
var v: UnsafePointer<Int8>? = nil

View File

@ -1220,6 +1220,13 @@ keybind: Keybinds = .{},
/// window is ever created. Only implemented on Linux.
@"initial-window": bool = true,
/// The position of the "quick" terminal window. To learn more about the
/// quick terminal, see the documentation for the `toggle_quick_terminal`
/// binding action.
///
/// Changing this configuration requires restarting Ghostty completely.
@"quick-terminal-position": QuickTerminalPosition = .top,
/// Whether to enable shell integration auto-injection or not. Shell integration
/// greatly enhances the terminal experience by enabling a number of features:
///
@ -4401,6 +4408,14 @@ pub const ResizeOverlayPosition = enum {
@"bottom-right",
};
/// See quick-terminal-position
pub const QuickTerminalPosition = enum {
top,
bottom,
left,
right,
};
/// See grapheme-width-method
pub const GraphemeWidthMethod = enum {
legacy,

View File

@ -402,10 +402,6 @@ pub const Action = union(enum) {
///
crash: CrashThread,
pub const QuickTerminalPosition = enum {
top,
};
pub const CrashThread = enum {
main,
io,