[comp.windows.news] No class whatsoever

sjs@spectral.ctt.bellcore.com (Stan Switzer) (01/27/89)

This is another silly little program to amuse you and annoy your
friends.

Though it serves no useful purpose (my specialty!), it does illustrate
how to play with canvases, events, interests, etc. directly -- it does
not use any of the higher-level NeWS mechanisms like classes or event
managers.

The idea comes from a program by Chris Warth (ihnp4!ulysses!csw).

As always, enjoy!

Stan Switzer  sjs@ctt.bellcore.com
  "Work is the curse of the drinking class."
-------------------
#!/bin/sh
#
# Catch me if you can!
#
# Copyright (C) 1989 by Stan Switzer. All rights reserved.
# This program is provided for unrestricted use, provided that this 
# copyright message is preserved. There is no warranty, and no author 
# or distributer accepts responsibility for any damage caused by this 
# program.
#
# Stan Switzer  sjs@ctt.bellcore.com
#
# This program is an elaboration on a theme by
#	 Chris Warth (ihnp4!ulysses!csw)
#
# usage:
#	catchme [options] [message]
# options:
#	@system  	run it on someone else's system
#	@@system	a sneakier way to do the same

SYS= CMD=psh N=/usr/NeWS/bin STR=
for ARG
do
	case "$ARG" in
	@@*			) SYS=`expr "$ARG" : '..\(.*\)'`
	  CMD="rsh $SYS sh -c 'NEWSSERVER=\"`setnewshost $SYS`\" $N/psh'";;
	@*			) SYS=`expr "$ARG" : '.\(.*\)'`;;
	*			) STR="$STR $ARG";;
	esac
done

if test -z "$NEWSHOME"; then NEWSHOME=/usr/NeWS; fi

case $PATH in
*/NeWS/bin	)	;;
*		)	PATH=$PATH:$NEWSHOME/bin; export PATH;;
esac

if test -n "$SYS"
then
	if NEWSSERVER=`setnewshost $SYS`
	then	export NEWSSERVER
	else	exit 1
	fi
fi

if test -z "$STR"; then STR=" Catch Me!"; fi
 
{ echo "/Str ($STR ) def"; cat <<EOF ; } | $CMD
/Times-BoldItalic findfont 24 scalefont setfont
/Border 8 def
/Frame 4 def
/Zaprad 100 def
/Count 10 def
/Width Str stringwidth pop Border dup add add def
/Height currentfont fontheight Border dup add add def
/Radius Border def
/Canvas framebuffer newcanvas def
Canvas begin
  /Retained true def
  /SaveBehind true def
end
Radius 0 0 Width Height rrectpath Canvas reshapecanvas
clippath pathbbox 4 2 roll pop pop
  /MaxY exch Height sub def /MaxX exch Width sub def
/Where { MaxX random mul MaxY random mul } def
{ % fork
  Canvas setcanvas
  Where movecanvas
  /Interest createevent dup begin
    /Canvas currentcanvas def
  end def
  Interest /Name 5 dict dup begin
      /Damaged {
	0 fillcanvas
	Border Frame sub Frame Frame Width Frame dup add sub Height
		Frame dup add sub rrectpath
	ColorDisplay? { 1 .7 .7 rgbcolor } .9 ifelse
	setshade fill 0 setgray
	Width 2 div Height 2 div moveto
	0 currentfont fontascent -.5 mul rmoveto
	Str cshow
      } def
      /EnterEvent {
	/Count Count 1 sub def Count 0 le { exit } if
	Where movecanvas Canvas canvastotop
      } def
      /Time {
	Where movecanvas Canvas canvastotop
	dup begin /TimeStamp currenttime random .10 mul add def end
	dup sendevent
      } def
  end put
  Interest expressinterest
  Interest createevent copy dup begin
    /TimeStamp currenttime random .10 mul add def
    /Name /Time def
  end sendevent
  Canvas canvastotop
  Canvas /Mapped true put
  { awaitevent pop } loop pop
  Interest /Name get begin
    /Damaged {
      /Times-BoldItalic findfont 36 scalefont setfont
      newpath
      .05 .05 1 {
	Zaprad Zaprad 2 index Zaprad mul 0 360 arc
	dup ColorDisplay? {
	  dup .2 mul exch		% hue pct
	  1 1 index .4 mul sub exch	% hue sat pct
	  1 exch .05 mul sub		% hue sat bright
	  hsbcolor
	} if
	setshade eofill
	Zaprad Zaprad 2 index Zaprad mul 0 360 arc pop
      } for
      Zaprad Zaprad currentfont fontascent -2 div add moveto
      1 setgray (Boom!) cshow
    } def
    /Time {} def
    /Done { exit } def
  end
  framebuffer setcanvas
  Canvas getcanvaslocation
    Height 2 div add Zaprad sub exch Width 2 div add Zaprad sub exch
    translate Zaprad Zaprad Zaprad 0 360 arc
  Canvas reshapecanvas
  framebuffer createoverlay setcanvas
  gsave 5 setrasteropcode
     ColorDisplay? 1 2 ifelse { clippath fill pause erasepage } repeat
  grestore
  Canvas setcanvas
  Interest /Name get /Damaged get exec
  Interest createevent copy dup begin
    /TimeStamp currenttime 1.5 60 div add def
    /Name /Done def
  end sendevent
  { awaitevent pop } loop pop
} fork
EOF