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
-
-
- NSBox
- NSButton
- NSButtonCell
- NSCustomObject
- NSScrollView
- NSScroller
- NSTableCellView
- NSTableColumn
- NSTableHeaderView
- NSTableView
- NSTextField
- NSTextFieldCell
- NSView
- NSWindowTemplate
-
-
- com.apple.InterfaceBuilder.CocoaPlugin
-
-
-
-
-
-
-
-
-
-
-
-
- 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