├── docker@2x.png
├── docker-full.png
├── docker-alt@2x.png
├── docker-dark@2x.png
├── docker-alt-dark@2x.png
├── docker-loading@2x.png
├── boot2docker-status-icon.png
├── Boot2Docker Status
├── Images.xcassets
│ └── AppIcon.appiconset
│ │ ├── boot2docker-status-icon-1.png
│ │ ├── boot2docker-status-icon.png
│ │ └── Contents.json
├── main.m
├── AppDelegate.h
├── Info.plist
├── LaunchAtLoginController.h
├── LaunchAtLoginController.m
├── AppDelegate.m
└── Base.lproj
│ └── MainMenu.xib
├── Boot2Docker Status.xcodeproj
├── project.xcworkspace
│ ├── contents.xcworkspacedata
│ └── xcshareddata
│ │ └── Boot2Docker Status.xccheckout
├── xcuserdata
│ └── nickgartmann.xcuserdatad
│ │ ├── xcschemes
│ │ ├── xcschememanagement.plist
│ │ └── Boot2Docker Status.xcscheme
│ │ └── xcdebugger
│ │ └── Breakpoints_v2.xcbkptlist
└── project.pbxproj
├── Boot2Docker StatusTests
├── Info.plist
└── Boot2Docker_StatusTests.m
├── README.md
└── LICENSE
/docker@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nickgartmann/boot2docker-status/HEAD/docker@2x.png
--------------------------------------------------------------------------------
/docker-full.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nickgartmann/boot2docker-status/HEAD/docker-full.png
--------------------------------------------------------------------------------
/docker-alt@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nickgartmann/boot2docker-status/HEAD/docker-alt@2x.png
--------------------------------------------------------------------------------
/docker-dark@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nickgartmann/boot2docker-status/HEAD/docker-dark@2x.png
--------------------------------------------------------------------------------
/docker-alt-dark@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nickgartmann/boot2docker-status/HEAD/docker-alt-dark@2x.png
--------------------------------------------------------------------------------
/docker-loading@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nickgartmann/boot2docker-status/HEAD/docker-loading@2x.png
--------------------------------------------------------------------------------
/boot2docker-status-icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nickgartmann/boot2docker-status/HEAD/boot2docker-status-icon.png
--------------------------------------------------------------------------------
/Boot2Docker Status/Images.xcassets/AppIcon.appiconset/boot2docker-status-icon-1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nickgartmann/boot2docker-status/HEAD/Boot2Docker Status/Images.xcassets/AppIcon.appiconset/boot2docker-status-icon-1.png
--------------------------------------------------------------------------------
/Boot2Docker Status/Images.xcassets/AppIcon.appiconset/boot2docker-status-icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nickgartmann/boot2docker-status/HEAD/Boot2Docker Status/Images.xcassets/AppIcon.appiconset/boot2docker-status-icon.png
--------------------------------------------------------------------------------
/Boot2Docker Status.xcodeproj/project.xcworkspace/contents.xcworkspacedata:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/Boot2Docker Status/main.m:
--------------------------------------------------------------------------------
1 | //
2 | // main.m
3 | // Boot2Docker Status
4 | //
5 | // Created by Nicholas Gartmann on 3/14/15.
6 | // Copyright (c) 2015 Nicholas Gartmann. All rights reserved.
7 | //
8 |
9 | #import
10 |
11 | int main(int argc, const char * argv[]) {
12 | return NSApplicationMain(argc, argv);
13 | }
14 |
--------------------------------------------------------------------------------
/Boot2Docker Status/Images.xcassets/AppIcon.appiconset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "size" : "256x256",
5 | "idiom" : "mac",
6 | "filename" : "boot2docker-status-icon-1.png",
7 | "scale" : "1x"
8 | },
9 | {
10 | "size" : "256x256",
11 | "idiom" : "mac",
12 | "filename" : "boot2docker-status-icon.png",
13 | "scale" : "2x"
14 | }
15 | ],
16 | "info" : {
17 | "version" : 1,
18 | "author" : "xcode"
19 | }
20 | }
--------------------------------------------------------------------------------
/Boot2Docker Status/AppDelegate.h:
--------------------------------------------------------------------------------
1 | //
2 | // AppDelegate.h
3 | // Boot2Docker Status
4 | //
5 | // Created by Nicholas Gartmann on 3/14/15.
6 | // Copyright (c) 2015 Nicholas Gartmann. All rights reserved.
7 | //
8 |
9 | #import
10 | #import "LaunchAtLoginController.h"
11 |
12 | @interface AppDelegate : NSObject
13 |
14 | @property (strong, nonatomic) NSStatusItem *statusItem;
15 | @property (weak) IBOutlet NSButton *launchOnLoginBox;
16 | @property (weak) IBOutlet NSMenu *statusMenu;
17 | @property (weak) IBOutlet NSButton *showWindowOnStartupBox;
18 |
19 | @end
--------------------------------------------------------------------------------
/Boot2Docker Status.xcodeproj/xcuserdata/nickgartmann.xcuserdatad/xcschemes/xcschememanagement.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | SchemeUserState
6 |
7 | Boot2Docker Status.xcscheme
8 |
9 | orderHint
10 | 0
11 |
12 |
13 | SuppressBuildableAutocreation
14 |
15 | 0341A0EB1AB49FEE00320BA8
16 |
17 | primary
18 |
19 |
20 | 0341A0FE1AB49FEE00320BA8
21 |
22 | primary
23 |
24 |
25 |
26 |
27 |
28 |
--------------------------------------------------------------------------------
/Boot2Docker StatusTests/Info.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | CFBundleDevelopmentRegion
6 | en
7 | CFBundleExecutable
8 | $(EXECUTABLE_NAME)
9 | CFBundleIdentifier
10 | RokkinCat.$(PRODUCT_NAME:rfc1034identifier)
11 | CFBundleInfoDictionaryVersion
12 | 6.0
13 | CFBundleName
14 | $(PRODUCT_NAME)
15 | CFBundlePackageType
16 | BNDL
17 | CFBundleShortVersionString
18 | 1.0
19 | CFBundleSignature
20 | ????
21 | CFBundleVersion
22 | 1
23 |
24 |
25 |
--------------------------------------------------------------------------------
/Boot2Docker Status.xcodeproj/xcuserdata/nickgartmann.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist:
--------------------------------------------------------------------------------
1 |
2 |
5 |
6 |
8 |
20 |
21 |
22 |
23 |
24 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | #Boot2Docker Status
2 |
3 | An OSX menu bar application for monitoring the state of your [boot2docker](http://boot2docker.io)
4 | virtual machine so you don't waste sweet, sweet memory on a VM you aren't using.
5 |
6 | 
7 |
8 | Just click the whale, and you're off to the races.
9 |
10 | ## Installation
11 |
12 | [Download the app](http://boot2docker-status.nickgartmann.com/Boot2Docker%20Status-v1.0.0.zip), unzip it,
13 | and move it to your `/Applications` directory. Then just launch the app. Use `cmd+click` on the menu bar icon
14 | to change preferences or quit.
15 |
16 | ## What it does
17 |
18 | Boot2Docker Status constantly monitors (every 2 seconds) the state of `boot2docker status` to see if the VM is running and gives a visual representation of the state of the VM. Then by clicking the icon you can toggle the state of the VM.
19 |
20 | To toggle the state, the app will emit `boot2docker up` or `boot2docker down` accordingly. **NOTE: It does not set your environment variables in your term, so you will still need to run `$(boot2docker shellinit)`**
21 |
--------------------------------------------------------------------------------
/Boot2Docker StatusTests/Boot2Docker_StatusTests.m:
--------------------------------------------------------------------------------
1 | //
2 | // Boot2Docker_StatusTests.m
3 | // Boot2Docker StatusTests
4 | //
5 | // Created by Nicholas Gartmann on 3/14/15.
6 | // Copyright (c) 2015 Nicholas Gartmann. All rights reserved.
7 | //
8 |
9 | #import
10 | #import
11 |
12 | @interface Boot2Docker_StatusTests : XCTestCase
13 |
14 | @end
15 |
16 | @implementation Boot2Docker_StatusTests
17 |
18 | - (void)setUp {
19 | [super setUp];
20 | // Put setup code here. This method is called before the invocation of each test method in the class.
21 | }
22 |
23 | - (void)tearDown {
24 | // Put teardown code here. This method is called after the invocation of each test method in the class.
25 | [super tearDown];
26 | }
27 |
28 | - (void)testExample {
29 | // This is an example of a functional test case.
30 | XCTAssert(YES, @"Pass");
31 | }
32 |
33 | - (void)testPerformanceExample {
34 | // This is an example of a performance test case.
35 | [self measureBlock:^{
36 | // Put the code you want to measure the time of here.
37 | }];
38 | }
39 |
40 | @end
41 |
--------------------------------------------------------------------------------
/Boot2Docker Status/Info.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | LSUIElement
6 |
7 | CFBundleDevelopmentRegion
8 | en
9 | CFBundleExecutable
10 | $(EXECUTABLE_NAME)
11 | CFBundleIconFile
12 |
13 | CFBundleIdentifier
14 | RokkinCat.$(PRODUCT_NAME:rfc1034identifier)
15 | CFBundleInfoDictionaryVersion
16 | 6.0
17 | CFBundleName
18 | $(PRODUCT_NAME)
19 | CFBundlePackageType
20 | APPL
21 | CFBundleShortVersionString
22 | 1.0
23 | CFBundleSignature
24 | ????
25 | CFBundleVersion
26 | 1
27 | LSMinimumSystemVersion
28 | $(MACOSX_DEPLOYMENT_TARGET)
29 | NSHumanReadableCopyright
30 | Copyright © 2015 Nicholas Gartmann. All rights reserved.
31 | NSMainNibFile
32 | MainMenu
33 | NSPrincipalClass
34 | NSApplication
35 |
36 |
37 |
--------------------------------------------------------------------------------
/Boot2Docker Status/LaunchAtLoginController.h:
--------------------------------------------------------------------------------
1 |
2 | //
3 | // LaunchAtLoginController.h
4 | //
5 | // Copyright 2011 Tomáš Znamenáček
6 | // Copyright 2010 Ben Clark-Robinson
7 | //
8 | // Permission is hereby granted, free of charge, to any person obtaining
9 | // a copy of this software and associated documentation files (the ‘Software’),
10 | // to deal in the Software without restriction, including without limitation
11 | // the rights to use, copy, modify, merge, publish, distribute, sublicense,
12 | // and/or sell copies of the Software, and to permit persons to whom the
13 | // Software is furnished to do so, subject to the following conditions:
14 | //
15 | // The above copyright notice and this permission notice shall be
16 | // included in all copies or substantial portions of the Software.
17 | //
18 | // THE SOFTWARE IS PROVIDED ‘AS IS’, WITHOUT WARRANTY OF ANY KIND,
19 | // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
20 | // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
21 | // IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
22 | // CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
23 | // TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
24 | // SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
25 |
26 |
27 | #import
28 |
29 | @interface LaunchAtLoginController : NSObject {}
30 |
31 | @property(assign) BOOL launchAtLogin;
32 |
33 | - (BOOL) willLaunchAtLogin: (NSURL*) itemURL;
34 | - (void) setLaunchAtLogin: (BOOL) enabled forURL: (NSURL*) itemURL;
35 |
36 | @end
37 |
38 |
--------------------------------------------------------------------------------
/Boot2Docker Status.xcodeproj/project.xcworkspace/xcshareddata/Boot2Docker Status.xccheckout:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | IDESourceControlProjectFavoriteDictionaryKey
6 |
7 | IDESourceControlProjectIdentifier
8 | A1746913-1435-4A4B-AF86-9F3A962898BE
9 | IDESourceControlProjectName
10 | Boot2Docker Status
11 | IDESourceControlProjectOriginsDictionary
12 |
13 | AEBE1D4ADAA890E39932A442C35D5C07DEE41EE9
14 | github.com:nickgartmann/boot2docker-status.git
15 |
16 | IDESourceControlProjectPath
17 | Boot2Docker Status.xcodeproj
18 | IDESourceControlProjectRelativeInstallPathDictionary
19 |
20 | AEBE1D4ADAA890E39932A442C35D5C07DEE41EE9
21 | ../..
22 |
23 | IDESourceControlProjectURL
24 | github.com:nickgartmann/boot2docker-status.git
25 | IDESourceControlProjectVersion
26 | 111
27 | IDESourceControlProjectWCCIdentifier
28 | AEBE1D4ADAA890E39932A442C35D5C07DEE41EE9
29 | IDESourceControlProjectWCConfigurations
30 |
31 |
32 | IDESourceControlRepositoryExtensionIdentifierKey
33 | public.vcs.git
34 | IDESourceControlWCCIdentifierKey
35 | AEBE1D4ADAA890E39932A442C35D5C07DEE41EE9
36 | IDESourceControlWCCName
37 | Boot2Docker%20Status
38 |
39 |
40 |
41 |
42 |
--------------------------------------------------------------------------------
/Boot2Docker Status/LaunchAtLoginController.m:
--------------------------------------------------------------------------------
1 | //
2 | // LaunchAtLoginController.m
3 | //
4 | // Copyright 2011 Tomáš Znamenáček
5 | // Copyright 2010 Ben Clark-Robinson
6 | //
7 | // Permission is hereby granted, free of charge, to any person obtaining
8 | // a copy of this software and associated documentation files (the ‘Software’),
9 | // to deal in the Software without restriction, including without limitation
10 | // the rights to use, copy, modify, merge, publish, distribute, sublicense,
11 | // and/or sell copies of the Software, and to permit persons to whom the
12 | // Software is furnished to do so, subject to the following conditions:
13 | //
14 | // The above copyright notice and this permission notice shall be
15 | // included in all copies or substantial portions of the Software.
16 | //
17 | // THE SOFTWARE IS PROVIDED ‘AS IS’, WITHOUT WARRANTY OF ANY KIND,
18 | // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
19 | // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
20 | // IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
21 | // CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
22 | // TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
23 | // SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
24 |
25 | #import "LaunchAtLoginController.h"
26 |
27 | static NSString *const StartAtLoginKey = @"launchAtLogin";
28 |
29 | @interface LaunchAtLoginController ()
30 | @property(assign) LSSharedFileListRef loginItems;
31 | @end
32 |
33 | @implementation LaunchAtLoginController
34 | @synthesize loginItems;
35 |
36 | #pragma mark Change Observing
37 |
38 | void sharedFileListDidChange(LSSharedFileListRef inList, void *context)
39 | {
40 | LaunchAtLoginController *self = (__bridge id) context;
41 | [self willChangeValueForKey:StartAtLoginKey];
42 | [self didChangeValueForKey:StartAtLoginKey];
43 | }
44 |
45 | #pragma mark Initialization
46 |
47 | - (id) init
48 | {
49 | self = [super init];
50 | loginItems = LSSharedFileListCreate(NULL, kLSSharedFileListSessionLoginItems, NULL);
51 | LSSharedFileListAddObserver(loginItems, CFRunLoopGetMain(),
52 | (CFStringRef)NSDefaultRunLoopMode, sharedFileListDidChange, (__bridge void *)(self));
53 | return self;
54 | }
55 |
56 | - (void) dealloc
57 | {
58 | LSSharedFileListRemoveObserver(loginItems, CFRunLoopGetMain(),
59 | (CFStringRef)NSDefaultRunLoopMode, sharedFileListDidChange, (__bridge void *)(self));
60 | CFRelease(loginItems);
61 | }
62 |
63 | #pragma mark Launch List Control
64 |
65 | -(LSSharedFileListItemRef) findItemWithURL: (NSURL*) wantedURL inFileList: (LSSharedFileListRef) fileList
66 | {
67 | if (wantedURL == NULL || fileList == NULL)
68 | return NULL;
69 |
70 | NSArray *listSnapshot = (__bridge NSArray *)(LSSharedFileListCopySnapshot(fileList, NULL));
71 | for (id itemObject in listSnapshot) {
72 | LSSharedFileListItemRef item = (__bridge LSSharedFileListItemRef) itemObject;
73 | UInt32 resolutionFlags = kLSSharedFileListNoUserInteraction | kLSSharedFileListDoNotMountVolumes;
74 | CFURLRef currentItemURL = NULL;
75 | LSSharedFileListItemResolve(item, resolutionFlags, ¤tItemURL, NULL);
76 | if (currentItemURL && CFEqual(currentItemURL, (__bridge CFTypeRef)(wantedURL))) {
77 | CFRelease(currentItemURL);
78 | return item;
79 | }
80 | if (currentItemURL)
81 | CFRelease(currentItemURL);
82 | }
83 |
84 | return NULL;
85 | }
86 |
87 | - (BOOL) willLaunchAtLogin: (NSURL*) itemURL
88 | {
89 | return !![self findItemWithURL:itemURL inFileList:loginItems];
90 | }
91 |
92 | - (void) setLaunchAtLogin: (BOOL) enabled forURL: (NSURL*) itemURL
93 | {
94 | LSSharedFileListItemRef appItem = [self findItemWithURL:itemURL inFileList:loginItems];
95 | if (enabled && !appItem) {
96 | LSSharedFileListInsertItemURL(loginItems, kLSSharedFileListItemBeforeFirst,
97 | NULL, NULL, (__bridge CFURLRef)itemURL, NULL, NULL);
98 | } else if (!enabled && appItem)
99 | LSSharedFileListItemRemove(loginItems, appItem);
100 | }
101 |
102 | #pragma mark Basic Interface
103 |
104 | - (NSURL*) appURL
105 | {
106 | return [NSURL fileURLWithPath:[[NSBundle mainBundle] bundlePath]];
107 | }
108 |
109 | - (void) setLaunchAtLogin: (BOOL) enabled
110 | {
111 | [self willChangeValueForKey:StartAtLoginKey];
112 | [self setLaunchAtLogin:enabled forURL:[self appURL]];
113 | [self didChangeValueForKey:StartAtLoginKey];
114 | }
115 |
116 | - (BOOL) launchAtLogin
117 | {
118 | return [self willLaunchAtLogin:[self appURL]];
119 | }
120 |
121 | @end
--------------------------------------------------------------------------------
/Boot2Docker Status.xcodeproj/xcuserdata/nickgartmann.xcuserdatad/xcschemes/Boot2Docker Status.xcscheme:
--------------------------------------------------------------------------------
1 |
2 |
5 |
8 |
9 |
15 |
21 |
22 |
23 |
29 |
35 |
36 |
37 |
38 |
39 |
44 |
45 |
47 |
53 |
54 |
55 |
56 |
57 |
63 |
64 |
65 |
66 |
75 |
77 |
83 |
84 |
85 |
86 |
87 |
88 |
94 |
96 |
102 |
103 |
104 |
105 |
107 |
108 |
111 |
112 |
113 |
--------------------------------------------------------------------------------
/Boot2Docker Status/AppDelegate.m:
--------------------------------------------------------------------------------
1 | //
2 | // AppDelegate.m
3 | // Boot2Docker Status
4 | //
5 | // Created by Nicholas Gartmann on 3/14/15.
6 | // Copyright (c) 2015 Nicholas Gartmann. All rights reserved.
7 | //
8 |
9 | #import "AppDelegate.h"
10 |
11 |
12 | @interface AppDelegate ()
13 | @property (weak) NSUserDefaults *standardUserDefaults;
14 | @property (weak) IBOutlet NSWindow *window;
15 | @property BOOL haveRequestedStateChange;
16 | @end
17 |
18 | typedef NS_ENUM(NSUInteger, B2DState) {
19 | B2DIsUp = 0,
20 | B2DGoingDown,
21 | B2DIsDown,
22 | B2DGoingUp,
23 | };
24 |
25 |
26 | @implementation AppDelegate
27 |
28 | - (void)applicationDidFinishLaunching:(NSNotification *)aNotification {
29 | // Insert code here to initialize your application
30 |
31 | _haveRequestedStateChange = NO;
32 |
33 |
34 | _statusItem = [[NSStatusBar systemStatusBar] statusItemWithLength:NSVariableStatusItemLength];
35 |
36 | _standardUserDefaults = [NSUserDefaults standardUserDefaults];
37 |
38 | [_standardUserDefaults registerDefaults:@{
39 | @"DisplayWindowOnStartup": @YES
40 | }];
41 |
42 | // The text that will be shown in the menu bar
43 | _statusItem.title = @"";
44 |
45 | if([self isBoot2DockerRunning]) {
46 | _statusItem.image = [self renderIconForState:B2DIsUp];
47 | } else {
48 | _statusItem.image = [self renderIconForState:B2DIsDown];
49 | }
50 |
51 | // The image gets a blue background when the item is selected
52 | _statusItem.highlightMode = NO;
53 |
54 | LaunchAtLoginController *launchController = [[LaunchAtLoginController alloc] init];
55 | BOOL launch = [launchController launchAtLogin];
56 | [_launchOnLoginBox setState:launch];
57 |
58 | [_showWindowOnStartupBox setState:[self shouldDisplayWindowOnBoot]];
59 |
60 | [_statusItem setTarget:self];
61 | [_statusItem setAction:@selector(toggleBoot2Docker:)];
62 |
63 | if([self shouldDisplayWindowOnBoot]) {
64 | [self openWindow:self];
65 | }
66 | [NSTimer scheduledTimerWithTimeInterval:2.0
67 | target:self
68 | selector:@selector(renderIcon:)
69 | userInfo:nil
70 | repeats:YES];
71 |
72 | }
73 |
74 | - (void)applicationWillTerminate:(NSNotification *)aNotification {
75 | // Insert code here to tear down your application
76 | }
77 |
78 | - (IBAction)toggleAutoStart:(id)sender {
79 | LaunchAtLoginController *launchController = [[LaunchAtLoginController alloc] init];
80 | [launchController setLaunchAtLogin:[sender state]];
81 | }
82 |
83 | - (void)openMenu {
84 | [self.statusItem setHighlightMode:YES];
85 | [_statusItem popUpStatusItemMenu:_statusMenu];
86 | }
87 |
88 | - (IBAction)openWindow:(id)sender {
89 | [self.statusItem setHighlightMode:NO];
90 | [_window setIsVisible:TRUE];
91 | [_window makeKeyAndOrderFront:sender];
92 | }
93 |
94 | - (IBAction)quit:(id)sender {
95 | [NSApp terminate: nil];
96 | }
97 |
98 | - (IBAction)close:(id)sender {
99 | [_window close];
100 | }
101 |
102 | - (IBAction)toggleShowWindowOnBoot:(id)sender {
103 | if (_standardUserDefaults) [_standardUserDefaults setBool:[sender state] forKey:@"DisplayWindowOnStartup"];
104 | [_standardUserDefaults synchronize];
105 | }
106 |
107 | - (BOOL)shouldDisplayWindowOnBoot {
108 | BOOL val = YES;
109 | if (_standardUserDefaults) val = [_standardUserDefaults boolForKey:@"DisplayWindowOnStartup"];
110 | return val;
111 | }
112 |
113 | - (void)toggleBoot2Docker:(id)sender {
114 | if([NSEvent modifierFlags] & NSCommandKeyMask) {
115 | [self.statusItem setHighlightMode:YES];
116 | [self openMenu];
117 | } else {
118 | if([self isBoot2DockerRunning]) {
119 | _statusItem.image = [self renderIconForState:B2DGoingDown];
120 | [self stopBoot2Docker];
121 | } else {
122 | _statusItem.image = [self renderIconForState:B2DGoingUp];
123 | [self startBoot2Docker];
124 | }
125 | }
126 | }
127 |
128 | - (void)renderIcon:(id)sender {
129 | if(!_haveRequestedStateChange) {
130 | if([self isBoot2DockerRunning]) {
131 | _statusItem.image = [self renderIconForState:B2DIsUp];
132 | } else {
133 | _statusItem.image = [self renderIconForState:B2DIsDown];
134 | }
135 | }
136 | }
137 |
138 | - (BOOL)isBoot2DockerRunning {
139 | NSTask *task = [[NSTask alloc] init];
140 | [task setLaunchPath:@"/bin/bash"];
141 | [task setArguments:@[@"-c", @"/usr/local/bin/boot2docker status"]];
142 |
143 | NSPipe *pipe;
144 | pipe = [NSPipe pipe];
145 | [task setStandardOutput:pipe];
146 |
147 |
148 | NSFileHandle *fOut;
149 | fOut = [pipe fileHandleForReading];
150 |
151 | [task launch];
152 | [task waitUntilExit];
153 |
154 | NSData *data = [fOut readDataToEndOfFile];
155 | NSString *output = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
156 | return [output containsString:@"running"];
157 | }
158 |
159 | - (void)startBoot2Docker {
160 | _haveRequestedStateChange = YES;
161 | NSTask *task = [[NSTask alloc] init];
162 | [task setLaunchPath:@"/bin/bash"];
163 | [task setArguments:@[@"-c", @"/usr/local/bin/boot2docker up"]];
164 |
165 | [task setTerminationHandler:^(NSTask *t) {
166 | _haveRequestedStateChange = NO;
167 | _statusItem.image = [self renderIconForState:B2DIsUp];
168 | }];
169 |
170 | [task launch];
171 | }
172 |
173 | - (void)stopBoot2Docker {
174 | _haveRequestedStateChange = YES;
175 | NSTask *task = [[NSTask alloc] init];
176 | [task setLaunchPath:@"/bin/bash"];
177 | [task setArguments:@[@"-c", @"/usr/local/bin/boot2docker down"]];
178 |
179 | [task setTerminationHandler:^(NSTask *t) {
180 | _haveRequestedStateChange = NO;
181 | _statusItem.image = [self renderIconForState:B2DIsDown];
182 | }];
183 |
184 | [task launch];
185 | }
186 |
187 | - (BOOL)isDarkMode {
188 | NSString *osxMode = [_standardUserDefaults stringForKey:@"AppleInterfaceStyle"];
189 | if ([osxMode isEqualToString:@"Dark"] || [osxMode isEqualToString:@"dark"]) {
190 | return YES;
191 | }
192 | return NO;
193 | }
194 |
195 | - (NSImage*)renderIconForState:(B2DState)state {
196 | NSImage* image = nil;
197 | NSColor* color = nil;
198 |
199 | switch (state) {
200 | case B2DIsUp:
201 | image = [([self isDarkMode] ? [NSImage imageNamed:@"docker-dark"] : [NSImage imageNamed:@"docker"]) copy];
202 | color = [NSColor greenColor];
203 | break;
204 | case B2DGoingDown:
205 | image = [([self isDarkMode] ? [NSImage imageNamed:@"docker-alt-dark"] : [NSImage imageNamed:@"docker-alt"]) copy];
206 | color = [NSColor colorWithRed:1 green:.6 blue:0 alpha:1];
207 | break;
208 | case B2DIsDown:
209 | image = [([self isDarkMode] ? [NSImage imageNamed:@"docker-alt-dark"] : [NSImage imageNamed:@"docker-alt"]) copy];
210 | color = [NSColor redColor];
211 | break;
212 | case B2DGoingUp:
213 | image = [([self isDarkMode] ? [NSImage imageNamed:@"docker-alt-dark"] : [NSImage imageNamed:@"docker-alt"]) copy];
214 | color = [NSColor colorWithRed:1 green:.8 blue:0 alpha:1];
215 | break;
216 | default:
217 | image = [([self isDarkMode] ? [NSImage imageNamed:@"docker-alt-dark"] : [NSImage imageNamed:@"docker-alt"]) copy];
218 | color = [NSColor redColor];
219 | break;
220 | }
221 |
222 | NSBezierPath* notificationBubble = [NSBezierPath bezierPath];
223 | [notificationBubble appendBezierPathWithOvalInRect:NSMakeRect(image.size.width-10, 1, 6, 6)];
224 |
225 | [image lockFocus];
226 | [color setFill];
227 | [notificationBubble fill];
228 | [image unlockFocus];
229 |
230 | return image;
231 | }
232 |
233 | @end
234 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | Apache License
2 | Version 2.0, January 2004
3 | http://www.apache.org/licenses/
4 |
5 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
6 |
7 | 1. Definitions.
8 |
9 | "License" shall mean the terms and conditions for use, reproduction,
10 | and distribution as defined by Sections 1 through 9 of this document.
11 |
12 | "Licensor" shall mean the copyright owner or entity authorized by
13 | the copyright owner that is granting the License.
14 |
15 | "Legal Entity" shall mean the union of the acting entity and all
16 | other entities that control, are controlled by, or are under common
17 | control with that entity. For the purposes of this definition,
18 | "control" means (i) the power, direct or indirect, to cause the
19 | direction or management of such entity, whether by contract or
20 | otherwise, or (ii) ownership of fifty percent (50%) or more of the
21 | outstanding shares, or (iii) beneficial ownership of such entity.
22 |
23 | "You" (or "Your") shall mean an individual or Legal Entity
24 | exercising permissions granted by this License.
25 |
26 | "Source" form shall mean the preferred form for making modifications,
27 | including but not limited to software source code, documentation
28 | source, and configuration files.
29 |
30 | "Object" form shall mean any form resulting from mechanical
31 | transformation or translation of a Source form, including but
32 | not limited to compiled object code, generated documentation,
33 | and conversions to other media types.
34 |
35 | "Work" shall mean the work of authorship, whether in Source or
36 | Object form, made available under the License, as indicated by a
37 | copyright notice that is included in or attached to the work
38 | (an example is provided in the Appendix below).
39 |
40 | "Derivative Works" shall mean any work, whether in Source or Object
41 | form, that is based on (or derived from) the Work and for which the
42 | editorial revisions, annotations, elaborations, or other modifications
43 | represent, as a whole, an original work of authorship. For the purposes
44 | of this License, Derivative Works shall not include works that remain
45 | separable from, or merely link (or bind by name) to the interfaces of,
46 | the Work and Derivative Works thereof.
47 |
48 | "Contribution" shall mean any work of authorship, including
49 | the original version of the Work and any modifications or additions
50 | to that Work or Derivative Works thereof, that is intentionally
51 | submitted to Licensor for inclusion in the Work by the copyright owner
52 | or by an individual or Legal Entity authorized to submit on behalf of
53 | the copyright owner. For the purposes of this definition, "submitted"
54 | means any form of electronic, verbal, or written communication sent
55 | to the Licensor or its representatives, including but not limited to
56 | communication on electronic mailing lists, source code control systems,
57 | and issue tracking systems that are managed by, or on behalf of, the
58 | Licensor for the purpose of discussing and improving the Work, but
59 | excluding communication that is conspicuously marked or otherwise
60 | designated in writing by the copyright owner as "Not a Contribution."
61 |
62 | "Contributor" shall mean Licensor and any individual or Legal Entity
63 | on behalf of whom a Contribution has been received by Licensor and
64 | subsequently incorporated within the Work.
65 |
66 | 2. Grant of Copyright License. Subject to the terms and conditions of
67 | this License, each Contributor hereby grants to You a perpetual,
68 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable
69 | copyright license to reproduce, prepare Derivative Works of,
70 | publicly display, publicly perform, sublicense, and distribute the
71 | Work and such Derivative Works in Source or Object form.
72 |
73 | 3. Grant of Patent License. Subject to the terms and conditions of
74 | this License, each Contributor hereby grants to You a perpetual,
75 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable
76 | (except as stated in this section) patent license to make, have made,
77 | use, offer to sell, sell, import, and otherwise transfer the Work,
78 | where such license applies only to those patent claims licensable
79 | by such Contributor that are necessarily infringed by their
80 | Contribution(s) alone or by combination of their Contribution(s)
81 | with the Work to which such Contribution(s) was submitted. If You
82 | institute patent litigation against any entity (including a
83 | cross-claim or counterclaim in a lawsuit) alleging that the Work
84 | or a Contribution incorporated within the Work constitutes direct
85 | or contributory patent infringement, then any patent licenses
86 | granted to You under this License for that Work shall terminate
87 | as of the date such litigation is filed.
88 |
89 | 4. Redistribution. You may reproduce and distribute copies of the
90 | Work or Derivative Works thereof in any medium, with or without
91 | modifications, and in Source or Object form, provided that You
92 | meet the following conditions:
93 |
94 | (a) You must give any other recipients of the Work or
95 | Derivative Works a copy of this License; and
96 |
97 | (b) You must cause any modified files to carry prominent notices
98 | stating that You changed the files; and
99 |
100 | (c) You must retain, in the Source form of any Derivative Works
101 | that You distribute, all copyright, patent, trademark, and
102 | attribution notices from the Source form of the Work,
103 | excluding those notices that do not pertain to any part of
104 | the Derivative Works; and
105 |
106 | (d) If the Work includes a "NOTICE" text file as part of its
107 | distribution, then any Derivative Works that You distribute must
108 | include a readable copy of the attribution notices contained
109 | within such NOTICE file, excluding those notices that do not
110 | pertain to any part of the Derivative Works, in at least one
111 | of the following places: within a NOTICE text file distributed
112 | as part of the Derivative Works; within the Source form or
113 | documentation, if provided along with the Derivative Works; or,
114 | within a display generated by the Derivative Works, if and
115 | wherever such third-party notices normally appear. The contents
116 | of the NOTICE file are for informational purposes only and
117 | do not modify the License. You may add Your own attribution
118 | notices within Derivative Works that You distribute, alongside
119 | or as an addendum to the NOTICE text from the Work, provided
120 | that such additional attribution notices cannot be construed
121 | as modifying the License.
122 |
123 | You may add Your own copyright statement to Your modifications and
124 | may provide additional or different license terms and conditions
125 | for use, reproduction, or distribution of Your modifications, or
126 | for any such Derivative Works as a whole, provided Your use,
127 | reproduction, and distribution of the Work otherwise complies with
128 | the conditions stated in this License.
129 |
130 | 5. Submission of Contributions. Unless You explicitly state otherwise,
131 | any Contribution intentionally submitted for inclusion in the Work
132 | by You to the Licensor shall be under the terms and conditions of
133 | this License, without any additional terms or conditions.
134 | Notwithstanding the above, nothing herein shall supersede or modify
135 | the terms of any separate license agreement you may have executed
136 | with Licensor regarding such Contributions.
137 |
138 | 6. Trademarks. This License does not grant permission to use the trade
139 | names, trademarks, service marks, or product names of the Licensor,
140 | except as required for reasonable and customary use in describing the
141 | origin of the Work and reproducing the content of the NOTICE file.
142 |
143 | 7. Disclaimer of Warranty. Unless required by applicable law or
144 | agreed to in writing, Licensor provides the Work (and each
145 | Contributor provides its Contributions) on an "AS IS" BASIS,
146 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
147 | implied, including, without limitation, any warranties or conditions
148 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
149 | PARTICULAR PURPOSE. You are solely responsible for determining the
150 | appropriateness of using or redistributing the Work and assume any
151 | risks associated with Your exercise of permissions under this License.
152 |
153 | 8. Limitation of Liability. In no event and under no legal theory,
154 | whether in tort (including negligence), contract, or otherwise,
155 | unless required by applicable law (such as deliberate and grossly
156 | negligent acts) or agreed to in writing, shall any Contributor be
157 | liable to You for damages, including any direct, indirect, special,
158 | incidental, or consequential damages of any character arising as a
159 | result of this License or out of the use or inability to use the
160 | Work (including but not limited to damages for loss of goodwill,
161 | work stoppage, computer failure or malfunction, or any and all
162 | other commercial damages or losses), even if such Contributor
163 | has been advised of the possibility of such damages.
164 |
165 | 9. Accepting Warranty or Additional Liability. While redistributing
166 | the Work or Derivative Works thereof, You may choose to offer,
167 | and charge a fee for, acceptance of support, warranty, indemnity,
168 | or other liability obligations and/or rights consistent with this
169 | License. However, in accepting such obligations, You may act only
170 | on Your own behalf and on Your sole responsibility, not on behalf
171 | of any other Contributor, and only if You agree to indemnify,
172 | defend, and hold each Contributor harmless for any liability
173 | incurred by, or claims asserted against, such Contributor by reason
174 | of your accepting any such warranty or additional liability.
175 |
176 | END OF TERMS AND CONDITIONS
177 |
178 | APPENDIX: How to apply the Apache License to your work.
179 |
180 | To apply the Apache License to your work, attach the following
181 | boilerplate notice, with the fields enclosed by brackets "{}"
182 | replaced with your own identifying information. (Don't include
183 | the brackets!) The text should be enclosed in the appropriate
184 | comment syntax for the file format. We also recommend that a
185 | file or class name and description of purpose be included on the
186 | same "printed page" as the copyright notice for easier
187 | identification within third-party archives.
188 |
189 | Copyright {yyyy} {name of copyright owner}
190 |
191 | Licensed under the Apache License, Version 2.0 (the "License");
192 | you may not use this file except in compliance with the License.
193 | You may obtain a copy of the License at
194 |
195 | http://www.apache.org/licenses/LICENSE-2.0
196 |
197 | Unless required by applicable law or agreed to in writing, software
198 | distributed under the License is distributed on an "AS IS" BASIS,
199 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
200 | See the License for the specific language governing permissions and
201 | limitations under the License.
202 |
--------------------------------------------------------------------------------
/Boot2Docker Status/Base.lproj/MainMenu.xib:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 | Boot2Docker Status is now running. You should see the docker icon in your status menu. Click the icon to turn the Boot2Docker-VM on and off.
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 |
50 |
51 |
52 |
53 |
54 |
55 |
56 |
57 |
58 |
59 |
60 |
61 |
62 |
63 |
64 |
65 |
66 |
67 |
68 |
69 |
70 |
71 |
72 |
73 |
74 |
75 |
76 |
77 |
78 |
79 |
80 |
81 |
82 |
83 |
84 |
85 |
86 |
87 |
88 |
89 |
90 |
100 |
110 |
123 |
124 |
125 |
126 |
127 |
143 |
144 |
145 |
146 |
147 |
148 |
149 |
150 |
151 |
--------------------------------------------------------------------------------
/Boot2Docker Status.xcodeproj/project.pbxproj:
--------------------------------------------------------------------------------
1 | // !$*UTF8*$!
2 | {
3 | archiveVersion = 1;
4 | classes = {
5 | };
6 | objectVersion = 46;
7 | objects = {
8 |
9 | /* Begin PBXBuildFile section */
10 | 032563ED1AB50CA500B98388 /* boot2docker-status-icon.png in Resources */ = {isa = PBXBuildFile; fileRef = 032563EC1AB50CA500B98388 /* boot2docker-status-icon.png */; };
11 | 0341A0F31AB49FEE00320BA8 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 0341A0F21AB49FEE00320BA8 /* AppDelegate.m */; };
12 | 0341A0F51AB49FEE00320BA8 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 0341A0F41AB49FEE00320BA8 /* main.m */; };
13 | 0341A0F71AB49FEE00320BA8 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 0341A0F61AB49FEE00320BA8 /* Images.xcassets */; };
14 | 0341A0FA1AB49FEE00320BA8 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 0341A0F81AB49FEE00320BA8 /* MainMenu.xib */; };
15 | 0341A1061AB49FEE00320BA8 /* Boot2Docker_StatusTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 0341A1051AB49FEE00320BA8 /* Boot2Docker_StatusTests.m */; };
16 | 0341A1241AB4A51500320BA8 /* docker@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 0341A1231AB4A51500320BA8 /* docker@2x.png */; };
17 | 0341A1261AB4A60C00320BA8 /* docker-alt@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 0341A1251AB4A60C00320BA8 /* docker-alt@2x.png */; };
18 | 0341A1281AB4BC3500320BA8 /* docker-loading@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 0341A1271AB4BC3500320BA8 /* docker-loading@2x.png */; };
19 | 0341A12C1AB4C1E200320BA8 /* docker-full.png in Resources */ = {isa = PBXBuildFile; fileRef = 0341A12B1AB4C1E200320BA8 /* docker-full.png */; };
20 | 0341A1321AB4D60700320BA8 /* LaunchAtLoginController.m in Sources */ = {isa = PBXBuildFile; fileRef = 0341A1311AB4D60700320BA8 /* LaunchAtLoginController.m */; };
21 | AF625AC41AB87FBC00FDC72E /* docker-alt-dark@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = AF625AC31AB87FBC00FDC72E /* docker-alt-dark@2x.png */; };
22 | AFA26B891AB8365500014A6F /* docker-dark@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = AFA26B881AB8365500014A6F /* docker-dark@2x.png */; };
23 | /* End PBXBuildFile section */
24 |
25 | /* Begin PBXContainerItemProxy section */
26 | 0341A1001AB49FEE00320BA8 /* PBXContainerItemProxy */ = {
27 | isa = PBXContainerItemProxy;
28 | containerPortal = 0341A0E41AB49FEE00320BA8 /* Project object */;
29 | proxyType = 1;
30 | remoteGlobalIDString = 0341A0EB1AB49FEE00320BA8;
31 | remoteInfo = "Boot2Docker Status";
32 | };
33 | /* End PBXContainerItemProxy section */
34 |
35 | /* Begin PBXFileReference section */
36 | 032563EC1AB50CA500B98388 /* boot2docker-status-icon.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "boot2docker-status-icon.png"; sourceTree = ""; };
37 | 0341A0EC1AB49FEE00320BA8 /* Boot2Docker Status.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "Boot2Docker Status.app"; sourceTree = BUILT_PRODUCTS_DIR; };
38 | 0341A0F01AB49FEE00320BA8 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; };
39 | 0341A0F11AB49FEE00320BA8 /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = ""; };
40 | 0341A0F21AB49FEE00320BA8 /* AppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = ""; };
41 | 0341A0F41AB49FEE00320BA8 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; };
42 | 0341A0F61AB49FEE00320BA8 /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = ""; };
43 | 0341A0F91AB49FEE00320BA8 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/MainMenu.xib; sourceTree = ""; };
44 | 0341A0FF1AB49FEE00320BA8 /* Boot2Docker StatusTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "Boot2Docker StatusTests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; };
45 | 0341A1041AB49FEE00320BA8 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; };
46 | 0341A1051AB49FEE00320BA8 /* Boot2Docker_StatusTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = Boot2Docker_StatusTests.m; sourceTree = ""; };
47 | 0341A1231AB4A51500320BA8 /* docker@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "docker@2x.png"; sourceTree = ""; };
48 | 0341A1251AB4A60C00320BA8 /* docker-alt@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "docker-alt@2x.png"; sourceTree = ""; };
49 | 0341A1271AB4BC3500320BA8 /* docker-loading@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "docker-loading@2x.png"; sourceTree = ""; };
50 | 0341A12B1AB4C1E200320BA8 /* docker-full.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "docker-full.png"; sourceTree = ""; };
51 | 0341A1301AB4D5CF00320BA8 /* LaunchAtLoginController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = LaunchAtLoginController.h; sourceTree = ""; };
52 | 0341A1311AB4D60700320BA8 /* LaunchAtLoginController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = LaunchAtLoginController.m; sourceTree = ""; };
53 | AF625AC31AB87FBC00FDC72E /* docker-alt-dark@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "docker-alt-dark@2x.png"; sourceTree = ""; };
54 | AFA26B881AB8365500014A6F /* docker-dark@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "docker-dark@2x.png"; sourceTree = ""; };
55 | /* End PBXFileReference section */
56 |
57 | /* Begin PBXFrameworksBuildPhase section */
58 | 0341A0E91AB49FEE00320BA8 /* Frameworks */ = {
59 | isa = PBXFrameworksBuildPhase;
60 | buildActionMask = 2147483647;
61 | files = (
62 | );
63 | runOnlyForDeploymentPostprocessing = 0;
64 | };
65 | 0341A0FC1AB49FEE00320BA8 /* Frameworks */ = {
66 | isa = PBXFrameworksBuildPhase;
67 | buildActionMask = 2147483647;
68 | files = (
69 | );
70 | runOnlyForDeploymentPostprocessing = 0;
71 | };
72 | /* End PBXFrameworksBuildPhase section */
73 |
74 | /* Begin PBXGroup section */
75 | 0341A0E31AB49FEE00320BA8 = {
76 | isa = PBXGroup;
77 | children = (
78 | 0341A12B1AB4C1E200320BA8 /* docker-full.png */,
79 | 032563EC1AB50CA500B98388 /* boot2docker-status-icon.png */,
80 | 0341A1231AB4A51500320BA8 /* docker@2x.png */,
81 | AFA26B881AB8365500014A6F /* docker-dark@2x.png */,
82 | 0341A1251AB4A60C00320BA8 /* docker-alt@2x.png */,
83 | AF625AC31AB87FBC00FDC72E /* docker-alt-dark@2x.png */,
84 | 0341A1271AB4BC3500320BA8 /* docker-loading@2x.png */,
85 | 0341A0EE1AB49FEE00320BA8 /* Boot2Docker Status */,
86 | 0341A1021AB49FEE00320BA8 /* Boot2Docker StatusTests */,
87 | 0341A0ED1AB49FEE00320BA8 /* Products */,
88 | );
89 | sourceTree = "";
90 | };
91 | 0341A0ED1AB49FEE00320BA8 /* Products */ = {
92 | isa = PBXGroup;
93 | children = (
94 | 0341A0EC1AB49FEE00320BA8 /* Boot2Docker Status.app */,
95 | 0341A0FF1AB49FEE00320BA8 /* Boot2Docker StatusTests.xctest */,
96 | );
97 | name = Products;
98 | sourceTree = "";
99 | };
100 | 0341A0EE1AB49FEE00320BA8 /* Boot2Docker Status */ = {
101 | isa = PBXGroup;
102 | children = (
103 | 0341A0F11AB49FEE00320BA8 /* AppDelegate.h */,
104 | 0341A0F21AB49FEE00320BA8 /* AppDelegate.m */,
105 | 0341A0F61AB49FEE00320BA8 /* Images.xcassets */,
106 | 0341A0F81AB49FEE00320BA8 /* MainMenu.xib */,
107 | 0341A1301AB4D5CF00320BA8 /* LaunchAtLoginController.h */,
108 | 0341A1311AB4D60700320BA8 /* LaunchAtLoginController.m */,
109 | 0341A0EF1AB49FEE00320BA8 /* Supporting Files */,
110 | );
111 | path = "Boot2Docker Status";
112 | sourceTree = "";
113 | };
114 | 0341A0EF1AB49FEE00320BA8 /* Supporting Files */ = {
115 | isa = PBXGroup;
116 | children = (
117 | 0341A0F01AB49FEE00320BA8 /* Info.plist */,
118 | 0341A0F41AB49FEE00320BA8 /* main.m */,
119 | );
120 | name = "Supporting Files";
121 | sourceTree = "";
122 | };
123 | 0341A1021AB49FEE00320BA8 /* Boot2Docker StatusTests */ = {
124 | isa = PBXGroup;
125 | children = (
126 | 0341A1051AB49FEE00320BA8 /* Boot2Docker_StatusTests.m */,
127 | 0341A1031AB49FEE00320BA8 /* Supporting Files */,
128 | );
129 | path = "Boot2Docker StatusTests";
130 | sourceTree = "";
131 | };
132 | 0341A1031AB49FEE00320BA8 /* Supporting Files */ = {
133 | isa = PBXGroup;
134 | children = (
135 | 0341A1041AB49FEE00320BA8 /* Info.plist */,
136 | );
137 | name = "Supporting Files";
138 | sourceTree = "";
139 | };
140 | /* End PBXGroup section */
141 |
142 | /* Begin PBXNativeTarget section */
143 | 0341A0EB1AB49FEE00320BA8 /* Boot2Docker Status */ = {
144 | isa = PBXNativeTarget;
145 | buildConfigurationList = 0341A1091AB49FEE00320BA8 /* Build configuration list for PBXNativeTarget "Boot2Docker Status" */;
146 | buildPhases = (
147 | 0341A0E81AB49FEE00320BA8 /* Sources */,
148 | 0341A0E91AB49FEE00320BA8 /* Frameworks */,
149 | 0341A0EA1AB49FEE00320BA8 /* Resources */,
150 | );
151 | buildRules = (
152 | );
153 | dependencies = (
154 | );
155 | name = "Boot2Docker Status";
156 | productName = "Boot2Docker Status";
157 | productReference = 0341A0EC1AB49FEE00320BA8 /* Boot2Docker Status.app */;
158 | productType = "com.apple.product-type.application";
159 | };
160 | 0341A0FE1AB49FEE00320BA8 /* Boot2Docker StatusTests */ = {
161 | isa = PBXNativeTarget;
162 | buildConfigurationList = 0341A10C1AB49FEE00320BA8 /* Build configuration list for PBXNativeTarget "Boot2Docker StatusTests" */;
163 | buildPhases = (
164 | 0341A0FB1AB49FEE00320BA8 /* Sources */,
165 | 0341A0FC1AB49FEE00320BA8 /* Frameworks */,
166 | 0341A0FD1AB49FEE00320BA8 /* Resources */,
167 | );
168 | buildRules = (
169 | );
170 | dependencies = (
171 | 0341A1011AB49FEE00320BA8 /* PBXTargetDependency */,
172 | );
173 | name = "Boot2Docker StatusTests";
174 | productName = "Boot2Docker StatusTests";
175 | productReference = 0341A0FF1AB49FEE00320BA8 /* Boot2Docker StatusTests.xctest */;
176 | productType = "com.apple.product-type.bundle.unit-test";
177 | };
178 | /* End PBXNativeTarget section */
179 |
180 | /* Begin PBXProject section */
181 | 0341A0E41AB49FEE00320BA8 /* Project object */ = {
182 | isa = PBXProject;
183 | attributes = {
184 | LastUpgradeCheck = 0620;
185 | ORGANIZATIONNAME = "Nicholas Gartmann";
186 | TargetAttributes = {
187 | 0341A0EB1AB49FEE00320BA8 = {
188 | CreatedOnToolsVersion = 6.2;
189 | };
190 | 0341A0FE1AB49FEE00320BA8 = {
191 | CreatedOnToolsVersion = 6.2;
192 | TestTargetID = 0341A0EB1AB49FEE00320BA8;
193 | };
194 | };
195 | };
196 | buildConfigurationList = 0341A0E71AB49FEE00320BA8 /* Build configuration list for PBXProject "Boot2Docker Status" */;
197 | compatibilityVersion = "Xcode 3.2";
198 | developmentRegion = English;
199 | hasScannedForEncodings = 0;
200 | knownRegions = (
201 | en,
202 | Base,
203 | );
204 | mainGroup = 0341A0E31AB49FEE00320BA8;
205 | productRefGroup = 0341A0ED1AB49FEE00320BA8 /* Products */;
206 | projectDirPath = "";
207 | projectRoot = "";
208 | targets = (
209 | 0341A0EB1AB49FEE00320BA8 /* Boot2Docker Status */,
210 | 0341A0FE1AB49FEE00320BA8 /* Boot2Docker StatusTests */,
211 | );
212 | };
213 | /* End PBXProject section */
214 |
215 | /* Begin PBXResourcesBuildPhase section */
216 | 0341A0EA1AB49FEE00320BA8 /* Resources */ = {
217 | isa = PBXResourcesBuildPhase;
218 | buildActionMask = 2147483647;
219 | files = (
220 | 032563ED1AB50CA500B98388 /* boot2docker-status-icon.png in Resources */,
221 | 0341A12C1AB4C1E200320BA8 /* docker-full.png in Resources */,
222 | 0341A1261AB4A60C00320BA8 /* docker-alt@2x.png in Resources */,
223 | 0341A1241AB4A51500320BA8 /* docker@2x.png in Resources */,
224 | 0341A1281AB4BC3500320BA8 /* docker-loading@2x.png in Resources */,
225 | 0341A0F71AB49FEE00320BA8 /* Images.xcassets in Resources */,
226 | AFA26B891AB8365500014A6F /* docker-dark@2x.png in Resources */,
227 | AF625AC41AB87FBC00FDC72E /* docker-alt-dark@2x.png in Resources */,
228 | 0341A0FA1AB49FEE00320BA8 /* MainMenu.xib in Resources */,
229 | );
230 | runOnlyForDeploymentPostprocessing = 0;
231 | };
232 | 0341A0FD1AB49FEE00320BA8 /* Resources */ = {
233 | isa = PBXResourcesBuildPhase;
234 | buildActionMask = 2147483647;
235 | files = (
236 | );
237 | runOnlyForDeploymentPostprocessing = 0;
238 | };
239 | /* End PBXResourcesBuildPhase section */
240 |
241 | /* Begin PBXSourcesBuildPhase section */
242 | 0341A0E81AB49FEE00320BA8 /* Sources */ = {
243 | isa = PBXSourcesBuildPhase;
244 | buildActionMask = 2147483647;
245 | files = (
246 | 0341A1321AB4D60700320BA8 /* LaunchAtLoginController.m in Sources */,
247 | 0341A0F51AB49FEE00320BA8 /* main.m in Sources */,
248 | 0341A0F31AB49FEE00320BA8 /* AppDelegate.m in Sources */,
249 | );
250 | runOnlyForDeploymentPostprocessing = 0;
251 | };
252 | 0341A0FB1AB49FEE00320BA8 /* Sources */ = {
253 | isa = PBXSourcesBuildPhase;
254 | buildActionMask = 2147483647;
255 | files = (
256 | 0341A1061AB49FEE00320BA8 /* Boot2Docker_StatusTests.m in Sources */,
257 | );
258 | runOnlyForDeploymentPostprocessing = 0;
259 | };
260 | /* End PBXSourcesBuildPhase section */
261 |
262 | /* Begin PBXTargetDependency section */
263 | 0341A1011AB49FEE00320BA8 /* PBXTargetDependency */ = {
264 | isa = PBXTargetDependency;
265 | target = 0341A0EB1AB49FEE00320BA8 /* Boot2Docker Status */;
266 | targetProxy = 0341A1001AB49FEE00320BA8 /* PBXContainerItemProxy */;
267 | };
268 | /* End PBXTargetDependency section */
269 |
270 | /* Begin PBXVariantGroup section */
271 | 0341A0F81AB49FEE00320BA8 /* MainMenu.xib */ = {
272 | isa = PBXVariantGroup;
273 | children = (
274 | 0341A0F91AB49FEE00320BA8 /* Base */,
275 | );
276 | name = MainMenu.xib;
277 | sourceTree = "";
278 | };
279 | /* End PBXVariantGroup section */
280 |
281 | /* Begin XCBuildConfiguration section */
282 | 0341A1071AB49FEE00320BA8 /* Debug */ = {
283 | isa = XCBuildConfiguration;
284 | buildSettings = {
285 | ALWAYS_SEARCH_USER_PATHS = NO;
286 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
287 | CLANG_CXX_LIBRARY = "libc++";
288 | CLANG_ENABLE_MODULES = YES;
289 | CLANG_ENABLE_OBJC_ARC = YES;
290 | CLANG_WARN_BOOL_CONVERSION = YES;
291 | CLANG_WARN_CONSTANT_CONVERSION = YES;
292 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
293 | CLANG_WARN_EMPTY_BODY = YES;
294 | CLANG_WARN_ENUM_CONVERSION = YES;
295 | CLANG_WARN_INT_CONVERSION = YES;
296 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
297 | CLANG_WARN_UNREACHABLE_CODE = YES;
298 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
299 | CODE_SIGN_IDENTITY = "-";
300 | COPY_PHASE_STRIP = NO;
301 | ENABLE_STRICT_OBJC_MSGSEND = YES;
302 | GCC_C_LANGUAGE_STANDARD = gnu99;
303 | GCC_DYNAMIC_NO_PIC = NO;
304 | GCC_OPTIMIZATION_LEVEL = 0;
305 | GCC_PREPROCESSOR_DEFINITIONS = (
306 | "DEBUG=1",
307 | "$(inherited)",
308 | );
309 | GCC_SYMBOLS_PRIVATE_EXTERN = NO;
310 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
311 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
312 | GCC_WARN_UNDECLARED_SELECTOR = YES;
313 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
314 | GCC_WARN_UNUSED_FUNCTION = YES;
315 | GCC_WARN_UNUSED_VARIABLE = YES;
316 | MACOSX_DEPLOYMENT_TARGET = 10.10;
317 | MTL_ENABLE_DEBUG_INFO = YES;
318 | ONLY_ACTIVE_ARCH = YES;
319 | SDKROOT = macosx;
320 | };
321 | name = Debug;
322 | };
323 | 0341A1081AB49FEE00320BA8 /* Release */ = {
324 | isa = XCBuildConfiguration;
325 | buildSettings = {
326 | ALWAYS_SEARCH_USER_PATHS = NO;
327 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
328 | CLANG_CXX_LIBRARY = "libc++";
329 | CLANG_ENABLE_MODULES = YES;
330 | CLANG_ENABLE_OBJC_ARC = YES;
331 | CLANG_WARN_BOOL_CONVERSION = YES;
332 | CLANG_WARN_CONSTANT_CONVERSION = YES;
333 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
334 | CLANG_WARN_EMPTY_BODY = YES;
335 | CLANG_WARN_ENUM_CONVERSION = YES;
336 | CLANG_WARN_INT_CONVERSION = YES;
337 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
338 | CLANG_WARN_UNREACHABLE_CODE = YES;
339 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
340 | CODE_SIGN_IDENTITY = "-";
341 | COPY_PHASE_STRIP = NO;
342 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
343 | ENABLE_NS_ASSERTIONS = NO;
344 | ENABLE_STRICT_OBJC_MSGSEND = YES;
345 | GCC_C_LANGUAGE_STANDARD = gnu99;
346 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
347 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
348 | GCC_WARN_UNDECLARED_SELECTOR = YES;
349 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
350 | GCC_WARN_UNUSED_FUNCTION = YES;
351 | GCC_WARN_UNUSED_VARIABLE = YES;
352 | MACOSX_DEPLOYMENT_TARGET = 10.10;
353 | MTL_ENABLE_DEBUG_INFO = NO;
354 | SDKROOT = macosx;
355 | };
356 | name = Release;
357 | };
358 | 0341A10A1AB49FEE00320BA8 /* Debug */ = {
359 | isa = XCBuildConfiguration;
360 | buildSettings = {
361 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
362 | COMBINE_HIDPI_IMAGES = YES;
363 | INFOPLIST_FILE = "Boot2Docker Status/Info.plist";
364 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks";
365 | PRODUCT_NAME = "$(TARGET_NAME)";
366 | };
367 | name = Debug;
368 | };
369 | 0341A10B1AB49FEE00320BA8 /* Release */ = {
370 | isa = XCBuildConfiguration;
371 | buildSettings = {
372 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
373 | COMBINE_HIDPI_IMAGES = YES;
374 | INFOPLIST_FILE = "Boot2Docker Status/Info.plist";
375 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks";
376 | PRODUCT_NAME = "$(TARGET_NAME)";
377 | };
378 | name = Release;
379 | };
380 | 0341A10D1AB49FEE00320BA8 /* Debug */ = {
381 | isa = XCBuildConfiguration;
382 | buildSettings = {
383 | BUNDLE_LOADER = "$(TEST_HOST)";
384 | COMBINE_HIDPI_IMAGES = YES;
385 | FRAMEWORK_SEARCH_PATHS = (
386 | "$(DEVELOPER_FRAMEWORKS_DIR)",
387 | "$(inherited)",
388 | );
389 | GCC_PREPROCESSOR_DEFINITIONS = (
390 | "DEBUG=1",
391 | "$(inherited)",
392 | );
393 | INFOPLIST_FILE = "Boot2Docker StatusTests/Info.plist";
394 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks";
395 | PRODUCT_NAME = "$(TARGET_NAME)";
396 | TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Boot2Docker Status.app/Contents/MacOS/Boot2Docker Status";
397 | };
398 | name = Debug;
399 | };
400 | 0341A10E1AB49FEE00320BA8 /* Release */ = {
401 | isa = XCBuildConfiguration;
402 | buildSettings = {
403 | BUNDLE_LOADER = "$(TEST_HOST)";
404 | COMBINE_HIDPI_IMAGES = YES;
405 | FRAMEWORK_SEARCH_PATHS = (
406 | "$(DEVELOPER_FRAMEWORKS_DIR)",
407 | "$(inherited)",
408 | );
409 | INFOPLIST_FILE = "Boot2Docker StatusTests/Info.plist";
410 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks";
411 | PRODUCT_NAME = "$(TARGET_NAME)";
412 | TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Boot2Docker Status.app/Contents/MacOS/Boot2Docker Status";
413 | };
414 | name = Release;
415 | };
416 | /* End XCBuildConfiguration section */
417 |
418 | /* Begin XCConfigurationList section */
419 | 0341A0E71AB49FEE00320BA8 /* Build configuration list for PBXProject "Boot2Docker Status" */ = {
420 | isa = XCConfigurationList;
421 | buildConfigurations = (
422 | 0341A1071AB49FEE00320BA8 /* Debug */,
423 | 0341A1081AB49FEE00320BA8 /* Release */,
424 | );
425 | defaultConfigurationIsVisible = 0;
426 | defaultConfigurationName = Release;
427 | };
428 | 0341A1091AB49FEE00320BA8 /* Build configuration list for PBXNativeTarget "Boot2Docker Status" */ = {
429 | isa = XCConfigurationList;
430 | buildConfigurations = (
431 | 0341A10A1AB49FEE00320BA8 /* Debug */,
432 | 0341A10B1AB49FEE00320BA8 /* Release */,
433 | );
434 | defaultConfigurationIsVisible = 0;
435 | defaultConfigurationName = Release;
436 | };
437 | 0341A10C1AB49FEE00320BA8 /* Build configuration list for PBXNativeTarget "Boot2Docker StatusTests" */ = {
438 | isa = XCConfigurationList;
439 | buildConfigurations = (
440 | 0341A10D1AB49FEE00320BA8 /* Debug */,
441 | 0341A10E1AB49FEE00320BA8 /* Release */,
442 | );
443 | defaultConfigurationIsVisible = 0;
444 | defaultConfigurationName = Release;
445 | };
446 | /* End XCConfigurationList section */
447 | };
448 | rootObject = 0341A0E41AB49FEE00320BA8 /* Project object */;
449 | }
450 |
--------------------------------------------------------------------------------