[comp.windows.news] NewsDraw 3/5

bvs%carlisle@Sun.COM (Bruce Schwartz) (12/17/88)

#! /bin/sh
# This is a shell archive, meaning:
# 1. Remove everything above the #! /bin/sh line.
# 2. Save the resulting text in a file.
# 3. Execute the file with /bin/sh (not csh) to create:
#	psint.cps
#	draw.ps
#	menubar.ps
# This archive created: Fri Dec 16 15:05:52 1988
export PATH; PATH=/bin:/usr/bin:$PATH
if test -f 'psint.cps'
then
	echo shar: "will not over-write existing file 'psint.cps'"
else
cat << \SHAR_EOF > 'psint.cps'
%!
%
% $Header: psint.cps,v 1.6 88/12/02 10:43:17 bvs Exp $
%

cdef ps_init(string buf)
	/DEFSTR_TAG	0 def
	/TOOL_TAG	100 def
	/SELECT_TAG	200 def
	/ADJUST_TAG	300 def
	/POINT_TAG	400 def
	/ANGLE_TAG	401 def
	/KEY_TAG	500 def
	/DAMAGE_TAG	600 def
	/PROP_TAG	700 def

	/STRETCH_MODE 	0 def
	/ROTATE_MODE 	1 def
	/BRUSH_MODE		2 def
	/LINE_MODE		3 def
	/RECT_MODE		4 def
	/CIRC_MODE	 	5 def
	/OVAL_MODE		6 def
	/TEXT_MODE		7 def
	/POLY_MODE		8 def

	/FILL_KEY	1 def
	/STROKE_KEY	2 def
	/WIDTH_KEY	3 def
	/PRINT_KEY	4 def
	/TOTOP_KEY	5 def
	/TOBOT_KEY	6 def
	/TEXT_KEY	7 def
	/REDRAW_KEY	8 def
	/WRITE_KEY	9 def
	/READ_KEY	10 def

	buf (/menubar.ps) append LoadFile
	buf (/draw.ps) append LoadFile
	clear

#define DEFSTR_TAG	0
#define TOOL_TAG	100
#define SELECT_TAG	200
#define ADJUST_TAG	300
#define POINT_TAG	400
#define ANGLE_TAG	401
#define KEY_TAG		500
#define DAMAGE_TAG	600
#define PROP_TAG	700


cdef ps_fontsetup(string name, size, index, length, bbheight, descent) => \
	DEFSTR_TAG(bbheight, descent, length)
	name findfont size scalefont dup index fontsetup

cdef ps_setcanvas()
	win begin ClientCanvas setcanvas end
cdef ps_setgray(float gray)
	gray setgray

cdef ps_rotate(float angle) angle rotate
cdef ps_translate(x, y) x y translate

cdef ps_dorotate(int x, int y, float angle)
	matrix currentmatrix
	x y translate angle rotate
	x neg y neg translate
cdef ps_unrotate()
	setmatrix

cdef ps_moveinteractive(xinit, yinit, float angle, x0, y0, x1, y1)
	xinit yinit angle x0 y0 x1 y1 /rectMoveInteractive win send

cdef ps_pencilCreateinteractive(x, y)
	x y /pencilCreateInteractive win send
cdef ps_linecreateinteractive(x, y)
	x y /lineCreateInteractive win send
cdef ps_rectcreateinteractive(x, y)
	x y /rectCreateInteractive win send
cdef ps_ovalcreateinteractive(x, y)
	x y /ovalCreateInteractive win send
cdef ps_circcreateinteractive(x, y)
	x y /circCreateInteractive win send
cdef ps_rotateInteractive(float angle, xinit, yinit, xcenter, ycenter, x0, y0, x1, y1)
	angle xinit yinit xcenter ycenter x0 y0 x1 y1 /rotateInteractive win send

cdef ps_stdcursor() /ptr /ptr_m win begin ClientCanvas end setstandardcursor
cdef ps_xcursor() /xhair /xhair_m win begin ClientCanvas end setstandardcursor

cdef ps_stroke() stroke
cdef ps_fill() fill
cdef ps_setlinewidth(width) width setlinewidth
cdef ps_pushclip(x0, y0, x1, y1)
	gsave x0 y0 moveto x0 y1 lineto x1 y1 lineto x1 y0 lineto closepath clip
cdef ps_popclip() grestore
cdef ps_savearea(x, y, w, h)
	x y w h /savearea win send
cdef ps_restorearea()
	/restorearea win send

cdef ps_drawline(x0, y0, x, y)
	x0 y0 moveto x y lineto
cdef ps_drawrect(x0, y0, x, y)
	x0 y0 moveto x0 y lineto x y lineto x y0 lineto closepath
cdef ps_drawcirc(x0, y0, r)
	x0 y0 r 0 360 arc
cdef ps_drawoval(x0, y0, x, y)
	matrix currentmatrix
	x0 y0 translate
	x x0 sub y y0 sub scale
	.5 .5 .5 0 360 arc
	setmatrix

%% ps_drawoval(x, y, r)
%%		x y r 0 360 arc

cdef ps_getcreatepoint(x, y) => POINT_TAG(x, y)
cdef ps_getcreateangle(float f) => ANGLE_TAG(f)

cdef ps_getmode(int mode) => TOOL_TAG(mode)
cdef ps_getselect(int x, int y) => SELECT_TAG(x, y)
cdef ps_getadjust(int x, int y) => ADJUST_TAG(x, y)
cdef ps_getkey(int key) => KEY_TAG(key)
cdef ps_getprop(int key) => PROP_TAG(key)
cdef ps_getdamage(int x0, int y0, int x1, int y1) => DAMAGE_TAG(x0, y0, x1, y1)
cdef ps_getint(int i) => (i)
cdef ps_getfloat(float f) => (f)


cdef ps_polyline(int count)
	moveto count { lineto } repeat stroke

cdef ps_sendpoint(int x, int y) x y

cdef ps_doclick()
	currentcanvas createoverlay setcanvas
	getclick CLICK_TAG tagprint exch typedprint typedprint
	pstack
SHAR_EOF
fi
if test -f 'draw.ps'
then
	echo shar: "will not over-write existing file 'draw.ps'"
else
cat << \SHAR_EOF > 'draw.ps'
%!
%
% $Header: draw.ps,v 1.7 88/12/02 10:43:15 bvs Exp $
% Copyright (C) 1988 by Sun Microsystems. All rights reserved.
%

/XNeWS? where { pop } { /XNeWS? false def } ifelse

/pathscale { % x1 y1 x2 y2 => w h
	%% 4 copy (pathscale % % % % \n) [ 6 2 roll ] dbgprintf
	exch 4 1 roll sub neg 3 1 roll sub exch
} def
/ShowFillWindow {
  {
	newprocessgroup
	10 dict begin
	/FillWindow framebuffer /new DrawWindow send def
	100 400 400 200 /reshape FillWindow send	
	/map FillWindow send
	/FillWindow null def
	end
  } fork AddProcess
} def

/DrawWindow DefaultWindow
dictbegin
	/FrameKbdMgr null def
	/ScratchCanvas	 null def
	/X0 null def
	/Y0 null def
	/X1 null def
	/Y1 null def
	/XCenter null def
	/YCenter null def
	/Theta null def
dictend
classbegin
	/FrameLabel (NewsDraw) def
	/PaintClient {
		DAMAGE_TAG tagprint
		clippath pathbbox
		% 4 copy (send damage % % % %\n) [ 6 2 roll ] dbgprintf
		4 -1 roll typedprint
		3 -1 roll typedprint
		2 -1 roll typedprint
		typedprint
	} def

	/DefaultRotateInteractive { % x0 y0 proc  -> angle
		gsave
		ClientCanvas createoverlay setcanvas
		getanimated
		waitprocess aload pop
		ANGLE_TAG tagprint
		YCenter sub exch XCenter sub exch atan Theta exch sub typedprint
		grestore
	} def
	/rotateInteractive { % angle xinit yinit x0 y0 x1 y1 => angle
		/Y1 exch def
		/X1 exch def
		/Y0 exch def
		/X0 exch def 
		/YCenter exch def
		/XCenter exch def
		% xinit yinit
		YCenter sub exch XCenter sub exch atan /Theta exch def
		% /Theta X1 X0 sub Y1 Y0 sub atan def
		% (theta is %\n) [ Theta ] dbgprintf
		Theta add /Theta exch def
		% (theta changed to %\n) [ Theta ] dbgprintf
		XCenter YCenter
		  {
			matrix currentmatrix
			x0 y0 translate
			x x0 sub y y0 sub atan Theta exch sub rotate
			x0 neg y0 neg translate
			% avoid drawing 0 width rectangle!
			X0 X1 eq Y0 Y1 eq or
			  { X0 Y0 moveto X1 Y1 lineto }
			  { X0 Y0 moveto X0 Y1 lineto X1 Y1 lineto X1 Y0 lineto closepath}
			ifelse
			setmatrix
		  } DefaultRotateInteractive
	} def

	/DefaultCreateInteractive { % x0 y0 proc  -> x0 y0 x1 y1
		gsave
		ClientCanvas createoverlay setcanvas
		getanimated
		waitprocess aload pop
		POINT_TAG tagprint
		exch
		typedprint typedprint
		grestore
	} def
	/lineCreateInteractive {  % x y
		{ x y lineto } DefaultCreateInteractive
	} def
	/rectCreateInteractive {  % x y
		{  x0 y lineto x y lineto x y0 lineto x0 y0 lineto }
		DefaultCreateInteractive
	} def
	/circCreateInteractive {  % x y
		{
			newpath
			x0 x add 2 div y0 y add 2 div % x y
			x0 x sub dup mul y0 y sub dup mul add sqrt 2 div % r
			0 360 arc
		}
		DefaultCreateInteractive
	} def
	/ovalCreateInteractive { % x y
		{
			newpath
			matrix currentmatrix
			x0 y0 translate
			x x0 sub y y0 sub scale
			.5 .5 .5 0 360 arc
			setmatrix
		}
		DefaultCreateInteractive
	} def

	/PencilDoitInteractive % x y -> points... length
	{
		10 dict begin
		/y exch def
		/x exch def
		x y moveto
		/pointlist [ y x ] def

		/stopevt createevent def
		stopevt begin /Action UpTransition def end

		/evt createevent def
		evt begin /Name MouseDragged def end

		stopevt expressinterest
		evt expressinterest

		/pointlist
		[
			pointlist aload pop	%% add first 2 points
			{
				awaitevent
				begin
					Action UpTransition eq { exit } if

					XLocation YLocation lineto
					currentpoint
					stroke
					moveto
					YLocation XLocation % add another point
				end

				pause
			} loop
		] 
		def

		stopevt revokeinterest
		evt revokeinterest

		[
		pointlist aload pop
		pointlist length
		]
		end
	} def

	/pencilCreateInteractive { % x y
		gsave
		ClientCanvas setcanvas
		{ PencilDoitInteractive } fork waitprocess aload pop
		POINT_TAG tagprint
		0 0 typedprint typedprint  
		dup 2 div typedprint
		{ typedprint } repeat
		grestore
	} def

	/rectMoveInteractive { % xinit yinit angle x0 y0 x1 y1
		/Y1 exch def
		/X1 exch def
		/Y0 exch def
		/X0 exch def 
		/Theta exch def
		/XCenter X0 X1 add 2 div def
		/YCenter Y0 Y1 add 2 div def
		{  
			matrix currentmatrix
			x x0 sub y y0 sub translate
			XCenter YCenter translate
			Theta rotate
			XCenter neg YCenter neg translate
			X0 X1 eq Y0 Y1 eq or
			  { X0 Y0 moveto X1 Y1 lineto }
			  { X0 Y0 moveto X0 Y1 lineto X1 Y1 lineto X1 Y0 lineto closepath }
		    ifelse
			setmatrix
		}
		DefaultCreateInteractive
	} def

	/ClientMenu
	    [ 
			(Move)	{ TOOL_TAG tagprint STRETCH_MODE typedprint }
			(Rotate)	{ TOOL_TAG tagprint ROTATE_MODE typedprint }
			(Brush)	{ TOOL_TAG tagprint BRUSH_MODE typedprint }
			(Line)	{ TOOL_TAG tagprint LINE_MODE typedprint }
			(Box)	{ TOOL_TAG tagprint RECT_MODE typedprint }
			(Oval)	{ TOOL_TAG tagprint OVAL_MODE typedprint }
			(Circle){ TOOL_TAG tagprint CIRC_MODE typedprint }
			(Polygon)	{ TOOL_TAG tagprint POLY_MODE typedprint }
			(Text)	{ TOOL_TAG tagprint TEXT_MODE typedprint }
		]
	    /new DefaultMenu send
	def

	/new {
		/new super send
		begin
			/ScratchCanvas framebuffer newcanvas def
			ScratchCanvas /Retained true put
			% ScratchCanvas /Mapped true put
			gsave
			ScratchCanvas setcanvas
			0 0 0 rgbcolor fillcanvas
			0 0 movecanvas
			grestore

		currentdict
		end
	} def
	/destroy {
		/ScratchCanvas null def
		/destroy super send
	} def

	/savearea { % x y w h
		%% 4 copy (save area % % % %\n) [ 6 2 roll ] dbgprintf
		gsave
		newpath rectpath ScratchCanvas reshapecanvas

		% scale ScratchCanvas by w/h of ClientCanvas
		ClientCanvas setcanvas clippath pathbbox pathscale % w h

		ScratchCanvas setcanvas
		0 0 movecanvas
		0 0 0 rgbcolor fillcanvas

		% X11NEWS BUG!!!
		XNeWS? { pop pop } { scale } ifelse

		ClientCanvas imagecanvas
		grestore
	} def
	/restorearea {
		%% (restore area %\n) [ ScratchCanvas ] dbgprintf
		gsave
		ScratchCanvas setcanvas clippath
		pathbbox pathscale pathbbox pop pop  % w h x y

		ClientCanvas setcanvas

		% X11NEWS BUG!!!
		XNeWS? { pop pop pop pop } { translate scale } ifelse

		ScratchCanvas imagecanvas
		grestore
	} def
classend
def

/sendmouse { 
    Action /DownTransition eq
	{ tagprint XLocation typedprint YLocation typedprint }
	{ pop } ifelse
} def
/AddProcess { } def
/AcceptFocus { } def
/RestoreFocus { } def
/DeSelect { } def
/LeftMouseButton { SELECT_TAG sendmouse } def
/MiddleMouseButton { ADJUST_TAG sendmouse } def
/KeyStroke { KEY_TAG tagprint typedprint } def

/fontsetup { % font font index
    setfileinputtoken
    0 tagprint
	dup setfont
    begin
	currentdict dup fontheight typedprint
	fontdescent typedprint
	WidthArray dup length typedprint
	aload length 2 div { pop typedprint } repeat
    end
} def


%
% Main...such as it is
%

/Times-Roman findfont 36 scalefont setfont
/win framebuffer /new DrawWindow send def	% Create a window
100 100 8 72 mul 32 add dup /reshape win send	
/map win send
/activate win send
win begin ClientCanvas setcanvas end
    {	win begin
		ClientCanvas addkbdinterests
		/MouseDict 5 dict begin
			/LeftMouseButton dup def
			/MiddleMouseButton dup def
			currentdict end def
		createevent begin
	    	/Canvas ClientCanvas def
	    	/Name MouseDict def
	    	currentdict end expressinterest
	 	{	 	clear awaitevent begin
				ClientCanvas setcanvas
	 			{
		    	Name type /integertype eq
					{ Name KeyStroke } 
					{ Name cvx exec } ifelse
				} exec%stopped
				end
	 	} loop
    } fork 

SHAR_EOF
fi
if test -f 'menubar.ps'
then
	echo shar: "will not over-write existing file 'menubar.ps'"
else
cat << \SHAR_EOF > 'menubar.ps'
%!
%
% $Header: menubar.ps,v 1.7 88/12/02 11:36:56 bvs Exp $
% Copyright (C) 1988 by Sun Microsystems. All rights reserved.
%

systemdict begin
    systemdict /Item known not { (NeWS/liteitem.ps) run } if
    systemdict /SimpleScrollbar known not { (NeWS/liteitem.ps) run } if
end

/BarMenu DefaultMenu []
classbegin
	/CenterItems? false def
classend
def


/MenuBar Object
dictbegin
	/X null def
	/Y null def
	/Gap null def
	/MenuBarCanvas null def
	/Items [] def
	/ItemMgr null def
dictend
classbegin
	/new { % x y gap canvas -> -
		/new super send
		begin
			/MenuBarCanvas exch def
			/Gap exch def
			/Y exch def
			/X exch def
			%% (new:  % % % %\n) [ MenuBarCanvas Gap Y X ] dbgprintf
			currentdict
		end
	} def

	/addmenu { % menu name proc -> -
		%% (addmenu: % % % %\n) [ MenuBarCanvas Gap Y X ] dbgprintf
		MenuBarCanvas 0 0 /new MenuItem send       % item
		dup Items 999 3 -1 roll arrayinsert /Items exch def
		dup X Y /move 4 -1 roll send               % item
		dup /bbox exch send pop % x y width
		X add Gap add /X exch def pop pop
	} def

	/activate {
		/ItemMgr Items forkitems def
	} def

	/paint {
		Items paintitems
	} def
classend
def

/MenuItem ButtonItem
[
	/Menu null def
]
classbegin
	/new {
		/new super send
		begin
			/Menu exch def
			% disgusting hack!! not my fault! blame ButtonItem!!
			/ItemRadius	6  def
			/ItemFrame	1 def
			/ItemBorder	1 def
			/ItemGap	2 def
			currentdict
		end
	} def
	/ItemButton	[ RightMouseButton ] def
	/ClientDown {
		%% (client down\n) [] dbgprintf
		true SetButtonValue
		framebuffer setcanvas ItemCanvas getcanvaslocation 
		/showat Menu send
	} def
	/ClientUp {
		%% (client up\n) [] dbgprintf
		pause	% let the menu die!
		false SetButtonValue
		/ItemValue null store
		StopItem
	} def
	/ClientEnter {
		%% (client enter\n) [] dbgprintf
	} def
	/ClientExit {
		%% (client exit\n) [] dbgprintf
	} def
	/setmenu { % menu => -
		/Menu exch def
	} def
	/getmenu { % menu => -
		Menu
	} def
classend
def

/MenuBarWindow DefaultWindow
dictbegin
	/MenuBarItem null def
dictend
classbegin
	/MenuBarSize 30 def

    /ShapeClientCanvas { % - => - ([Re]set client canvas' shape)
		ClientCanvas null ne {
			gsave
			FrameCanvas setcanvas
			BorderLeft BorderBottom translate
			0 0 ClientWidth ClientHeight MenuBarSize sub
			ClientPath
			ClientCanvas reshapecanvas
			grestore
		} if
    } def

    /PaintFrameBorder { % - => - (Paint frame border areas)
        FrameFillColor fillcanvas FrameBorderColor strokecanvas
        BorderLeft .5 sub BorderBottom .5 sub
        FrameWidth BorderLeft BorderRight add sub 1 add
        FrameHeight BorderBottom BorderTop add sub 1 add
		FramePath stroke

        BorderLeft .5 sub BorderBottom .5 sub
        FrameWidth BorderLeft BorderRight add sub 1 add
        FrameHeight BorderBottom BorderTop add sub 1 add MenuBarSize sub 
		FramePath stroke

    	/paint MenuBarItem send
    } def


	/activate {
		/MenuBarItem
			BorderLeft 5 add
			FrameHeight BorderTop sub MenuBarSize sub 5 add
			5	% gap!
			FrameCanvas
			/new MenuBar send
		def

		  [
			(About NewsDraw...)
				{ currentcursorlocation
					[
( NewsDraw consists of about 500 lines of NeWS and about 2000 lines of C. )
( NewsDraw is intended as a demonstration of the proper way to spit a NeWS)
( application into client and server sections.  NewsDraw also demonstrates)
( how the PostScript imaging model allows text and graphics to be treated)
( with equal ease.)
					()
					( Bruce V. Schwartz)
					( bvs@sun.com )
					( \(c\) 1988 Sun Microsystems)
					]
					popmsg
				}
		  ]
		/new BarMenu send (Info ) {} /addmenu MenuBarItem send

		  [
			(Open NewsDraw "file.nd")
				{ PROP_TAG tagprint READ_KEY typedprint }
			(Save NewsDraw "file.nd")
				{ PROP_TAG tagprint WRITE_KEY typedprint }
			(Save PostScript "newsdraw.ps")
				{ PROP_TAG tagprint PRINT_KEY typedprint }
		  ]
		/new BarMenu send (File) {} /addmenu MenuBarItem send

		  [
			(Move)	{ TOOL_TAG tagprint STRETCH_MODE typedprint }
			(Rotate)	{ TOOL_TAG tagprint ROTATE_MODE typedprint }
			(Brush)	{ TOOL_TAG tagprint BRUSH_MODE typedprint }
			(Line)	{ TOOL_TAG tagprint LINE_MODE typedprint }
			(Box)	{ TOOL_TAG tagprint RECT_MODE typedprint }
			(Oval)	{ TOOL_TAG tagprint OVAL_MODE typedprint }
			(Circle){ TOOL_TAG tagprint CIRC_MODE typedprint }
			(Polygon)	{ TOOL_TAG tagprint POLY_MODE typedprint }
			(Text)	{ TOOL_TAG tagprint TEXT_MODE typedprint }
		  ]
		/new BarMenu send (Mode) {} /addmenu MenuBarItem send

		  [
			(To Top)	{ PROP_TAG tagprint TOTOP_KEY typedprint }
			(To Bottom)	{ PROP_TAG tagprint TOBOT_KEY typedprint }
			(Redraw)	{ PROP_TAG tagprint REDRAW_KEY typedprint }
		  ]
		/new BarMenu send (Misc) {} /addmenu MenuBarItem send


		  [
			 (1)	{ PROP_TAG tagprint WIDTH_KEY typedprint  1 typedprint }
			 (2)	{ PROP_TAG tagprint WIDTH_KEY typedprint  2 typedprint }
			 (3)	{ PROP_TAG tagprint WIDTH_KEY typedprint  3 typedprint }
			 (4)	{ PROP_TAG tagprint WIDTH_KEY typedprint  4 typedprint }
			 (5)	{ PROP_TAG tagprint WIDTH_KEY typedprint  5 typedprint }
			 (6)	{ PROP_TAG tagprint WIDTH_KEY typedprint  6 typedprint }
			 (7)	{ PROP_TAG tagprint WIDTH_KEY typedprint  7 typedprint }
			 (8)	{ PROP_TAG tagprint WIDTH_KEY typedprint  8 typedprint }
			 (9)	{ PROP_TAG tagprint WIDTH_KEY typedprint  9 typedprint }
			 (10)	{ PROP_TAG tagprint WIDTH_KEY typedprint 10 typedprint }
		  ]
		/new BarMenu send (Line Width) {} /addmenu MenuBarItem send

		  [
			 (none)		
				{ PROP_TAG tagprint STROKE_KEY typedprint -1.0 typedprint }
			 (white)	
				{ PROP_TAG tagprint STROKE_KEY typedprint  1.0 typedprint }
			 (light gray)	
				{ PROP_TAG tagprint STROKE_KEY typedprint  .75 typedprint }
			 (medium gray)	
				{ PROP_TAG tagprint STROKE_KEY typedprint  .50 typedprint }
			 (dark gray)	
				{ PROP_TAG tagprint STROKE_KEY typedprint  .25 typedprint }
			 (black)	
				{ PROP_TAG tagprint STROKE_KEY typedprint  0.0 typedprint }
		  ]
		/new BarMenu send (Outline) {} /addmenu MenuBarItem send

		  [
			 (none)		
				{ PROP_TAG tagprint FILL_KEY typedprint -1.0 typedprint }
			 (white)	
				{ PROP_TAG tagprint FILL_KEY typedprint  1.0 typedprint }
			 (light gray)	
				{ PROP_TAG tagprint FILL_KEY typedprint  .75 typedprint }
			 (medium gray)	
				{ PROP_TAG tagprint FILL_KEY typedprint  .50 typedprint }
			 (dark gray)	
				{ PROP_TAG tagprint FILL_KEY typedprint  .25 typedprint }
			 (black)	
				{ PROP_TAG tagprint FILL_KEY typedprint  0.0 typedprint }
		  ]

		/new BarMenu send (Fill) {} /addmenu MenuBarItem send
		  [
			 (white)	
				{ PROP_TAG tagprint TEXT_KEY typedprint  1.0 typedprint }
			 (light gray)	
				{ PROP_TAG tagprint TEXT_KEY typedprint  .75 typedprint }
			 (medium gray)	
				{ PROP_TAG tagprint TEXT_KEY typedprint  .50 typedprint }
			 (dark gray)	
				{ PROP_TAG tagprint TEXT_KEY typedprint  .25 typedprint }
			 (black)	
				{ PROP_TAG tagprint TEXT_KEY typedprint  0.0 typedprint }
		  ]
		/new BarMenu send (Text) {} /addmenu MenuBarItem send

    	/activate MenuBarItem send
		{
			createevent begin
				/Canvas ClientCanvas def
				/Name [ /LeftMouseButton /MiddleMouseButton ] def
			currentdict end expressinterest
			  {
				clear awaitevent begin
				end
			  } loop
		} fork pop
	} def

classend
def

/DefaultWindow MenuBarWindow def

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

SHAR_EOF
fi
exit 0
#	End of shell archive