From 39809ded547bdbb08207d3e514950425215b4410 Mon Sep 17 00:00:00 2001 From: Zygo Blaxell Date: Thu, 21 Dec 2017 21:17:43 -0500 Subject: [PATCH] From http://www.jwz.org/xscreensaver/xscreensaver-5.38.tar.gz -rw-rw-r-- 1 zblaxell zblaxell 10712548 Dec 20 15:14 xscreensaver-5.38.tar.gz b4e6b6799e8e244c894db277d6ff2bf5ee48290c xscreensaver-5.38.tar.gz --- Makefile.in | 50 +- .../AppIcon.appiconset/Contents.json | 26 + .../AppIcon.appiconset/iSaverRunner1024.png | Bin 0 -> 46983 bytes OSX/SaverRunner.m | 2 +- OSX/SaverRunner.plist | 10 +- OSX/Updater.plist | 10 +- OSX/XScreenSaver.plist | 4 +- OSX/XScreenSaverGLView.m | 9 +- OSX/XScreenSaverView.h | 11 +- OSX/XScreenSaverView.m | 169 +- OSX/bindist.rtf | 4 +- OSX/iSaverRunner.plist | 10 +- OSX/ios-function-table.m | 4 +- OSX/updates.xml | 11 + OSX/xscreensaver.xcodeproj/project.pbxproj | 173 +- README | 131 +- README.hacking | 40 +- aclocal.m4 | 55 +- android/Makefile | 31 +- android/README | 75 +- android/{project/project.iml => android.iml} | 2 +- android/{project => }/build.gradle | 0 .../gradle/wrapper/gradle-wrapper.jar | Bin .../gradle/wrapper/gradle-wrapper.properties | 0 android/{project => }/gradlew | 0 android/{project => }/gradlew.bat | 0 android/{project => }/local.properties | 0 .../xscreensaver/assets/fonts/OCRAStd.otf | 1 - .../assets/fonts/PxPlus_IBM_VGA8.ttf | 1 - .../xscreensaver/assets/fonts/YearlReg.ttf | 1 - .../xscreensaver/XScreenSaverRenderer.java | 196 - android/{project => }/settings.gradle | 0 android/xscreensaver/.idea/.name | 1 + .../xscreensaver/.idea/compiler.xml | 0 .../xscreensaver/.idea/gradle.xml | 0 .../{project => }/xscreensaver/.idea/misc.xml | 7 +- .../xscreensaver/.idea/modules.xml | 2 +- .../xscreensaver/.idea/runConfigurations.xml | 12 + .../xscreensaver/.idea/workspace.xml | 346 +- android/xscreensaver/assets/fonts/OCRAStd.otf | 1 + .../assets/fonts/PxPlus_IBM_VGA8.ttf | 1 + .../xscreensaver/assets/fonts/YearlReg.ttf | 1 + .../{project => }/xscreensaver/build.gradle | 19 +- android/{project => }/xscreensaver/build.xml | 0 .../gradle/wrapper/gradle-wrapper.jar | Bin .../gradle/wrapper/gradle-wrapper.properties | 4 +- android/{project => }/xscreensaver/gradlew | 0 .../{project => }/xscreensaver/gradlew.bat | 0 .../{project => }/xscreensaver/jni/Android.mk | 189 +- .../xscreensaver/jni/Application.mk | 0 .../xscreensaver/local.properties | 0 .../xscreensaver/project.properties | 0 .../xscreensaver/res/drawable-ldpi/icon.png | Bin .../xscreensaver/res/drawable-mdpi/icon.png | Bin .../xscreensaver/res/drawable/thumbnail.png | Bin .../res/layout-land/activity_xscreensaver.xml | 0 .../res/layout/activity_tv_xscreensaver.xml | 41 + .../res/layout/activity_xscreensaver.xml | 0 .../xscreensaver/res/layout/main.xml | 0 .../res/layout/preference_blurb.xml | 0 .../res/layout/slider_preference.xml | 0 .../jwz/xscreensaver/SliderPreference.java | 0 .../src/org/jwz/xscreensaver/TTFAnalyzer.java | 0 .../xscreensaver/XScreenSaverActivity.java | 0 .../org/jwz/xscreensaver/XScreenSaverApp.java | 0 .../xscreensaver/XScreenSaverDaydream.java | 265 +- .../xscreensaver/XScreenSaverSettings.java | 0 .../xscreensaver/XScreenSaverTVActivity.java | 50 + .../xscreensaver/XScreenSaverWallpaper.java | 81 +- .../src/org/jwz/xscreensaver/jwxyz.java | 346 +- .../xscreensaver/xscreensaver.iml | 22 +- config.h.in | 8 + configure | 81 +- driver/XScreenSaver.ad.in | 43 +- driver/XScreenSaver_ad.h | 32 +- driver/demo-Gtk.c | 15 +- driver/dpms.c | 1 + driver/lock.c | 51 +- driver/splash.c | 46 +- driver/test-passwd.c | 4 +- driver/windows.c | 4 +- driver/xscreensaver-command.c | 4 +- driver/xscreensaver-getimage.c | 33 +- driver/xscreensaver.h | 3 +- driver/xscreensaver.man | 2 +- hacks/Makefile.in | 122 +- hacks/analogtv.c | 19 +- hacks/ant.c | 57 +- hacks/apollonian.c | 45 +- hacks/asm6502.c | 6 +- hacks/attraction.c | 7 +- hacks/barcode.c | 6 + hacks/blaster.c | 1 + hacks/bouboule.c | 8 +- hacks/braid.c | 45 +- hacks/bsod.c | 992 +- hacks/bsod.man | 1 + hacks/check-configs.pl | 36 +- hacks/compass.c | 4 + hacks/config/README | 4 +- hacks/config/bsod.xml | 3 +- hacks/config/dnalogo.xml | 2 +- hacks/config/esper.xml | 46 + hacks/config/m6502.xml | 13 +- hacks/config/vermiculate.xml | 2 +- hacks/coral.c | 1 + hacks/crystal.c | 330 +- hacks/demon.c | 37 +- hacks/discrete.c | 42 +- hacks/drift.c | 46 +- hacks/epicycle.c | 11 + hacks/euler2d.c | 50 +- hacks/fadeplot.c | 8 +- hacks/fiberlamp.c | 49 +- hacks/flag.c | 36 +- hacks/flow.c | 31 +- hacks/fluidballs.c | 6 + hacks/forest.c | 4 +- hacks/fps.c | 25 +- hacks/galaxy.c | 32 +- hacks/glx/Makefile.in | 293 +- hacks/glx/antinspect.c | 13 +- hacks/glx/antmaze.c | 4 +- hacks/glx/antspotlight.c | 14 +- hacks/glx/atlantis.c | 35 +- hacks/glx/atunnel.c | 29 +- hacks/glx/b_lockglue.c | 35 +- hacks/glx/blinkbox.c | 15 +- hacks/glx/blocktube.c | 19 +- hacks/glx/boing.c | 13 +- hacks/glx/bouncingcow.c | 13 +- hacks/glx/boxed.c | 18 +- hacks/glx/cage.c | 14 +- hacks/glx/carousel.c | 18 +- hacks/glx/circuit.c | 21 +- hacks/glx/cityflow.c | 13 +- hacks/glx/companion.c | 13 +- hacks/glx/crackberg.c | 6 +- hacks/glx/cube21.c | 15 +- hacks/glx/cubenetic.c | 13 +- hacks/glx/cubestack.c | 13 +- hacks/glx/cubestorm.c | 13 +- hacks/glx/cubetwist.c | 16 +- hacks/glx/cubicgrid.c | 14 +- hacks/glx/dangerball.c | 13 +- hacks/glx/discoball.c | 17 +- hacks/glx/dnalogo.c | 57 +- hacks/glx/dymaxionmap.c | 10 +- hacks/glx/endgame.c | 14 +- hacks/glx/energystream.c | 7 +- hacks/glx/engine.c | 18 +- hacks/glx/erase-gl.c | 38 + hacks/glx/esper.c | 2408 +++ hacks/glx/esper.man | 68 + hacks/glx/extrusion.c | 13 +- hacks/glx/flipflop.c | 29 +- hacks/glx/flipscreen3d.c | 10 +- hacks/glx/fliptext.c | 19 +- hacks/glx/flurry.c | 11 +- hacks/glx/flyingtoasters.c | 13 +- hacks/glx/gears.c | 13 +- hacks/glx/geodesic.c | 13 +- hacks/glx/geodesicgears.c | 15 +- hacks/glx/gflux.c | 4 +- hacks/glx/glblur.c | 4 +- hacks/glx/glcells.c | 9 +- hacks/glx/gleidescope.c | 21 +- hacks/glx/glforestfire.c | 22 +- hacks/glx/glhanoi.c | 22 +- hacks/glx/glknots.c | 13 +- hacks/glx/glmatrix.c | 13 +- hacks/glx/glplanet.c | 10 +- hacks/glx/glschool.c | 6 +- hacks/glx/glslideshow.c | 4 +- hacks/glx/glsnake.c | 25 +- hacks/glx/gltext.c | 91 +- hacks/glx/gltext.man | 24 + hacks/glx/glut_mroman.h | 2456 +++ hacks/glx/grab-ximage.c | 5 +- hacks/glx/hexstrut.c | 16 +- hacks/glx/hilbert.c | 13 +- hacks/glx/hydrostat.c | 7 +- hacks/glx/hypertorus.c | 16 +- hacks/glx/hypnowheel.c | 13 +- hacks/glx/jigglypuff.c | 24 +- hacks/glx/jigsaw.c | 13 +- hacks/glx/juggler3d.c | 5 +- hacks/glx/kaleidocycle.c | 13 +- hacks/glx/klein.c | 4 +- hacks/glx/lament.c | 7 +- hacks/glx/lavalite.c | 13 +- hacks/glx/lockward.c | 19 +- hacks/glx/menger.c | 13 +- hacks/glx/mirrorblob.c | 9 +- hacks/glx/moebius.c | 12 +- hacks/glx/moebiusgears.c | 13 +- hacks/glx/molecule.c | 13 +- hacks/glx/morph3d.c | 14 +- hacks/glx/noof.c | 4 +- hacks/glx/photopile.c | 6 +- hacks/glx/pinion.c | 15 +- hacks/glx/pipes.c | 29 +- hacks/glx/polyhedra-gl.c | 13 +- hacks/glx/polytopes.c | 12 +- hacks/glx/projectiveplane.c | 4 +- hacks/glx/providence.c | 15 +- hacks/glx/pulsar.c | 11 +- hacks/glx/quasicrystal.c | 4 +- hacks/glx/queens.c | 23 +- hacks/glx/raverhoop.c | 13 +- hacks/glx/romanboy.c | 17 +- hacks/glx/rubik.c | 15 +- hacks/glx/rubikblocks.c | 12 +- hacks/glx/sballs.c | 15 +- hacks/glx/sierpinski3d.c | 17 +- hacks/glx/skytentacles.c | 13 +- hacks/glx/sonar.c | 16 +- hacks/glx/spheremonics.c | 13 +- hacks/glx/splitflap.c | 7 +- hacks/glx/splodesic.c | 16 +- hacks/glx/sproingies.c | 23 +- hacks/glx/sproingiewrap.c | 10 +- hacks/glx/stairs.c | 17 +- hacks/glx/starwars.c | 10 +- hacks/glx/stonerview.c | 9 +- hacks/glx/superquadrics.c | 14 +- hacks/glx/surfaces.c | 13 +- hacks/glx/tangram.c | 13 +- hacks/glx/texfont.c | 2 +- hacks/glx/timetunnel.c | 13 +- hacks/glx/topblock.c | 14 +- hacks/glx/tronbit.c | 9 +- hacks/glx/unicrud.c | 13 +- hacks/glx/unknownpleasures.c | 15 +- hacks/glx/vigilance.c | 18 +- hacks/glx/voronoi.c | 4 +- hacks/glx/winduprobot.c | 15 +- hacks/glx/xlock-gl-utils.c | 22 +- hacks/goop.c | 4 + hacks/grav.c | 38 +- hacks/hopalong.c | 44 +- hacks/ifs.c | 1 + hacks/images/m6502/dmsc.asm | 32 +- hacks/images/m6502/dmsc.txt | 768 + hacks/images/m6502/texture.asm | 393 + hacks/images/ransomware.xpm | 109 + hacks/intermomentary.c | 1 + hacks/juggle.c | 60 +- hacks/julia.c | 16 +- hacks/laser.c | 33 +- hacks/lightning.c | 25 +- hacks/lisa.c | 34 +- hacks/lissie.c | 31 +- hacks/loop.c | 34 +- hacks/m6502.c | 105 +- hacks/metaballs.c | 4 + hacks/moire2.c | 1 + hacks/mountain.c | 29 +- hacks/munch.c | 7 +- hacks/pacman.c | 29 +- hacks/penetrate.c | 1 + hacks/penrose.c | 34 +- hacks/phosphor.c | 47 +- hacks/polyominoes.c | 55 +- hacks/popsquares.c | 115 +- hacks/pyro.c | 1 + hacks/recanim.c | 6 +- hacks/rocks.c | 1 + hacks/rotor.c | 32 +- hacks/screenhack.c | 24 +- hacks/sierpinski.c | 17 +- hacks/slidescreen.c | 10 + hacks/slip.c | 25 +- hacks/sphere.c | 29 +- hacks/spiral.c | 27 +- hacks/squiral.c | 1 + hacks/starfish.c | 7 + hacks/strange.c | 30 +- hacks/swirl.c | 28 +- hacks/testx11.c | 21 +- hacks/thornbird.c | 17 +- hacks/triangle.c | 26 +- hacks/vermiculate.c | 15 +- hacks/vines.c | 37 +- hacks/wander.c | 1 + hacks/webcollage | 985 +- hacks/webcollage-helper-cocoa.m | 165 +- hacks/webcollage-helper.c | 166 +- hacks/worm.c | 29 +- hacks/wormhole.c | 1 + hacks/xlockmore.c | 179 +- hacks/xlockmore.h | 27 +- hacks/xlockmoreI.h | 26 +- hacks/xmatrix.c | 29 +- hacks/xrayswarm.c | 1 + hacks/zoom.c | 6 + jwxyz/Makefile.in | 1 - jwxyz/jwxyz-android.c | 593 +- jwxyz/jwxyz-android.h | 31 +- jwxyz/jwxyz-cocoa.m | 54 +- jwxyz/jwxyz-common.c | 263 +- jwxyz/jwxyz-gl.c | 1622 +- jwxyz/jwxyz-timers.c | 13 +- jwxyz/jwxyz.h | 113 +- jwxyz/jwxyz.m | 373 +- jwxyz/jwxyzI.h | 85 +- po/POTFILES.in | 3 +- po/ru.po | 13947 +++++++++------- utils/erase.c | 2 +- utils/erase.h | 1 + utils/version.h | 2 +- utils/xft.c | 12 +- xscreensaver.spec | 2 +- 313 files changed, 21113 insertions(+), 11837 deletions(-) create mode 100644 OSX/Media-iOS.xcassets/AppIcon.appiconset/iSaverRunner1024.png rename android/{project/project.iml => android.iml} (91%) rename android/{project => }/build.gradle (100%) rename android/{project => }/gradle/wrapper/gradle-wrapper.jar (100%) rename android/{project => }/gradle/wrapper/gradle-wrapper.properties (100%) rename android/{project => }/gradlew (100%) rename android/{project => }/gradlew.bat (100%) rename android/{project => }/local.properties (100%) delete mode 120000 android/project/xscreensaver/assets/fonts/OCRAStd.otf delete mode 120000 android/project/xscreensaver/assets/fonts/PxPlus_IBM_VGA8.ttf delete mode 120000 android/project/xscreensaver/assets/fonts/YearlReg.ttf delete mode 100644 android/project/xscreensaver/src/org/jwz/xscreensaver/XScreenSaverRenderer.java rename android/{project => }/settings.gradle (100%) create mode 100644 android/xscreensaver/.idea/.name rename android/{project => }/xscreensaver/.idea/compiler.xml (100%) rename android/{project => }/xscreensaver/.idea/gradle.xml (100%) rename android/{project => }/xscreensaver/.idea/misc.xml (69%) rename android/{project => }/xscreensaver/.idea/modules.xml (79%) create mode 100644 android/xscreensaver/.idea/runConfigurations.xml rename android/{project => }/xscreensaver/.idea/workspace.xml (86%) create mode 120000 android/xscreensaver/assets/fonts/OCRAStd.otf create mode 120000 android/xscreensaver/assets/fonts/PxPlus_IBM_VGA8.ttf create mode 120000 android/xscreensaver/assets/fonts/YearlReg.ttf rename android/{project => }/xscreensaver/build.gradle (85%) rename android/{project => }/xscreensaver/build.xml (100%) rename android/{project => }/xscreensaver/gradle/wrapper/gradle-wrapper.jar (100%) rename android/{project => }/xscreensaver/gradle/wrapper/gradle-wrapper.properties (79%) rename android/{project => }/xscreensaver/gradlew (100%) rename android/{project => }/xscreensaver/gradlew.bat (100%) rename android/{project => }/xscreensaver/jni/Android.mk (68%) rename android/{project => }/xscreensaver/jni/Application.mk (100%) rename android/{project => }/xscreensaver/local.properties (100%) rename android/{project => }/xscreensaver/project.properties (100%) rename android/{project => }/xscreensaver/res/drawable-ldpi/icon.png (100%) rename android/{project => }/xscreensaver/res/drawable-mdpi/icon.png (100%) rename android/{project => }/xscreensaver/res/drawable/thumbnail.png (100%) rename android/{project => }/xscreensaver/res/layout-land/activity_xscreensaver.xml (100%) create mode 100644 android/xscreensaver/res/layout/activity_tv_xscreensaver.xml rename android/{project => }/xscreensaver/res/layout/activity_xscreensaver.xml (100%) rename android/{project => }/xscreensaver/res/layout/main.xml (100%) rename android/{project => }/xscreensaver/res/layout/preference_blurb.xml (100%) rename android/{project => }/xscreensaver/res/layout/slider_preference.xml (100%) rename android/{project => }/xscreensaver/src/org/jwz/xscreensaver/SliderPreference.java (100%) rename android/{project => }/xscreensaver/src/org/jwz/xscreensaver/TTFAnalyzer.java (100%) rename android/{project => }/xscreensaver/src/org/jwz/xscreensaver/XScreenSaverActivity.java (100%) rename android/{project => }/xscreensaver/src/org/jwz/xscreensaver/XScreenSaverApp.java (100%) rename android/{project => }/xscreensaver/src/org/jwz/xscreensaver/XScreenSaverDaydream.java (50%) rename android/{project => }/xscreensaver/src/org/jwz/xscreensaver/XScreenSaverSettings.java (100%) create mode 100644 android/xscreensaver/src/org/jwz/xscreensaver/XScreenSaverTVActivity.java rename android/{project => }/xscreensaver/src/org/jwz/xscreensaver/XScreenSaverWallpaper.java (56%) rename android/{project => }/xscreensaver/src/org/jwz/xscreensaver/jwxyz.java (75%) rename android/{project => }/xscreensaver/xscreensaver.iml (77%) create mode 100644 hacks/config/esper.xml create mode 100644 hacks/glx/erase-gl.c create mode 100644 hacks/glx/esper.c create mode 100644 hacks/glx/esper.man create mode 100644 hacks/glx/glut_mroman.h create mode 100644 hacks/images/m6502/dmsc.txt create mode 100644 hacks/images/m6502/texture.asm create mode 100644 hacks/images/ransomware.xpm diff --git a/Makefile.in b/Makefile.in index cf80264b..17c698d5 100644 --- a/Makefile.in +++ b/Makefile.in @@ -230,55 +230,6 @@ rpm:: echo '' ; \ ls -lFG xscreensaver*-$$VERS-*.rpm -test-tar:: - @ \ - VERS=`sed -n 's/[^0-9]*\([0-9]\.[0-9][^. ]*\).*/\1/p' utils/version.h` ; \ - D=xscreensaver-$$VERS ; \ - ADIR=archive/ ; \ - NAME="$${ADIR}$$D.tar.gz" ; \ - if [ ! -f $$NAME ]; then \ - echo "$$NAME does not exist! Did you forget to \`make tar'?" ; \ - exit 1 ; \ - fi ; \ - \ - set -e ; \ - set -x ; \ - \ - if [ -d $$D ]; then \ - chmod -R u+w $$D ; \ - fi ; \ - rm -rf $$D ; \ - zcat $${ADIR}$$D.tar.gz | tar -xf - ; \ - cd $$D ; \ - chmod -R a-w . ; \ - chmod u+w . ; \ - mkdir BIN ; \ - mkdir BIN/motif ; \ - mkdir BIN/lesstif ; \ - chmod a-w . ; \ - \ - ( cd BIN/motif ; \ - CC=cc ; \ - export CC ; \ - ../../configure --without-xpm --without-xdbe --without-xshm \ - --with-motif=/usr/local/motif ; \ - echo --------------------------------------------------------------- ; \ - gmake all ; \ - ( cd driver; gmake tests ) ; \ - echo --------------------------------------------------------------- ); \ - \ - ( cd BIN/lesstif ; \ - CC=cc ; \ - export CC ; \ - ../../configure --with-motif=/usr/local/lesstif --without-gnome ; \ - echo --------------------------------------------------------------- ; \ - ( cd utils; gmake all ) ; \ - ( cd jwxyz; gmake all ) ; \ - ( cd driver; gmake all ) ; \ - echo --------------------------------------------------------------- ); \ - \ - chmod -R u+w . - dmg:: $(MAKE) -C OSX release dmg apk:: @@ -363,6 +314,7 @@ www:: for EXT in tar.gz dmg ; do \ OLDEST=`ls xscreensaver*.$$EXT | \ fgrep -v 5.14 | \ + fgrep -v 5.34 | \ head -n 1` ; \ /bin/echo -n "Delete $$DEST/$$OLDEST? "; \ read line; \ diff --git a/OSX/Media-iOS.xcassets/AppIcon.appiconset/Contents.json b/OSX/Media-iOS.xcassets/AppIcon.appiconset/Contents.json index 89e33aff..f7aa929a 100644 --- a/OSX/Media-iOS.xcassets/AppIcon.appiconset/Contents.json +++ b/OSX/Media-iOS.xcassets/AppIcon.appiconset/Contents.json @@ -1,5 +1,15 @@ { "images" : [ + { + "idiom" : "iphone", + "size" : "20x20", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "20x20", + "scale" : "3x" + }, { "size" : "29x29", "idiom" : "iphone", @@ -54,6 +64,16 @@ "filename" : "iSaverRunner180.png", "scale" : "3x" }, + { + "idiom" : "ipad", + "size" : "20x20", + "scale" : "1x" + }, + { + "idiom" : "ipad", + "size" : "20x20", + "scale" : "2x" + }, { "size" : "29x29", "idiom" : "ipad", @@ -119,6 +139,12 @@ "idiom" : "ipad", "filename" : "iSaverRunner167.png", "scale" : "2x" + }, + { + "size" : "1024x1024", + "idiom" : "ios-marketing", + "filename" : "iSaverRunner1024.png", + "scale" : "1x" } ], "info" : { diff --git a/OSX/Media-iOS.xcassets/AppIcon.appiconset/iSaverRunner1024.png b/OSX/Media-iOS.xcassets/AppIcon.appiconset/iSaverRunner1024.png new file mode 100644 index 0000000000000000000000000000000000000000..a548d1c6bac889284f2015a51b3fd4b467cc50f9 GIT binary patch literal 46983 zcmdqI^;cBi7e9Q5R6tM=P>?Wa1Qiga21QAUH;o{m64DCNF{8c_K_#Rcq(NFhBnFj` zMnbx~dx&A?K4*sa=XstVzJI}YEf=_0_ug~P-mhJ+y-%Q)hSDh-HW~0FKv0E% z%Dp?f9z!dmzRz_Q6Bj%OODxn%cn$5TBkBdOg0CX)O^NUyG_Ojy1farmgEmA?LIZA9?lv~b!@T)|2fj$R@97k7+_J;=zo#=O5Thx730dO&BMKzX*xGcXo>9qhAcdHjr% z7BfT4djwqx`s`lt>hw=C;>PNNZ50x=?NH!rFIc)(o_QSkF!ZyK4&m0j)7_up9dWMi zR^<3C+TWYm99?I^c^V*+fdBDK8v7(W?p^}V)I2R@lWDm{`%HwTQu7j64ajmu0C$?( zny$_5Lq@%V z??9PW<6KpqIhh$XH+y68IR_Rd+ZWF-Ql+WB{4q-jnX5b}gUp-vC0BE7=xzL#2q9Q? z6S>rbP+QHq{o&vm)W3su#|OXsM&UkK?ZLvH!$8>fFdHiqIq7tNuZ{h|;IIWNH9n{U zZS$t-%+DVvNk>C-P$r|)*L7Tqe(|} z`i8?sXPh*%qDP#g1)>JPk#_cabLvsyySR98`G8=10Fcu(`mZtt8Bu=d zRppGjN!`zU-yT-;U6;wOhhpOkqTJfglMVjAPw>-vb?U^6Ne1XNm$U83nY}+t{;tON zbtl)g?L-yu8S}7n6jbK1PtaW!aC2LGU}f*0%<|`gFJy0DZiJe{QV&l_M~2uvygNNl zkQ5vDbQ51O7YAtapQ3>3Nve?)FaMhsOP;OD;L`W!n#0SxcUx zJv>tUerbr2Bf1%XyC1ekSF@Sb$<1^^8wLK{_|*#ip*j}x?D3(0PGQ% zjbUS7_nNnr(%js0LC@QAk%Vu*Ru^sTnJ^x1;y&vGd2^-cZiZAL{$mTd7q{gtczA7l z(@m4xTi)<{YnEpZS7PG#p;lKal2)!NXVf4+%6(|dxFP9|i~G+0ko7=w1X&)kS$7O4 z+8o9S-IoulJ-f!gw+?@cS?}~PKepd@5tI>}C%C1C2L8@sug)dE8?6?1JG>Unb_}=h z%%h-;y7Nu({mQ=(TN1#GzrQ|463fwHMx9L@`0ITGt>bUK29Agd{BiIXLVR^)W5GA5 zAmzXHr?n@(u1rFMjZa;ulkB>1D?3WoO`Uts%Z{a1oN)Zwm1xI?J^LNk0_R2F9|Mb* zH#Z>G3#6Us1AGF}{KS1N$57XxzaMp>~932SFeX3SdC=T?nh8Lo>KQ6s8M#}HgS+)hbNl3ZkZP91o8MSJ2yQsd2<#uRe* zPyLR3rsGSJ{3nuDkhfjSqV4EOxDqV3bGzPT5XpIZpwcp&XpAR zEjdWhhXYO$Vjyj=^#SVT&F$in!*N|>r;P@VHKjlTKG0^7@I5Y5XY4eEqIRF_(LjeiOp!&H^Iv*Btikd!Ex|BV`AmB^5fgSJ^vxfe9 z&MmK)G8Fsh^wCoDpUnl6!|AJ`sn3L7{w^IJEao0Bv> z@e-(CR%WX;?E$bBH25cx{t7}$vXa02CaXjy)Zk6Eb_L`1MBF9($?<0f!a(5Jv~o++ zl&$hrA3c>nCCgXv0JZ+pn!(Ab-~bW+-=-wXQZ)o<`ENwuI2d?C`0L>6x0$rI*NBr# zQb8R($=a)PIpq~XM3FrB?%&f{WSVWAv0o^Zmu>9B zPdymut;g$%Pc857RntJ|pr0T|6S~Sv%kNN8XcJxWPxbr;b=ZSD*Z#N1u=`es3=Rq5 z6Pf>Q>*gf}ir-nRT8h|zC;tD>HCQ8Vb4pTbKY=zmi@9&jTcCke&H9s0Dt}#Ag(dX! zuhrWZJnmL2C7iZ5p}RJSa-P~cX$oQpknq`GpDYjp*#5#$n%7n1>=-v(sfc`I19W-a zt?3te^>KJMbW{688R2%NNL%m(p>=&!%!uweaCkWjw?s*X14S9Qv1t7mS9QAk{BSyf z^!Bzh2`uJ=Dn{~1QE}SesS+3WyYu(i;SHnXQv#ze8e_CV2;A)Z>n`~> zBgs7e7KiluT=t$NJ+1;wSGcHDJB##eV{B2^ZQtJ{h>;iNK^iC%aP>Tk@ z{c@3mOt|*^vqnd=a9ui*MT4Ul+S@3RsRdK$7r69UI^FPm-5 z=AT)wd?`ezp-sjsoCVnwa6c*8#7sa^v?(jC_&3Z zgS!%rJXBi#6n71@{@b|u9Z)`a3YR>9yWBL*iB`+k!`%D$^Eqx1MBY683a}$XFBw$!Q z6@f^1$jy)b{<_x7Sv>rNg$dp1gV{ehc{SChBq14=Ky}43J$)OdOLdcmcL#Vv51f_2PJ~&6+)>E)V#x* zUImsYz4297rf{BFqVZZEkRv8xVB_4#sf+U0m(e}g{)(@+S(ki&J|) zK{kq*e*shY9dAf=?K+Y*N&W1$8H290H=ACdd;s#DNmb3pg>o4q_lZiXngC7IOSdIk zQPIzOU;}F$-n$*{wH`#o-6gtrbT=(@LH`1oeQy5vtllZuYq}<2s$D^pg6{k4F_3B& zr1%F0P)GRV@-dtEVfb4KdXWZX(Y4!iwBdNZr;?%qVFT-!3bm6|-*Sn2uUi|5`isco zIQb=_k?aEeJeBRDwSgAnE1Hxq`vGu|89(h_XTf9$R$vo-5D=2Q9(c5s{c=9d9Nl71 zl#ICxC}Dp}O?(CUdy1LfsiQ`3h6Y>n>4KEv_~?jTeo;%)Jd|aFsF`Aq-5$XEUrl3tXOyEi=X^H~$ZunQ_4bW5 z6T+#?x^~9>MlD4`PLM>bs=cOkE3#-Q_L)Apn%VXngE$3sjhc1&OQA`)ChVfan1MGL zLEZZUSJH*^H#G1DwJH+_{oguBHX;6PSn38BLnp7W4=(_^a_K8fegPFdh?B~fw2~t1 zKCSKN2t0c-=?4(Po=y-VEaZ*5d%ZESC2B{DtzH35sQ+4~sTg-^#O3i_`;$w*B{*a5 zajUE-COfOYgpDnq%$o*sIj0klrD;hkD59s)x|`m+T9gq0fvEP;__Y*g2sQ7S-yddv zca2uKpZB@5anS$4eeL6Pz{?YxN@jRDP^17LMKBgKW&i5FffheFJux-YweZDuQ1w#i z?ZzDG+Z8ZZH2wU-q2?9?(HHRlKpHMlj<~*;dS&&m?MPMi$0^zI4k-%mGyGWzq{o%U zR+BhRvHKvJktD5OY5s_|3Xei&Tz(b#M6HX-ATy)VoSyL&on_YA7ni<3Njo4?QH~q? z^tW+-f)5G5+z$ZdLIy!RD)tl>2Pe_fFVwp5yF&HeCC0Dk9#8;&M<=$>N>EB9gWz82 z+x@|Mx(~C(u{N(tuvzf(Z-hy!>IUX;NA*MLtA$QsbFX)OWiI=w2j5HSQTlXQfqCCn z(9Zq(u36=WWs{`I-k(2$=X2T{Yv7Fal;&Ii9)~`OVtPXpfrtEn&8T9mdmM8jUHGw! z3iaNt*lP!cOwlw`1N7P8xyr&&le?R>BS< zIFj^IhCGW>^{SP&PuJZ#qiob6_~DckGbsRF|T-MVNev?FZEfvP+X9=xFQNUzxr>CqZ%L!IuiJgZo9F9n1`5OyM# z?Xtp-daCD~eN=}ClFFmkV~^5&m=s|$qMvm>DCH3+D{1D3E<(@3=n;)+Y$~dt?xQY0 z+^uc?T{UWHbSfe7sHbOuCELx)310T44sS-%$H62o?R+T-8n8GkuZVqs2B9F%?BF9S zSz?|^Tyos|`zQHhRuK7(e-l59qB%V z&|QhOM|bH?bE+*iK%np(-u|Mwj*HNdC^Fp&VXRiEfp^Pcoj;r2nE^c1$;i6GlO*%x z(%8Lb&OWqmcgD#UORkQ4OE5$OP7Tm2kxgouL?LZ-^uF_&EEuk^UfBs7{8N;(UzD$~ z#7s+aA5*CE6)9Tbv|p=6^SP}f)h~q#1{r$8^4Pw~%)MUZf%yUBQ(xF?H*%hV;hvvO zIsfa`W546LB10>z0DN@iwVb`kagU3qZJllXa_Jtv24EKtM@2CBalU^iF#-s(1)eoE z>Jy5vO4<=CQOk9V!!n3su7yn@9V)XgfEh?;llJ|VUihZBth9A?m=JK=@d*}lR}^O^ zC4WuvK$LV&O;CokHQjuGaF$u4{;nQlcp?-eprv7j-TG~BpamGEMZd@iioD~L>6D_PIYJRaj zHl!gVebhcrhX;Gk8UYfxg?37zO0e)V19t_x0Pjhk>5&hDc}gzxek(g?wwsZ`O$W%Y zFg4M`78zzYUZp=?R-f!alm>Lo?Xc+9*Sz*cM$Nkyj1G{4AEmc#kDN~5KTh@sKul7$ zuU&tdwoUU!0S#=C=lZ#UlucAz>`^kX=xw}vGfZ;cMJiAV+s?4NkmJ!Vb@|N&-`p!D z==6Hu*(N})h>nGe!AiEAwp0hlF`{IkoGJTq6>FD#uyD$5-l&%tf)}Tm`FYyS?_zqb z?2~Eu0|?_%kk%}0A;}=|=7@`g*17si<_#%VtzTKbJZU@uc&FQ#v5C`l9g$GW&?D7R zK*KPHqq^%4%mxpTE$&@;_){La4{EuNtHlg;N4O|-{ z&IiGCgB#Xu1$brv4vSehn`Mn*#}2h?o5o=e6ovp)zj}7#YT?8Er_#@*!?rJaC+GL$ zdUyIv*$E%CSJy?H(sXe+BPcYc#mA)Qf^*qdYex;hZT~A7H!d@gprj2d0gJcJ z(Oa+`6@2DcYP1(qnX;$i0)ftod4e7l`7u2{{<)2iu z+v)^T%7Er5>-*LaA2wjp5dfly7de7)5)pr70*LC(?cA~|tJQUD1X=@8_wMoPdK4d* z1YDV}^Z&i`th*nZ}?#5uWa zGW)mMtniUl*vCYD3BtG;=5CP7z5c$QxE|&@Z9H1g!q(Yu+F$-~T8(RY7Pg;MCnH5U zxo+GzR{X`mzcJr?=3atue|`V(N4nt0EYQ7pgycS)6apr?s{!3;0d4Vhj37iPI!ryWd<<8x5w*b@8f5>$brK)wY9U34a7gKy7bSFsZ3 zk@vnpfOgC{LgXc2f(>~u7ji56Hyx<{)jZo!yxk2+ z>a{Bpm=FKi&7Dt|C%e6VhE?h!LZtjGA8r%k=0g3EtspW!S?T~dytCZ-b#n0Eovrg< z2{JnYL*wE#oGHNL$b&5Ybz3l9prnh4{8h>9wO2irEs@^4@MP~K!zDLk9B}sOy@_v5 z<=^IF*2r<&%qqk#`OX@PN~&gbl1mB5{|~#-y%b^#&6^eOGE#e>?AVoC9xm$1<(eTB zgVxE~Tm3hGlh5Oq&T@m_-jcabD!~D3Voy5$XL$B%wy$#}rzF$nr_#rMRtzz1I1D^) z);v@7hc9z&KQH&AG0N)RoVulaU>PQv5_&qMcUq$Tq9U5;aG` z{yS#<2IN0|Lk77cvJ0Jm4#lRuoO$Q_-{m944jpYmpfn(3pgG;Bfm3}a1mlszt(!T4 z2bFE@SM6xW357QFlu4-ePsw-fw)$zr80b2A+kA|$Sj>}&o0scIUZVG|Mn!w_WKOnV zJgQSM`3EZiBPbd)k2K*d*I_uf*$g;(b-8N^EgaB_=U={ZLR*&_;`8ycb(ud)1CwbG z^4ZOmer5mEKPkd<`4A-X+-d>!uN;mk_a@`z5@MFOruE1j^Q!!3TgOWQI)|VlLQ_yp zMke&&TYlqTJ}BT)a*!m0y~DMK*6fb3apX~WP_Wt{e47syc*(`3(d@Z-o|!E^*6JGd z$FtlJHz*{G>hI{fX&}B|NS2Z;ElOeV$i>RpiI>!Q;Kp-7Bt1x*qFi^zZLw9GCy<@B zb>{TYkmm1hhi#T842}gBs{689H)+Y8Z!J)AxBPpLeH9+*N5~dbwXttqmZoE8L7=An z(PI*S>=5^k9YwbA$&0X3afhCD=e(z_*B9jV#LDxw&VuhBy(tt8T!kNvHEJc@HlR{~ zO88JYoag#FI4*%eM%0dYc>cos8pkBHn%g-bA2h`eyWo(wZ-`@Szwe}tpB%}=1M zmODS#xql6zx4m`j1)1+(Ae$(%J5?vGbNN?}KmARRII!8fO0Rs!iDwF`Ep+xgvtvGR9)PxW{xp55u5H7n8*6^-<$JonZC{ z2(emTdOT-J0#GFg^evbELIW;z8}Uqg^?xvcLpkr{x<{|Lios(re)kcB`d(MjZf+hQ z3Y$H2D?It{*O9EPwCNufJD;e7E4+A~y`6>|m*89XTu5PK1ZWp5-W^)AP!c58x3JmeK{x%X1OGla6)| z^)Z_Y_TTVa3=G0%SWN8Yu&=L%ha{lBF$hCRI`Qjw0`e_Gz5259+i^#;Max(ixTUG~ zj8OuzsL#pg%BNHV^15^8qz_jjZQ&4bc@LMs-RUIfr*kwH7w-XMtK7AgT1E5CEIC0uPdo&|io%A8_P8fKn zA;b7ZJ1&;&*plAqLS2)&rOiy<*0%Q&jv`%JBGb;s!C!Ab0?iUPZw4(2I+DdHuQc*( zW~ysIz-rwyIp6KgBsll&ZGIS|uUL=exM@Qu-T!Yp!a=%-k;(G=(8k=1>ExR=Dx)UMrBq3Lo5w zD%*p#FaBo;p&lOQBIQLd#`KJx0<2vpCX1Fb18+vlvhwcA^?|nj)dPX3=R2Y#&lIHy z>JN|7yua25I>62u`B1U3&JyBM!_wz^j?RKYl&Ip<;xD84f7e|== zCj1x&i}`++mCyOll+HshEAz(*u&3}PM>rrZ0l1b^A3Ku1-N>)`>OfzNPiB&UNcz-2|M@JAAU2rHF zDeEHq`uNwTPh3|(Ogv|_ioF?zXCMmRyhh+6v|*rUYz&=_CHjCCf@CRv+~rToL5Srr zJUt&0v{&@MM`wO(J@L5a((@CcXS4p`Bd9z zpsWB%Sd!iEgY4Q6Ymw0)JHOo2Wo84ls{00IO4T;Wb4U{OA{`&f!gdvf&AHajL?F-U zqq^d8>sh8)%&+gOFd(%+ULJ3vN3w6>nD0YEEV&P3@Tl8zeaVKuXRcS`k>XN$75H^e z+fuz@So@z{!Xa~Y4+;DB7e9BvgX?z1OR+xgcO&tr1^>Fw6)?uJuk(_n9;n8~^1gRu z#D)2+-gK=ast4Dxh26X&%K2`dAqTw?B;{RzatqZ6w*rh3Z6y7UP(hMo?h>H zkgfHzOfJR#MHbN&FDl>XW~_4swr`G+JZ2a7$DEQ*;Q0O~2PM&ldnMZrd~M=2h}<$G ziWD+dzTf1aogG($$GAUT3yz)sQ#oyrDUQ_Zxv*t?7P4S~Y5KnXPsN%Ygo*;Kvbt6H zeYltGdcG}T`gaRq+`#OELL_~(;EO!XEI~FB^qez3Pu~~O?b8{+Vx~8D%vO=#lF&f6 zYJO2bieQjHOmaA(VDs3tj$V_ZT*;>zypvw)QqE%Wq^|R0mG3Q<&baZEBgu^; zJN-w7#dtU^j>c)zR1g8Z6m^dfGQvI?-i(-289lY z)@l!uYDgS2+ISM9!2XsfiF#S=UomKx?hE|Paa4wXeX4UB+iVxlwr1 zmCz~T9RVwTuGB&AOo?3Aq$5FWC;js@Xc;lBFFHOe%iXm;UIj*z*&-txOlI{8OupERf%IadibRsA zhLn6@zwN43omG{pm&{NyJ*zQWt$ ztQ_+OQeRdhyKzr6B@?#O*!DFOmlXNwiFHd;Q`8U)Ttdl-{a@@*A0x|R%hqA!Pm#6d^3yj3lNaUDMzZ6Hd?|5Nk~QB(Zq zTZUe)`1W;;`_{79?PXz*5|_rrF?gpgeCgvJ&b;p^DNYA?FGzB)zhYoA!^uVD>@NL? zhzuqFeP9=0o2vI^WS+xHxdkxLgVJlEt3IlegY}iM{#OXqYbB*jauos-rt5adAVmZzt$X`s_~ z$VB^oUn_jOL8Gv_iT-29l4XIhF(E!E7<6X!tLL;^IpVd(s0g|K@B-aPhbvi%SxngH zGp9+iGXdFfy8#^hWd*g}j=J!676UpGB^v>ZK z+!+dSa)MD%kxfpNo~ve2yM7)Fpp*3{AT}PM+1Ei|co49x4!c&ketS4{^%SIgfW!(z z%FDU=ojw;h)jlfCf56C1{2_$sI$voMz}Cnb}0;;7;ng~ zlpH2=GF74GB#!KecD#rQ{?r2hqx|^snv{8>qP)s68-wNnjc&cAW{+DN^uPD|H?zQAyjbC+8JIrYX+hyZOvJgUyf=@ZhtpkWjHti3pOC-IO^Ts1n;T#}!?_in zZns-Gu)pk*<8t?-bDd5Z*fkH0*DxGJl}8S3QlwnjLS0zWNTFwPty|tLLGy#57XaFZ zuu*K2nVv70V$FX@cpuRR*B{+YY96!R7SdYd_+UG>?%g=GHBRLE^RyU;VHzIQGxLZ& zUzzaf<#-zkQrH*X1(P2tJTcY}Yt83t=G`+hu(0P0oN)e~;*;&Tw%lh1f4Fv z;C$Y3mb-=ted`yRbnG)075K%I1?7)h;SWFVt#~;<4)NR`dbmA`hmL4A2$?m`AEp&hr1C;}iz9@JY#1_^tpbit!lXIwCa!O+2N z(UKzrQQY|BHw2{WHQuq2xy|SIZNp9#_789FZnzmwh^@?2AUZr`@;iP@TVRy5_WwSW4*JD z@^KS{_3WK-s%z>zvewf#&{*D8R*jRYIpm}SUCn;UcAb<}f?0#|=$}#B(mMXpu+$EY z*xX#PwW+`=g|nlhCQhQo=~q5IK96Rsq?FN%Oa6RpM8X*}zeB}0`w9M-^Yd1^vlyc5 z=dufhpL)Vv0f!XkiFqA_O2a|W-n*G4GKcp-D*3dJe*`E-y_q`oIWm3%m-yXDvZB~>+$Eo z+Jp9T#B9nW_lRp;OgdpKr3^XL+gF-v`L(L{-nco3NMEMkc$1N>{D!1A^=B%x z3p@JD?c{SHXaO%O{C9nPj3N=t`kcXQyN-zKVbkd#5?mMv^{7kD;CBxpG2l6O31lb^SZjxAE(=7zro1AGgQf&eGF4iV8-hl!+c|<`5l*F+_x}P{9K4gp><=`fL0UWg)m20@wuZT)@9G6$PRx?esB8_X`7M3bI^im&URd>%kZJk1Juw-@2K zr5Se%GIRfoy!#nAqtP6q7FTS?!t&nt&dghiw{pgbn&m2BHaN8y6X0unC!_n zfc(j4{=Li6;Mc`-bz7D#fN0Il+;TKi35l$^kgR?6^mZFu=_Y*!%pg!e#=H{Rpd#6?V2yZsVN||Wdu*{+|oFGYXpeVJSUn*gm-7Sl=KOjwaj%O zsDhULkXF_#^3mM^f&uWrEn5bPwp3nIzii%!{`C$NAnB}*EoWhWv;y;`;?SV&{$)>J zNz3NieK^vxK{`*Lqo$AV-NS{5yb3SSQO zF3`&q5BK+8v>#Db;fMnj+dh8JE%5y=xZ9!%n&^=iz{NCCNrLDutq3z@?{@=3V{RD< z#^#nOpmJ%%!gJ4-eRri6N2xS3nvpRRVq0z7nK)XBwu}a?8g)N6Pxih3LM^#-4@6$x z{9<$RJSy44V}cMO9!DvV+VF(t9kHj#6t4Px6V3uS$NDyY&cujqWrwx8HgI%-DTMb(uP*@J z7*UPWMI<;OT4u=1s zJ4>`6Axl2^rQ}zuB?)S#T#L81g^oS=6>;B#=)cCwzX*UKeIm)~oCYW>{O(oD=Yt@B zo7B}dIXlM%U6EL?P@yb}`LkA-D-sgZj*ghtHDn3ha-0`sBpP+ABbb5^I8a(CV2U+p zkG(PQD5`s>l(}3i-^X}!?#J7|TQR)S*&V(?-y#%?UCC($X)^Wi9w3gcbuqy&;~;NFHPh;I?3`R}@B#h+pBf zGp+#yP~7KKX;^5Kz0awrlKGU^gQ?2@mBS=+PWV#B3cS|sbX3S{1d6|~eNcwO^&WD?yKwIqU5f5lO4_}7)@+d>I82wVCuFyUM)4u@!=p;4~#1`|1 zk*Q1X#EP5cu4jNm@J zPwr21U1wNar@!76h(5}`a{Sf{p<6HVMC9fIku$G<3*mm;xvu7&m?t8ORXYo2AQT|N zt!tP`vspQ0vftq%9B+pkUv)!9f1BFx7n(~RD@5V#Uf@vC6~zfdzm;nu@3tRAO0erf zNN@PdbnPy3A~Dr0&?&#=plnE=Rf`fLzg`1z%Q6~@h30+V>7ZI)-)Hw%-R^=ZdCqw( zm`SghsVM_vn3;FkEBtbf-DGn^D*C6q45xwqz?5uUT3Nb=#P05HoX~CpJQ62ix8>`l z>T_w#r6{#5p#alsEHKW5PAxWS$0d7Aos2(1yRVNilR=uZM^+i7=o?Mai^3@>2GZ89 z)>-Zo!HUygQd2L^8l;q$|3&D2Y788gx`6SW`hgVUYO-ZlVv~NG>=CRCG1@{Y!6&Sr zCUX(8+6@TvNc^gRK79KT#!oiPQ2A27T4A(QpSYx?n%Tx;R&tP9O$H5=o@HP)3=guF z*9c%ZKBg8&%;5(`LwR`l`1I_aWL16ktK3?oOlN2F-D>7LioMITUC&jHuU*F+ETDYn zFxb#qS~6%s1P@Owp$JE-X5X~MOhOY%_WF0bmoqdZu3p`u5D^=O9V?^@p_G*hxO8@y zOj(pNJ2mykTZFtpe&J_7OxqqAnEd9jb!LPhDmFg9s!6jDMk@2ieN8-dX*`Pq6Uif9 z{pO>EUwD)Ik}He^l7nT;9Wq?~@T-%0D(78^vw#a%Kmg|W1o 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 literal 0 HcmV?d00001 diff --git a/OSX/SaverRunner.m b/OSX/SaverRunner.m index 5d0259b8..f358fb75 100644 --- a/OSX/SaverRunner.m +++ b/OSX/SaverRunner.m @@ -1416,7 +1416,7 @@ FAIL: backing:NSBackingStoreBuffered defer:YES screen:screen]; - [win setMinSize:[win frameRectForContentRect:rect].size]; +// [win setMinSize:[win frameRectForContentRect:rect].size]; [[win contentView] addSubview: (pbox ? (NSView *) pbox : (NSView *) sv)]; [pbox release]; diff --git a/OSX/SaverRunner.plist b/OSX/SaverRunner.plist index 457c5f45..692e5764 100644 --- a/OSX/SaverRunner.plist +++ b/OSX/SaverRunner.plist @@ -7,7 +7,7 @@ CFBundleExecutable ${EXECUTABLE_NAME} CFBundleGetInfoString - 5.37 + 5.38 CFBundleIconFile SaverRunner CFBundleIdentifier @@ -15,21 +15,21 @@ CFBundleInfoDictionaryVersion 6.0 CFBundleLongVersionString - 5.37 + 5.38 CFBundleName ${PRODUCT_NAME} CFBundlePackageType APPL CFBundleShortVersionString - 5.37 + 5.38 CFBundleSignature ???? CFBundleVersion - 5.37 + 5.38 LSMinimumSystemVersion ${MACOSX_DEPLOYMENT_TARGET} NSHumanReadableCopyright - 5.37 + 5.38 NSMainNibFile SaverRunner NSPrincipalClass diff --git a/OSX/Updater.plist b/OSX/Updater.plist index 515452ad..e25e0348 100644 --- a/OSX/Updater.plist +++ b/OSX/Updater.plist @@ -9,7 +9,7 @@ CFBundleExecutable ${EXECUTABLE_NAME} CFBundleGetInfoString - 5.37 + 5.38 CFBundleIconFile SaverRunner CFBundleIdentifier @@ -17,23 +17,23 @@ CFBundleInfoDictionaryVersion 6.0 CFBundleLongVersionString - 5.37 + 5.38 CFBundleName ${PRODUCT_NAME} CFBundlePackageType APPL CFBundleShortVersionString - 5.37 + 5.38 CFBundleSignature ???? CFBundleVersion - 5.37 + 5.38 LSMinimumSystemVersion ${MACOSX_DEPLOYMENT_TARGET} LSUIElement NSHumanReadableCopyright - 5.37 + 5.38 NSMainNibFile Updater NSPrincipalClass diff --git a/OSX/XScreenSaver.plist b/OSX/XScreenSaver.plist index 04a25c58..480276ea 100644 --- a/OSX/XScreenSaver.plist +++ b/OSX/XScreenSaver.plist @@ -15,11 +15,11 @@ CFBundlePackageType BNDL CFBundleShortVersionString - 5.37 + 5.38 CFBundleSignature ???? CFBundleVersion - 5.37 + 5.38 LSMinimumSystemVersion 10.8 NSMainNibFile diff --git a/OSX/XScreenSaverGLView.m b/OSX/XScreenSaverGLView.m index d61964f8..57b0c7c7 100644 --- a/OSX/XScreenSaverGLView.m +++ b/OSX/XScreenSaverGLView.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 @@ -41,14 +41,19 @@ extern void check_gl_error (const char *type); @implementation XScreenSaverGLView -#ifdef USE_IPHONE /* With GL programs, drawing at full resolution isn't a problem. */ - (CGFloat) hackedContentScaleFactor { +# ifdef USE_IPHONE return [self contentScaleFactor]; +# else + return self.window.backingScaleFactor; +# endif } +# ifdef USE_IPHONE + - (BOOL)ignoreRotation { return FALSE; // Allow xwindow and the glViewport to change shape diff --git a/OSX/XScreenSaverView.h b/OSX/XScreenSaverView.h index dffa58e9..8283d35e 100644 --- a/OSX/XScreenSaverView.h +++ b/OSX/XScreenSaverView.h @@ -29,6 +29,7 @@ #else # import # import +//# define USE_TOUCHBAR #endif @@ -85,6 +86,8 @@ fps_state *fpst; void (*fps_cb) (Display *, Window, fps_state *, void *); + BOOL _lowrez_p; // Whether the saver prefers 1990s pixels. + # ifdef USE_IPHONE BOOL screenLocked; BOOL _ignoreRotation; // whether hack requested "always portrait". @@ -106,6 +109,11 @@ # endif // !USE_IPHONE +# ifdef USE_TOUCHBAR + NSWindow *touchbar_window; + XScreenSaverView *touchbar_view; +# endif + NSOpenGLContext *ogl_ctx; // OpenGL rendering context # ifdef JWXYZ_QUARTZ @@ -144,8 +152,9 @@ - (NSUserDefaultsController *) userDefaultsController; + (NSString *) decompressXML:(NSData *)xml; -#ifdef USE_IPHONE - (CGFloat) hackedContentScaleFactor; + +#ifdef USE_IPHONE - (void)setScreenLocked:(BOOL)locked; - (NSDictionary *)getGLProperties; - (void)addExtraRenderbuffers:(CGSize)size; diff --git a/OSX/XScreenSaverView.m b/OSX/XScreenSaverView.m index 947525dd..1ec05a7d 100644 --- a/OSX/XScreenSaverView.m +++ b/OSX/XScreenSaverView.m @@ -22,7 +22,6 @@ #import "XScreenSaverConfigSheet.h" #import "Updater.h" #import "screenhackI.h" -#import "xlockmoreI.h" #import "pow2.h" #import "jwxyzI.h" #import "jwxyz-cocoa.h" @@ -645,6 +644,9 @@ add_default_options (const XrmOptionDescRec *opts, // from initWithFrame. [ogl_ctx setView:self]; + // Get device pixels instead of points. + self.wantsBestResolutionOpenGLSurface = YES; + // This may not be necessary if there's FBO support. # ifdef JWXYZ_GL xwindow->window.pixfmt = pixfmt; @@ -676,6 +678,11 @@ add_default_options (const XrmOptionDescRec *opts, new_backbuffer_size = NSSizeToCGSize ([self bounds].size); + // Scale factor for desktop retina displays + double s = [self hackedContentScaleFactor]; + new_backbuffer_size.width *= s; + new_backbuffer_size.height *= s; + # else // USE_IPHONE if (!ogl_ctx) { CAEAGLLayer *eagl_layer = (CAEAGLLayer *) self.layer; @@ -728,6 +735,50 @@ add_default_options (const XrmOptionDescRec *opts, [self setViewport]; [self createBackbuffer:new_backbuffer_size]; + +# ifdef USE_TOUCHBAR + static BOOL created_touchbar = NO; + + if (!touchbar_view && + //#### !self.isPreview && + self.window.screen == [[NSScreen screens] objectAtIndex: 0] && + !created_touchbar) { + + // Figure out which NSScreen has the touchbar on it; + // find its bounds; create a saver there. + + created_touchbar = YES; + NSScreen *tbs = [[NSScreen screens] lastObject]; // #### write me + NSRect rect = [tbs visibleFrame]; + + // #### debugging + rect.origin.x += 40; + rect.origin.x += 40; + rect.size.width /= 4; + rect.size.height /= 4; + NSLog(@"## TB %.0f, %.0f %.0f x %.0f", + rect.origin.x, rect.origin.y, rect.size.width, rect.size.height); + + touchbar_view = [[[self class] alloc] + initWithFrame:rect + saverName:[NSString stringWithCString:xsft->progclass + encoding:NSISOLatin1StringEncoding] + isPreview:self.isPreview]; + [touchbar_view setAutoresizingMask:NSViewWidthSizable|NSViewHeightSizable]; + + touchbar_window = [[NSWindow alloc] + initWithContentRect:rect + styleMask: (NSTitledWindowMask|NSResizableWindowMask) + backing:NSBackingStoreBuffered + defer:YES + screen:tbs]; + [touchbar_window setTitle: @"XScreenSaver Touchbar"]; + [[touchbar_window contentView] addSubview: touchbar_view]; + [touchbar_window makeKeyAndOrderFront:touchbar_window]; + } + + if (touchbar_view) [touchbar_view startAnimation]; +# endif // USE_TOUCHBAR } - (void)stopAnimation @@ -749,7 +800,7 @@ add_default_options (const XrmOptionDescRec *opts, xsft->free_cb (xdpy, xwindow, xdata); [self unlockFocus]; - jwxyz_free_display (xdpy); + jwxyz_quartz_free_display (xdpy); xdpy = NULL; # if defined JWXYZ_GL && !defined USE_IPHONE CFRelease (xwindow->ogl_ctx); @@ -800,6 +851,19 @@ add_default_options (const XrmOptionDescRec *opts, backbuffer_data = NULL; backbuffer_len = 0; # endif + +# ifdef USE_TOUCHBAR + if (touchbar_view) { + [touchbar_view stopAnimation]; + [touchbar_window close]; + + [touchbar_view release]; + [touchbar_window release]; + + touchbar_view = nil; + touchbar_window = nil; + } +# endif } @@ -835,18 +899,12 @@ screenhack_do_fps (Display *dpy, Window w, fps_state *fpst, void *closure) } -#ifdef USE_IPHONE +/* Some of the older X11 savers look bad if a "pixel" is not a thing you can + see. They expect big, chunky, luxurious 1990s pixels, and if they use + "device" pixels on a Retina screen, everything just disappears. -/* On iPhones with Retina displays, we can draw the savers in "real" - pixels, and that works great. The 320x480 "point" screen is really - a 640x960 *pixel* screen. However, Retina iPads have 768x1024 - point screens which are 1536x2048 pixels, and apparently that's - enough pixels that copying those bits to the screen is slow. Like, - drops us from 15fps to 7fps. So, on Retina iPads, we don't draw in - real pixels. This will probably make the savers look better - anyway, since that's a higher resolution than most desktop monitors - have even today. (This is only true for X11 programs, not GL - programs. Those are fine at full rez.) + Retina iPads have 768x1024 point screens which are 1536x2048 pixels, + 2017 iMac screens are 5120x2880 in device pixels. This method is overridden in XScreenSaverGLView, since this kludge isn't necessary for GL programs, being resolution independent by @@ -854,32 +912,27 @@ screenhack_do_fps (Display *dpy, Window w, fps_state *fpst, void *closure) */ - (CGFloat) hackedContentScaleFactor { - NSSize bsize = [self bounds].size; - - CGFloat - max_bsize = bsize.width > bsize.height ? bsize.width : bsize.height; - - // Ratio of screen size in pixels to view size in points. +# ifdef USE_IPHONE CGFloat s = self.contentScaleFactor; +# else + CGFloat s = self.window.backingScaleFactor; +# endif - // Two constraints: - - // 1. Don't exceed -- let's say 1280 pixels in either direction. - // (Otherwise the frame rate gets bad.) - // Actually let's make that 1440 since iPhone 6 is natively 1334. - CGFloat mag0 = ceil(max_bsize * s / 1440); - - // 2. Don't let the pixel size get too small. - // (Otherwise pixels in IFS and similar are too fine.) - // So don't let the result be > 2 pixels per point. - CGFloat mag1 = ceil(s / 2); + if (_lowrez_p) { + NSSize b = [self bounds].size; + CGFloat wh = b.width > b.height ? b.width : b.height; + const int max = 800; // maybe 1024? + wh *= s; + if (wh > max) + s *= max / wh; + } - // As of iPhone 6, mag0 is always >= mag1. This may not be true in the future. - // (desired scale factor) = s / (desired magnification factor) - return s / (mag0 > mag1 ? mag0 : mag1); + return s; } +#ifdef USE_IPHONE + double current_device_rotation (void) { @@ -1095,11 +1148,10 @@ gl_check_ver (const struct gl_version *caps, # ifdef USE_IPHONE GLfloat s = self.contentScaleFactor; - GLfloat hs = self.hackedContentScaleFactor; # else // !USE_IPHONE - const GLfloat s = 1; - const GLfloat hs = s; + const GLfloat s = self.window.backingScaleFactor; # endif + GLfloat hs = self.hackedContentScaleFactor; // On OS X this almost isn't necessary, except for the ugly aliasing // artifacts. @@ -1455,11 +1507,11 @@ gl_check_ver (const struct gl_version *caps, new_size.width = new_size.height; new_size.height = swap; } +# endif // USE_IPHONE double s = self.hackedContentScaleFactor; new_size.width *= s; new_size.height *= s; -# endif // USE_IPHONE [self prepareContext]; [self setViewport]; @@ -1541,11 +1593,13 @@ gl_check_ver (const struct gl_version *caps, if (!initted_p) { + resized_p = NO; + if (! xdpy) { # ifdef JWXYZ_QUARTZ xwindow->cgc = backbuffer; # endif // JWXYZ_QUARTZ - xdpy = jwxyz_make_display (xwindow); + xdpy = jwxyz_quartz_make_display (xwindow); # if defined USE_IPHONE /* Some X11 hacks (fluidballs) want to ignore all rotation events. */ @@ -1557,6 +1611,24 @@ gl_check_ver (const struct gl_version *caps, # endif // !JWXYZ_GL # endif // USE_IPHONE + _lowrez_p = get_boolean_resource (xdpy, "lowrez", "Lowrez"); + if (_lowrez_p) { + resized_p = YES; + +# if !defined __OPTIMIZE__ || TARGET_IPHONE_SIMULATOR + NSSize b = [self bounds].size; + CGFloat s = self.hackedContentScaleFactor; +# ifdef USE_IPHONE + CGFloat o = self.contentScaleFactor; +# else + CGFloat o = self.window.backingScaleFactor; +# endif + NSLog(@"lowrez: scaling %.0fx%.0f -> %.0fx%.0f (%.02f)", + b.width * o, b.height * o, + b.width * s, b.height * s, s); +# endif + } + [self resize_x11]; } @@ -1566,7 +1638,6 @@ gl_check_ver (const struct gl_version *caps, xsft->setup_cb (xsft, xsft->setup_arg); } initted_p = YES; - resized_p = NO; NSAssert(!xdata, @"xdata already initialized"); @@ -1785,6 +1856,10 @@ gl_check_ver (const struct gl_version *caps, # if defined USE_IPHONE && defined JWXYZ_QUARTZ UIGraphicsPopContext(); # endif + +# ifdef USE_TOUCHBAR + if (touchbar_view) [touchbar_view animateOneFrame]; +# endif } @@ -1983,11 +2058,7 @@ gl_check_ver (const struct gl_version *caps, NSPoint p = [[[e window] contentView] convertPoint:[e locationInWindow] toView:self]; -# ifdef USE_IPHONE double s = [self hackedContentScaleFactor]; -# else - int s = 1; -# endif int x = s * p.x; int y = s * ([self bounds].size.height - p.y); @@ -2742,6 +2813,18 @@ gl_check_ver (const struct gl_version *caps, [self addSubview:closeBox]; } + // Don't hide the buttons under the iPhone X bezel. + UIEdgeInsets is = { 0, }; + if ([self respondsToSelector:@selector(safeAreaInsets)]) { +# pragma clang diagnostic push // "only available on iOS 11.0 or newer" +# pragma clang diagnostic ignored "-Wunguarded-availability-new" + is = [self safeAreaInsets]; +# pragma clang diagnostic pop + [closeBox setFrame:CGRectMake(is.left, is.top, + self.bounds.size.width - is.right - is.left, + ih + off)]; + } + if (closeBox.layer.opacity <= 0) { // Fade in CABasicAnimation *anim = [CABasicAnimation animationWithKeyPath:@"opacity"]; diff --git a/OSX/bindist.rtf b/OSX/bindist.rtf index 74e15780..9f112e7d 100644 --- a/OSX/bindist.rtf +++ b/OSX/bindist.rtf @@ -16,8 +16,8 @@ \b0 by Jamie Zawinski\ and many others\ \ -version 5.37\ -05-Jul-2017\ +version 5.38\ +20-Dec-2017\ \ {\field{\*\fldinst{HYPERLINK "https://www.jwz.org/xscreensaver/"}}{\fldrslt \cf2 \ul \ulc2 https://www.jwz.org/xscreensaver/}}\ \pard\pardeftab720 diff --git a/OSX/iSaverRunner.plist b/OSX/iSaverRunner.plist index fef1480d..e2923073 100644 --- a/OSX/iSaverRunner.plist +++ b/OSX/iSaverRunner.plist @@ -9,7 +9,7 @@ CFBundleExecutable ${EXECUTABLE_NAME} CFBundleGetInfoString - 5.37 + 5.38 CFBundleIcons CFBundleIcons~ipad @@ -19,21 +19,21 @@ CFBundleInfoDictionaryVersion 6.0 CFBundleLongVersionString - 5.37 + 5.38 CFBundleName ${PRODUCT_NAME} CFBundlePackageType APPL CFBundleShortVersionString - 5.37 + 5.38 CFBundleSignature ???? CFBundleVersion - 5.37 + 5.38 LSRequiresIPhoneOS NSHumanReadableCopyright - 5.37 + 5.38 NSMainNibFile iSaverRunner UIAppFonts diff --git a/OSX/ios-function-table.m b/OSX/ios-function-table.m index e1a05a43..4940fd05 100644 --- a/OSX/ios-function-table.m +++ b/OSX/ios-function-table.m @@ -1,5 +1,5 @@ /* Generated file, do not edit. - Created: Thu Jun 1 17:53:59 2017 by build-fntable.pl 1.5. + Created: Fri Dec 1 17:57:48 2017 by build-fntable.pl 1.5. */ #import @@ -70,6 +70,7 @@ extern struct xscreensaver_function_table engine_xscreensaver_function_table, epicycle_xscreensaver_function_table, eruption_xscreensaver_function_table, + esper_xscreensaver_function_table, euler2d_xscreensaver_function_table, fadeplot_xscreensaver_function_table, fiberlamp_xscreensaver_function_table, @@ -302,6 +303,7 @@ NSDictionary *make_function_table_dict(void) [NSValue valueWithPointer:&engine_xscreensaver_function_table], @"engine", [NSValue valueWithPointer:&epicycle_xscreensaver_function_table], @"epicycle", [NSValue valueWithPointer:&eruption_xscreensaver_function_table], @"eruption", + [NSValue valueWithPointer:&esper_xscreensaver_function_table], @"esper", [NSValue valueWithPointer:&euler2d_xscreensaver_function_table], @"euler2d", [NSValue valueWithPointer:&fadeplot_xscreensaver_function_table], @"fadeplot", [NSValue valueWithPointer:&fiberlamp_xscreensaver_function_table], @"fiberlamp", diff --git a/OSX/updates.xml b/OSX/updates.xml index 9c8f7cfb..d4d2a011 100644 --- a/OSX/updates.xml +++ b/OSX/updates.xml @@ -7,6 +7,17 @@ https://www.jwz.org/xscreensaver/updates.xml Updates to xscreensaver. en + + Version 5.37 + https://www.jwz.org/xscreensaver/xscreensaver-5.37.dmg + • 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.]]>
+ Wed, 05 Jul 2017 10:55:51 -0700 + +
Version 5.36 https://www.jwz.org/xscreensaver/xscreensaver-5.36.dmg diff --git a/OSX/xscreensaver.xcodeproj/project.pbxproj b/OSX/xscreensaver.xcodeproj/project.pbxproj index 479545fd..942114b9 100644 --- a/OSX/xscreensaver.xcodeproj/project.pbxproj +++ b/OSX/xscreensaver.xcodeproj/project.pbxproj @@ -214,6 +214,7 @@ AF777A3D09B660B500EA3033 /* PBXTargetDependency */, AFACE8911CC8365F008B24CD /* PBXTargetDependency */, AF777A3B09B660B500EA3033 /* PBXTargetDependency */, + AF21078F1FD23D9800B61EA9 /* PBXTargetDependency */, AF777A3909B660B400EA3033 /* PBXTargetDependency */, AF777A3709B660B400EA3033 /* PBXTargetDependency */, AF777A3509B660B400EA3033 /* PBXTargetDependency */, @@ -1287,6 +1288,19 @@ AF1FDA88158FF96600C40F17 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; }; AF1FDA89158FF96600C40F17 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; }; AF1FDA8A158FF96600C40F17 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; }; + AF2107781FD23BDD00B61EA9 /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; }; + AF21077A1FD23BDD00B61EA9 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; }; + AF21077B1FD23BDD00B61EA9 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; }; + AF21077C1FD23BDD00B61EA9 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; }; + AF21077D1FD23BDD00B61EA9 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; }; + AF21077E1FD23BDD00B61EA9 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; }; + AF21077F1FD23BDD00B61EA9 /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; }; + AF2107801FD23BDD00B61EA9 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; }; + AF2107891FD23D2800B61EA9 /* esper.xml in Resources */ = {isa = PBXBuildFile; fileRef = AF2107881FD23D2800B61EA9 /* esper.xml */; }; + AF21078A1FD23D2800B61EA9 /* esper.xml in Resources */ = {isa = PBXBuildFile; fileRef = AF2107881FD23D2800B61EA9 /* esper.xml */; }; + AF21078C1FD23D5000B61EA9 /* esper.c in Sources */ = {isa = PBXBuildFile; fileRef = AF21078B1FD23D5000B61EA9 /* esper.c */; }; + AF21078D1FD23D5000B61EA9 /* esper.c in Sources */ = {isa = PBXBuildFile; fileRef = AF21078B1FD23D5000B61EA9 /* esper.c */; settings = {COMPILER_FLAGS = "-DUSE_GL"; }; }; + AF2107901FD23FEC00B61EA9 /* OCRAStd.otf in Resources */ = {isa = PBXBuildFile; fileRef = AFEC68361BD6CA85004C1B64 /* OCRAStd.otf */; }; AF241F83107C38DF00046A84 /* dropshadow.c in Sources */ = {isa = PBXBuildFile; fileRef = AF241F81107C38DF00046A84 /* dropshadow.c */; }; AF2C31E615C0F7FE007A6896 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; }; AF2C31EA15C0FC9C007A6896 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; }; @@ -3801,6 +3815,20 @@ remoteGlobalIDString = AF1B0FA71D7AB4740011DBE4; remoteInfo = Hexstrut; }; + AF2107731FD23BDD00B61EA9 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */; + proxyType = 1; + remoteGlobalIDString = AF4808C0098C3B6C00FB32B8; + remoteInfo = jwxyz; + }; + AF21078E1FD23D9800B61EA9 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */; + proxyType = 1; + remoteGlobalIDString = AF2107711FD23BDD00B61EA9; + remoteInfo = Esper; + }; AF32D9E20F3AD0B40080F535 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */; @@ -7320,6 +7348,9 @@ AF1B0FBC1D7AB4740011DBE4 /* Hexstrut.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Hexstrut.saver; sourceTree = BUILT_PRODUCTS_DIR; }; AF1B0FBE1D7AB5210011DBE4 /* hexstrut.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = hexstrut.c; path = hacks/glx/hexstrut.c; sourceTree = ""; }; AF1B0FBF1D7AB5210011DBE4 /* hexstrut.xml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = hexstrut.xml; sourceTree = ""; }; + AF2107861FD23BDE00B61EA9 /* Esper.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Esper.saver; sourceTree = BUILT_PRODUCTS_DIR; }; + AF2107881FD23D2800B61EA9 /* esper.xml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = esper.xml; sourceTree = ""; }; + AF21078B1FD23D5000B61EA9 /* esper.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = esper.c; path = hacks/glx/esper.c; sourceTree = ""; }; AF241F81107C38DF00046A84 /* dropshadow.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = dropshadow.c; path = hacks/glx/dropshadow.c; sourceTree = ""; }; AF241F82107C38DF00046A84 /* dropshadow.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; name = dropshadow.h; path = hacks/glx/dropshadow.h; sourceTree = ""; }; AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = System/Library/Frameworks/QuartzCore.framework; sourceTree = SDKROOT; }; @@ -8379,6 +8410,20 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + AF2107791FD23BDD00B61EA9 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + AF21077A1FD23BDD00B61EA9 /* libjwxyz.a in Frameworks */, + AF21077B1FD23BDD00B61EA9 /* ScreenSaver.framework in Frameworks */, + AF21077C1FD23BDD00B61EA9 /* QuartzCore.framework in Frameworks */, + AF21077D1FD23BDD00B61EA9 /* Cocoa.framework in Frameworks */, + AF21077E1FD23BDD00B61EA9 /* Carbon.framework in Frameworks */, + AF21077F1FD23BDD00B61EA9 /* OpenGL.framework in Frameworks */, + AF2107801FD23BDD00B61EA9 /* libz.dylib in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; AF32D9E80F3AD0B40080F535 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; @@ -12137,6 +12182,7 @@ AFEE10A01D17E20B00AAC8F7 /* Splodesic.saver */, AF1B0FBC1D7AB4740011DBE4 /* Hexstrut.saver */, AF633C161EE0BA6F00AB33BD /* Vigilance.saver */, + AF2107861FD23BDE00B61EA9 /* Esper.saver */, ); name = Products; path = ..; @@ -12477,6 +12523,7 @@ AFA55E2509935F2B00F3E977 /* endgame.c */, AFACE88A1CC83578008B24CD /* energystream.c */, AFA55C230993435300F3E977 /* engine.c */, + AF21078B1FD23D5000B61EA9 /* esper.c */, AF642409099FFAF0000F4CD4 /* extrusion-helix2.c */, AF64240A099FFAF0000F4CD4 /* extrusion-helix3.c */, AF64240B099FFAF0000F4CD4 /* extrusion-helix4.c */, @@ -12692,6 +12739,7 @@ AFC2589C0988A468000655EE /* engine.xml */, AFC2589D0988A468000655EE /* epicycle.xml */, AFC2589E0988A468000655EE /* eruption.xml */, + AF2107881FD23D2800B61EA9 /* esper.xml */, AFC2589F0988A468000655EE /* euler2d.xml */, AFC258A00988A468000655EE /* extrusion.xml */, AFC258A10988A468000655EE /* fadeplot.xml */, @@ -13173,6 +13221,26 @@ productReference = AF1B0FBC1D7AB4740011DBE4 /* Hexstrut.saver */; productType = "com.apple.product-type.bundle"; }; + AF2107711FD23BDD00B61EA9 /* Esper */ = { + isa = PBXNativeTarget; + buildConfigurationList = AF2107831FD23BDD00B61EA9 /* Build configuration list for PBXNativeTarget "Esper" */; + buildPhases = ( + AF2107741FD23BDD00B61EA9 /* Resources */, + AF2107761FD23BDD00B61EA9 /* Sources */, + AF2107791FD23BDD00B61EA9 /* Frameworks */, + AF2107811FD23BDD00B61EA9 /* Rez */, + AF2107821FD23BDD00B61EA9 /* Run Update Info Plist */, + ); + buildRules = ( + ); + dependencies = ( + AF2107721FD23BDD00B61EA9 /* PBXTargetDependency */, + ); + name = Esper; + productName = DangerBall; + productReference = AF2107861FD23BDE00B61EA9 /* Esper.saver */; + productType = "com.apple.product-type.bundle"; + }; AF32D9E00F3AD0B40080F535 /* RubikBlocks */ = { isa = PBXNativeTarget; buildConfigurationList = AF32D9F10F3AD0B40080F535 /* Build configuration list for PBXNativeTarget "RubikBlocks" */; @@ -18144,7 +18212,7 @@ 29B97313FDCFA39411CA2CEA /* Project object */ = { isa = PBXProject; attributes = { - LastUpgradeCheck = 0830; + LastUpgradeCheck = 0920; TargetAttributes = { AF08398F09930B6B00277BE9 = { DevelopmentTeam = 4627ATJELP; @@ -18170,6 +18238,9 @@ AF1B0FA71D7AB4740011DBE4 = { DevelopmentTeam = 4627ATJELP; }; + AF2107711FD23BDD00B61EA9 = { + DevelopmentTeam = 4627ATJELP; + }; AF32D9E00F3AD0B40080F535 = { DevelopmentTeam = 4627ATJELP; }; @@ -19116,6 +19187,7 @@ AFACE8731CC83458008B24CD /* EnergyStream */, AFA55E0D09935EDC00F3E977 /* Endgame */, AFA55C0E0993431300F3E977 /* Engine */, + AF2107711FD23BDD00B61EA9 /* Esper */, AF6423F2099FF9C2000F4CD4 /* Extrusion */, AFA5603209936D5100F3E977 /* FlipFlop */, AF77773E09B6446500EA3033 /* FlipScreen3D */, @@ -19284,6 +19356,15 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + AF2107741FD23BDD00B61EA9 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + AF2107891FD23D2800B61EA9 /* esper.xml in Resources */, + AF2107901FD23FEC00B61EA9 /* OCRAStd.otf in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; AF32D9E30F3AD0B40080F535 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; @@ -20204,6 +20285,7 @@ AF918AEB158FC53D002B5D1E /* engine.xml in Resources */, AF918AEC158FC53D002B5D1E /* epicycle.xml in Resources */, AF918AED158FC53D002B5D1E /* eruption.xml in Resources */, + AF21078A1FD23D2800B61EA9 /* esper.xml in Resources */, AF918AEE158FC53D002B5D1E /* euler2d.xml in Resources */, AF918AF0158FC53D002B5D1E /* fadeplot.xml in Resources */, AF918AF1158FC53D002B5D1E /* fiberlamp.xml in Resources */, @@ -21581,6 +21663,13 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + AF2107811FD23BDD00B61EA9 /* Rez */ = { + isa = PBXRezBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; AF32D9EF0F3AD0B40080F535 /* Rez */ = { isa = PBXRezBuildPhase; buildActionMask = 2147483647; @@ -23325,6 +23414,21 @@ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX"; showEnvVarsInLog = 0; }; + AF2107821FD23BDD00B61EA9 /* 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; + }; AF32D9F00F3AD0B40080F535 /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; @@ -27230,6 +27334,15 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + AF2107761FD23BDD00B61EA9 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + AF2107781FD23BDD00B61EA9 /* XScreenSaverSubclass.m in Sources */, + AF21078C1FD23D5000B61EA9 /* esper.c in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; AF32D9E50F3AD0B40080F535 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; @@ -28420,6 +28533,7 @@ AF918A4A158FC3E5002B5D1E /* endgame.c in Sources */, AFACE88F1CC83617008B24CD /* energystream.c in Sources */, AF918A4B158FC3E5002B5D1E /* engine.c in Sources */, + AF21078D1FD23D5000B61EA9 /* esper.c in Sources */, AF918A54158FC3E5002B5D1E /* flipflop.c in Sources */, AF918A55158FC3E5002B5D1E /* flipscreen3d.c in Sources */, AF918A56158FC3E5002B5D1E /* fliptext.c in Sources */, @@ -30032,6 +30146,16 @@ target = AF1B0FA71D7AB4740011DBE4 /* Hexstrut */; targetProxy = AF1B0FC41D7AB5740011DBE4 /* PBXContainerItemProxy */; }; + AF2107721FD23BDD00B61EA9 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = AF4808C0098C3B6C00FB32B8 /* jwxyz */; + targetProxy = AF2107731FD23BDD00B61EA9 /* PBXContainerItemProxy */; + }; + AF21078F1FD23D9800B61EA9 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = AF2107711FD23BDD00B61EA9 /* Esper */; + targetProxy = AF21078E1FD23D9800B61EA9 /* PBXContainerItemProxy */; + }; AF32D9E10F3AD0B40080F535 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = AF4808C0098C3B6C00FB32B8 /* jwxyz */; @@ -32661,6 +32785,28 @@ }; name = Release; }; + AF2107841FD23BDD00B61EA9 /* 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; + }; + AF2107851FD23BDD00B61EA9 /* 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; + }; AF32D9F20F3AD0B40080F535 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { @@ -36816,13 +36962,19 @@ ARCHS = "$(ARCHS_STANDARD_32_64_BIT)"; BUNDLE_IDENTIFIER = "org.jwz.${PROJECT_NAME:rfc1034identifier}.${PRODUCT_NAME:rfc1034identifier}"; CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = NO; 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_NON_LITERAL_NULL_CONVERSION = YES; CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNREACHABLE_CODE = NO; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; @@ -36842,6 +36994,7 @@ "GETTIMEOFDAY_TWO_ARGS=1", "HAVE_UNISTD_H=1", "STANDALONE=1", + "HAVE_GL=1", "HAVE_GLBINDTEXTURE=1", "HAVE_UNAME=1", "HAVE_ICMP=1", @@ -36862,6 +37015,7 @@ "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)", ); GCC_SYMBOLS_PRIVATE_EXTERN = NO; + GCC_WARN_64_TO_32_BIT_CONVERSION = NO; GCC_WARN_ABOUT_MISSING_NEWLINE = YES; GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES; @@ -36910,13 +37064,19 @@ ARCHS = "$(ARCHS_STANDARD_32_64_BIT)"; BUNDLE_IDENTIFIER = "org.jwz.${PROJECT_NAME:rfc1034identifier}.${PRODUCT_NAME:rfc1034identifier}"; CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = NO; 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_NON_LITERAL_NULL_CONVERSION = YES; CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNREACHABLE_CODE = NO; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; @@ -36935,6 +37095,7 @@ "GETTIMEOFDAY_TWO_ARGS=1", "HAVE_UNISTD_H=1", "STANDALONE=1", + "HAVE_GL=1", "HAVE_GLBINDTEXTURE=1", "HAVE_UNAME=1", "HAVE_ICMP=1", @@ -36954,6 +37115,7 @@ "CLASS=XScreenSaver${EXECUTABLE_NAME}View", "$(GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS)", ); + GCC_WARN_64_TO_32_BIT_CONVERSION = NO; GCC_WARN_ABOUT_MISSING_NEWLINE = YES; GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES; @@ -37084,6 +37246,15 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; + AF2107831FD23BDD00B61EA9 /* Build configuration list for PBXNativeTarget "Esper" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + AF2107841FD23BDD00B61EA9 /* Debug */, + AF2107851FD23BDD00B61EA9 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; AF32D9F10F3AD0B40080F535 /* Build configuration list for PBXNativeTarget "RubikBlocks" */ = { isa = XCConfigurationList; buildConfigurations = ( diff --git a/README b/README index 333b464f..8a29747a 100644 --- a/README +++ b/README @@ -3,7 +3,8 @@ a collection of free screen savers - for X11 and MacOS + for X11, macOS, + iOS and Android By Jamie Zawinski and many others @@ -14,8 +15,8 @@ This is the XScreenSaver source code distribution. It is strongly recommended that you install a binary release rather than trying to compile it yourself. -Binaries are available for almost all platforms, including MacOS X. See the -XScreenSaver web site for details. +Executables are available for almost all platforms, including macOS, iOS, and +Android. See the XScreenSaver web site for details. To compile for a Unix system with X11: @@ -26,9 +27,9 @@ To compile for a Unix system with X11: If you are on an "apt"-based system, "apt-get build-dep xscreensaver" might install most of the compilation dependencies. -To compile for MacOS X or iOS: +To compile for macOS X or iOS: - Use the included XCode project. Requires XCode 6 and MacOS X 10.8 + Use the included XCode project. Requires XCode 6 and macOS 10.8 or newer. To compile for Android: @@ -45,27 +46,49 @@ XScreenSaver has an extensive manual -- please read it! =============================================================================== +5.38 * New hack, 'esper'. + * macOS: Support for Retina displays. + * X11: `webcollage' now works with ImageMagick instead of with + pbmtools if `webcollage-helper' is not installed. + * 'bsod' now accepts Dunning-Krugerrands. + * Android: These hacks work now: 'anemone', 'anemotaxis', 'atlantis', + 'bouboule', 'celtic', 'compass', 'crackberg', 'epicycle', + 'fuzzyflakes', 'goop', 'kumppa' 'munch', 'pacman', 'polyominoes', + 'slip'. + * Android: Thick lines work better for: 'anemone', 'anemotaxis', + 'celtic', 'compass', 'deluxe', 'epicycle', 'fuzzyflakes', 'pacman' + * Android: Assorted performance improvements, especially for 'kumppa' + and 'slip'. + * Android TV: Daydreams work. + * iOS: Tweaks for iPhone X. + * Lots of xlockmore-derived hacks now have animated erase routines. + * 'crystal' works properly on non-X11 systems. + * 'm6502' now includes 'texture.asm'. + * X11: Try harder to find sensible fonts for the password dialog. + 5.37 * New hack, `vigilance'. * Added Mac Software Update and VMware to `bsod'. - * OSX: Grabbing the desktop works again. - * OSX: Pinch to zoom. + * macOS: Grabbing the desktop works again. + * macOS: 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', + * macOS: loading image files works in `dymaxionmap', `glplanet', `lavalite', `pulsar', `gleidescope' and `extrusion'. * Several new programs in `m6502'. * `rotzoomer -mode circle'. * Better titles in `photopile'. + 5.35 * New hacks, `dymaxionmap', `unicrud', `energystream', `raverhoop' and `hydrostat'. * 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 + * 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. @@ -73,7 +96,7 @@ XScreenSaver has an extensive manual -- please read it! 5.34 * Fixed a crash when hot-swapping monitors while locked. * Fixed some incorrect output from `xscreensaver-command -watch'. - * Various OSX and iOS performance improvements. + * Various macOS and iOS performance improvements. 5.33 * New hacks, `splitflap' and `romanboy'. * Better detection of user activity on modern GNOME systems. @@ -84,20 +107,20 @@ XScreenSaver has an extensive manual -- please read it! 5.32 * Fixed some X11 compilation problems. * Fixed display size and shake gestures on iOS. - * OSX/iOS Performance improvements. + * macOS/iOS Performance improvements. 5.31 * New hacks, `geodesicgears', `binaryring' and `cityflow'. * UTF-8 text support (instead of only Latin1) and antialiased text - on X11 with Xft (instead of only on OSX/iOS) in `fontglide', + on X11 with Xft (instead of only on macOS/iOS) in `fontglide', `noseguy', `fliptext', `starwars', and `winduprobot'. The other text-displaying hacks (`apple2', `phosphor', `xmatrix', and `gltext') also now accept UTF-8 input, though they convert it to Latin1 or ASCII. * `glplanet' now has both day and night maps, and a sharp terminator. - * Fixed `webcollage' on OSX. + * Fixed `webcollage' on macOS. * Fixed a transparency glitch in `winduprobot'. * `lockward' works on iOS. - * Text and image loading work on OSX 10.10. + * Text and image loading work on macOS 10.10. * Rotation works properly on iOS 8. * Added a search field on iOS. * Preliminary, unfinished support for Android. @@ -112,7 +135,7 @@ XScreenSaver has an extensive manual -- please read it! * Most hacks respond to mouse-clicks, double-taps and swipes as meaning "do something different now". * Reworked OpenGL fonts. - * The OSX auto-update installer wasn't working. This time for sure? + * The macOS auto-update installer wasn't working. This time for sure? * Various minor fixes. 5.29 * Downgraded to Xcode 5.0.2 to make it possible to build savers @@ -120,7 +143,7 @@ XScreenSaver has an extensive manual -- please read it! * Updated `webcollage' for recent changes. 5.28 * Fixed some compilation problems and intermittent crashes. - * Turned off the OSX 10.6 enable_gc hack. It didn't work. + * Turned off the macOS 10.6 enable_gc hack. It didn't work. 5.27 * New hacks, `tessellimage' and `projectiveplane'. * Added support for pthreads, because Dave Odell is a madman. @@ -129,16 +152,16 @@ XScreenSaver has an extensive manual -- please read it! * X11: Don't assume Suspend = 0 implies "No DPMS". * Minor updates to `boxed' and `klein'. * Fixed possible crash in `apple2', `noseguy', `xmatrix', `shadebobs'. - * Fixed possible crash in OSX preferences. - * OSX Performance improvements. + * Fixed possible crash in macOS preferences. + * macOS Performance improvements. * Plugged some leaks. 5.26 * More auto-updater tweaks. -5.25 * Try harder to bypass Quarrantine and Gatekeeper in OSX installer. +5.25 * Try harder to bypass Quarrantine and Gatekeeper in macOS installer. * Some files were missing from the tarball. -5.24 * Added "Automatically check for updates" option on OSX. +5.24 * Added "Automatically check for updates" option on macOS. * Updated feed-loading for recent Flickr changes. * Updated `webcollage' for recent Google changes. * Added Instagram and Bing as `webcollage' image sources. @@ -146,13 +169,13 @@ XScreenSaver has an extensive manual -- please read it! * Bug fixes. 5.23 * New hack, `geodesic'. - * iOS and OSX: huge XCopyArea performance improvements. + * iOS and macOS: huge XCopyArea performance improvements. * More heuristics for using RSS feeds as image sources. * Improved Wikipedia parser. * Updated `webcollage' for recent Flickr changes. * Added Android to `bsod'. - * OSX: Added a real installer. - * iOS and OSX: fixed a font-metrics bug. + * macOS: Added a real installer. + * iOS and macOS: fixed a font-metrics bug. * iOS: Fixed aspect ratio bug in non-rotating apps when launched in landscape mode. * Made `quasicrystal' work on weak graphics cards. @@ -181,14 +204,14 @@ XScreenSaver has an extensive manual -- please read it! now requires a login to get any feeds. * New version of `fireworkx'. * Minor fixes to `distort', `fontglide', `xmatrix'. - * New MacOS crash in `bsod'. + * New macOS crash in `bsod'. * New mode in `lcdscrub'. 5.20 * Support for iPhone 5 screen size. - * Fixed modifier key handing in Apple2.app and Phosphor.app on MacOS. + * Fixed modifier key handing in Apple2.app and Phosphor.app on macOS. * Various minor bug fixes. -5.19 * MacOS 10.8.0 compatibility. +5.19 * macOS 10.8.0 compatibility. * iOS performance improvements. 5.18 * iOS responds to shake gestures to randomize. @@ -216,10 +239,10 @@ XScreenSaver has an extensive manual -- please read it! `imageDirectory' may contain a URL. * Updated `webcollage' for recent search engine changes. * `phosphor' and `apple2' can now be run as standalone terminal - emulator applications on MacOS. + emulator applications on macOS. * `photopile' sped up. * New molecule in `molecule'. - * "Upgraded" to XCode 4.0, which means that MacOS 10.4 PPC builds are + * "Upgraded" to XCode 4.0, which means that macOS 10.4 PPC builds are impossible, and Intel is now required. * Turned on LC_CTYPE on Linux; maybe Japanese password entry works now? @@ -238,10 +261,10 @@ XScreenSaver has an extensive manual -- please read it! * Passwords that contain UTF-8 non-Latin1 chars are now typeable. * Numerous minor stability fixes. -5.12 * Big speed improvement on OSX for heavy XCopyArea users (`xmatrix', +5.12 * Big speed improvement on macOS for heavy XCopyArea users (`xmatrix', `moire2', `phosphor', etc.) - * Plugged a bad OSX-only Pixmap leak. - * Kludged around the OSX pty bug that caused text to be truncated in + * Plugged a bad macOS-only Pixmap leak. + * Kludged around the macOS pty bug that caused text to be truncated in phosphor, starwars, apple2, etc. * New molecule in `molecule'. * `glhanoi' now supports an arbitrary number of poles. @@ -249,25 +272,25 @@ XScreenSaver has an extensive manual -- please read it! * Added support for XInput-style alternate input devices. 5.11 * New versions of `photopile', `strange'. - * Worked around MacOS 10.6 garbage collector bug that caused the + * Worked around macOS 10.6 garbage collector bug that caused the screen saver process to become enormous. * Fixed flicker in `pipes', `cubestorm', and `noof'. - * Fixed EXIF rotation on MacOS 10.6. - * Fixed desktop-grabbing when screen locked on MacOS. + * Fixed EXIF rotation on macOS 10.6. + * Fixed desktop-grabbing when screen locked on macOS. * Minor fixes to `circuit', `polyhedra', `tangram', `gears', `pinion', `substrate', `xanalogtv'. * Fixed some leaks in `xanalogtv' and `apple2'. * Better seeding of the RNG. -5.10 * Fixed some crashes and color problems on MacOS 10.6. +5.10 * Fixed some crashes and color problems on macOS 10.6. * Retired `hypercube' and `hyperball', which are redundant with `polytopes'. -5.09 * Ported to MacOS 10.6, including various 64-bit fixes. +5.09 * Ported to macOS 10.6, including various 64-bit fixes. * New hack, `rubikblocks'. * Fixed another potential RANDR crash. - * Use correct proxy server on MacOS. + * Use correct proxy server on macOS. * `molecule' now correctly displays PDB 3.2 files. * Updates to `mirrorblob', `glhanoi', and `sonar'. * Rewritten version of `klein' hack. @@ -298,11 +321,11 @@ XScreenSaver has an extensive manual -- please read it! * `flipflop' can load images onto the tiles. * Fixed the bouncing ball in `stairs'. * Added the missing Utah Teapotahedron to `polyhedra'. - * `blitspin' works with color images on MacOS now. + * `blitspin' works with color images on macOS now. * Added transparency to `stonerview'. * Improved layout of the preferences dialogs: they should all now be usable even on ridiculously tiny laptop screens. - * MacOS preferences text fields now prevent you from entering numbers + * macOS preferences text fields now prevent you from entering numbers that are out of range. * Added "Reset to Defaults" button on X11. * Added relevant Wikipedia links to many of the screen saver @@ -331,9 +354,9 @@ XScreenSaver has an extensive manual -- please read it! rectangles available. * Don't warning about receipt of bogus ClientMessages, since Gnome's just never going to stop sending those. - * Worked around MacOS 10.5 perl bug that caused the text-displaying + * Worked around macOS 10.5 perl bug that caused the text-displaying hacks to fail on some systems. - * Hopefully fixed font-related System Preferences crashes in MacOS + * Hopefully fixed font-related System Preferences crashes in macOS savers. * The recent PAM changes broke the "Caps Lock" warning in the password dialog, the failed login warnings, and syslogging. Fixed all that. @@ -347,7 +370,7 @@ XScreenSaver has an extensive manual -- please read it! `fireworkx' and `webcollage'. * `pong' can now display the current time as the score. * `xmatrix -mode pipe' works better. - * Minor tweaks for compilation on MacOS 10.5.0. + * Minor tweaks for compilation on macOS 10.5.0. 5.03 * New hacks, `cwaves', `glcells', `m6502', and `voronoi'. * Minor fixes to `bsod'. @@ -356,27 +379,27 @@ XScreenSaver has an extensive manual -- please read it! changes. 5.02 * Reworked PAM code to support fingerprint readers, etc. - * Ported `webcollage' to MacOS. - * Added MacOS 10.2 and 10.3 kernel panics to `bsod'. + * Ported `webcollage' to macOS. + * Added macOS 10.2 and 10.3 kernel panics to `bsod'. * Fixed a Xinerama crash when changing the screen count. * New blobbier `mirrorblob'. * Minor updates to `lisa', `bsod', `ifs', `hypertorus', `polytopes', `circuit', `endgame', `crackberg', `flipflop', `flipscreen3d', `fliptext', and `carousel'. - * Enabled multi-threaded OpenGL on MacOS. + * Enabled multi-threaded OpenGL on macOS. 5.01 * Backed out recent locale-related changes, since they broke far more things than they fixed. * Fail gracefully with ridiculously small window sizes. - * `xflame' and `flag' ignore bitmap option on MacOS. - * `speedmine' prefs work on MacOS. + * `xflame' and `flag' ignore bitmap option on macOS. + * `speedmine' prefs work on macOS. * Better explosions in `boxed'. * More dynamic motion in `sproingies'. * More options in `flipflop'. * Minor updates to `topblock'. * Various other minor fixes. -5.00 * Ported to MacOS X! (10.4.0 or newer) +5.00 * Ported to macOS! (10.4.0 or newer) * API change: instead of providing a single screenhack() function that does not return, screen savers using the screenhack.h framework must now provide "init" and "draw one frame" functions instead. All @@ -392,7 +415,7 @@ XScreenSaver has an extensive manual -- please read it! * Changes to the defaults and command-line options of many hacks to make the .xml files more consistent. * Reap zombies in `glslideshow' and `carousel'. - * `sonar' works without setuid on MacOS (dgram icmp). + * `sonar' works without setuid on macOS (dgram icmp). * `xmatrix -mode pipe' displays the text of a subprocess. * `endgame' has higher resolution chess-piece models. * `webcollage' takes a -directory option to get images from a local @@ -419,7 +442,7 @@ XScreenSaver has an extensive manual -- please read it! seem to be installed. * Don't install `ant' by default, since there is some Java tool of that name, which was causing confusion. And also it's boring. - * Made screen grabbing work again on MacOS 10.4.2. + * Made screen grabbing work again on macOS 10.4.2. * No longer prints bogus warnings about ClientMessages intended for the window manager. * Ignore unprintable characters in passwd entry field. @@ -539,7 +562,7 @@ XScreenSaver has an extensive manual -- please read it! * New version of `glsnake' (with many more models.) * Another Windows crash in `bsod'; also HVX/GCOS6/TPS6. * New version of `endgame'. - * Screen grabbing works on MacOS X. + * Screen grabbing works on macOS. * Various minor fixes. 4.13 * On Xinerama systems, xscreensaver now runs one hack on each monitor @@ -582,7 +605,7 @@ XScreenSaver has an extensive manual -- please read it! 4.08 * New hacks, `atunnels' and `piecewise'. * Physics improvement in `fluidballs'. - * Various fixes for XDarwin systems (X11 on MacOS X.) + * Various fixes for XDarwin systems (X11 on macOS.) * Added -clock option to `barcode'. * Minor fixes to `endgame', `flurry', `flipscreen3d', and `gflux'. @@ -619,7 +642,7 @@ XScreenSaver has an extensive manual -- please read it! * Updated to latest `config.guess' and `config.sub'. * Fixed occasional core dump in `distort'. * Added a Linux fsck failure and kernel panic to `bsod'. - * Added MacOS X kernel panic to `bsod'. + * Added macOS kernel panic to `bsod'. * Fixed a bug in `bsod' (all bsod bugs are ironic.) * Fixed a bug that caused `xscreensaver-gl-helper' to print a nonsense visual ID with some versions of `printf': this could cause GL diff --git a/README.hacking b/README.hacking index 3cceb577..6fc2fe58 100644 --- a/README.hacking +++ b/README.hacking @@ -92,7 +92,7 @@ The XScreenSaver API You may not store global state in global variables, or in function-local static variables. All of your runtime state must be encapsulted in the "state" object created by your "init" function. If you use global or - static variables, your screen saver will not work properly on MacOS. + static variables, your screen saver will not work properly on macOS. Do not call XSync() or XFlush(). If you think you need to do that, it probably means that you are you are relying on the speed of the graphics @@ -101,29 +101,46 @@ The XScreenSaver API ========================================================================== -The XLockMore API +The xlockmore API ========================================================================== Some of the display modes that come with xscreensaver were ported from - XLock, and so, for historical reasons, they follow a slightly different + xlock, and so, for historical reasons, they follow a slightly different programming convention. For newly-written Xlib programs, you'd be better off following the pattern used in hacks like "Deluxe" than in - hacks like "Flag". The XLockMore ones are the ones that begin with + hacks like "Flag". The xlockmore ones are the ones that begin with "#ifdef STANDALONE" and #include "xlockmore.h". - But, all OpenGL screen savers have to follow the XLockMore API. + But, all OpenGL screen savers have to follow the xlockmore API. - The XLockMore API is similar to the XScreenSaver API, in that you define + The xlockmore API is similar to the XScreenSaver API, in that you define (roughly) the same set of functions, but the naming conventions are slightly different. Instead of "hackname_init", it's "init_hackname", and it should be preceeded with the pseudo-declaration ENTRYPOINT. - One annoying mis-feature of the XLockMore API is that it *requires* you + One annoying mis-feature of the xlockmore API is that it *requires* you to make use of global variables for two things: first, for each of your command line options; and second, for an array that holds your global state objects. These are the only exceptions to the "never use global variables" rule. + There are a few important differences between the original xlockmore API + and XScreenSaver's implementation: + + - XScreenSaver does not use refresh_hackname or change_hackname. + + - XScreenSaver provides two additional hooks not present in xlockmore: + reshape_hackname, and hackname_handle_event. These are respectively + equivalent to hackname_reshape and hackname_event in the XScreenSaver + API. + + - Under Xlib, MI_CLEARWINDOW doesn't clear the window immediately. + Instead, due to double buffering on macOS/iOS/Android, it waits until + after init_hackname or draw_hackname returns before clearing. Make + sure not to issue any Xlib drawing calls immediately after a call to + MI_CLEARWINDOW, as these will be erased. To clear the window + immediately, just use XClearWindow. + ========================================================================== Programming Tips @@ -163,16 +180,19 @@ Programming Tips ========================================================================== -MacOS, iOS and Android +macOS, iOS and Android ========================================================================== Though XScreenSaver started its life as an X11 program, it also now runs - on MacOS, iOS and Android, due to a maniacal collection of compatibility + on macOS, iOS and Android, due to a maniacal collection of compatibility shims. If you do your development on an X11 system, and follow the usual XScreenSaver APIs, you shouldn't need to do anything special for - it to also work on MacOS and on phones. + it to also work on macOS and on phones. See the READMEs in the OSX/ and android/ directories for instructions on compiling for those platforms. + To check that an X11 saver will fit well on a mobile device, test it + with -geometry 640x1136 and 640x960. That's a good first step, anyway. + ========================================================================== diff --git a/aclocal.m4 b/aclocal.m4 index 03fbf515..28686cb1 100644 --- a/aclocal.m4 +++ b/aclocal.m4 @@ -1,6 +1,6 @@ -# generated automatically by aclocal 1.15 -*- Autoconf -*- +# generated automatically by aclocal 1.15.1 -*- Autoconf -*- -# Copyright (C) 1996-2014 Free Software Foundation, Inc. +# Copyright (C) 1996-2017 Free Software Foundation, Inc. # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, @@ -111,6 +111,51 @@ fi AC_SUBST($1)dnl ]) +dnl Checks for special options needed on Mac OS X. +dnl Defines INTL_MACOSX_LIBS. +dnl +dnl Copied from intlmacosx.m4 in gettext, GPL. +dnl Copyright (C) 2004-2013 Free Software Foundation, Inc. +glib_DEFUN([glib_gt_INTL_MACOSX], +[ + dnl Check for API introduced in Mac OS X 10.2. + AC_CACHE_CHECK([for CFPreferencesCopyAppValue], + [gt_cv_func_CFPreferencesCopyAppValue], + [gt_save_LIBS="$LIBS" + LIBS="$LIBS -Wl,-framework -Wl,CoreFoundation" + AC_LINK_IFELSE( + [AC_LANG_PROGRAM( + [[#include ]], + [[CFPreferencesCopyAppValue(NULL, NULL)]])], + [gt_cv_func_CFPreferencesCopyAppValue=yes], + [gt_cv_func_CFPreferencesCopyAppValue=no]) + LIBS="$gt_save_LIBS"]) + if test $gt_cv_func_CFPreferencesCopyAppValue = yes; then + AC_DEFINE([HAVE_CFPREFERENCESCOPYAPPVALUE], [1], + [Define to 1 if you have the Mac OS X function CFPreferencesCopyAppValue in the CoreFoundation framework.]) + fi + dnl Check for API introduced in Mac OS X 10.3. + AC_CACHE_CHECK([for CFLocaleCopyCurrent], [gt_cv_func_CFLocaleCopyCurrent], + [gt_save_LIBS="$LIBS" + LIBS="$LIBS -Wl,-framework -Wl,CoreFoundation" + AC_LINK_IFELSE( + [AC_LANG_PROGRAM( + [[#include ]], + [[CFLocaleCopyCurrent();]])], + [gt_cv_func_CFLocaleCopyCurrent=yes], + [gt_cv_func_CFLocaleCopyCurrent=no]) + LIBS="$gt_save_LIBS"]) + if test $gt_cv_func_CFLocaleCopyCurrent = yes; then + AC_DEFINE([HAVE_CFLOCALECOPYCURRENT], [1], + [Define to 1 if you have the Mac OS X function CFLocaleCopyCurrent in the CoreFoundation framework.]) + fi + INTL_MACOSX_LIBS= + if test $gt_cv_func_CFPreferencesCopyAppValue = yes || test $gt_cv_func_CFLocaleCopyCurrent = yes; then + INTL_MACOSX_LIBS="-Wl,-framework -Wl,CoreFoundation" + fi + AC_SUBST([INTL_MACOSX_LIBS]) +]) + # GLIB_WITH_NLS #----------------- glib_DEFUN([GLIB_WITH_NLS], @@ -124,6 +169,8 @@ glib_DEFUN([GLIB_WITH_NLS], XGETTEXT=: INTLLIBS= + glib_gt_INTL_MACOSX + AC_CHECK_HEADER(libintl.h, [gt_cv_func_dgettext_libintl="no" libintl_extra_libs="" @@ -207,7 +254,7 @@ glib_DEFUN([GLIB_WITH_NLS], fi if test "$gt_cv_func_dgettext_libintl" = "yes"; then - INTLLIBS="-lintl $libintl_extra_libs" + INTLLIBS="-lintl $libintl_extra_libs $INTL_MACOSX_LIBS" fi if test "$gt_cv_have_gettext" = "yes"; then @@ -651,7 +698,7 @@ AC_DEFUN([AM_NLS], AC_SUBST([USE_NLS]) ]) -# Copyright (C) 2006-2014 Free Software Foundation, Inc. +# Copyright (C) 2006-2017 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, diff --git a/android/Makefile b/android/Makefile index 7549411b..0ba4f58a 100644 --- a/android/Makefile +++ b/android/Makefile @@ -1,7 +1,7 @@ # XScreenSaver for Android export TERM=dumb -GRADLE = cd project ; ./gradlew +GRADLE = ./gradlew default:: debug all:: release @@ -41,6 +41,7 @@ export ANDROID_HACKS= \ anemone \ anemotaxis \ apollonian \ + atlantis \ attraction \ atunnel \ blaster \ @@ -50,14 +51,17 @@ export ANDROID_HACKS= \ bouncingcow \ boxed \ boxfit \ + bouboule \ braid \ bsod \ cage \ ccurve \ + celtic \ cloudlife \ companioncube \ compass \ coral \ + crackberg \ crystal \ cubestack \ cubestorm \ @@ -67,6 +71,7 @@ export ANDROID_HACKS= \ dangerball \ decayscreen \ deco \ + deluxe \ demon \ discrete \ discoball \ @@ -126,6 +131,7 @@ export ANDROID_HACKS= \ moebiusgears \ moire \ morph3d \ + munch \ nerverot \ noof \ penetrate \ @@ -133,6 +139,7 @@ export ANDROID_HACKS= \ petri \ piecewise \ pinion \ + polyominoes \ polytopes \ pong \ popsquares \ @@ -153,6 +160,7 @@ export ANDROID_HACKS= \ sierpinski \ sierpinski3d \ slidescreen \ + slip \ splodesic \ squiral \ stairs \ @@ -179,6 +187,7 @@ export ANDROID_HACKS= \ wormhole \ xflame \ xlyap \ + xrayswarm \ xspirograph \ @@ -188,23 +197,19 @@ ANDROID_TODO= \ antinspect \ antmaze \ antspotlight \ - atlantis \ barcode \ binaryring \ blitspin \ - bouboule \ bumps \ carousel \ - celtic \ circuit \ cityflow \ - crackberg \ cube21 \ cubenetic \ cubicgrid \ - deluxe \ dymaxionmap \ endgame \ + esper \ flipscreen3d \ fliptext \ fontglide \ @@ -226,19 +231,16 @@ ANDROID_TODO= \ moire2 \ molecule \ mountain \ - munch \ noseguy \ pedal \ phosphor \ photopile \ pipes \ - polyominoes \ projectiveplane \ pulsar \ qix \ queens \ skytentacles \ - slip \ speedmine \ spheremonics \ splitflap \ @@ -252,7 +254,6 @@ ANDROID_TODO= \ xanalogtv \ xjack \ xmatrix \ - xrayswarm \ zoom \ @@ -285,7 +286,7 @@ m6502.h:: fi; \ done -project/xscreensaver/res/drawable/%.png: +xscreensaver/res/drawable/%.png: @\ FILE1=`echo "$@" | sed 's!^.*/\([^/]*\)\.png$$!\1.jpg!'` ; \ FILE2="$@" ; \ @@ -303,19 +304,19 @@ project/xscreensaver/res/drawable/%.png: thumbs:: @for f in $(ANDROID_HACKS) $(ANDROID_TODO) ; do \ - $(MAKE) project/xscreensaver/res/drawable/$$f.png ; \ + $(MAKE) xscreensaver/res/drawable/$$f.png ; \ done clean_thumbs:: @\ for f in $(ANDROID_HACKS) $(ANDROID_TODO) ; do \ - rm -f project/xscreensaver/res/drawable/$$f.png ; \ + rm -f xscreensaver/res/drawable/$$f.png ; \ done distclean:: clean_thumbs clean -EXTRA_TARFILES = project/xscreensaver/res/drawable/thumbnail.png \ +EXTRA_TARFILES = xscreensaver/res/drawable/thumbnail.png \ echo_tarfiles: @FILES=`find . $(EXTRA_TARFILES) \( \( \ @@ -358,7 +359,7 @@ $(KEYSTORE): keytool -genkey -v -keystore $@ \ -alias xscreensaver -keyalg RSA -keysize 2048 -validity 10000 -APK_DIR = project/xscreensaver/build/outputs/apk/ +APK_DIR = xscreensaver/build/outputs/apk/ APK_UNSIGNED = $(APK_DIR)/xscreensaver-release-unsigned.apk APK_UNALIGNED = $(APK_DIR)/xscreensaver-release-unaligned.apk APK_SIGNED = $(APK_DIR)/xscreensaver-release.apk diff --git a/android/README b/android/README index fb7a4da9..0a2081f1 100644 --- a/android/README +++ b/android/README @@ -19,9 +19,9 @@ To set up your Android development environment: "build-tools/", etc.) That is, it should be "sdk/ndk/". set $ANDROID_HOME to where your SDK is installed, or - set "sdk.dir" in project/local.properties. + set "sdk.dir" in the file local.properties. On MacOS, the value you want is probably ~/Library/Android/sdk/ - Also set "ndk.dir" in project/local.properties. + Also set "ndk.dir" in local.properties. To build: @@ -30,7 +30,7 @@ To build: make Hopefully an "xscreensaver-debug.apk" file will appear in - android/project/xscreensaver/build/outputs/apk/. + android/xscreensaver/build/outputs/apk/. Load that onto your device and go to: Settings / Display / Daydream @@ -60,7 +60,7 @@ To build: To load it into the currently-running emulator or device: $ANDROID_HOME/platform-tools/adb install -r \ - project/xscreensaver/build/outputs/apk/xscreensaver-debug.apk + xscreensaver/build/outputs/apk/xscreensaver-debug.apk Extremely verbose log output, including stack traces: $ANDROID_HOME/platform-tools/adb logcat @@ -79,50 +79,50 @@ To build: Directory structure: Boilerplate for the Java version of "make": - project/*gradle* - project/*.properties - project/xscreensaver/*gradle* - project/xscreensaver/build.* - project/xscreensaver/*.properties + *gradle* + *.properties + xscreensaver/*gradle* + xscreensaver/build.* + xscreensaver/*.properties The other half of the Makefile: - project/xscreensaver/jni/*.mk + xscreensaver/jni/*.mk Source code: - project/xscreensaver/src/org/jwz/xscreensaver/*.java - project/xscreensaver/res/layout/*.xml + xscreensaver/src/org/jwz/xscreensaver/*.java + xscreensaver/res/layout/*.xml Other relevant source code is in ../jwxyz/ and ../hacks/. Icons: - project/xscreensaver/res/drawable-ldpi/ - project/xscreensaver/res/drawable-mdpi/ - project/xscreensaver/res/drawable/ + xscreensaver/res/drawable-ldpi/ + xscreensaver/res/drawable-mdpi/ + xscreensaver/res/drawable/ Files that we generate: gen/function-table.h - project/xscreensaver/AndroidManifest.xml - project/xscreensaver/res/drawable/*.png - project/xscreensaver/res/values/settings.xml - project/xscreensaver/res/values/strings.xml - project/xscreensaver/res/xml/*.xml - project/xscreensaver/src/org/jwz/xscreensaver/gen/*.java + xscreensaver/AndroidManifest.xml + xscreensaver/res/drawable/*.png + xscreensaver/res/values/settings.xml + xscreensaver/res/values/strings.xml + xscreensaver/res/xml/*.xml + xscreensaver/src/org/jwz/xscreensaver/gen/*.java Other files generated as a part of the build process: gen/ - project/.gradle/ - project/xscreensaver/build/ - project/xscreensaver/build/outputs/apk/ -- app appears here - project/xscreensaver/jni/ - project/xscreensaver/libs/ - project/xscreensaver/obj/ - project/xscreensaver/res/ - project/xscreensaver/res/drawable/ - project/xscreensaver/res/values/ - project/xscreensaver/res/xml/ - project/xscreensaver/src/org/jwz/xscreensaver/gen/ + .gradle/ + xscreensaver/build/ + xscreensaver/build/outputs/apk/ -- app appears here + xscreensaver/jni/ + xscreensaver/libs/ + xscreensaver/obj/ + xscreensaver/res/ + xscreensaver/res/drawable/ + xscreensaver/res/values/ + xscreensaver/res/xml/ + xscreensaver/src/org/jwz/xscreensaver/gen/ When adding a new hack, edit android/Makefile, then "make clean" and "make". @@ -150,8 +150,6 @@ TODO list, and known bugs: display the error message in a dialog. The catch works, but the dialog box does not. - anemone needs thick lines - anemotaxis needs thick lines antinspect crashes emulator, sometimes antmaze crashes emulator, sometimes antspotlight crashes emulator, sometimes @@ -161,29 +159,24 @@ TODO list, and known bugs: binaryring pixmaps blitspin images bouboule ? - braid thick lines bsod pixmaps, XCopyArea problems bumps XPutImage carousel blank - celtic thick lines circuit crashes emulator cityflow crashes emulator, sometimes - compass thick lines crackberg crashes emulator, sometimes cube21 crashes emulator, sometimes cubenetic crashes emulator, sometimes cubicgrid crashes emulator, sometimes - deluxe thick lines dnalogo codeword is blank dymaxionmap crashes emulator endgame crashes emulator engine text - epicycle thick lines + esper text flipflop images flipscreen3d images fliptext text fontglide text - fuzzyflakes thick lines gflux images glblur crashes emulator, sometimes gleidescope images @@ -228,11 +221,9 @@ TODO list, and known bugs: substrate background should be white surfaces crashes emulator tessellimage pixmaps - truchet thick lines twang background should be black unicrud pixmaps xanalogtv pixmaps xjack blank xmatrix pixmaps - xrayswarm thick lines zoom pixmaps diff --git a/android/project/project.iml b/android/android.iml similarity index 91% rename from android/project/project.iml rename to android/android.iml index de3d86e0..7db6b232 100644 --- a/android/project/project.iml +++ b/android/android.iml @@ -1,5 +1,5 @@ - + diff --git a/android/project/build.gradle b/android/build.gradle similarity index 100% rename from android/project/build.gradle rename to android/build.gradle diff --git a/android/project/gradle/wrapper/gradle-wrapper.jar b/android/gradle/wrapper/gradle-wrapper.jar similarity index 100% rename from android/project/gradle/wrapper/gradle-wrapper.jar rename to android/gradle/wrapper/gradle-wrapper.jar diff --git a/android/project/gradle/wrapper/gradle-wrapper.properties b/android/gradle/wrapper/gradle-wrapper.properties similarity index 100% rename from android/project/gradle/wrapper/gradle-wrapper.properties rename to android/gradle/wrapper/gradle-wrapper.properties diff --git a/android/project/gradlew b/android/gradlew similarity index 100% rename from android/project/gradlew rename to android/gradlew diff --git a/android/project/gradlew.bat b/android/gradlew.bat similarity index 100% rename from android/project/gradlew.bat rename to android/gradlew.bat diff --git a/android/project/local.properties b/android/local.properties similarity index 100% rename from android/project/local.properties rename to android/local.properties diff --git a/android/project/xscreensaver/assets/fonts/OCRAStd.otf b/android/project/xscreensaver/assets/fonts/OCRAStd.otf deleted file mode 120000 index 6a6cb468..00000000 --- a/android/project/xscreensaver/assets/fonts/OCRAStd.otf +++ /dev/null @@ -1 +0,0 @@ -../../../../../OSX/OCRAStd.otf \ No newline at end of file diff --git a/android/project/xscreensaver/assets/fonts/PxPlus_IBM_VGA8.ttf b/android/project/xscreensaver/assets/fonts/PxPlus_IBM_VGA8.ttf deleted file mode 120000 index 7be8e8e8..00000000 --- a/android/project/xscreensaver/assets/fonts/PxPlus_IBM_VGA8.ttf +++ /dev/null @@ -1 +0,0 @@ -../../../../../OSX/PxPlus_IBM_VGA8.ttf \ No newline at end of file diff --git a/android/project/xscreensaver/assets/fonts/YearlReg.ttf b/android/project/xscreensaver/assets/fonts/YearlReg.ttf deleted file mode 120000 index d67181b2..00000000 --- a/android/project/xscreensaver/assets/fonts/YearlReg.ttf +++ /dev/null @@ -1 +0,0 @@ -../../../../../OSX/YearlReg.ttf \ No newline at end of file diff --git a/android/project/xscreensaver/src/org/jwz/xscreensaver/XScreenSaverRenderer.java b/android/project/xscreensaver/src/org/jwz/xscreensaver/XScreenSaverRenderer.java deleted file mode 100644 index 5ae5a5a8..00000000 --- a/android/project/xscreensaver/src/org/jwz/xscreensaver/XScreenSaverRenderer.java +++ /dev/null @@ -1,196 +0,0 @@ -/* -*- Mode: java; indent-tabs-mode: nil; c-basic-offset: 2 -*- - * xscreensaver, Copyright (c) 2016 Jamie Zawinski - * and Dennis Sheil - * - * Permission to use, copy, modify, distribute, and sell this software and its - * documentation for any purpose is hereby granted without fee, provided that - * the above copyright notice appear in all copies and that both that - * copyright notice and this permission notice appear in supporting - * documentation. No representations are made about the suitability of this - * software for any purpose. It is provided "as is" without express or - * implied warranty. - */ - -package org.jwz.xscreensaver; - -import java.util.Map; -import java.lang.RuntimeException; -import android.view.Display; -import android.view.WindowManager; -import android.view.Surface; -import android.view.KeyEvent; -import android.content.Context; -import android.graphics.Bitmap; -import android.opengl.GLSurfaceView; -import java.util.Timer; -import java.util.TimerTask; -import javax.microedition.khronos.egl.EGLConfig; -import javax.microedition.khronos.opengles.GL10; -import org.jwz.xscreensaver.jwxyz; -import android.os.Message; -import android.os.Handler; -import android.util.Log; - - -public class XScreenSaverRenderer implements GLSurfaceView.Renderer { - - boolean initTried = false; - jwxyz jwxyz_obj = null; - - String hack; - Handler.Callback abort_callback; - - Context app; - Bitmap screenshot; - - GLSurfaceView glview; - - class RenderTask extends TimerTask { - public void run() { - glview.requestRender(); - } - }; - - Timer timer = new Timer(); - - private void LOG (String fmt, Object... args) { - Log.d ("xscreensaver", - this.getClass().getSimpleName() + ": " + - String.format (fmt, args)); - } - - private void except(Exception e) { - jwxyz_obj = null; - Message m = Message.obtain (null, 0, (Object) e); - abort_callback.handleMessage (m); - } - - public XScreenSaverRenderer (String hack, - Context app, - Bitmap screenshot, - Handler.Callback abort_callback, - GLSurfaceView glview) { - super(); - this.hack = hack; - this.app = app; - this.screenshot = screenshot; - this.abort_callback = abort_callback; - this.glview = glview; - LOG ("init %s", hack); - - this.glview.setEGLConfigChooser (8, 8, 8, 8, 16, 0); - this.glview.setRenderer (this); - this.glview.setRenderMode (GLSurfaceView.RENDERMODE_WHEN_DIRTY); - } - - static public String saverNameOf (Object obj) { - // Extract the saver name from e.g. "gen.Daydream$BouncingCow" - String name = obj.getClass().getSimpleName(); - int index = name.lastIndexOf('$'); - if (index != -1) { - index++; - name = name.substring (index, name.length() - index); - } - return name.toLowerCase(); - } - - public void onDrawFrame (GL10 gl) { - try { - if (jwxyz_obj != null) { - long delay = jwxyz_obj.nativeRender(); - // java.util.Timer doesn't seem to like to re-use TimerTasks, so - // there's a slow object churn here: one TimerTask per frame. - timer.schedule(new RenderTask(), delay / 1000); - } - } catch (RuntimeException e) { - except (e); - } - } - - public void onSurfaceChanged(GL10 gl, int w, int h) { - try { - if (jwxyz_obj == null) - jwxyz_obj = new jwxyz (hack, app, screenshot, w, h); - - double r = 0; - - Display d = glview.getDisplay(); - - if (d != null) { - switch (d.getRotation()) { - case Surface.ROTATION_90: r = 90; break; - case Surface.ROTATION_180: r = 180; break; - case Surface.ROTATION_270: r = 270; break; - } - } - - jwxyz_obj.nativeResize (w, h, r); - - glview.requestRender(); - - } catch (RuntimeException e) { - except (e); - } - } - - public void onSurfaceCreated (GL10 gl, EGLConfig config) { - try { - LOG ("onSurfaceCreated %s / %s / %s", - gl.glGetString (GL10.GL_VENDOR), - gl.glGetString (GL10.GL_RENDERER), - gl.glGetString (GL10.GL_VERSION)); - - if (!initTried) { - initTried = true; - } else { - if (jwxyz_obj != null) { - jwxyz_obj.nativeDone(); - jwxyz_obj = null; - } - } - } catch (RuntimeException e) { - except (e); - } - } - - public void release() { - try { - if (jwxyz_obj != null) { - jwxyz_obj.nativeDone(); - jwxyz_obj = null; - } - } catch (RuntimeException e) { - except (e); - } - } - - public void sendButtonEvent (int x, int y, boolean down) { - try { - jwxyz_obj.sendButtonEvent (x, y, down); - } catch (RuntimeException e) { - except (e); - } - } - - public void sendMotionEvent (int x, int y) { - try { - jwxyz_obj.sendMotionEvent (x, y); - } catch (RuntimeException e) { - except (e); - } - } - - public void sendKeyEvent (KeyEvent event) { - try { - jwxyz_obj.sendKeyEvent (event); - } catch (RuntimeException e) { - except (e); - } - } - - - static - { - System.loadLibrary ("xscreensaver"); - } -} diff --git a/android/project/settings.gradle b/android/settings.gradle similarity index 100% rename from android/project/settings.gradle rename to android/settings.gradle diff --git a/android/xscreensaver/.idea/.name b/android/xscreensaver/.idea/.name new file mode 100644 index 00000000..1fd74d19 --- /dev/null +++ b/android/xscreensaver/.idea/.name @@ -0,0 +1 @@ +android \ No newline at end of file diff --git a/android/project/xscreensaver/.idea/compiler.xml b/android/xscreensaver/.idea/compiler.xml similarity index 100% rename from android/project/xscreensaver/.idea/compiler.xml rename to android/xscreensaver/.idea/compiler.xml diff --git a/android/project/xscreensaver/.idea/gradle.xml b/android/xscreensaver/.idea/gradle.xml similarity index 100% rename from android/project/xscreensaver/.idea/gradle.xml rename to android/xscreensaver/.idea/gradle.xml diff --git a/android/project/xscreensaver/.idea/misc.xml b/android/xscreensaver/.idea/misc.xml similarity index 69% rename from android/project/xscreensaver/.idea/misc.xml rename to android/xscreensaver/.idea/misc.xml index cc15a254..a6ba7e0d 100644 --- a/android/project/xscreensaver/.idea/misc.xml +++ b/android/xscreensaver/.idea/misc.xml @@ -10,5 +10,10 @@ - + + + + + \ No newline at end of file diff --git a/android/project/xscreensaver/.idea/modules.xml b/android/xscreensaver/.idea/modules.xml similarity index 79% rename from android/project/xscreensaver/.idea/modules.xml rename to android/xscreensaver/.idea/modules.xml index f3179276..33191fe7 100644 --- a/android/project/xscreensaver/.idea/modules.xml +++ b/android/xscreensaver/.idea/modules.xml @@ -2,7 +2,7 @@ - + diff --git a/android/xscreensaver/.idea/runConfigurations.xml b/android/xscreensaver/.idea/runConfigurations.xml new file mode 100644 index 00000000..7f68460d --- /dev/null +++ b/android/xscreensaver/.idea/runConfigurations.xml @@ -0,0 +1,12 @@ + + + + + + \ No newline at end of file diff --git a/android/project/xscreensaver/.idea/workspace.xml b/android/xscreensaver/.idea/workspace.xml similarity index 86% rename from android/project/xscreensaver/.idea/workspace.xml rename to android/xscreensaver/.idea/workspace.xml index 516bf62b..0d78d0cd 100644 --- a/android/project/xscreensaver/.idea/workspace.xml +++ b/android/xscreensaver/.idea/workspace.xml @@ -11,7 +11,6 @@ - @@ -21,16 +20,33 @@ + + + + + + + + + - @@ -1617,8 +1582,33 @@ + + + + + + + + + + - - - - - - - - - - + - - - - - - - - - - - - - - + + + + + + - - + + - + + - - - - + + + + + + + - + + + + + + + + + diff --git a/android/xscreensaver/assets/fonts/OCRAStd.otf b/android/xscreensaver/assets/fonts/OCRAStd.otf new file mode 120000 index 00000000..62593454 --- /dev/null +++ b/android/xscreensaver/assets/fonts/OCRAStd.otf @@ -0,0 +1 @@ +../../../../OSX/OCRAStd.otf \ No newline at end of file diff --git a/android/xscreensaver/assets/fonts/PxPlus_IBM_VGA8.ttf b/android/xscreensaver/assets/fonts/PxPlus_IBM_VGA8.ttf new file mode 120000 index 00000000..184d6546 --- /dev/null +++ b/android/xscreensaver/assets/fonts/PxPlus_IBM_VGA8.ttf @@ -0,0 +1 @@ +../../../../OSX/PxPlus_IBM_VGA8.ttf \ No newline at end of file diff --git a/android/xscreensaver/assets/fonts/YearlReg.ttf b/android/xscreensaver/assets/fonts/YearlReg.ttf new file mode 120000 index 00000000..8977be48 --- /dev/null +++ b/android/xscreensaver/assets/fonts/YearlReg.ttf @@ -0,0 +1 @@ +../../../../OSX/YearlReg.ttf \ No newline at end of file diff --git a/android/project/xscreensaver/build.gradle b/android/xscreensaver/build.gradle similarity index 85% rename from android/project/xscreensaver/build.gradle rename to android/xscreensaver/build.gradle index c0f9f100..6d1151ff 100644 --- a/android/project/xscreensaver/build.gradle +++ b/android/xscreensaver/build.gradle @@ -53,11 +53,11 @@ android { // generate files early in the process task perlBuild(type: Exec) { commandLine 'sh', '-c', - 'cd ../..; ../hacks/check-configs.pl --build-android $ANDROID_HACKS' + 'cd ..; ../hacks/check-configs.pl --build-android $ANDROID_HACKS' } task perlClean(type: Delete) { - delete('../../gen') + delete('../gen') delete('res/values') delete('res/xml') delete('src/org/jwz/xscreensaver/gen') @@ -72,27 +72,16 @@ android { task downloadNeededDrawables(type: Exec) { commandLine 'sh', '-c', - 'cd ../../ ; \ + 'cd ../ ; \ for f in $ANDROID_HACKS; do \ f=`echo "$f" | sed s/rd-bomb/rdbomb/` ; \ - make -s project/xscreensaver/res/drawable/$f.png ; \ + make -s xscreensaver/res/drawable/$f.png ; \ done' } preBuild.dependsOn downloadNeededDrawables preBuild.dependsOn perlBuild - task config_h(type: Exec) { - commandLine 'sh', '-c', - 'if [ ! -s ../../../config.h ]; then \ - echo "" >&2 ; echo "" >&2 ; \ - echo "config.h does not exist. cd .. and run ./configure" >&2 ; \ - echo "" >&2 ; \ - exit 1 ; \ - fi' - } - preBuild.dependsOn config_h - clean.dependsOn perlClean clean.dependsOn objlibClean diff --git a/android/project/xscreensaver/build.xml b/android/xscreensaver/build.xml similarity index 100% rename from android/project/xscreensaver/build.xml rename to android/xscreensaver/build.xml diff --git a/android/project/xscreensaver/gradle/wrapper/gradle-wrapper.jar b/android/xscreensaver/gradle/wrapper/gradle-wrapper.jar similarity index 100% rename from android/project/xscreensaver/gradle/wrapper/gradle-wrapper.jar rename to android/xscreensaver/gradle/wrapper/gradle-wrapper.jar diff --git a/android/project/xscreensaver/gradle/wrapper/gradle-wrapper.properties b/android/xscreensaver/gradle/wrapper/gradle-wrapper.properties similarity index 79% rename from android/project/xscreensaver/gradle/wrapper/gradle-wrapper.properties rename to android/xscreensaver/gradle/wrapper/gradle-wrapper.properties index 04e285f3..c1770216 100644 --- a/android/project/xscreensaver/gradle/wrapper/gradle-wrapper.properties +++ b/android/xscreensaver/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ -#Mon Dec 28 10:00:20 PST 2015 +#Tue Oct 17 12:24:22 PDT 2017 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-2.14.1-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-3.3-all.zip diff --git a/android/project/xscreensaver/gradlew b/android/xscreensaver/gradlew similarity index 100% rename from android/project/xscreensaver/gradlew rename to android/xscreensaver/gradlew diff --git a/android/project/xscreensaver/gradlew.bat b/android/xscreensaver/gradlew.bat similarity index 100% rename from android/project/xscreensaver/gradlew.bat rename to android/xscreensaver/gradlew.bat diff --git a/android/project/xscreensaver/jni/Android.mk b/android/xscreensaver/jni/Android.mk similarity index 68% rename from android/project/xscreensaver/jni/Android.mk rename to android/xscreensaver/jni/Android.mk index 9f545400..53ce1f96 100644 --- a/android/project/xscreensaver/jni/Android.mk +++ b/android/xscreensaver/jni/Android.mk @@ -1,23 +1,43 @@ -LOCAL_PATH := $(call my-dir)/../../../.. +LOCAL_PATH := $(call my-dir)/../../.. + +# -Wnested-externs would also be here, but for Android unistd.h. +SHARED_CFLAGS = \ + -std=c99 \ + -Wall \ + -Wstrict-prototypes \ + -Wmissing-prototypes \ + -DSTANDALONE=1 \ + -DHAVE_ANDROID=1 \ + -DHAVE_GL=1 \ + -DHAVE_JWXYZ=1 \ + -DJWXYZ_GL=1 \ + -DJWXYZ_IMAGE=1 \ + -DHAVE_JWZGLES=1 \ + -DHAVE_XUTF8DRAWSTRING=1 \ + -DHAVE_GLBINDTEXTURE=1 \ + -DGL_VERSION_ES_CM_1_0 \ + -DHAVE_UNISTD_H=1 \ + -DHAVE_INTTYPES_H=1 \ + -DHAVE_UNAME=1 \ + -DHAVE_UTIL_H=1 \ + -DGETTIMEOFDAY_TWO_ARGS=1 \ + -DHAVE_ICMP=1 \ + -DHAVE_PTHREAD=1 \ + +SHARED_C_INCLUDES = \ + $(LOCAL_PATH) \ + $(LOCAL_PATH)/android \ + $(LOCAL_PATH)/utils \ + $(LOCAL_PATH)/jwxyz \ + $(LOCAL_PATH)/hacks \ + $(LOCAL_PATH)/hacks/glx \ include $(CLEAR_VARS) -LOCAL_MODULE := xscreensaver +LOCAL_MODULE := xscreensaver-gl -# The base framework files: LOCAL_SRC_FILES := \ android/screenhack-android.c \ - jwxyz/jwxyz-android.c \ - jwxyz/jwxyz-common.c \ - jwxyz/jwxyz-gl.c \ - jwxyz/jwxyz-timers.c \ - jwxyz/jwzgles.c \ - -# Utilities used by the hacks: -LOCAL_SRC_FILES += \ - hacks/analogtv.c \ - hacks/delaunay.c \ - hacks/fps.c \ hacks/glx/dropshadow.c \ hacks/glx/chessmodels.c \ hacks/glx/fps-gl.c \ @@ -33,45 +53,9 @@ LOCAL_SRC_FILES += \ hacks/glx/trackball.c \ hacks/glx/tube.c \ hacks/glx/xpm-ximage.c \ - hacks/xlockmore.c \ - hacks/xpm-pixmap.c \ - utils/async_netdb.c \ - utils/aligned_malloc.c \ - utils/colorbars.c \ - utils/colors.c \ - utils/erase.c \ - utils/grabclient.c \ - utils/hsv.c \ - utils/logo.c \ - utils/minixpm.c \ - utils/pow2.c \ - utils/resources.c \ - utils/spline.c \ - utils/textclient-mobile.c \ - utils/thread_util.c \ - 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: -LOCAL_SRC_FILES += $(shell \ - for f in $$ANDROID_HACKS ; do \ - if [ "$$f" = "companioncube" ]; then f="companion"; fi ; \ - if [ -f "../../../../hacks/$$f.c" ]; then \ - echo "hacks/$$f.c" ; \ - else \ - echo "hacks/glx/$$f.c" ; \ - fi ; \ - done ) # Some savers occupy more than one source file: LOCAL_SRC_FILES += \ - hacks/apple2-main.c \ - hacks/asm6502.c \ - hacks/pacman_ai.c \ - hacks/pacman_level.c \ hacks/glx/b_draw.c \ hacks/glx/b_lockglue.c \ hacks/glx/b_sphere.c \ @@ -131,37 +115,82 @@ LOCAL_SRC_FILES += \ hacks/glx/tunnel_draw.c \ hacks/glx/whale.c \ -LOCAL_LDLIBS := -lGLESv1_CM -ldl -llog -lEGL -latomic +# The source files of the currently active GL hacks: +LOCAL_SRC_FILES += $(shell \ + for f in $$ANDROID_HACKS ; do \ + if [ "$$f" = "companioncube" ]; then f="companion"; fi ; \ + if [ -f "../../../hacks/glx/$$f.c" ]; then \ + echo "hacks/glx/$$f.c" ; \ + fi ; \ + done ) -LOCAL_C_INCLUDES := \ - $(LOCAL_PATH) \ - $(LOCAL_PATH)/android \ - $(LOCAL_PATH)/utils \ - $(LOCAL_PATH)/jwxyz \ - $(LOCAL_PATH)/hacks \ - $(LOCAL_PATH)/hacks/glx \ +LOCAL_C_INCLUDES := $(SHARED_C_INCLUDES) +LOCAL_CFLAGS += $(SHARED_CFLAGS) -DUSE_GL -# -Wnested-externs would also be here, but for Android unistd.h. -LOCAL_CFLAGS += \ - -std=c99 \ - -Wall \ - -Wstrict-prototypes \ - -Wmissing-prototypes \ - -DSTANDALONE=1 \ - -DHAVE_ANDROID=1 \ - -DUSE_GL=1 \ - -DHAVE_JWXYZ=1 \ - -DJWXYZ_GL=1 \ - -DHAVE_JWZGLES=1 \ - -DHAVE_XUTF8DRAWSTRING=1 \ - -DHAVE_GLBINDTEXTURE=1 \ - -DGL_VERSION_ES_CM_1_0 \ - -DHAVE_UNISTD_H=1 \ - -DHAVE_INTTYPES_H=1 \ - -DHAVE_UNAME=1 \ - -DHAVE_UTIL_H=1 \ - -DGETTIMEOFDAY_TWO_ARGS=1 \ - -DHAVE_ICMP=1 \ - -DHAVE_PTHREAD=1 \ +include $(BUILD_STATIC_LIBRARY) + +############################################################################## + +include $(CLEAR_VARS) + +LOCAL_MODULE := xscreensaver + +LOCAL_STATIC_LIBRARIES := xscreensaver-gl + +# The base framework files: +LOCAL_SRC_FILES := \ + jwxyz/jwxyz-android.c \ + jwxyz/jwxyz-common.c \ + jwxyz/jwxyz-gl.c \ + jwxyz/jwxyz-image.c \ + jwxyz/jwxyz-timers.c \ + jwxyz/jwzgles.c \ + +# Utilities used by the hacks: +LOCAL_SRC_FILES += \ + hacks/analogtv.c \ + hacks/delaunay.c \ + hacks/fps.c \ + hacks/xlockmore.c \ + hacks/xpm-pixmap.c \ + utils/async_netdb.c \ + utils/aligned_malloc.c \ + utils/colorbars.c \ + utils/colors.c \ + utils/erase.c \ + utils/grabclient.c \ + utils/hsv.c \ + utils/logo.c \ + utils/minixpm.c \ + utils/pow2.c \ + utils/resources.c \ + utils/spline.c \ + utils/textclient-mobile.c \ + utils/thread_util.c \ + utils/usleep.c \ + utils/utf8wc.c \ + utils/xft.c \ + utils/xshm.c \ + utils/yarandom.c \ + +# The source files of the currently active Xlib hacks: +LOCAL_SRC_FILES += $(shell \ + for f in $$ANDROID_HACKS ; do \ + if [ -f "../../../hacks/$$f.c" ]; then \ + echo "hacks/$$f.c" ; \ + fi ; \ + done ) + +# Some savers occupy more than one source file: +LOCAL_SRC_FILES += \ + hacks/apple2-main.c \ + hacks/asm6502.c \ + hacks/pacman_ai.c \ + hacks/pacman_level.c \ + +LOCAL_LDLIBS := -lGLESv1_CM -ldl -llog -lEGL -latomic -landroid + +LOCAL_C_INCLUDES := $(SHARED_C_INCLUDES) +LOCAL_CFLAGS += $(SHARED_CFLAGS) include $(BUILD_SHARED_LIBRARY) diff --git a/android/project/xscreensaver/jni/Application.mk b/android/xscreensaver/jni/Application.mk similarity index 100% rename from android/project/xscreensaver/jni/Application.mk rename to android/xscreensaver/jni/Application.mk diff --git a/android/project/xscreensaver/local.properties b/android/xscreensaver/local.properties similarity index 100% rename from android/project/xscreensaver/local.properties rename to android/xscreensaver/local.properties diff --git a/android/project/xscreensaver/project.properties b/android/xscreensaver/project.properties similarity index 100% rename from android/project/xscreensaver/project.properties rename to android/xscreensaver/project.properties diff --git a/android/project/xscreensaver/res/drawable-ldpi/icon.png b/android/xscreensaver/res/drawable-ldpi/icon.png similarity index 100% rename from android/project/xscreensaver/res/drawable-ldpi/icon.png rename to android/xscreensaver/res/drawable-ldpi/icon.png diff --git a/android/project/xscreensaver/res/drawable-mdpi/icon.png b/android/xscreensaver/res/drawable-mdpi/icon.png similarity index 100% rename from android/project/xscreensaver/res/drawable-mdpi/icon.png rename to android/xscreensaver/res/drawable-mdpi/icon.png diff --git a/android/project/xscreensaver/res/drawable/thumbnail.png b/android/xscreensaver/res/drawable/thumbnail.png similarity index 100% rename from android/project/xscreensaver/res/drawable/thumbnail.png rename to android/xscreensaver/res/drawable/thumbnail.png diff --git a/android/project/xscreensaver/res/layout-land/activity_xscreensaver.xml b/android/xscreensaver/res/layout-land/activity_xscreensaver.xml similarity index 100% rename from android/project/xscreensaver/res/layout-land/activity_xscreensaver.xml rename to android/xscreensaver/res/layout-land/activity_xscreensaver.xml diff --git a/android/xscreensaver/res/layout/activity_tv_xscreensaver.xml b/android/xscreensaver/res/layout/activity_tv_xscreensaver.xml new file mode 100644 index 00000000..a6f9c844 --- /dev/null +++ b/android/xscreensaver/res/layout/activity_tv_xscreensaver.xml @@ -0,0 +1,41 @@ + + + + + + + + + +