Selaa lähdekoodia

MorphOS: Icon and workbench added

git-svn-id: trunk@33224 -
marcus 9 vuotta sitten
vanhempi
commit
eaab964a98

+ 2 - 0
.gitattributes

@@ -5860,6 +5860,7 @@ packages/morphunits/src/exec.pas svneol=native#text/plain
 packages/morphunits/src/gadtools.pas svneol=native#text/pascal
 packages/morphunits/src/get9.pas svneol=native#text/plain
 packages/morphunits/src/hardware.pas svneol=native#text/plain
+packages/morphunits/src/icon.pas svneol=native#text/pascal
 packages/morphunits/src/iffparse.pas svneol=native#text/plain
 packages/morphunits/src/input.pas svneol=native#text/plain
 packages/morphunits/src/inputevent.pas svneol=native#text/plain
@@ -5871,6 +5872,7 @@ packages/morphunits/src/muihelper.pas svneol=native#text/plain
 packages/morphunits/src/timer.pas svneol=native#text/plain
 packages/morphunits/src/tinygl.pas svneol=native#text/plain
 packages/morphunits/src/utility.pas svneol=native#text/plain
+packages/morphunits/src/workbench.pas svneol=native#text/pascal
 packages/mysql/Makefile svneol=native#text/plain
 packages/mysql/Makefile.fpc svneol=native#text/plain
 packages/mysql/Makefile.fpc.fpcmake svneol=native#text/plain

+ 2 - 0
packages/morphunits/fpmake.pp

@@ -57,6 +57,8 @@ begin
     T:=P.Targets.AddUnit('cybergraphics.pas');
     T:=P.Targets.AddUnit('cgxvideo.pas');
     T:=P.Targets.AddUnit('gadtools.pas');
+    T:=P.Targets.AddUnit('workbench.pas');
+    T:=P.Targets.AddUnit('icon.pas');
 
 {$ifndef ALLPACKAGES}
     Run;

+ 470 - 0
packages/morphunits/src/icon.pas

@@ -0,0 +1,470 @@
+{
+    This file is part of the Free Pascal run time library.
+
+    A file in Amiga system run time library.
+    Copyright (c) 1998-2003 by Nils Sjoholm
+    member of the Amiga RTL development team.
+
+    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.
+
+ **********************************************************************}
+{
+    History:
+    Added overlay functions for Pchar->Strings, functions
+    and procedures.
+    14 Jul 2000.
+
+    Removed amigaoverlays, use smartlink instead.
+    05 Nov 2002.
+
+    Added the defines use_amiga_smartlink and
+    use_auto_openlib. Implemented autoopening of
+    the library.
+    14 Jan 2003.
+
+    Update for AmigaOS 3.9.
+    A lof of new const and a record.
+    Functions added.
+         FUNCTION DupDiskObjectA
+         FUNCTION IconControlA
+         PROCEDURE DrawIconStateA
+         FUNCTION GetIconRectangleA
+         FUNCTION NewDiskObject
+         FUNCTION GetIconTagList
+         FUNCTION PutIconTagList
+         FUNCTION LayoutIconA
+         PROCEDURE ChangeToSelectedIconColor
+    plus overlay for
+         FUNCTION GetIconTagList;
+         FUNCTION PutIconTagList
+    Changed start code for unit.
+    02 Feb 2003.
+
+    Changed cardinal > longword.
+    09 Feb 2003.
+
+    [email protected]
+}
+
+unit icon;
+
+INTERFACE
+
+
+uses exec, workbench,utility,amigados,agraphics,intuition,datatypes;
+
+    const
+    ICONA_Dummy = TAG_USER + $9000;
+  {                                                                           }
+  { Error reporting (LONG  )  }
+     ICONA_ErrorCode = ICONA_Dummy + 1;
+
+  { Points to the tag item that caused the error (struct TagItem   ).  }
+     ICONA_ErrorTagItem = ICONA_Dummy + 75;
+  {                                                                           }
+  { Global options for IconControlA()  }
+
+  { Screen to use for remapping Workbench icons to (struct Screen  )  }
+     ICONCTRLA_SetGlobalScreen = ICONA_Dummy + 2;
+     ICONCTRLA_GetGlobalScreen = ICONA_Dummy + 3;
+
+  { Icon color remapping precision; defaults to PRECISION_ICON (LONG)  }
+     ICONCTRLA_SetGlobalPrecision = ICONA_Dummy + 4;
+     ICONCTRLA_GetGlobalPrecision = ICONA_Dummy + 5;
+
+  { Icon frame size dimensions (struct Rectangle  )  }
+     ICONCTRLA_SetGlobalEmbossRect = ICONA_Dummy + 6;
+     ICONCTRLA_GetGlobalEmbossRect = ICONA_Dummy + 7;
+
+  { Render image without frame (BOOL)  }
+     ICONCTRLA_SetGlobalFrameless = ICONA_Dummy + 8;
+     ICONCTRLA_GetGlobalFrameless = ICONA_Dummy + 9;
+
+  { Enable NewIcons support (BOOL)  }
+     ICONCTRLA_SetGlobalNewIconsSupport = ICONA_Dummy + 10;
+     ICONCTRLA_GetGlobalNewIconsSupport = ICONA_Dummy + 11;
+
+  { Enable color icon support (BOOL)  }
+     ICONCTRLA_SetGlobalColorIconSupport = ICONA_Dummy + 77;
+     ICONCTRLA_GetGlobalColorIconSupport = ICONA_Dummy + 78;
+
+  { Set/Get the hook to be called when identifying a file (struct Hook  )  }
+     ICONCTRLA_SetGlobalIdentifyHook = ICONA_Dummy + 12;
+     ICONCTRLA_GetGlobalIdentifyHook = ICONA_Dummy + 13;
+
+  { Set/get the maximum length of a file/drawer name supported
+     by icon.library (LONG).
+    }
+     ICONCTRLA_SetGlobalMaxNameLength = ICONA_Dummy + 67;
+     ICONCTRLA_GetGlobalMaxNameLength = ICONA_Dummy + 68;
+
+  {**************************************************************************}
+  { Per icon local options for IconControlA()  }
+
+  { Get the icon rendering masks (PLANEPTR)  }
+     ICONCTRLA_GetImageMask1 = ICONA_Dummy + 14;
+     ICONCTRLA_GetImageMask2 = ICONA_Dummy + 15;
+
+  { Transparent image color; set to -1 if opaque  }
+     ICONCTRLA_SetTransparentColor1 = ICONA_Dummy + 16;
+     ICONCTRLA_GetTransparentColor1 = ICONA_Dummy + 17;
+     ICONCTRLA_SetTransparentColor2 = ICONA_Dummy + 18;
+     ICONCTRLA_GetTransparentColor2 = ICONA_Dummy + 19;
+
+  { Image color palette (struct ColorRegister  )  }
+     ICONCTRLA_SetPalette1 = ICONA_Dummy + 20;
+     ICONCTRLA_GetPalette1 = ICONA_Dummy + 21;
+     ICONCTRLA_SetPalette2 = ICONA_Dummy + 22;
+     ICONCTRLA_GetPalette2 = ICONA_Dummy + 23;
+
+  { Size of image color palette (LONG)  }
+     ICONCTRLA_SetPaletteSize1 = ICONA_Dummy + 24;
+     ICONCTRLA_GetPaletteSize1 = ICONA_Dummy + 25;
+     ICONCTRLA_SetPaletteSize2 = ICONA_Dummy + 26;
+     ICONCTRLA_GetPaletteSize2 = ICONA_Dummy + 27;
+
+  { Image data; one by per pixel (UBYTE  )  }
+     ICONCTRLA_SetImageData1 = ICONA_Dummy + 28;
+     ICONCTRLA_GetImageData1 = ICONA_Dummy + 29;
+     ICONCTRLA_SetImageData2 = ICONA_Dummy + 30;
+     ICONCTRLA_GetImageData2 = ICONA_Dummy + 31;
+
+  { Render image without frame (BOOL)  }
+     ICONCTRLA_SetFrameless = ICONA_Dummy + 32;
+     ICONCTRLA_GetFrameless = ICONA_Dummy + 33;
+
+  { Enable NewIcons support (BOOL)  }
+     ICONCTRLA_SetNewIconsSupport = ICONA_Dummy + 34;
+     ICONCTRLA_GetNewIconsSupport = ICONA_Dummy + 35;
+
+  { Icon aspect ratio (UBYTE  )  }
+     ICONCTRLA_SetAspectRatio = ICONA_Dummy + 36;
+     ICONCTRLA_GetAspectRatio = ICONA_Dummy + 37;
+
+  { Icon dimensions; valid only for palette mapped icon images (LONG)  }
+     ICONCTRLA_SetWidth = ICONA_Dummy + 38;
+     ICONCTRLA_GetWidth = ICONA_Dummy + 39;
+     ICONCTRLA_SetHeight = ICONA_Dummy + 40;
+     ICONCTRLA_GetHeight = ICONA_Dummy + 41;
+
+  { Check whether the icon is palette mapped (LONG  ).  }
+     ICONCTRLA_IsPaletteMapped = ICONA_Dummy + 42;
+
+  { Get the screen the icon is attached to (struct Screen   ).  }
+     ICONCTRLA_GetScreen = ICONA_Dummy + 43;
+
+  { Check whether the icon has a real select image (LONG  ).  }
+     ICONCTRLA_HasRealImage2 = ICONA_Dummy + 44;
+
+  { Check whether the icon is of the NewIcon type (LONG  ).  }
+     ICONCTRLA_IsNewIcon = ICONA_Dummy + 79;
+
+  { Check whether this icon was allocated by icon.library
+     or if consists solely of a statically allocated
+     struct DiskObject. (LONG  ).
+    }
+     ICONCTRLA_IsNativeIcon = ICONA_Dummy + 80;
+
+  {**************************************************************************}
+
+  { Icon aspect ratio is not known.  }
+     ICON_ASPECT_RATIO_UNKNOWN = 0;
+
+{ Tags for use with GetIconTagList() }
+
+{ Default icon type to retrieve (LONG) }
+     ICONGETA_GetDefaultType    = ICONA_Dummy+45;
+
+{ Retrieve default icon for the given name (STRPTR) }
+       ICONGETA_GetDefaultName = ICONA_Dummy + 46;
+
+    { Return a default icon if the requested icon
+       file cannot be found (BOOL).
+      }
+       ICONGETA_FailIfUnavailable = ICONA_Dummy + 47;
+
+    { If possible, retrieve a palette mapped icon (BOOL).  }
+       ICONGETA_GetPaletteMappedIcon = ICONA_Dummy + 48;
+
+    { Set if the icon returned is a default icon (BOOL  ).  }
+       ICONGETA_IsDefaultIcon = ICONA_Dummy + 49;
+
+    { Remap the icon to the default screen, if possible (BOOL).  }
+       ICONGETA_RemapIcon = ICONA_Dummy + 50;
+
+    { Generate icon image masks (BOOL).  }
+       ICONGETA_GenerateImageMasks = ICONA_Dummy + 51;
+
+    { Label text to be assigned to the icon (STRPTR).  }
+       ICONGETA_Label = ICONA_Dummy + 52;
+
+    { Screen to remap the icon to (struct Screen  ).  }
+       ICONGETA_Screen = ICONA_Dummy + 69;
+
+    {**************************************************************************}
+
+    { Tags for use with PutIconTagList()  }
+
+    { Notify Workbench of the icon being written (BOOL)  }
+       ICONPUTA_NotifyWorkbench = ICONA_Dummy + 53;
+
+    { Store icon as the default for this type (LONG)  }
+       ICONPUTA_PutDefaultType = ICONA_Dummy + 54;
+
+    { Store icon as a default for the given name (STRPTR)  }
+       ICONPUTA_PutDefaultName = ICONA_Dummy + 55;
+
+    { When storing a palette mapped icon, don't save the
+       the original planar icon image with the file. Replace
+       it with a tiny replacement image.
+      }
+       ICONPUTA_DropPlanarIconImage = ICONA_Dummy + 56;
+
+    { Don't write the chunky icon image data to disk.  }
+       ICONPUTA_DropChunkyIconImage = ICONA_Dummy + 57;
+
+    { Don't write the NewIcons tool types to disk.  }
+       ICONPUTA_DropNewIconToolTypes = ICONA_Dummy + 58;
+
+    { If this tag is enabled, the writer will examine the
+       icon image data to find out whether it can compress
+       it more efficiently. This may take extra time and
+       is not generally recommended.
+      }
+       ICONPUTA_OptimizeImageSpace = ICONA_Dummy + 59;
+
+    { Don't write the entire icon file back to disk,
+       only change the do->do_CurrentX/do->do_CurrentY
+       members.
+      }
+       ICONPUTA_OnlyUpdatePosition = ICONA_Dummy + 72;
+
+    { Before writing a palette mapped icon back to disk,
+       icon.library will make sure that the original
+       planar image data is stored in the file. If you
+       don't want that to happen, set this option to
+       FALSE. This will allow you to change the planar icon
+       image data written back to disk.
+      }
+      ICONPUTA_PreserveOldIconImages = ICONA_Dummy + 84;
+
+{**************************************************************************}
+
+{ For use with the file identification hook. }
+
+          type
+       PIconIdentifyMsg = ^tIconIdentifyMsg;
+       tIconIdentifyMsg = record
+            { Libraries that are already opened for your use. }
+            iim_SysBase : PLibrary;
+            iim_DOSBase : PLibrary;
+            iim_UtilityBase : PLibrary;
+            iim_IconBase : PLibrary;
+
+            { File context information. }
+            iim_FileLock : BPTR;           { Lock on the object to return an icon for. }
+            iim_ParentLock : BPTR;         { Lock on the object's parent directory, if available. }
+            iim_FIB : PFileInfoBlock;      { Already initialized for you. }
+            iim_FileHandle : BPTR;         { If non-NULL, pointer to the file to examine,
+                                                 * positioned right at the first byte, ready
+                                                 * for you to use.
+                                                 }
+            iim_Tags : PTagItem;           { Tags passed to GetIconTagList(). }
+         end;
+
+{**************************************************************************}
+
+    { Tags for use with DupDiskObjectA()  }
+
+    const
+    { Duplicate do_DrawerData  }
+       ICONDUPA_DuplicateDrawerData = ICONA_Dummy + 60;
+
+    { Duplicate the Image structures.  }
+       ICONDUPA_DuplicateImages = ICONA_Dummy + 61;
+
+    { Duplicate the image data (Image->ImageData) itself.  }
+       ICONDUPA_DuplicateImageData = ICONA_Dummy + 62;
+
+    { Duplicate the default tool.  }
+       ICONDUPA_DuplicateDefaultTool = ICONA_Dummy + 63;
+
+    { Duplicate the tool types list.  }
+       ICONDUPA_DuplicateToolTypes = ICONA_Dummy + 64;
+
+    { Duplicate the tool window.  }
+       ICONDUPA_DuplicateToolWindow = ICONA_Dummy + 65;
+
+    { If the icon to be duplicated is in fact a palette mapped
+       icon which has never been set up to be displayed on the
+       screen, turn the duplicate into that palette mapped icon.
+      }
+       ICONDUPA_ActivateImageData = ICONA_Dummy + 82;
+
+{**************************************************************************}
+
+    { Tags for use with DrawIconStateA() and GetIconRectangleA().  }
+
+    { Drawing information to use (struct DrawInfo  ).  }
+       ICONDRAWA_DrawInfo = ICONA_Dummy + 66;
+
+    { Draw the icon without the surrounding frame (BOOL).  }
+       ICONDRAWA_Frameless = ICONA_Dummy + 70;
+
+    { Erase the background before drawing a frameless icon (BOOL).  }
+       ICONDRAWA_EraseBackground = ICONA_Dummy + 71;
+
+    { Draw the icon without the surrounding border and frame (BOOL).  }
+       ICONDRAWA_Borderless = ICONA_Dummy + 83;
+
+    { The icon to be drawn refers to a linked object (BOOL).  }
+       ICONDRAWA_IsLink = ICONA_Dummy + 89;
+
+{**************************************************************************}
+
+    { Reserved tags; don't use!  }
+       ICONA_Reserved1 = ICONA_Dummy + 73;
+       ICONA_Reserved2 = ICONA_Dummy + 74;
+       ICONA_Reserved3 = ICONA_Dummy + 76;
+       ICONA_Reserved4 = ICONA_Dummy + 81;
+       ICONA_Reserved5 = ICONA_Dummy + 85;
+       ICONA_Reserved6 = ICONA_Dummy + 86;
+       ICONA_Reserved7 = ICONA_Dummy + 87;
+       ICONA_Reserved8 = ICONA_Dummy + 88;
+    {                                                                           }
+       ICONA_LAST_TAG = ICONA_Dummy + 89;
+
+{**************************************************************************}
+
+
+Const
+
+    ICONNAME    : PChar = 'icon.library';
+
+VAR IconBase : pLibrary = nil;
+
+FUNCTION AddFreeList(freelist : pFreeList location 'a0'; const mem : POINTER location 'a1'; size : ULONG location 'a2') : LongBool; syscall IconBase 072;
+FUNCTION BumpRevision(newname : pCHAR location 'a0'; const oldname : pCHAR location 'a1') : pCHAR; syscall IconBase 108;
+FUNCTION DeleteDiskObject(const name : pCHAR location 'a0') : LongBool; syscall IconBase 138;
+FUNCTION FindToolType(const toolTypeArray : POINTER location 'a0'; const typeName : pCHAR location 'a1') : pCHAR; syscall IconBase 096;
+PROCEDURE FreeDiskObject(diskobj : pDiskObject location 'a0'); syscall IconBase 090;
+PROCEDURE FreeFreeList(freelist : pFreeList location 'a0'); syscall IconBase 054;
+FUNCTION GetDefDiskObject(typ : LONGINT location 'd0') : pDiskObject; syscall IconBase 120;
+FUNCTION GetDiskObject(const name : pCHAR location 'a0') : pDiskObject; syscall IconBase 078;
+FUNCTION GetDiskObjectNew(const name : pCHAR location 'a0') : pDiskObject; syscall IconBase 132;
+FUNCTION MatchToolValue(const typeString : pCHAR location 'a0'; const value : pCHAR location 'a1') : LongBool; syscall IconBase 102;
+FUNCTION PutDefDiskObject(const diskObject : pDiskObject location 'a0') : LongBool; syscall IconBase 126;
+FUNCTION PutDiskObject(const name : pCHAR location 'a0'; const diskobj : pDiskObject location 'a1') : LongBool; syscall IconBase 084;
+
+{ version 44 }
+FUNCTION DupDiskObjectA(CONST diskObject : pDiskObject location 'a0'; CONST tags : pTagItem location 'a1') : pDiskObject; syscall IconBase 150;
+FUNCTION IconControlA(icon : pDiskObject location 'a0'; CONST tags : pTagItem location 'a1') : longword; syscall IconBase 156;
+PROCEDURE DrawIconStateA(rp : pRastPort location 'a0'; CONST icon : pDiskObject location 'a1'; CONST label_ : pCHAR location 'a2'; leftOffset : LONGINT location 'd0'; topOffset : LONGINT location 'd1'; state : longword location 'd2'; CONST tags : pTagItem location 'a3'); syscall IconBase 162;
+FUNCTION GetIconRectangleA(rp : pRastPort location 'a0'; CONST icon : pDiskObject location 'a1'; CONST label_ : pCHAR location 'a2'; rect : pRectangle location 'a3'; CONST tags : pTagItem location 'a4') : LongBool; syscall IconBase 168;
+FUNCTION NewDiskObject(type_ : LONGINT location 'd0') : pDiskObject; syscall IconBase 174;
+FUNCTION GetIconTagList(CONST name : pCHAR location 'a0'; CONST tags : pTagItem location 'a1') : pDiskObject; syscall IconBase 180;
+FUNCTION PutIconTagList(CONST name : pCHAR location 'a0'; CONST icon : pDiskObject location 'a1'; CONST tags : pTagItem location 'a2') : LongBool; syscall IconBase 186;
+FUNCTION LayoutIconA(icon : pDiskObject location 'a0'; screen : pScreen location 'a1'; tags : pTagItem location 'a2') : LongBool; syscall IconBase 192;
+PROCEDURE ChangeToSelectedIconColor(cr : pColorRegister location 'a0'); syscall IconBase 198;
+
+{ overlay }
+FUNCTION BumpRevision(newname : pCHar; const oldname : RawByteString) : pCHAR;
+FUNCTION DeleteDiskObject(const name : RawByteString) : BOOLEAN;
+FUNCTION FindToolType(const toolTypeArray : POINTER;const typeName : RawByteString) : pCHAR;
+FUNCTION GetDiskObject(const name : RawByteString) : pDiskObject;
+FUNCTION GetDiskObjectNew(const name : RawByteString) : pDiskObject;
+FUNCTION MatchToolValue(const typeString : RawByteString;const value : pCHAR) : BOOLEAN;
+FUNCTION MatchToolValue(const typeString : pCHAR;const value : RawByteString) : BOOLEAN;
+FUNCTION MatchToolValue(const typeString : RawByteString;const value : RawByteString) : BOOLEAN;
+FUNCTION PutDiskObject(const name : RawByteString;const diskobj : pDiskObject) : BOOLEAN;
+
+{ version 44 overlay}
+FUNCTION GetIconTagList(CONST name : RawByteString; CONST tags : pTagItem) : pDiskObject;
+FUNCTION PutIconTagList(CONST name : RawByteString; CONST icon : pDiskObject; CONST tags : pTagItem) : BOOLEAN;
+
+{macros}
+function PACK_ICON_ASPECT_RATIO(num,den : longint) : longint;
+
+IMPLEMENTATION
+
+function PACK_ICON_ASPECT_RATIO(num,den : longint) : longint;
+begin
+    PACK_ICON_ASPECT_RATIO:=(num shl 4) or den;
+end;
+
+
+FUNCTION BumpRevision(newname : pCHar;const oldname : RawByteString) : pCHAR;
+begin
+      BumpRevision := BumpRevision(newname,PChar(oldname));
+end;
+
+FUNCTION DeleteDiskObject(const name : RawByteString) : BOOLEAN;
+begin
+      DeleteDiskObject := DeleteDiskObject(PChar(name));
+end;
+
+FUNCTION FindToolType(const toolTypeArray : POINTER;const typeName : RawByteString) : pCHAR;
+begin
+      FindToolType := FindToolType(toolTypeArray,PChar(typeName));
+end;
+
+FUNCTION GetDiskObject(const name : RawByteString) : pDiskObject;
+begin
+      GetDiskObject := GetDiskObject(PChar(name));
+end;
+
+FUNCTION GetDiskObjectNew(const name : RawByteString) : pDiskObject;
+begin
+      GetDiskObjectNew := GetDiskObjectNew(PChar(name));
+end;
+
+FUNCTION MatchToolValue(const typeString : RawByteString;const value : pCHAR) : BOOLEAN;
+begin
+       MatchToolValue := MatchToolValue(PChar(typeString),value);
+end;
+
+FUNCTION MatchToolValue(const typeString : pCHAR;const value : RawByteString) : BOOLEAN;
+begin
+       MatchToolValue := MatchToolValue(typeString,PChar(value));
+end;
+
+FUNCTION MatchToolValue(const typeString : RawByteString;const value : RawByteString) : BOOLEAN;
+begin
+       MatchToolValue := MatchToolValue(PChar(typeString),PChar(value));
+end;
+
+FUNCTION PutDiskObject(const name : RawByteString;const diskobj : pDiskObject) : BOOLEAN;
+begin
+       PutDiskObject := PutDiskObject(PChar(name),diskobj);
+end;
+
+FUNCTION GetIconTagList(CONST name : RawByteString; CONST tags : pTagItem) : pDiskObject;
+begin
+       GetIconTagList := GetIconTagList(PChar(name),tags);
+end;
+
+FUNCTION PutIconTagList(CONST name : RawByteString; CONST icon : pDiskObject; CONST tags : pTagItem) : BOOLEAN;
+begin
+       PutIconTagList := PutIconTagList(PChar(name),icon,tags);
+end;
+
+const
+    { Change VERSION and LIBVERSION to proper values }
+    VERSION : string[2] = '0';
+    LIBVERSION : longword = 0;
+
+initialization
+  IconBase := OpenLibrary(ICONNAME,LIBVERSION);
+finalization
+  if Assigned(IconBase) then
+    CloseLibrary(IconBase);
+END. (* UNIT ICON *)
+
+
+
+

+ 945 - 0
packages/morphunits/src/workbench.pas

@@ -0,0 +1,945 @@
+{
+    This file is part of the Free Pascal run time library.
+
+    A file in Amiga system run time library.
+    Copyright (c) 1998-2003 by Nils Sjoholm
+    member of the Amiga RTL development team.
+
+    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.
+
+ **********************************************************************}
+{
+    History:
+    Added overlay functions for Pchar->Strings, functions
+    and procedures.
+    14 Jul 2000.
+
+    Changed tWBArg.wa_Lock from a pointer to a longint.
+    15 Aug 2000.
+
+    Fixed tDiskObject.
+    Member tDiskObject.do_CurrentX was defined as a pointer,
+    should be longint.
+    17 Aug 2000.
+
+    Added functions and procedures with array of const.
+    For use with fpc 1.0.7. Thay are in systemvartags.
+    05 Nov 2002.
+
+    Removed amigaoverlays, use smartlink instead.
+    05 Nov 2002.
+
+    Added the defines use_amiga_smartlink and
+    use_auto_openlib. Implemented autoopening of
+    the library.
+    14 Jan 2003.
+
+    Update for AmigaOS 3.9.
+    A lot of new const and new records.
+    New functions
+            FUNCTION AddAppWindowDropZoneA
+            FUNCTION ChangeWorkbenchSelectionA
+            FUNCTION CloseWorkbenchObjectA
+            FUNCTION MakeWorkbenchObjectVisibleA
+            FUNCTION OpenWorkbenchObjectA
+            FUNCTION RemoveAppWindowDropZone
+            FUNCTION WorkbenchControlA
+    Varargs functions are in systemvartags.
+    02 Feb 2003.
+
+    Changed integer > smallint,
+            cardinal > longword.
+    09 Feb 2003.
+
+    [email protected]
+}
+{$PACKRECORDS 2}
+
+unit workbench;
+
+INTERFACE
+
+uses exec,amigados,utility,intuition,agraphics;
+
+
+Type
+
+    pWBArg = ^tWBArg;
+    tWBArg = record
+        wa_Lock         : longint;      { a lock descriptor }
+        wa_Name         : STRPTR;       { a string relative to that lock }
+    end;
+
+    WBArgList = Array [1..100] of tWBArg; { Only 1..smNumArgs are valid }
+    pWBArgList = ^WBArgList;
+
+
+    pWBStartup = ^tWBStartup;
+    tWBStartup = record
+        sm_Message      : tMessage;      { a standard message structure }
+        sm_Process      : pMsgPort;   { the process descriptor for you }
+        sm_Segment      : BPTR;         { a descriptor for your code }
+        sm_NumArgs      : Longint;      { the number of elements in ArgList }
+        sm_ToolWindow   : STRPTR;       { description of window }
+        sm_ArgList      : pWBArgList; { the arguments themselves }
+    end;
+
+
+Const
+
+    WBDISK              = 1;
+    WBDRAWER            = 2;
+    WBTOOL              = 3;
+    WBPROJECT           = 4;
+    WBGARBAGE           = 5;
+    WBDEVICE            = 6;
+    WBKICK              = 7;
+    WBAPPICON           = 8;
+
+Type
+
+    pOldDrawerData = ^tOldDrawerData;
+    tOldDrawerData = record
+        dd_NewWindow    : tNewWindow;    { args to open window }
+        dd_CurrentX     : Longint;      { current x coordinate of origin }
+        dd_CurrentY     : Longint;      { current y coordinate of origin }
+    end;
+
+Const
+
+{ the amount of DrawerData actually written to disk }
+
+    OLDDRAWERDATAFILESIZE  = 56;  { sizeof(OldDrawerData) }
+
+Type
+    pDrawerData = ^tDrawerData;
+    tDrawerData = record
+        dd_NewWindow    : tNewWindow;    { args to open window }
+        dd_CurrentX     : Longint;      { current x coordinate of origin }
+        dd_CurrentY     : Longint;      { current y coordinate of origin }
+        dd_Flags        : Longint;      { flags for drawer }
+        dd_ViewModes    : Word;        { view mode for drawer }
+    end;
+
+Const
+
+{ the amount of DrawerData actually written to disk }
+
+    DRAWERDATAFILESIZE  = 62;  { sizeof(DrawerData) }
+
+       DDVM_BYDEFAULT = 0;
+    { view as icons  }
+       DDVM_BYICON = 1;
+    { view as text, sorted by name  }
+       DDVM_BYNAME = 2;
+    { view as text, sorted by date  }
+       DDVM_BYDATE = 3;
+    { view as text, sorted by size  }
+       DDVM_BYSIZE = 4;
+    { view as text, sorted by type  }
+       DDVM_BYTYPE = 5;
+
+    { definitions for dd_Flags  }
+    { default (show only icons)  }
+       DDFLAGS_SHOWDEFAULT = 0;
+    { show only icons  }
+       DDFLAGS_SHOWICONS = 1;
+    { show all files  }
+       DDFLAGS_SHOWALL = 2;
+
+Type
+
+    pDiskObject = ^tDiskObject;
+    tDiskObject = record
+        do_Magic        : Word;        { a magic number at the start of the file }
+        do_Version      : Word;        { a version number, so we can change it }
+        do_Gadget       : tGadget;       { a copy of in core gadget }
+        do_Type         : Byte;
+        do_DefaultTool  : STRPTR;
+        do_ToolTypes    : Pointer;
+        do_CurrentX     : Longint;
+        do_CurrentY     : Longint;
+        do_DrawerData   : pDrawerData;
+        do_ToolWindow   : STRPTR;       { only applies to tools }
+        do_StackSize    : Longint;      { only applies to tools }
+    end;
+
+Const
+
+    WB_DISKMAGIC        = $e310;        { a magic number, not easily impersonated }
+    WB_DISKVERSION      = 1;            { our current version number }
+    WB_DISKREVISION     = 1;            { our current revision number }
+  {I only use the lower 8 bits of Gadget.UserData for the revision # }
+    WB_DISKREVISIONMASK = 255;
+Type
+    pFreeList = ^tFreeList;
+    tFreeList = record
+        fl_NumFree      : smallint;
+        fl_MemList      : tList;
+    end;
+
+Const
+
+{ each message that comes into the WorkBenchPort must have a type field
+ * in the preceeding short.  These are the defines for this type
+ }
+
+    MTYPE_PSTD          = 1;    { a "standard Potion" message }
+    MTYPE_TOOLEXIT      = 2;    { exit message from our tools }
+    MTYPE_DISKCHANGE    = 3;    { dos telling us of a disk change }
+    MTYPE_TIMER         = 4;    { we got a timer tick }
+    MTYPE_CLOSEDOWN     = 5;    { <unimplemented> }
+    MTYPE_IOPROC        = 6;    { <unimplemented> }
+    MTYPE_APPWINDOW     = 7;    {     msg from an app window }
+    MTYPE_APPICON       = 8;    {     msg from an app icon }
+    MTYPE_APPMENUITEM   = 9;    {     msg from an app menuitem }
+    MTYPE_COPYEXIT      = 10;   {     exit msg from copy process }
+    MTYPE_ICONPUT       = 11;   {     msg from PutDiskObject in icon.library }
+
+
+{ workbench does different complement modes for its gadgets.
+ * It supports separate images, complement mode, and backfill mode.
+ * The first two are identical to intuitions GADGIMAGE and GADGHCOMP.
+ * backfill is similar to GADGHCOMP, but the region outside of the
+ * image (which normally would be color three when complemented)
+ * is flood-filled to color zero.
+ }
+
+    GFLG_GADGBACKFILL   = $0001;
+    GADGBACKFILL        = $0001;   { an old synonym }
+
+{ if an icon does not really live anywhere, set its current position
+ * to here
+ }
+
+    NO_ICON_POSITION    = $80000000;
+
+{    If you find am_Version >= AM_VERSION, you know this structure has
+ * at least the fields defined in this version of the include file
+ }
+ AM_VERSION   =   1;
+
+Type
+   pAppMessage = ^tAppMessage;
+   tAppMessage = record
+    am_Message       : tMessage;            {    standard message structure }
+    am_Type          : Word;              {    message type }
+    am_UserData      : ULONG;            {    application specific }
+    am_ID            : ULONG;            {    application definable ID }
+    am_NumArgs       : ULONG;            {    # of elements in arglist }
+    am_ArgList       : pWBArgList;       {    the arguements themselves }
+    am_Version       : Word;              {    will be AM_VERSION }
+    am_Class         : Word;              {    message class }
+    am_MouseX        : smallint;              {    mouse x position of event }
+    am_MouseY        : smallint;              {    mouse y position of event }
+    am_Seconds       : ULONG;            {    current system clock time }
+    am_Micros        : ULONG;            {    current system clock time }
+    am_Reserved      : Array[0..7] of ULONG;       {    avoid recompilation }
+   END;
+
+{* types of app messages *}
+const
+    AMTYPE_APPWINDOW   = 7;    {* app window message    *}
+    AMTYPE_APPICON     = 8;    {* app icon message  *}
+    AMTYPE_APPMENUITEM = 9;    {* app menu item message *}
+
+  { Classes of AppIcon messages (V44)  }
+    { The "Open" menu item was invoked,
+                                           the icon got double-clicked or an
+                                           icon got dropped on it.
+                                          }
+       AMCLASSICON_Open = 0;
+    { The "Copy" menu item was invoked  }
+       AMCLASSICON_Copy = 1;
+    { The "Rename" menu item was invoked  }
+       AMCLASSICON_Rename = 2;
+    { The "Information" menu item was invoked  }
+       AMCLASSICON_Information = 3;
+    { The "Snapshot" menu item was invoked  }
+       AMCLASSICON_Snapshot = 4;
+    { The "UnSnapshot" menu item was invoked  }
+       AMCLASSICON_UnSnapshot = 5;
+    { The "Leave Out" menu item was invoked  }
+       AMCLASSICON_LeaveOut = 6;
+    { The "Put Away" menu item was invoked  }
+       AMCLASSICON_PutAway = 7;
+    { The "Delete" menu item was invoked  }
+       AMCLASSICON_Delete = 8;
+    { The "Format Disk" menu item was invoked  }
+       AMCLASSICON_FormatDisk = 9;
+    { The "Empty Trash" menu item was invoked  }
+       AMCLASSICON_EmptyTrash = 10;
+    { The icon is now selected  }
+       AMCLASSICON_Selected = 11;
+    { The icon is now unselected  }
+       AMCLASSICON_Unselected = 12;
+
+{
+ * The following structures are private.  These are just stub
+ * structures for code compatibility...
+ }
+type
+
+ tAppWindow = record
+   aw_PRIVATE : Pointer;
+ END;
+ pAppWindow = ^tAppWindow;
+
+ tAppIcon = record
+   ai_PRIVATE : Pointer;
+ END;
+ pAppIcon = ^tAppIcon;
+
+ tAppMenuItem = record
+   ami_PRIVATE : Pointer;
+ END;
+ pAppMenuItem = ^tAppMenuItem;
+
+ PAppWindowDropZone = ^tAppWindowDropZone;
+       tAppWindowDropZone = record
+            awdz_PRIVATE : pointer;
+         end;
+
+ PAppMenu = ^tAppMenu;
+       tAppMenu = record
+            am_PRIVATE : pointer;
+         end;
+
+   const
+       WBA_Dummy = TAG_USER + $A000;
+    {                                                                           }
+    { Tags for use with AddAppIconA()  }
+    { AppIcon responds to the "Open" menu item (BOOL).  }
+       WBAPPICONA_SupportsOpen = WBA_Dummy + 1;
+
+    { AppIcon responds to the "Copy" menu item (BOOL).  }
+       WBAPPICONA_SupportsCopy = WBA_Dummy + 2;
+
+    { AppIcon responds to the "Rename" menu item (BOOL).  }
+       WBAPPICONA_SupportsRename = WBA_Dummy + 3;
+
+    { AppIcon responds to the "Information" menu item (BOOL).  }
+       WBAPPICONA_SupportsInformation = WBA_Dummy + 4;
+
+    { AppIcon responds to the "Snapshot" menu item (BOOL).  }
+       WBAPPICONA_SupportsSnapshot = WBA_Dummy + 5;
+
+    { AppIcon responds to the "UnSnapshot" menu item (BOOL).  }
+       WBAPPICONA_SupportsUnSnapshot = WBA_Dummy + 6;
+
+    { AppIcon responds to the "LeaveOut" menu item (BOOL).  }
+       WBAPPICONA_SupportsLeaveOut = WBA_Dummy + 7;
+
+    { AppIcon responds to the "PutAway" menu item (BOOL).  }
+       WBAPPICONA_SupportsPutAway = WBA_Dummy + 8;
+
+    { AppIcon responds to the "Delete" menu item (BOOL).  }
+       WBAPPICONA_SupportsDelete = WBA_Dummy + 9;
+
+    { AppIcon responds to the "FormatDisk" menu item (BOOL).  }
+       WBAPPICONA_SupportsFormatDisk = WBA_Dummy + 10;
+
+    { AppIcon responds to the "EmptyTrash" menu item (BOOL).  }
+       WBAPPICONA_SupportsEmptyTrash = WBA_Dummy + 11;
+
+    { AppIcon position should be propagated back to original DiskObject (BOOL).  }
+       WBAPPICONA_PropagatePosition = WBA_Dummy + 12;
+
+    { Callback hook to be invoked when rendering this icon (struct Hook  ).  }
+       WBAPPICONA_RenderHook = WBA_Dummy + 13;
+
+    { AppIcon wants to be notified when its select state changes (BOOL).  }
+       WBAPPICONA_NotifySelectState = WBA_Dummy + 14;
+
+   {**************************************************************************}
+
+    { Tags for use with AddAppMenuA()  }
+    { Command key string for this AppMenu (STRPTR).  }
+       WBAPPMENUA_CommandKeyString = WBA_Dummy + 15;
+    { Item to be added should get sub menu items attached to; make room for it,
+       then return the key to use later for attaching the items (ULONG  ).
+      }
+       WBAPPMENUA_GetKey = WBA_Dummy + 65;
+    { This item should be attached to a sub menu; the key provided refers to
+       the sub menu it should be attached to (ULONG).
+      }
+       WBAPPMENUA_UseKey = WBA_Dummy + 66;
+    { Item to be added is in fact a new menu title; make room for it, then
+       return the key to use later for attaching the items (ULONG  ).
+      }
+       WBAPPMENUA_GetTitleKey = WBA_Dummy + 77;
+
+    {**************************************************************************}
+
+    { Tags for use with OpenWorkbenchObjectA()  }
+    { Corresponds to the wa_Lock member of a struct WBArg  }
+       WBOPENA_ArgLock = WBA_Dummy + 16;
+
+    { Corresponds to the wa_Name member of a struct WBArg  }
+       WBOPENA_ArgName = WBA_Dummy + 17;
+
+    { When opening a drawer, show all files or only icons?
+       This must be one out of DDFLAGS_SHOWICONS,
+       or DDFLAGS_SHOWALL; (UBYTE); (V45)
+      }
+       WBOPENA_Show = WBA_Dummy + 75;
+
+    { When opening a drawer, view the contents by icon, name,
+       date, size or type? This must be one out of DDVM_BYICON,
+       DDVM_BYNAME, DDVM_BYDATE, DDVM_BYSIZE or DDVM_BYTYPE;
+       (UBYTE); (V45)
+      }
+       WBOPENA_ViewBy = WBA_Dummy + 76;
+
+   {**************************************************************************}
+
+    { Tags for use with WorkbenchControlA()  }
+    { Check if the named drawer is currently open (LONG  ).  }
+       WBCTRLA_IsOpen = WBA_Dummy + 18;
+
+    { Create a duplicate of the Workbench private search path list (BPTR  ).  }
+       WBCTRLA_DuplicateSearchPath = WBA_Dummy + 19;
+
+    { Free the duplicated search path list (BPTR).  }
+       WBCTRLA_FreeSearchPath = WBA_Dummy + 20;
+
+    { Get the default stack size for launching programs with (ULONG  ).  }
+       WBCTRLA_GetDefaultStackSize = WBA_Dummy + 21;
+
+    { Set the default stack size for launching programs with (ULONG).  }
+       WBCTRLA_SetDefaultStackSize = WBA_Dummy + 22;
+
+    { Cause an AppIcon to be redrawn (struct AppIcon  ).  }
+       WBCTRLA_RedrawAppIcon = WBA_Dummy + 23;
+
+    { Get a list of currently running Workbench programs (struct List   ).  }
+       WBCTRLA_GetProgramList = WBA_Dummy + 24;
+
+    { Release the list of currently running Workbench programs (struct List  ).  }
+       WBCTRLA_FreeProgramList = WBA_Dummy + 25;
+
+    { Get a list of currently selected icons (struct List   ).  }
+       WBCTRLA_GetSelectedIconList = WBA_Dummy + 36;
+
+    { Release the list of currently selected icons (struct List  ).  }
+       WBCTRLA_FreeSelectedIconList = WBA_Dummy + 37;
+
+    { Get a list of currently open drawers (struct List   ).  }
+       WBCTRLA_GetOpenDrawerList = WBA_Dummy + 38;
+
+    { Release the list of currently open icons (struct List  ).  }
+       WBCTRLA_FreeOpenDrawerList = WBA_Dummy + 39;
+
+    { Get the list of hidden devices (struct List   ).  }
+       WBCTRLA_GetHiddenDeviceList = WBA_Dummy + 42;
+
+    { Release the list of hidden devices (struct List  ).  }
+       WBCTRLA_FreeHiddenDeviceList = WBA_Dummy + 43;
+
+    { Add the name of a device which Workbench should never try to
+       read a disk icon from (STRPTR).
+      }
+       WBCTRLA_AddHiddenDeviceName = WBA_Dummy + 44;
+
+    { Remove a name from list of hidden devices (STRPTR).  }
+       WBCTRLA_RemoveHiddenDeviceName = WBA_Dummy + 45;
+
+    { Get the number of seconds that have to pass before typing
+       the next character in a drawer window will restart
+       with a new file name (ULONG  ).
+      }
+       WBCTRLA_GetTypeRestartTime = WBA_Dummy + 47;
+
+    { Set the number of seconds that have to pass before typing
+       the next character in a drawer window will restart
+       with a new file name (ULONG).
+      }
+       WBCTRLA_SetTypeRestartTime = WBA_Dummy + 48;
+
+    { Obtain the hook that will be invoked when Workbench starts
+       to copy files and data (struct Hook   ); (V45)
+      }
+       WBCTRLA_GetCopyHook = WBA_Dummy + 69;
+
+    { Install the hook that will be invoked when Workbench starts
+       to copy files and data (struct Hook  ); (V45)
+      }
+       WBCTRLA_SetCopyHook = WBA_Dummy + 70;
+
+    { Obtain the hook that will be invoked when Workbench discards
+       files and drawers or empties the trashcan (struct Hook   );
+       (V45).
+      }
+       WBCTRLA_GetDeleteHook = WBA_Dummy + 71;
+
+    { Install the hook that will be invoked when Workbench discards
+       files and drawers or empties the trashcan (struct Hook  );
+       (V45).
+      }
+       WBCTRLA_SetDeleteHook = WBA_Dummy + 72;
+
+    { Obtain the hook that will be invoked when Workbench requests
+       that the user enters text, such as when a file is to be renamed
+       or a new drawer is to be created (struct Hook   ); (V45)
+      }
+       WBCTRLA_GetTextInputHook = WBA_Dummy + 73;
+
+    { Install the hook that will be invoked when Workbench requests
+       that the user enters text, such as when a file is to be renamed
+       or a new drawer is to be created (struct Hook  ); (V45)
+      }
+       WBCTRLA_SetTextInputHook = WBA_Dummy + 74;
+
+    { Add a hook that will be invoked when Workbench is about
+       to shut down (cleanup), and when Workbench has returned
+       to operational state (setup) (struct Hook  ); (V45)
+      }
+       WBCTRLA_AddSetupCleanupHook = WBA_Dummy + 78;
+
+    { Remove a hook that has been installed with the
+       WBCTRLA_AddSetupCleanupHook tag (struct Hook  ); (V45)
+      }
+       WBCTRLA_RemSetupCleanupHook = WBA_Dummy + 79;
+
+       {**************************************************************************}
+
+{ The message your setup/cleanup hook gets invoked with. }
+       type
+       PSetupCleanupHookMsg = ^tSetupCleanupHookMsg;
+       tSetupCleanupHookMsg = record
+            schm_Length : ULONG;
+            schm_State : LONG;
+         end;
+
+      const
+    { Workbench will attempt to shut down now.  }
+       SCHMSTATE_TryCleanup = 0;
+    { Workbench will really shut down now.  }
+       SCHMSTATE_Cleanup = 1;
+    { Workbench is operational again or
+       could not be shut down.
+    }
+       SCHMSTATE_Setup = 2;
+
+{**************************************************************************}
+
+    { Tags for use with AddAppWindowDropZoneA()  }
+    { Zone left edge (WORD)  }
+       WBDZA_Left = WBA_Dummy + 26;
+
+    { Zone left edge, if relative to the right edge of the window (WORD)  }
+       WBDZA_RelRight = WBA_Dummy + 27;
+
+    { Zone top edge (WORD)  }
+       WBDZA_Top = WBA_Dummy + 28;
+
+    { Zone top edge, if relative to the bottom edge of the window (WORD)  }
+       WBDZA_RelBottom = WBA_Dummy + 29;
+
+    { Zone width (WORD)  }
+       WBDZA_Width = WBA_Dummy + 30;
+
+    { Zone width, if relative to the window width (WORD)  }
+       WBDZA_RelWidth = WBA_Dummy + 31;
+
+    { Zone height (WORD)  }
+       WBDZA_Height = WBA_Dummy + 32;
+
+    { Zone height, if relative to the window height (WORD)  }
+       WBDZA_RelHeight = WBA_Dummy + 33;
+
+    { Zone position and size (struct IBox  ).  }
+       WBDZA_Box = WBA_Dummy + 34;
+
+    { Hook to invoke when the mouse enters or leave a drop zone (struct Hook  ).  }
+       WBDZA_Hook = WBA_Dummy + 35;
+
+{**************************************************************************}
+
+    { Reserved tags; don't use!  }
+       WBA_Reserved1 = WBA_Dummy + 40;
+       WBA_Reserved2 = WBA_Dummy + 41;
+       WBA_Reserved3 = WBA_Dummy + 46;
+       WBA_Reserved4 = WBA_Dummy + 49;
+       WBA_Reserved5 = WBA_Dummy + 50;
+       WBA_Reserved6 = WBA_Dummy + 51;
+       WBA_Reserved7 = WBA_Dummy + 52;
+       WBA_Reserved8 = WBA_Dummy + 53;
+       WBA_Reserved9 = WBA_Dummy + 54;
+       WBA_Reserved10 = WBA_Dummy + 55;
+       WBA_Reserved11 = WBA_Dummy + 56;
+       WBA_Reserved12 = WBA_Dummy + 57;
+       WBA_Reserved13 = WBA_Dummy + 58;
+       WBA_Reserved14 = WBA_Dummy + 59;
+       WBA_Reserved15 = WBA_Dummy + 60;
+       WBA_Reserved16 = WBA_Dummy + 61;
+       WBA_Reserved17 = WBA_Dummy + 62;
+       WBA_Reserved18 = WBA_Dummy + 63;
+       WBA_Reserved19 = WBA_Dummy + 64;
+       WBA_Reserved20 = WBA_Dummy + 67;
+       WBA_Reserved21 = WBA_Dummy + 68;
+
+{**************************************************************************}
+
+       WBA_LAST_TAG = WBA_Dummy + 79;
+
+{**************************************************************************}
+
+{ The message your AppIcon rendering hook gets invoked with. }
+   type
+       PAppIconRenderMsg = ^tAppIconRenderMsg;
+       tAppIconRenderMsg = record
+            arm_RastPort : PRastPort;  { RastPort to render into }
+            arm_Icon : PDiskObject;    { The icon to be rendered }
+            arm_Label : STRPTR;        { The icon label txt }
+            arm_Tags : PTagItem;       { Further tags to be passed on
+                                                 * to DrawIconStateA().
+                                                 }
+            arm_Left : WORD;           { \ Rendering origin, not taking the }
+            arm_Top : WORD;            { / button border into account. }
+            arm_Width : WORD;          { \ Limit your rendering to }
+            arm_Height : WORD;         { / this area. }
+            arm_State : ULONG;         { IDS_SELECTED, IDS_NORMAL, etc. }
+         end;
+
+{ The message your drop zone hook gets invoked with. }
+       PAppWindowDropZoneMsg = ^tAppWindowDropZoneMsg;
+       tAppWindowDropZoneMsg = record
+            adzm_RastPort : PRastPort;  { RastPort to render into. }
+            adzm_DropZoneBox : tIBox;   { Limit your rendering to this area. }
+            adzm_ID : ULONG;            { \ These come from straight }
+            adzm_UserData : ULONG;      { / from AddAppWindowDropZoneA(). }
+            adzm_Action : LONG;         { See below for a list of actions. }
+         end;
+
+   const
+       ADZMACTION_Enter = 0;
+       ADZMACTION_Leave = 1;
+
+{**************************************************************************}
+
+{ The message your icon selection change hook is invoked with. }
+    type
+       PIconSelectMsg = ^tIconSelectMsg;
+       tIconSelectMsg = record
+            { Size of this data structure (in bytes). }
+            ism_Length : ULONG;
+            { Lock on the drawer this object resides in,
+             * NULL for Workbench backdrop (devices).
+             }
+            ism_Drawer : BPTR;
+            { Name of the object in question. }
+            ism_Name : STRPTR;
+            { One of WBDISK, WBDRAWER, WBTOOL, WBPROJECT,
+             * WBGARBAGE, WBDEVICE, WBKICK or WBAPPICON.
+             }
+            ism_Type : UWORD;
+            { TRUE if currently selected, FALSE otherwise. }
+            ism_Selected : BOOL;
+            { Pointer to the list of tag items passed to
+             * ChangeWorkbenchSelectionA().
+             }
+            ism_Tags : PTagItem;
+            { Pointer to the window attached to this icon,
+             * if the icon is a drawer-like object.
+             }
+            ism_DrawerWindow : PWindow;
+            { Pointer to the window the icon resides in. }
+            ism_ParentWindow : PWindow;
+            { Position and size of the icon; note that the
+             * icon may not entirely reside within the visible
+             * bounds of the parent window.
+             }
+            ism_Left : WORD;
+            ism_Top : WORD;
+            ism_Width : WORD;
+            ism_Height : WORD;
+         end;
+
+    { These are the values your hook code can return.  }
+    const
+    { Unselect the icon  }
+       ISMACTION_Unselect = 0;
+    { Select the icon  }
+       ISMACTION_Select = 1;
+    { Do not change the selection state.  }
+       ISMACTION_Ignore = 2;
+    { Do not invoke the hook code again,
+      leave the icon as it is.
+    }
+       ISMACTION_Stop = 3;
+
+{**************************************************************************}
+
+{ The messages your copy hook is invoked with. }
+
+   type
+       PCopyBeginMsg = ^tCopyBeginMsg;
+       tCopyBeginMsg = record
+            cbm_Length : ULONG;           { Size of this data structure in bytes. }
+            cbm_Action : LONG;            { Will be set to CPACTION_Begin (see below). }
+            cbm_SourceDrawer : BPTR;      { A lock on the source drawer. }
+            cbm_DestinationDrawer : BPTR; { A lock on the destination drawer. }
+         end;
+
+       PCopyDataMsg = ^tCopyDataMsg;
+       tCopyDataMsg = record
+            cdm_Length : ULONG;           { Size of this data structure in bytes. }
+            cdm_Action : LONG;            { Will be set to CPACTION_Copy (see below). }
+            cdm_SourceLock : BPTR;        { A lock on the parent directory of the
+                                           * source file/drawer.
+                                           }
+            cdm_SourceName : STRPTR;      { The name of the source file or drawer. }
+            cdm_DestinationLock : BPTR;   { A lock on the parent directory of the
+                                           * destination file/drawer.
+                                           }
+            cdm_DestinationName : STRPTR; { The name of the destination file/drawer.
+                                           * This may or may not match the name of
+                                           * the source file/drawer in case the
+                                           * data is to be copied under a different
+                                           * name. For example, this is the case
+                                           * with the Workbench "Copy" command which
+                                           * creates duplicates of file/drawers by
+                                           * prefixing the duplicate's name with
+                                           * "Copy_XXX_of".
+                                           }
+            cdm_DestinationX : LONG;      { When the icon corresponding to the
+                                           * destination is written to disk, this
+                                           * is the position (put into its
+                                           * DiskObject->do_CurrentX/DiskObject->do_CurrentY
+                                           * fields) it should be placed at.
+                                           }
+            cdm_DestinationY : LONG;
+         end;
+
+     PCopyEndMsg = ^tCopyEndMsg;
+       tCopyEndMsg = record
+            cem_Length : ULONG;           { Size of this data structure in bytes. }
+            cem_Action : LONG;            { Will be set to CPACTION_End (see below). }
+         end;
+
+    const
+       CPACTION_Begin = 0;
+    { This message arrives for each file or
+      drawer to be copied.
+    }
+       CPACTION_Copy = 1;
+    { This message arrives when all files/drawers
+      have been copied.
+    }
+       CPACTION_End = 2;
+
+{**************************************************************************}
+
+{ The messages your delete hook is invoked with. }
+    type
+       PDeleteBeginMsg = ^tDeleteBeginMsg;
+       tDeleteBeginMsg = record
+            dbm_Length : ULONG;   { Size of this data structure in bytes. }
+            dbm_Action : LONG;    { Will be set to either DLACTION_BeginDiscard
+                                   * or DLACTION_BeginEmptyTrash (see below).
+                                   }
+         end;
+
+
+       PDeleteDataMsg = ^tDeleteDataMsg;
+       tDeleteDataMsg = record
+            ddm_Length : ULONG;   { Size of this data structure in bytes. }
+            ddm_Action : LONG;    { Will be set to either DLACTION_DeleteContents
+                                   * or DLACTION_DeleteObject (see below).
+                                   }
+            ddm_Lock : BPTR;      { A Lock on the parent directory of the object
+                                   * whose contents or which itself should be
+                                   * deleted.
+                                   }
+            ddm_Name : STRPTR;    { The name of the object whose contents or
+                                   * which itself should be deleted.
+                                   }
+         end;
+
+
+       PDeleteEndMsg = ^tDeleteEndMsg;
+       tDeleteEndMsg = record
+            dem_Length : ULONG;   { Size of this data structure in bytes. }
+            dem_Action : LONG;    { Will be set to DLACTION_End (see below). }
+         end;
+
+ const
+       DLACTION_BeginDiscard = 0;
+    { This indicates that the following
+      delete operations are intended to
+      empty the trashcan.
+    }
+
+       DLACTION_BeginEmptyTrash = 1;
+    { This indicates that the object
+      described by lock and name refers
+      to a drawer; you should empty its
+      contents but  DO NOT  delete the
+      drawer itself!
+    }
+
+       DLACTION_DeleteContents = 3;
+    { This indicates that the object
+      described by lock and name should
+      be deleted; this could be a file
+      or an empty drawer.
+    }
+
+       DLACTION_DeleteObject = 4;
+    { This indicates that the
+      deletion process is finished.
+    }
+
+       DLACTION_End = 5;
+
+{**************************************************************************}
+
+{ The messages your text input hook is invoked with. }
+    type
+       PTextInputMsg = ^tTextInputMsg;
+       tTextInputMsg = record
+            tim_Length : ULONG;     { Size of this data structure
+                                     * in bytes.
+                                     }
+            tim_Action : LONG;      { One of the TIACTION_...
+                                     * values listed below.
+                                     }
+            tim_Prompt : STRPTR;    { The Workbench suggested
+                                     * result, depending on what
+                                     * kind of input is requested
+                                     * (as indicated by the
+                                     * tim_Action member).
+                                     }
+         end;
+
+   const
+   { A file or drawer is to be
+    * renamed.
+   }
+       TIACTION_Rename = 0;
+
+    { A volume is to be relabeled.  }
+       TIACTION_RelabelVolume = 1;
+
+    { A new drawer is to be created.  }
+       TIACTION_NewDrawer = 2;
+
+    { A program or script is to be
+      executed.
+    }
+       TIACTION_Execute = 3;
+
+{**************************************************************************}
+
+{ Parameters for the UpdateWorkbench() function. }
+
+    { Object has been deleted.  }
+       UPDATEWB_ObjectRemoved = 0;
+
+    { Object is new or has changed.  }
+       UPDATEWB_ObjectAdded = 1;
+
+    WORKBENCHNAME : PChar  = 'workbench.library';
+
+VAR
+    WorkbenchBase : pLibrary = nil;
+
+FUNCTION AddAppIconA(id : ULONG location 'd0'; userdata : ULONG location 'd1'; text_ : pCHAR location 'a0'; msgport : pMsgPort location 'a1'; lock : pFileLock location 'a2'; diskobj : pDiskObject location 'a3'; const taglist : pTagItem location 'a4') : pAppIcon; syscall WorkbenchBase 060;
+FUNCTION AddAppMenuItemA(id : ULONG location 'd0'; userdata : ULONG location 'd1'; text_ : pCHAR location 'a0'; msgport : pMsgPort location 'a1'; const taglist : pTagItem location 'a2') : pAppMenuItem; syscall WorkbenchBase 072;
+FUNCTION AddAppWindowA(id : ULONG location 'd0'; userdata : ULONG location 'd1'; window : pWindow location 'a0'; msgport : pMsgPort location 'a1'; const taglist : pTagItem location 'a2') : pAppWindow; syscall WorkbenchBase 042;
+FUNCTION RemoveAppIcon(appIcon : pAppIcon location 'a0') : longbool; syscall WorkbenchBase 066;
+FUNCTION RemoveAppMenuItem(appMenuItem : pAppMenuItem location 'a0') : longbool; syscall WorkbenchBase 078;
+FUNCTION RemoveAppWindow(appWindow : pAppWindow location 'a0') : longbool; syscall WorkbenchBase 054;
+PROCEDURE WBInfo(lock : BPTR location 'a0'; name : pCHAR location 'a1'; screen : pScreen location 'a2'); syscall WorkbenchBase 090;
+
+FUNCTION AddAppWindowDropZoneA(aw : pAppWindow location 'a0'; id : longword location 'd0'; userdata : longword location 'd1'; const tags : pTagItem location 'a1') : pAppWindowDropZone; syscall WorkbenchBase 114;
+FUNCTION ChangeWorkbenchSelectionA(name : pCHAR location 'a0'; hook : pHook location 'a1'; const tags : pTagItem location 'a2') : longbool; syscall WorkbenchBase 126;
+FUNCTION CloseWorkbenchObjectA(name : pCHAR location 'a0'; const tags : pTagItem location 'a1') : longbool; syscall WorkbenchBase 102;
+FUNCTION MakeWorkbenchObjectVisibleA(name : pCHAR location 'a0'; const tags : pTagItem location 'a1') : longbool; syscall WorkbenchBase 132;
+FUNCTION OpenWorkbenchObjectA(name : pCHAR location 'a0'; const tags : pTagItem location 'a1') : longbool; syscall WorkbenchBase 096;
+FUNCTION RemoveAppWindowDropZone(aw : pAppWindow location 'a0'; dropZone : pAppWindowDropZone location 'a1') : longbool; syscall WorkbenchBase 120;
+FUNCTION WorkbenchControlA(name : pCHAR location 'a0'; const tags : pTagItem location 'a1') : longbool; syscall WorkbenchBase 108;
+
+function AddAppMenuItem(id : ULONG; userdata : ULONG; text_ : pCHAR; msgport : pMsgPort; Const argv : array of PtrUInt) : pAppMenuItem;
+function AddAppWindow(id : ULONG; userdata : ULONG; window : pWindow; msgport : pMsgPort; Const argv : array of PtrUInt) : pAppWindow;
+
+{ overlays }
+FUNCTION AddAppIconA(id : ULONG; userdata : ULONG; const text_ : RawByteString; msgport : pMsgPort; lock : pFileLock; diskobj : pDiskObject;const taglist : pTagItem) : pAppIcon;
+FUNCTION AddAppMenuItemA(id : ULONG; userdata : ULONG; const text_ : RawByteString; msgport : pMsgPort;const taglist : pTagItem) : pAppMenuItem;
+PROCEDURE WBInfo(lock : BPTR; const name : RawByteString; screen : pScreen);
+
+FUNCTION ChangeWorkbenchSelectionA(const name : RawByteString; hook : pHook; const tags : pTagItem) : BOOLEAN;
+FUNCTION CloseWorkbenchObjectA(const name : RawByteString; const tags : pTagItem) : BOOLEAN;
+FUNCTION MakeWorkbenchObjectVisibleA(const name : RawByteString;const tags : pTagItem) : BOOLEAN;
+FUNCTION OpenWorkbenchObjectA(const name : RawByteString;const tags : pTagItem) : BOOLEAN;
+FUNCTION WorkbenchControlA(const name : RawByteString;const tags : pTagItem) : BOOLEAN;
+
+IMPLEMENTATION
+
+function AddAppMenuItem(id : ULONG; userdata : ULONG; text_ : pCHAR; msgport : pMsgPort; Const argv : array of PtrUInt) : pAppMenuItem;
+begin
+    AddAppMenuItem := AddAppMenuItemA(id,userdata,text_,msgport,@argv);
+end;
+
+function AddAppWindow(id : ULONG; userdata : ULONG; window : pWindow; msgport : pMsgPort; Const argv : array of PtrUInt) : pAppWindow;
+begin
+    AddAppWindow := AddAppWindowA(id,userdata,window,msgport,@argv);
+end;
+
+FUNCTION AddAppIconA(id : ULONG; userdata : ULONG; const text_ : RawByteString; msgport : pMsgPort; lock : pFileLock; diskobj : pDiskObject;const taglist : pTagItem) : pAppIcon;
+begin
+       AddAppIconA := AddAppIconA(id,userdata,PChar(text_),msgport,lock,diskobj,taglist);
+end;
+
+FUNCTION AddAppMenuItemA(id : ULONG; userdata : ULONG; const text_ : RawByteString; msgport : pMsgPort;const taglist : pTagItem) : pAppMenuItem;
+begin
+       AddAppMenuItemA := AddAppMenuItemA(id,userdata,PChar(text_),msgport,taglist);
+end;
+
+PROCEDURE WBInfo(lock : BPTR; const name : RawByteString; screen : pScreen);
+begin
+       WBInfo(lock,PChar(name),screen);
+end;
+
+FUNCTION ChangeWorkbenchSelectionA(const name : RawByteString; hook : pHook;const tags : pTagItem) : BOOLEAN;
+begin
+       ChangeWorkbenchSelectionA := ChangeWorkbenchSelectionA(PChar(name),hook,tags);
+end;
+
+FUNCTION CloseWorkbenchObjectA(const name : RawByteString;const tags : pTagItem) : BOOLEAN;
+begin
+       CloseWorkbenchObjectA := CloseWorkbenchObjectA(PChar(name),tags);
+end;
+
+FUNCTION MakeWorkbenchObjectVisibleA(const name : RawByteString;const tags : pTagItem) : BOOLEAN;
+begin
+       MakeWorkbenchObjectVisibleA := MakeWorkbenchObjectVisibleA(PChar(name),tags);
+end;
+
+FUNCTION OpenWorkbenchObjectA(const name : RawByteString;const tags : pTagItem) : BOOLEAN;
+begin
+       OpenWorkbenchObjectA := OpenWorkbenchObjectA(PChar(name),tags);
+end;
+
+FUNCTION WorkbenchControlA(const name : RawByteString;const tags : pTagItem) : BOOLEAN;
+begin
+       WorkbenchControlA := WorkbenchControlA(PChar(name),tags);
+end;
+
+const
+    { Change VERSION and LIBVERSION to proper values }
+    VERSION : string[2] = '0';
+    LIBVERSION : longword = 0;
+
+initialization
+  WorkbenchBase := OpenLibrary(WORKBENCHNAME,LIBVERSION);
+finalization
+  if Assigned(WorkbenchBase) then
+    CloseLibrary(WorkbenchBase);
+END. (* UNIT WB *)