Amiga® RKM Libraries: 16 ASL Library

This chapter describes the asl.library.  The sole purpose of this library
is to provide standard file and font requesters for application programs.

It is easier to understand the asl.library if you are familiar with some
basic concepts of the Amiga operating system, especially TagItem arrays
(described in the "Utility Library" chapter), Intuition screens and
windows, graphics library font structures, and AmigaDOS pattern matching.

 About Requesters             Calling Custom Functions from a Requester 
 Creating a File Requester    Function Reference 
 Creating a Font Requester 


16 ASL Library / About Requesters

Requesters are temporary sub-windows used for confirming actions or
selecting options.  The most common type of requester is a file requester
which is used to pick a file name for a load or save operation.

Under 1.3 (V34) and earlier versions of the Amiga operating system there
was limited support for requesters.  Intuition provides simple requesters
which can be used to request responses such as OK or Cancel from the user.
More elaborate Intuition requesters can be created by adding additional
features such as string gadgets, however the result of this is that each
application writer develops their own style of requester.  Hence, the
asl.library has been added to Release 2 of the Amiga operating system to
make requesters more consistent.  With asl.library, requesters are also
much easier to create and take less memory.

    The ASL Library Requires Release 2.
    -----------------------------------
    The asl.library requires Release 2 of the Amiga operating system, so
    only applications running under Release 2 and later versions of the
    Amiga OS can call its functions.

Requesters are very flexible and can be used for many different purposes.
The Release 2 asl.library supports the two most common type of requesters:

  * File requesters for choosing a file name in a load or save operation

  * Font requesters for choosing a font in a text operation


16 ASL Library / Creating a File Requester

Opening an ASL requester requires the use of three functions:

    APTR request =  AllocAslRequest( unsigned long type,
                                     struct TagItem *tagList );
    BOOL success =  AslRequest( APTR request, struct TagItem *tagList );
    void            FreeAslRequest( APTR request );

The first function you should call is AllocAslRequest().  This allocates
the main data structure you will use, either a FileRequester structure or
a FontRequester structure.  You specify the type of requester you want for
AllocAslRequest() by setting the type argument.  This can be one of two
values defined in <libraries/asl.h>:  either ASL_FileRequest, to ask for a
FileRequester structure, or ASL_FontRequest, to ask for a FontRequester
structure.

Here's a listing of the FileRequester structure.  (The FontRequester
structure is discussed in more detail later in this chapter.)

    struct FileRequester    {          /* (from )     */
        APTR    rf_Reserved1;
        BYTE    *rf_File;          /* Filename pointer             */
        BYTE    *rf_Dir;           /* Directory name pointer       */
        CPTR    rf_Reserved2;
        UBYTE   rf_Reserved3;
        UBYTE   rf_Reserved4;
        APTR    rf_Reserved5;
        WORD    rf_LeftEdge,rf_TopEdge; /* Preferred window pos   */
        WORD    rf_Width,rf_Height;     /* Preferred window size  */
        WORD    rf_Reserved6;
        LONG    rf_NumArgs;        /* A-la WB Args, for multiselects */
        struct WBArg *rf_ArgList;
        APTR    rf_UserData;       /* Applihandle (you may write!!)  */
        APTR    rf_Reserved7;
        APTR    rf_Reserved8;
        BYTE    *rf_Pat;           /* Pattern match pointer          */
        };                         /* note - more reserved fields follow */

Whichever requester type you use, you must allocate the requester
structure with the AllocAslRequest() function call.  Do not create the
data structure yourself.  The values in this structure are for read access
only.  Any changes to them must be performed only through asl.library
function calls.

Once you have set up a requester structure with AllocAslRequest(), call
AslRequest() to make the requester appear on screen.  AslRequest() takes
the requester data structure as an argument using it as a specification
for the requester that it creates on screen.

 Figure 16-1: The ASL File Requester  
Figure 16-1: The ASL File Requester AslRequest() is always synchronous to the calling program. That is, control does not return to your program until the user makes a selection or cancels. AslRequest() returns TRUE, if the user selects a file (or a font). In that case the file (or font) name that the user selected is returned in the requester data structure. AslRequest() returns FALSE if the user cancels the requester or the requester failed for some reason. When you have finished with a requester use the FreeAslRequest() function to deallocate the requester data structure. Specifying Requester Options with TagItems Simple ASL File Requester Example File Pattern Matching and Multiple Selects ASL Requesters and Custom Screens The Save Requester The Directory Requester


16 / Creating a File Requester / Specifying Options with TagItems

Both AllocAslRequest() and AslRequest() accept a TagItem array or tag list
as an argument.  The tag list is used to initialize or alter the values in
the requester data structure.

A single TagItem consists of a tag name and an associated tag value.  Tag
items that apply to the asl.library are defined in <libraries/asl.h>.  The
basic tag items (used in the first example listed below) are:


   Requester
   Tag Name        Used For
   ---------       --------
   ASL_Hail        String to place in the title bar of the requester window
   ASL_Width       Requester window width
   ASL_Height      Requester window height
   ASL_LeftEdge    Requester window y origin
   ASL_TopEdge     Requester window x origin
   ASL_OKText      String to place in OK gadget of requester
   ASL_CancelText  String to place in Cancel gadget of requester
   ASL_File        Default file name (for file requesters only)
   ASL_Dir         Default directory name (for file requesters only)


Note that you are currently limited to about six characters for the
replacement text if you use either the ASL_OKText or ASL_CancelText tags
to change the text that appears in the OK and Cancel gadgets.

The contents of an ASL requester data structure are preserved across calls
to AslRequest().  So, until the requester is freed, tag settings and user
selections will remain in the data structure unless they are altered by
tags in subsequent calls to AslRequest().  This is very useful because it
allows the requester to remember and redisplay the user's previous
selections.  However, this also means that the programmer must assure that
any addresses passed in ASL tags remain valid, or are refreshed on each
call to AslRequest().

Generally, options that you wish to specify only once, such as the initial
position and size, should be specified as tags when you allocate the
requester.  Options that you wish to control for each use of the requester
should be passed as tags each time the requester is opened with
AslRequest().


16 / / File Pattern Matching and Multiple Selects

A file requester can filter out certain file and directory entries using
the "wildcard" feature of  AmigaDOS.  To activate the wildcard feature for
a file requester, you use the ASL_FuncFlags tag.  Each bit in the
ASL_FuncFlags tag item controls a special option of the requester
depending on its type (file or font).  See <libraries/asl.h> for a
complete listing of the options that the ASL_FuncFlags tag controls.


 File Requester Flag  Used For
 -------------------  --------
  FILF_PATGAD         Enables the file name pattern matching gadget
  FILF_MULTISELECT    Enables multiple selection of files
  FILF_NEWIDCMP       Use separate IDCMP for requester sharing a custom
                      screen (see below)
  FILF_SAVE           Makes the file requester a save requester (see below)


If the FILF_PATGAD bit of the ASL_FuncFlags tag is set, the file requester
will appear with a "Pattern" gadget in addition to the usual file name and
directory name gadgets.  The user can type an AmigaDOS wildcard pattern
into this gadget and the pattern will be used to limit the file names that
appear in the requester.  An application can also supply a default pattern
using the ASL_Pattern tag item. A hidden unchangeable pattern can be
created by supplying an ASL_Pattern without a FILF_PATGAD gadget. Such
invisible patterns should not be used if there is any reason that the user
may need to access a file which does not match the pattern.

Another feature of the ASL file requester is multiple selection.  When
multiple selection is enabled, the user can choose more than one file name
in a single directory by selecting names in the requester's scrolling list
gadget with the mouse.  This option, like pattern matching, is set up with
the ASL_FuncFlags tag.

If the FILF_MULTISELECT bit of the ASL_FuncFlags tag is set, the file
requester will allow multiple selection.  When the user selects several
file names through the multiple selection feature, the FileRequester's
rf_NumArgs field contains the number of files selected and the rf_ArgList
field contains a pointer to an array of WBArg structures (defined in
<workbench/startup.h>).  There is a WBArg structure containing a file name
for each file the user selected.

The following example illustrates a file requester with both a pattern
matching gadget and multiple selection enabled.

     filepat.c 

The previous example demonstrates two alternate functions for creating and
using ASL requesters:

    APTR AllocAslRequestTags( unsigned long type, Tag Tag1, ... );
    BOOL AslRequestTags( APTR request, Tag Tag1, ... );

AllocAslRequestTags() can be used instead of AllocAslRequest() to allocate
and set up the file requester.  This is an amiga.lib function that will
accept TagItems directly in its parameter list, rather than a pointer to
an array of TagItems.

Similarly, AslRequestTags() will accept TagItems directly instead of
requiring a pointer to an array of TagItems as AslRequest() does.


16 / Creating a File Requester / ASL Requesters and Custom Screens

An application that uses a custom screen normally wants its requesters to
open on its screen.  Using the ASL_Window tag, a program can associate a
requester with a specific window so that the requester appears on the same
screen as the window.  The ASL_Window tag is followed by a pointer to a
window structure.  ASL_Window works with both file and font requesters.
The example above shows how the ASL_Window tag is used with a file
requester.

Normally, a requester associated with a window (using ASL_Window) shares
that window's IDCMP port for its communication.  An application may not
want to share an IDCMP port with the requester.  Using the ASL_FuncFlags
tag, a program can ask for a requester that creates its own IDCMP port.
There are two flags that accomplish this.  The first, FILF_NEWIDCMP, is
used on file requesters.   The other, FONF_NEWIDCMP, is used on font
requesters.


16 / Creating a File Requester / The Save Requester

The save requester is a special type of file requester used for save
operations.  It differs from the regular ASL file requester in several
ways.  First, the color of the text making up the file names and the
background color are interchanged.  This makes it more apparent to the
user that they are looking at a save requester (instead of the usual load
requester).

Another difference, is that a save requester does not allow the user to
select an existing file name by double-clicking on an entry in the
scrolling list gadget.  This helps prevent the user from accidentally
overwriting the wrong file.

Save requesters can also create directories.  If the user types a
directory name into the save requester and the directory doesn't exist,
the save requester will create that directory (after getting the user's
permission via another requester).

To create a save requester, set the FILF_SAVE flag of the ASL_FuncFlags
tag. Remember that ASL tags and flag values are preserved across calls to
AslRequest(), so if you use a save requester, you must clear the FILF_SAVE
bit and reset your ASL_FuncFlags when you want a load requester. Note that
it does not make sense to have multiselection in a save requester, so the
FILF_SAVE flag overrides the FILF_MULTISELECT flag.


16 / Creating a File Requester / The Directory Requester

Sometimes a program may only require a directory name from the user. There
is another variation on asl.library's file requester that allows this.
The ASL_ExtFlags1 tag contains a flag bit to toggle this option. If the
FIL1F_NOFILES flag of ASL_ExtFlags1 is set, the requester will appear
without a string gadget for file names and will display only directory
names in the scrolling list gadget. When AslRequest() (or AslRequestTags()
) returns successfully, the rf_Dir field of the FileRequester structure
contains the name of the directory the user selected.

Another flag defined for ASL_ExtFlags1 is FIL1F_MATCHDIRS. If file pattern
matching is on (see the FILF_PATGAD flag for ASL_FuncFlags, setting
FIL1F_MATCHDIRS tells the file requester to pattern match directory names
as well as file names.  Of course, if both of these ASL_ExtFlags1 flags
are set, the requester will only pattern match directory names.


16 ASL Library / Creating a Font Requester

The ASL library also contains a font requester.  Using the font requester
is very similar to using the file requester.  First, allocate a requester
structure with AllocAslRequest() or AllocAslRequestTags().  The type
should be set to ASL_FontRequest in order to get a FontRequester structure:

    struct FontRequester    {
        APTR    fo_Reserved1[2];
        struct TextAttr fo_Attr;        /* Returned TextAttr            */
        UBYTE   fo_FrontPen;            /* Returned pens, if selected   */
        UBYTE   fo_BackPen;
        UBYTE   fo_DrawMode;
        APTR    fo_UserData;
        /* missing from asl.h but present in this structure */
        SHORT   fo_LeftEdge, fo_TopEdge, fo_Width, fo_Height;
        };

Once the requester is set up, call AslRequest() or AslRequestTags() to
make the requester appear on screen.  These functions return TRUE if the
user makes a selection.  In that case, the font selected is returned as a
TextAttr structure in the fo_Attr field of the FontRequester structure.
(The TextAttr structure is defined in <graphics/text.h>.  See the Amiga
ROM Kernel Manual: Includes and Autodocs for a complete listing.)  If the
user cancels the font requester FALSE is returned.

 Figure 16-2: The ASL Font Requester  
Figure 16-2: The ASL Font Requester When the requester is no longer needed, call FreeAslRequest() to deallocate the requester data structure. Specifying Font Requester Options with TagItems Example Font Requester


16 / Creating a Font Requester / Specifying Options with TagItems

As with a file requester, the font requester is specified with a TagItem
list.  There are several tags that are specific to the font requester:


  Font Requester
  Tag Name        Used For
  --------------  --------
  ASL_FontName    Default font (fo_Attr.ta_Name)
  ASL_FontHeight  Default font size (fo_Attr.ta_YSize)
  ASL_FontStyles  Default font style (fo_Attr.ta_Style)
  ASL_FontFlags   Default font flags (fo_Attr.ta_Flags)
  ASL_FrontPen    Default font color (fo_FrontPen)
  ASL_BackPen     Default font background color (fo_BackPen)
  ASL_ModeList    Alternate strings for the drawing mode gadget (see below)
  ASL_MinHeight   Minimum font height the requester will display
  ASL_MaxHeight   Maximum font height the requester will display


Note that the last two tags only limit the range of font sizes that the
font requester displays, the user is free to type in any value.

Font requesters have additional special options that are controlled
through the ASL_FuncFlags tag.  This tag works the same way as it does
with file requesters but with different options available.  Recall that
the data for this tag is divided into bit fields, each of which controls a
requester option.  The flags used with the ASL_FuncFlags tag in a font
requester are defined in <libraries/asl.h>:


  Font Requester Flags  Used For
  --------------------  --------
  FONF_FRONTCOLOR       Enables font color selection gadgets
  FONF_BACKCOLOR        Enables font background color selection gadget
  FONF_STYLES           Enables font style selection gadget
  FONF_FIXEDWIDTH       Limits display to fixed width fonts only
  FONF_DRAWMODE         Enables font draw mode gadget


A simple font requester (one without any of the above FONF_ flags set)
only lets the user choose a font and a Y size.  Setting the flags above
adds options to the font requester.  FONF_FRONTCOLOR and FONF_BACKCOLOR
add color selection gadgets to the requester, one for choosing a font's
foreground color (labeled "Text") and the other for choosing the
background color (labeled "Field").  The font requester records the user's
setting in the FontRequester's fo_FrontPen and fo_BackPen fields.

FONF_STYLES sets up several gadgets to choose the style of the font (bold,
italics, underline).  The font requester saves these settings in the
fo_Attr.ta_Style bit field according to the style flags defined in
<graphics/text.h>.  FONF_FIXEDWIDTH limits the font name display to fixed
width (non-proportional) fonts (note that this does not prevent the user
from typing in a proportional font name).

FONF_DRAWMODE adds a cycle gadget to the font requester so the user can
choose the draw mode.  The draw mode is saved in the requester's
fo_DrawMode field.  The number stored there corresponds to the draw mode's
position in the gadget's cycle.

The draw mode cycle gadget initially is labeled "Mode" and has three
elements in its cycle: "JAM1", "JAM2", and "Complement".  These yield a
result of 0, 1, and 2, respectively.  It is possible to change the names
and number of draw modes with the ASL_ModeList tag.  This tag accepts a
pointer to an array of strings.  The first string replaces "Mode" as the
label for the draw mode cycle gadget.  The strings that follow replace the
elements of the cycle gadget.  The last entry in the array has to be NULL
to tell the requester where the list of entries ends.


16 ASL Library / Calling Custom Functions from a Requester

The ASL_HookFunc tag passes an ASL requester a pointer to a custom
function.  The requester can use this function for two purposes.  The
first is to determine if the requester should display a particular file or
font name.  The other purpose is to process messages that the requester
receives at its IDCMP port that are not meant for the requester.  Hook
functions are set up through flag values used with the ASL_FuncFlags tag:


    Hook Function Flag  Used For
    ------------------  --------
    FILF_DOWILDFUNC     Call user hook function on each name in a file
                        requester
    FONF_DOWILDFUNC     Call user hook function on each name in a font
                        requester
    FILF_DOMSGFUNC      Call user hook function for IDCMP messages not
                        used by a file requester
    FONF_DOMSGFUNC      Call user hook function for IDCMP messages not
                        used by a font requester


The FILF_DOWILDFUNC and FONF_DOWILDFUNC flags cause a requester to call
the function you specify with the ASL_HookFunc tag for every file or font
entry.  The requester displays the file or font name only if your hook
function tells it to.  For a file requester, if your hook function returns
a zero, the file requester will display the file name.  For a font
requester, if your hook function returns anything but zero, the font
requester will display the font name and size.

The FILF_DOMSGFUNC and FONF_DOMSGFUNC flags cause a requester to call your
hook function whenever it receives an IntuiMessage that it cannot use at
the IDCMP port that it shares with your window.  (See the section on
"ASL Requesters and Custom Screens" earlier in this chapter for more
information about sharing IDCMP ports.)  If the requester receives any
messages that are not meant for the requester it will call your hook
function (specified with the ASL_HookFunc tag).  Your hook function is
responsible for returning a pointer to the IntuiMessage.  The requester
will take care of replying to the message.

 Parameters Passed to Custom Hook Functions 
 Example ASL Requester with Custom Hook Function 


16 / Calling Functions / Parameters Passed to Custom Hook Functions

A requester always passes three parameters to your custom hook function:

    ULONG MyHookFunc(ULONG type, CPTR object, CPTR AslRequester)

If MyHookFunc() is called from a file requester doing _DOWILDFUNC, the
three parameters are:


    type = FILF_DOWILDFUNC

    object = pointer to an AnchorPath structure (from <dos/dosasl.h>)

    AslRequester = pointer to the FileRequester that called the hook
                   function (Return a zero to display this file)


The AnchorPath structure is a dos.library structure used in pattern
matching.  Refer to the AmigaDOS Manual, 3rd Edition by Bantam Books for
more information.

If MyHookFunc() is called from a font requester doing _DOWILDFUNC, the
three parameters are:


    type = FONF_DOWILDFUNC

    object = pointer to a TextAttr structure (from <graphics/text.h>)

    AslRequester = pointer to the FontRequester that called the hook
                   function (Return non-zero to display this particular
                   font size)


If MyHookFunc() is called from a file or font requester doing _DOMSGFUNC,
the three parameters are:


    type = FILF_DOMSGFUNC (file requester) or FONF_DOMSGFUNC (font
           requester)

    object = pointer to the IntuiMessage for the function to process

    AslRequester = pointer to the FileRequester or FontRequester that
                   called the hook function (Return a pointer to the
                   IntuiMessage)


Notice that it is possible for a requester to use both _DOWILDFUNC and
_DOMSGFUNC at the same time.  Your hook function has to differentiate
between the two cases by testing the type passed to it.  It is not
possible for a font and file requester to share a hook function for a
_DOWILDFUNC, because FILF_DOWILDFUNC is defined to be the same value as
FONF_DOWILDFUNC, so the hook function cannot tell if the object (from the
prototype above) is a pointer to an AnchorPath structure or a pointer to a
TextAttr structure.  It is possible for font and file requesters to share
one hook function for _DOMSGFUNC (even though FILF_DOMSGFUNC and
FONF_DOMSGFUNC are equal) because, in this case, font and file requesters
both call your hook function in the same manner.


16 ASL Library / Function Reference

The following are brief descriptions of the ASL library functions.  See
the Amiga ROM Kernel Reference Manual: Includes and Autodocs for details
on each function call.  All of these functions require Release 2 or a
later version of the operating system.


                 Table 16-1: Functions for ASL Requesters
  ________________________________________________________________________
 |                                                                        |
 |           Function                   Description                       |
 |========================================================================|
 |                                                                        |
 |      AllocAslRequest()  Allocates an ASL font or file requester from   |
 |                         a TagItem array                                |
 |  AllocAslRequestTags()  Same as AllocAslRequest() but accepts tags     |
 |                         directly                                       |
 |           AslRequest()  Displays an ASL requester with options set up  |
 |                         in a TagItem array                             |
 |       AslRequestTags()  Same as AslRequest() but accepts tags directly |
 |       FreeAslRequest()  Deallocates an ASL requester created with      |
 |                         AllocAslRequest()                              |
 |________________________________________________________________________|


Converted on 22 Apr 2000 with RexxDoesAmigaGuide2HTML 2.1 by Michael Ranner.