]> git.ipfire.org Git - thirdparty/wireguard-apple.git/commitdiff
macOS: Don't show manage window when launched at login
authorRoopesh Chander <roop@roopc.net>
Mon, 20 May 2019 08:34:47 +0000 (14:04 +0530)
committerRoopesh Chander <roop@roopc.net>
Mon, 20 May 2019 11:12:28 +0000 (16:42 +0530)
Signed-off-by: Roopesh Chander <roop@roopc.net>
WireGuard/WireGuard.xcodeproj/project.pbxproj
WireGuard/WireGuard/UI/macOS/AppDelegate.swift
WireGuard/WireGuard/UI/macOS/LaunchedAtLoginDetector.swift [new file with mode: 0644]
WireGuard/WireGuard/UI/macOS/LoginItemHelper/Info.plist
WireGuard/WireGuard/UI/macOS/LoginItemHelper/main.m

index c59bbb1a2597e557a104f8f4b58f82f2d1ce3a61..ead155671f35a4358d08e453e01c4499340e87f8 100644 (file)
@@ -68,6 +68,7 @@
                6F628C3D217F09E9003482A3 /* TunnelViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6F628C3C217F09E9003482A3 /* TunnelViewModel.swift */; };
                6F628C3F217F3413003482A3 /* DNSServer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6F628C3E217F3413003482A3 /* DNSServer.swift */; };
                6F628C41217F47DB003482A3 /* TunnelDetailTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6F628C40217F47DB003482A3 /* TunnelDetailTableViewController.swift */; };
+               6F6483E7229293300075BA15 /* LaunchedAtLoginDetector.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6F6483E6229293300075BA15 /* LaunchedAtLoginDetector.swift */; };
                6F6899A62180447E0012E523 /* x25519.c in Sources */ = {isa = PBXBuildFile; fileRef = 6F6899A52180447E0012E523 /* x25519.c */; };
                6F6899A8218044FC0012E523 /* Curve25519.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6F6899A7218044FC0012E523 /* Curve25519.swift */; };
                6F693A562179E556008551C1 /* Endpoint.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6F693A552179E556008551C1 /* Endpoint.swift */; };
                6F628C3C217F09E9003482A3 /* TunnelViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TunnelViewModel.swift; sourceTree = "<group>"; };
                6F628C3E217F3413003482A3 /* DNSServer.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DNSServer.swift; sourceTree = "<group>"; };
                6F628C40217F47DB003482A3 /* TunnelDetailTableViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TunnelDetailTableViewController.swift; sourceTree = "<group>"; };
+               6F6483E6229293300075BA15 /* LaunchedAtLoginDetector.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LaunchedAtLoginDetector.swift; sourceTree = "<group>"; };
                6F689999218043390012E523 /* WireGuard-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "WireGuard-Bridging-Header.h"; sourceTree = "<group>"; };
                6F6899A42180447E0012E523 /* x25519.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = x25519.h; sourceTree = "<group>"; };
                6F6899A52180447E0012E523 /* x25519.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = x25519.c; sourceTree = "<group>"; };
                                6FBA104121D6BC210051C35F /* ErrorPresenter.swift */,
                                6FCD99AE21E0EA1700BA4C82 /* ImportPanelPresenter.swift */,
                                6F2449E7226587B80047B9E9 /* MacAppStoreUpdateDetector.swift */,
+                               6F6483E6229293300075BA15 /* LaunchedAtLoginDetector.swift */,
                                6FB1BD6121D2607E00A991BF /* Assets.xcassets */,
                                6FB1BD6621D2607E00A991BF /* Info.plist */,
                                6FB1BD6721D2607E00A991BF /* WireGuard.entitlements */,
                                6F3E02E9228000F6001FE7E3 /* MainMenu.swift in Sources */,
                                5F52D0BF21E3788900283CEA /* NSColor+Hex.swift in Sources */,
                                6FB1BDBE21D50F0200A991BF /* Logger.swift in Sources */,
+                               6F6483E7229293300075BA15 /* LaunchedAtLoginDetector.swift in Sources */,
                                6FB1BDBF21D50F0200A991BF /* TunnelConfiguration+WgQuickConfig.swift in Sources */,
                                6FADE96C2254B8C300B838A4 /* UnusableTunnelDetailViewController.swift in Sources */,
                                6FFACD2021E4D8D500E9A2A5 /* ParseError+WireGuardAppError.swift in Sources */,
index a68e08abaf4ad598467cc9f634dd4dd78ff10579..0860166362193bb77086d503124cd91c83d03eb4 100644 (file)
@@ -18,7 +18,14 @@ class AppDelegate: NSObject, NSApplicationDelegate {
         Logger.configureGlobal(tagged: "APP", withFilePath: FileManager.logFileURL?.path)
         registerLoginItem(shouldLaunchAtLogin: true)
 
-        NSApp.setActivationPolicy(.regular)
+        var isLaunchedAtLogin = false
+        if let appleEvent = NSAppleEventManager.shared().currentAppleEvent {
+            isLaunchedAtLogin = LaunchedAtLoginDetector.isLaunchedAtLogin(openAppleEvent: appleEvent)
+        }
+
+        if !isLaunchedAtLogin {
+            NSApp.setActivationPolicy(.regular)
+        }
         NSApp.mainMenu = MainMenu()
 
         TunnelsManager.create { [weak self] result in
@@ -42,7 +49,9 @@ class AppDelegate: NSObject, NSApplicationDelegate {
                 self.tunnelsTracker = tunnelsTracker
                 self.statusItemController = statusItemController
 
-                self.showManageTunnelsWindow(completion: nil)
+                if !isLaunchedAtLogin {
+                    self.showManageTunnelsWindow(completion: nil)
+                }
             }
         }
     }
diff --git a/WireGuard/WireGuard/UI/macOS/LaunchedAtLoginDetector.swift b/WireGuard/WireGuard/UI/macOS/LaunchedAtLoginDetector.swift
new file mode 100644 (file)
index 0000000..53a4dae
--- /dev/null
@@ -0,0 +1,21 @@
+// SPDX-License-Identifier: MIT
+// Copyright © 2018-2019 WireGuard LLC. All Rights Reserved.
+
+import Cocoa
+
+class LaunchedAtLoginDetector {
+    static func isLaunchedAtLogin(openAppleEvent: NSAppleEventDescriptor) -> Bool {
+        let launchCode = "LaunchedByWireGuardLoginItemHelper"
+        guard isOpenEvent(openAppleEvent) else { return false }
+        guard let propData = openAppleEvent.paramDescriptor(forKeyword: keyAEPropData) else { return false }
+        return propData.stringValue == launchCode
+    }
+}
+
+private func isOpenEvent(_ event: NSAppleEventDescriptor) -> Bool {
+    if let eventClassDescriptor = event.attributeDescriptor(forKeyword: keyEventClassAttr),
+        let eventIdDescriptor = event.attributeDescriptor(forKeyword: keyEventIDAttr) {
+        return eventClassDescriptor.typeCodeValue == kCoreEventClass && eventIdDescriptor.typeCodeValue == kAEOpenApplication
+    }
+    return false
+}
index f7bcf8d95c02939e41f3fb5bcc0bf01794ecd3fa..7ddff91840d8cd9182019ca9eda286971ea05494 100644 (file)
@@ -30,5 +30,7 @@
        <string>NSApplication</string>
        <key>LSBackgroundOnly</key>
        <true/>
+       <key>com.wireguard.macos.app_id</key>
+       <string>$(APP_ID_MACOS)</string>
 </dict>
 </plist>
index 51b73fd2b81f9d093c9759ce29f888ecc7468ade..1010b496718193012aaeeaa0f1d431e6355ba402 100644 (file)
@@ -5,12 +5,13 @@
 
 int main(int argc, char *argv[])
 {
-    NSURL *bundleURL = [NSBundle.mainBundle bundleURL];
+    NSString *appIdInfoDictionaryKey = @"com.wireguard.macos.app_id";
+    NSString *appId = [NSBundle.mainBundle objectForInfoDictionaryKey:appIdInfoDictionaryKey];
 
-    // From <path>/WireGuard.app/Contents/Library/LoginItems/WireGuardLoginItemHelper.app, derive <path>/WireGuard.app
-    for (int i = 0; i < 4; ++i)
-        bundleURL = [bundleURL URLByDeletingLastPathComponent];
+    NSString *launchCode = @"LaunchedByWireGuardLoginItemHelper";
+    NSAppleEventDescriptor *paramDescriptor = [NSAppleEventDescriptor descriptorWithString:launchCode];
 
-    [NSWorkspace.sharedWorkspace launchApplication:[bundleURL path]];
+    [NSWorkspace.sharedWorkspace launchAppWithBundleIdentifier:appId options:NSWorkspaceLaunchWithoutActivation
+                                additionalEventParamDescriptor:paramDescriptor launchIdentifier:NULL];
     return 0;
 }