[comp.windows.news] Big brother

jh@Ist.CO.UK (Jeremy Huxtable) (07/25/88)

Try this out on your NeWS server.....

%!
% eye.ps
%
% Jeremy Huxtable
%
% "Big Brother" implementation in PostScript.

% Create an Eyeball class from the Default window class.

/Eyeball DefaultWindow
dictbegin
    /EyeX 0 def                 % Current eyeball position
    /EyeY 0 def
    /MouseEventMgr null def     % Event manager
dictend
classbegin
    /Transform {
	initmatrix initclip
	clippath pathbbox scale pop pop
	.5 .5 translate
    } def

    /ShapeFrameCanvas {
	gsave ParentCanvas setcanvas
	FrameX FrameY translate
	FrameWidth FrameHeight scale
	.5 .5 .5 0 360 arc
	.5 .5 .2 0 360 arc FrameCanvas setcanvasshape
	grestore
    } def

    /PaintFrame { } def

    /DrawFrame {
	bordercolor setcolor clippath fill
	0 0 .45 0 360 arc
	backgroundcolor setcolor fill
    } def

    /ShapeClientCanvas { } def

    /CreateClientCanvas { /ClientCanvas FrameCanvas newcanvas def } def

    /PaintClient {
	FrameCanvas setcanvas
	damagepath clipcanvas
	Transform DrawFrame clipcanvas
	EyeX EyeY 0 painteyeball
    } def

    /PaintFocus { } def

    /activate { % create event manager to watch the mouse.
	FrameCanvas setcanvas
	/MouseEventMgr [
	    MouseDragged
	    {
		begin
		    EyeX EyeY 1 painteyeball
		    XLocation YLocation 0 painteyeball
		    /EyeX XLocation store
		    /EyeY YLocation store
		    currentdict
		end
		redistributeevent
	    }
	    null % Action
	    null % Canvas
	    eventmgrinterest
	] forkeventmgr def
    } def

    /painteyeball { % x y colour =>
	setgray
	exch atan /angle exch def
	angle cos .2 mul
	angle sin .2 mul
	Transform
	.15 0 360 arc fill
    } def

classend def

% Now actually create a pair of eyes.
/eyeball framebuffer /new Eyeball send def
100 700 16 16 /reshape eyeball send
/map eyeball send
/activate eyeball send
/eyeball framebuffer /new Eyeball send def
145 705 16 16 /reshape eyeball send
/map eyeball send
/activate eyeball send