mirror of
https://github.com/ghostty-org/ghostty.git
synced 2026-04-06 07:38:21 +00:00
macos: swiftlint 'control_statement' rule
This commit is contained in:
@@ -13,7 +13,6 @@ disabled_rules:
|
||||
- type_body_length
|
||||
|
||||
# TODO
|
||||
- control_statement
|
||||
- deployment_target
|
||||
- empty_enum_arguments
|
||||
- empty_parentheses_with_trailing_closure
|
||||
|
||||
@@ -197,7 +197,7 @@ class AppDelegate: NSObject,
|
||||
applicationLaunchTime = ProcessInfo.processInfo.systemUptime
|
||||
|
||||
// Check if secure input was enabled when we last quit.
|
||||
if (UserDefaults.standard.bool(forKey: "SecureInput") != SecureInput.shared.enabled) {
|
||||
if UserDefaults.standard.bool(forKey: "SecureInput") != SecureInput.shared.enabled {
|
||||
toggleSecureInput(self)
|
||||
}
|
||||
|
||||
@@ -280,7 +280,7 @@ class AppDelegate: NSObject,
|
||||
guard let appearance = change.newValue else { return }
|
||||
guard let app = self.ghostty.app else { return }
|
||||
let scheme: ghostty_color_scheme_e
|
||||
if (appearance.isDark) {
|
||||
if appearance.isDark {
|
||||
scheme = GHOSTTY_COLOR_SCHEME_DARK
|
||||
} else {
|
||||
scheme = GHOSTTY_COLOR_SCHEME_LIGHT
|
||||
@@ -332,7 +332,7 @@ class AppDelegate: NSObject,
|
||||
self.setDockBadge(nil)
|
||||
|
||||
// First launch stuff
|
||||
if (!applicationHasBecomeActive) {
|
||||
if !applicationHasBecomeActive {
|
||||
applicationHasBecomeActive = true
|
||||
|
||||
// Let's launch our first window. We only do this if we have no other windows. It
|
||||
@@ -353,7 +353,7 @@ class AppDelegate: NSObject,
|
||||
|
||||
func applicationShouldTerminate(_ sender: NSApplication) -> NSApplication.TerminateReply {
|
||||
let windows = NSApplication.shared.windows
|
||||
if (windows.isEmpty) { return .terminateNow }
|
||||
if windows.isEmpty { return .terminateNow }
|
||||
|
||||
// If we've already accepted to install an update, then we don't need to
|
||||
// confirm quit. The user is already expecting the update to happen.
|
||||
@@ -380,7 +380,7 @@ class AppDelegate: NSObject,
|
||||
guard let keyword = AEKeyword("why?") else { break why }
|
||||
|
||||
if let why = event.attributeDescriptor(forKeyword: keyword) {
|
||||
switch (why.typeCodeValue) {
|
||||
switch why.typeCodeValue {
|
||||
case kAEShutDown:
|
||||
fallthrough
|
||||
|
||||
@@ -397,7 +397,7 @@ class AppDelegate: NSObject,
|
||||
}
|
||||
|
||||
// If our app says we don't need to confirm, we can exit now.
|
||||
if (!ghostty.needsConfirmQuit) { return .terminateNow }
|
||||
if !ghostty.needsConfirmQuit { return .terminateNow }
|
||||
|
||||
// We have some visible window. Show an app-wide modal to confirm quitting.
|
||||
let alert = NSAlert()
|
||||
@@ -406,7 +406,7 @@ class AppDelegate: NSObject,
|
||||
alert.addButton(withTitle: "Close Ghostty")
|
||||
alert.addButton(withTitle: "Cancel")
|
||||
alert.alertStyle = .warning
|
||||
switch (alert.runModal()) {
|
||||
switch alert.runModal() {
|
||||
case .alertFirstButtonReturn:
|
||||
return .terminateNow
|
||||
|
||||
@@ -460,7 +460,7 @@ class AppDelegate: NSObject,
|
||||
// Initialize the surface config which will be used to create the tab or window for the opened file.
|
||||
var config = Ghostty.SurfaceConfiguration()
|
||||
|
||||
if (isDirectory.boolValue) {
|
||||
if isDirectory.boolValue {
|
||||
// When opening a directory, check the configuration to decide
|
||||
// whether to open in a new tab or new window.
|
||||
config.workingDirectory = filename
|
||||
@@ -498,7 +498,7 @@ class AppDelegate: NSObject,
|
||||
alert.addButton(withTitle: "Allow")
|
||||
alert.addButton(withTitle: "Cancel")
|
||||
alert.alertStyle = .warning
|
||||
switch (alert.runModal()) {
|
||||
switch alert.runModal() {
|
||||
case .alertFirstButtonReturn:
|
||||
break
|
||||
|
||||
@@ -746,7 +746,7 @@ class AppDelegate: NSObject,
|
||||
guard let ghostty = self.ghostty.app else { return event }
|
||||
|
||||
// Build our event input and call ghostty
|
||||
if (ghostty_app_key(ghostty, event.ghosttyKeyEvent(GHOSTTY_ACTION_PRESS))) {
|
||||
if ghostty_app_key(ghostty, event.ghosttyKeyEvent(GHOSTTY_ACTION_PRESS)) {
|
||||
// The key was used so we want to stop it from going to our Mac app
|
||||
Ghostty.logger.debug("local key event handled event=\(event)")
|
||||
return nil
|
||||
@@ -761,7 +761,7 @@ class AppDelegate: NSObject,
|
||||
|
||||
@objc private func quickTerminalDidChangeVisibility(_ notification: Notification) {
|
||||
guard let quickController = notification.object as? QuickTerminalController else { return }
|
||||
self.menuQuickTerminal?.state = if (quickController.visible) { .on } else { .off }
|
||||
self.menuQuickTerminal?.state = if quickController.visible { .on } else { .off }
|
||||
}
|
||||
|
||||
@objc private func ghosttyConfigDidChange(_ notification: Notification) {
|
||||
@@ -777,11 +777,11 @@ class AppDelegate: NSObject,
|
||||
}
|
||||
|
||||
@objc private func ghosttyBellDidRing(_ notification: Notification) {
|
||||
if (ghostty.config.bellFeatures.contains(.system)) {
|
||||
if ghostty.config.bellFeatures.contains(.system) {
|
||||
NSSound.beep()
|
||||
}
|
||||
|
||||
if (ghostty.config.bellFeatures.contains(.attention)) {
|
||||
if ghostty.config.bellFeatures.contains(.attention) {
|
||||
// Bounce the dock icon if we're not focused.
|
||||
NSApp.requestUserAttention(.informationalRequest)
|
||||
|
||||
@@ -861,7 +861,7 @@ class AppDelegate: NSObject,
|
||||
// Depending on the "window-save-state" setting we have to set the NSQuitAlwaysKeepsWindows
|
||||
// configuration. This is the only way to carefully control whether macOS invokes the
|
||||
// state restoration system.
|
||||
switch (config.windowSaveState) {
|
||||
switch config.windowSaveState {
|
||||
case "never": UserDefaults.standard.setValue(false, forKey: "NSQuitAlwaysKeepsWindows")
|
||||
case "always": UserDefaults.standard.setValue(true, forKey: "NSQuitAlwaysKeepsWindows")
|
||||
case "default": fallthrough
|
||||
@@ -900,7 +900,7 @@ class AppDelegate: NSObject,
|
||||
DispatchQueue.main.async { self.syncAppearance(config: config) }
|
||||
|
||||
// Decide whether to hide/unhide app from dock and app switcher
|
||||
switch (config.macosHidden) {
|
||||
switch config.macosHidden {
|
||||
case .never:
|
||||
NSApp.setActivationPolicy(.regular)
|
||||
|
||||
@@ -911,16 +911,16 @@ class AppDelegate: NSObject,
|
||||
// If we have configuration errors, we need to show them.
|
||||
let c = ConfigurationErrorsController.sharedInstance
|
||||
c.errors = config.errors
|
||||
if (c.errors.count > 0) {
|
||||
if (c.window == nil || !c.window!.isVisible) {
|
||||
if c.errors.count > 0 {
|
||||
if c.window == nil || !c.window!.isVisible {
|
||||
c.showWindow(self)
|
||||
}
|
||||
}
|
||||
|
||||
// We need to handle our global event tap depending on if there are global
|
||||
// events that we care about in Ghostty.
|
||||
if (ghostty_app_has_global_keybinds(ghostty.app!)) {
|
||||
if (timeSinceLaunch > 5) {
|
||||
if ghostty_app_has_global_keybinds(ghostty.app!) {
|
||||
if timeSinceLaunch > 5 {
|
||||
// If the process has been running for awhile we enable right away
|
||||
// because no windows are likely to pop up.
|
||||
GlobalEventTap.shared.enable()
|
||||
@@ -952,7 +952,7 @@ class AppDelegate: NSObject,
|
||||
var appIcon: NSImage?
|
||||
var appIconName: String? = config.macosIcon.rawValue
|
||||
|
||||
switch (config.macosIcon) {
|
||||
switch config.macosIcon {
|
||||
case let icon where icon.assetName != nil:
|
||||
appIcon = NSImage(named: icon.assetName!)!
|
||||
|
||||
@@ -1108,7 +1108,7 @@ class AppDelegate: NSObject,
|
||||
|
||||
func setSecureInput(_ mode: Ghostty.SetSecureInput) {
|
||||
let input = SecureInput.shared
|
||||
switch (mode) {
|
||||
switch mode {
|
||||
case .on:
|
||||
input.global = true
|
||||
|
||||
@@ -1118,7 +1118,7 @@ class AppDelegate: NSObject,
|
||||
case .toggle:
|
||||
input.global.toggle()
|
||||
}
|
||||
self.menuSecureInput?.state = if (input.global) { .on } else { .off }
|
||||
self.menuSecureInput?.state = if input.global { .on } else { .off }
|
||||
UserDefaults.standard.set(input.global, forKey: "SecureInput")
|
||||
}
|
||||
|
||||
@@ -1288,7 +1288,7 @@ extension AppDelegate {
|
||||
@IBAction func useAsDefault(_ sender: NSMenuItem) {
|
||||
let ud = UserDefaults.standard
|
||||
let key = TerminalWindow.defaultLevelKey
|
||||
if (menuFloatOnTop?.state == .on) {
|
||||
if menuFloatOnTop?.state == .on {
|
||||
ud.set(NSWindow.Level.floating, forKey: key)
|
||||
} else {
|
||||
ud.removeObject(forKey: key)
|
||||
|
||||
@@ -28,7 +28,7 @@ func requestIntentPermission() async -> Bool {
|
||||
await withCheckedContinuation { continuation in
|
||||
Task { @MainActor in
|
||||
if let delegate = NSApp.delegate as? AppDelegate {
|
||||
switch (delegate.ghostty.config.macosShortcuts) {
|
||||
switch delegate.ghostty.config.macosShortcuts {
|
||||
case .allow:
|
||||
continuation.resume(returning: true)
|
||||
return
|
||||
|
||||
@@ -33,7 +33,7 @@ class ClipboardConfirmationController: NSWindowController {
|
||||
override func windowDidLoad() {
|
||||
guard let window = window else { return }
|
||||
|
||||
switch (request) {
|
||||
switch request {
|
||||
case .paste:
|
||||
window.title = "Warning: Potentially Unsafe Paste"
|
||||
case .osc_52_read, .osc_52_write:
|
||||
|
||||
@@ -74,7 +74,7 @@ struct ClipboardConfirmationView: View {
|
||||
// If we didn't unhide anything, we just send an unhide to be safe.
|
||||
// I don't think the count can go negative on NSCursor so this handles
|
||||
// scenarios cursor is hidden outside of our own NSCursor usage.
|
||||
if (cursorHiddenCount == 0) {
|
||||
if cursorHiddenCount == 0 {
|
||||
_ = Cursor.unhide()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -19,7 +19,7 @@ struct ColorizedGhosttyIcon {
|
||||
guard let crt = NSImage(named: "CustomIconCRT") else { return nil }
|
||||
guard let gloss = NSImage(named: "CustomIconGloss") else { return nil }
|
||||
|
||||
let baseName = switch (frame) {
|
||||
let baseName = switch frame {
|
||||
case .aluminum: "CustomIconBaseAluminum"
|
||||
case .beige: "CustomIconBaseBeige"
|
||||
case .chrome: "CustomIconBaseChrome"
|
||||
|
||||
@@ -106,7 +106,7 @@ struct CommandPaletteView: View {
|
||||
|
||||
VStack(alignment: .leading, spacing: 0) {
|
||||
CommandPaletteQuery(query: $query, isTextFieldFocused: _isTextFieldFocused) { event in
|
||||
switch (event) {
|
||||
switch event {
|
||||
case .exit:
|
||||
isPresented = false
|
||||
|
||||
|
||||
@@ -33,7 +33,7 @@ class GlobalEventTap {
|
||||
// If enabling fails due to permissions, this will start a timer to retry since
|
||||
// accessibility permissions take affect immediately.
|
||||
func enable() {
|
||||
if (eventTap != nil) {
|
||||
if eventTap != nil {
|
||||
// Already enabled
|
||||
return
|
||||
}
|
||||
@@ -44,7 +44,7 @@ class GlobalEventTap {
|
||||
}
|
||||
|
||||
// Try to enable the event tap immediately. If this succeeds then we're done!
|
||||
if (tryEnable()) {
|
||||
if tryEnable() {
|
||||
return
|
||||
}
|
||||
|
||||
@@ -142,7 +142,7 @@ fileprivate func cgEventFlagsChangedHandler(
|
||||
|
||||
// Build our event input and call ghostty
|
||||
let key_ev = event.ghosttyKeyEvent(GHOSTTY_ACTION_PRESS)
|
||||
if (ghostty_app_key(ghostty, key_ev)) {
|
||||
if ghostty_app_key(ghostty, key_ev) {
|
||||
GlobalEventTap.logger.info("global key event handled event=\(event)")
|
||||
return nil
|
||||
}
|
||||
|
||||
@@ -316,7 +316,7 @@ class QuickTerminalController: BaseTerminalController {
|
||||
// MARK: Methods
|
||||
|
||||
func toggle() {
|
||||
if (visible) {
|
||||
if visible {
|
||||
animateOut()
|
||||
} else {
|
||||
animateIn()
|
||||
@@ -441,7 +441,7 @@ class QuickTerminalController: BaseTerminalController {
|
||||
// If our dock position would conflict with our target location then
|
||||
// we autohide the dock.
|
||||
if position.conflictsWithDock(on: screen) {
|
||||
if (hiddenDock == nil) {
|
||||
if hiddenDock == nil {
|
||||
hiddenDock = .init()
|
||||
}
|
||||
|
||||
@@ -675,10 +675,10 @@ class QuickTerminalController: BaseTerminalController {
|
||||
// We ignore the configured fullscreen style and always use non-native
|
||||
// because the way the quick terminal works doesn't support native.
|
||||
let mode: FullscreenMode
|
||||
if (NSApp.isFrontmost) {
|
||||
if NSApp.isFrontmost {
|
||||
// If we're frontmost and we have a notch then we keep padding
|
||||
// so all lines of the terminal are visible.
|
||||
if (window?.screen?.hasNotch ?? false) {
|
||||
if window?.screen?.hasNotch ?? false {
|
||||
mode = .nonNativePaddedNotch
|
||||
} else {
|
||||
mode = .nonNative
|
||||
|
||||
@@ -64,7 +64,7 @@ enum QuickTerminalPosition: String {
|
||||
|
||||
/// The initial point origin for this position.
|
||||
func initialOrigin(for window: NSWindow, on screen: NSScreen) -> CGPoint {
|
||||
switch (self) {
|
||||
switch self {
|
||||
case .top:
|
||||
return .init(
|
||||
x: round(screen.visibleFrame.origin.x + (screen.visibleFrame.width - window.frame.width) / 2),
|
||||
@@ -92,7 +92,7 @@ enum QuickTerminalPosition: String {
|
||||
|
||||
/// The final point origin for this position.
|
||||
func finalOrigin(for window: NSWindow, on screen: NSScreen) -> CGPoint {
|
||||
switch (self) {
|
||||
switch self {
|
||||
case .top:
|
||||
return .init(
|
||||
x: round(screen.visibleFrame.origin.x + (screen.visibleFrame.width - window.frame.width) / 2),
|
||||
@@ -128,7 +128,7 @@ enum QuickTerminalPosition: String {
|
||||
// Depending on the orientation of the dock, we conflict if our quick terminal
|
||||
// would potentially "hit" the dock. In the future we should probably consider
|
||||
// the frame of the quick terminal.
|
||||
return switch (orientation) {
|
||||
return switch orientation {
|
||||
case .top: self == .top || self == .left || self == .right
|
||||
case .bottom: self == .bottom || self == .left || self == .right
|
||||
case .left: self == .top || self == .bottom
|
||||
|
||||
@@ -6,7 +6,7 @@ enum QuickTerminalScreen {
|
||||
case menuBar
|
||||
|
||||
init?(fromGhosttyConfig string: String) {
|
||||
switch (string) {
|
||||
switch string {
|
||||
case "main":
|
||||
self = .main
|
||||
|
||||
@@ -22,7 +22,7 @@ enum QuickTerminalScreen {
|
||||
}
|
||||
|
||||
var screen: NSScreen? {
|
||||
switch (self) {
|
||||
switch self {
|
||||
case .main:
|
||||
return NSScreen.main
|
||||
|
||||
|
||||
@@ -6,7 +6,7 @@ enum QuickTerminalSpaceBehavior {
|
||||
case move
|
||||
|
||||
init?(fromGhosttyConfig string: String) {
|
||||
switch (string) {
|
||||
switch string {
|
||||
case "move":
|
||||
self = .move
|
||||
|
||||
@@ -24,7 +24,7 @@ enum QuickTerminalSpaceBehavior {
|
||||
.fullScreenAuxiliary
|
||||
]
|
||||
|
||||
switch (self) {
|
||||
switch self {
|
||||
case .move:
|
||||
// We want this to move the window to the active space.
|
||||
return NSWindow.CollectionBehavior([.canJoinAllSpaces] + commonBehavior)
|
||||
|
||||
@@ -90,12 +90,12 @@ class SecureInput: ObservableObject {
|
||||
guard enabled != desired else { return }
|
||||
|
||||
let err: OSStatus
|
||||
if (enabled) {
|
||||
if enabled {
|
||||
err = DisableSecureEventInput()
|
||||
} else {
|
||||
err = EnableSecureEventInput()
|
||||
}
|
||||
if (err == noErr) {
|
||||
if err == noErr {
|
||||
enabled = desired
|
||||
Self.logger.debug("secure input state=\(self.enabled)")
|
||||
return
|
||||
@@ -111,7 +111,7 @@ class SecureInput: ObservableObject {
|
||||
// desire to be enabled.
|
||||
guard !enabled && desired else { return }
|
||||
let err = EnableSecureEventInput()
|
||||
if (err == noErr) {
|
||||
if err == noErr {
|
||||
enabled = true
|
||||
Self.logger.debug("secure input enabled on activation")
|
||||
return
|
||||
@@ -124,7 +124,7 @@ class SecureInput: ObservableObject {
|
||||
// We only want to disable if we're enabled.
|
||||
guard enabled else { return }
|
||||
let err = DisableSecureEventInput()
|
||||
if (err == noErr) {
|
||||
if err == noErr {
|
||||
enabled = false
|
||||
Self.logger.debug("secure input disabled on deactivation")
|
||||
return
|
||||
|
||||
@@ -50,7 +50,7 @@ class ServiceProvider: NSObject {
|
||||
var config = Ghostty.SurfaceConfiguration()
|
||||
config.workingDirectory = url.path(percentEncoded: false)
|
||||
|
||||
switch (target) {
|
||||
switch target {
|
||||
case .window:
|
||||
_ = TerminalController.newWindow(delegate.ghostty, withBaseConfig: config)
|
||||
|
||||
|
||||
@@ -12,7 +12,7 @@ class ConfigurationErrorsController: NSWindowController, NSWindowDelegate, Confi
|
||||
/// The data model for this view. Update this directly and the associated view will be updated, too.
|
||||
@Published var errors: [String] = [] {
|
||||
didSet {
|
||||
if (errors.count == 0) {
|
||||
if errors.count == 0 {
|
||||
self.window?.performClose(nil)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -222,7 +222,7 @@ extension SplitTree {
|
||||
case .split:
|
||||
// If the best candidate is a split node, use its the leaf/rightmost
|
||||
// depending on our spatial direction.
|
||||
return switch (spatialDirection) {
|
||||
return switch spatialDirection {
|
||||
case .up, .left: bestNode.node.leftmostLeaf()
|
||||
case .down, .right: bestNode.node.rightmostLeaf()
|
||||
}
|
||||
@@ -422,7 +422,7 @@ extension SplitTree.Node {
|
||||
|
||||
/// Returns the node in the tree that contains the given view.
|
||||
func node(view: ViewType) -> Node? {
|
||||
switch (self) {
|
||||
switch self {
|
||||
case .leaf(view):
|
||||
return self
|
||||
|
||||
|
||||
@@ -10,7 +10,7 @@ extension SplitView {
|
||||
@Binding var split: CGFloat
|
||||
|
||||
private var visibleWidth: CGFloat? {
|
||||
switch (direction) {
|
||||
switch direction {
|
||||
case .horizontal:
|
||||
return visibleSize
|
||||
case .vertical:
|
||||
@@ -19,7 +19,7 @@ extension SplitView {
|
||||
}
|
||||
|
||||
private var visibleHeight: CGFloat? {
|
||||
switch (direction) {
|
||||
switch direction {
|
||||
case .horizontal:
|
||||
return nil
|
||||
case .vertical:
|
||||
@@ -28,7 +28,7 @@ extension SplitView {
|
||||
}
|
||||
|
||||
private var invisibleWidth: CGFloat? {
|
||||
switch (direction) {
|
||||
switch direction {
|
||||
case .horizontal:
|
||||
return visibleSize + invisibleSize
|
||||
case .vertical:
|
||||
@@ -37,7 +37,7 @@ extension SplitView {
|
||||
}
|
||||
|
||||
private var invisibleHeight: CGFloat? {
|
||||
switch (direction) {
|
||||
switch direction {
|
||||
case .horizontal:
|
||||
return nil
|
||||
case .vertical:
|
||||
@@ -46,7 +46,7 @@ extension SplitView {
|
||||
}
|
||||
|
||||
private var pointerStyle: BackportPointerStyle {
|
||||
return switch (direction) {
|
||||
return switch direction {
|
||||
case .horizontal: .resizeLeftRight
|
||||
case .vertical: .resizeUpDown
|
||||
}
|
||||
@@ -69,8 +69,8 @@ extension SplitView {
|
||||
return
|
||||
}
|
||||
|
||||
if (isHovered) {
|
||||
switch (direction) {
|
||||
if isHovered {
|
||||
switch direction {
|
||||
case .horizontal:
|
||||
NSCursor.resizeLeftRight.push()
|
||||
case .vertical:
|
||||
|
||||
@@ -90,7 +90,7 @@ struct SplitView<L: View, R: View>: View {
|
||||
private func dragGesture(_ size: CGSize, splitterPoint: CGPoint) -> some Gesture {
|
||||
return DragGesture()
|
||||
.onChanged { gesture in
|
||||
switch (direction) {
|
||||
switch direction {
|
||||
case .horizontal:
|
||||
let new = min(max(minSize, gesture.location.x), size.width - minSize)
|
||||
split = new / size.width
|
||||
@@ -106,7 +106,7 @@ struct SplitView<L: View, R: View>: View {
|
||||
private func leftRect(for size: CGSize) -> CGRect {
|
||||
// Initially the rect is the full size
|
||||
var result = CGRect(x: 0, y: 0, width: size.width, height: size.height)
|
||||
switch (direction) {
|
||||
switch direction {
|
||||
case .horizontal:
|
||||
result.size.width = result.size.width * split
|
||||
result.size.width -= splitterVisibleSize / 2
|
||||
@@ -125,7 +125,7 @@ struct SplitView<L: View, R: View>: View {
|
||||
private func rightRect(for size: CGSize, leftRect: CGRect) -> CGRect {
|
||||
// Initially the rect is the full size
|
||||
var result = CGRect(x: 0, y: 0, width: size.width, height: size.height)
|
||||
switch (direction) {
|
||||
switch direction {
|
||||
case .horizontal:
|
||||
// For horizontal layouts we offset the starting X by the left rect
|
||||
// and make the width fit the remaining space.
|
||||
@@ -144,7 +144,7 @@ struct SplitView<L: View, R: View>: View {
|
||||
|
||||
/// Calculates the point at which the splitter should be rendered.
|
||||
private func splitterPoint(for size: CGSize, leftRect: CGRect) -> CGPoint {
|
||||
switch (direction) {
|
||||
switch direction {
|
||||
case .horizontal:
|
||||
return CGPoint(x: leftRect.size.width, y: size.height / 2)
|
||||
|
||||
|
||||
@@ -52,12 +52,12 @@ fileprivate struct TerminalSplitSubtreeView: View {
|
||||
let action: (TerminalSplitOperation) -> Void
|
||||
|
||||
var body: some View {
|
||||
switch (node) {
|
||||
switch node {
|
||||
case .leaf(let leafView):
|
||||
TerminalSplitLeaf(surfaceView: leafView, isSplit: !isRoot, action: action)
|
||||
|
||||
case .split(let split):
|
||||
let splitViewDirection: SplitViewDirection = switch (split.direction) {
|
||||
let splitViewDirection: SplitViewDirection = switch split.direction {
|
||||
case .horizontal: .horizontal
|
||||
case .vertical: .vertical
|
||||
}
|
||||
|
||||
@@ -281,7 +281,7 @@ class BaseTerminalController: NSWindowController,
|
||||
/// Subclasses should call super first.
|
||||
func surfaceTreeDidChange(from: SplitTree<Ghostty.SurfaceView>, to: SplitTree<Ghostty.SurfaceView>) {
|
||||
// If our surface tree becomes empty then we have no focused surface.
|
||||
if (to.isEmpty) {
|
||||
if to.isEmpty {
|
||||
focusedSurface = nil
|
||||
}
|
||||
}
|
||||
@@ -596,7 +596,7 @@ class BaseTerminalController: NSWindowController,
|
||||
guard let directionAny = notification.userInfo?["direction"] else { return }
|
||||
guard let direction = directionAny as? ghostty_action_split_direction_e else { return }
|
||||
let splitDirection: SplitTree<Ghostty.SurfaceView>.NewDirection
|
||||
switch (direction) {
|
||||
switch direction {
|
||||
case GHOSTTY_SPLIT_DIRECTION_RIGHT: splitDirection = .right
|
||||
case GHOSTTY_SPLIT_DIRECTION_LEFT: splitDirection = .left
|
||||
case GHOSTTY_SPLIT_DIRECTION_DOWN: splitDirection = .down
|
||||
@@ -820,7 +820,7 @@ class BaseTerminalController: NSWindowController,
|
||||
|
||||
private func computeTitle(title: String, bell: Bool) -> String {
|
||||
var result = title
|
||||
if (bell && ghostty.config.bellFeatures.contains(.title)) {
|
||||
if bell && ghostty.config.bellFeatures.contains(.title) {
|
||||
result = "🔔 \(result)"
|
||||
}
|
||||
|
||||
@@ -966,7 +966,7 @@ class BaseTerminalController: NSWindowController,
|
||||
func performAction(_ action: String, on surfaceView: Ghostty.SurfaceView) {
|
||||
guard let surface = surfaceView.surface else { return }
|
||||
let len = action.utf8CString.count
|
||||
if (len == 0) { return }
|
||||
if len == 0 { return }
|
||||
_ = action.withCString { cString in
|
||||
ghostty_surface_binding_action(surface, cString, UInt(len - 1))
|
||||
}
|
||||
@@ -1109,7 +1109,7 @@ class BaseTerminalController: NSWindowController,
|
||||
window?.endSheet(ccWindow)
|
||||
}
|
||||
|
||||
switch (request) {
|
||||
switch request {
|
||||
case let .osc_52_write(pasteboard):
|
||||
guard case .confirm = action else { break }
|
||||
let pb = pasteboard ?? NSPasteboard.general
|
||||
@@ -1117,7 +1117,7 @@ class BaseTerminalController: NSWindowController,
|
||||
pb.setString(cc.contents, forType: .string)
|
||||
case .osc_52_read, .paste:
|
||||
let str: String
|
||||
switch (action) {
|
||||
switch action {
|
||||
case .cancel:
|
||||
str = ""
|
||||
|
||||
|
||||
@@ -160,7 +160,7 @@ class TerminalController: BaseTerminalController, TabGroupCloseCoordinator.Contr
|
||||
}
|
||||
|
||||
// If our surface tree is now nil then we close our window.
|
||||
if (to.isEmpty) {
|
||||
if to.isEmpty {
|
||||
self.window?.close()
|
||||
}
|
||||
}
|
||||
@@ -253,7 +253,7 @@ class TerminalController: BaseTerminalController, TabGroupCloseCoordinator.Contr
|
||||
DispatchQueue.main.async {
|
||||
// Only cascade if we aren't fullscreen.
|
||||
if let window = c.window {
|
||||
if (!window.styleMask.contains(.fullScreen)) {
|
||||
if !window.styleMask.contains(.fullScreen) {
|
||||
Self.lastCascadePoint = window.cascadeTopLeft(from: Self.lastCascadePoint)
|
||||
}
|
||||
}
|
||||
@@ -390,7 +390,7 @@ class TerminalController: BaseTerminalController, TabGroupCloseCoordinator.Contr
|
||||
|
||||
// If the parent is miniaturized, then macOS exhibits really strange behaviors
|
||||
// so we have to bring it back out.
|
||||
if (parent.isMiniaturized) { parent.deminiaturize(self) }
|
||||
if parent.isMiniaturized { parent.deminiaturize(self) }
|
||||
|
||||
// If our parent tab group already has this window, macOS added it and
|
||||
// we need to remove it so we can set the correct order in the next line.
|
||||
@@ -405,7 +405,7 @@ class TerminalController: BaseTerminalController, TabGroupCloseCoordinator.Contr
|
||||
}
|
||||
|
||||
// If we don't allow tabs then we create a new window instead.
|
||||
if (window.tabbingMode != .disallowed) {
|
||||
if window.tabbingMode != .disallowed {
|
||||
// Add the window to the tab group and show it.
|
||||
switch ghostty.config.windowNewTabPosition {
|
||||
case "end":
|
||||
@@ -491,7 +491,7 @@ class TerminalController: BaseTerminalController, TabGroupCloseCoordinator.Contr
|
||||
] as? Ghostty.Config else { return }
|
||||
|
||||
// If this is an app-level config update then we update some things.
|
||||
if (notification.object == nil) {
|
||||
if notification.object == nil {
|
||||
// Update our derived config
|
||||
self.derivedConfig = DerivedConfig(config)
|
||||
|
||||
@@ -907,7 +907,7 @@ class TerminalController: BaseTerminalController, TabGroupCloseCoordinator.Contr
|
||||
alert.addButton(withTitle: "Cancel")
|
||||
alert.alertStyle = .warning
|
||||
alert.beginSheetModal(for: confirmWindow, completionHandler: { response in
|
||||
if (response == .alertFirstButtonReturn) {
|
||||
if response == .alertFirstButtonReturn {
|
||||
// This is important so that we avoid losing focus when Stage
|
||||
// Manager is used (#8336)
|
||||
alert.window.orderOut(nil)
|
||||
@@ -1013,7 +1013,7 @@ class TerminalController: BaseTerminalController, TabGroupCloseCoordinator.Contr
|
||||
|
||||
// Setting all three of these is required for restoration to work.
|
||||
window.isRestorable = restorable
|
||||
if (restorable) {
|
||||
if restorable {
|
||||
window.restorationClass = TerminalWindowRestoration.self
|
||||
window.identifier = .init(String(describing: TerminalWindowRestoration.self))
|
||||
}
|
||||
@@ -1035,7 +1035,7 @@ class TerminalController: BaseTerminalController, TabGroupCloseCoordinator.Contr
|
||||
|
||||
// If we have a default size, we want to apply it.
|
||||
if let defaultSize {
|
||||
switch (defaultSize) {
|
||||
switch defaultSize {
|
||||
case .frame:
|
||||
// Frames can be applied immediately
|
||||
defaultSize.apply(to: window)
|
||||
@@ -1071,7 +1071,7 @@ class TerminalController: BaseTerminalController, TabGroupCloseCoordinator.Contr
|
||||
// We don't run this logic in fullscreen because in fullscreen this will end up
|
||||
// removing the window and putting it into its own dedicated fullscreen, which is not
|
||||
// the expected or desired behavior of anyone I've found.
|
||||
if (!window.styleMask.contains(.fullScreen)) {
|
||||
if !window.styleMask.contains(.fullScreen) {
|
||||
// If we have more than 1 window in our tab group we know we're a new window.
|
||||
// Since Ghostty manages tabbing manually this will never be more than one
|
||||
// at this point in the AppKit lifecycle (we add to the group after this).
|
||||
@@ -1101,7 +1101,7 @@ class TerminalController: BaseTerminalController, TabGroupCloseCoordinator.Contr
|
||||
override func windowShouldClose(_ sender: NSWindow) -> Bool {
|
||||
tabGroupCloseCoordinator.windowShouldClose(sender) { [weak self] scope in
|
||||
guard let self else { return }
|
||||
switch (scope) {
|
||||
switch scope {
|
||||
case .tab: closeTab(nil)
|
||||
case .window:
|
||||
guard self.window?.isFirstWindowInTabGroup ?? false else { return }
|
||||
@@ -1430,23 +1430,23 @@ class TerminalController: BaseTerminalController, TabGroupCloseCoordinator.Contr
|
||||
let finalIndex: Int
|
||||
|
||||
// An index that is invalid is used to signal some special values.
|
||||
if (tabIndex <= 0) {
|
||||
if tabIndex <= 0 {
|
||||
guard let selectedWindow = tabGroup.selectedWindow else { return }
|
||||
guard let selectedIndex = tabbedWindows.firstIndex(where: { $0 == selectedWindow }) else { return }
|
||||
|
||||
if (tabIndex == GHOSTTY_GOTO_TAB_PREVIOUS.rawValue) {
|
||||
if (selectedIndex == 0) {
|
||||
if tabIndex == GHOSTTY_GOTO_TAB_PREVIOUS.rawValue {
|
||||
if selectedIndex == 0 {
|
||||
finalIndex = tabbedWindows.count - 1
|
||||
} else {
|
||||
finalIndex = selectedIndex - 1
|
||||
}
|
||||
} else if (tabIndex == GHOSTTY_GOTO_TAB_NEXT.rawValue) {
|
||||
if (selectedIndex == tabbedWindows.count - 1) {
|
||||
} else if tabIndex == GHOSTTY_GOTO_TAB_NEXT.rawValue {
|
||||
if selectedIndex == tabbedWindows.count - 1 {
|
||||
finalIndex = 0
|
||||
} else {
|
||||
finalIndex = selectedIndex + 1
|
||||
}
|
||||
} else if (tabIndex == GHOSTTY_GOTO_TAB_LAST.rawValue) {
|
||||
} else if tabIndex == GHOSTTY_GOTO_TAB_LAST.rawValue {
|
||||
finalIndex = tabbedWindows.count - 1
|
||||
} else {
|
||||
return
|
||||
|
||||
@@ -98,7 +98,7 @@ class TerminalWindowRestoration: NSObject, NSWindowRestoration {
|
||||
// no matter what. Note its safe to use "ghostty.config" directly here
|
||||
// because window restoration is only ever invoked on app start so we
|
||||
// don't have to deal with config reloads.
|
||||
if (appDelegate.ghostty.config.windowSaveState == "never") {
|
||||
if appDelegate.ghostty.config.windowSaveState == "never" {
|
||||
completionHandler(nil, nil)
|
||||
return
|
||||
}
|
||||
@@ -161,9 +161,9 @@ class TerminalWindowRestoration: NSObject, NSWindowRestoration {
|
||||
// For the first attempt, we schedule it immediately. Subsequent events wait a bit
|
||||
// so we don't just spin the CPU at 100%. Give up after some period of time.
|
||||
let after: DispatchTime
|
||||
if (attempts == 0) {
|
||||
if attempts == 0 {
|
||||
after = .now()
|
||||
} else if (attempts > 40) {
|
||||
} else if attempts > 40 {
|
||||
// 2 seconds, give up
|
||||
return
|
||||
} else {
|
||||
@@ -185,7 +185,7 @@ class TerminalWindowRestoration: NSObject, NSWindowRestoration {
|
||||
// If the window is main, then we also make sure it comes forward. This
|
||||
// prevents a bug found in #1177 where sometimes on restore the windows
|
||||
// would be behind other applications.
|
||||
if (viewWindow.isMainWindow) {
|
||||
if viewWindow.isMainWindow {
|
||||
viewWindow.orderFront(nil)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -76,7 +76,7 @@ struct TerminalView<ViewModel: TerminalViewModel>: View {
|
||||
VStack(spacing: 0) {
|
||||
// If we're running in debug mode we show a warning so that users
|
||||
// know that performance will be degraded.
|
||||
if (Ghostty.info.mode == GHOSTTY_BUILD_MODE_DEBUG || Ghostty.info.mode == GHOSTTY_BUILD_MODE_RELEASE_SAFE) {
|
||||
if Ghostty.info.mode == GHOSTTY_BUILD_MODE_DEBUG || Ghostty.info.mode == GHOSTTY_BUILD_MODE_RELEASE_SAFE {
|
||||
DebugBuildWarningView()
|
||||
}
|
||||
|
||||
|
||||
@@ -112,7 +112,7 @@ class TerminalWindow: NSWindow {
|
||||
}
|
||||
|
||||
// If window decorations are disabled, remove our title
|
||||
if (!config.windowDecorations) { styleMask.remove(.titled) }
|
||||
if !config.windowDecorations { styleMask.remove(.titled) }
|
||||
|
||||
// Set our window positioning to coordinates if config value exists, otherwise
|
||||
// fallback to original centering behavior
|
||||
@@ -510,7 +510,7 @@ class TerminalWindow: NSWindow {
|
||||
private func setInitialWindowPosition(x: Int16?, y: Int16?) {
|
||||
// If we don't have an X/Y then we try to use the previously saved window pos.
|
||||
guard x != nil, y != nil else {
|
||||
if (!LastWindowPosition.shared.restore(self)) {
|
||||
if !LastWindowPosition.shared.restore(self) {
|
||||
center()
|
||||
}
|
||||
|
||||
|
||||
@@ -199,7 +199,7 @@ class TitlebarTabsTahoeTerminalWindow: TransparentTitlebarTerminalWindow, NSTool
|
||||
|
||||
// The padding for the tab bar. If we're showing window buttons then
|
||||
// we need to offset the window buttons.
|
||||
let leftPadding: CGFloat = switch(self.derivedConfig.macosWindowButtons) {
|
||||
let leftPadding: CGFloat = switch self.derivedConfig.macosWindowButtons {
|
||||
case .hidden: 0
|
||||
case .visible: 70
|
||||
}
|
||||
|
||||
@@ -159,7 +159,7 @@ class TitlebarTabsVenturaTerminalWindow: TerminalWindow {
|
||||
titlebarColor = derivedConfig.backgroundColor.withAlphaComponent(derivedConfig.backgroundOpacity)
|
||||
}
|
||||
|
||||
if (isOpaque || themeChanged) {
|
||||
if isOpaque || themeChanged {
|
||||
// If there is transparency, calling this will make the titlebar opaque
|
||||
// so we only call this if we are opaque.
|
||||
updateTabBar()
|
||||
@@ -359,7 +359,7 @@ class TitlebarTabsVenturaTerminalWindow: TerminalWindow {
|
||||
override func addTitlebarAccessoryViewController(_ childViewController: NSTitlebarAccessoryViewController) {
|
||||
let isTabBar = self.titlebarTabs && isTabBar(childViewController)
|
||||
|
||||
if (isTabBar) {
|
||||
if isTabBar {
|
||||
// Ensure it has the right layoutAttribute to force it next to our titlebar
|
||||
childViewController.layoutAttribute = .right
|
||||
|
||||
@@ -374,7 +374,7 @@ class TitlebarTabsVenturaTerminalWindow: TerminalWindow {
|
||||
|
||||
super.addTitlebarAccessoryViewController(childViewController)
|
||||
|
||||
if (isTabBar) {
|
||||
if isTabBar {
|
||||
pushTabsToTitlebar(childViewController)
|
||||
}
|
||||
}
|
||||
@@ -382,7 +382,7 @@ class TitlebarTabsVenturaTerminalWindow: TerminalWindow {
|
||||
override func removeTitlebarAccessoryViewController(at index: Int) {
|
||||
let isTabBar = titlebarAccessoryViewControllers[index].identifier == Self.tabBarIdentifier
|
||||
super.removeTitlebarAccessoryViewController(at: index)
|
||||
if (isTabBar) {
|
||||
if isTabBar {
|
||||
resetCustomTabBarViews()
|
||||
}
|
||||
}
|
||||
@@ -403,7 +403,7 @@ class TitlebarTabsVenturaTerminalWindow: TerminalWindow {
|
||||
|
||||
private func pushTabsToTitlebar(_ tabBarController: NSTitlebarAccessoryViewController) {
|
||||
// We need a toolbar as a target for our titlebar tabs.
|
||||
if (toolbar == nil) {
|
||||
if toolbar == nil {
|
||||
generateToolbar()
|
||||
}
|
||||
|
||||
@@ -509,7 +509,7 @@ class TitlebarTabsVenturaTerminalWindow: TerminalWindow {
|
||||
fileprivate class WindowDragView: NSView {
|
||||
override public func mouseDown(with event: NSEvent) {
|
||||
// Drag the window for single left clicks, double clicks should bypass the drag handle.
|
||||
if (event.type == .leftMouseDown && event.clickCount == 1) {
|
||||
if event.type == .leftMouseDown && event.clickCount == 1 {
|
||||
window?.performDrag(with: event)
|
||||
NSCursor.closedHand.set()
|
||||
} else {
|
||||
|
||||
@@ -10,7 +10,7 @@ extension UpdateDriver: SPUUpdaterDelegate {
|
||||
// Sparkle supports a native concept of "channels" but it requires that
|
||||
// you share a single appcast file. We don't want to do that so we
|
||||
// do this instead.
|
||||
switch (appDelegate.ghostty.config.autoUpdateChannel) {
|
||||
switch appDelegate.ghostty.config.autoUpdateChannel {
|
||||
case .tip: return "https://tip.files.ghostty.org/appcast.xml"
|
||||
case .stable: return "https://release.files.ghostty.org/appcast.xml"
|
||||
}
|
||||
|
||||
@@ -192,7 +192,7 @@ enum UpdateState: Equatable {
|
||||
|
||||
/// This is true if we're in a state that can be force installed.
|
||||
var isInstallable: Bool {
|
||||
switch (self) {
|
||||
switch self {
|
||||
case .checking,
|
||||
.updateAvailable,
|
||||
.downloading,
|
||||
@@ -339,7 +339,7 @@ enum UpdateState: Equatable {
|
||||
}
|
||||
|
||||
var label: String {
|
||||
switch (self) {
|
||||
switch self {
|
||||
case .commit: return "View GitHub Commit"
|
||||
case .compareTip: return "Changes Since This Tip Release"
|
||||
case .tagged: return "View Release Notes"
|
||||
|
||||
@@ -18,7 +18,7 @@ extension Ghostty.Action {
|
||||
}
|
||||
|
||||
init(c: ghostty_action_color_change_s) {
|
||||
switch (c.kind) {
|
||||
switch c.kind {
|
||||
case GHOSTTY_ACTION_COLOR_KIND_FOREGROUND:
|
||||
self.kind = .foreground
|
||||
case GHOSTTY_ACTION_COLOR_KIND_BACKGROUND:
|
||||
|
||||
@@ -140,7 +140,7 @@ extension Ghostty {
|
||||
guard let app = self.app else { return }
|
||||
|
||||
// Soft updates just call with our existing config
|
||||
if (soft) {
|
||||
if soft {
|
||||
ghostty_app_update_config(app, config.config!)
|
||||
return
|
||||
}
|
||||
@@ -158,7 +158,7 @@ extension Ghostty {
|
||||
|
||||
func reloadConfig(surface: ghostty_surface_t, soft: Bool = false) {
|
||||
// Soft updates just call with our existing config
|
||||
if (soft) {
|
||||
if soft {
|
||||
ghostty_surface_update_config(surface, config.config!)
|
||||
return
|
||||
}
|
||||
@@ -183,14 +183,14 @@ extension Ghostty {
|
||||
|
||||
func newTab(surface: ghostty_surface_t) {
|
||||
let action = "new_tab"
|
||||
if (!ghostty_surface_binding_action(surface, action, UInt(action.lengthOfBytes(using: .utf8)))) {
|
||||
if !ghostty_surface_binding_action(surface, action, UInt(action.lengthOfBytes(using: .utf8))) {
|
||||
logger.warning("action failed action=\(action)")
|
||||
}
|
||||
}
|
||||
|
||||
func newWindow(surface: ghostty_surface_t) {
|
||||
let action = "new_window"
|
||||
if (!ghostty_surface_binding_action(surface, action, UInt(action.lengthOfBytes(using: .utf8)))) {
|
||||
if !ghostty_surface_binding_action(surface, action, UInt(action.lengthOfBytes(using: .utf8))) {
|
||||
logger.warning("action failed action=\(action)")
|
||||
}
|
||||
}
|
||||
@@ -213,14 +213,14 @@ extension Ghostty {
|
||||
|
||||
func splitToggleZoom(surface: ghostty_surface_t) {
|
||||
let action = "toggle_split_zoom"
|
||||
if (!ghostty_surface_binding_action(surface, action, UInt(action.lengthOfBytes(using: .utf8)))) {
|
||||
if !ghostty_surface_binding_action(surface, action, UInt(action.lengthOfBytes(using: .utf8))) {
|
||||
logger.warning("action failed action=\(action)")
|
||||
}
|
||||
}
|
||||
|
||||
func toggleFullscreen(surface: ghostty_surface_t) {
|
||||
let action = "toggle_fullscreen"
|
||||
if (!ghostty_surface_binding_action(surface, action, UInt(action.lengthOfBytes(using: .utf8)))) {
|
||||
if !ghostty_surface_binding_action(surface, action, UInt(action.lengthOfBytes(using: .utf8))) {
|
||||
logger.warning("action failed action=\(action)")
|
||||
}
|
||||
}
|
||||
@@ -241,21 +241,21 @@ extension Ghostty {
|
||||
case .reset:
|
||||
action = "reset_font_size"
|
||||
}
|
||||
if (!ghostty_surface_binding_action(surface, action, UInt(action.lengthOfBytes(using: .utf8)))) {
|
||||
if !ghostty_surface_binding_action(surface, action, UInt(action.lengthOfBytes(using: .utf8))) {
|
||||
logger.warning("action failed action=\(action)")
|
||||
}
|
||||
}
|
||||
|
||||
func toggleTerminalInspector(surface: ghostty_surface_t) {
|
||||
let action = "inspector:toggle"
|
||||
if (!ghostty_surface_binding_action(surface, action, UInt(action.lengthOfBytes(using: .utf8)))) {
|
||||
if !ghostty_surface_binding_action(surface, action, UInt(action.lengthOfBytes(using: .utf8))) {
|
||||
logger.warning("action failed action=\(action)")
|
||||
}
|
||||
}
|
||||
|
||||
func resetTerminal(surface: ghostty_surface_t) {
|
||||
let action = "reset"
|
||||
if (!ghostty_surface_binding_action(surface, action, UInt(action.lengthOfBytes(using: .utf8)))) {
|
||||
if !ghostty_surface_binding_action(surface, action, UInt(action.lengthOfBytes(using: .utf8))) {
|
||||
logger.warning("action failed action=\(action)")
|
||||
}
|
||||
}
|
||||
@@ -463,7 +463,7 @@ extension Ghostty {
|
||||
|
||||
static func action(_ app: ghostty_app_t, target: ghostty_target_s, action: ghostty_action_s) -> Bool {
|
||||
// Make sure it a target we understand so all our action handlers can assert
|
||||
switch (target.tag) {
|
||||
switch target.tag {
|
||||
case GHOSTTY_TARGET_APP, GHOSTTY_TARGET_SURFACE:
|
||||
break
|
||||
|
||||
@@ -473,7 +473,7 @@ extension Ghostty {
|
||||
}
|
||||
|
||||
// Action dispatch
|
||||
switch (action.tag) {
|
||||
switch action.tag {
|
||||
case GHOSTTY_ACTION_QUIT:
|
||||
quit(app)
|
||||
|
||||
@@ -722,7 +722,7 @@ extension Ghostty {
|
||||
|
||||
private static func undo(_ app: ghostty_app_t, target: ghostty_target_s) -> Bool {
|
||||
let undoManager: UndoManager?
|
||||
switch (target.tag) {
|
||||
switch target.tag {
|
||||
case GHOSTTY_TARGET_APP:
|
||||
undoManager = (NSApp.delegate as? AppDelegate)?.undoManager
|
||||
|
||||
@@ -743,7 +743,7 @@ extension Ghostty {
|
||||
|
||||
private static func redo(_ app: ghostty_app_t, target: ghostty_target_s) -> Bool {
|
||||
let undoManager: UndoManager?
|
||||
switch (target.tag) {
|
||||
switch target.tag {
|
||||
case GHOSTTY_TARGET_APP:
|
||||
undoManager = (NSApp.delegate as? AppDelegate)?.undoManager
|
||||
|
||||
@@ -763,7 +763,7 @@ extension Ghostty {
|
||||
}
|
||||
|
||||
private static func newWindow(_ app: ghostty_app_t, target: ghostty_target_s) {
|
||||
switch (target.tag) {
|
||||
switch target.tag {
|
||||
case GHOSTTY_TARGET_APP:
|
||||
NotificationCenter.default.post(
|
||||
name: Notification.ghosttyNewWindow,
|
||||
@@ -789,7 +789,7 @@ extension Ghostty {
|
||||
}
|
||||
|
||||
private static func newTab(_ app: ghostty_app_t, target: ghostty_target_s) {
|
||||
switch (target.tag) {
|
||||
switch target.tag {
|
||||
case GHOSTTY_TARGET_APP:
|
||||
NotificationCenter.default.post(
|
||||
name: Notification.ghosttyNewTab,
|
||||
@@ -829,7 +829,7 @@ extension Ghostty {
|
||||
_ app: ghostty_app_t,
|
||||
target: ghostty_target_s,
|
||||
direction: ghostty_action_split_direction_e) {
|
||||
switch (target.tag) {
|
||||
switch target.tag {
|
||||
case GHOSTTY_TARGET_APP:
|
||||
// New split does nothing with an app target
|
||||
Ghostty.logger.warning("new split does nothing with an app target")
|
||||
@@ -858,7 +858,7 @@ extension Ghostty {
|
||||
_ app: ghostty_app_t,
|
||||
target: ghostty_target_s
|
||||
) -> Bool {
|
||||
switch (target.tag) {
|
||||
switch target.tag {
|
||||
case GHOSTTY_TARGET_APP:
|
||||
return false
|
||||
|
||||
@@ -879,7 +879,7 @@ extension Ghostty {
|
||||
}
|
||||
|
||||
private static func closeTab(_ app: ghostty_app_t, target: ghostty_target_s, mode: ghostty_action_close_tab_mode_e) {
|
||||
switch (target.tag) {
|
||||
switch target.tag {
|
||||
case GHOSTTY_TARGET_APP:
|
||||
Ghostty.logger.warning("close tabs does nothing with an app target")
|
||||
return
|
||||
@@ -888,7 +888,7 @@ extension Ghostty {
|
||||
guard let surface = target.target.surface else { return }
|
||||
guard let surfaceView = self.surfaceView(from: surface) else { return }
|
||||
|
||||
switch (mode) {
|
||||
switch mode {
|
||||
case GHOSTTY_ACTION_CLOSE_TAB_MODE_THIS:
|
||||
NotificationCenter.default.post(
|
||||
name: .ghosttyCloseTab,
|
||||
@@ -921,7 +921,7 @@ extension Ghostty {
|
||||
}
|
||||
|
||||
private static func closeWindow(_ app: ghostty_app_t, target: ghostty_target_s) {
|
||||
switch (target.tag) {
|
||||
switch target.tag {
|
||||
case GHOSTTY_TARGET_APP:
|
||||
Ghostty.logger.warning("close window does nothing with an app target")
|
||||
return
|
||||
@@ -949,7 +949,7 @@ extension Ghostty {
|
||||
_ app: ghostty_app_t,
|
||||
target: ghostty_target_s,
|
||||
mode raw: ghostty_action_fullscreen_e) {
|
||||
switch (target.tag) {
|
||||
switch target.tag {
|
||||
case GHOSTTY_TARGET_APP:
|
||||
Ghostty.logger.warning("toggle fullscreen does nothing with an app target")
|
||||
return
|
||||
@@ -978,7 +978,7 @@ extension Ghostty {
|
||||
private static func toggleCommandPalette(
|
||||
_ app: ghostty_app_t,
|
||||
target: ghostty_target_s) {
|
||||
switch (target.tag) {
|
||||
switch target.tag {
|
||||
case GHOSTTY_TARGET_APP:
|
||||
Ghostty.logger.warning("toggle command palette does nothing with an app target")
|
||||
return
|
||||
@@ -1001,7 +1001,7 @@ extension Ghostty {
|
||||
_ app: ghostty_app_t,
|
||||
target: ghostty_target_s
|
||||
) {
|
||||
switch (target.tag) {
|
||||
switch target.tag {
|
||||
case GHOSTTY_TARGET_APP:
|
||||
Ghostty.logger.warning("toggle maximize does nothing with an app target")
|
||||
return
|
||||
@@ -1031,7 +1031,7 @@ extension Ghostty {
|
||||
private static func ringBell(
|
||||
_ app: ghostty_app_t,
|
||||
target: ghostty_target_s) {
|
||||
switch (target.tag) {
|
||||
switch target.tag {
|
||||
case GHOSTTY_TARGET_APP:
|
||||
// Technically we could still request app attention here but there
|
||||
// are no known cases where the bell is rang with an app target so
|
||||
@@ -1056,7 +1056,7 @@ extension Ghostty {
|
||||
_ app: ghostty_app_t,
|
||||
target: ghostty_target_s,
|
||||
v: ghostty_action_readonly_e) {
|
||||
switch (target.tag) {
|
||||
switch target.tag {
|
||||
case GHOSTTY_TARGET_APP:
|
||||
Ghostty.logger.warning("set readonly does nothing with an app target")
|
||||
return
|
||||
@@ -1081,7 +1081,7 @@ extension Ghostty {
|
||||
_ app: ghostty_app_t,
|
||||
target: ghostty_target_s,
|
||||
move: ghostty_action_move_tab_s) -> Bool {
|
||||
switch (target.tag) {
|
||||
switch target.tag {
|
||||
case GHOSTTY_TARGET_APP:
|
||||
Ghostty.logger.warning("move tab does nothing with an app target")
|
||||
return false
|
||||
@@ -1112,7 +1112,7 @@ extension Ghostty {
|
||||
_ app: ghostty_app_t,
|
||||
target: ghostty_target_s,
|
||||
tab: ghostty_action_goto_tab_e) -> Bool {
|
||||
switch (target.tag) {
|
||||
switch target.tag {
|
||||
case GHOSTTY_TARGET_APP:
|
||||
Ghostty.logger.warning("goto tab does nothing with an app target")
|
||||
return false
|
||||
@@ -1144,7 +1144,7 @@ extension Ghostty {
|
||||
_ app: ghostty_app_t,
|
||||
target: ghostty_target_s,
|
||||
direction: ghostty_action_goto_split_e) -> Bool {
|
||||
switch (target.tag) {
|
||||
switch target.tag {
|
||||
case GHOSTTY_TARGET_APP:
|
||||
Ghostty.logger.warning("goto split does nothing with an app target")
|
||||
return false
|
||||
@@ -1250,7 +1250,7 @@ extension Ghostty {
|
||||
_ app: ghostty_app_t,
|
||||
target: ghostty_target_s,
|
||||
resize: ghostty_action_resize_split_s) -> Bool {
|
||||
switch (target.tag) {
|
||||
switch target.tag {
|
||||
case GHOSTTY_TARGET_APP:
|
||||
Ghostty.logger.warning("resize split does nothing with an app target")
|
||||
return false
|
||||
@@ -1283,7 +1283,7 @@ extension Ghostty {
|
||||
private static func equalizeSplits(
|
||||
_ app: ghostty_app_t,
|
||||
target: ghostty_target_s) {
|
||||
switch (target.tag) {
|
||||
switch target.tag {
|
||||
case GHOSTTY_TARGET_APP:
|
||||
Ghostty.logger.warning("equalize splits does nothing with an app target")
|
||||
return
|
||||
@@ -1305,7 +1305,7 @@ extension Ghostty {
|
||||
private static func toggleSplitZoom(
|
||||
_ app: ghostty_app_t,
|
||||
target: ghostty_target_s) -> Bool {
|
||||
switch (target.tag) {
|
||||
switch target.tag {
|
||||
case GHOSTTY_TARGET_APP:
|
||||
Ghostty.logger.warning("toggle split zoom does nothing with an app target")
|
||||
return false
|
||||
@@ -1335,7 +1335,7 @@ extension Ghostty {
|
||||
_ app: ghostty_app_t,
|
||||
target: ghostty_target_s,
|
||||
mode: ghostty_action_inspector_e) {
|
||||
switch (target.tag) {
|
||||
switch target.tag {
|
||||
case GHOSTTY_TARGET_APP:
|
||||
Ghostty.logger.warning("toggle inspector does nothing with an app target")
|
||||
return
|
||||
@@ -1359,7 +1359,7 @@ extension Ghostty {
|
||||
_ app: ghostty_app_t,
|
||||
target: ghostty_target_s,
|
||||
n: ghostty_action_desktop_notification_s) {
|
||||
switch (target.tag) {
|
||||
switch target.tag {
|
||||
case GHOSTTY_TARGET_APP:
|
||||
Ghostty.logger.warning("toggle split zoom does nothing with an app target")
|
||||
return
|
||||
@@ -1395,7 +1395,7 @@ extension Ghostty {
|
||||
) {
|
||||
guard let mode = SetFloatWIndow.from(mode_raw) else { return }
|
||||
|
||||
switch (target.tag) {
|
||||
switch target.tag {
|
||||
case GHOSTTY_TARGET_APP:
|
||||
Ghostty.logger.warning("toggle float window does nothing with an app target")
|
||||
return
|
||||
@@ -1405,7 +1405,7 @@ extension Ghostty {
|
||||
guard let surfaceView = self.surfaceView(from: surface) else { return }
|
||||
guard let window = surfaceView.window as? TerminalWindow else { return }
|
||||
|
||||
switch (mode) {
|
||||
switch mode {
|
||||
case .on:
|
||||
window.level = .floating
|
||||
|
||||
@@ -1429,7 +1429,7 @@ extension Ghostty {
|
||||
_ app: ghostty_app_t,
|
||||
target: ghostty_target_s
|
||||
) {
|
||||
switch (target.tag) {
|
||||
switch target.tag {
|
||||
case GHOSTTY_TARGET_APP:
|
||||
Ghostty.logger.warning("toggle background opacity does nothing with an app target")
|
||||
return
|
||||
@@ -1453,7 +1453,7 @@ extension Ghostty {
|
||||
) {
|
||||
guard let mode = SetSecureInput.from(mode_raw) else { return }
|
||||
|
||||
switch (target.tag) {
|
||||
switch target.tag {
|
||||
case GHOSTTY_TARGET_APP:
|
||||
guard let appDelegate = NSApplication.shared.delegate as? AppDelegate else { return }
|
||||
appDelegate.setSecureInput(mode)
|
||||
@@ -1464,7 +1464,7 @@ extension Ghostty {
|
||||
guard let appState = self.appState(fromView: surfaceView) else { return }
|
||||
guard appState.config.autoSecureInput else { return }
|
||||
|
||||
switch (mode) {
|
||||
switch mode {
|
||||
case .on:
|
||||
surfaceView.passwordInput = true
|
||||
|
||||
@@ -1492,7 +1492,7 @@ extension Ghostty {
|
||||
_ app: ghostty_app_t,
|
||||
target: ghostty_target_s,
|
||||
v: ghostty_action_set_title_s) {
|
||||
switch (target.tag) {
|
||||
switch target.tag {
|
||||
case GHOSTTY_TARGET_APP:
|
||||
Ghostty.logger.warning("set title does nothing with an app target")
|
||||
return
|
||||
@@ -1511,7 +1511,7 @@ extension Ghostty {
|
||||
private static func copyTitleToClipboard(
|
||||
_ app: ghostty_app_t,
|
||||
target: ghostty_target_s) -> Bool {
|
||||
switch (target.tag) {
|
||||
switch target.tag {
|
||||
case GHOSTTY_TARGET_SURFACE:
|
||||
guard let surface = target.target.surface else { return false }
|
||||
guard let surfaceView = self.surfaceView(from: surface) else { return false }
|
||||
@@ -1534,7 +1534,7 @@ extension Ghostty {
|
||||
let promptTitle = Action.PromptTitle(v)
|
||||
switch promptTitle {
|
||||
case .surface:
|
||||
switch (target.tag) {
|
||||
switch target.tag {
|
||||
case GHOSTTY_TARGET_APP:
|
||||
Ghostty.logger.warning("set title prompt does nothing with an app target")
|
||||
return false
|
||||
@@ -1551,7 +1551,7 @@ extension Ghostty {
|
||||
}
|
||||
|
||||
case .tab:
|
||||
switch (target.tag) {
|
||||
switch target.tag {
|
||||
case GHOSTTY_TARGET_APP:
|
||||
guard let window = NSApp.mainWindow ?? NSApp.keyWindow,
|
||||
let controller = window.windowController as? BaseTerminalController
|
||||
@@ -1579,7 +1579,7 @@ extension Ghostty {
|
||||
_ app: ghostty_app_t,
|
||||
target: ghostty_target_s,
|
||||
v: ghostty_action_pwd_s) {
|
||||
switch (target.tag) {
|
||||
switch target.tag {
|
||||
case GHOSTTY_TARGET_APP:
|
||||
Ghostty.logger.warning("pwd change does nothing with an app target")
|
||||
return
|
||||
@@ -1599,7 +1599,7 @@ extension Ghostty {
|
||||
_ app: ghostty_app_t,
|
||||
target: ghostty_target_s,
|
||||
shape: ghostty_action_mouse_shape_e) {
|
||||
switch (target.tag) {
|
||||
switch target.tag {
|
||||
case GHOSTTY_TARGET_APP:
|
||||
Ghostty.logger.warning("set mouse shapes nothing with an app target")
|
||||
return
|
||||
@@ -1619,7 +1619,7 @@ extension Ghostty {
|
||||
_ app: ghostty_app_t,
|
||||
target: ghostty_target_s,
|
||||
v: ghostty_action_mouse_visibility_e) {
|
||||
switch (target.tag) {
|
||||
switch target.tag {
|
||||
case GHOSTTY_TARGET_APP:
|
||||
Ghostty.logger.warning("set mouse shapes nothing with an app target")
|
||||
return
|
||||
@@ -1627,7 +1627,7 @@ extension Ghostty {
|
||||
case GHOSTTY_TARGET_SURFACE:
|
||||
guard let surface = target.target.surface else { return }
|
||||
guard let surfaceView = self.surfaceView(from: surface) else { return }
|
||||
switch (v) {
|
||||
switch v {
|
||||
case GHOSTTY_MOUSE_VISIBLE:
|
||||
surfaceView.setCursorVisibility(true)
|
||||
|
||||
@@ -1648,7 +1648,7 @@ extension Ghostty {
|
||||
_ app: ghostty_app_t,
|
||||
target: ghostty_target_s,
|
||||
v: ghostty_action_mouse_over_link_s) {
|
||||
switch (target.tag) {
|
||||
switch target.tag {
|
||||
case GHOSTTY_TARGET_APP:
|
||||
Ghostty.logger.warning("mouse over link does nothing with an app target")
|
||||
return
|
||||
@@ -1674,7 +1674,7 @@ extension Ghostty {
|
||||
_ app: ghostty_app_t,
|
||||
target: ghostty_target_s,
|
||||
v: ghostty_action_initial_size_s) {
|
||||
switch (target.tag) {
|
||||
switch target.tag {
|
||||
case GHOSTTY_TARGET_APP:
|
||||
Ghostty.logger.warning("initial size does nothing with an app target")
|
||||
return
|
||||
@@ -1693,7 +1693,7 @@ extension Ghostty {
|
||||
private static func resetWindowSize(
|
||||
_ app: ghostty_app_t,
|
||||
target: ghostty_target_s) {
|
||||
switch (target.tag) {
|
||||
switch target.tag {
|
||||
case GHOSTTY_TARGET_APP:
|
||||
Ghostty.logger.warning("reset window size does nothing with an app target")
|
||||
return
|
||||
@@ -1716,7 +1716,7 @@ extension Ghostty {
|
||||
_ app: ghostty_app_t,
|
||||
target: ghostty_target_s,
|
||||
v: ghostty_action_cell_size_s) {
|
||||
switch (target.tag) {
|
||||
switch target.tag {
|
||||
case GHOSTTY_TARGET_APP:
|
||||
Ghostty.logger.warning("mouse over link does nothing with an app target")
|
||||
return
|
||||
@@ -1738,7 +1738,7 @@ extension Ghostty {
|
||||
private static func renderInspector(
|
||||
_ app: ghostty_app_t,
|
||||
target: ghostty_target_s) {
|
||||
switch (target.tag) {
|
||||
switch target.tag {
|
||||
case GHOSTTY_TARGET_APP:
|
||||
Ghostty.logger.warning("mouse over link does nothing with an app target")
|
||||
return
|
||||
@@ -1760,7 +1760,7 @@ extension Ghostty {
|
||||
_ app: ghostty_app_t,
|
||||
target: ghostty_target_s,
|
||||
v: ghostty_action_renderer_health_e) {
|
||||
switch (target.tag) {
|
||||
switch target.tag {
|
||||
case GHOSTTY_TARGET_APP:
|
||||
Ghostty.logger.warning("mouse over link does nothing with an app target")
|
||||
return
|
||||
@@ -1785,7 +1785,7 @@ extension Ghostty {
|
||||
_ app: ghostty_app_t,
|
||||
target: ghostty_target_s,
|
||||
v: ghostty_action_key_sequence_s) {
|
||||
switch (target.tag) {
|
||||
switch target.tag {
|
||||
case GHOSTTY_TARGET_APP:
|
||||
Ghostty.logger.warning("key sequence does nothing with an app target")
|
||||
return
|
||||
@@ -1817,7 +1817,7 @@ extension Ghostty {
|
||||
_ app: ghostty_app_t,
|
||||
target: ghostty_target_s,
|
||||
v: ghostty_action_key_table_s) {
|
||||
switch (target.tag) {
|
||||
switch target.tag {
|
||||
case GHOSTTY_TARGET_APP:
|
||||
Ghostty.logger.warning("key table does nothing with an app target")
|
||||
return
|
||||
@@ -1842,7 +1842,7 @@ extension Ghostty {
|
||||
_ app: ghostty_app_t,
|
||||
target: ghostty_target_s,
|
||||
v: ghostty_action_progress_report_s) {
|
||||
switch (target.tag) {
|
||||
switch target.tag {
|
||||
case GHOSTTY_TARGET_APP:
|
||||
Ghostty.logger.warning("progress report does nothing with an app target")
|
||||
return
|
||||
@@ -1869,7 +1869,7 @@ extension Ghostty {
|
||||
_ app: ghostty_app_t,
|
||||
target: ghostty_target_s,
|
||||
v: ghostty_action_scrollbar_s) {
|
||||
switch (target.tag) {
|
||||
switch target.tag {
|
||||
case GHOSTTY_TARGET_APP:
|
||||
Ghostty.logger.warning("scrollbar does nothing with an app target")
|
||||
return
|
||||
@@ -1896,7 +1896,7 @@ extension Ghostty {
|
||||
_ app: ghostty_app_t,
|
||||
target: ghostty_target_s,
|
||||
v: ghostty_action_start_search_s) {
|
||||
switch (target.tag) {
|
||||
switch target.tag {
|
||||
case GHOSTTY_TARGET_APP:
|
||||
Ghostty.logger.warning("start_search does nothing with an app target")
|
||||
return
|
||||
@@ -1926,7 +1926,7 @@ extension Ghostty {
|
||||
private static func endSearch(
|
||||
_ app: ghostty_app_t,
|
||||
target: ghostty_target_s) {
|
||||
switch (target.tag) {
|
||||
switch target.tag {
|
||||
case GHOSTTY_TARGET_APP:
|
||||
Ghostty.logger.warning("end_search does nothing with an app target")
|
||||
return
|
||||
@@ -1948,7 +1948,7 @@ extension Ghostty {
|
||||
_ app: ghostty_app_t,
|
||||
target: ghostty_target_s,
|
||||
v: ghostty_action_search_total_s) {
|
||||
switch (target.tag) {
|
||||
switch target.tag {
|
||||
case GHOSTTY_TARGET_APP:
|
||||
Ghostty.logger.warning("search_total does nothing with an app target")
|
||||
return
|
||||
@@ -1971,7 +1971,7 @@ extension Ghostty {
|
||||
_ app: ghostty_app_t,
|
||||
target: ghostty_target_s,
|
||||
v: ghostty_action_search_selected_s) {
|
||||
switch (target.tag) {
|
||||
switch target.tag {
|
||||
case GHOSTTY_TARGET_APP:
|
||||
Ghostty.logger.warning("search_selected does nothing with an app target")
|
||||
return
|
||||
@@ -2000,7 +2000,7 @@ extension Ghostty {
|
||||
guard let app_ud = ghostty_app_userdata(app) else { return }
|
||||
let ghostty = Unmanaged<App>.fromOpaque(app_ud).takeUnretainedValue()
|
||||
|
||||
switch (target.tag) {
|
||||
switch target.tag {
|
||||
case GHOSTTY_TARGET_APP:
|
||||
ghostty.reloadConfig(soft: v.soft)
|
||||
return
|
||||
@@ -2026,7 +2026,7 @@ extension Ghostty {
|
||||
// something so apprt's do not have to do this.
|
||||
let config = Config(clone: v.config)
|
||||
|
||||
switch (target.tag) {
|
||||
switch target.tag {
|
||||
case GHOSTTY_TARGET_APP:
|
||||
// Notify the world that the app config changed
|
||||
NotificationCenter.default.post(
|
||||
@@ -2066,7 +2066,7 @@ extension Ghostty {
|
||||
_ app: ghostty_app_t,
|
||||
target: ghostty_target_s,
|
||||
change: ghostty_action_color_change_s) {
|
||||
switch (target.tag) {
|
||||
switch target.tag {
|
||||
case GHOSTTY_TARGET_APP:
|
||||
Ghostty.logger.warning("color change does nothing with an app target")
|
||||
return
|
||||
@@ -2097,7 +2097,7 @@ extension Ghostty {
|
||||
let uuid = UUID(uuidString: uuidString),
|
||||
let surface = delegate?.findSurface(forUUID: uuid) else { return }
|
||||
|
||||
switch (response.actionIdentifier) {
|
||||
switch response.actionIdentifier {
|
||||
case UNNotificationDefaultActionIdentifier, Ghostty.userNotificationActionShow:
|
||||
// The user clicked on a notification
|
||||
surface.handleUserNotification(notification: response.notification, focus: true)
|
||||
|
||||
@@ -427,7 +427,7 @@ extension Ghostty {
|
||||
var backgroundColor: Color {
|
||||
var color: ghostty_config_color_s = .init();
|
||||
let bg_key = "background"
|
||||
if (!ghostty_config_get(config, &color, bg_key, UInt(bg_key.lengthOfBytes(using: .utf8)))) {
|
||||
if !ghostty_config_get(config, &color, bg_key, UInt(bg_key.lengthOfBytes(using: .utf8))) {
|
||||
#if os(macOS)
|
||||
return Color(NSColor.windowBackgroundColor)
|
||||
#elseif os(iOS)
|
||||
@@ -473,7 +473,7 @@ extension Ghostty {
|
||||
|
||||
var color: ghostty_config_color_s = .init();
|
||||
let key = "unfocused-split-fill"
|
||||
if (!ghostty_config_get(config, &color, key, UInt(key.lengthOfBytes(using: .utf8)))) {
|
||||
if !ghostty_config_get(config, &color, key, UInt(key.lengthOfBytes(using: .utf8))) {
|
||||
let bg_key = "background"
|
||||
_ = ghostty_config_get(config, &color, bg_key, UInt(bg_key.lengthOfBytes(using: .utf8)));
|
||||
}
|
||||
@@ -494,7 +494,7 @@ extension Ghostty {
|
||||
|
||||
var color: ghostty_config_color_s = .init();
|
||||
let key = "split-divider-color"
|
||||
if (!ghostty_config_get(config, &color, key, UInt(key.lengthOfBytes(using: .utf8)))) {
|
||||
if !ghostty_config_get(config, &color, key, UInt(key.lengthOfBytes(using: .utf8))) {
|
||||
return Color(newColor)
|
||||
}
|
||||
|
||||
@@ -801,28 +801,28 @@ extension Ghostty.Config {
|
||||
case bottom_right = "bottom-right"
|
||||
|
||||
func top() -> Bool {
|
||||
switch (self) {
|
||||
switch self {
|
||||
case .top_left, .top_center, .top_right: return true;
|
||||
default: return false;
|
||||
}
|
||||
}
|
||||
|
||||
func bottom() -> Bool {
|
||||
switch (self) {
|
||||
switch self {
|
||||
case .bottom_left, .bottom_center, .bottom_right: return true;
|
||||
default: return false;
|
||||
}
|
||||
}
|
||||
|
||||
func left() -> Bool {
|
||||
switch (self) {
|
||||
switch self {
|
||||
case .top_left, .bottom_left: return true;
|
||||
default: return false;
|
||||
}
|
||||
}
|
||||
|
||||
func right() -> Bool {
|
||||
switch (self) {
|
||||
switch self {
|
||||
case .top_right, .bottom_right: return true;
|
||||
default: return false;
|
||||
}
|
||||
|
||||
@@ -18,7 +18,7 @@ extension Ghostty {
|
||||
/// be used for things like NSMenu that only support keyboard shortcuts anyways.
|
||||
static func keyboardShortcut(for trigger: ghostty_input_trigger_s) -> KeyboardShortcut? {
|
||||
let key: KeyEquivalent
|
||||
switch (trigger.tag) {
|
||||
switch trigger.tag {
|
||||
case GHOSTTY_TRIGGER_PHYSICAL:
|
||||
// Only functional keys can be converted to a KeyboardShortcut. Other physical
|
||||
// mappings cannot because KeyboardShortcut in Swift is inherently layout-dependent.
|
||||
@@ -50,10 +50,10 @@ extension Ghostty {
|
||||
/// Returns the event modifier flags set for the Ghostty mods enum.
|
||||
static func eventModifierFlags(mods: ghostty_input_mods_e) -> NSEvent.ModifierFlags {
|
||||
var flags = NSEvent.ModifierFlags(rawValue: 0);
|
||||
if (mods.rawValue & GHOSTTY_MODS_SHIFT.rawValue != 0) { flags.insert(.shift) }
|
||||
if (mods.rawValue & GHOSTTY_MODS_CTRL.rawValue != 0) { flags.insert(.control) }
|
||||
if (mods.rawValue & GHOSTTY_MODS_ALT.rawValue != 0) { flags.insert(.option) }
|
||||
if (mods.rawValue & GHOSTTY_MODS_SUPER.rawValue != 0) { flags.insert(.command) }
|
||||
if mods.rawValue & GHOSTTY_MODS_SHIFT.rawValue != 0 { flags.insert(.shift) }
|
||||
if mods.rawValue & GHOSTTY_MODS_CTRL.rawValue != 0 { flags.insert(.control) }
|
||||
if mods.rawValue & GHOSTTY_MODS_ALT.rawValue != 0 { flags.insert(.option) }
|
||||
if mods.rawValue & GHOSTTY_MODS_SUPER.rawValue != 0 { flags.insert(.command) }
|
||||
return flags
|
||||
}
|
||||
|
||||
@@ -61,19 +61,19 @@ extension Ghostty {
|
||||
static func ghosttyMods(_ flags: NSEvent.ModifierFlags) -> ghostty_input_mods_e {
|
||||
var mods: UInt32 = GHOSTTY_MODS_NONE.rawValue
|
||||
|
||||
if (flags.contains(.shift)) { mods |= GHOSTTY_MODS_SHIFT.rawValue }
|
||||
if (flags.contains(.control)) { mods |= GHOSTTY_MODS_CTRL.rawValue }
|
||||
if (flags.contains(.option)) { mods |= GHOSTTY_MODS_ALT.rawValue }
|
||||
if (flags.contains(.command)) { mods |= GHOSTTY_MODS_SUPER.rawValue }
|
||||
if (flags.contains(.capsLock)) { mods |= GHOSTTY_MODS_CAPS.rawValue }
|
||||
if flags.contains(.shift) { mods |= GHOSTTY_MODS_SHIFT.rawValue }
|
||||
if flags.contains(.control) { mods |= GHOSTTY_MODS_CTRL.rawValue }
|
||||
if flags.contains(.option) { mods |= GHOSTTY_MODS_ALT.rawValue }
|
||||
if flags.contains(.command) { mods |= GHOSTTY_MODS_SUPER.rawValue }
|
||||
if flags.contains(.capsLock) { mods |= GHOSTTY_MODS_CAPS.rawValue }
|
||||
|
||||
// Handle sided input. We can't tell that both are pressed in the
|
||||
// Ghostty structure but that's okay -- we don't use that information.
|
||||
let rawFlags = flags.rawValue
|
||||
if (rawFlags & UInt(NX_DEVICERSHIFTKEYMASK) != 0) { mods |= GHOSTTY_MODS_SHIFT_RIGHT.rawValue }
|
||||
if (rawFlags & UInt(NX_DEVICERCTLKEYMASK) != 0) { mods |= GHOSTTY_MODS_CTRL_RIGHT.rawValue }
|
||||
if (rawFlags & UInt(NX_DEVICERALTKEYMASK) != 0) { mods |= GHOSTTY_MODS_ALT_RIGHT.rawValue }
|
||||
if (rawFlags & UInt(NX_DEVICERCMDKEYMASK) != 0) { mods |= GHOSTTY_MODS_SUPER_RIGHT.rawValue }
|
||||
if rawFlags & UInt(NX_DEVICERSHIFTKEYMASK) != 0 { mods |= GHOSTTY_MODS_SHIFT_RIGHT.rawValue }
|
||||
if rawFlags & UInt(NX_DEVICERCTLKEYMASK) != 0 { mods |= GHOSTTY_MODS_CTRL_RIGHT.rawValue }
|
||||
if rawFlags & UInt(NX_DEVICERALTKEYMASK) != 0 { mods |= GHOSTTY_MODS_ALT_RIGHT.rawValue }
|
||||
if rawFlags & UInt(NX_DEVICERCMDKEYMASK) != 0 { mods |= GHOSTTY_MODS_SUPER_RIGHT.rawValue }
|
||||
|
||||
return ghostty_input_mods_e(mods)
|
||||
}
|
||||
|
||||
@@ -40,7 +40,7 @@ extension Ghostty {
|
||||
@MainActor
|
||||
func sendText(_ text: String) {
|
||||
let len = text.utf8CString.count
|
||||
if (len == 0) { return }
|
||||
if len == 0 { return }
|
||||
|
||||
text.withCString { ptr in
|
||||
// len includes the null terminator so we do len - 1
|
||||
@@ -149,7 +149,7 @@ extension Ghostty {
|
||||
@MainActor
|
||||
func perform(action: String) -> Bool {
|
||||
let len = action.utf8CString.count
|
||||
if (len == 0) { return false }
|
||||
if len == 0 { return false }
|
||||
return action.withCString { cString in
|
||||
ghostty_surface_binding_action(surface, cString, UInt(len - 1))
|
||||
}
|
||||
|
||||
@@ -100,7 +100,7 @@ extension Ghostty {
|
||||
case toggle
|
||||
|
||||
static func from(_ c: ghostty_action_float_window_e) -> Self? {
|
||||
switch (c) {
|
||||
switch c {
|
||||
case GHOSTTY_FLOAT_WINDOW_ON:
|
||||
return .on
|
||||
|
||||
@@ -122,7 +122,7 @@ extension Ghostty {
|
||||
case toggle
|
||||
|
||||
static func from(_ c: ghostty_action_secure_input_e) -> Self? {
|
||||
switch (c) {
|
||||
switch c {
|
||||
case GHOSTTY_SECURE_INPUT_ON:
|
||||
return .on
|
||||
|
||||
@@ -144,7 +144,7 @@ extension Ghostty {
|
||||
|
||||
/// Initialize from a Ghostty API enum.
|
||||
static func from(direction: ghostty_action_goto_split_e) -> Self? {
|
||||
switch (direction) {
|
||||
switch direction {
|
||||
case GHOSTTY_GOTO_SPLIT_PREVIOUS:
|
||||
return .previous
|
||||
|
||||
@@ -169,7 +169,7 @@ extension Ghostty {
|
||||
}
|
||||
|
||||
func toNative() -> ghostty_action_goto_split_e {
|
||||
switch (self) {
|
||||
switch self {
|
||||
case .previous:
|
||||
return GHOSTTY_GOTO_SPLIT_PREVIOUS
|
||||
|
||||
@@ -196,7 +196,7 @@ extension Ghostty {
|
||||
case up, down, left, right
|
||||
|
||||
static func from(direction: ghostty_action_resize_split_direction_e) -> Self? {
|
||||
switch (direction) {
|
||||
switch direction {
|
||||
case GHOSTTY_RESIZE_SPLIT_UP:
|
||||
return .up;
|
||||
case GHOSTTY_RESIZE_SPLIT_DOWN:
|
||||
@@ -211,7 +211,7 @@ extension Ghostty {
|
||||
}
|
||||
|
||||
func toNative() -> ghostty_action_resize_split_direction_e {
|
||||
switch (self) {
|
||||
switch self {
|
||||
case .up:
|
||||
return GHOSTTY_RESIZE_SPLIT_UP;
|
||||
case .down:
|
||||
@@ -268,7 +268,7 @@ extension Ghostty {
|
||||
|
||||
/// The text to show in the clipboard confirmation prompt for a given request type
|
||||
func text() -> String {
|
||||
switch (self) {
|
||||
switch self {
|
||||
case .paste:
|
||||
return """
|
||||
Pasting this text to the terminal may be dangerous as it looks like some commands may be executed.
|
||||
@@ -287,7 +287,7 @@ extension Ghostty {
|
||||
}
|
||||
|
||||
static func from(request: ghostty_clipboard_request_e) -> ClipboardRequest? {
|
||||
switch (request) {
|
||||
switch request {
|
||||
case GHOSTTY_CLIPBOARD_REQUEST_PASTE:
|
||||
return .paste
|
||||
case GHOSTTY_CLIPBOARD_REQUEST_OSC_52_READ:
|
||||
|
||||
@@ -23,7 +23,7 @@ extension Ghostty {
|
||||
let pubInspector = center.publisher(for: Notification.didControlInspector, object: surfaceView)
|
||||
|
||||
ZStack {
|
||||
if (!surfaceView.inspectorVisible) {
|
||||
if !surfaceView.inspectorVisible {
|
||||
SurfaceWrapper(surfaceView: surfaceView, isSplit: isSplit)
|
||||
} else {
|
||||
SplitView(.vertical, $split, dividerColor: ghostty.config.splitDividerColor, left: {
|
||||
@@ -42,7 +42,7 @@ extension Ghostty {
|
||||
.onChange(of: surfaceView.inspectorVisible) { inspectorVisible in
|
||||
// When we show the inspector, we want to focus on the inspector.
|
||||
// When we hide the inspector, we want to move focus back to the surface.
|
||||
if (inspectorVisible) {
|
||||
if inspectorVisible {
|
||||
// We need to delay this until SwiftUI shows the inspector.
|
||||
DispatchQueue.main.async {
|
||||
_ = surfaceView.resignFirstResponder()
|
||||
@@ -59,7 +59,7 @@ extension Ghostty {
|
||||
guard let modeAny = notification.userInfo?["mode"] else { return }
|
||||
guard let mode = modeAny as? ghostty_action_inspector_e else { return }
|
||||
|
||||
switch (mode) {
|
||||
switch mode {
|
||||
case GHOSTTY_INSPECTOR_TOGGLE:
|
||||
surfaceView.inspectorVisible = !surfaceView.inspectorVisible
|
||||
|
||||
@@ -180,7 +180,7 @@ extension Ghostty {
|
||||
|
||||
override func becomeFirstResponder() -> Bool {
|
||||
let result = super.becomeFirstResponder()
|
||||
if (result) {
|
||||
if result {
|
||||
if let inspector = self.inspector {
|
||||
inspector.setFocus(true)
|
||||
}
|
||||
@@ -190,7 +190,7 @@ extension Ghostty {
|
||||
|
||||
override func resignFirstResponder() -> Bool {
|
||||
let result = super.resignFirstResponder()
|
||||
if (result) {
|
||||
if result {
|
||||
if let inspector = self.inspector {
|
||||
inspector.setFocus(false)
|
||||
}
|
||||
@@ -275,7 +275,7 @@ extension Ghostty {
|
||||
|
||||
// Determine our momentum value
|
||||
var momentum: ghostty_input_mouse_momentum_e = GHOSTTY_MOUSE_MOMENTUM_NONE
|
||||
switch (event.momentumPhase) {
|
||||
switch event.momentumPhase {
|
||||
case .began:
|
||||
momentum = GHOSTTY_MOUSE_MOMENTUM_BEGAN
|
||||
case .stationary:
|
||||
@@ -310,7 +310,7 @@ extension Ghostty {
|
||||
|
||||
override func flagsChanged(with event: NSEvent) {
|
||||
let mod: UInt32;
|
||||
switch (event.keyCode) {
|
||||
switch event.keyCode {
|
||||
case 0x39: mod = GHOSTTY_MODS_CAPS.rawValue
|
||||
case 0x38, 0x3C: mod = GHOSTTY_MODS_SHIFT.rawValue
|
||||
case 0x3B, 0x3E: mod = GHOSTTY_MODS_CTRL.rawValue
|
||||
@@ -325,7 +325,7 @@ extension Ghostty {
|
||||
|
||||
// If the key that pressed this is active, its a press, else release
|
||||
var action = GHOSTTY_ACTION_RELEASE
|
||||
if (mods.rawValue & mod != 0) { action = GHOSTTY_ACTION_PRESS }
|
||||
if mods.rawValue & mod != 0 { action = GHOSTTY_ACTION_PRESS }
|
||||
|
||||
keyAction(action, event: event)
|
||||
}
|
||||
@@ -392,7 +392,7 @@ extension Ghostty {
|
||||
|
||||
// We want the string view of the any value
|
||||
var chars = ""
|
||||
switch (string) {
|
||||
switch string {
|
||||
case let v as NSAttributedString:
|
||||
chars = v.string
|
||||
case let v as String:
|
||||
@@ -402,7 +402,7 @@ extension Ghostty {
|
||||
}
|
||||
|
||||
let len = chars.utf8CString.count
|
||||
if (len == 0) { return }
|
||||
if len == 0 { return }
|
||||
|
||||
inspector.text(chars)
|
||||
}
|
||||
|
||||
@@ -84,7 +84,7 @@ extension Ghostty {
|
||||
.onReceive(pubResign) { notification in
|
||||
guard let window = notification.object as? NSWindow else { return }
|
||||
guard let surfaceWindow = surfaceView.window else { return }
|
||||
if (surfaceWindow == window) {
|
||||
if surfaceWindow == window {
|
||||
windowFocus = false
|
||||
}
|
||||
}
|
||||
@@ -177,10 +177,10 @@ extension Ghostty {
|
||||
#if canImport(AppKit)
|
||||
// If we have secure input enabled and we're the focused surface and window
|
||||
// then we want to show the secure input overlay.
|
||||
if (ghostty.config.secureInputIndication &&
|
||||
if ghostty.config.secureInputIndication &&
|
||||
secureInput.enabled &&
|
||||
surfaceFocus &&
|
||||
windowFocus) {
|
||||
windowFocus {
|
||||
SecureInputOverlay()
|
||||
}
|
||||
#endif
|
||||
@@ -200,7 +200,7 @@ extension Ghostty {
|
||||
}
|
||||
|
||||
// Show bell border if enabled
|
||||
if (ghostty.config.bellFeatures.contains(.border)) {
|
||||
if ghostty.config.bellFeatures.contains(.border) {
|
||||
BellBorderOverlay(bell: surfaceView.bell)
|
||||
}
|
||||
|
||||
@@ -208,10 +208,10 @@ extension Ghostty {
|
||||
HighlightOverlay(highlighted: surfaceView.highlighted)
|
||||
|
||||
// If our surface is not healthy, then we render an error view over it.
|
||||
if (!surfaceView.healthy) {
|
||||
if !surfaceView.healthy {
|
||||
Rectangle().fill(ghostty.config.backgroundColor)
|
||||
SurfaceRendererUnhealthyView()
|
||||
} else if (surfaceView.error != nil) {
|
||||
} else if surfaceView.error != nil {
|
||||
Rectangle().fill(ghostty.config.backgroundColor)
|
||||
SurfaceErrorView()
|
||||
}
|
||||
@@ -220,9 +220,9 @@ extension Ghostty {
|
||||
// rectangle above our view to make it look unfocused. We use "surfaceFocus"
|
||||
// because we want to keep our focused surface dark even if we don't have window
|
||||
// focus.
|
||||
if (isSplit && !surfaceFocus) {
|
||||
if isSplit && !surfaceFocus {
|
||||
let overlayOpacity = ghostty.config.unfocusedSplitOpacity;
|
||||
if (overlayOpacity > 0) {
|
||||
if overlayOpacity > 0 {
|
||||
Rectangle()
|
||||
.fill(ghostty.config.unfocusedSplitFill)
|
||||
.allowsHitTesting(false)
|
||||
@@ -312,16 +312,16 @@ extension Ghostty {
|
||||
// This computed boolean is set to true when the overlay should be hidden.
|
||||
private var hidden: Bool {
|
||||
// If we aren't ready yet then we wait...
|
||||
if (!ready) { return true; }
|
||||
if !ready { return true; }
|
||||
|
||||
// Hidden if we already processed this size.
|
||||
if (lastSize == geoSize) { return true; }
|
||||
if lastSize == geoSize { return true; }
|
||||
|
||||
// If we were focused recently we hide it as well. This avoids showing
|
||||
// the resize overlay when SwiftUI is lazily resizing.
|
||||
if let instant = focusInstant {
|
||||
let d = instant.duration(to: ContinuousClock.now)
|
||||
if (d < .milliseconds(500)) {
|
||||
if d < .milliseconds(500) {
|
||||
// Avoid this size completely. We can't set values during
|
||||
// view updates so we have to defer this to another tick.
|
||||
DispatchQueue.main.async {
|
||||
@@ -333,7 +333,7 @@ extension Ghostty {
|
||||
}
|
||||
|
||||
// Hidden depending on overlay config
|
||||
switch (overlay) {
|
||||
switch overlay {
|
||||
case .never: return true;
|
||||
case .always: return false;
|
||||
case .after_first: return lastSize == nil;
|
||||
@@ -342,12 +342,12 @@ extension Ghostty {
|
||||
|
||||
var body: some View {
|
||||
VStack {
|
||||
if (!position.top()) {
|
||||
if !position.top() {
|
||||
Spacer()
|
||||
}
|
||||
|
||||
HStack {
|
||||
if (!position.left()) {
|
||||
if !position.left() {
|
||||
Spacer()
|
||||
}
|
||||
|
||||
@@ -361,12 +361,12 @@ extension Ghostty {
|
||||
.lineLimit(1)
|
||||
.truncationMode(.tail)
|
||||
|
||||
if (!position.right()) {
|
||||
if !position.right() {
|
||||
Spacer()
|
||||
}
|
||||
}
|
||||
|
||||
if (!position.bottom()) {
|
||||
if !position.bottom() {
|
||||
Spacer()
|
||||
}
|
||||
}
|
||||
@@ -386,7 +386,7 @@ extension Ghostty {
|
||||
|
||||
// We only sleep if we're ready. If we're not ready then we want to set
|
||||
// our last size right away to avoid a flash.
|
||||
if (ready) {
|
||||
if ready {
|
||||
try? await Task.sleep(nanoseconds: UInt64(duration) * 1_000_000)
|
||||
}
|
||||
|
||||
|
||||
@@ -151,7 +151,7 @@ extension Ghostty {
|
||||
// We need to update our state within the SecureInput manager.
|
||||
let input = SecureInput.shared
|
||||
let id = ObjectIdentifier(self)
|
||||
if (passwordInput) {
|
||||
if passwordInput {
|
||||
input.setScoped(id, focused: focused)
|
||||
} else {
|
||||
input.removeScoped(id)
|
||||
@@ -183,7 +183,7 @@ extension Ghostty {
|
||||
// True if the inspector should be visible
|
||||
@Published var inspectorVisible: Bool = false {
|
||||
didSet {
|
||||
if (oldValue && !inspectorVisible) {
|
||||
if oldValue && !inspectorVisible {
|
||||
guard let surface = self.surface else { return }
|
||||
ghostty_inspector_free(surface)
|
||||
}
|
||||
@@ -431,11 +431,11 @@ extension Ghostty {
|
||||
ghostty_surface_set_focus(surface, focused)
|
||||
|
||||
// Update our secure input state if we are a password input
|
||||
if (passwordInput) {
|
||||
if passwordInput {
|
||||
SecureInput.shared.setScoped(ObjectIdentifier(self), focused: focused)
|
||||
}
|
||||
|
||||
if (focused) {
|
||||
if focused {
|
||||
// On macOS 13+ we can store our continuous clock...
|
||||
focusInstant = ContinuousClock.now
|
||||
|
||||
@@ -480,7 +480,7 @@ extension Ghostty {
|
||||
}
|
||||
|
||||
func setCursorShape(_ shape: ghostty_action_mouse_shape_e) {
|
||||
switch (shape) {
|
||||
switch shape {
|
||||
case GHOSTTY_MOUSE_SHAPE_DEFAULT:
|
||||
pointerStyle = .default
|
||||
|
||||
@@ -656,7 +656,7 @@ extension Ghostty {
|
||||
private func localEventKeyUp(_ event: NSEvent) -> NSEvent? {
|
||||
// We only care about events with "command" because all others will
|
||||
// trigger the normal responder chain.
|
||||
if (!event.modifierFlags.contains(.command)) { return event }
|
||||
if !event.modifierFlags.contains(.command) { return event }
|
||||
|
||||
// Command keyUp events are never sent to the normal responder chain
|
||||
// so we send them here.
|
||||
@@ -722,7 +722,7 @@ extension Ghostty {
|
||||
SwiftUI.Notification.Name.GhosttyColorChangeKey
|
||||
] as? Ghostty.Action.ColorChange else { return }
|
||||
|
||||
switch (change.kind) {
|
||||
switch change.kind {
|
||||
case .background:
|
||||
DispatchQueue.main.async { [weak self] in
|
||||
self?.backgroundColor = change.color
|
||||
@@ -767,7 +767,7 @@ extension Ghostty {
|
||||
|
||||
override func becomeFirstResponder() -> Bool {
|
||||
let result = super.becomeFirstResponder()
|
||||
if (result) { focusDidChange(true) }
|
||||
if result { focusDidChange(true) }
|
||||
return result
|
||||
}
|
||||
|
||||
@@ -776,7 +776,7 @@ extension Ghostty {
|
||||
|
||||
// We sometimes call this manually (see SplitView) as a way to force us to
|
||||
// yield our focus state.
|
||||
if (result) { focusDidChange(false) }
|
||||
if result { focusDidChange(false) }
|
||||
|
||||
return result
|
||||
}
|
||||
@@ -878,12 +878,12 @@ extension Ghostty {
|
||||
guard let surface = self.surface else { return super.rightMouseDown(with: event) }
|
||||
|
||||
let mods = Ghostty.ghosttyMods(event.modifierFlags)
|
||||
if (ghostty_surface_mouse_button(
|
||||
if ghostty_surface_mouse_button(
|
||||
surface,
|
||||
GHOSTTY_MOUSE_PRESS,
|
||||
GHOSTTY_MOUSE_RIGHT,
|
||||
mods
|
||||
)) {
|
||||
) {
|
||||
// Consumed
|
||||
return
|
||||
}
|
||||
@@ -896,12 +896,12 @@ extension Ghostty {
|
||||
guard let surface = self.surface else { return super.rightMouseUp(with: event) }
|
||||
|
||||
let mods = Ghostty.ghosttyMods(event.modifierFlags)
|
||||
if (ghostty_surface_mouse_button(
|
||||
if ghostty_surface_mouse_button(
|
||||
surface,
|
||||
GHOSTTY_MOUSE_RELEASE,
|
||||
GHOSTTY_MOUSE_RIGHT,
|
||||
mods
|
||||
)) {
|
||||
) {
|
||||
// Handled
|
||||
return
|
||||
}
|
||||
@@ -963,9 +963,9 @@ extension Ghostty {
|
||||
if let window,
|
||||
let controller = window.windowController as? BaseTerminalController,
|
||||
!controller.commandPaletteIsShowing,
|
||||
(window.isKeyWindow &&
|
||||
window.isKeyWindow &&
|
||||
!self.focused &&
|
||||
controller.focusFollowsMouse)
|
||||
controller.focusFollowsMouse
|
||||
{
|
||||
Ghostty.moveFocus(to: self)
|
||||
}
|
||||
@@ -1048,7 +1048,7 @@ extension Ghostty {
|
||||
// for exact states and set them.
|
||||
var translationMods = event.modifierFlags
|
||||
for flag in [NSEvent.ModifierFlags.shift, .control, .option, .command] {
|
||||
if (translationModsGhostty.contains(flag)) {
|
||||
if translationModsGhostty.contains(flag) {
|
||||
translationMods.insert(flag)
|
||||
} else {
|
||||
translationMods.remove(flag)
|
||||
@@ -1061,7 +1061,7 @@ extension Ghostty {
|
||||
// this keeps things like Korean input working. There must be some object
|
||||
// equality happening in AppKit somewhere because this is required.
|
||||
let translationEvent: NSEvent
|
||||
if (translationMods == event.modifierFlags) {
|
||||
if translationMods == event.modifierFlags {
|
||||
translationEvent = event
|
||||
} else {
|
||||
translationEvent = NSEvent.keyEvent(
|
||||
@@ -1093,7 +1093,7 @@ extension Ghostty {
|
||||
// We need to know the keyboard layout before below because some keyboard
|
||||
// input events will change our keyboard layout and we don't want those
|
||||
// going to the terminal.
|
||||
let keyboardIdBefore: String? = if (!markedTextBefore) {
|
||||
let keyboardIdBefore: String? = if !markedTextBefore {
|
||||
KeyboardLayout.id
|
||||
} else {
|
||||
nil
|
||||
@@ -1108,7 +1108,7 @@ extension Ghostty {
|
||||
|
||||
// If our keyboard changed from this we just assume an input method
|
||||
// grabbed it and do nothing.
|
||||
if (!markedTextBefore && keyboardIdBefore != KeyboardLayout.id) {
|
||||
if !markedTextBefore && keyboardIdBefore != KeyboardLayout.id {
|
||||
return
|
||||
}
|
||||
|
||||
@@ -1192,7 +1192,7 @@ extension Ghostty {
|
||||
// Besides C-/, its important we don't process key equivalents if unfocused
|
||||
// because there are other event listeners for that (i.e. AppDelegate's
|
||||
// local event handler).
|
||||
if (!focused) {
|
||||
if !focused {
|
||||
return false
|
||||
}
|
||||
|
||||
@@ -1227,11 +1227,11 @@ extension Ghostty {
|
||||
}
|
||||
|
||||
let equivalent: String
|
||||
switch (event.charactersIgnoringModifiers) {
|
||||
switch event.charactersIgnoringModifiers {
|
||||
case "\r":
|
||||
// Pass C-<return> through verbatim
|
||||
// (prevent the default context menu equivalent)
|
||||
if (!event.modifierFlags.contains(.control)) {
|
||||
if !event.modifierFlags.contains(.control) {
|
||||
return false
|
||||
}
|
||||
|
||||
@@ -1240,8 +1240,8 @@ extension Ghostty {
|
||||
case "/":
|
||||
// Treat C-/ as C-_. We do this because C-/ makes macOS make a beep
|
||||
// sound and we don't like the beep sound.
|
||||
if (!event.modifierFlags.contains(.control) ||
|
||||
!event.modifierFlags.isDisjoint(with: [.shift, .command, .option])) {
|
||||
if !event.modifierFlags.contains(.control) ||
|
||||
!event.modifierFlags.isDisjoint(with: [.shift, .command, .option]) {
|
||||
return false
|
||||
}
|
||||
|
||||
@@ -1265,8 +1265,8 @@ extension Ghostty {
|
||||
|
||||
// Ignore all other non-command events. This lets the event continue
|
||||
// through the AppKit event systems.
|
||||
if (!event.modifierFlags.contains(.command) &&
|
||||
!event.modifierFlags.contains(.control)) {
|
||||
if !event.modifierFlags.contains(.command) &&
|
||||
!event.modifierFlags.contains(.control) {
|
||||
// Reset since we got a non-command event.
|
||||
lastPerformKeyEvent = nil
|
||||
return false
|
||||
@@ -1305,7 +1305,7 @@ extension Ghostty {
|
||||
|
||||
override func flagsChanged(with event: NSEvent) {
|
||||
let mod: UInt32;
|
||||
switch (event.keyCode) {
|
||||
switch event.keyCode {
|
||||
case 0x39: mod = GHOSTTY_MODS_CAPS.rawValue
|
||||
case 0x38, 0x3C: mod = GHOSTTY_MODS_SHIFT.rawValue
|
||||
case 0x3B, 0x3E: mod = GHOSTTY_MODS_CTRL.rawValue
|
||||
@@ -1323,13 +1323,13 @@ extension Ghostty {
|
||||
|
||||
// If the key that pressed this is active, its a press, else release.
|
||||
var action = GHOSTTY_ACTION_RELEASE
|
||||
if (mods.rawValue & mod != 0) {
|
||||
if mods.rawValue & mod != 0 {
|
||||
// If the key is pressed, its slightly more complicated, because we
|
||||
// want to check if the pressed modifier is the correct side. If the
|
||||
// correct side is pressed then its a press event otherwise its a release
|
||||
// event with the opposite modifier still held.
|
||||
let sidePressed: Bool
|
||||
switch (event.keyCode) {
|
||||
switch event.keyCode {
|
||||
case 0x3C:
|
||||
sidePressed = event.modifierFlags.rawValue & UInt(NX_DEVICERSHIFTKEYMASK) != 0;
|
||||
case 0x3E:
|
||||
@@ -1342,7 +1342,7 @@ extension Ghostty {
|
||||
sidePressed = true
|
||||
}
|
||||
|
||||
if (sidePressed) {
|
||||
if sidePressed {
|
||||
action = GHOSTTY_ACTION_PRESS
|
||||
}
|
||||
}
|
||||
@@ -1483,7 +1483,7 @@ extension Ghostty {
|
||||
@IBAction func copy(_ sender: Any?) {
|
||||
guard let surface = self.surface else { return }
|
||||
let action = "copy_to_clipboard"
|
||||
if (!ghostty_surface_binding_action(surface, action, UInt(action.lengthOfBytes(using: .utf8)))) {
|
||||
if !ghostty_surface_binding_action(surface, action, UInt(action.lengthOfBytes(using: .utf8))) {
|
||||
AppDelegate.logger.warning("action failed action=\(action)")
|
||||
}
|
||||
}
|
||||
@@ -1491,7 +1491,7 @@ extension Ghostty {
|
||||
@IBAction func paste(_ sender: Any?) {
|
||||
guard let surface = self.surface else { return }
|
||||
let action = "paste_from_clipboard"
|
||||
if (!ghostty_surface_binding_action(surface, action, UInt(action.lengthOfBytes(using: .utf8)))) {
|
||||
if !ghostty_surface_binding_action(surface, action, UInt(action.lengthOfBytes(using: .utf8))) {
|
||||
AppDelegate.logger.warning("action failed action=\(action)")
|
||||
}
|
||||
}
|
||||
@@ -1500,7 +1500,7 @@ extension Ghostty {
|
||||
@IBAction func pasteAsPlainText(_ sender: Any?) {
|
||||
guard let surface = self.surface else { return }
|
||||
let action = "paste_from_clipboard"
|
||||
if (!ghostty_surface_binding_action(surface, action, UInt(action.lengthOfBytes(using: .utf8)))) {
|
||||
if !ghostty_surface_binding_action(surface, action, UInt(action.lengthOfBytes(using: .utf8))) {
|
||||
AppDelegate.logger.warning("action failed action=\(action)")
|
||||
}
|
||||
}
|
||||
@@ -1508,7 +1508,7 @@ extension Ghostty {
|
||||
@IBAction func pasteSelection(_ sender: Any?) {
|
||||
guard let surface = self.surface else { return }
|
||||
let action = "paste_from_selection"
|
||||
if (!ghostty_surface_binding_action(surface, action, UInt(action.lengthOfBytes(using: .utf8)))) {
|
||||
if !ghostty_surface_binding_action(surface, action, UInt(action.lengthOfBytes(using: .utf8))) {
|
||||
AppDelegate.logger.warning("action failed action=\(action)")
|
||||
}
|
||||
}
|
||||
@@ -1516,7 +1516,7 @@ extension Ghostty {
|
||||
@IBAction override func selectAll(_ sender: Any?) {
|
||||
guard let surface = self.surface else { return }
|
||||
let action = "select_all"
|
||||
if (!ghostty_surface_binding_action(surface, action, UInt(action.lengthOfBytes(using: .utf8)))) {
|
||||
if !ghostty_surface_binding_action(surface, action, UInt(action.lengthOfBytes(using: .utf8))) {
|
||||
AppDelegate.logger.warning("action failed action=\(action)")
|
||||
}
|
||||
}
|
||||
@@ -1524,7 +1524,7 @@ extension Ghostty {
|
||||
@IBAction func find(_ sender: Any?) {
|
||||
guard let surface = self.surface else { return }
|
||||
let action = "start_search"
|
||||
if (!ghostty_surface_binding_action(surface, action, UInt(action.lengthOfBytes(using: .utf8)))) {
|
||||
if !ghostty_surface_binding_action(surface, action, UInt(action.lengthOfBytes(using: .utf8))) {
|
||||
AppDelegate.logger.warning("action failed action=\(action)")
|
||||
}
|
||||
}
|
||||
@@ -1532,7 +1532,7 @@ extension Ghostty {
|
||||
@IBAction func selectionForFind(_ sender: Any?) {
|
||||
guard let surface = self.surface else { return }
|
||||
let action = "search_selection"
|
||||
if (!ghostty_surface_binding_action(surface, action, UInt(action.lengthOfBytes(using: .utf8)))) {
|
||||
if !ghostty_surface_binding_action(surface, action, UInt(action.lengthOfBytes(using: .utf8))) {
|
||||
AppDelegate.logger.warning("action failed action=\(action)")
|
||||
}
|
||||
}
|
||||
@@ -1540,7 +1540,7 @@ extension Ghostty {
|
||||
@IBAction func scrollToSelection(_ sender: Any?) {
|
||||
guard let surface = self.surface else { return }
|
||||
let action = "scroll_to_selection"
|
||||
if (!ghostty_surface_binding_action(surface, action, UInt(action.lengthOfBytes(using: .utf8)))) {
|
||||
if !ghostty_surface_binding_action(surface, action, UInt(action.lengthOfBytes(using: .utf8))) {
|
||||
AppDelegate.logger.warning("action failed action=\(action)")
|
||||
}
|
||||
}
|
||||
@@ -1548,7 +1548,7 @@ extension Ghostty {
|
||||
@IBAction func findNext(_ sender: Any?) {
|
||||
guard let surface = self.surface else { return }
|
||||
let action = "search:next"
|
||||
if (!ghostty_surface_binding_action(surface, action, UInt(action.lengthOfBytes(using: .utf8)))) {
|
||||
if !ghostty_surface_binding_action(surface, action, UInt(action.lengthOfBytes(using: .utf8))) {
|
||||
AppDelegate.logger.warning("action failed action=\(action)")
|
||||
}
|
||||
}
|
||||
@@ -1556,7 +1556,7 @@ extension Ghostty {
|
||||
@IBAction func findPrevious(_ sender: Any?) {
|
||||
guard let surface = self.surface else { return }
|
||||
let action = "search:previous"
|
||||
if (!ghostty_surface_binding_action(surface, action, UInt(action.lengthOfBytes(using: .utf8)))) {
|
||||
if !ghostty_surface_binding_action(surface, action, UInt(action.lengthOfBytes(using: .utf8))) {
|
||||
AppDelegate.logger.warning("action failed action=\(action)")
|
||||
}
|
||||
}
|
||||
@@ -1564,7 +1564,7 @@ extension Ghostty {
|
||||
@IBAction func findHide(_ sender: Any?) {
|
||||
guard let surface = self.surface else { return }
|
||||
let action = "end_search"
|
||||
if (!ghostty_surface_binding_action(surface, action, UInt(action.lengthOfBytes(using: .utf8)))) {
|
||||
if !ghostty_surface_binding_action(surface, action, UInt(action.lengthOfBytes(using: .utf8))) {
|
||||
AppDelegate.logger.warning("action failed action=\(action)")
|
||||
}
|
||||
}
|
||||
@@ -1572,7 +1572,7 @@ extension Ghostty {
|
||||
@IBAction func toggleReadonly(_ sender: Any?) {
|
||||
guard let surface = self.surface else { return }
|
||||
let action = "toggle_readonly"
|
||||
if (!ghostty_surface_binding_action(surface, action, UInt(action.lengthOfBytes(using: .utf8)))) {
|
||||
if !ghostty_surface_binding_action(surface, action, UInt(action.lengthOfBytes(using: .utf8))) {
|
||||
AppDelegate.logger.warning("action failed action=\(action)")
|
||||
}
|
||||
}
|
||||
@@ -1608,7 +1608,7 @@ extension Ghostty {
|
||||
@objc func resetTerminal(_ sender: Any) {
|
||||
guard let surface = self.surface else { return }
|
||||
let action = "reset"
|
||||
if (!ghostty_surface_binding_action(surface, action, UInt(action.lengthOfBytes(using: .utf8)))) {
|
||||
if !ghostty_surface_binding_action(surface, action, UInt(action.lengthOfBytes(using: .utf8))) {
|
||||
AppDelegate.logger.warning("action failed action=\(action)")
|
||||
}
|
||||
}
|
||||
@@ -1616,7 +1616,7 @@ extension Ghostty {
|
||||
@objc func toggleTerminalInspector(_ sender: Any) {
|
||||
guard let surface = self.surface else { return }
|
||||
let action = "inspector:toggle"
|
||||
if (!ghostty_surface_binding_action(surface, action, UInt(action.lengthOfBytes(using: .utf8)))) {
|
||||
if !ghostty_surface_binding_action(surface, action, UInt(action.lengthOfBytes(using: .utf8))) {
|
||||
AppDelegate.logger.warning("action failed action=\(action)")
|
||||
}
|
||||
}
|
||||
@@ -1657,7 +1657,7 @@ extension Ghostty {
|
||||
// If we're focused then we schedule to remove the notification
|
||||
// after a few seconds. If we gain focus we automatically remove it
|
||||
// in focusDidChange.
|
||||
if (self.focused) {
|
||||
if self.focused {
|
||||
Task { @MainActor [weak self] in
|
||||
try await Task.sleep(for: .seconds(3))
|
||||
self?.notificationIdentifiers.remove(uuid)
|
||||
@@ -1913,7 +1913,7 @@ extension Ghostty.SurfaceView: NSTextInputClient {
|
||||
|
||||
// We want the string view of the any value
|
||||
var chars = ""
|
||||
switch (string) {
|
||||
switch string {
|
||||
case let v as NSAttributedString:
|
||||
chars = v.string
|
||||
case let v as String:
|
||||
@@ -2052,7 +2052,7 @@ extension Ghostty.SurfaceView: NSServicesMenuRequestor {
|
||||
guard let str = pboard.getOpinionatedStringContents() else { return false }
|
||||
|
||||
let len = str.utf8CString.count
|
||||
if (len == 0) { return true }
|
||||
if len == 0 { return true }
|
||||
str.withCString { ptr in
|
||||
// len includes the null terminator so we do len - 1
|
||||
ghostty_surface_text(surface, ptr, UInt(len - 1))
|
||||
|
||||
@@ -98,7 +98,7 @@ extension Ghostty {
|
||||
ghostty_surface_set_focus(surface, focused)
|
||||
|
||||
// On macOS 13+ we can store our continuous clock...
|
||||
if (focused) {
|
||||
if focused {
|
||||
focusInstant = ContinuousClock.now
|
||||
}
|
||||
}
|
||||
|
||||
@@ -9,7 +9,7 @@ extension NSAppearance {
|
||||
/// Initialize a desired NSAppearance for the Ghostty configuration.
|
||||
convenience init?(ghosttyConfig config: Ghostty.Config) {
|
||||
guard let theme = config.windowTheme else { return nil }
|
||||
switch (theme) {
|
||||
switch theme {
|
||||
case "dark":
|
||||
self.init(named: .darkAqua)
|
||||
|
||||
|
||||
@@ -18,7 +18,7 @@ extension NSApplication {
|
||||
func releasePresentationOption(_ option: NSApplication.PresentationOptions.Element) {
|
||||
guard let value = Self.presentationOptionCounts[option] else { return }
|
||||
guard value > 0 else { return }
|
||||
if (value == 1) {
|
||||
if value == 1 {
|
||||
presentationOptions.remove(option)
|
||||
Self.presentationOptionCounts.removeValue(forKey: option)
|
||||
} else {
|
||||
|
||||
@@ -50,7 +50,7 @@ extension NSPasteboard {
|
||||
|
||||
/// The pasteboard for the Ghostty enum type.
|
||||
static func ghostty(_ clipboard: ghostty_clipboard_e) -> NSPasteboard? {
|
||||
switch (clipboard) {
|
||||
switch clipboard {
|
||||
case GHOSTTY_CLIPBOARD_STANDARD:
|
||||
return Self.general
|
||||
|
||||
|
||||
@@ -19,7 +19,7 @@ extension NSScreen {
|
||||
var hasDock: Bool {
|
||||
// If the dock autohides then we don't have a dock ever.
|
||||
if let dockAutohide = UserDefaults.standard.persistentDomain(forName: "com.apple.dock")?["autohide"] as? Bool {
|
||||
if (dockAutohide) { return false }
|
||||
if dockAutohide { return false }
|
||||
}
|
||||
|
||||
// There is no public API to directly ask about dock visibility, so we have to figure it out
|
||||
@@ -29,7 +29,7 @@ extension NSScreen {
|
||||
// which triggers showing the dock.
|
||||
|
||||
// If our visible width is less than the frame we assume its the dock.
|
||||
if (visibleFrame.width < frame.width) {
|
||||
if visibleFrame.width < frame.width {
|
||||
return true
|
||||
}
|
||||
|
||||
|
||||
@@ -204,12 +204,12 @@ class NonNativeFullscreen: FullscreenBase, FullscreenStyle {
|
||||
// We must hide the dock FIRST then hide the menu:
|
||||
// If you specify autoHideMenuBar, it must be accompanied by either hideDock or autoHideDock.
|
||||
// https://developer.apple.com/documentation/appkit/nsapplication/presentationoptions-swift.struct
|
||||
if (savedState.dock) {
|
||||
if savedState.dock {
|
||||
hideDock()
|
||||
}
|
||||
|
||||
// Hide the menu if requested
|
||||
if (properties.hideMenu && savedState.menu) {
|
||||
if properties.hideMenu && savedState.menu {
|
||||
hideMenu()
|
||||
}
|
||||
|
||||
@@ -261,7 +261,7 @@ class NonNativeFullscreen: FullscreenBase, FullscreenStyle {
|
||||
if savedState.dock {
|
||||
unhideDock()
|
||||
}
|
||||
if (properties.hideMenu && savedState.menu) {
|
||||
if properties.hideMenu && savedState.menu {
|
||||
unhideMenu()
|
||||
}
|
||||
|
||||
@@ -328,8 +328,8 @@ class NonNativeFullscreen: FullscreenBase, FullscreenStyle {
|
||||
// calculate this ourselves.
|
||||
var frame = screen.frame
|
||||
|
||||
if (!NSApp.presentationOptions.contains(.autoHideMenuBar) &&
|
||||
!NSApp.presentationOptions.contains(.hideMenuBar)) {
|
||||
if !NSApp.presentationOptions.contains(.autoHideMenuBar) &&
|
||||
!NSApp.presentationOptions.contains(.hideMenuBar) {
|
||||
// We need to subtract the menu height since we're still showing it.
|
||||
frame.size.height -= NSApp.mainMenu?.menuBarHeight ?? 0
|
||||
|
||||
@@ -339,7 +339,7 @@ class NonNativeFullscreen: FullscreenBase, FullscreenStyle {
|
||||
// put an #available check, but it was in a bug fix release so I think
|
||||
// if a bug is reported to Ghostty we can just advise the user to
|
||||
// update.
|
||||
} else if (properties.paddedNotch) {
|
||||
} else if properties.paddedNotch {
|
||||
// We are hiding the menu, we may need to avoid the notch.
|
||||
frame.size.height -= screen.safeAreaInsets.top
|
||||
}
|
||||
@@ -413,7 +413,7 @@ class NonNativeFullscreen: FullscreenBase, FullscreenStyle {
|
||||
self.toolbarStyle = window.toolbarStyle
|
||||
self.dock = window.screen?.hasDock ?? false
|
||||
|
||||
self.titlebarAccessoryViewControllers = if (window.hasTitleBar) {
|
||||
self.titlebarAccessoryViewControllers = if window.hasTitleBar {
|
||||
// Accessing titlebarAccessoryViewControllers without a titlebar triggers a crash.
|
||||
window.titlebarAccessoryViewControllers
|
||||
} else {
|
||||
|
||||
Reference in New Issue
Block a user