From aa75c7476aeaa84cf3abc192b376a8b03c325213 Mon Sep 17 00:00:00 2001 From: Zygo Blaxell Date: Sun, 16 Oct 2016 22:50:43 -0400 Subject: [PATCH] From http://www.jwz.org/xscreensaver/xscreensaver-5.35.tar.gz -rw-r--r-- 1 zblaxell zblaxell 10502468 May 24 14:06 xscreensaver-5.35.tar.gz 2918e9db7a6d24189c5bcc401cec2d3adbee644b xscreensaver-5.35.tar.gz --- Makefile.in | 24 +- OSX/InvertedSlider.m | 6 +- OSX/LaunchScreen.xib | 4 +- OSX/Makefile | 83 +- .../AppIcon.appiconset/Contents.json | 37 +- .../AppIcon.appiconset/iSaverRunner100.png | Bin 0 -> 3261 bytes .../AppIcon.appiconset/iSaverRunner167.png | Bin 0 -> 10232 bytes .../AppIcon.appiconset/iSaverRunner180.png | Bin 0 -> 6341 bytes .../AppIcon.appiconset/iSaverRunner40.png | Bin 0 -> 1106 bytes .../AppIcon.appiconset/iSaverRunner58.png | Bin 0 -> 1673 bytes .../AppIcon.appiconset/iSaverRunner80.png | Bin 0 -> 2432 bytes .../AppIcon.appiconset/iSaverRunner87.png | Bin 0 -> 2766 bytes OSX/Media-iOS.xcassets/Contents.json | 6 + .../Image.imageset/Contents.json | 20 + .../LaunchImage.launchimage/1242x2208.png | Bin 0 -> 607 bytes .../LaunchImage.launchimage/640x1136.png | Bin 0 -> 360 bytes .../LaunchImage.launchimage/640x960.png | Bin 0 -> 346 bytes .../LaunchImage.launchimage/750x1334.png | Bin 0 -> 394 bytes .../LaunchImage.launchimage/Contents.json | 27 +- .../Default-568h@2x.png | Bin 18594 -> 0 bytes OSX/PrefsReader.m | 6 +- OSX/PxPlus_IBM_VGA8.ttf | Bin 0 -> 70956 bytes OSX/README | 27 +- OSX/SaverListController.m | 7 +- OSX/SaverRunner.h | 16 +- OSX/SaverRunner.m | 508 +-- OSX/SaverRunner.plist | 12 +- OSX/Updater.plist | 18 +- OSX/XScreenSaver.plist | 6 +- OSX/XScreenSaverConfigSheet.m | 104 +- OSX/XScreenSaverGLView.h | 3 +- OSX/XScreenSaverGLView.m | 120 +- OSX/XScreenSaverView.h | 49 +- OSX/XScreenSaverView.m | 1203 ++++--- OSX/bindist.rtf | 10 +- OSX/build-fntable.pl | 11 +- OSX/fuzztest.sh | 54 + OSX/iSaverRunner.plist | 13 +- OSX/iSaverRunner.xib | 203 +- OSX/installer.rtf | 4 +- OSX/ios-function-table.m | 429 +-- OSX/osxgrabscreen.m | 2 +- OSX/seticon.pl | 102 + OSX/textclient-iOS.m | 71 + OSX/update-info-plist.pl | 93 +- OSX/update-thumbnail.pl | 166 - OSX/updates.pl | 4 +- OSX/updates.xml | 54 +- OSX/xscreensaver.xcconfig | 12 +- OSX/xscreensaver.xcodeproj/project.pbxproj | 1881 +++++++--- README | 22 +- aclocal.m4 | 35 +- android/Makefile | 400 ++- android/README | 219 +- .../XScreenSaverDaydream.java.in | 28 +- android/XScreenSaverGLView.c | 84 - android/XScreenSaverSettings.java.in | 24 + android/XScreenSaverView.c | 425 --- android/XScreenSaverWallpaper.java.in | 26 + android/generate_files.pl | 1723 --------- android/glue.c | 306 -- android/grabscreen-android.c | 24 + android/jwxyz.c | 467 --- android/jwxyz.h | 4 - .../GLWallpaperService/AndroidManifest.xml | 12 - android/project/GLWallpaperService/LICENSE | 202 -- android/project/GLWallpaperService/NOTICE | 21 - .../project/GLWallpaperService/build.gradle | 43 - android/project/GLWallpaperService/build.xml | 92 - .../GLWallpaperService/default.properties | 12 - .../GLWallpaperService/project.properties | 15 - .../GLWallpaperService/readme-contribute.txt | 127 - android/project/GLWallpaperService/readme.txt | 41 - .../res/drawable-hdpi/icon.png | Bin 4999 -> 0 bytes .../res/drawable-ldpi/icon.png | Bin 2134 -> 0 bytes .../res/drawable-mdpi/icon.png | Bin 3039 -> 0 bytes .../GLWallpaperService/res/layout/main.xml | 12 - .../GLWallpaperService/res/values/strings.xml | 5 - .../GLWallpaperService.java | 357 -- android/project/build.gradle | 10 + android/project/settings.gradle | 1 - .../project/xscreensaver/AndroidManifest.xml | 75 - .../xscreensaver/assets/fonts/OCRAStd.otf | 1 + .../assets/fonts/PxPlus_IBM_VGA8.ttf | 1 + .../xscreensaver/assets/fonts/YearlReg.ttf | 1 + android/project/xscreensaver/build.gradle | 50 +- android/project/xscreensaver/jni/Android.mk | 173 +- .../project/xscreensaver/jni/Application.mk | 6 +- .../project/xscreensaver/project.properties | 2 +- .../xscreensaver/res/drawable/bouncingcow.png | Bin 25855 -> 0 bytes .../xscreensaver/res/drawable/glhanoi.png | Bin 29690 -> 0 bytes .../xscreensaver/res/drawable/glmatrix.png | Bin 33474 -> 0 bytes .../xscreensaver/res/drawable/hilbert.png | Bin 57930 -> 0 bytes .../xscreensaver/res/drawable/hypertorus.png | Bin 33601 -> 0 bytes .../xscreensaver/res/drawable/sproingies.png | Bin 32382 -> 0 bytes .../xscreensaver/res/drawable/stonerview.png | Bin 14689 -> 0 bytes .../res/drawable/superquadrics.png | Bin 12708 -> 0 bytes .../res/drawable/unknownpleasures.png | Bin 12767 -> 0 bytes .../res/layout/activity_xscreensaver.xml | 16 + .../project/xscreensaver/res/layout/main.xml | 5 - .../res/layout/preference_blurb.xml | 45 + .../res/layout/slider_preference.xml | 60 + .../res/layout/slider_preference_dialog.xml | 29 - .../project/xscreensaver/res/values/attrs.xml | 13 - .../project/xscreensaver/res/values/items.xml | 17 - .../xscreensaver/res/values/settings.xml | 207 -- .../xscreensaver/res/values/strings.xml | 132 - .../xscreensaver/res/xml/bouncingcow.xml | 5 - .../res/xml/bouncingcow_settings.xml | 19 - .../project/xscreensaver/res/xml/glhanoi.xml | 5 - .../xscreensaver/res/xml/glhanoi_settings.xml | 39 - .../xscreensaver/res/xml/hypertorus.xml | 5 - .../res/xml/hypertorus_settings.xml | 78 - .../xscreensaver/res/xml/sproingies.xml | 5 - .../res/xml/sproingies_settings.xml | 20 - .../xscreensaver/res/xml/stonerview.xml | 5 - .../res/xml/stonerview_settings.xml | 14 - .../xscreensaver/res/xml/superquadrics.xml | 5 - .../res/xml/superquadrics_settings.xml | 13 - .../xscreensaver/res/xml/unknownpleasures.xml | 5 - .../res/xml/unknownpleasures_settings.xml | 20 - .../src/org/jwz/xscreensaver/ARenderer.java | 132 - .../org/jwz/xscreensaver/BufferFactory.java | 46 - .../src/org/jwz/xscreensaver/CallNative.java | 25 - .../jwz/xscreensaver/SliderPreference.java | 287 +- .../src/org/jwz/xscreensaver/TTFAnalyzer.java | 153 + .../xscreensaver/XScreenSaverActivity.java | 57 + .../org/jwz/xscreensaver/XScreenSaverApp.java | 22 + .../xscreensaver/XScreenSaverDaydream.java | 289 ++ .../xscreensaver/XScreenSaverRenderer.java | 166 + .../xscreensaver/XScreenSaverSettings.java | 179 + .../org/jwz/xscreensaver/XscreensaverApp.java | 18 - .../src/org/jwz/xscreensaver/jwxyz.java | 824 +++++ android/screenhack-android.c | 209 ++ config.h.in | 3 + configure | 57 +- configure.in | 13 +- driver/XScreenSaver.ad.in | 19 +- driver/XScreenSaver_ad.h | 13 +- driver/demo-Gtk.c | 8 +- driver/demo-Xm.c | 2 +- driver/lock.c | 6 +- driver/passwd-pam.c | 21 +- driver/prefs.c | 100 +- driver/prefs.h | 4 +- driver/screens.c | 19 +- driver/splash.c | 5 +- driver/stderr.c | 4 +- driver/subprocs.c | 51 +- driver/test-passwd.c | 3 +- driver/timers.c | 76 +- driver/windows.c | 2 +- driver/xscreensaver-command.c | 2 +- driver/xscreensaver-command.man | 2 +- driver/xscreensaver-demo.man | 2 +- driver/xscreensaver-getimage-file | 34 +- driver/xscreensaver-text | 29 +- driver/xscreensaver.c | 35 +- driver/xscreensaver.h | 4 +- driver/xscreensaver.man | 6 +- hacks/Makefile.in | 35 +- hacks/abstractile.c | 3 +- hacks/analogtv.c | 8 +- hacks/analogtv.h | 6 +- hacks/anemone.c | 4 +- hacks/anemotaxis.c | 2 +- hacks/ant.c | 2 +- hacks/apple2-main.c | 4 +- hacks/asm6502.c | 6 +- hacks/attraction.c | 4 +- hacks/barcode.c | 3 +- hacks/binaryring.c | 16 +- hacks/blaster.c | 6 +- hacks/blitspin.c | 5 +- hacks/bouboule.c | 2 +- hacks/boxfit.c | 6 +- hacks/bsod.c | 433 ++- hacks/bsod.man | 1 + hacks/bubbles.h | 2 +- hacks/bumps.c | 3 +- hacks/ccurve.c | 2 +- hacks/celtic.c | 5 +- hacks/check-configs.pl | 882 ++++- hacks/cloudlife.c | 2 +- hacks/compass.c | 2 +- hacks/config/README | 6 +- hacks/config/abstractile.xml | 2 +- hacks/config/anemone.xml | 2 +- hacks/config/anemotaxis.xml | 2 +- hacks/config/ant.xml | 2 +- hacks/config/antinspect.xml | 2 +- hacks/config/antmaze.xml | 2 +- hacks/config/antspotlight.xml | 2 +- hacks/config/apollonian.xml | 2 +- hacks/config/apple2.xml | 2 +- hacks/config/atlantis.xml | 2 +- hacks/config/attraction.xml | 2 +- hacks/config/atunnel.xml | 2 +- hacks/config/barcode.xml | 2 +- hacks/config/binaryring.xml | 2 +- hacks/config/blaster.xml | 2 +- hacks/config/blinkbox.xml | 2 +- hacks/config/blitspin.xml | 2 +- hacks/config/blocktube.xml | 2 +- hacks/config/boing.xml | 2 +- hacks/config/bouboule.xml | 2 +- hacks/config/bouncingcow.xml | 2 +- hacks/config/boxed.xml | 2 +- hacks/config/boxfit.xml | 2 +- hacks/config/braid.xml | 2 +- hacks/config/bsod.xml | 3 +- hacks/config/bubble3d.xml | 10 +- hacks/config/bubbles.xml | 2 +- hacks/config/bumps.xml | 2 +- hacks/config/cage.xml | 2 +- hacks/config/carousel.xml | 2 +- hacks/config/ccurve.xml | 2 +- hacks/config/celtic.xml | 2 +- hacks/config/circuit.xml | 2 +- hacks/config/cityflow.xml | 2 +- hacks/config/cloudlife.xml | 2 +- hacks/config/companioncube.xml | 2 +- hacks/config/compass.xml | 2 +- hacks/config/coral.xml | 2 +- hacks/config/crackberg.xml | 2 +- hacks/config/critical.xml | 2 +- hacks/config/crystal.xml | 2 +- hacks/config/cube21.xml | 2 +- hacks/config/cubenetic.xml | 2 +- hacks/config/cubestorm.xml | 2 +- hacks/config/cubicgrid.xml | 2 +- hacks/config/cwaves.xml | 2 +- hacks/config/cynosure.xml | 2 +- hacks/config/dangerball.xml | 2 +- hacks/config/decayscreen.xml | 2 +- hacks/config/deco.xml | 2 +- hacks/config/deluxe.xml | 2 +- hacks/config/demon.xml | 2 +- hacks/config/discrete.xml | 2 +- hacks/config/distort.xml | 2 +- hacks/config/dnalogo.xml | 8 +- hacks/config/drift.xml | 2 +- hacks/config/dymaxionmap.xml | 45 + hacks/config/endgame.xml | 2 +- hacks/config/energystream.xml | 26 + hacks/config/engine.xml | 2 +- hacks/config/epicycle.xml | 2 +- hacks/config/eruption.xml | 2 +- hacks/config/euler2d.xml | 2 +- hacks/config/extrusion.xml | 2 +- hacks/config/fadeplot.xml | 2 +- hacks/config/fiberlamp.xml | 2 +- hacks/config/fireworkx.xml | 2 +- hacks/config/flag.xml | 2 +- hacks/config/flame.xml | 2 +- hacks/config/flipflop.xml | 2 +- hacks/config/flipscreen3d.xml | 2 +- hacks/config/fliptext.xml | 2 +- hacks/config/flow.xml | 2 +- hacks/config/fluidballs.xml | 2 +- hacks/config/flurry.xml | 2 +- hacks/config/flyingtoasters.xml | 2 +- hacks/config/fontglide.xml | 2 +- hacks/config/forest.xml | 2 +- hacks/config/fuzzyflakes.xml | 2 +- hacks/config/galaxy.xml | 2 +- hacks/config/gears.xml | 2 +- hacks/config/geodesic.xml | 2 +- hacks/config/geodesicgears.xml | 3 +- hacks/config/gflux.xml | 2 +- hacks/config/glblur.xml | 2 +- hacks/config/glcells.xml | 2 +- hacks/config/gleidescope.xml | 2 +- hacks/config/glforestfire.xml | 2 +- hacks/config/glhanoi.xml | 2 +- hacks/config/glknots.xml | 2 +- hacks/config/glmatrix.xml | 2 +- hacks/config/glplanet.xml | 3 +- hacks/config/glschool.xml | 2 +- hacks/config/glslideshow.xml | 2 +- hacks/config/glsnake.xml | 2 +- hacks/config/gltext.xml | 2 +- hacks/config/goop.xml | 2 +- hacks/config/grav.xml | 2 +- hacks/config/greynetic.xml | 2 +- hacks/config/halftone.xml | 2 +- hacks/config/halo.xml | 2 +- hacks/config/helix.xml | 2 +- hacks/config/hexadrop.xml | 2 +- hacks/config/hilbert.xml | 2 +- hacks/config/hopalong.xml | 2 +- hacks/config/hydrostat.xml | 76 + hacks/config/hyperball.xml | 2 +- hacks/config/hypercube.xml | 2 +- hacks/config/hypertorus.xml | 2 +- hacks/config/hypnowheel.xml | 2 +- hacks/config/ifs.xml | 2 +- hacks/config/imsmap.xml | 2 +- hacks/config/interaggregate.xml | 2 +- hacks/config/interference.xml | 2 +- hacks/config/intermomentary.xml | 2 +- hacks/config/jigglypuff.xml | 2 +- hacks/config/jigsaw.xml | 2 +- hacks/config/juggle.xml | 2 +- hacks/config/juggler3d.xml | 2 +- hacks/config/julia.xml | 2 +- hacks/config/kaleidescope.xml | 2 +- hacks/config/kaleidocycle.xml | 4 +- hacks/config/klein.xml | 2 +- hacks/config/kumppa.xml | 2 +- hacks/config/lament.xml | 2 +- hacks/config/laser.xml | 2 +- hacks/config/lavalite.xml | 2 +- hacks/config/lcdscrub.xml | 4 +- hacks/config/lightning.xml | 2 +- hacks/config/lisa.xml | 2 +- hacks/config/lissie.xml | 2 +- hacks/config/lmorph.xml | 2 +- hacks/config/loop.xml | 2 +- hacks/config/m6502.xml | 2 +- hacks/config/maze.xml | 2 +- hacks/config/memscroller.xml | 2 +- hacks/config/menger.xml | 2 +- hacks/config/metaballs.xml | 2 +- hacks/config/mirrorblob.xml | 2 +- hacks/config/mismunch.xml | 2 +- hacks/config/moebius.xml | 2 +- hacks/config/moebiusgears.xml | 2 +- hacks/config/moire.xml | 2 +- hacks/config/moire2.xml | 2 +- hacks/config/molecule.xml | 2 +- hacks/config/morph3d.xml | 2 +- hacks/config/mountain.xml | 2 +- hacks/config/munch.xml | 2 +- hacks/config/nerverot.xml | 2 +- hacks/config/noof.xml | 2 +- hacks/config/noseguy.xml | 2 +- hacks/config/pacman.xml | 2 +- hacks/config/pedal.xml | 2 +- hacks/config/penetrate.xml | 2 +- hacks/config/penrose.xml | 2 +- hacks/config/petri.xml | 2 +- hacks/config/phosphor.xml | 2 +- hacks/config/photopile.xml | 2 +- hacks/config/piecewise.xml | 2 +- hacks/config/pinion.xml | 2 +- hacks/config/pipes.xml | 2 +- hacks/config/polyhedra.xml | 4 +- hacks/config/polyominoes.xml | 2 +- hacks/config/polytopes.xml | 2 +- hacks/config/pong.xml | 2 +- hacks/config/popsquares.xml | 2 +- hacks/config/projectiveplane.xml | 2 +- hacks/config/providence.xml | 2 +- hacks/config/pulsar.xml | 2 +- hacks/config/pyro.xml | 2 +- hacks/config/qix.xml | 2 +- hacks/config/quasicrystal.xml | 5 +- hacks/config/queens.xml | 2 +- hacks/config/raverhoop.xml | 54 + hacks/config/rd-bomb.xml | 2 +- hacks/config/rdbomb.xml | 67 +- hacks/config/ripples.xml | 2 +- hacks/config/rocks.xml | 2 +- hacks/config/romanboy.xml | 2 +- hacks/config/rorschach.xml | 2 +- hacks/config/rotor.xml | 2 +- hacks/config/rotzoomer.xml | 2 +- hacks/config/rubik.xml | 2 +- hacks/config/rubikblocks.xml | 2 +- hacks/config/sballs.xml | 2 +- hacks/config/shadebobs.xml | 2 +- hacks/config/sierpinski.xml | 2 +- hacks/config/sierpinski3d.xml | 2 +- hacks/config/skytentacles.xml | 2 +- hacks/config/slidescreen.xml | 2 +- hacks/config/slip.xml | 2 +- hacks/config/sonar.xml | 2 +- hacks/config/speedmine.xml | 2 +- hacks/config/sphere.xml | 2 +- hacks/config/spheremonics.xml | 2 +- hacks/config/spiral.xml | 2 +- hacks/config/splitflap.xml | 2 +- hacks/config/spotlight.xml | 2 +- hacks/config/sproingies.xml | 2 +- hacks/config/squiral.xml | 2 +- hacks/config/stairs.xml | 2 +- hacks/config/starfish.xml | 2 +- hacks/config/starwars.xml | 2 +- hacks/config/stonerview.xml | 2 +- hacks/config/strange.xml | 2 +- hacks/config/substrate.xml | 2 +- hacks/config/superquadrics.xml | 2 +- hacks/config/surfaces.xml | 2 +- hacks/config/swirl.xml | 2 +- hacks/config/t3d.xml | 2 +- hacks/config/tangram.xml | 2 +- hacks/config/tessellimage.xml | 2 +- hacks/config/thornbird.xml | 2 +- hacks/config/timetunnel.xml | 2 +- hacks/config/topblock.xml | 2 +- hacks/config/triangle.xml | 2 +- hacks/config/tronbit.xml | 2 +- hacks/config/truchet.xml | 2 +- hacks/config/twang.xml | 2 +- hacks/config/unicrud.xml | 43 + hacks/config/unknownpleasures.xml | 2 +- hacks/config/vermiculate.xml | 2 +- hacks/config/vines.xml | 2 +- hacks/config/voronoi.xml | 2 +- hacks/config/wander.xml | 2 +- hacks/config/webcollage.xml | 4 +- hacks/config/whirlwindwarp.xml | 2 +- hacks/config/whirlygig.xml | 2 +- hacks/config/winduprobot.xml | 2 +- hacks/config/worm.xml | 2 +- hacks/config/wormhole.xml | 2 +- hacks/config/xanalogtv.xml | 2 +- hacks/config/xflame.xml | 2 +- hacks/config/xjack.xml | 2 +- hacks/config/xlyap.xml | 2 +- hacks/config/xmatrix.xml | 2 +- hacks/config/xrayswarm.xml | 2 +- hacks/config/xspirograph.xml | 2 +- hacks/config/zoom.xml | 14 +- hacks/coral.c | 2 +- hacks/critical.c | 8 +- hacks/crystal.c | 2 +- hacks/cwaves.c | 2 +- hacks/cynosure.c | 10 +- hacks/decayscreen.c | 3 +- hacks/deco.c | 2 +- hacks/deluxe.c | 18 +- hacks/demon.c | 4 +- hacks/distort.c | 3 +- hacks/epicycle.c | 4 +- hacks/euler2d.c | 2 +- hacks/fiberlamp.c | 2 +- hacks/flag.c | 4 +- hacks/flame.c | 2 +- hacks/flow.c | 4 +- hacks/fluidballs.c | 25 +- hacks/fontglide.c | 46 +- hacks/fps.h | 2 +- hacks/fuzzyflakes.c | 2 +- hacks/galaxy.c | 2 +- hacks/glx/Makefile.in | 490 +-- hacks/glx/antinspect.c | 14 +- hacks/glx/antmaze.c | 4 +- hacks/glx/antspotlight.c | 2 +- hacks/glx/atlantis.c | 2 +- hacks/glx/atlantis.h | 6 +- hacks/glx/atunnel.c | 1 + hacks/glx/b_lockglue.c | 18 +- hacks/glx/blinkbox.c | 8 + hacks/glx/blocktube.c | 9 + hacks/glx/boing.c | 2 + hacks/glx/bouncingcow.c | 11 +- hacks/glx/boxed.c | 10 +- hacks/glx/bubble3d.h | 2 +- hacks/glx/buildlwo.h | 7 +- hacks/glx/cage.c | 20 +- hacks/glx/carousel.c | 12 +- hacks/glx/chessmodels.c | 7 +- hacks/glx/circuit.c | 29 +- hacks/glx/companion.c | 8 + hacks/glx/crackberg.c | 2 +- hacks/glx/cube21.c | 16 +- hacks/glx/cubenetic.c | 9 + hacks/glx/cubestorm.c | 9 + hacks/glx/cubicgrid.c | 18 +- hacks/glx/dangerball.c | 9 + hacks/glx/dnalogo.c | 153 +- hacks/glx/dropshadow.h | 13 +- hacks/glx/dymaxionmap.c | 1028 ++++++ hacks/glx/dymaxionmap.man | 70 + hacks/glx/energystream.c | 546 +++ hacks/glx/energystream.man | 56 + hacks/glx/engine.c | 21 +- hacks/glx/flipflop.c | 17 +- hacks/glx/flipscreen3d.c | 11 +- hacks/glx/flurry.h | 2 +- hacks/glx/flyingtoasters.c | 8 + hacks/glx/fps-gl.c | 5 - hacks/glx/gears.c | 11 +- hacks/glx/geodesic.c | 11 +- hacks/glx/geodesicgears.c | 9 + hacks/glx/gflux.c | 25 +- hacks/glx/glblur.c | 11 +- hacks/glx/glcells.c | 80 +- hacks/glx/gleidescope.c | 24 +- hacks/glx/glforestfire.c | 16 +- hacks/glx/glhanoi.c | 20 +- hacks/glx/glknots.c | 9 + hacks/glx/gllist.c | 3 +- hacks/glx/glplanet.c | 21 +- hacks/glx/glschool_gl.h | 6 +- hacks/glx/glslideshow.c | 9 +- hacks/glx/glsnake.c | 15 +- hacks/glx/gltext.c | 8 + hacks/glx/gltrackball.c | 4 +- hacks/glx/glut_stroke.c | 11 +- hacks/glx/glut_swidth.c | 6 +- hacks/glx/grab-ximage.c | 8 +- hacks/glx/hilbert.c | 11 +- hacks/glx/hydrostat.c | 778 ++++ hacks/glx/hydrostat.man | 103 + hacks/glx/hypertorus.c | 15 +- hacks/glx/hypnowheel.c | 9 + hacks/glx/involute.c | 8 +- hacks/glx/jigglypuff.c | 11 + hacks/glx/jigsaw.c | 15 +- hacks/glx/juggler3d.c | 3 +- hacks/glx/kaleidocycle.c | 9 + hacks/glx/klein.c | 2 +- hacks/glx/lament.c | 10 +- hacks/glx/marching.c | 6 +- hacks/glx/menger.c | 9 + hacks/glx/mirrorblob.c | 9 +- hacks/glx/moebius.c | 18 +- hacks/glx/moebiusgears.c | 9 + hacks/glx/molecule.c | 26 +- hacks/glx/molecules.sh | 1 + hacks/glx/morph3d.c | 13 +- hacks/glx/noof.c | 1 + hacks/glx/normals.h | 6 +- hacks/glx/photopile.c | 18 +- hacks/glx/pipes.c | 5 +- hacks/glx/polyhedra-gl.c | 14 +- hacks/glx/polyhedra.c | 243 +- hacks/glx/polytopes.c | 6 +- hacks/glx/projectiveplane.c | 2 +- hacks/glx/providence.c | 9 + hacks/glx/quasicrystal.c | 1 + hacks/glx/quasicrystal.man | 1 - hacks/glx/queens.c | 6 +- hacks/glx/raverhoop.c | 767 ++++ hacks/glx/raverhoop.man | 83 + hacks/glx/romanboy.c | 4 +- hacks/glx/rotator.c | 83 +- hacks/glx/rubik.c | 18 +- hacks/glx/rubikblocks.c | 13 +- hacks/glx/sballs.c | 4 +- hacks/glx/sierpinski3d.c | 9 + hacks/glx/sonar-icmp.c | 12 +- hacks/glx/spheremonics.c | 9 + hacks/glx/splitflap.c | 10 +- hacks/glx/sproingies.c | 11 +- hacks/glx/stairs.c | 14 +- hacks/glx/starwars.c | 15 +- hacks/glx/stonerview.c | 9 + hacks/glx/superquadrics.c | 25 +- hacks/glx/surfaces.c | 11 +- hacks/glx/tangram.c | 23 +- hacks/glx/tangram_shapes.c | 6 +- hacks/glx/teapot.c | 5 +- hacks/glx/texfont.c | 23 +- hacks/glx/texfont.h | 9 +- hacks/glx/topblock.c | 11 +- hacks/glx/tronbit.c | 13 +- hacks/glx/tunnel_draw.c | 12 +- hacks/glx/unicrud.c | 956 +++++ hacks/glx/unicrud.man | 70 + hacks/glx/unknownpleasures.c | 4 +- hacks/glx/voronoi.c | 42 +- hacks/glx/vrml2gl.pl | 4 +- hacks/glx/wfront2gl.pl | 4 +- hacks/glx/winduprobot.c | 25 +- hacks/glx/xpm-ximage.c | 2 +- hacks/goop.c | 49 +- hacks/grav.c | 2 +- hacks/greynetic.c | 15 +- hacks/halftone.c | 4 +- hacks/halo.c | 4 +- hacks/helix.c | 2 +- hacks/hexadrop.c | 3 +- hacks/hyperball.c | 4 +- hacks/hypercube.c | 2 +- hacks/ifs.c | 7 +- hacks/images/dymaxionmap.xpm | 557 +++ hacks/imsmap.c | 3 +- hacks/interaggregate.c | 7 +- hacks/interference.c | 7 +- hacks/intermomentary.c | 11 +- hacks/juggle.c | 2 +- hacks/julia.c | 16 +- hacks/kaleidescope.c | 4 +- hacks/kumppa.c | 2 +- hacks/laser.c | 2 +- hacks/lcdscrub.c | 172 +- hacks/lisa.c | 2 +- hacks/lissie.c | 2 +- hacks/loop.c | 2 +- hacks/m6502.c | 4 +- hacks/m6502.sh | 5 +- hacks/maze.c | 4 + hacks/memscroller.c | 12 +- hacks/metaballs.c | 2 +- hacks/moire.c | 2 +- hacks/moire2.c | 2 +- hacks/munch.c | 2 +- hacks/nerverot.c | 6 +- hacks/noseguy.c | 2 +- hacks/pacman.c | 10 +- hacks/pacman.h | 2 +- hacks/pedal.c | 2 +- hacks/penetrate.c | 5 +- hacks/penrose.c | 2 +- hacks/petri.c | 2 +- hacks/phosphor.c | 6 +- hacks/piecewise.c | 4 +- hacks/polyominoes.c | 6 +- hacks/pong.c | 386 +- hacks/pong.man | 4 + hacks/popsquares.c | 7 +- hacks/qix.c | 28 +- hacks/rd-bomb.c | 10 +- hacks/recanim.c | 14 +- hacks/ripples.c | 2 +- hacks/rocks.c | 2 +- hacks/rorschach.c | 2 +- hacks/rotor.c | 2 +- hacks/rotzoomer.c | 7 +- hacks/screenhack.c | 2 +- hacks/screenhack.h | 8 +- hacks/screenhackI.h | 17 +- hacks/shadebobs.c | 2 +- hacks/slidescreen.c | 6 +- hacks/speedmine.c | 16 +- hacks/spiral.c | 2 +- hacks/spotlight.c | 4 +- hacks/squiral.c | 4 +- hacks/starfish.c | 6 +- hacks/strange.c | 10 +- hacks/substrate.c | 12 +- hacks/swirl.c | 112 +- hacks/t3d.c | 15 +- hacks/tessellimage.c | 6 +- hacks/testx11.c | 410 ++- hacks/thornbird.c | 1 + hacks/truchet.c | 2 +- hacks/twang.c | 3 +- hacks/vermiculate.c | 2 +- hacks/vidwhacker | 4 +- hacks/wander.c | 5 +- hacks/webcollage | 6 +- hacks/webcollage-cocoa.m | 22 +- hacks/webcollage-helper.c | 2 +- hacks/webcollage.man | 6 +- hacks/whirlwindwarp.c | 2 +- hacks/whirlygig.c | 10 +- hacks/wormhole.c | 6 +- hacks/xanalogtv.c | 12 +- hacks/xflame.c | 18 +- hacks/xlockmore.c | 15 +- hacks/xlockmore.h | 2 +- hacks/xlyap.c | 9 +- hacks/xmatrix.c | 19 +- hacks/xpm-pixmap.c | 2 +- hacks/xrayswarm.c | 12 +- hacks/xspirograph.c | 2 +- hacks/zoom.c | 10 +- jwxyz/Makefile.in | 142 + jwxyz/README | 30 + jwxyz/jwxyz-android.c | 1211 +++++++ jwxyz/jwxyz-android.h | 115 + jwxyz/jwxyz-cocoa.h | 96 + jwxyz/jwxyz-cocoa.m | 577 +++ jwxyz/jwxyz-common.c | 971 +++++ jwxyz/jwxyz-gl.c | 3114 +++++++++++++++++ OSX/jwxyz-timers.m => jwxyz/jwxyz-timers.c | 302 +- {android => jwxyz}/jwxyz-timers.h | 5 +- {OSX => jwxyz}/jwxyz.h | 41 +- {OSX => jwxyz}/jwxyz.m | 1703 ++------- jwxyz/jwxyzI.h | 136 + {hacks/glx => jwxyz}/jwzgles.c | 349 +- {hacks/glx => jwxyz}/jwzgles.h | 1 + {hacks/glx => jwxyz}/jwzglesI.h | 6 +- po/POTFILES.in | 7 +- utils/Makefile.in | 8 +- utils/aligned_malloc.c | 2 +- utils/aligned_malloc.h | 15 +- utils/async_netdb.c | 12 +- utils/async_netdb.h | 16 +- utils/compile_axp.com | 1 + utils/compile_decc.com | 1 + utils/grabclient.c | 443 ++- utils/grabscreen.h | 10 +- utils/images/logo-180.xpm | 2 +- utils/images/logo-50.xpm | 2 +- utils/minixpm.c | 4 +- .../textclient-mobile.c | 413 +-- utils/textclient.c | 9 +- utils/textclient.h | 9 +- utils/thread_util.c | 10 +- utils/thread_util.h | 2 +- utils/utf8wc.c | 43 +- utils/utils.h | 4 +- utils/version.h | 2 +- utils/visual.c | 5 +- utils/xft.c | 4 +- xscreensaver.spec | 6 +- 702 files changed, 23676 insertions(+), 11573 deletions(-) create mode 100644 OSX/Media-iOS.xcassets/AppIcon.appiconset/iSaverRunner100.png create mode 100644 OSX/Media-iOS.xcassets/AppIcon.appiconset/iSaverRunner167.png create mode 100644 OSX/Media-iOS.xcassets/AppIcon.appiconset/iSaverRunner180.png create mode 100644 OSX/Media-iOS.xcassets/AppIcon.appiconset/iSaverRunner40.png create mode 100644 OSX/Media-iOS.xcassets/AppIcon.appiconset/iSaverRunner58.png create mode 100644 OSX/Media-iOS.xcassets/AppIcon.appiconset/iSaverRunner80.png create mode 100644 OSX/Media-iOS.xcassets/AppIcon.appiconset/iSaverRunner87.png create mode 100644 OSX/Media-iOS.xcassets/Contents.json create mode 100644 OSX/Media-iOS.xcassets/Image.imageset/Contents.json create mode 100644 OSX/Media-iOS.xcassets/LaunchImage.launchimage/1242x2208.png create mode 100644 OSX/Media-iOS.xcassets/LaunchImage.launchimage/640x1136.png create mode 100644 OSX/Media-iOS.xcassets/LaunchImage.launchimage/640x960.png create mode 100644 OSX/Media-iOS.xcassets/LaunchImage.launchimage/750x1334.png delete mode 100644 OSX/Media-iOS.xcassets/LaunchImage.launchimage/Default-568h@2x.png create mode 100644 OSX/PxPlus_IBM_VGA8.ttf create mode 100755 OSX/fuzztest.sh create mode 100755 OSX/seticon.pl create mode 100644 OSX/textclient-iOS.m delete mode 100755 OSX/update-thumbnail.pl rename OSX/jwxyz-timers.h => android/XScreenSaverDaydream.java.in (50%) delete mode 100644 android/XScreenSaverGLView.c create mode 100644 android/XScreenSaverSettings.java.in delete mode 100644 android/XScreenSaverView.c create mode 100644 android/XScreenSaverWallpaper.java.in delete mode 100755 android/generate_files.pl delete mode 100644 android/glue.c create mode 100644 android/grabscreen-android.c delete mode 100644 android/jwxyz.c delete mode 100644 android/jwxyz.h delete mode 100644 android/project/GLWallpaperService/AndroidManifest.xml delete mode 100644 android/project/GLWallpaperService/LICENSE delete mode 100644 android/project/GLWallpaperService/NOTICE delete mode 100644 android/project/GLWallpaperService/build.gradle delete mode 100644 android/project/GLWallpaperService/build.xml delete mode 100644 android/project/GLWallpaperService/default.properties delete mode 100644 android/project/GLWallpaperService/project.properties delete mode 100644 android/project/GLWallpaperService/readme-contribute.txt delete mode 100644 android/project/GLWallpaperService/readme.txt delete mode 100644 android/project/GLWallpaperService/res/drawable-hdpi/icon.png delete mode 100644 android/project/GLWallpaperService/res/drawable-ldpi/icon.png delete mode 100644 android/project/GLWallpaperService/res/drawable-mdpi/icon.png delete mode 100644 android/project/GLWallpaperService/res/layout/main.xml delete mode 100644 android/project/GLWallpaperService/res/values/strings.xml delete mode 100644 android/project/GLWallpaperService/src/net/rbgrn/android/glwallpaperservice/GLWallpaperService.java delete mode 100644 android/project/xscreensaver/AndroidManifest.xml create mode 120000 android/project/xscreensaver/assets/fonts/OCRAStd.otf create mode 120000 android/project/xscreensaver/assets/fonts/PxPlus_IBM_VGA8.ttf create mode 120000 android/project/xscreensaver/assets/fonts/YearlReg.ttf delete mode 100644 android/project/xscreensaver/res/drawable/bouncingcow.png delete mode 100644 android/project/xscreensaver/res/drawable/glhanoi.png delete mode 100644 android/project/xscreensaver/res/drawable/glmatrix.png delete mode 100644 android/project/xscreensaver/res/drawable/hilbert.png delete mode 100644 android/project/xscreensaver/res/drawable/hypertorus.png delete mode 100644 android/project/xscreensaver/res/drawable/sproingies.png delete mode 100644 android/project/xscreensaver/res/drawable/stonerview.png delete mode 100644 android/project/xscreensaver/res/drawable/superquadrics.png delete mode 100644 android/project/xscreensaver/res/drawable/unknownpleasures.png create mode 100644 android/project/xscreensaver/res/layout/activity_xscreensaver.xml create mode 100644 android/project/xscreensaver/res/layout/preference_blurb.xml create mode 100644 android/project/xscreensaver/res/layout/slider_preference.xml delete mode 100644 android/project/xscreensaver/res/layout/slider_preference_dialog.xml delete mode 100644 android/project/xscreensaver/res/values/attrs.xml delete mode 100644 android/project/xscreensaver/res/values/items.xml delete mode 100644 android/project/xscreensaver/res/values/settings.xml delete mode 100644 android/project/xscreensaver/res/values/strings.xml delete mode 100644 android/project/xscreensaver/res/xml/bouncingcow.xml delete mode 100644 android/project/xscreensaver/res/xml/bouncingcow_settings.xml delete mode 100644 android/project/xscreensaver/res/xml/glhanoi.xml delete mode 100644 android/project/xscreensaver/res/xml/glhanoi_settings.xml delete mode 100644 android/project/xscreensaver/res/xml/hypertorus.xml delete mode 100644 android/project/xscreensaver/res/xml/hypertorus_settings.xml delete mode 100644 android/project/xscreensaver/res/xml/sproingies.xml delete mode 100644 android/project/xscreensaver/res/xml/sproingies_settings.xml delete mode 100644 android/project/xscreensaver/res/xml/stonerview.xml delete mode 100644 android/project/xscreensaver/res/xml/stonerview_settings.xml delete mode 100644 android/project/xscreensaver/res/xml/superquadrics.xml delete mode 100644 android/project/xscreensaver/res/xml/superquadrics_settings.xml delete mode 100644 android/project/xscreensaver/res/xml/unknownpleasures.xml delete mode 100644 android/project/xscreensaver/res/xml/unknownpleasures_settings.xml delete mode 100644 android/project/xscreensaver/src/org/jwz/xscreensaver/ARenderer.java delete mode 100644 android/project/xscreensaver/src/org/jwz/xscreensaver/BufferFactory.java delete mode 100644 android/project/xscreensaver/src/org/jwz/xscreensaver/CallNative.java create mode 100644 android/project/xscreensaver/src/org/jwz/xscreensaver/TTFAnalyzer.java create mode 100644 android/project/xscreensaver/src/org/jwz/xscreensaver/XScreenSaverActivity.java create mode 100644 android/project/xscreensaver/src/org/jwz/xscreensaver/XScreenSaverApp.java create mode 100644 android/project/xscreensaver/src/org/jwz/xscreensaver/XScreenSaverDaydream.java create mode 100644 android/project/xscreensaver/src/org/jwz/xscreensaver/XScreenSaverRenderer.java create mode 100644 android/project/xscreensaver/src/org/jwz/xscreensaver/XScreenSaverSettings.java delete mode 100644 android/project/xscreensaver/src/org/jwz/xscreensaver/XscreensaverApp.java create mode 100644 android/project/xscreensaver/src/org/jwz/xscreensaver/jwxyz.java create mode 100644 android/screenhack-android.c create mode 100644 hacks/config/dymaxionmap.xml create mode 100644 hacks/config/energystream.xml create mode 100644 hacks/config/hydrostat.xml create mode 100644 hacks/config/raverhoop.xml mode change 100644 => 120000 hacks/config/rdbomb.xml create mode 100644 hacks/config/unicrud.xml create mode 100644 hacks/glx/dymaxionmap.c create mode 100644 hacks/glx/dymaxionmap.man create mode 100644 hacks/glx/energystream.c create mode 100644 hacks/glx/energystream.man create mode 100644 hacks/glx/hydrostat.c create mode 100644 hacks/glx/hydrostat.man create mode 100644 hacks/glx/raverhoop.c create mode 100644 hacks/glx/raverhoop.man create mode 100644 hacks/glx/unicrud.c create mode 100644 hacks/glx/unicrud.man create mode 100644 hacks/images/dymaxionmap.xpm create mode 100644 jwxyz/Makefile.in create mode 100644 jwxyz/README create mode 100644 jwxyz/jwxyz-android.c create mode 100644 jwxyz/jwxyz-android.h create mode 100644 jwxyz/jwxyz-cocoa.h create mode 100644 jwxyz/jwxyz-cocoa.m create mode 100644 jwxyz/jwxyz-common.c create mode 100644 jwxyz/jwxyz-gl.c rename OSX/jwxyz-timers.m => jwxyz/jwxyz-timers.c (54%) rename {android => jwxyz}/jwxyz-timers.h (83%) rename {OSX => jwxyz}/jwxyz.h (96%) rename {OSX => jwxyz}/jwxyz.m (62%) create mode 100644 jwxyz/jwxyzI.h rename {hacks/glx => jwxyz}/jwzgles.c (91%) rename {hacks/glx => jwxyz}/jwzgles.h (99%) rename {hacks/glx => jwxyz}/jwzglesI.h (98%) rename OSX/iostextclient.m => utils/textclient-mobile.c (61%) diff --git a/Makefile.in b/Makefile.in index bd6dd28b..c9190518 100644 --- a/Makefile.in +++ b/Makefile.in @@ -6,7 +6,7 @@ srcdir = @srcdir@ VPATH = @srcdir@ SHELL = /bin/sh -SUBDIRS = utils driver hacks hacks/glx po +SUBDIRS = utils jwxyz hacks hacks/glx driver po SUBDIRS2 = $(SUBDIRS) OSX android TARFILES = README README.hacking README.VMS INSTALL \ configure configure.in Makefile.in config.h.in \ @@ -273,6 +273,7 @@ test-tar:: ../../configure --with-motif=/usr/local/lesstif --without-gnome ; \ echo --------------------------------------------------------------- ; \ ( cd utils; gmake all ) ; \ + ( cd jwxyz; gmake all ) ; \ ( cd driver; gmake all ) ; \ echo --------------------------------------------------------------- ); \ \ @@ -280,6 +281,8 @@ test-tar:: dmg:: $(MAKE) -C OSX release dmg +apk:: + $(MAKE) -C android apk www:: @ \ @@ -293,6 +296,9 @@ www:: BNAME2="$$HEAD.dmg" ; \ NAME2="$$ADIR$$BNAME2" ; \ DNAME2="$$DEST/$$HEAD.dmg" ; \ + BNAME3="$$HEAD.apk" ; \ + NAME3="$$ADIR$$BNAME3" ; \ + DNAME3="$$DEST/$$HEAD.apk" ; \ \ if ! git diff --quiet ; then \ echo "uncommitted changes exist!" ; \ @@ -309,6 +315,10 @@ www:: echo "$$NAME2 does not exist! Did you forget to \`make dmg'?" ; \ exit 1 ; \ fi ; \ + if [ ! -f $$NAME3 ]; then \ + echo "$$NAME3 does not exist! Did you forget to \`make apk'?" ; \ + exit 1 ; \ + fi ; \ chmod a-w $$NAME ; \ if [ -f $$DNAME ]; then \ /bin/echo -n "WARNING: $$DNAME already exists! Overwrite? "; \ @@ -323,6 +333,13 @@ www:: if [ "x$$line" != "xyes" -a "x$$line" != "xy" ]; then \ exit 1 ; \ fi ; \ + fi ; \ + if [ -f $$DNAME3 ]; then \ + /bin/echo -n "WARNING: $$DNAME3 already exists! Overwrite? "; \ + read line; \ + if [ "x$$line" != "xyes" -a "x$$line" != "xy" ]; then \ + exit 1 ; \ + fi ; \ fi ; \ \ git tag -a "v$$VERS" -m "$$VERS" ; \ @@ -332,7 +349,8 @@ www:: \ cp -p $$NAME $$DNAME ; \ cp -p $$NAME2 $$DNAME2 ; \ - chmod u+w $$DNAME $$DNAME2 ; \ + cp -p $$NAME3 $$DNAME3 ; \ + chmod u+w $$DNAME $$DNAME2 $$DNAME3 ; \ cp -p OSX/updates.xml $$DEST ; \ cd $$DEST ; \ \ @@ -359,7 +377,7 @@ www:: cat $$TMP > download.html ; \ rm -f $$TMP ; \ \ - git add $$BNAME $$BNAME2 ; \ + git add $$BNAME $$BNAME2 $$BNAME3 ; \ \ $(MAKE) -C ../ xscreensaver/changelog.html xscreensaver/screenshots/index.html; \ git diff changelog.html ; \ diff --git a/OSX/InvertedSlider.m b/OSX/InvertedSlider.m index 642a3e4f..6ac0b419 100644 --- a/OSX/InvertedSlider.m +++ b/OSX/InvertedSlider.m @@ -1,4 +1,4 @@ -/* xscreensaver, Copyright (c) 2006-2013 Jamie Zawinski +/* xscreensaver, Copyright (c) 2006-2015 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 @@ -83,8 +83,8 @@ - (NSAttributedString *)attributedStringValue; { - // #### "Build and Analyze" says this leaks. Unsure whether this is true. - return [[NSAttributedString alloc] initWithString:[self stringValue]]; + return [[[NSAttributedString alloc] initWithString:[self stringValue]] + autorelease]; } -(void)setFloatValue:(float)v { [self setDoubleValue: (double) v]; } diff --git a/OSX/LaunchScreen.xib b/OSX/LaunchScreen.xib index 580d9357..731d86e2 100644 --- a/OSX/LaunchScreen.xib +++ b/OSX/LaunchScreen.xib @@ -1,8 +1,8 @@ - + - + diff --git a/OSX/Makefile b/OSX/Makefile index 8400adf0..d8664552 100644 --- a/OSX/Makefile +++ b/OSX/Makefile @@ -1,21 +1,23 @@ -# XScreenSaver for MacOS X, Copyright (c) 2006-2014 by Jamie Zawinski. +# XScreenSaver for MacOS X, Copyright (c) 2006-2015 by Jamie Zawinski. -# We have to use Xcode 5.0.2 in order to build savers that will run on -# MacOS 10.6 and 10.7, because that's the latest version of Xcode that -# ships with a version of clang that implements "-fobjc-gc". +XCODE_APP = /Applications/Xcode.app + +# To build savers that will run on MacOS 10.6 and 10.7, Xcode 5.0.2 must +# be used (as that's the latest version of Xcode that ships with a version +# of clang that implements "-fobjc-gc"). However, Xcode 5.0.2 will not +# launch on MacOS 10.11 or later. # -XCODE_APP = /Applications/Xcode-5.0.2.app +# XCODE_APP = /Applications/Xcode-5.0.2.app TARGETS = All Savers -ARCH = -arch i386 -arch x86_64 +ARCH = -arch i386 -arch x86_64 ONLY_ACTIVE_ARCH=NO CERT = 'Jamie Zawinski' CERT = 'iPhone Developer: Jamie Zawinski (Y5M82TL69N)' PKGID = org.jwz.xscreensaver -THUMBDIR = $(HOME)/www/xscreensaver/screenshots/ +THUMBDIR = build/screenshots XCODEBUILD = $(XCODE_APP)/Contents/Developer/usr/bin/xcodebuild SETFILE = $(XCODE_APP)/Contents/Developer/Tools/SetFile -SETICON = /usr/local/bin/seticon -# seticon is from osxutils1.7.pkg +SETICON = ./seticon.pl default: release all: debug release @@ -40,12 +42,63 @@ release:: distdepend $(XCODEBUILD) $(ARCH) -target "$(TARGETS)" -configuration Release build release:: check_versions -release:: update_thumbs release:: sign Sparkle.framework: unzip ../archive/Sparkle.framework-2013-12-04.zip +# Download and resize images from jwz.org. +# This saves us having to include 4MB of images in the tar file +# that will only be used by a vast minority of people building +# from source. +# 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/ +WGET = wget -q -U xscreensaver-build-osx +CVT = -thumbnail '200x150^' -gravity center -extent 200x150 \ + \( +clone -alpha extract \ + -draw 'fill black polygon 0,0 0,6 6,0 fill white circle 6,6 6,0' \ + \( +clone -flip \) -compose Multiply -composite \ + \( +clone -flop \) -compose Multiply -composite \ + \) -alpha off -compose CopyOpacity -composite \ + -colorspace sRGB \ + -strip \ + -quality 95 \ + +dither -colors 128 + +$(THUMBDIR)/%.png: + @\ + FILE1=`echo "$@" | sed 's!^.*/\([^/]*\)\.png$$!\1.jpg!'` ; \ + FILE2="$@" ; \ + TMP="$$FILE2".tmp ; \ + URL="$(URL)$$FILE1" ; \ + URL2="$(URL)retired/$$FILE1" ; \ + 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 ; \ + fi ; \ + rm -f "$$FILE2" ; \ + convert jpg:- $(CVT) "$$FILE2" < "$$TMP" ; \ + if [ ! -s "$$FILE2" ]; then \ + echo "$$FILE2 failed" >&2 ; \ + rm -f "$$FILE2" "$$TMP" ; \ + exit 1 ; \ + else \ + rm -f "$$TMP" ; \ + fi + + sign: @for f in build/Release/*.app/Contents/*/*.saver \ build/Release/*.{saver,app} ; do \ @@ -131,10 +184,6 @@ check_coretext: exit $$RESULT -update_thumbs:: - ./update-thumbnail.pl $(THUMBDIR) build/Release/*.saver - - # Arrrrgh ios-function-table.m:: @./build-fntable.pl build/Debug-iphonesimulator/XScreenSaver.app $@ @@ -235,7 +284,8 @@ build/Release/installer.pkg: installer.rtf installer.xml installer.sh installer. # -format UDBZ saves 4% (~1.2 MB) over UDZO. dmg:: distdepend -dmg:: check_versions check_gc check_coretext +dmg:: check_versions check_coretext +#dmg:: check_gc dmg:: build/Release/installer.pkg dmg:: @ \ @@ -291,7 +341,7 @@ dmg:: cp -p bindist.rtf "$$STAGE/Read Me.rtf" ; \ cp -p build/Release/installer.pkg "$$PKG" ; \ cp -p bindist-DS_Store "$$STAGE/.DS_Store" ; \ - cp -p bindist.webloc "$$STAGE/Get the iPhone:iPad Version.webloc" ; \ + cp -p bindist.webloc "$$STAGE/" ; \ cp -p XScreenSaverDMG.icns "$$STAGE/.VolumeIcon.icns" ; \ ${SETFILE} -a C "$$STAGE" ; \ ${SETFILE} -a E "$$STAGE"/*.{rtf,pkg,webloc} ; \ @@ -300,6 +350,7 @@ dmg:: $(SETICON) -d XScreenSaverFolder.icns "$$DST" ; \ $(SETICON) -d XScreenSaverWebloc.icns "$$STAGE"/*.webloc ; \ $(SETICON) -d XScreenSaverPkg.icns "$$STAGE"/*.pkg ; \ + mv "$$STAGE/bindist.webloc" "$$STAGE/Get the iPhone:iPad Version.webloc" ; \ hdiutil makehybrid -quiet -ov -hfs -hfs-volume-name "$$VOLNAME" \ -hfs-openfolder "$$STAGE" "$$STAGE" -o "$$TMPDMG" ; \ rm -rf "$$STAGE" ; \ diff --git a/OSX/Media-iOS.xcassets/AppIcon.appiconset/Contents.json b/OSX/Media-iOS.xcassets/AppIcon.appiconset/Contents.json index 43db2a4d..89e33aff 100644 --- a/OSX/Media-iOS.xcassets/AppIcon.appiconset/Contents.json +++ b/OSX/Media-iOS.xcassets/AppIcon.appiconset/Contents.json @@ -7,15 +7,29 @@ "scale" : "1x" }, { - "idiom" : "iphone", "size" : "29x29", + "idiom" : "iphone", + "filename" : "iSaverRunner58.png", "scale" : "2x" }, { + "size" : "29x29", "idiom" : "iphone", + "filename" : "iSaverRunner87.png", + "scale" : "3x" + }, + { "size" : "40x40", + "idiom" : "iphone", + "filename" : "iSaverRunner80.png", "scale" : "2x" }, + { + "size" : "40x40", + "idiom" : "iphone", + "filename" : "iSaverRunner120.png", + "scale" : "3x" + }, { "size" : "57x57", "idiom" : "iphone", @@ -35,8 +49,9 @@ "scale" : "2x" }, { - "idiom" : "iphone", "size" : "60x60", + "idiom" : "iphone", + "filename" : "iSaverRunner180.png", "scale" : "3x" }, { @@ -46,18 +61,21 @@ "scale" : "1x" }, { - "idiom" : "ipad", "size" : "29x29", + "idiom" : "ipad", + "filename" : "iSaverRunner58.png", "scale" : "2x" }, { - "idiom" : "ipad", "size" : "40x40", + "idiom" : "ipad", + "filename" : "iSaverRunner40.png", "scale" : "1x" }, { - "idiom" : "ipad", "size" : "40x40", + "idiom" : "ipad", + "filename" : "iSaverRunner80.png", "scale" : "2x" }, { @@ -67,8 +85,9 @@ "scale" : "1x" }, { - "idiom" : "ipad", "size" : "50x50", + "idiom" : "ipad", + "filename" : "iSaverRunner100.png", "scale" : "2x" }, { @@ -94,6 +113,12 @@ "idiom" : "ipad", "filename" : "iSaverRunner152.png", "scale" : "2x" + }, + { + "size" : "83.5x83.5", + "idiom" : "ipad", + "filename" : "iSaverRunner167.png", + "scale" : "2x" } ], "info" : { diff --git a/OSX/Media-iOS.xcassets/AppIcon.appiconset/iSaverRunner100.png b/OSX/Media-iOS.xcassets/AppIcon.appiconset/iSaverRunner100.png new file mode 100644 index 0000000000000000000000000000000000000000..4a71d44790d2552eaf9d0462faab93f2cb937d49 GIT binary patch literal 3261 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 literal 0 HcmV?d00001 diff --git a/OSX/Media-iOS.xcassets/AppIcon.appiconset/iSaverRunner167.png b/OSX/Media-iOS.xcassets/AppIcon.appiconset/iSaverRunner167.png new file mode 100644 index 0000000000000000000000000000000000000000..85824f021aa294fab7e453ed475ab6b3928e7f04 GIT binary patch literal 10232 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 Hu0mjfJbF_E literal 0 HcmV?d00001 diff --git a/OSX/Media-iOS.xcassets/AppIcon.appiconset/iSaverRunner40.png b/OSX/Media-iOS.xcassets/AppIcon.appiconset/iSaverRunner40.png new file mode 100644 index 0000000000000000000000000000000000000000..20db74e83526ea7469194f7bd3d6a34d42805d5f GIT binary patch literal 1106 zcmV-Y1g-mtP)K+BXKz`uL$|}`I^wzi*muhNCi3qDERjgi^SJ!G_+WA`^5IE2SMeR_V;}(&i}rB zG<|s&$o=<x|@GAw4n6yo^#j^W})2>a)+UmWLme^AgbJGU3eef0O&N7g^Wf8KoE z)d|d3KoRTzJo7Ie;b54L$Buuh4!;By30wSqWy#(BDUq7s$o`c6?Wyf&FxOt=nwHGHpBmX~dPCf|Nnw|T>{eO@g1y^J7 zlHX31gPL&+^cFuOv%D}$sCc{tOq9kk96&r8=WWV$mW$!u zbBLh!H|}&+(U+N?S9f2~{{9Cd=>AIRvf_8u)OrI0189x%;X`0xAek0hv+;mK^^0Ic zG(+1oxOh5?=&Ze4cgm<~-~I?M%hJAzuRSrxq2LM?f*Kg3Ky?4+Lt!iPE5E-ZO98EU z@Zcga-N8j<|FCOZ`m|xyB1$cW%dd_=p>x>^EK4=Qk{))}wet|5a^`86Q>1~u+ z3{SUO&w1V+U(FWk2h7AMF8jx&%fo@}X<#b5yY&RsN-m%aEN%(zUo-7hkSCf{_!p6n z|NkP3Xutn^;lc%qEPnh4;XhzXmOOIgnZ5#=r-AY6#leRr^5E7biYx}&fgFrsZ$$Ub zo$*Xv3BPf`#CY-geM*CR#+TQ~+^}aq51l_t(8PDQk5X#!wjZC6Jq@f6(z!(ln)v_o z6DlOGlg1iYlRCb{`1=_ZEOx0VIccOxdvq8V2?S%|cFm6Uj4 z%PdG)O_9ZkiHU-Og1+}Iq7|7~LD%P(Q%@cRs%K!}`T!evesAvKw|mByH=Une zQoqdwwA=pG?VR_I(aI1Y0H%DPv#LKnV;}`EVs^}t+gzC7<(5A27tbNd+fIf3G0V@* zx4wP+{?8<-=?A+IMQtvSelzS{Lbe;*KfZkO`Zv_mN3SBB#cWtnA*fmYeCIed z|4x6@uV25gDgd?*|1U}cg%;UCjkUqcyD;qGL&9A`9v&X?l$p;(&8TDXNF98kE&vEH Y0MY%Qkip6Ca{vGU07*qoM6N<$f+V3NF8}}l literal 0 HcmV?d00001 diff --git a/OSX/Media-iOS.xcassets/AppIcon.appiconset/iSaverRunner58.png b/OSX/Media-iOS.xcassets/AppIcon.appiconset/iSaverRunner58.png new file mode 100644 index 0000000000000000000000000000000000000000..e62c324fc00170d539649e2a2b1b928037db9400 GIT binary patch literal 1673 zcmV;426p+0P)4PF- zg#t#If>@QQ3_)EMMZ^ebHn$m*)q(wC{w4)oI2n0m5LN! z5rKj*P^g6=g~IJ^>5H~>r(SGod%@n));96{adS@3Ik}(v>-YCNzjN-TPTH@hgioPS z!m5lG*Q$OLHn@P*ez{CveL6gFp)m)wdbT4n zWMBFT=s4tXf$tX|E5*qeS*BxH8tzpKp4!`v`Pnz1(M{qwHnmZ+U_|A+mz63+nwN9 zH&Xk+wP{3q<{saDjLjXNQ&e*MIOVB8>G9Tk&C~F~DIK-W@o{>lnAHb2o#%{C@^;Z- z$66u87hJ|48}3{<==#gM>_`x_`V8pex~uV#Vi%9I%cNBl>2y%t7?nt2@th0CR0HRm zU2l4Czr^&#(1zo_hykm+;`YlXUd%a@7F2Q({&2JSRJv<3qJ#NfI>&q5fp)onw42F{ z&<@%tOotm~!p{)cRBF|QqSq>b;3PMg@uKM_Gb%KHv#aF3#A*9i0{u4!ej>*wR zzShxRasTd(vF?rt9(B&0sFa>lrKQh2j6fhLE-v;zZWhzwTRa^!J&qxjN||rv5e{3Y zj}cX#*@ksugYF6j+l`dR+};~M2SW_031X80@$|vldOW^`%4Ipl%+5O0R@-0Co(pp|#K7xVQ z*~Sv?Da8FOMYBABxM0KR=``8((GRcgGc20#=~B;gT+X!{)d9o>Kt~LyXB^GxfqDlM|9(3$lg^i z6C~5r8{Z!#Ydy_yxRp})$rpje1!)bqF5L3jt+eFP;BM{i`gG6H88c?!O;SEb;uHsj zp5@DzgWG5(idrkHz}C$N*0O%JK6%o$Cj~bFseF>$q0`AH#dWhuP6ieu$lNJ4ok2}; z@bWR*PPldqAG!5;>egVNk+~5Q?sGiLZk;Mm{g7;SK@Jz0JkJ{~zTVveu7m*&@SV3~ zGrO90X;t2;Gb(*u!f5(Cz)sZ4 zGUcUmolZw~ZrsFVVZm14gyG}62^fa0F;fy&@9=H9&+jp*FTZqpi5sT4{|hhx(Byx} TRaF3;00000NkvXXu0mjfmKi@2 literal 0 HcmV?d00001 diff --git a/OSX/Media-iOS.xcassets/AppIcon.appiconset/iSaverRunner80.png b/OSX/Media-iOS.xcassets/AppIcon.appiconset/iSaverRunner80.png new file mode 100644 index 0000000000000000000000000000000000000000..adc5ad7e94709911d0f25cbf0bc88c710cb92760 GIT binary patch literal 2432 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 literal 0 HcmV?d00001 diff --git a/OSX/Media-iOS.xcassets/LaunchImage.launchimage/640x960.png b/OSX/Media-iOS.xcassets/LaunchImage.launchimage/640x960.png new file mode 100644 index 0000000000000000000000000000000000000000..0bfc1a93da30f21ca23991d092378f5d1365654f GIT binary patch literal 346 zcmeAS@N?(olHy`uVBq!ia0y~yU}|7sU_QVI6kzC``85nkv7|ftIx;Y9?C1WI$O_~u zBzpw;GB8xBF)%c=FfjZA3N^f7U???UV0e|lz+g3lfkC`r&aOZkpafHrx4R1i$-}8LP?%3jv*Dd-X1grS$Sx|SN~jY{RKcKwLpc0{&@z* zTP(8^fF`PzxJHzuB$lLFB^RXvDF!10Lo;0iBV8l&5JO8VLlY}gb6o=qD+2?`H7r2? eAZf_WPsvQH#H}IY}6qT-G@yGywqBLPnkd literal 0 HcmV?d00001 diff --git a/OSX/Media-iOS.xcassets/LaunchImage.launchimage/750x1334.png b/OSX/Media-iOS.xcassets/LaunchImage.launchimage/750x1334.png new file mode 100644 index 0000000000000000000000000000000000000000..4ec452de8b36754984726a456722543bf91461e7 GIT binary patch literal 394 zcmeAS@N?(olHy`uVBq!ia0y~yV0y>Ez-q<_6kvF?hHo{HVo7)Ob!1@J*w6hZkrl{S zNcITwWnidMV_;}#VPNH=O_6JPT!hDuL)^!yFg(i8rIEGZ*dVA0iWaXg+U;T60>K6c+0|XlGGrX5% zV0_#7-W})y)e_f;l9a@fRIB8oR3OD*WMF8fYha{nWFBH@X=P|)WooW#U}0roAi0JG f=zk;)x%nxXX_dG&WPIGy1M;J%tDnm{r-UW|;&$x8J@slQFSel)6zJN=?13FB7H(lQjRkSy8x_-S~tvu2gzn1oS+dLcF#eqtq$ z%tf9TTvX?`)R@}3uBI;jzS-=ZR-Td&MHaS&;!0?Ni*#$#`n*~CcQK)Q9vAQ~TUpnI!j)a2biYK^R)M~A5wUDZhx?ULMX z3x1P&qt=trOY6P2U67L=m=U?F|5#Uj(eCueNTZaHs_ceWiHeET+j+tp3Jt9g(ekqP z2WOvfR{qV+9r+o4J5?qK>7;;^+I7tGv-i)es$X_D=EoKF+S?zsyj^oRFElP}c}JT< zd8SUs-?O?}2YD#ngKbnHgzHBcboxK_2r9l(?eNCl-pEzkJm}fY?WC*jnS?VBE4EpY zO$fEejz6fU;W2Kl>JeQBZBl-%Irg`obSlg*@4QB;Dd1H7^Oi5wvt4d{RZ!8Og?^aE z)k0$1g+V3fd(gdQ3d&q2q-FL*uy#}|bc^=VhFsl0jBgUGJ+-s3U8MK9A!YJJMxpci z5hJ%|{DwV48fZn0{n5l$N_KcSb#NKE4plB`9I6Zt=Z!~-zw0{9tg$L&Ju1F0X)Cy8 zKF;(&lJ>x)Jw(=;p~sF(Sd9VWGwFE2rnyS9!f^DZ8+aCLq zQ};>lcJ1GDLqjm6Hd>|Eabno@P`~Bn(~6^aD_#yoEH(a?Nm1S<;S+hSxI5d16^<1lEM3NPFi zkqPrpL)+ zgnseFikg`gJVBha1&7C4;O6>h=dt~`ND+;Zd?W(4v2JIb7Pt>Td42%M-Ju-XAH#Pns762L}K3 zDhvsRqN0Ni(1UrishD2YvV?4*h2iFj$+&N||Fn$4n|^NSU+o?~jq`0jVQt8T9l{7b zXiwwODFh2V!Q6sqP9S>WH$oOf$N~=d0-bqTlD61!=`&0eAP-F>XN?*|gtOXX{ zQVTWyYo4ZK0GAw!GHf|pz9`D;-bbb*5LBX*{bnz|+)$@&P9|ORM2o?95{;ejvo&r- zq8cBhTN6nn)7~W>54U)%-F_-b?YKdfk5I8MHcuzBD5)!;yv#Z&R&^y=@=>VTIMy#r zX&U<=BsPkdqcMe<_}2+>H%XKyrr5ZR8_KVe>ZqYN z^=^~TFD};;rHJ$U;{~w^hYojl4hRI@SH$^K{YEo=sg)WY87r!*7blQK&qnpDo0`Vn zkl)9u9g=mCh&ZCJS(L4yN3k0kQ zuvg$h2KEEk51T+O0JQ+r0`R>g{jvqM0Mr6d3qUOZwE!?PI7HY@CE|dr sfw?Q;rAv?G4&^^8-z_>&sWXMxvD*gPOU4CBe-*@OtE+wfmVJNyHv)PfH~;_u diff --git a/OSX/PrefsReader.m b/OSX/PrefsReader.m index 40442802..a1c4ed48 100644 --- a/OSX/PrefsReader.m +++ b/OSX/PrefsReader.m @@ -1,4 +1,4 @@ -/* xscreensaver, Copyright (c) 2006-2013 Jamie Zawinski +/* xscreensaver, Copyright (c) 2006-2015 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 @@ -97,7 +97,9 @@ { NSObject *obj = (NSObject *) CFPreferencesCopyAppValue ((CFStringRef) key, (CFStringRef) domain); - if (!obj && defaults) + if (obj) + [obj autorelease]; + else if (defaults) obj = [defaults objectForKey:key]; return obj; } diff --git a/OSX/PxPlus_IBM_VGA8.ttf b/OSX/PxPlus_IBM_VGA8.ttf new file mode 100644 index 0000000000000000000000000000000000000000..0368d2bbae0b02dfeeb66950db2f79109714756e GIT binary patch literal 70956 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 R^=He$?&EgLd4Nx=^)H(@vR(iH literal 0 HcmV?d00001 diff --git a/OSX/README b/OSX/README index 68c2d003..555e8e25 100644 --- a/OSX/README +++ b/OSX/README @@ -15,25 +15,28 @@ ridiculously long list of steps! 1: Duplicate a target (Dangerball for GL, or Attraction for X11). 2: Rename it, and drag it to the right spot in the list. - 3: Delete the dangerball.c and dangerball.xml files from the new target. + 3: Delete the dangerball.c and dangerball.xml files from Build Phases. 4: Delete the "DangerBall copy-Info.plist" file that got created. 5: Delete the "DangerBall copy-Info.plist" from the Build Settings too. - 6: Change PRODUCT_NAME in Build Settings. + 6: Change PRODUCT_NAME in Build Settings (maybe this automatic now?) 7: Manage Schemes, rename "DangerBall Copy". 8: Move to the right place in the list. 9: Scheme / Run / Info: Executable: SaverTester.app. 10: Scheme / Run / Arguments: set SELECTED_SAVER environment variable. 11: File / Add Files / the new .c and .xml. - Add to targets: the new target, and also "XScreenSaver-iOS". - 12: Re-order them in the file list. - 13: In target "All Savers (OpenGL)" add the new target as a dependency. - 14: In target "XScreenSaver-iOS", reorder new files in "Copy" and "Compile". - 15: In target "XScreenSaver-iOS", add "-DUSE_GL" to the new file's options. - 16: Put a 200x150 screen shot in ~/www/xscreensaver/screenshots/ - 17: ln -s ../../src/xscreensaver/OSX/build/Debug/NEW.saver \ + 12: Select each file in the left pane; see Target Membership in the right + pane and add them to the new target, and to "XScreenSaver-iOS". + 13: Re-order them in the file list. + 14: In target "All Savers (OpenGL)" add the new target as Build Phases / + Target Dependency. + 15: In target "XScreenSaver-iOS", reorder new files in Build Phases / + "Copy" and "Compile", since they showed up in a random place. + 16: In target "XScreenSaver-iOS", add "-DUSE_GL" to the new file's options. + 17: Put a 200x150 screen shot in ~/www/xscreensaver/screenshots/ + 18: ln -s ../../src/xscreensaver/OSX/build/Debug/NEW.saver \ ~/Library/Screen\ Savers/ - 18: git add xscreensaver.xcodeproj/xcuserdata/*/xcschemes/*.xcscheme - 19: Don't forget to create a man page from the XML with xml2man.pl, + 19: git add xscreensaver.xcodeproj/xcuserdata/*/xcschemes/*.xcscheme + 20: Don't forget to create a man page from the XML with xml2man.pl, and update Makefile.in. - 20: Make a video: -record-animation 3600 -delay 1 -geom 1920x1080+128+64 + 21: Make a video: -record-animation 3600 -delay 1 -geom 1920x1080+128+64 ./upload-video.pl NAME diff --git a/OSX/SaverListController.m b/OSX/SaverListController.m index 05d2c436..9377275b 100644 --- a/OSX/SaverListController.m +++ b/OSX/SaverListController.m @@ -28,7 +28,7 @@ - (void) titleTapped:(id) sender { [[UIApplication sharedApplication] - openURL:[NSURL URLWithString:@"http://www.jwz.org/xscreensaver/"]]; + openURL:[NSURL URLWithString:@"https://www.jwz.org/xscreensaver/"]]; } @@ -65,8 +65,9 @@ [button addTarget:self action:@selector(titleTapped:) forControlEvents:UIControlEventTouchUpInside]; - self.navigationItem.rightBarButtonItem = - [[UIBarButtonItem alloc] initWithCustomView: button]; + UIBarButtonItem *bi = [[UIBarButtonItem alloc] initWithCustomView: button]; + self.navigationItem.rightBarButtonItem = bi; + [bi release]; [button release]; // The title bar diff --git a/OSX/SaverRunner.h b/OSX/SaverRunner.h index 8e88b86b..bacfd386 100644 --- a/OSX/SaverRunner.h +++ b/OSX/SaverRunner.h @@ -51,7 +51,11 @@ orientation just before the view controller is modal-presented, and restore the proper status bar orientation just before the saverView is created so it can pick it up in didRotate:. */ - UIInterfaceOrientation _storedOrientation; + // UIInterfaceOrientation _storedOrientation; + + BOOL _showAboutBox; + UIView *aboutBox; + NSTimer *splashTimer; } @property(nonatomic, retain) NSString *saverName; @@ -85,14 +89,12 @@ SaverViewController *nonrotating_controller; // Hierarchy 2 (savers) UIImage *saved_screenshot; - UIView *aboutBox; - NSTimer *splashTimer; # endif // USE_IPHONE } -- (XScreenSaverView *) makeSaverView: (NSString *) module - withSize: (NSSize) size; +- (XScreenSaverView *) newSaverView: (NSString *) module + withSize: (NSSize) size; - (void) loadSaver: (NSString *)name; - (void) selectedSaverDidChange:(NSDictionary *)change; @@ -101,8 +103,8 @@ #else // USE_IPHONE - (void) openPreferences: (NSString *)which; - (UIImage *) screenshot; -- (void)aboutPanel:(UIView *)saverView - orientation:(UIInterfaceOrientation)orient; +- (NSString *) makeDesc:(NSString *)saver + yearOnly:(BOOL) yearp; #endif // USE_IPHONE @end diff --git a/OSX/SaverRunner.m b/OSX/SaverRunner.m index b3ae2818..ac010b9f 100644 --- a/OSX/SaverRunner.m +++ b/OSX/SaverRunner.m @@ -1,4 +1,4 @@ -/* xscreensaver, Copyright (c) 2006-2015 Jamie Zawinski +/* xscreensaver, Copyright (c) 2006-2016 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 @@ -77,7 +77,7 @@ return allowRotation; } -- (NSUInteger)supportedInterfaceOrientations /* Added in iOS 6 */ +- (UIInterfaceOrientationMask)supportedInterfaceOrientations /* Added in iOS 6 */ { return UIInterfaceOrientationMaskAll; } @@ -90,11 +90,13 @@ @synthesize saverName; - (id)initWithSaverRunner:(SaverRunner *)parent + showAboutBox:(BOOL)showAboutBox { self = [super init]; if (self) { _parent = parent; - _storedOrientation = UIInterfaceOrientationUnknown; + // _storedOrientation = UIInterfaceOrientationUnknown; + _showAboutBox = showAboutBox; self.modalTransitionStyle = UIModalTransitionStyleCrossDissolve; self.wantsFullScreenLayout = YES; @@ -106,7 +108,13 @@ - (void)dealloc { [_saverName release]; - [_saverView dealloc]; + // iOS: When a UIView deallocs, it doesn't do [UIView removeFromSuperView] + // for its subviews, so the subviews end up with a dangling pointer in their + // superview properties. + [aboutBox removeFromSuperview]; + [aboutBox release]; + [_saverView removeFromSuperview]; + [_saverView release]; [super dealloc]; } @@ -121,6 +129,200 @@ UIView *backgroundView = [[UIView alloc] initWithFrame:CGRectNull]; backgroundView.backgroundColor = [UIColor blackColor]; self.view = backgroundView; + [backgroundView release]; +} + + +- (void)aboutPanel:(UIView *)saverView + orientation:(UIInterfaceOrientation)orient +{ + if (!_showAboutBox) + return; + + NSString *name = _saverName; + NSString *year = [_parent makeDesc:_saverName yearOnly:YES]; + + + CGRect frame = [saverView frame]; + CGFloat rot; + CGFloat pt1 = 24; + CGFloat pt2 = 14; + UIFont *font1 = [UIFont boldSystemFontOfSize: pt1]; + UIFont *font2 = [UIFont italicSystemFontOfSize:pt2]; + +# ifdef __IPHONE_7_0 + CGSize s = CGSizeMake(frame.size.width, frame.size.height); + CGSize tsize1 = [[[NSAttributedString alloc] + initWithString: name + attributes:@{ NSFontAttributeName: font1 }] + boundingRectWithSize: s + options: NSStringDrawingUsesLineFragmentOrigin + context: nil].size; + CGSize tsize2 = [[[NSAttributedString alloc] + initWithString: name + attributes:@{ NSFontAttributeName: font2 }] + boundingRectWithSize: s + options: NSStringDrawingUsesLineFragmentOrigin + context: nil].size; +# else // iOS 6 or Cocoa + CGSize tsize1 = [name sizeWithFont:font1 + constrainedToSize:CGSizeMake(frame.size.width, + frame.size.height)]; + CGSize tsize2 = [year sizeWithFont:font2 + constrainedToSize:CGSizeMake(frame.size.width, + frame.size.height)]; +# endif + + CGSize tsize = CGSizeMake (tsize1.width > tsize2.width ? + tsize1.width : tsize2.width, + tsize1.height + tsize2.height); + + tsize.width = ceilf(tsize.width); + tsize.height = ceilf(tsize.height); + + // Don't know how to find inner margin of UITextView. + CGFloat margin = 10; + tsize.width += margin * 4; + tsize.height += margin * 2; + + if ([saverView frame].size.width >= 768) + tsize.height += pt1 * 3; // extra bottom margin on iPad + + frame = CGRectMake (0, 0, tsize.width, tsize.height); + + /* Get the text oriented properly, and move it to the bottom of the + screen, since many savers have action in the middle. + */ + switch (orient) { + case UIInterfaceOrientationLandscapeLeft: + rot = -M_PI/2; + frame.origin.x = ([saverView frame].size.width + - (tsize.width - tsize.height) / 2 + - tsize.height); + frame.origin.y = ([saverView frame].size.height - tsize.height) / 2; + break; + case UIInterfaceOrientationLandscapeRight: + rot = M_PI/2; + frame.origin.x = -(tsize.width - tsize.height) / 2; + frame.origin.y = ([saverView frame].size.height - tsize.height) / 2; + break; + case UIInterfaceOrientationPortraitUpsideDown: + rot = M_PI; + frame.origin.x = ([saverView frame].size.width - tsize.width) / 2; + frame.origin.y = 0; + break; + default: + rot = 0; + frame.origin.x = ([saverView frame].size.width - tsize.width) / 2; + frame.origin.y = [saverView frame].size.height - tsize.height; + break; + } + + if (aboutBox) { + [aboutBox removeFromSuperview]; + [aboutBox release]; + } + + aboutBox = [[UIView alloc] initWithFrame:frame]; + + aboutBox.transform = CGAffineTransformMakeRotation (rot); + aboutBox.backgroundColor = [UIColor clearColor]; + + /* There seems to be no easy way to stroke the font, so instead draw + it 5 times, 4 in black and 1 in yellow, offset by 1 pixel, and add + a black shadow to each. (You'd think the shadow alone would be + enough, but there's no way to make it dark enough to be legible.) + */ + for (int i = 0; i < 5; i++) { + UITextView *textview; + int off = 1; + frame.origin.x = frame.origin.y = 0; + switch (i) { + case 0: frame.origin.x = -off; break; + case 1: frame.origin.x = off; break; + case 2: frame.origin.y = -off; break; + case 3: frame.origin.y = off; break; + } + + for (int j = 0; j < 2; j++) { + + frame.origin.y = (j == 0 ? 0 : pt1); + textview = [[UITextView alloc] initWithFrame:frame]; + textview.font = (j == 0 ? font1 : font2); + textview.text = (j == 0 ? name : year); + textview.textAlignment = NSTextAlignmentCenter; + textview.showsHorizontalScrollIndicator = NO; + textview.showsVerticalScrollIndicator = NO; + textview.scrollEnabled = NO; + textview.editable = NO; + textview.userInteractionEnabled = NO; + textview.backgroundColor = [UIColor clearColor]; + textview.textColor = (i == 4 + ? [UIColor yellowColor] + : [UIColor blackColor]); + + CALayer *textLayer = (CALayer *) + [textview.layer.sublayers objectAtIndex:0]; + textLayer.shadowColor = [UIColor blackColor].CGColor; + textLayer.shadowOffset = CGSizeMake(0, 0); + textLayer.shadowOpacity = 1; + textLayer.shadowRadius = 2; + + [aboutBox addSubview:textview]; + } + } + + CABasicAnimation *anim = + [CABasicAnimation animationWithKeyPath:@"opacity"]; + anim.duration = 0.3; + anim.repeatCount = 1; + anim.autoreverses = NO; + anim.fromValue = [NSNumber numberWithFloat:0.0]; + anim.toValue = [NSNumber numberWithFloat:1.0]; + [aboutBox.layer addAnimation:anim forKey:@"animateOpacity"]; + + [saverView addSubview:aboutBox]; + + if (splashTimer) + [splashTimer invalidate]; + + splashTimer = + [NSTimer scheduledTimerWithTimeInterval: anim.duration + 2 + target:self + selector:@selector(aboutOff) + userInfo:nil + repeats:NO]; +} + + +- (void)aboutOff +{ + [self aboutOff:FALSE]; +} + +- (void)aboutOff:(BOOL)fast +{ + if (aboutBox) { + if (splashTimer) { + [splashTimer invalidate]; + splashTimer = 0; + } + if (fast) { + aboutBox.layer.opacity = 0; + return; + } + + CABasicAnimation *anim = + [CABasicAnimation animationWithKeyPath:@"opacity"]; + anim.duration = 0.3; + anim.repeatCount = 1; + anim.autoreverses = NO; + anim.fromValue = [NSNumber numberWithFloat: 1]; + anim.toValue = [NSNumber numberWithFloat: 0]; + // anim.delegate = self; + aboutBox.layer.opacity = 0; + [aboutBox.layer addAnimation:anim forKey:@"animateOpacity"]; + } } @@ -133,14 +335,16 @@ [_saverView release]; } +# if 0 if (_storedOrientation != UIInterfaceOrientationUnknown) { [[UIApplication sharedApplication] setStatusBarOrientation:_storedOrientation animated:NO]; } +# endif - _saverView = [_parent makeSaverView:_saverName - withSize:parentView.bounds.size]; + _saverView = [_parent newSaverView:_saverName + withSize:parentView.bounds.size]; if (! _saverView) { [[[UIAlertView alloc] initWithTitle: _saverName @@ -153,6 +357,8 @@ } _saverView.delegate = _parent; + _saverView.autoresizingMask = + UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight; [self.view addSubview:_saverView]; @@ -160,12 +366,14 @@ // heirarchy. [_saverView becomeFirstResponder]; // For shakes on iOS 6. [_saverView startAnimation]; - [_parent aboutPanel:_saverView orientation:_storedOrientation]; + [self aboutPanel:_saverView + orientation:/* _storedOrientation */ UIInterfaceOrientationPortrait]; } - (void)viewDidAppear:(BOOL)animated { + [super viewDidAppear:animated]; [self createSaverView]; } @@ -178,23 +386,25 @@ - (BOOL)shouldAutorotate /* Added in iOS 6 */ { - return NO; + return YES; } -- (NSUInteger)supportedInterfaceOrientations /* Added in iOS 6 */ +- (UIInterfaceOrientationMask)supportedInterfaceOrientations /* Added in iOS 6 */ { // Lies from the iOS docs: // "This method is only called if the view controller's shouldAutorotate // method returns YES." - return UIInterfaceOrientationMaskPortrait; + return UIInterfaceOrientationMaskAll; } +/* - (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation { return UIInterfaceOrientationPortrait; } +*/ - (void)setSaverName:(NSString *)name @@ -202,12 +412,43 @@ [name retain]; [_saverName release]; _saverName = name; - _storedOrientation = [UIApplication sharedApplication].statusBarOrientation; + // _storedOrientation = + // [UIApplication sharedApplication].statusBarOrientation; if (_saverView) [self createSaverView]; } + +- (void)viewWillTransitionToSize: (CGSize)size + withTransitionCoordinator: + (id) coordinator +{ + [super viewWillTransitionToSize:size withTransitionCoordinator:coordinator]; + + if (!_saverView) + return; + + [CATransaction begin]; + + // Completely suppress the rotation animation, since we + // will not (visually) be rotating at all. + if ([_saverView suppressRotationAnimation]) + [CATransaction setDisableActions:YES]; + + [self aboutOff:TRUE]; // It does goofy things if we rotate while it's up + + [coordinator animateAlongsideTransition:^ + (id context) { + // This executes repeatedly during the rotation. + } completion:^(id context) { + // This executes once when the rotation has finished. + [CATransaction commit]; + [_saverView orientationChanged]; + }]; + // No code goes here, as it would execute before the above completes. +} + @end #endif // USE_IPHONE @@ -216,8 +457,8 @@ @implementation SaverRunner -- (XScreenSaverView *) makeSaverView: (NSString *) module - withSize: (NSSize) size +- (XScreenSaverView *) newSaverView: (NSString *) module + withSize: (NSSize) size { Class new_class = 0; @@ -293,7 +534,7 @@ */ # ifndef USE_IPHONE if ([saverNames count] == 1) { - putenv (strdup ("XSCREENSAVER_STANDALONE=1")); + setenv ("XSCREENSAVER_STANDALONE", "1", 1); } # endif @@ -516,8 +757,8 @@ relabel_menus (NSObject *v, NSString *old_str, NSString *new_str) - (void) openPreferences: (NSString *) saver { - XScreenSaverView *saverView = [self makeSaverView:saver - withSize:CGSizeMake(0, 0)]; + XScreenSaverView *saverView = [self newSaverView:saver + withSize:CGSizeMake(0, 0)]; if (! saverView) return; NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults]; @@ -526,8 +767,6 @@ relabel_menus (NSObject *v, NSString *old_str, NSString *new_str) [rotating_nav pushViewController: [saverView configureView] animated:YES]; - - [saverView release]; } @@ -567,15 +806,15 @@ relabel_menus (NSObject *v, NSString *old_str, NSString *new_str) } NSSize size = [cv frame].size; - ScreenSaverView *new_view = [self makeSaverView:name withSize: size]; + ScreenSaverView *new_view = [self newSaverView:name withSize: size]; NSAssert (new_view, @"unable to make a saver view"); [new_view setFrame: (old_view ? [old_view frame] : [cv frame])]; [sup addSubview: new_view]; [win makeFirstResponder:new_view]; [new_view setAutoresizingMask:NSViewWidthSizable|NSViewHeightSizable]; - [new_view retain]; [new_view startAnimation]; + [new_view release]; } NSUserDefaultsController *ctl = @@ -584,7 +823,7 @@ relabel_menus (NSObject *v, NSString *old_str, NSString *new_str) # else // USE_IPHONE -# if TARGET_IPHONE_SIMULATOR +# if !defined __OPTIMIZE__ || TARGET_IPHONE_SIMULATOR NSLog (@"selecting saver \"%@\"", name); # endif @@ -608,7 +847,7 @@ relabel_menus (NSObject *v, NSString *old_str, NSString *new_str) return; } -# if TARGET_IPHONE_SIMULATOR +# if !defined __OPTIMIZE__ || TARGET_IPHONE_SIMULATOR UIScreen *screen = [UIScreen mainScreen]; /* 'nativeScale' is very confusing. @@ -685,7 +924,9 @@ relabel_menus (NSObject *v, NSString *old_str, NSString *new_str) // presentation full screen. rotating_nav.modalPresentationStyle = UIModalPresentationFullScreen; - nonrotating_controller = [[SaverViewController alloc] initWithSaverRunner:self]; + nonrotating_controller = [[SaverViewController alloc] + initWithSaverRunner:self + showAboutBox:[saverNames count] != 1]; nonrotating_controller.saverName = name; /* LAUNCH: */ @@ -712,197 +953,17 @@ relabel_menus (NSObject *v, NSString *old_str, NSString *new_str) [d setValue:[bd objectForKey:@"CFBundleShortVersionString"] forKey:@"ApplicationVersion"]; [d setValue:[bd objectForKey:@"NSHumanReadableCopyright"] forKey:@"Copy"]; - [d setValue:[[NSAttributedString alloc] - initWithString: (NSString *) - [bd objectForKey:@"CFBundleGetInfoString"]] - forKey:@"Credits"]; - + NSAttributedString *s = [[NSAttributedString alloc] + initWithString: (NSString *) + [bd objectForKey:@"CFBundleGetInfoString"]]; + [d setValue:s forKey:@"Credits"]; + [s release]; + [[NSApplication sharedApplication] orderFrontStandardAboutPanelWithOptions:d]; } -#else // USE_IPHONE - -- (void)aboutPanel:(UIView *)saverView - orientation:(UIInterfaceOrientation)orient -{ - if ([saverNames count] == 1) - return; - - NSString *name = saverName; - NSString *year = [self makeDesc:saverName yearOnly:YES]; - - - CGRect frame = [saverView frame]; - CGFloat rot; - CGFloat pt1 = 24; - CGFloat pt2 = 14; - UIFont *font1 = [UIFont boldSystemFontOfSize: pt1]; - UIFont *font2 = [UIFont italicSystemFontOfSize:pt2]; - -# ifdef __IPHONE_7_0 - CGSize s = CGSizeMake(frame.size.width, frame.size.height); - CGSize tsize1 = [[[NSAttributedString alloc] - initWithString: name - attributes:@{ NSFontAttributeName: font1 }] - boundingRectWithSize: s - options: NSStringDrawingUsesLineFragmentOrigin - context: nil].size; - CGSize tsize2 = [[[NSAttributedString alloc] - initWithString: name - attributes:@{ NSFontAttributeName: font2 }] - boundingRectWithSize: s - options: NSStringDrawingUsesLineFragmentOrigin - context: nil].size; -# else // iOS 6 or Cocoa - CGSize tsize1 = [name sizeWithFont:font1 - constrainedToSize:CGSizeMake(frame.size.width, - frame.size.height)]; - CGSize tsize2 = [year sizeWithFont:font2 - constrainedToSize:CGSizeMake(frame.size.width, - frame.size.height)]; -# endif - - CGSize tsize = CGSizeMake (tsize1.width > tsize2.width ? - tsize1.width : tsize2.width, - tsize1.height + tsize2.height); - - tsize.width = ceilf(tsize.width); - tsize.height = ceilf(tsize.height); - - // Don't know how to find inner margin of UITextView. - CGFloat margin = 10; - tsize.width += margin * 4; - tsize.height += margin * 2; - - if ([saverView frame].size.width >= 768) - tsize.height += pt1 * 3; // extra bottom margin on iPad - - frame = CGRectMake (0, 0, tsize.width, tsize.height); - - /* Get the text oriented properly, and move it to the bottom of the - screen, since many savers have action in the middle. - */ - switch (orient) { - case UIInterfaceOrientationLandscapeLeft: - rot = -M_PI/2; - frame.origin.x = ([saverView frame].size.width - - (tsize.width - tsize.height) / 2 - - tsize.height); - frame.origin.y = ([saverView frame].size.height - tsize.height) / 2; - break; - case UIInterfaceOrientationLandscapeRight: - rot = M_PI/2; - frame.origin.x = -(tsize.width - tsize.height) / 2; - frame.origin.y = ([saverView frame].size.height - tsize.height) / 2; - break; - case UIInterfaceOrientationPortraitUpsideDown: - rot = M_PI; - frame.origin.x = ([saverView frame].size.width - tsize.width) / 2; - frame.origin.y = 0; - break; - default: - rot = 0; - frame.origin.x = ([saverView frame].size.width - tsize.width) / 2; - frame.origin.y = [saverView frame].size.height - tsize.height; - break; - } - - if (aboutBox) - [aboutBox removeFromSuperview]; - - aboutBox = [[UIView alloc] initWithFrame:frame]; - - aboutBox.transform = CGAffineTransformMakeRotation (rot); - aboutBox.backgroundColor = [UIColor clearColor]; - - /* There seems to be no easy way to stroke the font, so instead draw - it 5 times, 4 in black and 1 in yellow, offset by 1 pixel, and add - a black shadow to each. (You'd think the shadow alone would be - enough, but there's no way to make it dark enough to be legible.) - */ - for (int i = 0; i < 5; i++) { - UITextView *textview; - int off = 1; - frame.origin.x = frame.origin.y = 0; - switch (i) { - case 0: frame.origin.x = -off; break; - case 1: frame.origin.x = off; break; - case 2: frame.origin.y = -off; break; - case 3: frame.origin.y = off; break; - } - - for (int j = 0; j < 2; j++) { - - frame.origin.y = (j == 0 ? 0 : pt1); - textview = [[UITextView alloc] initWithFrame:frame]; - textview.font = (j == 0 ? font1 : font2); - textview.text = (j == 0 ? name : year); - textview.textAlignment = NSTextAlignmentCenter; - textview.showsHorizontalScrollIndicator = NO; - textview.showsVerticalScrollIndicator = NO; - textview.scrollEnabled = NO; - textview.editable = NO; - textview.userInteractionEnabled = NO; - textview.backgroundColor = [UIColor clearColor]; - textview.textColor = (i == 4 - ? [UIColor yellowColor] - : [UIColor blackColor]); - - CALayer *textLayer = (CALayer *) - [textview.layer.sublayers objectAtIndex:0]; - textLayer.shadowColor = [UIColor blackColor].CGColor; - textLayer.shadowOffset = CGSizeMake(0, 0); - textLayer.shadowOpacity = 1; - textLayer.shadowRadius = 2; - - [aboutBox addSubview:textview]; - } - } - - CABasicAnimation *anim = - [CABasicAnimation animationWithKeyPath:@"opacity"]; - anim.duration = 0.3; - anim.repeatCount = 1; - anim.autoreverses = NO; - anim.fromValue = [NSNumber numberWithFloat:0.0]; - anim.toValue = [NSNumber numberWithFloat:1.0]; - [aboutBox.layer addAnimation:anim forKey:@"animateOpacity"]; - - [saverView addSubview:aboutBox]; - - if (splashTimer) - [splashTimer invalidate]; - - splashTimer = - [NSTimer scheduledTimerWithTimeInterval: anim.duration + 2 - target:self - selector:@selector(aboutOff) - userInfo:nil - repeats:NO]; -} - - -- (void)aboutOff -{ - if (aboutBox) { - if (splashTimer) { - [splashTimer invalidate]; - splashTimer = 0; - } - CABasicAnimation *anim = - [CABasicAnimation animationWithKeyPath:@"opacity"]; - anim.duration = 0.3; - anim.repeatCount = 1; - anim.autoreverses = NO; - anim.fromValue = [NSNumber numberWithFloat: 1]; - anim.toValue = [NSNumber numberWithFloat: 0]; - anim.delegate = self; - aboutBox.layer.opacity = 0; - [aboutBox.layer addAnimation:anim forKey:@"animateOpacity"]; - } -} -#endif // USE_IPHONE +#endif // !USE_IPHONE @@ -942,12 +1003,6 @@ relabel_menus (NSObject *v, NSString *old_str, NSString *new_str) NSString *name = [[p lastPathComponent] stringByDeletingPathExtension]; # ifdef USE_IPHONE - -# ifdef __OPTIMIZE__ - // Do not show TestX11 in release builds. - if (! [name caseInsensitiveCompare:@"testx11"]) - continue; -# endif // Get the saver name's capitalization right by reading the XML file. p = [dir stringByAppendingPathComponent: p]; @@ -1068,6 +1123,7 @@ relabel_menus (NSObject *v, NSString *old_str, NSString *new_str) NSRect r = [popup frame]; r.size.width = max_width; [popup setFrame:r]; + [popup autorelease]; return popup; } @@ -1185,9 +1241,23 @@ FAIL: and/or 8.2), this confuses the UINavigationController, so put the orientation back to portrait before dismissing the SaverViewController. */ +# if 0 [[UIApplication sharedApplication] setStatusBarOrientation:UIInterfaceOrientationPortrait animated:NO]; +# endif + + /* Make sure the most-recently-run saver is visible. Sometimes it ends + up scrolled half a line off the bottom of the screen. + */ + if (saverName) { + for (UIViewController *v in [rotating_nav viewControllers]) { + if ([v isKindOfClass:[SaverListController class]]) { + [(SaverListController *)v scrollTo: saverName]; + break; + } + } + } [rotating_nav dismissViewControllerAnimated:YES completion:^() { [nonrotating_controller release]; @@ -1301,8 +1371,10 @@ FAIL: [pbox setTitlePosition:NSNoTitle]; [pbox setBorderType:NSNoBorder]; [pbox addSubview:gbox]; + [gbox release]; if (menu) [pbox addSubview:menu]; if (pb) [pbox addSubview:pb]; + [pb release]; [pbox sizeToFit]; [pb setAutoresizingMask:NSViewMinXMargin|NSViewMaxXMargin]; @@ -1334,10 +1406,12 @@ FAIL: screen:screen]; [win setMinSize:[win frameRectForContentRect:rect].size]; [[win contentView] addSubview: (pbox ? (NSView *) pbox : (NSView *) sv)]; + [pbox release]; [win makeKeyAndOrderFront:win]; [sv startAnimation]; // this is the dummy saver + [sv autorelease]; count++; @@ -1386,6 +1460,7 @@ FAIL: [a addObject: win]; // This prevents clicks from being seen by savers. // [win setMovableByWindowBackground:YES]; + [win release]; } # else // USE_IPHONE @@ -1419,6 +1494,7 @@ FAIL: descriptions:[self makeDescTable]]; [rotating_nav pushViewController:menu animated:YES]; [menu becomeFirstResponder]; + [menu autorelease]; application.applicationSupportsShakeToEdit = YES; diff --git a/OSX/SaverRunner.plist b/OSX/SaverRunner.plist index d28e99aa..b3b74991 100644 --- a/OSX/SaverRunner.plist +++ b/OSX/SaverRunner.plist @@ -7,29 +7,29 @@ CFBundleExecutable ${EXECUTABLE_NAME} CFBundleGetInfoString - 5.34 + 5.35 CFBundleIconFile SaverRunner CFBundleIdentifier - ${BUNDLE_IDENTIFIER} + $(PRODUCT_BUNDLE_IDENTIFIER) CFBundleInfoDictionaryVersion 6.0 CFBundleLongVersionString - 5.34 + 5.35 CFBundleName ${PRODUCT_NAME} CFBundlePackageType APPL CFBundleShortVersionString - 5.34 + 5.35 CFBundleSignature ???? CFBundleVersion - 5.34 + 5.35 LSMinimumSystemVersion ${MACOSX_DEPLOYMENT_TARGET} NSHumanReadableCopyright - 5.34 + 5.35 NSMainNibFile SaverRunner NSPrincipalClass diff --git a/OSX/Updater.plist b/OSX/Updater.plist index b8550832..692f7a01 100644 --- a/OSX/Updater.plist +++ b/OSX/Updater.plist @@ -4,36 +4,36 @@ CFBundleDevelopmentRegion English + CFBundleDisplayName + XScreenSaver CFBundleExecutable ${EXECUTABLE_NAME} CFBundleGetInfoString - 5.34 + 5.35 CFBundleIconFile SaverRunner CFBundleIdentifier - $(BUNDLE_IDENTIFIER) + $(PRODUCT_BUNDLE_IDENTIFIER) CFBundleInfoDictionaryVersion 6.0 CFBundleLongVersionString - 5.34 + 5.35 CFBundleName ${PRODUCT_NAME} - CFBundleDisplayName - XScreenSaver CFBundlePackageType APPL CFBundleShortVersionString - 5.34 + 5.35 CFBundleSignature ???? CFBundleVersion - 5.34 + 5.35 LSMinimumSystemVersion ${MACOSX_DEPLOYMENT_TARGET} LSUIElement NSHumanReadableCopyright - 5.34 + 5.35 NSMainNibFile Updater NSPrincipalClass @@ -41,7 +41,7 @@ SUEnableSystemProfiling SUFeedURL - http://www.jwz.org/xscreensaver/updates.xml + https://www.jwz.org/xscreensaver/updates.xml SUPublicDSAKeyFile sparkle_dsa_pub.pem SUScheduledCheckInterval diff --git a/OSX/XScreenSaver.plist b/OSX/XScreenSaver.plist index cf23f9c0..9af74f5f 100644 --- a/OSX/XScreenSaver.plist +++ b/OSX/XScreenSaver.plist @@ -7,7 +7,7 @@ CFBundleExecutable ${EXECUTABLE_NAME} CFBundleIdentifier - ${BUNDLE_IDENTIFIER} + $(PRODUCT_BUNDLE_IDENTIFIER) CFBundleInfoDictionaryVersion 6.0 CFBundleName @@ -15,11 +15,11 @@ CFBundlePackageType BNDL CFBundleShortVersionString - 5.34 + 5.35 CFBundleSignature ???? CFBundleVersion - 5.34 + 5.35 LSMinimumSystemVersion 10.4 NSMainNibFile diff --git a/OSX/XScreenSaverConfigSheet.m b/OSX/XScreenSaverConfigSheet.m index ec08b904..576c8ab3 100644 --- a/OSX/XScreenSaverConfigSheet.m +++ b/OSX/XScreenSaverConfigSheet.m @@ -1,4 +1,4 @@ -/* xscreensaver, Copyright (c) 2006-2014 Jamie Zawinski +/* xscreensaver, Copyright (c) 2006-2016 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 @@ -129,6 +129,7 @@ typedef enum { SimpleXMLCommentKind, [n setName:key]; [n setObjectValue:val]; [attributes addObject:n]; + [n release]; } } @@ -543,7 +544,7 @@ static void layout_group (NSView *group, BOOL horiz_p); opts:(const XrmOptionDescRec *)opts_array valRet:(NSString **)val_ret { - char buf[255]; + char buf[1280]; char *tail = 0; NSAssert(cmdline_switch, @"cmdline switch is null"); if (! [cmdline_switch getCString:buf maxLength:sizeof(buf) @@ -1190,6 +1191,8 @@ hreffify (NSText *nstext) [self parseAttrs:dict node:node]; NSString *name = [dict objectForKey:@"name"]; NSString *label = [dict objectForKey:@"_label"]; + [dict release]; + dict = 0; NSAssert1 (label, @"no _label in %@", [node name]); NSAssert1 (name, @"no name in \"%@\"", label); @@ -1223,6 +1226,7 @@ hreffify (NSText *nstext) [lab setAutoresizingMask: (UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight)]; # endif // USE_IPHONE + [lab autorelease]; return lab; } @@ -1240,6 +1244,8 @@ hreffify (NSText *nstext) NSString *label = [dict objectForKey:@"_label"]; NSString *arg_set = [dict objectForKey:@"arg-set"]; NSString *arg_unset = [dict objectForKey:@"arg-unset"]; + [dict release]; + dict = 0; if (!label) { NSAssert1 (0, @"no _label in %@", [node name]); @@ -1283,7 +1289,6 @@ hreffify (NSText *nstext) [self placeChild:lab on:parent]; UISwitch *button = [[UISwitch alloc] initWithFrame:rect]; [self placeChild:button on:parent right:YES]; - [lab release]; # endif // USE_IPHONE @@ -1319,6 +1324,8 @@ hreffify (NSText *nstext) NSString *high = [dict objectForKey:@"high"]; NSString *def = [dict objectForKey:@"default"]; NSString *cvt = [dict objectForKey:@"convert"]; + [dict release]; + dict = 0; NSAssert1 (arg, @"no arg in %@", label); NSAssert1 (type, @"no type in %@", label); @@ -1372,6 +1379,7 @@ hreffify (NSText *nstext) while (range2 > max_ticks) range2 /= 10; +# ifndef USE_IPHONE // If we have elided ticks, leave it at the max number of ticks. if (range != range2 && range2 < max_ticks) range2 = max_ticks; @@ -1380,7 +1388,6 @@ hreffify (NSText *nstext) if (float_p && range2 < max_ticks) range2 = max_ticks; -# ifndef USE_IPHONE [slider setNumberOfTickMarks:range2]; [slider setAllowsTickMarkValuesOnly: @@ -1403,7 +1410,6 @@ hreffify (NSText *nstext) [lab setFont:[NSFont boldSystemFontOfSize:s]]; } # endif - [lab release]; } if (low_label) { @@ -1423,8 +1429,6 @@ hreffify (NSText *nstext) [lab setLineBreakMode:NSLineBreakByClipping]; [self placeChild:lab on:parent right:(label ? YES : NO)]; # endif // USE_IPHONE - - [lab release]; } # ifndef USE_IPHONE @@ -1460,7 +1464,6 @@ hreffify (NSText *nstext) [lab setLineBreakMode:NSLineBreakByClipping]; # endif [self placeChild:lab on:parent right:YES]; - [lab release]; } [self bindSwitch:slider cmdline:arg]; @@ -1500,7 +1503,6 @@ hreffify (NSText *nstext) rect.size.height = [txt frame].size.height; [lab setFrame:rect]; [self placeChild:lab on:parent]; - [lab release]; } [self placeChild:txt on:parent right:(label ? YES : NO)]; @@ -1601,6 +1603,8 @@ set_menu_item_object (NSMenuItem *item, NSObject *obj) // NSMutableDictionary *dict = [@{ @"id": @"", } mutableCopy]; [self parseAttrs:dict node:node]; + [dict release]; + dict = 0; NSRect rect; rect.origin.x = rect.origin.y = 0; @@ -1653,6 +1657,8 @@ set_menu_item_object (NSMenuItem *item, NSObject *obj) [self parseAttrs:dict2 node:child]; NSString *label = [dict2 objectForKey:@"_label"]; NSString *arg_set = [dict2 objectForKey:@"arg-set"]; + [dict2 release]; + dict2 = 0; if (!label) { NSAssert1 (0, @"no _label in %@", [child name]); @@ -1792,6 +1798,7 @@ set_menu_item_object (NSMenuItem *item, NSObject *obj) [b setLineBreakMode:NSLineBreakByTruncatingHead]; [b setFont:[NSFont boldSystemFontOfSize: FONT_SIZE]]; [self placeChild:b on:parent]; + [b release]; i++; } @@ -1829,6 +1836,7 @@ set_menu_item_object (NSMenuItem *item, NSObject *obj) rect.size.height = 50; // sized later # ifndef USE_IPHONE NSText *lab = [[NSText alloc] initWithFrame:rect]; + [lab autorelease]; [lab setEditable:NO]; [lab setDrawsBackground:NO]; [lab setHorizontallyResizable:YES]; @@ -1850,6 +1858,7 @@ set_menu_item_object (NSMenuItem *item, NSObject *obj) HTMLLabel *lab = [[HTMLLabel alloc] initWithText:text font:[NSFont systemFontOfSize: [NSFont systemFontSize]]]; + [lab autorelease]; [lab setFrame:rect]; [lab sizeToFit]; # endif // USE_HTML_LABELS @@ -1859,7 +1868,6 @@ set_menu_item_object (NSMenuItem *item, NSObject *obj) # endif // USE_IPHONE [self placeChild:lab on:parent]; - [lab release]; } @@ -1877,6 +1885,8 @@ set_menu_item_object (NSMenuItem *item, NSObject *obj) [self parseAttrs:dict node:node]; NSString *label = [dict objectForKey:@"_label"]; NSString *arg = [dict objectForKey:@"arg"]; + [dict release]; + dict = 0; if (!label && label_p) { NSAssert1 (0, @"no _label in %@", [node name]); @@ -1927,7 +1937,6 @@ set_menu_item_object (NSMenuItem *item, NSObject *obj) if (label) { LABEL *lab = [self makeLabel:label]; [self placeChild:lab on:parent]; - [lab release]; } [self placeChild:txt on:parent right:(label ? YES : NO)]; @@ -1954,6 +1963,8 @@ set_menu_item_object (NSMenuItem *item, NSObject *obj) [self parseAttrs:dict node:node]; NSString *label = [dict objectForKey:@"_label"]; NSString *arg = [dict objectForKey:@"arg"]; + [dict release]; + dict = 0; if (!label && label_p) { NSAssert1 (0, @"no _label in %@", [node name]); @@ -1985,7 +1996,6 @@ set_menu_item_object (NSMenuItem *item, NSObject *obj) if (label) { lab = [self makeLabel:label]; [self placeChild:lab on:parent]; - [lab release]; } [self placeChild:txt on:parent right:(label ? YES : NO)]; @@ -2043,21 +2053,10 @@ do_file_selector (NSTextField *txt, BOOL dirs_p) [panel setCanChooseFiles:!dirs_p]; [panel setCanChooseDirectories:dirs_p]; - NSString *file = [txt stringValue]; - if ([file length] <= 0) { - file = NSHomeDirectory(); - if (dirs_p) - file = [file stringByAppendingPathComponent:@"Pictures"]; - } - -// NSString *dir = [file stringByDeletingLastPathComponent]; - - int result = [panel runModalForDirectory:file //dir - file:nil //[file lastPathComponent] - types:nil]; + int result = [panel runModal]; if (result == NSOKButton) { - NSArray *files = [panel filenames]; - file = ([files count] > 0 ? [files objectAtIndex:0] : @""); + NSArray *files = [panel URLs]; + NSString *file = ([files count] > 0 ? [[files objectAtIndex:0] path] : @""); file = [file stringByAbbreviatingWithTildeInPath]; [txt setStringValue:file]; @@ -2070,22 +2069,6 @@ do_file_selector (NSTextField *txt, BOOL dirs_p) if ([path hasPrefix:@"values."]) // WTF. path = [path substringFromIndex:7]; [[prefs values] setValue:file forKey:path]; - -#if 0 - // make sure the end of the string is visible. - NSText *fe = [[txt window] fieldEditor:YES forObject:txt]; - NSRange range; - range.location = [file length]-3; - range.length = 1; - if (! [[txt window] makeFirstResponder:[txt window]]) - [[txt window] endEditingFor:nil]; -// [[txt window] makeFirstResponder:nil]; - [fe setSelectedRange:range]; -// [tv scrollRangeToVisible:range]; -// [txt setNeedsDisplay:YES]; -// [[txt cell] setNeedsDisplay:YES]; -// [txt selectAll:txt]; -#endif } } @@ -2189,6 +2172,9 @@ find_text_field_of_button (NSButton *button) [self placeChild:matrix on:group]; [self placeChild:rgroup on:group right:YES]; + [proto release]; + [matrix release]; + [rgroup release]; NSXMLNode *node2; @@ -2212,7 +2198,7 @@ find_text_field_of_button (NSButton *button) @"arg-set": @"-text-mode date", @"_label": @"Display the date and time" }]; [node3 setParent: node2]; - //[node3 release]; + [node3 autorelease]; node3 = [[NSXMLElement alloc] initWithName:@"option"]; [node3 setAttributesAsDictionary: @@ -2220,16 +2206,17 @@ find_text_field_of_button (NSButton *button) @"arg-set": @"-text-mode literal", @"_label": @"Display static text" }]; [node3 setParent: node2]; - //[node3 release]; + [node3 autorelease]; node3 = [[NSXMLElement alloc] initWithName:@"option"]; [node3 setAttributesAsDictionary: @{ @"id": @"url", @"_label": @"Display the contents of a URL" }]; [node3 setParent: node2]; - //[node3 release]; + [node3 autorelease]; [self makeOptionMenu:node2 on:rgroup]; + [node2 release]; # endif // USE_IPHONE @@ -2250,6 +2237,7 @@ find_text_field_of_button (NSButton *button) withLabel:YES # endif horizontal:NO]; + [node2 release]; // rect = [last_child(rgroup) frame]; @@ -2270,6 +2258,7 @@ find_text_field_of_button (NSButton *button) @"arg": @"-text-file %" }]; [self makeFileSelector:node2 on:rgroup dirsOnly:NO withLabel:NO editable:NO]; + [node2 release]; # endif // !USE_IPHONE // rect = [last_child(rgroup) frame]; @@ -2290,6 +2279,7 @@ find_text_field_of_button (NSButton *button) withLabel:YES # endif horizontal:NO]; + [node2 release]; // rect = [last_child(rgroup) frame]; @@ -2302,6 +2292,7 @@ find_text_field_of_button (NSButton *button) @"arg": @"-text-program %", }]; [self makeTextField:node2 on:rgroup withLabel:NO horizontal:NO]; + [node2 release]; } // rect = [last_child(rgroup) frame]; @@ -2357,6 +2348,8 @@ find_text_field_of_button (NSButton *button) [box sizeToFit]; [self placeChild:box on:parent]; + [group release]; + [box release]; # endif // !USE_IPHONE } @@ -2393,6 +2386,7 @@ find_text_field_of_button (NSButton *button) @"arg-unset": @"-no-grab-desktop", }]; [self makeCheckbox:node2 on:parent]; + [node2 release]; node2 = [[NSXMLElement alloc] initWithName:@"boolean"]; [node2 setAttributesAsDictionary: @@ -2401,6 +2395,7 @@ find_text_field_of_button (NSButton *button) @"arg-set": @"-choose-random-images", }]; [self makeCheckbox:node2 on:parent]; + [node2 release]; node2 = [[NSXMLElement alloc] initWithName:@"string"]; [node2 setAttributesAsDictionary: @@ -2410,6 +2405,7 @@ find_text_field_of_button (NSButton *button) }]; [self makeFileSelector:node2 on:parent dirsOnly:YES withLabel:YES editable:YES]; + [node2 release]; # undef SCREENS # undef PHOTOS @@ -2426,7 +2422,6 @@ find_text_field_of_button (NSButton *button) r2.origin.x += 20; r2.origin.y += 14; [lab2 setFrameOrigin:r2.origin]; - [lab2 release]; # endif // USE_IPHONE } @@ -2468,6 +2463,7 @@ find_text_field_of_button (NSButton *button) @"arg-unset": @"-no-" SUSUEnableAutomaticChecksKey, }]; [self makeCheckbox:node2 on:group]; + [node2 release]; // +