############################################################################
#
#	File:     em_setup.icn
#
#	Subject:  Procedures to set up execution monitors 
#
#	Author:   Ralph E. Griswold
#
#	Date:     March 3, 1997
#
############################################################################
#
#   This file is in the public domain.
#
############################################################################
#
#  These procedures provide support for the routine parts of building
#  Icon execution monitors, including what's necessary for them to
#  run stand-alone as well as under the control of monitor coordinators
#  like eve and vc.
#
#  	vis_setup(args[])	opens a window with attributes given
#				by args[]
#
#	em_setup(sp)		loads sp as the program to be monitored
#
#	context_setup(mask)	returns table of graphics context for
#				mask	
#
#	prog_name()		returns the name of the source program
#				for the SP set up by em_setup()
#
#	em_end()		hold visualization window open if (a)
#				there is one and (b) monitoring is
#				stand alone
#
############################################################################
#
#  Requires:  Version 9 MT Icon, instrumentation, and graphics
#
############################################################################
#
#  Links:  evinit, interact, typebind, graphics
#
############################################################################
#
#  Includes: evdefs.icn
#
############################################################################

link evinit
link interact
link typebind
link graphics

$include "evdefs.icn"

global Coordination		# if nonnull, vc is in charge
global Visualization		# visualization window
global EventSource		# vc's event source

procedure vis_setup(args[])	#: set up visualization window

   Visualization := (WOpen ! args) |
      stop("*** cannot open window for visualization")

   return Visualization

end

procedure em_setup(sp)		#: set up program to be monitored
   local trash

   trash := open("/dev/null", "w") |
      stop("*** cannot open /dev/null")

   EvInit(sp, , trash, trash) | stop("*** cannot load SP")

   return

end

procedure context_setup(mask)	#: table of graphics contexts for mask

   return typebind(Visualization, mask)

end

procedure prog_name()		#: name of monitored source program

   return variable("&progname", EventSource) || ".icn"

end

procedure em_end()		#: hold event monitoring for event at end
   local back

   back := WOpen("canvas=hidden", "bg=light gray")
   if /Coordination then ExitNotice(back, "Normal termination of SP")

end
