From 9a174f14328a9e116a6983148291875b35d84c77 Mon Sep 17 00:00:00 2001 From: Zygo Blaxell Date: Fri, 27 Feb 2009 12:59:33 -0500 Subject: [PATCH] http://se.aminet.net/pub/X11/ftp.x.org/contrib/vms/XSCREENSAVER-126.ZIP -rw-r--r-- 1 zblaxell zblaxell 1785780 Jan 4 1997 XSCREENSAVER-126.ZIP 6d0bb18d12b51914dc93abf2a68f2465af847407 XSCREENSAVER-126.ZIP --- aaa_vms.notes | 71 ++ config.h | 121 ++ driver/.gdbinit | 25 + driver/ad2c | 38 + driver/axpobjs.zip | Bin 0 -> 95915 bytes driver/compile.com | 15 + driver/compile_axp.com | 13 + driver/compile_decc.com | 13 + driver/demo.c | 657 ++++++++++ driver/dialogs.c | 765 ++++++++++++ driver/dialogs.xd | 569 +++++++++ driver/getpwnam.c | 132 ++ driver/getpwuid.c | 56 + driver/hpwd.c | 68 ++ driver/imakefile | 152 +++ driver/link.com | 15 + driver/link_axp.com | 15 + driver/link_decc.com | 15 + driver/lock.c | 706 +++++++++++ driver/lock.c_ori | 676 +++++++++++ driver/pwd.h | 48 + driver/readme | 6 + driver/stderr.c | 334 +++++ driver/stderr.c_ori | 328 +++++ driver/subprocs.c | 667 ++++++++++ driver/subprocs.c_ori | 639 ++++++++++ driver/timers.c | 477 ++++++++ driver/timers.c_ori | 472 +++++++ driver/validate.c | 70 ++ driver/vax_deccobjs.zip | Bin 0 -> 46108 bytes driver/vax_vaxcobjs.zip | Bin 0 -> 45991 bytes driver/version.h | 2 + driver/vms.opt | 6 + driver/vms_12.opt | 6 + driver/vms_axp.opt | 5 + driver/vms_axp_12.opt | 5 + driver/vms_decc.opt | 5 + driver/vms_decc_12.opt | 5 + driver/vmsutil.h | 13 + driver/wait.h | 1 + driver/windows.c | 799 ++++++++++++ driver/windows.c_ori | 783 ++++++++++++ driver/xscreensaver-command.c | 155 +++ driver/xscreensaver-command.c_ori | 151 +++ driver/xscreensaver-command.exe_axp | Bin 0 -> 8192 bytes driver/xscreensaver-command.exe_decc | Bin 0 -> 6144 bytes driver/xscreensaver-command.exe_vaxc | Bin 0 -> 5632 bytes driver/xscreensaver-command.hlp | 96 ++ driver/xscreensaver-command.man | 110 ++ driver/xscreensaver.ad | 160 +++ driver/xscreensaver.c | 1155 ++++++++++++++++++ driver/xscreensaver.c_mods1_save | 1143 +++++++++++++++++ driver/xscreensaver.c_mods2_save | 1161 ++++++++++++++++++ driver/xscreensaver.c_ori | 1111 +++++++++++++++++ driver/xscreensaver.dat | 160 +++ driver/xscreensaver.exe_axp | Bin 0 -> 131584 bytes driver/xscreensaver.exe_decc | Bin 0 -> 71168 bytes driver/xscreensaver.exe_vaxc | Bin 0 -> 69120 bytes driver/xscreensaver.h | 74 ++ driver/xscreensaver.h_ori | 70 ++ driver/xscreensaver.hlp | 540 +++++++++ driver/xscreensaver.man | 551 +++++++++ driver/xscreensaver_ad.h | 108 ++ driver/yarandom.h | 19 + hacks/.gdbinit | 3 + hacks/attraction.c | 690 +++++++++++ hacks/attraction.c_ori | 685 +++++++++++ hacks/attraction.exe_axp | Bin 0 -> 51712 bytes hacks/attraction.exe_vax | Bin 0 -> 27136 bytes hacks/attraction.hlp | 172 +++ hacks/attraction.man | 179 +++ hacks/axpobjs.zip | Bin 0 -> 181509 bytes hacks/blitspin.c | 278 +++++ hacks/blitspin.c_ori | 273 +++++ hacks/blitspin.exe_axp | Bin 0 -> 55808 bytes hacks/blitspin.exe_vax | Bin 0 -> 42496 bytes hacks/blitspin.hlp | 80 ++ hacks/blitspin.man | 77 ++ hacks/compile.com | 22 + hacks/compile_axp.com | 21 + hacks/compile_decc.com | 21 + hacks/decayscreen.c | 146 +++ hacks/decayscreen.exe_axp | Bin 0 -> 31744 bytes hacks/decayscreen.exe_vax | Bin 0 -> 16896 bytes hacks/decayscreen.hlp | 53 + hacks/decayscreen.man | 53 + hacks/default.xbm | 1686 ++++++++++++++++++++++++++ hacks/flame.c | 297 +++++ hacks/flame.exe_axp | Bin 0 -> 32768 bytes hacks/flame.exe_vax | Bin 0 -> 17408 bytes hacks/flame.hlp | 73 ++ hacks/flame.man | 72 ++ hacks/greynetic.c | 182 +++ hacks/greynetic.c_ori | 166 +++ hacks/greynetic.exe_axp | Bin 0 -> 28672 bytes hacks/greynetic.exe_vax | Bin 0 -> 17920 bytes hacks/greynetic.hlp | 52 + hacks/greynetic.man | 52 + hacks/halo.c | 379 ++++++ hacks/halo.exe_axp | Bin 0 -> 35328 bytes hacks/halo.exe_vax | Bin 0 -> 19456 bytes hacks/halo.hlp | 70 ++ hacks/halo.man | 68 ++ hacks/helix.c | 211 ++++ hacks/helix.c_ori | 208 ++++ hacks/helix.exe_axp | Bin 0 -> 33280 bytes hacks/helix.exe_vax | Bin 0 -> 17920 bytes hacks/helix.hlp | 51 + hacks/helix.man | 50 + hacks/hopalong.c | 236 ++++ hacks/hopalong.exe_axp | Bin 0 -> 32768 bytes hacks/hopalong.exe_vax | Bin 0 -> 16384 bytes hacks/hopalong.hlp | 70 ++ hacks/hopalong.man | 69 ++ hacks/hypercube.c | 334 +++++ hacks/hypercube.exe_axp | Bin 0 -> 36352 bytes hacks/hypercube.exe_vax | Bin 0 -> 23040 bytes hacks/hypercube.hlp | 96 ++ hacks/hypercube.man | 93 ++ hacks/imakefile | 75 ++ hacks/imsmap.c | 443 +++++++ hacks/imsmap.c_ori | 437 +++++++ hacks/imsmap.exe_axp | Bin 0 -> 38912 bytes hacks/imsmap.exe_vax | Bin 0 -> 20480 bytes hacks/imsmap.hlp | 64 + hacks/imsmap.man | 63 + hacks/link.com | 49 + hacks/link_axp.com | 49 + hacks/link_decc.com | 49 + hacks/lmorph.c | 504 ++++++++ hacks/lmorph.c_ori | 501 ++++++++ hacks/lmorph.exe_axp | Bin 0 -> 46080 bytes hacks/lmorph.exe_vax | Bin 0 -> 19968 bytes hacks/lmorph.hlp | 54 + hacks/lmorph.man | 54 + hacks/maze.c | 802 ++++++++++++ hacks/maze.c_ori | 792 ++++++++++++ hacks/maze.exe_axp | Bin 0 -> 46080 bytes hacks/maze.exe_vax | Bin 0 -> 25088 bytes hacks/maze.hlp | 108 ++ hacks/maze.man | 107 ++ hacks/noseguy.c | 671 ++++++++++ hacks/noseguy.c_ori | 653 ++++++++++ hacks/noseguy.exe_axp | Bin 0 -> 41984 bytes hacks/noseguy.exe_vax | Bin 0 -> 25088 bytes hacks/noseguy.hlp | 76 ++ hacks/noseguy.man | 74 ++ hacks/noses/cvs/entries | 8 + hacks/noses/cvs/repository | 1 + hacks/noses/nose.0_left | 38 + hacks/noses/nose.0_right | 38 + hacks/noses/nose.1_left | 38 + hacks/noses/nose.1_right | 38 + hacks/noses/nose.down | 38 + hacks/noses/nose.front | 38 + hacks/noses/nose.left_front | 38 + hacks/noses/nose.right_front | 38 + hacks/pedal.c | 408 +++++++ hacks/pedal.c_ori | 404 ++++++ hacks/pedal.exe_axp | Bin 0 -> 33280 bytes hacks/pedal.exe_vax | Bin 0 -> 17408 bytes hacks/pedal.hlp | 64 + hacks/pedal.man | 62 + hacks/pyro.c | 258 ++++ hacks/pyro.exe_axp | Bin 0 -> 32768 bytes hacks/pyro.exe_vax | Bin 0 -> 17408 bytes hacks/pyro.hlp | 61 + hacks/pyro.man | 60 + hacks/qix.c | 514 ++++++++ hacks/qix.exe_axp | Bin 0 -> 39936 bytes hacks/qix.exe_vax | Bin 0 -> 21504 bytes hacks/qix.hlp | 118 ++ hacks/qix.man | 114 ++ hacks/readme | 9 + hacks/rocks.c | 314 +++++ hacks/rocks.c_ori | 310 +++++ hacks/rocks.exe_axp | Bin 0 -> 32768 bytes hacks/rocks.exe_vax | Bin 0 -> 17408 bytes hacks/rocks.hlp | 74 ++ hacks/rocks.man | 71 ++ hacks/rorschach.c | 140 +++ hacks/rorschach.exe_axp | Bin 0 -> 30720 bytes hacks/rorschach.exe_vax | Bin 0 -> 16384 bytes hacks/rorschach.hlp | 67 + hacks/rorschach.man | 64 + hacks/screenhack.c | 260 ++++ hacks/screenhack.c_ori | 247 ++++ hacks/screenhack.h | 146 +++ hacks/screenhack.h_ori | 139 +++ hacks/slidescreen.c | 253 ++++ hacks/slidescreen.exe_axp | Bin 0 -> 35328 bytes hacks/slidescreen.exe_vax | Bin 0 -> 18944 bytes hacks/slidescreen.hlp | 70 ++ hacks/slidescreen.man | 68 ++ hacks/spline.h | 64 + hacks/vaxobjs.zip | Bin 0 -> 90742 bytes hacks/vaxobjs_decc.zip | Bin 0 -> 84382 bytes hacks/version.h | 2 + hacks/vms.opt | 5 + hacks/vms_12.opt | 5 + hacks/vms_axp.opt | 4 + hacks/vms_axp_12.opt | 4 + hacks/vms_decc.opt | 4 + hacks/vms_decc_12.opt | 4 + hacks/vroot.h | 123 ++ hacks/xlock.h | 160 +++ hacks/xroger-hack.c | 103 ++ hacks/xroger.exe_axp | Bin 0 -> 34304 bytes hacks/xroger.exe_vax | Bin 0 -> 17408 bytes hacks/xroger.hlp | 54 + hacks/xroger.man | 52 + hacks/yarandom.h | 19 + imakefile | 53 + patche_1.txt | Bin 0 -> 5378 bytes pm.mail | 169 +++ readme | 133 ++ screenblank.txt | 46 + setup.com | 31 + utils/ad2c | 38 + utils/compile.com | 15 + utils/compile_axp.com | 14 + utils/compile_decc.com | 14 + utils/fade.c | 176 +++ utils/grabscreen.c | 211 ++++ utils/grabscreen.c_ori | 200 +++ utils/hsv.c | 120 ++ utils/imakefile | 24 + utils/readme | 6 + utils/resources.c | 245 ++++ utils/resources.c_ori | 221 ++++ utils/spline.c | 331 +++++ utils/spline.h | 64 + utils/spline.h_ori | 59 + utils/strings.c | 85 ++ utils/unix_time.h | 79 ++ utils/unix_times.c | 178 +++ utils/usleep.c | 110 ++ utils/usleep.c_ori | 97 ++ utils/utils.olb | Bin 0 -> 26624 bytes utils/utils.olb_axp | Bin 0 -> 98304 bytes utils/utils.olb_decc | Bin 0 -> 25088 bytes utils/version.h | 2 + utils/visual.c | 296 +++++ utils/visual.c_ori | 288 +++++ utils/xroger.c | 106 ++ utils/yarandom.c | 79 ++ utils/yarandom.c_ori | 72 ++ utils/yarandom.h | 19 + xscreen_martin.txt | Bin 0 -> 5378 bytes 249 files changed, 37242 insertions(+) create mode 100755 aaa_vms.notes create mode 100755 config.h create mode 100755 driver/.gdbinit create mode 100755 driver/ad2c create mode 100755 driver/axpobjs.zip create mode 100755 driver/compile.com create mode 100755 driver/compile_axp.com create mode 100755 driver/compile_decc.com create mode 100755 driver/demo.c create mode 100755 driver/dialogs.c create mode 100755 driver/dialogs.xd create mode 100755 driver/getpwnam.c create mode 100755 driver/getpwuid.c create mode 100755 driver/hpwd.c create mode 100755 driver/imakefile create mode 100755 driver/link.com create mode 100755 driver/link_axp.com create mode 100755 driver/link_decc.com create mode 100755 driver/lock.c create mode 100755 driver/lock.c_ori create mode 100755 driver/pwd.h create mode 100755 driver/readme create mode 100755 driver/stderr.c create mode 100755 driver/stderr.c_ori create mode 100755 driver/subprocs.c create mode 100755 driver/subprocs.c_ori create mode 100755 driver/timers.c create mode 100755 driver/timers.c_ori create mode 100755 driver/validate.c create mode 100755 driver/vax_deccobjs.zip create mode 100755 driver/vax_vaxcobjs.zip create mode 100755 driver/version.h create mode 100755 driver/vms.opt create mode 100755 driver/vms_12.opt create mode 100755 driver/vms_axp.opt create mode 100755 driver/vms_axp_12.opt create mode 100755 driver/vms_decc.opt create mode 100755 driver/vms_decc_12.opt create mode 100755 driver/vmsutil.h create mode 100755 driver/wait.h create mode 100755 driver/windows.c create mode 100755 driver/windows.c_ori create mode 100755 driver/xscreensaver-command.c create mode 100755 driver/xscreensaver-command.c_ori create mode 100755 driver/xscreensaver-command.exe_axp create mode 100755 driver/xscreensaver-command.exe_decc create mode 100755 driver/xscreensaver-command.exe_vaxc create mode 100755 driver/xscreensaver-command.hlp create mode 100755 driver/xscreensaver-command.man create mode 100755 driver/xscreensaver.ad create mode 100755 driver/xscreensaver.c create mode 100755 driver/xscreensaver.c_mods1_save create mode 100755 driver/xscreensaver.c_mods2_save create mode 100755 driver/xscreensaver.c_ori create mode 100755 driver/xscreensaver.dat create mode 100755 driver/xscreensaver.exe_axp create mode 100755 driver/xscreensaver.exe_decc create mode 100755 driver/xscreensaver.exe_vaxc create mode 100755 driver/xscreensaver.h create mode 100755 driver/xscreensaver.h_ori create mode 100755 driver/xscreensaver.hlp create mode 100755 driver/xscreensaver.man create mode 100755 driver/xscreensaver_ad.h create mode 100755 driver/yarandom.h create mode 100755 hacks/.gdbinit create mode 100755 hacks/attraction.c create mode 100755 hacks/attraction.c_ori create mode 100755 hacks/attraction.exe_axp create mode 100755 hacks/attraction.exe_vax create mode 100755 hacks/attraction.hlp create mode 100755 hacks/attraction.man create mode 100755 hacks/axpobjs.zip create mode 100755 hacks/blitspin.c create mode 100755 hacks/blitspin.c_ori create mode 100755 hacks/blitspin.exe_axp create mode 100755 hacks/blitspin.exe_vax create mode 100755 hacks/blitspin.hlp create mode 100755 hacks/blitspin.man create mode 100755 hacks/compile.com create mode 100755 hacks/compile_axp.com create mode 100755 hacks/compile_decc.com create mode 100755 hacks/decayscreen.c create mode 100755 hacks/decayscreen.exe_axp create mode 100755 hacks/decayscreen.exe_vax create mode 100755 hacks/decayscreen.hlp create mode 100755 hacks/decayscreen.man create mode 100755 hacks/default.xbm create mode 100755 hacks/flame.c create mode 100755 hacks/flame.exe_axp create mode 100755 hacks/flame.exe_vax create mode 100755 hacks/flame.hlp create mode 100755 hacks/flame.man create mode 100755 hacks/greynetic.c create mode 100755 hacks/greynetic.c_ori create mode 100755 hacks/greynetic.exe_axp create mode 100755 hacks/greynetic.exe_vax create mode 100755 hacks/greynetic.hlp create mode 100755 hacks/greynetic.man create mode 100755 hacks/halo.c create mode 100755 hacks/halo.exe_axp create mode 100755 hacks/halo.exe_vax create mode 100755 hacks/halo.hlp create mode 100755 hacks/halo.man create mode 100755 hacks/helix.c create mode 100755 hacks/helix.c_ori create mode 100755 hacks/helix.exe_axp create mode 100755 hacks/helix.exe_vax create mode 100755 hacks/helix.hlp create mode 100755 hacks/helix.man create mode 100755 hacks/hopalong.c create mode 100755 hacks/hopalong.exe_axp create mode 100755 hacks/hopalong.exe_vax create mode 100755 hacks/hopalong.hlp create mode 100755 hacks/hopalong.man create mode 100755 hacks/hypercube.c create mode 100755 hacks/hypercube.exe_axp create mode 100755 hacks/hypercube.exe_vax create mode 100755 hacks/hypercube.hlp create mode 100755 hacks/hypercube.man create mode 100755 hacks/imakefile create mode 100755 hacks/imsmap.c create mode 100755 hacks/imsmap.c_ori create mode 100755 hacks/imsmap.exe_axp create mode 100755 hacks/imsmap.exe_vax create mode 100755 hacks/imsmap.hlp create mode 100755 hacks/imsmap.man create mode 100755 hacks/link.com create mode 100755 hacks/link_axp.com create mode 100755 hacks/link_decc.com create mode 100755 hacks/lmorph.c create mode 100755 hacks/lmorph.c_ori create mode 100755 hacks/lmorph.exe_axp create mode 100755 hacks/lmorph.exe_vax create mode 100755 hacks/lmorph.hlp create mode 100755 hacks/lmorph.man create mode 100755 hacks/maze.c create mode 100755 hacks/maze.c_ori create mode 100755 hacks/maze.exe_axp create mode 100755 hacks/maze.exe_vax create mode 100755 hacks/maze.hlp create mode 100755 hacks/maze.man create mode 100755 hacks/noseguy.c create mode 100755 hacks/noseguy.c_ori create mode 100755 hacks/noseguy.exe_axp create mode 100755 hacks/noseguy.exe_vax create mode 100755 hacks/noseguy.hlp create mode 100755 hacks/noseguy.man create mode 100755 hacks/noses/cvs/entries create mode 100755 hacks/noses/cvs/repository create mode 100755 hacks/noses/nose.0_left create mode 100755 hacks/noses/nose.0_right create mode 100755 hacks/noses/nose.1_left create mode 100755 hacks/noses/nose.1_right create mode 100755 hacks/noses/nose.down create mode 100755 hacks/noses/nose.front create mode 100755 hacks/noses/nose.left_front create mode 100755 hacks/noses/nose.right_front create mode 100755 hacks/pedal.c create mode 100755 hacks/pedal.c_ori create mode 100755 hacks/pedal.exe_axp create mode 100755 hacks/pedal.exe_vax create mode 100755 hacks/pedal.hlp create mode 100755 hacks/pedal.man create mode 100755 hacks/pyro.c create mode 100755 hacks/pyro.exe_axp create mode 100755 hacks/pyro.exe_vax create mode 100755 hacks/pyro.hlp create mode 100755 hacks/pyro.man create mode 100755 hacks/qix.c create mode 100755 hacks/qix.exe_axp create mode 100755 hacks/qix.exe_vax create mode 100755 hacks/qix.hlp create mode 100755 hacks/qix.man create mode 100755 hacks/readme create mode 100755 hacks/rocks.c create mode 100755 hacks/rocks.c_ori create mode 100755 hacks/rocks.exe_axp create mode 100755 hacks/rocks.exe_vax create mode 100755 hacks/rocks.hlp create mode 100755 hacks/rocks.man create mode 100755 hacks/rorschach.c create mode 100755 hacks/rorschach.exe_axp create mode 100755 hacks/rorschach.exe_vax create mode 100755 hacks/rorschach.hlp create mode 100755 hacks/rorschach.man create mode 100755 hacks/screenhack.c create mode 100755 hacks/screenhack.c_ori create mode 100755 hacks/screenhack.h create mode 100755 hacks/screenhack.h_ori create mode 100755 hacks/slidescreen.c create mode 100755 hacks/slidescreen.exe_axp create mode 100755 hacks/slidescreen.exe_vax create mode 100755 hacks/slidescreen.hlp create mode 100755 hacks/slidescreen.man create mode 100755 hacks/spline.h create mode 100755 hacks/vaxobjs.zip create mode 100755 hacks/vaxobjs_decc.zip create mode 100755 hacks/version.h create mode 100755 hacks/vms.opt create mode 100755 hacks/vms_12.opt create mode 100755 hacks/vms_axp.opt create mode 100755 hacks/vms_axp_12.opt create mode 100755 hacks/vms_decc.opt create mode 100755 hacks/vms_decc_12.opt create mode 100755 hacks/vroot.h create mode 100755 hacks/xlock.h create mode 100755 hacks/xroger-hack.c create mode 100755 hacks/xroger.exe_axp create mode 100755 hacks/xroger.exe_vax create mode 100755 hacks/xroger.hlp create mode 100755 hacks/xroger.man create mode 100755 hacks/yarandom.h create mode 100755 imakefile create mode 100755 patche_1.txt create mode 100755 pm.mail create mode 100755 readme create mode 100755 screenblank.txt create mode 100755 setup.com create mode 100755 utils/ad2c create mode 100755 utils/compile.com create mode 100755 utils/compile_axp.com create mode 100755 utils/compile_decc.com create mode 100755 utils/fade.c create mode 100755 utils/grabscreen.c create mode 100755 utils/grabscreen.c_ori create mode 100755 utils/hsv.c create mode 100755 utils/imakefile create mode 100755 utils/readme create mode 100755 utils/resources.c create mode 100755 utils/resources.c_ori create mode 100755 utils/spline.c create mode 100755 utils/spline.h create mode 100755 utils/spline.h_ori create mode 100755 utils/strings.c create mode 100755 utils/unix_time.h create mode 100755 utils/unix_times.c create mode 100755 utils/usleep.c create mode 100755 utils/usleep.c_ori create mode 100755 utils/utils.olb create mode 100755 utils/utils.olb_axp create mode 100755 utils/utils.olb_decc create mode 100755 utils/version.h create mode 100755 utils/visual.c create mode 100755 utils/visual.c_ori create mode 100755 utils/xroger.c create mode 100755 utils/yarandom.c create mode 100755 utils/yarandom.c_ori create mode 100755 utils/yarandom.h create mode 100755 xscreen_martin.txt diff --git a/aaa_vms.notes b/aaa_vms.notes new file mode 100755 index 00000000..654b05a9 --- /dev/null +++ b/aaa_vms.notes @@ -0,0 +1,71 @@ +OpenVMS port of Xscreensavser version 1.26 December 1995 +========================================== + +Xscreensaver distribution can be found in 3 subdirectories: + +[.DRIVER] The Xscreensaver and Xscreensaver-command programs. +[.HACKS] Graphic demos ,can be run either through the xscreensaver program + or standalone. +[.UTILS] A small libraries of various utilities. + +All objets, libraries and exes files in [.UTILS] and [.HACKS] directories are +provided for VAX VMS 5.5-2 (compiled with VAX C 3.2 / Motif 1.1) or +VAX VMS 6.1 (compiled with DEC C 5.0/ Motif 1.2) and Alpha VMS 6.1 +(compiled with DEC C 5.0 / Motif 1.2). But the code in [.DRIVER] directory +cannot compile with Motif 1.1; objs and exe files are provided for VAX VMS 6.1 +/ Motif 1.2 (compiled with VAX C 3.2 & DEC C 5.0). + +XSCREENSAVER 1.26 needs at least DECW/Motif 1.2 either on VAX and Alphas (to +have X11R5 libraries). The only module needing X11R5 is [.DRIVER]LOCK.C , if +somebody can remove this restriction, go on !! + +If you wan to rebuild, you need to rebuild [.UTILS] directory first and +re-create the object library (look at the end of COMPILE*.COM procedure). + +You can now rebuild the [.HACKS] directory and the [.DRIVER] directory. + +WARNING : before rebuilding [.HACKS], you need to correct some of DECwindows +bitmap files. Some files are bogus !! (they have a long line of null chars +at the end). These files are under SYS$COMMON:[DECW$INCLUDE.BITMAPS] directory: + +STIPPLE.XBM +HLINES2.XBM +LIGHT_GRAY.XBM +ROOT_WEAVES.XBM +VLINES2.XBM + +These files are all used by Greynetic demo. + +Nota: link procedure automagically select appropriate X and Motif Libraries +(X11R4/Motif 1.1 - X11R4/Motif 1.2). Really usefull only for graphic hacks +however ... + +The SETUP.COM procedure gives you a definition of all DCL foreign command +symbols needed to run Xscreensaver and all the graphic hacks. You need to +modify this procedure if you install these programs in another directory tree. + +VMS .HLP files are provied for all programms of this distribution. + +You can easily add new graphic demos without recompiling Xscreensaver. You just +need to add them in resource file XSCREENSAVER.DAT. This file (originally +present in [.DRIVER] directory ) can be installed under your SYS$LOGIN +directory for a per-user customization basis. You can also install it under +the system-wide user resource directory SYS$COMMON:[DECW$DEFAULT.USER] +(with (W:RE) protections). The new graphics hack must be run in root-window +mode to be accepted by Xscreensaver. + +The graphic demos are spawn into subprocess created by the system() call (in +the Unix version the execve() call is used). + +The VMS passord checking programs were picked up in the Xlock distribution. + +Many thanks to Martin P.J. Zinser for many portability improvements to this +port (look at XSCREEN_MARTIN.TXT for a list of changes). + +Thanks to Grégoire Sandré (sandre@clamart.wireline.slb.com) for a patch +concerning FileVue X Messages. + +Enjoy, + +Patrick MOREAU - CENA/Athis-Mons - FRANCE (pmoreau@cena.dgac.fr) + (moreau_p@decus.decus.fr) diff --git a/config.h b/config.h new file mode 100755 index 00000000..9ccb8d1f --- /dev/null +++ b/config.h @@ -0,0 +1,121 @@ +/* + * Config file for xscreensaver, Copyright (c) 1991-1995 Jamie Zawinski. + * This file is included by the various Imakefiles. + */ + +/* Uncomment the following line if you have the XIDLE extension installed. + * This extension resides in .../contrib/extensions/xidle/ on the X11R5 + * contrib tape. (Turning on this flag lets XScreenSaver work better with + * servers which support this extension; but it will still work with servers + * which do not suport this extension, so it's a good idea to compile in + * support for it if you can.) + */ +/* #define HAVE_XIDLE_EXTENSION */ + +/* Uncomment the following line if you have the MIT-SCREEN-SAVER extension + * installed. This extension resides in .../contrib/extensions/screensaver/ + * on the X11R6 contrib tape. + * + * This extension does basically the same thing that the XIDLE extension does, + * but there are two things wrong with it: first, because of the way the + * extension was designed, the `fade' option to XScreenSaver will be uglier: + * just before the screen fades out, there will be an unattractive flicker to + * black, because this extension blanks the screen *before* telling us that it + * is time to do so. Second, this extension is known to be buggy; on the + * systems I use, it works, but some people have reported X server crashes as + * a result of using it. XScreenSaver uses this extension rather + * conservatively, because when I tried to use any of its more complicated + * features, I could get it to crash the server at the drop of a hat. + * + * I wish someone would port the XIDLE extension to R6. Or I wish someone + * would make the MIT-SCREEN-SAVER extension not be such a piece of junk. + * + * Note that the SGI X server also has an extension called SCREEN_SAVER. + * That is a completely different extension, and XScreenSaver contains no + * support for it (though it probably wouldn't be hard.) + */ +/* #define HAVE_SAVER_EXTENSION */ + +/* Uncomment the following line if you have the XPM library installed. + * Some of the demos can make use of this if it is available. + */ +#define HAVE_XPM + +/* Uncomment the following line if you don't have Motif. If you don't have + * Motif, then the screensaver won't have any dialog boxes, which means + * that it won't be compiled with support for demo-mode or display-locking. + * But other than that, it will work fine. + */ +/* #define NO_MOTIF */ + +/* Uncomment the following line if for some reason the locking code doesn't + * work (for example, if you don't have the crypt() system call, or if you + * don't use standard passwd files.) If you need to do this, please let me + * know. + */ +/* #define NO_LOCKING */ + +/* Uncomment the following line if your system doesn't have the select() + * system call. If you need to do this, please let me know. + */ +#define NO_SELECT + +/* Uncomment the following line if your system doesn't have the setuid(), + * setregid(), and getpwnam() library routines. + * + * WARNING: if you do this, it will be unsafe to run xscreensaver as root + * (which probably means you can't have it be started by xdm.) If you are + * on such a system, please try to find the corresponding way to do this, + * and then tell me what it is. + */ +#define NO_SETUID + +/* Uncomment the following line if your system uses `shadow' passwords, + * that is, the passwords live in /etc/shadow instead of /etc/passwd, + * and one reads them with getspnam() instead of getpwnam(). + */ +/* #define HAVE_SHADOW */ + +/* You may need to edit these to correspond to where Motif is installed. + */ +/*#ifndef NO_MOTIF */ +/* MOTIFINCLUDES = -I/usr/local/include/ */ +/* MOTIFLDOPTIONS = -L/usr/local/lib/ */ +/* MOTIFLIBS = -lXm */ +/*#endif */ + +/* On some systems, only programs running as root can use the getpwent() + library routine. This means that, in order for locking to work, the + screensaver must be installed as setuid to root. Define this to make + that happen. (You must run "make install" as root for it to work.) + (What systems other than HP and AIX need this? Let me know.) + */ +#if defined(HPArchitecture) || defined(AIXArchitecture) || defined(HAVE_SHADOW) +# define INSTALL_SETUID +#endif + +#ifdef HPArchitecture + CCOPTIONS = -Aa -D_HPUX_SOURCE /* eat me */ +# if (ProjectX <= 4) + MOTIFINCLUDES = -I/usr/include/Motif1.1 + MOTIFLDOPTIONS = -L/usr/lib/Motif1.1 +# else /* R5 */ + MOTIFINCLUDES = -I/usr/include/Motif1.2 + MOTIFLDOPTIONS = -L/usr/lib/Motif1.2 +# endif /* R5 */ +#endif /* HPArchitecture */ + +#ifdef MacIIArchitecture + CCOPTIONS = -D_POSIX_SOURCE +#endif /* MacIIArchitecture */ + +#if (ProjectX <= 4) +# define R5ISMS -DXPointer="char*" +#else /* r5 or better */ +# define R5ISMS +#endif + +/* It seems that some versions of Sun's dynamic X libraries are broken; if + you get link errors about _get_wmShellWidgetClass being undefined, try + adding -Bstatic to the link command. + */ diff --git a/driver/.gdbinit b/driver/.gdbinit new file mode 100755 index 00000000..e04c4922 --- /dev/null +++ b/driver/.gdbinit @@ -0,0 +1,25 @@ +# If you're debugging xscreensaver and you are running a virtual root window +# manager, you'd better let the process handle these signals: it remaps the +# virtual root window when they arrive. If you don't do this, your window +# manager will be hosed. +# +# Also, gdb copes badly with breakpoints in functions that are called on the +# other side of a fork(). The Trace/BPT traps cause the spawned process to +# die. +# +#handle 1 pass nostop +#handle 3 pass nostop +#handle 4 pass nostop +#handle 6 pass nostop +#handle 7 pass nostop +#handle 8 pass nostop +#handle 9 pass nostop +#handle 10 pass nostop +#handle 11 pass nostop +#handle 12 pass nostop +#handle 13 pass nostop +#handle 15 pass nostop +#handle 19 pass nostop +b exit +set args -verbose -idelay 0 +#b purify_stop_here diff --git a/driver/ad2c b/driver/ad2c new file mode 100755 index 00000000..1435e554 --- /dev/null +++ b/driver/ad2c @@ -0,0 +1,38 @@ +#!/bin/sh +# +# ad2c : Convert app-defaults file to C strings decls. +# +# George Ferguson, ferguson@cs.rcohester.edu, 12 Nov 1990. +# 19 Mar 1991 : gf +# Made it self-contained. +# 6 Jan 1992 : mycroft@gnu.ai.mit.edu (Charles Hannum) +# Removed use of "-n" and ":read" label since Gnu and +# IBM sed print pattern space on "n" command. Still works +# with Sun sed, of course. +# 7 Jan 1992: matthew@sunpix.East.Sun.COM (Matthew Stier) +# Escape quotes after escaping backslashes. +# + +sed ' +/^!/d +/^$/d +s/\\/\\\\/g +s/\\$//g +s/"/\\"/g +s/^/"/ +: test +/\\$/b slash +s/$/",/ +p +d +: slash +n +/^!/d +/^$/d +s/"/\\"/g +s/\\\\/\\/g +s/\\n/\\\\n/g +s/\\t/\\\\t/g +s/\\f/\\\\f/g +s/\\b/\\\\b/g +b test' "$@" diff --git a/driver/axpobjs.zip b/driver/axpobjs.zip new file mode 100755 index 0000000000000000000000000000000000000000..d9218c800209534701f214ae6911115874b32599 GIT binary patch literal 95915 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

?Ge@3?66lE3#lm7WUMw0xK^tU{4n z*=I51S3nUo0>GJu5cuDoQ8%z=G?oRv>^-Pt*A$L(l@I${;3Lf!Ip)+KR}CY>2sah{Pz# z3}XFq_gWPxK}VEu0566};uC0+a%XdL9r@|X>AuG#?y`QFTwEKx4BU+om)TZy9CiS3 zPJ(J}LlkW4)~({J>4DG>X-!ivx2lMsVvX3qM;6TgoMJO32d7U!j2+`e>U1K|3nuim zg*0VEgTtFU5#c?=kG~WkA4XuEJPiWzQo^B_@wcxA!%LTOASQ#)4O7 zRU5sC zmT?&`VWR-{bIaO7H|oe#jMSj0upYN%u0OW`Eku>Sz<+)ZlP6~fq-;jy)p^}@2$MzQ zbK{#EA>KnS;X&|Se1dc-NL<0;vA^g*V}G{=vh3|ls71`WUy>G%9UhfW-%2;h&IwVg z5|92G&*w%SfzF^&SnI8&Ds6FFhw2D89@UuE(nVN**n6r%vdGDkRQwU6Z0T(ks>=$n zg;m%E$Fagrs%$~>d&m5pjIvF}^P$K2gY=m4W6exhKAp$*m?!k;0)cQ?L5s`nB^3VN z(#h{)Weg7_I%W374V{H>Fp?#MT%HDDel8k_N?12e!oFjunMg-=7D$to`TWWWTZ7m& zb9x!?9G7*4q7FWZMB4fzM-&0E1d2RJKOkv3bTNw*VW{J3kw`M%1l8Ft`h;V$S=mWG z!pHmVE`eM?3ZgVhEe7zaBZ!qomgHq)JKFVX%$2b+D~U{#tnQLRV`g~0Y|H{#pgYC~ z4YRX$STek`_8@)DEcdvPS-P$LXeVtYpmyAls-<`R;I@6d)dk4y%qig)L5d*l~TSwV(S z&*GI!-^5FVOOs^aN-!9t%*5A!=d+%tL1m#23oWEcv7*s3ee==Y1sWIf@#`9VGnewh zt1qCkclwIReBE0K)Xi1z$hgenR!yaVtOWJO%SnXINl%+W?JWbE^~hUdl%fkuNeDCp z%3@u&3HQYGHp!x5zUk)VcBD^$C z5j0I$E1CJqVT*@xMN5~2NXSKwb}KMll2GrSU*brgvWs58w|+Vn4yIq zLmS{{e1Q4C@UE7>moSg{&+rn$AQ&LXqD#ZRep8{s8}@)K7R!C|)^% z`tS`L03d+$pTj-H1^}>daQ{6x%0Gj5vc&;V;-IbjH>bSyLPIwce3m;=+x2Jgqkon9 z2|fcI?(|i!yLG7m08QKfgyT2@05*&Zo zga0V?6MPp6kJT7HC&C5*a`^!OROogJKMqKsRssOv>|$c-K-O!9M3IYItG$Nn)9WDU+sZHHM~>HLAEDy0W%Y}P-v0ynk5WI$v7s|uQ<;@PH?%M# z>VNk7*aUQ$V`yV(V(4P}TW9<)r}tl+@d_Xq^cM(!V|Uoz{n-0pzgszbnC$+*{-e}S z_Dg85&*+E{tg!Q&4D``|0T_1SzW@LL literal 0 HcmV?d00001 diff --git a/driver/compile.com b/driver/compile.com new file mode 100755 index 00000000..21492162 --- /dev/null +++ b/driver/compile.com @@ -0,0 +1,15 @@ +$ def sys sys$library +$ CC/DEFINE=(VMS,NO_SELECT,NO_SETUID) DEMO.C +$ CC/DEFINE=(VMS,NO_SELECT,NO_SETUID) DIALOGS.C +$ CC/DEFINE=(VMS,NO_SELECT,NO_SETUID) LOCK.C +$ CC/DEFINE=(VMS,NO_SELECT,NO_SETUID) SUBPROCS.C +$ CC/DEFINE=(VMS,NO_SELECT,NO_SETUID) STDERR.C +$ CC/DEFINE=(VMS,NO_SELECT,NO_SETUID) TIMERS.C +$ CC/DEFINE=(VMS,NO_SELECT,NO_SETUID) WINDOWS.C +$ CC/DEFINE=(VMS,NO_SELECT,NO_SETUID) XSCREENSAVER-COMMAND.C +$! /Noopt qualifier needed with VAX C for Xscreensaver !! +$ CC/DEFINE=(VMS,NO_SELECT,NO_SETUID)/NOOPT XSCREENSAVER.C +$ CC/DEFINE=VMS GETPWNAM.C +$ CC/DEFINE=VMS GETPWUID.C +$ CC/DEFINE=VMS HPWD.C +$ CC/DEFINE=VMS VALIDATE.C diff --git a/driver/compile_axp.com b/driver/compile_axp.com new file mode 100755 index 00000000..f5b1521a --- /dev/null +++ b/driver/compile_axp.com @@ -0,0 +1,13 @@ +$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,NO_SELECT,NO_SETUID) DEMO.C +$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,NO_SELECT,NO_SETUID) DIALOGS.C +$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,NO_SELECT,NO_SETUID) LOCK.C +$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,NO_SELECT,NO_SETUID) SUBPROCS.C +$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,NO_SELECT,NO_SETUID) STDERR.C +$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,NO_SELECT,NO_SETUID) TIMERS.C +$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,NO_SELECT,NO_SETUID) WINDOWS.C +$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,NO_SELECT,NO_SETUID) XSCREENSAVER-COMMAND.C +$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,NO_SELECT,NO_SETUID) XSCREENSAVER.C +$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,NO_SELECT,NO_SETUID) GETPWNAM.C +$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,NO_SELECT,NO_SETUID) GETPWUID.C +$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,NO_SELECT,NO_SETUID) HPWD.C +$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,NO_SELECT,NO_SETUID) VALIDATE.C diff --git a/driver/compile_decc.com b/driver/compile_decc.com new file mode 100755 index 00000000..f5b1521a --- /dev/null +++ b/driver/compile_decc.com @@ -0,0 +1,13 @@ +$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,NO_SELECT,NO_SETUID) DEMO.C +$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,NO_SELECT,NO_SETUID) DIALOGS.C +$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,NO_SELECT,NO_SETUID) LOCK.C +$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,NO_SELECT,NO_SETUID) SUBPROCS.C +$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,NO_SELECT,NO_SETUID) STDERR.C +$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,NO_SELECT,NO_SETUID) TIMERS.C +$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,NO_SELECT,NO_SETUID) WINDOWS.C +$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,NO_SELECT,NO_SETUID) XSCREENSAVER-COMMAND.C +$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,NO_SELECT,NO_SETUID) XSCREENSAVER.C +$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,NO_SELECT,NO_SETUID) GETPWNAM.C +$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,NO_SELECT,NO_SETUID) GETPWUID.C +$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,NO_SELECT,NO_SETUID) HPWD.C +$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,NO_SELECT,NO_SETUID) VALIDATE.C diff --git a/driver/demo.c b/driver/demo.c new file mode 100755 index 00000000..b7823400 --- /dev/null +++ b/driver/demo.c @@ -0,0 +1,657 @@ +/* xscreensaver, Copyright (c) 1993-1995 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. + */ + +#include + +#if !__STDC__ +# define _NO_PROTO +#endif + +#include +#include +#include +#include + +#include "xscreensaver.h" +#include + +#ifdef HAVE_SAVER_EXTENSION +extern int saver_ext_event_number; +extern Window server_saver_window; +#endif /* HAVE_SAVER_EXTENSION */ + +extern Time timeout, cycle, lock_timeout; +#ifndef NO_LOCKING +extern Time passwd_timeout; +#endif +extern int fade_seconds, fade_ticks; +extern Bool verbose_p, install_cmap_p, fade_p, unfade_p; +extern Bool lock_p, locking_disabled_p; + +static void demo_mode_hack P((char *)); +static void demo_mode_done P((void)); + +static void focus_fuckus P((Widget dialog)); +static void text_cb P((Widget button, XtPointer, XtPointer)); + +extern void demo_mode_restart_process (); + +extern Widget demo_dialog; +extern Widget label1; +extern Widget text_line; +extern Widget demo_form; +extern Widget demo_list; +extern Widget next, prev, done, restart, edit; + +extern Widget resources_dialog; +extern Widget resources_form; +extern Widget res_done, res_cancel; +extern Widget timeout_text, cycle_text, fade_text, ticks_text; +extern Widget lock_time_text, passwd_time_text; +extern Widget verbose_toggle, cmap_toggle, fade_toggle, unfade_toggle, + lock_toggle; + +extern create_demo_dialog (); +extern create_resources_dialog (); + +static void +focus_fuckus (dialog) + Widget dialog; +{ + XSetInputFocus (XtDisplay (dialog), XtWindow (dialog), + RevertToParent, CurrentTime); +} + +static void +raise_screenhack_dialog () +{ + XMapRaised (XtDisplay (demo_dialog), XtWindow (demo_dialog)); + if (resources_dialog) + XMapRaised (XtDisplay (resources_dialog), XtWindow (resources_dialog)); + focus_fuckus (resources_dialog ? resources_dialog : demo_dialog); +} + +static void +destroy_screenhack_dialogs () +{ + if (demo_dialog) XtDestroyWidget (demo_dialog); + if (resources_dialog) XtDestroyWidget (resources_dialog); + demo_dialog = resources_dialog = 0; +} + +static void +text_cb (button, client_data, call_data) + Widget button; + XtPointer client_data, call_data; +{ + char *line = XmTextGetString (button); + demo_mode_hack (line); +} + + +static void +select_cb (button, client_data, call_data) + Widget button; + XtPointer client_data, call_data; +{ + char **hacks = (char **) client_data; + XmListCallbackStruct *lcb = (XmListCallbackStruct *) call_data; + XmTextSetString (text_line, hacks [lcb->item_position - 1]); + if (lcb->reason == XmCR_DEFAULT_ACTION) + text_cb (text_line, 0, 0); + focus_fuckus (demo_dialog); +} + +static void +ensure_selected_item_visible (list) + Widget list; +{ + int *pos_list = 0; + int pos_count = 0; + if (XmListGetSelectedPos (list, &pos_list, &pos_count) && pos_count > 0) + { + int top = -2; + int visible = 0; + XtVaGetValues (list, + XmNtopItemPosition, &top, + XmNvisibleItemCount, &visible, + 0); + if (pos_list[0] >= top + visible) + { + int pos = pos_list[0] - visible + 1; + if (pos < 0) pos = 0; + XmListSetPos (list, pos); + } + else if (pos_list[0] < top) + { + XmListSetPos (list, pos_list[0]); + } + } + if (pos_list) + XtFree ((char *) pos_list); +} + +static void +next_cb (button, client_data, call_data) + Widget button; + XtPointer client_data, call_data; +{ + int *pos_list; + int pos_count; + if (! XmListGetSelectedPos (demo_list, &pos_list, &pos_count)) + XmListSelectPos (demo_list, 1, True); + else + { + int pos = pos_list [0]; + XmListSelectPos (demo_list, pos + 1, True); + XtFree ((char *) pos_list); + if (! XmListGetSelectedPos (demo_list, &pos_list, &pos_count)) + abort (); + if (pos_list [0] == pos) + XmListSelectPos (demo_list, 1, True); + XtFree ((char *) pos_list); + } + ensure_selected_item_visible (demo_list); + text_cb (text_line, 0, 0); +} + +static void +prev_cb (button, client_data, call_data) + Widget button; + XtPointer client_data, call_data; +{ + int *pos_list; + int pos_count; + if (! XmListGetSelectedPos (demo_list, &pos_list, &pos_count)) + XmListSelectPos (demo_list, 0, True); + else + { + XmListSelectPos (demo_list, pos_list [0] - 1, True); + XtFree ((char *) pos_list); + } + ensure_selected_item_visible (demo_list); + text_cb (text_line, 0, 0); +} + + +static void pop_resources_dialog (); +static void make_resources_dialog (); + +static void +edit_cb (button, client_data, call_data) + Widget button; + XtPointer client_data, call_data; +{ + Widget parent = (Widget) client_data; + if (! resources_dialog) + make_resources_dialog (parent); + pop_resources_dialog (); +} + +static void +done_cb (button, client_data, call_data) + Widget button; + XtPointer client_data, call_data; +{ + demo_mode_done (); +} + + +static void +restart_cb (button, client_data, call_data) + Widget button; + XtPointer client_data, call_data; +{ + demo_mode_restart_process (); +} + +void +pop_up_dialog_box (dialog, form, where) + Widget dialog, form; + int where; +{ + /* I'm sure this is the wrong way to pop up a dialog box, but I can't + figure out how else to do it. + + It's important that the screensaver dialogs not get decorated or + otherwise reparented by the window manager, because they need to be + children of the *real* root window, not the WM's virtual root, in + order for us to guarentee that they are visible above the screensaver + window itself. + */ + Arg av [100]; + int ac = 0; + Dimension sw, sh, x, y, w, h; + XtRealizeWidget (form); + sw = WidthOfScreen (XtScreen (dialog)); + sh = HeightOfScreen (XtScreen (dialog)); + ac = 0; + XtSetArg (av [ac], XmNwidth, &w); ac++; + XtSetArg (av [ac], XmNheight, &h); ac++; + XtGetValues (form, av, ac); + switch (where) + { + case 0: /* center it in the top-right quadrant */ + x = (sw/2 + w) / 2 + (sw/2) - w; + y = (sh/2 + h) / 2 - h; + break; + case 1: /* center it in the bottom-right quadrant */ + x = (sw/2 + w) / 2 + (sw/2) - w; + y = (sh/2 + h) / 2 + (sh/2) - h; + break; + case 2: /* center it on the screen */ + x = (sw + w) / 2 - w; + y = (sh + h) / 2 - h; + break; + default: + abort (); + } + if (x + w > sw) x = sw - w; + if (y + h > sh) y = sh - h; + ac = 0; + XtSetArg (av [ac], XmNx, x); ac++; + XtSetArg (av [ac], XmNy, y); ac++; + XtSetArg (av [ac], XtNoverrideRedirect, True); ac++; + XtSetArg (av [ac], XmNdefaultPosition, False); ac++; + /* I wonder whether this does anything useful? */ + /* XtSetArg (av [ac], XmNdialogStyle, XmDIALOG_SYSTEM_MODAL); ac++; */ + XtSetValues (dialog, av, ac); + XtSetValues (form, av, ac); + XtManageChild (form); + + focus_fuckus (dialog); +} + + +static void +make_screenhack_dialog (parent, hacks) + Widget parent; + char **hacks; +{ + char buf [255]; + Arg av[10]; + int ac; + char *label; + XmString xm_label = 0; + XmString new_xm_label; + + create_demo_dialog (parent); + ac = 0; + XtSetArg (av [ac], XmNlabelString, &xm_label); ac++; + XtGetValues (label1, av, ac); + XmStringGetLtoR (xm_label, XmSTRING_DEFAULT_CHARSET, &label); + if (!strcmp (label, XtName (label1))) + strcpy (buf, "ERROR: RESOURCES ARE NOT INSTALLED CORRECTLY"); + else + sprintf (buf, label, screensaver_version); + new_xm_label = XmStringCreate (buf, XmSTRING_DEFAULT_CHARSET); + ac = 0; + XtSetArg (av [ac], XmNlabelString, new_xm_label); ac++; + XtSetValues (label1, av, ac); + XmStringFree (new_xm_label); + XtFree (label); + + XtAddCallback (demo_list, XmNbrowseSelectionCallback, select_cb, + (XtPointer) hacks); + XtAddCallback (demo_list, XmNdefaultActionCallback, select_cb, + (XtPointer) hacks); + + XtAddCallback (text_line, XmNactivateCallback, text_cb, 0); + XtAddCallback (next, XmNactivateCallback, next_cb, 0); + XtAddCallback (prev, XmNactivateCallback, prev_cb, 0); + XtAddCallback (done, XmNactivateCallback, done_cb, 0); + XtAddCallback (restart, XmNactivateCallback, restart_cb, 0); + XtAddCallback (edit, XmNactivateCallback, edit_cb, (XtPointer) parent); + + for (; *hacks; hacks++) + { + XmString xmstr = XmStringCreate (*hacks, XmSTRING_DEFAULT_CHARSET); + XmListAddItem (demo_list, xmstr, 0); + /* XmListSelectPos (widget, i, False); */ + XmStringFree (xmstr); + } + +#if 0 + /* Dialogs that have scroll-lists don't obey maxWidth! Fuck!! Hack it. */ + ac = 0; + XtSetArg (av [ac], XmNmaxWidth, &max_w); ac++; + XtGetValues (demo_dialog, av, ac); /* great, this SEGVs */ +#endif + + pop_up_dialog_box (demo_dialog, demo_form, 0); +} + + +/* the Screensaver Parameters dialog */ + +static struct resources { + int timeout, cycle, secs, ticks, lock_time, passwd_time; + int verb, cmap, fade, unfade, lock_p; +} res; + + +extern int parse_time (); + +static void +hack_time_cb (dpy, line, store, sec_p) + Display *dpy; + char *line; + int *store; + Bool sec_p; +{ + if (*line) + { + int value; + value = parse_time (line, sec_p, True); + if (value < 0) + /*XBell (dpy, 0)*/; + else + *store = value; + } +} + +static void +res_sec_cb (button, client_data, call_data) + Widget button; + XtPointer client_data, call_data; +{ + hack_time_cb (XtDisplay (button), XmTextGetString (button), + (int *) client_data, True); +} + +static void +res_min_cb (button, client_data, call_data) + Widget button; + XtPointer client_data, call_data; +{ + hack_time_cb (XtDisplay (button), XmTextGetString (button), + (int *) client_data, False); +} + +static void +res_int_cb (button, client_data, call_data) + Widget button; + XtPointer client_data, call_data; +{ + char *line = XmTextGetString (button); + int *store = (int *) client_data; + unsigned int value; + char c; + if (! *line) + ; + else if (sscanf (line, "%u%c", &value, &c) != 1) + XBell (XtDisplay (button), 0); + else + *store = value; +} + +static void +res_bool_cb (button, client_data, call_data) + Widget button; + XtPointer client_data, call_data; +{ + int *store = (int *) client_data; + *store = ((XmToggleButtonCallbackStruct *) call_data)->set; +} + +static void +res_cancel_cb (button, client_data, call_data) + Widget button; + XtPointer client_data, call_data; +{ + XtDestroyWidget (resources_dialog); + resources_dialog = 0; + raise_screenhack_dialog (); +} + + +static void +res_done_cb (button, client_data, call_data) + Widget button; + XtPointer client_data, call_data; +{ + res_cancel_cb (button, client_data, call_data); + + if (res.timeout < 10) res.timeout = 10; + if (res.cycle < 2) res.cycle = 2; + if (res.passwd_time < 2) res.passwd_time = 30; + + timeout = res.timeout * 1000; + cycle = res.cycle * 1000; + lock_timeout = res.lock_time * 1000; +#ifndef NO_LOCKING + passwd_timeout = res.passwd_time * 1000; +#endif + fade_seconds = res.secs; + fade_ticks = res.ticks; + verbose_p = res.verb; + install_cmap_p = res.cmap; + fade_p = res.fade; + unfade_p = res.unfade; + lock_p = res.lock_p; +} + + +static void +make_resources_dialog (parent) + Widget parent; +{ + Arg av[10]; + int ac; + + create_resources_dialog (parent); + + XtAddCallback (res_done, XmNactivateCallback, res_done_cb, 0); + XtAddCallback (res_cancel, XmNactivateCallback, res_cancel_cb, 0); + +#define CB(widget,type,slot) \ + XtAddCallback ((widget), XmNvalueChangedCallback, (type), \ + (XtPointer) (slot)) + CB (timeout_text, res_min_cb, &res.timeout); + CB (cycle_text, res_min_cb, &res.cycle); + CB (fade_text, res_sec_cb, &res.secs); + CB (ticks_text, res_int_cb, &res.ticks); + CB (lock_time_text, res_min_cb, &res.lock_time); + CB (passwd_time_text, res_sec_cb, &res.passwd_time); + CB (verbose_toggle, res_bool_cb, &res.verb); + CB (cmap_toggle, res_bool_cb, &res.cmap); + CB (fade_toggle, res_bool_cb, &res.fade); + CB (unfade_toggle, res_bool_cb, &res.unfade); + CB (lock_toggle, res_bool_cb, &res.lock_p); +#undef CB + ac = 0; + XtSetArg (av[ac], XmNsensitive, False); ac++; + + if (locking_disabled_p) + { + XtSetValues (passwd_time_text, av, ac); + XtSetValues (lock_time_text, av, ac); + XtSetValues (lock_toggle, av, ac); + } + if (CellsOfScreen (XtScreen (parent)) <= 2) + { + XtSetValues (fade_text, av, ac); + XtSetValues (ticks_text, av, ac); + XtSetValues (cmap_toggle, av, ac); + XtSetValues (fade_toggle, av, ac); + XtSetValues (unfade_toggle, av, ac); + } +} + + +static void +fmt_time (buf, s, min_p) + char *buf; + unsigned int s; + int min_p; +{ + unsigned int h = 0, m = 0; + if (s >= 60) + { + m += (s / 60); + s %= 60; + } + if (m >= 60) + { + h += (m / 60); + m %= 60; + } +/* + if (min_p && h == 0 && s == 0) + sprintf (buf, "%u", m); + else if (!min_p && h == 0 && m == 0) + sprintf (buf, "%u", s); + else + if (h == 0) + sprintf (buf, "%u:%02u", m, s); + else +*/ + sprintf (buf, "%u:%02u:%02u", h, m, s); +} + +static void +pop_resources_dialog () +{ + char buf [100]; + + res.timeout = timeout / 1000; + res.cycle = cycle / 1000; + res.lock_time = lock_timeout / 1000; +#ifndef NO_LOCKING + res.passwd_time = passwd_timeout / 1000; +#endif + res.secs = fade_seconds; + res.ticks = fade_ticks; + res.verb = verbose_p; + res.cmap = install_cmap_p; + res.fade = fade_p; + res.unfade = unfade_p; + res.lock_p = (lock_p && !locking_disabled_p); + + fmt_time (buf, res.timeout, 1); XmTextSetString (timeout_text, buf); + fmt_time (buf, res.cycle, 1); XmTextSetString (cycle_text, buf); + fmt_time (buf, res.lock_time, 1); XmTextSetString (lock_time_text, buf); + fmt_time (buf, res.passwd_time, 0); XmTextSetString (passwd_time_text, buf); + fmt_time (buf, res.secs, 0); XmTextSetString (fade_text, buf); + sprintf (buf, "%u", res.ticks); XmTextSetString (ticks_text, buf); + + XmToggleButtonSetState (verbose_toggle, res.verb, True); + XmToggleButtonSetState (cmap_toggle, res.cmap, True); + XmToggleButtonSetState (fade_toggle, res.fade, True); + XmToggleButtonSetState (unfade_toggle, res.unfade, True); + XmToggleButtonSetState (lock_toggle, res.lock_p, True); + + pop_up_dialog_box (resources_dialog, resources_form, 1); +} + + +/* The code on this page isn't actually Motif-specific */ + +Bool dbox_up_p = False; +Bool demo_mode_p = False; + +extern XtAppContext app; +extern Widget toplevel_shell; +extern Bool use_xidle_extension; +extern Bool use_saver_extension; +extern Time notice_events_timeout; + +extern char **screenhacks; +extern char *demo_hack; + +extern void notice_events_timer P((XtPointer closure, XtIntervalId *timer)); +extern Bool handle_clientmessage P((/*XEvent *, Bool*/)); + +void +demo_mode () +{ + dbox_up_p = True; + initialize_screensaver_window (); + raise_window (True, False); + make_screenhack_dialog (toplevel_shell, screenhacks); + while (demo_mode_p) + { + XEvent event; + XtAppNextEvent (app, &event); + switch (event.xany.type) + { + case 0: /* synthetic "timeout" event */ + break; + + case ClientMessage: + handle_clientmessage (&event, False); + break; + + case CreateNotify: + if (!use_xidle_extension && !use_saver_extension) + { + XtAppAddTimeOut (app, notice_events_timeout, notice_events_timer, + (XtPointer) event.xcreatewindow.window); +#ifdef DEBUG_TIMERS + if (verbose_p) + printf ("%s: starting notice_events_timer for 0x%X (%lu)\n", + progname, + (unsigned int) event.xcreatewindow.window, + notice_events_timeout); +#endif /* DEBUG_TIMERS */ + } + break; + + case ButtonPress: + case ButtonRelease: + if (!XtWindowToWidget (dpy, event.xbutton.window)) + raise_screenhack_dialog (); + /* fall through */ + + default: +#ifdef HAVE_SAVER_EXTENSION + if (event.type == saver_ext_event_number) + { + /* Get the "real" server window out of the way as soon + as possible. */ + if (server_saver_window && + window_exists_p (dpy, server_saver_window)) + XUnmapWindow (dpy, server_saver_window); + } + else +#endif /* HAVE_SAVER_EXTENSION */ + + XtDispatchEvent (&event); + break; + } + } + destroy_screenhack_dialogs (); + initialize_screensaver_window (); + unblank_screen (); +} + +static void +demo_mode_hack (hack) + char *hack; +{ + if (! demo_mode_p) abort (); + kill_screenhack (); + if (! demo_hack) + blank_screen (); + demo_hack = hack; + spawn_screenhack (False); +} + +static void +demo_mode_done () +{ + kill_screenhack (); + if (demo_hack) + unblank_screen (); + demo_mode_p = False; + dbox_up_p = False; + demo_hack = 0; +} diff --git a/driver/dialogs.c b/driver/dialogs.c new file mode 100755 index 00000000..a403c1b8 --- /dev/null +++ b/driver/dialogs.c @@ -0,0 +1,765 @@ + +/* +** Generated by X-Designer +*/ +/* +**LIBS: -lXm -lXt -lX11 +*/ + +#if !__STDC__ +# define _NO_PROTO +#endif + +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/* #### Hacked by hand, not generated by XDesigner */ +extern Visual *visual; +extern int visual_depth; +extern Colormap cmap; + + +Widget passwd_dialog; +Widget passwd_form; +Widget roger_label; +Widget passwd_label1; +Widget passwd_label3; +Widget passwd_text; +Widget passwd_done; +Widget passwd_cancel; + +Widget resources_dialog; +Widget resources_form; +Widget timeout_text; +Widget cycle_text; +Widget fade_text; +Widget ticks_text; +Widget lock_time_text; +Widget passwd_time_text; +Widget verbose_toggle; +Widget cmap_toggle; +Widget fade_toggle; +Widget unfade_toggle; +Widget lock_toggle; +Widget res_done; +Widget res_cancel; + +Widget demo_dialog; +Widget demo_form; +Widget label1; +Widget label2; +Widget text_area; +Widget demo_list; +Widget text_line; +Widget vline; +Widget next; +Widget prev; +Widget edit; +Widget done; +Widget restart; +Widget spacer; + + +void +create_passwd_dialog( parent ) +Widget parent; +{ + Widget children[8]; /* Children to manage */ + Arg al[64]; /* Arg List */ + register int ac = 0; /* Arg Count */ + Widget widget4; + Widget widget7; + + + /* #### Hacked by hand, not generated by XDesigner */ + ac = 0; + XtSetArg (al[ac], XmNvisual, visual); ac++; + XtSetArg (al[ac], XmNcolormap, cmap); ac++; + XtSetArg (al[ac], XmNdepth, visual_depth); ac++; + + + passwd_dialog = XmCreateDialogShell ( parent, "passwdDialog", al, ac ); + passwd_form = XmCreateForm ( passwd_dialog, "passwdForm", al, ac ); + roger_label = XmCreateDrawnButton ( passwd_form, "rogerLabel", al, ac ); + passwd_label1 = XmCreateLabel ( passwd_form, "passwdLabel1", al, ac ); + widget4 = XmCreateLabel ( passwd_form, "passwdLabel2", al, ac ); + passwd_label3 = XmCreateLabel ( passwd_form, "passwdLabel3", al, ac ); + passwd_text = XmCreateTextField ( passwd_form, "passwdText", al, ac ); + widget7 = XmCreateSeparator ( passwd_form, "widget7", al, ac ); + passwd_done = XmCreatePushButton ( passwd_form, "passwdDone", al, ac ); + passwd_cancel = XmCreatePushButton ( passwd_form, "passwdCancel", al, ac ); + + /* #### Hacked by hand, not generated by XDesigner */ + ac = 0; + + + XtSetArg(al[ac], XmNtopAttachment, XmATTACH_FORM); ac++; + XtSetArg(al[ac], XmNtopOffset, 4); ac++; + XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_FORM); ac++; + XtSetArg(al[ac], XmNbottomOffset, 4); ac++; + XtSetArg(al[ac], XmNleftAttachment, XmATTACH_FORM); ac++; + XtSetArg(al[ac], XmNleftOffset, 4); ac++; + XtSetArg(al[ac], XmNrightAttachment, XmATTACH_NONE); ac++; + XtSetValues ( roger_label,al, ac ); + ac = 0; + + XtSetArg(al[ac], XmNtopAttachment, XmATTACH_FORM); ac++; + XtSetArg(al[ac], XmNtopOffset, 4); ac++; + XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_WIDGET); ac++; + XtSetArg(al[ac], XmNbottomOffset, 4); ac++; + XtSetArg(al[ac], XmNbottomWidget, widget4); ac++; + XtSetArg(al[ac], XmNleftAttachment, XmATTACH_WIDGET); ac++; + XtSetArg(al[ac], XmNleftOffset, 4); ac++; + XtSetArg(al[ac], XmNleftWidget, roger_label); ac++; + XtSetArg(al[ac], XmNrightAttachment, XmATTACH_FORM); ac++; + XtSetArg(al[ac], XmNrightOffset, 4); ac++; + XtSetValues ( passwd_label1,al, ac ); + ac = 0; + + XtSetArg(al[ac], XmNtopAttachment, XmATTACH_NONE); ac++; + XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_WIDGET); ac++; + XtSetArg(al[ac], XmNbottomOffset, 4); ac++; + XtSetArg(al[ac], XmNbottomWidget, passwd_label3); ac++; + XtSetArg(al[ac], XmNleftAttachment, XmATTACH_WIDGET); ac++; + XtSetArg(al[ac], XmNleftOffset, 4); ac++; + XtSetArg(al[ac], XmNleftWidget, roger_label); ac++; + XtSetArg(al[ac], XmNrightAttachment, XmATTACH_FORM); ac++; + XtSetArg(al[ac], XmNrightOffset, 4); ac++; + XtSetValues ( widget4,al, ac ); + ac = 0; + + XtSetArg(al[ac], XmNtopAttachment, XmATTACH_NONE); ac++; + XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_WIDGET); ac++; + XtSetArg(al[ac], XmNbottomOffset, 4); ac++; + XtSetArg(al[ac], XmNbottomWidget, passwd_text); ac++; + XtSetArg(al[ac], XmNleftAttachment, XmATTACH_WIDGET); ac++; + XtSetArg(al[ac], XmNleftOffset, 4); ac++; + XtSetArg(al[ac], XmNleftWidget, roger_label); ac++; + XtSetArg(al[ac], XmNrightAttachment, XmATTACH_FORM); ac++; + XtSetArg(al[ac], XmNrightOffset, 30); ac++; + XtSetValues ( passwd_label3,al, ac ); + ac = 0; + + XtSetArg(al[ac], XmNtopAttachment, XmATTACH_NONE); ac++; + XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_WIDGET); ac++; + XtSetArg(al[ac], XmNbottomOffset, 4); ac++; + XtSetArg(al[ac], XmNbottomWidget, widget7); ac++; + XtSetArg(al[ac], XmNleftAttachment, XmATTACH_WIDGET); ac++; + XtSetArg(al[ac], XmNleftOffset, 4); ac++; + XtSetArg(al[ac], XmNleftWidget, roger_label); ac++; + XtSetArg(al[ac], XmNrightAttachment, XmATTACH_FORM); ac++; + XtSetArg(al[ac], XmNrightOffset, 4); ac++; + XtSetValues ( passwd_text,al, ac ); + ac = 0; + + XtSetArg(al[ac], XmNtopAttachment, XmATTACH_NONE); ac++; + XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_WIDGET); ac++; + XtSetArg(al[ac], XmNbottomOffset, 4); ac++; + XtSetArg(al[ac], XmNbottomWidget, passwd_done); ac++; + XtSetArg(al[ac], XmNleftAttachment, XmATTACH_WIDGET); ac++; + XtSetArg(al[ac], XmNleftOffset, 0); ac++; + XtSetArg(al[ac], XmNleftWidget, roger_label); ac++; + XtSetArg(al[ac], XmNrightAttachment, XmATTACH_FORM); ac++; + XtSetArg(al[ac], XmNrightOffset, 0); ac++; + XtSetValues ( widget7,al, ac ); + ac = 0; + + XtSetArg(al[ac], XmNtopAttachment, XmATTACH_NONE); ac++; + XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_FORM); ac++; + XtSetArg(al[ac], XmNbottomOffset, 4); ac++; + XtSetArg(al[ac], XmNleftAttachment, XmATTACH_WIDGET); ac++; + XtSetArg(al[ac], XmNleftOffset, 4); ac++; + XtSetArg(al[ac], XmNleftWidget, roger_label); ac++; + XtSetArg(al[ac], XmNrightAttachment, XmATTACH_NONE); ac++; + XtSetValues ( passwd_done,al, ac ); + ac = 0; + + XtSetArg(al[ac], XmNtopAttachment, XmATTACH_NONE); ac++; + XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_FORM); ac++; + XtSetArg(al[ac], XmNbottomOffset, 4); ac++; + XtSetArg(al[ac], XmNleftAttachment, XmATTACH_WIDGET); ac++; + XtSetArg(al[ac], XmNleftOffset, 4); ac++; + XtSetArg(al[ac], XmNleftWidget, passwd_done); ac++; + XtSetArg(al[ac], XmNrightAttachment, XmATTACH_NONE); ac++; + XtSetValues ( passwd_cancel,al, ac ); + ac = 0; + children[ac++] = roger_label; + children[ac++] = passwd_label1; + children[ac++] = widget4; + children[ac++] = passwd_label3; + children[ac++] = passwd_text; + children[ac++] = widget7; + children[ac++] = passwd_done; + children[ac++] = passwd_cancel; + XtManageChildren(children, ac); + ac = 0; +} + + + +void +create_resources_dialog( parent ) +Widget parent; +{ + Widget children[22]; /* Children to manage */ + Arg al[64]; /* Arg List */ + register int ac = 0; /* Arg Count */ + Widget widget12; + Widget widget13; + Widget widget14; + Widget widget15; + Widget widget16; + Widget widget17; + Widget widget18; + Widget widget48; + Widget widget29; + + + /* #### Hacked by hand, not generated by XDesigner */ + ac = 0; + XtSetArg (al[ac], XmNvisual, visual); ac++; + XtSetArg (al[ac], XmNcolormap, cmap); ac++; + XtSetArg (al[ac], XmNdepth, visual_depth); ac++; + + + resources_dialog = XmCreateDialogShell ( parent, "resourcesDialog", al, ac ); + resources_form = XmCreateForm ( resources_dialog, "resourcesForm", al, ac ); + + /* #### Hacked by hand, not generated by XDesigner */ + ac = 0; + + widget12 = XmCreateLabel ( resources_form, "resourcesLabel", al, ac ); + widget13 = XmCreateSeparator ( resources_form, "widget13", al, ac ); + XtSetArg(al[ac], XmNalignment, XmALIGNMENT_END); ac++; + widget14 = XmCreateLabel ( resources_form, "timeoutLabel", al, ac ); + ac = 0; + XtSetArg(al[ac], XmNalignment, XmALIGNMENT_END); ac++; + widget15 = XmCreateLabel ( resources_form, "cycleLabel", al, ac ); + ac = 0; + XtSetArg(al[ac], XmNalignment, XmALIGNMENT_END); ac++; + widget16 = XmCreateLabel ( resources_form, "fadeSecondsLabel", al, ac ); + ac = 0; + XtSetArg(al[ac], XmNalignment, XmALIGNMENT_END); ac++; + widget17 = XmCreateLabel ( resources_form, "fadeTicksLabel", al, ac ); + ac = 0; + XtSetArg(al[ac], XmNalignment, XmALIGNMENT_END); ac++; + widget18 = XmCreateLabel ( resources_form, "lockLabel", al, ac ); + ac = 0; + XtSetArg(al[ac], XmNalignment, XmALIGNMENT_END); ac++; + widget48 = XmCreateLabel ( resources_form, "passwdLabel", al, ac ); + ac = 0; + timeout_text = XmCreateTextField ( resources_form, "timeoutText", al, ac ); + cycle_text = XmCreateTextField ( resources_form, "cycleText", al, ac ); + fade_text = XmCreateTextField ( resources_form, "fadeSecondsText", al, ac ); + ticks_text = XmCreateTextField ( resources_form, "fadeTicksText", al, ac ); + lock_time_text = XmCreateTextField ( resources_form, "passwdText", al, ac ); + passwd_time_text = XmCreateTextField ( resources_form, "lockText", al, ac ); + XtSetArg(al[ac], XmNalignment, XmALIGNMENT_BEGINNING); ac++; + verbose_toggle = XmCreateToggleButton ( resources_form, "verboseToggle", al, ac ); + ac = 0; + XtSetArg(al[ac], XmNalignment, XmALIGNMENT_BEGINNING); ac++; + cmap_toggle = XmCreateToggleButton ( resources_form, "cmapToggle", al, ac ); + ac = 0; + XtSetArg(al[ac], XmNalignment, XmALIGNMENT_BEGINNING); ac++; + fade_toggle = XmCreateToggleButton ( resources_form, "fadeToggle", al, ac ); + ac = 0; + XtSetArg(al[ac], XmNalignment, XmALIGNMENT_BEGINNING); ac++; + unfade_toggle = XmCreateToggleButton ( resources_form, "unfadeToggle", al, ac ); + ac = 0; + XtSetArg(al[ac], XmNalignment, XmALIGNMENT_BEGINNING); ac++; + lock_toggle = XmCreateToggleButton ( resources_form, "lockToggle", al, ac ); + ac = 0; + widget29 = XmCreateSeparator ( resources_form, "widget29", al, ac ); + res_done = XmCreatePushButton ( resources_form, "resourcesDone", al, ac ); + res_cancel = XmCreatePushButton ( resources_form, "resourcesCancel", al, ac ); + + XtSetArg(al[ac], XmNtopAttachment, XmATTACH_FORM); ac++; + XtSetArg(al[ac], XmNtopOffset, 4); ac++; + XtSetArg(al[ac], XmNleftAttachment, XmATTACH_FORM); ac++; + XtSetArg(al[ac], XmNleftOffset, 4); ac++; + XtSetArg(al[ac], XmNrightAttachment, XmATTACH_FORM); ac++; + XtSetArg(al[ac], XmNrightOffset, 4); ac++; + XtSetValues ( widget12,al, ac ); + ac = 0; + + XtSetArg(al[ac], XmNtopAttachment, XmATTACH_WIDGET); ac++; + XtSetArg(al[ac], XmNtopOffset, 4); ac++; + XtSetArg(al[ac], XmNtopWidget, widget12); ac++; + XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_NONE); ac++; + XtSetArg(al[ac], XmNleftAttachment, XmATTACH_FORM); ac++; + XtSetArg(al[ac], XmNleftOffset, 0); ac++; + XtSetArg(al[ac], XmNrightAttachment, XmATTACH_FORM); ac++; + XtSetArg(al[ac], XmNrightOffset, 0); ac++; + XtSetValues ( widget13,al, ac ); + ac = 0; + + XtSetArg(al[ac], XmNtopAttachment, XmATTACH_WIDGET); ac++; + XtSetArg(al[ac], XmNtopOffset, 4); ac++; + XtSetArg(al[ac], XmNtopWidget, widget13); ac++; + XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_OPPOSITE_WIDGET); ac++; + XtSetArg(al[ac], XmNbottomWidget, timeout_text); ac++; + XtSetArg(al[ac], XmNleftAttachment, XmATTACH_FORM); ac++; + XtSetArg(al[ac], XmNleftOffset, 20); ac++; + XtSetArg(al[ac], XmNrightAttachment, XmATTACH_WIDGET); ac++; + XtSetArg(al[ac], XmNrightOffset, 4); ac++; + XtSetArg(al[ac], XmNrightWidget, timeout_text); ac++; + XtSetValues ( widget14,al, ac ); + ac = 0; + + XtSetArg(al[ac], XmNtopAttachment, XmATTACH_OPPOSITE_WIDGET); ac++; + XtSetArg(al[ac], XmNtopOffset, 0); ac++; + XtSetArg(al[ac], XmNtopWidget, cycle_text); ac++; + XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_OPPOSITE_WIDGET); ac++; + XtSetArg(al[ac], XmNbottomOffset, 0); ac++; + XtSetArg(al[ac], XmNbottomWidget, cycle_text); ac++; + XtSetArg(al[ac], XmNleftAttachment, XmATTACH_FORM); ac++; + XtSetArg(al[ac], XmNleftOffset, 20); ac++; + XtSetArg(al[ac], XmNrightAttachment, XmATTACH_WIDGET); ac++; + XtSetArg(al[ac], XmNrightOffset, 4); ac++; + XtSetArg(al[ac], XmNrightWidget, cycle_text); ac++; + XtSetValues ( widget15,al, ac ); + ac = 0; + + XtSetArg(al[ac], XmNtopAttachment, XmATTACH_OPPOSITE_WIDGET); ac++; + XtSetArg(al[ac], XmNtopOffset, 0); ac++; + XtSetArg(al[ac], XmNtopWidget, fade_text); ac++; + XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_OPPOSITE_WIDGET); ac++; + XtSetArg(al[ac], XmNbottomOffset, 0); ac++; + XtSetArg(al[ac], XmNbottomWidget, fade_text); ac++; + XtSetArg(al[ac], XmNleftAttachment, XmATTACH_FORM); ac++; + XtSetArg(al[ac], XmNleftOffset, 20); ac++; + XtSetArg(al[ac], XmNrightAttachment, XmATTACH_WIDGET); ac++; + XtSetArg(al[ac], XmNrightOffset, 4); ac++; + XtSetArg(al[ac], XmNrightWidget, fade_text); ac++; + XtSetValues ( widget16,al, ac ); + ac = 0; + + XtSetArg(al[ac], XmNtopAttachment, XmATTACH_OPPOSITE_WIDGET); ac++; + XtSetArg(al[ac], XmNtopOffset, 0); ac++; + XtSetArg(al[ac], XmNtopWidget, ticks_text); ac++; + XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_OPPOSITE_WIDGET); ac++; + XtSetArg(al[ac], XmNbottomOffset, 0); ac++; + XtSetArg(al[ac], XmNbottomWidget, ticks_text); ac++; + XtSetArg(al[ac], XmNleftAttachment, XmATTACH_FORM); ac++; + XtSetArg(al[ac], XmNleftOffset, 20); ac++; + XtSetArg(al[ac], XmNrightAttachment, XmATTACH_WIDGET); ac++; + XtSetArg(al[ac], XmNrightOffset, 4); ac++; + XtSetArg(al[ac], XmNrightWidget, ticks_text); ac++; + XtSetValues ( widget17,al, ac ); + ac = 0; + + XtSetArg(al[ac], XmNtopAttachment, XmATTACH_OPPOSITE_WIDGET); ac++; + XtSetArg(al[ac], XmNtopOffset, 0); ac++; + XtSetArg(al[ac], XmNtopWidget, lock_time_text); ac++; + XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_OPPOSITE_WIDGET); ac++; + XtSetArg(al[ac], XmNbottomOffset, 0); ac++; + XtSetArg(al[ac], XmNbottomWidget, lock_time_text); ac++; + XtSetArg(al[ac], XmNleftAttachment, XmATTACH_FORM); ac++; + XtSetArg(al[ac], XmNleftOffset, 19); ac++; + XtSetArg(al[ac], XmNrightAttachment, XmATTACH_WIDGET); ac++; + XtSetArg(al[ac], XmNrightOffset, 4); ac++; + XtSetArg(al[ac], XmNrightWidget, lock_time_text); ac++; + XtSetValues ( widget18,al, ac ); + ac = 0; + + XtSetArg(al[ac], XmNtopAttachment, XmATTACH_OPPOSITE_WIDGET); ac++; + XtSetArg(al[ac], XmNtopOffset, 0); ac++; + XtSetArg(al[ac], XmNtopWidget, passwd_time_text); ac++; + XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_OPPOSITE_WIDGET); ac++; + XtSetArg(al[ac], XmNbottomOffset, 0); ac++; + XtSetArg(al[ac], XmNbottomWidget, passwd_time_text); ac++; + XtSetArg(al[ac], XmNleftAttachment, XmATTACH_FORM); ac++; + XtSetArg(al[ac], XmNleftOffset, 14); ac++; + XtSetArg(al[ac], XmNrightAttachment, XmATTACH_WIDGET); ac++; + XtSetArg(al[ac], XmNrightOffset, 4); ac++; + XtSetArg(al[ac], XmNrightWidget, passwd_time_text); ac++; + XtSetValues ( widget48,al, ac ); + ac = 0; + + XtSetArg(al[ac], XmNtopAttachment, XmATTACH_WIDGET); ac++; + XtSetArg(al[ac], XmNtopOffset, 4); ac++; + XtSetArg(al[ac], XmNtopWidget, widget13); ac++; + XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_NONE); ac++; + XtSetArg(al[ac], XmNleftAttachment, XmATTACH_FORM); ac++; + XtSetArg(al[ac], XmNleftOffset, 141); ac++; + XtSetArg(al[ac], XmNrightAttachment, XmATTACH_NONE); ac++; + XtSetValues ( timeout_text,al, ac ); + ac = 0; + + XtSetArg(al[ac], XmNtopAttachment, XmATTACH_WIDGET); ac++; + XtSetArg(al[ac], XmNtopOffset, 2); ac++; + XtSetArg(al[ac], XmNtopWidget, timeout_text); ac++; + XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_NONE); ac++; + XtSetArg(al[ac], XmNleftAttachment, XmATTACH_OPPOSITE_WIDGET); ac++; + XtSetArg(al[ac], XmNleftOffset, 0); ac++; + XtSetArg(al[ac], XmNleftWidget, timeout_text); ac++; + XtSetArg(al[ac], XmNrightAttachment, XmATTACH_NONE); ac++; + XtSetValues ( cycle_text,al, ac ); + ac = 0; + + XtSetArg(al[ac], XmNtopAttachment, XmATTACH_WIDGET); ac++; + XtSetArg(al[ac], XmNtopOffset, 2); ac++; + XtSetArg(al[ac], XmNtopWidget, cycle_text); ac++; + XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_NONE); ac++; + XtSetArg(al[ac], XmNleftAttachment, XmATTACH_OPPOSITE_WIDGET); ac++; + XtSetArg(al[ac], XmNleftOffset, 0); ac++; + XtSetArg(al[ac], XmNleftWidget, cycle_text); ac++; + XtSetArg(al[ac], XmNrightAttachment, XmATTACH_NONE); ac++; + XtSetValues ( fade_text,al, ac ); + ac = 0; + + XtSetArg(al[ac], XmNtopAttachment, XmATTACH_WIDGET); ac++; + XtSetArg(al[ac], XmNtopOffset, 2); ac++; + XtSetArg(al[ac], XmNtopWidget, fade_text); ac++; + XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_NONE); ac++; + XtSetArg(al[ac], XmNleftAttachment, XmATTACH_OPPOSITE_WIDGET); ac++; + XtSetArg(al[ac], XmNleftOffset, 0); ac++; + XtSetArg(al[ac], XmNleftWidget, fade_text); ac++; + XtSetArg(al[ac], XmNrightAttachment, XmATTACH_NONE); ac++; + XtSetValues ( ticks_text,al, ac ); + ac = 0; + + XtSetArg(al[ac], XmNtopAttachment, XmATTACH_WIDGET); ac++; + XtSetArg(al[ac], XmNtopOffset, 2); ac++; + XtSetArg(al[ac], XmNtopWidget, ticks_text); ac++; + XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_NONE); ac++; + XtSetArg(al[ac], XmNleftAttachment, XmATTACH_OPPOSITE_WIDGET); ac++; + XtSetArg(al[ac], XmNleftOffset, 0); ac++; + XtSetArg(al[ac], XmNleftWidget, ticks_text); ac++; + XtSetArg(al[ac], XmNrightAttachment, XmATTACH_NONE); ac++; + XtSetValues ( lock_time_text,al, ac ); + ac = 0; + + XtSetArg(al[ac], XmNtopAttachment, XmATTACH_WIDGET); ac++; + XtSetArg(al[ac], XmNtopOffset, 4); ac++; + XtSetArg(al[ac], XmNtopWidget, lock_time_text); ac++; + XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_NONE); ac++; + XtSetArg(al[ac], XmNleftAttachment, XmATTACH_OPPOSITE_WIDGET); ac++; + XtSetArg(al[ac], XmNleftOffset, 0); ac++; + XtSetArg(al[ac], XmNleftWidget, lock_time_text); ac++; + XtSetArg(al[ac], XmNrightAttachment, XmATTACH_NONE); ac++; + XtSetValues ( passwd_time_text,al, ac ); + ac = 0; + + XtSetArg(al[ac], XmNtopAttachment, XmATTACH_WIDGET); ac++; + XtSetArg(al[ac], XmNtopOffset, 4); ac++; + XtSetArg(al[ac], XmNtopWidget, widget13); ac++; + XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_OPPOSITE_WIDGET); ac++; + XtSetArg(al[ac], XmNbottomOffset, 0); ac++; + XtSetArg(al[ac], XmNbottomWidget, timeout_text); ac++; + XtSetArg(al[ac], XmNleftAttachment, XmATTACH_WIDGET); ac++; + XtSetArg(al[ac], XmNleftOffset, 20); ac++; + XtSetArg(al[ac], XmNleftWidget, timeout_text); ac++; + XtSetArg(al[ac], XmNrightAttachment, XmATTACH_FORM); ac++; + XtSetArg(al[ac], XmNrightOffset, 20); ac++; + XtSetValues ( verbose_toggle,al, ac ); + ac = 0; + + XtSetArg(al[ac], XmNtopAttachment, XmATTACH_OPPOSITE_WIDGET); ac++; + XtSetArg(al[ac], XmNtopOffset, 0); ac++; + XtSetArg(al[ac], XmNtopWidget, cycle_text); ac++; + XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_OPPOSITE_WIDGET); ac++; + XtSetArg(al[ac], XmNbottomOffset, 0); ac++; + XtSetArg(al[ac], XmNbottomWidget, cycle_text); ac++; + XtSetArg(al[ac], XmNleftAttachment, XmATTACH_OPPOSITE_WIDGET); ac++; + XtSetArg(al[ac], XmNleftOffset, 0); ac++; + XtSetArg(al[ac], XmNleftWidget, verbose_toggle); ac++; + XtSetArg(al[ac], XmNrightAttachment, XmATTACH_FORM); ac++; + XtSetArg(al[ac], XmNrightOffset, 20); ac++; + XtSetValues ( cmap_toggle,al, ac ); + ac = 0; + + XtSetArg(al[ac], XmNtopAttachment, XmATTACH_OPPOSITE_WIDGET); ac++; + XtSetArg(al[ac], XmNtopOffset, 0); ac++; + XtSetArg(al[ac], XmNtopWidget, fade_text); ac++; + XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_OPPOSITE_WIDGET); ac++; + XtSetArg(al[ac], XmNbottomOffset, 0); ac++; + XtSetArg(al[ac], XmNbottomWidget, fade_text); ac++; + XtSetArg(al[ac], XmNleftAttachment, XmATTACH_OPPOSITE_WIDGET); ac++; + XtSetArg(al[ac], XmNleftOffset, 0); ac++; + XtSetArg(al[ac], XmNleftWidget, cmap_toggle); ac++; + XtSetArg(al[ac], XmNrightAttachment, XmATTACH_FORM); ac++; + XtSetArg(al[ac], XmNrightOffset, 20); ac++; + XtSetValues ( fade_toggle,al, ac ); + ac = 0; + + XtSetArg(al[ac], XmNtopAttachment, XmATTACH_OPPOSITE_WIDGET); ac++; + XtSetArg(al[ac], XmNtopOffset, 0); ac++; + XtSetArg(al[ac], XmNtopWidget, ticks_text); ac++; + XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_OPPOSITE_WIDGET); ac++; + XtSetArg(al[ac], XmNbottomOffset, 0); ac++; + XtSetArg(al[ac], XmNbottomWidget, ticks_text); ac++; + XtSetArg(al[ac], XmNleftAttachment, XmATTACH_OPPOSITE_WIDGET); ac++; + XtSetArg(al[ac], XmNleftOffset, 0); ac++; + XtSetArg(al[ac], XmNleftWidget, fade_toggle); ac++; + XtSetArg(al[ac], XmNrightAttachment, XmATTACH_FORM); ac++; + XtSetArg(al[ac], XmNrightOffset, 20); ac++; + XtSetValues ( unfade_toggle,al, ac ); + ac = 0; + + XtSetArg(al[ac], XmNtopAttachment, XmATTACH_OPPOSITE_WIDGET); ac++; + XtSetArg(al[ac], XmNtopOffset, 0); ac++; + XtSetArg(al[ac], XmNtopWidget, lock_time_text); ac++; + XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_OPPOSITE_WIDGET); ac++; + XtSetArg(al[ac], XmNbottomOffset, 0); ac++; + XtSetArg(al[ac], XmNbottomWidget, lock_time_text); ac++; + XtSetArg(al[ac], XmNleftAttachment, XmATTACH_OPPOSITE_WIDGET); ac++; + XtSetArg(al[ac], XmNleftOffset, 0); ac++; + XtSetArg(al[ac], XmNleftWidget, unfade_toggle); ac++; + XtSetArg(al[ac], XmNrightAttachment, XmATTACH_FORM); ac++; + XtSetArg(al[ac], XmNrightOffset, 20); ac++; + XtSetValues ( lock_toggle,al, ac ); + ac = 0; + + XtSetArg(al[ac], XmNtopAttachment, XmATTACH_WIDGET); ac++; + XtSetArg(al[ac], XmNtopOffset, 0); ac++; + XtSetArg(al[ac], XmNtopWidget, passwd_time_text); ac++; + XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_WIDGET); ac++; + XtSetArg(al[ac], XmNbottomOffset, 4); ac++; + XtSetArg(al[ac], XmNbottomWidget, res_done); ac++; + XtSetArg(al[ac], XmNleftAttachment, XmATTACH_FORM); ac++; + XtSetArg(al[ac], XmNrightAttachment, XmATTACH_FORM); ac++; + XtSetValues ( widget29,al, ac ); + ac = 0; + + XtSetArg(al[ac], XmNtopAttachment, XmATTACH_NONE); ac++; + XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_FORM); ac++; + XtSetArg(al[ac], XmNbottomOffset, 4); ac++; + XtSetArg(al[ac], XmNleftAttachment, XmATTACH_FORM); ac++; + XtSetArg(al[ac], XmNleftOffset, 4); ac++; + XtSetArg(al[ac], XmNrightAttachment, XmATTACH_NONE); ac++; + XtSetValues ( res_done,al, ac ); + ac = 0; + + XtSetArg(al[ac], XmNtopAttachment, XmATTACH_NONE); ac++; + XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_FORM); ac++; + XtSetArg(al[ac], XmNbottomOffset, 4); ac++; + XtSetArg(al[ac], XmNleftAttachment, XmATTACH_WIDGET); ac++; + XtSetArg(al[ac], XmNleftOffset, 4); ac++; + XtSetArg(al[ac], XmNleftWidget, res_done); ac++; + XtSetArg(al[ac], XmNrightAttachment, XmATTACH_NONE); ac++; + XtSetValues ( res_cancel,al, ac ); + ac = 0; + children[ac++] = widget12; + children[ac++] = widget13; + children[ac++] = widget14; + children[ac++] = widget15; + children[ac++] = widget16; + children[ac++] = widget17; + children[ac++] = widget18; + children[ac++] = widget48; + children[ac++] = timeout_text; + children[ac++] = cycle_text; + children[ac++] = fade_text; + children[ac++] = ticks_text; + children[ac++] = lock_time_text; + children[ac++] = passwd_time_text; + children[ac++] = verbose_toggle; + children[ac++] = cmap_toggle; + children[ac++] = fade_toggle; + children[ac++] = unfade_toggle; + children[ac++] = lock_toggle; + children[ac++] = widget29; + children[ac++] = res_done; + children[ac++] = res_cancel; + XtManageChildren(children, ac); + ac = 0; +} + + + +void +create_demo_dialog( parent ) +Widget parent; +{ + Widget children[11]; /* Children to manage */ + Arg al[64]; /* Arg List */ + register int ac = 0; /* Arg Count */ + XmString xmstrings[15]; /* temporary storage for XmStrings */ + + + /* #### Hacked by hand, not generated by XDesigner */ + ac = 0; + XtSetArg (al[ac], XmNvisual, visual); ac++; + XtSetArg (al[ac], XmNcolormap, cmap); ac++; + XtSetArg (al[ac], XmNdepth, visual_depth); ac++; + + + demo_dialog = XmCreateDialogShell ( parent, "demoDialog", al, ac ); + demo_form = XmCreateForm ( demo_dialog, "demoForm", al, ac ); + label1 = XmCreateLabel ( demo_form, "label1", al, ac ); + label2 = XmCreateLabel ( demo_form, "label2", al, ac ); + demo_list = XmCreateScrolledList ( demo_form, "demoList", al, ac ); + text_area = XtParent ( demo_list ); + + /* #### Hacked by hand, not generated by XDesigner */ + ac = 0; + + + text_line = XmCreateTextField ( demo_form, "textLine", al, ac ); + vline = XmCreateSeparator ( demo_form, "vline", al, ac ); + next = XmCreatePushButton ( demo_form, "next", al, ac ); + prev = XmCreatePushButton ( demo_form, "prev", al, ac ); + edit = XmCreatePushButton ( demo_form, "edit", al, ac ); + done = XmCreatePushButton ( demo_form, "done", al, ac ); + restart = XmCreatePushButton ( demo_form, "restart", al, ac ); + xmstrings[0] = XmStringCreateLtoR(" ", (XmStringCharSet)XmSTRING_DEFAULT_CHARSET); + XtSetArg(al[ac], XmNlabelString, xmstrings[0]); ac++; + spacer = XmCreateLabel ( demo_form, "spacer", al, ac ); + ac = 0; + XmStringFree ( xmstrings [ 0 ] ); + + XtSetArg(al[ac], XmNtopAttachment, XmATTACH_FORM); ac++; + XtSetArg(al[ac], XmNtopOffset, 5); ac++; + XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_NONE); ac++; + XtSetArg(al[ac], XmNleftAttachment, XmATTACH_FORM); ac++; + XtSetArg(al[ac], XmNleftOffset, 4); ac++; + XtSetArg(al[ac], XmNrightAttachment, XmATTACH_FORM); ac++; + XtSetArg(al[ac], XmNrightOffset, 4); ac++; + XtSetValues ( label1,al, ac ); + ac = 0; + + XtSetArg(al[ac], XmNtopAttachment, XmATTACH_WIDGET); ac++; + XtSetArg(al[ac], XmNtopOffset, 4); ac++; + XtSetArg(al[ac], XmNtopWidget, label1); ac++; + XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_NONE); ac++; + XtSetArg(al[ac], XmNleftAttachment, XmATTACH_FORM); ac++; + XtSetArg(al[ac], XmNleftOffset, 4); ac++; + XtSetArg(al[ac], XmNrightAttachment, XmATTACH_FORM); ac++; + XtSetArg(al[ac], XmNrightOffset, 4); ac++; + XtSetValues ( label2,al, ac ); + ac = 0; + + XtSetArg(al[ac], XmNtopAttachment, XmATTACH_WIDGET); ac++; + XtSetArg(al[ac], XmNtopOffset, 4); ac++; + XtSetArg(al[ac], XmNtopWidget, label2); ac++; + XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_WIDGET); ac++; + XtSetArg(al[ac], XmNbottomOffset, 4); ac++; + XtSetArg(al[ac], XmNbottomWidget, text_line); ac++; + XtSetArg(al[ac], XmNleftAttachment, XmATTACH_FORM); ac++; + XtSetArg(al[ac], XmNleftOffset, 4); ac++; + XtSetArg(al[ac], XmNrightAttachment, XmATTACH_FORM); ac++; + XtSetArg(al[ac], XmNrightOffset, 4); ac++; + XtSetValues ( text_area,al, ac ); + ac = 0; + + XtSetArg(al[ac], XmNtopAttachment, XmATTACH_NONE); ac++; + XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_WIDGET); ac++; + XtSetArg(al[ac], XmNbottomOffset, 4); ac++; + XtSetArg(al[ac], XmNbottomWidget, vline); ac++; + XtSetArg(al[ac], XmNleftAttachment, XmATTACH_FORM); ac++; + XtSetArg(al[ac], XmNleftOffset, 4); ac++; + XtSetArg(al[ac], XmNrightAttachment, XmATTACH_FORM); ac++; + XtSetArg(al[ac], XmNrightOffset, 4); ac++; + XtSetValues ( text_line,al, ac ); + ac = 0; + + XtSetArg(al[ac], XmNtopAttachment, XmATTACH_NONE); ac++; + XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_WIDGET); ac++; + XtSetArg(al[ac], XmNbottomOffset, 4); ac++; + XtSetArg(al[ac], XmNbottomWidget, next); ac++; + XtSetArg(al[ac], XmNleftAttachment, XmATTACH_FORM); ac++; + XtSetArg(al[ac], XmNleftOffset, 4); ac++; + XtSetArg(al[ac], XmNrightAttachment, XmATTACH_FORM); ac++; + XtSetArg(al[ac], XmNrightOffset, 4); ac++; + XtSetValues ( vline,al, ac ); + ac = 0; + + XtSetArg(al[ac], XmNtopAttachment, XmATTACH_NONE); ac++; + XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_FORM); ac++; + XtSetArg(al[ac], XmNbottomOffset, 4); ac++; + XtSetArg(al[ac], XmNleftAttachment, XmATTACH_FORM); ac++; + XtSetArg(al[ac], XmNleftOffset, 3); ac++; + XtSetArg(al[ac], XmNrightAttachment, XmATTACH_NONE); ac++; + XtSetValues ( next,al, ac ); + ac = 0; + + XtSetArg(al[ac], XmNtopAttachment, XmATTACH_OPPOSITE_WIDGET); ac++; + XtSetArg(al[ac], XmNtopOffset, 0); ac++; + XtSetArg(al[ac], XmNtopWidget, next); ac++; + XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_FORM); ac++; + XtSetArg(al[ac], XmNbottomOffset, 4); ac++; + XtSetArg(al[ac], XmNleftAttachment, XmATTACH_WIDGET); ac++; + XtSetArg(al[ac], XmNleftOffset, 4); ac++; + XtSetArg(al[ac], XmNleftWidget, next); ac++; + XtSetArg(al[ac], XmNrightAttachment, XmATTACH_NONE); ac++; + XtSetValues ( prev,al, ac ); + ac = 0; + + XtSetArg(al[ac], XmNtopAttachment, XmATTACH_OPPOSITE_WIDGET); ac++; + XtSetArg(al[ac], XmNtopOffset, 0); ac++; + XtSetArg(al[ac], XmNtopWidget, prev); ac++; + XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_FORM); ac++; + XtSetArg(al[ac], XmNbottomOffset, 4); ac++; + XtSetArg(al[ac], XmNleftAttachment, XmATTACH_WIDGET); ac++; + XtSetArg(al[ac], XmNleftOffset, 4); ac++; + XtSetArg(al[ac], XmNleftWidget, prev); ac++; + XtSetArg(al[ac], XmNrightAttachment, XmATTACH_NONE); ac++; + XtSetValues ( edit,al, ac ); + ac = 0; + + XtSetArg(al[ac], XmNtopAttachment, XmATTACH_OPPOSITE_WIDGET); ac++; + XtSetArg(al[ac], XmNtopOffset, 0); ac++; + XtSetArg(al[ac], XmNtopWidget, edit); ac++; + XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_FORM); ac++; + XtSetArg(al[ac], XmNbottomOffset, 4); ac++; + XtSetArg(al[ac], XmNleftAttachment, XmATTACH_WIDGET); ac++; + XtSetArg(al[ac], XmNleftOffset, 4); ac++; + XtSetArg(al[ac], XmNleftWidget, edit); ac++; + XtSetArg(al[ac], XmNrightAttachment, XmATTACH_NONE); ac++; + XtSetValues ( done,al, ac ); + ac = 0; + + XtSetArg(al[ac], XmNtopAttachment, XmATTACH_OPPOSITE_WIDGET); ac++; + XtSetArg(al[ac], XmNtopOffset, 0); ac++; + XtSetArg(al[ac], XmNtopWidget, done); ac++; + XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_FORM); ac++; + XtSetArg(al[ac], XmNbottomOffset, 4); ac++; + XtSetArg(al[ac], XmNleftAttachment, XmATTACH_WIDGET); ac++; + XtSetArg(al[ac], XmNleftOffset, 4); ac++; + XtSetArg(al[ac], XmNleftWidget, done); ac++; + XtSetArg(al[ac], XmNrightAttachment, XmATTACH_NONE); ac++; + XtSetValues ( restart,al, ac ); + ac = 0; + + XtSetArg(al[ac], XmNtopAttachment, XmATTACH_OPPOSITE_WIDGET); ac++; + XtSetArg(al[ac], XmNtopOffset, 0); ac++; + XtSetArg(al[ac], XmNtopWidget, restart); ac++; + XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_FORM); ac++; + XtSetArg(al[ac], XmNbottomOffset, 4); ac++; + XtSetArg(al[ac], XmNleftAttachment, XmATTACH_WIDGET); ac++; + XtSetArg(al[ac], XmNleftOffset, 4); ac++; + XtSetArg(al[ac], XmNleftWidget, restart); ac++; + XtSetArg(al[ac], XmNrightAttachment, XmATTACH_FORM); ac++; + XtSetArg(al[ac], XmNrightOffset, 4); ac++; + XtSetValues ( spacer,al, ac ); + ac = 0; + XtManageChild(demo_list); + children[ac++] = label1; + children[ac++] = label2; + children[ac++] = text_line; + children[ac++] = vline; + children[ac++] = next; + children[ac++] = prev; + children[ac++] = edit; + children[ac++] = done; + children[ac++] = restart; + children[ac++] = spacer; + XtManageChildren(children, ac); + ac = 0; +} + + diff --git a/driver/dialogs.xd b/driver/dialogs.xd new file mode 100755 index 00000000..ad1f6da0 --- /dev/null +++ b/driver/dialogs.xd @@ -0,0 +1,569 @@ +module 'XScreenSaver' +applicationName = 'XScreenSaver'; +generateNameC = 'dialogs.c'; +generateNameUIL = ''; +generateNameResDB = 'dialogs.ad'; +generateUidFile = ''; +generateMask = 1507557; +useMask = 1; +value +object 'passwd_dialog' : XmDialogShell { + arguments { + name = 'passwdDialog'; + XmNtitle= 'XScreenSaver'; + XmNallowShellResize= true; + }; +object 'passwd_form' : XmForm { + arguments { + name = 'passwdForm'; + XmNautoUnmanage= false; + }; +object 'roger_label' : XmDrawnButton { + arguments { + name = 'rogerLabel'; + XmNwidth= 150; + }; +}; +object 'passwd_label1' : XmLabel { + arguments { + name = 'passwdLabel1'; + XmNlabelString= 'XScreenSaver %s'; + XmNalignment= 0; + }; +}; +object '' : XmLabel { + arguments { + name = 'passwdLabel2'; + XmNlabelString= 'This display is locked.'; + XmNalignment= 0; + }; +}; +object 'passwd_label3' : XmLabel { + arguments { + name = 'passwdLabel3'; + XmNlabelString= 'Please type %s\'s password to unlock it.'; + XmNalignment= 0; + }; +}; +object 'passwd_text' : XmTextField { + arguments { + name = 'passwdText'; + }; +}; +object '' : XmSeparator { + arguments { + }; +}; +object 'passwd_done' : XmPushButton { + arguments { + name = 'passwdDone'; + XmNlabelString= 'Done'; + }; +}; +object 'passwd_cancel' : XmPushButton { + arguments { + name = 'passwdCancel'; + XmNlabelString= 'Cancel'; + }; +}; + attachments { + attachment { + XmNrightAttachment = 0 0 0; + XmNleftAttachment = 1 0 4; + XmNbottomAttachment = 1 0 4; + XmNtopAttachment = 1 0 4; + }; + attachment { + XmNrightAttachment = 1 0 4; + XmNleftAttachment = 3 1 4; + XmNbottomAttachment = 3 3 4; + XmNtopAttachment = 1 0 4; + }; + attachment { + XmNrightAttachment = 1 0 4; + XmNleftAttachment = 3 1 4; + XmNbottomAttachment = 3 4 4; + XmNtopAttachment = 0 0 0; + }; + attachment { + XmNrightAttachment = 1 0 30; + XmNleftAttachment = 3 1 4; + XmNbottomAttachment = 3 5 4; + XmNtopAttachment = 0 0 0; + }; + attachment { + XmNrightAttachment = 1 0 4; + XmNleftAttachment = 3 1 4; + XmNbottomAttachment = 3 6 4; + XmNtopAttachment = 0 0 0; + }; + attachment { + XmNrightAttachment = 1 0 0; + XmNleftAttachment = 3 1 0; + XmNbottomAttachment = 3 7 4; + XmNtopAttachment = 0 0 0; + }; + attachment { + XmNrightAttachment = 0 0 0; + XmNleftAttachment = 3 1 4; + XmNbottomAttachment = 1 0 4; + XmNtopAttachment = 0 0 0; + }; + attachment { + XmNrightAttachment = 0 0 0; + XmNleftAttachment = 3 7 4; + XmNbottomAttachment = 1 0 4; + XmNtopAttachment = 0 0 0; + }; + }; +}; +}; +object 'resources_dialog' : XmDialogShell { + arguments { + name = 'resourcesDialog'; + XmNtitle= 'XScreenSaver'; + XmNallowShellResize= true; + }; +object 'resources_form' : XmForm { + arguments { + name = 'resourcesForm'; + XmNautoUnmanage= false; + }; +object '' : XmLabel { + arguments { + name = 'resourcesLabel'; + XmNlabelString= 'XScreenSaver Parameters'; + }; +}; +object '' : XmSeparator { + arguments { + }; +}; +object '' : XmLabel { + arguments { + name = 'timeoutLabel'; + XmNlabelString= 'Timeout Minutes'; + XmNalignment= * 2; + }; +}; +object '' : XmLabel { + arguments { + name = 'cycleLabel'; + XmNlabelString= 'Cycle Seconds'; + XmNalignment= * 2; + }; +}; +object '' : XmLabel { + arguments { + name = 'fadeSecondsLabel'; + XmNlabelString= 'Fade Seconds'; + XmNalignment= * 2; + }; +}; +object '' : XmLabel { + arguments { + name = 'fadeTicksLabel'; + XmNlabelString= 'Fade Ticks'; + XmNalignment= * 2; + }; +}; +object '' : XmLabel { + arguments { + name = 'lockLabel'; + XmNlabelString= 'Lock Timeout'; + XmNalignment= * 2; + }; +}; +object '' : XmLabel { + arguments { + name = 'passwdLabel'; + XmNlabelString= 'Password Timeout'; + XmNalignment= * 2; + }; +}; +object 'timeout_text' : XmTextField { + arguments { + name = 'timeoutText'; + XmNcolumns= 5; + }; +}; +object 'cycle_text' : XmTextField { + arguments { + name = 'cycleText'; + XmNcolumns= 5; + }; +}; +object 'fade_text' : XmTextField { + arguments { + name = 'fadeSecondsText'; + XmNcolumns= 5; + }; +}; +object 'ticks_text' : XmTextField { + arguments { + name = 'fadeTicksText'; + XmNcolumns= 5; + }; +}; +object 'lock_time_text' : XmTextField { + arguments { + name = 'passwdText'; + XmNcolumns= 5; + }; +}; +object 'passwd_time_text' : XmTextField { + arguments { + name = 'lockText'; + XmNcolumns= 5; + }; +}; +object 'verbose_toggle' : XmToggleButton { + arguments { + name = 'verboseToggle'; + XmNlabelString= 'Verbose'; + XmNalignment= * 0; + }; +}; +object 'cmap_toggle' : XmToggleButton { + arguments { + name = 'cmapToggle'; + XmNlabelString= 'Install Colormap'; + XmNalignment= * 0; + }; +}; +object 'fade_toggle' : XmToggleButton { + arguments { + name = 'fadeToggle'; + XmNlabelString= 'Fade Colormap'; + XmNalignment= * 0; + }; +}; +object 'unfade_toggle' : XmToggleButton { + arguments { + name = 'unfadeToggle'; + XmNlabelString= 'Unfade Colormap'; + XmNalignment= * 0; + }; +}; +object 'lock_toggle' : XmToggleButton { + arguments { + name = 'lockToggle'; + XmNlabelString= 'Require Password'; + XmNalignment= * 0; + }; +}; +object '' : XmSeparator { + arguments { + }; +}; +object 'res_done' : XmPushButton { + arguments { + name = 'resourcesDone'; + XmNlabelString= 'Done'; + }; +}; +object 'res_cancel' : XmPushButton { + arguments { + name = 'resourcesCancel'; + XmNlabelString= 'Cancel'; + }; +}; + attachments { + attachment { + XmNrightAttachment = 1 0 4; + XmNleftAttachment = 1 0 4; + XmNtopAttachment = 1 0 4; + }; + attachment { + XmNrightAttachment = 1 0 0; + XmNleftAttachment = 1 0 0; + XmNbottomAttachment = 0 0 0; + XmNtopAttachment = 3 1 4; + }; + attachment { + XmNrightAttachment = 3 9 4; + XmNleftAttachment = 1 0 20; + XmNbottomAttachment = 4 9; + XmNtopAttachment = 3 2 4; + }; + attachment { + XmNrightAttachment = 3 10 4; + XmNleftAttachment = 1 0 20; + XmNbottomAttachment = 4 10 0; + XmNtopAttachment = 4 10 0; + }; + attachment { + XmNrightAttachment = 3 11 4; + XmNleftAttachment = 1 0 20; + XmNbottomAttachment = 4 11 0; + XmNtopAttachment = 4 11 0; + }; + attachment { + XmNrightAttachment = 3 12 4; + XmNleftAttachment = 1 0 20; + XmNbottomAttachment = 4 12 0; + XmNtopAttachment = 4 12 0; + }; + attachment { + XmNrightAttachment = 3 13 4; + XmNleftAttachment = 1 0 19; + XmNbottomAttachment = 4 13 0; + XmNtopAttachment = 4 13 0; + }; + attachment { + XmNrightAttachment = 3 14 4; + XmNleftAttachment = 1 0 14; + XmNbottomAttachment = 4 14 0; + XmNtopAttachment = 4 14 0; + }; + attachment { + XmNrightAttachment = 0 0 0; + XmNleftAttachment = 1 0 141; + XmNbottomAttachment = 0 0 0; + XmNtopAttachment = 3 2 4; + }; + attachment { + XmNrightAttachment = 0 0 0; + XmNleftAttachment = 4 9 0; + XmNbottomAttachment = 0 0 0; + XmNtopAttachment = 3 9 2; + }; + attachment { + XmNrightAttachment = 0 0 0; + XmNleftAttachment = 4 10 0; + XmNbottomAttachment = 0 0 0; + XmNtopAttachment = 3 10 2; + }; + attachment { + XmNrightAttachment = 0 0 0; + XmNleftAttachment = 4 11 0; + XmNbottomAttachment = 0 0 0; + XmNtopAttachment = 3 11 2; + }; + attachment { + XmNrightAttachment = 0 0 0; + XmNleftAttachment = 4 12 0; + XmNbottomAttachment = 0 0 0; + XmNtopAttachment = 3 12 2; + }; + attachment { + XmNrightAttachment = 0 0 0; + XmNleftAttachment = 4 13 0; + XmNbottomAttachment = 0 0 0; + XmNtopAttachment = 3 13 4; + }; + attachment { + XmNrightAttachment = 1 0 20; + XmNleftAttachment = 3 9 20; + XmNbottomAttachment = 4 9 0; + XmNtopAttachment = 3 2 4; + }; + attachment { + XmNrightAttachment = 1 0 20; + XmNleftAttachment = 4 15 0; + XmNbottomAttachment = 4 10 0; + XmNtopAttachment = 4 10 0; + }; + attachment { + XmNrightAttachment = 1 0 20; + XmNleftAttachment = 4 16 0; + XmNbottomAttachment = 4 11 0; + XmNtopAttachment = 4 11 0; + }; + attachment { + XmNrightAttachment = 1 0 20; + XmNleftAttachment = 4 17 0; + XmNbottomAttachment = 4 12 0; + XmNtopAttachment = 4 12 0; + }; + attachment { + XmNrightAttachment = 1 0 20; + XmNleftAttachment = 4 18 0; + XmNbottomAttachment = 4 13 0; + XmNtopAttachment = 4 13 0; + }; + attachment { + XmNrightAttachment = 1 0; + XmNleftAttachment = 1 0; + XmNbottomAttachment = 3 21 4; + XmNtopAttachment = 3 14 0; + }; + attachment { + XmNrightAttachment = 0 0 0; + XmNleftAttachment = 1 0 4; + XmNbottomAttachment = 1 0 4; + XmNtopAttachment = 0 0 0; + }; + attachment { + XmNrightAttachment = 0 0 0; + XmNleftAttachment = 3 21 4; + XmNbottomAttachment = 1 0 4; + XmNtopAttachment = 0 0 0; + }; + }; +}; +}; +object 'demo_dialog' : XmDialogShell { + arguments { + name = 'demoDialog'; + XmNtitle= 'XScreenSaver'; + XmNmaxWidth= 500; + XmNallowShellResize= true; + }; +object 'demo_form' : XmForm { + arguments { + name = 'demoForm'; + XmNautoUnmanage= false; + }; +object 'label1' : XmLabel { + arguments { + name = 'label1'; + XmNlabelString= 'XScreenSaver %s'; + }; +}; +object 'label2' : XmLabel { + arguments { + name = 'label2'; + XmNlabelString= 'Copyright © 1991-1994 by Jamie Zawinski '; + }; +}; +object 'text_area' : XmScrolledList { + arguments { + name = 'textArea'; + }; +object '' : XmScrollBar { + arguments { + name = 'ListhScrollBar'; + }; +}; +object '' : XmScrollBar { + arguments { + name = 'ListvScrollBar'; + }; +}; +object 'demo_list' : XmList { + arguments { + name = 'demoList'; + XmNvisibleItemCount= 10; + XmNautomaticSelection= true; + XmNlistSizePolicy= 2; + }; +}; +}; +object 'text_line' : XmTextField { + arguments { + name = 'textLine'; + }; +}; +object 'vline' : XmSeparator { + arguments { + name = 'vline'; + }; +}; +object 'next' : XmPushButton { + arguments { + name = 'next'; + XmNlabelString= 'Run Next'; + }; +}; +object 'prev' : XmPushButton { + arguments { + name = 'prev'; + XmNlabelString= 'Run Previous'; + }; +}; +object 'edit' : XmPushButton { + arguments { + name = 'edit'; + XmNlabelString= 'Edit Parameters'; + }; +}; +object 'done' : XmPushButton { + arguments { + name = 'done'; + XmNlabelString= 'Exit Demo Mode'; + }; +}; +object 'restart' : XmPushButton { + arguments { + name = 'restart'; + XmNlabelString= 'Restart Screen Saver'; + }; +}; +object 'spacer' : XmLabel { + arguments { + name = 'spacer'; + XmNlabelString= * ' '; + }; +}; + attachments { + attachment { + XmNrightAttachment = 1 0 4; + XmNleftAttachment = 1 0 4; + XmNbottomAttachment = 0 0 0; + XmNtopAttachment = 1 0 5; + }; + attachment { + XmNrightAttachment = 1 0 4; + XmNleftAttachment = 1 0 4; + XmNbottomAttachment = 0 0 0; + XmNtopAttachment = 3 1 4; + }; + attachment { + XmNrightAttachment = 1 0 4; + XmNleftAttachment = 1 0 4; + XmNbottomAttachment = 3 4 4; + XmNtopAttachment = 3 2 4; + }; + attachment { + XmNrightAttachment = 1 0 4; + XmNleftAttachment = 1 0 4; + XmNbottomAttachment = 3 5 4; + XmNtopAttachment = 0 0 0; + }; + attachment { + XmNrightAttachment = 1 0 4; + XmNleftAttachment = 1 0 4; + XmNbottomAttachment = 3 6 4; + XmNtopAttachment = 0 0 0; + }; + attachment { + XmNrightAttachment = 0 0 0; + XmNleftAttachment = 1 0 3; + XmNbottomAttachment = 1 0 4; + XmNtopAttachment = 0 0 0; + }; + attachment { + XmNrightAttachment = 0 0 0; + XmNleftAttachment = 3 6 4; + XmNbottomAttachment = 1 0 4; + XmNtopAttachment = 4 6 0; + }; + attachment { + XmNrightAttachment = 0 0 0; + XmNleftAttachment = 3 7 4; + XmNbottomAttachment = 1 0 4; + XmNtopAttachment = 4 7 0; + }; + attachment { + XmNrightAttachment = 0 0 0; + XmNleftAttachment = 3 8 4; + XmNbottomAttachment = 1 0 4; + XmNtopAttachment = 4 8 0; + }; + attachment { + XmNrightAttachment = 0 0 0; + XmNleftAttachment = 3 9 4; + XmNbottomAttachment = 1 0 4; + XmNtopAttachment = 4 9 0; + }; + attachment { + XmNrightAttachment = 1 0 4; + XmNleftAttachment = 3 10 4; + XmNbottomAttachment = 1 0 4; + XmNtopAttachment = 4 10 0; + }; + }; +}; +}; +end module; diff --git a/driver/getpwnam.c b/driver/getpwnam.c new file mode 100755 index 00000000..b72dde3b --- /dev/null +++ b/driver/getpwnam.c @@ -0,0 +1,132 @@ +/* + * getpwnam(name) - retrieves a UAF entry + * + * Author: Patrick L. Mahan + * Location: TGV, Inc + * Date: 15-Nov-1991 + * + * Purpose: Provides emulation for the UNIX getpwname routine. + * + * Modification History + * + * Date | Who | Version | Reason + * ------------+-----------+---------------+--------------------------- + * 15-Nov-1991 | PLM | 1.0 | First Write + */ + +#define PASSWDROUTINES + +#include +#include +#include +#include +#include +#include +#include "pwd.h" + +struct uic { + unsigned short uid; + unsigned short gid; +}; + +#define TEST(ptr, str) { if (ptr == NULL) { \ + fprintf(stderr, "getpwnam: memory allocation failure for \"%s\"\n", \ + str); \ + return ((struct passwd *)(NULL)); \ + } } + +struct passwd *getpwnam(name) +char *name; +{ + int istatus; + int UserNameLen; + int UserOwnerLen; + int UserDeviceLen; + int UserDirLen; + static char UserName[13]; + static char UserOwner[32]; + static char UserDevice[32]; + static char UserDir[64]; + char *cptr, *sptr; + unsigned long int UserPwd[2]; + unsigned short int UserSalt; + unsigned long int UserEncrypt; + struct uic UicValue; + struct passwd *entry; + + struct dsc$descriptor_s VMSNAME = + {strlen(name), DSC$K_DTYPE_T, DSC$K_CLASS_S, name}; + + struct itmlist3 { + unsigned short int length; + unsigned short int item; + unsigned long int addr; + unsigned long int retaddr; + } ItemList[] = { + {12, UAI$_USERNAME, (unsigned long)&UserName, (unsigned long)&UserNameLen}, + {8, UAI$_PWD, (unsigned long)&UserPwd, 0}, + {4, UAI$_UIC, (unsigned long)&UicValue, 0}, + {32, UAI$_OWNER, (unsigned long)&UserOwner, (unsigned long)&UserOwnerLen}, + {32, UAI$_DEFDEV, (unsigned long)&UserDevice, (unsigned long)&UserDeviceLen}, + {64, UAI$_DEFDIR, (unsigned long)&UserDir, (unsigned long)&UserDirLen}, + {2, UAI$_SALT, (unsigned long)&UserSalt, 0}, + {4, UAI$_ENCRYPT, (unsigned long)&UserEncrypt, 0}, + {0, 0, 0, 0} + }; + + UserNameLen = 0; + istatus = sys$getuai (0, 0, &VMSNAME, &ItemList, 0, 0, 0); + + if (!(istatus & 1)) { +#ifdef DEBUG + lib$signal(istatus); +#endif /* DEBUG */ + fprintf (stderr, "getpwnam: unable to retrieve passwd entry for %s\n", + name); + fprintf (stderr, "getpwnam: vms error number is 0x%x\n", istatus); + return ((struct passwd *)NULL); + } + + entry = (struct passwd *) calloc (1, sizeof(struct passwd)); + TEST(entry, "PASSWD_ENTRY"); + + entry->pw_uid = UicValue.uid; + entry->pw_gid = UicValue.gid; + entry->pw_salt = UserSalt; + entry->pw_encrypt = UserEncrypt; + + sptr = UserName; + cptr = calloc (UserNameLen+1, sizeof(char)); + TEST(cptr, "USERNAME"); + strncpy (cptr, sptr, UserNameLen); + cptr[UserNameLen] = '\0'; + entry->pw_name = cptr; + + cptr = calloc(8, sizeof(char)); + TEST(cptr, "PASSWORD"); + memcpy(cptr, UserPwd, 8); + entry->pw_passwd = cptr; + + sptr = UserOwner; sptr++; + cptr = calloc ((int)UserOwner[0]+1, sizeof(char)); + TEST(cptr, "FULLNAME"); + strncpy (cptr, sptr, (int)UserOwner[0]); + cptr[(int)UserOwner[0]] = '\0'; + entry->pw_gecos = cptr; + + cptr = calloc ((int)UserDevice[0]+(int)UserDir[0]+1, sizeof(char)); + TEST(cptr, "HOME"); + sptr = UserDevice; sptr++; + strncpy (cptr, sptr, (int)UserDevice[0]); + sptr = UserDir; sptr++; + strncat (cptr, sptr, (int)UserDir[0]); + cptr[(int)UserDevice[0]+(int)UserDir[0]] = '\0'; + entry->pw_dir = cptr; + + cptr = calloc (strlen("SYS$SYSTEM:LOGINOUT.EXE")+1, sizeof(char)); + TEST(cptr,"SHELL"); + strcpy (cptr, "SYS$SYSTEM:LOGINOUT.EXE"); + entry->pw_shell = cptr; + + return (entry); +} diff --git a/driver/getpwuid.c b/driver/getpwuid.c new file mode 100755 index 00000000..e80e0a9b --- /dev/null +++ b/driver/getpwuid.c @@ -0,0 +1,56 @@ +/* + * Here is a replacement for getpwuid for VMS. It returns pointers + * to userid (*pw_name) and owner (*pw_gecos) only. Other fields + * may be added later. + * Note that sys$getuai returns owner as a counted string. + */ + +#include +#include +#include "pwd.h" + +char *t_userid, owner[40]; +static char vms_userid[16]; +static char vms_owner[40]; +static struct passwd vms_passwd; + +struct passwd *getpwuid() +{ +#define UAI$_OWNER 12 +struct dsc$descriptor_s +{ + unsigned short dsc$w_length; + unsigned char dsc$b_dtype; + unsigned char dsc$b_class; + char *dsc$a_pointer; +} user_desc = {0, 14, 1, NULL}; + int status, sys$getuai(),length; + struct { + short buffer_length; + short item_code; + int *buffer_address; + int *return_length_address; + int terminator; + } itmlst; + + t_userid = cuserid((char *) NULL); + user_desc.dsc$w_length = strlen(t_userid); + user_desc.dsc$a_pointer = t_userid; + itmlst.buffer_length = sizeof(owner); + itmlst.item_code = UAI$_OWNER; + itmlst.buffer_address = (int *)owner; + itmlst.return_length_address = &length; + itmlst.terminator = 0; + status = sys$getuai(0, 0, &user_desc, &itmlst, 0, 0, 0); + if(status == 1) { + length = (int)owner[0]; + strcpy(vms_userid, t_userid); + strcpy(vms_owner, &owner[1]); + } else { + vms_userid[0] = '\0'; + vms_owner[0] = '\0'; + } + vms_passwd.pw_name = vms_userid; + vms_passwd.pw_gecos = vms_owner; + return (&vms_passwd); +} diff --git a/driver/hpwd.c b/driver/hpwd.c new file mode 100755 index 00000000..30e71457 --- /dev/null +++ b/driver/hpwd.c @@ -0,0 +1,68 @@ +/* + * VAX/VMS Password hashing routines: + * + * uses the System Service SYS$HASH_PASSWORD + * + */ + +#include +#include +#include +#include +/* + * Hashing routine + */ +hash_vms_password(output_buf,input_buf,input_length,username,encryption_type,salt) +char *output_buf; +char *input_buf; +int input_length; +char *username; +int encryption_type; +unsigned short salt; +{ + struct dsc$descriptor_s password; + struct dsc$descriptor_s user; + + /* + * Check the VMS Version. If this is V5.4 or later, then + * we can use the new system service SYS$HASH_PASSWORD. Else + * fail and return garbage. + */ + + static char VMS_Version[32]; + struct { + unsigned short int Size; + unsigned short int Code; + char *Buffer; + unsigned short int *Resultant_Size; + } Item_List[2]={32, SYI$_VERSION, VMS_Version, 0, 0, 0}; + struct {int Size; char *Ptr;} Descr1; + + /* + * Get the information + */ + sys$getsyiw(0,0,0,Item_List,0,0,0); + /* + * Call the old routine if this isn't V5.4 or later... + */ +#ifndef __DECC + if ((VMS_Version[1] < '5') || + ((VMS_Version[1] == '5') && (VMS_Version[3] < '4'))) { + printf("None supported OS version\n"); + return(1); + } +#endif /* !__DECC */ + /* + * Call the SYS$HASH_PASSWORD system service... + */ + password.dsc$b_dtype = DSC$K_DTYPE_T; + password.dsc$b_class = DSC$K_CLASS_S; + password.dsc$w_length = input_length; + password.dsc$a_pointer = input_buf; + user.dsc$b_dtype = DSC$K_DTYPE_T; + user.dsc$b_class = DSC$K_CLASS_S; + user.dsc$w_length = strlen(username); + user.dsc$a_pointer = username; + sys$hash_password (&password, encryption_type, salt, &user, output_buf); +} + diff --git a/driver/imakefile b/driver/imakefile new file mode 100755 index 00000000..5444939a --- /dev/null +++ b/driver/imakefile @@ -0,0 +1,152 @@ +/* + * Imakefile file for xscreensaver, Copyright (c) 1993-1995 Jamie Zawinski. + * + * You should not need to edit this file; edit ../config.h instead. + * + */ + +#include "../config.h" + +/* #### If anyone ever finishes the Athena locking code, remove this. */ +#if defined(NO_MOTIF) && !defined(NO_LOCKING) +# define NO_LOCKING +#endif + +#ifdef NO_LOCKING +# undef INSTALL_SETUID +#endif + +#ifdef HAVE_XIDLE_EXTENSION +# define XIDLE_DEF -DHAVE_XIDLE_EXTENSION +#else +# define XIDLE_DEF +#endif + +#ifdef HAVE_SAVER_EXTENSION +# define SAVER_DEF -DHAVE_SAVER_EXTENSION +#else +# define SAVER_DEF +#endif + +#ifdef NO_LOCKING +# define LOCKING_DEF -DNO_LOCKING +#else +# define LOCKING_DEF +#endif + +#ifdef NO_SETUID +# define SETUID_DEF -DNO_SETUID +#else +# define SETUID_DEF +#endif + +#ifdef HAVE_SHADOW +# define SHADOW_DEF -DHAVE_SHADOW +#else +# define SHADOW_DEF +#endif + +#ifdef NO_MOTIF +# define MOTIF_DEF -DNO_MOTIF +# define MOTIF_SRC +# define MOTIF_OBJ +# define MOTIF_LIB +# define MOTIF_INC +#else +# define MOTIF_DEF +# define MOTIF_SRC $(DBOX_SRCS) $(UTILS)/xroger.c +# define MOTIF_OBJ $(DBOX_OBJS) $(UTILS)/xroger.o +# define MOTIF_LIB $(MOTIFLDOPTIONS) $(MOTIFLIBS) +# define MOTIF_INC $(MOTIFINCLUDES) +#endif + + UTILS = ../utils + INCLUDES = -I$(UTILS) MOTIF_INC + DEFINES = SETUID_DEF XIDLE_DEF SAVER_DEF MOTIF_DEF LOCKING_DEF SHADOW_DEF R5ISMS + SAVERLIBS = $(XMULIB) $(XTOOLLIB) $(EXTENSIONLIB) $(XLIB) -lm + COMMLIBS = $(XLIB) -lm + UTIL_SRCS = $(UTILS)/resources.c $(UTILS)/fade.c $(UTILS)/visual.c $(UTILS)/usleep.c $(UTILS)/yarandom.c + UTIL_OBJS = $(UTILS)/resources.o $(UTILS)/fade.o $(UTILS)/visual.o $(UTILS)/usleep.o $(UTILS)/yarandom.o + DBOX_SRCS = dialogs.c demo.c + DBOX_OBJS = dialogs.o demo.o + LOCK_SRCS = lock.c + LOCK_OBJS = lock.o + SAVERSRCS = xscreensaver.c timers.c subprocs.c windows.c stderr.c + SAVEROBJS = xscreensaver.o timers.o subprocs.o windows.o stderr.o + SRCS1 = $(SAVERSRCS) MOTIF_SRC $(LOCK_SRCS) $(UTIL_SRCS) + OBJS1 = $(SAVEROBJS) MOTIF_OBJ $(LOCK_OBJS) $(UTIL_OBJS) + COMMSRCS = xscreensaver-command.c + COMMOBJS = xscreensaver-command.o + SRCS2 = $(COMMSRCS) + OBJS2 = $(COMMOBJS) + MEN = xscreensaver.man xscreensaver-command.man + TARFILES = README Imakefile $(SAVERSRCS) $(DBOX_SRCS) $(LOCK_SRCS) \ + $(COMMSRCS) xscreensaver.h XScreenSaver.ad dialogs.xd \ + $(MEN) .gdbinit + +#if defined(HPArchitecture) && !defined(NO_LOCKING) +EXTRA_LIBRARIES = -lXhp11 /* for XHPDisableReset() */ +#endif + +#if defined(i386ScoArchitecture) + SCOLIBS = -lintl -lprot -lx -lcrypt_i +#endif + +all:: xscreensaver xscreensaver-command + +echo_tarfiles: + @echo $(TARFILES) + +PROGRAMS = xscreensaver xscreensaver-command + +#ifdef INSTALL_SETUID +#undef InstallProgram +#define InstallProgram(p,d) InstallProgramWithFlags(p,d,$(INSTUIDFLAGS)) +#endif + +ComplexProgramTarget_1(xscreensaver,MOTIF_LIB $(SAVERLIBS),$(SCOLIBS) $(HP_NULL_STR)) + +#ifdef INSTALL_SETUID +#undef InstallProgram +#define InstallProgram(p,d) InstallProgramWithFlags(p,d,$(HP_NULL_STR)) +#endif + +ComplexProgramTarget_2(xscreensaver-command,$(COMMLIBS),$(HP_NULL_STR)) + +InstallAppDefaults(XScreenSaver) + +xscreensaver.o: XScreenSaver.ad.h $(UTILS)/version.h +xscreensaver-command.o: $(UTILS)/version.h + +demo.o: $(UTILS)/version.h +lock.o: $(UTILS)/version.h + +/* build this before calling makedepend */ +depend:: XScreenSaver.ad.h + +XScreenSaver.ad.h: XScreenSaver.ad + $(UTILS)/ad2c XScreenSaver.ad > XScreenSaver.ad.h + +clean:: + $(RM) XScreenSaver.ad.h + + +#if defined(SparcArchitecture) || defined(SGIArchitecture) +# undef UsePurify +# define UsePurify +#endif + +#ifdef UsePurify + PURIFY = purify + PURIFYOPTIONS = + +# undef PurifyProgramTarget +# define PurifyProgramTarget(program,deplist,linklist) @@\ +program.pure: deplist @@\ + RemoveTargetProgram($@) @@\ + $(CCENVSETUP) $(PURIFY) $(PURIFYOPTIONS) $(CC) \ + -o $@ $(LDOPTIONS) linklist $(EXTRA_LOAD_FLAGS) + +PurifyProgramTarget(xscreensaver,$(OBJS1),$(OBJS1) MOTIF_LIB $(SAVERLIBS)) + +#endif /* Purify */ diff --git a/driver/link.com b/driver/link.com new file mode 100755 index 00000000..727163c2 --- /dev/null +++ b/driver/link.com @@ -0,0 +1,15 @@ +$! We fisrt test the version of DECW/Motif ; if 1.2 we need to link with new +$! X11R5 libraries +$@sys$update:decw$get_image_version sys$share:decw$xlibshr.exe decw$version +$ if f$extract(4,3,decw$version).eqs."1.2" +$ then +$! DECW/Motif 1.2 : link with X11R5 libraries +$ link xscreensaver-command,vms_12.opt/opt +$ link xscreensaver,demo,dialogs,lock,stderr,subprocs,timers,windows, - + getpwnam,getpwuid,hpwd,validate,vms_12.opt/opt +$ else +$! Else, link with X11R4 libraries +$ link xscreensaver-command,vms.opt/opt +$ link xscreensaver,demo,dialogs,lock,stderr,subprocs,timers,windows, - + getpwnam,getpwuid,hpwd,validate,vms.opt/opt +$ endif diff --git a/driver/link_axp.com b/driver/link_axp.com new file mode 100755 index 00000000..3b25bd65 --- /dev/null +++ b/driver/link_axp.com @@ -0,0 +1,15 @@ +$! We fisrt test the version of DECW/Motif ; if 1.2 we need to link with new +$! X11R5 libraries +$@sys$update:decw$get_image_version sys$share:decw$xlibshr.exe decw$version +$ if f$extract(4,3,decw$version).eqs."1.2" +$ then +$! DECW/Motif 1.2 : link with X11R5 libraries +$ link xscreensaver-command,vms_axp_12.opt/opt +$ link xscreensaver,demo,dialogs,lock,stderr,subprocs,timers,windows, - + getpwnam,getpwuid,hpwd,validate,vms_axp_12.opt/opt +$ else +$! Else, link with X11R4 libraries +$ link xscreensaver-command,vms_axp.opt/opt +$ link xscreensaver,demo,dialogs,lock,stderr,subprocs,timers,windows, - + getpwnam,getpwuid,hpwd,validate,vms_axp.opt/opt +$ endif diff --git a/driver/link_decc.com b/driver/link_decc.com new file mode 100755 index 00000000..6e7c9ec2 --- /dev/null +++ b/driver/link_decc.com @@ -0,0 +1,15 @@ +$! We fisrt test the version of DECW/Motif ; if 1.2 we need to link with new +$! X11R5 libraries +$@sys$update:decw$get_image_version sys$share:decw$xlibshr.exe decw$version +$ if f$extract(4,3,decw$version).eqs."1.2" +$ then +$! DECW/Motif 1.2 : link with X11R5 libraries +$ link xscreensaver-command,vms_decc_12.opt/opt +$ link xscreensaver,demo,dialogs,lock,stderr,subprocs,timers,windows, - + getpwnam,getpwuid,hpwd,validate,vms_decc_12.opt/opt +$ else +$! Else, link with X11R4 libraries +$ link xscreensaver-command,vms_decc.opt/opt +$ link xscreensaver,demo,dialogs,lock,stderr,subprocs,timers,windows, - + getpwnam,getpwuid,hpwd,validate,vms_decc.opt/opt +$ endif diff --git a/driver/lock.c b/driver/lock.c new file mode 100755 index 00000000..9ee5c604 --- /dev/null +++ b/driver/lock.c @@ -0,0 +1,706 @@ +/* xscreensaver, Copyright (c) 1993-1995 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. + */ + +/* #### If anyone ever finishes the Athena locking code, remove this. + But until then, locking requires Motif. + */ +#if defined(NO_MOTIF) && !defined(NO_LOCKING) +# define NO_LOCKING +#endif + + +#ifndef NO_LOCKING + +#if __STDC__ +#include +#include +#include +#endif + +#ifdef HAVE_SHADOW +#include +#endif + +#ifndef VMS +#include +#else +#include "pwd.h" +extern char *getenv(const char *name); +extern int validate_user(char *name, char *password); +#endif + +#include + +#include + +#include "xscreensaver.h" + +extern char *screensaver_version; +extern char *progname; +extern XtAppContext app; +extern Bool verbose_p; + +#ifdef SCO +/* SCO has some kind of goofy, nonstandard security crap. This stuff was + donated by one of their victims, I mean users, Didier Poirot . + */ +# include +# include +# include +#endif + +#if !__STDC__ +# define _NO_PROTO +#endif + +#ifdef NO_MOTIF + +# include +# include +# include + +#else /* Motif */ + +# include +# include +# include + +#endif /* Motif */ + +Time passwd_timeout; + +extern Widget passwd_dialog; +extern Widget passwd_form; +extern Widget roger_label; +extern Widget passwd_label1; +extern Widget passwd_label3; +extern Widget passwd_text; +extern Widget passwd_done; +extern Widget passwd_cancel; + +extern create_passwd_dialog P((Widget)); +extern void ungrab_keyboard_and_mouse P((void)); + +static enum { pw_read, pw_ok, pw_fail, pw_cancel, pw_time } passwd_state; +static char typed_passwd [1024]; + +static char root_passwd [255]; +static char user_passwd [255]; + +#ifdef VMS +static char * user_vms; +#endif + +#ifdef HAVE_SHADOW +# define PWTYPE struct spwd * +# define PWSLOT sp_pwdp +# define GETPW getspnam +#else +# define PWTYPE struct passwd * +# define PWSLOT pw_passwd +# define GETPW getpwnam +#endif + +#ifdef SCO +# define PRPWTYPE struct pr_passwd * +# define GETPRPW getprpwnam +#endif + +Bool +lock_init () +{ + Bool ok = True; + char *u; +#ifndef VMS + PWTYPE p = GETPW ("root"); + +#ifdef SCO + PRPWTYPE prpwd = GETPRPW ("root"); + if (prpwd && *prpwd->ufld.fd_encrypt) + strcpy (root_passwd, prpwd->ufld.fd_encrypt); +#else /* !SCO */ + if (p && p->PWSLOT && p->PWSLOT[0] != '*') + strcpy (root_passwd, p->PWSLOT); +#endif /* !SCO */ + else + { + fprintf (stderr, "%s: couldn't get root's password\n", progname); + strcpy (root_passwd, "*"); + } + + /* It has been reported that getlogin() returns the wrong user id on some + very old SGI systems... */ + u = (char *) getlogin (); + if (u) + { +#ifdef SCO + prpwd = GETPRPW (u); +#endif /* SCO */ + p = GETPW (u); + } + else + { + /* getlogin() fails if not attached to a terminal; + in that case, use getpwuid(). */ + struct passwd *p2 = getpwuid (getuid ()); + u = p2->pw_name; +#ifdef HAVE_SHADOW + p = GETPW (u); +#else + p = p2; +#endif + } + +#ifdef SCO + if (prpwd && *prpwd->ufld.fd_encrypt) + strcpy (user_passwd, prpwd->ufld.fd_encrypt); +#else /* !SCO */ + if (p && p->PWSLOT && + /* p->PWSLOT[0] != '*' */ /* sensible */ + (strlen (p->PWSLOT) > 4) /* solaris */ + ) + strcpy (user_passwd, p->PWSLOT); +#endif /* !SCO */ + else + { + fprintf (stderr, "%s: couldn't get password of \"%s\"\n", progname, u); + strcpy (user_passwd, "*"); + ok = False; + } + return ok; +#else + return ok; +#endif /* VMS */ + +} + + + +#if defined(NO_MOTIF) || (XmVersion >= 1002) + /* The `destroy' bug apears to be fixed as of Motif 1.2.1, but + the `verify-callback' bug is still present. */ +# define DESTROY_WORKS +#endif + +static void +passwd_cancel_cb (button, client_data, call_data) + Widget button; + XtPointer client_data, call_data; +{ + passwd_state = pw_cancel; +} + +static void +passwd_done_cb (button, client_data, call_data) + Widget button; + XtPointer client_data, call_data; +{ + if (passwd_state != pw_read) return; /* already done */ +#ifndef VMS + if (!strcmp ((char *) crypt (typed_passwd, user_passwd), user_passwd)) + passwd_state = pw_ok; + /* do not allow root to have empty passwd */ + else if (typed_passwd [0] && + !strcmp ((char *) crypt (typed_passwd, root_passwd), root_passwd)) + passwd_state = pw_ok; + else + passwd_state = pw_fail; +#else + user_vms = getenv("USER"); + if (validate_user(user_vms,typed_passwd) == 1 ) + passwd_state = pw_ok; + else + passwd_state = pw_fail; +#endif /* VMS */ + +} + +#if !defined(NO_MOTIF) && defined(VERIFY_CALLBACK_WORKS) + + /* #### It looks to me like adding any modifyVerify callback causes + #### Motif 1.1.4 to free the the TextF_Value() twice. I can't see + #### the bug in the Motif source, but Purify complains, even if + #### check_passwd_cb() is a no-op. + + #### Update: Motif 1.2.1 also loses, but in a different way: it + #### writes beyond the end of a malloc'ed block in ModifyVerify(). + #### Probably this block is the text field's text. + */ + +static void +check_passwd_cb (button, client_data, call_data) + Widget button; + XtPointer client_data, call_data; +{ + XmTextVerifyCallbackStruct *vcb = (XmTextVerifyCallbackStruct *) call_data; + + if (passwd_state != pw_read) + return; + else if (vcb->reason == XmCR_ACTIVATE) + { + passwd_done_cb (0, 0, 0); + } + else if (vcb->text->length > 1) /* don't allow "paste" operations */ + { + vcb->doit = False; + } + else if (vcb->text->ptr != 0) + { + int i; + strncat (typed_passwd, vcb->text->ptr, vcb->text->length); + typed_passwd [vcb->endPos + vcb->text->length] = 0; + for (i = 0; i < vcb->text->length; i++) + vcb->text->ptr [i] = '*'; + } +} + +#else /* !VERIFY_CALLBACK_WORKS */ + +static void keypress(); +static void backspace(); +static void kill_line(); +static void done(); + +static XtActionsRec actions[] = {{"keypress", keypress}, + {"backspace", backspace}, + {"kill_line", kill_line}, + {"done", done} + }; + +#if 0 /* oh fuck, why doesn't this work? */ +static char translations[] = "\ +BackSpace: backspace()\n\ +Delete: backspace()\n\ +CtrlH: backspace()\n\ +CtrlU: kill_line()\n\ +CtrlX: kill_line()\n\ +CtrlJ: done()\n\ +CtrlM: done()\n\ +: keypress()\n\ +"; +#else +static char translations[] = ":keypress()"; +#endif + +static void +text_field_set_string (widget, text, position) + Widget widget; + char *text; + int position; +{ +#ifdef NO_MOTIF + XawTextBlock block; + block.firstPos = 0; + block.length = strlen (text); + block.ptr = text; + block.format = 0; + XawTextReplace (widget, 0, -1, &block); + XawTextSetInsertionPoint (widget, position); +#else /* !NO_MOTIF */ + XmTextFieldSetString (widget, text); + XmTextFieldSetInsertionPosition (widget, position); +#endif /* !NO_MOTIF */ +} + + +static void +keypress (w, event, argv, argc) + Widget w; + XEvent *event; + String *argv; + Cardinal *argc; +{ + int i, j; + char s [sizeof (typed_passwd)]; + int size = XLookupString ((XKeyEvent *) event, s, sizeof (s), 0, 0); + if (size != 1) return; + + /* hack because I can't get translations to dance to my tune... */ + if (*s == '\010') { backspace (w, event, argv, argc); return; } + if (*s == '\177') { backspace (w, event, argv, argc); return; } + if (*s == '\025') { kill_line (w, event, argv, argc); return; } + if (*s == '\030') { kill_line (w, event, argv, argc); return; } + if (*s == '\012') { done (w, event, argv, argc); return; } + if (*s == '\015') { done (w, event, argv, argc); return; } + + i = j = strlen (typed_passwd); + typed_passwd [i] = *s; + s [++i] = 0; + while (i--) + s [i] = '*'; + + text_field_set_string (passwd_text, s, j + 1); +} + +static void +backspace (w, event, argv, argc) + Widget w; + XEvent *event; + String *argv; + Cardinal *argc; +{ + char s [sizeof (typed_passwd)]; + int i = strlen (typed_passwd); + int j = i; + if (i == 0) + return; + typed_passwd [--i] = 0; + s [i] = 0; + while (i--) + s [i] = '*'; + + text_field_set_string (passwd_text, s, j + 1); +} + +static void +kill_line (w, event, argv, argc) + Widget w; + XEvent *event; + String *argv; + Cardinal *argc; +{ + memset (typed_passwd, 0, sizeof (typed_passwd)); + text_field_set_string (passwd_text, "", 0); +} + +static void +done (w, event, argv, argc) + Widget w; + XEvent *event; + String *argv; + Cardinal *argc; +{ + passwd_done_cb (w, 0, 0); +} + +#endif /* !VERIFY_CALLBACK_WORKS || NO_MOTIF */ + +static void +format_into_label (widget, string) + Widget widget; + char *string; +{ + char *label; + char buf [255]; + Arg av[10]; + int ac = 0; + +#ifdef NO_MOTIF + XtSetArg (av [ac], XtNlabel, &label); ac++; + XtGetValues (widget, av, ac); +#else /* Motif */ + XmString xm_label = 0; + XmString new_xm_label; + XtSetArg (av [ac], XmNlabelString, &xm_label); ac++; + XtGetValues (widget, av, ac); + XmStringGetLtoR (xm_label, XmSTRING_DEFAULT_CHARSET, &label); +#endif /* Motif */ + + if (!label || !strcmp (label, XtName (widget))) + strcpy (buf, "ERROR: RESOURCES ARE NOT INSTALLED CORRECTLY"); + else + sprintf (buf, label, string); + + ac = 0; + +#ifdef NO_MOTIF + XtSetArg (av [ac], XtNlabel, buf); ac++; +#else /* Motif */ + new_xm_label = XmStringCreate (buf, XmSTRING_DEFAULT_CHARSET); + XtSetArg (av [ac], XmNlabelString, new_xm_label); ac++; +#endif /* Motif */ + + XtSetValues (widget, av, ac); +#ifndef NO_MOTIF + XmStringFree (new_xm_label); +#endif + XtFree (label); +} + +#if __STDC__ +extern void skull (Display *, Window, GC, GC, int, int, int, int); +#endif + +static void +roger (button, client_data, call_data) + Widget button; + XtPointer client_data, call_data; +{ + Display *dpy = XtDisplay (button); + Screen *screen = XtScreen (button); + Window window = XtWindow (button); + Arg av [10]; + int ac = 0; + XGCValues gcv; + Colormap cmap; + GC draw_gc, erase_gc; + unsigned int fg, bg; + int x, y, size; + XWindowAttributes xgwa; + XGetWindowAttributes (dpy, window, &xgwa); + cmap = xgwa.colormap; + if (xgwa.width > xgwa.height) size = xgwa.height; + else size = xgwa.width; + if (size > 40) size -= 30; + x = (xgwa.width - size) / 2; + y = (xgwa.height - size) / 2; + XtSetArg (av [ac], XtNforeground, &fg); ac++; + XtSetArg (av [ac], XtNbackground, &bg); ac++; + XtGetValues (button, av, ac); + /* if it's black on white, swap it cause it looks better (hack hack) */ + if (fg == BlackPixelOfScreen (screen) && bg == WhitePixelOfScreen (screen)) + fg = WhitePixelOfScreen (screen), bg = BlackPixelOfScreen (screen); + gcv.foreground = bg; + erase_gc = XCreateGC (dpy, window, GCForeground, &gcv); + gcv.foreground = fg; + draw_gc = XCreateGC (dpy, window, GCForeground, &gcv); + XFillRectangle (dpy, window, erase_gc, 0, 0, xgwa.width, xgwa.height); + skull (dpy, window, draw_gc, erase_gc, x, y, size, size); + XFreeGC (dpy, draw_gc); + XFreeGC (dpy, erase_gc); +} + +#ifdef NO_MOTIF + +static void +make_passwd_dialog (parent) + Widget parent; +{ + abort (); /* #### */ +} + +#else /* Motif */ + +static void +make_passwd_dialog (parent) + Widget parent; +{ + struct passwd *pw; + create_passwd_dialog (parent); + + XtAddCallback (passwd_done, XmNactivateCallback, passwd_done_cb, 0); + XtAddCallback (passwd_cancel, XmNactivateCallback, passwd_cancel_cb, 0); + XtAddCallback (roger_label, XmNexposeCallback, roger, 0); + +#ifdef VERIFY_CALLBACK_WORKS + XtAddCallback (passwd_text, XmNmodifyVerifyCallback, check_passwd_cb, 0); + XtAddCallback (passwd_text, XmNactivateCallback, check_passwd_cb, 0); +#else + XtAddCallback (passwd_text, XmNactivateCallback, passwd_done_cb, 0); + XtOverrideTranslations (passwd_text, XtParseTranslationTable (translations)); +#endif + +#if !defined(NO_MOTIF) && (XmVersion >= 1002) + /* The focus stuff changed around; this didn't exist in 1.1.5. */ + XtVaSetValues (passwd_form, XmNinitialFocus, passwd_text, 0); +#endif + + /* Another random thing necessary in 1.2.1 but not 1.1.5... */ + XtVaSetValues (roger_label, XmNborderWidth, 2, 0); + +#ifndef VMS + pw = getpwuid (getuid ()); +#else + pw = getpwuid (); +/* pw->pw_name = getenv("USER"); */ +#endif + format_into_label (passwd_label3, (pw->pw_name ? pw->pw_name : "???")); + format_into_label (passwd_label1, screensaver_version); +} + +#endif /* Motif */ + +extern void idle_timer (); + +static int passwd_idle_timer_tick; +static XtIntervalId id; + +static void +passwd_idle_timer (junk1, junk2) + void *junk1; + XtPointer junk2; +{ + Display *dpy = XtDisplay (passwd_form); + Window window = XtWindow (passwd_form); + static Dimension x, y, d, s, ss; + static GC gc = 0; + int max = passwd_timeout / 1000; + + idle_timer (junk1, junk2); + + if (passwd_idle_timer_tick == max) /* first time */ + { + Arg av [10]; + int ac = 0; + XGCValues gcv; + unsigned long fg, bg; + XtSetArg (av [ac], XtNheight, &d); ac++; + XtGetValues (passwd_done, av, ac); + ac = 0; + XtSetArg (av [ac], XtNwidth, &x); ac++; + XtSetArg (av [ac], XtNheight, &y); ac++; + XtSetArg (av [ac], XtNforeground, &fg); ac++; + XtSetArg (av [ac], XtNbackground, &bg); ac++; + XtGetValues (passwd_form, av, ac); + x -= d; + y -= d; + d -= 4; + gcv.foreground = fg; + if (gc) XFreeGC (dpy, gc); + gc = XCreateGC (dpy, window, GCForeground, &gcv); + s = 360*64 / (passwd_idle_timer_tick - 1); + ss = 90*64; + XFillArc (dpy, window, gc, x, y, d, d, 0, 360*64); + XSetForeground (dpy, gc, bg); + x += 1; + y += 1; + d -= 2; + } + + if (--passwd_idle_timer_tick) + { + id = XtAppAddTimeOut (app, 1000, passwd_idle_timer, 0); + XFillArc (dpy, window, gc, x, y, d, d, ss, s); + ss += s; + } +} + +extern void pop_up_dialog_box (); +extern int BadWindow_ehandler (); + +static Bool +pop_passwd_dialog (parent) + Widget parent; +{ + Display *dpy = XtDisplay (passwd_dialog); + Window focus; + int revert_to; + typed_passwd [0] = 0; + passwd_state = pw_read; + text_field_set_string (passwd_text, "", 0); + + XGetInputFocus (dpy, &focus, &revert_to); +#ifndef DESTROY_WORKS + /* This fucker blows up if we destroy the widget. I can't figure + out why. The second destroy phase dereferences freed memory... + So we just keep it around; but unrealizing or unmanaging it + doesn't work right either, so we hack the window directly. FMH. + */ + if (XtWindow (passwd_form)) + XMapRaised (dpy, XtWindow (passwd_dialog)); +#endif + + pop_up_dialog_box (passwd_dialog, passwd_form, 2); + XtManageChild (passwd_form); + +#if !defined(NO_MOTIF) && (XmVersion < 1002) + /* The focus stuff changed around; this causes problems in 1.2.1 + but is necessary in 1.1.5. */ + XmProcessTraversal (passwd_text, XmTRAVERSE_CURRENT); +#endif + + passwd_idle_timer_tick = passwd_timeout / 1000; + id = XtAppAddTimeOut (app, 1000, passwd_idle_timer, 0); + + + XGrabServer (dpy); /* ############ DANGER! */ + + /* this call to ungrab used to be in main_loop() - see comment in + xscreensaver.c around line 696. */ + ungrab_keyboard_and_mouse (); + + while (passwd_state == pw_read) + { + XEvent event; + XtAppNextEvent (app, &event); + /* wait for timer event */ + if (event.xany.type == 0 && passwd_idle_timer_tick == 0) + passwd_state = pw_time; + XtDispatchEvent (&event); + } + XUngrabServer (dpy); + XSync (dpy, False); /* ###### (danger over) */ + + if (passwd_state != pw_time) + XtRemoveTimeOut (id); + + if (passwd_state != pw_ok) + { + char *lose; + switch (passwd_state) + { + case pw_time: lose = "Timed out!"; break; + case pw_fail: lose = "Sorry!"; break; + case pw_cancel: lose = 0; break; + default: abort (); + } +#ifndef NO_MOTIF + XmProcessTraversal (passwd_cancel, 0); /* turn off I-beam */ +#endif + if (lose) + { + text_field_set_string (passwd_text, lose, strlen (lose) + 1); + passwd_idle_timer_tick = 1; + id = XtAppAddTimeOut (app, 3000, passwd_idle_timer, 0); + while (1) + { + XEvent event; + XtAppNextEvent (app, &event); + if (event.xany.type == 0 && /* wait for timer event */ + passwd_idle_timer_tick == 0) + break; + XtDispatchEvent (&event); + } + } + } + memset (typed_passwd, 0, sizeof (typed_passwd)); + text_field_set_string (passwd_text, "", 0); + XtSetKeyboardFocus (parent, None); + +#ifdef DESTROY_WORKS + XtDestroyWidget (passwd_dialog); + passwd_dialog = 0; +#else + XUnmapWindow (XtDisplay (passwd_dialog), XtWindow (passwd_dialog)); +#endif + { + int (*old_handler) (); + old_handler = XSetErrorHandler (BadWindow_ehandler); + /* I don't understand why this doesn't refocus on the old selected + window when MWM is running in click-to-type mode. The value of + `focus' seems to be correct. */ + XSetInputFocus (dpy, focus, revert_to, CurrentTime); + XSync (dpy, False); + XSetErrorHandler (old_handler); + } + + return (passwd_state == pw_ok ? True : False); +} + +Bool +unlock_p (parent) + Widget parent; +{ + static Bool initted = False; + if (! initted) + { +#ifndef VERIFY_CALLBACK_WORKS + XtAppAddActions (app, actions, XtNumber (actions)); +#endif + passwd_dialog = 0; + initted = True; + } + if (! passwd_dialog) + make_passwd_dialog (parent); + return pop_passwd_dialog (parent); +} + +#endif /* !NO_LOCKING */ diff --git a/driver/lock.c_ori b/driver/lock.c_ori new file mode 100755 index 00000000..e4ef9824 --- /dev/null +++ b/driver/lock.c_ori @@ -0,0 +1,676 @@ +/* xscreensaver, Copyright (c) 1993-1995 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. + */ + +/* #### If anyone ever finishes the Athena locking code, remove this. + But until then, locking requires Motif. + */ +#if defined(NO_MOTIF) && !defined(NO_LOCKING) +# define NO_LOCKING +#endif + + +#ifndef NO_LOCKING + +#if __STDC__ +#include +#include +#include +#endif + +#ifdef HAVE_SHADOW +#include +#endif + +#include +#include + +#include + +#include "xscreensaver.h" + +extern char *screensaver_version; +extern char *progname; +extern XtAppContext app; +extern Bool verbose_p; + +#ifdef SCO +/* SCO has some kind of goofy, nonstandard security crap. This stuff was + donated by one of their victims, I mean users, Didier Poirot . + */ +# include +# include +# include +#endif + +#if !__STDC__ +# define _NO_PROTO +#endif + +#ifdef NO_MOTIF + +# include +# include +# include + +#else /* Motif */ + +# include +# include +# include + +#endif /* Motif */ + +Time passwd_timeout; + +extern Widget passwd_dialog; +extern Widget passwd_form; +extern Widget roger_label; +extern Widget passwd_label1; +extern Widget passwd_label3; +extern Widget passwd_text; +extern Widget passwd_done; +extern Widget passwd_cancel; + +extern create_passwd_dialog P((Widget)); +extern void ungrab_keyboard_and_mouse P((void)); + +static enum { pw_read, pw_ok, pw_fail, pw_cancel, pw_time } passwd_state; +static char typed_passwd [1024]; + +static char root_passwd [255]; +static char user_passwd [255]; + +#ifdef HAVE_SHADOW +# define PWTYPE struct spwd * +# define PWSLOT sp_pwdp +# define GETPW getspnam +#else +# define PWTYPE struct passwd * +# define PWSLOT pw_passwd +# define GETPW getpwnam +#endif + +#ifdef SCO +# define PRPWTYPE struct pr_passwd * +# define GETPRPW getprpwnam +#endif + +Bool +lock_init () +{ + Bool ok = True; + char *u; + PWTYPE p = GETPW ("root"); + +#ifdef SCO + PRPWTYPE prpwd = GETPRPW ("root"); + if (prpwd && *prpwd->ufld.fd_encrypt) + strcpy (root_passwd, prpwd->ufld.fd_encrypt); +#else /* !SCO */ + if (p && p->PWSLOT && p->PWSLOT[0] != '*') + strcpy (root_passwd, p->PWSLOT); +#endif /* !SCO */ + else + { + fprintf (stderr, "%s: couldn't get root's password\n", progname); + strcpy (root_passwd, "*"); + } + + /* It has been reported that getlogin() returns the wrong user id on some + very old SGI systems... */ + u = (char *) getlogin (); + if (u) + { +#ifdef SCO + prpwd = GETPRPW (u); +#endif /* SCO */ + p = GETPW (u); + } + else + { + /* getlogin() fails if not attached to a terminal; + in that case, use getpwuid(). */ + struct passwd *p2 = getpwuid (getuid ()); + u = p2->pw_name; +#ifdef HAVE_SHADOW + p = GETPW (u); +#else + p = p2; +#endif + } + +#ifdef SCO + if (prpwd && *prpwd->ufld.fd_encrypt) + strcpy (user_passwd, prpwd->ufld.fd_encrypt); +#else /* !SCO */ + if (p && p->PWSLOT && + /* p->PWSLOT[0] != '*' */ /* sensible */ + (strlen (p->PWSLOT) > 4) /* solaris */ + ) + strcpy (user_passwd, p->PWSLOT); +#endif /* !SCO */ + else + { + fprintf (stderr, "%s: couldn't get password of \"%s\"\n", progname, u); + strcpy (user_passwd, "*"); + ok = False; + } + return ok; +} + + + +#if defined(NO_MOTIF) || (XmVersion >= 1002) + /* The `destroy' bug apears to be fixed as of Motif 1.2.1, but + the `verify-callback' bug is still present. */ +# define DESTROY_WORKS +#endif + +static void +passwd_cancel_cb (button, client_data, call_data) + Widget button; + XtPointer client_data, call_data; +{ + passwd_state = pw_cancel; +} + +static void +passwd_done_cb (button, client_data, call_data) + Widget button; + XtPointer client_data, call_data; +{ + if (passwd_state != pw_read) return; /* already done */ + if (!strcmp ((char *) crypt (typed_passwd, user_passwd), user_passwd)) + passwd_state = pw_ok; + /* do not allow root to have empty passwd */ + else if (typed_passwd [0] && + !strcmp ((char *) crypt (typed_passwd, root_passwd), root_passwd)) + passwd_state = pw_ok; + else + passwd_state = pw_fail; +} + +#if !defined(NO_MOTIF) && defined(VERIFY_CALLBACK_WORKS) + + /* #### It looks to me like adding any modifyVerify callback causes + #### Motif 1.1.4 to free the the TextF_Value() twice. I can't see + #### the bug in the Motif source, but Purify complains, even if + #### check_passwd_cb() is a no-op. + + #### Update: Motif 1.2.1 also loses, but in a different way: it + #### writes beyond the end of a malloc'ed block in ModifyVerify(). + #### Probably this block is the text field's text. + */ + +static void +check_passwd_cb (button, client_data, call_data) + Widget button; + XtPointer client_data, call_data; +{ + XmTextVerifyCallbackStruct *vcb = (XmTextVerifyCallbackStruct *) call_data; + + if (passwd_state != pw_read) + return; + else if (vcb->reason == XmCR_ACTIVATE) + { + passwd_done_cb (0, 0, 0); + } + else if (vcb->text->length > 1) /* don't allow "paste" operations */ + { + vcb->doit = False; + } + else if (vcb->text->ptr != 0) + { + int i; + strncat (typed_passwd, vcb->text->ptr, vcb->text->length); + typed_passwd [vcb->endPos + vcb->text->length] = 0; + for (i = 0; i < vcb->text->length; i++) + vcb->text->ptr [i] = '*'; + } +} + +#else /* !VERIFY_CALLBACK_WORKS */ + +static void keypress(); +static void backspace(); +static void kill_line(); +static void done(); + +static XtActionsRec actions[] = {{"keypress", keypress}, + {"backspace", backspace}, + {"kill_line", kill_line}, + {"done", done} + }; + +#if 0 /* oh fuck, why doesn't this work? */ +static char translations[] = "\ +BackSpace: backspace()\n\ +Delete: backspace()\n\ +CtrlH: backspace()\n\ +CtrlU: kill_line()\n\ +CtrlX: kill_line()\n\ +CtrlJ: done()\n\ +CtrlM: done()\n\ +: keypress()\n\ +"; +#else +static char translations[] = ":keypress()"; +#endif + +static void +text_field_set_string (widget, text, position) + Widget widget; + char *text; + int position; +{ +#ifdef NO_MOTIF + XawTextBlock block; + block.firstPos = 0; + block.length = strlen (text); + block.ptr = text; + block.format = 0; + XawTextReplace (widget, 0, -1, &block); + XawTextSetInsertionPoint (widget, position); +#else /* !NO_MOTIF */ + XmTextFieldSetString (widget, text); + XmTextFieldSetInsertionPosition (widget, position); +#endif /* !NO_MOTIF */ +} + + +static void +keypress (w, event, argv, argc) + Widget w; + XEvent *event; + String *argv; + Cardinal *argc; +{ + int i, j; + char s [sizeof (typed_passwd)]; + int size = XLookupString ((XKeyEvent *) event, s, sizeof (s), 0, 0); + if (size != 1) return; + + /* hack because I can't get translations to dance to my tune... */ + if (*s == '\010') { backspace (w, event, argv, argc); return; } + if (*s == '\177') { backspace (w, event, argv, argc); return; } + if (*s == '\025') { kill_line (w, event, argv, argc); return; } + if (*s == '\030') { kill_line (w, event, argv, argc); return; } + if (*s == '\012') { done (w, event, argv, argc); return; } + if (*s == '\015') { done (w, event, argv, argc); return; } + + i = j = strlen (typed_passwd); + typed_passwd [i] = *s; + s [++i] = 0; + while (i--) + s [i] = '*'; + + text_field_set_string (passwd_text, s, j + 1); +} + +static void +backspace (w, event, argv, argc) + Widget w; + XEvent *event; + String *argv; + Cardinal *argc; +{ + char s [sizeof (typed_passwd)]; + int i = strlen (typed_passwd); + int j = i; + if (i == 0) + return; + typed_passwd [--i] = 0; + s [i] = 0; + while (i--) + s [i] = '*'; + + text_field_set_string (passwd_text, s, j + 1); +} + +static void +kill_line (w, event, argv, argc) + Widget w; + XEvent *event; + String *argv; + Cardinal *argc; +{ + memset (typed_passwd, 0, sizeof (typed_passwd)); + text_field_set_string (passwd_text, "", 0); +} + +static void +done (w, event, argv, argc) + Widget w; + XEvent *event; + String *argv; + Cardinal *argc; +{ + passwd_done_cb (w, 0, 0); +} + +#endif /* !VERIFY_CALLBACK_WORKS || NO_MOTIF */ + +static void +format_into_label (widget, string) + Widget widget; + char *string; +{ + char *label; + char buf [255]; + Arg av[10]; + int ac = 0; + +#ifdef NO_MOTIF + XtSetArg (av [ac], XtNlabel, &label); ac++; + XtGetValues (widget, av, ac); +#else /* Motif */ + XmString xm_label = 0; + XmString new_xm_label; + XtSetArg (av [ac], XmNlabelString, &xm_label); ac++; + XtGetValues (widget, av, ac); + XmStringGetLtoR (xm_label, XmSTRING_DEFAULT_CHARSET, &label); +#endif /* Motif */ + + if (!label || !strcmp (label, XtName (widget))) + strcpy (buf, "ERROR: RESOURCES ARE NOT INSTALLED CORRECTLY"); + else + sprintf (buf, label, string); + + ac = 0; + +#ifdef NO_MOTIF + XtSetArg (av [ac], XtNlabel, buf); ac++; +#else /* Motif */ + new_xm_label = XmStringCreate (buf, XmSTRING_DEFAULT_CHARSET); + XtSetArg (av [ac], XmNlabelString, new_xm_label); ac++; +#endif /* Motif */ + + XtSetValues (widget, av, ac); +#ifndef NO_MOTIF + XmStringFree (new_xm_label); +#endif + XtFree (label); +} + +#if __STDC__ +extern void skull (Display *, Window, GC, GC, int, int, int, int); +#endif + +static void +roger (button, client_data, call_data) + Widget button; + XtPointer client_data, call_data; +{ + Display *dpy = XtDisplay (button); + Screen *screen = XtScreen (button); + Window window = XtWindow (button); + Arg av [10]; + int ac = 0; + XGCValues gcv; + Colormap cmap; + GC draw_gc, erase_gc; + unsigned int fg, bg; + int x, y, size; + XWindowAttributes xgwa; + XGetWindowAttributes (dpy, window, &xgwa); + cmap = xgwa.colormap; + if (xgwa.width > xgwa.height) size = xgwa.height; + else size = xgwa.width; + if (size > 40) size -= 30; + x = (xgwa.width - size) / 2; + y = (xgwa.height - size) / 2; + XtSetArg (av [ac], XtNforeground, &fg); ac++; + XtSetArg (av [ac], XtNbackground, &bg); ac++; + XtGetValues (button, av, ac); + /* if it's black on white, swap it cause it looks better (hack hack) */ + if (fg == BlackPixelOfScreen (screen) && bg == WhitePixelOfScreen (screen)) + fg = WhitePixelOfScreen (screen), bg = BlackPixelOfScreen (screen); + gcv.foreground = bg; + erase_gc = XCreateGC (dpy, window, GCForeground, &gcv); + gcv.foreground = fg; + draw_gc = XCreateGC (dpy, window, GCForeground, &gcv); + XFillRectangle (dpy, window, erase_gc, 0, 0, xgwa.width, xgwa.height); + skull (dpy, window, draw_gc, erase_gc, x, y, size, size); + XFreeGC (dpy, draw_gc); + XFreeGC (dpy, erase_gc); +} + +#ifdef NO_MOTIF + +static void +make_passwd_dialog (parent) + Widget parent; +{ + abort (); /* #### */ +} + +#else /* Motif */ + +static void +make_passwd_dialog (parent) + Widget parent; +{ + struct passwd *pw; + create_passwd_dialog (parent); + + XtAddCallback (passwd_done, XmNactivateCallback, passwd_done_cb, 0); + XtAddCallback (passwd_cancel, XmNactivateCallback, passwd_cancel_cb, 0); + XtAddCallback (roger_label, XmNexposeCallback, roger, 0); + +#ifdef VERIFY_CALLBACK_WORKS + XtAddCallback (passwd_text, XmNmodifyVerifyCallback, check_passwd_cb, 0); + XtAddCallback (passwd_text, XmNactivateCallback, check_passwd_cb, 0); +#else + XtAddCallback (passwd_text, XmNactivateCallback, passwd_done_cb, 0); + XtOverrideTranslations (passwd_text, XtParseTranslationTable (translations)); +#endif + +#if !defined(NO_MOTIF) && (XmVersion >= 1002) + /* The focus stuff changed around; this didn't exist in 1.1.5. */ + XtVaSetValues (passwd_form, XmNinitialFocus, passwd_text, 0); +#endif + + /* Another random thing necessary in 1.2.1 but not 1.1.5... */ + XtVaSetValues (roger_label, XmNborderWidth, 2, 0); + + pw = getpwuid (getuid ()); + format_into_label (passwd_label3, (pw->pw_name ? pw->pw_name : "???")); + format_into_label (passwd_label1, screensaver_version); +} + +#endif /* Motif */ + +extern void idle_timer (); + +static int passwd_idle_timer_tick; +static XtIntervalId id; + +static void +passwd_idle_timer (junk1, junk2) + void *junk1; + XtPointer junk2; +{ + Display *dpy = XtDisplay (passwd_form); + Window window = XtWindow (passwd_form); + static Dimension x, y, d, s, ss; + static GC gc = 0; + int max = passwd_timeout / 1000; + + idle_timer (junk1, junk2); + + if (passwd_idle_timer_tick == max) /* first time */ + { + Arg av [10]; + int ac = 0; + XGCValues gcv; + unsigned long fg, bg; + XtSetArg (av [ac], XtNheight, &d); ac++; + XtGetValues (passwd_done, av, ac); + ac = 0; + XtSetArg (av [ac], XtNwidth, &x); ac++; + XtSetArg (av [ac], XtNheight, &y); ac++; + XtSetArg (av [ac], XtNforeground, &fg); ac++; + XtSetArg (av [ac], XtNbackground, &bg); ac++; + XtGetValues (passwd_form, av, ac); + x -= d; + y -= d; + d -= 4; + gcv.foreground = fg; + if (gc) XFreeGC (dpy, gc); + gc = XCreateGC (dpy, window, GCForeground, &gcv); + s = 360*64 / (passwd_idle_timer_tick - 1); + ss = 90*64; + XFillArc (dpy, window, gc, x, y, d, d, 0, 360*64); + XSetForeground (dpy, gc, bg); + x += 1; + y += 1; + d -= 2; + } + + if (--passwd_idle_timer_tick) + { + id = XtAppAddTimeOut (app, 1000, passwd_idle_timer, 0); + XFillArc (dpy, window, gc, x, y, d, d, ss, s); + ss += s; + } +} + +extern void pop_up_dialog_box (); +extern int BadWindow_ehandler (); + +static Bool +pop_passwd_dialog (parent) + Widget parent; +{ + Display *dpy = XtDisplay (passwd_dialog); + Window focus; + int revert_to; + typed_passwd [0] = 0; + passwd_state = pw_read; + text_field_set_string (passwd_text, "", 0); + + XGetInputFocus (dpy, &focus, &revert_to); +#ifndef DESTROY_WORKS + /* This fucker blows up if we destroy the widget. I can't figure + out why. The second destroy phase dereferences freed memory... + So we just keep it around; but unrealizing or unmanaging it + doesn't work right either, so we hack the window directly. FMH. + */ + if (XtWindow (passwd_form)) + XMapRaised (dpy, XtWindow (passwd_dialog)); +#endif + + pop_up_dialog_box (passwd_dialog, passwd_form, 2); + XtManageChild (passwd_form); + +#if !defined(NO_MOTIF) && (XmVersion < 1002) + /* The focus stuff changed around; this causes problems in 1.2.1 + but is necessary in 1.1.5. */ + XmProcessTraversal (passwd_text, XmTRAVERSE_CURRENT); +#endif + + passwd_idle_timer_tick = passwd_timeout / 1000; + id = XtAppAddTimeOut (app, 1000, passwd_idle_timer, 0); + + + XGrabServer (dpy); /* ############ DANGER! */ + + /* this call to ungrab used to be in main_loop() - see comment in + xscreensaver.c around line 696. */ + ungrab_keyboard_and_mouse (); + + while (passwd_state == pw_read) + { + XEvent event; + XtAppNextEvent (app, &event); + /* wait for timer event */ + if (event.xany.type == 0 && passwd_idle_timer_tick == 0) + passwd_state = pw_time; + XtDispatchEvent (&event); + } + XUngrabServer (dpy); + XSync (dpy, False); /* ###### (danger over) */ + + if (passwd_state != pw_time) + XtRemoveTimeOut (id); + + if (passwd_state != pw_ok) + { + char *lose; + switch (passwd_state) + { + case pw_time: lose = "Timed out!"; break; + case pw_fail: lose = "Sorry!"; break; + case pw_cancel: lose = 0; break; + default: abort (); + } +#ifndef NO_MOTIF + XmProcessTraversal (passwd_cancel, 0); /* turn off I-beam */ +#endif + if (lose) + { + text_field_set_string (passwd_text, lose, strlen (lose) + 1); + passwd_idle_timer_tick = 1; + id = XtAppAddTimeOut (app, 3000, passwd_idle_timer, 0); + while (1) + { + XEvent event; + XtAppNextEvent (app, &event); + if (event.xany.type == 0 && /* wait for timer event */ + passwd_idle_timer_tick == 0) + break; + XtDispatchEvent (&event); + } + } + } + memset (typed_passwd, 0, sizeof (typed_passwd)); + text_field_set_string (passwd_text, "", 0); + XtSetKeyboardFocus (parent, None); + +#ifdef DESTROY_WORKS + XtDestroyWidget (passwd_dialog); + passwd_dialog = 0; +#else + XUnmapWindow (XtDisplay (passwd_dialog), XtWindow (passwd_dialog)); +#endif + { + int (*old_handler) (); + old_handler = XSetErrorHandler (BadWindow_ehandler); + /* I don't understand why this doesn't refocus on the old selected + window when MWM is running in click-to-type mode. The value of + `focus' seems to be correct. */ + XSetInputFocus (dpy, focus, revert_to, CurrentTime); + XSync (dpy, False); + XSetErrorHandler (old_handler); + } + + return (passwd_state == pw_ok ? True : False); +} + +Bool +unlock_p (parent) + Widget parent; +{ + static Bool initted = False; + if (! initted) + { +#ifndef VERIFY_CALLBACK_WORKS + XtAppAddActions (app, actions, XtNumber (actions)); +#endif + passwd_dialog = 0; + initted = True; + } + if (! passwd_dialog) + make_passwd_dialog (parent); + return pop_passwd_dialog (parent); +} + +#endif /* !NO_LOCKING */ diff --git a/driver/pwd.h b/driver/pwd.h new file mode 100755 index 00000000..6cb73d3e --- /dev/null +++ b/driver/pwd.h @@ -0,0 +1,48 @@ +/* @(#)pwd.h 1.7 89/08/24 SMI; from S5R2 1.1 */ + +#ifndef __pwd_h +#define __pwd_h + +#ifdef vax11c +#include +#else +#include +#endif /* vax11c */ + +#ifdef PASSWDROUTINES +#define EXTERN +#else +#define EXTERN extern +#endif /* PASSWDROUTINES */ + +struct passwd { + char *pw_name; + char *pw_passwd; + int pw_uid; + int pw_gid; + short pw_salt; + int pw_encrypt; + char *pw_age; + char *pw_comment; + char *pw_gecos; + char *pw_dir; + char *pw_shell; +}; + + +#ifndef _POSIX_SOURCE +extern struct passwd *getpwent(); + +struct comment { + char *c_dept; + char *c_name; + char *c_acct; + char *c_bin; +}; + +#endif + +EXTERN struct passwd *getpwuid(/* uid_t uid */); +EXTERN struct passwd *getpwnam(/* char *name */); + +#endif /* !__pwd_h */ diff --git a/driver/readme b/driver/readme new file mode 100755 index 00000000..df64793b --- /dev/null +++ b/driver/readme @@ -0,0 +1,6 @@ + +This directory contains the source for xscreensaver and xscreensaver-command, +the screensaver driver, and the program for externally controlling it. Some +stuff from the ../utils/ directory is used here as well. + +If you have compilation problems, check the parameters in ../config.h. diff --git a/driver/stderr.c b/driver/stderr.c new file mode 100755 index 00000000..5ee20a82 --- /dev/null +++ b/driver/stderr.c @@ -0,0 +1,334 @@ +/* xscreensaver, Copyright (c) 1991-1995 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. + */ + +/* stderr hackery - Why Unix Sucks, reason number 32767. + */ + +#if __STDC__ +#include +#ifndef VMS +#include +#endif +#endif + +#include +#ifndef VMS +#include +#endif +#include + +#include + +#include "xscreensaver.h" + +extern XtAppContext app; +extern Colormap cmap; +extern Window screensaver_window; + +extern char *get_string_resource P((char *, char *)); +extern Bool get_boolean_resource P((char *, char *)); +extern unsigned int get_pixel_resource P((char *, char *, + Display *, Colormap)); + +static char stderr_buffer [1024]; +static char *stderr_tail = 0; +static time_t stderr_last_read = 0; +static XtIntervalId stderr_popup_timer = 0; + +FILE *real_stderr = 0; +FILE *real_stdout = 0; + +static int text_x = 0; +static int text_y = 0; + +void +reset_stderr () +{ + text_x = text_y = 0; +} + +static void +print_stderr (string) + char *string; +{ + int h_border = 20; + int v_border = 20; + static int line_height; + static XFontStruct *font = 0; + static GC gc = 0; + char *head = string; + char *tail; + + /* In verbose mode, copy it to stderr as well. */ + if (verbose_p) + fprintf (real_stderr, "%s", string); + + if (! gc) + { + XGCValues gcv; + Pixel fg, bg; + char *font_name = get_string_resource ("font", "Font"); + if (!font_name) font_name = "fixed"; + font = XLoadQueryFont (dpy, font_name); + if (! font) font = XLoadQueryFont (dpy, "fixed"); + line_height = font->ascent + font->descent; + fg = get_pixel_resource ("textForeground", "Foreground", dpy, cmap); + bg = get_pixel_resource ("textBackground", "Background", dpy, cmap); + gcv.font = font->fid; + gcv.foreground = fg; + gcv.background = bg; + gc = XCreateGC (dpy, screensaver_window, + (GCFont | GCForeground | GCBackground), &gcv); + } + + for (tail = string; *tail; tail++) + { + if (*tail == '\n' || *tail == '\r') + { + int maxy = HeightOfScreen (screen) - v_border - v_border; + if (tail != head) + XDrawImageString (dpy, screensaver_window, gc, + text_x + h_border, + text_y + v_border + font->ascent, + head, tail - head); + text_x = 0; + text_y += line_height; + head = tail + 1; + if (*tail == '\r' && *head == '\n') + head++, tail++; + + if (text_y > maxy - line_height) + { +#if 0 + text_y = 0; +#else + int offset = line_height * 5; + XCopyArea (dpy, screensaver_window, screensaver_window, gc, + 0, v_border + offset, + WidthOfScreen (screen), + (HeightOfScreen (screen) - v_border - v_border + - offset), + 0, v_border); + XClearArea (dpy, screensaver_window, + 0, HeightOfScreen (screen) - v_border - offset, + WidthOfScreen (screen), offset, False); + text_y -= offset; +#endif + } + } + } + if (tail != head) + { + int direction, ascent, descent; + XCharStruct overall; + XDrawImageString (dpy, screensaver_window, gc, + text_x + h_border, text_y + v_border + font->ascent, + head, tail - head); + XTextExtents (font, tail, tail - head, + &direction, &ascent, &descent, &overall); + text_x += overall.width; + } +} + + +static void +stderr_popup_timer_fn (closure, id) + XtPointer closure; + XtIntervalId *id; +{ + char *s = stderr_buffer; + if (*s) + { + /* If too much data was printed, then something has gone haywire, + so truncate it. */ + char *trailer = "\n\n<< stderr diagnostics have been truncated >>\n\n"; + int max = sizeof (stderr_buffer) - strlen (trailer) - 5; + if (strlen (s) > max) + strcpy (s + max, trailer); + /* Now show the user. */ + print_stderr (s); + } + + stderr_tail = stderr_buffer; + stderr_popup_timer = 0; +} + + +static void +stderr_callback (closure, fd, id) + XtPointer closure; + int *fd; + XtIntervalId *id; +{ + char *s; + int left; + int size; + int read_this_time = 0; + + if (stderr_tail == 0) + stderr_tail = stderr_buffer; + + left = ((sizeof (stderr_buffer) - 2) - (stderr_tail - stderr_buffer)); + + s = stderr_tail; + *s = 0; + + /* Read as much data from the fd as we can, up to our buffer size. */ + if (left > 0) + { + while ((size = read (*fd, (void *) s, left)) > 0) + { + left -= size; + s += size; + read_this_time += size; + } + *s = 0; + } + else + { + char buf2 [1024]; + /* The buffer is full; flush the rest of it. */ + while (read (*fd, (void *) buf2, sizeof (buf2)) > 0) + ; + } + + stderr_tail = s; + stderr_last_read = time ((time_t *) 0); + + /* Now we have read some data that we would like to put up in a dialog + box. But more data may still be coming in - so don't pop up the + dialog right now, but instead, start a timer that will pop it up + a second from now. Should more data come in in the meantime, we + will be called again, and will reset that timer again. So the + dialog will only pop up when a second has elapsed with no new data + being written to stderr. + + However, if the buffer is full (meaning lots of data has been written) + then we don't reset the timer. + */ + if (read_this_time > 0) + { + if (stderr_popup_timer) + XtRemoveTimeOut (stderr_popup_timer); + + stderr_popup_timer = + XtAppAddTimeOut (app, 1 * 1000, stderr_popup_timer_fn, 0); + } +} + +void +initialize_stderr () +{ + static Boolean done = False; + int fds [2]; + int in, out; + int new_stdout, new_stderr; + int stdout_fd = 1; + int stderr_fd = 2; + int flags; + Boolean stderr_dialog_p = get_boolean_resource ("captureStderr", "Boolean"); + Boolean stdout_dialog_p = get_boolean_resource ("captureStdout", "Boolean"); + + real_stderr = stderr; + real_stdout = stdout; + + if (!stderr_dialog_p && !stdout_dialog_p) + return; + + if (done) return; + done = True; + + if (pipe (fds)) + { + perror ("error creating pipe:"); + return; + } + + in = fds [0]; + out = fds [1]; + +#ifndef VMS +# ifdef O_NONBLOCK + flags = O_NONBLOCK; +# else +# ifdef O_NDELAY + flags = O_NDELAY; +# else + ERROR!! neither O_NONBLOCK nor O_NDELAY are defined. +# endif +# endif + + /* Set both sides of the pipe to nonblocking - this is so that + our reads (in stderr_callback) will terminate, and so that + out writes (in the client programs) will silently fail when + the pipe is full, instead of hosing the program. */ + if (fcntl (in, F_SETFL, flags) != 0) + { + perror ("fcntl:"); + return; + } + if (fcntl (out, F_SETFL, flags) != 0) + { + perror ("fcntl:"); + return; + } +#endif /* VMS */ + + if (stderr_dialog_p) + { + FILE *new_stderr_file; + new_stderr = dup (stderr_fd); + if (new_stderr < 0) + { + perror ("could not dup() a stderr:"); + return; + } + if (! (new_stderr_file = fdopen (new_stderr, "w"))) + { + perror ("could not fdopen() the new stderr:"); + return; + } + real_stderr = new_stderr_file; + + close (stderr_fd); + if (dup2 (out, stderr_fd) < 0) + { + perror ("could not dup() a new stderr:"); + return; + } + } + + if (stdout_dialog_p) + { + FILE *new_stdout_file; + new_stdout = dup (stdout_fd); + if (new_stdout < 0) + { + perror ("could not dup() a stdout:"); + return; + } + if (! (new_stdout_file = fdopen (new_stdout, "w"))) + { + perror ("could not fdopen() the new stdout:"); + return; + } + real_stdout = new_stdout_file; + + close (stdout_fd); + if (dup2 (out, stdout_fd) < 0) + { + perror ("could not dup() a new stdout:"); + return; + } + } + + XtAppAddInput (app, in, (XtPointer) XtInputReadMask, stderr_callback, 0); +} diff --git a/driver/stderr.c_ori b/driver/stderr.c_ori new file mode 100755 index 00000000..7d5fc136 --- /dev/null +++ b/driver/stderr.c_ori @@ -0,0 +1,328 @@ +/* xscreensaver, Copyright (c) 1991-1995 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. + */ + +/* stderr hackery - Why Unix Sucks, reason number 32767. + */ + +#if __STDC__ +#include +#include +#endif + +#include +#include +#include + +#include + +#include "xscreensaver.h" + +extern XtAppContext app; +extern Colormap cmap; +extern Window screensaver_window; + +extern char *get_string_resource P((char *, char *)); +extern Bool get_boolean_resource P((char *, char *)); +extern unsigned int get_pixel_resource P((char *, char *, + Display *, Colormap)); + +static char stderr_buffer [1024]; +static char *stderr_tail = 0; +static time_t stderr_last_read = 0; +static XtIntervalId stderr_popup_timer = 0; + +FILE *real_stderr = 0; +FILE *real_stdout = 0; + +static int text_x = 0; +static int text_y = 0; + +void +reset_stderr () +{ + text_x = text_y = 0; +} + +static void +print_stderr (string) + char *string; +{ + int h_border = 20; + int v_border = 20; + static int line_height; + static XFontStruct *font = 0; + static GC gc = 0; + char *head = string; + char *tail; + + /* In verbose mode, copy it to stderr as well. */ + if (verbose_p) + fprintf (real_stderr, "%s", string); + + if (! gc) + { + XGCValues gcv; + Pixel fg, bg; + char *font_name = get_string_resource ("font", "Font"); + if (!font_name) font_name = "fixed"; + font = XLoadQueryFont (dpy, font_name); + if (! font) font = XLoadQueryFont (dpy, "fixed"); + line_height = font->ascent + font->descent; + fg = get_pixel_resource ("textForeground", "Foreground", dpy, cmap); + bg = get_pixel_resource ("textBackground", "Background", dpy, cmap); + gcv.font = font->fid; + gcv.foreground = fg; + gcv.background = bg; + gc = XCreateGC (dpy, screensaver_window, + (GCFont | GCForeground | GCBackground), &gcv); + } + + for (tail = string; *tail; tail++) + { + if (*tail == '\n' || *tail == '\r') + { + int maxy = HeightOfScreen (screen) - v_border - v_border; + if (tail != head) + XDrawImageString (dpy, screensaver_window, gc, + text_x + h_border, + text_y + v_border + font->ascent, + head, tail - head); + text_x = 0; + text_y += line_height; + head = tail + 1; + if (*tail == '\r' && *head == '\n') + head++, tail++; + + if (text_y > maxy - line_height) + { +#if 0 + text_y = 0; +#else + int offset = line_height * 5; + XCopyArea (dpy, screensaver_window, screensaver_window, gc, + 0, v_border + offset, + WidthOfScreen (screen), + (HeightOfScreen (screen) - v_border - v_border + - offset), + 0, v_border); + XClearArea (dpy, screensaver_window, + 0, HeightOfScreen (screen) - v_border - offset, + WidthOfScreen (screen), offset, False); + text_y -= offset; +#endif + } + } + } + if (tail != head) + { + int direction, ascent, descent; + XCharStruct overall; + XDrawImageString (dpy, screensaver_window, gc, + text_x + h_border, text_y + v_border + font->ascent, + head, tail - head); + XTextExtents (font, tail, tail - head, + &direction, &ascent, &descent, &overall); + text_x += overall.width; + } +} + + +static void +stderr_popup_timer_fn (closure, id) + XtPointer closure; + XtIntervalId *id; +{ + char *s = stderr_buffer; + if (*s) + { + /* If too much data was printed, then something has gone haywire, + so truncate it. */ + char *trailer = "\n\n<< stderr diagnostics have been truncated >>\n\n"; + int max = sizeof (stderr_buffer) - strlen (trailer) - 5; + if (strlen (s) > max) + strcpy (s + max, trailer); + /* Now show the user. */ + print_stderr (s); + } + + stderr_tail = stderr_buffer; + stderr_popup_timer = 0; +} + + +static void +stderr_callback (closure, fd, id) + XtPointer closure; + int *fd; + XtIntervalId *id; +{ + char *s; + int left; + int size; + int read_this_time = 0; + + if (stderr_tail == 0) + stderr_tail = stderr_buffer; + + left = ((sizeof (stderr_buffer) - 2) - (stderr_tail - stderr_buffer)); + + s = stderr_tail; + *s = 0; + + /* Read as much data from the fd as we can, up to our buffer size. */ + if (left > 0) + { + while ((size = read (*fd, (void *) s, left)) > 0) + { + left -= size; + s += size; + read_this_time += size; + } + *s = 0; + } + else + { + char buf2 [1024]; + /* The buffer is full; flush the rest of it. */ + while (read (*fd, (void *) buf2, sizeof (buf2)) > 0) + ; + } + + stderr_tail = s; + stderr_last_read = time ((time_t *) 0); + + /* Now we have read some data that we would like to put up in a dialog + box. But more data may still be coming in - so don't pop up the + dialog right now, but instead, start a timer that will pop it up + a second from now. Should more data come in in the meantime, we + will be called again, and will reset that timer again. So the + dialog will only pop up when a second has elapsed with no new data + being written to stderr. + + However, if the buffer is full (meaning lots of data has been written) + then we don't reset the timer. + */ + if (read_this_time > 0) + { + if (stderr_popup_timer) + XtRemoveTimeOut (stderr_popup_timer); + + stderr_popup_timer = + XtAppAddTimeOut (app, 1 * 1000, stderr_popup_timer_fn, 0); + } +} + +void +initialize_stderr () +{ + static Boolean done = False; + int fds [2]; + int in, out; + int new_stdout, new_stderr; + int stdout_fd = 1; + int stderr_fd = 2; + int flags; + Boolean stderr_dialog_p = get_boolean_resource ("captureStderr", "Boolean"); + Boolean stdout_dialog_p = get_boolean_resource ("captureStdout", "Boolean"); + + real_stderr = stderr; + real_stdout = stdout; + + if (!stderr_dialog_p && !stdout_dialog_p) + return; + + if (done) return; + done = True; + + if (pipe (fds)) + { + perror ("error creating pipe:"); + return; + } + + in = fds [0]; + out = fds [1]; + +# ifdef O_NONBLOCK + flags = O_NONBLOCK; +# else +# ifdef O_NDELAY + flags = O_NDELAY; +# else + ERROR!! neither O_NONBLOCK nor O_NDELAY are defined. +# endif +# endif + + /* Set both sides of the pipe to nonblocking - this is so that + our reads (in stderr_callback) will terminate, and so that + out writes (in the client programs) will silently fail when + the pipe is full, instead of hosing the program. */ + if (fcntl (in, F_SETFL, flags) != 0) + { + perror ("fcntl:"); + return; + } + if (fcntl (out, F_SETFL, flags) != 0) + { + perror ("fcntl:"); + return; + } + + if (stderr_dialog_p) + { + FILE *new_stderr_file; + new_stderr = dup (stderr_fd); + if (new_stderr < 0) + { + perror ("could not dup() a stderr:"); + return; + } + if (! (new_stderr_file = fdopen (new_stderr, "w"))) + { + perror ("could not fdopen() the new stderr:"); + return; + } + real_stderr = new_stderr_file; + + close (stderr_fd); + if (dup2 (out, stderr_fd) < 0) + { + perror ("could not dup() a new stderr:"); + return; + } + } + + if (stdout_dialog_p) + { + FILE *new_stdout_file; + new_stdout = dup (stdout_fd); + if (new_stdout < 0) + { + perror ("could not dup() a stdout:"); + return; + } + if (! (new_stdout_file = fdopen (new_stdout, "w"))) + { + perror ("could not fdopen() the new stdout:"); + return; + } + real_stdout = new_stdout_file; + + close (stdout_fd); + if (dup2 (out, stdout_fd) < 0) + { + perror ("could not dup() a new stdout:"); + return; + } + } + + XtAppAddInput (app, in, (XtPointer) XtInputReadMask, stderr_callback, 0); +} diff --git a/driver/subprocs.c b/driver/subprocs.c new file mode 100755 index 00000000..9a5387dc --- /dev/null +++ b/driver/subprocs.c @@ -0,0 +1,667 @@ +/* xscreensaver, Copyright (c) 1991, 1992, 1993, 1995 + * 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. + */ + +/* I would really like some error messages to show up on the screensaver window + itself when subprocs die, or when we can't launch them. If the process + produces output, but does not actually die, I would like that output to go + to the appropriate stdout/stderr as they do now. X and Unix conspire to + make this incredibly difficult. + + - Not all systems have SIGIO, so we can't necessarily be signalled when a + process dies, so we'd have to poll it with wait() or something awful like + that, which would mean the main thread waking up more often than it does + now. + + - We can't tell the difference between a process dying, and a process not + being launched correctly (for example, not being on $PATH) partly because + of the contortions we need to go through with /bin/sh in order to launch + it. + + - We can't do X stuff from signal handlers, so we'd need to set a flag, + save the error message, and notice that flag in the main thread. The + problem is that the main thread is probably sleeping, waiting for the + next X event, so to do this we'd have to register a pipe FD or something, + and write to it when something loses. + + - We could assume that any output produced by a subproc indicates an error, + and blast that across the screen. This means we'd need to use popen() + instead of forking and execing /bin/sh to run it for us. Possibly this + would work, but see comment in exec_screenhack() about getting pids. + I think we could do the "exec " trick with popen() but would SIGIO get + delivered correctly? Who knows. (We could register the pipe-FD with + Xt, and handle output on it with a callback.) + + - For the simple case of the programs not being on $PATH, we could just + search $PATH before launching the shell, but that seems hardly worth the + effort... And it's broken!! Why should we have to duplicate half the + work of the shell? (Because it's Unix, that's why! Bend over.) + */ + +#if __STDC__ +#include +#include +#include +#endif + +#include + +#include /* not used for much... */ + +#ifndef ESRCH +#include +#endif + +#include /* sys/resource.h needs this for timeval */ +#ifndef VMS +#include /* for setpriority() and PRIO_PROCESS */ +#include /* for waitpid() and associated macros */ +#else +#include "wait.h" +#include +#include /* to pickup close */ +#include /* to pickup getpid */ +#define pid_t int +#define waitpid wait +#define fork vfork +#define random rand +#endif /* VMS */ + +#include /* for the signal names */ + +extern char **environ; /* why isn't this in some header file? */ + +#ifndef NO_SETUID +#include /* for getpwnam() and struct passwd */ +#include /* for getgrgid() and struct group */ +#endif /* NO_SETUID */ + +#if !defined(SIGCHLD) && defined(SIGCLD) +#define SIGCHLD SIGCLD +#endif + +#if __STDC__ +extern int putenv (/* const char * */); /* getenv() is in stdlib.h... */ +extern int kill (pid_t, int); /* signal() is in sys/signal.h... */ +#endif + +#include "yarandom.h" +#include "xscreensaver.h" + +/* this must be `sh', not whatever $SHELL happens to be. */ +char *shell; +static pid_t pid = 0; +char **screenhacks; +int screenhacks_count; +int current_hack = -1; +char *demo_hack; +int next_mode_p = 0; +Bool locking_disabled_p = False; +char *nolock_reason = 0; +int nice_inferior = 0; + +extern Bool demo_mode_p; + +static void +#if __STDC__ +exec_screenhack (char *command) +#else +exec_screenhack (command) + char *command; +#endif +{ + char *tmp; + char buf [512]; + char *av [5]; + int ac = 0; + + /* Close this fork's version of the display's fd. It will open its own. */ + close (ConnectionNumber (dpy)); + + /* I don't believe what a sorry excuse for an operating system UNIX is! + + - I want to spawn a process. + - I want to know it's pid so that I can kill it. + - I would like to receive a message when it dies of natural causes. + - I want the spawned process to have user-specified arguments. + + The *only way* to parse arguments the way the shells do is to run a + shell (or duplicate what they do, which would be a *lot* of code.) + + The *only way* to know the pid of the process is to fork() and exec() + it in the spawned side of the fork. + + But if you're running a shell to parse your arguments, this gives you + the pid of the SHELL, not the pid of the PROCESS that you're actually + interested in, which is an *inferior* of the shell. This also means + that the SIGCHLD you get applies to the shell, not its inferior. + + So, the only solution other than implementing an argument parser here + is to force the shell to exec() its inferior. What a fucking hack! + We prepend "exec " to the command string. + + (Actually, Clint Wong points out that process groups + might be used to take care of this problem; this may be worth considering + some day, except that, 1: this code works now, so why fix it, and 2: from + what I've seen in Emacs, dealing with process groups isn't especially + portable.) + */ +#ifndef VMS + tmp = command; + command = (char *) malloc (strlen (tmp) + 6); + memcpy (command, "exec ", 5); + memcpy (command + 5, tmp, strlen (tmp) + 1); +#endif + + /* Invoke the shell as "/bin/sh -c 'exec prog -arg -arg ...'" */ +#ifndef VMS + av [ac++] = shell; + av [ac++] = "-c"; +#endif + av [ac++] = command; + av [ac++] = 0; + + if (verbose_p) + printf ("%s: spawning \"%s\" in pid %d.\n", progname, command, getpid ()); + +#if defined(SYSV) || defined(SVR4) || defined(__hpux) || defined(VMS) + { + int old_nice = nice (0); + int n = nice_inferior - old_nice; + errno = 0; + if (nice (n) == -1 && errno != 0) + { + sprintf (buf, "%s: %snice(%d) failed", progname, + (verbose_p ? "## " : ""), n); + perror (buf); + } + } +#else /* !SYSV */ +#ifdef PRIO_PROCESS + if (setpriority (PRIO_PROCESS, getpid(), nice_inferior) != 0) + { + sprintf (buf, "%s: %ssetpriority(PRIO_PROCESS, %d, %d) failed", + progname, (verbose_p ? "## " : ""), getpid(), nice_inferior); + perror (buf); + } +#else /* !PRIO_PROCESS */ + if (nice_inferior != 0) + fprintf (stderr, + "%s: %sdon't know how to change process priority on this system.\n", + progname, (verbose_p ? "## " : "")); +#endif /* !PRIO_PROCESS */ +#endif /* !SYSV */ + + /* Now overlay the current process with /bin/sh running the command. + If this returns, it's an error. + */ +#ifndef VMS + execve (av [0], av, environ); +#else + system(command); +#endif + + sprintf (buf, "%s: %sexecve() failed", progname, (verbose_p ? "## " : "")); + perror (buf); + exit (1); /* Note that this only exits a child fork. */ +} + +/* to avoid a race between the main thread and the SIGCHLD handler */ +static int killing = 0; +static Bool suspending = False; + +static char *current_hack_name P((void)); + +static void +#if __STDC__ +await_child_death (Bool killed) +#else +await_child_death (killed) + Bool killed; +#endif +{ + Bool suspended_p = False; + int status; + pid_t kid; + killing = 1; + if (! pid) + return; +#ifdef VMS + return; +#else + + do + { + kid = waitpid (pid, &status, WUNTRACED); + } + while (kid == -1 && errno == EINTR); + + if (kid == pid) + { + if (WIFEXITED (status)) + { + int exit_status = WEXITSTATUS (status); + if (exit_status & 0x80) + exit_status |= ~0xFF; + /* One might assume that exiting with non-0 means something went + wrong. But that loser xswarm exits with the code that it was + killed with, so it *always* exits abnormally. Treat abnormal + exits as "normal" (don't mention them) if we've just killed + the subprocess. But mention them if they happen on their own. + */ + if (exit_status != 0 && (verbose_p || (! killed))) + fprintf (stderr, + "%s: %schild pid %d (%s) exited abnormally (code %d).\n", + progname, (verbose_p ? "## " : ""), + pid, current_hack_name (), exit_status); + else if (verbose_p) + printf ("%s: child pid %d (%s) exited normally.\n", + progname, pid, current_hack_name ()); + } + else if (WIFSIGNALED (status)) + { + if (!killed || WTERMSIG (status) != SIGTERM) + fprintf (stderr, + "%s: %schild pid %d (%s) terminated with signal %d!\n", + progname, (verbose_p ? "## " : ""), + pid, current_hack_name (), WTERMSIG (status)); + else if (verbose_p) + printf ("%s: child pid %d (%s) terminated with SIGTERM.\n", + progname, pid, current_hack_name ()); + } + else if (suspending) + { + suspended_p = True; + suspending = False; /* complain if it happens twice */ + } + else if (WIFSTOPPED (status)) + { + suspended_p = True; + fprintf (stderr, "%s: %schild pid %d (%s) stopped with signal %d!\n", + progname, (verbose_p ? "## " : ""), pid, + current_hack_name (), WSTOPSIG (status)); + } + else + fprintf (stderr, "%s: %schild pid %d (%s) died in a mysterious way!", + progname, (verbose_p ? "## " : ""), pid, current_hack_name()); + } + else if (kid <= 0) + fprintf (stderr, "%s: %swaitpid(%d, ...) says there are no kids? (%d)\n", + progname, (verbose_p ? "## " : ""), pid, kid); + else + fprintf (stderr, "%s: %swaitpid(%d, ...) says proc %d died, not %d?\n", + progname, (verbose_p ? "## " : ""), pid, kid, pid); + killing = 0; + if (suspended_p != True) + pid = 0; +#endif /* VMS */ +} + +static char * +current_hack_name () +{ + static char chn [1024]; + char *hack = (demo_mode_p ? demo_hack : screenhacks [current_hack]); + int i; + for (i = 0; hack [i] != 0 && hack [i] != ' ' && hack [i] != '\t'; i++) + chn [i] = hack [i]; + chn [i] = 0; + return chn; +} + +#ifdef SIGCHLD +static void +sigchld_handler (sig) + int sig; +{ + if (killing) + return; + if (! pid) + abort (); + await_child_death (False); +} +#endif + + +void +init_sigchld () +{ +#ifdef SIGCHLD + if (((int) signal (SIGCHLD, sigchld_handler)) == -1) + { + char buf [255]; + sprintf (buf, "%s: %scouldn't catch SIGCHLD", progname, + (verbose_p ? "## " : "")); + perror (buf); + } +#endif +} + + +extern void raise_window P((Bool inhibit_fade, Bool between_hacks_p)); + +void +spawn_screenhack (first_time_p) + Bool first_time_p; +{ + raise_window (first_time_p, True); + XFlush (dpy); + + if (screenhacks_count || demo_mode_p) + { + char *hack; + pid_t forked; + char buf [255]; + int new_hack; + if (demo_mode_p) + { + hack = demo_hack; + } + else + { + if (screenhacks_count == 1) + new_hack = 0; + else if (next_mode_p == 1) + new_hack = (current_hack + 1) % screenhacks_count, + next_mode_p = 0; + else if (next_mode_p == 2) + { + new_hack = ((current_hack + screenhacks_count - 1) + % screenhacks_count); + next_mode_p = 0; + } + else + while ((new_hack = random () % screenhacks_count) == current_hack) + ; + current_hack = new_hack; + hack = screenhacks[current_hack]; + } + + switch (forked = fork ()) + { + case -1: + sprintf (buf, "%s: %scouldn't fork", + progname, (verbose_p ? "## " : "")); + perror (buf); + restore_real_vroot (); + exit (1); + case 0: + exec_screenhack (hack); /* this does not return */ + break; + default: + pid = forked; + break; + } + } +} + +void +kill_screenhack () +{ + killing = 1; + if (! pid) + return; + if (kill (pid, SIGTERM) < 0) + { + if (errno == ESRCH) + { + /* Sometimes we don't get a SIGCHLD at all! WTF? + It's a race condition. It looks to me like what's happening is + something like: a subprocess dies of natural causes. There is a + small window between when the process dies and when the SIGCHLD + is (would have been) delivered. If we happen to try to kill() + the process during that time, the kill() fails, because the + process is already dead. But! no SIGCHLD is delivered (perhaps + because the failed kill() has reset some state in the kernel?) + Anyway, if kill() says "No such process", then we have to wait() + for it anyway, because the process has already become a zombie. + I love Unix. + */ + await_child_death (False); + } + else + { + char buf [255]; + sprintf (buf, "%s: %scouldn't kill child process %d", progname, + (verbose_p ? "## " : ""), pid); + perror (buf); + } + } + else + { + if (verbose_p) + printf ("%s: killing pid %d.\n", progname, pid); + await_child_death (True); + } +} + + +void +suspend_screenhack (suspend_p) + Bool suspend_p; +{ + + suspending = suspend_p; + if (! pid) + ; +#ifndef VMS + else if (kill (pid, (suspend_p ? SIGSTOP : SIGCONT)) < 0) + { + char buf [255]; + sprintf (buf, "%s: %scouldn't %s child process %d", progname, + (verbose_p ? "## " : ""), + (suspend_p ? "suspend" : "resume"), + pid); + perror (buf); + } + else if (verbose_p) + printf ("%s: %s pid %d.\n", progname, + (suspend_p ? "suspending" : "resuming"), pid); +#endif /* VMS */ +} + + +/* Restarting the xscreensaver process from scratch. */ + +static char **saved_argv; + +void +save_argv (argc, argv) + int argc; + char **argv; +{ + saved_argv = (char **) malloc ((argc + 2) * sizeof (char *)); + saved_argv [argc] = 0; + while (argc--) + { + int i = strlen (argv [argc]) + 1; + saved_argv [argc] = (char *) malloc (i); + memcpy (saved_argv [argc], argv [argc], i); + } +} + +void +restart_process () +{ + XCloseDisplay (dpy); + fflush (stdout); + fflush (stderr); + execvp (saved_argv [0], saved_argv); + fprintf (stderr, "%s: %scould not restart process: %s (%d)\n", + progname, (verbose_p ? "## " : ""), + (errno == E2BIG ? "arglist too big" : + errno == EACCES ? "could not execute" : + errno == EFAULT ? "memory fault" : + errno == EIO ? "I/O error" : + errno == ENAMETOOLONG ? "name too long" : + errno == ELOOP ? "too many symbolic links" : + errno == ENOENT ? "file no longer exists" : + errno == ENOTDIR ? "directory no longer exists" : + errno == ENOEXEC ? "bad executable file" : + errno == ENOMEM ? "out of memory" : + "execvp() returned unknown error code"), + errno); + exit (1); +} + +void +demo_mode_restart_process () +{ + int i; + for (i = 0; saved_argv [i]; i++); + /* add the -demo switch; save_argv() left room for this. */ + saved_argv [i] = "-demo"; + saved_argv [i+1] = 0; + restart_process (); +} + +void +hack_environment () +{ + /* Store $DISPLAY into the environment, so that the $DISPLAY variable that + the spawned processes inherit is the same as the value of -display passed + in on our command line (which is not necessarily the same as what our + $DISPLAY variable is.) + */ + char *s, buf [2048]; + int i; + sprintf (buf, "DISPLAY=%s", DisplayString (dpy)); + i = strlen (buf); + s = (char *) malloc (i+1); + strncpy (s, buf, i+1); +#ifndef VMS + if (putenv (s)) + abort (); +#endif +} + + +/* Change the uid/gid of the screensaver process, so that it is safe for it + to run setuid root (which it needs to do on some systems to read the + encrypted passwords from the passwd file.) + + hack_uid() is run before opening the X connection, so that XAuth works. + hack_uid_warn() is called after the connection is opened and the command + line arguments are parsed, so that the messages from hack_uid() get + printed after we know whether we're in `verbose' mode. + */ + +#ifndef NO_SETUID + +static int hack_uid_errno; +static char hack_uid_buf [255], *hack_uid_error; + +void +hack_uid () +{ + /* If we've been run as setuid or setgid to someone else (most likely root) + turn off the extra permissions so that random user-specified programs + don't get special privileges. (On some systems it might be necessary + to install this as setuid root in order to read the passwd file to + implement lock-mode...) + */ + setgid (getgid ()); + setuid (getuid ()); + + hack_uid_errno = 0; + hack_uid_error = 0; + + /* If we're being run as root (as from xdm) then switch the user id + to something safe. */ + if (getuid () == 0) + { + struct passwd *p; + /* Locking can't work when running as root, because we have no way of + knowing what the user id of the logged in user is (so we don't know + whose password to prompt for.) + */ + locking_disabled_p = True; + nolock_reason = "running as root"; + p = getpwnam ("nobody"); + if (! p) p = getpwnam ("daemon"); + if (! p) p = getpwnam ("bin"); + if (! p) p = getpwnam ("sys"); + if (! p) + { + hack_uid_error = "couldn't find safe uid; running as root."; + hack_uid_errno = -1; + } + else + { + struct group *g = getgrgid (p->pw_gid); + hack_uid_error = hack_uid_buf; + sprintf (hack_uid_error, "changing uid/gid to %s/%s (%d/%d).", + p->pw_name, (g ? g->gr_name : "???"), p->pw_uid, p->pw_gid); + + /* Change the gid to be a safe one. If we can't do that, then + print a warning. We change the gid before the uid so that we + change the gid while still root. */ + if (setgid (p->pw_gid) != 0) + { + hack_uid_errno = errno; + sprintf (hack_uid_error, "couldn't set gid to %s (%d)", + (g ? g->gr_name : "???"), p->pw_gid); + } + + /* Now change the uid to be a safe one. */ + if (setuid (p->pw_uid) != 0) + { + hack_uid_errno = errno; + sprintf (hack_uid_error, "couldn't set uid to %s (%d)", + p->pw_name, p->pw_uid); + } + } + } +#ifndef NO_LOCKING + else /* disable locking if already being run as "someone else" */ + { + struct passwd *p = getpwuid (getuid ()); + if (!p || + !strcmp (p->pw_name, "root") || + !strcmp (p->pw_name, "nobody") || + !strcmp (p->pw_name, "daemon") || + !strcmp (p->pw_name, "bin") || + !strcmp (p->pw_name, "sys")) + { + locking_disabled_p = True; + nolock_reason = hack_uid_buf; + sprintf (nolock_reason, "running as %s", p->pw_name); + } + } +#endif /* NO_LOCKING */ +} + +void +hack_uid_warn () +{ + if (! hack_uid_error) + ; + else if (hack_uid_errno == 0) + { + if (verbose_p) + printf ("%s: %s\n", progname, hack_uid_error); + } + else + { + char buf [255]; + sprintf (buf, "%s: %s%s", progname, (verbose_p ? "## " : ""), + hack_uid_error); + if (hack_uid_errno == -1) + fprintf (stderr, "%s\n", buf); + else + { + errno = hack_uid_errno; + perror (buf); + } + } +} + +#endif /* !NO_SETUID */ diff --git a/driver/subprocs.c_ori b/driver/subprocs.c_ori new file mode 100755 index 00000000..689bbb01 --- /dev/null +++ b/driver/subprocs.c_ori @@ -0,0 +1,639 @@ +/* xscreensaver, Copyright (c) 1991, 1992, 1993, 1995 + * 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. + */ + +/* I would really like some error messages to show up on the screensaver window + itself when subprocs die, or when we can't launch them. If the process + produces output, but does not actually die, I would like that output to go + to the appropriate stdout/stderr as they do now. X and Unix conspire to + make this incredibly difficult. + + - Not all systems have SIGIO, so we can't necessarily be signalled when a + process dies, so we'd have to poll it with wait() or something awful like + that, which would mean the main thread waking up more often than it does + now. + + - We can't tell the difference between a process dying, and a process not + being launched correctly (for example, not being on $PATH) partly because + of the contortions we need to go through with /bin/sh in order to launch + it. + + - We can't do X stuff from signal handlers, so we'd need to set a flag, + save the error message, and notice that flag in the main thread. The + problem is that the main thread is probably sleeping, waiting for the + next X event, so to do this we'd have to register a pipe FD or something, + and write to it when something loses. + + - We could assume that any output produced by a subproc indicates an error, + and blast that across the screen. This means we'd need to use popen() + instead of forking and execing /bin/sh to run it for us. Possibly this + would work, but see comment in exec_screenhack() about getting pids. + I think we could do the "exec " trick with popen() but would SIGIO get + delivered correctly? Who knows. (We could register the pipe-FD with + Xt, and handle output on it with a callback.) + + - For the simple case of the programs not being on $PATH, we could just + search $PATH before launching the shell, but that seems hardly worth the + effort... And it's broken!! Why should we have to duplicate half the + work of the shell? (Because it's Unix, that's why! Bend over.) + */ + +#if __STDC__ +#include +#include +#include +#endif + +#include + +#include /* not used for much... */ + +#ifndef ESRCH +#include +#endif + +#include /* sys/resource.h needs this for timeval */ +#include /* for setpriority() and PRIO_PROCESS */ +#include /* for waitpid() and associated macros */ +#include /* for the signal names */ + +extern char **environ; /* why isn't this in some header file? */ + +#ifndef NO_SETUID +#include /* for getpwnam() and struct passwd */ +#include /* for getgrgid() and struct group */ +#endif /* NO_SETUID */ + +#if !defined(SIGCHLD) && defined(SIGCLD) +#define SIGCHLD SIGCLD +#endif + +#if __STDC__ +extern int putenv (/* const char * */); /* getenv() is in stdlib.h... */ +extern int kill (pid_t, int); /* signal() is in sys/signal.h... */ +#endif + +#include "yarandom.h" +#include "xscreensaver.h" + +/* this must be `sh', not whatever $SHELL happens to be. */ +char *shell; +static pid_t pid = 0; +char **screenhacks; +int screenhacks_count; +int current_hack = -1; +char *demo_hack; +int next_mode_p = 0; +Bool locking_disabled_p = False; +char *nolock_reason = 0; +int nice_inferior = 0; + +extern Bool demo_mode_p; + +static void +#if __STDC__ +exec_screenhack (char *command) +#else +exec_screenhack (command) + char *command; +#endif +{ + char *tmp; + char buf [512]; + char *av [5]; + int ac = 0; + + /* Close this fork's version of the display's fd. It will open its own. */ + close (ConnectionNumber (dpy)); + + /* I don't believe what a sorry excuse for an operating system UNIX is! + + - I want to spawn a process. + - I want to know it's pid so that I can kill it. + - I would like to receive a message when it dies of natural causes. + - I want the spawned process to have user-specified arguments. + + The *only way* to parse arguments the way the shells do is to run a + shell (or duplicate what they do, which would be a *lot* of code.) + + The *only way* to know the pid of the process is to fork() and exec() + it in the spawned side of the fork. + + But if you're running a shell to parse your arguments, this gives you + the pid of the SHELL, not the pid of the PROCESS that you're actually + interested in, which is an *inferior* of the shell. This also means + that the SIGCHLD you get applies to the shell, not its inferior. + + So, the only solution other than implementing an argument parser here + is to force the shell to exec() its inferior. What a fucking hack! + We prepend "exec " to the command string. + + (Actually, Clint Wong points out that process groups + might be used to take care of this problem; this may be worth considering + some day, except that, 1: this code works now, so why fix it, and 2: from + what I've seen in Emacs, dealing with process groups isn't especially + portable.) + */ + tmp = command; + command = (char *) malloc (strlen (tmp) + 6); + memcpy (command, "exec ", 5); + memcpy (command + 5, tmp, strlen (tmp) + 1); + + /* Invoke the shell as "/bin/sh -c 'exec prog -arg -arg ...'" */ + av [ac++] = shell; + av [ac++] = "-c"; + av [ac++] = command; + av [ac++] = 0; + + if (verbose_p) + printf ("%s: spawning \"%s\" in pid %d.\n", progname, command, getpid ()); + +#if defined(SYSV) || defined(SVR4) || defined(__hpux) + { + int old_nice = nice (0); + int n = nice_inferior - old_nice; + errno = 0; + if (nice (n) == -1 && errno != 0) + { + sprintf (buf, "%s: %snice(%d) failed", progname, + (verbose_p ? "## " : ""), n); + perror (buf); + } + } +#else /* !SYSV */ +#ifdef PRIO_PROCESS + if (setpriority (PRIO_PROCESS, getpid(), nice_inferior) != 0) + { + sprintf (buf, "%s: %ssetpriority(PRIO_PROCESS, %d, %d) failed", + progname, (verbose_p ? "## " : ""), getpid(), nice_inferior); + perror (buf); + } +#else /* !PRIO_PROCESS */ + if (nice_inferior != 0) + fprintf (stderr, + "%s: %sdon't know how to change process priority on this system.\n", + progname, (verbose_p ? "## " : "")); +#endif /* !PRIO_PROCESS */ +#endif /* !SYSV */ + + /* Now overlay the current process with /bin/sh running the command. + If this returns, it's an error. + */ + execve (av [0], av, environ); + + sprintf (buf, "%s: %sexecve() failed", progname, (verbose_p ? "## " : "")); + perror (buf); + exit (1); /* Note that this only exits a child fork. */ +} + +/* to avoid a race between the main thread and the SIGCHLD handler */ +static int killing = 0; +static Bool suspending = False; + +static char *current_hack_name P((void)); + +static void +#if __STDC__ +await_child_death (Bool killed) +#else +await_child_death (killed) + Bool killed; +#endif +{ + Bool suspended_p = False; + int status; + pid_t kid; + killing = 1; + if (! pid) + return; + + do + { + kid = waitpid (pid, &status, WUNTRACED); + } + while (kid == -1 && errno == EINTR); + + if (kid == pid) + { + if (WIFEXITED (status)) + { + int exit_status = WEXITSTATUS (status); + if (exit_status & 0x80) + exit_status |= ~0xFF; + /* One might assume that exiting with non-0 means something went + wrong. But that loser xswarm exits with the code that it was + killed with, so it *always* exits abnormally. Treat abnormal + exits as "normal" (don't mention them) if we've just killed + the subprocess. But mention them if they happen on their own. + */ + if (exit_status != 0 && (verbose_p || (! killed))) + fprintf (stderr, + "%s: %schild pid %d (%s) exited abnormally (code %d).\n", + progname, (verbose_p ? "## " : ""), + pid, current_hack_name (), exit_status); + else if (verbose_p) + printf ("%s: child pid %d (%s) exited normally.\n", + progname, pid, current_hack_name ()); + } + else if (WIFSIGNALED (status)) + { + if (!killed || WTERMSIG (status) != SIGTERM) + fprintf (stderr, + "%s: %schild pid %d (%s) terminated with signal %d!\n", + progname, (verbose_p ? "## " : ""), + pid, current_hack_name (), WTERMSIG (status)); + else if (verbose_p) + printf ("%s: child pid %d (%s) terminated with SIGTERM.\n", + progname, pid, current_hack_name ()); + } + else if (suspending) + { + suspended_p = True; + suspending = False; /* complain if it happens twice */ + } + else if (WIFSTOPPED (status)) + { + suspended_p = True; + fprintf (stderr, "%s: %schild pid %d (%s) stopped with signal %d!\n", + progname, (verbose_p ? "## " : ""), pid, + current_hack_name (), WSTOPSIG (status)); + } + else + fprintf (stderr, "%s: %schild pid %d (%s) died in a mysterious way!", + progname, (verbose_p ? "## " : ""), pid, current_hack_name()); + } + else if (kid <= 0) + fprintf (stderr, "%s: %swaitpid(%d, ...) says there are no kids? (%d)\n", + progname, (verbose_p ? "## " : ""), pid, kid); + else + fprintf (stderr, "%s: %swaitpid(%d, ...) says proc %d died, not %d?\n", + progname, (verbose_p ? "## " : ""), pid, kid, pid); + killing = 0; + if (suspended_p != True) + pid = 0; +} + +static char * +current_hack_name () +{ + static char chn [1024]; + char *hack = (demo_mode_p ? demo_hack : screenhacks [current_hack]); + int i; + for (i = 0; hack [i] != 0 && hack [i] != ' ' && hack [i] != '\t'; i++) + chn [i] = hack [i]; + chn [i] = 0; + return chn; +} + +#ifdef SIGCHLD +static void +sigchld_handler (sig) + int sig; +{ + if (killing) + return; + if (! pid) + abort (); + await_child_death (False); +} +#endif + + +void +init_sigchld () +{ +#ifdef SIGCHLD + if (((int) signal (SIGCHLD, sigchld_handler)) == -1) + { + char buf [255]; + sprintf (buf, "%s: %scouldn't catch SIGCHLD", progname, + (verbose_p ? "## " : "")); + perror (buf); + } +#endif +} + + +extern void raise_window P((Bool inhibit_fade, Bool between_hacks_p)); + +void +spawn_screenhack (first_time_p) + Bool first_time_p; +{ + raise_window (first_time_p, True); + XFlush (dpy); + + if (screenhacks_count || demo_mode_p) + { + char *hack; + pid_t forked; + char buf [255]; + int new_hack; + if (demo_mode_p) + { + hack = demo_hack; + } + else + { + if (screenhacks_count == 1) + new_hack = 0; + else if (next_mode_p == 1) + new_hack = (current_hack + 1) % screenhacks_count, + next_mode_p = 0; + else if (next_mode_p == 2) + { + new_hack = ((current_hack + screenhacks_count - 1) + % screenhacks_count); + next_mode_p = 0; + } + else + while ((new_hack = random () % screenhacks_count) == current_hack) + ; + current_hack = new_hack; + hack = screenhacks[current_hack]; + } + + switch (forked = fork ()) + { + case -1: + sprintf (buf, "%s: %scouldn't fork", + progname, (verbose_p ? "## " : "")); + perror (buf); + restore_real_vroot (); + exit (1); + case 0: + exec_screenhack (hack); /* this does not return */ + break; + default: + pid = forked; + break; + } + } +} + +void +kill_screenhack () +{ + killing = 1; + if (! pid) + return; + if (kill (pid, SIGTERM) < 0) + { + if (errno == ESRCH) + { + /* Sometimes we don't get a SIGCHLD at all! WTF? + It's a race condition. It looks to me like what's happening is + something like: a subprocess dies of natural causes. There is a + small window between when the process dies and when the SIGCHLD + is (would have been) delivered. If we happen to try to kill() + the process during that time, the kill() fails, because the + process is already dead. But! no SIGCHLD is delivered (perhaps + because the failed kill() has reset some state in the kernel?) + Anyway, if kill() says "No such process", then we have to wait() + for it anyway, because the process has already become a zombie. + I love Unix. + */ + await_child_death (False); + } + else + { + char buf [255]; + sprintf (buf, "%s: %scouldn't kill child process %d", progname, + (verbose_p ? "## " : ""), pid); + perror (buf); + } + } + else + { + if (verbose_p) + printf ("%s: killing pid %d.\n", progname, pid); + await_child_death (True); + } +} + + +void +suspend_screenhack (suspend_p) + Bool suspend_p; +{ + + suspending = suspend_p; + if (! pid) + ; + else if (kill (pid, (suspend_p ? SIGSTOP : SIGCONT)) < 0) + { + char buf [255]; + sprintf (buf, "%s: %scouldn't %s child process %d", progname, + (verbose_p ? "## " : ""), + (suspend_p ? "suspend" : "resume"), + pid); + perror (buf); + } + else if (verbose_p) + printf ("%s: %s pid %d.\n", progname, + (suspend_p ? "suspending" : "resuming"), pid); +} + + +/* Restarting the xscreensaver process from scratch. */ + +static char **saved_argv; + +void +save_argv (argc, argv) + int argc; + char **argv; +{ + saved_argv = (char **) malloc ((argc + 2) * sizeof (char *)); + saved_argv [argc] = 0; + while (argc--) + { + int i = strlen (argv [argc]) + 1; + saved_argv [argc] = (char *) malloc (i); + memcpy (saved_argv [argc], argv [argc], i); + } +} + +void +restart_process () +{ + XCloseDisplay (dpy); + fflush (stdout); + fflush (stderr); + execvp (saved_argv [0], saved_argv); + fprintf (stderr, "%s: %scould not restart process: %s (%d)\n", + progname, (verbose_p ? "## " : ""), + (errno == E2BIG ? "arglist too big" : + errno == EACCES ? "could not execute" : + errno == EFAULT ? "memory fault" : + errno == EIO ? "I/O error" : + errno == ENAMETOOLONG ? "name too long" : + errno == ELOOP ? "too many symbolic links" : + errno == ENOENT ? "file no longer exists" : + errno == ENOTDIR ? "directory no longer exists" : + errno == ENOEXEC ? "bad executable file" : + errno == ENOMEM ? "out of memory" : + "execvp() returned unknown error code"), + errno); + exit (1); +} + +void +demo_mode_restart_process () +{ + int i; + for (i = 0; saved_argv [i]; i++); + /* add the -demo switch; save_argv() left room for this. */ + saved_argv [i] = "-demo"; + saved_argv [i+1] = 0; + restart_process (); +} + +void +hack_environment () +{ + /* Store $DISPLAY into the environment, so that the $DISPLAY variable that + the spawned processes inherit is the same as the value of -display passed + in on our command line (which is not necessarily the same as what our + $DISPLAY variable is.) + */ + char *s, buf [2048]; + int i; + sprintf (buf, "DISPLAY=%s", DisplayString (dpy)); + i = strlen (buf); + s = (char *) malloc (i+1); + strncpy (s, buf, i+1); + if (putenv (s)) + abort (); +} + + +/* Change the uid/gid of the screensaver process, so that it is safe for it + to run setuid root (which it needs to do on some systems to read the + encrypted passwords from the passwd file.) + + hack_uid() is run before opening the X connection, so that XAuth works. + hack_uid_warn() is called after the connection is opened and the command + line arguments are parsed, so that the messages from hack_uid() get + printed after we know whether we're in `verbose' mode. + */ + +#ifndef NO_SETUID + +static int hack_uid_errno; +static char hack_uid_buf [255], *hack_uid_error; + +void +hack_uid () +{ + /* If we've been run as setuid or setgid to someone else (most likely root) + turn off the extra permissions so that random user-specified programs + don't get special privileges. (On some systems it might be necessary + to install this as setuid root in order to read the passwd file to + implement lock-mode...) + */ + setgid (getgid ()); + setuid (getuid ()); + + hack_uid_errno = 0; + hack_uid_error = 0; + + /* If we're being run as root (as from xdm) then switch the user id + to something safe. */ + if (getuid () == 0) + { + struct passwd *p; + /* Locking can't work when running as root, because we have no way of + knowing what the user id of the logged in user is (so we don't know + whose password to prompt for.) + */ + locking_disabled_p = True; + nolock_reason = "running as root"; + p = getpwnam ("nobody"); + if (! p) p = getpwnam ("daemon"); + if (! p) p = getpwnam ("bin"); + if (! p) p = getpwnam ("sys"); + if (! p) + { + hack_uid_error = "couldn't find safe uid; running as root."; + hack_uid_errno = -1; + } + else + { + struct group *g = getgrgid (p->pw_gid); + hack_uid_error = hack_uid_buf; + sprintf (hack_uid_error, "changing uid/gid to %s/%s (%d/%d).", + p->pw_name, (g ? g->gr_name : "???"), p->pw_uid, p->pw_gid); + + /* Change the gid to be a safe one. If we can't do that, then + print a warning. We change the gid before the uid so that we + change the gid while still root. */ + if (setgid (p->pw_gid) != 0) + { + hack_uid_errno = errno; + sprintf (hack_uid_error, "couldn't set gid to %s (%d)", + (g ? g->gr_name : "???"), p->pw_gid); + } + + /* Now change the uid to be a safe one. */ + if (setuid (p->pw_uid) != 0) + { + hack_uid_errno = errno; + sprintf (hack_uid_error, "couldn't set uid to %s (%d)", + p->pw_name, p->pw_uid); + } + } + } +#ifndef NO_LOCKING + else /* disable locking if already being run as "someone else" */ + { + struct passwd *p = getpwuid (getuid ()); + if (!p || + !strcmp (p->pw_name, "root") || + !strcmp (p->pw_name, "nobody") || + !strcmp (p->pw_name, "daemon") || + !strcmp (p->pw_name, "bin") || + !strcmp (p->pw_name, "sys")) + { + locking_disabled_p = True; + nolock_reason = hack_uid_buf; + sprintf (nolock_reason, "running as %s", p->pw_name); + } + } +#endif /* NO_LOCKING */ +} + +void +hack_uid_warn () +{ + if (! hack_uid_error) + ; + else if (hack_uid_errno == 0) + { + if (verbose_p) + printf ("%s: %s\n", progname, hack_uid_error); + } + else + { + char buf [255]; + sprintf (buf, "%s: %s%s", progname, (verbose_p ? "## " : ""), + hack_uid_error); + if (hack_uid_errno == -1) + fprintf (stderr, "%s\n", buf); + else + { + errno = hack_uid_errno; + perror (buf); + } + } +} + +#endif /* !NO_SETUID */ diff --git a/driver/timers.c b/driver/timers.c new file mode 100755 index 00000000..82190329 --- /dev/null +++ b/driver/timers.c @@ -0,0 +1,477 @@ +/* xscreensaver, Copyright (c) 1991-1995 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 DEBUG_TIMERS */ + +#include +#include +#include +#include +#ifndef VMS +#include +#else +#include "sys$common:[decw$include.xmu]Error.h" +#endif + + +#ifdef HAVE_XIDLE_EXTENSION +#include +#endif /* HAVE_XIDLE_EXTENSION */ + +#ifdef HAVE_SAVER_EXTENSION +#include +extern int saver_ext_event_number; +extern Window server_saver_window; +#endif /* HAVE_SAVER_EXTENSION */ + +#include "xscreensaver.h" + +#if __STDC__ +# define P(x)x +#else +#define P(x)() +#endif + +extern XtAppContext app; + +Time cycle; +Time timeout; +Time pointer_timeout; +Time notice_events_timeout; + +extern Bool use_xidle_extension; +extern Bool use_saver_extension; +extern Bool dbox_up_p; +extern Bool locked_p; +extern Window screensaver_window; + +extern Bool handle_clientmessage P((XEvent *, Bool)); + +static time_t last_activity_time; /* for when we have no server extensions */ +static XtIntervalId timer_id = 0; +static XtIntervalId check_pointer_timer_id = 0; +XtIntervalId cycle_id = 0; +XtIntervalId lock_id = 0; + +void +idle_timer (junk1, junk2) + void *junk1; + XtPointer junk2; +{ + /* What an amazingly shitty design. Not only does Xt execute timeout + events from XtAppNextEvent() instead of from XtDispatchEvent(), but + there is no way to tell Xt to block until there is an X event OR a + timeout happens. Once your timeout proc is called, XtAppNextEvent() + still won't return until a "real" X event comes in. + + So this function pushes a stupid, gratuitous, unnecessary event back + on the event queue to force XtAppNextEvent to return Right Fucking Now. + When the code in sleep_until_idle() sees an event of type XAnyEvent, + which the server never generates, it knows that a timeout has occurred. + */ + XEvent fake_event; + fake_event.type = 0; /* XAnyEvent type, ignored. */ + fake_event.xany.display = dpy; + fake_event.xany.window = 0; + XPutBackEvent (dpy, &fake_event); +} + + +static void +#if __STDC__ +notice_events (Window window, Bool top_p) +#else +notice_events (window, top_p) + Window window; + Bool top_p; +#endif +{ + XWindowAttributes attrs; + unsigned long events; + Window root, parent, *kids; + unsigned int nkids; + + if (XtWindowToWidget (dpy, window)) + /* If it's one of ours, don't mess up its event mask. */ + return; + + if (!XQueryTree (dpy, window, &root, &parent, &kids, &nkids)) + return; + if (window == root) + top_p = False; + + XGetWindowAttributes (dpy, window, &attrs); + events = ((attrs.all_event_masks | attrs.do_not_propagate_mask) + & KeyPressMask); + + /* Select for SubstructureNotify on all windows. + Select for KeyPress on all windows that already have it selected. + Do we need to select for ButtonRelease? I don't think so. + */ + XSelectInput (dpy, window, SubstructureNotifyMask | events); + + if (top_p && verbose_p && (events & KeyPressMask)) + { + /* Only mention one window per tree (hack hack). */ + printf ("%s: selected KeyPress on 0x%lX\n", progname, + (unsigned long) window); + top_p = False; + } + + if (kids) + { + while (nkids) + notice_events (kids [--nkids], top_p); + XFree ((char *) kids); + } +} + + +int +BadWindow_ehandler (dpy, error) + Display *dpy; + XErrorEvent *error; +{ + /* When we notice a window being created, we spawn a timer that waits + 30 seconds or so, and then selects events on that window. This error + handler is used so that we can cope with the fact that the window + may have been destroyed <30 seconds after it was created. + */ + if (error->error_code == BadWindow || + error->error_code == BadMatch || + error->error_code == BadDrawable) + return 0; + XmuPrintDefaultErrorMessage (dpy, error, stderr); + exit (1); +} + +void +notice_events_timer (closure, timer) + XtPointer closure; + XtIntervalId *timer; +{ + Window window = (Window) closure; + int (*old_handler) (); + old_handler = XSetErrorHandler (BadWindow_ehandler); + notice_events (window, True); + XSync (dpy, False); + XSetErrorHandler (old_handler); +} + + +/* When the screensaver is active, this timer will periodically change + the running program. + */ +void +cycle_timer (junk1, junk2) + void *junk1; + XtPointer junk2; +{ + Time how_long = cycle; + if (dbox_up_p) + { + if (verbose_p) + printf ("%s: dbox up; delaying hack change.\n", progname); + how_long = 30000; /* 30 secs */ + } + else + { + if (verbose_p) + printf ("%s: changing graphics hacks.\n", progname); + kill_screenhack (); + spawn_screenhack (False); + } + cycle_id = XtAppAddTimeOut (app, how_long, cycle_timer, 0); + +#ifdef DEBUG_TIMERS + if (verbose_p) + printf ("%s: starting cycle_timer (%ld, %ld)\n", + progname, how_long, cycle_id); +#endif +} + + +void +activate_lock_timer (junk1, junk2) + void *junk1; + XtPointer junk2; +{ + if (verbose_p) + printf ("%s: timed out; activating lock\n", progname); + locked_p = True; +} + + +/* Call this when user activity (or "simulated" activity) has been noticed. + */ +static void +reset_timers P((void)) +{ + if (use_saver_extension) + return; + +#ifdef DEBUG_TIMERS + if (verbose_p) + printf ("%s: restarting idle_timer (%ld, %ld)\n", + progname, timeout, timer_id); +#endif + XtRemoveTimeOut (timer_id); + timer_id = XtAppAddTimeOut (app, timeout, idle_timer, 0); + if (cycle_id) abort (); + +#ifdef DEBUG_TIMERS + if (verbose_p) + printf ("%s: starting idle_timer (%ld, %ld)\n", + progname, timeout, timer_id); +#endif + + last_activity_time = time ((time_t *) 0); +} + +/* When we aren't using a server extension, this timer is used to periodically + wake up and poll the mouse position, which is possibly more reliable than + selecting motion events on every window. + */ +static void +check_pointer_timer (closure, this_timer) + void *closure; + XtPointer this_timer; +{ + static int last_root_x = -1; + static int last_root_y = -1; + static Window last_child = (Window) -1; + static unsigned int last_mask = 0; + Window root, child; + int root_x, root_y, x, y; + unsigned int mask; + XtIntervalId *timerP = (XtIntervalId *) closure; + + if (use_xidle_extension || use_saver_extension) + abort (); + + *timerP = XtAppAddTimeOut (app, pointer_timeout, check_pointer_timer, + closure); + + XQueryPointer (dpy, screensaver_window, &root, &child, + &root_x, &root_y, &x, &y, &mask); + if (root_x == last_root_x && root_y == last_root_y && + child == last_child && mask == last_mask) + return; + +#ifdef DEBUG_TIMERS + if (verbose_p && this_timer) + if (root_x == last_root_x && root_y == last_root_y && child == last_child) + printf ("%s: modifiers changed at %s.\n", progname, timestring ()); + else + printf ("%s: pointer moved at %s.\n", progname, timestring ()); +#endif + + last_root_x = root_x; + last_root_y = root_y; + last_child = child; + last_mask = mask; + + reset_timers (); +} + + +void +sleep_until_idle (until_idle_p) + Bool until_idle_p; +{ + XEvent event; + + if (until_idle_p) + { + if (!use_saver_extension) + { + /* Wake up periodically to ask the server if we are idle. */ + timer_id = XtAppAddTimeOut (app, timeout, idle_timer, 0); +#ifdef DEBUG_TIMERS + if (verbose_p) + printf ("%s: starting idle_timer (%ld, %ld)\n", + progname, timeout, timer_id); +#endif + } + + if (!use_xidle_extension && !use_saver_extension) + /* start polling the mouse position */ + check_pointer_timer (&check_pointer_timer_id, 0); + } + + while (1) + { + XtAppNextEvent (app, &event); + + switch (event.xany.type) { + case 0: /* our synthetic "timeout" event has been signalled */ + if (until_idle_p) + { + Time idle; +#ifdef HAVE_XIDLE_EXTENSION + if (use_xidle_extension) + { + if (! XGetIdleTime (dpy, &idle)) + { + fprintf (stderr, "%s: %sXGetIdleTime() failed.\n", + progname, (verbose_p ? "## " : "")); + exit (1); + } + } + else +#endif /* HAVE_XIDLE_EXTENSION */ +#ifdef HAVE_SAVER_EXTENSION + if (use_saver_extension) + { + /* We don't need to do anything in this case - the synthetic + event isn't necessary, as we get sent specific events + to wake us up. */ + idle = 0; + } + else +#endif /* HAVE_SAVER_EXTENSION */ + { + idle = 1000 * (last_activity_time - time ((time_t *) 0)); + } + + if (idle >= timeout) + goto DONE; + else if (!use_saver_extension) + { + timer_id = XtAppAddTimeOut (app, timeout - idle, + idle_timer, 0); +#ifdef DEBUG_TIMERS + if (verbose_p) + printf ("%s: starting idle_timer (%ld, %ld)\n", + progname, timeout - idle, timer_id); +#endif /* DEBUG_TIMERS */ + } + } + break; + + case ClientMessage: + if (handle_clientmessage (&event, until_idle_p)) + goto DONE; + break; + + case CreateNotify: + if (!use_xidle_extension && !use_saver_extension) + { + XtAppAddTimeOut (app, notice_events_timeout, notice_events_timer, + (XtPointer) event.xcreatewindow.window); +#ifdef DEBUG_TIMERS + if (verbose_p) + printf ("%s: starting notice_events_timer for 0x%X (%lu)\n", + progname, + (unsigned int) event.xcreatewindow.window, + notice_events_timeout); +#endif /* DEBUG_TIMERS */ + } + break; + + case KeyPress: + case KeyRelease: + case ButtonPress: + case ButtonRelease: + case MotionNotify: + +#ifdef DEBUG_TIMERS + if (verbose_p) + { + if (event.xany.type == MotionNotify) + printf ("%s: MotionNotify at %s\n", progname, timestring ()); + else if (event.xany.type == KeyPress) + printf ("%s: KeyPress seen on 0x%X at %s\n", progname, + (unsigned int) event.xkey.window, timestring ()); + } +#endif + + /* We got a user event */ + if (!until_idle_p) + goto DONE; + else + reset_timers (); + break; + + default: + +#ifdef HAVE_SAVER_EXTENSION + if (event.type == saver_ext_event_number) + { + XScreenSaverNotifyEvent *sevent = + (XScreenSaverNotifyEvent *) &event; + if (sevent->state == ScreenSaverOn) + { +# ifdef DEBUG_TIMERS + if (verbose_p) + printf ("%s: ScreenSaverOn event received at %s\n", + progname, timestring ()); +# endif /* DEBUG_TIMERS */ + + /* Get the "real" server window out of the way as soon + as possible. */ + if (server_saver_window && + window_exists_p (dpy, server_saver_window)) + XUnmapWindow (dpy, server_saver_window); + + if (sevent->kind != ScreenSaverExternal) + { +# ifdef DEBUG_TIMERS + fprintf (stderr, + "%s: ScreenSaverOn event wasn't of type External!\n", + progname); +# endif /* DEBUG_TIMERS */ + } + + if (until_idle_p) + goto DONE; + } + else if (sevent->state == ScreenSaverOff) + { +# ifdef DEBUG_TIMERS + if (verbose_p) + printf ("%s: ScreenSaverOff event received at %s\n", + progname, timestring ()); +# endif /* DEBUG_TIMERS */ + if (!until_idle_p) + goto DONE; + } +# ifdef DEBUG_TIMERS + else if (verbose_p) + printf ("%s: unknown ScreenSaver event received at %s\n", + progname, timestring ()); +# endif /* DEBUG_TIMERS */ + } + else + +#endif /* HAVE_SAVER_EXTENSION */ + + XtDispatchEvent (&event); + } + } + DONE: + + if (check_pointer_timer_id) + { + XtRemoveTimeOut (check_pointer_timer_id); + check_pointer_timer_id = 0; + } + if (timer_id) + { + XtRemoveTimeOut (timer_id); + timer_id = 0; + } + + if (until_idle_p && cycle_id) + abort (); + + return; +} diff --git a/driver/timers.c_ori b/driver/timers.c_ori new file mode 100755 index 00000000..bb950d81 --- /dev/null +++ b/driver/timers.c_ori @@ -0,0 +1,472 @@ +/* xscreensaver, Copyright (c) 1991-1995 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 DEBUG_TIMERS */ + +#include +#include +#include +#include +#include + +#ifdef HAVE_XIDLE_EXTENSION +#include +#endif /* HAVE_XIDLE_EXTENSION */ + +#ifdef HAVE_SAVER_EXTENSION +#include +extern int saver_ext_event_number; +extern Window server_saver_window; +#endif /* HAVE_SAVER_EXTENSION */ + +#include "xscreensaver.h" + +#if __STDC__ +# define P(x)x +#else +#define P(x)() +#endif + +extern XtAppContext app; + +Time cycle; +Time timeout; +Time pointer_timeout; +Time notice_events_timeout; + +extern Bool use_xidle_extension; +extern Bool use_saver_extension; +extern Bool dbox_up_p; +extern Bool locked_p; +extern Window screensaver_window; + +extern Bool handle_clientmessage P((XEvent *, Bool)); + +static time_t last_activity_time; /* for when we have no server extensions */ +static XtIntervalId timer_id = 0; +static XtIntervalId check_pointer_timer_id = 0; +XtIntervalId cycle_id = 0; +XtIntervalId lock_id = 0; + +void +idle_timer (junk1, junk2) + void *junk1; + XtPointer junk2; +{ + /* What an amazingly shitty design. Not only does Xt execute timeout + events from XtAppNextEvent() instead of from XtDispatchEvent(), but + there is no way to tell Xt to block until there is an X event OR a + timeout happens. Once your timeout proc is called, XtAppNextEvent() + still won't return until a "real" X event comes in. + + So this function pushes a stupid, gratuitous, unnecessary event back + on the event queue to force XtAppNextEvent to return Right Fucking Now. + When the code in sleep_until_idle() sees an event of type XAnyEvent, + which the server never generates, it knows that a timeout has occurred. + */ + XEvent fake_event; + fake_event.type = 0; /* XAnyEvent type, ignored. */ + fake_event.xany.display = dpy; + fake_event.xany.window = 0; + XPutBackEvent (dpy, &fake_event); +} + + +static void +#if __STDC__ +notice_events (Window window, Bool top_p) +#else +notice_events (window, top_p) + Window window; + Bool top_p; +#endif +{ + XWindowAttributes attrs; + unsigned long events; + Window root, parent, *kids; + unsigned int nkids; + + if (XtWindowToWidget (dpy, window)) + /* If it's one of ours, don't mess up its event mask. */ + return; + + if (!XQueryTree (dpy, window, &root, &parent, &kids, &nkids)) + return; + if (window == root) + top_p = False; + + XGetWindowAttributes (dpy, window, &attrs); + events = ((attrs.all_event_masks | attrs.do_not_propagate_mask) + & KeyPressMask); + + /* Select for SubstructureNotify on all windows. + Select for KeyPress on all windows that already have it selected. + Do we need to select for ButtonRelease? I don't think so. + */ + XSelectInput (dpy, window, SubstructureNotifyMask | events); + + if (top_p && verbose_p && (events & KeyPressMask)) + { + /* Only mention one window per tree (hack hack). */ + printf ("%s: selected KeyPress on 0x%lX\n", progname, + (unsigned long) window); + top_p = False; + } + + if (kids) + { + while (nkids) + notice_events (kids [--nkids], top_p); + XFree ((char *) kids); + } +} + + +int +BadWindow_ehandler (dpy, error) + Display *dpy; + XErrorEvent *error; +{ + /* When we notice a window being created, we spawn a timer that waits + 30 seconds or so, and then selects events on that window. This error + handler is used so that we can cope with the fact that the window + may have been destroyed <30 seconds after it was created. + */ + if (error->error_code == BadWindow || + error->error_code == BadMatch || + error->error_code == BadDrawable) + return 0; + XmuPrintDefaultErrorMessage (dpy, error, stderr); + exit (1); +} + +void +notice_events_timer (closure, timer) + XtPointer closure; + XtIntervalId *timer; +{ + Window window = (Window) closure; + int (*old_handler) (); + old_handler = XSetErrorHandler (BadWindow_ehandler); + notice_events (window, True); + XSync (dpy, False); + XSetErrorHandler (old_handler); +} + + +/* When the screensaver is active, this timer will periodically change + the running program. + */ +void +cycle_timer (junk1, junk2) + void *junk1; + XtPointer junk2; +{ + Time how_long = cycle; + if (dbox_up_p) + { + if (verbose_p) + printf ("%s: dbox up; delaying hack change.\n", progname); + how_long = 30000; /* 30 secs */ + } + else + { + if (verbose_p) + printf ("%s: changing graphics hacks.\n", progname); + kill_screenhack (); + spawn_screenhack (False); + } + cycle_id = XtAppAddTimeOut (app, how_long, cycle_timer, 0); + +#ifdef DEBUG_TIMERS + if (verbose_p) + printf ("%s: starting cycle_timer (%ld, %ld)\n", + progname, how_long, cycle_id); +#endif +} + + +void +activate_lock_timer (junk1, junk2) + void *junk1; + XtPointer junk2; +{ + if (verbose_p) + printf ("%s: timed out; activating lock\n", progname); + locked_p = True; +} + + +/* Call this when user activity (or "simulated" activity) has been noticed. + */ +static void +reset_timers P((void)) +{ + if (use_saver_extension) + return; + +#ifdef DEBUG_TIMERS + if (verbose_p) + printf ("%s: restarting idle_timer (%ld, %ld)\n", + progname, timeout, timer_id); +#endif + XtRemoveTimeOut (timer_id); + timer_id = XtAppAddTimeOut (app, timeout, idle_timer, 0); + if (cycle_id) abort (); + +#ifdef DEBUG_TIMERS + if (verbose_p) + printf ("%s: starting idle_timer (%ld, %ld)\n", + progname, timeout, timer_id); +#endif + + last_activity_time = time ((time_t *) 0); +} + +/* When we aren't using a server extension, this timer is used to periodically + wake up and poll the mouse position, which is possibly more reliable than + selecting motion events on every window. + */ +static void +check_pointer_timer (closure, this_timer) + void *closure; + XtPointer this_timer; +{ + static int last_root_x = -1; + static int last_root_y = -1; + static Window last_child = (Window) -1; + static unsigned int last_mask = 0; + Window root, child; + int root_x, root_y, x, y; + unsigned int mask; + XtIntervalId *timerP = (XtIntervalId *) closure; + + if (use_xidle_extension || use_saver_extension) + abort (); + + *timerP = XtAppAddTimeOut (app, pointer_timeout, check_pointer_timer, + closure); + + XQueryPointer (dpy, screensaver_window, &root, &child, + &root_x, &root_y, &x, &y, &mask); + if (root_x == last_root_x && root_y == last_root_y && + child == last_child && mask == last_mask) + return; + +#ifdef DEBUG_TIMERS + if (verbose_p && this_timer) + if (root_x == last_root_x && root_y == last_root_y && child == last_child) + printf ("%s: modifiers changed at %s.\n", progname, timestring ()); + else + printf ("%s: pointer moved at %s.\n", progname, timestring ()); +#endif + + last_root_x = root_x; + last_root_y = root_y; + last_child = child; + last_mask = mask; + + reset_timers (); +} + + +void +sleep_until_idle (until_idle_p) + Bool until_idle_p; +{ + XEvent event; + + if (until_idle_p) + { + if (!use_saver_extension) + { + /* Wake up periodically to ask the server if we are idle. */ + timer_id = XtAppAddTimeOut (app, timeout, idle_timer, 0); +#ifdef DEBUG_TIMERS + if (verbose_p) + printf ("%s: starting idle_timer (%ld, %ld)\n", + progname, timeout, timer_id); +#endif + } + + if (!use_xidle_extension && !use_saver_extension) + /* start polling the mouse position */ + check_pointer_timer (&check_pointer_timer_id, 0); + } + + while (1) + { + XtAppNextEvent (app, &event); + + switch (event.xany.type) { + case 0: /* our synthetic "timeout" event has been signalled */ + if (until_idle_p) + { + Time idle; +#ifdef HAVE_XIDLE_EXTENSION + if (use_xidle_extension) + { + if (! XGetIdleTime (dpy, &idle)) + { + fprintf (stderr, "%s: %sXGetIdleTime() failed.\n", + progname, (verbose_p ? "## " : "")); + exit (1); + } + } + else +#endif /* HAVE_XIDLE_EXTENSION */ +#ifdef HAVE_SAVER_EXTENSION + if (use_saver_extension) + { + /* We don't need to do anything in this case - the synthetic + event isn't necessary, as we get sent specific events + to wake us up. */ + idle = 0; + } + else +#endif /* HAVE_SAVER_EXTENSION */ + { + idle = 1000 * (last_activity_time - time ((time_t *) 0)); + } + + if (idle >= timeout) + goto DONE; + else if (!use_saver_extension) + { + timer_id = XtAppAddTimeOut (app, timeout - idle, + idle_timer, 0); +#ifdef DEBUG_TIMERS + if (verbose_p) + printf ("%s: starting idle_timer (%ld, %ld)\n", + progname, timeout - idle, timer_id); +#endif /* DEBUG_TIMERS */ + } + } + break; + + case ClientMessage: + if (handle_clientmessage (&event, until_idle_p)) + goto DONE; + break; + + case CreateNotify: + if (!use_xidle_extension && !use_saver_extension) + { + XtAppAddTimeOut (app, notice_events_timeout, notice_events_timer, + (XtPointer) event.xcreatewindow.window); +#ifdef DEBUG_TIMERS + if (verbose_p) + printf ("%s: starting notice_events_timer for 0x%X (%lu)\n", + progname, + (unsigned int) event.xcreatewindow.window, + notice_events_timeout); +#endif /* DEBUG_TIMERS */ + } + break; + + case KeyPress: + case KeyRelease: + case ButtonPress: + case ButtonRelease: + case MotionNotify: + +#ifdef DEBUG_TIMERS + if (verbose_p) + { + if (event.xany.type == MotionNotify) + printf ("%s: MotionNotify at %s\n", progname, timestring ()); + else if (event.xany.type == KeyPress) + printf ("%s: KeyPress seen on 0x%X at %s\n", progname, + (unsigned int) event.xkey.window, timestring ()); + } +#endif + + /* We got a user event */ + if (!until_idle_p) + goto DONE; + else + reset_timers (); + break; + + default: + +#ifdef HAVE_SAVER_EXTENSION + if (event.type == saver_ext_event_number) + { + XScreenSaverNotifyEvent *sevent = + (XScreenSaverNotifyEvent *) &event; + if (sevent->state == ScreenSaverOn) + { +# ifdef DEBUG_TIMERS + if (verbose_p) + printf ("%s: ScreenSaverOn event received at %s\n", + progname, timestring ()); +# endif /* DEBUG_TIMERS */ + + /* Get the "real" server window out of the way as soon + as possible. */ + if (server_saver_window && + window_exists_p (dpy, server_saver_window)) + XUnmapWindow (dpy, server_saver_window); + + if (sevent->kind != ScreenSaverExternal) + { +# ifdef DEBUG_TIMERS + fprintf (stderr, + "%s: ScreenSaverOn event wasn't of type External!\n", + progname); +# endif /* DEBUG_TIMERS */ + } + + if (until_idle_p) + goto DONE; + } + else if (sevent->state == ScreenSaverOff) + { +# ifdef DEBUG_TIMERS + if (verbose_p) + printf ("%s: ScreenSaverOff event received at %s\n", + progname, timestring ()); +# endif /* DEBUG_TIMERS */ + if (!until_idle_p) + goto DONE; + } +# ifdef DEBUG_TIMERS + else if (verbose_p) + printf ("%s: unknown ScreenSaver event received at %s\n", + progname, timestring ()); +# endif /* DEBUG_TIMERS */ + } + else + +#endif /* HAVE_SAVER_EXTENSION */ + + XtDispatchEvent (&event); + } + } + DONE: + + if (check_pointer_timer_id) + { + XtRemoveTimeOut (check_pointer_timer_id); + check_pointer_timer_id = 0; + } + if (timer_id) + { + XtRemoveTimeOut (timer_id); + timer_id = 0; + } + + if (until_idle_p && cycle_id) + abort (); + + return; +} diff --git a/driver/validate.c b/driver/validate.c new file mode 100755 index 00000000..3ac9ee53 --- /dev/null +++ b/driver/validate.c @@ -0,0 +1,70 @@ +/* + * validate a password for a user + */ + +/* + * Includes + */ +#include +#include +#include "pwd.h" + +#ifdef VMS +# include +# include "vmsutil.h" +int hash_vms_password(char *output_buf,char *input_buf,int input_length, + char *username,int encryption_type,unsigned short salt); +#endif + +/* + * + * Validate a VMS UserName/Password pair. + * + */ + +int validate_user(name,password) +char *name; +char *password; +{ + char password_buf[64]; + char username_buf[31]; + char encrypt_buf[8]; + register int i; + register char *cp,*cp1; + struct passwd *user_entry; + + /* + * Get the users UAF entry + */ + user_entry = getpwnam(name); + + /* + * If user_entry == NULL then we got a bad error + * return -1 to indicate a bad error + */ + if (user_entry == NULL) return (-1); + + /* + * Uppercase the password + */ + cp = password; + cp1 = password_buf; + while (*cp) + if (islower(*cp)) + *cp1++ = toupper(*cp++); + else + *cp1++ = *cp++; + /* + * Get the length of the password + */ + i = strlen(password); + /* + * Encrypt the password + */ + hash_vms_password(encrypt_buf,password_buf,i,user_entry->pw_name, + user_entry->pw_encrypt, user_entry->pw_salt); + if (bcmp(encrypt_buf,user_entry->pw_passwd,8) == 0) + return(1); + else return(0); +} + diff --git a/driver/vax_deccobjs.zip b/driver/vax_deccobjs.zip new file mode 100755 index 0000000000000000000000000000000000000000..a6abe9c7632460a2495ce1db1eee85d63e433d35 GIT binary patch literal 46108 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 literal 0 HcmV?d00001 diff --git a/driver/version.h b/driver/version.h new file mode 100755 index 00000000..a56e38a5 --- /dev/null +++ b/driver/version.h @@ -0,0 +1,2 @@ +static char *screensaver_id = + "@(#)xscreensaver 1.26, by Jamie Zawinski (jwz@netscape.com)"; diff --git a/driver/vms.opt b/driver/vms.opt new file mode 100755 index 00000000..dd30ef64 --- /dev/null +++ b/driver/vms.opt @@ -0,0 +1,6 @@ +[-.UTILS]UTILS.OLB/LIB +SYS$SHARE:DECW$XMLIBSHR.EXE/SHARE +SYS$SHARE:DECW$XMULIBSHR.EXE/SHARE +SYS$SHARE:DECW$XTSHR.EXE/SHARE +SYS$SHARE:DECW$XLIBSHR.EXE/SHARE +SYS$SHARE:VAXCRTL.EXE/SHARE diff --git a/driver/vms_12.opt b/driver/vms_12.opt new file mode 100755 index 00000000..efd11c38 --- /dev/null +++ b/driver/vms_12.opt @@ -0,0 +1,6 @@ +[-.UTILS]UTILS.OLB/LIB +SYS$SHARE:DECW$XMLIBSHR12.EXE/SHARE +SYS$SHARE:DECW$XMULIBSHRR5.EXE/SHARE +SYS$SHARE:DECW$XTLIBSHRR5.EXE/SHARE +SYS$SHARE:DECW$XLIBSHR.EXE/SHARE +SYS$SHARE:VAXCRTL.EXE/SHARE diff --git a/driver/vms_axp.opt b/driver/vms_axp.opt new file mode 100755 index 00000000..04d465df --- /dev/null +++ b/driver/vms_axp.opt @@ -0,0 +1,5 @@ +[-.UTILS]UTILS.OLB_AXP/LIB +SYS$SHARE:DECW$XMLIBSHR.EXE/SHARE +SYS$SHARE:DECW$XMULIBSHR.EXE/SHARE +SYS$SHARE:DECW$XTSHR.EXE/SHARE +SYS$SHARE:DECW$XLIBSHR.EXE/SHARE diff --git a/driver/vms_axp_12.opt b/driver/vms_axp_12.opt new file mode 100755 index 00000000..25dd1f18 --- /dev/null +++ b/driver/vms_axp_12.opt @@ -0,0 +1,5 @@ +[-.UTILS]UTILS.OLB_AXP/LIB +SYS$SHARE:DECW$XMLIBSHR12.EXE/SHARE +SYS$SHARE:DECW$XMULIBSHRR5.EXE/SHARE +SYS$SHARE:DECW$XTLIBSHRR5.EXE/SHARE +SYS$SHARE:DECW$XLIBSHR.EXE/SHARE diff --git a/driver/vms_decc.opt b/driver/vms_decc.opt new file mode 100755 index 00000000..65bec033 --- /dev/null +++ b/driver/vms_decc.opt @@ -0,0 +1,5 @@ +[-.UTILS]UTILS.OLB_DECC/LIB +SYS$SHARE:DECW$XMLIBSHR.EXE/SHARE +SYS$SHARE:DECW$XMULIBSHR.EXE/SHARE +SYS$SHARE:DECW$XTSHR.EXE/SHARE +SYS$SHARE:DECW$XLIBSHR.EXE/SHARE diff --git a/driver/vms_decc_12.opt b/driver/vms_decc_12.opt new file mode 100755 index 00000000..fdd9a802 --- /dev/null +++ b/driver/vms_decc_12.opt @@ -0,0 +1,5 @@ +[-.UTILS]UTILS.OLB_DECC/LIB +SYS$SHARE:DECW$XMLIBSHR12.EXE/SHARE +SYS$SHARE:DECW$XMULIBSHRR5.EXE/SHARE +SYS$SHARE:DECW$XTLIBSHRR5.EXE/SHARE +SYS$SHARE:DECW$XLIBSHR.EXE/SHARE diff --git a/driver/vmsutil.h b/driver/vmsutil.h new file mode 100755 index 00000000..163cb929 --- /dev/null +++ b/driver/vmsutil.h @@ -0,0 +1,13 @@ +/*#if defined(__DECC) && !defined(__STRING_LOADED)*/ +int bcmp (char *src, char *dest, unsigned long int length); +/*#endif*/ +void bcopy(char *src, char *dest, unsigned long int length); +void bzero(char *src, unsigned long int lenght); +#if !defined(__GNUC__) /* these are defined in stdlib.h */ +char *index( char *string, char *c); +char *rindex( char *string, char *c); +#endif +void Fatal_Error(char *msg, ...); +long random(); +int srandom(unsigned int new_seed); +int unlink(char *filename); diff --git a/driver/wait.h b/driver/wait.h new file mode 100755 index 00000000..b9e97b01 --- /dev/null +++ b/driver/wait.h @@ -0,0 +1 @@ +/* Null file works for VMS */ diff --git a/driver/windows.c b/driver/windows.c new file mode 100755 index 00000000..310cf418 --- /dev/null +++ b/driver/windows.c @@ -0,0 +1,799 @@ +/* xscreensaver, Copyright (c) 1991-1995 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. + */ + +#include + +#ifdef VMS +#include /*to pick up getpid*/ +typedef char * caddr_t; +#endif + +#include +#include +#include +#include +#ifndef VMS +#include +#else +#include "sys$common:[decw$include.xmu]SysUtil.h" +#endif + +#include /* for the signal names */ + +#include "xscreensaver.h" + +#ifdef HAVE_SAVER_EXTENSION +#include +extern Bool use_saver_extension; +#endif /* HAVE_SAVER_EXTENSION */ + +#if __STDC__ +#ifndef __DECC +extern int kill (pid_t, int); /* signal() is in sys/signal.h... */ +#else +extern int kill (int, int); +#endif +#endif /* __STDC__ */ + +extern Time timeout; + +extern Bool lock_p, demo_mode_p; + +Atom XA_VROOT, XA_XSETROOT_ID; +Atom XA_SCREENSAVER_VERSION, XA_SCREENSAVER_ID; + +#if __STDC__ +extern void describe_visual (FILE *, Display *, Visual *); +extern void reset_stderr (void); +#endif + +Window screensaver_window = 0; +Cursor cursor; +Colormap cmap, cmap2; +Bool install_cmap_p; +Bool fade_p, unfade_p; +int fade_seconds, fade_ticks; + +static unsigned long black_pixel; +static Window real_vroot, real_vroot_value; + +#ifdef HAVE_SAVER_EXTENSION +Window server_saver_window = 0; +#endif /* HAVE_SAVER_EXTENSION */ + +#define ALL_POINTER_EVENTS \ + (ButtonPressMask | ButtonReleaseMask | EnterWindowMask | \ + LeaveWindowMask | PointerMotionMask | PointerMotionHintMask | \ + Button1MotionMask | Button2MotionMask | Button3MotionMask | \ + Button4MotionMask | Button5MotionMask | ButtonMotionMask) + +/* I don't really understand Sync vs Async, but these seem to work... */ +#define grab_kbd(win) \ + XGrabKeyboard (dpy, (win), True, GrabModeSync, GrabModeAsync, CurrentTime) +#define grab_mouse(win) \ + XGrabPointer (dpy, (win), True, ALL_POINTER_EVENTS, \ + GrabModeAsync, GrabModeAsync, None, cursor, CurrentTime) + +void +grab_keyboard_and_mouse P((void)) +{ + Status status; + XSync (dpy, False); + + if (demo_mode_p) return; + + status = grab_kbd (screensaver_window); + if (status != GrabSuccess) + { /* try again in a second */ + sleep (1); + status = grab_kbd (screensaver_window); + if (status != GrabSuccess) + fprintf (stderr, "%s: %scouldn't grab keyboard! (%d)\n", + progname, (verbose_p ? "## " : ""), status); + } + status = grab_mouse (screensaver_window); + if (status != GrabSuccess) + { /* try again in a second */ + sleep (1); + status = grab_mouse (screensaver_window); + if (status != GrabSuccess) + fprintf (stderr, "%s: %scouldn't grab pointer! (%d)\n", + progname, (verbose_p ? "## " : ""), status); + } +} + +void +ungrab_keyboard_and_mouse P((void)) +{ + XUngrabPointer (dpy, CurrentTime); + XUngrabKeyboard (dpy, CurrentTime); +} + + +void +ensure_no_screensaver_running () +{ + int i; + Window root = RootWindowOfScreen (screen); + Window root2, parent, *kids; + unsigned int nkids; + int (*old_handler) (); + + old_handler = XSetErrorHandler (BadWindow_ehandler); + + if (! XQueryTree (dpy, root, &root2, &parent, &kids, &nkids)) + abort (); + if (root != root2) + abort (); + if (parent) + abort (); + for (i = 0; i < nkids; i++) + { + Atom type; + int format; + unsigned long nitems, bytesafter; + char *version; + + if (XGetWindowProperty (dpy, kids[i], XA_SCREENSAVER_VERSION, 0, 1, + False, XA_STRING, &type, &format, &nitems, + &bytesafter, (unsigned char **) &version) + == Success + && type != None) + { + char *id; + if (!XGetWindowProperty (dpy, kids[i], XA_SCREENSAVER_ID, 0, 512, + False, XA_STRING, &type, &format, &nitems, + &bytesafter, (unsigned char **) &id) + == Success + || type == None) + id = "???"; + + fprintf (stderr, + "%s: %salready running on display %s (window 0x%x)\n from process %s.\n", + progname, (verbose_p ? "## " : ""), DisplayString (dpy), + (int) kids [i], id); + exit (1); + } + } + + if (kids) XFree ((char *) kids); + XSync (dpy, False); + XSetErrorHandler (old_handler); +} + + +void +disable_builtin_screensaver () +{ + int server_timeout, server_interval, prefer_blank, allow_exp; + /* Turn off the server builtin saver if it is now running. */ + XForceScreenSaver (dpy, ScreenSaverReset); + XGetScreenSaver (dpy, &server_timeout, &server_interval, + &prefer_blank, &allow_exp); + +#ifdef HAVE_SAVER_EXTENSION + if (use_saver_extension) + { + /* Override the values specified with "xset" with our own parameters. */ + prefer_blank = False; + allow_exp = True; + server_interval = 0; + server_timeout = (timeout / 1000); + if (verbose_p) + fprintf (stderr, + "%s: configuring server for saver timeout of %d seconds.\n", + progname, server_timeout); + XSetScreenSaver (dpy, server_timeout, server_interval, + prefer_blank, allow_exp); + } + else +#endif /* HAVE_SAVER_EXTENSION */ + if (server_timeout != 0) + { + server_timeout = 0; + XSetScreenSaver (dpy, server_timeout, server_interval, + prefer_blank, allow_exp); + printf ("%s%sisabling server builtin screensaver.\n\ + You can re-enable it with \"xset s on\".\n", + (verbose_p ? "" : progname), (verbose_p ? "\n\tD" : ": d")); + } +} + + +/* Virtual-root hackery */ + +#ifdef _VROOT_H_ +ERROR! You must not include vroot.h in this file. +#endif + +static void +#if __STDC__ +store_vroot_property (Window win, Window value) +#else +store_vroot_property (win, value) + Window win, value; +#endif +{ +#if 0 + printf ("%s: storing XA_VROOT = 0x%x (%s) = 0x%x (%s)\n", progname, + win, + (win == screensaver_window ? "ScreenSaver" : + (win == real_vroot ? "VRoot" : + (win == real_vroot_value ? "Vroot_value" : "???"))), + value, + (value == screensaver_window ? "ScreenSaver" : + (value == real_vroot ? "VRoot" : + (value == real_vroot_value ? "Vroot_value" : "???")))); +#endif + XChangeProperty (dpy, win, XA_VROOT, XA_WINDOW, 32, PropModeReplace, + (unsigned char *) &value, 1); +} + +static void +#if __STDC__ +remove_vroot_property (Window win) +#else +remove_vroot_property (win) + Window win; +#endif +{ +#if 0 + printf ("%s: removing XA_VROOT from 0x%x (%s)\n", progname, win, + (win == screensaver_window ? "ScreenSaver" : + (win == real_vroot ? "VRoot" : + (win == real_vroot_value ? "Vroot_value" : "???")))); +#endif + XDeleteProperty (dpy, win, XA_VROOT); +} + + +static void +kill_xsetroot_data P((void)) +{ + Atom type; + int format; + unsigned long nitems, bytesafter; + Pixmap *dataP = 0; + + /* If the user has been using xv or xsetroot as a screensaver (to display + an image on the screensaver window, as a kind of slideshow) then the + pixmap and its associated color cells have been put in RetainPermanent + CloseDown mode. Since we're not destroying the xscreensaver window, + but merely unmapping it, we need to free these resources or those + colormap cells will stay allocated while the screensaver is off. (We + could just delete the screensaver window and recreate it later, but + that could cause other problems.) This code does an atomic read-and- + delete of the _XSETROOT_ID property, and if it held a pixmap, then we + cause the RetainPermanent resources of the client which created it + (and which no longer exists) to be freed. + */ + if (XGetWindowProperty (dpy, screensaver_window, XA_XSETROOT_ID, 0, 1, + True, AnyPropertyType, &type, &format, &nitems, + &bytesafter, (unsigned char **) &dataP) + == Success + && type != None) + { + if (dataP && *dataP && type == XA_PIXMAP && format == 32 && + nitems == 1 && bytesafter == 0) + { + if (verbose_p) + printf ("%s: destroying xsetroot data (0x%lX).\n", + progname, *dataP); + XKillClient (dpy, *dataP); + } + else + fprintf (stderr, "%s: %sdeleted unrecognised _XSETROOT_ID property: \n\ + %lu, %lu; type: %lu, format: %d, nitems: %lu, bytesafter %ld\n", + progname, (verbose_p ? "## " : ""), + (unsigned long) dataP, (dataP ? *dataP : 0), type, + format, nitems, bytesafter); + } +} + + +static void handle_signals P((Bool on_p)); + +static void +save_real_vroot P((void)) +{ + int i; + Window root = RootWindowOfScreen (screen); + Window root2, parent, *kids; + unsigned int nkids; + + real_vroot = 0; + real_vroot_value = 0; + if (! XQueryTree (dpy, root, &root2, &parent, &kids, &nkids)) + abort (); + if (root != root2) + abort (); + if (parent) + abort (); + for (i = 0; i < nkids; i++) + { + Atom type; + int format; + unsigned long nitems, bytesafter; + Window *vrootP = 0; + + if (XGetWindowProperty (dpy, kids[i], XA_VROOT, 0, 1, False, XA_WINDOW, + &type, &format, &nitems, &bytesafter, + (unsigned char **) &vrootP) + != Success) + continue; + if (! vrootP) + continue; + if (real_vroot) + { + if (*vrootP == screensaver_window) abort (); + fprintf (stderr, + "%s: %smore than one virtual root window found (0x%x and 0x%x).\n", + progname, (verbose_p ? "## " : ""), + (int) real_vroot, (int) kids [i]); + exit (1); + } + real_vroot = kids [i]; + real_vroot_value = *vrootP; + } + + if (real_vroot) + { + handle_signals (True); + remove_vroot_property (real_vroot); + XSync (dpy, False); + } + + XFree ((char *) kids); +} + +static Bool +restore_real_vroot_1 P((void)) +{ + if (verbose_p && real_vroot) + printf ("%s: restoring __SWM_VROOT property on the real vroot (0x%lx).\n", + progname, (unsigned long) real_vroot); + remove_vroot_property (screensaver_window); + if (real_vroot) + { + store_vroot_property (real_vroot, real_vroot_value); + real_vroot = 0; + real_vroot_value = 0; + /* make sure the property change gets there before this process + terminates! We might be doing this because we have intercepted + SIGTERM or something. */ + XSync (dpy, False); + return True; + } + return False; +} + +void +restore_real_vroot () +{ + if (restore_real_vroot_1 ()) + handle_signals (False); +} + + +/* Signal hackery to ensure that the vroot doesn't get left in an + inconsistent state + */ + +static const char *sig_names [255] = { 0 }; + +static void +restore_real_vroot_handler (sig) + int sig; +{ + signal (sig, SIG_DFL); + if (restore_real_vroot_1 ()) + fprintf (stderr, "\n%s: %s%s (%d) intercepted, vroot restored.\n", + progname, (verbose_p ? "## " : ""), + ((sig < sizeof(sig_names) && sig >= 0 && sig_names [sig]) + ? sig_names [sig] : "unknown signal"), + sig); + kill (getpid (), sig); +} + + +static void +#if __STDC__ +catch_signal (int sig, char *signame, Bool on_p) +#else +catch_signal (sig, signame, on_p) + int sig; + char *signame; + Bool on_p; +#endif +{ + if (! on_p) + signal (sig, SIG_DFL); + else + { + sig_names [sig] = signame; + if (((int) signal (sig, restore_real_vroot_handler)) == -1) + { + char buf [255]; + sprintf (buf, "%s: %scouldn't catch %s (%d)", progname, + (verbose_p ? "## " : ""), signame, sig); + perror (buf); + restore_real_vroot (); + exit (1); + } + } +} + +static void +handle_signals (on_p) + Bool on_p; +{ +#if 0 + if (on_p) printf ("handling signals\n"); + else printf ("unhandling signals\n"); +#endif + + catch_signal (SIGHUP, "SIGHUP", on_p); + catch_signal (SIGINT, "SIGINT", on_p); + catch_signal (SIGQUIT, "SIGQUIT", on_p); + catch_signal (SIGILL, "SIGILL", on_p); + catch_signal (SIGTRAP, "SIGTRAP", on_p); + catch_signal (SIGIOT, "SIGIOT", on_p); +#ifndef VMS + catch_signal (SIGABRT, "SIGABRT", on_p); +#endif +#ifdef SIGEMT + catch_signal (SIGEMT, "SIGEMT", on_p); +#endif + catch_signal (SIGFPE, "SIGFPE", on_p); + catch_signal (SIGBUS, "SIGBUS", on_p); + catch_signal (SIGSEGV, "SIGSEGV", on_p); +#ifdef SIGSYS + catch_signal (SIGSYS, "SIGSYS", on_p); +#endif + catch_signal (SIGTERM, "SIGTERM", on_p); +#ifdef SIGXCPU + catch_signal (SIGXCPU, "SIGXCPU", on_p); +#endif +#ifdef SIGXFSZ + catch_signal (SIGXFSZ, "SIGXFSZ", on_p); +#endif +#ifdef SIGDANGER + catch_signal (SIGDANGER, "SIGDANGER", on_p); +#endif +} + + +/* Managing the actual screensaver window */ + +Bool +window_exists_p (dpy, window) + Display *dpy; + Window window; +{ + int (*old_handler) (); + XWindowAttributes xgwa; + xgwa.screen = 0; + old_handler = XSetErrorHandler (BadWindow_ehandler); + XGetWindowAttributes (dpy, window, &xgwa); + XSync (dpy, False); + XSetErrorHandler (old_handler); + return (xgwa.screen != 0); +} + +void +initialize_screensaver_window P((void)) +{ + /* This resets the screensaver window as fully as possible, since there's + no way of knowing what some random client may have done to us in the + meantime. We could just destroy and recreate the window, but that has + its own set of problems... + */ + XColor black; + XClassHint class_hints; + XSetWindowAttributes attrs; + unsigned long attrmask; + int width = WidthOfScreen (screen); + int height = HeightOfScreen (screen); + char id [2048]; + + reset_stderr (); + + black.red = black.green = black.blue = 0; + + if (cmap == DefaultColormapOfScreen (screen)) + cmap = 0; + + if (install_cmap_p || visual != DefaultVisualOfScreen (screen)) + { + if (! cmap) + { + cmap = XCreateColormap (dpy, RootWindowOfScreen (screen), + visual, AllocNone); + if (! XAllocColor (dpy, cmap, &black)) abort (); + black_pixel = black.pixel; + } + } + else + { + if (cmap) + { + XFreeColors (dpy, cmap, &black_pixel, 1, 0); + XFreeColormap (dpy, cmap); + } + cmap = DefaultColormapOfScreen (screen); + black_pixel = BlackPixelOfScreen (screen); + } + + if (cmap2) + { + XFreeColormap (dpy, cmap2); + cmap2 = 0; + } + + if (fade_p) + { + cmap2 = copy_colormap (dpy, cmap, 0); + if (! cmap2) + fade_p = unfade_p = 0; + } + + attrmask = (CWOverrideRedirect | CWEventMask | CWBackingStore | CWColormap | + CWBackPixel | CWBackingPixel | CWBorderPixel); + attrs.override_redirect = True; + attrs.event_mask = (KeyPressMask | KeyReleaseMask | + ButtonPressMask | ButtonReleaseMask | + PointerMotionMask); + attrs.backing_store = NotUseful; + attrs.colormap = cmap; + attrs.background_pixel = black_pixel; + attrs.backing_pixel = black_pixel; + attrs.border_pixel = black_pixel; + +#if 0 + if (demo_mode_p || lock_p) width = width / 2; /* #### */ +#endif + + if (screensaver_window || !verbose_p) + ; + else if (visual == DefaultVisualOfScreen (screen)) + { + fprintf (stderr, "%s: using default visual ", progname); + describe_visual (stderr, dpy, visual); + } + else + { + fprintf (stderr, "%s: using visual: ", progname); + describe_visual (stderr, dpy, visual); + fprintf (stderr, "%s: default visual: ", progname); + describe_visual (stderr, dpy, DefaultVisualOfScreen (screen)); + } + +#ifdef HAVE_SAVER_EXTENSION + if (use_saver_extension) + { + XScreenSaverInfo *info; + Window root = RootWindowOfScreen (screen); + + /* This call sets the server screensaver timeouts to what we think + they should be (based on the resources and args xscreensaver was + started with.) It's important that we do this to sync back up + with the server - if we have turned on prematurely, as by an + ACTIVATE ClientMessage, then the server may decide to activate + the screensaver while it's already active. That's ok for us, + since we would know to ignore that ScreenSaverActivate event, + but a side effect of this would be that the server would map its + saver window (which we then hide again right away) meaning that + the bits currently on the screen get blown away. Ugly. */ +#if 0 + /* #### Ok, that doesn't work - when we tell the server that the + screensaver is "off" it sends us a Deactivate event, which is + sensible... but causes the saver to never come on. Hmm. */ + disable_builtin_screensaver (); +#endif /* 0 */ + +#if 0 + /* #### The MIT-SCREEN-SAVER extension gives us access to the + window that the server itself uses for saving the screen. + However, using this window in any way, in particular, calling + XScreenSaverSetAttributes() as below, tends to make the X server + crash. So fuck it, let's try and get along without using it... + + It's also inconvenient to use this window because it doesn't + always exist (though the ID is constant.) So to use this + window, we'd have to reimplement the ACTIVATE ClientMessage to + tell the *server* to tell *us* to turn on, to cause the window + to get created at the right time. Gag. */ + XScreenSaverSetAttributes (dpy, root, + 0, 0, width, height, 0, + visual_depth, InputOutput, visual, + attrmask, &attrs); + XSync (dpy, False); +#endif /* 0 */ + + info = XScreenSaverAllocInfo (); + XScreenSaverQueryInfo (dpy, root, info); + server_saver_window = info->window; + if (! server_saver_window) abort (); + XFree (info); + } +#endif /* HAVE_SAVER_EXTENSION */ + + if (screensaver_window) + { + XWindowChanges changes; + unsigned int changesmask = CWX|CWY|CWWidth|CWHeight|CWBorderWidth; + changes.x = 0; + changes.y = 0; + changes.width = width; + changes.height = height; + changes.border_width = 0; + + XConfigureWindow (dpy, screensaver_window, changesmask, &changes); + XChangeWindowAttributes (dpy, screensaver_window, attrmask, &attrs); + } + else + { + screensaver_window = + XCreateWindow (dpy, RootWindowOfScreen (screen), 0, 0, width, height, + 0, visual_depth, InputOutput, visual, attrmask, + &attrs); + } + +#ifdef HAVE_SAVER_EXTENSION + if (!use_saver_extension || + window_exists_p (dpy, screensaver_window)) + /* When using the MIT-SCREEN-SAVER extension, the window pointed to + by screensaver_window only exists while the saver is active. + So we must be careful to only try and manipulate it while it + exists... + */ +#endif /* HAVE_SAVER_EXTENSION */ + { + class_hints.res_name = progname; + class_hints.res_class = progclass; + XSetClassHint (dpy, screensaver_window, &class_hints); + XStoreName (dpy, screensaver_window, "screensaver"); + XChangeProperty (dpy, screensaver_window, XA_SCREENSAVER_VERSION, + XA_STRING, 8, PropModeReplace, + (unsigned char *) screensaver_version, + strlen (screensaver_version)); + + sprintf (id, "%d on host ", getpid ()); + if (! XmuGetHostname (id + strlen (id), sizeof (id) - strlen (id) - 1)) + strcat (id, "???"); + XChangeProperty (dpy, screensaver_window, XA_SCREENSAVER_ID, XA_STRING, + 8, PropModeReplace, (unsigned char *) id, strlen (id)); + + if (!cursor) + { + Pixmap bit; + bit = XCreatePixmapFromBitmapData (dpy, screensaver_window, "\000", + 1, 1, + BlackPixelOfScreen (screen), + BlackPixelOfScreen (screen), 1); + cursor = XCreatePixmapCursor (dpy, bit, bit, &black, &black, 0, 0); + XFreePixmap (dpy, bit); + } + + XSetWindowBackground (dpy, screensaver_window, black_pixel); + if (! demo_mode_p) + XDefineCursor (dpy, screensaver_window, cursor); + else + XUndefineCursor (dpy, screensaver_window); + } +} + + +void +raise_window (inhibit_fade, between_hacks_p) + Bool inhibit_fade, between_hacks_p; +{ + initialize_screensaver_window (); + + if (fade_p && !inhibit_fade && !demo_mode_p) + { + int grabbed; + Colormap current_map = (between_hacks_p + ? cmap + : DefaultColormapOfScreen (screen)); + copy_colormap (dpy, current_map, cmap2); + XGrabServer (dpy); + /* grab and blacken mouse on the root window (saver not mapped yet) */ + grabbed = grab_mouse (RootWindowOfScreen (screen)); + /* fade what's on the screen to black */ + XInstallColormap (dpy, cmap2); + fade_colormap (dpy, current_map, cmap2, fade_seconds, fade_ticks, True); + XClearWindow (dpy, screensaver_window); + XMapRaised (dpy, screensaver_window); + +#ifdef HAVE_SAVER_EXTENSION + if (server_saver_window && window_exists_p (dpy, server_saver_window)) + XUnmapWindow (dpy, server_saver_window); +#endif /* HAVE_SAVER_EXTENSION */ + + /* Once the saver window is up, restore the colormap. + (The "black" pixels of the two colormaps are compatible.) */ + XInstallColormap (dpy, cmap); + if (grabbed == GrabSuccess) + XUngrabPointer (dpy, CurrentTime); + XUngrabServer (dpy); + } + else + { + XClearWindow (dpy, screensaver_window); + XMapRaised (dpy, screensaver_window); +#ifdef HAVE_SAVER_EXTENSION + if (server_saver_window && window_exists_p (dpy, server_saver_window)) + XUnmapWindow (dpy, server_saver_window); +#endif /* HAVE_SAVER_EXTENSION */ + } + + if (install_cmap_p) + XInstallColormap (dpy, cmap); +} + +#ifdef __hpux + /* Calls to XHPDisableReset and XHPEnableReset must be balanced, + or BadAccess errors occur. */ +static Bool hp_locked_p = False; +#endif /* __hpux */ + +void +blank_screen () +{ + save_real_vroot (); + store_vroot_property (screensaver_window, screensaver_window); + raise_window (False, False); + grab_keyboard_and_mouse (); +#ifdef __hpux + if (lock_p && !hp_locked_p) + XHPDisableReset (dpy); /* turn off C-Sh-Reset */ + hp_locked_p = True; +#endif +} + +void +unblank_screen () +{ + if (unfade_p && !demo_mode_p) + { + int grabbed; + Colormap default_map = DefaultColormapOfScreen (screen); + blacken_colormap (dpy, cmap2); + XGrabServer (dpy); + /* grab and blacken mouse on the root window. */ + grabbed = grab_mouse (RootWindowOfScreen (screen)); + XInstallColormap (dpy, cmap2); + XUnmapWindow (dpy, screensaver_window); + fade_colormap (dpy, default_map, cmap2, fade_seconds, fade_ticks, False); + XInstallColormap (dpy, default_map); + if (grabbed == GrabSuccess) + XUngrabPointer (dpy, CurrentTime); + XUngrabServer (dpy); + } + else + { + if (install_cmap_p) + { + XClearWindow (dpy, screensaver_window); /* avoid technicolor */ + XInstallColormap (dpy, DefaultColormapOfScreen (screen)); + } + XUnmapWindow (dpy, screensaver_window); + } + kill_xsetroot_data (); + ungrab_keyboard_and_mouse (); + restore_real_vroot (); +#ifdef __hpux + if (lock_p && hp_locked_p) + XHPEnableReset (dpy); /* turn C-Sh-Reset back on */ + hp_locked_p = False; +#endif +} diff --git a/driver/windows.c_ori b/driver/windows.c_ori new file mode 100755 index 00000000..084bce73 --- /dev/null +++ b/driver/windows.c_ori @@ -0,0 +1,783 @@ +/* xscreensaver, Copyright (c) 1991-1995 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. + */ + +#include +#include +#include +#include +#include +#include + +#include /* for the signal names */ + +#include "xscreensaver.h" + +#ifdef HAVE_SAVER_EXTENSION +#include +extern Bool use_saver_extension; +#endif /* HAVE_SAVER_EXTENSION */ + +#if __STDC__ +extern int kill (pid_t, int); /* signal() is in sys/signal.h... */ +#endif /* __STDC__ */ + +extern Time timeout; + +extern Bool lock_p, demo_mode_p; + +Atom XA_VROOT, XA_XSETROOT_ID; +Atom XA_SCREENSAVER_VERSION, XA_SCREENSAVER_ID; + +#if __STDC__ +extern void describe_visual (FILE *, Display *, Visual *); +extern void reset_stderr (void); +#endif + +Window screensaver_window = 0; +Cursor cursor; +Colormap cmap, cmap2; +Bool install_cmap_p; +Bool fade_p, unfade_p; +int fade_seconds, fade_ticks; + +static unsigned long black_pixel; +static Window real_vroot, real_vroot_value; + +#ifdef HAVE_SAVER_EXTENSION +Window server_saver_window = 0; +#endif /* HAVE_SAVER_EXTENSION */ + +#define ALL_POINTER_EVENTS \ + (ButtonPressMask | ButtonReleaseMask | EnterWindowMask | \ + LeaveWindowMask | PointerMotionMask | PointerMotionHintMask | \ + Button1MotionMask | Button2MotionMask | Button3MotionMask | \ + Button4MotionMask | Button5MotionMask | ButtonMotionMask) + +/* I don't really understand Sync vs Async, but these seem to work... */ +#define grab_kbd(win) \ + XGrabKeyboard (dpy, (win), True, GrabModeSync, GrabModeAsync, CurrentTime) +#define grab_mouse(win) \ + XGrabPointer (dpy, (win), True, ALL_POINTER_EVENTS, \ + GrabModeAsync, GrabModeAsync, None, cursor, CurrentTime) + +void +grab_keyboard_and_mouse P((void)) +{ + Status status; + XSync (dpy, False); + + if (demo_mode_p) return; + + status = grab_kbd (screensaver_window); + if (status != GrabSuccess) + { /* try again in a second */ + sleep (1); + status = grab_kbd (screensaver_window); + if (status != GrabSuccess) + fprintf (stderr, "%s: %scouldn't grab keyboard! (%d)\n", + progname, (verbose_p ? "## " : ""), status); + } + status = grab_mouse (screensaver_window); + if (status != GrabSuccess) + { /* try again in a second */ + sleep (1); + status = grab_mouse (screensaver_window); + if (status != GrabSuccess) + fprintf (stderr, "%s: %scouldn't grab pointer! (%d)\n", + progname, (verbose_p ? "## " : ""), status); + } +} + +void +ungrab_keyboard_and_mouse P((void)) +{ + XUngrabPointer (dpy, CurrentTime); + XUngrabKeyboard (dpy, CurrentTime); +} + + +void +ensure_no_screensaver_running () +{ + int i; + Window root = RootWindowOfScreen (screen); + Window root2, parent, *kids; + unsigned int nkids; + int (*old_handler) (); + + old_handler = XSetErrorHandler (BadWindow_ehandler); + + if (! XQueryTree (dpy, root, &root2, &parent, &kids, &nkids)) + abort (); + if (root != root2) + abort (); + if (parent) + abort (); + for (i = 0; i < nkids; i++) + { + Atom type; + int format; + unsigned long nitems, bytesafter; + char *version; + + if (XGetWindowProperty (dpy, kids[i], XA_SCREENSAVER_VERSION, 0, 1, + False, XA_STRING, &type, &format, &nitems, + &bytesafter, (unsigned char **) &version) + == Success + && type != None) + { + char *id; + if (!XGetWindowProperty (dpy, kids[i], XA_SCREENSAVER_ID, 0, 512, + False, XA_STRING, &type, &format, &nitems, + &bytesafter, (unsigned char **) &id) + == Success + || type == None) + id = "???"; + + fprintf (stderr, + "%s: %salready running on display %s (window 0x%x)\n from process %s.\n", + progname, (verbose_p ? "## " : ""), DisplayString (dpy), + (int) kids [i], id); + exit (1); + } + } + + if (kids) XFree ((char *) kids); + XSync (dpy, False); + XSetErrorHandler (old_handler); +} + + +void +disable_builtin_screensaver () +{ + int server_timeout, server_interval, prefer_blank, allow_exp; + /* Turn off the server builtin saver if it is now running. */ + XForceScreenSaver (dpy, ScreenSaverReset); + XGetScreenSaver (dpy, &server_timeout, &server_interval, + &prefer_blank, &allow_exp); + +#ifdef HAVE_SAVER_EXTENSION + if (use_saver_extension) + { + /* Override the values specified with "xset" with our own parameters. */ + prefer_blank = False; + allow_exp = True; + server_interval = 0; + server_timeout = (timeout / 1000); + if (verbose_p) + fprintf (stderr, + "%s: configuring server for saver timeout of %d seconds.\n", + progname, server_timeout); + XSetScreenSaver (dpy, server_timeout, server_interval, + prefer_blank, allow_exp); + } + else +#endif /* HAVE_SAVER_EXTENSION */ + if (server_timeout != 0) + { + server_timeout = 0; + XSetScreenSaver (dpy, server_timeout, server_interval, + prefer_blank, allow_exp); + printf ("%s%sisabling server builtin screensaver.\n\ + You can re-enable it with \"xset s on\".\n", + (verbose_p ? "" : progname), (verbose_p ? "\n\tD" : ": d")); + } +} + + +/* Virtual-root hackery */ + +#ifdef _VROOT_H_ +ERROR! You must not include vroot.h in this file. +#endif + +static void +#if __STDC__ +store_vroot_property (Window win, Window value) +#else +store_vroot_property (win, value) + Window win, value; +#endif +{ +#if 0 + printf ("%s: storing XA_VROOT = 0x%x (%s) = 0x%x (%s)\n", progname, + win, + (win == screensaver_window ? "ScreenSaver" : + (win == real_vroot ? "VRoot" : + (win == real_vroot_value ? "Vroot_value" : "???"))), + value, + (value == screensaver_window ? "ScreenSaver" : + (value == real_vroot ? "VRoot" : + (value == real_vroot_value ? "Vroot_value" : "???")))); +#endif + XChangeProperty (dpy, win, XA_VROOT, XA_WINDOW, 32, PropModeReplace, + (unsigned char *) &value, 1); +} + +static void +#if __STDC__ +remove_vroot_property (Window win) +#else +remove_vroot_property (win) + Window win; +#endif +{ +#if 0 + printf ("%s: removing XA_VROOT from 0x%x (%s)\n", progname, win, + (win == screensaver_window ? "ScreenSaver" : + (win == real_vroot ? "VRoot" : + (win == real_vroot_value ? "Vroot_value" : "???")))); +#endif + XDeleteProperty (dpy, win, XA_VROOT); +} + + +static void +kill_xsetroot_data P((void)) +{ + Atom type; + int format; + unsigned long nitems, bytesafter; + Pixmap *dataP = 0; + + /* If the user has been using xv or xsetroot as a screensaver (to display + an image on the screensaver window, as a kind of slideshow) then the + pixmap and its associated color cells have been put in RetainPermanent + CloseDown mode. Since we're not destroying the xscreensaver window, + but merely unmapping it, we need to free these resources or those + colormap cells will stay allocated while the screensaver is off. (We + could just delete the screensaver window and recreate it later, but + that could cause other problems.) This code does an atomic read-and- + delete of the _XSETROOT_ID property, and if it held a pixmap, then we + cause the RetainPermanent resources of the client which created it + (and which no longer exists) to be freed. + */ + if (XGetWindowProperty (dpy, screensaver_window, XA_XSETROOT_ID, 0, 1, + True, AnyPropertyType, &type, &format, &nitems, + &bytesafter, (unsigned char **) &dataP) + == Success + && type != None) + { + if (dataP && *dataP && type == XA_PIXMAP && format == 32 && + nitems == 1 && bytesafter == 0) + { + if (verbose_p) + printf ("%s: destroying xsetroot data (0x%lX).\n", + progname, *dataP); + XKillClient (dpy, *dataP); + } + else + fprintf (stderr, "%s: %sdeleted unrecognised _XSETROOT_ID property: \n\ + %lu, %lu; type: %lu, format: %d, nitems: %lu, bytesafter %ld\n", + progname, (verbose_p ? "## " : ""), + (unsigned long) dataP, (dataP ? *dataP : 0), type, + format, nitems, bytesafter); + } +} + + +static void handle_signals P((Bool on_p)); + +static void +save_real_vroot P((void)) +{ + int i; + Window root = RootWindowOfScreen (screen); + Window root2, parent, *kids; + unsigned int nkids; + + real_vroot = 0; + real_vroot_value = 0; + if (! XQueryTree (dpy, root, &root2, &parent, &kids, &nkids)) + abort (); + if (root != root2) + abort (); + if (parent) + abort (); + for (i = 0; i < nkids; i++) + { + Atom type; + int format; + unsigned long nitems, bytesafter; + Window *vrootP = 0; + + if (XGetWindowProperty (dpy, kids[i], XA_VROOT, 0, 1, False, XA_WINDOW, + &type, &format, &nitems, &bytesafter, + (unsigned char **) &vrootP) + != Success) + continue; + if (! vrootP) + continue; + if (real_vroot) + { + if (*vrootP == screensaver_window) abort (); + fprintf (stderr, + "%s: %smore than one virtual root window found (0x%x and 0x%x).\n", + progname, (verbose_p ? "## " : ""), + (int) real_vroot, (int) kids [i]); + exit (1); + } + real_vroot = kids [i]; + real_vroot_value = *vrootP; + } + + if (real_vroot) + { + handle_signals (True); + remove_vroot_property (real_vroot); + XSync (dpy, False); + } + + XFree ((char *) kids); +} + +static Bool +restore_real_vroot_1 P((void)) +{ + if (verbose_p && real_vroot) + printf ("%s: restoring __SWM_VROOT property on the real vroot (0x%lx).\n", + progname, (unsigned long) real_vroot); + remove_vroot_property (screensaver_window); + if (real_vroot) + { + store_vroot_property (real_vroot, real_vroot_value); + real_vroot = 0; + real_vroot_value = 0; + /* make sure the property change gets there before this process + terminates! We might be doing this because we have intercepted + SIGTERM or something. */ + XSync (dpy, False); + return True; + } + return False; +} + +void +restore_real_vroot () +{ + if (restore_real_vroot_1 ()) + handle_signals (False); +} + + +/* Signal hackery to ensure that the vroot doesn't get left in an + inconsistent state + */ + +static const char *sig_names [255] = { 0 }; + +static void +restore_real_vroot_handler (sig) + int sig; +{ + signal (sig, SIG_DFL); + if (restore_real_vroot_1 ()) + fprintf (stderr, "\n%s: %s%s (%d) intercepted, vroot restored.\n", + progname, (verbose_p ? "## " : ""), + ((sig < sizeof(sig_names) && sig >= 0 && sig_names [sig]) + ? sig_names [sig] : "unknown signal"), + sig); + kill (getpid (), sig); +} + + +static void +#if __STDC__ +catch_signal (int sig, char *signame, Bool on_p) +#else +catch_signal (sig, signame, on_p) + int sig; + char *signame; + Bool on_p; +#endif +{ + if (! on_p) + signal (sig, SIG_DFL); + else + { + sig_names [sig] = signame; + if (((int) signal (sig, restore_real_vroot_handler)) == -1) + { + char buf [255]; + sprintf (buf, "%s: %scouldn't catch %s (%d)", progname, + (verbose_p ? "## " : ""), signame, sig); + perror (buf); + restore_real_vroot (); + exit (1); + } + } +} + +static void +handle_signals (on_p) + Bool on_p; +{ +#if 0 + if (on_p) printf ("handling signals\n"); + else printf ("unhandling signals\n"); +#endif + + catch_signal (SIGHUP, "SIGHUP", on_p); + catch_signal (SIGINT, "SIGINT", on_p); + catch_signal (SIGQUIT, "SIGQUIT", on_p); + catch_signal (SIGILL, "SIGILL", on_p); + catch_signal (SIGTRAP, "SIGTRAP", on_p); + catch_signal (SIGIOT, "SIGIOT", on_p); + catch_signal (SIGABRT, "SIGABRT", on_p); +#ifdef SIGEMT + catch_signal (SIGEMT, "SIGEMT", on_p); +#endif + catch_signal (SIGFPE, "SIGFPE", on_p); + catch_signal (SIGBUS, "SIGBUS", on_p); + catch_signal (SIGSEGV, "SIGSEGV", on_p); +#ifdef SIGSYS + catch_signal (SIGSYS, "SIGSYS", on_p); +#endif + catch_signal (SIGTERM, "SIGTERM", on_p); +#ifdef SIGXCPU + catch_signal (SIGXCPU, "SIGXCPU", on_p); +#endif +#ifdef SIGXFSZ + catch_signal (SIGXFSZ, "SIGXFSZ", on_p); +#endif +#ifdef SIGDANGER + catch_signal (SIGDANGER, "SIGDANGER", on_p); +#endif +} + + +/* Managing the actual screensaver window */ + +Bool +window_exists_p (dpy, window) + Display *dpy; + Window window; +{ + int (*old_handler) (); + XWindowAttributes xgwa; + xgwa.screen = 0; + old_handler = XSetErrorHandler (BadWindow_ehandler); + XGetWindowAttributes (dpy, window, &xgwa); + XSync (dpy, False); + XSetErrorHandler (old_handler); + return (xgwa.screen != 0); +} + +void +initialize_screensaver_window P((void)) +{ + /* This resets the screensaver window as fully as possible, since there's + no way of knowing what some random client may have done to us in the + meantime. We could just destroy and recreate the window, but that has + its own set of problems... + */ + XColor black; + XClassHint class_hints; + XSetWindowAttributes attrs; + unsigned long attrmask; + int width = WidthOfScreen (screen); + int height = HeightOfScreen (screen); + char id [2048]; + + reset_stderr (); + + black.red = black.green = black.blue = 0; + + if (cmap == DefaultColormapOfScreen (screen)) + cmap = 0; + + if (install_cmap_p || visual != DefaultVisualOfScreen (screen)) + { + if (! cmap) + { + cmap = XCreateColormap (dpy, RootWindowOfScreen (screen), + visual, AllocNone); + if (! XAllocColor (dpy, cmap, &black)) abort (); + black_pixel = black.pixel; + } + } + else + { + if (cmap) + { + XFreeColors (dpy, cmap, &black_pixel, 1, 0); + XFreeColormap (dpy, cmap); + } + cmap = DefaultColormapOfScreen (screen); + black_pixel = BlackPixelOfScreen (screen); + } + + if (cmap2) + { + XFreeColormap (dpy, cmap2); + cmap2 = 0; + } + + if (fade_p) + { + cmap2 = copy_colormap (dpy, cmap, 0); + if (! cmap2) + fade_p = unfade_p = 0; + } + + attrmask = (CWOverrideRedirect | CWEventMask | CWBackingStore | CWColormap | + CWBackPixel | CWBackingPixel | CWBorderPixel); + attrs.override_redirect = True; + attrs.event_mask = (KeyPressMask | KeyReleaseMask | + ButtonPressMask | ButtonReleaseMask | + PointerMotionMask); + attrs.backing_store = NotUseful; + attrs.colormap = cmap; + attrs.background_pixel = black_pixel; + attrs.backing_pixel = black_pixel; + attrs.border_pixel = black_pixel; + +#if 0 + if (demo_mode_p || lock_p) width = width / 2; /* #### */ +#endif + + if (screensaver_window || !verbose_p) + ; + else if (visual == DefaultVisualOfScreen (screen)) + { + fprintf (stderr, "%s: using default visual ", progname); + describe_visual (stderr, dpy, visual); + } + else + { + fprintf (stderr, "%s: using visual: ", progname); + describe_visual (stderr, dpy, visual); + fprintf (stderr, "%s: default visual: ", progname); + describe_visual (stderr, dpy, DefaultVisualOfScreen (screen)); + } + +#ifdef HAVE_SAVER_EXTENSION + if (use_saver_extension) + { + XScreenSaverInfo *info; + Window root = RootWindowOfScreen (screen); + + /* This call sets the server screensaver timeouts to what we think + they should be (based on the resources and args xscreensaver was + started with.) It's important that we do this to sync back up + with the server - if we have turned on prematurely, as by an + ACTIVATE ClientMessage, then the server may decide to activate + the screensaver while it's already active. That's ok for us, + since we would know to ignore that ScreenSaverActivate event, + but a side effect of this would be that the server would map its + saver window (which we then hide again right away) meaning that + the bits currently on the screen get blown away. Ugly. */ +#if 0 + /* #### Ok, that doesn't work - when we tell the server that the + screensaver is "off" it sends us a Deactivate event, which is + sensible... but causes the saver to never come on. Hmm. */ + disable_builtin_screensaver (); +#endif /* 0 */ + +#if 0 + /* #### The MIT-SCREEN-SAVER extension gives us access to the + window that the server itself uses for saving the screen. + However, using this window in any way, in particular, calling + XScreenSaverSetAttributes() as below, tends to make the X server + crash. So fuck it, let's try and get along without using it... + + It's also inconvenient to use this window because it doesn't + always exist (though the ID is constant.) So to use this + window, we'd have to reimplement the ACTIVATE ClientMessage to + tell the *server* to tell *us* to turn on, to cause the window + to get created at the right time. Gag. */ + XScreenSaverSetAttributes (dpy, root, + 0, 0, width, height, 0, + visual_depth, InputOutput, visual, + attrmask, &attrs); + XSync (dpy, False); +#endif /* 0 */ + + info = XScreenSaverAllocInfo (); + XScreenSaverQueryInfo (dpy, root, info); + server_saver_window = info->window; + if (! server_saver_window) abort (); + XFree (info); + } +#endif /* HAVE_SAVER_EXTENSION */ + + if (screensaver_window) + { + XWindowChanges changes; + unsigned int changesmask = CWX|CWY|CWWidth|CWHeight|CWBorderWidth; + changes.x = 0; + changes.y = 0; + changes.width = width; + changes.height = height; + changes.border_width = 0; + + XConfigureWindow (dpy, screensaver_window, changesmask, &changes); + XChangeWindowAttributes (dpy, screensaver_window, attrmask, &attrs); + } + else + { + screensaver_window = + XCreateWindow (dpy, RootWindowOfScreen (screen), 0, 0, width, height, + 0, visual_depth, InputOutput, visual, attrmask, + &attrs); + } + +#ifdef HAVE_SAVER_EXTENSION + if (!use_saver_extension || + window_exists_p (dpy, screensaver_window)) + /* When using the MIT-SCREEN-SAVER extension, the window pointed to + by screensaver_window only exists while the saver is active. + So we must be careful to only try and manipulate it while it + exists... + */ +#endif /* HAVE_SAVER_EXTENSION */ + { + class_hints.res_name = progname; + class_hints.res_class = progclass; + XSetClassHint (dpy, screensaver_window, &class_hints); + XStoreName (dpy, screensaver_window, "screensaver"); + XChangeProperty (dpy, screensaver_window, XA_SCREENSAVER_VERSION, + XA_STRING, 8, PropModeReplace, + (unsigned char *) screensaver_version, + strlen (screensaver_version)); + + sprintf (id, "%d on host ", getpid ()); + if (! XmuGetHostname (id + strlen (id), sizeof (id) - strlen (id) - 1)) + strcat (id, "???"); + XChangeProperty (dpy, screensaver_window, XA_SCREENSAVER_ID, XA_STRING, + 8, PropModeReplace, (unsigned char *) id, strlen (id)); + + if (!cursor) + { + Pixmap bit; + bit = XCreatePixmapFromBitmapData (dpy, screensaver_window, "\000", + 1, 1, + BlackPixelOfScreen (screen), + BlackPixelOfScreen (screen), 1); + cursor = XCreatePixmapCursor (dpy, bit, bit, &black, &black, 0, 0); + XFreePixmap (dpy, bit); + } + + XSetWindowBackground (dpy, screensaver_window, black_pixel); + if (! demo_mode_p) + XDefineCursor (dpy, screensaver_window, cursor); + else + XUndefineCursor (dpy, screensaver_window); + } +} + + +void +raise_window (inhibit_fade, between_hacks_p) + Bool inhibit_fade, between_hacks_p; +{ + initialize_screensaver_window (); + + if (fade_p && !inhibit_fade && !demo_mode_p) + { + int grabbed; + Colormap current_map = (between_hacks_p + ? cmap + : DefaultColormapOfScreen (screen)); + copy_colormap (dpy, current_map, cmap2); + XGrabServer (dpy); + /* grab and blacken mouse on the root window (saver not mapped yet) */ + grabbed = grab_mouse (RootWindowOfScreen (screen)); + /* fade what's on the screen to black */ + XInstallColormap (dpy, cmap2); + fade_colormap (dpy, current_map, cmap2, fade_seconds, fade_ticks, True); + XClearWindow (dpy, screensaver_window); + XMapRaised (dpy, screensaver_window); + +#ifdef HAVE_SAVER_EXTENSION + if (server_saver_window && window_exists_p (dpy, server_saver_window)) + XUnmapWindow (dpy, server_saver_window); +#endif /* HAVE_SAVER_EXTENSION */ + + /* Once the saver window is up, restore the colormap. + (The "black" pixels of the two colormaps are compatible.) */ + XInstallColormap (dpy, cmap); + if (grabbed == GrabSuccess) + XUngrabPointer (dpy, CurrentTime); + XUngrabServer (dpy); + } + else + { + XClearWindow (dpy, screensaver_window); + XMapRaised (dpy, screensaver_window); +#ifdef HAVE_SAVER_EXTENSION + if (server_saver_window && window_exists_p (dpy, server_saver_window)) + XUnmapWindow (dpy, server_saver_window); +#endif /* HAVE_SAVER_EXTENSION */ + } + + if (install_cmap_p) + XInstallColormap (dpy, cmap); +} + +#ifdef __hpux + /* Calls to XHPDisableReset and XHPEnableReset must be balanced, + or BadAccess errors occur. */ +static Bool hp_locked_p = False; +#endif /* __hpux */ + +void +blank_screen () +{ + save_real_vroot (); + store_vroot_property (screensaver_window, screensaver_window); + raise_window (False, False); + grab_keyboard_and_mouse (); +#ifdef __hpux + if (lock_p && !hp_locked_p) + XHPDisableReset (dpy); /* turn off C-Sh-Reset */ + hp_locked_p = True; +#endif +} + +void +unblank_screen () +{ + if (unfade_p && !demo_mode_p) + { + int grabbed; + Colormap default_map = DefaultColormapOfScreen (screen); + blacken_colormap (dpy, cmap2); + XGrabServer (dpy); + /* grab and blacken mouse on the root window. */ + grabbed = grab_mouse (RootWindowOfScreen (screen)); + XInstallColormap (dpy, cmap2); + XUnmapWindow (dpy, screensaver_window); + fade_colormap (dpy, default_map, cmap2, fade_seconds, fade_ticks, False); + XInstallColormap (dpy, default_map); + if (grabbed == GrabSuccess) + XUngrabPointer (dpy, CurrentTime); + XUngrabServer (dpy); + } + else + { + if (install_cmap_p) + { + XClearWindow (dpy, screensaver_window); /* avoid technicolor */ + XInstallColormap (dpy, DefaultColormapOfScreen (screen)); + } + XUnmapWindow (dpy, screensaver_window); + } + kill_xsetroot_data (); + ungrab_keyboard_and_mouse (); + restore_real_vroot (); +#ifdef __hpux + if (lock_p && hp_locked_p) + XHPEnableReset (dpy); /* turn C-Sh-Reset back on */ + hp_locked_p = False; +#endif +} diff --git a/driver/xscreensaver-command.c b/driver/xscreensaver-command.c new file mode 100755 index 00000000..1141fcba --- /dev/null +++ b/driver/xscreensaver-command.c @@ -0,0 +1,155 @@ +/* xscreensaver-command, Copyright (c) 1991-1995 + * 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. + */ + +#include "version.h" +#include +#include +#include +#include +#if __STDC__ +# include +#endif + +#ifdef _VROOT_H_ +ERROR! you must not include vroot.h in this file +#endif + +static char *screensaver_version; +static char *usage = "usage: %s -\n\ +\n\ + This program provides external control of a running xscreensaver process.\n\ + Version %s, copyright (c) 1991-1994 Jamie Zawinski .\n\ +\n\ + -demo Enter interactive demo mode.\n\ + -deactivate Turns off the screensaver if it is on, as user input would.\n\ + -activate Turns it on as if the user had been idle for long enough.\n\ + -cycle Stops the current hack and runs a new one.\n\ + -next Like either -activate or -cycle, depending on which is more\n\ + appropriate, except that the screenhack that will be run is\n\ + the next one in the list of hacks, instead of a randomly-\n\ + chosen one. This option is good for looking at a demo of\n\ + each of the hacks in place.\n\ + -prev Like -next, but goes in the other direction.\n\ + -exit Causes the screensaver process to exit. It should be ok to\n\ + just kill the process (NOT with -9!) but this is a slightly\n\ + easier way.\n\ + -restart Causes the screensaver process to exit and then restart with\n\ + the same command line arguments. This is a good way of \n\ + causing the screensaver to re-read the resource database.\n\ + -lock Same as -activate, but with immediate locking.\n\ +\n\ + See the man page for more details.\n\n"; + +static Window +find_screensaver_window (dpy, progname) + Display *dpy; + char *progname; +{ + int i; + Window root = RootWindowOfScreen (DefaultScreenOfDisplay (dpy)); + Window root2, parent, *kids; + unsigned int nkids; + + if (! XQueryTree (dpy, root, &root2, &parent, &kids, &nkids)) + abort (); + if (root != root2) + abort (); + if (parent) + abort (); + if (! (kids && nkids)) + abort (); + for (i = 0; i < nkids; i++) + { + Atom type; + int format; + unsigned long nitems, bytesafter; + char *version; + + if (XGetWindowProperty (dpy, kids[i], + XInternAtom (dpy, "_SCREENSAVER_VERSION", False), + 0, 1, False, XA_STRING, + &type, &format, &nitems, &bytesafter, + (unsigned char **) &version) + == Success + && type != None) + return kids[i]; + } + fprintf (stderr, "%s: no screensaver is running on display %s\n", progname, + DisplayString (dpy)); + exit (1); +} + + +#define USAGE() \ + { fprintf (stderr, usage, argv[0], screensaver_version); exit (1); } + +#ifndef VMS +void +#else +int +#endif +main (argc, argv) + int argc; + char **argv; +{ + Display *dpy; + Window window; + XEvent event; + int i; + char *message = 0, *dpyname = 0; + screensaver_version = (char *) malloc (5); + memcpy (screensaver_version, screensaver_id + 17, 4); + screensaver_version [4] = 0; + for (i = 1; i < argc; i++) + { + char *s = argv [i]; + int L = strlen (s); + if (L < 2) USAGE (); + if (!strncmp (s, "-display", L)) dpyname = argv [++i]; + else if (message) USAGE () + else if (!strncmp (s, "-activate", L)) message = "ACTIVATE"; + else if (!strncmp (s, "-deactivate", L)) message = "DEACTIVATE"; + else if (!strncmp (s, "-cycle", L)) message = "CYCLE"; + else if (!strncmp (s, "-next", L)) message = "NEXT"; + else if (!strncmp (s, "-prev", L)) message = "PREV"; + else if (!strncmp (s, "-exit", L)) message = "EXIT"; + else if (!strncmp (s, "-restart", L)) message = "RESTART"; + else if (!strncmp (s, "-demo", L)) message = "DEMO"; + else if (!strncmp (s, "-lock", L)) message = "LOCK"; + else USAGE (); + } + if (! message) USAGE (); + if (!dpyname) dpyname = (char *) getenv ("DISPLAY"); + dpy = XOpenDisplay (dpyname); + if (!dpy) + { + fprintf (stderr, "%s: can't open display %s\n", argv[0], + (dpyname ? dpyname : "(null)")); + exit (1); + } + window = find_screensaver_window (dpy, argv[0]); + + event.xany.type = ClientMessage; + event.xclient.display = dpy; + event.xclient.window = window; + event.xclient.message_type = XInternAtom (dpy, "SCREENSAVER", False); + event.xclient.format = 32; + event.xclient.data.l[0] = (long) XInternAtom (dpy, message, False); + if (! XSendEvent (dpy, window, False, 0L, &event)) + { + fprintf (stderr, "%s: XSendEvent(dpy, 0x%x ...) failed.\n", argv [0], + (unsigned int) window); + exit (1); + } + XSync (dpy, 0); + exit (0); +} diff --git a/driver/xscreensaver-command.c_ori b/driver/xscreensaver-command.c_ori new file mode 100755 index 00000000..d0aced94 --- /dev/null +++ b/driver/xscreensaver-command.c_ori @@ -0,0 +1,151 @@ +/* xscreensaver-command, Copyright (c) 1991-1995 + * 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. + */ + +#include "version.h" +#include +#include +#include +#include +#if __STDC__ +# include +#endif + +#ifdef _VROOT_H_ +ERROR! you must not include vroot.h in this file +#endif + +static char *screensaver_version; +static char *usage = "usage: %s -\n\ +\n\ + This program provides external control of a running xscreensaver process.\n\ + Version %s, copyright (c) 1991-1994 Jamie Zawinski .\n\ +\n\ + -demo Enter interactive demo mode.\n\ + -deactivate Turns off the screensaver if it is on, as user input would.\n\ + -activate Turns it on as if the user had been idle for long enough.\n\ + -cycle Stops the current hack and runs a new one.\n\ + -next Like either -activate or -cycle, depending on which is more\n\ + appropriate, except that the screenhack that will be run is\n\ + the next one in the list of hacks, instead of a randomly-\n\ + chosen one. This option is good for looking at a demo of\n\ + each of the hacks in place.\n\ + -prev Like -next, but goes in the other direction.\n\ + -exit Causes the screensaver process to exit. It should be ok to\n\ + just kill the process (NOT with -9!) but this is a slightly\n\ + easier way.\n\ + -restart Causes the screensaver process to exit and then restart with\n\ + the same command line arguments. This is a good way of \n\ + causing the screensaver to re-read the resource database.\n\ + -lock Same as -activate, but with immediate locking.\n\ +\n\ + See the man page for more details.\n\n"; + +static Window +find_screensaver_window (dpy, progname) + Display *dpy; + char *progname; +{ + int i; + Window root = RootWindowOfScreen (DefaultScreenOfDisplay (dpy)); + Window root2, parent, *kids; + unsigned int nkids; + + if (! XQueryTree (dpy, root, &root2, &parent, &kids, &nkids)) + abort (); + if (root != root2) + abort (); + if (parent) + abort (); + if (! (kids && nkids)) + abort (); + for (i = 0; i < nkids; i++) + { + Atom type; + int format; + unsigned long nitems, bytesafter; + char *version; + + if (XGetWindowProperty (dpy, kids[i], + XInternAtom (dpy, "_SCREENSAVER_VERSION", False), + 0, 1, False, XA_STRING, + &type, &format, &nitems, &bytesafter, + (unsigned char **) &version) + == Success + && type != None) + return kids[i]; + } + fprintf (stderr, "%s: no screensaver is running on display %s\n", progname, + DisplayString (dpy)); + exit (1); +} + + +#define USAGE() \ + { fprintf (stderr, usage, argv[0], screensaver_version); exit (1); } + +void +main (argc, argv) + int argc; + char **argv; +{ + Display *dpy; + Window window; + XEvent event; + int i; + char *message = 0, *dpyname = 0; + screensaver_version = (char *) malloc (5); + memcpy (screensaver_version, screensaver_id + 17, 4); + screensaver_version [4] = 0; + for (i = 1; i < argc; i++) + { + char *s = argv [i]; + int L = strlen (s); + if (L < 2) USAGE (); + if (!strncmp (s, "-display", L)) dpyname = argv [++i]; + else if (message) USAGE () + else if (!strncmp (s, "-activate", L)) message = "ACTIVATE"; + else if (!strncmp (s, "-deactivate", L)) message = "DEACTIVATE"; + else if (!strncmp (s, "-cycle", L)) message = "CYCLE"; + else if (!strncmp (s, "-next", L)) message = "NEXT"; + else if (!strncmp (s, "-prev", L)) message = "PREV"; + else if (!strncmp (s, "-exit", L)) message = "EXIT"; + else if (!strncmp (s, "-restart", L)) message = "RESTART"; + else if (!strncmp (s, "-demo", L)) message = "DEMO"; + else if (!strncmp (s, "-lock", L)) message = "LOCK"; + else USAGE (); + } + if (! message) USAGE (); + if (!dpyname) dpyname = (char *) getenv ("DISPLAY"); + dpy = XOpenDisplay (dpyname); + if (!dpy) + { + fprintf (stderr, "%s: can't open display %s\n", argv[0], + (dpyname ? dpyname : "(null)")); + exit (1); + } + window = find_screensaver_window (dpy, argv[0]); + + event.xany.type = ClientMessage; + event.xclient.display = dpy; + event.xclient.window = window; + event.xclient.message_type = XInternAtom (dpy, "SCREENSAVER", False); + event.xclient.format = 32; + event.xclient.data.l[0] = (long) XInternAtom (dpy, message, False); + if (! XSendEvent (dpy, window, False, 0L, &event)) + { + fprintf (stderr, "%s: XSendEvent(dpy, 0x%x ...) failed.\n", argv [0], + (unsigned int) window); + exit (1); + } + XSync (dpy, 0); + exit (0); +} diff --git a/driver/xscreensaver-command.exe_axp b/driver/xscreensaver-command.exe_axp new file mode 100755 index 0000000000000000000000000000000000000000..547e87a30e3e5bbb944a8a83a9ef4c1af31e6fb2 GIT binary patch literal 8192 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 Fe*hBHk<9gISUz0a$=o3=y|HiN+t~M- zd#{@WRij8qplKDF=#L^qQdJ-(5l58)v_c4k$SpJlLESK^8x;gKZ2ijO_VS!_ zuN@}>DIoO^>uryH&U@a^=Y7w~^?R1Ik^ST_VNctxwmnV+FOJ;?mDWz$mXP$ zki^`>ujMQGs`ycD&mdZS3iFN8us;+C^n^S510k=!x4XNeXMd4vdE)B#wYDuUNqZHn z{_?w|yls!y_ssG}Epgx7oH3>RNJi5uUQSTHxM$wo47eu2C}$b%-b z2^2!=EKw%!YS;-5 z_WlkY9U-5y!eg;JYW&?DJ0hLo0eH+zG+UyKhwA_yj*WI)eO6$hJ&duC*plxiBCYVA z>9;WnL?f0k6K&$CE@KB9PMgo>vP|qGf8#zB;#o&Xyw>t%Sy>~iBs>KsOr6zW^6#)C zTCTwoS07Iw0RndUk$vp&JbpfL2(&jn-8`nnR8f>Q;i#xmU+b>Vx6r|H`XwPHiS!j= zRFbt3i8dV>{c5``>RL=li>)yw)l4#)Ff2YtcWTtTPaBo=SmOE0N=hRMNuz018CHc9 z`#vhgMU9GMx~R%RlExHSSCu4HhNwW*j4Vs?FkRsSWMZPGwL(|FsA`fT!$u1P)8nc% zoX}}gteN`u?)7=`v3s?n`&K*pd@J+H8y8cG#}km@29?;S5YwfjB4u=%QsN@B2QE$) zbkP&ZsImq(hp3(qX(>k15S4U_C>6Pd3L4F5TxU9?(@`apjB`z^^gsY{fEmI}AD2l8 zaXJX-sT5C&bVyNYQUMyGtYn50TuW>`mJ~fcJ|jxz)`04a;3 z&~L>c18a|`OBxZWD8ZIWy#;3|OnAA@76hIaM)j9>?j9myd05e5@;tsvCY(;J~UI0@?A+t|#V(b?g_e}QUAR_n=e9+oB{ zi=)CgcSsdAT~PHky2PslR%L3-af{H(Jkf-dh=Y|%u~JG($d;fEXHuvzt$;pvh64}# z3|xrD00x7ft0=iVfPyM|RhCz_1%paPjp2+5x-ckcRu+;9O1JQYnFBZ##R|1@!a(#;QYSQNQ(xJ=WyfOtKyszn{>f|SI)QAq|$-Z}^H<{9qn?IAn0=cuf# zJjq(|3POd&B@M+gj@zb^c3!jX;;2<$q7#_nG5v9L*3um2@N_IHMZT^)yb z3^76e42}{`?+TBbNt?CrVi{ahp$UaBxRRS+^8 ztY5c8%c`w3%c?(6Vu;%^$AnQ zdg9iHcTF>7IHp~74bW%pP29T1s8^<4SL7?vE7R4va>zf+IQp+oxxRe4e`HIU?{&xZDRaNb?Ca8$JZ;@O%Fs~HeS5o z?#uN->s?TdVB~Vdxp^ye=H4c`Gj7BDE6Bmz;U$;Ed_R(lOwPm}K%i_GD6GHQZ@l<6 znXdM2cFYE6qYbn~GP_dJcL%sRn0!l7-ZL@N{2=Q4GvV~luBKnI=*^|{r@{YYi~dw8 z{YlWjW6|qN=~WM+b;o9d%x*;~-ONYp;ud`|Ux)|(+yTAIqJLOQ|2ycrE&2zg^f}N! z4f---KP_8<*wubyVsn}A@N}7#m~o}+nb?#&l8Ylu z=gi5x5eyrR*;7Ve_6J5d`xZL_FY%DfpW$bf5zI~*GKORJMXg`u19YOjgV%*1|lrf?K!9LJNak9?Ks;7O``hQ*4*!>Z!DdF4o-|E@K*in{jYI=jcTc8QgoRV6*Bl{;%&**&4|Vt;CFVnr@Hf5jeE zabt}WTfW%4TBBHzjkT-LH?+#9NL~BHU1)c$UF4B)e(D@Si;n!;Htkavh#RklPYy|P ze4yk<&j4Biab>jPU2+?uRTl_r2)j~(B!k5M?0MetoY-2+WVgRVoMlVS^7r3g{CII` z@$TYnXE||JT)ex%>6zSG`)jbYfu-hSr{leQPIunv`kk|U>7#|k-#eYR-n((_X5sk& z0>9c?djogUP6*W9|I_?O4~f(92dCqn)3K1x=l_wvH4nl~5boUDQ13YZNbvf9Q~EFX C)ivh; literal 0 HcmV?d00001 diff --git a/driver/xscreensaver-command.exe_vaxc b/driver/xscreensaver-command.exe_vaxc new file mode 100755 index 0000000000000000000000000000000000000000..7333ba3a154f0316789e0b02b32c3926ccfb9172 GIT binary patch literal 5632 zcmeHLe{2)i9e;K%Ax^Rq2vE?f^0I-JsBsjtF^LLwgkZJV^269pNII$EurKiu`_8&M zlcYn8{rGERTBlXjHld7;f0z_U{ew=cTG$#fO;an?NQ8FU4zCj3=$egGg#k^*?el$i zPE6EI(EY=-KKcCK``q{YeV^}-clNy(SR32J_A_d2+uFAKeT+F?BkUAozBB6skJFev zz*wqy`|EQxVz%^E>y4ng)Jo%Z1F?>1INTF!?+-_V9lhP%?LB*zq?QL#f2g%>dCGVe ztN!-Ktg>x;F!cH58}&?LWcxd~Dsa^^KdVH46xS+mPJNBUSO9$;TgT>{FR^2c{j-U! z2g2AISC#aohCShqeOm^)yE=Ero`{CF4Yjp}T3MrzYh)5F!9E2un}l3E+TIh3^hV=D z75Q4;Qbw_vmmUw4u2w^2&%Vkw6uTT2>AOgFZKHEHQCJaT< zO!<&v@KEcvFShUl6a33^MpgKe@|dcbqbhGYIQH}|O|i^`oK;#AdZwA>OnF3kly5b8 zaHlz@T8Y$SH8q^aQ>w|chCX7*8R`$INyX&KxTP4HoaPB#vkX1W^2!`w_7p2Kp4toPw1rNBtL-Ab2XV(_^@v9w2o*fnw}d;2`h<-L|O^NEIn%q zwM5P^6wTr(IWfv*ElCkH5lBrLgMHTr4Y3Xcy3|pHD=OA9c(6oux`~u-A|m9BS4(=USNVm4|R@|jp!&(kEAZbl~fG{#i45=1=HUD&g^8$@l$v^a;~X0&#e+K< zn*|w*HV-~BH`7$>=?USMsUnMG@`NB{D5fPF)?HE(Rf1JD?&*mYVU?Jeaz??%%4DdN z(kikg8zZ?4D$FcJUyu=j$NCgps3s5$3coN>_V7Ry3?*n#Ug;JV)N@7xdrY?E1G4F6 zA+4iyOD#qOuq&1-)Xj+qikitNNvc5XiUg%wY~+}t2;-p4vv>fBdZ4OB9ayrO#&e^F z4VC@t7{Wh~SZ8k!+iE__HT}+=Y%V>5P+>{cM6pcZX;Z_3-h?eNW9=RB&i?jz826T* z5^PU+85SFhbqscNL52#9_29Re1*z^>BpU8#K`Ig!9_R$>rGrJov3PqF06mFdue+B8 z$zj&j+wm2)r!yAmY9AEj6SDR>>>+I1JE%5kxpcajmANdW2V&UX;X}w}Q!+cz!rR8T zj`P;m)@DA8Fe!LS(Qmf<%guIrJwcze|DOmv#AceFn!I}bhU3HwQ_|kwd_Mx`U;Q?V zPVPQ`j7173s$<3cTrodi%wH?!Z`v_???RQc3IFqEBWqVJFsBv6^RfKR2AVVyp1&r> z>&1A!p>j4qCnO~R7owOo^cG&180@}P%>S{N|5Gu4xtPCVZ?>83JA9;g?oG*#EmSyD z6^z*td-s`nOzWKIF~yp-v-v9xRRy3C>0XO1#^s=9b?PO_aBA-fuwe8dbUXVtK^!0Z6^gG6jL`kVR9EKA@6n)sq(+^ z@?s&P6&mx$3;p?11uZ{iv*OHa!WZXV)I}kZf1$whr%~O5lw0S53;yz_`QwL=*wb|Y zE1lN>BIys?nw>1pyoqJ$wGzu-L?@R09Ss;Q>HJI#!T&`J3cd(7)_>V{L7y(F^=Hwa zz*Ty$$MD~_D%_#s-@g`T19<10uZNum#(uPpvGEP=J2<_E({IfpY+pv~(zss7br{$b z3i&v$3uFkb1%kLmFYfqh!khPswrj=w<4#wvc<;YgJL^C4JmBuFRJkVvcdxKQvdTR| zSb^UC)O*M8UOHpAdsQLn#c%28;U3kQr@wS0aj*Jydy-w z%-?#0EnK_&?%RL4;#!=+&Z!o`aesOW}Z;Myo!~DG)?D~xdB;T3)F_iz4 Goc;xXeI*V6 literal 0 HcmV?d00001 diff --git a/driver/xscreensaver-command.hlp b/driver/xscreensaver-command.hlp new file mode 100755 index 00000000..0fc5968f --- /dev/null +++ b/driver/xscreensaver-command.hlp @@ -0,0 +1,96 @@ +1 XSCREENCOMMAND +Control a running xscreensaver process + +SYNOPSIS + + $ xscreencommand [-activate] [-deactivate] [-cycle] [-next] [-prev] + [-exit] [-restart] [-demo] [-lock] +2 DESCRIPTION +The xscreensaver-command program controls a running xscreensaver +process by sending it client-messages. + +2 OPTIONS +xscreencommand accepts the following options: + + -activate +Tell the screensaver to turn on immediately (that is, pretend that the +user been idle for long enough.) It will turn off as soon as there is +any user activity, as usual. + + -deactivate +Tell the screensaver to turn off, as if there had been user activity. +If locking is enabled, then the screensaver will prompt for a password +as usual. + + -cycle +Tell the screensaver to change which graphics hack it is running, just +as if the ``cycle'' timer had expired. + + -next +This is like either -activate or -cycle, depending on which is more +appropriate, except that the screenhack that will be run is the next one +in the list of programs, instead of a randomly-chosen one. This option +is good for looking at a demo of each of the screensavers currently +available. You might want to put this on a menu. + + -prev +This is like -next, but cycles in the other direction. + + -demo +Cause the screensaver to enter its interactive demo mode, if it has been +compiled with support for it. + + -lock +Like -activate, but a password will be required before the screensaver +turns off, even if the screensaver's lock resource is false. The +display will be locked immediately even if the screensaver's lockTimeout +resource is non-zero. + + -exit +Causes the screensaver process to exit gracefully. This is a slightly +safer way to kill the screensaver than by using kill. + +Never use kill -9 with xscreensaver while the screensaver is +active. If you are using a virtual root window manager, that can leave +things in an inconsistent state, and you may need to restart your window +manager to repair the damage. + + -restart +Causes the screensaver process to exit and then restart with the same +command line arguments. This is a good way of causing the screensaver +to re-read the resource database. + +If the screensaver is run from xdm(1) (that is, it is already running +before you log in) then you may want to issue the ``restart'' command +from one of your startup scripts, so that the screensaver gets your +resource settings instead of the default ones. + +2 ENVIRONMENT + + DISPLAY +to get the default host and display number. + + PATH +to find the executable to restart. + +2 BUGS +Diagnostics are reported on the stderr of the xscreensaver +process, not this process, so the caller of xscreensaver-command +may not see the error messages. + +2 COPYRIGHT +Copyright (c) 1992, 1993 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. + +2 AUTHOR +Jamie Zawinski , 13-aug-92. +2 OpenVMS_PORT +Patrick MOREAU - CENA/Athis-Mons - FRANCE + +pmoreau@cena.dgac.fr +moreau_p@decus.decus.fr diff --git a/driver/xscreensaver-command.man b/driver/xscreensaver-command.man new file mode 100755 index 00000000..06e88cbf --- /dev/null +++ b/driver/xscreensaver-command.man @@ -0,0 +1,110 @@ +.de EX \"Begin example +.ne 5 +.if n .sp 1 +.if t .sp .5 +.nf +.in +.5i +.. +.de EE +.fi +.in -.5i +.if n .sp 1 +.if t .sp .5 +.. +.TH XScreenSaver 1 "22-mar-93" "X Version 11" +.SH NAME +xscreensaver-command - control a running xscreensaver process +.SH SYNOPSIS +.B xscreensaver-command +[\-activate] [\-deactivate] [\-cycle] [\-next] [\-prev] [\-exit] [\-restart] [\-demo] [\-lock] +.SH DESCRIPTION +The \fIxscreensaver\-command\fP program controls a running \fIxscreensaver\fP +process by sending it client-messages. +.SH OPTIONS +.I xscreensaver-command +accepts the following options: +.TP 8 +.B \-activate +Tell the screensaver to turn on immediately (that is, pretend that the +user been idle for long enough.) It will turn off as soon as there is +any user activity, as usual. + +It is useful to run this from a menu; you may wish to run it as +.EX +sleep 5 ; xscreensaver-command -activate +.EE +to be sure that you have time to remove your hand from the mouse before +the screensaver comes on. +.TP 8 +.B \-deactivate +Tell the screensaver to turn off, as if there had been user activity. +If locking is enabled, then the screensaver will prompt for a password +as usual. +.TP 8 +.B \-cycle +Tell the screensaver to change which graphics hack it is running, just +as if the ``cycle'' timer had expired. +.TP 8 +.B \-next +This is like either \fI\-activate\fP or \fI\-cycle\fP, depending on which is +more appropriate, except that the screenhack that will be run is the next +one in the list of programs, instead of a randomly-chosen one. This option +is good for looking at a demo of each of the screensavers currently available. +You might want to put this on a menu. +.TP 8 +.B \-prev +This is like \fI\-next\fP, but cycles in the other direction. +.TP 8 +.B \-demo +Cause the screensaver to enter its interactive demo mode, if it has been +compiled with support for it. +.TP 8 +.B \-lock +Like \fI\-activate\fP, but a password will be required before the screensaver +turns off, even if the screensaver's \fIlock\fP resource is false. The +display will be locked immediately even if the screensaver's \fIlockTimeout\fP +resource is non-zero. +.TP 8 +.B \-exit +Causes the screensaver process to exit gracefully. This is a slightly +safer way to kill the screensaver than by using \fIkill\fP. + +Never use \fIkill -9\fP with \fIxscreensaver\fP while the screensaver is +active. If you are using a virtual root window manager, that can leave +things in an inconsistent state, and you may need to restart your window +manager to repair the damage. +.TP 8 +.B \-restart +Causes the screensaver process to exit and then restart with the same command +line arguments. This is a good way of causing the screensaver to re-read the +resource database. + +If the screensaver is run from \fIxdm(1)\fP (that is, it is already running +before you log in) then you may want to issue the ``restart'' command from +one of your startup scripts, so that the screensaver gets your resource +settings instead of the default ones. +.SH ENVIRONMENT +.PP +.TP 8 +.B DISPLAY +to get the default host and display number. +.TP 8 +.B PATH +to find the executable to restart. +.SH "SEE ALSO" +.BR X (1), +.BR xscreensaver (1) +.SH BUGS +Diagnostics are reported on the \fBstderr\fP of the \fIxscreensaver\fP +process, not this process, so the caller of \fIxscreensaver-command\fP +may not see the error messages. +.SH COPYRIGHT +Copyright \(co 1992, 1993 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 , 13-aug-92. diff --git a/driver/xscreensaver.ad b/driver/xscreensaver.ad new file mode 100755 index 00000000..da72eff8 --- /dev/null +++ b/driver/xscreensaver.ad @@ -0,0 +1,160 @@ +! app-defaults file for XScreenSaver by Jamie Zawinski. + +*timeout: 10 +*cycle: 10 +*lockTimeout: 0 +*passwdTimeout: 30 +*nice: 10 +*lock: False +*verbose: False +*fade: True +*unfade: False +*fadeSeconds: 1 +*fadeTicks: 75 + +*captureStderr: True +*captureStdout: True +*textForeground: Yellow +*textBackground: Black +*font: *-medium-r-*-140-*-m-* + +! Turning on "installColormap" interacts erratically with twm and tvtwm, +! but seems to work fine with mwm and olwm. Try it and see. +! +*installColormap: False + +! Programs on this list apply all the time. +*programs: qix -root \n\ + qix -root -solid -delay 0 -segments 100 \n\ + qix -root -linear -count 10 -size 100 -segments 200 \n\ + attraction -root -mode balls \n\ + attraction -root -mode lines -points 3 -segments 200 \n\ + attraction -root -mode splines -segments 300 \n\ + attraction -root -mode lines -radius 300 \ + -orbit -vmult 0.5 \n\ + pyro -root \n\ + helix -root \n\ + pedal -root \n\ + rorschach -root -offset 7 \n\ + hopalong -root \n\ + greynetic -root \n\ + xroger -root \n\ + imsmap -root \n\ + slidescreen -root \n\ + decayscreen -root \n\ + hypercube -root \n\ + halo -root \n\ + maze -root \n\ + flame -root \n\ + lmorph -root \n + +! Programs on this list are run only for monochrome screens. +*monoPrograms: qix -root -linear -count 5 -size 200 -spread 30 \ + -segments 75 -solid -xor \n\ + rocks -root \n\ + noseguy -root \n + +! Programs on this list are run only for color (really, non-mono) screens. +*colorPrograms: qix -root -count 4 -solid -transparent \n\ + qix -root -count 5 -solid -transparent -linear \ + -segments 250 -size 100 \n\ + attraction -root -mode polygons \n\ + attraction -root -mode filled-splines -segments 0 \n\ + attraction -root -glow -points 10 \n\ + rocks -root -fg darksalmon \n\ + noseguy -root -fg yellow -bg gray30 \n + + +! Some other screenhacks that you might want to track down: +! +! xdaliclock -root -builtin2 \n\ +! xswarm -r 2>&- \n\ +! xwave -root \n\ +! xbouncebits ... \n\ +! ico -r \n\ +! xsplinefun \n\ +! kaleid -root \n\ +! xfishtank -c black -d -r 2 \n\ + + +! Resources for the dialog boxes: +! +*fontList: *-helvetica-medium-r-*-*-*-120-*-*-*-iso8859-1 +*demoDialog*label1.fontList: *-helvetica-medium-r-*-*-*-140-*-*-*-iso8859-1 +*passwdDialog*fontList: *-helvetica-medium-r-*-*-*-140-*-*-*-iso8859-1 +*XmList.fontList: *-courier-medium-r-*-*-*-120-*-*-*-iso8859-1 +*XmTextField.fontList: *-courier-medium-r-*-*-*-120-*-*-*-iso8859-1 +*passwdDialog.passwdText.fontList: *-courier-medium-r-*-*-*-120-*-*-*-iso8859-1 + +*XmDialogShell*foreground: black +*XmDialogShell*background: gray90 +*XmDialogShell*XmTextField.foreground: black +*XmDialogShell*XmTextField.background: white +*XmDialogShell*demoList.foreground: black +*XmDialogShell*demoList.background: white +*XmDialogShell*rogerLabel.foreground: red3 +*XmDialogShell*rogerLabel.background: white + +*XmDialogShell.title: XScreenSaver +*allowShellResize: True +*autoUnmanage: False + +! This doesn't work. Motif ignores it if there is a scroll-list! +*demoDialog.maxWidth: 600 + +*label1.labelString: XScreenSaver %s +*label2.labelString: Copyright © 1991-1995 by Jamie Zawinski +*demoList.visibleItemCount: 10 +*demoList.automaticSelection: True +*next.labelString: Run Next +*prev.labelString: Run Previous +*edit.labelString: Edit Parameters +*done.labelString: Exit Demo Mode +*restart.labelString: Reinitialize + +*resourcesLabel.labelString: XScreenSaver Parameters + +! *timeoutLabel.labelString: Timeout Minutes +! *cycleLabel.labelString: Cycle Seconds +! *fadeSecondsLabel.labelString:Fade Seconds +! *fadeTicksLabel.labelString: Fade Ticks +! *lockLabel.labelString: Lock Timeout +! *passwdLabel.labelString: Password Timeout +! *resourcesForm*XmTextField.columns: 5 + +*timeoutLabel.labelString: Saver Timeout +*cycleLabel.labelString: Cycle Timeout +*fadeSecondsLabel.labelString: Fade Duration +*fadeTicksLabel.labelString: Fade Ticks +*lockLabel.labelString: Lock Timeout +*passwdLabel.labelString: Password Timeout +*resourcesForm*XmTextField.columns: 8 + +*verboseToggle.labelString: Verbose +*cmapToggle.labelString: Install Colormap +*fadeToggle.labelString: Fade Colormap +*unfadeToggle.labelString: Unfade Colormap +*lockToggle.labelString: Require Password +*resourcesDone.labelString: Done +*resourcesCancel.labelString: Cancel + +*passwdDialog.title: Password +*passwdLabel1.labelString: XScreenSaver %s +*passwdLabel2.labelString: This display is locked. +*passwdLabel3.labelString: Please type %s's password to unlock it. +*passwdDone.labelString: Done +*passwdCancel.labelString: Cancel + +*passwdLabel1.alignment: ALIGNMENT_BEGINNING +*passwdLabel2.alignment: ALIGNMENT_BEGINNING +*passwdLabel3.alignment: ALIGNMENT_BEGINNING +*rogerLabel.width: 150 + +! You probably won't need to change these. They aren't consulted if the +! XIdle extension is being used. +! +*pointerPollTime: 5 +*initialDelay: 30 +*windowCreationTimeout: 30 + +*bourneShell: /bin/sh diff --git a/driver/xscreensaver.c b/driver/xscreensaver.c new file mode 100755 index 00000000..b0758ab0 --- /dev/null +++ b/driver/xscreensaver.c @@ -0,0 +1,1155 @@ +/* xscreensaver, Copyright (c) 1991-1995 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. + */ + +#include "version.h" + +/* ======================================================================== + * First we wait until the keyboard and mouse become idle for the specified + * amount of time. We do this in one of three different ways: periodically + * checking with the XIdle server extension; selecting key and mouse events + * on (nearly) all windows; or by waiting for the MIT-SCREEN-SAVER extension + * to send us a "you are idle" event. + * + * Then, we map a full screen black window (or, in the case of the + * MIT-SCREEN-SAVER extension, use the one it gave us.) + * + * We place a __SWM_VROOT property on this window, so that newly-started + * clients will think that this window is a "virtual root" window. + * + * If there is an existing "virtual root" window (one that already had + * an __SWM_VROOT property) then we remove that property from that window. + * Otherwise, clients would see that window (the real virtual root) instead + * of ours (the impostor.) + * + * Then we pick a random program to run, and start it. Two assumptions + * are made about this program: that it has been specified with whatever + * command-line options are necessary to make it run on the root window; + * and that it has been compiled with vroot.h, so that it is able to find + * the root window when a virtual-root window manager (or this program) is + * running. + * + * Then, we wait for keyboard or mouse events to be generated on the window. + * When they are, we kill the inferior process, unmap the window, and restore + * the __SWM_VROOT property to the real virtual root window if there was one. + * + * While we are waiting, we also set up timers so that, after a certain + * amount of time has passed, we can start a different screenhack. We do + * this by killing the running child process with SIGTERM, and then starting + * a new one in the same way. + * + * If there was a real virtual root, meaning that we removed the __SWM_VROOT + * property from it, meaning we must (absolutely must) restore it before we + * exit, then we set up signal handlers for most signals (SIGINT, SIGTERM, + * etc.) that do this. Most Xlib and Xt routines are not reentrant, so it + * is not generally safe to call them from signal handlers; however, this + * program spends most of its time waiting, so the window of opportunity + * when code could be called reentrantly is fairly small; and also, the worst + * that could happen is that the call would fail. If we've gotten one of + * these signals, then we're on our way out anyway. If we didn't restore the + * __SWM_VROOT property, that would be very bad, so it's worth a shot. Note + * that this means that, if you're using a virtual-root window manager, you + * can really fuck up the world by killing this process with "kill -9". + * + * This program accepts ClientMessages of type SCREENSAVER; these messages + * may contain the atom ACTIVATE or DEACTIVATE, meaning to turn the + * screensaver on or off now, regardless of the idleness of the user, + * and a few other things. The included "xscreensaver_command" program + * sends these messsages. + * + * If we don't have the XIdle or MIT-SCREENSAVER extensions, then we do the + * XAutoLock trick: notice every window that gets created, and wait 30 + * seconds or so until its creating process has settled down, and then + * select KeyPress events on those windows which already select for + * KeyPress events. It's important that we not select KeyPress on windows + * which don't select them, because that would interfere with event + * propagation. This will break if any program changes its event mask to + * contain KeyRelease or PointerMotion more than 30 seconds after creating + * the window, but that's probably pretty rare. + * + * The reason that we can't select KeyPresses on windows that don't have + * them already is that, when dispatching a KeyPress event, X finds the + * lowest (leafmost) window in the hierarchy on which *any* client selects + * for KeyPress, and sends the event to that window. This means that if a + * client had a window with subwindows, and expected to receive KeyPress + * events on the parent window instead of the subwindows, then that client + * would malfunction if some other client selected KeyPress events on the + * subwindows. It is an incredible misdesign that one client can make + * another client malfunction in this way. + * + * To detect mouse motion, we periodically wake up and poll the mouse + * position and button/modifier state, and notice when something has + * changed. We make this check every five seconds by default, and since the + * screensaver timeout has a granularity of one minute, this makes the + * chance of a false positive very small. We could detect mouse motion in + * the same way as keyboard activity, but that would suffer from the same + * "client changing event mask" problem that the KeyPress events hack does. + * I think polling is more reliable. + * + * None of this crap happens if we're using one of the extensions, so install + * one of them if the description above sounds just too flaky to live. It + * is, but those are your choices. + * + * A third idle-detection option could be implement (but is not): when + * running on the console display ($DISPLAY is `localhost`:0) and we're on a + * machine where /dev/tty and /dev/mouse have reasonable last-modification + * times, we could just stat those. But the incremental benefit of + * implementing this is really small, so forget I said anything. + * + * Debugging hints: + * - Have a second terminal handy. + * - Be careful where you set your breakpoints, you don't want this to + * stop under the debugger with the keyboard grabbed or the blackout + * window exposed. + * - you probably can't set breakpoints in functions that are called on + * the other side of a call to fork() -- if your clients are dying + * with signal 5, Trace/BPT Trap, you're losing in this way. + * - If you aren't using XIdle, don't leave this stopped under the + * debugger for very long, or the X input buffer will get huge because + * of the keypress events it's selecting for. This can make your X + * server wedge with "no more input buffers." + * + * ======================================================================== */ + +#if __STDC__ +#include +#include +#endif + +#ifdef VMS +#include +#include /*for getpid*/ +#endif + +#include +#include +#include +#include +#include +#ifndef VMS +#include +#else +#include "sys$common:[decw$include.xmu]Error.h" +#endif + +#ifdef HAVE_XIDLE_EXTENSION +#include +#endif /* HAVE_XIDLE_EXTENSION */ + +#ifdef HAVE_SAVER_EXTENSION +#include +#endif /* HAVE_SAVER_EXTENSION */ + +#include "yarandom.h" +#include "xscreensaver.h" + +extern char *get_string_resource P((char *, char *)); +extern Bool get_boolean_resource P((char *, char *)); +extern int get_integer_resource P((char *, char *)); +extern unsigned int get_minutes_resource P((char *, char *)); +extern unsigned int get_seconds_resource P((char *, char *)); + +extern Visual *get_visual_resource P((Display *, char *, char *)); +extern int get_visual_depth P((Display *, Visual *)); + +extern void notice_events_timer P((XtPointer closure, XtIntervalId *timer)); +extern void cycle_timer P((void *junk1, XtPointer junk2)); +extern void activate_lock_timer P((void *junk1, XtPointer junk2)); +extern void sleep_until_idle P((Bool until_idle_p)); + +extern void ensure_no_screensaver_running P((void)); +extern void initialize_screensaver_window P((void)); +extern void disable_builtin_screensaver P((void)); + +extern void hack_environment P((void)); +extern void grab_keyboard_and_mouse P((void)); +extern void ungrab_keyboard_and_mouse P((void)); + +extern void save_argv P((int argc, char **argv)); + +extern void initialize_stderr P((void)); + +char *screensaver_version; +char *progname; +char *progclass; +XrmDatabase db; + +XtAppContext app; + +Display *dpy; +Screen *screen; +Visual *visual; +int visual_depth; + +Widget toplevel_shell; + +Time lock_timeout; + +extern Time timeout; +extern Time cycle; +#ifndef NO_LOCKING +extern Time passwd_timeout; +#endif +extern Time pointer_timeout; +extern Time notice_events_timeout; +extern XtIntervalId lock_id, cycle_id; + +Bool use_xidle_extension; +Bool use_saver_extension; +Bool verbose_p; +Bool lock_p, locked_p; + +extern char **screenhacks; +extern int screenhacks_count; +extern char *shell; +extern int nice_inferior; +extern Window screensaver_window; +extern Cursor cursor; +extern Colormap cmap, cmap2; +extern Bool fade_p, unfade_p; +extern int fade_seconds, fade_ticks; +extern Bool install_cmap_p; +extern Bool locking_disabled_p; +extern char *nolock_reason; +extern Bool demo_mode_p; +extern Bool dbox_up_p; +extern int next_mode_p; + +#ifdef HAVE_SAVER_EXTENSION +int saver_ext_event_number = 0; +int saver_ext_error_number = 0; +#endif /* HAVE_SAVER_EXTENSION */ + +static time_t initial_delay; + +extern Atom XA_VROOT, XA_XSETROOT_ID; +extern Atom XA_SCREENSAVER_VERSION, XA_SCREENSAVER_ID; + +static Atom XA_SCREENSAVER; +static Atom XA_ACTIVATE, XA_DEACTIVATE, XA_CYCLE, XA_NEXT, XA_PREV; +static Atom XA_EXIT, XA_RESTART, XA_DEMO, XA_LOCK; + +#ifdef NO_MOTIF /* kludge */ +Bool demo_mode_p = 0; +Bool dbox_up_p = 0; +#endif + + +#ifdef NO_DEMO_MODE +# define demo_mode() abort() +#else +extern void demo_mode P((void)); +#endif + +static XrmOptionDescRec options [] = { + { "-timeout", ".timeout", XrmoptionSepArg, 0 }, + { "-cycle", ".cycle", XrmoptionSepArg, 0 }, + { "-idelay", ".initialDelay", XrmoptionSepArg, 0 }, + { "-nice", ".nice", XrmoptionSepArg, 0 }, + { "-visual", ".visualID", XrmoptionSepArg, 0 }, + { "-lock-timeout", ".lockTimeout", XrmoptionSepArg, 0 }, + { "-install", ".installColormap", XrmoptionNoArg, "on" }, + { "-no-install", ".installColormap", XrmoptionNoArg, "off" }, + { "-verbose", ".verbose", XrmoptionNoArg, "on" }, + { "-silent", ".verbose", XrmoptionNoArg, "off" }, + { "-xidle-extension", ".xidleExtension", XrmoptionNoArg, "on" }, + { "-no-xidle-extension", ".xidleExtension", XrmoptionNoArg, "off" }, + { "-ss-extension", ".saverExtension", XrmoptionNoArg, "on" }, + { "-no-ss-extension", ".saverExtension", XrmoptionNoArg, "off" }, + { "-lock", ".lock", XrmoptionNoArg, "on" }, + { "-no-lock", ".lock", XrmoptionNoArg, "off" } +}; + +static char *defaults[] = { +#ifndef VMS +#include "XScreenSaver.ad.h" +#else +#include "XScreenSaver_ad.h" +#endif + 0 +}; + +static void +do_help P((void)) +{ + printf ("\ +xscreensaver %s, copyright (c) 1991-1995 by Jamie Zawinski .\n\ +The standard Xt command-line options are accepted; other options include:\n\ +\n\ + -timeout When the screensaver should activate.\n\ + -cycle How long to let each hack run.\n\ + -idelay How long to sleep before startup.\n\ + -visual Which X visual to run on.\n\ + -demo Enter interactive demo mode on startup.\n\ + -install Install a private colormap.\n\ + -no-install Don't.\n\ + -verbose Be loud.\n\ + -silent Don't.\n\ + -xidle-extension Use the R5 XIdle server extension.\n\ + -no-xidle-extension Don't.\n\ + -ss-extension Use the R6 MIT-SCREEN-SAVER server extension.\n\ + -no-ss-extension Don't.\n\ + -lock Require a password before deactivating.\n\ + -no-lock Don't.\n\ + -lock-timeout Grace period before locking; default 0.\n\ + -help This message.\n\ +\n\ +Use the `xscreensaver-command' program to control a running screensaver.\n\ +\n\ +The *programs, *colorPrograms, and *monoPrograms resources control which\n\ +graphics demos will be launched by the screensaver. See the man page for\n\ +more details.\n\n", + screensaver_version); + +#ifdef NO_LOCKING + printf ("Support for locking was not enabled at compile-time.\n"); +#endif +#ifdef NO_DEMO_MODE + printf ("Support for demo mode was not enabled at compile-time.\n"); +#endif +#if !defined(HAVE_XIDLE_EXTENSION) && !defined(HAVE_SAVER_EXTENSION) + printf ("Support for the XIDLE and MIT-SCREEN-SAVER server extensions\ + was not\nenabled at compile-time.\n"); +#endif /* !HAVE_XIDLE_EXTENSION && !HAVE_SAVER_EXTENSION */ + + fflush (stdout); + exit (1); +} + + +static void +get_screenhacks P((void)) +{ + char *data[3]; + int i, hacks_size = 10; + + data[0] = get_string_resource ("programs", "Programs"); + data[1] = ((CellsOfScreen (screen) <= 2) + ? get_string_resource ("monoPrograms", "MonoPrograms") + : get_string_resource ("colorPrograms", "ColorPrograms")); + data[2] = 0; + if (! data[0]) data[0] = data[1], data[1] = 0; + + screenhacks = (char **) malloc (sizeof (char *) * hacks_size); + screenhacks_count = 0; + + for (i = 0; data[i]; i++) + { + int j = 0; + char *d = data [i]; + int size = strlen (d); + while (j < size) + { + int end, start = j; + if (d[j] == ' ' || d[j] == '\t' || d[j] == '\n' || d[j] == 0) + { + j++; + continue; + } + if (hacks_size <= screenhacks_count) + screenhacks = (char **) realloc (screenhacks, + (hacks_size = hacks_size * 2) * + sizeof (char *)); + screenhacks [screenhacks_count++] = d + j; + while (d[j] != 0 && d[j] != '\n') + j++; + end = j; + while (j > start && (d[j-1] == ' ' || d[j-1] == '\t')) + j--; + d[j] = 0; + j = end + 1; + } + } + + /* shrink all whitespace to one space, for the benefit of the "demo" + mode display. We only do this when we can easily tell that the + whitespace is not significant (no shell metachars). + */ + for (i = 0; i < screenhacks_count; i++) + { + char *s = screenhacks [i]; + char *s2; + int L = strlen (s); + int j, k; + for (j = 0; j < L; j++) + { + switch (s[j]) + { + case '\'': case '"': case '`': case '\\': + goto DONE; + case '\t': + s[j] = ' '; + case ' ': + k = 0; + for (s2 = s+j+1; *s2 == ' ' || *s2 == '\t'; s2++) + k++; + if (k > 0) + for (s2 = s + j + 1; *s2; s2++) + s2 [0] = s2 [k]; + break; + } + } + DONE: + ; + } + + if (screenhacks_count) + { + /* Shrink down the screenhacks array to be only as big as it needs to. + This doesn't really matter at all. */ + screenhacks = (char **) + realloc (screenhacks, ((screenhacks_count + 1) * sizeof(char *))); + screenhacks [screenhacks_count] = 0; + } + else + { + free (screenhacks); + screenhacks = 0; + } +} + + +static void +get_resources P((void)) +{ + /* Note: we can't use the resource ".visual" because Xt is SO FUCKED. */ + visual = get_visual_resource (dpy, "visualID", "VisualID"); + timeout = 1000 * get_minutes_resource ("timeout", "Time"); + cycle = 1000 * get_minutes_resource ("cycle", "Time"); + lock_timeout = 1000 * get_minutes_resource ("lockTimeout", "Time"); + nice_inferior = get_integer_resource ("nice", "Nice"); + verbose_p = get_boolean_resource ("verbose", "Boolean"); + lock_p = get_boolean_resource ("lock", "Boolean"); + install_cmap_p = get_boolean_resource ("installColormap", "Boolean"); + fade_p = get_boolean_resource ("fade", "Boolean"); + unfade_p = get_boolean_resource ("unfade", "Boolean"); + fade_seconds = get_seconds_resource ("fadeSeconds", "Time"); + fade_ticks = get_integer_resource ("fadeTicks", "Integer"); + shell = get_string_resource ("bourneShell", "BourneShell"); + initial_delay = get_seconds_resource ("initialDelay", "Time"); + pointer_timeout = 1000 * get_seconds_resource ("pointerPollTime", "Time"); + notice_events_timeout = 1000 * get_seconds_resource ("windowCreationTimeout", + "Time"); +#ifndef NO_LOCKING + passwd_timeout = 1000 * get_seconds_resource ("passwdTimeout", "Time"); + if (passwd_timeout == 0) passwd_timeout = 30000; +#endif + if (timeout < 10000) timeout = 10000; + if (cycle != 0 && cycle < 2000) cycle = 2000; + if (pointer_timeout == 0) pointer_timeout = 5000; + if (notice_events_timeout == 0) notice_events_timeout = 10000; + if (fade_seconds == 0 || fade_ticks == 0) fade_p = False; + if (! fade_p) unfade_p = False; + + visual_depth = get_visual_depth (dpy, visual); + + if (visual_depth <= 1 || CellsOfScreen (screen) <= 2) + install_cmap_p = False; + +#ifdef NO_LOCKING + locking_disabled_p = True; + nolock_reason = "not compiled with locking support"; + if (lock_p) + { + lock_p = False; + fprintf (stderr, "%s: %snot compiled with support for locking.\n", + progname, (verbose_p ? "## " : "")); + } +#else /* ! NO_LOCKING */ + if (lock_p && locking_disabled_p) + { + fprintf (stderr, "%s: %slocking is disabled (%s).\n", progname, + (verbose_p ? "## " : ""), nolock_reason); + lock_p = False; + } +#endif /* ! NO_LOCKING */ + + /* don't set use_xidle_extension unless it is explicitly specified */ + if (get_string_resource ("xidleExtension", "Boolean")) + use_xidle_extension = get_boolean_resource ("xidleExtension", "Boolean"); + else +#ifdef HAVE_XIDLE_EXTENSION /* pick a default */ + use_xidle_extension = True; +#else /* !HAVE_XIDLE_EXTENSION */ + use_xidle_extension = False; +#endif /* !HAVE_XIDLE_EXTENSION */ + + /* don't set use_saver_extension unless it is explicitly specified */ + if (get_string_resource ("saverExtension", "Boolean")) + use_saver_extension = get_boolean_resource ("saverExtension", "Boolean"); + else +#ifdef HAVE_SAVER_EXTENSION /* pick a default */ + use_saver_extension = True; +#else /* !HAVE_SAVER_EXTENSION */ + use_saver_extension = False; +#endif /* !HAVE_SAVER_EXTENSION */ + + + get_screenhacks (); +} + +char * +timestring P((void)) +{ + long now = time ((time_t *) 0); + char *str = (char *) ctime (&now); + char *nl = (char *) strchr (str, '\n'); + if (nl) *nl = 0; /* take off that dang newline */ + return str; +} + +#ifdef NO_SETUID +# define hack_uid() +# define hack_uid_warn() +#else /* !NO_SETUID */ +extern void hack_uid P((void)); +extern void hack_uid_warn P((void)); +#endif /* NO_SETUID */ + + +#ifndef NO_LOCKING +extern Bool unlock_p P((Widget)); +extern Bool lock_init P((void)); +#endif + +static void initialize P((int argc, char **argv)); +static void main_loop P((void)); + +#ifndef VMS +void +#else +int +#endif +main (argc, argv) + int argc; + char **argv; +{ + initialize (argc, argv); + main_loop (); +} + + +static int +saver_ehandler (dpy, error) + Display *dpy; + XErrorEvent *error; +{ + fprintf (real_stderr, "\nX error in %s:\n", progname); + if (XmuPrintDefaultErrorMessage (dpy, error, real_stderr)) + exit (-1); + else + fprintf (real_stderr, " (nonfatal.)\n"); + return 0; +} + +static void +#if __STDC__ +initialize_connection (int argc, char **argv) +#else +initialize_connection (argc, argv) + int argc; + char **argv; +#endif +{ + toplevel_shell = XtAppInitialize (&app, progclass, + options, XtNumber (options), + &argc, argv, defaults, 0, 0); + + dpy = XtDisplay (toplevel_shell); + screen = XtScreen (toplevel_shell); + db = XtDatabase (dpy); + XtGetApplicationNameAndClass (dpy, &progname, &progclass); + + if (argc == 2 && !strcmp (argv[1], "-help")) + do_help (); + else if (argc > 1) + { + fprintf (stderr, "%s: unknown option %s\n", progname, argv [1]); + exit (1); + } + get_resources (); + hack_uid_warn (); + hack_environment (); + XA_VROOT = XInternAtom (dpy, "__SWM_VROOT", False); + XA_SCREENSAVER = XInternAtom (dpy, "SCREENSAVER", False); + XA_SCREENSAVER_VERSION = XInternAtom (dpy, "_SCREENSAVER_VERSION", False); + XA_SCREENSAVER_ID = XInternAtom (dpy, "_SCREENSAVER_ID", False); + XA_XSETROOT_ID = XInternAtom (dpy, "_XSETROOT_ID", False); + XA_ACTIVATE = XInternAtom (dpy, "ACTIVATE", False); + XA_DEACTIVATE = XInternAtom (dpy, "DEACTIVATE", False); + XA_RESTART = XInternAtom (dpy, "RESTART", False); + XA_CYCLE = XInternAtom (dpy, "CYCLE", False); + XA_NEXT = XInternAtom (dpy, "NEXT", False); + XA_PREV = XInternAtom (dpy, "PREV", False); + XA_EXIT = XInternAtom (dpy, "EXIT", False); + XA_DEMO = XInternAtom (dpy, "DEMO", False); + XA_LOCK = XInternAtom (dpy, "LOCK", False); +} + +#ifdef HAVE_SAVER_EXTENSION + +static int +ignore_all_errors_ehandler (dpy, error) + Display *dpy; + XErrorEvent *error; +{ + return 0; +} + +static void +init_saver_extension () +{ + XID kill_id; + Atom kill_type; + Window root = RootWindowOfScreen (screen); + XScreenSaverInfo *info; + Pixmap blank_pix = XCreatePixmap (dpy, root, 1, 1, 1); + + /* Kill off the old MIT-SCREEN-SAVER client if there is one. + This tends to generate X errors, though (possibly due to a bug + in the server extension itself?) so just ignore errors here. */ + if (XScreenSaverGetRegistered (dpy, XScreenNumberOfScreen (screen), + &kill_id, &kill_type) + && kill_id != blank_pix) + { + int (*old_handler) (); + old_handler = XSetErrorHandler (ignore_all_errors_ehandler); + XKillClient (dpy, kill_id); + XSync (dpy, False); + XSetErrorHandler (old_handler); + } + + XScreenSaverSelectInput (dpy, root, ScreenSaverNotifyMask); + + XScreenSaverRegister (dpy, XScreenNumberOfScreen (screen), + (XID) blank_pix, XA_PIXMAP); + info = XScreenSaverAllocInfo (); + +#if 0 + /* #### I think this is noticing that the saver is on, and replacing it + without turning it off first. */ + saver = info->window; + if (info->state == ScreenSaverOn) + { + if (info->kind != ScreenSaverExternal) + { + XResetScreenSaver (display); + XActivateScreenSaver (display); + } + StartSaver (); + } +#endif +} +#endif /* HAVE_SAVER_EXTENSION */ + + +extern void init_sigchld P((void)); + +static void +initialize (argc, argv) + int argc; + char **argv; +{ + Bool initial_demo_mode_p = False; + screensaver_version = (char *) malloc (5); + memcpy (screensaver_version, screensaver_id + 17, 4); + screensaver_version [4] = 0; + progname = argv[0]; /* reset later; this is for the benefit of lock_init() */ + +#ifdef NO_LOCKING + locking_disabled_p = True; + nolock_reason = "not compiled with locking support"; +#else + locking_disabled_p = False; + +#ifdef SCO + set_auth_parameters(argc, argv); +#endif + + if (! lock_init ()) /* before hack_uid() for proper permissions */ + { + locking_disabled_p = True; + nolock_reason = "error getting password"; + } +#endif + + hack_uid (); + progclass = "XScreenSaver"; + + /* remove -demo switch before saving argv */ + { + int i; + for (i = 1; i < argc; i++) + while (!strcmp ("-demo", argv [i])) + { + int j; + initial_demo_mode_p = True; + for (j = i; j < argc; j++) + argv [j] = argv [j+1]; + argv [j] = 0; + argc--; + if (argc <= i) break; + } + } + save_argv (argc, argv); + initialize_connection (argc, argv); + ensure_no_screensaver_running (); + + if (verbose_p) + printf ("\ +%s %s, copyright (c) 1991-1995 by Jamie Zawinski .\n\ + pid = %d.\n", progname, screensaver_version, getpid ()); + ensure_no_screensaver_running (); + + demo_mode_p = initial_demo_mode_p; + screensaver_window = 0; + cursor = 0; + initialize_screensaver_window (); + srandom ((int) time ((time_t *) 0)); + cycle_id = 0; + lock_id = 0; + locked_p = False; + + if (use_saver_extension) + { +#ifdef HAVE_SAVER_EXTENSION + if (! XScreenSaverQueryExtension (dpy, + &saver_ext_event_number, + &saver_ext_error_number)) + { + fprintf (stderr, + "%s: %sdisplay %s does not support the MIT-SCREEN-SAVER extension.\n", + progname, (verbose_p ? "## " : ""), DisplayString (dpy)); + use_saver_extension = False; + } + else if (use_xidle_extension) + { + fprintf (stderr, + "%s: %sMIT-SCREEN-SAVER extension used instead of XIDLE extension.\n", + progname, (verbose_p ? "## " : "")); + use_xidle_extension = False; + } +#else /* !HAVE_SAVER_EXTENSION */ + fprintf (stderr, + "%s: %snot compiled with support for the MIT-SCREEN-SAVER extension.\n", + progname, (verbose_p ? "## " : "")); + use_saver_extension = False; +#endif /* !HAVE_SAVER_EXTENSION */ + } + + if (use_xidle_extension) + { +#ifdef HAVE_XIDLE_EXTENSION + int first_event, first_error; + if (! XidleQueryExtension (dpy, &first_event, &first_error)) + { + fprintf (stderr, + "%s: %sdisplay %s does not support the XIdle extension.\n", + progname, (verbose_p ? "## " : ""), DisplayString (dpy)); + use_xidle_extension = False; + } +#else /* !HAVE_XIDLE_EXTENSION */ + fprintf (stderr, "%s: %snot compiled with support for XIdle.\n", + progname, (verbose_p ? "## " : "")); + use_xidle_extension = False; +#endif /* !HAVE_XIDLE_EXTENSION */ + } + + init_sigchld (); + + disable_builtin_screensaver (); + +#ifdef HAVE_SAVER_EXTENSION + if (use_saver_extension) + init_saver_extension (); +#endif /* HAVE_SAVER_EXTENSION */ + + if (verbose_p && use_saver_extension) + fprintf (stderr, "%s: using MIT-SCREEN-SAVER server extension.\n", + progname); + if (verbose_p && use_xidle_extension) + fprintf (stderr, "%s: using XIdle server extension.\n", + progname); + + initialize_stderr (); + XSetErrorHandler (saver_ehandler); + + if (initial_demo_mode_p) + /* If the user wants demo mode, don't wait around before doing it. */ + initial_delay = 0; + + if (!use_xidle_extension && !use_saver_extension) + { + if (initial_delay) + { + if (verbose_p) + { + printf ("%s: waiting for %d second%s...", progname, + (int) initial_delay, (initial_delay == 1 ? "" : "s")); + fflush (stdout); + } + sleep (initial_delay); + if (verbose_p) + printf (" done.\n"); + } + if (verbose_p) + { + printf ("%s: selecting events on extant windows...", progname); + fflush (stdout); + } + notice_events_timer ((XtPointer) + RootWindowOfScreen (XtScreen (toplevel_shell)), + 0); + if (verbose_p) + printf (" done.\n"); + } +} + + +extern void suspend_screenhack P((Bool suspend_p)); + +static void +main_loop () +{ +#ifdef VMS + void (*cycle_timer_ptr)() = cycle_timer; + void (*activate_lock_timer_ptr)() = activate_lock_timer; +#endif + while (1) + { + if (! demo_mode_p) + sleep_until_idle (True); + + if (demo_mode_p) + demo_mode (); + else + { + if (verbose_p) + printf ("%s: user is idle; waking up at %s.\n", progname, + timestring()); + blank_screen (); + spawn_screenhack (True); + if (cycle) +#ifdef VMS + cycle_id = XtAppAddTimeOut (app, cycle, cycle_timer_ptr, 0); +#else + cycle_id = XtAppAddTimeOut (app, cycle, + (XtTimerCallbackProc)cycle_timer, 0); +#endif +#ifndef NO_LOCKING + if (lock_p && lock_timeout == 0) + locked_p = True; + if (lock_p && !locked_p) + /* locked_p might be true already because of ClientMessage */ +#ifdef VMS + lock_id = XtAppAddTimeOut (app,lock_timeout, + activate_lock_timer_ptr,0); +#else + lock_id = XtAppAddTimeOut (app,lock_timeout, + (XtTimerCallbackProc) + activate_lock_timer,0); +#endif /* VMS */ +#endif + + PASSWD_INVALID: + + sleep_until_idle (False); /* until not idle */ + +#ifndef NO_LOCKING + if (locked_p) + { + Bool val; + if (locking_disabled_p) abort (); + dbox_up_p = True; + + /* We used to ungrab the keyboard here, before calling unlock_p() + to pop up the dialog box. This left the keyboard ungrabbed + for a small window, during an insecure state. Bennett Todd + was seeing the bahavior that, when the load was high, he could + actually get characters through to a shell under the saver + window (he accidentally typed his password there...) + + So the ungrab has been moved down into pop_passwd_dialog() + just after the server is grabbed, closing this window + entirely. + */ + /* ungrab_keyboard_and_mouse (); */ + + suspend_screenhack (True); + XUndefineCursor (dpy, screensaver_window); + if (verbose_p) + printf ("%s: prompting for password.\n", progname); + val = unlock_p (toplevel_shell); + if (verbose_p && val == False) + printf ("%s: password incorrect!\n", progname); + dbox_up_p = False; + XDefineCursor (dpy, screensaver_window, cursor); + suspend_screenhack (False); + + /* I think this grab is now redundant, but it shouldn't hurt. */ + grab_keyboard_and_mouse (); + + if (! val) + goto PASSWD_INVALID; + locked_p = False; + } +#endif + unblank_screen (); + kill_screenhack (); + if (cycle_id) + { + XtRemoveTimeOut (cycle_id); + cycle_id = 0; + } +#ifndef NO_LOCKING + if (lock_id) + { + XtRemoveTimeOut (lock_id); + lock_id = 0; + } +#endif + if (verbose_p) + printf ("%s: user is active; going to sleep at %s.\n", progname, + timestring ()); + } + } +} + + + +Bool +handle_clientmessage (event, until_idle_p) + XEvent *event; + Bool until_idle_p; +{ + Atom type = 0; + if (event->xclient.message_type != XA_SCREENSAVER) + { + char *str; + str = XGetAtomName (dpy, event->xclient.message_type); +#ifdef VMS + if (str) + { + if (str[0] == 'V' && + str[1] == 'U' && + str[2] == 'E' && + str[3] == '_') + { + if (verbose_p) + printf ("%s: VUE_ ClientMessage ignored: %s .\n", progname, str); + return False; + } + } +#endif /* Patche made by sandre@clamart.wireline.slb.com - Oct 95 */ + + fprintf (stderr, "%s: %sunrecognised ClientMessage type %s received\n", + progname, (verbose_p ? "## " : ""), + (str ? str : "(null)")); + if (str) XFree (str); + return False; + } + if (event->xclient.format != 32) + { + fprintf (stderr, "%s: %sClientMessage of format %d received, not 32\n", + progname, (verbose_p ? "## " : ""), event->xclient.format); + return False; + } + type = event->xclient.data.l[0]; + if (type == XA_ACTIVATE) + { + if (until_idle_p) + { + if (verbose_p) + printf ("%s: ACTIVATE ClientMessage received.\n", progname); + if (use_saver_extension) + { + XForceScreenSaver (dpy, ScreenSaverActive); + return False; + } + else + { + return True; + } + } + fprintf (stderr, + "%s: %sClientMessage ACTIVATE received while already active.\n", + progname, (verbose_p ? "## " : "")); + } + else if (type == XA_DEACTIVATE) + { + if (! until_idle_p) + { + if (verbose_p) + printf ("%s: DEACTIVATE ClientMessage received.\n", progname); + if (use_saver_extension) + { + XForceScreenSaver (dpy, ScreenSaverReset); + return False; + } + else + { + return True; + } + } + fprintf (stderr, + "%s: %sClientMessage DEACTIVATE received while inactive.\n", + progname, (verbose_p ? "## " : "")); + } + else if (type == XA_CYCLE) + { + if (! until_idle_p) + { + if (verbose_p) + printf ("%s: CYCLE ClientMessage received.\n", progname); + if (cycle_id) + XtRemoveTimeOut (cycle_id); + cycle_id = 0; + cycle_timer (0, 0); + return False; + } + fprintf (stderr, + "%s: %sClientMessage CYCLE received while inactive.\n", + progname, (verbose_p ? "## " : "")); + } + else if (type == XA_NEXT || type == XA_PREV) + { + if (verbose_p) + printf ("%s: %s ClientMessage received.\n", progname, + (type == XA_NEXT ? "NEXT" : "PREV")); + next_mode_p = 1 + (type == XA_PREV); + + if (! until_idle_p) + { + if (cycle_id) + XtRemoveTimeOut (cycle_id); + cycle_id = 0; + cycle_timer (0, 0); + } + else + return True; + } + else if (type == XA_EXIT) + { + /* Ignore EXIT message if the screen is locked. */ + if (until_idle_p || !locked_p) + { + if (verbose_p) + printf ("%s: EXIT ClientMessage received.\n", progname); + if (! until_idle_p) + { + unblank_screen (); + kill_screenhack (); + XSync (dpy, False); + } + exit (0); + } + else + fprintf (stderr, "%s: %sEXIT ClientMessage received while locked.\n", + progname, (verbose_p ? "## " : "")); + } + else if (type == XA_RESTART) + { + /* The RESTART message works whether the screensaver is active or not, + unless the screen is locked, in which case it doesn't work. + */ + if (until_idle_p || !locked_p) + { + if (verbose_p) + printf ("%s: RESTART ClientMessage received.\n", progname); + if (! until_idle_p) + { + unblank_screen (); + kill_screenhack (); + XSync (dpy, False); + } + restart_process (); + } + else + fprintf(stderr, "%s: %sRESTART ClientMessage received while locked.\n", + progname, (verbose_p ? "## " : "")); + } + else if (type == XA_DEMO) + { +#ifdef NO_DEMO_MODE + fprintf (stderr, + "%s: %snot compiled with support for DEMO mode\n", + progname, (verbose_p ? "## " : "")); +#else + if (until_idle_p) + { + if (verbose_p) + printf ("%s: DEMO ClientMessage received.\n", progname); + demo_mode_p = True; + return True; + } + fprintf (stderr, + "%s: %sDEMO ClientMessage received while active.\n", + progname, (verbose_p ? "## " : "")); +#endif + } + else if (type == XA_LOCK) + { +#ifdef NO_LOCKING + fprintf (stderr, "%s: %snot compiled with support for LOCK mode\n", + progname, (verbose_p ? "## " : "")); +#else + if (locking_disabled_p) + fprintf (stderr, + "%s: %sLOCK ClientMessage received, but locking is disabled.\n", + progname, (verbose_p ? "## " : "")); + else if (locked_p) + fprintf (stderr, + "%s: %sLOCK ClientMessage received while already locked.\n", + progname, (verbose_p ? "## " : "")); + else + { + locked_p = True; + if (verbose_p) + printf ("%s: LOCK ClientMessage received;%s locking.\n", + progname, until_idle_p ? " activating and" : ""); + + if (lock_id) /* we're doing it now, so lose the timeout */ + { + XtRemoveTimeOut (lock_id); + lock_id = 0; + } + + if (until_idle_p) + { + if (use_saver_extension) + { + XForceScreenSaver (dpy, ScreenSaverActive); + return False; + } + else + { + return True; + } + } + } +#endif + } + else + { + char *str; + str = (type ? XGetAtomName(dpy, type) : 0); + if (str) + fprintf (stderr, + "%s: %sunrecognised screensaver ClientMessage %s received\n", + progname, (verbose_p ? "## " : ""), str); + else + fprintf (stderr, + "%s: %sunrecognised screensaver ClientMessage 0x%x received\n", + progname, (verbose_p ? "## " : ""), + (unsigned int) event->xclient.data.l[0]); + if (str) XFree (str); + } + return False; +} diff --git a/driver/xscreensaver.c_mods1_save b/driver/xscreensaver.c_mods1_save new file mode 100755 index 00000000..54bbaba1 --- /dev/null +++ b/driver/xscreensaver.c_mods1_save @@ -0,0 +1,1143 @@ +/* xscreensaver, Copyright (c) 1991-1995 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. + */ + +#include "version.h" + +/* ======================================================================== + * First we wait until the keyboard and mouse become idle for the specified + * amount of time. We do this in one of three different ways: periodically + * checking with the XIdle server extension; selecting key and mouse events + * on (nearly) all windows; or by waiting for the MIT-SCREEN-SAVER extension + * to send us a "you are idle" event. + * + * Then, we map a full screen black window (or, in the case of the + * MIT-SCREEN-SAVER extension, use the one it gave us.) + * + * We place a __SWM_VROOT property on this window, so that newly-started + * clients will think that this window is a "virtual root" window. + * + * If there is an existing "virtual root" window (one that already had + * an __SWM_VROOT property) then we remove that property from that window. + * Otherwise, clients would see that window (the real virtual root) instead + * of ours (the impostor.) + * + * Then we pick a random program to run, and start it. Two assumptions + * are made about this program: that it has been specified with whatever + * command-line options are necessary to make it run on the root window; + * and that it has been compiled with vroot.h, so that it is able to find + * the root window when a virtual-root window manager (or this program) is + * running. + * + * Then, we wait for keyboard or mouse events to be generated on the window. + * When they are, we kill the inferior process, unmap the window, and restore + * the __SWM_VROOT property to the real virtual root window if there was one. + * + * While we are waiting, we also set up timers so that, after a certain + * amount of time has passed, we can start a different screenhack. We do + * this by killing the running child process with SIGTERM, and then starting + * a new one in the same way. + * + * If there was a real virtual root, meaning that we removed the __SWM_VROOT + * property from it, meaning we must (absolutely must) restore it before we + * exit, then we set up signal handlers for most signals (SIGINT, SIGTERM, + * etc.) that do this. Most Xlib and Xt routines are not reentrant, so it + * is not generally safe to call them from signal handlers; however, this + * program spends most of its time waiting, so the window of opportunity + * when code could be called reentrantly is fairly small; and also, the worst + * that could happen is that the call would fail. If we've gotten one of + * these signals, then we're on our way out anyway. If we didn't restore the + * __SWM_VROOT property, that would be very bad, so it's worth a shot. Note + * that this means that, if you're using a virtual-root window manager, you + * can really fuck up the world by killing this process with "kill -9". + * + * This program accepts ClientMessages of type SCREENSAVER; these messages + * may contain the atom ACTIVATE or DEACTIVATE, meaning to turn the + * screensaver on or off now, regardless of the idleness of the user, + * and a few other things. The included "xscreensaver_command" program + * sends these messsages. + * + * If we don't have the XIdle or MIT-SCREENSAVER extensions, then we do the + * XAutoLock trick: notice every window that gets created, and wait 30 + * seconds or so until its creating process has settled down, and then + * select KeyPress events on those windows which already select for + * KeyPress events. It's important that we not select KeyPress on windows + * which don't select them, because that would interfere with event + * propagation. This will break if any program changes its event mask to + * contain KeyRelease or PointerMotion more than 30 seconds after creating + * the window, but that's probably pretty rare. + * + * The reason that we can't select KeyPresses on windows that don't have + * them already is that, when dispatching a KeyPress event, X finds the + * lowest (leafmost) window in the hierarchy on which *any* client selects + * for KeyPress, and sends the event to that window. This means that if a + * client had a window with subwindows, and expected to receive KeyPress + * events on the parent window instead of the subwindows, then that client + * would malfunction if some other client selected KeyPress events on the + * subwindows. It is an incredible misdesign that one client can make + * another client malfunction in this way. + * + * To detect mouse motion, we periodically wake up and poll the mouse + * position and button/modifier state, and notice when something has + * changed. We make this check every five seconds by default, and since the + * screensaver timeout has a granularity of one minute, this makes the + * chance of a false positive very small. We could detect mouse motion in + * the same way as keyboard activity, but that would suffer from the same + * "client changing event mask" problem that the KeyPress events hack does. + * I think polling is more reliable. + * + * None of this crap happens if we're using one of the extensions, so install + * one of them if the description above sounds just too flaky to live. It + * is, but those are your choices. + * + * A third idle-detection option could be implement (but is not): when + * running on the console display ($DISPLAY is `localhost`:0) and we're on a + * machine where /dev/tty and /dev/mouse have reasonable last-modification + * times, we could just stat those. But the incremental benefit of + * implementing this is really small, so forget I said anything. + * + * Debugging hints: + * - Have a second terminal handy. + * - Be careful where you set your breakpoints, you don't want this to + * stop under the debugger with the keyboard grabbed or the blackout + * window exposed. + * - you probably can't set breakpoints in functions that are called on + * the other side of a call to fork() -- if your clients are dying + * with signal 5, Trace/BPT Trap, you're losing in this way. + * - If you aren't using XIdle, don't leave this stopped under the + * debugger for very long, or the X input buffer will get huge because + * of the keypress events it's selecting for. This can make your X + * server wedge with "no more input buffers." + * + * ======================================================================== */ + +#if __STDC__ +#include +#include +#endif + +#ifdef VMS +#include +#include /*for getpid*/ +#endif + +#include +#include +#include +#include +#include +#ifndef VMS +#include +#else +#include "sys$common:[decw$include.xmu]Error.h" +#endif + +#ifdef HAVE_XIDLE_EXTENSION +#include +#endif /* HAVE_XIDLE_EXTENSION */ + +#ifdef HAVE_SAVER_EXTENSION +#include +#endif /* HAVE_SAVER_EXTENSION */ + +#include "yarandom.h" +#include "xscreensaver.h" + +extern char *get_string_resource P((char *, char *)); +extern Bool get_boolean_resource P((char *, char *)); +extern int get_integer_resource P((char *, char *)); +extern unsigned int get_minutes_resource P((char *, char *)); +extern unsigned int get_seconds_resource P((char *, char *)); + +extern Visual *get_visual_resource P((Display *, char *, char *)); +extern int get_visual_depth P((Display *, Visual *)); + +extern void notice_events_timer P((XtPointer closure, XtIntervalId *timer)); +extern void cycle_timer P((void *junk1, XtPointer junk2)); +extern void activate_lock_timer P((void *junk1, XtPointer junk2)); +extern void sleep_until_idle P((Bool until_idle_p)); + +extern void ensure_no_screensaver_running P((void)); +extern void initialize_screensaver_window P((void)); +extern void disable_builtin_screensaver P((void)); + +extern void hack_environment P((void)); +extern void grab_keyboard_and_mouse P((void)); +extern void ungrab_keyboard_and_mouse P((void)); + +extern void save_argv P((int argc, char **argv)); + +extern void initialize_stderr P((void)); + +char *screensaver_version; +char *progname; +char *progclass; +XrmDatabase db; + +XtAppContext app; + +Display *dpy; +Screen *screen; +Visual *visual; +int visual_depth; + +Widget toplevel_shell; + +Time lock_timeout; + +extern Time timeout; +extern Time cycle; +#ifndef NO_LOCKING +extern Time passwd_timeout; +#endif +extern Time pointer_timeout; +extern Time notice_events_timeout; +extern XtIntervalId lock_id, cycle_id; + +Bool use_xidle_extension; +Bool use_saver_extension; +Bool verbose_p; +Bool lock_p, locked_p; + +extern char **screenhacks; +extern int screenhacks_count; +extern char *shell; +extern int nice_inferior; +extern Window screensaver_window; +extern Cursor cursor; +extern Colormap cmap, cmap2; +extern Bool fade_p, unfade_p; +extern int fade_seconds, fade_ticks; +extern Bool install_cmap_p; +extern Bool locking_disabled_p; +extern char *nolock_reason; +extern Bool demo_mode_p; +extern Bool dbox_up_p; +extern int next_mode_p; + +#ifdef HAVE_SAVER_EXTENSION +int saver_ext_event_number = 0; +int saver_ext_error_number = 0; +#endif /* HAVE_SAVER_EXTENSION */ + +static time_t initial_delay; + +extern Atom XA_VROOT, XA_XSETROOT_ID; +extern Atom XA_SCREENSAVER_VERSION, XA_SCREENSAVER_ID; + +static Atom XA_SCREENSAVER; +static Atom XA_ACTIVATE, XA_DEACTIVATE, XA_CYCLE, XA_NEXT, XA_PREV; +static Atom XA_EXIT, XA_RESTART, XA_DEMO, XA_LOCK; + +#ifdef NO_MOTIF /* kludge */ +Bool demo_mode_p = 0; +Bool dbox_up_p = 0; +#endif + + +#ifdef NO_DEMO_MODE +# define demo_mode() abort() +#else +extern void demo_mode P((void)); +#endif + +static XrmOptionDescRec options [] = { + { "-timeout", ".timeout", XrmoptionSepArg, 0 }, + { "-cycle", ".cycle", XrmoptionSepArg, 0 }, + { "-idelay", ".initialDelay", XrmoptionSepArg, 0 }, + { "-nice", ".nice", XrmoptionSepArg, 0 }, + { "-visual", ".visualID", XrmoptionSepArg, 0 }, + { "-lock-timeout", ".lockTimeout", XrmoptionSepArg, 0 }, + { "-install", ".installColormap", XrmoptionNoArg, "on" }, + { "-no-install", ".installColormap", XrmoptionNoArg, "off" }, + { "-verbose", ".verbose", XrmoptionNoArg, "on" }, + { "-silent", ".verbose", XrmoptionNoArg, "off" }, + { "-xidle-extension", ".xidleExtension", XrmoptionNoArg, "on" }, + { "-no-xidle-extension", ".xidleExtension", XrmoptionNoArg, "off" }, + { "-ss-extension", ".saverExtension", XrmoptionNoArg, "on" }, + { "-no-ss-extension", ".saverExtension", XrmoptionNoArg, "off" }, + { "-lock", ".lock", XrmoptionNoArg, "on" }, + { "-no-lock", ".lock", XrmoptionNoArg, "off" } +}; + +static char *defaults[] = { +#ifndef VMS +#include "XScreenSaver.ad.h" +#else +#include "XScreenSaver_ad.h" +#endif + 0 +}; + +static void +do_help P((void)) +{ + printf ("\ +xscreensaver %s, copyright (c) 1991-1995 by Jamie Zawinski .\n\ +The standard Xt command-line options are accepted; other options include:\n\ +\n\ + -timeout When the screensaver should activate.\n\ + -cycle How long to let each hack run.\n\ + -idelay How long to sleep before startup.\n\ + -visual Which X visual to run on.\n\ + -demo Enter interactive demo mode on startup.\n\ + -install Install a private colormap.\n\ + -no-install Don't.\n\ + -verbose Be loud.\n\ + -silent Don't.\n\ + -xidle-extension Use the R5 XIdle server extension.\n\ + -no-xidle-extension Don't.\n\ + -ss-extension Use the R6 MIT-SCREEN-SAVER server extension.\n\ + -no-ss-extension Don't.\n\ + -lock Require a password before deactivating.\n\ + -no-lock Don't.\n\ + -lock-timeout Grace period before locking; default 0.\n\ + -help This message.\n\ +\n\ +Use the `xscreensaver-command' program to control a running screensaver.\n\ +\n\ +The *programs, *colorPrograms, and *monoPrograms resources control which\n\ +graphics demos will be launched by the screensaver. See the man page for\n\ +more details.\n\n", + screensaver_version); + +#ifdef NO_LOCKING + printf ("Support for locking was not enabled at compile-time.\n"); +#endif +#ifdef NO_DEMO_MODE + printf ("Support for demo mode was not enabled at compile-time.\n"); +#endif +#if !defined(HAVE_XIDLE_EXTENSION) && !defined(HAVE_SAVER_EXTENSION) + printf ("Support for the XIDLE and MIT-SCREEN-SAVER server extensions\ + was not\nenabled at compile-time.\n"); +#endif /* !HAVE_XIDLE_EXTENSION && !HAVE_SAVER_EXTENSION */ + + fflush (stdout); + exit (1); +} + + +static void +get_screenhacks P((void)) +{ + char *data[3]; + int i, hacks_size = 10; + + data[0] = get_string_resource ("programs", "Programs"); + data[1] = ((CellsOfScreen (screen) <= 2) + ? get_string_resource ("monoPrograms", "MonoPrograms") + : get_string_resource ("colorPrograms", "ColorPrograms")); + data[2] = 0; + if (! data[0]) data[0] = data[1], data[1] = 0; + + screenhacks = (char **) malloc (sizeof (char *) * hacks_size); + screenhacks_count = 0; + + for (i = 0; data[i]; i++) + { + int j = 0; + char *d = data [i]; + int size = strlen (d); + while (j < size) + { + int end, start = j; + if (d[j] == ' ' || d[j] == '\t' || d[j] == '\n' || d[j] == 0) + { + j++; + continue; + } + if (hacks_size <= screenhacks_count) + screenhacks = (char **) realloc (screenhacks, + (hacks_size = hacks_size * 2) * + sizeof (char *)); + screenhacks [screenhacks_count++] = d + j; + while (d[j] != 0 && d[j] != '\n') + j++; + end = j; + while (j > start && (d[j-1] == ' ' || d[j-1] == '\t')) + j--; + d[j] = 0; + j = end + 1; + } + } + + /* shrink all whitespace to one space, for the benefit of the "demo" + mode display. We only do this when we can easily tell that the + whitespace is not significant (no shell metachars). + */ + for (i = 0; i < screenhacks_count; i++) + { + char *s = screenhacks [i]; + char *s2; + int L = strlen (s); + int j, k; + for (j = 0; j < L; j++) + { + switch (s[j]) + { + case '\'': case '"': case '`': case '\\': + goto DONE; + case '\t': + s[j] = ' '; + case ' ': + k = 0; + for (s2 = s+j+1; *s2 == ' ' || *s2 == '\t'; s2++) + k++; + if (k > 0) + for (s2 = s + j + 1; *s2; s2++) + s2 [0] = s2 [k]; + break; + } + } + DONE: + ; + } + + if (screenhacks_count) + { + /* Shrink down the screenhacks array to be only as big as it needs to. + This doesn't really matter at all. */ + screenhacks = (char **) + realloc (screenhacks, ((screenhacks_count + 1) * sizeof(char *))); + screenhacks [screenhacks_count] = 0; + } + else + { + free (screenhacks); + screenhacks = 0; + } +} + + +static void +get_resources P((void)) +{ + /* Note: we can't use the resource ".visual" because Xt is SO FUCKED. */ + visual = get_visual_resource (dpy, "visualID", "VisualID"); + timeout = 1000 * get_minutes_resource ("timeout", "Time"); + cycle = 1000 * get_minutes_resource ("cycle", "Time"); + lock_timeout = 1000 * get_minutes_resource ("lockTimeout", "Time"); + nice_inferior = get_integer_resource ("nice", "Nice"); + verbose_p = get_boolean_resource ("verbose", "Boolean"); + lock_p = get_boolean_resource ("lock", "Boolean"); + install_cmap_p = get_boolean_resource ("installColormap", "Boolean"); + fade_p = get_boolean_resource ("fade", "Boolean"); + unfade_p = get_boolean_resource ("unfade", "Boolean"); + fade_seconds = get_seconds_resource ("fadeSeconds", "Time"); + fade_ticks = get_integer_resource ("fadeTicks", "Integer"); + shell = get_string_resource ("bourneShell", "BourneShell"); + initial_delay = get_seconds_resource ("initialDelay", "Time"); + pointer_timeout = 1000 * get_seconds_resource ("pointerPollTime", "Time"); + notice_events_timeout = 1000 * get_seconds_resource ("windowCreationTimeout", + "Time"); +#ifndef NO_LOCKING + passwd_timeout = 1000 * get_seconds_resource ("passwdTimeout", "Time"); + if (passwd_timeout == 0) passwd_timeout = 30000; +#endif + if (timeout < 10000) timeout = 10000; + if (cycle != 0 && cycle < 2000) cycle = 2000; + if (pointer_timeout == 0) pointer_timeout = 5000; + if (notice_events_timeout == 0) notice_events_timeout = 10000; + if (fade_seconds == 0 || fade_ticks == 0) fade_p = False; + if (! fade_p) unfade_p = False; + + visual_depth = get_visual_depth (dpy, visual); + + if (visual_depth <= 1 || CellsOfScreen (screen) <= 2) + install_cmap_p = False; + +#ifdef NO_LOCKING + locking_disabled_p = True; + nolock_reason = "not compiled with locking support"; + if (lock_p) + { + lock_p = False; + fprintf (stderr, "%s: %snot compiled with support for locking.\n", + progname, (verbose_p ? "## " : "")); + } +#else /* ! NO_LOCKING */ + if (lock_p && locking_disabled_p) + { + fprintf (stderr, "%s: %slocking is disabled (%s).\n", progname, + (verbose_p ? "## " : ""), nolock_reason); + lock_p = False; + } +#endif /* ! NO_LOCKING */ + + /* don't set use_xidle_extension unless it is explicitly specified */ + if (get_string_resource ("xidleExtension", "Boolean")) + use_xidle_extension = get_boolean_resource ("xidleExtension", "Boolean"); + else +#ifdef HAVE_XIDLE_EXTENSION /* pick a default */ + use_xidle_extension = True; +#else /* !HAVE_XIDLE_EXTENSION */ + use_xidle_extension = False; +#endif /* !HAVE_XIDLE_EXTENSION */ + + /* don't set use_saver_extension unless it is explicitly specified */ + if (get_string_resource ("saverExtension", "Boolean")) + use_saver_extension = get_boolean_resource ("saverExtension", "Boolean"); + else +#ifdef HAVE_SAVER_EXTENSION /* pick a default */ + use_saver_extension = True; +#else /* !HAVE_SAVER_EXTENSION */ + use_saver_extension = False; +#endif /* !HAVE_SAVER_EXTENSION */ + + + get_screenhacks (); +} + +char * +timestring P((void)) +{ + long now = time ((time_t *) 0); + char *str = (char *) ctime (&now); + char *nl = (char *) strchr (str, '\n'); + if (nl) *nl = 0; /* take off that dang newline */ + return str; +} + +#ifdef NO_SETUID +# define hack_uid() +# define hack_uid_warn() +#else /* !NO_SETUID */ +extern void hack_uid P((void)); +extern void hack_uid_warn P((void)); +#endif /* NO_SETUID */ + + +#ifndef NO_LOCKING +extern Bool unlock_p P((Widget)); +extern Bool lock_init P((void)); +#endif + +static void initialize P((int argc, char **argv)); +static void main_loop P((void)); + +#ifndef VMS +void +#else +int +#endif +main (argc, argv) + int argc; + char **argv; +{ + initialize (argc, argv); + main_loop (); +} + + +static int +saver_ehandler (dpy, error) + Display *dpy; + XErrorEvent *error; +{ + fprintf (real_stderr, "\nX error in %s:\n", progname); + if (XmuPrintDefaultErrorMessage (dpy, error, real_stderr)) + exit (-1); + else + fprintf (real_stderr, " (nonfatal.)\n"); + return 0; +} + +static void +#if __STDC__ +initialize_connection (int argc, char **argv) +#else +initialize_connection (argc, argv) + int argc; + char **argv; +#endif +{ + toplevel_shell = XtAppInitialize (&app, progclass, + options, XtNumber (options), + &argc, argv, defaults, 0, 0); + + dpy = XtDisplay (toplevel_shell); + screen = XtScreen (toplevel_shell); + db = XtDatabase (dpy); + XtGetApplicationNameAndClass (dpy, &progname, &progclass); + + if (argc == 2 && !strcmp (argv[1], "-help")) + do_help (); + else if (argc > 1) + { + fprintf (stderr, "%s: unknown option %s\n", progname, argv [1]); + exit (1); + } + get_resources (); + hack_uid_warn (); + hack_environment (); + XA_VROOT = XInternAtom (dpy, "__SWM_VROOT", False); + XA_SCREENSAVER = XInternAtom (dpy, "SCREENSAVER", False); + XA_SCREENSAVER_VERSION = XInternAtom (dpy, "_SCREENSAVER_VERSION", False); + XA_SCREENSAVER_ID = XInternAtom (dpy, "_SCREENSAVER_ID", False); + XA_XSETROOT_ID = XInternAtom (dpy, "_XSETROOT_ID", False); + XA_ACTIVATE = XInternAtom (dpy, "ACTIVATE", False); + XA_DEACTIVATE = XInternAtom (dpy, "DEACTIVATE", False); + XA_RESTART = XInternAtom (dpy, "RESTART", False); + XA_CYCLE = XInternAtom (dpy, "CYCLE", False); + XA_NEXT = XInternAtom (dpy, "NEXT", False); + XA_PREV = XInternAtom (dpy, "PREV", False); + XA_EXIT = XInternAtom (dpy, "EXIT", False); + XA_DEMO = XInternAtom (dpy, "DEMO", False); + XA_LOCK = XInternAtom (dpy, "LOCK", False); +} + +#ifdef HAVE_SAVER_EXTENSION + +static int +ignore_all_errors_ehandler (dpy, error) + Display *dpy; + XErrorEvent *error; +{ + return 0; +} + +static void +init_saver_extension () +{ + XID kill_id; + Atom kill_type; + Window root = RootWindowOfScreen (screen); + XScreenSaverInfo *info; + Pixmap blank_pix = XCreatePixmap (dpy, root, 1, 1, 1); + + /* Kill off the old MIT-SCREEN-SAVER client if there is one. + This tends to generate X errors, though (possibly due to a bug + in the server extension itself?) so just ignore errors here. */ + if (XScreenSaverGetRegistered (dpy, XScreenNumberOfScreen (screen), + &kill_id, &kill_type) + && kill_id != blank_pix) + { + int (*old_handler) (); + old_handler = XSetErrorHandler (ignore_all_errors_ehandler); + XKillClient (dpy, kill_id); + XSync (dpy, False); + XSetErrorHandler (old_handler); + } + + XScreenSaverSelectInput (dpy, root, ScreenSaverNotifyMask); + + XScreenSaverRegister (dpy, XScreenNumberOfScreen (screen), + (XID) blank_pix, XA_PIXMAP); + info = XScreenSaverAllocInfo (); + +#if 0 + /* #### I think this is noticing that the saver is on, and replacing it + without turning it off first. */ + saver = info->window; + if (info->state == ScreenSaverOn) + { + if (info->kind != ScreenSaverExternal) + { + XResetScreenSaver (display); + XActivateScreenSaver (display); + } + StartSaver (); + } +#endif +} +#endif /* HAVE_SAVER_EXTENSION */ + + +extern void init_sigchld P((void)); + +static void +initialize (argc, argv) + int argc; + char **argv; +{ + Bool initial_demo_mode_p = False; + screensaver_version = (char *) malloc (5); + memcpy (screensaver_version, screensaver_id + 17, 4); + screensaver_version [4] = 0; + progname = argv[0]; /* reset later; this is for the benefit of lock_init() */ + +#ifdef NO_LOCKING + locking_disabled_p = True; + nolock_reason = "not compiled with locking support"; +#else + locking_disabled_p = False; + +#ifdef SCO + set_auth_parameters(argc, argv); +#endif + + if (! lock_init ()) /* before hack_uid() for proper permissions */ + { + locking_disabled_p = True; + nolock_reason = "error getting password"; + } +#endif + + hack_uid (); + progclass = "XScreenSaver"; + + /* remove -demo switch before saving argv */ + { + int i; + for (i = 1; i < argc; i++) + while (!strcmp ("-demo", argv [i])) + { + int j; + initial_demo_mode_p = True; + for (j = i; j < argc; j++) + argv [j] = argv [j+1]; + argv [j] = 0; + argc--; + if (argc <= i) break; + } + } + save_argv (argc, argv); + initialize_connection (argc, argv); + ensure_no_screensaver_running (); + + if (verbose_p) + printf ("\ +%s %s, copyright (c) 1991-1995 by Jamie Zawinski .\n\ + pid = %d.\n", progname, screensaver_version, getpid ()); + ensure_no_screensaver_running (); + + demo_mode_p = initial_demo_mode_p; + screensaver_window = 0; + cursor = 0; + initialize_screensaver_window (); + srandom ((int) time ((time_t *) 0)); + cycle_id = 0; + lock_id = 0; + locked_p = False; + + if (use_saver_extension) + { +#ifdef HAVE_SAVER_EXTENSION + if (! XScreenSaverQueryExtension (dpy, + &saver_ext_event_number, + &saver_ext_error_number)) + { + fprintf (stderr, + "%s: %sdisplay %s does not support the MIT-SCREEN-SAVER extension.\n", + progname, (verbose_p ? "## " : ""), DisplayString (dpy)); + use_saver_extension = False; + } + else if (use_xidle_extension) + { + fprintf (stderr, + "%s: %sMIT-SCREEN-SAVER extension used instead of XIDLE extension.\n", + progname, (verbose_p ? "## " : "")); + use_xidle_extension = False; + } +#else /* !HAVE_SAVER_EXTENSION */ + fprintf (stderr, + "%s: %snot compiled with support for the MIT-SCREEN-SAVER extension.\n", + progname, (verbose_p ? "## " : "")); + use_saver_extension = False; +#endif /* !HAVE_SAVER_EXTENSION */ + } + + if (use_xidle_extension) + { +#ifdef HAVE_XIDLE_EXTENSION + int first_event, first_error; + if (! XidleQueryExtension (dpy, &first_event, &first_error)) + { + fprintf (stderr, + "%s: %sdisplay %s does not support the XIdle extension.\n", + progname, (verbose_p ? "## " : ""), DisplayString (dpy)); + use_xidle_extension = False; + } +#else /* !HAVE_XIDLE_EXTENSION */ + fprintf (stderr, "%s: %snot compiled with support for XIdle.\n", + progname, (verbose_p ? "## " : "")); + use_xidle_extension = False; +#endif /* !HAVE_XIDLE_EXTENSION */ + } + + init_sigchld (); + + disable_builtin_screensaver (); + +#ifdef HAVE_SAVER_EXTENSION + if (use_saver_extension) + init_saver_extension (); +#endif /* HAVE_SAVER_EXTENSION */ + + if (verbose_p && use_saver_extension) + fprintf (stderr, "%s: using MIT-SCREEN-SAVER server extension.\n", + progname); + if (verbose_p && use_xidle_extension) + fprintf (stderr, "%s: using XIdle server extension.\n", + progname); + + initialize_stderr (); + XSetErrorHandler (saver_ehandler); + + if (initial_demo_mode_p) + /* If the user wants demo mode, don't wait around before doing it. */ + initial_delay = 0; + + if (!use_xidle_extension && !use_saver_extension) + { + if (initial_delay) + { + if (verbose_p) + { + printf ("%s: waiting for %d second%s...", progname, + (int) initial_delay, (initial_delay == 1 ? "" : "s")); + fflush (stdout); + } + sleep (initial_delay); + if (verbose_p) + printf (" done.\n"); + } + if (verbose_p) + { + printf ("%s: selecting events on extant windows...", progname); + fflush (stdout); + } + notice_events_timer ((XtPointer) + RootWindowOfScreen (XtScreen (toplevel_shell)), + 0); + if (verbose_p) + printf (" done.\n"); + } +} + + +extern void suspend_screenhack P((Bool suspend_p)); + +static void +main_loop () +{ + while (1) + { + if (! demo_mode_p) + sleep_until_idle (True); + + if (demo_mode_p) + demo_mode (); + else + { + if (verbose_p) + printf ("%s: user is idle; waking up at %s.\n", progname, + timestring()); + blank_screen (); + spawn_screenhack (True); + if (cycle) + cycle_id = XtAppAddTimeOut (app, cycle, + (XtTimerCallbackProc)cycle_timer, 0); + +#ifndef NO_LOCKING + if (lock_p && lock_timeout == 0) + locked_p = True; + if (lock_p && !locked_p) + /* locked_p might be true already because of ClientMessage */ + lock_id = XtAppAddTimeOut (app,lock_timeout, + (XtTimerCallbackProc) + activate_lock_timer,0); +#endif + + PASSWD_INVALID: + + sleep_until_idle (False); /* until not idle */ + +#ifndef NO_LOCKING + if (locked_p) + { + Bool val; + if (locking_disabled_p) abort (); + dbox_up_p = True; + + /* We used to ungrab the keyboard here, before calling unlock_p() + to pop up the dialog box. This left the keyboard ungrabbed + for a small window, during an insecure state. Bennett Todd + was seeing the bahavior that, when the load was high, he could + actually get characters through to a shell under the saver + window (he accidentally typed his password there...) + + So the ungrab has been moved down into pop_passwd_dialog() + just after the server is grabbed, closing this window + entirely. + */ + /* ungrab_keyboard_and_mouse (); */ + + suspend_screenhack (True); + XUndefineCursor (dpy, screensaver_window); + if (verbose_p) + printf ("%s: prompting for password.\n", progname); + val = unlock_p (toplevel_shell); + if (verbose_p && val == False) + printf ("%s: password incorrect!\n", progname); + dbox_up_p = False; + XDefineCursor (dpy, screensaver_window, cursor); + suspend_screenhack (False); + + /* I think this grab is now redundant, but it shouldn't hurt. */ + grab_keyboard_and_mouse (); + + if (! val) + goto PASSWD_INVALID; + locked_p = False; + } +#endif + unblank_screen (); + kill_screenhack (); + if (cycle_id) + { + XtRemoveTimeOut (cycle_id); + cycle_id = 0; + } +#ifndef NO_LOCKING + if (lock_id) + { + XtRemoveTimeOut (lock_id); + lock_id = 0; + } +#endif + if (verbose_p) + printf ("%s: user is active; going to sleep at %s.\n", progname, + timestring ()); + } + } +} + + + +Bool +handle_clientmessage (event, until_idle_p) + XEvent *event; + Bool until_idle_p; +{ + Atom type = 0; + if (event->xclient.message_type != XA_SCREENSAVER) + { + char *str; + str = XGetAtomName (dpy, event->xclient.message_type); +#ifdef VMS + if (str) + { + if (str[0] == 'V' && + str[1] == 'U' && + str[2] == 'E' && + str[3] == '_') + { + if (verbose_p) + printf ("%s: VUE_ ClientMessage ignored: %s .\n", progname, str); + return False; + } + } +#endif /* Patche made by sandre@clamart.wireline.slb.com - Oct 95 */ + + fprintf (stderr, "%s: %sunrecognised ClientMessage type %s received\n", + progname, (verbose_p ? "## " : ""), + (str ? str : "(null)")); + if (str) XFree (str); + return False; + } + if (event->xclient.format != 32) + { + fprintf (stderr, "%s: %sClientMessage of format %d received, not 32\n", + progname, (verbose_p ? "## " : ""), event->xclient.format); + return False; + } + type = event->xclient.data.l[0]; + if (type == XA_ACTIVATE) + { + if (until_idle_p) + { + if (verbose_p) + printf ("%s: ACTIVATE ClientMessage received.\n", progname); + if (use_saver_extension) + { + XForceScreenSaver (dpy, ScreenSaverActive); + return False; + } + else + { + return True; + } + } + fprintf (stderr, + "%s: %sClientMessage ACTIVATE received while already active.\n", + progname, (verbose_p ? "## " : "")); + } + else if (type == XA_DEACTIVATE) + { + if (! until_idle_p) + { + if (verbose_p) + printf ("%s: DEACTIVATE ClientMessage received.\n", progname); + if (use_saver_extension) + { + XForceScreenSaver (dpy, ScreenSaverReset); + return False; + } + else + { + return True; + } + } + fprintf (stderr, + "%s: %sClientMessage DEACTIVATE received while inactive.\n", + progname, (verbose_p ? "## " : "")); + } + else if (type == XA_CYCLE) + { + if (! until_idle_p) + { + if (verbose_p) + printf ("%s: CYCLE ClientMessage received.\n", progname); + if (cycle_id) + XtRemoveTimeOut (cycle_id); + cycle_id = 0; + cycle_timer (0, 0); + return False; + } + fprintf (stderr, + "%s: %sClientMessage CYCLE received while inactive.\n", + progname, (verbose_p ? "## " : "")); + } + else if (type == XA_NEXT || type == XA_PREV) + { + if (verbose_p) + printf ("%s: %s ClientMessage received.\n", progname, + (type == XA_NEXT ? "NEXT" : "PREV")); + next_mode_p = 1 + (type == XA_PREV); + + if (! until_idle_p) + { + if (cycle_id) + XtRemoveTimeOut (cycle_id); + cycle_id = 0; + cycle_timer (0, 0); + } + else + return True; + } + else if (type == XA_EXIT) + { + /* Ignore EXIT message if the screen is locked. */ + if (until_idle_p || !locked_p) + { + if (verbose_p) + printf ("%s: EXIT ClientMessage received.\n", progname); + if (! until_idle_p) + { + unblank_screen (); + kill_screenhack (); + XSync (dpy, False); + } + exit (0); + } + else + fprintf (stderr, "%s: %sEXIT ClientMessage received while locked.\n", + progname, (verbose_p ? "## " : "")); + } + else if (type == XA_RESTART) + { + /* The RESTART message works whether the screensaver is active or not, + unless the screen is locked, in which case it doesn't work. + */ + if (until_idle_p || !locked_p) + { + if (verbose_p) + printf ("%s: RESTART ClientMessage received.\n", progname); + if (! until_idle_p) + { + unblank_screen (); + kill_screenhack (); + XSync (dpy, False); + } + restart_process (); + } + else + fprintf(stderr, "%s: %sRESTART ClientMessage received while locked.\n", + progname, (verbose_p ? "## " : "")); + } + else if (type == XA_DEMO) + { +#ifdef NO_DEMO_MODE + fprintf (stderr, + "%s: %snot compiled with support for DEMO mode\n", + progname, (verbose_p ? "## " : "")); +#else + if (until_idle_p) + { + if (verbose_p) + printf ("%s: DEMO ClientMessage received.\n", progname); + demo_mode_p = True; + return True; + } + fprintf (stderr, + "%s: %sDEMO ClientMessage received while active.\n", + progname, (verbose_p ? "## " : "")); +#endif + } + else if (type == XA_LOCK) + { +#ifdef NO_LOCKING + fprintf (stderr, "%s: %snot compiled with support for LOCK mode\n", + progname, (verbose_p ? "## " : "")); +#else + if (locking_disabled_p) + fprintf (stderr, + "%s: %sLOCK ClientMessage received, but locking is disabled.\n", + progname, (verbose_p ? "## " : "")); + else if (locked_p) + fprintf (stderr, + "%s: %sLOCK ClientMessage received while already locked.\n", + progname, (verbose_p ? "## " : "")); + else + { + locked_p = True; + if (verbose_p) + printf ("%s: LOCK ClientMessage received;%s locking.\n", + progname, until_idle_p ? " activating and" : ""); + + if (lock_id) /* we're doing it now, so lose the timeout */ + { + XtRemoveTimeOut (lock_id); + lock_id = 0; + } + + if (until_idle_p) + { + if (use_saver_extension) + { + XForceScreenSaver (dpy, ScreenSaverActive); + return False; + } + else + { + return True; + } + } + } +#endif + } + else + { + char *str; + str = (type ? XGetAtomName(dpy, type) : 0); + if (str) + fprintf (stderr, + "%s: %sunrecognised screensaver ClientMessage %s received\n", + progname, (verbose_p ? "## " : ""), str); + else + fprintf (stderr, + "%s: %sunrecognised screensaver ClientMessage 0x%x received\n", + progname, (verbose_p ? "## " : ""), + (unsigned int) event->xclient.data.l[0]); + if (str) XFree (str); + } + return False; +} diff --git a/driver/xscreensaver.c_mods2_save b/driver/xscreensaver.c_mods2_save new file mode 100755 index 00000000..5e3f52be --- /dev/null +++ b/driver/xscreensaver.c_mods2_save @@ -0,0 +1,1161 @@ +/* xscreensaver, Copyright (c) 1991-1995 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. + */ + +#include "version.h" + +/* ======================================================================== + * First we wait until the keyboard and mouse become idle for the specified + * amount of time. We do this in one of three different ways: periodically + * checking with the XIdle server extension; selecting key and mouse events + * on (nearly) all windows; or by waiting for the MIT-SCREEN-SAVER extension + * to send us a "you are idle" event. + * + * Then, we map a full screen black window (or, in the case of the + * MIT-SCREEN-SAVER extension, use the one it gave us.) + * + * We place a __SWM_VROOT property on this window, so that newly-started + * clients will think that this window is a "virtual root" window. + * + * If there is an existing "virtual root" window (one that already had + * an __SWM_VROOT property) then we remove that property from that window. + * Otherwise, clients would see that window (the real virtual root) instead + * of ours (the impostor.) + * + * Then we pick a random program to run, and start it. Two assumptions + * are made about this program: that it has been specified with whatever + * command-line options are necessary to make it run on the root window; + * and that it has been compiled with vroot.h, so that it is able to find + * the root window when a virtual-root window manager (or this program) is + * running. + * + * Then, we wait for keyboard or mouse events to be generated on the window. + * When they are, we kill the inferior process, unmap the window, and restore + * the __SWM_VROOT property to the real virtual root window if there was one. + * + * While we are waiting, we also set up timers so that, after a certain + * amount of time has passed, we can start a different screenhack. We do + * this by killing the running child process with SIGTERM, and then starting + * a new one in the same way. + * + * If there was a real virtual root, meaning that we removed the __SWM_VROOT + * property from it, meaning we must (absolutely must) restore it before we + * exit, then we set up signal handlers for most signals (SIGINT, SIGTERM, + * etc.) that do this. Most Xlib and Xt routines are not reentrant, so it + * is not generally safe to call them from signal handlers; however, this + * program spends most of its time waiting, so the window of opportunity + * when code could be called reentrantly is fairly small; and also, the worst + * that could happen is that the call would fail. If we've gotten one of + * these signals, then we're on our way out anyway. If we didn't restore the + * __SWM_VROOT property, that would be very bad, so it's worth a shot. Note + * that this means that, if you're using a virtual-root window manager, you + * can really fuck up the world by killing this process with "kill -9". + * + * This program accepts ClientMessages of type SCREENSAVER; these messages + * may contain the atom ACTIVATE or DEACTIVATE, meaning to turn the + * screensaver on or off now, regardless of the idleness of the user, + * and a few other things. The included "xscreensaver_command" program + * sends these messsages. + * + * If we don't have the XIdle or MIT-SCREENSAVER extensions, then we do the + * XAutoLock trick: notice every window that gets created, and wait 30 + * seconds or so until its creating process has settled down, and then + * select KeyPress events on those windows which already select for + * KeyPress events. It's important that we not select KeyPress on windows + * which don't select them, because that would interfere with event + * propagation. This will break if any program changes its event mask to + * contain KeyRelease or PointerMotion more than 30 seconds after creating + * the window, but that's probably pretty rare. + * + * The reason that we can't select KeyPresses on windows that don't have + * them already is that, when dispatching a KeyPress event, X finds the + * lowest (leafmost) window in the hierarchy on which *any* client selects + * for KeyPress, and sends the event to that window. This means that if a + * client had a window with subwindows, and expected to receive KeyPress + * events on the parent window instead of the subwindows, then that client + * would malfunction if some other client selected KeyPress events on the + * subwindows. It is an incredible misdesign that one client can make + * another client malfunction in this way. + * + * To detect mouse motion, we periodically wake up and poll the mouse + * position and button/modifier state, and notice when something has + * changed. We make this check every five seconds by default, and since the + * screensaver timeout has a granularity of one minute, this makes the + * chance of a false positive very small. We could detect mouse motion in + * the same way as keyboard activity, but that would suffer from the same + * "client changing event mask" problem that the KeyPress events hack does. + * I think polling is more reliable. + * + * None of this crap happens if we're using one of the extensions, so install + * one of them if the description above sounds just too flaky to live. It + * is, but those are your choices. + * + * A third idle-detection option could be implement (but is not): when + * running on the console display ($DISPLAY is `localhost`:0) and we're on a + * machine where /dev/tty and /dev/mouse have reasonable last-modification + * times, we could just stat those. But the incremental benefit of + * implementing this is really small, so forget I said anything. + * + * Debugging hints: + * - Have a second terminal handy. + * - Be careful where you set your breakpoints, you don't want this to + * stop under the debugger with the keyboard grabbed or the blackout + * window exposed. + * - you probably can't set breakpoints in functions that are called on + * the other side of a call to fork() -- if your clients are dying + * with signal 5, Trace/BPT Trap, you're losing in this way. + * - If you aren't using XIdle, don't leave this stopped under the + * debugger for very long, or the X input buffer will get huge because + * of the keypress events it's selecting for. This can make your X + * server wedge with "no more input buffers." + * + * ======================================================================== */ + +#if __STDC__ +#include +#include +#endif + +#ifdef VMS +#include +#include /*for getpid*/ +#endif + +#include +#include +#include +#include +#include +#ifndef VMS +#include +#else +#include "sys$common:[decw$include.xmu]Error.h" +#endif + +#ifdef HAVE_XIDLE_EXTENSION +#include +#endif /* HAVE_XIDLE_EXTENSION */ + +#ifdef HAVE_SAVER_EXTENSION +#include +#endif /* HAVE_SAVER_EXTENSION */ + +#include "yarandom.h" +#include "xscreensaver.h" + +extern char *get_string_resource P((char *, char *)); +extern Bool get_boolean_resource P((char *, char *)); +extern int get_integer_resource P((char *, char *)); +extern unsigned int get_minutes_resource P((char *, char *)); +extern unsigned int get_seconds_resource P((char *, char *)); + +extern Visual *get_visual_resource P((Display *, char *, char *)); +extern int get_visual_depth P((Display *, Visual *)); + +extern void notice_events_timer P((XtPointer closure, XtIntervalId *timer)); +extern void cycle_timer P((void *junk1, XtPointer junk2)); +extern void activate_lock_timer P((void *junk1, XtPointer junk2)); +extern void sleep_until_idle P((Bool until_idle_p)); + +extern void ensure_no_screensaver_running P((void)); +extern void initialize_screensaver_window P((void)); +extern void disable_builtin_screensaver P((void)); + +extern void hack_environment P((void)); +extern void grab_keyboard_and_mouse P((void)); +extern void ungrab_keyboard_and_mouse P((void)); + +extern void save_argv P((int argc, char **argv)); + +extern void initialize_stderr P((void)); + +char *screensaver_version; +char *progname; +char *progclass; +XrmDatabase db; + +XtAppContext app; + +Display *dpy; +Screen *screen; +Visual *visual; +int visual_depth; + +Widget toplevel_shell; + +Time lock_timeout; + +extern Time timeout; +extern Time cycle; +#ifndef NO_LOCKING +extern Time passwd_timeout; +#endif +extern Time pointer_timeout; +extern Time notice_events_timeout; +extern XtIntervalId lock_id, cycle_id; + +Bool use_xidle_extension; +Bool use_saver_extension; +Bool verbose_p; +Bool lock_p, locked_p; + +extern char **screenhacks; +extern int screenhacks_count; +extern char *shell; +extern int nice_inferior; +extern Window screensaver_window; +extern Cursor cursor; +extern Colormap cmap, cmap2; +extern Bool fade_p, unfade_p; +extern int fade_seconds, fade_ticks; +extern Bool install_cmap_p; +extern Bool locking_disabled_p; +extern char *nolock_reason; +extern Bool demo_mode_p; +extern Bool dbox_up_p; +extern int next_mode_p; + +#ifdef HAVE_SAVER_EXTENSION +int saver_ext_event_number = 0; +int saver_ext_error_number = 0; +#endif /* HAVE_SAVER_EXTENSION */ + +static time_t initial_delay; + +extern Atom XA_VROOT, XA_XSETROOT_ID; +extern Atom XA_SCREENSAVER_VERSION, XA_SCREENSAVER_ID; + +static Atom XA_SCREENSAVER; +static Atom XA_ACTIVATE, XA_DEACTIVATE, XA_CYCLE, XA_NEXT, XA_PREV; +static Atom XA_EXIT, XA_RESTART, XA_DEMO, XA_LOCK; + +#ifdef NO_MOTIF /* kludge */ +Bool demo_mode_p = 0; +Bool dbox_up_p = 0; +#endif + + +#ifdef NO_DEMO_MODE +# define demo_mode() abort() +#else +extern void demo_mode P((void)); +#endif + +static XrmOptionDescRec options [] = { + { "-timeout", ".timeout", XrmoptionSepArg, 0 }, + { "-cycle", ".cycle", XrmoptionSepArg, 0 }, + { "-idelay", ".initialDelay", XrmoptionSepArg, 0 }, + { "-nice", ".nice", XrmoptionSepArg, 0 }, + { "-visual", ".visualID", XrmoptionSepArg, 0 }, + { "-lock-timeout", ".lockTimeout", XrmoptionSepArg, 0 }, + { "-install", ".installColormap", XrmoptionNoArg, "on" }, + { "-no-install", ".installColormap", XrmoptionNoArg, "off" }, + { "-verbose", ".verbose", XrmoptionNoArg, "on" }, + { "-silent", ".verbose", XrmoptionNoArg, "off" }, + { "-xidle-extension", ".xidleExtension", XrmoptionNoArg, "on" }, + { "-no-xidle-extension", ".xidleExtension", XrmoptionNoArg, "off" }, + { "-ss-extension", ".saverExtension", XrmoptionNoArg, "on" }, + { "-no-ss-extension", ".saverExtension", XrmoptionNoArg, "off" }, + { "-lock", ".lock", XrmoptionNoArg, "on" }, + { "-no-lock", ".lock", XrmoptionNoArg, "off" } +}; + +static char *defaults[] = { +#ifndef VMS +#include "XScreenSaver.ad.h" +#else +#include "XScreenSaver_ad.h" +#endif + 0 +}; + +static void +do_help P((void)) +{ + printf ("\ +xscreensaver %s, copyright (c) 1991-1995 by Jamie Zawinski .\n\ +The standard Xt command-line options are accepted; other options include:\n\ +\n\ + -timeout When the screensaver should activate.\n\ + -cycle How long to let each hack run.\n\ + -idelay How long to sleep before startup.\n\ + -visual Which X visual to run on.\n\ + -demo Enter interactive demo mode on startup.\n\ + -install Install a private colormap.\n\ + -no-install Don't.\n\ + -verbose Be loud.\n\ + -silent Don't.\n\ + -xidle-extension Use the R5 XIdle server extension.\n\ + -no-xidle-extension Don't.\n\ + -ss-extension Use the R6 MIT-SCREEN-SAVER server extension.\n\ + -no-ss-extension Don't.\n\ + -lock Require a password before deactivating.\n\ + -no-lock Don't.\n\ + -lock-timeout Grace period before locking; default 0.\n\ + -help This message.\n\ +\n\ +Use the `xscreensaver-command' program to control a running screensaver.\n\ +\n\ +The *programs, *colorPrograms, and *monoPrograms resources control which\n\ +graphics demos will be launched by the screensaver. See the man page for\n\ +more details.\n\n", + screensaver_version); + +#ifdef NO_LOCKING + printf ("Support for locking was not enabled at compile-time.\n"); +#endif +#ifdef NO_DEMO_MODE + printf ("Support for demo mode was not enabled at compile-time.\n"); +#endif +#if !defined(HAVE_XIDLE_EXTENSION) && !defined(HAVE_SAVER_EXTENSION) + printf ("Support for the XIDLE and MIT-SCREEN-SAVER server extensions\ + was not\nenabled at compile-time.\n"); +#endif /* !HAVE_XIDLE_EXTENSION && !HAVE_SAVER_EXTENSION */ + + fflush (stdout); + exit (1); +} + + +static void +get_screenhacks P((void)) +{ + char *data[3]; + int i, hacks_size = 10; + + data[0] = get_string_resource ("programs", "Programs"); + data[1] = ((CellsOfScreen (screen) <= 2) + ? get_string_resource ("monoPrograms", "MonoPrograms") + : get_string_resource ("colorPrograms", "ColorPrograms")); + data[2] = 0; + if (! data[0]) data[0] = data[1], data[1] = 0; + + screenhacks = (char **) malloc (sizeof (char *) * hacks_size); + screenhacks_count = 0; + + for (i = 0; data[i]; i++) + { + int j = 0; + char *d = data [i]; + int size = strlen (d); + while (j < size) + { + int end, start = j; + if (d[j] == ' ' || d[j] == '\t' || d[j] == '\n' || d[j] == 0) + { + j++; + continue; + } + if (hacks_size <= screenhacks_count) + screenhacks = (char **) realloc (screenhacks, + (hacks_size = hacks_size * 2) * + sizeof (char *)); + screenhacks [screenhacks_count++] = d + j; + while (d[j] != 0 && d[j] != '\n') + j++; + end = j; + while (j > start && (d[j-1] == ' ' || d[j-1] == '\t')) + j--; + d[j] = 0; + j = end + 1; + } + } + + /* shrink all whitespace to one space, for the benefit of the "demo" + mode display. We only do this when we can easily tell that the + whitespace is not significant (no shell metachars). + */ + for (i = 0; i < screenhacks_count; i++) + { + char *s = screenhacks [i]; + char *s2; + int L = strlen (s); + int j, k; + for (j = 0; j < L; j++) + { + switch (s[j]) + { + case '\'': case '"': case '`': case '\\': + goto DONE; + case '\t': + s[j] = ' '; + case ' ': + k = 0; + for (s2 = s+j+1; *s2 == ' ' || *s2 == '\t'; s2++) + k++; + if (k > 0) + for (s2 = s + j + 1; *s2; s2++) + s2 [0] = s2 [k]; + break; + } + } + DONE: + ; + } + + if (screenhacks_count) + { + /* Shrink down the screenhacks array to be only as big as it needs to. + This doesn't really matter at all. */ + screenhacks = (char **) + realloc (screenhacks, ((screenhacks_count + 1) * sizeof(char *))); + screenhacks [screenhacks_count] = 0; + } + else + { + free (screenhacks); + screenhacks = 0; + } +} + + +static void +get_resources P((void)) +{ + /* Note: we can't use the resource ".visual" because Xt is SO FUCKED. */ + visual = get_visual_resource (dpy, "visualID", "VisualID"); + timeout = 1000 * get_minutes_resource ("timeout", "Time"); + cycle = 1000 * get_minutes_resource ("cycle", "Time"); + lock_timeout = 1000 * get_minutes_resource ("lockTimeout", "Time"); + nice_inferior = get_integer_resource ("nice", "Nice"); + verbose_p = get_boolean_resource ("verbose", "Boolean"); + lock_p = get_boolean_resource ("lock", "Boolean"); + install_cmap_p = get_boolean_resource ("installColormap", "Boolean"); + fade_p = get_boolean_resource ("fade", "Boolean"); + unfade_p = get_boolean_resource ("unfade", "Boolean"); + fade_seconds = get_seconds_resource ("fadeSeconds", "Time"); + fade_ticks = get_integer_resource ("fadeTicks", "Integer"); + shell = get_string_resource ("bourneShell", "BourneShell"); + initial_delay = get_seconds_resource ("initialDelay", "Time"); + pointer_timeout = 1000 * get_seconds_resource ("pointerPollTime", "Time"); + notice_events_timeout = 1000 * get_seconds_resource ("windowCreationTimeout", + "Time"); +#ifndef NO_LOCKING + passwd_timeout = 1000 * get_seconds_resource ("passwdTimeout", "Time"); + if (passwd_timeout == 0) passwd_timeout = 30000; +#endif + if (timeout < 10000) timeout = 10000; + if (cycle != 0 && cycle < 2000) cycle = 2000; + if (pointer_timeout == 0) pointer_timeout = 5000; + if (notice_events_timeout == 0) notice_events_timeout = 10000; + if (fade_seconds == 0 || fade_ticks == 0) fade_p = False; + if (! fade_p) unfade_p = False; + + visual_depth = get_visual_depth (dpy, visual); + + if (visual_depth <= 1 || CellsOfScreen (screen) <= 2) + install_cmap_p = False; + +#ifdef NO_LOCKING + locking_disabled_p = True; + nolock_reason = "not compiled with locking support"; + if (lock_p) + { + lock_p = False; + fprintf (stderr, "%s: %snot compiled with support for locking.\n", + progname, (verbose_p ? "## " : "")); + } +#else /* ! NO_LOCKING */ + if (lock_p && locking_disabled_p) + { + fprintf (stderr, "%s: %slocking is disabled (%s).\n", progname, + (verbose_p ? "## " : ""), nolock_reason); + lock_p = False; + } +#endif /* ! NO_LOCKING */ + + /* don't set use_xidle_extension unless it is explicitly specified */ + if (get_string_resource ("xidleExtension", "Boolean")) + use_xidle_extension = get_boolean_resource ("xidleExtension", "Boolean"); + else +#ifdef HAVE_XIDLE_EXTENSION /* pick a default */ + use_xidle_extension = True; +#else /* !HAVE_XIDLE_EXTENSION */ + use_xidle_extension = False; +#endif /* !HAVE_XIDLE_EXTENSION */ + + /* don't set use_saver_extension unless it is explicitly specified */ + if (get_string_resource ("saverExtension", "Boolean")) + use_saver_extension = get_boolean_resource ("saverExtension", "Boolean"); + else +#ifdef HAVE_SAVER_EXTENSION /* pick a default */ + use_saver_extension = True; +#else /* !HAVE_SAVER_EXTENSION */ + use_saver_extension = False; +#endif /* !HAVE_SAVER_EXTENSION */ + + + get_screenhacks (); +} + +char * +timestring P((void)) +{ + long now = time ((time_t *) 0); + char *str = (char *) ctime (&now); + char *nl = (char *) strchr (str, '\n'); + if (nl) *nl = 0; /* take off that dang newline */ + return str; +} + +#ifdef NO_SETUID +# define hack_uid() +# define hack_uid_warn() +#else /* !NO_SETUID */ +extern void hack_uid P((void)); +extern void hack_uid_warn P((void)); +#endif /* NO_SETUID */ + + +#ifndef NO_LOCKING +extern Bool unlock_p P((Widget)); +extern Bool lock_init P((void)); +#endif + +static void initialize P((int argc, char **argv)); +static void main_loop P((void)); + +#ifndef VMS +void +#else +int +#endif +main (argc, argv) + int argc; + char **argv; +{ + initialize (argc, argv); + main_loop (); +} + + +static int +saver_ehandler (dpy, error) + Display *dpy; + XErrorEvent *error; +{ + fprintf (real_stderr, "\nX error in %s:\n", progname); + if (XmuPrintDefaultErrorMessage (dpy, error, real_stderr)) + exit (-1); + else + fprintf (real_stderr, " (nonfatal.)\n"); + return 0; +} + +static void +#if __STDC__ +initialize_connection (int argc, char **argv) +#else +initialize_connection (argc, argv) + int argc; + char **argv; +#endif +{ + toplevel_shell = XtAppInitialize (&app, progclass, + options, XtNumber (options), + &argc, argv, defaults, 0, 0); + + dpy = XtDisplay (toplevel_shell); + screen = XtScreen (toplevel_shell); + db = XtDatabase (dpy); + XtGetApplicationNameAndClass (dpy, &progname, &progclass); + + if (argc == 2 && !strcmp (argv[1], "-help")) + do_help (); + else if (argc > 1) + { + fprintf (stderr, "%s: unknown option %s\n", progname, argv [1]); + exit (1); + } + get_resources (); + hack_uid_warn (); + hack_environment (); + XA_VROOT = XInternAtom (dpy, "__SWM_VROOT", False); + XA_SCREENSAVER = XInternAtom (dpy, "SCREENSAVER", False); + XA_SCREENSAVER_VERSION = XInternAtom (dpy, "_SCREENSAVER_VERSION", False); + XA_SCREENSAVER_ID = XInternAtom (dpy, "_SCREENSAVER_ID", False); + XA_XSETROOT_ID = XInternAtom (dpy, "_XSETROOT_ID", False); + XA_ACTIVATE = XInternAtom (dpy, "ACTIVATE", False); + XA_DEACTIVATE = XInternAtom (dpy, "DEACTIVATE", False); + XA_RESTART = XInternAtom (dpy, "RESTART", False); + XA_CYCLE = XInternAtom (dpy, "CYCLE", False); + XA_NEXT = XInternAtom (dpy, "NEXT", False); + XA_PREV = XInternAtom (dpy, "PREV", False); + XA_EXIT = XInternAtom (dpy, "EXIT", False); + XA_DEMO = XInternAtom (dpy, "DEMO", False); + XA_LOCK = XInternAtom (dpy, "LOCK", False); +} + +#ifdef HAVE_SAVER_EXTENSION + +static int +ignore_all_errors_ehandler (dpy, error) + Display *dpy; + XErrorEvent *error; +{ + return 0; +} + +static void +init_saver_extension () +{ + XID kill_id; + Atom kill_type; + Window root = RootWindowOfScreen (screen); + XScreenSaverInfo *info; + Pixmap blank_pix = XCreatePixmap (dpy, root, 1, 1, 1); + + /* Kill off the old MIT-SCREEN-SAVER client if there is one. + This tends to generate X errors, though (possibly due to a bug + in the server extension itself?) so just ignore errors here. */ + if (XScreenSaverGetRegistered (dpy, XScreenNumberOfScreen (screen), + &kill_id, &kill_type) + && kill_id != blank_pix) + { + int (*old_handler) (); + old_handler = XSetErrorHandler (ignore_all_errors_ehandler); + XKillClient (dpy, kill_id); + XSync (dpy, False); + XSetErrorHandler (old_handler); + } + + XScreenSaverSelectInput (dpy, root, ScreenSaverNotifyMask); + + XScreenSaverRegister (dpy, XScreenNumberOfScreen (screen), + (XID) blank_pix, XA_PIXMAP); + info = XScreenSaverAllocInfo (); + +#if 0 + /* #### I think this is noticing that the saver is on, and replacing it + without turning it off first. */ + saver = info->window; + if (info->state == ScreenSaverOn) + { + if (info->kind != ScreenSaverExternal) + { + XResetScreenSaver (display); + XActivateScreenSaver (display); + } + StartSaver (); + } +#endif +} +#endif /* HAVE_SAVER_EXTENSION */ + + +extern void init_sigchld P((void)); + +static void +initialize (argc, argv) + int argc; + char **argv; +{ + Bool initial_demo_mode_p = False; + screensaver_version = (char *) malloc (5); + memcpy (screensaver_version, screensaver_id + 17, 4); + screensaver_version [4] = 0; + progname = argv[0]; /* reset later; this is for the benefit of lock_init() */ + +#ifdef NO_LOCKING + locking_disabled_p = True; + nolock_reason = "not compiled with locking support"; +#else + locking_disabled_p = False; + +#ifdef SCO + set_auth_parameters(argc, argv); +#endif + + if (! lock_init ()) /* before hack_uid() for proper permissions */ + { + locking_disabled_p = True; + nolock_reason = "error getting password"; + } +#endif + + hack_uid (); + progclass = "XScreenSaver"; + + /* remove -demo switch before saving argv */ + { + int i; + for (i = 1; i < argc; i++) + while (!strcmp ("-demo", argv [i])) + { + int j; + initial_demo_mode_p = True; + for (j = i; j < argc; j++) + argv [j] = argv [j+1]; + argv [j] = 0; + argc--; + if (argc <= i) break; + } + } + save_argv (argc, argv); + initialize_connection (argc, argv); + ensure_no_screensaver_running (); + + if (verbose_p) + printf ("\ +%s %s, copyright (c) 1991-1995 by Jamie Zawinski .\n\ + pid = %d.\n", progname, screensaver_version, getpid ()); + ensure_no_screensaver_running (); + + demo_mode_p = initial_demo_mode_p; + screensaver_window = 0; + cursor = 0; + initialize_screensaver_window (); + srandom ((int) time ((time_t *) 0)); + cycle_id = 0; + lock_id = 0; + locked_p = False; + + if (use_saver_extension) + { +#ifdef HAVE_SAVER_EXTENSION + if (! XScreenSaverQueryExtension (dpy, + &saver_ext_event_number, + &saver_ext_error_number)) + { + fprintf (stderr, + "%s: %sdisplay %s does not support the MIT-SCREEN-SAVER extension.\n", + progname, (verbose_p ? "## " : ""), DisplayString (dpy)); + use_saver_extension = False; + } + else if (use_xidle_extension) + { + fprintf (stderr, + "%s: %sMIT-SCREEN-SAVER extension used instead of XIDLE extension.\n", + progname, (verbose_p ? "## " : "")); + use_xidle_extension = False; + } +#else /* !HAVE_SAVER_EXTENSION */ + fprintf (stderr, + "%s: %snot compiled with support for the MIT-SCREEN-SAVER extension.\n", + progname, (verbose_p ? "## " : "")); + use_saver_extension = False; +#endif /* !HAVE_SAVER_EXTENSION */ + } + + if (use_xidle_extension) + { +#ifdef HAVE_XIDLE_EXTENSION + int first_event, first_error; + if (! XidleQueryExtension (dpy, &first_event, &first_error)) + { + fprintf (stderr, + "%s: %sdisplay %s does not support the XIdle extension.\n", + progname, (verbose_p ? "## " : ""), DisplayString (dpy)); + use_xidle_extension = False; + } +#else /* !HAVE_XIDLE_EXTENSION */ + fprintf (stderr, "%s: %snot compiled with support for XIdle.\n", + progname, (verbose_p ? "## " : "")); + use_xidle_extension = False; +#endif /* !HAVE_XIDLE_EXTENSION */ + } + + init_sigchld (); + + disable_builtin_screensaver (); + +#ifdef HAVE_SAVER_EXTENSION + if (use_saver_extension) + init_saver_extension (); +#endif /* HAVE_SAVER_EXTENSION */ + + if (verbose_p && use_saver_extension) + fprintf (stderr, "%s: using MIT-SCREEN-SAVER server extension.\n", + progname); + if (verbose_p && use_xidle_extension) + fprintf (stderr, "%s: using XIdle server extension.\n", + progname); + + initialize_stderr (); + XSetErrorHandler (saver_ehandler); + + if (initial_demo_mode_p) + /* If the user wants demo mode, don't wait around before doing it. */ + initial_delay = 0; + + if (!use_xidle_extension && !use_saver_extension) + { + if (initial_delay) + { + if (verbose_p) + { + printf ("%s: waiting for %d second%s...", progname, + (int) initial_delay, (initial_delay == 1 ? "" : "s")); + fflush (stdout); + } + sleep (initial_delay); + if (verbose_p) + printf (" done.\n"); + } + if (verbose_p) + { + printf ("%s: selecting events on extant windows...", progname); + fflush (stdout); + } + notice_events_timer ((XtPointer) + RootWindowOfScreen (XtScreen (toplevel_shell)), + 0); + if (verbose_p) + printf (" done.\n"); + } +} + + +extern void suspend_screenhack P((Bool suspend_p)); + +static void +main_loop () +{ +#ifdef VMS +#ifndef __DECC /* problems with VAX C */ + void (*cycle_timer_ptr)() = cycle_timer; + void (*activate_lock_timer_ptr)() = activate_lock_timer; +#endif +#endif + while (1) + { + if (! demo_mode_p) + sleep_until_idle (True); + + if (demo_mode_p) + demo_mode (); + else + { + if (verbose_p) + printf ("%s: user is idle; waking up at %s.\n", progname, + timestring()); + blank_screen (); + spawn_screenhack (True); + if (cycle) +#ifdef VMS +#ifndef __DECC + cycle_id = XtAppAddTimeOut (app, cycle, cycle_timer_ptr, 0); +#endif +#else + cycle_id = XtAppAddTimeOut (app, cycle, + (XtTimerCallbackProc)cycle_timer, 0); +#endif +#ifndef NO_LOCKING + if (lock_p && lock_timeout == 0) + locked_p = True; + if (lock_p && !locked_p) + /* locked_p might be true already because of ClientMessage */ +#ifdef VMS +#ifndef __DECC + lock_id = XtAppAddTimeOut (app,lock_timeout, + activate_lock_timer_ptr,0); +#endif +#else + lock_id = XtAppAddTimeOut (app,lock_timeout, + (XtTimerCallbackProc) + activate_lock_timer,0); +#endif /* VMS */ +#endif + + PASSWD_INVALID: + + sleep_until_idle (False); /* until not idle */ + +#ifndef NO_LOCKING + if (locked_p) + { + Bool val; + if (locking_disabled_p) abort (); + dbox_up_p = True; + + /* We used to ungrab the keyboard here, before calling unlock_p() + to pop up the dialog box. This left the keyboard ungrabbed + for a small window, during an insecure state. Bennett Todd + was seeing the bahavior that, when the load was high, he could + actually get characters through to a shell under the saver + window (he accidentally typed his password there...) + + So the ungrab has been moved down into pop_passwd_dialog() + just after the server is grabbed, closing this window + entirely. + */ + /* ungrab_keyboard_and_mouse (); */ + + suspend_screenhack (True); + XUndefineCursor (dpy, screensaver_window); + if (verbose_p) + printf ("%s: prompting for password.\n", progname); + val = unlock_p (toplevel_shell); + if (verbose_p && val == False) + printf ("%s: password incorrect!\n", progname); + dbox_up_p = False; + XDefineCursor (dpy, screensaver_window, cursor); + suspend_screenhack (False); + + /* I think this grab is now redundant, but it shouldn't hurt. */ + grab_keyboard_and_mouse (); + + if (! val) + goto PASSWD_INVALID; + locked_p = False; + } +#endif + unblank_screen (); + kill_screenhack (); + if (cycle_id) + { + XtRemoveTimeOut (cycle_id); + cycle_id = 0; + } +#ifndef NO_LOCKING + if (lock_id) + { + XtRemoveTimeOut (lock_id); + lock_id = 0; + } +#endif + if (verbose_p) + printf ("%s: user is active; going to sleep at %s.\n", progname, + timestring ()); + } + } +} + + + +Bool +handle_clientmessage (event, until_idle_p) + XEvent *event; + Bool until_idle_p; +{ + Atom type = 0; + if (event->xclient.message_type != XA_SCREENSAVER) + { + char *str; + str = XGetAtomName (dpy, event->xclient.message_type); +#ifdef VMS + if (str) + { + if (str[0] == 'V' && + str[1] == 'U' && + str[2] == 'E' && + str[3] == '_') + { + if (verbose_p) + printf ("%s: VUE_ ClientMessage ignored: %s .\n", progname, str); + return False; + } + } +#endif /* Patche made by sandre@clamart.wireline.slb.com - Oct 95 */ + + fprintf (stderr, "%s: %sunrecognised ClientMessage type %s received\n", + progname, (verbose_p ? "## " : ""), + (str ? str : "(null)")); + if (str) XFree (str); + return False; + } + if (event->xclient.format != 32) + { + fprintf (stderr, "%s: %sClientMessage of format %d received, not 32\n", + progname, (verbose_p ? "## " : ""), event->xclient.format); + return False; + } + type = event->xclient.data.l[0]; + if (type == XA_ACTIVATE) + { + if (until_idle_p) + { + if (verbose_p) + printf ("%s: ACTIVATE ClientMessage received.\n", progname); + if (use_saver_extension) + { + XForceScreenSaver (dpy, ScreenSaverActive); + return False; + } + else + { + return True; + } + } + fprintf (stderr, + "%s: %sClientMessage ACTIVATE received while already active.\n", + progname, (verbose_p ? "## " : "")); + } + else if (type == XA_DEACTIVATE) + { + if (! until_idle_p) + { + if (verbose_p) + printf ("%s: DEACTIVATE ClientMessage received.\n", progname); + if (use_saver_extension) + { + XForceScreenSaver (dpy, ScreenSaverReset); + return False; + } + else + { + return True; + } + } + fprintf (stderr, + "%s: %sClientMessage DEACTIVATE received while inactive.\n", + progname, (verbose_p ? "## " : "")); + } + else if (type == XA_CYCLE) + { + if (! until_idle_p) + { + if (verbose_p) + printf ("%s: CYCLE ClientMessage received.\n", progname); + if (cycle_id) + XtRemoveTimeOut (cycle_id); + cycle_id = 0; + cycle_timer (0, 0); + return False; + } + fprintf (stderr, + "%s: %sClientMessage CYCLE received while inactive.\n", + progname, (verbose_p ? "## " : "")); + } + else if (type == XA_NEXT || type == XA_PREV) + { + if (verbose_p) + printf ("%s: %s ClientMessage received.\n", progname, + (type == XA_NEXT ? "NEXT" : "PREV")); + next_mode_p = 1 + (type == XA_PREV); + + if (! until_idle_p) + { + if (cycle_id) + XtRemoveTimeOut (cycle_id); + cycle_id = 0; + cycle_timer (0, 0); + } + else + return True; + } + else if (type == XA_EXIT) + { + /* Ignore EXIT message if the screen is locked. */ + if (until_idle_p || !locked_p) + { + if (verbose_p) + printf ("%s: EXIT ClientMessage received.\n", progname); + if (! until_idle_p) + { + unblank_screen (); + kill_screenhack (); + XSync (dpy, False); + } + exit (0); + } + else + fprintf (stderr, "%s: %sEXIT ClientMessage received while locked.\n", + progname, (verbose_p ? "## " : "")); + } + else if (type == XA_RESTART) + { + /* The RESTART message works whether the screensaver is active or not, + unless the screen is locked, in which case it doesn't work. + */ + if (until_idle_p || !locked_p) + { + if (verbose_p) + printf ("%s: RESTART ClientMessage received.\n", progname); + if (! until_idle_p) + { + unblank_screen (); + kill_screenhack (); + XSync (dpy, False); + } + restart_process (); + } + else + fprintf(stderr, "%s: %sRESTART ClientMessage received while locked.\n", + progname, (verbose_p ? "## " : "")); + } + else if (type == XA_DEMO) + { +#ifdef NO_DEMO_MODE + fprintf (stderr, + "%s: %snot compiled with support for DEMO mode\n", + progname, (verbose_p ? "## " : "")); +#else + if (until_idle_p) + { + if (verbose_p) + printf ("%s: DEMO ClientMessage received.\n", progname); + demo_mode_p = True; + return True; + } + fprintf (stderr, + "%s: %sDEMO ClientMessage received while active.\n", + progname, (verbose_p ? "## " : "")); +#endif + } + else if (type == XA_LOCK) + { +#ifdef NO_LOCKING + fprintf (stderr, "%s: %snot compiled with support for LOCK mode\n", + progname, (verbose_p ? "## " : "")); +#else + if (locking_disabled_p) + fprintf (stderr, + "%s: %sLOCK ClientMessage received, but locking is disabled.\n", + progname, (verbose_p ? "## " : "")); + else if (locked_p) + fprintf (stderr, + "%s: %sLOCK ClientMessage received while already locked.\n", + progname, (verbose_p ? "## " : "")); + else + { + locked_p = True; + if (verbose_p) + printf ("%s: LOCK ClientMessage received;%s locking.\n", + progname, until_idle_p ? " activating and" : ""); + + if (lock_id) /* we're doing it now, so lose the timeout */ + { + XtRemoveTimeOut (lock_id); + lock_id = 0; + } + + if (until_idle_p) + { + if (use_saver_extension) + { + XForceScreenSaver (dpy, ScreenSaverActive); + return False; + } + else + { + return True; + } + } + } +#endif + } + else + { + char *str; + str = (type ? XGetAtomName(dpy, type) : 0); + if (str) + fprintf (stderr, + "%s: %sunrecognised screensaver ClientMessage %s received\n", + progname, (verbose_p ? "## " : ""), str); + else + fprintf (stderr, + "%s: %sunrecognised screensaver ClientMessage 0x%x received\n", + progname, (verbose_p ? "## " : ""), + (unsigned int) event->xclient.data.l[0]); + if (str) XFree (str); + } + return False; +} diff --git a/driver/xscreensaver.c_ori b/driver/xscreensaver.c_ori new file mode 100755 index 00000000..76f68c2e --- /dev/null +++ b/driver/xscreensaver.c_ori @@ -0,0 +1,1111 @@ +/* xscreensaver, Copyright (c) 1991-1995 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. + */ + +#include "version.h" + +/* ======================================================================== + * First we wait until the keyboard and mouse become idle for the specified + * amount of time. We do this in one of three different ways: periodically + * checking with the XIdle server extension; selecting key and mouse events + * on (nearly) all windows; or by waiting for the MIT-SCREEN-SAVER extension + * to send us a "you are idle" event. + * + * Then, we map a full screen black window (or, in the case of the + * MIT-SCREEN-SAVER extension, use the one it gave us.) + * + * We place a __SWM_VROOT property on this window, so that newly-started + * clients will think that this window is a "virtual root" window. + * + * If there is an existing "virtual root" window (one that already had + * an __SWM_VROOT property) then we remove that property from that window. + * Otherwise, clients would see that window (the real virtual root) instead + * of ours (the impostor.) + * + * Then we pick a random program to run, and start it. Two assumptions + * are made about this program: that it has been specified with whatever + * command-line options are necessary to make it run on the root window; + * and that it has been compiled with vroot.h, so that it is able to find + * the root window when a virtual-root window manager (or this program) is + * running. + * + * Then, we wait for keyboard or mouse events to be generated on the window. + * When they are, we kill the inferior process, unmap the window, and restore + * the __SWM_VROOT property to the real virtual root window if there was one. + * + * While we are waiting, we also set up timers so that, after a certain + * amount of time has passed, we can start a different screenhack. We do + * this by killing the running child process with SIGTERM, and then starting + * a new one in the same way. + * + * If there was a real virtual root, meaning that we removed the __SWM_VROOT + * property from it, meaning we must (absolutely must) restore it before we + * exit, then we set up signal handlers for most signals (SIGINT, SIGTERM, + * etc.) that do this. Most Xlib and Xt routines are not reentrant, so it + * is not generally safe to call them from signal handlers; however, this + * program spends most of its time waiting, so the window of opportunity + * when code could be called reentrantly is fairly small; and also, the worst + * that could happen is that the call would fail. If we've gotten one of + * these signals, then we're on our way out anyway. If we didn't restore the + * __SWM_VROOT property, that would be very bad, so it's worth a shot. Note + * that this means that, if you're using a virtual-root window manager, you + * can really fuck up the world by killing this process with "kill -9". + * + * This program accepts ClientMessages of type SCREENSAVER; these messages + * may contain the atom ACTIVATE or DEACTIVATE, meaning to turn the + * screensaver on or off now, regardless of the idleness of the user, + * and a few other things. The included "xscreensaver_command" program + * sends these messsages. + * + * If we don't have the XIdle or MIT-SCREENSAVER extensions, then we do the + * XAutoLock trick: notice every window that gets created, and wait 30 + * seconds or so until its creating process has settled down, and then + * select KeyPress events on those windows which already select for + * KeyPress events. It's important that we not select KeyPress on windows + * which don't select them, because that would interfere with event + * propagation. This will break if any program changes its event mask to + * contain KeyRelease or PointerMotion more than 30 seconds after creating + * the window, but that's probably pretty rare. + * + * The reason that we can't select KeyPresses on windows that don't have + * them already is that, when dispatching a KeyPress event, X finds the + * lowest (leafmost) window in the hierarchy on which *any* client selects + * for KeyPress, and sends the event to that window. This means that if a + * client had a window with subwindows, and expected to receive KeyPress + * events on the parent window instead of the subwindows, then that client + * would malfunction if some other client selected KeyPress events on the + * subwindows. It is an incredible misdesign that one client can make + * another client malfunction in this way. + * + * To detect mouse motion, we periodically wake up and poll the mouse + * position and button/modifier state, and notice when something has + * changed. We make this check every five seconds by default, and since the + * screensaver timeout has a granularity of one minute, this makes the + * chance of a false positive very small. We could detect mouse motion in + * the same way as keyboard activity, but that would suffer from the same + * "client changing event mask" problem that the KeyPress events hack does. + * I think polling is more reliable. + * + * None of this crap happens if we're using one of the extensions, so install + * one of them if the description above sounds just too flaky to live. It + * is, but those are your choices. + * + * A third idle-detection option could be implement (but is not): when + * running on the console display ($DISPLAY is `localhost`:0) and we're on a + * machine where /dev/tty and /dev/mouse have reasonable last-modification + * times, we could just stat those. But the incremental benefit of + * implementing this is really small, so forget I said anything. + * + * Debugging hints: + * - Have a second terminal handy. + * - Be careful where you set your breakpoints, you don't want this to + * stop under the debugger with the keyboard grabbed or the blackout + * window exposed. + * - you probably can't set breakpoints in functions that are called on + * the other side of a call to fork() -- if your clients are dying + * with signal 5, Trace/BPT Trap, you're losing in this way. + * - If you aren't using XIdle, don't leave this stopped under the + * debugger for very long, or the X input buffer will get huge because + * of the keypress events it's selecting for. This can make your X + * server wedge with "no more input buffers." + * + * ======================================================================== */ + +#if __STDC__ +#include +#include +#endif + +#include +#include +#include +#include +#include +#include + +#ifdef HAVE_XIDLE_EXTENSION +#include +#endif /* HAVE_XIDLE_EXTENSION */ + +#ifdef HAVE_SAVER_EXTENSION +#include +#endif /* HAVE_SAVER_EXTENSION */ + +#include "yarandom.h" +#include "xscreensaver.h" + +extern char *get_string_resource P((char *, char *)); +extern Bool get_boolean_resource P((char *, char *)); +extern int get_integer_resource P((char *, char *)); +extern unsigned int get_minutes_resource P((char *, char *)); +extern unsigned int get_seconds_resource P((char *, char *)); + +extern Visual *get_visual_resource P((Display *, char *, char *)); +extern int get_visual_depth P((Display *, Visual *)); + +extern void notice_events_timer P((XtPointer closure, XtIntervalId *timer)); +extern void cycle_timer P((void *junk1, XtPointer junk2)); +extern void activate_lock_timer P((void *junk1, XtPointer junk2)); +extern void sleep_until_idle P((Bool until_idle_p)); + +extern void ensure_no_screensaver_running P((void)); +extern void initialize_screensaver_window P((void)); +extern void disable_builtin_screensaver P((void)); + +extern void hack_environment P((void)); +extern void grab_keyboard_and_mouse P((void)); +extern void ungrab_keyboard_and_mouse P((void)); + +extern void save_argv P((int argc, char **argv)); + +extern void initialize_stderr P((void)); + +char *screensaver_version; +char *progname; +char *progclass; +XrmDatabase db; + +XtAppContext app; + +Display *dpy; +Screen *screen; +Visual *visual; +int visual_depth; + +Widget toplevel_shell; + +Time lock_timeout; + +extern Time timeout; +extern Time cycle; +#ifndef NO_LOCKING +extern Time passwd_timeout; +#endif +extern Time pointer_timeout; +extern Time notice_events_timeout; +extern XtIntervalId lock_id, cycle_id; + +Bool use_xidle_extension; +Bool use_saver_extension; +Bool verbose_p; +Bool lock_p, locked_p; + +extern char **screenhacks; +extern int screenhacks_count; +extern char *shell; +extern int nice_inferior; +extern Window screensaver_window; +extern Cursor cursor; +extern Colormap cmap, cmap2; +extern Bool fade_p, unfade_p; +extern int fade_seconds, fade_ticks; +extern Bool install_cmap_p; +extern Bool locking_disabled_p; +extern char *nolock_reason; +extern Bool demo_mode_p; +extern Bool dbox_up_p; +extern int next_mode_p; + +#ifdef HAVE_SAVER_EXTENSION +int saver_ext_event_number = 0; +int saver_ext_error_number = 0; +#endif /* HAVE_SAVER_EXTENSION */ + +static time_t initial_delay; + +extern Atom XA_VROOT, XA_XSETROOT_ID; +extern Atom XA_SCREENSAVER_VERSION, XA_SCREENSAVER_ID; + +static Atom XA_SCREENSAVER; +static Atom XA_ACTIVATE, XA_DEACTIVATE, XA_CYCLE, XA_NEXT, XA_PREV; +static Atom XA_EXIT, XA_RESTART, XA_DEMO, XA_LOCK; + +#ifdef NO_MOTIF /* kludge */ +Bool demo_mode_p = 0; +Bool dbox_up_p = 0; +#endif + + +#ifdef NO_DEMO_MODE +# define demo_mode() abort() +#else +extern void demo_mode P((void)); +#endif + +static XrmOptionDescRec options [] = { + { "-timeout", ".timeout", XrmoptionSepArg, 0 }, + { "-cycle", ".cycle", XrmoptionSepArg, 0 }, + { "-idelay", ".initialDelay", XrmoptionSepArg, 0 }, + { "-nice", ".nice", XrmoptionSepArg, 0 }, + { "-visual", ".visualID", XrmoptionSepArg, 0 }, + { "-lock-timeout", ".lockTimeout", XrmoptionSepArg, 0 }, + { "-install", ".installColormap", XrmoptionNoArg, "on" }, + { "-no-install", ".installColormap", XrmoptionNoArg, "off" }, + { "-verbose", ".verbose", XrmoptionNoArg, "on" }, + { "-silent", ".verbose", XrmoptionNoArg, "off" }, + { "-xidle-extension", ".xidleExtension", XrmoptionNoArg, "on" }, + { "-no-xidle-extension", ".xidleExtension", XrmoptionNoArg, "off" }, + { "-ss-extension", ".saverExtension", XrmoptionNoArg, "on" }, + { "-no-ss-extension", ".saverExtension", XrmoptionNoArg, "off" }, + { "-lock", ".lock", XrmoptionNoArg, "on" }, + { "-no-lock", ".lock", XrmoptionNoArg, "off" } +}; + +static char *defaults[] = { +#include "XScreenSaver.ad.h" + 0 +}; + +static void +do_help P((void)) +{ + printf ("\ +xscreensaver %s, copyright (c) 1991-1995 by Jamie Zawinski .\n\ +The standard Xt command-line options are accepted; other options include:\n\ +\n\ + -timeout When the screensaver should activate.\n\ + -cycle How long to let each hack run.\n\ + -idelay How long to sleep before startup.\n\ + -visual Which X visual to run on.\n\ + -demo Enter interactive demo mode on startup.\n\ + -install Install a private colormap.\n\ + -no-install Don't.\n\ + -verbose Be loud.\n\ + -silent Don't.\n\ + -xidle-extension Use the R5 XIdle server extension.\n\ + -no-xidle-extension Don't.\n\ + -ss-extension Use the R6 MIT-SCREEN-SAVER server extension.\n\ + -no-ss-extension Don't.\n\ + -lock Require a password before deactivating.\n\ + -no-lock Don't.\n\ + -lock-timeout Grace period before locking; default 0.\n\ + -help This message.\n\ +\n\ +Use the `xscreensaver-command' program to control a running screensaver.\n\ +\n\ +The *programs, *colorPrograms, and *monoPrograms resources control which\n\ +graphics demos will be launched by the screensaver. See the man page for\n\ +more details.\n\n", + screensaver_version); + +#ifdef NO_LOCKING + printf ("Support for locking was not enabled at compile-time.\n"); +#endif +#ifdef NO_DEMO_MODE + printf ("Support for demo mode was not enabled at compile-time.\n"); +#endif +#if !defined(HAVE_XIDLE_EXTENSION) && !defined(HAVE_SAVER_EXTENSION) + printf ("Support for the XIDLE and MIT-SCREEN-SAVER server extensions\ + was not\nenabled at compile-time.\n"); +#endif /* !HAVE_XIDLE_EXTENSION && !HAVE_SAVER_EXTENSION */ + + fflush (stdout); + exit (1); +} + + +static void +get_screenhacks P((void)) +{ + char *data[3]; + int i, hacks_size = 10; + + data[0] = get_string_resource ("programs", "Programs"); + data[1] = ((CellsOfScreen (screen) <= 2) + ? get_string_resource ("monoPrograms", "MonoPrograms") + : get_string_resource ("colorPrograms", "ColorPrograms")); + data[2] = 0; + if (! data[0]) data[0] = data[1], data[1] = 0; + + screenhacks = (char **) malloc (sizeof (char *) * hacks_size); + screenhacks_count = 0; + + for (i = 0; data[i]; i++) + { + int j = 0; + char *d = data [i]; + int size = strlen (d); + while (j < size) + { + int end, start = j; + if (d[j] == ' ' || d[j] == '\t' || d[j] == '\n' || d[j] == 0) + { + j++; + continue; + } + if (hacks_size <= screenhacks_count) + screenhacks = (char **) realloc (screenhacks, + (hacks_size = hacks_size * 2) * + sizeof (char *)); + screenhacks [screenhacks_count++] = d + j; + while (d[j] != 0 && d[j] != '\n') + j++; + end = j; + while (j > start && (d[j-1] == ' ' || d[j-1] == '\t')) + j--; + d[j] = 0; + j = end + 1; + } + } + + /* shrink all whitespace to one space, for the benefit of the "demo" + mode display. We only do this when we can easily tell that the + whitespace is not significant (no shell metachars). + */ + for (i = 0; i < screenhacks_count; i++) + { + char *s = screenhacks [i]; + char *s2; + int L = strlen (s); + int j, k; + for (j = 0; j < L; j++) + { + switch (s[j]) + { + case '\'': case '"': case '`': case '\\': + goto DONE; + case '\t': + s[j] = ' '; + case ' ': + k = 0; + for (s2 = s+j+1; *s2 == ' ' || *s2 == '\t'; s2++) + k++; + if (k > 0) + for (s2 = s + j + 1; *s2; s2++) + s2 [0] = s2 [k]; + break; + } + } + DONE: + ; + } + + if (screenhacks_count) + { + /* Shrink down the screenhacks array to be only as big as it needs to. + This doesn't really matter at all. */ + screenhacks = (char **) + realloc (screenhacks, ((screenhacks_count + 1) * sizeof(char *))); + screenhacks [screenhacks_count] = 0; + } + else + { + free (screenhacks); + screenhacks = 0; + } +} + + +static void +get_resources P((void)) +{ + /* Note: we can't use the resource ".visual" because Xt is SO FUCKED. */ + visual = get_visual_resource (dpy, "visualID", "VisualID"); + timeout = 1000 * get_minutes_resource ("timeout", "Time"); + cycle = 1000 * get_minutes_resource ("cycle", "Time"); + lock_timeout = 1000 * get_minutes_resource ("lockTimeout", "Time"); + nice_inferior = get_integer_resource ("nice", "Nice"); + verbose_p = get_boolean_resource ("verbose", "Boolean"); + lock_p = get_boolean_resource ("lock", "Boolean"); + install_cmap_p = get_boolean_resource ("installColormap", "Boolean"); + fade_p = get_boolean_resource ("fade", "Boolean"); + unfade_p = get_boolean_resource ("unfade", "Boolean"); + fade_seconds = get_seconds_resource ("fadeSeconds", "Time"); + fade_ticks = get_integer_resource ("fadeTicks", "Integer"); + shell = get_string_resource ("bourneShell", "BourneShell"); + initial_delay = get_seconds_resource ("initialDelay", "Time"); + pointer_timeout = 1000 * get_seconds_resource ("pointerPollTime", "Time"); + notice_events_timeout = 1000 * get_seconds_resource ("windowCreationTimeout", + "Time"); +#ifndef NO_LOCKING + passwd_timeout = 1000 * get_seconds_resource ("passwdTimeout", "Time"); + if (passwd_timeout == 0) passwd_timeout = 30000; +#endif + if (timeout < 10000) timeout = 10000; + if (cycle != 0 && cycle < 2000) cycle = 2000; + if (pointer_timeout == 0) pointer_timeout = 5000; + if (notice_events_timeout == 0) notice_events_timeout = 10000; + if (fade_seconds == 0 || fade_ticks == 0) fade_p = False; + if (! fade_p) unfade_p = False; + + visual_depth = get_visual_depth (dpy, visual); + + if (visual_depth <= 1 || CellsOfScreen (screen) <= 2) + install_cmap_p = False; + +#ifdef NO_LOCKING + locking_disabled_p = True; + nolock_reason = "not compiled with locking support"; + if (lock_p) + { + lock_p = False; + fprintf (stderr, "%s: %snot compiled with support for locking.\n", + progname, (verbose_p ? "## " : "")); + } +#else /* ! NO_LOCKING */ + if (lock_p && locking_disabled_p) + { + fprintf (stderr, "%s: %slocking is disabled (%s).\n", progname, + (verbose_p ? "## " : ""), nolock_reason); + lock_p = False; + } +#endif /* ! NO_LOCKING */ + + /* don't set use_xidle_extension unless it is explicitly specified */ + if (get_string_resource ("xidleExtension", "Boolean")) + use_xidle_extension = get_boolean_resource ("xidleExtension", "Boolean"); + else +#ifdef HAVE_XIDLE_EXTENSION /* pick a default */ + use_xidle_extension = True; +#else /* !HAVE_XIDLE_EXTENSION */ + use_xidle_extension = False; +#endif /* !HAVE_XIDLE_EXTENSION */ + + /* don't set use_saver_extension unless it is explicitly specified */ + if (get_string_resource ("saverExtension", "Boolean")) + use_saver_extension = get_boolean_resource ("saverExtension", "Boolean"); + else +#ifdef HAVE_SAVER_EXTENSION /* pick a default */ + use_saver_extension = True; +#else /* !HAVE_SAVER_EXTENSION */ + use_saver_extension = False; +#endif /* !HAVE_SAVER_EXTENSION */ + + + get_screenhacks (); +} + +char * +timestring P((void)) +{ + long now = time ((time_t *) 0); + char *str = (char *) ctime (&now); + char *nl = (char *) strchr (str, '\n'); + if (nl) *nl = 0; /* take off that dang newline */ + return str; +} + +#ifdef NO_SETUID +# define hack_uid() +# define hack_uid_warn() +#else /* !NO_SETUID */ +extern void hack_uid P((void)); +extern void hack_uid_warn P((void)); +#endif /* NO_SETUID */ + + +#ifndef NO_LOCKING +extern Bool unlock_p P((Widget)); +extern Bool lock_init P((void)); +#endif + +static void initialize P((int argc, char **argv)); +static void main_loop P((void)); + +void +main (argc, argv) + int argc; + char **argv; +{ + initialize (argc, argv); + main_loop (); +} + + +static int +saver_ehandler (dpy, error) + Display *dpy; + XErrorEvent *error; +{ + fprintf (real_stderr, "\nX error in %s:\n", progname); + if (XmuPrintDefaultErrorMessage (dpy, error, real_stderr)) + exit (-1); + else + fprintf (real_stderr, " (nonfatal.)\n"); + return 0; +} + +static void +#if __STDC__ +initialize_connection (int argc, char **argv) +#else +initialize_connection (argc, argv) + int argc; + char **argv; +#endif +{ + toplevel_shell = XtAppInitialize (&app, progclass, + options, XtNumber (options), + &argc, argv, defaults, 0, 0); + + dpy = XtDisplay (toplevel_shell); + screen = XtScreen (toplevel_shell); + db = XtDatabase (dpy); + XtGetApplicationNameAndClass (dpy, &progname, &progclass); + + if (argc == 2 && !strcmp (argv[1], "-help")) + do_help (); + else if (argc > 1) + { + fprintf (stderr, "%s: unknown option %s\n", progname, argv [1]); + exit (1); + } + get_resources (); + hack_uid_warn (); + hack_environment (); + XA_VROOT = XInternAtom (dpy, "__SWM_VROOT", False); + XA_SCREENSAVER = XInternAtom (dpy, "SCREENSAVER", False); + XA_SCREENSAVER_VERSION = XInternAtom (dpy, "_SCREENSAVER_VERSION", False); + XA_SCREENSAVER_ID = XInternAtom (dpy, "_SCREENSAVER_ID", False); + XA_XSETROOT_ID = XInternAtom (dpy, "_XSETROOT_ID", False); + XA_ACTIVATE = XInternAtom (dpy, "ACTIVATE", False); + XA_DEACTIVATE = XInternAtom (dpy, "DEACTIVATE", False); + XA_RESTART = XInternAtom (dpy, "RESTART", False); + XA_CYCLE = XInternAtom (dpy, "CYCLE", False); + XA_NEXT = XInternAtom (dpy, "NEXT", False); + XA_PREV = XInternAtom (dpy, "PREV", False); + XA_EXIT = XInternAtom (dpy, "EXIT", False); + XA_DEMO = XInternAtom (dpy, "DEMO", False); + XA_LOCK = XInternAtom (dpy, "LOCK", False); +} + +#ifdef HAVE_SAVER_EXTENSION + +static int +ignore_all_errors_ehandler (dpy, error) + Display *dpy; + XErrorEvent *error; +{ + return 0; +} + +static void +init_saver_extension () +{ + XID kill_id; + Atom kill_type; + Window root = RootWindowOfScreen (screen); + XScreenSaverInfo *info; + Pixmap blank_pix = XCreatePixmap (dpy, root, 1, 1, 1); + + /* Kill off the old MIT-SCREEN-SAVER client if there is one. + This tends to generate X errors, though (possibly due to a bug + in the server extension itself?) so just ignore errors here. */ + if (XScreenSaverGetRegistered (dpy, XScreenNumberOfScreen (screen), + &kill_id, &kill_type) + && kill_id != blank_pix) + { + int (*old_handler) (); + old_handler = XSetErrorHandler (ignore_all_errors_ehandler); + XKillClient (dpy, kill_id); + XSync (dpy, False); + XSetErrorHandler (old_handler); + } + + XScreenSaverSelectInput (dpy, root, ScreenSaverNotifyMask); + + XScreenSaverRegister (dpy, XScreenNumberOfScreen (screen), + (XID) blank_pix, XA_PIXMAP); + info = XScreenSaverAllocInfo (); + +#if 0 + /* #### I think this is noticing that the saver is on, and replacing it + without turning it off first. */ + saver = info->window; + if (info->state == ScreenSaverOn) + { + if (info->kind != ScreenSaverExternal) + { + XResetScreenSaver (display); + XActivateScreenSaver (display); + } + StartSaver (); + } +#endif +} +#endif /* HAVE_SAVER_EXTENSION */ + + +extern void init_sigchld P((void)); + +static void +initialize (argc, argv) + int argc; + char **argv; +{ + Bool initial_demo_mode_p = False; + screensaver_version = (char *) malloc (5); + memcpy (screensaver_version, screensaver_id + 17, 4); + screensaver_version [4] = 0; + progname = argv[0]; /* reset later; this is for the benefit of lock_init() */ + +#ifdef NO_LOCKING + locking_disabled_p = True; + nolock_reason = "not compiled with locking support"; +#else + locking_disabled_p = False; + +#ifdef SCO + set_auth_parameters(argc, argv); +#endif + + if (! lock_init ()) /* before hack_uid() for proper permissions */ + { + locking_disabled_p = True; + nolock_reason = "error getting password"; + } +#endif + + hack_uid (); + progclass = "XScreenSaver"; + + /* remove -demo switch before saving argv */ + { + int i; + for (i = 1; i < argc; i++) + while (!strcmp ("-demo", argv [i])) + { + int j; + initial_demo_mode_p = True; + for (j = i; j < argc; j++) + argv [j] = argv [j+1]; + argv [j] = 0; + argc--; + if (argc <= i) break; + } + } + save_argv (argc, argv); + initialize_connection (argc, argv); + ensure_no_screensaver_running (); + + if (verbose_p) + printf ("\ +%s %s, copyright (c) 1991-1995 by Jamie Zawinski .\n\ + pid = %d.\n", progname, screensaver_version, getpid ()); + ensure_no_screensaver_running (); + + demo_mode_p = initial_demo_mode_p; + screensaver_window = 0; + cursor = 0; + initialize_screensaver_window (); + srandom ((int) time ((time_t *) 0)); + cycle_id = 0; + lock_id = 0; + locked_p = False; + + if (use_saver_extension) + { +#ifdef HAVE_SAVER_EXTENSION + if (! XScreenSaverQueryExtension (dpy, + &saver_ext_event_number, + &saver_ext_error_number)) + { + fprintf (stderr, + "%s: %sdisplay %s does not support the MIT-SCREEN-SAVER extension.\n", + progname, (verbose_p ? "## " : ""), DisplayString (dpy)); + use_saver_extension = False; + } + else if (use_xidle_extension) + { + fprintf (stderr, + "%s: %sMIT-SCREEN-SAVER extension used instead of XIDLE extension.\n", + progname, (verbose_p ? "## " : "")); + use_xidle_extension = False; + } +#else /* !HAVE_SAVER_EXTENSION */ + fprintf (stderr, + "%s: %snot compiled with support for the MIT-SCREEN-SAVER extension.\n", + progname, (verbose_p ? "## " : "")); + use_saver_extension = False; +#endif /* !HAVE_SAVER_EXTENSION */ + } + + if (use_xidle_extension) + { +#ifdef HAVE_XIDLE_EXTENSION + int first_event, first_error; + if (! XidleQueryExtension (dpy, &first_event, &first_error)) + { + fprintf (stderr, + "%s: %sdisplay %s does not support the XIdle extension.\n", + progname, (verbose_p ? "## " : ""), DisplayString (dpy)); + use_xidle_extension = False; + } +#else /* !HAVE_XIDLE_EXTENSION */ + fprintf (stderr, "%s: %snot compiled with support for XIdle.\n", + progname, (verbose_p ? "## " : "")); + use_xidle_extension = False; +#endif /* !HAVE_XIDLE_EXTENSION */ + } + + init_sigchld (); + + disable_builtin_screensaver (); + +#ifdef HAVE_SAVER_EXTENSION + if (use_saver_extension) + init_saver_extension (); +#endif /* HAVE_SAVER_EXTENSION */ + + if (verbose_p && use_saver_extension) + fprintf (stderr, "%s: using MIT-SCREEN-SAVER server extension.\n", + progname); + if (verbose_p && use_xidle_extension) + fprintf (stderr, "%s: using XIdle server extension.\n", + progname); + + initialize_stderr (); + XSetErrorHandler (saver_ehandler); + + if (initial_demo_mode_p) + /* If the user wants demo mode, don't wait around before doing it. */ + initial_delay = 0; + + if (!use_xidle_extension && !use_saver_extension) + { + if (initial_delay) + { + if (verbose_p) + { + printf ("%s: waiting for %d second%s...", progname, + (int) initial_delay, (initial_delay == 1 ? "" : "s")); + fflush (stdout); + } + sleep (initial_delay); + if (verbose_p) + printf (" done.\n"); + } + if (verbose_p) + { + printf ("%s: selecting events on extant windows...", progname); + fflush (stdout); + } + notice_events_timer ((XtPointer) + RootWindowOfScreen (XtScreen (toplevel_shell)), + 0); + if (verbose_p) + printf (" done.\n"); + } +} + + +extern void suspend_screenhack P((Bool suspend_p)); + +static void +main_loop () +{ + while (1) + { + if (! demo_mode_p) + sleep_until_idle (True); + + if (demo_mode_p) + demo_mode (); + else + { + if (verbose_p) + printf ("%s: user is idle; waking up at %s.\n", progname, + timestring()); + blank_screen (); + spawn_screenhack (True); + if (cycle) + cycle_id = XtAppAddTimeOut (app, cycle, + (XtTimerCallbackProc)cycle_timer, 0); + +#ifndef NO_LOCKING + if (lock_p && lock_timeout == 0) + locked_p = True; + if (lock_p && !locked_p) + /* locked_p might be true already because of ClientMessage */ + lock_id = XtAppAddTimeOut (app,lock_timeout, + (XtTimerCallbackProc) + activate_lock_timer,0); +#endif + + PASSWD_INVALID: + + sleep_until_idle (False); /* until not idle */ + +#ifndef NO_LOCKING + if (locked_p) + { + Bool val; + if (locking_disabled_p) abort (); + dbox_up_p = True; + + /* We used to ungrab the keyboard here, before calling unlock_p() + to pop up the dialog box. This left the keyboard ungrabbed + for a small window, during an insecure state. Bennett Todd + was seeing the bahavior that, when the load was high, he could + actually get characters through to a shell under the saver + window (he accidentally typed his password there...) + + So the ungrab has been moved down into pop_passwd_dialog() + just after the server is grabbed, closing this window + entirely. + */ + /* ungrab_keyboard_and_mouse (); */ + + suspend_screenhack (True); + XUndefineCursor (dpy, screensaver_window); + if (verbose_p) + printf ("%s: prompting for password.\n", progname); + val = unlock_p (toplevel_shell); + if (verbose_p && val == False) + printf ("%s: password incorrect!\n", progname); + dbox_up_p = False; + XDefineCursor (dpy, screensaver_window, cursor); + suspend_screenhack (False); + + /* I think this grab is now redundant, but it shouldn't hurt. */ + grab_keyboard_and_mouse (); + + if (! val) + goto PASSWD_INVALID; + locked_p = False; + } +#endif + unblank_screen (); + kill_screenhack (); + if (cycle_id) + { + XtRemoveTimeOut (cycle_id); + cycle_id = 0; + } +#ifndef NO_LOCKING + if (lock_id) + { + XtRemoveTimeOut (lock_id); + lock_id = 0; + } +#endif + if (verbose_p) + printf ("%s: user is active; going to sleep at %s.\n", progname, + timestring ()); + } + } +} + + + +Bool +handle_clientmessage (event, until_idle_p) + XEvent *event; + Bool until_idle_p; +{ + Atom type = 0; + if (event->xclient.message_type != XA_SCREENSAVER) + { + char *str; + str = XGetAtomName (dpy, event->xclient.message_type); + fprintf (stderr, "%s: %sunrecognised ClientMessage type %s received\n", + progname, (verbose_p ? "## " : ""), + (str ? str : "(null)")); + if (str) XFree (str); + return False; + } + if (event->xclient.format != 32) + { + fprintf (stderr, "%s: %sClientMessage of format %d received, not 32\n", + progname, (verbose_p ? "## " : ""), event->xclient.format); + return False; + } + type = event->xclient.data.l[0]; + if (type == XA_ACTIVATE) + { + if (until_idle_p) + { + if (verbose_p) + printf ("%s: ACTIVATE ClientMessage received.\n", progname); + if (use_saver_extension) + { + XForceScreenSaver (dpy, ScreenSaverActive); + return False; + } + else + { + return True; + } + } + fprintf (stderr, + "%s: %sClientMessage ACTIVATE received while already active.\n", + progname, (verbose_p ? "## " : "")); + } + else if (type == XA_DEACTIVATE) + { + if (! until_idle_p) + { + if (verbose_p) + printf ("%s: DEACTIVATE ClientMessage received.\n", progname); + if (use_saver_extension) + { + XForceScreenSaver (dpy, ScreenSaverReset); + return False; + } + else + { + return True; + } + } + fprintf (stderr, + "%s: %sClientMessage DEACTIVATE received while inactive.\n", + progname, (verbose_p ? "## " : "")); + } + else if (type == XA_CYCLE) + { + if (! until_idle_p) + { + if (verbose_p) + printf ("%s: CYCLE ClientMessage received.\n", progname); + if (cycle_id) + XtRemoveTimeOut (cycle_id); + cycle_id = 0; + cycle_timer (0, 0); + return False; + } + fprintf (stderr, + "%s: %sClientMessage CYCLE received while inactive.\n", + progname, (verbose_p ? "## " : "")); + } + else if (type == XA_NEXT || type == XA_PREV) + { + if (verbose_p) + printf ("%s: %s ClientMessage received.\n", progname, + (type == XA_NEXT ? "NEXT" : "PREV")); + next_mode_p = 1 + (type == XA_PREV); + + if (! until_idle_p) + { + if (cycle_id) + XtRemoveTimeOut (cycle_id); + cycle_id = 0; + cycle_timer (0, 0); + } + else + return True; + } + else if (type == XA_EXIT) + { + /* Ignore EXIT message if the screen is locked. */ + if (until_idle_p || !locked_p) + { + if (verbose_p) + printf ("%s: EXIT ClientMessage received.\n", progname); + if (! until_idle_p) + { + unblank_screen (); + kill_screenhack (); + XSync (dpy, False); + } + exit (0); + } + else + fprintf (stderr, "%s: %sEXIT ClientMessage received while locked.\n", + progname, (verbose_p ? "## " : "")); + } + else if (type == XA_RESTART) + { + /* The RESTART message works whether the screensaver is active or not, + unless the screen is locked, in which case it doesn't work. + */ + if (until_idle_p || !locked_p) + { + if (verbose_p) + printf ("%s: RESTART ClientMessage received.\n", progname); + if (! until_idle_p) + { + unblank_screen (); + kill_screenhack (); + XSync (dpy, False); + } + restart_process (); + } + else + fprintf(stderr, "%s: %sRESTART ClientMessage received while locked.\n", + progname, (verbose_p ? "## " : "")); + } + else if (type == XA_DEMO) + { +#ifdef NO_DEMO_MODE + fprintf (stderr, + "%s: %snot compiled with support for DEMO mode\n", + progname, (verbose_p ? "## " : "")); +#else + if (until_idle_p) + { + if (verbose_p) + printf ("%s: DEMO ClientMessage received.\n", progname); + demo_mode_p = True; + return True; + } + fprintf (stderr, + "%s: %sDEMO ClientMessage received while active.\n", + progname, (verbose_p ? "## " : "")); +#endif + } + else if (type == XA_LOCK) + { +#ifdef NO_LOCKING + fprintf (stderr, "%s: %snot compiled with support for LOCK mode\n", + progname, (verbose_p ? "## " : "")); +#else + if (locking_disabled_p) + fprintf (stderr, + "%s: %sLOCK ClientMessage received, but locking is disabled.\n", + progname, (verbose_p ? "## " : "")); + else if (locked_p) + fprintf (stderr, + "%s: %sLOCK ClientMessage received while already locked.\n", + progname, (verbose_p ? "## " : "")); + else + { + locked_p = True; + if (verbose_p) + printf ("%s: LOCK ClientMessage received;%s locking.\n", + progname, until_idle_p ? " activating and" : ""); + + if (lock_id) /* we're doing it now, so lose the timeout */ + { + XtRemoveTimeOut (lock_id); + lock_id = 0; + } + + if (until_idle_p) + { + if (use_saver_extension) + { + XForceScreenSaver (dpy, ScreenSaverActive); + return False; + } + else + { + return True; + } + } + } +#endif + } + else + { + char *str; + str = (type ? XGetAtomName(dpy, type) : 0); + if (str) + fprintf (stderr, + "%s: %sunrecognised screensaver ClientMessage %s received\n", + progname, (verbose_p ? "## " : ""), str); + else + fprintf (stderr, + "%s: %sunrecognised screensaver ClientMessage 0x%x received\n", + progname, (verbose_p ? "## " : ""), + (unsigned int) event->xclient.data.l[0]); + if (str) XFree (str); + } + return False; +} diff --git a/driver/xscreensaver.dat b/driver/xscreensaver.dat new file mode 100755 index 00000000..3c41a5eb --- /dev/null +++ b/driver/xscreensaver.dat @@ -0,0 +1,160 @@ +! app-defaults file for XScreenSaver by Jamie Zawinski. + +*timeout: 6 +*cycle: 10 +*lockTimeout: 0 +*passwdTimeout: 30 +*nice: 10 +*lock: False +*verbose: False +*fade: True +*unfade: False +*fadeSeconds: 1 +*fadeTicks: 75 + +*captureStderr: True +*captureStdout: True +*textForeground: Yellow +*textBackground: Black +*font: *-medium-r-*-140-*-m-* + +! Turning on "installColormap" interacts erratically with twm and tvtwm, +! but seems to work fine with mwm and olwm. Try it and see. +! +*installColormap: False + +! Programs on this list apply all the time. +*programs: qix -root \n\ + qix -root -solid -delay 0 -segments 100 \n\ + qix -root -linear -count 10 -size 100 -segments 200 \n\ + attraction -root -mode balls \n\ + attraction -root -mode lines -points 3 -segments 200 \n\ + attraction -root -mode splines -segments 300 \n\ + attraction -root -mode lines -radius 300 \ + -orbit -vmult 0.5 \n\ + pyro -root \n\ + helix -root \n\ + pedal -root \n\ + rorschach -root -offset 7 \n\ + hopalong -root \n\ + greynetic -root -delay 100000 \n\ + xroger -root \n\ + imsmap -root \n\ + slidescreen -root \n\ + decayscreen -root \n\ + hypercube -root \n\ + halo -root \n\ + maze -root \n\ + flame -root \n\ + lmorph -root \n + +! Programs on this list are run only for monochrome screens. +*monoPrograms: qix -root -linear -count 5 -size 200 -spread 30 \ + -segments 75 -solid -xor \n\ + rocks -root \n\ + noseguy -root \n + +! Programs on this list are run only for color (really, non-mono) screens. +*colorPrograms: qix -root -count 4 -solid -transparent \n\ + qix -root -count 5 -solid -transparent -linear \ + -segments 250 -size 100 \n\ + attraction -root -mode polygons \n\ + attraction -root -mode filled-splines -segments 0 \n\ + attraction -root -glow -points 10 \n\ + rocks -root -fg darksalmon \n\ + noseguy -root -fg yellow -bg gray30 \n\ + xfishtank -r 0.8 \n + +! Some other screenhacks that you might want to track down: +! +! xdaliclock -root -builtin2 \n\ +! xswarm -r 2>&- \n\ +! xwave -root \n\ +! xbouncebits ... \n\ +! ico -r \n\ +! xsplinefun \n\ +! kaleid -root \n\ +! xfishtank -c black -d -r 2 \n\ + + +! Resources for the dialog boxes: +! +*fontList: *-helvetica-medium-r-*-*-*-120-*-*-*-iso8859-1 +*demoDialog*label1.fontList: *-helvetica-medium-r-*-*-*-140-*-*-*-iso8859-1 +*passwdDialog*fontList: *-helvetica-medium-r-*-*-*-140-*-*-*-iso8859-1 +*XmList.fontList: *-courier-medium-r-*-*-*-120-*-*-*-iso8859-1 +*XmTextField.fontList: *-courier-medium-r-*-*-*-120-*-*-*-iso8859-1 +*passwdDialog.passwdText.fontList: *-courier-medium-r-*-*-*-120-*-*-*-iso8859-1 + +*XmDialogShell*foreground: black +*XmDialogShell*background: gray90 +*XmDialogShell*XmTextField.foreground: black +*XmDialogShell*XmTextField.background: white +*XmDialogShell*demoList.foreground: black +*XmDialogShell*demoList.background: white +*XmDialogShell*rogerLabel.foreground: red3 +*XmDialogShell*rogerLabel.background: white + +*XmDialogShell.title: XScreenSaver +*allowShellResize: True +*autoUnmanage: False + +! This doesn't work. Motif ignores it if there is a scroll-list! +*demoDialog.maxWidth: 600 + +*label1.labelString: XScreenSaver %s +*label2.labelString: Copyright © 1991-1995 by Jamie Zawinski +*demoList.visibleItemCount: 10 +*demoList.automaticSelection: True +*next.labelString: Run Next +*prev.labelString: Run Previous +*edit.labelString: Edit Parameters +*done.labelString: Exit Demo Mode +*restart.labelString: Reinitialize + +*resourcesLabel.labelString: XScreenSaver Parameters + +! *timeoutLabel.labelString: Timeout Minutes +! *cycleLabel.labelString: Cycle Seconds +! *fadeSecondsLabel.labelString:Fade Seconds +! *fadeTicksLabel.labelString: Fade Ticks +! *lockLabel.labelString: Lock Timeout +! *passwdLabel.labelString: Password Timeout +! *resourcesForm*XmTextField.columns: 5 + +*timeoutLabel.labelString: Saver Timeout +*cycleLabel.labelString: Cycle Timeout +*fadeSecondsLabel.labelString: Fade Duration +*fadeTicksLabel.labelString: Fade Ticks +*lockLabel.labelString: Lock Timeout +*passwdLabel.labelString: Password Timeout +*resourcesForm*XmTextField.columns: 8 + +*verboseToggle.labelString: Verbose +*cmapToggle.labelString: Install Colormap +*fadeToggle.labelString: Fade Colormap +*unfadeToggle.labelString: Unfade Colormap +*lockToggle.labelString: Require Password +*resourcesDone.labelString: Done +*resourcesCancel.labelString: Cancel + +*passwdDialog.title: Password +*passwdLabel1.labelString: XScreenSaver %s +*passwdLabel2.labelString: This display is locked. +*passwdLabel3.labelString: Please type %s's password to unlock it. +*passwdDone.labelString: Done +*passwdCancel.labelString: Cancel + +*passwdLabel1.alignment: ALIGNMENT_BEGINNING +*passwdLabel2.alignment: ALIGNMENT_BEGINNING +*passwdLabel3.alignment: ALIGNMENT_BEGINNING +*rogerLabel.width: 150 + +! You probably won't need to change these. They aren't consulted if the +! XIdle extension is being used. +! +*pointerPollTime: 5 +*initialDelay: 30 +*windowCreationTimeout: 30 + +*bourneShell: /bin/sh diff --git a/driver/xscreensaver.exe_axp b/driver/xscreensaver.exe_axp new file mode 100755 index 0000000000000000000000000000000000000000..debeebc81cc78ddd4b99258b79d4c370839a5c96 GIT binary patch literal 131584 zcmeFa3w)H-nLmDJGQlLG4g@ub$eRh&$N~g&*%UDbo9-8InQ~X=RD^*&-0w;ocAS5sNa(=AuNXwjkxW>aacbWVoLJLTmUTN zH=%!7cv_5O*0I-C62QQ@aqZ;;{Cof+_-KwPRnP5zS;|B5@pP*694-sM63d)8{^C(k z`_UK0)SC5W>nbYNu3vFq#kv&uc~`Fc7B4cquyD$X#fuj%UV0v!d0_aM%LgClA3hNx zZ-x*MnfztIkWtt1F2)3G)SBDGE~!Av`&smg=9? zC_A9>nEv=M=L~%8JTdVp{!P&wPtv@N1>aC@uk!OWG-=%%BaJEKR#Qy?RF75bxA4 zdF9L!7YPw`E8426jcy66$UaqdFQzi{hc*L`_hW#0|WtA&Z^^*KLoMPkgM=GvZ|G@gW{(DQ;tSZ}d zUqxB<-Rl$|sT#^2*!lY7{r`>xc6$qiu!QK&Q})Q%MwlEt6(V#U|E7Lk+kHGu?+9h( zr0fIl0}J^#^$Qm(4GBD#Egu&DjiNieKs|4KNZmJHt?om!QgwMX_$^f~ysEtCS#>{h zt-3$_r|RB6SKW_J%dDSxM$xtOIed?TGf;_@=1QFhHJ_swsdnx5Vr*LQW0xyB-5UJt z1fPOGjn}K?;MQmBbBeCe_ucyJ@7B*X9-ochh%O(}cyn%5ba!2%`0lpV?|w>^cj@+9 zpI7(c>lA#AmcJ$^{7);51z>z20KZS8neX1n)Uned?$s4VC< z?bcv^8+=@s8$GlfnqLin_A()BL^PcB6II?_qWE=Rs{!?CTWd>e8oMI>njn^?0rlxF z8+>VNXIo2fePgh>SwbW<-OaTP!S%uV)|LiJL5Ni?9l!*57~E zru)c&y!U@b_rFK=$DqysTwamc13vwHC|9+& z@k^>baqa&aKdbLQqRNea5jTHFwLdJ@{-9=keOoZtvYx|+<&7s){ls!rzxyxMy<0}^ zDLos$Og%SpJnNuzAmf)gPfSgE+@mZee)%6xB{DTeZ-dCXR7d8a9wGz<$=9>$3 z_Rq+?uhRZ1uKiWuQH3uuN8vN$qWEI<+|t!eJhR)2C-R}@!&V;0gdqKA@I?wT;f)@7 zZT>RnFBF`Kb1W+z8}!izKe`~Zytt*axfwB*Ra@WDw7s^Ysbz~*+tQE(@@e~T9t{7P zqSswy+OPCJq}%V)fLH5QhivtIs=7fZtm2kdm?rp^Mc1)c%{Uq@RDfO$iD|3FOZ#}` zuuK0%Z2f8E87|7iXZRb^AVR>gC-)@_I^r7MDzag7FD7-Sg6!z674|{y|cN*NS{hiS5c58naw%Hf=gQ}nX z8qRC#X*_m&c%JLs@g?0N9x;(7Ue*N6UBPNcp z$K&?-ij`|PRp*HA7xOgm4Xtg{{D5Bxw+JEG*11up%7AwBZ`0u%1-J{6-bY0PlO~QI)9^kG zZR|yNv8k@k27Z@U;jzOTdtIRU@$2fwUd-#9SD%hCUYUM}@oXE9#{P_Hd`91r{Av9( z@n=}e$EVL`K9)$112rEEEYWh%`uEZharu<(9Vp32k4j#jKtB?e>Ob|GQx}`Rmq2racMU z{6C=iAJu2SrZ=xsS2T7^mk%Y|8IW{_ZcuavHMp7Yxi3}YC9KbWefC|Zo`-b%dMdP> zuGHg8!;R{5K*JfihKn=hnu-flKjvsZVQGGFO1nh7_-R#N=y=ND4J}vC?fNvTr`-uw;O?6LnU zQ=-mhJoj9y@cDGH(I3l(&%l>_Bop4W&)A=U=HD(~Js%5pbtpmsbYuF@`zPsl$j{j5 zKh)H)CD?Iu5=h}I$5g9z3m>Zcm91^t6i7nrZ$S4e(jCFJHMMoY<|K-Yi|$J@Zbd|o zhqyl5e> zdZN>Ljub{U-je@a<7)FvH#s#zQX43j2|)n z%lI>|hTrY&mi=t}j9ZzhWIy|ip6LGe>v{>TC&n)i>E~gi2WEWAd{T;Yo$pJ^I@wO$ z$x42UZ>wZe>PoJJYB=MFj1xU(W*Om8a^>ltL)sZBQpNSXEyx!RB zP*4fVZm)%HJ-}G;vu@opQx_WVIaubUWt zgl+z9>HN;*AMLTNBjI3@vfT3eq71lwC|DgO{v6apD)|<0e1h?qsN=!&pzKB{I;U& zTcYG`pRWvR`*Oz}cSsarV^?M?c&|Q(HJpj}d@UNUCT!XhH;kCGEq)7Ny*K@5;*Xwu zMK7W0#Wf!hn?72$`4;HPpRo&Oeb1+#n>bJ3ijXbevfDePdLpFSV<|R-86Sh!n40Qr z*QZgFFV^`&uT5Y5w($|pL??VU`55^Q>pZ5>KNH{HyFPRKiPy?R82Ve)j*=TxLlEal z{TteV2s=XN{>OW4-l$dnXA zgt4z*+wG6tUUwI&4lwq)+jOud=$&RLXP)b8Lmi!M!Sx*tW<^hxTeCCagpFVOdYH-2 z4r#k##*N8y2Q)gP|Mu|~w&iz6ZS)_~^)IwOH)w-TwJX@h1%sYzw1R3p9f$!-YwNde zX>09dnws|rRf6U|FjE8SlYKm`Y;BRT>^!}2v02}nS`nMRj1DP%@apwHGY{+5?MA#N zHO;H_DWMUWe6OYBuWoHGH#cF%)Y*7UymNLwbyNnSJGueoawUT zy%~R&)_bFV#=hA7pWVOO*I)cvE~ecayXil>KeOaUpmYdzZRCJ_oQ#KkkEwnLn0cul z-S%4X>Y8MVKt9K)w^}z_+b|t#lMA%+ zDe`AFeF&Hi)#dT?{2dx#31QZC{2I>KPkk%m++3LUYpLB9luR|Zwxqbi{MMG=R}5O4 zYdf3exHI}@@>*63r@S=lbH)yt^+Y>gCT=qJ-0Z_StnImZUZU6UKv()blMnMc6k*eE zh7IowbEVF1oBSeL-wc$`25-;5+w*a8Q&FGI`kLX--w`}b-ay09pX5GNVIpGvOi%NN<#Kf|?3PGdSgGxo#aKYzTtC5L9++lVKr zH@0}rJ|D5qm+bz3@KQCd1~oqsJ#RPhfEh1c-AZnD`h!~EeY&1K-mu3b=f$hZeP%w@ zKhG#SAuSN2f1^6?j%zwSdjFf>ChwGAL}t%||JM8EA{yT#w*I!SPub_MmMz}5&xg%A zl95x6mJ>+JAEYZU2eltg!s&H$yFAT$Rz&AljJ+`X+srz-L zBYZY`#=n|zW$cl$=YcP0$^|Gb;x)fGwuh$w%zhXn*P-82KVr)_n|k5Mw6OWl{=i+i+3`oDcqjbEvcFyq@G z9LhIW>KxLJD5334W^bYMZ1Zn>d}rin@<8_S)@_SdBewh9UevJg|5p^>AJR~Dqtj1P^h>D_96V|78x&2D+T9i))ZSlj9ZN19Ae>xKz z{JSkb;s1`3Ph_c*PsAp_kWD|jZT{VDr){cpDT+xiE^e?srq9MyOY{E*Ea#cl1k`%}wS9PKw;*6iam^&>WaVe)vU+&*7R+GV|O1g1p(jNXpg#?NjqAT0Q$=k>VI@Mq=I^Y@$C z<1sT%%(^j9$)B;SW0731wAx-vw_2`(9N+w;^PC`KF4s)$1PMb2BgEHGlT`rafLrG^laA+dC-v z@b6c07wWMvdXUh5Q6f$IW7kjn_yX39pJf|=_WT0#nQK?5HnQT%d)KTA1^4O+7 zjDCbJgC^k@(&N}`iy!Uu#4-t<{4AbChHhN<6xe;Ap^u)jk8-3HCJ&RR`+Ua@!UbjQrZ_}r05&@+vf-N`S;MPioe6RDuImJ{F!O5iF2$JJ$Y%$d;U@3v6tKZ zANIdW$&UO`!3Q)xGd}F|@xek3pigFe3H=^~eSDd6^PYskZ|w1)ZN1&_pZI~|$EWGs zru)C4sV!LFA>TTZC3x>>M|*v(*^VGAZ`Zu$E-Sg|ucNIKZ{^?}C5^|PkHzkgj;4BI zQ2_S+fnu}j2Qxo1`;p9hBgUQ?{swLOqRA#tc6+Yqr#P&`eiZ^Y1d}N^S=XA^+>mNj z5}mND)HSa{?ZM85))YP?|G@v1*}q2qrrg9;_WrAe{K_c51&Y#oDKGVe^wfPNsPndFGJ9-AJ#H!-jYuJ zH>uSa4D&J{@}9+ZNE0s#{hpRr6EgC$>yH_K<~=aWFs8?!DL3zZonMY8_}{F<*vE%` zelavRMSxfK@pJzA2ax0c9KFutLmmE-?U~oSIena%{lVtFFrS1@hgZW2`?Vxqv)FLg zPi^`Al27<}|ETcibR<6L-w`)*GMvR^{*X{rj4)f7NHFFSMMTXZiA8 z<<*%x)Oq5L<#~HUd9P;qRDDCx#A9aNVASZ5)+?i*<~=W;u4u-Sef}xlQT^w=T{Y@g z^A7$ctC+LFXW;Dk25tES!(aD^!fWhHmAUJbtQqRY{2fl_!!4;_5zU_&XIIOo zn1|{1hBV)%zAvqB_$*@6|9~z2U#MRQU8K(on;PURmkad^p^Nl+p?Z-tX(xO?Avdy}{7PXOaEh_M+(`+Y7Uj&om^GKW@U)+a4C` z7n76tFYu!B!j{$y&_x%5v%Q$R==a<&lrKOp#4ZH$2DIX2k?qB3(w_|UJh=Au3}lOJ zFB}t(4MY;03{H2gET6CCzASgKG~M&1zAekuw_-klwOp6wdc}OTQ9AkL25s=?Qy){+ zR6X3U)c$I|me(@Gu6ueda;;~j}){%Bs*nYu)XP%>AFYC^J_ahTJLSyR@+j$g=I!@ z=chKpFWOeyb$?SsMkFOsMA9c_3|)<)ivTRbElZkVSbYpQDwuIdPG zE5lwTC>cjys+^2$<79Dtuo+WOd_7^AQEu|d7Z7aJ)^)a6Yw=j}!wvM4l>70xskKuD zm&C&t9BgnEcx3r&@r8{bUj0{~^W}ThnXRkn0$e$Em{@nUs;@`@A2xFH1qd6;bwO>% zA#t)N;nW6wxmi3DJiXU!j2JsLNiF#fxs_)7C7slU^h_FM{Ln%QI^E7pf_o*blvUo@ zhW=2VP{K<)bRlS2sO;Y)Ah~N`PgCTLJ)H#7&mH-#Z4GI_8S=vpu5Hl%ls%|#ZSLIG z(!MMgnHFK}t=cG`DT4dbzA-UB^`b>4&?@y|4@*v&Q(yK_?Ux(!GvTGAQo!1tPe%S; z`N;_zV&!Kh!MiT_iB8Pzp$|Fe)Z%U8&;y@-V`c(oOoO&T76EgLZi1usBb|=k9 zil{D^{j@j}Nru*%{aoqrOETfB8=Km#hNkuqKA~aZk{&kLpc4p&j|(+Qmw#|$C?Dmg zHNUmZShm=PIB;3+iZ!b$*WQJ7flZ|qSbAQ&YHg*IXBzyHMSmFl4Ic(R&64BY5otsh z-^h3(^Ft%ca^c*`e|r1}i<*ox5LPy{K2+8gltc3TI3(>uCa89OT~o{T?TwTN7~r>q zmgRn;smof}*4o+uE05pDT5?m5tcC5Z%}os!wwtkcytof;q2SuB#a{3E(0qHTw#`~t zPfHFEz{AoJHm&9o)FhSKj*d2dP5}$ElD@TY8|9ku5rLfwq8$LX8 zXql>-Y{w03#|N;Z;oE8v^?;OYb#Cs$*0wrW{e|1NVZ)x~U38;iIJBd!)hhCo!c|_+~;W{qAaQ zlSFcJ+hBg6TA2f)1>Ydr(zzq^u^gB1GN})7WiX`1z|tfMD0>TD^J~NC(WH_i&kUFp zKWV_GX*TAU+?Y1HSoQ%r9BOUev8A=;_l>H}P0h{028hc(MlLj7w;+a0j>5&p9;8Xo zTDWe@*SJB_%iBvJms8RQx)>S%s>c*`z3Z5I#BEvEfsGLix$bnEgZX z)ohbdaVAq4ZJtl-+SU|o`%vvokBBBm`iJ35Z|@>?!;lNp7bC?#44>?T%!mM?5Ugm^ zmc|b2udKzl+=36m-g3*0ljKrvv*%K7&+zj%WX2hOeE6&#o3UZAFbBD|-IClhqU>n3 zI$IcaSeOGyGb84;FS9z^gKZ2*EOOA%7_@3um9MGbmyE2tR#h)lU&mS~Kh|rZ^+-}! z=vAz#5}46 zCZxftk>oHXZIH&^YK1Ui)GU}(^ih2<)DdjB)oMkv+LC4HisnvaR`T*VhD?IYx@}ui zOJ_&0{r2R@y1x;wjS@*u;Fi+yjpB28biy%`r3{I;DXzi_9N-IA~}97A-LNndArG7zX6Ge@e0s`DdR zLG(VnBO(pWK`OauuZ=m%wH>B`YCdKM!F_2E;_YnEa4MBM37D0R&6Z6}1HYHn06o6$ zMhpXtx$`tW#q|Y{q|-^yHl`85Ws=TKzkiUWNL~P6I!S4=GHK~MGfPBIm}#@tr3UDv z`GQ%B*aa}ziA_F!u=ZRZv=9b1wKiCqjJ8m>LXqTxIznVMc=-LkNm;h!JaAjEy&V~+ zMR|EfYJqf<0@t^V2H;v6Q_f##j`8)+j<(ijtCs5CLc5qYhJlGjBst$%V9n16*%nCS zH$OeBw32h_Bx>Xb>l^bxFoX-tRxy%b4iPS)y;gH=XG?t}Ofa(jHVd-IvepNcmVs?_ z#+D#WZyv(iAh2}QHZ{YAz;0%IzY(8GU%%?^we%g*FX+8?%HF~J1D?;@RYDBy4Q`iH zG7ME%>srjbl=*L8v`D)%3I9+nzEufm+J5YZRR#zyj6ll&u=GMhL3y$i-0$@l(istc zUOSuyL@7N*19T9l>FwkcecRmw{B@^YKJzYDWO%?+=L#wODQ+^%5*`=>Vr+&gAFP~Q0@MZ z_0hP@+KN8E@oA%Ez-~nqJtU2M*e@SY!-C4gB-S=_>a@coWfZeoFF&w8*1quSou-){ zsHD^9*ETP}v7t|6mG&V^%IO1YB|A#VQ-AIBgGrD_=;WlxI(Cr-I9@YZS(iP;$(KNqr0T_Yl$TO@q%wWG9x? zt4uKS_Rs>^swk$c`D%P#Ld)+b%s(JUl>&hzDTPxO8 zSZnXDwpOjh2YuJ9sVKL~?q0VJU-Dlg_cwDnQ7;$DoF_z^@oUiE7up)!f#gVgavg-L zO7dGo8hR^y+$N?2^!*>ohark7D*|bXvY|6nd>wpsOYk8CmV7OrTZ>cWn;Tj~!4`nf z%x3~+z!^L#9Hf=PW6CuOu8L-qPew-rWxyFcppz=regFwEq+Q`OLrtNe+##KpciU}j z7C@2Hu0{8@BQ?>ENx*hwHkm%dPNtT6#KsNQ?YGnOtDn-VU{|nydk}5kjKDy?|E`{M zF}ZkNgY7x`=^+{Jc;>Zxs4#R_+F40V6m(k<%fc<7W_Ij@Gx+~{y;4<&ycl6SJ2<7Y zkO5LXt@eB3ooVzLtauB)rUp3VVYH?YaIzx4e~n0IhtxJ#@e1(YnTx*iuCh2vUZynugW{TvBZY2{AiQSehEK0_a zoEoYW0_io>wRT~?&zKp>b^^+&qpX(Z0wtGe@?txIvCh&<2ZdIeq$Y#In6GQaggPCN zaFlr~S8T1cuX|H&2<oP;ksdVbs`XWLTA>VOUC~ zF2cN;I4S*8=1FSHti0TL&7BLd|F-j1nX`e7G$3<_A)sT}Y-&)*J9CWyOC@l7BN*QPbyTmf^dzoiZ^`E!*?VTCxxoReNQa z-+^w2@PfdASv-U%8Bh^AnuE`CNJhHkM1-MXS{g^>DMVV5YKpEh9Sd|Ps9rMx%)It_ z?M>|%%Vb$+aOygnnqj5V1JXr#xev5{e_ zSx^bHa7PYxn`9gEtj$PwrAA#cQ%0#G4~2hz21j+pUCY+ojdi!X@2y@`QB$D`@fQ(x z=plSOVVVAP0|HSDD7nTZjU&G4BIhwQeeCNL{Pu0_+J&}sZmVNjqg@8vN+VKmoid5V z`6Emu(y6e|GMtA!#B_3p#4e{=lBcO6wLvXMOi%LZ5>t}b7I(wypCv9am)Nj*Y4X}B zE>B*+YF`vtolmRDzT5Shq44@Oj4{FW-0Qz{sLN?rl5esYw35<^a7qPz$JNbiy^ zCJiw>LRfypc4v$zu72b4hLoYzj1iyCnOV16H{L>bV{j3KUhxC%hH1o#3-Ua2&YuQB ze$n=Aop>P>Q}|kIb8~BLhYI$RLe}j{hij3H!yDQ_ZTRZcKeJ&2VgvN=RwmUtu%Jjs zEa#Ytcj5uxYQo%t{3`;cU^8r$6dL*sKg;V~CjVc=mq^qv{W<<6HN6|hl>YJj|1}B3 z?@$|LM|s9(S+z?S@8#mY0EfA^aP3YjFUGw$t-J)+R$93i*S@rSKdu8f`11j_3)j2! zeHHE_xQ^?4KkjRA4C?y;u7_|vqVF4VKZa}f3WYC(dkfcIecy$9AFgZkeHizVT4D8n-xT{!mP7{-xP?hqw70yx4rdT<=ZF@kytoJEC0 z6yvDE5yH`fV-Uv(4r`@D_;GaM*oR{X#~6;{N<7EWg<~I%AsnI#ZNO23Ba9=0V+cpd zJ>X##>frF>2;+$3NZ=U5;YRz4aa7?jzs3gvi+97jaQ5Q73uiaZ0h~wit-#w5)84+! z%>IgPyTc8Z|Cw|8znJzvgYl18{wRSzO5p!b64?B^@PDm%d`kJx9z6EB>9^JGS@NgH zr)@g@#(34GMW@{#9ckPAn`?VcF8J(@S)2Z5%fBr-^4Yqn-+KPH-}t2G$n;msjviTl zOViHYs_H{W^S?a!k(|B*|9H>qC;q+!Z($GAkX#SCp z|LOXpFZ7)J^hF!WhyNsZ_J(_Qw3TLmZ_WJ|Jvy=Mu_u4{>faoHsO9z}8-CMLSn|To z;PBKN`;Wf==YM_uMDXAHuDNn({EKh=$MxSI^cK9bDX{)ON9TABEnDApZ147097|p~ z`M`>yT|+G!%Um7)&)nEH^`|%f>#@+akH~&{Gz4(iX7q7Tj#hYB%P`=v-)OMCnPU9;HAXj_PD`MK^i~B!WpYMQ`#RmQ`awq z6}_Zt!`7-Z&OSaP9X=lxZqG${ZUMFmyz{vqyrS*V{KgGiOYqD`-tnAed78Hz@a6_@ z1>nunyoD*BYQ<9lc!G=$7K=wAqpuz;5#K$CHXN)H=MMVCHHT`%?S}&5!9$JW(LK>exvfQmiUehPk3VZQchWwaC(F&jC7&A80V{TY6Bwp$Pj(rmziHH0UPY-b9h~*I%gjrg5I6N`X$?x=Nj<|(HFhgHBvbO8rVs>CF-YR_W zU8Q-R+hzP`vIRu|&^!xcXhUtfI@ zXk1>iXC-Ml#JkC|SH-)lM<*su{%vmKimT9uslxjCEVOB2;^89vOXdp(#jL7n1+H=@ z_!K3Ma%5-TD_$&C!~sv3lM{1JP6vFB*9ZAMyQo?`yBg=)5jDR=+J|y;SA2WodnaAu z2T_-J()#O(*H41?y?Kz`l{jjI_%-E-HtwB+p5o8xn)&;No@t&JENeX!VP&|RMSv#yGWeK8EdG(d$(`r_H3so++ z8Gd1z=&Cx3*+qk+U{#i@0ra|VEAWc4=@RDfqMwPwt1m|X;9qyZPJyoLe=6Eme^hkc z8FJLDp5+QbMqPIh-q0ACn0RlR*DC$1T+Yf0t-}*{{5Sr^ib$T!6v#Btc4@t9xC?yV8adjn!)Z==}R8-jfa zYx@$Sed$QqJZ0}5J!rwc6vMuFVP8sMUwp7HRj@C9*q0jEmw@;x?96vzXI?whCC(iR zr`emsup@(K>tZz%rP5vuFR3fSKan176pzP#y~uY=^?#!5@Qrmvjj${D8e)75wk0tU zjZsFwy1{pBg>#ONaMt~fD#Fz|3Vn^^uo(^q z6yj2;2UX%tDc=WCFTGC)XX=bWrb1jM;Ynw`h9z!}5yBNu)b$a+xAP9qboh*CUDL|l z*Uqt!l^=*_iPG&tz!v^#bm*e*0oSjh-_H7c>A~!;mCkUyyz&zw{M&YsfGxOwZzpWB z5Kr$B;+uQEad~*fH!qK@nCklT3cz5zuik@f56=H}fPAoBUg$CPU5L5S9O(YQ^@vBH zv*#v+H3k2)UGcdWQU0SyF^;Qoj8FUses*w7i2poLaQ4mK97nVe|8nY{f{Dj*{&{5P zL5|N~@A+2t>nn;KrM*wPep&uE*%K>{p7r#3$Lo6Y#V^V(b^UXNHBlGK5rh9-;GiGO zi}r}cXxE+K${lKm?y*GIF!LL7S!$UZO=M9Nxio}C>qL*#=V8x| zz@8n4JsXetV8^Op$NaEkHLzm=@jUF=5!kciy z*_XTW=M+KD4t!?fj#Jd1-4f>A11Oh%WC-?Kj}>WUsl>}%vGz>htil<{_lviHFA0@?>#|0rzz zS2N;n#B~E%u2Ja7<1z0kPhZa|XDo~u7djB_no7O$MRy_AJ%#vyGQbx)qHfn)X#esk z{R!nUvTDQDi_k{vEaY{zu76@;j)yW@yN=IQ96+2t=os-*HpKZRaIy{Hy&rxpCZw+J zgf2V}UC4~v$QWvH2*|dj!igYS+3uJ&&M%lp7+qdUM~5c zJs=zwY{cB?bm@yZ*EsjWzSGV=`dl}zBkxCJMVmHkWlT$d&6t+@=EgPKXPtgA_Opf! zTWh3TvY~&8vR!B3+fWt&4#Z#apQF4-*Js@>j475g&Wr%x{!l6ooi0w4b)QCgN1}3{ ztTQDV2h23_cG(-yHO9}3FDOS>O}KoD2*2lo{h6|J1OHWz_YxRiKR&zZ7~1m^VP`%E zIiGXJicfp`&P_aNb)75iM?5kjFh4<(H@a)eVvkGIN5kjp`agxfC;)B?^vrzawR<*f z4UE?njbhBwj?Ba{GOMnr3bNcZ$9Jq)wtGtSDExpI?VU~-@IDu~SQZAKp|jB#pR>Iz zBOL9^EW&^C^_>>>?AJXLA@z&=Yn zM}gKWqGv$-ipNjHVba~Gt z_1!4{zjb+NlKL}H{v%x;nWTOJ%D=12yC$h`q5Rt@H{)?G?l~qc#F=_L!Zsg=Z9dZP z*S3l}!EvedIo)PmD6UM|R%vri!(N=O>vv&%x(_BQ2NCzpfu6?^hp6~?O1$d*H)Ad# zFpdi&*`SvtB8b_;i>8S}91hP6v0~A^QzNUZUE$T$*Sbsms~xT-D^E?e zsM*vR@LYj1mpFmv>jxHz@VgO=wSZvk za&vU1>tyAg+@i9pAK9=K#{Io)z|IoZiQ-QLeEToSTH$xiEt`gU-#~70*=3kxl7E-z zj?V11%5p?J8o~3a!oQa|@a3cdmxyDo?LXiap}lUzQ)eea2Yxp(=e;Sw=@Nd-|JJq0sKb`p0 zDbkkq{pz}+X|5B}kBRr4y(?xT_JiHzv%|16Up}X7!e}w#3e?$J$he^~LLZ^z_-Bzz zMBqeXtPXwoqX_-PKL$5!9UUv}AH1mE8XK$Y&qu6ga87r$Qg%EXwbPl)_zzW6O< zUl}byo~i4i#hx25R!BR3wvKo$-?*pGdxrg;qw&5J5#pIB>vy{x<%ri#5NEy^P2#Bn z9=GegN=xE;>j2xu_I1y$E6ToFwWnLl_aCHuj{>JFLVE;yvA*oreUa=rKGGm=;TkN@ zhJFd*h?3U=;3vO168}+I5B4x(>arf|%et(C`WS1dui7~ZJN*8msz1V4s(vm$^I|M^ zmG4-H{S5i;nsD}Yp>Hce11o%x-#Z85h$pc#E&{pW{G^meG5jKB!}&OM;0_T0or);+ z;4sGhOz6F%#JBQd2o+`B zZum$(FMyvU&0p6k`5>N-GOyBojf%53Uc>Q_v*&z1#M`G!m7V?lF>uP(a{itf7hcH5 zez>`N7TPd~7=BdFk)6HF(G|l-!vFS$FpusMZ|b?=#Sz8>a@^s37~{?X9a#+jk2z<= zjK`X(u$Sn&%3R;E-^y4!FERu>Q6eyJ#(X*tWkT%PQ;1k10U3tG(}g3DA!9GM>ld&q zzm&1V0mz0phZZS)^NYuOt&ga&Kt4u_)VRK57U^FX4WR$?0go^7MQJ}^)8Fw;l=d}3 z7y4vul>-~mzek9VM8A>!JM!Mrv3`QG^vgMQVU+T$ zhy1E0oU-r8R|(=Z#(VEyNqNnWTn3w4f_AbV@$AXI!^e6;c%u&2_2pS;FKKvz(+^zT z!YSj?kmiZ}a8A%A>-^%tKYc>=7u!L3kmdl|VD!Qd`&9*9IWRHtHs_M&`My7?EBe8_ z6kHYRZ;*YOBgc0f^bUgtbn2ZRDff{B#Lf9bdf79wj6UG&dxoUGJ>EMs@nY{i6W;^9 zr}sRCc$jTX>DsTLYrl}XR)F?Z>iM9YFF_t3JjOEPm*UgW7-N?iq9{6is(LWj#)Hzs;+-XOhbzH=BWE{-b(y)y(gWbY*FHrv+t*3{c8VI zw`cm{s+GCIcQQ*nv1mGc^~>V(t7nXTW~EDnPr99h@B9by0+%{y@Ce*J&8(Gg?@Z?J0*=Qf^{5wJ{juNjBmq$N`SdFxV zxGzfFiHjBP2Y~wx;JjMAB<(ih@F;Osjg|JfbB4;X(F61S#nH=Q-zf{qjy6DuCDFqd zyFHZKSJCdl({-_FOB0pDryiHNM@#lmJ^g9482yule)+eG4O@St`RAPa2e=l9U#zo_ zTS^Wdi*#up1pJ#1xi0eG1zsPMdFFK(8*a&eK5_x`!TW&5hxvizAH2t^;Cn>QU^#ic zR{Gn*NIvFr9D{5F#^4F^T?PJIHSgq`{)K#V+>*ZG9r^MTe+}OMlKg`2FMLS8b1uO5 zS;VPNYQ8ZqnUrtH9sCwXAouh5PUN{gE5LUSWH*R5a@-z8dzdSO?|3KHs%!@BMPLr& zOxkb6KWNtrhXb4tmZ+tpo;Z&bcR-6#Ll{~GZ7I_AZfffr+U55vw5pQ?)mb-Y{y|3H6r zW~T30K#qwl8OPA~k^VSzcnCT^j4^5K`|w>Gww~2_9RWLHovqX3!0ONn^JCp!PfY0XQH6Hjp!JO7itVMpV%ynfhwHKOndql1 zw3}@n%XNG9UZB0#+1mTP3$*w9XfI_Ix=P8V60z?0!Q+Q%=V0#S?JPz+G5G*!+YA}Nt}9I+o!@v)mWXh zPl4R$JkKDercc8BG|IS|Hg+239uDxf8+hi5Uf6x7$BX5)tqx zA{_Ii!8qOEH@Gd(vE%>Ghc|5f1n_&M9rak~Ti_?Z9?j=o;3VE>qEj({pq=G>iMmeR z;e3g_Qg;$LYQFR`aDGh7Qy?Z+^2mylf7a`g`H$YnGZ+)p3yycJ^&!vqn=-7+o}eC4 zf8vVxGw`(lhZgt$lg^2b~e)SD8$ z8vfa<>r&2?G5zyS$Tl0a-JszI&o$&1ZMh#~p7~jmb5{B0ow3Z^{gHmN*Mj+V)?+-C znXAo=p(scC-zP9{Q~BjY8FK~9uQQ$?jyTGc{AAueI=wm}<;a+wIy$#2mA6XetWr63 zj%OL)X?{|<_4GMZim$}P!?A7|?`B1N5QBaU^dq=u-_V|ur+s+-X*?(Yl-0-t{d1y{ zZDIe;+Csf?MTv*-#Dg~|-dUw_u`C<-h==75XLVfK|Fc2s zDcDjsa>9KRAGDT|>I=3%y+0;tzubpoiHBp{i^DduFW3+C*I(JpyeZ-)@M)ftf0lh7 zWz-9KAQy|e@eAlkzggoTKg`V&UuL|W>Vt0RWDj(*7HbI1w-2K2)|Awmhkd<+?GrLb zgY}$hu7{+r52Wy7&OP83Rs=C=tb4q)zxEl+*E3FEQdr7%!@fns>zQkx9Z_*fmds20 zKwr>Kb!C;K-S7P~WIqZ&8a~D6SN1ZHROu z$1C+8d0r=B#fh@R52^85jCCI`a?B;jG5fIQQ-w7^Kl00gwEVIhw~!a*mRh4r?u$z9 zAH%wvCyqQH=Z5HG59f~Tmwdg7{t3uzKBc_3ZVCyw_pzjTo{@=P)h1zGX0$~BY#o?ol=5jq3?$=ENF zw9!es2)gIXH>HbgR|2wSyAo(C=hAHNchJ6Ew2%GHd(x-E)EuM&24#HZz3rRBR2Z6)q7#w*ssiWbVYDq3u7H=g|hxoFy)%(iCQKiV5N z=IR%;H^38r-x*^+aD4w5>#N0h_Oq-D+ZtOpNPWj%V(pY_#)HCf+17|43ObZv0+2gxN+aZ*?fNbJ%L$BEXYaNR%J0(F8-M$E8`U%3BPTBPkL3sP z+z&hsceD(;A91_)lwFPW?#8St&s^;Pdspo8pbrLMmpnBRA89;4K!43Xe;WC(8<`_6 zi6CwlC$eiI<> z`K4IDDeb;ltbXq1@alQlj?(M0pDn!^stc6q!G`Z z<2#VMsZ_Y!zUi*@rQw@J6=^+tvv2iH+rz7;xu*H9aNSpWDEE%i7jj=Oo#wi+^a|Ij zrO(`Kt^UHzgR6zhDxL27X(?#?uFI}2EzopIK!>*93pzRCNZ;S)&MA8Vd>6Q8mi62$ z?!0xo?@qVtO3C};?GfxVn^kro_fyDyPD9(~l;*qIaeYPU=WY(HX8ZD8U1;0op!3O6 zj2(=<<^6@*Bjk0J4{cqtT~tLxUEi(Stvi>3_D!IR^)BBu*R7>hkiniymij{C@xJ|+ z+*E315Bjdne&6?$%PQaPx_0F};JI2HiC+g?bH(!gomu-l4`t;PVn6Bte8B!G7{AzG zCi`)LI4@^#h{v2c4@dND3dmm6S8ELVR0$ImnjalQdP}c0;uB_#~;VkU+$V%bgA-)jg(S~u~cVKb{xhwy&jC4Kr{=CMZ5hAH3~ zILZpphonuuN6#tyd^P%+_};1kEO3vKZ}381$0pv4U9wf}Yk=;_csBt2cTUeP{0H#G zHGAS4%b({NMy@>{{mgZH#^RN**QWfgE6y+P5iiDW*D%w>NEzoMjN?uHLFCy36EDVY zOyZdWxsH^voN$LxPC7M!S?~dPh5+XWOwk4K9MyQjfVt`e@I(N&3oz3r#q(C>K8+_A z7V{UYbWjGM`a*$dCMz&>LSw0i+{-u)*J7Yzz`72=u`UoZ9@ zb7H|9wh8f~L&p8If$96&W&DPE9~573T#lZhy?Co~>#M9)Goh$ZtL-UYNj^w&9J zr-x(Z`*;fz`wLDaJ_bE15#Nv zO{-2+o||xc@a(ip6bUhG@y_&n~r2X1z}kMnN_ zEQha*>v)XU(XV||#a`I|ti4x@qP-UQn+uy!EY}e7;T!f~e9t<7yd#b;;CdO3wn^sk zDVh7y^cL@;ywHfbYzTANF6b@xh#%aAy?EW?+`%5~Cy!u1`9AC?k7Gai;j}p}eC7aU z;k01MQYm<0#fhPrL_2gb{1BhP(};cacPH^&3_MRJ=@~qgD9?94g*9a*Z}P?Z#6w?5xZ45K1)e#t+=YIp zUzwrfO7I=|v9sQSy@^k!jXF)ckQ0rcuIoR1--fNcXFbY`_4u6rYQHWc4VLpc%USky zl=Ywjm=1#^X~uLpOu>VDPstZmmFc8v`#*Td5vRD_}i|k#jlF06=IIB z&{0^L4?nQf@mMMGL_W8rlzEiJCu^~$U)!W2$Y7- zeze~bw|ctHJ}mRepThb=%66yb!6EQhFfl7u=e}buV}lTE$g#T$tuEM+Fzm>#G&@0^ z2*aORuxG`vpVmo7RSoPXd1gMG>p@%}@Sb$6UVO4}bzq{dZ^_9OtNjyoF){Ht^sXJ{ z&qZNh2f9$kd$-H6HvEdKY8u+o{fY~1TCp|G5a3}$`;ae( zO(dRm$hQz@R{TKL@5IX3vsfcIVi|Mh?$JyY5bIZ7Ig>#7i+a6F#I z8pGfP=oF$}05}&vCA!pBgHf6UMF%;vPTZNGG6Zlld+0a)tKk-5D-o-ovxeK{INg6$fht5vS zvpyoMk<$~|o&q7>omLPnpMrew^paS4A@-V3f5^l2r#2n)V7}T7xzOHY4KB6|V->U` zTr=c+m$Wcu%Q;@Jge|#R?38=p!|)BaVx5Eg*4cM#%VEG{zAAYiZ2fldEb@#4(wa<((cz9ZRj*#yW z??hkAcW9C^@rC(J=@xM_?kxfCGr&pxFmmddC3!gUQSjh9>x^|{Ez$va#=>g9?C61% zT{k?W;zR%VYehY<@A(}ZyN|w5?8Lkhdf|0q&BKW`4=2_5IUhX~c7FBHF6Va-bvs`>)Z;vNDB?`eiRULC-Ge#9r~7rx^K~1(-W7#henk73lk^DBdj@z`SLk8#;5F7$5i~@-!T0oZC^C zptl~5DbnDWV;dYfcR+6)GNz)gecq2XW2w`e$7jVE=i?mRhq^xKE9-L2jCF?*GqUYJ zxNpPOqp3R4qp*jVw@O&_zoa8&gm=f&;f6EdvXgKh(Qs41H))Tg!I5qPF(&a{4Y;Z_ zy2aoTzERV?D2WfgqPGZh#2(0ivLMa~+S(}PmIL3l(L=n5L3@d}8f!*~Yx{FG>^{&B z0N%h6=5pA2!WeukKMXj;mq~ooLBi$%mV4|MpwA9nTVHq^&Qpt@C`8V2{}=Q37MA1u z_57C#eVFg$i~lNPj`DK66UY9npIufsiZ&I9UzU}K*$1u?zbf;Ijo2gqZrKRh-Znd{ zunO~y8OSBA0p8A{w=6$&V5azaSvByIzZ$U|^B?X9qg}irKK(t|5*?S$tX90?{l7Bu zHx+b?p;yR@?#~BJ@_1zj_g3y4xB|4PSO1m&1b96@a1~(5JKr;}0#BDq9*)O9J$o;B zSUxaI=ZOjwF9S~%)mt@a(+tcPKz~2^35cBsrejXpfHu%yAr9zcyBg8fX7Ce2TNn#b z1|6vLORQlgCY=2Xz`q0V(Es=}@D9EtzrYFE{R*<%IdCQT!#farVcsD-(j9^9#wB0n zkjWL`3$jBz{+5&-`H`{%UdoH|BQG`J@nhhRekp);%oW9v?O242NDw==;?A#Bii4LJ|X`?%#`w@e4hu8s;|ePL*#3Ad^dKk{jKB!9D{{I1+PUCVE#l;89F z`OZo?Xi@K~K#Tm4Pq*toA-|1Mj@S>n2fRu7aD03W`c6Iqs5ce$8_>^?VVrzr0WWwv zuok?f`t^Cp<(FFTekJ?&a`59t`-zAA6@V`j7sk+m>%bH2#eVX2Iq<<|$Z>`E zwV!m*pZoEC(|-0N>;{f#Z#j4&eb9z|DA`Mzq*o2zYQ(sFuZ;V&4GlMF3}YUhgO~_o zuXoyvH_$%V{%X>DvzL2o-7*)ydJopkfHP-L4e(=q3O=Qn4Sim{Ex6!%0H{{&d+vVKZ z8+Jb5yUTf`x7&HVx5qi&8*w84>rCZ;N3pIrdUlqyzx31H@Y6l;(GmFQeelt7_~^s% z(Sz{ON8zJ~;G>7(qZ9DaBk<9q@X=%N(IV^Ip`5fe$8PjT7=FWj))Ol@`#AS<^^KjS zz7|FV_FZtE^d-^ec@BEMSFH2&Ko96!=%2rWzKcNry5Vnfus0)yvHlG9Paj5Xo4~#h z+G@mg{bA`x9C5-K|4balpL_#z37>|ikM03K#!s_O6>xA4+;dj>=XKc2;s$SKpAX;T zD*%1T2l~k5oxT7+MZ6u;e`vYUx6fhBT?C${LMP-p5&R}`2SBeI?PGoBsJ+NpUscRQdUk%#1vA?@Ro6qTD(eL<(9TiR zWB&aTz!N|Ase6uM{z&{B2c{p!u+B(06I;a7;P{OJ1NSQ%oIpDbKE4}n;70Kd##=U6 z!ZEJmcM?dSuw!_ig>o6T!A8!c(5cY z2C+KFsp)s*HuE9Ulj-+n>>o_Pwh(RzCCN#c*d zk6i`-g?9=OgT7t353z?s{2Kmm{LoWH6@>xNXPgp8zcTJQ2tSEF_8bPk(_ciUE~%IxSo5n@*r&7VYKBtcs>aK_XFIMkE4te;OBmV z=lBLxl>DqsXAM!zdyy!c|otgZM&~`?y0AF&BwKP%5SP*t!@^ckv(3Y>~zg-Ca4t#ocuf;b01hN@I8(s#kVfd8) z01nt($#WriE*4SvC-OQw&i-Y*+ylNDj|%a#=uF7(D`+SCD*`ghQ2je3f>HBHVv=tuHB znVdOCOv!ond2%Knx%$4SM$9b ze8We`cnWlqWAQ7HKjlunpgo%^jz?+FsLPy(Q?IW)_#4Q3w$xwRF~;|_8`KA7$9B?= z4Peama}Gtl#FDPGgM-k2A+C)60QIg04~W_N9M!a|?&SAi(Umjde9a( z_@I4d4uUZ&-gksu*qGvD#vAPSfrDrR?D+v@OJ~PH3%o4HeDqDJo3q6GWk)r?h=s7kwc6i+P3g{-VCbp?j*o zjPKhCdm?oQ`4?x>W*?>BME^1eWBTi9@RPC|-QInir|R@Wb>W$EiDgCGe{pV^`uG7mhvpQH&dp;iU<@P=`5wXvavOc8qk-A5V-& z>afl{Qf7Pw$CL3B4#l>G133Czol4n2%^U~Houlsh}C&w@J`Pb-&d*nDzXujZw_FpXR+VTCDLLXw# zg?$)XupjX_^jC;4N0dFAz5hGV(LoIlJF?%zprkzmap+O_*q`7z?NBlNat(L^AHYFA zj_-Ga56*w4gAej^1^T-Oc7^>M0bR~l_5nZVd*1+jF5u(PwaWlc9>}K`_JH|3tg-i! z?p3e{hoQ@q3+2pxDD;!JXxf}F5v>=P(MtOO99A^aB=X;CsUn+CHq^z@{EYo`3lsj$!&0tVf{D<9kNnhnT$;gxFn_bYY667a`k$-p^{eRr#On7;uvy@B5S-i2Ya;LdXKiiy5I1* zR6el_`NS~tiMx_$GZ2l>PZ@`?M9PmCjMYknhSphxPc{4EX3E;0Z%m8ON zx(_0dLyvHJrb%CSnf(4~0(oE4{}@B@yJlbNfnFjnqVh#a9Y8-kf^zm1;*8kT;$Id1 zeSmx3RG*-3Gz|RgFY3{uYg??vc>k08LRimzFj2{|`o;Wj6+R8S#C5ml@VtKZXA5V* zcK#ps-abCc>dgN?Gnph4L7YG!@d3FrAja0xK~SR=yz@X3gSJtk&~_6x?b zI@H6|SxMc3QT1xRB>9r09Pwj#_|Bit_)F*eq)SB4JW161`uQPxT`3l~oKMI~VfE)V~aH?-TJdWq^INRb; zGAlqin$HME^{aGt&3~n%3a2*%*I3s72g9X#w${M}kKmF%i+vN{=r@GVow9?7=G32p zOY$CDcAw}DnzL~3$fft-Sz_Vw=?9k zH4a_Pw)Abx0QSFMG;AWR=*4UQAz<2PVGv!NMfsc6e&C>g`hD;Y=pDW!Iv=S190|3_vl?(_q_c*;PY@) z2wz1GKF-V)e3SIE_+YcvLxm^7CpbMAx1vAJhJNh)^IhTlG4R2kPvB2@^2X+P4n7Zm z8mD>uX%G8*<8Su6;t#)v|1JD|7x)gyZxh_9fB#Rxhd<{D_@w6wf0_>z_OtX|^|j^) z>Tmf2sL#Fi?W%-b*M=@dpX&S11H0B}^014qiVj5QF?3MTmp$L2{UGCI-14Vx))Mb$ z4ECS{GA4FzLH86bLi^~-ORTQU`P;psJHd!v{y6%w?c0AOecG;1S6V*t3~4?J3_GmO z;hn#iLhtwyzCz5+?fUjG`s@hnV%kSHhFr(@XuH<5wdN@u^?+Spxqln@=?wylF|Ws4 zXwy`5RbxK2Eo9dOwe~&E`@d}4J1$$e))#e8#W>GMB8cAV0H=I#(VOufTGF3JuhDtS z7c!3S{kW&gu1A-Rq04ro%l4qlZb6rgqs#6EolghrROy4t|O?1-_;7Q4~zt1LW-&THQYvUpR-jAoCK%%O6=Ve2w!zRA&gAX%#+_ z4nBu9_(taU;G~YdGPlCE1HaY*)~5oW*b@ri8yUbiGQb@J0qz(GaK}JkV!#bd>h;=- zsrm$q>eAli61xv=h&3wcI?6$@rKx)DJ<|-3<_6LP zRvpAQHkPZ)+l!yU7xymwq(98}(!Khg`K|A_^1X@gZO0PH5c6K~#Ru?*Ee^!pApZW- zBgRG7xv)IY-%!2Kt-s0lY)i8_)WRBGxHRw@^l<2kpt)_qcy?R3B5+Ur3Uga4?@KQ< z?%`?^f5W4%iVx0eKh*p=-wUnTY(;pLsaXC6-(V~IlcAA{D=UJJHf6KzADqapbJqHv zZXM6Q;C#%qEx*n8TJNjJbbnStE?dg!q0 z*mv+%)j1~Yu@@bh(T2$JI`VsTcR9GNLwQ}uxdRn}2kOrbJdXUV;LN;C^W_Vjdcnr~ zQk@qNG+$UCJdbBD2e*F(ZodF-zp(WEG|n;38_G9>cHQY)M|&2BmG`s0+gd|`nN2Fg z!|MwRCb9$J$Zam?@rJ@Tm>;)Z{(#%SzH-w1cBT?$^0o@UaAA#Gd#7pT8HaI|@)8MSz=3><5^e4&ef z$S8Qd@`!uP2j6Aia>T87j@~#|cIqR!J)=R3TlQw;a434w{*mah4{;`Y4v+AV$gy;I z_^8V{vsZ@m`$)u}dybjj58`7QqF>87>sWhB+@sOCujI>zXN2GtPJth_%9r1``bg=6 zlUtmhMttlW@jb%+?~5QRdl$S=Qr?c+u_$?(WaXx83t+PmxdG z@r~&<_}z5n(yu3-;1DnFU>+VPo%9FzNrQtt-9i0o&pd2af?v2%y`REn(MB1oY`cJk z_=k{_Y4YoLh<5EK?+WVDIO}5n@Ot0sWX#9j1>aWo4)0^{@XPES-gnZz;TZeym0$f= zLmx!Ie=YcT!G8<*Zv+3UeE4 z^c?0ckDqSp=b@8tV(;dDbcmjS)AaB7qm^1Z+0eiE$FI3BX8XcF3=T9c#y_pvcfRYO zWBh%Y_B)ljdpSqKXD)Zs=qb!4+-}a1_{ybD3p55S;J=-{A@ozNDUQ?EanX-2=;%Db z(ZyzMJQOTy@=Io+|A+?FpK8PG;13uJ8#qhlusvf+XDSS$m+jB(<-LskR5mSkMeQM1 zzw4Xw4nhaYXU}0E-vZLA?{&_U@S!waW}huv^q@0BjafP%dyr)JnWOBZ!@lCli-`fH z-@*O}mC4-*1CqBh$Wy^N0WPEzckp5&D?lKU=ui_(lU-eP={KJ2yY znRqwxI{#Q>Q)ALQ9|C=59J?R5+s%GujgxPlqk6q_6LcSk>`WRrFHo<(i}vzxDPG@u z;3xmgci~0*OuEo5J2{KtpX|O5Yd=iT#<&lG!W_#P#8$5Qu`ebg=t0}y$FfVxr&{k@ zPvXz{{U3G@N-~1ZQVYL#3;BHkzZj(d4$yxYvvFY9JTfq1o){RT{|x*h2)_sw@CwNZ z@$C?}6u;;~KU#mhgE1FK9AQq9r*FLrkD}{&%;lr_opyxg%zyrxki7$kG7{n!l2^i| z!?_>TN2)n9C33aKs~PV|YOh`?`xpl~XKV~TeGEN4gkM)x$y_Hsp>>*r4JKIHm}Xza zXTZ~r3F<;li0^L7zK$|bS{-7p=O9OPW_+Fp{|ozFJBv!8JL?nSX<$Q&VWGw1i}`NVGB!9u#Z8Y5~)O-a#!_)o~3 zyJvvg&I?6&O#X3hIn(k6$zl)Jr@d;a)6 zAU-*W?sS0p7HiANVY4+kV)iA+7+(fH8H7)U;E_(jc^-oW<1E8C8)lr1FwVvpXU6vg z$37 zc=YaL8DyT*!5%}=4Dv24x}i^yONW?azG}}9e+U{C|MB<}{+;xj`Y-xc$K2*$h`*F3 z;^fyjjzOn8DC6-}s{i#kV|m^nuswf`aSj02`9}`6F!p=ZhbEA@8s8AxkLp8}qrJUj z*+A+%`c3jua#FAyCr;&m1lcH9y4Zgwe)wq6eSRbxh*vPK6`vtbjCQCj@rz;dC$M+K z7*Ddljb-P>wU<%+l6?Isn|^k9FX>eNhv3yJ?-$uQLlM5!=IXa?V;`8Cqu&S4jdbAEEDOpMXRD+ z%{K)1Zs1PSHnki2xBa{yJPS8JY4`LOjRW<^D(d-9*43h<*Lx@F29e!-f4m!69;Ghn zW8y=iGwJtgf2ZK1{l}mOm%Qq4eb4v#c4V^3RC#&*c3n;vAIWZt;|tI?%=nLA9CJtD z0b}q0gRT@rR|>%cs^9?*JRnk_Cy7T(FSq(GJYdrHbL!n+v-@|TBe}@d(0Dk>`5^Hc zU}4`o?9a!%U~aesdWrzsjNF+lvO&rIgiK1&wz+}eqws-Eo_>q%ISU*~#Ns-NTaEDLb1ZeQ%xDjvm^u1wIyskL`eurO+4lqA#Qk zdr}O0Qq0m_2MTmQ=?rbgZ}o)$vK^hSS2)&sEtSPRy%#?%+Qs-CN<$mz@kBD6yDu-L zbwb^D(ysZD^!M$KgRZm$T>PZMwX`nXNc4n1v*kw*1ge{qzMM5g&z4t=JPk9yG~A~k zdc|(aca4i+K^omZp?d=?-(rr!I#sfTJ=<4W_WLIjsoZy!`7&t&<`B9}eQyLg9tRf12jHo-cE8C*iK*_I@D<2^ z!3aHQe_3kI=e%~HM-pH3fghTpt8O$IWa85oK4+e839WikeCcq>-X|MZn)GOm;asZV z&9r50qPF;EcO?5P^IP51TEjTKxA)ELcG|(Y-PtgDA?MzgpI1K>`&5hhHRp&V>amq1 zW@@aO%MzN0%rY+$w=ALYQql7izt7$CRo3jy#8XM`LvVm;f#!=N+4JBR&&3B#QR|!8 zL-=OTr|$Dop}oE)X!i*EF?aViwoYGF$9&5@qPti%PS5upcDW}e!Fj2!WCwfPhaA?q zL*|7BJODxX`ZWF)h0q-->W0YU*3z-`Bdvzxy|EhiS-7VmK(F0-Xo!GO9u{M$| z-ZtM?QU@MWMUg1+bLoS*S3SyIv<5uShi*kTZ)S@V7h8Ovhkg7v4bV1V6eAQPf=U-K7e&+ISZPPvQtu5kP@T?v1tQ2|+zWT|u!Jow7 zPeR@U@PSNjjv#yWv7)=F>(qP1JR6QX?%C0UjAgC;Mu1iOV~ufphqA$ku^=z zps8WAFkF|LE9p!UtsO4mJzf;8F9L7iq%UM1tlxnw(Ki=9_L}B5&@fnmX9yR&e~jI(r-#m=?<+8oEbZXdz_VL zzAx>Tnhbrd^PI7*n>gn~zD^%{c9Ppk`T;rGe({k;Sl)S6u($}dMK5^mn48((EAxC{$`MQi}rp;NkiKX&tED1>8Yf2woc+D zAG?%)v+|cD)J$Zp`;8dB1ZQzvw7kSYFt+y4(ikR{4 zNNwS~gH`ZN*3FasGd#Xp1YcGB4*06Rv6f}$RNv!!JR43HjojUck4SG|WKLsw;O52= z__yYl6&4>Mt2YGA?Y*3d1|H87f9<~;J#EIw-Ax-z^hgYz&@Fj@e#2efyQA0vOF`rq ze#N3u;jsq%3_{;u`E%I5y0Z<1T&8$GrDZt~tj-Zt`fQMT&Wyw2ko246T{A!+GPQ2Cg+p&LOgAe(z ziTYS?#RgwfFt=Cw^`~{nrjoq)H1yZw{-pS_+ArP=P7_m@8@3of{ryF7=kFDsjp>Q| z0p^d%A@-&WS3A| zL<>8rI_Cb8JIy3V#PjH{1Ugbe@?=XcPeri3>DSpu5AVQt7n-L{|4y3g`>*4CXZWq9 z$8Pd7Hv1lBET6_%rdxnT<;Q`i9X)I>@A9uq^DcaS5<89N&D?S9v>*d~CW^ikMW+zo z_NA)%CKyBG{@&ntINUj2&mD~S_73OlOGamOU{liFlJ0o8SG?c5Te3aT<>OvSXlWH| z3ej;-E~w7aprw4fdx|*+s?>e{0Og4;GL)q>zh+LMxvu72qj}pbHujJY+pG`W1si)! z!8}p)mBfz~0pJLIEz2^wqgr6}yFNc>D^UNLKB{)$ZJ^)_2$>+&G?6L#!N%DUqu&^-$ zZt{3Jp8aB?1>C%eePk@3e!^?_)9~gqC_9DjCjI09aU&9xUEh^e4%g={c}9q zkZ{TOSLm+79W;01oc!QPxSE_#YhFrOC(biXNzWj!#@+AMGfw8i!-AzP>h_@fwQ;`Q z2ymRoeXQtM{TQ>P3t7~GdI+ob&a}nd%~aWnFu@SiE!`8gg-nu;n62$#*Obe zM?OjD&vD%~bYMa@*pY^R=Ui@mN4IlIv2B?#d~TrKwa`~SztaA5F5Ui#aMJAcG3Pa- z!=~Ei`B;w53)81_>7&>RY`F(KyWvMpDR*}+T~EILyRrm;SeU-b!`u2? zdd`Nhe6z58os+KqK!*tn*IJu3TYQaet&B}wq-lOCd59m~Wo{z!T^K(DV`@H#H;d<71(nT-J)BaxMvg}N<q^V4vpEicVE!kPXa{2}u9 zcwkpV4q@xh&zIkRWo`{HQus zH-jE;h=H33yi+no_~~R$)|DIoj`?^W_`+Tx|BG>C{Wxb2eS!J>?EYQ!p~~%~y!kE`Sb76Kh`{67IYcLikrP}Dj%;5NZy|k6F1^b01#g57k#!YLqx#@8*vjQ= zu%5I*bLD)=ORsN=nLqm)izB8{a&vm%apsDzHUAo0K6B&@`-qa;iXU|~j}&fqoX98r zE0X9YUU&SY$ZNR2L9#Rejrr0d)xK5tmF(wM|Bs*74!MHeCUgmj6G_G-r zJu;aZukSV1=2Z~_19?{L%F>f90bJ*|ozJ+r$rGp5UL#*rVK%RQSg4!W`kBCpw4$;J9eeg->Q+UbKCwFCyN*56wiU!r^pQBA5r`q5$zFHVxZScQU@V{sQ?-PEzv*BLpN8*E8{{TK59kr-Jtyblw1Z zYA6_K3^FGTV9PHLUeq)rxUQ)@u&9Z1s}JJ~PP%=GEsRsF1{I$@z`C z@U9kkR~x)*6}&47eRLI!$0+y`Jqxe4{Z>w$dLHj9$QqA6h0|owYYiHomDsLokuxsy zz%Fo(EQwcH{P_~lF1Fl-2}d}DKE4PJJ4pw=@X_MjSLWC$3-|W8=7hz8;-*gG{M?5W zfX=@tzC+n_b9&MA+GiR?2UoF%QG3wdS!3<-8slvT*F1j}^-1R{uX?JnmU4cL&*uT^ zQ-68%s&lfdbMP%pAOjjD`&c&~JqO$iPGn;5M}ZTc!l&QKmW1EL$8-^G6dzRG7Xp*| zS8`i&w}@j|i^|eNMgl z@BP4yeKqxB?mlnHed#t);1fJ6KPDSx_Gw!l@9TjtMmYgf0&P9#_|elg+AcJz zQ##?>UC5O6v>)AjpxaCg^yKJHFhZ_YJ~Q^fdo<42?Q(B6E959 zSR2|(d@b?r#H+~?@;wG`zLEGMe#5iYxRh5ps`+3s@@a{qb=?}^F@X}d4IgCsBD@M8 zWX#RX1NK2@6T2nfR8+VKDtIQ+2Mfd0oyG8dk$g}C#OeMdnD4%+){4=Zp z)ljDHsaE-+KuNtVpE-c^w~MV@h$IA$U|7h5u9LK2Vrois`4@&g|KlZ(&9H0tHzZ=5Wq^>a^9PdPqcQJm}GY4T$f3ll3lb!;8nmT11)j-z~ z=(-lV&fA|x#yp#5;W+v!YxVhYB)=k!qblf^c@ea*)vh1Z)8DKC*n45cE4}ew1l?$k zIKGo~3DWbvIw3y#m&;fK80$dq@P}*P@x#;bKY1tYWH=Mvp4+g_>XGqb&WC>>(ABtQ z%-?%YAlj&Vs^x21<=6ex2b*tYt|1=6{If3t4xsmBp)EqPS+ZaUdTuRub<9{SKZ=ce zDk?M&{KOv7kLF_1b4N&5!~7c=-d`?zik*kgW?a-I5c2|+j{EWHjvk3JCeARiBb|(i(@p#c zd#cgH(no5rQ~ONj@UN_X3?FQlekEEdvTYDe?Zfst8~x0seX()BvllygYCPVW9Ij#fn#!srsj+zs=u0dE)W+9mjzex~~D>e*r(m z?^635D! zUbu?2GL>uLqbv^|6X(7fd>o2W^0A5_4;C8g>K84xL5s)*Xm3NZ6I$$o7S}_IF=RqF zGNGqno@Z&R&|V5X!W(mYNId#8dEEvZfaL3e34gEZ)q08Qmfd7q@tS(c+9LXAJ^C(f zPn2l9GVj@M=W`~pSH48Ft($jnl9)=LeT%pVY0`{+wR1mXU*nrP!TD=DMZaO%E8Yta zc>1?(T+$mS^*8ZfjjPFdg4YJkO9jW%%+&%`E`c-ZlPvv9a6ZX@Pqvi^KOX+!#{SUZG7~@CaxBq%ec(=4=Oy8*bkcjCZ$(TZoI!V}z}IaU zona=n3(@ySpws+#(0KXVI!~Tknqh7t+m+h&B>wCt{S={=d5#PJ7se87S zx0*|tkIL37+pcVf!r{5#<$XCm>l(kkXI5!cztU-qkF^`xA4|;;4$+t4N6y%IIC&0q zRf}HNIS~$bp-T#X74SFa8@8>|A=O^tvWv1b#}z&Y;rTuA`Nz-|H22lKSKrj{pO;+_ zn$Z1DEqv2BY~#DWtz~W5;^U+jH^5iswDQuJC9seoXP3C*!}Ji^mQZ4h>AkKbVVm75~Cy{MU2w(z!yTlks29 z#qU-5=sWp(WiJx!^79HI2lMe?$i)v@I49%p%*A700nW+z&*b9MN=XUgqau8sDNl@g?|gzvx>w>`wHb!_bmTyyjngL*H2)ZsEK2 zYgxyA#Q2|t;In$Kg1?GZMUw&RJFoa5Exm_l?VTfM@Bm4;#Z|LX4o?nmLL1x9*p>I16&0&9${FY16 zFaH!<;fyB65whm>o#}~tduM>hG3*f1)7y^wx9eOs@fMX|8q7A@y+i0>HRd_|8iLhr z$HLp=;7|8t%na^s+5s-OpPcf_60$eSpX*u1muxE5j~Cpj4B0|HPCPPhTf|%deCMZX zO&QN%O1hfYo>FT+8Ovff*bF?>H49jKY(LHiuImV8i7nK*10EHpj&k^x;=q4+hxD0s zw!Z$&j9Ga5XpFqw>M!8>DZVOg$Dcw5&fbRY>hT>DoY@6@ZO5Ksol@{#K=~yWR_0-c zKWO3o+0GHp0Fy6|VD!o_Aze^yNVIVuX9;|LUa@3#SxPc*KXzc;Wbo5JXwSQL;Mvnh zf7V=c%)edv+m469^DfF5POP%~;9igKD*iz|vbz6x_A3dOew!KiP1B#?V}3k)LG^{4 zcZ43skt-#&&uW7t1C1sDwSM|yn>*`f0RgUF(P zWj#&5*{4EiPRPekZBkyrrTkltb!_+YD&6u#C;62(P2S1&PnOZc9>Fu&7i8qIomB|>FHD3ymJLh67Y$~gTXn=)Xu%MiTiXOKZq}I$cJ3ShV5kQZM!}E)g-EX z9ev-jcw=qUhn*69NUyJ`5PXN@Q}D%5S(>95?QbRi|HdzP(DwVrT_M)-4}gD@O*opP zW=rp`UJk#CP+u)&$IR+#jfua(e%ZquN9*ugn9qa)Zy=u!Svvm@d}mZ=Ofs@P)4YrF zz4xv7bH!Z6r-%#D)`h-ko#qYVkN?EjV@!;W(ZNY_&)2 zQ+vGjEwkLC0Jn=l6y*8qaTJH7r z=I!7fSd866`NY6a;UQhXewyVWvSoMlbwPjFPUwq?J>}qHIzc#=U1tXAGnB0|^=+84 z)F$0e@vzpeC`v zsT^CbSH>#xcQ<=FNDNCENE0S8pE- zZrFYRUxQ4}*Fa+}CHaZ$ftInSeS)>8jo8c|k$1W(KYA#BIj^1m1 zF*?T+)<;o({;ZKv)-v#kKNo&`|5oHaFM5>TrEj9i4=~qrWwSUMwsw2>DEt1bz1!sc z$O8$_-i?3UV*K>1EkomX=|Ia-Xp+AC3+6*zlc$?dlE5V9A?hl#2w5b!D-7;8_v^yuD(Bm=Q#9lVSEjJo0;fHu4(jO zP`kYEb8Y<#slSA^pPu91yeI#C%W?K2GG8AdK97$v;x23X*r(*{iA^l2azaNFxw}5* z0tdbtz|nFN9Pkk4Sb}3IFvP}LFS7aWO=cz%(CTw>;YRg(HV_XlQ-Djl4LVXE_PV5l zUQ>f!gKYsD+RMpzv#*K1Cg(+y^R2YzTkIuVkBx8a9j!$=>;ZhM`7Giz_mZB~Lz)}V z0b_jM#C?<}>w=TEur##kzNddcejVr)XnL}K(Q_63E4m%acJQpW_Tl}<)qZS8%vZHO z=$NN0ZAS3x6)q(!_Xa!Weh<3Tyuj-R+3h>}z6?#-wTwzZ`O}ZN%T78 z(JS~<8joI^fZLcU34)G!2SGg(T zz5@@EJmoHR3s?O3y~+K@h0EvS`$>x)nVe#6XtKr4OAL~y7ap!N&QzZVgZ9~+N9gFg zgZjO;VZY(K@{Ew@dfErioBQ<9HP2V^ya!qs#AkQPyWVl1UnhDQn%viyUn>Il#?a@} zeBRy3<(q%eoQCgR^3atn`^_f?rupWaKM4O5Uq4_T8OXo`hv9)E1vE24e)YNdpmb8l z+?yO_9an8_lkCGcjk^YtpPgY^{!#7ZtRi?L^v`*Wq3?3<0{6>=wl}PThtA{-18gw; zXNPt)e3~;0W`*u`|AKQ6t3qFLvB&hILN;)YZ(qfPwQJvkk6JPGH3Qd%v257- zplj|X86|looUdnI%mOfe9Qp5uPWs-)_bd6X`PVUMKs>S*I5dZKsjqzVp=Pg-pGto8 zD(?Sbel-Q!%9ppdK)+Fa4&}W+SKjNn@e=h!EmO^7*sf>y zhAbaTB=4AES}%I&%2xRxg#s&@LfkElO*>J+9nvk>oo>HFY^lpVM2Mh~&=rvBopC6UMMdI}6T+PK+@NRQ|80 zrduwg{%fZ?t+yAaTiODK^Q;y%g#y!?NV}ADOUI_N6cC)#SZdM>K3hD{5-{-vC6Q=@ zV7+1L3$51&23ltY4v_wZr85J2nmDs_sm@lgcr=ZDmsd6~|0}{-i`|CHkJK#>ap#BH zJA}+BrY&m66#Or+F(lQFE#NcXpIYBlyQC+IPIR`M=p@A12-?qW@mhe->dNz5?jh)m z5#5dc5%3!_&oGX`5AC%yQ2E1_FA+)tz2IR!_?-`a=U?GK4-qr3x6L$Kye_OfzxATZ z=GF&zeuHOu;G+8S#ZJBMIuBv{QTuk%hEwTbho#Gt=|T6-3;wzs{1KB(`WUAc{)pp> z9z+-CRra;0z4!4v@5naVaH!#2+R#RN!}#r_9p(6nc7gl%N}q-Ys(iuMW;R*+7tc}I z^D4j0`3(MEmA{GKfdI$21)c#9^T5MA@G$R+dC=LvGQNc~;VVRaI$L{vL4RR4#D_sL zBmf_u>@UIInro}{&h?a`eo`O5k1}h(v4KxW4yVxp_M-y~q5~X22gop1htUB>;JGHZ zuU`5ke084HF~MIA{8sWK0>Aav79W8)CuOquD`T2a>B{4`^xi+7D1I7sAs!$qG~4SCQ^a@~<+!owcTV zr*K;XZflLtiGW{k-EwOZK7)+${2om1uLpb?&iD|19TX_}xC!PK@Y{wgEA(>{ZdqUG zmoC2;IHhZ|PS79V+(_xC!iPOO2RtCJI6p@F&R%8RTjO))usO|e)fbu*&bNKHFCkeuk2!n|^79I_ zblPF&>Cn>6(Cn8IrHr#0+N}E9&REeZ zeW<6hv~?!%Rs_CTZ_En|UNA4TRO&PSu58*A;LbeY5x&@Hl+b00jr z3^W0pHzh)>^CMFe7t_Dp=whEhKUe$pUF$YF$GX;s4QQR_+wA$BXdntN z#;$~qCfiZ6Pc@i_ffvq-)H6O`zL5~HtTr4*g;#a)-Id|d4+SN3FiIh?rPzDkhUCemcA=m-vm8qf583F zfzF(@vK)E9842!SQODdmKj-{$9z-4QCFaKZ8tgbhQ?gBad=L9I=Xfp-zY3RcF^wAE z97yhJjGse%{CeZcR$~Hg)3()V*O-4w^_G>?%kJ(A%x}CB8^TiTe>zJCWomRfWfmdF zWCy%}^?m8HrPxn4nWAm?W9tr@U|oxUP94fmT}fcS8!=ys8*>ZeOtgA|BffT~iT*Nj zTeSZ1(`VF&D4TPEeyKK9aNZ~W7yYx^T+Z9L2R-u1{)l0(QcuRM>~ib(mW{Zh*@OMl zd))fb?3}m%uI$&e*Li)a(nKxDnQHMMJ6V z$2sFw^TLgmk84gSTGSZP_&`7ZC3|id$D;`!w0k@|(7(5Akvmhm^F!HI;_(yS93IV% z?mR-fquGyR_y1KxXZ8!$zWP7kgMK5_E%;S$70*uU?1J{zBco!>weV$Ntw#RB69aK* zZwIuO!nU{9Y}}R3!4`ntzJ))5=&+bQucc<~hf~<$MVlq~KpN9YTWXvt+HlEj(fU27 zKVQ!t$HUW1`j=-$Oar>;&a>MLbFgam&fLg(6xELDF>a{KH1wCvqR)K&RXwI*G`r@= zK-moXGj>@0Y0#hewsQ}0Rg`lSJ~@K!G(F_2!){>vOEeh4hWthP(+6GNQ;}}edVqAW zGWb-g>}S+*ex1vHlAgf7HQwek?kvm8-hdWc!VBRyQF|`!a6T-S*Gmjkh$Q)8gp~;9a7rrhwi>g z-@A~til4$dXb7C0o%^nD7gzdQLhw9&pQ(6cH)TJ*t*o-a1maEH^Ul3Km(6`Cd*x_G z?dP2J;avM=Lzn>{79Lum0gY|ZaSP>2j}XtP#kMUy4&D}CPrRjb){=Yq8r$;T<2qxpT-SFn){U9ixpi-X^7;5WuT_P@c0 zjysT_R+_TN$=~|;CS6Qp4m)NzKi&l2&D5ju)ro9i?Fjj_AsJ(Q;S-VUL9g9{e?*+| zwS)1MGOM@mH5<048E1n9I$5fKzhX~CC;J5U)Q#9vACc|pggteWiCBM~`%MV{@3$-; zl}r;KjUhY5N5w;njL-cNd^3Pf5rg)v?g_33jjy%B>JN434>yLdLtl{oIdEA^J-We> z{?*ItSz|wpj)`o4vh@Z+WyMhaXMG2m>*@UDCzon`=kDwI-~r=Xj^Fy*!hfgMW~pN$ z`vYem`%Ce69#VWX7r&P{AAQvh9u+^RHCxi_T$acA=I7frd{dw4yIo7xcX0gO-1lV# z-&6Vgn={SZa^IH}eDBGBr{BMw`+jl3_jnGj;&rU==f3C9xlsMFeExw<^H*};8CMoQ z(eZlni;hK?Ad9uxE9);eY@Xl#i7}k7HaOY*vAUf@; zTt3>8JdJ$#k|b4z+9e-F*(%g7;Y{uMd)iWCitHM=bT;N&$r{EIx;t~3eaS)_ahmZ` zPQLfnM<(Zn0qn2h^@6R7_FM#9#k41A;zPoj)~E)Fe}s6QKSaL`OLor5w`U#ec6^_g zYtNaq#kQ0B6@P9nenviiz>BZS#h;#!U+l$C&&8MKSRGB?# zo0MKA9Mr-yn8PtA-pKsz5$11&?eB^+*X>su=lI;`kvGf{;iJ&4=5AGXUd0+|`$0>; zf5N(&<|5ERd@jD-;=`Kj&NR-OQ_W2}-*rv9|H^t}o=>!!&Gi+5b*|3s+FN!6-eKOJ z6@0M?{(7XsEPBkr2Vmgz#SISxdhiuszl{0;0RFzrhmLng_!rqVZ(mDU*P4a(8gu1= z+nDbOw$~brdBFOjRcKw5ek#;uYM~G2Z_I5sFn`<1{Ox4D#m;ZRi{`cOHm8*?z+901 zOI`6E@bVwvUb5NZ0=(2Rj}dMpr_1So(Wv&zs^2Se_|cdy1wR_o?1y5W_F99+-Y~ua zr^5TY=9=PnR=*~%`toF$C;L$}EF6jNqpQY+C&BwZqhPkFX|`hkJ}Q z3&DMyeIjwi1NRQ%gzr<~{<{LWqonO5o#6fgaQE1}9^6|LpM$&m4}kmk(T8W_nBA{= zi)iJ3@GU)ZkhKHJ+Ps_%A!l2mo!ErhH`Lrc;lZKyJwy870&P$RXC@j&QCHac?*4oYJcGHt*Xp6Q1h}yweOXd^&16=9;~xvCGsGcdYrzz*&u5 zmM%8gbs)zit#32*VAr-kB0Z0`)zB{ahzj@b1Mkvu;f>cF z;7W9{6uM~3(Z#Cwpo?S7$MfSgMA|CSi7xg5lgqo48?P;j&(ZylI)49nHMzgE{Kwio ze&gUjR)hao1pl$xoPU^Tz6$<`4%REaBRTB^WXD;U*nN#RH_*Fy5IRcuYv|$PO?p?n z*1pk^tqpn;-)w$s2V(t_dSiS`=F1^IU(V-poe zIAdMwgO#6b-F;bSy=3gp)t{<|r;{#&zMiqVy5B43gD)CqIp;4e&=|PQ_nX%1%=N9) z1J^bY$NEkTn_#T|Gd})-qhsso0DpTccr98D& zZDbrU?x00(#V<$gOy}CU|2^9IzFa%oa_wAI(9X|#?c9`aXB+KP zI|pf(=;pwLA3qVbwJtG8+h9kwt;5vy_q0=Gs+}rR?Yzlr=bGQwPR*aCJDuF0k7(X} z(mIiNS`l(w`|iYJw1yF-?f*dAH78iaoB;K-Px^7bZ)KyDv_TskQqN zu1!R8bFviek<7LIOBtFMim$0XDx)@guXlb-hwiJeWhA}4^7*Mtbd%qu{WGYmMeV1) zJHbhcxV;v~zyMCPE|@x1k^5>C6T}`?TjLoe!o#<|Z(ylU%myu5Cl~(o&=9#~h_V!#_rTajx+}OK}_fDl_ zy!+`(`H+Ue9W)hIKJfJ*0y{T-6^n#zpV!HH-H@_+>Z5 z9*Pux+A{(_Y&;#=p)#2ZQ_sD&Y?XzKNH}(UR@ge8&y_tp2iLX-Uw7fry{V$Z4bb3; zd_JGA$#5nZx>ZKLdiV@5?+^F3fD6I%WUd^Y<9XhT>6Rw*U+#InUU%+`@s{w5nU-bd z2QEU$o$FichJDSh-$({G+I1j!9Jzc_n>}#vAuSMbST?KaQ!5lweoua@$adIxj z*z6x<-0v$`cN0I&k6+n9L}Rk`cQHR)jtt1tjp7+&_T1eMp{LQW@h_eeZOpH4)AxPQ zRnqfu+Xu|vT9L+u^j~jZ{Kh>g&YLRKf&Yy<-b>%K`N%IGH+V|EXWkDA)51g-|Ag3smb zwREuywLzcge%9~hE8K6W^_AK93&|f2J;B}!)n&rSE75UDLg$8x|B2`7-g%|bH^HOt zikE(V5#JOqUYz$gQd)g~Ki{H!>*Tlip?Kj}*LZ6r<)M3A!J~CXmFWQEO~6$GT<4hd zh|1`~HYFXepWIXoasmHZ!vl9izt&ER4-0zb!12bUR72c>;=3zx)GKe+#tJ2HmWJW}?`dI+3wm z@NsnBhht{r!|b1VxW_#4u-1h}$S2#A<`DCs5$xdhEW#Gxt1%wDJnxT~eHM1c_typU zaJJ(#M-A+e62lGoLTwv;-8a$_QUwYY*N|sLtRw)rIy=Q#9Hbq zZftL@__KDmBHHe&*w%hp#rMb?Z$DUkaOE4tZ>&`Qh*|Qm@&R-22zA$*)mw8g_SRL@ zwZot9yYs<#Yvit2tIC=YxD&ssHbPeuG`M>)@xZ^;S8-3fSO31G>cO|?z6fxoflDxZ zb*%0cEUN$F%H9^iAUSgTgKn$ZQwuDD&#QknJ{SE>ZVn#S^pagGOsm=}xV0{00;b8Z zPRdvwxP3*uMR0g9EFo`ulj`^C-PgOYay~u**t=dp51~D}3lU$aCS=@h`ES@g&G1S3 zHSrp>zTWsZ?FAo;!DS~nxEXv3_CfkmcwJ@gy|1;RwVks{?pt2*srIOO>c0AltJ~FQ z*Hrv@yWM|4TSR9b?!QW({dK#);@e)$#bfPioA4pL&^H5<_;|VZwc^((b9D|Mv++ww zx1wL?`Wio*%97>2z&(u@(J!BW&|Q8B->U*=K~MGg8~7NbOH^JC#tpq|!ME^P9N67> z$AeMkVk?@81IxhYz5&mlSLgqG`1~K>Q?j51{?G=0ScPsMg-$!swbq-}_s7hJ`@0zv zJmM_#w`p!WVwP;v7}pvyP zWozoBzs)i?)P3#JbZe#{*~@7-lr);(4E>dMopf0ntVZWx{TA?h5l zIrP8=enVFDo^_#@;+W;L*{B`=73SZKZ)`AGm8?>p{lM z#l>$m{3LkoGQk=&GwXC0pD8)GW+v;M*eAAlFlilR<1TaL?&_ePb$3^Xc#d%|^FI7R zrv?7{8n>bm`uF&h$`Z{BF7XS?SE=(2#`w>v(^vAw8dLJ~HMD)pl)%@n@#@%@xaWpv zSc{##B?9b&!MbHRm=hHyRL40I+;8<-^H$DVM4s%*<+;D-A)Cj(;|qGfc%%#NGK|x2 zJaqF_&s82?xu|%g;o{<7HHdDTf#>;P+cKAN_>lp5S$~@nO#TN_sdP-#&lV z0eJT89M7Je{NP=gs|xvEbcJc*49ojW;EYD`ypli(ye-{$No7gPrL5Ec8*Bd$RX*4H zt;)l#i;k4Gtb5+ox^DgSz&iNf>fL+G{;M9o)t4q6zPR4 zzpI_m2PMCzQTG{*;?)ajlOx{)v!V9^WL1p!#Sh&LyiR>T_k~*60@K~trSe@EYQA%Z zX%UPj@J%cK1gl^d-WLIHiau|wNVcc5_4h@QRf1RjB={w_I!$8J)yONgMR@}i&mgm( z+LRx^L&Za$oV9&6zFqph*PfS?ADlHod$#7-@@1*c>cP0i>a1z*1*S%9l0 zy|+E+v=(#jDf8rki|<0_n3sFct4vxP+(#V_@m{$bzJAH9S6csP<@euY^+D=>?(_Y?57&z_4Ud{rUuU&l7LtYTSveMQrW{uNBZi|{F&6j!W8c6YQN zDn7JQvX^=-Ef?Tr`}~Lg1A6vkEV^8B!CmRA);=h_^fnd;{>HZ9_8Dr!?B0bB&9VAO zF**qF;Ag6J4Vik^{x2xb6&inEBY1 zPHD-|8uhL6>ns-L$~iv%GH15^H)TGuD@eJL86oz4%`k^um2W=wgX*jBaX!R&R@o{; zW#`LLUb|K_bFZ!+e_ z{w=|`ngaMi;Y&)onW?;=Vp{Wpc5hywIi=>4noC9s>^j(gkI;YiUeGqynV2tzSF&bC z9QXe%vFE{PZXMxF!i9Sb^w80F(aP$UMc;B-BEItaXpwO*@~x=9v8dYR%oMlUS646p zmg%=)ZzfOVTc(8%#78*C&~Za1>Y|tTYTu@8ssVEw_Lnx`zLq`F&nGTh>1(}wk6|u# z$75YZp?Yi+$xBy0*;@Opbn9J3|6YHoZ>;_@-{lRL_>RB}&#WKIzSk%x9a)B2&}BMm^7>rU<97q(bqo60pyS3L&o+}-yt}nH|N^|4vN#UH% zqIkS0({L@eBc0pw5uRh%ROO$bIj-oCb69(gxjCWvuHUYU4DDQpk0-wNtm|;@E_XcY zj8h*pc_sP3ldZ-E=o}50o7e~K*mao9;|+u5J~)h^QS zD_{?1B@gRI@NlLc7PiE)LUj>Y@ zTS8&z9>0TzgvLY^IAzz=dKvbzde`ql8}hx-+5$GF&6(!d$F)X$bKLjBtIdw_C-DWG zPus=pbk6C}(*};Abl?m*9A^O@WC?`~Fn*8cZ z@``r^&09OwA5--t1PF=;_W%Fy{~!k1PbqsT%<#>9BWdA5;G@1Y9sJ&I7!JHAmyd7}I`5-{cf&kRp@ zj`v>cc<(8=g}$eG>btqXdv|ls^g{1FvIt`)Ww@7m@0}R@l`r}s?@3Pk$2y3Cx0tai zVOVq=d9Q3k<*$wvrXgh4`v z5T)HC1Vg(yDBMH{96DhJ2^qr3EYbr*j1VUb0!tf}brFPXy2N%yh;~LF%kl=#%7@-HGbipfPgh4`vU@oFQLX6Nu zNa!2H1MYpP|eVLgAnC zd8v6Y-cGmgx&Qvmm@^9B3x2z~-)A%~YgjpN)iqaNRllO;x`nFk5BhU+sY1E@*LwwA zCvyHn{@h%mT>b5TWOkF!Kh>+>%l?N{oJ*6>Kc(TCx_Rwatyn|r|A_1->JL(X!@NH- zGZp3QF9GuF+OPg&sOQ=pY1wu2>aSZ?w|rjnM=Hz{Ce{s~*<0*0r8j?OP3PKA zcLmMgnUEqc=0{n_MaJ(tJ}v0|7@HQbKh7E9$IW~?OELN}_qe}kc=*j}Ri&K2i8C!g z-R()8psxtd^aEqI0PH!c(IKYW?=xq7a_zb`cieRQ+O@ZK-gwie?yxoMRa{~Kek+C^v(kii9J4c-0vGE=C6pc@qYixOT-vb#BBY&&nMl%_rcV1-P^d4RX zyGZ>KxpsTt@gR$e*{ffw^{*{_y%z3mM9vxY``+{yDb2I?)6*B3+knCE15*Bt`U89Y z{^4m;%LXY^E&MUhvEy$}bIM-uYT+?D?Hs*2KWpv_~D~7ZK{*Mo#^$(;#{vs(K^mjug8d~ z4fxFI>h;^#-tn0`Z@+1+*XR0V`}~&x<`)j^kAV!o-csX&_VFgKzw+8T`55yu{FpD^S=FtL?tSKAEVPM^q~JjWk-09@q9b? z9Lqi5$vuzep2u>}<2(hAA;V0nzuMjkOhfG*Wiq_)>I`$HglG2Yjr zMYerbUBge;vMKr!l#y^DuRoOXSfx)tK7m2j>>Kn^{V2n>y)D5D! z6Ulv+Tu3i+2|#Rtvhx<1u^~|HFB;S92Pa?0rd?fDVv`aN47P3uD#F@CFQ1@~ zsi)=WBZQ_>Df;LkMs#)Bx?BEy?H%iGzvb3XT85zbOM$9viOLqdC;xbJl>WFfSDh=g z1k3bb$e*KXH}K5${x%;H|L(;%sn5< zJ-?NEZpl5roqPV3eFn?E!*kj^;j$4-oam{6Gx9wSd09d`K#W6=pEik0+e?bKT z7T$8d_$tWB!~Z2CYFgW3%RTi_G1n@^sD7u($PLaqj)8-gww$f%S3Nh0=QI2(sk+KpAl#lr*VP1krt=xT)9|gZomd={hofrY3nYj_r39Fs; zzuG(dz`Ck3-JhJCwr96#d*}xiS|C7$A{Bz7R4Lj*k#;N)X$wVg(zHoQBu!$HLK#7W z@};5{gs}>0RUA=Js-jk`8nt58Dp5NcnT$q_n$cX1W9LrPT)n^NS!?f{gn0ey{&jD~ ztY^Jz?e~4xyWaJ^_CD@Spwv`UvKzoH$e*__nBs2mB`VwlfR_l| z4#1CRsItIPQvoWX2#2JDoKWcn5KSxaW5t%C$zl5M6Y4&AF)XeFtBq6ve zIS7Ru1e#&dWjzT&RdK1j9|xltc?Ob@`-mTluK#r4LDvwe`B>tgy2Jxwgeb+_C+)_z zuD6#0%I8u{jJH5JS@p7a5j_)Q$bv9<)NN~NZfxyhH0-RuuF-vza=40qjaX`+kO&lx zq(J(De+Q9Xsu%%<3-tdPl~q+06UFSte|7~BjZ>um7Ekd3@Hada2Ch+(D#vccJ|qx{ z$&}uL{|F^8R%bSyW>`$}FR-}_N#zT27@eryF69VQ7UHt%o z)FM#Zq&Ext&m~)>?QNu-$Al+~$$TDh1(uS9fo(AYnm(N`3Z9hGBPayQ(U?>@5;}>~ zgYZ+yZQ}rBhhUdyr}C7Gd6!)9jFfKxp|gkS^HX{Rg+P%!QBry52YKf~vOED#9$o~% zD#e5xx1qrpX0A#uz(hgrOL7vK!c#$kX|aulBytCv5)EPu#7IC5Qd7P6!l#(LC(W#AK~b5C z1meLk0*t2lQPl)lKB%}DJfs{d{D(plCLjV8ZQTD?B@ZhL3wPJIGShp9r-~7%=@duv zmFnkuNOCjya;C*sQW*xL+PFYBMHnMW$&)Fw2nwdyp+u=<{yH>gxklHA=w97RzYj3p zOHV<{M%P0p$I-Qx?bi9~#kFxe!u)c2U7f~P@#SQDd^~O;;ti3z7^N$7U!dBvC8#_E0Ry4PfKa;un)F@LM2d7&mly+nu-=M`_+fC1u8utdsce2F3DHUs=sdk_Y z4~~Q(_BL{60*6z9Dx~+hN=te7?HKmCx*B(N)ot7A@l?cTiTgcpw^tbqF|qVc)&kNq zo@TGObDVA~-`8neH09@UjO#p?Vv3@!E2R7u6vcUH0vY}ki zU@B-Yg3ho{JsW>S(2~a1&Yc}pk>xcu)HQcC?x?$=xwCm|OPC?#$k`>?4I%rNs1;DUDeH{ZvWgOMwTksM^sz||1_lPvPR4u+ zEshQic-DLbjOqmHRW#-6!_>pUO;*CmI-Um@*DO=0>-4D5mQ-6dq?99X&sB` z=J4;SLI#6UXtbXmMSb3{(SRK~HNgkTpUK#=EXo+d6fSf(lpzk`W;8Z5XMQB&LKXTC zk}&|oQMpXqkl0IV#_>SPadXPC4@$TEy`im@&4S?XA|5M_e}SXNeghUx3#8;=Im@Fd z%NkgEvp!sUZ`$s+b%a+C2ONBnTt5)_=Nxtr68ktAZ0eUk%>S4P)!&Led0pzrv+f!ZXs{qMn(~h9a80I6R>M z`>9YXVOcqLLeSuX)QkbJJ6OS<+zR>An(}%sEsynFq}`pWdR_}x+ktS+*CV{Qj!WkI9ZR%g*dHm^}=yV(mh^Mt}z$ME_Xw#0A;p&n!Ax*%zf zf(l88$wQGgXLNARxw74Q3hsXD62KJwRKwZPoV6r-g0Kfl^&BP$I!&q5Hfq}Jm2wUx zNZy9jqWs!GRVff=hQ;JQ6(vr@*rJmbkMg9ocqd>AEe0XG@oq^wiBTxEXrWGmacWzt zgXkW}_aenZt-%0Z9Vq#VL!ql2BWKn-G}S}_8pz!X-36sP6|jR1jM%q{ZUG-j1sF&` zpkxB>CTAvK^ceycox`Y}3TST4x;fEbA}f9}6=2YppC*fb7NUpQCjg$r8hCf_09D*a zTk=S-1U8xULqu%9UW&I!jbaE&3F)(BzpZU;Eou3bFjL|Wxo1%Ah?KD!Nm-R(!f4+Buwql_ zVDd4njA4P0bI3w6JrZWbu&9K5f$50KHhWWSco~?xiF++Jl}KKqkI;Sd-w;!(g`&y8 z2BTwxgG!sTN}hLw0%V?7b6zyTUM#dwPTUSOO>7Wy&Vj1!e=L)adwM6Ww1P%N6)eyUV#*p&4*Tg# zk>K^Vfy{3(9Cq>7AQjR@A(MdzdT2@tN?x)_-ljZW)UN}0ULjxuk~L;h<;VkN$3ee+)T;p-nHK z%$d=KUK}fJl-**lW{T%?EN)&JbO&O4j+<s4QMAa=zUkp&Oj552^0%>GkJ<^(~T|0QUmy;m^_DB zWb#jd=Z%hX%IEX5DwK39odKAlmF`^`OWQ*$^?}_XD0`XA&dEw!r*YGcsx*(6pF)Zi zG3fWC{pMGdY$)%zl*7}p=g=*23g8h>xTKb2;( z%;I+VG+oouU~19<+WkKtnpSU2H;*c0f+>asQbCpn`iSf$ghUmnH+dN0UE zBm|)zp(-8{#dVgeP{>WWRwDC0KxMK@S|Qm)C>@xk1|C-h9t0u2d7~R;7740c?PNVD zlQ?5xV5mY7D#?mqSrR>UO1RbWozzIhZ!9b07$+Kn_i$f6BX+wQ3?Nv+-{GrEeE#g%^P#t_YDRn5(M4?aIygVDWNp4OOsy@@DXu2 zMKcmgd8-r(L3rwRm7YVlsLLIML7BVYVy*6sI=HN&P6Tg);<9Go&1s&u*uLdaybxh` zlfhm9KzonWZH8xaZ;*eOT(;7~ zY4(p=)1cUpz4qdCh~O@tH)Hoe zseTrlv9S-Ha`vK39+N+X6i!Vo-uUr=pHwL+Eny&ho#GT7b#aIWH4nL%L}gNP5C`bd zZ$X2gAk0LyLSQ4__v^lkTdMh!52(IZLFg;L56db|^KE8gV_|eSBG%&k1M8xwbunEm zpreJl+aEc{57Qh1Xtzl8e2r@HX;b1Yy?*BwNf(-`65<@>OVYn9o4`+;MNx}1T_T}J zk*pCY?LeAC0FfoFE@HW~oZ#t_*A<$mdbyx#5b+n}6X}#fkZ7xexnqdWH^wDi2#}{NPZjAA%mOJxbZQI~Q^U z;2hAAt0w(lPLpMYXk61Z;0n7bjw)GpG*I~hP=Wsx`X3R2Owbo;%_6?R9sX+JV{mZ0 zAR0veML-hEGbpaCZqgOZai~xZi<$m}AUvUk4{-%}B&e_{oW&j^G7(CkLpat!;Q{W z+%o0`<-qE^B&7(L;-#W83s|pJ0BZq|LxjlcaYJdDXhW?L(6fNlNURuLQ(8G%iI=CD z{sCZ-qD%x@F`AMAtqrXWz&9mqpv$0IHGqwy;=Tf+)wx1I>IiU!hKo}u6YB1&)PpvY zX1%U12NwRylpQA*d0U=#1cRbBJM2*X8(?qeFp9``>=B3vVIUj5Jfzo zWGaX-@O%%z4*4L!JVnWXUFW?}TonLZ+Ews@z?ne3yDIx%EE({yS^B1iL=lZ0@JCWU z9|gFvJW@u9>%m9OCJbJWiIYaZeel5S3W6q&OMEdQh(`J}$e#L{GT>E%%ko*M8E{$H zSO_{CNFRU_7tc??J!Ds+&GUH@8JeWU7rZr5Oum?D^A%}R(7r*){M8g33`4~@)jB{8 z+y$)6*UEwC=TAbhiN0y4Ac}Yw@DPx3Unc)X%7{!+xo<_~4rj{s1|7oS^j)4Xm+zGW zYxVthz*_wbinaP>npqSN(LXN-ergbkrxpOW%4#Y23#d+pMTn+#`zuoHaYK}p zBn813!?93>1QeeBEx--r_W)b+I&q(YGE_dlV_nf`!Rmy^pw3&XT zpCOQk!A+@&VnxH5f{EcQK{ofzs;WFPyF49PH*a7-okr#&t6@*>>^WjOYu(N02JvrrJPcA-kp`xWk zfl@CDsS30@S`$(gDD~oysz9kPyV4Cw&ja0jFOk=9YcXV05a#e}q3b1tb)t9$!7m|& zz9NFEM8FMYy_4JyE(78U#pH4uQc-6i8m60S$q3xw((>Y0+U!!n4{r1K}sGA+{0?esNH zYbUEY{oN?p#GoU6ptB5k-fiu>pk}}|wKJsz5O#WRNFN5!4f;gtW-IjCH0AF`gPhmF z0JUz36=B)Xvc%vnuZLo71lH<-H(FY^a;jLj0$hmzjjqEk>>W^TojaYoJR0bCkz3r} zLlzAX1LlBgCkcV9E_ml&Res4+;4!su3t3%+&a>)F>tdNLQ^qYy|j7Ik41^rW65F9w`HMNE_x+s5T5- z0tS36%?ikjvd{WGmTB{;pbbIP=5Zq)|8zO9?9ZeW0aHGEWmpKNkx=XVNlvv9_85Ht zU|m0#J}lsEpeM?K{qyrs4D?h6T&pBS=lT+9c58r_qh{ZeGW#;XlFKPf=Ho>7Yb3j| zJn6ckMh=N{1+R}-;J1l|!SygX-I+iN;5#W$5>t&d^>U5#wuN#SJQZ?SQg2H9ZXnwE zzLyfeAH<``zeeOSe3(Hv8^fC#;uwCIk19-Y$#?zb7rlJa37pShdw6cuBFSH@l%KAW_~5b+N)7zxq(_3~mkLQ+Ddq0xQlWPa1S++G7%9c%T~KDK4H>wTdI;G= z+F$T}lm2q~wT;nwdywxt741-JvCBf=-re5Z*wVn|B3>UKe^FFfPLUeFN0w)92D<+f zDEQ1!xYN-^)~v7xQ(^50^X-KJ2|JP73)eT^#GTL1a1&Wnd2ceE{Ym@lL~w-CO{9!+ z$7S?Le}8}e935vKt6k9=O*@|Dtxql)^R^sBb=icWjR4|C<6_X!Ict(7WFZHExDYHy z3-x6{&7;TDW40LJ*Tdmn`yi_Obo?iP@ze1sNSReuHpMEqE4?1j1f>S6BwO{eetZ44 zaBMBIP6B*=(mm^`6lJ=$Uk$W2bnkhV_kqtO(aoP|n2Vh)pyB|SWGzo>RIGx6u{p~^ ztg0+f>6}&`sBs`@C|uiaL8q)FdzxcO)^hakMz#-1NhP_yxuvD9r8yqJi!9UX?qnDv z3^Z-Jz=s2lN;RU~>-7!s$9X6dHJXarf-Cv;;?k?RfYO8Ch-`d#Xoyf&o9&5103Tga#$G@Q`V$LhVg;plkl z%XNR~`qZVUhjufE{q^B#V6e##|#hgj+24@PG#Z0Fri7_bP9ODDZ$hxhmm! zQhux;%(ma{C*BnpR3${M_5*}RdWVL>Mb9IYIIG{P)@UPrgvo2aRZx1V-+8`GmUh46 z?`0_cS{dx)X$cMbg3h0m>~MSR(^6~NK!3iV8vOzZ9OhLHMo5hZ0Fj!OS425w!?*yW?p^wwXg90yOP~SJe{g&pgIi{3H`Cu zdVLPI!D02!|B}ZfO zBLe=$1GB1R#8Lw#)^Q-=@X8*J#sL5A=Qur!x&Ei)BuAA==e4x_0NVc%C>{T_F?W?* z$~_$s@gv|bIf6eCRq|5N0mFlSkYh3(WLWV9I`YCoBXc$<)3i;a8&|$9T)@Qc&i_i~ zjQ8+aot@hm>x`Z;)L9dh?&IPm`)9h9ljT-(k!W`}I2;D4c_R8XN1uMtP*p}9W2tsV z@-wv_=M0K5e=t8oJ?OKE%%FSc);o%)0XO0mD=Dxoea}x-UnxFXz*x?Zo>=KEy9LR4 zuqraP>K%(JUArSI52MZye{}`_Qg1V@C!g+ka%+*l{cyNa!WKDD-?AXNiY(|Z?$-io z2MdyGHsvf%gz2L-s4&8pSyZ4#WnsT+7=<}oz}rF(rBj2-u|cE{hkNfW*w(di9bmjR z#!2JonJ;cnk(O2Cnj2#^@=95lt29ArqUjZPwtC7KUgZ|`A60uds}L&Q1VF3z1m=z2 zWbAga$P+;^0<5a`ce_gmxGPkgg0avov>+zaZ8X(wAA_H!yr)jMcQ$>)#x)mTG5PC6 zzPMh!3s+=3u41m`IbB0zN9Z|};)&`T&Ppe$B4sj{6Y+4UiK=g>%pS2c5dz`?fJa`w zPIQ(!l8-5ix>5r*HGu**LV=%hmQS7)FUctN6V^ZTxC9)l}B); zI&Kv6N|N5L=&0KsKE0wWe&_CK6!n@^z;h%4FP(o3ux$bMDh4@a3bixn!Yj{oW?xl_ zP(tOp*Dof&A!=7MkW&rIGF4i*Ek(FXbP{0P6j_N5Lv|C{PZRO?xB8&$p}EbCCE8Zs z(xN%N=Zi}8R`Tzq0^PkT;E$HCiutp&*Z#Y-tTyza9CMbJ!vMg+FDrDGiGS6bgN3Z4&k=PIH* z)YVvo%LJh$vXfo@!thK5O^xBBTFhU5cCJoET%sat++ZT@T$qVUXDp%PDJ3_UrZG$e zXVuL6wkfi{Ez8PiHQEFN}rP?t3=FnjE^Wv-!Gh zO)U+UsuXVx-Fsr(8WJTdg(7B^Z4K2zSp=&RYxo;mC)bivJy+jDA>8;U0v3d_{{tst zZ{}Mw6nQUM?fwGXnDz)c%A&t2d6axq2LW>l1|%}bzxC8(!Z6W@^$Bq02sNnDc>jsH zb(m54fe=UYvwDaeAk!>=Qly8XmXa^Q6f%Lb5~!^bzBspzW0l72Qn61|T z1LCtedXUlnBNT-|H}^6TY*2jBRA7FI4dT8u{CODCe@i9WX^%AG{-$bs1jm z1?GMzwUl*U=g!Xd##Z*#vQIMF!IW;d9z#X0`Fr~@5Tjf7q&(%;-eEZeWf?pZeGRRy zzT>(Z%u3`2wUC7;#a3;=xGoa}A{EST*hx(4Y4%mg2`9OB31kb!^eXR(C#jJy4qQqp z;G7i-CiJLr7-6==*8x*l;^8}^C3sIL4vbKCpGvJW5B2-a?Hz4=qcCj$^^xdWUy2OR z+YI{9Do}z~pN57*Y=7{|uJW;fE+%K9EiXq<1eJl1=LdWH`uvuT`tuir(h-Prm9u!S zMtQ5!hh`7PU6p=R$r|`WZ;r*#dpxIkR|N{6am*bz{$|Tm1?nZ6Uvhb=)mw=ud*(!d zXZ1>f)s%}C?HwsSnaN-ImMFiQ%J<%LEtDQcfs)@tZEU@vxudOh2c4UJK&gJskMe%s_93=Y>OZmT%dAnME>v? zvnh9KgRsgpseN12_)bdv#shy%$#V7RX*U{T7ih;T3X4 zej5|e&g5}w{oj{GLNFS}u_M6@RY=LS8zvIw2vms8P~2Ua+l+Se>-j3=4SIjeI|5#+ zxaldwGHLm9Y3602k!&sCA?#O3ABuxX6%S+ruO(uE?U=)pl3h@0PS4iu78G1sDehbN zmc0t**@3ZS2{5Qn9~+jB{~3Y#8AI_M#hc4TR^Jmv9!jfv6_h=QoWHH9kpr^!HWv9T z#Kz003_5O2s%qjXkU&*GO+kRmF*f;eH6BkCNIy2YIawiHlkt9(I!RdjJSW$9{234A zv&7UUea!h>unkvJqh9_j|AnX_)2y*`_$(!wWyb8fH)vfug-&)@NtQ zZ?7N^V2Q!=Q_Az@p0X^KyhB{H&3F5fga@7 zLG#DON@)eVixTj{>NU1zpiA#!0%fBt>lQ{NfKC9_IDI(ZzzUNc4K<)&ig+~c(f!6b zU=V;LYO3}78h^qvba)S9WX~Ah37BHWFmhk4wC=bxn)GJnRqHNWbNN-1#~i=aQ++=@ z#~HlUb6rRM);i7=x3<-HG}Q5tSYEW<*%>NXne4lNtd7>42z2|(6!-I#kuM386Htmk z&dfsR2pOlH%v}N!rl0J2F@elYz#{kHc(&OhD8)byG3R8Kd`!PZoEx4ZP^FE>G|1Sg zm!fj!)MNh~?Zc;JLfWIF?y$wIWDILrkn0CgIHG7?X4m-0j= zw~I*DGd)Km!fq&~b1HHt#P21ww#8X(_&RUL&eqoK`@&>(%R0f92yNL|RupjORSi(% zk{zC%Di=VXzkPKEHgflUCN{$r<*d)e_TDAlD;qCJR#*gXcP_vV9zedb=Q_2lLUO*v zL|`8`MU!FG&4rdcjv~oRGNokzBNm;zas;{PkzX=A$SCL2ock!U{aj{>s|BHnd(m`E z<0fAD?r37|3M})W3uRwTMQ(9Jb7wtYpQ_usv$>^<&vAt1gAMJjtBH*5s@zwgg^M&1 zsB!~kBtO4jhAJhmb~)t=94qQEZOpfsNbbJ_*sJ%luLZ%GkF0ti7GRWO`DN!VP)2Ez z3p%^n_@vei9c^u0bAhs}Xnj9InHClk136%%M8F!uN6|;hMHU~7<<$(- z>%3|xHOrZ=c}=^EopzVFp}wo$rB%B3XZ{6w9?=BmsWlq(p}`|iX49iS8fH;nI$5K^ z7a+O|A*$S;BkoN#0exFW)90SDOo2POgFBRiEtoqbXAgV@u6TkraqJt1c+QRyK_LdU1F!{zstnoUQ#)EnayOz9m$Tt)xVE7e^#C-Y7Cw zcOl?4&A$QMk^K4ye75K1z|@ zUHlF(-brK@tlb+exSPJgO{*J9JKnuO>rOSUaU<59V>2p;&O?*r6ctM98flIaNSa>E zIt7Pvp#2SIaL!CgM4ju1jJqhAM@DMi{j=NtZSc<&Joo)+6{l^X7RtjYIPaMXT0N!v z8}KJe$RLM`ZecBuGp=`~T-Cz-O~buV+H3fx;WN3iuQ&cZc;$P!3cnoguC$3@(Azm& z%cfK+_VZ5B&_GO;NkI9z=wehD>I-XwhsssE`vbASMSR**^@pMCVj!;CR^PR)NgIf* z_2GhuQeGitR>IiLR$xY-zRt{^T`5_sN+>w+u4b~1bXr+4Sszje)Q1x=&l_ge7r(Uk zD4gv#9|la}HxGU=YPkq4eaox|$|AI!6F-0))C@}srJX4~uatVy$Y5Z2h<~2*DP*F_ ze@u0~Zal~{S$!2g6vb^x8+tXAYU*q5jdA(9tGTnQvo0K=D)B{<*Nr@{83jCO8w{X9 zq%aT05>n|-Lj4SihuNiY$fO@irT5@1o}&yvsXdE1O8FUux8A}eB`9TgR8~(6-;N5t zVJ9&25E4yM$MJ3`Y`nVr18ahdpQx!6lD(vHYd~>djQbFAb>m7Co~5ot;23fG6z*2# zXjx|HpExDw<4ZOSFf#YYxf?6SF8N1zD2v<#wUu&Hvml2?8nOBaqQawubIAsUEso)B+E$6 zACcshOaPp+4EGHVz%P&a<8z|=E1m+@&y=y= zgY2U5+2>Ppl1~u03HY<=rf7W@6j_IYRmsboEu)0J3zG1YJ_fK$(TXRe!z)hZQ@8p` zJ5OB!nVow!jaF&@c@S51qyGtDywOiV%9=*?qp@Lj^J{1Bt+qhf%?Ml-K1f^E5|nbY zTIDrT_K-$MTV;#Xlxh5=h#nXjo zEF9n+copyta$rjZM?=HjgAy)K9bmkSS%L2Rc-qr2Ai6+3Q26A2u4-#bee3mcitMJX zlzA%9J<@4VCl_pBd$j2%DdSmsEb?rk|8Qry3`!sKxj8#qpTSjWH;U`~T+-0ejgJI- zy&t;m^$=BGNMf{@5Y-2@hkGdT!@`5TnL)6L+=!n$GE=!{Ks=yNhH*^^)xCAN9Qn4; z>3}ILwDc3PG)uA26o-tLT)eUNs>@biI_ZkEZ|BzX>>k#3MSe)A{YH+;!iWvkv)8vC z8-IR6;CLxHf#P4L5askNNz3YxS)})qHhnBVPkmRw5%?ODDDGSy2DpU^xFZEffh-dG z9;o7~T<(hm+)yU~4=bXCTPWBb>^;*AJPsq-S%+(U)GN>TZ22zKvD&}t6-R!~ASggJ zcoXGGSh$J-Y9%ARJn#*OTnm=!rR3X=Kn18%9_0XB#r~e2l-2_ILlNoly6-UlBUwK> zHb*mYXV8Ca?g%=N{l~|8TBH0x=?NML22g<3O8Z$5%gsIkHCli!X=xPt1j)N9vZp2=Tae2iE6pZ=B`IY|FZwIVl!E{l_V0rH zTs$*el6jhk>_GpvK&E$;FTlwif4qP`k+w(4d3%?9HfsPQVK-nYie|>B{#-Ohbu`AL zOAc4AUcYY5>Wvpq@+6;auHxD1=X17MSJ&LRt+lHo%%es2Is6$^y4Ovjl=L%r^l`bh zL|XX2_o-?i_*AGJ$_jYRzJcF#VkO>K$6jFk(I}F%8cwdRj1wLM+Bz4fG~mjzU6r|` zx{0&1(hfy1IG`Ie(7B=$ob6_?I|KnvRHTes~9GjdT*6}JzBX5^68F(J-sP}7ie%b9OXnXka^*0l-BDwt2(`cI7=Z5}{G zvaTPG+!e9_vaT)V>~2okRl}~Ny|BBW)WEKC`}VL{5y7hVsNK$=^w)Ja|I17YrK<8~ zZnB@qLH=)BtV-2A1SKbRS*J9Hk6??W<DZ1(p02K^XaSp_M{6|@R| zp2Y~v?7<{EQMvYGQ_GR(J z7xcpIuPQF@$)>ZRO&cl6YQ7M(0D6B|P&|%qHp^pxakET8$}Dx@V6;>XPq-}&Kxuy= zZK=JPv*WGoO-4Jo_)7I||624!09dK(DIu6cIiuasA z2g8>JtdQmawIKZ>9zSQt1LRQP<*}D!RZm6>{t7AM7RZ=oVyF_R#?3(R@U}$^e?ALCHb*g4Fe-xV`QmMKii!w`DML9sU*R zQz&&e=~ikV-Hz*UpG2z;%e=Uuu{~bFRO&@iY^RJNKQoXE3rxd>`N2z6kajl{dZ{nd zc1zk+()g-d3*2y+IKL zQIQsSWr`HOQKpEGE2^Ok(5~n5OFG*+nzwS80(}zXUrwl!59|Ak^d6qS>AdW(%Fy zH-l~pVm&s%D^p@DRYDG>dC_STu30DiruyZZuDIyp$+rpIl~*5TQh@KdD-W+gPwdK- zVZF@v0R|hZEig@L8*sl$Bkf0-3egzl4UaGa4zr~1lkN5qVehMueDZj{+E2P`b16*S zSWf~>(O9qjcC_neD%j^hyPyocm~$XCR{fSiV}0vHMU_LpIh=eB{VMtS9*$bpBt06A z+5go@>2Csm1x3*#^d;Z$VEQ#BGRPcMK_F=;;nM(4dy>Cac@OL}lNX+f`aPWLR}G~n z)lWBxcnfu+e#&v4^m|JB^@s852ysXyGh5O*^`NhcOrUPeD$&AIg47*bU;8}}v zp`Wk*ZkZmNzZdn`O+ENVW;c|Y7jYxAy}pAVAk%Fw_gkAQMci ziyX<%k|%CLUZMXeeJmgDMgXtOi~Ca2Gw!>HxT^QyX>N*ppp;Tq=Vw{kS{phi3Q!Jx zzBt($3dCFA6F|HZ_+Yu5{iz(StSzS($_S-!ljql2c6RaGBNLoTIV`6+Wj_({qtGhP zk#adBsho3TZ#ik!yJ^Gvi!ZL7H0!l%m41K=pO0(l&BBJpmah8Hv5VfJ(zcyK!`5`k zK-C*50eFNo#joTrk2poX(B;3KJnP<*sQOWDiS`Y$m8q9a$o2YD+->y-5`N&CT7c-R zrXKoXtf?LvgZ-cv%6>FHX8ayLyF$7Y=r*Bb|M1w|2={Ga0k5)5;U{i+1s#1-JCZ+> zR?`=y?V8$-o3FV1l8Yz5qiH+V^5oi;*l}A&TW9B1KK~KyD7v=2lUo+%@(a`+1g7t& z`+nm>A6OHF#g~B$d>a(6neG74jC?jH?BXaJ6H1R-cY?iEoEk7OC?+Jm5d~Bcyra5M zwIg1B?C(ZH&#nCa8tj|>_?s5`x*I`$hDMjSn)()^?n}rNw7VOiYqb2ran!-v2F@r; zD5L!c2EhbMveFas@anQ3+-*6|tXo?|8T`1yy-;r;hhx_JVBnIyBV~DiU|C2=QePQn zOYcncy*o{QS4z>7HZ)J7q&Q-3cV*;(q73$GC3$vdVH)CiM1c~hH!JNnQ{Vr7)?fd@4_6TmtSh%h;L=Cd+^_)>psln!<%@cP?lZ5 zu2|>wJ6pmgtVrICeh7xMDsEG89&w>Wz@<3h3V`1rH5i~EWcrvhJqpQHY#?o*YpG7a zB&a->D#+BB#{t985gz(@tch?wvXAP6NT9M4h_8a+v7fMH;`w|ZJGY-ydP#wnevUB> z3uY(CR~-!l;dn~S?lZXk`3n8#(_@`$Na7PbWtTZ18Fp8ZT*DKA)cm|^i5D(7oL45z zslFhU9Ecq;A4z%v4H=< zu$jInIUKl-2gChxjqkuw1%E0eE6|g@AxfY`0;ZxVplbKeY0@ZmbAOo&KlJnH!V8L1 zo?l(P`ij-uAf9~c=~IW&AhQFUJ-MmAu7kToZQ>oGe&>r%;8b$DtIPcA7QPA9?HoWO)7BBQnE2w&k4V(}*wXQ*$Km6u zfCb5~fZj&+gTEyvPQN?O9X|nVlryx`zZ|C?_P>tvcazND38jPuKAMF4Vg;|sQVQR6 zlG`0DFYnT!SYEBnyfv^EN;~D9edVPa>Nfgi`_&sZdIF@Rvt;Ty$Vj*9h55c%(L`^7 zXQ}Z-Xg!Z*2HuqlT$>trHcla2614RFra-Ymm)JrRJe>zd|irh(jc1{P6D_LFS_*lqt{#L(Z znm!wnE5)!UhSm23`tBGXxG%&bUaSdJKW$MWor@qIDuNz-GvC5AOI|Ed_)#&YaS%Nxs46X_!{J`kVpjr8uA zzdNSyj`Up2*B<$AiD7TdKM=#c@wt65ETzxKcy$`TKa{r=`Q{?On)JCC)<*hB3_o!} zF82rgL-nA~2yUKFyyd9@R1262saU4#YC}HA%%r_w!9T z{JeT=MeZ}S#hNoHBz``C3^DIThRV4+@~(+>x+;d%X&uLKca*&)hV3!j9qW2k47;Ol zwK3iv!`@ftaxV;`bGk^?PF)T(a0wN)YPeKIGvs&n3c20rG<`=d$H<=}OHLPMw5_Kr zG~LA8=N58J3ZtAF%C0)Us5O`4Cj{w{DD!^K55T%TvW55n&r}oEwlTMWjv6`Lk$4=e z3l);t+@8z5f&``M_P|=wbg5v3=o1}03uE!t8Su3zrX%7Kd2%KEq#ONj$mI?}S00^b zHK`xmUcn$qoUP^o7=Q1zx!hSXk2XpN@qyjsxez|uRsE2J-^!H@;_`EC6|8_Za9u@i zD{*Zn^bihAk9`z%P$Hg-w&;yMxAqOW-0P4dc3LJMkkhe*-Vfg=@66@iNGSi(3~Ugr z=^e$-jlj2`uo}L&N^aeoa=9j$C~uBob3a(KkO88-_@-pnkQX=m|Ns6UvB3WZU;d(m literal 0 HcmV?d00001 diff --git a/driver/xscreensaver.exe_decc b/driver/xscreensaver.exe_decc new file mode 100755 index 0000000000000000000000000000000000000000..cb1754bb313bf07a52f9554b0afbd4cd9b199135 GIT binary patch literal 71168 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 literal 0 HcmV?d00001 diff --git a/driver/xscreensaver.h b/driver/xscreensaver.h new file mode 100755 index 00000000..2397bf57 --- /dev/null +++ b/driver/xscreensaver.h @@ -0,0 +1,74 @@ +/* xscreensaver, Copyright (c) 1993, 1995 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. + */ + +#ifdef VMS +#include "[-]config.h" +#endif /* VMS */ + +#if __STDC__ +# include +# include +#endif + +#include + +#if __STDC__ +# define P(x)x +#else +# define P(x)() +# ifndef const +# define const /**/ +# endif +#endif + +#ifdef NO_MOTIF +# define NO_DEMO_MODE + + /* #### If anyone ever finishes the Athena locking code, remove this. + Until then, Locking requires Motif. */ +# ifndef NO_LOCKING +# define NO_LOCKING +# endif + +#endif + +extern char *progname, *progclass; +extern char *screensaver_version; + +extern Display *dpy; +extern Screen *screen; +extern Visual *visual; +extern int visual_depth; + +extern Bool verbose_p; + +extern FILE *real_stderr; +extern FILE *real_stdout; + +extern void initialize_screensaver_window P((void)); +extern void raise_window P((Bool inhibit_fade, Bool between_hacks_p)); +extern void blank_screen P((void)); +extern void unblank_screen P((void)); +extern void restart_process P((void)); + +extern void restore_real_vroot P((void)); + +extern void spawn_screenhack P((Bool)); +extern void kill_screenhack P((void)); + +extern Colormap copy_colormap P((Display *, Colormap, Colormap)); +extern void fade_colormap P((Display*, Colormap, Colormap, int, int, Bool)); +extern void blacken_colormap P((Display *, Colormap)); + +extern int BadWindow_ehandler P((Display *dpy, XErrorEvent *error)); + +extern char *timestring P((void)); +extern Bool window_exists_p P((Display *dpy, Window window)); diff --git a/driver/xscreensaver.h_ori b/driver/xscreensaver.h_ori new file mode 100755 index 00000000..ea792e2d --- /dev/null +++ b/driver/xscreensaver.h_ori @@ -0,0 +1,70 @@ +/* xscreensaver, Copyright (c) 1993, 1995 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. + */ + +#if __STDC__ +# include +# include +#endif + +#include + +#if __STDC__ +# define P(x)x +#else +# define P(x)() +# ifndef const +# define const /**/ +# endif +#endif + +#ifdef NO_MOTIF +# define NO_DEMO_MODE + + /* #### If anyone ever finishes the Athena locking code, remove this. + Until then, Locking requires Motif. */ +# ifndef NO_LOCKING +# define NO_LOCKING +# endif + +#endif + +extern char *progname, *progclass; +extern char *screensaver_version; + +extern Display *dpy; +extern Screen *screen; +extern Visual *visual; +extern int visual_depth; + +extern Bool verbose_p; + +extern FILE *real_stderr; +extern FILE *real_stdout; + +extern void initialize_screensaver_window P((void)); +extern void raise_window P((Bool inhibit_fade, Bool between_hacks_p)); +extern void blank_screen P((void)); +extern void unblank_screen P((void)); +extern void restart_process P((void)); + +extern void restore_real_vroot P((void)); + +extern void spawn_screenhack P((Bool)); +extern void kill_screenhack P((void)); + +extern Colormap copy_colormap P((Display *, Colormap, Colormap)); +extern void fade_colormap P((Display*, Colormap, Colormap, int, int, Bool)); +extern void blacken_colormap P((Display *, Colormap)); + +extern int BadWindow_ehandler P((Display *dpy, XErrorEvent *error)); + +extern char *timestring P((void)); +extern Bool window_exists_p P((Display *dpy, Window window)); diff --git a/driver/xscreensaver.hlp b/driver/xscreensaver.hlp new file mode 100755 index 00000000..078c4284 --- /dev/null +++ b/driver/xscreensaver.hlp @@ -0,0 +1,540 @@ +1 XSCREENSAVER +Graphics hack and screen locker, launched when the user is idle + +SYNOPSIS + + $ xscreensaver [-display host:display.screen] [-timeout int] [-cycle int] + [-nice int] [-verbose] [-silent] [-xidle] [-no-xidle] [-lock] + [-no-lock] [-lock-timeout int] [-demo] [-visual visual] + [-install] [-no-install] [-xrm resources] + +2 DESCRIPTION +The xscreensaver program waits until the keyboard and mouse have been +idle for a period, and then runs a graphics demo chosen at random. It +turns off as soon as there is any mouse or keyboard activity. + +This program can lock your terminal in order to prevent others from +using it, though its default mode of operation is merely to display +pretty pictures on your screen when it is not in use. + +The benefit that this program has over the combination of the xlock (1) +and xautolock (1) programs is the ease with which new graphics hacks can +be installed. You don't need to recompile (or even re-run) this program +to add a new display mode. + +2 OPTIONS +xscreensaver accepts the following options: + + -timeout minutes +The screensaver will activate after the keyboard and mouse have been idle +for this many minutes. + + -cycle minutes +After the screensaver has been running for this many minutes, the +currently running sub-process will be killed (with SIGTERM), and a new +one started. If this is 0, then the sub-process will not be killed; +only one demo will run until the screensaver is deactivated by user +activity. + + -nice integer +The sub-processes created by xscreensaver will be ``niced'' to this +level, so that they do not consume cycles that are needed elsewhere. + + -verbose +Print diagnostics. + + -silent + + + -xidle-extension +Use the XIDLE server extension to decide whether the user is idle. +This is the default if xscreensaver has been compiled with support +for this extension. On X11R4 or X11R5 systems, the XIdle method is faster +and more reliable than what will be done otherwise, so use it if you can. + + -no-xidle-extension +Don't use the XIDLE server extension. + + -ss-extension +Use the MIT-SCREEN-SAVER server extension to decide whether the user is +idle. This is the default if xscreensaver has been compiled with +support for this extension. On X11R6 systems, the MIT-SCREEN-SAVER +method is faster and more reliable than what will be done otherwise, so +use it if you can. + + -no-ss-extension +Don't use the MIT-SCREEN-SAVER server extension. + + -lock +Enable locking: before the screensaver will turn off, it requires you to +type the password of the person who launched the screensaver, or the root +password. (Note: this doesn't work if the screensaver is launched +by xdm (1) because it can't know the user-id of the logged-in user.) + + -no-lock +Disable locking. This is the default. + + -lock-timeout minutes +This is how long after the screensaver activates that locking is enabled. +For example, if this is 5, then any user activity within five minutes of +the time when the screensaver activated will cause the screen to unblank +without requiring a password. After 5 minutes, a password will be +required. The default is 0, meaning that if locking is enabled, then +a password will be required as soon as the screensaver activates. + + -visual visual +Specify which visual to use. Legal values are: + + best +Use the visual which supports the most writable color cells; this is +the default. + + default +Use the screen's default visual (the visual of the root window.) This is +not necessarily the most colorful visual, which is why it is not the default. + + class +One of StaticGray, StaticColor, TrueColor, GrayScale, +PseudoColor, or DirectColor. Selects the deepest visual of +the given class. + + number +A number (decimal or hex) is interpreted as a visual id number, as +reported by the xdpyinfo (1) program; in this way you can select a +shallower visual if desired. + + -no-install +Use the default colormap. This is the default. + + -install +Install a private colormap while the screensaver is on, so that the +graphics hacks can get as many colors as possible. + + -demo +Enter the interactive demo mode immediately after startup. Normally +demo mode is invoked via the xscreencommand program. + +2 X_RESOURCES +xscreensaver understands the following resources: + + timeout (class Time) +Same as the -timeout command-line option. Default 10 minutes. + + cycle (class Time) +Same as the -cycle command-line option. Default 10 minutes. + + nice (class Nice) +Same as the -nice command-line option. Default 10. + + verbose (class Boolean) +Same as the -verbose command-line option. + + xidle (class Boolean) +Same as the -xidle command-line option. + + lock (class Boolean) +Same as the -lock command-line option. + + lockTimeout (class Time) +Same as the -lock-timeout command-line option. + + fade (class Boolean) +If this is true, then when the screensaver activates, the current contents +of the screen will fade to black instead of simply winking out. This only +works on displays with writable colormaps. Default true. A fade will also +be done when switching graphics hacks (when the cycle timer expires.) + + unfade (class Boolean) +If this is true, then when the screensaver deactivates, the original contents +of the screen will fade in from black instead of appearing immediately. This +only works on displays with writable colormaps, and if fade is true +as well. Default false. + + fadeSeconds (class Time) +If fade is true, this is how long the fade will be in +seconds (default 1.) + + fadeTicks (class Integer) +If fade is true, this is how many times a second the colormap will +be changed to effect a fade. Higher numbers yield smoother fades, but +may make the fades take longer if your server isn't fast enough to keep +up. Default 75. + + installColormap (class Boolean) +Same as the -install command-line option. Default false. + + passwdTimeout (class Time) +If lock is true, this is how many seconds the password dialog box should +be left on the screen before giving up (default 30.) This should not be +too large: the X server is grabbed for the duration that the password +dialog box is up (for security purposes) and leaving the server grabbed +for too long can cause problems. + + visualID (class VisualID) +Same as the -visual command-line option. Default best. + + captureStderr (class Boolean) +Whether xscreensaver should redirect its standard-error stream to the +window itself. Since its nature is to take over the screen, you would +not normally see error messages generated by the screensaver or the +programs it runs; this resource will cause the output of all relevant +programs to be drawn on the screensaver window itself instead of written +to the controlling terminal of the screensaver driver process. Default: +True. + + captureStdout (class Boolean) +Like captureStderr but for the standard-output stream. Default: True. + + font (class Font) +The font used for the stdout/stderr text, if captureStdout or +captureStderr are true. Default *-medium-r-*-140-*-m-* +(a 14 point fixed-width font.) + + textForeground (class Foreground) +The foreground color used for the stdout/stderr text, if captureStdout +or captureStderr are true. Default: Yellow. + + textBackground (class Background) +The background color used for the stdout/stderr text, if captureStdout +or captureStderr are true. Default: Black. + + programs (class Programs) +The graphics hacks which xscreensaver runs when the user is idle, +in addition to those specified in colorPrograms or monoPrograms (as +appropriate.) The value of this resource is a string, one sh command +per line. Each line must contain exactly one command -- no semicolons. + +When the screensaver starts up, one of these is selected at random, and +run. After the cycle period expires, it is killed, and another +is selected and run. + +If the value of this resource (and the applicable one of colorPrograms +or monoPrograms) is empty, then no programs will be run; the screen +will simply be made black. + +Note that you must escape the newlines; here is an example of how you +might set this in your DECW$XDEFAULTS.DAT file: + +xscreensaver.programs: \\ + qix -root \\n\\ + ico -r -faces -sleep 1 -obj ico \\n\\ + xdaliclock -builtin2 -root \\n\\ + xwave -root + +To use a program as a screensaver, two things are required: that that +program draw on the root window (or be able to be configured to draw on +the root window); and that that program understand ``virtual root'' +windows, as used by virtual window managers such as tvtwm. + +It is quite easy to make programs understand virtual roots if they +don't already: you merely need to include the file "vroot.h" in +them after the standard X includes, and recompile. This file is distributed +with X11r5, and is included with xscreensaver as well. + + monoPrograms (class MonoPrograms) +This resource is appended to the value of the programs resource if +the display on which the screensaver is running is monochrome. + + colorPrograms (class ColorPrograms) +This resource is appended to the value of the programs resource if +the display on which the screensaver is running is not monochrome. + + + NOTE: this means that if you want to completely replace the list of + programs which xscreensaver runs, you must set at least two, + possibly three resources. It is not enough to just set + the programs resource -- you must also set colorPrograms + or monoPrograms or both. + +Normally you won't need to change the following resources: + + bourneShell (class BourneShell) +The pathname of the shell that xscreensaver uses to start subprocesses. +This must be whatever your local variant of /bin/sh is -- in particular, +it must not be csh. + + windowCreationTimeout (class Time) +When XIdle is not in use, this controls the delay between when +windows are created and when xscreensaver selects events on them. +Default 30 seconds. + + pointerPollTime (class Time) +When XIdle is not in use, this controls how frequently xscreensaver +checks to see if the mouse position or buttons have changed. Default 5 +seconds. + + initialDelay (class Time) +When XIdle is not in use, xscreensaver will wait this many seconds +before selecting events on existing windows, under the assumption that +xscreensaver is started during your login procedure, and the window +state may be in flux. Default 30 seconds. + +2 HOW_IT_WORKS +When it is time to activate the screensaver, a full-screen black window +is created. This window is given the appropriate properties so that, to +any subsequently-created programs, it will appear to be a ``virtual +root'' window. Because of this, any program which draws on the root +window (and which understands virtual roots) can be used as a +screensaver. + +When the user becomes active again, the screensaver window is unmapped +and the running subprocess is killed by sending it SIGTERM. This is +also how the subprocesses are killed when the screensaver decides that +it's time to run a different demo: the old one is killed and a new one +is launched. + +Before launching a subprocess, xscreensaver stores an appropriate value +for $DISPLAY in the environment that the child will recieve. (This is +so that if you start xscreensaver with a -display argument, the programs +which xscreensaver launches will draw on the same display.) + + +When the screensaver turns off, or is killed, care is taken to restore +the ``real'' virtual root window if there is one. Because of this, it +is important that you not kill the screensaver process with kill -9 if +you are running a virtual-root window manager. If you kill it with -9, +you may need to restart your window manager to repair the damage. This +isn't an issue if you aren't running a virtual-root window manager. + +For all the gory details, see the commentary at the top of xscreensaver.c. + +You can control a running screensaver process by using the +xscreencommand program (which see.) + +2 ENVIRONMENT + + + DISPLAY +to get the default host and display number. + + XENVIRONMENT +to get the name of a resource file that overrides the global resources +stored in the RESOURCE_MANAGER property. + +2 USING_XDM +You can run xscreensaver from your xdm session, so that the +screensaver will run even when nobody is logged in on the console. +Simply add "xscreensaver &" to your /usr/lib/X11/xdm/Xsetup +file. Because xdm grabs the keyboard, keypresses will not make +the screensaver deactivate, but any mouse activity will. + +(If your system does not seem to be executing the Xsetup file, you +may need to configure it to do so -- the traditional way to do this is +to make that file the value of the DisplayManager*setup resource +in the xdm-config file. See the man page for + xdm (1) +for more details.) + +Users may want to add "xscreensaver-command -restart" to their +startup scripts, so that the screensaver will be reinitialized with +their private resource settings when they log in. + +It is safe to run this program as root (as xdm is likely to do.) If +run as root, xscreensaver changes its effective user and group ids to +something safe (like "nobody") before connecting to the X server +or launching user-specified programs. + +Locking doesn't work if the screensaver is launched by xdm. To get +around this, you can run the screensaver from xdm without locking, +and kill and restart it from your personal X startup script to enable +locking. + +2 DEMO_MODE + +If xscreensaver receives the DEMO ClientMessage, it pops up a dialog box +from which you can examine and experiment with the screensaver's client +programs. + +Clicking left on an element in the scrolling list will place the indicated +program and its args in the text field to be edited. Edit the arguments and +hit return to run the program with the parameters you have specified. + +Double-clicking on an element in the scrolling list will run the indicated +program immediately. + +When a client program is launched, the dialog box is hidden. Clicking +any mouse button will re-expose the dialog box (but will not kill the +client program.) + + Run Next +Clicking this button will run the next program in the list after the +currently-selected one, and will scroll around to the top when it reaches +the bottom. + + Run Previous +Opposite of Run Next; at the top, it scrolls around to the bottom. + + Edit Parameters +This pops up a second dialog box, in which you have the option to +interactively change most of the screensaver's operational parameters, +such as its timeouts, and whether it should hack colormaps. Changing +these parameters here will affect only the running xscreensaver +process; to make the changes permanent, you need to edit your X resource +file. + + Exit Demo Mode +Returns to normal screensaver operation. + + Reinitialize +Causes the screensaver process to exit and then restart with the same +command-line arguments. This causes the X resource database to be +re-read. This is just like the -restart argument to xscreencommand +except that when executed from this button, the screensaver will +automatically return to demo mode after restarting. + +2 SEE ALSO + xscreencommand , + xlock , + xnlock , + xautolock , + xdm , + qix , + pyro , + helix , + rorschach , + hopalong , + attraction , + greynetic , + rocks , + noseguy , + blitspin , + imsmap , + slidescreen , + decayscreen , + hypercube , + flame , + maze , + ico , + xdaliclock , + xbouncebits , + xswarm , + xwave , + xfishtank + +2 BUGS +If you think you have changed the programs resource but the +screensaver is ignoring it, you are confused -- you need to set +the colorPrograms and/or monoPrograms resources as well. +(This is not a bug, but I mention it here because people think that +it is with great regularity.) + +If you are not making use of one of the server extensions (XIDLE or +MIT-SCREEN-SAVER), then it is possible, in rare situations, for +xscreensaver to interfere with event propagation and make another X +program malfunction. For this to occur, that other application would +need to not select KeyPress events on its non-leaf windows within the +first 30 seconds of their existence, but then select for them later. In +this case, that client might fail to receive those events. This isn't +very likely, since programs generally select a constant set of events +immediately after creating their windows and then don't change them, but +this is the reason that it's a good idea to install and use one of the +server extensions instead, to work around this shortcoming in the X +protocol. + +Although this program ``nices'' the subprocesses that it starts, +graphics-intensive subprograms can still overload the machine by causing +the X server process itself (which is not ``niced'') to suck a lot of +cycles. Care should be taken to slow down programs intended for use as +screensavers by inserting strategic calls to sleep or usleep. + +Also, it will cause your X server to be pretty much permanently swapped in. +(but the same is true of any program that draws periodically, like xclock or +xload.) + +If the subprocess is drawing too quickly and the connection to the X +server is a slow one (such as an X terminal running over a phone line) +then the screensaver might not turn off right away when the user +becomes active again (the ico demo has this problem if being run in +full-speed mode). This can be alleviated by inserting strategic calls +to XSync in code intended for use as a screensaver. This prevents too +much graphics activity from being buffered up. + +The screensaver only runs on the default screen of the display. If you +have more than one screen, you can run multiple screensaver processes, +one for each screen. This interacts poorly with locking. In an ideal +world, the screensaver would save (and lock) both screens +simultaniously, and any activity would restore both screens. It would +be nice if one could run different hacks on each screen simultaniously. +However, I don't have access to a multi-headed workstation, so it would +be hard for me to implement something like this. + +If you don't have Motif, you can't compile with support for locking or +demo mode. + +Locking doesn't work if the screensaver is launched by xdm. +The reason for this is that when it is launched by xdm, the +screensaver process is owned by some standard user id (such as root +or daemon) instead of the user who is logged in on the console. +In order for the screensaver to prompt for the password of the person +who had logged in from xdm, it would need to know who that user was, +and there is no reliable and safe way to figure that out. (And even if +there was, there would be some other security issues here as well.) + +So if you want to use it as a locker, you must start it with your user id. +If it has already been started by xdm, you can kill it with +xscreensaver-command -exit, and then start it again as you. + +If you get an error message like ``couldn't get password of foo'' then +this probably means that you're on a system in which the getpwent +library routine can only be effectively used by root. If this is the +case, then xscreensaver must be installed as setuid to root. Care has +been taken to make this a safe thing to do. + +The installColormap option doesn't work very well with the twm window +manager and its descendants. There is a race condition between the +screensaver and this window manager, which can result in the +screensaver's colormap not getting installed properly, meaning the +graphics hacks will appear in essentially random colors. The mwm and +olwm window managers don't seem to have this problem. The race +condition exists because X apparently does not provide a way for an +OverrideRedirect window to have its own colormap, short of grabbing the +server (which is neither a good idea, nor really possible with the +current design.) What happens is that, as soon as the screensaver +installs its colormap, twm responds to the ColormapNotify event that is +generated by re-instaling the default colormap. Apparently, twm doesn't +always do this; it seems to do it regularly if the screensaver is +activated from a menu item, but seems to not do it if the screensaver +comes on of its own volition, or is activated from another console. Any +thoughts on this problem are welcome... + +Apparently there are some problems with ``XView'' programs getting +confused and thinking that the screensaver window is the real root +window even when the screensaver is not active: ClientMessages intended +for the window manager are sent to the screensaver window instead. This +could be solved by making xscreensaver forward all unrecognised +ClientMessages to the real root window, but there may be other problems +as well. + +When using the MIT-SCREEN-SAVER extension in conjunction with the fade +option, you may notice an unattractive flicker just before the fade +begins. This is because the server maps a black window just before it +tells the xscreensaver process to activate. The xscreensaver process +immediately unmaps that window, but this results in a flicker. I +haven't figured out how to get around this yet. + +There need to be a lot more graphics hacks. In particular, there should +be a simulation of a Lavalite (tm). + +2 COPYRIGHT +Copyright (c) 1992, 1993, 1994, 1995 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. + +2 AUTHOR +Jamie Zawinski , 13-aug-92. +Please let me know if you find any bugs or make any improvements. + +Thanks to David Wojtowicz for implementing lockTimeout. + +Thanks to Martin Kraemer for adding support for shadow passwords and +locking-disabled diagnostics. + +2 OpenVMS_PORT +Patrick MOREAU - CENA/Athis-Mons - FRANCE +pmoreau@cena.dgac.fr +moreau_p@decus.decus.fr diff --git a/driver/xscreensaver.man b/driver/xscreensaver.man new file mode 100755 index 00000000..18bf571a --- /dev/null +++ b/driver/xscreensaver.man @@ -0,0 +1,551 @@ +.de EX \"Begin example +.ne 5 +.if n .sp 1 +.if t .sp .5 +.nf +.in +.5i +.. +.de EE +.fi +.in -.5i +.if n .sp 1 +.if t .sp .5 +.. +.TH XScreenSaver 1 "6-Jan-95" "X Version 11" +.SH NAME +xscreensaver - graphics hack and screen locker, launched when the user is idle +.SH SYNOPSIS +.B xscreensaver +[\-display \fIhost:display.screen\fP] [\-timeout \fIint\fP] [\-cycle \fIint\fP] [\-nice \fIint\fP] [\-verbose] [\-silent] [\-xidle] [\-no-xidle] [\-lock] [\-no-lock] [\-lock\-timeout \fIint\fP] [\-demo] [\-visual \fIvisual\fP] [\-install] [\-no-install] [\-xrm \fIresources\fP] +.SH DESCRIPTION +The \fIxscreensaver\fP program waits until the keyboard and mouse have been +idle for a period, and then runs a graphics demo chosen at random. It +turns off as soon as there is any mouse or keyboard activity. + +This program can lock your terminal in order to prevent others from using it, +though its default mode of operation is merely to display pretty pictures on +your screen when it is not in use. + +The benefit that this program has over the combination of the +.BR xlock (1) +and +.BR xautolock (1) +programs is the ease with which new graphics hacks can be installed. You +don't need to recompile (or even re-run) this program to add a new display +mode. +.SH OPTIONS +.I xscreensaver +accepts the following options: +.TP 8 +.B \-timeout \fIminutes\fP +The screensaver will activate after the keyboard and mouse have been idle +for this many minutes. +.TP 8 +.B \-cycle \fIminutes\fP +After the screensaver has been running for this many minutes, the currently +running sub-process will be killed (with \fBSIGTERM\fP), and a new one +started. If this is 0, then the sub-process will not be killed; only one +demo will run until the screensaver is deactivated by user activity. +.TP 8 +.B \-nice \fIinteger\fP +The sub-processes created by \fIxscreensaver\fP will be ``niced'' to this +level, so that they do not consume cycles that are needed elsewhere. +.TP 8 +.B \-verbose +Print diagnostics. +.TP 8 +.B \-silent + +.TP 8 +.B \-xidle\-extension +Use the \fBXIDLE\fP server extension to decide whether the user is idle. +This is the default if \fIxscreensaver\fP has been compiled with support +for this extension. On X11R4 or X11R5 systems, the XIdle method is faster +and more reliable than what will be done otherwise, so use it if you can. +.TP 8 +.B \-no\-xidle\-extension +Don't use the \fBXIDLE\fP server extension. +.TP 8 +.B \-ss\-extension +Use the \fBMIT\-SCREEN\-SAVER\fP server extension to decide whether the user +is idle. This is the default if \fIxscreensaver\fP has been compiled with +support for this extension. On X11R6 systems, the \fBMIT\-SCREEN\-SAVER\fP +method is faster and more reliable than what will be done otherwise, so use +it if you can. +.TP 8 +.B \-no\-ss\-extension +Don't use the \fBMIT\-SCREEN\-SAVER\fP server extension. +.TP 8 +.B \-lock +Enable locking: before the screensaver will turn off, it requires you to +type the password of the person who launched the screensaver, or the root +password. (Note: this doesn't work if the screensaver is launched +by +.BR xdm (1) +because it can't know the user-id of the logged-in user.) +.TP 8 +.B \-no\-lock +Disable locking. This is the default. +.TP 8 +.B \-lock\-timeout \fIminutes\fP +This is how long after the screensaver activates that locking is enabled. +For example, if this is 5, then any user activity within five minutes of +the time when the screensaver activated will cause the screen to unblank +without requiring a password. After 5 minutes, a password will be +required. The default is 0, meaning that if locking is enabled, then +a password will be required as soon as the screensaver activates. +.TP 8 +.B \-visual \fIvisual\fP +Specify which visual to use. Legal values are: +.RS 8 +.TP 8 +.B best +Use the visual which supports the most writable color cells; this is +the default. +.TP 8 +.B default +Use the screen's default visual (the visual of the root window.) This is +not necessarily the most colorful visual, which is why it is not the default. +.TP 8 +.I class +One of \fBStaticGray\fP, \fBStaticColor\fP, \fBTrueColor\fP, \fBGrayScale\fP, +\fBPseudoColor\fP, or \fBDirectColor\fP. Selects the deepest visual of +the given class. +.TP 8 +.I number +A number (decimal or hex) is interpreted as a visual id number, as reported +by the +.BR xdpyinfo (1) +program; in this way you can select a shallower visual if desired. +.RE +.TP 8 +.B \-no\-install +Use the default colormap. This is the default. +.TP 8 +.B \-install +Install a private colormap while the screensaver is on, so that the graphics +hacks can get as many colors as possible. +.TP 8 +.B \-demo +Enter the interactive demo mode immediately after startup. Normally +demo mode is invoked via the +.BR xscreensaver\-command (1) +program. +.SH X RESOURCES +\fIxscreensaver\fP understands the following resources: +.PP +.TP 8 +.B timeout \fR(class \fBTime\fP) +Same as the \fI\-timeout\fP command-line option. Default 10 minutes. +.TP 8 +.B cycle \fR(class \fBTime\fP) +Same as the \fI\-cycle\fP command-line option. Default 10 minutes. +.TP 8 +.B nice \fR(class \fBNice\fP) +Same as the \fI\-nice\fP command-line option. Default 10. +.TP 8 +.B verbose \fR(class \fBBoolean\fP) +Same as the \fI\-verbose\fP command-line option. +.TP 8 +.B xidle \fR(class \fBBoolean\fP) +Same as the \fI\-xidle\fP command-line option. +.TP 8 +.B lock \fR(class \fBBoolean\fP) +Same as the \fI\-lock\fP command-line option. +.TP 8 +.B lockTimeout \fR(class \fBTime\fP) +Same as the \fI\-lock\-timeout\fP command-line option. +.TP 8 +.B fade \fR(class \fBBoolean\fP) +If this is true, then when the screensaver activates, the current contents +of the screen will fade to black instead of simply winking out. This only +works on displays with writable colormaps. Default true. A fade will also +be done when switching graphics hacks (when the \fIcycle\fP timer expires.) +.TP 8 +.B unfade \fR(class \fBBoolean\fP) +If this is true, then when the screensaver deactivates, the original contents +of the screen will fade in from black instead of appearing immediately. This +only works on displays with writable colormaps, and if \fIfade\fP is true +as well. Default false. +.TP 8 +.B fadeSeconds \fR(class \fBTime\fP) +If \fIfade\fP is true, this is how long the fade will be in +seconds (default 1.) +.TP 8 +.B fadeTicks \fR(class \fBInteger\fP) +If \fIfade\fP is true, this is how many times a second the colormap will +be changed to effect a fade. Higher numbers yield smoother fades, but +may make the fades take longer if your server isn't fast enough to keep +up. Default 75. +.TP 8 +.B installColormap \fR(class \fBBoolean\fP) +Same as the \fI\-install\fP command-line option. Default false. +.TP 8 +.B passwdTimeout \fR(class \fBTime\fP) +If \fIlock\fP is true, this is how many seconds the password dialog box +should be left on the screen before giving up (default 30.) This should +not be too large: the X server is grabbed for the duration that the password +dialog box is up (for security purposes) and leaving the server grabbed for +too long can cause problems. +.TP 8 +.B visualID \fR(class \fBVisualID\fP) +Same as the \fI\-visual\fP command-line option. Default \fBbest\fP. +.TP 8 +.B captureStderr \fR(class \fBBoolean\fP) +Whether \fIxscreensaver\fP should redirect its standard-error stream to the +window itself. Since its nature is to take over the screen, you would not +normally see error messages generated by the screensaver or the programs it +runs; this resource will cause the output of all relevant programs to be +drawn on the screensaver window itself instead of written to the controlling +terminal of the screensaver driver process. Default: True. +.TP 8 +.B captureStdout \fR(class \fBBoolean\fP) +Like \fBcaptureStderr\fP but for the standard-output stream. Default: True. +.TP 8 +.B font \fR(class \fBFont\fP) +The font used for the stdout/stderr text, if \fBcaptureStdout\fP or +\fBcaptureStderr\fP are true. Default \fB*\-medium\-r\-*\-140\-*\-m\-*\fP +(a 14 point fixed-width font.) +.TP 8 +.B textForeground \fR(class \fBForeground\fP) +The foreground color used for the stdout/stderr text, if \fBcaptureStdout\fP +or \fBcaptureStderr\fP are true. Default: Yellow. +.TP 8 +.B textBackground \fR(class \fBBackground\fP) +The background color used for the stdout/stderr text, if \fBcaptureStdout\fP +or \fBcaptureStderr\fP are true. Default: Black. +.TP 8 +.B programs \fR(class \fBPrograms\fP) +The graphics hacks which \fIxscreensaver\fP runs when the user is idle, +in addition to those specified in colorPrograms or monoPrograms (as +appropriate.) The value of this resource is a string, one \fIsh\fP command +per line. Each line must contain exactly one command -- no semicolons. + +When the screensaver starts up, one of these is selected at random, and +run. After the \fIcycle\fP period expires, it is killed, and another +is selected and run. + +If the value of this resource (and the applicable one of \fBcolorPrograms\fP +or \fBmonoPrograms\fP) is empty, then no programs will be run; the screen +will simply be made black. + +Note that you must escape the newlines; here is an example of how you +might set this in your \fI.Xdefaults\fP file: +.EX +xscreensaver.programs: \\ + qix -root \\n\\ + ico -r -faces -sleep 1 -obj ico \\n\\ + xdaliclock -builtin2 -root \\n\\ + xwave -root +.EE +To use a program as a screensaver, two things are required: that that +program draw on the root window (or be able to be configured to draw on +the root window); and that that program understand ``virtual root'' +windows, as used by virtual window managers such as \fItvtwm\fP. + +It is quite easy to make programs understand virtual roots if they +don't already: you merely need to include the file \fI"vroot.h"\fP in +them after the standard X includes, and recompile. This file is distributed +with X11r5, and is included with xscreensaver as well. +.TP 8 +.B monoPrograms \fR(class \fBMonoPrograms\fP) +This resource is appended to the value of the \fIprograms\fP resource if +the display on which the screensaver is running is monochrome. +.TP 8 +.B colorPrograms \fR(class \fBColorPrograms\fP) +This resource is appended to the value of the \fIprograms\fP resource if +the display on which the screensaver is running is not monochrome. +.PP +.RS 4 +\fBNOTE: this means that if you want to completely replace the list of +programs which xscreensaver runs, you must set at least \fItwo\fP, +possibly \fIthree\fP resources. It is not enough to just set +the \fBprograms\fP resource -- you must also set \fBcolorPrograms\fP +or \fBmonoPrograms\fP or both.\fP +.RE +.PP +Normally you won't need to change the following resources: +.TP 8 +.B bourneShell \fR(class \fBBourneShell\fP) +The pathname of the shell that \fIxscreensaver\fP uses to start subprocesses. +This must be whatever your local variant of \fB/bin/sh\fP is -- in particular, +it must not be \fBcsh\fP. +.TP 8 +.B windowCreationTimeout \fR(class \fBTime\fP) +When \fIXIdle\fP is not in use, this controls the delay between when +windows are created and when \fIxscreensaver\fP selects events on them. +Default 30 seconds. +.TP 8 +.B pointerPollTime \fR(class \fBTime\fP) +When \fIXIdle\fP is not in use, this controls how frequently \fIxscreensaver\fP +checks to see if the mouse position or buttons have changed. Default 5 seconds. +.TP 8 +.B initialDelay \fR(class \fBTime\fP) +When \fIXIdle\fP is not in use, \fIxscreensaver\fP will wait this many seconds +before selecting events on existing windows, under the assumption that +\fIxscreensaver\fP is started during your login procedure, and the window +state may be in flux. Default 30 seconds. +.SH "HOW IT WORKS" +When it is time to activate the screensaver, a full-screen black window is +created. This window is given the appropriate properties so that, to any +subsequently-created programs, it will appear to be a ``virtual root'' +window. Because of this, any program which draws on the root window (and +which understands virtual roots) can be used as a screensaver. +.PP +When the user becomes active again, the screensaver window is unmapped and +the running subprocess is killed by sending it \fBSIGTERM\fP. This is also +how the subprocesses are killed when the screensaver decides that it's time +to run a different demo: the old one is killed and a new one is launched. +.PP +Before launching a subprocess, \fIxscreensaver\fP stores an appropriate value +for \fB$DISPLAY\fP in the environment that the child will recieve. (This is +so that if you start \fIxscreensaver\fP with a \fI-display\fP argument, the +programs which \fIxscreensaver\fP launches will draw on the same display.) +.PP +When the screensaver turns off, or is killed, care is taken to restore +the ``real'' virtual root window if there is one. Because of this, it is +important that you not kill the screensaver process with \fIkill -9\fP if +you are running a virtual-root window manager. If you kill it with \-9, +you may need to restart your window manager to repair the damage. This +isn't an issue if you aren't running a virtual-root window manager. +.PP +For all the gory details, see the commentary at the top of xscreensaver.c. +.PP +You can control a running screensaver process by using the +.BR xscreensaver\-command (1) +program (which see.) +.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. +.SH USING XDM(1) +You can run \fIxscreensaver\fP from your xdm session, so that the +screensaver will run even when nobody is logged in on the console. +Simply add \fB"xscreensaver &"\fP to your \fI/usr/lib/X11/xdm/Xsetup\fP +file. Because \fIxdm\fP grabs the keyboard, keypresses will not make +the screensaver deactivate, but any mouse activity will. +.PP +(If your system does not seem to be executing the \fIXsetup\fP file, you +may need to configure it to do so -- the traditional way to do this is +to make that file the value of the \fIDisplayManager*setup\fP resource +in the \fIxdm-config\fP file. See the man page for +.BR xdm (1) +for more details.) +.PP +Users may want to add \fB"xscreensaver-command -restart"\fP to their +startup scripts, so that the screensaver will be reinitialized with +their private resource settings when they log in. +.PP +It is safe to run this program as root (as \fIxdm\fP is likely to do.) If +run as root, \fIxscreensaver\fP changes its effective user and group ids to +something safe (like \fI"nobody"\fP) before connecting to the X server +or launching user-specified programs. +.PP +Locking doesn't work if the screensaver is launched by \fIxdm\fP. To get +around this, you can run the screensaver from \fIxdm\fP without locking, +and kill and restart it from your personal X startup script to enable +locking. +.SH DEMO MODE +If \fIxscreensaver\fP receives the \fBDEMO\fP ClientMessage, it pops up +a dialog box from which you can examine and experiment with the screensaver's +client programs. +.PP +Clicking left on an element in the scrolling list will place the indicated +program and its args in the text field to be edited. Edit the arguments and +hit return to run the program with the parameters you have specified. +.PP +Double-clicking on an element in the scrolling list will run the indicated +program immediately. +.PP +When a client program is launched, the dialog box is hidden. Clicking +any mouse button will re-expose the dialog box (but will not kill the +client program.) +.TP 8 +.B Run Next +Clicking this button will run the next program in the list after the +currently-selected one, and will scroll around to the top when it reaches +the bottom. +.TP 8 +.B Run Previous +Opposite of Run Next; at the top, it scrolls around to the bottom. +.TP 8 +.B Edit Parameters +This pops up a second dialog box, in which you have the option to +interactively change most of the screensaver's operational parameters, +such as its timeouts, and whether it should hack colormaps. Changing +these parameters here will affect only the running \fIxscreensaver\fP +process; to make the changes permanent, you need to edit your X resource +file. +.TP 8 +.B Exit Demo Mode +Returns to normal screensaver operation. +.TP 8 +.B Reinitialize +Causes the screensaver process to exit and then restart with the same +command-line arguments. This causes the X resource database to be +re-read. This is just like the \fI\-restart\fP argument to +.BR xscreensaver\-command (1) +except that when executed from this button, the screensaver will +automatically return to demo mode after restarting. +.SH SEE ALSO +.BR X (1), +.BR xscreensaver\-command (1), +.BR xlock (1), +.BR xnlock (1), +.BR xautolock (1), +.BR xdm (1), +.BR qix (1), +.BR pyro (1), +.BR helix (1), +.BR rorschach (1), +.BR hopalong (1), +.BR attraction (1), +.BR greynetic (1), +.BR rocks (1), +.BR noseguy (1), +.BR blitspin (1), +.BR imsmap (1), +.BR slidescreen (1), +.BR decayscreen (1), +.BR hypercube (1), +.BR flame (1), +.BR maze (1), +.BR ico (1), +.BR xdaliclock (1), +.BR xbouncebits (1), +.BR xswarm (1), +.BR xwave (1), +.BR xfishtank (1) +.SH BUGS +If you think you have changed the \fBprograms\fP resource but the +screensaver is ignoring it, you are confused -- you need to set +the \fBcolorPrograms\fP and/or \fBmonoPrograms\fP resources as well. +(This is not a bug, but I mention it here because people think that +it is with great regularity.) +.PP +If you are not making use of one of the server extensions (\fBXIDLE\fP +or \fBMIT-SCREEN-SAVER\fP), then it is possible, in rare situations, +for \fIxscreensaver\fP to interfere with event propagation and make +another X program malfunction. For this to occur, that other application +would need to \fInot\fP select \fBKeyPress\fP events on its non-leaf windows +within the first 30 seconds of their existence, but then select for them later. +In this case, that client \fImight\fP fail to receive those events. +This isn't very likely, since programs generally select a constant set +of events immediately after creating their windows and then don't change +them, but this is the reason that it's a good idea to install and use one +of the server extensions instead, to work around this shortcoming in the +X protocol. +.PP +Although this program ``nices'' the subprocesses that it starts, +graphics-intensive subprograms can still overload the machine by causing +the X server process itself (which is not ``niced'') to suck a lot of +cycles. Care should be taken to slow down programs intended for use as +screensavers by inserting strategic calls to +.BR sleep (3) +or +.BR usleep (3) +\. + +Also, it will cause your X server to be pretty much permanently swapped in. +(but the same is true of any program that draws periodically, like xclock or +xload.) +.PP +If the subprocess is drawing too quickly and the connection to the X +server is a slow one (such as an X terminal running over a phone line) then +the screensaver might not turn off right away when the user becomes active +again (the +.BR ico (1) +demo has this problem if being run in full-speed mode). This can be +alleviated by inserting strategic calls to +.BR XSync (3) +in code intended for use as a screensaver. This prevents too much graphics +activity from being buffered up. +.PP +The screensaver only runs on the default screen of the display. If you have +more than one screen, you can run multiple screensaver processes, one for +each screen. This interacts poorly with locking. In an ideal world, the +screensaver would save (and lock) both screens simultaniously, and any activity +would restore both screens. It would be nice if one could run different hacks +on each screen simultaniously. However, I don't have access to a multi-headed +workstation, so it would be hard for me to implement something like this. +.PP +If you don't have Motif, you can't compile with support for locking or +demo mode. +.PP +Locking doesn't work if the screensaver is launched by \fIxdm\fP. +The reason for this is that when it is launched by \fIxdm\fP, the +screensaver process is owned by some standard user id (such as \fIroot\fP +or \fIdaemon\fP) instead of the user who is logged in on the console. +In order for the screensaver to prompt for the password of the person +who had logged in from \fIxdm\fP, it would need to know who that user was, +and there is no reliable and safe way to figure that out. (And even if +there was, there would be some other security issues here as well.) + +So if you want to use it as a locker, you must start it with your user id. +If it has already been started by \fIxdm\fP, you can kill it with +\fBxscreensaver-command -exit\fP, and then start it again as you. +.PP +If you get an error message like ``couldn't get password of foo'' then +this probably means that you're on a system in which the +.BR getpwent (3) +library routine can only be effectively used by root. If this is the case, +then \fIxscreensaver\fP must be installed as setuid to root. Care has +been taken to make this a safe thing to do. +.PP +The \fBinstallColormap\fP option doesn't work very well with the +.BR twm (1) +window manager and its descendants. There is a race condition between the +screensaver and this window manager, which can result in the screensaver's +colormap not getting installed properly, meaning the graphics hacks will +appear in essentially random colors. The +.BR mwm (1) +and +.BR olwm (1) +window managers don't seem to have this problem. The race condition exists +because X apparently does not provide a way for an OverrideRedirect window to +have its own colormap, short of grabbing the server (which is neither a good +idea, nor really possible with the current design.) What happens is that, as +soon as the screensaver installs its colormap, \fBtwm\fP responds to +the \fBColormapNotify\fP event that is generated by re-instaling the default +colormap. Apparently, \fBtwm\fP doesn't \fIalways\fP do this; it seems to do +it regularly if the screensaver is activated from a menu item, but seems to +not do it if the screensaver comes on of its own volition, or is activated +from another console. Any thoughts on this problem are welcome... +.PP +Apparently there are some problems with ``XView'' programs getting confused +and thinking that the screensaver window is the real root window even when +the screensaver is not active: ClientMessages intended for the window manager +are sent to the screensaver window instead. This could be solved by making +xscreensaver forward all unrecognised ClientMessages to the real root window, +but there may be other problems as well. +.PP +When using the \fBMIT-SCREEN-SAVER\fP extension in conjunction with +the \fBfade\fP option, you may notice an unattractive flicker just before +the fade begins. This is because the server maps a black window just before +it tells the \fIxscreensaver\fP process to activate. The \fIxscreensaver\fP +process immediately unmaps that window, but this results in a flicker. I +haven't figured out how to get around this yet. +.PP +There need to be a lot more graphics hacks. In particular, there should be +a simulation of a Lavalite (tm). +.SH COPYRIGHT +Copyright \(co 1992, 1993, 1994, 1995 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 , 13-aug-92. +Please let me know if you find any bugs or make any improvements. + +Thanks to David Wojtowicz for implementing \fIlockTimeout\fP. + +Thanks to Martin Kraemer for adding support for shadow passwords and +locking-disabled diagnostics. diff --git a/driver/xscreensaver_ad.h b/driver/xscreensaver_ad.h new file mode 100755 index 00000000..1c64c891 --- /dev/null +++ b/driver/xscreensaver_ad.h @@ -0,0 +1,108 @@ +"*timeout: 10", +"*cycle: 10", +"*lockTimeout: 0", +"*passwdTimeout: 30", +"*nice: 10", +"*lock: False", +"*verbose: False", +"*fade: True", +"*unfade: False", +"*fadeSeconds: 1", +"*fadeTicks: 75", +"*captureStderr: True", +"*captureStdout: True", +"*textForeground: Yellow", +"*textBackground: Black", +"*font: *-medium-r-*-140-*-m-*", +"*installColormap: False", +"*programs: qix -root \\n\ + qix -root -solid -delay 0 -segments 100 \\n\ + qix -root -linear -count 10 -size 100 -segments 200 \\n\ + attraction -root -mode balls \\n\ + attraction -root -mode lines -points 3 -segments 200 \\n\ + attraction -root -mode splines -segments 300 \\n\ + attraction -root -mode lines -radius 300 \ + -orbit -vmult 0.5 \\n\ + pyro -root \\n\ + helix -root \\n\ + pedal -root \\n\ + rorschach -root -offset 7 \\n\ + hopalong -root \\n\ + greynetic -root \\n\ + xroger -root \\n\ + imsmap -root \\n\ + slidescreen -root \\n\ + decayscreen -root \\n\ + hypercube -root \\n\ + halo -root \\n\ + maze -root \\n\ + flame -root \\n\ + lmorph -root \\n", +"*monoPrograms: qix -root -linear -count 5 -size 200 -spread 30 \ + -segments 75 -solid -xor \\n\ + rocks -root \\n\ + noseguy -root \\n", +"*colorPrograms: qix -root -count 4 -solid -transparent \\n\ + qix -root -count 5 -solid -transparent -linear \ + -segments 250 -size 100 \\n\ + attraction -root -mode polygons \\n\ + attraction -root -mode filled-splines -segments 0 \\n\ + attraction -root -glow -points 10 \\n\ + rocks -root -fg darksalmon \\n\ + noseguy -root -fg yellow -bg gray30 \\n", +"*fontList: *-helvetica-medium-r-*-*-*-120-*-*-*-iso8859-1", +"*demoDialog*label1.fontList: *-helvetica-medium-r-*-*-*-140-*-*-*-iso8859-1", +"*passwdDialog*fontList: *-helvetica-medium-r-*-*-*-140-*-*-*-iso8859-1", +"*XmList.fontList: *-courier-medium-r-*-*-*-120-*-*-*-iso8859-1", +"*XmTextField.fontList: *-courier-medium-r-*-*-*-120-*-*-*-iso8859-1", +"*passwdDialog.passwdText.fontList: *-courier-medium-r-*-*-*-120-*-*-*-iso8859-1", +"*XmDialogShell*foreground: black", +"*XmDialogShell*background: gray90", +"*XmDialogShell*XmTextField.foreground: black", +"*XmDialogShell*XmTextField.background: white", +"*XmDialogShell*demoList.foreground: black", +"*XmDialogShell*demoList.background: white", +"*XmDialogShell*rogerLabel.foreground: red3", +"*XmDialogShell*rogerLabel.background: white", +"*XmDialogShell.title: XScreenSaver", +"*allowShellResize: True", +"*autoUnmanage: False", +"*demoDialog.maxWidth: 600", +"*label1.labelString: XScreenSaver %s", +"*label2.labelString: Copyright © 1991-1995 by Jamie Zawinski ", +"*demoList.visibleItemCount: 10", +"*demoList.automaticSelection: True", +"*next.labelString: Run Next", +"*prev.labelString: Run Previous", +"*edit.labelString: Edit Parameters", +"*done.labelString: Exit Demo Mode", +"*restart.labelString: Reinitialize", +"*resourcesLabel.labelString: XScreenSaver Parameters", +"*timeoutLabel.labelString: Saver Timeout", +"*cycleLabel.labelString: Cycle Timeout", +"*fadeSecondsLabel.labelString: Fade Duration", +"*fadeTicksLabel.labelString: Fade Ticks", +"*lockLabel.labelString: Lock Timeout", +"*passwdLabel.labelString: Password Timeout", +"*resourcesForm*XmTextField.columns: 8", +"*verboseToggle.labelString: Verbose", +"*cmapToggle.labelString: Install Colormap", +"*fadeToggle.labelString: Fade Colormap", +"*unfadeToggle.labelString: Unfade Colormap", +"*lockToggle.labelString: Require Password", +"*resourcesDone.labelString: Done", +"*resourcesCancel.labelString: Cancel", +"*passwdDialog.title: Password", +"*passwdLabel1.labelString: XScreenSaver %s", +"*passwdLabel2.labelString: This display is locked.", +"*passwdLabel3.labelString: Please type %s's password to unlock it.", +"*passwdDone.labelString: Done", +"*passwdCancel.labelString: Cancel", +"*passwdLabel1.alignment: ALIGNMENT_BEGINNING", +"*passwdLabel2.alignment: ALIGNMENT_BEGINNING", +"*passwdLabel3.alignment: ALIGNMENT_BEGINNING", +"*rogerLabel.width: 150", +"*pointerPollTime: 5", +"*initialDelay: 30", +"*windowCreationTimeout: 30", +"*bourneShell: /bin/sh", diff --git a/driver/yarandom.h b/driver/yarandom.h new file mode 100755 index 00000000..53b22fd8 --- /dev/null +++ b/driver/yarandom.h @@ -0,0 +1,19 @@ +#undef random +#undef rand +#undef drand48 +#undef srandom +#undef srand +#undef srand48 + +#define random() ya_random() +#define srandom(i) ya_rand_init(0) + +#undef P +#if __STDC__ +# define P(x)x +#else +# define P(x)() +#endif + +extern unsigned int ya_random P((void)); +extern void ya_rand_init P((unsigned int)); diff --git a/hacks/.gdbinit b/hacks/.gdbinit new file mode 100755 index 00000000..0bd01420 --- /dev/null +++ b/hacks/.gdbinit @@ -0,0 +1,3 @@ +b exit +b abort +set args -geom =700x700+0+0 diff --git a/hacks/attraction.c b/hacks/attraction.c new file mode 100755 index 00000000..4ccc4b49 --- /dev/null +++ b/hacks/attraction.c @@ -0,0 +1,690 @@ +/* xscreensaver, Copyright (c) 1992, 1995 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. + */ + +/* Simulation of a pair of quasi-gravitational fields, maybe sorta kinda + a little like the strong and weak electromagnetic forces. Derived from + a Lispm screensaver by John Pezaris . Mouse control and + viscosity added by "Philip Edward Cutone, III" . + + John sez: + + The simulation started out as a purely accurate gravitational simulation, + but, with constant simulation step size, I quickly realized the field being + simulated while grossly gravitational was, in fact, non-conservative. It + also had the rather annoying behavior of dealing very badly with colliding + orbs. Therefore, I implemented a negative-gravity region (with two + thresholds; as I read your code, you only implemented one) to prevent orbs + from every coming too close together, and added a viscosity factor if the + speed of any orb got too fast. This provides a nice stable system with + interesting behavior. + + I had experimented with a number of fields including the van der Waals + force (very interesting orbiting behavior) and 1/r^3 gravity (not as + interesting as 1/r^2). An even normal viscosity (rather than the + thresholded version to bleed excess energy) is also not interesting. + The 1/r^2, -1/r^2, -10/r^2 thresholds proved not only robust but also + interesting -- the orbs never collided and the threshold viscosity fixed + the non-conservational problem. + + Philip sez: + > An even normal viscosity (rather than the thresholded version to + > bleed excess energy) is also not interesting. + + unless you make about 200 points.... set the viscosity to about .8 + and drag the mouse through it. it makes a nice wave which travels + through the field. + */ + +#include +#include +#include "screenhack.h" +#include "spline.h" + +#ifdef VMS +#define M_PI 3.14159265358979323846 +#endif + + +struct ball { + float x, y; + float vx, vy; + float dx, dy; + float mass; + int size; + XColor color; + int hue; +}; + +static unsigned int default_fg_pixel; +static struct ball *balls; +static int npoints; +static int threshold; +static int delay; +static int global_size; +static int segments; +static Bool glow_p; +static Bool orbit_p; +static XPoint *point_stack; +static int point_stack_size, point_stack_fp, pixel_stack_fp, pixel_stack_size; +static unsigned long *pixel_stack; +static unsigned int color_shift; + +/*flip mods for mouse interaction*/ +static Bool mouse_p; +int mouse_x, mouse_y, mouse_mass, root_x, root_y; +static float viscosity; + +static enum object_mode { + ball_mode, line_mode, polygon_mode, spline_mode, spline_filled_mode, + tail_mode +} mode; + +static enum color_mode { + cycle_mode, random_mode +} cmode; + +static GC draw_gc, erase_gc; + +#define MAX_SIZE 16 + +#define min(a,b) ((a)<(b)?(a):(b)) +#define max(a,b) ((a)>(b)?(a):(b)) + +static void +init_balls (dpy, window) + Display *dpy; + Window window; +{ + int i; + XWindowAttributes xgwa; + XGCValues gcv; + int xlim, ylim, midx, midy, r, vx, vy; + double th; + Colormap cmap; + char *mode_str; + XGetWindowAttributes (dpy, window, &xgwa); + xlim = xgwa.width; + ylim = xgwa.height; + cmap = xgwa.colormap; + midx = xlim/2; + midy = ylim/2; + r = get_integer_resource ("radius", "Integer"); + if (r <= 0 || r > min (xlim/2, ylim/2)) + r = min (xlim/2, ylim/2) - 50; + vx = get_integer_resource ("vx", "Integer"); + vy = get_integer_resource ("vy", "Integer"); + npoints = get_integer_resource ("points", "Integer"); + if (npoints < 1) + npoints = 3 + (random () % 5); + balls = (struct ball *) malloc (npoints * sizeof (struct ball)); + segments = get_integer_resource ("segments", "Integer"); + if (segments < 0) segments = 1; + threshold = get_integer_resource ("threshold", "Integer"); + if (threshold < 0) threshold = 0; + delay = get_integer_resource ("delay", "Integer"); + if (delay < 0) delay = 0; + global_size = get_integer_resource ("size", "Integer"); + if (global_size < 0) global_size = 0; + glow_p = get_boolean_resource ("glow", "Boolean"); + orbit_p = get_boolean_resource ("orbit", "Boolean"); + color_shift = get_integer_resource ("colorShift", "Integer"); + if (color_shift >= 360) color_shift = 5; + + /*flip mods for mouse interaction*/ + mouse_p = get_boolean_resource ("mouse", "Boolean"); + mouse_mass = get_integer_resource ("mouseSize", "Integer"); + mouse_mass = mouse_mass * mouse_mass *10; + + viscosity = get_float_resource ("viscosity", "Float"); + + mode_str = get_string_resource ("mode", "Mode"); + if (! mode_str) mode = ball_mode; + else if (!strcmp (mode_str, "balls")) mode = ball_mode; + else if (!strcmp (mode_str, "lines")) mode = line_mode; + else if (!strcmp (mode_str, "polygons")) mode = polygon_mode; + else if (!strcmp (mode_str, "tails")) mode = tail_mode; + else if (!strcmp (mode_str, "splines")) mode = spline_mode; + else if (!strcmp (mode_str, "filled-splines")) mode = spline_filled_mode; + else { + fprintf (stderr, + "%s: mode must be balls, lines, tails, polygons, splines, or\n\ + filled-splines, not \"%s\"\n", + progname, mode_str); + exit (1); + } + + mode_str = get_string_resource ("colorMode", "ColorMode"); + if (! mode_str) cmode = cycle_mode; + else if (!strcmp (mode_str, "cycle")) cmode = cycle_mode; + else if (!strcmp (mode_str, "random")) cmode = random_mode; + else { + fprintf (stderr, "%s: colorMode must be cycle or random, not \"%s\"\n", + progname, mode_str); + exit (1); + } + + if (mode != ball_mode && mode != tail_mode) glow_p = False; + + if (mode == polygon_mode && npoints < 3) + mode = line_mode; + + if (mode != ball_mode) + { + int size = (segments ? segments : 1); + point_stack_size = size * (npoints + 1); + point_stack = (XPoint *) calloc (point_stack_size, sizeof (XPoint)); + point_stack_fp = 0; + if (segments > 0) + pixel_stack_size = segments; + else + pixel_stack_size = (360 / color_shift); + pixel_stack = (unsigned long *) + calloc (pixel_stack_size, sizeof (unsigned int)); + pixel_stack_fp = 0; + } + + gcv.line_width = (mode == tail_mode + ? (global_size ? global_size : (MAX_SIZE * 2 / 3)) + : 1); + gcv.cap_style = (mode == tail_mode ? CapRound : CapButt); + + gcv.foreground = default_fg_pixel = + get_pixel_resource ("foreground", "Foreground", dpy, cmap); + draw_gc = XCreateGC (dpy, window, GCForeground|GCLineWidth|GCCapStyle, &gcv); + gcv.foreground = get_pixel_resource ("background", "Background", dpy, cmap); + erase_gc = XCreateGC (dpy, window, GCForeground|GCLineWidth|GCCapStyle,&gcv); + + if (!mono_p && mode != ball_mode) + for (i = 0; i < pixel_stack_size; i++) + { + XColor color; + color.pixel = default_fg_pixel; + XQueryColor (dpy, cmap, &color); + if (!XAllocColor (dpy, cmap, &color)) abort (); + pixel_stack [i] = color.pixel; + } + +#define rand_size() min (MAX_SIZE, 8 + (random () % (MAX_SIZE - 9))) + + if (orbit_p && !global_size) + /* To orbit, all objects must be the same mass, or the math gets + really hairy... */ + global_size = rand_size (); + + th = frand (M_PI+M_PI); + for (i = 0; i < npoints; i++) + { + int new_size = (global_size ? global_size : rand_size ()); + balls [i].dx = 0; + balls [i].dy = 0; + balls [i].size = new_size; + balls [i].mass = (new_size * new_size * 10); + balls [i].x = midx + r * cos (i * ((M_PI+M_PI) / npoints) + th); + balls [i].y = midy + r * sin (i * ((M_PI+M_PI) / npoints) + th); + if (! orbit_p) + { + balls [i].vx = vx ? vx : ((6.0 - (random () % 11)) / 8.0); + balls [i].vy = vy ? vy : ((6.0 - (random () % 11)) / 8.0); + } + balls [i].color.pixel = default_fg_pixel; + balls [i].color.flags = DoRed | DoGreen | DoBlue; + if (!mono_p) + { + if (i != 0 && (glow_p || mode != ball_mode)) + balls [i].hue = balls [0].hue; + else + balls [i].hue = random () % 360; + hsv_to_rgb (balls [i].hue, 1.0, 1.0, + &balls [i].color.red, &balls [i].color.green, + &balls [i].color.blue); + if (!XAllocColor (dpy, cmap, &balls [i].color)) + mono_p = True; /* just give up */ + } + } + + if (orbit_p) + { + double a = 0; + double v; + double v_mult = get_float_resource ("vMult", "Float"); + if (v_mult == 0.0) v_mult = 1.0; + + for (i = 1; i < npoints; i++) + { + double _2ipi_n = (2 * i * M_PI / npoints); + double x = r * cos (_2ipi_n); + double y = r * sin (_2ipi_n); + double distx = r - x; + double dist2 = (distx * distx) + (y * y); + double dist = sqrt (dist2); + double a1 = ((balls[i].mass / dist2) * + ((dist < threshold) ? -1.0 : 1.0) * + (distx / dist)); + a += a1; + } + if (a < 0.0) + { + fprintf (stderr, "%s: domain error: forces on balls too great\n", + progname); + exit (-1); + } + v = sqrt (a * r) * v_mult; + for (i = 0; i < npoints; i++) + { + double k = ((2 * i * M_PI / npoints) + th); + balls [i].vx = -v * sin (k); + balls [i].vy = v * cos (k); + } + } + + if (mono_p) glow_p = False; + XClearWindow (dpy, window); +} + +static void +compute_force (i, dx_ret, dy_ret) + int i; + float *dx_ret, *dy_ret; +{ + int j; + float x_dist, y_dist, dist, dist2; + *dx_ret = 0; + *dy_ret = 0; + for (j = 0; j < npoints; j++) + { + float x_dist, y_dist, dist, dist2; + + if (i == j) continue; + x_dist = balls [j].x - balls [i].x; + y_dist = balls [j].y - balls [i].y; + dist2 = (x_dist * x_dist) + (y_dist * y_dist); + dist = sqrt (dist2); + + if (dist > 0.1) /* the balls are not overlapping */ + { + float new_acc = ((balls[j].mass / dist2) * + ((dist < threshold) ? -1.0 : 1.0)); + float new_acc_dist = new_acc / dist; + *dx_ret += new_acc_dist * x_dist; + *dy_ret += new_acc_dist * y_dist; + } + else + { /* the balls are overlapping; move randomly */ + *dx_ret += (frand (10.0) - 5.0); + *dy_ret += (frand (10.0) - 5.0); + } + } + + if (mouse_p) + { + x_dist = mouse_x - balls [i].x; + y_dist = mouse_y - balls [i].y; + dist2 = (x_dist * x_dist) + (y_dist * y_dist); + dist = sqrt (dist2); + + if (dist > 0.1) /* the balls are not overlapping */ + { + float new_acc = ((mouse_mass / dist2) * + ((dist < threshold) ? -1.0 : 1.0)); + float new_acc_dist = new_acc / dist; + *dx_ret += new_acc_dist * x_dist; + *dy_ret += new_acc_dist * y_dist; + } + else + { /* the balls are overlapping; move randomly */ + *dx_ret += (frand (10.0) - 5.0); + *dy_ret += (frand (10.0) - 5.0); + } + } +} + +static void +run_balls (dpy, window) + Display *dpy; + Window window; +{ + int last_point_stack_fp = point_stack_fp; + static int tick = 500, xlim, ylim; + static Colormap cmap; + int i; + + /*flip mods for mouse interaction*/ + Window root1, child1; + int mask; + if (mouse_p) + { + XQueryPointer(dpy, window, &root1, &child1, + &root_x, &root_y, &mouse_x, &mouse_y, &mask); + } + + if (tick++ == 500) + { + XWindowAttributes xgwa; + XGetWindowAttributes (dpy, window, &xgwa); + tick = 0; + xlim = xgwa.width; + ylim = xgwa.height; + cmap = xgwa.colormap; + } + + /* compute the force of attraction/repulsion among all balls */ + for (i = 0; i < npoints; i++) + compute_force (i, &balls[i].dx, &balls[i].dy); + + /* move the balls according to the forces now in effect */ + for (i = 0; i < npoints; i++) + { + float old_x = balls[i].x; + float old_y = balls[i].y; + float new_x, new_y; + int size = balls[i].size; + balls[i].vx += balls[i].dx; + balls[i].vy += balls[i].dy; + + /* don't let them get too fast: impose a terminal velocity + (actually, make the medium have friction) */ + if (balls[i].vx > 10) + { + balls[i].vx *= 0.9; + balls[i].dx = 0; + } + else if (viscosity != 1) + { + balls[i].vx *= viscosity; + } + + if (balls[i].vy > 10) + { + balls[i].vy *= 0.9; + balls[i].dy = 0; + } + else if (viscosity != 1) + { + balls[i].vy *= viscosity; + } + + balls[i].x += balls[i].vx; + balls[i].y += balls[i].vy; + + /* bounce off the walls */ + if (balls[i].x >= (xlim - balls[i].size)) + { + balls[i].x = (xlim - balls[i].size - 1); + if (balls[i].vx > 0) + balls[i].vx = -balls[i].vx; + } + if (balls[i].y >= (ylim - balls[i].size)) + { + balls[i].y = (ylim - balls[i].size - 1); + if (balls[i].vy > 0) + balls[i].vy = -balls[i].vy; + } + if (balls[i].x <= 0) + { + balls[i].x = 0; + if (balls[i].vx < 0) + balls[i].vx = -balls[i].vx; + } + if (balls[i].y <= 0) + { + balls[i].y = 0; + if (balls[i].vy < 0) + balls[i].vy = -balls[i].vy; + } + + new_x = balls[i].x; + new_y = balls[i].y; + + /* make color saturation be related to particle acceleration. */ + if (glow_p) + { + float limit = 0.5; + double s, v, fraction; + float vx = balls [i].dx; + float vy = balls [i].dy; + XColor new_color; + if (vx < 0) vx = -vx; + if (vy < 0) vy = -vy; + fraction = vx + vy; + if (fraction > limit) fraction = limit; + + s = 1 - (fraction / limit); + v = 1.0; + + s = (s * 0.75) + 0.25; + + hsv_to_rgb (balls [i].hue, s, v, + &new_color.red, &new_color.green, &new_color.blue); + if (XAllocColor (dpy, cmap, &new_color)) + { + XFreeColors (dpy, cmap, &balls [i].color.pixel, 1, 0); + balls [i].color = new_color; + } + } + + if (mode == ball_mode) + { + if (!mono_p) + XSetForeground (dpy, draw_gc, balls [i].color.pixel); + XFillArc (dpy, window, erase_gc, (int) old_x, (int) old_y, + size, size, 0, 360*64); + XFillArc (dpy, window, draw_gc, (int) new_x, (int) new_y, + size, size, 0, 360*64); + } + if (mode != ball_mode) + { + point_stack [point_stack_fp].x = new_x; + point_stack [point_stack_fp].y = new_y; + point_stack_fp++; + } + } + + /* draw the lines or polygons after computing all points */ + if (mode != ball_mode) + { + point_stack [point_stack_fp].x = balls [0].x; /* close the polygon */ + point_stack [point_stack_fp].y = balls [0].y; + point_stack_fp++; + if (point_stack_fp == point_stack_size) + point_stack_fp = 0; + else if (point_stack_fp > point_stack_size) /* better be aligned */ + abort (); + if (!mono_p) + { + XColor color2, desired; + color2 = balls [0].color; + switch (cmode) + { + case cycle_mode: + cycle_hue (&color2, color_shift); + break; + case random_mode: + color2.red = random () % 65535; + color2.green = random () % 65535; + color2.blue = random () % 65535; + break; + default: + abort (); + } + + desired = color2; + if (XAllocColor (dpy, cmap, &color2)) + { + /* XAllocColor returns the actual RGB that the hardware let us + allocate. Restore the requested values into the XColor struct + so that limited-resolution hardware doesn't cause cycle_hue to + get "stuck". */ + color2.red = desired.red; + color2.green = desired.green; + color2.blue = desired.blue; + } + else + { + color2 = balls [0].color; + if (!XAllocColor (dpy, cmap, &balls [0].color)) + abort (); + } + pixel_stack [pixel_stack_fp++] = balls [0].color.pixel; + if (pixel_stack_fp >= pixel_stack_size) + pixel_stack_fp = 0; + XFreeColors (dpy, cmap, pixel_stack + pixel_stack_fp, 1, 0); + balls [0].color = color2; + XSetForeground (dpy, draw_gc, balls [0].color.pixel); + } + } + + switch (mode) + { + case ball_mode: + break; + case line_mode: + if (segments > 0) + XDrawLines (dpy, window, erase_gc, point_stack + point_stack_fp, + npoints + 1, CoordModeOrigin); + XDrawLines (dpy, window, draw_gc, point_stack + last_point_stack_fp, + npoints + 1, CoordModeOrigin); + break; + case polygon_mode: + if (segments > 0) + XFillPolygon (dpy, window, erase_gc, point_stack + point_stack_fp, + npoints + 1, (npoints == 3 ? Convex : Complex), + CoordModeOrigin); + XFillPolygon (dpy, window, draw_gc, point_stack + last_point_stack_fp, + npoints + 1, (npoints == 3 ? Convex : Complex), + CoordModeOrigin); + break; + case tail_mode: + { + int i; + for (i = 0; i < npoints; i++) + { + int index = point_stack_fp + i; + int next_index = (index + (npoints + 1)) % point_stack_size; + XDrawLine (dpy, window, erase_gc, + point_stack [index].x, + point_stack [index].y, + point_stack [next_index].x, + point_stack [next_index].y); + + index = last_point_stack_fp + i; + next_index = (index - (npoints + 1)) % point_stack_size; + if (next_index < 0) next_index += point_stack_size; + if (point_stack [next_index].x == 0 && + point_stack [next_index].y == 0) + continue; + XDrawLine (dpy, window, draw_gc, + point_stack [index].x, + point_stack [index].y, + point_stack [next_index].x, + point_stack [next_index].y); + } + } + break; + case spline_mode: + case spline_filled_mode: + { + int i; + static spline *s = 0; + if (! s) s = make_spline (npoints); + if (segments > 0) + { + for (i = 0; i < npoints; i++) + { + s->control_x [i] = point_stack [point_stack_fp + i].x; + s->control_y [i] = point_stack [point_stack_fp + i].y; + } + compute_closed_spline (s); + if (mode == spline_filled_mode) + XFillPolygon (dpy, window, erase_gc, s->points, s->n_points, + (s->n_points == 3 ? Convex : Complex), + CoordModeOrigin); + else + XDrawLines (dpy, window, erase_gc, s->points, s->n_points, + CoordModeOrigin); + } + for (i = 0; i < npoints; i++) + { + s->control_x [i] = point_stack [last_point_stack_fp + i].x; + s->control_y [i] = point_stack [last_point_stack_fp + i].y; + } + compute_closed_spline (s); + if (mode == spline_filled_mode) + XFillPolygon (dpy, window, draw_gc, s->points, s->n_points, + (s->n_points == 3 ? Convex : Complex), + CoordModeOrigin); + else + XDrawLines (dpy, window, draw_gc, s->points, s->n_points, + CoordModeOrigin); + } + break; + default: + abort (); + } + + XSync (dpy, True); +} + + +char *progclass = "Attraction"; + +char *defaults [] = { + "Attraction.background: black", /* to placate SGI */ + "Attraction.foreground: white", + "*mode: balls", + "*points: 0", + "*size: 0", + "*threshold: 100", + "*delay: 10000", + "*glow: false", + "*mouseSize: 10", + "*mouse: false", + "*viscosity: 1", + "*orbit: false", + "*colorShift: 3", + "*segments: 100", + 0 +}; + +XrmOptionDescRec options [] = { + { "-mode", ".mode", XrmoptionSepArg, 0 }, + { "-points", ".points", XrmoptionSepArg, 0 }, + { "-threshold", ".threshold", XrmoptionSepArg, 0 }, + { "-segments", ".segments", XrmoptionSepArg, 0 }, + { "-delay", ".delay", XrmoptionSepArg, 0 }, + { "-size", ".size", XrmoptionSepArg, 0 }, + { "-color-mode", ".colorMode", XrmoptionSepArg, 0 }, + { "-color-shift", ".colorShift", XrmoptionSepArg, 0 }, + { "-radius", ".radius", XrmoptionSepArg, 0 }, + { "-vx", ".vx", XrmoptionSepArg, 0 }, + { "-vy", ".vy", XrmoptionSepArg, 0 }, + { "-vmult", ".vMult", XrmoptionSepArg, 0 }, + { "-mouse-size", ".mouseSize", XrmoptionSepArg, 0 }, + { "-mouse", ".mouse", XrmoptionNoArg, "true" }, + { "-nomouse", ".mouse", XrmoptionNoArg, "false" }, + { "-viscosity", ".viscosity", XrmoptionSepArg, 0 }, + { "-glow", ".glow", XrmoptionNoArg, "true" }, + { "-noglow", ".glow", XrmoptionNoArg, "false" }, + { "-orbit", ".orbit", XrmoptionNoArg, "true" } +}; +int options_size = (sizeof (options) / sizeof (options[0])); + +void +screenhack (dpy, window) + Display *dpy; + Window window; +{ + init_balls (dpy, window); + while (1) + { + run_balls (dpy, window); + if (delay) usleep (delay); + } +} diff --git a/hacks/attraction.c_ori b/hacks/attraction.c_ori new file mode 100755 index 00000000..8e3f188f --- /dev/null +++ b/hacks/attraction.c_ori @@ -0,0 +1,685 @@ +/* xscreensaver, Copyright (c) 1992, 1995 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. + */ + +/* Simulation of a pair of quasi-gravitational fields, maybe sorta kinda + a little like the strong and weak electromagnetic forces. Derived from + a Lispm screensaver by John Pezaris . Mouse control and + viscosity added by "Philip Edward Cutone, III" . + + John sez: + + The simulation started out as a purely accurate gravitational simulation, + but, with constant simulation step size, I quickly realized the field being + simulated while grossly gravitational was, in fact, non-conservative. It + also had the rather annoying behavior of dealing very badly with colliding + orbs. Therefore, I implemented a negative-gravity region (with two + thresholds; as I read your code, you only implemented one) to prevent orbs + from every coming too close together, and added a viscosity factor if the + speed of any orb got too fast. This provides a nice stable system with + interesting behavior. + + I had experimented with a number of fields including the van der Waals + force (very interesting orbiting behavior) and 1/r^3 gravity (not as + interesting as 1/r^2). An even normal viscosity (rather than the + thresholded version to bleed excess energy) is also not interesting. + The 1/r^2, -1/r^2, -10/r^2 thresholds proved not only robust but also + interesting -- the orbs never collided and the threshold viscosity fixed + the non-conservational problem. + + Philip sez: + > An even normal viscosity (rather than the thresholded version to + > bleed excess energy) is also not interesting. + + unless you make about 200 points.... set the viscosity to about .8 + and drag the mouse through it. it makes a nice wave which travels + through the field. + */ + +#include +#include +#include "screenhack.h" +#include "spline.h" + +struct ball { + float x, y; + float vx, vy; + float dx, dy; + float mass; + int size; + XColor color; + int hue; +}; + +static unsigned int default_fg_pixel; +static struct ball *balls; +static int npoints; +static int threshold; +static int delay; +static int global_size; +static int segments; +static Bool glow_p; +static Bool orbit_p; +static XPoint *point_stack; +static int point_stack_size, point_stack_fp, pixel_stack_fp, pixel_stack_size; +static unsigned long *pixel_stack; +static unsigned int color_shift; + +/*flip mods for mouse interaction*/ +static Bool mouse_p; +int mouse_x, mouse_y, mouse_mass, root_x, root_y; +static float viscosity; + +static enum object_mode { + ball_mode, line_mode, polygon_mode, spline_mode, spline_filled_mode, + tail_mode +} mode; + +static enum color_mode { + cycle_mode, random_mode +} cmode; + +static GC draw_gc, erase_gc; + +#define MAX_SIZE 16 + +#define min(a,b) ((a)<(b)?(a):(b)) +#define max(a,b) ((a)>(b)?(a):(b)) + +static void +init_balls (dpy, window) + Display *dpy; + Window window; +{ + int i; + XWindowAttributes xgwa; + XGCValues gcv; + int xlim, ylim, midx, midy, r, vx, vy; + double th; + Colormap cmap; + char *mode_str; + XGetWindowAttributes (dpy, window, &xgwa); + xlim = xgwa.width; + ylim = xgwa.height; + cmap = xgwa.colormap; + midx = xlim/2; + midy = ylim/2; + r = get_integer_resource ("radius", "Integer"); + if (r <= 0 || r > min (xlim/2, ylim/2)) + r = min (xlim/2, ylim/2) - 50; + vx = get_integer_resource ("vx", "Integer"); + vy = get_integer_resource ("vy", "Integer"); + npoints = get_integer_resource ("points", "Integer"); + if (npoints < 1) + npoints = 3 + (random () % 5); + balls = (struct ball *) malloc (npoints * sizeof (struct ball)); + segments = get_integer_resource ("segments", "Integer"); + if (segments < 0) segments = 1; + threshold = get_integer_resource ("threshold", "Integer"); + if (threshold < 0) threshold = 0; + delay = get_integer_resource ("delay", "Integer"); + if (delay < 0) delay = 0; + global_size = get_integer_resource ("size", "Integer"); + if (global_size < 0) global_size = 0; + glow_p = get_boolean_resource ("glow", "Boolean"); + orbit_p = get_boolean_resource ("orbit", "Boolean"); + color_shift = get_integer_resource ("colorShift", "Integer"); + if (color_shift >= 360) color_shift = 5; + + /*flip mods for mouse interaction*/ + mouse_p = get_boolean_resource ("mouse", "Boolean"); + mouse_mass = get_integer_resource ("mouseSize", "Integer"); + mouse_mass = mouse_mass * mouse_mass *10; + + viscosity = get_float_resource ("viscosity", "Float"); + + mode_str = get_string_resource ("mode", "Mode"); + if (! mode_str) mode = ball_mode; + else if (!strcmp (mode_str, "balls")) mode = ball_mode; + else if (!strcmp (mode_str, "lines")) mode = line_mode; + else if (!strcmp (mode_str, "polygons")) mode = polygon_mode; + else if (!strcmp (mode_str, "tails")) mode = tail_mode; + else if (!strcmp (mode_str, "splines")) mode = spline_mode; + else if (!strcmp (mode_str, "filled-splines")) mode = spline_filled_mode; + else { + fprintf (stderr, + "%s: mode must be balls, lines, tails, polygons, splines, or\n\ + filled-splines, not \"%s\"\n", + progname, mode_str); + exit (1); + } + + mode_str = get_string_resource ("colorMode", "ColorMode"); + if (! mode_str) cmode = cycle_mode; + else if (!strcmp (mode_str, "cycle")) cmode = cycle_mode; + else if (!strcmp (mode_str, "random")) cmode = random_mode; + else { + fprintf (stderr, "%s: colorMode must be cycle or random, not \"%s\"\n", + progname, mode_str); + exit (1); + } + + if (mode != ball_mode && mode != tail_mode) glow_p = False; + + if (mode == polygon_mode && npoints < 3) + mode = line_mode; + + if (mode != ball_mode) + { + int size = (segments ? segments : 1); + point_stack_size = size * (npoints + 1); + point_stack = (XPoint *) calloc (point_stack_size, sizeof (XPoint)); + point_stack_fp = 0; + if (segments > 0) + pixel_stack_size = segments; + else + pixel_stack_size = (360 / color_shift); + pixel_stack = (unsigned long *) + calloc (pixel_stack_size, sizeof (unsigned int)); + pixel_stack_fp = 0; + } + + gcv.line_width = (mode == tail_mode + ? (global_size ? global_size : (MAX_SIZE * 2 / 3)) + : 1); + gcv.cap_style = (mode == tail_mode ? CapRound : CapButt); + + gcv.foreground = default_fg_pixel = + get_pixel_resource ("foreground", "Foreground", dpy, cmap); + draw_gc = XCreateGC (dpy, window, GCForeground|GCLineWidth|GCCapStyle, &gcv); + gcv.foreground = get_pixel_resource ("background", "Background", dpy, cmap); + erase_gc = XCreateGC (dpy, window, GCForeground|GCLineWidth|GCCapStyle,&gcv); + + if (!mono_p && mode != ball_mode) + for (i = 0; i < pixel_stack_size; i++) + { + XColor color; + color.pixel = default_fg_pixel; + XQueryColor (dpy, cmap, &color); + if (!XAllocColor (dpy, cmap, &color)) abort (); + pixel_stack [i] = color.pixel; + } + +#define rand_size() min (MAX_SIZE, 8 + (random () % (MAX_SIZE - 9))) + + if (orbit_p && !global_size) + /* To orbit, all objects must be the same mass, or the math gets + really hairy... */ + global_size = rand_size (); + + th = frand (M_PI+M_PI); + for (i = 0; i < npoints; i++) + { + int new_size = (global_size ? global_size : rand_size ()); + balls [i].dx = 0; + balls [i].dy = 0; + balls [i].size = new_size; + balls [i].mass = (new_size * new_size * 10); + balls [i].x = midx + r * cos (i * ((M_PI+M_PI) / npoints) + th); + balls [i].y = midy + r * sin (i * ((M_PI+M_PI) / npoints) + th); + if (! orbit_p) + { + balls [i].vx = vx ? vx : ((6.0 - (random () % 11)) / 8.0); + balls [i].vy = vy ? vy : ((6.0 - (random () % 11)) / 8.0); + } + balls [i].color.pixel = default_fg_pixel; + balls [i].color.flags = DoRed | DoGreen | DoBlue; + if (!mono_p) + { + if (i != 0 && (glow_p || mode != ball_mode)) + balls [i].hue = balls [0].hue; + else + balls [i].hue = random () % 360; + hsv_to_rgb (balls [i].hue, 1.0, 1.0, + &balls [i].color.red, &balls [i].color.green, + &balls [i].color.blue); + if (!XAllocColor (dpy, cmap, &balls [i].color)) + mono_p = True; /* just give up */ + } + } + + if (orbit_p) + { + double a = 0; + double v; + double v_mult = get_float_resource ("vMult", "Float"); + if (v_mult == 0.0) v_mult = 1.0; + + for (i = 1; i < npoints; i++) + { + double _2ipi_n = (2 * i * M_PI / npoints); + double x = r * cos (_2ipi_n); + double y = r * sin (_2ipi_n); + double distx = r - x; + double dist2 = (distx * distx) + (y * y); + double dist = sqrt (dist2); + double a1 = ((balls[i].mass / dist2) * + ((dist < threshold) ? -1.0 : 1.0) * + (distx / dist)); + a += a1; + } + if (a < 0.0) + { + fprintf (stderr, "%s: domain error: forces on balls too great\n", + progname); + exit (-1); + } + v = sqrt (a * r) * v_mult; + for (i = 0; i < npoints; i++) + { + double k = ((2 * i * M_PI / npoints) + th); + balls [i].vx = -v * sin (k); + balls [i].vy = v * cos (k); + } + } + + if (mono_p) glow_p = False; + XClearWindow (dpy, window); +} + +static void +compute_force (i, dx_ret, dy_ret) + int i; + float *dx_ret, *dy_ret; +{ + int j; + float x_dist, y_dist, dist, dist2; + *dx_ret = 0; + *dy_ret = 0; + for (j = 0; j < npoints; j++) + { + float x_dist, y_dist, dist, dist2; + + if (i == j) continue; + x_dist = balls [j].x - balls [i].x; + y_dist = balls [j].y - balls [i].y; + dist2 = (x_dist * x_dist) + (y_dist * y_dist); + dist = sqrt (dist2); + + if (dist > 0.1) /* the balls are not overlapping */ + { + float new_acc = ((balls[j].mass / dist2) * + ((dist < threshold) ? -1.0 : 1.0)); + float new_acc_dist = new_acc / dist; + *dx_ret += new_acc_dist * x_dist; + *dy_ret += new_acc_dist * y_dist; + } + else + { /* the balls are overlapping; move randomly */ + *dx_ret += (frand (10.0) - 5.0); + *dy_ret += (frand (10.0) - 5.0); + } + } + + if (mouse_p) + { + x_dist = mouse_x - balls [i].x; + y_dist = mouse_y - balls [i].y; + dist2 = (x_dist * x_dist) + (y_dist * y_dist); + dist = sqrt (dist2); + + if (dist > 0.1) /* the balls are not overlapping */ + { + float new_acc = ((mouse_mass / dist2) * + ((dist < threshold) ? -1.0 : 1.0)); + float new_acc_dist = new_acc / dist; + *dx_ret += new_acc_dist * x_dist; + *dy_ret += new_acc_dist * y_dist; + } + else + { /* the balls are overlapping; move randomly */ + *dx_ret += (frand (10.0) - 5.0); + *dy_ret += (frand (10.0) - 5.0); + } + } +} + +static void +run_balls (dpy, window) + Display *dpy; + Window window; +{ + int last_point_stack_fp = point_stack_fp; + static int tick = 500, xlim, ylim; + static Colormap cmap; + int i; + + /*flip mods for mouse interaction*/ + Window root1, child1; + int mask; + if (mouse_p) + { + XQueryPointer(dpy, window, &root1, &child1, + &root_x, &root_y, &mouse_x, &mouse_y, &mask); + } + + if (tick++ == 500) + { + XWindowAttributes xgwa; + XGetWindowAttributes (dpy, window, &xgwa); + tick = 0; + xlim = xgwa.width; + ylim = xgwa.height; + cmap = xgwa.colormap; + } + + /* compute the force of attraction/repulsion among all balls */ + for (i = 0; i < npoints; i++) + compute_force (i, &balls[i].dx, &balls[i].dy); + + /* move the balls according to the forces now in effect */ + for (i = 0; i < npoints; i++) + { + float old_x = balls[i].x; + float old_y = balls[i].y; + float new_x, new_y; + int size = balls[i].size; + balls[i].vx += balls[i].dx; + balls[i].vy += balls[i].dy; + + /* don't let them get too fast: impose a terminal velocity + (actually, make the medium have friction) */ + if (balls[i].vx > 10) + { + balls[i].vx *= 0.9; + balls[i].dx = 0; + } + else if (viscosity != 1) + { + balls[i].vx *= viscosity; + } + + if (balls[i].vy > 10) + { + balls[i].vy *= 0.9; + balls[i].dy = 0; + } + else if (viscosity != 1) + { + balls[i].vy *= viscosity; + } + + balls[i].x += balls[i].vx; + balls[i].y += balls[i].vy; + + /* bounce off the walls */ + if (balls[i].x >= (xlim - balls[i].size)) + { + balls[i].x = (xlim - balls[i].size - 1); + if (balls[i].vx > 0) + balls[i].vx = -balls[i].vx; + } + if (balls[i].y >= (ylim - balls[i].size)) + { + balls[i].y = (ylim - balls[i].size - 1); + if (balls[i].vy > 0) + balls[i].vy = -balls[i].vy; + } + if (balls[i].x <= 0) + { + balls[i].x = 0; + if (balls[i].vx < 0) + balls[i].vx = -balls[i].vx; + } + if (balls[i].y <= 0) + { + balls[i].y = 0; + if (balls[i].vy < 0) + balls[i].vy = -balls[i].vy; + } + + new_x = balls[i].x; + new_y = balls[i].y; + + /* make color saturation be related to particle acceleration. */ + if (glow_p) + { + float limit = 0.5; + double s, v, fraction; + float vx = balls [i].dx; + float vy = balls [i].dy; + XColor new_color; + if (vx < 0) vx = -vx; + if (vy < 0) vy = -vy; + fraction = vx + vy; + if (fraction > limit) fraction = limit; + + s = 1 - (fraction / limit); + v = 1.0; + + s = (s * 0.75) + 0.25; + + hsv_to_rgb (balls [i].hue, s, v, + &new_color.red, &new_color.green, &new_color.blue); + if (XAllocColor (dpy, cmap, &new_color)) + { + XFreeColors (dpy, cmap, &balls [i].color.pixel, 1, 0); + balls [i].color = new_color; + } + } + + if (mode == ball_mode) + { + if (!mono_p) + XSetForeground (dpy, draw_gc, balls [i].color.pixel); + XFillArc (dpy, window, erase_gc, (int) old_x, (int) old_y, + size, size, 0, 360*64); + XFillArc (dpy, window, draw_gc, (int) new_x, (int) new_y, + size, size, 0, 360*64); + } + if (mode != ball_mode) + { + point_stack [point_stack_fp].x = new_x; + point_stack [point_stack_fp].y = new_y; + point_stack_fp++; + } + } + + /* draw the lines or polygons after computing all points */ + if (mode != ball_mode) + { + point_stack [point_stack_fp].x = balls [0].x; /* close the polygon */ + point_stack [point_stack_fp].y = balls [0].y; + point_stack_fp++; + if (point_stack_fp == point_stack_size) + point_stack_fp = 0; + else if (point_stack_fp > point_stack_size) /* better be aligned */ + abort (); + if (!mono_p) + { + XColor color2, desired; + color2 = balls [0].color; + switch (cmode) + { + case cycle_mode: + cycle_hue (&color2, color_shift); + break; + case random_mode: + color2.red = random () % 65535; + color2.green = random () % 65535; + color2.blue = random () % 65535; + break; + default: + abort (); + } + + desired = color2; + if (XAllocColor (dpy, cmap, &color2)) + { + /* XAllocColor returns the actual RGB that the hardware let us + allocate. Restore the requested values into the XColor struct + so that limited-resolution hardware doesn't cause cycle_hue to + get "stuck". */ + color2.red = desired.red; + color2.green = desired.green; + color2.blue = desired.blue; + } + else + { + color2 = balls [0].color; + if (!XAllocColor (dpy, cmap, &balls [0].color)) + abort (); + } + pixel_stack [pixel_stack_fp++] = balls [0].color.pixel; + if (pixel_stack_fp >= pixel_stack_size) + pixel_stack_fp = 0; + XFreeColors (dpy, cmap, pixel_stack + pixel_stack_fp, 1, 0); + balls [0].color = color2; + XSetForeground (dpy, draw_gc, balls [0].color.pixel); + } + } + + switch (mode) + { + case ball_mode: + break; + case line_mode: + if (segments > 0) + XDrawLines (dpy, window, erase_gc, point_stack + point_stack_fp, + npoints + 1, CoordModeOrigin); + XDrawLines (dpy, window, draw_gc, point_stack + last_point_stack_fp, + npoints + 1, CoordModeOrigin); + break; + case polygon_mode: + if (segments > 0) + XFillPolygon (dpy, window, erase_gc, point_stack + point_stack_fp, + npoints + 1, (npoints == 3 ? Convex : Complex), + CoordModeOrigin); + XFillPolygon (dpy, window, draw_gc, point_stack + last_point_stack_fp, + npoints + 1, (npoints == 3 ? Convex : Complex), + CoordModeOrigin); + break; + case tail_mode: + { + int i; + for (i = 0; i < npoints; i++) + { + int index = point_stack_fp + i; + int next_index = (index + (npoints + 1)) % point_stack_size; + XDrawLine (dpy, window, erase_gc, + point_stack [index].x, + point_stack [index].y, + point_stack [next_index].x, + point_stack [next_index].y); + + index = last_point_stack_fp + i; + next_index = (index - (npoints + 1)) % point_stack_size; + if (next_index < 0) next_index += point_stack_size; + if (point_stack [next_index].x == 0 && + point_stack [next_index].y == 0) + continue; + XDrawLine (dpy, window, draw_gc, + point_stack [index].x, + point_stack [index].y, + point_stack [next_index].x, + point_stack [next_index].y); + } + } + break; + case spline_mode: + case spline_filled_mode: + { + int i; + static spline *s = 0; + if (! s) s = make_spline (npoints); + if (segments > 0) + { + for (i = 0; i < npoints; i++) + { + s->control_x [i] = point_stack [point_stack_fp + i].x; + s->control_y [i] = point_stack [point_stack_fp + i].y; + } + compute_closed_spline (s); + if (mode == spline_filled_mode) + XFillPolygon (dpy, window, erase_gc, s->points, s->n_points, + (s->n_points == 3 ? Convex : Complex), + CoordModeOrigin); + else + XDrawLines (dpy, window, erase_gc, s->points, s->n_points, + CoordModeOrigin); + } + for (i = 0; i < npoints; i++) + { + s->control_x [i] = point_stack [last_point_stack_fp + i].x; + s->control_y [i] = point_stack [last_point_stack_fp + i].y; + } + compute_closed_spline (s); + if (mode == spline_filled_mode) + XFillPolygon (dpy, window, draw_gc, s->points, s->n_points, + (s->n_points == 3 ? Convex : Complex), + CoordModeOrigin); + else + XDrawLines (dpy, window, draw_gc, s->points, s->n_points, + CoordModeOrigin); + } + break; + default: + abort (); + } + + XSync (dpy, True); +} + + +char *progclass = "Attraction"; + +char *defaults [] = { + "Attraction.background: black", /* to placate SGI */ + "Attraction.foreground: white", + "*mode: balls", + "*points: 0", + "*size: 0", + "*threshold: 100", + "*delay: 10000", + "*glow: false", + "*mouseSize: 10", + "*mouse: false", + "*viscosity: 1", + "*orbit: false", + "*colorShift: 3", + "*segments: 100", + 0 +}; + +XrmOptionDescRec options [] = { + { "-mode", ".mode", XrmoptionSepArg, 0 }, + { "-points", ".points", XrmoptionSepArg, 0 }, + { "-threshold", ".threshold", XrmoptionSepArg, 0 }, + { "-segments", ".segments", XrmoptionSepArg, 0 }, + { "-delay", ".delay", XrmoptionSepArg, 0 }, + { "-size", ".size", XrmoptionSepArg, 0 }, + { "-color-mode", ".colorMode", XrmoptionSepArg, 0 }, + { "-color-shift", ".colorShift", XrmoptionSepArg, 0 }, + { "-radius", ".radius", XrmoptionSepArg, 0 }, + { "-vx", ".vx", XrmoptionSepArg, 0 }, + { "-vy", ".vy", XrmoptionSepArg, 0 }, + { "-vmult", ".vMult", XrmoptionSepArg, 0 }, + { "-mouse-size", ".mouseSize", XrmoptionSepArg, 0 }, + { "-mouse", ".mouse", XrmoptionNoArg, "true" }, + { "-nomouse", ".mouse", XrmoptionNoArg, "false" }, + { "-viscosity", ".viscosity", XrmoptionSepArg, 0 }, + { "-glow", ".glow", XrmoptionNoArg, "true" }, + { "-noglow", ".glow", XrmoptionNoArg, "false" }, + { "-orbit", ".orbit", XrmoptionNoArg, "true" } +}; +int options_size = (sizeof (options) / sizeof (options[0])); + +void +screenhack (dpy, window) + Display *dpy; + Window window; +{ + init_balls (dpy, window); + while (1) + { + run_balls (dpy, window); + if (delay) usleep (delay); + } +} diff --git a/hacks/attraction.exe_axp b/hacks/attraction.exe_axp new file mode 100755 index 0000000000000000000000000000000000000000..4a89476a445e5e56d8975ecb94c9c406c5d1355a GIT binary patch literal 51712 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 literal 0 HcmV?d00001 diff --git a/hacks/attraction.exe_vax b/hacks/attraction.exe_vax new file mode 100755 index 0000000000000000000000000000000000000000..13498e03a40e0a4843f2e8b9703a1e038cc67110 GIT binary patch literal 27136 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 k$-(gan6pTPUtQ{, 13-aug-92. + +Viscosity and mouse support by Philip Edward Cutone, III. diff --git a/hacks/attraction.man b/hacks/attraction.man new file mode 100755 index 00000000..e3f94243 --- /dev/null +++ b/hacks/attraction.man @@ -0,0 +1,179 @@ +.de EX \"Begin example +.ne 5 +.if n .sp 1 +.if t .sp .5 +.nf +.in +.5i +.. +.de EE +.fi +.in -.5i +.if n .sp 1 +.if t .sp .5 +.. +.TH XScreenSaver 1 "14-Dec-95" "X Version 11" +.SH NAME +attraction - interactions of opposing forces +.SH SYNOPSIS +.B attraction +[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP] [\-background \fIcolor\fP] [\-window] [\-root] [\-mono] [\-install] [\-visual \fIvisual\fP] [\-points \fIint\fP] [\-threshold \fIint\fP] [\-mode balls | lines | polygons | splines | filled-splines | tails ] [\-color-mode cycle | random] [\-size \fIint\fP] [\-segments \fIint\fP] [\-delay \fIusecs\fP] [\-color-shift \fIdegrees\fP] [\-radius \fIint\fP] [\-vx \fIint\fP] [\-vy \fIint\fP] [\-glow] [\-noglow] [\-orbit] [\-viscosity \fIfloat\fP] [\-mouse] [\-no-mouse] [\-mouse-size] +.SH DESCRIPTION +The \fIattraction\fP program has several visually different modes of +operation, all of which are based on the interactions of a set of control +points which attract each other up to a certain distance, and then begin +to repel each other. The attraction/repulsion is proportional to the +distance between any two particles. +.SH OPTIONS +.I attraction +accepts the following options: +.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 \-mono +If on a color display, pretend we're on a monochrome display. +.TP 8 +.B \-install +Install a private colormap for the window. +.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 \-points integer +How many control points should be used, or 0 to select the number randomly. +Default 0. Between 3 and 15 works best. +.TP 8 +.B \-threshold integer +The distance (in pixels) from each particle at which the attractive force +becomes repulsive. Default 100. +.TP 8 +.B \-mode "balls | lines | polygons | tails | splines | filled-splines" +In \fIballs\fP mode (the default) the control points are drawn as filled +circles. The larger the circle, the more massive the particle. + +In \fIlines\fP mode, the control points are connected by straight lines; +the effect is something like \fIqix\fP. + +In \fIpolygons\fP mode, the control points are connected by straight +lines, and filled in. This is most interesting in color. + +In \fIsplines\fP mode, a closed spline is interpolated from the control +points. + +In \fIfilled-splines\fP mode, the splines are filled in instead of being +outlines. This is most interesting in color. + +In \fItails\fP mode, the path which each particle follows is indicated +by a worm-like trail, whose length is controlled by the \fIsegments\fP +parameter. +.TP 8 +.B \-color-mode cycle | random +Whether colors should cycle through the spectrum, or be picked randomly. +.TP 8 +.B \-size integer +The size of the balls in pixels, or 0, meaning to select the sizes +randomly (the default.) If this is specified, then all balls will be +the same size. This option has an effect in all modes, since the ``size'' +of the balls controls their mass. +.TP 8 +.B \-segments integer +If in \fIlines\fP or \fIpolygons\fP mode, how many sets of line segments +or polygons should be drawn. Default 100. This has no effect in \fIballs\fP +mode. If \fIsegments\fP is 0, then no segments will ever be erased (this +is only useful in color.) +.TP 8 +.B \-delay microseconds +How much of a delay should be introduced between steps of the animation. +Default 10000, or about 0.01 seconds. +.TP 8 +.B \-color-shift degrees +If on a color display, the color of the line segments or polygons will +cycle through the spectrum. This specifies how far the hue of each segment +should be from the next, in degrees on the HSV wheel. Default 3. +This has no effect in \fIballs\fP mode. +.TP 8 +.B \-radius +The size in pixels of the circle on which the points are initially positioned. +The default is slightly smaller than the size of the window. +.TP 8 +.B \-glow +This is consulted only in \fIballs\fP mode. If this is specified, then +the saturation of the colors of the points will vary according to their +current acceleration. This has the effect that the balls flare brighter +when they are reacting to each other most strongly. + +In \fIglow\fP mode, all of the balls will be drawn the same (random) +color, modulo the saturation shifts. In non-glow mode, the balls will +each be drawn in a random color that doesn't change. +.TP 8 +.B \-noglow +Don't do ``glowing.'' This is the default. +.TP 8 +.B \-vx pixels +.TP 8 +.B \-vy pixels +Initial velocity of the balls. This has no effect in \fB\-orbit\fP mode. +.TP 8 +.B \-orbit +Make the initial force on each ball be tangential to the circle on which +they are initially placed, with the right velocity to hold them in orbit +about each other. After a while, roundoff errors will cause the orbit +to decay. +.TP 8 +.B \-vmult float +In orbit mode, the initial velocity of the balls is multiplied by this; +a number less than 1 will make the balls pull closer together, and a larger +number will make them move apart. The default is 1, meaning stability. +.TP 8 +.B \-viscosity float +This sets the viscosity of the hypothetical fluid through which the control +points move; the default is 1, meaning no resistance. Values higher than 1 +aren't interesting; lower values cause less motion. + +One interesting thing to try is +.EX +attraction -viscosity 0.8 -points 75 \\ + -mouse -geometry =500x500 +.EE +Give it a few seconds to settle down into a stable clump, and then move +the mouse through it to make "waves". +.TP 8 +.B \-mouse +This will cause the mouse to be considered a control point; it will not be +drawn, but it will influence the other points, so you can wave the mouse +and influence the images being created. +.TP 8 +.B \-no-mouse +Turns off \fB\-mouse\fP. +.TP 8 +.B \-mouse-size integer +In \fB\-mouse\fP mode, this sets the mass of the mouse (analagously to the +\fB\-size\fP parameter.) +.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. +.SH SEE ALSO +.BR X (1), +.BR xscreensaver (1) +.SH COPYRIGHT +Copyright \(co 1992, 1993 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 , 13-aug-92. + +Viscosity and mouse support by Philip Edward Cutone, III. diff --git a/hacks/axpobjs.zip b/hacks/axpobjs.zip new file mode 100755 index 0000000000000000000000000000000000000000..af8af469d9a938aacdcc6d0d27e596510907decc GIT binary patch literal 181509 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

^%f!BVY~@43-i#@zU+rZay20t0~Nab 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%0Db9dlQhx;UEP=XK1+T1KI&Rl-~{NI1=LZ?t3^L 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 Am;e9( literal 0 HcmV?d00001 diff --git a/hacks/blitspin.c b/hacks/blitspin.c new file mode 100755 index 00000000..772afe98 --- /dev/null +++ b/hacks/blitspin.c @@ -0,0 +1,278 @@ +/* xscreensaver, Copyright (c) 1992 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. + */ + +/* Rotate a bitmap using using bitblts. + The bitmap must be square, and must be a power of 2 in size. + This was translated from SmallTalk code which appeared in the + August 1981 issue of Byte magazine. + + The input bitmap may be non-square, it is padded and centered + with the background color. Another way would be to subdivide + the bitmap into square components and rotate them independently + (and preferably in parallel), but I don't think that would be as + interesting looking. + + It's too bad almost nothing uses blitter hardware these days, + or this might actually win. + */ + +#include "screenhack.h" +#include + +#ifdef HAVE_XPM +# include +# ifndef PIXEL_ALREADY_TYPEDEFED +# define PIXEL_ALREADY_TYPEDEFED /* Sigh, Xmu/Drawing.h needs this... */ +# endif +#endif + +#ifndef VMS +#include +#else +#include "sys$common:[decw$include.xmu]Drawing.h" +#endif + + +#include "default.xbm" + +static Display *dpy; +static Window window; +static unsigned int size; +static Pixmap self, temp, mask; +static GC SET, CLR, CPY, IOR, AND, XOR; +static GC gc; +static int delay, delay2; +static Pixmap bitmap; +static int depth; +static unsigned int fg, bg; + +static void rotate(), init (), display (); + +#define copy_all_to(from, xoff, yoff, to, gc) \ + XCopyArea (dpy, (from), (to), (gc), 0, 0, \ + size-(xoff), size-(yoff), (xoff), (yoff)) + +#define copy_all_from(to, xoff, yoff, from, gc) \ + XCopyArea (dpy, (from), (to), (gc), (xoff), (yoff), \ + size-(xoff), size-(yoff), 0, 0) + +static void +rotate () +{ + int qwad; /* fuckin' C, man... who needs namespaces? */ + XFillRectangle (dpy, mask, CLR, 0, 0, size, size); + XFillRectangle (dpy, mask, SET, 0, 0, size>>1, size>>1); + for (qwad = size>>1; qwad > 0; qwad>>=1) + { + if (delay) usleep (delay); + copy_all_to (mask, 0, 0, temp, CPY); /* 1 */ + copy_all_to (mask, 0, qwad, temp, IOR); /* 2 */ + copy_all_to (self, 0, 0, temp, AND); /* 3 */ + copy_all_to (temp, 0, 0, self, XOR); /* 4 */ + copy_all_from (temp, qwad, 0, self, XOR); /* 5 */ + copy_all_from (self, qwad, 0, self, IOR); /* 6 */ + copy_all_to (temp, qwad, 0, self, XOR); /* 7 */ + copy_all_to (self, 0, 0, temp, CPY); /* 8 */ + copy_all_from (temp, qwad, qwad, self, XOR); /* 9 */ + copy_all_to (mask, 0, 0, temp, AND); /* A */ + copy_all_to (temp, 0, 0, self, XOR); /* B */ + copy_all_to (temp, qwad, qwad, self, XOR); /* C */ + copy_all_from (mask, qwad>>1, qwad>>1, mask, AND); /* D */ + copy_all_to (mask, qwad, 0, mask, IOR); /* E */ + copy_all_to (mask, 0, qwad, mask, IOR); /* F */ + display (self); + } +} + +static void +read_bitmap (bitmap_name, widthP, heightP) + char *bitmap_name; + int *widthP, *heightP; +{ +#ifdef HAVE_XPM + XpmAttributes xpmattrs; + int result; + xpmattrs.valuemask = 0; + bitmap = 0; + result = XpmReadFileToPixmap (dpy, window, bitmap_name, &bitmap, 0, + &xpmattrs); + switch (result) + { + case XpmColorError: + fprintf (stderr, "%s: warning: xpm color substitution performed\n", + progname); + /* fall through */ + case XpmSuccess: + *widthP = xpmattrs.width; + *heightP = xpmattrs.height; + break; + case XpmFileInvalid: + case XpmOpenFailed: + bitmap = 0; + break; + case XpmColorFailed: + fprintf (stderr, "%s: xpm: color allocation failed\n", progname); + exit (-1); + case XpmNoMemory: + fprintf (stderr, "%s: xpm: out of memory\n", progname); + exit (-1); + default: + fprintf (stderr, "%s: xpm: unknown error code %d\n", progname, result); + exit (-1); + } + if (! bitmap) +#endif + { + int xh, yh; + Pixmap b2; + bitmap = XmuLocateBitmapFile (DefaultScreenOfDisplay (dpy), bitmap_name, + 0, 0, widthP, heightP, &xh, &yh); + if (! bitmap) + { + fprintf (stderr, "%s: couldn't find bitmap %s\n", progname, + bitmap_name); + exit (1); + } + b2 = XmuCreatePixmapFromBitmap (dpy, window, bitmap, *widthP, *heightP, + depth, fg, bg); + XFreePixmap (dpy, bitmap); + bitmap = b2; + } +} + +static void +init () +{ + XWindowAttributes xgwa; + Colormap cmap; + XGCValues gcv; + int width, height; + unsigned int real_size; + char *bitmap_name; + int i; + + XGetWindowAttributes (dpy, window, &xgwa); + cmap = xgwa.colormap; + depth = xgwa.depth; + + fg = get_pixel_resource ("foreground", "Foreground", dpy, cmap); + bg = get_pixel_resource ("background", "Background", dpy, cmap); + delay = get_integer_resource ("delay", "Integer"); + delay2 = get_integer_resource ("delay2", "Integer"); + if (delay < 0) delay = 0; + if (delay2 < 0) delay2 = 0; + bitmap_name = get_string_resource ("bitmap", "Bitmap"); + if (! bitmap_name || !*bitmap_name) + bitmap_name = "(default)"; + + if (!strcmp (bitmap_name, "(default)")) + { + width = logo_width; + height = logo_height; + bitmap = XCreatePixmapFromBitmapData (dpy, window, (char *) logo_bits, + width, height, fg, bg, depth); + } + else + { + read_bitmap (bitmap_name, &width, &height); + } + + real_size = (width > height) ? width : height; + + size = real_size; + /* semi-sleazy way of doing (setq size (expt 2 (ceiling (log size 2)))). */ + for (i = 31; i > 0; i--) + if (size & (1<>i)<<(i+1); + self = XCreatePixmap (dpy, window, size, size, depth); + temp = XCreatePixmap (dpy, window, size, size, depth); + mask = XCreatePixmap (dpy, window, size, size, depth); + gcv.foreground = (depth == 1 ? 1 : (~0)); + gcv.function=GXset; SET = XCreateGC(dpy,self,GCFunction|GCForeground,&gcv); + gcv.function=GXclear;CLR = XCreateGC(dpy,self,GCFunction|GCForeground,&gcv); + gcv.function=GXcopy; CPY = XCreateGC(dpy,self,GCFunction|GCForeground,&gcv); + gcv.function=GXor; IOR = XCreateGC(dpy,self,GCFunction|GCForeground,&gcv); + gcv.function=GXand; AND = XCreateGC(dpy,self,GCFunction|GCForeground,&gcv); + gcv.function=GXxor; XOR = XCreateGC(dpy,self,GCFunction|GCForeground,&gcv); + + gcv.foreground = gcv.background = bg; + gc = XCreateGC (dpy, window, GCForeground|GCBackground, &gcv); + /* Clear self to the background color (not to 0, which CLR does.) */ + XFillRectangle (dpy, self, gc, 0, 0, size, size); + XSetForeground (dpy, gc, fg); + + XCopyArea (dpy, bitmap, self, CPY, 0, 0, width, height, + (size - width)>>1, (size - height)>>1); +} + +static void +display (pixmap) + Pixmap pixmap; +{ + XWindowAttributes xgwa; + static int last_w = 0, last_h = 0; + XGetWindowAttributes (dpy, window, &xgwa); + if (xgwa.width != last_w || xgwa.height != last_h) + { + XClearWindow (dpy, window); + last_w = xgwa.width; + last_h = xgwa.height; + } +#ifdef HAVE_XPM + if (depth != 1) + XCopyArea (dpy, pixmap, window, gc, 0, 0, size, size, + (xgwa.width-size)>>1, (xgwa.height-size)>>1); + else +#endif + XCopyPlane (dpy, pixmap, window, gc, 0, 0, size, size, + (xgwa.width-size)>>1, (xgwa.height-size)>>1, 1); +/* + XDrawRectangle (dpy, window, gc, + ((xgwa.width-size)>>1)-1, ((xgwa.height-size)>>1)-1, + size+2, size+2); +*/ + XSync (dpy, True); +} + + +char *progclass = "BlitSpin"; + +char *defaults [] = { + "BlitSpin.background: black", /* to placate SGI */ + "BlitSpin.foreground: white", + "*delay: 500000", + "*delay2: 500000", + "*bitmap: (default)", + 0 +}; + +XrmOptionDescRec options [] = { + { "-delay", ".delay", XrmoptionSepArg, 0 }, + { "-delay2", ".delay2", XrmoptionSepArg, 0 }, + { "-bitmap", ".bitmap", XrmoptionSepArg, 0 } +}; +int options_size = (sizeof (options) / sizeof (options[0])); + +void +screenhack (d, w) + Display *d; + Window w; +{ + dpy = d; + window = w; + init (); + while (1) + { + rotate (); + if (delay2) usleep (delay2); + } +} diff --git a/hacks/blitspin.c_ori b/hacks/blitspin.c_ori new file mode 100755 index 00000000..debdbaea --- /dev/null +++ b/hacks/blitspin.c_ori @@ -0,0 +1,273 @@ +/* xscreensaver, Copyright (c) 1992 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. + */ + +/* Rotate a bitmap using using bitblts. + The bitmap must be square, and must be a power of 2 in size. + This was translated from SmallTalk code which appeared in the + August 1981 issue of Byte magazine. + + The input bitmap may be non-square, it is padded and centered + with the background color. Another way would be to subdivide + the bitmap into square components and rotate them independently + (and preferably in parallel), but I don't think that would be as + interesting looking. + + It's too bad almost nothing uses blitter hardware these days, + or this might actually win. + */ + +#include "screenhack.h" +#include + +#ifdef HAVE_XPM +# include +# ifndef PIXEL_ALREADY_TYPEDEFED +# define PIXEL_ALREADY_TYPEDEFED /* Sigh, Xmu/Drawing.h needs this... */ +# endif +#endif + +#include + +#include "default.xbm" + +static Display *dpy; +static Window window; +static unsigned int size; +static Pixmap self, temp, mask; +static GC SET, CLR, CPY, IOR, AND, XOR; +static GC gc; +static int delay, delay2; +static Pixmap bitmap; +static int depth; +static unsigned int fg, bg; + +static void rotate(), init (), display (); + +#define copy_all_to(from, xoff, yoff, to, gc) \ + XCopyArea (dpy, (from), (to), (gc), 0, 0, \ + size-(xoff), size-(yoff), (xoff), (yoff)) + +#define copy_all_from(to, xoff, yoff, from, gc) \ + XCopyArea (dpy, (from), (to), (gc), (xoff), (yoff), \ + size-(xoff), size-(yoff), 0, 0) + +static void +rotate () +{ + int qwad; /* fuckin' C, man... who needs namespaces? */ + XFillRectangle (dpy, mask, CLR, 0, 0, size, size); + XFillRectangle (dpy, mask, SET, 0, 0, size>>1, size>>1); + for (qwad = size>>1; qwad > 0; qwad>>=1) + { + if (delay) usleep (delay); + copy_all_to (mask, 0, 0, temp, CPY); /* 1 */ + copy_all_to (mask, 0, qwad, temp, IOR); /* 2 */ + copy_all_to (self, 0, 0, temp, AND); /* 3 */ + copy_all_to (temp, 0, 0, self, XOR); /* 4 */ + copy_all_from (temp, qwad, 0, self, XOR); /* 5 */ + copy_all_from (self, qwad, 0, self, IOR); /* 6 */ + copy_all_to (temp, qwad, 0, self, XOR); /* 7 */ + copy_all_to (self, 0, 0, temp, CPY); /* 8 */ + copy_all_from (temp, qwad, qwad, self, XOR); /* 9 */ + copy_all_to (mask, 0, 0, temp, AND); /* A */ + copy_all_to (temp, 0, 0, self, XOR); /* B */ + copy_all_to (temp, qwad, qwad, self, XOR); /* C */ + copy_all_from (mask, qwad>>1, qwad>>1, mask, AND); /* D */ + copy_all_to (mask, qwad, 0, mask, IOR); /* E */ + copy_all_to (mask, 0, qwad, mask, IOR); /* F */ + display (self); + } +} + +static void +read_bitmap (bitmap_name, widthP, heightP) + char *bitmap_name; + int *widthP, *heightP; +{ +#ifdef HAVE_XPM + XpmAttributes xpmattrs; + int result; + xpmattrs.valuemask = 0; + bitmap = 0; + result = XpmReadFileToPixmap (dpy, window, bitmap_name, &bitmap, 0, + &xpmattrs); + switch (result) + { + case XpmColorError: + fprintf (stderr, "%s: warning: xpm color substitution performed\n", + progname); + /* fall through */ + case XpmSuccess: + *widthP = xpmattrs.width; + *heightP = xpmattrs.height; + break; + case XpmFileInvalid: + case XpmOpenFailed: + bitmap = 0; + break; + case XpmColorFailed: + fprintf (stderr, "%s: xpm: color allocation failed\n", progname); + exit (-1); + case XpmNoMemory: + fprintf (stderr, "%s: xpm: out of memory\n", progname); + exit (-1); + default: + fprintf (stderr, "%s: xpm: unknown error code %d\n", progname, result); + exit (-1); + } + if (! bitmap) +#endif + { + int xh, yh; + Pixmap b2; + bitmap = XmuLocateBitmapFile (DefaultScreenOfDisplay (dpy), bitmap_name, + 0, 0, widthP, heightP, &xh, &yh); + if (! bitmap) + { + fprintf (stderr, "%s: couldn't find bitmap %s\n", progname, + bitmap_name); + exit (1); + } + b2 = XmuCreatePixmapFromBitmap (dpy, window, bitmap, *widthP, *heightP, + depth, fg, bg); + XFreePixmap (dpy, bitmap); + bitmap = b2; + } +} + +static void +init () +{ + XWindowAttributes xgwa; + Colormap cmap; + XGCValues gcv; + int width, height; + unsigned int real_size; + char *bitmap_name; + int i; + + XGetWindowAttributes (dpy, window, &xgwa); + cmap = xgwa.colormap; + depth = xgwa.depth; + + fg = get_pixel_resource ("foreground", "Foreground", dpy, cmap); + bg = get_pixel_resource ("background", "Background", dpy, cmap); + delay = get_integer_resource ("delay", "Integer"); + delay2 = get_integer_resource ("delay2", "Integer"); + if (delay < 0) delay = 0; + if (delay2 < 0) delay2 = 0; + bitmap_name = get_string_resource ("bitmap", "Bitmap"); + if (! bitmap_name || !*bitmap_name) + bitmap_name = "(default)"; + + if (!strcmp (bitmap_name, "(default)")) + { + width = logo_width; + height = logo_height; + bitmap = XCreatePixmapFromBitmapData (dpy, window, (char *) logo_bits, + width, height, fg, bg, depth); + } + else + { + read_bitmap (bitmap_name, &width, &height); + } + + real_size = (width > height) ? width : height; + + size = real_size; + /* semi-sleazy way of doing (setq size (expt 2 (ceiling (log size 2)))). */ + for (i = 31; i > 0; i--) + if (size & (1<>i)<<(i+1); + self = XCreatePixmap (dpy, window, size, size, depth); + temp = XCreatePixmap (dpy, window, size, size, depth); + mask = XCreatePixmap (dpy, window, size, size, depth); + gcv.foreground = (depth == 1 ? 1 : (~0)); + gcv.function=GXset; SET = XCreateGC(dpy,self,GCFunction|GCForeground,&gcv); + gcv.function=GXclear;CLR = XCreateGC(dpy,self,GCFunction|GCForeground,&gcv); + gcv.function=GXcopy; CPY = XCreateGC(dpy,self,GCFunction|GCForeground,&gcv); + gcv.function=GXor; IOR = XCreateGC(dpy,self,GCFunction|GCForeground,&gcv); + gcv.function=GXand; AND = XCreateGC(dpy,self,GCFunction|GCForeground,&gcv); + gcv.function=GXxor; XOR = XCreateGC(dpy,self,GCFunction|GCForeground,&gcv); + + gcv.foreground = gcv.background = bg; + gc = XCreateGC (dpy, window, GCForeground|GCBackground, &gcv); + /* Clear self to the background color (not to 0, which CLR does.) */ + XFillRectangle (dpy, self, gc, 0, 0, size, size); + XSetForeground (dpy, gc, fg); + + XCopyArea (dpy, bitmap, self, CPY, 0, 0, width, height, + (size - width)>>1, (size - height)>>1); +} + +static void +display (pixmap) + Pixmap pixmap; +{ + XWindowAttributes xgwa; + static int last_w = 0, last_h = 0; + XGetWindowAttributes (dpy, window, &xgwa); + if (xgwa.width != last_w || xgwa.height != last_h) + { + XClearWindow (dpy, window); + last_w = xgwa.width; + last_h = xgwa.height; + } +#ifdef HAVE_XPM + if (depth != 1) + XCopyArea (dpy, pixmap, window, gc, 0, 0, size, size, + (xgwa.width-size)>>1, (xgwa.height-size)>>1); + else +#endif + XCopyPlane (dpy, pixmap, window, gc, 0, 0, size, size, + (xgwa.width-size)>>1, (xgwa.height-size)>>1, 1); +/* + XDrawRectangle (dpy, window, gc, + ((xgwa.width-size)>>1)-1, ((xgwa.height-size)>>1)-1, + size+2, size+2); +*/ + XSync (dpy, True); +} + + +char *progclass = "BlitSpin"; + +char *defaults [] = { + "BlitSpin.background: black", /* to placate SGI */ + "BlitSpin.foreground: white", + "*delay: 500000", + "*delay2: 500000", + "*bitmap: (default)", + 0 +}; + +XrmOptionDescRec options [] = { + { "-delay", ".delay", XrmoptionSepArg, 0 }, + { "-delay2", ".delay2", XrmoptionSepArg, 0 }, + { "-bitmap", ".bitmap", XrmoptionSepArg, 0 } +}; +int options_size = (sizeof (options) / sizeof (options[0])); + +void +screenhack (d, w) + Display *d; + Window w; +{ + dpy = d; + window = w; + init (); + while (1) + { + rotate (); + if (delay2) usleep (delay2); + } +} diff --git a/hacks/blitspin.exe_axp b/hacks/blitspin.exe_axp new file mode 100755 index 0000000000000000000000000000000000000000..47982ac036028baab455f1a1ab0b05a03c1a536c GIT binary patch literal 55808 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, 17-aug-92. + +Based on SmallTalk code which appeared in the August 1981 issue of Byte +magazine. diff --git a/hacks/blitspin.man b/hacks/blitspin.man new file mode 100755 index 00000000..4198883d --- /dev/null +++ b/hacks/blitspin.man @@ -0,0 +1,77 @@ +.TH XScreenSaver 1 "17-aug-92" "X Version 11" +.SH NAME +blitspin - rotate a bitmap in an interesting way +.SH SYNOPSIS +.B blitspin +[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP] [\-background \fIcolor\fP] [\-window] [\-root] [\-mono] [\-install] [\-visual \fIvisual\fP] [\-bitmap \fIfilename\fP] [\-delay \fIusecs\fP] [\-delay2 \fIusecs\fP] +.SH DESCRIPTION +The \fIblitspin\fP program repeatedly rotates a bitmap by 90 degrees by +using logical operations: the bitmap is divided into quadrants, and the +quadrants are shifted clockwise. Then the same thing is done again with +progressively smaller quadrants, except that all sub-quadrants of a +given size are rotated in parallel. So this takes \fBO(16*log2(N))\fP +blits of size NxN, with the limitation that the image must be square, +and the size must be a power of 2. +.SH OPTIONS +.I blitspin +accepts the following options: +.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 \-mono +If on a color display, pretend we're on a monochrome display. +.TP 8 +.B \-install +Install a private colormap for the window. +.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 \-bitmap \fIfilename\fP +The file name of a bitmap to rotate. It need not be square: it +will be padded with the background color. If unspecified or the +string \fI(default)\fP, a builtin bitmap is used. + +If support for the \fIXPM\fP library was enabled at compile-time, +the specified file may be in \fIXPM\fP format as well as \fIXBM\fP, and +thus may be a color image. + +The \fB*bitmapFilePath\fP resource will be searched if the bitmap +name is not a fully-qualified pathname. +.PP +.TP 8 +.B \-delay microseconds +How long to delay between steps of the rotation process, in microseconds. +Default is 500000, one-half second. +.PP +.TP 8 +.B \-delay2 microseconds +How long to delay between each 90-degree rotation, in microseconds. +Default is 500000, one-half second. +.B DISPLAY +to get the default host and display number. +.SH ENVIRONMENT +.B XENVIRONMENT +to get the name of a resource file that overrides the global resources +stored in the RESOURCE_MANAGER property. +.SH SEE ALSO +.BR X (1), +.BR xscreensaver (1) +.SH COPYRIGHT +Copyright \(co 1992, 1993 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 , 17-aug-92. + +Based on SmallTalk code which appeared in the August 1981 issue of Byte +magazine. diff --git a/hacks/compile.com b/hacks/compile.com new file mode 100755 index 00000000..387adab6 --- /dev/null +++ b/hacks/compile.com @@ -0,0 +1,22 @@ +$ def sys sys$library: +$ CC/DEFINE=VMS ATTRACTION.C +$ CC/DEFINE=VMS BLITSPIN.C +$ CC/DEFINE=VMS DECAYSCREEN.C +$ CC/DEFINE=VMS FLAME.C +$ CC/DEFINE=VMS GREYNETIC.C +$ CC/DEFINE=VMS HALO.C +$ CC/DEFINE=VMS HELIX.C +$ CC/DEFINE=VMS HOPALONG.C +$ CC/DEFINE=VMS HYPERCUBE.C +$ CC/DEFINE=VMS IMSMAP.C +$ CC/DEFINE=VMS LMORPH.C +$ CC/DEFINE=VMS MAZE.C +$ CC/DEFINE=VMS NOSEGUY.C +$ CC/DEFINE=VMS PEDAL.C +$ CC/DEFINE=VMS PYRO.C +$ CC/DEFINE=VMS QIX.C +$ CC/DEFINE=VMS ROCKS.C +$ CC/DEFINE=VMS RORSCHACH.C +$ CC/DEFINE=VMS SCREENHACK.C +$ CC/DEFINE=VMS SLIDESCREEN.C +$ CC/DEFINE=VMS XROGER-HACK.C diff --git a/hacks/compile_axp.com b/hacks/compile_axp.com new file mode 100755 index 00000000..2e986d1f --- /dev/null +++ b/hacks/compile_axp.com @@ -0,0 +1,21 @@ +$ CC/DECC/PREFIX=ALL/DEFINE=VMS ATTRACTION.C +$ CC/DECC/PREFIX=ALL/DEFINE=VMS BLITSPIN.C +$ CC/DECC/PREFIX=ALL/DEFINE=VMS DECAYSCREEN.C +$ CC/DECC/PREFIX=ALL/DEFINE=VMS FLAME.C +$ CC/DECC/PREFIX=ALL/DEFINE=VMS GREYNETIC.C +$ CC/DECC/PREFIX=ALL/DEFINE=VMS HALO.C +$ CC/DECC/PREFIX=ALL/DEFINE=VMS HELIX.C +$ CC/DECC/PREFIX=ALL/DEFINE=VMS HOPALONG.C +$ CC/DECC/PREFIX=ALL/DEFINE=VMS HYPERCUBE.C +$ CC/DECC/PREFIX=ALL/DEFINE=VMS IMSMAP.C +$ CC/DECC/PREFIX=ALL/DEFINE=VMS LMORPH.C +$ CC/DECC/PREFIX=ALL/DEFINE=VMS MAZE.C +$ CC/DECC/PREFIX=ALL/DEFINE=VMS NOSEGUY.C +$ CC/DECC/PREFIX=ALL/DEFINE=VMS PEDAL.C +$ CC/DECC/PREFIX=ALL/DEFINE=VMS PYRO.C +$ CC/DECC/PREFIX=ALL/DEFINE=VMS QIX.C +$ CC/DECC/PREFIX=ALL/DEFINE=VMS ROCKS.C +$ CC/DECC/PREFIX=ALL/DEFINE=VMS RORSCHACH.C +$ CC/DECC/PREFIX=ALL/DEFINE=VMS SCREENHACK.C +$ CC/DECC/PREFIX=ALL/DEFINE=VMS SLIDESCREEN.C +$ CC/DECC/PREFIX=ALL/DEFINE=VMS XROGER-HACK.C diff --git a/hacks/compile_decc.com b/hacks/compile_decc.com new file mode 100755 index 00000000..2e986d1f --- /dev/null +++ b/hacks/compile_decc.com @@ -0,0 +1,21 @@ +$ CC/DECC/PREFIX=ALL/DEFINE=VMS ATTRACTION.C +$ CC/DECC/PREFIX=ALL/DEFINE=VMS BLITSPIN.C +$ CC/DECC/PREFIX=ALL/DEFINE=VMS DECAYSCREEN.C +$ CC/DECC/PREFIX=ALL/DEFINE=VMS FLAME.C +$ CC/DECC/PREFIX=ALL/DEFINE=VMS GREYNETIC.C +$ CC/DECC/PREFIX=ALL/DEFINE=VMS HALO.C +$ CC/DECC/PREFIX=ALL/DEFINE=VMS HELIX.C +$ CC/DECC/PREFIX=ALL/DEFINE=VMS HOPALONG.C +$ CC/DECC/PREFIX=ALL/DEFINE=VMS HYPERCUBE.C +$ CC/DECC/PREFIX=ALL/DEFINE=VMS IMSMAP.C +$ CC/DECC/PREFIX=ALL/DEFINE=VMS LMORPH.C +$ CC/DECC/PREFIX=ALL/DEFINE=VMS MAZE.C +$ CC/DECC/PREFIX=ALL/DEFINE=VMS NOSEGUY.C +$ CC/DECC/PREFIX=ALL/DEFINE=VMS PEDAL.C +$ CC/DECC/PREFIX=ALL/DEFINE=VMS PYRO.C +$ CC/DECC/PREFIX=ALL/DEFINE=VMS QIX.C +$ CC/DECC/PREFIX=ALL/DEFINE=VMS ROCKS.C +$ CC/DECC/PREFIX=ALL/DEFINE=VMS RORSCHACH.C +$ CC/DECC/PREFIX=ALL/DEFINE=VMS SCREENHACK.C +$ CC/DECC/PREFIX=ALL/DEFINE=VMS SLIDESCREEN.C +$ CC/DECC/PREFIX=ALL/DEFINE=VMS XROGER-HACK.C diff --git a/hacks/decayscreen.c b/hacks/decayscreen.c new file mode 100755 index 00000000..ce18a7ee --- /dev/null +++ b/hacks/decayscreen.c @@ -0,0 +1,146 @@ +/* xscreensaver, Copyright (c) 1992, 1993, 1994 + * 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. + */ + +/* decayscreen + * + * Based on slidescreen program from the xscreensaver application and the + * decay program for Sun framebuffers. This is the comment from the decay.c + * file: + + * decay.c + * find the screen bitmap for the console and make it "decay" by + * randomly shifting random rectangles by one pixelwidth at a time. + * + * by David Wald, 1988 + * rewritten by Natuerlich! + * based on a similar "utility" on the Apollo ring at Yale. + + * X version by + * + * Vivek Khera + * 5-AUG-1993 + */ + +#include "screenhack.h" + +static int sizex, sizey; +static int delay; +static GC gc; + +static void +init_decay (dpy, window) + Display *dpy; + Window window; +{ + XGCValues gcv; + XWindowAttributes xgwa; + int root_p; + Pixmap pixmap; + + delay = get_integer_resource ("delay", "Integer"); + root_p = get_boolean_resource ("root", "Boolean"); + + if (delay < 0) delay = 0; + + gcv.function = GXcopy; + gcv.subwindow_mode = IncludeInferiors; + gc = XCreateGC (dpy, window, GCForeground |GCFunction | GCSubwindowMode, + &gcv); + + XGetWindowAttributes (dpy, window, &xgwa); + sizex = xgwa.width; + sizey = xgwa.height; + + copy_default_colormap_contents (dpy, xgwa.colormap, xgwa.visual); + pixmap = grab_screen_image (dpy, window, root_p); +} + + +/* + * perform one iteration of decay + */ +static void +decay1 (dpy, window) + Display *dpy; + Window window; +{ + int left, top, width, height; + +#define nrnd(x) (random() % (x)) + + switch (random() % 8) { + case 0: /* move a block left */ + case 1: + left = nrnd(sizex - 1) + 1; + top = nrnd(sizey); + width = nrnd(sizex - left); + height = nrnd(sizey - top); + XCopyArea (dpy, window, window, gc, left, top, width, height, + left - 1, top); + break; + case 2: /* move a block right */ + case 3: + left = nrnd(sizex - 1); + top = nrnd(sizey); + width = nrnd(sizex - 1 - left); + height = nrnd(sizey - top); + XCopyArea (dpy, window, window, gc, left, top, width, height, + left + 1, top); + break; + case 4: /* move a block up */ + left = nrnd(sizex); + top = nrnd(sizey - 1) + 1; + width = nrnd(sizex - left); + height = nrnd(sizey - top); + XCopyArea (dpy, window, window, gc, left, top, width, height, + left, top - 1); + break; + default: /* move block down (biased to this) */ + left = nrnd(sizex); + top = nrnd(sizey - 1); + width = nrnd(sizex - left); + height = nrnd(sizey - 1 - top); + XCopyArea (dpy, window, window, gc, left, top, width, height, + left, top + 1); + break; + } + XSync (dpy, True); +#undef nrnd +} + + +char *progclass = "DecayScreen"; + +char *defaults [] = { + "DecayScreen.mappedWhenManaged:false", + "DecayScreen.dontClearWindow: true", + "*delay: 10", + 0 +}; + +XrmOptionDescRec options [] = { + { "-delay", ".delay", XrmoptionSepArg, 0 }, +}; + +int options_size = (sizeof (options) / sizeof (options[0])); + +void +screenhack (dpy, window) + Display *dpy; + Window window; +{ + init_decay (dpy, window); + while (1) { + decay1 (dpy, window); + if (delay) usleep (delay); + } +} diff --git a/hacks/decayscreen.exe_axp b/hacks/decayscreen.exe_axp new file mode 100755 index 0000000000000000000000000000000000000000..e71876fb0518652a49bf4413e215fceadf1250ad GIT binary patch literal 31744 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 Y8Ay(!%rFzfZOqa~0JV58_CM|TH*W$VrT_o{ literal 0 HcmV?d00001 diff --git a/hacks/decayscreen.exe_vax b/hacks/decayscreen.exe_vax new file mode 100755 index 0000000000000000000000000000000000000000..4f3b8c3cca3e3a38d4223b495f5cbde5804203f5 GIT binary patch literal 16896 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 G{{9Q7hgQ)5 literal 0 HcmV?d00001 diff --git a/hacks/decayscreen.hlp b/hacks/decayscreen.hlp new file mode 100755 index 00000000..978e12a2 --- /dev/null +++ b/hacks/decayscreen.hlp @@ -0,0 +1,53 @@ +1 DECAYSCREEN +Make a screen meltdown. + +SYNOPSIS + + $ decayscreen [-display host:display.screen] [-window] [-root] [-mono] + [-install] [-visual visual] [-delay usecs] + +2 DESCRIPTION +The decayscreen program creates a melting effect by randomly +shifting rectangles around the screen. + +2 OPTIONS +Decayscreen accepts the following options: + + -window +Draw on a newly-created window. This is the default. + + -root +Draw on the root window. + + -mono +If on a color display, pretend we're on a monochrome display. + + -install +Install a private colormap for the window. + + -visual visual +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. + + -delay microseconds +Slow it down. + +2 ENVIRONMENT + DISPLAY +to get the default host and display number. + + XENVIRONMENT +to get the name of a resource file that overrides the global resources +stored in the RESOURCE_MANAGER property. + +2 COPYRIGHT +Copyright 1992 by Vivek Khera. 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. + +2 AUTHOR +Vivek Khera , 05-Aug-93; based on code by David Wald, 1988. diff --git a/hacks/decayscreen.man b/hacks/decayscreen.man new file mode 100755 index 00000000..007301bc --- /dev/null +++ b/hacks/decayscreen.man @@ -0,0 +1,53 @@ +.TH XScreenSaver 1 "05-aug-93" "X Version 11" +.SH NAME +decayscreen - make a screen meltdown. +.SH SYNOPSIS +.B decayscreen +[\-display \fIhost:display.screen\fP] [\-window] [\-root] [\-mono] [\-install] [\-visual \fIvisual\fP] [\-delay \fIusecs\fP] +.SH DESCRIPTION +The \fIdecayscreen\fP program creates a melting effect by randomly +shifting rectangles around the screen. +.SH OPTIONS +.I decayscreen +accepts the following options: +.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 \-mono +If on a color display, pretend we're on a monochrome display. +.TP 8 +.B \-install +Install a private colormap for the window. +.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 \-delay \fImicroseconds\fP +Slow it down. +.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. +.SH "SEE ALSO" +X(1), +xscreensaver(1) +.SH COPYRIGHT +Copyright 1992 by Vivek Khera. 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 +Vivek Khera , 05-Aug-93; based on code by David Wald, 1988. diff --git a/hacks/default.xbm b/hacks/default.xbm new file mode 100755 index 00000000..dcd2ff50 --- /dev/null +++ b/hacks/default.xbm @@ -0,0 +1,1686 @@ +#define logo_width 464 +#define logo_height 435 +static unsigned char logo_bits[] = { +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0x60, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0x60,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0xf0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0xf0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0xf0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0xf8,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0xf8,0x01,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0xf8,0x01,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0xfc,0x01, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0xfc,0x01,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0xfc,0x03,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0xfc,0x07,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0xfe,0x07,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0xfe,0x07,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0xfe,0x07,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xff, +0x0f,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0xff,0x0f,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0x80,0xff,0x0f,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0x80,0xff,0x1f,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0x80,0xff,0x3f,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0x80,0xff,0x3f,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0x80,0xff,0x3f,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xc0, +0xff,0x3f,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0xe0,0xff,0x7f, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0xe0,0xff,0x7f,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0xe0,0xff,0x7f,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0xe0,0xff,0xff,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0xf0,0xff,0xff,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0xf0,0xff,0xff,0x01,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0xf0,0xff,0xff,0x01,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0xf0,0xff, +0xff,0x01,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0xf8,0xff,0xff,0x03, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0xfc,0xff,0xff,0x03,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0xfc,0xff,0xff,0x03,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0xfc,0xff,0xff,0x07,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0xfc,0xff,0xff,0x07,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0xfe,0xff,0xff,0x07,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xfe, +0xff,0xff,0x0f,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0xfe,0xff,0xff, +0x0f,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0xff,0xff,0xff,0x0f,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0x80,0xff,0xff,0xff,0x1f,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0x80,0xff,0xff,0xff,0x1f,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0x80,0xff,0xff,0xff,0x1f,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0x80,0xff,0xff,0xff,0x1f,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xc0, +0xff,0xff,0xff,0x3f,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0xc0,0xff,0xff, +0xff,0x7f,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0xc0,0xff,0xff,0xff,0x7f, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0xc0,0xff,0xff,0xff,0x7f,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0xe0,0xff,0xff,0xff,0xff,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0xe0,0xff,0xff,0xff,0xff,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0xf0,0xff,0xff,0xff,0xff,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0xf0,0xff,0xff,0xff,0xff,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0xf0,0xff, +0xff,0xff,0xff,0x01,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0xf0,0xff,0xff,0xff, +0xff,0x01,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0xf8,0xff,0xff,0xff,0xff,0x03, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0xf8,0xff,0xff,0xff,0xff,0x03,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0xf8,0xff,0xff,0xff,0xff,0x03,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0xf8,0xff,0xff,0xff,0xff,0x07,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0xfc,0xff,0xdf,0xff,0xff,0x07,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xfe, +0xff,0xdf,0xff,0xff,0x07,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0xfe,0xff,0x8f, +0xff,0xff,0x0f,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0xfe,0xff,0x0f,0xff,0xff, +0x0f,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0xfe,0xff,0x0f,0xff,0xff,0x0f,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0xff,0xff,0x07,0xff,0xff,0x1f,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0xff,0xff,0x07,0xff,0xff,0x1f,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0x80,0xff,0xff,0x07,0xfe,0xff,0x1f,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xc0, +0xff,0xff,0x03,0xfc,0xff,0x3f,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0xc0,0xff,0xff, +0x03,0xfc,0xff,0x3f,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0xc0,0xff,0xff,0x03,0xfc, +0xff,0x3f,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0xe0,0xff,0xff,0x01,0xf8,0xff,0x7f, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0xe0,0xff,0xff,0x01,0xf8,0xff,0x7f,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0xe0,0xff,0xff,0,0xf0,0x03,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0xe0,0xff,0xff,0,0xf0,0x03,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0xe0,0xff,0x1f,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0xf0,0xff, +0x01,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0xf0,0x07,0,0, +0x80,0xff,0x03,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0xf8,0xff,0xff, +0xff,0xff,0x03,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0xf8,0xff,0xff,0xff,0xff, +0x03,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0x80,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x03, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0xc0,0xff,0xff,0xff,0x03,0,0,0xe0,0xff,0x7f,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0xfc,0xff,0xff,0,0,0,0,0,0xe0,0xff,0x07,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0xe0,0xff, +0x7f,0xfe,0,0,0,0,0,0,0xfc,0x7f,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0xfe,0xff,0x01,0xfe, +0x01,0,0,0,0,0,0xc0,0xff,0x03,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0xfe,0xff,0x01,0xfe,0x01,0, +0,0,0,0,0xc0,0xff,0x03,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0xf0,0xff,0x07,0,0xce,0x07,0,0,0, +0,0,0,0xfe,0x1f,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0xfe,0x7f,0,0,0x87,0x1f,0,0,0,0,0, +0,0xc0,0xff,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0xe0,0xff,0x07,0,0x80,0x03,0x3e,0,0,0,0,0,0,0, +0xfe,0x07,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xfc, +0x3f,0,0,0x80,0x03,0xf8,0,0,0,0,0,0,0,0xe0,0x3f, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0xfc,0x3f,0, +0,0x80,0x03,0xf8,0,0,0,0,0,0,0,0xe0,0x3f,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0x80,0xff,0x07,0,0,0xc0, +0x01,0xe0,0x01,0,0,0,0,0,0,0,0xff,0x01,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0xf0,0xff,0x7f,0,0,0xc0,0xfb,0xff, +0x0f,0,0,0,0,0,0,0,0xf0,0x0f,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0xfe,0xff,0xff,0x07,0,0xc0,0xff,0xff,0x3f,0, +0,0,0,0,0,0,0x80,0xff,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0x80,0xff,0xc0,0xff,0x7f,0,0xe0,0xff,0xff,0x7f,0,0,0, +0,0,0,0,0,0xfe,0x01,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0x80,0xff,0xc0,0xff,0x7f,0,0xe0,0xff,0xff,0x7f,0,0,0,0,0, +0,0,0,0xfe,0x01,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0xc0,0x1f, +0,0xf8,0xff,0x0f,0xf0,0x0f,0xc0,0xff,0x01,0,0,0,0,0,0, +0,0xf0,0x0f,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0xe0,0x0f,0,0, +0xff,0x7f,0xf0,0x01,0,0xf8,0x03,0,0,0,0,0,0,0,0xc0, +0x3f,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0xf0,0x01,0,0,0x80,0xff, +0x7b,0,0,0xe0,0x07,0,0,0,0,0,0,0,0,0xfe,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0xf8,0,0,0,0,0xfc,0x3f,0, +0,0x80,0x1f,0,0,0,0,0,0,0,0,0xf0,0x03,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0xf8,0,0,0,0,0xfc,0x3f,0,0,0x80, +0x1f,0,0,0,0,0,0,0,0,0xf0,0x03,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0x3c,0,0,0,0,0xe0,0x7f,0,0,0,0x7e,0, +0,0,0,0,0,0,0,0xe0,0x0f,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0x3e,0,0,0,0,0,0xff,0x03,0,0,0x70,0,0,0, +0,0,0,0,0,0x80,0x3f,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0x80,0x0f, +0,0,0,0,0,0xf0,0x1f,0,0,0,0,0,0,0,0, +0,0,0,0,0xfc,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0xc0,0x0f,0,0, +0,0,0,0,0xfe,0x01,0,0,0,0,0,0,0,0,0, +0,0,0xf0,0x01,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0xc0,0x07,0,0,0,0, +0,0,0xf8,0x07,0,0,0,0,0,0,0,0,0,0,0, +0xe0,0x07,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0xc0,0x07,0,0,0,0,0,0, +0xf8,0x07,0,0,0,0,0,0,0,0,0,0,0,0xe0,0x07, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0xe0,0x03,0,0,0,0,0,0,0xe0,0x3f, +0,0,0,0,0,0,0,0,0,0,0,0x80,0x0f,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0xf0,0x01,0,0,0,0,0,0,0x80,0xff,0,0, +0,0,0,0,0,0,0,0,0,0,0x3f,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0xf8,0x01,0,0,0,0,0,0,0,0xfc,0x07,0,0,0, +0,0,0,0,0,0,0,0,0x7c,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xf8, +0,0,0,0xfe,0x03,0,0,0,0xf0,0x0f,0,0,0,0,0, +0,0,0,0,0,0,0xf8,0x01,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0xf8,0,0, +0,0xfe,0x03,0,0,0,0xf0,0x0f,0,0,0,0,0,0,0, +0,0,0,0,0xf8,0x01,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0xfc,0,0,0xf0,0xff, +0x1f,0,0,0,0x80,0x7f,0,0,0,0,0,0,0,0,0, +0,0,0xf0,0x03,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0x3f,0,0,0xfc,0xff,0x7f,0, +0,0,0,0xfe,0x01,0,0,0,0,0,0,0,0,0,0, +0xc0,0x07,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0x80,0x1f,0,0,0xff,0x47,0x7f,0,0,0, +0,0xf8,0x0f,0,0,0,0,0,0,0,0,0,0,0x80,0x0f, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0xf0,0x07,0x80,0xff,0xff,0x3f,0x7c,0,0,0,0,0xc0, +0xff,0,0,0,0,0,0,0,0,0,0,0,0x3e,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0xf0,0x07,0x80,0xff,0xff,0x3f,0x7c,0,0,0,0,0xc0,0xff,0, +0,0,0,0,0,0,0,0,0,0,0x3e,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xfc, +0x03,0xc0,0xff,0xfe,0xff,0x7d,0,0,0,0,0x80,0xff,0x01,0,0, +0,0,0,0,0,0,0,0,0x7c,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0xc0,0xff,0,0x40, +0,0,0xfe,0x7f,0,0,0,0,0x80,0xff,0x07,0,0,0,0, +0,0,0,0,0,0,0xf0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0xf0,0x3f,0,0,0x80,0x03, +0xf8,0x3f,0,0,0,0,0x80,0xe7,0x1f,0,0,0,0,0,0, +0,0,0,0,0xf0,0x01,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0xfe,0x0f,0,0,0xf0,0xff,0xff,0x1f, +0,0,0,0,0x80,0xc7,0x7f,0,0,0,0,0,0,0,0, +0,0,0xe0,0x03,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0xfe,0x0f,0,0,0xf0,0xff,0xff,0x1f,0,0, +0,0,0x80,0xc7,0x7f,0,0,0,0,0,0,0,0,0,0, +0xe0,0x03,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0xc0,0xff,0x03,0,0,0xf0,0xff,0xff,0x0f,0,0,0,0, +0xc0,0x0f,0xff,0x01,0,0,0,0,0,0,0,0,0,0xc0,0x07, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0xf0,0x7f,0,0,0,0xc0,0xff,0xff,0x01,0,0,0,0,0xc0,0x0f, +0xfc,0x07,0,0,0,0,0,0,0,0,0,0x80,0x0f,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0xff,0x0f, +0,0,0,0,0,0,0,0,0,0,0,0xc0,0x0f,0xf0,0x0f, +0,0,0,0,0,0,0,0,0,0,0x1f,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0x80,0xff,0x01,0,0, +0,0,0,0,0,0,0,0,0,0xe0,0x1f,0x80,0x3f,0,0, +0,0,0,0,0,0,0,0,0x1c,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0xf8,0x0f,0,0,0,0,0, +0,0,0,0,0,0,0,0xf0,0x1c,0,0xfe,0x03,0,0,0, +0,0,0,0,0,0,0x78,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0xf8,0x0f,0,0,0,0,0,0,0, +0,0,0,0,0,0xf0,0x1c,0,0xfe,0x03,0,0,0,0,0, +0,0,0,0,0x78,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0xfe,0x01,0,0,0,0,0,0,0,0,0, +0,0,0,0x70,0x1c,0,0xf0,0x07,0,0,0,0,0,0,0, +0,0,0xf0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0x3f,0,0,0,0,0,0,0,0,0,0,0,0, +0,0x70,0x38,0,0xc0,0x1f,0,0,0,0,0,0,0,0,0, +0xe0,0x01,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0x80, +0x0f,0,0,0,0,0,0,0,0,0,0,0,0,0,0x70, +0x78,0,0,0x7f,0,0,0,0,0,0,0,0,0,0xc0,0x03, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0xc0,0x03,0, +0,0,0,0,0,0,0,0,0,0,0,0,0x70,0x70,0, +0,0xfc,0,0,0,0,0,0,0,0,0,0xc0,0x07,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0xc0,0x03,0,0,0, +0,0,0,0,0,0,0,0,0,0,0x70,0x70,0,0,0xfc, +0,0,0,0,0,0,0,0,0,0xc0,0x07,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0xc0,0x01,0,0,0,0,0, +0,0,0,0,0,0,0,0,0x38,0x70,0,0,0xfe,0x03,0xfe, +0x7f,0,0,0,0,0,0,0,0x0f,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0xe0,0x01,0,0,0,0,0,0,0, +0,0,0,0,0,0,0x38,0xf0,0,0,0xfe,0x0f,0xff,0xff,0x01, +0,0,0,0,0,0,0x0f,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0xe0,0x01,0,0,0,0,0,0,0,0,0, +0,0,0,0,0x18,0xe0,0,0x80,0x9f,0xff,0x3f,0xfe,0x03,0,0, +0,0,0,0,0x0f,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0xe0,0x01,0,0,0,0,0,0,0,0,0,0,0, +0,0,0x1c,0xe0,0,0x80,0x0f,0xff,0x07,0xc0,0x0f,0,0,0,0, +0,0,0x1e,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0xe0,0x01,0,0,0,0,0,0,0,0,0,0,0,0,0, +0x1c,0xe0,0,0x80,0x0f,0xff,0x07,0xc0,0x0f,0,0,0,0,0,0, +0x1e,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0xc0,0xf1, +0x1f,0,0,0,0,0,0,0,0,0,0,0,0,0x0e,0xe0, +0,0xc0,0x07,0xfc,0x01,0,0x1f,0,0,0,0,0,0,0x3e,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0xc0,0xe1,0xff,0, +0,0,0,0,0,0,0,0,0,0,0,0x0e,0xe0,0x01,0xe0, +0x03,0x60,0,0,0x38,0,0,0,0,0,0,0x3c,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0xc0,0xc3,0xff,0x01,0,0, +0,0,0,0,0,0,0,0,0,0x07,0xc0,0x01,0xf0,0x01,0, +0xe0,0x03,0xf0,0,0,0,0,0,0,0x38,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0x80,0x07,0xf0,0x03,0,0,0,0, +0,0,0,0,0,0,0,0x07,0xc0,0x03,0xf8,0,0,0xf8,0x1f, +0xe0,0,0,0,0,0,0,0x38,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0x80,0x07,0xf0,0x03,0,0,0,0,0,0, +0,0,0,0,0,0x07,0xc0,0x03,0xf8,0,0,0xf8,0x1f,0xe0,0, +0,0,0,0,0,0x38,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0x80,0x0f,0xc0,0x07,0,0,0,0,0,0,0,0, +0,0,0,0x07,0x80,0x03,0x78,0,0,0xf8,0x7f,0xe0,0x01,0,0, +0,0,0,0x78,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0x0f,0x80,0x0f,0,0,0,0,0,0,0,0,0,0, +0x80,0x03,0x80,0x03,0x3e,0,0,0x78,0x7e,0xc0,0x03,0,0,0,0, +0,0x78,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0x1e,0x1c,0x0f,0,0,0,0,0,0,0,0,0,0,0x80,0xf3, +0x9f,0x03,0x1f,0,0,0,0xf0,0x80,0x03,0,0,0,0,0,0x70, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0x1e,0xfe, +0x0f,0,0,0,0,0,0,0,0,0,0,0xc0,0xff,0xff,0x07, +0x0f,0,0,0,0xe0,0,0x07,0,0,0,0,0,0x70,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0x1e,0xfe,0x0f,0, +0,0,0,0,0,0,0,0,0,0xc0,0xff,0xff,0x07,0x0f,0, +0,0,0xe0,0,0x07,0,0,0,0,0,0x70,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0x7c,0xfc,0x0f,0,0,0, +0,0,0,0,0,0,0,0xc0,0xff,0xff,0x87,0x07,0,0,0, +0xe0,0,0x07,0,0,0,0,0,0x70,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0x7c,0xf8,0x0f,0,0,0,0,0, +0,0,0,0,0,0xc0,0x3f,0xf4,0xc7,0x07,0,0,0,0xe0,0, +0x07,0,0,0,0,0,0x70,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0xf0,0x01,0,0,0,0,0,0,0,0, +0,0,0,0xe0,0x03,0x80,0xe7,0x01,0,0,0,0xe0,0,0x07,0, +0,0,0,0,0xe0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0xf0,0x03,0,0,0,0,0,0,0,0,0,0, +0,0xe0,0,0,0xff,0x01,0,0,0,0xe0,0x80,0x07,0,0,0, +0,0,0xe0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0xe0,0x03,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0xff,0,0,0,0,0xf8,0x80,0x03,0,0,0,0,0, +0xe0,0x01,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xe0, +0x03,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0xff,0,0,0,0,0xf8,0x80,0x03,0,0,0,0,0,0xe0,0x01, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0x80,0x07,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0x7e,0, +0,0,0,0x7c,0xc0,0x01,0,0,0,0,0,0xe0,0x01,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0x1f,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0x3e,0,0x80,0x07, +0xe0,0x3f,0xe0,0x01,0,0,0,0,0,0xc0,0x01,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0x1f,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0x1e,0,0xc0,0xff,0xff,0x0f, +0xe0,0,0,0,0,0,0,0xc0,0x01,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0x1e,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0x1f,0,0xe0,0xff,0xff,0x03,0xe0,0, +0,0,0,0,0,0xc0,0x01,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0x1e,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0x1f,0,0xe0,0xff,0xff,0x03,0xe0,0,0,0, +0,0,0,0xc0,0x01,0,0,0,0,0,0,0,0,0,0, +0,0,0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0x3f,0,0x1e,0,0,0,0,0,0,0,0,0,0,0, +0,0,0x80,0x07,0,0x80,0xff,0x7f,0,0xf8,0x01,0,0,0,0, +0,0xc0,0x01,0,0,0,0,0,0,0,0,0,0,0,0, +0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0x03,0x1e,0,0,0,0,0,0,0,0,0,0,0,0,0, +0xc0,0x07,0,0,0,0,0,0xfc,0x07,0,0,0,0,0,0xc0, +0x01,0,0,0,0,0,0,0,0,0,0,0,0,0xe0,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x07,0x1e, +0,0,0,0,0,0,0,0,0,0,0,0,0,0xe0,0x03, +0,0,0,0,0,0xfe,0x0f,0,0,0,0,0,0xc0,0x01,0, +0,0,0,0,0,0,0,0,0,0,0,0x80,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x0f,0x0f,0,0, +0,0,0,0,0,0,0,0,0,0,0,0xf0,0x01,0,0, +0,0,0x80,0xcf,0x3f,0,0,0xfe,0x01,0,0xc0,0x01,0,0,0, +0,0,0,0,0,0,0,0,0,0x80,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x0f,0x0f,0,0,0,0, +0,0,0,0,0,0,0,0,0,0xf0,0x01,0,0,0,0, +0x80,0xcf,0x3f,0,0,0xfe,0x01,0,0xc0,0x01,0,0,0,0,0, +0,0,0,0,0,0,0,0,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x07,0x0f,0,0,0,0,0,0, +0,0,0,0,0,0,0,0xf0,0,0,0,0,0,0xe0,0xe7, +0xff,0,0,0xfe,0x0f,0,0xc0,0xe1,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0x03,0,0xfc,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0x03,0x0f,0,0,0,0,0,0,0,0, +0,0,0,0,0,0x7c,0,0,0,0,0xf0,0xff,0xf9,0xff,0x01, +0,0xe0,0x1f,0,0xc0,0xe1,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0x03,0,0xf8,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0x03,0x0f,0,0,0,0,0,0,0,0,0,0, +0,0,0,0x7e,0,0,0,0xc0,0xff,0x7f,0xfe,0xe1,0x07,0,0xc0, +0xff,0,0xc0,0xe1,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0x01,0,0xe0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0x03,0x07,0,0,0,0,0,0,0,0,0,0,0,0, +0,0x1e,0,0,0,0xfc,0xff,0x1f,0xff,0x81,0x0f,0,0x80,0xf1,0x03, +0xc0,0xe1,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0,0, +0xe0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x03, +0x07,0,0,0,0,0,0,0,0,0,0,0,0,0,0x1e, +0,0,0,0xfc,0xff,0x1f,0xff,0x81,0x0f,0,0x80,0xf1,0x03,0xc0,0xe1, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0,0,0xc0,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x81,0x0f,0, +0,0,0,0,0,0,0,0,0,0,0,0,0x1f,0,0, +0,0xff,0x3f,0x80,0xff,0,0x1f,0,0x80,0xc1,0x07,0xc0,0xe1,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x3f,0,0,0,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xc1,0xff,0x3f,0,0, +0,0,0,0,0,0,0,0,0,0x80,0x0f,0,0x03,0xc0,0x3f, +0,0xe0,0x7f,0,0x7e,0,0x80,0x01,0x1f,0xe0,0xe1,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0x0f,0,0,0,0xfc,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xe0,0xff,0xff,0x03,0,0,0, +0,0,0,0,0,0,0,0x80,0x0f,0x80,0x07,0xf0,0x07,0,0xf0, +0x3f,0,0xf8,0,0x80,0x01,0x3c,0xe0,0xe1,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0x03,0,0,0,0xf8,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xe0,0xff,0xff,0x7f,0,0,0,0,0, +0,0,0,0,0,0xc0,0x03,0x80,0xff,0xff,0x01,0,0xfc,0x1f,0, +0xf0,0x01,0xc0,0x01,0x38,0xe0,0xe0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0,0,0,0,0xc0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0x7f,0xf0,0,0xf8,0xff,0x07,0,0,0,0,0,0, +0,0,0,0xe0,0x03,0,0xfe,0x1f,0,0x80,0xbf,0x07,0,0x80,0x07, +0xc0,0x01,0xe0,0xf1,0xe0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x1f, +0,0,0,0,0xc0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0x7f,0xf0,0,0xf8,0xff,0x07,0,0,0,0,0,0,0,0, +0,0xe0,0x03,0,0xfe,0x1f,0,0x80,0xbf,0x07,0,0x80,0x07,0xc0,0x01, +0xe0,0xf1,0xe0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x1f,0,0, +0,0,0x80,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f, +0xf0,0,0,0xfe,0x7f,0,0,0,0,0,0,0,0,0,0xf0, +0x01,0,0xf8,0x03,0,0xc0,0xcf,0x03,0,0x80,0x1f,0xf0,0x01,0xe0,0x71, +0xe0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x0f,0,0,0,0, +0,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0xf0,0, +0,0xe0,0xff,0x03,0,0,0,0,0,0,0,0,0xf8,0,0, +0,0,0,0xe0,0xe7,0x03,0,0,0x7e,0xff,0,0xc0,0x73,0xf0,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x03,0,0,0,0,0,0xfc, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x3f,0xf0,0,0,0, +0xfc,0x1f,0,0,0,0,0,0,0,0,0x78,0,0,0,0, +0,0xf8,0xf3,0,0,0,0xfc,0x7f,0,0,0x7f,0xf0,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0,0,0,0,0,0,0xf0,0xff,0xff, +0xff,0x1f,0,0,0,0,0,0,0,0xf0,0,0,0,0xe0,0xff, +0,0,0,0,0,0,0,0,0x3c,0,0,0,0,0,0x7c, +0xf8,0,0,0,0xf8,0xff,0xff,0xff,0x7f,0xf0,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0x7f,0,0,0,0,0,0,0xf0,0xff,0xff,0xff,0x1f, +0,0,0,0,0,0,0,0xf0,0,0,0,0xe0,0xff,0,0, +0,0,0,0,0,0,0x3c,0,0,0,0,0,0x7c,0xf8,0, +0,0,0xf8,0xff,0xff,0xff,0x7f,0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0x7f,0,0,0,0,0,0,0xe0,0xff,0xff,0xff,0x3f,0,0, +0,0,0,0,0,0x70,0,0,0,0x80,0xff,0x0f,0,0,0, +0,0,0,0,0x3e,0,0,0,0,0,0x7f,0x7c,0,0,0, +0xe0,0xff,0xff,0xff,0x7f,0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x1f, +0,0,0,0,0,0,0x80,0xff,0xff,0xff,0xff,0,0,0,0, +0,0,0,0x78,0,0,0,0,0xfe,0x7f,0,0,0,0,0, +0,0,0x1e,0,0,0,0,0xc0,0x1f,0x3e,0,0,0,0xc0,0xff, +0xff,0xff,0x7f,0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x0f,0,0, +0,0,0,0,0,0xff,0xff,0xff,0xff,0x01,0,0,0,0,0, +0,0x7c,0,0,0,0,0xf0,0xff,0x03,0,0,0,0,0,0, +0x0f,0,0,0,0,0xe0,0x07,0x1f,0,0,0,0x80,0x0f,0,0, +0x3c,0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x03,0,0,0,0, +0,0,0,0xfc,0xff,0xff,0xff,0x07,0,0,0,0,0,0,0x3c, +0,0,0,0,0,0xfe,0x0f,0,0,0,0,0,0,0x0f,0, +0,0,0,0xfc,0x83,0x0f,0,0,0,0,0x0f,0,0,0x38,0xf0, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x01,0,0,0,0,0,0, +0,0xfc,0xff,0xff,0xff,0x07,0,0,0,0,0,0,0x3c,0,0, +0,0,0,0xfe,0x0f,0,0,0,0,0,0,0x0f,0,0,0, +0,0xfc,0x83,0x0f,0,0,0,0,0x0f,0,0,0x38,0xf0,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0x01,0,0,0,0,0,0,0,0xf0, +0xff,0xff,0xff,0x0f,0,0,0,0,0,0,0x1e,0,0,0,0xf8, +0xff,0xff,0x3f,0,0,0,0,0,0x80,0x07,0,0,0,0,0xff, +0x80,0x07,0,0,0,0,0x3e,0,0,0x38,0,0,0,0,0, +0xff,0xff,0xff,0x7f,0,0,0,0,0,0,0,0,0xc0,0xff,0xff, +0xff,0x7f,0,0,0,0,0,0,0x0f,0,0,0,0xff,0xff,0xff, +0xff,0x03,0,0,0,0,0xe0,0x01,0,0,0,0xe0,0x1f,0xe0,0x03, +0,0,0,0,0x78,0,0,0x1c,0,0,0,0,0xe0,0xff,0xff, +0xff,0x0f,0,0,0,0,0,0,0,0,0,0xff,0xff,0xff,0xff, +0,0,0,0,0,0x80,0x0f,0,0,0,0xff,0x3f,0xe0,0xff,0x0f, +0,0,0,0,0xf0,0x01,0,0,0,0xf8,0x07,0xf0,0x01,0,0, +0,0,0xf0,0x01,0,0x1e,0,0,0,0,0xf0,0xff,0xff,0xff,0x07, +0,0,0,0,0,0,0,0,0,0xfe,0xff,0xff,0xff,0x03,0, +0,0,0,0x80,0x07,0,0,0,0xe0,0xff,0x01,0xfe,0x3f,0,0, +0,0,0xf0,0,0,0,0,0xfe,0x01,0xf8,0,0,0,0,0, +0xc0,0x03,0,0x0e,0,0,0,0,0xfc,0xff,0xff,0xff,0x01,0,0, +0,0,0,0,0,0,0,0xfe,0xff,0xff,0xff,0x03,0,0,0, +0,0x80,0x07,0,0,0,0xe0,0xff,0x01,0xfe,0x3f,0,0,0,0, +0xf0,0,0,0,0,0xfe,0x01,0xf8,0,0,0,0,0,0xc0,0x03, +0,0x0e,0,0,0,0,0xfc,0xff,0xff,0xff,0x01,0,0,0,0, +0,0,0,0,0,0xf8,0xff,0xff,0xff,0x07,0,0,0,0,0x80, +0x07,0,0,0,0,0xf8,0x07,0xc0,0xff,0x01,0,0,0,0xf8,0, +0,0,0x80,0x7f,0,0x78,0,0,0,0,0,0xc0,0x0f,0,0x0e, +0,0,0,0,0xff,0xff,0xff,0xff,0,0,0,0,0,0,0, +0,0,0,0xf0,0xff,0xff,0xff,0x1f,0,0,0,0,0xc0,0xe3,0xff, +0xff,0,0,0xc0,0x1f,0x80,0xff,0x03,0,0,0,0x3c,0,0,0, +0xe0,0x1f,0,0x3e,0,0,0,0,0,0,0x0f,0,0x07,0,0, +0,0x80,0xff,0xff,0xff,0x1f,0,0,0,0,0,0,0,0,0, +0,0xc0,0xff,0xff,0xff,0x7f,0,0,0,0,0xc0,0xfb,0xff,0xff,0x0f, +0,0,0x3e,0x80,0xf3,0x1f,0,0,0,0x3e,0,0,0,0xf8,0x07, +0,0x1e,0,0,0,0,0,0,0x1e,0,0x07,0,0,0,0xe0, +0xff,0xff,0xff,0x0f,0,0,0,0,0,0,0,0,0,0,0, +0xff,0xff,0xff,0xff,0,0,0,0,0xc0,0xff,0xff,0xff,0xff,0,0, +0x7c,0xc0,0x81,0xff,0,0,0,0x1f,0,0,0,0xff,0x01,0,0x0f, +0,0,0,0,0,0,0x7c,0x80,0x07,0,0,0,0xf0,0xff,0xff, +0xff,0x03,0,0,0,0,0,0,0,0,0,0,0,0xfc,0xff, +0xff,0xff,0x03,0,0,0,0xc0,0x7f,0,0xe0,0xff,0x3f,0,0xf0,0xc0, +0x01,0xfe,0x03,0,0,0x0f,0,0,0xc0,0x7f,0,0xc0,0x07,0,0, +0,0,0,0,0xf0,0xc0,0x03,0,0,0,0xfc,0xff,0xff,0xff,0, +0,0,0,0,0,0,0,0,0,0,0,0xfc,0xff,0xff,0xff, +0x03,0,0,0,0xc0,0x7f,0,0xe0,0xff,0x3f,0,0xf0,0xc0,0x01,0xfe, +0x03,0,0,0x0f,0,0,0xc0,0x7f,0,0xc0,0x07,0,0,0,0, +0,0,0xf0,0xc0,0x03,0,0,0,0xfc,0xff,0xff,0xff,0,0,0, +0,0,0,0,0,0,0,0,0,0xf8,0xff,0xff,0xff,0x07,0, +0,0,0xc0,0x0f,0,0,0xfc,0xff,0x03,0xc0,0xe3,0x01,0xf0,0x07,0, +0x80,0x07,0,0,0xf0,0x1f,0,0xc0,0x07,0,0,0,0,0,0, +0xf0,0xc1,0x01,0,0,0,0xff,0xff,0xff,0x7f,0,0,0,0,0, +0,0,0,0,0,0,0,0xe0,0xff,0xff,0xff,0x1f,0,0,0, +0xc0,0x07,0,0,0,0xfc,0xff,0,0xf7,0,0,0x3f,0,0xc0,0x03, +0,0,0xff,0,0,0xe0,0x01,0,0,0,0,0,0,0xc0,0xe3, +0x01,0,0,0xc0,0xff,0xff,0xff,0x0f,0,0,0,0,0,0,0, +0,0,0,0,0,0x80,0xff,0xff,0xff,0xff,0,0,0,0xc0,0x01, +0,0,0,0xc0,0xff,0x07,0x7f,0,0,0xfc,0,0xe0,0x03,0,0xe0, +0x3f,0,0,0xf0,0x01,0,0,0,0,0,0,0x80,0xff,0,0, +0,0xf0,0xff,0xff,0xff,0x07,0,0,0,0,0,0,0,0,0, +0,0,0,0,0xfe,0xff,0xff,0xff,0,0,0,0xc0,0x01,0,0, +0,0,0xfe,0x7f,0x7f,0,0,0xf8,0x01,0xe0,0x01,0,0xfc,0x07,0, +0,0xf8,0,0,0,0,0,0,0,0,0xff,0,0,0,0xfc, +0xff,0xff,0xff,0x01,0,0,0,0,0,0,0,0,0,0,0, +0,0,0xfe,0xff,0xff,0xff,0,0,0,0xc0,0x01,0,0,0,0, +0xfe,0x7f,0x7f,0,0,0xf8,0x01,0xe0,0x01,0,0xfc,0x07,0,0,0xf8, +0,0,0,0,0,0,0,0,0xff,0,0,0,0xfc,0xff,0xff, +0xff,0x01,0,0,0,0,0,0,0,0,0,0,0,0,0, +0xfc,0xff,0xff,0xff,0x03,0,0,0xc0,0x03,0,0,0,0,0xe0,0xff, +0x3f,0,0,0xf0,0x07,0xf0,0,0,0xff,0x03,0,0,0x7c,0,0, +0,0,0,0,0,0,0x7e,0,0,0,0xff,0xff,0xff,0x7f,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0xf0,0xff, +0xff,0xff,0x0f,0,0,0xc0,0x03,0,0,0,0,0,0xfe,0x3f,0, +0,0xc0,0x3f,0xf8,0,0xf8,0x3f,0,0,0,0x3c,0,0,0,0, +0,0,0,0,0x3c,0,0,0x80,0xff,0xff,0xff,0x3f,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0xc0,0xff,0xff,0xff, +0x3f,0,0,0xc0,0x03,0,0,0,0,0,0xf0,0xff,0x0f,0,0, +0x7f,0x7c,0,0xfe,0x07,0,0,0,0x1e,0,0,0,0,0,0, +0,0,0x1e,0,0,0xe0,0xff,0xff,0xff,0x0f,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0x80,0xff,0xff,0xff,0x7f,0, +0,0x80,0x07,0,0,0,0,0,0,0xff,0x7f,0,0,0xfc,0x3e, +0xe0,0x7f,0,0,0,0,0x1f,0,0,0,0,0,0,0,0, +0x1f,0,0,0xf8,0xff,0xff,0xff,0x03,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0x80,0xff,0xff,0xff,0x7f,0,0,0x80, +0x07,0,0,0,0,0,0,0xff,0x7f,0,0,0xfc,0x3e,0xe0,0x7f, +0,0,0,0,0x1f,0,0,0,0,0,0,0,0,0x1f,0, +0,0xf8,0xff,0xff,0xff,0x03,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0xfe,0xff,0xff,0xff,0x01,0,0x80,0x0f,0, +0,0,0,0,0,0xf0,0xff,0x1f,0,0xf0,0x1f,0xfe,0x0f,0,0, +0,0x80,0x0f,0,0,0,0,0,0,0,0,0x07,0,0,0xfc, +0xff,0xff,0xff,0x01,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0xf8,0xff,0xff,0xff,0x03,0,0,0x0f,0,0,0, +0,0,0,0,0xfc,0xff,0x3f,0xc0,0xff,0xff,0,0,0,0,0xc0, +0x07,0,0,0,0,0,0,0,0x80,0x03,0,0,0xff,0xff,0xff, +0x3f,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0xf0,0xff,0xff,0xff,0x0f,0,0,0x1e,0,0,0,0,0, +0,0,0,0xfe,0xff,0xff,0xff,0x1f,0,0,0,0,0xe0,0x03,0, +0,0,0,0,0,0,0xe0,0x03,0,0xc0,0xff,0xff,0xff,0x1f,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0x80,0xff,0xff,0xff,0x7f,0,0,0x3c,0,0,0,0,0,0,0, +0,0,0xfc,0xff,0xff,0x03,0,0,0,0,0xf0,0x01,0,0,0, +0,0,0,0,0xf8,0,0,0xf8,0xff,0xff,0xff,0x03,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0x80,0xff, +0xff,0xff,0x7f,0,0,0x3c,0,0,0,0,0,0,0,0,0, +0xfc,0xff,0xff,0x03,0,0,0,0,0xf0,0x01,0,0,0,0,0, +0,0,0xf8,0,0,0xf8,0xff,0xff,0xff,0x03,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0xfe,0xff,0xff, +0xff,0,0,0x78,0,0,0,0,0,0,0,0,0,0,0xf8, +0xff,0x1f,0,0,0,0,0xf0,0,0,0,0,0,0,0,0, +0x7c,0,0,0xfc,0xff,0xff,0xff,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0xfc,0xff,0xff,0xff,0x03, +0,0xf0,0,0,0,0,0,0,0,0,0,0,0,0xfe,0x7f, +0,0,0,0,0x7c,0,0,0,0,0,0,0,0,0x3e,0, +0,0xff,0xff,0xff,0x7f,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0xf0,0xff,0xff,0xff,0x07,0,0xe0, +0x01,0,0,0,0,0,0,0,0,0,0,0x7c,0xfe,0,0, +0,0,0x3c,0,0,0,0,0,0,0,0x80,0x1f,0,0xc0,0xff, +0xff,0xff,0x1f,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0xe0,0xff,0xff,0xff,0x1f,0,0xc0,0x03,0, +0,0,0,0,0,0,0,0,0,0x78,0xf8,0x03,0,0,0, +0x1e,0,0,0,0,0,0,0,0xc0,0x07,0,0xe0,0xff,0xff,0xff, +0x07,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0x80,0xff,0xff,0xff,0x7f,0,0x80,0x07,0,0,0, +0,0,0,0,0,0,0,0x70,0xe0,0x0f,0,0,0,0x0f,0, +0,0,0,0,0,0,0xf0,0x03,0,0xf8,0xff,0xff,0xff,0x03,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0x80,0xff,0xff,0xff,0x7f,0,0x80,0x07,0,0,0,0,0, +0,0,0,0,0,0x70,0xe0,0x0f,0,0,0,0x0f,0,0,0, +0,0,0,0,0xf0,0x03,0,0xf8,0xff,0xff,0xff,0x03,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0xff,0xff,0xff,0xff,0,0x80,0x0f,0,0,0,0,0,0,0, +0,0,0,0x70,0,0x3f,0,0,0x80,0x0f,0,0,0,0,0, +0,0,0xf8,0x01,0,0xfe,0xff,0xff,0x7f,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xfc, +0xff,0xff,0xff,0x03,0,0x1f,0,0,0,0,0,0,0,0,0, +0,0x70,0,0xfe,0,0,0xc0,0x03,0,0,0,0,0,0,0, +0x7e,0,0x80,0xff,0xff,0xff,0x3f,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0xf0,0xff,0xff, +0xff,0x0f,0,0x3e,0,0,0,0,0,0,0,0,0,0,0x70, +0,0xf8,0x01,0,0xc0,0x03,0,0,0,0,0,0,0,0x3e,0, +0xc0,0xff,0xff,0xff,0x0f,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0xc0,0xff,0xff,0xff,0x3f, +0,0xf8,0,0,0,0,0,0,0,0,0,0,0x70,0,0x80, +0x0f,0,0xf0,0x01,0,0,0,0,0,0,0xc0,0x0f,0,0xf8,0xff, +0xff,0xff,0x01,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0xc0,0xff,0xff,0xff,0x3f,0,0xf8, +0,0,0,0,0,0,0,0,0,0,0x70,0,0x80,0x0f,0, +0xf0,0x01,0,0,0,0,0,0,0xc0,0x0f,0,0xf8,0xff,0xff,0xff, +0x01,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0xff,0xff,0xff,0xff,0,0xe0,0x01,0, +0,0,0,0,0,0,0,0,0x70,0,0,0x3e,0,0xf0,0, +0,0,0,0,0,0,0xe0,0x07,0,0xfe,0xff,0xff,0xff,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0xfc,0xff,0xff,0xff,0x03,0xc0,0x03,0,0,0, +0,0,0,0,0,0,0x70,0,0,0xfc,0,0x78,0,0,0, +0,0,0,0,0xf8,0x01,0x80,0xff,0xff,0xff,0x3f,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0xf0,0xff,0xff,0xff,0x0f,0xc0,0x07,0,0,0,0,0, +0,0,0,0,0x78,0,0,0xe0,0x03,0x3c,0,0,0,0,0, +0,0,0x7c,0,0xe0,0xff,0xff,0xff,0x0f,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0xc0,0xff,0xff,0xff,0x1f,0,0x0f,0,0,0,0,0,0,0, +0,0,0x7c,0,0,0xc0,0x1f,0x1e,0,0,0,0,0,0,0, +0x3e,0,0xf0,0xff,0xff,0xff,0x03,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xc0, +0xff,0xff,0xff,0x1f,0,0x0f,0,0,0,0,0,0,0,0,0, +0x7c,0,0,0xc0,0x1f,0x1e,0,0,0,0,0,0,0,0x3e,0, +0xf0,0xff,0xff,0xff,0x03,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0x80,0xff,0xff, +0xff,0x7f,0,0x1e,0,0,0,0,0,0,0,0,0,0x7c,0, +0,0,0x3f,0x0f,0,0,0,0,0,0,0x80,0x0f,0,0xfc,0xff, +0xff,0xff,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0xfe,0xff,0xff,0xff, +0x01,0x7c,0,0,0,0,0,0,0,0,0,0x3c,0,0,0, +0xfc,0x0f,0,0,0,0,0,0,0xe0,0x07,0,0xff,0xff,0xff,0x3f, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0xfc,0xff,0xff,0xff,0x03,0x78, +0,0,0,0,0,0,0,0,0,0x3c,0,0,0,0xf8,0x07, +0,0,0,0,0,0,0xf0,0x01,0xc0,0xff,0xff,0xff,0x1f,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0xf0,0xff,0xff,0xff,0x07,0xf0,0x01,0, +0,0,0,0,0,0,0,0x1c,0,0,0,0xfc,0x03,0,0, +0,0,0,0,0xf8,0,0xf0,0xff,0xff,0xff,0x07,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0xf0,0xff,0xff,0xff,0x07,0xf0,0x01,0,0,0, +0,0,0,0,0,0x1c,0,0,0,0xfc,0x03,0,0,0,0, +0,0,0xf8,0,0xf0,0xff,0xff,0xff,0x07,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0xe0,0xff,0xff,0xff,0x1f,0xe0,0x03,0,0,0,0,0, +0,0,0,0x1c,0,0,0,0xfc,0x01,0,0,0,0,0,0, +0x7e,0,0xf8,0xff,0xff,0xff,0x01,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0xff,0xff,0xff,0xff,0x80,0x0f,0,0,0,0,0,0,0, +0,0x1e,0,0,0,0xff,0,0,0,0,0,0,0x80,0x0f,0, +0xfe,0xff,0xff,0x3f,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0xfc,0xff,0xff,0xff,0x01,0x1f,0,0,0,0,0,0,0,0,0x0e, +0,0,0x80,0x7f,0,0,0,0,0,0,0xc0,0x07,0x80,0xff,0xff, +0xff,0x0f,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0xf8,0xff, +0xff,0xff,0x07,0x3e,0,0,0,0,0,0,0,0,0x0e,0,0, +0xc0,0x3f,0,0,0,0,0,0,0xf0,0x01,0xe0,0xff,0xff,0xff,0x07, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0xe0,0xff,0xff,0xff, +0x0f,0x7c,0,0,0,0,0,0,0,0,0x0f,0,0,0xe0,0x3f, +0,0,0,0,0,0,0xf8,0x01,0xf8,0xff,0xff,0xff,0x01,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0xe0,0xff,0xff,0xff,0x0f,0x7c, +0,0,0,0,0,0,0,0,0x0f,0,0,0xe0,0x3f,0,0, +0,0,0,0,0xf8,0x01,0xf8,0xff,0xff,0xff,0x01,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0xc0,0xff,0xff,0xff,0x3f,0xf0,0,0, +0,0,0,0,0,0,0x0f,0,0,0xf0,0x1f,0,0,0,0, +0,0,0x7e,0,0xfc,0xff,0xff,0xff,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0xfe,0xff,0xff,0x7f,0xe0,0x01,0,0,0, +0,0,0,0x80,0x07,0,0,0xfc,0x1f,0,0,0,0,0,0, +0x3e,0,0xff,0xff,0xff,0x3f,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0xfc,0xff,0xff,0xff,0xe0,0x03,0,0,0,0,0, +0,0x80,0x07,0,0,0xfc,0x0f,0,0,0,0,0,0,0x1f,0xc0, +0xff,0xff,0xff,0x1f,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0xf0,0xff,0xff,0xff,0xc1,0x07,0,0,0,0,0,0,0xc0, +0x03,0,0,0xfe,0x07,0,0,0,0,0,0xc0,0x0f,0xf0,0xff,0xff, +0xff,0x07,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0xf0,0xff,0xff,0xff,0xc1,0x07,0,0,0,0,0,0,0xc0,0x03,0, +0,0xfe,0x07,0,0,0,0,0,0xc0,0x0f,0xf0,0xff,0xff,0xff,0x07, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0xf0,0xff, +0xff,0xff,0x83,0x0f,0,0,0,0,0,0,0xc0,0x01,0,0,0xff, +0x07,0,0,0,0,0,0xc0,0x07,0xf8,0xff,0xff,0xff,0x03,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0x80,0xff,0xff,0xff, +0x0f,0x1e,0,0,0,0,0,0,0xe0,0x01,0,0xc0,0xef,0x03,0, +0,0,0,0,0xe0,0x01,0xff,0xff,0xff,0x7f,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0xfe,0xff,0xff,0x0f,0x1c, +0,0,0,0,0,0,0xf0,0,0,0xe0,0xf3,0x01,0,0,0, +0,0,0xf0,0x80,0xff,0xff,0xff,0x1f,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0xfc,0xff,0xff,0x1f,0x38,0,0, +0,0,0,0,0x70,0,0,0xf0,0xf9,0,0,0,0,0,0, +0x78,0xe0,0xff,0xff,0xff,0x07,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0xfc,0xff,0xff,0x1f,0x38,0,0,0,0, +0,0,0x70,0,0,0xf0,0xf9,0,0,0,0,0,0,0x78,0xe0, +0xff,0xff,0xff,0x07,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0xf0,0xff,0xff,0x7f,0xf0,0,0,0,0,0,0, +0x78,0,0,0x78,0x7c,0,0,0,0,0,0,0x3c,0xf0,0xff,0xff, +0xff,0x03,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0x80,0xff,0xff,0xff,0xe0,0,0,0,0,0,0,0x78,0, +0,0x7e,0x7c,0,0,0,0,0,0,0x3c,0xf8,0xff,0xff,0xff,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0xff,0xff,0xff,0xe0,0x01,0,0,0,0,0,0x3c,0,0,0x3e, +0x3e,0,0,0,0,0,0,0x1f,0xfe,0xff,0xff,0x7f,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xfe, +0xff,0xff,0xc1,0x03,0,0,0,0,0,0x3c,0,0,0x0f,0x1e,0, +0,0,0,0,0,0x0f,0xfe,0xff,0xff,0x1f,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0xfe,0xff,0xff, +0xc1,0x03,0,0,0,0,0,0x3c,0,0,0x0f,0x1e,0,0,0, +0,0,0,0x0f,0xfe,0xff,0xff,0x1f,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0xfc,0xff,0xff,0x83,0x07, +0,0,0,0,0,0x1e,0,0xc0,0x07,0x0f,0,0,0,0,0, +0x80,0x07,0xff,0xff,0xff,0x0f,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0xf0,0xff,0xff,0x07,0x0f,0,0, +0,0,0,0x0f,0,0xe0,0x83,0x0f,0,0,0,0,0,0x80,0xc7, +0xff,0xff,0xff,0x01,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0xc0,0xff,0xff,0x0f,0x0f,0,0,0,0, +0,0x07,0,0xf0,0x81,0x07,0,0,0,0,0,0xc0,0xc3,0xff,0xff, +0xff,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0xff,0xff,0x1f,0x1c,0,0,0,0,0x80,0x03, +0,0x7c,0xc0,0x03,0,0,0,0,0,0xe0,0xe1,0xff,0xff,0x7f,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0xfe,0xff,0x3f,0x3c,0,0,0,0,0xc0,0x03,0,0x3f, +0xe0,0x01,0,0,0,0,0,0xe0,0xe0,0xff,0xff,0x1f,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0xfe,0xff,0x3f,0x3c,0,0,0,0,0xc0,0x03,0,0x3f,0xe0,0x01, +0,0,0,0,0,0xe0,0xe0,0xff,0xff,0x1f,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xf8, +0xff,0x3f,0x3c,0,0,0,0,0xe0,0x01,0x80,0x1f,0xe0,0x01,0,0, +0,0,0,0xf0,0xe0,0xff,0xff,0x07,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0xf8,0xff,0x3f, +0x38,0,0,0,0,0xe0,0,0xe0,0x07,0xf0,0,0,0,0,0, +0,0x78,0xf8,0xff,0xff,0x01,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0xf8,0xff,0x3f,0x38,0, +0,0,0,0xf0,0,0xf0,0x03,0x70,0,0,0,0,0,0,0x78, +0xf8,0xff,0xff,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0xf8,0xff,0x3f,0x38,0,0,0, +0,0x70,0,0xfe,0,0x38,0,0,0,0,0,0,0x3c,0xfc,0xff, +0x3f,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0xf8,0xff,0x3f,0x38,0,0,0,0,0x70, +0,0xfe,0,0x38,0,0,0,0,0,0,0x3c,0xfc,0xff,0x3f,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0xf8,0xff,0x3f,0x38,0,0,0,0,0x38,0x80,0x3f, +0,0x3c,0,0,0,0,0,0,0x1c,0xfc,0xff,0x3f,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0xfc,0xff,0x3f,0x38,0,0,0,0,0x1c,0xc0,0x0f,0,0x1c, +0,0,0,0,0,0,0x1e,0xfc,0xff,0x3f,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0xfc,0xff,0x1f,0x38,0,0,0,0,0x1e,0xf0,0x03,0,0x1e,0,0, +0,0,0,0,0x1e,0xfc,0xff,0x3f,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0xfe,0xff, +0x1f,0x38,0,0,0,0,0x0f,0x7f,0,0,0x0f,0,0,0,0, +0,0,0x0f,0xfc,0xff,0x3f,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0xfe,0xff,0x1f,0x38, +0,0,0,0,0x0f,0x7f,0,0,0x0f,0,0,0,0,0,0, +0x0f,0xfc,0xff,0x3f,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0xfe,0xff,0x1f,0x38,0,0, +0,0,0xe7,0x3f,0,0,0x07,0,0,0,0,0,0,0x0f,0xfc, +0xff,0x7f,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0xff,0xff,0x0f,0x38,0,0,0,0x80, +0xfb,0x0f,0,0x80,0x03,0,0,0,0,0,0,0x07,0xfc,0xff,0x7f, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0xff,0xff,0x07,0x38,0,0,0,0xc0,0xff,0x01, +0,0xc0,0x03,0,0,0,0,0,0x80,0x07,0xf8,0xff,0xff,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0xff,0xff,0x07,0x38,0,0,0,0xe0,0x3f,0,0,0xc0, +0x01,0,0,0,0,0,0xc0,0x03,0xf8,0xff,0xff,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0xff,0xff,0x07,0x38,0,0,0,0xe0,0x3f,0,0,0xc0,0x01,0, +0,0,0,0,0xc0,0x03,0xf8,0xff,0xff,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0x80,0xff, +0xff,0x07,0x38,0,0,0,0xe0,0x0f,0,0,0xe0,0,0,0,0, +0,0,0xc0,0x03,0xf8,0xff,0xff,0x01,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0x80,0xff,0xff,0x03, +0x38,0,0,0,0xf0,0x03,0,0,0xf0,0,0,0,0,0,0, +0xe0,0x01,0xf8,0xff,0xff,0x01,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0xc0,0xff,0xff,0x03,0x38,0, +0,0,0x70,0,0,0,0x70,0,0,0,0,0,0,0xe0,0x01, +0xf0,0xff,0xff,0x01,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0xc0,0xff,0xff,0x01,0x38,0,0,0, +0,0,0,0,0x78,0,0,0,0,0,0,0xe0,0,0xf0,0xff, +0xff,0x03,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0xe0,0xff,0xff,0,0x38,0,0,0,0,0, +0,0,0x38,0,0,0,0,0,0,0xf0,0,0xf0,0xff,0xff,0x03, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0xe0,0xff,0xff,0,0x38,0,0,0,0,0,0,0, +0x38,0,0,0,0,0,0,0xf0,0,0xf0,0xff,0xff,0x03,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0xe0,0xff,0xff,0,0x38,0,0,0,0,0,0,0,0x3c,0, +0,0,0,0,0,0xf0,0,0xe0,0xff,0xff,0x07,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xe0, +0xff,0xff,0,0x38,0,0,0,0,0,0,0,0x1e,0,0,0, +0,0,0,0x78,0,0xe0,0xff,0xff,0x07,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0xf0,0xff,0x7f, +0,0x18,0,0,0,0,0,0,0,0x1e,0,0,0,0,0, +0,0x78,0,0xc0,0xff,0xff,0x0f,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0xf0,0xff,0x7f,0,0x18, +0,0,0,0,0,0,0,0x0f,0,0,0,0,0,0,0x3c, +0,0xc0,0xff,0xff,0x0f,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0xf0,0xff,0x7f,0,0x18,0,0, +0,0,0,0,0,0x0f,0,0,0,0,0,0,0x3c,0,0xc0, +0xff,0xff,0x0f,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0xf8,0xff,0x7f,0,0x1c,0,0,0,0, +0,0,0x80,0x07,0,0,0,0,0,0,0x3c,0,0x80,0xff,0xff, +0x0f,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0xf8,0xff,0x3f,0,0x1c,0,0,0,0,0,0, +0x80,0x07,0,0,0,0,0,0,0x1e,0,0x80,0xff,0xff,0x1f,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0xfc,0xff,0x1f,0,0x1c,0,0,0,0,0,0,0xc0,0x03, +0,0,0,0,0,0,0x1e,0,0x80,0xff,0xff,0x1f,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0xfc,0xff,0x1f,0,0x1c,0,0,0,0,0,0,0xc0,0x03,0,0, +0,0,0,0,0x1f,0,0,0xff,0xff,0x1f,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0xfc,0xff, +0x1f,0,0x1c,0,0,0,0,0,0,0xc0,0x03,0,0,0,0, +0,0,0x1f,0,0,0xff,0xff,0x1f,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0xfe,0xff,0x0f,0, +0x1c,0,0,0,0,0,0,0xe0,0x01,0,0,0,0,0,0, +0x0f,0,0,0xff,0xff,0x3f,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0xfe,0xff,0x0f,0,0x1c,0, +0,0,0,0,0,0xe0,0,0,0,0,0,0,0,0x0f,0, +0,0xff,0xff,0x3f,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0xfe,0xff,0x07,0,0x1c,0,0,0, +0,0,0,0xf0,0,0,0,0,0,0,0x80,0x07,0,0,0xfe, +0xff,0x3f,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0xff,0xff,0x07,0,0x1e,0,0,0,0,0, +0,0x70,0,0,0,0,0,0,0x80,0x07,0,0,0xfe,0xff,0x7f, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0xff,0xff,0x07,0,0x1e,0,0,0,0,0,0,0x70, +0,0,0,0,0,0,0x80,0x07,0,0,0xfe,0xff,0x7f,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0xff,0xff,0x07,0,0x1e,0,0,0,0,0,0,0x78,0,0, +0,0,0,0,0x80,0x07,0,0,0xfc,0xff,0x7f,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0x80,0xff, +0xff,0x03,0,0x1e,0,0,0,0,0,0,0x38,0,0,0,0, +0,0,0x80,0x03,0,0,0xfc,0xff,0xff,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0x80,0xff,0xff,0x03, +0,0x1e,0,0,0,0,0,0,0x3c,0,0,0,0,0,0, +0xc0,0x03,0,0,0xfc,0xff,0xff,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0xc0,0xff,0xff,0x03,0,0x1e, +0,0,0,0,0,0,0x1e,0,0,0,0,0,0,0xc0,0x03, +0,0,0xf8,0xff,0xff,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0xc0,0xff,0xff,0x03,0,0x1e,0,0, +0,0,0,0,0x1e,0,0,0,0,0,0,0xc0,0x03,0,0, +0xf8,0xff,0xff,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0xc0,0xff,0xff,0x01,0,0x1e,0,0,0,0, +0,0,0x1e,0,0,0,0,0,0,0xc0,0x03,0,0,0xf8,0xff, +0xff,0x01,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0xe0,0xff,0xff,0x01,0,0x1c,0,0,0,0,0,0, +0x0f,0,0,0,0,0,0,0xc0,0x01,0,0,0xf0,0xff,0xff,0x01, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0xe0,0xff,0xff,0,0,0x1c,0,0,0,0,0,0x80,0x07,0, +0,0,0,0,0,0xc0,0x01,0,0,0xf0,0xff,0xff,0x01,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xe0, +0xff,0xff,0,0,0x3c,0,0,0,0,0,0x80,0x07,0,0,0, +0,0,0,0xc0,0x01,0,0,0xf0,0xff,0xff,0x03,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0xf0,0xff,0x7f, +0,0,0x3c,0,0,0,0,0,0x80,0x03,0,0,0,0,0, +0,0xc0,0x01,0,0,0xe0,0xff,0xff,0x03,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0xf0,0xff,0x7f,0,0, +0x3c,0,0,0,0,0,0x80,0x03,0,0,0,0,0,0,0xc0, +0x01,0,0,0xe0,0xff,0xff,0x03,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0xf0,0xff,0x7f,0,0,0x38,0, +0,0,0,0,0xc0,0x03,0,0,0,0,0,0,0xc0,0x01,0, +0,0xe0,0xff,0xff,0x03,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0xf8,0xff,0x3f,0,0,0x38,0,0,0, +0,0,0xc0,0x01,0,0,0,0,0,0,0xc0,0x01,0,0,0xe0, +0xff,0xff,0x07,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0xf8,0xff,0x3f,0,0,0x38,0,0,0,0,0, +0xe0,0x01,0,0,0,0,0,0,0xc0,0x01,0,0,0xc0,0xff,0xff, +0x07,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0xfc,0xff,0x1f,0,0,0x38,0,0,0,0,0,0xe0,0, +0,0,0,0,0,0,0xc0,0x01,0,0,0xc0,0xff,0xff,0x07,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0xfc,0xff,0x1f,0,0,0x38,0,0,0,0,0,0xe0,0,0,0, +0,0,0,0,0xc0,0x01,0,0,0xc0,0xff,0xff,0x07,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0xfc,0xff, +0x1f,0,0,0x38,0,0,0,0,0,0xf0,0,0,0,0,0, +0,0,0xc0,0x01,0,0,0x80,0xff,0xff,0x0f,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0xfc,0xff,0x1f,0, +0,0x38,0,0,0,0,0,0x78,0,0,0,0,0,0,0, +0xc0,0x03,0,0,0x80,0xff,0xff,0x0f,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0xfe,0xff,0x0f,0,0,0x38, +0,0,0,0,0,0x78,0,0,0,0,0,0,0,0xc0,0x03, +0,0,0,0xff,0xff,0x1f,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0xfe,0xff,0x0f,0,0,0x3c,0,0, +0,0,0,0x3c,0,0,0,0,0,0,0,0x80,0x07,0,0, +0,0xff,0xff,0x1f,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0xfe,0xff,0x0f,0,0,0x3c,0,0,0,0, +0,0x3c,0,0,0,0,0,0,0,0x80,0x07,0,0,0,0xff, +0xff,0x1f,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0xff,0x07,0,0,0xfc,0x3f,0,0,0,0,0,0x3e, +0,0,0,0,0,0,0,0x80,0x07,0,0,0,0xfe,0xff,0x1f, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0x0f,0,0xe0,0xff,0xff,0x3f,0,0,0,0,0,0x1e,0,0, +0,0,0,0,0,0,0x0f,0,0,0,0xfe,0xff,0x3f,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0xfc,0xff,0xff,0xff,0x3f,0,0,0,0,0,0x0f,0,0,0,0, +0,0,0,0,0x0f,0,0,0,0xfe,0xff,0x3f,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0xe0,0xff,0xff, +0xff,0x0f,0x3c,0,0,0,0,0,0x0f,0,0,0,0,0,0, +0,0,0x0e,0,0,0,0xfc,0xff,0x3f,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0xe0,0xff,0xff,0xff,0x0f, +0x3c,0,0,0,0,0,0x0f,0,0,0,0,0,0,0,0, +0x0e,0,0,0,0xfc,0xff,0x3f,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0xfc,0xff,0xff,0x01,0,0x38,0, +0,0,0,0x80,0x07,0,0,0,0,0,0,0,0,0x1e,0, +0,0,0xfc,0xff,0x7f,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0xf0,0xff,0xff,0,0,0,0x38,0,0,0, +0,0x80,0x07,0,0,0,0,0,0,0,0,0x3c,0,0,0, +0xfc,0xff,0x7f,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0xff,0xff,0x03,0,0,0,0x38,0,0,0,0,0xc0, +0x03,0,0,0,0,0,0,0,0,0x78,0,0,0,0xf8,0xff, +0x7f,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0xfc,0xff,0x1f,0,0,0,0,0x78,0,0,0,0,0xc0,0x01,0, +0,0,0,0,0,0,0,0x70,0,0,0,0xf8,0xff,0xff,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0xc0,0xff,0xff, +0x01,0,0,0,0,0x70,0,0,0,0,0xe0,0x01,0,0,0, +0,0,0,0,0,0xf0,0x01,0,0,0xf0,0xff,0xff,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0xc0,0xff,0xff,0x01,0, +0,0,0,0x70,0,0,0,0,0xe0,0x01,0,0,0,0,0, +0,0,0,0xf0,0x01,0,0,0xf0,0xff,0xff,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0xff,0xff,0x07,0,0xfe,0,0, +0,0x70,0,0,0,0,0xe0,0,0,0,0,0,0,0,0, +0,0xe0,0x03,0,0,0xf0,0xff,0xff,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0xf0,0xff,0x1f,0,0xf8,0xff,0,0,0,0x70, +0,0,0,0,0xf0,0,0,0,0,0,0,0,0,0,0xc0, +0x03,0,0,0xf0,0xff,0xff,0x01,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0xfe,0x7f,0,0xe0,0xff,0x7f,0,0,0,0x70,0,0, +0,0,0xf8,0,0,0,0,0,0,0,0,0,0x80,0x0f,0, +0,0xf0,0xff,0xff,0x01,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0xe0,0xff,0x03,0,0xf0,0xff,0x3f,0,0,0,0x70,0,0,0,0, +0x78,0,0,0,0,0,0,0,0,0,0,0x1f,0,0,0xe0, +0xff,0xff,0x03,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0xe0,0xff, +0x03,0,0xf0,0xff,0x3f,0,0,0,0x70,0,0,0,0,0x78,0, +0,0,0,0,0,0,0,0,0,0x1f,0,0,0xe0,0xff,0xff, +0x03,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0xfc,0x7f,0,0, +0xf8,0xff,0x3f,0,0,0,0x70,0,0,0,0,0x78,0,0,0, +0,0,0,0,0,0,0,0x7c,0,0,0xe0,0xff,0xff,0x03,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0x80,0xff,0x07,0,0,0xf8,0xff, +0x1f,0,0,0,0xe0,0,0,0,0,0x3c,0,0,0,0,0, +0,0,0,0,0,0xf8,0x01,0,0xe0,0xff,0xff,0x03,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0xc0,0xff,0,0,0,0xfc,0xff,0x1f,0, +0,0,0xe0,0,0,0,0,0x3c,0,0,0,0,0,0,0, +0,0,0,0xe0,0x07,0,0xc0,0xff,0xff,0x03,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0xc0,0x1f,0,0,0,0xfe,0xff,0x1f,0,0,0, +0xe0,0,0,0,0,0x3c,0,0,0x60,0,0,0,0,0,0, +0,0xc0,0x3f,0,0xc0,0xff,0xff,0x07,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0xc0,0x1f,0,0,0,0xfe,0xff,0x1f,0,0,0,0xe0,0, +0,0,0,0x3c,0,0,0x60,0,0,0,0,0,0,0,0xc0, +0x3f,0,0xc0,0xff,0xff,0x07,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0x80,0x03,0,0,0,0xfe,0xff,0x0f,0,0,0,0xe0,0,0,0, +0,0x3e,0,0,0x70,0,0,0,0,0,0,0,0,0xff,0x01, +0x80,0xff,0xff,0x07,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0xfe,0xff,0x0f,0,0,0,0xe0,0,0,0,0,0x3f, +0,0,0x38,0,0,0,0,0,0,0,0,0xf8,0x3f,0x80,0xff, +0xff,0x0f,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0xff,0xff,0x07,0,0,0,0xc0,0x01,0,0,0,0xff,0,0, +0x38,0,0,0,0,0,0,0,0,0xc0,0xff,0,0xfc,0xff,0x0f, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xff, +0xff,0x07,0,0,0,0xc0,0x01,0,0,0,0xf7,0x03,0,0x3c,0, +0,0,0,0,0,0,0,0,0xff,0x0f,0xc0,0xff,0x0f,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0xff,0xff,0x07, +0,0,0,0xc0,0x01,0,0,0,0xf7,0x03,0,0x3c,0,0,0, +0,0,0,0,0,0,0xff,0x0f,0xc0,0xff,0x0f,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0x80,0xff,0xff,0x03,0,0, +0,0xc0,0x01,0,0,0x80,0xe3,0x0f,0,0x3f,0,0,0,0,0, +0,0,0,0,0xf0,0x7f,0,0xf8,0x1f,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0x80,0xff,0xff,0x03,0,0,0,0xc0, +0x01,0,0,0x80,0xe3,0xff,0xff,0x3f,0,0,0,0,0,0,0, +0,0,0x80,0xff,0x03,0x80,0x0f,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0x80,0xff,0xff,0x03,0,0,0,0xc0,0x01,0, +0,0x80,0xc3,0xff,0xff,0x3f,0,0,0,0,0,0,0,0,0, +0,0xfe,0x1f,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0xc0,0xff,0xff,0x01,0,0,0,0xc0,0x01,0,0,0xc0, +0x01,0xff,0xff,0x3f,0,0,0,0,0,0,0,0,0,0,0xe0, +0xff,0x01,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0xc0,0xff,0xff,0,0,0,0,0xc0,0x01,0,0,0xc0,0x01,0xfe, +0x7f,0x38,0,0,0,0,0,0,0,0,0,0,0,0xfe,0x1f, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xc0, +0xff,0xff,0,0,0,0,0xc0,0x01,0,0,0xc0,0x01,0xfe,0x7f,0x38, +0,0,0,0,0,0,0,0,0,0,0,0xfe,0x1f,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0xe0,0xff,0xff, +0,0,0,0,0xc1,0x01,0,0,0xe0,0,0x3e,0,0x38,0,0, +0,0,0,0,0,0,0,0,0,0xf0,0xff,0x01,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0xe0,0xff,0xff,0,0, +0,0x80,0xc3,0x01,0,0,0xe0,0,0x7c,0,0x3c,0,0,0,0, +0,0,0,0,0,0,0,0,0xff,0x7f,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0xf0,0xff,0x7f,0,0,0,0xf0, +0xc3,0x01,0,0,0xf0,0,0xf0,0,0x3c,0,0,0,0,0,0, +0,0,0,0,0,0,0x80,0xff,0xff,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0xf8,0xff,0x7f,0,0,0,0xf8,0xc3,0x01, +0,0,0xf0,0,0xe0,0x01,0x3c,0,0,0,0,0,0,0,0, +0,0,0,0,0,0xe0,0xff,0xff,0x03,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0xf8,0xff,0x7f,0,0,0,0xf8,0xc3,0x01,0,0, +0xf0,0,0xe0,0x01,0x3c,0,0,0,0,0,0,0,0,0,0, +0,0,0,0xe0,0xff,0xff,0x03,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0xf8,0xff,0x7f,0,0,0,0xff,0xc3,0x03,0,0,0x70,0, +0xc0,0x03,0x3c,0,0,0,0,0,0,0,0,0,0,0,0, +0,0x80,0xff,0xff,0xff,0x07,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0xf8,0xff,0x3f,0,0,0x80,0xff,0xc3,0x03,0,0,0x70,0,0xc0,0x03, +0x3c,0,0,0,0,0,0,0,0,0,0,0,0xf0,0x01,0, +0xf0,0xff,0xff,0x0f,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0xf8,0xff, +0x1f,0,0,0xe0,0xff,0xc3,0x03,0,0,0x78,0,0x80,0x07,0x3c,0, +0,0,0,0,0,0,0,0,0,0,0xf0,0x7f,0,0,0, +0xfc,0x0f,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0xfc,0xff,0x1f,0, +0,0xf8,0xff,0xc3,0x03,0,0,0x78,0,0,0x0f,0x3c,0,0,0, +0,0,0,0,0,0,0,0,0xe0,0xff,0x0f,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0xfc,0xff,0x1f,0,0,0xf8, +0xff,0xc3,0x03,0,0,0x78,0,0,0x0f,0x3c,0,0,0,0,0, +0,0,0,0,0,0,0xe0,0xff,0x0f,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0xfc,0xff,0x0f,0,0,0xfe,0xff,0x83, +0x03,0,0,0x3c,0,0,0x1e,0x1c,0,0,0,0,0,0,0, +0,0xfc,0xff,0x01,0xe0,0xff,0xff,0x01,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0xfe,0xff,0x0f,0,0x80,0xff,0xff,0x87,0x03,0, +0,0x3c,0,0,0x3c,0x1c,0,0,0,0,0,0,0xf8,0xff,0xff, +0xff,0xff,0xe1,0xff,0xff,0x03,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0xfe,0xff,0x0f,0,0xc0,0xff,0xff,0x87,0x03,0,0,0x3c, +0,0,0x78,0x1c,0,0,0,0,0,0xfe,0xff,0xff,0xff,0xff,0xff, +0xe1,0xff,0xff,0x03,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0xff,0xff,0x07,0,0xf8,0xff,0xff,0xc7,0x03,0,0,0x1c,0,0, +0xe0,0x1c,0,0,0,0x80,0xff,0xff,0xff,0x01,0,0,0,0xc0,0xff, +0xff,0x03,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xff, +0xff,0x07,0,0xf8,0xff,0xff,0xc7,0x03,0,0,0x1c,0,0,0xe0,0x1c, +0,0,0,0x80,0xff,0xff,0xff,0x01,0,0,0,0xc0,0xff,0xff,0x03, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0xff,0xff,0x03, +0,0xfe,0xff,0xff,0xc7,0x03,0,0,0x1c,0,0,0xe0,0x1f,0,0, +0,0xf0,0xff,0xff,0,0,0,0,0,0x80,0xff,0xff,0x07,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0x80,0xff,0xff,0x03,0,0xff, +0xff,0xff,0xc7,0x03,0,0,0x1c,0,0,0x80,0x1f,0,0,0,0xff, +0xff,0x03,0,0,0,0xfc,0x03,0x80,0xff,0xff,0x07,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0x80,0xff,0xff,0x03,0xc0,0xff,0xff,0xff, +0xc7,0x03,0,0,0x1e,0,0,0,0x1f,0,0,0xf8,0xff,0x0f,0, +0x80,0xff,0xff,0xff,0x1f,0,0xff,0xff,0x07,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0x80,0xff,0xff,0x01,0xf0,0xff,0xff,0xff,0xc3,0x03, +0,0,0xfe,0xff,0,0,0x1f,0,0xe0,0xff,0x3f,0,0,0x80,0xff, +0xff,0xff,0x3f,0,0xff,0xff,0x07,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0xc0,0xff,0xff,0x01,0xfc,0xff,0xff,0xff,0xc1,0x03,0,0, +0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x01,0,0,0x80,0xff,0xff,0xff, +0x7f,0,0xff,0xff,0x0f,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0xc0,0xff,0xff,0x01,0xfc,0xff,0xff,0xff,0xc1,0x03,0,0,0xfe,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0x01,0,0,0x80,0xff,0xff,0xff,0x7f,0, +0xff,0xff,0x0f,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xe0, +0xff,0xff,0x01,0xff,0xff,0xff,0xff,0x80,0x03,0,0,0xfe,0xff,0xff,0xff, +0xff,0xff,0xff,0x07,0,0,0,0,0xfe,0xff,0xff,0xff,0x01,0xfe,0xff, +0x1f,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0xe0,0xff,0xff, +0x80,0xff,0xff,0xff,0x3f,0,0,0,0,0x7c,0,0,0xf5,0xff,0xff, +0x3f,0,0,0,0,0,0xfc,0xff,0xff,0xff,0x07,0xfe,0xff,0x1f,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0xe0,0xff,0x7f,0xf0,0xff, +0xff,0xff,0x0f,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0xf0,0xff,0xff,0xff,0x1f,0xfe,0xff,0x1f,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0xf0,0xff,0x7f,0xf8,0xff,0xff,0xff, +0x03,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0xc0,0xff,0xff,0xff,0x3f,0xfe,0xff,0x3f,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0xf0,0xff,0x7f,0xf8,0xff,0xff,0xff,0x03,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0xc0,0xff,0xff,0xff,0x3f,0xfe,0xff,0x3f,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0xf0,0xff,0xff,0xff,0xff,0xff,0x7f,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xff, +0xff,0xff,0xff,0xfc,0xff,0x3f,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0xf8,0xff,0xff,0xff,0xff,0xff,0x3f,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0xfc,0xff,0xff, +0xff,0xff,0xff,0x3f,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0xf8,0xff,0xff,0xff,0xff,0xff,0x0f,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0xf0,0xff,0xff,0xff,0xff, +0xff,0x3f,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0xfc,0xff, +0xff,0xff,0xff,0xff,0x03,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0xe0,0xff,0xff,0xff,0xff,0xff,0x7f, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0xfc,0xff,0xff,0xff, +0xff,0xff,0x03,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0xe0,0xff,0xff,0xff,0xff,0xff,0x7f,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0xfc,0xff,0xff,0xff,0xff,0xff, +0x01,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0x80,0xff,0xff,0xff,0xff,0xff,0x7f,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0xfc,0xff,0xff,0xff,0xff,0x7f,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0xfe,0xff,0xff,0xff,0xff,0xff,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0xfe,0xff,0xff,0xff,0xff,0x3f,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0xfc,0xff,0xff,0xff,0xff,0xff,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0xfe,0xff,0xff,0xff,0xff,0x07,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xf0, +0xff,0xff,0xff,0xff,0xff,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0xfe,0xff,0xff,0xff,0xff,0x07,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0xf0,0xff,0xff, +0xff,0xff,0xff,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xfe, +0xff,0xff,0xff,0xff,0x03,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0xe0,0xff,0xff,0xff,0xff, +0xff,0x01,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0xff,0xff,0xff, +0xff,0xff,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0x80,0xff,0xff,0xff,0xff,0xff,0x01, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0x80,0xff,0xff,0xff,0xff,0x3f, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0xfe,0xff,0xff,0xff,0xff,0x01,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0x80,0xff,0xff,0xff,0xff,0x1f,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0xf8,0xff,0xff,0xff,0xff,0x03,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0xc0,0xff,0xff,0xff,0xff,0x07,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0xf0,0xff,0xff,0xff,0xff,0x03,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0xc0,0xff,0xff,0xff,0xff,0x07,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0xf0,0xff,0xff,0xff,0xff,0x03,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0xc0,0xff,0xff,0xff,0xff,0x01,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xc0, +0xff,0xff,0xff,0xff,0x07,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xc0, +0xff,0xff,0xff,0xff,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0x80,0xff,0xff, +0xff,0xff,0x07,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0xe0,0xff,0xff, +0xff,0x1f,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0xff,0xff,0xff,0xff, +0x07,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0xe0,0xff,0xff,0xff,0x0f, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0xfc,0xff,0xff,0xff,0x0f,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0xe0,0xff,0xff,0xff,0x0f,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0xfc,0xff,0xff,0xff,0x0f,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0xf0,0xff,0xff,0xff,0x03,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0xf8,0xff,0xff,0xff,0x0f,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0xf0,0xff,0xff,0xff,0x01,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0xe0,0xff,0xff,0xff,0x0f,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0xf8,0xff,0xff,0x7f,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0xc0,0xff,0xff,0xff,0x0f,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0xf8,0xff,0xff,0x3f,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0xff,0xff,0xff,0x1f,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0xf8,0xff, +0xff,0x3f,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0xff,0xff, +0xff,0x1f,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0xf8,0xff,0xff,0x07, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0xfc,0xff,0xff,0x3f, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0xfc,0xff,0xff,0x03,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0xf8,0xff,0xff,0x3f,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0xfe,0xff,0xff,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0xe0,0xff,0xff,0x3f,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0xfe,0xff,0x3f,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0x80,0xff,0xff,0x3f,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0xfe,0xff,0x3f,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0x80,0xff,0xff,0x3f,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0xfe,0xff,0x0f,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0xfe,0xff,0x7f,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xff, +0xff,0x07,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0xfc,0xff,0x7f,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0xff,0xff,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0xf0,0xff, +0x7f,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0x80,0xff,0x3f,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0xc0,0xff,0x7f,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0x80,0xff,0x1f,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0x80,0xff,0xff,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0x80,0xff,0x1f,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0x80,0xff,0xff,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0xc0,0xff,0x03,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0xfe,0xff,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0xc0,0xff,0x01,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0xfc,0xff,0x01,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xc0, +0x7f,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0xf0,0xff,0x01,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0xe0,0x1f,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0xc0,0xff,0x01,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0xe0,0x1f,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0xc0,0xff, +0x01,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0xe0,0x0f,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0x80,0xff,0x01,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0xf0,0x03,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0xfe,0x03,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0x78,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0xf8,0x03,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0x18,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0xf0,0x03,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0x18,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0xf0,0x03,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0xc0,0x07,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0x07,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +}; diff --git a/hacks/flame.c b/hacks/flame.c new file mode 100755 index 00000000..3f98e3e3 --- /dev/null +++ b/hacks/flame.c @@ -0,0 +1,297 @@ +/* xscreensaver, Copyright (c) 1993, 1995 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. + */ + +/* This file was ported from xlock for use in xscreensaver (and standalone) + * by jwz on 18-Oct-93. Original copyright reads: + * + * static char sccsid[] = "@(#)flame.c 1.4 91/09/27 XLOCK"; + * + * flame.c - recursive fractal cosmic flames. + * + * Copyright (c) 1991 by Patrick J. Naughton. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation for any purpose and without fee is hereby granted, + * provided that the above copyright notice appear in all copies and that + * both that copyright notice and this permission notice appear in + * supporting documentation. + * + * This file is provided AS IS with no warranties of any kind. The author + * shall have no liability with respect to the infringement of copyrights, + * trade secrets or any patents by this file or any part thereof. In no + * event will the author be liable for any lost revenue or profits or + * other special, indirect and consequential damages. + * + * Comments and additions should be sent to the author: + * + * naughton@eng.sun.com + * + * Patrick J. Naughton + * MS 21-14 + * Sun Laboritories, Inc. + * 2550 Garcia Ave + * Mountain View, CA 94043 + * + * Revision History: + * 27-Jun-91: vary number of functions used. + * 24-Jun-91: fixed portability problem with integer mod (%). + * 06-Jun-91: Written. (received from Scott Graves, spot@cs.cmu.edu). + */ + +#include "screenhack.h" + +#define POINT_BUFFER_SIZE 10 +#define MAXLEV 4 + +static double f[2][3][MAXLEV]; /* three non-homogeneous transforms */ +static int max_total; +static int max_levels; +static int max_points; +static int cur_level; +static int snum; +static int anum; +static int num_points; +static int total_points; +static int pixcol; +static int npixels; +static unsigned long *pixels; +static XPoint points [POINT_BUFFER_SIZE]; +static GC gc; + +static int delay, delay2; +static int width, height; + +static short +halfrandom (mv) + int mv; +{ + static short lasthalf = 0; + unsigned long r; + + if (lasthalf) + { + r = lasthalf; + lasthalf = 0; + } + else + { + r = random (); + lasthalf = r >> 16; + } + return (r % mv); +} + + +static void +init_flame (dpy, window) + Display *dpy; + Window window; +{ + XGCValues gcv; + XWindowAttributes xgwa; + Colormap cmap; + XGetWindowAttributes (dpy, window, &xgwa); + width = xgwa.width; + height = xgwa.height; + cmap = xgwa.colormap; + + max_points = get_integer_resource ("iterations", "Integer"); + if (max_points <= 0) max_points = 100; + + max_levels = max_points; + + max_total = get_integer_resource ("points", "Integer"); + if (max_total <= 0) max_total = 10000; + + delay = get_integer_resource ("delay", "Integer"); + if (delay < 0) delay = 0; + delay2 = get_integer_resource ("delay2", "Integer"); + if (delay2 < 0) delay2 = 0; + + if (mono_p) + npixels = 0; + else + { + int i = get_integer_resource ("ncolors", "Integer"); + double saturation = 1.0; + double value = 1.0; + XColor color; + if (i <= 0) i = 128; + + pixels = (unsigned long *) malloc ((i+1) * sizeof (*pixels)); + for (npixels = 0; npixels < i; npixels++) + { + hsv_to_rgb ((360*npixels)/i, saturation, value, + &color.red, &color.green, &color.blue); + if (! XAllocColor (dpy, cmap, &color)) + break; + pixels [npixels] = color.pixel; + } + } + + gcv.foreground = get_pixel_resource ("foreground", "Foreground", dpy, cmap); + gcv.background = get_pixel_resource ("background", "Background", dpy, cmap); + + if (! mono_p) + { + pixcol = halfrandom (npixels); + gcv.foreground = (pixels [pixcol]); + } + + gc = XCreateGC (dpy, window, GCForeground | GCBackground, &gcv); +} + +static int +recurse (x, y, l, dpy, win) + register double x, y; + register int l; + Display *dpy; + Window win; +{ + int xp, yp, i; + double nx, ny; + + if (l == max_levels) + { + total_points++; + if (total_points > max_total) /* how long each fractal runs */ + return 0; + + if (x > -1.0 && x < 1.0 && y > -1.0 && y < 1.0) + { + xp = points[num_points].x = (int) ((width / 2) * (x + 1.0)); + yp = points[num_points].y = (int) ((height / 2) * (y + 1.0)); + num_points++; + if (num_points >= POINT_BUFFER_SIZE) + { + XDrawPoints (dpy, win, gc, points, num_points, CoordModeOrigin); + num_points = 0; + /* if (delay) usleep (delay); */ + /* XSync (dpy, True); */ + } + } + } + else + { + for (i = 0; i < snum; i++) + { + nx = f[0][0][i] * x + f[0][1][i] * y + f[0][2][i]; + ny = f[1][0][i] * x + f[1][1][i] * y + f[1][2][i]; + if (i < anum) + { + nx = sin(nx); + ny = sin(ny); + } + if (!recurse (nx, ny, l + 1, dpy, win)) + return 0; + } + } + return 1; +} + + +static void +flame (dpy, window) + Display *dpy; + Window window; +{ + int i, j, k; + static int alt = 0; + + if (!(cur_level++ % max_levels)) + { + if (delay2) usleep (delay2); + XClearWindow (dpy, window); + alt = !alt; + } + else + { + if (npixels > 2) + { + XSetForeground (dpy, gc, pixels [pixcol]); + if (--pixcol < 0) + pixcol = npixels - 1; + } + } + + /* number of functions */ + snum = 2 + (cur_level % (MAXLEV - 1)); + + /* how many of them are of alternate form */ + if (alt) + anum = 0; + else + anum = halfrandom (snum) + 2; + + /* 6 coefs per function */ + for (k = 0; k < snum; k++) + { + for (i = 0; i < 2; i++) + for (j = 0; j < 3; j++) + f[i][j][k] = ((double) (random() & 1023) / 512.0 - 1.0); + } + num_points = 0; + total_points = 0; + (void) recurse (0.0, 0.0, 0, dpy, window); + XDrawPoints (dpy, window, gc, points, num_points, CoordModeOrigin); + XSync (dpy, True); + if (delay) usleep (delay); +} + + +#ifdef __hpux +/* I don't understand why this is necessary, but I'm told that this program + does nothing at all on HP-sUX without it. + */ +#undef random +#undef srandom +#include +int matherr(x) + register struct exception *x; +{ + if (x->type == PLOSS) return 1; + else return 0; +} +#endif /* __hpux */ + + + +char *progclass = "Flame"; + +char *defaults [] = { + "Flame.background: black", /* to placate SGI */ + "Flame.foreground: white", + "*colors: 128", + "*iterations: 25", + "*delay: 50000", + "*delay2: 2000000", + "*points: 10000", + 0 +}; + +XrmOptionDescRec options [] = { + { "-ncolors", ".colors", XrmoptionSepArg, 0 }, + { "-iterations", ".iterations", XrmoptionSepArg, 0 }, + { "-delay", ".delay", XrmoptionSepArg, 0 }, + { "-delay2", ".delay2", XrmoptionSepArg, 0 }, + { "-points", ".points", XrmoptionSepArg, 0 } +}; +int options_size = (sizeof (options) / sizeof (options[0])); + +void +screenhack (dpy, window) + Display *dpy; + Window window; +{ + init_flame (dpy, window); + while (1) + flame (dpy, window); +} diff --git a/hacks/flame.exe_axp b/hacks/flame.exe_axp new file mode 100755 index 0000000000000000000000000000000000000000..0b9b5fa39e2546d7277164caec009b2f80d69d25 GIT binary patch literal 32768 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 G&;J62jJ3f4 literal 0 HcmV?d00001 diff --git a/hacks/flame.exe_vax b/hacks/flame.exe_vax new file mode 100755 index 0000000000000000000000000000000000000000..274e8d3f72312f635af153f72a1124f61d5d9d97 GIT binary patch literal 17408 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 UJQ2Mvjj+*?5pr5c@!9_V4{QhhcmMzZ literal 0 HcmV?d00001 diff --git a/hacks/flame.hlp b/hacks/flame.hlp new file mode 100755 index 00000000..17fa1b83 --- /dev/null +++ b/hacks/flame.hlp @@ -0,0 +1,73 @@ +1 FLAME +Draw weird cosmic fractals + +SYNOPSIS + + $ flame [-display host:display.screen] [-foreground color] + [-background color] [-window] [-root] [-mono] [-install] + [-visual visual] [-ncolors integer] [-iterations integer] + [-points integer] [-delay microseconds] [-delay2 microseconds] + +2 DESCRIPTION +The flame program generates colorful fractal displays. + +2 OPTIONS +Flame accepts the following options: + + -window +Draw on a newly-created window. This is the default. + + -root +Draw on the root window. + + -mono +If on a color display, pretend we're on a monochrome display. + + -install +Install a private colormap for the window. + + -visual visual +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. + + -ncolors integer +How many colors should be used (if possible). Default 128. +The colors used cycle through the hue, making N stops around +the color wheel. + + -iterations integer +How many fractals to generate. Default 25. + + -points integer +How many pixels to draw for each fractal. Default 10000. + + -delay microseconds +How long we should wait between drawing each fractal. Default 50000, +or about 1/20th second. + + -delay2 microseconds +How long we should wait before clearing the screen when each run ends. +Default 2000000, or two seconds. + +2 ENVIRONMENT + DISPLAY +to get the default host and display number. + + XENVIRONMENT +to get the name of a resource file that overrides the global resources +stored in the RESOURCE_MANAGER property. + +2 COPYRIGHT +Copyright (c) 1991 by Patrick J. Naughton + +Permission to use, copy, modify, and distribute this software and its +documentation for any purpose and without fee is hereby granted, +provided that the above copyright notice appear in all copies and that +both that copyright notice and this permission notice appear in +supporting documentation. + +2 AUTHOR +Scott Graves , 06-Jun-91.n + +Ability to run standalone or with xscreensaver added by +Jamie Zawinski , 18-Oct-93. diff --git a/hacks/flame.man b/hacks/flame.man new file mode 100755 index 00000000..e5326818 --- /dev/null +++ b/hacks/flame.man @@ -0,0 +1,72 @@ +.TH XScreenSaver 1 "13-aug-92" "X Version 11" +.SH NAME +flame - draw weird cosmic fractals +.SH SYNOPSIS +.B flame +[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP] [\-background \fIcolor\fP] [\-window] [\-root] [\-mono] [\-install] [\-visual \fIvisual\fP] [\-ncolors \fIinteger\fP] [\-iterations \fIinteger\fP] [\-points \fIinteger\fP] [\-delay \fImicroseconds\fP] [\-delay2 \fImicroseconds\fP] +.SH DESCRIPTION +The \fIflame\fP program generates colorful fractal displays. +.SH OPTIONS +.I flame +accepts the following options: +.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 \-mono +If on a color display, pretend we're on a monochrome display. +.TP 8 +.B \-install +Install a private colormap for the window. +.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 \-ncolors \fIinteger\fP +How many colors should be used (if possible). Default 128. +The colors used cycle through the hue, making N stops around +the color wheel. +.TP 8 +.B \-iterations \fIinteger\fP +How many fractals to generate. Default 25. +.TP 8 +.B \-points \fIinteger\fP +How many pixels to draw for each fractal. Default 10000. +.TP 8 +.B \-delay \fImicroseconds\fP +How long we should wait between drawing each fractal. Default 50000, +or about 1/20th second. +.TP 8 +.B \-delay2 \fImicroseconds\fP +How long we should wait before clearing the screen when each run ends. +Default 2000000, or two seconds. +.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. +.SH SEE ALSO +.BR X (1), +.BR xscreensaver (1), +.BR xlock (1) +.SH COPYRIGHT +Copyright \(co 1991 by Patrick J. Naughton + +Permission to use, copy, modify, and distribute this software and its +documentation for any purpose and without fee is hereby granted, +provided that the above copyright notice appear in all copies and that +both that copyright notice and this permission notice appear in +supporting documentation. +.SH AUTHOR +Scott Graves , 06-Jun-91.n + +Ability to run standalone or with \fIxscreensaver\fP added by +Jamie Zawinski , 18-Oct-93. diff --git a/hacks/greynetic.c b/hacks/greynetic.c new file mode 100755 index 00000000..e1a618c3 --- /dev/null +++ b/hacks/greynetic.c @@ -0,0 +1,182 @@ +/* xscreensaver, Copyright (c) 1992, 1995 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. + */ + +#include "screenhack.h" + +#define NBITS 12 + +#ifndef VMS +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#else +#include "sys$common:[decw$include.bitmaps]stipple.xbm" +#include "sys$common:[decw$include.bitmaps]cross_weave.xbm" +#include "sys$common:[decw$include.bitmaps]dimple1.xbm" +#include "sys$common:[decw$include.bitmaps]dimple3.xbm" +#include "sys$common:[decw$include.bitmaps]flipped_gray.xbm" +#include "sys$common:[decw$include.bitmaps]gray1.xbm" +#include "sys$common:[decw$include.bitmaps]gray3.xbm" +#include "sys$common:[decw$include.bitmaps]hlines2.xbm" +#include "sys$common:[decw$include.bitmaps]light_gray.xbm" +#include "sys$common:[decw$include.bitmaps]root_weave.xbm" +#include "sys$common:[decw$include.bitmaps]vlines2.xbm" +#include "sys$common:[decw$include.bitmaps]vlines3.xbm" +#endif + + +static Pixmap pixmaps [NBITS]; +static GC gc; +static int delay; +static unsigned long fg, bg, pixels [512]; +static int npixels; + +static void +init_greynetic (dpy, window) + Display *dpy; + Window window; +{ + int i; + XGCValues gcv; + XWindowAttributes xgwa; + Colormap cmap; + XGetWindowAttributes (dpy, window, &xgwa); + cmap = xgwa.colormap; + npixels = 0; + gcv.foreground= fg= get_pixel_resource("foreground","Foreground", dpy, cmap); + gcv.background= bg= get_pixel_resource("background","Background", dpy, cmap); + gcv.fill_style= FillOpaqueStippled; + gc = XCreateGC (dpy, window, GCForeground|GCBackground|GCFillStyle, &gcv); + + delay = get_integer_resource ("delay", "Integer"); + if (delay < 0) delay = 0; + + i = 0; +#define BITS(n,w,h) \ + pixmaps [i++] = XCreatePixmapFromBitmapData (dpy, window, n, w, h, 1, 0, 1) + + BITS (stipple_bits, stipple_width, stipple_height); + BITS (cross_weave_bits, cross_weave_width, cross_weave_height); + BITS (dimple1_bits, dimple1_width, dimple1_height); + BITS (dimple3_bits, dimple3_width, dimple3_height); + BITS (flipped_gray_bits, flipped_gray_width, flipped_gray_height); + BITS (gray1_bits, gray1_width, gray1_height); + BITS (gray3_bits, gray3_width, gray3_height); + BITS (hlines2_bits, hlines2_width, hlines2_height); + BITS (light_gray_bits, light_gray_width, light_gray_height); + BITS (root_weave_bits, root_weave_width, root_weave_height); + BITS (vlines2_bits, vlines2_width, vlines2_height); + BITS (vlines3_bits, vlines3_width, vlines3_height); +} + +static void +greynetic (dpy, window) + Display *dpy; + Window window; +{ + static int tick = 500, xlim, ylim; + static Colormap cmap; + int x, y, w, h, i; + XGCValues gcv; + if (tick++ == 500) + { + XWindowAttributes xgwa; + XGetWindowAttributes (dpy, window, &xgwa); + tick = 0; + xlim = xgwa.width; + ylim = xgwa.height; + cmap = xgwa.colormap; + } + for (i = 0; i < 10; i++) /* minimize area, but don't try too hard */ + { + w = 50 + random () % (xlim - 50); + h = 50 + random () % (ylim - 50); + if (w + h < xlim && w + h < ylim) + break; + } + x = random () % (xlim - w); + y = random () % (ylim - h); + gcv.stipple = pixmaps [random () % NBITS]; + if (mono_p) + { + if (random () & 1) + gcv.foreground = fg, gcv.background = bg; + else + gcv.foreground = bg, gcv.background = fg; + } + else + { + XColor fgc, bgc; + if (npixels == sizeof (pixels) / sizeof (unsigned long)) + goto REUSE; + fgc.flags = bgc.flags = DoRed|DoGreen|DoBlue; + fgc.red = random (); + fgc.green = random (); + fgc.blue = random (); + bgc.red = random (); + bgc.green = random (); + bgc.blue = random (); + if (! XAllocColor (dpy, cmap, &fgc)) + goto REUSE; + pixels [npixels++] = fgc.pixel; + gcv.foreground = fgc.pixel; + if (! XAllocColor (dpy, cmap, &bgc)) + goto REUSE; + pixels [npixels++] = bgc.pixel; + gcv.background = bgc.pixel; + goto DONE; + REUSE: + gcv.foreground = pixels [random () % npixels]; + gcv.background = pixels [random () % npixels]; + DONE: + ; + } + XChangeGC (dpy, gc, GCStipple|GCForeground|GCBackground, &gcv); + XFillRectangle (dpy, window, gc, x, y, w, h); + XSync (dpy, True); +} + + +char *progclass = "Greynetic"; + +char *defaults [] = { + "Greynetic.background: black", /* to placate SGI */ + "Greynetic.foreground: white", + "*delay: 0", + 0 +}; + +XrmOptionDescRec options [] = { + { "-delay", ".delay", XrmoptionSepArg, 0 } +}; +int options_size = (sizeof (options) / sizeof (options[0])); + +void +screenhack (dpy, window) + Display *dpy; + Window window; +{ + init_greynetic (dpy, window); + while (1) + { + greynetic (dpy, window); + if (delay) usleep (delay); + } +} diff --git a/hacks/greynetic.c_ori b/hacks/greynetic.c_ori new file mode 100755 index 00000000..4dd3f172 --- /dev/null +++ b/hacks/greynetic.c_ori @@ -0,0 +1,166 @@ +/* xscreensaver, Copyright (c) 1992, 1995 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. + */ + +#include "screenhack.h" + +#define NBITS 12 + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +static Pixmap pixmaps [NBITS]; +static GC gc; +static int delay; +static unsigned long fg, bg, pixels [512]; +static int npixels; + +static void +init_greynetic (dpy, window) + Display *dpy; + Window window; +{ + int i; + XGCValues gcv; + XWindowAttributes xgwa; + Colormap cmap; + XGetWindowAttributes (dpy, window, &xgwa); + cmap = xgwa.colormap; + npixels = 0; + gcv.foreground= fg= get_pixel_resource("foreground","Foreground", dpy, cmap); + gcv.background= bg= get_pixel_resource("background","Background", dpy, cmap); + gcv.fill_style= FillOpaqueStippled; + gc = XCreateGC (dpy, window, GCForeground|GCBackground|GCFillStyle, &gcv); + + delay = get_integer_resource ("delay", "Integer"); + if (delay < 0) delay = 0; + + i = 0; +#define BITS(n,w,h) \ + pixmaps [i++] = XCreatePixmapFromBitmapData (dpy, window, n, w, h, 1, 0, 1) + + BITS (stipple_bits, stipple_width, stipple_height); + BITS (cross_weave_bits, cross_weave_width, cross_weave_height); + BITS (dimple1_bits, dimple1_width, dimple1_height); + BITS (dimple3_bits, dimple3_width, dimple3_height); + BITS (flipped_gray_bits, flipped_gray_width, flipped_gray_height); + BITS (gray1_bits, gray1_width, gray1_height); + BITS (gray3_bits, gray3_width, gray3_height); + BITS (hlines2_bits, hlines2_width, hlines2_height); + BITS (light_gray_bits, light_gray_width, light_gray_height); + BITS (root_weave_bits, root_weave_width, root_weave_height); + BITS (vlines2_bits, vlines2_width, vlines2_height); + BITS (vlines3_bits, vlines3_width, vlines3_height); +} + +static void +greynetic (dpy, window) + Display *dpy; + Window window; +{ + static int tick = 500, xlim, ylim; + static Colormap cmap; + int x, y, w, h, i; + XGCValues gcv; + if (tick++ == 500) + { + XWindowAttributes xgwa; + XGetWindowAttributes (dpy, window, &xgwa); + tick = 0; + xlim = xgwa.width; + ylim = xgwa.height; + cmap = xgwa.colormap; + } + for (i = 0; i < 10; i++) /* minimize area, but don't try too hard */ + { + w = 50 + random () % (xlim - 50); + h = 50 + random () % (ylim - 50); + if (w + h < xlim && w + h < ylim) + break; + } + x = random () % (xlim - w); + y = random () % (ylim - h); + gcv.stipple = pixmaps [random () % NBITS]; + if (mono_p) + { + if (random () & 1) + gcv.foreground = fg, gcv.background = bg; + else + gcv.foreground = bg, gcv.background = fg; + } + else + { + XColor fgc, bgc; + if (npixels == sizeof (pixels) / sizeof (unsigned long)) + goto REUSE; + fgc.flags = bgc.flags = DoRed|DoGreen|DoBlue; + fgc.red = random (); + fgc.green = random (); + fgc.blue = random (); + bgc.red = random (); + bgc.green = random (); + bgc.blue = random (); + if (! XAllocColor (dpy, cmap, &fgc)) + goto REUSE; + pixels [npixels++] = fgc.pixel; + gcv.foreground = fgc.pixel; + if (! XAllocColor (dpy, cmap, &bgc)) + goto REUSE; + pixels [npixels++] = bgc.pixel; + gcv.background = bgc.pixel; + goto DONE; + REUSE: + gcv.foreground = pixels [random () % npixels]; + gcv.background = pixels [random () % npixels]; + DONE: + ; + } + XChangeGC (dpy, gc, GCStipple|GCForeground|GCBackground, &gcv); + XFillRectangle (dpy, window, gc, x, y, w, h); + XSync (dpy, True); +} + + +char *progclass = "Greynetic"; + +char *defaults [] = { + "Greynetic.background: black", /* to placate SGI */ + "Greynetic.foreground: white", + "*delay: 0", + 0 +}; + +XrmOptionDescRec options [] = { + { "-delay", ".delay", XrmoptionSepArg, 0 } +}; +int options_size = (sizeof (options) / sizeof (options[0])); + +void +screenhack (dpy, window) + Display *dpy; + Window window; +{ + init_greynetic (dpy, window); + while (1) + { + greynetic (dpy, window); + if (delay) usleep (delay); + } +} diff --git a/hacks/greynetic.exe_axp b/hacks/greynetic.exe_axp new file mode 100755 index 0000000000000000000000000000000000000000..dddb21ea63cbf6c1dd5c753296259ed12f96522f GIT binary patch literal 28672 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 literal 0 HcmV?d00001 diff --git a/hacks/greynetic.hlp b/hacks/greynetic.hlp new file mode 100755 index 00000000..6606b582 --- /dev/null +++ b/hacks/greynetic.hlp @@ -0,0 +1,52 @@ +1 GREYNETIC +Draw random stippled/color rectangles +SYNOPSIS + + $ greynetic [-display host:display.screen] [-foreground color] + [-background color] [-window] [-root] [-mono] [-install] + [-visual visual] [-delay usecs] + +2 DESCRIPTION +The greynetic program draws random rectangles. + +2 OPTIONS +Greynetic accepts the following options: + + -window +Draw on a newly-created window. This is the default. + + -root +Draw on the root window. + + -mono +If on a color display, pretend we're on a monochrome display. + + -install +Install a private colormap for the window. + + -visual visual +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. + + -delay microseconds +Slow it down. + +2 ENVIRONMENT + DISPLAY +to get the default host and display number. + + XENVIRONMENT +to get the name of a resource file that overrides the global resources +stored in the RESOURCE_MANAGER property. + +2 COPYRIGHT +Copyright (c) 1992 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. + +2 AUTHOR +Jamie Zawinski , 13-aug-92. diff --git a/hacks/greynetic.man b/hacks/greynetic.man new file mode 100755 index 00000000..86381123 --- /dev/null +++ b/hacks/greynetic.man @@ -0,0 +1,52 @@ +.TH XScreenSaver 1 "13-aug-92" "X Version 11" +.SH NAME +greynetic - draw random stippled/color rectangles +.SH SYNOPSIS +.B greynetic +[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP] [\-background \fIcolor\fP] [\-window] [\-root] [\-mono] [\-install] [\-visual \fIvisual\fP] [\-delay \fIusecs\fP] +.SH DESCRIPTION +The \fIgreynetic\fP program draws random rectangles. +.SH OPTIONS +.I greynetic +accepts the following options: +.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 \-mono +If on a color display, pretend we're on a monochrome display. +.TP 8 +.B \-install +Install a private colormap for the window. +.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 \-delay \fImicroseconds\fP +Slow it down. +.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. +.SH SEE ALSO +.BR X (1), +.BR xscreensaver (1) +.SH COPYRIGHT +Copyright \(co 1992 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 , 13-aug-92. diff --git a/hacks/halo.c b/hacks/halo.c new file mode 100755 index 00000000..d61e2ac3 --- /dev/null +++ b/hacks/halo.c @@ -0,0 +1,379 @@ +/* xscreensaver, Copyright (c) 1993, 1995 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. + */ + +/* I wanted to lay down new circles with TV:ALU-ADD instead of TV:ALU-XOR, + but X doesn't support arithmetic combinations of pixmaps!! What losers. + I suppose I could crank out the 2's compliment math by hand, but that's + a real drag... + + This would probably look good with shapes other than circles as well. + + */ + +#include "screenhack.h" +#include + +struct circle { + int x, y, radius; + int increment; + int dx, dy; +}; + +static enum color_mode { + seuss_mode, ramp_mode, random_mode +} cmode; + + +static struct circle *circles; +static int count, global_count; +static Pixmap pixmap, buffer; +static int width, height, global_inc; +static int delay; +static unsigned long fg_pixel, bg_pixel; +static XColor fgc, bgc; +static GC draw_gc, erase_gc, copy_gc, merge_gc; +static Bool anim_p; +static Colormap cmap; + +#define min(x,y) ((x)<(y)?(x):(y)) +#define max(x,y) ((x)>(y)?(x):(y)) + +static void +init_circles_1 (dpy, window) + Display *dpy; + Window window; +{ + int i; + count = (global_count ? global_count + : (3 + (random () % max (1, (min (width, height) / 50))) + + (random () % max (1, (min (width, height) / 50))))); + circles = (struct circle *) malloc (count * sizeof (struct circle)); + for (i = 0; i < count; i++) + { + circles [i].x = 10 + random () % (width - 20); + circles [i].y = 10 + random () % (height - 20); + if (global_inc) + circles [i].increment = global_inc; + else + { /* prefer smaller increments to larger ones */ + int j = 8; + int inc = ((random()%j) + (random()%j) + (random()%j)) - ((j*3)/2); + if (inc < 0) inc = -inc + 3; + circles [i].increment = inc + 3; + } + circles [i].radius = random () % circles [i].increment; + circles [i].dx = ((random () % 3) - 1) * (1 + random () % 5); + circles [i].dy = ((random () % 3) - 1) * (1 + random () % 5); + } +} + +static void +init_circles (dpy, window) + Display *dpy; + Window window; +{ + XGCValues gcv; + XWindowAttributes xgwa; + char *mode_str = 0; + XGetWindowAttributes (dpy, window, &xgwa); + cmap = xgwa.colormap; + global_count = get_integer_resource ("count", "Integer"); + if (global_count < 0) global_count = 0; + global_inc = get_integer_resource ("increment", "Integer"); + if (global_inc < 0) global_inc = 0; + anim_p = get_boolean_resource ("animate", "Boolean"); + delay = get_integer_resource ("delay", "Integer"); + mode_str = get_string_resource ("colorMode", "ColorMode"); + if (! mode_str) cmode = random_mode; + else if (!strcmp (mode_str, "seuss")) cmode = seuss_mode; + else if (!strcmp (mode_str, "ramp")) cmode = ramp_mode; + else if (!strcmp (mode_str, "random")) cmode = random_mode; + else { + fprintf (stderr, + "%s: colorMode must be seuss, ramp, or random, not \"%s\"\n", + progname, mode_str); + exit (1); + } + + if (mono_p) cmode = seuss_mode; + if (cmode == random_mode) + cmode = ((random()&3) == 1) ? ramp_mode : seuss_mode; + + if (cmode == ramp_mode) + anim_p = False; /* This combo doesn't work right... */ + + if (mono_p) + { + fg_pixel = get_pixel_resource ("foreground","Foreground", dpy, cmap); + bg_pixel = get_pixel_resource ("background","Background", dpy, cmap); + } + else + { + int r = random() % 360; + int r2 = (random() % 180) + 45; + double fs, bs; + if (cmode == seuss_mode) + fs = 0.5, bs = 1.0; + else + fs = 1.0, bs = 0.1; + hsv_to_rgb (r, fs, 1.0, &fgc.red, &fgc.green, &fgc.blue); + hsv_to_rgb ((r+r2)%360, bs, 0.7, &bgc.red, &bgc.green, &bgc.blue); + XAllocColor (dpy, cmap, &fgc); + XAllocColor (dpy, cmap, &bgc); + fg_pixel = fgc.pixel; + bg_pixel = bgc.pixel; + } + + width = max (50, xgwa.width); + height = max (50, xgwa.height); + +#ifdef DEBUG + width/=2; height/=2; +#endif + + pixmap = XCreatePixmap (dpy, window, width, height, 1); + if (cmode == seuss_mode) + buffer = XCreatePixmap (dpy, window, width, height, 1); + else + buffer = 0; + + gcv.foreground = 1; + gcv.background = 0; + draw_gc = XCreateGC (dpy, pixmap, GCForeground | GCBackground, &gcv); + gcv.foreground = 0; + erase_gc = XCreateGC (dpy, pixmap, GCForeground, &gcv); + gcv.foreground = fg_pixel; + gcv.background = bg_pixel; + copy_gc = XCreateGC (dpy, window, GCForeground | GCBackground, &gcv); + + if (cmode == seuss_mode) + { + gcv.foreground = 1; + gcv.background = 0; + gcv.function = GXxor; + merge_gc = XCreateGC (dpy, pixmap, + GCForeground | GCBackground | GCFunction, &gcv); + } + else + { + gcv.foreground = fg_pixel; + gcv.background = bg_pixel; + gcv.function = GXcopy; + merge_gc = XCreateGC (dpy, window, + GCForeground | GCBackground | GCFunction, &gcv); + } + + init_circles_1 (dpy, window); + XClearWindow (dpy, window); + if (buffer) XFillRectangle (dpy, buffer, erase_gc, 0, 0, width, height); +} + +static void +run_circles (dpy, window) + Display *dpy; + Window window; +{ + int i; + static int iterations = 0; + static int oiterations = 0; + static Bool first_time_p = True; + Bool done = False; + Bool inhibit_sleep = False; + XFillRectangle (dpy, pixmap, erase_gc, 0, 0, width, height); + for (i = 0; i < count; i++) + { + int radius = circles [i].radius; + int inc = circles [i].increment; + if (! (iterations & 1)) + ; + else if (radius == 0) + ; + else if (radius < 0) + done = True; + else + { + /* Probably there's a simpler way to ask the musical question, + "is this square completely enclosed by this circle," but I've + forgotten too much trig to know it... (That's not really the + right question anyway, but the right question is too hard.) */ + double x1 = ((double) (-circles [i].x)) / ((double) radius); + double y1 = ((double) (-circles [i].y)) / ((double) radius); + double x2 = ((double) (width - circles [i].x)) / ((double) radius); + double y2 = ((double) (height - circles [i].y)) / ((double) radius); + x1 *= x1; x2 *= x2; y1 *= y1; y2 *= y2; + if ((x1 + y1) < 1 && (x2 + y2) < 1 && (x1 + y2) < 1 && (x2 + y1) < 1) + done = True; + } + if (radius > 0 && + (cmode == seuss_mode || circles [0].increment < 0)) + XFillArc (dpy, + (cmode == seuss_mode ? pixmap : window), + (cmode == seuss_mode ? draw_gc : merge_gc), + circles [i].x - radius, circles [i].y - radius, + radius * 2, radius * 2, 0, 360*64); + circles [i].radius += inc; + } + + if (anim_p && !first_time_p) + inhibit_sleep = !done; + + if (done) + { + if (anim_p) + { + first_time_p = False; + for (i = 0; i < count; i++) + { + circles [i].x += circles [i].dx; + circles [i].y += circles [i].dy; + circles [i].radius %= circles [i].increment; + if (circles [i].x < 0 || circles [i].x >= width) + { + circles [i].dx = -circles [i].dx; + circles [i].x += (2 * circles [i].dx); + } + if (circles [i].y < 0 || circles [i].y >= height) + { + circles [i].dy = -circles [i].dy; + circles [i].y += (2 * circles [i].dy); + } + } + } + else if (circles [0].increment < 0) + { + free (circles); + init_circles_1 (dpy, window); + if (! mono_p) + { + XColor d1, d2; + cycle_hue (&fgc, 10); + cycle_hue (&bgc, 10); + XFreeColors (dpy, cmap, &fgc.pixel, 1, 0); + XFreeColors (dpy, cmap, &bgc.pixel, 1, 0); + d1 = fgc; + d2 = bgc; + XAllocColor (dpy, cmap, &fgc); + XAllocColor (dpy, cmap, &bgc); + fgc.red = d1.red; fgc.green = d1.green; fgc.blue = d1.blue; + bgc.red = d2.red; bgc.green = d2.green; bgc.blue = d2.blue; + XSetForeground (dpy, copy_gc, fgc.pixel); + XSetBackground (dpy, copy_gc, bgc.pixel); + } + } +#if 0 + else if ((random () % 2) == 0) + { + iterations = 0; /* ick */ + for (i = 0; i < count; i++) + circles [i].radius %= circles [i].increment; + } +#endif + else + { + oiterations = iterations; + for (i = 0; i < count; i++) + { + circles [i].increment = -circles [i].increment; + circles [i].radius += (2 * circles [i].increment); + } + } + } + + if (buffer) + XCopyPlane (dpy, pixmap, buffer, merge_gc, 0, 0, width, height, 0, 0, 1); + else if (cmode != seuss_mode) + { + static int ncolors = 0; + static XColor *colors = 0; + if (circles [0].increment >= 0) + inhibit_sleep = True; + else if (done) + { + int fgh, bgh; + double fgs, fgv, bgs, bgv; + if (colors) + for (i = 0; i < ncolors; i++) + XFreeColors (dpy, cmap, &colors [i].pixel, 1, 0); + + rgb_to_hsv (fgc.red, fgc.green, fgc.blue, &fgh, &fgs, &fgv); + rgb_to_hsv (bgc.red, bgc.green, bgc.blue, &bgh, &bgs, &bgv); + ncolors = oiterations; + colors = ((XColor *) + (colors + ? realloc (colors, sizeof (XColor) * ncolors) + : malloc (sizeof (XColor) * ncolors))); + + make_color_ramp (bgh, bgs, bgv, fgh, fgs, fgv, colors, ncolors); + for (i = 0; i < ncolors; i++) + XAllocColor (dpy, cmap, &colors [i]); + XSetForeground (dpy, merge_gc, colors [0].pixel); + } + else + { + XSetForeground (dpy, merge_gc, colors [iterations].pixel); + } + } + else + XCopyPlane (dpy, pixmap, window, merge_gc, 0, 0, width, height, 0, 0, 1); + + if (buffer && (anim_p + ? (done || (first_time_p && (iterations & 1))) + : (iterations & 1))) + { + XCopyPlane (dpy, buffer, window, copy_gc, 0, 0, width, height, 0, 0, 1); + XSync (dpy, True); + if (anim_p && done) + XFillRectangle (dpy, buffer, erase_gc, 0, 0, width, height); + } +#ifdef DEBUG + XCopyPlane (dpy, pixmap, window, copy_gc, 0,0,width,height,width,height, 1); + if (buffer) + XCopyPlane (dpy, buffer, window, copy_gc, 0,0,width,height,0,height, 1); + XSync (dpy, True); +#endif + + if (done) + iterations = 0; + else + iterations++; + + if (delay && !inhibit_sleep) usleep (delay); +} + + +char *progclass = "Halo"; + +char *defaults [] = { + "Halo.background: black", /* to placate SGI */ + "Halo.foreground: white", + "*colorMode: random", + "*count: 0", + "*delay: 100000", + 0 +}; + +XrmOptionDescRec options [] = { + { "-count", ".count", XrmoptionSepArg, 0 }, + { "-delay", ".delay", XrmoptionSepArg, 0 }, + { "-animate", ".animate", XrmoptionNoArg, "True" }, + { "-mode", ".colorMode", XrmoptionSepArg, 0 } +}; +int options_size = (sizeof (options) / sizeof (options[0])); + +void +screenhack (dpy, window) + Display *dpy; + Window window; +{ + init_circles (dpy, window); + while (1) + run_circles (dpy, window); +} diff --git a/hacks/halo.exe_axp b/hacks/halo.exe_axp new file mode 100755 index 0000000000000000000000000000000000000000..67d5204ed71681717b4fb56622fa530d5e39423c GIT binary patch literal 35328 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 literal 0 HcmV?d00001 diff --git a/hacks/halo.exe_vax b/hacks/halo.exe_vax new file mode 100755 index 0000000000000000000000000000000000000000..a2415fb0818facbb4bf992d6debdfdfbb048e6da GIT binary patch literal 19456 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 AZU6uP literal 0 HcmV?d00001 diff --git a/hacks/halo.hlp b/hacks/halo.hlp new file mode 100755 index 00000000..cadc10e8 --- /dev/null +++ b/hacks/halo.hlp @@ -0,0 +1,70 @@ +1 HALO +Draw circular patterns + +SYNOPSIS + + $ halo [-display host:display.screen] [-foreground color] + [-background color] [-window] [-root] [-mono] [-install] + [-visual visual] [-count int] [-delay usecs] + [-mode seuss | ramp | random ] [-animate] + +2 DESCRIPTION +The halo program draws cool patterns based on circles. + +2 OPTIONS +Halo accepts the following options: + + -window +Draw on a newly-created window. This is the default. + + -root +Draw on the root window. + + -mono +If on a color display, pretend we're on a monochrome display. + + -install +Install a private colormap for the window. + + -visual visual +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. + + -count integer +How many circles to draw. Default 0, meaning random. + + -mode "seuss | ramp | random" +In seuss mode, alternating striped curves will be drawn. + +In ramp mode, a color ramp will be drawn. + +random means pick the mode randomly. + + -delay microseconds +How much of a delay should be introduced between steps of the animation. +Default 100000, or about 0.1 second. + + -animate +If specified, then the centerpoints of the circles will bounce around. +Otherwise, the circles will be drawn once, erased, and a new set of +circles will be drawn. + +2 ENVIRONMENT + DISPLAY +to get the default host and display number. + + XENVIRONMENT +to get the name of a resource file that overrides the global resources +stored in the RESOURCE_MANAGER property. + +2 COPYRIGHT +Copyright (c) 1993 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. + +2 AUTHOR +Jamie Zawinski , 6-jul-93. diff --git a/hacks/halo.man b/hacks/halo.man new file mode 100755 index 00000000..5239ab57 --- /dev/null +++ b/hacks/halo.man @@ -0,0 +1,68 @@ +.TH XScreenSaver 1 "7-jul-93" "X Version 11" +.SH NAME +halo - draw circular patterns +.SH SYNOPSIS +.B halo +[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP] [\-background \fIcolor\fP] [\-window] [\-root] [\-mono] [\-install] [\-visual \fIvisual\fP] [\-count \fIint\fP] [\-delay \fIusecs\fP] [\-mode seuss | ramp | random ] [\-animate] +.SH DESCRIPTION +The \fIhalo\fP program draws cool patterns based on circles. +.SH OPTIONS +.I halo +accepts the following options: +.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 \-mono +If on a color display, pretend we're on a monochrome display. +.TP 8 +.B \-install +Install a private colormap for the window. +.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 \-count \fIinteger\fP +How many circles to draw. Default 0, meaning random. +.TP 8 +.B \-mode "seuss | ramp | random" +In \fIseuss\fP mode, alternating striped curves will be drawn. + +In \fIramp\fP mode, a color ramp will be drawn. + +\fIrandom\fP means pick the mode randomly. +.TP 8 +.B \-delay \fImicroseconds\fP +How much of a delay should be introduced between steps of the animation. +Default 100000, or about 0.1 second. +.TP 8 +.B \-animate +If specified, then the centerpoints of the circles will bounce around. +Otherwise, the circles will be drawn once, erased, and a new set of +circles will be drawn. +.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. +.SH SEE ALSO +.BR X (1), +.BR xscreensaver (1) +.SH COPYRIGHT +Copyright \(co 1993 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 , 6-jul-93. diff --git a/hacks/helix.c b/hacks/helix.c new file mode 100755 index 00000000..4f36ffb1 --- /dev/null +++ b/hacks/helix.c @@ -0,0 +1,211 @@ +/* xscreensaver, Copyright (c) 1992, 1995 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. + */ + +#include +#include "screenhack.h" +#ifdef VMS +#define M_PI 3.14159265358979323846 +#endif + +static double sins [360]; +static double coss [360]; + +static GC draw_gc, erase_gc; +static unsigned int default_fg_pixel; + +static void +init_helix (dpy, window) + Display *dpy; + Window window; +{ + int i; + XGCValues gcv; + XWindowAttributes xgwa; + Colormap cmap; + XGetWindowAttributes (dpy, window, &xgwa); + cmap = xgwa.colormap; + gcv.foreground = default_fg_pixel = + get_pixel_resource ("foreground", "Foreground", dpy, cmap); + draw_gc = XCreateGC (dpy, window, GCForeground, &gcv); + gcv.foreground = get_pixel_resource ("background", "Background", dpy, cmap); + erase_gc = XCreateGC (dpy, window, GCForeground, &gcv); + + for (i = 0; i < 360; i++) + { + sins [i] = sin ((((double) i) / 180.0) * M_PI); + coss [i] = cos ((((double) i) / 180.0) * M_PI); + } +} + +static int +gcd (a, b) + int a, b; +{ + while (b > 0) + { + int tmp; + tmp = a % b; + a = b; + b = tmp; + } + return (a < 0 ? -a : a); +} + +static void +helix (dpy, window, + radius1, radius2, d_angle, + factor1, factor2, factor3, factor4) + Display *dpy; + Window window; + int radius1, radius2, d_angle; + int factor1, factor2, factor3, factor4; +{ + XWindowAttributes xgwa; + int width, height; + int xmid, ymid; + int x1, y1, x2, y2, angle, limit; + int i; + + XClearWindow (dpy, window); + XGetWindowAttributes (dpy, window, &xgwa); + width = xgwa.width; + height = xgwa.height; + + xmid = width / 2; + ymid = height / 2; + x1 = xmid; + y1 = ymid + radius2; + x2 = xmid; + y2 = ymid + radius1; + angle = 0; + limit = 1 + (360 / gcd (360, d_angle)); + + for (i = 0; i < limit; i++) + { + int tmp; +#define pmod(x,y) (tmp = (x % y), (tmp >= 0 ? tmp : tmp + y)) + x1 = xmid + (((double) radius1) * sins [pmod ((angle * factor1), 360)]); + y1 = ymid + (((double) radius2) * coss [pmod ((angle * factor2), 360)]); + XDrawLine (dpy, window, draw_gc, x1, y1, x2, y2); + x2 = xmid + (((double) radius2) * sins [pmod ((angle * factor3), 360)]); + y2 = ymid + (((double) radius1) * coss [pmod ((angle * factor4), 360)]); + XDrawLine (dpy, window, draw_gc, x1, y1, x2, y2); + angle += d_angle; + XFlush (dpy); + } +} + +#define min(a,b) ((a)<(b)?(a):(b)) + +static void +random_helix (dpy, window) + Display *dpy; + Window window; +{ + Colormap cmap; + int width, height; + int radius, radius1, radius2, d_angle, factor1, factor2, factor3, factor4; + double divisor; + XColor color; + int i, got_color = 0; + XWindowAttributes xgwa; + XGetWindowAttributes (dpy, window, &xgwa); + width = xgwa.width; + height = xgwa.height; + cmap = xgwa.colormap; + + radius = min (width, height) / 2; + + d_angle = 0; + factor1 = 2; + factor2 = 2; + factor3 = 2; + factor4 = 2; + + divisor = ((frand (3.0) + 1) * (((random() & 1) * 2) - 1)); + + if ((random () & 1) == 0) + { + radius1 = radius; + radius2 = radius / divisor; + } + else + { + radius2 = radius; + radius1 = radius / divisor; + } + + while (gcd (360, d_angle) >= 2) + d_angle = random () % 360; + +#define random_factor() \ + (((random() % 7) ? ((random() & 1) + 1) : 3) \ + * (((random() & 1) * 2) - 1)) + + while (gcd (gcd (gcd (factor1, factor2), factor3), factor4) != 1) + { + factor1 = random_factor (); + factor2 = random_factor (); + factor3 = random_factor (); + factor4 = random_factor (); + } + + if (mono_p) + XSetForeground (dpy, draw_gc, default_fg_pixel); + else + { + hsv_to_rgb (random () % 360, frand (1.0), frand (0.5) + 0.5, + &color.red, &color.green, &color.blue); + if ((got_color = XAllocColor (dpy, cmap, &color))) + XSetForeground (dpy, draw_gc, color.pixel); + else + XSetForeground (dpy, draw_gc, default_fg_pixel); + } + helix (dpy, window, radius1, radius2, d_angle, + factor1, factor2, factor3, factor4); + + XSync (dpy, True); + sleep (5); + + for (i = 0; i < height; i++) + { + int y = (random () % height); + XDrawLine (dpy, window, erase_gc, 0, y, width, y); + XFlush (dpy); + if ((i % 50) == 0) + usleep (10000); + } + XClearWindow (dpy, window); + if (got_color) XFreeColors (dpy, cmap, &color.pixel, 1, 0); + XSync (dpy, True); + sleep (1); +} + + +char *progclass = "Helix"; + +char *defaults [] = { + "Helix.background: black", /* to placate SGI */ + 0 +}; + +XrmOptionDescRec options [] = { { 0, } }; +int options_size = 0; + +void +screenhack (dpy, window) + Display *dpy; + Window window; +{ + init_helix (dpy, window); + while (1) + random_helix (dpy, window); +} diff --git a/hacks/helix.c_ori b/hacks/helix.c_ori new file mode 100755 index 00000000..84c4fd8c --- /dev/null +++ b/hacks/helix.c_ori @@ -0,0 +1,208 @@ +/* xscreensaver, Copyright (c) 1992, 1995 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. + */ + +#include +#include "screenhack.h" + +static double sins [360]; +static double coss [360]; + +static GC draw_gc, erase_gc; +static unsigned int default_fg_pixel; + +static void +init_helix (dpy, window) + Display *dpy; + Window window; +{ + int i; + XGCValues gcv; + XWindowAttributes xgwa; + Colormap cmap; + XGetWindowAttributes (dpy, window, &xgwa); + cmap = xgwa.colormap; + gcv.foreground = default_fg_pixel = + get_pixel_resource ("foreground", "Foreground", dpy, cmap); + draw_gc = XCreateGC (dpy, window, GCForeground, &gcv); + gcv.foreground = get_pixel_resource ("background", "Background", dpy, cmap); + erase_gc = XCreateGC (dpy, window, GCForeground, &gcv); + + for (i = 0; i < 360; i++) + { + sins [i] = sin ((((double) i) / 180.0) * M_PI); + coss [i] = cos ((((double) i) / 180.0) * M_PI); + } +} + +static int +gcd (a, b) + int a, b; +{ + while (b > 0) + { + int tmp; + tmp = a % b; + a = b; + b = tmp; + } + return (a < 0 ? -a : a); +} + +static void +helix (dpy, window, + radius1, radius2, d_angle, + factor1, factor2, factor3, factor4) + Display *dpy; + Window window; + int radius1, radius2, d_angle; + int factor1, factor2, factor3, factor4; +{ + XWindowAttributes xgwa; + int width, height; + int xmid, ymid; + int x1, y1, x2, y2, angle, limit; + int i; + + XClearWindow (dpy, window); + XGetWindowAttributes (dpy, window, &xgwa); + width = xgwa.width; + height = xgwa.height; + + xmid = width / 2; + ymid = height / 2; + x1 = xmid; + y1 = ymid + radius2; + x2 = xmid; + y2 = ymid + radius1; + angle = 0; + limit = 1 + (360 / gcd (360, d_angle)); + + for (i = 0; i < limit; i++) + { + int tmp; +#define pmod(x,y) (tmp = (x % y), (tmp >= 0 ? tmp : tmp + y)) + x1 = xmid + (((double) radius1) * sins [pmod ((angle * factor1), 360)]); + y1 = ymid + (((double) radius2) * coss [pmod ((angle * factor2), 360)]); + XDrawLine (dpy, window, draw_gc, x1, y1, x2, y2); + x2 = xmid + (((double) radius2) * sins [pmod ((angle * factor3), 360)]); + y2 = ymid + (((double) radius1) * coss [pmod ((angle * factor4), 360)]); + XDrawLine (dpy, window, draw_gc, x1, y1, x2, y2); + angle += d_angle; + XFlush (dpy); + } +} + +#define min(a,b) ((a)<(b)?(a):(b)) + +static void +random_helix (dpy, window) + Display *dpy; + Window window; +{ + Colormap cmap; + int width, height; + int radius, radius1, radius2, d_angle, factor1, factor2, factor3, factor4; + double divisor; + XColor color; + int i, got_color = 0; + XWindowAttributes xgwa; + XGetWindowAttributes (dpy, window, &xgwa); + width = xgwa.width; + height = xgwa.height; + cmap = xgwa.colormap; + + radius = min (width, height) / 2; + + d_angle = 0; + factor1 = 2; + factor2 = 2; + factor3 = 2; + factor4 = 2; + + divisor = ((frand (3.0) + 1) * (((random() & 1) * 2) - 1)); + + if ((random () & 1) == 0) + { + radius1 = radius; + radius2 = radius / divisor; + } + else + { + radius2 = radius; + radius1 = radius / divisor; + } + + while (gcd (360, d_angle) >= 2) + d_angle = random () % 360; + +#define random_factor() \ + (((random() % 7) ? ((random() & 1) + 1) : 3) \ + * (((random() & 1) * 2) - 1)) + + while (gcd (gcd (gcd (factor1, factor2), factor3), factor4) != 1) + { + factor1 = random_factor (); + factor2 = random_factor (); + factor3 = random_factor (); + factor4 = random_factor (); + } + + if (mono_p) + XSetForeground (dpy, draw_gc, default_fg_pixel); + else + { + hsv_to_rgb (random () % 360, frand (1.0), frand (0.5) + 0.5, + &color.red, &color.green, &color.blue); + if ((got_color = XAllocColor (dpy, cmap, &color))) + XSetForeground (dpy, draw_gc, color.pixel); + else + XSetForeground (dpy, draw_gc, default_fg_pixel); + } + helix (dpy, window, radius1, radius2, d_angle, + factor1, factor2, factor3, factor4); + + XSync (dpy, True); + sleep (5); + + for (i = 0; i < height; i++) + { + int y = (random () % height); + XDrawLine (dpy, window, erase_gc, 0, y, width, y); + XFlush (dpy); + if ((i % 50) == 0) + usleep (10000); + } + XClearWindow (dpy, window); + if (got_color) XFreeColors (dpy, cmap, &color.pixel, 1, 0); + XSync (dpy, True); + sleep (1); +} + + +char *progclass = "Helix"; + +char *defaults [] = { + "Helix.background: black", /* to placate SGI */ + 0 +}; + +XrmOptionDescRec options [] = { { 0, } }; +int options_size = 0; + +void +screenhack (dpy, window) + Display *dpy; + Window window; +{ + init_helix (dpy, window); + while (1) + random_helix (dpy, window); +} diff --git a/hacks/helix.exe_axp b/hacks/helix.exe_axp new file mode 100755 index 0000000000000000000000000000000000000000..1d0dde4eac564eed0c746700df1fe65fcbbd986a GIT binary patch literal 33280 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 C@n72j literal 0 HcmV?d00001 diff --git a/hacks/helix.exe_vax b/hacks/helix.exe_vax new file mode 100755 index 0000000000000000000000000000000000000000..953e75a5bb7072eb737a770df0fc039bba5235c3 GIT binary patch literal 17920 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 z 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 literal 0 HcmV?d00001 diff --git a/hacks/helix.hlp b/hacks/helix.hlp new file mode 100755 index 00000000..b481efe3 --- /dev/null +++ b/hacks/helix.hlp @@ -0,0 +1,51 @@ +1 HELIX +Draw helical string-art patterns + +SYNOPSIS + + $ helix [-display host:display.screen] [-foreground color] + [-background color] [-window] [-root] [-mono] [-install] + [-visual visual] + +2 DESCRIPTION +The helix program draws interesting patterns composed of line segments +in random colors. + +2 OPTIONS +Helix accepts the following options: + + -window +Draw on a newly-created window. This is the default. + + -root +Draw on the root window. + + -mono +If on a color display, pretend we're on a monochrome display. + + -install +Install a private colormap for the window. + + -visual visual +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. + +2 ENVIRONMENT + DISPLAY +to get the default host and display number. + + XENVIRONMENT +to get the name of a resource file that overrides the global resources +stored in the RESOURCE_MANAGER property. + +2 COPYRIGHT +Copyright (c) 1992 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. + +2 AUTHOR +Jamie Zawinski , 13-aug-92. diff --git a/hacks/helix.man b/hacks/helix.man new file mode 100755 index 00000000..76c7cfef --- /dev/null +++ b/hacks/helix.man @@ -0,0 +1,50 @@ +.TH XScreenSaver 1 "13-aug-92" "X Version 11" +.SH NAME +helix - draw helical string-art patterns +.SH SYNOPSIS +.B helix +[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP] [\-background \fIcolor\fP] [\-window] [\-root] [\-mono] [\-install] [\-visual \fIvisual\fP] +.SH DESCRIPTION +The \fIhelix\fP program draws interesting patterns composed of line segments +in random colors. +.SH OPTIONS +.I helix +accepts the following options: +.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 \-mono +If on a color display, pretend we're on a monochrome display. +.TP 8 +.B \-install +Install a private colormap for the window. +.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. +.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. +.SH SEE ALSO +.BR X (1), +.BR xscreensaver (1) +.SH COPYRIGHT +Copyright \(co 1992 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 , 13-aug-92. diff --git a/hacks/hopalong.c b/hacks/hopalong.c new file mode 100755 index 00000000..2a91ecef --- /dev/null +++ b/hacks/hopalong.c @@ -0,0 +1,236 @@ +/* xscreensaver, Copyright (c) 1992, 1995 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. + */ + +/* This file was ported from xlock for use in xscreensaver (and standalone) + * by jwz on 12-Aug-92. Original copyright reads: + * + * hopalong.c - Real Plane Fractals for xlock, the X Window System lockscreen. + * + * Copyright (c) 1991 by Patrick J. Naughton. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation for any purpose and without fee is hereby granted, + * provided that the above copyright notice appear in all copies and that + * both that copyright notice and this permission notice appear in + * supporting documentation. + * + * This file is provided AS IS with no warranties of any kind. The author + * shall have no liability with respect to the infringement of copyrights, + * trade secrets or any patents by this file or any part thereof. In no + * event will the author be liable for any lost revenue or profits or + * other special, indirect and consequential damages. + * + * Comments and additions should be sent to the author: + * + * naughton@eng.sun.com + * + * Patrick J. Naughton + * MS 21-14 + * Sun Laboritories, Inc. + * 2550 Garcia Ave + * Mountain View, CA 94043 + * + * Revision History: + * 29-Oct-90: fix bad (int) cast. + * 29-Jul-90: support for multiple screens. + * 08-Jul-90: new timing and colors and new algorithm for fractals. + * 15-Dec-89: Fix for proper skipping of {White,Black}Pixel() in colors. + * 08-Oct-89: Fixed long standing typo bug in RandomInitHop(); + * Fixed bug in memory allocation in inithop(); + * Moved seconds() to an extern. + * Got rid of the % mod since .mod is slow on a sparc. + * 20-Sep-89: Lint. + * 31-Aug-88: Forked from xlock.c for modularity. + * 23-Mar-88: Coded HOPALONG routines from Scientific American Sept. 86 p. 14. + */ + +#include +#include "screenhack.h" + +static GC gc; +static int batchcount = 1000; + +static unsigned int *pixels = 0, fg_pixel, bg_pixel; +static int npixels; +static unsigned int delay; +static int timeout; + +typedef struct { + int centerx; + int centery; /* center of the screen */ + double a; + double b; + double c; + double i; + double j; /* hopalong parameters */ + int inc; + int pix; + long startTime; +} hopstruct; + +static hopstruct hop; +static XPoint *pointBuffer = 0; /* pointer for XDrawPoints */ + +static void +inithop(dsp,win) + Display *dsp; + Window win; +{ + double range; + XWindowAttributes xgwa; + hopstruct *hp = &hop; + XGCValues gcv; + Colormap cmap; + XGetWindowAttributes (dsp, win, &xgwa); + cmap = xgwa.colormap; + + if (! pixels) + { + XColor color; + int i = get_integer_resource ("ncolors", "Integer"); + int shift; + if (i <= 2) i = 2, mono_p = True; + shift = 360 / i; + pixels = (unsigned int *) calloc (i, sizeof (unsigned int)); + fg_pixel = get_pixel_resource ("foreground", "Foreground", dsp, cmap); + bg_pixel = get_pixel_resource ("background", "Background", dsp, cmap); + if (! mono_p) + { + hsv_to_rgb (random () % 360, 1.0, 1.0, + &color.red, &color.green, &color.blue); + for (npixels = 0; npixels < i; npixels++) + { + if (! XAllocColor (dsp, cmap, &color)) + break; + pixels[npixels] = color.pixel; + cycle_hue (&color, shift); + } + } + timeout = get_integer_resource ("timeout", "Seconds"); + if (timeout <= 0) timeout = 30; + delay = get_integer_resource ("delay", "Usecs"); + + gcv.foreground = fg_pixel; + gc = XCreateGC (dsp, win, GCForeground, &gcv); + } + + XClearWindow (dsp, win); + + hp->centerx = xgwa.width / 2; + hp->centery = xgwa.height / 2; + range = sqrt((double) hp->centerx * hp->centerx + + (double) hp->centery * hp->centery) / + (10.0 + random() % 10); + + hp->pix = 0; +#define frand0() (((double) random()) / ((unsigned int) (~0))) + hp->inc = (int) (frand0() * 200) - 100; + hp->a = frand0() * range - range / 2.0; + hp->b = frand0() * range - range / 2.0; + hp->c = frand0() * range - range / 2.0; + if (!(random() % 2)) + hp->c = 0.0; + + hp->i = hp->j = 0.0; + + if (!pointBuffer) + pointBuffer = (XPoint *) malloc(batchcount * sizeof(XPoint)); + + XSetForeground(dsp, gc, bg_pixel); + XFillRectangle(dsp, win, gc, 0, 0, + hp->centerx * 2, hp->centery * 2); + XSetForeground(dsp, gc, fg_pixel); + hp->startTime = time ((time_t *) 0); +} + + +static void +drawhop(dsp,win) + Display *dsp; + Window win; +{ + double oldj; + int k = batchcount; + XPoint *xp = pointBuffer; + hopstruct *hp = &hop; + + hp->inc++; + if (! mono_p) { + XSetForeground(dsp, gc, pixels[hp->pix]); + if (++hp->pix >= npixels) + hp->pix = 0; + } + while (k--) { + oldj = hp->j; + hp->j = hp->a - hp->i; + hp->i = oldj + (hp->i < 0 + ? sqrt(fabs(hp->b * (hp->i + hp->inc) - hp->c)) + : -sqrt(fabs(hp->b * (hp->i + hp->inc) - hp->c))); + xp->x = hp->centerx + (int) (hp->i + hp->j); + xp->y = hp->centery - (int) (hp->i - hp->j); + xp++; + } + XDrawPoints(dsp, win, gc, + pointBuffer, batchcount, CoordModeOrigin); + XSync (dsp, True); + if ((time ((time_t *) 0) - hp->startTime) > timeout) + { + int i; + XSetForeground(dsp, gc, bg_pixel); + for (i = 0; i < hp->centery; i++) + { + int y = (random () % (hp->centery << 1)); + XDrawLine (dsp, win, gc, 0, y, hp->centerx << 1, y); + XFlush (dsp); + if ((i % 50) == 0) + usleep (10000); + } + XClearWindow (dsp, win); + XFlush (dsp); + sleep (1); + inithop(dsp,win); + } +} + + +char *progclass = "Hopalong"; + +char *defaults [] = { + "Hopalong.background: black", /* to placate SGI */ + "Hopalong.foreground: white", + "*count: 1000", + "*ncolors: 100", + "*timeout: 20", + "*delay: 0", + 0 +}; + +XrmOptionDescRec options [] = { + { "-count", ".count", XrmoptionSepArg, 0 }, + { "-ncolors", ".ncolors", XrmoptionSepArg, 0 }, + { "-timeout", ".timeout", XrmoptionSepArg, 0 }, + { "-delay", ".delay", XrmoptionSepArg, 0 }, +}; +int options_size = (sizeof (options) / sizeof (options[0])); + +void +screenhack (dpy, window) + Display *dpy; + Window window; +{ + inithop (dpy, window); + while (1) + { + drawhop (dpy, window); + XSync (dpy, True); + if (delay) usleep (delay); + } +} diff --git a/hacks/hopalong.exe_axp b/hacks/hopalong.exe_axp new file mode 100755 index 0000000000000000000000000000000000000000..6f7a17193d5201ac441d91f4742f79fa3b226f83 GIT binary patch literal 32768 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 A5C8xG literal 0 HcmV?d00001 diff --git a/hacks/hopalong.hlp b/hacks/hopalong.hlp new file mode 100755 index 00000000..ce06b6c6 --- /dev/null +++ b/hacks/hopalong.hlp @@ -0,0 +1,70 @@ +1 HOPALONG +Draw real plane fractals + +SYNOPSIS + + $ hopalong [-display host:display.screen] [-foreground color] + [-background color] [-window] [-root] [-mono] [-install] + [-visual visual] [-count integer] [-ncolors integer] + [-timeout seconds] [-delay microseconds] + +2 DESCRIPTION +The hopalong program generates real plane fractals as described in +the September 1986 issue of Scientific American. + +2 OPTIONS +Hopalong accepts the following options: + + -window +Draw on a newly-created window. This is the default. + + -root +Draw on the root window. + + -mono +If on a color display, pretend we're on a monochrome display. + + -install +Install a private colormap for the window. + + -visual visual +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. + + -count integer +How many pixels should be drawn before a color change. Default 1000. + + -ncolors integer +How many colors should be used (if possible). Default 100. +The colors used cycle through the hue, making N stops around +the color wheel. + + -timeout seconds +How many seconds we should generate for before clearing the screen +and starting over. Default 20. + + -delay microseconds +How long we should wait between drawing each pixel. Default 0. + +2 ENVIRONMENT + DISPLAY +to get the default host and display number. + + XENVIRONMENT +to get the name of a resource file that overrides the global resources +stored in the RESOURCE_MANAGER property. + +2 COPYRIGHT +Copyright (c) 1988-91 by Patrick J. Naughton + +Permission to use, copy, modify, and distribute this software and its +documentation for any purpose and without fee is hereby granted, +provided that the above copyright notice appear in all copies and that +both that copyright notice and this permission notice appear in +supporting documentation. + +2 AUTHOR +Patrick J. Naughton , 23-mar-88. + +Ability to run standalone or with xscreensaver added by +Jamie Zawinski , 13-aug-92. diff --git a/hacks/hopalong.man b/hacks/hopalong.man new file mode 100755 index 00000000..d812c7b3 --- /dev/null +++ b/hacks/hopalong.man @@ -0,0 +1,69 @@ +.TH XScreenSaver 1 "13-aug-92" "X Version 11" +.SH NAME +hopalong - draw real plane fractals +.SH SYNOPSIS +.B hopalong +[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP] [\-background \fIcolor\fP] [\-window] [\-root] [\-mono] [\-install] [\-visual \fIvisual\fP] [\-count \fIinteger\fP] [\-ncolors \fIinteger\fP] [\-timeout \fIseconds\fP] [\-delay \fImicroseconds\fP] +.SH DESCRIPTION +The \fIhopalong\fP program generates real plane fractals as described in +the September 1986 issue of Scientific American. +.SH OPTIONS +.I hopalong +accepts the following options: +.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 \-mono +If on a color display, pretend we're on a monochrome display. +.TP 8 +.B \-install +Install a private colormap for the window. +.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 \-count \fIinteger\fP +How many pixels should be drawn before a color change. Default 1000. +.TP 8 +.B \-ncolors \fIinteger\fP +How many colors should be used (if possible). Default 100. +The colors used cycle through the hue, making N stops around +the color wheel. +.TP 8 +.B \-timeout \fIseconds\fP +How many seconds we should generate for before clearing the screen +and starting over. Default 20. +.TP 8 +.B \-delay \fImicroseconds\fP +How long we should wait between drawing each pixel. Default 0. +.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. +.SH SEE ALSO +.BR X (1), +.BR xscreensaver (1), +.BR xlock (1) +.SH COPYRIGHT +Copyright \(co 1988-91 by Patrick J. Naughton + +Permission to use, copy, modify, and distribute this software and its +documentation for any purpose and without fee is hereby granted, +provided that the above copyright notice appear in all copies and that +both that copyright notice and this permission notice appear in +supporting documentation. +.SH AUTHOR +Patrick J. Naughton , 23-mar-88. + +Ability to run standalone or with \fIxscreensaver\fP added by +Jamie Zawinski , 13-aug-92. diff --git a/hacks/hypercube.c b/hacks/hypercube.c new file mode 100755 index 00000000..05574fb3 --- /dev/null +++ b/hacks/hypercube.c @@ -0,0 +1,334 @@ +/* xscreensaver, Copyright (c) 1992, 1995 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. + * + * This code derived from TI Explorer Lisp code by Joe Keane, Fritz Mueller, + * and Jamie Zawinski. + */ + +#include +#include "screenhack.h" + +static Display *dpy; +static Window window; +static GC color0, color1, color2, color3, color4, color5, color6, color7; +static GC black; + +static int delay; + +static int observer_z; +static int x_offset, y_offset; +static int unit_pixels; + +struct point_state { + int old_x, old_y; + int new_x, new_y; + Bool same_p; +}; + +static void +move_line (state0, state1, gc) + struct point_state *state0, *state1; + GC gc; +{ + if (state0->same_p && state1->same_p) + return; + if (mono_p) + { + XDrawLine (dpy, window, black, + state0->old_x, state0->old_y, state1->old_x, state1->old_y); + XDrawLine (dpy, window, gc, + state0->new_x, state0->new_y, state1->new_x, state1->new_y); + } + else + { + XSegment segments [2]; + segments [0].x1 = state0->old_x; segments [0].y1 = state0->old_y; + segments [0].x2 = state1->old_x; segments [0].y2 = state1->old_y; + segments [1].x1 = state0->new_x; segments [1].y1 = state0->new_y; + segments [1].x2 = state1->new_x; segments [1].y2 = state1->new_y; + XDrawSegments (dpy, window, gc, segments, 2); + } +} + +static void +hyper (xy, xz, yz, xw, yw, zw) + double xy, xz, yz, xw, yw, zw; +{ + double cos_xy = cos (xy), sin_xy = sin (xy); + double cos_xz = cos (xz), sin_xz = sin (xz); + double cos_yz = cos (yz), sin_yz = sin (yz); + double cos_xw = cos (xw), sin_xw = sin (xw); + double cos_yw = cos (yw), sin_yw = sin (yw); + double cos_zw = cos (zw), sin_zw = sin (zw); + + double ax = 1.0, ay = 0.0, az = 0.0, aw = 0.0; + double bx = 0.0, by = 1.0, bz = 0.0, bw = 0.0; + double cx = 0.0, cy = 0.0, cz = 1.0, cw = 0.0; + double dx = 0.0, dy = 0.0, dz = 0.0, dw = 1.0; + + double _tmp0_, _tmp1_; + + struct point_state points [16]; + memset (points, 0, sizeof (points)); + +#define mmmm (&points[0]) +#define mmmp (&points[1]) +#define mmpm (&points[2]) +#define mmpp (&points[3]) +#define mpmm (&points[4]) +#define mpmp (&points[5]) +#define mppm (&points[6]) +#define mppp (&points[7]) +#define pmmm (&points[8]) +#define pmmp (&points[9]) +#define pmpm (&points[10]) +#define pmpp (&points[11]) +#define ppmm (&points[12]) +#define ppmp (&points[13]) +#define pppm (&points[14]) +#define pppp (&points[15]) + + while (1) + { + double temp_mult; + +#define compute(a,b,c,d,point_state) \ + temp_mult = (unit_pixels / (((a*az) + (b*bz) + (c*cz) + (d*dz) + \ + (a*aw) + (b*bw) + (c*cw) + (d*dw)) \ + - observer_z)); \ + point_state->old_x = point_state->new_x; \ + point_state->old_y = point_state->new_y; \ + point_state->new_x = ((((a*ax) + (b*bx) + (c*cx) + (d*dx)) * temp_mult) \ + + x_offset); \ + point_state->new_y = ((((a*ay) + (b*by) + (c*cy) + (d*dy)) * temp_mult) \ + + y_offset); \ + point_state->same_p = (point_state->old_x == point_state->new_x && \ + point_state->old_y == point_state->new_y); + + compute (-1, -1, -1, -1, mmmm); + compute (-1, -1, -1, 1, mmmp); + compute (-1, -1, 1, -1, mmpm); + compute (-1, -1, 1, 1, mmpp); + compute (-1, 1, -1, -1, mpmm); + compute (-1, 1, -1, 1, mpmp); + compute (-1, 1, 1, -1, mppm); + compute (-1, 1, 1, 1, mppp); + compute ( 1, -1, -1, -1, pmmm); + compute ( 1, -1, -1, 1, pmmp); + compute ( 1, -1, 1, -1, pmpm); + compute ( 1, -1, 1, 1, pmpp); + compute ( 1, 1, -1, -1, ppmm); + compute ( 1, 1, -1, 1, ppmp); + compute ( 1, 1, 1, -1, pppm); + compute ( 1, 1, 1, 1, pppp); + + move_line (mmmm, mmmp, color0); + move_line (mmmm, mmpm, color0); + move_line (mmpm, mmpp, color0); + move_line (mmmp, mmpp, color0); + + move_line (pmmm, pmmp, color1); + move_line (pmmm, pmpm, color1); + move_line (pmpm, pmpp, color1); + move_line (pmmp, pmpp, color1); + + move_line (mpmm, mpmp, color2); + move_line (mpmm, mppm, color2); + move_line (mppm, mppp, color2); + move_line (mpmp, mppp, color2); + + move_line (mmpp, mppp, color3); + move_line (mmpp, pmpp, color3); + move_line (pmpp, pppp, color3); + move_line (mppp, pppp, color3); + + move_line (mmmm, mpmm, color4); + move_line (mmmm, pmmm, color4); + move_line (mpmm, ppmm, color4); + move_line (pmmm, ppmm, color4); + + move_line (mmmp, mpmp, color5); + move_line (mmmp, pmmp, color5); + move_line (pmmp, ppmp, color5); + move_line (mpmp, ppmp, color5); + + move_line (mmpm, mppm, color6); + move_line (mmpm, pmpm, color6); + move_line (pmpm, pppm, color6); + move_line (mppm, pppm, color6); + + move_line (ppmm, ppmp, color7); + move_line (ppmm, pppm, color7); + move_line (pppm, pppp, color7); + move_line (ppmp, pppp, color7); + + /* If you get error messages about the following forms, and you think you're + using an ANSI C conforming compiler, then you're mistaken. Possibly you're + mixing an ANSI compiler with a non-ANSI preprocessor, or vice versa. + Regardless, your system is broken; it's not a bug in this program. + */ +#if __STDC__ +# define rotate(name,dim0,dim1,cos,sin) \ + _tmp0_ = ((name##dim0 * cos) + (name##dim1 * sin)); \ + _tmp1_ = ((name##dim1 * cos) - (name##dim0 * sin)); \ + name##dim0 = _tmp0_; \ + name##dim1 = _tmp1_; + +# define rotates(dim0,dim1) \ + if (sin_##dim0##dim1 != 0) { \ + rotate(a, dim0, dim1, cos_##dim0##dim1, sin_##dim0##dim1); \ + rotate(b, dim0, dim1, cos_##dim0##dim1, sin_##dim0##dim1); \ + rotate(c, dim0, dim1, cos_##dim0##dim1, sin_##dim0##dim1); \ + rotate(d, dim0, dim1, cos_##dim0##dim1, sin_##dim0##dim1); \ + } + +#else /* !__STDC__, courtesy of Andreas Luik */ +# define rotate(name,dim0,dim1,cos,sin) \ + _tmp0_ = ((name/**/dim0 * cos) + (name/**/dim1 * sin)); \ + _tmp1_ = ((name/**/dim1 * cos) - (name/**/dim0 * sin)); \ + name/**/dim0 = _tmp0_; \ + name/**/dim1 = _tmp1_; + +# define rotates(dim0,dim1) \ + if (sin_/**/dim0/**/dim1 != 0) { \ + rotate(a,dim0,dim1,cos_/**/dim0/**/dim1,sin_/**/dim0/**/dim1); \ + rotate(b,dim0,dim1,cos_/**/dim0/**/dim1,sin_/**/dim0/**/dim1); \ + rotate(c,dim0,dim1,cos_/**/dim0/**/dim1,sin_/**/dim0/**/dim1); \ + rotate(d,dim0,dim1,cos_/**/dim0/**/dim1,sin_/**/dim0/**/dim1); \ + } +#endif /* !__STDC__ */ + + rotates (x,y); + rotates (x,z); + rotates (y,z); + rotates (x,w); + rotates (y,w); + rotates (z,w); + + XSync (dpy, True); + if (delay) usleep (delay); + } +} + + +char *progclass = "Hypercube"; + +char *defaults [] = { + "Hypercube.background: black", /* to placate SGI */ + "Hypercube.foreground: white", + "*color0: red", + "*color1: orange", + "*color2: yellow", + "*color3: white", + "*color4: green", + "*color5: cyan", + "*color6: dodgerblue", + "*color7: magenta", + + "*xw: 0.000", + "*xy: 0.010", + "*xz: 0.005", + "*yw: 0.010", + "*yz: 0.000", + "*zw: 0.000", + + "*observer-z: 5", + "*delay: 100000", + 0 +}; + +XrmOptionDescRec options [] = { + { "-color0", ".color0", XrmoptionSepArg, 0 }, + { "-color1", ".color1", XrmoptionSepArg, 0 }, + { "-color2", ".color2", XrmoptionSepArg, 0 }, + { "-color3", ".color3", XrmoptionSepArg, 0 }, + { "-color4", ".color4", XrmoptionSepArg, 0 }, + { "-color5", ".color5", XrmoptionSepArg, 0 }, + { "-color6", ".color6", XrmoptionSepArg, 0 }, + { "-color7", ".color7", XrmoptionSepArg, 0 }, + + { "-xw", ".xw", XrmoptionSepArg, 0 }, + { "-xy", ".xy", XrmoptionSepArg, 0 }, + { "-xz", ".xz", XrmoptionSepArg, 0 }, + { "-yw", ".yw", XrmoptionSepArg, 0 }, + { "-yz", ".yz", XrmoptionSepArg, 0 }, + { "-zw", ".zw", XrmoptionSepArg, 0 }, + + { "-observer-z", ".observer-z", XrmoptionSepArg, 0 }, + { "-delay", ".delay", XrmoptionSepArg, 0 } +}; + +int options_size = (sizeof (options) / sizeof (options[0])); + + +void +screenhack (d, w) + Display *d; + Window w; +{ + XGCValues gcv; + XWindowAttributes xgwa; + Colormap cmap; + double xy, xz, yz, xw, yw, zw; + unsigned long bg; + + dpy = d; + window = w; + XGetWindowAttributes (dpy, window, &xgwa); + cmap = xgwa.colormap; + + x_offset = xgwa.width / 2; + y_offset = xgwa.height / 2; + unit_pixels = xgwa.width < xgwa.height ? xgwa.width : xgwa.height; + + xy = get_float_resource ("xy", "Float"); + xz = get_float_resource ("xz", "Float"); + yz = get_float_resource ("yz", "Float"); + xw = get_float_resource ("xw", "Float"); + yw = get_float_resource ("yw", "Float"); + zw = get_float_resource ("zw", "Float"); + + observer_z = get_integer_resource ("observer-z", "Integer"); + + delay = get_integer_resource ("delay", "Integer"); + + bg = get_pixel_resource ("background", "Background", dpy, cmap); + + if (mono_p) + { + gcv.function = GXcopy; + gcv.foreground = bg; + black = XCreateGC (dpy, window, GCForeground|GCFunction, &gcv); + gcv.foreground = get_pixel_resource ("foreground", "Foreground", + dpy, cmap); + color0 = color1 = color2 = color3 = color4 = color5 = color6 = color7 = + XCreateGC (dpy, window, GCForeground|GCFunction, &gcv); + } + else + { + black = 0; + gcv.function = GXxor; +#define make_gc(color,name) \ + gcv.foreground = bg ^ get_pixel_resource ((name), "Foreground", \ + dpy, cmap); \ + color = XCreateGC (dpy, window, GCForeground|GCFunction, &gcv) + + make_gc (color0,"color0"); + make_gc (color1,"color1"); + make_gc (color2,"color2"); + make_gc (color3,"color3"); + make_gc (color4,"color4"); + make_gc (color5,"color5"); + make_gc (color6,"color6"); + make_gc (color7,"color7"); + } + + hyper (xy, xz, yz, xw, yw, zw); +} diff --git a/hacks/hypercube.exe_axp b/hacks/hypercube.exe_axp new file mode 100755 index 0000000000000000000000000000000000000000..b8c2d1a4ab29ee7ff77cbcb907718b3fee114ca2 GIT binary patch literal 36352 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

LQy*l6Z4;Qm7u#k zCM^;XS|q^z*Rn#HoOk?@drW>E@}IWHgp$wR>N~=h$oie(xRZ^Y*=x zkc08(xo=0Y#_nzR&U$O}J+bthRbR_mdnPLoOD|i+YdLkVW&dNn`xnOGBlq@N7Cxrz zzj+le|LIlUd){ilXO?c&{)N4kMUS<_UR(4{IA4bQXYR?pr)^Wf_3BeK!C5 z?tASm9LL{-^f`BHQ>@M?xX<1CLOy>@w4ncjyR{|?ioU?#?`~CMZ|Bup_gVb|c<&&7 zuee)3JEhtYck8>+I{px=cNABhq~O>#-$0UXn~Lj+=yqGVq^N9dNwMiUcWdF4in`sc z<5SxAzPt6n6s&0H-be;xncK-}(}%93Q{O5OS{OMcx@Ap>5}?1P^S>Vd_cz~VrGC$J0=x5t-{$(4bEAzYt;Kq0zcW+(0yA{yr@`KFFQPB`tC zIj`tgi-4UuMu-QIY({D}mCa2qI)@d-b)2{WWNlHQsl^sft$8IYV8Sg(^n-qR0;WI? zwP2|`u=IE+f+}*T3JlV{oUh6QhN?hrz>ugImC)@-RNy}o1HFaPhw0tsqLl~dpOmN zYHx{G+mDnfo*JB9KZHr5K3;k-%$Sc_Tyy+lIAE>}m;+1e0!#e^C=cnVpwduSP8G=G zfy-d(NPbcC_xby&#VrF-q+f^Wt{7y~Y^T>irD*?_Gw#zYO@kcFRi{Z{@%G z(mkKA`}))CZ2$3U=06|!gnsY8|HcyP{>4hmeeS!rA9#INCapiAQ%L`6^Chg{O%Oj1eb$fnQRGQj6@r7@G>*!lQ3x3t}#h1!2c|N}K z=U;c9G~D&ft5^T-r=OkBu(%KR@AodeQ62lynRh;W@IX%XiHb_=+5Sbh{Kprp+um${ z_=LFP#Fer<^*gHPf8}ep$ltxI(eTDyZ@=mNpGS6RPmsQ1aw1ucL3||`6)PsqwkUdKaGMGe3KSM#*S?66TM_7 zb5F*d@a}N0(Ig+R>Fm+g4=~XFLF>`hv-B{6Rl*7_Fa_RUd3}NDZ;rI~0xlnv5gw_y zalg+g7*0+hUXmB6vG5ucU|4`reL!nHptW7T%MrqjuWnhrTgjXctv7RiRt7G9&CIw- zb4ankKT6FOasR7~W*>b=IGAOL-mh}EY{5C?qo*H_N!#;tc_d7nx0w4L+)1wgN2+j@ z4z37$2m;j#5Zl4pDDQnkG_Ru0Q?~`#{|P8|uxrF*571zLafM^N8}vsS`mOJ zj138W2wJ)F=6U7;dYDVjNwgy|i2=kXN-HKRDGi5u{C;{aKLLDHm~{U;iP2eD7!qQ% g8%UEkK&gerj`a%Nq$!OH(_%O1O@I0Pzoo!`0f)x8^Z)<= literal 0 HcmV?d00001 diff --git a/utils/utils.olb_axp b/utils/utils.olb_axp new file mode 100755 index 0000000000000000000000000000000000000000..715726433f5b4f34cb67e317937d76f0ace1cf04 GIT binary patch literal 98304 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

>8r)}PJFM! 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 + * + * 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. + */ + +/* This file contains some code for intelligently picking the best visual + (where "best" is biased in the direction of high color counts...) + */ + +#if __STDC__ +#include +#include +#include +#endif + +#ifdef __DECC +typedef char * caddr_t; +#endif + +#ifdef VMS +#include /*to pick up strcmp*/ +#endif + +#include +#include +#include + +#if __STDC__ +# define P(x)x +#else +#define P(x)() +#endif + +#ifndef isupper +# define isupper(c) ((c) >= 'A' && (c) <= 'Z') +#endif +#ifndef _tolower +# define _tolower(c) ((c) - 'A' + 'a') +#endif + +extern char *progname; +extern char *get_string_resource P((char *, char *)); + +static Visual *pick_best_visual P ((Screen *)); +static Visual *pick_best_visual_of_class P((Screen *, int)); +static Visual *id_to_visual P((Screen *, int)); +static int screen_number P((Screen *)); +static Visual *id_to_visual P((Screen *screen, int id)); +int get_visual_depth P((Display *dpy, Visual *visual)); + + +#define DEFAULT_VISUAL -1 +#define BEST_VISUAL -2 +#define SPECIFIC_VISUAL -3 + +Visual * +get_visual_resource (dpy, name, class) + Display *dpy; + char *name, *class; +{ + Screen *screen = DefaultScreenOfDisplay (dpy); + char c, *v = get_string_resource (name, class); + char *tmp; + int vclass; + unsigned long id; + + if (v) + for (tmp = v; *tmp; tmp++) + if (isupper (*tmp)) *tmp = _tolower (*tmp); + + if (!v) vclass = BEST_VISUAL; + else if (!strcmp (v, "default")) vclass = DEFAULT_VISUAL; + else if (!strcmp (v, "best")) vclass = BEST_VISUAL; + else if (!strcmp (v, "staticgray")) vclass = StaticGray; + else if (!strcmp (v, "staticcolor")) vclass = StaticColor; + else if (!strcmp (v, "truecolor")) vclass = TrueColor; + else if (!strcmp (v, "grayscale")) vclass = GrayScale; + else if (!strcmp (v, "pseudocolor")) vclass = PseudoColor; + else if (!strcmp (v, "directcolor")) vclass = DirectColor; + else if (1 == sscanf (v, " %ld %c", &id, &c)) vclass = SPECIFIC_VISUAL; + else if (1 == sscanf (v, " 0x%lx %c", &id, &c)) vclass = SPECIFIC_VISUAL; + else + { + fprintf (stderr, "%s: unrecognized visual \"%s\".\n", progname, v); + vclass = DEFAULT_VISUAL; + } + if (v) free (v); + + if (vclass == DEFAULT_VISUAL) + return DefaultVisualOfScreen (screen); + else if (vclass == BEST_VISUAL) + return pick_best_visual (screen); + else if (vclass == SPECIFIC_VISUAL) + { + Visual *visual = id_to_visual (screen, id); + if (visual) return visual; + fprintf (stderr, "%s: no visual with id 0x%x.\n", progname, + (unsigned int) id); + return DefaultVisualOfScreen (screen); + } + else + { + Visual *visual = pick_best_visual_of_class (screen, vclass); + if (visual) return visual; + fprintf (stderr, "%s: no visual of class %s.\n", progname, v); + return DefaultVisualOfScreen (screen); + } +} + +static Visual * +pick_best_visual (screen) + Screen *screen; +{ + /* The "best" visual is the one on which we can allocate the largest + range and number of colors. + + Therefore, a TrueColor visual which is at least 16 bits deep is best. + (The assumption here being that a TrueColor of less than 16 bits is + really just a PseudoColor visual with a pre-allocated color cube.) + + The next best thing is a PseudoColor visual of any type. After that + come the non-colormappable visuals, and non-color visuals. + */ + Display *dpy = DisplayOfScreen (screen); + Visual *visual; + if ((visual = pick_best_visual_of_class (screen, TrueColor)) && + get_visual_depth (dpy, visual) >= 16) + return visual; + if ((visual = pick_best_visual_of_class (screen, PseudoColor))) + return visual; + if ((visual = pick_best_visual_of_class (screen, TrueColor))) + return visual; + if ((visual = pick_best_visual_of_class (screen, DirectColor))) + return visual; + if ((visual = pick_best_visual_of_class (screen, GrayScale))) + return visual; + if ((visual = pick_best_visual_of_class (screen, StaticGray))) + return visual; + return DefaultVisualOfScreen (screen); +} + +static Visual * +pick_best_visual_of_class (screen, visual_class) + Screen *screen; + int visual_class; +{ + /* The best visual of a class is the one which on which we can allocate + the largest range and number of colors, which means the one with the + greatest depth and number of cells. + */ + Display *dpy = DisplayOfScreen (screen); + XVisualInfo vi_in, *vi_out; + int out_count; + + vi_in.class = visual_class; + vi_in.screen = screen_number (screen); + vi_out = XGetVisualInfo (dpy, (VisualClassMask | VisualScreenMask), + &vi_in, &out_count); + if (vi_out) + { + /* choose the 'best' one, if multiple */ + int i, best; + Visual *visual; + for (i = 0, best = 0; i < out_count; i++) + /* It's better if it's deeper, or if it's the same depth with + more cells (does that ever happen? Well, it could...) */ + if ((vi_out [i].depth > vi_out [best].depth) || + ((vi_out [i].depth == vi_out [best].depth) && + (vi_out [i].colormap_size > vi_out [best].colormap_size))) + best = i; + visual = vi_out [best].visual; + XFree ((char *) vi_out); + return visual; + } + else + return 0; +} + +static Visual * +id_to_visual (screen, id) + Screen *screen; + int id; +{ + Display *dpy = DisplayOfScreen (screen); + XVisualInfo vi_in, *vi_out; + int out_count; + vi_in.screen = screen_number (screen); + vi_in.visualid = id; + vi_out = XGetVisualInfo (dpy, (VisualScreenMask | VisualIDMask), + &vi_in, &out_count); + if (vi_out) + { + Visual *v = vi_out[0].visual; + XFree ((char *) vi_out); + return v; + } + return 0; +} + +int +get_visual_depth (dpy, visual) + Display *dpy; + Visual *visual; +{ + XVisualInfo vi_in, *vi_out; + int out_count, d; + vi_in.screen = DefaultScreen (dpy); + vi_in.visualid = XVisualIDFromVisual (visual); + vi_out = XGetVisualInfo (dpy, VisualScreenMask|VisualIDMask, + &vi_in, &out_count); + if (! vi_out) abort (); + d = vi_out [0].depth; + XFree ((char *) vi_out); + return d; +} + + +int +get_visual_class (dpy, visual) + Display *dpy; + Visual *visual; +{ + XVisualInfo vi_in, *vi_out; + int out_count, c; + vi_in.screen = DefaultScreen (dpy); + vi_in.visualid = XVisualIDFromVisual (visual); + vi_out = XGetVisualInfo (dpy, VisualScreenMask|VisualIDMask, + &vi_in, &out_count); + if (! vi_out) abort (); + c = vi_out [0].class; + XFree ((char *) vi_out); + return c; +} + +void +describe_visual (f, dpy, visual) + FILE *f; + Display *dpy; + Visual *visual; +{ + Screen *screen = DefaultScreenOfDisplay (dpy); + XVisualInfo vi_in, *vi_out; + int out_count; + vi_in.screen = screen_number (screen); + vi_in.visualid = XVisualIDFromVisual (visual); + vi_out = XGetVisualInfo (dpy, (VisualScreenMask | VisualIDMask), + &vi_in, &out_count); + if (! vi_out) abort (); + fprintf (f, "0x%02x (%s depth: %2d, cmap: %3d)\n", + (unsigned int) vi_out->visualid, + (vi_out->class == StaticGray ? "StaticGray, " : + vi_out->class == StaticColor ? "StaticColor," : + vi_out->class == TrueColor ? "TrueColor, " : + vi_out->class == GrayScale ? "GrayScale, " : + vi_out->class == PseudoColor ? "PseudoColor," : + vi_out->class == DirectColor ? "DirectColor," : + "UNKNOWN: "), + vi_out->depth, vi_out->colormap_size /*, vi_out->bits_per_rgb*/); + XFree ((char *) vi_out); +} + +static int +screen_number (screen) + Screen *screen; +{ + Display *dpy = DisplayOfScreen (screen); + int i; + for (i = 0; i < ScreenCount (dpy); i++) + if (ScreenOfDisplay (dpy, i) == screen) + return i; + abort (); +} + +int +visual_cells (dpy, visual) + Display *dpy; + Visual *visual; +{ + XVisualInfo vi_in, *vi_out; + int out_count, c; + vi_in.screen = DefaultScreen (dpy); + vi_in.visualid = XVisualIDFromVisual (visual); + vi_out = XGetVisualInfo (dpy, VisualScreenMask|VisualIDMask, + &vi_in, &out_count); + if (! vi_out) abort (); + c = vi_out [0].colormap_size; + XFree ((char *) vi_out); + return c; +} diff --git a/utils/visual.c_ori b/utils/visual.c_ori new file mode 100755 index 00000000..cc8b5729 --- /dev/null +++ b/utils/visual.c_ori @@ -0,0 +1,288 @@ +/* xscreensaver, Copyright (c) 1993, 1994, 1995 + * 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. + */ + +/* This file contains some code for intelligently picking the best visual + (where "best" is biased in the direction of high color counts...) + */ + +#if __STDC__ +#include +#include +#include +#endif + +#include +#include +#include + +#if __STDC__ +# define P(x)x +#else +#define P(x)() +#endif + +#ifndef isupper +# define isupper(c) ((c) >= 'A' && (c) <= 'Z') +#endif +#ifndef _tolower +# define _tolower(c) ((c) - 'A' + 'a') +#endif + +extern char *progname; +extern char *get_string_resource P((char *, char *)); + +static Visual *pick_best_visual P ((Screen *)); +static Visual *pick_best_visual_of_class P((Screen *, int)); +static Visual *id_to_visual P((Screen *, int)); +static int screen_number P((Screen *)); +static Visual *id_to_visual P((Screen *screen, int id)); +int get_visual_depth P((Display *dpy, Visual *visual)); + + +#define DEFAULT_VISUAL -1 +#define BEST_VISUAL -2 +#define SPECIFIC_VISUAL -3 + +Visual * +get_visual_resource (dpy, name, class) + Display *dpy; + char *name, *class; +{ + Screen *screen = DefaultScreenOfDisplay (dpy); + char c, *v = get_string_resource (name, class); + char *tmp; + int vclass; + unsigned long id; + + if (v) + for (tmp = v; *tmp; tmp++) + if (isupper (*tmp)) *tmp = _tolower (*tmp); + + if (!v) vclass = BEST_VISUAL; + else if (!strcmp (v, "default")) vclass = DEFAULT_VISUAL; + else if (!strcmp (v, "best")) vclass = BEST_VISUAL; + else if (!strcmp (v, "staticgray")) vclass = StaticGray; + else if (!strcmp (v, "staticcolor")) vclass = StaticColor; + else if (!strcmp (v, "truecolor")) vclass = TrueColor; + else if (!strcmp (v, "grayscale")) vclass = GrayScale; + else if (!strcmp (v, "pseudocolor")) vclass = PseudoColor; + else if (!strcmp (v, "directcolor")) vclass = DirectColor; + else if (1 == sscanf (v, " %ld %c", &id, &c)) vclass = SPECIFIC_VISUAL; + else if (1 == sscanf (v, " 0x%lx %c", &id, &c)) vclass = SPECIFIC_VISUAL; + else + { + fprintf (stderr, "%s: unrecognized visual \"%s\".\n", progname, v); + vclass = DEFAULT_VISUAL; + } + if (v) free (v); + + if (vclass == DEFAULT_VISUAL) + return DefaultVisualOfScreen (screen); + else if (vclass == BEST_VISUAL) + return pick_best_visual (screen); + else if (vclass == SPECIFIC_VISUAL) + { + Visual *visual = id_to_visual (screen, id); + if (visual) return visual; + fprintf (stderr, "%s: no visual with id 0x%x.\n", progname, + (unsigned int) id); + return DefaultVisualOfScreen (screen); + } + else + { + Visual *visual = pick_best_visual_of_class (screen, vclass); + if (visual) return visual; + fprintf (stderr, "%s: no visual of class %s.\n", progname, v); + return DefaultVisualOfScreen (screen); + } +} + +static Visual * +pick_best_visual (screen) + Screen *screen; +{ + /* The "best" visual is the one on which we can allocate the largest + range and number of colors. + + Therefore, a TrueColor visual which is at least 16 bits deep is best. + (The assumption here being that a TrueColor of less than 16 bits is + really just a PseudoColor visual with a pre-allocated color cube.) + + The next best thing is a PseudoColor visual of any type. After that + come the non-colormappable visuals, and non-color visuals. + */ + Display *dpy = DisplayOfScreen (screen); + Visual *visual; + if ((visual = pick_best_visual_of_class (screen, TrueColor)) && + get_visual_depth (dpy, visual) >= 16) + return visual; + if ((visual = pick_best_visual_of_class (screen, PseudoColor))) + return visual; + if ((visual = pick_best_visual_of_class (screen, TrueColor))) + return visual; + if ((visual = pick_best_visual_of_class (screen, DirectColor))) + return visual; + if ((visual = pick_best_visual_of_class (screen, GrayScale))) + return visual; + if ((visual = pick_best_visual_of_class (screen, StaticGray))) + return visual; + return DefaultVisualOfScreen (screen); +} + +static Visual * +pick_best_visual_of_class (screen, visual_class) + Screen *screen; + int visual_class; +{ + /* The best visual of a class is the one which on which we can allocate + the largest range and number of colors, which means the one with the + greatest depth and number of cells. + */ + Display *dpy = DisplayOfScreen (screen); + XVisualInfo vi_in, *vi_out; + int out_count; + + vi_in.class = visual_class; + vi_in.screen = screen_number (screen); + vi_out = XGetVisualInfo (dpy, (VisualClassMask | VisualScreenMask), + &vi_in, &out_count); + if (vi_out) + { + /* choose the 'best' one, if multiple */ + int i, best; + Visual *visual; + for (i = 0, best = 0; i < out_count; i++) + /* It's better if it's deeper, or if it's the same depth with + more cells (does that ever happen? Well, it could...) */ + if ((vi_out [i].depth > vi_out [best].depth) || + ((vi_out [i].depth == vi_out [best].depth) && + (vi_out [i].colormap_size > vi_out [best].colormap_size))) + best = i; + visual = vi_out [best].visual; + XFree ((char *) vi_out); + return visual; + } + else + return 0; +} + +static Visual * +id_to_visual (screen, id) + Screen *screen; + int id; +{ + Display *dpy = DisplayOfScreen (screen); + XVisualInfo vi_in, *vi_out; + int out_count; + vi_in.screen = screen_number (screen); + vi_in.visualid = id; + vi_out = XGetVisualInfo (dpy, (VisualScreenMask | VisualIDMask), + &vi_in, &out_count); + if (vi_out) + { + Visual *v = vi_out[0].visual; + XFree ((char *) vi_out); + return v; + } + return 0; +} + +int +get_visual_depth (dpy, visual) + Display *dpy; + Visual *visual; +{ + XVisualInfo vi_in, *vi_out; + int out_count, d; + vi_in.screen = DefaultScreen (dpy); + vi_in.visualid = XVisualIDFromVisual (visual); + vi_out = XGetVisualInfo (dpy, VisualScreenMask|VisualIDMask, + &vi_in, &out_count); + if (! vi_out) abort (); + d = vi_out [0].depth; + XFree ((char *) vi_out); + return d; +} + + +int +get_visual_class (dpy, visual) + Display *dpy; + Visual *visual; +{ + XVisualInfo vi_in, *vi_out; + int out_count, c; + vi_in.screen = DefaultScreen (dpy); + vi_in.visualid = XVisualIDFromVisual (visual); + vi_out = XGetVisualInfo (dpy, VisualScreenMask|VisualIDMask, + &vi_in, &out_count); + if (! vi_out) abort (); + c = vi_out [0].class; + XFree ((char *) vi_out); + return c; +} + +void +describe_visual (f, dpy, visual) + FILE *f; + Display *dpy; + Visual *visual; +{ + Screen *screen = DefaultScreenOfDisplay (dpy); + XVisualInfo vi_in, *vi_out; + int out_count; + vi_in.screen = screen_number (screen); + vi_in.visualid = XVisualIDFromVisual (visual); + vi_out = XGetVisualInfo (dpy, (VisualScreenMask | VisualIDMask), + &vi_in, &out_count); + if (! vi_out) abort (); + fprintf (f, "0x%02x (%s depth: %2d, cmap: %3d)\n", + (unsigned int) vi_out->visualid, + (vi_out->class == StaticGray ? "StaticGray, " : + vi_out->class == StaticColor ? "StaticColor," : + vi_out->class == TrueColor ? "TrueColor, " : + vi_out->class == GrayScale ? "GrayScale, " : + vi_out->class == PseudoColor ? "PseudoColor," : + vi_out->class == DirectColor ? "DirectColor," : + "UNKNOWN: "), + vi_out->depth, vi_out->colormap_size /*, vi_out->bits_per_rgb*/); + XFree ((char *) vi_out); +} + +static int +screen_number (screen) + Screen *screen; +{ + Display *dpy = DisplayOfScreen (screen); + int i; + for (i = 0; i < ScreenCount (dpy); i++) + if (ScreenOfDisplay (dpy, i) == screen) + return i; + abort (); +} + +int +visual_cells (dpy, visual) + Display *dpy; + Visual *visual; +{ + XVisualInfo vi_in, *vi_out; + int out_count, c; + vi_in.screen = DefaultScreen (dpy); + vi_in.visualid = XVisualIDFromVisual (visual); + vi_out = XGetVisualInfo (dpy, VisualScreenMask|VisualIDMask, + &vi_in, &out_count); + if (! vi_out) abort (); + c = vi_out [0].colormap_size; + XFree ((char *) vi_out); + return c; +} diff --git a/utils/xroger.c b/utils/xroger.c new file mode 100755 index 00000000..039a97fc --- /dev/null +++ b/utils/xroger.c @@ -0,0 +1,106 @@ +/* xscreensaver, Copyright (c) 1991-1993 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. + */ + +#include + +#if __STDC__ +static void crossbones (Display *, Window, GC, int x, int y, int w, int h); +#endif + +static void +crossbones (dpy, window, draw_gc, x, y, w, h) + Display *dpy; + Window window; + GC draw_gc; + int x, y, w, h; +{ + double xscale = w / 440.0; + double yscale = h / 216.0; + XPoint points [6]; + points [0].x = x + xscale * 20; + points [0].y = y + yscale * 10; + points [1].x = x + xscale * 120; + points [1].y = y + yscale * 10; + points [2].x = x + xscale * 243; + points [2].y = y + yscale * 93; + points [3].x = x + xscale * 57; + points [3].y = y + yscale * 210; + points [4].x = x + xscale * 20; + points [4].y = y + yscale * 210; + points [5].x = x + xscale * 175; + points [5].y = y + yscale * 113; + XFillPolygon (dpy, window, draw_gc, points, 6, Complex, CoordModeOrigin); + points [0].x = x + xscale * 197; + points [0].y = y + yscale * 127; + points [1].x = x + xscale * 384; + points [1].y = y + yscale * 10; + points [2].x = x + xscale * 420; + points [2].y = y + yscale * 10; + points [3].x = x + xscale * 265; + points [3].y = y + yscale * 108; + points [4].x = x + xscale * 420; + points [4].y = y + yscale * 210; + points [5].x = x + xscale * 320; + points [5].y = y + yscale * 210; + XFillPolygon (dpy, window, draw_gc, points, 6, Complex, CoordModeOrigin); +} + + +void +skull (dpy, window, draw_gc, erase_gc, x, y, w, h) + Display *dpy; + Window window; + GC draw_gc, erase_gc; + int x, y, w, h; +{ + XPoint points [3]; + crossbones (dpy, window, draw_gc, x, y+h/2, w, h/2); + x += w/100; + y += h/15; + XFillArc (dpy, window, draw_gc, (int) (x + (w * 0.3)), y, w/2, h/2, + -40*64, 260*64); + XFillRectangle (dpy, window, draw_gc, (int) (x + (w * 0.35)), y + h/5, + (int) (w * 0.4), h/5); + XFillRectangle (dpy, window, draw_gc, (int) (x + (w * 0.375)), + (int) (y + (h * 0.425)), w / 20, h / 20); + XFillRectangle (dpy, window, draw_gc, (int) (x + (w * 0.495)), + (int) (y + (h * 0.425)), w / 20, h / 20); + XFillRectangle (dpy, window, draw_gc, (int) (x + (w * 0.555)), + (int) (y + (h * 0.425)), w / 20, h / 20); + XFillRectangle (dpy, window, draw_gc, (int) (x + (w * 0.675)), + (int) (y + (h * 0.425)), w / 20, h / 20); + points [0].x = x + (w * 0.435); + points [0].y = y + (h * 0.425); + points [1].x = x + (w * 0.485); + points [1].y = points [0].y; + points [2].x = (points [0].x + points [1].x) / 2; + points [2].y = points [0].y + h/10; + XFillPolygon (dpy, window, draw_gc, points, 3, Complex, CoordModeOrigin); + points [0].x = x + (w * 0.615); + points [1].x = x + (w * 0.665); + points [2].x = (points [0].x + points [1].x) / 2; + XFillPolygon (dpy, window, draw_gc, points, 3, Complex, CoordModeOrigin); + points [0].x = x + (w * 0.52); + points [0].y = y + (h * 0.35); + points [1].x = points [0].x - (w * 0.05); + points [1].y = points [0].y; + points [2].x = points [0].x; + points [2].y = points [0].y - (w * 0.10); + XFillPolygon (dpy, window, erase_gc, points, 3, Complex, CoordModeOrigin); + points [0].x = x + (w * 0.57); + points [1].x = x + (w * 0.62); + points [2].x = points [0].x; + XFillPolygon (dpy, window, erase_gc, points, 3, Complex, CoordModeOrigin); + XFillArc (dpy, window, erase_gc, x + ((int) (w * 0.375)), y + h/7, + w/10, h/10, 0, 360*64); + XFillArc (dpy, window, erase_gc, x + ((int) (w * 0.615)), y + h/7, + w/10, h/10, 0, 360*64); +} diff --git a/utils/yarandom.c b/utils/yarandom.c new file mode 100755 index 00000000..94f9d70e --- /dev/null +++ b/utils/yarandom.c @@ -0,0 +1,79 @@ +/* ya_random -- Yet Another Random Number Generator. + + The unportable mess that is rand(), random(), drand48() and friends led me + to ask Phil Karlton what the Right Thing to Do was. + He responded with this. It is non-cryptographically secure, reasonably + random (more so than anything that is in any C library), and very fast. + + I don't understand how it works at all, but he says "look at Knuth, + Vol. 2 (original edition), page 26, Algorithm A. In this case n=55, + k=20 and m=2^32." + + So there you have it. + */ + +#ifndef VMS +#include /* for getpid() */ +#include /* for gettimeofday() */ +#else +#include unixlib /* for getpid() */ +#include "unix_time.h" /* for gettimeofday() */ +#endif + + +/* The following 'random' numbers are taken from CRC, 18th Edition, page 622. + Each array element was taken from the corresponding line in the table, + except that a[0] was from line 100. 8s and 9s in the table were simply + skipped. The high order digit was taken mod 4. + */ +#define VectorSize 55 +static unsigned int a[VectorSize] = { + 035340171546, 010401501101, 022364657325, 024130436022, 002167303062, /* 5 */ + 037570375137, 037210607110, 016272055420, 023011770546, 017143426366, /* 10 */ + 014753657433, 021657231332, 023553406142, 004236526362, 010365611275, /* 14 */ + 007117336710, 011051276551, 002362132524, 001011540233, 012162531646, /* 20 */ + 007056762337, 006631245521, 014164542224, 032633236305, 023342700176, /* 25 */ + 002433062234, 015257225043, 026762051606, 000742573230, 005366042132, /* 30 */ + 012126416411, 000520471171, 000725646277, 020116577576, 025765742604, /* 35 */ + 007633473735, 015674255275, 017555634041, 006503154145, 021576344247, /* 40 */ + 014577627653, 002707523333, 034146376720, 030060227734, 013765414060, /* 45 */ + 036072251540, 007255221037, 024364674123, 006200353166, 010126373326, /* 50 */ + 015664104320, 016401041535, 016215305520, 033115351014, 017411670323 /* 55 */ +}; + +static int i1, i2; + +/* i1 & i2 must be between 0 and Vectorsize -1 (Patrick Moreau - Dec 1995) */ + +unsigned int ya_random() +{ + register int ret = a[i1] + a[i2]; + a[i1] = ret; + i1 = i1 >= (VectorSize -1) ? 0 : i1 + 1; + i2 = i2 >= (VectorSize -1) ? 0 : i2 + 1; + return ret; +} + +void ya_rand_init(seed) + register unsigned int seed; +{ + int i; + if (seed == 0) + { + struct timeval tp; + struct timezone tzp; + gettimeofday(&tp, &tzp); + /* ignore overflow */ + seed = (999*tp.tv_sec) + (1001*tp.tv_usec) + (1003 * getpid()); + } + + a[0] += seed; + for (i = 1; i < (VectorSize-1); i++) + { + seed = a[i-1]*1001 + seed*999; + a[i] += seed; + } + + i1 = a[0] % (VectorSize -1); + i2 = (i1 + 024) % (VectorSize -1); +} diff --git a/utils/yarandom.c_ori b/utils/yarandom.c_ori new file mode 100755 index 00000000..228b81ca --- /dev/null +++ b/utils/yarandom.c_ori @@ -0,0 +1,72 @@ +/* ya_random -- Yet Another Random Number Generator. + + The unportable mess that is rand(), random(), drand48() and friends led me + to ask Phil Karlton what the Right Thing to Do was. + He responded with this. It is non-cryptographically secure, reasonably + random (more so than anything that is in any C library), and very fast. + + I don't understand how it works at all, but he says "look at Knuth, + Vol. 2 (original edition), page 26, Algorithm A. In this case n=55, + k=20 and m=2^32." + + So there you have it. + */ + +#include /* for getpid() */ +#include /* for gettimeofday() */ + + +/* The following 'random' numbers are taken from CRC, 18th Edition, page 622. + Each array element was taken from the corresponding line in the table, + except that a[0] was from line 100. 8s and 9s in the table were simply + skipped. The high order digit was taken mod 4. + */ +#define VectorSize 55 +static unsigned int a[VectorSize] = { + 035340171546, 010401501101, 022364657325, 024130436022, 002167303062, /* 5 */ + 037570375137, 037210607110, 016272055420, 023011770546, 017143426366, /* 10 */ + 014753657433, 021657231332, 023553406142, 004236526362, 010365611275, /* 14 */ + 007117336710, 011051276551, 002362132524, 001011540233, 012162531646, /* 20 */ + 007056762337, 006631245521, 014164542224, 032633236305, 023342700176, /* 25 */ + 002433062234, 015257225043, 026762051606, 000742573230, 005366042132, /* 30 */ + 012126416411, 000520471171, 000725646277, 020116577576, 025765742604, /* 35 */ + 007633473735, 015674255275, 017555634041, 006503154145, 021576344247, /* 40 */ + 014577627653, 002707523333, 034146376720, 030060227734, 013765414060, /* 45 */ + 036072251540, 007255221037, 024364674123, 006200353166, 010126373326, /* 50 */ + 015664104320, 016401041535, 016215305520, 033115351014, 017411670323 /* 55 */ +}; + +static int i1, i2; + +unsigned int ya_random() +{ + register int ret = a[i1] + a[i2]; + a[i1] = ret; + i1 = i1 >= VectorSize ? 0 : i1 + 1; + i2 = i2 >= VectorSize ? 0 : i2 + 1; + return ret; +} + +void ya_rand_init(seed) + register unsigned int seed; +{ + int i; + if (seed == 0) + { + struct timeval tp; + struct timezone tzp; + gettimeofday(&tp, &tzp); + /* ignore overflow */ + seed = (999*tp.tv_sec) + (1001*tp.tv_usec) + (1003 * getpid()); + } + + a[0] += seed; + for (i = 1; i < VectorSize; i++) + { + seed = a[i-1]*1001 + seed*999; + a[i] += seed; + } + + i1 = a[0] % VectorSize; + i2 = (i1 + 024) % VectorSize; +} diff --git a/utils/yarandom.h b/utils/yarandom.h new file mode 100755 index 00000000..53b22fd8 --- /dev/null +++ b/utils/yarandom.h @@ -0,0 +1,19 @@ +#undef random +#undef rand +#undef drand48 +#undef srandom +#undef srand +#undef srand48 + +#define random() ya_random() +#define srandom(i) ya_rand_init(0) + +#undef P +#if __STDC__ +# define P(x)x +#else +# define P(x)() +#endif + +extern unsigned int ya_random P((void)); +extern void ya_rand_init P((unsigned int)); diff --git a/xscreen_martin.txt b/xscreen_martin.txt new file mode 100755 index 0000000000000000000000000000000000000000..35278c2549935dcbe3104cb7b363e6acc7810103 GIT binary patch literal 5378 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 literal 0 HcmV?d00001 -- 2.39.5

0_O%@x zpL_IORQh&mJRCa3des}sOSf}jP)!C2jRqhaBG z%0VE)WmxCZ4>fT0(=nml=-Gmaw28VFcl`-WcbhF8=+=nsGZx$-JZFcvo)<8inv=q=xeVNy|=9{ zcGGx^vsb&hsOjUfX*A|Z=p&B0L?4tNPqxi7I)vBai78pe^Jo_7@U-4xzAj+;gsp=F z4An*nn7};jor?~}(P*ybBSYpIZ0O)FjYOQ#taLztPEZY@pg6S=r2;^9_J8aTFZE%b z(9ghT(77@Q;X$Z@4mSq!+})i4t=H zhwh~82YL<8rJc}lXjf24=j8A`=Vs7jSg=FD$-v?Fe6-m8bWL?{z^&XkHeYahsGBKW)Kn_rho}r zYi#PxOWWLwZA~9-Qm|mGuVqMjUwf1O(4a)CZP9~*v1yKDqBoL=4gv~sfb+gnv} zSt?@%-ht=aqBs@&xX-AC2RV!d>Jh0cq{Z^W^aYDU8b_#_G7@Jdgz%@lh_n9g$1FTy z&Wywd2OBJGJcEhsyC`8O7B+>MaomhDfzx5^ZmOFYy9dWe7R%bTe_<~()_*VW!PuAe zuB1nZUbJ{&=G|FK)0aHHz?Ld!CnO}^%N{~UE(RrB)}f0n%CrxPO=XSL%I+|gNhB0hhN=*wTfR6e#HPEL?wWv2ut1oo%h`?51)OUfr?FZwR5M2Gu;@JohiYXU zh~VjAvFV14`B@8%!3>7XFzx>&|IrahiNEW<^3uE#r_)uM^Q^PPnmBXT-09Zb_13TD ztSxj}SLQrd=qi1t&>H{ra~o1z&a%?H9Jh03Uh&%dSa!B8b7^*lynMNx%_u1@E@LzK zr@dsIlg&UsNAYt8>#>}oQt;LmyNcON{;3N=cUewR5u0gL78Vy3m#ockGrjrQ!qRm) zXw{F8FJkx836dis^0~hI*EoyUI?GDdgEJ=~p&W(XPud41hUrZX^bBZ(q{Eq?v#zL& zO~|r3OG=7Mtc5P?w9@1W%o^`1cID^5z?t_=U|?C-xk{XQ#cN!JrA~*n*j-jw?6TfD zt@O?bY&j=N(KoMXox_=IWfLMItmwq7^KweoJj$k9*~|%y4}C##agj5}#W+|2B47~9 z;A6&Eb93^ZSyNKH&gEbW2CKQnB@Sl^$B8{wT;en&hK-Xwt^*sy(^2dyTZprkWa@4S zoOa}supz!pUGH|5>r1g2FNj9xIJ2yGPQS4abEXgfG z9VX>L| z0g4_gD$Xfm(4<$O!r(j?-~=krsyBtGd)!s#glCwpE2PiSlp22N;b8+e8UJLe=` zB{S_%x~TB&vIy3#Uh zuG5;U&-Lk6S8*BmNCDPq4(qhM;c_`Hqz;bM5YeLikz}p;)tY}JEx@7 zY2^Unbb8jxD_&RRphjfc;=G))(DsnbLWaTiS%FU&c@-TL8EmB5;E)Pk&*l^rI;>@d zYn^;VC7`XPZf9O$ej&~s$d~|vj4nkwbva6{k6PzEOnH}*snN8y(6z42c~uiGRssn- z*I8P|uzr*k=B+8oS#MPN*tv7`8Z}|jDsnP+sdJs9Sm!zlk;%*Sx^-F+cZoHjd|FX? z0PtY0-{5pu_3RvKo~t;(e6Fypz=|QGce!EvU}JHQ#5ydL}f=pKiJB!M4baxJs=L#ON68!5* zA?-3y@~qibT$orFm%FWZ({=3dzf|a1#;Q%xAOAze_wxV_8V*7pSAnnb0h12+F7^Z&fU@PEj+mUD-Rcb z^Yv8wZw|)1+Hj9~=l}Urn)l4_lhU4W&fWIz(VYGB)*j!q`FpRv<|vB2>;BzOzi2!7 zR^{dIj$gUx#Fry(TbZ`LWI^~lOESlA(vrWmW&e9`sL#0`-M#Xn>yD(izUe#>Ip^mG zKl`^|KA<`Ow)6IzmHr=p_`w5v8xrD(lPbU-z3}0kJUbVT$pwI@{0M&ON#4% zEHsr#-KSE_DzTJEcB_E{}<=ZGfM5#gf70Np( z$576obfEO1n4vuu#fmZ=szYs!y7xf>6&_6-F zCWQV4>i-c!{|@ziA@rY6KO90IMg4dP{XXg^L+FoC|2TyH6!i-sbSLVUL+C50j~h2Q zzG&1ZhtL)PaW^pf=ifg*0vp-B_@}CTmo93Wy~_9E6-~1#btb77CMQ-)9$1E0F zJSV*L{{ye*l-F~{>uFQ(P?;*AWT*>vcc4?GR>3<(Pipm?h?$`5K2bX_>V{THI4(EK zp7yDKX!Uf&Oi(=?enHEjGuN4Fla$l*0Ip=3$M%_E|HFOU{ulZ+ExpS3&Sw}#xydQ- z4R<#Fn(eKiyC?D{^#2aGyzxz@%3hxxomA8@qHlu#lL~2*w>Fjc0~hjPniG5sWq~6m zqE$LhmFUmPMS0cUxK*SsSy%TqQ{%jil}v4Xo0MT8WqSpARk^rolh?5~7F^Ob8EjJ| zw^#cT>b5H1rVdS$Ro^if;@x+HpyomBQ`~)0^VB-CT4w@TJC_4Gsj@<&Gro(~s7bAo zci$8e7q#Dm(IR2C0f%jAN}XA1UL6x1(Y)PK7a1-7D6KM0G6BoJNmYlp3_Nv{_B`aP zv{&%?WR-8gr)evyd=3EX^P=qK+*3&-w0w6)k;7y4d9RK?r~{D`Ok5q+s#w8?wpxJxc$fKbgbJOB() zgW`5@_X;){U~lsJR-)71ShNt1&1l-ViR3U^8w{#5sj!wTQhi%s8^X~ap}jbV^w!5J z^|7*2Bcqt=Eo!|5qbcT1J_fB`pG-Y`5{;=o4(eB;(R(Cg0CMM0ZLTv3v0;g)nG(HH ztu?8>dr1D!{et?8-=uv7ws;Sv5+P~{AX+k8VGBCE29&3Qk<}`dn=&N@)}>XYX57|swx}>+o2}9&HAr%UDDPb%&IC6uEO9LcP{f(q zMx0m`V8Jsq>_cUO_fWA=<@>1>mixs5Me^N`$)wa<dK*@Im-st<$z2wLAjhm{q(~wi^t-$?PP@&exLRkfBx{FuVM+SV| zoL&=;^wrOhX3`<2)=xpFI693~Z&vAltoP7PoaI%)Z}Kg_iyB-3{%-JpMf`_2zur`( ztwqT(x$mc#v8wM?d?M#of~82Zj>or&kn3Zk zaxjV$CbJEQ1TYhk9|+Hk{O#bvvc5=)?f7H;CRtOa!jpJ1_<*=>F|AB*X^%DQe#U(V7{3 z8!3FH=9w7yF4B8ss=wM(seAEhlIG4AH5ae@1>gD^gDQNhZ-G4mUmIv``+E1_qBa{* z@hUB9_Lg*7)RM5M`7GxFrX6wEl}K2m4_()i&@@i#MbjA9wRFC&*|Dy@#XE(pYe}Q6 zYu}+WV_loAoW{z4b!`gU7Yo~e(}i`77Ub6L7A%d(?o<&>t-c>#LQ#UEqV7obkJoO6R<$-#tu?DPk!lTAl*nM4hNmr97|_qwljmvgsWo{nK%3l? z>*?sJF?l+BYR#VRp4v#y<(?X|r?;mj(sM->fz6`>+_1Jv zD@Vi1o1S({^%kA+3>YhJDg*-(krHn*^BVCacU>&!xp;+GsqVTdx>!7~5iiAEcel>7 z@*44y+;!7+UL3CxFTriDU%j!uU}L>|Lim(Zx(e#G_gheV$cOBfqBxl9u26zX5^=|th0j2V4Ih27Fa416=#;7kJ zCQvy{05%PkSV5#~SGk-k+w<*G6->iiHs>0Z$Ql#XLX4Oc**gl-mz!?rH z-L-2Y$v&OF!#rGNL8yk8hHKb0oN-WBnJ&2w^7BhiOFJUD!P_#Mb8F1FOsO%|&}B+y zWoC`#x-d4wV?&V|Gq&cdFjWGW@(RaP`Qn(G5ln>Oa4d(a8WWag#3WZW977m*-565P z4~1;Z7@DsgmuCVP@(RcB%r!AIV?xq6Ln3x$42P;32}3jH^)OYVUMehkMRe?jc7 zj=SCfX1u~N>m560qs7}$6`zaMsBs2^#)^^o`tzU}IeAz_UNiqiYDWI!6^>b?HZ1>{ zk@$zj!WiRhs48Gb%f~QPV~sNy`1fNtYMhOZ-PLhs4PeGA95d_KF&iz;hN}2ntVWG9 z81#iP8haiKVicT%!Ik`~HDGoCBVOSc%^nq_G3TwJDnc8gNL(17dDM=LdH{Rz(Ge2N98r) z7$r_Tyyxe_Fj{!Pifax33tSBaq9eFU1%u(5SKFRC0}eWJIO+^IuKUu*!!-bw>%ZcG zRo4&CRnajzELTTIg8>H}IUEhwgk!Ym;5|PVhEb!VVeG@dcFqV6KR79Z;c->2XfcLQ zM?UnfDlRn4@~PZRFvp zyQJzSWuThhGdl8UJEzYC=$Sg*3;GQ1DIK|ekXDGE2-;rVJC=nPPh2blqKHJ#TO_hUM}DnQTWw5QH6?cN~CM;Qmwp2Ek_TC7 zy<}L5i%=LL)w^K>zeYxVh^21ubxS3Dizg`@V5v0R(ycf@DjDjcYk5=)0*Dp>QMc0tutC&xC1uuZo zOEh*^=>k+-j*N7{R8mH_h72@u^Vbe8nhxr6WTFd(a=C*+xq~D}7N)?$*D$7dj%7-H zIYty;Uk>q6ty*Xyq^_aT~4N#-yP*!bYnOWRh;9Rktx|IFe+eRfjT3x6z6N&YmTSFS>W^~nsRSrCRl02x>skFshJpnxAAH4vtda*_V{G@P5FwH z)#{7+8=gNEDq)^lCCl^6YEP{iZVcF@Ro}!_x{dyu(SIGD`=R4-$#uG95e&ey<{Age zYLrzdStxcCDKQn#gj;Id$~c@vx9A7Z_&w6tlr>akm39|2+WjWdBpK2>ApO&kq;)a7 zA@-jTdt-F5EJN%d#P*IZw#pEDA7aNw7h7$JwL|Q`Mi+A!VgnHC8C|Tv5VM4N8zaI- zz(pTvk-Of!$z30Z5|5I!$-RPC{gFqKvAHdhRUPi=K}_Fz3^A?x<{_rNO&xwrg&AMM z?tnZZsL z{K4vddj(Gi?KC+HnjU6*I#f?LwhM%5za@^RL)w;-tH_cGn_X!B!Pb|_)?&=R3{1Rq z%sad4d+D!a^ENVMJ^Fd`iKx=PjyktFU2lZRD|Ja4-ExxL36r;h%B6?xyi(otat}9o zo1c2Az9a8(lm8IIO-|S=K!9w1kSvsJDoC|yYmaJ!)nUW~L*BL^PqE2SFdA3ovQ4pN zw%Ve@Fp86&ZRxM%#mo?tbo=r2t$AtRPpgT+V zN?vr!Hm912Grj^7ygN-^&$cS<-%zKq;qmk>-ksyY(}^3sJ0k-`v`N7OaqmtG@A2f2 z99VcfyDt`lCbzaNfH+40$A`$b<=5J(N1hqsrnviTzUaaPBo zn0QcdH5MBsQ?=*Z^O&Nwg&d1ihz??L4=6XLU=WKt$k4{G1B)ln1T1Fbz_IXKuscgK zZA4t0AuNs@=Idhz%p9Din3e4W$8iW#XtV>4!>9+~phm#)7CNDk;HV=>f`cd?8oYu_ zeSM0y1CDmUF};PuF&W~3BN3r-hQqNH3=YQ`z|p3|v6^^j55N(Qxz<9l5woTm+Z<%I z&Vs!T2#h~YB5lz(gO%@X`~gOtj;?5U6o;r}64ph-v`SqxP8Y3%=>58A42ez>I7aV5 zNb$5Ik;yR;oUtuqG`~AuKo^sf!pOYQ(;bzrw;@s6V#c5J zbjVTR!bwlJjJ=reMh(iwLQktLCcFh*?riaN&`^a|>}HI@meDodcjE-L0NC%t4{i@5 zsWp2#=1rZ}>gkORZ}oJ?+)9$sSer=ntGej_3W|2mn`(vVP$}%0BZXf#r1sDA^rpQ# zFAc|TY{5(0dmg(qHEg4#nC9!F|Ihla90asEUG>Fcx%4*mQb318hu1+wmDZ2n^zwkt z&>IoZA7ilsK>__Yw0d!6!l_*BP^$-~s&(7(Adm z5YXLvKvxhC3IYL5YYyUBUv98x3fq6MH2Kb8mn?O)VIf&UdgVA%OIlQzBBv=Broi`- z;v(4Cf_h|}7T{5Q@@=U{ItNUwZ_>VbnBi;xqEGF?9fG#1g-2gzPty4)o_)1Fbix%e z@yd#{S8`(RfIqk9NZ*&R+)cvg%GiiXNouf4m!+KJ5QzS$bw%{J!(vuq4;FBBMV0o8 zNF7Q{!f}U%tVAysKeM_5nE)I!Nj3o;@6H>8yq2uQ-+?7~cg6*I3glkra(55%Oj(KF z=e(JNJRvJ;6YrZe$P3GgdYbbV4f4XXqB6iUR*{_&T1?tR*h(QEei&UI3bbYMw$2+u z+HO@>sJ;_eHoZG@RV@tN(7PQH7-8!QB!(66PaXBhs-T|{M~5rFj7Pj@RSXbiR-eSS z%J&&D;7~0lEU}s?PiA7xaw$JItyD78mDf#jOIqu`m)Mu$m5*M=@@?1CNt#rZ;=rcT z^yu+Qnk_0Cdvnv8(;zq5>u1_*oKvxRjwvqB5v;q_oPi^*)&w4elaOFk3C0}* zjlHV;x+cb?*swleC%Df<9HrMoHddzagW>?ZPly|o<&j}Gv#`;^l>w1g32OCJkj3xa$sC%8_}34&zMSy(2tm1qHsmOyYlJ9u`? zG3=W+VgX-{;dA5_LA#4YLY+=manYQqJN;>@?~7!**Y73@K{}$Y_r{N)>i}o!x^CyX zEQYQV)B;^tV-t`A3;)P-pm{I{!U4#E*NxMgq#r(~3lRLyV7PG@zDbMcTpJJX&8Vxj zR_yjvYAtfK`Q(8wBa5X8&9WFh{^Wt%h0Lh=&9aH=Q9@eOtY%rDx=Bcnx~o|Zqk0ds zN5wYF;Z*;WVR1frK*eTn*{;}ePXbFrrjnV38C+}f9{3$o+vyiR*cnT<@ug%xZV%AD zRnt=^>r8gVL7@^zKlkYA#}*PJd5CuhzL#Ld2_&D7Fi+niEv?dsK6(&sSNZ!+&eVOh zf$B9@-Q9DDfQ#5XeJ^eQ0o!&QK{=1$dFrOk!TRsOIdZ_Rww z=@*Oeql6k6wJ_A+zDa2I?l9vzF;vAY)%X6NNJT!W=)!Ftu43Q6vVe|#KccFkgnref z2s=!K`;H z&VeQEm27f@>{Nt|lgKM4U#E47WF2XGXBiS{kjQH=*&0mtt~nXrmNdmFDRbqR$q40` z$+6MRvJ?}2OV~a+4cBaBrtl3}l3?ck57^$=G+UwP>}MuqD*TFKmZx|1EYFqgbo&9ZNqe(@jPc^fQf8@Y zyIF3nGsRe1bED0zH75SmlD==Z)|z81E!cgHAC&xx!S@9SpXS^=F3_A?;Q%_Z^U>=L z?1QbaE@Le2=0N|$f~QxhXz1+Ia2cE;5V^l%^N%W7Zrc6{H72?+J)DN7Y4{#cvAJ-K z=IP-4!xH@}3qQ$f_vYdnA8A6xPgGlLBjYA0H`PX#*G3Ap7UT%B>f{?!B<#bNAdkf1 z53jbK!rOf$ey;%I3VZ3t+KjT~d0As!Q`O)k|q`;Z5V;W=ecVlWKgNOD6@Uy@_ z1O7Y|3;32t^>g90*szawWJfwT%x7*?-bBHTNd9i9Q@D?R3SYn9#ua7(Zq*#btt%_O z_moeBZ72n}cVPid9p1)e_;!2??tpw7N($OiAm4^I3vMl!qcHrg1uTXuFg67z`~V=B zaK0iOyJ654)L%v^L-{qz67ZLR|7(;pSPBT&zkt^VdL!zuL8b+K`kRi%RQzzRU@4O0 zbjDsnSp_WG<8_?bWAwXQGIr=+%24vUDdTNXf%jp3VLf{P;ES@paQ|`o8??S~zd(m^ z`YW~qpY}`An0bOGEum;H8xYk*+#+j|Z4677vZ=&s%J(dZ}t!L_xdm69fn}C-Y`jI zAB#etC|qe5h4Z4&CJG(xqUifXG;5-G{`~n%eO>)x7?kT2)qBL3NvqVQSg0BRjQzAN|^#6;oT1)R6XCz{x~wzI7B z!ih7Yc=~Ub``86hWFK`v*D1(%Q}^@We9(o8DB!cbyQgcSN!V@CJu&#gL^$FDtTvzP zh(7=-%N|yVC(IFRi=TC77Ztjkz^e}Y$USTkR=)58dVLpo7ePerVM&Q__n>3Ya184Y zz?JW_(E0oXZucO#?W2JE6_JTz_XVw&59H(-){jb8*X7ISm>8ysLg&f$^XM8y=SPZb1>3Hql7d;~A+=;(mkIxcpK!o{KWi=4whd2459 zr#P)s_ywc?HB8t+|Dj_C>%P!0&g~b?c!c6ZKzs(9PoL|&c#-<@$Uty>+{^lI|1E;$ zQ`meMKJ6F7`;Puq|HIJEOcVy4BrmotPnQ=iwjt6ZXCu~F?koxw_%<}a^&jAZYl55J5S2~uXM%we8ZZ^7KZ15rP3+K)XY~QZ;wp>}z<6I% zs0dvNVF2*~5#zm0!$lBaXJajd)!P(coxYCCzRQC` zf41K*iXY%Cem-gazCPB${1^JzCH{Gql0g{R;rI1i#DMKIUr9n7c)HTU*Ox}&Dq8I+5D|h zkUIjo7{Hr?30>&OE-M~X@l7=047<=|A?F!3@Hb1L=MufSdsuToF*VuS4j{#-l$K0GtP+WIN|_4s>wyV;9Z*vD`#Jbd;FPaZeGOT9nu>(T=M zy2&x){7Cc2?0eb=c+$T7=l=6OeR#1ec?j!(*t=U4$ff<@@{lsoV$g}Fi9J{=5F;TZ zIl3D$_d5uj>k-ZD#U9Xjw6p;f!sosz7V0~V@cFpI*UK*Uvva+ddsqjKJ(qe|AFLY? zC-_gcQ`VWJhn;!Fe7qZW(ekCp_#HSy#QL0Uyh71YycU{m&, 6-dec-92. diff --git a/hacks/hypercube.man b/hacks/hypercube.man new file mode 100755 index 00000000..daa66899 --- /dev/null +++ b/hacks/hypercube.man @@ -0,0 +1,93 @@ +.TH XScreenSaver 1 "6-dec-92" "X Version 11" +.SH NAME +hypercube - 2d projection of a 4d object +.SH SYNOPSIS +.B hypercube +[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP] [\-background \fIcolor\fP] [\-color[0-7] \fIcolor\fP] [\-xy \fIfloat\fP] [\-xz \fIfloat\fP] [\-yz \fIfloat\fP] [\-xw \fIfloat\fP] [\-yw \fIfloat\fP] [\-zw \fIfloat\fP] [\-observer-z \fIint\fP] [\-delay \fIusecs\fP] [\-window] [\-root] [\-mono] [\-install] [\-visual \fIvisual\fP] +.SH DESCRIPTION +The \fIhypercube\fP program displays a wireframe projection of a hypercube +which is rotating at user-specified rates around any or all of its four axes. +.SH OPTIONS +.I hypercube +accepts the following options: +.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 \-mono +If on a color display, pretend we're on a monochrome display. +.TP 8 +.B \-install +Install a private colormap for the window. +.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 \-delay \fImicroseconds\fP +How much of a delay should be introduced between steps of the animation. +Default 100000, or about 1/10th second. +.TP 8 +.B \-observer-z \fIint\fP +How far away the observer is from the center of the cube (the cube is one +unit per side.) Default 5. +.TP 8 +.B \-color0 \fIcolor\fP +.TP 8 +.B \-color1 \fIcolor\fP +.TP 8 +.B \-color2 \fIcolor\fP +.TP 8 +.B \-color3 \fIcolor\fP +.TP 8 +.B \-color4 \fIcolor\fP +.TP 8 +.B \-color5 \fIcolor\fP +.TP 8 +.B \-color6 \fIcolor\fP +.TP 8 +.B \-color7 \fIcolor\fP +The colors used to draw the line segments bordering the eight faces of +the cube. Some of the faces have only two of their border-lines drawn in +the specified color, and some have all four. +.TP 8 +.B \-xw \fIfloat\fP +.TP 8 +.B \-xy \fIfloat\fP +.TP 8 +.B \-xz \fIfloat\fP +.TP 8 +.B \-yw \fIfloat\fP +.TP 8 +.B \-yz \fIfloat\fP +.TP 8 +.B \-zw \fIfloat\fP +The amount that the cube should be rotated around the specified axis at +each frame of the animation, expressed in radians. These should be small +floating-point values (less than 0.05 works best.) Default: xy=0.01, +xz=0.005, yw=0.01. +.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. +.SH SEE ALSO +.BR X (1), +.BR xscreensaver (1) +.SH COPYRIGHT +Copyright \(co 1992 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 , 6-dec-92. diff --git a/hacks/imakefile b/hacks/imakefile new file mode 100755 index 00000000..d2276c49 --- /dev/null +++ b/hacks/imakefile @@ -0,0 +1,75 @@ +/* + * Imakefile file for xscreensaver, Copyright (c) 1993, 1995 Jamie Zawinski. + * + * You should not need to edit this file; edit ../config.h instead. + * + */ + +#include "../config.h" + +#ifdef HAVE_XPM + /* Yeah, this means that all hacks link against libXpm even though only + one hack actually uses it. It doesn't matter: it's a library. */ +# define XPMDEFS -DHAVE_XPM +# define XPMLIB -lXpm +#else +# define XPMDEFS +# define XPMLIB +#endif + + UTILS = ../utils + INCLUDES = -I$(UTILS) + DEFINES = R5ISMS XPMDEFS +LOCAL_LIBRARIES = $(XMULIB) $(XTOOLLIB) XPMLIB $(EXTENSIONLIB) $(XLIB) -lm + HACKS = attraction.c greynetic.c helix.c hopalong.c xroger-hack.c \ + noseguy.c pyro.c qix.c rocks.c rorschach.c blitspin.c \ + imsmap.c slidescreen.c decayscreen.c maze.c hypercube.c \ + halo.c flame.c pedal.c lmorph.c + MEN = attraction.man greynetic.man helix.man hopalong.man \ + noseguy.man pyro.man xroger.man qix.man rocks.man \ + rorschach.man blitspin.man imsmap.man slidescreen.man \ + decayscreen.man maze.man hypercube.man halo.man flame.man \ + pedal.man lmorph.man + TARFILES = README Imakefile screenhack.c $(HACKS) screenhack.h \ + vroot.h xlock.h default.xbm $(MEN) .gdbinit noses/\* + +all:: + +echo_tarfiles: + @echo $(TARFILES) + +#define ScreenhackTarget(p,ps,deps) @@\ +all:: p @@\ +p: deps screenhack.h ps.o $(DEPLIBS) @@\ + RemoveTargetProgram($@) @@\ + $(CCENVSETUP) \ + $(CC) -o $@ $(LDOPTIONS) deps ps.o $(LOCAL_LIBRARIES) $(LDLIBS) @@\ + @@\ +InstallProgram(p,$(BINDIR)) @@\ +InstallManPage(p,$(MANDIR)) @@\ +clean:: @@\ + $(RM) p + +HOBJS=screenhack.o $(UTILS)/resources.o $(UTILS)/visual.o \ + $(UTILS)/usleep.o $(UTILS)/yarandom.o + +ScreenhackTarget (qix, qix, $(HOBJS) $(UTILS)/hsv.o) +ScreenhackTarget (helix, helix, $(HOBJS) $(UTILS)/hsv.o) +ScreenhackTarget (pyro, pyro, $(HOBJS) $(UTILS)/hsv.o) +ScreenhackTarget (attraction, attraction, $(HOBJS) $(UTILS)/hsv.o $(UTILS)/spline.o) +ScreenhackTarget (rorschach, rorschach, $(HOBJS) $(UTILS)/hsv.o) +ScreenhackTarget (hopalong, hopalong, $(HOBJS) $(UTILS)/hsv.o) +ScreenhackTarget (xroger, xroger-hack, $(HOBJS) $(UTILS)/hsv.o $(UTILS)/xroger.o) +ScreenhackTarget (rocks, rocks, $(HOBJS)) +ScreenhackTarget (noseguy, noseguy, $(HOBJS)) +ScreenhackTarget (blitspin, blitspin, $(HOBJS)) +ScreenhackTarget (greynetic, greynetic, $(HOBJS)) +ScreenhackTarget (slidescreen, slidescreen, $(HOBJS) $(UTILS)/grabscreen.o) +ScreenhackTarget (decayscreen, decayscreen, $(HOBJS) $(UTILS)/grabscreen.o) +ScreenhackTarget (imsmap, imsmap, $(HOBJS) $(UTILS)/hsv.o) +ScreenhackTarget (maze, maze, $(HOBJS) $(UTILS)/xroger.o) +ScreenhackTarget (hypercube, hypercube, $(HOBJS)) +ScreenhackTarget (halo, halo, $(HOBJS) $(UTILS)/hsv.o) +ScreenhackTarget (flame, flame, $(HOBJS) $(UTILS)/hsv.o) +ScreenhackTarget (pedal, pedal, $(HOBJS) $(UTILS)/hsv.o) +ScreenhackTarget (lmorph, lmorph, $(HOBJS)) diff --git a/hacks/imsmap.c b/hacks/imsmap.c new file mode 100755 index 00000000..4d2bd661 --- /dev/null +++ b/hacks/imsmap.c @@ -0,0 +1,443 @@ +/* imsmap, Copyright (c) 1992 Juergen Nickelsen + * Derived from code by Markus Schirmer, TU Berlin. + * + * 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. + */ + +#include "screenhack.h" +#include +#include + +#define NSTEPS 7 +#define COUNT (1 << NSTEPS) +#define CELL(c, r) cell[((unsigned int)(c)) + ((unsigned int) (r)) * xmax] + +static enum mode_t { MODE_H, MODE_S, MODE_V, MODE_RANDOM } mode; + +static GC gc, gc2; +static Display *disp; +static Window wind; +static XWindowAttributes wattrs; + +#if defined(sun) && !__STDC__ /* sun cc doesn't know "signed char" */ +#define signed /**/ +#endif + +#ifdef VMS +#ifndef __DECC +#define signed /**/ /* for VAX C */ +#endif +#endif /* VMS */ + +static unsigned long *pixels = 0, fg_pixel, bg_pixel; +static int npixels = 0; +static Colormap cmap; +static int timeout, cycle_delay; +static int cycle_p; +static signed char *cell = NULL; +static int xmax, ymax; +static int iterations; + +static void +initwin (dsp, win) + Display *dsp; + Window win; +{ + int fg_h, bg_h; + double fg_s, fg_v, bg_s, bg_v; + + enum mode_t this_mode; + static Bool rv_p; + static int ncolors = 0; + int shift = 0; + double dshift = 0; + + XGCValues gcv; + + XGetWindowAttributes (dsp, win, &wattrs); + cmap = wattrs.colormap; + + if (!ncolors) + { + char *mode_str = get_string_resource ("mode", "Mode"); + rv_p = get_boolean_resource ("reverseVideo", "ReverseVideo"); + cycle_p = get_boolean_resource ("cycle", "Cycle"); + ncolors = get_integer_resource ("ncolors", "Integer"); + timeout = get_integer_resource ("timeout", "Integer"); + cycle_delay = get_integer_resource ("cycleDelay", "Integer"); + iterations = get_integer_resource ("iterations", "Integer"); + if (iterations < 0) iterations = 0; + else if (iterations > 7) iterations = 7; + pixels = (unsigned long *) calloc (ncolors, sizeof (unsigned int)); + fg_pixel = get_pixel_resource ("background", "Background", dsp, cmap); + bg_pixel = get_pixel_resource ("foreground", "Foreground", dsp, cmap); + + if (mono_p && fg_pixel == bg_pixel) + bg_pixel = !bg_pixel; + + if (mono_p) cycle_p = False; + + gcv.foreground = fg_pixel; + gcv.background = bg_pixel; + gc = XCreateGC (dsp, win, GCForeground|GCBackground, &gcv); + gcv.foreground = bg_pixel; + gc2 = XCreateGC (dsp, win, GCForeground, &gcv); + + if (!mode_str || !strcmp (mode_str, "random")) + mode = MODE_RANDOM; + else if (!strcmp (mode_str, "h") || !strcmp (mode_str, "hue")) + mode = MODE_H; + else if (!strcmp (mode_str, "s") || !strcmp (mode_str, "saturation")) + mode = MODE_S; + else if (!strcmp (mode_str, "v") || !strcmp (mode_str, "value")) + mode = MODE_V; + else + { + fprintf (stderr, + "%s: mode must be hue, saturation, value, or random, not \"%s\"\n", + progname, mode_str); + mode = MODE_RANDOM; + } + } + else if (! mono_p) + XFreeColors (dsp, cmap, pixels, npixels, 0); + + this_mode = mode; + if (!mono_p && mode == MODE_RANDOM) + switch (random () % 3) { + case 0: this_mode = MODE_H; break; + case 1: this_mode = MODE_S; break; + case 2: this_mode = MODE_V; break; + } + + if (mono_p) + { + npixels = ncolors; + pixels [0] = fg_pixel; + pixels [1] = bg_pixel; + } + else + { + XColor fg_color, bg_color; + + if (fg_pixel == bg_pixel) + { + HSV_AGAIN: + fg_h = random () % 360; + bg_h = random () % 360; + fg_s = frand (1.0); + bg_s = frand (1.0); + V_AGAIN: + fg_v = frand (1.0); + bg_v = frand (1.0); + if ((fg_v - bg_v) > -0.4 && (fg_v - bg_v) < 0.4) + goto V_AGAIN; + hsv_to_rgb (fg_h, fg_s, fg_v, + &fg_color.red, &fg_color.green, &fg_color.blue); + hsv_to_rgb (bg_h, bg_s, bg_v, + &bg_color.red, &bg_color.green, &bg_color.blue); + } + else + { + XQueryColor (dsp, cmap, &fg_color); + XQueryColor (dsp, cmap, &bg_color); + fg_color.pixel = fg_pixel; + bg_color.pixel = bg_pixel; + } + fg_color.flags = DoRed|DoGreen|DoBlue; + bg_color.flags = DoRed|DoGreen|DoBlue; + + rgb_to_hsv (fg_color.red, fg_color.green, fg_color.blue, + &fg_h, &fg_s, &fg_v); + rgb_to_hsv (bg_color.red, bg_color.green, bg_color.blue, + &bg_h, &bg_s, &bg_v); + + if (/*mode == MODE_RANDOM &&*/ + ((this_mode == MODE_S && (fg_s-bg_s) > -0.3 && (fg_s-bg_s) < 0.3) || + (this_mode == MODE_V && (fg_v-bg_v) > -0.3 && (fg_v-bg_v) < 0.3) || + (this_mode == MODE_H && (fg_h-bg_h) > -30 && (fg_h-bg_h) < 30))) + goto HSV_AGAIN; + + switch (this_mode) { + case MODE_H: shift = (bg_h - fg_h) / ncolors; break; + case MODE_S: dshift = (bg_s - fg_s) / ncolors; break; + case MODE_V: dshift = (bg_v - fg_v) / ncolors; break; + default: abort (); + } + + if (mode == MODE_RANDOM && + ((this_mode == MODE_H) + ? ((shift > -2 && shift < 2) || fg_s < 0.3 || fg_v < 0.3) + : (dshift > -0.005 && dshift < 0.005))) + goto HSV_AGAIN; + + if (mode == MODE_RANDOM && this_mode == MODE_S && fg_v < 0.5) + goto V_AGAIN; + + for (npixels = 0; npixels < ncolors; npixels++) + { + if (cycle_p) + { + unsigned long plane_masks; + /* allocate the writable color cells, one at a time. */ + if (! XAllocColorCells (dsp, cmap, False, &plane_masks, 0, + &fg_color.pixel, 1)) + { + fprintf (stderr, + "%s: couldn't allocate %s writable color cells. Turning off -cycle.\n", + progname, (npixels ? "enough" : "any")); + cycle_p = 0; + goto NON_CYCLE; + } + XStoreColor (dsp, cmap, &fg_color); + } + else + { + NON_CYCLE: + if (!XAllocColor (dsp, cmap, &fg_color)) + break; + } + pixels[npixels] = fg_color.pixel; + + switch (this_mode) + { + case MODE_H: fg_h = (fg_h + shift) % 360; break; + case MODE_S: fg_s += dshift; break; + case MODE_V: fg_v += dshift; break; + default: abort (); + } + hsv_to_rgb (fg_h, fg_s, fg_v, + &fg_color.red, &fg_color.green, &fg_color.blue); + } + } + XSetForeground (dsp, gc, pixels [0]); + XFillRectangle (dsp, win, gc, 0, 0, wattrs.width, wattrs.height); +} + + +#define HEIGHT_TO_PIXEL(height) \ + (((int) (height)) < 0 ? 0 : \ + ((int) (height)) >= npixels ? npixels - 3 : ((int) (height))) + +static unsigned int +set (l, c, size, height) + unsigned int l, c, size; + int height; +{ + int rang = 1 << (NSTEPS - size); + height = height + (random () % rang) - rang / 2; + CELL (l, c) = height; + + return pixels [HEIGHT_TO_PIXEL (height)]; +} + +static void +floyd_steinberg () +{ + int x, y, err; + + /* Instead of repeatedly calling XPutPixel(), we make an Image and then + send its bits over all at once. This consumes much less network + bandwidth. The image we create is Wx1 intead of WxH, so that we + don't use enormous amounts of memory. + */ + XImage *image = + XCreateImage (disp, DefaultVisual(disp,DefaultScreen(disp)), + 1, XYBitmap, 0, /* depth, format, offset */ + (char *) calloc ((xmax + 1) / 8, 1), /* data */ + xmax, 1, 8, 0); /* w, h, pad, bpl */ + + for (y = 0; y < ymax - 1; y++) + { + for (x = 0; x < xmax - 1; x++) + { + if (CELL(x, y) < 0) + { + err = CELL (x, y); + XPutPixel (image, x, 0, 1); + } + else + { + err = CELL (x, y) - 1; + XPutPixel (image, x, 0, 0); + } + /* distribute error */ + CELL (x, y+1) += (int) (((float) err) * 3.0/8.0); + CELL (x+1, y) += (int) (((float) err) * 3.0/8.0); + CELL (x+1, y+1) += (int) (((float) err) * 1.0/4.0); + } + XPutImage (disp, wind, gc, image, 0, 0, 0, y, xmax, 1); + } + XDestroyImage (image); +} + +static void +draw (x, y, pixel, grid_size) /* not called in mono mode */ + int x, y, grid_size; + unsigned long pixel; +{ + static unsigned int last_pixel, last_valid = 0; + if (! (last_valid && pixel == last_pixel)) + XSetForeground (disp, gc, pixel); + last_valid = 1, last_pixel = pixel; + if (grid_size == 1) + XDrawPoint (disp, wind, gc, x, y); + else + XFillRectangle (disp, wind, gc, x, y, grid_size, grid_size); +} + + +static void +drawmap () +{ + unsigned int x, y, i, step, nextStep, x1, x2, y1, y2; + unsigned int pixel, qpixels [4]; + + xmax = wattrs.width; + ymax = wattrs.height; + + cell = (signed char *) calloc (xmax * ymax, 1); + if (cell == NULL) + exit (1); + + CELL (0, 0) = 0; + step = COUNT; + for (i = 0; i < iterations; i++) + { + nextStep = step / 2; + for (x = 0; x < xmax; x += step) + { + x1 = x + nextStep; + if (x1 >= xmax) + x1 = 0; + x2 = x + step; + if (x2 >= xmax) + x2 = 0; + for (y = 0; y < ymax; y += step) + { + y1 = y + nextStep; + if (y1 >= ymax) + y1 = 0; + y2 = y + step; + if (y2 >= ymax) + y2 = 0; + + qpixels [0] = pixels [HEIGHT_TO_PIXEL (CELL (x, y))]; + qpixels [1] = pixels [HEIGHT_TO_PIXEL (CELL (x, y2))]; + qpixels [2] = pixels [HEIGHT_TO_PIXEL (CELL (x2, y))]; + qpixels [3] = pixels [HEIGHT_TO_PIXEL (CELL (x2, y2))]; + + pixel = set (x, y1, i, + ((int) CELL (x, y) + (int) CELL (x, y2) + 1) / 2); + if (! mono_p && + (pixel != qpixels[0] || pixel != qpixels[1] || + pixel != qpixels[2] || pixel != qpixels[3])) + draw (x, y1, pixel, nextStep); + + pixel = set (x1, y, i, + ((int) CELL (x, y) + (int) CELL (x2, y) + 1) / 2); + if (! mono_p && + (pixel != qpixels[0] || pixel != qpixels[1] || + pixel != qpixels[2] || pixel != qpixels[3])) + draw (x1, y, pixel, nextStep); + + pixel = set (x1, y1, i, + ((int) CELL (x, y) + (int) CELL (x, y2) + + (int) CELL (x2, y) + (int) CELL (x2, y2) + 2) + / 4); + if (! mono_p && + (pixel != qpixels[0] || pixel != qpixels[1] || + pixel != qpixels[2] || pixel != qpixels[3])) + draw (x1, y1, pixel, nextStep); + } + } + step = nextStep; + if (!mono_p) + XSync (disp, True); + } + if (mono_p) + /* in mono-mode, we do all the drawing at the end */ + floyd_steinberg (); + + free (cell); + XSync (disp, True); +} + +static void +cycle (dpy) + Display *dpy; +{ + XColor *colors = (XColor *) malloc (npixels * sizeof (XColor)); + time_t stop; + int i; + for (i = 0; i < npixels; i++) + colors [i].pixel = pixels [i]; + XQueryColors (dpy, cmap, colors, npixels); + stop = (time_t) ((time ((time_t) 0)) + timeout); + while (stop >= (time_t) time ((time_t) 0)) + { + unsigned long scratch = colors [npixels-1].pixel; + for (i = npixels-1; i > 0; i--) + colors [i].pixel = colors [i-1].pixel; + colors [0].pixel = scratch; + XStoreColors (dpy, cmap, colors, npixels); + XSync (dpy, True); + if (cycle_delay) usleep (cycle_delay); + } + XSync (dpy, True); + free (colors); +} + + +char *progclass = "Imsmap"; + +char *defaults [] = { + "Imsmap.background: black", /* to placate SGI */ + "Imsmap.foreground: black", + "*mode: random", + "*ncolors: 50", + "*iterations: 7", + "*timeout: 10", + "*cycleDelay: 100000", + "*cycle: true", + 0 +}; + +XrmOptionDescRec options [] = { + { "-ncolors", ".ncolors", XrmoptionSepArg, 0 }, + { "-timeout", ".timeout", XrmoptionSepArg, 0 }, + { "-cycle-delay", ".cycleDelay", XrmoptionSepArg, 0 }, + { "-mode", ".mode", XrmoptionSepArg, 0 }, + { "-iterations", ".iterations", XrmoptionSepArg, 0 }, + { "-cycle", ".cycle", XrmoptionNoArg, "True" }, + { "-no-cycle", ".cycle", XrmoptionNoArg, "False" } +}; +int options_size = (sizeof (options) / sizeof (options[0])); + + +void +screenhack (dpy, window) + Display *dpy; + Window window; +{ + disp = dpy; + wind = window; + while (1) + { + initwin (dpy, window); + drawmap (); + if (timeout) + { + if (cycle_p) + cycle (dpy); + else + sleep (timeout); + } + } +} diff --git a/hacks/imsmap.c_ori b/hacks/imsmap.c_ori new file mode 100755 index 00000000..7a619b94 --- /dev/null +++ b/hacks/imsmap.c_ori @@ -0,0 +1,437 @@ +/* imsmap, Copyright (c) 1992 Juergen Nickelsen + * Derived from code by Markus Schirmer, TU Berlin. + * + * 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. + */ + +#include "screenhack.h" +#include +#include + +#define NSTEPS 7 +#define COUNT (1 << NSTEPS) +#define CELL(c, r) cell[((unsigned int)(c)) + ((unsigned int) (r)) * xmax] + +static enum mode_t { MODE_H, MODE_S, MODE_V, MODE_RANDOM } mode; + +static GC gc, gc2; +static Display *disp; +static Window wind; +static XWindowAttributes wattrs; + +#if defined(sun) && !__STDC__ /* sun cc doesn't know "signed char" */ +#define signed /**/ +#endif + +static unsigned long *pixels = 0, fg_pixel, bg_pixel; +static int npixels = 0; +static Colormap cmap; +static int timeout, cycle_delay; +static int cycle_p; +static signed char *cell = NULL; +static int xmax, ymax; +static int iterations; + +static void +initwin (dsp, win) + Display *dsp; + Window win; +{ + int fg_h, bg_h; + double fg_s, fg_v, bg_s, bg_v; + + enum mode_t this_mode; + static Bool rv_p; + static int ncolors = 0; + int shift = 0; + double dshift = 0; + + XGCValues gcv; + + XGetWindowAttributes (dsp, win, &wattrs); + cmap = wattrs.colormap; + + if (!ncolors) + { + char *mode_str = get_string_resource ("mode", "Mode"); + rv_p = get_boolean_resource ("reverseVideo", "ReverseVideo"); + cycle_p = get_boolean_resource ("cycle", "Cycle"); + ncolors = get_integer_resource ("ncolors", "Integer"); + timeout = get_integer_resource ("timeout", "Integer"); + cycle_delay = get_integer_resource ("cycleDelay", "Integer"); + iterations = get_integer_resource ("iterations", "Integer"); + if (iterations < 0) iterations = 0; + else if (iterations > 7) iterations = 7; + pixels = (unsigned long *) calloc (ncolors, sizeof (unsigned int)); + fg_pixel = get_pixel_resource ("background", "Background", dsp, cmap); + bg_pixel = get_pixel_resource ("foreground", "Foreground", dsp, cmap); + + if (mono_p && fg_pixel == bg_pixel) + bg_pixel = !bg_pixel; + + if (mono_p) cycle_p = False; + + gcv.foreground = fg_pixel; + gcv.background = bg_pixel; + gc = XCreateGC (dsp, win, GCForeground|GCBackground, &gcv); + gcv.foreground = bg_pixel; + gc2 = XCreateGC (dsp, win, GCForeground, &gcv); + + if (!mode_str || !strcmp (mode_str, "random")) + mode = MODE_RANDOM; + else if (!strcmp (mode_str, "h") || !strcmp (mode_str, "hue")) + mode = MODE_H; + else if (!strcmp (mode_str, "s") || !strcmp (mode_str, "saturation")) + mode = MODE_S; + else if (!strcmp (mode_str, "v") || !strcmp (mode_str, "value")) + mode = MODE_V; + else + { + fprintf (stderr, + "%s: mode must be hue, saturation, value, or random, not \"%s\"\n", + progname, mode_str); + mode = MODE_RANDOM; + } + } + else if (! mono_p) + XFreeColors (dsp, cmap, pixels, npixels, 0); + + this_mode = mode; + if (!mono_p && mode == MODE_RANDOM) + switch (random () % 3) { + case 0: this_mode = MODE_H; break; + case 1: this_mode = MODE_S; break; + case 2: this_mode = MODE_V; break; + } + + if (mono_p) + { + npixels = ncolors; + pixels [0] = fg_pixel; + pixels [1] = bg_pixel; + } + else + { + XColor fg_color, bg_color; + + if (fg_pixel == bg_pixel) + { + HSV_AGAIN: + fg_h = random () % 360; + bg_h = random () % 360; + fg_s = frand (1.0); + bg_s = frand (1.0); + V_AGAIN: + fg_v = frand (1.0); + bg_v = frand (1.0); + if ((fg_v - bg_v) > -0.4 && (fg_v - bg_v) < 0.4) + goto V_AGAIN; + hsv_to_rgb (fg_h, fg_s, fg_v, + &fg_color.red, &fg_color.green, &fg_color.blue); + hsv_to_rgb (bg_h, bg_s, bg_v, + &bg_color.red, &bg_color.green, &bg_color.blue); + } + else + { + XQueryColor (dsp, cmap, &fg_color); + XQueryColor (dsp, cmap, &bg_color); + fg_color.pixel = fg_pixel; + bg_color.pixel = bg_pixel; + } + fg_color.flags = DoRed|DoGreen|DoBlue; + bg_color.flags = DoRed|DoGreen|DoBlue; + + rgb_to_hsv (fg_color.red, fg_color.green, fg_color.blue, + &fg_h, &fg_s, &fg_v); + rgb_to_hsv (bg_color.red, bg_color.green, bg_color.blue, + &bg_h, &bg_s, &bg_v); + + if (/*mode == MODE_RANDOM &&*/ + ((this_mode == MODE_S && (fg_s-bg_s) > -0.3 && (fg_s-bg_s) < 0.3) || + (this_mode == MODE_V && (fg_v-bg_v) > -0.3 && (fg_v-bg_v) < 0.3) || + (this_mode == MODE_H && (fg_h-bg_h) > -30 && (fg_h-bg_h) < 30))) + goto HSV_AGAIN; + + switch (this_mode) { + case MODE_H: shift = (bg_h - fg_h) / ncolors; break; + case MODE_S: dshift = (bg_s - fg_s) / ncolors; break; + case MODE_V: dshift = (bg_v - fg_v) / ncolors; break; + default: abort (); + } + + if (mode == MODE_RANDOM && + ((this_mode == MODE_H) + ? ((shift > -2 && shift < 2) || fg_s < 0.3 || fg_v < 0.3) + : (dshift > -0.005 && dshift < 0.005))) + goto HSV_AGAIN; + + if (mode == MODE_RANDOM && this_mode == MODE_S && fg_v < 0.5) + goto V_AGAIN; + + for (npixels = 0; npixels < ncolors; npixels++) + { + if (cycle_p) + { + unsigned long plane_masks; + /* allocate the writable color cells, one at a time. */ + if (! XAllocColorCells (dsp, cmap, False, &plane_masks, 0, + &fg_color.pixel, 1)) + { + fprintf (stderr, + "%s: couldn't allocate %s writable color cells. Turning off -cycle.\n", + progname, (npixels ? "enough" : "any")); + cycle_p = 0; + goto NON_CYCLE; + } + XStoreColor (dsp, cmap, &fg_color); + } + else + { + NON_CYCLE: + if (!XAllocColor (dsp, cmap, &fg_color)) + break; + } + pixels[npixels] = fg_color.pixel; + + switch (this_mode) + { + case MODE_H: fg_h = (fg_h + shift) % 360; break; + case MODE_S: fg_s += dshift; break; + case MODE_V: fg_v += dshift; break; + default: abort (); + } + hsv_to_rgb (fg_h, fg_s, fg_v, + &fg_color.red, &fg_color.green, &fg_color.blue); + } + } + XSetForeground (dsp, gc, pixels [0]); + XFillRectangle (dsp, win, gc, 0, 0, wattrs.width, wattrs.height); +} + + +#define HEIGHT_TO_PIXEL(height) \ + (((int) (height)) < 0 ? 0 : \ + ((int) (height)) >= npixels ? npixels - 3 : ((int) (height))) + +static unsigned int +set (l, c, size, height) + unsigned int l, c, size; + int height; +{ + int rang = 1 << (NSTEPS - size); + height = height + (random () % rang) - rang / 2; + CELL (l, c) = height; + + return pixels [HEIGHT_TO_PIXEL (height)]; +} + +static void +floyd_steinberg () +{ + int x, y, err; + + /* Instead of repeatedly calling XPutPixel(), we make an Image and then + send its bits over all at once. This consumes much less network + bandwidth. The image we create is Wx1 intead of WxH, so that we + don't use enormous amounts of memory. + */ + XImage *image = + XCreateImage (disp, DefaultVisual(disp,DefaultScreen(disp)), + 1, XYBitmap, 0, /* depth, format, offset */ + (char *) calloc ((xmax + 1) / 8, 1), /* data */ + xmax, 1, 8, 0); /* w, h, pad, bpl */ + + for (y = 0; y < ymax - 1; y++) + { + for (x = 0; x < xmax - 1; x++) + { + if (CELL(x, y) < 0) + { + err = CELL (x, y); + XPutPixel (image, x, 0, 1); + } + else + { + err = CELL (x, y) - 1; + XPutPixel (image, x, 0, 0); + } + /* distribute error */ + CELL (x, y+1) += (int) (((float) err) * 3.0/8.0); + CELL (x+1, y) += (int) (((float) err) * 3.0/8.0); + CELL (x+1, y+1) += (int) (((float) err) * 1.0/4.0); + } + XPutImage (disp, wind, gc, image, 0, 0, 0, y, xmax, 1); + } + XDestroyImage (image); +} + +static void +draw (x, y, pixel, grid_size) /* not called in mono mode */ + int x, y, grid_size; + unsigned long pixel; +{ + static unsigned int last_pixel, last_valid = 0; + if (! (last_valid && pixel == last_pixel)) + XSetForeground (disp, gc, pixel); + last_valid = 1, last_pixel = pixel; + if (grid_size == 1) + XDrawPoint (disp, wind, gc, x, y); + else + XFillRectangle (disp, wind, gc, x, y, grid_size, grid_size); +} + + +static void +drawmap () +{ + unsigned int x, y, i, step, nextStep, x1, x2, y1, y2; + unsigned int pixel, qpixels [4]; + + xmax = wattrs.width; + ymax = wattrs.height; + + cell = (signed char *) calloc (xmax * ymax, 1); + if (cell == NULL) + exit (1); + + CELL (0, 0) = 0; + step = COUNT; + for (i = 0; i < iterations; i++) + { + nextStep = step / 2; + for (x = 0; x < xmax; x += step) + { + x1 = x + nextStep; + if (x1 >= xmax) + x1 = 0; + x2 = x + step; + if (x2 >= xmax) + x2 = 0; + for (y = 0; y < ymax; y += step) + { + y1 = y + nextStep; + if (y1 >= ymax) + y1 = 0; + y2 = y + step; + if (y2 >= ymax) + y2 = 0; + + qpixels [0] = pixels [HEIGHT_TO_PIXEL (CELL (x, y))]; + qpixels [1] = pixels [HEIGHT_TO_PIXEL (CELL (x, y2))]; + qpixels [2] = pixels [HEIGHT_TO_PIXEL (CELL (x2, y))]; + qpixels [3] = pixels [HEIGHT_TO_PIXEL (CELL (x2, y2))]; + + pixel = set (x, y1, i, + ((int) CELL (x, y) + (int) CELL (x, y2) + 1) / 2); + if (! mono_p && + (pixel != qpixels[0] || pixel != qpixels[1] || + pixel != qpixels[2] || pixel != qpixels[3])) + draw (x, y1, pixel, nextStep); + + pixel = set (x1, y, i, + ((int) CELL (x, y) + (int) CELL (x2, y) + 1) / 2); + if (! mono_p && + (pixel != qpixels[0] || pixel != qpixels[1] || + pixel != qpixels[2] || pixel != qpixels[3])) + draw (x1, y, pixel, nextStep); + + pixel = set (x1, y1, i, + ((int) CELL (x, y) + (int) CELL (x, y2) + + (int) CELL (x2, y) + (int) CELL (x2, y2) + 2) + / 4); + if (! mono_p && + (pixel != qpixels[0] || pixel != qpixels[1] || + pixel != qpixels[2] || pixel != qpixels[3])) + draw (x1, y1, pixel, nextStep); + } + } + step = nextStep; + if (!mono_p) + XSync (disp, True); + } + if (mono_p) + /* in mono-mode, we do all the drawing at the end */ + floyd_steinberg (); + + free (cell); + XSync (disp, True); +} + +static void +cycle (dpy) + Display *dpy; +{ + XColor *colors = (XColor *) malloc (npixels * sizeof (XColor)); + time_t stop; + int i; + for (i = 0; i < npixels; i++) + colors [i].pixel = pixels [i]; + XQueryColors (dpy, cmap, colors, npixels); + stop = (time_t) ((time ((time_t) 0)) + timeout); + while (stop >= (time_t) time ((time_t) 0)) + { + unsigned long scratch = colors [npixels-1].pixel; + for (i = npixels-1; i > 0; i--) + colors [i].pixel = colors [i-1].pixel; + colors [0].pixel = scratch; + XStoreColors (dpy, cmap, colors, npixels); + XSync (dpy, True); + if (cycle_delay) usleep (cycle_delay); + } + XSync (dpy, True); + free (colors); +} + + +char *progclass = "Imsmap"; + +char *defaults [] = { + "Imsmap.background: black", /* to placate SGI */ + "Imsmap.foreground: black", + "*mode: random", + "*ncolors: 50", + "*iterations: 7", + "*timeout: 10", + "*cycleDelay: 100000", + "*cycle: true", + 0 +}; + +XrmOptionDescRec options [] = { + { "-ncolors", ".ncolors", XrmoptionSepArg, 0 }, + { "-timeout", ".timeout", XrmoptionSepArg, 0 }, + { "-cycle-delay", ".cycleDelay", XrmoptionSepArg, 0 }, + { "-mode", ".mode", XrmoptionSepArg, 0 }, + { "-iterations", ".iterations", XrmoptionSepArg, 0 }, + { "-cycle", ".cycle", XrmoptionNoArg, "True" }, + { "-no-cycle", ".cycle", XrmoptionNoArg, "False" } +}; +int options_size = (sizeof (options) / sizeof (options[0])); + + +void +screenhack (dpy, window) + Display *dpy; + Window window; +{ + disp = dpy; + wind = window; + while (1) + { + initwin (dpy, window); + drawmap (); + if (timeout) + { + if (cycle_p) + cycle (dpy); + else + sleep (timeout); + } + } +} diff --git a/hacks/imsmap.exe_axp b/hacks/imsmap.exe_axp new file mode 100755 index 0000000000000000000000000000000000000000..fd9c0f97a374182e1b1c428d699ba68f1ec99812 GIT binary patch literal 38912 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 CUi$z5 literal 0 HcmV?d00001 diff --git a/hacks/imsmap.exe_vax b/hacks/imsmap.exe_vax new file mode 100755 index 0000000000000000000000000000000000000000..e84f188d7d3e0dc6efac97d3128af552d8124ff7 GIT binary patch literal 20480 zcmeHv3wRXQk?!f9ku(xA%tILA5Hq$RmK`7x1{)K_;h8|pqo?Pg=UV7760*femIM|y z!DQn&*^SpCS(1wrM`9%)&PFr#-kXP$7_6sb956jtgGoYbz{o~6f{~FxLL;f~U)?j3 zz+@BexA)$?-?sxjeNI)KI(4e*RGo8rTCcEFwu)_H^hsTqx|rt}Qz9RNy~G&zt!KZo zl*%lfvCYA;r+cQUwehdJBBj`I2xHN5?ArDA^~;4xn41^%uCxWIlThhX(d%ztU@@tS z=cnB_fiQwIL}dSnONYzIX0SNicj1ax>pFHj?g@Ivthgt#B-X2ZnLWqY=-p}y#y+n# zB|e;a)#{ZQb28UE*R5S)UnAzFrl#G^9za8t3`|toB8_ZShGT+kHftj+yCcGFD!3&8 zEjrc_m)UG1$vKWr+{M0;u->sIf?l9XM`%3_gWUpAXR5L|#N`|8!bZ`Nw{qk9^&2-3 zvlOOjFxnRya28GS)tQrIx{H~J*?6arfSan(IU=Kr8aHyE%NqH~EimFDqt;?#s8*&b zVw^1`)=zOQ&s-T9%!JF_!2Q3g|J60HEak3yYN`q=-EL1+{x)}|HEqGd`{!8;wp+iJ zzopb|&CY+K)Km3XsWs)%C!Sp9aaUIr=2y5E6qawfhvntjGuG$1#ElyrY<^{Vc{N+0 zemg3+y4ifRD=L2?0{TjRSruSg%01<5f%>fxfp>L&Ss7apDXc6nE3e#=U%@o=w$iGt z`M_%TwX4{@)WOpD_+pjcy(RAQE$-^d?SL#!O|8Mj?j`OM6gTi)8f_Wn2+AUNasJk_ zYL<{`byrrFS6WLw*11(n6PPu{Q|>9whky(2Nnik3w|Xkwh2@A8$n?W=+qpEP05{v$6#VOda})^71lwzK5yGidLcm zF_$`KjI|)Y@UfE0@~xgCwql}KP+nQ&u2l8JzEWQ4j!@h%PPSH4?6^LQ%01O9(Q9Rf zW|nBTH}8a9XWK31MQ*m9zAD{tkt(;Vw8&k~#L1Py?S*A-wo?7}6p|IIAVamg#9hg% zOSibow^onWRoYeVvi$Aipweo0Wj?8MqSehME1nqgq|sOA!`HU3&1^F~uZmUWS8vtW zv2AQyei?vdJsO8~%hsxDYk}Je%6Zla!g*GeZk`qP*SO8IddjOK)}_{k!f((3$zGB>aovbE4%R#vsZYISU_^ptu^tmVbU*7@piVf%c~cINh! zZ!Ou()^4dHC)aKZCPun6zMu@Ijv^)o8%4mo;au^N@!lKJ^ip^~yLUo|OXDA4_eQk7 zG(HWu36)cwJ`vc`_-b{wMs2nrT9_ZT+Jb078_4`3)o=?YIMTF+Z(v&Ed;WwJnA8(i z)fzLcS!8y5%CCoNL4vUb_*d>>s$kpQRSa5W+Jr~+AX7l`Q8N~3b4fGS+$yNqI=9F= zx9~=~d=I9k>W>Rvo?ktQP_=(P8NVVQ{vWaS+$t?9e9|*CZy@}nnM;B} z_Jz@J2>FTnILQQ(N)tmW^}tU{i>zc6bwrh@TdOMEg{8%%@XBaJf+9%hDugRfQI+)} z>*5C~u2Haxpth8HwpP18fx==S8W0QIRn-jfxw^Elq!N==E2?8tjiZ$ag`|MlUs2`W zT2!twwutc93tDBf3uFz(#&@P>^U8_#{^aUNad>-m7PX44`h^#G&m}DRUr{FtwO|z?=-Efsi{lpKUTA;*8x%&q%KiS zQkd_dzyiABJo3&zo6`&aW#O~3DR21f=$ff_4I6WMDvLk9d+*hG&u{-s z-peI_T6pOBf<)g>E;l`S=OOdEE8jfyr3XvDeqfE`mv35r-26Gi!T8QN<>by?-~I86MP*5M-FxWKXYFtPdhgYLjLTki>htlR&9-f?ToLp7x{SD; z%F=H<)A8=h@)Mqi4rPDrxns$%zwSPjxcH}UUi+t?e?f8o`QYs{q|q17p8i5hb87O* zyiN8G`)1$y%cb_3cN({y2bB zt*N8so87+-${*r-8P_3PZ{hkQt`BexG={IyAS z0p;9D_01@kZBqX#;s4{W9jrCwk-E^8enoNAg+2%?id|~b z3x1(-iCLGnmr48d&Q6!K&(N4Iv*7-8*%{U;!3B&-f-C6l4SM^6-hrTZNCw^+j#avW z3J8{*PBGx^wXEhky{Cfo|8&rMCg|-BdVAzMWF~XCT=I%TeQ1=ZG^&lv(*oX8mIUe0 zsm65Elz_mU6#b&NclK)mZ=WSW_V$H2Wh?dEq;Fgzox@=S6ZGkF??EnS6 zPT3APhO(l_5+4vwQo($!h8J^Nl5>gO294dTOim8A?PYS?tHf*-pe>x3Tf^t>3>LK{ z0ZP2)1FTO}edZ$C?}hRQ&1xdr;8N**faD>b}bY)Mv4lAy6x zb@&E!_=c)O251Xs7oqH(!O*>E)RF`Y>G6GNWXDdT!)Wags7WtFT9QZ(y$DLUV>n)U z7RNl2;7gKxNutys;?nz!vd@Uol&h$a1UCtW9;Ftc&G?pm$zY!iWbn9a40H;L{w6(_ zq)R);By+ahsFy)z;E^>{;gwaWbY=t~3mUu#E#C(~W$}OOj1To;S#O{u@n{?bB`(C@yEQrm#*pe+` zKGtr456?^t9?4ca+YE7<#cbIbJd#HM-Db3n4<0Gdux%Wq5d0Ye!AdpQ$qau6pvk(l zEf_$V3RHGuh%yHWo~B_Rspf)5%DKAGgVP~-nBOc3p%cT3BKeGBhdPT|pJ5_u_PQ1C zJjVoSUyA5&n8hc>NnGe>APgS)1~}~C)TSAh#iV?>K@4-pe-MT-5@i&XGxso7e=HsP zhCN8-KfM>DKUSmo3~8@(@a-et2a|u`RAgx3EK-eg$Ig0X5OlK73cdduSjfI4FsnsL zGjX;rF=}hSvmpiHYm_0(I6)`-W}(qM>PGMxWcr^JJaQ1d{Fn>tLlFbnlpy{y}$0X;mePeaX6I9zjCix7;%SBT2KF;VS0 z%!f|TCiVp^7m>v%!LkNaT;Y2+J!?Q~fydk+g9xIcIx6_9fpq!W-; z!2{`ap=@}F80HHk0o;NI9Ki$YwAxYBN`eP+wVH(5lfeV!TCJNU$9J}Ot7(w)qYyVe zMvB8-*2`c6ANnzgDYPS{Kv1O7V8=hPV8`DxxE>w{5bCuFR3lJ(3H823MK!ZPs0${v zB>O?u-ptI?umYeve^Qi06at~cgx7brcS0Mlv13mu62QlvR_c#cDRN>&U3%r)bBW{r zbt?8L4XYo=mTFibV7DX%JA6p3b;^f;kwP$S;w9bwHE9j-f?&rlfmETETY??Gj#kXE zouJqS`F|G$5&lrLVvd!#{cB8{f*sJpMEkd*72tW`m&tZHv>77`c1TQCo`(nsmQRp$ zkN|NY5PBQlU{1!YYj4LjuGesk@+u~tw115+F%bG05f%FPuhE(RF3dtFtu%PC(g0 zmOGrpp%5DoB%Zo@2whobNw78qA`^6CF#x$l(sYA9ZLvOLJ9y|Wq_eLuiy@%M(O$KiHvc;<8U$I9WlTW~$5RCs%K zR(Sh%%213U^ySY`A}<6cA6Fi*r+_^JtOV>Gz?v4rcJ;?fl*mj((0l$)YLqhxvI7ux z9+hbGC`Z{HckFTcaw|`Jd!D8}MrS&t*qIJ7@bws$!m**>fdA9pQ%}>zLQ01iz~s|c zo{Ihv(0*ScXP!~$J>%`8L49_3dID~@4`U7V;V6(iAtNI;YDg0ykB$a>iRKw?Udh{u zO-Su~*l|ub_{H0Sdu3GeB}RPJ$`&!xvKgW8Un5^_^LBbA@%Qjb(PuEFa)sVL?-{{E z^%7C=m~MwI3cWqvQcl_(u zW+puD?V&rr$F_R(^*^ zJ27J@c4LV;4Qs6cVwj~^=7MA+7W5vaNv;OXaGY}7N=e9kUjS_^@m(DmoZS=`5V|_- z9M;`(=ss*8f*n&iS;>O@2pTJJqo`;~y58mo!N@f8dYDIJu1ot4jNgu_3kg=xJdSAB zj8owInd$z3Fe9{Zi1gdyMM4sv#KaYzQYWxr6C}agX_^@jHhH{#CX;&aF=4L;oxXq$ z{<80WGnuiI=+}=6>VR(g$7FOb?_Z~Fye?th$on_T`-`yIAfQ1$s%Owj3lREQ+P-t^ zMWo5Lro=d*M&Rt2ZD-(h<59*gTK?Tw(cEOT{T@4^Hqq8(>}WsDuzPF9?pp%y-;8jN3VC?VIeenCekOw9-V22HUGS|Z4 zCjQ=ltro9*lZGT>sB_Th;jk8BMHh|c!Z9HNoP(Q*M5eH z{v2_pE{(xmxK0;9;OKV|=ymMTaZ%$fs*#A^1RZ6o%q=ctgxkhVQYw)W%%zg@U3;iS!k{AQ;KXY(a@<^<3u zIQ?GVlH*JE&GP$Z0We$F>6_J(N`?yW^{S&V;Z!fj+rA%rR)9Fy>%T3xi zq*c_WFVc_C8to`L$8ORFbBx*yMEjX&r0;Z^ZoR2&PH8o@85$pt1d|AR*KM*#xzG?d z!7uG6?NUyr*lxq@WRwcP5@$t#2wnOJ zOSkR*EN`#bjPE{kBEARAvG^Xc?G!^RMWq(11$)v*MBonF7G_FGA{Qn#s zKHKwGb@-_rZTcr2ZAL&)W9f~4*6hjlXCv6$u1l*7H+ypYIhZY|JQ#*!djg^J=OJDq zast9Kugs+tf=}=F=@B+TbzwLV>Hvi$Cd`gMKP1CdasKpqP@x5dYF@dF10&>OotlfY z-bXI(NJPS>6V$svM=8}ti>c|ibtKxvuH{&7;3Um0N`(a{ZCZ-|K;2_GX%W`dq|cH| zv8>7iTbVk08-d;W2QgBet?75Sui#I0c(LoR`+(_AQE6Oh|?80^y&v#dLHWw zqvIDq6D*`ko$@`DY5z={eid6FhyFn$9R#U|NE>;ePy>-6QmUsd#t>Dgl^psNOozn$ zI!-}x2y;&hhb<4J$wPBGX!G{T-T@qC>Xf+z@%9OOmK9)|tH(h+V%!L1eU4!)k6KT z=LS`g_k^jH9MWkbCu$<6ws0UInSTxdR*EvJ^0D26I0w)v-gD`q_%)&&n5)fVS*Kr_)I zDM~~wZi`k_5m6y$3i;q-!4I&E!P&(LG=|-NhZ_cw4me(Gf4fMV4kX;p#O>* zdWQtPEYj?gLq9{W!M4>FZlw;k|{Zqmg+{~5Zd3zeb4#5BdM>?L)q05Pef7wTAwa#S6JggWk{UXJyWI+BT! z)Il|MimHYBW8K;m?S(pep^i;wRdtl&cp9#e2G{6T)nPz;RUO?>M~|kCqjZK1d{iAc zF5)`LH!LOf-d>o!i8dQ>j2S97^9+EBgKgi(sE+{x#IJBOEhS=&RHuyK_!ZmvWR0{5 zqzxMBcZqZwr|KvNWy#x%Kqgw^RmfUEf^A1BbYrkzMGex=#;!)tc96}_Fq_m&4+fU+ zTO>%EMAK(+PIpuE5<*j;r8(96F4k+v7Mi(Ywiw z3_H97CZ~p@CyJK1E*uw`Vz@5vfQaYB?WPIZB=Es`ZA>Sc+}VjE2Mm=9;7O|q``VIV zdom|)hVGX_*0&MV{NBFw*>eNlA#+T?J7D9lduf%Mr{kX}!P=Xu2N zL;U2P7(wqPeG%kGYrKkhjt?c1&bLcRLBru3NH02yR!cb!!Hs9DeBQ=G(@d%lk+L1^k;wvWWv4PP^ zBApQHacYaT71kV)$K%Iil_)H_w9p;DJf>$j4@rlArTtNx+7nMN?R6_pJjZgVKl0~L z;~;gIWl52;Y(L1i+yQ&;&KJHXAl*&FcXm?zUO{NK3Ri{vlOQm^7sxWlzRhQ*4I+Wd zS#`?&kWx!nfODB?L8NPgoTcVDvwp!l zG8y+7IZF;XkT!z{3uNUfpwPMqH;gclg}{&n`=nBf%vw00Vvdo1o&tZ*RL?BU1~~^S zxj!)iz@Q3_BkP%zlYyM&k$$SrmNJ~u0X@#*1Fhd-(^I7Po1<97pC8iQ_T5Qlp0iEtyk_Z`XOJ&wFv@BM?Uld~b*6d(|nrXj${0)%@Qbv#E` z*EJTsWJi9$uT(<2kp6;id;_uXAPCT|mKc)kawdf4kDnzjoL(KjN?QloCpFqaqWuG2 z#?W&+SZnGdm}c~|0y`c&!2^yTgws1M8zs9#a=N7UXPEaCf()mWO+ho9Q)2GadnL&0 zK)*REP&CJ3P$4QeB-+(*`+cg|aq4WGsh6CPOGoQs{^hlrTzGy&wJ&P57_By6t6^FY zZnjp#grFJ@MKK;#)c5eX6vB^8l05@q!h1#%UD823qqGOwReN+l2g1k!pbX;vTmJevW{!Cy;B| z;aY7N%01FK8j6FviEn9Rfp39O9m{5wr}q@8WWrcT6N)chbuMGnxh|nTvEIjTdLq7n zUq`^^h%21(1d&WOI<4Z0RiI|{VJf#KGR^8QQVmXeQ(m9H8L!(W@gn)8R%3*h5aER! zn~E4Xzf+BYhKU#m10V+ehxN3K_`~M30O6G94X8~XD2A_BcBoLh>fT1s%Z*mKF;QwX zie^LC8=prMvvGcrH^+6oaXXh`TJ9J1R5o!o(?UF6qq3fJn(p$8Iw}t`hbhS~#!&eq zhUDD!hKxrBqC;{xB_~othLn+s8QiE3zVTZo_u}_Z3{TPjC!|nQ$(K;j&!XIcO|?TR zB3FrqpU-LG$3DqN3K4&burEQzi3XqdFi*cqTmr&PZS?K98`MDd-lhUIdnb@a8myYR zy@Y_d*+^Wg^^uAuLq0#j?sFAtm1JdS?PEJ;t?_?AQ|acNO}Zu0wQ80)`|?D zQQ};W`>YwsQ&6!2Xq0#Yh{2uNg)61HNQDuqdeT8D2}O@SILo$7p<{tx4aMEOs@e!t0#BcZ!*XO@^jf zg2(A9aS5KnCS%i_tYTLdLa%drx^#3N6FHpM2=&Vv47g%(={IFH8Q~r~H~Es94Dgkm z&6!w2BDfnuhmc(<92d=eOV7bCXFU>qVA_p{Z%=PD>`ZTr#igewrr*W`#TEp&?oU2M z>#lD!)HlY~H|i%I@phwwTy#K_DV?e7^_hO0=hP{W#vnb^h05Q-TJsg7cVPEa@73L$ zcd)C#JA`^K>X%Rtbv2m0eS!T(~2=n!sU1LupJM`F7<q75`Ei`H+kD38`3 zQZd5hMA3gNEknc zTZHU4)`Ve@=bog?w=XcDVpN&{0$WZDt!Avb^pv* ztY-0}2f)vup$*>@2PlUn(|Q#=aY~^V&5JNnRbQbOAWui_c?jSguy@pcNQEIR{_%)F zc>$I7+6(v=S_He;EV?l(x{&|64$yjvXp3xGV-XZKP!u-n?ag{e|6*4V4;OF_c>mw< zJBW_ctR=}7ahv<;F_6%4Mtdu?)%Zxg_cBxzkIo>v&0>{o9;(NUCkVJfdK`wv3}{ zNA0d3?qvnGj)Vq1ZJ^$^0W}x<)!JR9B?=x55&Ug|e%XwlHTMP!uop!je*qhhKx1NZ zf^=(RVohTr*Jwm8BdNMxo+aS7Yy#+!;KDKW)-!lRT2RllFiv&9QWyFX=1p#AFH!)L zr$SeM1V0T&gQwq^VvUN??$~GO+|;RR2&DfPKg-Y;UF#rKGlV;e3(KLu`T?2xKK3#g z`Zkn#T&En2oq-`<&0uU3?l0N#JNu1*Wy2Y8e-Xd;IJJba>Id=8Iex~y=?jbvEoN*{ z8m8|8$T63(lsPc#Qow*u1w0e*Zot!V838vwr1gbvSq0RZiReM^eUpaI;Hdo!w$+<) zuJR_1nrNS5#q}!Is?E5*GnKI#Y*Amq^(JT-XbiYgaB#T{2fAx;ZN^cA5p5V?uVUH1 z543&Y*@J5taLYj71Dp}GHMppAfYf);XF-Rj$-q#?bGWK;{Q}oIzy=_2H?A_2pCK4s zpeJ3E&PRaTf%1!hcShbFm_E{@?q;?#tvJpc_LM8^Lnz9`>FvYq%1V6L|Ik&yDcha4*kY+9wD(1*N1;rWXf zFJ2kxALVsm7VhEWM)@gSJkNPqpg;7{l|gVAWgqqTvcAi~el|GDMz8eu4)hcJd>7AM zyF7+c-(YAMJ59!O7cQaS!4R)!7kbXK%a=}d^ZdC#UmanWc%Hr22VQ4DKS0ed0&=<^ z1)jrq@4#UHR6Td-7R?foKbQh5tV4SFcdhUm^fdJ_Ga&uMm3m66@fR1Ms#MrB;V@eQ zE$XV=)qvE3?pEj5D4!p8%*@WBd|8aRkEa zvw;2_DK_yib07o9sBeD*Mu)Ga!z>d&xK5ZbHV{ZvWUy5!MjFNl8Ejy}V7-6AV0cT8 zH(Y>8#`>V)LDqNa(uK>HFAs+$)S(xq$H;3DKYXLS-8-`V7x$ULQCryl&uf-<83SM&9T3sPqrRIX{9Y4UUYQ zVCSx|;i1v+&}ih&bE9}Of#>m``ziTPJwvHcEkQDr+t``<{{E4nfy+EM#B<>*{m>nB z#PfYaAAI;RoOkHl=*26c%kbOV;qwFGYtU4982yY~VPjJncgU#uUA(y3zR@YJTy4kX zeF^rol(?(mD3$m-26>h4s`9Osg>D%3XE5w%;01Rh0uV*y1^me*-+@zr1iHCp!5ENbJ z!!wCBfhRYF8A-ZV7DS|rydpoDgcfojX^)abUX{O*1pa+K$w<0-mHhj1sPAg%>eaLC zYw74n_i5ZX?$6Qk!x;mN1bOIVFV;m`={W8q69?27t*p5mL1O_S!r7lLwuLMd=KL7OcmO6{QI3^cMp1G&*RW;t}H3 z0MIjUMCX+k=czC1gYG!!EKu)4#FNsZyz24^7GDPnJ*>J9J&^GtGN>=}qvbjcz551q zlrf{jJb-!_ zD6;geM$*htSehT`<@J4InA$!4J(n(C=*8!3_ZaILr2sJ)9vm8A&knN>U|d-E{4n&7 z$N(!1{dA;XiT)cP!^DP>xe$g9_l~J~=;|LvFAgG@!6h(TsmUSO3nm=}RCOsm<+sat z2tA1ON11D)N`}VFzx-PeTo~jH?Abxh&^&jgFEr9e9vP({85|+&Cuoyjx5n;57~h5A zCv2|TMkc8&DZt=|Fa#iK?gs)8LI4j$HxN*DF197pw&XwN&MTxpqL5dazlBmoIk3jV z>?pADYO2V?pIZSu3vlStW;Rk+4?~xR@KDd_@U{NSm!ZgueHVK#@No*Dmo8np66(J? zJTfvg!iF#R_71WEJdBJ{FoF=~0P^U-Ta^D}!e@HkpUO=*veUk9^=bh^r(lbjfDD+Y z{)q)znvmlmGzoM>}*xAN!&xbnb@6v#?9h~9v-vK-^0?(tA4b-o+ zPQSt#sTDdM=o>+D<9RqhA0;>V)E_bFkraAIdG6{v7pc?ey3M&^ZDyWh?fTVruwRCa zU?QfC`WIV@i}JUFJqALir~xV-$|xlqd3+Dxm<^k-7Qe-{-k#?mc;0fm1GrgQn;pQ# zgWY%=+F-+cX=Wq!w2guueD~@w8=, 23-aug-92. + +Hacked on by Jamie Zawinski , 24-aug-92. diff --git a/hacks/imsmap.man b/hacks/imsmap.man new file mode 100755 index 00000000..1badced3 --- /dev/null +++ b/hacks/imsmap.man @@ -0,0 +1,63 @@ +.TH XScreenSaver 1 "26-apr-93" "X Version 11" +.SH NAME +imsmap - generate fractal maps +.SH SYNOPSIS +.B imsmap +[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP] [\-background \fIcolor\fP] [\-window] [\-root] [\-mono] [\-install] [\-visual \fIvisual\fP] [\-ncolors \fIint\fP] [\-timeout \fIseconds\fP] [\-iterations \fIint\fP] [\-mode h|s|v|random] [\-cycle] [\-no\-cycle] +.SH DESCRIPTION +The \fIimsmap\fP program generates map or cloud-like patterns. It looks +quite different in monochrome and color. +.SH OPTIONS +.I imsmap +accepts the following options: +.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 \-mono +If on a color display, pretend we're on a monochrome display. +.TP 8 +.B \-install +Install a private colormap for the window. +.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 \-ncolors \fIinteger\fP +How many colors to use. Default 50. +.TP 8 +.B \-timeout \fIinteger\fP +How long to delay between images. Default 10 seconds. +.TP 8 +.B \-iterations \fIinteger\fP +A measure of the resolution of the resultant image, from 0 to 7. Default 7. +.TP 8 +.B \-mode [ hue | saturation | value | random ] +The axis upon which colors should be interpolated between the foreground +and background color. Default random. +.TP 8 +.B \-cycle +Whether to do colormap cycling. This is the default. +.TP 8 +.B \-no\-cycle +Turns \fI\-cycle\fP off. +.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. +.SH SEE ALSO +.BR X (1), +.BR xscreensaver (1) +.SH AUTHOR +Juergen Nickelsen , 23-aug-92. + +Hacked on by Jamie Zawinski , 24-aug-92. diff --git a/hacks/link.com b/hacks/link.com new file mode 100755 index 00000000..ed6bf995 --- /dev/null +++ b/hacks/link.com @@ -0,0 +1,49 @@ +$! We fisrt test the version of DECW/Motif ; if 1.2 we need to link with new +$! X11R5 libraries +$@sys$update:decw$get_image_version sys$share:decw$xlibshr.exe decw$version +$ if f$extract(4,3,decw$version).eqs."1.2" +$ then +$! DECW/Motif 1.2 : link with X11R5 libraries +$ link/exe=attraction.exe screenhack,attraction,vms_12.opt/opt +$ link/exe=blitspin.exe screenhack,blitspin,vms_12.opt/opt +$ link/exe=decayscreen.exe screenhack,decayscreen,vms_12.opt/opt +$ link/exe=flame.exe screenhack,flame,vms_12.opt/opt +$ link/exe=greynetic screenhack,greynetic,vms_12.opt/opt +$ link/exe=halo.exe screenhack,halo,vms_12.opt/opt +$ link/exe=helix.exe screenhack,helix,vms_12.opt/opt +$ link/exe=hopalong.exe screenhack,hopalong,vms_12.opt/opt +$ link/exe=hypercube.exe screenhack,hypercube,vms_12.opt/opt +$ link/exe=imsmap.exe screenhack,imsmap,vms_12.opt/opt +$ link/exe=lmorph.exe screenhack,lmorph,vms_12.opt/opt +$ link/exe=maze.exe screenhack,maze,vms_12.opt/opt +$ link/exe=noseguy.exe screenhack,noseguy,vms_12.opt/opt +$ link/exe=pedal.exe screenhack,pedal,vms_12.opt/opt +$ link/exe=pyro.exe screenhack,pyro,vms_12.opt/opt +$ link/exe=qix.exe screenhack,qix,vms_12.opt/opt +$ link/exe=rocks.exe screenhack,rocks,vms_12.opt/opt +$ link/exe=rorschach.exe screenhack,rorschach,vms_12.opt/opt +$ link/exe=slidescreen.exe screenhack,slidescreen,vms_12.opt/opt +$ link/exe=xroger.exe screenhack,xroger-hack,vms_12.opt/opt +$ else +$! Else, link with X11R4 libraries +$ link/exe=attraction.exe screenhack,attraction,vms.opt/opt +$ link/exe=blitspin.exe screenhack,blitspin,vms.opt/opt +$ link/exe=decayscreen.exe screenhack,decayscreen,vms.opt/opt +$ link/exe=flame.exe screenhack,flame,vms.opt/opt +$ link/exe=greynetic screenhack,greynetic,vms.opt/opt +$ link/exe=halo.exe screenhack,halo,vms.opt/opt +$ link/exe=helix.exe screenhack,helix,vms.opt/opt +$ link/exe=hopalong.exe screenhack,hopalong,vms.opt/opt +$ link/exe=hypercube.exe screenhack,hypercube,vms.opt/opt +$ link/exe=imsmap.exe screenhack,imsmap,vms.opt/opt +$ link/exe=lmorph.exe screenhack,lmorph,vms.opt/opt +$ link/exe=maze.exe screenhack,maze,vms.opt/opt +$ link/exe=noseguy.exe screenhack,noseguy,vms.opt/opt +$ link/exe=pedal.exe screenhack,pedal,vms.opt/opt +$ link/exe=pyro.exe screenhack,pyro,vms.opt/opt +$ link/exe=qix.exe screenhack,qix,vms.opt/opt +$ link/exe=rocks.exe screenhack,rocks,vms.opt/opt +$ link/exe=rorschach.exe screenhack,rorschach,vms.opt/opt +$ link/exe=slidescreen.exe screenhack,slidescreen,vms.opt/opt +$ link/exe=xroger.exe screenhack,xroger-hack,vms.opt/opt +$ endif diff --git a/hacks/link_axp.com b/hacks/link_axp.com new file mode 100755 index 00000000..05b44fa2 --- /dev/null +++ b/hacks/link_axp.com @@ -0,0 +1,49 @@ +$! We fisrt test the version of DECW/Motif ; if 1.2 we need to link with new +$! X11R5 libraries +$@sys$update:decw$get_image_version sys$share:decw$xlibshr.exe decw$version +$ if f$extract(4,3,decw$version).eqs."1.2" +$ then +$! DECW/Motif 1.2 : link with X11R5 libraries +$ link/exe=attraction.exe screenhack,attraction,vms_axp_12.opt/opt +$ link/exe=blitspin.exe screenhack,blitspin,vms_axp_12.opt/opt +$ link/exe=decayscreen.exe screenhack,decayscreen,vms_axp_12.opt/opt +$ link/exe=flame.exe screenhack,flame,vms_axp_12.opt/opt +$ link/exe=greynetic screenhack,greynetic,vms_axp_12.opt/opt +$ link/exe=halo.exe screenhack,halo,vms_axp_12.opt/opt +$ link/exe=helix.exe screenhack,helix,vms_axp_12.opt/opt +$ link/exe=hopalong.exe screenhack,hopalong,vms_axp_12.opt/opt +$ link/exe=hypercube.exe screenhack,hypercube,vms_axp_12.opt/opt +$ link/exe=imsmap.exe screenhack,imsmap,vms_axp_12.opt/opt +$ link/exe=lmorph.exe screenhack,lmorph,vms_axp_12.opt/opt +$ link/exe=maze.exe screenhack,maze,vms_axp_12.opt/opt +$ link/exe=noseguy.exe screenhack,noseguy,vms_axp_12.opt/opt +$ link/exe=pedal.exe screenhack,pedal,vms_axp_12.opt/opt +$ link/exe=pyro.exe screenhack,pyro,vms_axp_12.opt/opt +$ link/exe=qix.exe screenhack,qix,vms_axp_12.opt/opt +$ link/exe=rocks.exe screenhack,rocks,vms_axp_12.opt/opt +$ link/exe=rorschach.exe screenhack,rorschach,vms_axp_12.opt/opt +$ link/exe=slidescreen.exe screenhack,slidescreen,vms_axp_12.opt/opt +$ link/exe=xroger.exe screenhack,xroger-hack,vms_axp_12.opt/opt +$ else +$! Else, link with X11R4 libraries +$ link/exe=attraction.exe screenhack,attraction,vms_axp.opt/opt +$ link/exe=blitspin.exe screenhack,blitspin,vms_axp.opt/opt +$ link/exe=decayscreen.exe screenhack,decayscreen,vms_axp.opt/opt +$ link/exe=flame.exe screenhack,flame,vms_axp.opt/opt +$ link/exe=greynetic screenhack,greynetic,vms_axp.opt/opt +$ link/exe=halo.exe screenhack,halo,vms_axp.opt/opt +$ link/exe=helix.exe screenhack,helix,vms_axp.opt/opt +$ link/exe=hopalong.exe screenhack,hopalong,vms_axp.opt/opt +$ link/exe=hypercube.exe screenhack,hypercube,vms_axp.opt/opt +$ link/exe=imsmap.exe screenhack,imsmap,vms_axp.opt/opt +$ link/exe=lmorph.exe screenhack,lmorph,vms_axp.opt/opt +$ link/exe=maze.exe screenhack,maze,vms_axp.opt/opt +$ link/exe=noseguy.exe screenhack,noseguy,vms_axp.opt/opt +$ link/exe=pedal.exe screenhack,pedal,vms_axp.opt/opt +$ link/exe=pyro.exe screenhack,pyro,vms_axp.opt/opt +$ link/exe=qix.exe screenhack,qix,vms_axp.opt/opt +$ link/exe=rocks.exe screenhack,rocks,vms_axp.opt/opt +$ link/exe=rorschach.exe screenhack,rorschach,vms_axp.opt/opt +$ link/exe=slidescreen.exe screenhack,slidescreen,vms_axp.opt/opt +$ link/exe=xroger.exe screenhack,xroger-hack,vms_axp.opt/opt +$ endif diff --git a/hacks/link_decc.com b/hacks/link_decc.com new file mode 100755 index 00000000..725b3049 --- /dev/null +++ b/hacks/link_decc.com @@ -0,0 +1,49 @@ +$! We fisrt test the version of DECW/Motif ; if 1.2 we need to link with new +$! X11R5 libraries +$@sys$update:decw$get_image_version sys$share:decw$xlibshr.exe decw$version +$ if f$extract(4,3,decw$version).eqs."1.2" +$ then +$! DECW/Motif 1.2 : link with X11R5 libraries +$ link/exe=attraction.exe screenhack,attraction,vms_decc_12.opt/opt +$ link/exe=blitspin.exe screenhack,blitspin,vms_decc_12.opt/opt +$ link/exe=decayscreen.exe screenhack,decayscreen,vms_decc_12.opt/opt +$ link/exe=flame.exe screenhack,flame,vms_decc_12.opt/opt +$ link/exe=greynetic screenhack,greynetic,vms_decc_12.opt/opt +$ link/exe=halo.exe screenhack,halo,vms_decc_12.opt/opt +$ link/exe=helix.exe screenhack,helix,vms_decc_12.opt/opt +$ link/exe=hopalong.exe screenhack,hopalong,vms_decc_12.opt/opt +$ link/exe=hypercube.exe screenhack,hypercube,vms_decc_12.opt/opt +$ link/exe=imsmap.exe screenhack,imsmap,vms_decc_12.opt/opt +$ link/exe=lmorph.exe screenhack,lmorph,vms_decc_12.opt/opt +$ link/exe=maze.exe screenhack,maze,vms_decc_12.opt/opt +$ link/exe=noseguy.exe screenhack,noseguy,vms_decc_12.opt/opt +$ link/exe=pedal.exe screenhack,pedal,vms_decc_12.opt/opt +$ link/exe=pyro.exe screenhack,pyro,vms_decc_12.opt/opt +$ link/exe=qix.exe screenhack,qix,vms_decc_12.opt/opt +$ link/exe=rocks.exe screenhack,rocks,vms_decc_12.opt/opt +$ link/exe=rorschach.exe screenhack,rorschach,vms_decc_12.opt/opt +$ link/exe=slidescreen.exe screenhack,slidescreen,vms_decc_12.opt/opt +$ link/exe=xroger.exe screenhack,xroger-hack,vms_decc_12.opt/opt +$ else +$! Else, link with X11R4 libraries +$ link/exe=attraction.exe screenhack,attraction,vms_decc.opt/opt +$ link/exe=blitspin.exe screenhack,blitspin,vms_decc.opt/opt +$ link/exe=decayscreen.exe screenhack,decayscreen,vms_decc.opt/opt +$ link/exe=flame.exe screenhack,flame,vms_decc.opt/opt +$ link/exe=greynetic screenhack,greynetic,vms_decc.opt/opt +$ link/exe=halo.exe screenhack,halo,vms_decc.opt/opt +$ link/exe=helix.exe screenhack,helix,vms_decc.opt/opt +$ link/exe=hopalong.exe screenhack,hopalong,vms_decc.opt/opt +$ link/exe=hypercube.exe screenhack,hypercube,vms_decc.opt/opt +$ link/exe=imsmap.exe screenhack,imsmap,vms_decc.opt/opt +$ link/exe=lmorph.exe screenhack,lmorph,vms_decc.opt/opt +$ link/exe=maze.exe screenhack,maze,vms_decc.opt/opt +$ link/exe=noseguy.exe screenhack,noseguy,vms_decc.opt/opt +$ link/exe=pedal.exe screenhack,pedal,vms_decc.opt/opt +$ link/exe=pyro.exe screenhack,pyro,vms_decc.opt/opt +$ link/exe=qix.exe screenhack,qix,vms_decc.opt/opt +$ link/exe=rocks.exe screenhack,rocks,vms_decc.opt/opt +$ link/exe=rorschach.exe screenhack,rorschach,vms_decc.opt/opt +$ link/exe=slidescreen.exe screenhack,slidescreen,vms_decc.opt/opt +$ link/exe=xroger.exe screenhack,xroger-hack,vms_decc.opt/opt +$ endif diff --git a/hacks/lmorph.c b/hacks/lmorph.c new file mode 100755 index 00000000..ecce0990 --- /dev/null +++ b/hacks/lmorph.c @@ -0,0 +1,504 @@ + +/************************************************************************** + * + * FILE lmorph.c + * MODULE OF xscreensaver + * + * DESCRIPTION Bilinear interpolation for morphing line shapes. + * + * WRITTEN BY Sverre H. Huseby Glenn T. Lines + * Maridalsvn. 122, leil 101 Frysjavn. 3, 5. etg. + * N-0461 Oslo N-0883 Oslo + * Norway Norway + * + * Phone: +47 22 71 99 08 Phone: +47 22 23 71 99 + * E-mail: sverrehu@ifi.uio.no E-mail: gtl@si.sintef.no + * + * The original idea, and the bilinear interpolation + * mathematics used, emerged in the head of the wise + * Glenn Terje Lines. + * + * MODIFICATIONS march 1995 + * * Converted from an MS-Windows program to X Window. + * + **************************************************************************/ + +#include +#include +#include +#include +#include "screenhack.h" +#ifdef VMS +#define M_PI 3.14159265358979323846 +#endif + +/************************************************************************** + * * + * P R I V A T E D A T A * + * * + **************************************************************************/ + +/* Define MARGINS to make some space around the figure */ +#define MARGINS /**/ + +#define MAXFIGS 20 +#define TWO_PI (2.0 * M_PI) +#define RND(x) (random() % (x)) +static int + cFig = 0, /* Number of figure arrays. */ + cPoint, /* Number of points in each array. */ + nWork, /* Current work array number. */ + nFrom, /* Current from array number. */ + nTo; /* Current to array number. */ +static long + delay; /* usecs to wait between updates. */ +static XPoint + *aWork[2], /* Working arrays. */ + *a[MAXFIGS], /* The figure arrays. */ + *aTmp, /* Used as source when interrupting morph */ + *aPrev, /* Previous points displayed. */ + *aCurr, /* The current points displayed. */ + *aFrom, /* Figure converting from. */ + *aTo; /* Figure converting to. */ +static double + gam, + maxGamma = 1.0, + delta_gam; +static GC + gcDraw, gcClear; +static Display + *dpy; +static Window + window; + + + +/************************************************************************** + * * + * P U B L I C D A T A * + * * + **************************************************************************/ + +char *progclass = "LMorph"; + +char *defaults [] = { + "LMorph.background: black", + "LMorph.foreground: green", + "*points: 150", + "*steps: 0", + "*delay: 50000", + 0 +}; + +XrmOptionDescRec options [] = { + { "-points", ".points", XrmoptionSepArg, 0 }, + { "-steps", ".steps", XrmoptionSepArg, 0 }, + { "-delay", ".delay", XrmoptionSepArg, 0 }, +}; +int options_size = (sizeof (options) / sizeof (options[0])); + + + +/************************************************************************** + * * + * P R I V A T E F U N C T I O N S * + * * + **************************************************************************/ + +static void *xmalloc(size) + size_t size; +{ + void *ret; + + if ((ret = malloc(size)) == NULL) { + fprintf(stderr, "lmorph: out of memory\n"); + exit(1); + } + return ret; +} + + + +static double frnd() +{ + /* + * Hm. for some reason the second line (using RAND_MAX) didn't + * work on some machines, so I always use the first. + */ +#undef RAND_MAX +#ifndef RAND_MAX + return (double) (random() & 0x7FFF) / 0x7FFF; +#else + return ((double) random()) / RAND_MAX; +#endif +} + + + +static void initPointArrays() +{ + XWindowAttributes wa; + int q, w, + mx, my, /* Max screen coordinates. */ + mp, /* Max point number. */ + s, rx, ry, + marginx, marginy; + double scalex, scaley; + + XGetWindowAttributes(dpy, window, &wa); + mx = wa.width - 1; + my = wa.height - 1; + mp = cPoint - 1; + + aWork[0] = (XPoint *) xmalloc(cPoint * sizeof(XPoint)); + aWork[1] = (XPoint *) xmalloc(cPoint * sizeof(XPoint)); + aTmp = (XPoint *) xmalloc(cPoint * sizeof(XPoint)); + + + /* + * Figure 0 + */ + a[cFig] = (XPoint *) xmalloc(cPoint * sizeof(XPoint)); + s = cPoint / 4; + for (q = 0; q < s; q++) { + a[cFig][q].x = ((double) q / s) * mx; + a[cFig][q].y = 0; + a[cFig][s + q].x = mx; + a[cFig][s + q].y = ((double) q / s) * my; + a[cFig][2 * s + q].x = mx - ((double) q / s) * mx; + a[cFig][2 * s + q].y = my; + a[cFig][3 * s + q].x = 0; + a[cFig][3 * s + q].y = my - ((double) q / s) * my; + } + for (q = 4 * s; q < cPoint; q++) + a[cFig][q].x = a[cFig][q].y = 0; + a[cFig][mp].x = a[cFig][0].x; + a[cFig][mp].y = a[cFig][0].y; + ++cFig; + + /* + * Figure 1 + */ + a[cFig] = (XPoint *) xmalloc(cPoint * sizeof(XPoint)); + for (q = 0; q < cPoint; q++) { + a[cFig][q].x = ((double) q / cPoint) * mx; + a[cFig][q].y = (1.0 - sin(((double) q / mp) * TWO_PI)) * my / 2.0; + } + ++cFig; + + /* + * Figure 2 + */ + a[cFig] = (XPoint *) xmalloc(cPoint * sizeof(XPoint)); + rx = mx / 2; + ry = my / 2; + for (q = 0; q < cPoint; q++) { + a[cFig][q].x = mx / 2 + rx * sin(1 * TWO_PI * (double) q / mp); + a[cFig][q].y = my / 2 + ry * cos(3 * TWO_PI * (double) q / mp); + } + a[cFig][mp].x = a[cFig][0].x; + a[cFig][mp].y = a[cFig][0].y; + ++cFig; + + /* + * Figure 3 + */ + a[cFig] = (XPoint *) xmalloc(cPoint * sizeof(XPoint)); + rx = mx / 2; + ry = my / 2; + for (q = 0; q < cPoint; q++) { + a[cFig][q].x = mx / 2 + ry * sin(3 * TWO_PI * (double) q / mp); + a[cFig][q].y = my / 2 + ry * cos(1 * TWO_PI * (double) q / mp); + } + a[cFig][mp].x = a[cFig][0].x; + a[cFig][mp].y = a[cFig][0].y; + ++cFig; + + /* + * Figure 4 + */ + a[cFig] = (XPoint *) xmalloc(cPoint * sizeof(XPoint)); + rx = mx / 2; + ry = my / 2; + for (q = 0; q < cPoint; q++) { + a[cFig][q].x = mx / 2 + ry * (1 - 0.1 * frnd()) + * sin(TWO_PI * (double) q / mp); + a[cFig][q].y = my / 2 + ry * (1 - 0.1 * frnd()) + * cos(TWO_PI * (double) q / mp); + } + a[cFig][mp].x = a[cFig][0].x; + a[cFig][mp].y = a[cFig][0].y; + ++cFig; + + /* + * Figure 5 + */ + a[cFig] = (XPoint *) xmalloc(cPoint * sizeof(XPoint)); + rx = mx / 2; + ry = my / 2; + for (q = 0; q < cPoint; q++) { + a[cFig][q].x = mx / 2 + ry * (0.8 - 0.2 * sin(30 * TWO_PI * q / mp)) + * sin(TWO_PI * (double) q / mp); + a[cFig][q].y = my / 2 + ry * (0.8 - 0.2 * sin(30 * TWO_PI * q / mp)) + * cos(TWO_PI * (double) q / mp); + } + a[cFig][mp].x = a[cFig][0].x; + a[cFig][mp].y = a[cFig][0].y; + ++cFig; + + /* + * Figure 6 + */ + a[cFig] = (XPoint *) xmalloc(cPoint * sizeof(XPoint)); + rx = mx / 2; + ry = my / 2; + for (q = 0; q < cPoint; q++) { + a[cFig][q].x = mx / 2 + ry * sin(TWO_PI * (double) q / mp); + a[cFig][q].y = my / 2 + ry * cos(TWO_PI * (double) q / mp); + } + a[cFig][mp].x = a[cFig][0].x; + a[cFig][mp].y = a[cFig][0].y; + ++cFig; + + /* + * Figure 7 + */ + a[cFig] = (XPoint *) xmalloc(cPoint * sizeof(XPoint)); + rx = mx / 2; + ry = my / 2; + for (q = 0; q < cPoint; q++) { + a[cFig][q].x = mx / 2 + rx * cos(TWO_PI * (double) q / mp); + a[cFig][q].y = my / 2 + ry * sin(TWO_PI * (double) q / mp); + } + a[cFig][mp].x = a[cFig][0].x; + a[cFig][mp].y = a[cFig][0].y; + ++cFig; + + /* + * Figure 8 + */ + a[cFig] = (XPoint *) xmalloc(cPoint * sizeof(XPoint)); + for (q = 0; q < cPoint; q++) { + a[cFig][q].x = ((double) q / mp) * mx; + a[cFig][q].y = (1.0 - cos(((double) q / mp) * 3 * TWO_PI)) * my / 2.0; + } + ++cFig; + + /* + * Figure 9 + */ + a[cFig] = (XPoint *) xmalloc(cPoint * sizeof(XPoint)); + rx = mx / 2; + ry = my / 2; + for (q = 0; q < cPoint; q++) { + a[cFig][q].x = mx / 2 + rx * sin(2 * TWO_PI * (double) q / mp); + a[cFig][q].y = my / 2 + ry * cos(3 * TWO_PI * (double) q / mp); + } + a[cFig][mp].x = a[cFig][0].x; + a[cFig][mp].y = a[cFig][0].y; + ++cFig; + + /* + * Figure 10 + */ + a[cFig] = (XPoint *) xmalloc(cPoint * sizeof(XPoint)); + rx = mx / 2; + ry = my / 2; + for (q = 0; q < cPoint; q++) { + a[cFig][q].x = mx / 2 + ry * sin(5 * TWO_PI * (double) q / mp) + * ((double) q / mp); + a[cFig][q].y = my / 2 + ry * cos(5 * TWO_PI * (double) q / mp) + * ((double) q / mp); + } + ++cFig; + + /* + * Figure 11 + */ + a[cFig] = (XPoint *) xmalloc(cPoint * sizeof(XPoint)); + rx = mx / 2; + ry = my / 2; + for (q = 0; q < cPoint; q++) { + a[cFig][q].x = mx / 2 + ry * sin(6 * TWO_PI * (double) q / mp) + * ((double) q / mp); + a[cFig][q].y = my / 2 - ry * cos(6 * TWO_PI * (double) q / mp) + * ((double) q / mp); + } + ++cFig; + + /* + * Figure 12 + */ + a[cFig] = (XPoint *) xmalloc(cPoint * sizeof(XPoint)); + for (q = 0; q < cPoint; q++) { + a[cFig][q].x = ((double) q / mp) * mx; + a[cFig][q].y = (1.0 - sin(((double) q / mp) * 5 * TWO_PI)) * my / 2.0; + } + ++cFig; + +#ifdef MARGINS + /* + * Make some space around the figures. + */ + marginx = (mx + 1) / 10; + marginy = (my + 1) / 10; + scalex = (double) ((mx + 1) - 2.0 * marginx) / (mx + 1.0); + scaley = (double) ((my + 1) - 2.0 * marginy) / (my + 1.0); + for (q = 0; q < cFig; q++) + for (w = 0; w < cPoint; w++) { + a[q][w].x = marginx + a[q][w].x * scalex; + a[q][w].y = marginy + a[q][w].y * scaley; + } +#endif +} + + + +static void createPoints() +{ + int q; + XPoint *pa = aCurr, *pa1 = aFrom, *pa2 = aTo; + long lg, l1g; + + + lg = 8192L * gam, l1g = 8192L * (1.0 - gam); + for (q = 0; q < cPoint; q++) { + pa->x = (short) ((l1g * pa1->x + lg * pa2->x) / 8192L); + pa->y = (short) ((l1g * pa1->y + lg * pa2->y) / 8192L); + ++pa; + ++pa1; + ++pa2; + } +} + + +static void drawImage() +{ + register int q; + XPoint *old0, *old1, *new0, *new1; + + /* + * Problem: update the window without too much flickering. I do + * this by handling each linesegment separately. First remove a + * line, then draw the new line. The problem is that this leaves + * small black pixels on the figure. To fix this, I draw the + * entire figure using XDrawLines() afterwards. + */ + if (aPrev) { + old0 = aPrev; + old1 = aPrev + 1; + new0 = aCurr; + new1 = aCurr + 1; + for (q = cPoint - 1; q; q--) { + XDrawLine(dpy, window, gcClear, + old0->x, old0->y, old1->x, old1->y); + XDrawLine(dpy, window, gcDraw, + new0->x, new0->y, new1->x, new1->y); + ++old0; + ++old1; + ++new0; + ++new1; + } + } + XDrawLines(dpy, window, gcDraw, aCurr, cPoint, CoordModeOrigin); + XFlush(dpy); +} + +static void initLMorph() +{ + int steps; + XGCValues gcv; + XWindowAttributes wa; + Colormap cmap; + + cPoint = get_integer_resource("points", "Integer"); + steps = get_integer_resource("steps", "Integer"); + delay = get_integer_resource("delay", "Integer"); + + if (steps <= 0) + steps = (random() % 400) + 100; + + delta_gam = 1.0 / steps; + XGetWindowAttributes(dpy, window, &wa); + cmap = wa.colormap; + gcv.foreground = get_pixel_resource("foreground", "Foreground", dpy, cmap); + gcDraw = XCreateGC(dpy, window, GCForeground, &gcv); + XSetForeground(dpy, gcDraw, gcv.foreground); + gcv.foreground = get_pixel_resource("background", "Background", dpy, cmap); + gcClear = XCreateGC(dpy, window, GCForeground, &gcv); + XClearWindow(dpy, window); + + srandom(time(NULL)); + initPointArrays(); + aCurr = aWork[nWork = 0]; + aPrev = NULL; + gam = 2.0; + nTo = RND(cFig); +} + +static void animateLMorph() +{ + if (gam > maxGamma) { + gam = 0.0; + if (maxGamma == 1.0) { + nFrom = nTo; + aFrom = a[nFrom]; + } else { + memcpy(aTmp, aCurr, cPoint * sizeof(XPoint)); + aFrom = aTmp; + nFrom = -1; + } + do { + nTo = RND(cFig); + } while (nTo == nFrom); + aTo = a[nTo]; + if (RND(2)) { + /* + * Reverse the array to get more variation. + */ + int i1, i2; + XPoint p; + + for (i1 = 0, i2 = cPoint - 1; i1 < cPoint / 2; i1++, i2--) { + p = aTo[i1]; + aTo[i1] = aTo[i2]; + aTo[i2] = p; + } + } + /* + * It may be nice to interrupt the next run. + */ + if (RND(3) > 0) + maxGamma = 0.1 + 0.7 * (RND(1001) / 1000.0); + else + maxGamma = 1.0; + } + + createPoints(); + drawImage(); + aPrev = aCurr; + aCurr = aWork[nWork ^= 1]; + + gam += delta_gam; +} + + + +/************************************************************************** + * * + * P U B L I C F U N C T I O N S * + * * + **************************************************************************/ + +void screenhack(disp, win) + Display *disp; + Window win; +{ + dpy = disp; + window = win; + initLMorph(); + for (;;) { + animateLMorph(); + screenhack_usleep(delay); + } +} diff --git a/hacks/lmorph.c_ori b/hacks/lmorph.c_ori new file mode 100755 index 00000000..9672f962 --- /dev/null +++ b/hacks/lmorph.c_ori @@ -0,0 +1,501 @@ + +/************************************************************************** + * + * FILE lmorph.c + * MODULE OF xscreensaver + * + * DESCRIPTION Bilinear interpolation for morphing line shapes. + * + * WRITTEN BY Sverre H. Huseby Glenn T. Lines + * Maridalsvn. 122, leil 101 Frysjavn. 3, 5. etg. + * N-0461 Oslo N-0883 Oslo + * Norway Norway + * + * Phone: +47 22 71 99 08 Phone: +47 22 23 71 99 + * E-mail: sverrehu@ifi.uio.no E-mail: gtl@si.sintef.no + * + * The original idea, and the bilinear interpolation + * mathematics used, emerged in the head of the wise + * Glenn Terje Lines. + * + * MODIFICATIONS march 1995 + * * Converted from an MS-Windows program to X Window. + * + **************************************************************************/ + +#include +#include +#include +#include +#include "screenhack.h" + +/************************************************************************** + * * + * P R I V A T E D A T A * + * * + **************************************************************************/ + +/* Define MARGINS to make some space around the figure */ +#define MARGINS /**/ + +#define MAXFIGS 20 +#define TWO_PI (2.0 * M_PI) +#define RND(x) (random() % (x)) +static int + cFig = 0, /* Number of figure arrays. */ + cPoint, /* Number of points in each array. */ + nWork, /* Current work array number. */ + nFrom, /* Current from array number. */ + nTo; /* Current to array number. */ +static long + delay; /* usecs to wait between updates. */ +static XPoint + *aWork[2], /* Working arrays. */ + *a[MAXFIGS], /* The figure arrays. */ + *aTmp, /* Used as source when interrupting morph */ + *aPrev, /* Previous points displayed. */ + *aCurr, /* The current points displayed. */ + *aFrom, /* Figure converting from. */ + *aTo; /* Figure converting to. */ +static double + gam, + maxGamma = 1.0, + delta_gam; +static GC + gcDraw, gcClear; +static Display + *dpy; +static Window + window; + + + +/************************************************************************** + * * + * P U B L I C D A T A * + * * + **************************************************************************/ + +char *progclass = "LMorph"; + +char *defaults [] = { + "LMorph.background: black", + "LMorph.foreground: green", + "*points: 150", + "*steps: 0", + "*delay: 50000", + 0 +}; + +XrmOptionDescRec options [] = { + { "-points", ".points", XrmoptionSepArg, 0 }, + { "-steps", ".steps", XrmoptionSepArg, 0 }, + { "-delay", ".delay", XrmoptionSepArg, 0 }, +}; +int options_size = (sizeof (options) / sizeof (options[0])); + + + +/************************************************************************** + * * + * P R I V A T E F U N C T I O N S * + * * + **************************************************************************/ + +static void *xmalloc(size) + size_t size; +{ + void *ret; + + if ((ret = malloc(size)) == NULL) { + fprintf(stderr, "lmorph: out of memory\n"); + exit(1); + } + return ret; +} + + + +static double frnd() +{ + /* + * Hm. for some reason the second line (using RAND_MAX) didn't + * work on some machines, so I always use the first. + */ +#undef RAND_MAX +#ifndef RAND_MAX + return (double) (random() & 0x7FFF) / 0x7FFF; +#else + return ((double) random()) / RAND_MAX; +#endif +} + + + +static void initPointArrays() +{ + XWindowAttributes wa; + int q, w, + mx, my, /* Max screen coordinates. */ + mp, /* Max point number. */ + s, rx, ry, + marginx, marginy; + double scalex, scaley; + + XGetWindowAttributes(dpy, window, &wa); + mx = wa.width - 1; + my = wa.height - 1; + mp = cPoint - 1; + + aWork[0] = (XPoint *) xmalloc(cPoint * sizeof(XPoint)); + aWork[1] = (XPoint *) xmalloc(cPoint * sizeof(XPoint)); + aTmp = (XPoint *) xmalloc(cPoint * sizeof(XPoint)); + + + /* + * Figure 0 + */ + a[cFig] = (XPoint *) xmalloc(cPoint * sizeof(XPoint)); + s = cPoint / 4; + for (q = 0; q < s; q++) { + a[cFig][q].x = ((double) q / s) * mx; + a[cFig][q].y = 0; + a[cFig][s + q].x = mx; + a[cFig][s + q].y = ((double) q / s) * my; + a[cFig][2 * s + q].x = mx - ((double) q / s) * mx; + a[cFig][2 * s + q].y = my; + a[cFig][3 * s + q].x = 0; + a[cFig][3 * s + q].y = my - ((double) q / s) * my; + } + for (q = 4 * s; q < cPoint; q++) + a[cFig][q].x = a[cFig][q].y = 0; + a[cFig][mp].x = a[cFig][0].x; + a[cFig][mp].y = a[cFig][0].y; + ++cFig; + + /* + * Figure 1 + */ + a[cFig] = (XPoint *) xmalloc(cPoint * sizeof(XPoint)); + for (q = 0; q < cPoint; q++) { + a[cFig][q].x = ((double) q / cPoint) * mx; + a[cFig][q].y = (1.0 - sin(((double) q / mp) * TWO_PI)) * my / 2.0; + } + ++cFig; + + /* + * Figure 2 + */ + a[cFig] = (XPoint *) xmalloc(cPoint * sizeof(XPoint)); + rx = mx / 2; + ry = my / 2; + for (q = 0; q < cPoint; q++) { + a[cFig][q].x = mx / 2 + rx * sin(1 * TWO_PI * (double) q / mp); + a[cFig][q].y = my / 2 + ry * cos(3 * TWO_PI * (double) q / mp); + } + a[cFig][mp].x = a[cFig][0].x; + a[cFig][mp].y = a[cFig][0].y; + ++cFig; + + /* + * Figure 3 + */ + a[cFig] = (XPoint *) xmalloc(cPoint * sizeof(XPoint)); + rx = mx / 2; + ry = my / 2; + for (q = 0; q < cPoint; q++) { + a[cFig][q].x = mx / 2 + ry * sin(3 * TWO_PI * (double) q / mp); + a[cFig][q].y = my / 2 + ry * cos(1 * TWO_PI * (double) q / mp); + } + a[cFig][mp].x = a[cFig][0].x; + a[cFig][mp].y = a[cFig][0].y; + ++cFig; + + /* + * Figure 4 + */ + a[cFig] = (XPoint *) xmalloc(cPoint * sizeof(XPoint)); + rx = mx / 2; + ry = my / 2; + for (q = 0; q < cPoint; q++) { + a[cFig][q].x = mx / 2 + ry * (1 - 0.1 * frnd()) + * sin(TWO_PI * (double) q / mp); + a[cFig][q].y = my / 2 + ry * (1 - 0.1 * frnd()) + * cos(TWO_PI * (double) q / mp); + } + a[cFig][mp].x = a[cFig][0].x; + a[cFig][mp].y = a[cFig][0].y; + ++cFig; + + /* + * Figure 5 + */ + a[cFig] = (XPoint *) xmalloc(cPoint * sizeof(XPoint)); + rx = mx / 2; + ry = my / 2; + for (q = 0; q < cPoint; q++) { + a[cFig][q].x = mx / 2 + ry * (0.8 - 0.2 * sin(30 * TWO_PI * q / mp)) + * sin(TWO_PI * (double) q / mp); + a[cFig][q].y = my / 2 + ry * (0.8 - 0.2 * sin(30 * TWO_PI * q / mp)) + * cos(TWO_PI * (double) q / mp); + } + a[cFig][mp].x = a[cFig][0].x; + a[cFig][mp].y = a[cFig][0].y; + ++cFig; + + /* + * Figure 6 + */ + a[cFig] = (XPoint *) xmalloc(cPoint * sizeof(XPoint)); + rx = mx / 2; + ry = my / 2; + for (q = 0; q < cPoint; q++) { + a[cFig][q].x = mx / 2 + ry * sin(TWO_PI * (double) q / mp); + a[cFig][q].y = my / 2 + ry * cos(TWO_PI * (double) q / mp); + } + a[cFig][mp].x = a[cFig][0].x; + a[cFig][mp].y = a[cFig][0].y; + ++cFig; + + /* + * Figure 7 + */ + a[cFig] = (XPoint *) xmalloc(cPoint * sizeof(XPoint)); + rx = mx / 2; + ry = my / 2; + for (q = 0; q < cPoint; q++) { + a[cFig][q].x = mx / 2 + rx * cos(TWO_PI * (double) q / mp); + a[cFig][q].y = my / 2 + ry * sin(TWO_PI * (double) q / mp); + } + a[cFig][mp].x = a[cFig][0].x; + a[cFig][mp].y = a[cFig][0].y; + ++cFig; + + /* + * Figure 8 + */ + a[cFig] = (XPoint *) xmalloc(cPoint * sizeof(XPoint)); + for (q = 0; q < cPoint; q++) { + a[cFig][q].x = ((double) q / mp) * mx; + a[cFig][q].y = (1.0 - cos(((double) q / mp) * 3 * TWO_PI)) * my / 2.0; + } + ++cFig; + + /* + * Figure 9 + */ + a[cFig] = (XPoint *) xmalloc(cPoint * sizeof(XPoint)); + rx = mx / 2; + ry = my / 2; + for (q = 0; q < cPoint; q++) { + a[cFig][q].x = mx / 2 + rx * sin(2 * TWO_PI * (double) q / mp); + a[cFig][q].y = my / 2 + ry * cos(3 * TWO_PI * (double) q / mp); + } + a[cFig][mp].x = a[cFig][0].x; + a[cFig][mp].y = a[cFig][0].y; + ++cFig; + + /* + * Figure 10 + */ + a[cFig] = (XPoint *) xmalloc(cPoint * sizeof(XPoint)); + rx = mx / 2; + ry = my / 2; + for (q = 0; q < cPoint; q++) { + a[cFig][q].x = mx / 2 + ry * sin(5 * TWO_PI * (double) q / mp) + * ((double) q / mp); + a[cFig][q].y = my / 2 + ry * cos(5 * TWO_PI * (double) q / mp) + * ((double) q / mp); + } + ++cFig; + + /* + * Figure 11 + */ + a[cFig] = (XPoint *) xmalloc(cPoint * sizeof(XPoint)); + rx = mx / 2; + ry = my / 2; + for (q = 0; q < cPoint; q++) { + a[cFig][q].x = mx / 2 + ry * sin(6 * TWO_PI * (double) q / mp) + * ((double) q / mp); + a[cFig][q].y = my / 2 - ry * cos(6 * TWO_PI * (double) q / mp) + * ((double) q / mp); + } + ++cFig; + + /* + * Figure 12 + */ + a[cFig] = (XPoint *) xmalloc(cPoint * sizeof(XPoint)); + for (q = 0; q < cPoint; q++) { + a[cFig][q].x = ((double) q / mp) * mx; + a[cFig][q].y = (1.0 - sin(((double) q / mp) * 5 * TWO_PI)) * my / 2.0; + } + ++cFig; + +#ifdef MARGINS + /* + * Make some space around the figures. + */ + marginx = (mx + 1) / 10; + marginy = (my + 1) / 10; + scalex = (double) ((mx + 1) - 2.0 * marginx) / (mx + 1.0); + scaley = (double) ((my + 1) - 2.0 * marginy) / (my + 1.0); + for (q = 0; q < cFig; q++) + for (w = 0; w < cPoint; w++) { + a[q][w].x = marginx + a[q][w].x * scalex; + a[q][w].y = marginy + a[q][w].y * scaley; + } +#endif +} + + + +static void createPoints() +{ + int q; + XPoint *pa = aCurr, *pa1 = aFrom, *pa2 = aTo; + long lg, l1g; + + + lg = 8192L * gam, l1g = 8192L * (1.0 - gam); + for (q = 0; q < cPoint; q++) { + pa->x = (short) ((l1g * pa1->x + lg * pa2->x) / 8192L); + pa->y = (short) ((l1g * pa1->y + lg * pa2->y) / 8192L); + ++pa; + ++pa1; + ++pa2; + } +} + + +static void drawImage() +{ + register int q; + XPoint *old0, *old1, *new0, *new1; + + /* + * Problem: update the window without too much flickering. I do + * this by handling each linesegment separately. First remove a + * line, then draw the new line. The problem is that this leaves + * small black pixels on the figure. To fix this, I draw the + * entire figure using XDrawLines() afterwards. + */ + if (aPrev) { + old0 = aPrev; + old1 = aPrev + 1; + new0 = aCurr; + new1 = aCurr + 1; + for (q = cPoint - 1; q; q--) { + XDrawLine(dpy, window, gcClear, + old0->x, old0->y, old1->x, old1->y); + XDrawLine(dpy, window, gcDraw, + new0->x, new0->y, new1->x, new1->y); + ++old0; + ++old1; + ++new0; + ++new1; + } + } + XDrawLines(dpy, window, gcDraw, aCurr, cPoint, CoordModeOrigin); + XFlush(dpy); +} + +static void initLMorph() +{ + int steps; + XGCValues gcv; + XWindowAttributes wa; + Colormap cmap; + + cPoint = get_integer_resource("points", "Integer"); + steps = get_integer_resource("steps", "Integer"); + delay = get_integer_resource("delay", "Integer"); + + if (steps <= 0) + steps = (random() % 400) + 100; + + delta_gam = 1.0 / steps; + XGetWindowAttributes(dpy, window, &wa); + cmap = wa.colormap; + gcv.foreground = get_pixel_resource("foreground", "Foreground", dpy, cmap); + gcDraw = XCreateGC(dpy, window, GCForeground, &gcv); + XSetForeground(dpy, gcDraw, gcv.foreground); + gcv.foreground = get_pixel_resource("background", "Background", dpy, cmap); + gcClear = XCreateGC(dpy, window, GCForeground, &gcv); + XClearWindow(dpy, window); + + srandom(time(NULL)); + initPointArrays(); + aCurr = aWork[nWork = 0]; + aPrev = NULL; + gam = 2.0; + nTo = RND(cFig); +} + +static void animateLMorph() +{ + if (gam > maxGamma) { + gam = 0.0; + if (maxGamma == 1.0) { + nFrom = nTo; + aFrom = a[nFrom]; + } else { + memcpy(aTmp, aCurr, cPoint * sizeof(XPoint)); + aFrom = aTmp; + nFrom = -1; + } + do { + nTo = RND(cFig); + } while (nTo == nFrom); + aTo = a[nTo]; + if (RND(2)) { + /* + * Reverse the array to get more variation. + */ + int i1, i2; + XPoint p; + + for (i1 = 0, i2 = cPoint - 1; i1 < cPoint / 2; i1++, i2--) { + p = aTo[i1]; + aTo[i1] = aTo[i2]; + aTo[i2] = p; + } + } + /* + * It may be nice to interrupt the next run. + */ + if (RND(3) > 0) + maxGamma = 0.1 + 0.7 * (RND(1001) / 1000.0); + else + maxGamma = 1.0; + } + + createPoints(); + drawImage(); + aPrev = aCurr; + aCurr = aWork[nWork ^= 1]; + + gam += delta_gam; +} + + + +/************************************************************************** + * * + * P U B L I C F U N C T I O N S * + * * + **************************************************************************/ + +void screenhack(disp, win) + Display *disp; + Window win; +{ + dpy = disp; + window = win; + initLMorph(); + for (;;) { + animateLMorph(); + screenhack_usleep(delay); + } +} diff --git a/hacks/lmorph.exe_axp b/hacks/lmorph.exe_axp new file mode 100755 index 0000000000000000000000000000000000000000..ec6c0917dc5e8f95cca9c97e1f0d13665d4095ce GIT binary patch literal 46080 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 Y7pSu~ImmUMYvfh=HKcrld0&721%jWZ@c;k- literal 0 HcmV?d00001 diff --git a/hacks/lmorph.exe_vax b/hacks/lmorph.exe_vax new file mode 100755 index 0000000000000000000000000000000000000000..758e14727fc50d3752b07cd3d00b25c5d8badb76 GIT binary patch literal 19968 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 P0jb_WHZ(X$o@W0A=4u&N literal 0 HcmV?d00001 diff --git a/hacks/lmorph.hlp b/hacks/lmorph.hlp new file mode 100755 index 00000000..d94142b6 --- /dev/null +++ b/hacks/lmorph.hlp @@ -0,0 +1,54 @@ +1 LMORPH +Morphing lines + +SYNOPSIS + + $ lmorph [-display host:display.screen] [-foreground color] + [-background color] [-window] [-root] [-mono] [-install] + [-visual visual] [-points int] [-steps int] [-delay usecs] + +2 DESCRIPTION +The lmorph program morphs between simple linedrawings using bilinear +interpolation. + +2 OPTIONS +Lmorph accepts the following options: + + -window +Draw on a newly-created window. This is the default. + + -root +Draw on the root window. + + -mono +If on a color display, pretend we're on a monochrome display. + + -install +Install a private colormap for the window. + + -visual visual +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. + + -points integer +Number of points in each line drawing. Default is 150 points. + + -steps integer +Interpolation steps from one drawing to the next. Default is 0, which +means a random number between 100 and 500. + + -delay microseconds +How much of a delay should be introduced between steps of the animation. +Default 50000. + +2 ENVIRONMENT + DISPLAY +to get the default host and display number. + + XENVIRONMENT +to get the name of a resource file that overrides the global resources +stored in the RESOURCE_MANAGER property. + +2 AUTHOR +Sverre H. Huseby and Glenn T. Lines , +built on top of the screen saver routines by Jamie Zawinski . diff --git a/hacks/lmorph.man b/hacks/lmorph.man new file mode 100755 index 00000000..a631f24c --- /dev/null +++ b/hacks/lmorph.man @@ -0,0 +1,54 @@ +.TH LMORPH 1 "xscreensaver hack" +.SH NAME +lmorph \- morphing lines +.SH SYNOPSIS +.B lmorph +[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP] [\-background \fIcolor\fP] [\-window] [\-root] [\-mono] [\-install] [\-visual \fIvisual\fP] [\-points \fIint\fP] [\-steps \fIint\fP] [\-delay \fIusecs\fP] +.SH DESCRIPTION +The \fIlmorph\fP program morphs between simple linedrawings using bilinear +interpolation. +.SH OPTIONS +.I lmorph +accepts the following options: +.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 \-mono +If on a color display, pretend we're on a monochrome display. +.TP 8 +.B \-install +Install a private colormap for the window. +.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 \-points \fIinteger\fP +Number of points in each line drawing. Default is 150 points. +.TP 8 +.B \-steps \fIinteger\fP +Interpolation steps from one drawing to the next. Default is 0, which +means a random number between 100 and 500. +.TP 8 +.B \-delay \fImicroseconds\fP +How much of a delay should be introduced between steps of the animation. +Default 50000. +.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. +.SH SEE ALSO +.BR X (1), +.BR xscreensaver (1) +.SH AUTHOR +Sverre H. Huseby and Glenn T. Lines , +built on top of the screen saver routines by Jamie Zawinski . diff --git a/hacks/maze.c b/hacks/maze.c new file mode 100755 index 00000000..1820a55b --- /dev/null +++ b/hacks/maze.c @@ -0,0 +1,802 @@ +/****************************************************************************** + * [ maze ] ... + * + * modified: [ 8-11-95 ] Ed James + * added fill of dead-end box to solve_maze while loop. + * modified: [ 3-7-93 ] Jamie Zawinski + * added the XRoger logo, cleaned up resources, made + * grid size a parameter. + * modified: [ 3-3-93 ] Jim Randell + * Added the colour stuff and integrated it with jwz's + * screenhack stuff. There's still some work that could + * be done on this, particularly allowing a resource to + * specify how big the squares are. + * modified: [ 10-4-88 ] Richard Hess ...!uunet!cimshop!rhess + * [ Revised primary execution loop within main()... + * [ Extended X event handler, check_events()... + * modified: [ 1-29-88 ] Dave Lemke lemke@sun.com + * [ Hacked for X11... + * [ Note the word "hacked" -- this is extremely ugly, but at + * [ least it does the job. NOT a good programming example + * [ for X. + * original: [ 6/21/85 ] Martin Weiss Sun Microsystems [ SunView ] + * + ****************************************************************************** + Copyright 1988 by Sun Microsystems, Inc. Mountain View, CA. + + All Rights Reserved + + Permission to use, copy, modify, and distribute this software and its + documentation for any purpose and without fee is hereby granted, + provided that the above copyright notice appear in all copies and that + both that copyright notice and this permission notice appear in + supporting documentation, and that the names of Sun or MIT not be + used in advertising or publicity pertaining to distribution of the + software without specific prior written permission. Sun and M.I.T. + make no representations about the suitability of this software for + any purpose. It is provided "as is" without any express or implied warranty. + + SUN DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING + ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + PURPOSE. IN NO EVENT SHALL SUN BE LIABLE FOR ANY SPECIAL, INDIRECT + OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS + OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE + OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE + OR PERFORMANCE OF THIS SOFTWARE. + *****************************************************************************/ + +#include "screenhack.h" + +#define XROGER + +static int solve_delay, pre_solve_delay, post_solve_delay; + +#include +#include +#include + +#ifndef VMS +#include +#else +#include "sys$common:[decw$include.bitmaps]gray1.xbm" +#endif + + +#define MAX_MAZE_SIZE_X 500 +#define MAX_MAZE_SIZE_Y 500 + +#define MOVE_LIST_SIZE (MAX_MAZE_SIZE_X * MAX_MAZE_SIZE_Y) + +#define WALL_TOP 0x8000 +#define WALL_RIGHT 0x4000 +#define WALL_BOTTOM 0x2000 +#define WALL_LEFT 0x1000 + +#define DOOR_IN_TOP 0x800 +#define DOOR_IN_RIGHT 0x400 +#define DOOR_IN_BOTTOM 0x200 +#define DOOR_IN_LEFT 0x100 +#define DOOR_IN_ANY 0xF00 + +#define DOOR_OUT_TOP 0x80 +#define DOOR_OUT_RIGHT 0x40 +#define DOOR_OUT_BOTTOM 0x20 +#define DOOR_OUT_LEFT 0x10 + +#define START_SQUARE 0x2 +#define END_SQUARE 0x1 + +#define border_x (0) +#define border_y (0) + +#define get_random(x) (random() % (x)) + +static int logo_x, logo_y; + +#ifdef XROGER +# define logo_width 128 +# define logo_height 128 +#else +#ifndef VMS +# include +#else +# include "sys$common:[decw$include.bitmaps]xlogo64.xbm" +#endif /* VMS */ +# define logo_width xlogo64_width +# define logo_height xlogo64_height +# define logo_bits xlogo64_bits +#endif + +static unsigned short maze[MAX_MAZE_SIZE_X][MAX_MAZE_SIZE_Y]; + +static struct { + unsigned char x; + unsigned char y; + unsigned char dir; +} move_list[MOVE_LIST_SIZE], save_path[MOVE_LIST_SIZE], path[MOVE_LIST_SIZE]; + +static int maze_size_x, maze_size_y; +static int sqnum, cur_sq_x, cur_sq_y, path_length; +static int start_x, start_y, start_dir, end_x, end_y, end_dir; +static int grid_width, grid_height; + +static Display *dpy; +static Window win; +static GC gc, cgc, tgc, logo_gc; +static Pixmap logo_map; + +static int x = 0, y = 0, restart = 0, stop = 1, state = 1; + +static int +check_events() /* X event handler [ rhess ] */ +{ + XEvent e; + + if (XPending(dpy)) { + XNextEvent(dpy, &e); + switch (e.type) { + + case ButtonPress: + switch (e.xbutton.button) { + case 3: + exit (0); + break; + case 2: + stop = !stop ; + if (state == 5) state = 4 ; + else { + restart = 1; + stop = 0; + } + break; + default: + restart = 1 ; + stop = 0 ; + break; + } + break; + + case ConfigureNotify: + restart = 1; + break; + case UnmapNotify: + stop = 1; + XClearWindow (dpy, win); + XSync (dpy, False); + break; + case Expose: + restart = 1; + break; + } + return(1); + } + return(0); +} + + +static void +set_maze_sizes (width, height) + int width, height; +{ + maze_size_x = width / grid_width; + maze_size_y = height / grid_height; +} + + +static void +initialize_maze() /* draw the surrounding wall and start/end squares */ +{ + register int i, j, wall; + + /* initialize all squares */ + for ( i=0; i> wall ); + maze[i][j] &= ~( WALL_TOP >> wall ); + cur_sq_x = i; + cur_sq_y = j; + start_x = i; + start_y = j; + start_dir = wall; + sqnum = 0; + + /* set end square */ + wall = (wall + 2)%4; + switch (wall) { + case 0: + i = get_random(maze_size_x); + j = 0; + break; + case 1: + i = maze_size_x - 1; + j = get_random(maze_size_y); + break; + case 2: + i = get_random(maze_size_x); + j = maze_size_y - 1; + break; + case 3: + i = 0; + j = get_random(maze_size_y); + break; + } + maze[i][j] |= END_SQUARE; + maze[i][j] |= ( DOOR_OUT_TOP >> wall ); + maze[i][j] &= ~( WALL_TOP >> wall ); + end_x = i; + end_y = j; + end_dir = wall; + + /* set logo */ + if ((maze_size_x > 15) && (maze_size_y > 15)) + { + int logow = 1 + logo_width / grid_width; + int logoh = 1 + logo_height / grid_height; + /* not closer than 3 grid units from a wall */ + logo_x = get_random (maze_size_x - logow - 6) + 3; + logo_y = get_random (maze_size_y - logoh - 6) + 3; + for (i=0; i> newdoor ); + + switch (newdoor) { + case 0: cur_sq_y--; + break; + case 1: cur_sq_x++; + break; + case 2: cur_sq_y++; + break; + case 3: cur_sq_x--; + break; + } + sqnum++; + + /* mark the in door */ + maze[cur_sq_x][cur_sq_y] |= ( DOOR_IN_TOP >> ((newdoor+2)%4) ); + + /* if end square set path length and save path */ + if ( maze[cur_sq_x][cur_sq_y] & END_SQUARE ) { + path_length = sqnum; + for ( i=0; i> start_dir); + maze[end_x][end_y] |= (WALL_TOP >> end_dir); + + /* initialize search path */ + i = 0; + path[i].x = end_x; + path[i].y = end_y; + path[i].dir = -1; + + /* do it */ + while (1) { + if ( ++path[i].dir >= 4 ) { + XFillRectangle(dpy, win, cgc, + border_x + bw + grid_width * (int)(path[i].x), + border_y + bw + grid_height * (int)(path[i].y), + grid_width - (bw+bw), grid_height - (bw+bw)); + i--; + draw_solid_square( (int)(path[i].x), (int)(path[i].y), + (int)(path[i].dir), cgc); + } + else if ( ! (maze[path[i].x][path[i].y] & + (WALL_TOP >> path[i].dir)) && + ( (i == 0) || ( (path[i].dir != + (int)(path[i-1].dir+2)%4) ) ) ) { + enter_square(i); + i++; + if ( maze[path[i].x][path[i].y] & START_SQUARE ) { + return; + } + } + if (check_events()) return; + /* Abort solve on expose - cheapo repaint strategy */ + if (solve_delay) usleep (solve_delay); + } +} + + +static void +enter_square(n) /* move into a neighboring square */ + int n; +{ + draw_solid_square( (int)path[n].x, (int)path[n].y, + (int)path[n].dir, tgc); + + path[n+1].dir = -1; + switch (path[n].dir) { + case 0: path[n+1].x = path[n].x; + path[n+1].y = path[n].y - 1; + break; + case 1: path[n+1].x = path[n].x + 1; + path[n+1].y = path[n].y; + break; + case 2: path[n+1].x = path[n].x; + path[n+1].y = path[n].y + 1; + break; + case 3: path[n+1].x = path[n].x - 1; + path[n+1].y = path[n].y; + break; + } +} + +/* ---- */ + + +/* + * jmr additions for Jamie Zawinski's screensaver stuff, + * note that the code above this has probably been hacked about in some + * arbitrary way. + */ + +char *progclass = "Maze"; + +char *defaults[] = { + "Maze.background: black", /* to placate SGI */ + "Maze.foreground: white", /* to placate SGI */ + "*gridSize: 0", + "*solveDelay: 5000", + "*preDelay: 2000000", + "*postDelay: 4000000", + "*liveColor: green", + "*deadColor: red", +#ifdef XROGER + "*logoColor: red3", +#endif + 0 +}; + +XrmOptionDescRec options[] = { + { "-grid-size", ".gridSize", XrmoptionSepArg, 0 }, + { "-solve-delay", ".solveDelay", XrmoptionSepArg, 0 }, + { "-pre-delay", ".preDelay", XrmoptionSepArg, 0 }, + { "-post-delay", ".postDelay", XrmoptionSepArg, 0 }, + { "-live-color", ".liveColor", XrmoptionSepArg, 0 }, + { "-dead-color", ".deadColor", XrmoptionSepArg, 0 } +}; + +int options_size = (sizeof(options)/sizeof(options[0])); + +void screenhack(display,window) + Display *display; + Window window; +{ + Pixmap gray; + int size, root; + XWindowAttributes xgwa; + unsigned long bg, fg, pfg, pbg, lfg; + + size = get_integer_resource ("gridSize", "Dimension"); + root = get_boolean_resource("root", "Boolean"); + solve_delay = get_integer_resource ("solveDelay", "Integer"); + pre_solve_delay = get_integer_resource ("preDelay", "Integer"); + post_solve_delay = get_integer_resource ("postDelay", "Integer"); + + if (size < 2) size = 7 + (random () % 30); + grid_width = grid_height = size; + bw = (size > 6 ? 3 : (size-1)/2); + + dpy = display; win = window; /* the maze stuff uses global variables */ + + XGetWindowAttributes (dpy, win, &xgwa); + + x = 0; + y = 0; + + set_maze_sizes (xgwa.width, xgwa.height); + + if (! root) + XSelectInput (dpy, win, ExposureMask|ButtonPressMask|StructureNotifyMask); + + gc = XCreateGC(dpy, win, 0, 0); + cgc = XCreateGC(dpy, win, 0, 0); + tgc = XCreateGC(dpy,win,0,0); + logo_gc = XCreateGC(dpy, win, 0, 0); + + gray = XCreateBitmapFromData (dpy,win,gray1_bits,gray1_width,gray1_height); + + bg = get_pixel_resource ("background","Background", dpy, xgwa.colormap); + fg = get_pixel_resource ("foreground","Foreground", dpy, xgwa.colormap); + lfg = get_pixel_resource ("logoColor", "Foreground", dpy, xgwa.colormap); + pfg = get_pixel_resource ("liveColor", "Foreground", dpy, xgwa.colormap); + pbg = get_pixel_resource ("deadColor", "Foreground", dpy, xgwa.colormap); + if (mono_p) lfg = pfg = fg; + + if (lfg == bg) + lfg = ((bg == WhitePixel (dpy, DefaultScreen (dpy))) + ? BlackPixel (dpy, DefaultScreen (dpy)) + : WhitePixel (dpy, DefaultScreen (dpy))); + + XSetForeground (dpy, gc, fg); + XSetBackground (dpy, gc, bg); + XSetForeground (dpy, cgc, pbg); + XSetBackground (dpy, cgc, bg); + XSetForeground (dpy, tgc, pfg); + XSetBackground (dpy, tgc, bg); + XSetForeground (dpy, logo_gc, lfg); + XSetBackground (dpy, logo_gc, bg); + + XSetStipple (dpy, cgc, gray); + XSetFillStyle (dpy, cgc, FillOpaqueStippled); + +#ifdef XROGER + { + int w, h; + XGCValues gcv; + GC draw_gc, erase_gc; + extern void skull (); + /* round up to grid size */ + w = ((logo_width / grid_width) + 1) * grid_width; + h = ((logo_height / grid_height) + 1) * grid_height; + logo_map = XCreatePixmap (dpy, win, w, h, 1); + gcv.foreground = 1L; + draw_gc = XCreateGC (dpy, logo_map, GCForeground, &gcv); + gcv.foreground = 0L; + erase_gc= XCreateGC (dpy, logo_map, GCForeground, &gcv); + XFillRectangle (dpy, logo_map, erase_gc, 0, 0, w, h); + skull (dpy, logo_map, draw_gc, erase_gc, 5, 0, w-10, h-10); + XFreeGC (dpy, draw_gc); + XFreeGC (dpy, erase_gc); + } +#else + if (!(logo_map = XCreateBitmapFromData (dpy, win, logo_bits, + logo_width, logo_height))) + { + fprintf (stderr, "Can't create logo pixmap\n"); + exit (1); + } +#endif + XMapRaised(dpy, win); + srandom(getpid()); + + restart = root; + + while (1) { /* primary execution loop [ rhess ] */ + if (check_events()) continue ; + if (restart || stop) goto pop; + switch (state) { + case 1: + initialize_maze(); + break; + case 2: + XClearWindow(dpy, win); + draw_maze_border(); + break; + case 3: + create_maze(); + break; + case 4: + XSync (dpy, False); + usleep (pre_solve_delay); + break; + case 5: + solve_maze(); + break; + case 6: + XSync (dpy, False); + usleep (post_solve_delay); + state = 0 ; + break; + default: + abort (); + } + ++state; + pop: + if (restart) + { + static XWindowAttributes wattr; + restart = 0; + stop = 0; + state = 1; + XGetWindowAttributes (dpy, win, &wattr); + set_maze_sizes (wattr.width, wattr.height); + XClearWindow (dpy, win); + XSync (dpy, False); + } + } +} diff --git a/hacks/maze.c_ori b/hacks/maze.c_ori new file mode 100755 index 00000000..6d73796e --- /dev/null +++ b/hacks/maze.c_ori @@ -0,0 +1,792 @@ +/****************************************************************************** + * [ maze ] ... + * + * modified: [ 8-11-95 ] Ed James + * added fill of dead-end box to solve_maze while loop. + * modified: [ 3-7-93 ] Jamie Zawinski + * added the XRoger logo, cleaned up resources, made + * grid size a parameter. + * modified: [ 3-3-93 ] Jim Randell + * Added the colour stuff and integrated it with jwz's + * screenhack stuff. There's still some work that could + * be done on this, particularly allowing a resource to + * specify how big the squares are. + * modified: [ 10-4-88 ] Richard Hess ...!uunet!cimshop!rhess + * [ Revised primary execution loop within main()... + * [ Extended X event handler, check_events()... + * modified: [ 1-29-88 ] Dave Lemke lemke@sun.com + * [ Hacked for X11... + * [ Note the word "hacked" -- this is extremely ugly, but at + * [ least it does the job. NOT a good programming example + * [ for X. + * original: [ 6/21/85 ] Martin Weiss Sun Microsystems [ SunView ] + * + ****************************************************************************** + Copyright 1988 by Sun Microsystems, Inc. Mountain View, CA. + + All Rights Reserved + + Permission to use, copy, modify, and distribute this software and its + documentation for any purpose and without fee is hereby granted, + provided that the above copyright notice appear in all copies and that + both that copyright notice and this permission notice appear in + supporting documentation, and that the names of Sun or MIT not be + used in advertising or publicity pertaining to distribution of the + software without specific prior written permission. Sun and M.I.T. + make no representations about the suitability of this software for + any purpose. It is provided "as is" without any express or implied warranty. + + SUN DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING + ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + PURPOSE. IN NO EVENT SHALL SUN BE LIABLE FOR ANY SPECIAL, INDIRECT + OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS + OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE + OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE + OR PERFORMANCE OF THIS SOFTWARE. + *****************************************************************************/ + +#include "screenhack.h" + +#define XROGER + +static int solve_delay, pre_solve_delay, post_solve_delay; + +#include +#include +#include +#include + +#define MAX_MAZE_SIZE_X 500 +#define MAX_MAZE_SIZE_Y 500 + +#define MOVE_LIST_SIZE (MAX_MAZE_SIZE_X * MAX_MAZE_SIZE_Y) + +#define WALL_TOP 0x8000 +#define WALL_RIGHT 0x4000 +#define WALL_BOTTOM 0x2000 +#define WALL_LEFT 0x1000 + +#define DOOR_IN_TOP 0x800 +#define DOOR_IN_RIGHT 0x400 +#define DOOR_IN_BOTTOM 0x200 +#define DOOR_IN_LEFT 0x100 +#define DOOR_IN_ANY 0xF00 + +#define DOOR_OUT_TOP 0x80 +#define DOOR_OUT_RIGHT 0x40 +#define DOOR_OUT_BOTTOM 0x20 +#define DOOR_OUT_LEFT 0x10 + +#define START_SQUARE 0x2 +#define END_SQUARE 0x1 + +#define border_x (0) +#define border_y (0) + +#define get_random(x) (random() % (x)) + +static int logo_x, logo_y; + +#ifdef XROGER +# define logo_width 128 +# define logo_height 128 +#else +# include +# define logo_width xlogo64_width +# define logo_height xlogo64_height +# define logo_bits xlogo64_bits +#endif + +static unsigned short maze[MAX_MAZE_SIZE_X][MAX_MAZE_SIZE_Y]; + +static struct { + unsigned char x; + unsigned char y; + unsigned char dir; +} move_list[MOVE_LIST_SIZE], save_path[MOVE_LIST_SIZE], path[MOVE_LIST_SIZE]; + +static int maze_size_x, maze_size_y; +static int sqnum, cur_sq_x, cur_sq_y, path_length; +static int start_x, start_y, start_dir, end_x, end_y, end_dir; +static int grid_width, grid_height; + +static Display *dpy; +static Window win; +static GC gc, cgc, tgc, logo_gc; +static Pixmap logo_map; + +static int x = 0, y = 0, restart = 0, stop = 1, state = 1; + +static int +check_events() /* X event handler [ rhess ] */ +{ + XEvent e; + + if (XPending(dpy)) { + XNextEvent(dpy, &e); + switch (e.type) { + + case ButtonPress: + switch (e.xbutton.button) { + case 3: + exit (0); + break; + case 2: + stop = !stop ; + if (state == 5) state = 4 ; + else { + restart = 1; + stop = 0; + } + break; + default: + restart = 1 ; + stop = 0 ; + break; + } + break; + + case ConfigureNotify: + restart = 1; + break; + case UnmapNotify: + stop = 1; + XClearWindow (dpy, win); + XSync (dpy, False); + break; + case Expose: + restart = 1; + break; + } + return(1); + } + return(0); +} + + +static void +set_maze_sizes (width, height) + int width, height; +{ + maze_size_x = width / grid_width; + maze_size_y = height / grid_height; +} + + +static void +initialize_maze() /* draw the surrounding wall and start/end squares */ +{ + register int i, j, wall; + + /* initialize all squares */ + for ( i=0; i> wall ); + maze[i][j] &= ~( WALL_TOP >> wall ); + cur_sq_x = i; + cur_sq_y = j; + start_x = i; + start_y = j; + start_dir = wall; + sqnum = 0; + + /* set end square */ + wall = (wall + 2)%4; + switch (wall) { + case 0: + i = get_random(maze_size_x); + j = 0; + break; + case 1: + i = maze_size_x - 1; + j = get_random(maze_size_y); + break; + case 2: + i = get_random(maze_size_x); + j = maze_size_y - 1; + break; + case 3: + i = 0; + j = get_random(maze_size_y); + break; + } + maze[i][j] |= END_SQUARE; + maze[i][j] |= ( DOOR_OUT_TOP >> wall ); + maze[i][j] &= ~( WALL_TOP >> wall ); + end_x = i; + end_y = j; + end_dir = wall; + + /* set logo */ + if ((maze_size_x > 15) && (maze_size_y > 15)) + { + int logow = 1 + logo_width / grid_width; + int logoh = 1 + logo_height / grid_height; + /* not closer than 3 grid units from a wall */ + logo_x = get_random (maze_size_x - logow - 6) + 3; + logo_y = get_random (maze_size_y - logoh - 6) + 3; + for (i=0; i> newdoor ); + + switch (newdoor) { + case 0: cur_sq_y--; + break; + case 1: cur_sq_x++; + break; + case 2: cur_sq_y++; + break; + case 3: cur_sq_x--; + break; + } + sqnum++; + + /* mark the in door */ + maze[cur_sq_x][cur_sq_y] |= ( DOOR_IN_TOP >> ((newdoor+2)%4) ); + + /* if end square set path length and save path */ + if ( maze[cur_sq_x][cur_sq_y] & END_SQUARE ) { + path_length = sqnum; + for ( i=0; i> start_dir); + maze[end_x][end_y] |= (WALL_TOP >> end_dir); + + /* initialize search path */ + i = 0; + path[i].x = end_x; + path[i].y = end_y; + path[i].dir = -1; + + /* do it */ + while (1) { + if ( ++path[i].dir >= 4 ) { + XFillRectangle(dpy, win, cgc, + border_x + bw + grid_width * (int)(path[i].x), + border_y + bw + grid_height * (int)(path[i].y), + grid_width - (bw+bw), grid_height - (bw+bw)); + i--; + draw_solid_square( (int)(path[i].x), (int)(path[i].y), + (int)(path[i].dir), cgc); + } + else if ( ! (maze[path[i].x][path[i].y] & + (WALL_TOP >> path[i].dir)) && + ( (i == 0) || ( (path[i].dir != + (int)(path[i-1].dir+2)%4) ) ) ) { + enter_square(i); + i++; + if ( maze[path[i].x][path[i].y] & START_SQUARE ) { + return; + } + } + if (check_events()) return; + /* Abort solve on expose - cheapo repaint strategy */ + if (solve_delay) usleep (solve_delay); + } +} + + +static void +enter_square(n) /* move into a neighboring square */ + int n; +{ + draw_solid_square( (int)path[n].x, (int)path[n].y, + (int)path[n].dir, tgc); + + path[n+1].dir = -1; + switch (path[n].dir) { + case 0: path[n+1].x = path[n].x; + path[n+1].y = path[n].y - 1; + break; + case 1: path[n+1].x = path[n].x + 1; + path[n+1].y = path[n].y; + break; + case 2: path[n+1].x = path[n].x; + path[n+1].y = path[n].y + 1; + break; + case 3: path[n+1].x = path[n].x - 1; + path[n+1].y = path[n].y; + break; + } +} + +/* ---- */ + + +/* + * jmr additions for Jamie Zawinski's screensaver stuff, + * note that the code above this has probably been hacked about in some + * arbitrary way. + */ + +char *progclass = "Maze"; + +char *defaults[] = { + "Maze.background: black", /* to placate SGI */ + "Maze.foreground: white", /* to placate SGI */ + "*gridSize: 0", + "*solveDelay: 5000", + "*preDelay: 2000000", + "*postDelay: 4000000", + "*liveColor: green", + "*deadColor: red", +#ifdef XROGER + "*logoColor: red3", +#endif + 0 +}; + +XrmOptionDescRec options[] = { + { "-grid-size", ".gridSize", XrmoptionSepArg, 0 }, + { "-solve-delay", ".solveDelay", XrmoptionSepArg, 0 }, + { "-pre-delay", ".preDelay", XrmoptionSepArg, 0 }, + { "-post-delay", ".postDelay", XrmoptionSepArg, 0 }, + { "-live-color", ".liveColor", XrmoptionSepArg, 0 }, + { "-dead-color", ".deadColor", XrmoptionSepArg, 0 } +}; + +int options_size = (sizeof(options)/sizeof(options[0])); + +void screenhack(display,window) + Display *display; + Window window; +{ + Pixmap gray; + int size, root; + XWindowAttributes xgwa; + unsigned long bg, fg, pfg, pbg, lfg; + + size = get_integer_resource ("gridSize", "Dimension"); + root = get_boolean_resource("root", "Boolean"); + solve_delay = get_integer_resource ("solveDelay", "Integer"); + pre_solve_delay = get_integer_resource ("preDelay", "Integer"); + post_solve_delay = get_integer_resource ("postDelay", "Integer"); + + if (size < 2) size = 7 + (random () % 30); + grid_width = grid_height = size; + bw = (size > 6 ? 3 : (size-1)/2); + + dpy = display; win = window; /* the maze stuff uses global variables */ + + XGetWindowAttributes (dpy, win, &xgwa); + + x = 0; + y = 0; + + set_maze_sizes (xgwa.width, xgwa.height); + + if (! root) + XSelectInput (dpy, win, ExposureMask|ButtonPressMask|StructureNotifyMask); + + gc = XCreateGC(dpy, win, 0, 0); + cgc = XCreateGC(dpy, win, 0, 0); + tgc = XCreateGC(dpy,win,0,0); + logo_gc = XCreateGC(dpy, win, 0, 0); + + gray = XCreateBitmapFromData (dpy,win,gray1_bits,gray1_width,gray1_height); + + bg = get_pixel_resource ("background","Background", dpy, xgwa.colormap); + fg = get_pixel_resource ("foreground","Foreground", dpy, xgwa.colormap); + lfg = get_pixel_resource ("logoColor", "Foreground", dpy, xgwa.colormap); + pfg = get_pixel_resource ("liveColor", "Foreground", dpy, xgwa.colormap); + pbg = get_pixel_resource ("deadColor", "Foreground", dpy, xgwa.colormap); + if (mono_p) lfg = pfg = fg; + + if (lfg == bg) + lfg = ((bg == WhitePixel (dpy, DefaultScreen (dpy))) + ? BlackPixel (dpy, DefaultScreen (dpy)) + : WhitePixel (dpy, DefaultScreen (dpy))); + + XSetForeground (dpy, gc, fg); + XSetBackground (dpy, gc, bg); + XSetForeground (dpy, cgc, pbg); + XSetBackground (dpy, cgc, bg); + XSetForeground (dpy, tgc, pfg); + XSetBackground (dpy, tgc, bg); + XSetForeground (dpy, logo_gc, lfg); + XSetBackground (dpy, logo_gc, bg); + + XSetStipple (dpy, cgc, gray); + XSetFillStyle (dpy, cgc, FillOpaqueStippled); + +#ifdef XROGER + { + int w, h; + XGCValues gcv; + GC draw_gc, erase_gc; + extern void skull (); + /* round up to grid size */ + w = ((logo_width / grid_width) + 1) * grid_width; + h = ((logo_height / grid_height) + 1) * grid_height; + logo_map = XCreatePixmap (dpy, win, w, h, 1); + gcv.foreground = 1L; + draw_gc = XCreateGC (dpy, logo_map, GCForeground, &gcv); + gcv.foreground = 0L; + erase_gc= XCreateGC (dpy, logo_map, GCForeground, &gcv); + XFillRectangle (dpy, logo_map, erase_gc, 0, 0, w, h); + skull (dpy, logo_map, draw_gc, erase_gc, 5, 0, w-10, h-10); + XFreeGC (dpy, draw_gc); + XFreeGC (dpy, erase_gc); + } +#else + if (!(logo_map = XCreateBitmapFromData (dpy, win, logo_bits, + logo_width, logo_height))) + { + fprintf (stderr, "Can't create logo pixmap\n"); + exit (1); + } +#endif + XMapRaised(dpy, win); + srandom(getpid()); + + restart = root; + + while (1) { /* primary execution loop [ rhess ] */ + if (check_events()) continue ; + if (restart || stop) goto pop; + switch (state) { + case 1: + initialize_maze(); + break; + case 2: + XClearWindow(dpy, win); + draw_maze_border(); + break; + case 3: + create_maze(); + break; + case 4: + XSync (dpy, False); + usleep (pre_solve_delay); + break; + case 5: + solve_maze(); + break; + case 6: + XSync (dpy, False); + usleep (post_solve_delay); + state = 0 ; + break; + default: + abort (); + } + ++state; + pop: + if (restart) + { + static XWindowAttributes wattr; + restart = 0; + stop = 0; + state = 1; + XGetWindowAttributes (dpy, win, &wattr); + set_maze_sizes (wattr.width, wattr.height); + XClearWindow (dpy, win); + XSync (dpy, False); + } + } +} diff --git a/hacks/maze.exe_axp b/hacks/maze.exe_axp new file mode 100755 index 0000000000000000000000000000000000000000..8badfac9cbd096865cc161e0712f8a7e242079db GIT binary patch literal 46080 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 + * + * 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. + */ + +/* Make a little guy with a big nose and a hat wanter around the screen, + spewing out messages. Derived from xnlock by Dan Heller . + */ + +#include "screenhack.h" +#include + +#if __STDC__ +extern FILE *popen (const char *, const char *); +extern int pclose (FILE *); +#endif + +#define Pixel unsigned long + +#define font_height(font) (font->ascent + font->descent) +#define FONT_NAME "-*-times-*-*-*-*-18-*-*-*-*-*-*-*" + +static Display *dpy; +static Window window; +static int Width, Height; +static GC fg_gc, bg_gc, text_fg_gc, text_bg_gc; +static char *words, *get_words(); +static int x, y; +static XFontStruct *font; +static char *def_words = "I'm out running around."; +static void init_images(), walk(), talk(); +static int think(); +static unsigned long interval, look(); +static Pixmap left0, left1, right0, right1; +static Pixmap left_front, right_front, front, down; + +static char *program, *orig_program, *filename, *text; + +#define FROM_ARGV 1 +#define FROM_PROGRAM 2 +#define FROM_FILE 3 +#define FROM_RESRC 4 +static int getwordsfrom; + +#define IS_MOVING 1 +#define GET_PASSWD 2 +static int state; /* indicates states: walking or getting passwd */ + +static void (*next_fn) (); + +#ifndef VMS +#include "noses/nose.0.left" +#include "noses/nose.1.left" +#include "noses/nose.0.right" +#include "noses/nose.1.right" +#include "noses/nose.left.front" +#include "noses/nose.right.front" +#include "noses/nose.front" +#include "noses/nose.down" +#else +#include "noses/nose.0_left" +#include "noses/nose.1_left" +#include "noses/nose.0_right" +#include "noses/nose.1_right" +#include "noses/nose.left_front" +#include "noses/nose.right_front" +#include "noses/nose.front" +#include "noses/nose.down" +#endif /* VMS */ + + +static void +init_images () +{ + static Pixmap *images[] = { + &left0, &left1, &right0, &right1, + &left_front, &right_front, &front, &down + }; + static unsigned char *bits[] = { + nose_0_left_bits, nose_1_left_bits, nose_0_right_bits, + nose_1_right_bits, nose_left_front_bits, nose_right_front_bits, + nose_front_bits, nose_down_bits + }; + int i; + + for (i = 0; i < sizeof (images) / sizeof (images[0]); i++) + if (!(*images[i] = + XCreatePixmapFromBitmapData(dpy, window, + (char *) bits[i], 64, 64, 1, 0, 1))) + { + fprintf (stderr, "%s: Can't load nose images", progname); + exit (1); + } +} + +#define LEFT 001 +#define RIGHT 002 +#define DOWN 004 +#define UP 010 +#define FRONT 020 +#define X_INCR 3 +#define Y_INCR 2 + +static void +move() +{ + static int length, + dir; + + if (!length) + { + register int tries = 0; + dir = 0; + if ((random() & 1) && think()) + { + talk(0); /* sets timeout to itself */ + return; + } + if (!(random() % 3) && (interval = look())) + { + next_fn = move; + return; + } + interval = 20 + random() % 100; + do + { + if (!tries) + length = Width / 100 + random() % 90, tries = 8; + else + tries--; + switch (random() % 8) + { + case 0: + if (x - X_INCR * length >= 5) + dir = LEFT; + break; + case 1: + if (x + X_INCR * length <= Width - 70) + dir = RIGHT; + break; + case 2: + if (y - (Y_INCR * length) >= 5) + dir = UP, interval = 40; + break; + case 3: + if (y + Y_INCR * length <= Height - 70) + dir = DOWN, interval = 20; + break; + case 4: + if (x - X_INCR * length >= 5 && y - (Y_INCR * length) >= 5) + dir = (LEFT | UP); + break; + case 5: + if (x + X_INCR * length <= Width - 70 && + y - Y_INCR * length >= 5) + dir = (RIGHT | UP); + break; + case 6: + if (x - X_INCR * length >= 5 && + y + Y_INCR * length <= Height - 70) + dir = (LEFT | DOWN); + break; + case 7: + if (x + X_INCR * length <= Width - 70 && + y + Y_INCR * length <= Height - 70) + dir = (RIGHT | DOWN); + break; + default: + /* No Defaults */ + break; + } + } while (!dir); + } + walk(dir); + --length; + next_fn = move; +} + +static void +walk(dir) + register int dir; +{ + register int incr = 0; + static int lastdir; + static int up = 1; + static Pixmap frame; + + if (dir & (LEFT | RIGHT)) + { /* left/right movement (mabye up/down too) */ + up = -up; /* bouncing effect (even if hit a wall) */ + if (dir & LEFT) + { + incr = X_INCR; + frame = (up < 0) ? left0 : left1; + } + else + { + incr = -X_INCR; + frame = (up < 0) ? right0 : right1; + } + if ((lastdir == FRONT || lastdir == DOWN) && dir & UP) + { + + /* + * workaround silly bug that leaves screen dust when guy is + * facing forward or down and moves up-left/right. + */ + XCopyPlane(dpy, frame, window, fg_gc, 0, 0, 64, 64, x, y, 1L); + XFlush(dpy); + } + /* note that maybe neither UP nor DOWN is set! */ + if (dir & UP && y > Y_INCR) + y -= Y_INCR; + else if (dir & DOWN && y < Height - 64) + y += Y_INCR; + } + /* Explicit up/down movement only (no left/right) */ + else if (dir == UP) + XCopyPlane(dpy, front, window, fg_gc, + 0, 0, 64, 64, x, y -= Y_INCR, 1L); + else if (dir == DOWN) + XCopyPlane(dpy, down, window, fg_gc, + 0, 0, 64, 64, x, y += Y_INCR, 1L); + else if (dir == FRONT && frame != front) + { + if (up > 0) + up = -up; + if (lastdir & LEFT) + frame = left_front; + else if (lastdir & RIGHT) + frame = right_front; + else + frame = front; + XCopyPlane(dpy, frame, window, fg_gc, 0, 0, 64, 64, x, y, 1L); + } + if (dir & LEFT) + while (--incr >= 0) + { + XCopyPlane(dpy, frame, window, fg_gc, + 0, 0, 64, 64, --x, y + up, 1L); + XFlush(dpy); + } + else if (dir & RIGHT) + while (++incr <= 0) + { + XCopyPlane(dpy, frame, window, fg_gc, + 0, 0, 64, 64, ++x, y + up, 1L); + XFlush(dpy); + } + lastdir = dir; +} + +static int +think() +{ + if (random() & 1) + walk(FRONT); + if (random() & 1) + { + if (getwordsfrom == FROM_PROGRAM) + words = get_words(0, (char **) 0); + return 1; + } + return 0; +} + +#define MAXLINES 40 + +static void +talk(force_erase) + int force_erase; +{ + int width = 0, + height, + Z, + total = 0; + static int X, + Y, + talking; + static struct + { + int x, + y, + width, + height; + } s_rect; + register char *p, + *p2; + char buf[BUFSIZ], + args[MAXLINES][256]; + + /* clear what we've written */ + if (talking || force_erase) + { + if (!talking) + return; + XFillRectangle(dpy, window, bg_gc, s_rect.x - 5, s_rect.y - 5, + s_rect.width + 10, s_rect.height + 10); + talking = 0; + if (!force_erase) + next_fn = move; + interval = 0; + { + /* might as well check the window for size changes now... */ + XWindowAttributes xgwa; + XGetWindowAttributes (dpy, window, &xgwa); + Width = xgwa.width + 2; + Height = xgwa.height + 2; + } + return; + } + talking = 1; + walk(FRONT); + p = strcpy(buf, words); + + if (!(p2 = index(p, '\n')) || !p2[1]) + { + total = strlen (words); + strcpy (args[0], words); + width = XTextWidth(font, words, total); + height = 0; + } + else + /* p2 now points to the first '\n' */ + for (height = 0; p; height++) + { + int w; + *p2 = 0; + if ((w = XTextWidth(font, p, p2 - p)) > width) + width = w; + total += p2 - p; /* total chars; count to determine reading + * time */ + (void) strcpy(args[height], p); + if (height == MAXLINES - 1) + { + puts("Message too long!"); + break; + } + p = p2 + 1; + if (!(p2 = index(p, '\n'))) + break; + } + height++; + + /* + * Figure out the height and width in pixels (height, width) extend the + * new box by 15 pixels on the sides (30 total) top and bottom. + */ + s_rect.width = width + 30; + s_rect.height = height * font_height(font) + 30; + if (x - s_rect.width - 10 < 5) + s_rect.x = 5; + else if ((s_rect.x = x + 32 - (s_rect.width + 15) / 2) + + s_rect.width + 15 > Width - 5) + s_rect.x = Width - 15 - s_rect.width; + if (y - s_rect.height - 10 < 5) + s_rect.y = y + 64 + 5; + else + s_rect.y = y - 5 - s_rect.height; + + XFillRectangle(dpy, window, text_bg_gc, + s_rect.x, s_rect.y, s_rect.width, s_rect.height); + + /* make a box that's 5 pixels thick. Then add a thin box inside it */ + XSetLineAttributes(dpy, text_fg_gc, 5, 0, 0, 0); + XDrawRectangle(dpy, window, text_fg_gc, + s_rect.x, s_rect.y, s_rect.width - 1, s_rect.height - 1); + XSetLineAttributes(dpy, text_fg_gc, 0, 0, 0, 0); + XDrawRectangle(dpy, window, text_fg_gc, + s_rect.x + 7, s_rect.y + 7, s_rect.width - 15, s_rect.height - 15); + + X = 15; + Y = 15 + font_height(font); + + /* now print each string in reverse order (start at bottom of box) */ + for (Z = 0; Z < height; Z++) + { + XDrawString(dpy, window, text_fg_gc, s_rect.x + X, s_rect.y + Y, + args[Z], strlen(args[Z])); + Y += font_height(font); + } + interval = (total / 15) * 1000; + if (interval < 2000) interval = 2000; + next_fn = talk; +} + +static unsigned long +look() +{ + if (random() % 3) + { + XCopyPlane(dpy, (random() & 1) ? down : front, window, fg_gc, + 0, 0, 64, 64, x, y, 1L); + return 1000L; + } + if (!(random() % 5)) + return 0; + if (random() % 3) + { + XCopyPlane(dpy, (random() & 1) ? left_front : right_front, + window, fg_gc, 0, 0, 64, 64, x, y, 1L); + return 1000L; + } + if (!(random() % 5)) + return 0; + XCopyPlane(dpy, (random() & 1) ? left0 : right0, window, fg_gc, + 0, 0, 64, 64, x, y, 1L); + return 1000L; +} + + +static void +init_words() +{ + char *mode = get_string_resource ("mode", "Mode"); + + program = get_string_resource ("program", "Program"); + filename = get_string_resource ("filename", "Filename"); + text = get_string_resource ("text", "Text"); + + if (program) /* get stderr on stdout, so it shows up on the window */ + { + orig_program = program; + program = (char *) malloc (strlen (program) + 10); + strcpy (program, "( "); + strcat (program, orig_program); + strcat (program, " ) 2>&1"); + } + + if (!mode || !strcmp (mode, "program")) + getwordsfrom = FROM_PROGRAM; + else if (!strcmp (mode, "file")) + getwordsfrom = FROM_FILE; + else if (!strcmp (mode, "string")) + getwordsfrom = FROM_RESRC; + else + { + fprintf (stderr, + "%s: mode must be program, file, or string, not %s\n", + progname, mode); + exit (1); + } + + if (getwordsfrom == FROM_PROGRAM && !program) + { + fprintf (stderr, "%s: no program specified.\n", progname); + exit (1); + } + if (getwordsfrom == FROM_FILE && !filename) + { + fprintf (stderr, "%s: no file specified.\n", progname); + exit (1); + } + + words = get_words(); +} + +static int first_time = 1; + +static char * +get_words() +{ + FILE *pp; + static char buf[BUFSIZ]; + register char *p = buf; + + buf[0] = '\0'; + + switch (getwordsfrom) + { + case FROM_PROGRAM: +#ifndef VMS + if ((pp = popen(program, "r"))) + { + while (fgets(p, sizeof(buf) - strlen(buf), pp)) + { + if (strlen(buf) + 1 < sizeof(buf)) + p = buf + strlen(buf); + else + break; + } + (void) pclose(pp); + if (! buf[0]) + sprintf (buf, "\"%s\" produced no output!", orig_program); + else if (!first_time && + !strcmp (buf, "sh: fortune: not found\n")) + switch (random () % 20) + { + case 1: strcat (buf, "( Get with the program, bub. )\n"); + break; + case 2: strcat (buf, + "( I blow my nose at you, you silly person! ) \n"); break; + case 3: strcat (buf, + "\nThe resource you want to\nset is `noseguy.program'\n"); + break; + case 4: + strcat(buf,"\nHelp!! Help!!\nAAAAAAGGGGHHH!! \n\n"); break; + case 5: strcpy (buf, "You have new mail.\n"); break; + case 6: + strcat(buf,"( Hello? Are you paying attention? )\n");break; + case 7: + strcat (buf, "sh: what kind of fool do you take me for? \n"); + break; + } + first_time = 0; + p = buf; + } + else + { + perror(program); + p = def_words; + } + break; +#endif /* VMS */ + case FROM_FILE: + if ((pp = fopen(filename, "r"))) + { + while (fgets(p, sizeof(buf) - strlen(buf), pp)) + { + if (strlen(buf) + 1 < sizeof(buf)) + p = buf + strlen(buf); + else + break; + } + (void) fclose(pp); + if (! buf[0]) + sprintf (buf, "file \"%s\" is empty!", filename); + p = buf; + } + else + { + sprintf (buf, "couldn't read file \"%s\"!", filename); + p = buf; + } + break; + case FROM_RESRC: + p = text; + break; + default: + p = def_words; + break; + } + + if (!p || *p == '\0') + p = def_words; + return p; +} + + + +char *progclass = "Noseguy"; + +char *defaults [] = { + "Noseguy.background: black", /* to placate SGI */ + "Noseguy.foreground: white", +#ifndef VMS + "*mode: program", +#else + "*mode: string", +#endif + "*program: fortune -s", + "noseguy.font: -*-new century schoolbook-*-r-*-*-*-180-*-*-*-*-*-*", + 0 +}; + +XrmOptionDescRec options [] = { + { "-mode", ".mode", XrmoptionSepArg, 0 }, + { "-program", ".program", XrmoptionSepArg, 0 }, + { "-text", ".text", XrmoptionSepArg, 0 }, + { "-filename", ".filename", XrmoptionSepArg, 0 }, + { "-font", ".font", XrmoptionSepArg, 0 }, + { "-text-foreground", ".textForeground", XrmoptionSepArg, 0 }, + { "-text-background", ".textBackground", XrmoptionSepArg, 0 } +}; +int options_size = (sizeof (options) / sizeof (options[0])); + + +static void +noseguy_init (d, w) + Display *d; + Window w; +{ + Pixel fg, bg, text_fg, text_bg; + XWindowAttributes xgwa; + Colormap cmap; + char *fontname = get_string_resource ("font", "Font"); + char **list; + int foo, i; + XGCValues gcvalues; + dpy = d; + window = w; + XGetWindowAttributes (dpy, window, &xgwa); + Width = xgwa.width + 2; + Height = xgwa.height + 2; + cmap = xgwa.colormap; + + init_words(); + init_images(); + + if (!fontname || !(font = XLoadQueryFont(dpy, fontname))) + { + list = XListFonts(dpy, FONT_NAME, 32767, &foo); + for (i = 0; i < foo; i++) + if ((font = XLoadQueryFont(dpy, list[i]))) + break; + if (!font) + { + fprintf (stderr, "%s: Can't find a large font.", progname); + exit (1); + } + XFreeFontNames(list); + } + + fg = get_pixel_resource ("foreground", "Foreground", dpy, cmap); + bg = get_pixel_resource ("background", "Background", dpy, cmap); + text_fg = get_pixel_resource ("textForeground", "Foreground", dpy, cmap); + text_bg = get_pixel_resource ("textBackground", "Background", dpy, cmap); + /* notice when unspecified */ + if (! get_string_resource ("textForeground", "Foreground")) + text_fg = bg; + if (! get_string_resource ("textBackground", "Background")) + text_bg = fg; + + gcvalues.font = font->fid; + gcvalues.graphics_exposures = False; + gcvalues.foreground = fg; + gcvalues.background = bg; + fg_gc = XCreateGC (dpy, window, + GCForeground|GCBackground|GCGraphicsExposures|GCFont, + &gcvalues); + gcvalues.foreground = bg; + gcvalues.background = fg; + bg_gc = XCreateGC (dpy, window, + GCForeground|GCBackground|GCGraphicsExposures|GCFont, + &gcvalues); + gcvalues.foreground = text_fg; + gcvalues.background = text_bg; + text_fg_gc = XCreateGC (dpy, window, + GCForeground|GCBackground|GCGraphicsExposures|GCFont, + &gcvalues); + gcvalues.foreground = text_bg; + gcvalues.background = text_fg; + text_bg_gc = XCreateGC (dpy, window, + GCForeground|GCBackground|GCGraphicsExposures|GCFont, + &gcvalues); + x = Width / 2; + y = Height / 2; + state = IS_MOVING; +} + +void +screenhack (d, w) + Display *d; + Window w; +{ + noseguy_init (d, w); + next_fn = move; + while (1) + { + next_fn (0); + XSync (dpy, True); + usleep (interval * 1000); + } +} + diff --git a/hacks/noseguy.c_ori b/hacks/noseguy.c_ori new file mode 100755 index 00000000..3a6542c8 --- /dev/null +++ b/hacks/noseguy.c_ori @@ -0,0 +1,653 @@ +/* xscreensaver, Copyright (c) 1992 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. + */ + +/* Make a little guy with a big nose and a hat wanter around the screen, + spewing out messages. Derived from xnlock by Dan Heller . + */ + +#include "screenhack.h" +#include + +#if __STDC__ +extern FILE *popen (const char *, const char *); +extern int pclose (FILE *); +#endif + +#define Pixel unsigned long + +#define font_height(font) (font->ascent + font->descent) +#define FONT_NAME "-*-times-*-*-*-*-18-*-*-*-*-*-*-*" + +static Display *dpy; +static Window window; +static int Width, Height; +static GC fg_gc, bg_gc, text_fg_gc, text_bg_gc; +static char *words, *get_words(); +static int x, y; +static XFontStruct *font; +static char *def_words = "I'm out running around."; +static void init_images(), walk(), talk(); +static int think(); +static unsigned long interval, look(); +static Pixmap left0, left1, right0, right1; +static Pixmap left_front, right_front, front, down; + +static char *program, *orig_program, *filename, *text; + +#define FROM_ARGV 1 +#define FROM_PROGRAM 2 +#define FROM_FILE 3 +#define FROM_RESRC 4 +static int getwordsfrom; + +#define IS_MOVING 1 +#define GET_PASSWD 2 +static int state; /* indicates states: walking or getting passwd */ + +static void (*next_fn) (); + +#include "noses/nose.0.left" +#include "noses/nose.1.left" +#include "noses/nose.0.right" +#include "noses/nose.1.right" +#include "noses/nose.left.front" +#include "noses/nose.right.front" +#include "noses/nose.front" +#include "noses/nose.down" + +static void +init_images () +{ + static Pixmap *images[] = { + &left0, &left1, &right0, &right1, + &left_front, &right_front, &front, &down + }; + static unsigned char *bits[] = { + nose_0_left_bits, nose_1_left_bits, nose_0_right_bits, + nose_1_right_bits, nose_left_front_bits, nose_right_front_bits, + nose_front_bits, nose_down_bits + }; + int i; + + for (i = 0; i < sizeof (images) / sizeof (images[0]); i++) + if (!(*images[i] = + XCreatePixmapFromBitmapData(dpy, window, + (char *) bits[i], 64, 64, 1, 0, 1))) + { + fprintf (stderr, "%s: Can't load nose images", progname); + exit (1); + } +} + +#define LEFT 001 +#define RIGHT 002 +#define DOWN 004 +#define UP 010 +#define FRONT 020 +#define X_INCR 3 +#define Y_INCR 2 + +static void +move() +{ + static int length, + dir; + + if (!length) + { + register int tries = 0; + dir = 0; + if ((random() & 1) && think()) + { + talk(0); /* sets timeout to itself */ + return; + } + if (!(random() % 3) && (interval = look())) + { + next_fn = move; + return; + } + interval = 20 + random() % 100; + do + { + if (!tries) + length = Width / 100 + random() % 90, tries = 8; + else + tries--; + switch (random() % 8) + { + case 0: + if (x - X_INCR * length >= 5) + dir = LEFT; + break; + case 1: + if (x + X_INCR * length <= Width - 70) + dir = RIGHT; + break; + case 2: + if (y - (Y_INCR * length) >= 5) + dir = UP, interval = 40; + break; + case 3: + if (y + Y_INCR * length <= Height - 70) + dir = DOWN, interval = 20; + break; + case 4: + if (x - X_INCR * length >= 5 && y - (Y_INCR * length) >= 5) + dir = (LEFT | UP); + break; + case 5: + if (x + X_INCR * length <= Width - 70 && + y - Y_INCR * length >= 5) + dir = (RIGHT | UP); + break; + case 6: + if (x - X_INCR * length >= 5 && + y + Y_INCR * length <= Height - 70) + dir = (LEFT | DOWN); + break; + case 7: + if (x + X_INCR * length <= Width - 70 && + y + Y_INCR * length <= Height - 70) + dir = (RIGHT | DOWN); + break; + default: + /* No Defaults */ + break; + } + } while (!dir); + } + walk(dir); + --length; + next_fn = move; +} + +static void +walk(dir) + register int dir; +{ + register int incr = 0; + static int lastdir; + static int up = 1; + static Pixmap frame; + + if (dir & (LEFT | RIGHT)) + { /* left/right movement (mabye up/down too) */ + up = -up; /* bouncing effect (even if hit a wall) */ + if (dir & LEFT) + { + incr = X_INCR; + frame = (up < 0) ? left0 : left1; + } + else + { + incr = -X_INCR; + frame = (up < 0) ? right0 : right1; + } + if ((lastdir == FRONT || lastdir == DOWN) && dir & UP) + { + + /* + * workaround silly bug that leaves screen dust when guy is + * facing forward or down and moves up-left/right. + */ + XCopyPlane(dpy, frame, window, fg_gc, 0, 0, 64, 64, x, y, 1L); + XFlush(dpy); + } + /* note that maybe neither UP nor DOWN is set! */ + if (dir & UP && y > Y_INCR) + y -= Y_INCR; + else if (dir & DOWN && y < Height - 64) + y += Y_INCR; + } + /* Explicit up/down movement only (no left/right) */ + else if (dir == UP) + XCopyPlane(dpy, front, window, fg_gc, + 0, 0, 64, 64, x, y -= Y_INCR, 1L); + else if (dir == DOWN) + XCopyPlane(dpy, down, window, fg_gc, + 0, 0, 64, 64, x, y += Y_INCR, 1L); + else if (dir == FRONT && frame != front) + { + if (up > 0) + up = -up; + if (lastdir & LEFT) + frame = left_front; + else if (lastdir & RIGHT) + frame = right_front; + else + frame = front; + XCopyPlane(dpy, frame, window, fg_gc, 0, 0, 64, 64, x, y, 1L); + } + if (dir & LEFT) + while (--incr >= 0) + { + XCopyPlane(dpy, frame, window, fg_gc, + 0, 0, 64, 64, --x, y + up, 1L); + XFlush(dpy); + } + else if (dir & RIGHT) + while (++incr <= 0) + { + XCopyPlane(dpy, frame, window, fg_gc, + 0, 0, 64, 64, ++x, y + up, 1L); + XFlush(dpy); + } + lastdir = dir; +} + +static int +think() +{ + if (random() & 1) + walk(FRONT); + if (random() & 1) + { + if (getwordsfrom == FROM_PROGRAM) + words = get_words(0, (char **) 0); + return 1; + } + return 0; +} + +#define MAXLINES 40 + +static void +talk(force_erase) + int force_erase; +{ + int width = 0, + height, + Z, + total = 0; + static int X, + Y, + talking; + static struct + { + int x, + y, + width, + height; + } s_rect; + register char *p, + *p2; + char buf[BUFSIZ], + args[MAXLINES][256]; + + /* clear what we've written */ + if (talking || force_erase) + { + if (!talking) + return; + XFillRectangle(dpy, window, bg_gc, s_rect.x - 5, s_rect.y - 5, + s_rect.width + 10, s_rect.height + 10); + talking = 0; + if (!force_erase) + next_fn = move; + interval = 0; + { + /* might as well check the window for size changes now... */ + XWindowAttributes xgwa; + XGetWindowAttributes (dpy, window, &xgwa); + Width = xgwa.width + 2; + Height = xgwa.height + 2; + } + return; + } + talking = 1; + walk(FRONT); + p = strcpy(buf, words); + + if (!(p2 = index(p, '\n')) || !p2[1]) + { + total = strlen (words); + strcpy (args[0], words); + width = XTextWidth(font, words, total); + height = 0; + } + else + /* p2 now points to the first '\n' */ + for (height = 0; p; height++) + { + int w; + *p2 = 0; + if ((w = XTextWidth(font, p, p2 - p)) > width) + width = w; + total += p2 - p; /* total chars; count to determine reading + * time */ + (void) strcpy(args[height], p); + if (height == MAXLINES - 1) + { + puts("Message too long!"); + break; + } + p = p2 + 1; + if (!(p2 = index(p, '\n'))) + break; + } + height++; + + /* + * Figure out the height and width in pixels (height, width) extend the + * new box by 15 pixels on the sides (30 total) top and bottom. + */ + s_rect.width = width + 30; + s_rect.height = height * font_height(font) + 30; + if (x - s_rect.width - 10 < 5) + s_rect.x = 5; + else if ((s_rect.x = x + 32 - (s_rect.width + 15) / 2) + + s_rect.width + 15 > Width - 5) + s_rect.x = Width - 15 - s_rect.width; + if (y - s_rect.height - 10 < 5) + s_rect.y = y + 64 + 5; + else + s_rect.y = y - 5 - s_rect.height; + + XFillRectangle(dpy, window, text_bg_gc, + s_rect.x, s_rect.y, s_rect.width, s_rect.height); + + /* make a box that's 5 pixels thick. Then add a thin box inside it */ + XSetLineAttributes(dpy, text_fg_gc, 5, 0, 0, 0); + XDrawRectangle(dpy, window, text_fg_gc, + s_rect.x, s_rect.y, s_rect.width - 1, s_rect.height - 1); + XSetLineAttributes(dpy, text_fg_gc, 0, 0, 0, 0); + XDrawRectangle(dpy, window, text_fg_gc, + s_rect.x + 7, s_rect.y + 7, s_rect.width - 15, s_rect.height - 15); + + X = 15; + Y = 15 + font_height(font); + + /* now print each string in reverse order (start at bottom of box) */ + for (Z = 0; Z < height; Z++) + { + XDrawString(dpy, window, text_fg_gc, s_rect.x + X, s_rect.y + Y, + args[Z], strlen(args[Z])); + Y += font_height(font); + } + interval = (total / 15) * 1000; + if (interval < 2000) interval = 2000; + next_fn = talk; +} + +static unsigned long +look() +{ + if (random() % 3) + { + XCopyPlane(dpy, (random() & 1) ? down : front, window, fg_gc, + 0, 0, 64, 64, x, y, 1L); + return 1000L; + } + if (!(random() % 5)) + return 0; + if (random() % 3) + { + XCopyPlane(dpy, (random() & 1) ? left_front : right_front, + window, fg_gc, 0, 0, 64, 64, x, y, 1L); + return 1000L; + } + if (!(random() % 5)) + return 0; + XCopyPlane(dpy, (random() & 1) ? left0 : right0, window, fg_gc, + 0, 0, 64, 64, x, y, 1L); + return 1000L; +} + + +static void +init_words() +{ + char *mode = get_string_resource ("mode", "Mode"); + + program = get_string_resource ("program", "Program"); + filename = get_string_resource ("filename", "Filename"); + text = get_string_resource ("text", "Text"); + + if (program) /* get stderr on stdout, so it shows up on the window */ + { + orig_program = program; + program = (char *) malloc (strlen (program) + 10); + strcpy (program, "( "); + strcat (program, orig_program); + strcat (program, " ) 2>&1"); + } + + if (!mode || !strcmp (mode, "program")) + getwordsfrom = FROM_PROGRAM; + else if (!strcmp (mode, "file")) + getwordsfrom = FROM_FILE; + else if (!strcmp (mode, "string")) + getwordsfrom = FROM_RESRC; + else + { + fprintf (stderr, + "%s: mode must be program, file, or string, not %s\n", + progname, mode); + exit (1); + } + + if (getwordsfrom == FROM_PROGRAM && !program) + { + fprintf (stderr, "%s: no program specified.\n", progname); + exit (1); + } + if (getwordsfrom == FROM_FILE && !filename) + { + fprintf (stderr, "%s: no file specified.\n", progname); + exit (1); + } + + words = get_words(); +} + +static int first_time = 1; + +static char * +get_words() +{ + FILE *pp; + static char buf[BUFSIZ]; + register char *p = buf; + + buf[0] = '\0'; + + switch (getwordsfrom) + { + case FROM_PROGRAM: + if ((pp = popen(program, "r"))) + { + while (fgets(p, sizeof(buf) - strlen(buf), pp)) + { + if (strlen(buf) + 1 < sizeof(buf)) + p = buf + strlen(buf); + else + break; + } + (void) pclose(pp); + if (! buf[0]) + sprintf (buf, "\"%s\" produced no output!", orig_program); + else if (!first_time && + !strcmp (buf, "sh: fortune: not found\n")) + switch (random () % 20) + { + case 1: strcat (buf, "( Get with the program, bub. )\n"); + break; + case 2: strcat (buf, + "( I blow my nose at you, you silly person! ) \n"); break; + case 3: strcat (buf, + "\nThe resource you want to\nset is `noseguy.program'\n"); + break; + case 4: + strcat(buf,"\nHelp!! Help!!\nAAAAAAGGGGHHH!! \n\n"); break; + case 5: strcpy (buf, "You have new mail.\n"); break; + case 6: + strcat(buf,"( Hello? Are you paying attention? )\n");break; + case 7: + strcat (buf, "sh: what kind of fool do you take me for? \n"); + break; + } + first_time = 0; + p = buf; + } + else + { + perror(program); + p = def_words; + } + break; + case FROM_FILE: + if ((pp = fopen(filename, "r"))) + { + while (fgets(p, sizeof(buf) - strlen(buf), pp)) + { + if (strlen(buf) + 1 < sizeof(buf)) + p = buf + strlen(buf); + else + break; + } + (void) fclose(pp); + if (! buf[0]) + sprintf (buf, "file \"%s\" is empty!", filename); + p = buf; + } + else + { + sprintf (buf, "couldn't read file \"%s\"!", filename); + p = buf; + } + break; + case FROM_RESRC: + p = text; + break; + default: + p = def_words; + break; + } + + if (!p || *p == '\0') + p = def_words; + return p; +} + + + +char *progclass = "Noseguy"; + +char *defaults [] = { + "Noseguy.background: black", /* to placate SGI */ + "Noseguy.foreground: white", + "*mode: program", + "*program: fortune -s", + "noseguy.font: -*-new century schoolbook-*-r-*-*-*-180-*-*-*-*-*-*", + 0 +}; + +XrmOptionDescRec options [] = { + { "-mode", ".mode", XrmoptionSepArg, 0 }, + { "-program", ".program", XrmoptionSepArg, 0 }, + { "-text", ".text", XrmoptionSepArg, 0 }, + { "-filename", ".filename", XrmoptionSepArg, 0 }, + { "-font", ".font", XrmoptionSepArg, 0 }, + { "-text-foreground", ".textForeground", XrmoptionSepArg, 0 }, + { "-text-background", ".textBackground", XrmoptionSepArg, 0 } +}; +int options_size = (sizeof (options) / sizeof (options[0])); + + +static void +noseguy_init (d, w) + Display *d; + Window w; +{ + Pixel fg, bg, text_fg, text_bg; + XWindowAttributes xgwa; + Colormap cmap; + char *fontname = get_string_resource ("font", "Font"); + char **list; + int foo, i; + XGCValues gcvalues; + dpy = d; + window = w; + XGetWindowAttributes (dpy, window, &xgwa); + Width = xgwa.width + 2; + Height = xgwa.height + 2; + cmap = xgwa.colormap; + + init_words(); + init_images(); + + if (!fontname || !(font = XLoadQueryFont(dpy, fontname))) + { + list = XListFonts(dpy, FONT_NAME, 32767, &foo); + for (i = 0; i < foo; i++) + if ((font = XLoadQueryFont(dpy, list[i]))) + break; + if (!font) + { + fprintf (stderr, "%s: Can't find a large font.", progname); + exit (1); + } + XFreeFontNames(list); + } + + fg = get_pixel_resource ("foreground", "Foreground", dpy, cmap); + bg = get_pixel_resource ("background", "Background", dpy, cmap); + text_fg = get_pixel_resource ("textForeground", "Foreground", dpy, cmap); + text_bg = get_pixel_resource ("textBackground", "Background", dpy, cmap); + /* notice when unspecified */ + if (! get_string_resource ("textForeground", "Foreground")) + text_fg = bg; + if (! get_string_resource ("textBackground", "Background")) + text_bg = fg; + + gcvalues.font = font->fid; + gcvalues.graphics_exposures = False; + gcvalues.foreground = fg; + gcvalues.background = bg; + fg_gc = XCreateGC (dpy, window, + GCForeground|GCBackground|GCGraphicsExposures|GCFont, + &gcvalues); + gcvalues.foreground = bg; + gcvalues.background = fg; + bg_gc = XCreateGC (dpy, window, + GCForeground|GCBackground|GCGraphicsExposures|GCFont, + &gcvalues); + gcvalues.foreground = text_fg; + gcvalues.background = text_bg; + text_fg_gc = XCreateGC (dpy, window, + GCForeground|GCBackground|GCGraphicsExposures|GCFont, + &gcvalues); + gcvalues.foreground = text_bg; + gcvalues.background = text_fg; + text_bg_gc = XCreateGC (dpy, window, + GCForeground|GCBackground|GCGraphicsExposures|GCFont, + &gcvalues); + x = Width / 2; + y = Height / 2; + state = IS_MOVING; +} + +void +screenhack (d, w) + Display *d; + Window w; +{ + noseguy_init (d, w); + next_fn = move; + while (1) + { + next_fn (0); + XSync (dpy, True); + usleep (interval * 1000); + } +} + diff --git a/hacks/noseguy.exe_axp b/hacks/noseguy.exe_axp new file mode 100755 index 0000000000000000000000000000000000000000..f30fbd1d1d42e9c9782b754d3b7869fd52cb8a48 GIT binary patch literal 41984 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 arc)e4d-Qj4l=;wa(oX;v-*5SM|NMWSlL-<4 literal 0 HcmV?d00001 diff --git a/hacks/noseguy.exe_vax b/hacks/noseguy.exe_vax new file mode 100755 index 0000000000000000000000000000000000000000..38536533a04c85a12528cbd170a82cbce7d971f7 GIT binary patch literal 25088 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. + +2 AUTHOR +Dan Heller , 1985. + +Ability to run standalone or with xscreensaver added by +Jamie Zawinski , 13-aug-92. diff --git a/hacks/noseguy.man b/hacks/noseguy.man new file mode 100755 index 00000000..fe18d8df --- /dev/null +++ b/hacks/noseguy.man @@ -0,0 +1,74 @@ +.TH XScreenSaver 1 "13-aug-92" "X Version 11" +.SH NAME +noseguy - a little guy with a big nose wanders around being witty +.SH SYNOPSIS +.B noseguy +[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP] [\-background \fIcolor\fP] [\-text-foreground \fIcolor\fP] [\-text-background \fIcolor\fP] [\-font \fIfont\fP] [\-window] [\-root] [\-install] [\-visual \fIvisual\fP] [\-mode \fImode\fP] [\-program \fIprogram\fP] [\-filename \file\fP] [\-text \fItext\fP] +.SH DESCRIPTION +A little man with a big nose and a hat runs around spewing out messages to +the screen. This code (and its bitmaps) were extracted from the \fIxnlock\fP +program. +.SH OPTIONS +.I noseguy +accepts the following options: +.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 \-install +Install a private colormap for the window. +.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 \-font \fIfont\fP +The font used for the messages. +.TP 8 +.B \-mode [ program | file | string ] +In \fIprogram\fP mode, the messages are gotten by running a program. +The program used is controlled by the \fI\-program\fP option, and +the \fI.program\fP resource. + +In \fIfilename\fP mode, the message used is the contents of a file. +The file used is controlled by the \fI\-file\fP option, and +the \fI.filename\fP resource. + +In \fIstring\fP mode, the message is whatever was specified on the +command line as the \fI\-text\fP option, or in the resource database +as the \fI.text\fP resource. +.TP 8 +.B \-program \fIprogram\fP +If \fImode\fP is \fIprogram\fP (the default), then this program will be +run periodically, and its output will be the text of the messages. The +default program is \fI"fortune -s"\fP, but \fIyow\fP is also a good choice. +.TP 8 +.B \-filename \fIfile\fP +If \fImode\fP is \fIfile\fP, then the contents of this file will be used +for all messages. +.TP 8 +.B \-text \fIstring\fP +If \fImode\fP is \fIstring\fP, then this text will be used for all messages. +.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. +.SH SEE ALSO +.BR X (1), +.BR xscreensaver (1), +.BR xnlock (1) +.SH COPYRIGHT +Copyright 1985, 1990 by Dan Heller . +.SH AUTHOR +Dan Heller , 1985. + +Ability to run standalone or with \fIxscreensaver\fP added by +Jamie Zawinski , 13-aug-92. diff --git a/hacks/noses/cvs/entries b/hacks/noses/cvs/entries new file mode 100755 index 00000000..7c60d8fc --- /dev/null +++ b/hacks/noses/cvs/entries @@ -0,0 +1,8 @@ +/nose.0.left/1.1/Fri Mar 17 18:30:19 1995 Thu Aug 25 15:04:28 1994// +/nose.0.right/1.1/Fri Mar 17 18:30:19 1995 Thu Aug 25 15:04:29 1994// +/nose.1.left/1.1/Fri Mar 17 18:30:20 1995 Thu Aug 25 15:04:30 1994// +/nose.1.right/1.1/Fri Mar 17 18:30:20 1995 Thu Aug 25 15:04:31 1994// +/nose.down/1.1/Fri Mar 17 18:30:20 1995 Thu Aug 25 15:04:32 1994// +/nose.front/1.1/Fri Mar 17 18:30:20 1995 Thu Aug 25 15:04:33 1994// +/nose.left.front/1.1/Fri Mar 17 18:30:20 1995 Thu Aug 25 15:04:34 1994// +/nose.right.front/1.1/Fri Mar 17 18:30:20 1995 Thu Aug 25 15:04:35 1994// diff --git a/hacks/noses/cvs/repository b/hacks/noses/cvs/repository new file mode 100755 index 00000000..5c363df0 --- /dev/null +++ b/hacks/noses/cvs/repository @@ -0,0 +1 @@ +/m/src/xscreensaver/hacks/noses diff --git a/hacks/noses/nose.0_left b/hacks/noses/nose.0_left new file mode 100755 index 00000000..cb3d1528 --- /dev/null +++ b/hacks/noses/nose.0_left @@ -0,0 +1,38 @@ +#define nose_0_left_width 64 +#define nose_0_left_height 64 +static unsigned char nose_0_left_bits[] = { + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0xc0,0xff,0xff,0x07,0x00,0x00,0x00,0x00,0x40,0x00, + 0x00,0x04,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x40, + 0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x04,0x00,0x00,0x00,0x00, + 0x40,0x00,0x00,0x04,0x00,0x00,0x00,0xf8,0xff,0xff,0xff,0xff,0x3f,0x00,0x00, + 0x08,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x08,0x00,0x00,0x00,0x00,0x20,0x00, + 0x00,0xf8,0xff,0xff,0xff,0xff,0x3f,0x00,0x00,0xf0,0x03,0x00,0x00,0x80,0x00, + 0x00,0x00,0x0e,0x0c,0x00,0x00,0x80,0x01,0x00,0x00,0x03,0x30,0x00,0x00,0x00, + 0x01,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x02,0x00,0x40,0x00,0xc0,0x00,0x00, + 0x00,0x02,0x00,0x20,0x00,0x80,0x00,0x00,0x00,0x04,0x00,0x10,0x00,0x00,0x00, + 0x00,0x00,0x04,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x0c,0x00,0x08,0x00,0x00, + 0x00,0x00,0x00,0x08,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x08,0x00, + 0x00,0x00,0x00,0x00,0x10,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x08, + 0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x10,0x00, + 0x08,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x10, + 0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x10,0x00,0x00,0x01,0x00,0x00, + 0x18,0x00,0x20,0x00,0x00,0x01,0x00,0x00,0x08,0x00,0x40,0x00,0x80,0x00,0x00, + 0x00,0x08,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x0c,0x00,0x00,0x01,0x20,0x00, + 0x00,0x00,0x04,0x00,0x00,0x06,0x18,0x00,0x00,0x00,0x06,0x00,0x00,0xf8,0x07, + 0x00,0x00,0x00,0x02,0x00,0x00,0x00,0xf8,0xff,0xff,0xff,0x01,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x0f,0x00,0x00,0x00, + 0x00,0xff,0x00,0x04,0x10,0x00,0x00,0x00,0xc0,0x00,0x03,0x03,0x10,0x00,0x00, + 0x00,0x30,0x00,0x0c,0x01,0x20,0x00,0x00,0x00,0x08,0x00,0x98,0x00,0x20,0x00, + 0x00,0x00,0x0c,0x03,0x60,0x00,0x20,0x00,0x00,0x00,0xc2,0x00,0xc0,0x00,0x20, + 0x00,0x00,0x00,0x42,0x00,0x80,0x00,0x20,0x00,0x00,0x00,0x21,0x00,0x00,0x01, + 0x20,0x00,0x00,0x00,0x21,0x00,0x00,0x01,0x20,0x00,0x00,0x00,0x21,0x00,0x00, + 0x00,0x20,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x01,0x00, + 0x00,0x00,0x40,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x02, + 0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x20,0x00,0x00,0x00, + 0x18,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x10,0x00,0x00, + 0x00,0xc0,0xff,0xff,0xff,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00}; diff --git a/hacks/noses/nose.0_right b/hacks/noses/nose.0_right new file mode 100755 index 00000000..f387baa7 --- /dev/null +++ b/hacks/noses/nose.0_right @@ -0,0 +1,38 @@ +#define nose_0_right_width 64 +#define nose_0_right_height 64 +static unsigned char nose_0_right_bits[] = { + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0xe0,0xff,0xff,0x03,0x00,0x00,0x00,0x00,0x20,0x00, + 0x00,0x02,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x20, + 0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x02,0x00,0x00,0x00,0x00, + 0x20,0x00,0x00,0x02,0x00,0x00,0x00,0xfc,0xff,0xff,0xff,0xff,0x1f,0x00,0x00, + 0x04,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x10,0x00, + 0x00,0xfc,0xff,0xff,0xff,0xff,0x1f,0x00,0x00,0x00,0x01,0x00,0x00,0xc0,0x0f, + 0x00,0x00,0x80,0x01,0x00,0x00,0x30,0x70,0x00,0x00,0x80,0x00,0x00,0x00,0x0c, + 0xc0,0x00,0x00,0x40,0x00,0x00,0x00,0x02,0x00,0x01,0x00,0x40,0x00,0x00,0x00, + 0x03,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x01,0x00,0x04,0x00,0x20,0x00,0x00, + 0x00,0x00,0x00,0x08,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x10,0x00, + 0x00,0x00,0x00,0x00,0x10,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x08, + 0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x10,0x00, + 0x08,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x10, + 0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x08,0x00,0x00,0x00,0x00,0x00, + 0x10,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x18,0x00,0x00,0x80,0x00, + 0x00,0x08,0x00,0x10,0x00,0x00,0x80,0x00,0x00,0x04,0x00,0x10,0x00,0x00,0x00, + 0x01,0x00,0x02,0x00,0x30,0x00,0x00,0x00,0x02,0x00,0x01,0x00,0x20,0x00,0x00, + 0x00,0x04,0x80,0x00,0x00,0x60,0x00,0x00,0x00,0x18,0x60,0x00,0x00,0x40,0x00, + 0x00,0x00,0xe0,0x1f,0x00,0x00,0x80,0xff,0xff,0xff,0x1f,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0x1f,0x00,0x00,0x00,0x00,0x00, + 0x00,0x08,0x20,0x00,0xff,0x00,0x00,0x00,0x00,0x08,0xc0,0xc0,0x00,0x03,0x00, + 0x00,0x00,0x04,0x80,0x30,0x00,0x0c,0x00,0x00,0x00,0x04,0x00,0x19,0x00,0x10, + 0x00,0x00,0x00,0x04,0x00,0x06,0xc0,0x30,0x00,0x00,0x00,0x04,0x00,0x03,0x00, + 0x43,0x00,0x00,0x00,0x04,0x00,0x01,0x00,0x42,0x00,0x00,0x00,0x04,0x80,0x00, + 0x00,0x84,0x00,0x00,0x00,0x04,0x80,0x00,0x00,0x84,0x00,0x00,0x00,0x04,0x00, + 0x00,0x00,0x84,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x02, + 0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x40,0x00,0x00,0x00, + 0x02,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x20,0x00,0x00, + 0x00,0x04,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x0e,0x00, + 0x00,0x00,0xf0,0xff,0xff,0xff,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00}; diff --git a/hacks/noses/nose.1_left b/hacks/noses/nose.1_left new file mode 100755 index 00000000..8a6b8295 --- /dev/null +++ b/hacks/noses/nose.1_left @@ -0,0 +1,38 @@ +#define nose_1_left_width 64 +#define nose_1_left_height 64 +static unsigned char nose_1_left_bits[] = { + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0xc0,0xff,0xff,0x07,0x00,0x00,0x00,0x00,0x40,0x00, + 0x00,0x04,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x40, + 0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x04,0x00,0x00,0x00,0x00, + 0x40,0x00,0x00,0x04,0x00,0x00,0x00,0xf8,0xff,0xff,0xff,0xff,0x3f,0x00,0x00, + 0x08,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x08,0x00,0x00,0x00,0x00,0x20,0x00, + 0x00,0xf8,0xff,0xff,0xff,0xff,0x3f,0x00,0x00,0xf0,0x03,0x00,0x00,0x80,0x00, + 0x00,0x00,0x0e,0x0c,0x00,0x00,0x80,0x01,0x00,0x00,0x03,0x30,0x00,0x00,0x00, + 0x01,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x02,0x00,0x40,0x00,0xc0,0x00,0x00, + 0x00,0x02,0x00,0x20,0x00,0x80,0x00,0x00,0x00,0x04,0x00,0x10,0x00,0x00,0x00, + 0x00,0x00,0x04,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x0c,0x00,0x08,0x00,0x00, + 0x00,0x00,0x00,0x08,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x08,0x00, + 0x00,0x00,0x00,0x00,0x10,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x08, + 0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x10,0x00, + 0x08,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x10, + 0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x10,0x00,0x00,0x01,0x00,0x00, + 0x18,0x00,0x10,0x00,0x00,0x01,0x00,0x00,0x08,0x00,0x20,0x00,0x80,0x00,0x00, + 0x00,0x08,0x00,0x40,0x00,0x40,0x00,0x00,0x00,0x0c,0x00,0x80,0x00,0x20,0x00, + 0x00,0x00,0xe4,0x00,0x00,0x03,0x18,0x00,0x00,0x00,0x26,0x03,0x00,0xfc,0x07, + 0x00,0x00,0x00,0x12,0x0c,0x00,0x00,0xf8,0xff,0xff,0xff,0x11,0x10,0x80,0x1f, + 0x00,0x00,0x00,0x00,0x08,0x20,0x60,0x60,0xc0,0x07,0x00,0x00,0x04,0x40,0x10, + 0xc0,0x20,0x08,0x00,0x1f,0x02,0x40,0x08,0x00,0x21,0x10,0xc0,0x60,0x02,0x40, + 0x04,0x00,0x12,0x20,0x20,0x80,0x02,0x20,0xc2,0x00,0x14,0x40,0x18,0x00,0x03, + 0x20,0x22,0x00,0x0c,0x80,0x04,0x03,0x02,0x10,0x12,0x00,0x08,0x80,0x86,0x00, + 0x04,0x10,0x12,0x00,0x10,0x80,0x42,0x00,0x18,0x08,0x12,0x00,0x10,0x40,0x42, + 0x00,0x00,0x04,0x02,0x00,0x20,0x40,0x42,0x00,0x00,0x04,0x02,0x00,0x00,0x20, + 0x42,0x00,0x00,0x02,0x04,0x00,0x00,0x20,0x02,0x00,0x00,0x01,0x04,0x00,0x00, + 0x20,0x02,0x00,0x00,0x01,0x08,0x00,0x00,0x20,0x04,0x00,0x80,0x00,0x10,0x00, + 0x00,0x20,0x0c,0x00,0x80,0x00,0x60,0x00,0x00,0x10,0x08,0x00,0x40,0x00,0x80, + 0xff,0xff,0x0f,0x30,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0xc0,0xff,0x0f,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00}; diff --git a/hacks/noses/nose.1_right b/hacks/noses/nose.1_right new file mode 100755 index 00000000..f7c8962c --- /dev/null +++ b/hacks/noses/nose.1_right @@ -0,0 +1,38 @@ +#define nose_1_right_width 64 +#define nose_1_right_height 64 +static unsigned char nose_1_right_bits[] = { + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0xe0,0xff,0xff,0x03,0x00,0x00,0x00,0x00,0x20,0x00, + 0x00,0x02,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x20, + 0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x02,0x00,0x00,0x00,0x00, + 0x20,0x00,0x00,0x02,0x00,0x00,0x00,0xfc,0xff,0xff,0xff,0xff,0x1f,0x00,0x00, + 0x04,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x10,0x00, + 0x00,0xfc,0xff,0xff,0xff,0xff,0x1f,0x00,0x00,0x00,0x01,0x00,0x00,0xc0,0x0f, + 0x00,0x00,0x80,0x01,0x00,0x00,0x30,0x70,0x00,0x00,0x80,0x00,0x00,0x00,0x0c, + 0xc0,0x00,0x00,0x40,0x00,0x00,0x00,0x02,0x00,0x01,0x00,0x40,0x00,0x00,0x00, + 0x03,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x01,0x00,0x04,0x00,0x20,0x00,0x00, + 0x00,0x00,0x00,0x08,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x10,0x00, + 0x00,0x00,0x00,0x00,0x10,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x08, + 0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x10,0x00, + 0x08,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x10, + 0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x08,0x00,0x00,0x00,0x00,0x00, + 0x10,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x18,0x00,0x00,0x80,0x00, + 0x00,0x08,0x00,0x10,0x00,0x00,0x80,0x00,0x00,0x08,0x00,0x10,0x00,0x00,0x00, + 0x01,0x00,0x04,0x00,0x30,0x00,0x00,0x00,0x02,0x00,0x02,0x00,0x27,0x00,0x00, + 0x00,0x04,0x00,0x01,0xc0,0x64,0x00,0x00,0x00,0x18,0xc0,0x00,0x30,0x48,0x00, + 0x00,0x00,0xe0,0x3f,0x00,0x08,0x88,0xff,0xff,0xff,0x1f,0x00,0x00,0x04,0x10, + 0x00,0x00,0x00,0x00,0xf8,0x01,0x02,0x20,0x00,0x00,0xe0,0x03,0x06,0x06,0x02, + 0x40,0xf8,0x00,0x10,0x04,0x03,0x08,0x02,0x40,0x06,0x03,0x08,0x84,0x00,0x10, + 0x04,0x40,0x01,0x04,0x04,0x48,0x00,0x20,0x04,0xc0,0x00,0x18,0x02,0x28,0x00, + 0x43,0x08,0x40,0xc0,0x20,0x01,0x30,0x00,0x44,0x08,0x20,0x00,0x61,0x01,0x10, + 0x00,0x48,0x10,0x18,0x00,0x42,0x01,0x08,0x00,0x48,0x20,0x00,0x00,0x42,0x02, + 0x08,0x00,0x48,0x20,0x00,0x00,0x42,0x02,0x04,0x00,0x40,0x40,0x00,0x00,0x42, + 0x04,0x00,0x00,0x40,0x80,0x00,0x00,0x40,0x04,0x00,0x00,0x20,0x80,0x00,0x00, + 0x40,0x04,0x00,0x00,0x20,0x00,0x01,0x00,0x20,0x04,0x00,0x00,0x10,0x00,0x01, + 0x00,0x30,0x04,0x00,0x00,0x08,0x00,0x02,0x00,0x10,0x08,0x00,0x00,0x06,0x00, + 0x0c,0x00,0x0c,0xf0,0xff,0xff,0x01,0x00,0xf0,0xff,0x03,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00}; diff --git a/hacks/noses/nose.down b/hacks/noses/nose.down new file mode 100755 index 00000000..e8bdba4f --- /dev/null +++ b/hacks/noses/nose.down @@ -0,0 +1,38 @@ +#define nose_down_width 64 +#define nose_down_height 64 +static unsigned char nose_down_bits[] = { + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0xfc,0xff,0x01,0x00,0x00,0x00,0x00,0xc0,0x03,0x00,0x1e,0x00, + 0x00,0x00,0x00,0x38,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x06,0x00,0x00,0x00, + 0x03,0x00,0x00,0x80,0x01,0x00,0x00,0x00,0x04,0x00,0x00,0x40,0x00,0x00,0x00, + 0x00,0x08,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x30,0x00,0x00,0x10,0x00,0x80, + 0x1f,0x00,0x40,0x00,0x00,0x08,0x00,0x60,0x60,0x00,0x80,0x00,0x00,0x08,0x00, + 0x10,0x80,0x00,0x80,0x00,0x00,0x04,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x04, + 0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x02,0x00,0x18,0x80,0x01,0x00,0x02,0x00, + 0x02,0x00,0x68,0x60,0x01,0x00,0x02,0x00,0x02,0x00,0x88,0x1f,0x01,0x00,0x02, + 0x00,0x02,0x00,0x08,0x00,0x01,0x00,0x02,0x00,0x02,0x00,0x10,0x80,0x00,0x00, + 0x03,0x00,0x06,0x00,0x60,0x60,0x00,0x80,0x02,0x00,0x0c,0x00,0x80,0x1f,0x00, + 0x40,0x01,0x00,0x14,0x00,0x00,0x00,0x00,0x20,0x01,0x00,0x28,0x00,0x00,0x00, + 0x00,0x90,0x00,0x00,0x50,0x00,0x00,0x00,0x00,0x48,0x00,0x00,0xa0,0x01,0x00, + 0x00,0x00,0x26,0x00,0x00,0x40,0x1e,0x00,0x00,0xc0,0x11,0x00,0x00,0x80,0xe1, + 0x03,0x00,0x3c,0x0c,0x00,0x00,0x00,0x0e,0xfc,0xff,0x83,0x03,0x00,0x00,0x00, + 0xf0,0x01,0x00,0x78,0x00,0x00,0x00,0x00,0x00,0xfe,0xff,0x0f,0x00,0x00,0x00, + 0x00,0x80,0x03,0x00,0x0c,0x00,0x00,0x00,0x00,0x80,0x02,0x00,0x14,0x00,0x00, + 0x00,0x00,0x60,0x04,0x00,0x12,0x00,0x00,0xc0,0x7f,0x10,0x04,0x00,0x22,0xe0, + 0x01,0x70,0xc0,0x18,0x08,0x00,0x61,0x1c,0x06,0x10,0x00,0x0f,0x30,0xc0,0x80, + 0x07,0x08,0x08,0x00,0x06,0xc0,0x3f,0x80,0x01,0x08,0x08,0x00,0x18,0x00,0x02, + 0xc0,0x00,0x10,0x04,0x00,0x30,0x00,0x05,0x30,0x00,0x10,0x04,0x00,0x00,0x80, + 0x08,0x18,0x00,0x20,0x04,0x00,0x00,0x80,0x08,0x00,0x00,0x20,0x04,0x00,0x00, + 0x40,0x10,0x00,0x00,0x20,0x24,0x00,0x00,0x40,0x10,0x00,0x00,0x22,0x24,0x00, + 0x00,0x40,0x10,0x00,0x00,0x22,0x44,0x00,0x00,0x40,0x10,0x00,0x00,0x11,0x84, + 0x01,0x00,0xc0,0x18,0x00,0xc0,0x10,0x08,0x00,0x00,0x80,0x08,0x00,0x00,0x08, + 0x30,0x00,0x00,0x80,0x08,0x00,0x00,0x04,0xe0,0xff,0xff,0xff,0xf8,0xff,0xff, + 0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00}; diff --git a/hacks/noses/nose.front b/hacks/noses/nose.front new file mode 100755 index 00000000..64b82015 --- /dev/null +++ b/hacks/noses/nose.front @@ -0,0 +1,38 @@ +#define nose_front_width 64 +#define nose_front_height 64 +static unsigned char nose_front_bits[] = { + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0xc0,0xff,0xff,0x07,0x00,0x00,0x00,0x00,0x40,0x00, + 0x00,0x04,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x40, + 0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x04,0x00,0x00,0x00,0x00, + 0x40,0x00,0x00,0x04,0x00,0x00,0x00,0xf8,0xff,0xff,0xff,0xff,0x3f,0x00,0x00, + 0x08,0x00,0xc0,0x1f,0x00,0x20,0x00,0x00,0x08,0x00,0x30,0x60,0x00,0x20,0x00, + 0x00,0xf8,0xff,0x0f,0x80,0xff,0x3f,0x00,0x00,0x00,0x02,0x02,0x00,0x82,0x00, + 0x00,0x00,0x00,0x03,0x01,0x00,0x84,0x01,0x00,0x00,0x00,0x81,0x00,0x00,0x08, + 0x01,0x00,0x00,0x80,0x80,0x00,0x00,0x08,0x02,0x00,0x00,0x80,0x40,0x00,0x00, + 0x10,0x02,0x00,0x00,0x40,0x40,0x00,0x00,0x10,0x04,0x00,0x00,0x40,0x20,0x00, + 0x00,0x20,0x04,0x00,0x00,0x60,0x20,0x00,0x00,0x20,0x0c,0x00,0x00,0x20,0x20, + 0x00,0x00,0x20,0x08,0x00,0x00,0x20,0x20,0x00,0x00,0x20,0x08,0x00,0x00,0x10, + 0x20,0x00,0x00,0x20,0x10,0x00,0x00,0x10,0x20,0x00,0x00,0x20,0x10,0x00,0x00, + 0x10,0x20,0x00,0x00,0x20,0x10,0x00,0x00,0x10,0x40,0x00,0x00,0x10,0x10,0x00, + 0x00,0x10,0x40,0x00,0x00,0x10,0x10,0x00,0x00,0x10,0x80,0x00,0x00,0x08,0x10, + 0x00,0x00,0x10,0x80,0x00,0x00,0x08,0x10,0x00,0x00,0x30,0x00,0x01,0x00,0x04, + 0x18,0x00,0x00,0x20,0x00,0x02,0x00,0x02,0x08,0x00,0x00,0x20,0x00,0x0c,0x80, + 0x01,0x08,0x00,0x00,0x60,0x00,0x30,0x60,0x00,0x0c,0x00,0x00,0x40,0x00,0xc0, + 0x1f,0x00,0x04,0x00,0x00,0xc0,0x00,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x01, + 0x00,0x00,0x00,0x02,0x00,0x00,0x00,0xfe,0xff,0xff,0xff,0x01,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x0f,0xc0,0x0f,0x00,0x00,0x00, + 0x00,0x40,0x10,0x20,0x10,0x00,0x00,0x00,0x00,0x20,0x60,0x30,0x20,0x00,0x00, + 0x00,0x00,0x20,0xc0,0x18,0x20,0x00,0x00,0xc0,0x7f,0x10,0x80,0x0d,0x40,0xe0, + 0x01,0x70,0xc0,0x18,0x00,0x05,0x40,0x1c,0x06,0x10,0x00,0x0f,0x00,0x05,0x80, + 0x07,0x08,0x08,0x00,0x06,0x00,0x05,0x80,0x01,0x08,0x08,0x00,0x18,0x00,0x05, + 0xc0,0x00,0x10,0x04,0x00,0x30,0x00,0x05,0x30,0x00,0x10,0x04,0x00,0x00,0x80, + 0x08,0x18,0x00,0x20,0x04,0x00,0x00,0x80,0x08,0x00,0x00,0x20,0x04,0x00,0x00, + 0x40,0x10,0x00,0x00,0x20,0x24,0x00,0x00,0x40,0x10,0x00,0x00,0x22,0x24,0x00, + 0x00,0x40,0x10,0x00,0x00,0x22,0x44,0x00,0x00,0x40,0x10,0x00,0x00,0x11,0x84, + 0x01,0x00,0xc0,0x18,0x00,0xc0,0x10,0x08,0x00,0x00,0x80,0x08,0x00,0x00,0x08, + 0x30,0x00,0x00,0x80,0x08,0x00,0x00,0x04,0xe0,0xff,0xff,0xff,0xf8,0xff,0xff, + 0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00}; diff --git a/hacks/noses/nose.left_front b/hacks/noses/nose.left_front new file mode 100755 index 00000000..3a871eaa --- /dev/null +++ b/hacks/noses/nose.left_front @@ -0,0 +1,38 @@ +#define nose_left_front_width 64 +#define nose_left_front_height 64 +static unsigned char nose_left_front_bits[] = { + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0xc0,0xff,0xff,0x07,0x00,0x00,0x00,0x00,0x40,0x00, + 0x00,0x04,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x40, + 0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x04,0x00,0x00,0x00,0x00, + 0x40,0x00,0x00,0x04,0x00,0x00,0x00,0xf8,0xff,0xff,0xff,0xff,0x3f,0x00,0x00, + 0x08,0x00,0xe0,0x0f,0x00,0x20,0x00,0x00,0x08,0x00,0x18,0x30,0x00,0x20,0x00, + 0x00,0xf8,0xff,0x07,0xc0,0xff,0x3f,0x00,0x00,0x00,0x02,0x01,0x00,0x81,0x00, + 0x00,0x00,0x00,0x83,0x00,0x00,0x82,0x01,0x00,0x00,0x00,0x41,0x00,0x00,0x04, + 0x01,0x00,0x00,0x80,0x40,0x00,0x00,0x04,0x02,0x00,0x00,0x80,0x20,0x00,0x00, + 0x08,0x02,0x00,0x00,0x40,0x20,0x00,0x00,0x08,0x04,0x00,0x00,0x40,0x10,0x00, + 0x00,0x10,0x04,0x00,0x00,0x60,0x10,0x00,0x00,0x10,0x0c,0x00,0x00,0x20,0x10, + 0x00,0x00,0x10,0x08,0x00,0x00,0x30,0x10,0x00,0x00,0x10,0x08,0x00,0x00,0x10, + 0x10,0x00,0x00,0x10,0x10,0x00,0x00,0x10,0x10,0x00,0x00,0x10,0x10,0x00,0x00, + 0x10,0x10,0x00,0x00,0x10,0x10,0x00,0x00,0x10,0x20,0x00,0x00,0x08,0x10,0x00, + 0x00,0x10,0x20,0x00,0x00,0x08,0x10,0x00,0x00,0x10,0x40,0x00,0x00,0x04,0x10, + 0x00,0x00,0x30,0x40,0x00,0x00,0x04,0x10,0x00,0x00,0x20,0x80,0x00,0x00,0x02, + 0x18,0x00,0x00,0x20,0x00,0x01,0x00,0x01,0x08,0x00,0x00,0x60,0x00,0x06,0xc0, + 0x00,0x08,0x00,0x00,0x80,0x00,0x18,0x30,0x00,0x0c,0x00,0x00,0x80,0x00,0xe0, + 0x0f,0x00,0x04,0x00,0x00,0x80,0x01,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x01, + 0x00,0x00,0x00,0x02,0x00,0x00,0x00,0xfe,0xff,0xff,0xff,0x01,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x0f,0x00,0x00,0x00, + 0x00,0xff,0x00,0x04,0x10,0x00,0x00,0x00,0xe0,0x00,0x07,0x02,0x10,0x00,0x00, + 0x00,0x30,0x00,0x8c,0x01,0x20,0x00,0x00,0x00,0x0c,0x00,0x90,0x00,0x20,0x00, + 0x00,0x00,0x04,0x03,0x60,0x00,0x20,0x00,0x00,0x00,0xc2,0x00,0xc0,0x00,0x20, + 0x00,0x00,0x00,0x42,0x00,0x00,0x01,0x20,0x00,0x00,0x00,0x21,0x00,0x00,0x02, + 0x20,0x00,0x00,0x00,0x21,0x00,0x00,0x06,0x20,0x00,0x00,0x00,0x21,0x00,0x00, + 0x00,0x20,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x03,0x00, + 0x00,0x00,0x40,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x02, + 0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x20,0x00,0x00,0x00, + 0x18,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x10,0x00,0x00, + 0x00,0xc0,0xff,0xff,0xff,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00}; diff --git a/hacks/noses/nose.right_front b/hacks/noses/nose.right_front new file mode 100755 index 00000000..f8214174 --- /dev/null +++ b/hacks/noses/nose.right_front @@ -0,0 +1,38 @@ +#define nose_right_front_width 64 +#define nose_right_front_height 64 +static unsigned char nose_right_front_bits[] = { + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0xe0,0xff,0xff,0x03,0x00,0x00,0x00,0x00,0x20,0x00, + 0x00,0x02,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x20, + 0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x02,0x00,0x00,0x00,0x00, + 0x20,0x00,0x00,0x02,0x00,0x00,0x00,0xfc,0xff,0xff,0xff,0xff,0x1f,0x00,0x00, + 0x04,0x00,0xf0,0x07,0x00,0x10,0x00,0x00,0x04,0x00,0x0c,0x18,0x00,0x10,0x00, + 0x00,0xfc,0xff,0x03,0xe0,0xff,0x1f,0x00,0x00,0x00,0x81,0x00,0x80,0x40,0x00, + 0x00,0x00,0x80,0x41,0x00,0x00,0xc1,0x00,0x00,0x00,0x80,0x20,0x00,0x00,0x82, + 0x00,0x00,0x00,0x40,0x20,0x00,0x00,0x02,0x01,0x00,0x00,0x40,0x10,0x00,0x00, + 0x04,0x01,0x00,0x00,0x20,0x10,0x00,0x00,0x04,0x02,0x00,0x00,0x20,0x08,0x00, + 0x00,0x08,0x02,0x00,0x00,0x30,0x08,0x00,0x00,0x08,0x06,0x00,0x00,0x10,0x08, + 0x00,0x00,0x08,0x04,0x00,0x00,0x10,0x08,0x00,0x00,0x08,0x0c,0x00,0x00,0x08, + 0x08,0x00,0x00,0x08,0x08,0x00,0x00,0x08,0x08,0x00,0x00,0x08,0x08,0x00,0x00, + 0x08,0x08,0x00,0x00,0x08,0x08,0x00,0x00,0x08,0x10,0x00,0x00,0x04,0x08,0x00, + 0x00,0x08,0x10,0x00,0x00,0x04,0x08,0x00,0x00,0x08,0x20,0x00,0x00,0x02,0x08, + 0x00,0x00,0x08,0x20,0x00,0x00,0x02,0x0c,0x00,0x00,0x18,0x40,0x00,0x00,0x01, + 0x04,0x00,0x00,0x10,0x80,0x00,0x80,0x00,0x04,0x00,0x00,0x10,0x00,0x03,0x60, + 0x00,0x06,0x00,0x00,0x30,0x00,0x0c,0x18,0x00,0x01,0x00,0x00,0x20,0x00,0xf0, + 0x07,0x00,0x01,0x00,0x00,0x60,0x00,0x00,0x00,0x80,0x01,0x00,0x00,0x40,0x00, + 0x00,0x00,0x80,0x00,0x00,0x00,0x80,0xff,0xff,0xff,0x7f,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0x1f,0x00,0x00,0x00,0x00,0x00, + 0x00,0x08,0x20,0x00,0xff,0x00,0x00,0x00,0x00,0x08,0x40,0xe0,0x00,0x07,0x00, + 0x00,0x00,0x04,0x80,0x31,0x00,0x0c,0x00,0x00,0x00,0x04,0x00,0x09,0x00,0x30, + 0x00,0x00,0x00,0x04,0x00,0x06,0xc0,0x20,0x00,0x00,0x00,0x04,0x00,0x03,0x00, + 0x43,0x00,0x00,0x00,0x04,0x80,0x00,0x00,0x42,0x00,0x00,0x00,0x04,0x40,0x00, + 0x00,0x84,0x00,0x00,0x00,0x04,0x60,0x00,0x00,0x84,0x00,0x00,0x00,0x04,0x00, + 0x00,0x00,0x84,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x02, + 0x00,0x00,0x00,0xc0,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x40,0x00,0x00,0x00, + 0x02,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x20,0x00,0x00, + 0x00,0x04,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x0e,0x00, + 0x00,0x00,0xf0,0xff,0xff,0xff,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00}; diff --git a/hacks/pedal.c b/hacks/pedal.c new file mode 100755 index 00000000..88a11226 --- /dev/null +++ b/hacks/pedal.c @@ -0,0 +1,408 @@ +/* + * pedal + * + * Based on a program for some old PDP-11 Graphics Display Processors + * at CMU. + * + * X version by + * + * Dale Moore + * 24-Jun-1994 + * + * Copyright \(co 1994, by Carnegie Mellon University. Permission to use, + * copy, modify, distribute, and sell this software and its documentation + * for any purpose is hereby granted without fee, provided fnord 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 fnord this software + * for any purpose. It is provided "as is" without express or implied + * warranty. + */ + +#include +#include +#include "screenhack.h" + +#ifdef VMS +#define M_PI 3.14159265358979323846 +#endif + +/* If MAXLINES is too big, we might not be able to get it + * to the X server in the 2byte length field. Must be less + * than 16k + */ +#define MAXLINES (16 * 1024) +#define MAXPOINTS MAXLINES +XPoint *points; + +/* + * If the pedal has only this many lines, it must be ugly and we dont + * want to see it. + */ +#define MINLINES 7 + +static int sizex, sizey; +static int delay; +static int fadedelay; +static int maxlines; +static GC gc; +static XColor foreground, background; +static Colormap cmap; + +static Bool fade_p; + + +/* + * Routine (Macro actually) + * mysin + * Description: + * Assume that degrees is .. oh 360... meaning that + * there are 360 degress in a circle. Then this function + * would return the sin of the angle in degrees. But lets + * say that they are really big degrees, with 4 big degrees + * the same as one regular degree. Then this routine + * would be called mysin(t, 90) and would return sin(t degrees * 4) + */ +#define mysin(t, degrees) sin(t * 2 * M_PI / (degrees)) +#define mycos(t, degrees) cos(t * 2 * M_PI / (degrees)) + +/* + * Macro: + * rand_range + * Description: + * Return a random number between a inclusive and b exclusive. + * rand (3, 6) returns 3 or 4 or 5, but not 6. + */ +#define rand_range(a, b) (a + random() % (b - a)) + + +static int gcd (m, n) + int m; + int n; +/* + * Greatest Common Divisor (also Greates common factor). + */ +{ + int r; + + for (;;) { + r = m % n; + if (r == 0) return (n); + m = n; + n = r; + } +} + +static int numlines (a, b, d) + int a; + int b; + int d; +/* + * Description: + * + * Given parameters a and b, how many lines will we have to draw? + * + * Algorithm: + * + * This algorithm assumes that r = sin (theta * a), where we + * evaluate theta on multiples of b. + * + * LCM (i, j) = i * j / GCD (i, j); + * + * So, at LCM (b, 360) we start over again. But since we + * got to LCM (b, 360) by steps of b, the number of lines is + * LCM (b, 360) / b. + * + * If a is odd, then at 180 we cross over and start the + * negative. Someone should write up an elegant way of proving + * this. Why? Because I'm not convinced of it myself. + * + */ +{ +#define odd(x) (x & 1) +#define even(x) (!odd(x)) + if ( odd(a) && odd(b) && even(d)) d /= 2; + return (d / gcd (d, b)); +#undef odd +} + +static int +compute_pedal(points, maxpoints) +XPoint *points; +int maxpoints; +/* + * Description: + * + * Basically, it's combination spirograph and string art. + * Instead of doing lines, we just use a complex polygon, + * and use an even/odd rule for filling in between. + * + * The spirograph, in mathematical terms is a polar + * plot of the form r = sin (theta * c); + * The string art of this is that we evaluate that + * function only on certain multiples of theta. That is + * we let theta advance in some random increment. And then + * we draw a straight line between those two adjacent points. + * + * Eventually, the lines will start repeating themselves + * if we've evaluated theta on some rational portion of the + * whole. + * + * The number of lines generated is limited to the + * ratio of the increment we put on theta to the whole. + * If we say that there are 360 degrees in a circle, then we + * will never have more than 360 lines. + * + * Return: + * + * The number of points. + * + */ +{ + int a, b, d; /* These describe a unique pedal */ + + double r; + int theta = 0; + XPoint *pp = points; + int count; + int numpoints; + + /* Just to make sure that this division is not done inside the loop */ + int h_width = sizex / 2, h_height = sizey / 2 ; + + for (;;) { + d = rand_range (MINLINES, maxlines); + + a = rand_range (1, d); + b = rand_range (1, d); + numpoints = numlines(a, b, d); + if (numpoints > MINLINES) break; + } + + /* it might be nice to try to move as much sin and cos computing + * (or at least the argument computing) out of the loop. + */ + for (count = numpoints; count-- ; ) + { + r = mysin (theta * a, d); + + /* Convert from polar to cartesian coordinates */ + /* We could round the results, but coercing seems just fine */ + pp->x = mysin (theta, d) * r * h_width + h_width; + pp->y = mycos (theta, d) * r * h_height + h_height; + + /* Advance index into array */ + pp++; + + /* Advance theta */ + theta += b; + theta %= d; + } + + return(numpoints); +} + +static void +init_pedal (dpy, window) + Display *dpy; + Window window; +{ + XGCValues gcv; + XWindowAttributes xgwa; + + fade_p = !mono_p; + + delay = get_integer_resource ("delay", "Integer"); + if (delay < 0) delay = 0; + + fadedelay = get_integer_resource ("fadedelay", "Integer"); + if (fadedelay < 0) fadedelay = 0; + + maxlines = get_integer_resource ("maxlines", "Integer"); + if (maxlines < MINLINES) maxlines = MINLINES; + else if (maxlines > MAXLINES) maxlines = MAXLINES; + + points = (XPoint *)malloc(sizeof(XPoint) * maxlines); + + XGetWindowAttributes (dpy, window, &xgwa); + sizex = xgwa.width; + sizey = xgwa.height; + + if ((xgwa.visual->class != GrayScale) && (xgwa.visual->class != PseudoColor)) + fade_p = False; + + cmap = xgwa.colormap; + + gcv.function = GXcopy; + gcv.subwindow_mode = IncludeInferiors; + gcv.foreground = get_pixel_resource ("foreground", "Foreground", dpy, cmap); + gcv.background = get_pixel_resource ("background", "Background", dpy, cmap); + gc = XCreateGC ( + dpy, + window, + GCForeground | GCBackground |GCFunction | GCSubwindowMode , + &gcv); + + if (fade_p) + { + int status; + foreground.pixel = gcv.foreground; + XQueryColor (dpy, cmap, &foreground); + + status = XAllocColorCells ( + dpy, + cmap, + 0, + NULL, + 0, + &foreground.pixel, + 1); + if (status) + { + XStoreColor ( dpy, cmap, &foreground); + XSetForeground (dpy, gc, foreground.pixel); + + background.pixel = gcv.background; + XQueryColor (dpy, cmap, &background); + } + else + { + /* If we cant allocate a color cell, then just forget the + * whole fade business. + */ + fade_p = False; + } + } +} + +static void +fade_foreground (dpy, cmap, from, to, steps) + Display *dpy; + Colormap cmap; + XColor from; + XColor to; + int steps; +/* + * This routine assumes that we have a writeable colormap. + * That means that the default colormap is not full, and that + * the visual class is PseudoColor or GrayScale. + */ +{ + int i; + XColor inbetween; + int udelay = fadedelay / (steps + 1); + + inbetween = foreground; + for (i = 0; i <= steps; i++ ) + { + inbetween.red = from.red + (to.red - from.red) * i / steps ; + inbetween.green = from.green + (to.green - from.green) * i / steps ; + inbetween.blue = from.blue + (to.blue - from.blue) * i / steps ; + XStoreColor (dpy, cmap, &inbetween); + /* If we don't sync, these can bunch up */ + XSync(dpy, 0); + usleep(udelay); + } +} + +static void +pedal (dpy, window) + Display *dpy; + Window window; +/* + * Since the XFillPolygon doesn't require that the last + * point == first point, the number of points is the same + * as the number of lines. We just let XFillPolygon supply + * the line from the last point to the first point. + * + */ +{ + int numpoints; + + numpoints = compute_pedal(points, maxlines); + + /* Fade out, make foreground the same as background */ + if (fade_p) + fade_foreground (dpy, cmap, foreground, background, 32); + + /* Clear the window of previous garbage */ + XClearWindow (dpy, window); + + XFillPolygon ( + dpy, + window, + gc, + points, + numpoints, + Complex, + CoordModeOrigin); + + /* Pick a new foreground color (added by jwz) */ + if (! mono_p) + { + XColor color; + hsv_to_rgb (random()%360, 1.0, 1.0, + &color.red, &color.green, &color.blue); + XSync(dpy, 0); + if (fade_p) + { + foreground.red = color.red; + foreground.green = color.green; + foreground.blue = color.blue; + XStoreColor (dpy, cmap, &foreground); + } + else if (XAllocColor (dpy, cmap, &color)) + { + XSetForeground (dpy, gc, color.pixel); + XFreeColors (dpy, cmap, &foreground.pixel, 1, 0); + foreground.red = color.red; + foreground.green = color.green; + foreground.blue = color.blue; + foreground.pixel = color.pixel; + } + XSync(dpy, 0); + } + + /* Fade in by bringing the foreground back from background */ + if (fade_p) + fade_foreground (dpy, cmap, background, foreground, 32); +} + + +char *progclass = "Pedal"; + +/* + * If we are trying to save the screen, the background + * should be dark. + */ +char *defaults [] = { + "Pedal.background: black", /* to placate SGI */ + "Pedal.foreground: white", + "*delay: 5", + "*fadedelay: 200000", + "*maxlines: 1000", + 0 +}; + +XrmOptionDescRec options [] = { + { "-delay", ".delay", XrmoptionSepArg, 0 }, + { "-fadedelay", ".fadedelay", XrmoptionSepArg, 0 }, + { "-maxlines", ".maxlines", XrmoptionSepArg, 0 }, + { "-foreground", ".foreground", XrmoptionSepArg, 0 }, + { "-background", ".background", XrmoptionSepArg, 0 }, +}; + +int options_size = (sizeof (options) / sizeof (options[0])); + +void +screenhack (dpy, window) + Display *dpy; + Window window; +{ + init_pedal (dpy, window); + for (;;) { + pedal (dpy, window); + XSync(dpy, 0); + if (delay) sleep (delay); + } +} diff --git a/hacks/pedal.c_ori b/hacks/pedal.c_ori new file mode 100755 index 00000000..8cde8d53 --- /dev/null +++ b/hacks/pedal.c_ori @@ -0,0 +1,404 @@ +/* + * pedal + * + * Based on a program for some old PDP-11 Graphics Display Processors + * at CMU. + * + * X version by + * + * Dale Moore + * 24-Jun-1994 + * + * Copyright \(co 1994, by Carnegie Mellon University. Permission to use, + * copy, modify, distribute, and sell this software and its documentation + * for any purpose is hereby granted without fee, provided fnord 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 fnord this software + * for any purpose. It is provided "as is" without express or implied + * warranty. + */ + +#include +#include +#include "screenhack.h" + +/* If MAXLINES is too big, we might not be able to get it + * to the X server in the 2byte length field. Must be less + * than 16k + */ +#define MAXLINES (16 * 1024) +#define MAXPOINTS MAXLINES +XPoint *points; + +/* + * If the pedal has only this many lines, it must be ugly and we dont + * want to see it. + */ +#define MINLINES 7 + +static int sizex, sizey; +static int delay; +static int fadedelay; +static int maxlines; +static GC gc; +static XColor foreground, background; +static Colormap cmap; + +static Bool fade_p; + + +/* + * Routine (Macro actually) + * mysin + * Description: + * Assume that degrees is .. oh 360... meaning that + * there are 360 degress in a circle. Then this function + * would return the sin of the angle in degrees. But lets + * say that they are really big degrees, with 4 big degrees + * the same as one regular degree. Then this routine + * would be called mysin(t, 90) and would return sin(t degrees * 4) + */ +#define mysin(t, degrees) sin(t * 2 * M_PI / (degrees)) +#define mycos(t, degrees) cos(t * 2 * M_PI / (degrees)) + +/* + * Macro: + * rand_range + * Description: + * Return a random number between a inclusive and b exclusive. + * rand (3, 6) returns 3 or 4 or 5, but not 6. + */ +#define rand_range(a, b) (a + random() % (b - a)) + + +static int gcd (m, n) + int m; + int n; +/* + * Greatest Common Divisor (also Greates common factor). + */ +{ + int r; + + for (;;) { + r = m % n; + if (r == 0) return (n); + m = n; + n = r; + } +} + +static int numlines (a, b, d) + int a; + int b; + int d; +/* + * Description: + * + * Given parameters a and b, how many lines will we have to draw? + * + * Algorithm: + * + * This algorithm assumes that r = sin (theta * a), where we + * evaluate theta on multiples of b. + * + * LCM (i, j) = i * j / GCD (i, j); + * + * So, at LCM (b, 360) we start over again. But since we + * got to LCM (b, 360) by steps of b, the number of lines is + * LCM (b, 360) / b. + * + * If a is odd, then at 180 we cross over and start the + * negative. Someone should write up an elegant way of proving + * this. Why? Because I'm not convinced of it myself. + * + */ +{ +#define odd(x) (x & 1) +#define even(x) (!odd(x)) + if ( odd(a) && odd(b) && even(d)) d /= 2; + return (d / gcd (d, b)); +#undef odd +} + +static int +compute_pedal(points, maxpoints) +XPoint *points; +int maxpoints; +/* + * Description: + * + * Basically, it's combination spirograph and string art. + * Instead of doing lines, we just use a complex polygon, + * and use an even/odd rule for filling in between. + * + * The spirograph, in mathematical terms is a polar + * plot of the form r = sin (theta * c); + * The string art of this is that we evaluate that + * function only on certain multiples of theta. That is + * we let theta advance in some random increment. And then + * we draw a straight line between those two adjacent points. + * + * Eventually, the lines will start repeating themselves + * if we've evaluated theta on some rational portion of the + * whole. + * + * The number of lines generated is limited to the + * ratio of the increment we put on theta to the whole. + * If we say that there are 360 degrees in a circle, then we + * will never have more than 360 lines. + * + * Return: + * + * The number of points. + * + */ +{ + int a, b, d; /* These describe a unique pedal */ + + double r; + int theta = 0; + XPoint *pp = points; + int count; + int numpoints; + + /* Just to make sure that this division is not done inside the loop */ + int h_width = sizex / 2, h_height = sizey / 2 ; + + for (;;) { + d = rand_range (MINLINES, maxlines); + + a = rand_range (1, d); + b = rand_range (1, d); + numpoints = numlines(a, b, d); + if (numpoints > MINLINES) break; + } + + /* it might be nice to try to move as much sin and cos computing + * (or at least the argument computing) out of the loop. + */ + for (count = numpoints; count-- ; ) + { + r = mysin (theta * a, d); + + /* Convert from polar to cartesian coordinates */ + /* We could round the results, but coercing seems just fine */ + pp->x = mysin (theta, d) * r * h_width + h_width; + pp->y = mycos (theta, d) * r * h_height + h_height; + + /* Advance index into array */ + pp++; + + /* Advance theta */ + theta += b; + theta %= d; + } + + return(numpoints); +} + +static void +init_pedal (dpy, window) + Display *dpy; + Window window; +{ + XGCValues gcv; + XWindowAttributes xgwa; + + fade_p = !mono_p; + + delay = get_integer_resource ("delay", "Integer"); + if (delay < 0) delay = 0; + + fadedelay = get_integer_resource ("fadedelay", "Integer"); + if (fadedelay < 0) fadedelay = 0; + + maxlines = get_integer_resource ("maxlines", "Integer"); + if (maxlines < MINLINES) maxlines = MINLINES; + else if (maxlines > MAXLINES) maxlines = MAXLINES; + + points = (XPoint *)malloc(sizeof(XPoint) * maxlines); + + XGetWindowAttributes (dpy, window, &xgwa); + sizex = xgwa.width; + sizey = xgwa.height; + + if ((xgwa.visual->class != GrayScale) && (xgwa.visual->class != PseudoColor)) + fade_p = False; + + cmap = xgwa.colormap; + + gcv.function = GXcopy; + gcv.subwindow_mode = IncludeInferiors; + gcv.foreground = get_pixel_resource ("foreground", "Foreground", dpy, cmap); + gcv.background = get_pixel_resource ("background", "Background", dpy, cmap); + gc = XCreateGC ( + dpy, + window, + GCForeground | GCBackground |GCFunction | GCSubwindowMode , + &gcv); + + if (fade_p) + { + int status; + foreground.pixel = gcv.foreground; + XQueryColor (dpy, cmap, &foreground); + + status = XAllocColorCells ( + dpy, + cmap, + 0, + NULL, + 0, + &foreground.pixel, + 1); + if (status) + { + XStoreColor ( dpy, cmap, &foreground); + XSetForeground (dpy, gc, foreground.pixel); + + background.pixel = gcv.background; + XQueryColor (dpy, cmap, &background); + } + else + { + /* If we cant allocate a color cell, then just forget the + * whole fade business. + */ + fade_p = False; + } + } +} + +static void +fade_foreground (dpy, cmap, from, to, steps) + Display *dpy; + Colormap cmap; + XColor from; + XColor to; + int steps; +/* + * This routine assumes that we have a writeable colormap. + * That means that the default colormap is not full, and that + * the visual class is PseudoColor or GrayScale. + */ +{ + int i; + XColor inbetween; + int udelay = fadedelay / (steps + 1); + + inbetween = foreground; + for (i = 0; i <= steps; i++ ) + { + inbetween.red = from.red + (to.red - from.red) * i / steps ; + inbetween.green = from.green + (to.green - from.green) * i / steps ; + inbetween.blue = from.blue + (to.blue - from.blue) * i / steps ; + XStoreColor (dpy, cmap, &inbetween); + /* If we don't sync, these can bunch up */ + XSync(dpy, 0); + usleep(udelay); + } +} + +static void +pedal (dpy, window) + Display *dpy; + Window window; +/* + * Since the XFillPolygon doesn't require that the last + * point == first point, the number of points is the same + * as the number of lines. We just let XFillPolygon supply + * the line from the last point to the first point. + * + */ +{ + int numpoints; + + numpoints = compute_pedal(points, maxlines); + + /* Fade out, make foreground the same as background */ + if (fade_p) + fade_foreground (dpy, cmap, foreground, background, 32); + + /* Clear the window of previous garbage */ + XClearWindow (dpy, window); + + XFillPolygon ( + dpy, + window, + gc, + points, + numpoints, + Complex, + CoordModeOrigin); + + /* Pick a new foreground color (added by jwz) */ + if (! mono_p) + { + XColor color; + hsv_to_rgb (random()%360, 1.0, 1.0, + &color.red, &color.green, &color.blue); + XSync(dpy, 0); + if (fade_p) + { + foreground.red = color.red; + foreground.green = color.green; + foreground.blue = color.blue; + XStoreColor (dpy, cmap, &foreground); + } + else if (XAllocColor (dpy, cmap, &color)) + { + XSetForeground (dpy, gc, color.pixel); + XFreeColors (dpy, cmap, &foreground.pixel, 1, 0); + foreground.red = color.red; + foreground.green = color.green; + foreground.blue = color.blue; + foreground.pixel = color.pixel; + } + XSync(dpy, 0); + } + + /* Fade in by bringing the foreground back from background */ + if (fade_p) + fade_foreground (dpy, cmap, background, foreground, 32); +} + + +char *progclass = "Pedal"; + +/* + * If we are trying to save the screen, the background + * should be dark. + */ +char *defaults [] = { + "Pedal.background: black", /* to placate SGI */ + "Pedal.foreground: white", + "*delay: 5", + "*fadedelay: 200000", + "*maxlines: 1000", + 0 +}; + +XrmOptionDescRec options [] = { + { "-delay", ".delay", XrmoptionSepArg, 0 }, + { "-fadedelay", ".fadedelay", XrmoptionSepArg, 0 }, + { "-maxlines", ".maxlines", XrmoptionSepArg, 0 }, + { "-foreground", ".foreground", XrmoptionSepArg, 0 }, + { "-background", ".background", XrmoptionSepArg, 0 }, +}; + +int options_size = (sizeof (options) / sizeof (options[0])); + +void +screenhack (dpy, window) + Display *dpy; + Window window; +{ + init_pedal (dpy, window); + for (;;) { + pedal (dpy, window); + XSync(dpy, 0); + if (delay) sleep (delay); + } +} diff --git a/hacks/pedal.exe_axp b/hacks/pedal.exe_axp new file mode 100755 index 0000000000000000000000000000000000000000..7135536d08b74be1f5026a29dada7ca5771ffc09 GIT binary patch literal 33280 zcmeHwe|%KcnfJMqn=lhXoP>b{1-VQBQ-wGnXhhMQA24G?4GdWif-8WrrrCqgyM$NWa8`}t}4b1!fo^$U^ zGGg1$`|iH){;^kY&N3f4JrFP?(l z{^6SWb$aDPockb#B#GHBIWbkWC(q_a^y~RL~Z5v<$Q@nG24S z+DWVEb*c{WcYL30myX`nRIHM%SjSuT^>d|vHcYgUIrLS2+p5p%Yd%}3E72}Rz*1yi zcT}vEef=qV{Znz+4{wv*O8aJJ9N(HlY(y5d#0lvJ%>QBrZo8pVsk zR)7E0KK~2vKaT_+@s$f<2(h15hAS-p3NfY;3STR|tOZ2U?@i>HtEyVN;kK&vYwozC zLROfwC)P*jOe}}S**I$+@nL=$SRXJKd71LB5cf(b-J^1T!>~hMLHHV8-I`2$d7wHnr4kYiZimSZmj)w11p0C8VaQrM9l6q-jS}i$vJn(7LO7$1SA_8{@SdxCLlv zY;CLFu|qc4S>0@-iE?W_Gji29+)l+{^Ncu(%-r%B?QN|7tL&Ug`{zt7r@LGRAqD9Q zZroVivh607=ihMha(!i@j=5-3{m!PwrtuiYrQ=INoXS$;sHxtveY`x2o0@jiRX0vV zM#*`p8vns`)h-%eB^7G_%85-L@wH1!>(f=cVbx5G-6xERn5xul>DR6c%~I{6F4eHl z>aRG7UmHJ|H2&mXTAG^Lh#R!@S)OUPRB5+Ge}SRO?kgtN&udlX+NQ>~5=f|JLqlV2 z)7=TAsfjFe#)66E`Xy>S!AsP5hLh?;N%K!6=_~A2?aMP%`}IloJh3;}OTNMnO;-5z z7Q!Pw!G{sNQszzTD(`_n1za=MozFKG^dbyob zX|n%(E;#wbc#P(p@g*V3ll)yUX+3f;RDAVMQSwh-CqhZ|lKsfm>e{;6x*gT`Slyb& z#QsIn`qq7!>aW@IhmZJ9NlA3L6viU2=zGwUe`*KpV-PXEiVmar9ZH>V+oFor> zkHR`$(WH8Ny|Dd!vV6@Xe{1_=MNNo~r20pE`H~a&Y)cOoqHT}ee!Hbg&8e0`EO7FA zWh^u1E#77Qowp_4*qApF$TF*wF>Qa?F-P%3cgf3^mtn|a{Ew}Vpyk)cRm-ehpZ}Tl zK*RsG9hD1p+4@YLKmBtp1S{!F(ogbyu>H%ynQAGTWcz zFCOtJ|9^VE!Vg;bGbMLe7n1P%<|GI*_lVDwn8R17_RUtc-QKRZ*WsX5Z_BSw9)MUt zBsTy3^CrsM)@N-)OWl^XE%A7ETTAslty`*hNFkxU;cK6_qdlP!$}fREejclNfM~a^ zVGF4!9+KxvhezSr^VatNVLJ}7Shx90wkNAPo+QsV)qjG+nz~jQpViiFt=_dmW@TGr z-VS9raY`y<7!v`_t#!LU*&mRF%E6WE<0@!X3P9-CR0!PNF^hELU(Ta{z7l~q6z zN@QiuwwHd3uHEk5q;|$MP2wlpN3#`23|n!aq0kb&7>O)%2|IPm9_)C`9*^x`hAq0c z7lrmo3L0wIUL`WmKeqhrI7wLh)R5KQ9-kf8n^sHPzM^w2fSp{chtp|&5 zo2;3nk8qOwf{9}}*<_)$0V}Xl&M#Ihyj$&~Z1_sczb~{lumx6XKF1U%30v%*MJlIL+p|f-Oxu zl|UC-8-IIT1)p&cP>^(ha3#mF%;mDzqbs-7HSMfxYqW>}2QYh7mSYQ&n*w5_qBwXW7^l8A^@Bt}6} zd0}E`sy?Y~krkBh&W6TaZFQ~2O~%seDM!lIKA&NIE2Q68``Pskjk~LNG}Ibx4Lj@5 zzOAkWWuvvZZcD?~hAmisn-Vk=ai$7H?GTjxY-!rHqqgyiHUkG#O=wpK2v#QOHKA6C zS52hm>Xz0|W3YZ+tFd!eYnxG1XH*+ocQjSEEif9J+5oplCFHor<26dgv2#g6O`=z$ zj*XI#Y+)iLeq)oNtlVhYYHZn2-P)SydSdjap- z#qCBuc(1K%ZmXvhYZn+>aF&PcHMQ~(VjMp=7>q!6wL+A&b;fdIUagWP``J?6NU=b< za42n{x1+6EDG}=@F2mw3^$T{x zJ1#O7U4Q+Ot9^x6FJ5XaUcAh=WZB{+2Ard@qP^LOuUbKz4>sf8kNY6*Zrr>&K=+_U zJB;)g?ry96Jkmbgr>t^6(tNZlwA!9VIf}a+WwmN0#PWa2XM)1S+}7WQepU29TIo+V zzxG)6jWvfCKm1l!)hB1p2Qu?MaescWW$Q;*96Y<=tM^=1^_^`$UwrbbH5uPN^qXh? z%zHBXjgnI*mtWto=SZO9_^GMi>YMNEdiK@TzZm#$g{yC^yY}&y|GD~yH}3rD-q2rs z>xtSOp1dnhe&OM@r=B}__RlA6EIoadYu3iq_p}tJ{$SOHNqb|)di2!qzVf$M$Ljv2>++ob^WQx4=G8Cs`Eq|+6}T{es`2|K1-(eZD9@nk!}*LR{YK7Rzzqa}%D5zUB3a znxk&<_KBbG+PEF?Nd1MHJm5tx)y&rhFBBhj>rwykg_@%?mPGxF)@|H=xqjYnh)qZH z#imZ5IC<0*Z|7;DPqxq2WBwre$wo>(X0%29<=~|fyadJG-g@z5Z?pJ*Z@YNAHzY3f z?iZII?-<8piardw4|Mi}h7Y`&!s{&rZ<8cFJ?v!a43-uPF`$d5!%mSGcI)r?buqX5 zrM(-sH=_;mku>nzj&=dD$!m%|pm7LeJn1FwjMt<7?t3?Ghr=H5iRIzLDQ8ON3uB-V zk!eGgqVX6dv153*c74M%fU}2_;3jGeYf~c$=W+MB1Wt2rY_2%3ti~pO6Vgf z_H@>ZL!HgyWM{j0t1~3dckUOnj&wjz;cdFaSxuK_A=*fVd@}Vam z^i-HMkEDLulzyNa*xY95W-oN}%ge_?18%V>^4-+M#du?;)b<g?+t5j_a4(O^mc2PAAerE>3E;E`S>Yq@9}=^$>XQB z?;nq9Zyz7jCi*%9a!AoX^1H>X9sz&mgWb9+-tia3s$RpqiG(2w=*U2%8gYtQn9q9H zjd@M^OoM!mK`zRlUfw$y<8q1%m?IaSI~UxzJ&m>L&kF~<>I3}b#2 zA93p+_#bQ8xV>9=JDY(=TWSYRws@}uZ)9|5iNO-$Q2sBqZQLFNPCe==^Mk_C)o~B~ z@T~BR$D^1#-mYQPUy#qK(j&JEF(^a;cDE&x3;m9wT|M+b9O?x-!3f(BUIVx;YQxux z;7|(2pyrbv&U!uS@5A^dzMf*@;6E%x=1o*Ha!#VWIg!3Uh??z zVb(owwI^Q%i~5R)lj&?+fhhC6t0msP!;^i%q7-+H`HX8v(T`$Jeav=+phrI0j&0@w zH-z!Imqh*hr5>aH2iIr=Ui90|o7-dtx*-t%b3Ha)rto0!twAspU)Vq2K-1LDhJ z*3tHD|HL*W@Kq`LgJwQ_*i78#V_S?+VX&0#!=U5B+LJAe_h=WP^EG)lT&Q}D>k`+a z4Ai-?Hc-z`?cBKC0Pp$W7jp;e%m@A~$c-|)Yvac46=Kujhpf5Ralz~Dch%$twPJ}! zKS#X3Ni$zFHLiKll7Loo^oLp=>fiTs{pH$2`#D;)al1XQ?Y>XdY}{TcwjO4mLGjAr zZ1~^~@WM9vV*6pXI|#nA^bh@$oqth!qX@qDoi8Z)rDF`iNi})LAj3-ND;qSX>c5nI z-IQv+MtM!Pa6%V=1K!8uEVXbtG)LE8ixTgf;!yX~;z93#*!0~@v^$OYO1`3EQxDe; zfpJq0gW^!nhm*|LnzcyR5|L*#UnoAhL2NOG#H{Yqn71Qh&v&Py-LP2R%{5+#b&+Yk zum`cH8>f4);dznv3pGc_#9QC}KE^_wP;S(VEth4`NgDbzEV*}sf9iY~V;~Rt&~G;U zSEcAWOnH${TTc1nwumkBTF@8J3uWbmUX*S>gkB)0wy6IJ_z?P4+S&oJ?XYcM%C@!? z`9#U#Vem)3M!_HB688T+*mY1meE76*cqwPvDfwfa2HvI#F+w>4=v@o_8O?}kqyZ_$jJJU7R)BMI#O%$r2V7MiWKuTu9fZD zrlTPZ>k4r9YkN97v_qW-wUeD;?XAvZ+WF3IZPtK?7aQ%D6rHn_pZpwHR>jq;|ICeWG#ri5^(jLaIvk+@4Tl?d2Y5Jf2 z|A|ZMZ~ym;OaE@w|6N>~3%$=mteK;Kf_cb2#-5|ou#UgBXXEziuv^4a@6(Q0=hi<) zY<(6!YY*ng$NpD=3a!Rc5wWV?KJFS@wVc2jO24)9-6_!8agw_DR2^;zHIh`p7V6Vm!om4hxg` zpIan~wgI2GoCn+=X6gUx&$jT=eF~55H(dnJ2|O2Y-0+98oj!>DX-(b}kR{iS(b!eS z8?l=Q-TJRkKkP3P#`}oTj^`~B#j~70U<`f0El&0_?-qLwyqNROhFo!8ma#WG@KVmZ z8(z*C*g&4Ai9cUe4nA|lKC=?MP7}wAo#NyPMQ0Z1oR@jGSbm@{C%WNgQx9`jL6Wb)5@D->?w#3tCdT0uHg&yV^0oEK6U!60n=D62adH@mN7W z{PeDrse#k<)8Y}c!toez2K^rWuYmX1P16yhWe(X?L`L0ommv zCifv8FGM_UVxJMfKBFA_!Ak50gJSuSda>z9v)FSa1bOa<96KPpgW}|Yuz2ghF>(Gt zJ7V~5%WgIB`8O8|rr6WDp( z3oAx2Ex%j{TQy;;0oZCec&~)52H}_M;g_4?m)qf&;fs&M7vt>e$>Z?F$Ki{Q!xta# z9%s{t=}*v}eZnE_8T;ZBj2o~wK9PZRrU-UTLF$7qx&&#TI0-v1K8mw~u4~R#m%*={ z$nu3vAw&f6K5XmIiDif-Nd{cy zUrp~S`}64!mtB*(y*O9w>G@o$v$!DjZ;IIm_juUr;=JoU@T2sY2imL?da#JF-BU%t zt^XTr<30aOt8VGnpDJUWTmLou(214PgjvLT59+~Zk%{(8b0XmVP>-=&1OmY2oIr@Q zGGm;rb>77|mVCVHuLq7D-+l->w0p+Ary2Ldu6S1V4C4M=%%8(k-ZQ6&Zx>x6{){^b;VzCJd+&igvZig%fS5|D|US zm+`FePOOPszqoc0U;31asQ)tfe*ANp2xU$<&o@}7iQ40M(JooJV0pe)l<|{(jL+JXKS7qsIHfO+JWMZF% zb=RAA`ueo*59 ztm(+(tUaxVvLHW{hb@c6l3rKX4SN7hsec3Z;l$FA3wy|iUBCu#u1q_bAE8aqHeQE4 z(eB}6j=~qf_V!?%KZJGuWTy$c55VrrVb}0m@pJh;%dQjg?fA3aggw)KO=}Gf!gi;i zud&z>gFMi_OxWnPu*qilZYf{*ZF@WyzC;^KmFLy4rK979uos0#7s56O=b3U98M+gg{E@aaI+@`b6qJzF8#3!8icK}ZNz!`YN(3g8@ACNul zY!BwdAusJCA2DGLYz)3T90V@?S3U6DzM%O+)5h%{te>>c6s)Z{GmYD4mN-*FTfDr1 z=YE^Q0=#?A76lx7jVXk8L6PtVklv^M7`uYdm9j2hI&hcP;4)qX03A@nd0>&0tI-f(4ogd8g@T z{F=`&*Iv?A_E^rgvJ=Q#Ai3VZFn%gW-~X=xPacMVsjW4_*-*IEX$uHrR@?KiCUn zHxuW20FjYMlG*ah79z9A`hqMY}nTXCzTM)}ly1#s-%p$I5fBuVb8~$#Ie<$9c0F zXO*0De_)*5*1VfIPJ3TJUax#!^BX_+h4eAH{#$<#WB+d$dn(3$4Sc^3KB5qQL;4o* zLcg1>zbAG4WB3T{9Y(q_o38A7y|Cv4q*c-%E*y`R;%&asKhF7qWv* zdD)J>fqguxf336~ZL{&r*tRF?b*a^se!@Uo2ljWQfmrM%#5T|3S*`RFlMy50xn@^) ztfq_YC?6B_g~*1@tc?WFhY8tCg^j&}^&ig;jU{MHn#70C41;c%_HKx`!aa|D*>nr@ zY$V?Z6A$^(VD^ z`7_$Vx5h8}N5)ZXfAPJQ;$ffgh54?*0pSk2t#hC(%tQK$;osNf+5RF0=b4R=9iQQZ zV7quOU7*3o^$V>GuRgyIe}=fF+PmhGwPlay_{(~)4-~sZ=xooXTZ<>*JpdtIK)muo z*?QcJS?<=(l)=ZW1pFq(Ihyn4Qux%XPa_r?!g~gkJ?E<%eO!qBz_|bJjoa_E=5o-2 z-wT+A`BWk8AJ0Q^4nzD@$ZZ$uI8Sf0?3eWDD`Y+7veT+xF|NMbZV$Vyv+9?RtM9Pu zq0dcL{nByuVVizi)W6QEUpTHlWVi2)`fs!9=UMep_;vb?LHKp9BlKtFm2+r5o?qF1 z=R9PQi#Eg$gWkpPFHOSF0RAY}tf`=fx!FmY%BQTxyB2CKv;E3<5u?Y@2V-yc&$yfG z%$;~vr-@WUhfJ>oJ?ezzE1(mHm}jI4V}$dBdzb~ne9dc(D+P6&TT`rhH|n23J!4_^ zoeO%Su}G&6?;$b96Jmwshx7>fCQY7saPC%G?J$ z$;Uf1oMRW?yCv2z?$@%=j`QV@?b&qEfp=zx{p5|lVlnt)EWv#wWhVIr{7Jxv@g4!} za8O_jv+eP;MP<9W)_8C>CuPU}N$+wCKGlZzDtN91pJKz8D0sF7pJc-=AC_UkIY(?c zC|{HOK1?Epw9jKMaxNE-mGMqb*udVVAH2@SJ8O3QWXH#dJ=8g8#TjY8m3M92&Nvfx z5Y9t9&HXE%Nlp{SP=?sTXRB2e4n8w^Em9#KFZSqdW`-DvJnuRS-yzOTcfPTbdmoRu z=4nGb9_gL3q~vRQ2hP5uFY$SW8w~t|ODoP7t=@l&Rh?T6TC2sPV$S(2{flNkY{4zw zEfL~tVcK$Z1?Cg<#P)VfT?ij+!iNVEXIe+c@8=oc&^AoOHUY#o<%n%65!;N9X9^(` z%BBNy`59zCj5#W0f%#l0&!G3n_b{^BqEaq6m&UXAcl|t1p?o-}CqX`((?UFmbB}jR z$ZzjO_yw;=1K_tD{8nOZOkNMEN4EVm&xtjWHcT1O@9)Drp`6I?w`(_U?*}i`=V|GW z_ISao(y7J!yPsD)V=p?=0o;R(N1@Z5B^$T*p`3x3ll-3|9DG1F-49?Kkb|6$6Zub^ zo&2eM56klq#rG)AM96mte1{1K-`I1*kA9l(^+Rd)q0x}*0Ij^W53C@)?R1bSZB*%JE05I%Yc9X1;q!)7r^*@gwvh? zzu5TpV0>JobrBk&j3^t9ZxY65z*oA39yWy+e!MgiM7&4eFoS*xv2uzKXYp>TSHm93 z1DNL^VWG2lUJ2O8e#T1E5&x!OE|!aT06XVT2Q0T;wmpZKIZxAn=Z7zRDJW|4#Pg!G zSrh~Id;bgirKQc%F7`#ZPcTGhWGc>KAd^TtY-B3-{szXDk8!!hfVBIwrRurvL|d6? z>ru{2j4$E0m3`}oYxZMJm@Ui?ulb@`d_c^J9G=or44*UL5y1~Nr*Gv<gF}paoF)?4=z|937?Sk)znkXCA zd<_t8+5Oicf9U5A&R09&G{g;^M(S`$pVPfEU)-=y=|x)=nw}b%lNv2~!6{b4FPn>V z<^<-PGXh`K78Pq^u{lRugj*}-yU~|Bf8lqE%jI+7phv6tRcdrYdfKn55YvB?bx0#_ z@%e`k&z@j8SKM@f&yNk@YB)2$%44oGJ;wT5Jy)$akYD6kz3xiSt$>;9S9?~kFY}bG zPr+U&LtnIcvR=07QrIc}q2@{r&zfQTBa?aVjyl@DR!R7x&3H~|!OJ#f0-n{b;COy{ zb~4&I0dpS&3^8yz+S~bT)J;Zv4gF*Qo+~cfSL87&ZuJDgPiWnl)H54?mHMj|!*k@KbVUp08$XcG zmpxbiE*-Se6)g?46nxr(GwIXH%ydOZ10BMt=fT(w`}ocfbSL#f9lFI$G7p`7r4P^f z6FS@bl~;3qxqzU7WMy|=l*qghF7&J_3)-C`u0r=JUh@P^pi}$7#s7vt;zEj>#XOzXXl`gM$du@ z>W_ZTExzUv9`q`z79)e(ak-|0^Mm|CPOmG1rm&$jFaX#`k&POir zd_=}pOFUm$ztr>X^;{pYrpp+U|AxS)Z7GIdKAHypaK_QgvnBg|3d*+46I#E^6JDQ* z_o%Z)Xs8^|8dGu3JgFm8JjK%s+0>bto}aAqlt;~J9Z|do@-E&X{J_5-aY~l{cboVQ zcDDXcn$Hk@`FMo!_l2cg!{y zh?wQ?U zj)8F?))NMwOL9Lw@!4b|mI7~h?ljAbeMcvB*2Q>9;GN+@u?Aya-kX8*hg(Gu@4r9L zSq`1zS;^5XF;Mc&){Wb#t63sEY={@p7U!n0@n+$Lta^77whEQ$L6I)HTpuq^leCi%e`hnF-B@Yo8z z(!keDygNf0&Dd*^p5lq;mn$S+q&?T-Ny&#i>yjtF4?oM|i7@r=G}QRmZo0)2pFfi? zt~zB*um3EoW(altVe0O(B!_G|JH`j zFm&-noOhOk@6|nHvDYHkZ_vt?Jtv@x)~B0O+{K&|*KK&AtneFsWxG>;T6~>0T712> ztmInlY_VI+C?1Wy)1_nY=JAD4?k_gQi(QwA=8~~k>$9)MmKeXpyJ-T?A?c4WcRLZ1 ztu)SRSkF>c8Z-`r3qd)V@?Q=Z)a4@NGxeId+xI(UzjEW{M7niGTOfZCXA~jJu>> z4q_%13r!PlAMRj9>=YV2Ybe!X)yk!9LT@TEBzVg0{t+~ z@N662|KYy_A|InMJ>o_@jdn7>QC_RC&GBIS)RE@zgq&I zXnvw$?|3b6aHcgs7Q4?o6YtIR{pL9EPxf2}_%}ste(3Axut&LWRj%N_S!y?9v77T| zisjF0A`kX>rUd8j-8?(r7Mnf45unnF? z@L8UES1aUK|87Hj{Tu129I(wr3;=aL+ zwUai)cTRC$_G}H-chUs!sGE3R>@E~59n>Y-(sww;N6%6p8BB5OxCsaE|8@NbN}wW% zcBNH5hO`g22_@Cz#xuo>UMYZL?ucW+>9|^mVF3Dl@X9)j4rL^QIAPQeqmb)TX$T)O zVL6QNE;6+*(n`bqybZ8Y!g+N7m%Ok%jN3q_ANMeC^kJa0X54+a=b#=S0d_<=?jY`F zroipM9mXBS?FLc^_+i}LxckwE-=G(pD)xi#bN zz#YZi4f#cJhb}?ixZQ3wW{T8@a>y!!ec=PYCT`Xt5hj4$xZNl;g9iBnE21CyAlfzK zwlA`*S|R~H&U6#k^u+hC6F`+SEr9ji=EOInlMz3oY`4E8>6_7?f&MA5-Jaim#y6|g zccVXr_1OTsz0>}7^k<`9w8n0qroJJ4QJg;nwA(xF?@9k5d%_`Sw-nD8+GWN$Q#I~6Ua;|QJI-M>PQ(K%gk{3*v>IZR!FjNl8A@{V96!AtxsUf z+?VO{oZ`F6Wy%be1IXt-wZQ0(6jc8}{Sv{Y96mo^9TJ+Dva_ybTV0j<$Wp5uGOHfs zknb##Ea@_%y$L1>(J&DHkK*T1OtCXIaFfI#bhFHjCUOo(Hwx7NJ3!$_4s964twjQV z>m)AA+wAfca?orJ5b1p?8Kz7YP$o;jb9}U&_;jxvZ5To@INE+d_<`i9>VsPK`0i6x zU43<9?T)$@Ic6eU$}zWs4>=^6IsImIXml_$pIy8Tlz12Wb*qbhi1~7M!S4t2o7!2o zRX5+>)Yh=|o~pXtb&YLR&9VblyV=1*MPdY6Mv|F9vaE=cecmQ(fNU1Y_5ngG)^}Dn zG)hW@JU~ic1*=miP-Zel#~dyS>045e$UMOe1L}OMON4>U zeAnLqnmIJ+a11$8qQLq-(b<8OajFan05XJ$LJB1OLy#C5KtbBy&_jxWe`GJjmYFfs z4{;vpt{GmsiU`g5d?6z1MSP9@5;-qH52YaFg2AX%lM1GmXcOgMWbc!*x)9NdK1!Gc_^4s7tHyfaf=pZiLC-7D6xZ}pQRD}4Q z?T%D@zi8W*TIml6FwvFkL9cMQI8kIqa{m>8G&$9g;|x~-D$3A?1 zTXx(GB~4?;{9tzL{EMivLDbEU%o5zm`;x`7LlDIF?h`T4sh62K|g$5+sx}dSYgj9ZL!q zNk$ZP_6(E}M;ghGpr14n`ov2g8ZROPF38~&*2XjEyikF3w*y`Ce_}?O zw(iPMwN5Le+}9;GP-Q59tUNey=n3;F)9soj5g1!JQbyDolM4jZkCkI6g@$wTD5lHN zKrYROBAr1vt5pS887}~%pq)oTsnp9{;JP@GuSABinA^2b=1^B4=`1D(aKe(b51>g= z6tRwQSy;{gAngsC}7>yWyUp_ zi9>~mIEdlJMKkKLMB{{LvMCyVe7`&mueBxYlOQ?&8$d7PN9aXnpa2eFH-H$j+jS4d zKsS)e0OvkHp=_0r-c3TdbYfVKpq9Zyr&>|T;@6}c{!&)3{3vpAM97Si&|`VxCJ2Rf z$YO~2|Mb9{6e~h4Vl(rEB!l9pT+UMl$=TE3ESl-#=YM z&7Qx=lAZ`yrI`@U_1^U&`kwSU`er5t`X?W!^2G39=1g|E3W(Bw@3R)!`4bjd*P0b; z?^w5{WX0N~g;s{k{5HOc-luM>YpZH)YiVfQR@GA1+O(@>OPyqc2&>3On(RgaGSXc=momZ|%QVPxFNjJheFvF~NNH$> zHKa<7M`AD=eruh-+u|Xg)|WabGD?i~Wc2UBUrKa%Y-BjI)YXUnp&=x&S(?U+U=(~f zbh@ekaVfp<4_Vpo&|c<10Aeidbe)oQui&p_IUnTXX8kyRIU&AQOaA!Hc>a!p9bQuBB)E|Mm%y5x_0N&)hmaDqsGW3b)>~!W#*QCo} zGLDgo4>j?Cy7qKsh~d=*_LHHSo5Q9d%WNqhxq z3>L!x>;j4TK@1}wq1%G{Ck~C&%ETeM>oy?5Vnldw8VAjPk(b{nBmV|=wMXsuzOJ-r|$Gx)DObaq^a}g9Qr_An!5G< z;E5d&<8pRTqXwiWWk!_aS^%_oKLNX+Lc57>pR91`yqzxr@`)LVrE2zO||3u z3EBNDvAkv81aFzP{+6}tidJ3BRff@$KV2kUrTTR5M0SWEZS1|7)=rukx%HJ97)XZe zUuR15L4rtVbZj{DM%OU0hUkw*W{T0FfheyZ!6A*kE@ubT^IPC#!8S)nr5Dv*u30ot zsS?O`A^eCOz&`$Rs@OML=34)MO#o`!4VSm)1Y7+~a*+B$?_4K;P+HO0zZ6v#pJs-H&pGDFEQ zBctC#$T)^6k+8+kVa1S~s!mteEc*N-z|zJ>hj7uxo&nG)f$~_6wegG#9$5w*h3Gxb zdHq$E2-{&`a!<`4iW$b5KShO(RoJfASf`w@Avv5Y>Wg{z^^5gzhE!8{KkvJ>wB!{nn{-hs~ zKjzX#=!$jMKS|#HaT>M|C?VxGM@p4>c`oqJK$+|Mu@ZeEp?8)~1uD=(oVx*=yJ6VI zbh={xG)z9Yb8We2%Z|FL`dwC32=GGkb(;NPxTncll)YrAM3y*T0qn>5043o=t9W0} zqaY>mJw}I} zTnPw&955@fRju09x}&a6X_>!Q!zVee1L%A*CCN;NotcaSYM4LxvEs7FfghLSu-#j` zCC7Oa=Ckw8B0SqGz2mkdNh<9w!E%ZpcX8cQ4V%MnTJBVH8sO{6kLIw1!Hk?8GDC^V zD!J&VI50LR0dfXOo98d*#5oM2AT?bH4yD`U59b8YZ-&)x6%XEI*R0`bq6_C9YLQ?j zWk4D>RM1JGOe4t7IHc|8+8~)>d@>yn9z+vwhJ$McAw1%wWz1wPCk-;hMl#0Zky#v! zOwz!`keb0ez?6(&wjqO|SkDmS0~}gv4e$UIPM4bW0CwH&w^UYD+;ZEeP7Ag%rj&W>~XXX2_t-a3icB94XdF9LOQTrf66#gE|Prx$Hne zsv!(DNcD#S$#+Bjm`DxmT0Q6^SRO0&pj-V-EU%C@o^?slxm~XUDrX2XaCi(0F^~8( z7VP{CmB{PNpP7LJA}YY+`T$uTV5){6qQq7I*E6IeM(k{agAEx|q2|lu$2+&s8t*Y^MK1gNeWYPXddm9S)>c(;yj4YOE2OAd zRX|Z^qK`BV7%VWKPTQ6l8zO6Ql1h)Z3eDmIZnrxO*aGGcG(|bTpxSW)CRlF2=A(m2 zw8AUp$dI`T2Mb*FNStVHKAy(*R6Kz~FK(&9d;n-?f8fGD`UEbo6fqO;5_Le&4?qxn z*d5lHI{17Xmo7Z`+lQ3ksFm_J7+EHrI=m=^SCX)kfMMWeApYJ1*DpS33S&legOXAn|v{YEZ{T zqz~yZT5_z-`0GY0@Q-d-9>!m$7cLXxLC|2Ho^62qL9NXw3ykqiBq7vN-uKT^@6ZvK Z^Y?l5$Jrf4F$!GL?*Q&hr2kRZ{{}LL8wvmb literal 0 HcmV?d00001 diff --git a/hacks/pedal.exe_vax b/hacks/pedal.exe_vax new file mode 100755 index 0000000000000000000000000000000000000000..90777b04ecd38783f6a6197b334452481ecb0ebc GIT binary patch literal 17408 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, 24-Jun-1994. diff --git a/hacks/pedal.man b/hacks/pedal.man new file mode 100755 index 00000000..7a0c3e5b --- /dev/null +++ b/hacks/pedal.man @@ -0,0 +1,62 @@ +.TH XScreenSaver 1 "24-Jun-94" "X Version 11" +.SH NAME +pedal - pretty geometric picture program +.SH SYNOPSIS +.B pedal +[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP] [\-background \fIcolor\fP] [\-window] [\-root] [\-delay \fIseconds\fP] [-maxlines \fInumber\fP] [-fadedelay \fIuseconds\fP] [-mono] [\-install] [\-visual \fIvisual\fP] +.SH DESCRIPTION +The \fIpedal\fP program displays pretty geometric pictures. +.SH OPTIONS +.I pedal +accepts the following options: +.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 \-foreground \fIcolor\fP +The color for the foreground. Default is white. +.TP 8 +.B \-background \fIcolor\fP +The color for the background. Default is black. +.TP 8 +.B \-delay \fIseconds\fP +The number of seconds to pause between each picture. +.TP 8 +.B \-maxlines \fInumber\fP +The maximum number of lines in the drawing. Good values are +between 20 and 2000. Maximum value is 16K. +.TP 8 +.B \-fadedelay \fImicroseconds\fP +The number of micro seconds to take when fading in and out. +.TP 8 +.B \-mono +Don't do fading. Pretend we're on a monochrome display. +.PP +To make your X server grunt under load, and to impress your +friends, try \fIpedal -mono -delay 0 -maxlines 100\fp. +.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. +.SH SEE ALSO +.BR X (1), +.BR xscreensaver (1) +.SH COPYRIGHT +Copyright \(co 1994, by Carnegie Mellon University. Permission to use, +copy, modify, distribute, and sell this software and its documentation +for any purpose is hereby granted without fee, provided fnord 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 fnord this software +for any purpose. It is provided "as is" without express or implied +warranty. +.SH AUTHOR +Dale Moore , 24-Jun-1994. diff --git a/hacks/pyro.c b/hacks/pyro.c new file mode 100755 index 00000000..996f7833 --- /dev/null +++ b/hacks/pyro.c @@ -0,0 +1,258 @@ +/* xscreensaver, Copyright (c) 1992, 1994 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. + */ + +/* Draw some fireworks. Inspired from TI Explorer Lisp code by + John S. Pezaris + */ + +#include "screenhack.h" + +struct projectile { + int x, y; /* position */ + int dx, dy; /* velocity */ + int decay; + int size; + int fuse; + Bool primary; + Bool dead; + XColor color; + struct projectile *next_free; +}; + +static struct projectile *projectiles, *free_projectiles; + +static struct projectile * +get_projectile () +{ + struct projectile *p; + if (free_projectiles) + { + p = free_projectiles; + free_projectiles = p->next_free; + p->next_free = 0; + p->dead = False; + return p; + } + else + return 0; +} + +static void +free_projectile (p) + struct projectile *p; +{ + p->next_free = free_projectiles; + free_projectiles = p; + p->dead = True; +} + +static void +launch (xlim, ylim, g, dpy, cmap) + int xlim, ylim, g; + Display *dpy; + Colormap cmap; +{ + struct projectile *p = get_projectile (); + int x, dx, xxx; + if (! p) return; + + do { + x = (random () % xlim); + dx = 30000 - (random () % 60000); + xxx = x + (dx * 200); + } while (xxx <= 0 || xxx >= xlim); + + p->x = x; + p->y = ylim; + p->dx = dx; + p->size = 8000; + p->decay = 0; + p->dy = (random () % 4000) - 13000; + p->fuse = ((((random () % 500) + 500) * abs (p->dy / g)) / 1000); + p->primary = True; + + if (! mono_p) + { + hsv_to_rgb (random () % 360, 1.0, 1.0, + &p->color.red, &p->color.green, &p->color.blue); + p->color.flags = DoRed | DoGreen | DoBlue; + if (!XAllocColor (dpy, cmap, &p->color)) + { + p->color.pixel = WhitePixel (dpy, DefaultScreen (dpy)); + p->color.red = p->color.green = p->color.blue = 0; + } + } +} + +static struct projectile * +shrapnel (parent, dpy, cmap) + struct projectile *parent; + Display *dpy; + Colormap cmap; +{ + struct projectile *p = get_projectile (); + if (! p) return 0; + p->x = parent->x; + p->y = parent->y; + p->dx = (random () % 5000) - 2500 + parent->dx; + p->dy = (random () % 5000) - 2500 + parent->dy; + p->decay = (random () % 50) - 60; + p->size = (parent->size * 2) / 3; + p->fuse = 0; + p->primary = False; + + p->color = parent->color; + if (! mono_p) + XAllocColor (dpy, cmap, &p->color); /* dup the lock */ + + return p; +} + +static GC draw_gc, erase_gc; +static unsigned int default_fg_pixel; + +static int how_many, frequency, scatter; + +static Colormap +init_pyro (dpy, window) + Display *dpy; + Window window; +{ + int i; + Colormap cmap; + XGCValues gcv; + XWindowAttributes xgwa; + XGetWindowAttributes (dpy, window, &xgwa); + cmap = xgwa.colormap; + how_many = get_integer_resource ("count", "Integer"); + frequency = get_integer_resource ("frequency", "Integer"); + scatter = get_integer_resource ("scatter", "Integer"); + if (how_many <= 0) how_many = 100; + if (frequency <= 0) frequency = 30; + if (scatter <= 0) scatter = 20; + projectiles = 0; + free_projectiles = 0; + projectiles = (struct projectile *) + calloc (how_many, sizeof (struct projectile)); + for (i = 0; i < how_many; i++) + free_projectile (&projectiles [i]); + gcv.foreground = default_fg_pixel = + get_pixel_resource ("foreground", "Foreground", dpy, cmap); + draw_gc = XCreateGC (dpy, window, GCForeground, &gcv); + gcv.foreground = get_pixel_resource ("background", "Background", dpy, cmap); + erase_gc = XCreateGC (dpy, window, GCForeground, &gcv); + XClearWindow (dpy, window); + return cmap; +} + +static void +pyro (dpy, window, cmap) + Display *dpy; + Window window; + Colormap cmap; +{ + XWindowAttributes xgwa; + static int xlim, ylim, real_xlim, real_ylim; + int g = 100; + int i; + + if ((random () % frequency) == 0) + { + XGetWindowAttributes (dpy, window, &xgwa); + real_xlim = xgwa.width; + real_ylim = xgwa.height; + xlim = real_xlim * 1000; + ylim = real_ylim * 1000; + launch (xlim, ylim, g, dpy, cmap); + } + + XSync (dpy, True); + usleep (10000); + + for (i = 0; i < how_many; i++) + { + struct projectile *p = &projectiles [i]; + int old_x, old_y, old_size; + int size, x, y; + if (p->dead) continue; + old_x = p->x >> 10; + old_y = p->y >> 10; + old_size = p->size >> 10; + size = (p->size += p->decay) >> 10; + x = (p->x += p->dx) >> 10; + y = (p->y += p->dy) >> 10; + p->dy += (p->size >> 6); + if (p->primary) p->fuse--; + + /* erase old one */ + XFillRectangle (dpy, window, erase_gc, old_x, old_y, + old_size, old_size); + + if ((p->primary ? (p->fuse > 0) : (p->size > 0)) && + x < real_xlim && + y < real_ylim && + x > 0 && + y > 0) + { + if (mono_p || p->primary) + XSetForeground (dpy, draw_gc, default_fg_pixel); + else + XSetForeground (dpy, draw_gc, p->color.pixel); + + if /*(p->primary)*/ (size > 2) + XFillArc (dpy, window, draw_gc, x, y, size, size, 0, 360*64); + else + XFillRectangle (dpy, window, draw_gc, x, y, size, size); + } + else + { + free_projectile (p); + if (! mono_p) XFreeColors (dpy, cmap, &p->color.pixel, 1, 0); + } + + if (p->primary && p->fuse <= 0) + { + int i = (random () % scatter) + (scatter/2); + while (i--) + shrapnel (p, dpy, cmap); + } + } +} + + +char *progclass = "Pyro"; + +char *defaults [] = { + "Pyro.background: black", /* to placate SGI */ + "Pyro.foreground: white", + "*count: 100", + "*frequency: 30", + "*scatter: 20", + "*geometry: 800x500", + 0 +}; + +XrmOptionDescRec options [] = { + { "-count", ".count", XrmoptionSepArg, 0 }, + { "-frequency", ".frequency", XrmoptionSepArg, 0 }, + { "-scatter", ".scatter", XrmoptionSepArg, 0 } +}; +int options_size = (sizeof (options) / sizeof (options[0])); + +void +screenhack (dpy, window) + Display *dpy; + Window window; +{ + Colormap cmap = init_pyro (dpy, window); + while (1) + pyro (dpy, window, cmap); +} diff --git a/hacks/pyro.exe_axp b/hacks/pyro.exe_axp new file mode 100755 index 0000000000000000000000000000000000000000..b84c16fc88f0b035200ed7352aeae6865e4de841 GIT binary patch literal 32768 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, 13-aug-92. diff --git a/hacks/pyro.man b/hacks/pyro.man new file mode 100755 index 00000000..8edb9669 --- /dev/null +++ b/hacks/pyro.man @@ -0,0 +1,60 @@ +.TH XScreenSaver 1 "13-aug-92" "X Version 11" +.SH NAME +pyro - simulate fireworks +.SH SYNOPSIS +.B pyro +[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP] [\-background \fIcolor\fP] [\-window] [\-root] [\-mono] [\-install] [\-visual \fIvisual\fP] [\-count \fIinteger\fP] [\-frequency \fIinteger\fP] [\-scatter \fIinteger\fP] +.SH DESCRIPTION +The \fIpyro\fP program simulates fireworks, in a way similar to a Macintosh +program of the same name. +.SH OPTIONS +.I pyro +accepts the following options: +.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 \-mono +If on a color display, pretend we're on a monochrome display. +.TP 8 +.B \-install +Install a private colormap for the window. +.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 \-count \fIinteger\fP +How many particles should be allowed on the screen at once. Default 100. +.TP 8 +.B \-frequency \fIinteger\fP +How often new missiles should launch. Default 30. +.TP 8 +.B \-scatter \fIinteger\fP +How many particles should appear when a missile explodes. Default 20. +The actual number used is between \fIN\fP and \fIN+(N/2)\fP. +.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. +.SH SEE ALSO +.BR X (1), +.BR xscreensaver (1) +.SH COPYRIGHT +Copyright \(co 1992 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 , 13-aug-92. diff --git a/hacks/qix.c b/hacks/qix.c new file mode 100755 index 00000000..c26e7367 --- /dev/null +++ b/hacks/qix.c @@ -0,0 +1,514 @@ +/* xscreensaver, Copyright (c) 1992, 1995 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. + */ + +#include "screenhack.h" +#include + +struct qpoint { + int x, y; + int dx, dy; +}; + +struct qline { + struct qpoint p1, p2; + XColor color; + Bool dead; +}; + +struct qix { + int id; + int fp; + int nlines; + struct qline *lines; +}; + +static GC draw_gc, erase_gc; +static unsigned int default_fg_pixel; +static int maxx, maxy, max_spread, max_size, color_shift; +static Bool random_p, solid_p, xor_p, transparent_p; +static int delay; +static int count; +static Colormap cmap; +static unsigned long base_pixel; + +static GC *gcs[2]; + +static void +get_geom (dpy, window) + Display *dpy; + Window window; +{ + XWindowAttributes xgwa; + XGetWindowAttributes (dpy, window, &xgwa); + maxx = xgwa.width; + maxy = xgwa.height; +} + +static struct qix * +init_one_qix (dpy, window, nlines) + Display *dpy; + Window window; + int nlines; +{ + int i; + struct qix *qix = (struct qix *) calloc (1, sizeof (struct qix)); + qix->nlines = nlines; + qix->lines = (struct qline *) calloc (qix->nlines, sizeof (struct qline)); + + if (!mono_p && !transparent_p) + { + hsv_to_rgb (random () % 360, frand (1.0), frand (0.5) + 0.5, + &qix->lines[0].color.red, &qix->lines[0].color.green, + &qix->lines[0].color.blue); + if (!XAllocColor (dpy, cmap, &qix->lines[0].color)) + { + qix->lines[0].color.pixel = default_fg_pixel; + XQueryColor (dpy, cmap, &qix->lines[0].color); + if (!XAllocColor (dpy, cmap, &qix->lines[0].color)) + abort (); + } + } + qix->lines[0].p1.x = random () % maxx; + qix->lines[0].p1.y = random () % maxy; + if (max_size == 0) + { + qix->lines[0].p2.x = random () % maxx; + qix->lines[0].p2.y = random () % maxy; + } + else + { + qix->lines[0].p2.x = qix->lines[0].p1.x + (random () % (max_size/2)); + qix->lines[0].p2.y = qix->lines[0].p1.y + (random () % (max_size/2)); + if (qix->lines[0].p2.x > maxx) qix->lines[0].p2.x = maxx; + if (qix->lines[0].p2.y > maxy) qix->lines[0].p2.y = maxy; + } + qix->lines[0].p1.dx = (random () % (max_spread + 1)) - (max_spread / 2); + qix->lines[0].p1.dy = (random () % (max_spread + 1)) - (max_spread / 2); + qix->lines[0].p2.dx = (random () % (max_spread + 1)) - (max_spread / 2); + qix->lines[0].p2.dy = (random () % (max_spread + 1)) - (max_spread / 2); + qix->lines[0].dead = True; + for (i = 1; i < qix->nlines; i++) + { + qix->lines[i] = qix->lines[0]; + if (!mono_p && !transparent_p) + if (!XAllocColor (dpy, cmap, &qix->lines[i].color)) + abort (); + } + return qix; +} + +/* I don't believe this fucking language doesn't have builtin exponentiation. + I further can't believe that the fucking ^ character means fucking XOR!! */ +static int i_exp(i,j) + int i, j; +{ + int k = 1; + while (j--) k *= i; + return k; +} + + +static void +merge_colors (argc, argv, into_color, mask, increment_p) + int argc; + XColor **argv; + XColor *into_color; + int mask; + Bool increment_p; +{ + int j; + *into_color = *argv [0]; + into_color->pixel |= mask; +#define SHORT_INC(x,y) (x = ((((x)+(y)) > 0xFFFF) ? 0xFFFF : ((x)+(y)))) +#define SHORT_DEC(x,y) (x = ((((x)-(y)) < 0) ? 0 : ((x)-(y)))) + for (j = 1; j < argc; j++) + if (increment_p) + { + SHORT_INC (into_color->red, argv[j]->red); + SHORT_INC (into_color->green, argv[j]->green); + SHORT_INC (into_color->blue, argv[j]->blue); + } + else + { + SHORT_DEC (into_color->red, argv[j]->red); + SHORT_DEC (into_color->green, argv[j]->green); + SHORT_DEC (into_color->blue, argv[j]->blue); + } +#undef SHORT_INC +#undef SHORT_DEC +} + +/* fill in all the permutations of colors that XAllocColorCells() has + allocated for us. Thanks Ron, you're an additive kind of guy. */ +static void +permute_colors (pcolors, colors, count, plane_masks, increment_p) + XColor *pcolors, *colors; + int count; + unsigned long *plane_masks; + Bool increment_p; +{ + int out = 0; + int max = i_exp (2, count); + if (count > 31) abort (); + for (out = 1; out < max; out++) + { + XColor *argv [32]; + int this_mask = 0; + int argc = 0; + int bit; + for (bit = 0; bit < 32; bit++) + if (out & (1<= 360) color_shift = 5; + if (delay < 0) delay = 0; + + if (count == 1 && transparent_p) + transparent_p = False; /* it's a no-op */ + + if (transparent_p && CellsOfScreen (DefaultScreenOfDisplay (dpy)) <= 2) + { + fprintf (stderr, "%s: -transparent only works on color displays.\n", + progname); + transparent_p = False; + } + + if (xor_p && !transparent_p) + mono_p = True; + + gcs[0] = gcs[1] = 0; + gcv.foreground = default_fg_pixel = + get_pixel_resource ("foreground", "Foreground", dpy, cmap); + + if (transparent_p) + { + Bool increment_p = get_boolean_resource ("additive", "Boolean"); + unsigned long plane_masks [32]; + XColor *pcolors, *colors; + int nplanes = count; + int i, total_colors; + + /* permutations would be harder if the number of planes didn't fit + in an int. Who has >32-bit displays anyway... */ + if (nplanes > 31) nplanes = 31; + + while (nplanes > 1 && + !XAllocColorCells (dpy, cmap, False, plane_masks, nplanes, + &base_pixel, 1)) + nplanes--; + + if (nplanes <= 1) + { + fprintf (stderr, + "%s: couldn't allocate any color planes; turning -transparent off.\n", + progname); + transparent_p = False; + if (xor_p) + goto NON_TRANSPARENT_XOR; + else + goto NON_TRANSPARENT; + } + else if (nplanes != count) + { + fprintf (stderr, + "%s: only allocated %d color planes (instead of %d).\n", + progname, nplanes, count); + count = nplanes; + } + + gcs[0] = (GC *) malloc (count * sizeof (GC)); + gcs[1] = xor_p ? gcs[0] : (GC *) malloc (count * sizeof (GC)); + total_colors = i_exp (2, count); + pcolors = (XColor *) calloc (count, sizeof (XColor)); + colors = (XColor *) calloc (total_colors, sizeof (XColor)); + for (i = 0; i < count; i++) + { + gcv.plane_mask = plane_masks [i]; + gcv.foreground = ~0; + if (xor_p) + { + gcv.function = GXxor; + gcs [0][i] = XCreateGC (dpy, window, + GCForeground|GCFunction|GCPlaneMask, + &gcv); + } + else + { + gcs [0][i] = XCreateGC (dpy, window, GCForeground|GCPlaneMask, + &gcv); + gcv.foreground = 0; + gcs [1][i] = XCreateGC (dpy, window, GCForeground|GCPlaneMask, + &gcv); + } + + /* pick the "primary" (not in that sense) colors. + If we are in subtractive mode, pick higher intensities. */ + hsv_to_rgb (random () % 360, frand (1.0), + frand (0.5) + (increment_p ? 0.2 : 0.5), + &pcolors[i].red, &pcolors[i].green, &pcolors[i].blue); + + pcolors [i].flags = DoRed | DoGreen | DoBlue; + pcolors [i].pixel = base_pixel | plane_masks [i]; + } + permute_colors (pcolors, colors, count, plane_masks, increment_p); + /* clone the default background of the window into our "base" pixel */ + colors [total_colors - 1].pixel = + get_pixel_resource ("background", "Background", dpy, cmap); + XQueryColor (dpy, cmap, &colors [total_colors - 1]); + colors [total_colors - 1].pixel = base_pixel; + XStoreColors (dpy, cmap, colors, total_colors); + XSetWindowBackground (dpy, window, base_pixel); + XClearWindow (dpy, window); + } + else if (xor_p) + { + NON_TRANSPARENT_XOR: + gcv.function = GXxor; + gcv.foreground = + (default_fg_pixel ^ get_pixel_resource ("background", "Background", + dpy, cmap)); + draw_gc = erase_gc = XCreateGC(dpy,window,GCForeground|GCFunction,&gcv); + } + else + { + NON_TRANSPARENT: + draw_gc = XCreateGC (dpy, window, GCForeground, &gcv); + gcv.foreground = get_pixel_resource ("background", "Background", + dpy, cmap); + erase_gc = XCreateGC (dpy, window, GCForeground, &gcv); + } + + qixes = (struct qix **) malloc ((count + 1) * sizeof (struct qix *)); + qixes [count] = 0; + while (count--) + { + qixes [count] = init_one_qix (dpy, window, nlines); + qixes [count]->id = count; + } + return qixes; +} + +static void +free_qline (dpy, window, cmap, qline, prev, qix) + Display *dpy; + Window window; + Colormap cmap; + struct qline *qline, *prev; + struct qix *qix; +{ + if (qline->dead || !prev) + ; + else if (solid_p) + { + XPoint points [4]; + points [0].x = qline->p1.x; points [0].y = qline->p1.y; + points [1].x = qline->p2.x; points [1].y = qline->p2.y; + points [2].x = prev->p2.x; points [2].y = prev->p2.y; + points [3].x = prev->p1.x; points [3].y = prev->p1.y; + XFillPolygon (dpy, window, (transparent_p ? gcs[1][qix->id] : erase_gc), + points, 4, Complex, CoordModeOrigin); + } + else + XDrawLine (dpy, window, (transparent_p ? gcs[1][qix->id] : erase_gc), + qline->p1.x, qline->p1.y, qline->p2.x, qline->p2.y); + + if (!mono_p && !transparent_p) + XFreeColors (dpy, cmap, &qline->color.pixel, 1, 0); + + qline->dead = True; +} + +static void +add_qline (dpy, window, cmap, qline, prev_qline, qix) + Display *dpy; + Window window; + Colormap cmap; + struct qline *qline, *prev_qline; + struct qix *qix; +{ + *qline = *prev_qline; + +#define wiggle(point,delta,max) \ + if (random_p) delta += (random () % 3) - 1; \ + if (delta > max_spread) delta = max_spread; \ + else if (delta < -max_spread) delta = -max_spread; \ + point += delta; \ + if (point < 0) point = 0, delta = -delta, point += delta<<1; \ + else if (point > max) point = max, delta = -delta, point += delta<<1; + + wiggle (qline->p1.x, qline->p1.dx, maxx); + wiggle (qline->p1.y, qline->p1.dy, maxy); + wiggle (qline->p2.x, qline->p2.dx, maxx); + wiggle (qline->p2.y, qline->p2.dy, maxy); + + if (max_size) + { + if (qline->p1.x - qline->p2.x > max_size) + qline->p1.x = qline->p2.x + max_size + - (random_p ? random() % max_spread : 0); + else if (qline->p2.x - qline->p1.x > max_size) + qline->p2.x = qline->p1.x + max_size + - (random_p ? random() % max_spread : 0); + if (qline->p1.y - qline->p2.y > max_size) + qline->p1.y = qline->p2.y + max_size + - (random_p ? random() % max_spread : 0); + else if (qline->p2.y - qline->p1.y > max_size) + qline->p2.y = qline->p1.y + max_size + - (random_p ? random() % max_spread : 0); + } + + if (!mono_p && !transparent_p) + { + XColor desired; + cycle_hue (&qline->color, color_shift); + qline->color.flags = DoRed | DoGreen | DoBlue; + desired = qline->color; + if (XAllocColor (dpy, cmap, &qline->color)) + { + /* XAllocColor returns the actual RGB that the hardware let us + allocate. Restore the requested values into the XColor struct + so that limited-resolution hardware doesn't cause cycle_hue to + get "stuck". */ + qline->color.red = desired.red; + qline->color.green = desired.green; + qline->color.blue = desired.blue; + } + else + { + qline->color = prev_qline->color; + if (!XAllocColor (dpy, cmap, &qline->color)) + abort (); /* same color should work */ + } + XSetForeground (dpy, draw_gc, qline->color.pixel); + } + if (! solid_p) + XDrawLine (dpy, window, (transparent_p ? gcs[0][qix->id] : draw_gc), + qline->p1.x, qline->p1.y, qline->p2.x, qline->p2.y); + else if (!prev_qline->dead) + { + XPoint points [4]; + points [0].x = qline->p1.x; points [0].y = qline->p1.y; + points [1].x = qline->p2.x; points [1].y = qline->p2.y; + points [2].x = prev_qline->p2.x; points [2].y = prev_qline->p2.y; + points [3].x = prev_qline->p1.x; points [3].y = prev_qline->p1.y; + XFillPolygon (dpy, window, (transparent_p ? gcs[0][qix->id] : draw_gc), + points, 4, Complex, CoordModeOrigin); + } + + qline->dead = False; +} + +static void +qix1 (dpy, window, qix) + Display *dpy; + Window window; + struct qix *qix; +{ + int ofp = qix->fp - 1; + static int gtick = 0; + if (gtick++ == 500) + get_geom (dpy, window), gtick = 0; + if (ofp < 0) ofp = qix->nlines - 1; + free_qline (dpy, window, cmap, &qix->lines [qix->fp], + &qix->lines[(qix->fp + 1) % qix->nlines], qix); + add_qline (dpy, window, cmap, &qix->lines[qix->fp], &qix->lines[ofp], qix); + if ((++qix->fp) >= qix->nlines) + qix->fp = 0; +} + + +char *progclass = "Qix"; + +char *defaults [] = { + "Qix.background: black", /* to placate SGI */ + "Qix.foreground: white", + "*count: 1", + "*segments: 50", + "*spread: 8", + "*size: 0", + "*colorShift: 3", + "*solid: false", + "*delay: 10000", + "*random: true", + "*xor: false", + "*transparent:false", + "*additive: true", + 0 +}; + +XrmOptionDescRec options [] = { + { "-count", ".count", XrmoptionSepArg, 0 }, + { "-segments", ".segments", XrmoptionSepArg, 0 }, + { "-spread", ".spread", XrmoptionSepArg, 0 }, + { "-size", ".size", XrmoptionSepArg, 0 }, + { "-delay", ".delay", XrmoptionSepArg, 0 }, + { "-color-shift", ".colorShift", XrmoptionSepArg, 0 }, + { "-random", ".random", XrmoptionNoArg, "true" }, + { "-linear", ".random", XrmoptionNoArg, "false" }, + { "-solid", ".solid", XrmoptionNoArg, "true" }, + { "-hollow", ".solid", XrmoptionNoArg, "false" }, + { "-xor", ".xor", XrmoptionNoArg, "true" }, + { "-no-xor", ".xor", XrmoptionNoArg, "false" }, + { "-transparent", ".transparent", XrmoptionNoArg, "true" }, + { "-non-transparent", ".transparent", XrmoptionNoArg, "false" }, + { "-additive", ".additive", XrmoptionNoArg, "true" }, + { "-subtractive", ".additive", XrmoptionNoArg, "false" }, +}; +int options_size = (sizeof (options) / sizeof (options[0])); + +void +screenhack (dpy, window) + Display *dpy; + Window window; +{ + struct qix **q1 = init_qix (dpy, window); + struct qix **qn; + while (1) + for (qn = q1; *qn; qn++) + { + qix1 (dpy, window, *qn); + XSync (dpy, True); + if (delay) usleep (delay); + } +} diff --git a/hacks/qix.exe_axp b/hacks/qix.exe_axp new file mode 100755 index 0000000000000000000000000000000000000000..c37877142a094bcbe4b5961829be51de7c71c167 GIT binary patch literal 39936 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 bacQFtBTow!#`6$xNxu`N_&v-2_0RtT-2=;b literal 0 HcmV?d00001 diff --git a/hacks/qix.exe_vax b/hacks/qix.exe_vax new file mode 100755 index 0000000000000000000000000000000000000000..3b053c14c7f5fe909e0fd128251b9acfc38b6b2e GIT binary patch literal 21504 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, 13-aug-92. diff --git a/hacks/qix.man b/hacks/qix.man new file mode 100755 index 00000000..816a55a3 --- /dev/null +++ b/hacks/qix.man @@ -0,0 +1,114 @@ +.TH XScreenSaver 1 "9-dec-92" "X Version 11" +.SH NAME +qix - bounce colored lines around a window +.SH SYNOPSIS +.B qix +[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP] [\-background \fIcolor\fP] [\-window] [\-root] [\-mono] [\-install] [\-visual \fIvisual\fP] [\-segments \fIint\fP] [\-spread \fIpixels\fP] [\-size \fIpixels\fP] [\-count \fIint\fP] [\-color-shift \fIdegrees\fP] [\-delay \fIusecs\fP] [\-random] [\-linear] [\-solid] [\-hollow] [\-xor] [\-no\-xor] [\-transparent] [\-non\-transparent] [\-additive] [\-subtractive] +.SH DESCRIPTION +The \fIqix\fP program bounces a series of line segments around its window. +This is truly the swiss army chainsaw of qix programs. If you know of one +with more display modes, I want to know about it. +.SH OPTIONS +.I qix +accepts the following options: +.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 \-mono +If on a color display, pretend we're on a monochrome display. +.TP 8 +.B \-install +Install a private colormap for the window. +.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 \-segments \fIinteger\fP +How many line segments should be drawn. Default 50. +.TP 8 +.B \-spread \fIinteger\fP +How far apart the endpoints of one segment should be from the next. +Default 8. +.TP 8 +.B \-size \fIinteger\fP +The maximum distance one endpoint of a segment is allowed to be from +the opposite end of that segment. Default 0, meaning unlimited. +.TP 8 +.B \-count \fIinteger\fP +How many qixes to draw. Default 1. +.TP 8 +.B \-color\-shift \fIdegrees\fP +If on a color display, the color of the line segments will cycle through +the spectrum. This specifies how far the hue of each segment should be +from the next, in degrees on the HSV wheel. Default 3. +.TP 8 +.B \-delay \fImicroseconds\fP +How much of a delay should be introduced between steps of the animation. +Default 25000, or about 0.025 seconds. +.TP 8 +.B \-random +The \fIqix\fP will wander around the screen semi-randomly. This is the +default. +.TP 8 +.B \-linear +The opposite of \fI\-random\fP: the \fIqix\fP will travel in straight lines +until it reaches a wall, and then it will bounce. +.TP 8 +.B \-solid +If this is specified, then the area between the line segments will be filled +in with the appropriate color, instead of the \fIqix\fP simply being composed +of one-pixel-wide line segments. This option looks really good in color. +.TP 8 +.B \-hollow +The opposite of \fI\-solid\fP; this is the default. +.TP 8 +.B \-xor +If this is specified, then qix segments will be drawn and erased with xor, +instead of being drawn in some color and erased in the background color. +This implies \fI\-mono\fP, in that only two colors can be used. +.TP 8 +.B \-transparent +If this is specified, and \fI\-count\fP is greater than 1, then each qix +will be drawn in one color, and when they overlap, the colors will be mixed. +This only works on \fBPseudoColor\fP displays. This looks best in +conjuction with \fI\-solid\fP. +.TP 8 +.B \-non\-transparent +Turns off \fI\-transparent\fP. +.TP 8 +.B \-additive +If \fI\-transparent\fP is specified, then this option means that the colors +will be mixed using an additive color model, as if the qixes were projected +light. This is the default. +.TP 8 +.B \-subtractive +If \fI\-transparent\fP is specified, then this option means that the +colors will be mixed using a subtractive color model, as if the qixes were +translucent filters. +.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. +.SH SEE ALSO +.BR X (1), +.BR xscreensaver (1) +.SH COPYRIGHT +Copyright \(co 1992 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 , 13-aug-92. diff --git a/hacks/readme b/hacks/readme new file mode 100755 index 00000000..c5ebcd64 --- /dev/null +++ b/hacks/readme @@ -0,0 +1,9 @@ + +This directory contains various graphics hacks. These are independent from +the xscreensaver program (in the ../driver/ directory) but some of them use +the utility functions found in the ../utils/ directory. + +If you have compilation problems, check the parameters in ../config.h. + +The file xlock.h makes it really easy to turn `xlock' modules into standalone +programs that can be used with xscreensaver; check it out. diff --git a/hacks/rocks.c b/hacks/rocks.c new file mode 100755 index 00000000..d52a641c --- /dev/null +++ b/hacks/rocks.c @@ -0,0 +1,314 @@ +/* xscreensaver, Copyright (c) 1992, 1995 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. + */ + +/* Flying through an asteroid field. Based on TI Explorer Lisp code by + John Nguyen + */ + +#include +#include +#include "screenhack.h" + +#ifdef VMS +#define M_PI 3.14159265358979323846 +#endif + +#define MIN_DEPTH 2 /* rocks disappar when they get this close */ +#define MAX_DEPTH 60 /* this is where rocks appear */ +#define MAX_WIDTH 100 /* how big (in pixels) rocks are at depth 1 */ +#define DEPTH_SCALE 100 /* how many ticks there are between depths */ +#define SIN_RESOLUTION 1000 + +/* there's not much point in the above being user-customizable, but those + numbers might want to be tweaked for displays with an order of magnitude + higher resolution or compute power. + */ + +static double sins [SIN_RESOLUTION]; +static double coss [SIN_RESOLUTION]; +static double depths [(MAX_DEPTH + 1) * DEPTH_SCALE]; + +static Display *dpy; +static Window window; +static int width, height, midx, midy; +static GC draw_gc, erase_gc; +static Bool rotate_p ; + +static int speed; + +struct rock { + int real_size; + int r; + int theta; + int depth; + int size, x, y; +}; + +static struct rock *rocks; +static int nrocks; +static Pixmap pixmaps [MAX_WIDTH]; +static int delay; + +static void rock_reset(), rock_tick(), rock_compute(), rock_draw(); +static void init_pixmaps(), init_rocks(), tick_rocks(), rocks_once(); + + +static void +rock_reset (rock) + struct rock *rock; +{ + rock->real_size = MAX_WIDTH; + rock->r = (SIN_RESOLUTION * 0.7) + (random () % (30 * SIN_RESOLUTION)); + rock->theta = random () % SIN_RESOLUTION; + rock->depth = MAX_DEPTH * DEPTH_SCALE; + rock_compute (rock); + rock_draw (rock, True); +} + +static void +rock_tick (rock, d) + struct rock *rock; + int d; +{ + if (rock->depth > 0) + { + rock_draw (rock, False); + rock->depth -= speed; + if (rotate_p) + { + rock->theta = (rock->theta + d) % SIN_RESOLUTION; + } + while (rock->theta < 0) + rock->theta += SIN_RESOLUTION; + if (rock->depth < (MIN_DEPTH * DEPTH_SCALE)) + rock->depth = 0; + else + { + rock_compute (rock); + rock_draw (rock, True); + } + } + else if ((random () % 40) == 0) + rock_reset (rock); +} + +static void +rock_compute (rock) + struct rock *rock; +{ + double factor = depths [rock->depth]; + rock->size = (int) ((rock->real_size * factor) + 0.5); + rock->x = midx + (coss [rock->theta] * rock->r * factor); + rock->y = midy + (sins [rock->theta] * rock->r * factor); +} + +static void +rock_draw (rock, draw_p) + struct rock *rock; + Bool draw_p; +{ + GC gc = draw_p ? draw_gc : erase_gc; + if (rock->x <= 0 || rock->y <= 0 || rock->x >= width || rock->y >= height) + { + /* this means that if a rock were to go off the screen at 12:00, but + would have been visible at 3:00, it won't come back once the observer + rotates around so that the rock would have been visible again. + Oh well. + */ + rock->depth = 0; + return; + } + if (rock->size <= 1) + XDrawPoint (dpy, window, gc, rock->x, rock->y); + else if (rock->size <= 3 || !draw_p) + XFillRectangle (dpy, window, gc, + rock->x - rock->size/2, rock->y - rock->size/2, + rock->size, rock->size); + else if (rock->size < MAX_WIDTH) + XCopyPlane (dpy, pixmaps [rock->size], window, gc, + 0, 0, rock->size, rock->size, + rock->x - rock->size/2, rock->y - rock->size/2, + 1); + else + abort (); +} + + +static void +init_pixmaps (dpy, window) + Display *dpy; + Window window; +{ + int i; + XGCValues gcv; + GC fg_gc = 0, bg_gc = 0; + pixmaps [0] = pixmaps [1] = 0; + for (i = MIN_DEPTH; i < MAX_WIDTH; i++) + { + int w = (1+(i/32))<<5; /* server might be faster if word-aligned */ + int h = i; + Pixmap p = XCreatePixmap (dpy, window, w, h, 1); + XPoint points [7]; + pixmaps [i] = p; + if (! p) + { + fprintf (stderr, "%s: couldn't allocate pixmaps", progname); + exit (1); + } + if (! fg_gc) + { /* must use drawable of pixmap, not window (fmh) */ + gcv.foreground = 1; + fg_gc = XCreateGC (dpy, p, GCForeground, &gcv); + gcv.foreground = 0; + bg_gc = XCreateGC (dpy, p, GCForeground, &gcv); + } + XFillRectangle (dpy, p, bg_gc, 0, 0, w, h); + points [0].x = i * 0.15; points [0].y = i * 0.85; + points [1].x = i * 0.00; points [1].y = i * 0.20; + points [2].x = i * 0.30; points [2].y = i * 0.00; + points [3].x = i * 0.40; points [3].y = i * 0.10; + points [4].x = i * 0.90; points [4].y = i * 0.10; + points [5].x = i * 1.00; points [5].y = i * 0.55; + points [6].x = i * 0.45; points [6].y = i * 1.00; + XFillPolygon (dpy, p, fg_gc, points, 7, Nonconvex, CoordModeOrigin); + } + XFreeGC (dpy, fg_gc); + XFreeGC (dpy, bg_gc); +} + + +static void +init_rocks (d, w) + Display *d; + Window w; +{ + int i; + XGCValues gcv; + Colormap cmap; + XWindowAttributes xgwa; + unsigned int fg, bg; + dpy = d; + window = w; + XGetWindowAttributes (dpy, window, &xgwa); + cmap = xgwa.colormap; + delay = get_integer_resource ("delay", "Integer"); + if (delay < 0) delay = 0; + speed = get_integer_resource ("speed", "Integer"); + if (speed < 1) speed = 1; + if (speed > 100) speed = 100; + rotate_p = get_boolean_resource ("rotate", "Boolean"); + fg = get_pixel_resource ("foreground", "Foreground", dpy, cmap); + bg = get_pixel_resource ("background", "Background", dpy, cmap); + gcv.foreground = fg; + gcv.background = bg; + draw_gc = XCreateGC (dpy, window, GCForeground|GCBackground, &gcv); + gcv.foreground = bg; + gcv.background = fg; + erase_gc = XCreateGC (dpy, window, GCForeground|GCBackground, &gcv); + + for (i = 0; i < SIN_RESOLUTION; i++) + { + sins [i] = sin ((((double) i) / (SIN_RESOLUTION / 2)) * M_PI); + coss [i] = cos ((((double) i) / (SIN_RESOLUTION / 2)) * M_PI); + } + /* we actually only need i/speed of these, but wtf */ + for (i = 1; i < (sizeof (depths) / sizeof (depths[0])); i++) + depths [i] = atan (((double) 0.5) / (((double) i) / DEPTH_SCALE)); + depths [0] = M_PI/2; /* avoid division by 0 */ + + nrocks = get_integer_resource ("count", "Count"); + if (nrocks < 1) nrocks = 1; + rocks = (struct rock *) calloc (nrocks, sizeof (struct rock)); + init_pixmaps (dpy, window); + XClearWindow (dpy, window); +} + + +static void +tick_rocks (d) + int d; +{ + int i; + for (i = 0; i < nrocks; i++) + rock_tick (&rocks [i], d); +} + +static void +rocks_once () +{ + static int current_delta = 0; /* observer Z rotation */ + static int window_tick = 50; + + if (window_tick++ == 50) + { + XWindowAttributes xgwa; + XGetWindowAttributes (dpy, window, &xgwa); + window_tick = 0; + width = xgwa.width; + height = xgwa.height; + midx = width/2; + midy = height/2; + } + + if ((random () % 50) == 0) + { + int d = current_delta; + int new_delta = ((random () % 11) - 5); + if ((random () % 10) == 0) + new_delta *= 5; + + while (d == current_delta) + { + int i; + for (i = 0; i < 3; i++) + tick_rocks (d); + if (current_delta < new_delta) d++; + else d--; + } + current_delta = new_delta; + } + tick_rocks (current_delta); +} + + +char *progclass = "Rocks"; + +char *defaults [] = { + "Rocks.background: black", /* to placate SGI */ + "Rocks.foreground: white", + "*count: 100", + "*delay: 50000", + "*speed: 100", + "*rotate: true", + 0 +}; + +XrmOptionDescRec options [] = { + { "-count", ".count", XrmoptionSepArg, 0 }, + { "-norotate", ".rotate", XrmoptionNoArg, "false" }, + { "-delay", ".delay", XrmoptionSepArg, 0 }, + { "-speed", ".speed", XrmoptionSepArg, 0 } +}; +int options_size = (sizeof (options) / sizeof (options[0])); + +void +screenhack (dpy, window) + Display *dpy; + Window window; +{ + init_rocks (dpy, window); + while (1) + { + rocks_once (); + XSync (dpy, True); + if (delay) usleep (delay); + } +} diff --git a/hacks/rocks.c_ori b/hacks/rocks.c_ori new file mode 100755 index 00000000..4e9e901e --- /dev/null +++ b/hacks/rocks.c_ori @@ -0,0 +1,310 @@ +/* xscreensaver, Copyright (c) 1992, 1995 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. + */ + +/* Flying through an asteroid field. Based on TI Explorer Lisp code by + John Nguyen + */ + +#include +#include +#include "screenhack.h" + +#define MIN_DEPTH 2 /* rocks disappar when they get this close */ +#define MAX_DEPTH 60 /* this is where rocks appear */ +#define MAX_WIDTH 100 /* how big (in pixels) rocks are at depth 1 */ +#define DEPTH_SCALE 100 /* how many ticks there are between depths */ +#define SIN_RESOLUTION 1000 + +/* there's not much point in the above being user-customizable, but those + numbers might want to be tweaked for displays with an order of magnitude + higher resolution or compute power. + */ + +static double sins [SIN_RESOLUTION]; +static double coss [SIN_RESOLUTION]; +static double depths [(MAX_DEPTH + 1) * DEPTH_SCALE]; + +static Display *dpy; +static Window window; +static int width, height, midx, midy; +static GC draw_gc, erase_gc; +static Bool rotate_p ; + +static int speed; + +struct rock { + int real_size; + int r; + int theta; + int depth; + int size, x, y; +}; + +static struct rock *rocks; +static int nrocks; +static Pixmap pixmaps [MAX_WIDTH]; +static int delay; + +static void rock_reset(), rock_tick(), rock_compute(), rock_draw(); +static void init_pixmaps(), init_rocks(), tick_rocks(), rocks_once(); + + +static void +rock_reset (rock) + struct rock *rock; +{ + rock->real_size = MAX_WIDTH; + rock->r = (SIN_RESOLUTION * 0.7) + (random () % (30 * SIN_RESOLUTION)); + rock->theta = random () % SIN_RESOLUTION; + rock->depth = MAX_DEPTH * DEPTH_SCALE; + rock_compute (rock); + rock_draw (rock, True); +} + +static void +rock_tick (rock, d) + struct rock *rock; + int d; +{ + if (rock->depth > 0) + { + rock_draw (rock, False); + rock->depth -= speed; + if (rotate_p) + { + rock->theta = (rock->theta + d) % SIN_RESOLUTION; + } + while (rock->theta < 0) + rock->theta += SIN_RESOLUTION; + if (rock->depth < (MIN_DEPTH * DEPTH_SCALE)) + rock->depth = 0; + else + { + rock_compute (rock); + rock_draw (rock, True); + } + } + else if ((random () % 40) == 0) + rock_reset (rock); +} + +static void +rock_compute (rock) + struct rock *rock; +{ + double factor = depths [rock->depth]; + rock->size = (int) ((rock->real_size * factor) + 0.5); + rock->x = midx + (coss [rock->theta] * rock->r * factor); + rock->y = midy + (sins [rock->theta] * rock->r * factor); +} + +static void +rock_draw (rock, draw_p) + struct rock *rock; + Bool draw_p; +{ + GC gc = draw_p ? draw_gc : erase_gc; + if (rock->x <= 0 || rock->y <= 0 || rock->x >= width || rock->y >= height) + { + /* this means that if a rock were to go off the screen at 12:00, but + would have been visible at 3:00, it won't come back once the observer + rotates around so that the rock would have been visible again. + Oh well. + */ + rock->depth = 0; + return; + } + if (rock->size <= 1) + XDrawPoint (dpy, window, gc, rock->x, rock->y); + else if (rock->size <= 3 || !draw_p) + XFillRectangle (dpy, window, gc, + rock->x - rock->size/2, rock->y - rock->size/2, + rock->size, rock->size); + else if (rock->size < MAX_WIDTH) + XCopyPlane (dpy, pixmaps [rock->size], window, gc, + 0, 0, rock->size, rock->size, + rock->x - rock->size/2, rock->y - rock->size/2, + 1); + else + abort (); +} + + +static void +init_pixmaps (dpy, window) + Display *dpy; + Window window; +{ + int i; + XGCValues gcv; + GC fg_gc = 0, bg_gc = 0; + pixmaps [0] = pixmaps [1] = 0; + for (i = MIN_DEPTH; i < MAX_WIDTH; i++) + { + int w = (1+(i/32))<<5; /* server might be faster if word-aligned */ + int h = i; + Pixmap p = XCreatePixmap (dpy, window, w, h, 1); + XPoint points [7]; + pixmaps [i] = p; + if (! p) + { + fprintf (stderr, "%s: couldn't allocate pixmaps", progname); + exit (1); + } + if (! fg_gc) + { /* must use drawable of pixmap, not window (fmh) */ + gcv.foreground = 1; + fg_gc = XCreateGC (dpy, p, GCForeground, &gcv); + gcv.foreground = 0; + bg_gc = XCreateGC (dpy, p, GCForeground, &gcv); + } + XFillRectangle (dpy, p, bg_gc, 0, 0, w, h); + points [0].x = i * 0.15; points [0].y = i * 0.85; + points [1].x = i * 0.00; points [1].y = i * 0.20; + points [2].x = i * 0.30; points [2].y = i * 0.00; + points [3].x = i * 0.40; points [3].y = i * 0.10; + points [4].x = i * 0.90; points [4].y = i * 0.10; + points [5].x = i * 1.00; points [5].y = i * 0.55; + points [6].x = i * 0.45; points [6].y = i * 1.00; + XFillPolygon (dpy, p, fg_gc, points, 7, Nonconvex, CoordModeOrigin); + } + XFreeGC (dpy, fg_gc); + XFreeGC (dpy, bg_gc); +} + + +static void +init_rocks (d, w) + Display *d; + Window w; +{ + int i; + XGCValues gcv; + Colormap cmap; + XWindowAttributes xgwa; + unsigned int fg, bg; + dpy = d; + window = w; + XGetWindowAttributes (dpy, window, &xgwa); + cmap = xgwa.colormap; + delay = get_integer_resource ("delay", "Integer"); + if (delay < 0) delay = 0; + speed = get_integer_resource ("speed", "Integer"); + if (speed < 1) speed = 1; + if (speed > 100) speed = 100; + rotate_p = get_boolean_resource ("rotate", "Boolean"); + fg = get_pixel_resource ("foreground", "Foreground", dpy, cmap); + bg = get_pixel_resource ("background", "Background", dpy, cmap); + gcv.foreground = fg; + gcv.background = bg; + draw_gc = XCreateGC (dpy, window, GCForeground|GCBackground, &gcv); + gcv.foreground = bg; + gcv.background = fg; + erase_gc = XCreateGC (dpy, window, GCForeground|GCBackground, &gcv); + + for (i = 0; i < SIN_RESOLUTION; i++) + { + sins [i] = sin ((((double) i) / (SIN_RESOLUTION / 2)) * M_PI); + coss [i] = cos ((((double) i) / (SIN_RESOLUTION / 2)) * M_PI); + } + /* we actually only need i/speed of these, but wtf */ + for (i = 1; i < (sizeof (depths) / sizeof (depths[0])); i++) + depths [i] = atan (((double) 0.5) / (((double) i) / DEPTH_SCALE)); + depths [0] = M_PI/2; /* avoid division by 0 */ + + nrocks = get_integer_resource ("count", "Count"); + if (nrocks < 1) nrocks = 1; + rocks = (struct rock *) calloc (nrocks, sizeof (struct rock)); + init_pixmaps (dpy, window); + XClearWindow (dpy, window); +} + + +static void +tick_rocks (d) + int d; +{ + int i; + for (i = 0; i < nrocks; i++) + rock_tick (&rocks [i], d); +} + +static void +rocks_once () +{ + static int current_delta = 0; /* observer Z rotation */ + static int window_tick = 50; + + if (window_tick++ == 50) + { + XWindowAttributes xgwa; + XGetWindowAttributes (dpy, window, &xgwa); + window_tick = 0; + width = xgwa.width; + height = xgwa.height; + midx = width/2; + midy = height/2; + } + + if ((random () % 50) == 0) + { + int d = current_delta; + int new_delta = ((random () % 11) - 5); + if ((random () % 10) == 0) + new_delta *= 5; + + while (d == current_delta) + { + int i; + for (i = 0; i < 3; i++) + tick_rocks (d); + if (current_delta < new_delta) d++; + else d--; + } + current_delta = new_delta; + } + tick_rocks (current_delta); +} + + +char *progclass = "Rocks"; + +char *defaults [] = { + "Rocks.background: black", /* to placate SGI */ + "Rocks.foreground: white", + "*count: 100", + "*delay: 50000", + "*speed: 100", + "*rotate: true", + 0 +}; + +XrmOptionDescRec options [] = { + { "-count", ".count", XrmoptionSepArg, 0 }, + { "-norotate", ".rotate", XrmoptionNoArg, "false" }, + { "-delay", ".delay", XrmoptionSepArg, 0 }, + { "-speed", ".speed", XrmoptionSepArg, 0 } +}; +int options_size = (sizeof (options) / sizeof (options[0])); + +void +screenhack (dpy, window) + Display *dpy; + Window window; +{ + init_rocks (dpy, window); + while (1) + { + rocks_once (); + XSync (dpy, True); + if (delay) usleep (delay); + } +} diff --git a/hacks/rocks.exe_axp b/hacks/rocks.exe_axp new file mode 100755 index 0000000000000000000000000000000000000000..7929067c2b169eb6024436223abaa2c39df4bb5a GIT binary patch literal 32768 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 FzX5idh(Z7W literal 0 HcmV?d00001 diff --git a/hacks/rocks.exe_vax b/hacks/rocks.exe_vax new file mode 100755 index 0000000000000000000000000000000000000000..640301f7e8f1c13a438f8a80bfba43484a0947ff GIT binary patch literal 17408 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 xC=L#Ef^ML{?. + +Ported to C and X by Jamie Zawinski , 13-aug-92. diff --git a/hacks/rocks.man b/hacks/rocks.man new file mode 100755 index 00000000..22256d3e --- /dev/null +++ b/hacks/rocks.man @@ -0,0 +1,71 @@ +.TH XScreenSaver 1 "13-aug-92" "X Version 11" +.SH NAME +rocks - animation of flying through an asteroid field +.SH SYNOPSIS +.B rocks +[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP] [\-background \fIcolor\fP] [\-window] [\-root] [\-install] [\-visual \fIvisual\fP] [\-count \fIinteger\fP] [\-delay \fIusecs\fP] [\-speed \fIinteger\fP] [\-norotate] +.SH DESCRIPTION +The \fIrocks\fP program draws an animation of an asteroid field moving past +the observer (or vice versa). Sometimes the observer picks up spin on Z axis. +.SH OPTIONS +.I rocks +accepts the following options: +.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 \-install +Install a private colormap for the window. +.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 \-count \fIinteger\fP +Maximum number of rocks to draw on the screen at once. Default 100. +.TP 8 +.B \-speed \fIinteger\fP +A measure of the speed with which the observer and the rocks pass each other, +from 1 to 100. Default 100, meaning ``very fast.'' If you're on a slow +display connection (the animation looks jerky) then try making this number +smaller, and/or decreasing the number of rocks. +.TP 8 +.B \-delay \fImicroseconds\fP +Number of microseconds to delay between each frame. Default 50000, meaning +about 1/20th second. Compare and contrast with \fI\-speed\fP, above. +.TP 8 +.B \-norotate +Don't rotate the observer; just fly straight through the field. +.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. +.SH SEE ALSO +.BR X (1), +.BR xscreensaver (1) +.SH BUGS +There should be an option to display doppler shift (a gravity rainbow.) + +Speed of rotation should be settable. + +Default speed of rotation should be relative to forward velocity. +.SH COPYRIGHT +Copyright \(co 1992 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 +Based on Lisp Machine code copyright 1988 John Nguyen . + +Ported to C and X by Jamie Zawinski , 13-aug-92. diff --git a/hacks/rorschach.c b/hacks/rorschach.c new file mode 100755 index 00000000..bea709cd --- /dev/null +++ b/hacks/rorschach.c @@ -0,0 +1,140 @@ +/* xscreensaver, Copyright (c) 1992 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. + */ + +#include "screenhack.h" + +static GC draw_gc, erase_gc; +static unsigned int default_fg_pixel; +static int iterations, offset; +static Bool xsym, ysym; + +static void +init_rorschach (dpy, window) + Display *dpy; + Window window; +{ + XGCValues gcv; + Colormap cmap; + XWindowAttributes xgwa; + XGetWindowAttributes (dpy, window, &xgwa); + cmap = xgwa.colormap; + gcv.foreground = default_fg_pixel = + get_pixel_resource ("foreground", "Foreground", dpy, cmap); + draw_gc = XCreateGC (dpy, window, GCForeground, &gcv); + gcv.foreground = get_pixel_resource ("background", "Background", dpy, cmap); + erase_gc = XCreateGC (dpy, window, GCForeground, &gcv); + iterations = get_integer_resource ("iterations", "Integer"); + offset = get_integer_resource ("offset", "Integer"); + if (offset <= 0) offset = 3; + if (iterations < 10) iterations = 10; + xsym = get_boolean_resource ("xsymmetry", "Symmetry"); + ysym = get_boolean_resource ("ysymmetry", "Symmetry"); +} + +static void +hurm (dpy, window) + Display *dpy; + Window window; +{ + Colormap cmap; + XWindowAttributes xgwa; + int xlim, ylim, x, y, i, got_color = 0; + XPoint points [4]; + XColor color; + XClearWindow (dpy, window); + XGetWindowAttributes (dpy, window, &xgwa); + xlim = xgwa.width; + ylim = xgwa.height; + cmap = xgwa.colormap; + + if (! mono_p) + hsv_to_rgb (random()%360, 1.0, 1.0, &color.red, &color.green, &color.blue); + if ((!mono_p) && (got_color = XAllocColor (dpy, cmap, &color))) + XSetForeground (dpy, draw_gc, color.pixel); + else + XSetForeground (dpy, draw_gc, default_fg_pixel); + + x = xlim/2; + y = ylim/2; + for (i = 0; i < iterations; i++) + { + int j = 0; + x += ((random () % (1 + (offset << 1))) - offset); + y += ((random () % (1 + (offset << 1))) - offset); + points [j].x = x; + points [j].y = y; + j++; + if (xsym) + { + points [j].x = xlim - x; + points [j].y = y; + j++; + } + if (ysym) + { + points [j].x = x; + points [j].y = ylim - y; + j++; + } + if (xsym && ysym) + { + points [j].x = xlim - x; + points [j].y = ylim - y; + j++; + } + XDrawPoints (dpy, window, draw_gc, points, j, CoordModeOrigin); + XSync (dpy, True); + } + sleep (5); + for (i = 0; i < (ylim >> 1); i++) + { + int y = (random () % ylim); + XDrawLine (dpy, window, erase_gc, 0, y, xlim, y); + XFlush (dpy); + if ((i % 50) == 0) + usleep (10000); + } + XClearWindow (dpy, window); + if (got_color) XFreeColors (dpy, cmap, &color.pixel, 1, 0); + XSync (dpy, True); + sleep (1); +} + + +char *progclass = "Rorschach"; + +char *defaults [] = { + "Rorschach.background: black", /* to placate SGI */ + "Rorschach.foreground: white", + "*xsymmetry: true", + "*ysymmetry: false", + "*iterations: 4000", + "*offset: 4", + 0 +}; + +XrmOptionDescRec options [] = { + { "-iterations", ".iterations", XrmoptionSepArg, 0 }, + { "-offset", ".offset", XrmoptionSepArg, 0 }, + { "-xsymmetry", ".xsymmetry", XrmoptionNoArg, "true" }, + { "-ysymmetry", ".ysymmetry", XrmoptionNoArg, "true" } +}; +int options_size = (sizeof (options) / sizeof (options[0])); + +void +screenhack (dpy, window) + Display *dpy; + Window window; +{ + init_rorschach (dpy, window); + while (1) + hurm (dpy, window); +} diff --git a/hacks/rorschach.exe_axp b/hacks/rorschach.exe_axp new file mode 100755 index 0000000000000000000000000000000000000000..cf178c9f577b20d7290d91422fe1f4897cd3fd42 GIT binary patch literal 30720 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 QQQ(q(J4z{!|LW_10gkz^6#xJL literal 0 HcmV?d00001 diff --git a/hacks/rorschach.exe_vax b/hacks/rorschach.exe_vax new file mode 100755 index 0000000000000000000000000000000000000000..aae4e0c5cab4a85cca8291faec803084c38e451c GIT binary patch literal 16384 zcmeHu4}4VBmH&M&FUceXn9M{Cie*HoXn`hF6w|cJA5pCQdGlr_lOQ!rW+o&WCTS8d zSc0dMJAe|Y?qfo&96iWyhuV4nIvz&=f0Ut zpzN=IKEKcJv-|mUk~{C-bIv{Y+;h%7=f3;qy~^^~-E2LhPu_yOg`&Wi9{&*RWyXYS z|M{K*szT}3<6qO`wbXG4V~Ki(vPN+%Td`!>iV4W8RHdT)`FRuIdvuKY zi|?@1yoK}fKa)h5!5Jd5XHZg5%q*Lw;rcj=iMLbOb+~3qj7`Hei{-Fh{qNXwjE&yH zdocDXqbuSawsK z+Z1ri1X^*fBrY@98j^Dyo%J|-B6F21Vo&ds+r)Ol+8Ip8vlH6^~PISX{p1#smCg)oechHi*Ex-cwb@=Ep0`s;jDNH+pKAf!)kdaZ&`Q5g`U%k;^U%Lg6g?V`mDC{=ko}{>fZ$YAGf+Hw>{<z zs(O}LZ1dOFR@d4p1Gd?91)0n?Cr}+I_dvk;w`MYcY?}hLesA@LKxLiZXREHMudEK( zX3nmgnaS4hMjiTkt2X)k1vZwMkzqq8W-Ij6ZumT#Yh&{>8K3&n>gp=LC&0L}5{-mF ztccGUb1n0DAKp+~y(!>hOOw^I>RO+_mg|Y#Q(fziQ(Q4mcAufxaeex#1NF-=YOUKa zOJdlo55g|9ZFzE-2_s&;XJx&=)Cg74X7Gyk90V&vR;{z3B)RRZvHa^U_7bK-E$hbX^ zyvGn0EjBNSgnK5ZH7`D&`SI(#@p0JvWR;INZ+t{HKUw9d`ADYK0mkcF{B@)xW;iug z2)WwqI@`ugb@jF~zpc#hm$|k;bv@v4Bin4BZMOGHI!^%Z$8~-gX;t~vXl>qZ zgfytv6S$?`R^zFy^V__%6fvCP`QGYHRX##uwN`sQ^%LT3Mn%JNE#omh2H1PNV-B^mJ5**&8^djB7xknj?VzRX`&&k%#^E4>?PJzL^cK6h>$qedtMzA8Vfsq=60RU1%WC89yS zQMb*m;wG`>HO#JRNGN8W>`7#Gxy@VUsjGuA zfCEY1f(F|hIEc?*Q(wW=J=f+%)I{|&K7=aQ>ibu(aj!10;lu9cQZ6HF&Sf$eKi;?( zvvSa^=7P+LC1SwQaBzjh$&3aOBZgs--dI3lg8t_)@HrE@IT(Exn=A4+~2*JxJ}{rJmc`IR9dhD z-iPvgl(Q(KC{xFKGj=`dpF~O6cLC}J6WU8rUxh-SVqCw7QW0<0;R<$a2Yvm2{%mCj z<~-P>UA(C4&L-`x5nXqL+a$R|Ze3(a$=|`kJ0(|VQFy1RwNPczU4^PEmZJZ9CSzf_ zC>rdI2K%DHfoO181>O}))87OtB3mEmR3gD%>vEwpcrr@=r=r2r(O`Ep*rVR0GF3n+ zQkU-SL#HhLS>DMqH4;2&%?$57*;<%ADIyCelny1>J7Z5I*k{dDgMBeU|00dtCbcdK zzh4MV$xaii@jBOQ&fxNPeX~)qn6c*4{{WPs%p*{|cA<;HykkqS^{j ztEgi}UjqDJ8s%-#))l-TprB9DO901Iminw25%~mFEFU+B%DVR4b;NGI!R~dY=0*?h zVCuowiP|=up~oxk*061i_l?@D1n?H84I6XuIH0pzLi?Z5ukZ=Kw=`JPg#GNu*s@k_l~ipl(I34{P#=y-dOl={9$i5VQJ;lIr#k{! z(BVaB*$O~$L~fAWav0Ltn-+VNaG9%V@%Kzhr?aCh#Uh??Vg(5LIWCbBaaz-!Pjh6a z2-_Vy9P)ly*)J;XYZa`=#?=fb8d=e!Yx!Um5NE%#R&_;>mJ%SP0(~>0N6QTCK>^ zr-p3M`;Wjv4dsAYBWi|;*M_nZw(fAX%t81XWe77a(5a#6=#)dl$RU$T|2fg4yD`dl zg_xxMGLsO21bi>xKO%T5hlivl-Gi>jUK|U%j_n+4(%sbBH5Lw;j=ek<7M%?#PNiun z@Qx<^?|}27v2#q}L&rp|%|h(UPFzNJLy|5WxB{0l0T+^hRGm?9hdxyOAWqva_3 zt9BgUh`Boe3d@S2kFQcg3FTyaFpHBYN5~im$@wbul*^Zb+A?QcDLU^QS4!L-Q=!xB zn}k2MdiWrW-n4XQ9^4pRV1iuueGakUs|+TH9v#M@Js4CwguE7!E%^z(P7nFzh! zpMg2Z?!Jxpb>FfZX|{;v^;Eu?XsfBXT+L=I}9t96E!!!s6WK(F+uw} z&ioQAw8s$*!vfC@l-qtjm`rN7!z;c^NzK{mqNKJ6Nli0<1Z6tmhuRIKNY~|gZ4ppu z`T$UWW?pmgyyiq+`!Vk{A+Ig^@ABF|(8$PZw};mMDIl_wItIU5gly`JwpW^aF=HSlp z?*eJw-;Zv=e5-H+MKD> zbLx1{)Cv9E4WbKSDfql&sJQ6WA_S%2x0E5b{Z)I}30Gv-I_nJ}kee2R;9zmcqzoxu zG`^+8@#{I>U=Z)^IOq;#5uMS0c4XIjtL>^xCQwocjs~CS+A^tYv6dQgu~-FEMg0e; zo+#-k+2ur9`u&)iiimy;uuexqqaMmC>Tne0J_2Wl_B5Auf`K82^*U0)bvb5Ifq7g7 zX$jj>Jg{T*T`S3-T(NXLMp1&&?Ilzm#STpV@&ef|BSvKvHkxn2Mn`)MvHFAq!%qA9 zxL0H?RVn@kEvd9@y^`8+xL4|!Wl`h@@^U09k*pDSR9M2mWuL`5t{aE2ySl@j^ zSOfj%u&`B4!cH)HtS<&ed%-B`rACwf6V#QMScdToY?-P>uxUeM2&CU4(pJ%EfyflE zHPg0ym>MWCRVzRj$g5q;gV?R@La>i^b=Bxji6hvj1_zLuQ}p`?66}+=FD}C}lCZI) zy(46Oj%2+TvKEmw5QLnnCUZfylOP!+NO|-3^hq zqg6(UjaQnFJvYQf-X5b~s`j-DT;xJS0l+#^(NvE;KcqS!^*<2|0A>49 zZ`h$^L+DN=tT@6Bcf?^y!7RFh+g&est@DJi%Xz}}yx0Csd*hO67JRSG$-)-7-6kv9 zX_)H{yE3TwPB>ohS~|D;RX0YQ4ert1QZ%@|Nxu zqs8rTgnAt7Cp$a=O7fk4*kMb2WGp|9gdP6Hpd>rEiIQBWKVb)6X+Cxqb{HTq^-?t* z`3EArhDe49Hk7+~PdnOSKfVlf`J0J-ue16Trell?D=Rqpz-Qd?D z$d)O5M|c3OaBx_bRE1WPs$ImW(SysOf+$cJ{|GLe^q*0Q>*6%&;>RCeri(q)5h7rQ zn?OmrI162DL_Oh?goG}>VNjAT?k7sp#o2@|c%}K+`_M%%fr*Q%^=n)gFC!4eb@4ve z#VzR1b@4uQamLVvPSFYs{#X}VWvMxM_AxBc)=I96lORp%;-_fUUo<^UQ$Onh)Es2P{)I)C)7bmsN*pj z`9n|7WlvkRMbsI~x7wYJRI=atub$kaQ6Y9u^YjksUo{bW2mE# z_Q1d=)RBs{)=9o$-OwEDh1uK8Y8&=0`n{Z+0k=tYF4Kq-s}2XbJ6***Lm;tpuW-K5_P-o?#9ZTyrZdgynw z&BJc3Nq-Of4xE_yJ5pq9N_S!3lb}2FAr41kss0X8wq7>@d}$nPF?9xqv%dr##?gn; z1$2@8Ic;H4+@K-awQVl{A z@QC`T(WHMJb?(qb1`-Y(GAPNRA12COaOh#~(1?e;(oFf0(&R84dKeCEMHh-SxZ{kk z?>_F(_o6>{=sq~~fZ@Tz$b{%b5l$x||9Eng@2NKCC;;ZCJo%ZaM zuwoBmn%Je{+y;Ay_;JtiG(7<$|Kxkl;}^yxHZt`E!PPoMWg2#Fj?D@P${-%s{Hx=J&b24_w@_w5?F|NLYXi#raVrKa*O*^PI&*l*gc*=>|M8S!A~ijHEZ=M;GMssc)gnoe5kq z$Nl|8+zo1ps_jIoi0&>^^=E-X?|NJ?!$=7NLka9tNIi-h>5;u9HT=Ul@b}_I9L?z# zlllOTFn-Sn0E6n*l>BBEe!z{K6$pP{S{rt|!Y@hK)kh9I&90dfeh)u4VNN5Q*s;a- z;Q+^FNe|l{bnkG&-eCvbv}la!hw#IXup{_RI1oIJyxSc7t(tLhA zTSv6N#g9uQ0q4MZ4`P|oF_{B5jPQWtyW#XM>zc5`8Fm$g4?W3(ClO=>{lzSFlY^aD zJI%o`-tkFs} zaPy27mIYDHFj`m;)XL^9F6w)8pk`SbnIO9xVIp`stQ3WJ;~w7;ImGSJ{Tv8ghCLjx zhadJRf<3TTBzs`L4?1p-+euo5POSOdGO+`c^j9X)gdNtht*#DNa5#5qL_R#nWp7&2 zn&mt^rw9yNvy={BS zb7tpsD5+HckRdsDy`kb@RdI%$uCNQK!5wxNV+FTL(Kmj<)Lz_AGTb>Ipo23?B`#E? z>6AOVa1s>uk*g%a&nJ!W(B_dzdMnA&|@MUTsd++8z z!`_*skrta_?!$zDx!Fki0o#K$Z6 zH$Jw4=}$V>}}x`G|b915*lVNW@U5MglvI2 z=x1vvwQx1u(?Dj-nLH zq%wC&xwFKRTN28x3+3iY>!*iuyY`qB|DB;+`60QiCS=-^QxiCq%jal*@L-$NmaBBN z<-zM*zji6b-ZoR)bUENE+E641ylv*TStaE~B?!H)YYM|}&Si>lILje7FK#iRq@hUb zOWMqEk8SHiIc+BR%C`N**g_(>o3y>it`v@a(|#jS9Gd>%W5FJ}RSI?^;yVgkP1_1v z(@>;su{7;#NY3pDZrutzO_}Iu!S3c(Q*&!tbE{Mn?AeCrL` z^P+URsy~XKkm9*v|7q+sUo{5@o}UsNd|n6+b(IB&(e6e2Jla}UOLnj?vdfJ8|19>N z&B1|~*j(H-_8785k0VdjK8M&8ZJDY1oAhhJb6qT@D%!F{^~c02Jg90>P)k7#D_Fw; zYIK(g_cIe&EWrK$yTqcLSiA!o&f>s7umq0--==Du$-mJltgy>02@=JE)yUtu>5Cg5 zm!Xa#MJ{iw{{ovu-YjpHwU>yo){JiqkGpIvZ|w!N;?E?t49s2*?>|L%Kd0Hc_9g3A zuE!C|lJy;c-7zh-Q^`&j+66QasPNqZsyn8oVK<8dRlrZ9qaEKA2PlW-Lcc$Oe(A7U zvD}WCa(!vvfjoyB&)_&XIN&(k_yJXhvH5o(BK-(r9cnxaklZdil>LeytD+0}uj?h+ zPZ6!pZgf^aVF!hGzvS32Ir|qDMRBU?m&14b$#dVZ{qQN)o@0-@%^f^89X`z;!m|VB z2b+TzprV^dMQxJZnjH>a@Dv6IaevrDl6_A?M#Yo01;OF<3xbz+(lHr)mHg=km@gin zo8+dQCMD7)SxLsQ;Q1fu(ZML1pFTQ1driFR(`;{iGy-U~Eb@n3aGj$4d^%3|PIGQ{?GsPYiv)#JW)VaQs zYY3!&`}~j9z+y;7WiG6^6L+O;DA?xw$q&f*@9`I7Vc=m6{oIP3bTW1tj{CZsvGusV z?7;8z*8sK_iwD;iXM$!CWA%68or6Nqe44T0g^b;vk8n31a?ECI&MYj00>FUJ1H2gU zZomss%z&FeZ;XXuSqUcm58*X;e<*_PheeFGp||Wy5XG>)7EoOkwPKD!9Xa z6=e>ND=TnZVFsR|{yO&lI|1)Q-yW33z%54q9^lM4_-#O8cr*(z!{&!ghptXR0TL!% zh3f!>c@p*KQ0h@$Ls<#fy6rye=!@Q|M<%he{ugb+$l1f}hPA z?+mOdckuT_(tgGEqf5>{wjXqpH~MQg_)CqKA?kp86}ap7v6{(@S&bJ<@H760OZ^p| zfUnA53yNY;Gju|d4U1|SFKPskxS*%A)9~CEciJ}l>k$&yNi$mZr%0BGxWqlW- z{cLEIjb7~U9q1?cnJ!WI_`(=!eM8zM+?g{`IC~!B4r!vq&i0&P7tWvT7RC4fb8v*6 z7e)47A9$Sx{Qz}82gs>@R73&ay#qu2QzT)p*|0?Ng*h1F6f)TV)ew82s%!SK9mrBs zDg%}ErFehEcy9tqJ7wsx9#5yFicPf}0qRED$==6`@rX7vX`Hyuq2Oh6%rxdRq~L+1 zf_wiP1?P)QOg;MnbbO}wY_FzW8r054c{MLyf~z><2^$c20rdT10CnWKCz3ee+rwRnB|T&E@jzr2fV8R z6R>XZ*O%7S*H#8Ll-By|syEeo{g}xQFzXxkv02yzVz{7y*={wD0`PL2o8^Zz=mRsy+3qSkOYorg_q&P zV;{1!W2_fnI_Sx!DhhFa} zHRzyuS}j;rhk%}TCAze_yp+FX0lMR$vqHT$BNA5nO6#kWEWQF1M##bT%uL3M%fR2n zK+ly1di@pX1Y<&93&#U`s?U!FSXt&z@;1XU5LNeJi#yp^oTY(H8_RgiyvGnp`Xoe( zkLmSSRZ+mbA1Jc)wPw=Ho3OMv&?`!PV+cq+{XOT;o$bZv-R?2gGfE+6C^j@az@ECq z{s7~`!e=f)|GGE{RvP~PNWY%=8z94^#SmJtjQ919@jyBF+tG7FBl!J0bwTVEhxfu> zFzG0u+@&N6z!&gTc?j{DLTj=~h8}>={Q?AMheQ*5YRE9OC|vB*M*7Gj6Z9iPBV_$d z!}=*J97R}6GNzwdQMZ{)QoErHlOM(uXqDXp1R#U}9*Axrpz68ULr>l4dDvg-r8i(o zYdsq&#Z&`p-p5`9Hp9EcTjejU*hFiy1aRomZZXqP_d}Pa*l^G2rH}hBT!13a^_}ZI zE2is!ogGh^d7-Xy)fuN-^d3&Bcccg=tBY~pZX6h`q7K5cT^Mx-#JHvCN>tX z)%O*bI`3Px+yVCHPk}v_4TZewa-U}l*e?QmNVEc|3@D?LaI{P40UWC#Z!T6t(JDu& zli;OG98Tb-8+}#+mjQO;eGpQ~eEAkLjkKA99(;H35*wkYgbVEpL}64+<(_C77E@va zBXI24Xg?1_0Kg>?euhU-9UbWf-N^6|k{V}~GD2$wOX5AwA{9&I(h%7^6}<*W+1ThP LIW464-}3n{*+VDk literal 0 HcmV?d00001 diff --git a/hacks/rorschach.hlp b/hacks/rorschach.hlp new file mode 100755 index 00000000..3c198641 --- /dev/null +++ b/hacks/rorschach.hlp @@ -0,0 +1,67 @@ +1 RORSCHACH +Simulate ink-blot patterns + +SYNOPSIS + + $ rorschach [-display host:display.screen] [-foreground color] + [-background color] [-window] [-root] [-mono] [-install] + [-visual visual] [-iterations integer] [-offset integer] + [-xsymmetry] [-ysymmetry] + +2 DESCRIPTION +The rorschach program draws random patterns reminiscent of the +psychological test of same name. + +2 OPTIONS +Rorschach accepts the following options: + + -window +Draw on a newly-created window. This is the default. + + -root +Draw on the root window. + + -mono +If on a color display, pretend we're on a monochrome display. + + -install +Install a private colormap for the window. + + -visual visual +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. + + -iterations integer +How many dots should be drawn each time. Default 4000. + + -offset integer +How far apart the dots should be. Default 4 pixels. + + -xsymmetry +Whether the images should be horizontally symmetrical. Default true. + + -ysymmetry +Whether the images should be vertically symmetrical. Default false. + +2 ENVIRONMENT + DISPLAY +to get the default host and display number. + + XENVIRONMENT +to get the name of a resource file that overrides the global resources +stored in the RESOURCE_MANAGER property. + +2 BUGS +May call your sanity into question. + +2 COPYRIGHT +Copyright (c) 1992 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. + +2 AUTHOR +Jamie Zawinski , 13-aug-92. diff --git a/hacks/rorschach.man b/hacks/rorschach.man new file mode 100755 index 00000000..4619f0ff --- /dev/null +++ b/hacks/rorschach.man @@ -0,0 +1,64 @@ +.TH XScreenSaver 1 "13-aug-92" "X Version 11" +.SH NAME +rorschach - simulate ink-blot patterns +.SH SYNOPSIS +.B rorschach +[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP] [\-background \fIcolor\fP] [\-window] [\-root] [\-mono] [\-install] [\-visual \fIvisual\fP] [\-iterations \fIinteger\fP] [\-offset \fIinteger\fP] [\-xsymmetry] [\-ysymmetry] +.SH DESCRIPTION +The \fIrorschach\fP program draws random patterns reminiscent of the +psychological test of same name. +.SH OPTIONS +.I rorschach +accepts the following options: +.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 \-mono +If on a color display, pretend we're on a monochrome display. +.TP 8 +.B \-install +Install a private colormap for the window. +.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 \-iterations \fIinteger\fP +How many dots should be drawn each time. Default 4000. +.TP 8 +.B \-offset \fIinteger\fP +How far apart the dots should be. Default 4 pixels. +.TP 8 +.B \-xsymmetry +Whether the images should be horizontally symmetrical. Default true. +.TP 8 +.B \-ysymmetry +Whether the images should be vertically symmetrical. Default false. +.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. +.SH BUGS +May call your sanity into question. +.SH SEE ALSO +.BR X (1), +.BR xscreensaver (1) +.SH COPYRIGHT +Copyright \(co 1992 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 , 13-aug-92. diff --git a/hacks/screenhack.c b/hacks/screenhack.c new file mode 100755 index 00000000..b8783c6b --- /dev/null +++ b/hacks/screenhack.c @@ -0,0 +1,260 @@ +/* xscreensaver, Copyright (c) 1992, 1995 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. + * + * And remember: X Windows is to graphics hacking as roman numerals are to + * the square root of pi. + */ + +/* This file contains simple code to open a window or draw on the root. + The idea being that, when writing a graphics hack, you can just link + with this .o to get all of the uninteresting junk out of the way. + + - create a procedure `screenhack(dpy, window)' + + - create a variable `char *progclass' which names this program's + resource class. + + - create a variable `char defaults []' for the default resources. + + - create a variable `XrmOptionDescRec options []' for the command-line, + and `int options_size' which is `XtNumber (options)'. + + And that's it... + */ + +#include "version.h" + +#include +#include +#include +#include +#include +#include + +#ifndef VMS +#include +#else +#include "sys$common:[decw$include.xmu]Error.h" +#endif + +#include "screenhack.h" + +#if XlibSpecificationRelease<5 +#define XPointer char* +#endif + +char *progname; +XrmDatabase db; +Bool mono_p; + +#if __STDC__ +# define P(x) x +#else +# define P(x)() +#endif + + +static XrmOptionDescRec default_options [] = { + { "-root", ".root", XrmoptionNoArg, "True" }, + { "-window", ".root", XrmoptionNoArg, "False" }, + { "-mono", ".mono", XrmoptionNoArg, "True" }, + { "-install", ".installColormap", XrmoptionNoArg, "True" }, + { "-visual", ".visualID", XrmoptionSepArg, 0 } +}; + +static char *default_defaults[] = { + "*root: false", + "*geometry: 500x500", /* this should be .geometry, but nooooo... */ + "*mono: false", + "*installColormap: false", + "*visualID: default", + 0 +}; + +static XrmOptionDescRec *merged_options; +static int merged_options_size; +static char **merged_defaults; + +static void +merge_options P((void)) +{ + int options_sizeof = options_size * sizeof (options[0]); + int defaults_size; + merged_options_size = XtNumber (default_options) + options_size; + merged_options = (XrmOptionDescRec *) + malloc (sizeof (default_options) + options_sizeof); + memcpy (merged_options, options, options_sizeof); + memcpy (merged_options + options_size, default_options, + sizeof (default_options)); + + for (defaults_size = 0; defaults [defaults_size]; defaults_size++); + merged_defaults = (char **) + malloc (sizeof (default_defaults) + (defaults_size * sizeof (char *))); + memcpy (merged_defaults, default_defaults, sizeof (default_defaults)); + memcpy ((merged_defaults - 1 + + (sizeof (default_defaults) / sizeof (default_defaults[0]))), + defaults, ((defaults_size + 1) * sizeof (defaults[0]))); +} + + +/* Make the X errors print out the name of this program, so we have some + clue which one has a bug when they die under the screensaver. + */ + +static int +screenhack_ehandler (dpy, error) + Display *dpy; + XErrorEvent *error; +{ + fprintf (stderr, "\nX error in %s:\n", progname); + if (XmuPrintDefaultErrorMessage (dpy, error, stderr)) + exit (-1); + else + fprintf (stderr, " (nonfatal.)\n"); + return 0; +} + +static Bool +MapNotify_event_p (dpy, event, window) + Display *dpy; + XEvent *event; + XPointer window; +{ + return (event->xany.type == MapNotify && + event->xvisibility.window == (Window) window); +} + +#ifndef VMS +void +#else +int +#endif +main (argc, argv) + int argc; + char **argv; +{ + XtAppContext app; + Widget toplevel; + Display *dpy; + Window window; + Visual *visual; + Colormap cmap; + Bool root_p; + XEvent event; + + merge_options (); + toplevel = XtAppInitialize (&app, progclass, merged_options, + merged_options_size, &argc, argv, + merged_defaults, 0, 0); + dpy = XtDisplay (toplevel); + db = XtDatabase (dpy); + XtGetApplicationNameAndClass (dpy, &progname, &progclass); + XSetErrorHandler (screenhack_ehandler); + if (argc > 1) + { + int i; + int x = 18; + int end = 78; + fprintf (stderr, "%s: unrecognised option \"%s\"\n", progname, argv[1]); + fprintf (stderr, "Options include: "); + for (i = 0; i < merged_options_size; i++) + { + char *sw = merged_options [i].option; + Bool argp = (merged_options [i].argKind == XrmoptionSepArg); + int size = strlen (sw) + (argp ? 6 : 0) + 2; + if (x + size >= end) + { + fprintf (stderr, "\n\t\t "); + x = 18; + } + x += size; + fprintf (stderr, "%s", sw); + if (argp) fprintf (stderr, " "); + if (i != merged_options_size - 1) fprintf (stderr, ", "); + } + fprintf (stderr, ".\n"); + exit (1); + } + + mono_p = get_boolean_resource ("mono", "Boolean"); + if (CellsOfScreen (DefaultScreenOfDisplay (dpy)) <= 2) + mono_p = True; + + root_p = get_boolean_resource ("root", "Boolean"); + if (root_p) + { + XWindowAttributes xgwa; + window = RootWindowOfScreen (XtScreen (toplevel)); + XtDestroyWidget (toplevel); + XGetWindowAttributes (dpy, window, &xgwa); + cmap = xgwa.colormap; + visual = xgwa.visual; + } + else + { + visual = get_visual_resource (dpy, "visualID", "VisualID"); + + XtVaSetValues (toplevel, XtNmappedWhenManaged, False, 0); + XtRealizeWidget (toplevel); + window = XtWindow (toplevel); + + if (visual != DefaultVisualOfScreen (XtScreen (toplevel))) + { + Arg av [20]; + int ac; + unsigned int bg, bd; + Widget new; + cmap = XCreateColormap (dpy, window, visual, AllocNone); + bg = get_pixel_resource ("background", "Background", dpy, cmap); + bd = get_pixel_resource ("borderColor", "Foreground", dpy, cmap); + ac = 0; + XtSetArg (av[ac], XtNvisual, visual); ac++; + XtSetArg (av[ac], XtNcolormap, cmap); ac++; + XtSetArg (av[ac], XtNdepth, get_visual_depth (dpy, visual)); ac++; + XtSetArg (av[ac], XtNbackground, (Pixel) bg); ac++; + XtSetArg (av[ac], XtNborderColor, (Pixel) bd); ac++; + new = XtAppCreateShell (progname, progclass, + topLevelShellWidgetClass, dpy, + av, ac); + XtDestroyWidget (toplevel); + toplevel = new; + } + else if (get_boolean_resource ("installColormap", "InstallColormap")) + { + cmap = XCreateColormap (dpy, window, + DefaultVisualOfScreen (XtScreen (toplevel)), + AllocNone); + XSetWindowColormap (dpy, window, cmap); + } + else + { + cmap = DefaultColormap (dpy, DefaultScreen (dpy)); + } + + XtPopup (toplevel, XtGrabNone); + window = XtWindow (toplevel); + } + + if (!get_boolean_resource ("dontClearWindow", "Boolean")) /* kludge-o-rama */ + { + XSetWindowBackground (dpy, window, + get_pixel_resource ("background", "Background", + dpy, cmap)); + XClearWindow (dpy, window); + } + + if (!root_p && toplevel->core.mapped_when_managed) + /* wait for it to be mapped */ + XIfEvent (dpy, &event, MapNotify_event_p, (XPointer) window); + + XSync (dpy, False); + srandom ((int) time ((time_t *) 0)); + screenhack (dpy, window); +} diff --git a/hacks/screenhack.c_ori b/hacks/screenhack.c_ori new file mode 100755 index 00000000..6c7a0300 --- /dev/null +++ b/hacks/screenhack.c_ori @@ -0,0 +1,247 @@ +/* xscreensaver, Copyright (c) 1992, 1995 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. + * + * And remember: X Windows is to graphics hacking as roman numerals are to + * the square root of pi. + */ + +/* This file contains simple code to open a window or draw on the root. + The idea being that, when writing a graphics hack, you can just link + with this .o to get all of the uninteresting junk out of the way. + + - create a procedure `screenhack(dpy, window)' + + - create a variable `char *progclass' which names this program's + resource class. + + - create a variable `char defaults []' for the default resources. + + - create a variable `XrmOptionDescRec options []' for the command-line, + and `int options_size' which is `XtNumber (options)'. + + And that's it... + */ + +#include "version.h" + +#include +#include +#include +#include +#include +#include +#include +#include "screenhack.h" + +char *progname; +XrmDatabase db; +Bool mono_p; + +#if __STDC__ +# define P(x) x +#else +# define P(x)() +#endif + + +static XrmOptionDescRec default_options [] = { + { "-root", ".root", XrmoptionNoArg, "True" }, + { "-window", ".root", XrmoptionNoArg, "False" }, + { "-mono", ".mono", XrmoptionNoArg, "True" }, + { "-install", ".installColormap", XrmoptionNoArg, "True" }, + { "-visual", ".visualID", XrmoptionSepArg, 0 } +}; + +static char *default_defaults[] = { + "*root: false", + "*geometry: 500x500", /* this should be .geometry, but nooooo... */ + "*mono: false", + "*installColormap: false", + "*visualID: default", + 0 +}; + +static XrmOptionDescRec *merged_options; +static int merged_options_size; +static char **merged_defaults; + +static void +merge_options P((void)) +{ + int options_sizeof = options_size * sizeof (options[0]); + int defaults_size; + merged_options_size = XtNumber (default_options) + options_size; + merged_options = (XrmOptionDescRec *) + malloc (sizeof (default_options) + options_sizeof); + memcpy (merged_options, options, options_sizeof); + memcpy (merged_options + options_size, default_options, + sizeof (default_options)); + + for (defaults_size = 0; defaults [defaults_size]; defaults_size++); + merged_defaults = (char **) + malloc (sizeof (default_defaults) + (defaults_size * sizeof (char *))); + memcpy (merged_defaults, default_defaults, sizeof (default_defaults)); + memcpy ((merged_defaults - 1 + + (sizeof (default_defaults) / sizeof (default_defaults[0]))), + defaults, ((defaults_size + 1) * sizeof (defaults[0]))); +} + + +/* Make the X errors print out the name of this program, so we have some + clue which one has a bug when they die under the screensaver. + */ + +static int +screenhack_ehandler (dpy, error) + Display *dpy; + XErrorEvent *error; +{ + fprintf (stderr, "\nX error in %s:\n", progname); + if (XmuPrintDefaultErrorMessage (dpy, error, stderr)) + exit (-1); + else + fprintf (stderr, " (nonfatal.)\n"); + return 0; +} + +static Bool +MapNotify_event_p (dpy, event, window) + Display *dpy; + XEvent *event; + XPointer window; +{ + return (event->xany.type == MapNotify && + event->xvisibility.window == (Window) window); +} + + +void +main (argc, argv) + int argc; + char **argv; +{ + XtAppContext app; + Widget toplevel; + Display *dpy; + Window window; + Visual *visual; + Colormap cmap; + Bool root_p; + XEvent event; + + merge_options (); + toplevel = XtAppInitialize (&app, progclass, merged_options, + merged_options_size, &argc, argv, + merged_defaults, 0, 0); + dpy = XtDisplay (toplevel); + db = XtDatabase (dpy); + XtGetApplicationNameAndClass (dpy, &progname, &progclass); + XSetErrorHandler (screenhack_ehandler); + if (argc > 1) + { + int i; + int x = 18; + int end = 78; + fprintf (stderr, "%s: unrecognised option \"%s\"\n", progname, argv[1]); + fprintf (stderr, "Options include: "); + for (i = 0; i < merged_options_size; i++) + { + char *sw = merged_options [i].option; + Bool argp = (merged_options [i].argKind == XrmoptionSepArg); + int size = strlen (sw) + (argp ? 6 : 0) + 2; + if (x + size >= end) + { + fprintf (stderr, "\n\t\t "); + x = 18; + } + x += size; + fprintf (stderr, "%s", sw); + if (argp) fprintf (stderr, " "); + if (i != merged_options_size - 1) fprintf (stderr, ", "); + } + fprintf (stderr, ".\n"); + exit (1); + } + + mono_p = get_boolean_resource ("mono", "Boolean"); + if (CellsOfScreen (DefaultScreenOfDisplay (dpy)) <= 2) + mono_p = True; + + root_p = get_boolean_resource ("root", "Boolean"); + if (root_p) + { + XWindowAttributes xgwa; + window = RootWindowOfScreen (XtScreen (toplevel)); + XtDestroyWidget (toplevel); + XGetWindowAttributes (dpy, window, &xgwa); + cmap = xgwa.colormap; + visual = xgwa.visual; + } + else + { + visual = get_visual_resource (dpy, "visualID", "VisualID"); + + XtVaSetValues (toplevel, XtNmappedWhenManaged, False, 0); + XtRealizeWidget (toplevel); + window = XtWindow (toplevel); + + if (visual != DefaultVisualOfScreen (XtScreen (toplevel))) + { + Arg av [20]; + int ac; + unsigned int bg, bd; + Widget new; + cmap = XCreateColormap (dpy, window, visual, AllocNone); + bg = get_pixel_resource ("background", "Background", dpy, cmap); + bd = get_pixel_resource ("borderColor", "Foreground", dpy, cmap); + ac = 0; + XtSetArg (av[ac], XtNvisual, visual); ac++; + XtSetArg (av[ac], XtNcolormap, cmap); ac++; + XtSetArg (av[ac], XtNdepth, get_visual_depth (dpy, visual)); ac++; + XtSetArg (av[ac], XtNbackground, (Pixel) bg); ac++; + XtSetArg (av[ac], XtNborderColor, (Pixel) bd); ac++; + new = XtAppCreateShell (progname, progclass, + topLevelShellWidgetClass, dpy, + av, ac); + XtDestroyWidget (toplevel); + toplevel = new; + } + else if (get_boolean_resource ("installColormap", "InstallColormap")) + { + cmap = XCreateColormap (dpy, window, + DefaultVisualOfScreen (XtScreen (toplevel)), + AllocNone); + XSetWindowColormap (dpy, window, cmap); + } + else + { + cmap = DefaultColormap (dpy, DefaultScreen (dpy)); + } + + XtPopup (toplevel, XtGrabNone); + window = XtWindow (toplevel); + } + + if (!get_boolean_resource ("dontClearWindow", "Boolean")) /* kludge-o-rama */ + { + XSetWindowBackground (dpy, window, + get_pixel_resource ("background", "Background", + dpy, cmap)); + XClearWindow (dpy, window); + } + + if (!root_p && toplevel->core.mapped_when_managed) + /* wait for it to be mapped */ + XIfEvent (dpy, &event, MapNotify_event_p, (XPointer) window); + + XSync (dpy, False); + srandom ((int) time ((time_t *) 0)); + screenhack (dpy, window); +} diff --git a/hacks/screenhack.h b/hacks/screenhack.h new file mode 100755 index 00000000..756095c0 --- /dev/null +++ b/hacks/screenhack.h @@ -0,0 +1,146 @@ +/* xscreensaver, Copyright (c) 1992-1995 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. + */ + +/* Found in Don Hopkins' .plan file: + * + * The color situation is a total flying circus. The X approach to + * device independence is to treat everything like a MicroVax framebuffer + * on acid. A truely portable X application is required to act like the + * persistent customer in the Monty Python ``Cheese Shop'' sketch. Even + * the simplest applications must answer many difficult questions, like: + * + * WHAT IS YOUR DISPLAY? + * display = XOpenDisplay("unix:0"); + * WHAT IS YOUR ROOT? + * root = RootWindow(display, DefaultScreen(display)); + * AND WHAT IS YOUR WINDOW? + * win = XCreateSimpleWindow(display, root, 0, 0, 256, 256, 1, + * BlackPixel(display, DefaultScreen(display)), + * WhitePixel(display, DefaultScreen(display))) + * OH ALL RIGHT, YOU CAN GO ON. + * + * WHAT IS YOUR DISPLAY? + * display = XOpenDisplay("unix:0"); + * WHAT IS YOUR COLORMAP? + * cmap = DefaultColormap(display, DefaultScreen(display)); + * AND WHAT IS YOUR FAVORITE COLOR? + * favorite_color = 0; / * Black. * / + * / * Whoops! No, I mean: * / + * favorite_color = BlackPixel(display, DefaultScreen(display)); + * / * AAAYYYYEEEEE!! (client dumps core & falls into the chasm) * / + * + * WHAT IS YOUR DISPLAY? + * display = XOpenDisplay("unix:0"); + * WHAT IS YOUR VISUAL? + * struct XVisualInfo vinfo; + * if (XMatchVisualInfo(display, DefaultScreen(display), + * 8, PseudoColor, &vinfo) != 0) + * visual = vinfo.visual; + * AND WHAT IS THE NET SPEED VELOCITY OF AN XConfigureWindow REQUEST? + * / * Is that a SubStructureRedirectMask or a ResizeRedirectMask? * / + * WHAT?! HOW AM I SUPPOSED TO KNOW THAT? + * AAAAUUUGGGHHH!!!! (server dumps core & falls into the chasm) + */ + +#ifndef _SCREENHACK_H_ +#define _SCREENHACK_H_ + +#if __STDC__ +#include +#endif + +#ifdef __hpux + /* Which of the ten billion standards does values.h belong to? + What systems always have it? */ +# include +#endif + +#include +#include +#include +#include "vroot.h" + +extern Bool mono_p; +extern char *progname; +extern char *progclass; +extern XrmDatabase db; +extern XrmOptionDescRec options []; +extern int options_size; +extern char *defaults []; + +/* Screw it, we'll just use our own RNG. See xscreensaver/utils/yarandom.c. */ +#include "yarandom.h" + +#ifdef VMS +#include +#include +#include +char *index(char *string, char *c); +#endif + + +#undef P +#if __STDC__ +# define P(x)x +#else +# define P(x)() +#endif + +extern void screenhack P((Display*,Window)); + +#define usleep screenhack_usleep + +extern void screenhack_usleep P((unsigned long)); +extern char *get_string_resource P((char*,char*)); +extern Bool get_boolean_resource P((char*,char*)); +extern int get_integer_resource P((char*,char*)); +extern double get_float_resource P((char*,char*)); +extern unsigned int get_pixel_resource P((char*,char*,Display*,Colormap)); +extern unsigned int get_minutes_resource P((char*,char*)); +extern unsigned int get_seconds_resource P((char*,char*)); + +extern Visual *get_visual_resource P((Display *, char *, char *)); +extern int get_visual_depth P((Display *, Visual *)); + +extern void hsv_to_rgb P((int,double,double,unsigned short*, + unsigned short*,unsigned short*)); +extern void rgb_to_hsv P((unsigned short,unsigned short,unsigned short, + int*,double*,double*)); +extern void cycle_hue P((XColor*,int)); + +extern void make_color_ramp P((int h1, double s1, double v1, + int h2, double s2, double v2, + XColor *pixels, int npixels)); + +extern Pixmap grab_screen_image P((Display *dpy, Window window, int root_p)); +extern void copy_default_colormap_contents P((Display *dpy, Colormap to_cmap, + Visual *to_visual)); + +#if defined (__GNUC__) && (__GNUC__ >= 2) + /* Implement frand using GCC's statement-expression extension. */ + +# define frand(f) \ + ({ double tmp = (((double) random()) / \ + (((double) ((unsigned int)~0)) / ((double) (f+f)))); \ + tmp < 0 ? (-tmp) : tmp; }) + +#else /* not GCC2 - implement frand using a global variable.*/ + +static double _frand_tmp_; +# define frand(f) \ + (_frand_tmp_ = (((double) random()) / \ + (((double) ((unsigned int)~0)) / ((double) (f+f)))), \ + _frand_tmp_ < 0 ? (-_frand_tmp_) : _frand_tmp_) + +#endif /* not GCC2 */ + +#undef P +#endif /* _SCREENHACK_H_ */ diff --git a/hacks/screenhack.h_ori b/hacks/screenhack.h_ori new file mode 100755 index 00000000..9be43672 --- /dev/null +++ b/hacks/screenhack.h_ori @@ -0,0 +1,139 @@ +/* xscreensaver, Copyright (c) 1992-1995 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. + */ + +/* Found in Don Hopkins' .plan file: + * + * The color situation is a total flying circus. The X approach to + * device independence is to treat everything like a MicroVax framebuffer + * on acid. A truely portable X application is required to act like the + * persistent customer in the Monty Python ``Cheese Shop'' sketch. Even + * the simplest applications must answer many difficult questions, like: + * + * WHAT IS YOUR DISPLAY? + * display = XOpenDisplay("unix:0"); + * WHAT IS YOUR ROOT? + * root = RootWindow(display, DefaultScreen(display)); + * AND WHAT IS YOUR WINDOW? + * win = XCreateSimpleWindow(display, root, 0, 0, 256, 256, 1, + * BlackPixel(display, DefaultScreen(display)), + * WhitePixel(display, DefaultScreen(display))) + * OH ALL RIGHT, YOU CAN GO ON. + * + * WHAT IS YOUR DISPLAY? + * display = XOpenDisplay("unix:0"); + * WHAT IS YOUR COLORMAP? + * cmap = DefaultColormap(display, DefaultScreen(display)); + * AND WHAT IS YOUR FAVORITE COLOR? + * favorite_color = 0; / * Black. * / + * / * Whoops! No, I mean: * / + * favorite_color = BlackPixel(display, DefaultScreen(display)); + * / * AAAYYYYEEEEE!! (client dumps core & falls into the chasm) * / + * + * WHAT IS YOUR DISPLAY? + * display = XOpenDisplay("unix:0"); + * WHAT IS YOUR VISUAL? + * struct XVisualInfo vinfo; + * if (XMatchVisualInfo(display, DefaultScreen(display), + * 8, PseudoColor, &vinfo) != 0) + * visual = vinfo.visual; + * AND WHAT IS THE NET SPEED VELOCITY OF AN XConfigureWindow REQUEST? + * / * Is that a SubStructureRedirectMask or a ResizeRedirectMask? * / + * WHAT?! HOW AM I SUPPOSED TO KNOW THAT? + * AAAAUUUGGGHHH!!!! (server dumps core & falls into the chasm) + */ + +#ifndef _SCREENHACK_H_ +#define _SCREENHACK_H_ + +#if __STDC__ +#include +#endif + +#ifdef __hpux + /* Which of the ten billion standards does values.h belong to? + What systems always have it? */ +# include +#endif + +#include +#include +#include +#include "vroot.h" + +extern Bool mono_p; +extern char *progname; +extern char *progclass; +extern XrmDatabase db; +extern XrmOptionDescRec options []; +extern int options_size; +extern char *defaults []; + +/* Screw it, we'll just use our own RNG. See xscreensaver/utils/yarandom.c. */ +#include "yarandom.h" + + +#undef P +#if __STDC__ +# define P(x)x +#else +# define P(x)() +#endif + +extern void screenhack P((Display*,Window)); + +#define usleep screenhack_usleep + +extern void screenhack_usleep P((unsigned long)); +extern char *get_string_resource P((char*,char*)); +extern Bool get_boolean_resource P((char*,char*)); +extern int get_integer_resource P((char*,char*)); +extern double get_float_resource P((char*,char*)); +extern unsigned int get_pixel_resource P((char*,char*,Display*,Colormap)); +extern unsigned int get_minutes_resource P((char*,char*)); +extern unsigned int get_seconds_resource P((char*,char*)); + +extern Visual *get_visual_resource P((Display *, char *, char *)); +extern int get_visual_depth P((Display *, Visual *)); + +extern void hsv_to_rgb P((int,double,double,unsigned short*, + unsigned short*,unsigned short*)); +extern void rgb_to_hsv P((unsigned short,unsigned short,unsigned short, + int*,double*,double*)); +extern void cycle_hue P((XColor*,int)); + +extern void make_color_ramp P((int h1, double s1, double v1, + int h2, double s2, double v2, + XColor *pixels, int npixels)); + +extern Pixmap grab_screen_image P((Display *dpy, Window window, int root_p)); +extern void copy_default_colormap_contents P((Display *dpy, Colormap to_cmap, + Visual *to_visual)); + +#if defined (__GNUC__) && (__GNUC__ >= 2) + /* Implement frand using GCC's statement-expression extension. */ + +# define frand(f) \ + ({ double tmp = (((double) random()) / \ + (((double) ((unsigned int)~0)) / ((double) (f+f)))); \ + tmp < 0 ? (-tmp) : tmp; }) + +#else /* not GCC2 - implement frand using a global variable.*/ + +static double _frand_tmp_; +# define frand(f) \ + (_frand_tmp_ = (((double) random()) / \ + (((double) ((unsigned int)~0)) / ((double) (f+f)))), \ + _frand_tmp_ < 0 ? (-_frand_tmp_) : _frand_tmp_) + +#endif /* not GCC2 */ + +#undef P +#endif /* _SCREENHACK_H_ */ diff --git a/hacks/slidescreen.c b/hacks/slidescreen.c new file mode 100755 index 00000000..6c8ccf71 --- /dev/null +++ b/hacks/slidescreen.c @@ -0,0 +1,253 @@ +/* xscreensaver, Copyright (c) 1992, 1993, 1994 + * 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. + */ + +#include "screenhack.h" + +static int grid_size; +static int pix_inc; +static int hole_x, hole_y; +static int bitmap_w, bitmap_h; +static int xoff, yoff; +static int grid_w, grid_h; +static int delay, delay2; +static GC gc; + +static void +init_slide (dpy, window) + Display *dpy; + Window window; +{ + int i; + XGCValues gcv; + XWindowAttributes xgwa; + int border; + int root_p; + unsigned long fg; + Pixmap pixmap; + Drawable d; + Colormap cmap; + Visual *visual; + + XGetWindowAttributes (dpy, window, &xgwa); + cmap = xgwa.colormap; + visual = xgwa.visual; + + copy_default_colormap_contents (dpy, cmap, visual); + + delay = get_integer_resource ("delay", "Integer"); + delay2 = get_integer_resource ("delay2", "Integer"); + grid_size = get_integer_resource ("gridSize", "Integer"); + pix_inc = get_integer_resource ("pixelIncrement", "Integer"); + border = get_integer_resource ("internalBorderWidth", "InternalBorderWidth"); + fg = get_pixel_resource ("background", "Background", dpy, + /* Pixels always come out of default map. */ + XDefaultColormapOfScreen (xgwa.screen)); + root_p = get_boolean_resource ("root", "Boolean"); + + if (delay < 0) delay = 0; + if (delay2 < 0) delay2 = 0; + if (pix_inc < 1) pix_inc = 1; + if (grid_size < 1) grid_size = 1; + + gcv.foreground = fg; + gcv.function = GXcopy; + gcv.subwindow_mode = IncludeInferiors; + gc = XCreateGC (dpy, window, GCForeground |GCFunction | GCSubwindowMode, + &gcv); + + pixmap = grab_screen_image (dpy, window, root_p); + + XGetWindowAttributes (dpy, window, &xgwa); + bitmap_w = xgwa.width; + bitmap_h = xgwa.height; + + grid_w = bitmap_w / grid_size; + grid_h = bitmap_h / grid_size; + hole_x = random () % grid_w; + hole_y = random () % grid_h; + xoff = (bitmap_w - (grid_w * grid_size)) / 2; + yoff = (bitmap_h - (grid_h * grid_size)) / 2; + + d = (pixmap ? pixmap : window); + + if (border) + { + int i; + for (i = 0; i <= bitmap_w; i += grid_size) + XFillRectangle (dpy, d, gc, xoff+i-border/2, yoff, border, bitmap_h); + for (i = 0; i <= bitmap_h; i += grid_size) + XFillRectangle (dpy, d, gc, xoff, yoff+i-border/2, bitmap_w, border); + } + + if (xoff) + { + XFillRectangle (dpy, d, gc, 0, 0, xoff, bitmap_h); + XFillRectangle (dpy, d, gc, bitmap_w - xoff, 0, xoff, bitmap_h); + } + if (yoff) + { + XFillRectangle (dpy, d, gc, 0, 0, bitmap_w, yoff); + XFillRectangle (dpy, d, gc, 0, bitmap_h - yoff, bitmap_w, yoff); + } + + if (pixmap) XClearWindow (dpy, window); + XSync (dpy, True); + if (delay2) usleep (delay2 * 2); + for (i = 0; i < grid_size; i += pix_inc) + { + XPoint points [3]; + points[0].x = xoff + grid_size * hole_x; + points[0].y = yoff + grid_size * hole_y; + points[1].x = points[0].x + grid_size; + points[1].y = points[0].y; + points[2].x = points[0].x; + points[2].y = points[0].y + i; + XFillPolygon (dpy, window, gc, points, 3, Convex, CoordModeOrigin); + + points[1].x = points[0].x; + points[1].y = points[0].y + grid_size; + points[2].x = points[0].x + i; + points[2].y = points[0].y + grid_size; + XFillPolygon (dpy, window, gc, points, 3, Convex, CoordModeOrigin); + + points[0].x = points[1].x + grid_size; + points[0].y = points[1].y; + points[2].x = points[0].x; + points[2].y = points[0].y - i; + XFillPolygon (dpy, window, gc, points, 3, Convex, CoordModeOrigin); + + points[1].x = points[0].x; + points[1].y = points[0].y - grid_size; + points[2].x = points[1].x - i; + points[2].y = points[1].y; + XFillPolygon (dpy, window, gc, points, 3, Convex, CoordModeOrigin); + + XSync (dpy, True); + if (delay) usleep (delay); + } + + XFillRectangle (dpy, window, gc, + xoff + grid_size * hole_x, + yoff + grid_size * hole_y, + grid_size, grid_size); +} + +static void +slide1 (dpy, window) + Display *dpy; + Window window; +{ + /* this code is a total kludge, but who cares, it works... */ + int i, x, y, ix, iy, dx, dy, dir, w, h, size, inc; + static int last = -1; + do { + dir = random () % 4; + switch (dir) + { + case 0: dx = 0, dy = 1; break; + case 1: dx = -1, dy = 0; break; + case 2: dx = 0, dy = -1; break; + case 3: dx = 1, dy = 0; break; + default: abort (); + } + } while (dir == last || + hole_x + dx < 0 || hole_x + dx >= grid_w || + hole_y + dy < 0 || hole_y + dy >= grid_h); + if (grid_w > 1 && grid_h > 1) + last = (dir == 0 ? 2 : dir == 2 ? 0 : dir == 1 ? 3 : 1); + + switch (dir) + { + case 0: size = 1 + (random()%(grid_h - hole_y - 1)); h = size; w = 1; break; + case 1: size = 1 + (random()%hole_x); w = size; h = 1; break; + case 2: size = 1 + (random()%hole_y); h = size; w = 1; break; + case 3: size = 1 + (random()%(grid_w - hole_x - 1)); w = size; h = 1; break; + default: abort (); + } + + if (dx == -1) hole_x -= (size - 1); + else if (dy == -1) hole_y -= (size - 1); + + ix = x = xoff + (hole_x + dx) * grid_size; + iy = y = yoff + (hole_y + dy) * grid_size; + inc = pix_inc; + for (i = 0; i < grid_size; i += inc) + { + if (inc + i > grid_size) + inc = grid_size - i; + XCopyArea (dpy, window, window, gc, x, y, grid_size * w, grid_size * h, + x - dx * inc, y - dy * inc); + x -= dx * inc; + y -= dy * inc; + switch (dir) + { + case 0: XFillRectangle (dpy, window, gc, + ix, y + grid_size * h, grid_size * w, iy - y); + break; + case 1: XFillRectangle (dpy, window, gc, ix, iy, x - ix, grid_size * h); + break; + case 2: XFillRectangle (dpy, window, gc, ix, iy, grid_size * w, y - iy); + break; + case 3: XFillRectangle (dpy, window, gc, + x + grid_size * w, iy, ix - x, grid_size * h); + break; + } + + XSync (dpy, True); + if (delay) usleep (delay); + } + switch (dir) + { + case 0: hole_y += size; break; + case 1: hole_x--; break; + case 2: hole_y--; break; + case 3: hole_x += size; break; + } +} + + +char *progclass = "SlidePuzzle"; + +char *defaults [] = { + "SlidePuzzle.mappedWhenManaged:false", + "SlidePuzzle.dontClearWindow: true", + "*background: black", + "*gridSize: 70", + "*pixelIncrement: 10", + "*internalBorderWidth: 1", + "*delay: 50000", + "*delay2: 1000000", + 0 +}; + +XrmOptionDescRec options [] = { + { "-grid-size", ".gridSize", XrmoptionSepArg, 0 }, + { "-ibw", ".internalBorderWidth", XrmoptionSepArg, 0 }, + { "-increment", ".pixelIncrement", XrmoptionSepArg, 0 }, + { "-delay", ".delay", XrmoptionSepArg, 0 }, + { "-delay2", ".delay2", XrmoptionSepArg, 0 }, +}; + +int options_size = (sizeof (options) / sizeof (options[0])); + +void +screenhack (dpy, window) + Display *dpy; + Window window; +{ + init_slide (dpy, window); + while (1) + { + slide1 (dpy, window); + if (delay2) usleep (delay2); + } +} diff --git a/hacks/slidescreen.exe_axp b/hacks/slidescreen.exe_axp new file mode 100755 index 0000000000000000000000000000000000000000..fcaf3914c5f6dc971017d5a8b8fb301a9bd1adb4 GIT binary patch literal 35328 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 literal 0 HcmV?d00001 diff --git a/hacks/slidescreen.exe_vax b/hacks/slidescreen.exe_vax new file mode 100755 index 0000000000000000000000000000000000000000..89a4b165541e358dc688c8b78246fb4d5aec578e GIT binary patch literal 18944 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 W(dzOb8yXxWOGAo({QdoE;Qs>Ug|~bF literal 0 HcmV?d00001 diff --git a/hacks/slidescreen.hlp b/hacks/slidescreen.hlp new file mode 100755 index 00000000..87a5c67c --- /dev/null +++ b/hacks/slidescreen.hlp @@ -0,0 +1,70 @@ +1 SLIDESCREEN +Permute the screen image like an 8-puzzle + +SYNOPSIS + + $ slidescreen [-display host:display.screen] [-background color] + [-grid-size pixels] [-ibw pixels] [-increment pixels] + [-delay usecs] [-delay2 usecs] [-window] [-root] [-install] + [-visual visual] + +2 DESCRIPTION +The slidescreen program takes an image of the screen, divides it into +a grid, deletes a random square of that grid, and then randomly slides +one of the neighbors of this "hole" into the hole (and repeat.) + +2 OPTIONS +Slidescreen accepts the following options: + + -window +Draw on a newly-created window. This is the default. + + -root +Draw on the root window. + + -install +Install a private colormap for the window. + + -visual visual +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. + + -grid-size pixels +The size of the grid cells. Default 70 pixels. + + -ibw pixels +The size of the "gutter" between grid cells. Default 1 pixel. + + -increment pixels +How many pixels by which a piece should be moved when sliding to a new +location. Default 10 pixels. + + -delay microseconds +How much of a delay should be introduced between steps of the animation of +the motion of each segment. Default 50000, which is 0.05 seconds. This +is closely related to the -increment parameter. + + -delay microseconds +How much of a delay should be introduced between the end of the motion of +one segment and the beginning of the motion of another. Default 1000000, +which isone second. + +2 ENVIRONMENT + DISPLAY +to get the default host and display number. + + XENVIRONMENT +to get the name of a resource file that overrides the global resources +stored in the RESOURCE_MANAGER property. + +2 COPYRIGHT +Copyright (c) 1992 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. + +2 AUTHOR +Jamie Zawinski , 3-dec-92. diff --git a/hacks/slidescreen.man b/hacks/slidescreen.man new file mode 100755 index 00000000..3d03dc50 --- /dev/null +++ b/hacks/slidescreen.man @@ -0,0 +1,68 @@ +.TH XScreenSaver 1 "3-dec-92" "X Version 11" +.SH NAME +slidescreen - permute the screen image like an 8-puzzle +.SH SYNOPSIS +.B slidescreen +[\-display \fIhost:display.screen\fP] [\-background \fIcolor\fP] [\-grid-size \fIpixels\fP] [\-ibw \fIpixels\fP] [\-increment \fIpixels\fP] [\-delay \fIusecs\fP] [\-delay2 \fIusecs\fP] [\-window] [\-root] [\-install] [\-visual \fIvisual\fP] +.SH DESCRIPTION +The \fIslidescreen\fP program takes an image of the screen, divides it into +a grid, deletes a random square of that grid, and then randomly slides +one of the neighbors of this "hole" into the hole (and repeat.) +.SH OPTIONS +.I slidescreen +accepts the following options: +.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 \-install +Install a private colormap for the window. +.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 \-grid-size \fIpixels\fP +The size of the grid cells. Default 70 pixels. +.TP 8 +.B \-ibw \fIpixels\fP +The size of the "gutter" between grid cells. Default 1 pixel. +.TP 8 +.B \-increment \fIpixels\fP +How many pixels by which a piece should be moved when sliding to a new +location. Default 10 pixels. +.TP 8 +.B \-delay \fImicroseconds\fP +How much of a delay should be introduced between steps of the animation of +the motion of each segment. Default 50000, which is 0.05 seconds. This +is closely related to the \fI\-increment\fP parameter. +.TP 8 +.B \-delay \fImicroseconds\fP +How much of a delay should be introduced between the end of the motion of +one segment and the beginning of the motion of another. Default 1000000, +which isone second. +.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. +.SH SEE ALSO +.BR X (1), +.BR xscreensaver (1) +.SH COPYRIGHT +Copyright \(co 1992 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 , 3-dec-92. diff --git a/hacks/spline.h b/hacks/spline.h new file mode 100755 index 00000000..1c76bb36 --- /dev/null +++ b/hacks/spline.h @@ -0,0 +1,64 @@ +/* + * Copyright (c) 1987, 1988, 1989 Stanford University + * + * 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, and that the name of Stanford not be used in advertising or + * publicity pertaining to distribution of the software without specific, + * written prior permission. Stanford makes no representations about + * the suitability of this software for any purpose. It is provided "as is" + * without express or implied warranty. + * + * STANFORD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, + * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. + * IN NO EVENT SHALL STANFORD BE LIABLE FOR ANY SPECIAL, INDIRECT OR + * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, + * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR + * OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION + * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +/* This code came with the InterViews distribution, and was translated + from C++ to C by Matthieu Devin some time in 1992. + */ + +#ifndef _SPLINE_H_ +#define _SPLINE_H_ + +#include + +#if __STDC__ +# define P(x)x +#else +# define P(x)() +#endif + +#ifdef VMS +typedef unsigned int u_int; +#endif + + +typedef struct _spline +{ + /* input */ + u_int n_controls; + double* control_x; + double* control_y; + + /* output */ + u_int n_points; + XPoint* points; + u_int allocated_points; +} spline; + +spline* make_spline P((u_int size)); +void compute_spline P((spline* s)); +void compute_closed_spline P((spline* s)); +void just_fill_spline P((spline* s)); +void append_spline_points P((spline* s1, spline* s2)); +void spline_bounding_box P((spline* s, XRectangle* rectangle_out)); + +#undef P +#endif /* _SPLINE_H_ */ diff --git a/hacks/vaxobjs.zip b/hacks/vaxobjs.zip new file mode 100755 index 0000000000000000000000000000000000000000..34a7a776048a5e578348cc99bc62a4e12321d6ad GIT binary patch literal 90742 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 UG5`QH(BC{L!&&?a4D{ds0TN|og#Z8m literal 0 HcmV?d00001 diff --git a/hacks/version.h b/hacks/version.h new file mode 100755 index 00000000..a56e38a5 --- /dev/null +++ b/hacks/version.h @@ -0,0 +1,2 @@ +static char *screensaver_id = + "@(#)xscreensaver 1.26, by Jamie Zawinski (jwz@netscape.com)"; diff --git a/hacks/vms.opt b/hacks/vms.opt new file mode 100755 index 00000000..8ce3d236 --- /dev/null +++ b/hacks/vms.opt @@ -0,0 +1,5 @@ +[-.UTILS]UTILS.OLB/LIB +SYS$SHARE:DECW$XMULIBSHR.EXE/SHARE +SYS$SHARE:DECW$XTSHR.EXE/SHARE +SYS$SHARE:DECW$XLIBSHR.EXE/SHARE +SYS$SHARE:VAXCRTL.EXE/SHARE diff --git a/hacks/vms_12.opt b/hacks/vms_12.opt new file mode 100755 index 00000000..953e77d8 --- /dev/null +++ b/hacks/vms_12.opt @@ -0,0 +1,5 @@ +[-.UTILS]UTILS.OLB/LIB +SYS$SHARE:DECW$XMULIBSHRR5.EXE/SHARE +SYS$SHARE:DECW$XTLIBSHRR5.EXE/SHARE +SYS$SHARE:DECW$XLIBSHR.EXE/SHARE +SYS$SHARE:VAXCRTL.EXE/SHARE diff --git a/hacks/vms_axp.opt b/hacks/vms_axp.opt new file mode 100755 index 00000000..64461591 --- /dev/null +++ b/hacks/vms_axp.opt @@ -0,0 +1,4 @@ +[-.UTILS]UTILS.OLB_AXP/LIB +SYS$SHARE:DECW$XMULIBSHR.EXE/SHARE +SYS$SHARE:DECW$XTSHR.EXE/SHARE +SYS$SHARE:DECW$XLIBSHR.EXE/SHARE diff --git a/hacks/vms_axp_12.opt b/hacks/vms_axp_12.opt new file mode 100755 index 00000000..10f94267 --- /dev/null +++ b/hacks/vms_axp_12.opt @@ -0,0 +1,4 @@ +[-.UTILS]UTILS.OLB_AXP/LIB +SYS$SHARE:DECW$XMULIBSHRR5.EXE/SHARE +SYS$SHARE:DECW$XTLIBSHRR5.EXE/SHARE +SYS$SHARE:DECW$XLIBSHR.EXE/SHARE diff --git a/hacks/vms_decc.opt b/hacks/vms_decc.opt new file mode 100755 index 00000000..43d6858f --- /dev/null +++ b/hacks/vms_decc.opt @@ -0,0 +1,4 @@ +[-.UTILS]UTILS.OLB_DECC/LIB +SYS$SHARE:DECW$XMULIBSHR.EXE/SHARE +SYS$SHARE:DECW$XTSHR.EXE/SHARE +SYS$SHARE:DECW$XLIBSHR.EXE/SHARE diff --git a/hacks/vms_decc_12.opt b/hacks/vms_decc_12.opt new file mode 100755 index 00000000..dd6d2f37 --- /dev/null +++ b/hacks/vms_decc_12.opt @@ -0,0 +1,4 @@ +[-.UTILS]UTILS.OLB_DECC/LIB +SYS$SHARE:DECW$XMULIBSHRR5.EXE/SHARE +SYS$SHARE:DECW$XTLIBSHRR5.EXE/SHARE +SYS$SHARE:DECW$XLIBSHR.EXE/SHARE diff --git a/hacks/vroot.h b/hacks/vroot.h new file mode 100755 index 00000000..e6d57646 --- /dev/null +++ b/hacks/vroot.h @@ -0,0 +1,123 @@ +/*****************************************************************************/ +/** Copyright 1991 by Andreas Stolcke **/ +/** Copyright 1990 by Solbourne Computer Inc. **/ +/** Longmont, Colorado **/ +/** **/ +/** All Rights Reserved **/ +/** **/ +/** Permission to use, copy, modify, and distribute this software and **/ +/** its documentation for any purpose and without fee is hereby **/ +/** granted, provided that the above copyright notice appear in all **/ +/** copies and that both that copyright notice and this permis- **/ +/** sion notice appear in supporting documentation, and that the **/ +/** name of Solbourne not be used in advertising **/ +/** in publicity pertaining to distribution of the software without **/ +/** specific, written prior permission. **/ +/** **/ +/** ANDREAS STOLCKE AND SOLBOURNE COMPUTER INC. DISCLAIMS ALL WARRANTIES **/ +/** WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF **/ +/** MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL ANDREAS STOLCKE **/ +/** OR SOLBOURNE BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL **/ +/** DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA **/ +/** OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER **/ +/** TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE **/ +/** OR PERFORMANCE OF THIS SOFTWARE. **/ +/*****************************************************************************/ +/* + * vroot.h -- Virtual Root Window handling header file + * + * This header file redefines the X11 macros RootWindow and DefaultRootWindow, + * making them look for a virtual root window as provided by certain `virtual' + * window managers like swm and tvtwm. If none is found, the ordinary root + * window is returned, thus retaining backward compatibility with standard + * window managers. + * The function implementing the virtual root lookup remembers the result of + * its last invocation to avoid overhead in the case of repeated calls + * on the same display and screen arguments. + * The lookup code itself is taken from Tom LaStrange's ssetroot program. + * + * Most simple root window changing X programs can be converted to using + * virtual roots by just including + * + * #include + * + * after all the X11 header files. It has been tested on such popular + * X clients as xphoon, xfroot, xloadimage, and xaqua. + * It also works with the core clients xprop, xwininfo, xwd, and editres + * (and is necessary to get those clients working under tvtwm). + * It does NOT work with xsetroot; get the xsetroot replacement included in + * the tvtwm distribution instead. + * + * Andreas Stolcke , 9/7/90 + * - replaced all NULL's with properly cast 0's, 5/6/91 + * - free children list (suggested by Mark Martin ), 5/16/91 + * - include X11/Xlib.h and support RootWindowOfScreen, too 9/17/91 + */ + +#ifndef _VROOT_H_ +#define _VROOT_H_ + +#if !defined(lint) && !defined(SABER) +static char vroot_rcsid[] = "$Id: vroot.h,v 1.1 1994/08/25 22:04:24 jwz Exp $"; +#endif + +#include +#include +#include + +static Window +VirtualRootWindowOfScreen(screen) + Screen *screen; +{ + static Screen *save_screen = (Screen *)0; + static Window root = (Window)0; + + if (screen != save_screen) { + Display *dpy = DisplayOfScreen(screen); + Atom __SWM_VROOT = None; + int i; + Window rootReturn, parentReturn, *children; + unsigned int numChildren; + + root = RootWindowOfScreen(screen); + + /* go look for a virtual root */ + __SWM_VROOT = XInternAtom(dpy, "__SWM_VROOT", False); + if (XQueryTree(dpy, root, &rootReturn, &parentReturn, + &children, &numChildren)) { + for (i = 0; i < numChildren; i++) { + Atom actual_type; + int actual_format; + unsigned long nitems, bytesafter; + Window *newRoot = (Window *)0; + + if (XGetWindowProperty(dpy, children[i], + __SWM_VROOT, 0, 1, False, XA_WINDOW, + &actual_type, &actual_format, + &nitems, &bytesafter, + (unsigned char **) &newRoot) == Success + && newRoot) { + root = *newRoot; + break; + } + } + if (children) + XFree((char *)children); + } + + save_screen = screen; + } + + return root; +} + +#undef RootWindowOfScreen +#define RootWindowOfScreen(s) VirtualRootWindowOfScreen(s) + +#undef RootWindow +#define RootWindow(dpy,screen) VirtualRootWindowOfScreen(ScreenOfDisplay(dpy,screen)) + +#undef DefaultRootWindow +#define DefaultRootWindow(dpy) VirtualRootWindowOfScreen(DefaultScreenOfDisplay(dpy)) + +#endif /* _VROOT_H_ */ diff --git a/hacks/xlock.h b/hacks/xlock.h new file mode 100755 index 00000000..19e5fdab --- /dev/null +++ b/hacks/xlock.h @@ -0,0 +1,160 @@ +/* +** Helpful definitions for porting xlock modes to xscreensaver. +** by Charles Hannum, mycroft@ai.mit.edu +** +** for xlock 2.3 and xscreensaver 1.2, 28AUG92 +** +** +** Modified for xlockmore 3.0 by Anthony Thyssen +** on August 1995. +** +** To use, just copy the appropriate file from xlock, add a target +** for it in the Imakefile, and do the following: +** +** 1) If you include math.h, make sure it is before xlock.h. +** 2) Make sure the first thing you do in initfoo() is to call +** XGetWindowAttributes. This is what actually sets up the +** colormap and whatnot. +** 3) Add an appropriate PROGRAM() line at the end of the .c file. +** The information you need for this comes from xlock's file +** resource.c. +** +** That's about all there is to it. +** +** As an added bonus, if you put an empty definition of PROGRAM() in +** xlock's xlock.h, you can now use the code with either xlock or +** xscreensaver. +** +** +** If you make any improvements to this code, please send them to me! +** It could certainly use some more work. +*/ + +#include "screenhack.h" + +#define MAXSCREENS 1 + +static GC gc; +static unsigned long *pixels = 0, fg_pixel, bg_pixel; +static int npixels; +static Colormap cmap; + +static int batchcount; +static unsigned int delay; +static unsigned int cycles; +static double saturation; + +#ifndef min +#define min(a,b) ((a)<(b)?(a):(b)) +#endif + +typedef struct { + GC gc; + int npixels; + u_long *pixels; +} perscreen; + +static perscreen Scr[MAXSCREENS]; +static Display *dsp; + +static int screen = 0; + +static void +My_XGetWindowAttributes (dpy, win, xgwa) + Display *dpy; + Window win; + XWindowAttributes *xgwa; +{ + XGetWindowAttributes (dpy, win, xgwa); + + if (! pixels) { + XGCValues gcv; + XColor color; + int n; + int i, shift; + + cmap = xgwa->colormap; + + i = get_integer_resource ("ncolors", "Integer"); + if (i <= 2) i = 2, mono_p = True; + shift = 360 / i; + pixels = (unsigned long *) calloc (i, sizeof (unsigned long)); + fg_pixel = get_pixel_resource ("foreground", "Foreground", dpy, cmap); + bg_pixel = get_pixel_resource ("background", "Background", dpy, cmap); + if (! mono_p) { + for (npixels = 0; npixels < i; npixels++) { + hsv_to_rgb ((360*npixels)/i, saturation, 1.0, + &color.red, &color.green, &color.blue); + if (! XAllocColor (dpy, cmap, &color)) + break; + pixels[npixels] = color.pixel; + } + } + n = get_integer_resource ("delay", "Usecs"); + if (n >= 0) delay = n; + n = get_integer_resource ("count", "Integer"); + if (n > 0) batchcount = n; + + n = get_integer_resource ("cycles", "Integer"); + if (n >= 0) cycles = n; + + gcv.foreground = fg_pixel; + gcv.background = bg_pixel; + gc = XCreateGC (dpy, win, GCForeground|GCBackground, &gcv); + + XClearWindow (dpy, win); + + Scr[screen].gc = gc; + Scr[screen].npixels = npixels; + Scr[screen].pixels = pixels; + } +} + +#define XGetWindowAttributes(a,b,c) My_XGetWindowAttributes(a,b,c) + +#undef BlackPixel +#define BlackPixel(a,b) bg_pixel +#undef WhitePixel +#define WhitePixel(a,b) fg_pixel +#define mono mono_p + +#define seconds() time((time_t*)0) + +char *defaults[] = { + "*background: black", + "*foreground: white", + "*ncolors: 64", + "*delay: -1", + "*count: -1", + "*cycles: -1", + 0 +}; + +XrmOptionDescRec options[] = { + {"-count", ".count", XrmoptionSepArg, 0}, + {"-ncolors", ".ncolors", XrmoptionSepArg, 0}, + {"-delay", ".delay", XrmoptionSepArg, 0}, + {"-cycles", ".cycles", XrmoptionSepArg, 0}, +}; +int options_size = (sizeof (options) / sizeof (options[0])); + +#define PROGRAM(Y,Z,D,B,C,S) \ +char *progclass = Y; \ + \ +void screenhack (dpy, window) \ + Display *dpy; \ + Window window; \ +{ \ + batchcount = B; \ + delay = D; \ + cycles = C; \ + saturation = S; \ + dsp = dpy; \ + \ + init##Z (window); \ + while (1) { \ + draw##Z (window); \ + XSync (dpy, True); \ + if (delay) usleep (delay); \ + } \ +} diff --git a/hacks/xroger-hack.c b/hacks/xroger-hack.c new file mode 100755 index 00000000..615ade16 --- /dev/null +++ b/hacks/xroger-hack.c @@ -0,0 +1,103 @@ +/* xscreensaver, Copyright (c) 1991-1994 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. + */ + +#include "screenhack.h" + +char *progclass = "XRoger"; + +char *defaults [] = { + "XRoger.background: black", + "XRoger.foreground: red", + "*delay: 5", + 0 +}; + +XrmOptionDescRec options [] = { + { "-delay", ".delay", XrmoptionSepArg, 0 } +}; +int options_size = (sizeof (options) / sizeof (options[0])); + +#if __STDC__ +extern void skull (Display *, Window, GC, GC, int, int, int, int); +#endif + +void +screenhack (dpy, window) + Display *dpy; + Window window; +{ + double delta = 0.005; + XGCValues gcv; + Colormap cmap; + GC draw_gc, erase_gc; + unsigned int fg; + XColor color, color2, color3; + int delay = get_integer_resource ("delay", "Integer"); + XWindowAttributes xgwa; + XGetWindowAttributes (dpy, window, &xgwa); + cmap = xgwa.colormap; + gcv.foreground = get_pixel_resource ("background", "Background", dpy, cmap); + erase_gc = XCreateGC (dpy, window, GCForeground, &gcv); + fg = get_pixel_resource ("foreground", "Foreground", dpy, cmap); + if (fg == gcv.foreground) + fg = ((gcv.foreground == WhitePixel (dpy, DefaultScreen (dpy))) + ? BlackPixel (dpy, DefaultScreen (dpy)) + : WhitePixel (dpy, DefaultScreen (dpy))); + gcv.foreground = fg; + draw_gc = XCreateGC (dpy, window, GCForeground, &gcv); + color.pixel = gcv.foreground; + XQueryColor (dpy, cmap, &color); + while (1) + { + int w, h, ww, hh, x, y; + time_t start_time; + XWindowAttributes xgwa; + XGetWindowAttributes (dpy, window, &xgwa); + w = xgwa.width; + h = xgwa.height; + + ww = 100 + random () % (w - 100); + hh = 100 + random () % (h - 100); + if (ww < 10) ww = 50; + if (hh < 10) hh = 50; + if (ww < hh) hh = ww; + else ww = hh; + x = random () % (w - ww); + y = random () % (h - hh); + XClearWindow (dpy, window); + skull (dpy, window, draw_gc, erase_gc, x, y, ww, hh); + XSync (dpy, True); + start_time = time ((time_t *) 0); + if (mono_p) + sleep (delay); + else + while (start_time + delay > time ((time_t *) 0)) + { + int h; + double s, v; + color2 = color; + rgb_to_hsv (color2.red, color2.green, color2.blue, &h, &s, &v); + v += delta; + if (v >= 1.0) v = 1.0, delta = -delta; + if (v <= 0.7) v = 0.7, delta = -delta; + hsv_to_rgb (h, s, v, &color2.red, &color2.green, &color2.blue); + color3 = color2; + if (XAllocColor (dpy, cmap, &color3)) + { + XSetForeground (dpy, draw_gc, color3.pixel); + color2.pixel = color3.pixel; + XFreeColors (dpy, cmap, &color.pixel, 1, 0); + } + color = color2; + usleep (20000); + } + } +} diff --git a/hacks/xroger.exe_axp b/hacks/xroger.exe_axp new file mode 100755 index 0000000000000000000000000000000000000000..790adf187fc7cc5fe54ded6ef0b65d4366eaf86c GIT binary patch literal 34304 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 literal 0 HcmV?d00001 diff --git a/hacks/xroger.exe_vax b/hacks/xroger.exe_vax new file mode 100755 index 0000000000000000000000000000000000000000..22415a6e57a93b81bcdf066e6daefbd4396bf0eb GIT binary patch literal 17408 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 literal 0 HcmV?d00001 diff --git a/hacks/xroger.hlp b/hacks/xroger.hlp new file mode 100755 index 00000000..90d25c96 --- /dev/null +++ b/hacks/xroger.hlp @@ -0,0 +1,54 @@ +1 XROGER +Throbbing X logo, of a sort + +SYNOPSIS + + $ xroger [-display host:display.screen] [-foreground color] + [-background color] [-window] [-root] [-mono] [-install] + [-visual visual] + +2 DESCRIPTION +The xroger program displays a replacement for the X logo with a more +accurate Look and Feel. + +2 OPTIONS +Xroger accepts the following options: + + -window +Draw on a newly-created window. This is the default. + + -root +Draw on the root window. + + -mono +If on a color display, pretend we're on a monochrome display. + + -install +Install a private colormap for the window. + + -visual visual +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. + +2 ENVIRONMENT + DISPLAY +to get the default host and display number. + + XENVIRONMENT +to get the name of a resource file that overrides the global resources +stored in the RESOURCE_MANAGER property. + +2 BUGS +It should also drip blood while making a horrible screeching noise. + +2 COPYRIGHT +Copyright (c) 1992, 1993 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 fnord 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 fnord this software for any purpose. It is provided "as +is" without express or fnord implied warranty. + +2 AUTHOR +Jamie Zawinski , 13-aug-92. diff --git a/hacks/xroger.man b/hacks/xroger.man new file mode 100755 index 00000000..799f5005 --- /dev/null +++ b/hacks/xroger.man @@ -0,0 +1,52 @@ +.TH XScreenSaver 1 "22-mar-93" "X Version 11" +.SH NAME +xroger - throbbing X logo, of a sort +.SH SYNOPSIS +.B xroger +[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP] [\-background \fIcolor\fP] [\-window] [\-root] [\-mono] [\-install] [\-visual \fIvisual\fP] +.SH DESCRIPTION +The \fIxroger\fP program displays a replacement for the X logo with a more +accurate Look and Feel. +.SH OPTIONS +.I xroger +accepts the following options: +.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 \-mono +If on a color display, pretend we're on a monochrome display. +.TP 8 +.B \-install +Install a private colormap for the window. +.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. +.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. +.SH BUGS +It should also drip blood while making a horrible screeching noise. +.SH SEE ALSO +.BR X (1), +.BR xscreensaver (1) +.SH COPYRIGHT +Copyright \(co 1992, 1993 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 fnord 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 fnord this software for any purpose. It is provided "as +is" without express or fnord implied warranty. +.SH AUTHOR +Jamie Zawinski , 13-aug-92. diff --git a/hacks/yarandom.h b/hacks/yarandom.h new file mode 100755 index 00000000..53b22fd8 --- /dev/null +++ b/hacks/yarandom.h @@ -0,0 +1,19 @@ +#undef random +#undef rand +#undef drand48 +#undef srandom +#undef srand +#undef srand48 + +#define random() ya_random() +#define srandom(i) ya_rand_init(0) + +#undef P +#if __STDC__ +# define P(x)x +#else +# define P(x)() +#endif + +extern unsigned int ya_random P((void)); +extern void ya_rand_init P((unsigned int)); diff --git a/imakefile b/imakefile new file mode 100755 index 00000000..d7ec7c62 --- /dev/null +++ b/imakefile @@ -0,0 +1,53 @@ +/* + * Imakefile file for xscreensaver, Copyright (c) 1991-1994 Jamie Zawinski. + * + * You should not need to edit this file; edit config.h instead. + * + */ + +#include "config.h" + + TARFILES = README Imakefile config.h screenblank.txt + TAR = tar + COMPRESS = compress + COMPRESS_EXT = Z +/**/# COMPRESS = gzip --verbose --best +/**/# COMPRESS_EXT = gz + +all:: utils/Makefile driver/Makefile hacks/Makefile + cd utils ; $(MAKE) $@ CC="$(CC)" CCOPTIONS="$(CCOPTIONS)" CDEBUGFLAGS="$(CDEBUGFLAGS)" + cd driver ; $(MAKE) $@ CC="$(CC)" CCOPTIONS="$(CCOPTIONS)" CDEBUGFLAGS="$(CDEBUGFLAGS)" + cd hacks ; $(MAKE) $@ CC="$(CC)" CCOPTIONS="$(CCOPTIONS)" CDEBUGFLAGS="$(CDEBUGFLAGS)" + +clean install install.man:: utils/Makefile driver/Makefile hacks/Makefile + cd utils ; $(MAKE) $@ BINDIR=$(BINDIR) XAPPLOADDIR=$(XAPPLOADDIR) + cd driver ; $(MAKE) $@ BINDIR=$(BINDIR) XAPPLOADDIR=$(XAPPLOADDIR) + cd hacks ; $(MAKE) $@ BINDIR=$(BINDIR) XAPPLOADDIR=$(XAPPLOADDIR) + +Makefiles:: utils/Makefile driver/Makefile hacks/Makefile + +utils/Makefile: utils/Imakefile config.h + cd utils ; $(IMAKE_CMD) -DTOPDIR=$(TOP) -DCURDIR=$(CURRENT_DIR)/utils +driver/Makefile: driver/Imakefile config.h + cd driver ; $(IMAKE_CMD) -DTOPDIR=$(TOP) -DCURDIR=$(CURRENT_DIR)/driver +hacks/Makefile: hacks/Imakefile config.h + cd hacks ; $(IMAKE_CMD) -DTOPDIR=$(TOP) -DCURDIR=$(CURRENT_DIR)/hacks + +/* This really makes me sick... */ +tar: utils/Makefile driver/Makefile hacks/Makefile + @NAME=`sed -n \ + 's/[^0-9]*\([0-9]\.[0-9][0-9]*\).*/xscreensaver-\1/p' utils/version.h` ; \ + rm -f $$NAME ; ln -s . $$NAME ; \ + FILES= ; \ + for subdir in driver utils hacks ; do \ + cd $$subdir ; \ + FILES="$$FILES `make echo_tarfiles \ + | grep -v '^make\[' \ + | sed \"s|^|$$subdir/|g;s| | $$subdir/|g\" \ + ` "; \ + cd .. ; done ; \ + echo creating tar file $${NAME}.tar.$(COMPRESS_EXT)... ; \ + $(TAR) -vchf - \ + `echo $(TARFILES) $$FILES | sed "s|^|$$NAME/|g; s| | $$NAME/|g" ` \ + | $(COMPRESS) > $${NAME}.tar.$(COMPRESS_EXT) ; \ + rm $$NAME diff --git a/patche_1.txt b/patche_1.txt new file mode 100755 index 0000000000000000000000000000000000000000..336194d06b48b4f25650dfaedb30c03beaa77d0e GIT binary patch literal 5378 zcmeHLU2hx56`iDMgH409Xqpy9P~d7UhoVibMN<9{Wye-zTDB9(s%WVyl7Lw54#}~W zJL{QUT8d%xulB9Tzv#KMONp}O`o(=HkOgFOcV_O~uQ~V3{ik?f^rYkU9^G$tI(~0s z=l)*zUX+BB(B#1jWn`jK8Q5eHM0(;=`S@Gr2Q|_drCylEc%f^(z1_{_&2nLfmfCG< z`m}nzeUn?IHww537f4AIRTf2_mo%Z$4N;_D)DH`Ib?s!(kyni;)Mux@P6}T!k zH&183OIvYW^oqf=j<=sm%8j%%RY?eYXex~+m+7QYG5oNkCloX2OROJ{>p#DT+myxvh zgeTLfKEXbchT*><)K_UPCz-Ulno7FsQx@_X8ma^Wwx_wpba)EwI`>3Da~NPBupr- zg;V4T)|^>@ZE7l^vJqAs4Us zuniJeQLHgC(wUMF5vG>L8g6MgXUJpt2NHQrl<4S)GnyjF@sUNoEW8+jgr^I*MMYzd ziQ9~WIg%-&9jRp)VRd0U$bu(g`TaiPTd}x6w5hWbqekPLmLi;+wOhC7z8a|hz}vHRY^qdrLjv+85gi5*93n=h0B&42|Jg3 zyzW!6h;+&Mps3-=mw02hagsp3?du}XioBoctjOFxHQuKuC8;63fV8nLl9=p~%7~@M zDopf<2Kv~|z6yDGSma3NeS0z)=%n0XtY7rUDvo8^FBe&{a5fv@0I3(u`9Lg+o8>%c zaKQ{#Bc+js;Z`Ox%KOiYFmWf(ia&})Z>G%I=ilM0TM+BMOKZWqd@dH>5YQ2Ssw6m% z%!%d|pNPeogbu%BuCvt{f(H=RfZ^FNJmZ0^ghpV;LRwkpTnjr!xV6 zoaybpu*czUzgFYdnoogzjsxsJ-P`Z_|JCE~|LlAyJbEa+rLD?44qJ>u&_iu@G{s3=qTnqB&V9WZejNddx{$Wz?l=6ch0B9G=Isj%=ish6Qggyo( z#Q?K;Z$5wx2ac}ZjQCi9;nMp3xa4IvqJb4HYUTd{n@AxB?|mrqZzij=ccxSCykGMlc3A z2CH3ct>x^P)#iX;^=(8U(FS^)7IAoN9KvBCD(FuX4pC)`V_L%alyd?e8YYr!YAhc( z|Cc2nc5qoAX!uQ~QBuGWGUu3M1rQTqa$7)a#4sA8q;py4AN3EwQSO4JFip6CB9MQu z-|hcxe`DwA{&s)6+v{y?b^S`^QXaNuCIi58-aukaQ1hTqg4E{!kv*p384tq5N<^SQ zB`&fCxIvi)SkK`dfVA;|iw{L%GC|SBa%4I9jpJJbkf#Qr=DRA(G$X;^AB2a@Ma($` zP?kkksqi4XH1DU6Qo_fT{0uu-FvjXvG)&V0TM(g-gt+k z^Q(D#dbIPjy9F{h6CobIL&n>+>2)`s?A(9f`n*5y+<6?RZ1+m+mqS$0j`)=z&-)*+=8wcTS|?Y;McUJnoWhm{R6}v;D>g5ye=eAQ z(qWg!=!%=NF8*A8Wnt&0uY>o!6rW;r1H8du)cPvkzUtE(k3;k;HaF|Ht1tLXShgi|-fJgB$ykcB6M!kJdhtf}^-shlH3U6m zmw#4CV(lQU{&DsGQv9|0<&~;q@cWe?>CPRh9n|QnuV6n$_~DUeIkNxeNUI#_x)J6{ zr)%2fNWWGWAMy8>r=zS46GR=kz+WlXKkI@N0wJzBduI{d1z#P-)VhYZ1$^^hA zK!LykK<1cymDB+DXlcSE=sHOtoJ@Ss-az?AL?IcMSMZ-@M;$@InB7cphey|fTLvYE zuYtD#XuxKf5d+1L_7$_40DW+H&oKn%pg3vi$gvD?Q{7;?fjAZ!b~a1G!-^qOcBZ~5 zcmoW(uHbsBNA2=fO3VrKAweqcK-5_qOm33tk!QySsJzZR`5`5`! wdnPvWt(`tZcCFQ1T>&1rUgS9`Z@w(yR$L0KT9s4>Ecobdx?9ql3r@fM2W4_(CIA2c literal 0 HcmV?d00001 diff --git a/pm.mail b/pm.mail new file mode 100755 index 00000000..db8e0f0f --- /dev/null +++ b/pm.mail @@ -0,0 +1,169 @@ +Hello Patrick! + + Just looked at the Xscreensaver-program you ported + + +In the utils-subdir: + + grabscreen.c + +Add a + +#ifdef VMS +# include +#endif + +at the beginning of the file to get the function prototype for sleep. + + strings.c + +Add a + +#include + +at the beginning of the file to get various function prototypes right. + +In the driver subdirectory: + +Remove all the defines from the compile*.com files. +VMS gets defined anyhow and the redefinition of the macros already defined in config.h +produce nasty messages during compilation. + + demo.c + +add at line 539 + + void (*notice_events_timer_ptr)() = notice_events_timer; + +and change line 561 to + + XtAppAddTimeOut (app, notice_events_timeout, notice_events_timer_ptr, + + lock.c + +Change to + +#ifndef VMS +#include +#else +#include "pwd.h" +extern char *getenv(); +extern int validate_user(char *name, char *password); +extern void ungrab_keyboard_and_mouse P((void)); +#endif + + to get the function prototypes for validate_user and ungrab_keyboard_and_mouse. + + subprocs.c + +#include "config.h" + +to pick up the no_setuid macro. + + + +In the ifndef VMS-part add + +#include /* to pickup close */ +#include /* to pickup getpid */ + +remove there + +#include "resource.h" + +since this only causes troubles with undefined structures. + + + visual.c + +#ifdef VMS +#include /*to pick up strcmp*/ +#endif + + windows.c + +#ifdef VMS +#include /*to pick up getpid*/ +#endif + + xscreensaver.c + +add + +#ifdef VMS +#include /*for sleep*/ +#include /*for getpid*/ +#endif + +add + void (*notice_events_timer_ptr)() = notice_events_timer; + void (*activate_lock_timer_ptr)() = activate_lock_timer; + +at the beginning of the demo_mode function and change the subsequent +XtAppAddTimeOut invocations to use the pointer instead of the function + + cycle_id = XtAppAddTimeOut (app, cycle, cycle_timer_ptr, 0); + + lock_id = XtAppAddTimeOut (app,lock_timeout, + activate_lock_timer_ptr,0); + + +chane the definition of now in timestring to + + const time_t now = time ((time_t *) 0); + +to keep the subseqent ctime happy. + + getpwnam.c + +#include +#include +#include + + make explicit casts to unsigned long in ItemList structure. + + hpwd.c + +Add + +#include +#include + + to get the sys$... and strlen function prototypes. +Change sys$getsyiw to lowercase. +make VMS_VERSION a static char + + validate.c + +Add a + +#ifdef VMS +#include +#include "vmsutil.h" +int hash_vms_password(char *output_buf,char *input_buf,int input_length, + char *username,int encryption_type,unsigned short salt); +#endif + +at the beginning of the file to get strlen, bcmp and hash_vms_password +function prototypes right. + +In the hacks subdir: + +screenhack.h + +add + +#include +#include +#include +char *index(char *string, char *c); + +to the VMS specific part (it is needed e.g. for sin, sleep, getpid) + +Change '\n' to (char *)'\n' to stick to the function prototype. + + In noseguy.c + +#ifndef VMS'd the from_program case since this uses popen and pclose and +if we ever enter there the program will bomb anyhow. + diff --git a/readme b/readme new file mode 100755 index 00000000..55b1ae20 --- /dev/null +++ b/readme @@ -0,0 +1,133 @@ + +To build: + + - read the comments in `config.h' and edit it as appropriate + - xmkmf ; make + - make install install.man + +The xscreensaver program waits until the keyboard and mouse have been idle +for a period, and then runs a graphics demo chosen at random. It turns off +as soon as there is any mouse or keyboard activity. + +The purpose of xscreensaver is to display pretty pictures on your screen +when it is not in use, in keeping with the philosophy that unattended +monitors should always be doing something interesting, just like they do +in the movies. + +However, xscreensaver can also be used as a screen locker, to prevent +others from using your terminal while your are away. + +The benefit that this program has over the combination of the xlock and +xautolock programs is the ease with which new graphics hacks can be +installed: you don't need to recompile this program to add a new display +mode, you just change some resource settings. Any program which can be +invoked in such a way that it draws on the root window of the screen can +now be used as a screensaver without modification. The programs that +are being run as screensavers don't need to have any special knowledge +about what it means to be a screensaver. + +The XIDLE or MIT-SCREEN-SAVER server extensions will be used if you have them. + +Unfortunately, locking doesn't work if you don't have Motif. + +Also included are several graphics hacks for use as screensavers. There's +nothing magic about these: they're just programs that draw on the root +window, which are pointed at by the screensaver's default resource settings. + + qix - My own implementation of this, with many more options + than you would have thought qix could have. + helix - Generates spirally "stringart" patterns. + pedal - Draws a different kind of spirally pattern. + rorschach - Random inkblot patterns. + attraction - A bouncing ball demo, or a qix-like demo, or a wild + color-cycling thing, with some odd rules. + greynetic - Random colored/stippled rectangles. + rocks - Flying through an asteroid field. + blitspin - Rotate a bitmap using bitblts. + imsmap - Generates random maps or cloud formations. + hypercube - 2d projection of a hypercube rotating on all four axes. + slidescreen - Divides the screen into a grid and plays a 16-puzzle on it. + decayscreen - A melting effect. + halo - Random circular patterns. + pyro - Fireworks. Looks a lot like the version in xlock. + hopalong - Fractals. I snarfed this code from xlock. + flame - Fractals. Also from xlock. + noseguy - A guy with a big nose wanders around the screen saying + things. I snarfed this code from xnlock. + maze - This is the X maze demo modified to take a -root option + so that it works with xscreensaver. + lmorph - morphing line drawings. + +All of these will pop up their own window unless given that -root option. +See their man pages for more details. + +Other reasonable things to use as screensavers, if you have them, are + + xdaliclock -root -builtin2 - melting digital clock + xswarm -r 2>&- - swimming sperm + xwave -root - random 3d graphs + xbouncebits - bounce arbitrary bitmaps around + ico -r - it's dull, but it's there + xv -root file.gif -quit - they don't all have to animate! + xsplinefun - bouncing splines + kaleid -root - qix-like kaleidescope patterns + xfishtank -c black -d -r 1 - fish (use version 2.0 or later) + +You can get all of these from the contrib directory on ftp.x.org. If you +know of (or write) any other interesting programs that can be used as +screensavers, please let me know! + +The latest version of xscreensaver is always ftpable from ftp.x.org. You can +also get it from my web page at http://www.netscape.com/people/jwz/. + + -- Jamie Zawinski + + +Changes since 1.25: Added `lmorph' hack. + Added viscosity and mouse-control to attraction. + Fixed possible bad color choices in qix and attraction. + Added ramp-mode to halo. + Added a new RNG, which is faster and more portable + than using the RNG in libc. + Made locking work on SCO. + Various other minor tweaks that I don't remember. +Changes since 1.24: Made it capture the stdout/stderr of its subprocesses + and present them on the screensaver window itself. + Made demo mode work correctly with non-default visuals + and color maps, instead of always using the defaults. + Added -visual argument to all included screenhacks. + Support for the R6 MIT-SCREEN-SAVER server extension. + Made the demo mode list scroll properly. + Added `pedal' hack. +Changes since 1.23: Fixed some private-colormap oddities in slidescreen, + decayscreen, and xroger. Fixed apparent conservation- + of-mass problem in pyro; made the shrapnel round. +Changes since 1.22: Minor tweaks for IRIX5; fixed locking race condition. +Changes since 1.21: Minor tweaks for X11R6. + Fixes for non-default visuals. +Changes since 1.20: Fixed bug in color blitspin; added default image. + Added diagnostics to noseguy. Fixed off-by-one + error in flame. Added some missing casts. +Changes since 1.18: Added `flame' hack. + Fixed a minor Motif dialog text field bug. + Fixed yet another XPointer-not-defined-in-R4 bug. +Changes since 1.17: Added support for shadow password files. + Fixed some Motif-related locking bugs. + Added diagnostics when locking is disabled. + Made blitspin able to use the XPM library. + Added `decayscreen' hack. +Changes since 1.16: Added `halo' hack. +Changes since 1.15: Portability fixes. +Changes since 1.14: Broke the driver up into more source files. + Moved the hacks into their own directory. + Made all `time' parameters accept the 00:00:00 syntax, + so that even the parameters which are normally read as + `minutes' can be specified in seconds. + Added colormap cycling to `imsmap'. + Made hyper work with K&R compilers. +Changes since 1.13: Added `orbit' option to `attraction' hack. + Added `lock-timeout' option. + Cleaned up options of `maze' hack. +Changes since 1.8: Added demo mode, and locking. + Added `maze' hack. + Added `norotate' option to `rocks' hack. diff --git a/screenblank.txt b/screenblank.txt new file mode 100755 index 00000000..17621585 --- /dev/null +++ b/screenblank.txt @@ -0,0 +1,46 @@ +From mrapple@quack.kfu.com Mon Apr 26 18:31:07 1993 +Newsgroups: alt.hackers +From: mrapple@quack.kfu.com (Nick Sayer) +Subject: screenblank and xautolock living in harmony +Organization: The Duck Pond public unix: +1 408 249 9630, log in as 'guest'. +Date: 23 Apr 1993 19:26:57 UTC + + +I have a Sun and use xinit to start X. This presented a problem. +If I use xautolock or xscreensaver to save the screen, then after +a period of inactivity screenblank would turn the video off despite +'xset s off'. If I didn't run screenblank, then who would take care of +the display when X wasn't running? + +The hack that saved the day was to include this in .xinitrc: + +( + +while true ; do +sleep 360 +touch /dev/console +done + +) & +killblank=$! + +[start up all the clients, etc, etc. Wait for the window manager +to die, then ] + +kill $killblank + +The result is that screenblank is kept safely out of the way when X +is running and left to do its job otherwise. + +Yes, I know using XDM would solve this problem. + +No, I'm probably not the first to think of this. + +You're welcome. + +-- +Nick Sayer | "Dear Sexy Nickers. I don't half fancy +N6QQQ @ N0ARY.#NOCAL.CA.USA.NOAM | you. Meet me at the lift at 5:30 and ++1 408 249 9630, log in as 'guest' | we'll get it together." +PGP 2.2 public key via finger | -- Mr. Lucas + diff --git a/setup.com b/setup.com new file mode 100755 index 00000000..70ebce17 --- /dev/null +++ b/setup.com @@ -0,0 +1,31 @@ +$! Xscreensaver - definition of various DCL symbols +$ set NOON +$ set def [.HACKS] +$ mydisk = f$trnlmn("SYS$DISK") +$ mydir = mydisk+f$directory() +$ attrac*tion :== $'mydir'attraction +$ blitspin :== $'mydir'blitspin +$ decays*creen:== $'mydir'decayscreen +$ flame :== $'mydir'flame +$ greyne*tic :== $'mydir'greynetic +$ halo :== $'mydir'halo +$ helix :== $'mydir'helix +$ hopalong :== $'mydir'hopalong +$ hypercube :== $'mydir'hypercube +$ imsmap :== $'mydir'imsmap +$ lmorph :== $'mydir'lmorph +$ maze :== $'mydir'maze +$ noseguy :== $'mydir'noseguy +$ pedal :== $'mydir'pedal +$ pyro :== $'mydir'pyro +$ qix :== $'mydir'qix +$ rocks :== $'mydir'rocks +$ rorsch*ach :== $'mydir'rorschach +$ slidescr*een:== $'mydir'slidescreen +$ xroger :== $'mydir'xroger +$ set def [-.DRIVER] +$ mydir = mydisk+f$directory() +$ xscreensaver :== $'mydir'xscreensaver +$ xscreen*command :== $'mydir'xscreensaver-command +$ set def [-] +$ exit diff --git a/utils/ad2c b/utils/ad2c new file mode 100755 index 00000000..1435e554 --- /dev/null +++ b/utils/ad2c @@ -0,0 +1,38 @@ +#!/bin/sh +# +# ad2c : Convert app-defaults file to C strings decls. +# +# George Ferguson, ferguson@cs.rcohester.edu, 12 Nov 1990. +# 19 Mar 1991 : gf +# Made it self-contained. +# 6 Jan 1992 : mycroft@gnu.ai.mit.edu (Charles Hannum) +# Removed use of "-n" and ":read" label since Gnu and +# IBM sed print pattern space on "n" command. Still works +# with Sun sed, of course. +# 7 Jan 1992: matthew@sunpix.East.Sun.COM (Matthew Stier) +# Escape quotes after escaping backslashes. +# + +sed ' +/^!/d +/^$/d +s/\\/\\\\/g +s/\\$//g +s/"/\\"/g +s/^/"/ +: test +/\\$/b slash +s/$/",/ +p +d +: slash +n +/^!/d +/^$/d +s/"/\\"/g +s/\\\\/\\/g +s/\\n/\\\\n/g +s/\\t/\\\\t/g +s/\\f/\\\\f/g +s/\\b/\\\\b/g +b test' "$@" diff --git a/utils/compile.com b/utils/compile.com new file mode 100755 index 00000000..67e0ee8b --- /dev/null +++ b/utils/compile.com @@ -0,0 +1,15 @@ +$ def sys sys$library: +$ CC/DEFINE=VMS FADE.C +$ CC/DEFINE=VMS GRABSCREEN.C +$ CC/DEFINE=VMS HSV.C +$ CC/DEFINE=VMS RESOURCES.C +$ CC/DEFINE=VMS SPLINE.C +$ CC/DEFINE=VMS USLEEP.C +$ CC/DEFINE=VMS XROGER.C +$ CC/DEFINE=VMS STRINGS.C +$ CC/DEFINE=VMS YARANDOM.C +$ CC/DEFINE=VMS UNIX_TIMES.C +$ CC/DEFINE=VMS VISUAL.C +$! lib/cre utils.olb +$! lib utils.olb *.obj +$! delete/noconf *.obj; diff --git a/utils/compile_axp.com b/utils/compile_axp.com new file mode 100755 index 00000000..f99db283 --- /dev/null +++ b/utils/compile_axp.com @@ -0,0 +1,14 @@ +$ CC/DECC/PREFIX=ALL/DEFINE=VMS FADE.C +$ CC/DECC/PREFIX=ALL/DEFINE=VMS GRABSCREEN.C +$ CC/DECC/PREFIX=ALL/DEFINE=VMS HSV.C +$ CC/DECC/PREFIX=ALL/DEFINE=VMS RESOURCES.C +$ CC/DECC/PREFIX=ALL/DEFINE=VMS SPLINE.C +$ CC/DECC/PREFIX=ALL/DEFINE=VMS USLEEP.C +$ CC/DECC/PREFIX=ALL/DEFINE=VMS XROGER.C +$ CC/DECC/PREFIX=ALL/DEFINE=VMS STRINGS.C +$ CC/DECC/PREFIX=ALL/DEFINE=VMS YARANDOM.C +$ CC/DECC/PREFIX=ALL/DEFINE=VMS UNIX_TIMES.C +$ CC/DECC/PREFIX=ALL/DEFINE=VMS VISUAL.C +$! lib/cre utils.olb_axp +$! lib utils.olb_axp *.obj +$! delete/noconf *.obj; diff --git a/utils/compile_decc.com b/utils/compile_decc.com new file mode 100755 index 00000000..2034e9b4 --- /dev/null +++ b/utils/compile_decc.com @@ -0,0 +1,14 @@ +$ CC/DECC/PREFIX=ALL/DEFINE=VMS FADE.C +$ CC/DECC/PREFIX=ALL/DEFINE=VMS GRABSCREEN.C +$ CC/DECC/PREFIX=ALL/DEFINE=VMS HSV.C +$ CC/DECC/PREFIX=ALL/DEFINE=VMS RESOURCES.C +$ CC/DECC/PREFIX=ALL/DEFINE=VMS SPLINE.C +$ CC/DECC/PREFIX=ALL/DEFINE=VMS USLEEP.C +$ CC/DECC/PREFIX=ALL/DEFINE=VMS XROGER.C +$ CC/DECC/PREFIX=ALL/DEFINE=VMS STRINGS.C +$ CC/DECC/PREFIX=ALL/DEFINE=VMS YARANDOM.C +$ CC/DECC/PREFIX=ALL/DEFINE=VMS UNIX_TIMES.C +$ CC/DECC/PREFIX=ALL/DEFINE=VMS VISUAL.C +$! lib/cre utils.olb_decc +$! lib utils.olb_decc *.obj +$! delete/noconf *.obj; diff --git a/utils/fade.c b/utils/fade.c new file mode 100755 index 00000000..40fe9ddd --- /dev/null +++ b/utils/fade.c @@ -0,0 +1,176 @@ +/* xscreensaver, Copyright (c) 1992 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. + */ + +#if __STDC__ +# include +#endif + +#include +#include +#include + +#if __STDC__ +# define P(x)x +#else +# define P(x)() +#endif + +extern int get_visual_class P((Display *, Visual *)); +extern void screenhack_usleep P((int)); +#define usleep screenhack_usleep + +#define MAX_COLORS 4096 +static XColor orig_colors [MAX_COLORS]; +static XColor current_colors [MAX_COLORS]; +static int ncolors; + +Colormap +copy_colormap (dpy, cmap, into_cmap) + Display *dpy; + Colormap cmap, into_cmap; +{ + int i; + Screen *screen = DefaultScreenOfDisplay (dpy); + Visual *visual = DefaultVisualOfScreen (screen); + Window window = RootWindowOfScreen (screen); + int vclass = get_visual_class (dpy, visual); + + ncolors = CellsOfScreen (screen); + + /* If this is a colormap on a mono visual, or one with insanely many + color cells, bug out. */ + if (ncolors <= 2 || ncolors > MAX_COLORS) + return 0; + /* If this is a non-writable visual, bug out. */ + if (vclass == StaticGray || vclass == StaticColor || vclass == TrueColor) + return 0; + + if (! into_cmap) + into_cmap = XCreateColormap (dpy, window, visual, AllocAll); + if (! cmap) + cmap = DefaultColormap (dpy, DefaultScreen (dpy)); + for (i = 0; i < ncolors; i++) + orig_colors [i].pixel = i; + XQueryColors (dpy, cmap, orig_colors, ncolors); + XStoreColors (dpy, into_cmap, orig_colors, ncolors); + return into_cmap; +} + +void +blacken_colormap (dpy, cmap) + Display *dpy; + Colormap cmap; +{ + int i; + for (i = 0; i < ncolors; i++) + { + current_colors [i].pixel = i; + current_colors [i].red = current_colors [i].green = + current_colors [i].blue = 0; + } + XStoreColors (dpy, cmap, current_colors, ncolors); +} + + +void +fade_colormap (dpy, cmap, cmap2, seconds, ticks, out_p) + Display *dpy; + Colormap cmap, cmap2; + int seconds, ticks; + Bool out_p; +{ + int i; + int steps = seconds * ticks; + XEvent dummy_event; + + if (! cmap2) + return; + + for (i = 0; i < ncolors; i++) + orig_colors [i].pixel = i; + XQueryColors (dpy, cmap, orig_colors, ncolors); + memcpy (current_colors, orig_colors, ncolors * sizeof (XColor)); + + for (i = (out_p ? steps : 0); + (out_p ? i > 0 : i < steps); + (out_p ? i-- : i++)) + { + int j; + for (j = 0; j < ncolors; j++) + { + current_colors[j].red = orig_colors[j].red * i / steps; + current_colors[j].green = orig_colors[j].green * i / steps; + current_colors[j].blue = orig_colors[j].blue * i / steps; + } + XStoreColors (dpy, cmap2, current_colors, ncolors); + XSync (dpy, False); + + /* If there is user activity, bug out. + We put the event back so that the calling code can notice it too. + It would be better to not remove it at all, but that's harder + because Xlib has such a non-design for this kind of crap, and + in this application it doesn't matter if the events end up out + of order, so in the grand unix tradition we say "fuck it" and + do something that mostly works for the time being. + */ + if (XCheckMaskEvent (dpy, (KeyPressMask | KeyReleaseMask | + ButtonPressMask | ButtonReleaseMask | + PointerMotionMask), + &dummy_event)) + { + XPutBackEvent (dpy, &dummy_event); + return; + } + + usleep (1000000 / (ticks * 2)); /* the 2 is a hack... */ + } +} + +#if 0 + + +char *progclass = "foo"; + +char *defaults [] = { + 0 +}; + +XrmOptionDescRec options [] = {0}; +int options_size = 0; + +void +screenhack (dpy, w) + Display *dpy; + Window w; +{ + Colormap cmap = DefaultColormap (dpy, DefaultScreen (dpy)); + Colormap cmap2 = copy_colormap (dpy, cmap, 0); + + int seconds = 1; + int ticks = 30 * seconds; + int delay = 1; + + while (1) + { + XSync (dpy, False); + XGrabServer (dpy); + XInstallColormap (dpy, cmap2); + fade_colormap (dpy, cmap, cmap2, seconds, ticks, True); + if (delay) sleep (delay); + fade_colormap (dpy, cmap, cmap2, seconds, ticks, False); + XInstallColormap (dpy, cmap); + XUngrabServer (dpy); + XSync (dpy, False); + if (delay) sleep (delay); + } +} + +#endif diff --git a/utils/grabscreen.c b/utils/grabscreen.c new file mode 100755 index 00000000..384cbedd --- /dev/null +++ b/utils/grabscreen.c @@ -0,0 +1,211 @@ +/* xscreensaver, Copyright (c) 1992, 1993, 1994 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. + */ + +/* This file contains code for grabbing an image of the screen to hack its + bits. This is a little tricky, since doing this involves the need to tell + the difference between drawing on the actual root window, and on the fake + root window used by the screensaver, since at this level the illusion + breaks down... + */ + +#if __STDC__ +#include +#include +#endif + +#ifdef __DECC +typedef char * caddr_t; +#endif + +#include +#include +#include + +#ifdef VMS +#include +#if XlibSpecificationRelease<5 +#define XPointer char* +#endif +#endif + +static Bool +MapNotify_event_p (dpy, event, window) + Display *dpy; + XEvent *event; + XPointer window; +{ + return (event->xany.type == MapNotify && + event->xvisibility.window == (Window) window); +} + + +#if __STDC__ +static Bool screensaver_window_p (Display *, Window); +#endif + +static Bool +screensaver_window_p (dpy, window) + Display *dpy; + Window window; +{ + Atom type; + int format; + unsigned long nitems, bytesafter; + char *version; + if (XGetWindowProperty (dpy, window, + XInternAtom (dpy, "_SCREENSAVER_VERSION", False), + 0, 1, False, XA_STRING, + &type, &format, &nitems, &bytesafter, + (unsigned char **) &version) + == Success + && type != None) + return True; + return False; +} + +Pixmap +grab_screen_image (dpy, window, root_p) + Display *dpy; + Window window; + int root_p; +{ + Pixmap pixmap = 0; + XWindowAttributes xgwa; + + XGetWindowAttributes (dpy, window, &xgwa); + + if (screensaver_window_p (dpy, window)) + { + /* note: this assumes vroot.h didn't encapsulate the XRootWindowOfScreen + function, only the RootWindowOfScreen macro... */ + Window real_root = XRootWindowOfScreen (DefaultScreenOfDisplay (dpy)); + + XSetWindowBackgroundPixmap (dpy, window, None); + + /* prevent random viewer of the screen saver (locker) from messing + with windows. We don't check whether it succeeded, because what + are our options, really... */ + XGrabPointer (dpy, real_root, True, ButtonPressMask|ButtonReleaseMask, + GrabModeAsync, GrabModeAsync, None, None, CurrentTime); + XGrabKeyboard (dpy, real_root, True, GrabModeSync, GrabModeAsync, + CurrentTime); + + XUnmapWindow (dpy, window); + XSync (dpy, True); + sleep (5); /* wait for everyone to swap in and handle exposes... */ + XMapRaised (dpy, window); + + XUngrabPointer (dpy, CurrentTime); + XUngrabKeyboard (dpy, CurrentTime); + + XSync (dpy, True); + } + else if (root_p) + { + XGCValues gcv; + GC gc; + gcv.function = GXcopy; + gcv.subwindow_mode = IncludeInferiors; + gc = XCreateGC (dpy, window, GCFunction | GCSubwindowMode, &gcv); + pixmap = XCreatePixmap(dpy, window, xgwa.width, xgwa.height, xgwa.depth); + XCopyArea (dpy, RootWindowOfScreen (xgwa.screen), pixmap, gc, + xgwa.x, xgwa.y, xgwa.width, xgwa.height, 0, 0); + XFreeGC (dpy, gc); + XSetWindowBackgroundPixmap (dpy, window, pixmap); + } + else + { + XEvent event; + XSetWindowBackgroundPixmap (dpy, window, None); + XMapWindow (dpy, window); + XFlush (dpy); + XIfEvent (dpy, &event, MapNotify_event_p, (XPointer) window); + XSync (dpy, True); + } + return pixmap; +} + + +/* 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. + */ +void +copy_default_colormap_contents (dpy, to_cmap, to_visual) + Display *dpy; + Colormap to_cmap; + Visual *to_visual; +{ + Screen *screen = DefaultScreenOfDisplay (dpy); + 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; + int requested; + 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); + + requested = max_cells; + while (requested > 0) + { + if (XAllocColorCells (dpy, to_cmap, False, 0, 0, pixels, requested)) + { + /* Got all the pixels we asked for. */ + for (i = 0; i < requested; i++) + new_colors[i] = old_colors [pixels[i]]; + XStoreColors (dpy, to_cmap, new_colors, requested); + } + else + { + /* We didn't get all/any of the pixels we asked for. This time, ask + for half as many. (If we do get all that we ask for, we ask for + the same number again next time, so we only do O(log(n)) server + roundtrips.) */ + requested = requested / 2; + } + } + + free (old_colors); + free (new_colors); + free (pixels); +} diff --git a/utils/grabscreen.c_ori b/utils/grabscreen.c_ori new file mode 100755 index 00000000..692e42e1 --- /dev/null +++ b/utils/grabscreen.c_ori @@ -0,0 +1,200 @@ +/* xscreensaver, Copyright (c) 1992, 1993, 1994 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. + */ + +/* This file contains code for grabbing an image of the screen to hack its + bits. This is a little tricky, since doing this involves the need to tell + the difference between drawing on the actual root window, and on the fake + root window used by the screensaver, since at this level the illusion + breaks down... + */ + +#if __STDC__ +#include +#include +#endif + +#include +#include +#include + +static Bool +MapNotify_event_p (dpy, event, window) + Display *dpy; + XEvent *event; + XPointer window; +{ + return (event->xany.type == MapNotify && + event->xvisibility.window == (Window) window); +} + + +#if __STDC__ +static Bool screensaver_window_p (Display *, Window); +#endif + +static Bool +screensaver_window_p (dpy, window) + Display *dpy; + Window window; +{ + Atom type; + int format; + unsigned long nitems, bytesafter; + char *version; + if (XGetWindowProperty (dpy, window, + XInternAtom (dpy, "_SCREENSAVER_VERSION", False), + 0, 1, False, XA_STRING, + &type, &format, &nitems, &bytesafter, + (unsigned char **) &version) + == Success + && type != None) + return True; + return False; +} + +Pixmap +grab_screen_image (dpy, window, root_p) + Display *dpy; + Window window; + int root_p; +{ + Pixmap pixmap = 0; + XWindowAttributes xgwa; + + XGetWindowAttributes (dpy, window, &xgwa); + + if (screensaver_window_p (dpy, window)) + { + /* note: this assumes vroot.h didn't encapsulate the XRootWindowOfScreen + function, only the RootWindowOfScreen macro... */ + Window real_root = XRootWindowOfScreen (DefaultScreenOfDisplay (dpy)); + + XSetWindowBackgroundPixmap (dpy, window, None); + + /* prevent random viewer of the screen saver (locker) from messing + with windows. We don't check whether it succeeded, because what + are our options, really... */ + XGrabPointer (dpy, real_root, True, ButtonPressMask|ButtonReleaseMask, + GrabModeAsync, GrabModeAsync, None, None, CurrentTime); + XGrabKeyboard (dpy, real_root, True, GrabModeSync, GrabModeAsync, + CurrentTime); + + XUnmapWindow (dpy, window); + XSync (dpy, True); + sleep (5); /* wait for everyone to swap in and handle exposes... */ + XMapRaised (dpy, window); + + XUngrabPointer (dpy, CurrentTime); + XUngrabKeyboard (dpy, CurrentTime); + + XSync (dpy, True); + } + else if (root_p) + { + XGCValues gcv; + GC gc; + gcv.function = GXcopy; + gcv.subwindow_mode = IncludeInferiors; + gc = XCreateGC (dpy, window, GCFunction | GCSubwindowMode, &gcv); + pixmap = XCreatePixmap(dpy, window, xgwa.width, xgwa.height, xgwa.depth); + XCopyArea (dpy, RootWindowOfScreen (xgwa.screen), pixmap, gc, + xgwa.x, xgwa.y, xgwa.width, xgwa.height, 0, 0); + XFreeGC (dpy, gc); + XSetWindowBackgroundPixmap (dpy, window, pixmap); + } + else + { + XEvent event; + XSetWindowBackgroundPixmap (dpy, window, None); + XMapWindow (dpy, window); + XFlush (dpy); + XIfEvent (dpy, &event, MapNotify_event_p, (XPointer) window); + XSync (dpy, True); + } + return pixmap; +} + + +/* 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. + */ +void +copy_default_colormap_contents (dpy, to_cmap, to_visual) + Display *dpy; + Colormap to_cmap; + Visual *to_visual; +{ + Screen *screen = DefaultScreenOfDisplay (dpy); + 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; + int requested; + 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); + + requested = max_cells; + while (requested > 0) + { + if (XAllocColorCells (dpy, to_cmap, False, 0, 0, pixels, requested)) + { + /* Got all the pixels we asked for. */ + for (i = 0; i < requested; i++) + new_colors[i] = old_colors [pixels[i]]; + XStoreColors (dpy, to_cmap, new_colors, requested); + } + else + { + /* We didn't get all/any of the pixels we asked for. This time, ask + for half as many. (If we do get all that we ask for, we ask for + the same number again next time, so we only do O(log(n)) server + roundtrips.) */ + requested = requested / 2; + } + } + + free (old_colors); + free (new_colors); + free (pixels); +} diff --git a/utils/hsv.c b/utils/hsv.c new file mode 100755 index 00000000..c5109120 --- /dev/null +++ b/utils/hsv.c @@ -0,0 +1,120 @@ +/* xscreensaver, Copyright (c) 1992 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. + */ + +/* This file contains some utility routines for randomly picking the colors + to hack the screen with. + */ + +#include + +void +#if __STDC__ +hsv_to_rgb (int h, double s, double v, + unsigned short *r, unsigned short *g, unsigned short *b) +#else +hsv_to_rgb (h,s,v, r,g,b) + int h; /* 0 - 360 */ + double s, v; /* 0.0 - 1.0 */ + unsigned short *r, *g, *b; /* 0 - 65535 */ +#endif +{ + double H, S, V, R, G, B; + double p1, p2, p3; + double f; + int i; + S = s; V = v; + H = (h % 360) / 60.0; + i = H; + f = H - i; + p1 = V * (1 - S); + p2 = V * (1 - (S * f)); + p3 = V * (1 - (S * (1 - f))); + if (i == 0) { R = V; G = p3; B = p1; } + else if (i == 1) { R = p2; G = V; B = p1; } + else if (i == 2) { R = p1; G = V; B = p3; } + else if (i == 3) { R = p1; G = p2; B = V; } + else if (i == 4) { R = p3; G = p1; B = V; } + else { R = V; G = p1; B = p2; } + *r = R * 65535; + *g = G * 65535; + *b = B * 65535; +} + +void +#if __STDC__ +rgb_to_hsv (unsigned short r, unsigned short g, unsigned short b, + int *h, double *s, double *v) +#else +rgb_to_hsv (r,g,b, h,s,v) + unsigned short r, g, b; /* 0 - 65535 */ + int *h; /* 0 - 360 */ + double *s, *v; /* 0.0 - 1.0 */ +#endif +{ + double R, G, B, H, S, V; + double cmax, cmin; + double cmm; + int imax; + R = ((double) r) / 65535.0; + G = ((double) g) / 65535.0; + B = ((double) b) / 65535.0; + cmax = R; cmin = G; imax = 1; + if ( cmax < G ) { cmax = G; cmin = R; imax = 2; } + if ( cmax < B ) { cmax = B; imax = 3; } + if ( cmin > B ) { cmin = B; } + cmm = cmax - cmin; + V = cmax; + if (cmm == 0) + S = H = 0; + else + { + S = cmm / cmax; + if (imax == 1) H = (G - B) / cmm; + else if (imax == 2) H = 2.0 + (B - R) / cmm; + else if (imax == 3) H = 4.0 + (R - G) / cmm; + if (H < 0) H += 6.0; + } + *h = (H * 60.0); + *s = S; + *v = V; +} + + +void +make_color_ramp (h1, s1, v1, h2, s2, v2, + pixels, npixels) + int h1, h2; /* 0 - 360 */ + double s1, s2, v1, v2; /* 0.0 - 1.0 */ + XColor *pixels; + int npixels; +{ + int dh = (h2 - h1) / npixels; + double ds = (s2 - s1) / npixels; + double dv = (v2 - v1) / npixels; + int i; + for (i = 0; i < npixels; i++) + hsv_to_rgb ((h1 += dh), (s1 += ds), (v1 += dv), + &pixels [i].red, &pixels [i].green, &pixels [i].blue); +} + + +void +cycle_hue (color, degrees) + XColor *color; + int degrees; +{ + int h; + double s, v; + rgb_to_hsv (color->red, color->green, color->blue, + &h, &s, &v); + h = (h + degrees) % 360; + hsv_to_rgb (h, s, v, &color->red, &color->green, &color->blue); +} diff --git a/utils/imakefile b/utils/imakefile new file mode 100755 index 00000000..5f61d60a --- /dev/null +++ b/utils/imakefile @@ -0,0 +1,24 @@ +/* + * Imakefile file for xscreensaver, Copyright (c) 1993, 1995 Jamie Zawinski. + * + * You should not need to edit this file; edit ../config.h instead. + * + */ + +#include "../config.h" + +#ifdef NO_SELECT + DEFINES = R5ISMS -DNO_SELECT +#else + DEFINES = R5ISMS +#endif + SRCS = fade.c hsv.c resources.c spline.c usleep.c xroger.c \ + grabscreen.c visual.c yarandom.c + OBJS = fade.o hsv.o resources.o spline.o usleep.o xroger.o \ + grabscreen.o visual.o yarandom.o + TARFILES = README Imakefile ad2c $(SRCS) spline.h yarandom.h version.h + +all:: $(OBJS) + +echo_tarfiles: + @echo $(TARFILES) diff --git a/utils/readme b/utils/readme new file mode 100755 index 00000000..2f5bc119 --- /dev/null +++ b/utils/readme @@ -0,0 +1,6 @@ + +This directory contains various utilities that are used both by the +screensaver driver and by the demo programs; for example, a portable +implementation of usleep(), and code for manipulating color maps. + +If you have compilation problems, check the parameters in ../config.h. diff --git a/utils/resources.c b/utils/resources.c new file mode 100755 index 00000000..e76143c7 --- /dev/null +++ b/utils/resources.c @@ -0,0 +1,245 @@ +/* xscreensaver, Copyright (c) 1992 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. + */ + +#if __STDC__ +#include +#include +#endif + +#include +#include +#include + +/* Resource functions. Assumes: */ + +extern char *progname; +extern char *progclass; +extern XrmDatabase db; + +#if __STDC__ +char *get_string_resource (char *res_name, char *res_class); +int parse_time (char *string, Bool seconds_default_p, Bool silent_p); +static unsigned int get_time_resource (char *res_name, char *res_class, + Bool sec_p); +#endif + +#ifndef isupper +# define isupper(c) ((c) >= 'A' && (c) <= 'Z') +#endif +#ifndef _tolower +# define _tolower(c) ((c) - 'A' + 'a') +#endif + +char * +get_string_resource (res_name, res_class) + char *res_name, *res_class; +{ + XrmValue value; + char *type; + char full_name [1024], full_class [1024]; + strcpy (full_name, progname); + strcat (full_name, "."); + strcat (full_name, res_name); + strcpy (full_class, progclass); + strcat (full_class, "."); + strcat (full_class, res_class); + if (XrmGetResource (db, full_name, full_class, &type, &value)) + { + char *str = (char *) malloc (value.size + 1); + strncpy (str, (char *) value.addr, value.size); + str [value.size] = 0; + return str; + } + return 0; +} + +Bool +get_boolean_resource (res_name, res_class) + char *res_name, *res_class; +{ + char *tmp, buf [100]; + char *s = get_string_resource (res_name, res_class); + char *os = s; + if (! s) return 0; + for (tmp = buf; *s; s++) + *tmp++ = isupper (*s) ? _tolower (*s) : *s; + *tmp = 0; + free (os); + + if (!strcmp (buf, "on") || !strcmp (buf, "true") || !strcmp (buf, "yes")) + return 1; + if (!strcmp (buf,"off") || !strcmp (buf, "false") || !strcmp (buf,"no")) + return 0; + fprintf (stderr, "%s: %s must be boolean, not %s.\n", + progname, res_class, buf); + return 0; +} + +int +get_integer_resource (res_name, res_class) + char *res_name, *res_class; +{ + int val; + char c, *s = get_string_resource (res_name, res_class); + if (!s) return 0; + if (1 == sscanf (s, " %d %c", &val, &c)) + { + free (s); + return val; + } + fprintf (stderr, "%s: %s must be an integer, not %s.\n", + progname, res_name, s); + free (s); + return 0; +} + +double +get_float_resource (res_name, res_class) + char *res_name, *res_class; +{ + double val; + char c, *s = get_string_resource (res_name, res_class); + if (! s) return 0.0; + if (1 == sscanf (s, " %lf %c", &val, &c)) + { + free (s); + return val; + } + fprintf (stderr, "%s: %s must be a float, not %s.\n", + progname, res_name, s); + free (s); + return 0.0; +} + + +unsigned int +get_pixel_resource (res_name, res_class, dpy, cmap) + char *res_name, *res_class; + Display *dpy; + Colormap cmap; +{ + XColor color; + char *s = get_string_resource (res_name, res_class); + if (!s) goto DEFAULT; + + if (! XParseColor (dpy, cmap, s, &color)) + { + fprintf (stderr, "%s: can't parse color %s\n", progname, s); + goto DEFAULT; + } + if (! XAllocColor (dpy, cmap, &color)) + { + fprintf (stderr, "%s: couldn't allocate color %s\n", progname, s); + goto DEFAULT; + } + free (s); + return color.pixel; + DEFAULT: + if (s) free (s); + return (strcmp (res_class, "Background") + ? WhitePixel (dpy, DefaultScreen (dpy)) + : BlackPixel (dpy, DefaultScreen (dpy))); +} + + +int +parse_time (string, seconds_default_p, silent_p) + char *string; + Bool seconds_default_p, silent_p; +{ + unsigned int h, m, s; + char c; +#ifndef VMS + if (3 == sscanf (string, " %u : %2u : %2u %c", &h, &m, &s, &c)) + ; + else if (2 == sscanf (string, " : %2u : %2u %c", &m, &s, &c) || + 2 == sscanf (string, " %u : %2u %c", &m, &s, &c)) + h = 0; + else if (1 == sscanf (string, " : %2u %c", &s, &c)) + h = m = 0; + else if (1 == sscanf (string, " %u %c", + (seconds_default_p ? &s : &m), &c)) +#else +#ifdef __DECC + if (3 == sscanf (string, " %u : %2u : %2u %c", &h, &m, &s, &c)) + ; + else if (2 == sscanf (string, " : %2u : %2u %c", &m, &s, &c) || + 2 == sscanf (string, " %u : %2u %c", &m, &s, &c)) + h = 0; + else if (1 == sscanf (string, " : %2u %c", &s, &c)) + h = m = 0; + else if (1 == sscanf (string, " %u %c", + (seconds_default_p ? &s : &m), &c)) +#else /* For good old VAX C */ + if (3 == sscanf (string, " %d : %2d : %2d %c", &h, &m, &s, &c)) + ; + else if (2 == sscanf (string, " : %2d : %2d %c", &m, &s, &c) || + 2 == sscanf (string, " %d : %2d %c", &m, &s, &c)) + h = 0; + else if (1 == sscanf (string, " : %2d %c", &s, &c)) + h = m = 0; + else if (1 == sscanf (string, " %d %c", + (seconds_default_p ? &s : &m), &c)) +#endif /* __DECC */ +#endif /* VMS */ + { + h = 0; + if (seconds_default_p) m = 0; + else s = 0; + } + else + { + if (! silent_p) + fprintf (stderr, "%s: invalid time interval specification \"%s\".\n", + progname, string); + return -1; + } + if (s >= 60 && (h != 0 || m != 0)) + { + if (! silent_p) + fprintf (stderr, "%s: seconds > 59 in \"%s\".\n", progname, string); + return -1; + } + if (m >= 60 && h > 0) + { + if (! silent_p) + fprintf (stderr, "%s: minutes > 59 in \"%s\".\n", progname, string); + return -1; + } + return ((h * 60 * 60) + (m * 60) + s); +} + +static unsigned int +get_time_resource (res_name, res_class, sec_p) + char *res_name, *res_class; + Bool sec_p; +{ + int val; + char *s = get_string_resource (res_name, res_class); + if (!s) return 0; + val = parse_time (s, sec_p, False); + free (s); + return (val < 0 ? 0 : val); +} + +unsigned int +get_seconds_resource (res_name, res_class) + char *res_name, *res_class; +{ + return get_time_resource (res_name, res_class, True); +} + +unsigned int +get_minutes_resource (res_name, res_class) + char *res_name, *res_class; +{ + return get_time_resource (res_name, res_class, False); +} diff --git a/utils/resources.c_ori b/utils/resources.c_ori new file mode 100755 index 00000000..02c499b3 --- /dev/null +++ b/utils/resources.c_ori @@ -0,0 +1,221 @@ +/* xscreensaver, Copyright (c) 1992 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. + */ + +#if __STDC__ +#include +#include +#endif + +#include +#include +#include + +/* Resource functions. Assumes: */ + +extern char *progname; +extern char *progclass; +extern XrmDatabase db; + +#if __STDC__ +char *get_string_resource (char *res_name, char *res_class); +int parse_time (char *string, Bool seconds_default_p, Bool silent_p); +static unsigned int get_time_resource (char *res_name, char *res_class, + Bool sec_p); +#endif + +#ifndef isupper +# define isupper(c) ((c) >= 'A' && (c) <= 'Z') +#endif +#ifndef _tolower +# define _tolower(c) ((c) - 'A' + 'a') +#endif + +char * +get_string_resource (res_name, res_class) + char *res_name, *res_class; +{ + XrmValue value; + char *type; + char full_name [1024], full_class [1024]; + strcpy (full_name, progname); + strcat (full_name, "."); + strcat (full_name, res_name); + strcpy (full_class, progclass); + strcat (full_class, "."); + strcat (full_class, res_class); + if (XrmGetResource (db, full_name, full_class, &type, &value)) + { + char *str = (char *) malloc (value.size + 1); + strncpy (str, (char *) value.addr, value.size); + str [value.size] = 0; + return str; + } + return 0; +} + +Bool +get_boolean_resource (res_name, res_class) + char *res_name, *res_class; +{ + char *tmp, buf [100]; + char *s = get_string_resource (res_name, res_class); + char *os = s; + if (! s) return 0; + for (tmp = buf; *s; s++) + *tmp++ = isupper (*s) ? _tolower (*s) : *s; + *tmp = 0; + free (os); + + if (!strcmp (buf, "on") || !strcmp (buf, "true") || !strcmp (buf, "yes")) + return 1; + if (!strcmp (buf,"off") || !strcmp (buf, "false") || !strcmp (buf,"no")) + return 0; + fprintf (stderr, "%s: %s must be boolean, not %s.\n", + progname, res_class, buf); + return 0; +} + +int +get_integer_resource (res_name, res_class) + char *res_name, *res_class; +{ + int val; + char c, *s = get_string_resource (res_name, res_class); + if (!s) return 0; + if (1 == sscanf (s, " %d %c", &val, &c)) + { + free (s); + return val; + } + fprintf (stderr, "%s: %s must be an integer, not %s.\n", + progname, res_name, s); + free (s); + return 0; +} + +double +get_float_resource (res_name, res_class) + char *res_name, *res_class; +{ + double val; + char c, *s = get_string_resource (res_name, res_class); + if (! s) return 0.0; + if (1 == sscanf (s, " %lf %c", &val, &c)) + { + free (s); + return val; + } + fprintf (stderr, "%s: %s must be a float, not %s.\n", + progname, res_name, s); + free (s); + return 0.0; +} + + +unsigned int +get_pixel_resource (res_name, res_class, dpy, cmap) + char *res_name, *res_class; + Display *dpy; + Colormap cmap; +{ + XColor color; + char *s = get_string_resource (res_name, res_class); + if (!s) goto DEFAULT; + + if (! XParseColor (dpy, cmap, s, &color)) + { + fprintf (stderr, "%s: can't parse color %s\n", progname, s); + goto DEFAULT; + } + if (! XAllocColor (dpy, cmap, &color)) + { + fprintf (stderr, "%s: couldn't allocate color %s\n", progname, s); + goto DEFAULT; + } + free (s); + return color.pixel; + DEFAULT: + if (s) free (s); + return (strcmp (res_class, "Background") + ? WhitePixel (dpy, DefaultScreen (dpy)) + : BlackPixel (dpy, DefaultScreen (dpy))); +} + + +int +parse_time (string, seconds_default_p, silent_p) + char *string; + Bool seconds_default_p, silent_p; +{ + unsigned int h, m, s; + char c; + if (3 == sscanf (string, " %u : %2u : %2u %c", &h, &m, &s, &c)) + ; + else if (2 == sscanf (string, " : %2u : %2u %c", &m, &s, &c) || + 2 == sscanf (string, " %u : %2u %c", &m, &s, &c)) + h = 0; + else if (1 == sscanf (string, " : %2u %c", &s, &c)) + h = m = 0; + else if (1 == sscanf (string, " %u %c", + (seconds_default_p ? &s : &m), &c)) + { + h = 0; + if (seconds_default_p) m = 0; + else s = 0; + } + else + { + if (! silent_p) + fprintf (stderr, "%s: invalid time interval specification \"%s\".\n", + progname, string); + return -1; + } + if (s >= 60 && (h != 0 || m != 0)) + { + if (! silent_p) + fprintf (stderr, "%s: seconds > 59 in \"%s\".\n", progname, string); + return -1; + } + if (m >= 60 && h > 0) + { + if (! silent_p) + fprintf (stderr, "%s: minutes > 59 in \"%s\".\n", progname, string); + return -1; + } + return ((h * 60 * 60) + (m * 60) + s); +} + +static unsigned int +get_time_resource (res_name, res_class, sec_p) + char *res_name, *res_class; + Bool sec_p; +{ + int val; + char *s = get_string_resource (res_name, res_class); + if (!s) return 0; + val = parse_time (s, sec_p, False); + free (s); + return (val < 0 ? 0 : val); +} + +unsigned int +get_seconds_resource (res_name, res_class) + char *res_name, *res_class; +{ + return get_time_resource (res_name, res_class, True); +} + +unsigned int +get_minutes_resource (res_name, res_class) + char *res_name, *res_class; +{ + return get_time_resource (res_name, res_class, False); +} diff --git a/utils/spline.c b/utils/spline.c new file mode 100755 index 00000000..d242d63f --- /dev/null +++ b/utils/spline.c @@ -0,0 +1,331 @@ +/* + * Copyright (c) 1987, 1988, 1989 Stanford University + * + * 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, and that the name of Stanford not be used in advertising or + * publicity pertaining to distribution of the software without specific, + * written prior permission. Stanford makes no representations about + * the suitability of this software for any purpose. It is provided "as is" + * without express or implied warranty. + * + * STANFORD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, + * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. + * IN NO EVENT SHALL STANFORD BE LIABLE FOR ANY SPECIAL, INDIRECT OR + * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, + * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR + * OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION + * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +/* This code came with the InterViews distribution, and was translated + from C++ to C by Matthieu Devin some time in 1992. + */ + +#include +#include "spline.h" +#if __STDC__ +#include +#endif +#include + +/* Lifted from InterViews */ +#define SMOOTHNESS 1.0 + +#if __STDC__ +static void no_more_memory (void); +static void grow_spline_points (spline* s); +static void mid_point (double x0, double y0, double x1, double y1, + double *mx, double *my); +static int can_approx_with_line (double x0, double y0, double x2, + double y2, double x3, double y3); +static void add_line (spline* s, double x0, double y0, double x1, double y1); +static void add_bezier_arc (spline* s, + double x0, double y0, double x1, double y1, + double x2, double y2, double x3, double y3); +static void third_point (double x0, double y0, double x1, double y1, + double *tx, double *ty); +static void calc_section (spline* s, double cminus1x, double cminus1y, + double cx, double cy, double cplus1x, double cplus1y, + double cplus2x, double cplus2y); + +#endif + +static void +no_more_memory () +{ + fprintf (stderr, "No more memory\n"); + exit (1); +} + +spline* +make_spline (size) + u_int size; +{ + spline* s = (spline*)calloc (1, sizeof (spline)); + if (!s) + no_more_memory (); + s->n_controls = size; + s->control_x = (double*)calloc (s->n_controls, sizeof (double)); + s->control_y = (double*)calloc (s->n_controls, sizeof (double)); + + s->n_points = 0; + s->allocated_points = s->n_controls; + s->points = (XPoint*)calloc (s->allocated_points, sizeof (XPoint)); + + if (!s->control_x || !s->control_y || !s->points) + no_more_memory (); + + return s; +} + +static void +grow_spline_points (s) + spline* s; +{ + s->allocated_points *= 2; + s->points = + (XPoint*)realloc (s->points, s->allocated_points * sizeof (XPoint)); + + if (!s->points) + no_more_memory (); +} + +static void +mid_point (x0, y0, x1, y1, mx, my) + double x0, y0, x1, y1, *mx, *my; +{ + *mx = (x0 + x1) / 2.0; + *my = (y0 + y1) / 2.0; +} + +static void +third_point (x0, y0, x1, y1, tx, ty) + double x0, y0, x1, y1, *tx, *ty; +{ + *tx = (2 * x0 + x1) / 3.0; + *ty = (2 * y0 + y1) / 3.0; +} + +static int +can_approx_with_line (x0, y0, x2, y2, x3, y3) + double x0, y0, x2, y2, x3, y3; +{ + double triangle_area, side_squared, dx, dy; + + triangle_area = x0 * y2 - x2 * y0 + x2 * y3 - x3 * y2 + x3 * y0 - x0 * y3; + /* actually 4 times the area. */ + triangle_area *= triangle_area; + dx = x3 - x0; + dy = y3 - y0; + side_squared = dx * dx + dy * dy; + return triangle_area <= SMOOTHNESS * side_squared; +} + +static void +add_line (s, x0, y0, x1, y1) + spline* s; + double x0, y0, x1, y1; +{ + if (s->n_points >= s->allocated_points) + grow_spline_points (s); + + if (s->n_points == 0) + { + s->points [s->n_points].x = x0; + s->points [s->n_points].y = y0; + s->n_points += 1; + } + s->points [s->n_points].x = x1; + s->points [s->n_points].y = y1; + s->n_points += 1; +} + +static void +add_bezier_arc (s, x0, y0, x1, y1, x2, y2, x3, y3) + spline* s; + double x0, y0, x1, y1, x2, y2, x3, y3; +{ + double midx01, midx12, midx23, midlsegx, midrsegx, cx, + midy01, midy12, midy23, midlsegy, midrsegy, cy; + + mid_point (x0, y0, x1, y1, &midx01, &midy01); + mid_point (x1, y1, x2, y2, &midx12, &midy12); + mid_point (x2, y2, x3, y3, &midx23, &midy23); + mid_point (midx01, midy01, midx12, midy12, &midlsegx, &midlsegy); + mid_point (midx12, midy12, midx23, midy23, &midrsegx, &midrsegy); + mid_point (midlsegx, midlsegy, midrsegx, midrsegy, &cx, &cy); + + if (can_approx_with_line (x0, y0, midlsegx, midlsegy, cx, cy)) + add_line (s, x0, y0, cx, cy); + else if ((midx01 != x1) || (midy01 != y1) || (midlsegx != x2) + || (midlsegy != y2) || (cx != x3) || (cy != y3)) + add_bezier_arc (s, x0, y0, midx01, midy01, midlsegx, midlsegy, cx, cy); + + if (can_approx_with_line (cx, cy, midx23, midy23, x3, y3)) + add_line (s, cx, cy, x3, y3); + else if ((cx != x0) || (cy != y0) || (midrsegx != x1) || (midrsegy != y1) + || (midx23 != x2) || (midy23 != y2)) + add_bezier_arc (s, cx, cy, midrsegx, midrsegy, midx23, midy23, x3, y3); +} + +static void +calc_section (s, cminus1x, cminus1y, cx, cy, cplus1x, cplus1y, + cplus2x, cplus2y) + spline* s; + double cminus1x, cminus1y, cx, cy, cplus1x, cplus1y, cplus2x, cplus2y; +{ + double p0x, p1x, p2x, p3x, tempx, + p0y, p1y, p2y, p3y, tempy; + + third_point (cx, cy, cplus1x, cplus1y, &p1x, &p1y); + third_point (cplus1x, cplus1y, cx, cy, &p2x, &p2y); + third_point (cx, cy, cminus1x, cminus1y, &tempx, &tempy); + mid_point (tempx, tempy, p1x, p1y, &p0x, &p0y); + third_point (cplus1x, cplus1y, cplus2x, cplus2y, &tempx, &tempy); + mid_point (tempx, tempy, p2x, p2y, &p3x, &p3y); + add_bezier_arc (s, p0x, p0y, p1x, p1y, p2x, p2y, p3x, p3y); +} + +void +compute_spline (s) + spline* s; +{ + int i; + s->n_points = 0; + + if (s->n_controls < 3) + return; + + calc_section (s, s->control_x [0], s->control_y [0], s->control_x [0], + s->control_y [0], s->control_x [0], s->control_y [0], + s->control_x [1], s->control_y [1]); + calc_section (s, s->control_x [0], s->control_y [0], s->control_x [0], + s->control_y [0], s->control_x [1], s->control_y [1], + s->control_x [2], s->control_y [2]); + + for (i = 1; i < s->n_controls - 2; i++) + calc_section (s, s->control_x [i - 1], s->control_y [i - 1], + s->control_x [i], s->control_y [i], + s->control_x [i + 1], s->control_y [i + 1], + s->control_x [i + 2], s->control_y [i + 2]); + + calc_section (s, s->control_x [i - 1], s->control_y [i - 1], + s->control_x [i], s->control_y [i], + s->control_x [i + 1], s->control_y [i + 1], + s->control_x [i + 1], s->control_y [i + 1]); + calc_section (s, s->control_x [i], s->control_y [i], + s->control_x [i + 1], s->control_y [i + 1], + s->control_x [i + 1], s->control_y [i + 1], + s->control_x [i + 1], s->control_y [i + 1]); +} + +void +compute_closed_spline (s) + spline *s; +{ + int i; + s->n_points = 0; + + if (s->n_controls < 3) + return; + + calc_section (s, + s->control_x [s->n_controls - 1], + s->control_y [s->n_controls - 1], + s->control_x [0], s->control_y [0], + s->control_x [1], s->control_y [1], + s->control_x [2], s->control_y [2]); + + for (i = 1; i < s->n_controls - 2; i++) + calc_section (s, s->control_x [i - 1], s->control_y [i - 1], + s->control_x [i], s->control_y [i], + s->control_x [i + 1], s->control_y [i + 1], + s->control_x [i + 2], s->control_y [i + 2]); + + calc_section (s, s->control_x [i - 1], s->control_y [i - 1], + s->control_x [i], s->control_y [i], + s->control_x [i + 1], s->control_y [i + 1], + s->control_x [0], s->control_y [0]); + calc_section (s, s->control_x [i], s->control_y [i], + s->control_x [i + 1], s->control_y [i + 1], + s->control_x [0], s->control_y [0], + s->control_x [1], s->control_y [1]); +} + +void +just_fill_spline (s) + spline *s; +{ + int i; + + while (s->allocated_points < s->n_controls + 1) + grow_spline_points (s); + + for (i = 0; i < s->n_controls; i++) + { + s->points [i].x = s->control_x [i]; + s->points [i].y = s->control_y [i]; + } + s->points [s->n_controls].x = s->control_x [0]; + s->points [s->n_controls].y = s->control_y [0]; + s->n_points = s->n_controls + 1; +} + +void +append_spline_points (s1, s2) + spline *s1, *s2; +{ + int i; + while (s1->allocated_points < s1->n_points + s2->n_points) + grow_spline_points (s1); + for (i = s1->n_points; i < s1->n_points + s2->n_points; i++) + { + s1->points [i].x = s2->points [i - s1->n_points].x; + s1->points [i].y = s2->points [i - s1->n_points].y; + } + s1->n_points = s1->n_points + s2->n_points; +} + +void +spline_bounding_box (s, rectangle_out) + spline* s; + XRectangle* rectangle_out; +{ + int min_x; + int max_x; + int min_y; + int max_y; + int i; + + if (s->n_points == 0) + { + rectangle_out->x = 0; + rectangle_out->y = 0; + rectangle_out->width = 0; + rectangle_out->height = 0; + } + + min_x = s->points [0].x; + max_x = min_x; + min_y = s->points [0].y; + max_y = min_y; + + for (i = 1; i < s->n_points; i++) + { + if (s->points [i].x < min_x) + min_x = s->points [i].x; + if (s->points [i].x > max_x) + max_x = s->points [i].x; + if (s->points [i].y < min_y) + min_y = s->points [i].y; + if (s->points [i].y > max_y) + max_y = s->points [i].y; + } + rectangle_out->x = min_x; + rectangle_out->y = min_y; + rectangle_out->width = max_x - min_x; + rectangle_out->height = max_y - min_y; +} diff --git a/utils/spline.h b/utils/spline.h new file mode 100755 index 00000000..1c76bb36 --- /dev/null +++ b/utils/spline.h @@ -0,0 +1,64 @@ +/* + * Copyright (c) 1987, 1988, 1989 Stanford University + * + * 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, and that the name of Stanford not be used in advertising or + * publicity pertaining to distribution of the software without specific, + * written prior permission. Stanford makes no representations about + * the suitability of this software for any purpose. It is provided "as is" + * without express or implied warranty. + * + * STANFORD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, + * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. + * IN NO EVENT SHALL STANFORD BE LIABLE FOR ANY SPECIAL, INDIRECT OR + * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, + * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR + * OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION + * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +/* This code came with the InterViews distribution, and was translated + from C++ to C by Matthieu Devin some time in 1992. + */ + +#ifndef _SPLINE_H_ +#define _SPLINE_H_ + +#include + +#if __STDC__ +# define P(x)x +#else +# define P(x)() +#endif + +#ifdef VMS +typedef unsigned int u_int; +#endif + + +typedef struct _spline +{ + /* input */ + u_int n_controls; + double* control_x; + double* control_y; + + /* output */ + u_int n_points; + XPoint* points; + u_int allocated_points; +} spline; + +spline* make_spline P((u_int size)); +void compute_spline P((spline* s)); +void compute_closed_spline P((spline* s)); +void just_fill_spline P((spline* s)); +void append_spline_points P((spline* s1, spline* s2)); +void spline_bounding_box P((spline* s, XRectangle* rectangle_out)); + +#undef P +#endif /* _SPLINE_H_ */ diff --git a/utils/spline.h_ori b/utils/spline.h_ori new file mode 100755 index 00000000..a8a04d5e --- /dev/null +++ b/utils/spline.h_ori @@ -0,0 +1,59 @@ +/* + * Copyright (c) 1987, 1988, 1989 Stanford University + * + * 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, and that the name of Stanford not be used in advertising or + * publicity pertaining to distribution of the software without specific, + * written prior permission. Stanford makes no representations about + * the suitability of this software for any purpose. It is provided "as is" + * without express or implied warranty. + * + * STANFORD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, + * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. + * IN NO EVENT SHALL STANFORD BE LIABLE FOR ANY SPECIAL, INDIRECT OR + * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, + * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR + * OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION + * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +/* This code came with the InterViews distribution, and was translated + from C++ to C by Matthieu Devin some time in 1992. + */ + +#ifndef _SPLINE_H_ +#define _SPLINE_H_ + +#include + +#if __STDC__ +# define P(x)x +#else +# define P(x)() +#endif + +typedef struct _spline +{ + /* input */ + u_int n_controls; + double* control_x; + double* control_y; + + /* output */ + u_int n_points; + XPoint* points; + u_int allocated_points; +} spline; + +spline* make_spline P((u_int size)); +void compute_spline P((spline* s)); +void compute_closed_spline P((spline* s)); +void just_fill_spline P((spline* s)); +void append_spline_points P((spline* s1, spline* s2)); +void spline_bounding_box P((spline* s, XRectangle* rectangle_out)); + +#undef P +#endif /* _SPLINE_H_ */ diff --git a/utils/strings.c b/utils/strings.c new file mode 100755 index 00000000..dab2dc9c --- /dev/null +++ b/utils/strings.c @@ -0,0 +1,85 @@ +/* + * STRINGS.C (C adaptation of STRINGS.MAR) + */ +#include + +/* + * bcopy() + * + * copies length of source to destination + */ +void bcopy (src, dest, length) +char *src, *dest; +unsigned long int length; +{ + memcpy(dest, src, length); +} + +/* + * bcmp() + * + * compare src againist destination for length bytes. + * + * return -1 if src < dest, 0 if src = dest, 1 if src > dest + */ +int bcmp(src, dest, length) +char *src, *dest; +unsigned long int length; +{ + return((int)memcmp(src, dest, length)); +} + +/* + * bzero() + * + * zero out source for length bytes + */ +void bzero(src, length) +char *src; +unsigned long int length; +{ + memset(src, 0, length); +} + +/* + * ffs() + * + * finds the first bit set in the argument and returns the index + * of that bit (starting at 1). + */ +int ffs(mask) +unsigned long int mask; +{ + register int i; + + for (i = 0; i < sizeof(mask); i++) + if (mask & (1 << i)) return (i+1); + + return(-1); +} + +/* + * index() + * + * returns a pointer to the first occurrence of a character within + * a string + */ + +char *index(string, c) +char *string, c; +{ + return(strchr(string,c)); +} + +/* + * rindex + * + * returns a pointer to the last occurrence of a character within + * a string + */ + +char *rindex(string, c) +char *string, c; +{ + return (strrchr(string,c)); +} diff --git a/utils/unix_time.h b/utils/unix_time.h new file mode 100755 index 00000000..8f076d1d --- /dev/null +++ b/utils/unix_time.h @@ -0,0 +1,79 @@ +/* @(#)time.h 2.9 87/01/17 SMI; from UCB 7.1 6/4/86 */ + +/* + Definitions of various structures used on UNIX for + time-related syscalls. +*/ + +/* + * Copyright (c) 1982, 1986 Regents of the University of California. + * All rights reserved. The Berkeley software License Agreement + * specifies the terms and conditions for redistribution. + */ + +#ifndef _UNIX_TIME_ +#define _UNIX_TIME_ + +#ifndef __SOCKET_LOADED +/* + * Structure returned by gettimeofday(2) system call, + * and used in other calls. + */ +struct timeval +{ + long tv_sec; /* seconds */ + long tv_usec; /* and microseconds */ +}; +#endif + +struct timezone +{ + int tz_minuteswest; /* minutes west of Greenwich */ + int tz_dsttime; /* type of dst correction */ +}; + +#define DST_NONE 0 /* not on dst */ +#define DST_USA 1 /* USA style dst */ +#define DST_AUST 2 /* Australian style dst */ +#define DST_WET 3 /* Western European dst */ +#define DST_MET 4 /* Middle European dst */ +#define DST_EET 5 /* Eastern European dst */ +#define DST_CAN 6 /* Canada */ +#define DST_GB 7 /* Great Britain and Eire */ +#define DST_RUM 8 /* Rumania */ +#define DST_TUR 9 /* Turkey */ +#define DST_AUSTALT 10 /* Australian style with shift in 1986 */ + +/* + * Operations on timevals. + * + * NB: timercmp does not work for >= or <=. + */ +#define timerisset(tvp) ((tvp)->tv_sec || (tvp)->tv_usec) +#define timercmp(tvp, uvp, cmp) \ + ((tvp)->tv_sec cmp (uvp)->tv_sec || \ + (tvp)->tv_sec == (uvp)->tv_sec && (tvp)->tv_usec cmp (uvp)->tv_usec) +#define timerclear(tvp) (tvp)->tv_sec = (tvp)->tv_usec = 0 + +/* + * Names of the interval timers, and structure + * defining a timer setting. + */ +#define ITIMER_REAL 0 +#define ITIMER_VIRTUAL 1 +#define ITIMER_PROF 2 + +struct itimerval +{ + struct timeval it_interval; /* timer interval */ + struct timeval it_value; /* current value */ +}; + +#ifndef KERNEL +#include +#endif + +int gettimeofday(struct timeval *tv, struct timezone *tz); + +#endif /*!_UNIX_TIME_ */ + diff --git a/utils/unix_times.c b/utils/unix_times.c new file mode 100755 index 00000000..8854ed0d --- /dev/null +++ b/utils/unix_times.c @@ -0,0 +1,178 @@ +/* + * UNIX-style Time Functions + * + */ +#include +#include +#include +#include +#include +#include "unix_time.h" + +static struct timeval END_OF_TIME = {100000000, 0}; +static VMS_Timer_AST(); + +static int vms_itimer_eventflg = 0; + +/* + * gettimeofday(2) - Returns the current time + * + * NOTE: The timezone portion is useless on VMS. + * Even on UNIX, it is only provided for backwards + * compatibilty and is not guaranteed to be correct. + */ + +int gettimeofday(tv, tz) +struct timeval *tv; +struct timezone *tz; +{ + timeb_t tmp_time; + + ftime(&tmp_time); + + if (tv != NULL) + { + tv->tv_sec = tmp_time.time; + tv->tv_usec = tmp_time.millitm * 1000; + } + + if (tz != NULL) + { + tz->tz_minuteswest = tmp_time.timezone; + tz->tz_dsttime = tmp_time.dstflag; + } + + return (0); + +} /*** End gettimeofday() ***/ + +/* + * VMS version of "setitimer" + */ +int setitimer(which, it, null) +int which; +struct itimerval *it; +int null; +{ + register struct timeval *tv = &it->it_value; + int Delta[2]; + long int m1, a1; + static int Timer_EFN = -1; + static int Timer_EFN_Mask; + + /* + * We only do ITIMER_REAL + */ + if (which != ITIMER_REAL) { + /* + * Check for "no timer" + */ + if ((tv->tv_sec == 0) && (tv->tv_usec == 0)) return(0); + return(1); + } + /* + * If there is a timer running, cancel it + */ + if (vms_itimer_eventflg) { + vms_itimer_eventflg = 0; + sys$cantim(VMS_Timer_AST, 0); + } + /* + * If no timer, we are done + */ + if (tv->tv_sec == END_OF_TIME.tv_sec) return(0); + /* + * Setup the timer + */ + if (tv->tv_sec <= 100) { + /* + * Check for values < 20msec + */ + if ((tv->tv_sec == 0) && (tv->tv_usec < 20000)) { + /* + * Check for "disable" timer + */ + if (tv->tv_usec == 0) return(0); + /* + * Make it 20msec (try 10msec later) + */ + Delta[1] = -1; + Delta[0] = -200000; + } else { + /* + * We can do it with single precision arithmetic + */ + Delta[1] = -1; + Delta[0] = -((10000000 * tv->tv_sec) + (10 * tv->tv_usec)); + } + } else { + /* + * Calculate Delta + */ + m1 = -10000000; + a1 = -(10 * tv->tv_usec); + lib$emul(&m1, &tv->tv_sec, &a1, Delta); + } + /* + * Set the timer EFN to indicate that the timer is running + */ + if (Timer_EFN < 0) { + /* + * Initialize the timer EFN + * (UGH!!! Hardwired because DECWindows has 24/25 hardwired) + */ + Timer_EFN = 22; + /* + * Calculate the timer EFN mask + */ + Timer_EFN_Mask = 1 << Timer_EFN; + } + vms_itimer_eventflg = Timer_EFN_Mask; + /* + * Start the timer + */ + if (!(sys$setimr(Timer_EFN, Delta, VMS_Timer_AST, VMS_Timer_AST, 0) & 1)) return(1); + /* + * Return success + */ + return(0); +} + +/* + * VMS Timer AST routine + */ +static VMS_Timer_AST() +{ + static struct sigcontext scp; + + /* + * The timer is no longer running + */ + vms_itimer_eventflg = 0; + /* + * Make like a SIGALRM signal + */ + gsignal(SIGALRM); +} + +/* + * Fake "getitimer" call + */ +int getitimer(which, it) +int which; +register struct itimerval *it; +{ + /* + * We only deal with the virtual timer + */ + if (which != ITIMER_VIRTUAL) return(1); + /* + * Return ZERO time + */ + it->it_value.tv_sec = 0; + it->it_value.tv_usec = 0; + it->it_interval.tv_sec = 0; + it->it_interval.tv_usec = 0; + return(0); +} + diff --git a/utils/usleep.c b/utils/usleep.c new file mode 100755 index 00000000..df07b9c2 --- /dev/null +++ b/utils/usleep.c @@ -0,0 +1,110 @@ +/* xscreensaver, Copyright (c) 1992 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. + */ + +#if __STDC__ +#include +#endif + +#include +#include /* lazy way out */ + +#ifdef VMS +#include +#include +extern char *progname; +#include +unsigned long int statvms; +float seconds; +#endif + +/* usleep() doesn't exist everywhere, and select() is faster anyway. + */ + +#ifndef VMS + +#ifdef NO_SELECT + /* If you don't have select() or usleep(), I guess you lose... + Maybe you have napms() instead? Let me know. + */ +void +screenhack_usleep (usecs) + unsigned long usecs; +{ + usleep (usecs); +} + +#else /* ! NO_SELECT */ + +void +screenhack_usleep (usecs) + unsigned long usecs; +{ + struct timeval tv; + tv.tv_sec = usecs / 1000000L; + tv.tv_usec = usecs % 1000000L; + (void) select (0, 0, 0, 0, &tv); +} + +#endif /* ! NO_SELECT */ + +#else /* VMS */ + +#define SEC_DELTA "0000 00:00:01.00" +#define TICK_DELTA "0000 00:00:00.08" +static int bin_sec_delta[2], bin_tick_delta[2], deltas_set = 0; + +static void +set_deltas () +{ + int status; + extern int SYS$BINTIM (); + $DESCRIPTOR (str_sec_delta, SEC_DELTA); + $DESCRIPTOR (str_tick_delta, TICK_DELTA); + if (!deltas_set) + { + status = SYS$BINTIM (&str_sec_delta, &bin_sec_delta); + if (!(status & 1)) + { + fprintf (stderr, "%s: cannot convert delta time ", progname); + fprintf (stderr, SEC_DELTA); + fprintf (stderr, "; status code = %d\n", status); + exit (status); + } + status = SYS$BINTIM (&str_tick_delta, &bin_tick_delta); + if (!(status & 1)) + { + fprintf (stderr, "%s: cannot convert delta time ", progname); + fprintf (stderr, TICK_DELTA); + fprintf (stderr, "; status code = %d\n", status); + exit (status); + } + deltas_set = 1; + } +} + +void +screenhack_usleep (usecs) + unsigned long usecs; +{ + int status, *bin_delta; + +/* extern int SYS$SCHWDK (), SYS$HIBER (); */ +/* */ +/* if (!deltas_set) set_deltas (); */ +/* bin_delta = (usecs == TICK_INTERVAL) ? &bin_tick_delta : &bin_sec_delta;*/ +/* status = SYS$SCHDWK (0, 0, bin_delta, 0); */ +/* if ((status & 1)) (void) SYS$HIBER (); */ + + seconds = ((float) usecs)/1000000.0; + statvms = lib$wait(&seconds); +} + +#endif /*VMS */ diff --git a/utils/usleep.c_ori b/utils/usleep.c_ori new file mode 100755 index 00000000..30e7f152 --- /dev/null +++ b/utils/usleep.c_ori @@ -0,0 +1,97 @@ +/* xscreensaver, Copyright (c) 1992 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. + */ + +#if __STDC__ +#include +#endif + +#include +#include /* lazy way out */ + +/* usleep() doesn't exist everywhere, and select() is faster anyway. + */ + +#ifndef VMS + +#ifdef NO_SELECT + /* If you don't have select() or usleep(), I guess you lose... + Maybe you have napms() instead? Let me know. + */ +void +screenhack_usleep (usecs) + unsigned long usecs; +{ + usleep (usecs); +} + +#else /* ! NO_SELECT */ + +void +screenhack_usleep (usecs) + unsigned long usecs; +{ + struct timeval tv; + tv.tv_sec = usecs / 1000000L; + tv.tv_usec = usecs % 1000000L; + (void) select (0, 0, 0, 0, &tv); +} + +#endif /* ! NO_SELECT */ + +#else /* VMS */ + +#define SEC_DELTA "0000 00:00:01.00" +#define TICK_DELTA "0000 00:00:00.08" +static int bin_sec_delta[2], bin_tick_delta[2], deltas_set = 0; + +static void +set_deltas () +{ + int status; + extern int SYS$BINTIM (); + $DESCRIPTOR (str_sec_delta, SEC_DELTA); + $DESCRIPTOR (str_tick_delta, TICK_DELTA); + if (!deltas_set) + { + status = SYS$BINTIM (&str_sec_delta, &bin_sec_delta); + if (!(status & 1)) + { + fprintf (stderr, "%s: cannot convert delta time ", progname); + fprintf (stderr, SEC_DELTA); + fprintf (stderr, "; status code = %d\n", status); + exit (status); + } + status = SYS$BINTIM (&str_tick_delta, &bin_tick_delta); + if (!(status & 1)) + { + fprintf (stderr, "%s: cannot convert delta time ", progname); + fprintf (stderr, TICK_DELTA); + fprintf (stderr, "; status code = %d\n", status); + exit (status); + } + deltas_set = 1; + } +} + +void +screenhack_usleep (usecs) + unsigned long usecs; +{ + int status, *bin_delta; + extern int SYS$SCHWDK (), SYS$HIBER (); + + if (!deltas_set) set_deltas (); + bin_delta = (usecs == TICK_INTERVAL) ? &bin_tick_delta : &bin_sec_delta; + status = SYS$SCHDWK (0, 0, bin_delta, 0); + if ((status & 1)) (void) SYS$HIBER (); +} + +#endif /*VMS */ diff --git a/utils/utils.olb b/utils/utils.olb new file mode 100755 index 0000000000000000000000000000000000000000..44dfb42b0ec86e6e5d0a3eb9810c64d9b77165e0 GIT binary patch literal 26624 zcmeHw3w%?@mG`|@k}VSf@`J_%1=Ivu+LF|eM`_n-Ft&L##=g3GSa$PaTeeJ`Iw+w3~sr7hj<0VPoIUcBB} zVOzhU(7FVGcZ3wXwWzRA{v;CPLW*O()t*;$I}$E2#i^96EmT$@aYE3SV#e^1%*vDH!s3DoKA;tH$@*fOm5-}-b^ZpKKk8QJm&j$DV~ned^78L1 zEUw5eDJoGmAd`s4YJ)c!iuD7cy8u z;hH>qku9EwhhkeH+Q?ZnEx#rYqJLuebe~=K4(4Qa55B(g7wWW@IZ`z$Ydq zH8R@6SmD3?{(ngUt&oa#FBb$q*U}x3Axviiu z|F-3y|NLF%<#&8x#mecWjDjFS$u#Gi9e3Qm;GKwGgmZ0ohtv(?rYTHtq+NQS$Z9zFK3DZQ8>F2-zmgzmAMHD*Nw={1ye`po( z;(3}*S=%LN&gzh*OkIbp%^<)jpF!zzWn>0L)NBv>v|+6<*9ny;&j!iLmow8(RoT_$ z(`T3_walU(ctVhO=Izc=RF_ZRY3X8bop+;n)L@Z!uBw(*OXUemhlPRXp9`|zP<7C! z=kGB%E%rjCjJ?Kc>QCewV)<5EiNc#OhZV80r%)PXN$+Y>p_tB-|m2A_zTwRUzm!UM675hQbZ`av449oYu19e0rKR5FC)i zK?IoXgqF3Mv@r)%B7%UK*A?d9w;|6u2^M2;NuV{EX>F1)3y=8Z3X`=jmO->O3DZ