aboutsummaryrefslogtreecommitdiffstats
path: root/WireGuard/WireGuard
diff options
context:
space:
mode:
authorRoopesh Chander <roop@roopc.net>2018-12-29 19:39:14 +0530
committerRoopesh Chander <roop@roopc.net>2019-01-14 14:52:30 +0530
commit2c81c3a3794a0ddc62a717745ac70c884904afe5 (patch)
tree37ff989a2ace735485a990b44f42b9f3eeafca59 /WireGuard/WireGuard
parentmacOS: Ability to activate / deactivate a tunnel (diff)
downloadwireguard-apple-2c81c3a3794a0ddc62a717745ac70c884904afe5.tar.xz
wireguard-apple-2c81c3a3794a0ddc62a717745ac70c884904afe5.zip
macOS: Show status as disabled menu items
Signed-off-by: Roopesh Chander <roop@roopc.net>
Diffstat (limited to '')
-rw-r--r--WireGuard/WireGuard/Base.lproj/Localizable.strings5
-rw-r--r--WireGuard/WireGuard/UI/macOS/StatusMenu.swift64
2 files changed, 68 insertions, 1 deletions
diff --git a/WireGuard/WireGuard/Base.lproj/Localizable.strings b/WireGuard/WireGuard/Base.lproj/Localizable.strings
index c392085..f5e12ef 100644
--- a/WireGuard/WireGuard/Base.lproj/Localizable.strings
+++ b/WireGuard/WireGuard/Base.lproj/Localizable.strings
@@ -223,5 +223,10 @@
// Mac status bar menu
+"macMenuStatus (%@)" = "Status: %@";
+"macMenuNetworks (%@)" = "Networks: %@";
+"macMenuNetworksInactive" = "Networks: -";
+"macMenuNetworksNone" = "Networks: None";
+
"macMenuManageTunnels" = "Manage tunnels";
"macMenuImportTunnels" = "Import tunnel(s) from file...";
diff --git a/WireGuard/WireGuard/UI/macOS/StatusMenu.swift b/WireGuard/WireGuard/UI/macOS/StatusMenu.swift
index 2c9e85a..a41cea4 100644
--- a/WireGuard/WireGuard/UI/macOS/StatusMenu.swift
+++ b/WireGuard/WireGuard/UI/macOS/StatusMenu.swift
@@ -8,12 +8,24 @@ class StatusMenu: NSMenu {
let tunnelsManager: TunnelsManager
var tunnelStatusObservers = [AnyObject]()
+ var statusMenuItem: NSMenuItem?
+ var networksMenuItem: NSMenuItem?
var firstTunnelMenuItemIndex: Int = 0
var numberOfTunnelMenuItems: Int = 0
init(tunnelsManager: TunnelsManager) {
self.tunnelsManager = tunnelsManager
super.init(title: "WireGuard Status Bar Menu")
+
+ addStatusMenuItems()
+ addItem(NSMenuItem.separator())
+ for index in 0 ..< tunnelsManager.numberOfTunnels() {
+ let isUpdated = updateStatusMenuItems(with: tunnelsManager.tunnel(at: index), ignoreInactive: true)
+ if isUpdated {
+ break
+ }
+ }
+
firstTunnelMenuItemIndex = numberOfItems
let isAdded = addTunnelMenuItems()
if isAdded {
@@ -26,6 +38,55 @@ class StatusMenu: NSMenu {
fatalError("init(coder:) has not been implemented")
}
+ func addStatusMenuItems() {
+ let statusTitle = tr(format: "macMenuStatus (%@)", tr("tunnelStatusInactive"))
+ let statusMenuItem = NSMenuItem(title: statusTitle, action: #selector(manageTunnelsClicked), keyEquivalent: "")
+ statusMenuItem.isEnabled = false
+ addItem(statusMenuItem)
+ let networksMenuItem = NSMenuItem(title: tr("macMenuNetworksInactive"), action: #selector(manageTunnelsClicked), keyEquivalent: "")
+ networksMenuItem.isEnabled = false
+ addItem(networksMenuItem)
+ self.statusMenuItem = statusMenuItem
+ self.networksMenuItem = networksMenuItem
+ }
+
+ @discardableResult
+ func updateStatusMenuItems(with tunnel: TunnelContainer, ignoreInactive: Bool) -> Bool {
+ guard let statusMenuItem = statusMenuItem, let networksMenuItem = networksMenuItem else { return false }
+ var statusText: String
+
+ switch tunnel.status {
+ case .waiting:
+ return false
+ case .inactive:
+ if ignoreInactive {
+ return false
+ }
+ statusText = tr("tunnelStatusInactive")
+ case .activating:
+ statusText = tr("tunnelStatusActivating")
+ case .active:
+ statusText = tr("tunnelStatusActive")
+ case .deactivating:
+ statusText = tr("tunnelStatusDeactivating")
+ case .reasserting:
+ statusText = tr("tunnelStatusReasserting")
+ case .restarting:
+ statusText = tr("tunnelStatusRestarting")
+ }
+
+ statusMenuItem.title = tr(format: "macMenuStatus (%@)", statusText)
+
+ let addresses = tunnel.tunnelConfiguration?.interface.addresses ?? []
+ let addressesString = addresses.map { $0.stringRepresentation }.joined(separator: ", ")
+ if addressesString.isEmpty {
+ networksMenuItem.title = tr("macMenuNetworksNone")
+ } else {
+ networksMenuItem.title = tr(format: "macMenuNetworks (%@)", addressesString)
+ }
+ return true
+ }
+
func addTunnelMenuItems() -> Bool {
let numberOfTunnels = tunnelsManager.numberOfTunnels()
for index in 0 ..< tunnelsManager.numberOfTunnels() {
@@ -76,8 +137,9 @@ extension StatusMenu {
menuItem.target = self
menuItem.representedObject = tunnel
updateTunnelMenuItem(menuItem)
- let statusObservationToken = tunnel.observe(\.status) { _, _ in
+ let statusObservationToken = tunnel.observe(\.status) { [weak self] tunnel, _ in
updateTunnelMenuItem(menuItem)
+ self?.updateStatusMenuItems(with: tunnel, ignoreInactive: false)
}
tunnelStatusObservers.insert(statusObservationToken, at: tunnelIndex)
insertItem(menuItem, at: firstTunnelMenuItemIndex + tunnelIndex)