From e29cf19fddc6878f7e24c442f83d6ff0d23fa6b8 Mon Sep 17 00:00:00 2001 From: Roopesh Chander Date: Wed, 16 Jan 2019 01:00:42 +0530 Subject: [PATCH] macOS: Different status bar icon looks for different states - Looks dimmed when no tunnel is active - Looks normal when a tunnel is active - Animates when a tunnel is activating Signed-off-by: Roopesh Chander --- WireGuard/WireGuard.xcodeproj/project.pbxproj | 4 ++ .../WireGuard/Tunnel/TunnelsManager.swift | 4 ++ .../WireGuard/UI/macOS/AppDelegate.swift | 23 +++--- .../Contents.json | 9 ++- .../StatusBarIcon@1x.png | Bin 0 -> 978 bytes .../StatusBarIcon@2x.png | Bin 0 -> 1722 bytes .../StatusBarIcon@3x.png | Bin 0 -> 1975 bytes .../Contents.json | 26 +++++++ .../StatusBarIconDimmed@1x.png | Bin 0 -> 881 bytes .../StatusBarIconDimmed@2x.png | Bin 0 -> 1390 bytes .../StatusBarIconDimmed@3x.png | Bin 0 -> 1581 bytes .../StatusBarIconDot1.imageset/Contents.json | 26 +++++++ .../StatusBarIconDot1@1x.png | Bin 0 -> 953 bytes .../StatusBarIconDot1@2x.png | Bin 0 -> 1570 bytes .../StatusBarIconDot1@3x.png | Bin 0 -> 1744 bytes .../StatusBarIconDot2.imageset/Contents.json | 26 +++++++ .../StatusBarIconDot2@1x.png | Bin 0 -> 942 bytes .../StatusBarIconDot2@2x.png | Bin 0 -> 1502 bytes .../StatusBarIconDot2@3x.png | Bin 0 -> 1676 bytes .../StatusBarIconDot3.imageset/Contents.json | 26 +++++++ .../StatusBarIconDot3@1x.png | Bin 0 -> 958 bytes .../StatusBarIconDot3@2x.png | Bin 0 -> 1521 bytes .../StatusBarIconDot3@3x.png | Bin 0 -> 1677 bytes .../WireGuardMacStatusBarIcon@1x.png | Bin 990 -> 0 bytes .../WireGuardMacStatusBarIcon@2x.png | Bin 1714 -> 0 bytes .../WireGuardMacStatusBarIcon@3x.png | Bin 1956 -> 0 bytes .../UI/macOS/StatusItemController.swift | 66 ++++++++++++++++++ WireGuard/WireGuard/UI/macOS/StatusMenu.swift | 15 +++- 28 files changed, 209 insertions(+), 16 deletions(-) rename WireGuard/WireGuard/UI/macOS/Assets.xcassets/{WireGuardMacStatusBarIcon.imageset => StatusBarIcon.imageset}/Contents.json (57%) create mode 100644 WireGuard/WireGuard/UI/macOS/Assets.xcassets/StatusBarIcon.imageset/StatusBarIcon@1x.png create mode 100644 WireGuard/WireGuard/UI/macOS/Assets.xcassets/StatusBarIcon.imageset/StatusBarIcon@2x.png create mode 100644 WireGuard/WireGuard/UI/macOS/Assets.xcassets/StatusBarIcon.imageset/StatusBarIcon@3x.png create mode 100644 WireGuard/WireGuard/UI/macOS/Assets.xcassets/StatusBarIconDimmed.imageset/Contents.json create mode 100644 WireGuard/WireGuard/UI/macOS/Assets.xcassets/StatusBarIconDimmed.imageset/StatusBarIconDimmed@1x.png create mode 100644 WireGuard/WireGuard/UI/macOS/Assets.xcassets/StatusBarIconDimmed.imageset/StatusBarIconDimmed@2x.png create mode 100644 WireGuard/WireGuard/UI/macOS/Assets.xcassets/StatusBarIconDimmed.imageset/StatusBarIconDimmed@3x.png create mode 100644 WireGuard/WireGuard/UI/macOS/Assets.xcassets/StatusBarIconDot1.imageset/Contents.json create mode 100644 WireGuard/WireGuard/UI/macOS/Assets.xcassets/StatusBarIconDot1.imageset/StatusBarIconDot1@1x.png create mode 100644 WireGuard/WireGuard/UI/macOS/Assets.xcassets/StatusBarIconDot1.imageset/StatusBarIconDot1@2x.png create mode 100644 WireGuard/WireGuard/UI/macOS/Assets.xcassets/StatusBarIconDot1.imageset/StatusBarIconDot1@3x.png create mode 100644 WireGuard/WireGuard/UI/macOS/Assets.xcassets/StatusBarIconDot2.imageset/Contents.json create mode 100644 WireGuard/WireGuard/UI/macOS/Assets.xcassets/StatusBarIconDot2.imageset/StatusBarIconDot2@1x.png create mode 100644 WireGuard/WireGuard/UI/macOS/Assets.xcassets/StatusBarIconDot2.imageset/StatusBarIconDot2@2x.png create mode 100644 WireGuard/WireGuard/UI/macOS/Assets.xcassets/StatusBarIconDot2.imageset/StatusBarIconDot2@3x.png create mode 100644 WireGuard/WireGuard/UI/macOS/Assets.xcassets/StatusBarIconDot3.imageset/Contents.json create mode 100644 WireGuard/WireGuard/UI/macOS/Assets.xcassets/StatusBarIconDot3.imageset/StatusBarIconDot3@1x.png create mode 100644 WireGuard/WireGuard/UI/macOS/Assets.xcassets/StatusBarIconDot3.imageset/StatusBarIconDot3@2x.png create mode 100644 WireGuard/WireGuard/UI/macOS/Assets.xcassets/StatusBarIconDot3.imageset/StatusBarIconDot3@3x.png delete mode 100644 WireGuard/WireGuard/UI/macOS/Assets.xcassets/WireGuardMacStatusBarIcon.imageset/WireGuardMacStatusBarIcon@1x.png delete mode 100644 WireGuard/WireGuard/UI/macOS/Assets.xcassets/WireGuardMacStatusBarIcon.imageset/WireGuardMacStatusBarIcon@2x.png delete mode 100644 WireGuard/WireGuard/UI/macOS/Assets.xcassets/WireGuardMacStatusBarIcon.imageset/WireGuardMacStatusBarIcon@3x.png create mode 100644 WireGuard/WireGuard/UI/macOS/StatusItemController.swift diff --git a/WireGuard/WireGuard.xcodeproj/project.pbxproj b/WireGuard/WireGuard.xcodeproj/project.pbxproj index a5119b6..b6b1c32 100644 --- a/WireGuard/WireGuard.xcodeproj/project.pbxproj +++ b/WireGuard/WireGuard.xcodeproj/project.pbxproj @@ -54,6 +54,7 @@ 6F7774EF21722D97006A79B3 /* TunnelsManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6F7774EE21722D97006A79B3 /* TunnelsManager.swift */; }; 6F7774F321774263006A79B3 /* TunnelEditTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6F7774F221774263006A79B3 /* TunnelEditTableViewController.swift */; }; 6F7F7E5F21C7D74B00527607 /* TunnelErrors.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6F7F7E5E21C7D74B00527607 /* TunnelErrors.swift */; }; + 6F89E17A21EDEB0E00C97BB9 /* StatusItemController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6F89E17921EDEB0E00C97BB9 /* StatusItemController.swift */; }; 6F919EC3218A2AE90023B400 /* ErrorPresenter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6F919EC2218A2AE90023B400 /* ErrorPresenter.swift */; }; 6F919ED9218C65C50023B400 /* wireguard_doc_logo_22x29.png in Resources */ = {isa = PBXBuildFile; fileRef = 6F919ED5218C65C50023B400 /* wireguard_doc_logo_22x29.png */; }; 6F919EDA218C65C50023B400 /* wireguard_doc_logo_44x58.png in Resources */ = {isa = PBXBuildFile; fileRef = 6F919ED6218C65C50023B400 /* wireguard_doc_logo_44x58.png */; }; @@ -263,6 +264,7 @@ 6F7774EE21722D97006A79B3 /* TunnelsManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TunnelsManager.swift; sourceTree = ""; }; 6F7774F221774263006A79B3 /* TunnelEditTableViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TunnelEditTableViewController.swift; sourceTree = ""; }; 6F7F7E5E21C7D74B00527607 /* TunnelErrors.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TunnelErrors.swift; sourceTree = ""; }; + 6F89E17921EDEB0E00C97BB9 /* StatusItemController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StatusItemController.swift; sourceTree = ""; }; 6F919EC2218A2AE90023B400 /* ErrorPresenter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ErrorPresenter.swift; sourceTree = ""; }; 6F919ED5218C65C50023B400 /* wireguard_doc_logo_22x29.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = wireguard_doc_logo_22x29.png; sourceTree = ""; }; 6F919ED6218C65C50023B400 /* wireguard_doc_logo_44x58.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = wireguard_doc_logo_44x58.png; sourceTree = ""; }; @@ -512,6 +514,7 @@ 6FBA104421D7EA750051C35F /* ViewController */, 6FBA101321D613F30051C35F /* Application.swift */, 6FB1BD5F21D2607A00A991BF /* AppDelegate.swift */, + 6F89E17921EDEB0E00C97BB9 /* StatusItemController.swift */, 6FBA101621D655340051C35F /* StatusMenu.swift */, 6FBA104121D6BC210051C35F /* ErrorPresenter.swift */, 6FCD99AE21E0EA1700BA4C82 /* ImportPanelPresenter.swift */, @@ -1111,6 +1114,7 @@ 6FB1BDBC21D50F0200A991BF /* ringlogger.c in Sources */, 6FB1BDBD21D50F0200A991BF /* ringlogger.h in Sources */, 6FBA103F21D6B6FF0051C35F /* TunnelImporter.swift in Sources */, + 6F89E17A21EDEB0E00C97BB9 /* StatusItemController.swift in Sources */, 6F4DD16B21DA558800690EAE /* TunnelListRow.swift in Sources */, 5F52D0BF21E3788900283CEA /* NSColor+Hex.swift in Sources */, 6FB1BDBE21D50F0200A991BF /* Logger.swift in Sources */, diff --git a/WireGuard/WireGuard/Tunnel/TunnelsManager.swift b/WireGuard/WireGuard/Tunnel/TunnelsManager.swift index 4476c4a..1b3cc50 100644 --- a/WireGuard/WireGuard/Tunnel/TunnelsManager.swift +++ b/WireGuard/WireGuard/Tunnel/TunnelsManager.swift @@ -222,6 +222,10 @@ class TunnelsManager { return tunnels.first { $0.name == tunnelName } } + func waitingTunnel() -> TunnelContainer? { + return tunnels.first { $0.status == .waiting } + } + func startActivation(of tunnel: TunnelContainer) { guard tunnels.contains(tunnel) else { return } // Ensure it's not deleted guard tunnel.status == .inactive else { diff --git a/WireGuard/WireGuard/UI/macOS/AppDelegate.swift b/WireGuard/WireGuard/UI/macOS/AppDelegate.swift index a08f9dc..3f08987 100644 --- a/WireGuard/WireGuard/UI/macOS/AppDelegate.swift +++ b/WireGuard/WireGuard/UI/macOS/AppDelegate.swift @@ -6,7 +6,8 @@ import Cocoa @NSApplicationMain class AppDelegate: NSObject, NSApplicationDelegate { - var statusItem: NSStatusItem? + var statusItemController: StatusItemController? + var currentTunnelStatusObserver: AnyObject? func applicationDidFinishLaunching(_ aNotification: Notification) { Logger.configureGlobal(withFilePath: FileManager.appLogFileURL?.path) @@ -19,21 +20,19 @@ class AppDelegate: NSObject, NSApplicationDelegate { } let tunnelsManager: TunnelsManager = result.value! + let statusItemController = StatusItemController() + let statusMenu = StatusMenu(tunnelsManager: tunnelsManager) - self.statusItem = createStatusBarItem(with: statusMenu) + + statusItemController.statusItem.menu = statusMenu + statusItemController.currentTunnel = statusMenu.currentTunnel + self.currentTunnelStatusObserver = statusMenu.observe(\.currentTunnel) { statusMenu, _ in + statusItemController.currentTunnel = statusMenu.currentTunnel + } + self.statusItemController = statusItemController tunnelsManager.tunnelsListDelegate = statusMenu tunnelsManager.activationDelegate = statusMenu } } } - -func createStatusBarItem(with statusMenu: StatusMenu) -> NSStatusItem { - let statusItem = NSStatusBar.system.statusItem(withLength: NSStatusItem.squareLength) - if let statusBarImage = NSImage(named: "WireGuardMacStatusBarIcon") { - statusBarImage.isTemplate = true - statusItem.button?.image = statusBarImage - } - statusItem.menu = statusMenu - return statusItem -} diff --git a/WireGuard/WireGuard/UI/macOS/Assets.xcassets/WireGuardMacStatusBarIcon.imageset/Contents.json b/WireGuard/WireGuard/UI/macOS/Assets.xcassets/StatusBarIcon.imageset/Contents.json similarity index 57% rename from WireGuard/WireGuard/UI/macOS/Assets.xcassets/WireGuardMacStatusBarIcon.imageset/Contents.json rename to WireGuard/WireGuard/UI/macOS/Assets.xcassets/StatusBarIcon.imageset/Contents.json index 2adee86..c878d79 100644 --- a/WireGuard/WireGuard/UI/macOS/Assets.xcassets/WireGuardMacStatusBarIcon.imageset/Contents.json +++ b/WireGuard/WireGuard/UI/macOS/Assets.xcassets/StatusBarIcon.imageset/Contents.json @@ -2,22 +2,25 @@ "images" : [ { "idiom" : "universal", - "filename" : "WireGuardMacStatusBarIcon@1x.png", + "filename" : "StatusBarIcon@1x.png", "scale" : "1x" }, { "idiom" : "universal", - "filename" : "WireGuardMacStatusBarIcon@2x.png", + "filename" : "StatusBarIcon@2x.png", "scale" : "2x" }, { "idiom" : "universal", - "filename" : "WireGuardMacStatusBarIcon@3x.png", + "filename" : "StatusBarIcon@3x.png", "scale" : "3x" } ], "info" : { "version" : 1, "author" : "xcode" + }, + "properties" : { + "template-rendering-intent" : "template" } } \ No newline at end of file diff --git a/WireGuard/WireGuard/UI/macOS/Assets.xcassets/StatusBarIcon.imageset/StatusBarIcon@1x.png b/WireGuard/WireGuard/UI/macOS/Assets.xcassets/StatusBarIcon.imageset/StatusBarIcon@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..c0a43e770fc50067a049029c44d332e94d58b012 GIT binary patch literal 978 zc-rd>@N?(olHy`uVBq!ia0vp^Vj#@H3?x5i&EW)6Ea{HEjtmSN`?>!lvI6;x#X;^) z4C~IxyaaL-l0AZa85pY67#JE_7#My5g&JNkFq9fFFuY1&V6d9Oz#v{QXIG#NP+vfR zPlzkSD4-tr|Np;A^V(%VR$fVvUoZm;Gfz-|o}6m&lCOVu#G5dQ@A>xRR2dti`;mWU zrh*&}8-LyiR`v>;{o!LJJJ;P`->>ceocZw0xmiLdJ0)}uon7$kUDey7s~N04KQud@ zc2BtTK55~-^99d0ggW){trRevTe_@7Qh1a0ft@d`A5B?qd141BIV5?zyX1#*BsKy$ zoCO|{#X#BvjNMLV+W{HhJY5_^BrYc>G%&lVvFS9-Y@OOG>pZ1-a`)`^>HYBxp%DQZ z`u-6vAwDv$Ax=SFQL{qb!uZY#RI<9Nri!|m1geFamh$@Q=E{l$#`@XTGCM2lCX0zA z3Nx!ZU$!y+Y{Q)r=)Kw|TRPf0^S2FqN@A$HdL0{Ey7*z6@RUSp^V)L$LjP2K+kBDm z-%o!2`pN!*g>B)k^J)<{E&MH1On8nyEXt93Xd^gr-XXm}k407&_dToJGmXb^W92-L zLxnmYIV+uZv2;B=S?Q+9vof>t+KRGe>>lYqQa+`mE^ZB75(fl+0#P~!9yipU zSsh>8y@-(^?4^d&C8L`Mfgzw;;u=wsl30>zm0Xkxq!^403@vpH40R1nLkvx=jE$`f p&9x0otqcr|G*7vsXvob^$xN%nt--mZ=r<@Sc)I$ztaD0e0ssk5;O77U literal 0 Hc-jL100001 diff --git a/WireGuard/WireGuard/UI/macOS/Assets.xcassets/StatusBarIcon.imageset/StatusBarIcon@2x.png b/WireGuard/WireGuard/UI/macOS/Assets.xcassets/StatusBarIcon.imageset/StatusBarIcon@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..2057c3177cee30c2e99e405e07e0f2f11d717d60 GIT binary patch literal 1722 zc-rd>@N?(olHy`uVBq!ia0vp^Iv~u!3?wz9Rv7~+mUKs7M+SzC{oH>NS%G}U;vjb? zhIQv;UIIA^$sR$z3=CCj3=9n|3=F@3LJcn%7)lKo7+xhXFj&oCU=S~uvn$Ysfq}^_ zz$e6&VHAu4%E15s|D}6UK}qvKNswPK10xf+l1D;_0lRAX?0s)<&Ua>&&`>t+eDn8Z zArF7$$z%KfT)4JnTDKPS#BZM;-0t9v`2Op~-aXCQEYes19nFu;(=+c|wMJ03_QyhX zp)gPJ_s>LJD*AhJ9Ev|wbNv3fqA`@O{>Ie1yV<_pne)l^@#YgBw?{Vd3LlQXnEb`} z%=*_hl84qwJ<7DawPEXNs~x-2+SOu~*c~}&-vc=VyJ2rc2{xCH;wait}QPNV=Q>=W@Fl7sm z;?Ye-pSZgIIBfMgrL`*Sl~l#t^_pu+8JM<|mVEv3mG{H%^A|YQT#LAUlhlJ)w zX;{!OBsCGYTbTRa6c6L0c zQ>d@|*_ZKXqUD4Y2bS(wBP6lQX2FA`HLKXPwy~-$lZxqbUCJkOq4C6~D{>vHnWg48 z85c%eVUE4XkY;8k8xY9amS}9OcT{)n0hNnvY1>|xl`ttAUY1Kwm{P`Ad*v>(&%rsI zdutb5xgy>YY?xdxbD@2gu!Wl6tU0VHau;SdsWYvuYSb!OR_42!&D}dnNm%YE&*gNP z8J6DqVr#B!F5C83rlw2s*}2o_nYGuxo3~#f>zR{{=B)*_6Ki!nG86thQf)kN=ISny z<+oD3qo#{jG6^5)ntFy!FwS9`uh}}MoT;nMHWnp_$ZKq3Dy&Uo?hT9VjmVtPY#eQD&TyuWM-TRyID=lGG&a;r(1Yi4WX(I^9hdtb~PoolrM zKC09>E-!!3a50Tzw&;v?MSnhM_yw`fQse)2b(*L{n(DntX{*&W40Ug*ZL4M9aAPXZ z(P+JQb6C5k?1-&;u%=u4NkT%oxl;4{Th1%gZt-@x2z10MWSn&1c#|`GskyP&^y$_5 zj!P9b_~$&WQ?Fk%C5V%O;rw0c-LZD*Wx%AWTH+c}l9E`GYL#4+3Zxi}3=A!G4GeV+ yO+yS#t&EMW49&F-OsxzIj5JTVqiD#@PsvQH#I3=(r06#&^Lx7bxvX{q literal 0 Hc-jL100001 diff --git a/WireGuard/WireGuard/UI/macOS/Assets.xcassets/StatusBarIcon.imageset/StatusBarIcon@3x.png b/WireGuard/WireGuard/UI/macOS/Assets.xcassets/StatusBarIcon.imageset/StatusBarIcon@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..60cc363a0d581f229e522d73ec8238a50823b0d3 GIT binary patch literal 1975 zc-rd>@N?(olHy`uVBq!ia0vp^P9V&|3?#2~eYgdrSkfJR9T^xl_H+M9WCijWi-X*q z7}lMWc?skwBzpw;GB8xBF)%c=FfjZA3N^f7U???UV0e|lz+g3lfkC`r&aOZk1_q{r z0G|+7hEXsI=mq}&|KFu|b`y|wt|Z7Wn1M+|Ra1puNGWB(?WfDVSR6L(o7u7RUOKz+ z?BD14cw*~vf<3%f?$PDEvGL-|PUh+#52s9?RQc!DwM+XMqmE9mEh;`Jd_XZWuVuq` zGv8kyLO8naOx3=*{&U5@0_jC(ukV`R=JL8`p2C&C)-mTyE^zlgx4WOv@XU6H&9WDF z-){Zr=ibgM5WS+X?08!CTn*<;<&&%>$q%k_O0Y!$xdla6T5Wi^A-5=*j;{$B!R$0Toem-Ef{4rKy4 zoCO|{#X#BvjNMLV+c7XOM|-+BhD02GI{l@xXrRae{eGqXO=)Wr7NbWyj{6P|9k$cvvaJIKiTal|Mj9~#?I$wZ1?XherNgp zo?}K_N9W2zXKD`q7Z8h@5vjN7kXQEXqnjkXbKbs@l`%Z#=RG&oIVR?=f&M$WH|OS^ z-ZQQG_m6c4T*6ifd`fn{vF4Ca_IPJZ@n;o+qh3bYopuIN9r>inlJuMC-` zt}@1}K0Xfp5PNk>%d7%rmUX-j^VMH)sHu0(-j^2}yZ3+v>vkTkBbh?~+T5BiP4N^+ z?~)WqKe&A6isv2*rFTptoLet^)_cwx${ZSWC|-FbN9u=b+>0J6El*qe;hLD%5mkp6 zG2VT1Zb==Ce(ANASHN`9!D9G zDz|JFqs3ACXJKm}sq?ff+qnFylETT|^)gZCe`)+R6@Gj)YEs{i%F`-Y)rvaD^j~tU zU$j$2X}NH@X#VTftf9YWwJoSP{Pip2bQ%Ao(C-b3)0-|t9PoFLso2p`mVV>nD-D6h zn)BP6|Evx9q%eEC$T{B+(ie{Iliqe=&vV&jD*h*ypRJWJ&u?ug{q)z~V_pr5i}2k! z5-PLa-`Cw((=^x7x3|G_&6J2`3$Lx>WG@+$_h0wR?tsEL9+sA68#an;khS~!ribH~ybnvuu0`pB zN_9p;JdbDmdcI}yaUrk3V=}HM)^l1i_|@_M_1q#Q>l1pC^^EaP?tiWK(tj@A+_KbLh*2~7Zr^j{_b literal 0 Hc-jL100001 diff --git a/WireGuard/WireGuard/UI/macOS/Assets.xcassets/StatusBarIconDimmed.imageset/Contents.json b/WireGuard/WireGuard/UI/macOS/Assets.xcassets/StatusBarIconDimmed.imageset/Contents.json new file mode 100644 index 0000000..aeb8a8e --- /dev/null +++ b/WireGuard/WireGuard/UI/macOS/Assets.xcassets/StatusBarIconDimmed.imageset/Contents.json @@ -0,0 +1,26 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "StatusBarIconDimmed@1x.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "StatusBarIconDimmed@2x.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "filename" : "StatusBarIconDimmed@3x.png", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + }, + "properties" : { + "template-rendering-intent" : "template" + } +} \ No newline at end of file diff --git a/WireGuard/WireGuard/UI/macOS/Assets.xcassets/StatusBarIconDimmed.imageset/StatusBarIconDimmed@1x.png b/WireGuard/WireGuard/UI/macOS/Assets.xcassets/StatusBarIconDimmed.imageset/StatusBarIconDimmed@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..fb9d8f799f00f06fa1582ab0a6f25d091951f71f GIT binary patch literal 881 zc-rd>@N?(olHy`uVBq!ia0vp^Vj#@H3?x5i&EW)6Ea{HEjtmSN`?>!lvI6;x#X;^) z4C~IxyaaL-l0AZa85pY67#JE_7#My5g&JNkFq9fFFuY1&V6d9Oz#v{QXIG#NP#<@I zPlzkSC;)^1|NlQM5%dGHB1(e%f*F_?*|aKl} z6e8<#g;cfuDywW+^K%k3O>46Y%hO%Ok^)OA>?}>(MP1xH4Vw!x%u6E_W7tDEB>k;J zcoXG{yg%+Q{Q-)zByV?@h__ph^Z_}X1s;*bK-vS0-A-oP0T~}WT^vIsE+;26FuSR- z=`_r2o!TqwJf(SZ_w4rR{qnxu4GSi0=vXmh2g|ArOQviwSl!d3GfT1P6IYj)PEW=n zpHo_^vR+BeT9KAfn5A9x`bAd9i-jDor8T6aJf&xItW@ki)#W*xYsO6O*&fjf+}hDm zAB_znq@}%XFR-{3aB*7TA-|Ijx8;t?@;OcG^Sfmeb}plC%Y};th6Sa`&V@VH?4HHm zzkHSK_Nn5V_#<8KF4>zZSyL1HWgTe~DWM4fzG}}h literal 0 Hc-jL100001 diff --git a/WireGuard/WireGuard/UI/macOS/Assets.xcassets/StatusBarIconDimmed.imageset/StatusBarIconDimmed@2x.png b/WireGuard/WireGuard/UI/macOS/Assets.xcassets/StatusBarIconDimmed.imageset/StatusBarIconDimmed@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..2f4e6135b6b2d56eaa146258555554906f9e4853 GIT binary patch literal 1390 zc-rd>@N?(olHy`uVBq!ia0vp^Iv~u!3?wz9Rv7~+mUKs7M+SzC{oH>NS%G}U;vjb? zhIQv;UIIA^$sR$z3=CCj3=9n|3=F@3LJcn%7)lKo7+xhXFj&oCU=S~uvn$XBs4qLf zC&ZOu6wn3y2Li`m&w#9ok|4ie21Yg^RYNTa7GWE|gz~%qC1xHGDcAbOQcDio)Rf$Y zy3Cv?Z#OZ|rs}Ff7oD2gcqb;l>|_glaT$-Wa87>vK<((t5-w$Tb46=A)=fbjgrJuVMi;18HuRmPMC7fYMBox4TQlwcAhJ zfE>;OkH}&m?E%JaC$sGs7?^TBT^vI!POqKvH~vz9$gxUpfkZ~Bc9xw7c+3UDn1p8N z8*J4{VR^wM>~wgG#+6I|{+^TlTlM}&&8t5p+iT0q-hZ~S7CXIv+Epv-tj*SPma*?{ zzOX#M=eoMhH}*5X*~H&;``0Kod%ls-EzN6~u>SK)>4;Q;JX0APz zIQxBVn>>rcwo6P(Tbq5%9-L%keaU^{)e4rHI<=abruku9k2ZM~+G+`YYP`9_Y5UC^ zdGFGbceEyjD_uzDns}h?bBNySl|2Q4N}t@ta`>4&{pZj7s+uam>|u0x;x85#X{pnn z-?;|$2){JGJgwL!J}*T_-}sQjQIF|2w61?>`0MS{visxGwGUmZ=f6D}DkFM&&CX|4 z*LA-Lwj}p8R>~gr63>oLJv=Qx^xYqge#gtLJ6r-&?`U4F-0<`_|HmT*Hn#ibt+>@O zIph1&&`h73dl#>s9bNM@Abe)(I0T5?0HOVx=TFrh1|EOg+6mJp##C3|7 zdV)=z?{&U2p|=h;&Nh7`X6m=q_JF*?!MP^NS`q)h)EVABw$WSbj^*bC!NF6eIXpgi z^52$szuh{Pc@{%H&WlyoIAi2s9NG0QIe8al4_M)lnSI6j0_Adbqx%44NXG~O|6WLtqjez4NR>J42(2S fxua;v%}>cptHiCrxuobfC@*@t`njxgN@xNAd&i{j literal 0 Hc-jL100001 diff --git a/WireGuard/WireGuard/UI/macOS/Assets.xcassets/StatusBarIconDimmed.imageset/StatusBarIconDimmed@3x.png b/WireGuard/WireGuard/UI/macOS/Assets.xcassets/StatusBarIconDimmed.imageset/StatusBarIconDimmed@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..cc5ead92b47d0f0fb0ddf30ae3525280d1814a18 GIT binary patch literal 1581 zc-rd>@N?(olHy`uVBq!ia0vp^P9V&|3?#2~eYgdrSkfJR9T^xl_H+M9WCijWi-X*q z7}lMWc?skwBzpw;GB8xBF)%c=FfjZA3N^f7U???UV0e|lz+g3lfkC`r&aOZkpuXAw zpAc7uQ7}N@|NsB>>kt10vg%5L{DK*nxP?VIxP*)Y^BRgn)R+~c5`0}_3rtv~{OU5; z^&QN$R72y%S#u*ZOYLe4y}fMfbFvuql6~y05(RZFoNHv%E4AJ7#UiRK`GV5pJXMs- z0A_Pp7?f7IG9hknY-A#vsbr&&tcY zXR5a#3;&f%24|J~nJ%5#Gr{S!&g=UAx#pYuJ{_F-cJceehxW|LcczE?^0v+&K0hA6e^n>l1-;Pro1>gl+(K{xxwA#O2!#g@ykDcxU@uW zS5cdMGR5NQ6eW{o@5BrgcUEZyzdTd&pC|U{8p}4l;w|eoeO6;!*m_jL`_zh`O!X(Z z&ZHZj&8Tpd^iG?*QqBBK(QcjWU$>@3cdp70yFO+6>nVnstQ&GN)@Z$%xzcym9bHbR z>pbzd_mywCviJ5PhScYd_3z$QK0IF?c%*%n-2Jo7@p6t%c0tVt`V2oAYrHt7WU4J9 zd{ig7rbT|^+Wg+O`up*+GCBcADqNT@R_~u+chO zv-NC1&9(M!$wjt8PFI*8buTP7%Tp4D`?i$hXpkHXY`oTqqFKj>D87AVe%3_Ce?E2Gcqx9^RjLqcZJ_B*q69b`J5vTXE=erhtk zz^LPXonmL4AG790Zs7^M)8_8`Ebwh@aiNQBgbwS?8|*%_EtoEf?X*xn_x_@H^fmp) z6&YJ}%c9GVC9Qe9OO=CTKdAc7@Arc8(SHgYa5ta85kI8o^nUgkei>9nO2EggL6sIZ&1PE>FVdQ&MBb@ E0D~&&YXATM literal 0 Hc-jL100001 diff --git a/WireGuard/WireGuard/UI/macOS/Assets.xcassets/StatusBarIconDot1.imageset/Contents.json b/WireGuard/WireGuard/UI/macOS/Assets.xcassets/StatusBarIconDot1.imageset/Contents.json new file mode 100644 index 0000000..0024a60 --- /dev/null +++ b/WireGuard/WireGuard/UI/macOS/Assets.xcassets/StatusBarIconDot1.imageset/Contents.json @@ -0,0 +1,26 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "StatusBarIconDot1@1x.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "StatusBarIconDot1@2x.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "filename" : "StatusBarIconDot1@3x.png", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + }, + "properties" : { + "template-rendering-intent" : "template" + } +} \ No newline at end of file diff --git a/WireGuard/WireGuard/UI/macOS/Assets.xcassets/StatusBarIconDot1.imageset/StatusBarIconDot1@1x.png b/WireGuard/WireGuard/UI/macOS/Assets.xcassets/StatusBarIconDot1.imageset/StatusBarIconDot1@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..bbbe0c3f45cbf5fbd8959f5a149f5a43d3e475d1 GIT binary patch literal 953 zc-rd>@N?(olHy`uVBq!ia0vp^Vj#@H3?x5i&EW)6Ea{HEjtmSN`?>!lvI6;x#X;^) z4C~IxyaaL-l0AZa85pY67#JE_7#My5g&JNkFq9fFFuY1&V6d9Oz#v{QXIG#NP@hhK zPlzkSC?F2}|NsB$7R7WRE2$*NFPMRmMN&tJlSkRe+t)%?fZfv1%hgteNz6u@Rm9B4 zky}dNQqFERt&0zz)-C<3kay~w&6T0Qzn1p?o#Hh8Prm4y zZ>!yA&5n{WP%vdP_UG5+kke(|mwXZwy-D8gF3Bc&+o$vUa_?_Y*gj!H#|nv68+NoPY*&$= zFEUFp>5|c=qBAeH8J+6Z*3i<_Ts&*xp@mwfRhKVQInpB#e0{=Ykx5rCJ-c>M^h)#Y zxTyOFE}XdGa`DQU7?*2@E}fE6%E_5LB_$&}eg2du3y!{>G35!1U|E@`S5fKXQvXjM zLOy-+`}DDu?)FK#IZ0 zz|d0Hz);uFG{n%<%GlV-&|KTV)XKoXNb{6CiiX_$l+3hB+!~xqihhGqg{P~Z%Q~lo FCIE;P>iqx! literal 0 Hc-jL100001 diff --git a/WireGuard/WireGuard/UI/macOS/Assets.xcassets/StatusBarIconDot1.imageset/StatusBarIconDot1@2x.png b/WireGuard/WireGuard/UI/macOS/Assets.xcassets/StatusBarIconDot1.imageset/StatusBarIconDot1@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..01b5eb37d0337bff2eeff2c53264f7b363f7c19e GIT binary patch literal 1570 zc-rd>@N?(olHy`uVBq!ia0vp^Iv~u!3?wz9Rv7~+mUKs7M+SzC{oH>NS%G}U;vjb? zhIQv;UIIA^$sR$z3=CCj3=9n|3=F@3LJcn%7)lKo7+xhXFj&oCU=S~uvn$XBsBdS0 zPlzkSC>Vm^|Ns9RpW2B7Srbcw{DK)6S-8bzrTCe6RP?PpoD4Eak-aeD2P-{F@MB#sM;3T!`_px?B|C{@}=Fp))#&wEB}SmUybuA75Sze^2&Tem;! z*1yN|%3oLp8NImj`S7{&=QZCxJ^gKSK6~@u?5%%Tv+{GZ%PnHhUX*?3*Oj)*#`i&v z`|9iN#T-9(zwN!@utD9$P$GGq`I+xOf320>EZ8D&AVNU3?W613mot0=Bt078QLGnc3?m=XkkDq`FJ7 z)?Rq*x75w(uFwy$=4rk?RvLmjCvIMpX=%!6XU#r;G0lF#3`5ZujN9sj@@8&O>%X$6 zW260M`RjIdFFqXUV3{MM$0Ne}V$n6`{Eha3;>MLn4Ep4(&m|g8?|ZH8H}8-}2-A)= zzP``162E62UNbZDPUiOh`G#8Q=NATXJoqf$b81eA@Q<3MT=8?3i|5=@Rnm_SJme7< zqf}Ly$S=J=Dz*2N>Hn_WQ&XX$37D*C`V(f_)_KBxOK7hjuBepMaTs;+J@ZQlC56+2Cs4=Q{O?cVaIs&uaz z-}FDv)+X+${@<7ryz;}x%a3$6Okxg-STNl?Xvz7M!t7j_hg=W5_YA&YOi5$jEUgs z>NZvP5Z~Gc~j3=El^xrLLVt`DQL>edf%2t8!c9 z*Zf!F``BjN2shq;2TabYC9V-ADTyViR>?)FK#IZ0z|d0Hz);uFG{n%<%GlV-&|KTV l)XKoXNb{6CiiX_$l+3hB+!~xqihhG~yr-+5%Q~loCIFUz(2oEB literal 0 Hc-jL100001 diff --git a/WireGuard/WireGuard/UI/macOS/Assets.xcassets/StatusBarIconDot1.imageset/StatusBarIconDot1@3x.png b/WireGuard/WireGuard/UI/macOS/Assets.xcassets/StatusBarIconDot1.imageset/StatusBarIconDot1@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..76afa1567e9ba0126ef647ce7f691a23ec0d3e73 GIT binary patch literal 1744 zc-rd>@N?(olHy`uVBq!ia0vp^P9V&|3?#2~eYgdrSkfJR9T^xl_H+M9WCijWi-X*q z7}lMWc?skwBzpw;GB8xBF)%c=FfjZA3N^f7U???UV0e|lz+g3lfkC`r&aOZkpuXh+ zJ|V6QqhQd3|NsA|1h3o)WObJW`2{mDvh(nAv$Dw>I{UgAi!+IsS?Oz8xF|3S_}H_^ zsw+x~nOO2UIk>BN>#91+*yt%+b4e>{2ugUGdU4w6h#ClK3%8$r^>ACPhk4lRgGrjM z5n2B}PI&*g>H3!wwwD)_udn}|yW|(g_w8#wbY484yjx|T+=`ZhU2TtoZ$Hhe`IfTq z+@aZp{Lg=0kTeoJduSCX2_|{FyY%F6UvdU=I14-?i-EKU7`vU!wqsymZt!$*42d}W zblOj6AxDwp<&FX~r%v%^2?^0-WV96exXk;_1tneX%{p%{Y%;Nav+1zc_xX9{eW??4 z)3?jl?tgQxJl)Rv^RvA(j~6aKRMEWgWXeBzr_C!*UP@whTK%>s&nfP!WvR^ab_|+`4yijYKz=Ab*IU5A}EGm6@?6{Q5deFrZD_QwXnMx+Nv;X^N&9U9)V>Ufs{hY<>e#P4c zeXE@u)DJw~(st4&=@;{!PL>(xSIkb7JJ_@6-cgU)((2NaFI$ydxnwkL!?*tLpM(Wt zFXqnqGHE{dP9LWIewhk9*Os=gzuf-$$oV~gUMBz4oO0*I(r(dm8hujIHaCj?d5S_P;|F;>AF)bsaN(bKeMQ3 zs;KFazfud8>=+IxWpYPE)N-t`?5Jp&YU-|>_;;hnO<@K#mBNWz<~Q+8*?7KV)5VUC z%PfV$4U?XjFa5ixtLbg)qMVg3!Lmt`4bv~BMku}wzx_iXbjn<}mdvScIgAq~Y%A&9 z60h8JeTl|yt#>ufyFahJQh(%p<;D;1Y@L>fr0OqjDp(WxqVz;%qT!k~C(rWB3o7ay z6%G2P7Rvm1vWLX{{SOxO-FWtWf8FoC=K&4NmnSD@KX-SVdf?;k`K}%}OCBD1(LMcT zitPixZ7=?vKehh8_SqPQUwYV|Io2@YOwX(K!;7}8W@6Pi{+#WAnKX0shFN9T z8QztM=g4L$%;4wIV@=>^`5+r_X3+P1v*&}O4>|Tsc04ylsr{p%bYjRluAm)OA6XZs zWgI4ErfRpqo2&Y_T+Ej$yyrN> za<1v$%up6(zqqm%#$F9J&)e-R+}2HpHG}T7b?ZM|wDv$uyoZ>IYu|$zeVSV@N?(olHy`uVBq!ia0vp^Vj#@H3?x5i&EW)6Ea{HEjtmSN`?>!lvI6;x#X;^) z4C~IxyaaL-l0AZa85pY67#JE_7#My5g&JNkFq9fFFuY1&V6d9Oz#v{QXIG#NP@hhK zPlzkSC?F2}|NsB$7R7WRE2$*NFPMRmMN&tJlSkRe+t)%?fZfv1%hgteNz6u@Rm9B4 zky}dNQ&}@ zsz}kzSX|44&7a>ulY`eqPFJH+RS*=tN#5=*$uawMR{=Sk1s;*bK-vS0-A-oP0TnQL zx;TbNTux4CV0Lq3(`o3O**cZidCJ`8$=$Qtr}O)A?{84pK4C-03W-%4cC;vLSCOAD zGD|V(lF_E3GcUFoo$A)s(9+agJZs^hg<4CN=`Bz>(z9lYV{^B6uy?e3Y=HQ~D%)CS zXFcU);b3D^J>S}5?iCyAf+j7UIJGorQt#Rcu|bn;LvGldyyAG{qNe7_n@6wep1dNf z^(OKCJI(ADPjeqDzhF%Ht@QKa`K$H{0iJV3k3I}?>^itfabaT2!%HXZrig?+f7Y3h zz|}d$CG3ohsH`M&N`Xt!qN=!%3&ztFoz#qYLM{BJ-ZpM)k3K6NI>XU1)WFEdj#2s1 zBNySRizPlVGwfti?kjP%oCFLO)e_f;l9a@fRIB8oR3OD*WMF8iYhb8rXc}T@YGrI} qWoWK#U}|MxV5E7<9YsTKeoAIqC2kGQB}KnMNx{?A&t;ucLK6Tl&(|ve literal 0 Hc-jL100001 diff --git a/WireGuard/WireGuard/UI/macOS/Assets.xcassets/StatusBarIconDot2.imageset/StatusBarIconDot2@2x.png b/WireGuard/WireGuard/UI/macOS/Assets.xcassets/StatusBarIconDot2.imageset/StatusBarIconDot2@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..ce00482bf8f15df2f6ffa4b14c0737944a054e41 GIT binary patch literal 1502 zc-rd>@N?(olHy`uVBq!ia0vp^Iv~u!3?wz9Rv7~+mUKs7M+SzC{oH>NS%G}U;vjb? zhIQv;UIIA^$sR$z3=CCj3=9n|3=F@3LJcn%7)lKo7+xhXFj&oCU=S~uvn$XBsBcDq zPlzkSC>VU;|NsBbT^9ZWvf4_5{DK)6S-8bzrTCe6RP?PpoD49-tI2#zi)D%268wHJR*yMvEak-aeD2PztNWh zM2-szPS|$xOPtFNqg3X!u7<`&V;1h^kpUumZ*-^5ioDq!=9a(j;=gz2_P*f%vBS}S zuKc$zbr{1mfwmG|K{dVD*e>0c2WGMBW)6!HE^(jc(HTS~wz4KCvtZXG3 z_e@nht>iX$4wL4JnK^te2lrfV+WNdAjNc&9jk(IlB=xS`)J+{{;v8L0Yq$KkwCqC+ zV??O-x%jGp@h>;-n3VhRd8_vQSS`F` zm#XkjQ|o;XqaGYheO0r2*{PjBgLkxeq)q<0Jy^FOuhr`QUU!ur50i!O-E`eycIeO2 zYkqIL*3{p+cPT~S=jZ8Z5B5ebI%`<}a*fP3UOiK-R|WM;f0S=HPDz zF&ZxnZmoFM>vp-e;85k}HoGY&0xda&7xi!EJHaetv@^!U=ZTN+VHdlXKbT)Q-Ym4U znL4Y}U+yytxB5jFzJEgIoj&b{yc5GO8^)Qn&%VStV}GEWESQvHHT^6LPmUuI*J-nYu_qS?_M$ z%}!Cz$5T0;Tjq2d`NrIHb9%$^*Z&*)+u4)berlJl1}0n864!{5l*E!$tK_0oAjM#0 zU}&jpV5nQMZZDW+0)g}Wt~$( F698Zs(>?$I literal 0 Hc-jL100001 diff --git a/WireGuard/WireGuard/UI/macOS/Assets.xcassets/StatusBarIconDot2.imageset/StatusBarIconDot2@3x.png b/WireGuard/WireGuard/UI/macOS/Assets.xcassets/StatusBarIconDot2.imageset/StatusBarIconDot2@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..82640f7ea12194013576bece93bff36c18654d2d GIT binary patch literal 1676 zc-rd>@N?(olHy`uVBq!ia0vp^P9V&|3?#2~eYgdrSkfJR9T^xl_H+M9WCijWi-X*q z7}lMWc?skwBzpw;GB8xBF)%c=FfjZA3N^f7U???UV0e|lz+g3lfkC`r&aOZkpuR}~ zJ|V6QqhK(B|NsA=_*;|+WVMt8`2{mDvh(nAv$Dw>I{UgAi!+IsS?Oz8xF|3S_}H_^ zsw+x~nOO2UIk>BN>#91+*yt%+b4e>{2ugUGdU4w6h#ClK3x{W=1bCRIUjFxWSCr9ovvDMNww zaz~MqUZMhtjIOL94i0^*R)oH6oVxAav@Ct^?C9vVTfeU@v#&V0mF1}X$!|+PvrYPY zesanrAGb+*ttZuryO(~g=g6HVmc5%-L-w0?o8;VBzU8Z>86Ld*DA86iSIgm<@dmm2 z1>5y+X<>R?{rA|}=nvbKyJk7h zIlV#f`=di|k4{>4cW3qbTN1}>&+=!^51;glGx6k}7*>bqNY;c9cZajC)8e8pdcDqK z7hAq0wO3(Fudjf^TxFMH!9>B=@0AN9i>7NhUY5&w7%9@3w%ahN_k_G%Q_|`$5y@{n z#T4gFde*mDF{$;`e8-Ply*gcOj+=jD&3$jyvqZ0+^C+vh_k}pcL)m-xUgvmt)xDPa zYX0w60>3RfU(IT6;&aTBmhpuKuxUZU;IAltcV> z&fKLS>aaGM(JA}rm9@+=2NfzGcdPl;TTW(p#rZKj-FcF#=j4x?@`+sUGAD(o?-O`s zJW*zm+$VuE^$Vw^tTXWaWmG9v`AWsUs6b%`NJXn?L>RV>=5>_x)zsp9{*T$_c?TJ<9zpPQI=xV6OD5}SHyLH=Ms1! zxqADKh>tG|=O~M~di(#6bc@iad{lX5{nA*KDZ4_mR%TlzvoO3hsJ2Se=6~Yk#yI`V zKgJtgp9NMNG&BKbHq{c>h?11Vl2ohYqEsNoU}RuuscT@UYiJr`Xli9_Y-MP!ZD49; jU|^(q${j^RZhlH;S|x4`&Lu^^K}C?KtDnm{r-UW|R2>;h literal 0 Hc-jL100001 diff --git a/WireGuard/WireGuard/UI/macOS/Assets.xcassets/StatusBarIconDot3.imageset/Contents.json b/WireGuard/WireGuard/UI/macOS/Assets.xcassets/StatusBarIconDot3.imageset/Contents.json new file mode 100644 index 0000000..96da519 --- /dev/null +++ b/WireGuard/WireGuard/UI/macOS/Assets.xcassets/StatusBarIconDot3.imageset/Contents.json @@ -0,0 +1,26 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "StatusBarIconDot3@1x.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "StatusBarIconDot3@2x.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "filename" : "StatusBarIconDot3@3x.png", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + }, + "properties" : { + "template-rendering-intent" : "template" + } +} \ No newline at end of file diff --git a/WireGuard/WireGuard/UI/macOS/Assets.xcassets/StatusBarIconDot3.imageset/StatusBarIconDot3@1x.png b/WireGuard/WireGuard/UI/macOS/Assets.xcassets/StatusBarIconDot3.imageset/StatusBarIconDot3@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..80e221be8e0d75505d73eb559f7774829c5f612c GIT binary patch literal 958 zc-rd>@N?(olHy`uVBq!ia0vp^Vj#@H3?x5i&EW)6Ea{HEjtmSN`?>!lvI6;x#X;^) z4C~IxyaaL-l0AZa85pY67#JE_7#My5g&JNkFq9fFFuY1&V6d9Oz#v{QXIG#NP@jH) zPlzkSC?FdA|NoyUP-{Dom0S|!7tFxOBB`Uq$)jxK?Q0<`z;5a1^4s)Iy?L9j>!abZ{ zYgK+ihRW*o897N>iD`L>nW?;jW*&ZK+a7NA_1iXi!*&n9vI`9y)@s(4+ADXfMDMt@ zW2d@$^$N!p+r4|P?r6=esrkF*4>MD9le0h_4=?xhP_D}z9ajRJS$aZR7WL*#X;KN_ zVX}!|wRP*x%0-ehl9E&>wk(~Y{5a`xBTrw1Uxu2roDE~k&EE#Qh?U9|e>=Ys5) z3%QInR&X6VmZg^DGG}YXq#_mOItGT6RF%`=*A%pXL8MyZ8c~vxSdwa$T$Bo=7>o=I zEp-hHbq!5J3{9@N?(olHy`uVBq!ia0vp^Iv~u!3?wz9Rv7~+mUKs7M+SzC{oH>NS%G}U;vjb? zhIQv;UIIA^$sR$z3=CCj3=9n|3=F@3LJcn%7)lKo7+xhXFj&oCU=S~uvn$XBsBcDq zPlzkSC>VU;|NsBbT^9ZWvf4_5{DK)6S-8bzrTCe6RP?PpoD4ef8XRj4dieZctjQhX%8@VJDF|Az`(TC)5S5w;`G`nzr%$B z1&#}fij;?keOEd))%V-MP#3wzF77u`cH2Bo&s(-Mb(tss>3gY5Gk=$xmme(Nz|1{& z*8FF8KHt3g{_nXvg**S5-ulN>y1l%lYESIii+A_QwLPu+tNWm)ygJ@qTR}vkz&yFR z*;%peumtzv#E(w@J2ofTH3=|DcyBsX_;;1Dtg6US7cPUv$;y4_j<6jzla}gtU;J43 z+$`afBB4D&2g73CdBvx!?7H_ZEQc@6W|2c{$(C!LcACmPnUdmjm7E(Jr;7Dl=3s%>g$Z{puf1buF<;DRd&)dzcTLMCv;Hl6dI}dj@bbUf&h7fZ zBSK!+>w;@Cho0t{xLr2ae=cW8u1hpz5`7wDl@>R1Z&%=omJ4r8Pj8ww?d#`zar+b3 z-r2)i(0|+a^X>8g&6fA~Hou9`y>f_cZNlAn;U`}=|8dmnkq?W=PTnjwZ~J*UTeUaW zBLAtlZkr$WaO&Ksip1&jY;P+si8(ueed@>V>7f%`9OU6lTNJ!_8Iu{Tw}Z-0om zrxW^sd8t@l@V$N2{~aekXgl@j+j0N-`)foE9#u`#*5bQ;zIyw)C2keWHPgI)ZGT_= zfqzNGtuI%5r!H+iT(NhZiq8?LISrZq9W(n^uRHYY+?+}4?mNHV60u~j+oYe1RW_%# zcZLbO7f$ALEBmFvB){-cnDaM_ARQ?MhYNpK&3f6&^HiGm%f^oSX-)<^{dBvyZQ44GN>Z=uO|Ag`bX4-Mtx9*+V9I?_cW@Df8 zjF9xdCJdKrUoo(|zIZrct@2vuhl$61gO^2L{B!lXxao^UofhvT=S@52a#`icgFBH2 zDsKGUCjX;zwWo@UQ(y~=+U1&?A5#O9Q(HgEn!D!u@A-F`<-X9b`H##`KbrdL#GJg} zz?7_7;u=wsl30>zm0Xkxq!^403@vpH40R1nLkvx=jE$`f&9x0otqcr|G*7vsXvob^ Y$xN%nt--mZ2xJ3;r>mdKI;Vst04-YHBme*a literal 0 Hc-jL100001 diff --git a/WireGuard/WireGuard/UI/macOS/Assets.xcassets/StatusBarIconDot3.imageset/StatusBarIconDot3@3x.png b/WireGuard/WireGuard/UI/macOS/Assets.xcassets/StatusBarIconDot3.imageset/StatusBarIconDot3@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..10e43d99b7e9b2edbeddb9b907d67737d2c81ab9 GIT binary patch literal 1677 zc-rd>@N?(olHy`uVBq!ia0vp^P9V&|3?#2~eYgdrSkfJR9T^xl_H+M9WCijWi-X*q z7}lMWc?skwBzpw;GB8xBF)%c=FfjZA3N^f7U???UV0e|lz+g3lfkC`r&aOZkpuWxk zpAc7uQ7{O=|Ns9#)J?q%WHpuq`2{mDvh(nAv$Dw>I{UgAi!+IsS?Oz8xF|3S_}H_^ zsw+x~nOO2UIk>BN>#91+*yt%+b4e>{2ugUGdU4w6h#ClK3-f!JAOH7puBK~5@Ya|9 z6W(8c-1Pgh?Sh)Cxi=EmgfBmzb>xuBKDm@#vs(hbK76#U{MYTLdDA<0uP9u2PSS`Y zL-s-pC}|~mySp@XZ~pHBvL>2>S4={E+nQh0wz?|yo;usQf`02FQ&bJH%4%}Ai z+G51&qOqdEMnqu3ahDqAzLlRF^ZL%de6~#b^4|OYTmS#`m^>w9*ToX~z5EyMeXZLW zQ*_es%vOPE#-%fN|8KvL{BF~isLF-s%MKeXu0QaufbWydd#NJnwh9>~{qE}rYHAKE zFaFn{dqP=~+mI(!W1E5hiH6C~TRpCv3^Ke?xG(nD%SQ?79_isc9&?Oj1w$Dgx*YMF z9$aR0^OQ@L&0N3Z%X30nY5q0UzR#pc%&!) zgWjHld(;m1ypuelAvM>hxbSgBV$qg$o2T8|*;1NgcR{K!)?|AXMH@S?W({fdI7ye%C$`Q|C@lJgf;vYY<-Ew(@_^W9f| z`NofzMb>e1vzyM}@8GJk;c8ON)qBx>`Sw7kj;=YHVDe>(rUNXt7T^A!wl>g;zt)}G^6Z#MhMQMOOw;?6ymt^ALJDcsPB- z?Jq)XPg&lpyi=NgX8!D(yWTud(aFe~JG=0+fRDr;m(MM!oJwD|*KD}-jMG<4=}YRi8wlwz(z6m-7XVxq-Sor8_|APhYhAsE^1|(kWPYCD~k^c0=dqt-9i+B37gbw-k zJ&5Sj-1~!rmGQmdR+SgC{I~Dz4Op0KTN^I<&`6c>%Xuv)eP1n6&Fy{bcCHa*m~i^e z(J5Qy&b0S1t(*CWac1`WM;yYcY`~nSTH+c}l9E`GYL#4+3Zxi}3=A!G4GeV+O+yS# ut&EMW49&F-OsxzIj5JTVqiD#@PsvQH#I3=(r06%OF!FTub6Mw<&;$Sjb0w1i literal 0 Hc-jL100001 diff --git a/WireGuard/WireGuard/UI/macOS/Assets.xcassets/WireGuardMacStatusBarIcon.imageset/WireGuardMacStatusBarIcon@1x.png b/WireGuard/WireGuard/UI/macOS/Assets.xcassets/WireGuardMacStatusBarIcon.imageset/WireGuardMacStatusBarIcon@1x.png deleted file mode 100644 index 1a7d77cb90c859c23a6ae7d7582ea04bbb7c9e89..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 990 zc-rd>@N?(olHy`uVBq!ia0vp^Vj#@H3?x5i&EW)6Ea{HEjtmSN`?>!lvI6;x#X;^) z4C~IxyaaL-l0AZa85pY67#JE_7#My5g&JNkFq9fFFuY1&V6d9Oz#v{QXIG#NP+v@d zPlzkSD4-4a|Np;K@GB`GtEeQ%FPMRmJD@8=S|xYEm*1Ns4aE2Ucz&jm-Tm0ViPo0F zTrS(L_%Sod2haWVzJ!hA=H>nVsb7EHe){^{Ou;_Gqh}W?nN+>IDv`o^{ri2L?k8;@ z(Hy z<=*cQIB~&*4ILV*Hq6-3(z0aA7M@v(n~FZ&;p+0rSaeFOXjRrLsaa7Pi*CtSHO1_z zdiCm;#v!&gw_|Fq%hFt*omeFH$aPvy*fk+D*KH>bm8nU6CyGzB-rAuW#tfpO~;9QlRT_v$NCTLr;~J7B5Pk;IcKMC8_(- zBS|5l?mZJ)geOf3?h0z;IlIW@ihz&)sR!vECtLz~St4%=6bP|u#9uCA_$ ziV}_|!UJYZUUQ~FoPojgi^iL0GB@OazE>@AjVMV;EJ?LWE=mPb3`Pcq7P^K;x<(cu whL%=FMpgz!+6HD;1_q6W?dd2Qa`RI%(<*Um_>g0N8@N?(olHy`uVBq!ia0vp^Iv~u!3?wz9Rv7~+mUKs7M+SzC{oH>NS%G}U;vjb? zhIQv;UIIA^$sR$z3=CCj3=9n|3=F@3LJcn%7)lKo7+xhXFj&oCU=S~uvn$Ysfq}_6 zz$e6&VHAu43c&yW|Ia1PUkGIFFA4GsW?*8Ib&l{>XVI*lx$D`5DVBl?`kk-;KF(n0 zuR64E`=3jzI_gvynZLexaGxXW`_ET<+Kj|c6nSm>@$J#PTYkmQAAY(q*Zl79gO|5Ovi7M8NF?4nb~sk(?7u~PnMeJDlz&~l zZK(a;W`k6!>DsqDYWCmM37PLEcVbPP-G@2L4UTUvoMv!UE-ll%%x8)a2(1ex~Z;=KT8d`xyjJv9``=b#*!V?Y;Q)2`Wp%yrSH~ z`uywu*HzlFx~is%hSqdlow4(~bHlD(ZOf*0nAL4AEjgI=^y?Si3ZC8%R(Eb33E^3C z?aZA+mrmVcTfcD?)19Iyg{#}jTw0_j@14-BeB!9zxg#u_7j&>`FDfGE;_mU;t=kt<=Wz8OqfbSwjKmXp9W^l_sb>OwA-YnH?rUpPL`>YiX@78M z_Owi%lV$0X^zE=?j?9I-i{4p?9#>}&Rn1aWUEQ2ya8yJ>W#x`5%Q_jZ9$Au}l9u|M zA#!J>gOdF8M@@(R{_gJbZqPY)NnpXFO@Duvo-WiZyLMy${f$g#*67@c7Y*54U+=4{ zceHfT@9)>m8)im&{yr?d`rCW{Lo=ObIW>MWYo4iV8MQXoVV>%_0~(p^zgC>#n4xsZ z$||_w+8h5hWy&ZF40ks#_RlXh2*@pwpU3fLI_oNqnFfa2d1Z7TP5zKJ`Q*vp z%RhvKH%<-H^m%)5{@%S(Pm2zCIZs+H`J+4Pq36ZS%fY2-4O6zAonvY(HG{F}*@F=4 z>l;qz%Ne}ty7P?tmVN}sr?u?sSoV4Z=KOzj)S=k=;Lh_Eo)`c9y;^$Xs+XQ9_cwn= zwVxAG1MYufN}kWV`_WVFLn=~XOw776v*a2A`;4!y6=G`B;`aDhvO+wip-cTCr`2Mq z1;$~{H*^lT>`2pD7~86{?)FK#IZ0z|cb1&`8(F xBE-~Dkey{D_6%Q~loCIDH%;wAt9 diff --git a/WireGuard/WireGuard/UI/macOS/Assets.xcassets/WireGuardMacStatusBarIcon.imageset/WireGuardMacStatusBarIcon@3x.png b/WireGuard/WireGuard/UI/macOS/Assets.xcassets/WireGuardMacStatusBarIcon.imageset/WireGuardMacStatusBarIcon@3x.png deleted file mode 100644 index e1bcc3513cab4f8729f2c7372f46ac3447c8b4c3..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc-jL100001 literal 1956 zc-rd>@N?(olHy`uVBq!ia0vp^P9V&|3?#2~eYgdrSkfJR9T^xl_H+M9WCijWi-X*q z7}lMWc?skwBzpw;GB8xBF)%c=FfjZA3N^f7U???UV0e|lz+g3lfkC`r&aOZk1_q|A z0G|+7hEXsIXb=AX|L>qKpaEo^DGBlmX5bOvX5_c2+5X|{*$KuW8)f zf~V=rl-)|s$EbKzvpqV)`dDw$ld?Y3tA0vh&G!UPy8k$km1@^;z4VR0?Zc+`&i0?S zsV+GpviI}Gs)I{!&9d@Vvk(fL|5|#Be7^cO6Q@0M1)puG24%w}Z+Dloxfd3LvJ_{5 zM`SUO_5fqIli79*49o$ZE{-7)ho4RlcNTUOXy9jQ5io4fWo)^yl*NUkgHfeJP((9H zK!kCri`6$a4zpPrVl09o8xr(8c%$Dut(!7^?%vaaayM+{XST-uSjOJduBB&c`cqH1JDhPe(%2GaEe#8=b6T?oHc-6#X0?`=NLOkgfx^HxPdV`c)+AlqGw0M6eOC#J=urbl<;;VIec5`iW!a2`;no!)*!B#P; zgm=Z>=lWkBP74$en$f*uhFis5@ z|IA!X`n2C5%s2RA+B&dH8HDOhRXaQ6O&yyZ;K%8OWxdGww!E&1!g`c=KsY^V5v z?XGL8e=nI9{!4@7kia}OTQ{wi#jkmq-iV7fzK)1?dywzNbX;SW+l61j!WJvH^6fuo zvhu&t>!$xI{w2r$=1#8bnjid$Kd0;bqN(WyhQLgwTH+c}l9E`GYL#4+3Zxi}3=A!F z4UKe-EJ6$|t&EJU42-l5%&ZIy8V%diQ8eV{r(~v8;@0pX$Nn~`2=jFHb6Mw<&;$V8 CZ$9P# diff --git a/WireGuard/WireGuard/UI/macOS/StatusItemController.swift b/WireGuard/WireGuard/UI/macOS/StatusItemController.swift new file mode 100644 index 0000000..2568c15 --- /dev/null +++ b/WireGuard/WireGuard/UI/macOS/StatusItemController.swift @@ -0,0 +1,66 @@ +// SPDX-License-Identifier: MIT +// Copyright © 2018-2019 WireGuard LLC. All Rights Reserved. + +import Cocoa + +class StatusItemController { + var currentTunnel: TunnelContainer? { + didSet { + updateStatusItemImage() + } + } + + let statusItem = NSStatusBar.system.statusItem(withLength: NSStatusItem.squareLength) + private let statusBarImageWhenActive = NSImage(named: "StatusBarIcon")! + private let statusBarImageWhenInactive = NSImage(named: "StatusBarIconDimmed")! + + private let animationImages = [ + NSImage(named: "StatusBarIconDot1")!, + NSImage(named: "StatusBarIconDot2")!, + NSImage(named: "StatusBarIconDot3")! + ] + private var animationImageIndex: Int = 0 + private var animationTimer: Timer? + + init() { + updateStatusItemImage() + } + + func updateStatusItemImage() { + guard let currentTunnel = currentTunnel else { + stopActivatingAnimation() + statusItem.button?.image = statusBarImageWhenInactive + return + } + switch currentTunnel.status { + case .inactive: + stopActivatingAnimation() + statusItem.button?.image = statusBarImageWhenInactive + case .active: + stopActivatingAnimation() + statusItem.button?.image = statusBarImageWhenActive + case .activating, .waiting, .reasserting, .restarting: + startActivatingAnimation() + case .deactivating: + break + } + } + + func startActivatingAnimation() { + guard animationTimer == nil else { return } + let timer = Timer(timeInterval: 0.3, repeats: true) { [weak self] _ in + guard let self = self else { return } + self.statusItem.button?.image = self.animationImages[self.animationImageIndex] + self.animationImageIndex = (self.animationImageIndex + 1) % self.animationImages.count + } + RunLoop.main.add(timer, forMode: .default) + animationTimer = timer + } + + func stopActivatingAnimation() { + guard let timer = self.animationTimer else { return } + timer.invalidate() + animationTimer = nil + animationImageIndex = 0 + } +} diff --git a/WireGuard/WireGuard/UI/macOS/StatusMenu.swift b/WireGuard/WireGuard/UI/macOS/StatusMenu.swift index 78e71ba..a2f02d8 100644 --- a/WireGuard/WireGuard/UI/macOS/StatusMenu.swift +++ b/WireGuard/WireGuard/UI/macOS/StatusMenu.swift @@ -13,6 +13,8 @@ class StatusMenu: NSMenu { var firstTunnelMenuItemIndex = 0 var numberOfTunnelMenuItems = 0 + @objc dynamic var currentTunnel: TunnelContainer? + var manageTunnelsRootVC: ManageTunnelsRootViewController? lazy var manageTunnelsWindow: NSWindow = { manageTunnelsRootVC = ManageTunnelsRootViewController(tunnelsManager: tunnelsManager) @@ -30,7 +32,11 @@ class StatusMenu: NSMenu { addStatusMenuItems() addItem(NSMenuItem.separator()) for index in 0 ..< tunnelsManager.numberOfTunnels() { - let isUpdated = updateStatusMenuItems(with: tunnelsManager.tunnel(at: index), ignoreInactive: true) + let tunnel = tunnelsManager.tunnel(at: index) + if tunnel.status != .inactive { + currentTunnel = tunnel + } + let isUpdated = updateStatusMenuItems(with: tunnel, ignoreInactive: true) if isUpdated { break } @@ -176,6 +182,13 @@ extension StatusMenu { updateTunnelMenuItem(menuItem) let statusObservationToken = tunnel.observe(\.status) { [weak self] tunnel, _ in updateTunnelMenuItem(menuItem) + if tunnel.status == .deactivating || tunnel.status == .inactive { + if self?.currentTunnel == tunnel { + self?.currentTunnel = self?.tunnelsManager.waitingTunnel() + } + } else { + self?.currentTunnel = tunnel + } self?.updateStatusMenuItems(with: tunnel, ignoreInactive: false) } tunnelStatusObservers.insert(statusObservationToken, at: tunnelIndex) -- 2.47.2