{
    This file is part of the Free Pascal run time library.
    Copyright (c) 2014 by Free Pascal development team

    asl.library functions

    See the file COPYING.FPC, included in this distribution,
    for details about the copyright.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

 **********************************************************************}

unit asl;

interface

uses
  exec, utility, workbench, agraphics;

const
  ASLNAME: PChar = 'asl.library';
  ASL_TB = TAG_USER + $80000;

// Types of requesters known to ASL, used as arguments to AllocAslRequest()
  ASL_FileRequest       = 0;
  ASL_FontRequest       = 1;
  ASL_ScreenModeRequest = 2;


{****************************************************************************

  ASL File Requester data structures and constants

  This structure must only be allocated by asl.library amd is READ-ONLY!
  Control of the various fields is provided via tags when the requester
  is created with AllocAslRequest() and when it is displayed via
  AslRequest() }

type
  PFileRequester = ^TFileRequester;
  TFileRequester = record
    fr_Reserved0: array[0..3] of byte;
    fr_File: STRPTR;        // User selected file
    fr_Drawer: STRPTR;      // User selected drawer
    fr_Reserved1: array[0..9] of byte;
    fr_LeftEdge: SmallInt;
    fr_TopEdge: SmallInt;   // Requester size/placement on exit
    fr_Width: SmallInt;
    fr_Height: SmallInt;
    fr_Reserved2: array[0..1] of byte;
    fr_NumArgs: LongInt;    // How many files were selected ?
    fr_ArgList: PWBArgList; // Selected files
    fr_UserData: APTR;
    fr_Reserved3: array[0..7] of byte;
    fr_Pattern: STRPTR;     // Pattern on exit
  end;


// File requester tag values, used by AllocAslRequest() and AslRequest()

const
// Window control
  ASLFR_Window        = ASL_TB + 2;   // Parent window
  ASLFR_Screen        = ASL_TB + 40;  // Screen to open on if no window
  ASLFR_PubScreenName = ASL_TB + 41;  // Name of public screen
  ASLFR_PrivateIDCMP  = ASL_TB + 42;  // Allocate private IDCMP?
  ASLFR_IntuiMsgFunc  = ASL_TB + 70;  // function to handle IntuiMessages
  ASLFR_SleepWindow   = ASL_TB + 43;  // Block input in ASLFR_Window?
  ASLFR_UserData      = ASL_TB + 52;  // What to put in fr_UserData
  ASLFR_PopToFront    = ASL_TB + 131; // Make the requester window visible
  ASLFR_Activate      = ASL_TB + 132; // Activate the requester window when

// Text display
  ASLFR_TextAttr     = ASL_TB + 51; // Text font to use for gadget text
  ASLFR_Locale       = ASL_TB + 50; // Locale ASL should use for text
  ASLFR_TitleText    = ASL_TB + 1;  // Title of requester
  ASLFR_PositiveText = ASL_TB + 18; // Positive gadget text
  ASLFR_NegativeText = ASL_TB + 19; // Negative gadget text

// Initial settings
  ASLFR_InitialLeftEdge    = ASL_TB + 3;   // Initial requester coordinates
  ASLFR_InitialTopEdge     = ASL_TB + 4;
  ASLFR_InitialWidth       = ASL_TB + 5;   // Initial requester dimensions
  ASLFR_InitialHeight      = ASL_TB + 6;
  ASLFR_InitialFile        = ASL_TB + 8;   // Initial contents of File gadget
  ASLFR_InitialDrawer      = ASL_TB + 9;   // Initial contents of Drawer gadg.
  ASLFR_InitialPattern     = ASL_TB + 10;  // Initial contents of Pattern gadg.
  ASLFR_InitialShowVolumes = ASL_TB + 130; // Initially, show the volume list (V44)

// Options
  ASLFR_Flags1        = ASL_TB + 20; // Option flags
  ASLFR_Flags2        = ASL_TB + 22; // Additional option flags
  ASLFR_DoSaveMode    = ASL_TB + 44; // Being used for saving?
  ASLFR_DoMultiSelect = ASL_TB + 45; // Do multi-select?
  ASLFR_DoPatterns    = ASL_TB + 46; // Display a Pattern gadget?

// Filtering
  ASLFR_DrawersOnly   = ASL_TB + 47; // Don't display files?
  ASLFR_FilterFunc    = ASL_TB + 49; // function to filter files
  ASLFR_RejectIcons   = ASL_TB + 60; // Display .info files?
  ASLFR_RejectPattern = ASL_TB + 61; // Don't display files matching pat
  ASLFR_AcceptPattern = ASL_TB + 62; // Accept only files matching pat
  ASLFR_FilterDrawers = ASL_TB + 63; // Also filter drawers with patterns
  ASLFR_HookFunc      = ASL_TB + 7;  // Combined callback function

// Sorting
  ASLFR_SetSortBy      = ASL_TB + 124; // Sort criteria (name, date, size)
  ASLFR_GetSortBy      = ASL_TB + 125;
  ASLFR_SetSortDrawers = ASL_TB + 126; // Placement of drawers in the list
  ASLFR_GetSortDrawers = ASL_TB + 127;
  ASLFR_SetSortOrder   = ASL_TB + 128; // Order (ascending or descending)
  ASLFR_GetSortOrder   = ASL_TB + 129;


// Flag bits for the ASLFR_Flags1 tag
  FRB_FILTERFUNC    = 7;
  FRB_INTUIFUNC     = 6;
  FRB_DOSAVEMODE    = 5;
  FRB_PRIVATEIDCMP  = 4;
  FRB_DOMULTISELECT = 3;
  FRB_DOPATTERNS    = 0;

  FRF_FILTERFUNC    = 1 shl FRB_FILTERFUNC;
  FRF_INTUIFUNC     = 1 shl FRB_INTUIFUNC;
  FRF_DOSAVEMODE    = 1 shl FRB_DOSAVEMODE;
  FRF_PRIVATEIDCMP  = 1 shl FRB_PRIVATEIDCMP;
  FRF_DOMULTISELECT = 1 shl FRB_DOMULTISELECT;
  FRF_DOPATTERNS    = 1 shl FRB_DOPATTERNS;

// Flag bits for the ASLFR_Flags2 tag
  FRB_DRAWERSONLY   = 0;
  FRB_FILTERDRAWERS = 1;
  FRB_REJECTICONS   = 2;

  FRF_DRAWERSONLY   = 1 shl FRB_DRAWERSONLY;
  FRF_FILTERDRAWERS = 1 shl FRB_FILTERDRAWERS;
  FRF_REJECTICONS   = 1 shl FRB_REJECTICONS;

// Sort criteria for the ASLFR_SetSortBy/ASLFR_GetSortBy tags
  ASLFRSORTBY_Name = 0;
  ASLFRSORTBY_Date = 1;
  ASLFRSORTBY_Size = 2;

// Drawer placement for the ASLFR_SetSortDrawers/ASLFR_GetSortDrawers tags
  ASLFRSORTDRAWERS_First = 0;
  ASLFRSORTDRAWERS_Mix   = 1;
  ASLFRSORTDRAWERS_Last  = 2;

// Sort order for the ASLFR_SetSortOrder/ASLFR_GetSortOrder tags
  ASLFRSORTORDER_Ascend  = 0;
  ASLFRSORTORDER_Descend = 1;

{****************************************************************************

  ASL Font Requester data structures and constants

  This structure must only be allocated by asl.library amd is READ-ONLY!
  Control of the various fields is provided via tags when the requester
  is created with AllocAslRequest() and when it is displayed via
  AslRequest()}

Type
  PFontRequester = ^TFontRequester;
  TFontRequester = record
    fo_Reserved0: array[0..7] of byte;
    fo_Attr: TTextAttr;    // Returned TextAttr
    fo_FrontPen: byte;     // Returned front pen
    fo_BackPen: byte;      // Returned back pen
    fo_DrawMode: byte;     // Returned drawing mode
    fo_Reserved1: byte;
    fo_UserData: Pointer;  // You can store your own data here
    fo_LeftEdge: SmallInt; // Coordinates Of requester on Exit
    fo_TopEdge: SmallInt;
    fo_Width: SmallInt;
    fo_Height: SmallInt;
    fo_TAttr: TTTextAttr;  // Returned TTextAttr
  end;


// Font requester tag values, used by AllocAslRequest() AND AslRequest()

const
// Window control
  ASLFO_Window        = ASL_TB + 2;   // Parent window
  ASLFO_Screen        = ASL_TB + 40;  // Screen to open on if no window
  ASLFO_PubScreenName = ASL_TB + 41;  // Name of public screen
  ASLFO_PrivateIDCMP  = ASL_TB + 42;  // Allocate private IDCMP?
  ASLFO_IntuiMsgFunc  = ASL_TB + 70;  // function to handle IntuiMessages
  ASLFO_SleepWindow   = ASL_TB + 43;  // Block input in ASLFO_Window?
  ASLFO_UserData      = ASL_TB + 52;  // What to put in fo_UserData
  ASLFO_PopToFront    = ASL_TB + 131; // Make the requester window visible when it opens (V44)
  ASLFO_Activate      = ASL_TB + 132; // Activate the requester window when it opens (V45).

// Text display
  ASLFO_TextAttr     = ASL_TB + 51; // Text font to use for gadget text
  ASLFO_Locale       = ASL_TB + 50; // Locale ASL should use for text
  ASLFO_TitleText    = ASL_TB + 1 ; // Title of requester
  ASLFO_PositiveText = ASL_TB + 18; // Positive gadget text
  ASLFO_NegativeText = ASL_TB + 19; // Negative gadget text

// Initial settings
  ASLFO_InitialLeftEdge = ASL_TB + 3;  // Initial requester coordinates
  ASLFO_InitialTopEdge  = ASL_TB + 4;
  ASLFO_InitialWidth    = ASL_TB + 5;  // Initial requester dimensions
  ASLFO_InitialHeight   = ASL_TB + 6;
  ASLFO_InitialName     = ASL_TB + 10; // Initial contents of Name gadget
  ASLFO_InitialSize     = ASL_TB + 11; // Initial contents of Size gadget
  ASLFO_InitialStyle    = ASL_TB + 12; // Initial font style
  ASLFO_InitialFlags    = ASL_TB + 13; // Initial font flags for TextAttr
  ASLFO_InitialFrontPen = ASL_TB + 14; // Initial front pen
  ASLFO_InitialBackPen  = ASL_TB + 15; // Initial back pen
  ASLFO_InitialDrawMode = ASL_TB + 59; // Initial draw mode

// Options
  ASLFO_Flags      = ASL_TB + 20;  // Option flags
  ASLFO_DoFrontPen = ASL_TB + 44;  // Display Front color selector?
  ASLFO_DoBackPen  = ASL_TB + 45;  // Display Back color selector?
  ASLFO_DoStyle    = ASL_TB + 46;  // Display Style checkboxes?
  ASLFO_DoDrawMode = ASL_TB + 47;  // Display DrawMode cycle gadget?
  ASLFO_SampleText = ASL_TB + 133; // Text to display in font sample area (V45)

// Filtering
  ASLFO_FixedWidthOnly = ASL_TB + 48; // Only allow fixed-width fonts?
  ASLFO_MinHeight      = ASL_TB + 16; // Minimum font height to display
  ASLFO_MaxHeight      = ASL_TB + 17; // Maximum font height to display
  ASLFO_FilterFunc     = ASL_TB + 49; // function to filter fonts
  ASLFO_HookFunc       = ASL_TB + 7;  // Combined callback function
  ASLFO_MaxFrontPen    = ASL_TB + 66; // Max # of colors in front palette
  ASLFO_MaxBackPen     = ASL_TB + 67; // Max # of colors in back palette

// Custom additions
  ASLFO_ModeList  = ASL_TB + 21; // Substitute list for drawmodes
  ASLFO_FrontPens = ASL_TB + 64; // Color table for front pen palette
  ASLFO_BackPens  = ASL_TB + 65; // Color table for back pen palette

// Flag bits for ASLFO_Flags tag
  FOB_DOFRONTPEN     = 0;
  FOB_DOBACKPEN      = 1;
  FOB_DOSTYLE        = 2;
  FOB_DODRAWMODE     = 3;
  FOB_FIXEDWIDTHONLY = 4;
  FOB_PRIVATEIDCMP   = 5;
  FOB_INTUIFUNC      = 6;
  FOB_FILTERFUNC     = 7;

  FOF_DOFRONTPEN     = 1 shl FOB_DOFRONTPEN;
  FOF_DOBACKPEN      = 1 shl FOB_DOBACKPEN;
  FOF_DOSTYLE        = 1 shl FOB_DOSTYLE;
  FOF_DODRAWMODE     = 1 shl FOB_DODRAWMODE;
  FOF_FIXEDWIDTHONLY = 1 shl FOB_FIXEDWIDTHONLY;
  FOF_PRIVATEIDCMP   = 1 shl FOB_PRIVATEIDCMP;
  FOF_INTUIFUNC      = 1 shl FOB_INTUIFUNC;
  FOF_FILTERFUNC     = 1 shl FOB_FILTERFUNC;

{****************************************************************************

  ASL Screen Mode Requester data structures and constants

  This structure must only be allocated by asl.library and is READ-ONLY!
  Control of the various fields is provided via tags when the requester
  is created with AllocAslRequest() and when it is displayed via
  AslRequest() }

type
  PScreenModeRequester = ^TScreenModeRequester;
  TScreenModeRequester = record
    sm_DisplayID: LongWord;     // Display mode ID
    sm_DisplayWidth: LongWord;  // Width Of display IN pixels
    sm_DisplayHeight: LongWord; // Height Of display IN pixels
    sm_DisplayDepth: word;      // Number OF bit-planes OF display
    sm_OverscanType: word;      // TYPE OF overscan OF display
    sm_AutoScroll: WordBool;    // Display should auto-scroll?

    sm_BitMapWidth: LongWord;    // Used TO create your own BitMap
    sm_BitMapHeight: LongWord;

    sm_LeftEdge: SmallInt;       // Coordinates OF requester on Exit
    sm_TopEdge: SmallInt;
    sm_Width: SmallInt;
    sm_Height: SmallInt;

    sm_InfoOpened: WordBool;     // Info window opened on exit?
    sm_InfoLeftEdge: SmallInt;   // Last coordinates OF Info window
    sm_InfoTopEdge: SmallInt;
    sm_InfoWidth: SmallInt;
    sm_InfoHeight: SmallInt;

    sm_UserData: APTR;           // You can store your own data here
  end;

{ An Exec list of custom modes can be added to the list of available modes.
  The DimensionInfo structure must be completely initialized, including the
  Header. See <graphics/displayinfo.h>. Custom mode ID's must be in the range
  $FFFF0000..$FFFFFFFF. Regular properties which apply to your custom modes
  can be added in the dn_PropertyFlags field. Custom properties are not
  allowed. }

  PDisplayMode = ^TDisplayMode;
  TDisplayMode = record
    dm_Node: TNode;                   // see ln_Name
    dm_DimensionInfo: TDimensionInfo; // mode description
    dm_PropertyFlags: LongWord;       // applicable properties
  end;

// ScreenMode requester tag values, used by AllocAslRequest() and AslRequest()
const
// Window control
  ASLSM_Window        = ASL_TB + 2;   // Parent window
  ASLSM_Screen        = ASL_TB + 40;  // Screen to open on if no window
  ASLSM_PubScreenName = ASL_TB + 41;  // Name of public screen
  ASLSM_PrivateIDCMP  = ASL_TB + 42;  // Allocate private IDCMP?
  ASLSM_IntuiMsgFunc  = ASL_TB + 70;  // function to handle IntuiMessages
  ASLSM_SleepWindow   = ASL_TB + 43;  // Block input in ASLSM_Window?
  ASLSM_UserData      = ASL_TB + 52;  // What to put in sm_UserData
  ASLSM_PopToFront    = ASL_TB + 131; // Make the requester window visible  when it opens (V44)
  ASLSM_Activate      = ASL_TB + 132; // Activate the requester window when it opens (V45).

// Text display
  ASLSM_TextAttr     = ASL_TB + 51; // Text font to use for gadget text
  ASLSM_Locale       = ASL_TB + 50; // Locale ASL should use for text
  ASLSM_TitleText    = ASL_TB + 1;  // Title of requester
  ASLSM_PositiveText = ASL_TB + 18; // Positive gadget text
  ASLSM_NegativeText = ASL_TB + 19; // Negative gadget text

// Initial settings
  ASLSM_InitialLeftEdge      = ASL_TB + 3;   // Initial requester coordinates
  ASLSM_InitialTopEdge       = ASL_TB + 4;
  ASLSM_InitialWidth         = ASL_TB + 5;   // Initial requester dimensions
  ASLSM_InitialHeight        = ASL_TB + 6;
  ASLSM_InitialDisplayID     = ASL_TB + 100; // Initial display mode id
  ASLSM_InitialDisplayWidth  = ASL_TB + 101; // Initial display width
  ASLSM_InitialDisplayHeight = ASL_TB + 102; // Initial display height
  ASLSM_InitialDisplayDepth  = ASL_TB + 103; // Initial display depth
  ASLSM_InitialOverscanType  = ASL_TB + 104; // Initial type of overscan
  ASLSM_InitialAutoScroll    = ASL_TB + 105; // Initial autoscroll setting
  ASLSM_InitialInfoOpened    = ASL_TB + 106; // Info wndw initially opened?
  ASLSM_InitialInfoLeftEdge  = ASL_TB + 107; // Initial Info window coords.
  ASLSM_InitialInfoTopEdge   = ASL_TB + 108;

// Options
  ASLSM_DoWidth        = ASL_TB + 109; // Display Width gadget?
  ASLSM_DoHeight       = ASL_TB + 110; // Display Height gadget?
  ASLSM_DoDepth        = ASL_TB + 111; // Display Depth gadget?
  ASLSM_DoOverscanType = ASL_TB + 112; // Display Overscan Type gadget?
  ASLSM_DoAutoScroll   = ASL_TB + 113; // Display AutoScroll gadget?

// Filtering
  ASLSM_PropertyFlags = ASL_TB + 114; // Must have these Property flags
  ASLSM_PropertyMask  = ASL_TB + 115; // Only these should be looked at
  ASLSM_MinWidth      = ASL_TB + 116; // Minimum display width to allow
  ASLSM_MaxWidth      = ASL_TB + 117; // Maximum display width to allow
  ASLSM_MinHeight     = ASL_TB + 118; // Minimum display height to allow
  ASLSM_MaxHeight     = ASL_TB + 119; // Maximum display height to allow
  ASLSM_MinDepth      = ASL_TB + 120; // Minimum display depth
  ASLSM_MaxDepth      = ASL_TB + 121; // Maximum display depth
  ASLSM_FilterFunc    = ASL_TB + 122; // function to filter mode id's

// Custom additions
  ASLSM_CustomSMList = ASL_TB + 123; // Exec list of struct DisplayMode

  ASL_LAST_TAG = ASL_TB + 133;


{ This defines the rendezvous data for setting and querying asl.library's
  defaults for the window size and the file requester sort order. The name
  of the semaphore is given below; it exists only with asl.library V45 and
  IPrefs V45 and beyond.}
  ASL_SEMAPHORE_NAME: PChar = 'asl.library';

type
  PASLSemaphore = ^TASLSemaphore;
  TASLSemaphore = record
    as_Semaphore: TSignalSemaphore;
    as_Version: word;          // Must be >= 45
    as_Size: LongWord;         // Size of this data structure. }
    as_SortBy: byte;           // File requester defaults; name, date or size }
    as_SortDrawers: byte;      // File requester defaults; first, mix or last }
    as_SortOrder: byte;        // File requester defaults; ascending or descending }
    as_SizePosition: byte;     // See below }
    as_RelativeLeft: Smallint; // Window position offset }
    as_RelativeTop: Smallint;
    as_RelativeWidth: byte;    // Window size factor; this is a percentage of the parent window/screen width.
    as_RelativeHeight: byte;
   end;

const
// Default position of the ASL window.
  ASLPOS_DefaultPosition = 0; // Position is calculated according to the builtin rules.
  ASLPOS_CenterWindow    = 1; // Centred within the bounds of the parent window.
  ASLPOS_CenterScreen    = 2; // Centred within the bounds of the parent screen.
  ASLPOS_WindowPosition  = 3; // Relative to the top left corner of the parent window, using the offset values provided in the as_RelativeLeft/as_RelativeTop members.
  ASLPOS_ScreenPosition  = 4; // Relative to the top left corner of the parent screen, using the offset values provided in the as_RelativeLeft/as_RelativeTop members.
  ASLPOS_CenterMouse     = 5; // Directly below the mouse pointer.
  ASLPOS_MASK            = $0F;

// Default size of the ASL window.
  ASLSIZE_DefaultSize  = 0 shl 4; // Size is calculated according to the builtin rules.
  ASLSIZE_RelativeSize = 1 shl 4; // Size is relative to the size of the parent window or screen, using the values provided in
                                  // the as_RelativeWidth/as_RelativeHeight members. The as_RelativeWidth/as_RelativeHeight values are
                                  // taken as percentage, i.e. a value of "50" stands for 50% of the width/height of the parent window/screen.
  ASLSIZE_MASK         = $30;

// Other options.
  ASLOPTION_ASLOverrides = 1 shl 6; // ASL determines placement and size of requester windows; application's choice is ignored.


{****************************************************************************

  Obsolete ASL definitions, here for source code compatibility only.
  Please do NOT use in new code.

    define ASL_V38_NAMES_ONLY to remove these older names
 }
{$define ASL_V38_NAMES_ONLY}
{$ifndef ASL_V38_NAMES_ONLY}
const

  TFileRequesterV38 = record
    rf_Reserved0: array[0..3] of byte;
    rf_File: STRPTR;         // Filename pointer
    rf_Dir: STRPTR;          // Directory name pointer
    rf_Reserved1: array[0..9] of Byte;
    rf_LeftEdge: SmallInt;
    rf_TopEdge: SmallInt;    // Preferred window pos
    rf_Width: SmallInt;
    rf_Height: SmallInt;     // Preferred window size
    rf_Reserved2: array[0..1] of Byte;
    rf_NumArgs: LongInt;     // A-la WB Args, FOR multiselects
    rf_ArgList: PWBArgList;
    rf_UserData: Pointer;    // Applihandle (you may write!!)
    rf_Reserved3: array[0..7] of Byte;
    rf_Pat: STRPTR;          // Pattern match pointer
  end;                       // note - more reserved fields follow

  ASL_Dummy       = TAG_USER + $80000;
  ASL_Hail        = ASL_Dummy + 1;
  ASL_Window      = ASL_Dummy + 2;
  ASL_LeftEdge    = ASL_Dummy + 3;
  ASL_TopEdge     = ASL_Dummy + 4;
  ASL_Width       = ASL_Dummy + 5;
  ASL_Height      = ASL_Dummy + 6;
  ASL_HookFunc    = ASL_Dummy + 7;
  ASL_File        = ASL_Dummy + 8;
  ASL_Dir         = ASL_Dummy + 9;
  ASL_FontName    = ASL_Dummy + 10;
  ASL_FontHeight  = ASL_Dummy + 11;
  ASL_FontStyles  = ASL_Dummy + 12;
  ASL_FontFlags   = ASL_Dummy + 13;
  ASL_FrontPen    = ASL_Dummy + 14;
  ASL_BackPen     = ASL_Dummy + 15;
  ASL_MinHeight   = ASL_Dummy + 16;
  ASL_MaxHeight   = ASL_Dummy + 17;
  ASL_OKText      = ASL_Dummy + 18;
  ASL_CancelText  = ASL_Dummy + 19;
  ASL_FuncFlags   = ASL_Dummy + 20;
  ASL_ModeList    = ASL_Dummy + 21;
  ASL_ExtFlags1   = ASL_Dummy + 22;
  ASL_Pattern     = ASL_FontName;
// remember what I said up there? Do not use these anymore!
  FILB_DOWILDFUNC  = 7;
  FILB_DOMSGFUNC   = 6;
  FILB_SAVE        = 5;
  FILB_NEWIDCMP    = 4;
  FILB_MULTISELECT = 3;
  FILB_PATGAD      = 0;
  FILF_DOWILDFUNC  = 128;
  FILF_DOMSGFUNC   = 64;
  FILF_SAVE        = 32;
  FILF_NEWIDCMP    = 16;
  FILF_MULTISELECT = 8;
  FILF_PATGAD      = 1;
  FIL1B_NOFILES    = 0;
  FIL1B_MATCHDIRS  = 1;
  FIL1F_NOFILES    = 1;
  FIL1F_MATCHDIRS  = 2;
  FONB_FRONTCOLOR  = 0;
  FONB_BACKCOLOR   = 1;
  FONB_STYLES      = 2;
  FONB_DRAWMODE    = 3;
  FONB_FIXEDWIDTH  = 4;
  FONB_NEWIDCMP    = 5;
  FONB_DOMSGFUNC   = 6;
  FONB_DOWILDFUNC  = 7;
  FONF_FRONTCOLOR  = 1;
  FONF_BACKCOLOR   = 2;
  FONF_STYLES      = 4;
  FONF_DRAWMODE    = 8;
  FONF_FIXEDWIDTH  = 16;
  FONF_NEWIDCMP    = 32;
  FONF_DOMSGFUNC   = 64;
  FONF_DOWILDFUNC  = 128;
{$endif ASL_V38_NAMES_ONLY}

var
  ASLBase: PLibrary;

function AllocAslRequest(ReqType: LongWord; TagList: PTagItem): Pointer; syscall ASLBase 8;
function AllocFileRequest: PFileRequester; syscall ASLBase 5;
function AslRequest(Requester: Pointer; TagList: PTagItem): LongBool; syscall ASLBase 10;
procedure FreeAslRequest(Requester: Pointer); syscall ASLBase 9;
procedure FreeFileRequest(FileReq: PFileRequester); syscall ASLBase 6;
function RequestFile(FileReq: PFileRequester): LongBool; syscall ASLBase 7;
procedure AbortAslRequest(Requester: Pointer); syscall ASLBase 13;
procedure ActivateAslRequest(Requester: Pointer); syscall ASLBase 14;

function AllocAslRequestTags(ReqType: LongWord; const Tags: array of PtrUInt): Pointer; inline;
function AslRequestTags(Requester: Pointer; const Tags: array of PtrUInt): LongBool; inline;

implementation

function AllocAslRequestTags(ReqType: LongWord; const Tags: array of PtrUInt): Pointer; inline;
begin
  AllocAslRequestTags := AllocAslRequest(ReqType, @Tags);
end;

function AslRequestTags(Requester: Pointer; const Tags: array of PtrUInt): LongBool; inline;
begin
  AslRequestTags := AslRequest(Requester, @Tags);
end;

initialization
  ASLBase := OpenLibrary(ASLNAME, 36);
finalization
  CloseLibrary(ASLBase);
end.


