├── 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 | ![Image of FlyingToasters](https://github.com/robertventurini/FlyingToasters/blob/master/FlyingToasters.gif) 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 | 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 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 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 | --------------------------------------------------------------------------------