Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP

Loading…

Fix for Login Items #1055

Merged
merged 2 commits into from

3 participants

@skurfer
Owner

This should fix

  • The “Start at login” preference (issue #831)
  • The “Open at Login” action
  • The “Do Not Open at Login” action

I’ve added LaunchAtLoginController as a submodule, but we may need to reconsider that. See Mozketo/LaunchAtLoginController#6. So as it stands now, if this were to be merged, every Quicksilver developer will have to make the change locally (until we go to ARC and 64-bit only).

I’m considering a pull request, but the only other pull request has been open for a year, so there’s no telling if the fix would ever get merged. So if we don’t like the way it is now, we could fork the project and use our fork as the submodule, or since it’s just two files, we could copy the files into the repo and be done with it. Thoughts?

UPDATE

After discussing with @pjrobertson, I've just added the files to the repo (with the fix included). This should be ready.

skurfer added some commits
@skurfer
Owner

Note: This will cause a merge conflict with #1056 as they both add new files to the Xcode project, but it's easy to resolve. There are two conflicts in Quicksilver.xcodeproj/project.pbxproj. For both of them, just accept the changes on both sides.

@HenningJ
Owner

Tested this on 10.6. and it works great :-)

@pjrobertson
Owner

Great. Merging... let's get ß70 out!

@pjrobertson pjrobertson merged commit 19beed0 into quicksilver:master
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Commits on Aug 20, 2012
  1. @skurfer
Commits on Aug 21, 2012
  1. @skurfer

    * removing LaunchAtLoginController submodule

    skurfer authored
    * adding LaunchAtLoginController files to the repo
    
    We did this to incorporate a one-line fix for Mozketo/LaunchAtLoginController#6
This page is out of date. Refresh to see the latest.
View
11 Quicksilver/Code-App/QSMainPreferencePanes.m
@@ -16,7 +16,6 @@
#import "QSNotifications.h"
#import "QSController.h"
-#import "QSLoginItemFunctions.h"
#import "QSInterfaceMediator.h"
#import "QSPreferenceKeys.h"
@@ -38,6 +37,7 @@
#import "NSIndexSet+Extensions.h"
#import "QSPlugInManager.h"
#import "QSPlugIn.h"
+#import "LaunchAtLoginController.h"
@interface QSPreferencePane (Helper)
- (void)selectItemInPopUp:(NSPopUpButton *)popUp representedObject:(id)object;
@@ -244,11 +244,16 @@ - (NSNumber *)panePriority {
}
- (BOOL)shouldLaunchAtLogin {
- return QSItemShouldLaunchAtLogin([[NSBundle mainBundle] bundlePath]);
+ LaunchAtLoginController *launchController = [[LaunchAtLoginController alloc] init];
+ BOOL shouldLaunch = [launchController willLaunchAtLogin:[[NSBundle mainBundle] bundleURL]];
+ [launchController release];
+ return shouldLaunch;
}
- (void)setShouldLaunchAtLogin:(BOOL)launch {
- QSSetItemShouldLaunchAtLogin([[NSBundle mainBundle] bundlePath] ,launch, NO);
+ LaunchAtLoginController *launchController = [[LaunchAtLoginController alloc] init];
+ [launchController setLaunchAtLogin:launch forURL:[[NSBundle mainBundle] bundleURL]];
+ [launchController release];
}
- (BOOL)dockIconIsHidden {
View
34 Quicksilver/Code-External/LaunchAtLoginController/LaunchAtLoginController.h
@@ -0,0 +1,34 @@
+//
+// LaunchAtLoginController.h
+//
+// Copyright 2011 Tomáš Znamenáček
+// Copyright 2010 Ben Clark-Robinson
+//
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the ‘Software’),
+// to deal in the Software without restriction, including without limitation
+// the rights to use, copy, modify, merge, publish, distribute, sublicense,
+// and/or sell copies of the Software, and to permit persons to whom the
+// Software is furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be
+// included in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED ‘AS IS’, WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+// CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+// SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+@interface LaunchAtLoginController : NSObject {
+ LSSharedFileListRef loginItems;
+}
+
+@property(assign) BOOL launchAtLogin;
+
+- (BOOL) willLaunchAtLogin: (NSURL*) itemURL;
+- (void) setLaunchAtLogin: (BOOL) enabled forURL: (NSURL*) itemURL;
+
+@end
View
122 Quicksilver/Code-External/LaunchAtLoginController/LaunchAtLoginController.m
@@ -0,0 +1,122 @@
+//
+// LaunchAtLoginController.m
+//
+// Copyright 2011 Tomáš Znamenáček
+// Copyright 2010 Ben Clark-Robinson
+//
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the ‘Software’),
+// to deal in the Software without restriction, including without limitation
+// the rights to use, copy, modify, merge, publish, distribute, sublicense,
+// and/or sell copies of the Software, and to permit persons to whom the
+// Software is furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be
+// included in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED ‘AS IS’, WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+// CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+// SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+#import "LaunchAtLoginController.h"
+
+static NSString *const StartAtLoginKey = @"launchAtLogin";
+
+@interface LaunchAtLoginController ()
+@property(assign) LSSharedFileListRef loginItems;
+@end
+
+@implementation LaunchAtLoginController
+@synthesize loginItems;
+
+#pragma mark Change Observing
+
+void sharedFileListDidChange(LSSharedFileListRef inList, void *context)
+{
+ LaunchAtLoginController *self = (id) context;
+ [self willChangeValueForKey:StartAtLoginKey];
+ [self didChangeValueForKey:StartAtLoginKey];
+}
+
+#pragma mark Initialization
+
+- (id) init
+{
+ [super init];
+ loginItems = LSSharedFileListCreate(NULL, kLSSharedFileListSessionLoginItems, NULL);
+ LSSharedFileListAddObserver(loginItems, CFRunLoopGetMain(),
+ (CFStringRef)NSDefaultRunLoopMode, sharedFileListDidChange, self);
+ return self;
+}
+
+- (void) dealloc
+{
+ LSSharedFileListRemoveObserver(loginItems, CFRunLoopGetMain(),
+ (CFStringRef)NSDefaultRunLoopMode, sharedFileListDidChange, self);
+ CFRelease(loginItems);
+ [super dealloc];
+}
+
+#pragma mark Launch List Control
+
+- (LSSharedFileListItemRef) findItemWithURL: (NSURL*) wantedURL inFileList: (LSSharedFileListRef) fileList
+{
+ if (wantedURL == NULL || fileList == NULL)
+ return NULL;
+
+ NSArray *listSnapshot = [NSMakeCollectable(LSSharedFileListCopySnapshot(fileList, NULL)) autorelease];
+ for (id itemObject in listSnapshot) {
+ LSSharedFileListItemRef item = (LSSharedFileListItemRef) itemObject;
+ UInt32 resolutionFlags = kLSSharedFileListNoUserInteraction | kLSSharedFileListDoNotMountVolumes;
+ CFURLRef currentItemURL = NULL;
+ LSSharedFileListItemResolve(item, resolutionFlags, &currentItemURL, NULL);
+ if (currentItemURL && CFEqual(currentItemURL, wantedURL)) {
+ CFRelease(currentItemURL);
+ return item;
+ }
+ if (currentItemURL)
+ CFRelease(currentItemURL);
+ }
+
+ return NULL;
+}
+
+- (BOOL) willLaunchAtLogin: (NSURL*) itemURL
+{
+ return !![self findItemWithURL:itemURL inFileList:loginItems];
+}
+
+- (void) setLaunchAtLogin: (BOOL) enabled forURL: (NSURL*) itemURL
+{
+ LSSharedFileListItemRef appItem = [self findItemWithURL:itemURL inFileList:loginItems];
+ if (enabled && !appItem) {
+ LSSharedFileListInsertItemURL(loginItems, kLSSharedFileListItemBeforeFirst,
+ NULL, NULL, (CFURLRef)itemURL, NULL, NULL);
+ } else if (!enabled && appItem)
+ LSSharedFileListItemRemove(loginItems, appItem);
+}
+
+#pragma mark Basic Interface
+
+- (NSURL*) appURL
+{
+ return [NSURL fileURLWithPath:[[NSBundle mainBundle] bundlePath]];
+}
+
+- (void) setLaunchAtLogin: (BOOL) enabled
+{
+ [self willChangeValueForKey:StartAtLoginKey];
+ [self setLaunchAtLogin:enabled forURL:[self appURL]];
+ [self didChangeValueForKey:StartAtLoginKey];
+}
+
+- (BOOL) launchAtLogin
+{
+ return [self willLaunchAtLogin:[self appURL]];
+}
+
+@end
View
76 Quicksilver/Code-External/LaunchAtLoginController/README.md
@@ -0,0 +1,76 @@
+# LaunchAtLoginController
+
+A very simple to implement Controller for use in Cocoa Mac Apps to register/deregister itself for Launch at Login using LSSharedFileList.
+
+It uses LSSharedFileList which means your Users will be able to check System Preferences > Accounts > Login Items.
+
+I'm currently using it on 10.6 (32/64) successfully. I've not investigated being able to flag the "Hide" flag which is possible from System Preferences.
+
+## IMPLEMENTATION (Code):
+
+### Will app launch at login?
+
+ LaunchAtLoginController *launchController = [[LaunchAtLoginController alloc] init];
+ BOOL launch = [launchController launchAtLogin];
+ [launchController release];
+
+### Set launch at login state.
+
+ LaunchAtLoginController *launchController = [[LaunchAtLoginController alloc] init];
+ [launchController setLaunchAtLogin:YES];
+ [launchController release];
+
+## IMPLEMENTATION (Interface builder):
+
+* Open Interface Builder
+* Place a NSObject (the blue box) into the nib window
+* From the Inspector - Identity Tab (Cmd+6) set the Class to LaunchAtLoginController
+* Place a Checkbox on your Window/View
+* From the Inspector - Bindings Tab (Cmd+4) unroll the > Value item
+ * Bind to Launch at Login Controller
+ * Model Key Path: launchAtLogin
+
+## IS IT WORKING:
+
+After implementing either through code or through IB, setLaunchAtLogin:YES and then check System Preferences > Accounts > Login Items. You should see your app in the list of apps that will start when the user logs in.
+
+## CAVEATS (HelperApp Bundles):
+
+If you're trying to set a different bundle (perhaps a HelperApp as a resource to your main bundle) you will simply want to change
+ - (NSURL *)appURL
+to return the path to this other bundle.
+
+## REQUIREMENTS:
+
+Works on 10.6/10.5
+
+## ORIGINAL CODE IDEAS:
+
+* Growl.
+* User: invariant Link: (http://stackoverflow.com/questions/815063/how-do-you-make-your-app-open-at-login/2318004#2318004)
+
+
+## LICENSE:
+
+(The MIT License)
+
+Copyright (c) 2010 Ben Clark-Robinson, ben.clarkrobinson@gmail.com
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+'Software'), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
View
1  Quicksilver/Code-QuickStepFoundation/QSFoundation.h
@@ -27,7 +27,6 @@
#import "QSTreeController.h"
#import "QSMDPredicate.h"
#import "QSLSTools.h"
-#import "QSLoginItemFunctions.h"
#import "QSLog.h"
#import "QSHotKeyEvent.h"
#import "NSWorkspace_BLTRExtensions.h"
View
12 Quicksilver/Code-QuickStepFoundation/QSLoginItemFunctions.h
@@ -1,12 +0,0 @@
-//
-// QSLoginItemFunctions.h
-// Quicksilver
-//
-// Created by Alcor on 12/22/04.
-// Copyright 2004 Blacktree. All rights reserved.
-//
-
-#import <Cocoa/Cocoa.h>
-
-BOOL QSItemShouldLaunchAtLogin(NSString *path);
-void QSSetItemShouldLaunchAtLogin(NSString *path, BOOL launch, BOOL includeAlias);
View
47 Quicksilver/Code-QuickStepFoundation/QSLoginItemFunctions.m
@@ -1,47 +0,0 @@
-//
-// QSLoginItemFunctions.m
-// Quicksilver
-//
-// Created by Alcor on 12/22/04.
-// Copyright 2004 Blacktree. All rights reserved.
-//
-
-#import "QSLoginItemFunctions.h"
-
-BOOL QSItemShouldLaunchAtLogin(NSString *path) {
- NSArray *loginItems = [(NSArray *)CFPreferencesCopyValue((CFStringRef) @"AutoLaunchedApplicationDictionary", (CFStringRef) @"loginwindow", kCFPreferencesCurrentUser, kCFPreferencesAnyHost) autorelease];
- for (id loopItem in loginItems) {
- if ([[[loopItem objectForKey:@"Path"] stringByStandardizingPath] isEqualToString:path]) {
- return YES;
- }
- }
- return NO;
-}
-
-void QSSetItemShouldLaunchAtLogin(NSString *path, BOOL launch, BOOL includeAlias) {
- NSMutableArray *loginItems;
- NSArray *tempItems = (NSArray*)CFPreferencesCopyValue((CFStringRef) @"AutoLaunchedApplicationDictionary", (CFStringRef) @"loginwindow", kCFPreferencesCurrentUser, kCFPreferencesAnyHost);
- loginItems = [[tempItems mutableCopy] autorelease];
- [tempItems release];
-
- if (!loginItems) {
-#ifdef DEBUG
- NSLog(@"Creating AutoLaunchedApplicationDictionary");
-#endif
- loginItems = [NSMutableArray arrayWithCapacity:1];
- }
-
- if (launch && !QSItemShouldLaunchAtLogin(path) ) {
- NSLog(@"Enabling Launch at login: %@", path);
- [loginItems addObject:[NSDictionary dictionaryWithObjectsAndKeys:path, @"Path", [NSNumber numberWithBool:NO] , @"Hide", includeAlias?[[NDAlias aliasWithPath:path] data] :nil, @"AliasData", nil]];
- } else if (!launch) {
- NSUInteger i;
- for (i = 0; i<[loginItems count]; i++)
- if ([[[[loginItems objectAtIndex:i] objectForKey:@"Path"] stringByStandardizingPath] isEqualToString:path]) break;
- if (i<[loginItems count])
- [loginItems removeObjectAtIndex:i];
- NSLog(@"Disable Login Launch: %@", path);
- }
- CFPreferencesSetValue((CFStringRef) @"AutoLaunchedApplicationDictionary", loginItems, (CFStringRef) @"loginwindow", kCFPreferencesCurrentUser, kCFPreferencesAnyHost);
- CFPreferencesSynchronize((CFStringRef) @"loginwindow", kCFPreferencesCurrentUser, kCFPreferencesAnyHost);
-}
View
2  Quicksilver/Code-QuickStepInterface/QSPreferencePane.m
@@ -18,8 +18,6 @@
#import "QSLocalization.h"
-
-#import "QSLoginItemFunctions.h"
#import "QSInterfaceMediator.h"
#import "QSPreferenceKeys.h"
View
15 Quicksilver/PlugIns-Main/QSCorePlugIn/Code/QSActionProvider_EmbeddedProviders.m
@@ -11,7 +11,6 @@
#import "QSRegistry.h"
#import "QSSimpleWebWindowController.h"
-#import "QSLoginItemFunctions.h"
#import "QSFSBrowserMediator.h"
#import "QSNullObject.h"
#import "QSObject_PropertyList.h"
@@ -52,6 +51,8 @@
#import <AudioToolbox/AudioServices.h>
+#import "LaunchAtLoginController.h"
+
@implementation URLActions
- (NSString *)defaultWebClient {
@@ -535,16 +536,20 @@ - (QSBasicObject *)trashFile:(QSObject *)dObject {
}
- (QSObject *)openItemAtLogin:(QSObject *)dObject {
- for(NSString * path in [dObject arrayForType:QSFilePathType]) {
- QSSetItemShouldLaunchAtLogin(path, YES, YES);
+ LaunchAtLoginController *launch = [[LaunchAtLoginController alloc] init];
+ for (NSString * path in [dObject arrayForType:QSFilePathType]) {
+ [launch setLaunchAtLogin:YES forURL:[NSURL fileURLWithPath:path]];
}
+ [launch release];
return nil;
}
- (QSObject *)doNotOpenItemAtLogin:(QSObject *)dObject {
- for(NSString *path in [dObject arrayForType:QSFilePathType]) {
- QSSetItemShouldLaunchAtLogin(path, NO, YES);
+ LaunchAtLoginController *launch = [[LaunchAtLoginController alloc] init];
+ for (NSString *path in [dObject arrayForType:QSFilePathType]) {
+ [launch setLaunchAtLogin:NO forURL:[NSURL fileURLWithPath:path]];
}
+ [launch release];
return nil;
}
View
26 Quicksilver/Quicksilver.xcodeproj/project.pbxproj
@@ -269,8 +269,6 @@
7F9441C60803AB2D007EDC31 /* QSGroupObjectSource.m in Sources */ = {isa = PBXBuildFile; fileRef = 7F9441C40803AB2D007EDC31 /* QSGroupObjectSource.m */; };
7F9441E80803ABB1007EDC31 /* QSVolumesObjectSource.m in Sources */ = {isa = PBXBuildFile; fileRef = 7F9441E60803ABB1007EDC31 /* QSVolumesObjectSource.m */; };
7F9442990803B48A007EDC31 /* QSAllApplicationsObjectSource.m in Sources */ = {isa = PBXBuildFile; fileRef = 7F9442970803B48A007EDC31 /* QSAllApplicationsObjectSource.m */; };
- 7F9553200A25DC4A0004FCC3 /* QSLoginItemFunctions.h in Headers */ = {isa = PBXBuildFile; fileRef = 7F95531E0A25DC4A0004FCC3 /* QSLoginItemFunctions.h */; settings = {ATTRIBUTES = (Public, ); }; };
- 7F9553210A25DC4B0004FCC3 /* QSLoginItemFunctions.m in Sources */ = {isa = PBXBuildFile; fileRef = 7F95531F0A25DC4A0004FCC3 /* QSLoginItemFunctions.m */; };
7F9703E209AFEFB100E9EA77 /* QSDropletApplication.m in Sources */ = {isa = PBXBuildFile; fileRef = 7F9703E109AFEFB100E9EA77 /* QSDropletApplication.m */; };
7F9703E309AFEFCB00E9EA77 /* QSDropletApplication.m in Sources */ = {isa = PBXBuildFile; fileRef = 7F9703E109AFEFB100E9EA77 /* QSDropletApplication.m */; };
7F9703F909AFF05F00E9EA77 /* QSDropletMain.m in Sources */ = {isa = PBXBuildFile; fileRef = 7F9703F809AFF05F00E9EA77 /* QSDropletMain.m */; };
@@ -377,6 +375,8 @@
CDE6C624157E39AE006E66BD /* QSFoundation.h in Headers */ = {isa = PBXBuildFile; fileRef = CDE6C623157E39AE006E66BD /* QSFoundation.h */; settings = {ATTRIBUTES = (Public, ); }; };
CDE8ADBB15824E3E0099CC83 /* NDKeyboardLayout.h in Headers */ = {isa = PBXBuildFile; fileRef = CDE8ADB915824E3E0099CC83 /* NDKeyboardLayout.h */; settings = {ATTRIBUTES = (Public, ); }; };
CDE8ADBC15824E3E0099CC83 /* NDKeyboardLayout.m in Sources */ = {isa = PBXBuildFile; fileRef = CDE8ADBA15824E3E0099CC83 /* NDKeyboardLayout.m */; };
+ D413172F15DEE5D90021479B /* LaunchAtLoginController.h in Headers */ = {isa = PBXBuildFile; fileRef = D413172C15DEE5D90021479B /* LaunchAtLoginController.h */; };
+ D413173015DEE5D90021479B /* LaunchAtLoginController.m in Sources */ = {isa = PBXBuildFile; fileRef = D413172D15DEE5D90021479B /* LaunchAtLoginController.m */; };
D493990D1350078E00B908C6 /* QSDownloads.h in Headers */ = {isa = PBXBuildFile; fileRef = D49399091350078E00B908C6 /* QSDownloads.h */; };
D493990E1350078E00B908C6 /* QSDownloads.m in Sources */ = {isa = PBXBuildFile; fileRef = D493990A1350078E00B908C6 /* QSDownloads.m */; };
D4A43887137CCF0300F15F7F /* QSURLExtractor.py in Resources */ = {isa = PBXBuildFile; fileRef = D4A4383B137CCCF500F15F7F /* QSURLExtractor.py */; };
@@ -1309,8 +1309,6 @@
7F9441E60803ABB1007EDC31 /* QSVolumesObjectSource.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = QSVolumesObjectSource.m; sourceTree = "<group>"; };
7F9442970803B48A007EDC31 /* QSAllApplicationsObjectSource.m */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.objc; path = QSAllApplicationsObjectSource.m; sourceTree = "<group>"; };
7F9442980803B48A007EDC31 /* QSAllApplicationsObjectSource.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = QSAllApplicationsObjectSource.h; sourceTree = "<group>"; };
- 7F95531E0A25DC4A0004FCC3 /* QSLoginItemFunctions.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = QSLoginItemFunctions.h; sourceTree = "<group>"; };
- 7F95531F0A25DC4A0004FCC3 /* QSLoginItemFunctions.m */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.objc; path = QSLoginItemFunctions.m; sourceTree = "<group>"; };
7F9703D009AFEE8700E9EA77 /* QSDroplet.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = QSDroplet.app; sourceTree = BUILT_PRODUCTS_DIR; };
7F9703DC09AFEF8900E9EA77 /* QSDroplet-Info.plist */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = text.plist.xml; path = "QSDroplet-Info.plist"; sourceTree = "<group>"; };
7F9703DD09AFEF8900E9EA77 /* QSDroplet.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = QSDroplet.xib; sourceTree = "<group>"; };
@@ -1413,6 +1411,8 @@
CDE6C623157E39AE006E66BD /* QSFoundation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = QSFoundation.h; sourceTree = "<group>"; };
CDE8ADB915824E3E0099CC83 /* NDKeyboardLayout.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NDKeyboardLayout.h; sourceTree = "<group>"; };
CDE8ADBA15824E3E0099CC83 /* NDKeyboardLayout.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NDKeyboardLayout.m; sourceTree = "<group>"; };
+ D413172C15DEE5D90021479B /* LaunchAtLoginController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LaunchAtLoginController.h; sourceTree = "<group>"; };
+ D413172D15DEE5D90021479B /* LaunchAtLoginController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = LaunchAtLoginController.m; sourceTree = "<group>"; };
D49399091350078E00B908C6 /* QSDownloads.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = QSDownloads.h; sourceTree = "<group>"; };
D493990A1350078E00B908C6 /* QSDownloads.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = QSDownloads.m; sourceTree = "<group>"; };
D4A4383B137CCCF500F15F7F /* QSURLExtractor.py */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.python; path = QSURLExtractor.py; sourceTree = "<group>"; };
@@ -2219,6 +2219,15 @@
name = VDKQueue;
sourceTree = "<group>";
};
+ D413172B15DEE5D90021479B /* LaunchAtLoginController */ = {
+ isa = PBXGroup;
+ children = (
+ D413172C15DEE5D90021479B /* LaunchAtLoginController.h */,
+ D413172D15DEE5D90021479B /* LaunchAtLoginController.m */,
+ );
+ path = LaunchAtLoginController;
+ sourceTree = "<group>";
+ };
E102F97B06625D7300843027 /* Nibs */ = {
isa = PBXGroup;
children = (
@@ -2355,6 +2364,7 @@
E103EE2406471DDE00447FE0 /* Code-External */ = {
isa = PBXGroup;
children = (
+ D413172B15DEE5D90021479B /* LaunchAtLoginController */,
CDE1E65F158A4CFD00355A9F /* VDKQueue */,
4D66BBD91486FCDE00351C42 /* CPSPrivate.h */,
E12444CB07297FF300043A01 /* CGSPrivate.h */,
@@ -2552,8 +2562,6 @@
CDCC200F10A4C14B009C4EED /* QSMDPredicate.m */,
92D9C9680D134BDD00D91825 /* QSTreeController.h */,
92D9C9690D134BDD00D91825 /* QSTreeController.m */,
- 7F95531E0A25DC4A0004FCC3 /* QSLoginItemFunctions.h */,
- 7F95531F0A25DC4A0004FCC3 /* QSLoginItemFunctions.m */,
7F0843CC098ACB2F00F136CC /* QSLog.h */,
7F0843CD098ACB2F00F136CC /* QSLog.m */,
7F93148B07E8B626009B3C06 /* NSIndexSet+Extensions.h */,
@@ -2634,8 +2642,6 @@
E1E5FAA207B204BE0044D6EF /* NSWorkspace_BLTRExtensions.m */,
7F0843CC098ACB2F00F136CC /* QSLog.h */,
7F0843CD098ACB2F00F136CC /* QSLog.m */,
- 7F95531E0A25DC4A0004FCC3 /* QSLoginItemFunctions.h */,
- 7F95531F0A25DC4A0004FCC3 /* QSLoginItemFunctions.m */,
7FF447E8080479E200316DB6 /* QSLSTools.h */,
7FF447E9080479E200316DB6 /* QSLSTools.m */,
92D9C9680D134BDD00D91825 /* QSTreeController.h */,
@@ -3018,6 +3024,7 @@
E1E5FC3907B20DD20044D6EF /* QSVoyeur.h in Headers */,
D493990D1350078E00B908C6 /* QSDownloads.h in Headers */,
CD1B17DA158A573200E4A030 /* VDKQueue.h in Headers */,
+ D413172F15DEE5D90021479B /* LaunchAtLoginController.h in Headers */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@@ -3104,7 +3111,6 @@
2E34EDA1134C9EEE005E66A1 /* NTLocalizedString.h in Headers */,
2E34EDA2134C9EEE005E66A1 /* NTViewLocalizer.h in Headers */,
2E34EDAA134C9F25005E66A1 /* QSLog.h in Headers */,
- 7F9553200A25DC4A0004FCC3 /* QSLoginItemFunctions.h in Headers */,
7FF447EA080479E200316DB6 /* QSLSTools.h in Headers */,
CDCC201010A4C14B009C4EED /* QSMDPredicate.h in Headers */,
7F943F6508033961007EDC31 /* QSUTI.h in Headers */,
@@ -4126,6 +4132,7 @@
E1E5FC3A07B20DD20044D6EF /* QSVoyeur.m in Sources */,
D493990E1350078E00B908C6 /* QSDownloads.m in Sources */,
CD1B17D9158A573000E4A030 /* VDKQueue.m in Sources */,
+ D413173015DEE5D90021479B /* LaunchAtLoginController.m in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@@ -4208,7 +4215,6 @@
E1E5FAD807B204BF0044D6EF /* NSWorkspace_BLTRExtensions.m in Sources */,
4DD89F0C0EBDDA7A005A15AE /* NTViewLocalizer.m in Sources */,
CDCC201110A4C14B009C4EED /* QSMDPredicate.m in Sources */,
- 7F9553210A25DC4B0004FCC3 /* QSLoginItemFunctions.m in Sources */,
7FF447EB080479E200316DB6 /* QSLSTools.m in Sources */,
92D9C96B0D134BDD00D91825 /* QSTreeController.m in Sources */,
7F943F6608033961007EDC31 /* QSUTI.m in Sources */,
Something went wrong with that request. Please try again.