[comp.sources.amiga] v90i261: requester.library 1.2 - requester library, Part03/03

amiga-request@abcfd20.larc.nasa.gov (Amiga Sources/Binaries Moderator) (09/29/90)

Submitted-by: Paul-Erik Raue <peraue@cs.vu.nl>
Posting-number: Volume 90, Issue 261
Archive-name: libraries/reqlib-1.2/part03

#!/bin/sh
# This is a shell archive.  Remove anything before this line, then unpack
# it by saving it into a file and typing "sh file".  To overwrite existing
# files, type "sh file -c".  You can also feed this as standard input via
# unshar, or by typing "sh <file", e.g..  If this archive is complete, you
# will see the following message at the end:
#		"End of archive 3 (of 3)."
# Contents:  req.doc
# Wrapped by tadguy@abcfd20 on Fri Sep 28 14:45:31 1990
PATH=/bin:/usr/bin:/usr/ucb ; export PATH
if test -f 'req.doc' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'req.doc'\"
else
echo shar: Extracting \"'req.doc'\" \(60498 characters\)
sed "s/^X//" >'req.doc' <<'END_OF_FILE'
X
X    The  req.library is a run time re-entrant library that is designed
Xto  make  it  easier  for  programmers  to  use  powerful, easy to use
Xrequesters  for  communicating  with  users.   The  requester  library
Xincludes  such functions as a color requester, file requester, message
Xdisplay  requester  and many functions to make the creation of gadgets
Xfor your own custom requesters easier.
X
X    Req.library  was  written  by  Colin  Fox (of Pyramyd Designs) and
XBruce  Dawson  (of  CygnusSoft  Software).   Req.library  is  a freely
Xdistributable  library that may be used in commercial products without
Xpaying  any  royalties.  We encourage you to use the requester library
Xin all of your programs, to make them easier to write, and to use.
X
X    Req.library  is  not public domain.  The requester library and all
Xdocumentation and example programs are all copyright 1989.
X
X    The  requester  library must be distributed with the documentation
Xfile  (req.doc),  and  the  three  include files (req.h, reqbase.h and
Xreqbase.i).
X
X
X
X    Req.library  is  dedicated  to  the programmers who make the Amiga
Xshine the way it was meant to.
X
X
XOverView:
X
X    All  of  the  req.library functions that bring up requesters allow
Xyou two ways of specifying what screen you would like the requester to
Xappear  on.  The first way is the more efficient way, because you only
Xhave  to set it up once and then it takes care of things automatially.
XThere  is  a  field in all process structures called the pr_WindowPtr.
XThis  pointer  is  used by DOS to decide where to put it's requesters.
XIf  pr_WindowPtr  contains  a  zero,  requesters  go  on the workbench
Xscreen.  If it contains the address of a window, then requesters go on
Xthat  window's  screen.   If  it  contains a negative one, then no DOS
Xrequesters come up.  The req.library requesters all use this variable,
Xif  they  are  called from a process .  However, if the pointer is -1,
Xthe req.library functions do still appear, on the workbench screen.
X
X    The  second  way  was  put in mainly so that the requesters can be
Xcalled from tasks.  Since a task does not have a process structure, it
Xalso  lacks a pr_WindowPtr.  Therefore, all of the requester functions
Xwhich  can  be  used from a task (currently everything except the file
Xrequester) can be passed a window pointer, either as a parameter or as
Xan  element in a structure.  Important:  This pointer takes precedence
Xover  the  pr_WindowPtr  so  if  you  wish  the  requesters to use the
Xpr_WindowPtr  you  must  zero  the window fields that the routines are
Xexpecting.   In  the case of fields in a structure this can be easy as
Xlong   as  you  make  sure  your  structure  defaults  to  being  zero
Xeverywhere.
X
X    Setting  the  pr_WindowPtr is quite a simple matter.  All you have
Xto do is do a FindTask((char *)0); which returns a pointer to your own
Xtask  and your own process (a task structure is the first element of a
Xprocess  structure).   Then  you  simply  preserve  the  old  value of
Xpr_WindowPtr (VERY IMPORTANT!!!) and put a window pointer into it.
X
Xeg:
X                /* Find my task. */
X    myprocess = (struct Process *)FindTask((char *)0);
X    oldwindowptr = myprocess->pr_WindowPtr;
X    myprocess->pr_WindowPtr = window;
X
Xor:
X
X    MOVE.L  4,A6
X    MOVE.L  #0,A1
X    SYS     FindTask    ;Find my task.
X    MOVE.L  D0,_myprocess
X    MOVE.L  D0,A0
X    MOVE.L  pr_WindowPtr(A0),_oldwindowptr
X    MOVE.L  _window,pr_WindowPtr(A0)
X
X    Before your program exits it is VERY important that it restore the
Xprevious  value of pr_WindowPtr.  If you don't, then your program will
Xwork  in some situations, but will BLOW UP in others.  For example, if
Xyou  execute  (without  using the 'run' command) a program, which then
Xsets  the  pr_WindowPtr  to  point at one of its windows and the exits
Xwithout  restoring  it,  then  the  next time a DOS requester tries to
Xappear...  BOOM!  The machine will probably crash as DOS tries to open
Xa requester on a now closed screen.  Therefore, before leaving:
X
X    myprocess->pr_WindowPtr = oldwindowptr;
X
Xor:
X
X    MOVE.L  _myprocess,A0
X    MOVE.L  _oldwindowptr,pr_WindowPtr(A0)
X
X
X
X    One  final  note.   The  pr_WindowPtr  field exists in the process
Xstructure.   This  means  that  a  task  does  not  have  this  field.
XTherefore,  if you want to call one of the requester library functions
Xfrom  a  task,  you  will not be able to specify what screen you would
Xlike  the  requester  to  appear on by setting the pr_WindowPtr field.
XAll  of  the  functions  that open requesters and can be called from a
Xtask  (the file requester/font requester is the only one that can't be
Xcalled  froma task) have some other way of specifying which screen you
Xwould like them to open on.  They will have either have a field in the
Xstructure  which you must pass them or a parameter which can contain a
Xwindow  pointer  to one of the windows on your custom screen.  If this
Xpointer is non-zero then it overrides the pr_WindowPtr field.
X
X
X
X
X    By  opening the requester library, you not only gain access to all
Xof  the functions documented below, but to some other goodies as well.
XReq.library   needs  and  therefore  opens  several  other  libraries,
Xincluding  dos.library,  intuition.library,  graphics.library  and the
Xconsole  device.   All  of  these  pointers  are  stored in the ReqLib
Xstructure  which  you  get a pointer to when you open the req.library.
XTherefore,  you  can  save  yourself  a little bit of code by grabbing
Xthese  fields  after opening the requester library.  The only thing to
Xbeware of is don't use these values after you have close the requester
Xlibrary,  because  at  that point there is no guarantee that they will
Xstill be valid.
X
X    In  addition  to  these  libraries,  the Images pointer in the req
Xlibrary structure points to a set of ten small images (four arrows and
Xssix  letters)  which have are guaranteed to be in chip memory.  These
Xcan be used if your program requires this type of images.
X
X
X
X
X    One  thing to keep in mind when using the gadget creation routines
Xis  that there isn't any way for us to check that you have passed us a
Xpointer  to  the  correct size of buffer, so you _must_ make sure that
Xyou are allocating the right amount of memory.
X
X
X--------------------------------------------------------------
XHere's a quick list of the functions available:
X--------------------------------------------------------------
X
XCenter..................Center a new window over the mouse.
X
XSetSize.................Prop gadget handling routines (32 bit)
XSetLocation
XReadLocation
X
XFormat..................sprintf() format routine
X
XSimpleRequest...........Starter gluecode to TextRequest- Single gadget
XTwoGadRequest...........Starter gluecode to TextRequest- Two gadgets
X
XFileRequester...........FileRequester routines
XPurgeFiles
X
XColorRequester..........a colorrequester
X
XMakeGadget..............Gadget creation routines
XMakeString
XMakeProp
XMakeButton
X
XMakeScrollBar...........3   part   gadget;   2   arrows  and  a  prop.
X                        Horizontal or Vertical
X
XLinkGadget..............Gadget  creation  routines that self-hook into
X                        the newwindow
XLinkStringGadget........gadget list.
XLinkPropGadget
X
XDrawBox.................Draw a box (x1y1)(x2y2) in one command
X
XGetFontHeightAndWidth...return height and width of current font
X
XRealTimeScroll..........scroll routine used in file requester
X
XTextRequest.............Powerful requester function
X
XGetString...............Get a line of text from the user
XGetLong.................Get a signed long from the user
X
XRawKeyToAscii...........Convert raw key to ascii
X
X----------------------------------------------------------------
X
X
XNAME
X        Center
X
X
XSYNOPSIS
X        Center( &nw, x, y)
X                 A0 D0 D1
X
Xstruct NewWindow *nw;
XUSHORT x,y;
X
XDESCRIPTION
X
X    Center()  is  used  to  adjust  a  NewWindow structure so that the
Xwindow that it opens will appear immediately under the mouse.  The x,y
Xvalues  are used to specify which part of the window you would like to
Xappear  underneath  the mouse.  If x or y is zero, that tells Center()
Xto  position  the  window  so  that  the  window center (in the x or y
Xdirection  respectively)  is  underneath  the  mouse.   If  x  or y is
Xpositive, that tells Center() to position the window so that the mouse
Xis  that  many  pixels  from  the  left  or  top  edge  of  the window
Xrespectively.   If x or y is negative, that tells Center() to position
Xthe  window  structure so that the mouse appears that many pixels from
Xthe right or bottom edge of the window respectively (ie; x = -10 tells
XCenter  to  position  the  mouse  ten  pixels to the left of the right
Xedge).
X
X    If it is impossible to position the window exactly where requested
X(if  the  mouse  pointer  is too close to the edge of the screen) then
Xthis  routine  will  position  the  window as close as possible to the
Xcorrect location.
X
X    To  allow  this routine to work accurately it is necessary to have
Xalready initialized the new window structure to specify on what screen
Xthe  window  is  going  to  be  open.  ie; you should set the Type and
XScreen fields before calling Center().
X
X    This routine disturbs no registers.
X
XRETURNS
X        nothing
XSEE
X
XBUGS
X        None known
X
X
X;--------------------------------------------------------------------
X
XNAME
X            SetSize
XSYNOPSIS
X
X            SizeVal=SetSize(MaxValue,ViewSize)
X              D0.W              D0.L  D1.L
X
Xshort   SizeVal;
Xlong    MaxValue,ViewSize;
X
XDESCRIPTION
X
X    This  routine is designed to correctly handle sizing a prop gadget
Xto  a range.  The range is given in in MaxValue/ViewSize.  MaxValue is
Xthe  maximum value that this prop is supposed to be able to represent.
XViewsize  is  how  large  the  display area is.  For instance, if your
Xmaximum  value  was 200 (files, for example), and your viewsize was 15
X(lines of text), then you would call this as so:
X
X        SizeVal=SetSize(200,15);
X
X    Then you would put SizeVal into the appropriate PropInfo structure
Xelement (in the case of the file requester, that would be VertBody).
X
XRETURNS
X        The  16 bit value to be put into the PropInfo structure of the
Xprop gadget.
X
XSEE
X        SetLocation, ReadLocation
XBUGS
X        Bugs? what bugs?
X
X
X;--------------------------------------------------------------------
X
XNAME
X            SetLocation
XSYNOPSIS
X
XNewLoc = SetLocation(MaxValue,ViewSize,Value);
X  D0                    D0      D1      D2
X
Xshort NewLoc;
Xlong MaxValue,ViewSize,Value;
X
XDESCRIPTION
X
X            When you have a prop gadget that you wish to directly set,
Xthen  this  is  the  routine to use.  It allows you to pass any 32 bit
Xvalue and properly set the gadget.
X
XRETURNS
X
X    The  return  is  the value to put into either HorizPot or VertPot,
Xdepending on what orientation you have the gadget.
X
X
XBUGS
X
X    n/a
X
XEXAMPLE
X
XSEE
X    SetSize(),ReadLocation()
X
X;--------------------------------------------------------------------
X
XNAME
X            ReadLocation
XSYNOPSIS
X
XLocVal=ReadLocation(MaxValue,ViewSize,PotValue)
X  D0                  D0.L    D1.L     D2.W
X
Xlong LocVal,MaxVal,ViewSize;
Xshort PotValue;
X
X
XDESCRIPTION
X
X        If  you  prop  gadget has been moved, this is the routine that
Xyou would use to determine where it's been moved to.
X
XRETURNS
X        Returns  the decoded value of the prop, as an unsigned 32 bit.
XThis  is  the  element  number  (line  number  usually) that should be
Xdisplayed on the first line of your display window.
X
XSEE
X
X    SetSize(), SetLocation()
X
XBUGS
X    n/a
X
XEXAMPLE
X
X;--------------------------------------------------------------------
X
XNAME
X            Format
XSYNOPSIS
X
X        Format(Buffer,string,values)
X                A2      A0     A1
X
Xchar *Buffer,string[];
Xchar **values;
X
XDESCRIPTION
X
X        This does the same thing as sprintf(), except that it isn't in
Xthe  stdio  library, and doesn't use up very much room.  This function
Xuses  the  ROM  function  RawDoFmt to do the print() style formatting.
XThis  routine does not allow the use of all of the '%' directives (for
Xexample,  floating  point  numbers can not be printed with this).  For
Xfull   documentation   on  what  directives  are  supported,  see  the
Xdocumentation  on RawDoFmt.  This is the routine that TextRequest (and
Xtherefore   SimpleRequest   and  TwoGadRequest)  use  for  their  text
Xformatting, so these restrictions apply to them also.
X
X        The RawDoFmt routine also assumes that 'int's are sixteen bits
Xlong.   Therefore,  if  you  are  using a compiler with an int size of
Xthirty-two  bits and you want to print an int or a short, you must use
X'%ld', rather than '%d'.
X
XRETURNS
X        The number of characters in the formatted string.
XBUGS
X    none known
X
XEXAMPLE
X
X    Format(Buffer,"There are %d changes to the file %s.",numchanges,
Xfilename);
X
X    Format(Buffer,"%x is a hex number, %c is a character.", num, chr);
X
XSEE
X    TextRequest, SimpleRequest, TwoGadRequest.
X    Further  information  on printf() style formatting is available in
Xthe AutoDocs on RawDoFmt and in C manuals discussing printf().
X
X;--------------------------------------------------------------------
X
X
X
XNAME
X            ColorRequester
XSYNOPSIS
X
XNewColor=ColorRequester(DesiredColor);
X   D0                       D0
Xlong    DesiredColor;
X
XDESCRIPTION
X
X    This  is a full-fledged color requester.  It is intelligent enough
Xto open with the right number of colours in the palette automatically.
XIt  shows  you both the colour you are working with, and the numerical
XRGB  value  of  that  colour.   It  has  Spread,  Undo,  Ok and Cancel
Xfunctions.  Planned is the addition of HSV.
X
X    The  cursor  keys move the color-cursor around the palette, RETURN
Xselects the current color and ESC cancels out.
X
X    You  pass  this  routine  the  color that you would like initially
Xhighlighted  (typically  the  current drawing colour).
X
X    The ExtendedColorRequester function has slightly more options, but
Xis slightly more work to call.
X
XRETURNS
X
X    Color  number  that  the user selected, -1 if the user cancels the
Xcolour  requester.   The  changed  colours  will  be  in  the viewport
Xstructure for your screen.
X
XSEE
X    ExtendedColorRequester
X
XBUGS
X
X    none known.
X
XEXAMPLE
X
X    newcolor = ColorRequester(oldcolor);
X
X;--------------------------------------------------------------------
X
XNAME
X            ExtendedColorRequester
XSYNOPSIS
X
XNewColor=ExtendedColorRequester(&(struct ExtendedColorRequester)
X   D0                                      A0
Xstruct ExtendedColorRequester   colorreqstruct;
X
XDESCRIPTION
X    This  call  brings  up  exactly  the  same  color requester as the
XColorRequester  call.  The only difference is that this routine allows
Xyou  to  specify  more  parameters.   The difference is actually quite
Xsmall  right  now, because there is only one additional parameter that
Xcan  be  passed  through  this  entry  point.   This is the ecr_window
Xparameter,  used  to  specify  what window (and hence what screen) the
Xcolor 'requester' appears on.  This parameter is rarely needed because
Xthe  window  the requester opens up on can be specified by setting the
Xpr_WindowPtr  field  in  your process structure to the address of your
Xwindow  structure  (see  the  beginning of the docs for an overview on
Xthis procedure).  The only time this entry point is needed, currently,
Xis  if you try to bring up the color requester on a custom screen from
Xa  task,  since  a task does not have a pr_WindowPtr and can therefore
Xnot specify the window and screen.
X
XRETURNS
X
X    Color  number  that  the user selected, -1 if the user cancels the
Xcolour  requester.   The  changed  colours  will  be  in  the viewport
Xstructure for your screen.
X
XSEE
X    ColorRequester
X
XBUGS
X
X    none known.
X
XEXAMPLE
X
X        /* This should generally be declared as a global variable */
X        /* so that all of it's elements get initialized to zero.  */
X        /* If you declare it as a local variable, be sure to zero */
X        /* all of the fields, even the unused ones. */
X    struct ExtendedColorRequester   colorstruct;
X
X    colorstruct.defcolor = 0;
X    colorstruct.window = mywindow;
X    newcolor = ExtendedColorRequester(&colorstruct);
X
X;--------------------------------------------------------------------
X
XNAME
X            MakeGadget
XSYNOPSIS
XMakeGadget(Buffer,String, X, Y)
X              A0    A1   D0 D1
Xstruct Buffer   *GadgetBlock;
Xchar            *String;
Xlong            D0,D1;
XDESCRIPTION
X
X        This  routine  prepares a buffer to be a standard BOOLEAN text
Xgadget.   This is a simple way of producing gadgets for code that must
Xbe  reentrant,  and it is more efficient than defining gadgets in data
Xstatements.    The  routine  initializes  the  gadgets  to  a  set  of
X'standard' values that should cover most cases and then links the four
Xparts of the GadgetBlock together.
X
X    Buffer  is  a pointer to a unitialized GadgetBlock, which contains
Xthe  necessary  Gadget, Border, border pairs and IntuitText structures
Xneeded to render a boolean gadget with a border and some text.
X
X    String  is  a  pointer  to  the text that should appear inside the
Xgadget.   The  gadget  is  automatically  sized  to  match the strings
Xlength.
X
X    X  and  Y are the gadgets initial position, they are simply copied
Xinto LeftEdge and TopEdge in the gadget structure.
X
XRETURNS
XSEE
XBUGS
XEXAMPLE
X
X
X;--------------------------------------------------------------------
X
XNAME
X            MakeString
X
XSYNOPSIS
XMakeString(Buffer,StringBuff,UndoBuff,MaxWidthBits,MaxNumChars, X, Y)
X             A0      A1          A2        D0          D1      D2  D3
X
Xstruct Buffer   *StringBlock;
Xchar            *StringBuff;
Xchar            *UndoBuff;
Xlong            MaxWidthBits, MaxNumChars, X, Y;
X
XDESCRIPTION
X
X    As  with  all  of  the  MakeGadget  functions, this one prepares a
Xbuffer  to  be used as a string gadget, that may be used re-entrantly.
XThe  buffer need not be cleared first.  This means that you may create
Xa temporary gadget on the stack.
X
X    The  StringBuff  is  where the body of text inside the gadget will
Xreside.
X
X    When   the   gadget  is  activated,  the  text  in  StringBuff  is
Xautomatically copied (by intuition) into UndoBuff.  This allows you to
Xtype  Amiga-Q  and get the old string back.  This field may be null if
Xyou wish to have no undo.
X
X    MaxWidthBits is the width of the frame around the gadget.
X
X    MaxNumChars  is  the maximum number of characters that you will be
Xable  to  type  into the gadget, including the terminating zero on the
Xstring.  MAKE SURE that this number is no greater than your StringBuff
Xsize, or else you're going to be typing over memory that isn't yours.
X
X    X,Y  are the position of the upper left hand corner of the gadget.
XThe border is actually 2 pixels above and to the left of this corner.
X
XRETURNS
X    Nothing
XSEE
X
X    MakeGadget,MakeProp,MakeScrollbar,LinkGadget,LinkProp,LinkString
X
X
X;--------------------------------------------------------------------
X
XNAME
X            MakeProp
XSYNOPSIS
X
XMakeProp(Buffer,Width,Height,Flags)
X         A0       D0   D1    D2
X
Xstruct  Buffer  *PropBlock;
Xlong            Width, Height, Flags;
X
XDESCRIPTION
X
X    This  routine  prepares an un-initialized buffer for use as a prop
Xgadget.
X
X    Buffer,  on  return,  will  contain  the  gadget,  along  with the
Xnecessary PropInfo and Image structures, all linked together.
X
X    Width is the with of the container, in pixels.
X    Height is the height of the container in pixels.
X
X    The  Flags  parameter  is  where you decide if you want FREEHORIZ,
XFREEVERT, or both.  It is simply copied into the gadget flags field.
X
X
XRETURNS
X
X    Nothing
X
X
X;--------------------------------------------------------------------
X
XNAME
X            DrawBox
XSYNOPSIS
X
XDrawBox(rp,MinX,MinY,MaxX,MaxY)
X        A1  D0   D1   D2   D3
X
Xstruct  RastPort        *rp;
Xlong    MinX,MinY,MaxX,MaxY;
X
X
XDESCRIPTION
X
X        This  routine  allows you to draw a simple box in one command.
XIt  draws  the  box  in APen color, in the current draw mode, with the
Xcurrent line pattern.
X
X        (MinX,MinY)  are  the  upper  left  corner  of  the  box,  and
X(MaxX,MaxY) are the lower right.
X
X        The pen is left at the upper left corner (MinX,MinY).
X
X;--------------------------------------------------------------------
X
XNAME
X            MakeButton
XSYNOPSIS
X
XMakeButton(Buffer,Image,Image2,Width,Height,Depth)
X             A0     A1    A2     D0    D1    D2
X
X
Xstruct  TwoImageGadget  *Buffer;
Xchar    *Image;     /* Pointer to the actual bitplane data */
Xchar    *Image2;    /* Pointer to the second image. */
Xlong    Width,Height,Depth;
X
X
X
X
XDESCRIPTION
X
X    The  purpose  of  this  routine  is one similar to MakeGadget, but
Xinstead of using text for the button, it uses a graphic.  You supply a
Xbitmap, and MakeButton will use it in it's rendering.
X
X    You  may  have  either  one  or two images, the routine handles it
Xroutinely.   If you supply one image, then this sets GADGHCOMP, and if
Xyou  have two images, it sets GADGHIMAGE.  RELVERIFY is always set, so
Xas  long  as  you  the  user  is  pressing  that gadget, the alternate
Xhighlight is shown.
X
X    Buffer has room for two images.
X
X    Image  is  a pointer to the actual image data, in CHIP memory, for
Xthis gadget.
X    Image2 is a pointer to the alternate image data.
X
X    Width and Height make up the size of your image.
X
X    Depth is how many bitplanes of data you've supplied.
X
XBUGS
X    It's  not  really  a bug, but if your images aren't the same size,
Xthen one won't erase the other when it is drawn, so you may be showing
Xan image with traces of the other one left there.
X
X;--------------------------------------------------------------------
X
XNAME
X            MakeScrollBar
XSYNOPSIS
X
XMakeScrollBar(Buffer,Flags,Size,X,Y)
X                A0    D0    D1 D2 D3
X
Xstruct ScrollBlock *Buffer;
Xlong    Flags,Size,X,Y;
X
X
XDESCRIPTION
X
X    This is a special routine that creates a scrollbar (which consists
Xof  a prop gadget and two arrows) and you handle it like it's a single
Xgadget.   You  may  have  either a horizontal scrollbar, or a vertical
Xscrollbar.   These scrollbars are very much like the ones in workbench
Xwindow  borders.   These  use slightly different images on the arrows,
Xhowever.
X
X    The  way  you  determine  how  this set up and oriented is by flag
Xcombinations.   If  you wished to put a scrollbar in the bottom border
Xof a window, then you would pass (in flags):
X
X        Flags = (HORIZSLIDER | GRELBOTTOM | GRELWIDTH)
X
X    If you wished it in the right border:
X
X        Flags = (VERTSLIDER | GRELRIGHT | GRELHEIGHT)
X
X    The  idea is to allow you to manipulate the scrollbar as though it
Xwere  a  single  gadget, not three.  If you pass confusing flags (like
XGRELBOTTOM|GRELHEIGHT) then it is undefined what will happen.
X
X    If all you want is a simple scrollbar that doesn't size, then just
Xset VERTSLIDER or HORIZSLIDER.
X
XSEE
X
X
X;--------------------------------------------------------------------
X
XNAME
X            PurgeFiles
XSYNOPSIS
X    PurgeFiles(&FileRequesterStructure)
X                        A0
XDESCRIPTION
X    Clear  up  all  memory  and  file  locks  allocated  by  the  file
Xrequester.   This  routine must be called before your program exits if
Xyou  use  the  file requester with either FRQEXTSELECTM bit set or the
XFRQCACHINGM bit set.  The first bit is if you want the user to be able
Xto select multiple files.  The file requester has to allocate a linked
Xlist  of  file  names which this function will purge.  The FRQCACHINGM
Xbit  is set if you want the file requester to remember the contents of
Xa directory between calls.
X
X    This  routine can be called any time you want the buffers and file
Xlocks purge.
X
XRETURNS
X    This routine does not return anything.
X
XSEE
X    FileRequest
XBUGS
X    None known.
XEXAMPLE
X
Xmain()
X    {
X    FileRequest(&FileRequesterStructure);
X
X    .
X    .
X    .
X
X    PurgeFiles(&FileRequesterStructure);
X    }
X
X
X
X;--------------------------------------------------------------------
X
XNAME
X            GetFontHeightAndWidth
XSYNOPSIS
X
XDESCRIPTION
X
X        This allows you quick access to the font attributes set by the
Xuser  in preferences.  The font width is returned in D0 and the height
Xis returned in D1.
X
XRETURNS
XSEE
XBUGS
XEXAMPLE
X
X
X
X;--------------------------------------------------------------------
X
XNAME
X            LinkGadget
XSYNOPSIS
X
XLinkGadget(Buffer,String,nw, X, Y)
X             A0     A1   A3 D0 D1
X
Xstruct  GadgetBlock *Buffer;
Xchar    *String;
Xstruct  NewWindow *nw;
Xlong    X,Y;
X
XDESCRIPTION
X
X    This  is  actually  a superset of the previous command MakeGadget.
XWhat  this  does  is automatically link the gadget into your NewWindow
Xstructure's gadget list.
X
X        No registers are disturbed.
X
XSEE
X    MakeGadget
XBUGS
X    n/a
X
X
X
X;--------------------------------------------------------------------
X
XNAME
X            LinkStringGadget
XSYNOPSIS
XLinkStringGadget(Buffer,StringBuf,UndoBuf,nw, WidthBits,NumChars, X, Y)
X                   A0     A1        A2    A3     D0       D1     D2 D3
X
Xstruct  StringBlock *Buffer;
Xchar    *StringBuf;
Xchar    *UndoBuf;
Xstruct  NewWindow *nw;
Xlong    WidthBits,NumChars,X,Y;
X
XDESCRIPTION
X
X    This  is  number 2 in the LinkGadget routines.  This one obviously
Xlinks  the  string  gadget  to the window's gadget list.  In fact, the
Xonly  difference  between  this  and  the  MakeString  routine  is the
Xaddition of the NewWindow pointer.
X
XSEE
X    MakeStringGadget
X
X
X;--------------------------------------------------------------------
X
XNAME
X            LinkPropGadget
XSYNOPSIS
X
XLinkPropGadget(Buffer,nw, Width, Height, Flags, LeftEdge, TopEdge)
X                 A0   A3    D0     D1     D2       D3       D4
X
Xstruct  PropBlock   *Buffer;
Xstruct  NewWindow   *nw
Xlong    Width,Height,Flags,LeftEdge,TopEdge;
X
XDESCRIPTION
X
X    Here  we  have a superset for MakeProp.  It works exactly the same
Xas  MakeProp,  except  that  it attaches the gadget to the head of the
Xlist in the window.
X
XSEE
X    MakeProp
X
X
X;--------------------------------------------------------------------
X
XFileRequester
X
XNAME
X    FileRequester  - bring up a file/font requester.
X
XSYNOPSIS
X    success = FileRequester(&FileRequesterStructure)
X      D0                              A0
X
XFUNCTION
X    Bring  up  a  fully  intuitionized file/font requester (actually a
Xwindow) and let the user select a file/font.
X
XINPUTS
X    &FileRequesterStructure  -  pointer  to  an  initialized  (can  be
Xinitialized mostly to zeroes) file requester structure.
X
XRESULT
X    Returns  TRUE  or FALSE to say whether the user selected a file or
Xnot.   The  file name(s) or font selected are then found by looking at
Xthe file requester structure whose address was passed.
X
X    For  ideas  on  customizing the file requester for your particular
Xsystem  (thus  overriding the defaults used by programmers who use the
Xfile requester) see the customizefile.asm file.
X
XBUGS
X    Problem  with  an  Intuition bug that messes up the current active
Xwindow  if  a  window  closes  when one of its string gadgets is still
Xactive.   This bug show up if you run the file requester straight from
Xa CLI window and then exit it with Amiga-L.
X    I have heard that it resets some window flags when run on a custom
Xscreen,  but I believe this is a feature of Intuition, not of the file
Xrequester.
X
XSEE ALSO
X    PurgeFiles
X
X
X    The  file  requester  in  the  requester  library  allows to put a
Xpowerful  and  easy  to  use  file requester into your programs with a
Xminimum of work and at a very small expense in program size.  The file
Xrequester  was  designed  to be as easy as possible to call, while not
Xsacrificing power.
X
X    To  get  the  file  requester to come up all you need to do (after
Xopening  the  requester  library of course) is to allocate space for a
XFileRequester  structure  and  then  call  the file requester with the
Xaddress  of  this structure, with all fields initialized to zero, like
Xthis:
X
Xstruct FileRequester MyFileReqStruct;
X
Xsuccess = FileRequester(&MyFileReqStruct);
X
X    The function will return either one or zero for success or failure
Xrespectively.
X
X    You can specify what screen the file requester should appear on in
Xone  of  two  ways.  If you want it to appear on a custom screen, then
Xthe  best  way  is  to  set  the  pr_WindowPtr  field  in your process
Xstructure  to  point at one of the windows on your screen (this should
Xbe  done anyway, so that DOS requesters appear on your custom screen).
XThis  field  is looked at by all functions in the requester library so
Xthis  way  is the simplest method.  The other way, which overrides the
Xpr_WindowPtr  field  is to initialize the frq_Window field to point at
Xone of your windows.  If this field is non-zero, it is used instead of
Xthe pr_WindowPtr field of your process structure.  Important note:  It
Xis  VERY  important  that you reset the pr_WindowPtr field back to its
Xoriginal  value  before  your  program  exits.  If you don't, the next
Xprogram run may try to open a requester window on a now closed screen.
X
X    The  file  requester  was  carefully  designed so that it could be
Xcalled  without  having  to  initialize  very  many  fields.   This is
Xdemonstrated  by  seeing  that  it  is  possible  to  call  it without
Xinitializing any fields.  There are a few fields that are necessary to
Xactually  get  any  use  out  of  it,  but  very  view.  Those few are
Xdocumented in the following paragraph.
X
X    Although  you can bring the file requester up without initializing
Xany  fields there are a couple of fields that you will definitely want
Xto  initialize.   The  file  requester isn't much use unless you get a
Xfile  name back out of it, and for this you need to initialize the Dir
Xand  File  fields.   These two fields should point to character arrays
Xthat  are,  respectively,  DSIZE+1  and FCHARS+1 bytes long.  When the
Xfile  requester  is first run the file requester looks in these arrays
Xfor  the  default  directory  and file names and if the user selects a
Xfile  name  the  directory  and  file  name are copied back into these
Xarrays.  You will probably want to initialize the Title field with the
Xmessage  that you want to have appear at the top of the file requester
Xwindow.
X
X    If  you initialize the PathName field (it should point an array of
Xat least DSIZE+FCHARS+2 characters) then when the user selects a file,
Xthe complete path name will be put into this array.
X
X    The Window field is used to specify what window the file requester
Xis associated with.  This is used to get the file requester to show up
Xon  a  custom  screen.   Generally  this  field should be unnecessary.
XThere  is a variable provided in a process structure which is used for
Xthis purpose.  Any program that opens a custom screen and uses any DOS
Xfunctions  should set the pr_Window pointer in their process structure
Xto  a  pointer  to their window so that DOS requesters will show up on
Xtheir  custom  screen.   If  you do this, then the file requester will
Xalso  show  up  on  your custom screen.  If you are not using a custom
Xscreen  then you don't need to set the pr_Window pointer or the Window
Xfield  in  the  file  requester  structure.   Note:  If you do set the
Xpr_Window  structure in the process structure, be sure to return it to
Xits old value before your program exits.
X
X    If  the  extended  select  bit  is set in the Flags field then the
XMaxExtendedSelect  fields  specifies  the maximum number of files that
Xthe user can select.  This is ignored if the extended bit isn't set in
Xthe Flags field.
X
X    numlines and numcolumns specify the maximum size that the file box
Xwill  be in characters.  If the system is low on memory, or the screen
Xis  too  small,  these will be shrunk as necessary.  devcolumns is the
Xnumber of columns of characters wide that the device box will be.
X
X    The  Flags field can currently contain seven different flags.  The
Xfirst  flag,  FRQSHOWINFOM,  specifies  whether  or not '*.info' files
X(files  containing information for icons) should be filtered out.  The
Xdefault is for them to be filtered.
X
X    The  FRQEXTSELECTM  flags  specifies  whether  extended  select is
Xwanted.   If  you  set this flag then you should probably also set the
XMaxExtendedSelect  field.   If  you  don't  then the maximum number of
Xfiles  the  user  will be able to select will be 65536, which is a bit
Xhigh  for  most  purposes.  Note:  If you use this bit then you _must_
Xcall  PurgeFiles()  with  the  address of your FileRequester structure
Xafter  the  last time you call the file requester, in order to free up
Xany  memory  used  in  the  extended select structures.  When the user
Xselects  multiple files, a linked list of the file names selected (not
Xincluding the directory name) will appear in the ExtendedSelect field.
XThe  list  is a linked list of ESStructures.  The directory name which
Xshould  be  prepended  to  all of these names will appear in the array
Xpointed to by the Dir field.
X
X    The  FRQCACHINGM  flag  specifies  whether  or not directories are
Xcached  from  one  call  to  the next.  This is a very handy features,
Xespecially  for those who lack hard drives.  However, if this features
Xis  used, you _must_ call the PurgeFiles() routine with the address of
Xyour  FileRequester  structure  after  the last time you call the file
Xrequester, in order to free up any memory used in caching.
X
X    As  well  as being a file requester, this routine can be used as a
Xfont requester too.  Just set the FRQGETFONTSM flags to turn it into a
Xfont  requester.   You  should  also  put the name 'fonts:' in the Dir
Xarray.   The file/font requester will return a one or zero for success
Xor  failure as usual, the font name will be returned in the File array
Xand  the  font  size  and  style will be returned in the FontYSize and
XFontStyle  fields.   Note  that  the font requester allows the user to
Xchange  the  directory  where  the  fonts are read from.  Although you
Xshould  put  'fonts:' there, you should allow for the possibility that
Xthe  user  might  change  the  directory.  They might, perhaps, have a
Xseparate  disk  full  of  fonts.   The simplest way to deal with fonts
Xcoming  from  different  directories,  is  to  set  the PathName field
Xinstead of the Dir field.  You can then use the string in the PathName
Xfield  (which  will  contain  the directory and font name) as the font
Xname.   If  you  don't  do this, then you have to concatenate the font
Xname  and  the  directory  name  yourself.   If  you  use the PathName
Xvariable  then  it  is quite reasonable to leave the File field blank,
Xsince  all  the information you need can be obtained from the PathName
Xstring.
X
X    The  FRQINFOGADGETM flag specifies whether or not a hide/show info
Xgadget should appear on the file requester.  This lets the user toggle
Xthe  state  of  the  FRQSHOWINFOM flag to decide whether or not to let
X'*.info'  files  show  up.  This is not recommended for most programs,
Xsince  most  users  have  no  reason  to  look at '*.info' files.  The
Xdefault is to _not_ have this gadget show up.
X
X    The FRQHIDEWILDSM flag specifies whether or not to have 'show' and
X'hide'  string  gadgets.   These gadgets let the user use wildcards to
Xspecify  which  files  should  show  up.  All files are first compared
Xagainst  the 'show' gadget.  If they fail the comparison, they are not
Xdisplayed.  Then they are compared against the 'hide' gadget.  If they
Xmatch  here then they are not displayed.  If the gadgets are empty, no
Xcomparisons  are done.  Important note:  Even if these gadgets are not
Xdisplayed,  the comparisons are still done on the data which is in the
XHide  and  Show  fields of the file requester structure.  The standard
XAmigaDOS wildcards (including '#', '?', '|' and '*') are supported.
X
X    Normally  the  file  requester  appears  centered  under the mouse
Xpointer.   If  you would like to specify its opening position you must
Xset   the   ABSOLUTEXYM   flag  and  then  put  the  x,y  position  in
XWindowLeftEdge and WindowTopEdge.
X
X    If you feel that the file requester's cached directories (selected
Xby  FRQCACHINGM)  should  be  purged  whenever  the directory has been
Xchanged,  then  set  FRQCACHEPURGEM  field and the file requester will
Xcheck the dates whenever it is opened.
X
X    If you feel that the file requester should never cache directories
Xunless  it  manages  to  read  in the entire directory before the user
Xsends  it  away,  then  set  the FRQNOHALFCACHEM flag.  This flag will
Xcause  the file requester to automatically flush any incompletely read
Xdirectories when it exits.
X
X    If  you  would  like your directories to appear in 'natural' order
Xinstead of alphabetically sorted, set the FRQNOSORTM flag.
X
X    If you would like the file requester to appear without a drag bar
Xor depth arrangement gadgets, set the FRQNODRAGM flag.
X
X    If  you  are using the file requester to select a filename to save
Xto,  you  should set the FRQSAVINGM flag.  Similarly, if you are using
Xthe  file  requester to select a filename to load from, you should set
Xthe  FRQLOADINGM flag.  These flags are not currently used by the file
Xrequester,  but  they  may  be  used in the future.  They also make it
Xeasier  for  people who want to personalize the file requester to make
Xit behave differently for loading vs.  saving.
X
X
X    The  various  color  fields  let  you  specify  the colors of many
Xaspects of the file requester.  If they are left as zero then the file
Xrequester uses various non-zero certain default values for them.
X
X    The  WindowLeftEdge  and  WindowTopEdge  fields are covered in the
Xsection on the ABSOLUTEXYM flag.
X
X    The  FontYSize  and FontStyle fields are covered in the section on
Xthe FRQGETFONTSM flag.
X
X    The  ExtendedSelect  field  is  covered  in  the  section  on  the
XFRQEXTSELECTM flag.
X
X    The  Hide  and  Show  fields  are  covered  in  the section on the
XFRQHIDEWILDSM flag.
X
XSet this bit if you are selecting a file to save to.
XSet this bit if you are selecting a file(s) to load from.
XThese two bits (save and load) aren't currently used for
Xanything, but they may be in the future, so you should
Xremember to set them.  Also, these bits make it easier if
Xsomebody wants to customize the file requester for their
Xmachine.  They can make it behave differently for loading
Xvs saving.
X
X    The  four  BufferPos  and  DispPos  variables  are  copies  of the
Xequivalent  variables  from  the four string gadgets.  This is so that
Xwhen  the  file  requester goes away and then is brought up again, the
Xcursor in the string gadgets will appear in the same places as before.
XThese fields should not need to be touched by the programmer.
X
X    The  rest  of the fields are private.  Don't go touching them.  We
Xguarantee  to  move them around and change their meaning, just to make
Xsure  that  nobody tries to use them.  They are largely concerned with
Xkeeping  track  of  memory  used in directory caching.  This memory is
Xfreed  with  the  PurgeFiles() routine.  That's all you should need to
Xknow.
X
X
X
X
X
X;--------------------------------------------------------------------
X
XRealTimeScroll
X
XNAME
X    RealTimeScroll  -  do the calculations necessary for a responsive,
Xpixel resolution, real time scroll routine.
X
XSYNOPSIS
X    RealTimeScroll(&ScrollStruct);
X                         A0
X
XFUNCTION
X    Make  the  implementation  of  real time scrolling area easier and
Xmake the real time scrolling area more responsive to the user by doing
Xpixel resolution scrolling and by checking the current position of the
Xscroll  bar  in mid scroll.  This routine calculates how far to scroll
Xeach  time  and calculates which lines of text, graphics etc.  need to
Xbe redrawn to fill in the empty area.
X
XINPUTS
X    &ScrollStruct - pointer to an initialized scroll structure.
X
XRESULT
X    This routine returns no result code.
X
XBUGS
X    None known
X
XSEE ALSO
X    n/a
X
X
X    It is relatively easy to implement a real time scrolling area, but
Xthe most obvious implementations suffer from a lack of responsiveness.
XTypically  the  routines  look  at  where the scroll bar is, calculate
Xwhere  to  scroll  to,  scroll  there  in  several  jumps  to make the
Xscrolling  look smooth, and the examine the scroll bar again to see if
Xit  has  moved.  This means that there are periods, perhaps annoyingly
Xlong,  where  the  program may be scrolling in one direction while the
Xscroll  bar is being dragged in another.  The answer is to examine the
Xscroll  bar  to  find out the desired location, scroll partway towards
Xthe  destination and then recheck the scroll bar's location.  This can
Xgreatly  increase  the  responsiveness,  since the program is checking
Xafter  every  ScrollRaster()  call,  instead of after a dozen or more.
XHowever,  the  calculations,  especially  of  which  lines  need to be
Xrefreshed  and  where, get somewhat more complicated.  This routine is
Xdesigned  to  simplify this situation by taking care of as many of the
Xmessy details as possible.
X
X    First   you   must   initialize   the   scroll   structure.    The
XTopEntryNumber, NumEntries and NumLines fields describe where the data
Xis  currently.   NumEntries  is  the number of lines of data in total,
XNumLines  is  the number of lines that are visible, and TopEntryNumber
Xis the line number of the first line visible (it therefore ranges from
Xzero to NumEntries - 1).
X
X    LineSpacing  is  the  number of pixels high that each line of data
Xis.   For  text  this  will  typically be eight or nine (for eighty or
Xsixty  column  topaz).   This  can  be  set  to  one  if  your data is
Xcontinuous (as in the case of some graphics).
X
X    PropGadget  is a pointer to the prop gadget which is being used to
Xcontrol this scroll area.
X
X    RedrawAll  is  a  pointer  to  a  function that you must supply to
Xredraw the entire visible window.  This routine is called whenever the
Xuser  gets  so far ahead of the scroll routine that scrolling to where
Xthe  users  wants  to  be  would  take  to  long.  Before calling this
Xroutine,  the  ScrollStruct that was passed to this routine is updated
Xwith  the  desired TopEntryNumber so that your routine will know which
Xdata to redraw.
X
X    ReadMore is an optional routine that will usually not be used.  It
Xis  used  if more data is being added while the scrolling is going on.
XThis  is  used,  for  instance,  by  the  FileRequest in the requester
Xlibrary, to continue attempting to read the directoy while the user is
Xscrolling.   Leave  this set to zero if you don't need it.  It is only
Xcalled  when no scrolling is being done, but the user has not released
Xthe scroll bar.
X
X    ScrollAndDraw  is the most important routine.  This routine, which
Xyou  must  supply,  is called whenever the data must be scrolled.  The
Xactual  scrolling  and  redrawing of the data is done by this routine,
Xbut because the scroll amount, the lines to be drawn and the number of
Xlines  to  be  drawn are passed to this routine, the routine is fairly
Xsimple.  Four parameters are passed to this routine:
X
XScrollAndDraw(firstlinenum, firstliney, scrollamount, numlines);
X
X    All  four parameters are passed as longs, both on the stack and in
XD0-D3,  so  that  the  routine  can  easily  be written in either C or
Xassembler.
X
X    When the ScrollAndDraw, ReadMore or RedrawAll routines are called,
XA4,  A5  and  A6  all  contain  the  same  values  they contained when
XRealTimeScroll  was  called.   This allows programs written in C using
Xthe  small  data  model  to be able to access their data properly from
Xthese  routines without any special work.  All other registers (except
Xthose that are used to pass parameters in) could contain anything.
X
X
X
X
X;--------------------------------------------------------------------
X
X
X
XTextRequest
X
XNAME
X    TextRequest  - bring up a text requester with one to three gadgets
Xand get a response.
X
XSYNOPSIS
X    result = TextRequest(&TRStructure);
X      D0                      A0
X
XFUNCTION
X    Bring  up  a requester (actually a window) containing a message to
Xthe  user  and  give  him  a  choice  of  from  one to three different
Xresponses.   The  window  automatically  sizes  to  fit  the  text and
Xprintf() style formatting can be used by TextRequest() to generate the
Xmessage to the user.
X
XINPUTS
X    &TRStructure - pointer to an initialized text requester structure.
X
XRESULT
X    Returns  either  zero,  one  or two, depending on which gadget the
Xuser  clicks  on.   All  of  the  gadgets  are  optional,  so that the
Xrequester  can  be  used  to  bring up requesters that give the user a
Xmessage,  without demanding an answer, by having only a single gadget.
XThe  gadget  in  the  lower  right  hand  corner (the negative gadget)
Xreturns a zero, the gadget in the lower left hand corner (the positive
Xgadget)  returns a one and the gadget in the middle returns a two.  If
Xnone  of these three gadgets are requested, a close gadget is attached
Xto the window and it returns a zero.
X
XBUGS
X    If  any  line  of  the  text  to  be printed is too long, then the
Xrequester  will  attempt  to open up an impossibly large window, which
Xwill fail and the requester will return a zero.
X    The  buffer used for formatting the text is 5000 bytes long, so no
Xmessages can be longer than this.
X
XSEE ALSO
X    SimpleRequest
X    TwoGadRequest
X
X
X    The  purpose  of  this  routine  is  to  make  it as easy to print
Xformatted  messages  in  intuitionized window with gadgets as it is to
Xprint  them  on the CLI screen.  For maximum ease of use, at a loss of
Xflexibility,  please see the functions SimpleRequest and TwoGadRequest
Xwhich  are  simply  glue  code functions to make calling TextRequest a
Xtrivial matter.
X
X    If  you want the text requester to appear on a custom screen, then
Xyou must set the pr_WindowPtr field in your process structure to point
Xat  one  of the windows on your screen (this should be done anyway, so
Xthat  DOS  requesters  appear  on  your custom screen).  This field is
Xlooked at by all functions in the requester library so this way is the
Xsimplest method.  Important note:  It is VERY important that you reset
Xthe  pr_WindowPtr field back to its original value before your program
Xexits.  If you don't, the next program run may try to open a requester
Xwindow on a now closed screen.
X
X    The  structure  whose  address  is  passed to this routine must be
Xinitialized first.
X
X    The  Text field is initialized with the body of the text you would
Xlike  displayed.  This text can contain both printf() style formatting
Xand  end  of  line characters ('\n' in C, ascii 10 in assembler).  The
Xprintf()  style formatting, is expanded out into the final text string
Xusing  the  parameter  list which is pointed to by the Controls field.
XLine  feeds  are  used, as usual, to specify a new line, thus allowing
Xvery  long  and  complex  messages  to  be  displayed.   The  are some
Xlimitations  on  the  types  of  printf() formatting that can be used.
XSince the RawDoFmt() function of the ROM is used to do the formatting,
Xonly   functions   supported   by   it  can  be  used.   For  complete
Xdocumentation,  see  the documentation of the RawDoFmt() command.  The
Xmain  things  to be aware of is that floating point numbers can not be
Xprinted,  and,  if  you  are using a compiler that uses thirty-two bit
Xints  then  we  will  have to specify '%ld' to print an int, since the
XRawDoFmt command assumes an int size of sixteen bits.
X
X    The Controls field points to a list of parameters, one for each of
Xthe  '%'  parameters in the Text field.  Normally these will be pushed
Xon  to the stack and the stack pointer copied into the Controls field.
XThe first parameter used (the first one to occur in the string) should
Xbe  at  the beginning of the list, that is, at the lowest address, the
Xone pointed at by the Controls parameter.
X
X    The Window field can be used to specify what screen you would like
Xthe requester to appear on.  This field is usually not necessary since
Xthe same information can be conveyed in the pr_WindowPtr field of your
Xprocess  structure.   However  this  field  was  left  in  so that the
XTextRequest  function  could  be  called  from  a  task (which lacks a
Xprocess  structure and therefore a pr_WindowPtr field).  If this field
Xis  non-zero or if the calling program is a task then this field takes
Xprecedence over the pr_WindowPtr field.
X
X    MiddleText,  PositiveText  and NegativeText are the pieces of text
Xused  for  the  three gadgets.  These three gadgets, when present, are
Xplaced   in  the  middle,  the  left  and  the  right  of  the  window
Xrespectively.   All  three  gadgets are placed along the bottom of the
Xwindow.   All of the gadgets are optional.  If a gadget is not wanted,
Xthe  text  pointer  should be set to zero.  The values returned if the
Xuser  clicks  on these gadgets are two, one or zero, respectively.  If
Xnone  of  the gadgets are present (if all of the text fields are zero)
Xthen  a  standard  CLOSEWINDOW gadget is attached to the window.  This
Xgadget returns a zero.
X
X    The  requester  attempt  to  appear so that the negative gadget is
Xunderneath  the  mouse pointer.  If the negative gadget is not present
Xit will attempt to appear so that a different gadget is underneath the
Xmouse  pointer.   This is to make it as convenient as possible for the
Xuser  to  respond  to,  and  especially  to respond negatively to, the
Xrequester.
X
X    In  addition  to  responding  to  the  requester  with  the mouse,
Xkeyboard  shortcuts are available.  The user can type ESC, 'N', 'Q' or
X'B'  as  a  shortcut to clicking on the negative gadget.  The user can
Xtype  'Y'  or 'V' as a shortcut to clicking on the positive gadget and
Xcan type 'M' as a shortcut to clicking on the middle gadget.
X
X    The  Title  field  of  the structure should either point to a null
Xterminated  string  to  be  used in the windows title bar or should be
Xnull.
X
X    The  KeyMask  field  is  used  to  regulate  the  use  of keyboard
Xshortcuts.  The qualifier field of all keyboard messages is ANDed with
Xthis  field,  and  the  keypress  is  ignored  if  the result is zero.
XTherefore,  to enable all keypresses to be used as keyboard shortcuts,
Xinitialize  this  field to $FFFF.  To turn off the keyboard shortcuts,
Xinitialize  this  field to 0.  To force the user to hold down the left
Xor right amiga key, initialize this field to AMIGAKEYS.
X
X    The  textcolor,  detailcolor  and  blockcolor  fields  can be left
Xunitialized (ie; set to zero) if you wish, in which case the requester
Xwill  use  the  default values of one, zero and one respectively.  The
Xtextcolor  field  is used for the color of the actual text message and
Xthe detail and block color fields are simple copied into the fields of
Xthe same name in the new window structure.
X
X;--------------------------------------------------------------------
X
X
XSimpleRequest
X
XNAME
X    SimpleRequest - bring up a text requester and wait for the user to
Xacknowledge it.
X
XSYNPOSIS
X    SimpleRequest(string, parameterlist, , ,)
X                    A0        A1
X
XFUNCTION
X    Bring  up  a requester (actually a window) containing a message to
Xthe  user  and  wait  for  the  user  to  acknowledge  it.  The window
Xautomatically  sizes to fit the text and printf() style formatting can
Xbe used by TextRequest() to generate the message to the user.
X
XINPUTS
X    string  -  a  null  terminated  string,  containing printf() style
Xformatting commands if desired.
X    parameterlist - the parameters corresponding to the printf() style
Xformatting  commands  in  the string.  In C these are listed after the
Xcontrol  string,  exactly as with printf().  In assembler, the address
Xof the list of parameters is put in A1.
X
XRESULT
X    No result code is returned.
X
XBUGS
X    See TextRequest
X
XSEE ALSO
X    TextRequest
X    TwoGadRequest
X
X
X    This  function was designed to make it as easy to give messages to
Xthe  user  and await acknowledgment in an intuition style requester as
Xit  is  using  printf() and getc().  Simply replace almost any call to
Xprintf()  with a call to SimpleRequest and a requester will appear and
Xnot  disappear until the user acknowledges it (either with a keystroke
Xor with the mouse).
X
X    Example:
X        SimpleRequest("There  have  %d  changes  made  to this file.",
X                        numchanges);
X
X    Please  see  the  TextRequest  documentation for further important
Xdetails.   This  routine  is simply a few lines of assembler glue code
Xfor  the TextRequest routine.  The TextRequest routine is a little bit
Xmore   complicated   to   use,  but  it  allows  correspondingly  more
Xflexibility.   It  is  fairly  simple to modify the glue code to allow
Xstill more high level entry points to the TextRequest routine.
X
X
X    This  is  a  complete  program that makes use of the SimpleRequest
Xfunction  from  assembler,  and  demonstrates a few of the features of
XFormat (which is used by SimpleRequest).
X
X;--------------------------------------------------------------------
X;-----CUT HERE---------------CUT HERE--------------------------------
X;--------------------------------------------------------------------
X
X    INCLUDE "libraries/reqbase.i"
X
X    public  SimpleRequest
X    public  _ReqBase,_main
X
X;--------------------------------------------------------
X; This file should be linked with reqglue.o, for the SimpleRequest
X;function.
X;--------------------------------------------------------
X
XSYS MACRO
X    XREF    _LVO\1
X    JSR _LVO\1(A6)
X    ENDM
X
X;--------------------------------------------------------
X
X
X_main
X    OpenReq
Xmystart
X
X    MOVE.L  A6,A5
X    MOVE.L  A6,_ReqBase
X
X
X    PEA     string
X    MOVE.L  #$C0FFEE,-(SP)
X    MOVE.W  #$1CE,-(SP)
X    MOVE.W  #'B',-(SP)
X    MOVE.L  #-12345,-(SP)
X    MOVE.L  SP,A1
X    LEA     Text,A0
X    JSR     SimpleRequest
X
X    LEA     16(SP),SP
X
X    MOVE.L  A5,A1
X    MOVE.L  4,A6
X    SYS     CloseLibrary
X
X    MOVEQ   #0,D0
X    RTS
Xstring
X    DC.B    "This is a string.",0
XText
X    DC.B    "A long (signed) decimal is: %ld,",10
X    DC.B    "a character is: %c,",10
X    DC.B    "a 16 bit hex val might be: %x, ",10
X    DC.B    "a register-style format 32 bit hex: $%08lx,",10
X    DC.B    "and a string might read: `%s'.",0
X
X    dseg
X
X_ReqBase    DC.L    0   ;The SimpleRequest function in the glue code
X                        ;needs this variable.
X
X    END
X
X;--------------------------------------------------------------------
X;-----CUT HERE---------------CUT HERE--------------------------------
X;--------------------------------------------------------------------
X
X
X
X
X;--------------------------------------------------------------------
X
X
X
XTwoGadRequest
X
XNAME
X    TwoGadRequest - bring up a text requester and wait for the user to
Xacknowledge it.
X
XSYNPOSIS
X    result = TwoGadRequest(string, parameterlist, , ,)
X                             A0        A1
X
XFUNCTION
X    Bring  up  a requester (actually a window) containing a message to
Xthe user and wait for the user to click on either the OK or the CANCEL
Xgadget.   The  window automatically sizes to fit the text and printf()
Xstyle  formatting can be used by TextRequest() to generate the message
Xto the user.
X
XINPUTS
X    string  -  a  null  terminated  string,  containing printf() style
Xformatting commands if desired.
X    parameterlist - the parameters corresponding to the printf() style
Xformatting  commands  in  the string.  In C these are listed after the
Xcontrol  string,  exactly as with printf().  In assembler, the address
Xof the list of parameters is put in A1.
X
XRESULT
X    Either  one  or  zero  is  returned, depending on whether the user
Xselected, respectively, the OK or the CANCEL gadget.
X
XBUGS
X    See TextRequest
X
XSEE ALSO
X    TextRequest
X    SimpleRequest
X
X
X    This  function was designed to make it as easy to give messages to
Xthe  user  and get a response in an intuition style requester as it is
Xusing printf() and getc().  Simply replace almost any call to printf()
Xwith  a  call  to  SimpleRequest  and  a requester will appear and not
Xdisappear  until  the  user responds to it (either with a keystroke or
Xwith the mouse).
X
X    Example:
X        if (TwoGadRequest("There have %d changes made to this file.\n"
X                          "O.K. to continue?",
X                          numchanges))
X            exit(10);
X
X    Please  see  the  TextRequest  documentation for further important
Xdetails.   This  routine  is simply a few lines of assembler glue code
Xfor  the TextRequest routine.  The TextRequest routine is a little bit
Xmore   complicated   to   use,  but  it  allows  correspondingly  more
Xflexibility.   It  is  fairly  simple to modify the glue code to allow
Xstill more high level entry points to the TextRequest routine.
X
X
X
X-------------------------------------------------------------------
XNAME
X    GetString
X
XBOOL = GetString(buffer, title, window, visiblechars, maxchars)
XD0                 A0      A1     A2        D0          D1
X
XDESCRIPTION
X    This  routine allows you to bring up a nice intuition style string
Xrequester  in  its  own window and get a single line of input from the
Xuser in just a one line function call.
X
X    buffer  points  to  the  a buffer containing the string which will
Xappear  when  the string gadget first appears and it is also where the
Xresult will be put, if this routine returns TRUE.
X    Title  is  a pointer to a null terminated string that will be used
Xfor the window title.
X    Window  can  be  used  to  specify  what screen you would like the
Xrequester  to  appear on.  You simply put a window pointer in it (or a
Xzero if you want the requester to appear on the workbench screen).  If
Xyou have already set your pr_WindowPtr then you can simply pass a zero
Xfor the window pointer and the pr_WindowPtr value will be used.
X    visiblechars  specifies  how  many  characters  should actually be
Xvisible at one time.
X    maxchars   specifies   how  long  the  buffer  is,  including  the
Xterminating zero.
X
XRETURNS
X    This  routine returns true or false, depending on whether the user
Xclicked  on  the  cancel  gadget  (FALSE)  or clicked on the OK gadget
X(TRUE)  or clicked on the close window gadget (FALSE) or hit return in
Xthe string gadget (TRUE).
X
XBUGS
X    None known.
X
X
X
X-------------------------------------------------------------------
XNAME
X    GetLong
X
XBOOL = GetLong(&GetLongStruct)
XD0                   A0
X
XDESCRIPTION
X    This  routine allows you to bring up a nice intuition style string
Xrequester  in  its  own  window and get a single signed thirty-two bit
Xnumber  from the user in just a one line function call (although a few
Xfields in the structure must be initialized first).
X
X    The  GetLongStruct  contains  fields  for  letting you specify the
Xtitle  bar  message,  the  default  value  that  should  appear in the
Xrequester  and  the maximum and minimum values that the routine should
Xallow  to  be  entered.   If  the  routine  returns  TRUE  (indicating
Xsuccessful  entry  of  a  number)  then  the result is returned in the
Xresult field of the structure.
X    The window field can be used to specify what screen you would like
Xthe requester to appear on.  You simply put a window pointer in it (or
Xa  zero  if you want the requester to appear on the workbench screen).
XIf  you  have  already set your pr_WindowPtr then you can simply leave
Xthe window field zeor and the pr_WindowPtr value will be used.
X
XRETURNS
X    This  routine  returns  TRUE  or  FALSE  (1 or 0) in D0 to specify
Xwhether  or  not  the  user  successfully  entered  a number.  If this
Xroutine  returns TRUE then you can find the result in the result field
Xof the GetLongStruct whose address you passed to GetLong.
X
X
X
X-------------------------------------------------------------------
XRawKeyToAscii
X
XSYNOPSIS
X
X key = RawKeyToAscii(Code,Qualifier,IAddress)
X D0                   D0     D1        A0
X
X UWORD  Code,Qualifier;
X APTR   IAddress;
X
XFUNCTION
X
X    Have you ever wanted to have both RAW and COOKED keys?  You can do
Xit by checking the keys for whatever raw keys you want, and then using
Xthe  console.device's RawKeyConvert routine, except that it's a hassle
Xto start mucking about with the device.
X
X    Well, here you go!  A nice, clean way of converting from a raw key
Xto  a  cooked  key,  in a single call!  All you have to do is pass the
Xcode  and  qualifier  from  your  intuimessage, and the address of the
Xmessage  itself, and you will get back the ASCII value of the key that
Xwas  hit.  This does, in fact, use the console.device's RawKeyConvert,
Xso that if you have a different keymap set, it will be used.
X
XEXAMPLE
X
X
Xstruct IntuiMessage *im;
X
X    key = RawKeyToAscii(im->Code,im->Qualifier,im->IAddress);
X
END_OF_FILE
if test 60498 -ne `wc -c <'req.doc'`; then
    echo shar: \"'req.doc'\" unpacked with wrong size!
fi
# end of 'req.doc'
fi
echo shar: End of archive 3 \(of 3\).
cp /dev/null ark3isdone
MISSING=""
for I in 1 2 3 ; do
    if test ! -f ark${I}isdone ; then
	MISSING="${MISSING} ${I}"
    fi
done
if test "${MISSING}" = "" ; then
    echo You have unpacked all 3 archives.
    rm -f ark[1-9]isdone
else
    echo You still need to unpack the following archives:
    echo "        " ${MISSING}
fi
##  End of shell archive.
exit 0
-- 
Mail submissions (sources or binaries) to <amiga@uunet.uu.net>.
Mail comments to the moderator at <amiga-request@uunet.uu.net>.
Post requests for sources, and general discussion to comp.sys.amiga.