home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 January / usenetsourcesnewsgroupsinfomagicjanuary1994.iso / sources / x / volume19 / blast / part01 next >
Encoding:
Text File  |  1993-04-28  |  28.5 KB  |  918 lines

  1. Newsgroups: comp.sources.x
  2. From: daniel@uunet.UU.NET@vicorp (Daniel Dee)
  3. Subject: v19i041:  blast - X Shape Extension program to blast holes in your windows, Part01/01
  4. Message-ID: <1993Mar12.141752.20034@sparky.imd.sterling.com>
  5. X-Md4-Signature: 6440903ae2c19f2ff0a6ceffd3509dc3
  6. Date: Fri, 12 Mar 1993 14:17:52 GMT
  7. Approved: chris@sparky.imd.sterling.com
  8.  
  9. Submitted-by: daniel@uunet.UU.NET@vicorp (Daniel Dee)
  10. Posting-number: Volume 19, Issue 41
  11. Archive-name: blast/part01
  12. Environment: X11, Shape
  13.  
  14. [There are no man pages for this program.  It really didn't need any, so I
  15.  posted it anyway. -- cmo]
  16.  
  17. blast v1.0
  18. Copyright (c) 1992 Daniel Dee
  19. This program is free software; you may
  20. redistribute it and/or modify it under the terms of
  21. the GNU General Public License as published by the
  22. Free Software Foundation; either version, or
  23. any later version.
  24.  
  25.  
  26. email: ddee@vicorp.com
  27. V.I. Corporation
  28. 47 Pleasant Street
  29. Northampton, MA 01060
  30.  
  31.  
  32. What is Blast?
  33.  
  34. Blast is simple program that lets you blast holes any window in X
  35. using mouse button 1. Mouse button 2 repairs blasted windows and
  36. mouse button 3 exits the program. Holes become permanent unless 
  37. you repair them before you quit. You may move permanently "damaged"
  38. windows and enjoy the view behind the holes.
  39.  
  40. -------------------------Cut Here------------------------------------
  41. echo x - Imakefile
  42. sed 's/^X//' >Imakefile <<'*-*-END-of-Imakefile-*-*'
  43. XCCOPTIONS = -g -Dsun4
  44. XSYS_LIBRARIES = -lm
  45. XLOCAL_LIBRARIES = $(XLIB)
  46. XDEPLIB =
  47. XSRCS = blast.c
  48. XOBJS = blast.o
  49. X
  50. XComplexProgramTarget(blast)
  51. X
  52. Xblast: shooting.au
  53. X
  54. Xshooting.au: shooting.au.uu
  55. X    uudecode shooting.au.uu
  56. X
  57. *-*-END-of-Imakefile-*-*
  58. echo x - Makefile
  59. sed 's/^X//' >Makefile <<'*-*-END-of-Makefile-*-*'
  60. X# Makefile generated by imake - do not edit!
  61. X# $XConsortium: imake.c,v 1.51 89/12/12 12:37:30 jim Exp $
  62. X#
  63. X# The cpp used on this machine replaces all newlines and multiple tabs and
  64. X# spaces in a macro expansion with a single space.  Imake tries to compensate
  65. X# for this, but is not always successful.
  66. X#
  67. X
  68. X# -------------------------------------------------------------------------
  69. X# Makefile generated from "Imake.tmpl" and <Imakefile>
  70. X# $XConsortium: Imake.tmpl,v 1.139 91/09/16 08:52:48 rws Exp $
  71. X#
  72. X# Platform-specific parameters may be set in the appropriate <vendor>.cf
  73. X# configuration files.  Site-specific parameters should be set in the file
  74. X# site.def.  Full rebuilds are recommended if any parameters are changed.
  75. X#
  76. X# If your C preprocessor does not define any unique symbols, you will need
  77. X# to set BOOTSTRAPCFLAGS when rebuilding imake (usually when doing
  78. X# "make World" the first time).
  79. X#
  80. X
  81. X# -------------------------------------------------------------------------
  82. X# site-specific configuration parameters that need to come before
  83. X# the platform-specific parameters - edit site.def to change
  84. X
  85. X# site:  $XConsortium: site.def,v 1.2 91/07/30 20:26:44 rws Exp $
  86. X
  87. X# -------------------------------------------------------------------------
  88. X# platform-specific configuration parameters - edit sun.cf to change
  89. X
  90. X# platform:  $XConsortium: sun.cf,v 1.72.1.1 92/03/18 13:13:37 rws Exp $
  91. X
  92. X# operating system:  SunOS 4.1.1
  93. X
  94. X# $XConsortium: sunLib.rules,v 1.7 91/12/20 11:19:47 rws Exp $
  95. X
  96. X.c.o:
  97. X    $(CC) -c $(CFLAGS) $*.c
  98. X
  99. X# -------------------------------------------------------------------------
  100. X# site-specific configuration parameters that go after
  101. X# the platform-specific parameters - edit site.def to change
  102. X
  103. X# site:  $XConsortium: site.def,v 1.2 91/07/30 20:26:44 rws Exp $
  104. X
  105. X            SHELL = /bin/sh
  106. X
  107. X              TOP = .
  108. X      CURRENT_DIR = .
  109. X
  110. X               AR = ar clq
  111. X  BOOTSTRAPCFLAGS =
  112. X               CC = gcc -fpcc-struct-return
  113. X               AS = as
  114. X
  115. X         COMPRESS = compress
  116. X              CPP = /lib/cpp $(STD_CPP_DEFINES)
  117. X    PREPROCESSCMD = gcc -fpcc-struct-return -E $(STD_CPP_DEFINES)
  118. X          INSTALL = install
  119. X               LD = ld
  120. X             LINT = lint
  121. X      LINTLIBFLAG = -C
  122. X         LINTOPTS = -axz
  123. X               LN = ln -s
  124. X             MAKE = make
  125. X               MV = mv
  126. X               CP = cp
  127. X
  128. X           RANLIB = ranlib
  129. X  RANLIBINSTFLAGS =
  130. X
  131. X               RM = rm -f
  132. X            TROFF = psroff
  133. X         MSMACROS = -ms
  134. X              TBL = tbl
  135. X              EQN = eqn
  136. X     STD_INCLUDES =
  137. X  STD_CPP_DEFINES =
  138. X      STD_DEFINES =
  139. X EXTRA_LOAD_FLAGS =
  140. X  EXTRA_LIBRARIES =
  141. X             TAGS = ctags
  142. X
  143. X    SHAREDCODEDEF = -DSHAREDCODE
  144. X         SHLIBDEF = -DSUNSHLIB
  145. X
  146. X    PROTO_DEFINES =
  147. X
  148. X     INSTPGMFLAGS =
  149. X
  150. X     INSTBINFLAGS = -m 0755
  151. X     INSTUIDFLAGS = -m 4755
  152. X     INSTLIBFLAGS = -m 0644
  153. X     INSTINCFLAGS = -m 0444
  154. X     INSTMANFLAGS = -m 0444
  155. X     INSTDATFLAGS = -m 0444
  156. X    INSTKMEMFLAGS = -g kmem -m 2755
  157. X
  158. X      PROJECTROOT = /usr/local/X11R5
  159. X
  160. X     TOP_INCLUDES = -I$(INCROOT)
  161. X
  162. X      CDEBUGFLAGS = -O2
  163. X        CCOPTIONS =
  164. X
  165. X      ALLINCLUDES = $(INCLUDES) $(EXTRA_INCLUDES) $(TOP_INCLUDES) $(STD_INCLUDES)
  166. X       ALLDEFINES = $(ALLINCLUDES) $(STD_DEFINES) $(EXTRA_DEFINES) $(PROTO_DEFINES) $(DEFINES)
  167. X           CFLAGS = $(CDEBUGFLAGS) $(CCOPTIONS) $(ALLDEFINES)
  168. X        LINTFLAGS = $(LINTOPTS) -DLINT $(ALLDEFINES)
  169. X
  170. X           LDLIBS = $(SYS_LIBRARIES) $(EXTRA_LIBRARIES)
  171. X
  172. X        LDOPTIONS = $(CDEBUGFLAGS) $(CCOPTIONS) $(LOCAL_LDFLAGS) -L$(USRLIBDIR)
  173. X
  174. X   LDCOMBINEFLAGS = -X -r
  175. X      DEPENDFLAGS =
  176. X
  177. X        MACROFILE = sun.cf
  178. X           RM_CMD = $(RM) *.CKP *.ln *.BAK *.bak *.o core errs ,* *~ *.a .emacs_* tags TAGS make.log MakeOut
  179. X
  180. X    IMAKE_DEFINES =
  181. X
  182. X         IRULESRC = $(CONFIGDIR)
  183. X        IMAKE_CMD = $(IMAKE) -DUseInstalled -I$(IRULESRC) $(IMAKE_DEFINES)
  184. X
  185. X     ICONFIGFILES = $(IRULESRC)/Imake.tmpl $(IRULESRC)/Imake.rules \
  186. X            $(IRULESRC)/Project.tmpl $(IRULESRC)/site.def \
  187. X            $(IRULESRC)/$(MACROFILE) $(EXTRA_ICONFIGFILES)
  188. X
  189. X# -------------------------------------------------------------------------
  190. X# X Window System Build Parameters
  191. X# $XConsortium: Project.tmpl,v 1.138 91/09/10 09:02:12 rws Exp $
  192. X
  193. X# -------------------------------------------------------------------------
  194. X# X Window System make variables; this need to be coordinated with rules
  195. X
  196. X          PATHSEP = /
  197. X        USRLIBDIR = /usr/local/X11R5/lib
  198. X           BINDIR = /usr/local/X11R5/bin
  199. X          INCROOT = /usr/local/X11R5/include
  200. X     BUILDINCROOT = $(TOP)
  201. X      BUILDINCDIR = $(BUILDINCROOT)/X11
  202. X      BUILDINCTOP = ..
  203. X           INCDIR = $(INCROOT)/X11
  204. X           ADMDIR = /usr/adm
  205. X           LIBDIR = $(USRLIBDIR)/X11
  206. X        CONFIGDIR = $(LIBDIR)/config
  207. X       LINTLIBDIR = $(USRLIBDIR)/lint
  208. X
  209. X          FONTDIR = $(LIBDIR)/fonts
  210. X         XINITDIR = $(LIBDIR)/xinit
  211. X           XDMDIR = $(LIBDIR)/xdm
  212. X           TWMDIR = $(LIBDIR)/twm
  213. X          MANPATH = /usr/local/X11R5/man
  214. X    MANSOURCEPATH = $(MANPATH)/man
  215. X        MANSUFFIX = n
  216. X     LIBMANSUFFIX = 3
  217. X           MANDIR = $(MANSOURCEPATH)$(MANSUFFIX)
  218. X        LIBMANDIR = $(MANSOURCEPATH)$(LIBMANSUFFIX)
  219. X           NLSDIR = $(LIBDIR)/nls
  220. X        PEXAPIDIR = $(LIBDIR)/PEX
  221. X      XAPPLOADDIR = $(LIBDIR)/app-defaults
  222. X       FONTCFLAGS = -t
  223. X
  224. X     INSTAPPFLAGS = $(INSTDATFLAGS)
  225. X
  226. X            IMAKE = imake
  227. X           DEPEND = makedepend
  228. X              RGB = rgb
  229. X
  230. X            FONTC = bdftopcf
  231. X
  232. X        MKFONTDIR = mkfontdir
  233. X        MKDIRHIER = /bin/sh $(BINDIR)/mkdirhier
  234. X
  235. X        CONFIGSRC = $(TOP)/config
  236. X       DOCUTILSRC = $(TOP)/doc/util
  237. X        CLIENTSRC = $(TOP)/clients
  238. X          DEMOSRC = $(TOP)/demos
  239. X           LIBSRC = $(TOP)/lib
  240. X          FONTSRC = $(TOP)/fonts
  241. X       INCLUDESRC = $(TOP)/X11
  242. X        SERVERSRC = $(TOP)/server
  243. X          UTILSRC = $(TOP)/util
  244. X        SCRIPTSRC = $(UTILSRC)/scripts
  245. X       EXAMPLESRC = $(TOP)/examples
  246. X       CONTRIBSRC = $(TOP)/../contrib
  247. X           DOCSRC = $(TOP)/doc
  248. X           RGBSRC = $(TOP)/rgb
  249. X        DEPENDSRC = $(UTILSRC)/makedepend
  250. X         IMAKESRC = $(CONFIGSRC)
  251. X         XAUTHSRC = $(LIBSRC)/Xau
  252. X          XLIBSRC = $(LIBSRC)/X
  253. X           XMUSRC = $(LIBSRC)/Xmu
  254. X       TOOLKITSRC = $(LIBSRC)/Xt
  255. X       AWIDGETSRC = $(LIBSRC)/Xaw
  256. X       OLDXLIBSRC = $(LIBSRC)/oldX
  257. X      XDMCPLIBSRC = $(LIBSRC)/Xdmcp
  258. X      BDFTOSNFSRC = $(FONTSRC)/bdftosnf
  259. X      BDFTOSNFSRC = $(FONTSRC)/clients/bdftosnf
  260. X      BDFTOPCFSRC = $(FONTSRC)/clients/bdftopcf
  261. X     MKFONTDIRSRC = $(FONTSRC)/clients/mkfontdir
  262. X         FSLIBSRC = $(FONTSRC)/lib/fs
  263. X    FONTSERVERSRC = $(FONTSRC)/server
  264. X     EXTENSIONSRC = $(TOP)/extensions
  265. X         XILIBSRC = $(EXTENSIONSRC)/lib/xinput
  266. X      PHIGSLIBSRC = $(EXTENSIONSRC)/lib/PEX
  267. X
  268. X# $XConsortium: sunLib.tmpl,v 1.14.1.1 92/03/17 14:58:46 rws Exp $
  269. X
  270. XSHLIBLDFLAGS = -assert pure-text
  271. XPICFLAGS = -fpic
  272. X
  273. X  DEPEXTENSIONLIB =
  274. X     EXTENSIONLIB = -lXext
  275. X
  276. X          DEPXLIB = $(DEPEXTENSIONLIB)
  277. X             XLIB = $(EXTENSIONLIB) -lX11
  278. X
  279. X        DEPXMULIB = $(USRLIBDIR)/libXmu.sa.$(SOXMUREV)
  280. X       XMULIBONLY = -lXmu
  281. X           XMULIB = -lXmu
  282. X
  283. X       DEPOLDXLIB =
  284. X          OLDXLIB = -loldX
  285. X
  286. X      DEPXTOOLLIB = $(USRLIBDIR)/libXt.sa.$(SOXTREV)
  287. X         XTOOLLIB = -lXt
  288. X
  289. X        DEPXAWLIB = $(USRLIBDIR)/libXaw.sa.$(SOXAWREV)
  290. X           XAWLIB = -lXaw
  291. X
  292. X        DEPXILIB =
  293. X           XILIB = -lXi
  294. X
  295. X        SOXLIBREV = 4.10
  296. X          SOXTREV = 4.10
  297. X         SOXAWREV = 5.0
  298. X        SOOLDXREV = 4.10
  299. X         SOXMUREV = 4.10
  300. X        SOXEXTREV = 4.10
  301. X      SOXINPUTREV = 4.10
  302. X
  303. X      DEPXAUTHLIB = $(USRLIBDIR)/libXau.a
  304. X         XAUTHLIB =  -lXau
  305. X      DEPXDMCPLIB = $(USRLIBDIR)/libXdmcp.a
  306. X         XDMCPLIB =  -lXdmcp
  307. X
  308. X        DEPPHIGSLIB = $(USRLIBDIR)/libphigs.a
  309. X           PHIGSLIB =  -lphigs
  310. X
  311. X       DEPXBSDLIB = $(USRLIBDIR)/libXbsd.a
  312. X          XBSDLIB =  -lXbsd
  313. X
  314. X LINTEXTENSIONLIB = $(LINTLIBDIR)/llib-lXext.ln
  315. X         LINTXLIB = $(LINTLIBDIR)/llib-lX11.ln
  316. X          LINTXMU = $(LINTLIBDIR)/llib-lXmu.ln
  317. X        LINTXTOOL = $(LINTLIBDIR)/llib-lXt.ln
  318. X          LINTXAW = $(LINTLIBDIR)/llib-lXaw.ln
  319. X           LINTXI = $(LINTLIBDIR)/llib-lXi.ln
  320. X        LINTPHIGS = $(LINTLIBDIR)/llib-lphigs.ln
  321. X
  322. X          DEPLIBS = $(DEPXAWLIB) $(DEPXMULIB) $(DEPXTOOLLIB) $(DEPXLIB)
  323. X
  324. X         DEPLIBS1 = $(DEPLIBS)
  325. X         DEPLIBS2 = $(DEPLIBS)
  326. X         DEPLIBS3 = $(DEPLIBS)
  327. X
  328. X# -------------------------------------------------------------------------
  329. X# Imake rules for building libraries, programs, scripts, and data files
  330. X# rules:  $XConsortium: Imake.rules,v 1.123 91/09/16 20:12:16 rws Exp $
  331. X
  332. X# -------------------------------------------------------------------------
  333. X# start of Imakefile
  334. X
  335. XCCOPTIONS = -g
  336. XSYS_LIBRARIES = -lm
  337. XLOCAL_LIBRARIES = $(XLIB)
  338. XDEPLIB =
  339. XSRCS = blast.c
  340. XOBJS = blast.o
  341. X
  342. X PROGRAM = blast
  343. X
  344. Xall:: blast
  345. X
  346. Xblast: $(OBJS) $(DEPLIBS)
  347. X    $(RM) $@
  348. X    $(CC) -o $@ $(OBJS) $(LDOPTIONS) $(LOCAL_LIBRARIES) $(LDLIBS) $(EXTRA_LOAD_FLAGS)
  349. X
  350. Xsaber_blast:: $(SRCS)
  351. X    # load $(ALLDEFINES) $(SRCS) $(LOCAL_LIBRARIES) $(SYS_LIBRARIES) $(EXTRA_LIBRARIES)
  352. X
  353. Xosaber_blast:: $(OBJS)
  354. X    # load $(ALLDEFINES) $(OBJS) $(LOCAL_LIBRARIES) $(SYS_LIBRARIES) $(EXTRA_LIBRARIES)
  355. X
  356. Xinstall:: blast
  357. X    @if [ -d $(DESTDIR)$(BINDIR) ]; then set +x; \
  358. X    else (set -x; $(MKDIRHIER) $(DESTDIR)$(BINDIR)); fi
  359. X    $(INSTALL) -c $(INSTPGMFLAGS)  blast $(DESTDIR)$(BINDIR)
  360. X
  361. Xinstall.man:: blast.man
  362. X    @if [ -d $(DESTDIR)$(MANDIR) ]; then set +x; \
  363. X    else (set -x; $(MKDIRHIER) $(DESTDIR)$(MANDIR)); fi
  364. X    $(INSTALL) -c $(INSTMANFLAGS) blast.man $(DESTDIR)$(MANDIR)/blast.$(MANSUFFIX)
  365. X
  366. Xdepend::
  367. X    $(DEPEND) $(DEPENDFLAGS) -s "# DO NOT DELETE" -- $(ALLDEFINES) -- $(SRCS)
  368. X
  369. Xlint:
  370. X    $(LINT) $(LINTFLAGS) $(SRCS) $(LINTLIBS)
  371. Xlint1:
  372. X    $(LINT) $(LINTFLAGS) $(FILE) $(LINTLIBS)
  373. X
  374. Xclean::
  375. X    $(RM) $(PROGRAM)
  376. X
  377. Xblast: shooting.au
  378. X
  379. Xshooting.au: shooting.au.uu
  380. X    uudecode shooting.au.uu
  381. X
  382. X# -------------------------------------------------------------------------
  383. X# common rules for all Makefiles - do not edit
  384. X
  385. Xemptyrule::
  386. X
  387. Xclean::
  388. X    $(RM_CMD) "#"*
  389. X
  390. XMakefile::
  391. X    -@if [ -f Makefile ]; then set -x; \
  392. X    $(RM) Makefile.bak; $(MV) Makefile Makefile.bak; \
  393. X    else exit 0; fi
  394. X    $(IMAKE_CMD) -DTOPDIR=$(TOP) -DCURDIR=$(CURRENT_DIR)
  395. X
  396. Xtags::
  397. X    $(TAGS) -w *.[ch]
  398. X    $(TAGS) -xw *.[ch] > TAGS
  399. X
  400. Xsaber:
  401. X    # load $(ALLDEFINES) $(SRCS)
  402. X
  403. Xosaber:
  404. X    # load $(ALLDEFINES) $(OBJS)
  405. X
  406. X# -------------------------------------------------------------------------
  407. X# empty rules for directories that do not have SUBDIRS - do not edit
  408. X
  409. Xinstall::
  410. X    @echo "install in $(CURRENT_DIR) done"
  411. X
  412. Xinstall.man::
  413. X    @echo "install.man in $(CURRENT_DIR) done"
  414. X
  415. XMakefiles::
  416. X
  417. Xincludes::
  418. X
  419. X# -------------------------------------------------------------------------
  420. X# dependencies generated by makedepend
  421. X
  422. *-*-END-of-Makefile-*-*
  423. echo x - README
  424. sed 's/^X//' >README <<'*-*-END-of-README-*-*'
  425. Xblast v1.0
  426. XCopyright (c) 1992 Daniel Dee
  427. XThis program is free software; you may
  428. Xredistribute it and/or modify it under the terms of
  429. Xthe GNU General Public License as published by the
  430. XFree Software Foundation; either version, or
  431. Xany later version.
  432. X
  433. X
  434. Xemail: ddee@vicorp.com
  435. XV.I. Corporation
  436. X47 Pleasant Street
  437. XNorthampton, MA 01060
  438. X
  439. X
  440. XWhat is Blast?
  441. X
  442. XBlast is simple program that lets you blast holes any window in X
  443. Xusing mouse button 1. Mouse button 2 repairs blasted windows and
  444. Xmouse button 3 exits the program. Holes become permanent unless 
  445. Xyou repair them before you quit. You may move permanently "damaged"
  446. Xwindows and enjoy the view behind the holes.
  447. X
  448. X
  449. XBuilding Blast
  450. X
  451. XEdit the Imakefile. Set CCOPTIONS to use the appropriate 
  452. Xplatform/architecture. Then type xmkmf to generate a new
  453. XMakefile. Type: make blast to build the blast program.
  454. X
  455. XThis program was tested on Sparc IPC, Silicon Graphics IRIS,
  456. X386s running SCO Unix, and DECstations running Ultrix.
  457. X
  458. X
  459. XTechnical Details
  460. X
  461. XBlast uses the X Window Shape Extension library. If you are 
  462. Xbuilding this on a Sun 4, you may also enable the shooting sound
  463. Xeffect.
  464. X
  465. XYou may have the program repair all holes by default when you
  466. Xquit by setting REPAIR_EVERYTHING_IN_SIGHT.
  467. X
  468. XThe program is not overly sophisticated. It was written as an
  469. Xexercise in using X Shape Extension. Hopefully, it will 
  470. Xeducational for others as well.
  471. X
  472. X
  473. XAny suggestion for future enhancements is welcome. I'd like most
  474. Xto incorporate sound effects for machines other the Sun. If
  475. Xsomebody can give me a hint on where to start, I'd be most grateful.
  476. X
  477. XEnjoy.
  478. X
  479. *-*-END-of-README-*-*
  480. echo x - blast.c
  481. sed 's/^X//' >blast.c <<'*-*-END-of-blast.c-*-*'
  482. X#ifndef lint
  483. Xstatic char SccsId[] = "@(#)blast.c    V1.1    9/9/92";
  484. X#endif
  485. X
  486. X/* blast.c
  487. X   Written by Daniel Dee  7/23/92
  488. X
  489. X   Copyright (c) 1992 Daniel Dee
  490. X   This program is free software; you may
  491. X   redistribute it and/or modify it under the terms of
  492. X   the GNU General Public License as published by the
  493. X   Free Software Foundation; either version, or
  494. X   any later version.
  495. X
  496. X   email: ddee@vicorp.com
  497. X   V.I. Corporation
  498. X   47 Pleasant Street
  499. X   Northampton, MA 01060
  500. X*/
  501. X
  502. X#include <stdio.h>
  503. X
  504. X#ifndef VMS
  505. X/* Header files for Unix version */
  506. X#include <X11/X.h>
  507. X#include <X11/Xlib.h>
  508. X#include <X11/Xutil.h>
  509. X#include <X11/Intrinsic.h>
  510. X#include <X11/Xatom.h>
  511. X#include <X11/cursorfont.h>
  512. X#include <X11/keysym.h>
  513. X#include <X11/extensions/shape.h>
  514. X
  515. X#include <errno.h>
  516. X#include <ctype.h>
  517. X#include <stdlib.h>
  518. X#include <fcntl.h>
  519. X#else
  520. X/* Header files for VMS version */
  521. X#include <decw$include/Xlib.h>
  522. X#include <decw$include/Xutil.h>
  523. X#include <decw$include/Intrinsic.h>
  524. X#include <decw$include/Xatom.h>
  525. X#include <decw$include/keysym.h>
  526. X#endif /* VMS */
  527. X
  528. X#define INITIAL_MAXWIN 100
  529. X#define AUDIO_DEVICE "/dev/audio"
  530. X#define FILENAME "shooting.au"
  531. X
  532. Xstatic void BlastWindow();
  533. Xstatic void SaveWindow();
  534. Xstatic Window GetWindowToBlast();
  535. Xstatic void RepairWindows();
  536. Xstatic void MakeNoise();
  537. Xstatic FILE* OpenSoundFile();
  538. Xstatic void CloseSoundFile();
  539. X
  540. Xtypedef struct 
  541. X{
  542. X  Window window;
  543. X  Bool  bshaped;  
  544. X  XRectangle *bound;
  545. X  int bcount;
  546. X  int border;  
  547. X  Bool cshaped;  
  548. X  XRectangle *clip;
  549. X  int ccount;
  550. X  int corder;  
  551. X}
  552. XWinList;
  553. X
  554. Xmain( argc, argv )
  555. Xint argc;
  556. Xchar *argv[];
  557. X{
  558. X  Display *display;
  559. X  Window window, root;
  560. X  long screen;  
  561. X  GC gc;
  562. X  XEvent event;
  563. X  XGCValues gcvalues;   
  564. X  Pixmap shape_mask;
  565. X  WinList *winlist;
  566. X  int numwin = 0;  
  567. X  int maxwin = INITIAL_MAXWIN;
  568. X  FILE *fp, *afp;  
  569. X
  570. X  /* Open display connection and create a window */
  571. X  if( (display = XOpenDisplay( "" )) == (Display*)NULL ) 
  572. X  {
  573. X    fprintf( stderr, "Invalid display\n" );
  574. X    exit(0);
  575. X  }
  576. X
  577. X  winlist = (WinList*)malloc( maxwin * sizeof(WinList) );
  578. X  screen = DefaultScreen(display);
  579. X  root = RootWindow( display, screen );  
  580. X
  581. X  gcvalues.foreground = 1;
  582. X  gcvalues.background = 0;
  583. X  shape_mask = XCreatePixmap( display, root,
  584. X                 DisplayWidth(display,screen), 
  585. X                 DisplayHeight(display,screen), 1);
  586. X  gc = XCreateGC(display, shape_mask, GCForeground | GCBackground, &gcvalues);
  587. X
  588. X  afp = OpenSoundFile();  
  589. X
  590. X  /* Main event loop */
  591. X  for(;;)
  592. X  {
  593. X    window = GetWindowToBlast(display, screen, &event, winlist, 
  594. X                  &numwin, &maxwin);
  595. X    switch( event.xbutton.button )
  596. X    {
  597. X    case Button1:
  598. X      BlastWindow( display, window, gc, screen, shape_mask, afp );
  599. X      break;
  600. X    case Button2:
  601. X      RepairWindows( display, root, winlist, numwin );
  602. X      break;
  603. X    case Button3:
  604. X      CloseSoundFile( afp );
  605. X      exit(0);      
  606. X    }
  607. X  }
  608. X}
  609. X
  610. X
  611. Xstatic void BlastWindow( display, window, gc, screen, shape_mask, afp )
  612. XDisplay *display;
  613. XWindow window;
  614. XGC gc;
  615. Xlong screen;
  616. XPixmap shape_mask;
  617. XFILE *afp;
  618. X{
  619. X  int x, y, root_x, root_y;
  620. X  unsigned int bwidth, dummy;
  621. X  unsigned int key_buttons;
  622. X  Window root, child;
  623. X
  624. X  XGetGeometry( display, window, &root, &x, &y,
  625. X           &dummy, &dummy, &bwidth, &dummy );  
  626. X
  627. X#if 0
  628. X  window = XmuClientWindow (display, window);
  629. X#endif
  630. X
  631. X  XSetForeground( display, gc, 1 );
  632. X  XFillRectangle( display, shape_mask, gc, 0, 0, 
  633. X         DisplayWidth(display,screen),
  634. X         DisplayHeight(display,screen) );
  635. X  
  636. X  XQueryPointer(display, window, &root, &child, &root_x, 
  637. X        &root_y, &x, &y, &key_buttons );
  638. X
  639. X  XSetForeground( display, gc, 0 );
  640. X  XFillArc( display, shape_mask, gc, x-25, y-25, 50, 50, 0, 360 * 64);
  641. X  XShapeCombineMask(display,window,ShapeBounding, -bwidth, -bwidth, 
  642. X            shape_mask, 
  643. X            ShapeIntersect );
  644. X  MakeNoise(afp, FILENAME);  
  645. X}
  646. X
  647. X
  648. Xstatic Window GetWindowToBlast(display, screen, event, winlist, numwin, maxwin)
  649. XDisplay *display;
  650. Xlong screen;
  651. XXEvent *event;
  652. XWinList *winlist;
  653. Xint *numwin, *maxwin;
  654. X{
  655. X  int status;
  656. X  Cursor cursor;
  657. X  Window target_win = None, root = RootWindow(display,screen);
  658. X  int buttons = 0;
  659. X
  660. X  /* Make the target cursor */
  661. X  cursor = XCreateFontCursor(display, XC_crosshair);
  662. X
  663. X  /* Grab the pointer using target cursor, letting it room all over */
  664. X  status = XGrabPointer(display, root, False,
  665. X            ButtonPressMask|ButtonReleaseMask, GrabModeSync,
  666. X            GrabModeAsync, root, cursor, CurrentTime);
  667. X#if 0
  668. X  if (status != GrabSuccess) Fatal_Error("Can't grab the mouse.");
  669. X#endif
  670. X
  671. X  /* Let the user select a window... */
  672. X  while ((target_win == None) || (buttons != 0)) {
  673. X    /* allow one more event */
  674. X    XAllowEvents(display, SyncPointer, CurrentTime);
  675. X    XWindowEvent(display, root, ButtonPressMask|ButtonReleaseMask, event);
  676. X    switch (event->type) 
  677. X    {
  678. X    case ButtonPress:
  679. X      if (target_win == None) 
  680. X      {
  681. X    target_win = event->xbutton.subwindow; /* window selected */
  682. X    if (target_win == None) target_win = root;
  683. X      }
  684. X      buttons++;
  685. X      break;
  686. X    case ButtonRelease:
  687. X      if (buttons > 0) /* there may have been some down before we started */
  688. X    buttons--;
  689. X       break;
  690. X    }
  691. X  } 
  692. X
  693. X  XUngrabPointer(display, CurrentTime);      /* Done with pointer */
  694. X  SaveWindow( display, target_win, winlist, numwin, maxwin );  
  695. X  return(target_win);
  696. X}
  697. X
  698. Xstatic void RepairWindows( display, window, winlist, numwin )
  699. XDisplay *display;
  700. XWindow window;
  701. XWinList *winlist;
  702. Xint numwin;
  703. X{
  704. X  Window root, parent, *children;
  705. X  int i, num_children;  
  706. X#ifdef REPAIR_EVERYTHING_IN_SIGHT
  707. X  XQueryTree( display, window, &root, &parent, &children, &num_children );
  708. X  for( i=0; i < num_children; i++ )
  709. X    XShapeCombineMask(display, children[i], ShapeBounding, 0, 0, 
  710. X              None, ShapeSet );
  711. X  XFree( *children );
  712. X#endif
  713. X  for( i=0; i < numwin; i++ )
  714. X  {    
  715. X    if( winlist[i].bshaped )
  716. X      XShapeCombineRectangles( display, winlist[i].window, ShapeBounding,
  717. X                0, 0, winlist[i].bound, winlist[i].bcount,
  718. X                ShapeSet, winlist[i].border );
  719. X    else
  720. X      XShapeCombineMask(display, winlist[i].window, ShapeBounding, 0, 0, 
  721. X            None, ShapeSet );
  722. X      
  723. X    if( winlist[i].cshaped )
  724. X      XShapeCombineRectangles( display, winlist[i].window, ShapeClip,
  725. X                0, 0, winlist[i].clip, winlist[i].ccount,
  726. X                ShapeSet, winlist[i].corder );
  727. X    else
  728. X      XShapeCombineMask(display, winlist[i].window, ShapeClip, 0, 0, 
  729. X            None, ShapeSet );
  730. X  } 
  731. X}
  732. X
  733. Xstatic void SaveWindow( display, window, winlist, numwin, maxwin )
  734. XDisplay *display;
  735. XWindow window;
  736. XWinList *winlist;
  737. Xint *numwin, *maxwin;
  738. X{
  739. X  int i, count, order, dummy;  
  740. X  Bool bshaped, cshaped;
  741. X  unsigned int udummy;
  742. X  
  743. X  for( i=0; i < *numwin; i++ )
  744. X    if( window == winlist[i].window )
  745. X      return;
  746. X  winlist[*numwin].window = window;  
  747. X
  748. X  XShapeQueryExtents(display, window, &bshaped, 
  749. X             &dummy, &dummy, &udummy, &udummy,
  750. X             &cshaped, &dummy, &dummy, &udummy, &udummy);
  751. X  
  752. X  if( winlist[*numwin].bshaped = bshaped )
  753. X  {
  754. X    winlist[*numwin].bound = XShapeGetRectangles( display, window, 
  755. X                         ShapeBounding, &count, &order );
  756. X    winlist[*numwin].bcount = count;
  757. X    winlist[*numwin].border = order;  
  758. X  }
  759. X  
  760. X  if( winlist[*numwin].cshaped = cshaped )
  761. X  {    
  762. X    winlist[*numwin].clip = XShapeGetRectangles( display, window, ShapeClip, 
  763. X                        &count, &order );
  764. X    winlist[*numwin].ccount = count;
  765. X    winlist[*numwin].corder = order;  
  766. X  }
  767. X  
  768. X  (*numwin)++;
  769. X
  770. X  if( *numwin >= *maxwin )
  771. X  {    
  772. X    winlist = (WinList*)realloc( winlist, 2 * (*maxwin) * sizeof(WinList) );
  773. X    *maxwin *= 2;
  774. X  }  
  775. X  
  776. X}
  777. X
  778. Xstatic void MakeNoise( afp, filename )
  779. XFILE *afp;
  780. XString filename;
  781. X{
  782. X  unsigned char buf[1024*64];
  783. X  int cnt;
  784. X  FILE *fp;  
  785. X#ifdef sun4  
  786. X  fp = (FILE*)open( filename, O_RDONLY, 0 );  
  787. X  while( (cnt = read(fp, (char*)buf, sizeof(buf))) > 0 )
  788. X    write( afp, (char*)buf, cnt );
  789. X  close(fp);  
  790. X#endif
  791. X}
  792. X
  793. Xstatic FILE* OpenSoundFile()
  794. X{
  795. X#ifdef sun4
  796. X  return (FILE*)open( AUDIO_DEVICE, O_WRONLY | O_NDELAY );  
  797. X#endif
  798. X}
  799. X
  800. Xstatic void CloseSoundFile( afp )
  801. XFILE *afp;
  802. X{
  803. X#ifdef sun4
  804. X  close( afp );
  805. X#endif
  806. X}
  807. *-*-END-of-blast.c-*-*
  808. echo x - shooting.au.uu
  809. sed 's/^X//' >shooting.au.uu <<'*-*-END-of-shooting.au.uu-*-*'
  810. Xbegin 644 shooting.au
  811. XM+G-N9    !@  !#L     @  'T     !    !#]_=&%P9#8G)!#@Q*"$@(#1
  812. XM!S8@+R8_4%,@QS]_P+]0@)]_ (#_?W!_?^#W?P"#*X" [Z" @%_@?W]P?W\@
  813. XM'S((^/" @(" @)&7_W]_?W]_?W]_$*" @(" @(" EQ]_?W]_?W]_?T3 @(" 
  814. XM@(" @(#7$V%_?W]_?W]_>#X @(" @(" @("1H.=_?W]_?W]_?V!2(*"G@(" 
  815. XM@(" @[?[/WI_?W]_?WAR4"#0@(" @(" @/\I/VM_?W]_<']_4/CPH*&@@(" 
  816. XM@(&_ QM_?W]_?W]_<!"PH(" @("#D/<@%V]_?W]_?W$P\+" @(" D*__\.L_
  817. XM(-8?:V!C8  /5C04$"\_("<B_?O!NZ"GT="G^T= 7V!??W]_=!#0@(" @(#/
  818. XM ,<_8#]_0"-_(*<'D(<&P-=_$-]_(+]_$( ?0(#_?X#_?Z#_?T"G7WR@OV<@
  819. XM@/= @)=70*#_?U#W?W_ WTL @(#$@(#??R"A/W]P+W]_X("_*(" GW]_@("W
  820. XM?W^ @-=??W]@!0"[Q+\_?N" AU=_ &]@,@8@H//_X("GL,]31"4\;W\@_S<@
  821. XM@(!O8(" T(!_((!_?U<T(U5@/^" URB$GS]_,-+O?W]_?P" _W" _X" +L"I
  822. XM@#]_@#]_,/W0WS\ @("3R8"7/U 0/R" /W]P@&] @#][4("O?X!O?V<T?Z" 
  823. XM;W_ @(#+/W]_?X"'?T!O?^#72P" @*^@@(#G?W] ?W]_?V" @7\ @(#/D(" 
  824. XMKW\1?WA_?W\ ]W^HSX" I("#@(" )W]\/W]_?V"G?T" _WB @'_ @)]TP']\
  825. XMTW] .W_PH("'0(" _^"O!( _?\ _?W_@/W]X@#]_@)<@@)\P@(=@H(#W?T" 
  826. XM_W!??R" /V" @/\*P("O?X" =W\ /W_ _W]_(( B@+]_\(" _W9_>(=_?]#_
  827. XM?W_ @)+_X(" ?T#D_T" _W\7?Z#_8( O<*#?P-]_=S" WVB0GS#G ( _?V" 
  828. XM@W]_Z#]_ (!_,-?@@/^POW\PNVB KW]_H)]_0( O8+L@@(!_?Z" 7W\P@#]_
  829. XMH(!_0+<0@(%_8-]_()=_((!_?^#7?R" @-,_$._PDW]_(("!?W\ @']P@( _
  830. XM(#]0JW=_T#]_L(!;X(!O4("O?V"0_W]_X#< MW] @( _1.R /W\ @#]_,U"P
  831. XM_SC([W\@@+]PH-]_((,_?V# LR< @-^XWU8@@(!/>73@WW]@@($W0"WPIRM0
  832. XM(#=_((#WX- G?P" @"]_(",]/S#HT(-??P" @U\@PK3_-W]@H"] YW]_X/]_
  833. XMP(%B@(#0@!]^X(?G]U]_((!??X"/4(#W4']_H(=_ (=_8(!_?X"O?\#_@(!_
  834. XM0( _>(!_?\" ?T" AQ"_4("!?P" ?T#??W^ [W\ @#] KW^@/WB WW^@CW]X
  835. XM@.]_((!_4*]_P(!_@(!O0(!_?\"??WB @'? CS" @'?@OW]@MW]_,( W?P" 
  836. XM_W^ AW" CW\@OW]_L"=_8(" >P" @'_ @%<0_W\@@']^@(=_ ("O?R" /W\ 
  837. XME0_H?W" WW_@@']_0( ??^" 'S"7=T# _W^ OW] @!]_?P" _V" @&=@_W\ 
  838. XM@/]_H(%_8("7?W" @#]_ ( _?^!_?Z"!?R" _T" @"]_X( W?VB @W]PRW]X
  839. XM@)]_((!??(" ?W_@@"]_8(" ?W^@GW] @+]_X( _?R" /W\@@*]_?L" OW]P
  840. XM@+]_8("_?^" ?W_ @#]_8("W?W^@@*]_,(!O?T" _W^@AW]P@(!??P" MW]_
  841. XMX(#_?P" /W\ @"]_H(!_?S" GW]_P( ??W" @%]_P("_;P" _W\@@%]_8("W
  842. XM?VH@@)=W?\" AW]P@)=G?^" 7W^@@%]T0(" /W] D(#??W_ @&]_,("W)WL 
  843. XM@/]_((#_?S#0@!]_5%" @%]_0("O/W_ @5; IQ,Q/W] @+=_)/R@+V"C/S"@
  844. XM@']_X(=_?W" @VW0U7XPOW]@@(%_,#< OT3Q?R"H@(=_8(#??W_ @#]_H%] 
  845. XM@']_ ( _,(-_X-^ OW\X\(#??P" /W]PT(#??P0%@(!G?V" OW_S?T" []#_
  846. XM?S" @/]_4(" =W]^@(!??T"T^("??W\@@"]0@%]_@("_/W]_H("_?V" @*]_
  847. XM?S" KW]_X/= A?]00,"#/R 30+#/P(!_4* _?/#3/R"@OW]P@( _?\#O-($_
  848. XM?_ O(/[HJ#]_X+,)/WC@@!]_P/=XT.=0*W]@@(=_((#_0("/?J#_8#]^@/]_
  849. XMP(#_>.#G,*M_?J" 'V  X(!O?(" ?V" _W^ /S" ?WR7?R" ?W\ @/]T %<P
  850. XM@.]^  "%/W\@JS]_8(" ?WR _W^P_^" [W_ _WR AW]_H/_ _W]@H."C?V##
  851. XM#5L@@#< WRB OW^@@'\ @#]PX#]_(7V@@']POU"0]W]_ ("#-_,^@/]P@)=_
  852. XM "=PD%=_@.]_@*=_8(#_?^#_?\" $S9 D+^P_W]@@( _?]#Q'W] @+]_,( K
  853. XM&W\P@(]7 ),_X(!W?P"4_W]@@+]_8#S@S["O?R" KW\@H+]_?(#_?[#_4+ _
  854. XM$(!?4* 'T#]@@/] @)]_<(#?(3]_(("O=W\@@-]_0("_?W" +R"5%W3@KW\ 
  855. XM@-]_$*O_/W\0@+]O>("?=1"_/W< @/] @#]P@(!_<( ??Z"G/V XX4]0(%T@
  856. XM@-]M/A"@OQ" +W_ QV=\T3\(_V  AR/0@Q=_((#G,SB KW\@@/=_0(#_?T" 
  857. XM7W_0NH"O?R"!;]"#?W_0@-]_ *,&YW\@@#=_H"]^@+]_<("#?U" 5S#7,0#_
  858. XM0(" ?T" OW] @#]_X(!_?Z" WW]_H( _?X"'?P" _W_@@']X@.= 7W_ @&]_
  859. XM@*]_,("O?U" WW^0_S"!/W^ WW\ @']_H( _?Z" ?R" 5P#??T" 7R" _W]@
  860. XM@(]_?H"'?P" _S;T7W^ @W]@A!=XH(!_?X" ?V" 7T"A?W" @7_ EW]XH(=_
  861. XM?X" ?V" /V" KW] @+]_0,(_?X" ?WZ CW\ CW\@@&]_H(!??^" ?WB /W^@
  862. XM@W_@@']X@+]_8("'?V" CW\@@']_@#]_@*]_((#_?\" /W\ @.]_ (!_?X#O
  863. XM?Z" ?WZ GW]X@( O?T" MW]P@"]PH.]_0("'?T" _W]@@(!_?Z" 7W^@WTCB
  864. XM/W\0@*]_ ( _?P" OW]@@+]_ (!_0(#_?R" _W\@@!]_0("_?P" /W^ @7]@
  865. XM@+]_<(" ?W\0@/=_P(!_<("/?R" 7W\ @']_ (#_?WB @']P@)=_ (!??("'
  866. XM?U" _W] @*]_?P" _W_@@'\@@"]_X( _?P" /W\@@(!_?P" _W\@@#]P@)=_
  867. XM?X" ?W_@TSYV(("'?W" @']@@+]_((#??W" AW]_((#_?R" WW_@@#]_@(!_
  868. XM?X" ?W_@@+]_?\" ;W^@@&] @*]_0(#??T" /W]@@( _?R" CW]@@-<_X+<_
  869. XM>-" +W\ @"=_8*" /W_@@/]_(( _?\" ?W\@@)]_?^" OW]X@(!_?X" ?W^ 
  870. XM@']_ ( O?WB @#]_>(" ?W_ @/]_ ( O?\" ]W] @.]_?\" _W]XH(#_?P" 
  871. XM_W\ @#]_$(#O?U" OUM_ ("'?W_@@!]_ (!??P" _W]_H( O?T"@@/]_(("?
  872. XM?WR AW]P@(]_?X" /W] @( _?V" @&]_D( ?<."K5WR@@/]_(( ??V  @(-G
  873. XM?," KW]XD1-@*@0_?U"@@/]J1O34YS]XT("_:T"DUV]0H(!??T" CW]_0(" 
  874. XM]W]@@( _?R" _W]@@)]_<("7?W^ @#]_?P" SW]P@("7?V" ]V0@H(<_?R2 
  875. XM]W] \,O$%W_@@)]_8(" 7W\ @']_8(" ;W] @(\_?WZ @*]_?H"_?W#@@/]_
  876. XM8("??W" @/]_%"C OU]_((" _W\ @#] M<3'5W_@@/=_$,OGX-]_?Z" MW]_
  877. XM@( _?R" OW]_X(#??WCHH+<7?W^@@)=_?X"_?W@PP*-?>(" /W \T( ?8" \
  878. XM\)#_?V" BQ=_0("'5SC0@(%_?]" ;W\%-3; IW]_@(!_?\" UW]_@(!_?^" 
  879. XM@&]_0("//R!_((" 7W\P@"]_?*" SW]_@( ??R" CW] /WC@@(!_?X" _W]_
  880. XMH( _?U" @/]_?^" _R W?/" @#]_8(" ?W\ @(!_?V" @']_\(" /W_@XJ43
  881. XMT']_H( -+W\@@/]_0-" @#]_X("!?S _(/^@OW]_@(!??T" @7=_((" ;W_ 
  882. XM@(#_?V#0@/=D$%T@D*+O?WZ @#]_8(" _W]_H(#_?S3RH/]_($]0H."1;W^ 
  883. XM@.]_?Z" OW]_$(" ?W_@@)=_,!]_ (" _W]P@(!_?S" @+]_?P" @7]_\(" 
  884. XM_W\@MW9$0(#_?P" Q^-_?Z" /W\ EH"'5W] @(!??X-_ /\$MV]_ ("!?W^@
  885. XM@( _?T" @!]_(,N @']\@#\P? "W?P"5H-=W?H" ?T#HX*"W?W]0L( _?X"?
  886. XM)-,_T-]_0(" MW]P@("W?W\@@( _?R"!I(!_?\"_/O]6X+]WP*?@@"]_T( @
  887. XM(W\@IK<5 W=_P(!??^#_,,=@X-=_0*<(@+]_(("!/W]@D("W?W_0((#_?V"C
  888. XM][<_(( _0("LD/]_0("_4"=_(-'N$#]_0("!?W"0[P"G?P"??T#7?X"/?T" 
  889. XMNQ=_?]" @#]_ ("T@#]_ (#"%W\ @'\PMQ" /W_@@/]_M#] @*LG/W\@@*]_
  890. XM4) O,(-_((!_8(=_P(!_?X" [W=_<.G@@.]_0*#W@(-_?N#?()]_0(#_?]"W
  891. XM0( O?\"*+S#_$2"U$!?S?W2@@']_\(!O(*5/H+]_8!]X@(!_?Y"3WU]_ .\@
  892. XM@/]_,(#_P/]_0("_X+M7 ( _?\" [+]_?P"G/V"W,T#7X)/G95L @)=_?Y"/
  893. XM/R#_?\" ?WZ0)Y" ?W_ @"<@/W\ UPB 'WS @7\ CW]@@/\ MU=_@(!_((#_
  894. XMX!]_8+" /WC$9V 3(*" [V]_ ("_?V" OW\@_R" GW]POW^@@']_@+\K.7=_
  895. XM0(BD@/]_,(#_8(#??R"??R#?9\" /W" @"< WW]TH(=_?[#_* CP^MO_9U# 
  896. XM@/]_0(#_?^ ?,("O?V"@Y8"'?W^@OQ<@-W]_(-+ D3]0@),OP( O?\#/=  /
  897. XM:P"@_U% $.H#!.$/(O#![TH1 <;O/RCPU^OPYP?@YV=PL+]W *LG?5 /=WS0
  898. XMOQ("?Q"3Y]3'H/=_?_" AW]@]Q17?\"_?Z" ?V" OR" [W]_@)?_(."'/W]\
  899. XM@( ?9  _?W"@_W\@Q-W@UW]@@( _8-#?5^" ?W_ UW]_H)<_>F@ZX-3A*4B@
  900. XM@+]_X(6 [W# MSR _W]PP!]_ (#_?P" XR-K?S#@H5L@@(-_>("O?R" EU]_
  901. XM4'- T2]_,("_?RBHUZ"#VV,P@( _4)/_4"5$.V\@@/]_>(" OW]_@(-_0("O
  902. XMP(#??W_0_S6 @']XVW]0^Q#7;W_ V_" EV,PB/]_((!70(#??Z"O90"@/W!C
  903. XM0! _?P"#]RYCX("7Z^*DSVM_8B#1MS]_<," /W^@@#]_\/\7$-"E/U#0@-_@
  904. XM@("O/W]_23P_?W1_?R" _W^ @-B7?W^0GRB @V]_H*]_((" 'W\ M_]P(/]_
  905. XM8.!?0("'%W\ @#]@H( ??V#\_\#'X%]P@/]_<-+:(1#;?V"K@+\_?H" ?W\D
  906. XMY_]_?R O?WR @-]_?X" /S" A^'_,A4]X(#_0( 7?S"PORYG/4L_/ "WQ("_
  907. XD?T#(D]<O\-%??Z"??W"G/W]P@($_$-; YV]\Y,?0TS\P@!]@
  908. Xend
  909. *-*-END-of-shooting.au.uu-*-*
  910. exit
  911. exit 0 # Just in case...
  912. -- 
  913.   // chris@IMD.Sterling.COM            | Send comp.sources.x submissions to:
  914. \X/  Amiga - The only way to fly!      |
  915.  "It's intuitively obvious to the most |    sources-x@imd.sterling.com
  916.   casual observer..."                  |
  917.