From 4aac4ecd98c1085e94bcefdaad3b1f42ecdf2602 Mon Sep 17 00:00:00 2001 From: Roland Peelen Date: Mon, 30 Sep 2024 19:54:41 +0200 Subject: [PATCH] Add hiding toggle, hook up to menu / shortcut --- macos/Sources/App/macOS/AppDelegate.swift | 28 +++++++++++++++++++++++ macos/Sources/App/macOS/MainMenu.xib | 10 ++++++-- macos/Sources/Ghostty/Ghostty.App.swift | 10 ++++++++ 3 files changed, 46 insertions(+), 2 deletions(-) diff --git a/macos/Sources/App/macOS/AppDelegate.swift b/macos/Sources/App/macOS/AppDelegate.swift index 5980b8d66..658f4ca83 100644 --- a/macos/Sources/App/macOS/AppDelegate.swift +++ b/macos/Sources/App/macOS/AppDelegate.swift @@ -86,6 +86,9 @@ class AppDelegate: NSObject, return ProcessInfo.processInfo.systemUptime - applicationLaunchTime } + /// Tracks whether the application is currently visible + private var isVisible: Bool = true + override init() { terminalManager = TerminalManager(ghostty) updaterController = SPUStandardUpdaterController( @@ -251,6 +254,7 @@ class AppDelegate: NSObject, // Ghostty will validate as well but we can avoid creating an entirely new // surface by doing our own validation here. We can also show a useful error // this way. + var isDirectory = ObjCBool(true) guard FileManager.default.fileExists(atPath: filename, isDirectory: &isDirectory) else { return false } @@ -315,6 +319,7 @@ class AppDelegate: NSObject, syncMenuShortcut(action: "decrease_font_size:1", menuItem: self.menuDecreaseFontSize) syncMenuShortcut(action: "reset_font_size", menuItem: self.menuResetFontSize) syncMenuShortcut(action: "toggle_quick_terminal", menuItem: self.menuQuickTerminal) + syncMenuShortcut(action: "toggle_visibility", menuItem: self.menuQuickTerminal) syncMenuShortcut(action: "inspector:toggle", menuItem: self.menuTerminalInspector) syncMenuShortcut(action: "toggle_secure_input", menuItem: self.menuSecureInput) @@ -564,4 +569,27 @@ class AppDelegate: NSObject, self.menuQuickTerminal?.state = if (quickController.visible) { .on } else { .off } } + + /// Toggles the visibility of all Ghostty windows + @IBAction func toggleVisibility(_ sender: Any) { + let configurationErrorsWindow = ConfigurationErrorsController.sharedInstance.window + + if isVisible { + // Hide all windows + for window in NSApp.windows { + if window !== configurationErrorsWindow { + window.orderOut(nil) + } + } + } else { + // Show all windows + for window in NSApp.windows { + if window !== configurationErrorsWindow { + window.makeKeyAndOrderFront(nil) + } + } + NSApp.activate(ignoringOtherApps: true) + } + isVisible.toggle() + } } diff --git a/macos/Sources/App/macOS/MainMenu.xib b/macos/Sources/App/macOS/MainMenu.xib index 63aae4c60..2982d6cfc 100644 --- a/macos/Sources/App/macOS/MainMenu.xib +++ b/macos/Sources/App/macOS/MainMenu.xib @@ -217,10 +217,16 @@ - + - + + + + + + + diff --git a/macos/Sources/Ghostty/Ghostty.App.swift b/macos/Sources/Ghostty/Ghostty.App.swift index 352fb4107..e46d6fbdf 100644 --- a/macos/Sources/Ghostty/Ghostty.App.swift +++ b/macos/Sources/Ghostty/Ghostty.App.swift @@ -490,6 +490,9 @@ extension Ghostty { case GHOSTTY_ACTION_TOGGLE_QUICK_TERMINAL: toggleQuickTerminal(app, target: target) + case GHOSTTY_ACTION_TOGGLE_VISIBILITY: + toggleVisibility(app, target: target) + case GHOSTTY_ACTION_CLOSE_ALL_WINDOWS: fallthrough case GHOSTTY_ACTION_TOGGLE_TAB_OVERVIEW: @@ -630,6 +633,13 @@ extension Ghostty { } } + private static func toggleVisibility( + _ app: ghostty_app_t, + target: ghostty_target_s) { + guard let appDelegate = NSApplication.shared.delegate as? AppDelegate else { return } + appDelegate.toggleVisibility(self) + } + private static func gotoTab( _ app: ghostty_app_t, target: ghostty_target_s,