diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..6701d3c --- /dev/null +++ b/.gitignore @@ -0,0 +1,63 @@ +# Xcode +# +# gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore + +## Build generated +build/ +DerivedData + +## Various settings +*.pbxuser +!default.pbxuser +*.mode1v3 +!default.mode1v3 +*.mode2v3 +!default.mode2v3 +*.perspectivev3 +!default.perspectivev3 +xcuserdata + +## Other +*.xccheckout +*.moved-aside +*.xcuserstate +*.xcscmblueprint + +## Obj-C/Swift specific +*.hmap +*.ipa + +# CocoaPods +# +# We recommend against adding the Pods directory to your .gitignore. However +# you should judge for yourself, the pros and cons are mentioned at: +# https://guides.cocoapods.org/using/using-cocoapods.html#should-i-check-the-pods-directory-into-source-control +# + +Pods/ +Podfile.lock + +# Carthage +# +# Add this line if you want to avoid checking in source code from Carthage dependencies. +# Carthage/Checkouts + +Carthage/Build + +# fastlane +# +# It is recommended to not store the screenshots in the git repo. Instead, use fastlane to re-generate the +# screenshots whenever they are needed. +# For more information about the recommended setup visit: +# https://github.com/fastlane/fastlane/blob/master/docs/Gitignore.md + +fastlane/report.xml +fastlane/screenshots + +#Liblinphone +liblinphone-sdk/* + +#CocoaPods +Pods +Podfile.lock + diff --git a/WebViewScreenSaver/ConfigureSheet.xib b/WebViewScreenSaver/ConfigureSheet.xib index afcd054..81597d6 100644 --- a/WebViewScreenSaver/ConfigureSheet.xib +++ b/WebViewScreenSaver/ConfigureSheet.xib @@ -1,1091 +1,226 @@ - - - 101000 - 14C109 - 6254 - 1344.72 - 757.30 - - com.apple.InterfaceBuilder.CocoaPlugin - 6254 - - - NSBox - NSButton - NSButtonCell - NSCustomObject - NSScrollView - NSScroller - NSTableCellView - NSTableColumn - NSTableHeaderView - NSTableView - NSTextField - NSTextFieldCell - NSView - NSWindowTemplate - - - com.apple.InterfaceBuilder.CocoaPlugin - - - PluginDependencyRecalculationVersion - - - - - WVSSConfigController - - - FirstResponder - - - NSApplication - - - 79 - 2 - {{196, 170}, {443, 340}} - 1618477056 - WebView Options - NSPanel - - - - - 256 - - - - 18 - - - - 274 - - - - 274 - - - - 2322 - - - - 256 - - - - 274 - - - - 266 - {277, 17} - - - - {250, 750} - YES - - 337641537 - 272631872 - Table View Cell - - YES - 13 - 1044 - - - - 6 - System - controlColor - - 3 - MC42NjY2NjY2NjY3AA - - - - 6 - System - controlTextColor - - 3 - MAA - - - - NO - 1 - - - {{1, 1}, {277, 17}} - - - - - - - 274 - - - - 266 - {86, 17} - - - - {250, 750} - YES - - 338165825 - 272631872 - Table View Cell - - - - - - NO - 1 - - - {{281, 1}, {86, 17}} - - - - - - {369, 101} - - - - YES - NO - YES - - - 256 - {369, 17} - - - - - - - - -2147483392 - {{224, 0}, {16, 17}} - - - - url - 277 - 40 - 1000 - - 75497536 - 2048 - URL - - YES - 11 - 3100 - - - 3 - MC4zMzMzMzI5ODU2AA - - - 6 - System - headerTextColor - - - - - 337641536 - 272762880 - URL - - - - - - 3 - YES - YES - - - - time - 86 - 10 - 3.4028234663852886e+38 - - 75497536 - 2048 - Seconds - - - 6 - System - headerColor - - 3 - MQA - - - - - - 337641536 - 133120 - Text Cell - - - - 6 - System - controlBackgroundColor - - - - - 1 - YES - YES - - - - 3 - 2 - - - 6 - System - gridColor - - 3 - MC41AA - - - 17 - -1296007168 - - - 2 - 1 - 15 - 0 - NO - 0 - 1 - - - {{1, 17}, {369, 101}} - - - - - - 4 - YES - - - - -2147483392 - {{-100, -100}, {15, 102}} - - - - NO - _doScroller: - - - _doScroller: - 0.99152542372881358 - - - - -2147483392 - {{-100, -100}, {58, 15}} - - - - NO - _doScroller: - - 1 - - _doScroller: - 0.39455782312925169 - - - - 2338 - - - - {{1, 0}, {369, 17}} - - - - - YES - - - {{18, 44}, {371, 119}} - - - - 133650 - - - - - QSAAAEEgAABBmAAAQZgAAA - 0.25 - 4 - 1 - - - - 292 - {{131, 13}, {77, 23}} - - - - YES - - -2080374784 - 134217728 - Add URL - - - -2033434624 - 162 - - - 400 - 75 - - NO - - - - 292 - {{18, 13}, {105, 23}} - - - - YES - - -2080374784 - 134217728 - Remove URL - - - -2033434624 - 162 - - - 400 - 75 - - NO - - - - 266 - {{18, 196}, {371, 22}} - - - - _NS:9 - YES - - -1804599231 - 272630784 - - - http:// - _NS:9 - - YES - - 6 - System - textBackgroundColor - - - - 6 - System - textColor - - - - NO - 1 - - - - 268 - {{15, 171}, {377, 17}} - - - - YES - - 68157504 - 272630784 - Addresses - - YES - 13 - 2072 - - - - - - NO - 1 - - - - 268 - {{16, 224}, {153, 18}} - - - - _NS:9 - YES - - -2080374784 - 268435456 - Fetch URLs Remotely - - _NS:9 - - 1211912448 - 2 - - NSImage - NSSwitch - - - NSSwitch - - - - 200 - 25 - - NO - - - {{1, 1}, {407, 262}} - - - - - - {{17, 56}, {409, 264}} - - - - {0, 0} - - 67108864 - 0 - Box - - - - 6 - System - labelColor - - - - - 1 - 0 - 0 - NO - - - - 289 - {{333, 12}, {96, 32}} - - - YES - - 67108864 - 134217728 - Close - - - -2038284288 - 129 - - - 200 - 25 - - NO - - - {443, 340} - - - - - {{0, 0}, {1366, 745}} - {10000000000000, 10000000000000} - YES - - - - - - - dismissConfigSheet: - - - - 32 - - - - sheet - - - - 60 - - - - removeRow: - - - - 97 - - - - addRow: - - - - 98 - - - - urlsURLField - - - - 128 - - - - fetchURLCheckbox - - - - 131 - - - - toggleFetchingURLs: - - - - 132 - - - - tableViewCellDidEdit: - - - - 142 - - - - urlTable - - - - 143 - - - - sheetContents - - - - 144 - - - - tableViewCellDidEdit: - - - - 145 - - - - dataSource - - - - 83 - - - - delegate - - - - 133 - - - - textField - - - - 137 - - - - textField - - - - 141 - - - - - - 0 - - - - - - -2 - - - File's Owner - - - -1 - - - First Responder - - - -3 - - - Application - - - 1 - - - - - - - - 2 - - - - - - - - - 3 - - - - - - - - - - - - - 6 - - - - - - - - 7 - - - - - 70 - - - - - - - - - - - 71 - - - - - 72 - - - - - 73 - - - - - - - - - 75 - - - - - - - - - 79 - - - - - 80 - - - - - 85 - - - - - - - - - 86 - - - - - 93 - - - - - - - - 94 - - - - - 95 - - - - - - - - 96 - - - - - 99 - - - - - - - - 100 - - - - - 101 - - - - - - - - 102 - - - - - 129 - - - - - - - - 130 - - - - - 134 - - - - - - - - 135 - - - - - - - - 136 - - - - - 138 - - - - - - - - 139 - - - - - - - - 140 - - - - - - - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - {{675, 157}, {443, 340}} - - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - - com.apple.InterfaceBuilder.CocoaPlugin - - - - - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - - - - - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - com.apple.InterfaceBuilder.CocoaPlugin - - - - - - 145 - - - - - WVSSConfigController - NSObject - - id - id - id - id - id - - - - addRow: - id - - - dismissConfigSheet: - id - - - removeRow: - id - - - tableViewCellDidEdit: - id - - - toggleFetchingURLs: - id - - - - NSButton - NSWindow - NSView - NSTableView - NSTextField - - - - fetchURLCheckbox - NSButton - - - sheet - NSWindow - - - sheetContents - NSView - - - urlTable - NSTableView - - - urlsURLField - NSTextField - - - - IBProjectSource - ../WVSSConfigController.h - - - - WVSSConfigController - - id - id - id - NSTextField - id - - - - addRow: - id - - - dismissConfigSheet: - id - - - removeRow: - id - - - tableViewCellDidEdit: - NSTextField - - - toggleFetchingURLs: - id - - - - IBProjectSource - ../WVSSConfigController.m - - - - - 0 - IBCocoaFramework - NO - - com.apple.InterfaceBuilder.CocoaPlugin.InterfaceBuilder3 - - - YES - 3 - - NSSwitch - {15, 15} - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/WebViewScreenSaver/WVSSConfig.h b/WebViewScreenSaver/WVSSConfig.h index 7506c32..6d7f61b 100644 --- a/WebViewScreenSaver/WVSSConfig.h +++ b/WebViewScreenSaver/WVSSConfig.h @@ -28,6 +28,7 @@ @property(nonatomic, strong, readonly) NSMutableArray *addresses; @property(nonatomic, strong) NSString *addressListURL; @property(nonatomic, assign) BOOL shouldFetchAddressList; +@property(nonatomic, assign) BOOL shufflePlaylist; - (instancetype)initWithUserDefaults:(NSUserDefaults *)userDefaults; - (void)synchronize; diff --git a/WebViewScreenSaver/WVSSConfig.m b/WebViewScreenSaver/WVSSConfig.m index e57c91f..fc24894 100644 --- a/WebViewScreenSaver/WVSSConfig.m +++ b/WebViewScreenSaver/WVSSConfig.m @@ -26,6 +26,7 @@ static NSString * const kScreenSaverFetchURLsKey = @"kScreenSaverFetchURLs"; // BOOL static NSString * const kScreenSaverURLsURLKey = @"kScreenSaverURLsURL"; // NSString (URL) static NSString * const kScreenSaverURLListKey = @"kScreenSaverURLList"; // NSArray of NSDictionary +static NSString * const kScreenSaverShufflePlaylist = @"kScreenSaverShufflePlaylist"; @interface WVSSConfig () @@ -36,18 +37,19 @@ @interface WVSSConfig () @implementation WVSSConfig - (instancetype)initWithUserDefaults:(NSUserDefaults *)userDefaults { - self = [super init]; - if (self) { - self.userDefaults = userDefaults; - - self.addresses = [self loadAddressesFromUserDefaults:userDefaults]; - self.addressListURL = [userDefaults stringForKey:kScreenSaverURLsURLKey]; - self.shouldFetchAddressList = [userDefaults boolForKey:kScreenSaverFetchURLsKey]; - - //NSLog(@"Loaded Addresses: %@", self.addresses); - - if (!self.addresses) { - self.addresses = [NSMutableArray array]; + self = [super init]; + if (self) { + self.userDefaults = userDefaults; + + self.addresses = [self loadAddressesFromUserDefaults:userDefaults]; + self.addressListURL = [userDefaults stringForKey:kScreenSaverURLsURLKey]; + self.shouldFetchAddressList = [userDefaults boolForKey:kScreenSaverFetchURLsKey]; + self.shufflePlaylist = [userDefaults boolForKey:kScreenSaverShufflePlaylist]; + + //NSLog(@"Loaded Addresses: %@", self.addresses); + + if (!self.addresses) { + self.addresses = [NSMutableArray array]; } } return self; @@ -79,16 +81,17 @@ - (void)saveAddressesToUserDefaults:(NSUserDefaults *)userDefaults { } - (void)synchronize { - [self saveAddressesToUserDefaults:self.userDefaults]; - [self.userDefaults setBool:self.shouldFetchAddressList forKey:kScreenSaverFetchURLsKey]; - - if (self.addressListURL.length) { - [self.userDefaults setObject:self.addressListURL forKey:kScreenSaverURLsURLKey]; - } else { - [self.userDefaults removeObjectForKey:kScreenSaverURLsURLKey]; - } - [self.userDefaults synchronize]; - + [self saveAddressesToUserDefaults:self.userDefaults]; + [self.userDefaults setBool:self.shouldFetchAddressList forKey:kScreenSaverFetchURLsKey]; + [self.userDefaults setBool:self.shufflePlaylist forKey:kScreenSaverShufflePlaylist]; + + if (self.addressListURL.length) { + [self.userDefaults setObject:self.addressListURL forKey:kScreenSaverURLsURLKey]; + } else { + [self.userDefaults removeObjectForKey:kScreenSaverURLsURLKey]; + } + [self.userDefaults synchronize]; + } - (void)addAddressWithURL:(NSString *)url duration:(NSInteger)duration { diff --git a/WebViewScreenSaver/WVSSConfigController.h b/WebViewScreenSaver/WVSSConfigController.h index a8044a9..5219bcc 100644 --- a/WebViewScreenSaver/WVSSConfigController.h +++ b/WebViewScreenSaver/WVSSConfigController.h @@ -34,6 +34,7 @@ @property(nonatomic, strong) IBOutlet NSTableView *urlTable; @property(nonatomic, strong) IBOutlet NSTextField *urlsURLField; @property(nonatomic, strong) IBOutlet NSButton *fetchURLCheckbox; +@property(nonatomic, weak) IBOutlet NSButton *shuffleCheckbox; - (instancetype)initWithUserDefaults:(NSUserDefaults *)userDefaults; - (void)synchronize; @@ -47,6 +48,7 @@ - (IBAction)dismissConfigSheet:(id)sender; - (IBAction)toggleFetchingURLs:(id)sender; +- (IBAction)toggleShuffle:(id)sender; - (IBAction)tableViewCellDidEdit:(id)sender; - (void)fetchAddresses; diff --git a/WebViewScreenSaver/WVSSConfigController.m b/WebViewScreenSaver/WVSSConfigController.m index 19122b0..13b9552 100644 --- a/WebViewScreenSaver/WVSSConfigController.m +++ b/WebViewScreenSaver/WVSSConfigController.m @@ -66,6 +66,20 @@ - (void)appendSampleAddressIfEmpty { } - (NSArray *)addresses { + + if (self.config.shufflePlaylist) + { + NSMutableArray *mutableArray = [self.config.addresses mutableCopy]; + NSUInteger count = [mutableArray count]; + if (count <= 1) return nil; + + for (NSUInteger i = 0; i < count - 1; ++i) { + NSInteger remainingCount = count - i; + NSInteger exchangeIndex = i + arc4random_uniform((u_int32_t )remainingCount); + [mutableArray exchangeObjectAtIndex:i withObjectAtIndex:exchangeIndex]; + } + return mutableArray; + } return self.config.addresses; } @@ -167,6 +181,7 @@ - (NSWindow *)configureSheet { [self.fetchURLCheckbox setIntegerValue:self.config.shouldFetchAddressList]; [self.urlsURLField setEnabled:self.config.shouldFetchAddressList]; + self.shuffleCheckbox.integerValue = self.config.shufflePlaylist; } return self.sheet; } @@ -257,7 +272,7 @@ - (BOOL)tableView:(NSTableView *)aTableView return YES; } -#pragma mark - +#pragma mark - Actions - (IBAction)tableViewCellDidEdit:(NSTextField *)textField { NSInteger col = [self.urlTable columnForView:textField]; @@ -283,5 +298,9 @@ - (IBAction)toggleFetchingURLs:(id)sender { [self.urlsURLField setEnabled:self.config.shouldFetchAddressList]; } +- (void)toggleShuffle:(id)sender { + self.config.shufflePlaylist = ! self.config.shufflePlaylist; + self.shuffleCheckbox.integerValue = self.config.shufflePlaylist; +} @end diff --git a/WebViewScreenSaver/WebViewScreenSaver.xcodeproj/project.pbxproj b/WebViewScreenSaver/WebViewScreenSaver.xcodeproj/project.pbxproj index 3b00023..a3746d0 100644 --- a/WebViewScreenSaver/WebViewScreenSaver.xcodeproj/project.pbxproj +++ b/WebViewScreenSaver/WebViewScreenSaver.xcodeproj/project.pbxproj @@ -307,7 +307,6 @@ TargetAttributes = { 641457061AEDC92100FB6CDF = { CreatedOnToolsVersion = 6.1.1; - DevelopmentTeam = BPXMH69X9T; }; 641457181AEDC92200FB6CDF = { CreatedOnToolsVersion = 6.1.1; @@ -484,6 +483,7 @@ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; COMBINE_HIDPI_IMAGES = YES; COPY_PHASE_STRIP = NO; + DEVELOPMENT_TEAM = ""; ENABLE_STRICT_OBJC_MSGSEND = YES; GCC_C_LANGUAGE_STANDARD = gnu99; GCC_DYNAMIC_NO_PIC = NO; @@ -529,6 +529,7 @@ COMBINE_HIDPI_IMAGES = YES; COPY_PHASE_STRIP = YES; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + DEVELOPMENT_TEAM = ""; ENABLE_NS_ASSERTIONS = NO; ENABLE_STRICT_OBJC_MSGSEND = YES; GCC_C_LANGUAGE_STANDARD = gnu99; diff --git a/WebViewScreenSaver/WebViewScreenSaver.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/WebViewScreenSaver/WebViewScreenSaver.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..919434a --- /dev/null +++ b/WebViewScreenSaver/WebViewScreenSaver.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/WebViewScreenSaver/WebViewScreenSaver.xcodeproj/project.xcworkspace/xcuserdata/serj.xcuserdatad/UserInterfaceState.xcuserstate b/WebViewScreenSaver/WebViewScreenSaver.xcodeproj/project.xcworkspace/xcuserdata/serj.xcuserdatad/UserInterfaceState.xcuserstate new file mode 100644 index 0000000..b0526c2 Binary files /dev/null and b/WebViewScreenSaver/WebViewScreenSaver.xcodeproj/project.xcworkspace/xcuserdata/serj.xcuserdatad/UserInterfaceState.xcuserstate differ diff --git a/WebViewScreenSaver/WebViewScreenSaver.xcodeproj/xcuserdata/serj.xcuserdatad/xcschemes/xcschememanagement.plist b/WebViewScreenSaver/WebViewScreenSaver.xcodeproj/xcuserdata/serj.xcuserdatad/xcschemes/xcschememanagement.plist new file mode 100644 index 0000000..5a13e6a --- /dev/null +++ b/WebViewScreenSaver/WebViewScreenSaver.xcodeproj/xcuserdata/serj.xcuserdatad/xcschemes/xcschememanagement.plist @@ -0,0 +1,24 @@ + + + + + SuppressBuildableAutocreation + + 641457061AEDC92100FB6CDF + + primary + + + 641457181AEDC92200FB6CDF + + primary + + + 8D255AC50486D3F9007BF209 + + primary + + + + + diff --git a/WebViewScreenSaver/WebViewScreenSaverView.m b/WebViewScreenSaver/WebViewScreenSaverView.m index 633a996..165faee 100644 --- a/WebViewScreenSaver/WebViewScreenSaverView.m +++ b/WebViewScreenSaver/WebViewScreenSaverView.m @@ -29,205 +29,202 @@ @interface WebViewScreenSaverView () < - WVSSConfigControllerDelegate, - WebEditingDelegate, - WebFrameLoadDelegate, - WebPolicyDelegate, - WebUIDelegate> +WVSSConfigControllerDelegate, +WebEditingDelegate, +WebFrameLoadDelegate, +WebPolicyDelegate, +WebUIDelegate> + // Timer callback that loads the next URL in the URL list. - (void)loadNext:(NSTimer *)timer; // Returns the URL for the index in the preferences. - (NSString *)urlForIndex:(NSInteger)index; // Returns the time interval in the preferences. - (NSTimeInterval)timeIntervalForIndex:(NSInteger)index; + + @end @implementation WebViewScreenSaverView { - NSTimer *_timer; - WebView *_webView; - NSInteger _currentIndex; - BOOL _isPreview; + NSTimer *_timer; + WebView *_webView; + NSInteger _currentIndex; + BOOL _isPreview; + NSArray *_playlist; } + (BOOL)performGammaFade { - return YES; + return YES; } - (id)initWithFrame:(NSRect)frame isPreview:(BOOL)isPreview { - NSUserDefaults *prefs = [ScreenSaverDefaults defaultsForModuleWithName:kScreenSaverName]; - return [self initWithFrame:frame isPreview:isPreview prefsStore:prefs]; + NSUserDefaults *prefs = [ScreenSaverDefaults defaultsForModuleWithName:kScreenSaverName]; + return [self initWithFrame:frame isPreview:isPreview prefsStore:prefs]; } - (id)initWithFrame:(NSRect)frame isPreview:(BOOL)isPreview prefsStore:(NSUserDefaults *)prefs { - self = [super initWithFrame:frame isPreview:isPreview]; - if (self) { - [self setAutoresizingMask:NSViewWidthSizable|NSViewHeightSizable]; - [self setAutoresizesSubviews:YES]; - - _currentIndex = 0; - _isPreview = isPreview; - - // Load state from the preferences. - self.configController = [[WVSSConfigController alloc] initWithUserDefaults:prefs]; - self.configController.delegate = self; - } - return self; + self = [super initWithFrame:frame isPreview:isPreview]; + if (self) { + [self setAutoresizingMask:NSViewWidthSizable|NSViewHeightSizable]; + [self setAutoresizesSubviews:YES]; + + _currentIndex = 0; + _isPreview = isPreview; + + // Load state from the preferences. + self.configController = [[WVSSConfigController alloc] initWithUserDefaults:prefs]; + self.configController.delegate = self; + } + return self; } - (void)dealloc { - [_webView setFrameLoadDelegate:nil]; - [_webView setPolicyDelegate:nil]; - [_webView setUIDelegate:nil]; - [_webView setEditingDelegate:nil]; - [_webView close]; - [_timer invalidate]; - _timer = nil; + [_webView setFrameLoadDelegate:nil]; + [_webView setPolicyDelegate:nil]; + [_webView setUIDelegate:nil]; + [_webView setEditingDelegate:nil]; + [_webView close]; + [_timer invalidate]; + _timer = nil; } #pragma mark - Configure Sheet - (BOOL)hasConfigureSheet { - return YES; + return YES; } -//- (void)setFrame:(NSRect)frameRect { -// [super setFrame:frameRect]; -//} - - (NSWindow *)configureSheet { - return [self.configController configureSheet]; + return [self.configController configureSheet]; } - (void)configController:(WVSSConfigController *)configController dismissConfigSheet:(NSWindow *)sheet { - if (_isPreview) { - [self loadFromStart]; - } + if (_isPreview) { + [self loadFromStart]; + } #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wdeprecated-declarations" - [[NSApplication sharedApplication] endSheet:sheet]; + [[NSApplication sharedApplication] endSheet:sheet]; #pragma GCC diagnostic pop } #pragma mark ScreenSaverView - (void)startAnimation { - [super startAnimation]; - - //NSLog(@"startAnimation: %d %@", [NSThread isMainThread], [NSThread currentThread]); - - // Create the webview for the screensaver. - _webView = [[WebView alloc] initWithFrame:[self bounds]]; - [_webView setFrameLoadDelegate:self]; - [_webView setShouldUpdateWhileOffscreen:YES]; - [_webView setPolicyDelegate:self]; - [_webView setUIDelegate:self]; - [_webView setEditingDelegate:self]; - [_webView setAutoresizingMask:NSViewWidthSizable|NSViewHeightSizable]; - [_webView setAutoresizesSubviews:YES]; - [_webView setDrawsBackground:NO]; - [self addSubview:_webView]; - - NSColor *color = [NSColor colorWithCalibratedWhite:0.0 alpha:1.0]; - [[_webView layer] setBackgroundColor:color.CGColor]; - - if (!_isPreview && _currentIndex < [[self selectedURLs] count]) { - [self loadFromStart]; - } + [super startAnimation]; + + // Get the playlist + _playlist = self.configController.addresses; + + // Create the webview for the screensaver. + _webView = [[WebView alloc] initWithFrame:[self bounds]]; + [_webView setFrameLoadDelegate:self]; + [_webView setShouldUpdateWhileOffscreen:YES]; + [_webView setPolicyDelegate:self]; + [_webView setUIDelegate:self]; + [_webView setEditingDelegate:self]; + [_webView setAutoresizingMask:NSViewWidthSizable|NSViewHeightSizable]; + [_webView setAutoresizesSubviews:YES]; + [_webView setDrawsBackground:NO]; + [self addSubview:_webView]; + + NSColor *color = [NSColor colorWithCalibratedWhite:0.0 alpha:1.0]; + [[_webView layer] setBackgroundColor:color.CGColor]; + + if (!_isPreview && _currentIndex < _playlist.count) { + [self loadFromStart]; + } } - (void)stopAnimation { - [super stopAnimation]; - [_timer invalidate]; - _timer = nil; - [_webView removeFromSuperview]; - [_webView close]; - _webView = nil; + [super stopAnimation]; + [_timer invalidate]; + _timer = nil; + [_webView removeFromSuperview]; + [_webView close]; + _webView = nil; + _playlist = nil; } #pragma mark Loading URLs - (void)loadFromStart { - NSTimeInterval duration = [WVSSAddress defaultDuration]; - NSString *url = [WVSSAddress defaultAddressURL]; - _currentIndex = 0; - - if ([[self selectedURLs] count]) { - duration = [self timeIntervalForIndex:_currentIndex]; - url = [self urlForIndex:_currentIndex]; - } - - [self loadURLThing:url]; - [_timer invalidate]; - _timer = [NSTimer scheduledTimerWithTimeInterval:duration - target:self - selector:@selector(loadNext:) - userInfo:nil - repeats:NO]; + NSTimeInterval duration = [WVSSAddress defaultDuration]; + NSString *url = [WVSSAddress defaultAddressURL]; + _currentIndex = 0; + + if (_playlist.count) { + duration = [self timeIntervalForIndex:_currentIndex]; + url = [self urlForIndex:_currentIndex]; + } + + [self loadURLThing:url]; + [_timer invalidate]; + _timer = [NSTimer scheduledTimerWithTimeInterval:duration + target:self + selector:@selector(loadNext:) + userInfo:nil + repeats:NO]; } - (void)loadNext:(NSTimer *)timer { - NSTimeInterval duration = [WVSSAddress defaultDuration]; - NSString *url = [WVSSAddress defaultAddressURL]; - NSInteger nextIndex = _currentIndex; - - // Last element, fetchURLs if they exist. - if (_currentIndex == [[self selectedURLs] count] - 1) { - [self.configController fetchAddresses]; - } - - // Progress the URL counter. - if ([[self selectedURLs] count] > 0) { - nextIndex = (_currentIndex + 1) % [[self selectedURLs] count]; - duration = [self timeIntervalForIndex:nextIndex]; - url = [self urlForIndex:nextIndex]; - } - [self loadURLThing:url]; - [_timer invalidate]; - _timer = [NSTimer scheduledTimerWithTimeInterval:duration - target:self - selector:@selector(loadNext:) - userInfo:nil - repeats:NO]; - _currentIndex = nextIndex; + NSTimeInterval duration = [WVSSAddress defaultDuration]; + NSString *url = [WVSSAddress defaultAddressURL]; + NSInteger nextIndex = _currentIndex; + + // Last element, fetchURLs if they exist. + if (_currentIndex == _playlist.count - 1) { + [self.configController fetchAddresses]; + } + + // Progress the URL counter. + if ([_playlist count] > 0) { + nextIndex = (_currentIndex + 1) % _playlist.count; + duration = [self timeIntervalForIndex:nextIndex]; + url = [self urlForIndex:nextIndex]; + } + [self loadURLThing:url]; + [_timer invalidate]; + _timer = [NSTimer scheduledTimerWithTimeInterval:duration + target:self + selector:@selector(loadNext:) + userInfo:nil + repeats:NO]; + _currentIndex = nextIndex; } - (void)loadURLThing:(NSString *)url { - NSString *javascriptPrefix = @"javascript:"; - - if ([url isKindOfClass:[NSURL class]]) { - url = [(NSURL *)url absoluteString]; - } - - if([url hasPrefix:javascriptPrefix]) { - [_webView stringByEvaluatingJavaScriptFromString:url]; - } else { - [_webView setMainFrameURL:url]; - } + NSString *javascriptPrefix = @"javascript:"; + + if ([url isKindOfClass:[NSURL class]]) { + url = [(NSURL *)url absoluteString]; + } + + if([url hasPrefix:javascriptPrefix]) { + [_webView stringByEvaluatingJavaScriptFromString:url]; + } else { + [_webView setMainFrameURL:url]; + } } -- (NSArray *)selectedURLs { - return self.configController.addresses; -} - - - (NSString *)urlForIndex:(NSInteger)index { - WVSSAddress *address = [self.configController.addresses objectAtIndex:index]; - return address.url; + WVSSAddress *address = [_playlist objectAtIndex:index]; + return address.url; } - (NSTimeInterval)timeIntervalForIndex:(NSInteger)index { - WVSSAddress *address = [self.configController.addresses objectAtIndex:index]; - if (address) { - return (NSTimeInterval)address.duration; - } else { - return kOneMinute; - } + WVSSAddress *address = [_playlist objectAtIndex:index]; + if (address) { + return (NSTimeInterval)address.duration; + } else { + return kOneMinute; + } } - (void)animateOneFrame { - [super animateOneFrame]; + [super animateOneFrame]; } #pragma mark Focus Overrides @@ -236,75 +233,74 @@ - (void)animateOneFrame { // the webview from getting any keyboard focus. - (NSView *)hitTest:(NSPoint)aPoint { - return self; + return self; } - (void)keyDown:(NSEvent *)theEvent { - return; + return; } - (void)keyUp:(NSEvent *)theEvent { - return; + return; } - (BOOL)acceptsFirstResponder { - return YES; + return YES; } - (BOOL)resignFirstResponder { - return NO; + return NO; } #pragma mark WebPolicyDelegate - (void)webView:(WebView *)webView - decidePolicyForNewWindowAction:(NSDictionary *)actionInformation - request:(NSURLRequest *)request - newFrameName:(NSString *)frameName - decisionListener:(id < WebPolicyDecisionListener >)listener { - // Don't open new windows. - [listener ignore]; +decidePolicyForNewWindowAction:(NSDictionary *)actionInformation + request:(NSURLRequest *)request + newFrameName:(NSString *)frameName +decisionListener:(id < WebPolicyDecisionListener >)listener { + // Don't open new windows. + [listener ignore]; } - (void)webView:(WebView *)webView didFinishLoadForFrame:(WebFrame *)frame { - [webView resignFirstResponder]; - [[[webView mainFrame] frameView] setAllowsScrolling:NO]; - //[webView setDrawsBackground:YES]; + [webView resignFirstResponder]; + [[[webView mainFrame] frameView] setAllowsScrolling:NO]; + //[webView setDrawsBackground:YES]; } - (void)webView:(WebView *)webView unableToImplementPolicyWithError:(NSError *)error frame:(WebFrame *)frame { - NSLog(@"unableToImplement: %@", error); + NSLog(@"unableToImplement: %@", error); } #pragma mark WebUIDelegate - (NSResponder *)webViewFirstResponder:(WebView *)sender { - return self; + return self; } - (void)webViewClose:(WebView *)sender { - return; + return; } - (BOOL)webViewIsResizable:(WebView *)sender { - return NO; + return NO; } - (BOOL)webViewIsStatusBarVisible:(WebView *)sender { - return NO; + return NO; } - (void)webViewRunModal:(WebView *)sender { - return; + return; } - (void)webViewShow:(WebView *)sender { - return; + return; } - (void)webViewUnfocus:(WebView *)sender { - return; + return; } - @end