From 4361b69d3178d7fc98d0388f9a223af6c2651aba Mon Sep 17 00:00:00 2001 From: Zygo Blaxell Date: Wed, 5 Jul 2017 17:32:57 -0400 Subject: [PATCH] From http://www.jwz.org/xscreensaver/xscreensaver-5.37.tar.gz -rw-rw-r-- 1 zblaxell zblaxell 10598833 Jul 5 15:38 xscreensaver-5.37.tar.gz 22e438589c25a485a12ba5ae8462e38c5f5f0e07 xscreensaver-5.37.tar.gz --- Makefile.in | 18 +- OSX/Makefile | 27 +- OSX/SaverRunner.h | 1 - OSX/SaverRunner.m | 57 +- OSX/SaverRunner.plist | 10 +- OSX/Updater.plist | 10 +- OSX/XScreenSaver.plist | 4 +- OSX/XScreenSaverConfigSheet.m | 102 +- OSX/XScreenSaverGLView.h | 2 + OSX/XScreenSaverGLView.m | 31 +- OSX/XScreenSaverView.h | 11 +- OSX/XScreenSaverView.m | 375 +- OSX/bindist.rtf | 16 +- OSX/grabclient-ios.m | 169 +- OSX/grabclient-osx.m | 32 +- OSX/iSaverRunner.plist | 12 +- OSX/iSaverRunner.xib | 19 +- OSX/ios-function-table.m | 4 +- OSX/seticon.pl | 8 +- OSX/settings.png | Bin 0 -> 3680 bytes OSX/settings@2x.png | Bin 0 -> 4181 bytes OSX/settings@3x.png | Bin 0 -> 5617 bytes OSX/stop.png | Bin 0 -> 470 bytes OSX/stop@2x.png | Bin 0 -> 859 bytes OSX/stop@3x.png | Bin 0 -> 1701 bytes OSX/update-info-plist.pl | 7 +- OSX/updates.xml | 30 +- OSX/xscreensaver.xcodeproj/project.pbxproj | 255 +- README | 7 + android/Makefile | 6 +- android/README | 4 +- android/project/xscreensaver/jni/Android.mk | 5 +- .../res/layout-land/activity_xscreensaver.xml | 59 + .../res/layout/activity_xscreensaver.xml | 44 +- .../xscreensaver/XScreenSaverActivity.java | 39 +- .../xscreensaver/XScreenSaverDaydream.java | 22 +- .../xscreensaver/XScreenSaverRenderer.java | 44 +- .../xscreensaver/XScreenSaverWallpaper.java | 100 + .../src/org/jwz/xscreensaver/jwxyz.java | 180 +- config.h.in | 3 + configure | 16 +- configure.in | 7 +- driver/Makefile.in | 14 +- driver/XScreenSaver.ad.in | 9 +- driver/XScreenSaver_ad.h | 7 +- driver/dpms.c | 3 +- driver/passwd-pam.c | 9 +- driver/splash.c | 25 +- driver/subprocs.c | 4 +- driver/timers.c | 17 +- driver/xscreensaver-getimage-file | 30 +- driver/xscreensaver-text | 31 +- driver/xscreensaver.c | 6 +- driver/xscreensaver.man | 10 +- hacks/Makefile.in | 61 +- hacks/analogtv.c | 85 +- hacks/analogtv.h | 6 +- hacks/ant.c | 6 +- hacks/apollonian.c | 33 +- hacks/apple2-main.c | 6 +- hacks/asm6502.c | 9 +- hacks/blitspin.c | 20 +- hacks/bouboule.c | 61 +- hacks/braid.c | 23 +- hacks/bsod.c | 201 +- hacks/bsod.man | 5 +- hacks/bumps.c | 67 +- hacks/check-configs.pl | 82 +- hacks/config/README | 4 +- hacks/config/bsod.xml | 1 + hacks/config/flurry.xml | 2 - hacks/config/mirrorblob.xml | 1 + hacks/config/splodesic.xml | 2 +- hacks/config/strange.xml | 53 +- hacks/config/timetunnel.xml | 3 +- hacks/config/unicrud.xml | 1 + hacks/config/vigilance.xml | 30 + hacks/crystal.c | 57 +- hacks/demon.c | 47 +- hacks/discrete.c | 35 +- hacks/distort.c | 54 +- hacks/drift.c | 29 +- hacks/euler2d.c | 29 +- hacks/fadeplot.c | 29 +- hacks/fiberlamp.c | 32 +- hacks/fireworkx.c | 4 +- hacks/flag.c | 6 +- hacks/flow.c | 26 +- hacks/fontglide.c | 45 +- hacks/forest.c | 24 +- hacks/galaxy.c | 25 +- hacks/glx/Makefile.in | 48 +- hacks/glx/antinspect.c | 20 +- hacks/glx/antmaze.c | 22 +- hacks/glx/antspotlight.c | 21 +- hacks/glx/atlantis.c | 33 +- hacks/glx/atunnel.c | 24 +- hacks/glx/b_lockglue.c | 30 +- hacks/glx/blinkbox.c | 6 +- hacks/glx/blocktube.c | 40 +- hacks/glx/boing.c | 25 +- hacks/glx/bouncingcow.c | 9 +- hacks/glx/boxed.c | 51 +- hacks/glx/cage.c | 30 +- hacks/glx/carousel.c | 6 +- hacks/glx/circuit.c | 13 +- hacks/glx/cityflow.c | 20 +- hacks/glx/companion.c | 9 +- hacks/glx/crackberg.c | 34 +- hacks/glx/cube21.c | 26 +- hacks/glx/cubenetic.c | 9 +- hacks/glx/cubestack.c | 9 +- hacks/glx/cubestorm.c | 9 +- hacks/glx/cubetwist.c | 23 +- hacks/glx/cubicgrid.c | 26 +- hacks/glx/dangerball.c | 12 +- hacks/glx/discoball.c | 17 +- hacks/glx/dnalogo.c | 9 +- hacks/glx/dymaxionmap.c | 37 +- hacks/glx/endgame.c | 17 +- hacks/glx/energystream.c | 29 +- hacks/glx/engine.c | 19 +- hacks/glx/extrusion.c | 8 +- hacks/glx/flipflop.c | 35 +- hacks/glx/flipscreen3d.c | 18 +- hacks/glx/fliptext.c | 69 +- hacks/glx/flurry-smoke.c | 1 - hacks/glx/flurry.c | 77 +- hacks/glx/flurry.h | 7 +- hacks/glx/flyingtoasters.c | 9 +- hacks/glx/gears.c | 9 +- hacks/glx/geodesic.c | 9 +- hacks/glx/geodesicgears.c | 21 +- hacks/glx/gflux.c | 19 +- hacks/glx/glblur.c | 9 +- hacks/glx/glcells.c | 41 +- hacks/glx/gleidescope.c | 51 +- hacks/glx/glforestfire.c | 9 +- hacks/glx/glhanoi.c | 52 +- hacks/glx/glknots.c | 9 +- hacks/glx/glmatrix.c | 9 +- hacks/glx/glplanet.c | 50 +- hacks/glx/glschool.c | 8 +- hacks/glx/glslideshow.c | 6 +- hacks/glx/glsnake.c | 8 +- hacks/glx/gltext.c | 31 +- hacks/glx/gltrackball.c | 52 +- hacks/glx/gltrackball.h | 7 +- hacks/glx/grab-ximage.c | 54 +- hacks/glx/hexstrut.c | 29 +- hacks/glx/hilbert.c | 9 +- hacks/glx/hydrostat.c | 18 +- hacks/glx/hypertorus.c | 38 +- hacks/glx/hypnowheel.c | 9 +- hacks/glx/jigglypuff.c | 9 +- hacks/glx/jigsaw.c | 11 +- hacks/glx/juggler3d.c | 51 +- hacks/glx/kaleidocycle.c | 9 +- hacks/glx/klein.c | 267 +- hacks/glx/lament.c | 11 +- hacks/glx/lavalite.c | 32 +- hacks/glx/lockward.c | 45 +- hacks/glx/menger.c | 9 +- hacks/glx/mirrorblob.c | 45 +- hacks/glx/moebius.c | 22 +- hacks/glx/moebiusgears.c | 9 +- hacks/glx/molecule.c | 9 +- hacks/glx/morph3d.c | 19 +- hacks/glx/noof.c | 9 +- hacks/glx/photopile.c | 6 +- hacks/glx/photopile.man | 2 +- hacks/glx/pinion.c | 9 +- hacks/glx/pipes.c | 97 +- hacks/glx/polyhedra-gl.c | 9 +- hacks/glx/polytopes.c | 38 +- hacks/glx/projectiveplane.c | 206 +- hacks/glx/providence.c | 21 +- hacks/glx/pulsar.c | 24 +- hacks/glx/quasicrystal.c | 9 +- hacks/glx/queens.c | 6 +- hacks/glx/raverhoop.c | 9 +- hacks/glx/romanboy.c | 191 +- hacks/glx/rubik.c | 41 +- hacks/glx/rubikblocks.c | 30 +- hacks/glx/sballs.c | 47 +- hacks/glx/seccam.c | 1388 ++ hacks/glx/seccam.dxf | 13606 ++++++++++++++++ hacks/glx/sierpinski3d.c | 42 +- hacks/glx/skytentacles.c | 11 +- hacks/glx/sonar-icmp.c | 51 +- hacks/glx/sonar.c | 15 +- hacks/glx/spheremonics.c | 9 +- hacks/glx/splitflap.c | 15 +- hacks/glx/splodesic.c | 20 +- hacks/glx/sproingies.c | 56 +- hacks/glx/sproingies.h | 28 +- hacks/glx/sproingiewrap.c | 49 +- hacks/glx/stairs.c | 31 +- hacks/glx/starwars.c | 35 +- hacks/glx/stonerview.c | 32 +- hacks/glx/superquadrics.c | 19 +- hacks/glx/surfaces.c | 34 +- hacks/glx/tangram.c | 9 +- hacks/glx/texfont.c | 104 +- hacks/glx/timetunnel.c | 9 +- hacks/glx/topblock.c | 61 +- hacks/glx/tronbit.c | 9 +- hacks/glx/unicrud.c | 30 +- hacks/glx/unicrud.man | 4 + hacks/glx/unknownpleasures.c | 9 +- hacks/glx/vigilance.c | 1140 ++ hacks/glx/vigilance.man | 57 + hacks/glx/voronoi.c | 9 +- hacks/glx/winduprobot.c | 102 +- hacks/glx/xpm-ximage.c | 1 - hacks/grav.c | 30 +- hacks/hopalong.c | 34 +- hacks/hyperball.c | 5 - hacks/hypercube.c | 2 - hacks/images/apple.xbm | 349 + hacks/interaggregate.c | 12 +- hacks/interference.c | 169 +- hacks/juggle.c | 12 +- hacks/julia.c | 53 +- hacks/laser.c | 6 +- hacks/lightning.c | 6 +- hacks/lisa.c | 6 +- hacks/lissie.c | 6 +- hacks/loop.c | 35 +- hacks/m6502.c | 7 + hacks/memscroller.c | 46 +- hacks/moire.c | 74 +- hacks/mountain.c | 29 +- hacks/pacman.c | 44 +- hacks/penrose.c | 40 +- hacks/polyominoes.c | 96 +- hacks/rd-bomb.c | 54 +- hacks/ripples.c | 60 +- hacks/rotor.c | 6 +- hacks/rotzoomer.c | 39 +- hacks/screenhack.c | 4 +- hacks/sierpinski.c | 27 +- hacks/slip.c | 18 +- hacks/sphere.c | 6 +- hacks/spiral.c | 6 +- hacks/strange.c | 1194 +- hacks/strange.man | 17 + hacks/swirl.c | 108 +- hacks/t3d.c | 7 +- hacks/tessellimage.c | 17 +- hacks/testx11.c | 6 +- hacks/thornbird.c | 32 +- hacks/triangle.c | 16 +- hacks/twang.c | 46 +- hacks/vines.c | 7 +- hacks/webcollage | 160 +- hacks/worm.c | 6 +- hacks/xanalogtv.c | 16 +- hacks/xflame.c | 44 +- hacks/xlockmore.c | 280 +- hacks/xlockmore.h | 43 +- hacks/xlockmoreI.h | 29 +- jwxyz/Makefile.in | 2 +- jwxyz/jwxyz-android.c | 443 +- jwxyz/jwxyz-android.h | 54 +- jwxyz/jwxyz-cocoa.h | 2 + jwxyz/jwxyz-cocoa.m | 473 +- jwxyz/jwxyz-common.c | 707 +- jwxyz/jwxyz-gl.c | 1335 +- jwxyz/jwxyz-timers.c | 6 +- jwxyz/jwxyz.h | 35 +- jwxyz/jwxyz.m | 1157 +- jwxyz/jwxyzI.h | 72 +- jwxyz/jwzgles.c | 57 +- jwxyz/jwzglesI.h | 6 +- po/POTFILES.in | 3 +- po/ca.po | 8905 ---------- utils/Makefile.in | 9 +- utils/aligned_malloc.c | 11 +- utils/aligned_malloc.h | 22 - utils/compile_axp.com | 1 + utils/compile_decc.com | 1 + utils/grabclient.c | 9 +- utils/grabscreen.h | 3 +- utils/pow2.c | 51 + utils/pow2.h | 20 + utils/version.h | 2 +- utils/visual.c | 134 +- utils/visual.h | 7 +- utils/xshm.c | 145 +- utils/xshm.h | 29 +- xscreensaver.spec | 2 +- 292 files changed, 23604 insertions(+), 16264 deletions(-) create mode 100644 OSX/settings.png create mode 100644 OSX/settings@2x.png create mode 100644 OSX/settings@3x.png create mode 100644 OSX/stop.png create mode 100644 OSX/stop@2x.png create mode 100644 OSX/stop@3x.png create mode 100644 android/project/xscreensaver/res/layout-land/activity_xscreensaver.xml create mode 100644 android/project/xscreensaver/src/org/jwz/xscreensaver/XScreenSaverWallpaper.java create mode 100644 hacks/config/vigilance.xml create mode 100644 hacks/glx/seccam.c create mode 100644 hacks/glx/seccam.dxf create mode 100644 hacks/glx/vigilance.c create mode 100644 hacks/glx/vigilance.man create mode 100644 hacks/images/apple.xbm delete mode 100644 po/ca.po create mode 100644 utils/pow2.c create mode 100644 utils/pow2.h diff --git a/Makefile.in b/Makefile.in index c9190518..cf80264b 100644 --- a/Makefile.in +++ b/Makefile.in @@ -18,21 +18,21 @@ TARFILES = README README.hacking README.VMS INSTALL \ TAR = tar -MAKE_SUBDIR = for dir in $(SUBDIRS); do $(MAKE) -C $$dir $@ || exit 5; done -MAKE_SUBDIR2 = for dir in $(SUBDIRS2); do $(MAKE) -C $$dir $@ || exit 5; done +MAKE_SUBDIR = for dir in $(SUBDIRS); do (cd $$dir; $(MAKE) $@) || exit 5; done +MAKE_SUBDIR2 = for dir in $(SUBDIRS2); do (cd $$dir; $(MAKE) $@) || exit 5; done default:: - @$(MAKE_SUBDIR) + @+$(MAKE_SUBDIR) all:: - @$(MAKE_SUBDIR) + @+$(MAKE_SUBDIR) install:: - @$(MAKE_SUBDIR) + @+$(MAKE_SUBDIR) install-program:: - @$(MAKE_SUBDIR) + @+$(MAKE_SUBDIR) install-man:: - @$(MAKE_SUBDIR) + @+$(MAKE_SUBDIR) install-strip:: - @$(MAKE_SUBDIR) + @+$(MAKE_SUBDIR) uninstall:: @$(MAKE_SUBDIR) uninstall-program:: @@ -44,7 +44,7 @@ depend:: distdepend:: @$(MAKE) update_spec_version @$(MAKE_SUBDIR2) - @$(MAKE) -C po update-po + @cd po ; $(MAKE) update-po TAGS:: tags tags:: diff --git a/OSX/Makefile b/OSX/Makefile index 4fd574ca..492bc69c 100644 --- a/OSX/Makefile +++ b/OSX/Makefile @@ -52,7 +52,8 @@ Sparkle.framework: # update-info-plist.pl runs this as needed. # Might be better to do this with curl, since that is installed by default. -URL = https://www.jwz.org/xscreensaver/screenshots/ +BASE = xscreensaver/screenshots/ +URL = https://www.jwz.org/$(BASE) WGET = wget -q -U xscreensaver-build-osx CVT = -thumbnail '200x150^' -gravity center -extent 200x150 \ \( +clone -alpha extract \ @@ -75,16 +76,20 @@ $(THUMBDIR)/%.png: if [ ! -d $(THUMBDIR) ]; then mkdir -p $(THUMBDIR) ; fi ; \ rm -f "$$FILE2" "$$TMP" ; \ set +e ; \ - echo "downloading $$URL..." ; \ - $(WGET) -O"$$TMP" "$$URL" ; \ - if [ ! -s "$$TMP" ]; then \ - echo "downloading $$URL2..." ; \ - $(WGET) -O"$$TMP" "$$URL2" ; \ - fi ; \ - if [ ! -s "$$TMP" ]; then \ - rm -f "$$TMP" ; \ - echo "failed: $$URL" ; \ - exit 1 ; \ + if [ -f "$$HOME/www/$(BASE)/$$FILE1" ]; then \ + cp -p "$$HOME/www/$(BASE)/$$FILE1" "$$TMP" ; \ + else \ + echo "downloading $$URL..." ; \ + $(WGET) -O"$$TMP" "$$URL" ; \ + if [ ! -s "$$TMP" ]; then \ + echo "downloading $$URL2..." ; \ + $(WGET) -O"$$TMP" "$$URL2" ; \ + fi ; \ + if [ ! -s "$$TMP" ]; then \ + rm -f "$$TMP" ; \ + echo "failed: $$URL" ; \ + exit 1 ; \ + fi ; \ fi ; \ rm -f "$$FILE2" ; \ convert jpg:- $(CVT) "$$FILE2" < "$$TMP" ; \ diff --git a/OSX/SaverRunner.h b/OSX/SaverRunner.h index 73b83e9d..073a87ed 100644 --- a/OSX/SaverRunner.h +++ b/OSX/SaverRunner.h @@ -103,7 +103,6 @@ #ifndef USE_IPHONE - (void) openPreferences: (id)sender; #else // USE_IPHONE -- (void) openPreferences: (NSString *)which; - (UIImage *) screenshot; - (NSString *) makeDesc:(NSString *)saver yearOnly:(BOOL) yearp; diff --git a/OSX/SaverRunner.m b/OSX/SaverRunner.m index 20ddd650..5d0259b8 100644 --- a/OSX/SaverRunner.m +++ b/OSX/SaverRunner.m @@ -1,4 +1,4 @@ -/* xscreensaver, Copyright (c) 2006-2016 Jamie Zawinski +/* xscreensaver, Copyright (c) 2006-2017 Jamie Zawinski * * Permission to use, copy, modify, distribute, and sell this software and its * documentation for any purpose is hereby granted without fee, provided that @@ -99,11 +99,19 @@ _showAboutBox = showAboutBox; self.modalTransitionStyle = UIModalTransitionStyleCrossDissolve; - self.wantsFullScreenLayout = YES; + +# ifndef __IPHONE_7_0 + self.wantsFullScreenLayout = YES; // Deprecated as of iOS 7 +# endif } return self; } +- (BOOL) prefersStatusBarHidden +{ + // Requires UIViewControllerBasedStatusBarAppearance = true in plist + return YES; +} - (void)dealloc { @@ -347,12 +355,17 @@ withSize:parentView.bounds.size]; if (! _saverView) { - [[[UIAlertView alloc] initWithTitle: _saverName - message: @"Unable to load!" - delegate: nil - cancelButtonTitle: @"Bummer" - otherButtonTitles: nil] - show]; + UIAlertController *c = [UIAlertController + alertControllerWithTitle:@"Unable to load!" + message:@"" + preferredStyle:UIAlertControllerStyleAlert]; + [c addAction: [UIAlertAction actionWithTitle: @"Bummer" + style: UIAlertActionStyleDefault + handler: ^(UIAlertAction *a) { + // #### Should expose the SaverListController... + }]]; + [self presentViewController:c animated:YES completion:nil]; + return; } @@ -551,8 +564,8 @@ static ScreenSaverView * find_saverView_child (NSView *v) { NSArray *kids = [v subviews]; - int nkids = [kids count]; - int i; + NSUInteger nkids = [kids count]; + NSUInteger i; for (i = 0; i < nkids; i++) { NSObject *kid = [kids objectAtIndex:i]; if ([kid isKindOfClass:[ScreenSaverView class]]) { @@ -589,8 +602,8 @@ relabel_menus (NSObject *v, NSString *old_str, NSString *new_str) [m setTitle: [[m title] stringByReplacingOccurrencesOfString:old_str withString:new_str]]; NSArray *kids = [m itemArray]; - int nkids = [kids count]; - int i; + NSUInteger nkids = [kids count]; + NSUInteger i; for (i = 0; i < nkids; i++) { relabel_menus ([kids objectAtIndex:i], old_str, new_str); } @@ -610,7 +623,7 @@ relabel_menus (NSObject *v, NSString *old_str, NSString *new_str) if ([sender isKindOfClass:[NSView class]]) { // Sent from button sv = find_saverView ((NSView *) sender); } else { - int i; + long i; NSWindow *w = 0; for (i = [windows count]-1; i >= 0; i--) { // Sent from menubar w = [windows objectAtIndex:i]; @@ -628,7 +641,7 @@ relabel_menus (NSObject *v, NSString *old_str, NSString *new_str) modalDelegate:self didEndSelector:@selector(preferencesClosed:returnCode:contextInfo:) contextInfo:nil]; - int code = [NSApp runModalForWindow:prefs]; + NSUInteger code = [NSApp runModalForWindow:prefs]; /* Restart the animation if the "OK" button was hit, but not if "Cancel". We have to restart *both* animations, because the xlockmore-style @@ -665,13 +678,12 @@ relabel_menus (NSObject *v, NSString *old_str, NSString *new_str) CGSize size = [[UIScreen mainScreen] bounds].size; - // iOS 7: Needs to be the actual device orientation. + // iOS 7: Needs to be [[window rootViewController] interfaceOrientation]. // iOS 8: Needs to be UIInterfaceOrientationPortrait. + // (interfaceOrientation deprecated in iOS 8) - UIInterfaceOrientation orient = - NSFoundationVersionNumber > NSFoundationVersionNumber_iOS_7_1 ? - UIInterfaceOrientationPortrait /* iOS 8 broke -[UIScreen bounds]. */ : - [[window rootViewController] interfaceOrientation]; + UIInterfaceOrientation orient = UIInterfaceOrientationPortrait; + /* iOS 8 broke -[UIScreen bounds]. */ if (orient == UIInterfaceOrientationLandscapeLeft || orient == UIInterfaceOrientationLandscapeRight) { @@ -687,10 +699,7 @@ relabel_menus (NSObject *v, NSString *old_str, NSString *new_str) // take the scale into consideration // On iOS prior to 4, fall back to use UIGraphicsBeginImageContext - if (UIGraphicsBeginImageContextWithOptions) - UIGraphicsBeginImageContextWithOptions (size, NO, 0); - else - UIGraphicsBeginImageContext (size); + UIGraphicsBeginImageContextWithOptions (size, NO, 0); CGContextRef ctx = UIGraphicsGetCurrentContext(); @@ -1577,7 +1586,7 @@ FAIL: if (!anim_timer) { Class ssm = NSClassFromString (@"ScreenSaverModule"); if (ssm && [ssm instancesRespondToSelector: - @selector(needsAnimationTimer)]) { + NSSelectorFromString(@"needsAnimationTimer")]) { NSWindow *win = [windows objectAtIndex:0]; ScreenSaverView *sv = find_saverView ([win contentView]); anim_timer = [NSTimer scheduledTimerWithTimeInterval: diff --git a/OSX/SaverRunner.plist b/OSX/SaverRunner.plist index 2384a81d..457c5f45 100644 --- a/OSX/SaverRunner.plist +++ b/OSX/SaverRunner.plist @@ -7,7 +7,7 @@ CFBundleExecutable ${EXECUTABLE_NAME} CFBundleGetInfoString - 5.36 + 5.37 CFBundleIconFile SaverRunner CFBundleIdentifier @@ -15,21 +15,21 @@ CFBundleInfoDictionaryVersion 6.0 CFBundleLongVersionString - 5.36 + 5.37 CFBundleName ${PRODUCT_NAME} CFBundlePackageType APPL CFBundleShortVersionString - 5.36 + 5.37 CFBundleSignature ???? CFBundleVersion - 5.36 + 5.37 LSMinimumSystemVersion ${MACOSX_DEPLOYMENT_TARGET} NSHumanReadableCopyright - 5.36 + 5.37 NSMainNibFile SaverRunner NSPrincipalClass diff --git a/OSX/Updater.plist b/OSX/Updater.plist index 29f7f8d5..515452ad 100644 --- a/OSX/Updater.plist +++ b/OSX/Updater.plist @@ -9,7 +9,7 @@ CFBundleExecutable ${EXECUTABLE_NAME} CFBundleGetInfoString - 5.36 + 5.37 CFBundleIconFile SaverRunner CFBundleIdentifier @@ -17,23 +17,23 @@ CFBundleInfoDictionaryVersion 6.0 CFBundleLongVersionString - 5.36 + 5.37 CFBundleName ${PRODUCT_NAME} CFBundlePackageType APPL CFBundleShortVersionString - 5.36 + 5.37 CFBundleSignature ???? CFBundleVersion - 5.36 + 5.37 LSMinimumSystemVersion ${MACOSX_DEPLOYMENT_TARGET} LSUIElement NSHumanReadableCopyright - 5.36 + 5.37 NSMainNibFile Updater NSPrincipalClass diff --git a/OSX/XScreenSaver.plist b/OSX/XScreenSaver.plist index fc21ef71..04a25c58 100644 --- a/OSX/XScreenSaver.plist +++ b/OSX/XScreenSaver.plist @@ -15,11 +15,11 @@ CFBundlePackageType BNDL CFBundleShortVersionString - 5.36 + 5.37 CFBundleSignature ???? CFBundleVersion - 5.36 + 5.37 LSMinimumSystemVersion 10.8 NSMainNibFile diff --git a/OSX/XScreenSaverConfigSheet.m b/OSX/XScreenSaverConfigSheet.m index 51c13af4..eaa5add1 100644 --- a/OSX/XScreenSaverConfigSheet.m +++ b/OSX/XScreenSaverConfigSheet.m @@ -1,4 +1,4 @@ -/* xscreensaver, Copyright (c) 2006-2016 Jamie Zawinski +/* xscreensaver, Copyright (c) 2006-2017 Jamie Zawinski * * Permission to use, copy, modify, distribute, and sell this software and its * documentation for any purpose is hereby granted without fee, provided that @@ -457,9 +457,10 @@ static char *anchorize (const char *url); NSString *text = [self stripTags: html]; CGSize s = r.size; s.height = 999999; - s = [text sizeWithFont: font - constrainedToSize: s - lineBreakMode:NSLineBreakByWordWrapping]; + s = [text boundingRectWithSize:s + options:NSStringDrawingUsesLineFragmentOrigin + attributes:@{NSFontAttributeName: font} + context:nil].size; r.size.height = s.height; # endif @@ -921,6 +922,7 @@ unwrap (NSString *text) eolp = YES; } else if ([s characterAtIndex:0] == ' ' || [s hasPrefix:@"Copyright "] || + [s hasPrefix:@"https://"] || [s hasPrefix:@"http://"]) { // don't unwrap if the following line begins with whitespace, // or with the word "Copyright", or if it begins with a URL. @@ -966,12 +968,16 @@ boldify (NSText *nstext) static char * anchorize (const char *url) { - const char *wiki = "http://en.wikipedia.org/wiki/"; - const char *math = "http://mathworld.wolfram.com/"; - if (!strncmp (wiki, url, strlen(wiki))) { + const char *wiki1 = "http://en.wikipedia.org/wiki/"; + const char *wiki2 = "https://en.wikipedia.org/wiki/"; + const char *math1 = "http://mathworld.wolfram.com/"; + const char *math2 = "https://mathworld.wolfram.com/"; + if (!strncmp (wiki1, url, strlen(wiki1)) || + !strncmp (wiki2, url, strlen(wiki2))) { char *anchor = (char *) malloc (strlen(url) * 3 + 10); strcpy (anchor, "Wikipedia: \""); - const char *in = url + strlen(wiki); + const char *in = url + strlen(!strncmp (wiki1, url, strlen(wiki1)) + ? wiki1 : wiki2); char *out = anchor + strlen(anchor); while (*in) { if (*in == '_') { @@ -997,10 +1003,12 @@ anchorize (const char *url) *out = 0; return anchor; - } else if (!strncmp (math, url, strlen(math))) { + } else if (!strncmp (math1, url, strlen(math1)) || + !strncmp (math2, url, strlen(math2))) { char *anchor = (char *) malloc (strlen(url) * 3 + 10); strcpy (anchor, "MathWorld: \""); - const char *start = url + strlen(wiki); + const char *start = url + strlen(!strncmp (math1, url, strlen(math1)) + ? math1 : math2); const char *in = start; char *out = anchor + strlen(anchor); while (*in) { @@ -1040,7 +1048,7 @@ hreffify (NSText *nstext) NSString *text = [nstext text]; # endif - int L = [text length]; + NSUInteger L = [text length]; NSRange start; // range is start-of-search to end-of-string start.location = 0; start.length = L; @@ -1048,7 +1056,14 @@ hreffify (NSText *nstext) // Find the beginning of a URL... // - NSRange r2 = [text rangeOfString:@"http://" options:0 range:start]; + NSRange r2 = [text rangeOfString: @"http://" options:0 range:start]; + NSRange r3 = [text rangeOfString:@"https://" options:0 range:start]; + if ((r2.location == NSNotFound && + r3.location != NSNotFound) || + (r2.location != NSNotFound && + r3.location != NSNotFound && + r3.location < r2.location)) + r2 = r3; if (r2.location == NSNotFound) break; @@ -1058,9 +1073,9 @@ hreffify (NSText *nstext) // Find the end of a URL (whitespace or EOF)... // - NSRange r3 = [text rangeOfCharacterFromSet: - [NSCharacterSet whitespaceAndNewlineCharacterSet] - options:0 range:start]; + r3 = [text rangeOfCharacterFromSet: + [NSCharacterSet whitespaceAndNewlineCharacterSet] + options:0 range:start]; if (r3.location == NSNotFound) // EOF r3.location = L, r3.length = 0; @@ -1101,7 +1116,7 @@ hreffify (NSText *nstext) free (anchor); - int L2 = [text length]; // might have changed + NSUInteger L2 = [text length]; // might have changed start.location -= (L - L2); L = L2; } @@ -2058,7 +2073,7 @@ do_file_selector (NSTextField *txt, BOOL dirs_p) [panel setCanChooseFiles:!dirs_p]; [panel setCanChooseDirectories:dirs_p]; - int result = [panel runModal]; + NSInteger result = [panel runModal]; if (result == NSOKButton) { NSArray *files = [panel URLs]; NSString *file = ([files count] > 0 ? [[files objectAtIndex:0] path] : @""); @@ -2085,7 +2100,7 @@ find_text_field_of_button (NSButton *button) { NSView *parent = [button superview]; NSArray *kids = [parent subviews]; - int nkids = [kids count]; + NSUInteger nkids = [kids count]; int i; NSTextField *f = 0; for (i = 0; i < nkids; i++) { @@ -2544,7 +2559,7 @@ static NSView * last_child (NSView *parent) { NSArray *kids = [parent subviews]; - int nkids = [kids count]; + NSUInteger nkids = [kids count]; if (nkids == 0) return 0; else @@ -2694,8 +2709,8 @@ static void layout_group (NSView *group, BOOL horiz_p) { NSArray *kids = [group subviews]; - int nkids = [kids count]; - int i; + NSUInteger nkids = [kids count]; + NSUInteger i; double maxx = 0, miny = 0; for (i = 0; i < nkids; i++) { NSView *kid = [kids objectAtIndex:i]; @@ -2826,10 +2841,10 @@ fix_contentview_size (NSView *parent) { NSRect f; NSArray *kids = [parent subviews]; - int nkids = [kids count]; + NSUInteger nkids = [kids count]; NSView *text = 0; // the NSText at the bottom of the window double maxx = 0, miny = 0; - int i; + NSUInteger i; /* Find the size of the rectangle taken up by each of the children except the final "NSText" child. @@ -3214,6 +3229,7 @@ wrap_with_buttons (NSWindow *window, NSView *panel) CGFloat max = 0; for (NSArray *a2 in a) { NSString *s = [a2 objectAtIndex:0]; + // #### sizeWithFont deprecated as of iOS 7; use boundingRectWithSize. CGSize r = [s sizeWithFont:f]; if (r.width > max) max = r.width; } @@ -3252,7 +3268,7 @@ wrap_with_buttons (NSWindow *window, NSView *panel) [[self navigationItem] setRightBarButtonItem: [[UIBarButtonItem alloc] initWithTitle: @"Reset to Defaults" - style: UIBarButtonItemStyleBordered + style: UIBarButtonItemStylePlain target:self action:@selector(resetAction:)]]; NSString *s = saver_name; @@ -3524,14 +3540,15 @@ wrap_with_buttons (NSWindow *window, NSView *panel) [mid setFrame:r]; if (top) { - r.size = [[top text] sizeWithFont:[top font] - constrainedToSize: - CGSizeMake (ww - LEFT_MARGIN*2, 100000) - lineBreakMode:[top lineBreakMode]]; # ifdef LABEL_ABOVE_SLIDER // Top label goes above, flush center/top. r.origin.x = (ww - r.size.width) / 2; r.origin.y = 4; + // #### sizeWithFont deprecated as of iOS 7; use boundingRectWithSize. + r.size = [[top text] sizeWithFont:[top font] + constrainedToSize: + CGSizeMake (ww - LEFT_MARGIN*2, 100000) + lineBreakMode:[top lineBreakMode]]; # else // !LABEL_ABOVE_SLIDER // Label goes on the left. r.origin.x = LEFT_MARGIN; @@ -3543,24 +3560,21 @@ wrap_with_buttons (NSWindow *window, NSView *panel) } // Left label goes under control, flush left/bottom. - r.size = [[left text] sizeWithFont:[left font] - constrainedToSize: - CGSizeMake(ww - LEFT_MARGIN*2, 100000) - lineBreakMode:[left lineBreakMode]]; - r.origin.x = [mid frame].origin.x; - r.origin.y = hh - r.size.height - 4; - [left setFrame:r]; + left.frame = CGRectMake([mid frame].origin.x, hh - 4, + ww - LEFT_MARGIN*2, 100000); + [left sizeToFit]; + r = left.frame; + r.origin.y -= r.size.height; + left.frame = r; // Right label goes under control, flush right/bottom. - r = [right frame]; - r.size = [[right text] sizeWithFont:[right font] - constrainedToSize: - CGSizeMake(ww - LEFT_MARGIN*2, 1000000) - lineBreakMode:[right lineBreakMode]]; - r.origin.x = ([mid frame].origin.x + [mid frame].size.width - - r.size.width); - r.origin.y = [left frame].origin.y; - [right setFrame:r]; + right.frame = + CGRectMake([mid frame].origin.x + [mid frame].size.width, + [left frame].origin.y, ww - LEFT_MARGIN*2, 1000000); + [right sizeToFit]; + r = right.frame; + r.origin.x -= r.size.width; + right.frame = r; // Make a box and put the labels and slider into it. r.origin.x = 0; diff --git a/OSX/XScreenSaverGLView.h b/OSX/XScreenSaverGLView.h index 6e05986f..a4d1ebfd 100644 --- a/OSX/XScreenSaverGLView.h +++ b/OSX/XScreenSaverGLView.h @@ -22,6 +22,7 @@ # import # import # import +# import "jwzglesI.h" #else # import #endif @@ -31,6 +32,7 @@ # ifdef USE_IPHONE GLuint gl_depthbuffer; BOOL _suppressRotationAnimation; + jwzgles_state *_glesState; # endif /* USE_IPHONE */ } diff --git a/OSX/XScreenSaverGLView.m b/OSX/XScreenSaverGLView.m index 989f8eb9..d61964f8 100644 --- a/OSX/XScreenSaverGLView.m +++ b/OSX/XScreenSaverGLView.m @@ -121,7 +121,7 @@ extern void check_gl_error (const char *type); BOOL was_initted_p = initted_p; [super render_x11]; - if (! was_initted_p) + if (! was_initted_p && xdpy) _suppressRotationAnimation = get_boolean_resource (xdpy, "suppressRotationAnimation", @@ -262,6 +262,31 @@ extern void check_gl_error (const char *type); return kCAGravityCenter; } +- (void) startAnimation +{ + [super startAnimation]; + if (ogl_ctx) /* Almost always true. */ + _glesState = jwzgles_make_state (); +} + +- (void) stopAnimation +{ + [super stopAnimation]; +#ifdef USE_IPHONE + if (_glesState) { + [EAGLContext setCurrentContext:ogl_ctx]; + jwzgles_make_current (_glesState); + jwzgles_free_state (); + } +#endif +} + +- (void) prepareContext +{ + [super prepareContext]; + jwzgles_make_current (_glesState); +} + #endif // !USE_IPHONE @@ -307,10 +332,6 @@ init_GL (ModeInfo *mi) // OpenGL initialization is in [XScreenSaverView startAnimation]. -# ifdef USE_IPHONE - jwzgles_reset (); -# endif // USE_IPHONE - // I don't know why this is necessary, but it beats randomly having some // textures be upside down. // diff --git a/OSX/XScreenSaverView.h b/OSX/XScreenSaverView.h index 06f0ebe2..dffa58e9 100644 --- a/OSX/XScreenSaverView.h +++ b/OSX/XScreenSaverView.h @@ -1,4 +1,4 @@ -/* xscreensaver, Copyright (c) 2006-2016 Jamie Zawinski +/* xscreensaver, Copyright (c) 2006-2017 Jamie Zawinski * * Permission to use, copy, modify, distribute, and sell this software and its * documentation for any purpose is hereby granted without fee, provided that @@ -42,6 +42,7 @@ @protocol XScreenSaverViewDelegate - (void) wantsFadeOut:(XScreenSaverView *)saverView; - (void) didShake:(XScreenSaverView *)saverView; +- (void) openPreferences: (NSString *)which; @end @interface ScreenSaverView : NSView @@ -82,6 +83,7 @@ Window xwindow; void *xdata; fps_state *fpst; + void (*fps_cb) (Display *, Window, fps_state *, void *); # ifdef USE_IPHONE BOOL screenLocked; @@ -93,6 +95,11 @@ id _delegate; + UIView *closeBox; + NSTimer *closeBoxTimer; + + CGAffineTransform pinch_transform; + # else // !USE_PHONE NSOpenGLPixelFormat *pixfmt; @@ -107,7 +114,7 @@ # ifdef BACKBUFFER_OPENGL void *backbuffer_data; - size_t backbuffer_len; + GLsizei backbuffer_len; GLsizei gl_texture_w, gl_texture_h; diff --git a/OSX/XScreenSaverView.m b/OSX/XScreenSaverView.m index 18f4a1aa..947525dd 100644 --- a/OSX/XScreenSaverView.m +++ b/OSX/XScreenSaverView.m @@ -1,4 +1,4 @@ -/* xscreensaver, Copyright (c) 2006-2016 Jamie Zawinski +/* xscreensaver, Copyright (c) 2006-2017 Jamie Zawinski * * Permission to use, copy, modify, distribute, and sell this software and its * documentation for any purpose is hereby granted without fee, provided that @@ -23,6 +23,7 @@ #import "Updater.h" #import "screenhackI.h" #import "xlockmoreI.h" +#import "pow2.h" #import "jwxyzI.h" #import "jwxyz-cocoa.h" #import "jwxyz-timers.h" @@ -118,6 +119,7 @@ extern NSDictionary *make_function_table_dict(void); // ios-function-table.m @interface XScreenSaverView (Private) +- (void) stopAndClose; - (void) stopAndClose:(Bool)relaunch; @end @@ -603,8 +605,6 @@ add_default_options (const XrmOptionDescRec *opts, # ifdef USE_IPHONE [UIApplication sharedApplication].idleTimerDisabled = ([UIDevice currentDevice].batteryState != UIDeviceBatteryStateUnplugged); - [[UIApplication sharedApplication] - setStatusBarHidden:YES withAnimation:UIStatusBarAnimationNone]; # endif xwindow = (Window) calloc (1, sizeof(*xwindow)); @@ -739,13 +739,14 @@ add_default_options (const XrmOptionDescRec *opts, [self lockFocus]; // in case something tries to draw from here [self prepareContext]; - /* I considered just not even calling the free callback at all... - But webcollage-cocoa needs it, to kill the inferior webcollage + /* All of the xlockmore hacks need to have their release functions + called, or launching the same saver twice does not work. Also + webcollage-cocoa needs it in order to kill the inferior webcollage processes (since the screen saver framework never generates a - SIGPIPE for them...) Instead, I turned off the free call in - xlockmore.c, which is where all of the bogus calls are anyway. + SIGPIPE for them). */ - xsft->free_cb (xdpy, xwindow, xdata); + if (xdata) + xsft->free_cb (xdpy, xwindow, xdata); [self unlockFocus]; jwxyz_free_display (xdpy); @@ -778,8 +779,6 @@ add_default_options (const XrmOptionDescRec *opts, // # ifdef USE_IPHONE [UIApplication sharedApplication].idleTimerDisabled = NO; - [[UIApplication sharedApplication] - setStatusBarHidden:NO withAnimation:UIStatusBarAnimationNone]; # endif // Without this, the GL frame stays on screen when switching tabs @@ -905,7 +904,8 @@ current_device_rotation (void) the opposite direction." */ /* statusBarOrientation deprecated in iOS 9 */ - o = [UIApplication sharedApplication].statusBarOrientation; + o = (UIDeviceOrientation) // from UIInterfaceOrientation + [UIApplication sharedApplication].statusBarOrientation; } switch (o) { @@ -917,29 +917,37 @@ current_device_rotation (void) } -- (void)alertView:(UIAlertView *)av clickedButtonAtIndex:(NSInteger)i -{ - if (i == 0) exit (-1); // Cancel - [self stopAndClose:NO]; // Keep going -} - - (void) handleException: (NSException *)e { NSLog (@"Caught exception: %@", e); - [[[UIAlertView alloc] initWithTitle: - [NSString stringWithFormat: @"%s crashed!", - xsft->progclass] - message: - [NSString stringWithFormat: - @"The error message was:" - "\n\n%@\n\n" - "If it keeps crashing, try " - "resetting its options.", - e] - delegate: self - cancelButtonTitle: @"Exit" - otherButtonTitles: @"Keep going", nil] - show]; + UIAlertController *c = [UIAlertController + alertControllerWithTitle: + [NSString stringWithFormat: @"%s crashed!", + xsft->progclass] + message: [NSString stringWithFormat: + @"The error message was:" + "\n\n%@\n\n" + "If it keeps crashing, try " + "resetting its options.", + e] + preferredStyle:UIAlertControllerStyleAlert]; + + [c addAction: [UIAlertAction actionWithTitle: @"Exit" + style: UIAlertActionStyleDefault + handler: ^(UIAlertAction *a) { + exit (-1); + }]]; + [c addAction: [UIAlertAction actionWithTitle: @"Keep going" + style: UIAlertActionStyleDefault + handler: ^(UIAlertAction *a) { + [self stopAndClose:NO]; + }]]; + + UIViewController *vc = + [UIApplication sharedApplication].keyWindow.rootViewController; + while (vc.presentedViewController) + vc = vc.presentedViewController; + [vc presentViewController:c animated:YES completion:nil]; [self stopAnimation]; } @@ -1064,31 +1072,6 @@ gl_check_ver (const struct gl_version *caps, } -static GLsizei -to_pow2 (size_t x) -{ - if (x <= 1) - return 1; - - size_t mask = (size_t)-1; - unsigned bits = sizeof(x) * CHAR_BIT; - unsigned log2 = bits; - - --x; - while (bits) { - if (!(x & mask)) { - log2 -= bits; - x <<= bits; - } - - bits >>= 1; - mask <<= bits; - } - - return 1 << log2; -} - - #ifdef USE_IPHONE - (BOOL) suppressRotationAnimation { @@ -1163,7 +1146,7 @@ to_pow2 (size_t x) CGContextRef ob = backbuffer; void *odata = backbuffer_data; - size_t olen = backbuffer_len; + GLsizei olen = backbuffer_len; # if !defined __OPTIMIZE__ || TARGET_IPHONE_SIMULATOR NSLog(@"backbuffer %.0fx%.0f", @@ -1211,11 +1194,11 @@ to_pow2 (size_t x) if (!gl_limited_npot_p) # endif { - gl_texture_w = to_pow2 (gl_texture_w); - gl_texture_h = to_pow2 (gl_texture_h); + gl_texture_w = (GLsizei) to_pow2 (gl_texture_w); + gl_texture_h = (GLsizei) to_pow2 (gl_texture_h); } - size_t bytes_per_row = gl_texture_w * 4; + GLsizei bytes_per_row = gl_texture_w * 4; # if defined(BACKBUFFER_OPENGL) && !defined(USE_IPHONE) // APPLE_client_storage requires texture width to be aligned to 32 bytes, or @@ -1623,10 +1606,11 @@ to_pow2 (size_t x) if (get_boolean_resource (xdpy, "doFPS", "DoFPS")) { fpst = fps_init (xdpy, xwindow); - if (! xsft->fps_cb) xsft->fps_cb = screenhack_do_fps; + fps_cb = xsft->fps_cb; + if (! fps_cb) fps_cb = screenhack_do_fps; } else { fpst = NULL; - xsft->fps_cb = 0; + fps_cb = 0; } # ifdef USE_IPHONE @@ -1727,8 +1711,8 @@ to_pow2 (size_t x) // NSAssert(xdata, @"no xdata when drawing"); if (! xdata) abort(); unsigned long delay = xsft->draw_cb (xdpy, xwindow, xdata); - if (fpst && xsft->fps_cb) - xsft->fps_cb (xdpy, xwindow, fpst, xdata); + if (fpst && fps_cb) + fps_cb (xdpy, xwindow, fpst, xdata); gettimeofday (&tv, 0); now = tv.tv_sec + (tv.tv_usec / 1000000.0); @@ -2021,7 +2005,7 @@ to_pow2 (size_t x) [e deltaX] < 0 ? Button7 : 0); else - xe.xbutton.button = [e buttonNumber] + 1; + xe.xbutton.button = (unsigned int) [e buttonNumber] + 1; break; case MotionNotify: xe.xmotion.x = x; @@ -2075,9 +2059,9 @@ to_pow2 (size_t x) case NSF12FunctionKey: k = XK_F12; break; default: { - const char *s = + const char *ss = [ns cStringUsingEncoding:NSISOLatin1StringEncoding]; - k = (s && *s ? *s : 0); + k = (ss && *ss ? *ss : 0); } break; } @@ -2229,6 +2213,12 @@ to_pow2 (size_t x) #else // USE_IPHONE +- (void) stopAndClose +{ + [self stopAndClose:NO]; +} + + - (void) stopAndClose:(Bool)relaunch_p { if ([self isAnimating]) @@ -2260,11 +2250,10 @@ to_pow2 (size_t x) /* We distinguish between taps and drags. - Drags/pans (down, motion, up) are sent to the saver to handle. - - Single-taps exit the saver. + - Single-taps are sent to the saver to handle. - Double-taps are sent to the saver as a "Space" keypress. - Swipes (really, two-finger drags/pans) send Up/Down/Left/RightArrow keys. - - This means a saver cannot respond to a single-tap. Only a few try to. + - All taps expose the momentary "Close" button. */ - (void)initGestures @@ -2277,7 +2266,7 @@ to_pow2 (size_t x) UITapGestureRecognizer *stap = [[UITapGestureRecognizer alloc] initWithTarget:self - action:@selector(handleTap)]; + action:@selector(handleTap:)]; stap.numberOfTapsRequired = 1; stap.numberOfTouchesRequired = 1; @@ -2305,10 +2294,16 @@ to_pow2 (size_t x) hold.numberOfTouchesRequired = 1; hold.minimumPressDuration = 0.25; /* 1/4th second */ + // Two finger pinch to zoom in on the view. + UIPinchGestureRecognizer *pinch = [[UIPinchGestureRecognizer alloc] + initWithTarget:self + action:@selector(handlePinch:)]; + [stap requireGestureRecognizerToFail: dtap]; [stap requireGestureRecognizerToFail: hold]; [dtap requireGestureRecognizerToFail: hold]; [pan requireGestureRecognizerToFail: hold]; + [pan2 requireGestureRecognizerToFail: pinch]; [self setMultipleTouchEnabled:YES]; @@ -2317,12 +2312,14 @@ to_pow2 (size_t x) [self addGestureRecognizer: pan]; [self addGestureRecognizer: pan2]; [self addGestureRecognizer: hold]; + [self addGestureRecognizer: pinch]; [dtap release]; [stap release]; [pan release]; [pan2 release]; [hold release]; + [pinch release]; } @@ -2363,7 +2360,7 @@ to_pow2 (size_t x) { CGFloat xx = p->x, yy = p->y; -# if TARGET_IPHONE_SIMULATOR +# if 0 // TARGET_IPHONE_SIMULATOR { XWindowAttributes xgwa; XGetWindowAttributes (xdpy, xwindow, &xgwa); @@ -2422,7 +2419,7 @@ to_pow2 (size_t x) p->x = xx * s; p->y = yy * s; -# if TARGET_IPHONE_SIMULATOR || !defined __OPTIMIZE__ +# if 0 // TARGET_IPHONE_SIMULATOR || !defined __OPTIMIZE__ { XWindowAttributes xgwa; XGetWindowAttributes (xdpy, xwindow, &xgwa); @@ -2441,9 +2438,36 @@ to_pow2 (size_t x) /* Single click exits saver. */ -- (void) handleTap +- (void) handleTap:(UIGestureRecognizer *)sender { - [self stopAndClose:NO]; + if (!xwindow) + return; + + XEvent xe; + memset (&xe, 0, sizeof(xe)); + + [self showCloseButton]; + + CGPoint p = [sender locationInView:self]; // this is in points, not pixels + [self convertMouse:&p]; + NSAssert (xwindow->type == WINDOW, @"not a window"); + xwindow->window.last_mouse_x = p.x; + xwindow->window.last_mouse_y = p.y; + + xe.xany.type = ButtonPress; + xe.xbutton.button = 1; + xe.xbutton.x = p.x; + xe.xbutton.y = p.y; + + if (! [self sendEvent: &xe]) + ; //[self beep]; + + xe.xany.type = ButtonRelease; + xe.xbutton.button = 1; + xe.xbutton.x = p.x; + xe.xbutton.y = p.y; + + [self sendEvent: &xe]; } @@ -2453,6 +2477,8 @@ to_pow2 (size_t x) { if (!xsft->event_cb || !xwindow) return; + [self showCloseButton]; + XEvent xe; memset (&xe, 0, sizeof(xe)); xe.xkey.keycode = ' '; @@ -2471,6 +2497,8 @@ to_pow2 (size_t x) { if (!xsft->event_cb || !xwindow) return; + [self showCloseButton]; + XEvent xe; memset (&xe, 0, sizeof(xe)); @@ -2527,6 +2555,8 @@ to_pow2 (size_t x) { if (!xsft->event_cb || !xwindow) return; + [self showCloseButton]; + if (sender.state != UIGestureRecognizerStateEnded) return; @@ -2549,6 +2579,102 @@ to_pow2 (size_t x) } +/* Pinch with 2 fingers: zoom in around the center of the fingers. + */ +- (void) handlePinch:(UIPinchGestureRecognizer *)sender +{ + if (!xsft->event_cb || !xwindow) return; + + [self showCloseButton]; + + if (sender.state == UIGestureRecognizerStateBegan) + pinch_transform = self.transform; // Save the base transform + + switch (sender.state) { + case UIGestureRecognizerStateBegan: + case UIGestureRecognizerStateChanged: + { + double scale = sender.scale; + + if (scale < 1) + return; + + self.transform = CGAffineTransformScale (pinch_transform, scale, scale); + + CGPoint p = [sender locationInView: self]; + p.x /= self.layer.bounds.size.width; + p.y /= self.layer.bounds.size.height; + + CGPoint np = CGPointMake (self.bounds.size.width * p.x, + self.bounds.size.height * p.y); + CGPoint op = CGPointMake (self.bounds.size.width * + self.layer.anchorPoint.x, + self.bounds.size.height * + self.layer.anchorPoint.y); + np = CGPointApplyAffineTransform (np, self.transform); + op = CGPointApplyAffineTransform (op, self.transform); + + CGPoint pos = self.layer.position; + pos.x -= op.x; + pos.x += np.x; + pos.y -= op.y; + pos.y += np.y; + self.layer.position = pos; + self.layer.anchorPoint = p; + } + break; + + case UIGestureRecognizerStateEnded: + { + // When released, snap back to the default zoom (but animate it). + + CABasicAnimation *a1 = [CABasicAnimation + animationWithKeyPath:@"position.x"]; + a1.fromValue = [NSNumber numberWithFloat: self.layer.position.x]; + a1.toValue = [NSNumber numberWithFloat: self.bounds.size.width / 2]; + + CABasicAnimation *a2 = [CABasicAnimation + animationWithKeyPath:@"position.y"]; + a2.fromValue = [NSNumber numberWithFloat: self.layer.position.y]; + a2.toValue = [NSNumber numberWithFloat: self.bounds.size.height / 2]; + + CABasicAnimation *a3 = [CABasicAnimation + animationWithKeyPath:@"anchorPoint.x"]; + a3.fromValue = [NSNumber numberWithFloat: self.layer.anchorPoint.x]; + a3.toValue = [NSNumber numberWithFloat: 0.5]; + + CABasicAnimation *a4 = [CABasicAnimation + animationWithKeyPath:@"anchorPoint.y"]; + a4.fromValue = [NSNumber numberWithFloat: self.layer.anchorPoint.y]; + a4.toValue = [NSNumber numberWithFloat: 0.5]; + + CABasicAnimation *a5 = [CABasicAnimation + animationWithKeyPath:@"transform.scale"]; + a5.fromValue = [NSNumber numberWithFloat: sender.scale]; + a5.toValue = [NSNumber numberWithFloat: 1.0]; + + CAAnimationGroup *group = [CAAnimationGroup animation]; + group.duration = 0.3; + group.repeatCount = 1; + group.autoreverses = NO; + group.animations = @[ a1, a2, a3, a4, a5 ]; + group.timingFunction = [CAMediaTimingFunction + functionWithName: + kCAMediaTimingFunctionEaseIn]; + [self.layer addAnimation:group forKey:@"unpinch"]; + + self.transform = pinch_transform; + self.layer.anchorPoint = CGPointMake (0.5, 0.5); + self.layer.position = CGPointMake (self.bounds.size.width / 2, + self.bounds.size.height / 2); + } + break; + default: + abort(); + } +} + + /* We need this to respond to "shake" gestures */ - (BOOL)canBecomeFirstResponder @@ -2573,6 +2699,105 @@ to_pow2 (size_t x) } +- (void) showCloseButton +{ + double iw = 24; + double ih = iw; + double off = 4; + + if (!closeBox) { + int width = self.bounds.size.width; + closeBox = [[UIView alloc] + initWithFrame:CGRectMake(0, 0, width, ih + off)]; + closeBox.backgroundColor = [UIColor clearColor]; + closeBox.autoresizingMask = + UIViewAutoresizingFlexibleBottomMargin | + UIViewAutoresizingFlexibleWidth; + + // Add the buttons to the bar + UIImage *img1 = [UIImage imageNamed:@"stop"]; + UIImage *img2 = [UIImage imageNamed:@"settings"]; + + UIButton *button = [[UIButton alloc] init]; + [button setFrame: CGRectMake(off, off, iw, ih)]; + [button setBackgroundImage:img1 forState:UIControlStateNormal]; + [button addTarget:self + action:@selector(stopAndClose) + forControlEvents:UIControlEventTouchUpInside]; + [closeBox addSubview:button]; + [button release]; + + button = [[UIButton alloc] init]; + [button setFrame: CGRectMake(width - iw - off, off, iw, ih)]; + [button setBackgroundImage:img2 forState:UIControlStateNormal]; + [button addTarget:self + action:@selector(stopAndOpenSettings) + forControlEvents:UIControlEventTouchUpInside]; + button.autoresizingMask = + UIViewAutoresizingFlexibleBottomMargin | + UIViewAutoresizingFlexibleLeftMargin; + [closeBox addSubview:button]; + [button release]; + + [self addSubview:closeBox]; + } + + if (closeBox.layer.opacity <= 0) { // Fade in + + CABasicAnimation *anim = [CABasicAnimation animationWithKeyPath:@"opacity"]; + anim.duration = 0.2; + anim.repeatCount = 1; + anim.autoreverses = NO; + anim.fromValue = [NSNumber numberWithFloat:0.0]; + anim.toValue = [NSNumber numberWithFloat:1.0]; + [closeBox.layer addAnimation:anim forKey:@"animateOpacity"]; + closeBox.layer.opacity = 1; + } + + // Fade out N seconds from now. + if (closeBoxTimer) + [closeBoxTimer invalidate]; + closeBoxTimer = [NSTimer scheduledTimerWithTimeInterval: 3 + target:self + selector:@selector(closeBoxOff) + userInfo:nil + repeats:NO]; +} + + +- (void)closeBoxOff +{ + if (closeBoxTimer) { + [closeBoxTimer invalidate]; + closeBoxTimer = 0; + } + if (!closeBox) + return; + + CABasicAnimation *anim = [CABasicAnimation animationWithKeyPath:@"opacity"]; + anim.duration = 0.2; + anim.repeatCount = 1; + anim.autoreverses = NO; + anim.fromValue = [NSNumber numberWithFloat: 1]; + anim.toValue = [NSNumber numberWithFloat: 0]; + [closeBox.layer addAnimation:anim forKey:@"animateOpacity"]; + closeBox.layer.opacity = 0; +} + + +- (void) stopAndOpenSettings +{ + NSString *s = [NSString stringWithCString:xsft->progclass + encoding:NSISOLatin1StringEncoding]; + if ([self isAnimating]) + [self stopAnimation]; + [self resignFirstResponder]; + [_delegate wantsFadeOut:self]; + [_delegate openPreferences: s]; + +} + + - (void)setScreenLocked:(BOOL)locked { if (screenLocked == locked) return; diff --git a/OSX/bindist.rtf b/OSX/bindist.rtf index f9cb355b..74e15780 100644 --- a/OSX/bindist.rtf +++ b/OSX/bindist.rtf @@ -16,8 +16,8 @@ \b0 by Jamie Zawinski\ and many others\ \ -version 5.36\ -10-Oct-2016\ +version 5.37\ +05-Jul-2017\ \ {\field{\*\fldinst{HYPERLINK "https://www.jwz.org/xscreensaver/"}}{\fldrslt \cf2 \ul \ulc2 https://www.jwz.org/xscreensaver/}}\ \pard\pardeftab720 @@ -39,7 +39,9 @@ select \i Open \i0 from the context menu.\ \b0 \cf0 \ Open the \i "Screen Savers" \i0 folder in this disk image and double-click -each saver that you want to install.\ +each saver that you want to install. (But that might not work unless you +tweak \i"System Preferences / Security & Privacy"\i0 first. Just +do \i"Install Everything"\i0, that's easier.)\ \ \pard\pardeftab720 @@ -64,11 +66,13 @@ available there.\ \ \pard\pardeftab720 -\b \cf0 iPhone and iPad:\ +\b \cf0 iPhone, iPad & Android:\ \pard\pardeftab720\li360 \b0 \cf0 \ -XScreenSaver also runs on iOS. It is available in the +XScreenSaver also runs on iOS and Android. It is available in the {\field{\*\fldinst{HYPERLINK "https://itunes.apple.com/app/xscreensaver/id539014593?mt=8"}} -{\fldrslt \cf2 \ul \ulc2 iTunes App Store}}, and it's free! +{\fldrslt \cf2 \ul \ulc2 iTunes App Store}} and in the +{\field{\*\fldinst{HYPERLINK "https://play.google.com/store/apps/details?id=org.jwz.xscreensaver"}} +{\fldrslt \cf2 \ul \ulc2 Google Play Store}}, and it's free! } diff --git a/OSX/grabclient-ios.m b/OSX/grabclient-ios.m index e3e4a8e7..b016eb1b 100644 --- a/OSX/grabclient-ios.m +++ b/OSX/grabclient-ios.m @@ -1,4 +1,4 @@ -/* xscreensaver, Copyright (c) 1992-2016 Jamie Zawinski +/* xscreensaver, Copyright (c) 1992-2017 Jamie Zawinski * * Permission to use, copy, modify, distribute, and sell this software and its * documentation for any purpose is hereby granted without fee, provided that @@ -9,120 +9,87 @@ * implied warranty. */ -/* This iOS code to choose and return a random image from the user's - * photo gallery. - * - * Much of the following written by: - * - * Created by David Oster on 6/23/12. - * Copyright (c) 2012 Google. All rights reserved. - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. +/* iOS 8+ code to choose and return a random image from the photo library. */ #ifdef USE_IPHONE // whole file -#import +#import #import "grabscreen.h" #import "yarandom.h" -/* ALAssetsLibrary is an async API, so we need to fire it off and then - call a callback when it's done. Fortunately, this fits the same - interaction model already used in xscreensaver by load_image_async(), - so it works out nicely. - */ - -typedef struct { - void (*callback) (void *uiimage, const char *fn, int width, int height, - void *closure); - void *closure; - - ALAssetsLibrary *library; - NSMutableArray *assets; - -} ios_loader_data; - - -static void -ios_random_image_done (ios_loader_data *d, BOOL ok) -{ - UIImage *img = 0; - const char *fn = 0; - NSUInteger n = ok ? [d->assets count] : 0; - if (n > 0) { - ALAsset *asset = [d->assets objectAtIndex: random() % n]; - ALAssetRepresentation *rep = [asset defaultRepresentation]; - - // "fullScreenImage" returns a smaller image than "fullResolutionImage", - // but this function still takes a significant fraction of a second, - // causing a visible glitch in e.g. "glslideshow". - CGImageRef cgi = [rep fullScreenImage]; - if (cgi) { - UIImageOrientation orient = (UIImageOrientation) - [[asset valueForProperty:ALAssetPropertyOrientation] intValue]; - img = [UIImage imageWithCGImage: cgi - scale: 1 - orientation: orient]; - if (img) - fn = [[[rep filename] stringByDeletingPathExtension] - cStringUsingEncoding:NSUTF8StringEncoding]; - } - } - - [d->assets release]; - [d->library release]; - - d->callback (img, fn, [img size].width, [img size].height, d->closure); - free (d); -} - - void ios_load_random_image (void (*callback) (void *uiimage, const char *fn, int width, int height, void *closure), - void *closure) + void *closure, + int width, int height) { - ios_loader_data *d = (ios_loader_data *) calloc (1, sizeof(*d)); - d->callback = callback; - d->closure = closure; - - d->library = [[[ALAssetsLibrary alloc] init] retain]; - d->assets = [[NSMutableArray array] retain]; - - // The closures passed in here are called later, after we have returned. + // If the user has not yet been asked for authoriziation, pop up the + // auth dialog now and re-invoke this function once it has been + // answered. The callback will run once there has been a Yes or No. + // Otherwise, we'd return right away with colorbars even if the user + // then went on to answer Yes. // - [d->library enumerateGroupsWithTypes: ALAssetsGroupAll - usingBlock: ^(ALAssetsGroup *group, BOOL *stop) { - NSString *name = [group valueForProperty:ALAssetsGroupPropertyName]; - if ([name length]) { - [group enumerateAssetsUsingBlock: ^(ALAsset *asset, NSUInteger index, - BOOL *stop) { - if ([[asset valueForProperty: ALAssetPropertyType] - isEqual: ALAssetTypePhoto]) { - [d->assets addObject:asset]; - } - }]; - } + PHAuthorizationStatus status = [PHPhotoLibrary authorizationStatus]; + if (status == PHAuthorizationStatusNotDetermined) { + [PHPhotoLibrary requestAuthorization:^(PHAuthorizationStatus status) { + ios_load_random_image (callback, closure, width, height); + }]; + return; + } + + // The rest of this is synchronous. + + PHFetchOptions *opt = [PHFetchOptions new]; + opt.includeAssetSourceTypes = (PHAssetSourceTypeUserLibrary | + PHAssetSourceTypeCloudShared | + PHAssetSourceTypeiTunesSynced); + PHFetchResult *r = [PHAsset + fetchAssetsWithMediaType: PHAssetMediaTypeImage + options: opt]; + NSUInteger n = [r count]; + PHAsset *asset = n ? [r objectAtIndex: random() % n] : NULL; + + __block UIImage *img = 0; + __block const char *fn = 0; + + if (asset) { + PHImageRequestOptions *opt = [[PHImageRequestOptions alloc] init]; + opt.synchronous = YES; + + // Get the image bits. + // + int size = width > height ? width : height; + [[PHImageManager defaultManager] + requestImageForAsset: asset + targetSize: CGSizeMake (size, size) + contentMode: PHImageContentModeDefault + options: opt + resultHandler:^void (UIImage *image, NSDictionary *info) { + img = image; + }]; + + // Get the image name. + // + [[PHImageManager defaultManager] + requestImageDataForAsset: asset + options: opt + resultHandler:^(NSData *imageData, NSString *dataUTI, + UIImageOrientation orientation, + NSDictionary *info) { + // Looks like UIImage is pre-rotated to compensate for 'orientation'. + NSString *path = [info objectForKey:@"PHImageFileURLKey"]; + if (path) + fn = [[[path lastPathComponent] stringByDeletingPathExtension] + cStringUsingEncoding:NSUTF8StringEncoding]; + }]; + } - if (! group) { // done - ios_random_image_done (d, YES); - } - } failureBlock:^(NSError *error) { - // E.g., ALAssetsLibraryErrorDomain: "The user has denied the - // application access to their media." - NSLog(@"reading Photo Library: %@", error); - ios_random_image_done (d, NO); - }]; + if (img) + callback (img, fn, [img size].width, [img size].height, closure); + else + callback (0, 0, 0, 0, closure); } #endif // USE_IPHONE - whole file diff --git a/OSX/grabclient-osx.m b/OSX/grabclient-osx.m index a0a949d7..8542d127 100644 --- a/OSX/grabclient-osx.m +++ b/OSX/grabclient-osx.m @@ -1,4 +1,4 @@ -/* xscreensaver, Copyright (c) 1992-2016 Jamie Zawinski +/* xscreensaver, Copyright (c) 1992-2017 Jamie Zawinski * * Permission to use, copy, modify, distribute, and sell this software and its * documentation for any purpose is hereby granted without fee, provided that @@ -322,31 +322,24 @@ osx_grab_desktop_image (Screen *screen, Window xwindow, Drawable drawable, Oct 2016: Surprise, this trick no longer works on MacOS 10.12. Sigh. */ - // save our current level so we can restore it later - int oldLevel = [[nsview window] level]; + CGWindowID windowNumber = (CGWindowID) nsview.window.windowNumber; -# if 0 { - FILE *f = fopen("/tmp/log.txt", "w"); CFArrayRef L = CGWindowListCopyWindowInfo (kCGWindowListOptionOnScreenOnly, kCGNullWindowID); - fprintf(f, "# %d\n", [[nsview window] windowNumber]); - - int n = CFArrayGetCount(L); + CFIndex n = CFArrayGetCount(L); for (int i = 0; i < n; i++) { NSDictionary *dict = (NSDictionary *) CFArrayGetValueAtIndex(L, i); - fprintf(f, - "%d \"%s\"\n", - (int) [dict objectForKey:kCGWindowNumber], - [(NSString *) [dict objectForKey:kCGWindowOwnerName] - cStringUsingEncoding:[NSString defaultCStringEncoding]]); + + // loginwindow creates multiple toplevel windows. Grab the lowest one. + if(![([dict objectForKey:(NSString *)kCGWindowOwnerName]) + compare:@"loginwindow"]) { + windowNumber = ((NSNumber *)[dict objectForKey: + (NSString *)kCGWindowNumber]).intValue; + } } - fclose(f); } -#endif - - [[nsview window] setLevel:CGWindowLevelForKey(kCGPopUpMenuWindowLevelKey)]; // Grab a screen shot of those windows below this one // (hey, X11 can't do that!) @@ -354,12 +347,9 @@ osx_grab_desktop_image (Screen *screen, Window xwindow, Drawable drawable, CGImageRef img = CGWindowListCreateImage (cgrect, kCGWindowListOptionOnScreenBelowWindow, - [[nsview window] windowNumber], + windowNumber, kCGWindowImageDefault); - // put us back above the login windows so the screensaver is visible. - [[nsview window] setLevel:oldLevel]; - if (! img) return False; // Render the grabbed CGImage into the Drawable. diff --git a/OSX/iSaverRunner.plist b/OSX/iSaverRunner.plist index 2f7a19a5..fef1480d 100644 --- a/OSX/iSaverRunner.plist +++ b/OSX/iSaverRunner.plist @@ -9,7 +9,7 @@ CFBundleExecutable ${EXECUTABLE_NAME} CFBundleGetInfoString - 5.36 + 5.37 CFBundleIcons CFBundleIcons~ipad @@ -19,21 +19,21 @@ CFBundleInfoDictionaryVersion 6.0 CFBundleLongVersionString - 5.36 + 5.37 CFBundleName ${PRODUCT_NAME} CFBundlePackageType APPL CFBundleShortVersionString - 5.36 + 5.37 CFBundleSignature ???? CFBundleVersion - 5.36 + 5.37 LSRequiresIPhoneOS NSHumanReadableCopyright - 5.36 + 5.37 NSMainNibFile iSaverRunner UIAppFonts @@ -64,7 +64,7 @@ UIInterfaceOrientationLandscapeRight UIViewControllerBasedStatusBarAppearance - + NSPhotoLibraryUsageDescription XScreenSaver displays manipulated versions of your photos. diff --git a/OSX/iSaverRunner.xib b/OSX/iSaverRunner.xib index ac70579e..99bce15d 100644 --- a/OSX/iSaverRunner.xib +++ b/OSX/iSaverRunner.xib @@ -1,8 +1,12 @@ - - + + + + + - - + + + @@ -19,9 +23,14 @@ - + + + + + + diff --git a/OSX/ios-function-table.m b/OSX/ios-function-table.m index 52b8340d..e1a05a43 100644 --- a/OSX/ios-function-table.m +++ b/OSX/ios-function-table.m @@ -1,5 +1,5 @@ /* Generated file, do not edit. - Created: Sat Sep 3 00:49:37 2016 by build-fntable.pl 1.5. + Created: Thu Jun 1 17:53:59 2017 by build-fntable.pl 1.5. */ #import @@ -212,6 +212,7 @@ extern struct xscreensaver_function_table unicrud_xscreensaver_function_table, unknownpleasures_xscreensaver_function_table, vermiculate_xscreensaver_function_table, + vigilance_xscreensaver_function_table, voronoi_xscreensaver_function_table, wander_xscreensaver_function_table, whirlwindwarp_xscreensaver_function_table, @@ -443,6 +444,7 @@ NSDictionary *make_function_table_dict(void) [NSValue valueWithPointer:&unicrud_xscreensaver_function_table], @"unicrud", [NSValue valueWithPointer:&unknownpleasures_xscreensaver_function_table], @"unknownpleasures", [NSValue valueWithPointer:&vermiculate_xscreensaver_function_table], @"vermiculate", + [NSValue valueWithPointer:&vigilance_xscreensaver_function_table], @"vigilance", [NSValue valueWithPointer:&voronoi_xscreensaver_function_table], @"voronoi", [NSValue valueWithPointer:&wander_xscreensaver_function_table], @"wander", [NSValue valueWithPointer:&whirlwindwarp_xscreensaver_function_table], @"whirlwindwarp", diff --git a/OSX/seticon.pl b/OSX/seticon.pl index e62bb291..fb5dc71f 100755 --- a/OSX/seticon.pl +++ b/OSX/seticon.pl @@ -18,7 +18,7 @@ use strict; use File::Temp; my $progname = $0; $progname =~ s@.*/@@g; -my ($version) = ('$Revision: 1.5 $' =~ m/\s(\d[.\d]+)\s/s); +my ($version) = ('$Revision: 1.6 $' =~ m/\s(\d[.\d]+)\s/s); my $verbose = 0; @@ -78,6 +78,12 @@ sub set_icon ($$) { exit ($exit) if $exit; } +sub error($) { + my ($err) = @_; + print STDERR "$progname: $err\n"; + exit 1; +} + sub usage() { print "Usage: $progname -d source [file...]\n"; exit 1; diff --git a/OSX/settings.png b/OSX/settings.png new file mode 100644 index 0000000000000000000000000000000000000000..66066ef96f79fcfb45045879ecf90d4ef71825a1 GIT binary patch literal 3680 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 literal 0 HcmV?d00001 diff --git a/OSX/settings@3x.png b/OSX/settings@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..cdbc568177bb6a46d0f9b6509ad8526b8b4db234 GIT binary patch literal 5617 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 literal 0 HcmV?d00001 diff --git a/OSX/stop@3x.png b/OSX/stop@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..b2ca2aa542750db216b55f3f74e8c0c3aa7a6f3e GIT binary patch literal 1701 zcmdT_`#%#39No+`V!OM;q_k@(ro`{ z8hY8dx2EM8rtTtzq19}$4QsZmKjWUy=bZC7-|uhdm%}{l<8Gj5ss{i74DcRq{;N*> zNeF0F`G?Y1AHe9tUV*sP_&)*=2n2({IyyQK2t-d$PhVdj3WdU8FgP5JKp;#^Ow7#8 z%+1ZwXtb4;6$XQ`x3_n8c6M=b@$m4#j!sot~JOn4FxP zo11(0?%m?z;s*~N)YaA1*Vi{RG&DCivskRw)>aOO)7#tI-`_tlFfcecI5af${{8!j ziHWJHshOD>kw_#Ki|6L%Boc{KD*gWbyF#H@TwGjQT2d;NDwRsDR%kz1B=t~vU_l3^z+2j^q08> znOw27tXxsk%6?z~0PQBcn{!~q$M&K~SJVB5S4k}+QT%72i>dFTYF~rq7#C{SUn7hi zj^#gW;~P(_R6kB`M`jlSZQ0?vmW7r)tR>dZ%0P%T&Oc(;N|$Fn>2w$z=L>?59}6pJ zEX9FO@9`FcCM_aU%GztH>OR$s&^%3_r5|b@m_3}}iuX~B(5_nvxYU8*P@G>(-j&9$ z@vpumo-xj|yAt}Ld_Zx8N=rJ)Mf~9LL-KnmhQo{8Lz3eH-S87*qhszBZzF8uE+x<| ztos-;&t+G%IS%m>L;qcn&hR=!>Xv)Ma&;7OzC6TN_`&NNCw7^vj-`_p(dfKuVc%kU zigq})z3}~@`YLdy1^IwA%aIxNH~yOG+(sLNj<9|D)z8l$8I%}tPp8rqMTw?u1RPy> zZrj7Ll2AcjbtrcWZ(Qa(OTeg^uyKRJR~Pmk+Wx$z#kl3Dq%?kaU@Cqb19&9t}4GEL6{1l=Ok(@4Y|Ycz2AU zd6{@@4VQ_c+BqpqTdax7ojf(CZ_Aw`lk_1*t>TtugZ7K^m-2PGYceYo)0OUN)C$5f zVqWVCo-IGuZQpeJ2?sr{O2Iyoe41UWj%7Nif`Q!7UngCKmc+e0r$1I0l8!!g8cdpg z=LL7Wv<74Dr~n|6@hM(TlE+ns4)cZQH!%l4Y7ZcgIGPC9uRMoA1&rimvJcqeE8?He z0Y#dAZO`A+o{}cvsDL9m(3Iva%$ysO*s?Z@Jk9V;VDv4+l%^_KK5W}o+z6xj8K=4Y z0is|Zf!9^!f5X?xlM--{^44{Yk@as8_ohj>FCF>A7HPNP+F?epfKi>E(yrLPj!OMq zOn)>gAZ^JZ)p0GWa3~C;b5_M#R(0iUSg#TQxIK|EfGr6I)j)2*J}EY}qItir?biE& z&UU{%p}K6K{9Tg_hd+e?#=xF6kIadCCYn4Z%uJxLB0u8z$-*w!P+?X^ z#y3#q9#5ei@MH9ko2HblI~>vIcPGlWg&Vbk2#SU+8*#@{+}y~z5jKIZKpmO&kG)LJ z{=RylGty24?Sqy!*+1J&2+_IGw1!Iv+Ow1PWj1@qX>pGYg%QPvY!Ac!Y54VfXnJKW zxXiCbtJ@Chyo=_Dj(e=ndT32t=yR;2bh^9E?M<`h!?Y#m5QuQ&6t^iyh^!V)>{d6C zaXiP**{_XvR*ZJghj%UWa<)JKTNHROfV9Z zl+Y9E9X>_C3I$i#3KlMT;{J{cDy7|p;ZjwU@3EQVZ&3OZetlj{e(= zC6$4~nHhGrGHm(L(I|lpSRNiN;uP>Nw$y3j!ZdRBo74s^Tmy+I^xdn_*yjbykW5+r zQyEeu%QuxH35f3Y8BXz=b`Hj7QDhTb9UiACI>$S%sZ2vAD#|pUxoZzNBr&^o`(9En Ypgvq +# Copyright © 2006-2017 Jamie Zawinski # # Permission to use, copy, modify, distribute, and sell this software and its # documentation for any purpose is hereby granted without fee, provided that @@ -27,7 +27,7 @@ use IO::Compress::Gzip qw(gzip $GzipError); my ($exec_dir, $progname) = ($0 =~ m@^(.*?)/([^/]+)$@); -my ($version) = ('$Revision: 1.46 $' =~ m/\s(\d[.\d]+)\s/s); +my ($version) = ('$Revision: 1.47 $' =~ m/\s(\d[.\d]+)\s/s); $ENV{PATH} = "/usr/local/bin:$ENV{PATH}"; # for seticon $ENV{PATH} = "/opt/local/bin:$ENV{PATH}"; # for macports wget @@ -445,6 +445,9 @@ sub update($) { "CFBundleLongVersionString",$copyright); $plist = set_plist_key ($filename, $plist, "CFBundleGetInfoString", $info_str); + $plist = set_plist_key ($filename, $plist, + "CFBundleIdentifier", + "org.jwz.xscreensaver." . $app_name); if ($oplist eq $plist) { print STDERR "$progname: $filename: unchanged\n" if ($verbose > 1); diff --git a/OSX/updates.xml b/OSX/updates.xml index 1ad71d50..9c8f7cfb 100644 --- a/OSX/updates.xml +++ b/OSX/updates.xml @@ -7,15 +7,26 @@ https://www.jwz.org/xscreensaver/updates.xml Updates to xscreensaver. en + + Version 5.36 + https://www.jwz.org/xscreensaver/xscreensaver-5.36.dmg + • OSX: loading image files works in `dymaxionmap', `glplanet', `lavalite', `pulsar', `gleidescope' and `extrusion'.
• Several new programs in `m6502'.
• `rotzoomer -mode circle'.
• Better titles in `photopile'.]]>
+ Mon, 10 Oct 2016 19:59:35 -0700 + +
Version 5.35 https://www.jwz.org/xscreensaver/xscreensaver-5.35.dmg - • Added Windows 10 to `bsod'.
• X11: ignore WM_USER_TIME property changes with days-old timestamps. Thanks, KDE.
• MacOS, iOS: Better fonts in 'BSOD' and 'memscroller'.
• MacOS 10.7 or later and iOS 6.0 or later are now required, since Xcode 6 can no longer build executables that work on older OSes.
• Many, many Android improvements.
• iOS: Fixed rotation to work with the new iOS 8+ API.
• X11: `pong' is now playable.]]>
- Mon, 23 May 2016 21:08:11 -0700 + • Added Windows 10 to `bsod'.
• X11: ignore WM_USER_TIME property changes with days-old timestamps. Thanks, KDE.
• MacOS, iOS: Better fonts in `BSOD' and `memscroller'.
• MacOS 10.8 or later and iOS 6.0 or later are now required, since Xcode 6 can no longer build executables that work on older OSes.
• Many, many Android improvements.
• iOS: Fixed rotation to work with the new iOS 8+ API.
• X11: `pong' is now playable.]]>
+ Wed, 01 Jun 2016 09:50:57 -0700
@@ -29,17 +40,6 @@ length="58850776" type="application/octet-stream" /> - - Version 5.33 - https://www.jwz.org/xscreensaver/xscreensaver-5.33.dmg - • Better detection of user activity on modern GNOME systems.
• Sonar now does asynchronous host name resolution.
• Improved Unicode support.
• Updated `webcollage' for recent changes.
• Various minor fixes.]]>
- Thu, 25 Jun 2015 12:45:10 -0700 - -
Version 5.14 https://www.jwz.org/xscreensaver/xscreensaver-5.14.dmg diff --git a/OSX/xscreensaver.xcodeproj/project.pbxproj b/OSX/xscreensaver.xcodeproj/project.pbxproj index 9e35b4f5..479545fd 100644 --- a/OSX/xscreensaver.xcodeproj/project.pbxproj +++ b/OSX/xscreensaver.xcodeproj/project.pbxproj @@ -287,6 +287,7 @@ AF4F10F2143450C300E34F3F /* PBXTargetDependency */, AF46E9ED1CBBA49A00240FBC /* PBXTargetDependency */, AFDA65AA178A54690070D24B /* PBXTargetDependency */, + AF633C1F1EE0BCD300AB33BD /* PBXTargetDependency */, AF0DCA5C0C4CBB4300D76972 /* PBXTargetDependency */, AF39E2BA198A16920064A58D /* PBXTargetDependency */, ); @@ -322,7 +323,14 @@ /* End PBXAggregateTarget section */ /* Begin PBXBuildFile section */ + 5501D1961DBDCC3D00624BE9 /* xshm.c in Sources */ = {isa = PBXBuildFile; fileRef = 5501D1941DBDCC0200624BE9 /* xshm.c */; }; 550FB6001AD64424001A4FA5 /* Media-iOS.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 550FB5FD1AD64424001A4FA5 /* Media-iOS.xcassets */; }; + 55374E321E1582C6005E2362 /* pow2.c in Sources */ = {isa = PBXBuildFile; fileRef = 55374E301E1582AA005E2362 /* pow2.c */; }; + 55374E331E1582D2005E2362 /* pow2.h in Headers */ = {isa = PBXBuildFile; fileRef = 55374E311E1582AA005E2362 /* pow2.h */; }; + 557BF07E1EE90D3B00846DCE /* settings@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 557BF07A1EE90C8B00846DCE /* settings@2x.png */; }; + 557BF07F1EE90D3B00846DCE /* settings@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = 557BF07B1EE90C8B00846DCE /* settings@3x.png */; }; + 557BF0801EE90D3B00846DCE /* stop@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 557BF07C1EE90C8B00846DCE /* stop@2x.png */; }; + 557BF0811EE90D3B00846DCE /* stop@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = 557BF07D1EE90C8B00846DCE /* stop@3x.png */; }; 55EDCB3D1AD498A800251909 /* LaunchScreen.xib in Resources */ = {isa = PBXBuildFile; fileRef = 55EDCB3C1AD498A800251909 /* LaunchScreen.xib */; }; AF012918157C1E4C00C396E1 /* chessmodels.c in Sources */ = {isa = PBXBuildFile; fileRef = AFA55E2309935F2B00F3E977 /* chessmodels.c */; }; AF0839A609930BAC00277BE9 /* atlantis.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC258700988A468000655EE /* atlantis.xml */; }; @@ -374,6 +382,9 @@ AF0FAF2809CA712600EE1051 /* xscreensaver-getimage-file in Resources */ = {isa = PBXBuildFile; fileRef = AF0FAF1209CA712600EE1051 /* xscreensaver-getimage-file */; }; AF0FAF2909CA712600EE1051 /* xscreensaver-getimage-file in Resources */ = {isa = PBXBuildFile; fileRef = AF0FAF1209CA712600EE1051 /* xscreensaver-getimage-file */; }; AF0FAF3C159BAC7C00BCE2F7 /* CoreText.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF0FAF3B159BAC7B00BCE2F7 /* CoreText.framework */; }; + AF142BAE1EE75DBF0005C0A8 /* settings.png in Resources */ = {isa = PBXBuildFile; fileRef = AF142BAC1EE75DBF0005C0A8 /* settings.png */; }; + AF142BAF1EE75DBF0005C0A8 /* stop.png in Resources */ = {isa = PBXBuildFile; fileRef = AF142BAD1EE75DBF0005C0A8 /* stop.png */; }; + AF142BB11EFEFBA20005C0A8 /* Photos.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF142BB01EFEFBA20005C0A8 /* Photos.framework */; }; AF1A17680D6D6EE3008AF328 /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; }; AF1A177F0D6D6F3E008AF328 /* lcdscrub.c in Sources */ = {isa = PBXBuildFile; fileRef = AF1A177E0D6D6F3E008AF328 /* lcdscrub.c */; }; AF1A17810D6D6F62008AF328 /* lcdscrub.xml in Resources */ = {isa = PBXBuildFile; fileRef = AF1A17800D6D6F62008AF328 /* lcdscrub.xml */; }; @@ -1776,6 +1787,21 @@ AF6048FB157C07C600CA21E4 /* jwzgles.c in Sources */ = {isa = PBXBuildFile; fileRef = AF6048F8157C07C600CA21E4 /* jwzgles.c */; }; AF6048FC157C07C600CA21E4 /* jwzgles.h in Headers */ = {isa = PBXBuildFile; fileRef = AF6048F9157C07C600CA21E4 /* jwzgles.h */; }; AF6048FD157C07C600CA21E4 /* jwzglesI.h in Headers */ = {isa = PBXBuildFile; fileRef = AF6048FA157C07C600CA21E4 /* jwzglesI.h */; }; + AF633C081EE0BA6F00AB33BD /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; }; + AF633C0A1EE0BA6F00AB33BD /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; }; + AF633C0B1EE0BA6F00AB33BD /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; }; + AF633C0C1EE0BA6F00AB33BD /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; }; + AF633C0D1EE0BA6F00AB33BD /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; }; + AF633C0E1EE0BA6F00AB33BD /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; }; + AF633C0F1EE0BA6F00AB33BD /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; }; + AF633C101EE0BA6F00AB33BD /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; }; + AF633C1A1EE0BC5500AB33BD /* vigilance.xml in Resources */ = {isa = PBXBuildFile; fileRef = AF633C181EE0BC4900AB33BD /* vigilance.xml */; }; + AF633C1B1EE0BC5A00AB33BD /* vigilance.xml in Resources */ = {isa = PBXBuildFile; fileRef = AF633C181EE0BC4900AB33BD /* vigilance.xml */; }; + AF633C1C1EE0BCA100AB33BD /* vigilance.c in Sources */ = {isa = PBXBuildFile; fileRef = AF633C191EE0BC4A00AB33BD /* vigilance.c */; settings = {COMPILER_FLAGS = "-DUSE_GL"; }; }; + AF633C1D1EE0BCA700AB33BD /* vigilance.c in Sources */ = {isa = PBXBuildFile; fileRef = AF633C191EE0BC4A00AB33BD /* vigilance.c */; }; + AF633C211EE0BDCD00AB33BD /* seccam.c in Sources */ = {isa = PBXBuildFile; fileRef = AF633C201EE0BDCD00AB33BD /* seccam.c */; }; + AF633C221EE0BDCD00AB33BD /* seccam.c in Sources */ = {isa = PBXBuildFile; fileRef = AF633C201EE0BDCD00AB33BD /* seccam.c */; }; + AF633C231EE0BDCD00AB33BD /* seccam.c in Sources */ = {isa = PBXBuildFile; fileRef = AF633C201EE0BDCD00AB33BD /* seccam.c */; }; AF63A7F81AB4EDDB00593C75 /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; }; AF63A7FA1AB4EDDB00593C75 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; }; AF63A7FB1AB4EDDB00593C75 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; }; @@ -4405,6 +4431,20 @@ remoteGlobalIDString = AF5C9AF91A0CCE6E00B0147A; remoteInfo = Cityflow; }; + AF633C031EE0BA6F00AB33BD /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */; + proxyType = 1; + remoteGlobalIDString = AF4808C0098C3B6C00FB32B8; + remoteInfo = jwxyz; + }; + AF633C1E1EE0BCD300AB33BD /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */; + proxyType = 1; + remoteGlobalIDString = AF633C011EE0BA6F00AB33BD; + remoteInfo = Vigilance; + }; AF63A7F31AB4EDDB00593C75 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */; @@ -7227,7 +7267,15 @@ 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = /System/Library/Frameworks/Cocoa.framework; sourceTree = ""; }; 29B97316FDCFA39411CA2CEA /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; 32CA4F630368D1EE00C91783 /* xscreensaver_Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = xscreensaver_Prefix.pch; sourceTree = ""; }; + 5501D1941DBDCC0200624BE9 /* xshm.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = xshm.c; path = utils/xshm.c; sourceTree = ""; }; + 5501D1951DBDCC0200624BE9 /* xshm.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = xshm.h; path = utils/xshm.h; sourceTree = ""; }; 550FB5FD1AD64424001A4FA5 /* Media-iOS.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = "Media-iOS.xcassets"; sourceTree = ""; }; + 55374E301E1582AA005E2362 /* pow2.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = pow2.c; path = utils/pow2.c; sourceTree = ""; }; + 55374E311E1582AA005E2362 /* pow2.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = pow2.h; path = utils/pow2.h; sourceTree = ""; }; + 557BF07A1EE90C8B00846DCE /* settings@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "settings@2x.png"; sourceTree = ""; }; + 557BF07B1EE90C8B00846DCE /* settings@3x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "settings@3x.png"; sourceTree = ""; }; + 557BF07C1EE90C8B00846DCE /* stop@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "stop@2x.png"; sourceTree = ""; }; + 557BF07D1EE90C8B00846DCE /* stop@3x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "stop@3x.png"; sourceTree = ""; }; 55EDCB3C1AD498A800251909 /* LaunchScreen.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = LaunchScreen.xib; sourceTree = ""; }; 8D1107310486CEB800E47090 /* XScreenSaver.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = XScreenSaver.plist; sourceTree = ""; }; AF01294C157D31DD00C396E1 /* iSaverRunner.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = iSaverRunner.plist; sourceTree = SOURCE_ROOT; }; @@ -7255,6 +7303,9 @@ AF0FAF0B09CA6FF900EE1051 /* xscreensaver-text */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.script.perl; name = "xscreensaver-text"; path = "../driver/xscreensaver-text"; sourceTree = ""; }; AF0FAF1209CA712600EE1051 /* xscreensaver-getimage-file */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.script.perl; name = "xscreensaver-getimage-file"; path = "../driver/xscreensaver-getimage-file"; sourceTree = ""; }; AF0FAF3B159BAC7B00BCE2F7 /* CoreText.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreText.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.1.sdk/System/Library/Frameworks/CoreText.framework; sourceTree = DEVELOPER_DIR; }; + AF142BAC1EE75DBF0005C0A8 /* settings.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = settings.png; sourceTree = ""; }; + AF142BAD1EE75DBF0005C0A8 /* stop.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = stop.png; sourceTree = ""; }; + AF142BB01EFEFBA20005C0A8 /* Photos.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Photos.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS10.3.sdk/System/Library/Frameworks/Photos.framework; sourceTree = DEVELOPER_DIR; }; AF14EE300E3CEF1A004CBBD2 /* XScreenSaver.icns */ = {isa = PBXFileReference; lastKnownFileType = image.icns; path = XScreenSaver.icns; sourceTree = ""; }; AF1A17730D6D6EE3008AF328 /* LCDscrub.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = LCDscrub.saver; sourceTree = BUILT_PRODUCTS_DIR; }; AF1A177E0D6D6F3E008AF328 /* lcdscrub.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = lcdscrub.c; path = hacks/lcdscrub.c; sourceTree = ""; }; @@ -7474,6 +7525,10 @@ AF6048F8157C07C600CA21E4 /* jwzgles.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = jwzgles.c; path = ../jwxyz/jwzgles.c; sourceTree = ""; }; AF6048F9157C07C600CA21E4 /* jwzgles.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = jwzgles.h; path = ../jwxyz/jwzgles.h; sourceTree = ""; }; AF6048FA157C07C600CA21E4 /* jwzglesI.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = jwzglesI.h; path = ../jwxyz/jwzglesI.h; sourceTree = ""; }; + AF633C161EE0BA6F00AB33BD /* Vigilance.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Vigilance.saver; sourceTree = BUILT_PRODUCTS_DIR; }; + AF633C181EE0BC4900AB33BD /* vigilance.xml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = vigilance.xml; sourceTree = ""; }; + AF633C191EE0BC4A00AB33BD /* vigilance.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = vigilance.c; path = hacks/glx/vigilance.c; sourceTree = ""; }; + AF633C201EE0BDCD00AB33BD /* seccam.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = seccam.c; path = hacks/glx/seccam.c; sourceTree = ""; }; AF63A8061AB4EDDB00593C75 /* RomanBoy.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RomanBoy.saver; sourceTree = BUILT_PRODUCTS_DIR; }; AF63A8081AB4EF5D00593C75 /* romanboy.xml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = romanboy.xml; sourceTree = ""; }; AF63A8091AB4EF5D00593C75 /* romanboy.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = romanboy.c; path = hacks/glx/romanboy.c; sourceTree = ""; }; @@ -9255,6 +9310,20 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + AF633C091EE0BA6F00AB33BD /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + AF633C0A1EE0BA6F00AB33BD /* libjwxyz.a in Frameworks */, + AF633C0B1EE0BA6F00AB33BD /* ScreenSaver.framework in Frameworks */, + AF633C0C1EE0BA6F00AB33BD /* QuartzCore.framework in Frameworks */, + AF633C0D1EE0BA6F00AB33BD /* Cocoa.framework in Frameworks */, + AF633C0E1EE0BA6F00AB33BD /* Carbon.framework in Frameworks */, + AF633C0F1EE0BA6F00AB33BD /* OpenGL.framework in Frameworks */, + AF633C101EE0BA6F00AB33BD /* libz.dylib in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; AF63A7F91AB4EDDB00593C75 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; @@ -9746,6 +9815,7 @@ AFEB9C3B1590054B003974F3 /* OpenGLES.framework in Frameworks */, AFEB9C3915900514003974F3 /* UIKit.framework in Frameworks */, AF561DF815969C5B007CA5ED /* AssetsLibrary.framework in Frameworks */, + AF142BB11EFEFBA20005C0A8 /* Photos.framework in Frameworks */, AFEB9C3D15900558003974F3 /* Foundation.framework in Frameworks */, AFEB9C401590056A003974F3 /* CoreGraphics.framework in Frameworks */, AF0FAF3C159BAC7C00BCE2F7 /* CoreText.framework in Frameworks */, @@ -11778,7 +11848,6 @@ 080E96DDFE201D6D7F000001 /* libjwxyz */ = { isa = PBXGroup; children = ( - AF561DF515969BC3007CA5ED /* grabclient-ios.m */, AFE1FD410981E32E00F7970E /* InvertedSlider.h */, AFE1FD420981E32E00F7970E /* InvertedSlider.m */, AF2D8F301CEBA10300198014 /* jwxyz-timers.c */, @@ -11793,6 +11862,7 @@ AF6048F8157C07C600CA21E4 /* jwzgles.c */, AF6048F9157C07C600CA21E4 /* jwzgles.h */, AF6048FA157C07C600CA21E4 /* jwzglesI.h */, + AF561DF515969BC3007CA5ED /* grabclient-ios.m */, AF9D468E09B51567006E59CF /* grabclient-osx.m */, AFE1FD470981E32E00F7970E /* PrefsReader.h */, AFE1FD480981E32E00F7970E /* PrefsReader.m */, @@ -12066,6 +12136,7 @@ AFEE10811D15EB0800AAC8F7 /* CubeStack.saver */, AFEE10A01D17E20B00AAC8F7 /* Splodesic.saver */, AF1B0FBC1D7AB4740011DBE4 /* Hexstrut.saver */, + AF633C161EE0BA6F00AB33BD /* Vigilance.saver */, ); name = Products; path = ..; @@ -12107,6 +12178,12 @@ AFEC68361BD6CA85004C1B64 /* OCRAStd.otf */, AFEC68381BD6CDF9004C1B64 /* YearlReg.ttf */, AFC43E731C68364B00C89999 /* PxPlus_IBM_VGA8.ttf */, + AF142BAC1EE75DBF0005C0A8 /* settings.png */, + 557BF07A1EE90C8B00846DCE /* settings@2x.png */, + 557BF07B1EE90C8B00846DCE /* settings@3x.png */, + AF142BAD1EE75DBF0005C0A8 /* stop.png */, + 557BF07C1EE90C8B00846DCE /* stop@2x.png */, + 557BF07D1EE90C8B00846DCE /* stop@3x.png */, ); name = Resources; sourceTree = ""; @@ -12114,6 +12191,7 @@ 29B97323FDCFA39411CA2CEA /* Frameworks */ = { isa = PBXGroup; children = ( + AF142BB01EFEFBA20005C0A8 /* Photos.framework */, AF1ADA171850180E00932759 /* Sparkle.framework */, AF78377C17DBA85D003B9FC0 /* libz.dylib */, AF78369617DB9F25003B9FC0 /* libz.dylib */, @@ -12537,6 +12615,8 @@ AF083A5D099312DB00277BE9 /* tunnel_draw.h */, AF46E9E71CBBA3F900240FBC /* unicrud.c */, AFDA65A4178A541A0070D24B /* unknownpleasures.c */, + AF633C191EE0BC4A00AB33BD /* vigilance.c */, + AF633C201EE0BDCD00AB33BD /* seccam.c */, AF0DCA5F0C4CBB7300D76972 /* voronoi.c */, AF0839AD09930C4900277BE9 /* whale.c */, AF39E2A1198A13F50064A58D /* winduprobot.c */, @@ -12778,6 +12858,7 @@ AFC2592A0988A469000655EE /* vines.xml */, AF46E9E61CBBA3F900240FBC /* unicrud.xml */, AFDA65A3178A541A0070D24B /* unknownpleasures.xml */, + AF633C181EE0BC4900AB33BD /* vigilance.xml */, AF0DCA610C4CBB8E00D76972 /* voronoi.xml */, AFC2592B0988A469000655EE /* wander.xml */, AFC2592C0988A469000655EE /* webcollage.xml */, @@ -12830,6 +12911,8 @@ AFA55865099324D800F3E977 /* minixpm.h */, AFA55A93099336D800F3E977 /* normals.c */, AFA55A94099336D800F3E977 /* normals.h */, + 55374E301E1582AA005E2362 /* pow2.c */, + 55374E311E1582AA005E2362 /* pow2.h */, AF4775BE099D9E79001F091E /* resources.c */, AF4775BF099D9E79001F091E /* resources.h */, AF480EB7098F646400FB32B8 /* rotator.c */, @@ -12868,6 +12951,8 @@ AF975C92099C929800B05160 /* xpm-pixmap.h */, AF0839AE09930C4900277BE9 /* xpm-ximage.c */, AF0839AF09930C4900277BE9 /* xpm-ximage.h */, + 5501D1941DBDCC0200624BE9 /* xshm.c */, + 5501D1951DBDCC0200624BE9 /* xshm.h */, AFE1FD5B0981E3CB00F7970E /* yarandom.c */, AFE1FD5C0981E3CB00F7970E /* yarandom.h */, ); @@ -12893,6 +12978,7 @@ isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( + 55374E331E1582D2005E2362 /* pow2.h in Headers */, AFA55867099324D800F3E977 /* minixpm.h in Headers */, AFA55A540993353500F3E977 /* gllist.h in Headers */, AFA55A96099336D800F3E977 /* normals.h in Headers */, @@ -14425,6 +14511,26 @@ productReference = AF5C9B0D1A0CCE6E00B0147A /* Cityflow.saver */; productType = "com.apple.product-type.bundle"; }; + AF633C011EE0BA6F00AB33BD /* Vigilance */ = { + isa = PBXNativeTarget; + buildConfigurationList = AF633C131EE0BA6F00AB33BD /* Build configuration list for PBXNativeTarget "Vigilance" */; + buildPhases = ( + AF633C041EE0BA6F00AB33BD /* Resources */, + AF633C061EE0BA6F00AB33BD /* Sources */, + AF633C091EE0BA6F00AB33BD /* Frameworks */, + AF633C111EE0BA6F00AB33BD /* Rez */, + AF633C121EE0BA6F00AB33BD /* Run Update Info Plist */, + ); + buildRules = ( + ); + dependencies = ( + AF633C021EE0BA6F00AB33BD /* PBXTargetDependency */, + ); + name = Vigilance; + productName = DangerBall; + productReference = AF633C161EE0BA6F00AB33BD /* Vigilance.saver */; + productType = "com.apple.product-type.bundle"; + }; AF63A7F11AB4EDDB00593C75 /* RomanBoy */ = { isa = PBXNativeTarget; buildConfigurationList = AF63A8031AB4EDDB00593C75 /* Build configuration list for PBXNativeTarget "RomanBoy" */; @@ -18038,7 +18144,7 @@ 29B97313FDCFA39411CA2CEA /* Project object */ = { isa = PBXProject; attributes = { - LastUpgradeCheck = 0800; + LastUpgradeCheck = 0830; TargetAttributes = { AF08398F09930B6B00277BE9 = { DevelopmentTeam = 4627ATJELP; @@ -18280,6 +18386,9 @@ AF5C9AF91A0CCE6E00B0147A = { DevelopmentTeam = 4627ATJELP; }; + AF633C011EE0BA6F00AB33BD = { + DevelopmentTeam = 4627ATJELP; + }; AF63A7F11AB4EDDB00593C75 = { DevelopmentTeam = 4627ATJELP; }; @@ -19081,6 +19190,7 @@ AF3581FB143330F900E09C51 /* TronBit */, AF46E9CF1CBBA2B300240FBC /* Unicrud */, AFDA658E178A52B70070D24B /* Unknown Pleasures */, + AF633C011EE0BA6F00AB33BD /* Vigilance */, AF0DCA420C4CBB0D00D76972 /* Voronoi */, AF39E282198A11F60064A58D /* WindupRobot */, AF137D410F075C9B004DE3B2 /* Obsolete */, @@ -19710,6 +19820,14 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + AF633C041EE0BA6F00AB33BD /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + AF633C1B1EE0BC5A00AB33BD /* vigilance.xml in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; AF63A7F41AB4EDDB00593C75 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; @@ -20018,6 +20136,12 @@ AFEC68371BD6CA85004C1B64 /* OCRAStd.otf in Resources */, AFC43E741C68364B00C89999 /* PxPlus_IBM_VGA8.ttf in Resources */, AFEC68391BD6CDF9004C1B64 /* YearlReg.ttf in Resources */, + AF142BAE1EE75DBF0005C0A8 /* settings.png in Resources */, + 557BF07E1EE90D3B00846DCE /* settings@2x.png in Resources */, + 557BF07F1EE90D3B00846DCE /* settings@3x.png in Resources */, + AF142BAF1EE75DBF0005C0A8 /* stop.png in Resources */, + 557BF0801EE90D3B00846DCE /* stop@2x.png in Resources */, + 557BF0811EE90D3B00846DCE /* stop@3x.png in Resources */, AF918AB4158FC53D002B5D1E /* abstractile.xml in Resources */, AF918AB5158FC53D002B5D1E /* anemone.xml in Resources */, AF918AB6158FC53D002B5D1E /* anemotaxis.xml in Resources */, @@ -20219,9 +20343,10 @@ AF918B7D158FC53E002B5D1E /* tronbit.xml in Resources */, AF918B7E158FC53E002B5D1E /* truchet.xml in Resources */, AF918B7F158FC53E002B5D1E /* twang.xml in Resources */, - AF918B80158FC53E002B5D1E /* vermiculate.xml in Resources */, AF46E9EA1CBBA42F00240FBC /* unicrud.xml in Resources */, AFDA65A6178A541A0070D24B /* unknownpleasures.xml in Resources */, + AF918B80158FC53E002B5D1E /* vermiculate.xml in Resources */, + AF633C1A1EE0BC5500AB33BD /* vigilance.xml in Resources */, AF918B83158FC53E002B5D1E /* voronoi.xml in Resources */, AF918B84158FC53E002B5D1E /* wander.xml in Resources */, AF918B86158FC53E002B5D1E /* whirlwindwarp.xml in Resources */, @@ -21918,6 +22043,13 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + AF633C111EE0BA6F00AB33BD /* Rez */ = { + isa = PBXRezBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; AF63A8011AB4EDDB00593C75 /* Rez */ = { isa = PBXRezBuildPhase; buildActionMask = 2147483647; @@ -23418,6 +23550,21 @@ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX"; showEnvVarsInLog = 0; }; + AF633C121EE0BA6F00AB33BD /* Run Update Info Plist */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "Run Update Info Plist"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX"; + showEnvVarsInLog = 0; + }; AF63A8021AB4EDDB00593C75 /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; @@ -27608,7 +27755,9 @@ AF4808C7098C3BE600FB32B8 /* hsv.c in Sources */, AFBF893E0E41D930006A2D66 /* fps.c in Sources */, AFBF89AF0E423FC3006A2D66 /* fps-gl.c in Sources */, + 5501D1961DBDCC3D00624BE9 /* xshm.c in Sources */, AF4808C8098C3BE800FB32B8 /* InvertedSlider.m in Sources */, + AF633C211EE0BDCD00AB33BD /* seccam.c in Sources */, AF4808C9098C3BEC00FB32B8 /* jwxyz.m in Sources */, AF4808CA098C3BEE00FB32B8 /* PrefsReader.m in Sources */, AFDA11251934424D003D397F /* aligned_malloc.c in Sources */, @@ -27648,6 +27797,7 @@ AFC75930158D9A7A00C5458E /* textclient-ios.m in Sources */, AF561DF615969BC3007CA5ED /* grabclient-ios.m in Sources */, CE9289D319BD00E300961F22 /* async_netdb.c in Sources */, + 55374E321E1582C6005E2362 /* pow2.c in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -27749,6 +27899,16 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + AF633C061EE0BA6F00AB33BD /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + AF633C1D1EE0BCA700AB33BD /* vigilance.c in Sources */, + AF633C081EE0BA6F00AB33BD /* XScreenSaverSubclass.m in Sources */, + AF633C221EE0BDCD00AB33BD /* seccam.c in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; AF63A7F61AB4EDDB00593C75 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; @@ -28330,6 +28490,7 @@ AF918A8D158FC417002B5D1E /* s1_6.c in Sources */, AF918A8E158FC417002B5D1E /* s1_b.c in Sources */, AF918A8F158FC417002B5D1E /* sballs.c in Sources */, + AF633C231EE0BDCD00AB33BD /* seccam.c in Sources */, AF918A90158FC417002B5D1E /* shark.c in Sources */, AF918A91158FC417002B5D1E /* sierpinski3d.c in Sources */, AF918A92158FC417002B5D1E /* skytentacles.c in Sources */, @@ -28374,6 +28535,7 @@ AF918AB1158FC47B002B5D1E /* tunnel_draw.c in Sources */, AF46E9EB1CBBA43B00240FBC /* unicrud.c in Sources */, AFDA65A8178A541A0070D24B /* unknownpleasures.c in Sources */, + AF633C1C1EE0BCA100AB33BD /* vigilance.c in Sources */, AF918AB2158FC47B002B5D1E /* voronoi.c in Sources */, AF918AB3158FC47B002B5D1E /* whale.c in Sources */, AF39E2B8198A15EE0064A58D /* winduprobot.c in Sources */, @@ -30320,6 +30482,16 @@ target = AF5C9AF91A0CCE6E00B0147A /* Cityflow */; targetProxy = AF5C9B151A0CCF8000B0147A /* PBXContainerItemProxy */; }; + AF633C021EE0BA6F00AB33BD /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = AF4808C0098C3B6C00FB32B8 /* jwxyz */; + targetProxy = AF633C031EE0BA6F00AB33BD /* PBXContainerItemProxy */; + }; + AF633C1F1EE0BCD300AB33BD /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = AF633C011EE0BA6F00AB33BD /* Vigilance */; + targetProxy = AF633C1E1EE0BCD300AB33BD /* PBXContainerItemProxy */; + }; AF63A7F21AB4EDDB00593C75 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = AF4808C0098C3B6C00FB32B8 /* jwxyz */; @@ -33507,6 +33679,28 @@ }; name = Release; }; + AF633C141EE0BA6F00AB33BD /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = ( + "USE_GL=1", + "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)", + ); + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Debug; + }; + AF633C151EE0BA6F00AB33BD /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS = ( + "USE_GL=1", + "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)", + ); + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Release; + }; AF63A8041AB4EDDB00593C75 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { @@ -33537,6 +33731,7 @@ BUNDLE_IDENTIFIER = "org.jwz.${PROJECT_NAME:rfc1034identifier}.apple2"; CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COMBINE_HIDPI_IMAGES = NO; GCC_PREPROCESSOR_DEFINITIONS = ( "USE_IPHONE=1", "APPLE2_ONLY=1", @@ -33561,6 +33756,7 @@ BUNDLE_IDENTIFIER = "org.jwz.${PROJECT_NAME:rfc1034identifier}.apple2"; CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COMBINE_HIDPI_IMAGES = NO; GCC_PREPROCESSOR_DEFINITIONS = ( "USE_IPHONE=1", "APPLE2_ONLY=1", @@ -33585,6 +33781,7 @@ BUNDLE_IDENTIFIER = "org.jwz.${PROJECT_NAME:rfc1034identifier}.phosphor"; CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COMBINE_HIDPI_IMAGES = NO; GCC_PREPROCESSOR_DEFINITIONS = ( "USE_IPHONE=1", "PHOSPHOR_ONLY=1", @@ -33609,6 +33806,7 @@ BUNDLE_IDENTIFIER = "org.jwz.${PROJECT_NAME:rfc1034identifier}.phosphor"; CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COMBINE_HIDPI_IMAGES = NO; GCC_PREPROCESSOR_DEFINITIONS = ( "USE_IPHONE=1", "PHOSPHOR_ONLY=1", @@ -33633,6 +33831,7 @@ BUNDLE_IDENTIFIER = "org.jwz.${PROJECT_NAME:rfc1034identifier}.testX11"; CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COMBINE_HIDPI_IMAGES = NO; GCC_PREPROCESSOR_DEFINITIONS = ( "USE_IPHONE=1", "TESTX11_ONLY=1", @@ -33657,6 +33856,7 @@ BUNDLE_IDENTIFIER = "org.jwz.${PROJECT_NAME:rfc1034identifier}.testX11"; CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COMBINE_HIDPI_IMAGES = NO; GCC_PREPROCESSOR_DEFINITIONS = ( "USE_IPHONE=1", "TESTX11_ONLY=1", @@ -34157,6 +34357,7 @@ BUNDLE_IDENTIFIER = "org.jwz.${PROJECT_NAME:rfc1034identifier}"; CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COMBINE_HIDPI_IMAGES = NO; GCC_PREPROCESSOR_DEFINITIONS = ( "USE_IPHONE=1", "$(inherited)", @@ -34180,6 +34381,7 @@ BUNDLE_IDENTIFIER = "org.jwz.${PROJECT_NAME:rfc1034identifier}"; CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COMBINE_HIDPI_IMAGES = NO; GCC_PREPROCESSOR_DEFINITIONS = ( "USE_IPHONE=1", "$(inherited)", @@ -34650,12 +34852,14 @@ AFA3393E0B058505002B0E7D /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { + COPY_PHASE_STRIP = NO; }; name = Debug; }; AFA3393F0B058505002B0E7D /* Release */ = { isa = XCBuildConfiguration; buildSettings = { + COPY_PHASE_STRIP = NO; }; name = Release; }; @@ -35814,6 +36018,7 @@ AFBFE75C178642DC00432B21 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { + COPY_PHASE_STRIP = NO; INFOPLIST_FILE = SaverRunner.plist; INSTALL_PATH = "$(HOME)/Applications"; "OTHER_CFLAGS[sdk=macosx*]" = ""; @@ -35825,6 +36030,7 @@ AFBFE75D178642DC00432B21 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { + COPY_PHASE_STRIP = NO; INFOPLIST_FILE = SaverRunner.plist; INSTALL_PATH = "$(HOME)/Applications"; "OTHER_CFLAGS[sdk=macosx*]" = ""; @@ -35836,6 +36042,7 @@ AFBFE77C178647FE00432B21 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { + COPY_PHASE_STRIP = NO; INFOPLIST_FILE = SaverRunner.plist; INSTALL_PATH = "$(HOME)/Applications"; "OTHER_CFLAGS[sdk=macosx*]" = ""; @@ -35847,6 +36054,7 @@ AFBFE77D178647FE00432B21 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { + COPY_PHASE_STRIP = NO; INFOPLIST_FILE = SaverRunner.plist; INSTALL_PATH = "$(HOME)/Applications"; "OTHER_CFLAGS[sdk=macosx*]" = ""; @@ -36608,13 +36816,24 @@ ARCHS = "$(ARCHS_STANDARD_32_64_BIT)"; BUNDLE_IDENTIFIER = "org.jwz.${PROJECT_NAME:rfc1034identifier}.${PRODUCT_NAME:rfc1034identifier}"; CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = NO; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphonesimulator*]" = "iPhone Developer"; - "CODE_SIGN_IDENTITY[sdk=macosx*]" = "Mac Developer"; + "CODE_SIGN_IDENTITY[sdk=macosx*]" = "Developer ID Application"; COMBINE_HIDPI_IMAGES = YES; DEVELOPMENT_TEAM = 4627ATJELP; + ENABLE_STRICT_OBJC_MSGSEND = YES; ENABLE_TESTABILITY = YES; + GCC_NO_COMMON_BLOCKS = YES; GCC_OPTIMIZATION_LEVEL = 0; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = xscreensaver_Prefix.pch; @@ -36650,8 +36869,8 @@ GCC_WARN_FOUR_CHARACTER_CONSTANTS = YES; GCC_WARN_INITIALIZER_NOT_FULLY_BRACKETED = YES; GCC_WARN_MISSING_PARENTHESES = YES; - GCC_WARN_SHADOW = NO; GCC_WARN_TYPECHECK_CALLS_TO_PRINTF = YES; + GCC_WARN_UNDECLARED_SELECTOR = YES; GCC_WARN_UNINITIALIZED_AUTOS = YES; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_LABEL = YES; @@ -36666,7 +36885,7 @@ ); INFOPLIST_FILE = XScreenSaver.plist; INSTALL_PATH = "$(HOME)/Library/Screen Savers"; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; + IPHONEOS_DEPLOYMENT_TARGET = 9.3; LIBRARY_SEARCH_PATHS = "$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)"; ONLY_ACTIVE_ARCH = YES; OTHER_CFLAGS = ""; @@ -36691,13 +36910,24 @@ ARCHS = "$(ARCHS_STANDARD_32_64_BIT)"; BUNDLE_IDENTIFIER = "org.jwz.${PROJECT_NAME:rfc1034identifier}.${PRODUCT_NAME:rfc1034identifier}"; CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = NO; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution: Jamie Zawinski (4627ATJELP)"; "CODE_SIGN_IDENTITY[sdk=iphonesimulator*]" = "iPhone Distribution: Jamie Zawinski (4627ATJELP)"; "CODE_SIGN_IDENTITY[sdk=macosx*]" = "Developer ID Application: Jamie Zawinski (4627ATJELP)"; COMBINE_HIDPI_IMAGES = YES; DEVELOPMENT_TEAM = 4627ATJELP; + ENABLE_STRICT_OBJC_MSGSEND = YES; GCC_GENERATE_DEBUGGING_SYMBOLS = NO; + GCC_NO_COMMON_BLOCKS = YES; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = xscreensaver_Prefix.pch; GCC_PREPROCESSOR_DEFINITIONS = ( @@ -36731,8 +36961,8 @@ GCC_WARN_FOUR_CHARACTER_CONSTANTS = YES; GCC_WARN_INITIALIZER_NOT_FULLY_BRACKETED = YES; GCC_WARN_MISSING_PARENTHESES = YES; - GCC_WARN_SHADOW = NO; GCC_WARN_TYPECHECK_CALLS_TO_PRINTF = YES; + GCC_WARN_UNDECLARED_SELECTOR = YES; GCC_WARN_UNINITIALIZED_AUTOS = YES; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_LABEL = YES; @@ -36747,7 +36977,7 @@ ); INFOPLIST_FILE = XScreenSaver.plist; INSTALL_PATH = "$(HOME)/Library/Screen Savers"; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; + IPHONEOS_DEPLOYMENT_TARGET = 9.3; LIBRARY_SEARCH_PATHS = "$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)"; LLVM_LTO = NO; "LLVM_LTO[sdk=macosx*]" = NO; @@ -37502,6 +37732,15 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; + AF633C131EE0BA6F00AB33BD /* Build configuration list for PBXNativeTarget "Vigilance" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + AF633C141EE0BA6F00AB33BD /* Debug */, + AF633C151EE0BA6F00AB33BD /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; AF63A8031AB4EDDB00593C75 /* Build configuration list for PBXNativeTarget "RomanBoy" */ = { isa = XCConfigurationList; buildConfigurations = ( diff --git a/README b/README index 8f80f71d..333b464f 100644 --- a/README +++ b/README @@ -45,6 +45,13 @@ XScreenSaver has an extensive manual -- please read it! =============================================================================== +5.37 * New hack, `vigilance'. + * Added Mac Software Update and VMware to `bsod'. + * OSX: Grabbing the desktop works again. + * OSX: Pinch to zoom. + * Android: Both Daydreams and Live Wallpapers are implemented. + * Updated `webcollage' for recent changes. + * Various bug fixes. 5.36 * New hacks, `discoball', `cubetwist', `cubestack', `splodesic' and `hexstrut'. * OSX: loading image files works in `dymaxionmap', `glplanet', diff --git a/android/Makefile b/android/Makefile index 35c24ec2..7549411b 100644 --- a/android/Makefile +++ b/android/Makefile @@ -97,6 +97,7 @@ export ANDROID_HACKS= \ glschool \ glsnake \ gltext \ + goop \ grav \ greynetic \ helix \ @@ -141,6 +142,7 @@ export ANDROID_HACKS= \ raverhoop \ rd-bomb \ ripples \ + rocks \ romanboy \ rorschach \ rotzoomer \ @@ -169,6 +171,7 @@ export ANDROID_HACKS= \ twang \ unknownpleasures \ vermiculate \ + vigilance \ voronoi \ wander \ whirlwindwarp \ @@ -211,7 +214,6 @@ ANDROID_TODO= \ glhanoi \ glplanet \ glslideshow \ - goop \ halftone \ halo \ hypertorus \ @@ -235,7 +237,6 @@ ANDROID_TODO= \ pulsar \ qix \ queens \ - rocks \ skytentacles \ slip \ speedmine \ @@ -323,6 +324,7 @@ echo_tarfiles: -o -name '*.keystore' \ -o -name '*_dream.xml' \ -o -name '*_settings.xml' \ + -o -name '*_wallpaper.xml' \ -o -name AndroidManifest.xml \ -o -name strings.xml \ -o -name settings.xml \ diff --git a/android/README b/android/README index 78fda15d..fb7a4da9 100644 --- a/android/README +++ b/android/README @@ -190,7 +190,6 @@ TODO list, and known bugs: glhanoi crashes emulator, but a few seconds in glplanet crashes emulator glslideshow images - goop polygons halftone XFillArc crash halo XOR hypertorus crashes emulator @@ -206,7 +205,7 @@ TODO list, and known bugs: mountain polygons munch XOR noseguy pixmaps - pacman launches really slowly; fails at loading XPMs + pacman launches really slowly pedal polygons phosphor pixmaps photopile pixmaps @@ -217,7 +216,6 @@ TODO list, and known bugs: pulsar crashes emulator qix polygons queens crashes emulator - rocks polygons skytentacles crashes emulator slip pixmaps sonar crashes emulator diff --git a/android/project/xscreensaver/jni/Android.mk b/android/project/xscreensaver/jni/Android.mk index d1f00b74..9f545400 100644 --- a/android/project/xscreensaver/jni/Android.mk +++ b/android/project/xscreensaver/jni/Android.mk @@ -44,6 +44,7 @@ LOCAL_SRC_FILES += \ utils/hsv.c \ utils/logo.c \ utils/minixpm.c \ + utils/pow2.c \ utils/resources.c \ utils/spline.c \ utils/textclient-mobile.c \ @@ -51,6 +52,7 @@ LOCAL_SRC_FILES += \ utils/usleep.c \ utils/utf8wc.c \ utils/xft.c \ + utils/xshm.c \ utils/yarandom.c \ # The source files of all of the currently active hacks: @@ -100,6 +102,7 @@ LOCAL_SRC_FILES += \ hacks/glx/s1_5.c \ hacks/glx/s1_6.c \ hacks/glx/s1_b.c \ + hacks/glx/seccam.c \ hacks/glx/shark.c \ hacks/glx/sonar-sim.c \ hacks/glx/sonar-icmp.c \ @@ -128,7 +131,7 @@ LOCAL_SRC_FILES += \ hacks/glx/tunnel_draw.c \ hacks/glx/whale.c \ -LOCAL_LDLIBS := -lGLESv1_CM -ldl -llog -lEGL +LOCAL_LDLIBS := -lGLESv1_CM -ldl -llog -lEGL -latomic LOCAL_C_INCLUDES := \ $(LOCAL_PATH) \ diff --git a/android/project/xscreensaver/res/layout-land/activity_xscreensaver.xml b/android/project/xscreensaver/res/layout-land/activity_xscreensaver.xml new file mode 100644 index 00000000..24f33e0b --- /dev/null +++ b/android/project/xscreensaver/res/layout-land/activity_xscreensaver.xml @@ -0,0 +1,59 @@ + + + + + + + + + + + + + + +