c Xerox Corporation 1979/1980 BCPL Menu Package DescriptionKeith KnoxJuly 5, 1978Filed on: [Maxc1]Menu.press1. IntroductionAn interactive program is one which communicates with the user, and whose output dependson responses it receives from the user. Two possible forms that these responses can takeare 1) a dialog -- an exchange of questions and answers or 2) a menu -- a visual display ofchoices on the screen which are selected with the mouse. One generally opts for the dialogmethod because the graphical method of using menus is so cumbersome to implement.When a menu is used, it must first be designed on paper (or in your head) and thentranslated into code to create it on the screen. As for inputting information from the mouse,individual programmers may have developed special procedures for their own use, but evenso, they are probably not easily transferable from one application to the next.The menu package, described in this report, is an attempt to simplify both the design andthe implementation of menus for use in BCPL software. This package is only a first cut atthis goal and it is expected to undergo many changes in the future as it matures. In itspresent form, a programmer can use the Alto screen and the mouse to interactively create amenu, and then use the software package to implement it in his own program.1.1. Creating and Using a MenuTo illustrate the method of creating and using a menu, first consider a very simple program.Let's say that someone wishes to write a program that will do only one function -- invert thescreen. To implement this he would like to present the user with a menu containing twoboxes, one labeled INVERT and one labeled QUIT. When the user selects the INVERT box,the screen should turn from white to black (or visa versa), and when he selects the QUITbox, the program should exit.A program using this menu can be easily implemented with the Menu package. First themenu is designed with the menu editor, MenuEdit.RUN. This program lets one create andmanipulate rectangular boxes on the display screen using the mouse and a few simplekeyboard commands. The description of how this is done is given in section 3. ThenMenuEdit writes out two BCPL files which contain a few manifest constants and some tablesdescribing the layout of the menu. These files are compiled and loaded with the mainprogram along with the rest of the Menu package, which consists of three .BR files. Theinitialization procedures then use this code to create and display the menu. These pointsare illustrated in the implementation in the sample program given below.!`pqXXr%UMsi %Q Nt% J#uX FqX Er< C,0 Bh@ @2 ?^; =0. W^BCPL Menu Package Description22. Sample ProgramThe sample program, "Invert.bcpl", is shown below in section 2.1. It simply inverts thedisplay screen when the "Invert Screen" box is selected. A menu was created withMenuEdit and recorded onto the two source files "InvertNames.d" and "InvertTables.bcpl"also shown below. The "names" file contains the name definitions of the two boxes and isincluded in the program with a "get" statement. The "tables" file, on the other hand, iscompiled separately and loaded along with the main program. It contains a procedure calledMenuInitHelp() which is called by CreateMenuDisplayStream(). The procedureMenuInitHelp() returns a pointer to the DATA structure which contains the menu pointer, astring list pointer and the dcb for the menu. This structure is stored in the external staticMenuData. The definitions file "MenuDefs.d" contains the external statements for theprocedures that are used from the package along with a few structure definitions.To initialize the menu, the programmer first allocates some space for the menu bitmap. Theamount of core required can be found from MenuSize(). Next a display stream is formedand returned by CreateMenuDisplayStream(). This completes the initialization of the menu.The OS routine ShowDisplayStream() can be used to display, move or remove the menu. Inthe sample program, the menu is displayed below the system display stream, althoughselections may be made on the menu no matter where it is finally located on the screen. Ifthe menu is removed from the screen and its bitmap area is re-used by some other part ofthe program, a second call to CreateMenuDisplayStream() will restore the bitmap for themenu.Selections on the menu are determined by repeated calls to ScanMenu(). The selection of abox is made by pointing to the box with the cursor and pressing and releasing a mouse key.If the cursor is moved out of the box before the key is released then the box is not selected.The process of selection leaves the sense of the box flipped. In the sample program, it isinverted again with a call to DeSelect(). The value that is returned by ScanMenu() when abox is selected is the value defined in the manifest "names" file that is included in theprogram. The names used below, "invert" and "quit", were identified with the appropriateboxes when the menu was first created in MenuEdit. When a box is selected, the properaction is taken simply by switching on the returned value into one of the defined "names".2.1. Invert.bcpl// Invert.bcpl -- Inverts the screen, uses output of MenuEdit.run// bldr Invert InvertTables Menu MenuBox MenuBoxUtilsget "InvertNames.d"get "MenuDefs.d"external[GetFixedShowDisplayStream]let main() be[// test of the menu packagelet length=MenuSize()let buffer=GetFixed(length)let stream=CreateMenuDisplayStream(buffer,length)ShowDisplayStream(stream)// loop over menulet menu=MenuData>>DATA.menu fqG bu ^q+- ]m@ [/( Zc O XJ WY= Uv qvq TOv q0 R@ QEvq$) OQ LV K*vq Ivq/ Hvq) F)* DO Cv+- Avq @l =@!vq ;C :6N 8= 7,vq#vq 54% 4"A 2(- 1A -u *qA );5 &1 $ !2 222  22z22p212f2 \2  l >]zIBCPL Menu Package Description3[let selection=ScanMenu(menu)switchon selection into[case invert:Invert() ; endcasecase quit:finish]DeSelect(menu!selection)] repeat]and Invert() be[let dcb=@#420while dcb do[dcb>>DCB.background=not dcb>>DCB.backgrounddcb=@dcb]]2.2. InvertNames.d// InvertNames.d -- Manifest names for menu windows.manifest[invert=1quit=2]2.3. InvertTables.bcpl// InvertTables.bcpl -- Tables for setting up menu windows.external MenuInitHelplet MenuInitHelp() = valof[// set up menu tablelet menu=table[20;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0]menu!1=table [ 0;#4;#114;#164;#336;#227 ]menu!2=table [ 0;#4;#456;#164;#700;#227 ]// set up stringlist table fqGb`_(](\  (Z (YW{U2R LX2K2I 2H FD+CvA2@l =bu 8q6 422{202/q2- )]u $q=  l22b2 XN2D)2 )2  n&^]BCPL Menu Package Description4let stringlist=table[20;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0]stringlist!1="Invert Screen"stringlist!2="Quit"// set up menuDCB tablelet menuDCB=table[00;#0;0;580;#2032;0;180;#0;0;328]test (menuDCB&1) eq 1 ifso menuDCB=menuDCB+1ifnot for n=0 to 11 do menuDCB!n=menuDCB!(n+1)for n=0 to 1 do menuDCB!(4*n)=menuDCB+4*(n+1)// now finish uplet temp=table [ 0;0;0 ]temp!0=menutemp!1=stringlisttemp!2=menuDCBresultis temp]3. MenuEdit.runThis program is just a first cut at a menu editor. As a result, MenuEdit itself does not use amenu. It does, however, allow one to interactively design a menu on the screen.There are no command line switches. After starting the program the version number iswritten on the system stream and the user is informed to press the red key. Continuing bypressing the red key leads to a completely blank screen where menu boxes can be defined.3.1. CommandsThere are two ways of entering commands, by the keyboard and by the mouse. Thesecommands allow one to define rectangular boxes on the screen and then move them,change their shape, outline them, insert strings etc.. The description of the final menu isthen be written out as two BCPL files containing the proper definitions in the form of BCPLtables and manifest statements. This description can later be read back in and editted.3.2. Mouse CommandsA box is created by pressing the left (red) mouse key, moving the cursor and releasing thekey. The two diagonal corners of a rectangle are defined by the starting and ending pointsand this area is marked with a one bit wide outline. If the middle key is now pressed, thecursor moves to the lower right corner of the nearest box and the box follows the cursor,stopping when the key is released. The size of a box can be changed by pressing the rightkey. The cursor then moves to the lower right corner of the nearest box. The upper left fqG2bX`_]\ 2Z2Y2T-2RQ#ONL K I2H,F.2D-2A2@l2> 2=b2; 2:X 28 4u 0q] /OP ,#*+ * P )= $FuX !q? J G %6 J 3uX qL Z 8# x)0 9! nId '=\BCPL Menu Package Description5corner of the box remains fixed while the lower right corner follows the cursor stoppingagain when the key is released. Because of space allocations made, there is an upper limitof 256 boxes imposed on any menu created by MenuEdit.If the left mouse key is pressed when the cursor is inside an existing box, then instead ofcreating a new box, the existing box can be "selected". Releasing the key inside the boxselects that box. Selected boxes are marked by flipping the sense within the box. All"selected" boxes can then be acted upon by the keyboard commands discussed in the nextsection. Re-selecting an already selected box de-selectes it.3.3. Keyboard CommandsThe keyboard commands that are available are given below. Except for Read and Quit, noneof them are active unless there is at least one box created on the screen.For some keyboard commands, input from the keyboard may be required. In most cases, themenu display is removed and the system display appears with instructions or questions.When entering a value from the keyboard, terminate the entry with a CR. Typing a CR alonegives the default value which is shown enclosed in square brackets.Keyboard Commands:Q -- quit, asks for confirmation with a CR.R -- read in a menu description from two BCPL source files, asks for confirmation with a CR.The first is a definitions file containing manifest constants defining the names of each box.The second file is the source which will be used by the Menu package to set up the menu inthe user's program. MenuEdit reads these files and displays the menu and waits for newcommands. The file names must end in "Names.d" and "Tables.bcpl" in order to be readin. Therefore, only the file name kernel need be entered. For example, to read in"MenuNames.d" and "MenuTables.bcpl", enter the name "Menu".W -- write the description of the existing menu into two source files. -- a tab does a refresh of the screen.E -- selects all boxes. -- hitting the delete key removes all selections and resets the default case of makingthe strings visible (instead of the names, see the N command).A -- select all inactive boxes and de-select all active ones. The purpose of thiscommand is to allow identification of inactive boxes. See below for definition of activity.N -- display the box names instead of the strings for each box.In the following commands FIRST select the box or boxes, THEN type the command.A -- switch the definition of the selected boxes between active and inactive. An inactive boxwill not be able to be selected when the menu is implemented in a program. Identifyingwhich boxes are inactive is accomplished by use of the A command (see above).B -- switch the definition of the selected boxes between normal and bold display of text. fqG b? `U _5 [[ ZcP X< WYF U> QuX Mq(vqvq LPJ I$&2 G.( FCvq vq DC ?v <q(vq 9jvqCvq 73* 6`H 4 L 3V3" 1.% 0L; - vqE )vq( &vq #vqN "4vqvq vqvqA f\ :vqvq> g8 ;vqL O 16vqvq vqG  >\L/BCPL Menu Package Description6C -- change the size of the selected boxes. First select the boxes to be changed then enterthe new width and height from the keyboard.D -- delete the selected boxes.F -- fill the selected boxes with a color. The colors allowed are White, Black, Grey andUnfilled. The default case is Unfilled when a box is first created. At the present time, thisoption is not recommended for use, but is included for completeness.G -- set the gap between the selected boxes either vertically or horizontally. The first boxselected is left in its original position and the rest are positioned to the right or below. Enterthe amount of spacing from the keyboard, then type a V or an H to line them up vertically orhorizontally.I -- insert strings into the selected boxes. Only one string may be included in each box.L -- line up the selected boxes either vertically or horizontally. The first box selected is left inits original position and the rest are lined up to the right or below. Type a V or an H to linethem up vertically or horizontally.M -- move all the selected boxes as a group. The selected boxes are temporarily replacedwith the surrounding box which can them be moved with the middle key of the mouse. Nofurther commands can be implemented until the middle key of the mouse is pressed andthen released.N -- name the selected boxes. The name is not visible on the menu. It is written in thedefinitions file which should be included in the user's program. See the sample program forthe use of the names. See also the Format of a Menu in section 4.1.O -- outline the selected boxes. The width of the outline in bits is entered from thekeyboard. The color of the outline can also be specified. The choices are White, Black,Grey and Flipped.S -- makes a group of boxes all the same size. All the boxes are made the same size as thefirst box to be selected.T -- position the text in the selected boxes in positions other than the default case of thecenter of each box. For each selected box in turn, the beginning of the text will be writtenin the cursor and the new text position is indicated by moving the cursor and pressing andreleasing the left mouse key. The default position can be restored by pressing and releasingany other mouse key instead.4. Software Package ProceduresThere are four basic .BR files which make up the Menu software package. These areMenu.br, MenuBox.br, MenuBoxUtils.br. and MenuKeyboard.br. There is also one definitionsfile, MenuDefs.d. Menu contains the high level menu routines which the programmer will usemost often. MenuBox contains lower level routines which may be used by the programmer,depending on the complexity of the program. MenuBoxUtils contains assembly languageroutines which are used by MenuBox but are not expected to be used by a programmer.MenuKeyboard is an auxiliary package which contains a keyboard reading procedure forentering data from the keyboard into a box on the screen. fqG bvq< `+ ]mvq ZAvqAvqvqvq Xvqvq? W7D T vqL R6- Q5vqvq O| LPvqV I$vq` G&)vqvq F# Bvq> AiS ?-' >_ ;3vq,* 9)2 8)C 4vqL 3x1vqvq 1vqvq .vq., -B *vqK (M ' 7# %E $ /uX q: ~X G t: J j: ** `9 >VKBCPL Menu Package Description74.1. Format of a MenuA menu is a pointer to a structure. The first word of this structure is the length, i.e. numberof items on the menu. The following words point to boxes.A box is pointer to a structure which describes a rectangular region on the display screen.This structure is 6 words long and is described in the file MenuDefs.d. The first word is thedcb (if any) that covers the designated area of the screen. The second word containsseveral flags which tell if (and how) the box is outlined, colored, inactive, selected and bold.The next two words are the x-y coordinates of the upper left corner (the origin) of the box.The last two words are the x-y coordinates of the lower right corner (the corner) of the box.These four words also contain the description of where the text is to be positioned within thebox.If the dcb entry is zero then the x-y coordinates are absolute coordinates on the screen, i.e.they vary between 0-605 and 0-807. If the dcb entry is non-zero, i.e. there is a dcb coveringthe area defined by the box, then the x-y coordinates are defined relative to the dcb. This isan important point. This means that as a dcb is moved on the screen, the box definitionmoves with it. Therefore, a routine like CursorInside (see MenuBox) can always tell if thecursor is inside a particular box, no matter where the dcb is moved to, as long as it stays onthe dcb chain. Another important point is that a dcb relative description of a box isrestricted to one dcb. It may not cross dcb boundaries. Of course, an absolute coordinatedescription (i.e. dcb entry = 0) is independent of dcb boundaries. Any routine whichmanipulates bitmaps can deal only with a box with a dcb relative description.Another item which has the same format as a menu is the list of the strings that go in theboxes. Again the first word of the structure is the length and is equal to the length of themenu. The n-th element of the string list is a pointer to the string that gets written in thecorresponding box on the menu. There may not be a string for each box, however, and ifnot the corresponding element in the array is zero.This array is initialized by the set up routines called by the programmer and returned in astatic called MenuData. The static points to a DATA structure. The first word of thisstructure points to the menu, the second word to the string list and the third word to the dcbfor the menu. See the file Menudefs.d.The names of the boxes are used as follows. A routine called ScanMenu() from Menureturns a value which is the position in the menu of the box that was selected. A namewhich is assigned to a box, is equal to its position in the menu, so that the programmer doesnot have to try to figure out which number goes with which box that he sees on the screen.These names are written on a definitions file as manifest constants which can be included inthe user's main program in a "get" statement. In this way, a programmer can define ameaningful name to each box which can indicate the function that was selected. No namesare assigned to boxes unless an explicit indication is made within MenuEdit.run by use of theN command.4.2. MenuDefs.dThis file contains external statements and structures which the programmer will find usefuland should be included in a "get" in the main program. It includes the BOX, MENU andDATA structures described in the previous section. fqG buX ^qvqF ]m4vq ZAvqV XY W7G U@ T-7vq R4vq Q#B O Lr5) JO IhQ GW F^v q% D,2 CT'/ AZ @J8 >M ;@ :0- 8$9 7 ). 53 2YV 0 vq( /O(6 -' *=vq )E 'M &A $\ #= !!7 H vvq uX wqJ 7 m2 h &>TPBCPL Menu Package Description84.3. Menu.brMenuSize()If the menu has not yet been initialized, MenuSize calls the routine MenuInitHelp(). Thisroutine is part of the BCPL code generated by MenuEdit.RUN and is used to initialize themenu descriptions. It returns a pointer to the DATA structure which is then stored in theexternal static MenuData (see section 4.1.). MenuSize returns the number of words that areneeded to display this menu. This is the minimum number of words required. It is theprogramer's responsibility to allocate the proper amount of storage.CreateMenuDisplayStream(buffer, length)If the menu has not yet been initialized, CreateMenuDisplayStream also will call the routineMenuInitHelp() to initialize the menu. CreateMenuDisplayStream returns a pointer to a twoword display stream that can be used by the OS routine ShowDisplayStream to display themenu bitmap. Buffer is a pointer to a block of storage that can be used to create the bitmapfor the menu. If the length of the buffer is less than is required thenCreateMenuDisplayStream returns false. A complete dcb chain including blank dcb's to skipthe gap areas is created but the stream returned has the top and bottom blank dcb'sstripped off. Strings are written on the screen by the procedure called WriteBox(), (seesection 4.4 ). The font used is obtained by a call to GetFont(dsp).ScanMenu(menu, loopOverMenu [true], returnKey [false], sweep [false])ScanMenu continuously loops over the menu and if a box is selected then it flips the senseof the box and returns its position in the menu. Only active boxes are scanned, inactiveboxes are ignored, unless the external static EverthingActive is non-zero. If loopOverMenu isfalse, it makes one pass over the menu returning false if nothing was selected. This allowsthe programer to check other conditions such as the keyboard stream at the same time. IfreturnKey is non-zero then the mouse key that was used to select the box is returned in theleft byte. The value of the mouse key is given by (not @#177030) & 7. The parametersweep is put in as the last argument of select (see MenuBoxUtils). If sweep is false thenwhen the cursor is moved out of a box while the key is still depressed, the box is notselected. If sweep is true then the box is selected.DeSelect(box)This routine inverts the sense of the indicated box and sets the "selected" bit in its structureto false.ShowMenu()This routine removes whatever is on the screen and shows the complete menu exactly as itis seen in MenuEdit. CreateMenuDisplayStream must be run before ShowMenu is called.This procedure is provided as an alternative to using ShowDisplayStream to display thestream returned in creating the menu.4.4. MenuBox.brCreateBox(Xo, Yo, Xc, Yc, inputZone [sysZone])The first four arguments are, in order, the x-y coordinates of the upper left corner and the x-y coordinates of the lower right corner of the box expressed in absolute coordinates on thescreen. Then CreateBox allocates a block 6 words long from inputZone (or sysZone ifinputZone is zero or absent) and converts the coordinates relative to a dcb presently on the fqG buX ^vq [<v q ZA> X+/ W7vqvq U9 T-D Qvq M*vq LPv qvq J7vq IF vq1 G1 Fvq= ;Uvq(* 9&3 8Kvqv q 6M 5AY 3vq7 27), 0vq 5vq /-++ - vq" *|vq 'P0vq  % "vq sX vqvq i6vq % uX vq% _ 4< vq%vqvq *vq< B >]'cBCPL Menu Package Description9screen if possible. The pointer to the block is returned. If no space was available then itreturns zero.CursorInside(box, XCursor [0], YCursor [0])Returns true if the cursor is inside the box and false if not. The (0,0) point on the cursor isused unless XCursor and YCursor are specified. If the box is defined with relativecoordinates then CursorInside returns false if the dcb is not on the dcb chain.OutlineBox(box, bits [box>>BOX.bits], outline [box>>BOX.outline])Returns true if the box was successfully outlined. It returns false if the box is not defineddcb relative. The second argument is the width of the outline in bits. The third argumentindicates how the outline is to be done. Outline=0 means outline by flipping memory,outline=1,2 or 3 means outline by replacing with black (1's), grey and white (0's),respectively. A box can be outlined with a line of zero bits, i.e. no outline. If either of thelast two arguments are omitted, then their values are read from the box structure.FillBox(box, background [box>>BOX.background], skip [1])Fills the box WITHIN the present outline and returns true if the box was successfullychanged. Background has the same meaning as in OutlineBox, i.e. background=0 meansflip the sense of the box, and background=1,2 or 3 means fill with black (1's), grey andwhite (0's), respectively. If the second argument is omitted, then its value is read from thebox structure. The last argument is the number of bits to skip between the outline andwhere the box interior is changed. It defaults to one bit.NearestBox(menu)Returns the number of the box whose lower right corner is geometrically closest to thecursor. Returns false if it is a zero length menu.FindDCB(box, dcb [#420])Returns the number of scan lines before the dcb containing the box. It returns 0 if the boxis defined with absolute coordinates and it returns -1 if the box is defined dcb relative butthe dcb is not on the dcb chain. The default chain is the display chain, i.e. @#420 if dcb isnot specified.ConvertToRelative(box, dcb [@#420])This routine searches the dcb chain (starting at #420), and if possible converts a boxdefined with absolute coordinates to dcb relative. If the box was already dcb relative then itreturns without changing it. If dcb is present and non-zero, then it searches the dcb chainstarting with dcb, instead of the display dcb chain beginning at #420.WriteBox(box, string, bold [box>>BOX.bold], font [sysFont], xmode [box>>BOX.xmode], xoffset[box>>BOX.xoffset], ymode [box>>BOX.ymode], yoffset [box>>BOX.yoffset])This procedure writes one string, locating it at an arbitrary position within the box. If thestring is longer than the length of the box (minus twice the width of the outline) then onlypart of the string is written. The writing is done by ORing and the box is assumed to havebeen erased beforehand. If bold is non-zero, then the string is written in bold. If font isomitted or zero then it becomes GetFont(dsp). If the last four arguments are included, thenthey define the position where the string will be written within the box. The mode iscentered if zero and started from top or left if non-zero. The offset describes how many bitsto offset from the starting position. The x and y dimensions are treated independently. If the fqG bZ ` ]mv qX ZAvq4 X vqvq+ W7v q2 T v qX7 Pvq$vq OZ., M(vq$ LPvqE J># IFR FvqX1 BvqH Ai v qv qv q ?v q >_C <;vq ;U; 8)v q 4)- 3x3 0LvqX - ?vq +$9 *-+vq ( %evqX "9-) 2- /!vq8  vq5 ~vqXSG M HvqV  vq9 >vq+ vq vq5 41vq ,vq *00  =]'kBCPL Menu Package Description10parameters bold, xmode, xoffset, ymode, yoffset are omitted, then they are read from the boxstructure.4.5. MenuBoxUtils.brwrite(string, nwrds, bitstart, wordstart, bitlimit, font)Writes the string into memory using the specified font. The address of the beginning line iswordstart and the bit position within the line is bitstart (bitstart=0 is the first bit). Thenumber of words/scan line is nwrds and only bitlimit bits of the string are written. It returnsthe number of bits actually written.CallBitBlt(fn,u,dbca,dbmr,dlx,dty,dw,dh,sbca,sbmr,slx,sty,g0,g1,g2,g3)This routine takes as many arguments as are included in the calling statement and fills theminto a table and then invokes BitBlt from the ROM.select(xleft, xright, ybottom, ytop, key, flag)This routine checks the specified key and if the key is released while the cursor is within theindicated region, it returns true. If it is not released before the cursor leaves the region, thenit returns flag. Therefore, set flag to whatever you would like to receive when that conditionoccurs. The key is calculated by (not @#177030) & 7.4.6. MenuKeyboard.brGetString(box, defstring, zone)GetString returns the address of a string allocated from zone which contains the informationtyped in from the keyboard. The indicated box is erased and a small blinking box is put inthe upper left hand corner. Defstring is a default string which was previously allocated fromzone. If defstring is non-zero, it will be displayed in the box as a starting point for keyboardentry. It will be automatically de-allocated from zone.5. The Menu Package and the TridentBitmap manipulation on the screen, i.e. erasing, flipping the sense, outlining, etc. is done bythe routine called CallBitBlt(), defined in MenuBoxUtils.BR. This routine uses the BitBLTinstruction from the ROM. For most programs this presents no problem, but for softwarewhich uses the Trident code, special care must be exercised. The problem is that for PROMmicrocode versions 23 or before (version 2 for Alto II's), BitBLT does not function properly ifthe Trident code is loaded in the RAM. For this reason, there are two versions of theCallBitBlt procedure. A second version of MenuBoxUtils (MenuBoxUtilsSoft) is providedwhich uses the SoftBitBlt package. If wish to use the Trident code and the Menu package at the same time, then you shouldload your program with MenuBoxUtilsSoft.br (instead of MenuBoxUtils) and the SoftBitBltpackage, BitBltA.br and BitBltB.br. fqG b vqvqvqvqvq- ` [uX Xvq4 Un vq!vq$ Svq!vqvq Rdvq vq vq P$ Mv q< J$8 I2 EvqX) B"vq / A%9* ? vqvq7 > vq% 9HuX 6vq 2vq $vq 1k+vq& /vq + .avqvq0 ,3vq ( uX# $qW #Xv q !N N> J DR v q @ :# ,* D # =TM2BCPL Menu Package Description11Although this will increase the time needed to erase or blacken a menu box, it will benoticeable only if the boxes being erased or selected are large.6. The Menu Package and ContextsThe Menu Package while scanning the menu or waiting for keyboard input runs an internalprocedure called MenuIdle. If the menu is being used in a context then blocking can bemade to occur simply by setting the external static MenuIdle=Block. fqG b7 `@ [uX Xq8 Wvq" U4vqvq UI=AMATH  HELVETICA  HELVETICA HELVETICA  HELVETICA HELVETICA  HELVETICA P  ( 1 : CJLj/O M7t menu.bravoDakeApril 30, 1980 4:52 PM