From f91ffb17e2efd14950b2e55d704dd5299b30eed4 Mon Sep 17 00:00:00 2001 From: Zygo Blaxell Date: Sun, 11 Dec 2022 19:56:08 -0500 Subject: [PATCH] From https://www.jwz.org/xscreensaver/xscreensaver-6.06.tar.gz -rw-rw-r-- 1 zblaxell zblaxell 26334374 Dec 11 18:12 xscreensaver-6.06.tar.gz fa7e1da709972c640a913d42039ba8609ed6218e xscreensaver-6.06.tar.gz --- Makefile.in | 2 + OSX/Makefile | 6 +- OSX/Randomizer.m | 6 +- OSX/Randomizer.plist | 10 +- OSX/SaverRunner.m | 27 +- OSX/SaverRunner.plist | 10 +- OSX/Updater.plist | 10 +- OSX/XScreenSaver.plist | 10 +- OSX/XScreenSaverConfigSheet.m | 10 +- OSX/XScreenSaverView.m | 24 +- OSX/bindist.rtf | 4 +- OSX/grabclient-ios.m | 2 +- OSX/grabclient-osx.m | 2 +- OSX/iSaverRunner.plist | 10 +- OSX/installer.rtf | 2 +- OSX/installer.sh | 8 +- OSX/installer.xml | 5 +- OSX/ios-function-table.m | 6 +- OSX/seticon.pl | 44 +- OSX/tvSaverRunner.plist | 10 +- OSX/updates.xml | 36 +- OSX/xscreensaver.xcconfig | 11 - OSX/xscreensaver.xcodeproj/project.pbxproj | 523 +- .../xcschemes/Abstractile.xcscheme | 2 +- .../xcschemes/All Savers (OpenGL).xcscheme | 2 +- .../xcschemes/All Savers (XLockmore).xcscheme | 2 +- .../All Savers (XScreenSaver).xcscheme | 2 +- .../xcschemes/All Savers.xcscheme | 2 +- .../xcshareddata/xcschemes/Anemone.xcscheme | 2 +- .../xcschemes/Anemotaxis.xcscheme | 2 +- .../xcshareddata/xcschemes/Ant.xcscheme | 2 +- .../xcschemes/AntInspect.xcscheme | 2 +- .../xcshareddata/xcschemes/AntMaze.xcscheme | 2 +- .../xcschemes/AntSpotlight.xcscheme | 2 +- .../xcschemes/Apollonian.xcscheme | 2 +- .../xcschemes/Apple2-OSX.xcscheme | 2 +- .../xcschemes/Apple2-iOS.xcscheme | 2 +- .../xcshareddata/xcschemes/Apple2.xcscheme | 2 +- .../xcshareddata/xcschemes/Atlantis.xcscheme | 2 +- .../xcschemes/Attraction.xcscheme | 2 +- .../xcshareddata/xcschemes/Atunnel.xcscheme | 2 +- .../xcshareddata/xcschemes/BSOD.xcscheme | 2 +- .../xcshareddata/xcschemes/Barcode.xcscheme | 2 +- .../xcshareddata/xcschemes/Beats.xcscheme | 2 +- .../xcschemes/BinaryHorizon.xcscheme | 2 +- .../xcschemes/BinaryRing.xcscheme | 2 +- .../xcshareddata/xcschemes/Blaster.xcscheme | 2 +- .../xcshareddata/xcschemes/BlinkBox.xcscheme | 2 +- .../xcshareddata/xcschemes/BlitSpin.xcscheme | 2 +- .../xcshareddata/xcschemes/BlockTube.xcscheme | 2 +- .../xcshareddata/xcschemes/Boing.xcscheme | 2 +- .../xcshareddata/xcschemes/Bouboule.xcscheme | 2 +- .../xcschemes/BouncingCow.xcscheme | 2 +- .../xcshareddata/xcschemes/BoxFit.xcscheme | 2 +- .../xcshareddata/xcschemes/Boxed.xcscheme | 2 +- .../xcshareddata/xcschemes/Braid.xcscheme | 2 +- .../xcshareddata/xcschemes/Bubble3D.xcscheme | 2 +- .../xcshareddata/xcschemes/Bubbles.xcscheme | 2 +- .../xcshareddata/xcschemes/Bumps.xcscheme | 2 +- .../xcshareddata/xcschemes/CCurve.xcscheme | 2 +- .../xcshareddata/xcschemes/COVID19.xcscheme | 2 +- .../xcshareddata/xcschemes/CWaves.xcscheme | 2 +- .../xcshareddata/xcschemes/Cage.xcscheme | 2 +- .../xcshareddata/xcschemes/Carousel.xcscheme | 2 +- .../xcshareddata/xcschemes/Celtic.xcscheme | 2 +- .../xcschemes/ChompyTower.xcscheme | 2 +- .../xcshareddata/xcschemes/Circuit.xcscheme | 2 +- .../xcshareddata/xcschemes/Cityflow.xcscheme | 2 +- .../xcshareddata/xcschemes/CloudLife.xcscheme | 2 +- .../xcschemes/CompanionCube.xcscheme | 2 +- .../xcshareddata/xcschemes/Compass.xcscheme | 2 +- .../xcshareddata/xcschemes/Coral.xcscheme | 2 +- .../xcshareddata/xcschemes/Crackberg.xcscheme | 2 +- .../xcshareddata/xcschemes/Critical.xcscheme | 2 +- .../xcshareddata/xcschemes/Crumbler.xcscheme | 2 +- .../xcshareddata/xcschemes/Crystal.xcscheme | 2 +- .../xcshareddata/xcschemes/Cube21.xcscheme | 2 +- .../xcshareddata/xcschemes/CubeStack.xcscheme | 2 +- .../xcshareddata/xcschemes/CubeStorm.xcscheme | 2 +- .../xcshareddata/xcschemes/CubeTwist.xcscheme | 2 +- .../xcshareddata/xcschemes/Cubenetic.xcscheme | 2 +- .../xcshareddata/xcschemes/CubicGrid.xcscheme | 2 +- .../xcshareddata/xcschemes/Cynosure.xcscheme | 2 +- .../xcshareddata/xcschemes/DNAlogo.xcscheme | 2 +- .../xcschemes/DangerBall.xcscheme | 2 +- .../xcschemes/DecayScreen.xcscheme | 2 +- .../xcshareddata/xcschemes/Deco.xcscheme | 2 +- .../xcshareddata/xcschemes/DeepStars.xcscheme | 2 +- .../xcshareddata/xcschemes/Deluxe.xcscheme | 2 +- .../xcshareddata/xcschemes/Demon.xcscheme | 2 +- .../xcshareddata/xcschemes/Discoball.xcscheme | 2 +- .../xcshareddata/xcschemes/Discrete.xcscheme | 2 +- .../xcshareddata/xcschemes/Distort.xcscheme | 2 +- .../xcshareddata/xcschemes/Drift.xcscheme | 2 +- .../xcschemes/DymaxionMap.xcscheme | 2 +- .../xcshareddata/xcschemes/Endgame.xcscheme | 2 +- .../xcschemes/EnergyStream.xcscheme | 2 +- .../xcshareddata/xcschemes/Engine.xcscheme | 2 +- .../xcshareddata/xcschemes/Epicycle.xcscheme | 2 +- .../xcshareddata/xcschemes/Eruption.xcscheme | 2 +- .../xcshareddata/xcschemes/Esper.xcscheme | 2 +- .../xcschemes/EtruscanVenus.xcscheme | 2 +- .../xcshareddata/xcschemes/Euler2D.xcscheme | 2 +- .../xcshareddata/xcschemes/Extrusion.xcscheme | 2 +- .../xcshareddata/xcschemes/FadePlot.xcscheme | 2 +- .../xcshareddata/xcschemes/Fiberlamp.xcscheme | 2 +- .../xcschemes/FilmLeader.xcscheme | 2 +- .../xcshareddata/xcschemes/Fireworkx.xcscheme | 2 +- .../xcshareddata/xcschemes/Flag.xcscheme | 2 +- .../xcshareddata/xcschemes/Flame.xcscheme | 2 +- .../xcshareddata/xcschemes/FlipFlop.xcscheme | 2 +- .../xcschemes/FlipScreen3D.xcscheme | 2 +- .../xcshareddata/xcschemes/FlipText.xcscheme | 2 +- .../xcshareddata/xcschemes/Flow.xcscheme | 2 +- .../xcschemes/FluidBalls.xcscheme | 2 +- .../xcschemes/FlyingToasters.xcscheme | 2 +- .../xcshareddata/xcschemes/FontGlide.xcscheme | 2 +- .../xcshareddata/xcschemes/Forest.xcscheme | 2 +- .../xcschemes/FuzzyFlakes.xcscheme | 2 +- .../xcshareddata/xcschemes/GFlux.xcscheme | 2 +- .../xcshareddata/xcschemes/GLBlur.xcscheme | 2 +- .../xcshareddata/xcschemes/GLCells.xcscheme | 2 +- .../xcschemes/GLForestFire.xcscheme | 2 +- .../xcshareddata/xcschemes/GLHanoi.xcscheme | 2 +- .../xcshareddata/xcschemes/GLKnots.xcscheme | 2 +- .../xcshareddata/xcschemes/GLMatrix.xcscheme | 2 +- .../xcshareddata/xcschemes/GLPlanet.xcscheme | 2 +- .../xcshareddata/xcschemes/GLSchool.xcscheme | 2 +- .../xcschemes/GLSlideshow.xcscheme | 2 +- .../xcshareddata/xcschemes/GLSnake.xcscheme | 2 +- .../xcshareddata/xcschemes/GLText.xcscheme | 2 +- .../xcshareddata/xcschemes/Galaxy.xcscheme | 2 +- .../xcshareddata/xcschemes/Gears.xcscheme | 2 +- .../xcshareddata/xcschemes/Geodesic.xcscheme | 2 +- .../xcschemes/GeodesicGears.xcscheme | 2 +- .../xcshareddata/xcschemes/Gibson.xcscheme | 2 +- .../xcschemes/Gleidescope.xcscheme | 2 +- .../xcshareddata/xcschemes/GlitchPEG.xcscheme | 2 +- .../xcshareddata/xcschemes/Goop.xcscheme | 2 +- .../xcshareddata/xcschemes/Grav.xcscheme | 2 +- .../xcschemes/GravityWell.xcscheme | 2 +- .../xcshareddata/xcschemes/Greynetic.xcscheme | 2 +- .../xcshareddata/xcschemes/Halftone.xcscheme | 2 +- .../xcshareddata/xcschemes/Halo.xcscheme | 2 +- .../xcshareddata/xcschemes/Handsy.xcscheme | 2 +- .../xcshareddata/xcschemes/Headroom.xcscheme | 2 +- .../xcshareddata/xcschemes/Helix.xcscheme | 2 +- .../xcshareddata/xcschemes/Hexadrop.xcscheme | 2 +- .../xcshareddata/xcschemes/Hexstrut.xcscheme | 2 +- .../xcshareddata/xcschemes/Hextrail.xcscheme | 85 + .../xcshareddata/xcschemes/Hilbert.xcscheme | 2 +- .../xcshareddata/xcschemes/Hopalong.xcscheme | 2 +- .../xcshareddata/xcschemes/Hydrostat.xcscheme | 2 +- .../xcshareddata/xcschemes/HyperBall.xcscheme | 2 +- .../xcshareddata/xcschemes/HyperCube.xcscheme | 2 +- .../xcschemes/Hypertorus.xcscheme | 2 +- .../xcschemes/Hypnowheel.xcscheme | 2 +- .../xcshareddata/xcschemes/IFS.xcscheme | 2 +- .../xcshareddata/xcschemes/IMSMap.xcscheme | 2 +- .../xcschemes/Interaggregate.xcscheme | 2 +- .../xcschemes/Interference.xcscheme | 2 +- .../xcschemes/Intermomentary.xcscheme | 2 +- .../xcschemes/JigglyPuff.xcscheme | 2 +- .../xcshareddata/xcschemes/Jigsaw.xcscheme | 2 +- .../xcshareddata/xcschemes/Juggle.xcscheme | 2 +- .../xcshareddata/xcschemes/Juggler3D.xcscheme | 2 +- .../xcshareddata/xcschemes/Julia.xcscheme | 2 +- .../xcschemes/Kaleidescope.xcscheme | 2 +- .../xcschemes/Kaleidocycle.xcscheme | 2 +- .../xcshareddata/xcschemes/Klein.xcscheme | 2 +- .../xcshareddata/xcschemes/Kumppa.xcscheme | 2 +- .../xcshareddata/xcschemes/LCDscrub.xcscheme | 2 +- .../xcshareddata/xcschemes/LMorph.xcscheme | 2 +- .../xcshareddata/xcschemes/Lament.xcscheme | 2 +- .../xcshareddata/xcschemes/Laser.xcscheme | 2 +- .../xcshareddata/xcschemes/Lavalite.xcscheme | 2 +- .../xcshareddata/xcschemes/Lightning.xcscheme | 2 +- .../xcshareddata/xcschemes/Lisa.xcscheme | 2 +- .../xcshareddata/xcschemes/Lissie.xcscheme | 2 +- .../xcshareddata/xcschemes/Lockward.xcscheme | 2 +- .../xcshareddata/xcschemes/Loop.xcscheme | 2 +- .../xcschemes/MapScroller.xcscheme | 2 +- .../xcshareddata/xcschemes/Marbling.xcscheme | 2 +- .../xcshareddata/xcschemes/Maze.xcscheme | 2 +- .../xcshareddata/xcschemes/Maze3D.xcscheme | 2 +- .../xcschemes/MemScroller.xcscheme | 2 +- .../xcshareddata/xcschemes/Menger.xcscheme | 2 +- .../xcshareddata/xcschemes/MetaBalls.xcscheme | 2 +- .../xcschemes/MirrorBlob.xcscheme | 2 +- .../xcshareddata/xcschemes/Moebius.xcscheme | 2 +- .../xcschemes/MoebiusGears.xcscheme | 2 +- .../xcshareddata/xcschemes/Moire.xcscheme | 2 +- .../xcshareddata/xcschemes/Moire2.xcscheme | 2 +- .../xcshareddata/xcschemes/Molecule.xcscheme | 2 +- .../xcshareddata/xcschemes/Morph3D.xcscheme | 2 +- .../xcshareddata/xcschemes/Mountain.xcscheme | 2 +- .../xcshareddata/xcschemes/Munch.xcscheme | 2 +- .../xcshareddata/xcschemes/Nakagin.xcscheme | 2 +- .../xcshareddata/xcschemes/NerveRot.xcscheme | 2 +- .../xcshareddata/xcschemes/Noof.xcscheme | 2 +- .../xcshareddata/xcschemes/NoseGuy.xcscheme | 2 +- .../xcshareddata/xcschemes/Obsolete.xcscheme | 2 +- .../xcshareddata/xcschemes/Pacman.xcscheme | 2 +- .../xcshareddata/xcschemes/Pedal.xcscheme | 2 +- .../xcshareddata/xcschemes/Peepers.xcscheme | 2 +- .../xcshareddata/xcschemes/Penetrate.xcscheme | 2 +- .../xcshareddata/xcschemes/Penrose.xcscheme | 2 +- .../xcshareddata/xcschemes/Petri.xcscheme | 2 +- .../xcschemes/Phosphor-OSX.xcscheme | 2 +- .../xcschemes/Phosphor-iOS.xcscheme | 2 +- .../xcshareddata/xcschemes/Phosphor.xcscheme | 2 +- .../xcshareddata/xcschemes/Photopile.xcscheme | 2 +- .../xcshareddata/xcschemes/Piecewise.xcscheme | 2 +- .../xcshareddata/xcschemes/Pinion.xcscheme | 2 +- .../xcshareddata/xcschemes/Pipes.xcscheme | 2 +- .../xcshareddata/xcschemes/Polyhedra.xcscheme | 2 +- .../xcschemes/Polyominoes.xcscheme | 2 +- .../xcshareddata/xcschemes/Polytopes.xcscheme | 2 +- .../xcshareddata/xcschemes/Pong.xcscheme | 2 +- .../xcschemes/PopSquares.xcscheme | 2 +- .../xcschemes/ProjectivePlane.xcscheme | 2 +- .../xcschemes/Providence.xcscheme | 2 +- .../xcshareddata/xcschemes/Pulsar.xcscheme | 2 +- .../xcshareddata/xcschemes/Pyro.xcscheme | 2 +- .../xcshareddata/xcschemes/Qix.xcscheme | 2 +- .../xcschemes/QuasiCrystal.xcscheme | 2 +- .../xcshareddata/xcschemes/Queens.xcscheme | 2 +- .../xcshareddata/xcschemes/RDbomb.xcscheme | 2 +- .../xcschemes/RandomXScreenSaver.xcscheme | 2 +- .../xcshareddata/xcschemes/RaverHoop.xcscheme | 2 +- .../xcschemes/RazzleDazzle.xcscheme | 2 +- .../xcshareddata/xcschemes/Ripples.xcscheme | 2 +- .../xcshareddata/xcschemes/Rocks.xcscheme | 2 +- .../xcshareddata/xcschemes/RomanBoy.xcscheme | 2 +- .../xcshareddata/xcschemes/Rorschach.xcscheme | 2 +- .../xcshareddata/xcschemes/RotZoomer.xcscheme | 2 +- .../xcshareddata/xcschemes/Rotor.xcscheme | 2 +- .../xcshareddata/xcschemes/Rubik.xcscheme | 2 +- .../xcschemes/RubikBlocks.xcscheme | 2 +- .../xcshareddata/xcschemes/SBalls.xcscheme | 2 +- .../xcschemes/SaverTester.xcscheme | 2 +- .../xcshareddata/xcschemes/Scooter.xcscheme | 2 +- .../xcshareddata/xcschemes/ShadeBobs.xcscheme | 2 +- .../xcschemes/Sierpinski.xcscheme | 2 +- .../xcschemes/Sierpinski3D.xcscheme | 2 +- .../xcschemes/SkyTentacles.xcscheme | 2 +- .../xcschemes/SlideScreen.xcscheme | 2 +- .../xcshareddata/xcschemes/Slip.xcscheme | 2 +- .../xcshareddata/xcschemes/Sonar.xcscheme | 2 +- .../xcshareddata/xcschemes/SpeedMine.xcscheme | 2 +- .../xcshareddata/xcschemes/Sphere.xcscheme | 2 +- .../xcschemes/SphereEversion.xcscheme | 2 +- .../xcschemes/Spheremonics.xcscheme | 2 +- .../xcshareddata/xcschemes/Spiral.xcscheme | 2 +- .../xcshareddata/xcschemes/SplitFlap.xcscheme | 4 +- .../xcshareddata/xcschemes/Splodesic.xcscheme | 2 +- .../xcshareddata/xcschemes/Spotlight.xcscheme | 2 +- .../xcschemes/Sproingies.xcscheme | 2 +- .../xcshareddata/xcschemes/Squiral.xcscheme | 2 +- .../xcschemes/Squirtorus.xcscheme | 2 +- .../xcshareddata/xcschemes/Stairs.xcscheme | 2 +- .../xcshareddata/xcschemes/StarWars.xcscheme | 2 +- .../xcshareddata/xcschemes/Starfish.xcscheme | 2 +- .../xcschemes/StonerView.xcscheme | 2 +- .../xcshareddata/xcschemes/Strange.xcscheme | 2 +- .../xcshareddata/xcschemes/Substrate.xcscheme | 2 +- .../xcschemes/Superquadrics.xcscheme | 2 +- .../xcshareddata/xcschemes/Surfaces.xcscheme | 2 +- .../xcshareddata/xcschemes/Swirl.xcscheme | 2 +- .../xcshareddata/xcschemes/T3D.xcscheme | 2 +- .../xcshareddata/xcschemes/Tangram.xcscheme | 2 +- .../xcschemes/Tessellimage.xcscheme | 2 +- .../xcschemes/TestX11-iOS.xcscheme | 2 +- .../xcshareddata/xcschemes/TestX11.xcscheme | 2 +- .../xcshareddata/xcschemes/Thornbird.xcscheme | 2 +- .../xcschemes/TimeTunnel.xcscheme | 2 +- .../xcshareddata/xcschemes/TopBlock.xcscheme | 2 +- .../xcshareddata/xcschemes/Triangle.xcscheme | 2 +- .../xcshareddata/xcschemes/TronBit.xcscheme | 2 +- .../xcshareddata/xcschemes/Truchet.xcscheme | 2 +- .../xcshareddata/xcschemes/Twang.xcscheme | 2 +- .../xcshareddata/xcschemes/Unicrud.xcscheme | 2 +- .../xcschemes/UnknownPleasures.xcscheme | 2 +- .../xcshareddata/xcschemes/VFeedback.xcscheme | 2 +- .../xcschemes/Vermiculate.xcscheme | 2 +- .../xcshareddata/xcschemes/Vigilance.xcscheme | 2 +- .../xcshareddata/xcschemes/Vines.xcscheme | 2 +- .../xcshareddata/xcschemes/Voronoi.xcscheme | 2 +- .../xcshareddata/xcschemes/Wander.xcscheme | 2 +- .../xcschemes/WebCollage.xcscheme | 2 +- .../xcschemes/WhirlWindWarp.xcscheme | 2 +- .../xcshareddata/xcschemes/Whirlygig.xcscheme | 2 +- .../xcschemes/WindupRobot.xcscheme | 2 +- .../xcshareddata/xcschemes/Worm.xcscheme | 2 +- .../xcshareddata/xcschemes/Wormhole.xcscheme | 2 +- .../xcshareddata/xcschemes/XAnalogTV.xcscheme | 2 +- .../xcshareddata/xcschemes/XFlame.xcscheme | 2 +- .../xcshareddata/xcschemes/XJack.xcscheme | 2 +- .../xcshareddata/xcschemes/XLyap.xcscheme | 2 +- .../xcshareddata/xcschemes/XMatrix.xcscheme | 2 +- .../xcshareddata/xcschemes/XRaySwarm.xcscheme | 2 +- .../xcschemes/XScreenSaver-iOS.xcscheme | 2 +- .../xcschemes/XScreenSaver-tvOS.xcscheme | 2 +- .../xcschemes/XScreenSaverUpdater.xcscheme | 2 +- .../xcschemes/XSpirograph.xcscheme | 2 +- .../xcshareddata/xcschemes/Zoom.xcscheme | 2 +- .../xcshareddata/xcschemes/enable_gc.xcscheme | 2 +- .../xcschemes/images_png_h.xcscheme | 2 +- .../xcshareddata/xcschemes/jwxyz.xcscheme | 2 +- .../xcshareddata/xcschemes/m6502.h.xcscheme | 2 +- .../xcshareddata/xcschemes/m6502.xcscheme | 2 +- .../xcschemes/molecules.h.xcscheme | 2 +- README | 11 + android/Makefile | 2 +- android/README | 3 + config.h.in | 3 - configure | 90 +- configure.ac | 34 +- driver/Makefile.in | 10 +- driver/XScreenSaver.ad.in | 503 +- driver/XScreenSaver_ad.h | 497 +- driver/demo-Gtk-conf.h | 2 + driver/demo-Gtk.c | 503 +- driver/demo.ui | 4017 ++- driver/fade.c | 2 +- driver/prefsw.c | 51 +- driver/subprocs.c | 15 +- driver/types.h | 2 +- driver/windows.c | 11 + driver/xscreensaver-auth.c | 7 + driver/xscreensaver-auth.man | 4 +- driver/xscreensaver-gfx.c | 7 + driver/xscreensaver-gfx.man | 3 +- driver/xscreensaver-settings.man | 27 +- driver/xscreensaver-systemd.c | 87 +- driver/xscreensaver-systemd.man | 10 +- driver/xscreensaver.c | 8 + driver/xscreensaver.man | 4 + hacks/Makefile.in | 337 +- hacks/abstractile.c | 3 + hacks/analogtv.c | 2 +- hacks/anemone.c | 6 + hacks/anemotaxis.c | 3 +- hacks/apollonian.c | 2 +- hacks/barcode.c | 12 +- hacks/blaster.c | 82 +- hacks/bouboule.c | 3 +- hacks/boxfit.c | 5 + hacks/bsod.c | 22 +- hacks/bumps.c | 10 +- hacks/check-configs.pl | 48 +- hacks/compass.c | 3 +- hacks/config/README | 4 +- hacks/config/bsod.xml | 2 +- hacks/config/coral.xml | 2 +- hacks/config/glitchpeg.xml | 2 +- hacks/config/hextrail.xml | 48 + hacks/config/mirrorblob.xml | 2 +- hacks/config/squiral.xml | 4 + hacks/config/thornbird.xml | 3 +- hacks/config/topblock.xml | 2 +- hacks/config/vidwhacker.xml | 13 +- hacks/config/webcollage.xml | 2 +- hacks/coral.c | 35 +- hacks/coral.man | 2 +- hacks/cynosure.c | 14 +- hacks/decayscreen.c | 10 +- hacks/deco.c | 5 +- hacks/deluxe.c | 3 +- hacks/discrete.c | 3 +- hacks/distort.c | 30 +- hacks/epicycle.c | 4 + hacks/eruption.c | 2 +- hacks/euler2d.c | 5 + hacks/fadeplot.c | 21 +- hacks/fiberlamp.c | 11 +- hacks/fireworkx.c | 2 +- hacks/flame.c | 14 +- hacks/flow.c | 10 +- hacks/fluidballs.c | 3 +- hacks/fonts/Makefile.in | 6 +- hacks/fuzzyflakes.c | 2 +- hacks/galaxy.c | 42 +- hacks/glitchpeg.c | 2 +- hacks/glitchpeg.man | 2 +- hacks/glx/Makefile.in | 460 +- hacks/glx/atlantis.c | 4 +- hacks/glx/b_draw.c | 4 + hacks/glx/cubicgrid.c | 7 +- hacks/glx/dnalogo.c | 4 +- hacks/glx/glplanet.c | 6 + hacks/glx/grab-ximage.c | 2 +- hacks/glx/handsy.c | 4 + hacks/glx/hexstrut.c | 3 - hacks/glx/hextrail.c | 784 + hacks/glx/hextrail.man | 79 + hacks/glx/mapscroller.pl | 32 +- hacks/glx/mirrorblob.c | 2 +- hacks/glx/molecule.c | 4 +- hacks/glx/photopile.c | 2 +- hacks/glx/sphereeversion-analytic.c | 4 + hacks/glx/topblock.c | 5 +- hacks/glx/vigilance.c | 4 + hacks/glx/winduprobot.c | 4 + hacks/grav.c | 13 +- hacks/halftone.c | 13 +- hacks/halo.c | 23 +- hacks/hopalong.c | 19 +- hacks/ifs.c | 23 +- hacks/interference.c | 3 +- hacks/intermomentary.c | 19 +- hacks/julia.c | 42 +- hacks/kaleidescope.c | 30 +- hacks/kumppa.c | 22 +- hacks/lisa.c | 6 +- hacks/loop.c | 7 +- hacks/marbling.c | 17 +- hacks/memscroller.c | 9 +- hacks/munch.c | 2 +- hacks/nerverot.c | 8 + hacks/noseguy.c | 2 +- hacks/penetrate.c | 52 +- hacks/penrose.c | 2 +- hacks/petri.c | 7 +- hacks/phosphor.c | 10 +- hacks/piecewise.c | 8 +- hacks/ripples.c | 5 - hacks/rocks.c | 4 +- hacks/rorschach.c | 15 +- hacks/rotor.c | 6 +- hacks/rotzoomer.c | 3 - hacks/scooter.c | 23 +- hacks/screenhack.c | 2 +- hacks/screenhackI.h | 16 +- hacks/sierpinski.c | 3 +- hacks/slidescreen.c | 14 +- hacks/spotlight.c | 32 +- hacks/squiral.c | 70 +- hacks/squiral.man | 9 +- hacks/strange.c | 10 +- hacks/swirl.c | 7 +- hacks/tessellimage.c | 3 +- hacks/thornbird.c | 33 +- hacks/twang.c | 9 +- hacks/vermiculate.c | 10 +- hacks/vidwhacker | 188 +- hacks/vidwhacker.man | 32 +- hacks/vines.c | 12 +- hacks/wander.c | 4 +- hacks/webcollage | 360 +- hacks/webcollage-helper-cocoa.m | 6 +- hacks/webcollage.man | 106 +- hacks/wormhole.c | 5 +- hacks/xflame.c | 2 +- hacks/ximage-loader.c | 2 +- hacks/xjack.c | 12 +- hacks/xlyap.c | 2 +- hacks/xmatrix.c | 46 +- hacks/xml2man.pl | 4 +- hacks/xrayswarm.c | 19 +- hacks/xscreensaver-getimage-file | 6 +- hacks/xscreensaver-getimage-video | 15 +- hacks/xscreensaver-getimage.c | 1184 +- hacks/xscreensaver-text | 6 +- hacks/xspirograph.c | 5 +- hacks/zoom.c | 46 +- jwxyz/jwxyz-android.c | 2 +- jwxyz/jwxyz-common.c | 15 +- jwxyz/jwxyz.m | 4 +- po/POTFILES.in | 5 +- po/be.po | 12213 ++++++--- po/da.po | 3277 +-- po/de.po | 3260 +-- po/el.po | 14344 +++++++--- po/es.po | 3217 +-- po/et.po | 2892 ++- po/fi.po | 2986 ++- po/fr.po | 3289 +-- po/hu.po | 3289 +-- po/it.po | 3004 ++- po/ja.po | 3459 +-- po/ko.po | 2969 ++- po/lt.po | 7324 ++++-- po/nb.po | 2963 ++- po/nl.po | 3354 +-- po/pl.po | 3025 ++- po/pt.po | 3225 +-- po/pt_BR.po | 3185 +-- po/ru.po | 3438 +-- po/sk.po | 2972 ++- po/sv.po | 3138 +-- po/tr.po | 21575 +++++++++------- po/uk.po | 12343 +++++++-- po/vi.po | 3102 ++- po/wa.po | 2908 ++- po/zh_CN.po | 3039 ++- po/zh_TW.po | 3022 ++- utils/Makefile.in | 34 +- utils/grabclient.c | 102 +- utils/{grabscreen.h => grabclient.h} | 42 +- utils/grabscreen.c | 924 - utils/screenshot.c | 328 + utils/screenshot.h | 34 + utils/version.h | 6 +- xscreensaver.spec | 2 +- 505 files changed, 92136 insertions(+), 58465 deletions(-) delete mode 100644 OSX/xscreensaver.xcconfig create mode 100644 OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Hextrail.xcscheme create mode 100644 hacks/config/hextrail.xml create mode 100644 hacks/glx/hextrail.c create mode 100644 hacks/glx/hextrail.man rename utils/{grabscreen.h => grabclient.h} (74%) delete mode 100644 utils/grabscreen.c create mode 100644 utils/screenshot.c create mode 100644 utils/screenshot.h diff --git a/Makefile.in b/Makefile.in index fa033cf9..b4a0af6c 100644 --- a/Makefile.in +++ b/Makefile.in @@ -476,6 +476,8 @@ cerebrum:: --include 'install-sh' \ --include 'bin2c' \ --include 'ad2c' \ + --include 'vidwhacker' \ + --include 'webcollage' \ --include '*/' \ --exclude '*' diff --git a/OSX/Makefile b/OSX/Makefile index 8e3140d2..6a05340f 100644 --- a/OSX/Makefile +++ b/OSX/Makefile @@ -215,8 +215,8 @@ test_sig:: BASE="xscreensaver-$$V" ; \ OUTDIR="../archive" ; \ DMG="$$OUTDIR/$$BASE.dmg" ; \ - SIG1=`sed -n 's/^.*dsaSignature="\(.*\)".*/\1/p' updates.xml` ; \ - SIG2=`sed -n 's/^.*edSignature="\(.*\)".*/\1/p' updates.xml` ; \ + SIG1=`sed -n 's/^.*dsaSignature="\(.*\)".*/\1/p' updates.xml | head -1` ; \ + SIG2=`sed -n 's/^.*edSignature="\(.*\)".*/\1/p' updates.xml | head -1` ; \ PUB1="sparkle_dsa_pub.pem" ; \ NN="t.$$$$" ; \ SIGB=/tmp/$$NN.sig ; \ @@ -412,7 +412,7 @@ _dmg:: # To set up notarization: # - Log in on https://appleid.apple.com/ # - Generate App-Specific Password, "altool-notarizer" -# - Keychain Access / New +# - Keychain Access / New Password Item... # - Name: "altool-notarizer", Account: "jwz@jwz.org", # Pass: the one you just generated. # diff --git a/OSX/Randomizer.m b/OSX/Randomizer.m index e055f737..25c21c66 100644 --- a/OSX/Randomizer.m +++ b/OSX/Randomizer.m @@ -1069,7 +1069,7 @@ catch_signal (int sig, void (*handler) (int)) self.minSize = frame.size; frame.size.height = 99999; self.maxSize = frame.size; - self.styleMask |= NSResizableWindowMask; + self.styleMask |= NSWindowStyleMaskResizable; // In a sane world, almost all of this would be in a .xib file. But after // I spent 4 hours unsuccessfully trying to figure out how to ctrl-drag @@ -1208,7 +1208,7 @@ catch_signal (int sig, void (*handler) (int)) mlab.editable = NO; mlab.bezeled = NO; mlab.drawsBackground = NO; - mlab.alignment = NSCenterTextAlignment; + mlab.alignment = NSTextAlignmentCenter; [mlab sizeToFit]; mlab.autoresizingMask = NSViewMinXMargin | NSViewMinYMargin; frame = mlab.frame; @@ -1638,7 +1638,7 @@ catch_signal (int sig, void (*handler) (int)) - (void) okAction:(NSObject *)arg { [prefs save:self]; - [NSApp endSheet:self returnCode:NSOKButton]; + [NSApp endSheet:self returnCode:NSModalResponseOK]; [self close]; } diff --git a/OSX/Randomizer.plist b/OSX/Randomizer.plist index 138fcb92..5f83f8d5 100644 --- a/OSX/Randomizer.plist +++ b/OSX/Randomizer.plist @@ -17,7 +17,7 @@ CFBundleSignature ???? CFBundleVersion - 6.04 + 6.06 LSMinimumSystemVersion ${MACOSX_DEPLOYMENT_TARGET} NSPrincipalClass @@ -25,12 +25,12 @@ LSApplicationCategoryType public.app-category.entertainment CFBundleShortVersionString - 6.04 + 6.06 CFBundleLongVersionString - 6.04 + 6.06 CFBundleGetInfoString - 6.04 + 6.06 NSHumanReadableCopyright - 6.04 + 6.06 diff --git a/OSX/SaverRunner.m b/OSX/SaverRunner.m index 8241e214..30f0b7b5 100644 --- a/OSX/SaverRunner.m +++ b/OSX/SaverRunner.m @@ -681,18 +681,18 @@ relabel_menus (NSObject *v, NSString *old_str, NSString *new_str) NSWindow *prefs = [sv configureSheet]; NSAssert (prefs, @"no configureSheet in %@", sv); - [NSApp beginSheet:prefs - modalForWindow:[sv window] - modalDelegate:self - didEndSelector:@selector(preferencesClosed:returnCode:contextInfo:) - contextInfo:nil]; + [sv.window beginSheet:prefs + completionHandler:^(NSInteger code) { + [NSApp stopModalWithCode: code]; + }]; + NSUInteger code = [NSApp runModalForWindow:prefs]; /* Restart the animation if the "OK" button was hit, but not if "Cancel". We have to restart *both* animations, because the xlockmore-style ones will blow up if one re-inits but the other doesn't. */ - if (code != NSCancelButton) { + if (code != NSModalResponseCancel) { if ([sv isAnimating]) [sv stopAnimation]; [sv startAnimation]; @@ -700,13 +700,6 @@ relabel_menus (NSObject *v, NSString *old_str, NSString *new_str) } -- (void) preferencesClosed: (NSWindow *) sheet - returnCode: (int) returnCode - contextInfo: (void *) contextInfo -{ - [NSApp stopModalWithCode:returnCode]; -} - #else // HAVE_IPHONE @@ -1478,10 +1471,10 @@ FAIL: NSWindow *win = [[NSWindow alloc] initWithContentRect:rect - styleMask:(NSTitledWindowMask | - NSClosableWindowMask | - NSMiniaturizableWindowMask | - NSResizableWindowMask) + styleMask:(NSWindowStyleMaskTitled | + NSWindowStyleMaskClosable | + NSWindowStyleMaskMiniaturizable | + NSWindowStyleMaskResizable) backing:NSBackingStoreBuffered defer:YES screen:screen]; diff --git a/OSX/SaverRunner.plist b/OSX/SaverRunner.plist index 21e2eeb5..a907981a 100644 --- a/OSX/SaverRunner.plist +++ b/OSX/SaverRunner.plist @@ -17,7 +17,7 @@ CFBundleSignature ???? CFBundleVersion - 6.04 + 6.06 LSMinimumSystemVersion ${MACOSX_DEPLOYMENT_TARGET} NSPrincipalClass @@ -25,13 +25,13 @@ LSApplicationCategoryType public.app-category.entertainment CFBundleShortVersionString - 6.04 + 6.06 CFBundleLongVersionString - 6.04 + 6.06 CFBundleGetInfoString - 6.04 + 6.06 NSHumanReadableCopyright - 6.04 + 6.06 NSMainNibFile SaverRunner CFBundleIconFile diff --git a/OSX/Updater.plist b/OSX/Updater.plist index aa32657d..fed531bb 100644 --- a/OSX/Updater.plist +++ b/OSX/Updater.plist @@ -17,7 +17,7 @@ CFBundleSignature ???? CFBundleVersion - 6.04 + 6.06 LSMinimumSystemVersion ${MACOSX_DEPLOYMENT_TARGET} NSPrincipalClass @@ -25,13 +25,13 @@ LSApplicationCategoryType public.app-category.entertainment CFBundleShortVersionString - 6.04 + 6.06 CFBundleLongVersionString - 6.04 + 6.06 CFBundleGetInfoString - 6.04 + 6.06 NSHumanReadableCopyright - 6.04 + 6.06 NSMainNibFile Updater CFBundleIconFile diff --git a/OSX/XScreenSaver.plist b/OSX/XScreenSaver.plist index 8fd86f63..74c87b54 100644 --- a/OSX/XScreenSaver.plist +++ b/OSX/XScreenSaver.plist @@ -17,7 +17,7 @@ CFBundleSignature ???? CFBundleVersion - 6.04 + 6.06 LSMinimumSystemVersion ${MACOSX_DEPLOYMENT_TARGET} NSPrincipalClass @@ -25,13 +25,13 @@ LSApplicationCategoryType public.app-category.entertainment CFBundleShortVersionString - 6.04 + 6.06 CFBundleLongVersionString - 6.04 + 6.06 CFBundleGetInfoString - 6.04 + 6.06 NSHumanReadableCopyright - 6.04 + 6.06 NSMainNibFile SaverRunner diff --git a/OSX/XScreenSaverConfigSheet.m b/OSX/XScreenSaverConfigSheet.m index fceae573..13710b5d 100644 --- a/OSX/XScreenSaverConfigSheet.m +++ b/OSX/XScreenSaverConfigSheet.m @@ -884,7 +884,7 @@ static void layout_group (NSView *group, BOOL horiz_p); [self validateImageDirectory: imagedir]; } - [NSApp endSheet:self returnCode:NSOKButton]; + [NSApp endSheet:self returnCode:NSModalResponseOK]; [self close]; } @@ -892,7 +892,7 @@ static void layout_group (NSView *group, BOOL horiz_p); { [userDefaultsController revert:self]; [globalDefaultsController revert:self]; - [NSApp endSheet:self returnCode:NSCancelButton]; + [NSApp endSheet:self returnCode:NSModalResponseCancel]; [self close]; } # endif // !HAVE_IPHONE @@ -2243,7 +2243,7 @@ set_menu_item_object (NSMenuItem *item, NSObject *obj) imagedir]]; [alert setInformativeText: @"This may take a little while..."]; [alert addButtonWithTitle: @"Cancel"]; - [alert setAlertStyle: NSWarningAlertStyle]; + [alert setAlertStyle: NSAlertStyleWarning]; NSProgressIndicator *spinner = [[NSProgressIndicator alloc] initWithFrame: NSMakeRect(0,0,40,40)]; @@ -2290,7 +2290,7 @@ set_menu_item_object (NSMenuItem *item, NSObject *obj) stringByAppendingString: txt]]; [alert2 addButtonWithTitle: @"OK"]; - [alert2 setAlertStyle: NSWarningAlertStyle]; + [alert2 setAlertStyle: NSAlertStyleWarning]; [alert2 beginSheetModalForWindow: self completionHandler:^(NSModalResponse returnCode) { }]; @@ -2439,7 +2439,7 @@ set_menu_item_object (NSMenuItem *item, NSObject *obj) } NSInteger result = [panel runModal]; - if (result == NSOKButton) { + if (result == NSModalResponseOK) { NSArray *files = [panel URLs]; NSString *file = ([files count] > 0 ? [[files objectAtIndex:0] path] : @""); diff --git a/OSX/XScreenSaverView.m b/OSX/XScreenSaverView.m index 92d46b4f..49a5c5ec 100644 --- a/OSX/XScreenSaverView.m +++ b/OSX/XScreenSaverView.m @@ -2153,11 +2153,11 @@ gl_check_ver (const struct gl_version *caps, int state = 0; int flags = [e modifierFlags]; - if (flags & NSAlphaShiftKeyMask) state |= LockMask; - if (flags & NSShiftKeyMask) state |= ShiftMask; - if (flags & NSControlKeyMask) state |= ControlMask; - if (flags & NSAlternateKeyMask) state |= Mod1Mask; - if (flags & NSCommandKeyMask) state |= Mod2Mask; + if (flags & NSEventModifierFlagCapsLock) state |= LockMask; + if (flags & NSEventModifierFlagShift) state |= ShiftMask; + if (flags & NSEventModifierFlagControl) state |= ControlMask; + if (flags & NSEventModifierFlagOption) state |= Mod1Mask; + if (flags & NSEventModifierFlagCommand) state |= Mod2Mask; NSPoint p = [[[e window] contentView] convertPoint:[e locationInWindow] toView:self]; @@ -2172,7 +2172,7 @@ gl_check_ver (const struct gl_version *caps, xe.xbutton.x = x; xe.xbutton.y = y; xe.xbutton.state = state; - if ([e type] == NSScrollWheel) + if ([e type] == NSEventTypeScrollWheel) xe.xbutton.button = ([e deltaY] > 0 ? Button4 : [e deltaY] < 0 ? Button5 : [e deltaX] > 0 ? Button6 : @@ -2189,7 +2189,7 @@ gl_check_ver (const struct gl_version *caps, case KeyPress: case KeyRelease: { - NSString *ns = (([e type] == NSFlagsChanged) ? 0 : + NSString *ns = (([e type] == NSEventTypeFlagsChanged) ? 0 : [e charactersIgnoringModifiers]); KeySym k = 0; @@ -2199,11 +2199,11 @@ gl_check_ver (const struct gl_version *caps, // Also we only get KeyPress events for these, no KeyRelease // (unless we hack the mod state manually. Bleh.) // - if (flags & NSAlphaShiftKeyMask) k = XK_Caps_Lock; - else if (flags & NSShiftKeyMask) k = XK_Shift_L; - else if (flags & NSControlKeyMask) k = XK_Control_L; - else if (flags & NSAlternateKeyMask) k = XK_Alt_L; - else if (flags & NSCommandKeyMask) k = XK_Meta_L; + if (flags & NSEventModifierFlagCapsLock) k = XK_Caps_Lock; + else if (flags & NSEventModifierFlagShift) k = XK_Shift_L; + else if (flags & NSEventModifierFlagControl) k = XK_Control_L; + else if (flags & NSEventModifierFlagOption) k = XK_Alt_L; + else if (flags & NSEventModifierFlagCommand) k = XK_Meta_L; } else if ([ns length] == 1) // real key { diff --git a/OSX/bindist.rtf b/OSX/bindist.rtf index bbef05fc..51c85d77 100644 --- a/OSX/bindist.rtf +++ b/OSX/bindist.rtf @@ -16,8 +16,8 @@ \b0 by Jamie Zawinski\ and many others\ \ -version 6.04\ -29-May-2022\ +version 6.05\ +04-Oct-2022\ \ {\field{\*\fldinst{HYPERLINK "https://www.jwz.org/xscreensaver/"}}{\fldrslt \cf2 \ul \ulc2 https://www.jwz.org/xscreensaver/}}\ \pard\pardeftab720 diff --git a/OSX/grabclient-ios.m b/OSX/grabclient-ios.m index 14854ec9..be8ddab0 100644 --- a/OSX/grabclient-ios.m +++ b/OSX/grabclient-ios.m @@ -15,7 +15,7 @@ #ifdef HAVE_IPHONE // whole file #import -#import "grabscreen.h" +#import "grabclient.h" #import "yarandom.h" void diff --git a/OSX/grabclient-osx.m b/OSX/grabclient-osx.m index ca30251e..3dd91453 100644 --- a/OSX/grabclient-osx.m +++ b/OSX/grabclient-osx.m @@ -25,7 +25,7 @@ # import "SaverRunner.h" #endif #import "jwxyz-cocoa.h" -#import "grabscreen.h" +#import "grabclient.h" #import "colorbars.h" #import "resources.h" #import "usleep.h" diff --git a/OSX/iSaverRunner.plist b/OSX/iSaverRunner.plist index 065f7855..441feca5 100644 --- a/OSX/iSaverRunner.plist +++ b/OSX/iSaverRunner.plist @@ -17,17 +17,17 @@ CFBundleSignature ???? CFBundleVersion - 6.04 + 6.06 LSApplicationCategoryType public.app-category.entertainment CFBundleShortVersionString - 6.04 + 6.06 CFBundleLongVersionString - 6.04 + 6.06 CFBundleGetInfoString - 6.04 + 6.06 NSHumanReadableCopyright - 6.04 + 6.06 NSMainNibFile iSaverRunner CFBundleDisplayName diff --git a/OSX/installer.rtf b/OSX/installer.rtf index 3681e1f2..4c595960 100644 --- a/OSX/installer.rtf +++ b/OSX/installer.rtf @@ -15,7 +15,7 @@ If you prefer, you can instead install them one at a time by opening the \i "Screen Savers" \i0 folder in this disk image and double-clicking on only the ones that you want.\ \ -The full installation will take around 160 MB.\ +The full installation will take around 220 MB.\ \ \b Installation will take several minutes, and the progress bar will not move for most of that time. Just wait it out! \b0 \ diff --git a/OSX/installer.sh b/OSX/installer.sh index 4e8b3eb2..83d6253b 100755 --- a/OSX/installer.sh +++ b/OSX/installer.sh @@ -196,7 +196,13 @@ su "$USER" -c "open \"$DST1/$UPDATER_DST\"" & sleep 5 -# Launch System Preferences with the Screen Saver pane selected. +# Launch System Preferences with the "Desktop" pane selected. In the olden +# days, this was a single pane with two tabs, "Desktop" and "Screen Saver", +# and it would always come up with "Desktop" selected. As of macOS 13, these +# are two top-level pages, and this still opens the "Desktop" one. There is +# still no way to open the "Screen Saver" page directly. I'm guessing they +# are the same code, despite displaying two tabs. Well, at least this scrolls +# the list of pages to *approximately* the right spot... # su "$USER" -c \ "open /System/Library/PreferencePanes/DesktopScreenEffectsPref.prefPane" & diff --git a/OSX/installer.xml b/OSX/installer.xml index ac668645..3fd68131 100644 --- a/OSX/installer.xml +++ b/OSX/installer.xml @@ -3,7 +3,8 @@ XScreenSaver org.jwz - + - + diff --git a/OSX/ios-function-table.m b/OSX/ios-function-table.m index d2e2fe7e..ae584200 100644 --- a/OSX/ios-function-table.m +++ b/OSX/ios-function-table.m @@ -1,5 +1,5 @@ /* Generated file, do not edit. - Created: Thu May 26 13:26:42 2022 by build-fntable.pl 1.14. + Created: Sat Dec 10 17:33:56 2022 by build-fntable.pl 1.14. */ #import @@ -120,6 +120,7 @@ extern struct xscreensaver_function_table helix_xscreensaver_function_table, hexadrop_xscreensaver_function_table, hexstrut_xscreensaver_function_table, + hextrail_xscreensaver_function_table, hilbert_xscreensaver_function_table, hopalong_xscreensaver_function_table, hydrostat_xscreensaver_function_table, @@ -223,7 +224,6 @@ extern struct xscreensaver_function_table swirl_xscreensaver_function_table, tangram_xscreensaver_function_table, tessellimage_xscreensaver_function_table, - thornbird_xscreensaver_function_table, timetunnel_xscreensaver_function_table, topblock_xscreensaver_function_table, triangle_xscreensaver_function_table, @@ -371,6 +371,7 @@ NSDictionary *make_function_table_dict(void) { @"Helix": [NSValue valueWithPointer:&helix_xscreensaver_function_table], @"Hexadrop": [NSValue valueWithPointer:&hexadrop_xscreensaver_function_table], @"Hex Strut": [NSValue valueWithPointer:&hexstrut_xscreensaver_function_table], + @"Hex Trail": [NSValue valueWithPointer:&hextrail_xscreensaver_function_table], @"Hilbert": [NSValue valueWithPointer:&hilbert_xscreensaver_function_table], @"Hopalong": [NSValue valueWithPointer:&hopalong_xscreensaver_function_table], @"Hydrostat": [NSValue valueWithPointer:&hydrostat_xscreensaver_function_table], @@ -474,7 +475,6 @@ NSDictionary *make_function_table_dict(void) { @"Swirl": [NSValue valueWithPointer:&swirl_xscreensaver_function_table], @"Tangram": [NSValue valueWithPointer:&tangram_xscreensaver_function_table], @"Tessellimage": [NSValue valueWithPointer:&tessellimage_xscreensaver_function_table], - @"Thornbird": [NSValue valueWithPointer:þbird_xscreensaver_function_table], @"Time Tunnel": [NSValue valueWithPointer:&timetunnel_xscreensaver_function_table], @"Top Block": [NSValue valueWithPointer:&topblock_xscreensaver_function_table], @"Triangle": [NSValue valueWithPointer:&triangle_xscreensaver_function_table], diff --git a/OSX/seticon.pl b/OSX/seticon.pl index f4c044ad..75e30d74 100755 --- a/OSX/seticon.pl +++ b/OSX/seticon.pl @@ -17,7 +17,7 @@ use diagnostics; use strict; my $progname = $0; $progname =~ s@.*/@@g; -my ($version) = ('$Revision: 1.9 $' =~ m/\s(\d[.\d]+)\s/s); +my ($version) = ('$Revision: 1.10 $' =~ m/\s(\d[.\d]+)\s/s); my $verbose = 0; @@ -25,14 +25,39 @@ my $verbose = 0; # Anything placed on this list gets unconditionally deleted when this # script exits, even if abnormally. # -my @rm_f = (); -END { - my $exit = $?; - if (@rm_f) { - print STDERR "$progname: rm " . join(' ', @rm_f) . "\n" if ($verbose); - unlink @rm_f; +my %rm_f; +END { rmf(); } + +sub rmf() { + foreach my $f (sort keys %rm_f) { + if (-e $f) { + print STDERR "$progname: rm $f\n" if ($verbose > 1); + unlink $f; + } } - $? = $exit; # Don't clobber this script's exit code. + %rm_f = (); +} + +sub signal_cleanup($) { + my ($s) = @_; + print STDERR "$progname: SIG$s\n" if ($verbose > 1); + rmf(); + # Propagate the signal and die. This does not cause END to run. + $SIG{$s} = 'DEFAULT'; + kill ($s, $$); +} + +$SIG{TERM} = \&signal_cleanup; # kill +$SIG{INT} = \&signal_cleanup; # shell ^C +$SIG{QUIT} = \&signal_cleanup; # shell ^| +$SIG{KILL} = \&signal_cleanup; # nope +$SIG{ABRT} = \&signal_cleanup; +$SIG{HUP} = \&signal_cleanup; + +# Add the file to the rm_f list, since you can't export hash variables. +sub rm_atexit($) { + my ($file) = @_; + $rm_f{$file} = 1; } @@ -74,7 +99,8 @@ sub set_icon($$) { my $n = rand() * 0xFFFFFFFF; my $rsrc_tmp = sprintf("rez_%08X.rsrc", $n); my $icon_tmp = sprintf("rez_%08X.icns", $n); - push @rm_f, ($rsrc_tmp, $icon_tmp); + rm_atexit ($rsrc_tmp); + rm_atexit ($icon_tmp); unlink ($rsrc_tmp, $icon_tmp); safe_system ("cp", "-p", $icon, $icon_tmp); diff --git a/OSX/tvSaverRunner.plist b/OSX/tvSaverRunner.plist index 4ef4002e..c7d96e25 100644 --- a/OSX/tvSaverRunner.plist +++ b/OSX/tvSaverRunner.plist @@ -17,17 +17,17 @@ CFBundleSignature ???? CFBundleVersion - 6.04 + 6.06 LSApplicationCategoryType public.app-category.entertainment CFBundleShortVersionString - 6.04 + 6.06 CFBundleLongVersionString - 6.04 + 6.06 CFBundleGetInfoString - 6.04 + 6.06 NSHumanReadableCopyright - 6.04 + 6.06 CFBundleDisplayName ${PRODUCT_NAME} CFBundleIcons diff --git a/OSX/updates.xml b/OSX/updates.xml index d46521c9..3ed5f0e4 100644 --- a/OSX/updates.xml +++ b/OSX/updates.xml @@ -7,6 +7,18 @@ https://www.jwz.org/xscreensaver/updates.xml Updates to xscreensaver. en + + Version 6.06 + https://www.jwz.org/xscreensaver/xscreensaver-6.06.dmg + • `marbling' works again.
• Adjusted some of the very old hacks, which were written when pixels were larger, to be more visible on today's higher rez displays. ]]>
+ Sun, 11 Dec 2022 13:39:02 -0800 + +
Version 6.04 https://www.jwz.org/xscreensaver/xscreensaver-6.04.dmg @@ -19,30 +31,6 @@ length="85181483" type="application/octet-stream" /> - - Version 6.03 - https://www.jwz.org/xscreensaver/xscreensaver-6.03.dmg - • New hack, `mapscroller' (X11 and macOS only).
• `sphereeversion' now has corrugation-mode, and can evert the Earth.
• `glplanet' is higher resolution, and displays time zones.
• `glslideshow' displays relative pathnames again.
• fixed spurious error message in auto-update installer. ]]>
- Sun, 27 Feb 2022 13:08:45 -0800 - -
- - Version 6.02 - https://www.jwz.org/xscreensaver/xscreensaver-6.02.dmg - • `atlantis' behaviors are more random and lifelike.
• `headroom' is now Mask Headroom. ]]>
- Mon, 11 Oct 2021 17:59:05 -0700 - -
Version 6.00 https://www.jwz.org/xscreensaver/xscreensaver-6.00.dmg diff --git a/OSX/xscreensaver.xcconfig b/OSX/xscreensaver.xcconfig deleted file mode 100644 index 6112145a..00000000 --- a/OSX/xscreensaver.xcconfig +++ /dev/null @@ -1,11 +0,0 @@ -// To create builds that work properly on MacOS 10.6, Xcode 5.0.2 must -// be used, since that is the latest version that supports garbage collection. -// If the Xcode version is 5.02 or earlier, use these settings: -// "10.4", "-fobjc-gc", "-no-fobjc-gc" -// If the Xcode version is later than that, use these settings: -// "10.6", "", "" -// and the generate builds will only work on 10.6 or later. -// -MACOSX_DEPLOYMENT_TARGET=10.9 -OBJC_GC_CFLAGS= -OBJC_NO_GC_CFLAGS= diff --git a/OSX/xscreensaver.xcodeproj/project.pbxproj b/OSX/xscreensaver.xcodeproj/project.pbxproj index f961c791..03f68e23 100644 --- a/OSX/xscreensaver.xcodeproj/project.pbxproj +++ b/OSX/xscreensaver.xcodeproj/project.pbxproj @@ -3,7 +3,7 @@ archiveVersion = 1; classes = { }; - objectVersion = 46; + objectVersion = 54; objects = { /* Begin PBXAggregateTarget section */ @@ -31,6 +31,7 @@ AF137D530F075E5C004DE3B2 /* PBXTargetDependency */, AF137D510F075E5C004DE3B2 /* PBXTargetDependency */, AF137D4F0F075E5C004DE3B2 /* PBXTargetDependency */, + AFD6F2A728ED13B4007FAE82 /* PBXTargetDependency */, AF137D4D0F075E5C004DE3B2 /* PBXTargetDependency */, AF137D4B0F075E5C004DE3B2 /* PBXTargetDependency */, AF137D490F075E5C004DE3B2 /* PBXTargetDependency */, @@ -177,7 +178,6 @@ AF7779A109B6608100EA3033 /* PBXTargetDependency */, AF77799B09B6608100EA3033 /* PBXTargetDependency */, AF77799909B6608100EA3033 /* PBXTargetDependency */, - AF77799709B6608100EA3033 /* PBXTargetDependency */, AF77799509B6608000EA3033 /* PBXTargetDependency */, ); name = "All Savers (XLockmore)"; @@ -251,6 +251,7 @@ AF62D6392180087500C57C42 /* PBXTargetDependency */, AF96015F25759150007FA31B /* PBXTargetDependency */, AF1B0FC51D7AB5740011DBE4 /* PBXTargetDependency */, + AF0BF6ED29456D50000D9473 /* PBXTargetDependency */, AF4F10F0143450C300E34F3F /* PBXTargetDependency */, AFC0E8C91CDC6125008CAFAC /* PBXTargetDependency */, AF777A1709B660B300EA3033 /* PBXTargetDependency */, @@ -368,6 +369,20 @@ AF083A4A099311FF00277BE9 /* atunnel.c in Sources */ = {isa = PBXBuildFile; fileRef = AF083A31099311CE00277BE9 /* atunnel.c */; }; AF083A4B0993120900277BE9 /* atunnel.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC258720988A468000655EE /* atunnel.xml */; }; AF083A59099312B000277BE9 /* tunnel_draw.c in Sources */ = {isa = PBXBuildFile; fileRef = AF083A58099312B000277BE9 /* tunnel_draw.c */; }; + AF0BF6D429456B2E000D9473 /* XScreenSaverSubclass.m in Sources */ = {isa = PBXBuildFile; fileRef = AF9CC7A0099580E70075E99B /* XScreenSaverSubclass.m */; }; + AF0BF6D629456B2E000D9473 /* libjwxyz.a in Frameworks */ = {isa = PBXBuildFile; fileRef = AF4808C1098C3B6C00FB32B8 /* libjwxyz.a */; }; + AF0BF6D729456B2E000D9473 /* ScreenSaver.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF976ED30989BF59001F8B92 /* ScreenSaver.framework */; }; + AF0BF6D829456B2E000D9473 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF2C31E515C0F7FE007A6896 /* QuartzCore.framework */; }; + AF0BF6D929456B2E000D9473 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; }; + AF0BF6DA29456B2E000D9473 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF48112B0990A2C700FB32B8 /* Carbon.framework */; }; + AF0BF6DB29456B2E000D9473 /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CEE0BC611A6B0D6200C098BF /* OpenGL.framework */; }; + AF0BF6DC29456B2E000D9473 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = AF78369617DB9F25003B9FC0 /* libz.dylib */; }; + AF0BF6E629456C32000D9473 /* hextrail.xml in Resources */ = {isa = PBXBuildFile; fileRef = AF0BF6E429456C31000D9473 /* hextrail.xml */; }; + AF0BF6E729456C32000D9473 /* hextrail.c in Sources */ = {isa = PBXBuildFile; fileRef = AF0BF6E529456C31000D9473 /* hextrail.c */; }; + AF0BF6E829456CCC000D9473 /* hextrail.c in Sources */ = {isa = PBXBuildFile; fileRef = AF0BF6E529456C31000D9473 /* hextrail.c */; settings = {COMPILER_FLAGS = "-DUSE_GL"; }; }; + AF0BF6E929456CEB000D9473 /* hextrail.c in Sources */ = {isa = PBXBuildFile; fileRef = AF0BF6E529456C31000D9473 /* hextrail.c */; settings = {COMPILER_FLAGS = "-DUSE_GL"; }; }; + AF0BF6EA29456D20000D9473 /* hextrail.xml in Resources */ = {isa = PBXBuildFile; fileRef = AF0BF6E429456C31000D9473 /* hextrail.xml */; }; + AF0BF6EB29456D2D000D9473 /* hextrail.xml in Resources */ = {isa = PBXBuildFile; fileRef = AF0BF6E429456C31000D9473 /* hextrail.xml */; }; AF0CA52125D3B92E00DEDA90 /* SpecialElite.ttf in Resources */ = {isa = PBXBuildFile; fileRef = AF0CA52025D3B92E00DEDA90 /* SpecialElite.ttf */; }; AF0CA52225D3B92E00DEDA90 /* SpecialElite.ttf in Resources */ = {isa = PBXBuildFile; fileRef = AF0CA52025D3B92E00DEDA90 /* SpecialElite.ttf */; }; AF0CA52425D3C2F000DEDA90 /* clacon.ttf in Resources */ = {isa = PBXBuildFile; fileRef = AF0CA52325D3C2F000DEDA90 /* clacon.ttf */; }; @@ -2102,7 +2117,6 @@ AF5689C326E7060500CCBA38 /* swirl.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC259200988A469000655EE /* swirl.xml */; }; AF5689C426E7060500CCBA38 /* tangram.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC259220988A469000655EE /* tangram.xml */; }; AF5689C526E7060500CCBA38 /* tessellimage.xml in Resources */ = {isa = PBXBuildFile; fileRef = AF68A49419196E3E00D41CD1 /* tessellimage.xml */; }; - AF5689C626E7060500CCBA38 /* thornbird.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC259230988A469000655EE /* thornbird.xml */; }; AF5689C726E7060500CCBA38 /* timetunnel.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC259240988A469000655EE /* timetunnel.xml */; }; AF5689C826E7060500CCBA38 /* topblock.xml in Resources */ = {isa = PBXBuildFile; fileRef = AF998EFA0A083E8C0051049D /* topblock.xml */; }; AF5689C926E7060500CCBA38 /* triangle.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC259250988A469000655EE /* triangle.xml */; }; @@ -2248,7 +2262,6 @@ AF568A5626E7060500CCBA38 /* textclient-mobile.c in Sources */ = {isa = PBXBuildFile; fileRef = AFA211881CD1AA1800C0D2A1 /* textclient-mobile.c */; }; AF568A5726E7060500CCBA38 /* tessellimage.c in Sources */ = {isa = PBXBuildFile; fileRef = AF68A49519196E3E00D41CD1 /* tessellimage.c */; }; AF568A5826E7060500CCBA38 /* triangle.c in Sources */ = {isa = PBXBuildFile; fileRef = AFD570980996B86200BA26F7 /* triangle.c */; }; - AF568A5926E7060500CCBA38 /* thornbird.c in Sources */ = {isa = PBXBuildFile; fileRef = AFD5716B0996C16700BA26F7 /* thornbird.c */; }; AF568A5A26E7060500CCBA38 /* truchet.c in Sources */ = {isa = PBXBuildFile; fileRef = AF476FF0099D1713001F091E /* truchet.c */; }; AF568A5B26E7060500CCBA38 /* twang.c in Sources */ = {isa = PBXBuildFile; fileRef = AF9D497F09B541E5006E59CF /* twang.c */; }; AF568A5C26E7060500CCBA38 /* vermiculate.c in Sources */ = {isa = PBXBuildFile; fileRef = AF477704099DAF3F001F091E /* vermiculate.c */; }; @@ -3171,7 +3184,6 @@ AF918A1F158FC38A002B5D1E /* slip.c in Sources */ = {isa = PBXBuildFile; fileRef = AF47793D099DE56A001F091E /* slip.c */; }; AF918A22158FC38A002B5D1E /* strange.c in Sources */ = {isa = PBXBuildFile; fileRef = AFD57371099741A200BA26F7 /* strange.c */; }; AF918A23158FC38A002B5D1E /* swirl.c in Sources */ = {isa = PBXBuildFile; fileRef = AFD572350996E53E00BA26F7 /* swirl.c */; }; - AF918A24158FC38A002B5D1E /* thornbird.c in Sources */ = {isa = PBXBuildFile; fileRef = AFD5716B0996C16700BA26F7 /* thornbird.c */; }; AF918A25158FC38A002B5D1E /* triangle.c in Sources */ = {isa = PBXBuildFile; fileRef = AFD570980996B86200BA26F7 /* triangle.c */; }; AF918A28158FC3BB002B5D1E /* antinspect.c in Sources */ = {isa = PBXBuildFile; fileRef = AFA5605F09936E9C00F3E977 /* antinspect.c */; settings = {COMPILER_FLAGS = "-DUSE_GL"; }; }; AF918A29158FC3BB002B5D1E /* antmaze.c in Sources */ = {isa = PBXBuildFile; fileRef = AFA562EF0993941600F3E977 /* antmaze.c */; settings = {COMPILER_FLAGS = "-DUSE_GL"; }; }; @@ -3470,7 +3482,6 @@ AF918B75158FC53E002B5D1E /* surfaces.xml in Resources */ = {isa = PBXBuildFile; fileRef = AF4A3461102A59EB00A81B2A /* surfaces.xml */; }; AF918B76158FC53E002B5D1E /* swirl.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC259200988A469000655EE /* swirl.xml */; }; AF918B78158FC53E002B5D1E /* tangram.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC259220988A469000655EE /* tangram.xml */; }; - AF918B79158FC53E002B5D1E /* thornbird.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC259230988A469000655EE /* thornbird.xml */; }; AF918B7A158FC53E002B5D1E /* timetunnel.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC259240988A469000655EE /* timetunnel.xml */; }; AF918B7B158FC53E002B5D1E /* topblock.xml in Resources */ = {isa = PBXBuildFile; fileRef = AF998EFA0A083E8C0051049D /* topblock.xml */; }; AF918B7C158FC53E002B5D1E /* triangle.xml in Resources */ = {isa = PBXBuildFile; fileRef = AFC259250988A469000655EE /* triangle.xml */; }; @@ -4568,6 +4579,20 @@ remoteGlobalIDString = AF4808C0098C3B6C00FB32B8; remoteInfo = jwxyz; }; + AF0BF6CF29456B2E000D9473 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */; + proxyType = 1; + remoteGlobalIDString = AF4808C0098C3B6C00FB32B8; + remoteInfo = jwxyz; + }; + AF0BF6EC29456D50000D9473 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */; + proxyType = 1; + remoteGlobalIDString = AF0BF6CD29456B2E000D9473; + remoteInfo = Hextrail; + }; AF0DC7AD0C4C73F600D76972 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */; @@ -6451,13 +6476,6 @@ remoteGlobalIDString = AFD570850996B80300BA26F7; remoteInfo = Triangle; }; - AF77799609B6608100EA3033 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */; - proxyType = 1; - remoteGlobalIDString = AFD571590996C0CE00BA26F7; - remoteInfo = Thornbird; - }; AF77799809B6608100EA3033 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */; @@ -8334,6 +8352,13 @@ remoteGlobalIDString = AF4808C0098C3B6C00FB32B8; remoteInfo = jwxyz; }; + AFD6F2A628ED13B4007FAE82 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */; + proxyType = 1; + remoteGlobalIDString = AFD571590996C0CE00BA26F7; + remoteInfo = Thornbird; + }; AFD704C428308724002A8EB0 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 29B97313FDCFA39411CA2CEA /* Project object */; @@ -8644,6 +8669,9 @@ AF083A48099311D700277BE9 /* Atunnel.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Atunnel.saver; sourceTree = BUILT_PRODUCTS_DIR; }; AF083A58099312B000277BE9 /* tunnel_draw.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = tunnel_draw.c; path = hacks/glx/tunnel_draw.c; sourceTree = ""; }; AF083A5D099312DB00277BE9 /* tunnel_draw.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; name = tunnel_draw.h; path = hacks/glx/tunnel_draw.h; sourceTree = ""; }; + AF0BF6E229456B2E000D9473 /* Hextrail.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Hextrail.saver; sourceTree = BUILT_PRODUCTS_DIR; }; + AF0BF6E429456C31000D9473 /* hextrail.xml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = hextrail.xml; sourceTree = ""; }; + AF0BF6E529456C31000D9473 /* hextrail.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = hextrail.c; path = hacks/glx/hextrail.c; sourceTree = ""; }; AF0CA52025D3B92E00DEDA90 /* SpecialElite.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; name = SpecialElite.ttf; path = ../hacks/fonts/SpecialElite.ttf; sourceTree = ""; }; AF0CA52325D3C2F000DEDA90 /* clacon.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; name = clacon.ttf; path = ../hacks/fonts/clacon.ttf; sourceTree = ""; }; AF0DC7BD0C4C73F600D76972 /* m6502.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = m6502.saver; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -9045,7 +9073,6 @@ AF91898F158FC00A002B5D1E /* XScreenSaver.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = XScreenSaver.app; sourceTree = BUILT_PRODUCTS_DIR; }; AF939AD220351BFC0032DD23 /* font-retry.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "font-retry.c"; path = "utils/font-retry.c"; sourceTree = ""; }; AF939AD42038C0040032DD23 /* luximr.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; name = luximr.ttf; path = ../hacks/fonts/luximr.ttf; sourceTree = ""; }; - AF94E7411A16E93600289B93 /* xscreensaver.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = xscreensaver.xcconfig; sourceTree = ""; }; AF95059925670ECC00C1F257 /* COVID19.saver */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = COVID19.saver; sourceTree = BUILT_PRODUCTS_DIR; }; AF95059B25670FE900C1F257 /* covid19.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = covid19.c; path = hacks/glx/covid19.c; sourceTree = ""; }; AF95059E2567102000C1F257 /* covid19.xml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = covid19.xml; sourceTree = ""; }; @@ -9766,6 +9793,20 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + AF0BF6D529456B2E000D9473 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + AF0BF6D629456B2E000D9473 /* libjwxyz.a in Frameworks */, + AF0BF6D729456B2E000D9473 /* ScreenSaver.framework in Frameworks */, + AF0BF6D829456B2E000D9473 /* QuartzCore.framework in Frameworks */, + AF0BF6D929456B2E000D9473 /* Cocoa.framework in Frameworks */, + AF0BF6DA29456B2E000D9473 /* Carbon.framework in Frameworks */, + AF0BF6DB29456B2E000D9473 /* OpenGL.framework in Frameworks */, + AF0BF6DC29456B2E000D9473 /* libz.dylib in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; AF0DC7B40C4C73F600D76972 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; @@ -13973,6 +14014,7 @@ AFAE1484279275BE00C62683 /* Squirtorus.saver */, AFD704D728308724002A8EB0 /* Nakagin.saver */, AF2A635628401496003791B4 /* ChompyTower.saver */, + AF0BF6E229456B2E000D9473 /* Hextrail.saver */, ); name = Products; path = ..; @@ -14011,7 +14053,6 @@ AF9771D90989DC4A001F8B92 /* SaverRunner.plist */, AF01294C157D31DD00C396E1 /* iSaverRunner.plist */, AF568B3126E7060600CCBA38 /* tvSaverRunner.plist */, - AF94E7411A16E93600289B93 /* xscreensaver.xcconfig */, 8D1107310486CEB800E47090 /* XScreenSaver.plist */, AF0FAF1209CA712600EE1051 /* xscreensaver-getimage-file */, AF0FAF0B09CA6FF900EE1051 /* xscreensaver-text */, @@ -14385,6 +14426,7 @@ AF96015925759124007FA31B /* headroom.c */, AF96015825759124007FA31B /* headroom_model.c */, AF1B0FBE1D7AB5210011DBE4 /* hexstrut.c */, + AF0BF6E529456C31000D9473 /* hextrail.c */, AF78D18A142DD96E002AAF77 /* hilbert.c */, AFC0E8C21CDC60A9008CAFAC /* hydrostat.c */, AFA55F59099362DF00F3E977 /* hypertorus.c */, @@ -14633,6 +14675,7 @@ AFC258C40988A468000655EE /* helix.xml */, AFB591BC178B81E600EA4005 /* hexadrop.xml */, AF1B0FBF1D7AB5210011DBE4 /* hexstrut.xml */, + AF0BF6E429456C31000D9473 /* hextrail.xml */, AF78D18E142DD99A002AAF77 /* hilbert.xml */, AFC258C50988A468000655EE /* hopalong.xml */, AFC258C60988A468000655EE /* hyperball.xml */, @@ -14995,6 +15038,26 @@ productReference = AF083A48099311D700277BE9 /* Atunnel.saver */; productType = "com.apple.product-type.bundle"; }; + AF0BF6CD29456B2E000D9473 /* Hextrail */ = { + isa = PBXNativeTarget; + buildConfigurationList = AF0BF6DF29456B2E000D9473 /* Build configuration list for PBXNativeTarget "Hextrail" */; + buildPhases = ( + AF0BF6D029456B2E000D9473 /* Resources */, + AF0BF6D229456B2E000D9473 /* Sources */, + AF0BF6D529456B2E000D9473 /* Frameworks */, + AF0BF6DD29456B2E000D9473 /* Rez */, + AF0BF6DE29456B2E000D9473 /* Run Update Info Plist */, + ); + buildRules = ( + ); + dependencies = ( + AF0BF6CE29456B2E000D9473 /* PBXTargetDependency */, + ); + name = Hextrail; + productName = DangerBall; + productReference = AF0BF6E229456B2E000D9473 /* Hextrail.saver */; + productType = "com.apple.product-type.bundle"; + }; AF0DC7AB0C4C73F600D76972 /* m6502 */ = { isa = PBXNativeTarget; buildConfigurationList = AF0DC7BA0C4C73F600D76972 /* Build configuration list for PBXNativeTarget "m6502" */; @@ -16340,7 +16403,6 @@ isa = PBXNativeTarget; buildConfigurationList = AF4808C2098C3B8B00FB32B8 /* Build configuration list for PBXNativeTarget "jwxyz" */; buildPhases = ( - AF4E1D1819CE7013002B6190 /* Update GC build settings */, AF4808BD098C3B6C00FB32B8 /* Headers */, AF4808BE098C3B6C00FB32B8 /* Sources */, AF4808BF098C3B6C00FB32B8 /* Frameworks */, @@ -20580,7 +20642,7 @@ 29B97313FDCFA39411CA2CEA /* Project object */ = { isa = PBXProject; attributes = { - LastUpgradeCheck = 1340; + LastUpgradeCheck = 1410; TargetAttributes = { AF08398F09930B6B00277BE9 = { DevelopmentTeam = 4627ATJELP; @@ -21602,7 +21664,6 @@ AFD5700F0996B4CC00BA26F7 /* Sierpinski */, AFD5735D0997411200BA26F7 /* Strange */, AFD572220996E4A300BA26F7 /* Swirl */, - AFD571590996C0CE00BA26F7 /* Thornbird */, AFD570850996B80300BA26F7 /* Triangle */, AF480D59098EED5100FB32B8 /* All Savers (OpenGL) */, AFA5604A09936E2100F3E977 /* AntInspect */, @@ -21667,6 +21728,7 @@ AF62D6182180070600C57C42 /* Handsy */, AF96013E25758F9F007FA31B /* Headroom */, AF1B0FA71D7AB4740011DBE4 /* Hexstrut */, + AF0BF6CD29456B2E000D9473 /* Hextrail */, AF78D175142DD8F3002AAF77 /* Hilbert */, AFC0E8AB1CDC601A008CAFAC /* Hydrostat */, AFA55F420993629000F3E977 /* Hypertorus */, @@ -21752,6 +21814,7 @@ AF4771A7099D4949001F091E /* T3D */, CE3D01511B76F4C100993C75 /* TestX11 */, AF63F4781C3469FC0033E133 /* TestX11-iOS */, + AFD571590996C0CE00BA26F7 /* Thornbird */, AFD56F0B0996AAFA00BA26F7 /* Vines */, AF477208099D4EE8001F091E /* Whirlygig */, AFD5709B0996B88E00BA26F7 /* Worm */, @@ -21781,6 +21844,14 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + AF0BF6D029456B2E000D9473 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + AF0BF6E629456C32000D9473 /* hextrail.xml in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; AF0DC7AE0C4C73F600D76972 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; @@ -22533,6 +22604,7 @@ AF56895C26E7060500CCBA38 /* helix.xml in Resources */, AF56895D26E7060500CCBA38 /* hexadrop.xml in Resources */, AF56895E26E7060500CCBA38 /* hexstrut.xml in Resources */, + AF0BF6EA29456D20000D9473 /* hextrail.xml in Resources */, AF56895F26E7060500CCBA38 /* hilbert.xml in Resources */, AF56896026E7060500CCBA38 /* hopalong.xml in Resources */, AF56896126E7060500CCBA38 /* hydrostat.xml in Resources */, @@ -22636,7 +22708,6 @@ AF5689C326E7060500CCBA38 /* swirl.xml in Resources */, AF5689C426E7060500CCBA38 /* tangram.xml in Resources */, AF5689C526E7060500CCBA38 /* tessellimage.xml in Resources */, - AF5689C626E7060500CCBA38 /* thornbird.xml in Resources */, AF5689C726E7060500CCBA38 /* timetunnel.xml in Resources */, AF5689C826E7060500CCBA38 /* topblock.xml in Resources */, AF5689C926E7060500CCBA38 /* triangle.xml in Resources */, @@ -23170,6 +23241,7 @@ AF918B13158FC53D002B5D1E /* helix.xml in Resources */, AFB591BF178B81E600EA4005 /* hexadrop.xml in Resources */, AF1B0FC01D7AB5330011DBE4 /* hexstrut.xml in Resources */, + AF0BF6EB29456D2D000D9473 /* hextrail.xml in Resources */, AF918B14158FC53D002B5D1E /* hilbert.xml in Resources */, AF918B15158FC53D002B5D1E /* hopalong.xml in Resources */, AFC0E8C71CDC60DE008CAFAC /* hydrostat.xml in Resources */, @@ -23273,7 +23345,6 @@ AF918B76158FC53E002B5D1E /* swirl.xml in Resources */, AF918B78158FC53E002B5D1E /* tangram.xml in Resources */, AF68A49819196E3E00D41CD1 /* tessellimage.xml in Resources */, - AF918B79158FC53E002B5D1E /* thornbird.xml in Resources */, AF918B7A158FC53E002B5D1E /* timetunnel.xml in Resources */, AF918B7B158FC53E002B5D1E /* topblock.xml in Resources */, AF918B7C158FC53E002B5D1E /* triangle.xml in Resources */, @@ -24580,6 +24651,13 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + AF0BF6DD29456B2E000D9473 /* Rez */ = { + isa = PBXRezBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; AF0DC7B80C4C73F600D76972 /* Rez */ = { isa = PBXRezBuildPhase; buildActionMask = 2147483647; @@ -26452,8 +26530,26 @@ /* End PBXRezBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ + AF0BF6DE29456B2E000D9473 /* Run Update Info Plist */ = { + isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + "${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}", + ); + 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; + }; AF0DC7B90C4C73F600D76972 /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -26470,6 +26566,7 @@ }; AF0DCA520C4CBB0D00D76972 /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -26486,6 +26583,7 @@ }; AF168EA821D240EB00ED6E08 /* Codesign Sparkle */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -26505,6 +26603,7 @@ }; AF1A176F0D6D6EE3008AF328 /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -26521,6 +26620,7 @@ }; AF1ADA1E18501DC200932759 /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -26537,6 +26637,7 @@ }; AF1B0FB81D7AB4740011DBE4 /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -26553,6 +26654,7 @@ }; AF2107821FD23BDD00B61EA9 /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -26569,6 +26671,7 @@ }; AF2A635228401496003791B4 /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -26585,6 +26688,7 @@ }; AF2D0D36241D7C870001D8B8 /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -26601,6 +26705,7 @@ }; AF32D9F00F3AD0B40080F535 /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -26617,6 +26722,7 @@ }; AF3581D11431D47B00E09C51 /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -26633,6 +26739,7 @@ }; AF358212143330F900E09C51 /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -26649,6 +26756,7 @@ }; AF35E89C0E63823600691F2F /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -26665,6 +26773,7 @@ }; AF39382B1D0FBD6A00205406 /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -26681,6 +26790,7 @@ }; AF39E292198A11F60064A58D /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -26697,6 +26807,7 @@ }; AF3C71550D624BF50030CC0D /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -26713,6 +26824,7 @@ }; AF3EC9892035154C00180A35 /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -26729,6 +26841,7 @@ }; AF41E963201D49DB0098E253 /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -26745,6 +26858,7 @@ }; AF43640D241D84CE00966603 /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -26761,6 +26875,7 @@ }; AF46E9E01CBBA2B300240FBC /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -26777,6 +26892,7 @@ }; AF48DEFF0A0C25E000F94CF9 /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -26793,6 +26909,7 @@ }; AF4A3459102A593600A81B2A /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -26807,23 +26924,9 @@ shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX"; showEnvVarsInLog = 0; }; - AF4E1D1819CE7013002B6190 /* Update GC build settings */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - ); - name = "Update GC build settings"; - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "#!/bin/sh\n\n# Edit the contents of \"xscreensaver.xcconfig\" based on the running\n# Xcode version. If we are running Xcode 5.0.2, we *must* turn on GC.\n# If we are running a newer version of Xcode than that, we *cannot*\n# turn on GC.\n\nTMP=`mktemp -t xcode`\nSRC=\"$SRCROOT/xscreensaver.xcconfig\"\nMACOSX_DEPLOYMENT_TARGET=10.9\nOBJC_GC_CFLAGS=\nOBJC_NO_GC_CFLAGS=\nif [ \"$XCODE_VERSION_MAJOR\" -lt \"0600\" ]; then\n MACOSX_DEPLOYMENT_TARGET=10.4\n OBJC_GC_CFLAGS=\"-fobjc-gc\"\n OBJC_NO_GC_CFLAGS=\"-fno-objc-gc\"\nfi\n\nrm -f \"$TMP\"\nsed -e \"s/^\\(MACOSX_DEPLOYMENT_TARGET=\\).*/\\1${MACOSX_DEPLOYMENT_TARGET}/\" \\\n -e \"s/^\\(OBJC_GC_CFLAGS=\\).*/\\1${OBJC_GC_CFLAGS}/\" \\\n -e \"s/^\\(OBJC_NO_GC_CFLAGS=\\).*/\\1${OBJC_NO_GC_CFLAGS}/\" \\\n < $SRC > $TMP\nif ! ( cmp -s \"$SRC\" \"$TMP\" ); then\necho \"$SRC updated:\"\n diff -U0 \"$SRC\" \"$TMP\"\n cat \"$TMP\" > \"$SRC\"\nelse\n echo \"$SRC unchanged\"\nfi\n\nrm -f \"$TMP\"\nexit 0\n"; - showEnvVarsInLog = 0; - }; AF4FD6F60CE7A486005EE58E /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -26840,6 +26943,7 @@ }; AF4FF4CA0D52CBDE00666F98 /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -26884,6 +26988,7 @@ }; AF568B2C26E7060500CCBA38 /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -26900,6 +27005,7 @@ }; AF578FA11434E918002455DD /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -26911,11 +27017,12 @@ ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX"; + shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX\n"; showEnvVarsInLog = 0; }; AF5C9B091A0CCE6E00B0147A /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -26932,6 +27039,7 @@ }; AF5ECEBC2116B1A400069433 /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -26948,6 +27056,7 @@ }; AF62D6292180070600C57C42 /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -26964,6 +27073,7 @@ }; AF633C121EE0BA6F00AB33BD /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -26980,6 +27090,7 @@ }; AF63A8021AB4EDDB00593C75 /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -27010,6 +27121,7 @@ }; AF63F44A1C3465BE0033E133 /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -27040,6 +27152,7 @@ }; AF63F4701C34682A0033E133 /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -27070,6 +27183,7 @@ }; AF63F4961C3469FC0033E133 /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -27086,6 +27200,7 @@ }; AF688ACA257C04D200C91EAE /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -27102,6 +27217,7 @@ }; AF68A48E19196CF800D41CD1 /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -27118,6 +27234,7 @@ }; AF69E202270BA54600358595 /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -27134,6 +27251,7 @@ }; AF6C6D85226AE4FC0065A748 /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -27150,6 +27268,7 @@ }; AF6E25C3276C3F030032E38F /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -27166,6 +27285,7 @@ }; AF73FF321A09877F00E485E9 /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -27182,6 +27302,7 @@ }; AF75110E1782B5B900380EA1 /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -27198,6 +27319,7 @@ }; AF78D185142DD8F3002AAF77 /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -27214,6 +27336,7 @@ }; AF796D2B26E5C10700DA6562 /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -27225,11 +27348,12 @@ ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX"; + shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX\n"; showEnvVarsInLog = 0; }; AF7ACFD019FF0A9200BD752B /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -27246,6 +27370,7 @@ }; AF7E080115925EE300D81407 /* ICMP Sanity Check */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -27260,6 +27385,7 @@ }; AF7E08021592661100D81407 /* ICMP Sanity Check */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -27270,10 +27396,11 @@ ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "$SOURCE_ROOT/icmp-warning.pl"; + shellScript = "$SOURCE_ROOT/icmp-warning.pl\n"; }; AF81E01125845C2A00CFC475 /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -27290,6 +27417,7 @@ }; AF91898A158FC00A002B5D1E /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -27306,6 +27434,7 @@ }; AF94E7421A16F66900289B93 /* Update Function Table */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -27320,6 +27449,7 @@ }; AF95059525670ECC00C1F257 /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -27336,6 +27466,7 @@ }; AF96014F25758F9F007FA31B /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -27352,6 +27483,7 @@ }; AF998EEA0A083DB30051049D /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -27368,6 +27500,7 @@ }; AFA0B12F241CE69E0071E35D /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -27384,6 +27517,7 @@ }; AFA2119D1CD59DAF00C0D2A1 /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -27400,6 +27534,7 @@ }; AFA3393C0B058505002B0E7D /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -27416,6 +27551,7 @@ }; AFA3D69209C03B5C00E4CFCA /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -27432,6 +27568,7 @@ }; AFA3D69409C03B6200E4CFCA /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -27448,6 +27585,7 @@ }; AFA3D85B09C03BD300E4CFCA /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -27464,6 +27602,7 @@ }; AFA3D85D09C03BD700E4CFCA /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -27480,6 +27619,7 @@ }; AFA3D85F09C03BDA00E4CFCA /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -27496,6 +27636,7 @@ }; AFA3D86109C03BDE00E4CFCA /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -27512,6 +27653,7 @@ }; AFA3D86309C03BE200E4CFCA /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -27528,6 +27670,7 @@ }; AFA3D86509C03BE500E4CFCA /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -27544,6 +27687,7 @@ }; AFA3D86709C03BE800E4CFCA /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -27560,6 +27704,7 @@ }; AFA3D86909C03BEC00E4CFCA /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -27576,6 +27721,7 @@ }; AFA3D86B09C03BEF00E4CFCA /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -27592,6 +27738,7 @@ }; AFA3D86D09C03BF300E4CFCA /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -27608,6 +27755,7 @@ }; AFA3D86F09C03BF700E4CFCA /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -27624,6 +27772,7 @@ }; AFA3D87109C03BFB00E4CFCA /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -27640,6 +27789,7 @@ }; AFA3D87309C03C0000E4CFCA /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -27656,6 +27806,7 @@ }; AFA3D87509C03C0400E4CFCA /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -27672,6 +27823,7 @@ }; AFA3D87709C03C0A00E4CFCA /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -27688,6 +27840,7 @@ }; AFA3D87909C03C1200E4CFCA /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -27704,6 +27857,7 @@ }; AFA3D87B09C03C1700E4CFCA /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -27720,6 +27874,7 @@ }; AFA3D87D09C03C1B00E4CFCA /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -27736,6 +27891,7 @@ }; AFA3D87F09C03C1E00E4CFCA /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -27752,6 +27908,7 @@ }; AFA3D88109C03C2100E4CFCA /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -27768,6 +27925,7 @@ }; AFA3D88309C03C2400E4CFCA /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -27784,6 +27942,7 @@ }; AFA3D88509C03C2700E4CFCA /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -27800,6 +27959,7 @@ }; AFA3D88709C03C2A00E4CFCA /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -27816,6 +27976,7 @@ }; AFA3D88909C03C2E00E4CFCA /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -27832,6 +27993,7 @@ }; AFA3D88B09C03C3200E4CFCA /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -27848,6 +28010,7 @@ }; AFA3D88D09C03C3600E4CFCA /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -27864,6 +28027,7 @@ }; AFA3D88F09C03C3900E4CFCA /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -27880,6 +28044,7 @@ }; AFA3D89109C03C3C00E4CFCA /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -27896,6 +28061,7 @@ }; AFA3D89309C03C4000E4CFCA /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -27912,6 +28078,7 @@ }; AFA3D89509C03C4400E4CFCA /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -27928,6 +28095,7 @@ }; AFA3D89709C03C4700E4CFCA /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -27944,6 +28112,7 @@ }; AFA3D89B09C03C4D00E4CFCA /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -27960,6 +28129,7 @@ }; AFA3D89D09C03C5000E4CFCA /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -27976,6 +28146,7 @@ }; AFA3D89F09C03C5300E4CFCA /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -27992,6 +28163,7 @@ }; AFA3D8A109C03C5600E4CFCA /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -28008,6 +28180,7 @@ }; AFA3D8A309C03C5F00E4CFCA /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -28024,6 +28197,7 @@ }; AFA3D8A509C03C6200E4CFCA /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -28040,6 +28214,7 @@ }; AFA3D8A909C03C6900E4CFCA /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -28056,6 +28231,7 @@ }; AFA3D8AB09C03C6D00E4CFCA /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -28072,6 +28248,7 @@ }; AFA3D8AD09C03C7000E4CFCA /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -28088,6 +28265,7 @@ }; AFA3D8AF09C03C7300E4CFCA /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -28104,6 +28282,7 @@ }; AFA3D8B109C03C7600E4CFCA /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -28120,6 +28299,7 @@ }; AFA3D8B309C03C7900E4CFCA /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -28136,6 +28316,7 @@ }; AFA3D8B509C03C7C00E4CFCA /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -28152,6 +28333,7 @@ }; AFA3D8B709C03C7F00E4CFCA /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -28168,6 +28350,7 @@ }; AFA3D8B909C03C8200E4CFCA /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -28184,6 +28367,7 @@ }; AFA3D8BB09C03C8600E4CFCA /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -28200,6 +28384,7 @@ }; AFA3D8BD09C03C8900E4CFCA /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -28216,6 +28401,7 @@ }; AFA3D8BF09C03C8D00E4CFCA /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -28232,6 +28418,7 @@ }; AFA3D8C109C03C9000E4CFCA /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -28248,6 +28435,7 @@ }; AFA3D8C309C03C9300E4CFCA /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -28264,6 +28452,7 @@ }; AFA3D8C509C03C9600E4CFCA /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -28280,6 +28469,7 @@ }; AFA3D8C709C03C9900E4CFCA /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -28296,6 +28486,7 @@ }; AFA3D8C909C03C9E00E4CFCA /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -28312,6 +28503,7 @@ }; AFA3D8CB09C03CA100E4CFCA /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -28328,6 +28520,7 @@ }; AFA3D8CD09C03CA400E4CFCA /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -28344,6 +28537,7 @@ }; AFA3D8CF09C03CA800E4CFCA /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -28360,6 +28554,7 @@ }; AFA3D8D109C03CAB00E4CFCA /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -28376,6 +28571,7 @@ }; AFA3D8D309C03CAE00E4CFCA /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -28392,6 +28588,7 @@ }; AFA3D8D709C03CB400E4CFCA /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -28408,6 +28605,7 @@ }; AFA3D8D909C03CB700E4CFCA /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -28424,6 +28622,7 @@ }; AFA3D8DB09C03CBA00E4CFCA /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -28440,6 +28639,7 @@ }; AFA3D8DD09C03CBD00E4CFCA /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -28456,6 +28656,7 @@ }; AFA3D8DF09C03CC000E4CFCA /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -28472,6 +28673,7 @@ }; AFA3D8E109C03CC400E4CFCA /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -28488,6 +28690,7 @@ }; AFA3D8E309C03CCA00E4CFCA /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -28504,6 +28707,7 @@ }; AFA3D8E509C03CCD00E4CFCA /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -28520,6 +28724,7 @@ }; AFA3D8E709C03CD100E4CFCA /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -28536,6 +28741,7 @@ }; AFA3D8E909C03CD500E4CFCA /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -28552,6 +28758,7 @@ }; AFA3D8EB09C03CD800E4CFCA /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -28568,6 +28775,7 @@ }; AFA3D8ED09C03CDB00E4CFCA /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -28584,6 +28792,7 @@ }; AFA3D8EF09C03CDE00E4CFCA /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -28600,6 +28809,7 @@ }; AFA3D8F109C03CE100E4CFCA /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -28616,6 +28826,7 @@ }; AFA3D8F309C03CE400E4CFCA /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -28632,6 +28843,7 @@ }; AFA3D8F509C03CE800E4CFCA /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -28648,6 +28860,7 @@ }; AFA3D8F709C03CEA00E4CFCA /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -28664,6 +28877,7 @@ }; AFA3D8F909C03CED00E4CFCA /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -28680,6 +28894,7 @@ }; AFA3D8FB09C03CF100E4CFCA /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -28696,6 +28911,7 @@ }; AFA3D8FD09C03CF400E4CFCA /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -28712,6 +28928,7 @@ }; AFA3D8FF09C03CF700E4CFCA /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -28728,6 +28945,7 @@ }; AFA3D90109C03D0000E4CFCA /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -28744,6 +28962,7 @@ }; AFA3D90309C03D0400E4CFCA /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -28760,6 +28979,7 @@ }; AFA3D90509C03D0700E4CFCA /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -28776,6 +28996,7 @@ }; AFA3D90709C03D0B00E4CFCA /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -28792,6 +29013,7 @@ }; AFA3D90909C03D0E00E4CFCA /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -28808,6 +29030,7 @@ }; AFA3D90B09C03D1100E4CFCA /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -28824,6 +29047,7 @@ }; AFA3D90D09C03D1400E4CFCA /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -28840,6 +29064,7 @@ }; AFA3D90F09C03D1800E4CFCA /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -28856,6 +29081,7 @@ }; AFA3D91109C03D1B00E4CFCA /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -28872,6 +29098,7 @@ }; AFA3D91309C03D1E00E4CFCA /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -28888,6 +29115,7 @@ }; AFA3D91509C03D2100E4CFCA /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -28904,6 +29132,7 @@ }; AFA3D91709C03D2400E4CFCA /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -28920,6 +29149,7 @@ }; AFA3D91909C03D2700E4CFCA /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -28936,6 +29166,7 @@ }; AFA3D91D09C03D3000E4CFCA /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -28952,6 +29183,7 @@ }; AFA3D91F09C03D3300E4CFCA /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -28968,6 +29200,7 @@ }; AFA3D92109C03D3600E4CFCA /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -28984,6 +29217,7 @@ }; AFA3D92309C03D3A00E4CFCA /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -29000,6 +29234,7 @@ }; AFA3D92509C03D3D00E4CFCA /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -29016,6 +29251,7 @@ }; AFA3D92709C03D4000E4CFCA /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -29032,6 +29268,7 @@ }; AFA3D92909C03D4400E4CFCA /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -29048,6 +29285,7 @@ }; AFA3D92B09C03D4700E4CFCA /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -29064,6 +29302,7 @@ }; AFA3D92D09C03D4A00E4CFCA /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -29080,6 +29319,7 @@ }; AFA3D92F09C03D4E00E4CFCA /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -29096,6 +29336,7 @@ }; AFA3D93109C03D5100E4CFCA /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -29112,6 +29353,7 @@ }; AFA3D93309C03D5400E4CFCA /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -29128,6 +29370,7 @@ }; AFA3D93509C03D5700E4CFCA /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -29144,6 +29387,7 @@ }; AFA3D93709C03D5B00E4CFCA /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -29160,6 +29404,7 @@ }; AFA3D93909C03D5E00E4CFCA /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -29176,6 +29421,7 @@ }; AFA3D93B09C03D6200E4CFCA /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -29192,6 +29438,7 @@ }; AFA3D93D09C03D6C00E4CFCA /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -29208,6 +29455,7 @@ }; AFA3D93F09C03D6F00E4CFCA /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -29224,6 +29472,7 @@ }; AFA3D94109C03D7200E4CFCA /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -29240,6 +29489,7 @@ }; AFA3D94309C03D7600E4CFCA /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -29256,6 +29506,7 @@ }; AFA3D94509C03D7A00E4CFCA /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -29272,6 +29523,7 @@ }; AFA3D94709C03D7E00E4CFCA /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -29288,6 +29540,7 @@ }; AFA3D94909C03D8100E4CFCA /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -29304,6 +29557,7 @@ }; AFA3D94B09C03D8500E4CFCA /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -29315,11 +29569,12 @@ ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX"; + shellScript = "$SOURCE_ROOT/update-info-plist.pl -q $BUILT_PRODUCTS_DIR/$PRODUCT_NAME$WRAPPER_SUFFIX\n"; showEnvVarsInLog = 0; }; AFA3D94D09C03D8D00E4CFCA /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -29336,6 +29591,7 @@ }; AFA3D94F09C03D9100E4CFCA /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -29352,6 +29608,7 @@ }; AFA3D95109C03D9400E4CFCA /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -29368,6 +29625,7 @@ }; AFA3D95309C03D9800E4CFCA /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -29384,6 +29642,7 @@ }; AFA3D95509C03D9C00E4CFCA /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -29400,6 +29659,7 @@ }; AFA3D95709C03DA100E4CFCA /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -29416,6 +29676,7 @@ }; AFA3D95909C03DA400E4CFCA /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -29432,6 +29693,7 @@ }; AFA3D95B09C03DA800E4CFCA /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -29448,6 +29710,7 @@ }; AFA3D95D09C03DAB00E4CFCA /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -29464,6 +29727,7 @@ }; AFA3D95F09C03DAE00E4CFCA /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -29480,6 +29744,7 @@ }; AFA3D96109C03DB100E4CFCA /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -29496,6 +29761,7 @@ }; AFA3D96309C03DB500E4CFCA /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -29512,6 +29778,7 @@ }; AFA3D96509C03DB900E4CFCA /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -29528,6 +29795,7 @@ }; AFA3D96709C03DBC00E4CFCA /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -29544,6 +29812,7 @@ }; AFA3D96909C03DBF00E4CFCA /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -29560,6 +29829,7 @@ }; AFA3D96B09C03DC600E4CFCA /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -29576,6 +29846,7 @@ }; AFA3D96D09C03DCA00E4CFCA /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -29592,6 +29863,7 @@ }; AFA3D96F09C03DCD00E4CFCA /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -29608,6 +29880,7 @@ }; AFA3D97109C03DD000E4CFCA /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -29624,6 +29897,7 @@ }; AFA3D97309C03DD300E4CFCA /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -29640,6 +29914,7 @@ }; AFA3D97509C03DD700E4CFCA /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -29656,6 +29931,7 @@ }; AFA3D97709C03DDA00E4CFCA /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -29672,6 +29948,7 @@ }; AFA3D97909C03DDD00E4CFCA /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -29688,6 +29965,7 @@ }; AFA3D97B09C03DE000E4CFCA /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -29704,6 +29982,7 @@ }; AFA3D97D09C03DE400E4CFCA /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -29720,6 +29999,7 @@ }; AFA3D97F09C03DE700E4CFCA /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -29736,6 +30016,7 @@ }; AFA3D98109C03DEA00E4CFCA /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -29752,6 +30033,7 @@ }; AFA3D98309C03DEE00E4CFCA /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -29768,6 +30050,7 @@ }; AFA3D98509C03DF100E4CFCA /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -29784,6 +30067,7 @@ }; AFA3D98709C03DF400E4CFCA /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -29800,6 +30084,7 @@ }; AFA3D98909C03DF700E4CFCA /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -29816,6 +30101,7 @@ }; AFA3D98B09C03DFC00E4CFCA /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -29832,6 +30118,7 @@ }; AFA3D98D09C03E0500E4CFCA /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -29848,6 +30135,7 @@ }; AFA3D98F09C03E0F00E4CFCA /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -29864,6 +30152,7 @@ }; AFA3D99109C03E1200E4CFCA /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -29880,6 +30169,7 @@ }; AFA3D99309C03E1600E4CFCA /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -29896,6 +30186,7 @@ }; AFA3D99509C03E1900E4CFCA /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -29912,6 +30203,7 @@ }; AFA3D99709C03E1C00E4CFCA /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -29928,6 +30220,7 @@ }; AFA3D99909C03E2000E4CFCA /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -29944,6 +30237,7 @@ }; AFA3D99B09C03E2300E4CFCA /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -29960,6 +30254,7 @@ }; AFA3D99D09C03E2600E4CFCA /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -29976,6 +30271,7 @@ }; AFA3D99F09C03E2900E4CFCA /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -29992,6 +30288,7 @@ }; AFA3D9A109C03E2E00E4CFCA /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -30008,6 +30305,7 @@ }; AFA3D9A309C03E3200E4CFCA /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -30024,6 +30322,7 @@ }; AFA3D9A509C03E3600E4CFCA /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -30040,6 +30339,7 @@ }; AFA3D9A709C03E3A00E4CFCA /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -30056,6 +30356,7 @@ }; AFA3D9A909C03E3D00E4CFCA /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -30072,6 +30373,7 @@ }; AFA3D9AB09C03E4200E4CFCA /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -30088,6 +30390,7 @@ }; AFA3D9AD09C03E4600E4CFCA /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -30104,6 +30407,7 @@ }; AFA3D9AF09C03E4B00E4CFCA /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -30120,6 +30424,7 @@ }; AFA3D9B109C03E4E00E4CFCA /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -30136,6 +30441,7 @@ }; AFA3D9B309C03E5100E4CFCA /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -30152,6 +30458,7 @@ }; AFA3D9B509C03E5700E4CFCA /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -30168,6 +30475,7 @@ }; AFA3D9B709C03E5B00E4CFCA /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -30184,6 +30492,7 @@ }; AFA3D9B909C03E5E00E4CFCA /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -30200,6 +30509,7 @@ }; AFA3D9BB09C03E6200E4CFCA /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -30216,6 +30526,7 @@ }; AFA3D9BD09C03E6500E4CFCA /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -30232,6 +30543,7 @@ }; AFA3D9BF09C03E6900E4CFCA /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -30248,6 +30560,7 @@ }; AFA3D9C109C03E6E00E4CFCA /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -30264,6 +30577,7 @@ }; AFA3D9C309C03E7100E4CFCA /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -30280,6 +30594,7 @@ }; AFA3D9C509C03E7400E4CFCA /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -30296,6 +30611,7 @@ }; AFA3D9C709C03E7800E4CFCA /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -30312,6 +30628,7 @@ }; AFA3D9C909C03E7C00E4CFCA /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -30328,6 +30645,7 @@ }; AFA3D9CB09C03E7F00E4CFCA /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -30344,6 +30662,7 @@ }; AFA3D9CD09C03E8400E4CFCA /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -30360,6 +30679,7 @@ }; AFA3D9CF09C03E8700E4CFCA /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -30376,6 +30696,7 @@ }; AFA3D9D109C03E8B00E4CFCA /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -30392,6 +30713,7 @@ }; AFA3D9D309C03E8F00E4CFCA /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -30408,6 +30730,7 @@ }; AFA3D9D509C03E9300E4CFCA /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -30424,6 +30747,7 @@ }; AFA3DBA209C0424C00E4CFCA /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -30440,6 +30764,7 @@ }; AFA6AB0120999950006D2685 /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -30456,6 +30781,7 @@ }; AFAAE398207D6343007A515C /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -30472,6 +30798,7 @@ }; AFACE8841CC83458008B24CD /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -30488,6 +30815,7 @@ }; AFADD33C24B67100005456DC /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -30504,6 +30832,7 @@ }; AFAE1480279275BE00C62683 /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -30520,6 +30849,7 @@ }; AFB591B6178B812C00EA4005 /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -30536,6 +30866,7 @@ }; AFB9B5C12426A0EA00A5740D /* Copy WebCollage Perl */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -30554,6 +30885,7 @@ }; AFBFE75A178642DC00432B21 /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -30570,6 +30902,7 @@ }; AFBFE77A178647FE00432B21 /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -30586,6 +30919,7 @@ }; AFBFE78817894FFA00432B21 /* Copy Standalone Preferences XML File */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -30600,6 +30934,7 @@ }; AFBFE78917895AAF00432B21 /* Copy Standalone Preferences XML File */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -30614,6 +30949,7 @@ }; AFC0E8BC1CDC601A008CAFAC /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -30630,6 +30966,7 @@ }; AFC5CFE72044AA23004CEB5E /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -30646,6 +30983,7 @@ }; AFCCCBB509C033DF00353F4D /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -30662,6 +31000,7 @@ }; AFCCCBC709C03AAF00353F4D /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -30678,6 +31017,7 @@ }; AFCCCBCB09C03AEE00353F4D /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -30694,6 +31034,7 @@ }; AFCCCBCD09C03AF400353F4D /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -30710,6 +31051,7 @@ }; AFCCCBCF09C03AF800353F4D /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -30726,6 +31068,7 @@ }; AFCCCBD109C03AFC00353F4D /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -30742,6 +31085,7 @@ }; AFCCCBD309C03B0000353F4D /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -30758,6 +31102,7 @@ }; AFCCCBD509C03B0500353F4D /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -30774,6 +31119,7 @@ }; AFCF834C1AF5B515008BB7E1 /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -30790,6 +31136,7 @@ }; AFD51B2C0F063B4A00471C02 /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -30806,6 +31153,7 @@ }; AFD704D328308724002A8EB0 /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -30822,6 +31170,7 @@ }; AFD77E6C20C23F8600A3638D /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -30838,6 +31187,7 @@ }; AFDA659D178A52B70070D24B /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -30854,6 +31204,7 @@ }; AFE2A4660E2E904600ADB298 /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -30870,6 +31221,7 @@ }; AFE30BF80E52B14700CCF4A5 /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -30886,6 +31238,7 @@ }; AFE6A1930CDD7B2E002805BF /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -30902,6 +31255,7 @@ }; AFE6A4290CDD7FAA002805BF /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -30918,6 +31272,7 @@ }; AFEC23DE1CB6EAE100DE138F /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -30934,6 +31289,7 @@ }; AFEE105E1D13406000AAC8F7 /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -30950,6 +31306,7 @@ }; AFEE107D1D15EB0800AAC8F7 /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -30966,6 +31323,7 @@ }; AFEE109C1D17E20B00AAC8F7 /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -30982,6 +31340,7 @@ }; AFF2868E17860E830050A578 /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -30998,6 +31357,7 @@ }; AFF3C9F717CCAC440028F240 /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -31014,6 +31374,7 @@ }; AFF449F12275494400DB8EDB /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -31030,6 +31391,7 @@ }; AFF463430C4403E400EE6509 /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -31046,6 +31408,7 @@ }; AFF463680C440AEF00EE6509 /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -31062,6 +31425,7 @@ }; AFFAB32519158CE40020F021 /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -31078,6 +31442,7 @@ }; CE3D01621B76F4C100993C75 /* Run Update Info Plist */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -31118,6 +31483,15 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + AF0BF6D229456B2E000D9473 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + AF0BF6E729456C32000D9473 /* hextrail.c in Sources */, + AF0BF6D429456B2E000D9473 /* XScreenSaverSubclass.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; AF0DC7B00C4C73F600D76972 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; @@ -32003,7 +32377,6 @@ AF568A5626E7060500CCBA38 /* textclient-mobile.c in Sources */, AF568A5726E7060500CCBA38 /* tessellimage.c in Sources */, AF568A5826E7060500CCBA38 /* triangle.c in Sources */, - AF568A5926E7060500CCBA38 /* thornbird.c in Sources */, AF568A5A26E7060500CCBA38 /* truchet.c in Sources */, AF568A5B26E7060500CCBA38 /* twang.c in Sources */, AF568A5C26E7060500CCBA38 /* vermiculate.c in Sources */, @@ -32102,6 +32475,7 @@ AF568AB626E7060500CCBA38 /* headroom.c in Sources */, AF568AB726E7060500CCBA38 /* headroom_model.c in Sources */, AF568AB826E7060500CCBA38 /* hexstrut.c in Sources */, + AF0BF6E929456CEB000D9473 /* hextrail.c in Sources */, AF568AB926E7060500CCBA38 /* hilbert.c in Sources */, AF568ABA26E7060500CCBA38 /* hydrostat.c in Sources */, AF568ABB26E7060500CCBA38 /* hypertorus.c in Sources */, @@ -32766,7 +33140,6 @@ AFA211891CD1AA2E00C0D2A1 /* textclient-mobile.c in Sources */, AF68A49A19196E3E00D41CD1 /* tessellimage.c in Sources */, AF918A25158FC38A002B5D1E /* triangle.c in Sources */, - AF918A24158FC38A002B5D1E /* thornbird.c in Sources */, AF9189EF158FC35D002B5D1E /* truchet.c in Sources */, AF9189F0158FC35D002B5D1E /* twang.c in Sources */, AF9189F1158FC35D002B5D1E /* vermiculate.c in Sources */, @@ -32865,6 +33238,7 @@ AF96015D25759124007FA31B /* headroom.c in Sources */, AF96015B25759124007FA31B /* headroom_model.c in Sources */, AF1B0FC31D7AB5500011DBE4 /* hexstrut.c in Sources */, + AF0BF6E829456CCC000D9473 /* hextrail.c in Sources */, AF918A6A158FC3E5002B5D1E /* hilbert.c in Sources */, AFC0E8C41CDC60B0008CAFAC /* hydrostat.c in Sources */, AF918A6B158FC3E5002B5D1E /* hypertorus.c in Sources */, @@ -34441,6 +34815,16 @@ target = AF4808C0098C3B6C00FB32B8 /* jwxyz */; targetProxy = AF083A34099311D700277BE9 /* PBXContainerItemProxy */; }; + AF0BF6CE29456B2E000D9473 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = AF4808C0098C3B6C00FB32B8 /* jwxyz */; + targetProxy = AF0BF6CF29456B2E000D9473 /* PBXContainerItemProxy */; + }; + AF0BF6ED29456D50000D9473 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = AF0BF6CD29456B2E000D9473 /* Hextrail */; + targetProxy = AF0BF6EC29456D50000D9473 /* PBXContainerItemProxy */; + }; AF0DC7AC0C4C73F600D76972 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = AF4808C0098C3B6C00FB32B8 /* jwxyz */; @@ -35786,11 +36170,6 @@ target = AFD570850996B80300BA26F7 /* Triangle */; targetProxy = AF77799409B6608000EA3033 /* PBXContainerItemProxy */; }; - AF77799709B6608100EA3033 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = AFD571590996C0CE00BA26F7 /* Thornbird */; - targetProxy = AF77799609B6608100EA3033 /* PBXContainerItemProxy */; - }; AF77799909B6608100EA3033 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = AFD572220996E4A300BA26F7 /* Swirl */; @@ -37131,6 +37510,11 @@ target = AF4808C0098C3B6C00FB32B8 /* jwxyz */; targetProxy = AFD5735F0997411200BA26F7 /* PBXContainerItemProxy */; }; + AFD6F2A728ED13B4007FAE82 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = AFD571590996C0CE00BA26F7 /* Thornbird */; + targetProxy = AFD6F2A628ED13B4007FAE82 /* PBXContainerItemProxy */; + }; AFD704C328308724002A8EB0 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = AF4808C0098C3B6C00FB32B8 /* jwxyz */; @@ -37371,6 +37755,28 @@ }; name = Release; }; + AF0BF6E029456B2E000D9473 /* 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; + }; + AF0BF6E129456B2E000D9473 /* 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; + }; AF0DC7BB0C4C73F600D76972 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { @@ -42117,7 +42523,6 @@ }; C01FCF4F08A954540054247B /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = AF94E7411A16E93600289B93 /* xscreensaver.xcconfig */; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; ARCHS = "$(ARCHS_STANDARD)"; @@ -42146,6 +42551,7 @@ "CODE_SIGN_IDENTITY[sdk=macosx*]" = "Apple Development"; CODE_SIGN_INJECT_BASE_ENTITLEMENTS = YES; COMBINE_HIDPI_IMAGES = YES; + DEAD_CODE_STRIPPING = YES; DEVELOPMENT_TEAM = 4627ATJELP; ENABLE_HARDENED_RUNTIME = YES; ENABLE_STRICT_OBJC_MSGSEND = YES; @@ -42210,6 +42616,7 @@ INSTALL_PATH = "$(HOME)/Library/Screen Savers"; IPHONEOS_DEPLOYMENT_TARGET = 12.0; LIBRARY_SEARCH_PATHS = "$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)"; + MACOSX_DEPLOYMENT_TARGET = 10.13; ONLY_ACTIVE_ARCH = YES; OTHER_CFLAGS = ""; "OTHER_CFLAGS[sdk=macosx*]" = "$(OBJC_GC_CFLAGS)"; @@ -42222,7 +42629,10 @@ "SDKROOT[arch=arm*]" = iphoneos; SYMROOT = "$(SRCROOT)/build"; TARGETED_DEVICE_FAMILY = "1,2"; - USER_HEADER_SEARCH_PATHS = "$(PROJECT_DIR) $(USER_HEADER_SEARCH_PATHS)"; + USER_HEADER_SEARCH_PATHS = ( + "$(PROJECT_DIR)", + "$(USER_HEADER_SEARCH_PATHS)", + ); VALIDATE_WORKSPACE_SKIPPED_SDK_FRAMEWORKS = "OpenGL OpenGLES AssetsLibrary"; WARNING_CFLAGS = "-Wimplicit"; WRAPPER_EXTENSION = saver; @@ -42231,7 +42641,6 @@ }; C01FCF5008A954540054247B /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = AF94E7411A16E93600289B93 /* xscreensaver.xcconfig */; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; ARCHS = "$(ARCHS_STANDARD)"; @@ -42260,6 +42669,7 @@ "CODE_SIGN_IDENTITY[sdk=macosx*]" = "Developer ID Application: Jamie Zawinski (4627ATJELP)"; CODE_SIGN_INJECT_BASE_ENTITLEMENTS = NO; COMBINE_HIDPI_IMAGES = YES; + DEAD_CODE_STRIPPING = YES; DEVELOPMENT_TEAM = 4627ATJELP; ENABLE_HARDENED_RUNTIME = YES; ENABLE_STRICT_OBJC_MSGSEND = YES; @@ -42324,6 +42734,7 @@ LIBRARY_SEARCH_PATHS = "$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)"; LLVM_LTO = NO; "LLVM_LTO[sdk=macosx*]" = NO; + MACOSX_DEPLOYMENT_TARGET = 10.13; OTHER_CFLAGS = ""; "OTHER_CFLAGS[sdk=macosx*]" = "$(OBJC_GC_CFLAGS)"; OTHER_CODE_SIGN_FLAGS = "--timestamp"; @@ -42335,7 +42746,10 @@ "SDKROOT[arch=arm*]" = iphoneos; SYMROOT = "$(SRCROOT)/build"; TARGETED_DEVICE_FAMILY = "1,2"; - USER_HEADER_SEARCH_PATHS = "$(PROJECT_DIR) $(USER_HEADER_SEARCH_PATHS)"; + USER_HEADER_SEARCH_PATHS = ( + "$(PROJECT_DIR)", + "$(USER_HEADER_SEARCH_PATHS)", + ); VALIDATE_PRODUCT = YES; VALIDATE_WORKSPACE_SKIPPED_SDK_FRAMEWORKS = "OpenGL OpenGLES AssetsLibrary"; WARNING_CFLAGS = "-Wimplicit"; @@ -42376,6 +42790,15 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; + AF0BF6DF29456B2E000D9473 /* Build configuration list for PBXNativeTarget "Hextrail" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + AF0BF6E029456B2E000D9473 /* Debug */, + AF0BF6E129456B2E000D9473 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; AF0DC7BA0C4C73F600D76972 /* Build configuration list for PBXNativeTarget "m6502" */ = { isa = XCConfigurationList; buildConfigurations = ( diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Abstractile.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Abstractile.xcscheme index 72ed126c..5d48aaba 100644 --- a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Abstractile.xcscheme +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Abstractile.xcscheme @@ -1,6 +1,6 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Hilbert.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Hilbert.xcscheme index 3fd086f2..73c6d318 100644 --- a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Hilbert.xcscheme +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Hilbert.xcscheme @@ -1,6 +1,6 @@ + LastUpgradeVersion = "1410" + version = "1.8"> diff --git a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Splodesic.xcscheme b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Splodesic.xcscheme index f37c1763..dd3355e4 100644 --- a/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Splodesic.xcscheme +++ b/OSX/xscreensaver.xcodeproj/xcshareddata/xcschemes/Splodesic.xcscheme @@ -1,6 +1,6 @@ &5 -printf %s "checking for XReadDisplay headers... " >&6; } - d=$with_readdisplay/include - if test -d $d; then - X_CFLAGS="-I$d $X_CFLAGS" - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $d" >&5 -printf "%s\n" "$d" >&6; } - else - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: not found ($d: no such directory)" >&5 -printf "%s\n" "not found ($d: no such directory)" >&6; } - fi - - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for XReadDisplay libs" >&5 -printf %s "checking for XReadDisplay libs... " >&6; } - d=$with_readdisplay/lib - if test -d $d; then - X_LIBS="-L$d $X_LIBS" - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $d" >&5 -printf "%s\n" "$d" >&6; } - else - { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: not found ($d: no such directory)" >&5 -printf "%s\n" "not found ($d: no such directory)" >&6; } - fi - - # replace the directory string with "yes". - with_readdisplay_req="yes" - with_readdisplay=$with_readdisplay_req - ;; - - *) - echo "" - echo "error: argument to --with-readdisplay must be \"yes\", \"no\", or a directory." - echo " If it is a directory, then \`DIR/include' will be added to" - echo " the -I list, and \`DIR/lib' will be added to the -L list." - exit 1 - ;; - esac - -if test "$with_readdisplay" = yes; then - - ac_save_CPPFLAGS="$CPPFLAGS" - if test \! -z "$includedir" ; then - CPPFLAGS="$CPPFLAGS -I$includedir" - fi - CPPFLAGS="$CPPFLAGS $X_CFLAGS" - CPPFLAGS=`eval eval eval eval eval eval eval eval eval echo $CPPFLAGS` - ac_fn_c_check_header_compile "$LINENO" "X11/extensions/readdisplay.h" "ac_cv_header_X11_extensions_readdisplay_h" "#include -" -if test "x$ac_cv_header_X11_extensions_readdisplay_h" = xyes -then : - printf "%s\n" "#define HAVE_READ_DISPLAY_EXTENSION 1" >>confdefs.h - -fi - - CPPFLAGS="$ac_save_CPPFLAGS" -elif test "$with_readdisplay" != no; then - echo "error: must be yes or no: --with-readdisplay=$with_readdisplay" - exit 1 -fi - ############################################################################### # # Check for the XSHM server extension. @@ -14987,7 +14903,7 @@ if test "$with_gtk" = yes; then pkgs='' ok="yes" - pkg_check_version gtk+-3.0 2.22.0 ; ac_gtk_version_string="$vers" + pkg_check_version gtk+-3.0 3.0.0 ; ac_gtk_version_string="$vers" pkg_check_version gmodule-2.0 2.0.0 pkg_check_version libxml-2.0 2.4.6 pkg_check_version gdk-pixbuf-2.0 2.0.0 @@ -15029,7 +14945,7 @@ printf "%s\n" "$ac_cv_gtk_config_libs" >&6; } GTK_DATADIR="" if test "$have_gtk" = yes; then - GTK_DATADIR=`$pkg_config --variable=prefix gtk+-2.0` + GTK_DATADIR=`$pkg_config --variable=prefix gtk+-3.0` GTK_DATADIR="$GTK_DATADIR/share" fi @@ -22039,7 +21955,7 @@ fi if test "$with_pam_req" = yes -a "$have_pam" = no ; then warn 'Use of PAM was requested, but it was not found.' CONF_STATUS=1 -elif test "$have_pam" = no ; then +elif test "$have_pam" = no -a "$enable_locking" = yes ; then if test -d /etc/pam.d -o -f /etc/pam.conf ; then warn "Your system seems to have PAM, but PAM is not being used." warn2 "That is probably not going to work out well." diff --git a/configure.ac b/configure.ac index 9998d051..1c42d048 100644 --- a/configure.ac +++ b/configure.ac @@ -76,9 +76,6 @@ AH_TEMPLATE([HAVE_LIBCAP], AH_TEMPLATE([XPointer], [Stare into the void.]) -AH_TEMPLATE([HAVE_READ_DISPLAY_EXTENSION], - [Define this if you have the SGI XReadDisplay extension.]) - AH_TEMPLATE([HAVE_XINPUT], [Define this if you have the XInput2 extension.]) @@ -1798,31 +1795,6 @@ elif test "$with_sgivc" != no; then fi -############################################################################### -# -# Check for the SGI XReadDisplay server extension. -# -############################################################################### - -have_readdisplay=no -with_readdisplay_req=unspecified -AC_ARG_WITH(readdisplay, -[ --with-readdisplay Include support for the SGI XReadDisplay extension.], - [with_readdisplay="$withval"; with_readdisplay_req="$withval"], - [with_readdisplay=$ac_irix]) - -HANDLE_X_PATH_ARG(with_readdisplay, --with-readdisplay, XReadDisplay) - -if test "$with_readdisplay" = yes; then - AC_CHECK_X_HEADER(X11/extensions/readdisplay.h, - AC_DEFINE(HAVE_READ_DISPLAY_EXTENSION),, - [#include ]) -elif test "$with_readdisplay" != no; then - echo "error: must be yes or no: --with-readdisplay=$with_readdisplay" - exit 1 -fi - - ############################################################################### # # Check for the XSHM server extension. @@ -2796,7 +2768,7 @@ if test "$with_gtk" = yes; then pkgs='' ok="yes" - pkg_check_version gtk+-3.0 2.22.0 ; ac_gtk_version_string="$vers" + pkg_check_version gtk+-3.0 3.0.0 ; ac_gtk_version_string="$vers" pkg_check_version gmodule-2.0 2.0.0 pkg_check_version libxml-2.0 2.4.6 pkg_check_version gdk-pixbuf-2.0 2.0.0 @@ -2822,7 +2794,7 @@ if test "$with_gtk" = yes; then GTK_DATADIR="" if test "$have_gtk" = yes; then - GTK_DATADIR=`$pkg_config --variable=prefix gtk+-2.0` + GTK_DATADIR=`$pkg_config --variable=prefix gtk+-3.0` GTK_DATADIR="$GTK_DATADIR/share" fi @@ -4856,7 +4828,7 @@ fi if test "$with_pam_req" = yes -a "$have_pam" = no ; then warn 'Use of PAM was requested, but it was not found.' CONF_STATUS=1 -elif test "$have_pam" = no ; then +elif test "$have_pam" = no -a "$enable_locking" = yes ; then if test -d /etc/pam.d -o -f /etc/pam.conf ; then warn "Your system seems to have PAM, but PAM is not being used." warn2 "That is probably not going to work out well." diff --git a/driver/Makefile.in b/driver/Makefile.in index c25494ac..6eca4c31 100644 --- a/driver/Makefile.in +++ b/driver/Makefile.in @@ -120,6 +120,7 @@ GFX_OBJS = xscreensaver-gfx.o screens.o windows.o subprocs.o \ $(UTILS_BIN)/font-retry.o \ $(UTILS_BIN)/logo.o \ $(UTILS_BIN)/minixpm.o \ + $(UTILS_BIN)/screenshot.o \ $(UTILS_BIN)/xft.o \ $(UTILS_BIN)/utf8wc.o \ $(UTILS_BIN)/xshm.o \ @@ -183,6 +184,7 @@ GTK_OBJS = demo-Gtk.o demo-Gtk-conf.o demo-Gtk-resources.o \ $(UTILS_BIN)/xmu.o \ $(UTILS_BIN)/resources.o \ $(UTILS_BIN)/visual.o \ + $(UTILS_BIN)/screenshot.o \ $(UTILS_BIN)/usleep.o GTK_LIBS = $(LIBS_PRE) $(INTL_LIBS) $(XDPMS_LIBS) \ $(XINERAMA_LIBS) $(XML_LIBS) @GTK_LIBS@ \ @@ -770,7 +772,7 @@ $(UTILS_BIN)/yarandom.o: $(UTILS_SRC)/yarandom.c $(UTILS_BIN)/colorbars.o: $(UTILS_SRC)/colorbars.c $(UTILS_BIN)/hsv.o: $(UTILS_SRC)/hsv.c $(UTILS_BIN)/colors.o: $(UTILS_SRC)/colors.c -$(UTILS_BIN)/grabscreen.o: $(UTILS_SRC)/grabscreen.c +$(UTILS_BIN)/grabclient.o: $(UTILS_SRC)/grabclient.c $(UTILS_BIN)/utf8wc.o: $(UTILS_SRC)/utf8wc.c $(UTILS_BIN)/xftwrap.o: $(UTILS_SRC)/xftwrap.c $(UTILS_BIN)/font-retry.o: $(UTILS_SRC)/font-retry.c @@ -789,7 +791,7 @@ UTIL_OBJS = $(UTILS_BIN)/overlay.o \ $(UTILS_BIN)/colorbars.o \ $(UTILS_BIN)/hsv.o \ $(UTILS_BIN)/colors.o \ - $(UTILS_BIN)/grabscreen.o \ + $(UTILS_BIN)/grabclient.o \ $(UTILS_BIN)/xft.o \ $(UTILS_BIN)/xftwrap.o \ $(UTILS_BIN)/utf8wc.o \ @@ -861,7 +863,7 @@ demo-Gtk-conf.o: demo-Gtk-conf.c GCRARGS = --sourcedir=$(srcdir) --sourcedir=$(ICON_SRC) --generate-source demo-Gtk-resources.c: gresource.xml demo.ui prefs.ui - $(GLIB_COMPILE_RESOURCES) gresource.xml --target=$@ $(GCRARGS) + $(GLIB_COMPILE_RESOURCES) $(srcdir)/gresource.xml --target=$@ $(GCRARGS) GTK_WARNINGS = -Wno-long-long -Wno-c99-extensions -Wno-pedantic demo-Gtk-resources.o: demo-Gtk-resources.c @@ -992,6 +994,7 @@ xdpyinfo: xdpyinfo.o # # DO NOT DELETE: updated by make distdepend +demo-Gtk-conf.o: $(srcdir)/blurb.h demo-Gtk-conf.o: ../config.h demo-Gtk-conf.o: $(srcdir)/demo-Gtk-conf.h demo-Gtk-conf.o: $(UTILS_SRC)/xscreensaver-intl.h @@ -1004,6 +1007,7 @@ demo-Gtk.o: $(srcdir)/remote.h demo-Gtk.o: $(srcdir)/screens.h demo-Gtk.o: $(srcdir)/types.h demo-Gtk.o: $(UTILS_SRC)/resources.h +demo-Gtk.o: $(UTILS_SRC)/screenshot.h demo-Gtk.o: $(UTILS_SRC)/usleep.h demo-Gtk.o: $(UTILS_SRC)/version.h demo-Gtk.o: $(UTILS_SRC)/visual.h diff --git a/driver/XScreenSaver.ad.in b/driver/XScreenSaver.ad.in index 2d434075..49635b08 100644 --- a/driver/XScreenSaver.ad.in +++ b/driver/XScreenSaver.ad.in @@ -4,8 +4,8 @@ ! a screen saver and locker for the X window system ! by Jamie Zawinski ! -! version 6.04 -! 29-May-2022 +! version 6.05 +! 04-Oct-2022 ! ! See "man xscreensaver" for more info. The latest version is always ! available at https://www.jwz.org/xscreensaver/ @@ -98,7 +98,7 @@ ! non-Gnome systems: ! @NOGNOME@*loadURL: x-www-browser '%s' || firefox '%s' || chromium-browser '%s' -@NOGNOME@*manualCommand: xterm -sb -fg black -bg gray75 -T '%s manual' \ +@NOGNOME@*manualCommand: lxterminal -T '%s manual' \ @NOGNOME@ -e /bin/sh -c 'man "%s" ; read foo' @@ -324,254 +324,254 @@ XScreenSaver.bourneShell: /bin/sh !============================================================================= *programs: \ - maze -root \n\ -@GL_KLUDGE@ GL: superquadrics -root \n\ - attraction -root \n\ - blitspin -root \n\ - greynetic -root \n\ - helix -root \n\ - hopalong -root \n\ - imsmap -root \n\ -- noseguy -root \n\ -- pyro -root \n\ - qix -root \n\ -- rocks -root \n\ - rorschach -root \n\ - decayscreen -root \n\ - flame -root \n\ - halo -root \n\ - slidescreen -root \n\ - pedal -root \n\ - bouboule -root \n\ -- braid -root \n\ - coral -root \n\ - deco -root \n\ - drift -root \n\ -- fadeplot -root \n\ - galaxy -root \n\ - goop -root \n\ - grav -root \n\ - ifs -root \n\ -@GL_KLUDGE@ GL: jigsaw -root \n\ - julia -root \n\ -- kaleidescope -root \n\ -@GL_KLUDGE@ GL: moebius -root \n\ - moire -root \n\ -@GL_KLUDGE@ GL: morph3d -root \n\ - mountain -root \n\ - munch -root \n\ - penrose -root \n\ -@GL_KLUDGE@ GL: pipes -root \n\ - rdbomb -root \n\ -@GL_KLUDGE@ GL: rubik -root \n\ -- sierpinski -root \n\ - slip -root \n\ -@GL_KLUDGE@ GL: sproingies -root \n\ - starfish -root \n\ - strange -root \n\ - swirl -root \n\ - triangle -root \n\ - xjack -root \n\ - xlyap -root \n\ -@GL_KLUDGE@ GL: atlantis -root \n\ - bsod -root \n\ -@GL_KLUDGE@ GL: bubble3d -root \n\ -@GL_KLUDGE@ GL: cage -root \n\ -- crystal -root \n\ - cynosure -root \n\ - discrete -root \n\ - distort -root \n\ - epicycle -root \n\ - flow -root \n\ -@GL_KLUDGE@ GL: glplanet -root \n\ - interference -root \n\ - kumppa -root \n\ -@GL_KLUDGE@ GL: lament -root \n\ - moire2 -root \n\ -@GL_KLUDGE@ GL: sonar -root \n\ -@GL_KLUDGE@ GL: stairs -root \n\ - truchet -root \n\ -- vidwhacker -root \n\ - blaster -root \n\ - bumps -root \n\ - ccurve -root \n\ - compass -root \n\ - deluxe -root \n\ -- demon -root \n\ -@GLE_KLUDGE@ GL: extrusion -root \n\ -- loop -root \n\ - penetrate -root \n\ - petri -root \n\ - phosphor -root \n\ -@GL_KLUDGE@ GL: pulsar -root \n\ - ripples -root \n\ - shadebobs -root \n\ -@GL_KLUDGE@ GL: sierpinski3d -root \n\ - spotlight -root \n\ - squiral -root \n\ - wander -root \n\ -- webcollage -root \n\ - xflame -root \n\ - xmatrix -root \n\ -@GL_KLUDGE@ GL: gflux -root \n\ -- nerverot -root \n\ - xrayswarm -root \n\ - xspirograph -root \n\ -@GL_KLUDGE@ GL: circuit -root \n\ -@GL_KLUDGE@ GL: dangerball -root \n\ -- GL: dnalogo -root \n\ -@GL_KLUDGE@ GL: engine -root \n\ -@GL_KLUDGE@ GL: flipscreen3d -root \n\ -@GL_KLUDGE@ GL: gltext -root \n\ -@GL_KLUDGE@ GL: menger -root \n\ -@GL_KLUDGE@ GL: molecule -root \n\ - rotzoomer -root \n\ - scooter -root \n\ - speedmine -root \n\ -@GL_KLUDGE@ GL: starwars -root \n\ -@GL_KLUDGE@ GL: stonerview -root \n\ - vermiculate -root \n\ - whirlwindwarp -root \n\ - zoom -root \n\ - anemone -root \n\ - apollonian -root \n\ -@GL_KLUDGE@ GL: boxed -root \n\ -@GL_KLUDGE@ GL: cubenetic -root \n\ -@GL_KLUDGE@ GL: endgame -root \n\ - euler2d -root \n\ - fluidballs -root \n\ -@GL_KLUDGE@ GL: flurry -root \n\ -- GL: glblur -root \n\ -@GL_KLUDGE@ GL: glsnake -root \n\ - halftone -root \n\ -@GL_KLUDGE@ GL: juggler3d -root \n\ -@GL_KLUDGE@ GL: lavalite -root \n\ -- polyominoes -root \n\ -@GL_KLUDGE@ GL: queens -root \n\ -- GL: sballs -root \n\ -@GL_KLUDGE@ GL: spheremonics -root \n\ -- thornbird -root \n\ - twang -root \n\ -- GL: antspotlight -root \n\ - apple2 -root \n\ -@GL_KLUDGE@ GL: atunnel -root \n\ - barcode -root \n\ -@GL_KLUDGE@ GL: blinkbox -root \n\ -@GL_KLUDGE@ GL: blocktube -root \n\ -@GL_KLUDGE@ GL: bouncingcow -root \n\ - cloudlife -root \n\ -@GL_KLUDGE@ GL: cubestorm -root \n\ - eruption -root \n\ -@GL_KLUDGE@ GL: flipflop -root \n\ -@GL_KLUDGE@ GL: flyingtoasters -root \n\ - fontglide -root \n\ -@GL_KLUDGE@ GL: gleidescope -root \n\ -@GL_KLUDGE@ GL: glknots -root \n\ -@GL_KLUDGE@ GL: glmatrix -root \n\ -- GL: glslideshow -root \n\ -@GL_KLUDGE@ GL: hypertorus -root \n\ -- GL: jigglypuff -root \n\ - metaballs -root \n\ -@GL_KLUDGE@ GL: mirrorblob -root \n\ - piecewise -root \n\ -@GL_KLUDGE@ GL: polytopes -root \n\ - pong -root \n\ - popsquares -root \n\ -@GL_KLUDGE@ GL: surfaces -root \n\ - xanalogtv -root \n\ - abstractile -root \n\ - anemotaxis -root \n\ -- GL: antinspect -root \n\ - fireworkx -root \n\ - fuzzyflakes -root \n\ - interaggregate -root \n\ - intermomentary -root \n\ - memscroller -root \n\ -@GL_KLUDGE@ GL: noof -root \n\ - pacman -root \n\ -@GL_KLUDGE@ GL: pinion -root \n\ -@GL_KLUDGE@ GL: polyhedra -root \n\ -- GL: providence -root \n\ - substrate -root \n\ - wormhole -root \n\ -- GL: antmaze -root \n\ -@GL_KLUDGE@ GL: boing -root \n\ - boxfit -root \n\ -@GL_KLUDGE@ GL: carousel -root \n\ - celtic -root \n\ -@GL_KLUDGE@ GL: crackberg -root \n\ -@GL_KLUDGE@ GL: cube21 -root \n\ - fiberlamp -root \n\ -@GL_KLUDGE@ GL: fliptext -root \n\ -@GL_KLUDGE@ GL: glhanoi -root \n\ -@GL_KLUDGE@ GL: tangram -root \n\ -@GL_KLUDGE@ GL: timetunnel -root \n\ -@GL_KLUDGE@ GL: glschool -root \n\ -@GL_KLUDGE@ GL: topblock -root \n\ -@GL_KLUDGE@ GL: cubicgrid -root \n\ - cwaves -root \n\ -@GL_KLUDGE@ GL: gears -root \n\ -@GL_KLUDGE@ GL: glcells -root \n\ -@GL_KLUDGE@ GL: lockward -root \n\ - m6502 -root \n\ -@GL_KLUDGE@ GL: moebiusgears -root \n\ -@GL_KLUDGE@ GL: voronoi -root \n\ -@GL_KLUDGE@ GL: hypnowheel -root \n\ -@GL_KLUDGE@ GL: klein -root \n\ -- lcdscrub -root \n\ -@GL_KLUDGE@ GL: photopile -root \n\ -@GL_KLUDGE@ GL: skytentacles -root \n\ -@GL_KLUDGE@ GL: rubikblocks -root \n\ -@GL_KLUDGE@ GL: companioncube -root \n\ -@GL_KLUDGE@ GL: hilbert -root \n\ -@GL_KLUDGE@ GL: tronbit -root \n\ -@GL_KLUDGE@ GL: geodesic -root \n\ - hexadrop -root \n\ -@GL_KLUDGE@ GL: kaleidocycle -root \n\ -@GL_KLUDGE@ GL: quasicrystal -root \n\ -@GL_KLUDGE@ GL: unknownpleasures -root \n\ - binaryring -root \n\ -@GL_KLUDGE@ GL: cityflow -root \n\ -@GL_KLUDGE@ GL: geodesicgears -root \n\ -@GL_KLUDGE@ GL: projectiveplane -root \n\ -@GL_KLUDGE@ GL: romanboy -root \n\ - tessellimage -root \n\ -@GL_KLUDGE@ GL: winduprobot -root \n\ -@GL_KLUDGE@ GL: splitflap -root \n\ -@GL_KLUDGE@ GL: cubestack -root \n\ -@GL_KLUDGE@ GL: cubetwist -root \n\ -@GL_KLUDGE@ GL: discoball -root \n\ -@GL_KLUDGE@ GL: dymaxionmap -root \n\ -@GL_KLUDGE@ GL: energystream -root \n\ -@GL_KLUDGE@ GL: hexstrut -root \n\ -@GL_KLUDGE@ GL: hydrostat -root \n\ -@GL_KLUDGE@ GL: raverhoop -root \n\ -@GL_KLUDGE@ GL: splodesic -root \n\ -@GL_KLUDGE@ GL: unicrud -root \n\ -@GL_KLUDGE@ GL: esper -root \n\ -@GL_KLUDGE@ GL: vigilance -root \n\ -@GL_KLUDGE@ GL: crumbler -root \n\ - filmleader -root \n\ - glitchpeg -root \n\ -@GL_KLUDGE@ GL: handsy -root \n\ -@GL_KLUDGE@ GL: maze3d -root \n\ -@GL_KLUDGE@ GL: peepers -root \n\ -@GL_KLUDGE@ GL: razzledazzle -root \n\ - vfeedback -root \n\ -@GL_KLUDGE@ GL: deepstars -root \n\ -@GL_KLUDGE@ GL: gravitywell -root \n\ -@GL_KLUDGE@ GL: beats -root \n\ -@GL_KLUDGE@ GL: covid19 -root \n\ -@GL_KLUDGE@ GL: etruscanvenus -root \n\ -@GL_KLUDGE@ GL: gibson -root \n\ -@GL_KLUDGE@ GL: headroom -root \n\ -@GL_KLUDGE@ GL: sphereeversion -root \n\ - binaryhorizon -root \n\ - marbling -root \n\ -@GL_KLUDGE@ GL: chompytower -root \n\ -@GL_KLUDGE@ GL: mapscroller -root \n\ -@GL_KLUDGE@ GL: nakagin -root \n\ -@GL_KLUDGE@ GL: squirtorus -root \n + maze --root \n\ +@GL_KLUDGE@ GL: superquadrics --root \n\ + attraction --root \n\ + blitspin --root \n\ + greynetic --root \n\ + helix --root \n\ + hopalong --root \n\ + imsmap --root \n\ +- noseguy --root \n\ +- pyro --root \n\ + qix --root \n\ +- rocks --root \n\ + rorschach --root \n\ + decayscreen --root \n\ + flame --root \n\ + halo --root \n\ + slidescreen --root \n\ + pedal --root \n\ + bouboule --root \n\ +- braid --root \n\ + coral --root \n\ + deco --root \n\ + drift --root \n\ +- fadeplot --root \n\ + galaxy --root \n\ + goop --root \n\ + grav --root \n\ + ifs --root \n\ +@GL_KLUDGE@ GL: jigsaw --root \n\ + julia --root \n\ +- kaleidescope --root \n\ +@GL_KLUDGE@ GL: moebius --root \n\ + moire --root \n\ +@GL_KLUDGE@ GL: morph3d --root \n\ + mountain --root \n\ + munch --root \n\ + penrose --root \n\ +@GL_KLUDGE@ GL: pipes --root \n\ + rdbomb --root \n\ +@GL_KLUDGE@ GL: rubik --root \n\ +- sierpinski --root \n\ + slip --root \n\ +@GL_KLUDGE@ GL: sproingies --root \n\ + starfish --root \n\ + strange --root \n\ + swirl --root \n\ + triangle --root \n\ + xjack --root \n\ + xlyap --root \n\ +@GL_KLUDGE@ GL: atlantis --root \n\ + bsod --root \n\ +@GL_KLUDGE@ GL: bubble3d --root \n\ +@GL_KLUDGE@ GL: cage --root \n\ +- crystal --root \n\ + cynosure --root \n\ + discrete --root \n\ + distort --root \n\ + epicycle --root \n\ + flow --root \n\ +@GL_KLUDGE@ GL: glplanet --root \n\ + interference --root \n\ + kumppa --root \n\ +@GL_KLUDGE@ GL: lament --root \n\ + moire2 --root \n\ +@GL_KLUDGE@ GL: sonar --root \n\ +@GL_KLUDGE@ GL: stairs --root \n\ + truchet --root \n\ +- vidwhacker --root \n\ +- webcollage --root \n\ + blaster --root \n\ + bumps --root \n\ + ccurve --root \n\ + compass --root \n\ + deluxe --root \n\ +- demon --root \n\ +@GLE_KLUDGE@ GL: extrusion --root \n\ +- loop --root \n\ + penetrate --root \n\ + petri --root \n\ + phosphor --root \n\ +@GL_KLUDGE@ GL: pulsar --root \n\ + ripples --root \n\ + shadebobs --root \n\ +@GL_KLUDGE@ GL: sierpinski3d --root \n\ + spotlight --root \n\ + squiral --root \n\ + wander --root \n\ + xflame --root \n\ + xmatrix --root \n\ +@GL_KLUDGE@ GL: gflux --root \n\ +- nerverot --root \n\ + xrayswarm --root \n\ + xspirograph --root \n\ +@GL_KLUDGE@ GL: circuit --root \n\ +@GL_KLUDGE@ GL: dangerball --root \n\ +- GL: dnalogo --root \n\ +@GL_KLUDGE@ GL: engine --root \n\ +@GL_KLUDGE@ GL: flipscreen3d --root \n\ +@GL_KLUDGE@ GL: gltext --root \n\ +@GL_KLUDGE@ GL: menger --root \n\ +@GL_KLUDGE@ GL: molecule --root \n\ + rotzoomer --root \n\ + scooter --root \n\ + speedmine --root \n\ +@GL_KLUDGE@ GL: starwars --root \n\ +@GL_KLUDGE@ GL: stonerview --root \n\ + vermiculate --root \n\ + whirlwindwarp --root \n\ + zoom --root \n\ + anemone --root \n\ + apollonian --root \n\ +@GL_KLUDGE@ GL: boxed --root \n\ +@GL_KLUDGE@ GL: cubenetic --root \n\ +@GL_KLUDGE@ GL: endgame --root \n\ + euler2d --root \n\ + fluidballs --root \n\ +@GL_KLUDGE@ GL: flurry --root \n\ +- GL: glblur --root \n\ +@GL_KLUDGE@ GL: glsnake --root \n\ + halftone --root \n\ +@GL_KLUDGE@ GL: juggler3d --root \n\ +@GL_KLUDGE@ GL: lavalite --root \n\ +- polyominoes --root \n\ +@GL_KLUDGE@ GL: queens --root \n\ +- GL: sballs --root \n\ +@GL_KLUDGE@ GL: spheremonics --root \n\ + twang --root \n\ +- GL: antspotlight --root \n\ + apple2 --root \n\ +@GL_KLUDGE@ GL: atunnel --root \n\ + barcode --root \n\ +@GL_KLUDGE@ GL: blinkbox --root \n\ +@GL_KLUDGE@ GL: blocktube --root \n\ +@GL_KLUDGE@ GL: bouncingcow --root \n\ + cloudlife --root \n\ +@GL_KLUDGE@ GL: cubestorm --root \n\ + eruption --root \n\ +@GL_KLUDGE@ GL: flipflop --root \n\ +@GL_KLUDGE@ GL: flyingtoasters --root \n\ + fontglide --root \n\ +@GL_KLUDGE@ GL: gleidescope --root \n\ +@GL_KLUDGE@ GL: glknots --root \n\ +@GL_KLUDGE@ GL: glmatrix --root \n\ +- GL: glslideshow --root \n\ +@GL_KLUDGE@ GL: hypertorus --root \n\ +- GL: jigglypuff --root \n\ + metaballs --root \n\ +@GL_KLUDGE@ GL: mirrorblob --root \n\ + piecewise --root \n\ +@GL_KLUDGE@ GL: polytopes --root \n\ + pong --root \n\ + popsquares --root \n\ +@GL_KLUDGE@ GL: surfaces --root \n\ + xanalogtv --root \n\ + abstractile --root \n\ + anemotaxis --root \n\ +- GL: antinspect --root \n\ + fireworkx --root \n\ + fuzzyflakes --root \n\ + interaggregate --root \n\ + intermomentary --root \n\ + memscroller --root \n\ +@GL_KLUDGE@ GL: noof --root \n\ + pacman --root \n\ +@GL_KLUDGE@ GL: pinion --root \n\ +@GL_KLUDGE@ GL: polyhedra --root \n\ +- GL: providence --root \n\ + substrate --root \n\ + wormhole --root \n\ +- GL: antmaze --root \n\ +@GL_KLUDGE@ GL: boing --root \n\ + boxfit --root \n\ +@GL_KLUDGE@ GL: carousel --root \n\ + celtic --root \n\ +@GL_KLUDGE@ GL: crackberg --root \n\ +@GL_KLUDGE@ GL: cube21 --root \n\ + fiberlamp --root \n\ +@GL_KLUDGE@ GL: fliptext --root \n\ +@GL_KLUDGE@ GL: glhanoi --root \n\ +@GL_KLUDGE@ GL: tangram --root \n\ +@GL_KLUDGE@ GL: timetunnel --root \n\ +@GL_KLUDGE@ GL: glschool --root \n\ +@GL_KLUDGE@ GL: topblock --root \n\ +@GL_KLUDGE@ GL: cubicgrid --root \n\ + cwaves --root \n\ +@GL_KLUDGE@ GL: gears --root \n\ +@GL_KLUDGE@ GL: glcells --root \n\ +@GL_KLUDGE@ GL: lockward --root \n\ + m6502 --root \n\ +@GL_KLUDGE@ GL: moebiusgears --root \n\ +@GL_KLUDGE@ GL: voronoi --root \n\ +@GL_KLUDGE@ GL: hypnowheel --root \n\ +@GL_KLUDGE@ GL: klein --root \n\ +- lcdscrub --root \n\ +@GL_KLUDGE@ GL: photopile --root \n\ +@GL_KLUDGE@ GL: skytentacles --root \n\ +@GL_KLUDGE@ GL: rubikblocks --root \n\ +@GL_KLUDGE@ GL: companioncube --root \n\ +@GL_KLUDGE@ GL: hilbert --root \n\ +@GL_KLUDGE@ GL: tronbit --root \n\ +@GL_KLUDGE@ GL: geodesic --root \n\ + hexadrop --root \n\ +@GL_KLUDGE@ GL: kaleidocycle --root \n\ +@GL_KLUDGE@ GL: quasicrystal --root \n\ +@GL_KLUDGE@ GL: unknownpleasures --root \n\ + binaryring --root \n\ +@GL_KLUDGE@ GL: cityflow --root \n\ +@GL_KLUDGE@ GL: geodesicgears --root \n\ +@GL_KLUDGE@ GL: projectiveplane --root \n\ +@GL_KLUDGE@ GL: romanboy --root \n\ + tessellimage --root \n\ +@GL_KLUDGE@ GL: winduprobot --root \n\ +@GL_KLUDGE@ GL: splitflap --root \n\ +@GL_KLUDGE@ GL: cubestack --root \n\ +@GL_KLUDGE@ GL: cubetwist --root \n\ +@GL_KLUDGE@ GL: discoball --root \n\ +@GL_KLUDGE@ GL: dymaxionmap --root \n\ +@GL_KLUDGE@ GL: energystream --root \n\ +@GL_KLUDGE@ GL: hexstrut --root \n\ +@GL_KLUDGE@ GL: hydrostat --root \n\ +@GL_KLUDGE@ GL: raverhoop --root \n\ +@GL_KLUDGE@ GL: splodesic --root \n\ +@GL_KLUDGE@ GL: unicrud --root \n\ +@GL_KLUDGE@ GL: esper --root \n\ +@GL_KLUDGE@ GL: vigilance --root \n\ +@GL_KLUDGE@ GL: crumbler --root \n\ + filmleader --root \n\ + glitchpeg --root \n\ +@GL_KLUDGE@ GL: handsy --root \n\ +@GL_KLUDGE@ GL: maze3d --root \n\ +@GL_KLUDGE@ GL: peepers --root \n\ +@GL_KLUDGE@ GL: razzledazzle --root \n\ + vfeedback --root \n\ +@GL_KLUDGE@ GL: deepstars --root \n\ +@GL_KLUDGE@ GL: gravitywell --root \n\ +@GL_KLUDGE@ GL: beats --root \n\ +@GL_KLUDGE@ GL: covid19 --root \n\ +@GL_KLUDGE@ GL: etruscanvenus --root \n\ +@GL_KLUDGE@ GL: gibson --root \n\ +@GL_KLUDGE@ GL: headroom --root \n\ +@GL_KLUDGE@ GL: sphereeversion --root \n\ + binaryhorizon --root \n\ + marbling --root \n\ +@GL_KLUDGE@ GL: chompytower --root \n\ +@GL_KLUDGE@ GL: hextrail --root \n\ +@GL_KLUDGE@ GL: mapscroller --root \n\ +@GL_KLUDGE@ GL: nakagin --root \n\ +@GL_KLUDGE@ GL: squirtorus --root \n @@ -642,6 +642,7 @@ XScreenSaver.bourneShell: /bin/sh *hacks.gltext.name: GL Text *hacks.gravitywell.name: Gravity Well *hacks.hexstrut.name: Hex Strut +*hacks.hextrail.name: Hex Trail *hacks.ifs.name: IFS *hacks.imsmap.name: IMS Map *hacks.jigglypuff.name: Jiggly Puff diff --git a/driver/XScreenSaver_ad.h b/driver/XScreenSaver_ad.h index 8499204c..7fc8a767 100644 --- a/driver/XScreenSaver_ad.h +++ b/driver/XScreenSaver_ad.h @@ -179,254 +179,254 @@ "*errorFont: sans-serif bold 18", "*errorColor: #FF0000", "*programs: \ - maze -root \\n\ - GL: superquadrics -root \\n\ - attraction -root \\n\ - blitspin -root \\n\ - greynetic -root \\n\ - helix -root \\n\ - hopalong -root \\n\ - imsmap -root \\n\ -- noseguy -root \\n\ -- pyro -root \\n\ - qix -root \\n\ -- rocks -root \\n\ - rorschach -root \\n\ - decayscreen -root \\n\ - flame -root \\n\ - halo -root \\n\ - slidescreen -root \\n\ - pedal -root \\n\ - bouboule -root \\n\ -- braid -root \\n\ - coral -root \\n\ - deco -root \\n\ - drift -root \\n\ -- fadeplot -root \\n\ - galaxy -root \\n\ - goop -root \\n\ - grav -root \\n\ - ifs -root \\n\ - GL: jigsaw -root \\n\ - julia -root \\n\ -- kaleidescope -root \\n\ - GL: moebius -root \\n\ - moire -root \\n\ - GL: morph3d -root \\n\ - mountain -root \\n\ - munch -root \\n\ - penrose -root \\n\ - GL: pipes -root \\n\ - rdbomb -root \\n\ - GL: rubik -root \\n\ -- sierpinski -root \\n\ - slip -root \\n\ - GL: sproingies -root \\n\ - starfish -root \\n\ - strange -root \\n\ - swirl -root \\n\ - triangle -root \\n\ - xjack -root \\n\ - xlyap -root \\n\ - GL: atlantis -root \\n\ - bsod -root \\n\ - GL: bubble3d -root \\n\ - GL: cage -root \\n\ -- crystal -root \\n\ - cynosure -root \\n\ - discrete -root \\n\ - distort -root \\n\ - epicycle -root \\n\ - flow -root \\n\ - GL: glplanet -root \\n\ - interference -root \\n\ - kumppa -root \\n\ - GL: lament -root \\n\ - moire2 -root \\n\ - GL: sonar -root \\n\ - GL: stairs -root \\n\ - truchet -root \\n\ -- vidwhacker -root \\n\ - blaster -root \\n\ - bumps -root \\n\ - ccurve -root \\n\ - compass -root \\n\ - deluxe -root \\n\ -- demon -root \\n\ -- GL: extrusion -root \\n\ -- loop -root \\n\ - penetrate -root \\n\ - petri -root \\n\ - phosphor -root \\n\ - GL: pulsar -root \\n\ - ripples -root \\n\ - shadebobs -root \\n\ - GL: sierpinski3d -root \\n\ - spotlight -root \\n\ - squiral -root \\n\ - wander -root \\n\ -- webcollage -root \\n\ - xflame -root \\n\ - xmatrix -root \\n\ - GL: gflux -root \\n\ -- nerverot -root \\n\ - xrayswarm -root \\n\ - xspirograph -root \\n\ - GL: circuit -root \\n\ - GL: dangerball -root \\n\ -- GL: dnalogo -root \\n\ - GL: engine -root \\n\ - GL: flipscreen3d -root \\n\ - GL: gltext -root \\n\ - GL: menger -root \\n\ - GL: molecule -root \\n\ - rotzoomer -root \\n\ - scooter -root \\n\ - speedmine -root \\n\ - GL: starwars -root \\n\ - GL: stonerview -root \\n\ - vermiculate -root \\n\ - whirlwindwarp -root \\n\ - zoom -root \\n\ - anemone -root \\n\ - apollonian -root \\n\ - GL: boxed -root \\n\ - GL: cubenetic -root \\n\ - GL: endgame -root \\n\ - euler2d -root \\n\ - fluidballs -root \\n\ - GL: flurry -root \\n\ -- GL: glblur -root \\n\ - GL: glsnake -root \\n\ - halftone -root \\n\ - GL: juggler3d -root \\n\ - GL: lavalite -root \\n\ -- polyominoes -root \\n\ - GL: queens -root \\n\ -- GL: sballs -root \\n\ - GL: spheremonics -root \\n\ -- thornbird -root \\n\ - twang -root \\n\ -- GL: antspotlight -root \\n\ - apple2 -root \\n\ - GL: atunnel -root \\n\ - barcode -root \\n\ - GL: blinkbox -root \\n\ - GL: blocktube -root \\n\ - GL: bouncingcow -root \\n\ - cloudlife -root \\n\ - GL: cubestorm -root \\n\ - eruption -root \\n\ - GL: flipflop -root \\n\ - GL: flyingtoasters -root \\n\ - fontglide -root \\n\ - GL: gleidescope -root \\n\ - GL: glknots -root \\n\ - GL: glmatrix -root \\n\ -- GL: glslideshow -root \\n\ - GL: hypertorus -root \\n\ -- GL: jigglypuff -root \\n\ - metaballs -root \\n\ - GL: mirrorblob -root \\n\ - piecewise -root \\n\ - GL: polytopes -root \\n\ - pong -root \\n\ - popsquares -root \\n\ - GL: surfaces -root \\n\ - xanalogtv -root \\n\ - abstractile -root \\n\ - anemotaxis -root \\n\ -- GL: antinspect -root \\n\ - fireworkx -root \\n\ - fuzzyflakes -root \\n\ - interaggregate -root \\n\ - intermomentary -root \\n\ - memscroller -root \\n\ - GL: noof -root \\n\ - pacman -root \\n\ - GL: pinion -root \\n\ - GL: polyhedra -root \\n\ -- GL: providence -root \\n\ - substrate -root \\n\ - wormhole -root \\n\ -- GL: antmaze -root \\n\ - GL: boing -root \\n\ - boxfit -root \\n\ - GL: carousel -root \\n\ - celtic -root \\n\ - GL: crackberg -root \\n\ - GL: cube21 -root \\n\ - fiberlamp -root \\n\ - GL: fliptext -root \\n\ - GL: glhanoi -root \\n\ - GL: tangram -root \\n\ - GL: timetunnel -root \\n\ - GL: glschool -root \\n\ - GL: topblock -root \\n\ - GL: cubicgrid -root \\n\ - cwaves -root \\n\ - GL: gears -root \\n\ - GL: glcells -root \\n\ - GL: lockward -root \\n\ - m6502 -root \\n\ - GL: moebiusgears -root \\n\ - GL: voronoi -root \\n\ - GL: hypnowheel -root \\n\ - GL: klein -root \\n\ -- lcdscrub -root \\n\ - GL: photopile -root \\n\ - GL: skytentacles -root \\n\ - GL: rubikblocks -root \\n\ - GL: companioncube -root \\n\ - GL: hilbert -root \\n\ - GL: tronbit -root \\n\ - GL: geodesic -root \\n\ - hexadrop -root \\n\ - GL: kaleidocycle -root \\n\ - GL: quasicrystal -root \\n\ - GL: unknownpleasures -root \\n\ - binaryring -root \\n\ - GL: cityflow -root \\n\ - GL: geodesicgears -root \\n\ - GL: projectiveplane -root \\n\ - GL: romanboy -root \\n\ - tessellimage -root \\n\ - GL: winduprobot -root \\n\ - GL: splitflap -root \\n\ - GL: cubestack -root \\n\ - GL: cubetwist -root \\n\ - GL: discoball -root \\n\ - GL: dymaxionmap -root \\n\ - GL: energystream -root \\n\ - GL: hexstrut -root \\n\ - GL: hydrostat -root \\n\ - GL: raverhoop -root \\n\ - GL: splodesic -root \\n\ - GL: unicrud -root \\n\ - GL: esper -root \\n\ - GL: vigilance -root \\n\ - GL: crumbler -root \\n\ - filmleader -root \\n\ - glitchpeg -root \\n\ - GL: handsy -root \\n\ - GL: maze3d -root \\n\ - GL: peepers -root \\n\ - GL: razzledazzle -root \\n\ - vfeedback -root \\n\ - GL: deepstars -root \\n\ - GL: gravitywell -root \\n\ - GL: beats -root \\n\ - GL: covid19 -root \\n\ - GL: etruscanvenus -root \\n\ - GL: gibson -root \\n\ - GL: headroom -root \\n\ - GL: sphereeversion -root \\n\ - binaryhorizon -root \\n\ - marbling -root \\n\ - GL: chompytower -root \\n\ - GL: mapscroller -root \\n\ - GL: nakagin -root \\n\ - GL: squirtorus -root \\n", + maze --root \\n\ + GL: superquadrics --root \\n\ + attraction --root \\n\ + blitspin --root \\n\ + greynetic --root \\n\ + helix --root \\n\ + hopalong --root \\n\ + imsmap --root \\n\ +- noseguy --root \\n\ +- pyro --root \\n\ + qix --root \\n\ +- rocks --root \\n\ + rorschach --root \\n\ + decayscreen --root \\n\ + flame --root \\n\ + halo --root \\n\ + slidescreen --root \\n\ + pedal --root \\n\ + bouboule --root \\n\ +- braid --root \\n\ + coral --root \\n\ + deco --root \\n\ + drift --root \\n\ +- fadeplot --root \\n\ + galaxy --root \\n\ + goop --root \\n\ + grav --root \\n\ + ifs --root \\n\ + GL: jigsaw --root \\n\ + julia --root \\n\ +- kaleidescope --root \\n\ + GL: moebius --root \\n\ + moire --root \\n\ + GL: morph3d --root \\n\ + mountain --root \\n\ + munch --root \\n\ + penrose --root \\n\ + GL: pipes --root \\n\ + rdbomb --root \\n\ + GL: rubik --root \\n\ +- sierpinski --root \\n\ + slip --root \\n\ + GL: sproingies --root \\n\ + starfish --root \\n\ + strange --root \\n\ + swirl --root \\n\ + triangle --root \\n\ + xjack --root \\n\ + xlyap --root \\n\ + GL: atlantis --root \\n\ + bsod --root \\n\ + GL: bubble3d --root \\n\ + GL: cage --root \\n\ +- crystal --root \\n\ + cynosure --root \\n\ + discrete --root \\n\ + distort --root \\n\ + epicycle --root \\n\ + flow --root \\n\ + GL: glplanet --root \\n\ + interference --root \\n\ + kumppa --root \\n\ + GL: lament --root \\n\ + moire2 --root \\n\ + GL: sonar --root \\n\ + GL: stairs --root \\n\ + truchet --root \\n\ +- vidwhacker --root \\n\ +- webcollage --root \\n\ + blaster --root \\n\ + bumps --root \\n\ + ccurve --root \\n\ + compass --root \\n\ + deluxe --root \\n\ +- demon --root \\n\ +- GL: extrusion --root \\n\ +- loop --root \\n\ + penetrate --root \\n\ + petri --root \\n\ + phosphor --root \\n\ + GL: pulsar --root \\n\ + ripples --root \\n\ + shadebobs --root \\n\ + GL: sierpinski3d --root \\n\ + spotlight --root \\n\ + squiral --root \\n\ + wander --root \\n\ + xflame --root \\n\ + xmatrix --root \\n\ + GL: gflux --root \\n\ +- nerverot --root \\n\ + xrayswarm --root \\n\ + xspirograph --root \\n\ + GL: circuit --root \\n\ + GL: dangerball --root \\n\ +- GL: dnalogo --root \\n\ + GL: engine --root \\n\ + GL: flipscreen3d --root \\n\ + GL: gltext --root \\n\ + GL: menger --root \\n\ + GL: molecule --root \\n\ + rotzoomer --root \\n\ + scooter --root \\n\ + speedmine --root \\n\ + GL: starwars --root \\n\ + GL: stonerview --root \\n\ + vermiculate --root \\n\ + whirlwindwarp --root \\n\ + zoom --root \\n\ + anemone --root \\n\ + apollonian --root \\n\ + GL: boxed --root \\n\ + GL: cubenetic --root \\n\ + GL: endgame --root \\n\ + euler2d --root \\n\ + fluidballs --root \\n\ + GL: flurry --root \\n\ +- GL: glblur --root \\n\ + GL: glsnake --root \\n\ + halftone --root \\n\ + GL: juggler3d --root \\n\ + GL: lavalite --root \\n\ +- polyominoes --root \\n\ + GL: queens --root \\n\ +- GL: sballs --root \\n\ + GL: spheremonics --root \\n\ + twang --root \\n\ +- GL: antspotlight --root \\n\ + apple2 --root \\n\ + GL: atunnel --root \\n\ + barcode --root \\n\ + GL: blinkbox --root \\n\ + GL: blocktube --root \\n\ + GL: bouncingcow --root \\n\ + cloudlife --root \\n\ + GL: cubestorm --root \\n\ + eruption --root \\n\ + GL: flipflop --root \\n\ + GL: flyingtoasters --root \\n\ + fontglide --root \\n\ + GL: gleidescope --root \\n\ + GL: glknots --root \\n\ + GL: glmatrix --root \\n\ +- GL: glslideshow --root \\n\ + GL: hypertorus --root \\n\ +- GL: jigglypuff --root \\n\ + metaballs --root \\n\ + GL: mirrorblob --root \\n\ + piecewise --root \\n\ + GL: polytopes --root \\n\ + pong --root \\n\ + popsquares --root \\n\ + GL: surfaces --root \\n\ + xanalogtv --root \\n\ + abstractile --root \\n\ + anemotaxis --root \\n\ +- GL: antinspect --root \\n\ + fireworkx --root \\n\ + fuzzyflakes --root \\n\ + interaggregate --root \\n\ + intermomentary --root \\n\ + memscroller --root \\n\ + GL: noof --root \\n\ + pacman --root \\n\ + GL: pinion --root \\n\ + GL: polyhedra --root \\n\ +- GL: providence --root \\n\ + substrate --root \\n\ + wormhole --root \\n\ +- GL: antmaze --root \\n\ + GL: boing --root \\n\ + boxfit --root \\n\ + GL: carousel --root \\n\ + celtic --root \\n\ + GL: crackberg --root \\n\ + GL: cube21 --root \\n\ + fiberlamp --root \\n\ + GL: fliptext --root \\n\ + GL: glhanoi --root \\n\ + GL: tangram --root \\n\ + GL: timetunnel --root \\n\ + GL: glschool --root \\n\ + GL: topblock --root \\n\ + GL: cubicgrid --root \\n\ + cwaves --root \\n\ + GL: gears --root \\n\ + GL: glcells --root \\n\ + GL: lockward --root \\n\ + m6502 --root \\n\ + GL: moebiusgears --root \\n\ + GL: voronoi --root \\n\ + GL: hypnowheel --root \\n\ + GL: klein --root \\n\ +- lcdscrub --root \\n\ + GL: photopile --root \\n\ + GL: skytentacles --root \\n\ + GL: rubikblocks --root \\n\ + GL: companioncube --root \\n\ + GL: hilbert --root \\n\ + GL: tronbit --root \\n\ + GL: geodesic --root \\n\ + hexadrop --root \\n\ + GL: kaleidocycle --root \\n\ + GL: quasicrystal --root \\n\ + GL: unknownpleasures --root \\n\ + binaryring --root \\n\ + GL: cityflow --root \\n\ + GL: geodesicgears --root \\n\ + GL: projectiveplane --root \\n\ + GL: romanboy --root \\n\ + tessellimage --root \\n\ + GL: winduprobot --root \\n\ + GL: splitflap --root \\n\ + GL: cubestack --root \\n\ + GL: cubetwist --root \\n\ + GL: discoball --root \\n\ + GL: dymaxionmap --root \\n\ + GL: energystream --root \\n\ + GL: hexstrut --root \\n\ + GL: hydrostat --root \\n\ + GL: raverhoop --root \\n\ + GL: splodesic --root \\n\ + GL: unicrud --root \\n\ + GL: esper --root \\n\ + GL: vigilance --root \\n\ + GL: crumbler --root \\n\ + filmleader --root \\n\ + glitchpeg --root \\n\ + GL: handsy --root \\n\ + GL: maze3d --root \\n\ + GL: peepers --root \\n\ + GL: razzledazzle --root \\n\ + vfeedback --root \\n\ + GL: deepstars --root \\n\ + GL: gravitywell --root \\n\ + GL: beats --root \\n\ + GL: covid19 --root \\n\ + GL: etruscanvenus --root \\n\ + GL: gibson --root \\n\ + GL: headroom --root \\n\ + GL: sphereeversion --root \\n\ + binaryhorizon --root \\n\ + marbling --root \\n\ + GL: chompytower --root \\n\ + GL: hextrail --root \\n\ + GL: mapscroller --root \\n\ + GL: nakagin --root \\n\ + GL: squirtorus --root \\n", "*hacks.antinspect.name: Ant Inspect", "*hacks.antmaze.name: Ant Maze", "*hacks.antspotlight.name: Ant Spotlight", @@ -487,6 +487,7 @@ "*hacks.gltext.name: GL Text", "*hacks.gravitywell.name: Gravity Well", "*hacks.hexstrut.name: Hex Strut", +"*hacks.hextrail.name: Hex Trail", "*hacks.ifs.name: IFS", "*hacks.imsmap.name: IMS Map", "*hacks.jigglypuff.name: Jiggly Puff", diff --git a/driver/demo-Gtk-conf.h b/driver/demo-Gtk-conf.h index 31f7ed8d..ad94ee3a 100644 --- a/driver/demo-Gtk-conf.h +++ b/driver/demo-Gtk-conf.h @@ -48,6 +48,8 @@ extern void run_next_cb (GtkButton *, gpointer user_data); extern void run_prev_cb (GtkButton *, gpointer user_data); extern gboolean pref_changed_cb (GtkWidget *, gpointer user_data); extern gboolean pref_changed_event_cb (GtkWidget *, GdkEvent *, gpointer data); +extern gboolean dpms_sanity_cb (GtkWidget *, gpointer user_data); +extern gboolean dpms_sanity_event_cb (GtkWidget *, GdkEvent *, gpointer data); extern gboolean image_text_pref_changed_event_cb (GtkWidget *, GdkEvent *, gpointer user_data); extern void mode_menu_item_cb (GtkWidget *, gpointer user_data); diff --git a/driver/demo-Gtk.c b/driver/demo-Gtk.c index 442dac1a..a84b4207 100644 --- a/driver/demo-Gtk.c +++ b/driver/demo-Gtk.c @@ -70,6 +70,7 @@ #include "atoms.h" #include "usleep.h" #include "atoms.h" +#include "screenshot.h" #include "xmu.h" #include "demo-Gtk-conf.h" @@ -109,12 +110,15 @@ typedef struct { Display *dpy; Bool wayland_p; + Pixmap screenshot; conf_data *cdata; /* private data for per-hack configuration */ Bool debug_p; /* whether to print diagnostics */ Bool initializing_p; /* flag for breaking recursion loops */ + Bool flushing_p; /* flag for breaking recursion loops */ Bool saving_p; /* flag for breaking recursion loops */ + Bool dpms_supported_p; /* Whether XDPMS is available */ char *desired_preview_cmd; /* subprocess we intend to run */ char *running_preview_cmd; /* subprocess we are currently running */ @@ -168,6 +172,7 @@ G_DEFINE_TYPE (XScreenSaverApp, xscreensaver_app, GTK_TYPE_APPLICATION) W(activate_menuitem) \ W(lock_menuitem) \ W(kill_menuitem) \ + W(restart_menuitem) \ W(list) \ W(scroller) \ W(preview_frame) \ @@ -286,6 +291,7 @@ static void populate_popup_window (state *); static Bool flush_dialog_changes_and_save (state *); static Bool flush_popup_changes_and_save (state *); +static Bool validate_image_directory (state *, const char *path); static int maybe_reload_init_file (state *); static void await_xscreensaver (state *); @@ -299,7 +305,6 @@ static void sensitize_demo_widgets (state *, Bool sensitive_p); static void kill_gnome_screensaver (state *); static void kill_kde_screensaver (state *); - /* Some pathname utilities */ /* Removed redundant . and .. components from the pathname. @@ -531,20 +536,46 @@ image_files_p (const char *path, int max_depth) /* Why this behavior isn't automatic, I'll never understand. */ static void -ensure_selected_item_visible (GtkWidget *widget) +ensure_selected_item_visible (state *s, GtkWidget *widget) { - GtkTreePath *path; - GtkTreeSelection *selection; - GtkTreeIter iter; + XScreenSaverWindow *win = XSCREENSAVER_WINDOW (s->window); + + /* Find the path of the selected row in the list. + */ + GtkTreeView *list_widget = GTK_TREE_VIEW (win->list); + GtkTreeSelection *selection = gtk_tree_view_get_selection (list_widget); GtkTreeModel *model; - - selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (widget)); + GtkTreeIter iter; + GtkTreePath *path; + if (!gtk_tree_selection_get_selected (selection, &model, &iter)) path = gtk_tree_path_new_first (); else path = gtk_tree_model_get_path (model, &iter); - - gtk_tree_view_set_cursor (GTK_TREE_VIEW (widget), path, NULL, FALSE); + + /* Make this item be visible and selected. */ + gtk_tree_view_set_cursor (list_widget, path, NULL, FALSE); + + /* Make the scroller show that item at the center of the viewport. + The set_cursor() call, above, makes the item be visible, but it hugs + the top or bottom edge of the viewport, instead of providing more + surrounding context. + + Doing the following in list_select_changed_cb() instead of here makes + the list vertically re-center when using the cursor keys instead of + hugging the top or bottom (good) but also makes it re-center when + clicking on a new item with the mouse (bad). + */ + if (gtk_widget_get_realized (GTK_WIDGET (list_widget))) + { + GdkWindow *bin = gtk_tree_view_get_bin_window (list_widget); + int binh = gdk_window_get_height (bin); + GdkRectangle r; + gtk_tree_view_get_cell_area (list_widget, path, NULL, &r); + gtk_tree_view_convert_widget_to_tree_coords (list_widget, + r.x, r.y, &r.x, &r.y); + gtk_tree_view_scroll_to_point (list_widget, r.x, r.y - binh / 2); + } gtk_tree_path_free (path); } @@ -555,6 +586,8 @@ warning_dialog_cb (GtkDialog *dialog, gint response_id, gpointer user_data) { XScreenSaverWindow *win = XSCREENSAVER_WINDOW (user_data); state *s = &win->state; + if (s->debug_p) + fprintf (stderr, "%s: dialog response %d\n", blurb(), response_id); switch (response_id) { case D_LAUNCH: restart_menu_cb (GTK_WIDGET (dialog), user_data); break; case D_GNOME: kill_gnome_screensaver (s); break; @@ -715,6 +748,59 @@ run_hack (state *s, int list_elt, Bool report_errors_p) } +static pid_t +fork_and_exec (state *s, int argc, char **argv) +{ + char buf [255]; + pid_t forked = fork(); + switch ((int) forked) { + case -1: + sprintf (buf, "%s: couldn't fork", blurb()); + perror (buf); + break; + + case 0: + if (s->dpy) close (ConnectionNumber (s->dpy)); + execvp (argv[0], argv); /* shouldn't return. */ + + sprintf (buf, "%s: pid %lu: couldn't exec %s", blurb(), + (unsigned long) getpid(), argv[0]); + perror (buf); + exit (1); /* exits child fork */ + break; + + default: /* parent fork */ + + /* Put it in its own process group so that this process getting SIGTERM + does not propagate to the forked process. */ + if (setpgid (forked, 0)) + { + char buf [255]; + sprintf (buf, "%s: setpgid %d", blurb(), forked); + perror (buf); + } + + if (s->debug_p) + { + int i; + fprintf (stderr, "%s: pid %lu: forked:", blurb(), + (unsigned long) forked); + for (i = 0; i < argc; i++) + if (strchr (argv[i], ' ')) + fprintf (stderr, " \"%s\"", argv[i]); + else + fprintf (stderr, " %s", argv[i]); + fprintf (stderr, "\n"); + } + + break; + } + + return forked; +} + + + /**************************************************************************** XScreenSaverWindow callbacks, referenced by demo.ui. @@ -754,6 +840,8 @@ doc_menu_cb (GtkAction *menu_action, gpointer user_data) state *s = &win->state; saver_preferences *p = &s->prefs; char *help_command; + int ac = 0; + char *av[10]; if (s->debug_p) fprintf (stderr, "%s: doc menu\n", blurb()); @@ -766,13 +854,14 @@ doc_menu_cb (GtkAction *menu_action, gpointer user_data) help_command = (char *) malloc (strlen (p->load_url_command) + (strlen (p->help_url) * 5) + 20); - strcpy (help_command, "( "); - sprintf (help_command + strlen(help_command), - p->load_url_command, + sprintf (help_command, p->load_url_command, p->help_url, p->help_url, p->help_url, p->help_url, p->help_url); - strcat (help_command, " ) &"); - if (system (help_command) < 0) - fprintf (stderr, "%s: fork error\n", blurb()); + + av[ac++] = "/bin/sh"; + av[ac++] = "-c"; + av[ac++] = help_command; + av[ac] = 0; + fork_and_exec (s, ac, av); free (help_command); } @@ -827,14 +916,19 @@ restart_menu_cb (GtkWidget *widget, gpointer user_data) { XScreenSaverWindow *win = XSCREENSAVER_WINDOW (user_data); state *s = &win->state; + int ac = 0; + char *av[10]; if (s->debug_p) fprintf (stderr, "%s: restart menu\n", blurb()); if (!s->dpy) return; flush_dialog_changes_and_save (s); xscreensaver_command (s->dpy, XA_EXIT, 0, FALSE, NULL); sleep (1); - if (system ("xscreensaver --splash &") < 0) - fprintf (stderr, "%s: fork error\n", blurb()); + av[ac++] = "xscreensaver"; + av[ac++] = "--splash"; + if (s->debug_p) av[ac++] = "--verbose"; + av[ac] = 0; + fork_and_exec (s, ac, av); await_xscreensaver (s); } @@ -842,10 +936,9 @@ restart_menu_cb (GtkWidget *widget, gpointer user_data) static Bool xscreensaver_running_p (state *s) { - Display *dpy = s->dpy; char *rversion = 0; - if (!dpy) return FALSE; - server_xscreensaver_version (dpy, &rversion, 0, 0); + if (!s->dpy) return FALSE; + server_xscreensaver_version (s->dpy, &rversion, 0, 0); if (!rversion) return FALSE; free (rversion); @@ -903,9 +996,8 @@ static int demo_write_init_file (state *s, saver_preferences *p) { XScreenSaverWindow *win = XSCREENSAVER_WINDOW (s->window); - Display *dpy = s->dpy; - if (!write_init_file (dpy, p, s->short_version, FALSE)) + if (!write_init_file (s->dpy, p, s->short_version, FALSE)) { if (s->debug_p) fprintf (stderr, "%s: wrote %s\n", blurb(), init_file_name()); @@ -963,7 +1055,7 @@ force_list_select_item (state *s, GtkWidget *list, int list_elt, Bool scroll_p) if (s->debug_p) fprintf (stderr, "%s: select list elt %d\n", blurb(), list_elt); } - if (scroll_p) ensure_selected_item_visible (GTK_WIDGET (list)); + if (scroll_p) ensure_selected_item_visible (s, GTK_WIDGET (list)); if (!was) gtk_widget_set_sensitive (parent, FALSE); } @@ -1193,6 +1285,7 @@ flush_dialog_changes_and_save (state *s) FlushForeachClosure closure; Bool changed = FALSE; + if (s->initializing_p) return FALSE; if (s->saving_p) return FALSE; s->saving_p = TRUE; @@ -1283,9 +1376,8 @@ flush_dialog_changes_and_save (state *s) /* Theme menu. */ { - Display *dpy = s->dpy; GtkComboBox *cbox = GTK_COMBO_BOX (win->theme_menu); - char *themes = get_string_resource (dpy, "themeNames", "ThemeNames"); + char *themes = get_string_resource (s->dpy, "themeNames", "ThemeNames"); int menu_index = gtk_combo_box_get_active (cbox); char *token = themes ? themes : "default"; char *name, *last; @@ -1313,7 +1405,27 @@ flush_dialog_changes_and_save (state *s) } } - /* Copy any changes from s2 into s, and log them. + /* It is difficult to get "editing completed" events out of GtkEntry. + I want something that fires on RET or focus-out, but I can't seem + to find a consistent way to get that. So let's fake it here. + */ + if (!s->initializing_p && + !!strcmp (p->image_directory, p2->image_directory)) + { + if (s->debug_p) + fprintf (stderr, "%s: imagedir validating \"%s\" -> \"%s\"\n", + blurb(), p->image_directory, p2->image_directory); + if (! validate_image_directory (s, p2->image_directory)) + { + /* Don't save the bad new value into the preferences. */ + if (p2->image_directory != p->image_directory) + free (p2->image_directory); + p2->image_directory = strdup (p->image_directory); + } + } + + + /* Copy any changes from p2 into p, and log them. */ # undef STR # define STR(S) #S @@ -1410,17 +1522,19 @@ pref_changed_cb (GtkWidget *widget, gpointer user_data) if (s->debug_p) { - if (s->initializing_p) - fprintf (stderr, "%s: (pref changed)\n", blurb()); + if (s->flushing_p) + fprintf (stderr, "%s: (pref changed: %s)\n", blurb(), + gtk_widget_get_name (widget)); else - fprintf (stderr, "%s: pref changed\n", blurb()); + fprintf (stderr, "%s: pref changed: %s\n", blurb(), + gtk_widget_get_name (widget)); } - if (! s->initializing_p) + if (! s->flushing_p) { - s->initializing_p = TRUE; + s->flushing_p = TRUE; flush_dialog_changes_and_save (s); - s->initializing_p = FALSE; + s->flushing_p = FALSE; } return GDK_EVENT_PROPAGATE; } @@ -1435,6 +1549,58 @@ pref_changed_event_cb (GtkWidget *widget, GdkEvent *event, gpointer user_data) } +/* Called when the timeout or DPMS spinbuttons are changed, by demo.ui. + */ +G_MODULE_EXPORT gboolean +dpms_sanity_cb (GtkWidget *widget, gpointer user_data) +{ + XScreenSaverWindow *win = XSCREENSAVER_WINDOW (user_data); + state *s = &win->state; + Time timeout, standby, suspend, off; + + if (s->flushing_p) return GDK_EVENT_PROPAGATE; + if (s->initializing_p) return GDK_EVENT_PROPAGATE; + if (! s->dpms_supported_p) return GDK_EVENT_PROPAGATE; + + /* Read the current values from the four spinbuttons. */ +# define MINUTES(V,WIDGET) \ + hack_time_text (s, gtk_entry_get_text (GTK_ENTRY (win->WIDGET)), \ + &(V), FALSE) + MINUTES (timeout, timeout_spinbutton); + MINUTES (standby, dpms_standby_spinbutton); + MINUTES (suspend, dpms_suspend_spinbutton); + MINUTES (off, dpms_off_spinbutton); +# undef MINUTES + + /* If the DPMS settings are non-zero, they must not go backwards: + standby >= timeout (screen saver activation) + suspend >= standby + off >= suspend + */ +# define MINUTES(V,LOWER,WIDGET) \ + if ((V) != 0 && (V) < LOWER) \ + gtk_spin_button_set_value (GTK_SPIN_BUTTON (win->WIDGET), \ + (double) ((LOWER) + 59) / (60 * 1000)) + MINUTES (standby, timeout, dpms_standby_spinbutton); + MINUTES (suspend, standby, dpms_suspend_spinbutton); + MINUTES (off, standby, dpms_off_spinbutton); + MINUTES (off, suspend, dpms_off_spinbutton); +# undef MINUTES + + return GDK_EVENT_PROPAGATE; +} + + +/* Same as dpms_sanity_cb but different. */ +G_MODULE_EXPORT gboolean +dpms_sanity_event_cb (GtkWidget *widget, GdkEvent *event, gpointer user_data) +{ + dpms_sanity_cb (widget, user_data); + return GDK_EVENT_PROPAGATE; +} + + + /* Callback on menu items in the "mode" options menu. */ G_MODULE_EXPORT void @@ -1449,7 +1615,8 @@ mode_menu_item_cb (GtkWidget *widget, gpointer user_data) int menu_index = gtk_combo_box_get_active (GTK_COMBO_BOX (widget)); saver_mode new_mode = mode_menu_order[menu_index]; - if (s->initializing_p) return; /* Called as a spurious side-effect */ + if (s->flushing_p) return; /* Called as a spurious side-effect */ + if (s->initializing_p) return; if (s->debug_p) fprintf (stderr, "%s: mode menu\n", blurb()); @@ -1759,7 +1926,6 @@ validate_image_directory (state *s, const char *path) gtk_main_iteration (); { - Display *dpy = s->dpy; pid_t forked; int fds [2]; int in, out; @@ -1795,7 +1961,7 @@ validate_image_directory (state *s, const char *path) close (in); /* don't need this one */ if (! s->debug_p) close (fileno (stdout)); - close (ConnectionNumber (dpy)); /* close display fd */ + close (ConnectionNumber (s->dpy)); /* close display fd */ if (dup2 (out, stderr_fd) < 0) /* pipe stdout */ { @@ -1911,6 +2077,7 @@ G_MODULE_EXPORT gboolean image_text_pref_changed_event_cb (GtkWidget *widget, GdkEvent *event, gpointer user_data) { +#if 0 /* This is handled in flush_dialog_changes_and_save now */ XScreenSaverWindow *win = XSCREENSAVER_WINDOW (user_data); state *s = &win->state; saver_preferences *p = &s->prefs; @@ -1934,6 +2101,7 @@ image_text_pref_changed_event_cb (GtkWidget *widget, GdkEvent *event, } free (path); +# endif pref_changed_event_cb (widget, event, user_data); return GDK_EVENT_PROPAGATE; } @@ -2107,13 +2275,18 @@ preview_theme_cb (GtkWidget *w, gpointer user_data) { XScreenSaverWindow *win = XSCREENSAVER_WINDOW (user_data); state *s = &win->state; + int ac = 0; + char *av[10]; if (s->debug_p) fprintf (stderr, "%s: preview theme button\n", blurb()); /* Settings button is disabled with --splash --splash so that we don't end up with two copies of xscreensaver-settings running. */ - if (system ("xscreensaver-auth --splash --splash &") < 0) - fprintf (stderr, "%s: splash exec failed\n", blurb()); + av[ac++] = "xscreensaver-auth"; + av[ac++] = "--splash"; + av[ac++] = "--splash"; + av[ac] = 0; + fork_and_exec (s, ac, av); } @@ -2178,11 +2351,10 @@ server_current_hack (state *s) int format; unsigned long nitems, bytesafter; unsigned char *dataP = 0; - Display *dpy = s->dpy; int hack_number = -1; - if (!dpy) return hack_number; - if (XGetWindowProperty (dpy, RootWindow (dpy, 0), /* always screen #0 */ + if (!s->dpy) return hack_number; + if (XGetWindowProperty (s->dpy, RootWindow(s->dpy, 0), /* always screen #0 */ XA_SCREENSAVER_STATUS, 0, 3, FALSE, XA_INTEGER, &type, &format, &nitems, &bytesafter, @@ -2251,7 +2423,6 @@ scroll_to_current_hack (state *s) static void populate_hack_list (state *s) { - Display *dpy = s->dpy; saver_preferences *p = &s->prefs; GtkTreeView *list = GTK_TREE_VIEW (XSCREENSAVER_WINDOW (s->window)->list); GtkListStore *model; @@ -2311,7 +2482,7 @@ populate_hack_list (state *s) pretty_name = (hack->name ? strdup (hack->name) - : make_hack_name (dpy, hack->command)); + : make_hack_name (s->dpy, hack->command)); if (!available_p) { @@ -2369,7 +2540,6 @@ static void populate_prefs_page (state *s) { XScreenSaverWindow *win = XSCREENSAVER_WINDOW (s->window); - Display *dpy = s->dpy; saver_preferences *p = &s->prefs; Bool can_lock_p = TRUE; @@ -2416,8 +2586,9 @@ populate_prefs_page (state *s) gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (win->NAME), (ACTIVEP)) TOGGLE_ACTIVE (lock_button, p->lock_p); - TOGGLE_ACTIVE (dpms_button, p->dpms_enabled_p); - TOGGLE_ACTIVE (dpms_quickoff_button, p->dpms_quickoff_p); + TOGGLE_ACTIVE (dpms_button, p->dpms_enabled_p && s->dpms_supported_p); + TOGGLE_ACTIVE (dpms_quickoff_button, (p->dpms_quickoff_p && + s->dpms_supported_p)); TOGGLE_ACTIVE (grab_desk_button, p->grab_desktop_p); TOGGLE_ACTIVE (grab_video_button, p->grab_video_p); TOGGLE_ACTIVE (grab_image_button, p->random_image_p); @@ -2469,7 +2640,7 @@ populate_prefs_page (state *s) if (cbox) { - char *themes = get_string_resource (dpy, "themeNames", "ThemeNames"); + char *themes = get_string_resource(s->dpy, "themeNames", "ThemeNames"); char *token = themes ? themes : strdup ("default"); char *name, *last = 0; GtkListStore *model; @@ -2518,9 +2689,9 @@ populate_prefs_page (state *s) if (! signal_connected_p) { g_signal_connect (G_OBJECT (cbox), "changed", - G_CALLBACK (pref_changed_cb), (gpointer) s); + G_CALLBACK (pref_changed_cb), (gpointer) win); signal_connected_p = TRUE; - } + } } } @@ -2536,51 +2707,47 @@ populate_prefs_page (state *s) update_list_sensitivity (s); } - { - Bool dpms_supported = FALSE; - Display *dpy = s->dpy; + s->dpms_supported_p = FALSE; #ifdef HAVE_DPMS_EXTENSION - { - int op = 0, event = 0, error = 0; - if (dpy && XQueryExtension (dpy, "DPMS", &op, &event, &error)) - dpms_supported = TRUE; - } + { + int op = 0, event = 0, error = 0; + if (s->dpy && XQueryExtension (s->dpy, "DPMS", &op, &event, &error)) + s->dpms_supported_p = TRUE; + } #endif /* HAVE_DPMS_EXTENSION */ - # define SENSITIZE(NAME,SENSITIVEP) \ - gtk_widget_set_sensitive (win->NAME, (SENSITIVEP)) - - /* Blanking and Locking - */ - SENSITIZE (lock_button, can_lock_p); - SENSITIZE (lock_spinbutton, can_lock_p && p->lock_p); - SENSITIZE (lock_mlabel, can_lock_p && p->lock_p); - - /* DPMS - */ - SENSITIZE (dpms_button, dpms_supported); - SENSITIZE (dpms_standby_label, dpms_supported && p->dpms_enabled_p); - SENSITIZE (dpms_standby_mlabel, dpms_supported && p->dpms_enabled_p); - SENSITIZE (dpms_standby_spinbutton, dpms_supported && p->dpms_enabled_p); - SENSITIZE (dpms_suspend_label, dpms_supported && p->dpms_enabled_p); - SENSITIZE (dpms_suspend_mlabel, dpms_supported && p->dpms_enabled_p); - SENSITIZE (dpms_suspend_spinbutton, dpms_supported && p->dpms_enabled_p); - SENSITIZE (dpms_off_label, dpms_supported && p->dpms_enabled_p); - SENSITIZE (dpms_off_mlabel, dpms_supported && p->dpms_enabled_p); - SENSITIZE (dpms_off_spinbutton, dpms_supported && p->dpms_enabled_p); - SENSITIZE (dpms_quickoff_button, dpms_supported); - - SENSITIZE (fade_label, (p->fade_p || p->unfade_p)); - SENSITIZE (fade_spinbutton, (p->fade_p || p->unfade_p)); + gtk_widget_set_sensitive (win->NAME, (SENSITIVEP)) + + /* Blanking and Locking + */ + SENSITIZE (lock_button, can_lock_p); + SENSITIZE (lock_spinbutton, can_lock_p && p->lock_p); + SENSITIZE (lock_mlabel, can_lock_p && p->lock_p); + + /* DPMS + */ + SENSITIZE (dpms_button, s->dpms_supported_p); + SENSITIZE (dpms_standby_label, s->dpms_supported_p && p->dpms_enabled_p); + SENSITIZE (dpms_standby_mlabel, s->dpms_supported_p && p->dpms_enabled_p); + SENSITIZE (dpms_standby_spinbutton,s->dpms_supported_p && p->dpms_enabled_p); + SENSITIZE (dpms_suspend_label, s->dpms_supported_p && p->dpms_enabled_p); + SENSITIZE (dpms_suspend_mlabel, s->dpms_supported_p && p->dpms_enabled_p); + SENSITIZE (dpms_suspend_spinbutton,s->dpms_supported_p && p->dpms_enabled_p); + SENSITIZE (dpms_off_label, s->dpms_supported_p && p->dpms_enabled_p); + SENSITIZE (dpms_off_mlabel, s->dpms_supported_p && p->dpms_enabled_p); + SENSITIZE (dpms_off_spinbutton, s->dpms_supported_p && p->dpms_enabled_p); + SENSITIZE (dpms_quickoff_button, s->dpms_supported_p); + + SENSITIZE (fade_label, (p->fade_p || p->unfade_p)); + SENSITIZE (fade_spinbutton, (p->fade_p || p->unfade_p)); # undef SENSITIZE - if (!dpms_supported) - gtk_frame_set_label (GTK_FRAME (win->dpms_frame), - _("Display Power Management (not supported by this display)")); - } + if (!s->dpms_supported_p) + gtk_frame_set_label (GTK_FRAME (win->dpms_frame), + _("Display Power Management (not supported by this display)")); } @@ -2737,6 +2904,11 @@ sensitize_menu_items (state *s, Bool force_p) gtk_widget_set_sensitive (win->activate_menuitem, running_p); gtk_widget_set_sensitive (win->lock_menuitem, running_p); gtk_widget_set_sensitive (win->kill_menuitem, running_p); + + gtk_menu_item_set_label (GTK_MENU_ITEM (win->restart_menuitem), + (running_p + ? _("Restart Daemon") + : _("Launch Daemon"))); } @@ -2748,7 +2920,6 @@ populate_demo_window (state *s, int list_elt) { XScreenSaverWindow *win = XSCREENSAVER_WINDOW (s->window); XScreenSaverDialog *dialog = XSCREENSAVER_DIALOG (s->dialog); - Display *dpy = s->dpy; saver_preferences *p = &s->prefs; screenhack *hack; char *pretty_name; @@ -2756,16 +2927,15 @@ populate_demo_window (state *s, int list_elt) GtkFrame *frame2 = dialog ? GTK_FRAME (dialog->opt_frame) : 0; GtkEntry *cmd = dialog ? GTK_ENTRY (dialog->cmd_text) : 0; GtkComboBox *vis = dialog ? GTK_COMBO_BOX (dialog->visual_combo) : 0; - GtkWidget *list = GTK_WIDGET (win->list); /* Enforce a minimum size on the preview pane. */ - if (dpy) + if (s->dpy) { - int dw = DisplayWidth (dpy, 0); - int dh = DisplayHeight (dpy, 0); + int dw = DisplayWidth (s->dpy, 0); + int dh = DisplayHeight (s->dpy, 0); int minw, minh; # define TRY(W) do { \ - minw = (W); minh = minw * 9/16; \ + minw = (W); minh = minw * 9/16 + 48; \ if (dw > minw * 1.5 && dh > minh * 1.5) \ gtk_widget_set_size_request (GTK_WIDGET (frame1), minw, minh); \ } while(0) @@ -2800,7 +2970,7 @@ populate_demo_window (state *s, int list_elt) pretty_name = (hack ? (hack->name ? strdup (hack->name) - : make_hack_name (dpy, hack->command)) + : make_hack_name (s->dpy, hack->command)) : 0); if (hack) @@ -2843,7 +3013,9 @@ populate_demo_window (state *s, int list_elt) if (pretty_name) free (pretty_name); - ensure_selected_item_visible (list); + /* This causes the window to scroll out from under the mouse when + clicking on an item, vertically centering it. That's annoying. */ + /* ensure_selected_item_visible (s, list); */ s->_selected_list_element = list_elt; } @@ -2876,7 +3048,6 @@ sort_hack_cmp (const void *a, const void *b) static void initialize_sort_map (state *s) { - Display *dpy = s->dpy; saver_preferences *p = &s->prefs; int i, j; @@ -2927,7 +3098,7 @@ initialize_sort_map (state *s) screenhack *hack = p->screenhacks[i]; char *name = (hack->name && *hack->name ? strdup (hack->name) - : make_hack_name (dpy, hack->command)); + : make_hack_name (s->dpy, hack->command)); gchar *s2 = g_str_to_ascii (name, 0); /* Sort "Möbius" properly */ gchar *s3 = g_ascii_strdown (s2, -1); free (name); @@ -2962,7 +3133,6 @@ initialize_sort_map (state *s) static int maybe_reload_init_file (state *s) { - Display *dpy = s->dpy; saver_preferences *p = &s->prefs; XScreenSaverWindow *win = XSCREENSAVER_WINDOW (s->window); int status = 0; @@ -2984,7 +3154,7 @@ maybe_reload_init_file (state *s) warning_dialog (s->window, _("Warning"), b); free (b); - load_init_file (dpy, p); + load_init_file (s->dpy, p); initialize_sort_map (s); list_elt = selected_list_element (s); @@ -2995,7 +3165,7 @@ maybe_reload_init_file (state *s) populate_prefs_page (s); populate_demo_window (s, list_elt); populate_popup_window (s); - ensure_selected_item_visible (list); + ensure_selected_item_visible (s, list); status = 1; } @@ -3052,6 +3222,37 @@ clear_preview_window (state *s) } +static gboolean +preview_resize_cb (GtkWidget *self, GdkEvent *event, gpointer data) +{ + XScreenSaverWindow *win = XSCREENSAVER_WINDOW (data); + state *s = &win->state; + + /* If a subproc is running, clear the window to black when we resize. + Without this, sometimes turds get left behind. */ + if (s->dpy && !s->wayland_p && s->running_preview_cmd) + { + GdkWindow *window = gtk_widget_get_window (self); + Window id; + XWindowAttributes xgwa; + XGCValues gcv; + GC gc; + + if (! window) return TRUE; + id = gdk_x11_window_get_xid (window); + if (! id) return TRUE; + + /* Not sure why XClearWindow is insufficient here, but it is. */ + XGetWindowAttributes (s->dpy, id, &xgwa); + gcv.foreground = BlackPixelOfScreen (xgwa.screen); + gc = XCreateGC (s->dpy, id, GCForeground, &gcv); + XFillRectangle (s->dpy, id, gc, 0, 0, xgwa.width, xgwa.height); + XFreeGC (s->dpy, gc); + } + return FALSE; +} + + static void reset_preview_window (state *s) { @@ -3073,7 +3274,7 @@ reset_preview_window (state *s) gtk_widget_realize (pr); gtk_widget_show (pr); id = (window ? gdk_x11_window_get_xid (window) : 0); - if (s->debug_p) + if (s->debug_p && oid != id) fprintf (stderr, "%s: window id 0x%X -> 0x%X\n", blurb(), (unsigned int) oid, (unsigned int) id); @@ -3176,7 +3377,6 @@ reap_zombies (state *s) static Visual * get_best_gl_visual (state *s) { - Display *dpy = s->dpy; pid_t forked; int fds [2]; int in, out; @@ -3210,7 +3410,7 @@ get_best_gl_visual (state *s) int stdout_fd = 1; close (in); /* don't need this one */ - close (ConnectionNumber (dpy)); /* close display fd */ + close (ConnectionNumber (s->dpy)); /* close display fd */ if (dup2 (out, stdout_fd) < 0) /* pipe stdout */ { @@ -3268,7 +3468,7 @@ get_best_gl_visual (state *s) } else { - Visual *v = id_to_visual (DefaultScreenOfDisplay (dpy), result); + Visual *v = id_to_visual (DefaultScreenOfDisplay (s->dpy), result); if (s->debug_p) fprintf (stderr, "%s: %s says the GL visual is 0x%X.\n", blurb(), av[0], result); @@ -3281,6 +3481,7 @@ get_best_gl_visual (state *s) abort(); } + static void kill_preview_subproc (state *s, Bool reset_p) { @@ -3392,6 +3593,9 @@ launch_preview_subproc (state *s) (unsigned int) id); } + if (id && s->screenshot) + screenshot_save (s->dpy, id, s->screenshot); + kill_preview_subproc (s, FALSE); if (! new_cmd) { @@ -3452,6 +3656,16 @@ launch_preview_subproc (state *s) } } + /* Put some props on the embedded preview window, for debugging. */ + XStoreName (s->dpy, id, "XScreenSaver Settings Preview"); + XChangeProperty (s->dpy, id, XA_WM_COMMAND, + XA_STRING, 8, PropModeReplace, + (unsigned char *) new_cmd, + strlen (new_cmd)); + XChangeProperty (s->dpy, id, XA_NET_WM_PID, + XA_CARDINAL, 32, PropModeReplace, + (unsigned char *) &forked, 1); + schedule_preview_check (s); DONE: @@ -3472,8 +3686,7 @@ hack_environment (state *s) ""; # endif - Display *dpy = s->dpy; - const char *odpy = dpy ? DisplayString (dpy) : ":0.0"; + const char *odpy = s->dpy ? DisplayString (s->dpy) : ":0.0"; char *ndpy = (char *) malloc(strlen(odpy) + 20); strcpy (ndpy, "DISPLAY="); strcat (ndpy, odpy); @@ -3599,7 +3812,7 @@ check_subproc_timer (gpointer data) if (status < 0 && errno == ESRCH) s->running_preview_error_p = TRUE; - if (s->debug_p) + if (s->debug_p && s->running_preview_error_p) { char *ss = subproc_pretty_name (s); fprintf (stderr, "%s: timer: pid %lu (%s) is %s\n", blurb(), @@ -3664,11 +3877,10 @@ screen_blanked_p (state *s) int format; unsigned long nitems, bytesafter; unsigned char *dataP = 0; - Display *dpy = s->dpy; Bool blanked_p = FALSE; if (!s->dpy) return FALSE; - if (XGetWindowProperty (dpy, RootWindow (dpy, 0), /* always screen #0 */ + if (XGetWindowProperty (s->dpy, RootWindow (s->dpy, 0), /* always screen 0 */ XA_SCREENSAVER_STATUS, 0, 3, FALSE, XA_INTEGER, &type, &format, &nitems, &bytesafter, @@ -3712,8 +3924,20 @@ static Bool multi_screen_p (Display *dpy) { monitor **monitors = dpy ? scan_monitors (dpy) : NULL; - Bool ret = monitors && monitors[0] && monitors[1]; - if (monitors) free_monitors (monitors); + Bool ret = FALSE; + if (monitors) + { + int count = 0; + int good_count = 0; + while (monitors[count]) + { + if (monitors[count]->sanity == S_SANE) + good_count++; + count++; + } + free_monitors (monitors); + ret = (good_count > 1); + } return ret; } @@ -3849,7 +4073,15 @@ kill_kde_screensaver (state *s) "warning: ignoring return value of 'system', declared with attribute warn_unused_result" */ - if (system ("dcop kdesktop KScreensaverIface enable false")) {} + int ac = 0; + char *av[10]; + av[ac++] = "dcop"; + av[ac++] = "kdesktop"; + av[ac++] = "KScreensaverIface"; + av[ac++] = "enable"; + av[ac++] = "false"; + av[ac] = 0; + fork_and_exec (s, ac, av); } @@ -3857,13 +4089,12 @@ static int the_network_is_not_the_computer (gpointer data) { state *s = (state *) data; - Display *dpy = s->dpy; char *rversion = 0, *ruser = 0, *rhost = 0; char *luser, *lhost; char *msg = 0; char *oname = 0; struct passwd *p = getpwuid (getuid ()); - const char *d = dpy ? DisplayString (dpy) : ":0.0"; + const char *d = s->dpy ? DisplayString (s->dpy) : ":0.0"; # if defined(HAVE_UNAME) struct utsname uts; @@ -3880,8 +4111,8 @@ the_network_is_not_the_computer (gpointer data) else luser = "???"; - if (dpy) - server_xscreensaver_version (dpy, &rversion, &ruser, &rhost); + if (s->dpy) + server_xscreensaver_version (s->dpy, &rversion, &ruser, &rhost); /* Make a buffer that's big enough for a number of copies of all the strings, plus some. */ @@ -3896,10 +4127,12 @@ the_network_is_not_the_computer (gpointer data) if ((!rversion || !*rversion) && !s->debug_p) { +# ifndef __APPLE__ sprintf (msg, _("The XScreenSaver daemon doesn't seem to be running\n" "on display \"%.25s\". Launch it now?"), d); +# endif } else if (p && ruser && *ruser && !!strcmp (ruser, p->pw_name)) { @@ -4071,7 +4304,6 @@ manual_cb (GtkButton *button, gpointer user_data) XScreenSaverDialog *dialog = XSCREENSAVER_DIALOG (user_data); XScreenSaverWindow *win = dialog->main; state *s = &win->state; - Display *dpy = s->dpy; saver_preferences *p = &s->prefs; GtkWidget *list_widget = win->list; int list_elt = selected_list_element (s); @@ -4083,7 +4315,7 @@ manual_cb (GtkButton *button, gpointer user_data) hack_number = s->list_elt_to_hack_number[list_elt]; flush_dialog_changes_and_save (s); - ensure_selected_item_visible (list_widget); + ensure_selected_item_visible (s, list_widget); name = strdup (p->screenhacks[hack_number]->command); name2 = name; @@ -4095,17 +4327,18 @@ manual_cb (GtkButton *button, gpointer user_data) str = strrchr (name2, '/'); if (str) name2 = str+1; - cmd = get_string_resource (dpy, "manualCommand", "ManualCommand"); + cmd = get_string_resource (s->dpy, "manualCommand", "ManualCommand"); if (cmd) { + int ac = 0; + char *av[10]; char *cmd2 = (char *) malloc (strlen (cmd) + (strlen (name2) * 4) + 100); - strcpy (cmd2, "( "); - sprintf (cmd2 + strlen (cmd2), - cmd, - name2, name2, name2, name2); - strcat (cmd2, " ) &"); - if (system (cmd2) < 0) - fprintf (stderr, "%s: fork error\n", blurb()); + sprintf (cmd2, cmd, name2, name2, name2, name2); + av[ac++] = "/bin/sh"; + av[ac++] = "-c"; + av[ac++] = cmd2; + av[ac] = 0; + fork_and_exec (s, ac, av); free (cmd2); } else @@ -4323,12 +4556,11 @@ populate_popup_window (state *s) if (s->cdata && s->cdata->year) { XScreenSaverWindow *win = XSCREENSAVER_WINDOW (s->window); - Display *dpy = s->dpy; GtkFrame *frame1 = GTK_FRAME (win->preview_frame); GtkFrame *frame2 = GTK_FRAME (dialog->opt_frame); char *pretty_name = (hack->name ? strdup (hack->name) - : make_hack_name (dpy, hack->command)); + : make_hack_name (s->dpy, hack->command)); char *s2 = (char *) malloc (strlen (pretty_name) + 20); sprintf (s2, "%s (%d)", pretty_name, s->cdata->year); free (pretty_name); @@ -4538,6 +4770,7 @@ wm_decoration_origin (GtkWindow *gtkw, int *x, int *y) if (!dpy || !xw) return; if (! XQueryTree (dpy, xw, &root, &parent, &kids, &nkids)) abort (); + if (kids) XFree ((char *) kids); if (parent == root) /* No window above us at all */ return; @@ -4648,7 +4881,7 @@ delayed_scroll_kludge (gpointer data) state *s = (state *) data; XScreenSaverWindow *win = XSCREENSAVER_WINDOW (s->window); GtkWidget *list_widget = win->list; - ensure_selected_item_visible (list_widget); + ensure_selected_item_visible (s, list_widget); return FALSE; /* do not re-execute timer */ } @@ -4871,6 +5104,13 @@ xscreensaver_window_realize (GtkWidget *self, gpointer user_data) } # endif + /* Grab the screenshot pixmap before mapping the window. */ + if (s->dpy && !s->wayland_p) + { + GdkWindow *gw = gtk_widget_get_window (win->preview); + Window xw = gdk_x11_window_get_xid (gw); + s->screenshot = screenshot_grab (s->dpy, xw, TRUE, s->debug_p); + } /* Issue any warnings about the running xscreensaver daemon. Wait a few seconds, in case things are still starting up. */ @@ -4894,6 +5134,8 @@ xscreensaver_window_init (XScreenSaverWindow *win) G_CALLBACK (xscreensaver_window_realize), win); g_signal_connect (win, "configure-event", G_CALLBACK (xscreensaver_window_resize_cb),win); + g_signal_connect (win->preview, "configure-event", + G_CALLBACK (preview_resize_cb),win); } @@ -5094,6 +5336,13 @@ main (int argc, char *argv[]) if (s) progname = s+1; g_log_set_default_handler (g_logger, NULL); g_log_set_writer_func (g_other_logger, NULL, NULL); + +# ifdef ENABLE_NLS + bindtextdomain (GETTEXT_PACKAGE, LOCALEDIR); + textdomain (GETTEXT_PACKAGE); + bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8"); +# endif /* ENABLE_NLS */ + return g_application_run (G_APPLICATION (xscreensaver_app_new()), argc, argv); } diff --git a/driver/demo.ui b/driver/demo.ui index acd53609..8860c9d3 100644 --- a/driver/demo.ui +++ b/driver/demo.ui @@ -156,7 +156,7 @@ - + _Restart Daemon True False @@ -298,553 +298,191 @@ - 0 False False + - - 8 + True - False - 0 - horizontal + True + True + True + GTK_POS_TOP + False + False + + + - + True - True - True - True - GTK_POS_TOP - False - False - + 12 + 12 + 12 + 12 + False - + 10 True - 2 - 2 False - 0 - 0 + 4 + vertical + False + True - + True - 3 - 4 False - 2 - 0 + 0 + horizontal - + True - _Cycle After + _Mode: True False - GTK_JUSTIFY_RIGHT - False - False - 1 - 0.5 - 8 - 0 - cycle_spinbutton - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - - - - - 1 - 2 - 1 - 2 - fill - - - - - - True - Whether a password should be required to un-blank the screen. - False - False - - - True - True - _Lock Screen After - True - GTK_RELIEF_NORMAL - True - False - False - True - - - - - - - - - Lock Screen - - - - - - - 0 - 2 - 2 - 3 - fill - - - - - - True - How long before the screen saver activates. - True - 15 - 0 - True - GTK_UPDATE_ALWAYS - True - False - adjustment1 - - - - - - - - - - - - 2 - 3 - 0 - 1 - fill - - - - - - True - How long after the screen blanks until a password will be required. - True - 15 - 0 - True - GTK_UPDATE_ALWAYS - True - False - adjustment2 - - - - - - - - - - - - - Lock Screen After - - - - - 2 - 3 - 2 - 3 - 10 - fill - - - - - - True - How long each display mode should run before choosing a new one (in Random mode.) - True - 15 - 0 - True - GTK_UPDATE_ALWAYS - True - False - adjustment3 - - - - - - - - - - - - 2 - 3 - 1 - 2 - fill - - - - - - True - minutes - False - False - GTK_JUSTIFY_LEFT - False - False - 0 - 0.5 - 8 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - - - - - 3 - 4 - 2 - 3 - - - - - - True - minutes - False - False GTK_JUSTIFY_LEFT False False 0 0.5 - 8 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - - - - - 3 - 4 - 1 - 2 - - - - - - True - _Blank After - True - False - GTK_JUSTIFY_RIGHT - False - False - 1 - 0.5 - 8 + 0 0 - timeout_spinbutton + mode_menu PANGO_ELLIPSIZE_NONE -1 False 0 - - + - 1 - 2 - 0 - 1 - fill - + 0 + False + False - + True - minutes - False - False - GTK_JUSTIFY_LEFT - False - False - 0 - 0.5 - 8 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 + True + False + mode_menu_model + - - + + + + + 0 + + - 3 - 4 - 0 - 1 - + 4 + True + True - 0 - 1 - 1 - 2 - fill - fill + 10 + False + True - + True - GTK_BUTTONBOX_SPREAD - 30 - - - True - Demo the selected screen saver in full-screen mode (click the mouse to return.) - True - True - _Preview - True - GTK_RELIEF_NORMAL - True - - - + True + GTK_POLICY_NEVER + GTK_POLICY_ALWAYS + GTK_SHADOW_IN + GTK_CORNER_TOP_LEFT - + True - Customization and explanation of the selected screen saver. - True True - _Settings... - True - GTK_RELIEF_NORMAL - True - + False + True + False + True + False + False + False + 1 - 1 - 2 - 1 - 2 - fill - fill + 0 + True + True - - 10 + True - False + True 0 - vertical + horizontal + 4 + 8 - + True False - 0 + 8 horizontal - - True - _Mode: - True - False - GTK_JUSTIFY_LEFT - False - False - 0 - 0.5 - 0 - 0 - mode_menu - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - - - - 0 - False - False - - - - + True + Run the next screen saver in the list in full-screen mode (click the mouse to return). True - False - mode_menu_model - - - - + GTK_RELIEF_NORMAL + True + - - - 0 - + + True + GTK_ARROW_DOWN + GTK_SHADOW_OUT + 0.5 + 0.5 + 0 + 0 + - 4 - True - True + 0 + False + False - - - 10 - False - True - - - - - True - True - GTK_POLICY_NEVER - GTK_POLICY_ALWAYS - GTK_SHADOW_IN - GTK_CORNER_TOP_LEFT - + True + Run the previous screen saver in the list in full-screen mode. True - False - True - False - True - False - False - False - 1 - - - - - 0 - True - True - - - - - True - True - 0 - horizontal - - - True - False - 0 - horizontal - - - True - Run the next screen saver in the list in full-screen mode (click the mouse to return.) - True - GTK_RELIEF_NORMAL - True - - - - True - GTK_ARROW_DOWN - GTK_SHADOW_OUT - 0.5 - 0.5 - 0 - 0 - - - - - 0 - False - False - - + GTK_RELIEF_NORMAL + True + - + True - Run the previous screen saver in the list in full-screen mode (click the mouse to return.) - True - GTK_RELIEF_NORMAL - True - - - - True - GTK_ARROW_UP - GTK_SHADOW_OUT - 0.5 - 0.5 - 0 - 0 - - + GTK_ARROW_UP + GTK_SHADOW_OUT + 0.5 + 0.5 + 0 + 0 - - 0 - False - False - @@ -857,1775 +495,1970 @@ 0 False - True - GTK_PACK_END + False - 0 - 1 + 0 + False + True + GTK_PACK_END + + + + + 0 + 0 + + + + + True + 2 + 8 + 8 + + + True + _Blank After + True + False + GTK_JUSTIFY_RIGHT + False + False + 1 + 0.5 + 8 + 0 + timeout_spinbutton + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + + + + + 0 + 0 + + + + + True + How long before the screen saver activates. + True + 15 + 0 + True + GTK_UPDATE_ALWAYS + True + False + adjustment1 + + + + + + + + + + + + + + + 1 + 0 + + + + + True + minutes + False + False + GTK_JUSTIFY_LEFT + False + False + 0 + 0.5 + 8 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + + + + + 2 0 - 1 - fill - + + True + _Cycle After + True + False + GTK_JUSTIFY_RIGHT + False + False + 1 + 0.5 + 8 + 0 + cycle_spinbutton + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + + + + + 0 + 1 + + + + + True + How long each display mode should run before choosing a new one (in Random mode). + True + 15 + 0 + True + GTK_UPDATE_ALWAYS + True + False + adjustment3 + + + + + + + + + + + + 1 + 1 + + + + True - 0 - 0.5 - GTK_SHADOW_ETCHED_IN + minutes + False + False + GTK_JUSTIFY_LEFT + False + False + 0 + 0.5 + 8 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 - + + + + + 2 + 1 + + + + + True + Whether a password should be required to un-blank the screen. + False + False - - 5 + True - False - 5 - vertical + True + _Lock Screen After + True + GTK_RELIEF_NORMAL + True + False + False + True + + + + + + + + + Lock Screen + + + + + + + 0 + 2 + + + + + True + How long after the screen blanks until a password will be required. + True + 15 + 0 + True + GTK_UPDATE_ALWAYS + True + False + adjustment2 + + + + + + + + + + + + + Lock Screen After + + + + + 1 + 2 + + + + + True + minutes + False + False + GTK_JUSTIFY_LEFT + False + False + 0 + 0.5 + 8 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + + + + + 2 + 2 + + + + + 0 + 1 + + + + + True + 0 + 0.5 + GTK_SHADOW_ETCHED_IN + True + True + + + + + + 5 + True + False + 5 + vertical + + + True + True + False + False + GTK_POS_BOTTOM + False + False + - + + 8 True - True - False - False - GTK_POS_BOTTOM - False - False - - - - 8 - True - 0 - 0.5 - GTK_SHADOW_ETCHED_IN - 0.5 - 0.5 - 1.777777 - False - - - True - - - - - False - False - - - - - True - Preview - False - False - GTK_JUSTIFY_LEFT - False - False - 0.5 - 0.5 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - False - False - - - - - - True - No Preview -Available - False - False - GTK_JUSTIFY_CENTER - False - False - 0.5 - 0.5 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - False - False - - - - - True - No Preview - False - False - GTK_JUSTIFY_LEFT - False - False - 0.5 - 0.5 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - False - False - - - - - - True - Not -Installed - False - False - GTK_JUSTIFY_CENTER - False - False - 0.5 - 0.5 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - False - False - - - - - True - Not Installed - False - False - GTK_JUSTIFY_LEFT - False - False - 0.5 - 0.5 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - False - False - - - - - - True - Very few (or no) screen savers appear to be available. - -This probably means that the "xscreensaver-extras" and -"xscreensaver-gl-extras" packages are not installed. - False - False - GTK_JUSTIFY_CENTER - False - False - 0.5 - 0.5 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - False - False - - - - - True - Nothing Installed - False - False - GTK_JUSTIFY_LEFT - False - False - 0.5 - 0.5 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - False - False - - - False - False - - - + 0 + 0.5 + GTK_SHADOW_ETCHED_IN + 0.5 + 0.5 + 1.777777 + False - - True - No Previews Available -Under Wayland. - False - False - GTK_JUSTIFY_CENTER - False - False - 0.5 - 0.5 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - False - False - - - - + True - No Previews Under Wayland - False - False - GTK_JUSTIFY_LEFT - False - False - 0.5 - 0.5 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - False - False - - - False - False - - - 0 - True - True + False + False + + + + + True + Preview + False + False + GTK_JUSTIFY_LEFT + False + False + 0.5 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + False + False - + + True + No Preview +Available + False + False + GTK_JUSTIFY_CENTER + False + False + 0.5 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + False + False + + + + True - + No Preview False False GTK_JUSTIFY_LEFT - True + False False 0.5 - 0.0 + 0.5 0 0 PANGO_ELLIPSIZE_NONE - 72 + -1 False 0 - - - - 0 - False - False + False + False - + True - + Not +Installed False False GTK_JUSTIFY_CENTER - True + False False 0.5 - 0.0 + 0.5 0 0 PANGO_ELLIPSIZE_NONE - 72 + -1 False 0 - - - - 0 - False - True + False + False + + + True + Not Installed + False + False + GTK_JUSTIFY_LEFT + False + False + 0.5 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + False + False + + + + + + True + Very few (or no) screen savers appear to be available. + +This probably means that the "xscreensaver-extras" and +"xscreensaver-gl-extras" packages are not installed. + False + False + GTK_JUSTIFY_CENTER + False + False + 0.5 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + False + False + + + + + True + Nothing Installed + False + False + GTK_JUSTIFY_LEFT + False + False + 0.5 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + False + False + + + False + False + + + + + + True + No Previews Available +Under Wayland. + False + False + GTK_JUSTIFY_CENTER + False + False + 0.5 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + False + False + + + + + True + No Previews Under Wayland + False + False + GTK_JUSTIFY_LEFT + False + False + 0.5 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + False + False + + + False + False + + + + + 0 + True + True + - - + + + True - Description + False False GTK_JUSTIFY_LEFT - False + True False 0.5 - 0.5 + 0.0 0 0 PANGO_ELLIPSIZE_NONE - -1 + 72 + False + 0 + + + + + + 0 + False + False + + + + + + True + + False + False + GTK_JUSTIFY_CENTER + True + False + 0.5 + 0.0 + 0 + 0 + PANGO_ELLIPSIZE_NONE + 72 False 0 - + + + 0 + False + True + - - 1 - 2 - 0 - 1 - 6 - expand|shrink|fill - expand|shrink|fill - + + + + True + Description + False + False + GTK_JUSTIFY_LEFT + False + False + 0.5 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + + - False - False + 1 + 0 - - + + True - _Display Modes - True - False - GTK_JUSTIFY_CENTER - False - False - 0.5 - 0.5 - 0 - 0 - notebook - PANGO_ELLIPSIZE_NONE - -1 - False - 0 + GTK_BUTTONBOX_SPREAD + 30 + + + True + Demo the selected screen saver in full-screen mode. + True + True + _Preview + True + GTK_RELIEF_NORMAL + True + + + + + + True + Customization and explanation of the selected screen saver. + True + True + _Settings... + True + GTK_RELIEF_NORMAL + True + + + - False - False + 1 + 1 + + + False + False + + + + + True + _Display Modes + True + False + GTK_JUSTIFY_CENTER + False + False + 0.5 + 0.5 + 0 + 0 + notebook + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + False + False + + + + + + + True + 8 + 8 + True - + + 10 True - 2 - 2 - True - 0 - 0 + 0 + 0.5 + GTK_SHADOW_ETCHED_IN + True + + + - - 10 + True - 0 - 0.5 - GTK_SHADOW_ETCHED_IN - - - + False + vertical + 4 + 12 + 12 + 12 + 12 + + + True + Whether the image-manipulating modes should be allowed to operate on an image of your desktop. + True + Grab Desktop _Images + True + GTK_RELIEF_NORMAL + True + False + False + True + + + + 0 + False + False + + + + + True + Whether the image-manipulating modes should operate on images captured from the camera (if there is one). + True + Grab _Video Frames + True + GTK_RELIEF_NORMAL + True + False + False + True + + + + 0 + False + False + + + + + True + Whether the image-manipulating modes should load image files. + True + Choose _Random Image: + True + GTK_RELIEF_NORMAL + True + False + False + True + + + + + + + + 0 + False + False + + - - 8 + True False - 8 + 0 horizontal - + True - False - 0 - vertical - - - True - Whether the image-manipulating modes should be allowed to operate on an image of your desktop. - True - Grab Desktop _Images - True - GTK_RELIEF_NORMAL - True - False - False - True - - - - 0 - False - False - - - - - True - Whether the image-manipulating modes should operate on images captured from the system's video input (if there is one.) - True - Grab _Video Frames - True - GTK_RELIEF_NORMAL - True - False - False - True - - - - 0 - False - False - - - - - True - Whether the image-manipulating modes should load image files. - True - Choose _Random Image: - True - GTK_RELIEF_NORMAL - True - False - False - True - - - - - - - - 0 - False - False - - - - - True - False - 0 - horizontal - - - True - - False - False - GTK_JUSTIFY_LEFT - False - False - 0.5 - 0.5 - 8 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - 0 - False - False - - - - - True - The local directory, RSS feed or Atom feed from which images will be randomly chosen. - True - True - True - 0 - - True - * - False - - - - - - - - - 2 - True - True - - - - - True - True - _Browse - True - GTK_RELIEF_NORMAL - True - - - - 0 - False - False - - - - - 0 - False - False - - - - - True - Local directory, or URL of RSS or Atom feed. - False - False - GTK_JUSTIFY_LEFT - False - False - 0 - 0.5 - 20 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - 0 - False - False - - + + False + False + GTK_JUSTIFY_LEFT + False + False + 0.5 + 0.5 + 8 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 0 - True - True + False + False - - - - - True - Image Manipulation - False - False - GTK_JUSTIFY_LEFT - False - False - 0.5 - 0.5 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - - - - - - 0 - 1 - 0 - 1 - - - - - 10 - True - 0 - 0.5 - GTK_SHADOW_ETCHED_IN - - - - - - 8 - True - False - 8 - horizontal - + True - 5 - 3 - False - 2 - 2 - - - True - Text-displaying modes will display the text typed here. - True - _Text - True - GTK_RELIEF_NORMAL - True - False - False - True - - - - - - - - 0 - 1 - 1 - 2 - fill - - - - - - True - Text-displaying modes will display the contents of this file. - True - Text _file - True - GTK_RELIEF_NORMAL - True - False - False - True - text_radio - - - - - - - - 0 - 1 - 2 - 3 - fill - - - - - - True - Text-displaying modes will display the output of this program. - True - _Program - True - GTK_RELIEF_NORMAL - True - False - False - True - text_radio - - - - - - - - - 0 - 1 - 3 - 4 - fill - - - - - - True - Text-displaying modes will display the contents of this URL (HTML or RSS). - True - _URL - True - GTK_RELIEF_NORMAL - True - False - False - True - text_radio - - - - - - - - 0 - 1 - 4 - 5 - fill - - - - - - True - Text-displaying modes will display the local host name, date, and time. - True - _Host Name and Time - True - GTK_RELIEF_NORMAL - True - True - False - True - text_radio - - - - 0 - 3 - 0 - 1 - fill - - - - - - True - Text-displaying modes will display the contents of this URL (HTML or RSS). - True - True - True - 0 - - True - * - False - - - - - - - - 1 - 3 - 4 - 5 - - - - - - True - True - _Browse - True - GTK_RELIEF_NORMAL - True - - - - - - - 2 - 3 - 2 - 3 - fill - - - - - - True - Text-displaying modes will display the text typed here. - True - True - True - 0 - - True - * - False - - - - - - - - - 1 - 3 - 1 - 2 - - - - - - True - Text-displaying modes will display the output of this program. - True - True - True - 0 - - True - * - False - - - - - - - - - 1 - 2 - 3 - 4 - - - - - - True - True - _Browse - True - GTK_RELIEF_NORMAL - True - - - - - - - 2 - 3 - 3 - 4 - fill - - - - - - True - Text-displaying modes will display the contents of this file. - True - True - True - 0 - - True - * - False - - - - - - - - - 1 - 2 - 2 - 3 - - - + The local directory, RSS feed or Atom feed from which images will be randomly chosen. + True + True + True + 0 + + True + * + False + + + + + + - 0 + 2 True True - - - - - True - Text Manipulation - False - False - GTK_JUSTIFY_LEFT - False - False - 0.5 - 0.5 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - - - - - - 0 - 1 - 1 - 2 - fill - - - - - 10 - True - 0 - 0.5 - GTK_SHADOW_ETCHED_IN - - - 8 - True - False - 8 - horizontal - + True - False - 0 - vertical - - - True - Whether the monitor should be powered down after a while. - True - _Power Management Enabled - True - GTK_RELIEF_NORMAL - True - True - False - True - - - - - - - - - 0 - False - False - - - - - True - 3 - 3 - False - 2 - 4 - - - True - Stand_by After - True - False - GTK_JUSTIFY_LEFT - False - False - 1 - 0.5 - 10 - 0 - dpms_standby_spinbutton - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - - - - - 0 - 1 - 0 - 1 - fill - - - - - - True - Sus_pend After - True - False - GTK_JUSTIFY_LEFT - False - False - 1 - 0.5 - 10 - 0 - dpms_suspend_spinbutton - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - - - - - 0 - 1 - 1 - 2 - fill - - - - - - True - _Off After - True - False - GTK_JUSTIFY_LEFT - False - False - 1 - 0.5 - 10 - 0 - dpms_off_spinbutton - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - - - - - 0 - 1 - 2 - 3 - fill - - - - - - True - minutes - False - False - GTK_JUSTIFY_LEFT - False - False - 0 - 0.5 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - - - - - 2 - 3 - 0 - 1 - fill - - - - - - True - minutes - False - False - GTK_JUSTIFY_LEFT - False - False - 0 - 0.5 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - - - - - 2 - 3 - 1 - 2 - fill - - - - - - True - minutes - False - False - GTK_JUSTIFY_LEFT - False - False - 0 - 0.5 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - - - - - 2 - 3 - 2 - 3 - fill - - - - - - True - How long until the monitor powers down. - True - 15 - 0 - True - GTK_UPDATE_ALWAYS - True - False - adjustment4 - - - - - - - - - - - - - 1 - 2 - 2 - 3 - - - - - - - True - How long until the monitor goes into power-saving mode. - True - 15 - 0 - True - GTK_UPDATE_ALWAYS - True - False - adjustment5 - - - - - - - - - - - - - 1 - 2 - 1 - 2 - - - - - - - True - How long until the monitor goes completely black. - True - 15 - 0 - True - GTK_UPDATE_ALWAYS - True - False - adjustment6 - - - - - - - - - - - - - 1 - 2 - 0 - 1 - - - - - - - 0 - False - True - - - - - True - Whether the monitor should be powered off immediately in "Blank Screen Only" mode, regardless of the above power-management timeouts. - True - _Quick Power-off in Blank Only Mode - True - GTK_RELIEF_NORMAL - True - False - False - True - - - - 0 - False - False - - + True + _Browse + True + GTK_RELIEF_NORMAL + True + 0 - True - True + False + False + + 0 + False + False + - - + + True - Display Power Management + Local directory, or URL of RSS or Atom feed. False False GTK_JUSTIFY_LEFT False False - 0.5 + 0 0.5 - 0 + 20 0 PANGO_ELLIPSIZE_NONE -1 False 0 - - - + + 0 + False + False + - - 1 - 2 - 0 - 1 - fill - - - - 10 + + + True + Image Manipulation + False + False + GTK_JUSTIFY_LEFT + False + False + 0.5 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + + + + + + 0 + 0 + + + + + 10 + True + 0 + 0.5 + GTK_SHADOW_ETCHED_IN + False + True + + + + + True - 0 - 0.5 - GTK_SHADOW_ETCHED_IN + Text Manipulation + False + False + GTK_JUSTIFY_LEFT + False + False + 0.5 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 - + + + + + + True + 4 + 4 + 12 + 12 + 12 + 12 - - 8 + True - False - 8 - horizontal - - - True - False - 0 - vertical - - - True - Whether the screen should slowly fade to black when the screen saver activates. - True - Fade to Black when _Blanking - True - GTK_RELIEF_NORMAL - True - False - False - True - - - - - - - 0 - False - False - - - - - True - Whether the screen should slowly fade in from black when the screen saver deactivates. - True - Fade from Black When _Unblanking - True - GTK_RELIEF_NORMAL - True - False - False - True - - - - - - - 0 - False - False - - - - - True - False - 0 - horizontal - - - True - - False - False - GTK_JUSTIFY_LEFT - False - False - 0.5 - 0.5 - 3 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - 0 - False - False - - - - - True - F_ade Duration - True - False - GTK_JUSTIFY_LEFT - False - False - 0 - 0.5 - 0 - 0 - fade_spinbutton - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - - - - - 14 - False - False - - - - - True - How long it should take for the screen to fade in and out. - True - 1 - 0 - True - GTK_UPDATE_ALWAYS - True - False - adjustment7 - - - - - - - - - - - - - - 4 - False - False - - - - - True - seconds - False - False - GTK_JUSTIFY_LEFT - False - False - 0 - 0.5 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - - - - - 2 - False - False - - - - - 0 - False - False - - - - - True - - - 8 - False - False - - - - - True - False - 0 - horizontal - - - True - _Theme: - The color scheme to use on the unlock dialog. - True - False - GTK_JUSTIFY_LEFT - False - False - 0 - 0.5 - 0 - 0 - theme_menu - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - - - - 0 - False - False - - - - - True - True - False - theme_menu_model - - - - - - - 0 - - - - - 4 - False - False - - - - - True - Show the what the unlock dialog will look like. - True - True - _Preview - True - GTK_RELIEF_NORMAL - True - - - - 0 - False - False - - - - - 10 - False - True - - - - - 0 - True - True - - + Text-displaying modes will display the local host name, date, and time. + True + _Host Name and Time + True + GTK_RELIEF_NORMAL + True + True + False + True + text_radio + + + 0 + 0 + 3 + - - + + True - Blanking - False - False - GTK_JUSTIFY_LEFT - False - False - 0.5 - 0.5 - 0 - 0 - PANGO_ELLIPSIZE_NONE - -1 - False - 0 + Text-displaying modes will display the text typed here. + True + _Text + True + GTK_RELIEF_NORMAL + True + False + False + True - + + + + + 0 + 1 + - - - 1 - 2 - 1 - 2 - fill - fill - - - - - False - False - - - - - True - _Advanced - True - False - GTK_JUSTIFY_LEFT - False - False - 0.5 - 0.5 - 0 - 0 - notebook - PANGO_ELLIPSIZE_NONE - -1 - False - 0 - - - False - False - - + + + True + Text-displaying modes will display the text typed here. + True + True + True + 0 + + True + * + False + True + + + + + + + + + 1 + 1 + 2 + + + + + True + Text-displaying modes will display the contents of this file. + True + Text _file + True + GTK_RELIEF_NORMAL + True + False + False + True + text_radio + + + + + + + + 0 + 2 + + + + + True + Text-displaying modes will display the contents of this file. + True + True + True + 0 + + True + * + False + True + + + + + + + + + 1 + 2 + + + + + True + True + _Browse + True + GTK_RELIEF_NORMAL + True + False + + + + + + + 2 + 2 + + + + + True + Text-displaying modes will display the output of this program. + True + _Program + True + GTK_RELIEF_NORMAL + True + False + False + True + text_radio + + + + + + + + + 0 + 3 + + + + + True + Text-displaying modes will display the output of this program. + True + True + True + 0 + + True + * + False + True + + + + + + + + + 1 + 3 + + + + + True + True + _Browse + True + GTK_RELIEF_NORMAL + True + False + + + + + + + 2 + 3 + + + + + True + Text-displaying modes will display the contents of this URL (HTML or RSS). + True + _URL + True + GTK_RELIEF_NORMAL + True + False + False + True + text_radio + + + + + + + + 0 + 4 + + + + + True + Text-displaying modes will display the contents of this URL (HTML or RSS). + True + True + True + 0 + + True + * + False + True + + + + + + + + 1 + 4 + 2 + + + + + + + 0 + 1 + + + + + 10 + True + 0 + 0.5 + GTK_SHADOW_ETCHED_IN + False + + + True + False + 4 + 12 + 12 + 12 + 12 + vertical + + + True + Whether the monitor should be powered down after a while. + True + _Power Management Enabled + True + GTK_RELIEF_NORMAL + True + True + False + True + + + + + + + + + 0 + False + False + + + + + True + 2 + 4 + + + True + Stand_by After + True + False + GTK_JUSTIFY_LEFT + False + False + 1 + 0.5 + 10 + 0 + dpms_standby_spinbutton + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + + + + + 0 + 0 + + + + + True + Sus_pend After + True + False + GTK_JUSTIFY_LEFT + False + False + 1 + 0.5 + 10 + 0 + dpms_suspend_spinbutton + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + + + + + 0 + 1 + + + + + True + _Off After + True + False + GTK_JUSTIFY_LEFT + False + False + 1 + 0.5 + 10 + 0 + dpms_off_spinbutton + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + + + + + 0 + 2 + + + + + True + minutes + False + False + GTK_JUSTIFY_LEFT + False + False + 0 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + + + + + 2 + 0 + + + + + True + minutes + False + False + GTK_JUSTIFY_LEFT + False + False + 0 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + + + + + 2 + 1 + + + + + True + minutes + False + False + GTK_JUSTIFY_LEFT + False + False + 0 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + + + + + 2 + 2 + + + + + True + How long until the monitor powers down. + True + 15 + 0 + True + GTK_UPDATE_ALWAYS + True + False + adjustment4 + + + + + + + + + + + + + + + + 1 + 2 + + + + + True + How long until the monitor goes into power-saving mode. + True + 15 + 0 + True + GTK_UPDATE_ALWAYS + True + False + adjustment5 + + + + + + + + + + + + + + + + 1 + 1 + + + + + True + How long until the monitor goes completely black. + True + 15 + 0 + True + GTK_UPDATE_ALWAYS + True + False + adjustment6 + + + + + + + + + + + + + + + + 1 + 0 + + + + + 0 + False + True + + + + + True + Whether the monitor should be powered off immediately in "Blank Screen Only" mode, regardless of the above power-management timeouts. + True + _Quick Power-off in Blank Only Mode + True + GTK_RELIEF_NORMAL + True + False + False + True + + + + 0 + False + False + + + + + + + True + Display Power Management + False + False + GTK_JUSTIFY_LEFT + False + False + 0.5 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + + + + + + 1 + 0 + + + + + 10 + True + 0 + 0.5 + GTK_SHADOW_ETCHED_IN + False + + + + + + True + False + vertical + 4 + 12 + 12 + 12 + 12 + + + True + Whether the screen should slowly fade to black when the screen saver activates. + True + Fade to Black when _Blanking + True + GTK_RELIEF_NORMAL + True + False + False + True + + + + + + + 0 + False + False + + + + + True + Whether the screen should slowly fade in from black when the screen saver deactivates. + True + Fade from Black When _Unblanking + True + GTK_RELIEF_NORMAL + True + False + False + True + + + + + + + 0 + False + False + + + + + True + False + 0 + horizontal + + + True + + False + False + GTK_JUSTIFY_LEFT + False + False + 0.5 + 0.5 + 3 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 0 + False + False + + + + + True + F_ade Duration + True + False + GTK_JUSTIFY_LEFT + False + False + 0 + 0.5 + 0 + 0 + fade_spinbutton + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + + + + + 14 + False + False + + + + + True + How long it should take for the screen to fade in and out. + True + 1 + 0 + True + GTK_UPDATE_ALWAYS + True + False + adjustment7 + + + + + + + + + + + + + + 4 + False + False + + + + + True + seconds + False + False + GTK_JUSTIFY_LEFT + False + False + 0 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + + + + + 2 + False + False + + + + + 0 + False + False + + + + + True + + + 8 + False + False + + + + + True + False + 0 + horizontal + + + True + _Theme: + The color scheme to use on the unlock dialog. + True + False + GTK_JUSTIFY_LEFT + False + False + 0 + 0.5 + 0 + 0 + theme_menu + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + + + + 0 + False + False + + + + + True + True + False + theme_menu_model + + + + + + + 0 + + + + + 4 + False + False + + + + + True + Show the what the unlock dialog will look like. + True + True + _Preview + True + GTK_RELIEF_NORMAL + True + + + + 0 + False + False + + + + + 10 + False + True + + + + + + + True + Blanking + False + False + GTK_JUSTIFY_LEFT + False + False + 0.5 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + + + + + + 1 + 1 + + + + + False + False + + + + + True + _Advanced + True + False + GTK_JUSTIFY_LEFT + False + False + 0.5 + 0.5 + 0 + 0 + notebook + PANGO_ELLIPSIZE_NONE + -1 + False + 0 - 0 - True - True + False + False @@ -2673,6 +2506,10 @@ Under Wayland. + + True + True + diff --git a/driver/fade.c b/driver/fade.c index 885ccc44..46a56efa 100644 --- a/driver/fade.c +++ b/driver/fade.c @@ -19,7 +19,7 @@ - XF86 Gamma or RANDR Gamma: These do the fade by altering the brightness settings of the screen. This works on any system that has the "XF86 Video-Mode" extension (which is every modern system) AND ALSO has gamma - support in the video driver. But it turns out that as of 2021, the + support in the video driver. But it turns out that as of 2022, the Raspberry Pi HDMI video driver still does not support gamma. And there's no way to determine that the video driver lacks gamma support even though the extension exists. Since the Pi is probably the single most popular diff --git a/driver/prefsw.c b/driver/prefsw.c index 64da1eb5..78eb45b1 100644 --- a/driver/prefsw.c +++ b/driver/prefsw.c @@ -1340,36 +1340,29 @@ stop_the_insanity (saver_preferences *p) p->fade_p = False; if (! p->fade_p) p->unfade_p = False; - /* The DPMS settings may have the value 0. - But if they are negative, or are a range less than 10 seconds, - reset them to sensible defaults. (Since that must be a mistake.) + /* DPMS settings may be zero, but otherwise, if they < 10 sec or negative, + set them to 2 minutes. */ +# define THROTTLE(FIELD) \ + if (p->FIELD != 0 && ((long) p->FIELD) < 10 * 1000) \ + p->FIELD = 2 * 60 * 60 * 1000 + THROTTLE (dpms_standby); + THROTTLE (dpms_suspend); + THROTTLE (dpms_off); +# undef THROTTLE + + /* If the DPMS settings are non-zero, they must not go backwards: + standby >= timeout (screen saver activation) + suspend >= standby + off >= suspend */ - if (p->dpms_standby != 0 && - p->dpms_standby < 10 * 1000) - p->dpms_standby = 2 * 60 * 60 * 1000; /* 2 hours */ - if (p->dpms_suspend != 0 && - p->dpms_suspend < 10 * 1000) - p->dpms_suspend = 2 * 60 * 60 * 1000; /* 2 hours */ - if (p->dpms_off != 0 && - p->dpms_off < 10 * 1000) - p->dpms_off = 4 * 60 * 60 * 1000; /* 4 hours */ - - /* suspend may not be greater than off, unless off is 0. - standby may not be greater than suspend, unless suspend is 0. - */ - if (p->dpms_off != 0 && - p->dpms_suspend > p->dpms_off) - p->dpms_suspend = p->dpms_off; - if (p->dpms_suspend != 0 && - p->dpms_standby > p->dpms_suspend) - p->dpms_standby = p->dpms_suspend; - - /* These fixes above ignores the case - suspend = 0 and standby > off ... - */ - if (p->dpms_off != 0 && - p->dpms_standby > p->dpms_off) - p->dpms_standby = p->dpms_off; +# define THROTTLE(FIELD,LOWER) \ + if (p->FIELD != 0 && ((long) p->FIELD) < ((long) p->LOWER)) \ + p->FIELD = p->LOWER + THROTTLE (dpms_standby, timeout); + THROTTLE (dpms_suspend, dpms_standby); + THROTTLE (dpms_off, dpms_standby); + THROTTLE (dpms_off, dpms_suspend); +#undef THROTTLE if (p->dpms_standby == 0 && /* if *all* are 0, then DPMS is disabled */ p->dpms_suspend == 0 && diff --git a/driver/subprocs.c b/driver/subprocs.c index 6385a1f1..edb5cd42 100644 --- a/driver/subprocs.c +++ b/driver/subprocs.c @@ -53,6 +53,7 @@ #include "yarandom.h" #include "visual.h" /* for id_to_visual() */ #include "atoms.h" +#include "screenshot.h" enum job_status { @@ -65,6 +66,8 @@ enum job_status { element will be removed. */ }; +#define EXEC_FAILED_EXIT_STATUS -33 + struct screenhack_job { char *name; pid_t pid; @@ -580,7 +583,10 @@ describe_dead_child (saver_info *si, pid_t kid, int wait_status, /* Treat exit code as a signed 8-bit quantity. */ if (exit_status & 0x80) exit_status |= ~0xFF; - sprintf (msg, _("crashed with status %d"), exit_status); + if (exit_status == EXEC_FAILED_EXIT_STATUS) + strcpy (msg, _("is not installed")); + else + sprintf (msg, _("crashed with status %d"), exit_status); if (p->verbose_p) fprintf (stderr, "%s: %d: child pid %lu (%s) exited abnormally" @@ -777,7 +783,7 @@ fork_and_exec (saver_screen_info *ssi, const char *command) exec_command (p->shell, command, p->nice_inferior); /* If that returned, we were unable to exec the subprocess. */ - exit (1); /* exits child fork */ + exit (EXEC_FAILED_EXIT_STATUS); /* exits child fork */ break; default: /* parent */ @@ -961,6 +967,11 @@ spawn_screenhack (saver_screen_info *ssi) goto AGAIN; } + /* Install screenshot property on window. Must be after + select_visual_of_hack() which might replace the window. */ + if (ssi->screenshot) + screenshot_save (si->dpy, ssi->screensaver_window, ssi->screenshot); + if (getuid() == (uid_t) 0 || geteuid() == (uid_t) 0) /* Prior to XScreenSaver 6, if running as root, we would change the effective uid to the user "nobody" or "daemon" or "noaccess", diff --git a/driver/types.h b/driver/types.h index 6eca284d..7732f131 100644 --- a/driver/types.h +++ b/driver/types.h @@ -191,7 +191,7 @@ struct saver_screen_info { real root window. */ unsigned long black_pixel; /* Black, allocated from `cmap'. */ Window error_dialog; /* Error message about crashed savers */ - + Pixmap screenshot; /* Saved screen image before activation */ XtIntervalId cycle_id; /* Timer to implement `prefs.cycle' */ time_t cycle_at; /* When cycle_id will fire */ diff --git a/driver/windows.c b/driver/windows.c index cd47f4f8..6f67e138 100644 --- a/driver/windows.c +++ b/driver/windows.c @@ -38,6 +38,7 @@ #include "atoms.h" #include "visual.h" #include "screens.h" +#include "screenshot.h" #include "fade.h" #include "resources.h" #include "xft.h" @@ -435,6 +436,16 @@ blank_screen (saver_info *si) initialize_screensaver_window (si); sync_server_dpms_settings (si->dpy, p); + /* Save a screenshot. Must be before fade-out. */ + for (i = 0; i < si->nscreens; i++) + { + saver_screen_info *ssi = &si->screens[i]; + if (ssi->screenshot) + XFreePixmap (si->dpy, ssi->screenshot); + ssi->screenshot = + screenshot_grab (si->dpy, ssi->screensaver_window, False, p->verbose_p); + } + if (p->fade_p && !si->demoing_p && !si->emergency_p) diff --git a/driver/xscreensaver-auth.c b/driver/xscreensaver-auth.c index 0a1cc612..a65cc0da 100644 --- a/driver/xscreensaver-auth.c +++ b/driver/xscreensaver-auth.c @@ -285,6 +285,13 @@ main (int argc, char **argv) dpy_str = argv[++i]; if (!dpy_str) goto HELP; } + else if (!strcmp (argv[i], "-ver") || + !strcmp (argv[i], "-vers") || + !strcmp (argv[i], "-version")) + { + fprintf (stderr, "%s\n", screensaver_id+4); + exit (1); + } else if (!strcmp (argv[i], "-sync") || !strcmp (argv[i], "-synch") || !strcmp (argv[i], "-synchronize") || diff --git a/driver/xscreensaver-auth.man b/driver/xscreensaver-auth.man index 8be0f7cb..6da37405 100644 --- a/driver/xscreensaver-auth.man +++ b/driver/xscreensaver-auth.man @@ -3,7 +3,7 @@ xscreensaver - extensible screen saver and screen locking framework .SH SYNOPSIS .B xscreensaver-auth -[\-\-display \fIhost:display.screen\fP] +[\-\-display \fIhost:display.screen\fP] [\-\-version] .SH DESCRIPTION The .BR xscreensaver (1) @@ -15,7 +15,7 @@ Do not run this program directly. .BR xscreensaver\-gfx (MANSUFFIX), .BR xscreensaver\-systemd (MANSUFFIX). .SH COPYRIGHT -Copyright \(co 2021 by Jamie Zawinski. +Copyright \(co 2021-2022 by 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 the above copyright notice appear in all copies and that diff --git a/driver/xscreensaver-gfx.c b/driver/xscreensaver-gfx.c index 0172591f..870423c2 100644 --- a/driver/xscreensaver-gfx.c +++ b/driver/xscreensaver-gfx.c @@ -505,6 +505,13 @@ main (int argc, char **argv) dpy_str = argv[++i]; if (!dpy_str) goto HELP; } + else if (!strcmp (argv[i], "-ver") || + !strcmp (argv[i], "-vers") || + !strcmp (argv[i], "-version")) + { + fprintf (stderr, "%s\n", screensaver_id+4); + exit (1); + } else if (!strcmp (argv[i], "-sync") || !strcmp (argv[i], "-synch") || !strcmp (argv[i], "-synchronize") || diff --git a/driver/xscreensaver-gfx.man b/driver/xscreensaver-gfx.man index 52e22712..f14fccd4 100644 --- a/driver/xscreensaver-gfx.man +++ b/driver/xscreensaver-gfx.man @@ -4,6 +4,7 @@ xscreensaver - extensible screen saver and screen locking framework .SH SYNOPSIS .B xscreensaver-gfx [\-\-display \fIhost:display.screen\fP] +[\-\-version] .SH DESCRIPTION The .BR xscreensaver (1) @@ -16,7 +17,7 @@ Do not run this program directly. .BR xscreensaver\-auth (MANSUFFIX), .BR xscreensaver\-systemd (MANSUFFIX). .SH COPYRIGHT -Copyright \(co 2021 by Jamie Zawinski. +Copyright \(co 2021-2022 by 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 the above copyright notice appear in all copies and that diff --git a/driver/xscreensaver-settings.man b/driver/xscreensaver-settings.man index 29de8288..dabb79af 100644 --- a/driver/xscreensaver-settings.man +++ b/driver/xscreensaver-settings.man @@ -4,7 +4,6 @@ xscreensaver-settings - configure and control the xscreensaver daemon .SH SYNOPSIS .B xscreensaver\-settings [\-\-display \fIhost:display.screen\fP] -[\-\-prefs] [\-\-debug] .SH DESCRIPTION The \fIxscreensaver\-settings\fP program is a graphical front-end for @@ -104,6 +103,8 @@ When \fBMode\fP is set to \fBRandom Screen Saver\fP, each name in the list has a checkbox next to it: this controls whether this display mode is enabled. If it is unchecked, then that mode will not be chosen. (Though you can still run it explicitly by double-clicking on its name.) + +If the list has focus, you can type any character to search within it. .SS Arrow Buttons Beneath the list are a pair of up and down arrows. Clicking on the down arrow will select the next item in the list, and then run it in full-screen @@ -145,16 +146,8 @@ to the display mode selected in the list. .SH SETTINGS DIALOG When you click on the \fISettings\fP button on the \fIDisplay Modes\fP tab, a configuration dialog will pop up that lets you customize settings -of the selected display mode. Each display mode has its own custom -configuration controls on the left side. - -On the right side is a paragraph or two describing the display mode. -Below that is a \fBDocumentation\fP button that will display the display -mode's manual page in a new window. - -The \fBAdvanced\fP button reconfigures the dialog box so that you can -edit the display mode's command line directly, instead of using the -graphical controls. +of the selected display mode. Each display mode has its own custom set +of configuration controls. .SH ADVANCED TAB This tab lets you change various settings used by the xscreensaver daemon itself, as well as some global options shared by all of the display modes. @@ -298,10 +291,6 @@ The X display to use. The \fIxscreensaver\-settings\fP program will open its window on that display, and also control the \fIxscreensaver\fP daemon that is managing that same display. .TP 8 -.B \-\-prefs -Start up with the \fBAdvanced\fP tab selected by default -instead of the \fBDisplay Modes\fP tab. -.TP 8 .B \-\-debug Causes lots of diagnostics to be printed on stderr. .PP @@ -317,10 +306,10 @@ file, or it won't work. to get the default host and display number. .TP 8 .B PATH -to find the sub-programs to run. However, note that the sub-programs -are actually launched by the \fIxscreensaver\fP daemon, not -by \fIxscreensaver-settings\fP itself. So, what matters is what \fB$PATH\fP -that the \fIxscreensaver\fP program sees. +to find the sub-programs to run. However, note that the sub-programs +actually launched by \fIxscreensaver-settings\fP for display in the +inline preview pane, but are launched by the \fIxscreensaver\fP daemon +when run full screen, so the \fB$PATH\fP setting in both processes matters. .TP 8 .B HOME for the directory in which to read and write the \fI.xscreensaver\fP file. diff --git a/driver/xscreensaver-systemd.c b/driver/xscreensaver-systemd.c index 9e8d6119..0914675a 100644 --- a/driver/xscreensaver-systemd.c +++ b/driver/xscreensaver-systemd.c @@ -28,11 +28,10 @@ * up again, it runs "xscreensaver-command -deactivate" to force the * unlock dialog to appear immediately. * - * - When another process on the system makes asks for the screen saver - * to be inhibited (e.g. because a video is playing) this program - * periodically runs "xscreensaver-command -deactivate" to keep the - * display un-blanked. It does this until the other program asks for - * it to stop. + * - When another process on the system asks for the screen saver to be + * inhibited (e.g. because a video is playing) this program periodically + * runs "xscreensaver-command -deactivate" to keep the display un-blanked. + * It does this until the other program asks for it to stop. * * For this to work at all, you must either: * @@ -282,9 +281,6 @@ * qdbus org.gnome.ScreenSaver /ScreenSaver * org.gnome.ScreenSaver.GetActive * - * - Some people think that "loginctl lock-session" should do something. - * I can't tell what uses that, or what mechanism underlies it. - * * ***************************************************************************** * @@ -362,7 +358,22 @@ static char *screensaver_version; "interface='" DBUS_SD_INTERFACE "'," \ "member='PrepareForSleep'" +/* This is for handling requests to lock or unlock, on the system bus. + This is sent by "loginctl lock-session", which in turn is run if someone + has added "HandleLidSwitch=lock" to /etc/systemd/logind.conf in order to + make closing the lid lock the screen *without* suspending. Note that it + is sent on login1 *Session*, not *Manager*. + */ +#define DBUS_SD_LOCK_INTERFACE "org.freedesktop.login1.Session" +#define DBUS_SD_LOCK_MATCH "type='signal'," \ + "interface='" DBUS_SD_LOCK_INTERFACE "'," \ + "member='Lock'" +#define DBUS_SD_UNLOCK_MATCH "type='signal'," \ + "interface='" DBUS_SD_LOCK_INTERFACE "'," \ + "member='Unlock'" + /* This is for blanking inhibition, on the user bus. + See the large comment above for the absolute mess that apps make of this. */ #define DBUS_FDO_NAME "org.freedesktop.ScreenSaver" #define DBUS_FDO_INTERFACE DBUS_FDO_NAME @@ -573,6 +584,32 @@ xscreensaver_prepare_for_sleep_cb (sd_bus_message *m, void *arg, } +/* Called when "org.freedesktop.login1.Session" sends a "Lock" signal. + The event is sent several times in quick succession. + https://www.freedesktop.org/software/systemd/man/org.freedesktop.login1.html + */ +static int +xscreensaver_lock_cb (sd_bus_message *m, void *arg, sd_bus_error *ret_error) +{ + /* Tell xscreensaver that we are suspending, and to lock if desired. + Maybe sending "lock" here would be more appropriate, but that might + do a screen-fade first. */ + xscreensaver_command ("suspend"); + return 1; /* >= 0 means success */ +} + +/* Called when "org.freedesktop.login1.Session" sends an "Unlock" signal. + I'm not sure if anything ever sends this. + */ +static int +xscreensaver_unlock_cb (sd_bus_message *m, void *arg, sd_bus_error *ret_error) +{ + /* Tell xscreensaver to present the unlock dialog right now. */ + xscreensaver_command ("deactivate"); + return 1; /* >= 0 means success */ +} + + /* Is this "reason" string one that means we should inhibit blanking? If the string is e.g. "audio-playing", (Firefox) the answer is no. If the string is "Download in progress", (Chromium) the answer is no. @@ -1336,6 +1373,7 @@ xscreensaver_systemd_loop (void) goto FAIL; /* Register a callback for "org.freedesktop.login1.Manager.PrepareForSleep". + System bus. */ rc = sd_bus_add_match (system_bus, NULL, DBUS_SD_MATCH, xscreensaver_prepare_for_sleep_cb, &global_ctx); @@ -1345,7 +1383,29 @@ xscreensaver_systemd_loop (void) goto FAIL; } + /* Register a callback for "org.freedesktop.login1.Session.Lock". + System bus. + */ + rc = sd_bus_add_match (system_bus, NULL, DBUS_SD_LOCK_MATCH, + xscreensaver_lock_cb, &global_ctx); + if (rc < 0) { + fprintf (stderr, "%s: registering lock-session callback failed: %s\n", + blurb(), strerror(-rc)); + goto FAIL; + } + + /* And for Unlock. */ + rc = sd_bus_add_match (system_bus, NULL, DBUS_SD_UNLOCK_MATCH, + xscreensaver_unlock_cb, &global_ctx); + if (rc < 0) { + fprintf (stderr, "%s: registering lock-session callback failed: %s\n", + blurb(), strerror(-rc)); + goto FAIL; + } + + /* Register a callback for "org.gnome.SessionManager.InhibitorAdded". + User bus. */ rc = sd_bus_add_match (user_bus, NULL, DBUS_GSN_MATCH_1, xscreensaver_gnome_inhibitor_added_cb, &global_ctx); @@ -1356,6 +1416,7 @@ xscreensaver_systemd_loop (void) } /* Register a callback for "org.gnome.SessionManager.InhibitorRemoved". + User bus. */ rc = sd_bus_add_match (user_bus, NULL, DBUS_GSN_MATCH_2, xscreensaver_gnome_inhibitor_removed_cb, &global_ctx); @@ -1366,7 +1427,7 @@ xscreensaver_systemd_loop (void) } /* Register a callback for "org.kde.Solid.PowerManagement.PolicyAgent. - InhibitionsChanged". + InhibitionsChanged". User bus. */ rc = sd_bus_add_match (user_bus, NULL, DBUS_KDE_MATCH, xscreensaver_kde_inhibitor_changed_cb, &global_ctx); @@ -1593,6 +1654,14 @@ main (int argc, char **argv) else if (!strncmp (s, "-vv", L)) verbose_p += 2; else if (!strncmp (s, "-vvv", L)) verbose_p += 3; else if (!strncmp (s, "-vvvv", L)) verbose_p += 4; + else if (!strcmp (s, "-ver") || + !strcmp (s, "-vers") || + !strcmp (s, "-version")) + { + fprintf (stderr, "%s\n", screensaver_id+4); + exit (1); + } + else USAGE (); } diff --git a/driver/xscreensaver-systemd.man b/driver/xscreensaver-systemd.man index 1904c8ce..def72a5b 100644 --- a/driver/xscreensaver-systemd.man +++ b/driver/xscreensaver-systemd.man @@ -3,7 +3,7 @@ xscreensaver-systemd - lock the screen upon suspend, and inhibit screen-blanking during video playback. .SH SYNOPSIS -.B xscreensaver-systemd [-verbose] +.B xscreensaver-systemd [\-\-verbose] [\-\-version] .SH DESCRIPTION The \fIxscreensaver\-systemd\fP program is a helper daemon launched by .BR xscreensaver (1) @@ -68,10 +68,10 @@ Makes no attempt to inhibit the screen saver. Use VLC instead. .SS MPV (0.33) Makes no attempt to inhibit the screen saver. Use VLC instead. .SS VARIOUS -Most programs fail to inhibit screen blanking if they crash or are killed -while playing. We try to detect when this has happened and auto-uninhibit, -but that might not work with all versions of systemd, resulting in blanking -remaining permanently inhibited. If that happens, killing and restarting +Most programs fail to re-enable screen blanking if they crash or are killed +while playing. We try to detect when this has happened, but that might not +work with all versions of systemd, resulting in screen blanking remaining +permanently disabled. If that happens, killing and restarting \fIxscreensaver\-systemd\fP is a workaround. .SH SEE ALSO .BR X (1), diff --git a/driver/xscreensaver.c b/driver/xscreensaver.c index 983a10dd..b67c4b32 100644 --- a/driver/xscreensaver.c +++ b/driver/xscreensaver.c @@ -2367,6 +2367,13 @@ main (int argc, char **argv) if (! verbose_p) /* might already be -vv */ verbose_p = cmdline_verbose_p = cmdline_verbose_val = True; } + else if (!strcmp (argv[i], "-ver") || + !strcmp (argv[i], "-vers") || + !strcmp (argv[i], "-version")) + { + fprintf (stderr, "%s\n", screensaver_id+4); + exit (1); + } else if (!strcmp (argv[i], "-d") || !strcmp (argv[i], "-dpy") || !strcmp (argv[i], "-disp") || @@ -2392,6 +2399,7 @@ main (int argc, char **argv) "\t\t--verbose\n" "\t\t--no-splash\n" "\t\t--log logfile\n" + "\t\t--version\n" "\n" "\tRun 'xscreensaver-settings' to configure.\n" "\n"); diff --git a/driver/xscreensaver.man b/driver/xscreensaver.man index 89364822..b3133ccc 100644 --- a/driver/xscreensaver.man +++ b/driver/xscreensaver.man @@ -5,6 +5,7 @@ xscreensaver - extensible screen saver and screen locking framework .B xscreensaver [\-\-display \fIhost:display.screen\fP] \ [\-\-verbose] \ +[\-\-version] \ [\-\-no\-splash] \ [\-\-log \fIfilename\fP] .SH DESCRIPTION @@ -47,6 +48,9 @@ will manage all screens on the display simultaneously. .B \-\-verbose Print diagnostics to stderr. .TP 8 +.B \-\-version\fP +Print the version number and exit. +.TP 8 .B \-\-log\fP \fIfilename\fP Append all diagnostic output to the given file. This also implies \fI\-\-verbose\fP. Use this when reporting bugs. diff --git a/hacks/Makefile.in b/hacks/Makefile.in index d3b2872d..611cb2ef 100644 --- a/hacks/Makefile.in +++ b/hacks/Makefile.in @@ -1,4 +1,4 @@ -# hacks/Makefile.in --- xscreensaver, Copyright © 1997-2021 Jamie Zawinski. +# hacks/Makefile.in --- xscreensaver, Copyright © 1997-2022 Jamie Zawinski. # the `../configure' script generates `hacks/Makefile' from this file. @SET_MAKE@ @@ -65,6 +65,9 @@ UTILS_SRC = $(srcdir)/../utils UTILS_BIN = ../utils HACK_BIN = . +DRIVER_SRC = $(srcdir)/../driver +DRIVER_BIN = ../driver + INCLUDES_1 = -I. -I$(srcdir) -I$(UTILS_SRC) -I.. INCLUDES = $(INCLUDES_1) @INCLUDES@ @@ -179,7 +182,7 @@ EXES = attraction blitspin bouboule braid decayscreen deco \ ccurve blaster bumps ripples xspirograph \ nerverot xrayswarm zoom whirlwindwarp rotzoomer \ speedmine vermiculate twang apollonian euler2d \ - polyominoes thornbird fluidballs anemone halftone \ + polyominoes fluidballs anemone halftone \ metaballs eruption popsquares barcode piecewise cloudlife \ fontglide apple2 xanalogtv pong filmleader wormhole \ pacman fuzzyflakes anemotaxis memscroller substrate \ @@ -192,7 +195,7 @@ JPEG_EXES = webcollage-helper RETIRED_EXES = ant bubbles critical flag forest hyperball hypercube laser \ lightning lisa lissie lmorph rotor sphere spiral t3d vines \ - whirlygig worm xsublim juggle + whirlygig worm xsublim juggle thornbird HACK_OBJS_1 = fps.o $(UTILS_BIN)/resources.o $(UTILS_BIN)/visual.o \ $(UTILS_BIN)/usleep.o $(UTILS_BIN)/yarandom.o \ @@ -231,7 +234,7 @@ MEN = anemone.man apollonian.man attraction.man \ shadebobs.man sierpinski.man slidescreen.man slip.man \ speedmine.man \ spotlight.man squiral.man starfish.man strange.man \ - swirl.man thornbird.man triangle.man truchet.man \ + swirl.man triangle.man truchet.man \ twang.man vermiculate.man vidwhacker.man \ wander.man webcollage.man whirlwindwarp.man \ xflame.man xjack.man xlyap.man xmatrix.man \ @@ -255,7 +258,7 @@ RETIRED_MEN = ant.man bubbles.man critical.man flag.man forest.man \ laser.man lightning.man lisa.man lissie.man lmorph.man \ rotor.man sphere.man spiral.man t3d.man vines.man \ whirlygig.man worm.man xsublim.man juggle.man \ - hypercube.man hyperball.man + hypercube.man hyperball.man thornbird.man STAR = * EXTRAS = README Makefile.in xml2man.pl m6502.sh .gdbinit \ @@ -492,8 +495,9 @@ $(UTIL_OBJS): $(MAKE) $(@F) CC="$(CC)" CFLAGS="$(CFLAGS)" LDFLAGS="$(LDFLAGS)" # For xscreensaver-getimage -$(srcdir)/../driver/prefs.o: $(srcdir)/../driver/prefs.c -$(srcdir)/../driver/prefs.o: +$(DRIVER_BIN)/prefs.o: $(DRIVER_SRC)/prefs.c +$(DRIVER_BIN)/prefs.o: + cd $(DRIVER_BIN) ; \ cd $(srcdir)/../driver ; \ $(MAKE) $(@F) CC="$(CC)" CFLAGS="$(CFLAGS)" LDFLAGS="$(LDFLAGS)" @@ -541,10 +545,10 @@ GETIMG_OBJS = xscreensaver-getimage.o \ $(UTILS_BIN)/colorbars.o $(UTILS_BIN)/resources.o \ $(UTILS_BIN)/yarandom.o $(UTILS_BIN)/visual.o \ $(UTILS_BIN)/usleep.o $(UTILS_BIN)/hsv.o \ - $(UTILS_BIN)/colors.o $(UTILS_BIN)/grabscreen.o \ + $(UTILS_BIN)/colors.o \ $(UTILS_BIN)/logo.o $(UTILS_BIN)/minixpm.o \ - $(UTILS_BIN)/xmu.o \ - $(srcdir)/../driver/prefs.o + $(UTILS_BIN)/screenshot.o $(UTILS_BIN)/xmu.o \ + $(DRIVER_BIN)/prefs.o GETIMG_LIBS = $(LIBS) $(X_LIBS) $(PNG_LIBS) $(JPEG_LIBS) \ $(X_PRE_LIBS) -lXt -lX11 -lXext $(X_EXTRA_LIBS) @@ -1039,7 +1043,7 @@ abstractile.o: $(srcdir)/screenhackI.h abstractile.o: $(srcdir)/screenhack.h abstractile.o: $(UTILS_SRC)/colors.h abstractile.o: $(UTILS_SRC)/font-retry.h -abstractile.o: $(UTILS_SRC)/grabscreen.h +abstractile.o: $(UTILS_SRC)/grabclient.h abstractile.o: $(UTILS_SRC)/hsv.h abstractile.o: $(UTILS_SRC)/resources.h abstractile.o: $(UTILS_SRC)/usleep.h @@ -1054,7 +1058,7 @@ analogtv-cli.o: $(srcdir)/screenhackI.h analogtv-cli.o: $(UTILS_SRC)/aligned_malloc.h analogtv-cli.o: $(UTILS_SRC)/colors.h analogtv-cli.o: $(UTILS_SRC)/font-retry.h -analogtv-cli.o: $(UTILS_SRC)/grabscreen.h +analogtv-cli.o: $(UTILS_SRC)/grabclient.h analogtv-cli.o: $(UTILS_SRC)/hsv.h analogtv-cli.o: $(UTILS_SRC)/resources.h analogtv-cli.o: $(UTILS_SRC)/thread_util.h @@ -1069,7 +1073,7 @@ analogtv.o: ../config.h analogtv.o: images/gen/6x10font_png.h analogtv.o: $(UTILS_SRC)/aligned_malloc.h analogtv.o: $(UTILS_SRC)/font-retry.h -analogtv.o: $(UTILS_SRC)/grabscreen.h +analogtv.o: $(UTILS_SRC)/grabclient.h analogtv.o: $(UTILS_SRC)/resources.h analogtv.o: $(UTILS_SRC)/thread_util.h analogtv.o: $(UTILS_SRC)/utils.h @@ -1085,7 +1089,7 @@ anemone.o: $(srcdir)/screenhackI.h anemone.o: $(srcdir)/screenhack.h anemone.o: $(UTILS_SRC)/colors.h anemone.o: $(UTILS_SRC)/font-retry.h -anemone.o: $(UTILS_SRC)/grabscreen.h +anemone.o: $(UTILS_SRC)/grabclient.h anemone.o: $(UTILS_SRC)/hsv.h anemone.o: $(UTILS_SRC)/resources.h anemone.o: $(UTILS_SRC)/usleep.h @@ -1100,7 +1104,7 @@ anemotaxis.o: $(srcdir)/screenhackI.h anemotaxis.o: $(srcdir)/screenhack.h anemotaxis.o: $(UTILS_SRC)/colors.h anemotaxis.o: $(UTILS_SRC)/font-retry.h -anemotaxis.o: $(UTILS_SRC)/grabscreen.h +anemotaxis.o: $(UTILS_SRC)/grabclient.h anemotaxis.o: $(UTILS_SRC)/hsv.h anemotaxis.o: $(UTILS_SRC)/resources.h anemotaxis.o: $(UTILS_SRC)/usleep.h @@ -1116,7 +1120,7 @@ ant.o: $(srcdir)/screenhackI.h ant.o: $(UTILS_SRC)/colors.h ant.o: $(UTILS_SRC)/erase.h ant.o: $(UTILS_SRC)/font-retry.h -ant.o: $(UTILS_SRC)/grabscreen.h +ant.o: $(UTILS_SRC)/grabclient.h ant.o: $(UTILS_SRC)/hsv.h ant.o: $(UTILS_SRC)/resources.h ant.o: $(UTILS_SRC)/usleep.h @@ -1132,7 +1136,7 @@ apollonian.o: $(srcdir)/screenhackI.h apollonian.o: $(UTILS_SRC)/colors.h apollonian.o: $(UTILS_SRC)/erase.h apollonian.o: $(UTILS_SRC)/font-retry.h -apollonian.o: $(UTILS_SRC)/grabscreen.h +apollonian.o: $(UTILS_SRC)/grabclient.h apollonian.o: $(UTILS_SRC)/hsv.h apollonian.o: $(UTILS_SRC)/resources.h apollonian.o: $(UTILS_SRC)/usleep.h @@ -1151,7 +1155,7 @@ apple2-main.o: $(srcdir)/screenhack.h apple2-main.o: $(UTILS_SRC)/aligned_malloc.h apple2-main.o: $(UTILS_SRC)/colors.h apple2-main.o: $(UTILS_SRC)/font-retry.h -apple2-main.o: $(UTILS_SRC)/grabscreen.h +apple2-main.o: $(UTILS_SRC)/grabclient.h apple2-main.o: $(UTILS_SRC)/hsv.h apple2-main.o: $(UTILS_SRC)/resources.h apple2-main.o: $(UTILS_SRC)/textclient.h @@ -1172,7 +1176,7 @@ apple2.o: $(srcdir)/screenhackI.h apple2.o: $(UTILS_SRC)/aligned_malloc.h apple2.o: $(UTILS_SRC)/colors.h apple2.o: $(UTILS_SRC)/font-retry.h -apple2.o: $(UTILS_SRC)/grabscreen.h +apple2.o: $(UTILS_SRC)/grabclient.h apple2.o: $(UTILS_SRC)/hsv.h apple2.o: $(UTILS_SRC)/resources.h apple2.o: $(UTILS_SRC)/thread_util.h @@ -1192,7 +1196,7 @@ attraction.o: $(srcdir)/screenhackI.h attraction.o: $(srcdir)/screenhack.h attraction.o: $(UTILS_SRC)/colors.h attraction.o: $(UTILS_SRC)/font-retry.h -attraction.o: $(UTILS_SRC)/grabscreen.h +attraction.o: $(UTILS_SRC)/grabclient.h attraction.o: $(UTILS_SRC)/hsv.h attraction.o: $(UTILS_SRC)/resources.h attraction.o: $(UTILS_SRC)/spline.h @@ -1207,7 +1211,7 @@ barcode.o: $(srcdir)/screenhackI.h barcode.o: $(srcdir)/screenhack.h barcode.o: $(UTILS_SRC)/colors.h barcode.o: $(UTILS_SRC)/font-retry.h -barcode.o: $(UTILS_SRC)/grabscreen.h +barcode.o: $(UTILS_SRC)/grabclient.h barcode.o: $(UTILS_SRC)/hsv.h barcode.o: $(UTILS_SRC)/resources.h barcode.o: $(UTILS_SRC)/usleep.h @@ -1221,7 +1225,7 @@ binaryhorizon.o: $(srcdir)/screenhackI.h binaryhorizon.o: $(srcdir)/screenhack.h binaryhorizon.o: $(UTILS_SRC)/colors.h binaryhorizon.o: $(UTILS_SRC)/font-retry.h -binaryhorizon.o: $(UTILS_SRC)/grabscreen.h +binaryhorizon.o: $(UTILS_SRC)/grabclient.h binaryhorizon.o: $(UTILS_SRC)/hsv.h binaryhorizon.o: $(UTILS_SRC)/resources.h binaryhorizon.o: $(UTILS_SRC)/usleep.h @@ -1235,7 +1239,7 @@ binaryring.o: $(srcdir)/screenhackI.h binaryring.o: $(srcdir)/screenhack.h binaryring.o: $(UTILS_SRC)/colors.h binaryring.o: $(UTILS_SRC)/font-retry.h -binaryring.o: $(UTILS_SRC)/grabscreen.h +binaryring.o: $(UTILS_SRC)/grabclient.h binaryring.o: $(UTILS_SRC)/hsv.h binaryring.o: $(UTILS_SRC)/resources.h binaryring.o: $(UTILS_SRC)/usleep.h @@ -1249,7 +1253,7 @@ blaster.o: $(srcdir)/screenhackI.h blaster.o: $(srcdir)/screenhack.h blaster.o: $(UTILS_SRC)/colors.h blaster.o: $(UTILS_SRC)/font-retry.h -blaster.o: $(UTILS_SRC)/grabscreen.h +blaster.o: $(UTILS_SRC)/grabclient.h blaster.o: $(UTILS_SRC)/hsv.h blaster.o: $(UTILS_SRC)/resources.h blaster.o: $(UTILS_SRC)/usleep.h @@ -1264,7 +1268,7 @@ blitspin.o: $(srcdir)/screenhackI.h blitspin.o: $(srcdir)/screenhack.h blitspin.o: $(UTILS_SRC)/colors.h blitspin.o: $(UTILS_SRC)/font-retry.h -blitspin.o: $(UTILS_SRC)/grabscreen.h +blitspin.o: $(UTILS_SRC)/grabclient.h blitspin.o: $(UTILS_SRC)/hsv.h blitspin.o: $(UTILS_SRC)/pow2.h blitspin.o: $(UTILS_SRC)/resources.h @@ -1280,7 +1284,7 @@ bouboule.o: $(srcdir)/screenhackI.h bouboule.o: $(UTILS_SRC)/colors.h bouboule.o: $(UTILS_SRC)/erase.h bouboule.o: $(UTILS_SRC)/font-retry.h -bouboule.o: $(UTILS_SRC)/grabscreen.h +bouboule.o: $(UTILS_SRC)/grabclient.h bouboule.o: $(UTILS_SRC)/hsv.h bouboule.o: $(UTILS_SRC)/resources.h bouboule.o: $(UTILS_SRC)/usleep.h @@ -1296,7 +1300,7 @@ boxfit.o: $(srcdir)/screenhackI.h boxfit.o: $(srcdir)/screenhack.h boxfit.o: $(UTILS_SRC)/colors.h boxfit.o: $(UTILS_SRC)/font-retry.h -boxfit.o: $(UTILS_SRC)/grabscreen.h +boxfit.o: $(UTILS_SRC)/grabclient.h boxfit.o: $(UTILS_SRC)/hsv.h boxfit.o: $(UTILS_SRC)/resources.h boxfit.o: $(UTILS_SRC)/usleep.h @@ -1311,7 +1315,7 @@ braid.o: $(srcdir)/screenhackI.h braid.o: $(UTILS_SRC)/colors.h braid.o: $(UTILS_SRC)/erase.h braid.o: $(UTILS_SRC)/font-retry.h -braid.o: $(UTILS_SRC)/grabscreen.h +braid.o: $(UTILS_SRC)/grabclient.h braid.o: $(UTILS_SRC)/hsv.h braid.o: $(UTILS_SRC)/resources.h braid.o: $(UTILS_SRC)/usleep.h @@ -1345,7 +1349,7 @@ bsod.o: $(srcdir)/screenhack.h bsod.o: $(UTILS_SRC)/aligned_malloc.h bsod.o: $(UTILS_SRC)/colors.h bsod.o: $(UTILS_SRC)/font-retry.h -bsod.o: $(UTILS_SRC)/grabscreen.h +bsod.o: $(UTILS_SRC)/grabclient.h bsod.o: $(UTILS_SRC)/hsv.h bsod.o: $(UTILS_SRC)/resources.h bsod.o: $(UTILS_SRC)/thread_util.h @@ -1410,7 +1414,7 @@ bubbles.o: $(srcdir)/screenhackI.h bubbles.o: $(srcdir)/screenhack.h bubbles.o: $(UTILS_SRC)/colors.h bubbles.o: $(UTILS_SRC)/font-retry.h -bubbles.o: $(UTILS_SRC)/grabscreen.h +bubbles.o: $(UTILS_SRC)/grabclient.h bubbles.o: $(UTILS_SRC)/hsv.h bubbles.o: $(UTILS_SRC)/resources.h bubbles.o: $(UTILS_SRC)/usleep.h @@ -1425,7 +1429,7 @@ bumps.o: $(srcdir)/screenhackI.h bumps.o: $(srcdir)/screenhack.h bumps.o: $(UTILS_SRC)/colors.h bumps.o: $(UTILS_SRC)/font-retry.h -bumps.o: $(UTILS_SRC)/grabscreen.h +bumps.o: $(UTILS_SRC)/grabclient.h bumps.o: $(UTILS_SRC)/hsv.h bumps.o: $(UTILS_SRC)/resources.h bumps.o: $(UTILS_SRC)/usleep.h @@ -1441,7 +1445,7 @@ ccurve.o: $(srcdir)/screenhack.h ccurve.o: $(UTILS_SRC)/colors.h ccurve.o: $(UTILS_SRC)/erase.h ccurve.o: $(UTILS_SRC)/font-retry.h -ccurve.o: $(UTILS_SRC)/grabscreen.h +ccurve.o: $(UTILS_SRC)/grabclient.h ccurve.o: $(UTILS_SRC)/hsv.h ccurve.o: $(UTILS_SRC)/resources.h ccurve.o: $(UTILS_SRC)/usleep.h @@ -1456,7 +1460,7 @@ celtic.o: $(srcdir)/screenhack.h celtic.o: $(UTILS_SRC)/colors.h celtic.o: $(UTILS_SRC)/erase.h celtic.o: $(UTILS_SRC)/font-retry.h -celtic.o: $(UTILS_SRC)/grabscreen.h +celtic.o: $(UTILS_SRC)/grabclient.h celtic.o: $(UTILS_SRC)/hsv.h celtic.o: $(UTILS_SRC)/resources.h celtic.o: $(UTILS_SRC)/usleep.h @@ -1470,7 +1474,7 @@ cloudlife.o: $(srcdir)/screenhackI.h cloudlife.o: $(srcdir)/screenhack.h cloudlife.o: $(UTILS_SRC)/colors.h cloudlife.o: $(UTILS_SRC)/font-retry.h -cloudlife.o: $(UTILS_SRC)/grabscreen.h +cloudlife.o: $(UTILS_SRC)/grabclient.h cloudlife.o: $(UTILS_SRC)/hsv.h cloudlife.o: $(UTILS_SRC)/resources.h cloudlife.o: $(UTILS_SRC)/usleep.h @@ -1484,7 +1488,7 @@ compass.o: $(srcdir)/screenhackI.h compass.o: $(srcdir)/screenhack.h compass.o: $(UTILS_SRC)/colors.h compass.o: $(UTILS_SRC)/font-retry.h -compass.o: $(UTILS_SRC)/grabscreen.h +compass.o: $(UTILS_SRC)/grabclient.h compass.o: $(UTILS_SRC)/hsv.h compass.o: $(UTILS_SRC)/resources.h compass.o: $(UTILS_SRC)/usleep.h @@ -1500,7 +1504,7 @@ coral.o: $(srcdir)/screenhack.h coral.o: $(UTILS_SRC)/colors.h coral.o: $(UTILS_SRC)/erase.h coral.o: $(UTILS_SRC)/font-retry.h -coral.o: $(UTILS_SRC)/grabscreen.h +coral.o: $(UTILS_SRC)/grabclient.h coral.o: $(UTILS_SRC)/hsv.h coral.o: $(UTILS_SRC)/resources.h coral.o: $(UTILS_SRC)/usleep.h @@ -1515,7 +1519,7 @@ critical.o: $(srcdir)/screenhack.h critical.o: $(UTILS_SRC)/colors.h critical.o: $(UTILS_SRC)/erase.h critical.o: $(UTILS_SRC)/font-retry.h -critical.o: $(UTILS_SRC)/grabscreen.h +critical.o: $(UTILS_SRC)/grabclient.h critical.o: $(UTILS_SRC)/hsv.h critical.o: $(UTILS_SRC)/resources.h critical.o: $(UTILS_SRC)/usleep.h @@ -1529,7 +1533,7 @@ crystal.o: $(srcdir)/screenhackI.h crystal.o: $(UTILS_SRC)/colors.h crystal.o: $(UTILS_SRC)/erase.h crystal.o: $(UTILS_SRC)/font-retry.h -crystal.o: $(UTILS_SRC)/grabscreen.h +crystal.o: $(UTILS_SRC)/grabclient.h crystal.o: $(UTILS_SRC)/hsv.h crystal.o: $(UTILS_SRC)/resources.h crystal.o: $(UTILS_SRC)/usleep.h @@ -1545,7 +1549,7 @@ cwaves.o: $(srcdir)/screenhackI.h cwaves.o: $(srcdir)/screenhack.h cwaves.o: $(UTILS_SRC)/colors.h cwaves.o: $(UTILS_SRC)/font-retry.h -cwaves.o: $(UTILS_SRC)/grabscreen.h +cwaves.o: $(UTILS_SRC)/grabclient.h cwaves.o: $(UTILS_SRC)/hsv.h cwaves.o: $(UTILS_SRC)/resources.h cwaves.o: $(UTILS_SRC)/usleep.h @@ -1560,7 +1564,7 @@ cynosure.o: $(srcdir)/screenhackI.h cynosure.o: $(srcdir)/screenhack.h cynosure.o: $(UTILS_SRC)/colors.h cynosure.o: $(UTILS_SRC)/font-retry.h -cynosure.o: $(UTILS_SRC)/grabscreen.h +cynosure.o: $(UTILS_SRC)/grabclient.h cynosure.o: $(UTILS_SRC)/hsv.h cynosure.o: $(UTILS_SRC)/resources.h cynosure.o: $(UTILS_SRC)/usleep.h @@ -1574,7 +1578,7 @@ decayscreen.o: $(srcdir)/screenhackI.h decayscreen.o: $(srcdir)/screenhack.h decayscreen.o: $(UTILS_SRC)/colors.h decayscreen.o: $(UTILS_SRC)/font-retry.h -decayscreen.o: $(UTILS_SRC)/grabscreen.h +decayscreen.o: $(UTILS_SRC)/grabclient.h decayscreen.o: $(UTILS_SRC)/hsv.h decayscreen.o: $(UTILS_SRC)/resources.h decayscreen.o: $(UTILS_SRC)/usleep.h @@ -1588,7 +1592,7 @@ deco.o: $(srcdir)/screenhackI.h deco.o: $(srcdir)/screenhack.h deco.o: $(UTILS_SRC)/colors.h deco.o: $(UTILS_SRC)/font-retry.h -deco.o: $(UTILS_SRC)/grabscreen.h +deco.o: $(UTILS_SRC)/grabclient.h deco.o: $(UTILS_SRC)/hsv.h deco.o: $(UTILS_SRC)/resources.h deco.o: $(UTILS_SRC)/usleep.h @@ -1604,7 +1608,7 @@ deluxe.o: $(srcdir)/screenhack.h deluxe.o: $(UTILS_SRC)/alpha.h deluxe.o: $(UTILS_SRC)/colors.h deluxe.o: $(UTILS_SRC)/font-retry.h -deluxe.o: $(UTILS_SRC)/grabscreen.h +deluxe.o: $(UTILS_SRC)/grabclient.h deluxe.o: $(UTILS_SRC)/hsv.h deluxe.o: $(UTILS_SRC)/resources.h deluxe.o: $(UTILS_SRC)/usleep.h @@ -1620,7 +1624,7 @@ demon.o: $(srcdir)/screenhackI.h demon.o: $(UTILS_SRC)/colors.h demon.o: $(UTILS_SRC)/erase.h demon.o: $(UTILS_SRC)/font-retry.h -demon.o: $(UTILS_SRC)/grabscreen.h +demon.o: $(UTILS_SRC)/grabclient.h demon.o: $(UTILS_SRC)/hsv.h demon.o: $(UTILS_SRC)/resources.h demon.o: $(UTILS_SRC)/usleep.h @@ -1636,7 +1640,7 @@ discrete.o: $(srcdir)/screenhackI.h discrete.o: $(UTILS_SRC)/colors.h discrete.o: $(UTILS_SRC)/erase.h discrete.o: $(UTILS_SRC)/font-retry.h -discrete.o: $(UTILS_SRC)/grabscreen.h +discrete.o: $(UTILS_SRC)/grabclient.h discrete.o: $(UTILS_SRC)/hsv.h discrete.o: $(UTILS_SRC)/resources.h discrete.o: $(UTILS_SRC)/usleep.h @@ -1652,7 +1656,7 @@ distort.o: $(srcdir)/screenhackI.h distort.o: $(srcdir)/screenhack.h distort.o: $(UTILS_SRC)/colors.h distort.o: $(UTILS_SRC)/font-retry.h -distort.o: $(UTILS_SRC)/grabscreen.h +distort.o: $(UTILS_SRC)/grabclient.h distort.o: $(UTILS_SRC)/hsv.h distort.o: $(UTILS_SRC)/resources.h distort.o: $(UTILS_SRC)/usleep.h @@ -1667,7 +1671,7 @@ drift.o: $(srcdir)/screenhackI.h drift.o: $(UTILS_SRC)/colors.h drift.o: $(UTILS_SRC)/erase.h drift.o: $(UTILS_SRC)/font-retry.h -drift.o: $(UTILS_SRC)/grabscreen.h +drift.o: $(UTILS_SRC)/grabclient.h drift.o: $(UTILS_SRC)/hsv.h drift.o: $(UTILS_SRC)/resources.h drift.o: $(UTILS_SRC)/usleep.h @@ -1684,7 +1688,7 @@ epicycle.o: $(srcdir)/screenhack.h epicycle.o: $(UTILS_SRC)/colors.h epicycle.o: $(UTILS_SRC)/erase.h epicycle.o: $(UTILS_SRC)/font-retry.h -epicycle.o: $(UTILS_SRC)/grabscreen.h +epicycle.o: $(UTILS_SRC)/grabclient.h epicycle.o: $(UTILS_SRC)/hsv.h epicycle.o: $(UTILS_SRC)/resources.h epicycle.o: $(UTILS_SRC)/usleep.h @@ -1698,7 +1702,7 @@ eruption.o: $(srcdir)/screenhackI.h eruption.o: $(srcdir)/screenhack.h eruption.o: $(UTILS_SRC)/colors.h eruption.o: $(UTILS_SRC)/font-retry.h -eruption.o: $(UTILS_SRC)/grabscreen.h +eruption.o: $(UTILS_SRC)/grabclient.h eruption.o: $(UTILS_SRC)/hsv.h eruption.o: $(UTILS_SRC)/resources.h eruption.o: $(UTILS_SRC)/usleep.h @@ -1713,7 +1717,7 @@ euler2d.o: $(srcdir)/screenhackI.h euler2d.o: $(UTILS_SRC)/colors.h euler2d.o: $(UTILS_SRC)/erase.h euler2d.o: $(UTILS_SRC)/font-retry.h -euler2d.o: $(UTILS_SRC)/grabscreen.h +euler2d.o: $(UTILS_SRC)/grabclient.h euler2d.o: $(UTILS_SRC)/hsv.h euler2d.o: $(UTILS_SRC)/resources.h euler2d.o: $(UTILS_SRC)/usleep.h @@ -1729,7 +1733,7 @@ fadeplot.o: $(srcdir)/screenhackI.h fadeplot.o: $(UTILS_SRC)/colors.h fadeplot.o: $(UTILS_SRC)/erase.h fadeplot.o: $(UTILS_SRC)/font-retry.h -fadeplot.o: $(UTILS_SRC)/grabscreen.h +fadeplot.o: $(UTILS_SRC)/grabclient.h fadeplot.o: $(UTILS_SRC)/hsv.h fadeplot.o: $(UTILS_SRC)/resources.h fadeplot.o: $(UTILS_SRC)/usleep.h @@ -1745,7 +1749,7 @@ fiberlamp.o: $(srcdir)/screenhackI.h fiberlamp.o: $(UTILS_SRC)/colors.h fiberlamp.o: $(UTILS_SRC)/erase.h fiberlamp.o: $(UTILS_SRC)/font-retry.h -fiberlamp.o: $(UTILS_SRC)/grabscreen.h +fiberlamp.o: $(UTILS_SRC)/grabclient.h fiberlamp.o: $(UTILS_SRC)/hsv.h fiberlamp.o: $(UTILS_SRC)/resources.h fiberlamp.o: $(UTILS_SRC)/usleep.h @@ -1763,7 +1767,7 @@ filmleader.o: $(srcdir)/screenhack.h filmleader.o: $(UTILS_SRC)/aligned_malloc.h filmleader.o: $(UTILS_SRC)/colors.h filmleader.o: $(UTILS_SRC)/font-retry.h -filmleader.o: $(UTILS_SRC)/grabscreen.h +filmleader.o: $(UTILS_SRC)/grabclient.h filmleader.o: $(UTILS_SRC)/hsv.h filmleader.o: $(UTILS_SRC)/resources.h filmleader.o: $(UTILS_SRC)/thread_util.h @@ -1779,7 +1783,7 @@ fireworkx.o: $(srcdir)/screenhackI.h fireworkx.o: $(srcdir)/screenhack.h fireworkx.o: $(UTILS_SRC)/colors.h fireworkx.o: $(UTILS_SRC)/font-retry.h -fireworkx.o: $(UTILS_SRC)/grabscreen.h +fireworkx.o: $(UTILS_SRC)/grabclient.h fireworkx.o: $(UTILS_SRC)/hsv.h fireworkx.o: $(UTILS_SRC)/resources.h fireworkx.o: $(UTILS_SRC)/usleep.h @@ -1794,7 +1798,7 @@ flag.o: $(srcdir)/screenhackI.h flag.o: $(UTILS_SRC)/colors.h flag.o: $(UTILS_SRC)/erase.h flag.o: $(UTILS_SRC)/font-retry.h -flag.o: $(UTILS_SRC)/grabscreen.h +flag.o: $(UTILS_SRC)/grabclient.h flag.o: $(UTILS_SRC)/hsv.h flag.o: $(UTILS_SRC)/resources.h flag.o: $(UTILS_SRC)/usleep.h @@ -1811,7 +1815,7 @@ flame.o: $(srcdir)/screenhackI.h flame.o: $(srcdir)/screenhack.h flame.o: $(UTILS_SRC)/colors.h flame.o: $(UTILS_SRC)/font-retry.h -flame.o: $(UTILS_SRC)/grabscreen.h +flame.o: $(UTILS_SRC)/grabclient.h flame.o: $(UTILS_SRC)/hsv.h flame.o: $(UTILS_SRC)/resources.h flame.o: $(UTILS_SRC)/usleep.h @@ -1825,7 +1829,7 @@ flow.o: $(srcdir)/screenhackI.h flow.o: $(UTILS_SRC)/colors.h flow.o: $(UTILS_SRC)/erase.h flow.o: $(UTILS_SRC)/font-retry.h -flow.o: $(UTILS_SRC)/grabscreen.h +flow.o: $(UTILS_SRC)/grabclient.h flow.o: $(UTILS_SRC)/hsv.h flow.o: $(UTILS_SRC)/resources.h flow.o: $(UTILS_SRC)/usleep.h @@ -1841,7 +1845,7 @@ fluidballs.o: $(srcdir)/screenhackI.h fluidballs.o: $(srcdir)/screenhack.h fluidballs.o: $(UTILS_SRC)/colors.h fluidballs.o: $(UTILS_SRC)/font-retry.h -fluidballs.o: $(UTILS_SRC)/grabscreen.h +fluidballs.o: $(UTILS_SRC)/grabclient.h fluidballs.o: $(UTILS_SRC)/hsv.h fluidballs.o: $(UTILS_SRC)/resources.h fluidballs.o: $(UTILS_SRC)/usleep.h @@ -1856,7 +1860,7 @@ fontglide.o: $(srcdir)/screenhackI.h fontglide.o: $(srcdir)/screenhack.h fontglide.o: $(UTILS_SRC)/colors.h fontglide.o: $(UTILS_SRC)/font-retry.h -fontglide.o: $(UTILS_SRC)/grabscreen.h +fontglide.o: $(UTILS_SRC)/grabclient.h fontglide.o: $(UTILS_SRC)/hsv.h fontglide.o: $(UTILS_SRC)/resources.h fontglide.o: $(UTILS_SRC)/textclient.h @@ -1873,7 +1877,7 @@ forest.o: $(srcdir)/screenhackI.h forest.o: $(UTILS_SRC)/colors.h forest.o: $(UTILS_SRC)/erase.h forest.o: $(UTILS_SRC)/font-retry.h -forest.o: $(UTILS_SRC)/grabscreen.h +forest.o: $(UTILS_SRC)/grabclient.h forest.o: $(UTILS_SRC)/hsv.h forest.o: $(UTILS_SRC)/resources.h forest.o: $(UTILS_SRC)/usleep.h @@ -1889,7 +1893,7 @@ fps.o: $(srcdir)/recanim.h fps.o: $(srcdir)/screenhackI.h fps.o: $(UTILS_SRC)/colors.h fps.o: $(UTILS_SRC)/font-retry.h -fps.o: $(UTILS_SRC)/grabscreen.h +fps.o: $(UTILS_SRC)/grabclient.h fps.o: $(UTILS_SRC)/hsv.h fps.o: $(UTILS_SRC)/resources.h fps.o: $(UTILS_SRC)/usleep.h @@ -1903,7 +1907,7 @@ fuzzyflakes.o: $(srcdir)/screenhackI.h fuzzyflakes.o: $(srcdir)/screenhack.h fuzzyflakes.o: $(UTILS_SRC)/colors.h fuzzyflakes.o: $(UTILS_SRC)/font-retry.h -fuzzyflakes.o: $(UTILS_SRC)/grabscreen.h +fuzzyflakes.o: $(UTILS_SRC)/grabclient.h fuzzyflakes.o: $(UTILS_SRC)/hsv.h fuzzyflakes.o: $(UTILS_SRC)/resources.h fuzzyflakes.o: $(UTILS_SRC)/usleep.h @@ -1917,7 +1921,7 @@ galaxy.o: $(srcdir)/screenhackI.h galaxy.o: $(UTILS_SRC)/colors.h galaxy.o: $(UTILS_SRC)/erase.h galaxy.o: $(UTILS_SRC)/font-retry.h -galaxy.o: $(UTILS_SRC)/grabscreen.h +galaxy.o: $(UTILS_SRC)/grabclient.h galaxy.o: $(UTILS_SRC)/hsv.h galaxy.o: $(UTILS_SRC)/resources.h galaxy.o: $(UTILS_SRC)/usleep.h @@ -1933,7 +1937,7 @@ glitchpeg.o: $(srcdir)/screenhackI.h glitchpeg.o: $(srcdir)/screenhack.h glitchpeg.o: $(UTILS_SRC)/colors.h glitchpeg.o: $(UTILS_SRC)/font-retry.h -glitchpeg.o: $(UTILS_SRC)/grabscreen.h +glitchpeg.o: $(UTILS_SRC)/grabclient.h glitchpeg.o: $(UTILS_SRC)/hsv.h glitchpeg.o: $(UTILS_SRC)/resources.h glitchpeg.o: $(UTILS_SRC)/usleep.h @@ -1949,7 +1953,7 @@ goop.o: $(srcdir)/screenhack.h goop.o: $(UTILS_SRC)/alpha.h goop.o: $(UTILS_SRC)/colors.h goop.o: $(UTILS_SRC)/font-retry.h -goop.o: $(UTILS_SRC)/grabscreen.h +goop.o: $(UTILS_SRC)/grabclient.h goop.o: $(UTILS_SRC)/hsv.h goop.o: $(UTILS_SRC)/resources.h goop.o: $(UTILS_SRC)/spline.h @@ -1964,7 +1968,7 @@ grav.o: $(srcdir)/screenhackI.h grav.o: $(UTILS_SRC)/colors.h grav.o: $(UTILS_SRC)/erase.h grav.o: $(UTILS_SRC)/font-retry.h -grav.o: $(UTILS_SRC)/grabscreen.h +grav.o: $(UTILS_SRC)/grabclient.h grav.o: $(UTILS_SRC)/hsv.h grav.o: $(UTILS_SRC)/resources.h grav.o: $(UTILS_SRC)/usleep.h @@ -1980,7 +1984,7 @@ greynetic.o: $(srcdir)/screenhackI.h greynetic.o: $(srcdir)/screenhack.h greynetic.o: $(UTILS_SRC)/colors.h greynetic.o: $(UTILS_SRC)/font-retry.h -greynetic.o: $(UTILS_SRC)/grabscreen.h +greynetic.o: $(UTILS_SRC)/grabclient.h greynetic.o: $(UTILS_SRC)/hsv.h greynetic.o: $(UTILS_SRC)/resources.h greynetic.o: $(UTILS_SRC)/usleep.h @@ -1994,7 +1998,7 @@ halftone.o: $(srcdir)/screenhackI.h halftone.o: $(srcdir)/screenhack.h halftone.o: $(UTILS_SRC)/colors.h halftone.o: $(UTILS_SRC)/font-retry.h -halftone.o: $(UTILS_SRC)/grabscreen.h +halftone.o: $(UTILS_SRC)/grabclient.h halftone.o: $(UTILS_SRC)/hsv.h halftone.o: $(UTILS_SRC)/resources.h halftone.o: $(UTILS_SRC)/usleep.h @@ -2008,7 +2012,7 @@ halo.o: $(srcdir)/screenhackI.h halo.o: $(srcdir)/screenhack.h halo.o: $(UTILS_SRC)/colors.h halo.o: $(UTILS_SRC)/font-retry.h -halo.o: $(UTILS_SRC)/grabscreen.h +halo.o: $(UTILS_SRC)/grabclient.h halo.o: $(UTILS_SRC)/hsv.h halo.o: $(UTILS_SRC)/resources.h halo.o: $(UTILS_SRC)/usleep.h @@ -2023,7 +2027,7 @@ helix.o: $(srcdir)/screenhack.h helix.o: $(UTILS_SRC)/colors.h helix.o: $(UTILS_SRC)/erase.h helix.o: $(UTILS_SRC)/font-retry.h -helix.o: $(UTILS_SRC)/grabscreen.h +helix.o: $(UTILS_SRC)/grabclient.h helix.o: $(UTILS_SRC)/hsv.h helix.o: $(UTILS_SRC)/resources.h helix.o: $(UTILS_SRC)/usleep.h @@ -2037,7 +2041,7 @@ hexadrop.o: $(srcdir)/screenhackI.h hexadrop.o: $(srcdir)/screenhack.h hexadrop.o: $(UTILS_SRC)/colors.h hexadrop.o: $(UTILS_SRC)/font-retry.h -hexadrop.o: $(UTILS_SRC)/grabscreen.h +hexadrop.o: $(UTILS_SRC)/grabclient.h hexadrop.o: $(UTILS_SRC)/hsv.h hexadrop.o: $(UTILS_SRC)/resources.h hexadrop.o: $(UTILS_SRC)/usleep.h @@ -2051,7 +2055,7 @@ hopalong.o: $(srcdir)/screenhackI.h hopalong.o: $(UTILS_SRC)/colors.h hopalong.o: $(UTILS_SRC)/erase.h hopalong.o: $(UTILS_SRC)/font-retry.h -hopalong.o: $(UTILS_SRC)/grabscreen.h +hopalong.o: $(UTILS_SRC)/grabclient.h hopalong.o: $(UTILS_SRC)/hsv.h hopalong.o: $(UTILS_SRC)/resources.h hopalong.o: $(UTILS_SRC)/usleep.h @@ -2067,7 +2071,7 @@ hyperball.o: $(srcdir)/screenhackI.h hyperball.o: $(srcdir)/screenhack.h hyperball.o: $(UTILS_SRC)/colors.h hyperball.o: $(UTILS_SRC)/font-retry.h -hyperball.o: $(UTILS_SRC)/grabscreen.h +hyperball.o: $(UTILS_SRC)/grabclient.h hyperball.o: $(UTILS_SRC)/hsv.h hyperball.o: $(UTILS_SRC)/resources.h hyperball.o: $(UTILS_SRC)/usleep.h @@ -2081,7 +2085,7 @@ hypercube.o: $(srcdir)/screenhackI.h hypercube.o: $(srcdir)/screenhack.h hypercube.o: $(UTILS_SRC)/colors.h hypercube.o: $(UTILS_SRC)/font-retry.h -hypercube.o: $(UTILS_SRC)/grabscreen.h +hypercube.o: $(UTILS_SRC)/grabclient.h hypercube.o: $(UTILS_SRC)/hsv.h hypercube.o: $(UTILS_SRC)/resources.h hypercube.o: $(UTILS_SRC)/usleep.h @@ -2095,7 +2099,7 @@ ifs.o: $(srcdir)/screenhackI.h ifs.o: $(srcdir)/screenhack.h ifs.o: $(UTILS_SRC)/colors.h ifs.o: $(UTILS_SRC)/font-retry.h -ifs.o: $(UTILS_SRC)/grabscreen.h +ifs.o: $(UTILS_SRC)/grabclient.h ifs.o: $(UTILS_SRC)/hsv.h ifs.o: $(UTILS_SRC)/resources.h ifs.o: $(UTILS_SRC)/usleep.h @@ -2109,7 +2113,7 @@ imsmap.o: $(srcdir)/screenhackI.h imsmap.o: $(srcdir)/screenhack.h imsmap.o: $(UTILS_SRC)/colors.h imsmap.o: $(UTILS_SRC)/font-retry.h -imsmap.o: $(UTILS_SRC)/grabscreen.h +imsmap.o: $(UTILS_SRC)/grabclient.h imsmap.o: $(UTILS_SRC)/hsv.h imsmap.o: $(UTILS_SRC)/resources.h imsmap.o: $(UTILS_SRC)/usleep.h @@ -2123,7 +2127,7 @@ interaggregate.o: $(srcdir)/screenhackI.h interaggregate.o: $(srcdir)/screenhack.h interaggregate.o: $(UTILS_SRC)/colors.h interaggregate.o: $(UTILS_SRC)/font-retry.h -interaggregate.o: $(UTILS_SRC)/grabscreen.h +interaggregate.o: $(UTILS_SRC)/grabclient.h interaggregate.o: $(UTILS_SRC)/hsv.h interaggregate.o: $(UTILS_SRC)/resources.h interaggregate.o: $(UTILS_SRC)/usleep.h @@ -2138,7 +2142,7 @@ interference.o: $(srcdir)/screenhack.h interference.o: $(UTILS_SRC)/aligned_malloc.h interference.o: $(UTILS_SRC)/colors.h interference.o: $(UTILS_SRC)/font-retry.h -interference.o: $(UTILS_SRC)/grabscreen.h +interference.o: $(UTILS_SRC)/grabclient.h interference.o: $(UTILS_SRC)/hsv.h interference.o: $(UTILS_SRC)/resources.h interference.o: $(UTILS_SRC)/thread_util.h @@ -2155,7 +2159,7 @@ intermomentary.o: $(srcdir)/screenhackI.h intermomentary.o: $(srcdir)/screenhack.h intermomentary.o: $(UTILS_SRC)/colors.h intermomentary.o: $(UTILS_SRC)/font-retry.h -intermomentary.o: $(UTILS_SRC)/grabscreen.h +intermomentary.o: $(UTILS_SRC)/grabclient.h intermomentary.o: $(UTILS_SRC)/hsv.h intermomentary.o: $(UTILS_SRC)/resources.h intermomentary.o: $(UTILS_SRC)/usleep.h @@ -2169,7 +2173,7 @@ juggle.o: $(srcdir)/screenhackI.h juggle.o: $(UTILS_SRC)/colors.h juggle.o: $(UTILS_SRC)/erase.h juggle.o: $(UTILS_SRC)/font-retry.h -juggle.o: $(UTILS_SRC)/grabscreen.h +juggle.o: $(UTILS_SRC)/grabclient.h juggle.o: $(UTILS_SRC)/hsv.h juggle.o: $(UTILS_SRC)/resources.h juggle.o: $(UTILS_SRC)/usleep.h @@ -2185,7 +2189,7 @@ julia.o: $(srcdir)/screenhackI.h julia.o: $(UTILS_SRC)/colors.h julia.o: $(UTILS_SRC)/erase.h julia.o: $(UTILS_SRC)/font-retry.h -julia.o: $(UTILS_SRC)/grabscreen.h +julia.o: $(UTILS_SRC)/grabclient.h julia.o: $(UTILS_SRC)/hsv.h julia.o: $(UTILS_SRC)/resources.h julia.o: $(UTILS_SRC)/usleep.h @@ -2201,7 +2205,7 @@ kaleidescope.o: $(srcdir)/screenhackI.h kaleidescope.o: $(srcdir)/screenhack.h kaleidescope.o: $(UTILS_SRC)/colors.h kaleidescope.o: $(UTILS_SRC)/font-retry.h -kaleidescope.o: $(UTILS_SRC)/grabscreen.h +kaleidescope.o: $(UTILS_SRC)/grabclient.h kaleidescope.o: $(UTILS_SRC)/hsv.h kaleidescope.o: $(UTILS_SRC)/resources.h kaleidescope.o: $(UTILS_SRC)/spline.h @@ -2216,7 +2220,7 @@ kumppa.o: $(srcdir)/screenhackI.h kumppa.o: $(srcdir)/screenhack.h kumppa.o: $(UTILS_SRC)/colors.h kumppa.o: $(UTILS_SRC)/font-retry.h -kumppa.o: $(UTILS_SRC)/grabscreen.h +kumppa.o: $(UTILS_SRC)/grabclient.h kumppa.o: $(UTILS_SRC)/hsv.h kumppa.o: $(UTILS_SRC)/resources.h kumppa.o: $(UTILS_SRC)/usleep.h @@ -2231,7 +2235,7 @@ laser.o: $(srcdir)/screenhackI.h laser.o: $(UTILS_SRC)/colors.h laser.o: $(UTILS_SRC)/erase.h laser.o: $(UTILS_SRC)/font-retry.h -laser.o: $(UTILS_SRC)/grabscreen.h +laser.o: $(UTILS_SRC)/grabclient.h laser.o: $(UTILS_SRC)/hsv.h laser.o: $(UTILS_SRC)/resources.h laser.o: $(UTILS_SRC)/usleep.h @@ -2247,7 +2251,7 @@ lcdscrub.o: $(srcdir)/screenhackI.h lcdscrub.o: $(srcdir)/screenhack.h lcdscrub.o: $(UTILS_SRC)/colors.h lcdscrub.o: $(UTILS_SRC)/font-retry.h -lcdscrub.o: $(UTILS_SRC)/grabscreen.h +lcdscrub.o: $(UTILS_SRC)/grabclient.h lcdscrub.o: $(UTILS_SRC)/hsv.h lcdscrub.o: $(UTILS_SRC)/resources.h lcdscrub.o: $(UTILS_SRC)/usleep.h @@ -2261,7 +2265,7 @@ lightning.o: $(srcdir)/screenhackI.h lightning.o: $(UTILS_SRC)/colors.h lightning.o: $(UTILS_SRC)/erase.h lightning.o: $(UTILS_SRC)/font-retry.h -lightning.o: $(UTILS_SRC)/grabscreen.h +lightning.o: $(UTILS_SRC)/grabclient.h lightning.o: $(UTILS_SRC)/hsv.h lightning.o: $(UTILS_SRC)/resources.h lightning.o: $(UTILS_SRC)/usleep.h @@ -2277,7 +2281,7 @@ lisa.o: $(srcdir)/screenhackI.h lisa.o: $(UTILS_SRC)/colors.h lisa.o: $(UTILS_SRC)/erase.h lisa.o: $(UTILS_SRC)/font-retry.h -lisa.o: $(UTILS_SRC)/grabscreen.h +lisa.o: $(UTILS_SRC)/grabclient.h lisa.o: $(UTILS_SRC)/hsv.h lisa.o: $(UTILS_SRC)/resources.h lisa.o: $(UTILS_SRC)/usleep.h @@ -2293,7 +2297,7 @@ lissie.o: $(srcdir)/screenhackI.h lissie.o: $(UTILS_SRC)/colors.h lissie.o: $(UTILS_SRC)/erase.h lissie.o: $(UTILS_SRC)/font-retry.h -lissie.o: $(UTILS_SRC)/grabscreen.h +lissie.o: $(UTILS_SRC)/grabclient.h lissie.o: $(UTILS_SRC)/hsv.h lissie.o: $(UTILS_SRC)/resources.h lissie.o: $(UTILS_SRC)/usleep.h @@ -2309,7 +2313,7 @@ lmorph.o: $(srcdir)/screenhackI.h lmorph.o: $(srcdir)/screenhack.h lmorph.o: $(UTILS_SRC)/colors.h lmorph.o: $(UTILS_SRC)/font-retry.h -lmorph.o: $(UTILS_SRC)/grabscreen.h +lmorph.o: $(UTILS_SRC)/grabclient.h lmorph.o: $(UTILS_SRC)/hsv.h lmorph.o: $(UTILS_SRC)/resources.h lmorph.o: $(UTILS_SRC)/usleep.h @@ -2324,7 +2328,7 @@ loop.o: $(srcdir)/screenhackI.h loop.o: $(UTILS_SRC)/colors.h loop.o: $(UTILS_SRC)/erase.h loop.o: $(UTILS_SRC)/font-retry.h -loop.o: $(UTILS_SRC)/grabscreen.h +loop.o: $(UTILS_SRC)/grabclient.h loop.o: $(UTILS_SRC)/hsv.h loop.o: $(UTILS_SRC)/resources.h loop.o: $(UTILS_SRC)/usleep.h @@ -2344,7 +2348,7 @@ m6502.o: $(srcdir)/screenhack.h m6502.o: $(UTILS_SRC)/aligned_malloc.h m6502.o: $(UTILS_SRC)/colors.h m6502.o: $(UTILS_SRC)/font-retry.h -m6502.o: $(UTILS_SRC)/grabscreen.h +m6502.o: $(UTILS_SRC)/grabclient.h m6502.o: $(UTILS_SRC)/hsv.h m6502.o: $(UTILS_SRC)/resources.h m6502.o: $(UTILS_SRC)/thread_util.h @@ -2361,7 +2365,7 @@ marbling.o: $(srcdir)/screenhack.h marbling.o: $(UTILS_SRC)/aligned_malloc.h marbling.o: $(UTILS_SRC)/colors.h marbling.o: $(UTILS_SRC)/font-retry.h -marbling.o: $(UTILS_SRC)/grabscreen.h +marbling.o: $(UTILS_SRC)/grabclient.h marbling.o: $(UTILS_SRC)/hsv.h marbling.o: $(UTILS_SRC)/resources.h marbling.o: $(UTILS_SRC)/thread_util.h @@ -2381,7 +2385,7 @@ maze.o: $(srcdir)/screenhack.h maze.o: $(UTILS_SRC)/colors.h maze.o: $(UTILS_SRC)/erase.h maze.o: $(UTILS_SRC)/font-retry.h -maze.o: $(UTILS_SRC)/grabscreen.h +maze.o: $(UTILS_SRC)/grabclient.h maze.o: $(UTILS_SRC)/hsv.h maze.o: $(UTILS_SRC)/resources.h maze.o: $(UTILS_SRC)/usleep.h @@ -2396,7 +2400,7 @@ memscroller.o: $(srcdir)/screenhackI.h memscroller.o: $(srcdir)/screenhack.h memscroller.o: $(UTILS_SRC)/colors.h memscroller.o: $(UTILS_SRC)/font-retry.h -memscroller.o: $(UTILS_SRC)/grabscreen.h +memscroller.o: $(UTILS_SRC)/grabclient.h memscroller.o: $(UTILS_SRC)/hsv.h memscroller.o: $(UTILS_SRC)/resources.h memscroller.o: $(UTILS_SRC)/usleep.h @@ -2411,7 +2415,7 @@ metaballs.o: $(srcdir)/screenhackI.h metaballs.o: $(srcdir)/screenhack.h metaballs.o: $(UTILS_SRC)/colors.h metaballs.o: $(UTILS_SRC)/font-retry.h -metaballs.o: $(UTILS_SRC)/grabscreen.h +metaballs.o: $(UTILS_SRC)/grabclient.h metaballs.o: $(UTILS_SRC)/hsv.h metaballs.o: $(UTILS_SRC)/resources.h metaballs.o: $(UTILS_SRC)/usleep.h @@ -2425,7 +2429,7 @@ moire2.o: $(srcdir)/screenhackI.h moire2.o: $(srcdir)/screenhack.h moire2.o: $(UTILS_SRC)/colors.h moire2.o: $(UTILS_SRC)/font-retry.h -moire2.o: $(UTILS_SRC)/grabscreen.h +moire2.o: $(UTILS_SRC)/grabclient.h moire2.o: $(UTILS_SRC)/hsv.h moire2.o: $(UTILS_SRC)/resources.h moire2.o: $(UTILS_SRC)/usleep.h @@ -2440,7 +2444,7 @@ moire.o: $(srcdir)/screenhackI.h moire.o: $(srcdir)/screenhack.h moire.o: $(UTILS_SRC)/colors.h moire.o: $(UTILS_SRC)/font-retry.h -moire.o: $(UTILS_SRC)/grabscreen.h +moire.o: $(UTILS_SRC)/grabclient.h moire.o: $(UTILS_SRC)/hsv.h moire.o: $(UTILS_SRC)/resources.h moire.o: $(UTILS_SRC)/usleep.h @@ -2455,7 +2459,7 @@ mountain.o: $(srcdir)/screenhackI.h mountain.o: $(UTILS_SRC)/colors.h mountain.o: $(UTILS_SRC)/erase.h mountain.o: $(UTILS_SRC)/font-retry.h -mountain.o: $(UTILS_SRC)/grabscreen.h +mountain.o: $(UTILS_SRC)/grabclient.h mountain.o: $(UTILS_SRC)/hsv.h mountain.o: $(UTILS_SRC)/resources.h mountain.o: $(UTILS_SRC)/usleep.h @@ -2471,7 +2475,7 @@ munch.o: $(srcdir)/screenhackI.h munch.o: $(srcdir)/screenhack.h munch.o: $(UTILS_SRC)/colors.h munch.o: $(UTILS_SRC)/font-retry.h -munch.o: $(UTILS_SRC)/grabscreen.h +munch.o: $(UTILS_SRC)/grabclient.h munch.o: $(UTILS_SRC)/hsv.h munch.o: $(UTILS_SRC)/pow2.h munch.o: $(UTILS_SRC)/resources.h @@ -2486,7 +2490,7 @@ nerverot.o: $(srcdir)/screenhackI.h nerverot.o: $(srcdir)/screenhack.h nerverot.o: $(UTILS_SRC)/colors.h nerverot.o: $(UTILS_SRC)/font-retry.h -nerverot.o: $(UTILS_SRC)/grabscreen.h +nerverot.o: $(UTILS_SRC)/grabclient.h nerverot.o: $(UTILS_SRC)/hsv.h nerverot.o: $(UTILS_SRC)/resources.h nerverot.o: $(UTILS_SRC)/usleep.h @@ -2508,7 +2512,7 @@ noseguy.o: $(srcdir)/screenhackI.h noseguy.o: $(srcdir)/screenhack.h noseguy.o: $(UTILS_SRC)/colors.h noseguy.o: $(UTILS_SRC)/font-retry.h -noseguy.o: $(UTILS_SRC)/grabscreen.h +noseguy.o: $(UTILS_SRC)/grabclient.h noseguy.o: $(UTILS_SRC)/hsv.h noseguy.o: $(UTILS_SRC)/resources.h noseguy.o: $(UTILS_SRC)/textclient.h @@ -2527,7 +2531,7 @@ pacman_ai.o: $(srcdir)/screenhackI.h pacman_ai.o: $(UTILS_SRC)/colors.h pacman_ai.o: $(UTILS_SRC)/erase.h pacman_ai.o: $(UTILS_SRC)/font-retry.h -pacman_ai.o: $(UTILS_SRC)/grabscreen.h +pacman_ai.o: $(UTILS_SRC)/grabclient.h pacman_ai.o: $(UTILS_SRC)/hsv.h pacman_ai.o: $(UTILS_SRC)/resources.h pacman_ai.o: $(UTILS_SRC)/usleep.h @@ -2543,7 +2547,7 @@ pacman_level.o: $(srcdir)/recanim.h pacman_level.o: $(srcdir)/screenhackI.h pacman_level.o: $(UTILS_SRC)/colors.h pacman_level.o: $(UTILS_SRC)/font-retry.h -pacman_level.o: $(UTILS_SRC)/grabscreen.h +pacman_level.o: $(UTILS_SRC)/grabclient.h pacman_level.o: $(UTILS_SRC)/hsv.h pacman_level.o: $(UTILS_SRC)/resources.h pacman_level.o: $(UTILS_SRC)/usleep.h @@ -2561,7 +2565,7 @@ pacman.o: $(srcdir)/screenhackI.h pacman.o: $(UTILS_SRC)/colors.h pacman.o: $(UTILS_SRC)/erase.h pacman.o: $(UTILS_SRC)/font-retry.h -pacman.o: $(UTILS_SRC)/grabscreen.h +pacman.o: $(UTILS_SRC)/grabclient.h pacman.o: $(UTILS_SRC)/hsv.h pacman.o: $(UTILS_SRC)/resources.h pacman.o: $(UTILS_SRC)/usleep.h @@ -2579,7 +2583,7 @@ pedal.o: $(srcdir)/screenhack.h pedal.o: $(UTILS_SRC)/colors.h pedal.o: $(UTILS_SRC)/erase.h pedal.o: $(UTILS_SRC)/font-retry.h -pedal.o: $(UTILS_SRC)/grabscreen.h +pedal.o: $(UTILS_SRC)/grabclient.h pedal.o: $(UTILS_SRC)/hsv.h pedal.o: $(UTILS_SRC)/resources.h pedal.o: $(UTILS_SRC)/usleep.h @@ -2593,7 +2597,7 @@ penetrate.o: $(srcdir)/screenhackI.h penetrate.o: $(srcdir)/screenhack.h penetrate.o: $(UTILS_SRC)/colors.h penetrate.o: $(UTILS_SRC)/font-retry.h -penetrate.o: $(UTILS_SRC)/grabscreen.h +penetrate.o: $(UTILS_SRC)/grabclient.h penetrate.o: $(UTILS_SRC)/hsv.h penetrate.o: $(UTILS_SRC)/resources.h penetrate.o: $(UTILS_SRC)/usleep.h @@ -2607,7 +2611,7 @@ penrose.o: $(srcdir)/screenhackI.h penrose.o: $(UTILS_SRC)/colors.h penrose.o: $(UTILS_SRC)/erase.h penrose.o: $(UTILS_SRC)/font-retry.h -penrose.o: $(UTILS_SRC)/grabscreen.h +penrose.o: $(UTILS_SRC)/grabclient.h penrose.o: $(UTILS_SRC)/hsv.h penrose.o: $(UTILS_SRC)/resources.h penrose.o: $(UTILS_SRC)/usleep.h @@ -2623,7 +2627,7 @@ petri.o: $(srcdir)/screenhackI.h petri.o: $(srcdir)/screenhack.h petri.o: $(UTILS_SRC)/colors.h petri.o: $(UTILS_SRC)/font-retry.h -petri.o: $(UTILS_SRC)/grabscreen.h +petri.o: $(UTILS_SRC)/grabclient.h petri.o: $(UTILS_SRC)/hsv.h petri.o: $(UTILS_SRC)/resources.h petri.o: $(UTILS_SRC)/spline.h @@ -2639,7 +2643,7 @@ phosphor.o: $(srcdir)/screenhackI.h phosphor.o: $(srcdir)/screenhack.h phosphor.o: $(UTILS_SRC)/colors.h phosphor.o: $(UTILS_SRC)/font-retry.h -phosphor.o: $(UTILS_SRC)/grabscreen.h +phosphor.o: $(UTILS_SRC)/grabclient.h phosphor.o: $(UTILS_SRC)/hsv.h phosphor.o: $(UTILS_SRC)/resources.h phosphor.o: $(UTILS_SRC)/textclient.h @@ -2656,7 +2660,7 @@ piecewise.o: $(srcdir)/screenhackI.h piecewise.o: $(srcdir)/screenhack.h piecewise.o: $(UTILS_SRC)/colors.h piecewise.o: $(UTILS_SRC)/font-retry.h -piecewise.o: $(UTILS_SRC)/grabscreen.h +piecewise.o: $(UTILS_SRC)/grabclient.h piecewise.o: $(UTILS_SRC)/hsv.h piecewise.o: $(UTILS_SRC)/resources.h piecewise.o: $(UTILS_SRC)/usleep.h @@ -2671,7 +2675,7 @@ polyominoes.o: $(srcdir)/screenhackI.h polyominoes.o: $(UTILS_SRC)/colors.h polyominoes.o: $(UTILS_SRC)/erase.h polyominoes.o: $(UTILS_SRC)/font-retry.h -polyominoes.o: $(UTILS_SRC)/grabscreen.h +polyominoes.o: $(UTILS_SRC)/grabclient.h polyominoes.o: $(UTILS_SRC)/hsv.h polyominoes.o: $(UTILS_SRC)/resources.h polyominoes.o: $(UTILS_SRC)/usleep.h @@ -2689,7 +2693,7 @@ pong.o: $(srcdir)/screenhack.h pong.o: $(UTILS_SRC)/aligned_malloc.h pong.o: $(UTILS_SRC)/colors.h pong.o: $(UTILS_SRC)/font-retry.h -pong.o: $(UTILS_SRC)/grabscreen.h +pong.o: $(UTILS_SRC)/grabclient.h pong.o: $(UTILS_SRC)/hsv.h pong.o: $(UTILS_SRC)/resources.h pong.o: $(UTILS_SRC)/thread_util.h @@ -2705,7 +2709,7 @@ popsquares.o: $(srcdir)/screenhackI.h popsquares.o: $(srcdir)/screenhack.h popsquares.o: $(UTILS_SRC)/colors.h popsquares.o: $(UTILS_SRC)/font-retry.h -popsquares.o: $(UTILS_SRC)/grabscreen.h +popsquares.o: $(UTILS_SRC)/grabclient.h popsquares.o: $(UTILS_SRC)/hsv.h popsquares.o: $(UTILS_SRC)/resources.h popsquares.o: $(UTILS_SRC)/usleep.h @@ -2720,7 +2724,7 @@ pyro.o: $(srcdir)/screenhackI.h pyro.o: $(srcdir)/screenhack.h pyro.o: $(UTILS_SRC)/colors.h pyro.o: $(UTILS_SRC)/font-retry.h -pyro.o: $(UTILS_SRC)/grabscreen.h +pyro.o: $(UTILS_SRC)/grabclient.h pyro.o: $(UTILS_SRC)/hsv.h pyro.o: $(UTILS_SRC)/resources.h pyro.o: $(UTILS_SRC)/usleep.h @@ -2735,7 +2739,7 @@ qix.o: $(srcdir)/screenhack.h qix.o: $(UTILS_SRC)/alpha.h qix.o: $(UTILS_SRC)/colors.h qix.o: $(UTILS_SRC)/font-retry.h -qix.o: $(UTILS_SRC)/grabscreen.h +qix.o: $(UTILS_SRC)/grabclient.h qix.o: $(UTILS_SRC)/hsv.h qix.o: $(UTILS_SRC)/resources.h qix.o: $(UTILS_SRC)/usleep.h @@ -2749,7 +2753,7 @@ rdbomb.o: $(srcdir)/screenhackI.h rdbomb.o: $(srcdir)/screenhack.h rdbomb.o: $(UTILS_SRC)/colors.h rdbomb.o: $(UTILS_SRC)/font-retry.h -rdbomb.o: $(UTILS_SRC)/grabscreen.h +rdbomb.o: $(UTILS_SRC)/grabclient.h rdbomb.o: $(UTILS_SRC)/hsv.h rdbomb.o: $(UTILS_SRC)/resources.h rdbomb.o: $(UTILS_SRC)/usleep.h @@ -2763,7 +2767,7 @@ recanim.o: $(srcdir)/recanim.h recanim.o: $(srcdir)/screenhackI.h recanim.o: $(UTILS_SRC)/colors.h recanim.o: $(UTILS_SRC)/font-retry.h -recanim.o: $(UTILS_SRC)/grabscreen.h +recanim.o: $(UTILS_SRC)/grabclient.h recanim.o: $(UTILS_SRC)/hsv.h recanim.o: $(UTILS_SRC)/resources.h recanim.o: $(UTILS_SRC)/usleep.h @@ -2777,7 +2781,7 @@ ripples.o: $(srcdir)/screenhackI.h ripples.o: $(srcdir)/screenhack.h ripples.o: $(UTILS_SRC)/colors.h ripples.o: $(UTILS_SRC)/font-retry.h -ripples.o: $(UTILS_SRC)/grabscreen.h +ripples.o: $(UTILS_SRC)/grabclient.h ripples.o: $(UTILS_SRC)/hsv.h ripples.o: $(UTILS_SRC)/resources.h ripples.o: $(UTILS_SRC)/usleep.h @@ -2792,7 +2796,7 @@ rocks.o: $(srcdir)/screenhackI.h rocks.o: $(srcdir)/screenhack.h rocks.o: $(UTILS_SRC)/colors.h rocks.o: $(UTILS_SRC)/font-retry.h -rocks.o: $(UTILS_SRC)/grabscreen.h +rocks.o: $(UTILS_SRC)/grabclient.h rocks.o: $(UTILS_SRC)/hsv.h rocks.o: $(UTILS_SRC)/resources.h rocks.o: $(UTILS_SRC)/usleep.h @@ -2807,7 +2811,7 @@ rorschach.o: $(srcdir)/screenhack.h rorschach.o: $(UTILS_SRC)/colors.h rorschach.o: $(UTILS_SRC)/erase.h rorschach.o: $(UTILS_SRC)/font-retry.h -rorschach.o: $(UTILS_SRC)/grabscreen.h +rorschach.o: $(UTILS_SRC)/grabclient.h rorschach.o: $(UTILS_SRC)/hsv.h rorschach.o: $(UTILS_SRC)/resources.h rorschach.o: $(UTILS_SRC)/usleep.h @@ -2821,7 +2825,7 @@ rotor.o: $(srcdir)/screenhackI.h rotor.o: $(UTILS_SRC)/colors.h rotor.o: $(UTILS_SRC)/erase.h rotor.o: $(UTILS_SRC)/font-retry.h -rotor.o: $(UTILS_SRC)/grabscreen.h +rotor.o: $(UTILS_SRC)/grabclient.h rotor.o: $(UTILS_SRC)/hsv.h rotor.o: $(UTILS_SRC)/resources.h rotor.o: $(UTILS_SRC)/usleep.h @@ -2837,7 +2841,7 @@ rotzoomer.o: $(srcdir)/screenhackI.h rotzoomer.o: $(srcdir)/screenhack.h rotzoomer.o: $(UTILS_SRC)/colors.h rotzoomer.o: $(UTILS_SRC)/font-retry.h -rotzoomer.o: $(UTILS_SRC)/grabscreen.h +rotzoomer.o: $(UTILS_SRC)/grabclient.h rotzoomer.o: $(UTILS_SRC)/hsv.h rotzoomer.o: $(UTILS_SRC)/resources.h rotzoomer.o: $(UTILS_SRC)/usleep.h @@ -2852,7 +2856,7 @@ scooter.o: $(srcdir)/screenhackI.h scooter.o: $(UTILS_SRC)/colors.h scooter.o: $(UTILS_SRC)/erase.h scooter.o: $(UTILS_SRC)/font-retry.h -scooter.o: $(UTILS_SRC)/grabscreen.h +scooter.o: $(UTILS_SRC)/grabclient.h scooter.o: $(UTILS_SRC)/hsv.h scooter.o: $(UTILS_SRC)/resources.h scooter.o: $(UTILS_SRC)/usleep.h @@ -2867,7 +2871,7 @@ screenhack.o: $(srcdir)/recanim.h screenhack.o: $(srcdir)/screenhackI.h screenhack.o: $(UTILS_SRC)/colors.h screenhack.o: $(UTILS_SRC)/font-retry.h -screenhack.o: $(UTILS_SRC)/grabscreen.h +screenhack.o: $(UTILS_SRC)/grabclient.h screenhack.o: $(UTILS_SRC)/hsv.h screenhack.o: $(UTILS_SRC)/resources.h screenhack.o: $(UTILS_SRC)/usleep.h @@ -2884,7 +2888,7 @@ shadebobs.o: $(srcdir)/screenhackI.h shadebobs.o: $(srcdir)/screenhack.h shadebobs.o: $(UTILS_SRC)/colors.h shadebobs.o: $(UTILS_SRC)/font-retry.h -shadebobs.o: $(UTILS_SRC)/grabscreen.h +shadebobs.o: $(UTILS_SRC)/grabclient.h shadebobs.o: $(UTILS_SRC)/hsv.h shadebobs.o: $(UTILS_SRC)/resources.h shadebobs.o: $(UTILS_SRC)/usleep.h @@ -2898,7 +2902,7 @@ sierpinski.o: $(srcdir)/screenhackI.h sierpinski.o: $(UTILS_SRC)/colors.h sierpinski.o: $(UTILS_SRC)/erase.h sierpinski.o: $(UTILS_SRC)/font-retry.h -sierpinski.o: $(UTILS_SRC)/grabscreen.h +sierpinski.o: $(UTILS_SRC)/grabclient.h sierpinski.o: $(UTILS_SRC)/hsv.h sierpinski.o: $(UTILS_SRC)/resources.h sierpinski.o: $(UTILS_SRC)/usleep.h @@ -2914,7 +2918,7 @@ slidescreen.o: $(srcdir)/screenhackI.h slidescreen.o: $(srcdir)/screenhack.h slidescreen.o: $(UTILS_SRC)/colors.h slidescreen.o: $(UTILS_SRC)/font-retry.h -slidescreen.o: $(UTILS_SRC)/grabscreen.h +slidescreen.o: $(UTILS_SRC)/grabclient.h slidescreen.o: $(UTILS_SRC)/hsv.h slidescreen.o: $(UTILS_SRC)/resources.h slidescreen.o: $(UTILS_SRC)/usleep.h @@ -2928,7 +2932,7 @@ slip.o: $(srcdir)/screenhackI.h slip.o: $(UTILS_SRC)/colors.h slip.o: $(UTILS_SRC)/erase.h slip.o: $(UTILS_SRC)/font-retry.h -slip.o: $(UTILS_SRC)/grabscreen.h +slip.o: $(UTILS_SRC)/grabclient.h slip.o: $(UTILS_SRC)/hsv.h slip.o: $(UTILS_SRC)/resources.h slip.o: $(UTILS_SRC)/usleep.h @@ -2945,7 +2949,7 @@ speedmine.o: $(srcdir)/screenhack.h speedmine.o: $(UTILS_SRC)/colors.h speedmine.o: $(UTILS_SRC)/erase.h speedmine.o: $(UTILS_SRC)/font-retry.h -speedmine.o: $(UTILS_SRC)/grabscreen.h +speedmine.o: $(UTILS_SRC)/grabclient.h speedmine.o: $(UTILS_SRC)/hsv.h speedmine.o: $(UTILS_SRC)/resources.h speedmine.o: $(UTILS_SRC)/usleep.h @@ -2959,7 +2963,7 @@ sphere.o: $(srcdir)/screenhackI.h sphere.o: $(UTILS_SRC)/colors.h sphere.o: $(UTILS_SRC)/erase.h sphere.o: $(UTILS_SRC)/font-retry.h -sphere.o: $(UTILS_SRC)/grabscreen.h +sphere.o: $(UTILS_SRC)/grabclient.h sphere.o: $(UTILS_SRC)/hsv.h sphere.o: $(UTILS_SRC)/resources.h sphere.o: $(UTILS_SRC)/usleep.h @@ -2975,7 +2979,7 @@ spiral.o: $(srcdir)/screenhackI.h spiral.o: $(UTILS_SRC)/colors.h spiral.o: $(UTILS_SRC)/erase.h spiral.o: $(UTILS_SRC)/font-retry.h -spiral.o: $(UTILS_SRC)/grabscreen.h +spiral.o: $(UTILS_SRC)/grabclient.h spiral.o: $(UTILS_SRC)/hsv.h spiral.o: $(UTILS_SRC)/resources.h spiral.o: $(UTILS_SRC)/usleep.h @@ -2991,7 +2995,7 @@ spotlight.o: $(srcdir)/screenhackI.h spotlight.o: $(srcdir)/screenhack.h spotlight.o: $(UTILS_SRC)/colors.h spotlight.o: $(UTILS_SRC)/font-retry.h -spotlight.o: $(UTILS_SRC)/grabscreen.h +spotlight.o: $(UTILS_SRC)/grabclient.h spotlight.o: $(UTILS_SRC)/hsv.h spotlight.o: $(UTILS_SRC)/resources.h spotlight.o: $(UTILS_SRC)/usleep.h @@ -3006,7 +3010,7 @@ squiral.o: $(srcdir)/screenhack.h squiral.o: $(UTILS_SRC)/colors.h squiral.o: $(UTILS_SRC)/erase.h squiral.o: $(UTILS_SRC)/font-retry.h -squiral.o: $(UTILS_SRC)/grabscreen.h +squiral.o: $(UTILS_SRC)/grabclient.h squiral.o: $(UTILS_SRC)/hsv.h squiral.o: $(UTILS_SRC)/resources.h squiral.o: $(UTILS_SRC)/usleep.h @@ -3020,7 +3024,7 @@ starfish.o: $(srcdir)/screenhackI.h starfish.o: $(srcdir)/screenhack.h starfish.o: $(UTILS_SRC)/colors.h starfish.o: $(UTILS_SRC)/font-retry.h -starfish.o: $(UTILS_SRC)/grabscreen.h +starfish.o: $(UTILS_SRC)/grabclient.h starfish.o: $(UTILS_SRC)/hsv.h starfish.o: $(UTILS_SRC)/resources.h starfish.o: $(UTILS_SRC)/spline.h @@ -3036,7 +3040,7 @@ strange.o: $(UTILS_SRC)/aligned_malloc.h strange.o: $(UTILS_SRC)/colors.h strange.o: $(UTILS_SRC)/erase.h strange.o: $(UTILS_SRC)/font-retry.h -strange.o: $(UTILS_SRC)/grabscreen.h +strange.o: $(UTILS_SRC)/grabclient.h strange.o: $(UTILS_SRC)/hsv.h strange.o: $(UTILS_SRC)/pow2.h strange.o: $(UTILS_SRC)/resources.h @@ -3055,7 +3059,7 @@ substrate.o: $(srcdir)/screenhackI.h substrate.o: $(srcdir)/screenhack.h substrate.o: $(UTILS_SRC)/colors.h substrate.o: $(UTILS_SRC)/font-retry.h -substrate.o: $(UTILS_SRC)/grabscreen.h +substrate.o: $(UTILS_SRC)/grabclient.h substrate.o: $(UTILS_SRC)/hsv.h substrate.o: $(UTILS_SRC)/resources.h substrate.o: $(UTILS_SRC)/usleep.h @@ -3069,7 +3073,7 @@ swirl.o: $(srcdir)/screenhackI.h swirl.o: $(UTILS_SRC)/colors.h swirl.o: $(UTILS_SRC)/erase.h swirl.o: $(UTILS_SRC)/font-retry.h -swirl.o: $(UTILS_SRC)/grabscreen.h +swirl.o: $(UTILS_SRC)/grabclient.h swirl.o: $(UTILS_SRC)/hsv.h swirl.o: $(UTILS_SRC)/resources.h swirl.o: $(UTILS_SRC)/usleep.h @@ -3086,7 +3090,7 @@ t3d.o: $(srcdir)/screenhackI.h t3d.o: $(srcdir)/screenhack.h t3d.o: $(UTILS_SRC)/colors.h t3d.o: $(UTILS_SRC)/font-retry.h -t3d.o: $(UTILS_SRC)/grabscreen.h +t3d.o: $(UTILS_SRC)/grabclient.h t3d.o: $(UTILS_SRC)/hsv.h t3d.o: $(UTILS_SRC)/resources.h t3d.o: $(UTILS_SRC)/usleep.h @@ -3101,7 +3105,7 @@ tessellimage.o: $(srcdir)/screenhackI.h tessellimage.o: $(srcdir)/screenhack.h tessellimage.o: $(UTILS_SRC)/colors.h tessellimage.o: $(UTILS_SRC)/font-retry.h -tessellimage.o: $(UTILS_SRC)/grabscreen.h +tessellimage.o: $(UTILS_SRC)/grabclient.h tessellimage.o: $(UTILS_SRC)/hsv.h tessellimage.o: $(UTILS_SRC)/resources.h tessellimage.o: $(UTILS_SRC)/usleep.h @@ -3119,7 +3123,7 @@ testx11.o: $(UTILS_SRC)/colorbars.h testx11.o: $(UTILS_SRC)/colors.h testx11.o: $(UTILS_SRC)/erase.h testx11.o: $(UTILS_SRC)/font-retry.h -testx11.o: $(UTILS_SRC)/grabscreen.h +testx11.o: $(UTILS_SRC)/grabclient.h testx11.o: $(UTILS_SRC)/hsv.h testx11.o: $(UTILS_SRC)/resources.h testx11.o: $(UTILS_SRC)/usleep.h @@ -3134,7 +3138,7 @@ thornbird.o: $(srcdir)/screenhackI.h thornbird.o: $(UTILS_SRC)/colors.h thornbird.o: $(UTILS_SRC)/erase.h thornbird.o: $(UTILS_SRC)/font-retry.h -thornbird.o: $(UTILS_SRC)/grabscreen.h +thornbird.o: $(UTILS_SRC)/grabclient.h thornbird.o: $(UTILS_SRC)/hsv.h thornbird.o: $(UTILS_SRC)/resources.h thornbird.o: $(UTILS_SRC)/usleep.h @@ -3150,7 +3154,7 @@ triangle.o: $(srcdir)/screenhackI.h triangle.o: $(UTILS_SRC)/colors.h triangle.o: $(UTILS_SRC)/erase.h triangle.o: $(UTILS_SRC)/font-retry.h -triangle.o: $(UTILS_SRC)/grabscreen.h +triangle.o: $(UTILS_SRC)/grabclient.h triangle.o: $(UTILS_SRC)/hsv.h triangle.o: $(UTILS_SRC)/resources.h triangle.o: $(UTILS_SRC)/usleep.h @@ -3166,7 +3170,7 @@ truchet.o: $(srcdir)/screenhackI.h truchet.o: $(srcdir)/screenhack.h truchet.o: $(UTILS_SRC)/colors.h truchet.o: $(UTILS_SRC)/font-retry.h -truchet.o: $(UTILS_SRC)/grabscreen.h +truchet.o: $(UTILS_SRC)/grabclient.h truchet.o: $(UTILS_SRC)/hsv.h truchet.o: $(UTILS_SRC)/resources.h truchet.o: $(UTILS_SRC)/usleep.h @@ -3180,7 +3184,7 @@ twang.o: $(srcdir)/screenhackI.h twang.o: $(srcdir)/screenhack.h twang.o: $(UTILS_SRC)/colors.h twang.o: $(UTILS_SRC)/font-retry.h -twang.o: $(UTILS_SRC)/grabscreen.h +twang.o: $(UTILS_SRC)/grabclient.h twang.o: $(UTILS_SRC)/hsv.h twang.o: $(UTILS_SRC)/resources.h twang.o: $(UTILS_SRC)/usleep.h @@ -3195,7 +3199,7 @@ vermiculate.o: $(srcdir)/screenhackI.h vermiculate.o: $(srcdir)/screenhack.h vermiculate.o: $(UTILS_SRC)/colors.h vermiculate.o: $(UTILS_SRC)/font-retry.h -vermiculate.o: $(UTILS_SRC)/grabscreen.h +vermiculate.o: $(UTILS_SRC)/grabclient.h vermiculate.o: $(UTILS_SRC)/hsv.h vermiculate.o: $(UTILS_SRC)/resources.h vermiculate.o: $(UTILS_SRC)/usleep.h @@ -3211,7 +3215,7 @@ vfeedback.o: $(srcdir)/screenhack.h vfeedback.o: $(UTILS_SRC)/aligned_malloc.h vfeedback.o: $(UTILS_SRC)/colors.h vfeedback.o: $(UTILS_SRC)/font-retry.h -vfeedback.o: $(UTILS_SRC)/grabscreen.h +vfeedback.o: $(UTILS_SRC)/grabclient.h vfeedback.o: $(UTILS_SRC)/hsv.h vfeedback.o: $(UTILS_SRC)/resources.h vfeedback.o: $(UTILS_SRC)/thread_util.h @@ -3227,7 +3231,7 @@ vines.o: $(srcdir)/screenhackI.h vines.o: $(UTILS_SRC)/colors.h vines.o: $(UTILS_SRC)/erase.h vines.o: $(UTILS_SRC)/font-retry.h -vines.o: $(UTILS_SRC)/grabscreen.h +vines.o: $(UTILS_SRC)/grabclient.h vines.o: $(UTILS_SRC)/hsv.h vines.o: $(UTILS_SRC)/resources.h vines.o: $(UTILS_SRC)/usleep.h @@ -3244,7 +3248,7 @@ wander.o: $(srcdir)/screenhack.h wander.o: $(UTILS_SRC)/colors.h wander.o: $(UTILS_SRC)/erase.h wander.o: $(UTILS_SRC)/font-retry.h -wander.o: $(UTILS_SRC)/grabscreen.h +wander.o: $(UTILS_SRC)/grabclient.h wander.o: $(UTILS_SRC)/hsv.h wander.o: $(UTILS_SRC)/resources.h wander.o: $(UTILS_SRC)/usleep.h @@ -3258,7 +3262,7 @@ webcollage-cocoa.o: $(srcdir)/screenhackI.h webcollage-cocoa.o: $(srcdir)/screenhack.h webcollage-cocoa.o: $(UTILS_SRC)/colors.h webcollage-cocoa.o: $(UTILS_SRC)/font-retry.h -webcollage-cocoa.o: $(UTILS_SRC)/grabscreen.h +webcollage-cocoa.o: $(UTILS_SRC)/grabclient.h webcollage-cocoa.o: $(UTILS_SRC)/hsv.h webcollage-cocoa.o: $(UTILS_SRC)/resources.h webcollage-cocoa.o: $(UTILS_SRC)/usleep.h @@ -3274,7 +3278,7 @@ whirlwindwarp.o: $(srcdir)/screenhack.h whirlwindwarp.o: $(UTILS_SRC)/colors.h whirlwindwarp.o: $(UTILS_SRC)/erase.h whirlwindwarp.o: $(UTILS_SRC)/font-retry.h -whirlwindwarp.o: $(UTILS_SRC)/grabscreen.h +whirlwindwarp.o: $(UTILS_SRC)/grabclient.h whirlwindwarp.o: $(UTILS_SRC)/hsv.h whirlwindwarp.o: $(UTILS_SRC)/resources.h whirlwindwarp.o: $(UTILS_SRC)/usleep.h @@ -3288,7 +3292,7 @@ whirlygig.o: $(srcdir)/screenhackI.h whirlygig.o: $(srcdir)/screenhack.h whirlygig.o: $(UTILS_SRC)/colors.h whirlygig.o: $(UTILS_SRC)/font-retry.h -whirlygig.o: $(UTILS_SRC)/grabscreen.h +whirlygig.o: $(UTILS_SRC)/grabclient.h whirlygig.o: $(UTILS_SRC)/hsv.h whirlygig.o: $(UTILS_SRC)/resources.h whirlygig.o: $(UTILS_SRC)/usleep.h @@ -3303,7 +3307,7 @@ wormhole.o: $(srcdir)/screenhackI.h wormhole.o: $(srcdir)/screenhack.h wormhole.o: $(UTILS_SRC)/colors.h wormhole.o: $(UTILS_SRC)/font-retry.h -wormhole.o: $(UTILS_SRC)/grabscreen.h +wormhole.o: $(UTILS_SRC)/grabclient.h wormhole.o: $(UTILS_SRC)/hsv.h wormhole.o: $(UTILS_SRC)/resources.h wormhole.o: $(UTILS_SRC)/usleep.h @@ -3317,7 +3321,7 @@ worm.o: $(srcdir)/screenhackI.h worm.o: $(UTILS_SRC)/colors.h worm.o: $(UTILS_SRC)/erase.h worm.o: $(UTILS_SRC)/font-retry.h -worm.o: $(UTILS_SRC)/grabscreen.h +worm.o: $(UTILS_SRC)/grabclient.h worm.o: $(UTILS_SRC)/hsv.h worm.o: $(UTILS_SRC)/resources.h worm.o: $(UTILS_SRC)/usleep.h @@ -3339,7 +3343,7 @@ xanalogtv.o: $(srcdir)/screenhack.h xanalogtv.o: $(UTILS_SRC)/aligned_malloc.h xanalogtv.o: $(UTILS_SRC)/colors.h xanalogtv.o: $(UTILS_SRC)/font-retry.h -xanalogtv.o: $(UTILS_SRC)/grabscreen.h +xanalogtv.o: $(UTILS_SRC)/grabclient.h xanalogtv.o: $(UTILS_SRC)/hsv.h xanalogtv.o: $(UTILS_SRC)/resources.h xanalogtv.o: $(UTILS_SRC)/thread_util.h @@ -3357,7 +3361,7 @@ xflame.o: $(srcdir)/screenhackI.h xflame.o: $(srcdir)/screenhack.h xflame.o: $(UTILS_SRC)/colors.h xflame.o: $(UTILS_SRC)/font-retry.h -xflame.o: $(UTILS_SRC)/grabscreen.h +xflame.o: $(UTILS_SRC)/grabclient.h xflame.o: $(UTILS_SRC)/hsv.h xflame.o: $(UTILS_SRC)/resources.h xflame.o: $(UTILS_SRC)/usleep.h @@ -3372,7 +3376,7 @@ ximage-loader.o: $(srcdir)/recanim.h ximage-loader.o: $(srcdir)/screenhackI.h ximage-loader.o: $(UTILS_SRC)/colors.h ximage-loader.o: $(UTILS_SRC)/font-retry.h -ximage-loader.o: $(UTILS_SRC)/grabscreen.h +ximage-loader.o: $(UTILS_SRC)/grabclient.h ximage-loader.o: $(UTILS_SRC)/hsv.h ximage-loader.o: $(UTILS_SRC)/resources.h ximage-loader.o: $(UTILS_SRC)/usleep.h @@ -3387,7 +3391,7 @@ xjack.o: $(srcdir)/screenhackI.h xjack.o: $(srcdir)/screenhack.h xjack.o: $(UTILS_SRC)/colors.h xjack.o: $(UTILS_SRC)/font-retry.h -xjack.o: $(UTILS_SRC)/grabscreen.h +xjack.o: $(UTILS_SRC)/grabclient.h xjack.o: $(UTILS_SRC)/hsv.h xjack.o: $(UTILS_SRC)/resources.h xjack.o: $(UTILS_SRC)/usleep.h @@ -3402,7 +3406,7 @@ xlockmore.o: $(srcdir)/screenhack.h xlockmore.o: $(UTILS_SRC)/colors.h xlockmore.o: $(UTILS_SRC)/erase.h xlockmore.o: $(UTILS_SRC)/font-retry.h -xlockmore.o: $(UTILS_SRC)/grabscreen.h +xlockmore.o: $(UTILS_SRC)/grabclient.h xlockmore.o: $(UTILS_SRC)/hsv.h xlockmore.o: $(UTILS_SRC)/resources.h xlockmore.o: $(UTILS_SRC)/usleep.h @@ -3417,7 +3421,7 @@ xlyap.o: $(srcdir)/screenhackI.h xlyap.o: $(srcdir)/screenhack.h xlyap.o: $(UTILS_SRC)/colors.h xlyap.o: $(UTILS_SRC)/font-retry.h -xlyap.o: $(UTILS_SRC)/grabscreen.h +xlyap.o: $(UTILS_SRC)/grabclient.h xlyap.o: $(UTILS_SRC)/hsv.h xlyap.o: $(UTILS_SRC)/resources.h xlyap.o: $(UTILS_SRC)/usleep.h @@ -3435,7 +3439,7 @@ xmatrix.o: $(srcdir)/screenhackI.h xmatrix.o: $(srcdir)/screenhack.h xmatrix.o: $(UTILS_SRC)/colors.h xmatrix.o: $(UTILS_SRC)/font-retry.h -xmatrix.o: $(UTILS_SRC)/grabscreen.h +xmatrix.o: $(UTILS_SRC)/grabclient.h xmatrix.o: $(UTILS_SRC)/hsv.h xmatrix.o: $(UTILS_SRC)/resources.h xmatrix.o: $(UTILS_SRC)/textclient.h @@ -3451,7 +3455,7 @@ xrayswarm.o: $(srcdir)/screenhackI.h xrayswarm.o: $(srcdir)/screenhack.h xrayswarm.o: $(UTILS_SRC)/colors.h xrayswarm.o: $(UTILS_SRC)/font-retry.h -xrayswarm.o: $(UTILS_SRC)/grabscreen.h +xrayswarm.o: $(UTILS_SRC)/grabclient.h xrayswarm.o: $(UTILS_SRC)/hsv.h xrayswarm.o: $(UTILS_SRC)/resources.h xrayswarm.o: $(UTILS_SRC)/usleep.h @@ -3459,10 +3463,15 @@ xrayswarm.o: $(UTILS_SRC)/visual.h xrayswarm.o: $(UTILS_SRC)/xft.h xrayswarm.o: $(UTILS_SRC)/yarandom.h xscreensaver-getimage.o: ../config.h +xscreensaver-getimage.o: $(srcdir)/../driver/blurb.c +xscreensaver-getimage.o: $(srcdir)/../driver/blurb.h +xscreensaver-getimage.o: $(srcdir)/../driver/blurb.h xscreensaver-getimage.o: $(srcdir)/../driver/prefs.h xscreensaver-getimage.o: $(UTILS_SRC)/colorbars.h -xscreensaver-getimage.o: $(UTILS_SRC)/grabscreen.h +xscreensaver-getimage.o: $(UTILS_SRC)/colors.h +xscreensaver-getimage.o: $(UTILS_SRC)/grabclient.h xscreensaver-getimage.o: $(UTILS_SRC)/resources.h +xscreensaver-getimage.o: $(UTILS_SRC)/screenshot.h xscreensaver-getimage.o: $(UTILS_SRC)/utils.h xscreensaver-getimage.o: $(UTILS_SRC)/version.h xscreensaver-getimage.o: $(UTILS_SRC)/visual.h @@ -3477,7 +3486,7 @@ xspirograph.o: $(srcdir)/screenhack.h xspirograph.o: $(UTILS_SRC)/colors.h xspirograph.o: $(UTILS_SRC)/erase.h xspirograph.o: $(UTILS_SRC)/font-retry.h -xspirograph.o: $(UTILS_SRC)/grabscreen.h +xspirograph.o: $(UTILS_SRC)/grabclient.h xspirograph.o: $(UTILS_SRC)/hsv.h xspirograph.o: $(UTILS_SRC)/resources.h xspirograph.o: $(UTILS_SRC)/usleep.h @@ -3498,7 +3507,7 @@ zoom.o: $(srcdir)/screenhackI.h zoom.o: $(srcdir)/screenhack.h zoom.o: $(UTILS_SRC)/colors.h zoom.o: $(UTILS_SRC)/font-retry.h -zoom.o: $(UTILS_SRC)/grabscreen.h +zoom.o: $(UTILS_SRC)/grabclient.h zoom.o: $(UTILS_SRC)/hsv.h zoom.o: $(UTILS_SRC)/resources.h zoom.o: $(UTILS_SRC)/usleep.h diff --git a/hacks/abstractile.c b/hacks/abstractile.c index 1b055c20..67c5e1dd 100644 --- a/hacks/abstractile.c +++ b/hacks/abstractile.c @@ -663,6 +663,9 @@ _init_screen(struct state *st) if (st->tile==TILE_THIN) st->lwid=2; + if (st->xgwa.width > 2560 || st->xgwa.height > 2560) + st->lwid *= 3; /* Retina displays */ + _init_zlist(st); st->maxlen=(st->lwid>6) ? 2+(random()%4) : diff --git a/hacks/analogtv.c b/hacks/analogtv.c index ca87a121..fa95c400 100644 --- a/hacks/analogtv.c +++ b/hacks/analogtv.c @@ -83,7 +83,7 @@ #include "resources.h" #include "analogtv.h" #include "yarandom.h" -#include "grabscreen.h" +#include "grabclient.h" #include "visual.h" #include "xft.h" #include "font-retry.h" diff --git a/hacks/anemone.c b/hacks/anemone.c index f0ea5e8d..3e28f042 100644 --- a/hacks/anemone.c +++ b/hacks/anemone.c @@ -208,6 +208,12 @@ anemone_init (Display *disp, Window window) st->scrHeight = wa.height; st->cmap = wa.colormap; + if (st->scrWidth > 2560 || st->scrHeight > 2560) { /* Retina displays */ + st->width *= 4; + st->finpoints *= 2; + st->withdraw *= 2; + } + st->ncolors = get_integer_resource (st->dpy, "colors", "Colors"); st->ncolors += 3; st->colors = (XColor *) malloc(sizeof(*st->colors) * (st->ncolors+1)); diff --git a/hacks/anemotaxis.c b/hacks/anemotaxis.c index 04c12e3f..7945097c 100644 --- a/hacks/anemotaxis.c +++ b/hacks/anemotaxis.c @@ -511,7 +511,8 @@ static void draw_image(struct state *st, Drawable curr_window) for(j = 0; j < st->source[i]->n; j++) { - int size = (st->scrWidth > 2560 ? 8 : 4); /* Retina displays */ + int size = (st->scrWidth > 2560 || st->scrHeight > 2560 + ? 8 : 4); /* Retina displays */ if(st->source[i]->yv[j].v == 2) continue; diff --git a/hacks/apollonian.c b/hacks/apollonian.c index 782b41c3..269f53e1 100644 --- a/hacks/apollonian.c +++ b/hacks/apollonian.c @@ -67,7 +67,7 @@ static const char sccsid[] = "@(#)apollonian.c 5.02 2001/07/01 xlockmore"; "*count: 64 \n" \ "*cycles: 20 \n" \ "*ncolors: 64 \n" \ - "*font: sans-serif bold 10\n" \ + "*font: sans-serif bold 16\n" \ "*fpsTop: true \n" \ "*fpsSolid: true \n" \ "*ignoreRotation: True" \ diff --git a/hacks/barcode.c b/hacks/barcode.c index 75a22583..29eb6e03 100644 --- a/hacks/barcode.c +++ b/hacks/barcode.c @@ -86,6 +86,7 @@ struct state { Bitmap *theBitmap; /* ginormo bitmap for drawing */ enum { BC_SCROLL, BC_GRID, BC_CLOCK12, BC_CLOCK24 } mode; + int step; int grid_w; int grid_h; @@ -1542,6 +1543,11 @@ static void setup (struct state *st) st->windowWidth = xgwa.width; st->windowHeight = xgwa.height; + st->step = get_integer_resource (st->dpy, "step", "Step"); + if (st->step < 1) st->step = 1; + if (st->windowWidth > 2560 || st->windowHeight > 2560) + st->step *= 3; /* Retina displays */ + gcv.background = get_pixel_resource (st->dpy, xgwa.colormap, "background", "Background"); gcv.foreground = get_pixel_resource (st->dpy, xgwa.colormap, @@ -1633,7 +1639,7 @@ static void scrollModel (struct state *st) for (i = 0; i < st->barcode_count; i++) { Barcode *b = &st->barcodes[i]; - b->x--; + b->x -= st->step; if ((b->x + BARCODE_WIDTH * b->mag) < 0) { /* fell off the edge */ @@ -1955,8 +1961,9 @@ barcode_free (Display *dpy, Window window, void *closure) static const char *barcode_defaults [] = { ".background: black", ".foreground: green", - ".lowrez: true", +/* ".lowrez: true", */ "*fpsSolid: true", + "*step: 1", "*delay: 10000", "*mode: scroll", 0 @@ -1966,6 +1973,7 @@ static XrmOptionDescRec barcode_options [] = { { "-delay", ".delay", XrmoptionSepArg, 0 }, { "-mode", ".mode", XrmoptionSepArg, 0 }, { "-scroll", ".mode", XrmoptionNoArg, "scroll" }, + { "-step", ".step", XrmoptionNoArg, "step" }, { "-grid", ".mode", XrmoptionNoArg, "grid" }, { "-clock", ".mode", XrmoptionNoArg, "clock" }, { "-clock12", ".mode", XrmoptionNoArg, "clock12" }, diff --git a/hacks/blaster.c b/hacks/blaster.c index 5ab37418..9da8969f 100644 --- a/hacks/blaster.c +++ b/hacks/blaster.c @@ -100,6 +100,7 @@ struct state { XWindowAttributes xgwa; int initted; + int scale; int draw_x; int draw_y; @@ -123,7 +124,7 @@ static void make_new_robot(struct state *st, int index) if(laser_check==0) { st->robots[index].alive=1; - st->robots[index].radius = 7+(random()%7); + st->robots[index].radius = (7+(random()%7)) * st->scale; st->robots[index].move_style = random()%st->NUM_MOVE_STYLES; if(random()%2==0) { @@ -204,16 +205,16 @@ static void move_robots(struct state *st) if(st->robots[x].alive) { if((st->robots[x].new_x == st->robots[x].old_x) && (st->robots[x].new_y == st->robots[x].old_y)) { if(st->robots[x].new_x==0) { - st->robots[x].old_x = -((random()%3)+1); + st->robots[x].old_x = -((random()%3)+1) * st->scale; } else { - st->robots[x].old_x = st->robots[x].old_x + (random()%3)+1; + st->robots[x].old_x = st->robots[x].old_x + ((random()%3)+1) * st->scale; } if(st->robots[x].new_y==0) { - st->robots[x].old_y = -((random()%3)+1); + st->robots[x].old_y = -((random()%3)+1) * st->scale; } else { - st->robots[x].old_y = st->robots[x].old_y + (random()%3)+1; + st->robots[x].old_y = st->robots[x].old_y + ((random()%3)+1) * st->scale; } } if(st->robots[x].move_style==st->LINE_MOVE_STYLE) { @@ -234,8 +235,8 @@ static void move_robots(struct state *st) st->robots[x].old_x = st->robots[x].new_x; st->robots[x].old_y = st->robots[x].new_y; - st->robots[x].new_x = st->robots[x].new_x + dx; - st->robots[x].new_y = st->robots[x].new_y + dy; + st->robots[x].new_x = st->robots[x].new_x + dx * st->scale; + st->robots[x].new_y = st->robots[x].new_y + dy * st->scale; } else if(st->robots[x].move_style==st->RANDOM_MOVE_STYLE) { dx = st->robots[x].new_x - st->robots[x].old_x; @@ -259,10 +260,10 @@ static void move_robots(struct state *st) y = random()%3; if(y==0) { - dy = dy - ((random()%7)+1); + dy = dy - ((random()%7)+1) * st->scale; } else if(y==1){ - dy = dy + ((random()%7)+1); + dy = dy + ((random()%7)+1) * st->scale; } else { dx = (-1)*dx; @@ -276,8 +277,8 @@ static void move_robots(struct state *st) st->robots[x].old_x = st->robots[x].new_x; st->robots[x].old_y = st->robots[x].new_y; - st->robots[x].new_x = st->robots[x].new_x + dx; - st->robots[x].new_y = st->robots[x].new_y + dy; + st->robots[x].new_x = st->robots[x].new_x + dx * st->scale; + st->robots[x].new_y = st->robots[x].new_y + dy * st->scale; } /* bounds corrections */ @@ -315,28 +316,28 @@ static void move_robots(struct state *st) if(random()%2==0) { st->robots[x].lasers[y].start_x = st->robots[x].new_x+st->robots[x].radius; st->robots[x].lasers[y].start_y = st->robots[x].new_y+st->robots[x].radius; - st->robots[x].lasers[y].end_x = st->robots[x].lasers[y].start_x+7; - st->robots[x].lasers[y].end_y = st->robots[x].lasers[y].start_y+7; + st->robots[x].lasers[y].end_x = st->robots[x].lasers[y].start_x+7 * st->scale; + st->robots[x].lasers[y].end_y = st->robots[x].lasers[y].start_y+7 * st->scale; } else { st->robots[x].lasers[y].start_x = st->robots[x].new_x-st->robots[x].radius; st->robots[x].lasers[y].start_y = st->robots[x].new_y+st->robots[x].radius; - st->robots[x].lasers[y].end_x = st->robots[x].lasers[y].start_x-7; - st->robots[x].lasers[y].end_y = st->robots[x].lasers[y].start_y+7; + st->robots[x].lasers[y].end_x = st->robots[x].lasers[y].start_x-7 * st->scale; + st->robots[x].lasers[y].end_y = st->robots[x].lasers[y].start_y+7 * st->scale; } } else { if(random()%2==0) { st->robots[x].lasers[y].start_x = st->robots[x].new_x-st->robots[x].radius; st->robots[x].lasers[y].start_y = st->robots[x].new_y-st->robots[x].radius; - st->robots[x].lasers[y].end_x = st->robots[x].lasers[y].start_x-7; - st->robots[x].lasers[y].end_y = st->robots[x].lasers[y].start_y-7; + st->robots[x].lasers[y].end_x = st->robots[x].lasers[y].start_x-7 * st->scale; + st->robots[x].lasers[y].end_y = st->robots[x].lasers[y].start_y-7 * st->scale; } else { st->robots[x].lasers[y].start_x = st->robots[x].new_x+st->robots[x].radius; st->robots[x].lasers[y].start_y = st->robots[x].new_y-st->robots[x].radius; - st->robots[x].lasers[y].end_x = st->robots[x].lasers[y].start_x+7; - st->robots[x].lasers[y].end_y = st->robots[x].lasers[y].start_y-7; + st->robots[x].lasers[y].end_x = st->robots[x].lasers[y].start_x+7 * st->scale; + st->robots[x].lasers[y].end_y = st->robots[x].lasers[y].start_y-7 * st->scale; } } y = st->NUM_LASERS; @@ -354,11 +355,11 @@ static void move_robots(struct state *st) if((slope<1) && (slope>-1)) { if(target_x>st->robots[x].new_x) { st->robots[x].lasers[y].start_x = st->robots[x].radius; - st->robots[x].lasers[y].end_x = st->robots[x].lasers[y].start_x + 7; + st->robots[x].lasers[y].end_x = st->robots[x].lasers[y].start_x + 7 * st->scale; } else { st->robots[x].lasers[y].start_x = -st->robots[x].radius; - st->robots[x].lasers[y].end_x = st->robots[x].lasers[y].start_x - 7; + st->robots[x].lasers[y].end_x = st->robots[x].lasers[y].start_x - 7 * st->scale; } st->robots[x].lasers[y].start_y = (int)(st->robots[x].lasers[y].start_x * slope); st->robots[x].lasers[y].end_y = (int)(st->robots[x].lasers[y].end_x * slope); @@ -367,11 +368,11 @@ static void move_robots(struct state *st) slope = (target_x-st->robots[x].new_x)/(target_y-st->robots[x].new_y); if(target_y>st->robots[x].new_y) { st->robots[x].lasers[y].start_y = st->robots[x].radius; - st->robots[x].lasers[y].end_y = st->robots[x].lasers[y].start_y + 7; + st->robots[x].lasers[y].end_y = st->robots[x].lasers[y].start_y + 7 * st->scale; } else { st->robots[x].lasers[y].start_y = -st->robots[x].radius; - st->robots[x].lasers[y].end_y = st->robots[x].lasers[y].start_y - 7; + st->robots[x].lasers[y].end_y = st->robots[x].lasers[y].start_y - 7 * st->scale; } st->robots[x].lasers[y].start_x = (int)(st->robots[x].lasers[y].start_y * slope);; st->robots[x].lasers[y].end_x = (int)(st->robots[x].lasers[y].end_y * slope); @@ -386,20 +387,20 @@ static void move_robots(struct state *st) st->robots[x].lasers[y].start_x = st->robots[x].new_x; st->robots[x].lasers[y].start_y = st->robots[x].new_y+st->robots[x].radius; st->robots[x].lasers[y].end_x = st->robots[x].new_x; - st->robots[x].lasers[y].end_y = st->robots[x].lasers[y].start_y+7; + st->robots[x].lasers[y].end_y = st->robots[x].lasers[y].start_y+7 * st->scale; } else { st->robots[x].lasers[y].start_x = st->robots[x].new_x; st->robots[x].lasers[y].start_y = st->robots[x].new_y-st->robots[x].radius; st->robots[x].lasers[y].end_x = st->robots[x].new_x; - st->robots[x].lasers[y].end_y = st->robots[x].lasers[y].start_y-7; + st->robots[x].lasers[y].end_y = st->robots[x].lasers[y].start_y-7 * st->scale; } } - if((((st->robots[x].lasers[y].start_x - st->robots[x].lasers[y].end_x) > 7) || - ((st->robots[x].lasers[y].end_x - st->robots[x].lasers[y].start_x) > 7)) && - (((st->robots[x].lasers[y].start_y - st->robots[x].lasers[y].end_y) > 7) || - ((st->robots[x].lasers[y].end_y - st->robots[x].lasers[y].start_y) > 7))) { + if((((st->robots[x].lasers[y].start_x - st->robots[x].lasers[y].end_x) > 7 * st->scale) || + ((st->robots[x].lasers[y].end_x - st->robots[x].lasers[y].start_x) > 7 * st->scale)) && + (((st->robots[x].lasers[y].start_y - st->robots[x].lasers[y].end_y) > 7 * st->scale) || + ((st->robots[x].lasers[y].end_y - st->robots[x].lasers[y].start_y) > 7 * st->scale))) { } else { st->robots[x].lasers[y].active = 1; @@ -720,12 +721,13 @@ static void init_stars(struct state *st) { if(st->NUM_STARS) { + if (! st->stars) st->stars = (XArc *) malloc (st->NUM_STARS * sizeof(XArc)); for(st->draw_x=0;st->draw_xNUM_STARS;st->draw_x++) { st->stars[st->draw_x].x = random()%st->xgwa.width; st->stars[st->draw_x].y = random()%st->xgwa.height; - st->stars[st->draw_x].width = random()%4 + 1; + st->stars[st->draw_x].width = (random()%4 + 1) * st->scale; st->stars[st->draw_x].height = st->stars[st->draw_x].width; st->stars[st->draw_x].angle1 = 0; st->stars[st->draw_x].angle2 = 360 * 64; @@ -942,6 +944,10 @@ blaster_init (Display *d, Window w) XGetWindowAttributes(st->dpy, st->window, &st->xgwa); cmap = st->xgwa.colormap; + st->scale = 1; + if (st->xgwa.width > 2560 || st->xgwa.height > 2560) + st->scale = 3; /* Retina displays */ + st->NUM_ROBOTS=5; st->NUM_LASERS=3; @@ -989,14 +995,15 @@ blaster_init (Display *d, Window w) #define make_gc(color,name) \ gcv.foreground = get_pixel_resource (st->dpy, cmap, (name), "Foreground"); \ - color = XCreateGC (st->dpy, st->window, GCForeground|GCFunction, &gcv) + gcv.line_width = st->scale; \ + color = XCreateGC (st->dpy, st->window, GCForeground|GCFunction|GCLineWidth, &gcv) if(mono_p) { gcv.foreground = bg; - st->black = XCreateGC(st->dpy, st->window, GCForeground|GCFunction, &gcv); + st->black = XCreateGC(st->dpy, st->window, GCForeground|GCFunction|GCLineWidth, &gcv); gcv.foreground = get_pixel_resource(st->dpy, cmap, "foreground", "Foreground"); st->r_color0 = st->r_color1 = st->r_color2 = st->r_color3 = st->r_color4 = st->r_color5 = st->l_color0 = st->l_color1 = st->s_color= - XCreateGC(st->dpy, st->window, GCForeground|GCFunction, &gcv); + XCreateGC(st->dpy, st->window, GCForeground|GCFunction|GCLineWidth, &gcv); if(get_boolean_resource(st->dpy, "mother_ship","Boolean")) { st->MOTHER_SHIP_WIDTH=get_integer_resource(st->dpy, "mother_ship_width","Integer"); st->MOTHER_SHIP_HEIGHT=get_integer_resource(st->dpy, "mother_ship_height","Integer"); @@ -1048,6 +1055,13 @@ blaster_init (Display *d, Window w) #endif } + st->MOTHER_SHIP_WIDTH *= st->scale; + st->MOTHER_SHIP_HEIGHT *= st->scale; + st->MOTHER_SHIP_LASER *= st->scale; + st->EXPLODE_SIZE_1 *= st->scale; + st->EXPLODE_SIZE_2 *= st->scale; + st->EXPLODE_SIZE_3 *= st->scale; + return st; } @@ -1098,7 +1112,7 @@ blaster_free (Display *dpy, Window window, void *closure) static const char *blaster_defaults [] = { - ".lowrez: true", +/* ".lowrez: true",*/ ".background: black", ".foreground: white", "*fpsSolid: true", diff --git a/hacks/bouboule.c b/hacks/bouboule.c index 1ac0425f..8049e099 100644 --- a/hacks/bouboule.c +++ b/hacks/bouboule.c @@ -316,7 +316,8 @@ init_bouboule(ModeInfo * mi) int i; double theta, omega; - if (MI_WIDTH(mi) > 2560) size *= 2; /* Retina displays */ + if (MI_WIDTH(mi) > 2560 || MI_HEIGHT(mi) > 2560) + size *= 2; /* Retina displays */ MI_INIT (mi, starfield); sp = &starfield[MI_SCREEN(mi)]; diff --git a/hacks/boxfit.c b/hacks/boxfit.c index 09d2ef76..0d908d27 100644 --- a/hacks/boxfit.c +++ b/hacks/boxfit.c @@ -172,6 +172,11 @@ boxfit_init (Display *dpy, Window window) if (st->inc < 1) st->inc = 1; if (st->border_size < 0) st->border_size = 0; + if (st->xgwa.width > 2560 || st->xgwa.height > 2560) { /* Retina displays */ + st->border_size *= 3; + st->spacing *= 3; + } + gcv.line_width = st->border_size; gcv.background = st->bg_color; st->gc = XCreateGC (st->dpy, st->window, GCBackground|GCLineWidth, &gcv); diff --git a/hacks/bsod.c b/hacks/bsod.c index 85203fa5..077c38dc 100644 --- a/hacks/bsod.c +++ b/hacks/bsod.c @@ -1980,7 +1980,8 @@ windows_10 (Display *dpy, Window window) bst->fg, bst->bg, bst->xgwa.depth); { int n = 2; - if (bst->xgwa.width > 2560) n++; /* Retina displays */ + if (bst->xgwa.width > 2560 || bst->xgwa.height > 2560) + n++; /* Retina displays */ for (i = 0; i < n; i++) { pixmap = double_pixmap (dpy, bst->xgwa.visual, bst->xgwa.depth, @@ -2368,7 +2369,8 @@ windows_ransomware (Display *dpy, Window window) while (excuse_quip == excuse_quip_2) excuse_quip_2 = excuse_quips[random() % countof(excuse_quips)]; - if (bst->xgwa.width > 2560) n++; /* Retina displays */ + if (bst->xgwa.width > 2560 || bst->xgwa.height > 2560) + n++; /* Retina displays */ for (i = 0; i < n; i++) { pixmap = double_pixmap (dpy, bst->xgwa.visual, bst->xgwa.depth, @@ -2849,7 +2851,8 @@ amiga (Display *dpy, Window window) { int i, n = 0; if (MIN (bst->xgwa.width, bst->xgwa.height) > 600) n++; - if (bst->xgwa.width > 2560) n++; /* Retina displays */ + if (bst->xgwa.width > 2560 || bst->xgwa.height > 2560) + n++; /* Retina displays */ for (i = 0; i < n; i++) { pixmap = double_pixmap (dpy, bst->xgwa.visual, bst->xgwa.depth, @@ -3220,7 +3223,8 @@ mac1 (Display *dpy, Window window) pix_h < bst->xgwa.height / 2) { int i, n = 1; - if (bst->xgwa.width > 2560) n++; /* Retina displays */ + if (bst->xgwa.width > 2560 || bst->xgwa.height > 2560) + n++; /* Retina displays */ for (i = 0; i < n; i++) { pixmap = double_pixmap (dpy, bst->xgwa.visual, @@ -3590,7 +3594,8 @@ macx_install (Display *dpy, Window window) if (pixmap) { int i, n = 0; - if (bst->xgwa.width > 2560) n++; /* Retina displays */ + if (bst->xgwa.width > 2560 || bst->xgwa.height > 2560) + n++; /* Retina displays */ for (i = 0; i < n; i++) { pixmap = double_pixmap (dpy, bst->xgwa.visual, bst->xgwa.depth, @@ -6483,7 +6488,8 @@ android (Display *dpy, Window window) if (! pixmap) abort(); { int i, n = 0; - if (bst->xgwa.width > 2560) n++; /* Retina displays */ + if (bst->xgwa.width > 2560 || bst->xgwa.height > 2560) + n++; /* Retina displays */ for (i = 0; i < n; i++) { pixmap = double_pixmap (dpy, bst->xgwa.visual, bst->xgwa.depth, @@ -7324,8 +7330,8 @@ static const XrmOptionDescRec bsod_options [] = { { "-no-android", ".doAndroid", XrmoptionNoArg, "False" }, { "-vmware", ".doVMware", XrmoptionNoArg, "True" }, { "-no-vmware", ".doVMware", XrmoptionNoArg, "False" }, - { "-vmware-arm", ".doVMwareArm", XrmoptionNoArg, "True" }, - { "-no-vmware-arm", ".doVMwareArm", XrmoptionNoArg, "False" }, + { "-vmwarearm", ".doVMwareArm", XrmoptionNoArg, "True" }, + { "-no-vmwarearm", ".doVMwareArm", XrmoptionNoArg, "False" }, { "-encom", ".doEncom", XrmoptionNoArg, "True" }, { "-no-encom", ".doEncom", XrmoptionNoArg, "False" }, { "-dvd", ".doDVD", XrmoptionNoArg, "True" }, diff --git a/hacks/bumps.c b/hacks/bumps.c index d24ce00e..d03af911 100644 --- a/hacks/bumps.c +++ b/hacks/bumps.c @@ -57,9 +57,6 @@ static const char *bumps_defaults [] = { "*duration: 120", "*soften: 1", "*invert: FALSE", -#ifdef __sgi /* really, HAVE_READ_DISPLAY_EXTENSION */ - "*visualID: Best", -#endif #ifdef HAVE_XSHM_EXTENSION "*useSHM: True", #endif /* HAVE_XSHM_EXTENSION */ @@ -301,10 +298,7 @@ static void CreateBumps( SBumps *pBumps, Display *dpy, Window NewWin ) } GCValues.function = GXcopy; - GCValues.subwindow_mode = IncludeInferiors; nGCFlags = GCFunction; - if( use_subwindow_mode_p( XWinAttribs.screen, pBumps->Win ) ) /* See grabscreen.c */ - nGCFlags |= GCSubwindowMode; pBumps->GraphicsContext = XCreateGC( pBumps->dpy, pBumps->Win, nGCFlags, &GCValues ); SetPalette(dpy, pBumps, &XWinAttribs ); @@ -427,6 +421,10 @@ static void InitBumpMap_2(Display *dpy, SBumps *pBumps) while( nSoften-- ) softenMultiplier *= 1.0f + ( 1.0f / 3.0f ); /* Softening takes the max height down, so scale up to compensate. */ maxHeight = pBumps->SpotLight.nLightRadius * softenMultiplier; + + if (XWinAttribs.width > 2560 || XWinAttribs.height > 2560) + maxHeight *= 2; /* Retina displays */ + nAverager = maxHeight ? ( 3 * 0xFFFF ) / maxHeight : 0; pBump = pBumps->aBumpMap; diff --git a/hacks/check-configs.pl b/hacks/check-configs.pl index a5f9f8b8..38ee7b26 100755 --- a/hacks/check-configs.pl +++ b/hacks/check-configs.pl @@ -21,7 +21,7 @@ use diagnostics; use strict; my $progname = $0; $progname =~ s@.*/@@g; -my ($version) = ('$Revision: 1.39 $' =~ m/\s(\d[.\d]+)\s/s); +my ($version) = ('$Revision: 1.40 $' =~ m/\s(\d[.\d]+)\s/s); my $verbose = 0; my $debug_p = 0; @@ -30,29 +30,29 @@ my $debug_p = 0; my $text_default_opts = ''; foreach (qw(text-mode text-literal text-file text-url text-program)) { my $s = $_; $s =~ s/-(.)/\U$1/g; $s =~ s/url/URL/si; - $text_default_opts .= "{\"-$_\", \".$s\", XrmoptionSepArg, 0},\n"; + $text_default_opts .= "{\"--$_\", \".$s\", XrmoptionSepArg, 0},\n"; } my $image_default_opts = ''; foreach (qw(choose-random-images grab-desktop-images)) { my $s = $_; $s =~ s/-(.)/\U$1/g; - $image_default_opts .= "{\"-$_\", \".$s\", XrmoptionSepArg, 0},\n"; + $image_default_opts .= "{\"--$_\", \".$s\", XrmoptionSepArg, 0},\n"; } my $xlockmore_default_opts = ''; foreach (qw(count cycles delay ncolors size font)) { - $xlockmore_default_opts .= "{\"-$_\", \".$_\", XrmoptionSepArg, 0},\n"; + $xlockmore_default_opts .= "{\"--$_\", \".$_\", XrmoptionSepArg, 0},\n"; } $xlockmore_default_opts .= - "{\"-wireframe\", \".wireframe\", XrmoptionNoArg, \"true\"},\n" . - "{\"-3d\", \".use3d\", XrmoptionNoArg, \"true\"},\n" . - "{\"-no-3d\", \".use3d\", XrmoptionNoArg, \"false\"},\n"; + "{\"--wireframe\", \".wireframe\", XrmoptionNoArg, \"true\"},\n" . + "{\"--3d\", \".use3d\", XrmoptionNoArg, \"true\"},\n" . + "{\"--no-3d\", \".use3d\", XrmoptionNoArg, \"false\"},\n"; my $thread_default_opts = - "{\"-threads\", \".useThreads\", XrmoptionNoArg, \"True\"},\n" . - "{\"-no-threads\", \".useThreads\", XrmoptionNoArg, \"False\"},\n"; + "{\"--threads\", \".useThreads\", XrmoptionNoArg, \"True\"},\n" . + "{\"--no-threads\", \".useThreads\", XrmoptionNoArg, \"False\"},\n"; my $analogtv_default_opts = ''; foreach (qw(color tint brightness contrast)) { - $analogtv_default_opts .= "{\"-tv-$_\", \".TV$_\", XrmoptionSepArg, 0},\n"; + $analogtv_default_opts .= "{\"--tv-$_\", \".TV$_\", XrmoptionSepArg, 0},\n"; } $analogtv_default_opts .= $thread_default_opts; @@ -61,7 +61,7 @@ $analogtv_default_opts .= $thread_default_opts; # Returns two tables: # - A table of the default resource values. -# - A table of "-switch" => "resource: value", or "-switch" => "resource: %" +# - A table of "--switch" => "resource: value", or "--switch" => "resource: %" # sub parse_src($) { my ($saver) = @_; @@ -155,11 +155,11 @@ sub parse_src($) { print STDERR "$progname: $file: switches to resources:\n" if ($verbose > 2); my %switch_to_res; - $switch_to_res{'-fps'} = 'doFPS: true'; - $switch_to_res{'-fg'} = 'foreground: %'; - $switch_to_res{'-bg'} = 'background: %'; - $switch_to_res{'-no-grab-desktop-images'} = 'grabDesktopImages: false'; - $switch_to_res{'-no-choose-random-images'} = 'chooseRandomImages: false'; + $switch_to_res{'--fps'} = 'doFPS: true'; + $switch_to_res{'--fg'} = 'foreground: %'; + $switch_to_res{'--bg'} = 'background: %'; + $switch_to_res{'--no-grab-desktop-images'} = 'grabDesktopImages: false'; + $switch_to_res{'--no-choose-random-images'} = 'chooseRandomImages: false'; my ($ign, $opts) = ($body =~ m/(_options|\bopts)\s*\[\]\s*=\s*{(.*?)}\s*;/s); if ($xlockmore_p || $thread_p || $analogtv_p || $opts) { @@ -180,12 +180,13 @@ sub parse_src($) { \s * \"([^\"]+)\" \s* , \s * ([^\s]+) \s* , \s * (\"([^\"]*)\"|([a-zA-Z\d_]+)) \s* }@xi; + $switch =~ s/^(-[^-])/-$1/s; # "-foo" => "--foo" print STDERR "$progname: $file: unparsable: $_\n" unless $switch; my $val = defined($v1) ? $v1 : $v2; $val = '%' if ($type eq 'XrmoptionSepArg'); $res =~ s/^[.*]//s; $res =~ s/^[a-z\d]+\.//si; - $switch =~ s/^\+/-no-/s; + $switch =~ s/^\+/--no-/s; $val = "$res: $val"; if (defined ($switch_to_res{$switch})) { @@ -232,19 +233,19 @@ sub parse_xml($$$) { - - + + @gs; $body =~ s@@ + arg-unset="--no-grab-desktop-images"/> + arg-unset="--no-choose-random-images"/> @gs; $body =~ s// /gsi; @@ -386,6 +387,7 @@ sub parse_xml($$$) { my ($set) = $ctrl->{'arg-set'}; my ($unset) = $ctrl->{'arg-unset'}; my ($arg) = $set || $unset || error ("$file: unparsable: $args"); + $arg = lc($arg); my ($res) = $switch_to_res->{$arg}; error ("$file: no resource for boolean switch \"$arg\"") unless $res; diff --git a/hacks/compass.c b/hacks/compass.c index e321d701..5bada8ca 100644 --- a/hacks/compass.c +++ b/hacks/compass.c @@ -834,7 +834,8 @@ compass_init (Display *dpy, Window window) { int max = 600; - if (st->xgwa.width > 2560) max *= 2; /* Retina displays */ + if (st->xgwa.width > 2560 || st->xgwa.height > 2560) + max *= 2; /* Retina displays */ if (st->size2 > max) st->size2 = max; } diff --git a/hacks/config/README b/hacks/config/README index f5694c47..68fa70dc 100644 --- a/hacks/config/README +++ b/hacks/config/README @@ -4,8 +4,8 @@ a screen saver and locker for the X window system by Jamie Zawinski - version 6.04 - 29-May-2022 + version 6.05 + 04-Oct-2022 https://www.jwz.org/xscreensaver/ diff --git a/hacks/config/bsod.xml b/hacks/config/bsod.xml index aad37f6b..3938147b 100644 --- a/hacks/config/bsod.xml +++ b/hacks/config/bsod.xml @@ -18,7 +18,7 @@ - + diff --git a/hacks/config/coral.xml b/hacks/config/coral.xml index a357dec2..8397bda7 100644 --- a/hacks/config/coral.xml +++ b/hacks/config/coral.xml @@ -29,7 +29,7 @@ <_description> -Simulates coral growth, albeit somewhat slowly. +Simulates colorful coral growth. Written by Frederick Roeber; 1997. diff --git a/hacks/config/glitchpeg.xml b/hacks/config/glitchpeg.xml index 9f268b69..bf756f93 100644 --- a/hacks/config/glitchpeg.xml +++ b/hacks/config/glitchpeg.xml @@ -19,7 +19,7 @@ + low="1" high="1024" default="400"/> diff --git a/hacks/config/hextrail.xml b/hacks/config/hextrail.xml new file mode 100644 index 00000000..fe20a175 --- /dev/null +++ b/hacks/config/hextrail.xml @@ -0,0 +1,48 @@ + + + + + + + diff --git a/hacks/config/mirrorblob.xml b/hacks/config/mirrorblob.xml index 2073d1a8..2f471685 100644 --- a/hacks/config/mirrorblob.xml +++ b/hacks/config/mirrorblob.xml @@ -32,7 +32,7 @@ + _label="Resolution" low="4" high="150" default="90"/> + + <_description> -Displays a view of the "Bird in a Thornbush" fractal. +This screen saver was removed from the XScreenSaver distribution as of +version 6.05. This fractal is among those generated by "Discrete". Written by Tim Auckland; 2002. diff --git a/hacks/config/topblock.xml b/hacks/config/topblock.xml index 0d8bcf87..315690a4 100644 --- a/hacks/config/topblock.xml +++ b/hacks/config/topblock.xml @@ -30,7 +30,7 @@ + low="4" high="20" default="8"/> - - <_description> -Displays a distorted frame of video from the system's camera. - -This is a shell script that grabs a frame of video from the system's -video input, and then uses some PBM filters (chosen at random) to -manipulate and recombine the video frame in various ways (edge -detection, subtracting the image from a rotated version of itself, -etc.) Then it displays that image for a few seconds, and does it -again. This works really well if you just feed broadcast television -into it. +Distorts an image using a random series of filters: edge detection, +subtracting the image from a rotated version of itself, etc. Written by Jamie Zawinski; 1998. diff --git a/hacks/config/webcollage.xml b/hacks/config/webcollage.xml index a2acab73..3455660a 100644 --- a/hacks/config/webcollage.xml +++ b/hacks/config/webcollage.xml @@ -44,6 +44,6 @@ Please act accordingly. See also https://www.jwz.org/webcollage/ -Written by Jamie Zawinski; 1999. +Written by Jamie Zawinski; 1998. diff --git a/hacks/coral.c b/hacks/coral.c index f82f9ed3..e2ea987a 100644 --- a/hacks/coral.c +++ b/hacks/coral.c @@ -32,7 +32,8 @@ struct state { int height; int delay, delay2; int max_points; - XPoint *pointbuf; + XRectangle *pointbuf; + int scale; unsigned int *board; @@ -62,6 +63,11 @@ init_coral(struct state *st) st->width = xgwa.width; st->widthb = ((xgwa.width + 31) >> 5); st->height = xgwa.height; + + st->scale = 1; + if (st->width > 2560 || st->height > 2560) + st->scale *= 2; /* Retina displays */ + if (st->board) free(st->board); st->board = (unsigned int *)calloc(st->widthb * xgwa.height, sizeof(unsigned int)); if(!st->board) exit(1); @@ -166,6 +172,8 @@ coral(struct state *st) /* XDrawPoint(dpy, window, draw_gc, x, y); */ st->pointbuf[st->npoints].x = x; st->pointbuf[st->npoints].y = y; + st->pointbuf[st->npoints].width = + st->pointbuf[st->npoints].height = st->scale; st->npoints++; /* Mark the surrounding area as "sticky" */ @@ -181,8 +189,8 @@ coral(struct state *st) } if (flush || color || 0 == st->nwalkers || st->npoints >= st->max_points) { - XDrawPoints(st->dpy, st->window, st->draw_gc, st->pointbuf, st->npoints, - CoordModeOrigin); + XFillRectangles(st->dpy, st->window, st->draw_gc, + st->pointbuf, st->npoints); st->npoints = 0; } @@ -197,20 +205,20 @@ coral(struct state *st) do { switch(rand_2()) { case 0: - if( 1 == x ) continue; - st->walkers[i].x--; + if( x <= st->scale ) continue; + st->walkers[i].x -= st->scale; break; case 1: - if( st->width-2 == x ) continue; - st->walkers[i].x++; + if( x >= st->width - 2 * st->scale ) continue; + st->walkers[i].x += st->scale; break; case 2: - if( 1 == y ) continue; - st->walkers[i].y--; + if( y <= st->scale ) continue; + st->walkers[i].y -= st->scale; break; default: /* case 3: */ - if( st->height-2 == y ) continue; - st->walkers[i].y++; + if( y >= st->height - 2 * st->scale ) continue; + st->walkers[i].y += st->scale; break; /* default: abort(); */ @@ -229,7 +237,8 @@ coral_init (Display *dpy, Window window) st->dpy = dpy; st->window = window; st->max_points = 200; - st->pointbuf = (XPoint *) calloc(sizeof(XPoint), st->max_points+2); + st->pointbuf = + (XRectangle *) calloc(sizeof(*st->pointbuf), st->max_points+2); if (!st->pointbuf) exit(-1); st->delay = get_integer_resource (st->dpy, "delay", "Integer"); @@ -293,7 +302,7 @@ coral_free (Display *dpy, Window window, void *closure) } static const char *coral_defaults[] = { - ".lowrez: true", +/* ".lowrez: true", */ ".background: black", ".foreground: white", "*fpsSolid: true", diff --git a/hacks/coral.man b/hacks/coral.man index 09e742f3..f034cbe7 100644 --- a/hacks/coral.man +++ b/hacks/coral.man @@ -14,7 +14,7 @@ coral \- simulates coral growth, albeit somewhat slowly. [\-\-seeds \fInumber\fP] [\-\-fps] .SH DESCRIPTION -Simulates coral growth, albeit somewhat slowly. +Simulates coral growth. .SH OPTIONS .TP 8 .B \-\-visual \fIvisual\fP diff --git a/hacks/cynosure.c b/hacks/cynosure.c index 3eaa397c..80b31468 100644 --- a/hacks/cynosure.c +++ b/hacks/cynosure.c @@ -98,6 +98,7 @@ cynosure_init (Display *d, Window w) { struct state *st = (struct state *) calloc (1, sizeof(*st)); XGCValues gcv; + int lw = 1; st->dpy = d; st->window = w; @@ -113,6 +114,12 @@ cynosure_init (Display *d, Window w) XGetWindowAttributes (st->dpy, st->window, &st->xgwa); + if (st->xgwa.width > 2560 || st->xgwa.height > 2560) { /* Retina displays */ + st->shadowWidth *= 2; + st->elevation *= 2; + lw *= 2; + } + st->ncolors = get_integer_resource (st->dpy, "colors", "Colors"); if (st->ncolors < 2) st->ncolors = 2; if (st->ncolors <= 2) mono_p = True; @@ -141,10 +148,11 @@ cynosure_init (Display *d, Window w) st->fg_pixel = get_pixel_resource(st->dpy, st->xgwa.colormap, "foreground", "Foreground"); + gcv.line_width = lw; gcv.foreground = st->fg_pixel; - st->fg_gc = XCreateGC(st->dpy, st->window, GCForeground, &gcv); + st->fg_gc = XCreateGC(st->dpy, st->window, GCForeground|GCLineWidth, &gcv); gcv.foreground = st->bg_pixel; - st->bg_gc = XCreateGC(st->dpy, st->window, GCForeground, &gcv); + st->bg_gc = XCreateGC(st->dpy, st->window, GCForeground|GCLineWidth, &gcv); #ifdef DO_STIPPLE gcv.fill_style = FillStippled; @@ -421,7 +429,7 @@ cynosure_free (Display *dpy, Window window, void *closure) static const char *cynosure_defaults [] = { ".background: black", ".foreground: white", - ".lowrez: true", +/* ".lowrez: true", */ "*fpsSolid: true", "*delay: 500000", "*colors: 128", diff --git a/hacks/decayscreen.c b/hacks/decayscreen.c index 6b2a4cbe..28b08208 100644 --- a/hacks/decayscreen.c +++ b/hacks/decayscreen.c @@ -133,13 +133,10 @@ decayscreen_init (Display *dpy, Window window) XGetWindowAttributes (st->dpy, st->window, &st->xgwa); gcv.function = GXcopy; - gcv.subwindow_mode = IncludeInferiors; bg = get_pixel_resource (st->dpy, st->xgwa.colormap, "background", "Background"); gcv.foreground = bg; gcflags = GCForeground | GCFunction; - if (use_subwindow_mode_p(st->xgwa.screen, st->window)) /* see grabscreen.c */ - gcflags |= GCSubwindowMode; st->gc = XCreateGC (st->dpy, st->window, gcflags, &gcv); st->start_time = time ((time_t *) 0); @@ -174,7 +171,7 @@ decayscreen_draw (Display *dpy, Window window, void *closure) static const int downright_bias[] = { L,L,L,R, R,R,R,R, U,U,U,D, D,D,D,D }; int off = 1; - if (st->sizex > 2560) off *= 2; /* Retina displays */ + if (st->sizex > 2560 || st->sizey > 2560) off *= 2; /* Retina displays */ if (st->img_loader) /* still loading */ { @@ -373,11 +370,6 @@ static const char *decayscreen_defaults [] = { ".foreground: Yellow", "*dontClearRoot: True", "*fpsSolid: True", - -#ifdef __sgi /* really, HAVE_READ_DISPLAY_EXTENSION */ - "*visualID: Best", -#endif - "*delay: 10000", "*mode: random", "*duration: 120", diff --git a/hacks/deco.c b/hacks/deco.c index cebed2c9..31b7c71b 100644 --- a/hacks/deco.c +++ b/hacks/deco.c @@ -213,6 +213,9 @@ deco_init (Display *dpy, Window window) XGetWindowAttributes (dpy, window, &st->xgwa); + if (st->xgwa.width > 2560 || st->xgwa.height > 2560) + st->line_width *= 3; /* Retina displays */ + st->ncolors = get_integer_resource (dpy, "ncolors", "Integer"); gcv.foreground = get_pixel_resource(dpy, st->xgwa.colormap, @@ -306,7 +309,7 @@ deco_free (Display *dpy, Window window, void *closure) static const char *deco_defaults [] = { ".background: black", ".foreground: white", - ".lowrez: true", +/* ".lowrez: true", */ "*maxDepth: 12", "*minWidth: 20", "*minHeight: 20", diff --git a/hacks/deluxe.c b/hacks/deluxe.c index 3116f6bf..acd04927 100644 --- a/hacks/deluxe.c +++ b/hacks/deluxe.c @@ -167,7 +167,8 @@ make_throbber (struct state *st, Drawable d, int w, int h, unsigned long pixel) t->fuse = 1 + (random() % 4); t->thickness = get_integer_resource (st->dpy, "thickness", "Thickness"); - if (st->xgwa.width > 2560) t->thickness *= 3; /* Retina displays */ + if (st->xgwa.width > 2560 || st->xgwa.height > 2560) + t->thickness *= 3; /* Retina displays */ if (t->speed < 0) t->speed = -t->speed; t->speed += (((random() % t->speed) / 2) - (t->speed / 2)); diff --git a/hacks/discrete.c b/hacks/discrete.c index bfb4459a..2831da56 100644 --- a/hacks/discrete.c +++ b/hacks/discrete.c @@ -39,7 +39,8 @@ static const char sccsid[] = "@(#)discrete.c 5.00 2000/11/01 xlockmore"; "*ncolors: 100 \n" \ "*fpsSolid: true \n" \ "*ignoreRotation: True \n" \ - "*lowrez: True \n" \ + +/* "*lowrez: True \n" \ */ # define SMOOTH_COLORS # define release_discrete 0 diff --git a/hacks/distort.c b/hacks/distort.c index a3586cfa..fd605f69 100644 --- a/hacks/distort.c +++ b/hacks/distort.c @@ -126,8 +126,6 @@ distort_reset (struct state *st) st->reflect = get_boolean_resource(st->dpy, "reflect", "Boolean"); st->slow = get_boolean_resource(st->dpy, "slow", "Boolean"); - if (st->xgwa.width > 2560) st->radius *= 3; /* Retina displays */ - if (st->delay < 0) st->delay = 0; if (st->duration < 1) st->duration = 1; @@ -232,11 +230,8 @@ distort_reset (struct state *st) } } - /* never allow the radius to be too close to the min window dimension - */ - if (st->radius > st->xgwa.width * 0.3) st->radius = st->xgwa.width * 0.3; - if (st->radius > st->xgwa.height * 0.3) st->radius = st->xgwa.height * 0.3; - + if (st->xgwa.width > 2560 || st->xgwa.height > 2560) + st->radius *= 2; /* Retina displays */ /* -swamp mode consumes vast amounts of memory, proportional to radius -- so throttle radius to a small-ish value (60 => ~30MB.) @@ -244,6 +239,14 @@ distort_reset (struct state *st) if (st->effect == &swamp_thing && st->radius > 60) st->radius = 60; + /* never allow the radius to be too close to the min window dimension + */ + { + int max = (st->xgwa.width > st->xgwa.height + ? st->xgwa.width : st->xgwa.height) / (2 * st->number); + if (st->radius > max) st->radius = max; + } + if (st->delay < 0) st->delay = 0; if (st->radius <= 0) @@ -279,10 +282,7 @@ distort_init (Display *dpy, Window window) st->black_pixel = BlackPixelOfScreen( st->xgwa.screen ); gcv.function = GXcopy; - gcv.subwindow_mode = IncludeInferiors; gcflags = GCFunction; - if (use_subwindow_mode_p(st->xgwa.screen, st->window)) /* see grabscreen.c */ - gcflags |= GCSubwindowMode; st->gc = XCreateGC (st->dpy, st->window, gcflags, &gcv); /* On MacOS X11, XGetImage on a Window often gets an inexplicable BadMatch, @@ -843,13 +843,9 @@ distort_free (Display *dpy, Window window, void *closure) static const char *distort_defaults [] = { - "*dontClearRoot: True", - "*background: Black", - "*fpsSolid: true", -#ifdef __sgi /* really, HAVE_READ_DISPLAY_EXTENSION */ - "*visualID: Best", -#endif - + "*dontClearRoot: True", + "*background: Black", + "*fpsSolid: true", "*delay: 20000", "*duration: 120", "*radius: 0", diff --git a/hacks/epicycle.c b/hacks/epicycle.c index a8a257cc..146c4e1b 100644 --- a/hacks/epicycle.c +++ b/hacks/epicycle.c @@ -444,6 +444,10 @@ colour_init(struct state *st, XWindowAttributes *pxgwa) /* Set the line width */ gcv.line_width = get_integer_resource (st->dpy, "lineWidth", "Integer"); + if (gcv.line_width < 1) gcv.line_width = 1; + if (st->width > 2560 || st->height > 2560) + gcv.line_width *= 3; /* Retina displays */ + if (gcv.line_width) { valuemask |= GCLineWidth; diff --git a/hacks/eruption.c b/hacks/eruption.c index a4cfc254..17e4a8b5 100644 --- a/hacks/eruption.c +++ b/hacks/eruption.c @@ -580,7 +580,7 @@ static const char *eruption_defaults [] = { "*cooloff: 2", "*gravity: 1", "*heat: 256", - ".lowrez: true", /* Too slow on Retina screens otherwise */ + ".lowrez: true", /* Too slow on macOS Retina screens otherwise */ "*useSHM: True", 0 }; diff --git a/hacks/euler2d.c b/hacks/euler2d.c index d42a2bbf..2bc30ea4 100644 --- a/hacks/euler2d.c +++ b/hacks/euler2d.c @@ -557,6 +557,11 @@ init_euler2d (ModeInfo * mi) } } + if (sp->width > 2560 || sp->height > 2560) /* Retina displays */ + XSetLineAttributes (MI_DISPLAY(mi), MI_GC(mi), + 3, LineSolid, CapRound, JoinRound); + + sp->N = MI_COUNT(mi)+number_of_vortex_points; sp->Nvortex = number_of_vortex_points; diff --git a/hacks/fadeplot.c b/hacks/fadeplot.c index 93f47196..3d46f017 100644 --- a/hacks/fadeplot.c +++ b/hacks/fadeplot.c @@ -70,7 +70,8 @@ typedef struct { int pix; int angles; int *stab; - XPoint *pts; + XRectangle *pts; + int scale; } fadeplotstruct; static fadeplotstruct *fadeplots = (fadeplotstruct *) NULL; @@ -81,7 +82,7 @@ free_fadeplot(ModeInfo * mi) fadeplotstruct *fp = &fadeplots[MI_SCREEN(mi)]; if (fp->pts != NULL) { (void) free((void *) fp->pts); - fp->pts = (XPoint *) NULL; + fp->pts = (XRectangle *) NULL; } if (fp->stab != NULL) { (void) free((void *) fp->stab); @@ -128,18 +129,25 @@ init_fadeplot (ModeInfo * mi) fp->factor.x = MAX(fp->width / (2 * fp->min), 1); fp->factor.y = MAX(fp->height / (2 * fp->min), 1); + fp->scale = 1; + if (MI_WIDTH(mi) > 2560 || MI_HEIGHT(mi) > 2560) { /* Retina displays */ + fp->scale *= 3; + fp->step.x *= fp->scale; + fp->step.y *= fp->scale; + } + fp->nbstep = MI_COUNT(mi); if (fp->nbstep < -MINSTEPS) { fp->nbstep = NRAND(-fp->nbstep - MINSTEPS + 1) + MINSTEPS; } else if (fp->nbstep < MINSTEPS) fp->nbstep = MINSTEPS; - fp->maxpts = MI_CYCLES(mi); + fp->maxpts = MI_CYCLES(mi) / fp->scale; if (fp->maxpts < 1) fp->maxpts = 1; if (fp->pts == NULL) { - if ((fp->pts = (XPoint *) calloc(fp->maxpts, sizeof (XPoint))) == + if ((fp->pts = (XRectangle *) calloc(fp->maxpts, sizeof (*fp->pts))) == NULL) { free_fadeplot(mi); return; @@ -172,7 +180,7 @@ draw_fadeplot (ModeInfo * mi) MI_IS_DRAWN(mi) = True; XSetForeground(display, gc, MI_BLACK_PIXEL(mi)); - XDrawPoints(display, window, gc, fp->pts, fp->maxpts, CoordModeOrigin); + XFillRectangles(display, window, gc, fp->pts, fp->maxpts); if (MI_NPIXELS(mi) > 2) { XSetForeground(display, gc, MI_PIXEL(mi, fp->pix)); @@ -190,10 +198,11 @@ draw_fadeplot (ModeInfo * mi) fp->pts[temp].y = fp->stab[(fp->st.y + fp->speed.y * j + i * fp->step.y) % fp->angles] * fp->factor.y + fp->height / 2 - fp->min; + fp->pts[temp].width = fp->pts[temp].height = fp->scale; temp++; } } - XDrawPoints(display, window, gc, fp->pts, temp, CoordModeOrigin); + XFillRectangles (display, window, gc, fp->pts, temp); fp->st.x = (fp->st.x + fp->speed.x) % fp->angles; fp->st.y = (fp->st.y + fp->speed.y) % fp->angles; fp->temps++; diff --git a/hacks/fiberlamp.c b/hacks/fiberlamp.c index 580851ac..f2cfeecb 100644 --- a/hacks/fiberlamp.c +++ b/hacks/fiberlamp.c @@ -237,9 +237,14 @@ init_fiberlamp(ModeInfo * mi) /* no "NoExpose" events from XCopyArea wanted */ XSetGraphicsExposures(MI_DISPLAY(mi), MI_GC(mi), False); - /* Make sure we're using 'thin' lines */ - XSetLineAttributes(MI_DISPLAY(mi), MI_GC(mi), 0, LineSolid, CapNotLast, - JoinMiter); + { + int lw = 1; + if (MI_WIDTH(mi) > 2560 || MI_HEIGHT(mi) > 2560) + lw = 3; /* Retina displays */ + XSetLineAttributes (MI_DISPLAY(mi), MI_GC(mi), + lw, LineSolid, CapNotLast, JoinMiter); + } + #ifdef CHECKCOLORWHEEL /* Only interested in tips, leave the rest black */ fl->bright = fl->medium = fl->dim = MI_BLACK_PIXEL(mi); diff --git a/hacks/fireworkx.c b/hacks/fireworkx.c index 12d98647..c0794b1c 100644 --- a/hacks/fireworkx.c +++ b/hacks/fireworkx.c @@ -862,7 +862,7 @@ static const char *fireworkx_defaults [] = "*flash: True", "*shoot: False", "*verbose: False", - ".lowrez: true", /* Too slow on Retina screens otherwise */ + ".lowrez: true", /* Too slow on macOS Retina screens otherwise */ 0 }; diff --git a/hacks/flame.c b/hacks/flame.c index f7e9833e..e79079b4 100644 --- a/hacks/flame.c +++ b/hacks/flame.c @@ -74,7 +74,7 @@ struct state { int pixcol; int ncolors; XColor *colors; - XPoint points [POINT_BUFFER_SIZE]; + XRectangle points [POINT_BUFFER_SIZE]; GC gc; int delay, delay2; @@ -84,6 +84,7 @@ struct state { int flame_alt; int do_reset; + int scale; }; @@ -132,6 +133,10 @@ flame_init (Display *dpy, Window window) st->max_points = get_integer_resource (st->dpy, "iterations", "Integer"); if (st->max_points <= 0) st->max_points = 100; + st->scale = 1; + if (st->width > 2560 || st->height > 2560) + st->scale *= 2; /* Retina displays */ + st->max_levels = st->max_points; st->max_total = get_integer_resource (st->dpy, "points", "Integer"); @@ -187,10 +192,13 @@ recurse (struct state *st, double x, double y, int l, Display *dpy, Window win) { st->points[st->num_points].x = (int) ((st->width / 2) * (x + 1.0)); st->points[st->num_points].y = (int) ((st->height / 2) * (y + 1.0)); + st->points[st->num_points].width = + st->points[st->num_points].height = st->scale; st->num_points++; if (st->num_points >= POINT_BUFFER_SIZE) { - XDrawPoints (st->dpy, win, st->gc, st->points, st->num_points, CoordModeOrigin); + XFillRectangles (st->dpy, win, st->gc, st->points, + st->num_points); st->num_points = 0; } } @@ -384,7 +392,7 @@ flame_draw (Display *dpy, Window window, void *closure) st->num_points = 0; st->total_points = 0; recurse (st, 0.0, 0.0, 0, st->dpy, st->window); - XDrawPoints (st->dpy, st->window, st->gc, st->points, st->num_points, CoordModeOrigin); + XFillRectangles (st->dpy, st->window, st->gc, st->points, st->num_points); return this_delay; } diff --git a/hacks/flow.c b/hacks/flow.c index 6dddd8e0..5267ceb9 100644 --- a/hacks/flow.c +++ b/hacks/flow.c @@ -792,9 +792,13 @@ init_flow (ModeInfo * mi) /* no "NoExpose" events from XCopyArea wanted */ XSetGraphicsExposures(MI_DISPLAY(mi), MI_GC(mi), False); - /* Make sure we're using 'thin' lines */ - XSetLineAttributes(MI_DISPLAY(mi), MI_GC(mi), 0, LineSolid, CapNotLast, - JoinMiter); + { + int lw = 1; + if (MI_WIDTH(mi) > 2560 || MI_HEIGHT(mi) > 2560) + lw = 3; /* Retina displays */ + XSetLineAttributes (MI_DISPLAY(mi), MI_GC(mi), + lw, LineSolid, CapNotLast, JoinMiter); + } /* Clear the background (may be slow depending on user prefs). */ MI_CLEARWINDOW(mi); diff --git a/hacks/fluidballs.c b/hacks/fluidballs.c index 12de9ff8..e0f24f12 100644 --- a/hacks/fluidballs.c +++ b/hacks/fluidballs.c @@ -298,7 +298,8 @@ fluidballs_init (Display *dpy, Window window) state->max_radius = get_float_resource (dpy, "size", "Size") / 2; if (state->max_radius < 1.0) state->max_radius = 1.0; - if (state->xgwa.width > 2560) state->max_radius *= 2; /* Retina displays */ + if (state->xgwa.width > 2560 || state->xgwa.height > 2560) + state->max_radius *= 3; /* Retina displays */ if (state->xgwa.width < 100 || state->xgwa.height < 100) /* tiny window */ { diff --git a/hacks/fonts/Makefile.in b/hacks/fonts/Makefile.in index 193ecec0..96a97215 100644 --- a/hacks/fonts/Makefile.in +++ b/hacks/fonts/Makefile.in @@ -1,4 +1,4 @@ -# hacks/fonts/Makefile.in --- xscreensaver, Copyright © 2021 Jamie Zawinski. +# hacks/fonts/Makefile.in --- xscreensaver, Copyright © 2021-2022 Jamie Zawinski. # the `../configure' script generates `hacks/fonts/Makefile' from this file. @SET_MAKE@ @@ -69,8 +69,8 @@ install-fonts: $(INSTALL_DIRS) "$$dest" ; \ fi ; \ for f in $(FONTS) ; do \ - echo $(INSTALL_DATA) $$f $$dest/$$f ; \ - $(INSTALL_DATA) $$f $$dest/$$f ; \ + echo $(INSTALL_DATA) $(srcdir)/$$f $$dest/$$f ; \ + $(INSTALL_DATA) $(srcdir)/$$f $$dest/$$f ; \ done ; \ fi diff --git a/hacks/fuzzyflakes.c b/hacks/fuzzyflakes.c index db6524c4..d9b0af8d 100644 --- a/hacks/fuzzyflakes.c +++ b/hacks/fuzzyflakes.c @@ -349,7 +349,7 @@ FuzzyFlakesInit(Flake *flake) if (flake->RandomColors == True) flake->RandomColors = get_boolean_resource(flake->dpy, "randomColors", "Boolean"); - if (xgwa.width > 2560) { /* Retina displays */ + if (xgwa.width > 2560 || xgwa.height > 2560) { /* Retina displays */ flake->Thickness *= 2; flake->BorderThickness *= 2; flake->Radius *= 2; diff --git a/hacks/galaxy.c b/hacks/galaxy.c index 3a6e1f78..7beed16e 100644 --- a/hacks/galaxy.c +++ b/hacks/galaxy.c @@ -46,7 +46,8 @@ static const char sccsid[] = "@(#)galaxy.c 4.04 97/07/28 xlockmore"; "*ncolors: 64 \n" \ "*fpsSolid: true \n" \ "*ignoreRotation: True \n" \ - "*lowrez: True \n" \ + +/* "*lowrez: True \n" \ */ # define UNIFORM_COLORS # define release_galaxy 0 @@ -136,8 +137,8 @@ typedef struct { int mass; int nstars; Star *stars; - XPoint *oldpoints; - XPoint *newpoints; + XRectangle *oldpoints; + XRectangle *newpoints; double pos[3], vel[3]; int galcol; } Galaxy; @@ -153,6 +154,7 @@ typedef struct { int ngalaxies; /* # galaxies */ int f_hititerations; /* # iterations before restart */ int step; /* */ + int pscale; double rot_y; /* rotation of eye around center of universe, around y-axis*/ double rot_x; /* rotation of eye around center of universe, around @@ -221,8 +223,8 @@ startover(ModeInfo * mi) } gt->nstars = (NRAND(MAX_STARS / 2)) + MAX_STARS / 2; gt->stars = (Star *) malloc(gt->nstars * sizeof (Star)); - gt->oldpoints = (XPoint *) malloc(gt->nstars * sizeof (XPoint)); - gt->newpoints = (XPoint *) malloc(gt->nstars * sizeof (XPoint)); + gt->oldpoints = (XRectangle *) malloc(gt->nstars * sizeof (*gt->oldpoints)); + gt->newpoints = (XRectangle *) malloc(gt->nstars * sizeof (*gt->newpoints)); w1 = 2.0 * M_PI * FLOATRAND; w2 = 2.0 * M_PI * FLOATRAND; @@ -257,8 +259,8 @@ startover(ModeInfo * mi) for (j = 0; j < gt->nstars; ++j) { Star *st = >->stars[j]; - XPoint *oldp = >->oldpoints[j]; - XPoint *newp = >->newpoints[j]; + XRectangle *oldp = >->oldpoints[j]; + XRectangle *newp = >->newpoints[j]; double sinw, cosw; @@ -290,8 +292,10 @@ gt->vel[2]; oldp->x = 0; oldp->y = 0; + oldp->width = oldp->height = gp->pscale; newp->x = 0; newp->y = 0; + newp->width = newp->height = gp->pscale; } } @@ -323,6 +327,14 @@ init_galaxy(ModeInfo * mi) gp->scale = (double) (MI_WIN_WIDTH(mi) + MI_WIN_HEIGHT(mi)) / 8.0; gp->midx = MI_WIN_WIDTH(mi) / 2; gp->midy = MI_WIN_HEIGHT(mi) / 2; + + gp->pscale = 1; + if (MI_WIDTH(mi) > 2560 || MI_HEIGHT(mi) > 2560) /* Retina displays */ + { + gp->pscale *= 2; + gp->scale /= gp->pscale; + } + startover(mi); } @@ -335,7 +347,7 @@ draw_galaxy(ModeInfo * mi) unistruct *gp = &universes[MI_SCREEN(mi)]; double d, eps, cox, six, cor, sir; /* tmp */ int i, j, k; /* more tmp */ - XPoint *dummy = NULL; + XRectangle *dummy = NULL; if (! dbufp) XClearWindow(MI_DISPLAY(mi), MI_WINDOW(mi)); @@ -357,7 +369,7 @@ draw_galaxy(ModeInfo * mi) for (j = 0; j < gp->galaxies[i].nstars; ++j) { Star *st = >->stars[j]; - XPoint *newp = >->newpoints[j]; + XRectangle *newp = >->newpoints[j]; double v0 = st->vel[0]; double v1 = st->vel[1]; double v2 = st->vel[2]; @@ -387,11 +399,11 @@ draw_galaxy(ModeInfo * mi) st->pos[2] += v2; newp->x = (short) (((cox * st->pos[0]) - (six * st->pos[2])) * - gp->scale) + gp->midx; + gp->scale * gp->pscale) + gp->midx; newp->y = (short) (((cor * st->pos[1]) - (sir * ((six * st->pos[0]) + (cox * st->pos[2])))) - * gp->scale) + gp->midy; - + * gp->scale * gp->pscale) + gp->midy; + newp->width = newp->height = gp->pscale; } for (k = i + 1; k < gp->ngalaxies; ++k) { @@ -423,12 +435,10 @@ draw_galaxy(ModeInfo * mi) if (dbufp) { XSetForeground(display, gc, MI_WIN_BLACK_PIXEL(mi)); - XDrawPoints(display, window, gc, gt->oldpoints, gt->nstars, - CoordModeOrigin); + XFillRectangles(display, window, gc, gt->oldpoints, gt->nstars); } XSetForeground(display, gc, MI_PIXEL(mi, COLORSTEP * gt->galcol)); - XDrawPoints(display, window, gc, gt->newpoints, gt->nstars, - CoordModeOrigin); + XFillRectangles (display, window, gc, gt->newpoints, gt->nstars); dummy = gt->oldpoints; gt->oldpoints = gt->newpoints; diff --git a/hacks/glitchpeg.c b/hacks/glitchpeg.c index 7b4c5b01..d2705699 100644 --- a/hacks/glitchpeg.c +++ b/hacks/glitchpeg.c @@ -445,7 +445,7 @@ static const char *glitchpeg_defaults [] = { "*fpsSolid: true", "*delay: 30000", "*duration: 120", - "*count: 100", + "*count: 400", "*grabDesktopImages: False", /* HAVE_JWXYZ */ "*chooseRandomImages: True", /* HAVE_JWXYZ */ #ifdef HAVE_MOBILE diff --git a/hacks/glitchpeg.man b/hacks/glitchpeg.man index baca0e2d..a21b26a2 100644 --- a/hacks/glitchpeg.man +++ b/hacks/glitchpeg.man @@ -41,7 +41,7 @@ Per-frame delay, in microseconds. Default: 30000 (0.03 seconds). How many seconds before loading a new image. Default: 120. .TP 8 .B \-\-count \fInumber\fP -Number of glitches to introduce per iteration. Default: 100. +Number of glitches to introduce per iteration. Default: 400. .SH ENVIRONMENT .PP .TP 8 diff --git a/hacks/glx/Makefile.in b/hacks/glx/Makefile.in index 1ffc3345..6f8ea7f8 100644 --- a/hacks/glx/Makefile.in +++ b/hacks/glx/Makefile.in @@ -145,7 +145,7 @@ SRCS = xscreensaver-gl-visual.c normals.c erase-gl.c fps-gl.c \ sphereeversion.c sphereeversion-analytic.c \ sphereeversion-corrugations.c \ mapscroller.c squirtorus.c nakagin.c chompytower.c \ - teeth_model.c + teeth_model.c hextrail.c SCRIPTS = mapscroller.pl @@ -200,7 +200,7 @@ OBJS = xscreensaver-gl-visual.o normals.o erase-gl.o fps-gl.o \ sphereeversion.c sphereeversion-analytic.c \ sphereeversion-corrugations.c \ mapscroller.o squirtorus.o nakagin.o chompytower.o \ - teeth_model.o + teeth_model.o hextrail.o GL_EXES = cage gears moebius pipes sproingies stairs superquadrics \ morph3d rubik atlantis lament bubble3d glplanet pulsar \ @@ -223,7 +223,7 @@ GL_EXES = cage gears moebius pipes sproingies stairs superquadrics \ hexstrut vigilance esper razzledazzle peepers crumbler \ maze3d handsy gravitywell deepstars gibson etruscanvenus \ sphereeversion covid19 headroom beats mapscroller \ - squirtorus nakagin chompytower + squirtorus nakagin chompytower hextrail GLE_EXES = extrusion SUID_EXES = sonar SETCAP_EXES = sonar @@ -302,7 +302,8 @@ GL_MEN = xscreensaver-gl-visual.man \ peepers.man crumbler.man maze3d.man handsy.man \ gravitywell.man deepstars.man gibson.man etruscanvenus.man \ sphereeversion.man covid19.man headroom.man beats.man \ - mapscroller.man squirtorus.man nakagin.man chompytower.man + mapscroller.man squirtorus.man nakagin.man chompytower.man \ + hextrail.man MEN = @GL_MEN@ RETIRED_MEN = glforestfire.man EXTRAS = README Makefile.in dxf2gl.pl vrml2gl.pl wfront2gl.pl \ @@ -1124,6 +1125,10 @@ chompytower: chompytower.o $(CHOBJS) $(HACK_TRACK_OBJS) teeth_dxf:: ./dxf2gl.pl --layers --smooth --normalize teeth.dxf teeth_model.c +hextrail: hextrail.o normals.o $(HACK_TRACK_OBJS) + $(CC_HACK) -o $@ $@.o normals.o $(HACK_TRACK_OBJS) $(HACK_LIBS) + + ############################################################################## # # DO NOT DELETE: updated by make distdepend @@ -1137,7 +1142,7 @@ antinspect.o: $(srcdir)/sphere.h antinspect.o: $(UTILS_SRC)/colors.h antinspect.o: $(UTILS_SRC)/erase.h antinspect.o: $(UTILS_SRC)/font-retry.h -antinspect.o: $(UTILS_SRC)/grabscreen.h +antinspect.o: $(UTILS_SRC)/grabclient.h antinspect.o: $(UTILS_SRC)/hsv.h antinspect.o: $(UTILS_SRC)/resources.h antinspect.o: $(UTILS_SRC)/usleep.h @@ -1158,7 +1163,7 @@ antmaze.o: $(srcdir)/tube.h antmaze.o: $(UTILS_SRC)/colors.h antmaze.o: $(UTILS_SRC)/erase.h antmaze.o: $(UTILS_SRC)/font-retry.h -antmaze.o: $(UTILS_SRC)/grabscreen.h +antmaze.o: $(UTILS_SRC)/grabclient.h antmaze.o: $(UTILS_SRC)/hsv.h antmaze.o: $(UTILS_SRC)/resources.h antmaze.o: $(UTILS_SRC)/usleep.h @@ -1180,7 +1185,7 @@ antspotlight.o: $(srcdir)/tube.h antspotlight.o: $(UTILS_SRC)/colors.h antspotlight.o: $(UTILS_SRC)/erase.h antspotlight.o: $(UTILS_SRC)/font-retry.h -antspotlight.o: $(UTILS_SRC)/grabscreen.h +antspotlight.o: $(UTILS_SRC)/grabclient.h antspotlight.o: $(UTILS_SRC)/hsv.h antspotlight.o: $(UTILS_SRC)/resources.h antspotlight.o: $(UTILS_SRC)/usleep.h @@ -1198,7 +1203,7 @@ atlantis.o: $(HACK_SRC)/screenhackI.h atlantis.o: $(UTILS_SRC)/colors.h atlantis.o: $(UTILS_SRC)/erase.h atlantis.o: $(UTILS_SRC)/font-retry.h -atlantis.o: $(UTILS_SRC)/grabscreen.h +atlantis.o: $(UTILS_SRC)/grabclient.h atlantis.o: $(UTILS_SRC)/hsv.h atlantis.o: $(UTILS_SRC)/resources.h atlantis.o: $(UTILS_SRC)/usleep.h @@ -1222,7 +1227,7 @@ atunnel.o: $(srcdir)/tunnel_draw.h atunnel.o: $(UTILS_SRC)/colors.h atunnel.o: $(UTILS_SRC)/erase.h atunnel.o: $(UTILS_SRC)/font-retry.h -atunnel.o: $(UTILS_SRC)/grabscreen.h +atunnel.o: $(UTILS_SRC)/grabclient.h atunnel.o: $(UTILS_SRC)/hsv.h atunnel.o: $(UTILS_SRC)/resources.h atunnel.o: $(UTILS_SRC)/usleep.h @@ -1239,7 +1244,7 @@ b_draw.o: $(HACK_SRC)/recanim.h b_draw.o: $(HACK_SRC)/screenhackI.h b_draw.o: $(UTILS_SRC)/colors.h b_draw.o: $(UTILS_SRC)/font-retry.h -b_draw.o: $(UTILS_SRC)/grabscreen.h +b_draw.o: $(UTILS_SRC)/grabclient.h b_draw.o: $(UTILS_SRC)/hsv.h b_draw.o: $(UTILS_SRC)/resources.h b_draw.o: $(UTILS_SRC)/usleep.h @@ -1254,7 +1259,7 @@ beats.o: $(srcdir)/sphere.h beats.o: $(UTILS_SRC)/colors.h beats.o: $(UTILS_SRC)/erase.h beats.o: $(UTILS_SRC)/font-retry.h -beats.o: $(UTILS_SRC)/grabscreen.h +beats.o: $(UTILS_SRC)/grabclient.h beats.o: $(UTILS_SRC)/hsv.h beats.o: $(UTILS_SRC)/resources.h beats.o: $(UTILS_SRC)/usleep.h @@ -1271,7 +1276,7 @@ blinkbox.o: $(srcdir)/sphere.h blinkbox.o: $(UTILS_SRC)/colors.h blinkbox.o: $(UTILS_SRC)/erase.h blinkbox.o: $(UTILS_SRC)/font-retry.h -blinkbox.o: $(UTILS_SRC)/grabscreen.h +blinkbox.o: $(UTILS_SRC)/grabclient.h blinkbox.o: $(UTILS_SRC)/hsv.h blinkbox.o: $(UTILS_SRC)/resources.h blinkbox.o: $(UTILS_SRC)/usleep.h @@ -1288,7 +1293,7 @@ b_lockglue.o: $(HACK_SRC)/screenhackI.h b_lockglue.o: $(UTILS_SRC)/colors.h b_lockglue.o: $(UTILS_SRC)/erase.h b_lockglue.o: $(UTILS_SRC)/font-retry.h -b_lockglue.o: $(UTILS_SRC)/grabscreen.h +b_lockglue.o: $(UTILS_SRC)/grabclient.h b_lockglue.o: $(UTILS_SRC)/hsv.h b_lockglue.o: $(UTILS_SRC)/resources.h b_lockglue.o: $(UTILS_SRC)/usleep.h @@ -1305,7 +1310,7 @@ blocktube.o: $(HACK_SRC)/screenhackI.h blocktube.o: $(UTILS_SRC)/colors.h blocktube.o: $(UTILS_SRC)/erase.h blocktube.o: $(UTILS_SRC)/font-retry.h -blocktube.o: $(UTILS_SRC)/grabscreen.h +blocktube.o: $(UTILS_SRC)/grabclient.h blocktube.o: $(UTILS_SRC)/hsv.h blocktube.o: $(UTILS_SRC)/resources.h blocktube.o: $(UTILS_SRC)/usleep.h @@ -1323,7 +1328,7 @@ boing.o: $(HACK_SRC)/screenhackI.h boing.o: $(UTILS_SRC)/colors.h boing.o: $(UTILS_SRC)/erase.h boing.o: $(UTILS_SRC)/font-retry.h -boing.o: $(UTILS_SRC)/grabscreen.h +boing.o: $(UTILS_SRC)/grabclient.h boing.o: $(UTILS_SRC)/hsv.h boing.o: $(UTILS_SRC)/resources.h boing.o: $(UTILS_SRC)/usleep.h @@ -1342,7 +1347,7 @@ bouncingcow.o: $(HACK_SRC)/screenhackI.h bouncingcow.o: $(UTILS_SRC)/colors.h bouncingcow.o: $(UTILS_SRC)/erase.h bouncingcow.o: $(UTILS_SRC)/font-retry.h -bouncingcow.o: $(UTILS_SRC)/grabscreen.h +bouncingcow.o: $(UTILS_SRC)/grabclient.h bouncingcow.o: $(UTILS_SRC)/hsv.h bouncingcow.o: $(UTILS_SRC)/resources.h bouncingcow.o: $(UTILS_SRC)/usleep.h @@ -1360,7 +1365,7 @@ boxed.o: $(HACK_SRC)/screenhackI.h boxed.o: $(UTILS_SRC)/colors.h boxed.o: $(UTILS_SRC)/erase.h boxed.o: $(UTILS_SRC)/font-retry.h -boxed.o: $(UTILS_SRC)/grabscreen.h +boxed.o: $(UTILS_SRC)/grabclient.h boxed.o: $(UTILS_SRC)/hsv.h boxed.o: $(UTILS_SRC)/resources.h boxed.o: $(UTILS_SRC)/usleep.h @@ -1376,7 +1381,7 @@ b_sphere.o: $(HACK_SRC)/recanim.h b_sphere.o: $(HACK_SRC)/screenhackI.h b_sphere.o: $(UTILS_SRC)/colors.h b_sphere.o: $(UTILS_SRC)/font-retry.h -b_sphere.o: $(UTILS_SRC)/grabscreen.h +b_sphere.o: $(UTILS_SRC)/grabclient.h b_sphere.o: $(UTILS_SRC)/hsv.h b_sphere.o: $(UTILS_SRC)/resources.h b_sphere.o: $(UTILS_SRC)/usleep.h @@ -1390,7 +1395,7 @@ bubble3d.o: $(HACK_SRC)/recanim.h bubble3d.o: $(HACK_SRC)/screenhackI.h bubble3d.o: $(UTILS_SRC)/colors.h bubble3d.o: $(UTILS_SRC)/font-retry.h -bubble3d.o: $(UTILS_SRC)/grabscreen.h +bubble3d.o: $(UTILS_SRC)/grabclient.h bubble3d.o: $(UTILS_SRC)/hsv.h bubble3d.o: $(UTILS_SRC)/resources.h bubble3d.o: $(UTILS_SRC)/usleep.h @@ -1404,7 +1409,7 @@ buildlwo.o: $(HACK_SRC)/recanim.h buildlwo.o: $(HACK_SRC)/screenhackI.h buildlwo.o: $(UTILS_SRC)/colors.h buildlwo.o: $(UTILS_SRC)/font-retry.h -buildlwo.o: $(UTILS_SRC)/grabscreen.h +buildlwo.o: $(UTILS_SRC)/grabclient.h buildlwo.o: $(UTILS_SRC)/hsv.h buildlwo.o: $(UTILS_SRC)/resources.h buildlwo.o: $(UTILS_SRC)/usleep.h @@ -1419,7 +1424,7 @@ cage.o: $(HACK_SRC)/screenhackI.h cage.o: $(UTILS_SRC)/colors.h cage.o: $(UTILS_SRC)/erase.h cage.o: $(UTILS_SRC)/font-retry.h -cage.o: $(UTILS_SRC)/grabscreen.h +cage.o: $(UTILS_SRC)/grabclient.h cage.o: $(UTILS_SRC)/hsv.h cage.o: $(UTILS_SRC)/resources.h cage.o: $(UTILS_SRC)/usleep.h @@ -1440,7 +1445,7 @@ carousel.o: $(srcdir)/texfont.h carousel.o: $(UTILS_SRC)/colors.h carousel.o: $(UTILS_SRC)/erase.h carousel.o: $(UTILS_SRC)/font-retry.h -carousel.o: $(UTILS_SRC)/grabscreen.h +carousel.o: $(UTILS_SRC)/grabclient.h carousel.o: $(UTILS_SRC)/hsv.h carousel.o: $(UTILS_SRC)/resources.h carousel.o: $(UTILS_SRC)/usleep.h @@ -1456,7 +1461,7 @@ chessmodels.o: $(HACK_SRC)/recanim.h chessmodels.o: $(HACK_SRC)/screenhackI.h chessmodels.o: $(UTILS_SRC)/colors.h chessmodels.o: $(UTILS_SRC)/font-retry.h -chessmodels.o: $(UTILS_SRC)/grabscreen.h +chessmodels.o: $(UTILS_SRC)/grabclient.h chessmodels.o: $(UTILS_SRC)/hsv.h chessmodels.o: $(UTILS_SRC)/resources.h chessmodels.o: $(UTILS_SRC)/usleep.h @@ -1475,7 +1480,7 @@ chompytower.o: $(srcdir)/sphere.h chompytower.o: $(UTILS_SRC)/colors.h chompytower.o: $(UTILS_SRC)/erase.h chompytower.o: $(UTILS_SRC)/font-retry.h -chompytower.o: $(UTILS_SRC)/grabscreen.h +chompytower.o: $(UTILS_SRC)/grabclient.h chompytower.o: $(UTILS_SRC)/hsv.h chompytower.o: $(UTILS_SRC)/resources.h chompytower.o: $(UTILS_SRC)/spline.h @@ -1493,7 +1498,7 @@ circuit.o: $(srcdir)/texfont.h circuit.o: $(UTILS_SRC)/colors.h circuit.o: $(UTILS_SRC)/erase.h circuit.o: $(UTILS_SRC)/font-retry.h -circuit.o: $(UTILS_SRC)/grabscreen.h +circuit.o: $(UTILS_SRC)/grabclient.h circuit.o: $(UTILS_SRC)/hsv.h circuit.o: $(UTILS_SRC)/resources.h circuit.o: $(UTILS_SRC)/usleep.h @@ -1510,7 +1515,7 @@ cityflow.o: $(HACK_SRC)/screenhackI.h cityflow.o: $(UTILS_SRC)/colors.h cityflow.o: $(UTILS_SRC)/erase.h cityflow.o: $(UTILS_SRC)/font-retry.h -cityflow.o: $(UTILS_SRC)/grabscreen.h +cityflow.o: $(UTILS_SRC)/grabclient.h cityflow.o: $(UTILS_SRC)/hsv.h cityflow.o: $(UTILS_SRC)/resources.h cityflow.o: $(UTILS_SRC)/usleep.h @@ -1530,7 +1535,7 @@ co____9.o: $(srcdir)/tube.h co____9.o: $(UTILS_SRC)/colors.h co____9.o: $(UTILS_SRC)/erase.h co____9.o: $(UTILS_SRC)/font-retry.h -co____9.o: $(UTILS_SRC)/grabscreen.h +co____9.o: $(UTILS_SRC)/grabclient.h co____9.o: $(UTILS_SRC)/hsv.h co____9.o: $(UTILS_SRC)/resources.h co____9.o: $(UTILS_SRC)/usleep.h @@ -1547,7 +1552,7 @@ companion_disc.o: $(HACK_SRC)/screenhackI.h companion_disc.o: $(UTILS_SRC)/colors.h companion_disc.o: $(UTILS_SRC)/erase.h companion_disc.o: $(UTILS_SRC)/font-retry.h -companion_disc.o: $(UTILS_SRC)/grabscreen.h +companion_disc.o: $(UTILS_SRC)/grabclient.h companion_disc.o: $(UTILS_SRC)/hsv.h companion_disc.o: $(UTILS_SRC)/resources.h companion_disc.o: $(UTILS_SRC)/usleep.h @@ -1563,7 +1568,7 @@ companion_heart.o: $(HACK_SRC)/screenhackI.h companion_heart.o: $(UTILS_SRC)/colors.h companion_heart.o: $(UTILS_SRC)/erase.h companion_heart.o: $(UTILS_SRC)/font-retry.h -companion_heart.o: $(UTILS_SRC)/grabscreen.h +companion_heart.o: $(UTILS_SRC)/grabclient.h companion_heart.o: $(UTILS_SRC)/hsv.h companion_heart.o: $(UTILS_SRC)/resources.h companion_heart.o: $(UTILS_SRC)/usleep.h @@ -1581,7 +1586,7 @@ companion.o: $(HACK_SRC)/screenhackI.h companion.o: $(UTILS_SRC)/colors.h companion.o: $(UTILS_SRC)/erase.h companion.o: $(UTILS_SRC)/font-retry.h -companion.o: $(UTILS_SRC)/grabscreen.h +companion.o: $(UTILS_SRC)/grabclient.h companion.o: $(UTILS_SRC)/hsv.h companion.o: $(UTILS_SRC)/resources.h companion.o: $(UTILS_SRC)/usleep.h @@ -1599,7 +1604,7 @@ companion_quad.o: $(HACK_SRC)/screenhackI.h companion_quad.o: $(UTILS_SRC)/colors.h companion_quad.o: $(UTILS_SRC)/erase.h companion_quad.o: $(UTILS_SRC)/font-retry.h -companion_quad.o: $(UTILS_SRC)/grabscreen.h +companion_quad.o: $(UTILS_SRC)/grabclient.h companion_quad.o: $(UTILS_SRC)/hsv.h companion_quad.o: $(UTILS_SRC)/resources.h companion_quad.o: $(UTILS_SRC)/usleep.h @@ -1618,7 +1623,7 @@ covid19.o: $(srcdir)/tube.h covid19.o: $(UTILS_SRC)/colors.h covid19.o: $(UTILS_SRC)/erase.h covid19.o: $(UTILS_SRC)/font-retry.h -covid19.o: $(UTILS_SRC)/grabscreen.h +covid19.o: $(UTILS_SRC)/grabclient.h covid19.o: $(UTILS_SRC)/hsv.h covid19.o: $(UTILS_SRC)/resources.h covid19.o: $(UTILS_SRC)/usleep.h @@ -1635,7 +1640,7 @@ cow_face.o: $(HACK_SRC)/screenhackI.h cow_face.o: $(UTILS_SRC)/colors.h cow_face.o: $(UTILS_SRC)/erase.h cow_face.o: $(UTILS_SRC)/font-retry.h -cow_face.o: $(UTILS_SRC)/grabscreen.h +cow_face.o: $(UTILS_SRC)/grabclient.h cow_face.o: $(UTILS_SRC)/hsv.h cow_face.o: $(UTILS_SRC)/resources.h cow_face.o: $(UTILS_SRC)/usleep.h @@ -1651,7 +1656,7 @@ cow_hide.o: $(HACK_SRC)/screenhackI.h cow_hide.o: $(UTILS_SRC)/colors.h cow_hide.o: $(UTILS_SRC)/erase.h cow_hide.o: $(UTILS_SRC)/font-retry.h -cow_hide.o: $(UTILS_SRC)/grabscreen.h +cow_hide.o: $(UTILS_SRC)/grabclient.h cow_hide.o: $(UTILS_SRC)/hsv.h cow_hide.o: $(UTILS_SRC)/resources.h cow_hide.o: $(UTILS_SRC)/usleep.h @@ -1667,7 +1672,7 @@ cow_hoofs.o: $(HACK_SRC)/screenhackI.h cow_hoofs.o: $(UTILS_SRC)/colors.h cow_hoofs.o: $(UTILS_SRC)/erase.h cow_hoofs.o: $(UTILS_SRC)/font-retry.h -cow_hoofs.o: $(UTILS_SRC)/grabscreen.h +cow_hoofs.o: $(UTILS_SRC)/grabclient.h cow_hoofs.o: $(UTILS_SRC)/hsv.h cow_hoofs.o: $(UTILS_SRC)/resources.h cow_hoofs.o: $(UTILS_SRC)/usleep.h @@ -1683,7 +1688,7 @@ cow_horns.o: $(HACK_SRC)/screenhackI.h cow_horns.o: $(UTILS_SRC)/colors.h cow_horns.o: $(UTILS_SRC)/erase.h cow_horns.o: $(UTILS_SRC)/font-retry.h -cow_horns.o: $(UTILS_SRC)/grabscreen.h +cow_horns.o: $(UTILS_SRC)/grabclient.h cow_horns.o: $(UTILS_SRC)/hsv.h cow_horns.o: $(UTILS_SRC)/resources.h cow_horns.o: $(UTILS_SRC)/usleep.h @@ -1699,7 +1704,7 @@ cow_tail.o: $(HACK_SRC)/screenhackI.h cow_tail.o: $(UTILS_SRC)/colors.h cow_tail.o: $(UTILS_SRC)/erase.h cow_tail.o: $(UTILS_SRC)/font-retry.h -cow_tail.o: $(UTILS_SRC)/grabscreen.h +cow_tail.o: $(UTILS_SRC)/grabclient.h cow_tail.o: $(UTILS_SRC)/hsv.h cow_tail.o: $(UTILS_SRC)/resources.h cow_tail.o: $(UTILS_SRC)/usleep.h @@ -1715,7 +1720,7 @@ cow_udder.o: $(HACK_SRC)/screenhackI.h cow_udder.o: $(UTILS_SRC)/colors.h cow_udder.o: $(UTILS_SRC)/erase.h cow_udder.o: $(UTILS_SRC)/font-retry.h -cow_udder.o: $(UTILS_SRC)/grabscreen.h +cow_udder.o: $(UTILS_SRC)/grabclient.h cow_udder.o: $(UTILS_SRC)/hsv.h cow_udder.o: $(UTILS_SRC)/resources.h cow_udder.o: $(UTILS_SRC)/usleep.h @@ -1730,7 +1735,7 @@ crackberg.o: $(HACK_SRC)/screenhackI.h crackberg.o: $(UTILS_SRC)/colors.h crackberg.o: $(UTILS_SRC)/erase.h crackberg.o: $(UTILS_SRC)/font-retry.h -crackberg.o: $(UTILS_SRC)/grabscreen.h +crackberg.o: $(UTILS_SRC)/grabclient.h crackberg.o: $(UTILS_SRC)/hsv.h crackberg.o: $(UTILS_SRC)/resources.h crackberg.o: $(UTILS_SRC)/usleep.h @@ -1749,7 +1754,7 @@ crumbler.o: $(HACK_SRC)/screenhackI.h crumbler.o: $(UTILS_SRC)/colors.h crumbler.o: $(UTILS_SRC)/erase.h crumbler.o: $(UTILS_SRC)/font-retry.h -crumbler.o: $(UTILS_SRC)/grabscreen.h +crumbler.o: $(UTILS_SRC)/grabclient.h crumbler.o: $(UTILS_SRC)/hsv.h crumbler.o: $(UTILS_SRC)/resources.h crumbler.o: $(UTILS_SRC)/usleep.h @@ -1766,7 +1771,7 @@ cube21.o: $(HACK_SRC)/screenhackI.h cube21.o: $(UTILS_SRC)/colors.h cube21.o: $(UTILS_SRC)/erase.h cube21.o: $(UTILS_SRC)/font-retry.h -cube21.o: $(UTILS_SRC)/grabscreen.h +cube21.o: $(UTILS_SRC)/grabclient.h cube21.o: $(UTILS_SRC)/hsv.h cube21.o: $(UTILS_SRC)/resources.h cube21.o: $(UTILS_SRC)/usleep.h @@ -1784,7 +1789,7 @@ cubenetic.o: $(HACK_SRC)/screenhackI.h cubenetic.o: $(UTILS_SRC)/colors.h cubenetic.o: $(UTILS_SRC)/erase.h cubenetic.o: $(UTILS_SRC)/font-retry.h -cubenetic.o: $(UTILS_SRC)/grabscreen.h +cubenetic.o: $(UTILS_SRC)/grabclient.h cubenetic.o: $(UTILS_SRC)/hsv.h cubenetic.o: $(UTILS_SRC)/resources.h cubenetic.o: $(UTILS_SRC)/usleep.h @@ -1802,7 +1807,7 @@ cubestack.o: $(HACK_SRC)/screenhackI.h cubestack.o: $(UTILS_SRC)/colors.h cubestack.o: $(UTILS_SRC)/erase.h cubestack.o: $(UTILS_SRC)/font-retry.h -cubestack.o: $(UTILS_SRC)/grabscreen.h +cubestack.o: $(UTILS_SRC)/grabclient.h cubestack.o: $(UTILS_SRC)/hsv.h cubestack.o: $(UTILS_SRC)/resources.h cubestack.o: $(UTILS_SRC)/usleep.h @@ -1820,7 +1825,7 @@ cubestorm.o: $(HACK_SRC)/screenhackI.h cubestorm.o: $(UTILS_SRC)/colors.h cubestorm.o: $(UTILS_SRC)/erase.h cubestorm.o: $(UTILS_SRC)/font-retry.h -cubestorm.o: $(UTILS_SRC)/grabscreen.h +cubestorm.o: $(UTILS_SRC)/grabclient.h cubestorm.o: $(UTILS_SRC)/hsv.h cubestorm.o: $(UTILS_SRC)/resources.h cubestorm.o: $(UTILS_SRC)/usleep.h @@ -1839,7 +1844,7 @@ cubetwist.o: $(HACK_SRC)/screenhackI.h cubetwist.o: $(UTILS_SRC)/colors.h cubetwist.o: $(UTILS_SRC)/erase.h cubetwist.o: $(UTILS_SRC)/font-retry.h -cubetwist.o: $(UTILS_SRC)/grabscreen.h +cubetwist.o: $(UTILS_SRC)/grabclient.h cubetwist.o: $(UTILS_SRC)/hsv.h cubetwist.o: $(UTILS_SRC)/resources.h cubetwist.o: $(UTILS_SRC)/usleep.h @@ -1857,7 +1862,7 @@ cubicgrid.o: $(HACK_SRC)/screenhackI.h cubicgrid.o: $(UTILS_SRC)/colors.h cubicgrid.o: $(UTILS_SRC)/erase.h cubicgrid.o: $(UTILS_SRC)/font-retry.h -cubicgrid.o: $(UTILS_SRC)/grabscreen.h +cubicgrid.o: $(UTILS_SRC)/grabclient.h cubicgrid.o: $(UTILS_SRC)/hsv.h cubicgrid.o: $(UTILS_SRC)/resources.h cubicgrid.o: $(UTILS_SRC)/usleep.h @@ -1877,7 +1882,7 @@ dangerball.o: $(srcdir)/tube.h dangerball.o: $(UTILS_SRC)/colors.h dangerball.o: $(UTILS_SRC)/erase.h dangerball.o: $(UTILS_SRC)/font-retry.h -dangerball.o: $(UTILS_SRC)/grabscreen.h +dangerball.o: $(UTILS_SRC)/grabclient.h dangerball.o: $(UTILS_SRC)/hsv.h dangerball.o: $(UTILS_SRC)/resources.h dangerball.o: $(UTILS_SRC)/usleep.h @@ -1895,7 +1900,7 @@ deepstars.o: $(srcdir)/sphere.h deepstars.o: $(UTILS_SRC)/colors.h deepstars.o: $(UTILS_SRC)/erase.h deepstars.o: $(UTILS_SRC)/font-retry.h -deepstars.o: $(UTILS_SRC)/grabscreen.h +deepstars.o: $(UTILS_SRC)/grabclient.h deepstars.o: $(UTILS_SRC)/hsv.h deepstars.o: $(UTILS_SRC)/resources.h deepstars.o: $(UTILS_SRC)/usleep.h @@ -1914,7 +1919,7 @@ discoball.o: $(HACK_SRC)/screenhackI.h discoball.o: $(UTILS_SRC)/colors.h discoball.o: $(UTILS_SRC)/erase.h discoball.o: $(UTILS_SRC)/font-retry.h -discoball.o: $(UTILS_SRC)/grabscreen.h +discoball.o: $(UTILS_SRC)/grabclient.h discoball.o: $(UTILS_SRC)/hsv.h discoball.o: $(UTILS_SRC)/resources.h discoball.o: $(UTILS_SRC)/usleep.h @@ -1936,7 +1941,7 @@ dnalogo.o: $(srcdir)/tube.h dnalogo.o: $(UTILS_SRC)/colors.h dnalogo.o: $(UTILS_SRC)/erase.h dnalogo.o: $(UTILS_SRC)/font-retry.h -dnalogo.o: $(UTILS_SRC)/grabscreen.h +dnalogo.o: $(UTILS_SRC)/grabclient.h dnalogo.o: $(UTILS_SRC)/hsv.h dnalogo.o: $(UTILS_SRC)/resources.h dnalogo.o: $(UTILS_SRC)/usleep.h @@ -1954,7 +1959,7 @@ dolphin.o: $(HACK_SRC)/screenhackI.h dolphin.o: $(UTILS_SRC)/colors.h dolphin.o: $(UTILS_SRC)/erase.h dolphin.o: $(UTILS_SRC)/font-retry.h -dolphin.o: $(UTILS_SRC)/grabscreen.h +dolphin.o: $(UTILS_SRC)/grabclient.h dolphin.o: $(UTILS_SRC)/hsv.h dolphin.o: $(UTILS_SRC)/resources.h dolphin.o: $(UTILS_SRC)/usleep.h @@ -1969,7 +1974,7 @@ dropshadow.o: $(HACK_SRC)/recanim.h dropshadow.o: $(HACK_SRC)/screenhackI.h dropshadow.o: $(UTILS_SRC)/colors.h dropshadow.o: $(UTILS_SRC)/font-retry.h -dropshadow.o: $(UTILS_SRC)/grabscreen.h +dropshadow.o: $(UTILS_SRC)/grabclient.h dropshadow.o: $(UTILS_SRC)/hsv.h dropshadow.o: $(UTILS_SRC)/resources.h dropshadow.o: $(UTILS_SRC)/usleep.h @@ -1995,7 +2000,7 @@ dymaxionmap.o: $(srcdir)/texfont.h dymaxionmap.o: $(UTILS_SRC)/colors.h dymaxionmap.o: $(UTILS_SRC)/erase.h dymaxionmap.o: $(UTILS_SRC)/font-retry.h -dymaxionmap.o: $(UTILS_SRC)/grabscreen.h +dymaxionmap.o: $(UTILS_SRC)/grabclient.h dymaxionmap.o: $(UTILS_SRC)/hsv.h dymaxionmap.o: $(UTILS_SRC)/resources.h dymaxionmap.o: $(UTILS_SRC)/usleep.h @@ -2015,7 +2020,7 @@ endgame.o: $(HACK_SRC)/screenhackI.h endgame.o: $(UTILS_SRC)/colors.h endgame.o: $(UTILS_SRC)/erase.h endgame.o: $(UTILS_SRC)/font-retry.h -endgame.o: $(UTILS_SRC)/grabscreen.h +endgame.o: $(UTILS_SRC)/grabclient.h endgame.o: $(UTILS_SRC)/hsv.h endgame.o: $(UTILS_SRC)/resources.h endgame.o: $(UTILS_SRC)/usleep.h @@ -2033,7 +2038,7 @@ energystream.o: $(HACK_SRC)/screenhackI.h energystream.o: $(UTILS_SRC)/colors.h energystream.o: $(UTILS_SRC)/erase.h energystream.o: $(UTILS_SRC)/font-retry.h -energystream.o: $(UTILS_SRC)/grabscreen.h +energystream.o: $(UTILS_SRC)/grabclient.h energystream.o: $(UTILS_SRC)/hsv.h energystream.o: $(UTILS_SRC)/resources.h energystream.o: $(UTILS_SRC)/usleep.h @@ -2052,7 +2057,7 @@ engine.o: $(srcdir)/texfont.h engine.o: $(UTILS_SRC)/colors.h engine.o: $(UTILS_SRC)/erase.h engine.o: $(UTILS_SRC)/font-retry.h -engine.o: $(UTILS_SRC)/grabscreen.h +engine.o: $(UTILS_SRC)/grabclient.h engine.o: $(UTILS_SRC)/hsv.h engine.o: $(UTILS_SRC)/resources.h engine.o: $(UTILS_SRC)/usleep.h @@ -2073,7 +2078,7 @@ esper.o: $(srcdir)/texfont.h esper.o: $(UTILS_SRC)/colors.h esper.o: $(UTILS_SRC)/erase.h esper.o: $(UTILS_SRC)/font-retry.h -esper.o: $(UTILS_SRC)/grabscreen.h +esper.o: $(UTILS_SRC)/grabclient.h esper.o: $(UTILS_SRC)/hsv.h esper.o: $(UTILS_SRC)/resources.h esper.o: $(UTILS_SRC)/usleep.h @@ -2093,7 +2098,7 @@ etruscanvenus.o: $(HACK_SRC)/screenhackI.h etruscanvenus.o: $(UTILS_SRC)/colors.h etruscanvenus.o: $(UTILS_SRC)/erase.h etruscanvenus.o: $(UTILS_SRC)/font-retry.h -etruscanvenus.o: $(UTILS_SRC)/grabscreen.h +etruscanvenus.o: $(UTILS_SRC)/grabclient.h etruscanvenus.o: $(UTILS_SRC)/hsv.h etruscanvenus.o: $(UTILS_SRC)/resources.h etruscanvenus.o: $(UTILS_SRC)/usleep.h @@ -2110,7 +2115,7 @@ extrusion-helix2.o: $(HACK_SRC)/screenhackI.h extrusion-helix2.o: $(UTILS_SRC)/colors.h extrusion-helix2.o: $(UTILS_SRC)/erase.h extrusion-helix2.o: $(UTILS_SRC)/font-retry.h -extrusion-helix2.o: $(UTILS_SRC)/grabscreen.h +extrusion-helix2.o: $(UTILS_SRC)/grabclient.h extrusion-helix2.o: $(UTILS_SRC)/hsv.h extrusion-helix2.o: $(UTILS_SRC)/resources.h extrusion-helix2.o: $(UTILS_SRC)/usleep.h @@ -2126,7 +2131,7 @@ extrusion-helix3.o: $(HACK_SRC)/screenhackI.h extrusion-helix3.o: $(UTILS_SRC)/colors.h extrusion-helix3.o: $(UTILS_SRC)/erase.h extrusion-helix3.o: $(UTILS_SRC)/font-retry.h -extrusion-helix3.o: $(UTILS_SRC)/grabscreen.h +extrusion-helix3.o: $(UTILS_SRC)/grabclient.h extrusion-helix3.o: $(UTILS_SRC)/hsv.h extrusion-helix3.o: $(UTILS_SRC)/resources.h extrusion-helix3.o: $(UTILS_SRC)/usleep.h @@ -2142,7 +2147,7 @@ extrusion-helix4.o: $(HACK_SRC)/screenhackI.h extrusion-helix4.o: $(UTILS_SRC)/colors.h extrusion-helix4.o: $(UTILS_SRC)/erase.h extrusion-helix4.o: $(UTILS_SRC)/font-retry.h -extrusion-helix4.o: $(UTILS_SRC)/grabscreen.h +extrusion-helix4.o: $(UTILS_SRC)/grabclient.h extrusion-helix4.o: $(UTILS_SRC)/hsv.h extrusion-helix4.o: $(UTILS_SRC)/resources.h extrusion-helix4.o: $(UTILS_SRC)/usleep.h @@ -2158,7 +2163,7 @@ extrusion-joinoffset.o: $(HACK_SRC)/screenhackI.h extrusion-joinoffset.o: $(UTILS_SRC)/colors.h extrusion-joinoffset.o: $(UTILS_SRC)/erase.h extrusion-joinoffset.o: $(UTILS_SRC)/font-retry.h -extrusion-joinoffset.o: $(UTILS_SRC)/grabscreen.h +extrusion-joinoffset.o: $(UTILS_SRC)/grabclient.h extrusion-joinoffset.o: $(UTILS_SRC)/hsv.h extrusion-joinoffset.o: $(UTILS_SRC)/resources.h extrusion-joinoffset.o: $(UTILS_SRC)/usleep.h @@ -2176,7 +2181,7 @@ extrusion.o: $(HACK_SRC)/screenhackI.h extrusion.o: $(UTILS_SRC)/colors.h extrusion.o: $(UTILS_SRC)/erase.h extrusion.o: $(UTILS_SRC)/font-retry.h -extrusion.o: $(UTILS_SRC)/grabscreen.h +extrusion.o: $(UTILS_SRC)/grabclient.h extrusion.o: $(UTILS_SRC)/hsv.h extrusion.o: $(UTILS_SRC)/resources.h extrusion.o: $(UTILS_SRC)/usleep.h @@ -2194,7 +2199,7 @@ extrusion-screw.o: $(HACK_SRC)/screenhackI.h extrusion-screw.o: $(UTILS_SRC)/colors.h extrusion-screw.o: $(UTILS_SRC)/erase.h extrusion-screw.o: $(UTILS_SRC)/font-retry.h -extrusion-screw.o: $(UTILS_SRC)/grabscreen.h +extrusion-screw.o: $(UTILS_SRC)/grabclient.h extrusion-screw.o: $(UTILS_SRC)/hsv.h extrusion-screw.o: $(UTILS_SRC)/resources.h extrusion-screw.o: $(UTILS_SRC)/usleep.h @@ -2210,7 +2215,7 @@ extrusion-taper.o: $(HACK_SRC)/screenhackI.h extrusion-taper.o: $(UTILS_SRC)/colors.h extrusion-taper.o: $(UTILS_SRC)/erase.h extrusion-taper.o: $(UTILS_SRC)/font-retry.h -extrusion-taper.o: $(UTILS_SRC)/grabscreen.h +extrusion-taper.o: $(UTILS_SRC)/grabclient.h extrusion-taper.o: $(UTILS_SRC)/hsv.h extrusion-taper.o: $(UTILS_SRC)/resources.h extrusion-taper.o: $(UTILS_SRC)/usleep.h @@ -2226,7 +2231,7 @@ extrusion-twistoid.o: $(HACK_SRC)/screenhackI.h extrusion-twistoid.o: $(UTILS_SRC)/colors.h extrusion-twistoid.o: $(UTILS_SRC)/erase.h extrusion-twistoid.o: $(UTILS_SRC)/font-retry.h -extrusion-twistoid.o: $(UTILS_SRC)/grabscreen.h +extrusion-twistoid.o: $(UTILS_SRC)/grabclient.h extrusion-twistoid.o: $(UTILS_SRC)/hsv.h extrusion-twistoid.o: $(UTILS_SRC)/resources.h extrusion-twistoid.o: $(UTILS_SRC)/usleep.h @@ -2243,7 +2248,7 @@ flipflop.o: $(HACK_SRC)/screenhackI.h flipflop.o: $(UTILS_SRC)/colors.h flipflop.o: $(UTILS_SRC)/erase.h flipflop.o: $(UTILS_SRC)/font-retry.h -flipflop.o: $(UTILS_SRC)/grabscreen.h +flipflop.o: $(UTILS_SRC)/grabclient.h flipflop.o: $(UTILS_SRC)/hsv.h flipflop.o: $(UTILS_SRC)/resources.h flipflop.o: $(UTILS_SRC)/usleep.h @@ -2261,7 +2266,7 @@ flipscreen3d.o: $(HACK_SRC)/screenhackI.h flipscreen3d.o: $(UTILS_SRC)/colors.h flipscreen3d.o: $(UTILS_SRC)/erase.h flipscreen3d.o: $(UTILS_SRC)/font-retry.h -flipscreen3d.o: $(UTILS_SRC)/grabscreen.h +flipscreen3d.o: $(UTILS_SRC)/grabclient.h flipscreen3d.o: $(UTILS_SRC)/hsv.h flipscreen3d.o: $(UTILS_SRC)/resources.h flipscreen3d.o: $(UTILS_SRC)/usleep.h @@ -2278,7 +2283,7 @@ fliptext.o: $(srcdir)/texfont.h fliptext.o: $(UTILS_SRC)/colors.h fliptext.o: $(UTILS_SRC)/erase.h fliptext.o: $(UTILS_SRC)/font-retry.h -fliptext.o: $(UTILS_SRC)/grabscreen.h +fliptext.o: $(UTILS_SRC)/grabclient.h fliptext.o: $(UTILS_SRC)/hsv.h fliptext.o: $(UTILS_SRC)/resources.h fliptext.o: $(UTILS_SRC)/textclient.h @@ -2298,7 +2303,7 @@ flurry.o: $(HACK_SRC)/screenhackI.h flurry.o: $(UTILS_SRC)/colors.h flurry.o: $(UTILS_SRC)/erase.h flurry.o: $(UTILS_SRC)/font-retry.h -flurry.o: $(UTILS_SRC)/grabscreen.h +flurry.o: $(UTILS_SRC)/grabclient.h flurry.o: $(UTILS_SRC)/hsv.h flurry.o: $(UTILS_SRC)/resources.h flurry.o: $(UTILS_SRC)/usleep.h @@ -2317,7 +2322,7 @@ flurry-smoke.o: $(HACK_SRC)/screenhackI.h flurry-smoke.o: $(UTILS_SRC)/colors.h flurry-smoke.o: $(UTILS_SRC)/erase.h flurry-smoke.o: $(UTILS_SRC)/font-retry.h -flurry-smoke.o: $(UTILS_SRC)/grabscreen.h +flurry-smoke.o: $(UTILS_SRC)/grabclient.h flurry-smoke.o: $(UTILS_SRC)/hsv.h flurry-smoke.o: $(UTILS_SRC)/resources.h flurry-smoke.o: $(UTILS_SRC)/usleep.h @@ -2335,7 +2340,7 @@ flurry-spark.o: $(HACK_SRC)/screenhackI.h flurry-spark.o: $(UTILS_SRC)/colors.h flurry-spark.o: $(UTILS_SRC)/erase.h flurry-spark.o: $(UTILS_SRC)/font-retry.h -flurry-spark.o: $(UTILS_SRC)/grabscreen.h +flurry-spark.o: $(UTILS_SRC)/grabclient.h flurry-spark.o: $(UTILS_SRC)/hsv.h flurry-spark.o: $(UTILS_SRC)/resources.h flurry-spark.o: $(UTILS_SRC)/usleep.h @@ -2353,7 +2358,7 @@ flurry-star.o: $(HACK_SRC)/screenhackI.h flurry-star.o: $(UTILS_SRC)/colors.h flurry-star.o: $(UTILS_SRC)/erase.h flurry-star.o: $(UTILS_SRC)/font-retry.h -flurry-star.o: $(UTILS_SRC)/grabscreen.h +flurry-star.o: $(UTILS_SRC)/grabclient.h flurry-star.o: $(UTILS_SRC)/hsv.h flurry-star.o: $(UTILS_SRC)/resources.h flurry-star.o: $(UTILS_SRC)/usleep.h @@ -2371,7 +2376,7 @@ flurry-texture.o: $(HACK_SRC)/screenhackI.h flurry-texture.o: $(UTILS_SRC)/colors.h flurry-texture.o: $(UTILS_SRC)/erase.h flurry-texture.o: $(UTILS_SRC)/font-retry.h -flurry-texture.o: $(UTILS_SRC)/grabscreen.h +flurry-texture.o: $(UTILS_SRC)/grabclient.h flurry-texture.o: $(UTILS_SRC)/hsv.h flurry-texture.o: $(UTILS_SRC)/resources.h flurry-texture.o: $(UTILS_SRC)/usleep.h @@ -2390,7 +2395,7 @@ flyingtoasters.o: $(HACK_SRC)/screenhackI.h flyingtoasters.o: $(UTILS_SRC)/colors.h flyingtoasters.o: $(UTILS_SRC)/erase.h flyingtoasters.o: $(UTILS_SRC)/font-retry.h -flyingtoasters.o: $(UTILS_SRC)/grabscreen.h +flyingtoasters.o: $(UTILS_SRC)/grabclient.h flyingtoasters.o: $(UTILS_SRC)/hsv.h flyingtoasters.o: $(UTILS_SRC)/resources.h flyingtoasters.o: $(UTILS_SRC)/usleep.h @@ -2409,7 +2414,7 @@ fps-gl.o: $(srcdir)/texfont.h fps-gl.o: $(UTILS_SRC)/colors.h fps-gl.o: $(UTILS_SRC)/erase.h fps-gl.o: $(UTILS_SRC)/font-retry.h -fps-gl.o: $(UTILS_SRC)/grabscreen.h +fps-gl.o: $(UTILS_SRC)/grabclient.h fps-gl.o: $(UTILS_SRC)/hsv.h fps-gl.o: $(UTILS_SRC)/resources.h fps-gl.o: $(UTILS_SRC)/usleep.h @@ -2429,7 +2434,7 @@ gears.o: $(srcdir)/tube.h gears.o: $(UTILS_SRC)/colors.h gears.o: $(UTILS_SRC)/erase.h gears.o: $(UTILS_SRC)/font-retry.h -gears.o: $(UTILS_SRC)/grabscreen.h +gears.o: $(UTILS_SRC)/grabclient.h gears.o: $(UTILS_SRC)/hsv.h gears.o: $(UTILS_SRC)/resources.h gears.o: $(UTILS_SRC)/usleep.h @@ -2451,7 +2456,7 @@ geodesicgears.o: $(srcdir)/texfont.h geodesicgears.o: $(UTILS_SRC)/colors.h geodesicgears.o: $(UTILS_SRC)/erase.h geodesicgears.o: $(UTILS_SRC)/font-retry.h -geodesicgears.o: $(UTILS_SRC)/grabscreen.h +geodesicgears.o: $(UTILS_SRC)/grabclient.h geodesicgears.o: $(UTILS_SRC)/hsv.h geodesicgears.o: $(UTILS_SRC)/resources.h geodesicgears.o: $(UTILS_SRC)/usleep.h @@ -2471,7 +2476,7 @@ geodesic.o: $(HACK_SRC)/screenhackI.h geodesic.o: $(UTILS_SRC)/colors.h geodesic.o: $(UTILS_SRC)/erase.h geodesic.o: $(UTILS_SRC)/font-retry.h -geodesic.o: $(UTILS_SRC)/grabscreen.h +geodesic.o: $(UTILS_SRC)/grabclient.h geodesic.o: $(UTILS_SRC)/hsv.h geodesic.o: $(UTILS_SRC)/resources.h geodesic.o: $(UTILS_SRC)/usleep.h @@ -2489,7 +2494,7 @@ gflux.o: $(HACK_SRC)/screenhackI.h gflux.o: $(UTILS_SRC)/colors.h gflux.o: $(UTILS_SRC)/erase.h gflux.o: $(UTILS_SRC)/font-retry.h -gflux.o: $(UTILS_SRC)/grabscreen.h +gflux.o: $(UTILS_SRC)/grabclient.h gflux.o: $(UTILS_SRC)/hsv.h gflux.o: $(UTILS_SRC)/resources.h gflux.o: $(UTILS_SRC)/usleep.h @@ -2507,7 +2512,7 @@ gibson.o: $(srcdir)/texfont.h gibson.o: $(UTILS_SRC)/colors.h gibson.o: $(UTILS_SRC)/erase.h gibson.o: $(UTILS_SRC)/font-retry.h -gibson.o: $(UTILS_SRC)/grabscreen.h +gibson.o: $(UTILS_SRC)/grabclient.h gibson.o: $(UTILS_SRC)/hsv.h gibson.o: $(UTILS_SRC)/resources.h gibson.o: $(UTILS_SRC)/usleep.h @@ -2525,7 +2530,7 @@ glblur.o: $(HACK_SRC)/screenhackI.h glblur.o: $(UTILS_SRC)/colors.h glblur.o: $(UTILS_SRC)/erase.h glblur.o: $(UTILS_SRC)/font-retry.h -glblur.o: $(UTILS_SRC)/grabscreen.h +glblur.o: $(UTILS_SRC)/grabclient.h glblur.o: $(UTILS_SRC)/hsv.h glblur.o: $(UTILS_SRC)/resources.h glblur.o: $(UTILS_SRC)/usleep.h @@ -2541,7 +2546,7 @@ glcells.o: $(HACK_SRC)/screenhackI.h glcells.o: $(UTILS_SRC)/colors.h glcells.o: $(UTILS_SRC)/erase.h glcells.o: $(UTILS_SRC)/font-retry.h -glcells.o: $(UTILS_SRC)/grabscreen.h +glcells.o: $(UTILS_SRC)/grabclient.h glcells.o: $(UTILS_SRC)/hsv.h glcells.o: $(UTILS_SRC)/resources.h glcells.o: $(UTILS_SRC)/usleep.h @@ -2558,7 +2563,7 @@ gleidescope.o: $(HACK_SRC)/screenhackI.h gleidescope.o: $(UTILS_SRC)/colors.h gleidescope.o: $(UTILS_SRC)/erase.h gleidescope.o: $(UTILS_SRC)/font-retry.h -gleidescope.o: $(UTILS_SRC)/grabscreen.h +gleidescope.o: $(UTILS_SRC)/grabclient.h gleidescope.o: $(UTILS_SRC)/hsv.h gleidescope.o: $(UTILS_SRC)/resources.h gleidescope.o: $(UTILS_SRC)/usleep.h @@ -2578,7 +2583,7 @@ glforestfire.o: $(HACK_SRC)/screenhackI.h glforestfire.o: $(UTILS_SRC)/colors.h glforestfire.o: $(UTILS_SRC)/erase.h glforestfire.o: $(UTILS_SRC)/font-retry.h -glforestfire.o: $(UTILS_SRC)/grabscreen.h +glforestfire.o: $(UTILS_SRC)/grabclient.h glforestfire.o: $(UTILS_SRC)/hsv.h glforestfire.o: $(UTILS_SRC)/resources.h glforestfire.o: $(UTILS_SRC)/usleep.h @@ -2596,7 +2601,7 @@ glhanoi.o: $(HACK_SRC)/screenhackI.h glhanoi.o: $(UTILS_SRC)/colors.h glhanoi.o: $(UTILS_SRC)/erase.h glhanoi.o: $(UTILS_SRC)/font-retry.h -glhanoi.o: $(UTILS_SRC)/grabscreen.h +glhanoi.o: $(UTILS_SRC)/grabclient.h glhanoi.o: $(UTILS_SRC)/hsv.h glhanoi.o: $(UTILS_SRC)/resources.h glhanoi.o: $(UTILS_SRC)/usleep.h @@ -2615,7 +2620,7 @@ glknots.o: $(srcdir)/tube.h glknots.o: $(UTILS_SRC)/colors.h glknots.o: $(UTILS_SRC)/erase.h glknots.o: $(UTILS_SRC)/font-retry.h -glknots.o: $(UTILS_SRC)/grabscreen.h +glknots.o: $(UTILS_SRC)/grabclient.h glknots.o: $(UTILS_SRC)/hsv.h glknots.o: $(UTILS_SRC)/resources.h glknots.o: $(UTILS_SRC)/usleep.h @@ -2632,7 +2637,7 @@ gllist.o: $(HACK_SRC)/screenhackI.h gllist.o: $(UTILS_SRC)/colors.h gllist.o: $(UTILS_SRC)/erase.h gllist.o: $(UTILS_SRC)/font-retry.h -gllist.o: $(UTILS_SRC)/grabscreen.h +gllist.o: $(UTILS_SRC)/grabclient.h gllist.o: $(UTILS_SRC)/hsv.h gllist.o: $(UTILS_SRC)/resources.h gllist.o: $(UTILS_SRC)/usleep.h @@ -2648,7 +2653,7 @@ glmatrix.o: $(HACK_SRC)/screenhackI.h glmatrix.o: $(UTILS_SRC)/colors.h glmatrix.o: $(UTILS_SRC)/erase.h glmatrix.o: $(UTILS_SRC)/font-retry.h -glmatrix.o: $(UTILS_SRC)/grabscreen.h +glmatrix.o: $(UTILS_SRC)/grabclient.h glmatrix.o: $(UTILS_SRC)/hsv.h glmatrix.o: $(UTILS_SRC)/resources.h glmatrix.o: $(UTILS_SRC)/usleep.h @@ -2671,7 +2676,7 @@ glplanet.o: $(srcdir)/sphere.h glplanet.o: $(UTILS_SRC)/colors.h glplanet.o: $(UTILS_SRC)/erase.h glplanet.o: $(UTILS_SRC)/font-retry.h -glplanet.o: $(UTILS_SRC)/grabscreen.h +glplanet.o: $(UTILS_SRC)/grabclient.h glplanet.o: $(UTILS_SRC)/hsv.h glplanet.o: $(UTILS_SRC)/resources.h glplanet.o: $(UTILS_SRC)/usleep.h @@ -2695,7 +2700,7 @@ glschool_gl.o: $(srcdir)/tube.h glschool_gl.o: $(UTILS_SRC)/colors.h glschool_gl.o: $(UTILS_SRC)/erase.h glschool_gl.o: $(UTILS_SRC)/font-retry.h -glschool_gl.o: $(UTILS_SRC)/grabscreen.h +glschool_gl.o: $(UTILS_SRC)/grabclient.h glschool_gl.o: $(UTILS_SRC)/hsv.h glschool_gl.o: $(UTILS_SRC)/resources.h glschool_gl.o: $(UTILS_SRC)/usleep.h @@ -2713,7 +2718,7 @@ glschool.o: $(HACK_SRC)/screenhackI.h glschool.o: $(UTILS_SRC)/colors.h glschool.o: $(UTILS_SRC)/erase.h glschool.o: $(UTILS_SRC)/font-retry.h -glschool.o: $(UTILS_SRC)/grabscreen.h +glschool.o: $(UTILS_SRC)/grabclient.h glschool.o: $(UTILS_SRC)/hsv.h glschool.o: $(UTILS_SRC)/resources.h glschool.o: $(UTILS_SRC)/usleep.h @@ -2731,7 +2736,7 @@ glslideshow.o: $(srcdir)/texfont.h glslideshow.o: $(UTILS_SRC)/colors.h glslideshow.o: $(UTILS_SRC)/erase.h glslideshow.o: $(UTILS_SRC)/font-retry.h -glslideshow.o: $(UTILS_SRC)/grabscreen.h +glslideshow.o: $(UTILS_SRC)/grabclient.h glslideshow.o: $(UTILS_SRC)/hsv.h glslideshow.o: $(UTILS_SRC)/resources.h glslideshow.o: $(UTILS_SRC)/usleep.h @@ -2747,7 +2752,7 @@ glsl-utils.o: $(HACK_SRC)/recanim.h glsl-utils.o: $(HACK_SRC)/screenhackI.h glsl-utils.o: $(UTILS_SRC)/colors.h glsl-utils.o: $(UTILS_SRC)/font-retry.h -glsl-utils.o: $(UTILS_SRC)/grabscreen.h +glsl-utils.o: $(UTILS_SRC)/grabclient.h glsl-utils.o: $(UTILS_SRC)/hsv.h glsl-utils.o: $(UTILS_SRC)/resources.h glsl-utils.o: $(UTILS_SRC)/usleep.h @@ -2762,7 +2767,7 @@ glsnake.o: $(srcdir)/texfont.h glsnake.o: $(UTILS_SRC)/colors.h glsnake.o: $(UTILS_SRC)/erase.h glsnake.o: $(UTILS_SRC)/font-retry.h -glsnake.o: $(UTILS_SRC)/grabscreen.h +glsnake.o: $(UTILS_SRC)/grabclient.h glsnake.o: $(UTILS_SRC)/hsv.h glsnake.o: $(UTILS_SRC)/resources.h glsnake.o: $(UTILS_SRC)/usleep.h @@ -2785,7 +2790,7 @@ gltext.o: $(srcdir)/tube.h gltext.o: $(UTILS_SRC)/colors.h gltext.o: $(UTILS_SRC)/erase.h gltext.o: $(UTILS_SRC)/font-retry.h -gltext.o: $(UTILS_SRC)/grabscreen.h +gltext.o: $(UTILS_SRC)/grabclient.h gltext.o: $(UTILS_SRC)/hsv.h gltext.o: $(UTILS_SRC)/resources.h gltext.o: $(UTILS_SRC)/textclient.h @@ -2804,7 +2809,7 @@ gltrackball.o: $(HACK_SRC)/screenhackI.h gltrackball.o: $(srcdir)/trackball.h gltrackball.o: $(UTILS_SRC)/colors.h gltrackball.o: $(UTILS_SRC)/font-retry.h -gltrackball.o: $(UTILS_SRC)/grabscreen.h +gltrackball.o: $(UTILS_SRC)/grabclient.h gltrackball.o: $(UTILS_SRC)/hsv.h gltrackball.o: $(UTILS_SRC)/resources.h gltrackball.o: $(UTILS_SRC)/usleep.h @@ -2818,7 +2823,7 @@ glut_stroke.o: $(HACK_SRC)/recanim.h glut_stroke.o: $(HACK_SRC)/screenhackI.h glut_stroke.o: $(UTILS_SRC)/colors.h glut_stroke.o: $(UTILS_SRC)/font-retry.h -glut_stroke.o: $(UTILS_SRC)/grabscreen.h +glut_stroke.o: $(UTILS_SRC)/grabclient.h glut_stroke.o: $(UTILS_SRC)/hsv.h glut_stroke.o: $(UTILS_SRC)/resources.h glut_stroke.o: $(UTILS_SRC)/usleep.h @@ -2832,7 +2837,7 @@ glut_swidth.o: $(HACK_SRC)/recanim.h glut_swidth.o: $(HACK_SRC)/screenhackI.h glut_swidth.o: $(UTILS_SRC)/colors.h glut_swidth.o: $(UTILS_SRC)/font-retry.h -glut_swidth.o: $(UTILS_SRC)/grabscreen.h +glut_swidth.o: $(UTILS_SRC)/grabclient.h glut_swidth.o: $(UTILS_SRC)/hsv.h glut_swidth.o: $(UTILS_SRC)/resources.h glut_swidth.o: $(UTILS_SRC)/usleep.h @@ -2847,7 +2852,7 @@ grab-ximage.o: $(HACK_SRC)/screenhackI.h grab-ximage.o: $(UTILS_SRC)/colors.h grab-ximage.o: $(UTILS_SRC)/erase.h grab-ximage.o: $(UTILS_SRC)/font-retry.h -grab-ximage.o: $(UTILS_SRC)/grabscreen.h +grab-ximage.o: $(UTILS_SRC)/grabclient.h grab-ximage.o: $(UTILS_SRC)/hsv.h grab-ximage.o: $(UTILS_SRC)/pow2.h grab-ximage.o: $(UTILS_SRC)/resources.h @@ -2865,7 +2870,7 @@ gravitywell.o: $(HACK_SRC)/screenhackI.h gravitywell.o: $(UTILS_SRC)/colors.h gravitywell.o: $(UTILS_SRC)/erase.h gravitywell.o: $(UTILS_SRC)/font-retry.h -gravitywell.o: $(UTILS_SRC)/grabscreen.h +gravitywell.o: $(UTILS_SRC)/grabclient.h gravitywell.o: $(UTILS_SRC)/hsv.h gravitywell.o: $(UTILS_SRC)/resources.h gravitywell.o: $(UTILS_SRC)/usleep.h @@ -2882,7 +2887,7 @@ handsy_model.o: $(HACK_SRC)/screenhackI.h handsy_model.o: $(UTILS_SRC)/colors.h handsy_model.o: $(UTILS_SRC)/erase.h handsy_model.o: $(UTILS_SRC)/font-retry.h -handsy_model.o: $(UTILS_SRC)/grabscreen.h +handsy_model.o: $(UTILS_SRC)/grabclient.h handsy_model.o: $(UTILS_SRC)/hsv.h handsy_model.o: $(UTILS_SRC)/resources.h handsy_model.o: $(UTILS_SRC)/usleep.h @@ -2903,7 +2908,7 @@ handsy.o: $(srcdir)/tube.h handsy.o: $(UTILS_SRC)/colors.h handsy.o: $(UTILS_SRC)/erase.h handsy.o: $(UTILS_SRC)/font-retry.h -handsy.o: $(UTILS_SRC)/grabscreen.h +handsy.o: $(UTILS_SRC)/grabclient.h handsy.o: $(UTILS_SRC)/hsv.h handsy.o: $(UTILS_SRC)/resources.h handsy.o: $(UTILS_SRC)/usleep.h @@ -2920,7 +2925,7 @@ headroom_model.o: $(HACK_SRC)/screenhackI.h headroom_model.o: $(UTILS_SRC)/colors.h headroom_model.o: $(UTILS_SRC)/erase.h headroom_model.o: $(UTILS_SRC)/font-retry.h -headroom_model.o: $(UTILS_SRC)/grabscreen.h +headroom_model.o: $(UTILS_SRC)/grabclient.h headroom_model.o: $(UTILS_SRC)/hsv.h headroom_model.o: $(UTILS_SRC)/resources.h headroom_model.o: $(UTILS_SRC)/usleep.h @@ -2938,7 +2943,7 @@ headroom.o: $(HACK_SRC)/screenhackI.h headroom.o: $(UTILS_SRC)/colors.h headroom.o: $(UTILS_SRC)/erase.h headroom.o: $(UTILS_SRC)/font-retry.h -headroom.o: $(UTILS_SRC)/grabscreen.h +headroom.o: $(UTILS_SRC)/grabclient.h headroom.o: $(UTILS_SRC)/hsv.h headroom.o: $(UTILS_SRC)/resources.h headroom.o: $(UTILS_SRC)/usleep.h @@ -2957,7 +2962,7 @@ hexstrut.o: $(HACK_SRC)/screenhackI.h hexstrut.o: $(UTILS_SRC)/colors.h hexstrut.o: $(UTILS_SRC)/erase.h hexstrut.o: $(UTILS_SRC)/font-retry.h -hexstrut.o: $(UTILS_SRC)/grabscreen.h +hexstrut.o: $(UTILS_SRC)/grabclient.h hexstrut.o: $(UTILS_SRC)/hsv.h hexstrut.o: $(UTILS_SRC)/resources.h hexstrut.o: $(UTILS_SRC)/usleep.h @@ -2966,6 +2971,25 @@ hexstrut.o: $(UTILS_SRC)/xft.h hexstrut.o: $(UTILS_SRC)/yarandom.h hexstrut.o: $(HACK_SRC)/xlockmoreI.h hexstrut.o: $(HACK_SRC)/xlockmore.h +hextrail.o: ../../config.h +hextrail.o: $(HACK_SRC)/fps.h +hextrail.o: $(srcdir)/gltrackball.h +hextrail.o: $(srcdir)/normals.h +hextrail.o: $(HACK_SRC)/recanim.h +hextrail.o: $(srcdir)/rotator.h +hextrail.o: $(HACK_SRC)/screenhackI.h +hextrail.o: $(UTILS_SRC)/colors.h +hextrail.o: $(UTILS_SRC)/erase.h +hextrail.o: $(UTILS_SRC)/font-retry.h +hextrail.o: $(UTILS_SRC)/grabclient.h +hextrail.o: $(UTILS_SRC)/hsv.h +hextrail.o: $(UTILS_SRC)/resources.h +hextrail.o: $(UTILS_SRC)/usleep.h +hextrail.o: $(UTILS_SRC)/visual.h +hextrail.o: $(UTILS_SRC)/xft.h +hextrail.o: $(UTILS_SRC)/yarandom.h +hextrail.o: $(HACK_SRC)/xlockmoreI.h +hextrail.o: $(HACK_SRC)/xlockmore.h hilbert.o: ../../config.h hilbert.o: $(HACK_SRC)/fps.h hilbert.o: $(srcdir)/gltrackball.h @@ -2977,7 +3001,7 @@ hilbert.o: $(srcdir)/tube.h hilbert.o: $(UTILS_SRC)/colors.h hilbert.o: $(UTILS_SRC)/erase.h hilbert.o: $(UTILS_SRC)/font-retry.h -hilbert.o: $(UTILS_SRC)/grabscreen.h +hilbert.o: $(UTILS_SRC)/grabclient.h hilbert.o: $(UTILS_SRC)/hsv.h hilbert.o: $(UTILS_SRC)/resources.h hilbert.o: $(UTILS_SRC)/usleep.h @@ -2996,7 +3020,7 @@ hydrostat.o: $(srcdir)/sphere.h hydrostat.o: $(UTILS_SRC)/colors.h hydrostat.o: $(UTILS_SRC)/erase.h hydrostat.o: $(UTILS_SRC)/font-retry.h -hydrostat.o: $(UTILS_SRC)/grabscreen.h +hydrostat.o: $(UTILS_SRC)/grabclient.h hydrostat.o: $(UTILS_SRC)/hsv.h hydrostat.o: $(UTILS_SRC)/resources.h hydrostat.o: $(UTILS_SRC)/usleep.h @@ -3014,7 +3038,7 @@ hypertorus.o: $(HACK_SRC)/screenhackI.h hypertorus.o: $(UTILS_SRC)/colors.h hypertorus.o: $(UTILS_SRC)/erase.h hypertorus.o: $(UTILS_SRC)/font-retry.h -hypertorus.o: $(UTILS_SRC)/grabscreen.h +hypertorus.o: $(UTILS_SRC)/grabclient.h hypertorus.o: $(UTILS_SRC)/hsv.h hypertorus.o: $(UTILS_SRC)/resources.h hypertorus.o: $(UTILS_SRC)/usleep.h @@ -3031,7 +3055,7 @@ hypnowheel.o: $(HACK_SRC)/screenhackI.h hypnowheel.o: $(UTILS_SRC)/colors.h hypnowheel.o: $(UTILS_SRC)/erase.h hypnowheel.o: $(UTILS_SRC)/font-retry.h -hypnowheel.o: $(UTILS_SRC)/grabscreen.h +hypnowheel.o: $(UTILS_SRC)/grabclient.h hypnowheel.o: $(UTILS_SRC)/hsv.h hypnowheel.o: $(UTILS_SRC)/resources.h hypnowheel.o: $(UTILS_SRC)/usleep.h @@ -3048,7 +3072,7 @@ involute.o: $(HACK_SRC)/recanim.h involute.o: $(HACK_SRC)/screenhackI.h involute.o: $(UTILS_SRC)/colors.h involute.o: $(UTILS_SRC)/font-retry.h -involute.o: $(UTILS_SRC)/grabscreen.h +involute.o: $(UTILS_SRC)/grabclient.h involute.o: $(UTILS_SRC)/hsv.h involute.o: $(UTILS_SRC)/resources.h involute.o: $(UTILS_SRC)/usleep.h @@ -3064,7 +3088,7 @@ jigglypuff.o: $(HACK_SRC)/screenhackI.h jigglypuff.o: $(UTILS_SRC)/colors.h jigglypuff.o: $(UTILS_SRC)/erase.h jigglypuff.o: $(UTILS_SRC)/font-retry.h -jigglypuff.o: $(UTILS_SRC)/grabscreen.h +jigglypuff.o: $(UTILS_SRC)/grabclient.h jigglypuff.o: $(UTILS_SRC)/hsv.h jigglypuff.o: $(UTILS_SRC)/resources.h jigglypuff.o: $(UTILS_SRC)/usleep.h @@ -3086,7 +3110,7 @@ jigsaw.o: $(srcdir)/texfont.h jigsaw.o: $(UTILS_SRC)/colors.h jigsaw.o: $(UTILS_SRC)/erase.h jigsaw.o: $(UTILS_SRC)/font-retry.h -jigsaw.o: $(UTILS_SRC)/grabscreen.h +jigsaw.o: $(UTILS_SRC)/grabclient.h jigsaw.o: $(UTILS_SRC)/hsv.h jigsaw.o: $(UTILS_SRC)/resources.h jigsaw.o: $(UTILS_SRC)/spline.h @@ -3108,7 +3132,7 @@ juggler3d.o: $(srcdir)/tube.h juggler3d.o: $(UTILS_SRC)/colors.h juggler3d.o: $(UTILS_SRC)/erase.h juggler3d.o: $(UTILS_SRC)/font-retry.h -juggler3d.o: $(UTILS_SRC)/grabscreen.h +juggler3d.o: $(UTILS_SRC)/grabclient.h juggler3d.o: $(UTILS_SRC)/hsv.h juggler3d.o: $(UTILS_SRC)/resources.h juggler3d.o: $(UTILS_SRC)/usleep.h @@ -3127,7 +3151,7 @@ kaleidocycle.o: $(HACK_SRC)/screenhackI.h kaleidocycle.o: $(UTILS_SRC)/colors.h kaleidocycle.o: $(UTILS_SRC)/erase.h kaleidocycle.o: $(UTILS_SRC)/font-retry.h -kaleidocycle.o: $(UTILS_SRC)/grabscreen.h +kaleidocycle.o: $(UTILS_SRC)/grabclient.h kaleidocycle.o: $(UTILS_SRC)/hsv.h kaleidocycle.o: $(UTILS_SRC)/resources.h kaleidocycle.o: $(UTILS_SRC)/usleep.h @@ -3146,7 +3170,7 @@ klein.o: $(HACK_SRC)/screenhackI.h klein.o: $(UTILS_SRC)/colors.h klein.o: $(UTILS_SRC)/erase.h klein.o: $(UTILS_SRC)/font-retry.h -klein.o: $(UTILS_SRC)/grabscreen.h +klein.o: $(UTILS_SRC)/grabclient.h klein.o: $(UTILS_SRC)/hsv.h klein.o: $(UTILS_SRC)/resources.h klein.o: $(UTILS_SRC)/usleep.h @@ -3163,7 +3187,7 @@ lament_model.o: $(HACK_SRC)/screenhackI.h lament_model.o: $(UTILS_SRC)/colors.h lament_model.o: $(UTILS_SRC)/erase.h lament_model.o: $(UTILS_SRC)/font-retry.h -lament_model.o: $(UTILS_SRC)/grabscreen.h +lament_model.o: $(UTILS_SRC)/grabclient.h lament_model.o: $(UTILS_SRC)/hsv.h lament_model.o: $(UTILS_SRC)/resources.h lament_model.o: $(UTILS_SRC)/usleep.h @@ -3183,7 +3207,7 @@ lament.o: $(HACK_SRC)/screenhackI.h lament.o: $(UTILS_SRC)/colors.h lament.o: $(UTILS_SRC)/erase.h lament.o: $(UTILS_SRC)/font-retry.h -lament.o: $(UTILS_SRC)/grabscreen.h +lament.o: $(UTILS_SRC)/grabclient.h lament.o: $(UTILS_SRC)/hsv.h lament.o: $(UTILS_SRC)/resources.h lament.o: $(UTILS_SRC)/usleep.h @@ -3203,7 +3227,7 @@ lavalite.o: $(HACK_SRC)/screenhackI.h lavalite.o: $(UTILS_SRC)/colors.h lavalite.o: $(UTILS_SRC)/erase.h lavalite.o: $(UTILS_SRC)/font-retry.h -lavalite.o: $(UTILS_SRC)/grabscreen.h +lavalite.o: $(UTILS_SRC)/grabclient.h lavalite.o: $(UTILS_SRC)/hsv.h lavalite.o: $(UTILS_SRC)/resources.h lavalite.o: $(UTILS_SRC)/usleep.h @@ -3220,7 +3244,7 @@ lockward.o: $(HACK_SRC)/screenhackI.h lockward.o: $(UTILS_SRC)/colors.h lockward.o: $(UTILS_SRC)/erase.h lockward.o: $(UTILS_SRC)/font-retry.h -lockward.o: $(UTILS_SRC)/grabscreen.h +lockward.o: $(UTILS_SRC)/grabclient.h lockward.o: $(UTILS_SRC)/hsv.h lockward.o: $(UTILS_SRC)/resources.h lockward.o: $(UTILS_SRC)/usleep.h @@ -3239,7 +3263,7 @@ mapscroller.o: $(srcdir)/texfont.h mapscroller.o: $(UTILS_SRC)/colors.h mapscroller.o: $(UTILS_SRC)/erase.h mapscroller.o: $(UTILS_SRC)/font-retry.h -mapscroller.o: $(UTILS_SRC)/grabscreen.h +mapscroller.o: $(UTILS_SRC)/grabclient.h mapscroller.o: $(UTILS_SRC)/hsv.h mapscroller.o: $(UTILS_SRC)/resources.h mapscroller.o: $(UTILS_SRC)/usleep.h @@ -3257,7 +3281,7 @@ marching.o: $(HACK_SRC)/recanim.h marching.o: $(HACK_SRC)/screenhackI.h marching.o: $(UTILS_SRC)/colors.h marching.o: $(UTILS_SRC)/font-retry.h -marching.o: $(UTILS_SRC)/grabscreen.h +marching.o: $(UTILS_SRC)/grabclient.h marching.o: $(UTILS_SRC)/hsv.h marching.o: $(UTILS_SRC)/resources.h marching.o: $(UTILS_SRC)/usleep.h @@ -3277,7 +3301,7 @@ maze3d.o: $(HACK_SRC)/screenhackI.h maze3d.o: $(UTILS_SRC)/colors.h maze3d.o: $(UTILS_SRC)/erase.h maze3d.o: $(UTILS_SRC)/font-retry.h -maze3d.o: $(UTILS_SRC)/grabscreen.h +maze3d.o: $(UTILS_SRC)/grabclient.h maze3d.o: $(UTILS_SRC)/hsv.h maze3d.o: $(UTILS_SRC)/resources.h maze3d.o: $(UTILS_SRC)/usleep.h @@ -3296,7 +3320,7 @@ menger.o: $(HACK_SRC)/screenhackI.h menger.o: $(UTILS_SRC)/colors.h menger.o: $(UTILS_SRC)/erase.h menger.o: $(UTILS_SRC)/font-retry.h -menger.o: $(UTILS_SRC)/grabscreen.h +menger.o: $(UTILS_SRC)/grabclient.h menger.o: $(UTILS_SRC)/hsv.h menger.o: $(UTILS_SRC)/resources.h menger.o: $(UTILS_SRC)/usleep.h @@ -3314,7 +3338,7 @@ mirrorblob.o: $(HACK_SRC)/screenhackI.h mirrorblob.o: $(UTILS_SRC)/colors.h mirrorblob.o: $(UTILS_SRC)/erase.h mirrorblob.o: $(UTILS_SRC)/font-retry.h -mirrorblob.o: $(UTILS_SRC)/grabscreen.h +mirrorblob.o: $(UTILS_SRC)/grabclient.h mirrorblob.o: $(UTILS_SRC)/hsv.h mirrorblob.o: $(UTILS_SRC)/resources.h mirrorblob.o: $(UTILS_SRC)/usleep.h @@ -3334,7 +3358,7 @@ moebiusgears.o: $(HACK_SRC)/screenhackI.h moebiusgears.o: $(UTILS_SRC)/colors.h moebiusgears.o: $(UTILS_SRC)/erase.h moebiusgears.o: $(UTILS_SRC)/font-retry.h -moebiusgears.o: $(UTILS_SRC)/grabscreen.h +moebiusgears.o: $(UTILS_SRC)/grabclient.h moebiusgears.o: $(UTILS_SRC)/hsv.h moebiusgears.o: $(UTILS_SRC)/resources.h moebiusgears.o: $(UTILS_SRC)/usleep.h @@ -3354,7 +3378,7 @@ moebius.o: $(srcdir)/tube.h moebius.o: $(UTILS_SRC)/colors.h moebius.o: $(UTILS_SRC)/erase.h moebius.o: $(UTILS_SRC)/font-retry.h -moebius.o: $(UTILS_SRC)/grabscreen.h +moebius.o: $(UTILS_SRC)/grabclient.h moebius.o: $(UTILS_SRC)/hsv.h moebius.o: $(UTILS_SRC)/resources.h moebius.o: $(UTILS_SRC)/usleep.h @@ -3376,7 +3400,7 @@ molecule.o: $(srcdir)/tube.h molecule.o: $(UTILS_SRC)/colors.h molecule.o: $(UTILS_SRC)/erase.h molecule.o: $(UTILS_SRC)/font-retry.h -molecule.o: $(UTILS_SRC)/grabscreen.h +molecule.o: $(UTILS_SRC)/grabclient.h molecule.o: $(UTILS_SRC)/hsv.h molecule.o: $(UTILS_SRC)/resources.h molecule.o: $(UTILS_SRC)/usleep.h @@ -3392,7 +3416,7 @@ morph3d.o: $(HACK_SRC)/screenhackI.h morph3d.o: $(UTILS_SRC)/colors.h morph3d.o: $(UTILS_SRC)/erase.h morph3d.o: $(UTILS_SRC)/font-retry.h -morph3d.o: $(UTILS_SRC)/grabscreen.h +morph3d.o: $(UTILS_SRC)/grabclient.h morph3d.o: $(UTILS_SRC)/hsv.h morph3d.o: $(UTILS_SRC)/resources.h morph3d.o: $(UTILS_SRC)/usleep.h @@ -3411,7 +3435,7 @@ nakagin.o: $(HACK_SRC)/screenhackI.h nakagin.o: $(UTILS_SRC)/colors.h nakagin.o: $(UTILS_SRC)/erase.h nakagin.o: $(UTILS_SRC)/font-retry.h -nakagin.o: $(UTILS_SRC)/grabscreen.h +nakagin.o: $(UTILS_SRC)/grabclient.h nakagin.o: $(UTILS_SRC)/hsv.h nakagin.o: $(UTILS_SRC)/resources.h nakagin.o: $(UTILS_SRC)/usleep.h @@ -3427,7 +3451,7 @@ noof.o: $(HACK_SRC)/screenhackI.h noof.o: $(UTILS_SRC)/colors.h noof.o: $(UTILS_SRC)/erase.h noof.o: $(UTILS_SRC)/font-retry.h -noof.o: $(UTILS_SRC)/grabscreen.h +noof.o: $(UTILS_SRC)/grabclient.h noof.o: $(UTILS_SRC)/hsv.h noof.o: $(UTILS_SRC)/pow2.h noof.o: $(UTILS_SRC)/resources.h @@ -3444,7 +3468,7 @@ normals.o: $(HACK_SRC)/recanim.h normals.o: $(HACK_SRC)/screenhackI.h normals.o: $(UTILS_SRC)/colors.h normals.o: $(UTILS_SRC)/font-retry.h -normals.o: $(UTILS_SRC)/grabscreen.h +normals.o: $(UTILS_SRC)/grabclient.h normals.o: $(UTILS_SRC)/hsv.h normals.o: $(UTILS_SRC)/resources.h normals.o: $(UTILS_SRC)/usleep.h @@ -3463,7 +3487,7 @@ peepers.o: $(HACK_SRC)/screenhackI.h peepers.o: $(UTILS_SRC)/colors.h peepers.o: $(UTILS_SRC)/erase.h peepers.o: $(UTILS_SRC)/font-retry.h -peepers.o: $(UTILS_SRC)/grabscreen.h +peepers.o: $(UTILS_SRC)/grabclient.h peepers.o: $(UTILS_SRC)/hsv.h peepers.o: $(UTILS_SRC)/resources.h peepers.o: $(UTILS_SRC)/usleep.h @@ -3483,7 +3507,7 @@ photopile.o: $(srcdir)/texfont.h photopile.o: $(UTILS_SRC)/colors.h photopile.o: $(UTILS_SRC)/erase.h photopile.o: $(UTILS_SRC)/font-retry.h -photopile.o: $(UTILS_SRC)/grabscreen.h +photopile.o: $(UTILS_SRC)/grabclient.h photopile.o: $(UTILS_SRC)/hsv.h photopile.o: $(UTILS_SRC)/resources.h photopile.o: $(UTILS_SRC)/usleep.h @@ -3503,7 +3527,7 @@ pinion.o: $(srcdir)/texfont.h pinion.o: $(UTILS_SRC)/colors.h pinion.o: $(UTILS_SRC)/erase.h pinion.o: $(UTILS_SRC)/font-retry.h -pinion.o: $(UTILS_SRC)/grabscreen.h +pinion.o: $(UTILS_SRC)/grabclient.h pinion.o: $(UTILS_SRC)/hsv.h pinion.o: $(UTILS_SRC)/resources.h pinion.o: $(UTILS_SRC)/usleep.h @@ -3519,7 +3543,7 @@ pipeobjs.o: $(HACK_SRC)/recanim.h pipeobjs.o: $(HACK_SRC)/screenhackI.h pipeobjs.o: $(UTILS_SRC)/colors.h pipeobjs.o: $(UTILS_SRC)/font-retry.h -pipeobjs.o: $(UTILS_SRC)/grabscreen.h +pipeobjs.o: $(UTILS_SRC)/grabclient.h pipeobjs.o: $(UTILS_SRC)/hsv.h pipeobjs.o: $(UTILS_SRC)/resources.h pipeobjs.o: $(UTILS_SRC)/usleep.h @@ -3537,7 +3561,7 @@ pipes.o: $(srcdir)/teapot.h pipes.o: $(UTILS_SRC)/colors.h pipes.o: $(UTILS_SRC)/erase.h pipes.o: $(UTILS_SRC)/font-retry.h -pipes.o: $(UTILS_SRC)/grabscreen.h +pipes.o: $(UTILS_SRC)/grabclient.h pipes.o: $(UTILS_SRC)/hsv.h pipes.o: $(UTILS_SRC)/resources.h pipes.o: $(UTILS_SRC)/usleep.h @@ -3559,7 +3583,7 @@ polyhedra-gl.o: $(srcdir)/texfont.h polyhedra-gl.o: $(UTILS_SRC)/colors.h polyhedra-gl.o: $(UTILS_SRC)/erase.h polyhedra-gl.o: $(UTILS_SRC)/font-retry.h -polyhedra-gl.o: $(UTILS_SRC)/grabscreen.h +polyhedra-gl.o: $(UTILS_SRC)/grabclient.h polyhedra-gl.o: $(UTILS_SRC)/hsv.h polyhedra-gl.o: $(UTILS_SRC)/resources.h polyhedra-gl.o: $(UTILS_SRC)/usleep.h @@ -3578,7 +3602,7 @@ polytopes.o: $(HACK_SRC)/screenhackI.h polytopes.o: $(UTILS_SRC)/colors.h polytopes.o: $(UTILS_SRC)/erase.h polytopes.o: $(UTILS_SRC)/font-retry.h -polytopes.o: $(UTILS_SRC)/grabscreen.h +polytopes.o: $(UTILS_SRC)/grabclient.h polytopes.o: $(UTILS_SRC)/hsv.h polytopes.o: $(UTILS_SRC)/resources.h polytopes.o: $(UTILS_SRC)/usleep.h @@ -3597,7 +3621,7 @@ projectiveplane.o: $(HACK_SRC)/screenhackI.h projectiveplane.o: $(UTILS_SRC)/colors.h projectiveplane.o: $(UTILS_SRC)/erase.h projectiveplane.o: $(UTILS_SRC)/font-retry.h -projectiveplane.o: $(UTILS_SRC)/grabscreen.h +projectiveplane.o: $(UTILS_SRC)/grabclient.h projectiveplane.o: $(UTILS_SRC)/hsv.h projectiveplane.o: $(UTILS_SRC)/resources.h projectiveplane.o: $(UTILS_SRC)/usleep.h @@ -3614,7 +3638,7 @@ providence.o: $(HACK_SRC)/screenhackI.h providence.o: $(UTILS_SRC)/colors.h providence.o: $(UTILS_SRC)/erase.h providence.o: $(UTILS_SRC)/font-retry.h -providence.o: $(UTILS_SRC)/grabscreen.h +providence.o: $(UTILS_SRC)/grabclient.h providence.o: $(UTILS_SRC)/hsv.h providence.o: $(UTILS_SRC)/resources.h providence.o: $(UTILS_SRC)/usleep.h @@ -3630,7 +3654,7 @@ pulsar.o: $(HACK_SRC)/screenhackI.h pulsar.o: $(UTILS_SRC)/colors.h pulsar.o: $(UTILS_SRC)/erase.h pulsar.o: $(UTILS_SRC)/font-retry.h -pulsar.o: $(UTILS_SRC)/grabscreen.h +pulsar.o: $(UTILS_SRC)/grabclient.h pulsar.o: $(UTILS_SRC)/hsv.h pulsar.o: $(UTILS_SRC)/resources.h pulsar.o: $(UTILS_SRC)/usleep.h @@ -3648,7 +3672,7 @@ quasicrystal.o: $(HACK_SRC)/screenhackI.h quasicrystal.o: $(UTILS_SRC)/colors.h quasicrystal.o: $(UTILS_SRC)/erase.h quasicrystal.o: $(UTILS_SRC)/font-retry.h -quasicrystal.o: $(UTILS_SRC)/grabscreen.h +quasicrystal.o: $(UTILS_SRC)/grabclient.h quasicrystal.o: $(UTILS_SRC)/hsv.h quasicrystal.o: $(UTILS_SRC)/resources.h quasicrystal.o: $(UTILS_SRC)/usleep.h @@ -3666,7 +3690,7 @@ queens.o: $(HACK_SRC)/screenhackI.h queens.o: $(UTILS_SRC)/colors.h queens.o: $(UTILS_SRC)/erase.h queens.o: $(UTILS_SRC)/font-retry.h -queens.o: $(UTILS_SRC)/grabscreen.h +queens.o: $(UTILS_SRC)/grabclient.h queens.o: $(UTILS_SRC)/hsv.h queens.o: $(UTILS_SRC)/resources.h queens.o: $(UTILS_SRC)/usleep.h @@ -3682,7 +3706,7 @@ quickhull.o: $(HACK_SRC)/recanim.h quickhull.o: $(HACK_SRC)/screenhackI.h quickhull.o: $(UTILS_SRC)/colors.h quickhull.o: $(UTILS_SRC)/font-retry.h -quickhull.o: $(UTILS_SRC)/grabscreen.h +quickhull.o: $(UTILS_SRC)/grabclient.h quickhull.o: $(UTILS_SRC)/hsv.h quickhull.o: $(UTILS_SRC)/resources.h quickhull.o: $(UTILS_SRC)/usleep.h @@ -3698,7 +3722,7 @@ raverhoop.o: $(HACK_SRC)/screenhackI.h raverhoop.o: $(UTILS_SRC)/colors.h raverhoop.o: $(UTILS_SRC)/erase.h raverhoop.o: $(UTILS_SRC)/font-retry.h -raverhoop.o: $(UTILS_SRC)/grabscreen.h +raverhoop.o: $(UTILS_SRC)/grabclient.h raverhoop.o: $(UTILS_SRC)/hsv.h raverhoop.o: $(UTILS_SRC)/resources.h raverhoop.o: $(UTILS_SRC)/usleep.h @@ -3716,7 +3740,7 @@ razzledazzle.o: $(HACK_SRC)/screenhackI.h razzledazzle.o: $(UTILS_SRC)/colors.h razzledazzle.o: $(UTILS_SRC)/erase.h razzledazzle.o: $(UTILS_SRC)/font-retry.h -razzledazzle.o: $(UTILS_SRC)/grabscreen.h +razzledazzle.o: $(UTILS_SRC)/grabclient.h razzledazzle.o: $(UTILS_SRC)/hsv.h razzledazzle.o: $(UTILS_SRC)/resources.h razzledazzle.o: $(UTILS_SRC)/usleep.h @@ -3733,7 +3757,7 @@ robot.o: $(HACK_SRC)/screenhackI.h robot.o: $(UTILS_SRC)/colors.h robot.o: $(UTILS_SRC)/erase.h robot.o: $(UTILS_SRC)/font-retry.h -robot.o: $(UTILS_SRC)/grabscreen.h +robot.o: $(UTILS_SRC)/grabclient.h robot.o: $(UTILS_SRC)/hsv.h robot.o: $(UTILS_SRC)/resources.h robot.o: $(UTILS_SRC)/usleep.h @@ -3749,7 +3773,7 @@ robot-wireframe.o: $(HACK_SRC)/screenhackI.h robot-wireframe.o: $(UTILS_SRC)/colors.h robot-wireframe.o: $(UTILS_SRC)/erase.h robot-wireframe.o: $(UTILS_SRC)/font-retry.h -robot-wireframe.o: $(UTILS_SRC)/grabscreen.h +robot-wireframe.o: $(UTILS_SRC)/grabclient.h robot-wireframe.o: $(UTILS_SRC)/hsv.h robot-wireframe.o: $(UTILS_SRC)/resources.h robot-wireframe.o: $(UTILS_SRC)/usleep.h @@ -3767,7 +3791,7 @@ romanboy.o: $(HACK_SRC)/screenhackI.h romanboy.o: $(UTILS_SRC)/colors.h romanboy.o: $(UTILS_SRC)/erase.h romanboy.o: $(UTILS_SRC)/font-retry.h -romanboy.o: $(UTILS_SRC)/grabscreen.h +romanboy.o: $(UTILS_SRC)/grabclient.h romanboy.o: $(UTILS_SRC)/hsv.h romanboy.o: $(UTILS_SRC)/resources.h romanboy.o: $(UTILS_SRC)/usleep.h @@ -3788,7 +3812,7 @@ rubikblocks.o: $(HACK_SRC)/screenhackI.h rubikblocks.o: $(UTILS_SRC)/colors.h rubikblocks.o: $(UTILS_SRC)/erase.h rubikblocks.o: $(UTILS_SRC)/font-retry.h -rubikblocks.o: $(UTILS_SRC)/grabscreen.h +rubikblocks.o: $(UTILS_SRC)/grabclient.h rubikblocks.o: $(UTILS_SRC)/hsv.h rubikblocks.o: $(UTILS_SRC)/resources.h rubikblocks.o: $(UTILS_SRC)/usleep.h @@ -3805,7 +3829,7 @@ rubik.o: $(HACK_SRC)/screenhackI.h rubik.o: $(UTILS_SRC)/colors.h rubik.o: $(UTILS_SRC)/erase.h rubik.o: $(UTILS_SRC)/font-retry.h -rubik.o: $(UTILS_SRC)/grabscreen.h +rubik.o: $(UTILS_SRC)/grabclient.h rubik.o: $(UTILS_SRC)/hsv.h rubik.o: $(UTILS_SRC)/resources.h rubik.o: $(UTILS_SRC)/usleep.h @@ -3822,7 +3846,7 @@ s1_1.o: $(HACK_SRC)/screenhackI.h s1_1.o: $(UTILS_SRC)/colors.h s1_1.o: $(UTILS_SRC)/erase.h s1_1.o: $(UTILS_SRC)/font-retry.h -s1_1.o: $(UTILS_SRC)/grabscreen.h +s1_1.o: $(UTILS_SRC)/grabclient.h s1_1.o: $(UTILS_SRC)/hsv.h s1_1.o: $(UTILS_SRC)/resources.h s1_1.o: $(UTILS_SRC)/usleep.h @@ -3838,7 +3862,7 @@ s1_2.o: $(HACK_SRC)/screenhackI.h s1_2.o: $(UTILS_SRC)/colors.h s1_2.o: $(UTILS_SRC)/erase.h s1_2.o: $(UTILS_SRC)/font-retry.h -s1_2.o: $(UTILS_SRC)/grabscreen.h +s1_2.o: $(UTILS_SRC)/grabclient.h s1_2.o: $(UTILS_SRC)/hsv.h s1_2.o: $(UTILS_SRC)/resources.h s1_2.o: $(UTILS_SRC)/usleep.h @@ -3854,7 +3878,7 @@ s1_3.o: $(HACK_SRC)/screenhackI.h s1_3.o: $(UTILS_SRC)/colors.h s1_3.o: $(UTILS_SRC)/erase.h s1_3.o: $(UTILS_SRC)/font-retry.h -s1_3.o: $(UTILS_SRC)/grabscreen.h +s1_3.o: $(UTILS_SRC)/grabclient.h s1_3.o: $(UTILS_SRC)/hsv.h s1_3.o: $(UTILS_SRC)/resources.h s1_3.o: $(UTILS_SRC)/usleep.h @@ -3870,7 +3894,7 @@ s1_4.o: $(HACK_SRC)/screenhackI.h s1_4.o: $(UTILS_SRC)/colors.h s1_4.o: $(UTILS_SRC)/erase.h s1_4.o: $(UTILS_SRC)/font-retry.h -s1_4.o: $(UTILS_SRC)/grabscreen.h +s1_4.o: $(UTILS_SRC)/grabclient.h s1_4.o: $(UTILS_SRC)/hsv.h s1_4.o: $(UTILS_SRC)/resources.h s1_4.o: $(UTILS_SRC)/usleep.h @@ -3886,7 +3910,7 @@ s1_5.o: $(HACK_SRC)/screenhackI.h s1_5.o: $(UTILS_SRC)/colors.h s1_5.o: $(UTILS_SRC)/erase.h s1_5.o: $(UTILS_SRC)/font-retry.h -s1_5.o: $(UTILS_SRC)/grabscreen.h +s1_5.o: $(UTILS_SRC)/grabclient.h s1_5.o: $(UTILS_SRC)/hsv.h s1_5.o: $(UTILS_SRC)/resources.h s1_5.o: $(UTILS_SRC)/usleep.h @@ -3902,7 +3926,7 @@ s1_6.o: $(HACK_SRC)/screenhackI.h s1_6.o: $(UTILS_SRC)/colors.h s1_6.o: $(UTILS_SRC)/erase.h s1_6.o: $(UTILS_SRC)/font-retry.h -s1_6.o: $(UTILS_SRC)/grabscreen.h +s1_6.o: $(UTILS_SRC)/grabclient.h s1_6.o: $(UTILS_SRC)/hsv.h s1_6.o: $(UTILS_SRC)/resources.h s1_6.o: $(UTILS_SRC)/usleep.h @@ -3918,7 +3942,7 @@ s1_b.o: $(HACK_SRC)/screenhackI.h s1_b.o: $(UTILS_SRC)/colors.h s1_b.o: $(UTILS_SRC)/erase.h s1_b.o: $(UTILS_SRC)/font-retry.h -s1_b.o: $(UTILS_SRC)/grabscreen.h +s1_b.o: $(UTILS_SRC)/grabclient.h s1_b.o: $(UTILS_SRC)/hsv.h s1_b.o: $(UTILS_SRC)/resources.h s1_b.o: $(UTILS_SRC)/usleep.h @@ -3936,7 +3960,7 @@ sballs.o: $(HACK_SRC)/screenhackI.h sballs.o: $(UTILS_SRC)/colors.h sballs.o: $(UTILS_SRC)/erase.h sballs.o: $(UTILS_SRC)/font-retry.h -sballs.o: $(UTILS_SRC)/grabscreen.h +sballs.o: $(UTILS_SRC)/grabclient.h sballs.o: $(UTILS_SRC)/hsv.h sballs.o: $(UTILS_SRC)/resources.h sballs.o: $(UTILS_SRC)/usleep.h @@ -3954,7 +3978,7 @@ seccam.o: $(HACK_SRC)/screenhackI.h seccam.o: $(UTILS_SRC)/colors.h seccam.o: $(UTILS_SRC)/erase.h seccam.o: $(UTILS_SRC)/font-retry.h -seccam.o: $(UTILS_SRC)/grabscreen.h +seccam.o: $(UTILS_SRC)/grabclient.h seccam.o: $(UTILS_SRC)/hsv.h seccam.o: $(UTILS_SRC)/resources.h seccam.o: $(UTILS_SRC)/usleep.h @@ -3970,7 +3994,7 @@ shark.o: $(HACK_SRC)/screenhackI.h shark.o: $(UTILS_SRC)/colors.h shark.o: $(UTILS_SRC)/erase.h shark.o: $(UTILS_SRC)/font-retry.h -shark.o: $(UTILS_SRC)/grabscreen.h +shark.o: $(UTILS_SRC)/grabclient.h shark.o: $(UTILS_SRC)/hsv.h shark.o: $(UTILS_SRC)/resources.h shark.o: $(UTILS_SRC)/usleep.h @@ -3986,7 +4010,7 @@ ships.o: $(HACK_SRC)/screenhackI.h ships.o: $(UTILS_SRC)/colors.h ships.o: $(UTILS_SRC)/erase.h ships.o: $(UTILS_SRC)/font-retry.h -ships.o: $(UTILS_SRC)/grabscreen.h +ships.o: $(UTILS_SRC)/grabclient.h ships.o: $(UTILS_SRC)/hsv.h ships.o: $(UTILS_SRC)/resources.h ships.o: $(UTILS_SRC)/usleep.h @@ -4003,7 +4027,7 @@ sierpinski3d.o: $(HACK_SRC)/screenhackI.h sierpinski3d.o: $(UTILS_SRC)/colors.h sierpinski3d.o: $(UTILS_SRC)/erase.h sierpinski3d.o: $(UTILS_SRC)/font-retry.h -sierpinski3d.o: $(UTILS_SRC)/grabscreen.h +sierpinski3d.o: $(UTILS_SRC)/grabclient.h sierpinski3d.o: $(UTILS_SRC)/hsv.h sierpinski3d.o: $(UTILS_SRC)/resources.h sierpinski3d.o: $(UTILS_SRC)/usleep.h @@ -4023,7 +4047,7 @@ skytentacles.o: $(HACK_SRC)/screenhackI.h skytentacles.o: $(UTILS_SRC)/colors.h skytentacles.o: $(UTILS_SRC)/erase.h skytentacles.o: $(UTILS_SRC)/font-retry.h -skytentacles.o: $(UTILS_SRC)/grabscreen.h +skytentacles.o: $(UTILS_SRC)/grabclient.h skytentacles.o: $(UTILS_SRC)/hsv.h skytentacles.o: $(UTILS_SRC)/resources.h skytentacles.o: $(UTILS_SRC)/usleep.h @@ -4042,7 +4066,7 @@ sonar-icmp.o: $(UTILS_SRC)/aligned_malloc.h sonar-icmp.o: $(UTILS_SRC)/async_netdb.h sonar-icmp.o: $(UTILS_SRC)/colors.h sonar-icmp.o: $(UTILS_SRC)/font-retry.h -sonar-icmp.o: $(UTILS_SRC)/grabscreen.h +sonar-icmp.o: $(UTILS_SRC)/grabclient.h sonar-icmp.o: $(UTILS_SRC)/hsv.h sonar-icmp.o: $(UTILS_SRC)/resources.h sonar-icmp.o: $(UTILS_SRC)/thread_util.h @@ -4063,7 +4087,7 @@ sonar.o: $(UTILS_SRC)/aligned_malloc.h sonar.o: $(UTILS_SRC)/colors.h sonar.o: $(UTILS_SRC)/erase.h sonar.o: $(UTILS_SRC)/font-retry.h -sonar.o: $(UTILS_SRC)/grabscreen.h +sonar.o: $(UTILS_SRC)/grabclient.h sonar.o: $(UTILS_SRC)/hsv.h sonar.o: $(UTILS_SRC)/resources.h sonar.o: $(UTILS_SRC)/thread_util.h @@ -4080,7 +4104,7 @@ sonar-sim.o: $(HACK_SRC)/screenhackI.h sonar-sim.o: $(srcdir)/sonar.h sonar-sim.o: $(UTILS_SRC)/colors.h sonar-sim.o: $(UTILS_SRC)/font-retry.h -sonar-sim.o: $(UTILS_SRC)/grabscreen.h +sonar-sim.o: $(UTILS_SRC)/grabclient.h sonar-sim.o: $(UTILS_SRC)/hsv.h sonar-sim.o: $(UTILS_SRC)/resources.h sonar-sim.o: $(UTILS_SRC)/usleep.h @@ -4097,7 +4121,7 @@ sphereeversion-analytic.o: $(srcdir)/sphereeversion.h sphereeversion-analytic.o: $(UTILS_SRC)/colors.h sphereeversion-analytic.o: $(UTILS_SRC)/erase.h sphereeversion-analytic.o: $(UTILS_SRC)/font-retry.h -sphereeversion-analytic.o: $(UTILS_SRC)/grabscreen.h +sphereeversion-analytic.o: $(UTILS_SRC)/grabclient.h sphereeversion-analytic.o: $(UTILS_SRC)/hsv.h sphereeversion-analytic.o: $(UTILS_SRC)/resources.h sphereeversion-analytic.o: $(UTILS_SRC)/usleep.h @@ -4116,7 +4140,7 @@ sphereeversion-corrugations.o: $(srcdir)/sphereeversion.h sphereeversion-corrugations.o: $(UTILS_SRC)/colors.h sphereeversion-corrugations.o: $(UTILS_SRC)/erase.h sphereeversion-corrugations.o: $(UTILS_SRC)/font-retry.h -sphereeversion-corrugations.o: $(UTILS_SRC)/grabscreen.h +sphereeversion-corrugations.o: $(UTILS_SRC)/grabclient.h sphereeversion-corrugations.o: $(UTILS_SRC)/hsv.h sphereeversion-corrugations.o: $(UTILS_SRC)/resources.h sphereeversion-corrugations.o: $(UTILS_SRC)/usleep.h @@ -4138,7 +4162,7 @@ sphereeversion.o: $(srcdir)/sphereeversion.h sphereeversion.o: $(UTILS_SRC)/colors.h sphereeversion.o: $(UTILS_SRC)/erase.h sphereeversion.o: $(UTILS_SRC)/font-retry.h -sphereeversion.o: $(UTILS_SRC)/grabscreen.h +sphereeversion.o: $(UTILS_SRC)/grabclient.h sphereeversion.o: $(UTILS_SRC)/hsv.h sphereeversion.o: $(UTILS_SRC)/resources.h sphereeversion.o: $(UTILS_SRC)/usleep.h @@ -4159,7 +4183,7 @@ spheremonics.o: $(srcdir)/texfont.h spheremonics.o: $(UTILS_SRC)/colors.h spheremonics.o: $(UTILS_SRC)/erase.h spheremonics.o: $(UTILS_SRC)/font-retry.h -spheremonics.o: $(UTILS_SRC)/grabscreen.h +spheremonics.o: $(UTILS_SRC)/grabclient.h spheremonics.o: $(UTILS_SRC)/hsv.h spheremonics.o: $(UTILS_SRC)/resources.h spheremonics.o: $(UTILS_SRC)/usleep.h @@ -4175,7 +4199,7 @@ sphere.o: $(HACK_SRC)/screenhackI.h sphere.o: $(srcdir)/sphere.h sphere.o: $(UTILS_SRC)/colors.h sphere.o: $(UTILS_SRC)/font-retry.h -sphere.o: $(UTILS_SRC)/grabscreen.h +sphere.o: $(UTILS_SRC)/grabclient.h sphere.o: $(UTILS_SRC)/hsv.h sphere.o: $(UTILS_SRC)/resources.h sphere.o: $(UTILS_SRC)/usleep.h @@ -4193,7 +4217,7 @@ splitflap.o: $(srcdir)/texfont.h splitflap.o: $(UTILS_SRC)/colors.h splitflap.o: $(UTILS_SRC)/erase.h splitflap.o: $(UTILS_SRC)/font-retry.h -splitflap.o: $(UTILS_SRC)/grabscreen.h +splitflap.o: $(UTILS_SRC)/grabclient.h splitflap.o: $(UTILS_SRC)/hsv.h splitflap.o: $(UTILS_SRC)/resources.h splitflap.o: $(UTILS_SRC)/textclient.h @@ -4213,7 +4237,7 @@ splitflap_obj.o: $(HACK_SRC)/screenhackI.h splitflap_obj.o: $(UTILS_SRC)/colors.h splitflap_obj.o: $(UTILS_SRC)/erase.h splitflap_obj.o: $(UTILS_SRC)/font-retry.h -splitflap_obj.o: $(UTILS_SRC)/grabscreen.h +splitflap_obj.o: $(UTILS_SRC)/grabclient.h splitflap_obj.o: $(UTILS_SRC)/hsv.h splitflap_obj.o: $(UTILS_SRC)/resources.h splitflap_obj.o: $(UTILS_SRC)/usleep.h @@ -4231,7 +4255,7 @@ splodesic.o: $(HACK_SRC)/screenhackI.h splodesic.o: $(UTILS_SRC)/colors.h splodesic.o: $(UTILS_SRC)/erase.h splodesic.o: $(UTILS_SRC)/font-retry.h -splodesic.o: $(UTILS_SRC)/grabscreen.h +splodesic.o: $(UTILS_SRC)/grabclient.h splodesic.o: $(UTILS_SRC)/hsv.h splodesic.o: $(UTILS_SRC)/resources.h splodesic.o: $(UTILS_SRC)/usleep.h @@ -4249,7 +4273,7 @@ sproingies.o: $(srcdir)/sproingies.h sproingies.o: $(UTILS_SRC)/colors.h sproingies.o: $(UTILS_SRC)/erase.h sproingies.o: $(UTILS_SRC)/font-retry.h -sproingies.o: $(UTILS_SRC)/grabscreen.h +sproingies.o: $(UTILS_SRC)/grabclient.h sproingies.o: $(UTILS_SRC)/hsv.h sproingies.o: $(UTILS_SRC)/resources.h sproingies.o: $(UTILS_SRC)/usleep.h @@ -4265,7 +4289,7 @@ sproingiewrap.o: $(srcdir)/sproingies.h sproingiewrap.o: $(UTILS_SRC)/colors.h sproingiewrap.o: $(UTILS_SRC)/erase.h sproingiewrap.o: $(UTILS_SRC)/font-retry.h -sproingiewrap.o: $(UTILS_SRC)/grabscreen.h +sproingiewrap.o: $(UTILS_SRC)/grabclient.h sproingiewrap.o: $(UTILS_SRC)/hsv.h sproingiewrap.o: $(UTILS_SRC)/resources.h sproingiewrap.o: $(UTILS_SRC)/usleep.h @@ -4283,7 +4307,7 @@ squirtorus.o: $(HACK_SRC)/screenhackI.h squirtorus.o: $(UTILS_SRC)/colors.h squirtorus.o: $(UTILS_SRC)/erase.h squirtorus.o: $(UTILS_SRC)/font-retry.h -squirtorus.o: $(UTILS_SRC)/grabscreen.h +squirtorus.o: $(UTILS_SRC)/grabclient.h squirtorus.o: $(UTILS_SRC)/hsv.h squirtorus.o: $(UTILS_SRC)/resources.h squirtorus.o: $(UTILS_SRC)/spline.h @@ -4303,7 +4327,7 @@ stairs.o: $(srcdir)/sphere.h stairs.o: $(UTILS_SRC)/colors.h stairs.o: $(UTILS_SRC)/erase.h stairs.o: $(UTILS_SRC)/font-retry.h -stairs.o: $(UTILS_SRC)/grabscreen.h +stairs.o: $(UTILS_SRC)/grabclient.h stairs.o: $(UTILS_SRC)/hsv.h stairs.o: $(UTILS_SRC)/resources.h stairs.o: $(UTILS_SRC)/usleep.h @@ -4324,7 +4348,7 @@ starwars.o: $(srcdir)/texfont.h starwars.o: $(UTILS_SRC)/colors.h starwars.o: $(UTILS_SRC)/erase.h starwars.o: $(UTILS_SRC)/font-retry.h -starwars.o: $(UTILS_SRC)/grabscreen.h +starwars.o: $(UTILS_SRC)/grabclient.h starwars.o: $(UTILS_SRC)/hsv.h starwars.o: $(UTILS_SRC)/resources.h starwars.o: $(UTILS_SRC)/textclient.h @@ -4351,7 +4375,7 @@ stonerview.o: $(srcdir)/stonerview-osc.h stonerview.o: $(UTILS_SRC)/colors.h stonerview.o: $(UTILS_SRC)/erase.h stonerview.o: $(UTILS_SRC)/font-retry.h -stonerview.o: $(UTILS_SRC)/grabscreen.h +stonerview.o: $(UTILS_SRC)/grabclient.h stonerview.o: $(UTILS_SRC)/hsv.h stonerview.o: $(UTILS_SRC)/resources.h stonerview.o: $(UTILS_SRC)/usleep.h @@ -4374,7 +4398,7 @@ stonerview-view.o: $(srcdir)/stonerview-move.h stonerview-view.o: $(srcdir)/stonerview-osc.h stonerview-view.o: $(UTILS_SRC)/colors.h stonerview-view.o: $(UTILS_SRC)/font-retry.h -stonerview-view.o: $(UTILS_SRC)/grabscreen.h +stonerview-view.o: $(UTILS_SRC)/grabclient.h stonerview-view.o: $(UTILS_SRC)/hsv.h stonerview-view.o: $(UTILS_SRC)/resources.h stonerview-view.o: $(UTILS_SRC)/usleep.h @@ -4388,7 +4412,7 @@ superquadrics.o: $(HACK_SRC)/screenhackI.h superquadrics.o: $(UTILS_SRC)/colors.h superquadrics.o: $(UTILS_SRC)/erase.h superquadrics.o: $(UTILS_SRC)/font-retry.h -superquadrics.o: $(UTILS_SRC)/grabscreen.h +superquadrics.o: $(UTILS_SRC)/grabclient.h superquadrics.o: $(UTILS_SRC)/hsv.h superquadrics.o: $(UTILS_SRC)/resources.h superquadrics.o: $(UTILS_SRC)/usleep.h @@ -4406,7 +4430,7 @@ surfaces.o: $(HACK_SRC)/screenhackI.h surfaces.o: $(UTILS_SRC)/colors.h surfaces.o: $(UTILS_SRC)/erase.h surfaces.o: $(UTILS_SRC)/font-retry.h -surfaces.o: $(UTILS_SRC)/grabscreen.h +surfaces.o: $(UTILS_SRC)/grabclient.h surfaces.o: $(UTILS_SRC)/hsv.h surfaces.o: $(UTILS_SRC)/resources.h surfaces.o: $(UTILS_SRC)/usleep.h @@ -4423,7 +4447,7 @@ swim.o: $(HACK_SRC)/screenhackI.h swim.o: $(UTILS_SRC)/colors.h swim.o: $(UTILS_SRC)/erase.h swim.o: $(UTILS_SRC)/font-retry.h -swim.o: $(UTILS_SRC)/grabscreen.h +swim.o: $(UTILS_SRC)/grabclient.h swim.o: $(UTILS_SRC)/hsv.h swim.o: $(UTILS_SRC)/resources.h swim.o: $(UTILS_SRC)/usleep.h @@ -4440,7 +4464,7 @@ tangram.o: $(srcdir)/texfont.h tangram.o: $(UTILS_SRC)/colors.h tangram.o: $(UTILS_SRC)/erase.h tangram.o: $(UTILS_SRC)/font-retry.h -tangram.o: $(UTILS_SRC)/grabscreen.h +tangram.o: $(UTILS_SRC)/grabclient.h tangram.o: $(UTILS_SRC)/hsv.h tangram.o: $(UTILS_SRC)/resources.h tangram.o: $(UTILS_SRC)/usleep.h @@ -4456,7 +4480,7 @@ tangram_shapes.o: $(HACK_SRC)/screenhackI.h tangram_shapes.o: $(srcdir)/tangram_shapes.h tangram_shapes.o: $(UTILS_SRC)/colors.h tangram_shapes.o: $(UTILS_SRC)/font-retry.h -tangram_shapes.o: $(UTILS_SRC)/grabscreen.h +tangram_shapes.o: $(UTILS_SRC)/grabclient.h tangram_shapes.o: $(UTILS_SRC)/hsv.h tangram_shapes.o: $(UTILS_SRC)/resources.h tangram_shapes.o: $(UTILS_SRC)/usleep.h @@ -4470,7 +4494,7 @@ teapot.o: $(HACK_SRC)/screenhackI.h teapot.o: $(srcdir)/teapot.h teapot.o: $(UTILS_SRC)/colors.h teapot.o: $(UTILS_SRC)/font-retry.h -teapot.o: $(UTILS_SRC)/grabscreen.h +teapot.o: $(UTILS_SRC)/grabclient.h teapot.o: $(UTILS_SRC)/hsv.h teapot.o: $(UTILS_SRC)/resources.h teapot.o: $(UTILS_SRC)/usleep.h @@ -4485,7 +4509,7 @@ teeth_model.o: $(HACK_SRC)/screenhackI.h teeth_model.o: $(UTILS_SRC)/colors.h teeth_model.o: $(UTILS_SRC)/erase.h teeth_model.o: $(UTILS_SRC)/font-retry.h -teeth_model.o: $(UTILS_SRC)/grabscreen.h +teeth_model.o: $(UTILS_SRC)/grabclient.h teeth_model.o: $(UTILS_SRC)/hsv.h teeth_model.o: $(UTILS_SRC)/resources.h teeth_model.o: $(UTILS_SRC)/usleep.h @@ -4501,7 +4525,7 @@ texfont.o: $(HACK_SRC)/screenhackI.h texfont.o: $(srcdir)/texfont.h texfont.o: $(UTILS_SRC)/colors.h texfont.o: $(UTILS_SRC)/font-retry.h -texfont.o: $(UTILS_SRC)/grabscreen.h +texfont.o: $(UTILS_SRC)/grabclient.h texfont.o: $(UTILS_SRC)/hsv.h texfont.o: $(UTILS_SRC)/pow2.h texfont.o: $(UTILS_SRC)/resources.h @@ -4525,7 +4549,7 @@ timetunnel.o: $(HACK_SRC)/screenhackI.h timetunnel.o: $(UTILS_SRC)/colors.h timetunnel.o: $(UTILS_SRC)/erase.h timetunnel.o: $(UTILS_SRC)/font-retry.h -timetunnel.o: $(UTILS_SRC)/grabscreen.h +timetunnel.o: $(UTILS_SRC)/grabclient.h timetunnel.o: $(UTILS_SRC)/hsv.h timetunnel.o: $(UTILS_SRC)/resources.h timetunnel.o: $(UTILS_SRC)/usleep.h @@ -4543,7 +4567,7 @@ timezones.o: $(HACK_SRC)/screenhackI.h timezones.o: $(UTILS_SRC)/colors.h timezones.o: $(UTILS_SRC)/erase.h timezones.o: $(UTILS_SRC)/font-retry.h -timezones.o: $(UTILS_SRC)/grabscreen.h +timezones.o: $(UTILS_SRC)/grabclient.h timezones.o: $(UTILS_SRC)/hsv.h timezones.o: $(UTILS_SRC)/resources.h timezones.o: $(UTILS_SRC)/usleep.h @@ -4559,7 +4583,7 @@ toast2.o: $(HACK_SRC)/screenhackI.h toast2.o: $(UTILS_SRC)/colors.h toast2.o: $(UTILS_SRC)/erase.h toast2.o: $(UTILS_SRC)/font-retry.h -toast2.o: $(UTILS_SRC)/grabscreen.h +toast2.o: $(UTILS_SRC)/grabclient.h toast2.o: $(UTILS_SRC)/hsv.h toast2.o: $(UTILS_SRC)/resources.h toast2.o: $(UTILS_SRC)/usleep.h @@ -4575,7 +4599,7 @@ toaster_base.o: $(HACK_SRC)/screenhackI.h toaster_base.o: $(UTILS_SRC)/colors.h toaster_base.o: $(UTILS_SRC)/erase.h toaster_base.o: $(UTILS_SRC)/font-retry.h -toaster_base.o: $(UTILS_SRC)/grabscreen.h +toaster_base.o: $(UTILS_SRC)/grabclient.h toaster_base.o: $(UTILS_SRC)/hsv.h toaster_base.o: $(UTILS_SRC)/resources.h toaster_base.o: $(UTILS_SRC)/usleep.h @@ -4591,7 +4615,7 @@ toaster_handle2.o: $(HACK_SRC)/screenhackI.h toaster_handle2.o: $(UTILS_SRC)/colors.h toaster_handle2.o: $(UTILS_SRC)/erase.h toaster_handle2.o: $(UTILS_SRC)/font-retry.h -toaster_handle2.o: $(UTILS_SRC)/grabscreen.h +toaster_handle2.o: $(UTILS_SRC)/grabclient.h toaster_handle2.o: $(UTILS_SRC)/hsv.h toaster_handle2.o: $(UTILS_SRC)/resources.h toaster_handle2.o: $(UTILS_SRC)/usleep.h @@ -4607,7 +4631,7 @@ toaster_handle.o: $(HACK_SRC)/screenhackI.h toaster_handle.o: $(UTILS_SRC)/colors.h toaster_handle.o: $(UTILS_SRC)/erase.h toaster_handle.o: $(UTILS_SRC)/font-retry.h -toaster_handle.o: $(UTILS_SRC)/grabscreen.h +toaster_handle.o: $(UTILS_SRC)/grabclient.h toaster_handle.o: $(UTILS_SRC)/hsv.h toaster_handle.o: $(UTILS_SRC)/resources.h toaster_handle.o: $(UTILS_SRC)/usleep.h @@ -4623,7 +4647,7 @@ toaster_jet.o: $(HACK_SRC)/screenhackI.h toaster_jet.o: $(UTILS_SRC)/colors.h toaster_jet.o: $(UTILS_SRC)/erase.h toaster_jet.o: $(UTILS_SRC)/font-retry.h -toaster_jet.o: $(UTILS_SRC)/grabscreen.h +toaster_jet.o: $(UTILS_SRC)/grabclient.h toaster_jet.o: $(UTILS_SRC)/hsv.h toaster_jet.o: $(UTILS_SRC)/resources.h toaster_jet.o: $(UTILS_SRC)/usleep.h @@ -4639,7 +4663,7 @@ toaster_knob.o: $(HACK_SRC)/screenhackI.h toaster_knob.o: $(UTILS_SRC)/colors.h toaster_knob.o: $(UTILS_SRC)/erase.h toaster_knob.o: $(UTILS_SRC)/font-retry.h -toaster_knob.o: $(UTILS_SRC)/grabscreen.h +toaster_knob.o: $(UTILS_SRC)/grabclient.h toaster_knob.o: $(UTILS_SRC)/hsv.h toaster_knob.o: $(UTILS_SRC)/resources.h toaster_knob.o: $(UTILS_SRC)/usleep.h @@ -4655,7 +4679,7 @@ toaster.o: $(HACK_SRC)/screenhackI.h toaster.o: $(UTILS_SRC)/colors.h toaster.o: $(UTILS_SRC)/erase.h toaster.o: $(UTILS_SRC)/font-retry.h -toaster.o: $(UTILS_SRC)/grabscreen.h +toaster.o: $(UTILS_SRC)/grabclient.h toaster.o: $(UTILS_SRC)/hsv.h toaster.o: $(UTILS_SRC)/resources.h toaster.o: $(UTILS_SRC)/usleep.h @@ -4671,7 +4695,7 @@ toaster_slots.o: $(HACK_SRC)/screenhackI.h toaster_slots.o: $(UTILS_SRC)/colors.h toaster_slots.o: $(UTILS_SRC)/erase.h toaster_slots.o: $(UTILS_SRC)/font-retry.h -toaster_slots.o: $(UTILS_SRC)/grabscreen.h +toaster_slots.o: $(UTILS_SRC)/grabclient.h toaster_slots.o: $(UTILS_SRC)/hsv.h toaster_slots.o: $(UTILS_SRC)/resources.h toaster_slots.o: $(UTILS_SRC)/usleep.h @@ -4687,7 +4711,7 @@ toaster_wing.o: $(HACK_SRC)/screenhackI.h toaster_wing.o: $(UTILS_SRC)/colors.h toaster_wing.o: $(UTILS_SRC)/erase.h toaster_wing.o: $(UTILS_SRC)/font-retry.h -toaster_wing.o: $(UTILS_SRC)/grabscreen.h +toaster_wing.o: $(UTILS_SRC)/grabclient.h toaster_wing.o: $(UTILS_SRC)/hsv.h toaster_wing.o: $(UTILS_SRC)/resources.h toaster_wing.o: $(UTILS_SRC)/usleep.h @@ -4703,7 +4727,7 @@ toast.o: $(HACK_SRC)/screenhackI.h toast.o: $(UTILS_SRC)/colors.h toast.o: $(UTILS_SRC)/erase.h toast.o: $(UTILS_SRC)/font-retry.h -toast.o: $(UTILS_SRC)/grabscreen.h +toast.o: $(UTILS_SRC)/grabclient.h toast.o: $(UTILS_SRC)/hsv.h toast.o: $(UTILS_SRC)/resources.h toast.o: $(UTILS_SRC)/usleep.h @@ -4722,7 +4746,7 @@ topblock.o: $(srcdir)/tube.h topblock.o: $(UTILS_SRC)/colors.h topblock.o: $(UTILS_SRC)/erase.h topblock.o: $(UTILS_SRC)/font-retry.h -topblock.o: $(UTILS_SRC)/grabscreen.h +topblock.o: $(UTILS_SRC)/grabclient.h topblock.o: $(UTILS_SRC)/hsv.h topblock.o: $(UTILS_SRC)/resources.h topblock.o: $(UTILS_SRC)/usleep.h @@ -4741,7 +4765,7 @@ tronbit_idle1.o: $(HACK_SRC)/screenhackI.h tronbit_idle1.o: $(UTILS_SRC)/colors.h tronbit_idle1.o: $(UTILS_SRC)/erase.h tronbit_idle1.o: $(UTILS_SRC)/font-retry.h -tronbit_idle1.o: $(UTILS_SRC)/grabscreen.h +tronbit_idle1.o: $(UTILS_SRC)/grabclient.h tronbit_idle1.o: $(UTILS_SRC)/hsv.h tronbit_idle1.o: $(UTILS_SRC)/resources.h tronbit_idle1.o: $(UTILS_SRC)/usleep.h @@ -4757,7 +4781,7 @@ tronbit_idle2.o: $(HACK_SRC)/screenhackI.h tronbit_idle2.o: $(UTILS_SRC)/colors.h tronbit_idle2.o: $(UTILS_SRC)/erase.h tronbit_idle2.o: $(UTILS_SRC)/font-retry.h -tronbit_idle2.o: $(UTILS_SRC)/grabscreen.h +tronbit_idle2.o: $(UTILS_SRC)/grabclient.h tronbit_idle2.o: $(UTILS_SRC)/hsv.h tronbit_idle2.o: $(UTILS_SRC)/resources.h tronbit_idle2.o: $(UTILS_SRC)/usleep.h @@ -4773,7 +4797,7 @@ tronbit_no.o: $(HACK_SRC)/screenhackI.h tronbit_no.o: $(UTILS_SRC)/colors.h tronbit_no.o: $(UTILS_SRC)/erase.h tronbit_no.o: $(UTILS_SRC)/font-retry.h -tronbit_no.o: $(UTILS_SRC)/grabscreen.h +tronbit_no.o: $(UTILS_SRC)/grabclient.h tronbit_no.o: $(UTILS_SRC)/hsv.h tronbit_no.o: $(UTILS_SRC)/resources.h tronbit_no.o: $(UTILS_SRC)/usleep.h @@ -4792,7 +4816,7 @@ tronbit.o: $(srcdir)/sphere.h tronbit.o: $(UTILS_SRC)/colors.h tronbit.o: $(UTILS_SRC)/erase.h tronbit.o: $(UTILS_SRC)/font-retry.h -tronbit.o: $(UTILS_SRC)/grabscreen.h +tronbit.o: $(UTILS_SRC)/grabclient.h tronbit.o: $(UTILS_SRC)/hsv.h tronbit.o: $(UTILS_SRC)/resources.h tronbit.o: $(UTILS_SRC)/usleep.h @@ -4809,7 +4833,7 @@ tronbit_yes.o: $(HACK_SRC)/screenhackI.h tronbit_yes.o: $(UTILS_SRC)/colors.h tronbit_yes.o: $(UTILS_SRC)/erase.h tronbit_yes.o: $(UTILS_SRC)/font-retry.h -tronbit_yes.o: $(UTILS_SRC)/grabscreen.h +tronbit_yes.o: $(UTILS_SRC)/grabclient.h tronbit_yes.o: $(UTILS_SRC)/hsv.h tronbit_yes.o: $(UTILS_SRC)/resources.h tronbit_yes.o: $(UTILS_SRC)/usleep.h @@ -4824,7 +4848,7 @@ tube.o: $(HACK_SRC)/screenhackI.h tube.o: $(srcdir)/tube.h tube.o: $(UTILS_SRC)/colors.h tube.o: $(UTILS_SRC)/font-retry.h -tube.o: $(UTILS_SRC)/grabscreen.h +tube.o: $(UTILS_SRC)/grabclient.h tube.o: $(UTILS_SRC)/hsv.h tube.o: $(UTILS_SRC)/resources.h tube.o: $(UTILS_SRC)/usleep.h @@ -4838,7 +4862,7 @@ tunnel_draw.o: $(HACK_SRC)/screenhackI.h tunnel_draw.o: $(srcdir)/tunnel_draw.h tunnel_draw.o: $(UTILS_SRC)/colors.h tunnel_draw.o: $(UTILS_SRC)/font-retry.h -tunnel_draw.o: $(UTILS_SRC)/grabscreen.h +tunnel_draw.o: $(UTILS_SRC)/grabclient.h tunnel_draw.o: $(UTILS_SRC)/hsv.h tunnel_draw.o: $(UTILS_SRC)/resources.h tunnel_draw.o: $(UTILS_SRC)/usleep.h @@ -4855,7 +4879,7 @@ unicrud.o: $(srcdir)/texfont.h unicrud.o: $(UTILS_SRC)/colors.h unicrud.o: $(UTILS_SRC)/erase.h unicrud.o: $(UTILS_SRC)/font-retry.h -unicrud.o: $(UTILS_SRC)/grabscreen.h +unicrud.o: $(UTILS_SRC)/grabclient.h unicrud.o: $(UTILS_SRC)/hsv.h unicrud.o: $(UTILS_SRC)/resources.h unicrud.o: $(UTILS_SRC)/usleep.h @@ -4874,7 +4898,7 @@ unknownpleasures.o: $(HACK_SRC)/screenhackI.h unknownpleasures.o: $(UTILS_SRC)/colors.h unknownpleasures.o: $(UTILS_SRC)/erase.h unknownpleasures.o: $(UTILS_SRC)/font-retry.h -unknownpleasures.o: $(UTILS_SRC)/grabscreen.h +unknownpleasures.o: $(UTILS_SRC)/grabclient.h unknownpleasures.o: $(UTILS_SRC)/hsv.h unknownpleasures.o: $(UTILS_SRC)/resources.h unknownpleasures.o: $(UTILS_SRC)/usleep.h @@ -4894,7 +4918,7 @@ vigilance.o: $(HACK_SRC)/screenhackI.h vigilance.o: $(UTILS_SRC)/colors.h vigilance.o: $(UTILS_SRC)/erase.h vigilance.o: $(UTILS_SRC)/font-retry.h -vigilance.o: $(UTILS_SRC)/grabscreen.h +vigilance.o: $(UTILS_SRC)/grabclient.h vigilance.o: $(UTILS_SRC)/hsv.h vigilance.o: $(UTILS_SRC)/resources.h vigilance.o: $(UTILS_SRC)/usleep.h @@ -4911,7 +4935,7 @@ voronoi.o: $(HACK_SRC)/screenhackI.h voronoi.o: $(UTILS_SRC)/colors.h voronoi.o: $(UTILS_SRC)/erase.h voronoi.o: $(UTILS_SRC)/font-retry.h -voronoi.o: $(UTILS_SRC)/grabscreen.h +voronoi.o: $(UTILS_SRC)/grabclient.h voronoi.o: $(UTILS_SRC)/hsv.h voronoi.o: $(UTILS_SRC)/resources.h voronoi.o: $(UTILS_SRC)/usleep.h @@ -4928,7 +4952,7 @@ whale.o: $(HACK_SRC)/screenhackI.h whale.o: $(UTILS_SRC)/colors.h whale.o: $(UTILS_SRC)/erase.h whale.o: $(UTILS_SRC)/font-retry.h -whale.o: $(UTILS_SRC)/grabscreen.h +whale.o: $(UTILS_SRC)/grabclient.h whale.o: $(UTILS_SRC)/hsv.h whale.o: $(UTILS_SRC)/resources.h whale.o: $(UTILS_SRC)/usleep.h @@ -4949,7 +4973,7 @@ winduprobot.o: $(srcdir)/texfont.h winduprobot.o: $(UTILS_SRC)/colors.h winduprobot.o: $(UTILS_SRC)/erase.h winduprobot.o: $(UTILS_SRC)/font-retry.h -winduprobot.o: $(UTILS_SRC)/grabscreen.h +winduprobot.o: $(UTILS_SRC)/grabclient.h winduprobot.o: $(UTILS_SRC)/hsv.h winduprobot.o: $(UTILS_SRC)/resources.h winduprobot.o: $(UTILS_SRC)/textclient.h @@ -4968,7 +4992,7 @@ xlock-gl-utils.o: $(srcdir)/texfont.h xlock-gl-utils.o: $(UTILS_SRC)/colors.h xlock-gl-utils.o: $(UTILS_SRC)/erase.h xlock-gl-utils.o: $(UTILS_SRC)/font-retry.h -xlock-gl-utils.o: $(UTILS_SRC)/grabscreen.h +xlock-gl-utils.o: $(UTILS_SRC)/grabclient.h xlock-gl-utils.o: $(UTILS_SRC)/hsv.h xlock-gl-utils.o: $(UTILS_SRC)/resources.h xlock-gl-utils.o: $(UTILS_SRC)/usleep.h diff --git a/hacks/glx/atlantis.c b/hacks/glx/atlantis.c index 9002bba1..1b62a0d2 100644 --- a/hacks/glx/atlantis.c +++ b/hacks/glx/atlantis.c @@ -385,8 +385,8 @@ clear_tank (atlantisstruct * ap) if (do_gradient && !ap->wire) { - GLfloat top[4] = { 0.00, 0.40, 0.70, }; - GLfloat bot[4] = { 0.00, 0.05, 0.18, }; + GLfloat top[4] = { 0.0, 0.400, 0.70, }; + GLfloat bot[4] = { 0.0, 0.025, 0.09, }; glMatrixMode(GL_PROJECTION); glPushMatrix(); diff --git a/hacks/glx/b_draw.c b/hacks/glx/b_draw.c index 1b789b65..4aabd691 100644 --- a/hacks/glx/b_draw.c +++ b/hacks/glx/b_draw.c @@ -172,11 +172,15 @@ create_new_bubbles(draw_context * c) /* Create the bubble(s). */ for (i = 0; i < n; ++i) { if ((b[i] = glb_bubble_new(c->d, x, y, z, size, speed, scale_incr)) == 0) { +#if 0 /* Out of memory - recover. */ i--; while (i >= 0) glb_bubble_delete(b[i]); return 0; +#else + abort(); +#endif } /* Create the next bubble below the last bubble. */ y -= size * 3; diff --git a/hacks/glx/cubicgrid.c b/hacks/glx/cubicgrid.c index 9d7d2bab..8d14a5c5 100644 --- a/hacks/glx/cubicgrid.c +++ b/hacks/glx/cubicgrid.c @@ -162,11 +162,12 @@ static void init_gl(ModeInfo *mi) float i, j, k; float sqrt_3 = sqrtf(3.0f); float sqrt_6 = sqrtf(6.0f); + GLfloat ps = (bigdots ? 2.5 : 1); + + if (MI_WIDTH(mi) > 2560) ps *= 2; /* Retina displays */ + glPointSize(ps); glDrawBuffer(GL_BACK); - if(bigdots) { - glPointSize(2.5); - } glPixelStorei(GL_UNPACK_ALIGNMENT, 1); glShadeModel(GL_FLAT); diff --git a/hacks/glx/dnalogo.c b/hacks/glx/dnalogo.c index bd79c5b7..7b892072 100644 --- a/hacks/glx/dnalogo.c +++ b/hacks/glx/dnalogo.c @@ -99,9 +99,9 @@ typedef enum { HELIX_IN, HELIX, HELIX_OUT, PIZZA_IN, PIZZA, PIZZA_OUT, - HELIX_AND_PIZZA, + HELIX_AND_PIZZA # ifdef CW - CODEWORD_IN, CODEWORD, CODEWORD_OUT, CODEWORD_BLANK + , CODEWORD_IN, CODEWORD, CODEWORD_OUT, CODEWORD_BLANK # endif } glyph_mode; diff --git a/hacks/glx/glplanet.c b/hacks/glx/glplanet.c index 7f446e5e..454b9ebc 100644 --- a/hacks/glx/glplanet.c +++ b/hacks/glx/glplanet.c @@ -835,8 +835,10 @@ draw_planet (ModeInfo * mi) if (gp->z < 0) gp->z += 1; } +# ifndef GL_LINE_SMOOTH_BROKEN glEnable(GL_LINE_SMOOTH); glEnable(GL_POINT_SMOOTH); +# endif glEnable(GL_DEPTH_TEST); glEnable(GL_CULL_FACE); glCullFace(GL_BACK); @@ -1047,7 +1049,9 @@ draw_planet (ModeInfo * mi) glScalef (1.02, 1.02, 1.02); glDisable (GL_TEXTURE_2D); glDisable (GL_LIGHTING); +# ifndef GL_LINE_SMOOTH_BROKEN glDisable (GL_LINE_SMOOTH); +# endif glColor3f (0.1, 0.3, 0.1); glCallList (gp->latlonglist); mi->polygon_count += 24*24; @@ -1063,7 +1067,9 @@ draw_planet (ModeInfo * mi) glScalef (1.02, 1.02, 1.02); glDisable (GL_TEXTURE_2D); glDisable (GL_LIGHTING); +# ifndef GL_LINE_SMOOTH_BROKEN glDisable (GL_LINE_SMOOTH); +# endif glColor3f (0.1, 0.3, 0.1); glCallList (gp->tzlist); mi->polygon_count += gp->tzpoints; diff --git a/hacks/glx/grab-ximage.c b/hacks/glx/grab-ximage.c index f4770d52..defefda8 100644 --- a/hacks/glx/grab-ximage.c +++ b/hacks/glx/grab-ximage.c @@ -14,7 +14,7 @@ #include "xlockmoreI.h" #include "grab-ximage.h" -#include "grabscreen.h" +#include "grabclient.h" #include "pow2.h" #include "visual.h" #include "xshm.h" diff --git a/hacks/glx/handsy.c b/hacks/glx/handsy.c index ed21b2dc..e943b65e 100644 --- a/hacks/glx/handsy.c +++ b/hacks/glx/handsy.c @@ -460,7 +460,9 @@ draw_ground (ModeInfo *mi) GLfloat fog_color[4] = { 0, 0, 0, 1 }; glLineWidth (4); +# ifndef GL_LINE_SMOOTH_BROKEN glEnable (GL_LINE_SMOOTH); +# endif glHint (GL_LINE_SMOOTH_HINT, GL_NICEST); glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glEnable (GL_BLEND); @@ -500,7 +502,9 @@ draw_ground (ModeInfo *mi) if (!wire) { +# ifndef GL_LINE_SMOOTH_BROKEN glDisable (GL_LINE_SMOOTH); +# endif glDisable (GL_BLEND); glDisable (GL_FOG); } diff --git a/hacks/glx/hexstrut.c b/hacks/glx/hexstrut.c index 6d776bca..10c064ac 100644 --- a/hacks/glx/hexstrut.c +++ b/hacks/glx/hexstrut.c @@ -34,8 +34,6 @@ #define BELLRAND(n) ((frand((n)) + frand((n)) + frand((n))) / 3) -typedef struct { double a, o; } LL; /* latitude + longitude */ - typedef struct triangle triangle; struct triangle { XYZ p[3]; @@ -423,7 +421,6 @@ init_hexstrut (ModeInfo *mi) -0.4 + frand(0.8)); if (thickness < 0.05) thickness = 0.05; - if (thickness < 0.05) MI_IS_WIREFRAME(mi) = True; if (thickness > 1.7) thickness = 1.7; if (speed > 2) speed = 2; diff --git a/hacks/glx/hextrail.c b/hacks/glx/hextrail.c new file mode 100644 index 00000000..71ddb84b --- /dev/null +++ b/hacks/glx/hextrail.c @@ -0,0 +1,784 @@ +/* hextrail, Copyright (c) 2022 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 + * 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. + */ + +#define DEFAULTS "*delay: 30000 \n" \ + "*showFPS: False \n" \ + "*wireframe: False \n" \ + "*count: 20 \n" \ + "*suppressRotationAnimation: True\n" \ + +# define release_hextrail 0 + +#include "xlockmore.h" +#include "colors.h" +#include "normals.h" +#include "rotator.h" +#include "gltrackball.h" +#include + +#ifdef USE_GL /* whole file */ + + +#define DEF_SPIN "True" +#define DEF_WANDER "True" +#define DEF_SPEED "1.0" +#define DEF_THICKNESS "0.15" + +#define BELLRAND(n) ((frand((n)) + frand((n)) + frand((n))) / 3) + +typedef enum { EMPTY, IN, WAIT, OUT, DONE } state_t; + +typedef struct { + state_t state; + GLfloat ratio; + GLfloat speed; +} arm; + +typedef struct hexagon hexagon; +struct hexagon { + XYZ pos; + hexagon *neighbors[6]; + arm arms[6]; + int ccolor; + state_t border_state; + GLfloat border_ratio; +}; + +typedef struct { + GLXContext *glx_context; + rotator *rot; + trackball_state *trackball; + Bool button_down_p; + + int grid_w, grid_h; + hexagon *hexagons; + int live_count; + enum { FIRST, DRAW, FADE } state; + GLfloat fade_ratio; + + int ncolors; + XColor *colors; + +} hextrail_configuration; + +static hextrail_configuration *bps = NULL; + +static Bool do_spin; +static GLfloat speed; +static Bool do_wander; +static GLfloat thickness; + +static XrmOptionDescRec opts[] = { + { "-spin", ".spin", XrmoptionNoArg, "True" }, + { "+spin", ".spin", XrmoptionNoArg, "False" }, + { "-speed", ".speed", XrmoptionSepArg, 0 }, + { "-wander", ".wander", XrmoptionNoArg, "True" }, + { "+wander", ".wander", XrmoptionNoArg, "False" }, + { "-thickness", ".thickness", XrmoptionSepArg, 0 }, +}; + +static argtype vars[] = { + {&do_spin, "spin", "Spin", DEF_SPIN, t_Bool}, + {&do_wander, "wander", "Wander", DEF_WANDER, t_Bool}, + {&speed, "speed", "Speed", DEF_SPEED, t_Float}, + {&thickness, "thickness", "Thickness", DEF_THICKNESS, t_Float}, +}; + +ENTRYPOINT ModeSpecOpt hextrail_opts = {countof(opts), opts, countof(vars), vars, NULL}; + + + +static void +make_plane (ModeInfo *mi) +{ + hextrail_configuration *bp = &bps[MI_SCREEN(mi)]; + int x, y; + GLfloat size, w, h; + hexagon *grid; + + bp->grid_w = MI_COUNT(mi) * 2; + bp->grid_h = bp->grid_w; + + grid = (bp->hexagons + ? bp->hexagons + : (hexagon *) malloc (bp->grid_w * bp->grid_h * sizeof(*grid))); + memset (grid, 0, bp->grid_w * bp->grid_h * sizeof(*grid)); + + bp->ncolors = 8; + if (! bp->colors) + bp->colors = (XColor *) calloc(bp->ncolors, sizeof(XColor)); + make_smooth_colormap (0, 0, 0, + bp->colors, &bp->ncolors, + False, 0, False); + + size = 2.0 / bp->grid_w; + w = size; + h = size * sqrt(3) / 2; + + bp->hexagons = grid; + + for (y = 0; y < bp->grid_h; y++) + for (x = 0; x < bp->grid_w; x++) + { + hexagon *h0 = &grid[y * bp->grid_w + x]; + h0->pos.x = (x - bp->grid_w/2) * w; + h0->pos.y = (y - bp->grid_h/2) * h; + h0->border_state = EMPTY; + h0->border_ratio = 0; + + if (y & 1) + h0->pos.x += w / 2; + + h0->ccolor = random() % bp->ncolors; + } + + for (y = 0; y < bp->grid_h; y++) + for (x = 0; x < bp->grid_w; x++) + { + hexagon *h0 = &grid[y * bp->grid_w + x]; +# undef NEIGHBOR +# define NEIGHBOR(I,XE,XO,Y) do { \ + int x1 = x + (y & 1 ? (XO) : (XE)); \ + int y1 = y + (Y); \ + if (x1 >= 0 && x1 < bp->grid_w && y1 >= 0 && y1 < bp->grid_h) \ + h0->neighbors[(I)] = &grid [y1 * bp->grid_w + x1]; \ + } while (0) + + /* 0,0 1,0 2,0 3,0 4,0 5,0 + 0,1 1,1 2,1 3,1 4,1 5,1 + 0,2 1,2 2,2 3,2 4,2 5,2 + 0,3 1,3 2,3 3,3 4,3 5,3 + 0,4 1,4 2,4 3,4 4,4 5,4 + 0,5 1,5 2,5 3,5 4,5 5,5 + */ + NEIGHBOR (0, 0, 1, -1); + NEIGHBOR (1, 1, 1, 0); + NEIGHBOR (2, 0, 1, 1); + NEIGHBOR (3, -1, 0, 1); + NEIGHBOR (4, -1, -1, 0); + NEIGHBOR (5, -1, 0, -1); + +# undef NEIGHBOR + } +} + + +static Bool +empty_hexagon_p (hexagon *h) +{ + int i; + for (i = 0; i < 6; i++) + if (h->arms[i].state != EMPTY) + return False; + return True; +} + +static int +add_arms (ModeInfo *mi, hexagon *h0, Bool out_p) +{ + hextrail_configuration *bp = &bps[MI_SCREEN(mi)]; + int i; + int added = 0; + int target = 1 + (random() % 4); /* Aim for 1-5 arms */ + + int idx[6]; /* Traverse in random order */ + for (i = 0; i < 6; i++) + idx[i] = i; + for (i = 0; i < 6; i++) + { + int j = random() % 6; + int swap = idx[j]; + idx[j] = idx[i]; + idx[i] = swap; + } + + if (out_p) target--; + + for (i = 0; i < 6; i++) + { + int j = idx[i]; + hexagon *h1 = h0->neighbors[j]; + arm *a0 = &h0->arms[j]; + arm *a1; + if (!h1) continue; /* No neighboring cell */ + if (! empty_hexagon_p (h1)) continue; /* Occupado */ + if (a0->state != EMPTY) continue; /* Arm already exists */ + + a1 = &h1->arms[(j + 3) % 6]; /* Opposite arm */ + + if (a1->state != EMPTY) abort(); + a0->state = (out_p ? OUT : IN); + a1->state = WAIT; + a0->ratio = 0; + a1->ratio = 0; + a0->speed = 0.05 * speed * (0.8 + frand(1.0)); + a1->speed = a0->speed; + + if (h1->border_state == EMPTY) + { + h1->border_state = IN; + + /* Mostly keep the same color */ + h1->ccolor = h0->ccolor; + if (! (random() % 5)) + h1->ccolor = (h0->ccolor + 1) % bp->ncolors; + } + + bp->live_count++; + added++; + if (added >= target) + break; + } + return added; +} + + +static void +tick_hexagons (ModeInfo *mi) +{ + hextrail_configuration *bp = &bps[MI_SCREEN(mi)]; + int i, j; + + /* Enlarge any still-growing arms. + */ + for (i = 0; i < bp->grid_w * bp->grid_h; i++) + { + hexagon *h0 = &bp->hexagons[i]; + for (j = 0; j < 6; j++) + { + arm *a0 = &h0->arms[j]; + switch (a0->state) { + case OUT: + if (a0->speed <= 0) abort(); + a0->ratio += a0->speed; + if (a0->ratio > 1) + { + /* Just finished growing from center to edge. + Pass the baton to this waiting neighbor. */ + hexagon *h1 = h0->neighbors[j]; + arm *a1 = &h1->arms[(j + 3) % 6]; + if (a1->state != WAIT) abort(); + a0->state = DONE; + a0->ratio = 1; + a1->state = IN; + a1->ratio = 0; + a1->speed = a0->speed; + /* bp->live_count unchanged */ + } + break; + case IN: + if (a0->speed <= 0) abort(); + a0->ratio += a0->speed; + if (a0->ratio > 1) + { + /* Just finished growing from edge to center. + Look for any available exits. */ + a0->state = DONE; + a0->ratio = 1; + bp->live_count--; + if (bp->live_count < 0) abort(); + add_arms (mi, h0, True); + } + break; + case EMPTY: case WAIT: case DONE: + break; + default: + abort(); break; + } + } + + switch (h0->border_state) { + case IN: + h0->border_ratio += 0.05 * speed; + if (h0->border_ratio >= 1) + { + h0->border_ratio = 1; + h0->border_state = WAIT; + } + break; + case OUT: + h0->border_ratio -= 0.05 * speed; + if (h0->border_ratio <= 0) + { + h0->border_ratio = 0; + h0->border_state = EMPTY; + } + case WAIT: + if (! (random() % 50)) + h0->border_state = OUT; + break; + case EMPTY: +/* + if (! (random() % 3000)) + h0->border_state = IN; + */ + break; + default: + abort(); + break; + } + } + + /* Start a new cell growing. + */ + if (bp->live_count <= 0) + for (i = 0; i < (bp->grid_w * bp->grid_h) / 3; i++) + { + hexagon *h0; + int x, y; + if (bp->state == FIRST) + { + x = bp->grid_w / 2; + y = bp->grid_h / 2; + bp->state = DRAW; + bp->fade_ratio = 1; + } + else + { + x = random() % bp->grid_w; + y = random() % bp->grid_h; + } + h0 = &bp->hexagons[y * bp->grid_w + x]; + if (empty_hexagon_p (h0) && + add_arms (mi, h0, True)) + break; + } + + if (bp->live_count <= 0 && bp->state != FADE) + { + bp->state = FADE; + bp->fade_ratio = 1; + + for (i = 0; i < bp->grid_w * bp->grid_h; i++) + { + hexagon *h = &bp->hexagons[i]; + if (h->border_state == IN || h->border_state == WAIT) + h->border_state = OUT; + } + } + else if (bp->state == FADE) + { + bp->fade_ratio -= 0.01 * speed; + if (bp->fade_ratio <= 0) + { + make_plane (mi); + bp->state = FIRST; + bp->fade_ratio = 1; + } + } +} + + +static void +draw_hexagons (ModeInfo *mi) +{ + hextrail_configuration *bp = &bps[MI_SCREEN(mi)]; + int wire = MI_IS_WIREFRAME(mi); + GLfloat length = sqrt(3) / 3; + GLfloat size = length / MI_COUNT(mi); + GLfloat thick2 = thickness * bp->fade_ratio; + int i; + +# undef H +# define H 0.8660254037844386 /* sqrt(3)/2 */ + const XYZ corners[] = {{ 0, -1, 0 }, /* 0 */ + { H, -0.5, 0 }, /* 5 1 */ + { H, 0.5, 0 }, /* */ + { 0, 1, 0 }, /* 4 2 */ + { -H, 0.5, 0 }, /* 3 */ + { -H, -0.5, 0 }}; + + glFrontFace (GL_CCW); + glBegin (wire ? GL_LINES : GL_TRIANGLES); + glNormal3f (0, 0, 1); + + for (i = 0; i < bp->grid_w * bp->grid_h; i++) + { + hexagon *h = &bp->hexagons[i]; + int total_arms = 0; + int done_arms = 0; + GLfloat color[4]; + int j; + + for (j = 0; j < 6; j++) + { + arm *a = &h->arms[j]; + if (a->state == OUT || a->state == DONE) + total_arms++; + if (a->state == DONE) + done_arms++; + } + + +# define HEXAGON_COLOR(V,H) do { \ + (V)[0] = bp->colors[(H)->ccolor].red / 65535.0 * bp->fade_ratio; \ + (V)[1] = bp->colors[(H)->ccolor].green / 65535.0 * bp->fade_ratio; \ + (V)[2] = bp->colors[(H)->ccolor].blue / 65535.0 * bp->fade_ratio; \ + (V)[3] = 1; \ + } while (0) + HEXAGON_COLOR (color, h); + + for (j = 0; j < 6; j++) + { + arm *a = &h->arms[j]; + GLfloat margin = thickness * 0.4; + GLfloat size1 = size * (1 - margin * 2); + GLfloat size2 = size * (1 - margin * 3); + int k = (j + 1) % 6; + XYZ p[6]; + + if (h->border_state != EMPTY) + { + GLfloat color1[4]; + memcpy (color1, color, sizeof(color1)); + color1[0] *= h->border_ratio; + color1[1] *= h->border_ratio; + color1[2] *= h->border_ratio; + + glColor4fv (color1); + glMaterialfv (GL_FRONT, GL_AMBIENT_AND_DIFFUSE, color1); + + /* Outer edge of hexagon border */ + p[0].x = h->pos.x + corners[j].x * size1; + p[0].y = h->pos.y + corners[j].y * size1; + p[0].z = h->pos.z; + + p[1].x = h->pos.x + corners[k].x * size1; + p[1].y = h->pos.y + corners[k].y * size1; + p[1].z = h->pos.z; + + /* Inner edge of hexagon border */ + p[2].x = h->pos.x + corners[k].x * size2; + p[2].y = h->pos.y + corners[k].y * size2; + p[2].z = h->pos.z; + p[3].x = h->pos.x + corners[j].x * size2; + p[3].y = h->pos.y + corners[j].y * size2; + p[3].z = h->pos.z; + + glVertex3f (p[0].x, p[0].y, p[0].z); + glVertex3f (p[1].x, p[1].y, p[1].z); + if (! wire) + glVertex3f (p[2].x, p[2].y, p[2].z); + mi->polygon_count++; + + glVertex3f (p[2].x, p[2].y, p[2].z); + glVertex3f (p[3].x, p[3].y, p[3].z); + if (! wire) + glVertex3f (p[0].x, p[0].y, p[0].z); + mi->polygon_count++; + } + + /* Line from center to edge, or edge to center. + */ + if (a->state == IN || a->state == OUT || a->state == DONE) + { + GLfloat x = (corners[j].x + corners[k].x) / 2; + GLfloat y = (corners[j].y + corners[k].y) / 2; + GLfloat xoff = corners[k].x - corners[j].x; + GLfloat yoff = corners[k].y - corners[j].y; + GLfloat line_length = h->arms[j].ratio; + GLfloat start, end; + GLfloat ncolor[4]; + GLfloat color1[4]; + GLfloat color2[4]; + + /* Color of the outer point of the line is average color of + this and the neighbor. */ + HEXAGON_COLOR (ncolor, h->neighbors[j]); + ncolor[0] = (ncolor[0] + color[0]) / 2; + ncolor[1] = (ncolor[1] + color[1]) / 2; + ncolor[2] = (ncolor[2] + color[2]) / 2; + ncolor[3] = (ncolor[3] + color[3]) / 2; + + if (a->state == OUT) + { + start = 0; + end = size * line_length; + memcpy (color1, color, sizeof(color1)); + memcpy (color2, ncolor, sizeof(color1)); + } + else + { + start = size; + end = size * (1 - line_length); + memcpy (color1, ncolor, sizeof(color1)); + memcpy (color2, color, sizeof(color1)); + } + + if (! h->neighbors[j]) abort(); /* arm/neighbor mismatch */ + + + /* Center */ + p[0].x = h->pos.x + xoff * size2 * thick2 + x * start; + p[0].y = h->pos.y + yoff * size2 * thick2 + y * start; + p[0].z = h->pos.z; + p[1].x = h->pos.x - xoff * size2 * thick2 + x * start; + p[1].y = h->pos.y - yoff * size2 * thick2 + y * start; + p[1].z = h->pos.z; + + /* Edge */ + p[2].x = h->pos.x - xoff * size2 * thick2 + x * end; + p[2].y = h->pos.y - yoff * size2 * thick2 + y * end; + p[2].z = h->pos.z; + p[3].x = h->pos.x + xoff * size2 * thick2 + x * end; + p[3].y = h->pos.y + yoff * size2 * thick2 + y * end; + p[3].z = h->pos.z; + + glColor4fv (color2); + glMaterialfv (GL_FRONT, GL_AMBIENT_AND_DIFFUSE, color2); + glVertex3f (p[3].x, p[3].y, p[3].z); + glColor4fv (color1); + glMaterialfv (GL_FRONT, GL_AMBIENT_AND_DIFFUSE, color1); + glVertex3f (p[0].x, p[0].y, p[0].z); + if (! wire) + glVertex3f (p[1].x, p[1].y, p[1].z); + mi->polygon_count++; + + glVertex3f (p[1].x, p[1].y, p[1].z); + + glColor4fv (color2); + glMaterialfv (GL_FRONT, GL_AMBIENT_AND_DIFFUSE, color2); + glVertex3f (p[2].x, p[2].y, p[2].z); + if (! wire) + glVertex3f (p[3].x, p[3].y, p[3].z); + mi->polygon_count++; + } + + /* Hexagon (one triangle of) in center to hide line miter/bevels. + */ + if (total_arms) + { + GLfloat size3 = size * thick2 * 0.8; + if (total_arms == 1) + size3 *= 2; + + p[0] = h->pos; + + p[1].x = h->pos.x + corners[j].x * size3; + p[1].y = h->pos.y + corners[j].y * size3; + p[1].z = h->pos.z; + + /* Inner edge of hexagon border */ + p[2].x = h->pos.x + corners[k].x * size3; + p[2].y = h->pos.y + corners[k].y * size3; + p[2].z = h->pos.z; + + glColor4fv (color); + glMaterialfv (GL_FRONT, GL_AMBIENT_AND_DIFFUSE, color); + if (! wire) + glVertex3f (p[0].x, p[0].y, p[0].z); + glVertex3f (p[1].x, p[1].y, p[1].z); + glVertex3f (p[2].x, p[2].y, p[2].z); + mi->polygon_count++; + } + } + } + + glEnd(); +} + + +/* Window management, etc + */ +ENTRYPOINT void +reshape_hextrail (ModeInfo *mi, int width, int height) +{ + GLfloat h = (GLfloat) height / (GLfloat) width; + int y = 0; + + if (width > height * 3) { /* tiny window: show middle */ + height = width * 9/16; + y = -height/2; + h = height / (GLfloat) width; + } + + glViewport (0, y, (GLint) width, (GLint) height); + + glMatrixMode(GL_PROJECTION); + glLoadIdentity(); + gluPerspective (30.0, 1/h, 1.0, 100.0); + + glMatrixMode(GL_MODELVIEW); + glLoadIdentity(); + gluLookAt( 0.0, 0.0, 30.0, + 0.0, 0.0, 0.0, + 0.0, 1.0, 0.0); + + { + GLfloat s = (MI_WIDTH(mi) < MI_HEIGHT(mi) + ? (MI_WIDTH(mi) / (GLfloat) MI_HEIGHT(mi)) + : 1); + glScalef (s, s, s); + } + + glClear(GL_COLOR_BUFFER_BIT); +} + + +ENTRYPOINT Bool +hextrail_handle_event (ModeInfo *mi, XEvent *event) +{ + hextrail_configuration *bp = &bps[MI_SCREEN(mi)]; + if (gltrackball_event_handler (event, bp->trackball, + MI_WIDTH (mi), MI_HEIGHT (mi), + &bp->button_down_p)) + return True; + else if (event->xany.type == KeyPress) + { + KeySym keysym; + char c = 0; + XLookupString (&event->xkey, &c, 1, &keysym, 0); + + if (c == ' ' || c == '\t' || c == '\r' || c == '\n') + ; + else if (c == '>' || c == '.' || c == '+' || c == '=' || + keysym == XK_Right || keysym == XK_Up || keysym == XK_Next) + MI_COUNT(mi)++; + else if (c == '<' || c == ',' || c == '-' || c == '_' || + c == '\010' || c == '\177' || + keysym == XK_Left || keysym == XK_Down || keysym == XK_Prior) + MI_COUNT(mi)--; + else if (screenhack_event_helper (MI_DISPLAY(mi), MI_WINDOW(mi), event)) + ; + else + return False; + + RESET: + if (MI_COUNT(mi) < 1) MI_COUNT(mi) = 1; + free (bp->hexagons); + bp->hexagons = 0; + bp->state = FIRST; + bp->fade_ratio = 1; + bp->live_count = 0; + make_plane (mi); + return True; + } + else if (screenhack_event_helper (MI_DISPLAY(mi), MI_WINDOW(mi), event)) + goto RESET; + + return False; +} + + +ENTRYPOINT void +init_hextrail (ModeInfo *mi) +{ + hextrail_configuration *bp; + + MI_INIT (mi, bps); + + bp = &bps[MI_SCREEN(mi)]; + + bp->glx_context = init_GL(mi); + + reshape_hextrail (mi, MI_WIDTH(mi), MI_HEIGHT(mi)); + + { + double spin_speed = 0.002; + double wander_speed = 0.003; + double spin_accel = 1.0; + + bp->rot = make_rotator (do_spin ? spin_speed : 0, + do_spin ? spin_speed : 0, + do_spin ? spin_speed : 0, + spin_accel, + do_wander ? wander_speed : 0, + False); + bp->trackball = gltrackball_init (True); + } + + + /* Let's tilt the scene a little. */ + gltrackball_reset (bp->trackball, + -0.4 + frand(0.8), + -0.4 + frand(0.8)); + + if (thickness < 0.05) thickness = 0.05; + if (thickness > 0.5) thickness = 0.5; + + make_plane (mi); + bp->state = FIRST; + bp->fade_ratio = 1; +} + + +ENTRYPOINT void +draw_hextrail (ModeInfo *mi) +{ + hextrail_configuration *bp = &bps[MI_SCREEN(mi)]; + Display *dpy = MI_DISPLAY(mi); + Window window = MI_WINDOW(mi); + + if (!bp->glx_context) + return; + + glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *bp->glx_context); + + glShadeModel(GL_SMOOTH); + + glDisable(GL_DEPTH_TEST); + glEnable(GL_NORMALIZE); + glDisable(GL_CULL_FACE); + + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + + glPushMatrix (); + + { + double x, y, z; + get_position (bp->rot, &x, &y, &z, !bp->button_down_p); + glTranslatef((x - 0.5) * 6, + (y - 0.5) * 6, + (z - 0.5) * 12); + + gltrackball_rotate (bp->trackball); + + get_rotation (bp->rot, &x, &y, &z, !bp->button_down_p); + glRotatef (z * 360, 0.0, 0.0, 1.0); + } + + mi->polygon_count = 0; + + { + GLfloat s = 18; + glScalef (s, s, s); + } + + if (! bp->button_down_p) + tick_hexagons (mi); + draw_hexagons (mi); + + glPopMatrix (); + + if (mi->fps_p) do_fps (mi); + glFinish(); + + glXSwapBuffers(dpy, window); +} + + +ENTRYPOINT void +free_hextrail (ModeInfo *mi) +{ + hextrail_configuration *bp = &bps[MI_SCREEN(mi)]; + + if (!bp->glx_context) return; + glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *bp->glx_context); + + if (bp->trackball) gltrackball_free (bp->trackball); + if (bp->rot) free_rotator (bp->rot); + if (bp->colors) free (bp->colors); + free (bp->hexagons); +} + +XSCREENSAVER_MODULE ("HexTrail", hextrail) + +#endif /* USE_GL */ diff --git a/hacks/glx/hextrail.man b/hacks/glx/hextrail.man new file mode 100644 index 00000000..4db093f5 --- /dev/null +++ b/hacks/glx/hextrail.man @@ -0,0 +1,79 @@ +.TH XScreenSaver 1 "" "X Version 11" +.SH NAME +hextrail \- screen saver. +.SH SYNOPSIS +.B hextrail +[\-\-display \fIhost:display.screen\fP] +[\-\-visual \fIvisual\fP] +[\-\-window] +[\-\-root] +[\--delay \fInumber\fP] +[\--speed \fInumber\fP] +[\--count \fInumber\fP] +[\--thickness \fInumber\fP] +[\--no-wander] +[\--no-spin] +[\--wireframe] +[\--fps] +.SH DESCRIPTION +A network of colorful lines grows upon a hexagonal substrate. +.SH OPTIONS +.TP 8 +.B \-\-visual \fIvisual\fP +Specify which visual to use. Legal values are the name of a visual class, +or the id number (decimal or hex) of a specific visual. +.TP 8 +.B \-\-window +Draw on a newly-created window. This is the default. +.TP 8 +.B \-\-root +Draw on the root window. +.TP 8 +.B \--delay \fInumber\fP +Frame rate. 0 - 100000. Default: 30000. +.TP 8 +.B \--speed \fInumber\fP +Speed. 0.1 - 20. Default: 1.0. +.TP 8 +.B \--count \fInumber\fP +Hexagon Size. 2 - 80. Default: 20. +.TP 8 +.B \--thickness \fInumber\fP +Line Thickness. 0.01 - 0.5. Default: 0.15. +.TP 8 +.B \--no-wander | \-\-no--no-wander +Wander. Boolean. +.TP 8 +.B \--no-spin | \-\-no--no-spin +Spin. Boolean. +.TP 8 +.B \--wireframe | \-\-no--wireframe +Wireframe. Boolean. +.TP 8 +.B \--fps | \-\-no--fps +Show frame rate. Boolean. +.SH ENVIRONMENT +.PP +.TP 8 +.B DISPLAY +to get the default host and display number. +.TP 8 +.B XENVIRONMENT +to get the name of a resource file that overrides the global resources +stored in the RESOURCE_MANAGER property. +.TP 8 +.B XSCREENSAVER_WINDOW +The window ID to use with \fI--root\fP. +.SH SEE ALSO +.BR X (1), +.BR xscreensaver (1) +.SH COPYRIGHT +Copyright \(co 2022 by 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 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. +.SH AUTHOR +Jamie Zawinski. diff --git a/hacks/glx/mapscroller.pl b/hacks/glx/mapscroller.pl index c8cba0c5..a5b2a44a 100755 --- a/hacks/glx/mapscroller.pl +++ b/hacks/glx/mapscroller.pl @@ -29,7 +29,7 @@ BEGIN { eval 'use LWP::Simple' } my $progname = $0; $progname =~ s@.*/@@g; $progname =~ s@\.pl$@@g; -my ($version) = ('$Revision: 1.5 $' =~ m/\s(\d[.\d]+)\s/s); +my ($version) = ('$Revision: 1.6 $' =~ m/\s(\d[.\d]+)\s/s); my $verbose = 0; my $url_template = undef; @@ -42,17 +42,25 @@ my %cached_files; # script exits, even if abnormally. # my %rm_f; -END { - my $exit = $?; - my @rm_f = keys %rm_f; - unlink @rm_f if (@rm_f); - $? = $exit; # Don't clobber this script's exit code. +END { rmf(); } + +sub rmf() { + foreach my $f (sort keys %rm_f) { + if (-e $f) { + print STDERR blurb() . "rm $f\n" if ($verbose > 1); + unlink $f; + } + } + %rm_f = (); } sub signal_cleanup($) { my ($s) = @_; - print STDERR "$progname: SIG$s\n" if ($verbose > 1); - exit (1); # This causes END{} to run. + print STDERR blurb() . "SIG$s\n" if ($verbose > 1); + rmf(); + # Propagate the signal and die. This does not cause END to run. + $SIG{$s} = 'DEFAULT'; + kill ($s, $$); } $SIG{TERM} = \&signal_cleanup; # kill @@ -63,6 +71,12 @@ $SIG{ABRT} = \&signal_cleanup; $SIG{PIPE} = \&signal_cleanup; $SIG{HUP} = \&signal_cleanup; +# Add the file to the rm_f list, since you can't export hash variables. +sub rm_atexit($) { + my ($file) = @_; + $rm_f{$file} = 1; +} + sub blurb() { return ("$progname: " . strftime('%H:%M:%S', localtime) . @@ -227,7 +241,7 @@ sub load_tile($$$$) { # Hit the network. # my $tmpfile = sprintf("%s/%08x.%s", $cache_dir, rand() * 0xFFFFFFFF, $suf); - $rm_f{$tmpfile} = 1; + rm_atexit ($tmpfile); acquire_lock(); print STDERR blurb() . "downloading $url\n" if ($verbose > 1); diff --git a/hacks/glx/mirrorblob.c b/hacks/glx/mirrorblob.c index 4e754bba..ee9717b0 100644 --- a/hacks/glx/mirrorblob.c +++ b/hacks/glx/mirrorblob.c @@ -65,7 +65,7 @@ #define DEF_TEXTURE "True" #define DEF_OFFSET_TEXTURE "False" #define DEF_PAINT_BACKGROUND "True" -#define DEF_RESOLUTION "30" +#define DEF_RESOLUTION "90" #define DEF_BUMPS "10" #define DEF_MOTION_BLUR "0.0" #define DEF_INCREMENTAL "0" diff --git a/hacks/glx/molecule.c b/hacks/glx/molecule.c index e737d68f..0a6f80b4 100644 --- a/hacks/glx/molecule.c +++ b/hacks/glx/molecule.c @@ -1235,15 +1235,15 @@ gl_init (ModeInfo *mi) static void startup_blurb (ModeInfo *mi) { +#ifndef HAVE_ANDROID /* Doesn't work -- causes whole scene to be black */ molecule_configuration *mc = &mcs[MI_SCREEN(mi)]; const char *s = "Constructing molecules..."; -#ifndef HAVE_ANDROID /* Doesn't work -- causes whole scene to be black */ print_texture_label (mi->dpy, mc->title_font, mi->xgwa.width, mi->xgwa.height, 0, s); -#endif glFinish(); glXSwapBuffers(MI_DISPLAY(mi), MI_WINDOW(mi)); +#endif } ENTRYPOINT Bool diff --git a/hacks/glx/photopile.c b/hacks/glx/photopile.c index 78e34b54..01806bcc 100644 --- a/hacks/glx/photopile.c +++ b/hacks/glx/photopile.c @@ -1,5 +1,5 @@ /* photopile, Copyright (c) 2008-2018 Jens Kilian - * Based on carousel, Copyright (c) 2005-2008 Jamie Zawinski + * Based on carousel, Copyright (c) 2005-2008 Jamie Zawinskin * Loads a sequence of images and shuffles them into a pile. * * Permission to use, copy, modify, distribute, and sell this software and its diff --git a/hacks/glx/sphereeversion-analytic.c b/hacks/glx/sphereeversion-analytic.c index 7caeb14d..a217f563 100644 --- a/hacks/glx/sphereeversion-analytic.c +++ b/hacks/glx/sphereeversion-analytic.c @@ -1374,7 +1374,9 @@ static int bednorz_sphere_eversion_ff(ModeInfo *mi, float phi_min, { glColor4f(1.0f,1.0f,1.0f,1.0f); glLineWidth(2.0f); +# ifndef GL_LINE_SMOOTH_BROKEN glEnable(GL_LINE_SMOOTH); +# endif glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA); glDisable(GL_LIGHTING); glDisable(GL_LIGHT0); @@ -1424,7 +1426,9 @@ static int bednorz_sphere_eversion_ff(ModeInfo *mi, float phi_min, } glLineWidth(1.0f); glPolygonOffset(0.0f,0.0f); +# ifndef GL_LINE_SMOOTH_BROKEN glDisable(GL_LINE_SMOOTH); +# endif glBlendFunc(GL_SRC_ALPHA,GL_ONE); glEnable(GL_LIGHTING); glEnable(GL_LIGHT0); diff --git a/hacks/glx/topblock.c b/hacks/glx/topblock.c index 4976a6f8..2b9589a4 100644 --- a/hacks/glx/topblock.c +++ b/hacks/glx/topblock.c @@ -117,11 +117,11 @@ static XrmOptionDescRec opts[] = { #define DEF_BLOB "False" #define DEF_NIPPLES "True" #define DEF_ROTATE_SPEED "10" -#define DEF_MAX_FALLING "500" +#define DEF_MAX_FALLING "75" /* carpet is off screen by then */ #define DEF_MAX_COLORS "7" #define DEF_SIZE "2" #define DEF_SPAWN "50" -#define DEF_RESOLUTION "4" +#define DEF_RESOLUTION "8" #define DEF_CAM_X "1" #define DEF_CAM_Y "20" #define DEF_CAM_Z "25" @@ -315,6 +315,7 @@ draw_topBlock (ModeInfo *mi) return; glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *tb->glx_context); mi->polygon_count = 0; + mi->recursion_depth = tb->numFallingBlocks; generateNewBlock(mi); diff --git a/hacks/glx/vigilance.c b/hacks/glx/vigilance.c index b3eb1db8..e809f424 100644 --- a/hacks/glx/vigilance.c +++ b/hacks/glx/vigilance.c @@ -986,7 +986,9 @@ draw_ground (ModeInfo *mi, GLfloat color[4]) GLfloat fog_color[4] = { 0, 0, 0, 1 }; glLineWidth (2); +# ifndef GL_LINE_SMOOTH_BROKEN glEnable (GL_LINE_SMOOTH); +# endif glHint (GL_LINE_SMOOTH_HINT, GL_NICEST); glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glEnable (GL_BLEND); @@ -1029,8 +1031,10 @@ draw_ground (ModeInfo *mi, GLfloat color[4]) glRotatef (90, 1, 0, 0); } +# ifndef GL_LINE_SMOOTH_BROKEN if (!wire) glDisable (GL_LINE_SMOOTH); +# endif glPopMatrix(); diff --git a/hacks/glx/winduprobot.c b/hacks/glx/winduprobot.c index 237352d2..36121fc2 100644 --- a/hacks/glx/winduprobot.c +++ b/hacks/glx/winduprobot.c @@ -1675,7 +1675,9 @@ draw_ground (ModeInfo *mi, GLfloat color[4]) GLfloat fog_color[4] = { 0, 0, 0, 1 }; glLineWidth (4); +# ifndef GL_LINE_SMOOTH_BROKEN glEnable (GL_LINE_SMOOTH); +# endif glHint (GL_LINE_SMOOTH_HINT, GL_NICEST); glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glEnable (GL_BLEND); @@ -1715,7 +1717,9 @@ draw_ground (ModeInfo *mi, GLfloat color[4]) if (!wire) { +# ifndef GL_LINE_SMOOTH_BROKEN glDisable (GL_LINE_SMOOTH); +# endif glDisable (GL_BLEND); glDisable (GL_FOG); } diff --git a/hacks/grav.c b/hacks/grav.c index 305b8e81..e53c88d2 100644 --- a/hacks/grav.c +++ b/hacks/grav.c @@ -34,7 +34,8 @@ static const char sccsid[] = "@(#)grav.c 5.00 2000/11/01 xlockmore"; "*ncolors: 64 \n" \ "*fpsSolid: true \n" \ "*ignoreRotation: True \n" \ - "*lowrez: True \n" \ + +/* "*lowrez: True \n" \ */ #define BRIGHT_COLORS # define release_grav 0 @@ -113,9 +114,6 @@ ModStruct grav_description = #define Planet(x,y)\ if ((x) >= 0 && (y) >= 0 && (x) <= gp->width && (y) <= gp->height) {\ - if (planet->ri < 2)\ - XDrawPoint(display, window, gc, (x), (y));\ - else\ XFillArc(display, window, gc,\ (x) - planet->ri / 2, (y) - planet->ri / 2, planet->ri, planet->ri,\ 0, 23040);\ @@ -218,8 +216,13 @@ draw_planet(ModeInfo * mi, planetstruct * planet) XSetForeground(display, gc, MI_BLACK_PIXEL(mi)); Planet(gp->x, gp->y); if (trail) { + int r = 1; + if (gp->width > 2560 || gp->height > 2560) + r *= 3; /* Retina displays */ XSetForeground(display, gc, planet->colors); - XDrawPoint(display, MI_WINDOW(mi), gc, gp->x, gp->y); + XFillArc(display, MI_WINDOW(mi), gc, + gp->x-r/2, gp->y-r/2, r, r, + 0, 23040); } /* Move */ gp->x = planet->xi; diff --git a/hacks/halftone.c b/hacks/halftone.c index c4e26670..ff9c7dfd 100644 --- a/hacks/halftone.c +++ b/hacks/halftone.c @@ -149,10 +149,6 @@ halftone_init (Display *dpy, Window window) spacing = get_integer_resource (dpy, "spacing", "Integer"); halftone->spacing = spacing < 1 ? DEFAULT_SPACING : spacing; - factor = get_float_resource (dpy, "sizeFactor", "Double"); - halftone->max_dot_size = - (factor < 0 ? DEFAULT_SIZE_FACTOR : factor) * halftone->spacing; - min_mass = get_float_resource (dpy, "minMass", "Double"); min_mass = min_mass < 0 ? DEFAULT_MIN_MASS : min_mass; @@ -188,6 +184,13 @@ halftone_init (Display *dpy, Window window) /* Set up the dots. */ XGetWindowAttributes(halftone->dpy, halftone->window, &attrs); + if (attrs.width > 2560 || attrs.height > 2560) + halftone->spacing *= 3; /* Retina displays */ + + factor = get_float_resource (dpy, "sizeFactor", "Double"); + halftone->max_dot_size = + (factor < 0 ? DEFAULT_SIZE_FACTOR : factor) * halftone->spacing; + halftone->ncolors = get_integer_resource (dpy, "colors", "Colors"); if (halftone->ncolors < 4) halftone->ncolors = 4; halftone->colors = (XColor *) calloc(halftone->ncolors, sizeof(XColor)); @@ -387,7 +390,7 @@ static const char *halftone_defaults [] = { #ifdef HAVE_MOBILE "*ignoreRotation: True", #endif - ".lowrez: true", /* Too slow on Retina screens otherwise */ +/* ".lowrez: true", */ 0 }; diff --git a/hacks/halo.c b/hacks/halo.c index c45a99ec..676995ad 100644 --- a/hacks/halo.c +++ b/hacks/halo.c @@ -56,6 +56,7 @@ struct state { Bool done_once_no_really; int clear_tick; struct timeval then; + int scale; }; #define min(x,y) ((x)<(y)?(x):(y)) @@ -80,7 +81,7 @@ init_circles_1 (struct state *st) int j = 8; int inc = ((random()%j) + (random()%j) + (random()%j)) - ((j*3)/2); if (inc < 0) inc = -inc + 3; - st->circles [i].increment = inc + 3; + st->circles [i].increment = (inc + 3) * st->scale; } st->circles [i].radius = random () % st->circles [i].increment; st->circles [i].dx = ((random () % 3) - 1) * (1 + random () % 5); @@ -88,6 +89,15 @@ init_circles_1 (struct state *st) } } +static void +halo_reshape (Display *dpy, Window window, void *closure, + unsigned int w, unsigned int h) +{ + struct state *st = (struct state *) closure; + st->scale = 1; + if (w > 2560 || h > 2560) st->scale *= 3; /* Retina displays */ +} + static void * halo_init (Display *dpy, Window window) { @@ -98,6 +108,8 @@ halo_init (Display *dpy, Window window) st->dpy = dpy; st->window = window; XGetWindowAttributes (st->dpy, st->window, &xgwa); + halo_reshape (dpy, window, st, xgwa.width, xgwa.height); + st->cmap = xgwa.colormap; st->global_count = get_integer_resource (st->dpy, "count", "Integer"); if (st->global_count < 0) st->global_count = 0; @@ -409,8 +421,7 @@ static const char *halo_defaults [] = { #ifdef HAVE_MOBILE "*ignoreRotation: True", #endif - ".lowrez: true", /* Too slow on Retina screens otherwise */ - /* But that looks crappy too. It's bad either way. */ +/* ".lowrez: true", */ 0 }; @@ -423,12 +434,6 @@ static XrmOptionDescRec halo_options [] = { { 0, 0, 0, 0 } }; -static void -halo_reshape (Display *dpy, Window window, void *closure, - unsigned int w, unsigned int h) -{ -} - static Bool halo_event (Display *dpy, Window window, void *closure, XEvent *event) { diff --git a/hacks/hopalong.c b/hacks/hopalong.c index d3cc7df0..f4a21667 100644 --- a/hacks/hopalong.c +++ b/hacks/hopalong.c @@ -185,8 +185,9 @@ typedef struct { int pix; int op; int count; + int scale; int bufsize; - XPoint *pointBuffer; /* pointer for XDrawPoints */ + XRectangle *pointBuffer; } hopstruct; static hopstruct *hops = (hopstruct *) NULL; @@ -202,6 +203,11 @@ init_hop(ModeInfo * mi) MI_INIT (mi, hops); hp = &hops[MI_SCREEN(mi)]; + hp->scale = 1; + if (MI_WIDTH(mi) > 2560 || MI_HEIGHT(mi) > 2560) + hp->scale *= 3; /* Retina displays */ + /* We aren't increasing the spacing between the pixels, just the size. */ + hp->centerx = MI_WIDTH(mi) / 2; hp->centery = MI_HEIGHT(mi) / 2; /* Make the other operations less common since they are less interesting */ @@ -377,8 +383,8 @@ init_hop(ModeInfo * mi) hp->bufsize = MI_COUNT(mi); if (hp->pointBuffer == NULL) { - if ((hp->pointBuffer = (XPoint *) malloc(hp->bufsize * - sizeof (XPoint))) == NULL) + if ((hp->pointBuffer = (XRectangle *) malloc(hp->bufsize * + sizeof (*hp->pointBuffer))) == NULL) return; } @@ -393,7 +399,7 @@ ENTRYPOINT void draw_hop(ModeInfo * mi) { double oldj, oldi; - XPoint *xp; + XRectangle *xp; int k; hopstruct *hp; @@ -524,10 +530,11 @@ draw_hop(ModeInfo * mi) xp->y = hp->centery - (int) (hp->i - hp->j); break; } + xp->width = xp->height = hp->scale; xp++; } - XDrawPoints(MI_DISPLAY(mi), MI_WINDOW(mi), MI_GC(mi), - hp->pointBuffer, hp->bufsize, CoordModeOrigin); + XFillRectangles(MI_DISPLAY(mi), MI_WINDOW(mi), MI_GC(mi), + hp->pointBuffer, hp->bufsize); if (++hp->count > MI_CYCLES(mi)) { init_hop(mi); } diff --git a/hacks/ifs.c b/hacks/ifs.c index 9e2604b1..8649b96c 100644 --- a/hacks/ifs.c +++ b/hacks/ifs.c @@ -61,10 +61,11 @@ struct state { int width, widthb, height; int width8, height8; unsigned int *board; - XPoint pointbuf[1000]; + XRectangle pointbuf[1000]; int npoints; int xmin, xmax, ymin, ymax; int x, y; + int pscale; int delay; @@ -87,7 +88,7 @@ myrandom(float up) } static const char *ifs_defaults [] = { - ".lowrez: true", +/* ".lowrez: true", */ ".background: Black", "*lensnum: 3", "*fpsSolid: true", @@ -134,8 +135,7 @@ static XrmOptionDescRec ifs_options [] = { static void drawpoints(struct state *st) { - XDrawPoints(st->dpy, st->backbuffer, st->gc, st->pointbuf, st->npoints, - CoordModeOrigin); + XFillRectangles(st->dpy, st->backbuffer, st->gc, st->pointbuf, st->npoints); st->npoints = 0; } @@ -160,6 +160,8 @@ sp(struct state *st, int x, int y) st->pointbuf[st->npoints].x = x; st->pointbuf[st->npoints].y = y; + st->pointbuf[st->npoints].width = + st->pointbuf[st->npoints].height = st->pscale; st->npoints++; if (st->npoints >= countof(st->pointbuf)) { @@ -348,9 +350,10 @@ ifs_draw (Display *dpy, Window window, void *closure) XSetForeground(st->dpy, st->gc, st->blackColor); XFillRectangle(st->dpy, st->backbuffer, st->gc, xmin, ymin, - xmax - xmin + 1, ymax - ymin + 1); - st->xmin = st->width + 1; - st->xmax = st->ymax = -1; + xmax - xmin + 1 * st->pscale, + ymax - ymin + 1 * st->pscale); + st->xmin = st->width + 1; + st->xmax = st->ymax = -1; st->ymin = st->height + 1; } @@ -430,6 +433,12 @@ ifs_init (Display *d_arg, Window w_arg) XGetWindowAttributes (st->dpy, st->window, &xgwa); ifs_reshape(st->dpy, st->window, st, xgwa.width, xgwa.height); + st->pscale = 1; + if (xgwa.width > 2560 || xgwa.height > 2560) + st->pscale *= 3; /* Retina displays */ + /* We aren't increasing the spacing between the pixels, just the size. */ + + st->ncolours = get_integer_resource(st->dpy, "colors", "Colors"); if (st->ncolours < st->lensnum) st->ncolours = st->lensnum; diff --git a/hacks/interference.c b/hacks/interference.c index 44a55ea8..63b8a83b 100644 --- a/hacks/interference.c +++ b/hacks/interference.c @@ -748,7 +748,8 @@ static void inter_init(Display* dpy, Window win, struct inter_context* c) if(radius < 1) radius = 1; - if (xgwa.width > 2560) scale = 3.5; /* Retina displays */ + if (xgwa.width > 2560 || xgwa.height > 2560) + scale = 3.5; /* Retina displays */ radius *= scale; create_image(dpy, c, &xgwa); diff --git a/hacks/intermomentary.c b/hacks/intermomentary.c index fc5b9321..abe77fa6 100644 --- a/hacks/intermomentary.c +++ b/hacks/intermomentary.c @@ -100,6 +100,7 @@ struct state { XColor *colors; int ncolors; + int pscale; }; @@ -230,7 +231,8 @@ draw_glowpoint(struct state *st, Drawable drawable, c = trans_point(st, px+i, py+j, 255, a, f); XSetForeground(st->dpy, fgc, get_pixel (st, c)); - XDrawPoint(st->dpy, drawable, fgc, px + i, py + j); + XFillRectangle(st->dpy, drawable, fgc, px + i, py + j, + st->pscale, st->pscale); XSetForeground(st->dpy, fgc, f->fgcolor); } } @@ -279,7 +281,8 @@ moverender_rider(struct state *st, Drawable drawable, trans_point(st, px, py, c, 0.5, f); XSetForeground(st->dpy, fgc, get_pixel(st, c)); - XDrawPoint(st->dpy, drawable, fgc, px, py); + XFillRectangle(st->dpy, drawable, fgc, px, py, + st->pscale, st->pscale); XSetForeground(st->dpy, fgc, f->fgcolor); } } @@ -325,12 +328,14 @@ render_disc(struct state *st, Drawable drawable, GC fgc, struct field *f, int dn /* XPutPixel(f->off_map, p3ax, p3ay, f->fgcolor); */ c = trans_point(st, p3ax, p3ay, 255, 0.75, f); XSetForeground(st->dpy, fgc, get_pixel (st, c)); - XDrawPoint(st->dpy, drawable, fgc, p3ax, p3ay); + XFillRectangle(st->dpy, drawable, fgc, p3ax, p3ay, + st->pscale, st->pscale); /* XPutPixel(f->off_map, p3bx, p3by, f->fgcolor); */ c = trans_point(st, p3bx, p3by, 255, 0.75, f); XSetForeground(st->dpy, fgc, get_pixel (st, c)); - XDrawPoint(st->dpy, drawable, fgc, p3bx, p3by); + XFillRectangle(st->dpy, drawable, fgc, p3bx, p3by, + st->pscale, st->pscale); XSetForeground(st->dpy, fgc, f->fgcolor); } } @@ -405,6 +410,12 @@ intermomentary_init (Display *dpy, Window window) gcv.background = get_pixel_resource(dpy, st->xgwa.colormap, "background", "Background"); + st->pscale = 1; + if (st->xgwa.width > 2560 || st->xgwa.height > 2560) + st->pscale *= 3; /* Retina displays */ + /* We aren't increasing the spacing between the pixels, just the size. */ + /* #### This doesn't seem to help. Still needs lowrez. */ + { XColor fgc, bgc; int fgh, bgh; diff --git a/hacks/julia.c b/hacks/julia.c index 7311ce72..f2d8139e 100644 --- a/hacks/julia.c +++ b/hacks/julia.c @@ -70,6 +70,7 @@ typedef struct { int inc; int circsize; int erase; + int scale; int pix; long itree; int buffer; @@ -80,7 +81,7 @@ typedef struct { Cursor cursor; #endif GC stippledGC; - XPoint **pointBuffer; /* pointer for XDrawPoints */ + XRectangle **pointBuffer; Bool button_down_p; int mouse_x, mouse_y; @@ -173,6 +174,9 @@ init_julia(ModeInfo * mi) if (jp->depth > 10) jp->depth = 10; + jp->scale = 1; + if (MI_WIDTH(mi) > 2560 || MI_HEIGHT(mi) > 2560) + jp->scale *= 3; /* Retina displays */ #ifndef HAVE_JWXYZ if (jp->button_down_p && !jp->cursor && !jp->cursor) @@ -205,12 +209,13 @@ init_julia(ModeInfo * mi) gcv.foreground = 0; bg_gc = XCreateGC(display, jp->pixmap, GCForeground, &gcv); XFillRectangle(display, jp->pixmap, bg_gc, - 0, 0, jp->circsize, jp->circsize); + 0, 0, jp->circsize, jp->circsize); if (jp->circsize < 2) - XDrawPoint(display, jp->pixmap, fg_gc, 0, 0); + XFillRectangle(display, jp->pixmap, fg_gc, 0, 0, + jp->scale, jp->scale); else - XFillArc(display, jp->pixmap, fg_gc, - 0, 0, jp->circsize, jp->circsize, 0, 23040); + XFillArc(display, jp->pixmap, fg_gc, + 0, 0, jp->circsize, jp->circsize, 0, 23040); if (fg_gc != None) XFreeGC(display, fg_gc); if (bg_gc != None) @@ -238,13 +243,15 @@ init_julia(ModeInfo * mi) jp->inc = ((LRAND() & 1) * 2 - 1) * NRAND(200); jp->nbuffers = (MI_CYCLES(mi) + 1); if (!jp->pointBuffer) - jp->pointBuffer = (XPoint **) calloc(jp->nbuffers, sizeof (XPoint *)); + jp->pointBuffer = (XRectangle **) + calloc(jp->nbuffers, sizeof (*jp->pointBuffer)); for (i = 0; i < jp->nbuffers; ++i) if (jp->pointBuffer[i]) - (void) memset((char *) jp->pointBuffer[i], 0, - numpoints * sizeof (XPoint)); + memset(jp->pointBuffer[i], 0, + numpoints * sizeof (**jp->pointBuffer)); else - jp->pointBuffer[i] = (XPoint *) calloc(numpoints, sizeof (XPoint)); + jp->pointBuffer[i] = (XRectangle *) + calloc(numpoints, sizeof (**jp->pointBuffer)); jp->buffer = 0; jp->redrawing = 0; jp->erase = 0; @@ -309,13 +316,15 @@ draw_julia (ModeInfo * mi) double r, theta; register double xr = 0.0, xi = 0.0; int k = 64, rnd = 0, i, j; - XPoint *xp = jp->pointBuffer[jp->buffer], old_circle, new_circle; + XRectangle *xp = jp->pointBuffer[jp->buffer], old_circle, new_circle; old_circle.x = (int) (jp->centerx * jp->cr / 2) + jp->centerx - 2; old_circle.y = (int) (jp->centery * jp->ci / 2) + jp->centery - 2; + old_circle.width = old_circle.height = jp->scale; incr(mi, jp); new_circle.x = (int) (jp->centerx * jp->cr / 2) + jp->centerx - 2; new_circle.y = (int) (jp->centery * jp->ci / 2) + jp->centery - 2; + new_circle.width = new_circle.height = jp->scale; XSetForeground(display, gc, MI_WIN_BLACK_PIXEL(mi)); XFillArc(display, window, gc, old_circle.x-jp->circsize/2-2, @@ -337,8 +346,8 @@ draw_julia (ModeInfo * mi) 0, 360*64); if (jp->erase == 1) { - XDrawPoints(display, window, gc, - jp->pointBuffer[jp->buffer], numpoints, CoordModeOrigin); + XFillRectangles(display, window, gc, + jp->pointBuffer[jp->buffer], numpoints); } jp->inc++; if (MI_NPIXELS(mi) > 2) { @@ -377,14 +386,15 @@ draw_julia (ModeInfo * mi) } xp->x = jp->centerx + (int) ((jp->centerx >> 1) * xr); xp->y = jp->centery + (int) ((jp->centery >> 1) * xi); + xp->width = xp->height = jp->scale; xp++; } jp->itree = 0; apply(jp, xr, xi, jp->depth); - XDrawPoints(display, window, gc, - jp->pointBuffer[jp->buffer], numpoints, CoordModeOrigin); + XFillRectangles (display, window, gc, + jp->pointBuffer[jp->buffer], numpoints); jp->buffer++; if (jp->buffer > jp->nbuffers - 1) { @@ -394,8 +404,8 @@ draw_julia (ModeInfo * mi) if (jp->redrawing) { for (i = 0; i < REDRAWSTEP; i++) { j = (jp->buffer - jp->redrawpos + jp->nbuffers) % jp->nbuffers; - XDrawPoints(display, window, gc, - jp->pointBuffer[j], numpoints, CoordModeOrigin); + XFillRectangles (display, window, gc, + jp->pointBuffer[j], numpoints); if (++(jp->redrawpos) >= jp->nbuffers) { jp->redrawing = 0; diff --git a/hacks/kaleidescope.c b/hacks/kaleidescope.c index 8070368a..d3bba22c 100644 --- a/hacks/kaleidescope.c +++ b/hacks/kaleidescope.c @@ -441,13 +441,32 @@ init_g (GLOBAL *g) } +static void +kaleidescope_reshape (Display *dpy, Window window, void *closure, + unsigned int w, unsigned int h) +{ + GLOBAL *g = (GLOBAL *) closure; + int lw = 1; + g->xmax = w; + g->ymax = h; + g->xoff = g->xmax/2; + g->yoff = g->ymax/2; + + if (w > 2560 || h > 2560) lw = 3; /* Retina displays */ + XSetLineAttributes (dpy, g->draw_gc, lw, LineSolid, CapRound, JoinRound); + XSetLineAttributes (dpy, g->erase_gc, lw, LineSolid, CapRound, JoinRound); +} + static void * kaleidescope_init (Display *dpy, Window window) { GLOBAL *g = (GLOBAL *) calloc (1, sizeof(*g)); + XWindowAttributes xgwa; g->dpy = dpy; g->window = window; init_g (g); + XGetWindowAttributes (dpy, window, &xgwa); + kaleidescope_reshape (dpy, window, g, xgwa.width, xgwa.height); create_objects(g); init_objects (g); return g; @@ -465,17 +484,6 @@ kaleidescope_draw (Display *dpy, Window window, void *closure) return g->delay; } -static void -kaleidescope_reshape (Display *dpy, Window window, void *closure, - unsigned int w, unsigned int h) -{ - GLOBAL *g = (GLOBAL *) closure; - g->xmax = w; - g->ymax = h; - g->xoff = g->xmax/2; - g->yoff = g->ymax/2; -} - static Bool kaleidescope_event (Display *dpy, Window window, void *closure, XEvent *event) { diff --git a/hacks/kumppa.c b/hacks/kumppa.c index ccde2546..770c6ec0 100644 --- a/hacks/kumppa.c +++ b/hacks/kumppa.c @@ -46,7 +46,7 @@ from the X Consortium. static const char *kumppa_defaults [] ={ ".background: black", - ".lowrez: true", +/* ".lowrez: true", */ "*fpsSolid: true", "*speed: 0.1", "*delay: 10000", @@ -117,6 +117,7 @@ struct state { #endif /* HAVE_DOUBLE_BUFFER_EXTENSION */ int draw_count; + int pscale; }; @@ -366,15 +367,20 @@ static Bool InitializeAll(struct state *st) XChangeWindowAttributes(st->dpy,st->win[0],CWBackingStore,&xswa);*/ xgcv.function=GXcopy; + st->pscale = 1; + if (xgwa.width > 2560 || xgwa.height > 2560) + st->pscale *= 3; /* Retina displays */ + xgcv.foreground=get_pixel_resource (st->dpy, cmap, "background", "Background"); - st->fgc[32]=XCreateGC(st->dpy,st->win[0],GCForeground|GCFunction,&xgcv); + xgcv.line_width = st->pscale; + st->fgc[32]=XCreateGC(st->dpy,st->win[0],GCForeground|GCFunction|GCLineWidth,&xgcv); n=0; if (mono_p) { st->fgc[0]=st->fgc[32]; xgcv.foreground=get_pixel_resource (st->dpy, cmap, "foreground", "Foreground"); - st->fgc[1]=XCreateGC(st->dpy,st->win[0],GCForeground|GCFunction,&xgcv); + st->fgc[1]=XCreateGC(st->dpy,st->win[0],GCForeground|GCFunction|GCLineWidth,&xgcv); for (i=0;i<32;i+=2) st->fgc[i]=st->fgc[0]; for (i=1;i<32;i+=2) st->fgc[i]=st->fgc[1]; } else @@ -386,9 +392,9 @@ static Bool InitializeAll(struct state *st) color.flags=DoRed|DoGreen|DoBlue; XAllocColor(st->dpy,cmap,&color); xgcv.foreground=color.pixel; - st->fgc[i]=XCreateGC(st->dpy,st->win[0],GCForeground|GCFunction,&xgcv); + st->fgc[i]=XCreateGC(st->dpy,st->win[0],GCForeground|GCFunction|GCLineWidth,&xgcv); } - st->cgc=XCreateGC(st->dpy,st->win[0],GCForeground|GCFunction,&xgcv); + st->cgc=XCreateGC(st->dpy,st->win[0],GCForeground|GCFunction|GCLineWidth,&xgcv); XSetGraphicsExposures(st->dpy,st->cgc,False); st->cosilines = get_boolean_resource(st->dpy, "random","Boolean"); @@ -484,10 +490,12 @@ kumppa_draw (Display *d, Window w, void *closure) if (a>=32) a=32; b=Satnum(32)-16+st->midx; st->draw_count=Satnum(32)-16+st->midy; - XFillRectangle(st->dpy,st->win[0],st->fgc[a],b,st->draw_count,2,2); + XFillRectangle(st->dpy,st->win[0],st->fgc[a],b,st->draw_count, + 2*st->pscale,2*st->pscale); } } - XFillRectangle(st->dpy,st->win[0],st->fgc[32],st->midx-2,st->midy-2,4,4); + XFillRectangle(st->dpy,st->win[0],st->fgc[32],st->midx-2,st->midy-2, + 4*st->pscale,4*st->pscale); rotate(st); #ifdef HAVE_DOUBLE_BUFFER_EXTENSION if (st->usedouble) XdbeSwapBuffers(st->dpy,&st->xdswp,1); diff --git a/hacks/lisa.c b/hacks/lisa.c index d0303b80..f403f9bd 100644 --- a/hacks/lisa.c +++ b/hacks/lisa.c @@ -58,7 +58,8 @@ static const char sccsid[] = "@(#)lisa.c 5.00 2000/11/01 xlockmore"; "*size: 500 \n" \ "*ncolors: 64 \n" \ "*fpsSolid: true \n" \ - "*lowrez: True \n" \ + +/* "*lowrez: True \n" \ */ # define UNIFORM_COLORS # define release_lisa 0 @@ -567,6 +568,9 @@ initlisa(ModeInfo * mi, lisas * loop) LINESTYLE, LINECAP, LINEJOIN); #endif /* DRAWLINES */ + if (mi->xgwa.width > 2560 || mi->xgwa.height > 2560) + loop->linewidth *= 2; /* Retina displays */ + if ( loop->cstep < xMaxLines ) { /* we can send each color segment in a single request * because the max request length is long enough diff --git a/hacks/loop.c b/hacks/loop.c index 8d9cc95e..b0a96c56 100644 --- a/hacks/loop.c +++ b/hacks/loop.c @@ -92,7 +92,8 @@ static const char sccsid[] = "@(#)loop.c 5.01 2000/03/15 xlockmore"; "*ncolors: 15 \n" \ "*fpsSolid: true \n" \ "*ignoreRotation: True \n" \ - ".lowrez: True \n" \ + +/* ".lowrez: True \n" \ */ # define reshape_loop 0 # define loop_handle_event 0 @@ -1527,6 +1528,8 @@ init_loop (ModeInfo * mi) } else lp->ys = MIN(size, MAX(MINSIZE, MIN(lp->width, lp->height) / HEX_MINGRIDSIZE)); + if (lp->width > 2560 || lp->height > 2560) + lp->ys *= 3; /* Retina displays */ lp->xs = lp->ys; nccols = MAX(lp->width / lp->xs - 2, HEX_MINGRIDSIZE); ncrows = MAX(lp->height / lp->ys - 1, HEX_MINGRIDSIZE); @@ -1551,6 +1554,8 @@ init_loop (ModeInfo * mi) } else lp->ys = MIN(size, MAX(MINSIZE, MIN(lp->width, lp->height) / MINGRIDSIZE)); + if (lp->width > 2560 || lp->height > 2560) + lp->ys *= 3; /* Retina displays */ lp->xs = lp->ys; lp->ncols = MAX(lp->width / lp->xs, ADAM_LOOPX + 1); lp->nrows = MAX(lp->height / lp->ys, ADAM_LOOPX + 1); diff --git a/hacks/marbling.c b/hacks/marbling.c index a0c3ee01..44ccdc3d 100644 --- a/hacks/marbling.c +++ b/hacks/marbling.c @@ -1,4 +1,4 @@ -/* marbling, Copyright (c) 2021 Jamie Zawinski +/* marbling, Copyright © 2021-2022 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 @@ -161,7 +161,7 @@ const unsigned lerp_loss = 2; /* Min: 2 */ /* == 8 for x86 and scalar. (Nice.) */ /* const unsigned noise_out_bits = noise_work_bits - 3 * lerp_loss + 1; */ -#define noise_out_bits ((noise_work_bits - 3) * (lerp_loss + 1)) +#define noise_out_bits ((noise_work_bits - 3) * lerp_loss + 1) const unsigned noise_in_bits = 8; static INLINE v_uhi @@ -188,6 +188,19 @@ fade (v_uhi t) The multiplications below should be unsigned, but the result is the same either way, because it's getting the low 16 bits (not the high 16). + + All the v_(u)hi variables are vectors of 16-bit fixed-point ints, maybe + signed, maybe unsigned. noise_in_bits and noise_out_bits determine how + many fractional bits are in use for the v_uhi variables that go into/come + out of noise(). And noise_out_bits is governed by the big expression at + the end of noise(): + + 1. Going in, there's noise_work_bits worth of fraction in c0-c7. + 2. The multiply in LERP() (either vqdmulhq_s16 or IMUL_HI) shifts + lerp_loss bits of fraction off the end of each int16. Because + LERP() is nested three deep, it's 3 * lerp_loss. + 3. SCALE() shifts things one bit in the other direction. + Hence, noise_work_bits - 3 * lerp_loss + 1. */ #if __ARM_NEON v_uhi ut2 = (t * t) >> 1; diff --git a/hacks/memscroller.c b/hacks/memscroller.c index 55271d21..f1c91048 100644 --- a/hacks/memscroller.c +++ b/hacks/memscroller.c @@ -85,7 +85,8 @@ memscroller_init (Display *dpy, Window window) } st->border = get_integer_resource (dpy, "borderSize", "BorderSize"); - if (st->xgwa.width > 2560) st->border *= 2; /* Retina displays */ + if (st->xgwa.width > 2560 || st->xgwa.height > 2560) + st->border *= 2; /* Retina displays */ { int i; @@ -179,7 +180,8 @@ memscroller_init (Display *dpy, Window window) sc->which = i; sc->speed = i+1; - if (st->xgwa.width > 2560) sc->speed *= 2.5; /* Retina displays */ + if (st->xgwa.width > 2560 || st->xgwa.height > 2560) + sc->speed *= 2.5; /* Retina displays */ sc->image = create_xshm_image (st->dpy, st->xgwa.visual, st->xgwa.depth, @@ -214,7 +216,8 @@ reshape_memscroller (state *st) { sc->rez = 6; /* #### */ - if (st->xgwa.width > 2560) sc->rez *= 2.5; /* Retina displays */ + if (st->xgwa.width > 2560 || st->xgwa.height > 2560) + sc->rez *= 2.5; /* Retina displays */ sc->rect.width = (((int) (st->xgwa.width * 0.8) / sc->rez) * sc->rez); diff --git a/hacks/munch.c b/hacks/munch.c index f24629fc..e5c6c4db 100644 --- a/hacks/munch.c +++ b/hacks/munch.c @@ -429,7 +429,7 @@ munch_free (Display *dpy, Window window, void *closure) static const char *munch_defaults [] = { - ".lowrez: true", +/* ".lowrez: true", */ ".background: black", ".foreground: white", "*fpsSolid: true", diff --git a/hacks/nerverot.c b/hacks/nerverot.c index 7adc94c8..3cf162ab 100644 --- a/hacks/nerverot.c +++ b/hacks/nerverot.c @@ -1198,6 +1198,14 @@ static void initParams (struct state *st) problems = 1; } + { + XWindowAttributes xgwa; + XGetWindowAttributes (st->dpy, st->window, &xgwa); + if (st->lineWidth <= 0) st->lineWidth = 1; + if (xgwa.width > 2560 || xgwa.height > 2560) + st->lineWidth *= 3; /* Retina displays */ + } + st->nervousness = get_float_resource (st->dpy, "nervousness", "Float"); if ((st->nervousness < 0) || (st->nervousness > 1)) { diff --git a/hacks/noseguy.c b/hacks/noseguy.c index e5e2b0be..36a9ac36 100644 --- a/hacks/noseguy.c +++ b/hacks/noseguy.c @@ -157,7 +157,7 @@ init_images (struct state *st) images[i]->m = mask; } - if (xgwa.width > 2560) /* Retina display */ + if (xgwa.width > 2560 || xgwa.height > 2560) /* Retina displays */ { for (i = 0; i < sizeof (images) / sizeof(*images); i++) { diff --git a/hacks/penetrate.c b/hacks/penetrate.c index 85c1c08b..7e1d18c2 100644 --- a/hacks/penetrate.c +++ b/hacks/penetrate.c @@ -126,6 +126,7 @@ struct state { int draw_xlim, draw_ylim; int draw_reset; + int pscale; }; @@ -380,6 +381,10 @@ penetrate_init (Display *dpy, Window window) XGetWindowAttributes (st->dpy, st->window, &xgwa); st->cmap = xgwa.colormap; + st->pscale = 1; + if (xgwa.width > 2560 || xgwa.height > 2560) + st->pscale *= 3; /* Retina displays */ + st->lrate = 80; st->nextBonus = kFirstBonus; st->aim = 180; @@ -502,11 +507,14 @@ static void DrawCity(struct state *st, int x, int y, XColor col) { XSetForeground (st->dpy, st->draw_gc, col.pixel); XFillRectangle(st->dpy, st->window, st->draw_gc, - x - 30, y - 40, 60, 40); + x - 30 * st->pscale, y - 40 * st->pscale, + 60 * st->pscale, 40 * st->pscale); XFillRectangle(st->dpy, st->window, st->draw_gc, - x - 20, y - 50, 10, 10); + x - 20 * st->pscale, y - 50 * st->pscale, + 10 * st->pscale, 10 * st->pscale); XFillRectangle(st->dpy, st->window, st->draw_gc, - x + 10, y - 50, 10, 10); + x + 10 * st->pscale, y - 50 * st->pscale, + 10 * st->pscale, 10 * st->pscale); } static void DrawCities(struct state *st, int xlim, int ylim) @@ -539,7 +547,7 @@ static void LoopMissiles(struct state *st, int xlim, int ylim) /* erase old one */ - XSetLineAttributes(st->dpy, st->draw_gc, 4, 0,0,0); + XSetLineAttributes(st->dpy, st->draw_gc, 4*st->pscale, 0,0,0); XSetForeground (st->dpy, st->draw_gc, m->color.pixel); XDrawLine(st->dpy, st->window, st->draw_gc, old_x, old_y, m->x, m->y); @@ -566,7 +574,7 @@ static void LoopMissiles(struct state *st, int xlim, int ylim) else { int dx = abs(m->x - b->x); int dy = abs(m->y - b->y); - int r = b->rad + 2; + int r = b->rad + 2 * st->pscale; if ((dx < r) && (dy < r)) if (dx * dx + dy * dy < r * r) { m->alive = 0; @@ -580,7 +588,7 @@ static void LoopMissiles(struct state *st, int xlim, int ylim) float my_pos; /* we just died */ Explode(st, m->x, m->y, kBoomRad + max, m->color, 0); - XSetLineAttributes(st->dpy, st->erase_gc, 4, 0,0,0); + XSetLineAttributes(st->dpy, st->erase_gc, 4*st->pscale, 0,0,0); /* In a perfect world, we could simply erase a line from (m->startx, m->starty) to (m->x, m->y). This is not a perfect world. */ @@ -609,7 +617,7 @@ static void LoopLasers(struct state *st, int xlim, int ylim) continue; if (m->oldx != -1) { - XSetLineAttributes(st->dpy, st->erase_gc, 2, 0,0,0); + XSetLineAttributes(st->dpy, st->erase_gc, 2*st->pscale, 0,0,0); XDrawLine(st->dpy, st->window, st->erase_gc, m->oldx2, m->oldy2, m->oldx, m->oldy); } @@ -625,7 +633,7 @@ static void LoopLasers(struct state *st, int xlim, int ylim) m->oldx = x; m->oldy = y; - XSetLineAttributes(st->dpy, st->draw_gc, 2, 0,0,0); + XSetLineAttributes(st->dpy, st->draw_gc, 2*st->pscale, 0,0,0); XSetForeground (st->dpy, st->draw_gc, m->color.pixel); XDrawLine(st->dpy, st->window, st->draw_gc, m->x, m->y, x, y); @@ -648,7 +656,7 @@ static void LoopLasers(struct state *st, int xlim, int ylim) else { int dx = abs(m->x - b->x); int dy = abs(m->y - b->y); - int r = b->rad + 2; + int r = b->rad + 2 * st->pscale; if (b->oflaser) continue; if ((dx < r) && (dy < r)) @@ -683,13 +691,23 @@ static void LoopBooms(struct state *st, int xlim, int ylim) m->rad++; if (m->rad >= m->max) m->outgoing = 0; - XSetLineAttributes(st->dpy, st->draw_gc, 1, 0,0,0); + XSetLineAttributes(st->dpy, st->draw_gc, 1*st->pscale, 0,0,0); XSetForeground (st->dpy, st->draw_gc, m->color.pixel); - XDrawArc(st->dpy, st->window, st->draw_gc, m->x - m->rad, m->y - m->rad, m->rad * 2, m->rad * 2, 0, 360 * 64); + XDrawArc(st->dpy, st->window, st->draw_gc, + m->x - m->rad * st->pscale, + m->y - m->rad * st->pscale, + m->rad * 2 * st->pscale, + m->rad * 2 * st->pscale, + 0, 360 * 64); } else { - XSetLineAttributes(st->dpy, st->erase_gc, 1, 0,0,0); - XDrawArc(st->dpy, st->window, st->erase_gc, m->x - m->rad, m->y - m->rad, m->rad * 2, m->rad * 2, 0, 360 * 64); + XSetLineAttributes(st->dpy, st->erase_gc, 1*st->pscale, 0,0,0); + XDrawArc(st->dpy, st->window, st->erase_gc, + m->x - m->rad * st->pscale, + m->y - m->rad * st->pscale, + m->rad * 2 * st->pscale, + m->rad * 2 * st->pscale, + 0, 360 * 64); m->rad--; if (m->rad <= 0) m->alive = 0; @@ -787,7 +805,7 @@ static void NewLevel(struct state *st, int xlim, int ylim) int sumwidth; /* draw live cities */ XFillRectangle(st->dpy, st->window, st->erase_gc, - 0, ylim - 100, xlim, 100); + 0, ylim - 100 * st->pscale, xlim, 100 * st->pscale); sprintf(buf, "X %ld", st->level * 100L); /* how much they get */ @@ -851,7 +869,7 @@ static void NewLevel(struct state *st, int xlim, int ylim) } XFillRectangle(st->dpy, st->window, st->erase_gc, - 0, 0, xlim, ylim - 100); + 0, 0, xlim, ylim - 100 * st->pscale); if (!st->bround) st->level++; @@ -882,7 +900,7 @@ static void NewLevel(struct state *st, int xlim, int ylim) XSync(st->dpy, False); usleep(1000000); XFillRectangle(st->dpy, st->window, st->erase_gc, - 0, 0, xlim, ylim - 100); + 0, 0, xlim, ylim - 100 * st->pscale); } } @@ -997,7 +1015,7 @@ penetrate_free (Display *dpy, Window window, void *closure) static const char *penetrate_defaults [] = { - ".lowrez: true", +/* ".lowrez: true", */ ".background: black", ".foreground: white", "*fpsTop: true", diff --git a/hacks/penrose.c b/hacks/penrose.c index 00bae0c0..09716593 100644 --- a/hacks/penrose.c +++ b/hacks/penrose.c @@ -460,7 +460,7 @@ init_penrose(ModeInfo * mi) size = MI_SIZE(mi); tp->line_width = 1; - if (MI_WIDTH(mi) > 2560) { /* Retina displays */ + if (MI_WIDTH(mi) > 2560 || MI_HEIGHT(mi) > 2560) { /* Retina displays */ size *= 3; tp->line_width *= 3; } diff --git a/hacks/petri.c b/hacks/petri.c index 1906369a..ae9f62c4 100644 --- a/hacks/petri.c +++ b/hacks/petri.c @@ -252,10 +252,15 @@ setup_display (struct state *st) int mem_throttle = 0; char *s; + XGetWindowAttributes (st->dpy, st->window, &xgwa); + if (cell_size < 1) cell_size = 1; osize = cell_size; + if (xgwa.width > 2560 || xgwa.height > 2560) + cell_size *= 2; /* Retina displays */ + s = get_string_resource (st->dpy, "memThrottle", "MemThrottle"); if (s) { @@ -279,8 +284,6 @@ setup_display (struct state *st) free (s); } - XGetWindowAttributes (st->dpy, st->window, &xgwa); - st->originalcolors = get_boolean_resource (st->dpy, "originalcolors", "Boolean"); st->count = get_integer_resource (st->dpy, "count", "Integer"); diff --git a/hacks/phosphor.c b/hacks/phosphor.c index 80a4f711..67a1fe6b 100644 --- a/hacks/phosphor.c +++ b/hacks/phosphor.c @@ -1,4 +1,4 @@ -/* xscreensaver, Copyright © 1999-2021 Jamie Zawinski +/* xscreensaver, Copyright © 1999-2022 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 @@ -198,7 +198,11 @@ phosphor_init (Display *dpy, Window window) state->ticks = STATE_MAX + get_integer_resource (dpy, "ticks", "Integer"); state->escstate = 0; - if (state->xgwa.width > 2560) state->scale *= 2; /* Retina displays */ + if (state->scale <= 0) state->scale = 1; + if (state->ticks <= 0) state->ticks = 1; + + if (state->xgwa.width > 2560 || state->xgwa.height > 2560) + state->scale *= 2; /* Retina displays */ state->cursor_blink = get_integer_resource (dpy, "cursor", "Time"); @@ -1468,7 +1472,7 @@ phosphor_free (Display *dpy, Window window, void *closure) static const char *phosphor_defaults [] = { -/* ".lowrez: true",*/ +/* ".lowrez: true", */ ".background: Black", ".foreground: #00FF00", "*fpsSolid: true", diff --git a/hacks/piecewise.c b/hacks/piecewise.c index 9baa88df..c21e23ff 100644 --- a/hacks/piecewise.c +++ b/hacks/piecewise.c @@ -895,12 +895,16 @@ piecewise_init (Display *dd, Window ww) else st->b = st->window; + st->gcv.line_width = 1; + if (st->xgwa.width > 2560 || st->xgwa.height > 2560) + st->gcv.line_width *= 3; /* Retina displays */ + /* erasure gc */ st->gcv.foreground = get_pixel_resource(st->dpy, st->xgwa.colormap, "background", "Background"); - st->erase_gc = XCreateGC (st->dpy, st->b, GCForeground, &st->gcv); + st->erase_gc = XCreateGC (st->dpy, st->b, GCForeground|GCLineWidth, &st->gcv); /* drawing gc */ - st->flags = GCForeground; + st->flags = GCForeground|GCLineWidth; st->color_index = random() % st->ncolors; st->gcv.foreground = st->colors[st->color_index].pixel; st->draw_gc = XCreateGC(st->dpy, st->b, st->flags, &st->gcv); diff --git a/hacks/ripples.c b/hacks/ripples.c index 7e396433..2fdc974b 100644 --- a/hacks/ripples.c +++ b/hacks/ripples.c @@ -520,12 +520,7 @@ setup_X(struct state *st) long gcflags; gcv.function = GXcopy; - gcv.subwindow_mode = IncludeInferiors; - gcflags = GCFunction; - if (use_subwindow_mode_p(xgwa.screen, st->window)) /* see grabscreen.c */ - gcflags |= GCSubwindowMode; - st->gc = XCreateGC(st->dpy, st->window, gcflags, &gcv); st->img_loader = load_image_async_simple (0, xgwa.screen, st->window, diff --git a/hacks/rocks.c b/hacks/rocks.c index fea36607..fea3c824 100644 --- a/hacks/rocks.c +++ b/hacks/rocks.c @@ -24,7 +24,7 @@ #define MIN_DEPTH 2 /* rocks disappear when they get this close */ #define MAX_DEPTH 60 /* this is where rocks appear */ #define MIN_SIZE 3 /* how small where pixmaps are not used */ -#define MAX_SIZE 200 /* how big (in pixels) rocks are at depth 1 */ +#define MAX_SIZE 400 /* how big (in pixels) rocks are at depth 1 */ #define DEPTH_SCALE 100 /* how many ticks there are between depths */ #define SIN_RESOLUTION 1000 @@ -521,7 +521,7 @@ rocks_free (Display *dpy, Window window, void *closure) static const char *rocks_defaults [] = { - ".lowrez: true", +/* ".lowrez: true", */ ".background: Black", ".foreground: #E9967A", "*fpsSolid: true", diff --git a/hacks/rorschach.c b/hacks/rorschach.c index 124ac73f..58b1c8f8 100644 --- a/hacks/rorschach.c +++ b/hacks/rorschach.c @@ -22,6 +22,7 @@ struct state { Bool xsym, ysym; int sleep_time; int xlim, ylim; + int scale; XColor color; int current_x, current_y, remaining_iterations; eraser_state *eraser; @@ -36,6 +37,12 @@ rorschach_init (Display *dpy, Window window) Colormap cmap; XWindowAttributes xgwa; XGetWindowAttributes (dpy, window, &xgwa); + + st->scale = 1; + if (xgwa.width > 2560 || xgwa.height > 2560) + st->scale *= 3; /* Retina displays */ + + cmap = xgwa.colormap; gcv.foreground = st->default_fg_pixel = get_pixel_resource (dpy, cmap, "foreground", "Foreground"); @@ -93,7 +100,7 @@ static void rorschach_draw_step (Display *dpy, Window window, struct state *st) { # define ITER_CHUNK 300 - XPoint points [4 * ITER_CHUNK]; + XRectangle points [4 * ITER_CHUNK]; int x = st->current_x; int y = st->current_y; int i, j = 0; @@ -108,27 +115,31 @@ rorschach_draw_step (Display *dpy, Window window, struct state *st) y += ((random () % (1 + (st->offset << 1))) - st->offset); points [j].x = x; points [j].y = y; + points[j].width = points[j].height = st->scale; j++; if (st->xsym) { points [j].x = st->xlim - x; points [j].y = y; + points[j].width = points[j].height = st->scale; j++; } if (st->ysym) { points [j].x = x; points [j].y = st->ylim - y; + points[j].width = points[j].height = st->scale; j++; } if (st->xsym && st->ysym) { points [j].x = st->xlim - x; points [j].y = st->ylim - y; + points[j].width = points[j].height = st->scale; j++; } } - XDrawPoints (dpy, window, st->draw_gc, points, j, CoordModeOrigin); + XFillRectangles (dpy, window, st->draw_gc, points, j); st->remaining_iterations -= this_iterations; if (st->remaining_iterations < 0) st->remaining_iterations = 0; st->current_x = x; diff --git a/hacks/rotor.c b/hacks/rotor.c index c22479b9..cee354f0 100644 --- a/hacks/rotor.c +++ b/hacks/rotor.c @@ -39,7 +39,8 @@ static const char sccsid[] = "@(#)rotor.c 5.00 2000/11/01 xlockmore"; "*size: -6 \n" \ "*ncolors: 200 \n" \ "*fpsSolid: true \n" \ - "*lowrez: True \n" \ + +/* "*lowrez: True \n" \ */ # define SMOOTH_COLORS # define release_rotor 0 @@ -224,6 +225,9 @@ init_rotor (ModeInfo * mi) if (rp->linewidth < 0) rp->linewidth = NRAND(-rp->linewidth) + 1; + if (mi->xgwa.width > 2560 || mi->xgwa.height > 2560) + rp->linewidth *= 2; /* Retina displays */ + MI_CLEARWINDOW(mi); } diff --git a/hacks/rotzoomer.c b/hacks/rotzoomer.c index 08018197..b976c682 100644 --- a/hacks/rotzoomer.c +++ b/hacks/rotzoomer.c @@ -474,10 +474,7 @@ setup_X (struct state *st) st->height--; gcv.function = GXcopy; - gcv.subwindow_mode = IncludeInferiors; gcflags = GCFunction; - if (use_subwindow_mode_p (xgwa.screen, st->window)) /* see grabscreen.c */ - gcflags |= GCSubwindowMode; st->gc = XCreateGC (st->dpy, st->window, gcflags, &gcv); if (st->pm) XFreePixmap (st->dpy, st->pm); st->pm = XCreatePixmap (st->dpy, st->window, diff --git a/hacks/scooter.c b/hacks/scooter.c index 9a66da68..de93f694 100644 --- a/hacks/scooter.c +++ b/hacks/scooter.c @@ -45,7 +45,9 @@ "*fullrandom: True \n" \ "*verbose: False \n" \ "*fpsSolid: true \n" \ - "*lowrez: True \n" + +/* "*lowrez: True \n" */ + # define reshape_scooter 0 # define scooter_handle_event 0 #include "xlockmore.h" /* in xscreensaver distribution */ @@ -130,6 +132,7 @@ typedef struct { float aspect_scale; Bool halt_scooter; + int pscale; } scooterstruct; static scooterstruct *scooters = (scooterstruct *) NULL; @@ -389,6 +392,10 @@ static void init_scooter(ModeInfo *mi) sp->rotationDuration = 1; sp->rotationStep = 0; + + sp->pscale = 1; + if (mi->xgwa.width > 2560 || mi->xgwa.height > 2560) + sp->pscale = 2; /* Retina displays */ } static void cleardoors(ModeInfo *mi) @@ -742,7 +749,8 @@ static void drawdoors(ModeInfo *mi) rect.rightbottom.x = width - 1; rect.rightbottom.y = height - 1; - XSetLineAttributes(display, gc, 2, LineSolid, CapNotLast, JoinRound); + XSetLineAttributes(display, gc, 2*sp->pscale, + LineSolid, CapNotLast, JoinRound); #ifdef _DRAW_ZELEMENTS XSetForeground(display, gc, MI_WHITE_PIXEL(mi)); @@ -753,7 +761,8 @@ static void drawdoors(ModeInfo *mi) proj = projection(sp, zelements[i].pos.z) * sp->aspect_scale; p.x = midx + (sp->zelements[i].pos.x * proj / SPACE_XY_FACTOR); p.y = midy - (sp->zelements[i].pos.y * proj / SPACE_XY_FACTOR); - XDrawPoint(display, window, gc, p.x, p.y); + XFillRectangle(display, window, gc, p.x, p.y, + st->pscale, st->pscale); } #endif @@ -862,6 +871,7 @@ ENTRYPOINT void drawstars(ModeInfo *mi) XSetForeground(display, gc, MI_WHITE_PIXEL(mi)); +#if 0 if ((lefttop.x == rightbottom.x) && (lefttop.y == rightbottom.y)) { /* star is exactly 1 pixel */ @@ -895,6 +905,13 @@ ENTRYPOINT void drawstars(ModeInfo *mi) rightbottom.x - lefttop.x, rightbottom.y - lefttop.y); } +# else + XFillArc (display, window, gc, + lefttop.x, lefttop.y, + rightbottom.x - lefttop.x, + rightbottom.y - lefttop.y, + 0, 360 * 64); +# endif } } diff --git a/hacks/screenhack.c b/hacks/screenhack.c index 4048f62c..c80199bd 100644 --- a/hacks/screenhack.c +++ b/hacks/screenhack.c @@ -855,7 +855,7 @@ main (int argc, char **argv) x = 18; } x += size; - fprintf (stderr, "%s", sw); + fprintf (stderr, "-%s", sw); /* two dashes */ if (argp) fprintf (stderr, " "); if (i != merged_options_size - 1) fprintf (stderr, ", "); } diff --git a/hacks/screenhackI.h b/hacks/screenhackI.h index e11388ef..0517651c 100644 --- a/hacks/screenhackI.h +++ b/hacks/screenhackI.h @@ -1,4 +1,4 @@ -/* xscreensaver, Copyright (c) 1992-2021 Jamie Zawinski +/* xscreensaver, Copyright © 1992-2022 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 @@ -120,7 +120,17 @@ # else # include # endif -# endif + + /* Sep 2022: The current Raspberry Pi 4b drivers don't do GL_LINE_SMOOTH + properly: lines show up as barely-visible static noise. So disable + it globally by just aliasing it to something mostly harmless. */ +# if defined(__linux__) && defined(__aarch64__) +# undef GL_LINE_SMOOTH +# define GL_LINE_SMOOTH GL_NORMALIZE +# define GL_LINE_SMOOTH_BROKEN /* To protect glDiable(GL_LINE_SMOOTH) */ +# endif + +# endif /* real X11 */ # ifdef HAVE_JWZGLES # include "jwzgles.h" @@ -158,7 +168,7 @@ #include "resources.h" #include "hsv.h" #include "colors.h" -#include "grabscreen.h" +#include "grabclient.h" #include "visual.h" #include "fps.h" #include "xft.h" diff --git a/hacks/sierpinski.c b/hacks/sierpinski.c index ceaca2b8..ad79d93c 100644 --- a/hacks/sierpinski.c +++ b/hacks/sierpinski.c @@ -40,7 +40,8 @@ static const char sccsid[] = "@(#)sierpinski.c 5.00 2000/11/01 xlockmore"; "*ncolors: 64 \n" \ "*fpsSolid: true \n" \ "*ignoreRotation: True \n" \ - "*lowrez: True \n" \ + +/* "*lowrez: True \n" \ */ # define BRIGHT_COLORS # define release_sierpinski 0 diff --git a/hacks/slidescreen.c b/hacks/slidescreen.c index aaa4762c..c1854d7c 100644 --- a/hacks/slidescreen.c +++ b/hacks/slidescreen.c @@ -66,7 +66,8 @@ slidescreen_init (Display *dpy, Window window) st->grid_size = get_integer_resource (st->dpy, "gridSize", "Integer"); st->pix_inc = get_integer_resource (st->dpy, "pixelIncrement", "Integer"); - if (xgwa.width > 2560) st->grid_size *= 2; /* Retina displays */ + if (xgwa.width > 2560 || xgwa.height > 2560) + st->grid_size *= 2; /* Retina displays */ /* Don't let the grid be smaller than 5x5 */ @@ -177,10 +178,7 @@ slidescreen_init (Display *dpy, Window window) gcv.foreground = st->fg; gcv.function = GXcopy; - gcv.subwindow_mode = IncludeInferiors; gcflags = GCForeground |GCFunction; - if (use_subwindow_mode_p(xgwa.screen, st->window)) /* see grabscreen.c */ - gcflags |= GCSubwindowMode; st->gc = XCreateGC (st->dpy, st->window, gcflags, &gcv); return st; @@ -213,7 +211,8 @@ draw_grid (struct state *st) if (st->bitmap_h < st->grid_size*2) st->bitmap_h = st->grid_size*2; } - if (xgwa.width > 2560) border *= 2; /* Retina displays */ + if (xgwa.width > 2560 || xgwa.height > 2560) + border *= 2; /* Retina displays */ st->grid_w = st->bitmap_w / st->grid_size; st->grid_h = st->bitmap_h / st->grid_size; @@ -479,11 +478,6 @@ slidescreen_free (Display *dpy, Window window, void *closure) static const char *slidescreen_defaults [] = { "*dontClearRoot: True", "*fpsSolid: true", - -#ifdef __sgi /* really, HAVE_READ_DISPLAY_EXTENSION */ - "*visualID: Best", -#endif - ".background: Black", ".foreground: #BEBEBE", "*gridSize: 70", diff --git a/hacks/spotlight.c b/hacks/spotlight.c index c5935507..51f24277 100644 --- a/hacks/spotlight.c +++ b/hacks/spotlight.c @@ -34,6 +34,7 @@ struct state { Screen *screen; int sizex, sizey; /* screen size */ + int depth; int delay; int duration; time_t start_time; @@ -105,6 +106,7 @@ spotlight_init (Display *dpy, Window window) st->screen = xgwa.screen; st->sizex = xgwa.width; st->sizey = xgwa.height; + st->depth = xgwa.depth; cmap = xgwa.colormap; bg = get_pixel_resource (st->dpy, cmap, "background", "Background"); @@ -116,7 +118,8 @@ spotlight_init (Display *dpy, Window window) st->radius = get_integer_resource (st->dpy, "radius", "Integer"); if (st->radius < 0) st->radius = 125; - if (xgwa.width > 2560) st->radius *= 2; /* Retina displays */ + if (xgwa.width > 2560 || xgwa.height > 2560) + st->radius *= 2; /* Retina displays */ /* Don't let the spotlight be bigger than the window */ while (st->radius > xgwa.width * 0.45) @@ -129,17 +132,11 @@ spotlight_init (Display *dpy, Window window) /* do the dance */ gcv.function = GXcopy; - gcv.subwindow_mode = IncludeInferiors; gcflags = GCForeground | GCFunction; gcv.foreground = bg; - -#ifdef NOPE - if (use_subwindow_mode_p(xgwa.screen, st->window)) /* see grabscreen.c */ - gcflags |= GCSubwindowMode; -#endif st->window_gc = XCreateGC(st->dpy, st->window, gcflags, &gcv); - st->pm = XCreatePixmap(st->dpy, st->window, st->sizex, st->sizey, xgwa.depth); + st->pm = XCreatePixmap(st->dpy, st->window, st->sizex, st->sizey, st->depth); XClearWindow(st->dpy, st->window); st->first_time = 1; @@ -148,12 +145,15 @@ spotlight_init (Display *dpy, Window window) #ifdef HAVE_JWXYZ /* Don't second-guess Quartz's double-buffering */ st->buffer = 0; #else - st->buffer = XCreatePixmap(st->dpy, st->window, st->sizex, st->sizey, xgwa.depth); + st->buffer = XCreatePixmap(st->dpy, st->window, st->sizex, st->sizey, + st->depth); #endif - st->buffer_gc = XCreateGC(st->dpy, (st->buffer ? st->buffer : window), gcflags, &gcv); + st->buffer_gc = XCreateGC(st->dpy, (st->buffer ? st->buffer : window), + gcflags, &gcv); if (st->buffer) - XFillRectangle(st->dpy, st->buffer, st->buffer_gc, 0, 0, st->sizex, st->sizey); + XFillRectangle(st->dpy, st->buffer, st->buffer_gc, 0, 0, st->sizex, + st->sizey); /* create clip mask (so it's a circle, not a square) */ clip_pm = XCreatePixmap(st->dpy, st->window, st->radius*4, st->radius*4, 1); @@ -296,8 +296,11 @@ spotlight_draw (Display *dpy, Window window, void *closure) static void spotlight_reshape (Display *dpy, Window window, void *closure, - unsigned int w, unsigned int h) + unsigned int w, unsigned int h) { + struct state *st = (struct state *) closure; + XClearWindow(st->dpy, st->window); + /* Should resize the playfield, but let's at least not show whitespace */ } static Bool @@ -331,11 +334,6 @@ static const char *spotlight_defaults [] = { ".foreground: white", "*dontClearRoot: True", "*fpsSolid: true", - -#ifdef __sgi /* really, HAVE_READ_DISPLAY_EXTENSION */ - "*visualID: Best", -#endif - "*delay: 10000", "*duration: 120", "*radius: 125", diff --git a/hacks/squiral.c b/hacks/squiral.c index c1fa16f3..87eebfa8 100644 --- a/hacks/squiral.c +++ b/hacks/squiral.c @@ -52,10 +52,16 @@ struct state { struct worm *worms; int inclear; + int scale, oscale; }; #define CLEAR1(x,y) (!st->fill[((y)%st->height)*st->width+(x)%st->width]) -#define MOVE1(x,y) (st->fill[((y)%st->height)*st->width+(x)%st->width]=1, XDrawPoint(st->dpy, st->window, st->draw_gc, (x)%st->width,(y)%st->height), st->cov++) +#define MOVE1(x,y) (st->fill[((y)%st->height)*st->width+(x)%st->width]=1, \ + XFillRectangle (st->dpy, st->window, st->draw_gc, \ + ((x) % st->width) * st->scale, \ + ((y) % st->height) * st->scale, \ + st->scale, st->scale), \ + st->cov++) #define CLEARDXY(x,y,dx,dy) CLEAR1(x+dx, y+dy) && CLEAR1(x+dx+dx, y+dy+dy) #define MOVEDXY(x,y,dx,dy) MOVE1 (x+dx, y+dy), MOVE1 (x+dx+dx, y+dy+dy) @@ -66,8 +72,12 @@ struct state { w->h=w->h+st->dirh[d]*2, \ w->v=w->v+st->dirv[d]*2, dir=d) -#define RANDOM (void) (w->h = R(st->width), w->v = R(st->height), w->c = R(st->ncolors), \ - type=R(2), dir=R(4), (st->cycle && (w->cc=R(3)+st->ncolors))) +#define RANDOM (void) (w->h = R(st->width), \ + w->v = R(st->height), \ + w->c = R(st->ncolors), \ + type=R(2), \ + dir=R(4), \ + (st->cycle && (w->cc=R(3)+st->ncolors))) @@ -145,8 +155,14 @@ squiral_init (Display *dpy, Window window) XClearWindow(st->dpy, st->window); XGetWindowAttributes(st->dpy, st->window, &xgwa); - st->width = xgwa.width; - st->height = xgwa.height; + + st->oscale = get_integer_resource(st->dpy, "scale", "Integer"); + st->scale = st->oscale; + if (xgwa.width > 2560 || xgwa.height > 2560) + st->scale *= 3; /* Retina displays */ + + st->width = xgwa.width / st->scale; + st->height = xgwa.height / st->scale; cmap = xgwa.colormap; gcv.foreground = get_pixel_resource(st->dpy, cmap, "foreground", @@ -201,19 +217,35 @@ squiral_draw (Display *dpy, Window window, void *closure) int i; if(st->inclearheight) { - XDrawLine(st->dpy, st->window, st->erase_gc, 0, st->inclear, st->width-1, st->inclear); + XFillRectangle(st->dpy, st->window, st->erase_gc, + 0, + st->inclear * st->scale, + (st->width-1) * st->scale, + st->scale); memset(&st->fill[st->inclear*st->width], 0, sizeof(int)*st->width); - XDrawLine(st->dpy, st->window, st->erase_gc, 0, st->height-st->inclear-1, st->width-1, - st->height-st->inclear-1); - memset(&st->fill[(st->height-st->inclear-1)*st->width], 0, sizeof(int)*st->width); + XFillRectangle(st->dpy, st->window, st->erase_gc, + 0, + (st->height-st->inclear-1) * st->scale, + (st->width-1) * st->scale, + st->scale); + memset(&st->fill[(st->height-st->inclear-1)*st->width], 0, + sizeof(int)*st->width); st->inclear++; - XDrawLine(st->dpy, st->window, st->erase_gc, 0, st->inclear, st->width-1, st->inclear); + XFillRectangle(st->dpy, st->window, st->erase_gc, + 0, + st->inclear * st->scale, + (st->width-1) * st->scale, + st->scale); if (st->inclear < st->height) memset(&st->fill[st->inclear*st->width], 0, sizeof(int)*st->width); - XDrawLine(st->dpy, st->window, st->erase_gc, 0, st->height-st->inclear-1, st->width-1, - st->height-st->inclear-1); + XFillRectangle(st->dpy, st->window, st->erase_gc, + 0, + (st->height-st->inclear-1) * st->scale, + (st->width-1) * st->scale, + st->scale); if (st->height - st->inclear >= 1) - memset(&st->fill[(st->height-st->inclear-1)*st->width], 0, sizeof(int)*st->width); + memset(&st->fill[(st->height-st->inclear-1)*st->width], 0, + sizeof(int)*st->width); st->inclear++; if(st->inclear>st->height/2) st->inclear=st->height; } @@ -230,8 +262,12 @@ squiral_reshape (Display *dpy, Window window, void *closure, unsigned int w, unsigned int h) { struct state *st = (struct state *) closure; - st->width = w; - st->height = h; + + st->scale = st->oscale; + if (w > 2560 || h > 2560) st->scale *= 3; /* Retina displays */ + + st->width = w / st->scale; + st->height = h / st->scale; squiral_init_1 (st); XClearWindow (dpy, window); } @@ -264,7 +300,7 @@ squiral_free (Display *dpy, Window window, void *closure) static const char *squiral_defaults[] = { - ".lowrez: true", +/* ".lowrez: true", */ ".background: black", ".foreground: white", "*fpsSolid: true", @@ -275,6 +311,7 @@ static const char *squiral_defaults[] = { "*disorder: 0.005", "*cycle: False", "*handedness: 0.5", + "*scale: 1", #ifdef HAVE_MOBILE "*ignoreRotation: True", #endif @@ -290,6 +327,7 @@ static XrmOptionDescRec squiral_options[] = { {"-ncolors", ".ncolors", XrmoptionSepArg, 0}, {"-cycle", ".cycle", XrmoptionNoArg, "True"}, {"-no-cycle", ".cycle", XrmoptionNoArg, "False"}, + {"-scale", ".scale", XrmoptionSepArg, 0}, { 0, 0, 0, 0 } }; diff --git a/hacks/squiral.man b/hacks/squiral.man index 4d988b01..ebcd610a 100644 --- a/hacks/squiral.man +++ b/hacks/squiral.man @@ -6,9 +6,9 @@ squiral \- square spirals screensaver [\-\-display \fIhost:display.screen\fP] [\-\-foreground \fIcolor\fP] [\-\-background \fIcolor\fP] [\-\-window] [\-\-root] [\-\-window\-id \fInumber\fP][\-\-mono] [\-\-install] -[\-\-noinstall] [\-\-visual \fIvisual\fP] [\-\-fill \fIpercent\fP] [-count -\fInumber\fP] [-delay \fIusec\fP] [-disorder \fIfraction\fP] [-handedness -\fIfraction\fP] [-cycle] +[\-\-noinstall] [\-\-visual \fIvisual\fP] [\-\-fill \fIpercent\fP] +[\-\-count \fInumber\fP] [\-\-scale \fInumber\fP] [\-\-delay \fIusec\fP] +[\-\-disorder \fIfraction\fP] [\-\-handedness \fIfraction\fP] [\-\-cycle] [\-\-fps] .SH DESCRIPTION The \fIsquiral\fP program displays interacting, spiral-producing automata @@ -43,6 +43,9 @@ the screen is cleared. 60-80 percent are good values. .B \-\-count \fInumber\fP The number of squiralies. By default, the screen width divided by 32. .TP 8 +.B \-\-scale \fInumber\fP +Line thickness. +.TP 8 .B \-\-delay \fIusec\fP The wait between steps. The default is 1000. .TP 8 diff --git a/hacks/strange.c b/hacks/strange.c index c630f717..62411126 100644 --- a/hacks/strange.c +++ b/hacks/strange.c @@ -55,7 +55,8 @@ static const char sccsid[] = "@(#)strange.c 5.00 2000/11/01 xlockmore"; "*ignoreRotation: True \n" \ "*useSHM: True \n" \ "*useThreads: True \n" \ - "*lowrez: True \n" \ + +/* "*lowrez: True \n" \ */ # define SMOOTH_COLORS # define release_strange 0 @@ -1084,7 +1085,12 @@ init_strange(ModeInfo * mi) GC gc = MI_GC(mi); #endif ATTRACTOR *Attractor; - size_t pointStructSize = + size_t pointStructSize; + + if (MI_WIDTH(mi) > 2560 || MI_HEIGHT(mi) > 2560) + pointSize *= 3; /* Retina displays */ + + pointStructSize = pointSize == 1 ? sizeof (XPoint) : sizeof (XRectangle); if (curve <= 0) curve = 10; diff --git a/hacks/swirl.c b/hacks/swirl.c index ae72820c..871b09f5 100644 --- a/hacks/swirl.c +++ b/hacks/swirl.c @@ -37,7 +37,8 @@ static const char sccsid[] = "@(#)swirl.c 4.00 97/01/01 xlockmore"; "*useSHM: True \n" \ "*fpsSolid: true \n" \ "*ignoreRotation: True \n" \ - ".lowrez: True \n" \ + +/* ".lowrez: True \n" \ */ # define SMOOTH_COLORS # define WRITABLE_COLORS @@ -59,7 +60,7 @@ ENTRYPOINT ModeSpecOpt swirl_opts = { /****************************************************************/ #define MASS 4 /* maximum mass of a knot */ -#define MIN_RES 5 /* minimim resolution (>= MIN_RES) */ +#define MIN_RES 7 /* minimim resolution (>= MAX_RES, < 8) */ #define MAX_RES 1 /* maximum resolution (>0) */ #define TWO_PLANE_PCNT 30 /* probability for two plane mode (0-100) */ #define RESTART 2500 /* number of cycles before restart */ @@ -1280,7 +1281,7 @@ init_swirl(ModeInfo * mi) /* resolution starts off chunky */ swirl->resolution = MIN_RES + 1; - /* calculate the pixel step for this resulution */ + /* calculate the pixel step for this resolution */ swirl->r = (1 << (swirl->resolution - 1)); /* how many knots? */ diff --git a/hacks/tessellimage.c b/hacks/tessellimage.c index c518e839..f16c2d87 100644 --- a/hacks/tessellimage.c +++ b/hacks/tessellimage.c @@ -571,7 +571,6 @@ tessellate (struct state *st) { XGCValues gcv; gcv.function = GXcopy; - gcv.subwindow_mode = IncludeInferiors; st->wgc = XCreateGC(st->dpy, st->window, GCFunction, &gcv); st->pgc = XCreateGC(st->dpy, st->image, GCFunction, &gcv); } @@ -974,7 +973,7 @@ tessellimage_free (Display *dpy, Window window, void *closure) static const char *tessellimage_defaults [] = { ".background: black", ".foreground: white", - ".lowrez: True", +/* ".lowrez: True", */ "*dontClearRoot: True", "*fpsSolid: true", "*mode: random", diff --git a/hacks/thornbird.c b/hacks/thornbird.c index 07e0cbde..2e386767 100644 --- a/hacks/thornbird.c +++ b/hacks/thornbird.c @@ -37,7 +37,8 @@ static const char sccsid[] = "@(#)thornbird.c 5.00 2000/11/01 xlockmore"; "*ncolors: 64 \n" \ "*fpsSolid: true \n" \ "*ignoreRotation: True \n" \ - "*lowrez: True \n" \ + +/* "*lowrez: True \n" \ */ # define BRIGHT_COLORS # define release_thornbird 0 @@ -88,7 +89,8 @@ typedef struct { int pix; int count; int nbuffers; - XPoint **pointBuffer; /* pointer for XDrawPoints */ + int scale; + XRectangle **pointBuffer; } thornbirdstruct; static thornbirdstruct *thornbirds = (thornbirdstruct *) NULL; @@ -104,7 +106,7 @@ free_thornbird(ModeInfo * mi) if (hp->pointBuffer[buffer] != NULL) (void) free((void *) hp->pointBuffer[buffer]); (void) free((void *) hp->pointBuffer); - hp->pointBuffer = (XPoint **) NULL; + hp->pointBuffer = NULL; } } @@ -120,6 +122,10 @@ init_thornbird (ModeInfo * mi) hp->maxx = MI_WIDTH(mi); hp->maxy = MI_HEIGHT(mi); + hp->scale = 1; + if (MI_WIDTH(mi) > 2560 || MI_HEIGHT(mi) > 2560) + hp->scale *= 2; /* Retina displays */ + hp->b = 0.1; hp->i = hp->j = 0.1; @@ -129,15 +135,15 @@ init_thornbird (ModeInfo * mi) hp->nbuffers = MI_CYCLES(mi); if (hp->pointBuffer == NULL) - if ((hp->pointBuffer = (XPoint **) calloc(MI_CYCLES(mi), - sizeof (XPoint *))) == NULL) { + if ((hp->pointBuffer = (XRectangle **) calloc(MI_CYCLES(mi), + sizeof (*hp->pointBuffer))) == NULL) { free_thornbird(mi); return; } if (hp->pointBuffer[0] == NULL) - if ((hp->pointBuffer[0] = (XPoint *) malloc(MI_COUNT(mi) * - sizeof (XPoint))) == NULL) { + if ((hp->pointBuffer[0] = (XRectangle *) malloc(MI_COUNT(mi) * + sizeof (**hp->pointBuffer))) == NULL) { free_thornbird(mi); return; } @@ -167,7 +173,7 @@ draw_thornbird(ModeInfo * mi) double oldj, oldi; int batchcount = MI_COUNT(mi); int k; - XPoint *xp; + XRectangle *xp; GC gc = MI_GC(mi); int erase; int current; @@ -216,6 +222,7 @@ draw_thornbird(ModeInfo * mi) xp->y = (short) (hp->maxy / 2 * (1 - cost*hp->j + sint*cosp*hp->i - sint*sinp*hp->b)); + xp->width = xp->height = hp->scale; xp++; } @@ -223,15 +230,14 @@ draw_thornbird(ModeInfo * mi) if (MI_COUNT(mi) < 1) MI_COUNT(mi) = 1; if (hp->pointBuffer[erase] == NULL) { - if ((hp->pointBuffer[erase] = (XPoint *) malloc(MI_COUNT(mi) * - sizeof (XPoint))) == NULL) { + if ((hp->pointBuffer[erase] = (XRectangle *) malloc(MI_COUNT(mi) * + sizeof (**hp->pointBuffer))) == NULL) { free_thornbird(mi); return; } } else { XSetForeground(dsp, gc, MI_BLACK_PIXEL(mi)); - XDrawPoints(dsp, win, gc, hp->pointBuffer[erase], - batchcount, CoordModeOrigin); + XFillRectangles(dsp, win, gc, hp->pointBuffer[erase], batchcount); } if (MI_NPIXELS(mi) > 2) { XSetForeground(dsp, gc, MI_PIXEL(mi, hp->pix)); @@ -245,8 +251,7 @@ draw_thornbird(ModeInfo * mi) } else XSetForeground(dsp, gc, MI_WHITE_PIXEL(mi)); - XDrawPoints(dsp, win, gc, hp->pointBuffer[current], - batchcount, CoordModeOrigin); + XFillRectangles(dsp, win, gc, hp->pointBuffer[current], batchcount); hp->inc++; } diff --git a/hacks/twang.c b/hacks/twang.c index 33b9cd3a..9bd7ef15 100644 --- a/hacks/twang.c +++ b/hacks/twang.c @@ -707,6 +707,13 @@ static void initParams (struct state *st) problems = 1; } + { + XWindowAttributes xgwa; + XGetWindowAttributes (st->dpy, st->window, &xgwa); + if (xgwa.width > 2560 || xgwa.height > 2560) + st->tileSize *= 3; /* Retina displays */ + } + st->transference = get_float_resource (st->dpy, "transference", "Double"); if ((st->transference < 0.0) || (st->transference > 1.0)) { @@ -738,7 +745,7 @@ twang_init (Display *dpy, Window win) static const char *twang_defaults [] = { ".background: black", ".foreground: white", - ".lowrez: true", + ".lowrez: true", /* Too slow on macOS Retina screens otherwise */ "*borderColor: blue", "*borderWidth: 3", "*delay: 10000", diff --git a/hacks/vermiculate.c b/hacks/vermiculate.c index 0e17dc19..7debe04b 100644 --- a/hacks/vermiculate.c +++ b/hacks/vermiculate.c @@ -112,6 +112,7 @@ struct state { int reset_p; int cyc; + int pscale; }; @@ -174,7 +175,7 @@ static void sp (struct state *st, int x, int y, int c) { XSetForeground (st->dpy, st->mygc, st->mycolors[c].pixel); - XDrawPoint (st->dpy, st->window, st->mygc, x, y); + XFillRectangle (st->dpy, st->window, st->mygc, x, y, st->pscale, st->pscale); st->point[(st->wid * y) + x] = c; } @@ -789,6 +790,11 @@ vermiculate_init (Display *d, Window w) st->mygc = XCreateGC (st->dpy, st->window, 0, &mygcv); } + st->pscale = 1; + if (st->xgwa.width > 2560 || st->xgwa.height > 2560) + st->pscale = 3; /* Retina displays */ + /* We aren't increasing the spacing between the pixels, just the size. */ + st->point = (unsigned char *) calloc (1, st->wid * st->hei); maininit (st); palupdate (st, True); @@ -1200,7 +1206,7 @@ vermiculate_free (Display *dpy, Window window, void *closure) static const char *vermiculate_defaults[] = { - ".lowrez: true", +/* ".lowrez: true", */ ".background: Black", "*ticks: 20000", "*fpsSolid: true", diff --git a/hacks/vidwhacker b/hacks/vidwhacker index 402e2c7b..ad26beaf 100755 --- a/hacks/vidwhacker +++ b/hacks/vidwhacker @@ -1,5 +1,5 @@ #!/usr/bin/perl -w -# vidwhacker, for xscreensaver. Copyright (c) 1998-2020 Jamie Zawinski. +# vidwhacker, for xscreensaver. Copyright © 1998-2022 Jamie Zawinski. # # Permission to use, copy, modify, distribute, and sell this software and its # documentation for any purpose is hereby granted without fee, provided that @@ -9,20 +9,23 @@ # software for any purpose. It is provided "as is" without express or # implied warranty. # -# This program grabs a frame of video, then uses various pbm filters to -# munge the image in random nefarious ways, then uses xloadimage, xli, or xv -# to put it on the root window. This works out really nicely if you just -# feed some random TV station into it... +# Distorts an image using a random series of filters: edge detection, +# subtracting the image from a rotated version of itself, etc. # -# Created: 14-Apr-01. +# Someone really ought to translate these filters to use ImageMagick +# instead of PPM. (Sorry Jef.) +# +# Created: 14-Apr-2001. require 5; use diagnostics; use strict; my $progname = $0; $progname =~ s@.*/@@g; -my ($version) = ('$Revision: 1.34 $' =~ m/\s(\d[.\d]+)\s/s); +my ($version) = ('$Revision: 1.40 $' =~ m/\s(\d[.\d]+)\s/s); +# Command line switches +# my $verbose = 0; my $use_stdin = 0; my $use_stdout = 0; @@ -33,7 +36,7 @@ my $imagedir; my $screen_width = -1; -my $displayer = "xscreensaver-getimage -root -file"; +my $displayer = "xscreensaver-getimage --root --file"; sub which($); @@ -62,7 +65,7 @@ my @filters = ( " pgmedge | pnminvert | pgmtoppm COLORS", "ppmspread 71 FILE1 > FILE2 ; " . - " pnmarith -add FILE1 FILE2 ; ", + " pnmarith -add FILE1 FILE2", "pnmflip -lr < FILE1 > FILE2 ; " . " pnmarith -multiply FILE1 FILE2 > FILE3 ; " . @@ -115,44 +118,54 @@ my @filters = ( ); -# Any files on this list will be deleted at exit. +# Anything placed on this list gets unconditionally deleted when this +# script exits, even if abnormally. # -my @all_tmpfiles = (); - -sub exit_cleanup() { - print STDERR "$progname: delete tmp files\n" if ($verbose); - unlink @all_tmpfiles; +my %rm_f; +END { rmf(); } + +sub rmf() { + foreach my $f (sort keys %rm_f) { + if (-e $f) { + print STDERR "$progname: rm $f\n" if ($verbose > 1); + unlink $f; + } + } + %rm_f = (); } -sub signal_cleanup() { - my ($sig) = @_; - print STDERR "$progname: caught SIG$sig\n" if ($verbose); - exit 1; +sub signal_cleanup($) { + my ($s) = @_; + print STDERR "$progname: SIG$s\n" if ($verbose > 1); + rmf(); + # Propagate the signal and die. This does not cause END to run. + $SIG{$s} = 'DEFAULT'; + kill ($s, $$); } -sub init_signals() { - - $SIG{HUP} = \&signal_cleanup; - $SIG{INT} = \&signal_cleanup; - $SIG{QUIT} = \&signal_cleanup; - $SIG{ABRT} = \&signal_cleanup; - $SIG{KILL} = \&signal_cleanup; - $SIG{TERM} = \&signal_cleanup; - - # Need this so that if giftopnm dies, we don't die. - $SIG{PIPE} = 'IGNORE'; +$SIG{TERM} = \&signal_cleanup; # kill +$SIG{INT} = \&signal_cleanup; # shell ^C +$SIG{QUIT} = \&signal_cleanup; # shell ^| +$SIG{KILL} = \&signal_cleanup; # nope +$SIG{ABRT} = \&signal_cleanup; +$SIG{HUP} = \&signal_cleanup; +$SIG{PIPE} = 'IGNORE'; # So that if giftopnm dies, we don't die. + +# Add the file to the rm_f list, since you can't export hash variables. +sub rm_atexit($) { + my ($file) = @_; + $rm_f{$file} = 1; } -END { exit_cleanup(); } - # returns the full path of the named program, or undef. # sub which($) { my ($prog) = @_; - foreach (split (/:/, $ENV{PATH})) { - if (-x "$_/$prog") { - return $prog; + foreach my $d (split (/:/, $ENV{PATH})) { + my $path = "$d/$prog"; + if (-x $path) { + return $path; } } return undef; @@ -172,7 +185,6 @@ sub randcolors() { } - sub filter_subst($$$@) { my ($filter, $width, $height, @tmpfiles) = @_; my $colors = randcolors(); @@ -191,15 +203,15 @@ sub filter_subst($$$@) { return $filter; } + # Frobnicate the image in some random way. # sub frob_ppm($) { my ($ppm_data) = @_; - $_ = $ppm_data; error ("0-length data") if (!defined($ppm_data) || $ppm_data eq ""); - error ("not a PPM file") unless (m/^P\d\n/s); - my ($width, $height) = m/^P\d\n(\d+) (\d+)\n/s; + error ("not a PPM file") unless ($ppm_data =~ m/^P\d\n/s); + my ($width, $height) = ($ppm_data =~ m/^P\d\n(\d+) (\d+)\n/s); error ("got a bogus PPM") unless ($width && $height); my $tmpdir = $ENV{TMPDIR}; @@ -209,9 +221,9 @@ sub frob_ppm($) { my $fn2 = sprintf ("%s/vidwhacker-2-%08x", $tmpdir, rand(0xFFFFFFFF)); my $fn3 = sprintf ("%s/vidwhacker-3-%08x", $tmpdir, rand(0xFFFFFFFF)); my @files = ( "$fn", "$fn1", "$fn2", "$fn3" ); - push @all_tmpfiles, @files; + foreach my $f (@files) { rm_atexit ($f); } - my $n = int(rand($#filters+1)); + my $n = int(rand(@filters)); my $filter = $filters[$n]; if ($verbose == 1) { @@ -225,23 +237,26 @@ sub frob_ppm($) { print STDERR "$progname: filter $n:\n\n$f\n\n" if $verbose; } + # 15-Sep-2022: xscreensaver-getimage can't necessarily load PPM, so + # make the final form always be JPEG. + $filter .= ' | pnmtojpeg'; + $filter = filter_subst ($filter, $width, $height, @files); unlink @files; - local *OUT; - open (OUT, ">$files[0]") || error ("writing $files[0]: $!"); - print OUT $ppm_data; - close OUT; + open (my $out, '>:raw', $files[0]) || error ("writing $files[0]: $!"); + print $out $ppm_data; + close $out; $filter = "( $filter )"; - $filter .= "2>/dev/null" unless ($verbose > 1); + $filter .= "2>&-" unless ($verbose > 1); - local *IN; - open (IN, "$filter |") || error ("opening pipe: $!"); + open (my $in, "$filter |") || error ("opening pipe: $!"); $ppm_data = ""; - while () { $ppm_data .= $_; } - close IN; + local $/ = undef; # read entire file + while (<$in>) { $ppm_data .= $_; } + close $in; unlink @files; return $ppm_data; @@ -253,30 +268,33 @@ sub read_config() { my $had_dir = defined($imagedir); - local *IN; - open (IN, "<$conf") || error ("reading $conf: $!"); - while () { + open (my $in, '<', $conf) || error ("reading $conf: $!"); + while (<$in>) { if (!$imagedir && m/^imageDirectory:\s+(.*)\s*$/i) { $imagedir = $1; } elsif (m/^grabVideoFrames:\s+true\s*$/i) { $video_p = 1; } elsif (m/^grabVideoFrames:\s+false\s*$/i) { $video_p = 0; } elsif (m/^chooseRandomImages:\s+true\s*$/i) { $file_p = 1; } elsif (m/^chooseRandomImages:\s+false\s*$/i) { $file_p = 0; } } - close IN; + close $in; $file_p = 1 if $had_dir; $imagedir = undef unless ($imagedir && $imagedir ne ''); if (!$file_p && !$video_p) { -# error ("neither grabVideoFrames nor chooseRandomImages are set\n\t") . -# "in $conf; $progname requires one or both." + # Sadly, vidwhacker has no way to get the desktop screenshot image + # from the "_SCREENSAVER_SCREENSHOT" property on $ + # There's no straightforward way to convert a pixmap ID to a PPM. $file_p = 1; } + $imagedir =~ s@^~/@$ENV{HOME}/@s; + if ($file_p) { error ("no imageDirectory set in $conf") unless $imagedir; - error ("imageDirectory $imagedir doesn't exist") unless (-d $imagedir); + error ("imageDirectory $imagedir doesn't exist") + unless ($imagedir =~ m@^https://@s || -d $imagedir); } if ($verbose > 1) { @@ -292,6 +310,7 @@ sub get_ppm() { if ($use_stdin) { print STDERR "$progname: reading from stdin\n" if ($verbose > 1); my $ppm = ""; + local $/ = undef; # read entire file while () { $ppm .= $_; } return $ppm; @@ -328,7 +347,8 @@ sub get_ppm() { print STDERR "$progname: selected file $fn\n" if ($verbose > 1); - if ($fn =~ m/\.gif/i) { $cmd = "giftopnm < \"$fn\""; } + if (which('convert')) { $cmd = "convert \"$fn\" -auto-orient ppm:-"; } + elsif ($fn =~ m/\.gif/i) { $cmd = "giftopnm < \"$fn\""; } elsif ($fn =~ m/\.jpe?g/i) { $cmd = "exiftran -o /dev/stdout -a \"$fn\" | djpeg"; } elsif ($fn =~ m/\.png/i) { $cmd = "pngtopnm < \"$fn\""; } elsif ($fn =~ m/\.xpm/i) { $cmd = "xpmtoppm < \"$fn\""; } @@ -356,7 +376,7 @@ sub dispose_ppm($) { my ($ppm) = @_; error ("0-length data") if (!defined($ppm) || $ppm eq ""); - error ("not a PPM file") unless ($ppm =~ m/^P\d\n/s); + #error ("not a PPM file") unless ($ppm =~ m/^P\d\n/s); if ($use_stdout) { print STDERR "$progname: writing to stdout\n" if ($verbose > 1); @@ -365,13 +385,12 @@ sub dispose_ppm($) { } else { my $tmpdir = $ENV{TMPDIR}; $tmpdir = "/tmp" unless $tmpdir; - my $fn = sprintf ("%s/vidwhacker-%08x.ppm", $tmpdir, rand(0xFFFFFFFF)); - local *OUT; + my $fn = sprintf ("%s/vidwhacker-%08x.jpg", $tmpdir, rand(0xFFFFFFFF)); unlink $fn; - push @all_tmpfiles, $fn; - open (OUT, ">$fn") || error ("writing $fn: $!"); - print OUT $ppm; - close OUT; + rm_atexit ($fn); + open (my $out, '>:raw', $fn) || error ("writing $fn: $!"); + print $out $ppm; + close $out; my @cmd = split (/ +/, $displayer); push @cmd, $fn; @@ -433,10 +452,10 @@ sub usage() { print STDERR "VidWhacker, Copyright (c) 2001 Jamie Zawinski \n"; print STDERR " https://www.jwz.org/xscreensaver/"; print STDERR "\n"; - print STDERR "usage: $0 [-display dpy] [-verbose]\n"; - print STDERR "\t\t[-root | -window | -window-id 0xXXXXX ]\n"; - print STDERR "\t\t[-stdin] [-stdout] [-delay secs]\n"; - print STDERR "\t\t[-directory image_directory]\n"; + print STDERR "usage: $0 [--display dpy] [--verbose]\n"; + print STDERR "\t[--root | --window | --window-id 0xXXXXX ]\n"; + print STDERR "\t[--stdin] [--stdout] [--delay secs]\n"; + print STDERR "\t[--directory image_directory]\n"; exit 1; } @@ -450,13 +469,15 @@ sub main() { elsif (m/^--?stdout$/) { $use_stdout = 1; } elsif (m/^--?delay$/) { $delay = shift @ARGV; } elsif (m/^--?dir(ectory)?$/) { $imagedir = shift @ARGV; } - elsif (m/^--?root$/) { } + elsif (m/^--?root$/) { + my $id = $ENV{XSCREENSAVER_WINDOW}; + $displayer =~ s/--?root\b/$id/s if ($id); + } elsif (m/^--?window-id$/) { my $id = shift @ARGV; error ("unparsable window id: $id") unless ($id =~ m/^\d+$|^0x[\da-f]+$/i); - $displayer =~ s/--?root\b/$id/ || - error ("unable to munge displayer: $displayer"); + $displayer =~ s/--?root\b/$id/s; } elsif (m/^--?window$/) { print STDERR "$progname: sorry, \"-window\" is unimplemented.\n"; @@ -467,20 +488,27 @@ sub main() { else { usage; } } - init_signals(); - - read_config; + read_config(); # sanity checking - is pbm installed? # (this is a non-exhaustive but representative list) - foreach ("ppmtopgm", "pgmenhance", "pnminvert", "pnmarith", "pnmdepth") { - which ($_) || error "$_ not found on \$PATH."; + my @needed = ("ppmtopgm", "pgmenhance", "pnmarith", "pnmdepth", "pnmtopng"); + push @needed, ("djpeg", "exiftran") unless (which ("convert")); + foreach my $p (@needed) { + which ($p) || + error ("$p not on \$PATH" . + ($p =~ m/p[bgpn]m/ ? "; install the 'netpbm' package" : "")); } if (!$use_stdout) { - $_ = `xdpyinfo 2>&-`; - ($screen_width) =~ m/ dimensions: +(\d+)x(\d+) pixels/; - $screen_width = 800 unless $screen_width > 0; + my $res = `xrandr 2>&-`; + # Let's hope all the screens are the same size. + $screen_width = $1 if ($res =~ m/ primary +(\d+) *x *(\d+)/); + if ($screen_width <= 0) { + $res = `xdpyinfo 2>&-`; + $screen_width = $1 if ($res =~ m/ dimensions: +(\d+)x(\d+) pixels/); + $screen_width = 800 if ($screen_width <= 0); + } } if ($use_stdout) { diff --git a/hacks/vidwhacker.man b/hacks/vidwhacker.man index aeef6499..5b3f4a91 100644 --- a/hacks/vidwhacker.man +++ b/hacks/vidwhacker.man @@ -9,20 +9,14 @@ vidwhacker \- grab images and apply random filters to them [-directory \fIdirectory\fP] [\-\-fps] .SH DESCRIPTION -The \fIvidwhacker\fP program grabs an image from disk, or from the -system's video input, then applies random image filters to it, and -displays the result. The \fIvidwhacker\fP program does not terminate -until killed. - -It depends heavily on the various PBM tools (e.g., -.BR ppmrelief (1).) +Distorts an image using a random series of filters: edge detection, +subtracting the image from a rotated version of itself, etc. Selection of random image files is done by running the .BR xscreensaver\-getimage\-file (MANSUFFIX) program. Capture of video frames (if requested) is done by running the .BR xscreensaver\-getimage\-video (MANSUFFIX) -program. The options of whether to do video, and which directory to -search for images, are specified in the \fI~/.xscreensaver\fP file. +program. .SH OPTIONS .I vidwhacker accepts the following options: @@ -70,20 +64,24 @@ stored in the RESOURCE_MANAGER property. .B XSCREENSAVER_WINDOW The window ID to use with \fI\-\-root\fP. .SH BUGS -It's slow. -.SH TO DO -It might be interesting to rewrite this to use -.BR gimp (1) -plugins instead of the pbm tools. It probably wouldn't be any faster, -but there would be a wider variety of effects available. +It is poorly named; originally it worked only on grabbed video frames, +before being expanded to work on any image. + +It requires the various PBM tools, e.g., +.BR ppmrelief (1). +Though still available, the "pbmplus" suite has largely fallen out of +favor these days, so it would be nice if someone were to port this script +to make use of ImageMagick's +.BR convert (1) +instead. That would also probably make it faster. .SH SEE ALSO .BR X (1), .BR xscreensaver (1), +.BR xscreensaver\-getimage (MANSUFFIX), .BR xscreensaver\-getimage\-file (MANSUFFIX), .BR xscreensaver\-getimage\-video (MANSUFFIX), -.BR xv (1), .BR ppmtogif (1), -.BR cjpeg (1) +.BR convert (1) .SH COPYRIGHT Copyright \(co 1998-2001 by Jamie Zawinski. Permission to use, copy, modify, distribute, and sell this software and its documentation for any purpose is diff --git a/hacks/vines.c b/hacks/vines.c index 7f519b4b..20e9d030 100644 --- a/hacks/vines.c +++ b/hacks/vines.c @@ -49,7 +49,8 @@ static const char sccsid[] = "@(#)vines.c 5.00 2000/11/01 xlockmore"; "*count: 0 \n" \ "*ncolors: 64 \n" \ "*fpsSolid: true \n" \ - "*lowrez: True \n" \ + +/* "*lowrez: True \n" \ */ # include "xlockmore.h" /* in xscreensaver distribution */ # define free_vines 0 @@ -87,6 +88,7 @@ typedef struct { int ang; int centerx; int centery; + int pscale; } vinestruct; static vinestruct *vines = (vinestruct *) NULL; @@ -111,6 +113,13 @@ init_vines(ModeInfo * mi) fp->length = 0; fp->iterations = 30 + NRAND(100); + fp->pscale = 1; /* Retina displays */ + if (MI_WIDTH(mi) > 1280 || MI_HEIGHT(mi) > 1280) fp->pscale *= 3; + if (MI_WIDTH(mi) > 2560 || MI_HEIGHT(mi) > 2560) fp->pscale *= 2; + +/* XSetLineAttributes (MI_DISPLAY(mi), MI_GC(mi), fp->pscale, + LineSolid, CapRound, JoinRound); */ + MI_CLEARWINDOW(mi); } /* init_vines */ @@ -137,6 +146,7 @@ draw_vines(ModeInfo * mi) fp->ang = 60 + NRAND(720); fp->length = 100 + NRAND(3000); + fp->length *= fp->pscale; fp->constant = fp->length * (10 + NRAND(10)); fp->i = 0; diff --git a/hacks/wander.c b/hacks/wander.c index 37f6e1bc..76ba6d90 100644 --- a/hacks/wander.c +++ b/hacks/wander.c @@ -94,6 +94,8 @@ wander_init (Display *dpy, Window window) st->circles = get_boolean_resource (st->dpy, "circles", "Boolean"); st->size = get_integer_resource (st->dpy, "size", "Integer"); if (st->size < 1) st->size = 1; + if (st->width > 2560 || st->height > 2560) + st->size *= 3; /* Retina displays */ st->width = st->width / st->size; st->height = st->height / st->size; st->length = get_integer_resource (st->dpy, "length", "Integer"); @@ -247,7 +249,7 @@ wander_free (Display *dpy, Window window, void *closure) static const char *wander_defaults [] = { - ".lowrez: true", +/* ".lowrez: true", */ ".background: black", ".foreground: white", ".fpsSolid: true", diff --git a/hacks/webcollage b/hacks/webcollage index bb4ac48e..921c45b9 100755 --- a/hacks/webcollage +++ b/hacks/webcollage @@ -28,19 +28,6 @@ # # Requires that either the provided "webcollage-helper" program or # ImageMagick's "convert" be available on $PATH. -# -# -# If you have the "driftnet" program installed, webcollage can display a -# collage of images sniffed off your local ethernet, instead of pulled out -# of search engines: in that way, your screensaver can display the images -# that your co-workers are downloading! -# -# Driftnet is available here: http://www.ex-parrot.com/~chris/driftnet/ -# Use it like so: -# -# webcollage --root --driftnet -# -# Driftnet is the Unix implementation of the MacOS "EtherPEG" program. require 5; @@ -60,12 +47,52 @@ use LWP::UserAgent; my $progname = $0; $progname =~ s@.*/@@g; -my ($version) = ('$Revision: 1.185 $' =~ m/\s(\d[.\d]+)\s/s); -my $copyright = "WebCollage $version, Copyright (c) 1999-2017" . +my ($version) = ('$Revision: 1.189 $' =~ m/\s(\d[.\d]+)\s/s); +my $copyright = "WebCollage $version, Copyright (c) 1999-2022" . " Jamie Zawinski \n" . " https://www.jwz.org/webcollage/\n"; +# Anything placed on this list gets unconditionally deleted when this +# script exits, even if abnormally. +# +my %rm_f; +END { rmf(); } + +sub rmf() { + foreach my $f (sort keys %rm_f) { + if (-e $f) { + # print STDERR "$progname: rm $f\n" if ($verbose_exec > 1); + unlink $f; + } + } + %rm_f = (); +} + +sub signal_cleanup($) { + my ($s) = @_; + # print STDERR "$progname: SIG$s\n" if ($verbose_exec > 1); + rmf(); + # Propagate the signal and die. This does not cause END to run. + $SIG{$s} = 'DEFAULT'; + kill ($s, $$); +} + +$SIG{TERM} = \&signal_cleanup; # kill +$SIG{INT} = \&signal_cleanup; # shell ^C +$SIG{QUIT} = \&signal_cleanup; # shell ^| +$SIG{KILL} = \&signal_cleanup; # nope +$SIG{ABRT} = \&signal_cleanup; +$SIG{HUP} = \&signal_cleanup; +$SIG{PIPE} = 'IGNORE'; # So that if subprocs die, we don't. + + +# Add the file to the rm_f list, since you can't export hash variables. +sub rm_atexit($) { + my ($file) = @_; + $rm_f{$file} = 1; +} + my @search_methods = ( # Google is rate-limiting us now, so this works ok from @@ -150,19 +177,6 @@ my @search_methods = ( # 0, "hotbot", \&pick_from_hotbot_text, ); -# programs we can use to write to the root window (tried in ascending order.) -# -my @root_displayers = ( - "xscreensaver-getimage -root -file", - "chbg -once -xscreensaver -max_size 100", - "xv -root -quit -viewonly +noresetroot -quick24 -rmode 5" . - " -rfg black -rbg black", - "xli -quiet -onroot -center -border black", - "xloadimage -quiet -onroot -center -border black", - -# this lame program wasn't built with vroot.h: -# "xsri -scale -keep-aspect -center-horizontal -center-vertical", -); # Some sites need cookies to work properly. These are they. @@ -258,7 +272,6 @@ my %warningless_sites = ( "images.quizilla.com" => 1, "images.quizdiva.net" => 1, - "driftnet" => 1, # builtin... "local-directory" => 1, # builtin... ); @@ -358,12 +371,6 @@ my $urls_only_p = 0; my $cocoa_p = 0; my $imagemap_base = undef; -my @pids_to_kill = (); # forked pids we should kill when we exit, if any. - -my $driftnet_magic = 'driftnet'; -my $driftnet_dir = undef; -my $default_driftnet_cmd = "driftnet -a -m 100"; - my $local_magic = 'local-directory'; my $local_dir = undef; @@ -452,8 +459,8 @@ sub get_document_1($$$) { $head =~ s/\r\n/\n/gs; $head =~ s/\r/\n/gs; if ($verbose_http) { - foreach (split (/\n/, $head)) { - LOG ($verbose_http, " <== $_"); + foreach my $s (split (/\n/, $head)) { + LOG ($verbose_http, " <== $s"); } } @@ -478,10 +485,6 @@ sub get_document($$;$) { my ($url, $referer, $timeout) = @_; my $start = time; - if (defined($referer) && $referer eq $driftnet_magic) { - return get_driftnet_file ($url); - } - if (defined($referer) && $referer eq $local_magic) { return get_local_file ($url); } @@ -1816,9 +1819,9 @@ sub pick_from_livejournal_images($) { $body =~ s/\n/ /gs; $body =~ s/(; - close ($in) || error ("$id: $file: $!"); - unlink ($file) || error ("$id: $file: rm: $!"); - return ($id, $body); -} - - -sub spawn_driftnet($) { - my ($cmd) = @_; - - # make a directory to use. - while (1) { - my $tmp = $ENV{TEMPDIR} || "/tmp"; - $driftnet_dir = sprintf ("$tmp/driftcollage-%08x", rand(0xffffffff)); - LOG ($verbose_exec, "mkdir $driftnet_dir"); - last if mkdir ($driftnet_dir, 0700); - } - - if (! ($cmd =~ m/\s/)) { - # if the command didn't have any arguments in it, then it must be just - # a pointer to the executable. Append the default args to it. - my $dargs = $default_driftnet_cmd; - $dargs =~ s/^[^\s]+//; - $cmd .= $dargs; - } - - # point the driftnet command at our newly-minted private directory. - # - $cmd .= " -d $driftnet_dir"; - $cmd .= ">/dev/null" unless ($verbose_exec); - - my $pid = fork(); - if ($pid < 0) { error ("fork: $!\n"); } - if ($pid) { - # parent fork - push @pids_to_kill, $pid; - LOG ($verbose_exec, "forked for \"$cmd\""); - } else { - # child fork - nontrapping_system ($cmd) || error ("exec: $!"); - } - - # wait a bit, then make sure the process actually started up. - # - sleep (1); - error ("pid $pid failed to start \"$cmd\"") - unless (1 == kill (0, $pid)); -} - # local-directory sub pick_from_local_dir($) { my ($timeout) = @_; @@ -2657,8 +2563,8 @@ sub clearlog() { sub showlog() { my $head = "$progname: DEBUG: "; - foreach (split (/\n/, $lastlog)) { - print STDERR "$head$_\n"; + foreach my $s (split (/\n/, $lastlog)) { + print STDERR "$head$s\n"; } $lastlog = ""; } @@ -2819,14 +2725,14 @@ sub save_recent_url($$) { my ($site) = m@^https?://([^ \t\n\r/:]+)@; return unless defined ($site); - if ($base eq $driftnet_magic || $base eq $local_magic) { + if ($base eq $local_magic) { $site = $base; @recent_images = (); } my $done = 0; - foreach (@recent_images) { - if ($_ eq $url) { + foreach my $s (@recent_images) { + if ($s eq $url) { print STDERR blurb() . "WARNING: recently-duplicated image: $url" . " (on $base via $last_search)\n"; $done = 1; @@ -2847,8 +2753,8 @@ sub save_recent_url($$) { } if (!$done) { - foreach (@recent_sites) { - if ($_ eq $site) { + foreach my $s (@recent_sites) { + if ($s eq $site) { print STDERR blurb() . "WARNING: recently-duplicated site: $site" . " ($url on $base via $last_search)\n"; last; @@ -2985,8 +2891,8 @@ sub image_size($) { # sub which($) { my ($prog) = @_; - foreach (split (/:/, $ENV{PATH})) { - my $path = "$_/$prog"; + foreach my $d (split (/:/, $ENV{PATH})) { + my $path = "$d/$prog"; if (-x $path) { return $path; } @@ -3004,27 +2910,6 @@ sub bellrand(;$) { } -sub exit_cleanup() { - x_cleanup(); - print STDERR "$progname: exiting\n" if ($verbose_warnings); - if (@pids_to_kill) { - print STDERR blurb() . "killing: " . join(' ', @pids_to_kill) . "\n"; - kill ('TERM', @pids_to_kill); - } -} - -sub signal_cleanup($) { - my ($sig) = @_; - print STDERR blurb() . (defined($sig) - ? "caught signal $sig." - : "exiting.") - . "\n" - if ($verbose_exec || $verbose_warnings); - exit 1; -} - - - ############################################################################## # # Generating a list of urls only @@ -3057,6 +2942,10 @@ my ($image_png, $image_tmp1, $image_tmp2); $image_tmp1 = $image_png . '-1.png'; $image_tmp2 = $image_png . '-2.png'; $image_png .= '.png'; + + rm_atexit ($image_png); + rm_atexit ($image_tmp1); + rm_atexit ($image_tmp2); } @@ -3074,13 +2963,6 @@ my $img_height; my $delay = 2; -sub x_cleanup() { - unlink $image_png, $image_tmp1, $image_tmp2; - unlink $imagemap_html_tmp, $imagemap_jpg_tmp - if (defined ($imagemap_html_tmp)); -} - - # Like system, but prints status about exit codes, and kills this process # with whatever signal killed the sub-process, if any. # @@ -3136,24 +3018,12 @@ sub pngmake($$$$) { sub pick_root_displayer() { my @names = (); - if ($cocoa_p) { - # see "xscreensaver/hacks/webcollage-cocoa.m" - return "echo COCOA LOAD "; - } + # See xscreensaver/hacks/webcollage-cocoa.m + return "echo COCOA LOAD " if ($cocoa_p); - foreach my $cmd (@root_displayers) { - $_ = $cmd; - my ($name) = m/^([^ ]+)/; - push @names, "\"$name\""; - LOG ($verbose_exec, "looking for $name..."); - foreach my $dir (split (/:/, $ENV{PATH})) { - LOG ($verbose_exec, " checking $dir/$name"); - return $cmd if (-x "$dir/$name"); - } - } - - $names[$#names] = "or " . $names[$#names]; - error "none of: " . join (", ", @names) . " were found on \$PATH."; + my $cmd = "xscreensaver-getimage"; + error ("$cmd not on \$PATH") unless (which($cmd)); + return "$cmd -root -file", } @@ -3189,8 +3059,9 @@ sub x_or_image_output($) { } if (!$cocoa_p && defined ($webcollage_helper)) { - foreach ($image_png, $image_tmp1, $image_tmp2) { - s/\.png$/.jpg/si; + foreach my $p ($image_png, $image_tmp1, $image_tmp2) { + $p =~ s/\.png$/.jpg/si; + rm_atexit ($p); } } @@ -3200,8 +3071,8 @@ sub x_or_image_output($) { push @progs, $convert_cmd unless defined($webcollage_helper); - foreach (@progs) { - which ($_) || error "$_ not found on \$PATH."; + foreach my $p (@progs) { + which ($p) || error ("$p not found on \$PATH."); } # find a root-window displayer program. @@ -3228,22 +3099,34 @@ sub x_or_image_output($) { } if (!defined ($window_id)) { - $_ = "xdpyinfo"; - which ($_) || error "$_ not found on \$PATH."; - $_ = `$_`; - ($img_width, $img_height) = m/dimensions: *(\d+)x(\d+) /; - if (!defined($img_height)) { - error "xdpyinfo failed."; + + $_ = "xrandr"; + if (which ($_)) { + $_ = `$_`; + # Let's hope all the screens are the same size. + ($img_width, $img_height) = m/primary +(\d+) *x *(\d+)/; } + + if (! $img_width) { + $_ = "xdpyinfo"; + which ($_) || error ("$_ not found on \$PATH."); + $_ = `$_`; + ($img_width, $img_height) = m/dimensions: *(\d+)x(\d+) /; + + if (!defined($img_height)) { + error ("xdpyinfo failed."); + } + } + } else { # we have a window id $_ = "xwininfo"; - which ($_) || error "$_ not found on \$PATH."; + which ($_) || error ("$_ not found on \$PATH."); $_ .= " -id $window_id"; $_ = `$_`; ($img_width, $img_height) = m/^\s*Width:\s*(\d+)\n\s*Height:\s*(\d+)\n/m; if (!defined($img_height)) { - error "xwininfo failed."; + error ("xwininfo failed."); } } } @@ -3259,7 +3142,7 @@ sub x_or_image_output($) { $bgimage = $background; } elsif (! $background =~ m@^[-a-z0-9 ]+$@i) { - error "not a color or readable file: $background"; + error ("not a color or readable file: $background"); } else { # default to assuming it's a color @@ -3350,7 +3233,7 @@ sub paste_image($$$$;$) { # #### Historically, $filter_cmd read and write PPM files. # This is doing PNG or JPEG now. I'll bet nobody uses this. - my $rc = nontrapping_system "($filter_cmd) < $image_tmp1 >$image_tmp2"; + my $rc = nontrapping_system ("($filter_cmd) < $image_tmp1 >$image_tmp2"); if ($rc != 0) { LOG(($verbose_decode || $verbose_load), "failed command: \"$filter_cmd\""); @@ -3645,12 +3528,13 @@ sub update_imagemap($$$$$$$$) { my $imagemap_html = $imagemap_base . ".html"; my $imagemap_jpg = $imagemap_base . ".jpg"; - my $imagemap_jpg2 = $imagemap_jpg; - $imagemap_jpg2 =~ s@^.*/@@gs; if (!defined ($imagemap_html_tmp)) { - $imagemap_html_tmp = $imagemap_html . sprintf (".%08x", rand(0xffffffff)); - $imagemap_jpg_tmp = $imagemap_jpg . sprintf (".%08x", rand(0xffffffff)); + my $seed = sprintf (".%08x", rand(0xFFFFFFFF)); + $imagemap_html_tmp = "$imagemap_base.map.$seed..html"; + $imagemap_jpg_tmp = "$imagemap_base.map.$seed.jpg"; + rm_atexit ($imagemap_html_tmp); + rm_atexit ($imagemap_jpg_tmp); } # Read the imagemap html file (if any) to get a template. @@ -3743,6 +3627,8 @@ sub update_imagemap($$$$$$$$) { # { my $body = $template_html; + my $imagemap_jpg2 = $imagemap_jpg; + $imagemap_jpg2 =~ s@^.*/@@gs; my $img = ("
" . "" . "
\n"); @@ -3752,7 +3638,7 @@ sub update_imagemap($$$$$$$$) { $y /= $img_height / 100; $w /= $img_width / 100; $h /= $img_height / 100; - foreach ($x, $y, $w, $h) { $_ = sprintf("%.1f%%", $_); } + foreach my $v ($x, $y, $w, $h) { $v = sprintf("%.1f%%", $v); } $u = html_quote($u); $img .= (" \n"); @@ -3785,12 +3671,12 @@ sub update_imagemap($$$$$$$$) { # Rename the two tmp files to the real files # rename ($imagemap_html_tmp, $imagemap_html) || - error "renaming $imagemap_html_tmp to $imagemap_html"; + error ("renaming $imagemap_html_tmp to $imagemap_html"); LOG ($verbose_decode, "wrote $imagemap_html"); if ($imagemap_jpg_tmp ne $image_png) { rename ($imagemap_jpg_tmp, $imagemap_jpg) || - error "renaming $imagemap_jpg_tmp to $imagemap_jpg"; + error ("renaming $imagemap_jpg_tmp to $imagemap_jpg"); LOG ($verbose_decode, "wrote $imagemap_jpg"); } } @@ -3839,20 +3725,6 @@ sub set_proxy() { } -sub init_signals() { - - $SIG{HUP} = \&signal_cleanup; - $SIG{INT} = \&signal_cleanup; - $SIG{QUIT} = \&signal_cleanup; - $SIG{ABRT} = \&signal_cleanup; - $SIG{KILL} = \&signal_cleanup; - $SIG{TERM} = \&signal_cleanup; - - # Need this so that if subprocess filters die, we don't die. - $SIG{PIPE} = 'IGNORE'; -} - -END { exit_cleanup(); } sub main() { @@ -3861,7 +3733,6 @@ sub main() { my $verbose = 0; my $dict; - my $driftnet_cmd = 0; $current_state = "init"; $load_method = "none"; @@ -3908,7 +3779,7 @@ sub main() { $img_width = $1; $img_height = $2; } else { - error "argument to \"--size\" must be of the form \"640x400\""; + error ("argument to \"--size\" must be of the form \"640x400\""); } } elsif (m/^--?(http-)?proxy$/s) { $http_proxy = shift @ARGV; @@ -3918,13 +3789,6 @@ sub main() { $opacity = shift @ARGV; error ("opacity must be between 0.0 and 1.0") if ($opacity <= 0 || $opacity > 1); - } elsif (m/^--?driftnet$/s) { - @search_methods = ( 100, "driftnet", \&pick_from_driftnet ); - if (! ($ARGV[0] =~ m/^-/)) { - $driftnet_cmd = shift @ARGV; - } else { - $driftnet_cmd = $default_driftnet_cmd; - } } elsif (m/^--?dir(ectory)?$/s) { @search_methods = ( 100, "local", \&pick_from_local_dir ); if (! ($ARGV[0] =~ m/^-/)) { @@ -3950,7 +3814,7 @@ sub main() { last; } } - error "no such search method as \"$which\"" unless ($ok); + error ("no such search method as \"$which\"") unless ($ok); LOG (1, "DEBUG: using only \"$which\""); $report_performance_interval = 30; @@ -3963,7 +3827,6 @@ sub main() { "\t\t [--background color] [--opacity f]\n" . "\t\t [--filter cmd] [--filter2 cmd]\n" . "\t\t [--dictionary dictionary-file] [--http-proxy host[:port]]\n" . - "\t\t [--driftnet [driftnet-program-and-args]]\n" . "\t\t [--directory local-image-directory]\n" . "\n"; exit 1; @@ -3972,11 +3835,11 @@ sub main() { if (!$root_p && !$no_output_p && !$cocoa_p) { print STDERR $copyright; - error "the --root argument is mandatory (for now.)"; + error ("the --root argument is mandatory"); } if (!$no_output_p && !$cocoa_p && !$ENV{DISPLAY}) { - error "\$DISPLAY is not set."; + error ("\$DISPLAY is not set."); } @@ -4043,14 +3906,11 @@ sub main() { if (defined ($local_dir)) { $_ = "xscreensaver-getimage-file"; - which ($_) || error "$_ not found on \$PATH."; + which ($_) || error ("$_ not found on \$PATH."); } - init_signals(); set_proxy(); - spawn_driftnet ($driftnet_cmd) if ($driftnet_cmd); - if ($urls_only_p) { url_only_output (); } else { diff --git a/hacks/webcollage-helper-cocoa.m b/hacks/webcollage-helper-cocoa.m index fde1f0d9..984c2fe4 100644 --- a/hacks/webcollage-helper-cocoa.m +++ b/hacks/webcollage-helper-cocoa.m @@ -215,7 +215,7 @@ bevel_image (NSImage *img, int bevel_pct, y = [img size].height - (y + h); [bevel_img drawAtPoint: NSMakePoint (x, y) fromRect: NSMakeRect (0, 0, w, h) - operation: NSCompositeDestinationIn /* Destination image + operation: NSCompositingOperationDestinationIn /* Destination image wherever both images are opaque, transparent elsewhere. */ @@ -270,7 +270,7 @@ paste (const char *paste_file, [base_img lockFocus]; [paste_img drawInRect: NSMakeRect (to_x, to_y, scaled_w, scaled_h) fromRect: NSMakeRect (from_x, from_y, w, h) - operation: NSCompositeSourceOver + operation: NSCompositingOperationSourceOver fraction: opacity]; [base_img unlockFocus]; @@ -369,7 +369,7 @@ write_image (NSImage *img, const char *file) [NSGraphicsContext graphicsContextWithBitmapImageRep:bit_rep]]; [img drawInRect:NSMakeRect(0, 0, [img size].width, [img size].height) - fromRect:NSZeroRect operation:NSCompositeCopy fraction:1.0]; + fromRect:NSZeroRect operation:NSCompositingOperationCopy fraction:1.0]; [NSGraphicsContext restoreGraphicsState]; #endif diff --git a/hacks/webcollage.man b/hacks/webcollage.man index 85255b51..acbc9712 100644 --- a/hacks/webcollage.man +++ b/hacks/webcollage.man @@ -1,6 +1,6 @@ .TH XScreenSaver 1 "17-Jun-99" "X Version 11" .SH NAME -webcollage \- decorate the screen with random images from the web +webcollage \- a collage of random images from the World Wide Web .SH SYNOPSIS .B webcollage [\-\-display \fIhost:display.screen\fP] @@ -20,52 +20,24 @@ webcollage \- decorate the screen with random images from the web [\-\-filter2 \fIcommand\fP] [\-\-http\-proxy host[:port]] [\-\-dictionary \fIdictionary-file\fP] -[\-\-driftnet [\fIcmd\fP]] [\-\-directory \fIdir\fP] [\-\-fps] .SH DESCRIPTION -The \fIwebcollage\fP program pulls random image off of the World Wide Web -and scatters them on the root window. One satisfied customer described it -as "a nonstop pop culture brainbath." This program finds its images by -doing random web searches, and extracting images from the returned pages. +This screen saver creates collages out of random images from the World Wide +Web. It finds the images by feeding random words into various search engines, +then pulling images (or sections of images) out of the pages returned. +One satisfied customer described it as "a nonstop pop culture brainbath". -\fIwebcollage\fP is written in -.BR perl (1) -and requires Perl 5. - -It will be an order of magnitude faster if you also have -the \fIwebcollage-helper\fP program installed (a GDK/JPEG image -compositor), but \fIwebcollage\fP works without it as well. - -\fIwebcollage\fP can be used in conjunction with the -.BR driftnet (1) -program (the Unix equivalent of EtherPEG) to snoop images from traffic -on your local subnet, instead of getting images from search engines. +You can also see it in action at +\fIhttps://www.jwz.org/webcollage/\fP .SH OPTIONS .I webcollage accepts the following options: .TP 8 -.B \-\-root -Draw on the root window. This option is mandatory, if output is being -.TP 8 -.B \-\-window\-id \fInumber\fP -Draw on the specified window. -produced: drawing to a window other than the root window is not yet -supported. - -Images are placed on the root window by using one of the -.BR xscreensaver\-getimage (MANSUFFIX), -.BR chbg (1), -.BR xv (1), -.BR xli (1), -or -.BR xloadimage (1) -programs (whichever is available.) -.TP 8 -.B \-\-window\-id \fIid\fP -Draw to the indicated window instead; this only works if the +.B \-\-root \fRor\fP \fB\-\-window\-id\fP \fInumber\fP +Draw on the specified window. Images are placed on the root window using the .BR xscreensaver\-getimage (MANSUFFIX) -program is installed. +program. .TP 8 .B \-\-verbose \fRor\fP \-\-v Print diagnostics to stderr. Multiple \fI-v\fP switches increase the @@ -83,14 +55,14 @@ Default 30 seconds. How long to sleep between images. Default 2 seconds. (Remember that this program probably spends a lot of time waiting for the network.) .TP 8 -.B \-\-background \fIcolor-or-ppm\fP +.B \-\-background \fIcolor-or-file\fP What to use for the background onto which images are pasted. This may be a color name, a hexadecimal RGB specification in the form '#rrggbb', or -the name of a PPM file. +the name of an image file. .TP 8 .B \-\-size \fIWxH\fP Normally, the output image will be made to be the size of the -screen (or target window.) This lets you specify the desired size. +screen (or target window). This lets you specify the desired size. .TP 8 .B \-\-opacity \fIratio\fP How transparently to paste the images together, with 0.0 meaning @@ -111,8 +83,8 @@ generated: instead, a list of image URLs will be printed on stdout. If this option is specified, then instead of writing an image to the root window, two files will be created: "\fIbase\fP.html" and "\fIbase\fP.jpg". The JPEG will be the collage; the HTML file will include that image, and -an image-map making the sub-images be linked to the pages on which they -were found, as seen on the web version of WebCollage at +a series of clickable rectangles linking the sub-images to the pages on which +they were found, as seen on the web version of WebCollage at \fIhttps://www.jwz.org/webcollage/\fP .TP 8 .B \-\-filter \fIcommand\fP @@ -145,31 +117,6 @@ different methods, not all of which involve dictionary words, so using a "topical" dictionary file will not, in itself, be as effective as you might be hoping. .TP 8 -.B \-\-driftnet \fI[ args ]\fP -.BR driftnet (1) -is a program that snoops your local ethernet for unencrypted packets -that look like they might be image files. It can be used in conjunction -with \fIwebcollage\fP to generate a collage of what other people on -your network are looking at, instead of a search-engine collage. -If you have \fIdriftnet\fP installed on your $PATH, just use -the \fI\-\-driftnet\fP option. You can also specify the location -of the program like this: -.nf -.sp - -driftnet /path/to/driftnet -.sp -.fi -or, you can provide extra arguments like this: -.nf -.sp - -driftnet '/path/to/driftnet -extra -args' -.sp -.fi -Driftnet version 0.1.5 or later is required. Note that -the \fIdriftnet\fP program requires root access, so you'll have -to make \fIdriftnet\fP be setuid-root for this to work. -Please exercise caution. -.TP 8 .B \-\-directory \fIdir\fP Instead of searching the web for images, use the contents of the given directory. @@ -193,7 +140,7 @@ The window ID to use with \fI\-\-root\fP. to get the default HTTP proxy host and port. .SH FILES AND URLS .I /usr/dict/words, -.I /usr/share/lib/dict/words,\fP +.I /usr/share/lib/dict/words, or .I /usr/share/dict/words to find the random words to feed into to various search fields, including @@ -206,28 +153,15 @@ Animating GIFs are not supported: only the first frame will be used. .SH SEE ALSO .BR X (1), .BR xscreensaver (1), -.BR xli (1), -.BR xv (1), -.BR xloadimage (1), -.BR ppmmake (1), -.BR giftopnm (1), -.BR pnmpaste (1), -.BR pnmscale (1), -.BR djpeg (1), -.BR cjpeg (1), -.BR xdpyinfo (1), -.BR perl (1), +.BR convert (1), .BR vidwhacker (MANSUFFIX), .BR dadadodo (1), -.BR driftnet (1) +.BR driftnet (1), .BR EtherPEG , .BR EtherPeek , -.br -https://www.jwz.org/webcollage/, -.br -https://www.ex-parrot.com/~chris/driftnet/ +https://www.jwz.org/webcollage/ .SH COPYRIGHT -Copyright \(co 1998-2018 by Jamie Zawinski. Permission to use, copy, modify, +Copyright \(co 1998-2022 by 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 the above copyright notice appear in all copies and that both that copyright notice and this permission notice diff --git a/hacks/wormhole.c b/hacks/wormhole.c index 602be987..e761cd05 100644 --- a/hacks/wormhole.c +++ b/hacks/wormhole.c @@ -668,6 +668,9 @@ wormhole_init (Display *dpy, Window window) XGetWindowAttributes( st->dpy, st->window, &attr ); st->cmap = attr.colormap; + if (attr.width > 2560 || attr.height > 2560) /* Retina displays */ + XSetLineAttributes (dpy, st->gc, 3, LineSolid, CapRound, JoinRound); + return st; } @@ -708,7 +711,7 @@ wormhole_free (Display *dpy, Window window, void *closure) static const char *wormhole_defaults [] = { - ".lowrez: true", +/* ".lowrez: true", */ ".background: Black", ".foreground: #E9967A", "*delay: 10000", diff --git a/hacks/xflame.c b/hacks/xflame.c index e5824928..e9ef5eed 100644 --- a/hacks/xflame.c +++ b/hacks/xflame.c @@ -229,7 +229,7 @@ InitFlame(struct state *st) # undef THROTTLE #if 0 - if (st->width > 2560) /* Retina displays */ + if (st->width > 2560 || st->height > 2560) /* Retina displays */ { /* #### One of these knobs must mean "make the fire be twice as tall" but I can't figure out how. Changing any of the default values diff --git a/hacks/ximage-loader.c b/hacks/ximage-loader.c index 1e479805..9bd79703 100644 --- a/hacks/ximage-loader.c +++ b/hacks/ximage-loader.c @@ -22,7 +22,7 @@ #endif #ifdef HAVE_COCOA -# include "grabscreen.h" /* for osx_load_image_file() */ +# include "grabclient.h" /* for osx_load_image_file() */ #endif #ifdef HAVE_GDK_PIXBUF diff --git a/hacks/xjack.c b/hacks/xjack.c index b9cce19b..53890020 100644 --- a/hacks/xjack.c +++ b/hacks/xjack.c @@ -93,7 +93,9 @@ xjack_init (Display *dpy, Window window) XGetWindowAttributes (st->dpy, st->window, &st->xgwa); - if (st->xgwa.width > 480) + if (st->xgwa.width > 1200 || st->xgwa.height > 1200) /* Retina displays */ + fontname = get_string_resource (st->dpy, "font3", "Font"); + else if (st->xgwa.width > 480) fontname = get_string_resource (st->dpy, "font", "Font"); else fontname = get_string_resource (st->dpy, "font2", "Font"); @@ -350,10 +352,13 @@ xjack_draw (Display *dpy, Window window, void *closure) (FcChar8 *) &c, 1); if (xshift == 0 && yshift == 0 && (0 == (random() & 3000))) { + int off = st->font->ascent / 10; + if (off <= 0) off = 1; + if (random() & 1) off *= 1.5; if (random() & 1) - xshift--; + xshift -= off; else - yshift--; + yshift -= off; goto OVERSTRIKE; } @@ -488,6 +493,7 @@ static const char *xjack_defaults [] = { "*fpsTop: true", ".font: Special Elite 24, American Typewriter 24, Courier 24, monospace 24", ".font2: Special Elite 12, American Typewriter 12, Courier 12, monospace 12", + ".font3: Special Elite 48, American Typewriter 48, Courier 48, monospace 48", "*delay: 50000", 0 }; diff --git a/hacks/xlyap.c b/hacks/xlyap.c index f9204de9..1e862991 100644 --- a/hacks/xlyap.c +++ b/hacks/xlyap.c @@ -47,7 +47,7 @@ static const char *xlyap_defaults [] = { ".background: black", ".foreground: white", - ".lowrez: true", +/* ".lowrez: true", */ "*fpsSolid: true", "*randomize: true", "*builtin: -1", diff --git a/hacks/xmatrix.c b/hacks/xmatrix.c index a64cc22f..ead3c431 100644 --- a/hacks/xmatrix.c +++ b/hacks/xmatrix.c @@ -215,6 +215,40 @@ typedef struct { } m_state; +static Pixmap +double_pixmap (Display *dpy, Visual *visual, int depth, Pixmap pixmap, + int pix_w, int pix_h) +{ + int x, y; + Pixmap p2 = XCreatePixmap(dpy, pixmap, pix_w*2, pix_h*2, depth); + XImage *i1 = XGetImage (dpy, pixmap, 0, 0, pix_w, pix_h, ~0L, + (depth == 1 ? XYPixmap : ZPixmap)); + XImage *i2 = XCreateImage (dpy, visual, depth, + (depth == 1 ? XYPixmap : ZPixmap), 0, 0, + pix_w*2, pix_h*2, 8, 0); + XGCValues gcv; + GC gc = XCreateGC (dpy, p2, 0, &gcv); + i2->data = (char *) calloc(i2->height, i2->bytes_per_line); + for (y = 0; y < pix_h; y++) + for (x = 0; x < pix_w; x++) + { + unsigned long p = XGetPixel(i1, x, y); + XPutPixel(i2, x*2, y*2, p); + XPutPixel(i2, x*2+1, y*2, p); + XPutPixel(i2, x*2, y*2+1, p); + XPutPixel(i2, x*2+1, y*2+1, p); + } + free(i1->data); i1->data = 0; + XDestroyImage(i1); + XPutImage(dpy, p2, gc, i2, 0, 0, 0, 0, i2->width, i2->height); + XFreeGC (dpy, gc); + free(i2->data); i2->data = 0; + XDestroyImage(i2); + XFreePixmap(dpy, pixmap); + return p2; +} + + static void load_images_1 (Display *dpy, m_state *state, int which) { @@ -237,6 +271,16 @@ load_images_1 (Display *dpy, m_state *state, int which) state->images[which] = image_data_to_pixmap (state->dpy, state->window, png, size, &state->image_width, &state->image_height, 0); + + if (state->xgwa.width > 1920 || state->xgwa.height > 1920) + { /* Retina displays */ + state->images[which] = + double_pixmap (state->dpy, state->xgwa.visual, + state->xgwa.depth, state->images[which], + state->image_width, state->image_height); + state->image_width *= 2; + state->image_height *= 2; + } } @@ -1822,7 +1866,7 @@ xmatrix_free (Display *dpy, Window window, void *closure) static const char *xmatrix_defaults [] = { ".background: black", ".foreground: #00AA00", - ".lowrez: true", /* Small font is unreadable at 5120x2880 */ +/* ".lowrez: true", */ "*fpsSolid: true", "*matrixFont: large", "*delay: 10000", diff --git a/hacks/xml2man.pl b/hacks/xml2man.pl index 235b451c..c55e2722 100755 --- a/hacks/xml2man.pl +++ b/hacks/xml2man.pl @@ -24,7 +24,7 @@ use strict; use Text::Wrap; my $progname = $0; $progname =~ s@.*/@@g; -my ($version) = ('$Revision: 1.11 $' =~ m/\s(\d[.\d]+)\s/s); +my ($version) = ('$Revision: 1.12 $' =~ m/\s(\d[.\d]+)\s/s); my $verbose = 0; @@ -58,7 +58,7 @@ my $man_suffix = (".SH ENVIRONMENT\n" . "stored in the RESOURCE_MANAGER property.\n" . ".TP 8\n" . ".B XSCREENSAVER_WINDOW\n" . - "The window ID to use with \fI\-\-root\fP.\n" . + "The window ID to use with \\fI\-\-root\\fP.\n" . ".SH SEE ALSO\n" . ".BR X (1),\n" . ".BR xscreensaver (1)\n" . diff --git a/hacks/xrayswarm.c b/hacks/xrayswarm.c index b406631a..42c1bfdd 100644 --- a/hacks/xrayswarm.c +++ b/hacks/xrayswarm.c @@ -56,7 +56,7 @@ from the X Consortium. **********************************************************************/ static const char *xrayswarm_defaults [] ={ - ".lowrez: true", +/* ".lowrez: true", */ ".background: black", "*delay: 20000", "*fpsSolid: true", @@ -297,8 +297,13 @@ static int initGraphics(struct state *st) st->delay = get_integer_resource(st->dpy, "delay","Integer"); + xgcv.line_width = 1; + if (xgwa.width > 2560 || xgwa.height > 2560) + xgcv.line_width = 3; /* Retina displays */ + xgcv.foreground=get_pixel_resource (st->dpy, cmap, "background", "Background"); - st->fgc[0]=XCreateGC(st->dpy, st->win, GCForeground|GCFunction,&xgcv); + st->fgc[0]=XCreateGC(st->dpy, st->win, GCForeground|GCFunction|GCLineWidth, + &xgcv); #ifdef HAVE_JWXYZ jwxyz_XSetAntiAliasing (st->dpy, st->fgc[0], False); #endif @@ -306,7 +311,8 @@ static int initGraphics(struct state *st) n=0; if (mono_p) { xgcv.foreground=get_pixel_resource (st->dpy, cmap, "foreground", "Foreground"); - st->fgc[1]=XCreateGC(st->dpy,st->win,GCForeground|GCFunction,&xgcv); + st->fgc[1]=XCreateGC(st->dpy,st->win,GCForeground|GCFunction|GCLineWidth, + &xgcv); #ifdef HAVE_JWXYZ jwxyz_XSetAntiAliasing (st->dpy, st->fgc[1], False); #endif @@ -321,13 +327,16 @@ static int initGraphics(struct state *st) XAllocColor(st->dpy,cmap,&color); xgcv.foreground=color.pixel; if (st->fgc[i]) XFreeGC (st->dpy, st->fgc[i]); - st->fgc[i] = XCreateGC(st->dpy, st->win, GCForeground | GCFunction,&xgcv); + st->fgc[i] = XCreateGC(st->dpy, st->win, + GCForeground|GCFunction|GCLineWidth, &xgcv); #ifdef HAVE_JWXYZ jwxyz_XSetAntiAliasing (st->dpy, st->fgc[i], False); #endif } } - st->cgc = XCreateGC(st->dpy,st->win,GCForeground|GCFunction,&xgcv); + + st->cgc = XCreateGC(st->dpy,st->win,GCForeground|GCFunction|GCLineWidth, + &xgcv); XSetGraphicsExposures(st->dpy,st->cgc,False); #ifdef HAVE_JWXYZ jwxyz_XSetAntiAliasing (st->dpy, st->cgc, False); diff --git a/hacks/xscreensaver-getimage-file b/hacks/xscreensaver-getimage-file index 23549c05..2d9b8502 100755 --- a/hacks/xscreensaver-getimage-file +++ b/hacks/xscreensaver-getimage-file @@ -53,7 +53,7 @@ BEGIN { eval 'use LWP::Simple; use LWP::UserAgent;' } my $progname = $0; $progname =~ s@.*/@@g; -my ($version) = ('$Revision: 1.67 $' =~ m/\s(\d[.\d]+)\s/s); +my ($version) = ('$Revision: 1.68 $' =~ m/\s(\d[.\d]+)\s/s); my $verbose = 0; @@ -1549,6 +1549,10 @@ sub main() { # started writing "Unable to flush stdout: Bad file descriptor" to stderr # at exit. So if stdout is closed, open it as /dev/null instead. # + # And then 5.36 changed STDOUT to :utf8 by default. + # "syswrite() isn't allowed on :utf8 handles". + # + binmode (STDOUT, ':raw'); open (STDOUT, '>', '/dev/null') if (! defined (syswrite (STDOUT, ""))); # undef if fd closed; 0 if open. diff --git a/hacks/xscreensaver-getimage-video b/hacks/xscreensaver-getimage-video index df131530..a16f8c6b 100755 --- a/hacks/xscreensaver-getimage-video +++ b/hacks/xscreensaver-getimage-video @@ -1,5 +1,5 @@ #!/usr/bin/perl -w -# Copyright © 2001-2015 Jamie Zawinski . +# Copyright © 2001-2022 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 @@ -30,7 +30,7 @@ require 5; use strict; my $progname = $0; $progname =~ s@.*/@@g; -my $version = q{ $Revision: 1.26 $ }; $version =~ s/^[^0-9]+([0-9.]+).*$/$1/; +my $version = q{ $Revision: 1.28 $ }; $version =~ s/^[^0-9]+([0-9.]+).*$/$1/; my $tmpdir = $ENV{TMPDIR} || "/tmp"; my $tmpfile = sprintf("%s/xssv.%08x.ppm", $tmpdir, rand(0xFFFFFFFF)); @@ -48,9 +48,14 @@ my $verbose = 0; my @programs = ( "bttvgrab -d q -Q -l 1 -o ppm -f $tmpfile", # BTTV - "qcam > $tmpfile", # Connectix Qcam "gqcam -t PPM -d $tmpfile", # GTK+ Qcam clone + # "qcam > $tmpfile", # Connectix Qcam, circa 2001 + + # "qcam -s role=still > $tmpfile", # libcamera-tools, circa 2022 + # However, the above hangs for me on Raspbian 11.5, libcamera-tools 20221130 + # with a USB camera on /dev/video0. + "v4lctl snap ppm full $tmpfile", # XawTV 3.94. "streamer -a -o $tmpfile", # XawTV 3.76. # "streamer -a -s 768x576 -o $tmpfile", # XawTV 3.75. @@ -69,6 +74,10 @@ my @programs = ( "ffmpeg -y -v quiet -i /dev/video0 -vframes:v 1 $tmpfile 2>&-", + # On macOS, adding "-f avfoundation" to the above "ffmpeg" command might + # work, but on an M1 I get "ChromaCamKit is an incompatible architecture". + # The version of "imagesnap" in MacPorts fails the same way (Sep 2022). + # "mplayer -really-quiet tv://0 " . # Maybe works with some cams? # "-ao null -vo pnm -frames 1 2>&- " . # "&& mv 00000001.ppm $tmpfile", diff --git a/hacks/xscreensaver-getimage.c b/hacks/xscreensaver-getimage.c index 04b7b58b..298e4a58 100644 --- a/hacks/xscreensaver-getimage.c +++ b/hacks/xscreensaver-getimage.c @@ -9,19 +9,51 @@ * implied warranty. */ -/* xscreensaver-getimage -- helper program that puts a random image - onto the given window or pixmap. That image is either a screen-grab, - a file loaded from disk, or a frame grabbed from the system's video - input. - - This is used only on X11 systems. See the comment at the top of - utils/grabclient.c for an explanation of the flow of control on the - various platforms. +/* xscreensaver-getimage -- helper program that puts a random image onto + the given window or pixmap. That image is either a screen-grab, a + file loaded from disk, or a frame grabbed from the system's camera. + + On X11 systems, the hacks themselves use "utils/grabclient.c" to + invoke this program, "xscreensaver-getimage", as a sub-process. + Loading files is straightforward, and the camera thing is file-like. + File names are produced by "xscreensaver-getimage-file" and/or + "xscreensaver-getimage-video". + + On macOS, iOS or Android systems, each saver's "utils/grabclient.c" + instead links against "OSX/grabclient-osx.m", "OSX/grabclient-ios.m" + or "jwxyz/jwxyz-android.c" to load images and grab screenshots + directly without invoking a sub-process to do it. On those systems, + "xscreensaver-getimage" is not used. + + See the comment at the top of "utils/grabclient.c' for a more + detailed explanation of the incredibly comvoluted flows of control + used by the various platforms. + + -------------------------------------------------------------------- + + Grabbing screen images works in a few different ways: + + If the hack was invoked by XScreenSaver, then before it blanked the + screen, "xscreensaver-gfx" (or "xscreensaver-settings" in preview + mode) saved a screenshot as a pixmap on a property on the saver window. + This code loads that pixmap, and crops or scales it as needed. + + If the pre-saved pixmap isn't there, then we do it the hard way: + un-map our window to expose what's under it; wait an arbitrary amount + of time for other processes to re-paint; copy a screen image; put our + window back; and then return that image. + + Finally, on MacOS systems running X11 (which nobody does any more), + rootless XQuartz doesn't let you make screenshots by copying the X11 + root window, so this instead runs "/usr/sbin/screencapture" to get + the Mac desktop image as a file. */ #include "utils.h" -#include +#include /* for XrmDatabase */ +#include +#include #include #include #include @@ -31,16 +63,22 @@ # include /* for waitpid() and associated macros */ #endif +#include "version.h" +#include "../driver/blurb.h" #include "yarandom.h" -#include "grabscreen.h" +#include "grabclient.h" +#include "screenshot.h" #include "resources.h" +#include "colors.h" #include "colorbars.h" #include "visual.h" #include "xmu.h" -#include "version.h" #include "vroot.h" #include "../driver/prefs.h" +#include "../driver/blurb.c" /* Eh, this is awful but so what */ + + #ifndef _XSCREENSAVER_VROOT_H_ # error Error! You have an old version of vroot.h! Check -I args. #endif /* _XSCREENSAVER_VROOT_H_ */ @@ -74,28 +112,19 @@ #ifdef __APPLE__ - /* On MacOS under X11, the usual X11 mechanism of getting a screen shot + /* On macOS under X11, the usual X11 mechanism of getting a screen shot doesn't work, and we need to use an external program. This is only - used when running under X11 on MacOS. If it's a Cocoa build, this + used when running under X11 on macOS. If it's a Cocoa build, this path is not taken, and OSX/grabclient-osx.m is used instead. */ # define USE_EXTERNAL_SCREEN_GRABBER #endif -#ifdef __GNUC__ - __extension__ /* shut up about "string length is greater than the length - ISO C89 compilers are required to support" when including - the .ad file... */ -#endif - -char *progname = 0; -char *progclass = "XScreenSaver"; +const char *progclass = "XScreenSaver"; XrmDatabase db; XtAppContext app; -extern void grabscreen_verbose (void); - typedef enum { GRAB_DESK, GRAB_VIDEO, GRAB_FILE, GRAB_BARS } grab_type; @@ -105,27 +134,19 @@ typedef enum { #define GETIMAGE_FILE_PROGRAM "xscreensaver-getimage-file" #define GETIMAGE_SCREEN_PROGRAM "screencapture" -extern const char *blurb (void); - -const char * -blurb (void) -{ - return progname; -} - static int x_ehandler (Display *dpy, XErrorEvent *error) { if (error->error_code == BadWindow || error->error_code == BadDrawable) { - fprintf (stderr, "%s: target %s 0x%lx unexpectedly deleted\n", progname, + fprintf (stderr, "%s: target %s 0x%lx unexpectedly deleted\n", blurb(), (error->error_code == BadWindow ? "window" : "pixmap"), (unsigned long) error->resourceid); } else { - fprintf (stderr, "\nX error in %s:\n", progname); + fprintf (stderr, "\nX error in %s:\n", blurb()); XmuPrintDefaultErrorMessage (dpy, error, stderr); } exit (-1); @@ -136,101 +157,79 @@ x_ehandler (Display *dpy, XErrorEvent *error) static Bool error_handler_hit_p = False; static int -ignore_all_errors_ehandler (Display *dpy, XErrorEvent *error) +ignore_badwindow_ehandler (Display *dpy, XErrorEvent *error) { error_handler_hit_p = True; - return 0; -} - -#ifndef USE_EXTERNAL_SCREEN_GRABBER -static int -ignore_badmatch_ehandler (Display *dpy, XErrorEvent *error) -{ - if (error->error_code == BadMatch) - return ignore_all_errors_ehandler (dpy, error); + if (error->error_code == BadWindow || error->error_code == BadDrawable) + return 0; else return x_ehandler (dpy, error); } -#endif /* ! USE_EXTERNAL_SCREEN_GRABBER */ -/* Returns True if the given Drawable is a Window; False if it's a Pixmap. +/* Whether the given window is: + - the real root window; + - a direct child of the root window; + - a direct child of the window manager's decorations. */ static Bool -drawable_window_p (Display *dpy, Drawable d) -{ - XErrorHandler old_handler; - XWindowAttributes xgwa; - - XSync (dpy, False); - old_handler = XSetErrorHandler (ignore_all_errors_ehandler); - error_handler_hit_p = False; - XGetWindowAttributes (dpy, d, &xgwa); - XSync (dpy, False); - XSetErrorHandler (old_handler); - XSync (dpy, False); - - if (!error_handler_hit_p) - return True; /* It's a Window. */ - else - return False; /* It's a Pixmap, or an invalid ID. */ -} - - -/* Returns true if the window is the root window, or a virtual root window, - but *not* the xscreensaver window. That is, if it's a "real" desktop - root window of some kind. - */ -static Bool -root_window_p (Screen *screen, Window window) +top_level_window_p (Screen *screen, Window window) { Display *dpy = DisplayOfScreen (screen); - Atom type; - int format; - unsigned long nitems, bytesafter; - unsigned char *version; + Window root, parent, *kids; + unsigned int nkids; - if (window != RootWindowOfScreen (screen)) + if (!XQueryTree (dpy, window, &root, &parent, &kids, &nkids)) return False; - if (XGetWindowProperty (dpy, window, - XInternAtom (dpy, "_SCREENSAVER_VERSION", False), - 0, 1, False, XA_STRING, - &type, &format, &nitems, &bytesafter, - &version) - == Success - && type != None) - return False; + if (window == root) + return True; - return True; + /* If our direct parent is the real root window, then yes. */ + if (parent == root) + return True; + else + { + Atom type = None; + int format; + unsigned long nitems, bytesafter; + unsigned char *data; + + /* If our direct parent has the WM_STATE property, then it is a + window manager decoration -- yes. + */ + if (XGetWindowProperty (dpy, window, + XInternAtom (dpy, "WM_STATE", True), + 0, 0, False, AnyPropertyType, + &type, &format, &nitems, &bytesafter, + (unsigned char **) &data) + == Success + && type != None) + return True; + } + + /* Else, no. We're deep in a tree somewhere. + */ + return False; } -/* Clear the window or pixmap to black, or its background color. - */ -static void -clear_drawable (Screen *screen, Drawable drawable) +static Bool +xscreensaver_window_p (Display *dpy, Window window) { - Display *dpy = DisplayOfScreen (screen); - XGCValues gcv; - GC gc; - Window root; - int x, y; - unsigned int w, h, bw, d; - XGetGeometry (dpy, drawable, &root, &x, &y, &w, &h, &bw, &d); - - /* The window might have no-op background of None, so to clear it, - draw a black rectangle first, then do XClearWindow (in case the - actual background color is non-black...) */ - - /* #### really we should allocate "black" instead, but I'm lazy... */ - gcv.foreground = BlackPixelOfScreen (screen); - gc = XCreateGC (dpy, drawable, GCForeground, &gcv); - XFillRectangle (dpy, drawable, gc, 0, 0, w, h); - XFreeGC (dpy, gc); - if (drawable_window_p (dpy, drawable)) - XClearWindow (dpy, (Window) drawable); - XFlush (dpy); + XClassHint h; + Bool ret = False; + /* Prior to 6.x, XScreenSaver windows were detectable with the + XA_SCREENSAVER_VERSION property, but now we just use the WM + class hint. */ + if (XGetClassHint (dpy, window, &h)) + { + if (h.res_class && !strcmp (h.res_class, "XScreenSaver")) + ret = True; + if (h.res_name) XFree (h.res_name); + if (h.res_class) XFree (h.res_class); + } + return ret; } @@ -269,7 +268,7 @@ compute_image_scaling (int src_w, int src_h, r *= r2; if (verbose_p) fprintf (stderr, "%s: weird aspect: scaling by %.1f\n", - progname, r2); + blurb(), r2); } tw = src_w * r; @@ -283,7 +282,7 @@ compute_image_scaling (int src_w, int src_h, { if (verbose_p) fprintf (stderr, "%s: scaling image by %d%% (%dx%d -> %dx%d)\n", - progname, pct, src_w, src_h, tw, th); + blurb(), pct, src_w, src_h, tw, th); src_w = tw; src_h = th; } @@ -308,8 +307,8 @@ compute_image_scaling (int src_w, int src_h, *scaled_to_y_ret = desty; if (verbose_p) - fprintf (stderr, "%s: displaying %dx%d+%d+%d image at %d,%d in %dx%d.\n", - progname, src_w, src_h, srcx, srcy, destx, desty, dest_w, dest_h); + fprintf (stderr, "%s: displaying %dx%d+%d+%d at %dx%d+%d+%d\n", + blurb(), src_w, src_h, srcx, srcy, dest_w, dest_h, destx, desty); } @@ -334,8 +333,8 @@ colorbars (Screen *screen, Visual *visual, Drawable drawable, Colormap cmap, This doesn't do dithering or smoothing, so it might have artifacts. If out of memory, returns False, and the XImage will have been destroyed and freed. + #### Maybe convert the XImage to a GdkImage and use GDK's scaler. */ -#if !defined(USE_EXTERNAL_SCREEN_GRABBER) || defined(HAVE_JPEGLIB) static Bool scale_ximage (Screen *screen, Visual *visual, XImage *ximage, int new_width, int new_height) @@ -353,7 +352,7 @@ scale_ximage (Screen *screen, Visual *visual, if (!ximage2->data) { fprintf (stderr, "%s: out of memory scaling %dx%d image to %dx%d\n", - progname, + blurb(), ximage->width, ximage->height, ximage2->width, ximage2->height); if (ximage->data) free (ximage->data); @@ -383,7 +382,6 @@ scale_ximage (Screen *screen, Visual *visual, return True; } -#endif /* !USE_EXTERNAL_SCREEN_GRABBER || HAVE_JPEGLIB */ #ifdef HAVE_GDK_PIXBUF @@ -399,6 +397,8 @@ read_file_gdk (Screen *screen, Window window, Drawable drawable, GdkPixbuf *pb; Display *dpy = DisplayOfScreen (screen); unsigned int win_width, win_height, win_depth; + XGCValues gcv; + GC gc; GError *gerr = 0; /* Find the size of the Drawable. */ @@ -425,9 +425,9 @@ read_file_gdk (Screen *screen, Window window, Drawable drawable, if (!pb) { - fprintf (stderr, "%s: unable to load \"%s\"\n", progname, filename); + fprintf (stderr, "%s: unable to load \"%s\"\n", blurb(), filename); if (gerr && gerr->message && *gerr->message) - fprintf (stderr, "%s: reason: %s\n", progname, gerr->message); + fprintf (stderr, "%s: reason: %s\n", blurb(), gerr->message); return False; } else @@ -435,7 +435,6 @@ read_file_gdk (Screen *screen, Window window, Drawable drawable, int w = gdk_pixbuf_get_width (pb); int h = gdk_pixbuf_get_height (pb); int srcx, srcy, destx, desty, w2, h2; - Bool bg_p = False; # ifdef HAVE_GDK_PIXBUF_APPLY_EMBEDDED_ORIENTATION { @@ -447,7 +446,7 @@ read_file_gdk (Screen *screen, Window window, Drawable drawable, h = gdk_pixbuf_get_height (pb); if (verbose_p && (w != ow || h != oh)) fprintf (stderr, "%s: rotated %dx%d to %dx%d\n", - progname, ow, oh, w, h); + blurb(), ow, oh, w, h); } # endif @@ -465,37 +464,20 @@ read_file_gdk (Screen *screen, Window window, Drawable drawable, h = h2; } else - fprintf (stderr, "%s: out of memory when scaling?\n", progname); + fprintf (stderr, "%s: out of memory when scaling?\n", blurb()); } - /* If we're rendering onto the root window (and it's not the - xscreensaver pseudo-root) then put the image in the window's - background. Otherwise, just paint the image onto the window. - */ - bg_p = (window == drawable && root_window_p (screen, window)); - - if (bg_p) - { - XGCValues gcv; - GC gc; - drawable = XCreatePixmap (dpy, window, - win_width, win_height, win_depth); - gcv.foreground = BlackPixelOfScreen (screen); - gc = XCreateGC (dpy, drawable, GCForeground, &gcv); - XFillRectangle (dpy, drawable, gc, 0, 0, win_width, win_height); - XFreeGC (dpy, gc); - } - else - clear_drawable (screen, drawable); - - /* #### Note that this always uses the default colormap! Morons! - Owen says that in Gnome 2.0, I should try using - gdk_pixbuf_render_pixmap_and_mask_for_colormap() instead. - But I haven't tried. - */ if (srcx > 0) w -= srcx; if (srcy > 0) h -= srcy; + + gcv.foreground = BlackPixelOfScreen (screen); + gc = XCreateGC (dpy, drawable, GCForeground, &gcv); + # ifdef HAVE_GDK_PIXBUF_XLIB + if (w != win_width || h != win_height) + XFillRectangle (dpy, drawable, gc, 0, 0, win_width, win_height); + + /* Note that this always uses the default colormap. Oh my, so sad. */ gdk_pixbuf_xlib_render_to_drawable_alpha (pb, drawable, srcx, srcy, destx, desty, w, h, @@ -505,8 +487,8 @@ read_file_gdk (Screen *screen, Window window, Drawable drawable, # else /* !HAVE_GDK_PIXBUF_XLIB */ { /* Get the bits from GDK and render them out by hand. - #### This only handles 24 or 32-bit RGB TrueColor visuals. - Suck it, PseudoColor! + This only handles 24 or 32-bit RGB TrueColor visuals. + Suck it, PseudoColor! */ XWindowAttributes xgwa; int w = gdk_pixbuf_get_width (pb); @@ -516,8 +498,6 @@ read_file_gdk (Screen *screen, Window window, Drawable drawable, int chan = gdk_pixbuf_get_n_channels (pb); int x, y; XImage *image; - XGCValues gcv; - GC gc; XGetWindowAttributes (dpy, window, &xgwa); image = XCreateImage (dpy, xgwa.visual, xgwa.depth, ZPixmap, @@ -527,7 +507,7 @@ read_file_gdk (Screen *screen, Window window, Drawable drawable, if (!image->data) { - fprintf (stderr, "%s: out of memory (%d x %d)\n", progname, w, h); + fprintf (stderr, "%s: out of memory (%d x %d)\n", blurb(), w, h); return False; } @@ -559,17 +539,16 @@ read_file_gdk (Screen *screen, Window window, Drawable drawable, row += stride; } + /* Do this as late as possible to minimize flicker */ + if (w != win_width || h != win_height) + XFillRectangle (dpy, drawable, gc, 0, 0, win_width, win_height); + XPutImage (dpy, drawable, gc, image, srcx, srcy, destx, desty, w, h); XDestroyImage (image); - XFreeGC (dpy, gc); } # endif /* !HAVE_GDK_PIXBUF_XLIB */ - if (bg_p) - { - XSetWindowBackgroundPixmap (dpy, window, drawable); - XClearWindow (dpy, window); - } + XFreeGC (dpy, gc); if (geom_ret) { @@ -580,7 +559,6 @@ read_file_gdk (Screen *screen, Window window, Drawable drawable, } } - XSync (dpy, False); return True; } @@ -592,8 +570,6 @@ read_file_gdk (Screen *screen, Window window, Drawable drawable, /* Allocates a colormap that makes a PseudoColor or DirectColor visual behave like a TrueColor visual of the same depth. - - #### Duplicated in utils/grabscreen.c */ static void allocate_cubic_colormap (Screen *screen, Visual *visual, Colormap cmap, @@ -654,14 +630,12 @@ allocate_cubic_colormap (Screen *screen, Visual *visual, Colormap cmap, if (verbose_p) fprintf (stderr, "%s: allocated %d of %d colors for cubic map\n", - progname, allocated, cells); + blurb(), allocated, cells); } } /* Find the pixel index that is closest to the given color (using linear distance in RGB space -- which is far from the best way.) - - #### Duplicated in utils/grabscreen.c */ static unsigned long find_closest_pixel (XColor *colors, int ncolors, @@ -702,8 +676,6 @@ find_closest_pixel (XColor *colors, int ncolors, displayable with the given X colormap. The farther from a perfect color cube the contents of the colormap are, the lossier the transformation will be. No dithering is done. - - #### Duplicated in utils/grabscreen.c */ static void remap_image (Screen *screen, Colormap cmap, XImage *image, Bool verbose_p) @@ -730,7 +702,7 @@ remap_image (Screen *screen, Colormap cmap, XImage *image, Bool verbose_p) if (verbose_p) fprintf(stderr, "%s: building color cube for %d bit image\n", - progname, image->depth); + blurb(), image->depth); for (i = 0; i < cells; i++) { @@ -769,7 +741,7 @@ remap_image (Screen *screen, Colormap cmap, XImage *image, Bool verbose_p) if (verbose_p) fprintf(stderr, "%s: remapping colors in %d bit image\n", - progname, image->depth); + blurb(), image->depth); for (y = 0; y < image->height; y++) for (x = 0; x < image->width; x++) @@ -781,140 +753,6 @@ remap_image (Screen *screen, Colormap cmap, XImage *image, Bool verbose_p) } -/* If the file has a PPM (P6) on it, read it and return an XImage. - Otherwise, rewind the fd back to the beginning, and return 0. - */ -static XImage * -maybe_read_ppm (Screen *screen, Visual *visual, - const char *filename, FILE *in, Bool verbose_p) -{ - Display *dpy = DisplayOfScreen (screen); - int depth = visual_depth (screen, visual); - struct stat st; - char *buf = 0; - int bufsiz = 0; - char *s, dummy; - int i, j; - int x, y, w, h, maxval; - XImage *ximage = 0; - - if (fstat (fileno (in), &st)) - goto FAIL; - - bufsiz = st.st_size; - buf = (char *) malloc (bufsiz + 1); - if (!buf) - { - fprintf (stderr, "%s: out of memory loading %d byte PPM file %s\n", - progname, bufsiz, filename); - goto FAIL; - } - - if (! (s = fgets (buf, bufsiz, in))) /* line 1 */ - goto FAIL; - - if (!strncmp (buf, "\107\111", 2)) - { - fprintf (stderr, "%s: %s: sorry, GIF files not supported" - " when compiled with JPEGlib instead of GDK_Pixbuf.\n", - progname, filename); - goto FAIL; - } - else if (!strncmp (buf, "\211\120", 2)) - { - fprintf (stderr, "%s: %s: sorry, PNG files not supported" - " when compiled with JPEGlib instead of GDK_Pixbuf.\n", - progname, filename); - goto FAIL; - } - else if (!strncasecmp (buf, "data = (char *) calloc (ximage->height, ximage->bytes_per_line); - if (!ximage || !ximage->data) - { - fprintf (stderr, "%s: out of memory loading %dx%d PPM file %s\n", - progname, ximage->width, ximage->height, filename); - goto FAIL; - } - - s = buf; - j = bufsiz; - while ((i = fread (s, 1, j, in)) > 0) - s += i, j -= i; - - i = 0; - for (y = 0; y < ximage->height; y++) - for (x = 0; x < ximage->width; x++) - { - unsigned char r = buf[i++]; - unsigned char g = buf[i++]; - unsigned char b = buf[i++]; - unsigned long pixel; - - if (depth > 16) - pixel = (r << 16) | (g << 8) | b; - else if (depth == 8) - pixel = ((r >> 5) | ((g >> 5) << 3) | ((b >> 6) << 6)); - else if (depth == 12) - pixel = ((r >> 4) | ((g >> 4) << 4) | ((b >> 4) << 8)); - else if (depth == 16 || depth == 15) - pixel = (((r >> 3) << 10) | ((g >> 3) << 5) | ((b >> 3))); - else - abort(); - - XPutPixel (ximage, x, y, pixel); - } - - free (buf); - return ximage; - - FAIL: - if (buf) free (buf); - if (ximage && ximage->data) - { - free (ximage->data); - ximage->data = 0; - } - if (ximage) XDestroyImage (ximage); - fseek (in, 0, SEEK_SET); - return 0; -} - - typedef struct { struct jpeg_error_mgr pub; /* this is what passes for subclassing in C */ const char *filename; @@ -931,7 +769,7 @@ jpg_output_message (j_common_ptr cinfo) getimg_jpg_error_mgr *err = (getimg_jpg_error_mgr *) cinfo->err; char buf[JMSG_LENGTH_MAX]; cinfo->err->format_message (cinfo, buf); - fprintf (stderr, "%s: %s: %s\n", progname, err->filename, buf); + fprintf (stderr, "%s: %s: %s\n", blurb(), err->filename, buf); } @@ -970,26 +808,17 @@ read_jpeg_ximage (Screen *screen, Visual *visual, Drawable drawable, if (! (depth >= 15 || depth == 12 || depth == 8)) { - fprintf (stderr, "%s: unsupported depth: %d\n", progname, depth); + fprintf (stderr, "%s: unsupported depth: %d\n", blurb(), depth); goto FAIL; } in = fopen (filename, "rb"); if (!in) { - fprintf (stderr, "%s: %s: unreadable\n", progname, filename); + fprintf (stderr, "%s: %s: unreadable\n", blurb(), filename); goto FAIL; } - /* Check to see if it's a PPM, and if so, read that instead of using - the JPEG library. Yeah, this is all modular and stuff. - */ - if ((ximage = maybe_read_ppm (screen, visual, filename, in, verbose_p))) - { - fclose (in); - return ximage; - } - cinfo.err = jpeg_std_error (&jerr.pub); jerr.pub.output_message = jpg_output_message; jerr.pub.error_exit = jpg_error_exit; @@ -1019,7 +848,7 @@ read_jpeg_ximage (Screen *screen, Visual *visual, Drawable drawable, if (!ximage || !ximage->data || !scanbuf) { fprintf (stderr, "%s: out of memory loading %dx%d file %s\n", - progname, ximage->width, ximage->height, filename); + blurb(), ximage->width, ximage->height, filename); goto FAIL; } @@ -1100,6 +929,8 @@ read_file_jpeglib (Screen *screen, Window window, Drawable drawable, Colormap cmap; unsigned int win_width, win_height, win_depth; int srcx, srcy, destx, desty, w2, h2; + GC gc; + XGCValues gcv; /* Find the size of the Drawable, and the Visual/Colormap of the Window. */ { @@ -1122,7 +953,7 @@ read_file_jpeglib (Screen *screen, Window window, Drawable drawable, (depth != 8 && depth != 12)) { fprintf (stderr, "%s: Pseudo/DirectColor depth %d unsupported\n", - progname, depth); + blurb(), depth); return False; } @@ -1149,38 +980,15 @@ read_file_jpeglib (Screen *screen, Window window, Drawable drawable, remap_image (screen, cmap, ximage, verbose_p); } - /* Finally, put the resized image on the window. + /* Finally, put the resized image on the drawable. */ - { - GC gc; - XGCValues gcv; - - /* If we're rendering onto the root window (and it's not the xscreensaver - pseudo-root) then put the image in the window's background. Otherwise, - just paint the image onto the window. - */ - if (window == drawable && root_window_p (screen, window)) - { - Pixmap bg = XCreatePixmap (dpy, window, - win_width, win_height, win_depth); - gcv.foreground = BlackPixelOfScreen (screen); - gc = XCreateGC (dpy, drawable, GCForeground, &gcv); - XFillRectangle (dpy, bg, gc, 0, 0, win_width, win_height); - XPutImage (dpy, bg, gc, ximage, - srcx, srcy, destx, desty, ximage->width, ximage->height); - XSetWindowBackgroundPixmap (dpy, window, bg); - XClearWindow (dpy, window); - } - else - { - gc = XCreateGC (dpy, drawable, 0, &gcv); - clear_drawable (screen, drawable); - XPutImage (dpy, drawable, gc, ximage, - srcx, srcy, destx, desty, ximage->width, ximage->height); - } - - XFreeGC (dpy, gc); - } + gcv.foreground = BlackPixelOfScreen (screen); + gc = XCreateGC (dpy, drawable, GCForeground, &gcv); + if (ximage->width != win_width || ximage->height != win_height) + XFillRectangle (dpy, drawable, gc, 0, 0, win_width, win_height); + XPutImage (dpy, drawable, gc, ximage, + srcx, srcy, destx, desty, ximage->width, ximage->height); + XFreeGC (dpy, gc); if (geom_ret) { @@ -1193,7 +1001,6 @@ read_file_jpeglib (Screen *screen, Window window, Drawable drawable, free (ximage->data); ximage->data = 0; XDestroyImage (ximage); - XSync (dpy, False); return True; } @@ -1209,7 +1016,7 @@ display_file (Screen *screen, Window window, Drawable drawable, XRectangle *geom_ret) { if (verbose_p) - fprintf (stderr, "%s: loading \"%s\"\n", progname, filename); + fprintf (stderr, "%s: loading \"%s\"\n", blurb(), filename); # if defined(HAVE_GDK_PIXBUF) if (read_file_gdk (screen, window, drawable, filename, verbose_p, geom_ret)) @@ -1263,16 +1070,27 @@ get_filename_1 (Screen *screen, const char *directory, grab_type type, # ifdef USE_EXTERNAL_SCREEN_GRABBER case GRAB_DESK: - av[ac++] = GETIMAGE_SCREEN_PROGRAM; - av[ac++] = "-x"; /* no sound */ - av[ac++] = "-t"; /* file type */ - av[ac++] = "png"; { + XWindowAttributes xgwa; const char *tmpdir = getenv("TMPDIR"); + static char rect[100]; if (!tmpdir) tmpdir = "/tmp"; + + /* Grab all screens */ + XGetWindowAttributes (dpy, XRootWindowOfScreen (screen), &xgwa); + sprintf (rect, "%d,%d,%d,%d", xgwa.x, xgwa.y, xgwa.width, xgwa.height); + outfile = (char *) malloc (strlen(tmpdir) + 100); sprintf (outfile, "%s/xscreensaver.%08x.png", tmpdir, random() % 0xFFFFFFFF); + + av[ac++] = GETIMAGE_SCREEN_PROGRAM; + av[ac++] = "-x"; /* no sound */ + av[ac++] = "-C"; /* capture mouse */ + av[ac++] = "-R"; /* rect */ + av[ac++] = rect; + av[ac++] = "-t"; /* file type */ + av[ac++] = "png"; av[ac++] = outfile; } break; @@ -1286,7 +1104,7 @@ get_filename_1 (Screen *screen, const char *directory, grab_type type, if (verbose_p) { int i; - fprintf (stderr, "%s: executing:", progname); + fprintf (stderr, "%s: executing:", blurb()); for (i = 0; i < ac; i++) fprintf (stderr, " %s", av[i]); fprintf (stderr, "\n"); @@ -1294,7 +1112,7 @@ get_filename_1 (Screen *screen, const char *directory, grab_type type, if (pipe (fds)) { - sprintf (buf, "%s: error creating pipe", progname); + sprintf (buf, "%s: error creating pipe", blurb()); perror (buf); return 0; } @@ -1306,7 +1124,7 @@ get_filename_1 (Screen *screen, const char *directory, grab_type type, { case -1: { - sprintf (buf, "%s: couldn't fork", progname); + sprintf (buf, "%s: couldn't fork", blurb()); perror (buf); if (outfile) free (outfile); return 0; @@ -1320,7 +1138,7 @@ get_filename_1 (Screen *screen, const char *directory, grab_type type, if (dup2 (out, stdout_fd) < 0) /* pipe stdout */ { - sprintf (buf, "%s: could not dup() a new stdout", progname); + sprintf (buf, "%s: could not dup() a new stdout", blurb()); exit (-1); /* exits fork */ } @@ -1371,7 +1189,7 @@ get_filename_1 (Screen *screen, const char *directory, grab_type type, if (stat (outfile_full, &st)) { fprintf (stderr, "%s: file does not exist: \"%s\"\n", - progname, outfile_full); + blurb(), outfile_full); free (outfile); outfile = 0; } @@ -1429,7 +1247,7 @@ display_video (Screen *screen, Window window, Drawable drawable, if (!filename) { if (verbose_p) - fprintf (stderr, "%s: video grab failed.\n", progname); + fprintf (stderr, "%s: video grab failed\n", blurb()); return False; } @@ -1439,161 +1257,556 @@ display_video (Screen *screen, Window window, Drawable drawable, if (unlink (filename)) { char buf[512]; - sprintf (buf, "%s: rm %.100s", progname, filename); + sprintf (buf, "%s: rm %.100s", blurb(), filename); perror (buf); } else if (verbose_p) - fprintf (stderr, "%s: rm %s\n", progname, filename); + fprintf (stderr, "%s: rm %s\n", blurb(), filename); if (filename) free (filename); return status; } -/* Grabs a desktop screen shot onto the window and the drawable. - If the window and drawable are not the same size, the image in - the drawable is scaled to fit. - Returns False if it fails. +/* When we are grabbing and manipulating a screen image, it's important that + we use the same colormap it originally had. So, if the screensaver was + started with -install, we need to copy the contents of the default colormap + into the screensaver's colormap. + */ +static void +copy_default_colormap_contents (Screen *screen, + Colormap to_cmap, + Visual *to_visual, + Bool verbose_p) +{ + Display *dpy = DisplayOfScreen (screen); + Visual *from_visual = DefaultVisualOfScreen (screen); + Colormap from_cmap = XDefaultColormapOfScreen (screen); + + XColor *old_colors, *new_colors; + unsigned long *pixels; + XVisualInfo vi_in, *vi_out; + int out_count; + int from_cells, to_cells, max_cells, got_cells; + int i; + + if (from_cmap == to_cmap) + return; + + vi_in.screen = XScreenNumberOfScreen (screen); + vi_in.visualid = XVisualIDFromVisual (from_visual); + vi_out = XGetVisualInfo (dpy, VisualScreenMask|VisualIDMask, + &vi_in, &out_count); + if (! vi_out) abort (); + from_cells = vi_out [0].colormap_size; + XFree ((char *) vi_out); + + vi_in.screen = XScreenNumberOfScreen (screen); + vi_in.visualid = XVisualIDFromVisual (to_visual); + vi_out = XGetVisualInfo (dpy, VisualScreenMask|VisualIDMask, + &vi_in, &out_count); + if (! vi_out) abort (); + to_cells = vi_out [0].colormap_size; + XFree ((char *) vi_out); + + max_cells = (from_cells > to_cells ? to_cells : from_cells); + + old_colors = (XColor *) calloc (sizeof (XColor), max_cells); + new_colors = (XColor *) calloc (sizeof (XColor), max_cells); + pixels = (unsigned long *) calloc (sizeof (unsigned long), max_cells); + for (i = 0; i < max_cells; i++) + old_colors[i].pixel = i; + XQueryColors (dpy, from_cmap, old_colors, max_cells); + + got_cells = max_cells; + allocate_writable_colors (screen, to_cmap, pixels, &got_cells); + + if (verbose_p && got_cells != max_cells) + fprintf(stderr, "%s: got only %d of %d cells\n", blurb(), + got_cells, max_cells); + + if (got_cells <= 0) /* we're screwed */ + ; + else if (got_cells == max_cells && /* we're golden */ + from_cells == to_cells) + XStoreColors (dpy, to_cmap, old_colors, got_cells); + else /* try to cope... */ + { + for (i = 0; i < got_cells; i++) + { + XColor *c = old_colors + i; + int j; + for (j = 0; j < got_cells; j++) + if (pixels[j] == c->pixel) + { + /* only store this color value if this is one of the pixels + we were able to allocate. */ + XStoreColors (dpy, to_cmap, c, 1); + break; + } + } + } + + + if (verbose_p) + fprintf(stderr, "%s: installing copy of default colormap\n", blurb()); + + free (old_colors); + free (new_colors); + free (pixels); +} + + +/* Install the colormaps of all visible windows, deepest first. + This should leave the colormaps of the topmost windows installed + (if only N colormaps can be installed at a time, then only the + topmost N windows will be shown in the right colors.) */ +static void +install_screen_colormaps (Screen *screen) +{ + unsigned int i; + Display *dpy = DisplayOfScreen (screen); + Window real_root; + Window parent, *kids = 0; + unsigned int nkids = 0; + XErrorHandler old_handler; + + XSync (dpy, False); + old_handler = XSetErrorHandler (ignore_badwindow_ehandler); + error_handler_hit_p = False; + + real_root = XRootWindowOfScreen (screen); /* not vroot */ + if (XQueryTree (dpy, real_root, &real_root, &parent, &kids, &nkids)) + for (i = 0; i < nkids; i++) + { + XWindowAttributes xgwa; + Window client; + /* if (! (client = XmuClientWindow (dpy, kids[i]))) */ + client = kids[i]; + xgwa.colormap = 0; + XGetWindowAttributes (dpy, client, &xgwa); + if (xgwa.colormap && xgwa.map_state == IsViewable) + XInstallColormap (dpy, xgwa.colormap); + } + XInstallColormap (dpy, DefaultColormapOfScreen (screen)); + XSync (dpy, False); + XSetErrorHandler (old_handler); + XSync (dpy, False); + + if (kids) + XFree ((char *) kids); +} + + static Bool -display_desktop (Screen *screen, Window window, Drawable drawable, - Bool verbose_p, XRectangle *geom_ret) +MapNotify_event_p (Display *dpy, XEvent *event, XPointer window) { -# ifdef USE_EXTERNAL_SCREEN_GRABBER + return (event->xany.type == MapNotify && + event->xvisibility.window == (Window) window); +} + +static void +raise_window (Display *dpy, Window window, Bool dont_wait, Bool verbose_p) +{ + if (verbose_p) + fprintf(stderr, "%s: raising window 0x%08lX (%s)\n", + blurb(), (unsigned long) window, + (dont_wait ? "not waiting" : "waiting")); + + if (! dont_wait) + { + XWindowAttributes xgwa; + XSizeHints hints; + long supplied = 0; + memset(&hints, 0, sizeof(hints)); + XGetWMNormalHints(dpy, window, &hints, &supplied); + XGetWindowAttributes (dpy, window, &xgwa); + hints.x = xgwa.x; + hints.y = xgwa.y; + hints.width = xgwa.width; + hints.height = xgwa.height; + hints.flags |= (PPosition|USPosition|PSize|USSize); + XSetWMNormalHints(dpy, window, &hints); + + XSelectInput (dpy, window, (xgwa.your_event_mask | StructureNotifyMask)); + } + + XMapRaised (dpy, window); + + if (! dont_wait) + { + XEvent event; + XIfEvent (dpy, &event, MapNotify_event_p, (XPointer) window); + XSync (dpy, True); + } +} + + +/* Returns a pixmap of a screenshot, that is the size of the window + and covers that window's extent. + + This does it the hard way: by unmapping the window, waiting an arbitrary + amount of time, copying some bits from the root, then re-mapping the + window. + */ +static Pixmap +grab_screen_image_xcopyarea (Screen *screen, Window window, Bool verbose_p) +{ Display *dpy = DisplayOfScreen (screen); - Bool top_p = top_level_window_p (screen, window); - char *filename; - Bool status; + XWindowAttributes xgwa; + Window real_root; + Bool root_p; + Bool saver_p; + double unmap_time = 0; + Pixmap pixmap = None; + XGCValues gcv; + GC gc; + + real_root = XRootWindowOfScreen (screen); /* not vroot */ + root_p = (window == real_root); + saver_p = xscreensaver_window_p (dpy, window); + + XGetWindowAttributes (dpy, window, &xgwa); + screen = xgwa.screen; + + if (root_p) + unmap_time = 0; /* real root window needs no delay */ + else if (saver_p) + { + unmap_time = get_float_resource (dpy, "grabRootDelay", "Seconds"); + if (unmap_time <= 0.00001 || unmap_time > 20) + + /* 2022, Raspbian 11.5: after we call XUnmapWindow, it takes nearly + *five seconds* for the framebuffer to update! If we delay for less + than that, the window grabs an image of itself, which usually means + black. One would normally suspect the compositor of being + responsible for these sorts of shenanigans, but this is under + LXDE... + + Oddly, running Debian 11.4 under VirtualBox (meaning slowwwwww) + does not have this problem, and a delay of 0.33 is plenty. + + This problem does not afflict driver/fade.c as it just uses + XCopyArea directly without needing to wait for other processes + to react to the XUnmapWindow and re-paint. + + This nonsense is what led me to write screenshot.c. Instead of + unmapping the window and taking a screenshot at the time the image + is requested, xscreensaver-gfx takes the screenshot before mapping + the saver window and saves it on a property, which we then load. + Upside: it works, and it's faster. Downside: the screen image will + be of the desktop as it appeared before the screen first blanked, + rather then as it appeared at the time the hack was launched. + */ + unmap_time = 5.0; + } + else /* managed window */ + { + unmap_time = get_float_resource (dpy, "grabWindowDelay", "Seconds"); + if (unmap_time <= 0.00001 || unmap_time > 20) + unmap_time = 0.33; + } - if (top_p) + if (verbose_p) + { + fprintf (stderr, "\n%s: window 0x%08lX" + " root: %d saver: %d wait: %.1f\n", + blurb(), (unsigned long) window, + root_p, saver_p, unmap_time); + + if (xgwa.visual->class != TrueColor) + { + fprintf(stderr, "%s: ", blurb()); + describe_visual (stderr, screen, xgwa.visual, False); + fprintf (stderr, "\n"); + } + } + + + if (!root_p && !top_level_window_p (screen, window)) { if (verbose_p) - fprintf (stderr, "%s: unmapping 0x%lx.\n", progname, + fprintf (stderr, "%s: not a top-level window: 0x%08lX: not grabbing\n", + blurb(), (unsigned long) window); + return None; + } + + + if (unmap_time > 0) + { + if (verbose_p) + fprintf (stderr, "%s: unmapping 0x%08lX\n", blurb(), (unsigned long) window); XUnmapWindow (dpy, window); - XSync (dpy, False); + if (xgwa.visual->class != TrueColor) + install_screen_colormaps (screen); + XSync (dpy, True); + /* wait for everyone to swap in and handle exposes */ + usleep ((unsigned long) (unmap_time * 1000000)); } - filename = get_desktop_filename (screen, verbose_p); + /* Now that the window is off the screen and we have delayed, grab bits. + */ + pixmap = XCreatePixmap (dpy, window, xgwa.width, xgwa.height, xgwa.depth); + + if (!root_p && xgwa.visual->class != TrueColor) + copy_default_colormap_contents (screen, xgwa.colormap, xgwa.visual, + verbose_p); + + gcv.function = GXcopy; + gcv.subwindow_mode = IncludeInferiors; + gc = XCreateGC (dpy, window, GCFunction | GCSubwindowMode, &gcv); + XCopyArea (dpy, real_root, pixmap, gc, + xgwa.x, xgwa.y, xgwa.width, xgwa.height, 0, 0); + XFreeGC (dpy, gc); + + if (!root_p && xgwa.visual->class != TrueColor) + copy_default_colormap_contents (screen, xgwa.colormap, xgwa.visual, + verbose_p); + + raise_window (dpy, window, saver_p, verbose_p); + + /* Generally it's bad news to call XInstallColormap() explicitly, + but this file does a lot of sleazy stuff already... This is to + make sure that the window's colormap is installed, even in the + case where the window is OverrideRedirect. */ + if (xgwa.colormap && xgwa.visual->class != TrueColor) + XInstallColormap (dpy, xgwa.colormap); + + if (verbose_p) + fprintf (stderr, "%s: grabbed screenshot to %s window\n", blurb(), + (root_p ? "real root" : saver_p ? "saver" : "top-level")); + + return pixmap; +} + + +#ifdef USE_EXTERNAL_SCREEN_GRABBER +static Pixmap +grab_screen_image_external (Screen *screen, Window window, Bool verbose_p) +{ + Display *dpy = DisplayOfScreen (screen); + Window real_root; + Bool root_p; + Bool saver_p; + double unmap_time = 0; + XWindowAttributes xgwa; + char *filename; + Pixmap full, screenshot; + XGCValues gcv; + GC gc; + XRectangle geom; + + real_root = XRootWindowOfScreen (screen); /* not vroot */ + root_p = (window == real_root); + saver_p = xscreensaver_window_p (dpy, window); + + /* Using "screencapture" from within xscreensaver-settings doesn't work, + since we don't unmap the xscreensaver-settings window first. */ + /* if (!root_p && !saver_p) return None; */ + + XGetWindowAttributes (dpy, XRootWindowOfScreen (screen), &xgwa); + screen = xgwa.screen; + + if (root_p) + unmap_time = 0; /* real root window needs no delay */ + else + { + unmap_time = get_float_resource (dpy, "grabWindowDelay", "Seconds"); + if (unmap_time <= 0.00001 || unmap_time > 20) + { + unmap_time = 0.33; + if (saver_p) unmap_time = 5.0; /* WTF */ + } + } - if (top_p) + if (unmap_time > 0) { if (verbose_p) - fprintf (stderr, "%s: mapping 0x%lx.\n", progname, + fprintf (stderr, "%s: unmapping 0x%08lX\n", blurb(), (unsigned long) window); - XMapRaised (dpy, window); - XSync (dpy, False); + XUnmapWindow (dpy, window); + if (xgwa.visual->class != TrueColor) + install_screen_colormaps (screen); + if (verbose_p) + fprintf (stderr, "%s: sleeping %.02f\n", blurb(), unmap_time); + /* wait for everyone to swap in and handle exposes */ + usleep ((unsigned long) (unmap_time * 1000000)); } + /* Now that the window is off the screen and we have delayed, grab bits, + then put the window pack. + */ + filename = get_desktop_filename (screen, verbose_p); + raise_window (dpy, window, saver_p, verbose_p); + if (!filename) { if (verbose_p) - fprintf (stderr, "%s: desktop grab failed.\n", progname); + fprintf (stderr, "%s: screenshot via \"%s\" failed\n", blurb(), + GETIMAGE_SCREEN_PROGRAM); return False; } - status = display_file (screen, window, drawable, filename, verbose_p, - geom_ret); + /* Read the file into a pixmap the size of the root window. + If there are 2 screens, pixmap will be twice as wide as it needs + to be and the screenshot will be centered on it, per 'geom'. + */ + full = XCreatePixmap (dpy, window, xgwa.width, xgwa.height, xgwa.depth); + if (!full) + { + unlink (filename); + return False; + } + +# if defined(HAVE_GDK_PIXBUF) + if (! read_file_gdk (screen, window, full, filename, verbose_p, &geom)) + { + unlink (filename); + XFreePixmap (dpy, full); + return False; + } +# elif defined(HAVE_JPEGLIB) + if (! read_file_jpeglib (screen, window, full, filename, verbose_p, &geom)) + { + unlink (filename); + XFreePixmap (dpy, full); + return False; + } +# else /* !(HAVE_GDK_PIXBUF || HAVE_JPEGLIB) */ + /* shouldn't get here if we have no image-loading methods available. */ + abort(); +# endif /* !(HAVE_GDK_PIXBUF || HAVE_JPEGLIB) */ if (unlink (filename)) { char buf[512]; - sprintf (buf, "%s: rm %.100s", progname, filename); + sprintf (buf, "%s: rm %.100s", blurb(), filename); perror (buf); } else if (verbose_p) - fprintf (stderr, "%s: rm %s\n", progname, filename); + fprintf (stderr, "%s: rm %s\n", blurb(), filename); - if (filename) free (filename); - return status; + /* Retrieve the sub-rect of the full screen image that the window covers. */ + XGetWindowAttributes (dpy, window, &xgwa); + if (!root_p && !saver_p) + { + /* Kludge for running inside xscreensaver-settings: show the upper + left of the screen instead, since otherwise we would have captured + the black rectangle that we are about to render into. */ + xgwa.x = xgwa.y = 0; + } + else + { + window_root_offset (dpy, window, &xgwa.x, &xgwa.y); + } + + screenshot = XCreatePixmap (dpy, window, xgwa.width, xgwa.height, + xgwa.depth); + gc = XCreateGC (dpy, screenshot, 0, &gcv); + XCopyArea (dpy, full, screenshot, gc, + geom.x + xgwa.x, geom.y + xgwa.y, + xgwa.width, xgwa.height, 0, 0); + XFreeGC (dpy, gc); + XFreePixmap (dpy, full); + + if (verbose_p) + fprintf (stderr, "%s: screenshot %dx%d+%d+%d via \"%s\"\n", blurb(), + xgwa.width, xgwa.height, xgwa.x, xgwa.y, + GETIMAGE_SCREEN_PROGRAM); + + return screenshot; +} +#endif /* USE_EXTERNAL_SCREEN_GRABBER */ -# else /* !USE_EXTERNAL_SCREEN_GRABBER */ +/* Grabs a desktop screen shot onto the drawable and possibly the window. + If the window and drawable are not the same size, the image in the + drawable is scaled to fit. + Returns False if it fails. + */ +static Bool +display_desktop (Screen *screen, Window window, Drawable drawable, + Bool verbose_p, XRectangle *geom_ret) +{ Display *dpy = DisplayOfScreen (screen); - XGCValues gcv; - XWindowAttributes xgwa; Window root; - int px, py; - unsigned int pw, ph, pbw, pd; - int srcx, srcy, destx, desty, w2, h2; + Pixmap screenshot = None; + int srcx, srcy, dstx, dsty, w2, h2; + unsigned int srcw, srch, dstw, dsth, bw, d; + GC gc; + XGCValues gcv; if (verbose_p) - { - fprintf (stderr, "%s: grabbing desktop image\n", progname); - grabscreen_verbose(); - } - - XGetWindowAttributes (dpy, window, &xgwa); - XGetGeometry (dpy, drawable, &root, &px, &py, &pw, &ph, &pbw, &pd); + fprintf (stderr, "%s: grabbing desktop image\n", blurb()); - grab_screen_image_internal (screen, window); + screenshot = screenshot_load (dpy, window, verbose_p); - compute_image_scaling (xgwa.width, xgwa.height, - pw, ph, verbose_p, - &srcx, &srcy, &destx, &desty, &w2, &h2); +# ifdef USE_EXTERNAL_SCREEN_GRABBER + if (! screenshot) + screenshot = grab_screen_image_external (screen, window, verbose_p); +# endif /* USE_EXTERNAL_SCREEN_GRABBER */ - if (pw == w2 && ph == h2) /* it fits -- just copy server-side pixmaps */ + if (!screenshot && !top_level_window_p (screen, window)) { - GC gc = XCreateGC (dpy, drawable, 0, &gcv); - XCopyArea (dpy, window, drawable, gc, - 0, 0, xgwa.width, xgwa.height, 0, 0); - XFreeGC (dpy, gc); + if (verbose_p) + fprintf (stderr, "%s: 0x%x not top-level: can't grab desktop\n", + blurb(), (unsigned int) window); + return False; } - else /* size mismatch -- must scale client-side images to fit drawable */ - { - GC gc; - XImage *ximage = 0; - XErrorHandler old_handler; - XSync (dpy, False); - old_handler = XSetErrorHandler (ignore_badmatch_ehandler); - error_handler_hit_p = False; + if (! screenshot) + screenshot = grab_screen_image_xcopyarea (screen, window, verbose_p); - /* This can return BadMatch if the window is not fully on screen. - Trap that error and return color bars in that case. - (Note that this only happens with XGetImage, not with XCopyArea: - yet another totally gratuitous inconsistency in X, thanks.) - */ - ximage = XGetImage (dpy, window, 0, 0, xgwa.width, xgwa.height, - ~0L, ZPixmap); + if (!screenshot) + return False; - XSync (dpy, False); - XSetErrorHandler (old_handler); - XSync (dpy, False); + XGetGeometry (dpy, screenshot, &root, &srcx, &srcy, &srcw, &srch, &bw, &d); + XGetGeometry (dpy, drawable, &root, &dstx, &dsty, &dstw, &dsth, &bw, &d); - if (error_handler_hit_p) - { - ximage = 0; - if (verbose_p) - fprintf (stderr, "%s: BadMatch reading window 0x%x contents!\n", - progname, (unsigned int) window); - } + compute_image_scaling (srcw, srch, + dstw, dsth, verbose_p, + &srcx, &srcy, &dstx, &dsty, &w2, &h2); + if (srcw != w2 || srch != h2) /* scale screenshot to fit drawable */ + { + XImage *ximage = 0; + XWindowAttributes xgwa; + Pixmap scaled; + + XGetWindowAttributes (dpy, window, &xgwa); + + ximage = XGetImage (dpy, screenshot, 0, 0, srcw, srch, ~0L, ZPixmap); if (!ximage || !scale_ximage (xgwa.screen, xgwa.visual, ximage, w2, h2)) return False; - gc = XCreateGC (dpy, drawable, 0, &gcv); - clear_drawable (screen, drawable); - XPutImage (dpy, drawable, gc, ximage, - srcx, srcy, destx, desty, ximage->width, ximage->height); + scaled = XCreatePixmap (dpy, window, w2, h2, xgwa.depth); + if (! scaled) return False; + + gc = XCreateGC (dpy, scaled, 0, &gcv); + XPutImage (dpy, scaled, gc, ximage, srcx, srcy, dstx, dsty, w2, h2); XDestroyImage (ximage); XFreeGC (dpy, gc); + XFreePixmap (dpy, screenshot); + screenshot = scaled; } + gc = XCreateGC (dpy, drawable, 0, &gcv); + XCopyArea (dpy, screenshot, drawable, gc, 0, 0, w2, h2, 0, 0); + XFreeGC (dpy, gc); + if (geom_ret) { - geom_ret->x = destx; - geom_ret->y = desty; + geom_ret->x = 0; + geom_ret->y = 0; geom_ret->width = w2; geom_ret->height = h2; } - XSync (dpy, False); return True; - -# endif /* !USE_EXTERNAL_SCREEN_GRABBER */ } @@ -1631,13 +1844,6 @@ get_image (Screen *screen, char *absfile = 0; XRectangle geom = { 0, 0, 0, 0 }; - if (! drawable_window_p (dpy, window)) - { - fprintf (stderr, "%s: 0x%lx is a pixmap, not a window!\n", - progname, (unsigned long) window); - exit (1); - } - /* Make sure the Screen and the Window correspond. */ { XWindowAttributes xgwa; @@ -1647,20 +1853,20 @@ get_image (Screen *screen, if (file && stat (file, &st)) { - fprintf (stderr, "%s: file \"%s\" does not exist\n", progname, file); + fprintf (stderr, "%s: file \"%s\" does not exist\n", blurb(), file); file = 0; } if (verbose_p) { fprintf (stderr, "%s: grabDesktopImages: %s\n", - progname, desk_p ? "True" : "False"); + blurb(), desk_p ? "True" : "False"); fprintf (stderr, "%s: grabVideoFrames: %s\n", - progname, video_p ? "True" : "False"); + blurb(), video_p ? "True" : "False"); fprintf (stderr, "%s: chooseRandomImages: %s\n", - progname, image_p ? "True" : "False"); + blurb(), image_p ? "True" : "False"); fprintf (stderr, "%s: imageDirectory: %s\n", - progname, (file ? file : dir ? dir : "")); + blurb(), (file ? file : dir ? dir : "")); } # if !(defined(HAVE_GDK_PIXBUF) || defined(HAVE_JPEGLIB)) @@ -1673,8 +1879,8 @@ get_image (Screen *screen, { fprintf (stderr, "%s: image file loading not available at compile-time\n", - progname); - fprintf (stderr, "%s: can't load \"%s\"\n", progname, file); + blurb()); + fprintf (stderr, "%s: can't load \"%s\"\n", blurb(), file); file = 0; } # endif /* !(HAVE_GDK_PIXBUF || HAVE_JPEGLIB) */ @@ -1689,8 +1895,8 @@ get_image (Screen *screen, { if (verbose_p && image_p) fprintf (stderr, - "%s: no imageDirectory: turning off chooseRandomImages.\n", - progname); + "%s: no imageDirectory: turning off chooseRandomImages\n", + blurb()); image_p = False; } @@ -1714,23 +1920,9 @@ get_image (Screen *screen, We cannot grab desktop images that way if: - the window is a non-top-level window. - Under X11 on MacOS, desktops are just like loaded image files. - Under Cocoa on MacOS, this code is not used at all. + Under X11 on macOS, desktops are just like loaded image files. + Under Cocoa on macOS, this code is not used at all. */ -# ifndef USE_EXTERNAL_SCREEN_GRABBER - if (desk_p) - { - if (!top_level_window_p (screen, window)) - { - desk_p = False; - if (verbose_p) - fprintf (stderr, - "%s: 0x%x not top-level: turning off grabDesktopImages.\n", - progname, (unsigned int) window); - } - } -# endif /* !USE_EXTERNAL_SCREEN_GRABBER */ - if (! (desk_p || video_p || image_p)) which = GRAB_BARS; else @@ -1765,7 +1957,7 @@ get_image (Screen *screen, { which = GRAB_BARS; if (verbose_p) - fprintf (stderr, "%s: no image files found.\n", progname); + fprintf (stderr, "%s: no image files found\n", blurb()); } } @@ -1782,14 +1974,16 @@ get_image (Screen *screen, COLORBARS: if (verbose_p) - fprintf (stderr, "%s: drawing colorbars.\n", progname); + fprintf (stderr, "%s: drawing colorbars\n", blurb()); XGetWindowAttributes (dpy, window, &xgwa); XGetGeometry (dpy, drawable, &root, &xx, &yy, &w, &h, &bw, &d); colorbars (screen, xgwa.visual, drawable, xgwa.colormap, (h >= 600 ? 2 : h >= 300 ? 1 : 0)); - XSync (dpy, False); if (! file_prop) file_prop = ""; - + geom.x = 0; + geom.y = 0; + geom.width = w; + geom.height = h; } break; @@ -1863,7 +2057,6 @@ get_image (Screen *screen, } if (absfile) free (absfile); - XSync (dpy, False); } @@ -1941,14 +2134,14 @@ mapper (XrmDatabase *db, XrmBindingList bindings, XrmQuarkList quarks, "\n" \ " Options include:\n" \ "\n" \ - " -display host:dpy.screen which display to use\n" \ - " -root draw to the root window\n" \ - " -verbose print diagnostics\n" \ - " -images / -no-images whether to allow image file loading\n" \ - " -video / -no-video whether to allow video grabs\n" \ - " -desktop / -no-desktop whether to allow desktop screen grabs\n"\ - " -directory where to find image files to load\n" \ - " -file load this image file\n" \ + " --display host:dpy.screen which display to use\n" \ + " --root draw to the root window\n" \ + " --verbose print diagnostics\n" \ + " --images / --no-images whether to allow image file loading\n" \ + " --video / --no-video whether to allow video grabs\n" \ + " --desktop / --no-desktop whether to allow desktop screen grabs\n"\ + " --directory where to find image files to load\n" \ + " --file load this image file\n" \ "\n" \ " The xscreensaver-settings program lets you set the defaults for\n" \ " these options in your ~/.xscreensaver file.\n" \ @@ -1960,7 +2153,7 @@ main (int argc, char **argv) Widget toplevel; Display *dpy; Screen *screen; - char *oprogname = progname; + const char *oprogname = progname; char *file = 0; char version[255]; @@ -1979,9 +2172,6 @@ main (int argc, char **argv) if (s) progname = s+1; oprogname = progname; - /* half-assed way of avoiding buffer-overrun attacks. */ - if (strlen (progname) >= 100) progname[100] = 0; - # ifndef _VROOT_H_ # error Error! This file definitely needs vroot.h! # endif @@ -2044,7 +2234,8 @@ main (int argc, char **argv) } } - progname = argv[0] = oprogname; + progname = oprogname; + argv[0] = (char *) oprogname; for (i = 1; i < argc; i++) { @@ -2070,7 +2261,7 @@ main (int argc, char **argv) if (window) { fprintf (stderr, "%s: both %s and %s specified?\n", - progname, argv[i], window_str); + blurb(), argv[i], window_str); goto LOSE; } window_str = argv[i]; @@ -2083,7 +2274,7 @@ main (int argc, char **argv) if (drawable) { fprintf (stderr, "%s: both %s and %s specified?\n", - progname, drawable_str, argv[i]); + blurb(), drawable_str, argv[i]); goto LOSE; } else if (window) @@ -2101,10 +2292,10 @@ main (int argc, char **argv) { if (argv[i][0] == '-') fprintf (stderr, "\n%s: unknown option \"%s\"\n", - progname, argv[i]); + blurb(), argv[i]); else fprintf (stderr, "\n%s: unparsable window/pixmap ID: \"%s\"\n", - progname, argv[i]); + blurb(), argv[i]); LOSE: # ifdef __GNUC__ __extension__ /* don't warn about "string length is greater than @@ -2118,7 +2309,7 @@ main (int argc, char **argv) if (window == 0) { - fprintf (stderr, "\n%s: no window ID specified!\n", progname); + fprintf (stderr, "\n%s: no window ID specified!\n", blurb()); goto LOSE; } @@ -2141,5 +2332,6 @@ main (int argc, char **argv) get_image (screen, window, drawable, verbose_p, grab_desktop_p, grab_video_p, random_image_p, image_directory, file); + XSync (dpy, False); exit (0); } diff --git a/hacks/xscreensaver-text b/hacks/xscreensaver-text index 016a5527..a32ae41e 100755 --- a/hacks/xscreensaver-text +++ b/hacks/xscreensaver-text @@ -39,7 +39,7 @@ BEGIN { eval 'use Text::Wrap qw(wrap);' } my $progname = $0; $progname =~ s@.*/@@g; -my ($version) = ('$Revision: 1.66 $' =~ m/\s(\d[.\d]+)\s/s); +my ($version) = ('$Revision: 1.67 $' =~ m/\s(\d[.\d]+)\s/s); my $verbose = 0; my $http_proxy = undef; @@ -941,6 +941,10 @@ sub main() { # started writing "Unable to flush stdout: Bad file descriptor" to stderr # at exit. So if stdout is closed, open it as /dev/null instead. # + # And then 5.36 changed STDOUT to :utf8 by default. + # "syswrite() isn't allowed on :utf8 handles". + # + binmode (STDOUT, ':raw'); open (STDOUT, '>', '/dev/null') if (! defined (syswrite (STDOUT, ""))); # undef if fd closed; 0 if open. diff --git a/hacks/xspirograph.c b/hacks/xspirograph.c index a67d8b20..fb792418 100644 --- a/hacks/xspirograph.c +++ b/hacks/xspirograph.c @@ -58,9 +58,12 @@ init_tsg (struct state *st) XGetWindowAttributes (st->dpy, st->window, &st->xgwa); cmap = st->xgwa.colormap; + gcv.line_width = 1; + if (st->xgwa.width > 2560 || st->xgwa.height > 2560) + gcv.line_width = 3; /* Retina displays */ gcv.foreground = st->default_fg_pixel = get_pixel_resource (st->dpy, cmap, "foreground", "Foreground"); - st->draw_gc = XCreateGC (st->dpy, st->window, GCForeground, &gcv); + st->draw_gc = XCreateGC (st->dpy, st->window, GCForeground|GCLineWidth, &gcv); gcv.foreground = get_pixel_resource (st->dpy, cmap, "background", "Background"); } diff --git a/hacks/zoom.c b/hacks/zoom.c index 35ba2487..bc37323a 100644 --- a/hacks/zoom.c +++ b/hacks/zoom.c @@ -118,12 +118,18 @@ zoom_init (Display *dpy, Window window) st->lensoffsety = get_integer_resource(st->dpy, "lensoffsety", "Integer"); st->lensoffsety = MAX(0, MIN(st->pixwidth, st->lensoffsety)); + if (st->sizex > 2560 || st->sizey > 2560) /* Retina displays */ + { + int s = 3; + st->pixwidth *= s; + st->pixheight *= s; + st->pixspacex *= s; + st->pixspacey *= s; + } + gcv.function = GXcopy; - gcv.subwindow_mode = IncludeInferiors; gcflags = GCForeground|GCFunction; gcv.foreground = bg; - if (!st->lenses && use_subwindow_mode_p(xgwa.screen, st->window)) /* see grabscreen.c */ - gcflags |= GCSubwindowMode; st->window_gc = XCreateGC(st->dpy, st->window, gcflags, &gcv); @@ -137,11 +143,6 @@ zoom_init (Display *dpy, Window window) st->img_loader = load_image_async_simple (0, xgwa.screen, st->window, st->pm, 0, 0); - /* We might have needed this to grab the image, but if we leave this set - to GCSubwindowMode, then we'll *draw* right over subwindows too. */ - XSetSubwindowMode (st->dpy, st->window_gc, ClipByChildren); - - nblocksx = (int)ceil((double)st->sizex / (double)(st->pixwidth + st->pixspacex)); nblocksy = (int)ceil((double)st->sizey / (double)(st->pixheight + st->pixspacey)); if (st->lenses) @@ -251,22 +252,19 @@ zoom_free (Display *dpy, Window window, void *closure) static const char *zoom_defaults[] = { "*dontClearRoot: True", - ".foreground: white", - ".background: #111111", - ".lowrez: true", - "*fpsSolid: true", -#ifdef __sgi /* really, HAVE_READ_DISPLAY_EXTENSION */ - "*visualID: Best", -#endif - "*lenses: true", - "*delay: 10000", - "*duration: 120", - "*pixwidth: 40", - "*pixheight: 40", - "*pixspacex: 2", - "*pixspacey: 2", - "*lensoffsetx: 5", - "*lensoffsety: 5", + ".foreground: white", + ".background: #111111", +/* ".lowrez: true", */ + "*fpsSolid: true", + "*lenses: true", + "*delay: 10000", + "*duration: 120", + "*pixwidth: 40", + "*pixheight: 40", + "*pixspacex: 2", + "*pixspacey: 2", + "*lensoffsetx: 5", + "*lensoffsety: 5", #ifdef HAVE_MOBILE "*ignoreRotation: True", "*rotateImages: True", diff --git a/jwxyz/jwxyz-android.c b/jwxyz/jwxyz-android.c index 2539058a..ad7ec554 100644 --- a/jwxyz/jwxyz-android.c +++ b/jwxyz/jwxyz-android.c @@ -49,7 +49,7 @@ #include "jwzglesI.h" #include "jwxyz-android.h" #include "textclient.h" -#include "grabscreen.h" +#include "grabclient.h" #include "pow2.h" diff --git a/jwxyz/jwxyz-common.c b/jwxyz/jwxyz-common.c index 0b170f67..b54e06c6 100644 --- a/jwxyz/jwxyz-common.c +++ b/jwxyz/jwxyz-common.c @@ -1,4 +1,4 @@ -/* xscreensaver, Copyright (c) 1991-2020 Jamie Zawinski +/* xscreensaver, Copyright © 1991-2022 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 @@ -164,9 +164,15 @@ jwxyz_validate_pixel (Display *dpy, unsigned long pixel, unsigned int depth, if (depth == 1) Assert ((pixel == 0 || pixel == 1), "bogus mono pixel: 0x%08X", pixel); + +# if !defined __OPTIMIZE__ + // This test fails somewhat regularly with certain X11 hacks. This might + // indicate the use of uninitialized data, or an assumption that BlackPixel + // is 0, but either way, crashing here is not super helpful. else if (!alpha_allowed_p) Assert (((pixel & BlackPixel(dpy,0)) == BlackPixel(dpy,0)), "bogus color pixel: 0x%08X", pixel); +# endif } @@ -1853,11 +1859,4 @@ screen_number (Screen *screen) return 0; } -// declared in utils/grabclient.h -Bool -use_subwindow_mode_p (Screen *screen, Window window) -{ - return False; -} - #endif /* HAVE_JWXYZ */ diff --git a/jwxyz/jwxyz.m b/jwxyz/jwxyz.m index 3d957a07..63f55693 100644 --- a/jwxyz/jwxyz.m +++ b/jwxyz/jwxyz.m @@ -891,8 +891,8 @@ fill_rects (Display *dpy, Drawable d, GC gc, int x = rectangles[i].x; int y = rectangles[i].y; - unsigned long width = rectangles[i].width; - unsigned long height = rectangles[i].height; + long width = rectangles[i].width; /* Might go negative */ + long height = rectangles[i].height; if (fast_fill_p) { long // negative_int > unsigned_int == 1 diff --git a/po/POTFILES.in b/po/POTFILES.in index 0cf9d1bb..2a36d367 100644 --- a/po/POTFILES.in +++ b/po/POTFILES.in @@ -1,11 +1,12 @@ -# Auto-generated: Sun May 29 13:46:24 PDT 2022 +# Auto-generated: Sun Nov 6 15:58:13 JST 2022 driver/demo-Gtk-conf.c driver/demo-Gtk.c +driver/demo.ui driver/dialog.c +driver/prefs.ui driver/subprocs.c driver/xscreensaver-settings.desktop.in driver/xscreensaver.desktop.in -driver/xscreensaver.ui hacks/config/abstractile.xml hacks/config/anemone.xml hacks/config/anemotaxis.xml diff --git a/po/be.po b/po/be.po index 101aff51..4a1ef197 100644 --- a/po/be.po +++ b/po/be.po @@ -5,5275 +5,11062 @@ msgid "" msgstr "" "Project-Id-Version: xscreensaver 2.0\n" -"POT-Creation-Date: 2002-06-18 21:56+0200\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2022-11-06 15:58+0900\n" "PO-Revision-Date: 2002-11-20 10:38+0200\n" "Last-Translator: Ales Nyakhaychyk \n" "Language-Team: Belarusian \n" +"Language: be\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: KBabel 0.9.6\n" -#: driver/demo-Gtk-conf.c:729 +#: ../driver/demo-Gtk-conf.c:931 msgid "Browse..." msgstr "Агляд..." -#: driver/demo-Gtk-conf.c:1021 +#: ../driver/demo-Gtk-conf.c:1117 msgid "Select file." msgstr "Абраць файл." -#: driver/demo-Gtk-support.c:121 +#: ../driver/demo-Gtk.c:579 ../driver/demo-Gtk.c:586 +msgid "_OK" +msgstr "" + +#: ../driver/demo-Gtk.c:583 +msgid "Launch" +msgstr "" + +#: ../driver/demo-Gtk.c:584 ../driver/demo-Gtk.c:585 +msgid "Kill" +msgstr "" + +#: ../driver/demo-Gtk.c:588 ../driver/demo-Gtk.c:1727 ../driver/demo-Gtk.c:1960 +msgid "_Cancel" +msgstr "" + +#: ../driver/demo-Gtk.c:653 ../driver/demo-Gtk.c:693 +msgid "Unknown error!" +msgstr "" + +#: ../driver/demo-Gtk.c:654 ../driver/demo-Gtk.c:694 ../driver/demo-Gtk.c:762 +#: ../driver/demo-Gtk.c:888 ../driver/demo-Gtk.c:918 ../driver/demo-Gtk.c:924 +#: ../driver/demo-Gtk.c:1125 ../driver/demo-Gtk.c:2008 +#: ../driver/demo-Gtk.c:2015 ../driver/demo-Gtk.c:4113 +msgid "Error" +msgstr "" + +#: ../driver/demo-Gtk.c:705 ../driver/demo-Gtk.c:3900 +#, c-format +msgid "" +"The XScreenSaver daemon doesn't seem to be running\n" +"on display \"%.25s\". Launch it now?" +msgstr "" + +#: ../driver/demo-Gtk.c:708 ../driver/demo-Gtk.c:1673 ../driver/demo-Gtk.c:1900 +#: ../driver/demo-Gtk.c:2984 ../driver/demo-Gtk.c:3967 +#: ../driver/demo-Gtk.c:3989 ../driver/demo-Gtk.c:3993 +#: ../driver/demo-Gtk.c:4001 +msgid "Warning" +msgstr "" + +#: ../driver/demo-Gtk.c:763 +msgid "No Help URL has been specified.\n" +msgstr "" + +#: ../driver/demo-Gtk.c:877 +msgid "" +"The xscreensaver daemon did not start up properly.\n" +"\n" +msgstr "" + +#: ../driver/demo-Gtk.c:882 +msgid "" +"You are running as root. Don't do that. Instead, you should\n" +"log in as a normal user and use `sudo' as necessary." +msgstr "" + +#: ../driver/demo-Gtk.c:886 +msgid "Please check your $PATH and permissions." +msgstr "" + +#: ../driver/demo-Gtk.c:919 +msgid "Couldn't determine init file name!\n" +msgstr "" + +#: ../driver/demo-Gtk.c:923 +#, c-format +msgid "Couldn't write %s\n" +msgstr "" + +#: ../driver/demo-Gtk.c:1123 +#, c-format +msgid "Unparsable time format: \"%.100s\"\n" +msgstr "" + +#: ../driver/demo-Gtk.c:1655 +msgid "Image directory is unset" +msgstr "" + +#: ../driver/demo-Gtk.c:1660 +msgid "Image directory does not exist" +msgstr "" + +#: ../driver/demo-Gtk.c:1662 +msgid "Image directory is empty" +msgstr "" + +#: ../driver/demo-Gtk.c:1667 +#, c-format +msgid "" +"%.100s:\n" +"\n" +" %.100s\n" +"\n" +"Select the 'Advanced' tab and choose a directory with some\n" +"pictures in it, or you're going to see a lot of boring colorbars!" +msgstr "" + +#: ../driver/demo-Gtk.c:1724 +#, fuzzy +msgid "XScreenSaver Image Cache" +msgstr "XScreenSaver" + +#: ../driver/demo-Gtk.c:1730 +#, c-format +msgid "Populating image cache for \"%.100s\"..." +msgstr "" + +#: ../driver/demo-Gtk.c:1961 +#, fuzzy +msgid "_Select" +msgstr "Абраць файл." + +#: ../driver/demo-Gtk.c:2007 +#, c-format +msgid "Directory does not exist: \"%.100s\"\n" +msgstr "" + +#: ../driver/demo-Gtk.c:2014 +#, c-format +msgid "File does not exist: \"%.100s\"\n" +msgstr "" + +#: ../driver/demo-Gtk.c:2050 +msgid "Please select the image directory." +msgstr "" + +#: ../driver/demo-Gtk.c:2080 +msgid "Please select a text file." +msgstr "" + +#: ../driver/demo-Gtk.c:2098 +msgid "Please select a text-generating program." +msgstr "" + +#: ../driver/demo-Gtk.c:2274 +msgid "Use" +msgstr "Выкарыстаць" + +#: ../driver/demo-Gtk.c:2284 +msgid "Screen Saver" +msgstr "Зьберагальнік экрану" + +#: ../driver/demo-Gtk.c:2582 +msgid "Display Power Management (not supported by this display)" +msgstr "" + +#: ../driver/demo-Gtk.c:2784 +msgid "Blank Screen" +msgstr "" + +#: ../driver/demo-Gtk.c:2790 +msgid "Screen Saver Disabled" +msgstr "" + +#: ../driver/demo-Gtk.c:2813 ../driver/demo.ui.h:30 +msgid "Preview" +msgstr "Прагляд" + +#: ../driver/demo-Gtk.c:2826 +#, c-format +msgid "%s: %.100s Settings" +msgstr "" + +#: ../driver/demo-Gtk.c:2839 ../driver/prefs.ui.h:9 +msgid "Any" +msgstr "" + +#: ../driver/demo-Gtk.c:2983 +#, c-format +msgid "file \"%s\" has changed, reloading.\n" +msgstr "" + +#: ../driver/demo-Gtk.c:3909 +#, c-format +msgid "" +"%s is running as user \"%s\" on host \"%s\".\n" +"But the xscreensaver managing display \"%.25s\"\n" +"is running as user \"%s\" on host \"%s\".\n" +"\n" +"Since they are different users, they won't be reading/writing\n" +"the same ~/.xscreensaver file, so %s isn't\n" +"going to work right.\n" +"\n" +"You should either re-run %s as \"%s\", or re-run\n" +"xscreensaver as \"%s\".\n" +"\n" +"Restart the xscreensaver daemon now?\n" +msgstr "" + +#: ../driver/demo-Gtk.c:3933 +#, c-format +msgid "" +"%s is running as user \"%s\" on host \"%s\".\n" +"But the xscreensaver managing display \"%s\"\n" +"is running as user \"%s\" on host \"%s\".\n" +"\n" +"If those two machines don't share a file system (that is,\n" +"if they don't see the same ~%s/.xscreensaver file) then\n" +"%s won't work right.\n" +"\n" +"Restart the daemon on \"%s\" as \"%s\" now?\n" +msgstr "" + +#: ../driver/demo-Gtk.c:3954 +#, c-format +msgid "" +"This is %s version %s.\n" +"But the xscreensaver managing display \"%s\"\n" +"is version %s. This could cause problems.\n" +"\n" +"Restart the xscreensaver daemon now?\n" +msgstr "" + +#: ../driver/demo-Gtk.c:3984 #, c-format -msgid "Couldn't find pixmap file: %s" -msgstr "Немагчыма знайсьці pixmap-файл: %s" +msgid "" +"The GNOME screen saver daemon (%s) appears to be running.\n" +"It must be stopped for XScreenSaver to work properly.\n" +"\n" +"Stop the \"%s\" daemon now?\n" +msgstr "" + +#: ../driver/demo-Gtk.c:3994 +msgid "" +"The KDE screen saver daemon appears to be running.\n" +"It must be stopped for XScreenSaver to work properly.\n" +"\n" +"Stop the KDE screen saver daemon now?\n" +msgstr "" + +#: ../driver/demo-Gtk.c:4002 +msgid "" +"You are running Wayland rather than the X Window System.\n" +"\n" +"Under Wayland, idle-detection fails when non-X11 programs\n" +"are selected, meaning the screen may blank prematurely.\n" +"Also, locking is impossible.\n" +"\n" +"See the XScreenSaver manual for instructions on\n" +"configuring your system to use X11 instead of Wayland.\n" +msgstr "" + +#: ../driver/demo-Gtk.c:4114 +msgid "no `manualCommand' resource set." +msgstr "" + +#: ../driver/demo-Gtk.c:4357 ../driver/demo-Gtk.c:4391 +msgid "No description available." +msgstr "" + +#: ../driver/demo.ui.h:1 ../driver/prefs.ui.h:1 +#: ../driver/xscreensaver-settings.desktop.in.h:1 +#, fuzzy +msgid "XScreenSaver Settings" +msgstr "XScreenSaver" + +#: ../driver/demo.ui.h:2 +msgid "Disable Screen Saver" +msgstr "Выключыць зьберагальнік экрану" + +#: ../driver/demo.ui.h:3 +msgid "Blank Screen Only" +msgstr "Толькі чорны экран" + +#: ../driver/demo.ui.h:4 +msgid "Only One Screen Saver" +msgstr "Толькі адзін зьберагальнік экрану" + +#: ../driver/demo.ui.h:5 +msgid "Random Screen Saver" +msgstr "Выпадковы зьберагальнік экрану" + +#: ../driver/demo.ui.h:6 +#, fuzzy +msgid "Same Random Savers" +msgstr "Выпадковы зьберагальнік экрану" + +#: ../driver/demo.ui.h:7 ../driver/prefs.ui.h:11 +msgid "Default" +msgstr "" + +#: ../driver/demo.ui.h:8 +msgid "_Blank Screen Now" +msgstr "Спусташыць экран" + +#: ../driver/demo.ui.h:9 +msgid "_Lock Screen Now" +msgstr "Зачыніць экран" + +#: ../driver/demo.ui.h:10 +msgid "_Kill Daemon" +msgstr "Забіць дэмана" + +#: ../driver/demo.ui.h:11 +msgid "_Restart Daemon" +msgstr "Перазапусьціць дэмана" + +#: ../driver/demo.ui.h:12 +msgid "Documentation..." +msgstr "" + +#: ../driver/demo.ui.h:13 +msgid "_Cycle After" +msgstr "" + +#: ../driver/demo.ui.h:14 +msgid "Whether a password should be required to un-blank the screen." +msgstr "Ці запытваць пароль каб адмяніць спусташэньне экрану." + +#: ../driver/demo.ui.h:15 +#, fuzzy +msgid "_Lock Screen After " +msgstr "Замкнуць экран праз" + +#: ../driver/demo.ui.h:16 +#, fuzzy +msgid "Lock Screen" +msgstr "Зачыніць экран" + +#: ../driver/demo.ui.h:17 +#, fuzzy +msgid "How long before the screen saver activates." +msgstr "Як доўга экран будзе поўнасьцю чарнець." + +#: ../driver/demo.ui.h:18 +msgid "How long after the screen blanks until a password will be required." +msgstr "" + +#: ../driver/demo.ui.h:19 +msgid "Lock Screen After" +msgstr "Замкнуць экран праз" + +#: ../driver/demo.ui.h:20 +msgid "" +"How long each display mode should run before choosing a new one (in Random " +"mode.)" +msgstr "" + +#: ../driver/demo.ui.h:21 +msgid "minutes" +msgstr "хвіліны" + +#: ../driver/demo.ui.h:22 +msgid "_Blank After" +msgstr "" + +#: ../driver/demo.ui.h:23 +msgid "" +"Demo the selected screen saver in full-screen mode (click the mouse to " +"return.)" +msgstr "" +"Паказ абранага зьберагальніку экрану ў поўнаэкранным рэжыме (націсьніце " +"кнопку мышы, каб спыніць паказ.)" + +#: ../driver/demo.ui.h:24 +msgid "_Preview" +msgstr "" + +#: ../driver/demo.ui.h:25 +msgid "Customization and explanation of the selected screen saver." +msgstr "Наладка абранага зьберагальніку экрану." + +#: ../driver/demo.ui.h:26 +msgid "_Settings..." +msgstr "" + +#: ../driver/demo.ui.h:27 +msgid "_Mode:" +msgstr "" + +#: ../driver/demo.ui.h:28 +msgid "" +"Run the next screen saver in the list in full-screen mode (click the mouse " +"to return.)" +msgstr "" +"Запускае наступны зьберагальнік экрану ў поўнаэкранным рэжыме (націсьніце " +"кнопку мышы, каб спыніць паказ.)" + +#: ../driver/demo.ui.h:29 +msgid "" +"Run the previous screen saver in the list in full-screen mode (click the " +"mouse to return.)" +msgstr "" +"Запускае папярэдні зьберагальнік экрану ў поўнаэкранным рэжыме (націсьніце " +"кнопку мышы, каб спыніць паказ.)" + +#: ../driver/demo.ui.h:31 +msgid "" +"No Preview\n" +"Available" +msgstr "" + +#: ../driver/demo.ui.h:33 +msgid "No Preview" +msgstr "" + +#: ../driver/demo.ui.h:34 +msgid "" +"Not\n" +"Installed" +msgstr "" + +#: ../driver/demo.ui.h:36 +msgid "Not Installed" +msgstr "" + +#: ../driver/demo.ui.h:37 +msgid "" +"Very few (or no) screen savers appear to be available.\n" +"\n" +"This probably means that the \"xscreensaver-extras\" and\n" +"\"xscreensaver-gl-extras\" packages are not installed." +msgstr "" + +#: ../driver/demo.ui.h:41 +msgid "Nothing Installed" +msgstr "" + +#: ../driver/demo.ui.h:42 +msgid "" +"No Previews Available\n" +"Under Wayland." +msgstr "" + +#: ../driver/demo.ui.h:44 +msgid "No Previews Under Wayland" +msgstr "" + +#: ../driver/demo.ui.h:45 +msgid "Description" +msgstr "Апісаньне" + +#: ../driver/demo.ui.h:46 +msgid "_Display Modes" +msgstr "" + +#: ../driver/demo.ui.h:47 +msgid "" +"Whether the image-manipulating modes should be allowed to operate on an " +"image of your desktop." +msgstr "" + +#: ../driver/demo.ui.h:48 +msgid "Grab Desktop _Images" +msgstr "" + +#: ../driver/demo.ui.h:49 +msgid "" +"Whether the image-manipulating modes should operate on images captured from " +"the system's video input (if there is one.)" +msgstr "" + +#: ../driver/demo.ui.h:50 +msgid "Grab _Video Frames" +msgstr "" + +#: ../driver/demo.ui.h:51 +msgid "Whether the image-manipulating modes should load image files." +msgstr "" + +#: ../driver/demo.ui.h:52 +msgid "Choose _Random Image:" +msgstr "" + +#: ../driver/demo.ui.h:53 +msgid "" +"The local directory, RSS feed or Atom feed from which images will be " +"randomly chosen." +msgstr "" + +#: ../driver/demo.ui.h:54 +msgid "_Browse" +msgstr "" + +#: ../driver/demo.ui.h:55 +msgid "Local directory, or URL of RSS or Atom feed." +msgstr "" + +#: ../driver/demo.ui.h:56 +msgid "Image Manipulation" +msgstr "" + +#: ../driver/demo.ui.h:57 +msgid "Text-displaying modes will display the text typed here." +msgstr "" + +#: ../driver/demo.ui.h:58 +msgid "_Text" +msgstr "" + +#: ../driver/demo.ui.h:59 +msgid "Text-displaying modes will display the contents of this file." +msgstr "" + +#: ../driver/demo.ui.h:60 +#, fuzzy +msgid "Text _file" +msgstr "Абраць файл." + +#: ../driver/demo.ui.h:61 +msgid "Text-displaying modes will display the output of this program." +msgstr "" + +#: ../driver/demo.ui.h:62 +msgid "_Program" +msgstr "" + +#: ../driver/demo.ui.h:63 +msgid "" +"Text-displaying modes will display the contents of this URL (HTML or RSS)." +msgstr "" + +#: ../driver/demo.ui.h:64 +msgid "_URL" +msgstr "" + +#: ../driver/demo.ui.h:65 +msgid "Text-displaying modes will display the local host name, date, and time." +msgstr "" + +#: ../driver/demo.ui.h:66 +msgid "_Host Name and Time" +msgstr "" + +#: ../driver/demo.ui.h:67 +msgid "Text Manipulation" +msgstr "" + +#: ../driver/demo.ui.h:68 +msgid "Whether the monitor should be powered down after a while." +msgstr "" + +#: ../driver/demo.ui.h:69 +msgid "_Power Management Enabled" +msgstr "" + +#: ../driver/demo.ui.h:70 +msgid "Stand_by After" +msgstr "" + +#: ../driver/demo.ui.h:71 +msgid "Sus_pend After" +msgstr "" + +#: ../driver/demo.ui.h:72 +msgid "_Off After" +msgstr "" + +#: ../driver/demo.ui.h:73 +msgid "How long until the monitor powers down." +msgstr "" + +#: ../driver/demo.ui.h:74 +msgid "How long until the monitor goes into power-saving mode." +msgstr "" + +#: ../driver/demo.ui.h:75 +#, fuzzy +msgid "How long until the monitor goes completely black." +msgstr "Як доўга экран будзе поўнасьцю чарнець." + +#: ../driver/demo.ui.h:76 +msgid "" +"Whether the monitor should be powered off immediately in \"Blank Screen " +"Only\" mode, regardless of the above power-management timeouts." +msgstr "" + +#: ../driver/demo.ui.h:77 +msgid "_Quick Power-off in Blank Only Mode" +msgstr "" + +#: ../driver/demo.ui.h:78 +msgid "Display Power Management" +msgstr "" + +#: ../driver/demo.ui.h:79 +msgid "" +"Whether the screen should slowly fade to black when the screen saver " +"activates." +msgstr "" +"Ці павінен экран пакрыху зьнікаць, калі зьберагальнік экрану задзейнічан." + +#: ../driver/demo.ui.h:80 +msgid "Fade to Black when _Blanking" +msgstr "" + +#: ../driver/demo.ui.h:81 +msgid "" +"Whether the screen should slowly fade in from black when the screen saver " +"deactivates." +msgstr "Ці павінен экран пакрыху зьяўляцца, калі зьберагальнік экрану спынен." + +#: ../driver/demo.ui.h:82 +msgid "Fade from Black When _Unblanking" +msgstr "" + +#: ../driver/demo.ui.h:83 +msgid "F_ade Duration" +msgstr "" + +#: ../driver/demo.ui.h:84 +msgid "How long it should take for the screen to fade in and out." +msgstr "" + +#: ../driver/demo.ui.h:85 +msgid "seconds" +msgstr "сэкундаў" + +#: ../driver/demo.ui.h:86 +msgid "_Theme:" +msgstr "" + +#: ../driver/demo.ui.h:87 +msgid "The color scheme to use on the unlock dialog." +msgstr "" + +#: ../driver/demo.ui.h:88 +msgid "Show the what the unlock dialog will look like." +msgstr "" + +#: ../driver/demo.ui.h:89 +msgid "Blanking" +msgstr "" + +#: ../driver/demo.ui.h:90 +msgid "_Advanced" +msgstr "" + +#: ../driver/dialog.c:1058 +#, c-format +msgid "" +"Copyright © 1991-%.4s by\n" +"Jamie Zawinski " +msgstr "" + +#: ../driver/dialog.c:1379 +msgid "" +"Update available!\n" +"This version is very old.\n" +msgstr "" + +#: ../driver/dialog.c:1391 +msgid "PRE-RELEASE VERSION" +msgstr "" + +#: ../driver/dialog.c:1428 +msgid "" +"DEBUG MODE:\n" +"All keystrokes are being logged to stderr.\n" +msgstr "" + +#: ../driver/dialog.c:1477 +msgid "Username:" +msgstr "" + +#: ../driver/dialog.c:1508 +msgid "Checking..." +msgstr "" + +#: ../driver/dialog.c:1588 ../driver/prefs.ui.h:23 +msgid "Settings" +msgstr "" + +#: ../driver/dialog.c:1603 +#, fuzzy +msgid "Help" +msgstr "_Даведка" + +#: ../driver/dialog.c:1617 +msgid "New Login" +msgstr "" + +#: ../driver/dialog.c:1629 +msgid "OK" +msgstr "" + +#: ../driver/dialog.c:2599 +msgid "Password initialization failed" +msgstr "" + +#: ../driver/dialog.c:2601 +msgid "Authentication failed (Caps Lock?)" +msgstr "" + +#: ../driver/dialog.c:2603 +msgid "Authentication failed!" +msgstr "" + +#: ../driver/dialog.c:2623 +#, c-format +msgid "%d days ago" +msgstr "" + +#: ../driver/dialog.c:2624 +#, c-format +msgid "%d hours ago" +msgstr "" + +#: ../driver/dialog.c:2625 +#, fuzzy, c-format +msgid "%d minutes ago" +msgstr "хвіліны" + +#: ../driver/dialog.c:2626 +#, c-format +msgid "just now" +msgstr "" + +#: ../driver/dialog.c:2629 +#, c-format +msgid "There has been 1 failed login attempt, %s." +msgstr "" + +#: ../driver/dialog.c:2632 +#, c-format +msgid "There have been %d failed login attempts, oldest %s." +msgstr "" + +#: ../driver/prefs.ui.h:2 +msgid "_Advanced >>" +msgstr "" + +#: ../driver/prefs.ui.h:3 +msgid "_Standard <<" +msgstr "" + +#: ../driver/prefs.ui.h:4 +msgid "_Reset to Defaults" +msgstr "" + +#: ../driver/prefs.ui.h:5 +msgid "Save" +msgstr "" + +#: ../driver/prefs.ui.h:6 +msgid "Standard" +msgstr "" + +#: ../driver/prefs.ui.h:7 +msgid "_Command Line:" +msgstr "" + +#: ../driver/prefs.ui.h:8 +msgid "_Visual:" +msgstr "" + +#: ../driver/prefs.ui.h:10 +msgid "Best" +msgstr "" + +#: ../driver/prefs.ui.h:12 +msgid "Default-N" +msgstr "" + +#: ../driver/prefs.ui.h:13 +msgid "GL" +msgstr "" + +#: ../driver/prefs.ui.h:14 +msgid "TrueColor" +msgstr "" + +#: ../driver/prefs.ui.h:15 +msgid "PseudoColor" +msgstr "" + +#: ../driver/prefs.ui.h:16 +msgid "StaticGray" +msgstr "" + +#: ../driver/prefs.ui.h:17 +msgid "GrayScale" +msgstr "" + +#: ../driver/prefs.ui.h:18 +msgid "DirectColor" +msgstr "" + +#: ../driver/prefs.ui.h:19 +msgid "Color" +msgstr "" + +#: ../driver/prefs.ui.h:20 +msgid "Gray" +msgstr "" + +#: ../driver/prefs.ui.h:21 ../hacks/config/razzledazzle.xml.h:8 +#: ../hacks/config/scooter.xml.h:14 +msgid "Mono" +msgstr "" + +#: ../driver/prefs.ui.h:22 +msgid "Advanced" +msgstr "" + +#: ../driver/prefs.ui.h:24 +msgid "_Documentation..." +msgstr "Дакумэнтацыя..." + +#: ../driver/subprocs.c:583 +#, c-format +msgid "crashed with status %d" +msgstr "" + +#. Expected notification after we killed it. +#: ../driver/subprocs.c:600 +#, c-format +msgid "exited normally with %.100s" +msgstr "" + +#. Unexpected signal. +#: ../driver/subprocs.c:609 +#, c-format +msgid "crashed with %.100s" +msgstr "" + +#. Didn't exit, signal or stop; is this even possible? +#: ../driver/subprocs.c:630 +#, c-format +msgid "crashed mysteriously" +msgstr "" + +#: ../driver/xscreensaver-settings.desktop.in.h:2 +msgid "Change screensaver properties" +msgstr "" + +#: ../driver/xscreensaver.desktop.in.h:1 +msgid "XScreenSaver" +msgstr "XScreenSaver" + +#: ../driver/xscreensaver.desktop.in.h:2 +msgid "XScreenSaver daemon: screen saver and locker" +msgstr "" + +#: ../hacks/config/abstractile.xml.h:1 +msgid "Abstractile" +msgstr "" + +#: ../hacks/config/abstractile.xml.h:2 ../hacks/config/anemone.xml.h:2 +#: ../hacks/config/apollonian.xml.h:10 ../hacks/config/atlantis.xml.h:5 +#: ../hacks/config/attraction.xml.h:24 ../hacks/config/blitspin.xml.h:2 +#: ../hacks/config/boing.xml.h:5 ../hacks/config/bouncingcow.xml.h:5 +#: ../hacks/config/boxed.xml.h:5 ../hacks/config/carousel.xml.h:5 +#: ../hacks/config/ccurve.xml.h:5 ../hacks/config/chompytower.xml.h:5 +#: ../hacks/config/circuit.xml.h:8 ../hacks/config/cityflow.xml.h:9 +#: ../hacks/config/companioncube.xml.h:5 ../hacks/config/covid19.xml.h:5 +#: ../hacks/config/crumbler.xml.h:5 ../hacks/config/cube21.xml.h:8 +#: ../hacks/config/cubenetic.xml.h:17 ../hacks/config/cubestack.xml.h:5 +#: ../hacks/config/cubestorm.xml.h:5 ../hacks/config/cubetwist.xml.h:5 +#: ../hacks/config/cubicgrid.xml.h:5 ../hacks/config/dangerball.xml.h:5 +#: ../hacks/config/deepstars.xml.h:5 ../hacks/config/discoball.xml.h:5 +#: ../hacks/config/dymaxionmap.xml.h:5 ../hacks/config/energystream.xml.h:2 +#: ../hacks/config/eruption.xml.h:10 ../hacks/config/esper.xml.h:5 +#: ../hacks/config/fliptext.xml.h:5 ../hacks/config/flyingtoasters.xml.h:5 +#: ../hacks/config/fontglide.xml.h:5 ../hacks/config/fuzzyflakes.xml.h:5 +#: ../hacks/config/gears.xml.h:5 ../hacks/config/geodesic.xml.h:14 +#: ../hacks/config/gflux.xml.h:5 ../hacks/config/gibson.xml.h:5 +#: ../hacks/config/glcells.xml.h:25 ../hacks/config/glknots.xml.h:5 +#: ../hacks/config/glmatrix.xml.h:8 ../hacks/config/glsnake.xml.h:11 +#: ../hacks/config/goop.xml.h:5 ../hacks/config/gravitywell.xml.h:5 +#: ../hacks/config/handsy.xml.h:5 ../hacks/config/headroom.xml.h:5 +#: ../hacks/config/hexadrop.xml.h:5 ../hacks/config/hexstrut.xml.h:5 +#: ../hacks/config/hilbert.xml.h:8 ../hacks/config/hydrostat.xml.h:5 +#: ../hacks/config/hyperball.xml.h:9 ../hacks/config/hypercube.xml.h:9 +#: ../hacks/config/hypnowheel.xml.h:2 ../hacks/config/interference.xml.h:5 +#: ../hacks/config/jigglypuff.xml.h:14 ../hacks/config/jigsaw.xml.h:5 +#: ../hacks/config/juggle.xml.h:5 ../hacks/config/juggler3d.xml.h:5 +#: ../hacks/config/kaleidocycle.xml.h:8 ../hacks/config/mapscroller.xml.h:5 +#: ../hacks/config/maze3d.xml.h:2 ../hacks/config/moebiusgears.xml.h:5 +#: ../hacks/config/nakagin.xml.h:5 ../hacks/config/peepers.xml.h:5 +#: ../hacks/config/penetrate.xml.h:2 ../hacks/config/petri.xml.h:16 +#: ../hacks/config/phosphor.xml.h:6 ../hacks/config/photopile.xml.h:12 +#: ../hacks/config/piecewise.xml.h:8 ../hacks/config/pinion.xml.h:5 +#: ../hacks/config/polyhedra.xml.h:5 ../hacks/config/pong.xml.h:2 +#: ../hacks/config/pyro.xml.h:2 ../hacks/config/quasicrystal.xml.h:5 +#: ../hacks/config/raverhoop.xml.h:11 ../hacks/config/razzledazzle.xml.h:5 +#: ../hacks/config/rocks.xml.h:8 ../hacks/config/rubik.xml.h:6 +#: ../hacks/config/rubikblocks.xml.h:8 ../hacks/config/skytentacles.xml.h:15 +#: ../hacks/config/slidescreen.xml.h:11 ../hacks/config/sonar.xml.h:5 +#: ../hacks/config/speedmine.xml.h:5 ../hacks/config/splitflap.xml.h:5 +#: ../hacks/config/squirtorus.xml.h:5 ../hacks/config/superquadrics.xml.h:5 +#: ../hacks/config/tangram.xml.h:8 ../hacks/config/topblock.xml.h:5 +#: ../hacks/config/tronbit.xml.h:5 ../hacks/config/twang.xml.h:8 +#: ../hacks/config/unicrud.xml.h:5 ../hacks/config/unknownpleasures.xml.h:8 +#: ../hacks/config/vigilance.xml.h:5 ../hacks/config/voronoi.xml.h:2 +#: ../hacks/config/winduprobot.xml.h:5 ../hacks/config/wormhole.xml.h:5 +#: ../hacks/config/xjack.xml.h:2 +msgid "Slow" +msgstr "" + +#: ../hacks/config/abstractile.xml.h:3 ../hacks/config/anemone.xml.h:3 +#: ../hacks/config/apollonian.xml.h:11 ../hacks/config/attraction.xml.h:25 +#: ../hacks/config/boing.xml.h:6 ../hacks/config/boxed.xml.h:6 +#: ../hacks/config/covid19.xml.h:6 ../hacks/config/crumbler.xml.h:6 +#: ../hacks/config/cubestorm.xml.h:6 ../hacks/config/cubicgrid.xml.h:6 +#: ../hacks/config/deepstars.xml.h:6 ../hacks/config/discoball.xml.h:6 +#: ../hacks/config/energystream.xml.h:3 ../hacks/config/esper.xml.h:6 +#: ../hacks/config/fliptext.xml.h:6 ../hacks/config/fontglide.xml.h:6 +#: ../hacks/config/fuzzyflakes.xml.h:6 ../hacks/config/gears.xml.h:6 +#: ../hacks/config/glknots.xml.h:6 ../hacks/config/goop.xml.h:6 +#: ../hacks/config/gravitywell.xml.h:6 ../hacks/config/handsy.xml.h:6 +#: ../hacks/config/hexadrop.xml.h:6 ../hacks/config/hexstrut.xml.h:6 +#: ../hacks/config/hilbert.xml.h:11 ../hacks/config/hypnowheel.xml.h:5 +#: ../hacks/config/jigsaw.xml.h:6 ../hacks/config/juggle.xml.h:6 +#: ../hacks/config/juggler3d.xml.h:6 ../hacks/config/kaleidocycle.xml.h:9 +#: ../hacks/config/maze3d.xml.h:3 ../hacks/config/moebiusgears.xml.h:6 +#: ../hacks/config/peepers.xml.h:6 ../hacks/config/polyhedra.xml.h:6 +#: ../hacks/config/quasicrystal.xml.h:6 ../hacks/config/razzledazzle.xml.h:6 +#: ../hacks/config/skytentacles.xml.h:18 ../hacks/config/sonar.xml.h:6 +#: ../hacks/config/splitflap.xml.h:6 ../hacks/config/tessellimage.xml.h:6 +#: ../hacks/config/unknownpleasures.xml.h:9 ../hacks/config/vigilance.xml.h:6 +#: ../hacks/config/xjack.xml.h:3 +msgid "Speed" +msgstr "" + +#: ../hacks/config/abstractile.xml.h:4 ../hacks/config/anemone.xml.h:4 +#: ../hacks/config/apollonian.xml.h:12 ../hacks/config/atlantis.xml.h:7 +#: ../hacks/config/attraction.xml.h:26 ../hacks/config/blitspin.xml.h:4 +#: ../hacks/config/boing.xml.h:7 ../hacks/config/bouncingcow.xml.h:7 +#: ../hacks/config/boxed.xml.h:7 ../hacks/config/carousel.xml.h:7 +#: ../hacks/config/ccurve.xml.h:7 ../hacks/config/chompytower.xml.h:7 +#: ../hacks/config/circuit.xml.h:10 ../hacks/config/cityflow.xml.h:11 +#: ../hacks/config/companioncube.xml.h:7 ../hacks/config/covid19.xml.h:7 +#: ../hacks/config/crumbler.xml.h:7 ../hacks/config/cube21.xml.h:10 +#: ../hacks/config/cubenetic.xml.h:19 ../hacks/config/cubestack.xml.h:7 +#: ../hacks/config/cubestorm.xml.h:7 ../hacks/config/cubetwist.xml.h:7 +#: ../hacks/config/cubicgrid.xml.h:7 ../hacks/config/dangerball.xml.h:7 +#: ../hacks/config/deepstars.xml.h:7 ../hacks/config/discoball.xml.h:7 +#: ../hacks/config/dymaxionmap.xml.h:7 ../hacks/config/energystream.xml.h:4 +#: ../hacks/config/eruption.xml.h:12 ../hacks/config/esper.xml.h:7 +#: ../hacks/config/fliptext.xml.h:7 ../hacks/config/flyingtoasters.xml.h:7 +#: ../hacks/config/fontglide.xml.h:7 ../hacks/config/fuzzyflakes.xml.h:7 +#: ../hacks/config/gears.xml.h:7 ../hacks/config/geodesic.xml.h:16 +#: ../hacks/config/gflux.xml.h:7 ../hacks/config/gibson.xml.h:7 +#: ../hacks/config/glknots.xml.h:7 ../hacks/config/glmatrix.xml.h:10 +#: ../hacks/config/glsnake.xml.h:13 ../hacks/config/goop.xml.h:7 +#: ../hacks/config/gravitywell.xml.h:7 ../hacks/config/handsy.xml.h:7 +#: ../hacks/config/headroom.xml.h:7 ../hacks/config/hexadrop.xml.h:7 +#: ../hacks/config/hexstrut.xml.h:7 ../hacks/config/hilbert.xml.h:10 +#: ../hacks/config/hydrostat.xml.h:7 ../hacks/config/hyperball.xml.h:11 +#: ../hacks/config/hypercube.xml.h:11 ../hacks/config/hypnowheel.xml.h:4 +#: ../hacks/config/interference.xml.h:7 ../hacks/config/jigglypuff.xml.h:16 +#: ../hacks/config/jigsaw.xml.h:7 ../hacks/config/juggle.xml.h:7 +#: ../hacks/config/juggler3d.xml.h:7 ../hacks/config/kaleidocycle.xml.h:10 +#: ../hacks/config/mapscroller.xml.h:7 ../hacks/config/maze3d.xml.h:4 +#: ../hacks/config/moebiusgears.xml.h:7 ../hacks/config/nakagin.xml.h:7 +#: ../hacks/config/peepers.xml.h:7 ../hacks/config/penetrate.xml.h:4 +#: ../hacks/config/petri.xml.h:18 ../hacks/config/phosphor.xml.h:8 +#: ../hacks/config/photopile.xml.h:14 ../hacks/config/piecewise.xml.h:10 +#: ../hacks/config/pinion.xml.h:7 ../hacks/config/polyhedra.xml.h:7 +#: ../hacks/config/pong.xml.h:4 ../hacks/config/pyro.xml.h:4 +#: ../hacks/config/quasicrystal.xml.h:7 ../hacks/config/raverhoop.xml.h:13 +#: ../hacks/config/razzledazzle.xml.h:7 ../hacks/config/rocks.xml.h:10 +#: ../hacks/config/rubik.xml.h:8 ../hacks/config/rubikblocks.xml.h:10 +#: ../hacks/config/skytentacles.xml.h:17 ../hacks/config/slidescreen.xml.h:13 +#: ../hacks/config/sonar.xml.h:7 ../hacks/config/speedmine.xml.h:7 +#: ../hacks/config/splitflap.xml.h:7 ../hacks/config/squirtorus.xml.h:7 +#: ../hacks/config/starwars.xml.h:5 ../hacks/config/superquadrics.xml.h:7 +#: ../hacks/config/tangram.xml.h:10 ../hacks/config/topblock.xml.h:7 +#: ../hacks/config/tronbit.xml.h:7 ../hacks/config/unicrud.xml.h:7 +#: ../hacks/config/unknownpleasures.xml.h:10 ../hacks/config/vigilance.xml.h:7 +#: ../hacks/config/voronoi.xml.h:4 ../hacks/config/winduprobot.xml.h:7 +#: ../hacks/config/wormhole.xml.h:7 ../hacks/config/xjack.xml.h:4 +msgid "Fast" +msgstr "" + +#: ../hacks/config/abstractile.xml.h:5 ../hacks/config/ccurve.xml.h:2 +#: ../hacks/config/flame.xml.h:5 ../hacks/config/maze.xml.h:13 +msgid "0 seconds" +msgstr "" + +#: ../hacks/config/abstractile.xml.h:6 ../hacks/config/boxed.xml.h:17 +#: ../hacks/config/celtic.xml.h:6 ../hacks/config/coral.xml.h:6 +#: ../hacks/config/cube21.xml.h:22 ../hacks/config/epicycle.xml.h:9 +#: ../hacks/config/flame.xml.h:6 ../hacks/config/glcells.xml.h:6 +#: ../hacks/config/helix.xml.h:6 ../hacks/config/imsmap.xml.h:6 +#: ../hacks/config/rorschach.xml.h:9 ../hacks/config/rubikblocks.xml.h:16 +#: ../hacks/config/tangram.xml.h:6 ../hacks/config/xlyap.xml.h:6 +#: ../hacks/config/xspirograph.xml.h:6 +msgid "Linger" +msgstr "" + +#: ../hacks/config/abstractile.xml.h:7 ../hacks/config/voronoi.xml.h:16 +#, fuzzy +msgid "60 seconds" +msgstr "сэкундаў" + +#: ../hacks/config/abstractile.xml.h:8 +msgid "Random tile layout" +msgstr "" + +#: ../hacks/config/abstractile.xml.h:9 +msgid "Flat tiles" +msgstr "" + +#: ../hacks/config/abstractile.xml.h:10 +msgid "Thin tiles" +msgstr "" + +#: ../hacks/config/abstractile.xml.h:11 +msgid "Outline tiles" +msgstr "" + +#: ../hacks/config/abstractile.xml.h:12 +msgid "Block tiles" +msgstr "" + +#: ../hacks/config/abstractile.xml.h:13 +msgid "Neon tiles" +msgstr "" + +#: ../hacks/config/abstractile.xml.h:14 +msgid "Tiled tiles" +msgstr "" + +#: ../hacks/config/abstractile.xml.h:15 ../hacks/config/anemone.xml.h:16 +#: ../hacks/config/anemotaxis.xml.h:12 ../hacks/config/ant.xml.h:22 +#: ../hacks/config/antinspect.xml.h:5 ../hacks/config/antmaze.xml.h:5 +#: ../hacks/config/antspotlight.xml.h:5 ../hacks/config/apollonian.xml.h:13 +#: ../hacks/config/apple2.xml.h:9 ../hacks/config/atlantis.xml.h:19 +#: ../hacks/config/attraction.xml.h:31 ../hacks/config/atunnel.xml.h:8 +#: ../hacks/config/barcode.xml.h:9 ../hacks/config/beats.xml.h:16 +#: ../hacks/config/binaryhorizon.xml.h:14 ../hacks/config/blaster.xml.h:10 +#: ../hacks/config/blinkbox.xml.h:12 ../hacks/config/blitspin.xml.h:9 +#: ../hacks/config/blocktube.xml.h:11 ../hacks/config/boing.xml.h:14 +#: ../hacks/config/bouboule.xml.h:11 ../hacks/config/bouncingcow.xml.h:13 +#: ../hacks/config/boxed.xml.h:23 ../hacks/config/boxfit.xml.h:15 +#: ../hacks/config/braid.xml.h:13 ../hacks/config/bubble3d.xml.h:11 +#: ../hacks/config/bubbles.xml.h:11 ../hacks/config/bumps.xml.h:8 +#: ../hacks/config/cage.xml.h:6 ../hacks/config/carousel.xml.h:18 +#: ../hacks/config/ccurve.xml.h:11 ../hacks/config/celtic.xml.h:9 +#: ../hacks/config/chompytower.xml.h:15 ../hacks/config/circuit.xml.h:14 +#: ../hacks/config/cityflow.xml.h:17 ../hacks/config/cloudlife.xml.h:12 +#: ../hacks/config/companioncube.xml.h:14 ../hacks/config/compass.xml.h:5 +#: ../hacks/config/coral.xml.h:14 ../hacks/config/covid19.xml.h:14 +#: ../hacks/config/crackberg.xml.h:18 ../hacks/config/critical.xml.h:8 +#: ../hacks/config/crumbler.xml.h:15 ../hacks/config/crystal.xml.h:14 +#: ../hacks/config/cube21.xml.h:26 ../hacks/config/cubenetic.xml.h:26 +#: ../hacks/config/cubestack.xml.h:16 ../hacks/config/cubestorm.xml.h:20 +#: ../hacks/config/cubetwist.xml.h:18 ../hacks/config/cubicgrid.xml.h:12 +#: ../hacks/config/cwaves.xml.h:9 ../hacks/config/cynosure.xml.h:11 +#: ../hacks/config/dangerball.xml.h:14 ../hacks/config/decayscreen.xml.h:23 +#: ../hacks/config/deco.xml.h:14 ../hacks/config/deepstars.xml.h:9 +#: ../hacks/config/deluxe.xml.h:15 ../hacks/config/demon.xml.h:15 +#: ../hacks/config/discoball.xml.h:14 ../hacks/config/discrete.xml.h:11 +#: ../hacks/config/distort.xml.h:19 ../hacks/config/dnalogo.xml.h:9 +#: ../hacks/config/drift.xml.h:11 ../hacks/config/dymaxionmap.xml.h:16 +#: ../hacks/config/endgame.xml.h:6 ../hacks/config/energystream.xml.h:7 +#: ../hacks/config/engine.xml.h:19 ../hacks/config/epicycle.xml.h:13 +#: ../hacks/config/eruption.xml.h:22 ../hacks/config/esper.xml.h:9 +#: ../hacks/config/etruscanvenus.xml.h:42 ../hacks/config/euler2d.xml.h:14 +#: ../hacks/config/extrusion.xml.h:16 ../hacks/config/fadeplot.xml.h:14 +#: ../hacks/config/fiberlamp.xml.h:11 ../hacks/config/filmleader.xml.h:9 +#: ../hacks/config/fireworkx.xml.h:10 ../hacks/config/flag.xml.h:12 +#: ../hacks/config/flame.xml.h:14 ../hacks/config/flipflop.xml.h:14 +#: ../hacks/config/flipscreen3d.xml.h:6 ../hacks/config/fliptext.xml.h:15 +#: ../hacks/config/flow.xml.h:21 ../hacks/config/fluidballs.xml.h:22 +#: ../hacks/config/flurry.xml.h:2 ../hacks/config/flyingtoasters.xml.h:15 +#: ../hacks/config/fontglide.xml.h:16 ../hacks/config/forest.xml.h:8 +#: ../hacks/config/fuzzyflakes.xml.h:12 ../hacks/config/galaxy.xml.h:13 +#: ../hacks/config/gears.xml.h:14 ../hacks/config/geodesic.xml.h:10 +#: ../hacks/config/geodesicgears.xml.h:13 ../hacks/config/gflux.xml.h:19 +#: ../hacks/config/gibson.xml.h:15 ../hacks/config/glblur.xml.h:17 +#: ../hacks/config/glcells.xml.h:32 ../hacks/config/gleidescope.xml.h:14 +#: ../hacks/config/glforestfire.xml.h:16 ../hacks/config/glhanoi.xml.h:16 +#: ../hacks/config/glknots.xml.h:24 ../hacks/config/glmatrix.xml.h:20 +#: ../hacks/config/glplanet.xml.h:19 ../hacks/config/glschool.xml.h:17 +#: ../hacks/config/glslideshow.xml.h:20 ../hacks/config/glsnake.xml.h:18 +#: ../hacks/config/gltext.xml.h:19 ../hacks/config/goop.xml.h:13 +#: ../hacks/config/grav.xml.h:12 ../hacks/config/greynetic.xml.h:6 +#: ../hacks/config/halftone.xml.h:17 ../hacks/config/halo.xml.h:14 +#: ../hacks/config/handsy.xml.h:23 ../hacks/config/headroom.xml.h:19 +#: ../hacks/config/helix.xml.h:8 ../hacks/config/hexadrop.xml.h:22 +#: ../hacks/config/hexstrut.xml.h:17 ../hacks/config/hilbert.xml.h:20 +#: ../hacks/config/hopalong.xml.h:23 ../hacks/config/hydrostat.xml.h:29 +#: ../hacks/config/hyperball.xml.h:8 ../hacks/config/hypercube.xml.h:8 +#: ../hacks/config/hypertorus.xml.h:5 ../hacks/config/hypnowheel.xml.h:8 +#: ../hacks/config/ifs.xml.h:68 ../hacks/config/imsmap.xml.h:18 +#: ../hacks/config/interaggregate.xml.h:8 ../hacks/config/interference.xml.h:21 +#: ../hacks/config/intermomentary.xml.h:8 ../hacks/config/jigglypuff.xml.h:10 +#: ../hacks/config/jigsaw.xml.h:15 ../hacks/config/juggle.xml.h:21 +#: ../hacks/config/juggler3d.xml.h:20 ../hacks/config/julia.xml.h:14 +#: ../hacks/config/kaleidescope.xml.h:12 ../hacks/config/kaleidocycle.xml.h:21 +#: ../hacks/config/klein.xml.h:47 ../hacks/config/kumppa.xml.h:7 +#: ../hacks/config/lament.xml.h:7 ../hacks/config/laser.xml.h:12 +#: ../hacks/config/lavalite.xml.h:16 ../hacks/config/lcdscrub.xml.h:7 +#: ../hacks/config/lightning.xml.h:8 ../hacks/config/lisa.xml.h:16 +#: ../hacks/config/lissie.xml.h:15 ../hacks/config/lmorph.xml.h:17 +#: ../hacks/config/lockward.xml.h:9 ../hacks/config/loop.xml.h:12 +#: ../hacks/config/m6502.xml.h:3 ../hacks/config/mapscroller.xml.h:64 +#: ../hacks/config/marbling.xml.h:10 ../hacks/config/maze.xml.h:12 +#: ../hacks/config/maze3d.xml.h:10 ../hacks/config/memscroller.xml.h:9 +#: ../hacks/config/menger.xml.h:19 ../hacks/config/metaballs.xml.h:16 +#: ../hacks/config/mirrorblob.xml.h:25 ../hacks/config/mismunch.xml.h:13 +#: ../hacks/config/moebius.xml.h:7 ../hacks/config/moebiusgears.xml.h:14 +#: ../hacks/config/moire.xml.h:11 ../hacks/config/moire2.xml.h:9 +#: ../hacks/config/molecule.xml.h:15 ../hacks/config/morph3d.xml.h:11 +#: ../hacks/config/mountain.xml.h:11 ../hacks/config/munch.xml.h:16 +#: ../hacks/config/nakagin.xml.h:12 ../hacks/config/nerverot.xml.h:21 +#: ../hacks/config/noof.xml.h:5 ../hacks/config/noseguy.xml.h:2 +#: ../hacks/config/pacman.xml.h:6 ../hacks/config/pedal.xml.h:8 +#: ../hacks/config/peepers.xml.h:17 ../hacks/config/penetrate.xml.h:8 +#: ../hacks/config/penrose.xml.h:12 ../hacks/config/petri.xml.h:5 +#: ../hacks/config/phosphor.xml.h:13 ../hacks/config/photopile.xml.h:22 +#: ../hacks/config/piecewise.xml.h:15 ../hacks/config/pinion.xml.h:16 +#: ../hacks/config/pipes.xml.h:20 ../hacks/config/polyhedra.xml.h:168 +#: ../hacks/config/polyominoes.xml.h:12 ../hacks/config/polytopes.xml.h:18 +#: ../hacks/config/pong.xml.h:9 ../hacks/config/popsquares.xml.h:21 +#: ../hacks/config/projectiveplane.xml.h:45 ../hacks/config/providence.xml.h:7 +#: ../hacks/config/pulsar.xml.h:14 ../hacks/config/pyro.xml.h:14 +#: ../hacks/config/qix.xml.h:24 ../hacks/config/quasicrystal.xml.h:13 +#: ../hacks/config/queens.xml.h:6 ../hacks/config/raverhoop.xml.h:20 +#: ../hacks/config/razzledazzle.xml.h:20 ../hacks/config/ripples.xml.h:18 +#: ../hacks/config/rocks.xml.h:16 ../hacks/config/romanboy.xml.h:43 +#: ../hacks/config/rorschach.xml.h:11 ../hacks/config/rotor.xml.h:13 +#: ../hacks/config/rotzoomer.xml.h:15 ../hacks/config/rubik.xml.h:11 +#: ../hacks/config/rubikblocks.xml.h:20 ../hacks/config/sballs.xml.h:16 +#: ../hacks/config/scooter.xml.h:17 ../hacks/config/shadebobs.xml.h:13 +#: ../hacks/config/sierpinski.xml.h:13 ../hacks/config/sierpinski3d.xml.h:10 +#: ../hacks/config/skytentacles.xml.h:25 ../hacks/config/slidescreen.xml.h:18 +#: ../hacks/config/slip.xml.h:13 ../hacks/config/sonar.xml.h:25 +#: ../hacks/config/speedmine.xml.h:17 ../hacks/config/sphere.xml.h:8 +#: ../hacks/config/sphereeversion.xml.h:38 +#: ../hacks/config/spheremonics.xml.h:22 ../hacks/config/spiral.xml.h:11 +#: ../hacks/config/splitflap.xml.h:25 ../hacks/config/splodesic.xml.h:11 +#: ../hacks/config/spotlight.xml.h:11 ../hacks/config/sproingies.xml.h:9 +#: ../hacks/config/squiral.xml.h:16 ../hacks/config/squirtorus.xml.h:12 +#: ../hacks/config/stairs.xml.h:5 ../hacks/config/starfish.xml.h:17 +#: ../hacks/config/starwars.xml.h:15 ../hacks/config/stonerview.xml.h:7 +#: ../hacks/config/strange.xml.h:23 ../hacks/config/substrate.xml.h:19 +#: ../hacks/config/superquadrics.xml.h:13 ../hacks/config/surfaces.xml.h:27 +#: ../hacks/config/swirl.xml.h:10 ../hacks/config/t3d.xml.h:15 +#: ../hacks/config/tangram.xml.h:16 ../hacks/config/tessellimage.xml.h:19 +#: ../hacks/config/testx11.xml.h:2 ../hacks/config/thornbird.xml.h:11 +#: ../hacks/config/timetunnel.xml.h:8 ../hacks/config/topblock.xml.h:24 +#: ../hacks/config/triangle.xml.h:8 ../hacks/config/tronbit.xml.h:11 +#: ../hacks/config/truchet.xml.h:5 ../hacks/config/twang.xml.h:18 +#: ../hacks/config/unicrud.xml.h:10 ../hacks/config/unknownpleasures.xml.h:17 +#: ../hacks/config/vermiculate.xml.h:5 ../hacks/config/vfeedback.xml.h:9 +#: ../hacks/config/vidwhacker.xml.h:6 ../hacks/config/vines.xml.h:8 +#: ../hacks/config/voronoi.xml.h:11 ../hacks/config/wander.xml.h:13 +#: ../hacks/config/webcollage.xml.h:11 ../hacks/config/whirlwindwarp.xml.h:8 +#: ../hacks/config/whirlygig.xml.h:31 ../hacks/config/winduprobot.xml.h:22 +#: ../hacks/config/worm.xml.h:10 ../hacks/config/wormhole.xml.h:11 +#: ../hacks/config/xanalogtv.xml.h:2 ../hacks/config/xflame.xml.h:6 +#: ../hacks/config/xjack.xml.h:5 ../hacks/config/xlyap.xml.h:8 +#: ../hacks/config/xmatrix.xml.h:21 ../hacks/config/xrayswarm.xml.h:5 +#: ../hacks/config/xspirograph.xml.h:9 ../hacks/config/zoom.xml.h:15 +msgid "Show frame rate" +msgstr "" + +#: ../hacks/config/abstractile.xml.h:16 +msgid "" +"Mosaic patterns of interlocking tiles. Written by Steve Sundstrom; 2004." +msgstr "" + +#: ../hacks/config/anemone.xml.h:1 +msgid "Anemone" +msgstr "" + +#: ../hacks/config/anemone.xml.h:5 ../hacks/config/anemotaxis.xml.h:8 +#: ../hacks/config/beats.xml.h:5 ../hacks/config/binaryhorizon.xml.h:5 +#: ../hacks/config/binaryring.xml.h:8 ../hacks/config/blaster.xml.h:7 +#: ../hacks/config/bouboule.xml.h:5 ../hacks/config/boxed.xml.h:8 +#: ../hacks/config/cityflow.xml.h:5 ../hacks/config/coral.xml.h:11 +#: ../hacks/config/crackberg.xml.h:8 ../hacks/config/crumbler.xml.h:8 +#: ../hacks/config/cubenetic.xml.h:5 ../hacks/config/cubestorm.xml.h:8 +#: ../hacks/config/dangerball.xml.h:8 ../hacks/config/eruption.xml.h:5 +#: ../hacks/config/euler2d.xml.h:5 ../hacks/config/fiberlamp.xml.h:5 +#: ../hacks/config/flame.xml.h:8 ../hacks/config/flow.xml.h:5 +#: ../hacks/config/fluidballs.xml.h:5 ../hacks/config/fuzzyflakes.xml.h:8 +#: ../hacks/config/glcells.xml.h:8 ../hacks/config/glschool.xml.h:5 +#: ../hacks/config/goop.xml.h:8 ../hacks/config/grav.xml.h:5 +#: ../hacks/config/halftone.xml.h:5 ../hacks/config/halo.xml.h:5 +#: ../hacks/config/hydrostat.xml.h:14 ../hacks/config/interaggregate.xml.h:5 +#: ../hacks/config/interference.xml.h:11 ../hacks/config/jigsaw.xml.h:8 +#: ../hacks/config/julia.xml.h:5 ../hacks/config/kaleidescope.xml.h:5 +#: ../hacks/config/lisa.xml.h:5 ../hacks/config/lmorph.xml.h:5 +#: ../hacks/config/nerverot.xml.h:8 ../hacks/config/pedal.xml.h:5 +#: ../hacks/config/peepers.xml.h:8 ../hacks/config/petri.xml.h:10 +#: ../hacks/config/piecewise.xml.h:5 ../hacks/config/qix.xml.h:5 +#: ../hacks/config/rocks.xml.h:5 ../hacks/config/sierpinski.xml.h:5 +#: ../hacks/config/slip.xml.h:5 ../hacks/config/spiral.xml.h:5 +#: ../hacks/config/substrate.xml.h:8 ../hacks/config/swirl.xml.h:5 +#: ../hacks/config/thornbird.xml.h:5 ../hacks/config/topblock.xml.h:13 +#: ../hacks/config/unknownpleasures.xml.h:5 ../hacks/config/voronoi.xml.h:5 +#: ../hacks/config/whirlwindwarp.xml.h:2 ../hacks/config/wormhole.xml.h:8 +msgid "Few" +msgstr "" + +#: ../hacks/config/anemone.xml.h:6 ../hacks/config/fuzzyflakes.xml.h:20 +#: ../hacks/config/hypnowheel.xml.h:13 +msgid "Arms" +msgstr "" + +#. +#. On a 2.93 gHz iMac i7, I get these rates with -delay 0: +#. +#. detail 3: invisible +#. detail 4: barely visible +#. detail 5: 1000+ fps, looks like noise at -delay 0, ok at -delay 20000 +#. detail 8: ~700+ fps +#. detail 9: ~400 fps +#. detail 10: ~300 fps +#. detail 11: ~100 fps +#. detail 12: ~50 fps +#. detail 13: ~17 fps +#. detail 14: ~8 fps +#. detail 15: ~2 fps +#. +#. With the default -delay, CPU load only starts causing the frame rate +#. to drop below 30 fps detail 12 or higher. +#. +#: ../hacks/config/anemone.xml.h:7 ../hacks/config/anemotaxis.xml.h:10 +#: ../hacks/config/ant.xml.h:13 ../hacks/config/apollonian.xml.h:9 +#: ../hacks/config/attraction.xml.h:19 ../hacks/config/beats.xml.h:7 +#: ../hacks/config/blaster.xml.h:9 ../hacks/config/bouboule.xml.h:7 +#: ../hacks/config/braid.xml.h:10 ../hacks/config/cityflow.xml.h:7 +#: ../hacks/config/coral.xml.h:13 ../hacks/config/critical.xml.h:7 +#: ../hacks/config/crumbler.xml.h:10 ../hacks/config/crystal.xml.h:7 +#: ../hacks/config/cubenetic.xml.h:7 ../hacks/config/cubestorm.xml.h:10 +#: ../hacks/config/cynosure.xml.h:7 ../hacks/config/deco.xml.h:7 +#: ../hacks/config/deluxe.xml.h:13 ../hacks/config/demon.xml.h:13 +#: ../hacks/config/discrete.xml.h:10 ../hacks/config/drift.xml.h:10 +#: ../hacks/config/epicycle.xml.h:7 ../hacks/config/eruption.xml.h:7 +#: ../hacks/config/euler2d.xml.h:7 ../hacks/config/fadeplot.xml.h:13 +#: ../hacks/config/fiberlamp.xml.h:7 ../hacks/config/flag.xml.h:11 +#: ../hacks/config/flame.xml.h:10 ../hacks/config/flow.xml.h:7 +#: ../hacks/config/fluidballs.xml.h:7 ../hacks/config/forest.xml.h:7 +#: ../hacks/config/fuzzyflakes.xml.h:10 ../hacks/config/galaxy.xml.h:11 +#: ../hacks/config/glcells.xml.h:10 ../hacks/config/goop.xml.h:10 +#: ../hacks/config/grav.xml.h:7 ../hacks/config/halftone.xml.h:7 +#: ../hacks/config/halo.xml.h:7 ../hacks/config/handsy.xml.h:10 +#: ../hacks/config/hopalong.xml.h:11 ../hacks/config/hydrostat.xml.h:10 +#: ../hacks/config/ifs.xml.h:64 ../hacks/config/imsmap.xml.h:13 +#: ../hacks/config/interaggregate.xml.h:7 ../hacks/config/interference.xml.h:13 +#: ../hacks/config/jigsaw.xml.h:10 ../hacks/config/julia.xml.h:13 +#: ../hacks/config/kaleidescope.xml.h:7 ../hacks/config/laser.xml.h:11 +#: ../hacks/config/lightning.xml.h:7 ../hacks/config/lisa.xml.h:7 +#: ../hacks/config/lissie.xml.h:10 ../hacks/config/lmorph.xml.h:7 +#: ../hacks/config/loop.xml.h:10 ../hacks/config/metaballs.xml.h:10 +#: ../hacks/config/mismunch.xml.h:10 ../hacks/config/moire.xml.h:7 +#: ../hacks/config/moire2.xml.h:7 ../hacks/config/mountain.xml.h:10 +#: ../hacks/config/munch.xml.h:10 ../hacks/config/nerverot.xml.h:10 +#: ../hacks/config/pedal.xml.h:7 ../hacks/config/peepers.xml.h:10 +#: ../hacks/config/penrose.xml.h:7 ../hacks/config/petri.xml.h:12 +#: ../hacks/config/piecewise.xml.h:7 ../hacks/config/polyominoes.xml.h:11 +#: ../hacks/config/qix.xml.h:7 ../hacks/config/razzledazzle.xml.h:10 +#: ../hacks/config/rocks.xml.h:7 ../hacks/config/rotor.xml.h:10 +#: ../hacks/config/shadebobs.xml.h:7 ../hacks/config/sierpinski.xml.h:7 +#: ../hacks/config/slip.xml.h:7 ../hacks/config/sphere.xml.h:7 +#: ../hacks/config/spiral.xml.h:7 ../hacks/config/squiral.xml.h:15 +#: ../hacks/config/starfish.xml.h:16 ../hacks/config/strange.xml.h:22 +#: ../hacks/config/swirl.xml.h:7 ../hacks/config/thornbird.xml.h:7 +#: ../hacks/config/topblock.xml.h:15 ../hacks/config/triangle.xml.h:7 +#: ../hacks/config/unknownpleasures.xml.h:7 ../hacks/config/vines.xml.h:7 +#: ../hacks/config/voronoi.xml.h:7 ../hacks/config/whirlwindwarp.xml.h:4 +#: ../hacks/config/worm.xml.h:7 +msgid "Many" +msgstr "" + +#: ../hacks/config/anemone.xml.h:8 ../hacks/config/skytentacles.xml.h:3 +msgid "Tentacles" +msgstr "" + +#: ../hacks/config/anemone.xml.h:9 ../hacks/config/cubestack.xml.h:8 +#: ../hacks/config/cubestorm.xml.h:14 ../hacks/config/cubetwist.xml.h:8 +#: ../hacks/config/deluxe.xml.h:5 ../hacks/config/fadeplot.xml.h:5 +#: ../hacks/config/fuzzyflakes.xml.h:21 ../hacks/config/glknots.xml.h:19 +#: ../hacks/config/hexstrut.xml.h:11 ../hacks/config/hilbert.xml.h:15 +#: ../hacks/config/hydrostat.xml.h:16 ../hacks/config/lmorph.xml.h:11 +#: ../hacks/config/razzledazzle.xml.h:14 ../hacks/config/skytentacles.xml.h:8 +#: ../hacks/config/starfish.xml.h:11 ../hacks/config/thornbird.xml.h:8 +msgid "Thin" +msgstr "" + +#: ../hacks/config/anemone.xml.h:10 ../hacks/config/cubestack.xml.h:9 +#: ../hacks/config/cubetwist.xml.h:9 ../hacks/config/fadeplot.xml.h:6 +#: ../hacks/config/fuzzyflakes.xml.h:22 ../hacks/config/glknots.xml.h:20 +#: ../hacks/config/hydrostat.xml.h:17 ../hacks/config/moire2.xml.h:8 +#: ../hacks/config/skytentacles.xml.h:9 ../hacks/config/thornbird.xml.h:9 +msgid "Thickness" +msgstr "" + +#: ../hacks/config/anemone.xml.h:11 ../hacks/config/cubestack.xml.h:10 +#: ../hacks/config/cubestorm.xml.h:16 ../hacks/config/cubetwist.xml.h:10 +#: ../hacks/config/deluxe.xml.h:7 ../hacks/config/fadeplot.xml.h:7 +#: ../hacks/config/fuzzyflakes.xml.h:23 ../hacks/config/glknots.xml.h:21 +#: ../hacks/config/hexstrut.xml.h:13 ../hacks/config/hilbert.xml.h:17 +#: ../hacks/config/hydrostat.xml.h:18 ../hacks/config/lmorph.xml.h:13 +#: ../hacks/config/razzledazzle.xml.h:16 ../hacks/config/skytentacles.xml.h:10 +#: ../hacks/config/starfish.xml.h:13 ../hacks/config/thornbird.xml.h:10 +msgid "Thick" +msgstr "" + +#: ../hacks/config/anemone.xml.h:12 ../hacks/config/pyro.xml.h:10 +#: ../hacks/config/splodesic.xml.h:7 ../hacks/config/winduprobot.xml.h:19 +msgid "Often" +msgstr "" + +#: ../hacks/config/anemone.xml.h:13 +msgid "Withdraw freqency" +msgstr "" + +#: ../hacks/config/anemone.xml.h:14 +msgid "Rarely" +msgstr "" + +#: ../hacks/config/anemone.xml.h:15 +msgid "Turn speed" +msgstr "" + +#: ../hacks/config/anemone.xml.h:17 +msgid "Wiggling tentacles. Written by Gabriel Finch; 2002." +msgstr "" + +#: ../hacks/config/anemotaxis.xml.h:1 +msgid "Anemotaxis" +msgstr "" + +#.