diff --git a/swift/apple/FirezoneKit/Sources/FirezoneKit/Views/MenuBar.swift b/swift/apple/FirezoneKit/Sources/FirezoneKit/Views/MenuBar.swift index 99965d0fd..65c466582 100644 --- a/swift/apple/FirezoneKit/Sources/FirezoneKit/Views/MenuBar.swift +++ b/swift/apple/FirezoneKit/Sources/FirezoneKit/Views/MenuBar.swift @@ -154,9 +154,9 @@ let menuItem = createMenuItem( menu, title: "Quit", - action: #selector(NSApplication.terminate(_:)), + action: #selector(quitButtonTapped), key: "q", - target: nil + target: self ) if let appName = Bundle.main.infoDictionary?[kCFBundleNameKey as String] as? String { menuItem.title = "Quit \(appName)" @@ -237,6 +237,17 @@ NSApp.orderFrontStandardAboutPanel(self) } + @objc private func quitButtonTapped() { + Task { + do { + try await appStore?.tunnel.stop() + } catch { + logger.error("\(#function): Error stopping tunnel: \(error)") + } + NSApp.terminate(self) + } + } + private func openSettingsWindow() { if let settingsWindow = NSApp.windows.first(where: { $0.identifier?.rawValue.hasPrefix("firezone-settings") ?? false @@ -365,6 +376,14 @@ resourcesUnavailableReasonMenuItem.title = "Disconnected" resourcesSeparatorMenuItem.isHidden = false } + quitMenuItem.title = { + switch self.tunnelStatus { + case .connected, .connecting: + return "Disconnect and Quit" + default: + return "Quit" + } + }() } private func handleMenuVisibilityOrStatusChanged() {