diff --git a/macos/Sources/App/macOS/AppDelegate.swift b/macos/Sources/App/macOS/AppDelegate.swift
index 763a387ed..da20c2124 100644
--- a/macos/Sources/App/macOS/AppDelegate.swift
+++ b/macos/Sources/App/macOS/AppDelegate.swift
@@ -48,6 +48,7 @@ class AppDelegate: NSObject,
@IBOutlet private var menuFind: NSMenuItem?
@IBOutlet private var menuFindNext: NSMenuItem?
@IBOutlet private var menuFindPrevious: NSMenuItem?
+ @IBOutlet private var menuHideFindBar: NSMenuItem?
@IBOutlet private var menuToggleVisibility: NSMenuItem?
@IBOutlet private var menuToggleFullScreen: NSMenuItem?
diff --git a/macos/Sources/App/macOS/MainMenu.xib b/macos/Sources/App/macOS/MainMenu.xib
index ce6f5a0cb..3e1084cd7 100644
--- a/macos/Sources/App/macOS/MainMenu.xib
+++ b/macos/Sources/App/macOS/MainMenu.xib
@@ -31,6 +31,7 @@
+
@@ -271,6 +272,13 @@
+
+
diff --git a/macos/Sources/Features/Terminal/BaseTerminalController.swift b/macos/Sources/Features/Terminal/BaseTerminalController.swift
index d0cea43f5..9104e61ff 100644
--- a/macos/Sources/Features/Terminal/BaseTerminalController.swift
+++ b/macos/Sources/Features/Terminal/BaseTerminalController.swift
@@ -1124,6 +1124,10 @@ class BaseTerminalController: NSWindowController,
@IBAction func findPrevious(_ sender: Any) {
focusedSurface?.findNext(sender)
}
+
+ @IBAction func findHide(_ sender: Any) {
+ focusedSurface?.findHide(sender)
+ }
@objc func resetTerminal(_ sender: Any) {
guard let surface = focusedSurface?.surface else { return }
@@ -1148,3 +1152,15 @@ class BaseTerminalController: NSWindowController,
}
}
}
+
+extension BaseTerminalController: NSMenuItemValidation {
+ func validateMenuItem(_ item: NSMenuItem) -> Bool {
+ switch item.action {
+ case #selector(findHide):
+ return focusedSurface?.searchState != nil
+
+ default:
+ return true
+ }
+ }
+}
diff --git a/macos/Sources/Features/Terminal/TerminalController.swift b/macos/Sources/Features/Terminal/TerminalController.swift
index 4de0336ce..e1a98e598 100644
--- a/macos/Sources/Features/Terminal/TerminalController.swift
+++ b/macos/Sources/Features/Terminal/TerminalController.swift
@@ -1403,8 +1403,8 @@ class TerminalController: BaseTerminalController, TabGroupCloseCoordinator.Contr
// MARK: NSMenuItemValidation
-extension TerminalController: NSMenuItemValidation {
- func validateMenuItem(_ item: NSMenuItem) -> Bool {
+extension TerminalController {
+ override func validateMenuItem(_ item: NSMenuItem) -> Bool {
switch item.action {
case #selector(returnToDefaultSize):
guard let window else { return false }
@@ -1433,7 +1433,7 @@ extension TerminalController: NSMenuItemValidation {
return true
default:
- return true
+ return super.validateMenuItem(item)
}
}
}
diff --git a/macos/Sources/Ghostty/SurfaceView_AppKit.swift b/macos/Sources/Ghostty/SurfaceView_AppKit.swift
index d70cc9654..f431fdf6d 100644
--- a/macos/Sources/Ghostty/SurfaceView_AppKit.swift
+++ b/macos/Sources/Ghostty/SurfaceView_AppKit.swift
@@ -1494,6 +1494,14 @@ extension Ghostty {
AppDelegate.logger.warning("action failed action=\(action)")
}
}
+
+ @IBAction func findHide(_ sender: Any?) {
+ guard let surface = self.surface else { return }
+ let action = "search:"
+ if (!ghostty_surface_binding_action(surface, action, UInt(action.count))) {
+ AppDelegate.logger.warning("action failed action=\(action)")
+ }
+ }
@IBAction func splitRight(_ sender: Any) {
guard let surface = self.surface else { return }
@@ -1967,6 +1975,9 @@ extension Ghostty.SurfaceView: NSMenuItemValidation {
let pb = NSPasteboard.ghosttySelection
guard let str = pb.getOpinionatedStringContents() else { return false }
return !str.isEmpty
+
+ case #selector(findHide):
+ return searchState != nil
default:
return true