├── FlyingToasters.gif
├── Flying Toasters
├── thumbnail.png
├── thumbnail@2x.png
├── Textures
│ ├── toast0.gif
│ ├── toast1.gif
│ ├── toast2.gif
│ ├── toast3.gif
│ ├── toaster01.png
│ ├── toaster02.png
│ ├── toaster03.png
│ └── toaster04.png
├── ScreenSaverScene.h
├── FlyingToasterScreenSaverView.h
├── FlyingToastersView.h
├── FlyingToasterPreferencesController.h
├── ScreenSaverScene.m
├── ToasterDefaults.h
├── Info.plist
├── ToasterDefaults.m
├── FlyingToasterScreenSaverView.m
├── FlyingToasterPreferencesController.m
├── FlyingToasterPreferencesController.xib
└── FlyingToastersView.m
├── .gitignore
├── Flying Toasters.xcodeproj
├── project.xcworkspace
│ ├── contents.xcworkspacedata
│ └── xcshareddata
│ │ ├── WorkspaceSettings.xcsettings
│ │ └── IDEWorkspaceChecks.plist
├── xcshareddata
│ └── xcschemes
│ │ └── Flying Toasters.xcscheme
└── project.pbxproj
├── Flying Toaster Test
├── main.m
├── AppDelegate.h
├── Images.xcassets
│ └── AppIcon.appiconset
│ │ └── Contents.json
├── Info.plist
├── AppDelegate.m
└── Base.lproj
│ └── MainMenu.xib
├── README.md
└── LICENSE
/FlyingToasters.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/robertventurini/FlyingToasters/HEAD/FlyingToasters.gif
--------------------------------------------------------------------------------
/Flying Toasters/thumbnail.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/robertventurini/FlyingToasters/HEAD/Flying Toasters/thumbnail.png
--------------------------------------------------------------------------------
/Flying Toasters/thumbnail@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/robertventurini/FlyingToasters/HEAD/Flying Toasters/thumbnail@2x.png
--------------------------------------------------------------------------------
/Flying Toasters/Textures/toast0.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/robertventurini/FlyingToasters/HEAD/Flying Toasters/Textures/toast0.gif
--------------------------------------------------------------------------------
/Flying Toasters/Textures/toast1.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/robertventurini/FlyingToasters/HEAD/Flying Toasters/Textures/toast1.gif
--------------------------------------------------------------------------------
/Flying Toasters/Textures/toast2.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/robertventurini/FlyingToasters/HEAD/Flying Toasters/Textures/toast2.gif
--------------------------------------------------------------------------------
/Flying Toasters/Textures/toast3.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/robertventurini/FlyingToasters/HEAD/Flying Toasters/Textures/toast3.gif
--------------------------------------------------------------------------------
/Flying Toasters/Textures/toaster01.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/robertventurini/FlyingToasters/HEAD/Flying Toasters/Textures/toaster01.png
--------------------------------------------------------------------------------
/Flying Toasters/Textures/toaster02.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/robertventurini/FlyingToasters/HEAD/Flying Toasters/Textures/toaster02.png
--------------------------------------------------------------------------------
/Flying Toasters/Textures/toaster03.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/robertventurini/FlyingToasters/HEAD/Flying Toasters/Textures/toaster03.png
--------------------------------------------------------------------------------
/Flying Toasters/Textures/toaster04.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/robertventurini/FlyingToasters/HEAD/Flying Toasters/Textures/toaster04.png
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 |
2 | # Mac Attributes
3 | .DS_Store
4 |
5 | ## Xcode
6 | *.xcscmblueprint
7 | *xcworkspace/xcuserdata/*
8 |
9 | ## User settings
10 | xcuserdata
--------------------------------------------------------------------------------
/Flying Toasters.xcodeproj/project.xcworkspace/contents.xcworkspacedata:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/Flying Toasters.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/Flying Toasters/ScreenSaverScene.h:
--------------------------------------------------------------------------------
1 | //
2 | // ScreenSaverScene.h
3 | // Flying Toasters
4 | //
5 | // Created by Robert Venturini on 3/9/19.
6 | // Copyright © 2019 Robert Venturini. All rights reserved.
7 | //
8 |
9 | #import
10 |
11 | @interface ScreenSaverScene : SKScene
12 |
13 | @end
14 |
--------------------------------------------------------------------------------
/Flying Toaster Test/main.m:
--------------------------------------------------------------------------------
1 | //
2 | // main.m
3 | // Flying Toaster Test
4 | //
5 | // Created by Robert Venturini on 3/9/19.
6 | // Copyright (c) 2019 Robert Venturini. All rights reserved.
7 | //
8 |
9 | #import
10 |
11 | int main(int argc, const char * argv[]) {
12 | return NSApplicationMain(argc, argv);
13 | }
14 |
--------------------------------------------------------------------------------
/Flying Toasters.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | IDEDidComputeMac32BitWarning
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/Flying Toaster Test/AppDelegate.h:
--------------------------------------------------------------------------------
1 | //
2 | // AppDelegate.h
3 | // Flying Toaster Test
4 | //
5 | // Created by Robert Venturini on 3/9/19.
6 | // Copyright (c) 2019 Robert Venturini. All rights reserved.
7 | //
8 |
9 | #import
10 |
11 | @interface AppDelegate : NSObject
12 |
13 |
14 | @end
15 |
16 |
--------------------------------------------------------------------------------
/Flying Toasters/FlyingToasterScreenSaverView.h:
--------------------------------------------------------------------------------
1 | //
2 | // FlyingToasterScreenSaverView.h
3 | // Flying Toasters
4 | //
5 | // Created by Robert Venturini on 3/9/19.
6 | // Copyright © 2019 Robert Venturini. All rights reserved.
7 | //
8 |
9 | #import
10 | #import
11 |
12 | @interface FlyingToasterScreenSaverView : ScreenSaverView
13 |
14 | @end
15 |
16 |
--------------------------------------------------------------------------------
/Flying Toasters/FlyingToastersView.h:
--------------------------------------------------------------------------------
1 | //
2 | // FlyingToastersView.h
3 | // Flying Toasters
4 | //
5 | // Created by Robert Venturini on 3/8/19.
6 | // Copyright © 2019 Robert Venturini. All rights reserved.
7 | //
8 |
9 | #import
10 | #import "ToasterDefaults.h"
11 |
12 | @interface FlyingToastersView : SKView
13 |
14 | @property ToastLevel toastLevel; // defaults to GoldenBrownToast
15 | @property FlightSpeed speed; // defaults to MediumSpeed
16 | @property NSUInteger numOfToasters; // defaults to 6
17 |
18 | - (void)start;
19 | - (void)end;
20 | @end
21 |
--------------------------------------------------------------------------------
/Flying Toasters/FlyingToasterPreferencesController.h:
--------------------------------------------------------------------------------
1 | //
2 | // FlyingToasterPreferencesController.h
3 | // Flying Toasters
4 | //
5 | // Created by Robert Venturini on 3/9/19.
6 | // Copyright © 2019 Robert Venturini. All rights reserved.
7 | //
8 |
9 | #import
10 |
11 | @protocol FlyingToasterPreferencesDelegate;
12 |
13 | @interface FlyingToasterPreferencesController : NSWindowController
14 | @property (weak) id delegate;
15 | @end
16 |
17 |
18 | @protocol FlyingToasterPreferencesDelegate
19 | - (void)flyingToasterPreferencesDidFinish:(FlyingToasterPreferencesController*)prefs;
20 | @end
21 |
--------------------------------------------------------------------------------
/Flying Toasters/ScreenSaverScene.m:
--------------------------------------------------------------------------------
1 | //
2 | // ScreenSaverScene.m
3 | // Flying Toasters
4 | //
5 | // Created by Robert Venturini on 3/9/19.
6 | // Copyright © 2019 Robert Venturini. All rights reserved.
7 | //
8 |
9 | #import "ScreenSaverScene.h"
10 |
11 | @interface ScreenSaverScene ()
12 |
13 | @end
14 |
15 | @implementation ScreenSaverScene
16 |
17 | - (instancetype)initWithSize:(CGSize)size
18 | {
19 | if (self = [super initWithSize:size]) {
20 |
21 | }
22 |
23 | return self;
24 | }
25 |
26 | - (BOOL)acceptsFirstResponder
27 | {
28 | // This scene is intended for use in a screensaver -- do not override the
29 | // built in screensaver catches or it will be difficult to end...
30 | return NO;
31 | }
32 |
33 | @end
34 |
--------------------------------------------------------------------------------
/Flying Toasters/ToasterDefaults.h:
--------------------------------------------------------------------------------
1 | //
2 | // ToasterDefaults.h
3 | // Flying Toasters
4 | //
5 | // Created by Robert Venturini on 3/9/19.
6 | // Copyright © 2019 Robert Venturini. All rights reserved.
7 | //
8 |
9 | #import
10 | #import
11 |
12 | typedef NS_ENUM(NSUInteger, ToastLevel) {
13 | kLightToast,
14 | kGoldenBrownToast,
15 | kDarkToast,
16 | kBurntToast
17 | };
18 |
19 | typedef NS_ENUM(NSUInteger, FlightSpeed) {
20 | kSnailSpeed = 20,
21 | kSlowSpeed = 10,
22 | kMediumSpeed = 8,
23 | kFastSpeed = 3,
24 | kLightningSpeed = 1
25 | };
26 |
27 | @interface ToasterDefaults : ScreenSaverDefaults
28 | + (FlightSpeed)getFlightSpeed;
29 | + (void)setFlightSpeed:(FlightSpeed)speed;
30 |
31 | + (ToastLevel)getToastLevel;
32 | + (void)setToastLevel:(ToastLevel)level;
33 |
34 | + (void)setNumberOfToasters:(NSUInteger)numOfToasters;
35 | + (NSUInteger)getNumberOfToasters;
36 |
37 | @end
38 |
--------------------------------------------------------------------------------
/Flying Toasters/Info.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | CFBundleDevelopmentRegion
6 | en
7 | CFBundleExecutable
8 | $(EXECUTABLE_NAME)
9 | CFBundleIdentifier
10 | com.robert-venturini.$(PRODUCT_NAME:rfc1034identifier)
11 | CFBundleInfoDictionaryVersion
12 | 6.0
13 | CFBundleName
14 | $(PRODUCT_NAME)
15 | CFBundlePackageType
16 | BNDL
17 | CFBundleShortVersionString
18 | 1.2
19 | CFBundleSignature
20 | ????
21 | CFBundleVersion
22 | 1
23 | NSHumanReadableCopyright
24 | Copyright © 2019 Robert Venturini. All rights reserved.
25 | NSPrincipalClass
26 | FlyingToasterScreenSaverView
27 |
28 |
29 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # FlyingToasters
2 | Recreation of AfterDarks 2.0 Flying Toasters screensaver for macOS
3 |
4 | Dissatisfied with a few of the Flying Toaster screensaver clones that exist for modern macOS, I set off to implement one that felt more true to Berkley Systems After Dark 2.0 version of my youth.
5 | Due to a breadth of legacy and modern hardware in my personal collection, I opted for ObjC as the language here but may chose to modernize this in the future. I've also intentionally omitted collision detection and physics from the design in this initial version. I hope to add it in a subsequent version later and perhaps even add support for similar variety that Berkley Systems did through each of their After Dark Releases.
6 |
7 | 
8 |
9 | This project was inspired by Bryan Brauns work on his project, [After Dark CSS](https://github.com/bryanbraun/after-dark-css).
10 | The image resources for the toaster and toast came from his repository directly and as he states there, are © 1989 Berkeley Systems Inc.
11 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2020 Robert Venturini
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
--------------------------------------------------------------------------------
/Flying Toaster Test/Images.xcassets/AppIcon.appiconset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "idiom" : "mac",
5 | "size" : "16x16",
6 | "scale" : "1x"
7 | },
8 | {
9 | "idiom" : "mac",
10 | "size" : "16x16",
11 | "scale" : "2x"
12 | },
13 | {
14 | "idiom" : "mac",
15 | "size" : "32x32",
16 | "scale" : "1x"
17 | },
18 | {
19 | "idiom" : "mac",
20 | "size" : "32x32",
21 | "scale" : "2x"
22 | },
23 | {
24 | "idiom" : "mac",
25 | "size" : "128x128",
26 | "scale" : "1x"
27 | },
28 | {
29 | "idiom" : "mac",
30 | "size" : "128x128",
31 | "scale" : "2x"
32 | },
33 | {
34 | "idiom" : "mac",
35 | "size" : "256x256",
36 | "scale" : "1x"
37 | },
38 | {
39 | "idiom" : "mac",
40 | "size" : "256x256",
41 | "scale" : "2x"
42 | },
43 | {
44 | "idiom" : "mac",
45 | "size" : "512x512",
46 | "scale" : "1x"
47 | },
48 | {
49 | "idiom" : "mac",
50 | "size" : "512x512",
51 | "scale" : "2x"
52 | }
53 | ],
54 | "info" : {
55 | "version" : 1,
56 | "author" : "xcode"
57 | }
58 | }
--------------------------------------------------------------------------------
/Flying Toaster Test/Info.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | CFBundleDevelopmentRegion
6 | en
7 | CFBundleExecutable
8 | $(EXECUTABLE_NAME)
9 | CFBundleIconFile
10 |
11 | CFBundleIdentifier
12 | com.robert-venturini.$(PRODUCT_NAME:rfc1034identifier)
13 | CFBundleInfoDictionaryVersion
14 | 6.0
15 | CFBundleName
16 | $(PRODUCT_NAME)
17 | CFBundlePackageType
18 | APPL
19 | CFBundleShortVersionString
20 | 1.0
21 | CFBundleSignature
22 | ????
23 | CFBundleVersion
24 | 1
25 | LSMinimumSystemVersion
26 | $(MACOSX_DEPLOYMENT_TARGET)
27 | NSHumanReadableCopyright
28 | Copyright © 2019 Robert Venturini. All rights reserved.
29 | NSMainNibFile
30 | MainMenu
31 | NSPrincipalClass
32 | NSApplication
33 |
34 |
35 |
--------------------------------------------------------------------------------
/Flying Toasters/ToasterDefaults.m:
--------------------------------------------------------------------------------
1 | //
2 | // ToasterDefaults.m
3 | // Flying Toasters
4 | //
5 | // Created by Robert Venturini on 3/9/19.
6 | // Copyright © 2019 Robert Venturini. All rights reserved.
7 | //
8 |
9 | #import "ToasterDefaults.h"
10 |
11 | static NSString* ToasterDefaultsFlightSpeedKey = @"toaster_flight_speed";
12 | static NSString* ToasterDefaultsToastLevelKey = @"toast_level";
13 | static NSString* ToasterDefaultsNumberOfToastersKey = @"number_of_toasters";
14 |
15 | @implementation ToasterDefaults
16 | + (ScreenSaverDefaults*)_defaults
17 | {
18 | ScreenSaverDefaults* defaults =
19 | [ScreenSaverDefaults defaultsForModuleWithName:@"Flying Toasters"];
20 |
21 | [defaults synchronize];
22 |
23 | return defaults;
24 | }
25 |
26 | + (FlightSpeed)getFlightSpeed
27 | {
28 | NSNumber* speedNum = [[self _defaults] objectForKey:ToasterDefaultsFlightSpeedKey];
29 |
30 | if (speedNum) {
31 | return [speedNum unsignedIntegerValue];
32 | }
33 |
34 | return kMediumSpeed;
35 | }
36 |
37 | + (void)setFlightSpeed:(FlightSpeed)speed
38 | {
39 | [[self _defaults] setObject:@(speed) forKey:ToasterDefaultsFlightSpeedKey];
40 | }
41 |
42 | + (ToastLevel)getToastLevel
43 | {
44 | NSNumber* toastLevel = [[self _defaults] objectForKey:ToasterDefaultsToastLevelKey];
45 |
46 | if (toastLevel) {
47 | return [toastLevel unsignedIntegerValue];
48 | }
49 |
50 | return kGoldenBrownToast;
51 | }
52 |
53 | + (void)setToastLevel:(ToastLevel)level
54 | {
55 | [[self _defaults] setObject:@(level) forKey:ToasterDefaultsToastLevelKey];
56 | }
57 |
58 | + (void)setNumberOfToasters:(NSUInteger)numOfToasters
59 | {
60 | [[self _defaults] setObject:@(numOfToasters) forKey:ToasterDefaultsNumberOfToastersKey];
61 | }
62 |
63 | + (NSUInteger)getNumberOfToasters
64 | {
65 | NSNumber* numOfToasters = [[self _defaults] objectForKey:ToasterDefaultsNumberOfToastersKey];
66 |
67 | if (numOfToasters != nil) {
68 | return [numOfToasters unsignedIntegerValue];
69 | }
70 |
71 | return 6;
72 | }
73 |
74 | @end
75 |
--------------------------------------------------------------------------------
/Flying Toaster Test/AppDelegate.m:
--------------------------------------------------------------------------------
1 | //
2 | // AppDelegate.m
3 | // Flying Toaster Test
4 | //
5 | // Created by Robert Venturini on 3/9/19.
6 | // Copyright (c) 2019 Robert Venturini. All rights reserved.
7 | //
8 |
9 | #import "AppDelegate.h"
10 | #import "FlyingToasterScreenSaverView.h"
11 | #import "FlyingToasterPreferencesController.h"
12 |
13 | @interface AppDelegate ()
14 |
15 | @property (weak) IBOutlet NSWindow *window;
16 | @property (strong) FlyingToasterPreferencesController* preferencesController;
17 | @property (strong) FlyingToasterScreenSaverView* ftv;
18 | @end
19 |
20 | @implementation AppDelegate
21 |
22 | - (void)applicationDidFinishLaunching:(NSNotification *)aNotification {
23 | // Insert code here to initialize your application
24 | self.ftv = [[FlyingToasterScreenSaverView alloc] init];
25 | self.ftv.frame = self.window.contentView.bounds;
26 | [self.window.contentView addSubview:self.ftv];
27 |
28 | self.ftv.translatesAutoresizingMaskIntoConstraints = NO;
29 | [self.window.contentView addConstraints:
30 | [NSLayoutConstraint constraintsWithVisualFormat:@"H:|[_ftv]|" options:NSLayoutFormatAlignAllCenterY metrics:nil views:NSDictionaryOfVariableBindings(_ftv)]];
31 |
32 | [self.window.contentView addConstraints:
33 | [NSLayoutConstraint constraintsWithVisualFormat:@"V:|[_ftv]|" options:NSLayoutFormatAlignAllCenterX metrics:nil views:NSDictionaryOfVariableBindings(_ftv)]];
34 |
35 | [self.window makeKeyAndOrderFront:nil];
36 | [self.ftv startAnimation];
37 |
38 | self.preferencesController =
39 | [[FlyingToasterPreferencesController alloc] initWithWindowNibName:@"FlyingToasterPreferencesController"];
40 | [self.preferencesController.window setTitle:@"Flying Toaster Test Preferences"];
41 | self.preferencesController.delegate = self;
42 |
43 | NSWindow* preferencesWindow = self.preferencesController.window;
44 | [preferencesWindow setStyleMask:NSWindowStyleMaskTitled|NSWindowStyleMaskClosable];
45 |
46 |
47 |
48 | // Test line to ensure we exit cleanly
49 | // [self.ftv performSelector:@selector(stopAnimation) withObject:nil afterDelay:10];
50 | };
51 |
52 | - (IBAction)didSelectPrefences:(id)sender
53 | {
54 | [self.preferencesController showWindow:self];
55 | }
56 |
57 | - (void)applicationWillTerminate:(NSNotification *)aNotification {
58 | // Insert code here to tear down your application
59 | }
60 |
61 | - (void)flyingToasterPreferencesDidFinish:(FlyingToasterPreferencesController*)prefs
62 | {
63 | // Restart
64 | [self.ftv stopAnimation];
65 | [self.ftv startAnimation];
66 |
67 | [[prefs window] close];
68 | }
69 |
70 | @end
71 |
--------------------------------------------------------------------------------
/Flying Toasters.xcodeproj/xcshareddata/xcschemes/Flying Toasters.xcscheme:
--------------------------------------------------------------------------------
1 |
2 |
5 |
8 |
9 |
15 |
21 |
22 |
23 |
24 |
25 |
30 |
31 |
32 |
33 |
43 |
44 |
50 |
51 |
57 |
58 |
59 |
60 |
62 |
63 |
66 |
67 |
68 |
--------------------------------------------------------------------------------
/Flying Toasters/FlyingToasterScreenSaverView.m:
--------------------------------------------------------------------------------
1 | //
2 | // FlyingToasterScreenSaverView.m
3 | // Flying Toasters
4 | //
5 | // Created by Robert Venturini on 3/9/19.
6 | // Copyright © 2019 Robert Venturini. All rights reserved.
7 | //
8 |
9 | #import "FlyingToasterPreferencesController.h"
10 | #import "FlyingToastersView.h"
11 | #import "FlyingToasterScreenSaverView.h"
12 |
13 | static NSNotificationName const ScreenSaverWillStopNotificationName = @"com.apple.screensaver.willstop";
14 |
15 | @interface FlyingToasterScreenSaverView ()
16 | @property (strong) FlyingToastersView* ftv;
17 | @property (strong) FlyingToasterPreferencesController* prefsController;
18 | @end
19 |
20 | @implementation FlyingToasterScreenSaverView
21 | - (instancetype)initWithFrame:(NSRect)frame isPreview:(BOOL)isPreview
22 | {
23 | if (self = [super initWithFrame:frame isPreview:isPreview]) {
24 | [self setAnimationTimeInterval:1/30.0];
25 |
26 | _ftv = [[FlyingToastersView alloc] init];
27 | _ftv.frame = NSMakeRect(0, 0, frame.size.width, frame.size.height);
28 |
29 | [self addSubview:_ftv];
30 |
31 |
32 | [[NSDistributedNotificationCenter defaultCenter] addObserver:self
33 | selector:@selector(screenSaverWillStopNotification:)
34 | name:ScreenSaverWillStopNotificationName
35 | object:nil];
36 | }
37 |
38 | return self;
39 | }
40 |
41 | - (void)setFrame:(NSRect)frame
42 | {
43 | [super setFrame:frame];
44 | _ftv.frame = NSMakeRect(0, 0, frame.size.width, frame.size.height);
45 | }
46 |
47 | - (void)startAnimation
48 | {
49 | [super startAnimation];
50 |
51 | self.ftv.toastLevel = [ToasterDefaults getToastLevel];
52 | self.ftv.speed = [ToasterDefaults getFlightSpeed];
53 | self.ftv.numOfToasters = [ToasterDefaults getNumberOfToasters];
54 |
55 | [self.ftv start];
56 | }
57 |
58 | - (void)stopAnimation
59 | {
60 | [super stopAnimation];
61 | [self.ftv end];
62 | }
63 |
64 | - (void)animateOneFrame
65 | {
66 | return;
67 | }
68 |
69 | - (BOOL)hasConfigureSheet
70 | {
71 | return YES;
72 | }
73 |
74 | - (NSWindow*)configureSheet
75 | {
76 | _prefsController =
77 | [[FlyingToasterPreferencesController alloc] initWithWindowNibName:@"FlyingToasterPreferencesController"];
78 |
79 | return _prefsController.window;
80 | }
81 |
82 | - (void)screenSaverWillStopNotification:(NSNotification*)notification
83 | {
84 | if (@available(macOS 14.0, *)) {
85 | // Bug in macOS 14+ warrants forcefully exiting the screensaver
86 | // so that the 'legacyScreenSaver' process will also quit and release its memory.
87 | // This is hacky, but seems to side step the problem.
88 | // This approach was reported working on the aerial screensaver here:
89 | // https://github.com/JohnCoates/Aerial/issues/1305
90 | exit(0);
91 | }
92 | }
93 |
94 | @end
95 |
--------------------------------------------------------------------------------
/Flying Toasters/FlyingToasterPreferencesController.m:
--------------------------------------------------------------------------------
1 | //
2 | // FlyingToasterPreferencesController.m
3 | // Flying Toasters
4 | //
5 | // Created by Robert Venturini on 3/9/19.
6 | // Copyright © 2019 Robert Venturini. All rights reserved.
7 | //
8 |
9 | #import "FlyingToasterPreferencesController.h"
10 | #import "ToasterDefaults.h"
11 |
12 | @interface FlyingToasterPreferencesController ()
13 | @property (weak) IBOutlet NSSlider* speedSlider;
14 | @property (weak) IBOutlet NSSlider* toastSlider;
15 | @property (weak) IBOutlet NSSlider* densitySlider;
16 | @end
17 |
18 | @implementation FlyingToasterPreferencesController
19 | - (void)windowDidLoad {
20 | [super windowDidLoad];
21 |
22 | self.speedSlider.integerValue =
23 | [self tickerValueForFlightSpeed:[ToasterDefaults getFlightSpeed]];
24 |
25 | self.toastSlider.integerValue =
26 | [self tickerValueForToastLevel:[ToasterDefaults getToastLevel]];
27 |
28 | self.densitySlider.integerValue = [ToasterDefaults getNumberOfToasters];
29 | }
30 |
31 | #pragma mark - Translation Methods
32 | - (NSUInteger)tickerValueForFlightSpeed:(FlightSpeed)speed
33 | {
34 | switch (speed) {
35 | case kSnailSpeed:
36 | return 0;
37 | break;
38 |
39 | case kSlowSpeed:
40 | return 1;
41 | break;
42 |
43 | case kMediumSpeed:
44 | return 2;
45 | break;
46 |
47 | case kFastSpeed:
48 | return 3;
49 | break;
50 |
51 | case kLightningSpeed:
52 | return 4;
53 | break;
54 | }
55 | }
56 |
57 | - (FlightSpeed)speedForTickerValue:(NSUInteger)tickerValue
58 | {
59 | if (tickerValue < 1) {
60 | return kSnailSpeed;
61 | }
62 |
63 | if (tickerValue == 1) {
64 | return kSlowSpeed;
65 | }
66 |
67 | if (tickerValue == 2) {
68 | return kMediumSpeed;
69 | }
70 |
71 | if (tickerValue == 3) {
72 | return kFastSpeed;
73 | }
74 |
75 | if (tickerValue > 3) {
76 | return kLightningSpeed;
77 | }
78 |
79 | return kMediumSpeed;
80 | }
81 |
82 | - (NSUInteger)tickerValueForToastLevel:(ToastLevel)level
83 | {
84 | switch (level) {
85 | case kLightToast:
86 | return 0;
87 | break;
88 |
89 | case kGoldenBrownToast:
90 | return 1;
91 | break;
92 |
93 | case kDarkToast:
94 | return 2;
95 | break;
96 |
97 | case kBurntToast:
98 | return 3;
99 | break;
100 | }
101 | }
102 |
103 | - (ToastLevel)levelForTickerValue:(NSUInteger)tickerValue
104 | {
105 | if (tickerValue < 1) {
106 | return kLightToast;
107 | }
108 |
109 | if (tickerValue == 2) {
110 | return kDarkToast;
111 | }
112 |
113 | if (tickerValue > 2) {
114 | return kBurntToast;
115 | }
116 | return kGoldenBrownToast;
117 | }
118 |
119 | #pragma mark - Actions
120 | - (IBAction)didPressDone:(id)sender
121 | {
122 | if (self.delegate != nil) {
123 | [self.delegate flyingToasterPreferencesDidFinish:self];
124 | return;
125 | }
126 |
127 | // Actual screensaver return here...
128 | [self.window.sheetParent endSheet:self.window returnCode:NSModalResponseOK];
129 | }
130 |
131 | - (IBAction)didChangeToastLevel:(NSSlider*)toastSlider
132 | {
133 | ToastLevel level = [self levelForTickerValue:toastSlider.integerValue];
134 | [ToasterDefaults setToastLevel:level];
135 | }
136 |
137 | - (IBAction)didChangeFlightSpeed:(NSSlider*)speedSlider
138 | {
139 | FlightSpeed speed = [self speedForTickerValue:speedSlider.integerValue];
140 | [ToasterDefaults setFlightSpeed:speed];
141 | }
142 |
143 | - (IBAction)didChangeToasterDensity:(NSSlider*)densitySlider
144 | {
145 | [ToasterDefaults setNumberOfToasters:densitySlider.intValue];
146 | NSLog(@"[Flying Toasters] - density changed: %d", densitySlider.intValue);
147 | }
148 |
149 | @end
150 |
--------------------------------------------------------------------------------
/Flying Toaster Test/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 |
96 |
97 |
98 |
99 |
100 |
101 |
102 |
103 |
104 |
105 |
106 |
107 |
108 |
109 |
--------------------------------------------------------------------------------
/Flying Toasters/FlyingToasterPreferencesController.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 |
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 |
90 |
91 |
92 |
93 |
94 |
95 |
96 |
97 |
98 |
99 |
100 |
101 |
102 |
103 |
104 |
105 |
106 |
107 |
108 |
109 |
110 |
111 |
112 |
113 |
114 |
115 |
116 |
117 |
118 |
119 |
120 |
121 |
122 |
123 |
124 |
125 |
126 |
--------------------------------------------------------------------------------
/Flying Toasters/FlyingToastersView.m:
--------------------------------------------------------------------------------
1 | //
2 | // FlyingToastersView.m
3 | // Flying Toasters
4 | //
5 | // Created by Robert Venturini on 3/8/19.
6 | // Copyright © 2019 Robert Venturini. All rights reserved.
7 | //
8 |
9 | #import "FlyingToastersView.h"
10 | #import "ScreenSaverScene.h"
11 |
12 | @interface FlyingToastersView ()
13 | @property (strong) ScreenSaverScene* toasterScene;
14 |
15 | @property (readonly) CGFloat speedMultiplier;
16 | @property (readonly) CGFloat fastSpeedMultipler;
17 | @end
18 |
19 | @implementation FlyingToastersView
20 | - (instancetype)init
21 | {
22 | if (self = [super initWithFrame:NSZeroRect]) {
23 | _speed = kMediumSpeed;
24 | _toastLevel = kGoldenBrownToast;
25 |
26 | _toasterScene = [[ScreenSaverScene alloc] initWithSize:self.frame.size];
27 | _toasterScene.backgroundColor = [NSColor blackColor];
28 |
29 | [self presentScene:_toasterScene];
30 | }
31 |
32 | return self;
33 | }
34 |
35 | - (void)setFrame:(NSRect)frame
36 | {
37 | [super setFrame:frame];
38 | _toasterScene.size = frame.size;
39 | }
40 |
41 | - (CGFloat)speedMultiplier
42 | {
43 | return self.speed / 10.0f;
44 | }
45 |
46 | - (CGFloat)fastSpeedMultipler
47 | {
48 | FlightSpeed fasterSpeed = kSnailSpeed;
49 |
50 | switch (self.speed) {
51 | case kSnailSpeed:
52 | fasterSpeed = kSlowSpeed;
53 | break;
54 |
55 | case kSlowSpeed:
56 | fasterSpeed = kMediumSpeed;
57 | break;
58 |
59 | case kMediumSpeed:
60 | fasterSpeed = kFastSpeed;
61 | break;
62 |
63 | case kFastSpeed:
64 | fasterSpeed = kLightningSpeed;
65 | break;
66 |
67 | case kLightningSpeed:
68 | // Lets loop back around here, and use fast here,
69 | // the effect we're going for is simply to have a dynamic
70 | // feeling to flight speed
71 | fasterSpeed = kFastSpeed;
72 | break;
73 | }
74 |
75 | return fasterSpeed / 10.f;
76 | }
77 |
78 | - (CGFloat)_distanceBetweenPoint1:(CGPoint)point1 andPoint2:(CGPoint)point2
79 | {
80 | CGFloat xDist = (point2.x - point1.x);
81 | CGFloat yDist = (point2.y - point1.y);
82 | return sqrt((xDist * xDist) + (yDist * yDist));
83 | }
84 |
85 | /** speed rate is 0.1 for slowest pace to 1.0 for fastest */
86 | - (CGFloat)_speedForRate:(CGFloat)speedRate
87 | withInitialPoint:(CGPoint)initialPoint
88 | andEndpoint:(CGPoint)endPoint
89 | nodeSize:(CGSize)nodeSize
90 | {
91 | CGFloat distance = [self _distanceBetweenPoint1:initialPoint
92 | andPoint2:endPoint];
93 |
94 | float nodeHypotenuse = sqrt((nodeSize.width * nodeSize.width) +
95 | (nodeSize.height * nodeSize.height));
96 |
97 | CGFloat speed = (speedRate / nodeHypotenuse) * distance;
98 | return speed;
99 |
100 | }
101 |
102 | - (void)_getRandomStartingPoint:(CGPoint*)startingPoint
103 | andEndingPoint:(CGPoint*)endingPoint
104 | forNodeSize:(CGSize)nodeSize
105 | andSceneSize:(CGSize)sceneSize
106 | {
107 | NSAssert((sceneSize.width > 0 && sceneSize.height > 0), @"Unexpected Scene Size!");
108 |
109 | int axis = rand() % 2;
110 | if (axis == 0) {
111 | int initialXPoint = rand() % (int)sceneSize.width;
112 |
113 | *startingPoint = CGPointMake(initialXPoint + nodeSize.width,
114 | sceneSize.height + nodeSize.height);
115 | *endingPoint = CGPointMake(0 - nodeSize.width,
116 | sceneSize.height - initialXPoint - nodeSize.height);
117 | } else {
118 | int initialYPoint = rand() % (int)sceneSize.height;
119 |
120 |
121 | *startingPoint = CGPointMake(sceneSize.width + nodeSize.width,
122 | initialYPoint + nodeSize.height);
123 | *endingPoint = CGPointMake(sceneSize.width - initialYPoint - nodeSize.width,
124 | 0 - nodeSize.height);
125 | }
126 | }
127 |
128 | - (void)_addNodeWithTextures:(NSArray*)textures andSpeed:(CGFloat)speedRate
129 | {
130 | if (textures.count && self.toasterScene != nil) {
131 | SKSpriteNode* node = [SKSpriteNode spriteNodeWithTexture:textures[0]];
132 |
133 | NSAssert(self.toasterScene != nil, @"Error: Toaster Scene not set!");
134 | CGSize sceneSize = self.toasterScene.size;
135 |
136 | CGPoint startPosition = CGPointZero;
137 | CGPoint endPosition = CGPointZero;
138 |
139 | [self _getRandomStartingPoint:&startPosition
140 | andEndingPoint:&endPosition
141 | forNodeSize:node.size
142 | andSceneSize:sceneSize];
143 |
144 | node.position = startPosition;
145 | [self.toasterScene addChild:node];
146 |
147 | CGFloat duration = [self _speedForRate:speedRate withInitialPoint:startPosition andEndpoint:endPosition nodeSize:node.size];
148 |
149 | if (textures.count > 1) {
150 | SKAction* animateAction = [SKAction animateWithTextures:textures timePerFrame:0.085 resize:NO restore:YES];
151 | SKAction* repeatedAnimationAction = [SKAction repeatActionForever:animateAction];
152 | [node runAction:repeatedAnimationAction];
153 | }
154 |
155 | __weak FlyingToastersView* toasterView = self;
156 | SKAction* flyAction = [SKAction moveTo:endPosition duration:duration];
157 | SKAction* doneAction = [SKAction runBlock:^{
158 | // Remove the current sprite
159 | [node removeFromParent];
160 |
161 | // Add another one to replace this one
162 | [toasterView _addNodeWithTextures:textures andSpeed:speedRate];
163 | }];
164 |
165 | SKAction* nodeActions = [SKAction sequence:@[flyAction, doneAction]];
166 | [node runAction:nodeActions];
167 | }
168 | }
169 |
170 | - (NSArray*)getToasterTextures
171 | {
172 | NSBundle* thisBundle = [NSBundle bundleForClass:[self class]];
173 | NSString* texture1 = [thisBundle pathForResource:@"Textures/toaster01" ofType:@"png"];
174 | NSString* texture2 = [thisBundle pathForResource:@"Textures/toaster02" ofType:@"png"];
175 | NSString* texture3 = [thisBundle pathForResource:@"Textures/toaster03" ofType:@"png"];
176 | NSString* texture4 = [thisBundle pathForResource:@"Textures/toaster04" ofType:@"png"];
177 |
178 | SKTexture* toasterTexture1 = [SKTexture textureWithImageNamed:texture1]; // Low Point
179 | SKTexture* toasterTexture2 = [SKTexture textureWithImageNamed:texture2];
180 | SKTexture* toasterTexture3 = [SKTexture textureWithImageNamed:texture3];
181 | SKTexture* toasterTexture4 = [SKTexture textureWithImageNamed:texture4]; // High point
182 | SKTexture* toasterTexture5 = [SKTexture textureWithImageNamed:texture3];
183 | SKTexture* toasterTexture6 = [SKTexture textureWithImageNamed:texture2];
184 |
185 | // Start Low
186 | NSMutableArray* textures = [@[toasterTexture1,
187 | toasterTexture2,
188 | toasterTexture3,
189 | toasterTexture4,
190 | toasterTexture5,
191 | toasterTexture6] mutableCopy];
192 |
193 | NSUInteger shift = rand() % [textures count];
194 | while (shift != 0) {
195 | SKTexture* leadingTexture = [textures firstObject];
196 |
197 | // Move leading texture to end
198 | [textures removeObject:leadingTexture];
199 | [textures addObject:leadingTexture];
200 |
201 | shift--;
202 | }
203 |
204 | return textures;
205 | }
206 |
207 | - (NSArray*)getToastTexture
208 | {
209 | NSString* textureName = @"Textures/toast1.gif";
210 |
211 | switch (self.toastLevel) {
212 | case kLightToast:
213 | textureName = @"Textures/toast0.gif";
214 | break;
215 |
216 | case kGoldenBrownToast:
217 | textureName = @"Textures/toast1.gif";
218 | break;
219 |
220 | case kDarkToast:
221 | textureName = @"Textures/toast2.gif";
222 | break;
223 |
224 | case kBurntToast:
225 | textureName = @"Textures/toast3.gif";
226 | break;
227 | }
228 |
229 | NSBundle* thisBundle = [NSBundle bundleForClass:[self class]];
230 | NSString* toastTexture = [thisBundle pathForResource:textureName ofType:nil];
231 |
232 | return @[[SKTexture textureWithImageNamed:toastTexture]];
233 | }
234 |
235 | #pragma mark - Actions
236 | - (void)_addToasterAtIndex:(NSUInteger)index
237 | toastIndex:(NSUInteger)toastIndex
238 | fastToasterIndex:(NSUInteger)fastToasterIndex
239 | {
240 | NSUInteger toasterCount = self.numOfToasters;
241 | if (toasterCount) {
242 | BOOL addToast = (index % 2) == 0;
243 | BOOL isSpeedyToaster = (index % 4) == 0;
244 |
245 | CGFloat speed = self.speedMultiplier;
246 | if (index < toasterCount) {
247 | // Add the toast first at regular speed
248 | if (addToast) {
249 | [self _addNodeWithTextures:[self getToastTexture]
250 | andSpeed:speed];
251 | }
252 |
253 | // If this is a fast toaster modify the speed
254 | if (isSpeedyToaster) {
255 | speed = self.fastSpeedMultipler;
256 | }
257 |
258 | // Add the toaster
259 | [self _addNodeWithTextures:[self getToasterTextures]
260 | andSpeed:speed];
261 |
262 | __block FlyingToastersView* toasterView = self;
263 | dispatch_after(dispatch_time(DISPATCH_TIME_NOW, speed * 1000000000), dispatch_get_main_queue(), ^{
264 | [toasterView _addToasterAtIndex:(index+1)
265 | toastIndex:toastIndex
266 | fastToasterIndex:fastToasterIndex];
267 | });
268 | }
269 | }
270 | }
271 |
272 | - (void)start
273 | {
274 | NSUInteger toasterCount = self.numOfToasters;
275 | if (toasterCount) {
276 | NSUInteger toastIndex = rand() % toasterCount;
277 | NSUInteger fastToasterIndex = rand() % toasterCount;
278 |
279 | [self _addToasterAtIndex:0 toastIndex:toastIndex fastToasterIndex:fastToasterIndex];
280 | }
281 | }
282 |
283 | - (void)end
284 | {
285 | [self.toasterScene removeAllActions];
286 | [self.toasterScene removeAllChildren];
287 | }
288 |
289 | - (BOOL)acceptsFirstResponder
290 | {
291 | return NO;
292 | }
293 |
294 | @end
295 |
--------------------------------------------------------------------------------
/Flying Toasters.xcodeproj/project.pbxproj:
--------------------------------------------------------------------------------
1 | // !$*UTF8*$!
2 | {
3 | archiveVersion = 1;
4 | classes = {
5 | };
6 | objectVersion = 46;
7 | objects = {
8 |
9 | /* Begin PBXBuildFile section */
10 | 6F1F918E24A2EC0A00328849 /* FlyingToasterPreferencesController.xib in Resources */ = {isa = PBXBuildFile; fileRef = ABF4BEF62234F6CE000D5A44 /* FlyingToasterPreferencesController.xib */; };
11 | AB3BE46A2234FDE1004A6626 /* FlyingToasterPreferencesController.m in Sources */ = {isa = PBXBuildFile; fileRef = ABF4BEF52234F6CE000D5A44 /* FlyingToasterPreferencesController.m */; };
12 | AB3BE46B2234FDE1004A6626 /* FlyingToasterScreenSaverView.m in Sources */ = {isa = PBXBuildFile; fileRef = ABF4BEF82234F6CE000D5A44 /* FlyingToasterScreenSaverView.m */; };
13 | AB3BE46C2234FDE1004A6626 /* FlyingToastersView.m in Sources */ = {isa = PBXBuildFile; fileRef = ABF4BEFA2234F6CE000D5A44 /* FlyingToastersView.m */; };
14 | AB3BE46D2234FDE1004A6626 /* ScreenSaverScene.m in Sources */ = {isa = PBXBuildFile; fileRef = ABF4BEFD2234F6CE000D5A44 /* ScreenSaverScene.m */; };
15 | AB3BE46E2234FDE1004A6626 /* ToasterDefaults.m in Sources */ = {isa = PBXBuildFile; fileRef = ABF4BF0A2234F6CE000D5A44 /* ToasterDefaults.m */; };
16 | AB3BE4702234FE0D004A6626 /* Textures in Resources */ = {isa = PBXBuildFile; fileRef = AB3BE46F2234FE0D004A6626 /* Textures */; };
17 | AB3BE4712234FE14004A6626 /* Textures in Resources */ = {isa = PBXBuildFile; fileRef = AB3BE46F2234FE0D004A6626 /* Textures */; };
18 | ABF4BF0B2234F6CE000D5A44 /* FlyingToasterPreferencesController.h in Headers */ = {isa = PBXBuildFile; fileRef = ABF4BEF42234F6CE000D5A44 /* FlyingToasterPreferencesController.h */; };
19 | ABF4BF0C2234F6CE000D5A44 /* FlyingToasterPreferencesController.m in Sources */ = {isa = PBXBuildFile; fileRef = ABF4BEF52234F6CE000D5A44 /* FlyingToasterPreferencesController.m */; };
20 | ABF4BF0D2234F6CE000D5A44 /* FlyingToasterPreferencesController.xib in Resources */ = {isa = PBXBuildFile; fileRef = ABF4BEF62234F6CE000D5A44 /* FlyingToasterPreferencesController.xib */; };
21 | ABF4BF0E2234F6CE000D5A44 /* FlyingToasterScreenSaverView.h in Headers */ = {isa = PBXBuildFile; fileRef = ABF4BEF72234F6CE000D5A44 /* FlyingToasterScreenSaverView.h */; };
22 | ABF4BF0F2234F6CE000D5A44 /* FlyingToasterScreenSaverView.m in Sources */ = {isa = PBXBuildFile; fileRef = ABF4BEF82234F6CE000D5A44 /* FlyingToasterScreenSaverView.m */; };
23 | ABF4BF102234F6CE000D5A44 /* FlyingToastersView.h in Headers */ = {isa = PBXBuildFile; fileRef = ABF4BEF92234F6CE000D5A44 /* FlyingToastersView.h */; };
24 | ABF4BF112234F6CE000D5A44 /* FlyingToastersView.m in Sources */ = {isa = PBXBuildFile; fileRef = ABF4BEFA2234F6CE000D5A44 /* FlyingToastersView.m */; };
25 | ABF4BF132234F6CE000D5A44 /* ScreenSaverScene.h in Headers */ = {isa = PBXBuildFile; fileRef = ABF4BEFC2234F6CE000D5A44 /* ScreenSaverScene.h */; };
26 | ABF4BF142234F6CE000D5A44 /* ScreenSaverScene.m in Sources */ = {isa = PBXBuildFile; fileRef = ABF4BEFD2234F6CE000D5A44 /* ScreenSaverScene.m */; };
27 | ABF4BF1D2234F6CE000D5A44 /* thumbnail.png in Resources */ = {isa = PBXBuildFile; fileRef = ABF4BF072234F6CE000D5A44 /* thumbnail.png */; };
28 | ABF4BF1E2234F6CE000D5A44 /* thumbnail@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = ABF4BF082234F6CE000D5A44 /* thumbnail@2x.png */; };
29 | ABF4BF1F2234F6CE000D5A44 /* ToasterDefaults.h in Headers */ = {isa = PBXBuildFile; fileRef = ABF4BF092234F6CE000D5A44 /* ToasterDefaults.h */; };
30 | ABF4BF202234F6CE000D5A44 /* ToasterDefaults.m in Sources */ = {isa = PBXBuildFile; fileRef = ABF4BF0A2234F6CE000D5A44 /* ToasterDefaults.m */; };
31 | ABF4BF2B2234F849000D5A44 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = ABF4BF2A2234F849000D5A44 /* AppDelegate.m */; };
32 | ABF4BF2D2234F849000D5A44 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = ABF4BF2C2234F849000D5A44 /* main.m */; };
33 | ABF4BF2F2234F849000D5A44 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = ABF4BF2E2234F849000D5A44 /* Images.xcassets */; };
34 | ABF4BF322234F849000D5A44 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = ABF4BF302234F849000D5A44 /* MainMenu.xib */; };
35 | /* End PBXBuildFile section */
36 |
37 | /* Begin PBXFileReference section */
38 | AB3BE46F2234FE0D004A6626 /* Textures */ = {isa = PBXFileReference; lastKnownFileType = folder; path = Textures; sourceTree = ""; };
39 | ABF4BEE62234F602000D5A44 /* Flying Toasters.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "Flying Toasters.saver"; sourceTree = BUILT_PRODUCTS_DIR; };
40 | ABF4BEEA2234F602000D5A44 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; };
41 | ABF4BEF42234F6CE000D5A44 /* FlyingToasterPreferencesController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FlyingToasterPreferencesController.h; sourceTree = ""; };
42 | ABF4BEF52234F6CE000D5A44 /* FlyingToasterPreferencesController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FlyingToasterPreferencesController.m; sourceTree = ""; };
43 | ABF4BEF62234F6CE000D5A44 /* FlyingToasterPreferencesController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = FlyingToasterPreferencesController.xib; sourceTree = ""; };
44 | ABF4BEF72234F6CE000D5A44 /* FlyingToasterScreenSaverView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FlyingToasterScreenSaverView.h; sourceTree = ""; };
45 | ABF4BEF82234F6CE000D5A44 /* FlyingToasterScreenSaverView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FlyingToasterScreenSaverView.m; sourceTree = ""; };
46 | ABF4BEF92234F6CE000D5A44 /* FlyingToastersView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FlyingToastersView.h; sourceTree = ""; };
47 | ABF4BEFA2234F6CE000D5A44 /* FlyingToastersView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FlyingToastersView.m; sourceTree = ""; };
48 | ABF4BEFC2234F6CE000D5A44 /* ScreenSaverScene.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ScreenSaverScene.h; sourceTree = ""; };
49 | ABF4BEFD2234F6CE000D5A44 /* ScreenSaverScene.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ScreenSaverScene.m; sourceTree = ""; };
50 | ABF4BF072234F6CE000D5A44 /* thumbnail.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = thumbnail.png; sourceTree = ""; };
51 | ABF4BF082234F6CE000D5A44 /* thumbnail@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "thumbnail@2x.png"; sourceTree = ""; };
52 | ABF4BF092234F6CE000D5A44 /* ToasterDefaults.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ToasterDefaults.h; sourceTree = ""; };
53 | ABF4BF0A2234F6CE000D5A44 /* ToasterDefaults.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ToasterDefaults.m; sourceTree = ""; };
54 | ABF4BF252234F849000D5A44 /* Flying Toaster Test.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "Flying Toaster Test.app"; sourceTree = BUILT_PRODUCTS_DIR; };
55 | ABF4BF282234F849000D5A44 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; };
56 | ABF4BF292234F849000D5A44 /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = ""; };
57 | ABF4BF2A2234F849000D5A44 /* AppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = ""; };
58 | ABF4BF2C2234F849000D5A44 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; };
59 | ABF4BF2E2234F849000D5A44 /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = ""; };
60 | ABF4BF312234F849000D5A44 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/MainMenu.xib; sourceTree = ""; };
61 | /* End PBXFileReference section */
62 |
63 | /* Begin PBXFrameworksBuildPhase section */
64 | ABF4BEE22234F602000D5A44 /* Frameworks */ = {
65 | isa = PBXFrameworksBuildPhase;
66 | buildActionMask = 2147483647;
67 | files = (
68 | );
69 | runOnlyForDeploymentPostprocessing = 0;
70 | };
71 | ABF4BF222234F849000D5A44 /* Frameworks */ = {
72 | isa = PBXFrameworksBuildPhase;
73 | buildActionMask = 2147483647;
74 | files = (
75 | );
76 | runOnlyForDeploymentPostprocessing = 0;
77 | };
78 | /* End PBXFrameworksBuildPhase section */
79 |
80 | /* Begin PBXGroup section */
81 | ABF4BEDC2234F602000D5A44 = {
82 | isa = PBXGroup;
83 | children = (
84 | ABF4BEE82234F602000D5A44 /* Flying Toasters */,
85 | ABF4BF262234F849000D5A44 /* Flying Toaster Test */,
86 | ABF4BEE72234F602000D5A44 /* Products */,
87 | );
88 | sourceTree = "";
89 | };
90 | ABF4BEE72234F602000D5A44 /* Products */ = {
91 | isa = PBXGroup;
92 | children = (
93 | ABF4BEE62234F602000D5A44 /* Flying Toasters.saver */,
94 | ABF4BF252234F849000D5A44 /* Flying Toaster Test.app */,
95 | );
96 | name = Products;
97 | sourceTree = "";
98 | };
99 | ABF4BEE82234F602000D5A44 /* Flying Toasters */ = {
100 | isa = PBXGroup;
101 | children = (
102 | ABF4BEF42234F6CE000D5A44 /* FlyingToasterPreferencesController.h */,
103 | ABF4BEF52234F6CE000D5A44 /* FlyingToasterPreferencesController.m */,
104 | ABF4BEF62234F6CE000D5A44 /* FlyingToasterPreferencesController.xib */,
105 | ABF4BEF72234F6CE000D5A44 /* FlyingToasterScreenSaverView.h */,
106 | ABF4BEF82234F6CE000D5A44 /* FlyingToasterScreenSaverView.m */,
107 | ABF4BEF92234F6CE000D5A44 /* FlyingToastersView.h */,
108 | ABF4BEFA2234F6CE000D5A44 /* FlyingToastersView.m */,
109 | ABF4BEFC2234F6CE000D5A44 /* ScreenSaverScene.h */,
110 | ABF4BEFD2234F6CE000D5A44 /* ScreenSaverScene.m */,
111 | ABF4BF092234F6CE000D5A44 /* ToasterDefaults.h */,
112 | ABF4BF0A2234F6CE000D5A44 /* ToasterDefaults.m */,
113 | ABF4BEE92234F602000D5A44 /* Supporting Files */,
114 | );
115 | path = "Flying Toasters";
116 | sourceTree = "";
117 | };
118 | ABF4BEE92234F602000D5A44 /* Supporting Files */ = {
119 | isa = PBXGroup;
120 | children = (
121 | AB3BE46F2234FE0D004A6626 /* Textures */,
122 | ABF4BF072234F6CE000D5A44 /* thumbnail.png */,
123 | ABF4BF082234F6CE000D5A44 /* thumbnail@2x.png */,
124 | ABF4BEEA2234F602000D5A44 /* Info.plist */,
125 | );
126 | name = "Supporting Files";
127 | sourceTree = "";
128 | };
129 | ABF4BF262234F849000D5A44 /* Flying Toaster Test */ = {
130 | isa = PBXGroup;
131 | children = (
132 | ABF4BF292234F849000D5A44 /* AppDelegate.h */,
133 | ABF4BF2A2234F849000D5A44 /* AppDelegate.m */,
134 | ABF4BF2E2234F849000D5A44 /* Images.xcassets */,
135 | ABF4BF302234F849000D5A44 /* MainMenu.xib */,
136 | ABF4BF272234F849000D5A44 /* Supporting Files */,
137 | );
138 | path = "Flying Toaster Test";
139 | sourceTree = "";
140 | };
141 | ABF4BF272234F849000D5A44 /* Supporting Files */ = {
142 | isa = PBXGroup;
143 | children = (
144 | ABF4BF282234F849000D5A44 /* Info.plist */,
145 | ABF4BF2C2234F849000D5A44 /* main.m */,
146 | );
147 | name = "Supporting Files";
148 | sourceTree = "";
149 | };
150 | /* End PBXGroup section */
151 |
152 | /* Begin PBXHeadersBuildPhase section */
153 | ABF4BEE32234F602000D5A44 /* Headers */ = {
154 | isa = PBXHeadersBuildPhase;
155 | buildActionMask = 2147483647;
156 | files = (
157 | ABF4BF0B2234F6CE000D5A44 /* FlyingToasterPreferencesController.h in Headers */,
158 | ABF4BF0E2234F6CE000D5A44 /* FlyingToasterScreenSaverView.h in Headers */,
159 | ABF4BF1F2234F6CE000D5A44 /* ToasterDefaults.h in Headers */,
160 | ABF4BF132234F6CE000D5A44 /* ScreenSaverScene.h in Headers */,
161 | ABF4BF102234F6CE000D5A44 /* FlyingToastersView.h in Headers */,
162 | );
163 | runOnlyForDeploymentPostprocessing = 0;
164 | };
165 | /* End PBXHeadersBuildPhase section */
166 |
167 | /* Begin PBXNativeTarget section */
168 | ABF4BEE52234F602000D5A44 /* Flying Toasters */ = {
169 | isa = PBXNativeTarget;
170 | buildConfigurationList = ABF4BEF12234F602000D5A44 /* Build configuration list for PBXNativeTarget "Flying Toasters" */;
171 | buildPhases = (
172 | ABF4BEE12234F602000D5A44 /* Sources */,
173 | ABF4BEE22234F602000D5A44 /* Frameworks */,
174 | ABF4BEE32234F602000D5A44 /* Headers */,
175 | ABF4BEE42234F602000D5A44 /* Resources */,
176 | );
177 | buildRules = (
178 | );
179 | dependencies = (
180 | );
181 | name = "Flying Toasters";
182 | productName = "Flying Toasters";
183 | productReference = ABF4BEE62234F602000D5A44 /* Flying Toasters.saver */;
184 | productType = "com.apple.product-type.bundle";
185 | };
186 | ABF4BF242234F849000D5A44 /* Flying Toaster Test */ = {
187 | isa = PBXNativeTarget;
188 | buildConfigurationList = ABF4BF3F2234F849000D5A44 /* Build configuration list for PBXNativeTarget "Flying Toaster Test" */;
189 | buildPhases = (
190 | ABF4BF212234F849000D5A44 /* Sources */,
191 | ABF4BF222234F849000D5A44 /* Frameworks */,
192 | ABF4BF232234F849000D5A44 /* Resources */,
193 | );
194 | buildRules = (
195 | );
196 | dependencies = (
197 | );
198 | name = "Flying Toaster Test";
199 | productName = "Flying Toaster Test";
200 | productReference = ABF4BF252234F849000D5A44 /* Flying Toaster Test.app */;
201 | productType = "com.apple.product-type.application";
202 | };
203 | /* End PBXNativeTarget section */
204 |
205 | /* Begin PBXProject section */
206 | ABF4BEDD2234F602000D5A44 /* Project object */ = {
207 | isa = PBXProject;
208 | attributes = {
209 | LastUpgradeCheck = 1250;
210 | ORGANIZATIONNAME = "Robert Venturini";
211 | TargetAttributes = {
212 | ABF4BEE52234F602000D5A44 = {
213 | CreatedOnToolsVersion = 6.2;
214 | };
215 | ABF4BF242234F849000D5A44 = {
216 | CreatedOnToolsVersion = 6.2;
217 | };
218 | };
219 | };
220 | buildConfigurationList = ABF4BEE02234F602000D5A44 /* Build configuration list for PBXProject "Flying Toasters" */;
221 | compatibilityVersion = "Xcode 3.2";
222 | developmentRegion = en;
223 | hasScannedForEncodings = 0;
224 | knownRegions = (
225 | en,
226 | Base,
227 | );
228 | mainGroup = ABF4BEDC2234F602000D5A44;
229 | productRefGroup = ABF4BEE72234F602000D5A44 /* Products */;
230 | projectDirPath = "";
231 | projectRoot = "";
232 | targets = (
233 | ABF4BEE52234F602000D5A44 /* Flying Toasters */,
234 | ABF4BF242234F849000D5A44 /* Flying Toaster Test */,
235 | );
236 | };
237 | /* End PBXProject section */
238 |
239 | /* Begin PBXResourcesBuildPhase section */
240 | ABF4BEE42234F602000D5A44 /* Resources */ = {
241 | isa = PBXResourcesBuildPhase;
242 | buildActionMask = 2147483647;
243 | files = (
244 | AB3BE4702234FE0D004A6626 /* Textures in Resources */,
245 | ABF4BF1D2234F6CE000D5A44 /* thumbnail.png in Resources */,
246 | ABF4BF1E2234F6CE000D5A44 /* thumbnail@2x.png in Resources */,
247 | ABF4BF0D2234F6CE000D5A44 /* FlyingToasterPreferencesController.xib in Resources */,
248 | );
249 | runOnlyForDeploymentPostprocessing = 0;
250 | };
251 | ABF4BF232234F849000D5A44 /* Resources */ = {
252 | isa = PBXResourcesBuildPhase;
253 | buildActionMask = 2147483647;
254 | files = (
255 | 6F1F918E24A2EC0A00328849 /* FlyingToasterPreferencesController.xib in Resources */,
256 | AB3BE4712234FE14004A6626 /* Textures in Resources */,
257 | ABF4BF2F2234F849000D5A44 /* Images.xcassets in Resources */,
258 | ABF4BF322234F849000D5A44 /* MainMenu.xib in Resources */,
259 | );
260 | runOnlyForDeploymentPostprocessing = 0;
261 | };
262 | /* End PBXResourcesBuildPhase section */
263 |
264 | /* Begin PBXSourcesBuildPhase section */
265 | ABF4BEE12234F602000D5A44 /* Sources */ = {
266 | isa = PBXSourcesBuildPhase;
267 | buildActionMask = 2147483647;
268 | files = (
269 | ABF4BF202234F6CE000D5A44 /* ToasterDefaults.m in Sources */,
270 | ABF4BF112234F6CE000D5A44 /* FlyingToastersView.m in Sources */,
271 | ABF4BF0F2234F6CE000D5A44 /* FlyingToasterScreenSaverView.m in Sources */,
272 | ABF4BF0C2234F6CE000D5A44 /* FlyingToasterPreferencesController.m in Sources */,
273 | ABF4BF142234F6CE000D5A44 /* ScreenSaverScene.m in Sources */,
274 | );
275 | runOnlyForDeploymentPostprocessing = 0;
276 | };
277 | ABF4BF212234F849000D5A44 /* Sources */ = {
278 | isa = PBXSourcesBuildPhase;
279 | buildActionMask = 2147483647;
280 | files = (
281 | AB3BE46E2234FDE1004A6626 /* ToasterDefaults.m in Sources */,
282 | AB3BE46D2234FDE1004A6626 /* ScreenSaverScene.m in Sources */,
283 | AB3BE46C2234FDE1004A6626 /* FlyingToastersView.m in Sources */,
284 | AB3BE46B2234FDE1004A6626 /* FlyingToasterScreenSaverView.m in Sources */,
285 | ABF4BF2D2234F849000D5A44 /* main.m in Sources */,
286 | ABF4BF2B2234F849000D5A44 /* AppDelegate.m in Sources */,
287 | AB3BE46A2234FDE1004A6626 /* FlyingToasterPreferencesController.m in Sources */,
288 | );
289 | runOnlyForDeploymentPostprocessing = 0;
290 | };
291 | /* End PBXSourcesBuildPhase section */
292 |
293 | /* Begin PBXVariantGroup section */
294 | ABF4BF302234F849000D5A44 /* MainMenu.xib */ = {
295 | isa = PBXVariantGroup;
296 | children = (
297 | ABF4BF312234F849000D5A44 /* Base */,
298 | );
299 | name = MainMenu.xib;
300 | sourceTree = "";
301 | };
302 | /* End PBXVariantGroup section */
303 |
304 | /* Begin XCBuildConfiguration section */
305 | ABF4BEEF2234F602000D5A44 /* Debug */ = {
306 | isa = XCBuildConfiguration;
307 | buildSettings = {
308 | ALWAYS_SEARCH_USER_PATHS = NO;
309 | CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;
310 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
311 | CLANG_CXX_LIBRARY = "libc++";
312 | CLANG_ENABLE_MODULES = YES;
313 | CLANG_ENABLE_OBJC_ARC = YES;
314 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
315 | CLANG_WARN_BOOL_CONVERSION = YES;
316 | CLANG_WARN_COMMA = YES;
317 | CLANG_WARN_CONSTANT_CONVERSION = YES;
318 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
319 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
320 | CLANG_WARN_EMPTY_BODY = YES;
321 | CLANG_WARN_ENUM_CONVERSION = YES;
322 | CLANG_WARN_INFINITE_RECURSION = YES;
323 | CLANG_WARN_INT_CONVERSION = YES;
324 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
325 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
326 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
327 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
328 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
329 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
330 | CLANG_WARN_STRICT_PROTOTYPES = YES;
331 | CLANG_WARN_SUSPICIOUS_MOVE = YES;
332 | CLANG_WARN_UNREACHABLE_CODE = YES;
333 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
334 | COPY_PHASE_STRIP = NO;
335 | ENABLE_STRICT_OBJC_MSGSEND = YES;
336 | ENABLE_TESTABILITY = YES;
337 | GCC_C_LANGUAGE_STANDARD = gnu99;
338 | GCC_DYNAMIC_NO_PIC = NO;
339 | GCC_NO_COMMON_BLOCKS = YES;
340 | GCC_OPTIMIZATION_LEVEL = 0;
341 | GCC_PREPROCESSOR_DEFINITIONS = (
342 | "DEBUG=1",
343 | "$(inherited)",
344 | );
345 | GCC_SYMBOLS_PRIVATE_EXTERN = NO;
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.9;
353 | MTL_ENABLE_DEBUG_INFO = YES;
354 | ONLY_ACTIVE_ARCH = YES;
355 | SDKROOT = macosx;
356 | };
357 | name = Debug;
358 | };
359 | ABF4BEF02234F602000D5A44 /* Release */ = {
360 | isa = XCBuildConfiguration;
361 | buildSettings = {
362 | ALWAYS_SEARCH_USER_PATHS = NO;
363 | CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;
364 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
365 | CLANG_CXX_LIBRARY = "libc++";
366 | CLANG_ENABLE_MODULES = YES;
367 | CLANG_ENABLE_OBJC_ARC = YES;
368 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
369 | CLANG_WARN_BOOL_CONVERSION = YES;
370 | CLANG_WARN_COMMA = YES;
371 | CLANG_WARN_CONSTANT_CONVERSION = YES;
372 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
373 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
374 | CLANG_WARN_EMPTY_BODY = YES;
375 | CLANG_WARN_ENUM_CONVERSION = YES;
376 | CLANG_WARN_INFINITE_RECURSION = YES;
377 | CLANG_WARN_INT_CONVERSION = YES;
378 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
379 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
380 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
381 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
382 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
383 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
384 | CLANG_WARN_STRICT_PROTOTYPES = YES;
385 | CLANG_WARN_SUSPICIOUS_MOVE = YES;
386 | CLANG_WARN_UNREACHABLE_CODE = YES;
387 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
388 | COPY_PHASE_STRIP = NO;
389 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
390 | ENABLE_NS_ASSERTIONS = NO;
391 | ENABLE_STRICT_OBJC_MSGSEND = YES;
392 | GCC_C_LANGUAGE_STANDARD = gnu99;
393 | GCC_NO_COMMON_BLOCKS = YES;
394 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
395 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
396 | GCC_WARN_UNDECLARED_SELECTOR = YES;
397 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
398 | GCC_WARN_UNUSED_FUNCTION = YES;
399 | GCC_WARN_UNUSED_VARIABLE = YES;
400 | MACOSX_DEPLOYMENT_TARGET = 10.9;
401 | MTL_ENABLE_DEBUG_INFO = NO;
402 | SDKROOT = macosx;
403 | };
404 | name = Release;
405 | };
406 | ABF4BEF22234F602000D5A44 /* Debug */ = {
407 | isa = XCBuildConfiguration;
408 | buildSettings = {
409 | COMBINE_HIDPI_IMAGES = YES;
410 | INFOPLIST_FILE = "Flying Toasters/Info.plist";
411 | INSTALL_PATH = "$(HOME)/Library/Screen Savers";
412 | PRODUCT_NAME = "$(TARGET_NAME)";
413 | WRAPPER_EXTENSION = saver;
414 | };
415 | name = Debug;
416 | };
417 | ABF4BEF32234F602000D5A44 /* Release */ = {
418 | isa = XCBuildConfiguration;
419 | buildSettings = {
420 | COMBINE_HIDPI_IMAGES = YES;
421 | INFOPLIST_FILE = "Flying Toasters/Info.plist";
422 | INSTALL_PATH = "$(HOME)/Library/Screen Savers";
423 | PRODUCT_NAME = "$(TARGET_NAME)";
424 | WRAPPER_EXTENSION = saver;
425 | };
426 | name = Release;
427 | };
428 | ABF4BF402234F849000D5A44 /* Debug */ = {
429 | isa = XCBuildConfiguration;
430 | buildSettings = {
431 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
432 | CODE_SIGN_IDENTITY = "-";
433 | COMBINE_HIDPI_IMAGES = YES;
434 | GCC_PREPROCESSOR_DEFINITIONS = (
435 | "DEBUG=1",
436 | "$(inherited)",
437 | );
438 | INFOPLIST_FILE = "Flying Toaster Test/Info.plist";
439 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks";
440 | PRODUCT_BUNDLE_IDENTIFIER = "com.robert-venturini.$(PRODUCT_NAME:rfc1034identifier)";
441 | PRODUCT_NAME = "$(TARGET_NAME)";
442 | };
443 | name = Debug;
444 | };
445 | ABF4BF412234F849000D5A44 /* Release */ = {
446 | isa = XCBuildConfiguration;
447 | buildSettings = {
448 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
449 | CODE_SIGN_IDENTITY = "-";
450 | COMBINE_HIDPI_IMAGES = YES;
451 | INFOPLIST_FILE = "Flying Toaster Test/Info.plist";
452 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks";
453 | PRODUCT_BUNDLE_IDENTIFIER = "com.robert-venturini.$(PRODUCT_NAME:rfc1034identifier)";
454 | PRODUCT_NAME = "$(TARGET_NAME)";
455 | };
456 | name = Release;
457 | };
458 | /* End XCBuildConfiguration section */
459 |
460 | /* Begin XCConfigurationList section */
461 | ABF4BEE02234F602000D5A44 /* Build configuration list for PBXProject "Flying Toasters" */ = {
462 | isa = XCConfigurationList;
463 | buildConfigurations = (
464 | ABF4BEEF2234F602000D5A44 /* Debug */,
465 | ABF4BEF02234F602000D5A44 /* Release */,
466 | );
467 | defaultConfigurationIsVisible = 0;
468 | defaultConfigurationName = Release;
469 | };
470 | ABF4BEF12234F602000D5A44 /* Build configuration list for PBXNativeTarget "Flying Toasters" */ = {
471 | isa = XCConfigurationList;
472 | buildConfigurations = (
473 | ABF4BEF22234F602000D5A44 /* Debug */,
474 | ABF4BEF32234F602000D5A44 /* Release */,
475 | );
476 | defaultConfigurationIsVisible = 0;
477 | defaultConfigurationName = Release;
478 | };
479 | ABF4BF3F2234F849000D5A44 /* Build configuration list for PBXNativeTarget "Flying Toaster Test" */ = {
480 | isa = XCConfigurationList;
481 | buildConfigurations = (
482 | ABF4BF402234F849000D5A44 /* Debug */,
483 | ABF4BF412234F849000D5A44 /* Release */,
484 | );
485 | defaultConfigurationIsVisible = 0;
486 | defaultConfigurationName = Release;
487 | };
488 | /* End XCConfigurationList section */
489 | };
490 | rootObject = ABF4BEDD2234F602000D5A44 /* Project object */;
491 | }
492 |
--------------------------------------------------------------------------------