├── epochFlipClock.png ├── EpochFlipClock.h ├── Webview ├── index.html ├── index.js └── index.css ├── .gitignore ├── readme.md ├── Info.plist ├── EpochFlipClock.m ├── ConfigureSheet.xib └── Epoch Flip Clock.xcodeproj └── project.pbxproj /epochFlipClock.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chrstphrknwtn/epoch-flip-clock-screensaver/HEAD/epochFlipClock.png -------------------------------------------------------------------------------- /EpochFlipClock.h: -------------------------------------------------------------------------------- 1 | #import 2 | 3 | @interface EpochFlipClock : ScreenSaverView 4 | { 5 | IBOutlet id configSheet; 6 | IBOutlet id screenDisplayOption; 7 | } 8 | @end 9 | -------------------------------------------------------------------------------- /Webview/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Xcode 2 | .DS_Store 3 | */build/* 4 | *.pbxuser 5 | !default.pbxuser 6 | *.mode1v3 7 | !default.mode1v3 8 | *.mode2v3 9 | !default.mode2v3 10 | *.perspectivev3 11 | !default.perspectivev3 12 | xcuserdata 13 | profile 14 | *.moved-aside 15 | DerivedData 16 | .idea/ 17 | *.hmap 18 | xcuserdata/* 19 | 20 | *.pbxuser 21 | *.mode1v3 22 | *.mode2v3 23 | *.perspectivev3 24 | *.xcuserstate 25 | project.xcworkspace/ 26 | xcuserdata/ 27 | -------------------------------------------------------------------------------- /readme.md: -------------------------------------------------------------------------------- 1 | # Epoch Flip Clock 2 | Unix [epoch](https://en.wikipedia.org/wiki/Unix_time) flip clock macOS screensaver 3 | 4 | ![Epoch Flip Clock Screenshot](https://raw.githubusercontent.com/chrstphrknwtn/epoch-flip-clock/master/epochFlipClock.png) 5 | 6 | ## Install 7 | Download [`Epock Flip Clock.saver`](https://github.com/chrstphrknwtn/epoch-flip-clock-screensaver/releases/download/0.0.5/Epoch.Flip.Clock.0.0.5.saver.zip) 8 | 9 | ## Related 10 | - [Grid Clock Screensaver](https://github.com/chrstphrknwtn/grid-clock-screensaver) 11 | - [Word Clock Screensaver](https://github.com/chrstphrknwtn/word-clock-screensaver) 12 | -------------------------------------------------------------------------------- /Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | English 7 | CFBundleExecutable 8 | ${EXECUTABLE_NAME} 9 | CFBundleIconFile 10 | 11 | CFBundleIdentifier 12 | $(PRODUCT_BUNDLE_IDENTIFIER) 13 | CFBundleInfoDictionaryVersion 14 | 0.0.5 15 | CFBundleName 16 | ${PRODUCT_NAME} 17 | CFBundlePackageType 18 | BNDL 19 | CFBundleShortVersionString 20 | 0.0.5 21 | CFBundleSignature 22 | ???? 23 | CFBundleVersion 24 | 0.0.5 25 | NSHumanReadableCopyright 26 | Copyright © 2019 Christopher Newton. All rights reserved. 27 | NSPrincipalClass 28 | EpochFlipClock 29 | 30 | 31 | -------------------------------------------------------------------------------- /Webview/index.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | var digits = []; 4 | 5 | function getEpoch() { 6 | return Date.now().toString().slice(0,-3); 7 | } 8 | 9 | function createDigit() { 10 | var digit = document.createElement('digit'); 11 | digit.innerHTML = '\ 12 | \ 13 | \ 14 | \ 15 | '; 16 | return digit; 17 | } 18 | 19 | function flipDigitTo(digit, currentVal, updatedVal) { 20 | var topFlapNum = digit.querySelector('flap-top > n'), 21 | topFlapFlip = digit.querySelector('flap-top-flip'), 22 | topFlapFlipNum = topFlapFlip.querySelector('n'), 23 | bottomFlapNum = digit.querySelector('flap-bottom > n'), 24 | bottomFlapFlip = digit.querySelector('flap-bottom-flip'), 25 | bottomFlapFlipNum = bottomFlapFlip.querySelector('n'); 26 | 27 | topFlapNum.innerHTML = updatedVal; 28 | bottomFlapNum.innerHTML = currentVal; 29 | 30 | topFlapFlipNum.innerHTML = currentVal; 31 | topFlapFlip.style.display = 'block'; 32 | 33 | setTimeout(function() { 34 | topFlapFlip.style.display = 'none'; 35 | }, 300); 36 | 37 | setTimeout(function() { 38 | bottomFlapFlipNum.innerHTML = updatedVal; 39 | bottomFlapFlip.style.display = 'block'; 40 | }, 300); 41 | 42 | setTimeout(function() { 43 | bottomFlapNum.innerHTML = updatedVal; 44 | bottomFlapFlip.style.display = 'none'; 45 | }, 450); 46 | 47 | digit.setAttribute('current-val', updatedVal); 48 | } 49 | 50 | function updateClock() { 51 | var epoch = getEpoch(), 52 | staggerDelay, 53 | currentVal, 54 | updatedVal, 55 | i; 56 | 57 | for (i = 0; i < epoch.length; i+=1) { 58 | if(i === epoch.length-1) { 59 | staggerDelay = 0; 60 | } else { 61 | staggerDelay = Math.random() * 400; 62 | } 63 | currentVal = digits[i].getAttribute('current-val'); 64 | updatedVal = epoch[i]; 65 | if(currentVal !== updatedVal) { 66 | setTimeout(flipDigitTo, staggerDelay, digits[i], currentVal, updatedVal); 67 | } 68 | } 69 | } 70 | 71 | function setupClock() { 72 | var epoch = getEpoch(), 73 | staggerDelay, 74 | digit, 75 | i; 76 | 77 | for (i = 0; i < epoch.length; i+=1) { 78 | digit = createDigit(); 79 | staggerDelay = Math.random() * 400; 80 | document.body.appendChild(digit); 81 | setTimeout(flipDigitTo, staggerDelay, digit, null, epoch[i]); 82 | } 83 | digits = document.querySelectorAll('digit'); 84 | } 85 | 86 | setupClock(); 87 | setInterval(updateClock, 1000); 88 | -------------------------------------------------------------------------------- /Webview/index.css: -------------------------------------------------------------------------------- 1 | html, body { 2 | width: 100%; 3 | height: 100%; 4 | } 5 | 6 | body { 7 | display: flex; 8 | margin: 0; 9 | padding: 0; 10 | font-family: '-apple-system', sans-serif; 11 | align-items: center; 12 | justify-content: center; 13 | background-color: black; 14 | perspective: 100vw; 15 | -webkit-text-smoothing: anti-aliased; 16 | } 17 | 18 | digit { 19 | position: relative; 20 | width: 7vw; 21 | height: 11vw; 22 | margin: 0 0.25vw; 23 | -webkit-backface-visibility: hidden; 24 | } 25 | 26 | /* Flip Flaps 27 | ------------------------------------------------*/ 28 | flap-top, 29 | flap-top-flip, 30 | flap-bottom, 31 | flap-bottom-flip { 32 | box-sizing: border-box; 33 | position: absolute; 34 | display: flex; 35 | width: 100%; 36 | height: 50%; 37 | left: 0; 38 | justify-content: center; 39 | overflow: hidden; 40 | color: #e1e1e1; 41 | background-color: rgb(12,12,12); 42 | box-shadow: inset 0 1px 0 0 rgba(255,255,255,0.04); 43 | -webkit-backface-visibility: hidden; 44 | } 45 | flap-top, 46 | flap-top-flip { 47 | top: 0; 48 | border-radius: 0.4vw 0.4vw 0 0; 49 | } 50 | flap-bottom, 51 | flap-bottom-flip { 52 | bottom: 0; 53 | border-radius: 0 0 0.4vw 0.4vw; 54 | } 55 | 56 | flap-top-flip { 57 | display: none; 58 | transform-origin: 100% 100%; 59 | animation: flip-top-down 300ms ease-in; 60 | } 61 | flap-bottom-flip { 62 | display: none; 63 | transform-origin: 100% 0%; 64 | animation: flip-bottom-down 150ms ease-out; 65 | } 66 | 67 | flap-top > n, 68 | flap-top-flip > n { 69 | top: 0; 70 | } 71 | flap-bottom > n, 72 | flap-bottom-flip > n { 73 | bottom: 0; 74 | } 75 | 76 | @media screen and (min-width: 800px) { 77 | flap-top, 78 | flap-top-flip { 79 | transform: translateY(-1px); 80 | } 81 | flap-bottom, 82 | flap-bottom-flip { 83 | transform: translateY(1px); 84 | } 85 | flap-top > n, 86 | flap-top-flip > n { 87 | top: 1px; 88 | } 89 | flap-bottom > n, 90 | flap-bottom-flip > n { 91 | bottom: 1px; 92 | } 93 | } 94 | 95 | @media screen and (min-width: 1280px) { 96 | flap-top, 97 | flap-top-flip { 98 | transform: translateY(-2px); 99 | } 100 | flap-bottom, 101 | flap-bottom-flip { 102 | transform: translateY(2px); 103 | } 104 | flap-top > n, 105 | flap-top-flip > n { 106 | top: 2px; 107 | } 108 | flap-bottom > n, 109 | flap-bottom-flip > n { 110 | bottom: 2px; 111 | } 112 | } 113 | 114 | /* Number 115 | ------------------------------------------------*/ 116 | n { 117 | position: absolute; 118 | left: 0; 119 | width: 100%; 120 | height: 11vw; 121 | font-size: 9vw; 122 | font-weight: 200; 123 | line-height: 118%; 124 | text-align: center; 125 | font-variant-numeric: tabular-nums; 126 | -webkit-backface-visibility: hidden; 127 | transform: translate3d(0, 0, 0) 128 | } 129 | 130 | /* Animations 131 | ------------------------------------------------*/ 132 | @keyframes flip-top-down { 133 | 0% { 134 | transform: rotateX(0); 135 | } 136 | 100% { 137 | transform: rotateX(-90deg); 138 | color: black; 139 | background-color: black; 140 | } 141 | } 142 | @keyframes flip-bottom-down { 143 | 0% { 144 | color: white; 145 | background-color: rgb(30,30,30); 146 | transform: rotateX(90deg); 147 | } 148 | 100% { 149 | transform: rotateX(0deg); 150 | } 151 | } 152 | 153 | @media screen and (min-width: 800px) { 154 | @keyframes flip-top-down { 155 | 0% { 156 | transform: translateY(-1px) rotateX(0); 157 | } 158 | 100% { 159 | transform: translateY(-1px) rotateX(-90deg); 160 | color: black; 161 | background-color: black; 162 | } 163 | } 164 | @keyframes flip-bottom-down { 165 | 0% { 166 | color: white; 167 | background-color: rgb(30,30,30); 168 | transform: translateY(1px) rotateX(90deg); 169 | } 170 | 100% { 171 | transform: translateY(1px) rotateX(0deg); 172 | } 173 | } 174 | } 175 | 176 | @media screen and (min-width: 1280px) { 177 | @keyframes flip-top-down { 178 | 0% { 179 | transform: translateY(-2px) rotateX(0); 180 | } 181 | 100% { 182 | transform: translateY(-2px) rotateX(-90deg); 183 | color: black; 184 | background-color: black; 185 | } 186 | } 187 | @keyframes flip-bottom-down { 188 | 0% { 189 | color: white; 190 | background-color: rgb(30,30,30); 191 | transform: translateY(2px) rotateX(90deg); 192 | } 193 | 100% { 194 | transform: translateY(2px) rotateX(0deg); 195 | } 196 | } 197 | } 198 | -------------------------------------------------------------------------------- /EpochFlipClock.m: -------------------------------------------------------------------------------- 1 | #import "EpochFlipClock.h" 2 | #import 3 | 4 | @implementation EpochFlipClock 5 | 6 | static NSString * const epochFlipClockModule = @"com.epochflipclock"; 7 | 8 | - (id)initWithFrame:(NSRect)frame isPreview:(BOOL)isPreview { 9 | if (!(self = [super initWithFrame:frame isPreview:isPreview])) return nil; 10 | 11 | // Preference Defaults 12 | ScreenSaverDefaults *defaults; 13 | defaults = [ScreenSaverDefaults defaultsForModuleWithName:epochFlipClockModule]; 14 | 15 | [defaults registerDefaults:[NSDictionary dictionaryWithObjectsAndKeys: 16 | @"0", @"screenDisplayOption", // Default to show only on primary display 17 | nil]]; 18 | 19 | // Webview 20 | NSURL* indexHTMLDocumentURL = [NSURL URLWithString:[[[NSURL fileURLWithPath:[[NSBundle bundleForClass:self.class].resourcePath stringByAppendingString:@"/Webview/index.html"] isDirectory:NO] description] stringByAppendingFormat:@"?screensaver=1%@", self.isPreview ? @"&is_preview=1" : @""]]; 21 | 22 | WebView* webView = [[WebView alloc] initWithFrame:NSMakeRect(0, 0, frame.size.width, frame.size.height)]; 23 | webView.drawsBackground = NO; // Avoids a "white flash" just before the index.html file has loaded 24 | [webView.mainFrame loadRequest:[NSURLRequest requestWithURL:indexHTMLDocumentURL cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:30.0]]; 25 | 26 | // Show on screens based on preferences 27 | NSArray* screens = [NSScreen screens]; 28 | NSScreen* primaryScreen = [screens objectAtIndex:0]; 29 | 30 | switch ([defaults integerForKey:@"screenDisplayOption"]) { 31 | // Primary screen (System Preferences > Displays). 32 | // The screen the menubar is shown on under 'arrangement' 33 | case 0: 34 | if ((primaryScreen.frame.origin.x == frame.origin.x) || isPreview) { 35 | [self addSubview:webView]; 36 | } 37 | break; 38 | // Last Focussed Screen 39 | // This _sometimes_ results in nothing being shown when previewing in system prefs. 40 | case 1: 41 | if (([NSScreen mainScreen].frame.origin.x == frame.origin.x) || isPreview) { 42 | [self addSubview:webView]; 43 | } 44 | break; 45 | // All Screens 46 | case 2: 47 | [self addSubview:webView]; 48 | break; 49 | default: 50 | [self addSubview:webView]; 51 | break; 52 | } 53 | 54 | return self; 55 | } 56 | 57 | #pragma mark - ScreenSaverView 58 | 59 | - (void)animateOneFrame { [self stopAnimation]; } 60 | 61 | #pragma mark - Config 62 | // http://cocoadevcentral.com/articles/000088.php 63 | 64 | - (BOOL)hasConfigureSheet { return YES; } 65 | 66 | - (NSWindow *)configureSheet 67 | { 68 | ScreenSaverDefaults *defaults; 69 | defaults = [ScreenSaverDefaults defaultsForModuleWithName:epochFlipClockModule]; 70 | 71 | if (!configSheet) 72 | { 73 | if (![NSBundle loadNibNamed:@"ConfigureSheet" owner:self]) 74 | { 75 | NSLog( @"Failed to load configure sheet." ); 76 | } 77 | } 78 | 79 | [screenDisplayOption selectItemAtIndex:[defaults integerForKey:@"screenDisplayOption"]]; 80 | 81 | return configSheet; 82 | } 83 | 84 | - (IBAction)cancelClick:(id)sender 85 | { 86 | [[NSApplication sharedApplication] endSheet:configSheet]; 87 | } 88 | 89 | - (IBAction) okClick: (id)sender 90 | { 91 | ScreenSaverDefaults *defaults; 92 | defaults = [ScreenSaverDefaults defaultsForModuleWithName:epochFlipClockModule]; 93 | 94 | // Update our defaults 95 | [defaults setInteger:[screenDisplayOption indexOfSelectedItem] 96 | forKey:@"screenDisplayOption"]; 97 | 98 | // Save the settings to disk 99 | [defaults synchronize]; 100 | 101 | // Close the sheet 102 | [[NSApplication sharedApplication] endSheet:configSheet]; 103 | } 104 | 105 | #pragma mark - WebFrameLoadDelegate 106 | 107 | - (void)webView:(WebView *)sender didFailLoadWithError:(NSError *)error forFrame:(WebFrame *)frame { 108 | NSLog(@"%@ error=%@", NSStringFromSelector(_cmd), error); 109 | } 110 | 111 | #pragma mark Focus Overrides 112 | 113 | - (NSView *)hitTest:(NSPoint)aPoint {return self;} 114 | //- (void)keyDown:(NSEvent *)theEvent {return;} 115 | //- (void)keyUp:(NSEvent *)theEvent {return;} 116 | - (void)mouseDown:(NSEvent *)theEvent {return;} 117 | - (void)mouseUp:(NSEvent *)theEvent {return;} 118 | - (void)mouseDragged:(NSEvent *)theEvent {return;} 119 | - (void)mouseEntered:(NSEvent *)theEvent {return;} 120 | - (void)mouseExited:(NSEvent *)theEvent {return;} 121 | - (BOOL)acceptsFirstResponder {return YES;} 122 | - (BOOL)resignFirstResponder {return NO;} 123 | 124 | @end 125 | -------------------------------------------------------------------------------- /ConfigureSheet.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 | 64 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | -------------------------------------------------------------------------------- /Epoch Flip Clock.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 47; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 3A40066E18B53113005F43A6 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3A40066D18B53113005F43A6 /* ScreenSaver.framework */; }; 11 | 3A40068318B53129005F43A6 /* WebKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3A40068218B53129005F43A6 /* WebKit.framework */; }; 12 | 77996CD91C94B825006B0FF7 /* EpochFlipClock.m in Sources */ = {isa = PBXBuildFile; fileRef = 77996CD81C94B825006B0FF7 /* EpochFlipClock.m */; }; 13 | 77AD4D2D2041D6A9001100EC /* Webview in Resources */ = {isa = PBXBuildFile; fileRef = 77AD4D2C2041D6A9001100EC /* Webview */; }; 14 | 77AD4D2F2041DBC6001100EC /* ConfigureSheet.xib in Resources */ = {isa = PBXBuildFile; fileRef = 77AD4D2E2041DBC6001100EC /* ConfigureSheet.xib */; }; 15 | 77AD4D312041E44A001100EC /* AppKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 77AD4D302041E44A001100EC /* AppKit.framework */; }; 16 | 77AD4D332041F756001100EC /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 77AD4D322041F756001100EC /* Cocoa.framework */; }; 17 | /* End PBXBuildFile section */ 18 | 19 | /* Begin PBXFileReference section */ 20 | 3A40066818B53112005F43A6 /* Epoch Flip Clock.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "Epoch Flip Clock.saver"; sourceTree = BUILT_PRODUCTS_DIR; }; 21 | 3A40066D18B53113005F43A6 /* ScreenSaver.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = ScreenSaver.framework; path = System/Library/Frameworks/ScreenSaver.framework; sourceTree = SDKROOT; }; 22 | 3A40068218B53129005F43A6 /* WebKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = WebKit.framework; path = System/Library/Frameworks/WebKit.framework; sourceTree = SDKROOT; }; 23 | 3A95A94B18EA12D30036779C /* EpochFlipClock.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = EpochFlipClock.h; sourceTree = SOURCE_ROOT; }; 24 | 77996CD61C94B804006B0FF7 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = SOURCE_ROOT; }; 25 | 77996CD81C94B825006B0FF7 /* EpochFlipClock.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = EpochFlipClock.m; sourceTree = SOURCE_ROOT; }; 26 | 77AD4D2C2041D6A9001100EC /* Webview */ = {isa = PBXFileReference; lastKnownFileType = folder; path = Webview; sourceTree = ""; }; 27 | 77AD4D2E2041DBC6001100EC /* ConfigureSheet.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = ConfigureSheet.xib; sourceTree = ""; }; 28 | 77AD4D302041E44A001100EC /* AppKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AppKit.framework; path = System/Library/Frameworks/AppKit.framework; sourceTree = SDKROOT; }; 29 | 77AD4D322041F756001100EC /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = System/Library/Frameworks/Cocoa.framework; sourceTree = SDKROOT; }; 30 | /* End PBXFileReference section */ 31 | 32 | /* Begin PBXFrameworksBuildPhase section */ 33 | 3A40066318B53112005F43A6 /* Frameworks */ = { 34 | isa = PBXFrameworksBuildPhase; 35 | buildActionMask = 2147483647; 36 | files = ( 37 | 77AD4D332041F756001100EC /* Cocoa.framework in Frameworks */, 38 | 77AD4D312041E44A001100EC /* AppKit.framework in Frameworks */, 39 | 3A40068318B53129005F43A6 /* WebKit.framework in Frameworks */, 40 | 3A40066E18B53113005F43A6 /* ScreenSaver.framework in Frameworks */, 41 | ); 42 | runOnlyForDeploymentPostprocessing = 0; 43 | }; 44 | /* End PBXFrameworksBuildPhase section */ 45 | 46 | /* Begin PBXGroup section */ 47 | 3A40065D18B53112005F43A6 = { 48 | isa = PBXGroup; 49 | children = ( 50 | 3A40067318B53113005F43A6 /* Source */, 51 | 3A40066A18B53112005F43A6 /* Frameworks */, 52 | 3A40066918B53112005F43A6 /* Products */, 53 | ); 54 | sourceTree = ""; 55 | }; 56 | 3A40066918B53112005F43A6 /* Products */ = { 57 | isa = PBXGroup; 58 | children = ( 59 | 3A40066818B53112005F43A6 /* Epoch Flip Clock.saver */, 60 | ); 61 | name = Products; 62 | sourceTree = ""; 63 | }; 64 | 3A40066A18B53112005F43A6 /* Frameworks */ = { 65 | isa = PBXGroup; 66 | children = ( 67 | 77AD4D322041F756001100EC /* Cocoa.framework */, 68 | 77AD4D302041E44A001100EC /* AppKit.framework */, 69 | 3A40068218B53129005F43A6 /* WebKit.framework */, 70 | 3A40066D18B53113005F43A6 /* ScreenSaver.framework */, 71 | ); 72 | name = Frameworks; 73 | sourceTree = ""; 74 | }; 75 | 3A40067318B53113005F43A6 /* Source */ = { 76 | isa = PBXGroup; 77 | children = ( 78 | 77AD4D2C2041D6A9001100EC /* Webview */, 79 | 3A95A94B18EA12D30036779C /* EpochFlipClock.h */, 80 | 77996CD81C94B825006B0FF7 /* EpochFlipClock.m */, 81 | 77996CD61C94B804006B0FF7 /* Info.plist */, 82 | 77AD4D2E2041DBC6001100EC /* ConfigureSheet.xib */, 83 | ); 84 | name = Source; 85 | sourceTree = ""; 86 | }; 87 | /* End PBXGroup section */ 88 | 89 | /* Begin PBXHeadersBuildPhase section */ 90 | 3A40066418B53112005F43A6 /* Headers */ = { 91 | isa = PBXHeadersBuildPhase; 92 | buildActionMask = 2147483647; 93 | files = ( 94 | ); 95 | runOnlyForDeploymentPostprocessing = 0; 96 | }; 97 | /* End PBXHeadersBuildPhase section */ 98 | 99 | /* Begin PBXNativeTarget section */ 100 | 3A40066718B53112005F43A6 /* Epoch Flip Clock */ = { 101 | isa = PBXNativeTarget; 102 | buildConfigurationList = 3A40067F18B53113005F43A6 /* Build configuration list for PBXNativeTarget "Epoch Flip Clock" */; 103 | buildPhases = ( 104 | 3A40066218B53112005F43A6 /* Sources */, 105 | 3A40066318B53112005F43A6 /* Frameworks */, 106 | 3A40066418B53112005F43A6 /* Headers */, 107 | 3A40066518B53112005F43A6 /* Resources */, 108 | 3A40066618B53112005F43A6 /* Rez */, 109 | ); 110 | buildRules = ( 111 | ); 112 | dependencies = ( 113 | ); 114 | name = "Epoch Flip Clock"; 115 | productName = "Epoch Flip Clock"; 116 | productReference = 3A40066818B53112005F43A6 /* Epoch Flip Clock.saver */; 117 | productType = "com.apple.product-type.bundle"; 118 | }; 119 | /* End PBXNativeTarget section */ 120 | 121 | /* Begin PBXProject section */ 122 | 3A40065E18B53112005F43A6 /* Project object */ = { 123 | isa = PBXProject; 124 | attributes = { 125 | LastUpgradeCheck = 0920; 126 | ORGANIZATIONNAME = chrstphrknwtn; 127 | TargetAttributes = { 128 | 3A40066718B53112005F43A6 = { 129 | ProvisioningStyle = Manual; 130 | }; 131 | }; 132 | }; 133 | buildConfigurationList = 3A40066118B53112005F43A6 /* Build configuration list for PBXProject "Epoch Flip Clock" */; 134 | compatibilityVersion = "Xcode 6.3"; 135 | developmentRegion = English; 136 | hasScannedForEncodings = 0; 137 | knownRegions = ( 138 | en, 139 | ); 140 | mainGroup = 3A40065D18B53112005F43A6; 141 | productRefGroup = 3A40066918B53112005F43A6 /* Products */; 142 | projectDirPath = ""; 143 | projectRoot = ""; 144 | targets = ( 145 | 3A40066718B53112005F43A6 /* Epoch Flip Clock */, 146 | ); 147 | }; 148 | /* End PBXProject section */ 149 | 150 | /* Begin PBXResourcesBuildPhase section */ 151 | 3A40066518B53112005F43A6 /* Resources */ = { 152 | isa = PBXResourcesBuildPhase; 153 | buildActionMask = 2147483647; 154 | files = ( 155 | 77AD4D2D2041D6A9001100EC /* Webview in Resources */, 156 | 77AD4D2F2041DBC6001100EC /* ConfigureSheet.xib in Resources */, 157 | ); 158 | runOnlyForDeploymentPostprocessing = 0; 159 | }; 160 | /* End PBXResourcesBuildPhase section */ 161 | 162 | /* Begin PBXRezBuildPhase section */ 163 | 3A40066618B53112005F43A6 /* Rez */ = { 164 | isa = PBXRezBuildPhase; 165 | buildActionMask = 2147483647; 166 | files = ( 167 | ); 168 | runOnlyForDeploymentPostprocessing = 0; 169 | }; 170 | /* End PBXRezBuildPhase section */ 171 | 172 | /* Begin PBXSourcesBuildPhase section */ 173 | 3A40066218B53112005F43A6 /* Sources */ = { 174 | isa = PBXSourcesBuildPhase; 175 | buildActionMask = 2147483647; 176 | files = ( 177 | 77996CD91C94B825006B0FF7 /* EpochFlipClock.m in Sources */, 178 | ); 179 | runOnlyForDeploymentPostprocessing = 0; 180 | }; 181 | /* End PBXSourcesBuildPhase section */ 182 | 183 | /* Begin XCBuildConfiguration section */ 184 | 3A40067D18B53113005F43A6 /* Debug */ = { 185 | isa = XCBuildConfiguration; 186 | buildSettings = { 187 | ALWAYS_SEARCH_USER_PATHS = NO; 188 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 189 | CLANG_CXX_LIBRARY = "libc++"; 190 | CLANG_ENABLE_OBJC_ARC = YES; 191 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 192 | CLANG_WARN_BOOL_CONVERSION = YES; 193 | CLANG_WARN_COMMA = YES; 194 | CLANG_WARN_CONSTANT_CONVERSION = YES; 195 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 196 | CLANG_WARN_EMPTY_BODY = YES; 197 | CLANG_WARN_ENUM_CONVERSION = YES; 198 | CLANG_WARN_INFINITE_RECURSION = YES; 199 | CLANG_WARN_INT_CONVERSION = YES; 200 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 201 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 202 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 203 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 204 | CLANG_WARN_STRICT_PROTOTYPES = YES; 205 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 206 | CLANG_WARN_UNREACHABLE_CODE = YES; 207 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 208 | CODE_SIGN_IDENTITY = ""; 209 | CODE_SIGN_STYLE = Manual; 210 | COPY_PHASE_STRIP = YES; 211 | DEBUG_INFORMATION_FORMAT = dwarf; 212 | ENABLE_NS_ASSERTIONS = YES; 213 | ENABLE_STRICT_OBJC_MSGSEND = YES; 214 | ENABLE_TESTABILITY = YES; 215 | GCC_C_LANGUAGE_STANDARD = gnu99; 216 | GCC_DYNAMIC_NO_PIC = NO; 217 | GCC_ENABLE_OBJC_EXCEPTIONS = YES; 218 | GCC_NO_COMMON_BLOCKS = YES; 219 | GCC_OPTIMIZATION_LEVEL = fast; 220 | GCC_PREPROCESSOR_DEFINITIONS = ( 221 | "DEBUG=1", 222 | "$(inherited)", 223 | ); 224 | GCC_SYMBOLS_PRIVATE_EXTERN = YES; 225 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 226 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 227 | GCC_WARN_UNDECLARED_SELECTOR = YES; 228 | GCC_WARN_UNINITIALIZED_AUTOS = YES; 229 | GCC_WARN_UNUSED_FUNCTION = YES; 230 | GCC_WARN_UNUSED_VARIABLE = YES; 231 | MACOSX_DEPLOYMENT_TARGET = 10.11; 232 | ONLY_ACTIVE_ARCH = YES; 233 | SDKROOT = macosx; 234 | }; 235 | name = Debug; 236 | }; 237 | 3A40067E18B53113005F43A6 /* Release */ = { 238 | isa = XCBuildConfiguration; 239 | buildSettings = { 240 | ALWAYS_SEARCH_USER_PATHS = NO; 241 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 242 | CLANG_CXX_LIBRARY = "libc++"; 243 | CLANG_ENABLE_OBJC_ARC = YES; 244 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 245 | CLANG_WARN_BOOL_CONVERSION = YES; 246 | CLANG_WARN_COMMA = YES; 247 | CLANG_WARN_CONSTANT_CONVERSION = YES; 248 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 249 | CLANG_WARN_EMPTY_BODY = YES; 250 | CLANG_WARN_ENUM_CONVERSION = YES; 251 | CLANG_WARN_INFINITE_RECURSION = YES; 252 | CLANG_WARN_INT_CONVERSION = YES; 253 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 254 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 255 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 256 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 257 | CLANG_WARN_STRICT_PROTOTYPES = YES; 258 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 259 | CLANG_WARN_UNREACHABLE_CODE = YES; 260 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 261 | CODE_SIGN_IDENTITY = ""; 262 | CODE_SIGN_STYLE = Manual; 263 | COPY_PHASE_STRIP = YES; 264 | DEBUG_INFORMATION_FORMAT = dwarf; 265 | ENABLE_NS_ASSERTIONS = YES; 266 | ENABLE_STRICT_OBJC_MSGSEND = YES; 267 | GCC_C_LANGUAGE_STANDARD = gnu99; 268 | GCC_ENABLE_OBJC_EXCEPTIONS = YES; 269 | GCC_NO_COMMON_BLOCKS = YES; 270 | GCC_OPTIMIZATION_LEVEL = fast; 271 | GCC_SYMBOLS_PRIVATE_EXTERN = YES; 272 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 273 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 274 | GCC_WARN_UNDECLARED_SELECTOR = YES; 275 | GCC_WARN_UNINITIALIZED_AUTOS = YES; 276 | GCC_WARN_UNUSED_FUNCTION = YES; 277 | GCC_WARN_UNUSED_VARIABLE = YES; 278 | MACOSX_DEPLOYMENT_TARGET = 10.11; 279 | ONLY_ACTIVE_ARCH = YES; 280 | SDKROOT = macosx; 281 | }; 282 | name = Release; 283 | }; 284 | 3A40068018B53113005F43A6 /* Debug */ = { 285 | isa = XCBuildConfiguration; 286 | buildSettings = { 287 | CODE_SIGN_IDENTITY = ""; 288 | COMBINE_HIDPI_IMAGES = YES; 289 | DEVELOPMENT_TEAM = ""; 290 | INFOPLIST_FILE = Info.plist; 291 | INSTALL_PATH = "$(HOME)/Library/Screen Savers"; 292 | PRODUCT_BUNDLE_IDENTIFIER = "com.chrstphrknwtn.${PRODUCT_NAME:rfc1034identifier}"; 293 | PRODUCT_NAME = $TARGET_NAME; 294 | WRAPPER_EXTENSION = saver; 295 | }; 296 | name = Debug; 297 | }; 298 | 3A40068118B53113005F43A6 /* Release */ = { 299 | isa = XCBuildConfiguration; 300 | buildSettings = { 301 | CODE_SIGN_IDENTITY = ""; 302 | COMBINE_HIDPI_IMAGES = YES; 303 | DEVELOPMENT_TEAM = ""; 304 | INFOPLIST_FILE = Info.plist; 305 | INSTALL_PATH = "$(HOME)/Library/Screen Savers"; 306 | PRODUCT_BUNDLE_IDENTIFIER = "com.chrstphrknwtn.${PRODUCT_NAME:rfc1034identifier}"; 307 | PRODUCT_NAME = $TARGET_NAME; 308 | WRAPPER_EXTENSION = saver; 309 | }; 310 | name = Release; 311 | }; 312 | /* End XCBuildConfiguration section */ 313 | 314 | /* Begin XCConfigurationList section */ 315 | 3A40066118B53112005F43A6 /* Build configuration list for PBXProject "Epoch Flip Clock" */ = { 316 | isa = XCConfigurationList; 317 | buildConfigurations = ( 318 | 3A40067D18B53113005F43A6 /* Debug */, 319 | 3A40067E18B53113005F43A6 /* Release */, 320 | ); 321 | defaultConfigurationIsVisible = 0; 322 | defaultConfigurationName = Release; 323 | }; 324 | 3A40067F18B53113005F43A6 /* Build configuration list for PBXNativeTarget "Epoch Flip Clock" */ = { 325 | isa = XCConfigurationList; 326 | buildConfigurations = ( 327 | 3A40068018B53113005F43A6 /* Debug */, 328 | 3A40068118B53113005F43A6 /* Release */, 329 | ); 330 | defaultConfigurationIsVisible = 0; 331 | defaultConfigurationName = Release; 332 | }; 333 | /* End XCConfigurationList section */ 334 | }; 335 | rootObject = 3A40065E18B53112005F43A6 /* Project object */; 336 | } 337 | --------------------------------------------------------------------------------