// // NSApplication+LoginItem.m // Enjoyable // // Created by Joe Wreschnig on 3/13/13. // // #import "NSRunningApplication+LoginItem.h" #import static const UInt32 RESOLVE_FLAGS = kLSSharedFileListNoUserInteraction | kLSSharedFileListDoNotMountVolumes; @implementation NSRunningApplication (LoginItem) - (BOOL)isLoginItem { LSSharedFileListRef loginItems = LSSharedFileListCreate( NULL, kLSSharedFileListSessionLoginItems, NULL); NSURL *myURL = self.bundleURL; BOOL found = NO; UInt32 seed = 0; NSArray *currentLoginItems = CFBridgingRelease( LSSharedFileListCopySnapshot(loginItems, &seed)); for (id obj in currentLoginItems) { LSSharedFileListItemRef item = (__bridge LSSharedFileListItemRef)obj; CFURLRef itemURL = NULL; if (!LSSharedFileListItemResolve(item, RESOLVE_FLAGS, &itemURL, NULL)) { found = CFEqual(itemURL, (__bridge CFURLRef)myURL); CFRelease(itemURL); } if (found) break; } CFRelease(loginItems); return found; } - (void)addToLoginItems { if (!self.isLoginItem) { NSURL *myURL = self.bundleURL; LSSharedFileListRef loginItems = LSSharedFileListCreate( NULL, kLSSharedFileListSessionLoginItems, NULL); LSSharedFileListInsertItemURL( loginItems, kLSSharedFileListItemBeforeFirst, NULL, NULL, (__bridge CFURLRef)myURL, NULL, NULL); CFRelease(loginItems); } } - (void)removeFromLoginItems { LSSharedFileListRef loginItems = LSSharedFileListCreate( NULL, kLSSharedFileListSessionLoginItems, NULL); NSURL *myURL = self.bundleURL; UInt32 seed = 0; NSArray *currentLoginItems = CFBridgingRelease( LSSharedFileListCopySnapshot(loginItems, &seed)); for (id obj in currentLoginItems) { LSSharedFileListItemRef item = (__bridge LSSharedFileListItemRef)obj; CFURLRef itemURL = NULL; if (!LSSharedFileListItemResolve(item, RESOLVE_FLAGS, &itemURL, NULL)) { if (CFEqual(itemURL, (__bridge CFURLRef)myURL)) LSSharedFileListItemRemove(loginItems, item); CFRelease(itemURL); } } CFRelease(loginItems); } - (BOOL)wasLaunchedAsLoginItemOrResume { ProcessSerialNumber psn = { 0, kCurrentProcess }; NSDictionary *processInfo = CFBridgingRelease( ProcessInformationCopyDictionary( &psn, kProcessDictionaryIncludeAllInformationMask)); long long parent = [processInfo[@"ParentPSN"] longLongValue]; ProcessSerialNumber parentPsn = { (parent >> 32) & 0x00000000FFFFFFFFLL, parent & 0x00000000FFFFFFFFLL }; NSDictionary *parentInfo = CFBridgingRelease( ProcessInformationCopyDictionary( &parentPsn, kProcessDictionaryIncludeAllInformationMask)); return [parentInfo[@"FileCreator"] isEqualToString:@"lgnw"]; } @end