From 96078546746c9829479404ab2a47c20d1173102b Mon Sep 17 00:00:00 2001 From: Sergey P Date: Sun, 3 Sep 2017 22:34:55 +0300 Subject: [PATCH 1/5] Added random checkbox. --- WebViewScreenSaver/ConfigureSheet.xib | 1315 +++-------------- WebViewScreenSaver/WVSSConfig.h | 1 + WebViewScreenSaver/WVSSConfig.m | 47 +- WebViewScreenSaver/WVSSConfigController.h | 2 + WebViewScreenSaver/WVSSConfigController.m | 7 +- .../contents.xcworkspacedata | 7 + .../UserInterfaceState.xcuserstate | Bin 0 -> 17157 bytes .../xcschemes/xcschememanagement.plist | 24 + 8 files changed, 290 insertions(+), 1113 deletions(-) create mode 100644 WebViewScreenSaver/WebViewScreenSaver.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 WebViewScreenSaver/WebViewScreenSaver.xcodeproj/project.xcworkspace/xcuserdata/serj.xcuserdatad/UserInterfaceState.xcuserstate create mode 100644 WebViewScreenSaver/WebViewScreenSaver.xcodeproj/xcuserdata/serj.xcuserdatad/xcschemes/xcschememanagement.plist diff --git a/WebViewScreenSaver/ConfigureSheet.xib b/WebViewScreenSaver/ConfigureSheet.xib index afcd054..0b5e2bc 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..f904a4c 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 randomizeURL; - (instancetype)initWithUserDefaults:(NSUserDefaults *)userDefaults; - (void)synchronize; diff --git a/WebViewScreenSaver/WVSSConfig.m b/WebViewScreenSaver/WVSSConfig.m index e57c91f..8946668 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 kScreenSaverRadnomizeURL = @"kScreenSaverRadnomizeURL"; @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.randomizeURL = [userDefaults boolForKey:kScreenSaverRadnomizeURL]; + + //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.randomizeURL forKey:kScreenSaverRadnomizeURL]; + + 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..a6eeab2 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 *randomCheckbox; - (instancetype)initWithUserDefaults:(NSUserDefaults *)userDefaults; - (void)synchronize; @@ -47,6 +48,7 @@ - (IBAction)dismissConfigSheet:(id)sender; - (IBAction)toggleFetchingURLs:(id)sender; +- (IBAction)toggleRandom:(id)sender; - (IBAction)tableViewCellDidEdit:(id)sender; - (void)fetchAddresses; diff --git a/WebViewScreenSaver/WVSSConfigController.m b/WebViewScreenSaver/WVSSConfigController.m index 19122b0..b0673e2 100644 --- a/WebViewScreenSaver/WVSSConfigController.m +++ b/WebViewScreenSaver/WVSSConfigController.m @@ -167,6 +167,7 @@ - (NSWindow *)configureSheet { [self.fetchURLCheckbox setIntegerValue:self.config.shouldFetchAddressList]; [self.urlsURLField setEnabled:self.config.shouldFetchAddressList]; + self.randomCheckbox.integerValue = self.config.randomizeURL; } return self.sheet; } @@ -257,7 +258,7 @@ - (BOOL)tableView:(NSTableView *)aTableView return YES; } -#pragma mark - +#pragma mark - Actions - (IBAction)tableViewCellDidEdit:(NSTextField *)textField { NSInteger col = [self.urlTable columnForView:textField]; @@ -283,5 +284,9 @@ - (IBAction)toggleFetchingURLs:(id)sender { [self.urlsURLField setEnabled:self.config.shouldFetchAddressList]; } +- (void)toggleRandom:(id)sender { + self.config.randomizeURL = ! self.config.randomizeURL; + self.randomCheckbox.integerValue = self.config.randomizeURL; +} @end 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 0000000000000000000000000000000000000000..4e910399327949db1b4b6ff69d96045d334e958c GIT binary patch literal 17157 zcmch8d0>-8^Z)MiJllpINqQztuOw~Sq&b?TZORQjrE=49l*5v?p@beONlGb*?1LbP z+#n*NFSHz9c;ShP;C&(#@D@<8YLLs`LA*Go9YL*=~4UmFf4i#v**( z_IqRS?I;{cP#lU!2`C%skpbl(BQhZ~vY=d4f=W>tDo0nK5vT%PiAJJPXfzsws?bC< z71g3TRF7O}7HUF%)P_3H)#y639IZgtqb{@)?LxcJ9&|gp1Ko-4LU*IR=pJ-GdKf){ z4x(q#tLQa!7`=hsMDL&v(Z}cubQXPyzC}Nx^XNAmiKB2dmSP!};~1>KN}Pt%aW1xE z8@A&-oR15z0}sZ-aS^@(kH(d_8c)SD@hseeJ-8ju#}xDUX1o>Og16yY@oo4&cst&K zJ8>7j1K)}7!}sII@e}w-d;mX;4%Wri`snGs9{Q^`zb+)NuY zk7;M-GuJTJGS@RJnH!k(%m!v7a}%?LxtZC@+{Sb=UCdtQe&!kGS>_0Hl<8)UF~^y= zn75gam@~}B%qPqj%-760=1&%}m}OX&*%537dnG%P9mP&ztJ$gSG`T6Q_R zn%%%|Wp81(u{+sa>~8iR_EGi#`z-q+`zm{cJ<6V7-(gR(AF`jYU$DQkf3O$WKRLu< zj^S7?nv-&AoR-VrvN=6x;>?_lvvUrvkSpOzxiYSto4{3aRoqO@$<=aooQG@W=5k){ z8g4O1xmDb1ZVk7VyNSDn+s56_-OWAB?dJ|~hq>3eW89nEN8G2}XWVz(Pu#C0fxgat&EbDB;NxvWl!GYsgx16WKvJNf+5kc9Gp=54oQ_K=zRb$pP{dIY%B*X0`h1-z8c8Wb*-j)!F_hzR3f0ueGi~{f!lEKaiP=_Ol4s5@wdR?N%WYP( z!;$Z>6%KHemKK)P$m1(Y%O-ogjlNcAovYMS*VgQ6@drmvL}@5%4^ki{Nj8af4 zB{YnNQwi-yBWUCvl#bL$11u;}CeqO;8qMQm;3kYJ=ya;PN+9oUsrR&(d!5a$8u`%P z<5f9pOFS)pucxWW<*n&oY|V3&mY11rCHV#B{QP38xwx=&fVsT9ys*U4KQBMOB)>+k z0Rm&a^)9cgKE!t)I=&jYsrMk_@E6CK*y5hs=BlWNdAeu0VO)7SbT6v&gI&8k#Tt2% zKrk?kDvzhB*6FSAO>+C(wM{T1<;6BHb#DxoOCbe~uNxjfEz~(TiZPtSRixvgN zYefT4*6qlK>?jZAqXOhWg{VK3QW=%g7#d6CXgp209SsE04n{-JP&5pFE24=YTP01R zS=0r;HB()UJh8~<11s)q@t4)R{T{Dxl(WOr=C6^d^{oalEqx&0kQUYD~HJcNIe+tn_T3y~7q{vzx?BuZUAcSFl%C1 z!o){A8(Q4{wtCmNjNvPkNcgWCHK5tZjpj@hw_yvY_Z0D0mv8!*%2GFIl&8h%?dXJF zjZ?-{jtw}`AP>!`^)EblfrkvL$r$cY_ZndyYQJhs<>)rQ6SS?!>veW?p?PRNY6OcA zcoZ2~fEL!s<3b%Tj^2e92;&EbU4(d))rGD>ixH*SR8I|EXbGZdDb1k4kF+o4RDLMAXDVmHKN3D_BDtIt(`h1b*83U(snvfV1{1cNlr z<8uoOSR*%FwwEA?BER43u5AN3z$D!*4WPNb`;Ha_R_X5$tVB%jhRQlmE4<6@{Vv31 zP_z>~?G-KcuKBJWgLdhBCb(Lgz-nL0g<#Y}-33OgI)w33d%q5iC$x`-1^)~46%8#O zudBrAg9bqtLi9o(1{odYsdEaF@>Tkse%DA>M>o0`+}22RA8dmO&XxvOiKnf_PYXp& zeE{tPafCEAFvm)lzY9Hx9zu~#!10;C^BkD>kOaoAI$++m!M5PWn1Eun+D zq1%(_0D7t#9HuX@I&>h|uURfwlZg{XmCSb4HP(9Oi##1dPuIw0A)Z94UFZ;cCa`nG z=b-*Rhh7wR?(^scI+zaWL@%M2=}=lkHIv3vmV-NkQN~n`b9$W(UT3Sg{>Rbl=mYohu((~PNGxjH2MI92FAD&V7hM_h^GlGvEbUl+X+ui zo_1fAyJ5E9)dG53?(tT6+gikBq)5)mF)bE{`3Rl4%zQf0N2pQk@Co`9{9{OTp>^ol z5?$ys^trICf8PZr*=zlJzLTTs_Ml%nj=q9<-HX0P=g>DWx6?4UpwfW^N4Z)W{Ilg@ z^a_!q@6h+XG^P{%fEs%}cLy}+C$yhd(2}5*{7MIo3oh^Pm_=E;(I4mn`V%9JF+)ev zQFJsNL&wr_yD^7!I1K(ua6dX8FwPA4TSI3GW=Gg}W%FB|ux;xDPN>T3g6$(fmI4LbidO9a zd^u5=ZR})Mt>7HNUb15GsgO7yS(a3Pn);S<(o3j>!}B?;+tF|Kwy`zdVEwr>wC*usU@9)M;q7+_KlaO8#H87{`9Ap&L8d6B>fd}T-$BWW$w z1u2ig3=X#*V6{-ri~#~gB$RiK8T_KHvxv6Eg*{4;Q_M}>4ll z>0IiiKI*4!bRKQL6SmS?ybk>NKr|352$4;KyK7wA4Gju&Dz3F@T2y4Of7%YYX5_frj`6bebe)ImGA6 zw%TTJhEsddlg9!5Qr9eJTa!O9usEu^=hZmjbFj`We(=X$mk)js-66QLAfF*Xr--gn`>0)e~f!X5Y?dNtKmjdr?Qf~^nW zhf!=7-iIH=579;R8oIa(KLV0|j8c&8E@34NeTEBoaoEjZodUmxpd?^**qwd*_867F zzQ4ldX?FR&fCM0b#ZTcwJMclu(``Yfp24p`V2Pi_&*A6s3;0F+5`LL3q1V!-bQ!&l zE~hK@;8*c$_%MDQAHhd)H@%*&q#NiCx|w#;E~=XjHqTY+^g9J)Gfm_vz%6X7qCk#H zu&aF+M1U57Cnu22@Jm6Pe3`c7U|ZRISYII(b}=}Z7Hk7B0aRMsYMb13J)t>7 zlIA+IXpn+aejk5`Vt3+`_!K^kKcF|zRdh97vlD-W&%h4&gs!FQK!BRybvHxc z5FDY(-R$!Doz1NPZ2!{KW9Ca{1Ka>S?hU}L86({FF7WXcJ|Ea|P^Z6q6m$iBzse|j zYWlhb`H!!w7HpzzK!4k!>V*Srd3l0?Jb}N#-@;OUhrh=^;2-f%_-7=*sUV9%cYM`F z0gZF|X9s#TgEn4#4YCS=xv{f?-(GB^x6(~?JKabVYvj41D5THAlzIemmQc(J&`gXj zL{<9@AL_!t<3I2PdLzA=ZUvQNFv9@nM;MMFQ!kD+F~9}r(@k{C-$tBrHUKG@eoRD- zT=2OUbxXvA0V3m^Zf_?ODWIHx>=R@~hXyhP9AP5e(({Um3B0;Rcy(FFDk7WtOk$@H z`W<7GD3VEHR7^5DIjz1YYXgc{?GLI7y^a2dq8j;(S+G$C=H}*3^nsnqg@5Mcmb&J- znjix4=8mnLlH2a8od;gr7x3Z%50rbUYs$TRL@r7vol!&V388XuMT6SV$!G+jT&_v{ zGK0yik?TROeb)G*ko#`nPDUq?`#<-;%IxMT8b5 zVEm6U1`ux!I?0$Am5_L=g(wI>w8iUc0@FUvMG@UeZxg4G%UCClsRY?~GPwdK27|}g z!Qe4@bT{1wnspIk*zyJhazJ)#2xKsY%s`aY$@B;Ne>?5yWCk&V=^gY=s+$q;8Nn!2 zJ1p%#pZAy&ridvOz9|Nie-~ZY$&@kW^lthz)m0Y>u(AcBuwd6KnK6I0{>)g=wefT> z=-NT55gD#R)jODp^qvryV5TrL|J_0}wM-pT&$#eWrU5MUy>uUak{$pH{Zt70Fmo8s zTh&~$fHOx}xI&hE7GWzfiW;uOC@UO8gz5PIqkh=L> z6A+Z-DrSv9W;K0m2eX#$r@E=`UMa*uJ(|@5@}C7Ud2yS&338Nznu(~R1Qw;ikQJWuZncrO(+|8SW-AteO|FLiXcD8@p(0fm83h4h6qR{^%sLpnJh{8@zxTxy| zd4dzM_Ez;eqerN zexfJn8}v>37JZw(vzs~3{KEXo{KotaCkXG-_vrid6g>@AK{s`($J1O6$OiJ(B>=2l z-fBm!c9 ze|p(3HkOSO@e}=mekj5nk(3g^3!B8M*kt+<{e*rN0x!%{Y&sx@GxXyCJP}iH3uxwSy6obg_RgUzxj8s%MM|SQPxg&C_9WD z&KA+{==byo`r}Tvge_&u*mC+4{heN*e^T9)QLb5mqmOFHLCg;PHdPGE#FS|QV3$yE z7YYu8dN7)uAPh5x9m|em$J3wbdHM_ebteJ<$WBC=py7%1H;8g!gC@a zeCnIvY!@>zHF8zo)}E-VCylJ`(L+3z_f}O)-)RUxOo8j1nZDBn; zh68jqgeq7s+txds01MDgzvCgp2APLteKHU1LiU^dGxcpQ0=t&QyFK4aa)ZsBo19!F43H7u|Q6f=gqXZ9KP zR(5-zuXeDVJdWaVwBQ$nJX$dN7xD!e!>1n%e0`kV!`{x`fg;&E(Mk4hb}zsYugBvT zwMs|~j0q&;6%B!Gg*dk0GhFliVvDj>3=c19;<17v9?N*FdV{@}y${B?pM8Mc2jkqy zJ`4x-kD!rLpnjvN-s@_a)arzP{nP3M(k*`Rgg_mPCH@YAPxE-)!32jemV(DgJeK!1 zZ;!G2Mf1kvL>|ZVHgJ##=wc7DhuEii9LwW49><4loEV^q@mSEDT^cB{uL;JChiv8F zMM^<56^M<*D5#Gx*f&5N55wuiNi>qjN?{U76w>m5+u3&o3vxF|kZucrd-fE2T0Eu+ z#hZN&IQyB`=pcoSfDN(S^ZmAaWbF6WRMaL;)7Wi z_AL87;3)P>_AB;l_8j{S`z;HbFO|n>JWl7an#UR*Yk8cp2W7H9vOlpuv*+1g*k38E zawd=cJZ|UlG9K^dAyEZ(A-)(CyRlX9$iBe&IbdAKx~X~+W1@ZrvNAq6VSo_HH(fkt zudJKx5+HZH_&A}h1+10d4S`GGz|AW7<`PdcpfwGN!(u2uUiWzs2iD0Y1Lyzs^I8Fkn2||~HTsVX*U-4Mi#r5MNxJVvn@%RcJvaT>m zeINhSmz)Jo-Ccfw_Rc0xLy)eFOB8b7-CPV8%f)f=TmtRlaW;<)JT~&!%;VhMoPtww zNt}vH=2CcU<8c9x`}24(kB9TP1cIlFK917}K90xw8u^_6l25)gya(r&3+GIw;8>tY zzy(L`y%@+68OW)TSN^vc2p#WRX7?V+D2`v$#a}L)C1e5qZ|17NOsw!;2G1~#|^>$r_V^5+n@fqu>75uMy7?nWM8 z$>YktW@D?UVHGuU|Nl&{1+yWTV@p%3*E1(qICdEAYH15ZBx3OzcPrNkBDf@!=DN6@ z%xfHY5^%z!=wTj@?Ez`r9pJab5H~pGz1;nOjc>UJxP8nAJRZ&CF+zkJ?D`1zXdfuZ zJYxzL08#E^9!?CmO)aW!Gy6uG=Tav%z)jU&_V2O77Dm~UdfsOJC(zUfB=%9(+m$B%g+P<6KD@0 zLo$#I+Ro!S0RT#dkfBgM(^Fq2)ZxIJVW<&u+VCLuFB1C;1w_RaB|UIwY!BUw-1TTD zDI?{57q^0p6c!h3lxGJS#p6~%1Tt5zLWzn}v0jgiBjbU!xgu-BNM)zM3q;34d7n^S zROM-OwTy8$1p?#IPH$tV=73Bhllu-kl}v~8dji_pwu8*z@jR&S1N1B$`-z7)mpy3- z&Z3qyqS)I>9jPZSGK(~j*~Cre@OVCtJ9xZ+#|wFUHIEnZ_!=HBzMV9|3AT=SNGq93 zya?bjg}@#*0MFwkJieC4OW|2l?RR<`T>i?^kyG8iGAPOsYe*Bt*J9?W!Z+CsCk-wi zpxF4{4Z&j-;9Gnhh|>H};sLp!&`Xg>xwF~b)B!2k-UNiu9n>jM>(%>xg%4H{&VT%_ zY0b_$k8i%sYO&dCR%-jS;UQK4mqP9Z0n|EN~akj_jpESR}qsEax?yAww zx?+!~5%QQeyD69nBiEAUV5!JbvW#5EWB7kLk5_b&736vX?(cdY@8a<$K^?5HGJQdP zPXGWBL1kNWGaQGCi&p7s5bBr&gn!8=V_O4tXhIJ4uhgpC{w6WsLDr$_U1UAkKsJ(1 z1binjvYyBA%gsE#HIx(}TgWzn^_$67atn`d;PEORukIqZlH16Cc)W(kYk9m*U_I-S z!TN9thp!Mc`(Z7N|JE>J0;vVKN}<*<2oB@^ zzBGs2PVT~i1lCy$dSc)Xd%H}QB2 zz?tE4k-&t3|IE+R1pM(OVrI^h7s*TXT^?`c@hw!>GqY~;8j2)`$?L+YTs_2HV`CU+ zZSVpMW>}7d4I2D^ySTD9Tq2XJl2bBuMq7SiPsx41h{&jDX{fNUr^LQ*eIWx??re2s zTV0*Y1%+P6VqzoW5|b`dpx+svKsib}6+#r=k4E;?>p@SbMD=)&r>3Pxs5RP*e=P=# zmJ1d4pw^cb0~ULl>btYD^@hupAqNWt^*J!3p7LXpIl_`_1s*2Ph73B)EWk^pQ2t+R zMRJx#06BYJkjYMa4m=k)pkt^Iq@%Myc-emdDB7i!dz}LzQoPK2F!^IDp*mFXOX4M> zqeF&P38^oNkp#uS1%nK@GGvDu_%cY(OhD7%a*zkjMLxI|v=}Z0t$_;QZRj?%9WDm# zf=fYnp!=W_^bk~I9)$|X56~I(3Hl6U90r$tR9J&Eu^F!T48|3B6o$$yJQ2@;%RMga z#cg;2)EsTVd+=j$edmyXR;bbqqCvoQ0?0 z7CAxQ14IRu<4y7wxrMw#K#jqE+{R-t9IJT@9&X2Oaw}U#PLb1)Z!QCKLND;RlgB$D z?R-HnD%yXx6=J&XUpfI#;1+~@)IZn}p;J$d^1t*H%1{D5yUFLU3%?*|1)Ucv4g#^` zJX!0LJnj-*_gCa=Q7EoX@)c^ls>)OE>`*)XYP)@4UY`655mnZi{4!&p)B+ zJ0Niq$0cyF5aGlV1td{62D4d4cGL%31g z7;YTgHk!yy=Bl}A+zhUX+shp#2$0}VxC`WkJ3s5dk8C2F!CP!4+rTw!hkHKz$V222 z@)%geC*iKoA@U4)4{rAS7G?|^8rB>}!`6hY3tJy{XV@cQ`@^0Hdn)Wu*fU{ohMf-k zIPBA~&%@4!oe%pX?9Xr<9u_VMj|h(nSB0CyE#ZaX!^200SA{#nXN7yhuMX$KuMJ-o zzA}7O_?qx_;WvkOhTk9lX!ybKm%>kle-i$E_^;u=hhLB&Nw}n+BvKMBkxA^5a*10q zPqJFFR5}Z1JRvzCIVgEr@~q@}$%~SgC9g^jOO8mo zCBO7b?>DkveZTqrI{O{%_gRD_LK86|Vp_!Ph&d6yh~*J$B03}XM(mGxCgMm$cf|3C zHzH0&d>(N&;zDG2WKyI$(h%v0927Yua#&<(WO?L>$SWhqN7hHSMP41bEOJ%kjgea- zw?=M@ygzb(R}>$$IciH(XVku^ z15qzTy%hCI)bXfOQD>sgMV*iOHR|_h5*;2biB5>tMrTH6MeCz;qD|43=t0p#qK8En zMVCaEMPCtJ5j`_{Y4pD6?&uGqzn3B@D7O7R5CoPZ`N=HenrL&~7 zrE{cB(iUl})GJ*q<)zn3mr0jPub18+T`gTB-7S4k`lR$Z>Fd%X()XpOr5{Q^mVPSz zT>6vrXX$zAud*0fnoJ|hkY&mAvK(2VY@lqgY?!P_Rw5fGtCUTYO_5ENO_#Z4O|ll* zT$xYSCR-=FRkmH$DcdF6BfCTPfb22ZkQe!KiG`Cj=!`P=euRiycF|F%;A_LG2Jn5#+->c8}n7nxtMQb&d2;3^LxyNSQKlDEsdQX z>x!KnJ14d&wj*{$?8?|xv1?-2#cqh*6uUWgSL~kHJ7VvO-5Yyv?ESI(VjqfqI`(kv z=dpjpCB+rSmBiJ=HN~~Xwa0bDEsR?fcU|0yxRr6M;?~5ii@PhXJMMJ6Bt9lSIbIh( zFn)CW^mtGF4e_hv*T%1p-xz;m{0s3%;@^yaJO17H_v25+e;NOC{2%duCg21%AtfO# zAv>WwVPwLbg!Y7vgoO!<5>_UxN?4PyE@4-~Jqh~~4ko;s@J7O03GXDlmpC}FEOA=m z%*1(#ixclmyf^Wk#LpG6igZP`B2Q7EC{zqk6e~t3Mk^*Msuj}|GZga_*D6*hRw`C0 z)+;tDZdBZ)*rm8r@rdFH#R0`Z#dC@m6fY@WQJheGsQ6rQR`HeMoZ=_NdBv}a-xU{> z;mQbQlv1ipR^}*8N{iB}v@7$K4rPDk70L?bNabkdSmk(SrE;Qjva(*;tn?`7Dt*c} zlqzp|NmQs{5CS`2OxRePg z(^6)qw57DCbfhdyS(LIkg-==6wUi%HrKy_KoYVoS z#i?bfSEN>?j!d1BTAeyIb$Y5RbwTRYsn?{^)Fr7)Q&*>MO5L2gC3S1+w$wXP?@Ha9 zdT;8psYg?frJhKAGxhD%Pf|Zi{UY_tG@K?)lc&X|#izBVElRsD?a8#K(hj9PllE%b z>uE>Rj-`E>_DedG&ZUQ?OVT6KQZ&Nx z^;_z9)$glMt3OhIto~a4z4|BhFY4bk5>2#5risxcYLYZ5nlz1GW77=PlxWH{S7=6Q z#%d;Lsx-4S9u3vpsJU13vgS3->zZ!O3C-75n8i$fOe2}sJ2L3s;$;e*VbsA z+B&UE+oEmL&etx~UZbVj)!Mb%_1cZv?b=T5PVH{(KJCNWN45L4uWR4ap46V!eyIIT zdm#g5uo)ynnh}!`pOKi6o>7r8CS!gEpRp(7?u_n?cQa0AoX+?#<6OptOq|JOhG#}( zMrX=1<1)3GnVH#{Ihp26Yi3@iBeQ?z*vzKPj?8tL&t#s+{3i1c9j6P^Npz9ASY3in zsY}+S>PF}$>S}fMx(3}GU9+xL=hIQ$wYuwc*Xvg4*6KFsHtBZgx^%mAw`V0}X|po3 zva$?Wi?dc`t;t%KwK41aY?RGpbJ^k9?(BKl^RpLZFUmfaeLDN|?6cWlWuMFbHv8A? zKlDh?=!rgDFW0N|nR=UkpnkA^sD8Mf$qi@$!{Sy6B{dM{k z`t|xv`kVAO>$mA|)9=yWuYX+sqW-AL%yNVFwijAFw`*IP+_Pv%rv+SjfQ4}$1vBhz_7?b4NDBm49gAc47VEg z7#=h{W_a9i!0?RWdBaPFR}60%-Z8vqIF&Ogr!J={rzNK~$D8BNS(HO_uFYANvm$3@ z&c>Y0Ia_kJ=IqJ2C+EJL2XY?Fc|7Mp&Y_%Va-PfS&N-HIJm-y^k8;lBe4O)X&JRXx zWR1iaZtQ1_G)5a$#uQ_^QESv0vyBF$(KygpVk|d~FkWe#Y@A}OHcm6nHqJHrjBUnt zV~25xahY+2aiwv!ajkKS@fPE4#_h(tjE@?hG9EHMV|>o|s_}JWxAC~~4dX|~GscgN zpBjHK{%HKkc-}-zv8H%aqDg5|nNmz?CZox0vYPTt4pV>AK+|B;NK=)m+BDr%V{)3B zOdX~LriG?Orj@4Ergf%`rp=};rd_5zraMe`o0H9YbD?>ld5C$qxx`#PcvU- zcAD$W4dyxKW^=3AYhGpEV!q4#nE6%nN%NQHAI(3Rf3YwYnI+MZV$oT$ECx%3Ws+sG zWr}60rNJ`C(rjt9_$+Of<(74p^_ESRTP>ZIgO=AUhb^yLj#^GyKCqmzd}{f^@}=e1 zTv={Pt~uA5o0sdz9gsUXcUW$5ZdvZ6-0IwExifNS=GNuT%5~>9<~HZH=Pt>;CHH~c z7joar{lOY-O|lNPmRZZK6RovYx3$UYv3ji?)~l_HtxK#+t&do{t!J%2SpT#!He!?5 zB5hKe+?Hy~v}N0JY-U@&t + + + + SuppressBuildableAutocreation + + 641457061AEDC92100FB6CDF + + primary + + + 641457181AEDC92200FB6CDF + + primary + + + 8D255AC50486D3F9007BF209 + + primary + + + + + From 6eef7e82ee2f43cb7fdd304cd65588add6ca30d5 Mon Sep 17 00:00:00 2001 From: Sergey P Date: Sun, 3 Sep 2017 23:00:25 +0300 Subject: [PATCH 2/5] Format the code. --- WebViewScreenSaver/WebViewScreenSaverView.m | 296 ++++++++++---------- 1 file changed, 148 insertions(+), 148 deletions(-) diff --git a/WebViewScreenSaver/WebViewScreenSaverView.m b/WebViewScreenSaver/WebViewScreenSaverView.m index 633a996..4b0cd81 100644 --- a/WebViewScreenSaver/WebViewScreenSaverView.m +++ b/WebViewScreenSaver/WebViewScreenSaverView.m @@ -29,11 +29,11 @@ @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. @@ -44,52 +44,52 @@ - (NSTimeInterval)timeIntervalForIndex:(NSInteger)index; @implementation WebViewScreenSaverView { - NSTimer *_timer; - WebView *_webView; - NSInteger _currentIndex; - BOOL _isPreview; + NSTimer *_timer; + WebView *_webView; + NSInteger _currentIndex; + BOOL _isPreview; } + (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 { @@ -97,137 +97,137 @@ - (BOOL)hasConfigureSheet { //} - (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]; + + //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]; + } } - (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; } #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 ([[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]; } - (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 == [[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; } - (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; + return self.configController.addresses; } - (NSString *)urlForIndex:(NSInteger)index { - WVSSAddress *address = [self.configController.addresses objectAtIndex:index]; - return address.url; + WVSSAddress *address = [self.configController.addresses 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 = [self.configController.addresses objectAtIndex:index]; + if (address) { + return (NSTimeInterval)address.duration; + } else { + return kOneMinute; + } } - (void)animateOneFrame { - [super animateOneFrame]; + [super animateOneFrame]; } #pragma mark Focus Overrides @@ -236,74 +236,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; } From fb4e472a1da6c90162f01adf2e399285fbf8a875 Mon Sep 17 00:00:00 2001 From: Sergey P Date: Tue, 5 Sep 2017 17:56:08 +0300 Subject: [PATCH 3/5] Added gitignor --- .gitignore | 63 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 63 insertions(+) create mode 100644 .gitignore 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 + From 7a57629dd4b5908eb47025f1b8e34c1f00ec8ac1 Mon Sep 17 00:00:00 2001 From: Sergey P Date: Tue, 5 Sep 2017 19:03:58 +0300 Subject: [PATCH 4/5] Rename rnd to shuffle. --- WebViewScreenSaver/ConfigureSheet.xib | 8 ++--- WebViewScreenSaver/WVSSConfig.h | 2 +- WebViewScreenSaver/WVSSConfig.m | 6 ++-- WebViewScreenSaver/WVSSConfigController.h | 4 +-- WebViewScreenSaver/WVSSConfigController.m | 22 +++++++++--- .../project.pbxproj | 3 +- .../UserInterfaceState.xcuserstate | Bin 17157 -> 23645 bytes WebViewScreenSaver/WebViewScreenSaverView.m | 32 ++++++++---------- 8 files changed, 44 insertions(+), 33 deletions(-) diff --git a/WebViewScreenSaver/ConfigureSheet.xib b/WebViewScreenSaver/ConfigureSheet.xib index 0b5e2bc..81597d6 100644 --- a/WebViewScreenSaver/ConfigureSheet.xib +++ b/WebViewScreenSaver/ConfigureSheet.xib @@ -9,15 +9,15 @@ - + - + @@ -196,12 +196,12 @@ diff --git a/WebViewScreenSaver/WVSSConfig.h b/WebViewScreenSaver/WVSSConfig.h index f904a4c..6d7f61b 100644 --- a/WebViewScreenSaver/WVSSConfig.h +++ b/WebViewScreenSaver/WVSSConfig.h @@ -28,7 +28,7 @@ @property(nonatomic, strong, readonly) NSMutableArray *addresses; @property(nonatomic, strong) NSString *addressListURL; @property(nonatomic, assign) BOOL shouldFetchAddressList; -@property(nonatomic, assign) BOOL randomizeURL; +@property(nonatomic, assign) BOOL shufflePlaylist; - (instancetype)initWithUserDefaults:(NSUserDefaults *)userDefaults; - (void)synchronize; diff --git a/WebViewScreenSaver/WVSSConfig.m b/WebViewScreenSaver/WVSSConfig.m index 8946668..fc24894 100644 --- a/WebViewScreenSaver/WVSSConfig.m +++ b/WebViewScreenSaver/WVSSConfig.m @@ -26,7 +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 kScreenSaverRadnomizeURL = @"kScreenSaverRadnomizeURL"; +static NSString * const kScreenSaverShufflePlaylist = @"kScreenSaverShufflePlaylist"; @interface WVSSConfig () @@ -44,7 +44,7 @@ - (instancetype)initWithUserDefaults:(NSUserDefaults *)userDefaults { self.addresses = [self loadAddressesFromUserDefaults:userDefaults]; self.addressListURL = [userDefaults stringForKey:kScreenSaverURLsURLKey]; self.shouldFetchAddressList = [userDefaults boolForKey:kScreenSaverFetchURLsKey]; - self.randomizeURL = [userDefaults boolForKey:kScreenSaverRadnomizeURL]; + self.shufflePlaylist = [userDefaults boolForKey:kScreenSaverShufflePlaylist]; //NSLog(@"Loaded Addresses: %@", self.addresses); @@ -83,7 +83,7 @@ - (void)saveAddressesToUserDefaults:(NSUserDefaults *)userDefaults { - (void)synchronize { [self saveAddressesToUserDefaults:self.userDefaults]; [self.userDefaults setBool:self.shouldFetchAddressList forKey:kScreenSaverFetchURLsKey]; - [self.userDefaults setBool:self.randomizeURL forKey:kScreenSaverRadnomizeURL]; + [self.userDefaults setBool:self.shufflePlaylist forKey:kScreenSaverShufflePlaylist]; if (self.addressListURL.length) { [self.userDefaults setObject:self.addressListURL forKey:kScreenSaverURLsURLKey]; diff --git a/WebViewScreenSaver/WVSSConfigController.h b/WebViewScreenSaver/WVSSConfigController.h index a6eeab2..5219bcc 100644 --- a/WebViewScreenSaver/WVSSConfigController.h +++ b/WebViewScreenSaver/WVSSConfigController.h @@ -34,7 +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 *randomCheckbox; +@property(nonatomic, weak) IBOutlet NSButton *shuffleCheckbox; - (instancetype)initWithUserDefaults:(NSUserDefaults *)userDefaults; - (void)synchronize; @@ -48,7 +48,7 @@ - (IBAction)dismissConfigSheet:(id)sender; - (IBAction)toggleFetchingURLs:(id)sender; -- (IBAction)toggleRandom:(id)sender; +- (IBAction)toggleShuffle:(id)sender; - (IBAction)tableViewCellDidEdit:(id)sender; - (void)fetchAddresses; diff --git a/WebViewScreenSaver/WVSSConfigController.m b/WebViewScreenSaver/WVSSConfigController.m index b0673e2..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,7 +181,7 @@ - (NSWindow *)configureSheet { [self.fetchURLCheckbox setIntegerValue:self.config.shouldFetchAddressList]; [self.urlsURLField setEnabled:self.config.shouldFetchAddressList]; - self.randomCheckbox.integerValue = self.config.randomizeURL; + self.shuffleCheckbox.integerValue = self.config.shufflePlaylist; } return self.sheet; } @@ -284,9 +298,9 @@ - (IBAction)toggleFetchingURLs:(id)sender { [self.urlsURLField setEnabled:self.config.shouldFetchAddressList]; } -- (void)toggleRandom:(id)sender { - self.config.randomizeURL = ! self.config.randomizeURL; - self.randomCheckbox.integerValue = self.config.randomizeURL; +- (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/xcuserdata/serj.xcuserdatad/UserInterfaceState.xcuserstate b/WebViewScreenSaver/WebViewScreenSaver.xcodeproj/project.xcworkspace/xcuserdata/serj.xcuserdatad/UserInterfaceState.xcuserstate index 4e910399327949db1b4b6ff69d96045d334e958c..ce457dabecb7396913f1ff0b785627a16b20a271 100644 GIT binary patch literal 23645 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 + // 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 @@ -48,6 +51,7 @@ @implementation WebViewScreenSaverView { WebView *_webView; NSInteger _currentIndex; BOOL _isPreview; + NSArray *_playlist; } + (BOOL)performGammaFade { @@ -92,10 +96,6 @@ - (BOOL)hasConfigureSheet { return YES; } -//- (void)setFrame:(NSRect)frameRect { -// [super setFrame:frameRect]; -//} - - (NSWindow *)configureSheet { return [self.configController configureSheet]; } @@ -115,7 +115,8 @@ - (void)configController:(WVSSConfigController *)configController dismissConfigS - (void)startAnimation { [super startAnimation]; - //NSLog(@"startAnimation: %d %@", [NSThread isMainThread], [NSThread currentThread]); + // Get the playlist + _playlist = self.configController.addresses; // Create the webview for the screensaver. _webView = [[WebView alloc] initWithFrame:[self bounds]]; @@ -132,7 +133,7 @@ - (void)startAnimation { NSColor *color = [NSColor colorWithCalibratedWhite:0.0 alpha:1.0]; [[_webView layer] setBackgroundColor:color.CGColor]; - if (!_isPreview && _currentIndex < [[self selectedURLs] count]) { + if (!_isPreview && _currentIndex < _playlist.count) { [self loadFromStart]; } } @@ -144,6 +145,7 @@ - (void)stopAnimation { [_webView removeFromSuperview]; [_webView close]; _webView = nil; + _playlist = nil; } #pragma mark Loading URLs @@ -153,7 +155,7 @@ - (void)loadFromStart { NSString *url = [WVSSAddress defaultAddressURL]; _currentIndex = 0; - if ([[self selectedURLs] count]) { + if (_playlist.count) { duration = [self timeIntervalForIndex:_currentIndex]; url = [self urlForIndex:_currentIndex]; } @@ -173,13 +175,13 @@ - (void)loadNext:(NSTimer *)timer { NSInteger nextIndex = _currentIndex; // Last element, fetchURLs if they exist. - if (_currentIndex == [[self selectedURLs] count] - 1) { + if (_currentIndex == _playlist.count - 1) { [self.configController fetchAddresses]; } // Progress the URL counter. - if ([[self selectedURLs] count] > 0) { - nextIndex = (_currentIndex + 1) % [[self selectedURLs] count]; + if ([_playlist count] > 0) { + nextIndex = (_currentIndex + 1) % _playlist.count; duration = [self timeIntervalForIndex:nextIndex]; url = [self urlForIndex:nextIndex]; } @@ -207,18 +209,13 @@ - (void)loadURLThing:(NSString *)url { } } -- (NSArray *)selectedURLs { - return self.configController.addresses; -} - - - (NSString *)urlForIndex:(NSInteger)index { - WVSSAddress *address = [self.configController.addresses objectAtIndex:index]; + WVSSAddress *address = [_playlist objectAtIndex:index]; return address.url; } - (NSTimeInterval)timeIntervalForIndex:(NSInteger)index { - WVSSAddress *address = [self.configController.addresses objectAtIndex:index]; + WVSSAddress *address = [_playlist objectAtIndex:index]; if (address) { return (NSTimeInterval)address.duration; } else { @@ -306,5 +303,4 @@ - (void)webViewUnfocus:(WebView *)sender { return; } - @end From 8ff3d2ecab7f6e95a8bad865cb40c201add7ed83 Mon Sep 17 00:00:00 2001 From: Sergey P Date: Tue, 5 Sep 2017 19:04:25 +0300 Subject: [PATCH 5/5] Update project file --- .../UserInterfaceState.xcuserstate | Bin 23645 -> 23645 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/WebViewScreenSaver/WebViewScreenSaver.xcodeproj/project.xcworkspace/xcuserdata/serj.xcuserdatad/UserInterfaceState.xcuserstate b/WebViewScreenSaver/WebViewScreenSaver.xcodeproj/project.xcworkspace/xcuserdata/serj.xcuserdatad/UserInterfaceState.xcuserstate index ce457dabecb7396913f1ff0b785627a16b20a271..b0526c235a3355c364ead20ec2fec1dea7df7762 100644 GIT binary patch delta 46 zcmcb+gYoVT#tlm(Sef!)sWon1DWSjwV#*zzyuey?^JA$U3PA45-#<1lu->Zx0L>&6 AK>z>% delta 46 ycmcb+gYoVT#tlm(SQ&Gq(~>r?lu%#-G2?Y7FR&Kf{8(y-0*Gs!vU!2^UIhS*P!K-=