mirror of
https://github.com/ghostty-org/ghostty.git
synced 2025-07-20 10:46:07 +03:00

Applying the feedback given by @pluiedev to use an enum to specify the type of quick terminal size configuration given (pixels or percentage). Updated the Swift code to work with the enum as well.
85 lines
2.7 KiB
Swift
85 lines
2.7 KiB
Swift
import GhosttyKit
|
|
|
|
struct QuickTerminalSize {
|
|
let primary: Size?
|
|
let secondary: Size?
|
|
|
|
init(primary: Size? = nil, secondary: Size? = nil) {
|
|
self.primary = primary
|
|
self.secondary = secondary
|
|
}
|
|
|
|
init(from cStruct: ghostty_config_quick_terminal_size_s) {
|
|
self.primary = Size(from: cStruct.primary)
|
|
self.secondary = Size(from: cStruct.secondary)
|
|
}
|
|
|
|
enum Size {
|
|
case percentage(Float)
|
|
case pixels(UInt32)
|
|
|
|
init?(from cStruct: ghostty_quick_terminal_size_u) {
|
|
switch cStruct.type {
|
|
case GHOSTTY_QUICK_TERMINAL_SIZE_NONE:
|
|
return nil
|
|
case GHOSTTY_QUICK_TERMINAL_SIZE_PERCENTAGE:
|
|
let floatValue = withUnsafePointer(to: cStruct.value) { ptr in
|
|
ptr.withMemoryRebound(to: Float.self, capacity: 1) { $0.pointee }
|
|
}
|
|
self = .percentage(floatValue)
|
|
case GHOSTTY_QUICK_TERMINAL_SIZE_PIXELS:
|
|
self = .pixels(cStruct.value)
|
|
default:
|
|
return nil
|
|
}
|
|
}
|
|
|
|
func toPixels(parentDimension: CGFloat) -> CGFloat {
|
|
switch self {
|
|
case .percentage(let value):
|
|
return parentDimension * CGFloat(value) / 100.0
|
|
case .pixels(let value):
|
|
return CGFloat(value)
|
|
}
|
|
}
|
|
}
|
|
|
|
struct Dimensions {
|
|
let width: CGFloat
|
|
let height: CGFloat
|
|
}
|
|
|
|
func calculate(position: QuickTerminalPosition, screenDimensions: CGSize) -> Dimensions {
|
|
let dims = Dimensions(width: screenDimensions.width, height: screenDimensions.height)
|
|
|
|
switch position {
|
|
case .left, .right:
|
|
return Dimensions(
|
|
width: primary?.toPixels(parentDimension: dims.width) ?? 400,
|
|
height: secondary?.toPixels(parentDimension: dims.height) ?? dims.height
|
|
)
|
|
|
|
case .top, .bottom:
|
|
return Dimensions(
|
|
width: secondary?.toPixels(parentDimension: dims.width) ?? dims.width,
|
|
height: primary?.toPixels(parentDimension: dims.height) ?? 400
|
|
)
|
|
|
|
case .center:
|
|
if dims.width >= dims.height {
|
|
// Landscape
|
|
return Dimensions(
|
|
width: primary?.toPixels(parentDimension: dims.width) ?? 800,
|
|
height: secondary?.toPixels(parentDimension: dims.height) ?? 400
|
|
)
|
|
} else {
|
|
// Portrait
|
|
return Dimensions(
|
|
width: secondary?.toPixels(parentDimension: dims.width) ?? 400,
|
|
height: primary?.toPixels(parentDimension: dims.height) ?? 800
|
|
)
|
|
}
|
|
}
|
|
}
|
|
}
|