Merge pull request #2481 from ghostty-org/push-wzmwoosxuxmz

macos: use notification to detect when quick terminal shows/hides
This commit is contained in:
Mitchell Hashimoto
2024-10-23 10:17:55 -07:00
committed by GitHub
2 changed files with 30 additions and 2 deletions

View File

@ -155,6 +155,14 @@ class AppDelegate: NSObject,
matching: [.keyDown],
handler: localEventHandler)
// Notifications
NotificationCenter.default.addObserver(
self,
selector: #selector(quickTerminalDidChangeVisibility),
name: .quickTerminalDidChangeVisibility,
object: nil
)
// Configure user notifications
let actions = [
UNNotificationAction(identifier: Ghostty.userNotificationActionShow, title: "Show")
@ -409,6 +417,11 @@ class AppDelegate: NSObject,
return event
}
@objc private func quickTerminalDidChangeVisibility(_ notification: Notification) {
guard let quickController = notification.object as? QuickTerminalController else { return }
self.menuQuickTerminal?.state = if (quickController.visible) { .on } else { .off }
}
//MARK: - Restorable State
/// We support NSSecureCoding for restorable state. Required as of macOS Sonoma (14) but a good idea anyways.
@ -622,8 +635,6 @@ class AppDelegate: NSObject,
guard let quickController = self.quickController else { return }
quickController.toggle()
self.menuQuickTerminal?.state = if (quickController.visible) { .on } else { .off }
}
/// Toggles visibility of all Ghosty Terminal windows. When hidden, activates Ghostty as the frontmost application

View File

@ -140,6 +140,12 @@ class QuickTerminalController: BaseTerminalController {
guard !visible else { return }
visible = true
// Notify the change
NotificationCenter.default.post(
name: .quickTerminalDidChangeVisibility,
object: self
)
// If we have a previously focused application and it isn't us, then
// we want to store it so we can restore state later.
if !NSApp.isActive {
@ -170,6 +176,12 @@ class QuickTerminalController: BaseTerminalController {
guard visible else { return }
visible = false
// Notify the change
NotificationCenter.default.post(
name: .quickTerminalDidChangeVisibility,
object: self
)
animateWindowOut(window: window, to: position)
}
@ -350,3 +362,8 @@ class QuickTerminalController: BaseTerminalController {
syncAppearance()
}
}
extension Notification.Name {
/// The quick terminal did become hidden or visible.
static let quickTerminalDidChangeVisibility = Notification.Name("QuickTerminalDidChangeVisibility")
}