浏览代码

* initial revision

Károly Balogh 20 年之前
父节点
当前提交
a0507ad50b
共有 1 个文件被更改,包括 4696 次插入0 次删除
  1. 4696 0
      rtl/morphos/intuition.pas

+ 4696 - 0
rtl/morphos/intuition.pas

@@ -0,0 +1,4696 @@
+{
+    $Id$
+    This file is part of the Free Pascal run time library.
+    Copyright (c) 2004 Karoly Balogh for Genesi S.a.r.l. <www.genesi.lu>
+
+    intuition.library interface unit for MorphOS/PowerPC
+
+    Based on work of Nils Sjoholm member of the Amiga RTL
+    development team.
+
+    MorphOS port was done on a free Pegasos II/G4 machine
+    provided by Genesi S.a.r.l. <www.genesi.lu>
+
+    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.
+
+ **********************************************************************}
+{$PACKRECORDS 2}
+
+unit intuition;
+
+interface
+
+uses 
+  exec, graphics, utility, inputevent, timer, layers;
+
+
+{
+ * NOTE:  intuition/iobsolete.h is included at the END of this file!
+ }
+
+{ ======================================================================== }
+{ === IntuiText ========================================================== }
+{ ================================= ======================================= }
+{ IntuiText is a series of strings that start with a screen location
+ *  (always relative to the upper-left corner of something) and then the
+ *  text of the string.  The text is null-terminated.
+ }
+Type
+    pIntuiText = ^tIntuiText;
+    tIntuiText = record
+        FrontPen,
+        BackPen         : Byte;         { the pen numbers for the rendering }
+        DrawMode        : Byte;         { the mode for rendering the text }
+        LeftEdge        : smallint;        { relative start location for the text }
+        TopEdge         : smallint;        { relative start location for the text }
+        ITextFont       : pTextAttr;  { if NULL, you accept the default }
+        IText           : PChar;       { pointer to null-terminated text }
+        NextText        : pIntuiText;   { continuation to TxWrite another text }
+    end;
+
+
+
+{ ======================================================================== }
+{ === Border ============================================================= }
+{ ======================================================================== }
+{ Data type Border, used for drawing a series of lines which is intended for
+ *  use as a border drawing, but which may, in fact, be used to render any
+ *  arbitrary vector shape.
+ *  The routine DrawBorder sets up the RastPort with the appropriate
+ *  variables, then does a Move to the first coordinate, then does Draws
+ *  to the subsequent coordinates.
+ *  After all the Draws are done, if NextBorder is non-zero we call DrawBorder
+ *  recursively
+ }
+Type
+    pBorder = ^tBorder;
+    tBorder = record
+        LeftEdge,
+        TopEdge         : smallint;        { initial offsets from the origin }
+        FrontPen,
+        BackPen         : Byte;         { pens numbers for rendering }
+        DrawMode        : Byte;         { mode for rendering }
+        Count           : Shortint;         { number of XY pairs }
+        XY              : Pointer;      { vector coordinate pairs rel to LeftTop}
+        NextBorder      : pBorder;      { pointer to any other Border too }
+    end;
+
+{ ======================================================================== }
+{ === MenuItem =========================================================== }
+{ ======================================================================== }
+
+Type
+
+    pMenuItem = ^tMenuItem;
+    tMenuItem = record
+        NextItem        : pMenuItem;    { pointer to next in chained list }
+        LeftEdge,
+        TopEdge         : smallint;        { position of the select box }
+        Width,
+        Height          : smallint;        { dimensions of the select box }
+        Flags           : Word;        { see the defines below }
+
+        MutualExclude   : Longint;      { set bits mean this item excludes that }
+
+        ItemFill        : Pointer;      { points to Image, IntuiText, or NULL }
+
+    { when this item is pointed to by the cursor and the items highlight
+     *  mode HIGHIMAGE is selected, this alternate image will be displayed
+     }
+
+        SelectFill      : Pointer;      { points to Image, IntuiText, or NULL }
+
+        Command         : Char;         { only if appliprog sets the COMMSEQ flag }
+
+        SubItem         : pMenuItem;    { if non-zero, DrawMenu shows "->" }
+
+    { The NextSelect field represents the menu number of next selected
+     *  item (when user has drag-selected several items)
+     }
+
+        NextSelect      : Word;
+    end;
+
+
+Const
+
+{ FLAGS SET BY THE APPLIPROG }
+    CHECKIT     = $0001;        { whether to check this item if selected }
+    ITEMTEXT    = $0002;        { set if textual, clear if graphical item }
+    COMMSEQ     = $0004;        { set if there's an command sequence }
+    MENUTOGGLE  = $0008;        { set to toggle the check of a menu item }
+    ITEMENABLED = $0010;        { set if this item is enabled }
+
+{ these are the SPECIAL HIGHLIGHT FLAG state meanings }
+    HIGHFLAGS   = $00C0;        { see definitions below for these bits }
+    HIGHIMAGE   = $0000;        { use the user's "select image" }
+    HIGHCOMP    = $0040;        { highlight by complementing the selectbox }
+    HIGHBOX     = $0080;        { highlight by "boxing" the selectbox }
+    HIGHNONE    = $00C0;        { don't highlight }
+
+{ FLAGS SET BY BOTH APPLIPROG AND INTUITION }
+    CHECKED     = $0100;        { if CHECKIT, then set this when selected }
+
+{ FLAGS SET BY INTUITION }
+    ISDRAWN     = $1000;        { this item's subs are currently drawn }
+    HIGHITEM    = $2000;        { this item is currently highlighted }
+    MENUTOGGLED = $4000;        { this item was already toggled }
+
+
+{ ======================================================================== }
+{ === Menu =============================================================== }
+{ ======================================================================== }
+Type
+
+    pMenu = ^tMenu;
+    tMenu = record
+        NextMenu        : pMenu;        { same level }
+        LeftEdge,
+        TopEdge         : smallint;        { position of the select box }
+        Width,
+        Height          : smallint;        { dimensions of the select box }
+        Flags           : Word;        { see flag definitions below }
+        MenuName        : PChar;       { text for this Menu Header }
+        FirstItem       : pMenuItem;  { pointer to first in chain }
+
+    { these mysteriously-named variables are for internal use only }
+
+        JazzX,
+        JazzY,
+        BeatX,
+        BeatY           : smallint;
+    end;
+
+CONST
+{ FLAGS SET BY BOTH THE APPLIPROG AND INTUITION }
+    MENUENABLED = $0001;        { whether or not this menu is enabled }
+
+{ FLAGS SET BY INTUITION }
+    MIDRAWN     = $0100;        { this menu's items are currently drawn }
+
+
+
+
+{ ======================================================================== }
+{ === Gadget ============================================================= }
+{ ======================================================================== }
+
+Type
+
+    pGadget = ^tGadget;
+    tGadget = record
+        NextGadget      : pGadget;      { next gadget in the list }
+
+        LeftEdge,
+        TopEdge         : smallint;        { "hit box" of gadget }
+        Width,
+        Height          : smallint;        { "hit box" of gadget }
+
+        Flags           : Word;        { see below for list of defines }
+
+        Activation      : Word;        { see below for list of defines }
+
+        GadgetType      : Word;        { see below for defines }
+
+    { appliprog can specify that the Gadget be rendered as either as Border
+     * or an Image.  This variable points to which (or equals NULL if there's
+     * nothing to be rendered about this Gadget)
+     }
+
+        GadgetRender    : Pointer;
+
+    { appliprog can specify "highlighted" imagery rather than algorithmic
+     * this can point to either Border or Image data
+     }
+
+        SelectRender    : Pointer;
+
+        GadgetText      : pIntuiText; { text for this gadget }
+
+    { by using the MutualExclude word, the appliprog can describe
+     * which gadgets mutually-exclude which other ones.  The bits
+     * in MutualExclude correspond to the gadgets in object containing
+     * the gadget list.  If this gadget is selected and a bit is set
+     * in this gadget's MutualExclude and the gadget corresponding to
+     * that bit is currently selected (e.g. bit 2 set and gadget 2
+     * is currently selected) that gadget must be unselected.
+     * Intuition does the visual unselecting (with checkmarks) and
+     * leaves it up to the program to unselect internally
+     }
+
+        MutualExclude   : Longint;      { set bits mean this gadget excludes that gadget }
+
+    { pointer to a structure of special data required by Proportional,
+     * String and Longint Gadgets
+     }
+
+        SpecialInfo     : Pointer;
+
+        GadgetID        : Word;        { user-definable ID field }
+        UserData        : Pointer;      { ptr to general purpose User data (ignored by In) }
+    end;
+
+ pExtGadget = ^tExtGadget;
+ tExtGadget = record
+    { The first fields match struct Gadget exactly }
+    NextGadget     : pExtGadget;  { Matches struct Gadget }
+    LeftEdge, TopEdge,            { Matches struct Gadget }
+    Width, Height  : smallint;     { Matches struct Gadget }
+    Flags,                        { Matches struct Gadget }
+    Activation,                   { Matches struct Gadget }
+    GadgetType     : WORD;        { Matches struct Gadget }
+    GadgetRender,                 { Matches struct Gadget }
+    SelectRender   : Pointer;     { Matches struct Gadget }
+    GadgetText     : pIntuiText;  { Matches struct Gadget }
+    MutualExclude  : Longint;     { Matches struct Gadget }
+    SpecialInfo    : Pointer;     { Matches struct Gadget }
+    GadgetID       : WORD;        { Matches struct Gadget }
+    UserData       : Pointer;     { Matches struct Gadget }
+
+    { These fields only exist under V39 and only if GFLG_EXTENDED is set }
+    MoreFlags      : Cardinal;     { see GMORE_ flags below }
+    BoundsLeftEdge,             { Bounding extent for gadget, valid   }
+    BoundsTopEdge,              { only if GMORE_BOUNDS is set.  The   }
+    BoundsWidth,                { GFLG_RELxxx flags affect these      }
+    BoundsHeight   : smallint;      { coordinates as well.        }
+ end;
+
+
+CONST
+{ --- Gadget.Flags values      --- }
+{ combinations in these bits describe the highlight technique to be used }
+ GFLG_GADGHIGHBITS  = $0003;
+ GFLG_GADGHCOMP     = $0000;  { Complement the select box }
+ GFLG_GADGHBOX      = $0001;  { Draw a box around the image }
+ GFLG_GADGHIMAGE    = $0002;  { Blast in this alternate image }
+ GFLG_GADGHNONE     = $0003;  { don't highlight }
+
+ GFLG_GADGIMAGE     = $0004;  { set IF GadgetRender AND SelectRender
+                                   * point to an Image structure, clear
+                                   * if they point to Border structures
+                                   }
+
+{ combinations in these next two bits specify to which corner the gadget's
+ *  Left & Top coordinates are relative.  If relative to Top/Left,
+ *  these are "normal" coordinates (everything is relative to something in
+ *  this universe).
+ *
+ * Gadget positions and dimensions are relative to the window or
+ * requester which contains the gadget
+ }
+ GFLG_RELBOTTOM   = $0008;  { vert. pos. is relative to bottom edge }
+ GFLG_RELRIGHT    = $0010;  { horiz. pos. is relative to right edge }
+ GFLG_RELWIDTH    = $0020;  { width is relative to req/window    }
+ GFLG_RELHEIGHT   = $0040;  { height is relative to req/window   }
+
+{ New for V39: GFLG_RELSPECIAL allows custom gadget implementors to
+ * make gadgets whose position and size depend in an arbitrary way
+ * on their window's dimensions.  The GM_LAYOUT method will be invoked
+ * for such a gadget (or any other GREL_xxx gadget) at suitable times,
+ * such as when the window opens or the window's size changes.
+ }
+ GFLG_RELSPECIAL  = $4000;  { custom gadget has special relativity.
+                                   * Gadget box values are absolutes, but
+                                   * can be changed via the GM_LAYOUT method.
+                                   }
+
+ GFLG_SELECTED    = $0080;  { you may initialize AND look at this        }
+
+{ the GFLG_DISABLED flag is initialized by you and later set by Intuition
+ * according to your calls to On/OffGadget().  It specifies whether or not
+ * this Gadget is currently disabled from being selected
+ }
+ GFLG_DISABLED    = $0100;
+
+{ These flags specify the type of text field that Gadget.GadgetText
+ * points to.  In all normal (pre-V36) gadgets which you initialize
+ * this field should always be zero.  Some types of gadget objects
+ * created from classes will use these fields to keep track of
+ * types of labels/contents that different from IntuiText, but are
+ * stashed in GadgetText.
+ }
+
+ GFLG_LABELMASK   = $3000;
+ GFLG_LABELITEXT  = $0000;  { GadgetText points to IntuiText     }
+ GFLG_LABELSTRING = $1000;  { GadgetText points to (UBYTE *)     }
+ GFLG_LABELIMAGE  = $2000;  { GadgetText points to Image (object)        }
+
+{ New for V37: GFLG_TABCYCLE }
+ GFLG_TABCYCLE    = $0200;  { (string OR custom) gadget participates in
+                                   * cycling activation with Tab or Shift-Tab
+                                   }
+{ New for V37: GFLG_STRINGEXTEND.  We discovered that V34 doesn't properly
+ * ignore the value we had chosen for the Gadget->Activation flag
+ * GACT_STRINGEXTEND.  NEVER SET THAT FLAG WHEN RUNNING UNDER V34.
+ * The Gadget->Flags bit GFLG_STRINGEXTEND is provided as a synonym which is
+ * safe under V34, and equivalent to GACT_STRINGEXTEND under V37.
+ * (Note that the two flags are not numerically equal)
+ }
+ GFLG_STRINGEXTEND = $0400;  { this String Gadget has StringExtend        }
+
+{ New for V39: GFLG_IMAGEDISABLE.  This flag is automatically set if
+ * the custom image of this gadget knows how to do disabled rendering
+ * (more specifically, if its IA_SupportsDisable attribute is TRUE).
+ * Intuition uses this to defer the ghosting to the image-class,
+ * instead of doing it itself (the old compatible way).
+ * Do not set this flag yourself - Intuition will do it for you.
+ }
+
+ GFLG_IMAGEDISABLE = $0800;  { Gadget's image knows how to do disabled
+                                   * rendering
+                                   }
+
+{ New for V39:  If set, this bit means that the Gadget is actually
+ * a struct ExtGadget, with new fields and flags.  All V39 boopsi
+ * gadgets are ExtGadgets.  Never ever attempt to read the extended
+ * fields of a gadget if this flag is not set.
+ }
+ GFLG_EXTENDED    = $8000;  { Gadget is extended }
+
+{ ---  Gadget.Activation flag values   --- }
+{ Set GACT_RELVERIFY if you want to verify that the pointer was still over
+ * the gadget when the select button was released.  Will cause
+ * an IDCMP_GADGETUP message to be sent if so.
+ }
+ GACT_RELVERIFY    = $0001;
+
+{ the flag GACT_IMMEDIATE, when set, informs the caller that the gadget
+ *  was activated when it was activated.  This flag works in conjunction with
+ *  the GACT_RELVERIFY flag
+ }
+ GACT_IMMEDIATE    = $0002;
+
+{ the flag GACT_ENDGADGET, when set, tells the system that this gadget,
+ * when selected, causes the Requester to be ended.  Requesters
+ * that are ended are erased and unlinked from the system.
+ }
+ GACT_ENDGADGET    = $0004;
+
+{ the GACT_FOLLOWMOUSE flag, when set, specifies that you want to receive
+ * reports on mouse movements while this gadget is active.
+ * You probably want to set the GACT_IMMEDIATE flag when using
+ * GACT_FOLLOWMOUSE, since that's the only reasonable way you have of
+ * learning why Intuition is suddenly sending you a stream of mouse
+ * movement events.  If you don't set GACT_RELVERIFY, you'll get at
+ * least one Mouse Position event.
+ }
+ GACT_FOLLOWMOUSE = $0008;
+
+{ if any of the BORDER flags are set in a Gadget that's included in the
+ * Gadget list when a Window is opened, the corresponding Border will
+ * be adjusted to make room for the Gadget
+ }
+ GACT_RIGHTBORDER = $0010;
+ GACT_LEFTBORDER  = $0020;
+ GACT_TOPBORDER   = $0040;
+ GACT_BOTTOMBORDER= $0080;
+ GACT_BORDERSNIFF = $8000;  { neither set nor rely on this bit   }
+
+ GACT_TOGGLESELECT= $0100;  { this bit for toggle-select mode }
+ GACT_BOOLEXTEND  = $2000;  { this Boolean Gadget has a BoolInfo }
+
+{ should properly be in StringInfo, but aren't }
+ GACT_STRINGLEFT  = $0000;  { NOTE WELL: that this has value zero        }
+ GACT_STRINGCENTER= $0200;
+ GACT_STRINGRIGHT = $0400;
+ GACT_LONGINT     = $0800;  { this String Gadget is for Long Ints        }
+ GACT_ALTKEYMAP   = $1000;  { this String has an alternate keymap        }
+ GACT_STRINGEXTEND= $2000;  { this String Gadget has StringExtend        }
+                                  { NOTE: NEVER SET GACT_STRINGEXTEND IF YOU
+                                   * ARE RUNNING ON LESS THAN V36!  SEE
+                                   * GFLG_STRINGEXTEND (ABOVE) INSTEAD
+                                   }
+
+ GACT_ACTIVEGADGET = $4000;  { this gadget is "active".  This flag
+                                   * is maintained by Intuition, and you
+                                   * cannot count on its value persisting
+                                   * while you do something on your program's
+                                   * task.  It can only be trusted by
+                                   * people implementing custom gadgets
+                                   }
+
+{ note $8000 is used above (GACT_BORDERSNIFF);
+ * all Activation flags defined }
+
+{ --- GADGET TYPES ------------------------------------------------------- }
+{ These are the Gadget Type definitions for the variable GadgetType
+ * gadget number type MUST start from one.  NO TYPES OF ZERO ALLOWED.
+ * first comes the mask for Gadget flags reserved for Gadget typing
+ }
+ GTYP_GADGETTYPE = $FC00;  { all Gadget Global Type flags (padded) }
+ GTYP_SYSGADGET  = $8000;  { 1 = Allocated by the system, 0 = by app. }
+ GTYP_SCRGADGET  = $4000;  { 1 = ScreenGadget, 0 = WindowGadget }
+ GTYP_GZZGADGET  = $2000;  { 1 = for WFLG_GIMMEZEROZERO borders }
+ GTYP_REQGADGET  = $1000;  { 1 = this is a Requester Gadget }
+{ system gadgets }
+ GTYP_SIZING     = $0010;
+ GTYP_WDRAGGING  = $0020;
+ GTYP_SDRAGGING  = $0030;
+ GTYP_WUPFRONT   = $0040;
+ GTYP_SUPFRONT   = $0050;
+ GTYP_WDOWNBACK  = $0060;
+ GTYP_SDOWNBACK  = $0070;
+ GTYP_CLOSE      = $0080;
+{ application gadgets }
+ GTYP_BOOLGADGET = $0001;
+ GTYP_GADGET0002 = $0002;
+ GTYP_PROPGADGET = $0003;
+ GTYP_STRGADGET  = $0004;
+ GTYP_CUSTOMGADGET    =   $0005;
+
+
+{* GTYP_GTYPEMASK is a mask you can apply to tell what class
+ * of gadget this is.  The possible classes follow.
+ *}
+ GTYP_GTYPEMASK        =  $0007;
+
+{ This bit in GadgetType is reserved for undocumented internal use
+ * by the Gadget Toolkit, and cannot be used nor relied on by
+ * applications:        $0100;
+ }
+
+{ New for V39.  Gadgets which have the GFLG_EXTENDED flag set are
+ * actually ExtGadgets, which have more flags.  The GMORE_xxx
+ * identifiers describe those flags.  For GMORE_SCROLLRASTER, see
+ * important information in the ScrollWindowRaster() autodoc.
+ * NB: GMORE_SCROLLRASTER must be set before the gadget is
+ * added to a window.
+ }
+ GMORE_BOUNDS       = $00000001; { ExtGadget has valid Bounds }
+ GMORE_GADGETHELP   = $00000002; { This gadget responds to gadget help }
+ GMORE_SCROLLRASTER = $00000004; { This (custom) gadget uses ScrollRaster }
+
+{ ======================================================================== }
+{ === BoolInfo======================================================= }
+{ ======================================================================== }
+{ This is the special data needed by an Extended Boolean Gadget
+ * Typically this structure will be pointed to by the Gadget field SpecialInfo
+ }
+Type
+    pBoolInfo = ^tBoolInfo;
+    tBoolInfo = record
+        Flags   : Word;        { defined below }
+        Mask    : Pointer; { bit mask for highlighting and selecting
+                         * mask must follow the same rules as an Image
+                         * plane.  It's width and height are determined
+                         * by the width and height of the gadget's
+                         * select box. (i.e. Gadget.Width and .Height).
+                         }
+        Reserved : Cardinal;     { set to 0      }
+    end;
+
+Const
+
+{ set BoolInfo.Flags to this flag bit.
+ * in the future, additional bits might mean more stuff hanging
+ * off of BoolInfo.Reserved.
+}
+    BOOLMASK    = $0001;        { extension is for masked gadget }
+
+{ ======================================================================== }
+{ === PropInfo =========================================================== }
+{ ======================================================================== }
+{ this is the special data required by the proportional Gadget
+ * typically, this data will be pointed to by the Gadget variable SpecialInfo
+ }
+
+Type
+
+    pPropInfo = ^tPropInfo;
+    tPropInfo = record
+        Flags   : Word;        { general purpose flag bits (see defines below) }
+
+    { You initialize the Pot variables before the Gadget is added to
+     * the system.  Then you can look here for the current settings
+     * any time, even while User is playing with this Gadget.  To
+     * adjust these after the Gadget is added to the System, use
+     * ModifyProp();  The Pots are the actual proportional settings,
+     * where a value of zero means zero and a value of MAXPOT means
+     * that the Gadget is set to its maximum setting.
+     }
+
+        HorizPot        : WORD; { 16-bit FixedPoint horizontal quantity percentage }
+        VertPot         : WORD; { 16-bit FixedPoint vertical quantity percentage }
+
+    { the 16-bit FixedPoint Body variables describe what percentage of
+     * the entire body of stuff referred to by this Gadget is actually
+     * shown at one time.  This is used with the AUTOKNOB routines,
+     * to adjust the size of the AUTOKNOB according to how much of
+     * the data can be seen.  This is also used to decide how far
+     * to advance the Pots when User hits the Container of the Gadget.
+     * For instance, if you were controlling the display of a 5-line
+     * Window of text with this Gadget, and there was a total of 15
+     * lines that could be displayed, you would set the VertBody value to
+     *     (MAXBODY / (TotalLines / DisplayLines)) = MAXBODY / 3.
+     * Therefore, the AUTOKNOB would fill 1/3 of the container, and
+     * if User hits the Cotainer outside of the knob, the pot would
+     * advance 1/3 (plus or minus) If there's no body to show, or
+     * the total amount of displayable info is less than the display area,
+     * set the Body variables to the MAX.  To adjust these after the
+     * Gadget is added to the System, use ModifyProp();
+     }
+
+        HorizBody       : Word;        { horizontal Body }
+        VertBody        : Word;        { vertical Body }
+
+    { these are the variables that Intuition sets and maintains }
+
+        CWidth          : Word;        { Container width (with any relativity absoluted) }
+        CHeight         : Word;        { Container height (with any relativity absoluted) }
+        HPotRes,
+        VPotRes         : Word;        { pot increments }
+        LeftBorder      : Word;        { Container borders }
+        TopBorder       : Word;        { Container borders }
+    end;
+
+CONST
+{ --- FLAG BITS ---------------------------------------------------------- }
+ AUTOKNOB     =   $0001;  { this flag sez:  gimme that old auto-knob }
+{ NOTE: if you do not use an AUTOKNOB for a proportional gadget,
+ * you are currently limited to using a single Image of your own
+ * design: Intuition won't handle a linked list of images as
+ * a proportional gadget knob.
+ }
+
+ FREEHORIZ     =  $0002;  { IF set, the knob can move horizontally }
+ FREEVERT      =  $0004;  { IF set, the knob can move vertically }
+ PROPBORDERLESS =  $0008;  { IF set, no border will be rendered }
+ KNOBHIT       =  $0100;  { set when this Knob is hit }
+ PROPNEWLOOK   =  $0010;  { set this IF you want to get the new
+                                 * V36 look
+                                 }
+
+ KNOBHMIN      =  6;       { minimum horizontal size of the Knob }
+ KNOBVMIN      =  4;       { minimum vertical size of the Knob }
+ MAXBODY       =  $FFFF;  { maximum body value }
+ MAXPOT        =  $FFFF;  { maximum pot value }
+
+{ ======================================================================== }
+{ === StringInfo ========================================================= }
+{ ======================================================================== }
+{ this is the special data required by the string Gadget
+ * typically, this data will be pointed to by the Gadget variable SpecialInfo
+ }
+
+Type
+
+    pStringInfo = ^tStringInfo;
+    tStringInfo = record
+    { you initialize these variables, and then Intuition maintains them }
+        Buffer          : PChar;       { the buffer containing the start and final string }
+        UndoBuffer      : PChar;       { optional buffer for undoing current entry }
+        BufferPos       : smallint;        { character position in Buffer }
+        MaxChars        : smallint;        { max number of chars in Buffer (including NULL) }
+        DispPos         : smallint;        { Buffer position of first displayed character }
+
+    { Intuition initializes and maintains these variables for you }
+
+        UndoPos         : smallint;        { character position in the undo buffer }
+        NumChars        : smallint;        { number of characters currently in Buffer }
+        DispCount       : smallint;        { number of whole characters visible in Container }
+        CLeft,
+        CTop            : smallint;        { topleft offset of the container }
+
+    { you can initialize this variable before the gadget is submitted to
+     * Intuition, and then examine it later to discover what Longint
+     * the user has entered (if the user never plays with the gadget,
+     * the value will be unchanged from your initial setting)
+     }
+        Extension       : Pointer;
+        _LongInt         : Longint;
+
+    { If you want this Gadget to use your own Console keymapping, you
+     * set the ALTKEYMAP bit in the Activation flags of the Gadget, and then
+     * set this variable to point to your keymap.  If you don't set the
+     * ALTKEYMAP, you'll get the standard ASCII keymapping.
+     }
+
+        AltKeyMap       : Pointer;
+    end;
+
+
+{ ======================================================================== }
+{ === Requester ========================================================== }
+{ ======================================================================== }
+
+Type
+
+    pRequester = ^tRequester;
+    tRequester = record
+    { the ClipRect and BitMap and used for rendering the requester }
+        OlderRequest    : pRequester;
+        LeftEdge,
+        TopEdge         : smallint;        { dimensions of the entire box }
+        Width,
+        Height          : smallint;        { dimensions of the entire box }
+        RelLeft,
+        RelTop          : smallint;        { for Pointer relativity offsets }
+
+        ReqGadget       : pGadget;    { pointer to a list of Gadgets }
+        ReqBorder       : pBorder;    { the box's border }
+        ReqText         : pIntuiText; { the box's text }
+        Flags           : Word;        { see definitions below }
+
+    { pen number for back-plane fill before draws }
+
+        BackFill        : Byte;
+
+    { Layer in place of clip rect       }
+
+        ReqLayer        : pLayer;
+
+        ReqPad1         : Array [0..31] of Byte;
+
+    { If the BitMap plane pointers are non-zero, this tells the system
+     * that the image comes pre-drawn (if the appliprog wants to define
+     * it's own box, in any shape or size it wants!);  this is OK by
+     * Intuition as long as there's a good correspondence between
+     * the image and the specified Gadgets
+     }
+
+        ImageBMap       : pBitMap;    { points to the BitMap of PREDRAWN imagery }
+        RWindow         : Pointer;      { added.  points back to Window }
+        ReqImage        : Pointer;
+        ReqPad2         : Array [0..31] of Shortint;
+    end;
+
+
+Const
+
+{ FLAGS SET BY THE APPLIPROG }
+    POINTREL            = $0001;    { if POINTREL set, TopLeft is relative to pointer}
+    PREDRAWN            = $0002;    { if ReqBMap points to predrawn Requester imagery }
+    NOISYREQ            = $0004;    { if you don't want requester to filter input          }
+
+    SIMPLEREQ           = $0010;
+        { to use SIMPLEREFRESH layer (recommended)     }
+
+    { New for V36          }
+    USEREQIMAGE         = $0020;
+         {  render linked list ReqImage after BackFill
+         * but before gadgets and text
+         }
+    NOREQBACKFILL       = $0040;
+        { don't bother filling requester with Requester.BackFill pen   }
+
+
+{ FLAGS SET BY INTUITION }
+    REQOFFWINDOW        = $1000;        { part of one of the Gadgets was offwindow }
+    REQACTIVE           = $2000;        { this requester is active }
+    SYSREQUEST          = $4000;        { this requester caused by system }
+    DEFERREFRESH        = $8000;        { this Requester stops a Refresh broadcast }
+
+
+
+
+{ ======================================================================== }
+{ === Image ============================================================== }
+{ ======================================================================== }
+{ This is a brief image structure for very simple transfers of
+ * image data to a RastPort
+ }
+
+Type
+    pImage = ^tImage;
+    tImage = record
+        LeftEdge        : smallint;        { starting offset relative to some origin }
+        TopEdge         : smallint;        { starting offsets relative to some origin }
+        Width           : smallint;        { pixel size (though data is word-aligned) }
+        Height,
+        Depth           : smallint;        { pixel sizes }
+        ImageData       : Pointer;      { pointer to the actual word-aligned bits }
+
+    { the PlanePick and PlaneOnOff variables work much the same way as the
+     * equivalent GELS Bob variables.  It's a space-saving
+     * mechanism for image data.  Rather than defining the image data
+     * for every plane of the RastPort, you need define data only
+     * for the planes that are not entirely zero or one.  As you
+     * define your Imagery, you will often find that most of the planes
+     * ARE just as color selectors.  For instance, if you're designing
+     * a two-color Gadget to use colors two and three, and the Gadget
+     * will reside in a five-plane display, bit plane zero of your
+     * imagery would be all ones, bit plane one would have data that
+     * describes the imagery, and bit planes two through four would be
+     * all zeroes.  Using these flags allows you to avoid wasting all
+     * that memory in this way:  first, you specify which planes you
+     * want your data to appear in using the PlanePick variable.  For
+     * each bit set in the variable, the next "plane" of your image
+     * data is blitted to the display.  For each bit clear in this
+     * variable, the corresponding bit in PlaneOnOff is examined.
+     * If that bit is clear, a "plane" of zeroes will be used.
+     * If the bit is set, ones will go out instead.  So, for our example:
+     *   Gadget.PlanePick = $02;
+     *   Gadget.PlaneOnOff = $01;
+     * Note that this also allows for generic Gadgets, like the
+     * System Gadgets, which will work in any number of bit planes.
+     * Note also that if you want an Image that is only a filled
+     * rectangle, you can get this by setting PlanePick to zero
+     * (pick no planes of data) and set PlaneOnOff to describe the pen
+     * color of the rectangle.
+     }
+
+        PlanePick,
+        PlaneOnOff      : Byte;
+
+    { if the NextImage variable is not NULL, Intuition presumes that
+     * it points to another Image structure with another Image to be
+     * rendered
+     }
+
+        NextImage       : pImage;
+    end;
+
+
+{ New for V39, Intuition supports the IESUBCLASS_NEWTABLET subclass
+ * of the IECLASS_NEWPOINTERPOS event.  The ie_EventAddress of such
+ * an event points to a TabletData structure (see below).
+ *
+ * The TabletData structure contains certain elements including a taglist.
+ * The taglist can be used for special tablet parameters.  A tablet driver
+ * should include only those tag-items the tablet supports.  An application
+ * can listen for any tag-items that interest it.  Note: an application
+ * must set the WA_TabletMessages attribute to TRUE to receive this
+ * extended information in its IntuiMessages.
+ *
+ * The definitions given here MUST be followed.  Pay careful attention
+ * to normalization and the interpretation of signs.
+ *
+ * TABLETA_TabletZ:  the current value of the tablet in the Z direction.
+ * This unsigned value should typically be in the natural units of the
+ * tablet.  You should also provide TABLETA_RangeZ.
+ *
+ * TABLETA_RangeZ:  the maximum value of the tablet in the Z direction.
+ * Normally specified along with TABLETA_TabletZ, this allows the
+ * application to scale the actual Z value across its range.
+ *
+ * TABLETA_AngleX:  the angle of rotation or tilt about the X-axis.  This
+ * number should be normalized to fill a signed long Longint.  Positive
+ * values imply a clockwise rotation about the X-axis when viewing
+ * from +X towards the origin.
+ *
+ * TABLETA_AngleY:  the angle of rotation or tilt about the Y-axis.  This
+ * number should be normalized to fill a signed long Longint.  Positive
+ * values imply a clockwise rotation about the Y-axis when viewing
+ * from +Y towards the origin.
+ *
+ * TABLETA_AngleZ:  the angle of rotation or tilt about the Z axis.  This
+ * number should be normalized to fill a signed long Longint.  Positive
+ * values imply a clockwise rotation about the Z-axis when viewing
+ * from +Z towards the origin.
+ *
+ *      Note: a stylus that supports tilt should use the TABLETA_AngleX
+ *      and TABLETA_AngleY attributes.  Tilting the stylus so the tip
+ *      points towards increasing or decreasing X is actually a rotation
+ *      around the Y-axis.  Thus, if the stylus tip points towards
+ *      positive X, then that tilt is represented as a negative
+ *      TABLETA_AngleY.  Likewise, if the stylus tip points towards
+ *      positive Y, that tilt is represented by positive TABLETA_AngleX.
+ *
+ * TABLETA_Pressure:  the pressure reading of the stylus.  The pressure
+ * should be normalized to fill a signed long Longint.  Typical devices
+ * won't generate negative pressure, but the possibility is not precluded.
+ * The pressure threshold which is considered to cause a button-click is
+ * expected to be set in a Preferences program supplied by the tablet
+ * vendor.  The tablet driver would send IECODE_LBUTTON-type events as
+ * the pressure crossed that threshold.
+ *
+ * TABLETA_ButtonBits:  ti_Data is a long Longint whose bits are to
+ * be interpreted at the state of the first 32 buttons of the tablet.
+ *
+ * TABLETA_InProximity:  ti_Data is a boolean.  For tablets that support
+ * proximity, they should send the (TABLETA_InProximity,FALSE) tag item
+ * when the stylus is out of proximity.  One possible use we can forsee
+ * is a mouse-blanking commodity which keys off this to blank the
+ * mouse.  When this tag is absent, the stylus is assumed to be
+ * in proximity.
+ *
+ * TABLETA_ResolutionX:  ti_Data is an unsigned long Longint which
+ * is the x-axis resolution in dots per inch.
+ *
+ * TABLETA_ResolutionY:  ti_Data is an unsigned long Longint which
+ * is the y-axis resolution in dots per inch.
+ }
+
+const
+ TABLETA_Dummy          = (TAG_USER + $3A000)  ;
+ TABLETA_TabletZ        = (TABLETA_Dummy + $01);
+ TABLETA_RangeZ         = (TABLETA_Dummy + $02);
+ TABLETA_AngleX         = (TABLETA_Dummy + $03);
+ TABLETA_AngleY         = (TABLETA_Dummy + $04);
+ TABLETA_AngleZ         = (TABLETA_Dummy + $05);
+ TABLETA_Pressure       = (TABLETA_Dummy + $06);
+ TABLETA_ButtonBits     = (TABLETA_Dummy + $07);
+ TABLETA_InProximity    = (TABLETA_Dummy + $08);
+ TABLETA_ResolutionX    = (TABLETA_Dummy + $09);
+ TABLETA_ResolutionY    = (TABLETA_Dummy + $0A);
+
+{ If your window sets WA_TabletMessages to TRUE, then it will receive
+ * extended IntuiMessages (struct ExtIntuiMessage) whose eim_TabletData
+ * field points at a TabletData structure.  This structure contains
+ * additional information about the input event.
+ }
+
+Type
+ pTabletData = ^tTabletData;
+ tTabletData = record
+    { Sub-pixel position of tablet, in screen coordinates,
+     * scaled to fill a UWORD fraction:
+     }
+    td_XFraction, td_YFraction  : WORD;
+
+    { Current tablet coordinates along each axis: }
+    td_TabletX, td_TabletY      : Cardinal;
+
+    { Tablet range along each axis.  For example, if td_TabletX
+     * can take values 0-999, td_RangeX should be 1000.
+     }
+    td_RangeX, td_RangeY        : Cardinal;
+
+    { Pointer to tag-list of additional tablet attributes.
+     * See <intuition/intuition.h> for the tag values.
+     }
+    td_TagList                  : pTagItem;
+ end;
+
+{ If a tablet driver supplies a hook for ient_CallBack, it will be
+ * invoked in the standard hook manner.  A0 will point to the Hook
+ * itself, A2 will point to the InputEvent that was sent, and
+ * A1 will point to a TabletHookData structure.  The InputEvent's
+ * ie_EventAddress field points at the IENewTablet structure that
+ * the driver supplied.
+ *
+ * Based on the thd_Screen, thd_Width, and thd_Height fields, the driver
+ * should scale the ient_TabletX and ient_TabletY fields and store the
+ * result in ient_ScaledX, ient_ScaledY, ient_ScaledXFraction, and
+ * ient_ScaledYFraction.
+ *
+ * The tablet hook must currently return NULL.  This is the only
+ * acceptable return-value under V39.
+ }
+
+ pTabletHookData = ^tTabletHookData;
+ tTabletHookData = record
+    { Pointer to the active screen:
+     * Note: if there are no open screens, thd_Screen will be NULL.
+     * thd_Width and thd_Height will then describe an NTSC 64$400
+     * screen.  Please scale accordingly.
+     }
+    thd_Screen      : Pointer;
+
+    { The width and height (measured in pixels of the active screen)
+     * that your are to scale to:
+     }
+    thd_Width,
+    thd_Height      : Cardinal;
+
+    { Non-zero if the screen or something about the screen
+     * changed since the last time you were invoked:
+     }
+    thd_ScreenChanged   : Longint;
+ end;
+
+
+{ ======================================================================== }
+{ === IntuiMessage ======================================================= }
+{ ======================================================================== }
+
+Type
+
+    pIntuiMessage = ^tIntuiMessage;
+    tIntuiMessage = record
+        ExecMessage     : tMessage;
+
+    { the Class bits correspond directly with the IDCMP Flags, except for the
+     * special bit LONELYMESSAGE (defined below)
+     }
+
+        IClass           : Cardinal;
+
+    { the Code field is for special values like MENU number }
+
+        Code            : Word;
+
+    { the Qualifier field is a copy of the current InputEvent's Qualifier }
+
+        Qualifier       : Word;
+
+    { IAddress contains particular addresses for Intuition functions, like
+     * the pointer to the Gadget or the Screen
+     }
+
+        IAddress        : Pointer;
+
+    { when getting mouse movement reports, any event you get will have the
+     * the mouse coordinates in these variables.  the coordinates are relative
+     * to the upper-left corner of your Window (GIMMEZEROZERO notwithstanding)
+     }
+
+        MouseX,
+        MouseY          : smallint;
+
+    { the time values are copies of the current system clock time.  Micros
+     * are in units of microseconds, Seconds in seconds.
+     }
+
+        Seconds,
+        Micros          : Cardinal;
+
+    { the IDCMPWindow variable will always have the Pointer of the Window of
+     * this IDCMP
+     }
+
+        IDCMPWindow     : Pointer;
+
+    { system-use variable }
+
+        SpecialLink     : pIntuiMessage;
+    end;
+
+{ New for V39:
+ * All IntuiMessages are now slightly extended.  The ExtIntuiMessage
+ * structure has an additional field for tablet data, which is usually
+ * NULL.  If a tablet driver which is sending IESUBCLASS_NEWTABLET
+ * events is installed in the system, windows with the WA_TabletMessages
+ * property set will find that eim_TabletData points to the TabletData
+ * structure.  Applications must first check that this field is non-NULL;
+ * it will be NULL for certain kinds of message, including mouse activity
+ * generated from other than the tablet (i.e. the keyboard equivalents
+ * or the mouse itself).
+ *
+ * NEVER EVER examine any extended fields when running under pre-V39!
+ *
+ * NOTE: This structure is subject to grow in the future.  Making
+ * assumptions about its size is A BAD IDEA.
+ }
+
+ pExtIntuiMessage = ^tExtIntuiMessage;
+ tExtIntuiMessage = record
+    eim_IntuiMessage  : tIntuiMessage;
+    eim_TabletData    : pTabletData;
+ end;
+
+
+CONST
+
+{ --- IDCMP Classes ------------------------------------------------------ }
+{ Please refer to the Autodoc for OpenWindow() and to the Rom Kernel
+ * Manual for full details on the IDCMP classes.
+ }
+ IDCMP_SIZEVERIFY      =  $00000001;
+ IDCMP_NEWSIZE         =  $00000002;
+ IDCMP_REFRESHWINDOW   =  $00000004;
+ IDCMP_MOUSEBUTTONS    =  $00000008;
+ IDCMP_MOUSEMOVE       =  $00000010;
+ IDCMP_GADGETDOWN      =  $00000020;
+ IDCMP_GADGETUP        =  $00000040;
+ IDCMP_REQSET          =  $00000080;
+ IDCMP_MENUPICK        =  $00000100;
+ IDCMP_CLOSEWINDOW     =  $00000200;
+ IDCMP_RAWKEY          =  $00000400;
+ IDCMP_REQVERIFY       =  $00000800;
+ IDCMP_REQCLEAR        =  $00001000;
+ IDCMP_MENUVERIFY      =  $00002000;
+ IDCMP_NEWPREFS        =  $00004000;
+ IDCMP_DISKINSERTED    =  $00008000;
+ IDCMP_DISKREMOVED     =  $00010000;
+ IDCMP_WBENCHMESSAGE   =  $00020000;  {  System use only         }
+ IDCMP_ACTIVEWINDOW    =  $00040000;
+ IDCMP_INACTIVEWINDOW  =  $00080000;
+ IDCMP_DELTAMOVE       =  $00100000;
+ IDCMP_VANILLAKEY      =  $00200000;
+ IDCMP_INTUITICKS      =  $00400000;
+{  for notifications from "boopsi" gadgets               }
+ IDCMP_IDCMPUPDATE     =  $00800000;  { new for V36      }
+{ for getting help key report during menu session        }
+ IDCMP_MENUHELP        =  $01000000;  { new for V36      }
+{ for notification of any move/size/zoom/change window   }
+ IDCMP_CHANGEWINDOW    =  $02000000;  { new for V36      }
+ IDCMP_GADGETHELP      =  $04000000;  { new for V39      }
+
+{ NOTEZ-BIEN:                          $80000000 is reserved for internal use   }
+
+{ the IDCMP Flags do not use this special bit, which is cleared when
+ * Intuition sends its special message to the Task, and set when Intuition
+ * gets its Message back from the Task.  Therefore, I can check here to
+ * find out fast whether or not this Message is available for me to send
+ }
+ IDCMP_LONELYMESSAGE   =  $80000000;
+
+
+{ --- IDCMP Codes -------------------------------------------------------- }
+{ This group of codes is for the IDCMP_CHANGEWINDOW message }
+ CWCODE_MOVESIZE = $0000;  { Window was moved and/or sized }
+ CWCODE_DEPTH    = $0001;  { Window was depth-arranged (new for V39) }
+
+{ This group of codes is for the IDCMP_MENUVERIFY function }
+ MENUHOT       =  $0001;  { IntuiWants verification OR MENUCANCEL    }
+ MENUCANCEL    =  $0002;  { HOT Reply of this cancels Menu operation }
+ MENUWAITING   =  $0003;  { Intuition simply wants a ReplyMsg() ASAP }
+
+{ These are internal tokens to represent state of verification attempts
+ * shown here as a clue.
+ }
+ OKOK          =  MENUHOT; { guy didn't care                      }
+ OKABORT       =  $0004;  { window rendered question moot        }
+ OKCANCEL      =  MENUCANCEL; { window sent cancel reply          }
+
+{ This group of codes is for the IDCMP_WBENCHMESSAGE messages }
+ WBENCHOPEN    =  $0001;
+ WBENCHCLOSE   =  $0002;
+
+
+{ A data structure common in V36 Intuition processing  }
+Type
+   pIBox = ^tIBox;
+   tIBox = record
+    Left,
+    Top,
+    Width,
+    Height : smallint;
+   END;
+
+
+{ ======================================================================== }
+{ === Window ============================================================= }
+{ ======================================================================== }
+
+Type
+
+    pWindow = ^tWindow;
+    tWindow = record
+        NextWindow      : pWindow;      { for the linked list in a screen }
+
+        LeftEdge,
+        TopEdge         : smallint;        { screen dimensions of window }
+        Width,
+        Height          : smallint;        { screen dimensions of window }
+
+        MouseY,
+        MouseX          : smallint;        { relative to upper-left of window }
+
+        MinWidth,
+        MinHeight       : smallint;        { minimum sizes }
+        MaxWidth,
+        MaxHeight       : smallint;        { maximum sizes }
+
+        Flags           : Cardinal;      { see below for defines }
+
+        MenuStrip       : pMenu;      { the strip of Menu headers }
+
+        Title           : PChar;       { the title text for this window }
+
+        FirstRequest    : pRequester; { all active Requesters }
+
+        DMRequest       : pRequester; { double-click Requester }
+
+        ReqCount        : smallint;        { count of reqs blocking Window }
+
+        WScreen         : Pointer;      { this Window's Screen }
+        RPort           : pRastPort;  { this Window's very own RastPort }
+
+    { the border variables describe the window border.   If you specify
+     * GIMMEZEROZERO when you open the window, then the upper-left of the
+     * ClipRect for this window will be upper-left of the BitMap (with correct
+     * offsets when in SuperBitMap mode; you MUST select GIMMEZEROZERO when
+     * using SuperBitMap).  If you don't specify ZeroZero, then you save
+     * memory (no allocation of RastPort, Layer, ClipRect and associated
+     * Bitmaps), but you also must offset all your writes by BorderTop,
+     * BorderLeft and do your own mini-clipping to prevent writing over the
+     * system gadgets
+     }
+
+        BorderLeft,
+        BorderTop,
+        BorderRight,
+        BorderBottom    : Shortint;
+        BorderRPort     : pRastPort;
+
+
+    { You supply a linked-list of Gadgets for your Window.
+     * This list DOES NOT include system gadgets.  You get the standard
+     * window system gadgets by setting flag-bits in the variable Flags (see
+     * the bit definitions below)
+     }
+
+        FirstGadget     : pGadget;
+
+    { these are for opening/closing the windows }
+
+        Parent,
+        Descendant      : pWindow;
+
+    { sprite data information for your own Pointer
+     * set these AFTER you Open the Window by calling SetPointer()
+     }
+
+        _Pointer         : Pointer;      { sprite data }
+        PtrHeight       : Shortint;         { sprite height (not including sprite padding) }
+        PtrWidth        : Shortint;         { sprite width (must be less than or equal to 16) }
+        XOffset,
+        YOffset         : Shortint;         { sprite offsets }
+
+    { the IDCMP Flags and User's and Intuition's Message Ports }
+        IDCMPFlags      : Cardinal;      { User-selected flags }
+        UserPort,
+        WindowPort      : pMsgPort;
+        MessageKey      : pIntuiMessage;
+
+        DetailPen,
+        BlockPen        : Byte; { for bar/border/gadget rendering }
+
+    { the CheckMark is a pointer to the imagery that will be used when
+     * rendering MenuItems of this Window that want to be checkmarked
+     * if this is equal to NULL, you'll get the default imagery
+     }
+
+        CheckMark       : pImage;
+
+        ScreenTitle     : PChar; { if non-null, Screen title when Window is active }
+
+    { These variables have the mouse coordinates relative to the
+     * inner-Window of GIMMEZEROZERO Windows.  This is compared with the
+     * MouseX and MouseY variables, which contain the mouse coordinates
+     * relative to the upper-left corner of the Window, GIMMEZEROZERO
+     * notwithstanding
+     }
+
+        GZZMouseX       : smallint;
+        GZZMouseY       : smallint;
+
+    { these variables contain the width and height of the inner-Window of
+     * GIMMEZEROZERO Windows
+     }
+
+        GZZWidth        : smallint;
+        GZZHeight       : smallint;
+
+        ExtData         : Pointer;
+
+        UserData        : Pointer;      { general-purpose pointer to User data extension }
+
+    {* jimm: NEW: 11/18/85: this pointer keeps a duplicate of what
+     * Window.RPort->Layer is _supposed_ to be pointing at
+     }
+
+        WLayer          : pLayer;
+
+    { jimm: NEW 1.2: need to keep track of the font that
+     * OpenWindow opened, in case user SetFont's into RastPort
+     }
+
+        IFont           : pTextFont;
+    {* (V36) another flag word (the Flags field is used up).
+     * At present, all flag values are system private.
+     * Until further notice, you may not change nor use this field.
+     *}
+        MoreFlags       : Cardinal;
+
+    {**** Data beyond this point are Intuition Private.  DO NOT USE ****}
+
+    end;
+
+CONST
+{ --- Flags requested at OpenWindow() time by the application --------- }
+ WFLG_SIZEGADGET   =  $00000001;  { include sizing system-gadget? }
+ WFLG_DRAGBAR      =  $00000002;  { include dragging system-gadget? }
+ WFLG_DEPTHGADGET  =  $00000004;  { include depth arrangement gadget? }
+ WFLG_CLOSEGADGET  =  $00000008;  { include close-box system-gadget? }
+
+ WFLG_SIZEBRIGHT   =  $00000010;  { size gadget uses right border }
+ WFLG_SIZEBBOTTOM  =  $00000020;  { size gadget uses bottom border }
+
+{ --- refresh modes ------------------------------------------------------ }
+{ combinations of the WFLG_REFRESHBITS select the refresh type }
+ WFLG_REFRESHBITS   = $000000C0;
+ WFLG_SMART_REFRESH = $00000000;
+ WFLG_SIMPLE_REFRESH= $00000040;
+ WFLG_SUPER_BITMAP  = $00000080;
+ WFLG_OTHER_REFRESH = $000000C0;
+
+ WFLG_BACKDROP      = $00000100;  { this is a backdrop window }
+
+ WFLG_REPORTMOUSE   = $00000200;  { to hear about every mouse move }
+
+ WFLG_GIMMEZEROZERO = $00000400;  { a GimmeZeroZero window       }
+
+ WFLG_BORDERLESS    = $00000800;  { to get a Window sans border }
+
+ WFLG_ACTIVATE      = $00001000;  { when Window opens, it's Active }
+
+
+{ --- Other User Flags --------------------------------------------------- }
+ WFLG_RMBTRAP       = $00010000;  { Catch RMB events for your own }
+ WFLG_NOCAREREFRESH = $00020000;  { not to be bothered with REFRESH }
+
+{ - V36 new Flags which the programmer may specify in NewWindow.Flags  }
+ WFLG_NW_EXTENDED   = $00040000;  { extension data provided      }
+                                        { see struct ExtNewWindow      }
+
+{ - V39 new Flags which the programmer may specify in NewWindow.Flags  }
+ WFLG_NEWLOOKMENUS  = $00200000;  { window has NewLook menus     }
+
+{ These flags are set only by Intuition.  YOU MAY NOT SET THEM YOURSELF! }
+ WFLG_WINDOWACTIVE  = $00002000;  { this window is the active one }
+ WFLG_INREQUEST     = $00004000;  { this window is in request mode }
+ WFLG_MENUSTATE     = $00008000;  { Window is active with Menus on }
+ WFLG_WINDOWREFRESH = $01000000;  { Window is currently refreshing }
+ WFLG_WBENCHWINDOW  = $02000000;  { WorkBench tool ONLY Window }
+ WFLG_WINDOWTICKED  = $04000000;  { only one timer tick at a time }
+
+{ --- V36 Flags to be set only by Intuition -------------------------  }
+ WFLG_VISITOR       = $08000000;  { visitor window               }
+ WFLG_ZOOMED        = $10000000;  { identifies "zoom state"      }
+ WFLG_HASZOOM       = $20000000;  { windowhas a zoom gadget      }
+
+{ --- Other Window Values ---------------------------------------------- }
+ DEFAULTMOUSEQUEUE  =     (5);     { no more mouse messages       }
+
+{ --- see struct IntuiMessage for the IDCMP Flag definitions ------------- }
+
+
+{ ======================================================================== }
+{ === NewWindow ========================================================== }
+{ ======================================================================== }
+
+Type
+
+    pNewWindow = ^tNewWindow;
+    tNewWindow = record
+        LeftEdge,
+        TopEdge         : smallint;        { screen dimensions of window }
+        Width,
+        Height          : smallint;        { screen dimensions of window }
+
+        DetailPen,
+        BlockPen        : Byte;         { for bar/border/gadget rendering }
+
+        IDCMPFlags      : Cardinal;      { User-selected IDCMP flags }
+
+        Flags           : Cardinal;      { see Window struct for defines }
+
+    { You supply a linked-list of Gadgets for your Window.
+     *  This list DOES NOT include system Gadgets.  You get the standard
+     *  system Window Gadgets by setting flag-bits in the variable Flags (see
+     *  the bit definitions under the Window structure definition)
+     }
+
+        FirstGadget     : pGadget;
+
+    { the CheckMark is a pointer to the imagery that will be used when
+     * rendering MenuItems of this Window that want to be checkmarked
+     * if this is equal to NULL, you'll get the default imagery
+     }
+
+        CheckMark       : pImage;
+
+        Title           : PChar;  { the title text for this window }
+
+    { the Screen pointer is used only if you've defined a CUSTOMSCREEN and
+     * want this Window to open in it.  If so, you pass the Pointer of the
+     * Custom Screen structure in this variable.  Otherwise, this variable
+     * is ignored and doesn't have to be initialized.
+     }
+
+        Screen          : Pointer;
+
+    { SUPER_BITMAP Window?  If so, put the Pointer of your BitMap structure
+     * in this variable.  If not, this variable is ignored and doesn't have
+     * to be initialized
+     }
+
+        BitMap          : pBitMap;
+
+    { the values describe the minimum and maximum sizes of your Windows.
+     * these matter only if you've chosen the WINDOWSIZING Gadget option,
+     * which means that you want to let the User to change the size of
+     * this Window.  You describe the minimum and maximum sizes that the
+     * Window can grow by setting these variables.  You can initialize
+     * any one these to zero, which will mean that you want to duplicate
+     * the setting for that dimension (if MinWidth == 0, MinWidth will be
+     * set to the opening Width of the Window).
+     * You can change these settings later using SetWindowLimits().
+     * If you haven't asked for a SIZING Gadget, you don't have to
+     * initialize any of these variables.
+     }
+
+        MinWidth,
+        MinHeight       : smallint;        { minimums }
+        MaxWidth,
+        MaxHeight       : smallint;        { maximums }
+
+    { the type variable describes the Screen in which you want this Window to
+     * open.  The type value can either be CUSTOMSCREEN or one of the
+     * system standard Screen Types such as WBENCHSCREEN.  See the
+     * type definitions under the Screen structure
+     }
+
+        WType           : Word;        { is "Type" in C includes }
+    end;
+
+
+{ The following structure is the future NewWindow.  Compatibility
+ * issues require that the size of NewWindow not change.
+ * Data in the common part (NewWindow) indicates the the extension
+ * fields are being used.
+ * NOTE WELL: This structure may be subject to future extension.
+ * Writing code depending on its size is not allowed.
+ }
+   pExtNewWindow = ^tExtNewWindow;
+   tExtNewWindow = record
+    LeftEdge, TopEdge : smallint;
+    Width, Height : smallint;
+
+    DetailPen, BlockPen : Byte;
+    IDCMPFlags    : Cardinal;
+    Flags         : Cardinal;
+    FirstGadget   : pGadget;
+
+    CheckMark     : pImage;
+
+    Title         : PChar;
+    WScreen       : Pointer;
+    WBitMap       : pBitMap;
+
+    MinWidth, MinHeight : smallint;
+    MaxWidth, MaxHeight : Word;
+
+    { the type variable describes the Screen in which you want this Window to
+     * open.  The type value can either be CUSTOMSCREEN or one of the
+     * system standard Screen Types such as WBENCHSCREEN.  See the
+     * type definitions under the Screen structure.
+     * A new possible value for this field is PUBLICSCREEN, which
+     * defines the window as a 'visitor' window.  See below for
+     * additional information provided.
+     }
+    WType  : Word;
+
+    { ------------------------------------------------------- *
+     * extensions for V36
+     * if the NewWindow Flag value WFLG_NW_EXTENDED is set, then
+     * this field is assumed to point to an array ( or chain of arrays)
+     * of TagItem structures.  See also ExtNewScreen for another
+     * use of TagItems to pass optional data.
+     *
+     * see below for tag values and the corresponding data.
+     }
+    Extension : pTagItem;
+  END;
+
+{
+ * The TagItem ID's (ti_Tag values) for OpenWindowTagList() follow.
+ * They are values in a TagItem array passed as extension/replacement
+ * values for the data in NewWindow.  OpenWindowTagList() can actually
+ * work well with a NULL NewWindow pointer.
+ }
+CONST
+ WA_Dummy     =   (TAG_USER + 99); { $80000063   }
+
+{ these tags simply override NewWindow parameters }
+ WA_Left               =  (WA_Dummy + $01);
+ WA_Top                =  (WA_Dummy + $02);
+ WA_Width              =  (WA_Dummy + $03);
+ WA_Height             =  (WA_Dummy + $04);
+ WA_DetailPen          =  (WA_Dummy + $05);
+ WA_BlockPen           =  (WA_Dummy + $06);
+ WA_IDCMP              =  (WA_Dummy + $07);
+                        { "bulk" initialization of NewWindow.Flags }
+ WA_Flags              =  (WA_Dummy + $08);
+ WA_Gadgets            =  (WA_Dummy + $09);
+ WA_Checkmark          =  (WA_Dummy + $0A);
+ WA_Title              =  (WA_Dummy + $0B);
+                        { means you don't have to call SetWindowTitles
+                         * after you open your window
+                         }
+ WA_ScreenTitle        =  (WA_Dummy + $0C);
+ WA_CustomScreen       =  (WA_Dummy + $0D);
+ WA_SuperBitMap        =  (WA_Dummy + $0E);
+                        { also implies WFLG_SUPER_BITMAP property      }
+ WA_MinWidth           =  (WA_Dummy + $0F);
+ WA_MinHeight          =  (WA_Dummy + $10);
+ WA_MaxWidth           =  (WA_Dummy + $11);
+ WA_MaxHeight          =  (WA_Dummy + $12);
+
+{ The following are specifications for new features    }
+
+ WA_InnerWidth         =  (WA_Dummy + $13);
+ WA_InnerHeight        =  (WA_Dummy + $14);
+                        { You can specify the dimensions of the interior
+                         * region of your window, independent of what
+                         * the border widths will be.  You probably want
+                         * to also specify WA_AutoAdjust to allow
+                         * Intuition to move your window or even
+                         * shrink it so that it is completely on screen.
+                         }
+
+ WA_PubScreenName      =  (WA_Dummy + $15);
+                        { declares that you want the window to open as
+                         * a visitor on the public screen whose name is
+                         * pointed to by (UBYTE *) ti_Data
+                         }
+ WA_PubScreen          =  (WA_Dummy + $16);
+                        { open as a visitor window on the public screen
+                         * whose Pointer is in (struct Screen *) ti_Data.
+                         * To ensure that this screen remains open, you
+                         * should either be the screen's owner, have a
+                         * window open on the screen, or use LockPubScreen().
+                         }
+ WA_PubScreenFallBack  =  (WA_Dummy + $17);
+                        { A Boolean, specifies whether a visitor window
+                         * should "fall back" to the default public screen
+                         * (or Workbench) if the named public screen isn't
+                         * available
+                         }
+ WA_WindowName         =  (WA_Dummy + $18);
+                        { not implemented      }
+ WA_Colors             =  (WA_Dummy + $19);
+                        { a ColorSpec array for colors to be set
+                         * when this window is active.  This is not
+                         * implemented, and may not be, since the default
+                         * values to restore would be hard to track.
+                         * We'd like to at least support per-window colors
+                         * for the mouse pointer sprite.
+                         }
+ WA_Zoom       =  (WA_Dummy + $1A);
+                        { ti_Data points to an array of four WORD's,
+                         * the initial Left/Top/Width/Height values of
+                         * the "alternate" zoom position/dimensions.
+                         * It also specifies that you want a Zoom gadget
+                         * for your window, whether or not you have a
+                         * sizing gadget.
+                         }
+ WA_MouseQueue         =  (WA_Dummy + $1B);
+                        { ti_Data contains initial value for the mouse
+                         * message backlog limit for this window.
+                         }
+ WA_BackFill           =  (WA_Dummy + $1C);
+                        { unimplemented at present: provides a "backfill
+                         * hook" for your window's layer.
+                         }
+ WA_RptQueue           =  (WA_Dummy + $1D);
+                        { initial value of repeat key backlog limit    }
+
+    { These Boolean tag items are alternatives to the NewWindow.Flags
+     * boolean flags with similar names.
+     }
+ WA_SizeGadget         =  (WA_Dummy + $1E);
+ WA_DragBar            =  (WA_Dummy + $1F);
+ WA_DepthGadget        =  (WA_Dummy + $20);
+ WA_CloseGadget        =  (WA_Dummy + $21);
+ WA_Backdrop           =  (WA_Dummy + $22);
+ WA_ReportMouse        =  (WA_Dummy + $23);
+ WA_NoCareRefresh      =  (WA_Dummy + $24);
+ WA_Borderless         =  (WA_Dummy + $25);
+ WA_Activate           =  (WA_Dummy + $26);
+ WA_RMBTrap            =  (WA_Dummy + $27);
+ WA_WBenchWindow       =  (WA_Dummy + $28);       { PRIVATE!! }
+ WA_SimpleRefresh      =  (WA_Dummy + $29);
+                        { only specify if TRUE }
+ WA_SmartRefresh       =  (WA_Dummy + $2A);
+                        { only specify if TRUE }
+ WA_SizeBRight         =  (WA_Dummy + $2B);
+ WA_SizeBBottom        =  (WA_Dummy + $2C);
+
+    { New Boolean properties   }
+ WA_AutoAdjust         =  (WA_Dummy + $2D);
+                        { shift or squeeze the window's position and
+                         * dimensions to fit it on screen.
+                         }
+
+ WA_GimmeZeroZero      =  (WA_Dummy + $2E);
+                        { equiv. to NewWindow.Flags WFLG_GIMMEZEROZERO }
+
+{ New for V37: WA_MenuHelp (ignored by V36) }
+ WA_MenuHelp           =  (WA_Dummy + $2F);
+                        { Enables IDCMP_MENUHELP:  Pressing HELP during menus
+                         * will return IDCMP_MENUHELP message.
+                         }
+
+{ New for V39:  (ignored by V37 and earlier) }
+ WA_NewLookMenus       =  (WA_Dummy + $30);
+                        { Set to TRUE if you want NewLook menus }
+ WA_AmigaKey           =  (WA_Dummy + $31);
+                        { Pointer to image for Amiga-key equiv in menus }
+ WA_NotifyDepth        =  (WA_Dummy + $32);
+                        { Requests IDCMP_CHANGEWINDOW message when
+                         * window is depth arranged
+                         * (imsg->Code = CWCODE_DEPTH)
+                         }
+
+{ WA_Dummy + $33 is obsolete }
+
+ WA_Pointer            =  (WA_Dummy + $34);
+                        { Allows you to specify a custom pointer
+                         * for your window.  ti_Data points to a
+                         * pointer object you obtained via
+                         * "pointerclass". NULL signifies the
+                         * default pointer.
+                         * This tag may be passed to OpenWindowTags()
+                         * or SetWindowPointer().
+                         }
+
+ WA_BusyPointer        =  (WA_Dummy + $35);
+                        { ti_Data is boolean.  Set to TRUE to
+                         * request the standard busy pointer.
+                         * This tag may be passed to OpenWindowTags()
+                         * or SetWindowPointer().
+                         }
+
+ WA_PointerDelay       =  (WA_Dummy + $36);
+                        { ti_Data is boolean.  Set to TRUE to
+                         * request that the changing of the
+                         * pointer be slightly delayed.  The change
+                         * will be called off if you call NewSetPointer()
+                         * before the delay expires.  This allows
+                         * you to post a busy-pointer even if you think
+                         * the busy-time may be very Word, without
+                         * fear of a flashing pointer.
+                         * This tag may be passed to OpenWindowTags()
+                         * or SetWindowPointer().
+                         }
+
+ WA_TabletMessages     =  (WA_Dummy + $37);
+                        { ti_Data is a boolean.  Set to TRUE to
+                         * request that tablet information be included
+                         * in IntuiMessages sent to your window.
+                         * Requires that something (i.e. a tablet driver)
+                         * feed IESUBCLASS_NEWTABLET InputEvents into
+                         * the system.  For a pointer to the TabletData,
+                         * examine the ExtIntuiMessage->eim_TabletData
+                         * field.  It is UNSAFE to check this field
+                         * when running on pre-V39 systems.  It's always
+                         * safe to check this field under V39 and up,
+                         * though it may be NULL.
+                         }
+
+ WA_HelpGroup          =  (WA_Dummy + $38);
+                        { When the active window has gadget help enabled,
+                         * other windows of the same HelpGroup number
+                         * will also get GadgetHelp.  This allows GadgetHelp
+                         * to work for multi-windowed applications.
+                         * Use GetGroupID() to get an ID number.  Pass
+                         * this number as ti_Data to all your windows.
+                         * See also the HelpControl() function.
+                         }
+
+ WA_HelpGroupWindow    =  (WA_Dummy + $39);
+                        { When the active window has gadget help enabled,
+                         * other windows of the same HelpGroup will also get
+                         * GadgetHelp.  This allows GadgetHelp to work
+                         * for multi-windowed applications.  As an alternative
+                         * to WA_HelpGroup, you can pass a pointer to any
+                         * other window of the same group to join its help
+                         * group.  Defaults to NULL, which has no effect.
+                         * See also the HelpControl() function.
+                         }
+
+
+{ HelpControl() flags:
+ *
+ * HC_GADGETHELP - Set this flag to enable Gadget-Help for one or more
+ * windows.
+ }
+
+ HC_GADGETHELP  = 1;
+
+
+{ ======================================================================== }
+{ === Remember =========================================================== }
+{ ======================================================================== }
+{ this structure is used for remembering what memory has been allocated to
+ * date by a given routine, so that a premature abort or systematic exit
+ * can deallocate memory cleanly, easily, and completely
+ }
+
+Type
+
+    pRemember = ^tRemember;
+    tRemember = record
+        NextRemember    : pRemember;
+        RememberSize    : Cardinal;
+        Memory          : Pointer;
+    end;
+
+
+{ === Color Spec ====================================================== }
+{ How to tell Intuition about RGB values for a color table entry. }
+
+  pColorSpec = ^tColorSpec;
+  tColorSpec = record
+    ColorIndex  : smallint;     { -1 terminates an array of ColorSpec  }
+    Red         : Word;     { only the _bottom_ 4 bits recognized }
+    Green       : Word;     { only the _bottom_ 4 bits recognized }
+    Blue        : Word;     { only the _bottom_ 4 bits recognized }
+  END;
+
+{ === Easy Requester Specification ======================================= }
+{ see also autodocs for EasyRequest and BuildEasyRequest       }
+{ NOTE: This structure may grow in size in the future          }
+
+   pEasyStruct = ^tEasyStruct;
+   tEasyStruct = record
+    es_StructSize   : Cardinal;  { should be sizeof (struct EasyStruct )}
+    es_Flags        : Cardinal;  { should be 0 for now                  }
+    es_Title        : PChar;   { title of requester window            }
+    es_TextFormat   : PChar;   { 'printf' style formatting string     }
+    es_GadgetFormat : PChar;   { 'printf' style formatting string   }
+   END;
+
+
+
+{ ======================================================================== }
+{ === Miscellaneous ====================================================== }
+{ ======================================================================== }
+CONST
+{ = MENU STUFF =========================================================== }
+    NOMENU      = $001F;
+    NOITEM      = $003F;
+    NOSUB       = $001F;
+    MENUNULL    = -1;
+
+
+{ = =RJ='s peculiarities ================================================= }
+
+{ these defines are for the COMMSEQ and CHECKIT menu stuff.  If CHECKIT,
+ * I'll use a generic Width (for all resolutions) for the CheckMark.
+ * If COMMSEQ, likewise I'll use this generic stuff
+ }
+
+    CHECKWIDTH          = 19;
+    COMMWIDTH           = 27;
+    LOWCHECKWIDTH       = 13;
+    LOWCOMMWIDTH        = 16;
+
+{ these are the AlertNumber defines.  if you are calling DisplayAlert()
+ * the AlertNumber you supply must have the ALERT_TYPE bits set to one
+ * of these patterns
+ }
+
+    ALERT_TYPE          = $80000000;
+    RECOVERY_ALERT      = $00000000;    { the system can recover from this }
+    DEADEND_ALERT       = $80000000;    { no recovery possible, this is it }
+
+
+{ When you're defining IntuiText for the Positive and Negative Gadgets
+ * created by a call to AutoRequest(), these defines will get you
+ * reasonable-looking text.  The only field without a define is the IText
+ * field; you decide what text goes with the Gadget
+ }
+
+    AUTOFRONTPEN        = 0;
+    AUTOBACKPEN         = 1;
+    AUTODRAWMODE        = JAM2;
+    AUTOLEFTEDGE        = 6;
+    AUTOTOPEDGE         = 3;
+
+{ -
+    AUTOITEXTFONT       = Nil;
+    AUTONEXTTEXT        = Nil;
+- }
+
+
+{ --- RAWMOUSE Codes and Qualifiers (Console OR IDCMP) ------------------- }
+
+
+    SELECTUP            = IECODE_LBUTTON + IECODE_UP_PREFIX;
+    SELECTDOWN          = IECODE_LBUTTON;
+    MENUUP              = IECODE_RBUTTON + IECODE_UP_PREFIX;
+    MENUDOWN            = IECODE_RBUTTON;
+    ALTLEFT             = IEQUALIFIER_LALT;
+    ALTRIGHT            = IEQUALIFIER_RALT;
+    AMIGALEFT           = IEQUALIFIER_LCOMMAND;
+    AMIGARIGHT          = IEQUALIFIER_RCOMMAND;
+    AMIGAKEYS           = AMIGALEFT + AMIGARIGHT;
+
+    CURSORUP            = $4C;
+    CURSORLEFT          = $4F;
+    CURSORRIGHT         = $4E;
+    CURSORDOWN          = $4D;
+    KEYCODE_Q           = $10;
+    KEYCODE_X           = $32;
+    KEYCODE_N           = $36;
+    KEYCODE_M           = $37;
+    KEYCODE_V           = $34;
+    KEYCODE_B           = $35;
+    KEYCODE_LESS        = $38;
+    KEYCODE_GREATER     = $39;
+
+{ these are the display modes for which we have corresponding parameter
+ *  settings in the config arrays
+ }
+CONST
+ DMODECOUNT    =  $0002;  { how many modes there are }
+ HIRESPICK     =  $0000;
+ LOWRESPICK    =  $0001;
+
+ EVENTMAX = 10;             { size of event array }
+
+{ these are the system Gadget defines }
+ RESCOUNT       = 2;
+ HIRESGADGET    = 0;
+ LOWRESGADGET   = 1;
+
+ GADGETCOUNT    = 8;
+ UPFRONTGADGET  = 0;
+ DOWNBACKGADGET = 1;
+ SIZEGADGET     = 2;
+ CLOSEGADGET    = 3;
+ DRAGGADGET     = 4;
+ SUPFRONTGADGET = 5;
+ SDOWNBACKGADGET= 6;
+ SDRAGGADGET    = 7;
+
+
+{ ======================================================================== }
+{ === DrawInfo ========================================================= }
+{ ======================================================================== }
+
+{ This is a packet of information for graphics rendering.  It originates
+ * with a Screen, and is gotten using GetScreenDrawInfo( screen );
+ }
+
+{ If you find dri_Version >= DRI_VERSION, you know this structure
+ * has at least the fields defined in this version of the include file
+ }
+CONST
+ RI_VERSION  =    (1);     { obsolete, will be removed            }
+ DRI_VERSION =    (1);
+
+Type
+
+ pDrawInfo = ^tDrawInfo;
+ tDrawInfo = record
+    dri_Version : Word;    { will be  DRI_VERSION                 }
+    dri_NumPens : Word;    { guaranteed to be >= numDrIPens       }
+    dri_Pens    : Pointer;  { pointer to pen array                 }
+
+    dri_Font    : pTextFont;      { screen default font          }
+    dri_Depth   : Word;            { (initial) depth of screen bitmap     }
+
+    dri_Resolution : record      { from DisplayInfo database for initial display mode }
+                   x : word;
+                   y : word;
+                   end;
+
+    dri_Flags : Cardinal;              { defined below                }
+{ New for V39: dri_CheckMark, dri_AmigaKey. }
+    dri_CheckMark : pImage; { ImagePtr }         { pointer to scaled checkmark image
+                                                  * Will be NULL if DRI_VERSION < 2
+                                                  }
+    dri_AmigaKey  : pImage; { ImagePtr }    { pointer to scaled Amiga-key image
+                                             * Will be NULL if DRI_VERSION < 2
+                                             }
+
+    dri_Reserved : Array[0..4] of Cardinal;        { avoid recompilation ;^)      }
+ END;
+
+CONST
+ DRIF_NEWLOOK =   $00000001;      { specified SA_Pens, full treatment }
+
+{ rendering pen number indexes into DrawInfo.dri_Pens[]        }
+ DETAILPEN    =    ($0000);       { compatible Intuition rendering pens  }
+ BLOCKPEN     =    ($0001);       { compatible Intuition rendering pens  }
+ TEXTPEN      =    ($0002);       { text on background                   }
+ SHINEPEN     =    ($0003);       { bright edge on 3D objects            }
+ SHADOWPEN    =    ($0004);       { dark edge on 3D objects              }
+ FILLPEN      =    ($0005);       { active-window/selected-gadget fill   }
+ FILLTEXTPEN  =    ($0006);       { text over FILLPEN                    }
+ BACKGROUNDPEN =   ($0007);       { always color 0                       }
+ HIGHLIGHTTEXTPEN = ($0008);       { special color text, on background    }
+{ New for V39, only present if DRI_VERSION >= 2: }
+ BARDETAILPEN   =  ($0009);       { text/detail in screen-bar/menus }
+ BARBLOCKPEN    =  ($000A);       { screen-bar/menus fill }
+ BARTRIMPEN     =  ($000B);       { trim under screen-bar }
+
+ NUMDRIPENS   =    ($0009);
+
+{ New for V39:  It is sometimes useful to specify that a pen value
+ * is to be the complement of color zero to three.  The "magic" numbers
+ * serve that purpose:
+ }
+ PEN_C3        =  $FEFC;          { Complement of color 3 }
+ PEN_C2        =  $FEFD;          { Complement of color 2 }
+ PEN_C1        =  $FEFE;          { Complement of color 1 }
+ PEN_C0        =  $FEFF;          { Complement of color 0 }
+
+{ ======================================================================== }
+{ === Screen ============================================================= }
+{ ======================================================================== }
+
+Type
+
+    pScreen = ^tScreen;
+    tScreen = record
+        NextScreen      : pScreen;      { linked list of screens }
+        FirstWindow     : pWindow;      { linked list Screen's Windows }
+
+        LeftEdge,
+        TopEdge         : smallint;        { parameters of the screen }
+        Width,
+        Height          : smallint;        { parameters of the screen }
+
+        MouseY,
+        MouseX          : smallint;        { position relative to upper-left }
+
+        Flags           : Word;        { see definitions below }
+
+        Title           : PChar;       { null-terminated Title text }
+        DefaultTitle    : PChar;       { for Windows without ScreenTitle }
+
+    { Bar sizes for this Screen and all Window's in this Screen }
+        BarHeight,
+        BarVBorder,
+        BarHBorder,
+        MenuVBorder,
+        MenuHBorder     : Shortint;
+        WBorTop,
+        WBorLeft,
+        WBorRight,
+        WBorBottom      : Shortint;
+
+        Font            : pTextAttr;  { this screen's default font       }
+
+    { the display data structures for this Screen (note the prefix S)}
+        ViewPort        : tViewPort;     { describing the Screen's display }
+        RastPort        : tRastPort;     { describing Screen rendering      }
+        BitMap          : tBitMap;       { extra copy of RastPort BitMap   }
+        LayerInfo       : tLayer_Info;   { each screen gets a LayerInfo     }
+
+    { You supply a linked-list of Gadgets for your Screen.
+     *  This list DOES NOT include system Gadgets.  You get the standard
+     *  system Screen Gadgets by default
+     }
+
+        FirstGadget     : pGadget;
+
+        DetailPen,
+        BlockPen        : Byte;         { for bar/border/gadget rendering }
+
+    { the following variable(s) are maintained by Intuition to support the
+     * DisplayBeep() color flashing technique
+     }
+        SaveColor0      : Word;
+
+    { This layer is for the Screen and Menu bars }
+        BarLayer        : pLayer;
+
+        ExtData         : Pointer;
+        UserData        : Pointer;
+                        { general-purpose pointer to User data extension }
+    {**** Data below this point are SYSTEM PRIVATE ****}
+
+    end;
+
+Const
+
+{ The screen flags have the suffix "_f" added to avoid conflicts with
+  routine names. }
+
+{ --- FLAGS SET BY INTUITION --------------------------------------------- }
+{ The SCREENTYPE bits are reserved for describing various Screen types
+ * available under Intuition.
+ }
+    SCREENTYPE_f        = $000F;        { all the screens types available       }
+{ --- the definitions for the Screen Type ------------------------------- }
+    WBENCHSCREEN_f      = $0001;        { Ta Da!  The Workbench         }
+    CUSTOMSCREEN_f      = $000F;        { for that special look         }
+
+    SHOWTITLE_f         = $0010;        { this gets set by a call to ShowTitle() }
+
+    BEEPING_f           = $0020;        { set when Screen is beeping            }
+
+    CUSTOMBITMAP_f      = $0040;        { if you are supplying your own BitMap }
+
+    SCREENBEHIND_f      = $0080;        { if you want your screen to open behind
+                                         * already open screens
+                                         }
+    SCREENQUIET_f       = $0100;        { if you do not want Intuition to render
+                                         * into your screen (gadgets, title)     }
+    SCREENHIRES         = $0200;        { do no use lowres gadgets (private)       }
+
+    NS_EXTENDED         = $1000;          { ExtNewScreen.Extension is valid      }
+    { V36 applications can use OpenScreenTagList() instead of NS_EXTENDED  }
+
+{ New for V39: }
+    PENSHARED           = $0400;  { Screen opener set (SA_SharePens,TRUE) }
+
+
+    AUTOSCROLL          = $4000;  { screen is to autoscoll               }
+
+    STDSCREENHEIGHT     = -1;           { supply in NewScreen.Height            }
+    STDSCREENWIDTH      = -1;           { supply in NewScreen.Width             }
+
+
+
+{
+ * Screen attribute tag ID's.  These are used in the ti_Tag field of
+ * TagItem arrays passed to OpenScreenTagList() (or in the
+ * ExtNewScreen.Extension field).
+ }
+
+{ Screen attribute tags.  Please use these versions, not those in
+ * iobsolete.h.
+ }
+CONST
+  SA_Dummy    =    (TAG_USER + 32);
+{
+ * these items specify items equivalent to fields in NewScreen
+ }
+ SA_Left     =    (SA_Dummy + $0001);
+ SA_Top      =    (SA_Dummy + $0002);
+ SA_Width    =    (SA_Dummy + $0003);
+ SA_Height   =    (SA_Dummy + $0004);
+                        { traditional screen positions and dimensions  }
+ SA_Depth    =    (SA_Dummy + $0005);
+                        { screen bitmap depth                          }
+ SA_DetailPen=    (SA_Dummy + $0006);
+                        { serves as default for windows, too           }
+ SA_BlockPen =    (SA_Dummy + $0007);
+ SA_Title    =    (SA_Dummy + $0008);
+                        { default screen title                         }
+ SA_Colors   =    (SA_Dummy + $0009);
+                        { ti_Data is an array of struct ColorSpec,
+                         * terminated by ColorIndex = -1.  Specifies
+                         * initial screen palette colors.
+                         }
+ SA_ErrorCode=    (SA_Dummy + $000A);
+                        { ti_Data points to LONG error code (values below)}
+ SA_Font     =    (SA_Dummy + $000B);
+                        { equiv. to NewScreen.Font                     }
+ SA_SysFont  =    (SA_Dummy + $000C);
+                        { Selects one of the preferences system fonts:
+                         *      0 - old DefaultFont, fixed-width
+                         *      1 - WB Screen preferred font
+                         }
+ SA_Type     =    (SA_Dummy + $000D);
+                        { equiv. to NewScreen.Type                     }
+ SA_BitMap   =    (SA_Dummy + $000E);
+                        { ti_Data is pointer to custom BitMap.  This
+                         * implies type of CUSTOMBITMAP
+                         }
+ SA_PubName  =    (SA_Dummy + $000F);
+                        { presence of this tag means that the screen
+                         * is to be a public screen.  Please specify
+                         * BEFORE the two tags below
+                         }
+ SA_PubSig   =    (SA_Dummy + $0010);
+ SA_PubTask  =    (SA_Dummy + $0011);
+                        { Task ID and signal for being notified that
+                         * the last window has closed on a public screen.
+                         }
+ SA_DisplayID=    (SA_Dummy + $0012);
+                        { ti_Data is new extended display ID from
+                         * <graphics/displayinfo.h>.
+                         }
+ SA_DClip    =    (SA_Dummy + $0013);
+                        { ti_Data points to a rectangle which defines
+                         * screen display clip region
+                         }
+ SA_Overscan =    (SA_Dummy + $0014);
+                        { was S_STDDCLIP.  Set to one of the OSCAN_
+                         * specifiers below to get a system standard
+                         * overscan region for your display clip,
+                         * screen dimensions (unless otherwise specified),
+                         * and automatically centered position (partial
+                         * support only so far).
+                         * If you use this, you shouldn't specify
+                         * SA_DClip.  SA_Overscan is for "standard"
+                         * overscan dimensions, SA_DClip is for
+                         * your custom numeric specifications.
+                         }
+ SA_Obsolete1=    (SA_Dummy + $0015);
+                        { obsolete S_MONITORNAME                       }
+
+{* booleans *}
+ SA_ShowTitle  =  (SA_Dummy + $0016);
+                        { boolean equivalent to flag SHOWTITLE         }
+ SA_Behind     =  (SA_Dummy + $0017);
+                        { boolean equivalent to flag SCREENBEHIND      }
+ SA_Quiet      =  (SA_Dummy + $0018);
+                        { boolean equivalent to flag SCREENQUIET       }
+ SA_AutoScroll =  (SA_Dummy + $0019);
+                        { boolean equivalent to flag AUTOSCROLL        }
+ SA_Pens       =  (SA_Dummy + $001A);
+                        { pointer to ~0 terminated UWORD array, as
+                         * found in struct DrawInfo
+                         }
+ SA_FullPalette=  (SA_Dummy + $001B);
+                        { boolean: initialize color table to entire
+                         *  preferences palette (32 for V36), rather
+                         * than compatible pens 0-3, 17-19, with
+                         * remaining palette as returned by GetColorMap()
+                         }
+
+ SA_ColorMapEntries = (SA_Dummy + $001C);
+                        { New for V39:
+                         * Allows you to override the number of entries
+                         * in the ColorMap for your screen.  Intuition
+                         * normally allocates (1<<depth) or 32, whichever
+                         * is more, but you may require even more if you
+                         * use certain V39 graphics.library features
+                         * (eg. palette-banking).
+                         }
+
+ SA_Parent      = (SA_Dummy + $001D);
+                        { New for V39:
+                         * ti_Data is a pointer to a "parent" screen to
+                         * attach this one to.  Attached screens slide
+                         * and depth-arrange together.
+                         }
+
+ SA_Draggable   = (SA_Dummy + $001E);
+                        { New for V39:
+                         * Boolean tag allowing non-draggable screens.
+                         * Do not use without good reason!
+                         * (Defaults to TRUE).
+                         }
+
+ SA_Exclusive   = (SA_Dummy + $001F);
+                        { New for V39:
+                         * Boolean tag allowing screens that won't share
+                         * the display.  Use sparingly!  Starting with 3.01,
+                         * attached screens may be SA_Exclusive.  Setting
+                         * SA_Exclusive for each screen will produce an
+                         * exclusive family.   (Defaults to FALSE).
+                         }
+
+ SA_SharePens   = (SA_Dummy + $0020);
+                        { New for V39:
+                         * For those pens in the screen's DrawInfo->dri_Pens,
+                         * Intuition obtains them in shared mode (see
+                         * graphics.library/ObtainPen()).  For compatibility,
+                         * Intuition obtains the other pens of a public
+                         * screen as PEN_EXCLUSIVE.  Screens that wish to
+                         * manage the pens themselves should generally set
+                         * this tag to TRUE.  This instructs Intuition to
+                         * leave the other pens unallocated.
+                         }
+
+ SA_BackFill    = (SA_Dummy + $0021);
+                        { New for V39:
+                         * provides a "backfill hook" for your screen's
+                         * Layer_Info.
+                         * See layers.library/InstallLayerInfoHook()
+                         }
+
+ SA_Interleaved = (SA_Dummy + $0022);
+                        { New for V39:
+                         * Boolean tag requesting that the bitmap
+                         * allocated for you be interleaved.
+                         * (Defaults to FALSE).
+                         }
+
+ SA_Colors32    = (SA_Dummy + $0023);
+                        { New for V39:
+                         * Tag to set the screen's initial palette colors
+                         * at 32 bits-per-gun.  ti_Data is a pointer
+                         * to a table to be passed to the
+                         * graphics.library/LoadRGB32() function.
+                         * This format supports both runs of color
+                         * registers and sparse registers.  See the
+                         * autodoc for that function for full details.
+                         * Any color set here has precedence over
+                         * the same register set by SA_Colors.
+                         }
+
+ SA_VideoControl = (SA_Dummy + $0024);
+                        { New for V39:
+                         * ti_Data is a pointer to a taglist that Intuition
+                         * will pass to graphics.library/VideoControl(),
+                         * upon opening the screen.
+                         }
+
+ SA_FrontChild  = (SA_Dummy + $0025);
+                        { New for V39:
+                         * ti_Data is a pointer to an already open screen
+                         * that is to be the child of the screen being
+                         * opened.  The child screen will be moved to the
+                         * front of its family.
+                         }
+
+ SA_BackChild   = (SA_Dummy + $0026);
+                        { New for V39:
+                         * ti_Data is a pointer to an already open screen
+                         * that is to be the child of the screen being
+                         * opened.  The child screen will be moved to the
+                         * back of its family.
+                         }
+
+ SA_LikeWorkbench     =   (SA_Dummy + $0027);
+                        { New for V39:
+                         * Set ti_Data to 1 to request a screen which
+                         * is just like the Workbench.  This gives
+                         * you the same screen mode, depth, size,
+                         * colors, etc., as the Workbench screen.
+                         }
+
+ SA_Reserved          =   (SA_Dummy + $0028);
+                        { Reserved for private Intuition use }
+
+ SA_MinimizeISG       =   (SA_Dummy + $0029);
+                        { New for V40:
+                         * For compatibility, Intuition always ensures
+                         * that the inter-screen gap is at least three
+                         * non-interlaced lines.  If your application
+                         * would look best with the smallest possible
+                         * inter-screen gap, set ti_Data to TRUE.
+                         * If you use the new graphics VideoControl()
+                         * VC_NoColorPaletteLoad tag for your screen's
+                         * ViewPort, you should also set this tag.
+                          }
+
+
+{ this is an obsolete tag included only for compatibility with V35
+ * interim release for the A2024 and Viking monitors
+ }
+ NSTAG_EXT_VPMODE = (TAG_USER + 1);
+
+
+{ OpenScreen error codes, which are returned in the (optional) LONG
+ * pointed to by ti_Data for the SA_ErrorCode tag item
+ }
+ OSERR_NOMONITOR   = (1);     { named monitor spec not available     }
+ OSERR_NOCHIPS     = (2);     { you need newer custom chips          }
+ OSERR_NOMEM       = (3);     { couldn't get normal memory           }
+ OSERR_NOCHIPMEM   = (4);     { couldn't get chipmem                 }
+ OSERR_PUBNOTUNIQUE= (5);     { public screen name already used      }
+ OSERR_UNKNOWNMODE = (6);     { don't recognize mode asked for       }
+
+{ ======================================================================== }
+{ === NewScreen ========================================================== }
+{ ======================================================================== }
+
+Type
+
+    pNewScreen = ^tNewScreen;
+    tNewScreen = record
+        LeftEdge,
+        TopEdge,
+        Width,
+        Height,
+        Depth           : smallint;        { screen dimensions }
+
+        DetailPen,
+        BlockPen        : Byte;         { for bar/border/gadget rendering }
+
+        ViewModes       : Word;        { the Modes for the ViewPort (and View) }
+
+        SType           : Word;        { the Screen type (see defines above) }
+
+        Font            : pTextAttr;  { this Screen's default text attributes }
+
+        DefaultTitle    : PChar;       { the default title for this Screen }
+
+        Gadgets         : pGadget;      { your own Gadgets for this Screen }
+
+    { if you are opening a CUSTOMSCREEN and already have a BitMap
+     * that you want used for your Screen, you set the flags CUSTOMBITMAP in
+     * the Type field and you set this variable to point to your BitMap
+     * structure.  The structure will be copied into your Screen structure,
+     * after which you may discard your own BitMap if you want
+     }
+
+        CustomBitMap    : pBitMap;
+    end;
+
+
+type
+
+ pExtNewScreen = ^tExtNewScreen;
+ tExtNewScreen = record
+  LeftEdge, TopEdge, Width, Height, Depth : smallint;
+  DetailPen, BlockPen : Byte;
+  ViewModes : Word;
+  ens_Type : Word;     { Type in C-Includes }
+  Font : pTextAttr;
+  DefaultTitle : PChar;
+  Gadgets : pGadget;
+  CustomBitMap : pBitMap;
+  Extension : pTagItem;
+ END;
+
+
+CONST
+{ === Overscan Types ===       }
+ OSCAN_TEXT     = (1);     { entirely visible     }
+ OSCAN_STANDARD = (2);     { just past edges      }
+ OSCAN_MAX      = (3);     { as much as possible  }
+ OSCAN_VIDEO    = (4);     { even more than is possible   }
+
+
+{ === Public Shared Screen Node ===    }
+
+{ This is the representative of a public shared screen.
+ * This is an internal data structure, but some functions may
+ * present a copy of it to the calling application.  In that case,
+ * be aware that the screen pointer of the structure can NOT be
+ * used safely, since there is no guarantee that the referenced
+ * screen will remain open and a valid data structure.
+ *
+ * Never change one of these.
+ }
+
+Type
+   pPubScreenNode = ^tPubScreenNode;
+   tPubScreenNode = record
+    psn_Node    : tNode;       { ln_Name is screen name }
+    psn_Screen  : pScreen;
+    psn_Flags   : Word;      { below                }
+    psn_Size    : smallint;      { includes name buffer }
+    psn_VisitorCount  : smallint; { how many visitor windows }
+    psn_SigTask : pTask;    { who to signal when visitors gone }
+    psn_SigBit  : Byte;     { which signal }
+   END;
+
+CONST
+ PSNF_PRIVATE  =  ($0001);
+
+ MAXPUBSCREENNAME  =      (139);   { names no longer, please      }
+
+{ pub screen modes     }
+ SHANGHAI      =  $0001;  { put workbench windows on pub screen }
+ POPPUBSCREEN  =  $0002;  { pop pub screen to front when visitor opens }
+
+{ New for V39:  Intuition has new screen depth-arrangement and movement
+ * functions called ScreenDepth() and ScreenPosition() respectively.
+ * These functions permit the old behavior of ScreenToFront(),
+ * ScreenToBack(), and MoveScreen().  ScreenDepth() also allows
+ * independent depth control of attached screens.  ScreenPosition()
+ * optionally allows positioning screens even though they were opened
+ * (SA_Draggable,FALSE).
+ }
+
+{ For ScreenDepth(), specify one of SDEPTH_TOFRONT or SDEPTH_TOBACK,
+ * and optionally also SDEPTH_INFAMILY.
+ *
+ * NOTE: ONLY THE OWNER OF THE SCREEN should ever specify
+ * SDEPTH_INFAMILY.  Commodities, "input helper" programs,
+ * or any other program that did not open a screen should never
+ * use that flag.  (Note that this is a style-behavior
+ * requirement;  there is no technical requirement that the
+ * task calling this function need be the task which opened
+ * the screen).
+ }
+
+ SDEPTH_TOFRONT        =  (0);     { Bring screen to front }
+ SDEPTH_TOBACK         =  (1);     { Send screen to back }
+ SDEPTH_INFAMILY       =  (2);     { Move an attached screen with
+                                         * respect to other screens of
+                                         * its family
+                                         }
+
+{ Here's an obsolete name equivalent to SDEPTH_INFAMILY: }
+ SDEPTH_CHILDONLY      =  SDEPTH_INFAMILY;
+
+
+{ For ScreenPosition(), specify one of SPOS_RELATIVE, SPOS_ABSOLUTE,
+ * or SPOS_MAKEVISIBLE to describe the kind of screen positioning you
+ * wish to perform:
+ *
+ * SPOS_RELATIVE: The x1 and y1 parameters to ScreenPosition() describe
+ *      the offset in coordinates you wish to move the screen by.
+ * SPOS_ABSOLUTE: The x1 and y1 parameters to ScreenPosition() describe
+ *      the absolute coordinates you wish to move the screen to.
+ * SPOS_MAKEVISIBLE: (x1,y1)-(x2,y2) describes a rectangle on the
+ *      screen which you would like autoscrolled into view.
+ *
+ * You may additionally set SPOS_FORCEDRAG along with any of the
+ * above.  Set this if you wish to reposition an (SA_Draggable,FALSE)
+ * screen that you opened.
+ *
+ * NOTE: ONLY THE OWNER OF THE SCREEN should ever specify
+ * SPOS_FORCEDRAG.  Commodities, "input helper" programs,
+ * or any other program that did not open a screen should never
+ * use that flag.
+ }
+
+ SPOS_RELATIVE         =  (0);     { Coordinates are relative }
+
+ SPOS_ABSOLUTE         =  (1);     { Coordinates are expressed as
+                                         * absolutes, not relatives.
+                                         }
+
+ SPOS_MAKEVISIBLE      =  (2);     { Coordinates describe a box on
+                                         * the screen you wish to be
+                                         * made visible by autoscrolling
+                                         }
+
+ SPOS_FORCEDRAG        =  (4);     { Move non-draggable screen }
+
+{ New for V39: Intuition supports double-buffering in screens,
+ * with friendly interaction with menus and certain gadgets.
+ * For each buffer, you need to get one of these structures
+ * from the AllocScreenBuffer() call.  Never allocate your
+ * own ScreenBuffer structures!
+ *
+ * The sb_DBufInfo field is for your use.  See the graphics.library
+ * AllocDBufInfo() autodoc for details.
+ }
+Type
+
+ pScreenBuffer = ^tScreenBuffer;
+ tScreenBuffer = record
+    sb_BitMap  : pBitMap;           { BitMap of this buffer }
+    sb_DBufInfo : pDBufInfo;       { DBufInfo for this buffer }
+ end;
+
+const
+{ These are the flags that may be passed to AllocScreenBuffer().
+ }
+ SB_SCREEN_BITMAP      =  1;
+ SB_COPY_BITMAP        =  2;
+
+
+{ ======================================================================== }
+{ === Preferences ======================================================== }
+{ ======================================================================== }
+
+Const
+
+{ these are the definitions for the printer configurations }
+    FILENAME_SIZE       = 30;           { Filename size }
+
+    POINTERSIZE         = (1 + 16 + 1) * 2;     { Size of Pointer data buffer }
+
+{ These defines are for the default font size.   These actually describe the
+ * height of the defaults fonts.  The default font type is the topaz
+ * font, which is a fixed width font that can be used in either
+ * eighty-column or sixty-column mode.  The Preferences structure reflects
+ * which is currently selected by the value found in the variable FontSize,
+ * which may have either of the values defined below.  These values actually
+ * are used to select the height of the default font.  By changing the
+ * height, the resolution of the font changes as well.
+ }
+    TOPAZ_EIGHTY        = 8;
+    TOPAZ_SIXTY         = 9;
+
+Type
+
+    pPreferences = ^tPreferences;
+    tPreferences = record
+    { the default font height }
+        FontHeight      : Shortint;         { height for system default font  }
+
+    { constant describing what's hooked up to the port }
+        PrinterPort     : Byte;         { printer port connection     }
+
+    { the baud rate of the port }
+        BaudRate        : Word;        { baud rate for the serial port   }
+
+    { various timing rates }
+        KeyRptSpeed     : ttimeval;      { repeat speed for keyboard       }
+        KeyRptDelay     : ttimeval;      { Delay before keys repeat             }
+        DoubleClick     : ttimeval;      { Interval allowed between clicks }
+
+    { Intuition Pointer data }
+        PointerMatrix   : Array [0..POINTERSIZE-1] of Word;
+                                        { Definition of pointer sprite     }
+        XOffset         : Shortint;         { X-Offset for active 'bit'       }
+        YOffset         : Shortint;         { Y-Offset for active 'bit'       }
+        color17         : Word;        {*********************************}
+        color18         : Word;        { Colours for sprite pointer      }
+        color19         : Word;        {*********************************}
+        PointerTicks    : Word;        { Sensitivity of the pointer       }
+
+    { Workbench Screen colors }
+        color0          : Word;        {*********************************}
+        color1          : Word;        {   Standard default colours      }
+        color2          : Word;        {   Used in the Workbench         }
+        color3          : Word;        {*********************************}
+
+    { positioning data for the Intuition View }
+        ViewXOffset     : Shortint;         { Offset for top lefthand corner  }
+        ViewYOffset     : Shortint;         { X and Y dimensions           }
+        ViewInitX,
+        ViewInitY       : smallint;        { View initial offset values      }
+
+        EnableCLI       : Boolean;      { CLI availability switch }
+
+    { printer configurations }
+        PrinterType     : Word;        { printer type                     }
+        PrinterFilename : Array [0..FILENAME_SIZE-1] of Char;
+                                        { file for printer         }
+
+    { print format and quality configurations }
+        PrintPitch      : Word;        { print pitch              }
+        PrintQuality    : Word;        { print quality    }
+        PrintSpacing    : Word;        { number of lines per inch    }
+        PrintLeftMargin : Word;        { left margin in characters        }
+        PrintRightMargin : Word;       { right margin in characters       }
+        PrintImage      : Word;        { positive or negative         }
+        PrintAspect     : Word;        { horizontal or vertical      }
+        PrintShade      : Word;        { b&w, half-tone, or color    }
+        PrintThreshold  : smallint;        { darkness ctrl for b/w dumps      }
+
+    { print paper descriptors }
+        PaperSize       : Word;        { paper size               }
+        PaperLength     : Word;        { paper length in number of lines }
+        PaperType       : Word;        { continuous or single sheet       }
+
+    { Serial device settings: These are six nibble-fields in three bytes }
+    { (these look a little strange so the defaults will map out to zero) }
+        SerRWBits       : Byte;
+                             { upper nibble = (8-number of read bits)     }
+                             { lower nibble = (8-number of write bits)    }
+        SerStopBuf      : Byte;
+                             { upper nibble = (number of stop bits - 1)  }
+                             { lower nibble = (table value for BufSize)  }
+        SerParShk       : Byte;
+                             { upper nibble = (value for Parity setting) }
+                             { lower nibble = (value for Handshake mode) }
+        LaceWB          : Byte;         { if workbench is to be interlaced      }
+
+        WorkName        : Array [0..FILENAME_SIZE-1] of Char;
+                                        { temp file for printer         }
+
+        RowSizeChange   : Shortint;
+        ColumnSizeChange : Shortint;
+
+        PrintFlags      : Word;        { user preference flags }
+        PrintMaxWidth   : Word;        { max width of printed picture in 10ths/inch }
+        PrintMaxHeight  : Word;        { max height of printed picture in 10ths/inch }
+        PrintDensity    : Byte;         { print density }
+        PrintXOffset    : Byte;         { offset of printed picture in 10ths/inch }
+
+        wb_Width        : Word;        { override default workbench width       }
+        wb_Height       : Word;        { override default workbench height }
+        wb_Depth        : Byte;         { override default workbench depth       }
+
+        ext_size        : Byte;         { extension information -- do not touch! }
+                            { extension size in blocks of 64 bytes }
+    end;
+
+Const
+
+{ Workbench Interlace (use one bit) }
+    LACEWB              = $01;
+    LW_RESERVED         = 1;     { internal use only }
+
+{ PrinterPort }
+    PARALLEL_PRINTER    = $00;
+    SERIAL_PRINTER      = $01;
+
+{ BaudRate }
+    BAUD_110            = $00;
+    BAUD_300            = $01;
+    BAUD_1200           = $02;
+    BAUD_2400           = $03;
+    BAUD_4800           = $04;
+    BAUD_9600           = $05;
+    BAUD_19200          = $06;
+    BAUD_MIDI           = $07;
+
+{ PaperType }
+    FANFOLD             = $00;
+    SINGLE              = $80;
+
+{ PrintPitch }
+    PICA                = $000;
+    ELITE               = $400;
+    FINE                = $800;
+
+{ PrintQuality }
+    DRAFT               = $000;
+    LETTER              = $100;
+
+{ PrintSpacing }
+    SIX_LPI             = $000;
+    EIGHT_LPI           = $200;
+
+{ Print Image }
+    IMAGE_POSITIVE      = $00;
+    IMAGE_NEGATIVE      = $01;
+
+{ PrintAspect }
+    ASPECT_HORIZ        = $00;
+    ASPECT_VERT         = $01;
+
+{ PrintShade }
+    SHADE_BW            = $00;
+    SHADE_GREYSCALE     = $01;
+    SHADE_COLOR         = $02;
+
+{ PaperSize }
+    US_LETTER           = $00;
+    US_LEGAL            = $10;
+    N_TRACTOR           = $20;
+    W_TRACTOR           = $30;
+    CUSTOM_PAPER        = $40;
+
+{ New PaperSizes for V36: }
+ EURO_A0 = $50;            { European size A0: 841 x 1189 }
+ EURO_A1 = $60;            { European size A1: 594 x 841 }
+ EURO_A2 = $70;            { European size A2: 420 x 594 }
+ EURO_A3 = $80;            { European size A3: 297 x 420 }
+ EURO_A4 = $90;            { European size A4: 210 x 297 }
+ EURO_A5 = $A0;            { European size A5: 148 x 210 }
+ EURO_A6 = $B0;            { European size A6: 105 x 148 }
+ EURO_A7 = $C0;            { European size A7: 74 x 105 }
+ EURO_A8 = $D0;            { European size A8: 52 x 74 }
+
+{ PrinterType }
+    CUSTOM_NAME         = $00;
+    ALPHA_P_101         = $01;
+    BROTHER_15XL        = $02;
+    CBM_MPS1000         = $03;
+    DIAB_630            = $04;
+    DIAB_ADV_D25        = $05;
+    DIAB_C_150          = $06;
+    EPSON               = $07;
+    EPSON_JX_80         = $08;
+    OKIMATE_20          = $09;
+    QUME_LP_20          = $0A;
+{ new printer entries, 3 October 1985 }
+    HP_LASERJET         = $0B;
+    HP_LASERJET_PLUS    = $0C;
+
+{ Serial Input Buffer Sizes }
+    SBUF_512            = $00;
+    SBUF_1024           = $01;
+    SBUF_2048           = $02;
+    SBUF_4096           = $03;
+    SBUF_8000           = $04;
+    SBUF_16000          = $05;
+
+{ Serial Bit Masks }
+    SREAD_BITS          = $F0;          { for SerRWBits   }
+    SWRITE_BITS         = $0F;
+
+    SSTOP_BITS          = $F0;          { for SerStopBuf  }
+    SBUFSIZE_BITS       = $0F;
+
+    SPARITY_BITS        = $F0;          { for SerParShk }
+    SHSHAKE_BITS        = $0F;
+
+{ Serial Parity (upper nibble, after being shifted by
+ * macro SPARNUM() )
+ }
+    SPARITY_NONE        = 0;
+    SPARITY_EVEN        = 1;
+    SPARITY_ODD         = 2;
+
+{ Serial Handshake Mode (lower nibble, after masking using
+ * macro SHANKNUM() )
+ }
+    SHSHAKE_XON         = 0;
+    SHSHAKE_RTS         = 1;
+    SHSHAKE_NONE        = 2;
+
+{ new defines for PrintFlags }
+
+    CORRECT_RED         = $0001;        { color correct red shades }
+    CORRECT_GREEN       = $0002;        { color correct green shades }
+    CORRECT_BLUE        = $0004;        { color correct blue shades }
+
+    CENTER_IMAGE        = $0008;        { center image on paper }
+
+    IGNORE_DIMENSIONS   = $0000;        { ignore max width/height settings }
+    BOUNDED_DIMENSIONS  = $0010;        { use max width/height as boundaries }
+    ABSOLUTE_DIMENSIONS = $0020;        { use max width/height as absolutes }
+    PIXEL_DIMENSIONS    = $0040;        { use max width/height as prt pixels }
+    MULTIPLY_DIMENSIONS = $0080;        { use max width/height as multipliers }
+
+    INTEGER_SCALING     = $0100;        { force integer scaling }
+
+    ORDERED_DITHERING   = $0000;        { ordered dithering }
+    HALFTONE_DITHERING  = $0200;        { halftone dithering }
+    FLOYD_DITHERING     = $0400;        { Floyd-Steinberg dithering }
+
+    ANTI_ALIAS          = $0800;        { anti-alias image }
+    GREY_SCALE2         = $1000;        { for use with hi-res monitor }
+
+{ masks used for checking bits }
+
+    CORRECT_RGB_MASK    = CORRECT_RED + CORRECT_GREEN + CORRECT_BLUE;
+    DIMENSIONS_MASK     = BOUNDED_DIMENSIONS + ABSOLUTE_DIMENSIONS +
+                                PIXEL_DIMENSIONS + MULTIPLY_DIMENSIONS;
+    DITHERING_MASK      = HALFTONE_DITHERING + FLOYD_DITHERING;
+
+
+
+
+
+
+{ ======================================================================== }
+{ === IntuitionBase ====================================================== }
+{ ======================================================================== }
+{
+ * Be sure to protect yourself against someone modifying these data as
+ * you look at them.  This is done by calling:
+ *
+ * lock = LockIBase(0), which returns an Integer.  When done call
+ * UnlockIBase(lock) where lock is what LockIBase() returned.
+ }
+
+Type
+
+    pIntuitionBase = ^tIntuitionBase;
+    tIntuitionBase = record
+{ IntuitionBase should never be directly modified by programs   }
+{ even a little bit, guys/gals; do you hear me? }
+
+        LibNode         : tLibrary;
+
+        ViewLord        : tView;
+
+        ActiveWindow    : pWindow;
+        ActiveScreen    : pScreen;
+
+    { the FirstScreen variable points to the frontmost Screen.   Screens are
+     * then maintained in a front to back order using Screen.NextScreen
+     }
+
+        FirstScreen     : pScreen;    { for linked list of all screens }
+
+        Flags           : Cardinal;      { see definitions below }
+        MouseY,
+        MouseX          : smallint;        { mouse position relative to View }
+
+        Seconds         : Cardinal;      { timestamp of most current input event }
+        Micros          : Cardinal;      { timestamp of most current input event }
+
+    { I told you this was private.
+     * The data beyond this point has changed, is changing, and
+     * will continue to change.
+     }
+
+    end;
+
+
+{
+ * Package of information passed to custom and 'boopsi'
+ * gadget 'hook' functions.  This structure is READ ONLY.
+ }
+Type
+
+   pGadgetInfo = ^tGadgetInfo;
+   tGadgetInfo = record
+    gi_Screen                   : pScreen;       { ScreenPtr }
+    gi_Window                   : pWindow;       { null for screen gadgets }    { WindowPtr }
+    gi_Requester                : pRequester;    { null IF not GTYP_REQGADGET } { RequesterPtr }
+
+    { rendering information:
+     * don't use these without cloning/locking.
+     * Official way is to call ObtainRPort()
+     }
+    gi_RastPort                 : pRastPort;     { RastPortPtr }
+    gi_Layer                    : pLayer;        { LayerPtr }
+
+    { copy of dimensions of screen/window/g00/req(/group)
+     * that gadget resides in.  Left/Top of this box is
+     * offset from window mouse coordinates to gadget coordinates
+     *          screen gadgets:                 0,0 (from screen coords)
+     *  window gadgets (no g00):        0,0
+     *  GTYP_GZZGADGETs (borderlayer):          0,0
+     *  GZZ innerlayer gadget:          borderleft, bordertop
+     *  Requester gadgets:              reqleft, reqtop
+     }
+    gi_Domain                   : tIBox;
+
+    gi_Pens                     : record
+                      DetailPen : Byte;
+                      BlockPen  : Byte;
+                                  end;
+
+    { the Detail and Block pens in gi_DrInfo->dri_Pens[] are
+     * for the screen.  Use the above for window-sensitive
+     * colors.
+     }
+    gi_DrInfo                   : pDrawInfo;  { DrawInfoPtr }
+
+    { reserved space: this structure is extensible
+     * anyway, but using these saves some recompilation
+     }
+    gi_Reserved                 : Array[0..5] of Cardinal;
+   END;
+
+{** system private data structure for now **}
+{ prop gadget extra info       }
+
+   pPGX = ^tPGX;
+   tPGX = record
+    pgx_Container : tIBox;
+    pgx_NewKnob   : tIBox;
+   END;
+
+{ this casts MutualExclude for easy assignment of a hook
+ * pointer to the unused MutualExclude field of a custom gadget
+ }
+
+{** User visible handles on objects, classes, messages **}
+Type
+ Object_ = Cardinal;
+ pObject_ = ^Object_;
+ ClassID = ^Byte;
+
+{
+ you can use this type to point to a 'generic' message,
+ * in the object-oriented programming parlance.  Based on
+ * the value of 'MethodID', you dispatch to processing
+ * for the various message types.  The meaningful parameter
+ * packet structure definitions are defined below.
+
+typedef struct
+    Cardinal MethodID;
+     method-specific data follows, some examples below
+               *Msg; }
+
+  pMsg = ^tMsg;
+  tMsg = record
+     MethodID : Cardinal;
+  end;
+
+{
+ * Class id strings for Intuition classes.
+ * There's no real reason to use the uppercase constants
+ * over the lowercase strings, but this makes a good place
+ * to list the names of the built-in classes.
+ }
+CONST
+ ROOTCLASS      : PChar = 'rootclass'    ;         { classusr.h   }
+ IMAGECLASS     : PChar = 'imageclass'   ;         { imageclass.h }
+ FRAMEICLASS    : PChar = 'frameiclass'  ;
+ SYSICLASS      : PChar = 'sysiclass'    ;
+ FILLRECTCLASS  : PChar = 'fillrectclass';
+ GADGETCLASS    : PChar = 'gadgetclass'  ;         { gadgetclass.h }
+ PROPGCLASS     : PChar = 'propgclass'   ;
+ STRGCLASS      : PChar = 'strgclass'    ;
+ BUTTONGCLASS   : PChar = 'buttongclass' ;
+ FRBUTTONCLASS  : PChar = 'frbuttonclass';
+ GROUPGCLASS    : PChar = 'groupgclass'  ;
+ ICCLASS        : PChar = 'icclass'      ;         { icclass.h    }
+ MODELCLASS     : PChar = 'modelclass'   ;
+ ITEXTICLASS    : PChar = 'itexticlass'  ;
+ POINTERCLASS   : PChar = 'pointerclass' ;         { pointerclass.h }
+
+
+{ Dispatched method ID's
+ * NOTE: Applications should use Intuition entry points, not direct
+ * DoMethod() calls, for NewObject, DisposeObject, SetAttrs,
+ * SetGadgetAttrs, and GetAttr.
+ }
+
+ OM_Dummy       = ($100);
+ OM_NEW         = ($101); { 'object' parameter is 'true class'   }
+ OM_DISPOSE     = ($102); { delete self (no parameters)          }
+ OM_SET         = ($103); { set attributes (in tag list)         }
+ OM_GET         = ($104); { return single attribute value        }
+ OM_ADDTAIL     = ($105); { add self to a List (let root do it)  }
+ OM_REMOVE      = ($106); { remove self from list                }
+ OM_NOTIFY      = ($107); { send to self: notify dependents      }
+ OM_UPDATE      = ($108); { notification message from somebody   }
+ OM_ADDMEMBER   = ($109); { used by various classes with lists   }
+ OM_REMMEMBER   = ($10A); { used by various classes with lists   }
+
+{ Parameter 'Messages' passed to methods       }
+
+{ OM_NEW and OM_SET    }
+Type
+   popSet = ^topSet;
+   topSet = record
+    MethodID            : Cardinal;
+    ops_AttrList        : pTagItem;    { new attributes       }
+    ops_GInfo           : pGadgetInfo; { always there for gadgets,
+                                         * when SetGadgetAttrs() is used,
+                                         * but will be NULL for OM_NEW
+                                         }
+   END;
+
+{ OM_NOTIFY, and OM_UPDATE     }
+
+  popUpdate = ^topUpdate;
+  topUpdate = record
+    MethodID            : Cardinal;
+    opu_AttrList        : pTagItem;     { new attributes       }
+    opu_GInfo           : pGadgetInfo;  { non-NULL when SetGadgetAttrs OR
+                                         * notification resulting from gadget
+                                         * input occurs.
+                                         }
+    opu_Flags           : Cardinal;        { defined below        }
+  END;
+
+{ this flag means that the update message is being issued from
+ * something like an active gadget, a la GACT_FOLLOWMOUSE.  When
+ * the gadget goes inactive, it will issue a final update
+ * message with this bit cleared.  Examples of use are for
+ * GACT_FOLLOWMOUSE equivalents for propgadclass, and repeat strobes
+ * for buttons.
+ }
+CONST
+ OPUF_INTERIM   = 1;
+
+{ OM_GET       }
+Type
+
+  popGet = ^topGet;
+  topGet = record
+    MethodID,
+    opg_AttrID          : Cardinal;
+    opg_Storage         : Pointer;   { may be other types, but 'int'
+                                         * types are all Cardinal
+                                         }
+  END;
+
+{ OM_ADDTAIL   }
+
+  popAddTail = ^topAddTail;
+  topAddTail = record
+    MethodID  : Cardinal;
+    opat_List : pList;
+  END;
+
+{ OM_ADDMEMBER, OM_REMMEMBER   }
+Type
+
+   popMember = ^topMember;
+   topMember = record
+    MethodID   : Cardinal;
+    opam_Object : pObject_;
+   END;
+
+
+
+{*****************************************}
+{** 'White box' access to struct IClass **}
+{*****************************************}
+
+{ This structure is READ-ONLY, and allocated only by Intuition }
+TYPE
+
+   pIClass = ^tIClass;
+   tIClass = record
+    cl_Dispatcher       : tHook;
+    cl_Reserved         : Cardinal;    { must be 0  }
+    cl_Super            : pIClass;
+    cl_ID               : ClassID;
+
+    { where within an object is the instance data for this class? }
+    cl_InstOffset       : Word;
+    cl_InstSize         : Word;
+
+    cl_UserData         : Cardinal;    { per-class data of your choice }
+    cl_SubclassCount    : Cardinal;
+                                        { how many direct subclasses?  }
+    cl_ObjectCount      : Cardinal;
+                                { how many objects created of this class? }
+    cl_Flags            : Cardinal;
+   END;
+
+CONST
+ CLF_INLIST    =  $00000001;      { class is in public class list }
+
+
+
+{************************************************}
+{** 'White box' access to struct _Object       **}
+{************************************************}
+
+{
+ * We have this, the instance data of the root class, PRECEDING
+ * the 'object'.  This is so that Gadget objects are Gadget pointers,
+ * and so on.  If this structure grows, it will always have o_Class
+ * at the end, so the macro OCLASS(o) will always have the same
+ * offset back from the pointer returned from NewObject().
+ *
+ * This data structure is subject to change.  Do not use the o_Node
+ * embedded structure.
+ }
+Type
+  p_Object = ^t_Object;
+  t_Object = record
+    o_Node    : tMinNode;
+    o_Class   : pIClass;
+  END;
+
+{ BOOPSI class libraries should use this structure as the base for their
+ * library data.  This allows developers to obtain the class pointer for
+ * performing object-less inquiries. }
+
+
+       PClassLibrary = ^tClassLibrary;
+       tClassLibrary = record
+            cl_Lib : tLibrary;    { Embedded library }
+            cl_Pad : Word;       { Align the structure }
+            cl_Class : PIClass;   { Class pointer }
+         end;
+
+{
+ * NOTE:  <intuition/iobsolete.h> is included at the END of this file!
+ }
+
+{ Gadget Class attributes      }
+CONST
+    GA_Dummy           =  (TAG_USER +$30000);
+    
+    { (LONG) Left edge of the gadget relative to the left edge of
+     * the window }
+    GA_Left            =  (GA_Dummy + $0001);
+    
+    { (LONG) Left edge of the gadget relative to the right edge of
+     * the window }
+    GA_RelRight        =  (GA_Dummy + $0002);
+    
+    { (LONG) Top edge of the gadget relative to the top edge of
+     * the window }
+    GA_Top             =  (GA_Dummy + $0003);
+
+    { (LONG) Top edge of the gadget relative to the bottom edge
+     * of the window }
+    GA_RelBottom       =  (GA_Dummy + $0004);
+    
+    { (LONG) Width of the gadget }
+    GA_Width           =  (GA_Dummy + $0005);
+    
+    { (LONG) Width of the gadget relative to the width of the
+     * window }
+    GA_RelWidth        =  (GA_Dummy + $0006);
+    
+    { (LONG) Height of the gadget }
+    GA_Height          =  (GA_Dummy + $0007);
+
+    { (LONG) Height of the gadget relative to the height of
+     * the window }
+    GA_RelHeight       =  (GA_Dummy + $0008);
+    
+    { (PChar) Gadget imagry is NULL terminated string }
+    GA_Text            =  (GA_Dummy + $0009); { ti_Data is (UBYTE *) }
+    
+    { (struct Image *) Gadget imagry is an image }
+    GA_Image           =  (GA_Dummy + $000A);
+    
+    { (struct Border *) Gadget imagry is a border }
+    GA_Border          =  (GA_Dummy + $000B);
+
+    { (struct Image *) Selected gadget imagry }
+    GA_SelectRender    =  (GA_Dummy + $000C);
+    
+    { (UWORD) One of GFLG_GADGHNONE, GFLG_GADGHBOX, GFLG_GADGHCOMP,
+     * or GFLG_GADGHIMAGE }
+    GA_Highlight       =  (GA_Dummy + $000D);
+    
+    { (BOOL) Indicate whether gadget is disabled or not.
+     * Defaults to FALSE. }
+    GA_Disabled        =  (GA_Dummy + $000E);
+    
+    { (BOOL) Indicate whether the gadget is for
+     * WFLG_GIMMEZEROZERO window borders or not.  Defaults
+     * to FALSE. }
+    GA_GZZGadget       =  (GA_Dummy + $000F);
+    
+    { (UWORD) Gadget ID assigned by the application }
+    GA_ID              =  (GA_Dummy + $0010);
+    
+    { (APTR) Application specific data }
+    GA_UserData        =  (GA_Dummy + $0011);
+    
+    { (APTR) Gadget specific data }
+    GA_SpecialInfo     =  (GA_Dummy + $0012);
+    
+    { (BOOL) Indicate whether the gadget is selected or not.
+     * Defaults to FALSE }
+    GA_Selected        =  (GA_Dummy + $0013);
+    
+    { (BOOL) When set tells the system that when this gadget
+     * is selected causes the requester that it is in to be
+     * ended.  Defaults to FALSE. }
+    GA_EndGadget       =  (GA_Dummy + $0014);
+    
+    { (BOOL) When set indicates that the gadget is to
+     * notify the application when it becomes active.  Defaults
+     * to FALSE. }
+    GA_Immediate       =  (GA_Dummy + $0015);
+    
+    { (BOOL) When set indicates that the application wants to
+     * verify that the pointer was still over the gadget when
+     * the select button is released.  Defaults to FALSE. }
+    GA_RelVerify       =  (GA_Dummy + $0016);
+    
+    { (BOOL) When set indicates that the application wants to
+     * be notified of mouse movements while the gadget is active.
+     * It is recommmended that GA_Immediate and GA_RelVerify are
+     * also used so that the active gadget can be tracked by the
+     * application.  Defaults to FALSE. }
+    GA_FollowMouse     =  (GA_Dummy + $0017);
+    
+    { (BOOL) Indicate whether the gadget is in the right border
+     * or not.  Defaults to FALSE. }
+    GA_RightBorder     =  (GA_Dummy + $0018);
+    
+    { (BOOL) Indicate whether the gadget is in the left border
+     * or not.  Defaults to FALSE. }
+    GA_LeftBorder      =  (GA_Dummy + $0019);
+    
+    { (BOOL) Indicate whether the gadget is in the top border
+     * or not.  Defaults to FALSE. }
+    GA_TopBorder       =  (GA_Dummy + $001A);
+    
+    { (BOOL) Indicate whether the gadget is in the bottom border
+     * or not.  Defaults to FALSE. }
+    GA_BottomBorder    =  (GA_Dummy + $001B);
+    
+    { (BOOL) Indicate whether the gadget is toggle-selected
+     * or not.  Defaults to FALSE. }
+    GA_ToggleSelect    =  (GA_Dummy + $001C);
+
+    { (BOOL) Reserved for system use to indicate that the
+     * gadget belongs to the system.  Defaults to FALSE. }
+    GA_SysGadget       =  (GA_Dummy + $001D);
+    
+    { (UWORD) Reserved for system use to indicate the
+     * gadget type. }
+    GA_SysGType        =  (GA_Dummy + $001E);
+
+    { (struct Gadget *) Previous gadget in the linked list.
+     * NOTE: This attribute CANNOT be used to link new gadgets
+     * into the gadget list of an open window or requester.
+     * You must use AddGList(). }
+    GA_Previous        =  (GA_Dummy + $001F);
+
+    { (struct Gadget *) Next gadget in the linked list. }
+    GA_Next            =  (GA_Dummy + $0020);
+
+    { (struct DrawInfo *) Some gadgets need a DrawInfo at creation time }
+    GA_DrawInfo        =  (GA_Dummy + $0021);
+
+    { You should use at most ONE of GA_Text, GA_IntuiText, and GA_LabelImage }
+    { (struct IntuiText *) Label is an IntuiText. }
+    GA_IntuiText          =  (GA_Dummy + $0022);
+
+    { (Object *) Label is an image object. }
+    GA_LabelImage         =  (GA_Dummy + $0023);
+
+    { New for V37:
+         * Boolean indicates that this gadget is to participate in
+         * cycling activation with Tab or Shift-Tab.
+    }
+    GA_TabCycle           =  (GA_Dummy + $0024);
+
+    { New for V39:
+         * Boolean indicates that this gadget sends gadget-help
+    }
+    GA_GadgetHelp         =  (GA_Dummy + $0025);
+
+    { New for V39:
+         * ti_Data is a pointer to an IBox structure which is
+         * to be copied into the extended gadget's bounds.
+    }
+    GA_Bounds             =  (GA_Dummy + $0026);
+
+    { New for V39:
+         * Boolean indicates that this gadget has the "special relativity"
+         * property, which is useful for certain fancy relativity
+         * operations through the GM_LAYOUT method.
+    }
+    GA_RelSpecial         =  (GA_Dummy + $0027);
+
+    
+     GA_TextAttr = GA_Dummy + 40;
+  { (struct TextAttr  ) Indicate the font to use for the gadget.
+         New for V42.  }
+
+     GA_ReadOnly = GA_Dummy + 41;
+  { (BOOL) Indicate that the gadget is read-only (non-selectable).
+         Defaults to FALSE. New for V42.  }
+
+     GA_Underscore = GA_Dummy + 42;
+  { (UBYTE) Underscore/escape character for keyboard shortcuts.
+         Defaults to '_' . New for V44.  }
+
+     GA_ActivateKey = GA_Dummy + 43;
+  { (PChar) Set/Get the gadgets shortcut/activation key(s)
+         Defaults to NULL. New for V44.  }
+
+     GA_BackFill = GA_Dummy + 44;
+  { (struct Hook  ) Backfill pattern hook.
+         Defaults to NULL. New for V44.  }
+
+     GA_GadgetHelpText = GA_Dummy + 45;
+  { (PChar)   RESERVERD/PRIVATE DO NOT USE
+         Defaults to NULL. New for V44.  }
+
+     GA_UserInput = GA_Dummy + 46;
+  { (BOOL) Notification tag indicates this notification is from the activite
+  	   gadget receiving user input - an attempt to make IDCMPUPDATE more efficient.
+         Defaults to FALSE. New for V44.  }
+{ PROPGCLASS attributes }
+
+ PGA_Dummy      = (TAG_USER + $31000);
+ PGA_Freedom    = (PGA_Dummy + $0001);
+        { only one of FREEVERT or FREEHORIZ }
+ PGA_Borderless = (PGA_Dummy + $0002);
+ PGA_HorizPot   = (PGA_Dummy + $0003);
+ PGA_HorizBody  = (PGA_Dummy + $0004);
+ PGA_VertPot    = (PGA_Dummy + $0005);
+ PGA_VertBody   = (PGA_Dummy + $0006);
+ PGA_Total      = (PGA_Dummy + $0007);
+ PGA_Visible    = (PGA_Dummy + $0008);
+ PGA_Top        = (PGA_Dummy + $0009);
+{ New for V37: }
+ PGA_NewLook    = (PGA_Dummy + $000A);
+
+{ STRGCLASS attributes }
+
+ STRINGA_Dummy         =  (TAG_USER      +$32000);
+ STRINGA_MaxChars      =  (STRINGA_Dummy + $0001);
+ STRINGA_Buffer        =  (STRINGA_Dummy + $0002);
+ STRINGA_UndoBuffer    =  (STRINGA_Dummy + $0003);
+ STRINGA_WorkBuffer    =  (STRINGA_Dummy + $0004);
+ STRINGA_BufferPos     =  (STRINGA_Dummy + $0005);
+ STRINGA_DispPos       =  (STRINGA_Dummy + $0006);
+ STRINGA_AltKeyMap     =  (STRINGA_Dummy + $0007);
+ STRINGA_Font          =  (STRINGA_Dummy + $0008);
+ STRINGA_Pens          =  (STRINGA_Dummy + $0009);
+ STRINGA_ActivePens    =  (STRINGA_Dummy + $000A);
+ STRINGA_EditHook      =  (STRINGA_Dummy + $000B);
+ STRINGA_EditModes     =  (STRINGA_Dummy + $000C);
+
+{ booleans }
+ STRINGA_ReplaceMode    = (STRINGA_Dummy + $000D);
+ STRINGA_FixedFieldMode = (STRINGA_Dummy + $000E);
+ STRINGA_NoFilterMode   = (STRINGA_Dummy + $000F);
+
+ STRINGA_Justification  = (STRINGA_Dummy + $0010);
+        { GACT_STRINGCENTER, GACT_STRINGLEFT, GACT_STRINGRIGHT }
+ STRINGA_LongVal        = (STRINGA_Dummy + $0011);
+ STRINGA_TextVal        = (STRINGA_Dummy + $0012);
+
+ STRINGA_ExitHelp       = (STRINGA_Dummy + $0013);
+        { STRINGA_ExitHelp is new for V37, and ignored by V36.
+         * Set this if you want the gadget to exit when Help is
+         * pressed.  Look for a code of $5F, the rawkey code for Help
+         }
+
+ SG_DEFAULTMAXCHARS     = (128);
+
+{ Gadget Layout related attributes     }
+
+ LAYOUTA_Dummy          = (TAG_USER  + $38000);
+ LAYOUTA_LayoutObj      = (LAYOUTA_Dummy + $0001);
+ LAYOUTA_Spacing        = (LAYOUTA_Dummy + $0002);
+ LAYOUTA_Orientation    = (LAYOUTA_Dummy + $0003);
+ 
+ LAYOUTA_ChildMaxWidth = LAYOUTA_Dummy + $0004;
+  { (BOOL) Child objects are of equal width.  Should default to TRUE for
+         gadgets with a horizontal orientation.  New for V42.  }
+
+ LAYOUTA_ChildMaxHeight = LAYOUTA_Dummy + $0005;
+  { (BOOL) Child objects are of equal height.  Should default to TRUE for
+         gadgets with a vertical orientation.  New for V42.  }
+
+{ orientation values   }
+ LORIENT_NONE   = 0;
+ LORIENT_HORIZ  = 1;
+ LORIENT_VERT   = 2;
+
+
+{ Gadget Method ID's   }
+
+ GM_Dummy      =  (-1);    { not used for anything                }
+ GM_HITTEST    =  (0);     { return GMR_GADGETHIT IF you are clicked on
+                                 * (whether or not you are disabled).
+                                 }
+ GM_RENDER      = (1);     { draw yourself, in the appropriate state }
+ GM_GOACTIVE    = (2);     { you are now going to be fed input    }
+ GM_HANDLEINPUT = (3);     { handle that input                    }
+ GM_GOINACTIVE  = (4);     { whether or not by choice, you are done  }
+ GM_HELPTEST    = (5);     { Will you send gadget help if the mouse is
+                                 * at the specified coordinates?  See below
+                                 * for possible GMR_ values.
+                                 }
+ GM_LAYOUT      = (6);     { re-evaluate your size based on the GadgetInfo
+                                 * Domain.  Do NOT re-render yourself yet, you
+                                 * will be called when it is time...
+                                 }
+
+{ Parameter "Messages" passed to gadget class methods  }
+
+{ GM_HITTEST   }
+type
+
+  pgpHitTest = ^tgpHitTest;
+  tgpHitTest = record
+    MethodID  : Cardinal;
+    gpht_GInfo : pGadgetInfo;
+    gpht_Mouse : record
+             x : smallint;
+             y : smallint;
+                 end;
+  END;
+
+const
+{ For GM_HITTEST, return GMR_GADGETHIT if you were indeed hit,
+ * otherwise return zero.
+ *
+ * For GM_HELPTEST, return GMR_NOHELPHIT (zero) if you were not hit.
+ * Typically, return GMR_HELPHIT if you were hit.
+ * It is possible to pass a UWORD to the application via the Code field
+ * of the IDCMP_GADGETHELP message.  Return GMR_HELPCODE or'd with
+ * the UWORD-sized result you wish to return.
+ *
+ * GMR_HELPHIT yields a Code value of ((UWORD) ~0), which should
+ * mean "nothing particular" to the application.
+ }
+
+ GMR_GADGETHIT  = ($00000004);    { GM_HITTEST hit }
+
+ GMR_NOHELPHIT  = ($00000000);    { GM_HELPTEST didn't hit }
+ GMR_HELPHIT    = ($FFFFFFFF);    { GM_HELPTEST hit, return code = ~0 }
+ GMR_HELPCODE   = ($00010000);    { GM_HELPTEST hit, return low word as code }
+
+
+{ GM_RENDER    }
+Type
+   pgpRender = ^tgpRender;
+   tgpRender = record
+    MethodID  : Cardinal;
+    gpr_GInfo : pGadgetInfo;      { gadget context               }
+    gpr_RPort : pRastPort;        { all ready for use            }
+    gpr_Redraw : Longint;           { might be a "highlight pass"  }
+   END;
+
+{ values of gpr_Redraw }
+CONST
+ GREDRAW_UPDATE = (2);     { incremental update, e.g. prop slider }
+ GREDRAW_REDRAW = (1);     { redraw gadget        }
+ GREDRAW_TOGGLE = (0);     { toggle highlight, IF applicable      }
+
+{ GM_GOACTIVE, GM_HANDLEINPUT  }
+Type
+
+  pgpInput = ^tgpInput;
+  tgpInput = record
+    MethodID : Cardinal;
+    gpi_GInfo : pGadgetInfo;
+    gpi_IEvent : pInputEvent;
+    gpi_Termination : Pointer;
+    gpi_Mouse : record
+            x : smallint;
+            y : smallint;
+                end;
+    {* (V39) Pointer to TabletData structure, if this event originated
+     * from a tablet which sends IESUBCLASS_NEWTABLET events, or NULL if
+     * not.
+     *
+     * DO NOT ATTEMPT TO READ THIS FIELD UNDER INTUITION PRIOR TO V39!
+     * IT WILL BE INVALID!
+     *}
+   gpi_TabletData  : pTabletData;
+  END;
+
+{ GM_HANDLEINPUT and GM_GOACTIVE  return code flags    }
+{ return GMR_MEACTIVE (0) alone if you want more input.
+ * Otherwise, return ONE of GMR_NOREUSE and GMR_REUSE, and optionally
+ * GMR_VERIFY.
+ }
+CONST
+ GMR_MEACTIVE  =  (0);
+ GMR_NOREUSE   =  (2);
+ GMR_REUSE     =  (4);
+ GMR_VERIFY    =  (8);        { you MUST set cgp_Termination }
+
+{ New for V37:
+ * You can end activation with one of GMR_NEXTACTIVE and GMR_PREVACTIVE,
+ * which instructs Intuition to activate the next or previous gadget
+ * that has GFLG_TABCYCLE set.
+ }
+ GMR_NEXTACTIVE = (16);
+ GMR_PREVACTIVE = (32);
+
+{ GM_GOINACTIVE }
+Type
+
+   pgpGoInactive = ^tgpGoInactive;
+   tgpGoInactive = record
+    MethodID    : Cardinal;
+    gpgi_GInfo  : pGadgetInfo;
+
+    { V37 field only!  DO NOT attempt to read under V36! }
+    gpgi_Abort  : Cardinal;               { gpgi_Abort=1 IF gadget was aborted
+                                         * by Intuition and 0 if gadget went
+                                         * inactive at its own request
+                                         }
+   END;
+
+{* New for V39: Intuition sends GM_LAYOUT to any GREL_ gadget when
+ * the gadget is added to the window (or when the window opens, if
+ * the gadget was part of the NewWindow.FirstGadget or the WA_Gadgets
+ * list), or when the window is resized.  Your gadget can set the
+ * GA_RelSpecial property to get GM_LAYOUT events without Intuition
+ * changing the interpretation of your gadget select box.  This
+ * allows for completely arbitrary resizing/repositioning based on
+ * window size.
+ *}
+{* GM_LAYOUT *}
+Type
+
+ pgpLayout = ^tgpLayout;
+ tgpLayout = record
+    MethodID            : Cardinal;
+    gpl_GInfo           : pGadgetInfo;
+    gpl_Initial         : Cardinal;      {* non-zero if this method was invoked
+                                         * during AddGList() or OpenWindow()
+                                         * time.  zero if this method was invoked
+                                         * during window resizing.
+                                         *}
+ end;
+
+{***************************************************************************}
+
+{ The GM_DOMAIN method is used to obtain the sizing requirements of an
+ * object for a class before ever creating an object. }
+
+{ GM_DOMAIN }
+
+    PgpDomain = ^tgpDomain;
+     tgpDomain = record
+          MethodID : Cardinal;
+          gpd_GInfo : PGadgetInfo;
+          gpd_RPort : PRastPort;    { RastPort to layout for }
+          gpd_Which : LongInt;
+          gpd_Domain : tIBox;       { Resulting domain }
+          gpd_Attrs : PTagItem;     { Additional attributes }
+       end;
+
+
+  const
+     GDOMAIN_MINIMUM = 0;
+  { Minimum size  }
+
+     GDOMAIN_NOMINAL = 1;
+  { Nominal size  }
+
+     GDOMAIN_MAXIMUM = 2;
+  { Maximum size  }
+
+{***************************************************************************}
+
+{ The GM_KEYTEST method is used to determin if a key press matches an
+ * object's activation key(s). }
+
+{ GM_KEYTEST send this message.
+ }
+ 
+  type
+     PgpKeyTest = ^tgpKeyTest;
+     tgpKeyTest = record
+          MethodID : Cardinal;
+          gpkt_GInfo : PGadgetInfo;
+          gpkt_IMsg : PIntuiMessage;   { The IntuiMessage that triggered this }
+          gpkt_VanillaKey : Cardinal;
+       end;
+
+{***************************************************************************}
+
+{ The GM_KEYGOACTIVE method is called to "simulate" a gadget going down.
+ * A gadget should render itself in a selected state when receiving
+ * this message. If the class supports this method, it must return
+ * GMR_KEYACTIVE.
+ *
+ * If a gadget returns zero for this method, it will subsequently be
+ * activated via ActivateGadget() with a NULL IEvent.
+ }
+ 
+     PgpKeyInput = ^tgpKeyInput;
+     tgpKeyInput = record
+          MethodID : Cardinal;        { GM_KEYGOACTIVE }
+          gpk_GInfo : PGadgetInfo;
+          gpk_IEvent : PInputEvent;
+          gpk_Termination : ^LongInt;
+       end;
+
+
+  const
+     GMR_KEYACTIVE = 1 shl 4;
+
+  { you MUST set gpk_Termination  }
+     GMR_KEYVERIFY = 1 shl 5;
+
+{ The GM_KEYGOINACTIVE method is called to simulate the gadget release.
+ * Upon receiving this message, the gadget should do everything a
+ * normal gadget release would do.
+ }
+
+  type
+     PgpKeyGoInactive = ^tgpKeyGoInactive;
+     tgpKeyGoInactive = record
+          MethodID : Cardinal;
+          gpki_GInfo : PGadgetInfo;
+          gpki_Abort : Cardinal;
+       end;
+
+CONST
+ ICM_Dummy      = ($0401);       { used for nothing             }
+ ICM_SETLOOP    = ($0402);       { set/increment loop counter   }
+ ICM_CLEARLOOP  = ($0403);       { clear/decrement loop counter }
+ ICM_CHECKLOOP  = ($0404);       { set/increment loop           }
+
+{ no parameters for ICM_SETLOOP, ICM_CLEARLOOP, ICM_CHECKLOOP  }
+
+{ interconnection attributes used by icclass, modelclass, and gadgetclass }
+ ICA_Dummy      = (TAG_USER+$40000);
+ ICA_TARGET     = (ICA_Dummy + 1);
+        { interconnection target               }
+ ICA_MAP        = (ICA_Dummy + 2);
+        { interconnection map tagitem list     }
+ ICSPECIAL_CODE = (ICA_Dummy + 3);
+        { a "pseudo-attribute", see below.     }
+
+{ Normally, the value for ICA_TARGET is some object pointer,
+ * but if you specify the special value ICTARGET_IDCMP, notification
+ * will be send as an IDCMP_IDCMPUPDATE message to the appropriate window's
+ * IDCMP port.  See the definition of IDCMP_IDCMPUPDATE.
+ *
+ * When you specify ICTARGET_IDCMP for ICA_TARGET, the map you
+ * specify will be applied to derive the attribute list that is
+ * sent with the IDCMP_IDCMPUPDATE message.  If you specify a map list
+ * which results in the attribute tag id ICSPECIAL_CODE, the
+ * lower sixteen bits of the corresponding ti_Data value will
+ * be copied into the Code field of the IDCMP_IDCMPUPDATE IntuiMessage.
+ }
+ ICTARGET_IDCMP = (NOT 0);
+
+
+CONST
+ CUSTOMIMAGEDEPTH     =   (-1);
+{ if image.Depth is this, it's a new Image class object }
+
+
+{****************************************************}
+CONST
+ IA_Dummy             =   (TAG_USER + $20000);
+ IA_Left              =   (IA_Dummy + $01);
+ IA_Top               =   (IA_Dummy + $02);
+ IA_Width             =   (IA_Dummy + $03);
+ IA_Height            =   (IA_Dummy + $04);
+ IA_FGPen             =   (IA_Dummy + $05);
+                    { IA_FGPen also means "PlanePick"  }
+ IA_BGPen             =   (IA_Dummy + $06);
+                    { IA_BGPen also means "PlaneOnOff" }
+ IA_Data              =   (IA_Dummy + $07);
+                    { bitplanes, for classic image,
+                     * other image classes may use it for other things
+                     }
+ IA_LineWidth         =   (IA_Dummy + $08);
+ IA_Pens              =   (IA_Dummy + $0E);
+                    { pointer to UWORD pens[],
+                     * ala DrawInfo.Pens, MUST be
+                     * terminated by ~0.  Some classes can
+                     * choose to have this, or SYSIA_DrawInfo,
+                     * or both.
+                     }
+ IA_Resolution        =   (IA_Dummy + $0F);
+                    { packed uwords for x/y resolution into a longword
+                     * ala DrawInfo.Resolution
+                     }
+
+{*** see class documentation to learn which    ****}
+{*** classes recognize these                   ****}
+ IA_APattern           =  (IA_Dummy + $10);
+ IA_APatSize           =  (IA_Dummy + $11);
+ IA_Mode               =  (IA_Dummy + $12);
+ IA_Font               =  (IA_Dummy + $13);
+ IA_Outline            =  (IA_Dummy + $14);
+ IA_Recessed           =  (IA_Dummy + $15);
+ IA_DoubleEmboss       =  (IA_Dummy + $16);
+ IA_EdgesOnly          =  (IA_Dummy + $17);
+
+{*** "sysiclass" attributes                    ****}
+ SYSIA_Size            =  (IA_Dummy + $0B);
+                    { 's below          }
+ SYSIA_Depth           =  (IA_Dummy + $0C);
+                    { this is unused by Intuition.  SYSIA_DrawInfo
+                     * is used instead for V36
+                     }
+ SYSIA_Which           =  (IA_Dummy + $0D);
+                    { see 's below      }
+ SYSIA_DrawInfo        =  (IA_Dummy + $18);
+                    { pass to sysiclass, please }
+
+{****  obsolete: don't use these, use IA_Pens  ****}
+ SYSIA_Pens            =  IA_Pens;
+ IA_ShadowPen          =  (IA_Dummy + $09);
+ IA_HighlightPen       =  (IA_Dummy + $0A);
+
+{ New for V39: }
+ SYSIA_ReferenceFont   =  (IA_Dummy + $19);
+                    { Font to use as reference for scaling
+                     * certain sysiclass images
+                     }
+ IA_SupportsDisable    =  (IA_Dummy + $1a);
+                    { By default, Intuition ghosts gadgets itself,
+                     * instead of relying on IDS_DISABLED or
+                     * IDS_SELECTEDDISABLED.  An imageclass that
+                     * supports these states should return this attribute
+                     * as TRUE.  You cannot set or clear this attribute,
+                     * however.
+                     }
+
+ IA_FrameType          =  (IA_Dummy + $1b);
+                    { Starting with V39, FrameIClass recognizes
+                     * several standard types of frame.  Use one
+                     * of the FRAME_ specifiers below.  Defaults
+                     * to FRAME_DEFAULT.
+                     }
+
+     IA_Underscore = IA_Dummy + $1c;
+  { V44, Indicate underscore keyboard shortcut for image labels.
+  		       (UBYTE) Defaults to '_'
+  		      }
+
+     IA_Scalable = IA_Dummy + $1d;
+  { V44, Attribute indicates this image is allowed
+  			   to/can scale its rendering.
+  		       (BOOL) Defaults to FALSE.
+  		      }
+
+     IA_ActivateKey = IA_Dummy + $1e;
+  { V44, Used to get an underscored label shortcut.
+  		       Useful for labels attached to string gadgets.
+  		       (UBYTE) Defaults to NULL.
+  		      }
+
+     IA_Screen = IA_Dummy + $1f;
+  { V44 Screen pointer, may be useful/required by certain classes.
+  		       (struct Screen  )
+  		      }
+
+     IA_Precision = IA_Dummy + $20;
+  { V44 Precision value, typically pen precision but may be
+  		       used for similar custom purposes.
+  		       (Cardinal)
+  		      }
+
+{* next attribute: (IA_Dummy + $1c)   *}
+
+{***********************************************}
+
+{ data values for SYSIA_Size   }
+ SYSISIZE_MEDRES = (0);
+ SYSISIZE_LOWRES = (1);
+ SYSISIZE_HIRES  = (2);
+
+{
+ * SYSIA_Which tag data values:
+ * Specifies which system gadget you want an image for.
+ * Some numbers correspond to internal Intuition s
+ }
+ DEPTHIMAGE     = ($00);
+ ZOOMIMAGE      = ($01);
+ SIZEIMAGE      = ($02);
+ CLOSEIMAGE     = ($03);
+ SDEPTHIMAGE    = ($05); { screen depth gadget }
+ LEFTIMAGE      = ($0A);
+ UPIMAGE        = ($0B);
+ RIGHTIMAGE     = ($0C);
+ DOWNIMAGE      = ($0D);
+ CHECKIMAGE     = ($0E);
+ MXIMAGE        = ($0F); { mutual exclude "button" }
+{* New for V39: *}
+ MENUCHECK      = ($10); { Menu checkmark image }
+ AMIGAKEY       = ($11); { Menu Amiga-key image }
+
+{ Data values for IA_FrameType (recognized by FrameIClass)
+ *
+ * FRAME_DEFAULT:  The standard V37-type frame, which has
+ *	thin edges.
+ * FRAME_BUTTON:  Standard button gadget frames, having thicker
+ *	sides and nicely edged corners.
+ * FRAME_RIDGE:  A ridge such as used by standard string gadgets.
+ *	You can recess the ridge to get a groove image.
+ * FRAME_ICONDROPBOX: A broad ridge which is the standard imagery
+ *	for areas in AppWindows where icons may be dropped.
+ }
+ 
+     FRAME_DEFAULT = 0;
+     FRAME_BUTTON = 1;
+     FRAME_RIDGE = 2;
+     FRAME_ICONDROPBOX = 3;
+
+{ image message id's   }
+    IM_DRAW     = $202;  { draw yourself, with "state"          }
+    IM_HITTEST  = $203;  { return TRUE IF click hits image      }
+    IM_ERASE    = $204;  { erase yourself                       }
+    IM_MOVE     = $205;  { draw new AND erase old, smoothly     }
+
+    IM_DRAWFRAME= $206;  { draw with specified dimensions       }
+    IM_FRAMEBOX = $207;  { get recommended frame around some box}
+    IM_HITFRAME = $208;  { hittest with dimensions              }
+    IM_ERASEFRAME= $209; { hittest with dimensions              }
+    IM_DOMAINFRAME = $20A;{ query image for its domain info (V44)  }
+
+{ image draw states or styles, for IM_DRAW }
+    IDS_NORMAL          = (0);
+    IDS_SELECTED        = (1);    { for selected gadgets     }
+    IDS_DISABLED        = (2);    { for disabled gadgets     }
+    IDS_BUSY            = (3);    { for future functionality }
+    IDS_INDETERMINATE   = (4);    { for future functionality }
+    IDS_INACTIVENORMAL  = (5);    { normal, in inactive window border }
+    IDS_INACTIVESELECTED= (6);    { selected, in inactive border }
+    IDS_INACTIVEDISABLED= (7);    { disabled, in inactive border }
+    IDS_SELECTEDDISABLED = 8;     { disabled and selected     }
+
+{ oops, please forgive spelling error by jimm }
+ IDS_INDETERMINANT = IDS_INDETERMINATE;
+
+{ IM_FRAMEBOX  }
+Type
+
+  pimpFrameBox = ^timpFrameBox;
+  timpFrameBox = record
+    MethodID   : Cardinal;
+    imp_ContentsBox  : pIBox;       { input: relative box of contents }
+    imp_FrameBox     : pIBox;          { output: rel. box of encl frame  }
+    imp_DrInfo       : pDrawInfo;
+    imp_FrameFlags   : Cardinal;
+  END;
+
+CONST
+ FRAMEF_SPECIFY = (1);  { Make do with the dimensions of FrameBox
+                                 * provided.
+                                 }
+
+{ IM_DRAW, IM_DRAWFRAME        }
+Type
+
+   pimpDraw = ^timpDraw;
+   timpDraw = record
+    MethodID    : Cardinal;
+    imp_RPort   : pRastPort;
+    imp_Offset  : record
+              x : Word;
+              y : Word;
+                  end;
+    imp_State   : Cardinal;
+    imp_DrInfo  : pDrawInfo;
+
+    { these parameters only valid for IM_DRAWFRAME }
+    imp_Dimensions : record
+             Width : Word;
+            Height : Word;
+                     end;
+   END;
+
+{ IM_ERASE, IM_ERASEFRAME      }
+{ NOTE: This is a subset of impDraw    }
+
+   pimpErase = ^timpErase;
+   timpErase = record
+    MethodID       : Cardinal;
+    imp_RPort      : pRastPort;
+    imp_Offset     : record
+                 x : Word;
+                 y : Word;
+                     end;
+
+    { these parameters only valid for IM_ERASEFRAME }
+    imp_Dimensions : record
+             Width : Word;
+            Height : Word;
+                     end;
+   END;
+
+{ IM_HITTEST, IM_HITFRAME      }
+
+   pimpHitTest = ^timpHitTest;
+   timpHitTest = record
+    MethodID   : Cardinal;
+    imp_Point  : record
+             x : Word;
+             y : Word;
+                 end;
+
+    { these parameters only valid for IM_HITFRAME }
+    imp_Dimensions : record
+               Width : Word;
+               Height : Word;
+               end;
+   END;
+
+
+{ The IM_DOMAINFRAME method is used to obtain the sizing
+ * requirements of an image object within a layout group.
+ }
+
+{ IM_DOMAINFRAME }
+     PimpDomainFrame = ^timpDomainFrame;
+     timpDomainFrame = record
+          MethodID : Cardinal;
+          imp_DrInfo : PDrawInfo;
+          imp_RPort : PRastPort;
+          imp_Which : LongInt;
+          imp_Domain : tIBox;
+          imp_Attrs : PTagItem;
+       end;
+
+  { Accepted vales for imp_Which.
+    }
+
+  const
+     IDOMAIN_MINIMUM = 0;
+     IDOMAIN_NOMINAL = 1;
+     IDOMAIN_MAXIMUM = 2;
+
+ { **  'boopsi' pointer class interface }
+
+const
+{ The following tags are recognized at NewObject() time by
+ * pointerclass:
+ *
+ * POINTERA_BitMap (struct BitMap *) - Pointer to bitmap to
+ *      get pointer imagery from.  Bitplane data need not be
+ *      in chip RAM.
+ * POINTERA_XOffset (LONG) - X-offset of the pointer hotspot.
+ * POINTERA_YOffset (LONG) - Y-offset of the pointer hotspot.
+ * POINTERA_WordWidth (Cardinal) - designed width of the pointer in words
+ * POINTERA_XResolution (Cardinal) - one of the POINTERXRESN_ flags below
+ * POINTERA_YResolution (Cardinal) - one of the POINTERYRESN_ flags below
+ *
+ }
+
+ POINTERA_Dummy = (TAG_USER + $39000);
+
+ POINTERA_BitMap        = (POINTERA_Dummy + $01);
+ POINTERA_XOffset       = (POINTERA_Dummy + $02);
+ POINTERA_YOffset       = (POINTERA_Dummy + $03);
+ POINTERA_WordWidth     = (POINTERA_Dummy + $04);
+ POINTERA_XResolution   = (POINTERA_Dummy + $05);
+ POINTERA_YResolution   = (POINTERA_Dummy + $06);
+
+{ These are the choices for the POINTERA_XResolution attribute which
+ * will determine what resolution pixels are used for this pointer.
+ *
+ * POINTERXRESN_DEFAULT (ECS-compatible pointer width)
+ *      = 70 ns if SUPERHIRES-type mode, 140 ns if not
+ *
+ * POINTERXRESN_SCREENRES
+ *      = Same as pixel speed of screen
+ *
+ * POINTERXRESN_LORES (pointer always in lores-like pixels)
+ *      = 140 ns in 15kHz modes, 70 ns in 31kHz modes
+ *
+ * POINTERXRESN_HIRES (pointer always in hires-like pixels)
+ *      = 70 ns in 15kHz modes, 35 ns in 31kHz modes
+ *
+ * POINTERXRESN_140NS (pointer always in 140 ns pixels)
+ *      = 140 ns always
+ *
+ * POINTERXRESN_70NS (pointer always in 70 ns pixels)
+ *      = 70 ns always
+ *
+ * POINTERXRESN_35NS (pointer always in 35 ns pixels)
+ *      = 35 ns always
+ }
+
+ POINTERXRESN_DEFAULT   = 0;
+ POINTERXRESN_140NS     = 1;
+ POINTERXRESN_70NS      = 2;
+ POINTERXRESN_35NS      = 3;
+
+ POINTERXRESN_SCREENRES = 4;
+ POINTERXRESN_LORES     = 5;
+ POINTERXRESN_HIRES     = 6;
+
+{ These are the choices for the POINTERA_YResolution attribute which
+ * will determine what vertical resolution is used for this pointer.
+ *
+ * POINTERYRESN_DEFAULT
+ *      = In 15 kHz modes, the pointer resolution will be the same
+ *        as a non-interlaced screen.  In 31 kHz modes, the pointer
+ *        will be doubled vertically.  This means there will be about
+ *        200-256 pointer lines per screen.
+ *
+ * POINTERYRESN_HIGH
+ * POINTERYRESN_HIGHASPECT
+ *      = Where the hardware/software supports it, the pointer resolution
+ *        will be high.  This means there will be about 400-480 pointer
+ *        lines per screen.  POINTERYRESN_HIGHASPECT also means that
+ *        when the pointer comes out double-height due to hardware/software
+ *        restrictions, its width would be doubled as well, if possible
+ *        (to preserve aspect).
+ *
+ * POINTERYRESN_SCREENRES
+ * POINTERYRESN_SCREENRESASPECT
+ *      = Will attempt to match the vertical resolution of the pointer
+ *        to the screen's vertical resolution.  POINTERYRESN_SCREENASPECT also
+ *        means that when the pointer comes out double-height due to
+ *        hardware/software restrictions, its width would be doubled as well,
+ *        if possible (to preserve aspect).
+ *
+ }
+
+ POINTERYRESN_DEFAULT          =  0;
+ POINTERYRESN_HIGH             =  2;
+ POINTERYRESN_HIGHASPECT       =  3;
+ POINTERYRESN_SCREENRES        =  4;
+ POINTERYRESN_SCREENRESASPECT  =  5;
+
+{ Compatibility note:
+ *
+ * The AA chipset supports variable sprite width and resolution, but
+ * the setting of width and resolution is global for all sprites.
+ * When no other sprites are in use, Intuition controls the sprite
+ * width and sprite resolution for correctness based on pointerclass
+ * attributes specified by the creator of the pointer.  Intuition
+ * controls sprite resolution with the VTAG_DEFSPRITERESN_SET tag
+ * to VideoControl().  Applications can override this on a per-viewport
+ * basis with the VTAG_SPRITERESN_SET tag to VideoControl().
+ *
+ * If an application uses a sprite other than the pointer sprite,
+ * Intuition will automatically regenerate the pointer sprite's image in
+ * a compatible width.  This might involve BitMap scaling of the imagery
+ * you supply.
+ *
+ * If any sprites other than the pointer sprite were obtained with the
+ * old GetSprite() call, Intuition assumes that the owner of those
+ * sprites is unaware of sprite resolution, hence Intuition will set the
+ * default sprite resolution (VTAG_DEFSPRITERESN_SET) to ECS-compatible,
+ * instead of as requested by the various pointerclass attributes.
+ *
+ * No resolution fallback occurs when applications use ExtSprites.
+ * Such applications are expected to use VTAG_SPRITERESN_SET tag if
+ * necessary.
+ *
+ * NB:  Under release V39, only sprite width compatibility is implemented.
+ * Sprite resolution compatibility was added for V40.
+ }
+
+
+Type
+
+   pStringExtend = ^tStringExtend;
+   tStringExtend = record
+    { display specifications   }
+    Font        : pTextFont;      { must be an open Font (not TextAttr)  }
+    Pens        : Array[0..1] of Byte;        { color of text/backgroun              }
+    ActivePens  : Array[0..1] of Byte;  { colors when gadget is active         }
+
+    { edit specifications      }
+    InitialModes : Cardinal;   { initial mode flags, below            }
+    EditHook     : pHook;      { IF non-NULL, must supply WorkBuffer  }
+    WorkBuffer   : PChar;    { must be as large as StringInfo.Buffer}
+
+    Reserved     : Array[0..3] of Cardinal;    { set to 0                             }
+   END;
+
+   pSGWork = ^tSGWork;
+   tSGWork = record
+    { set up when gadget is first activated    }
+    Gad       : pGadget;         { the contestant itself        }   { Gadget in C-Includes }
+    StrInfo   : pStringInfo;     { easy access to sinfo         }   { StrInfo in C-Includes }
+    WorkBuffer : PChar;           { intuition's planned result   }
+    PrevBuffer : PChar;           { what was there before        }
+    Modes      : Cardinal;          { current mode                 }
+
+    { modified for each input event    }
+    IEvent     : pInputEvent;    { actual event: do not change  }
+    Code       : Word;            { character code, IF one byte  }
+    BufferPos  : smallint;            { cursor position              }
+    NumChars   : smallint;
+    Actions    : Cardinal;          { what Intuition will do       }
+    LongInt_   : Longint;          { temp storage for longint     }
+
+    GInfo      : pGadgetInfo;    { see cghooks.h                }   { GadgetInfo in C-Includes }
+    EditOp     : Word;            { from constants below         }
+   END;
+
+{ SGWork.EditOp -
+ * These values indicate what basic type of operation the global
+ * editing hook has performed on the string before your gadget's custom
+ * editing hook gets called.  You do not have to be concerned with the
+ * value your custom hook leaves in the EditOp field, only if you
+ * write a global editing hook.
+ *
+ * For most of these general edit operations, you'll want to compare
+ * the BufferPos and NumChars of the StringInfo (before global editing)
+ * and SGWork (after global editing).
+ }
+
+CONST
+ EO_NOOP       =  ($0001);
+        { did nothing                                                  }
+ EO_DELBACKWARD=  ($0002);
+        { deleted some chars (maybe 0).                                }
+ EO_DELFORWARD =  ($0003);
+        { deleted some characters under and in front of the cursor     }
+ EO_MOVECURSOR =  ($0004);
+        { moved the cursor                                             }
+ EO_ENTER      =  ($0005);
+        { "enter" or "return" key, terminate                           }
+ EO_RESET      =  ($0006);
+        { current Intuition-style undo                                 }
+ EO_REPLACECHAR=  ($0007);
+        { replaced one character and (maybe) advanced cursor           }
+ EO_INSERTCHAR =  ($0008);
+        { inserted one char into string or added one at end            }
+ EO_BADFORMAT  =  ($0009);
+        { didn't like the text data, e.g., Bad LONGINT                 }
+ EO_BIGCHANGE  =  ($000A);        { unused by Intuition  }
+        { complete or major change to the text, e.g. new string        }
+ EO_UNDO       =  ($000B);        { unused by Intuition  }
+        { some other style of undo                                     }
+ EO_CLEAR      =  ($000C);
+        { clear the string                                             }
+ EO_SPECIAL    =  ($000D);        { unused by Intuition  }
+        { some operation that doesn't fit into the categories here     }
+
+
+{ Mode Flags definitions (ONLY first group allowed as InitialModes)    }
+ SGM_REPLACE   =  (1);       { replace mode                 }
+{ please initialize StringInfo with in-range value of BufferPos
+ * if you are using SGM_REPLACE mode.
+ }
+
+ SGM_FIXEDFIELD = (2);       { fixed length buffer          }
+                                        { always set SGM_REPLACE, too  }
+ SGM_NOFILTER   = (4);       { don't filter control chars   }
+
+{ SGM_EXITHELP is new for V37, and ignored by V36: }
+ SGM_EXITHELP   = (128);       { exit with code = $5F IF HELP hit }
+
+
+{ These Mode Flags are for internal use only                           }
+ SGM_NOCHANGE   = (8);       { no edit changes yet          }
+ SGM_NOWORKB    = (16);       { Buffer == PrevBuffer         }
+ SGM_CONTROL    = (32);       { control char escape mode     }
+ SGM_LONGINT    = (64);       { an intuition longint gadget  }
+
+{ String Gadget Action Flags (put in SGWork.Actions by EditHook)       }
+ SGA_USE        = ($1);  { use contents of SGWork               }
+ SGA_END        = ($2);  { terminate gadget, code in Code field }
+ SGA_BEEP       = ($4);  { flash the screen for the user        }
+ SGA_REUSE      = ($8);  { reuse input event                    }
+ SGA_REDISPLAY  = ($10); { gadget visuals changed               }
+
+{ New for V37: }
+ SGA_NEXTACTIVE = ($20); { Make next possible gadget active.    }
+ SGA_PREVACTIVE = ($40); { Make previous possible gadget active.}
+
+{ function id for only existing custom string gadget edit hook }
+
+ SGH_KEY        = (1);    { process editing keystroke            }
+ SGH_CLICK      = (2);    { process mouse click cursor position  }
+
+{ Here's a brief summary of how the custom string gadget edit hook works:
+ *      You provide a hook in StringInfo.Extension.EditHook.
+ *      The hook is called in the standard way with the 'object'
+ *      a pointer to SGWork, and the 'message' a pointer to a command
+ *      block, starting either with (longword) SGH_KEY, SGH_CLICK,
+ *      or something new.
+ *
+ *      You return 0 if you don't understand the command (SGH_KEY is
+ *      required and assumed).  Return non-zero if you implement the
+ *      command.
+ *
+ *   SGH_KEY:
+ *      There are no parameters following the command longword.
+ *
+ *      Intuition will put its idea of proper values in the SGWork
+ *      before calling you, and if you leave SGA_USE set in the
+ *      SGWork.Actions field, Intuition will use the values
+ *      found in SGWork fields WorkBuffer, NumChars, BufferPos,
+ *      and LongInt, copying the WorkBuffer back to the StringInfo
+ *      Buffer.
+ *
+ *      NOTE WELL: You may NOT change other SGWork fields.
+ *
+ *      If you clear SGA_USE, the string gadget will be unchanged.
+ *
+ *      If you set SGA_END, Intuition will terminate the activation
+ *      of the string gadget.  If you also set SGA_REUSE, Intuition
+ *      will reuse the input event after it deactivates your gadget.
+ *
+ *      In this case, Intuition will put the value found in SGWork.Code
+ *      into the IntuiMessage.Code field of the IDCMP_GADGETUP message it
+ *      sends to the application.
+ *
+ *      If you set SGA_BEEP, Intuition will call DisplayBeep(); use
+ *      this if the user has typed in error, or buffer is full.
+ *
+ *      Set SGA_REDISPLAY if the changes to the gadget warrant a
+ *      gadget redisplay.  Note: cursor movement requires a redisplay.
+ *
+ *      Starting in V37, you may set SGA_PREVACTIVE or SGA_NEXTACTIVE
+ *      when you set SGA_END.  This tells Intuition that you want
+ *      the next or previous gadget with GFLG_TABCYCLE to be activated.
+ *
+ *   SGH_CLICK:
+ *      This hook command is called when Intuition wants to position
+ *      the cursor in response to a mouse click in the string gadget.
+ *
+ *      Again, here are no parameters following the command longword.
+ *
+ *      This time, Intuition has already calculated the mouse position
+ *      character cell and put it in SGWork.BufferPos.  The previous
+ *      BufferPos value remains in the SGWork.StringInfo.BufferPos.
+ *
+ *      Intuition will again use the SGWork fields listed above for
+ *      SGH_KEY.  One restriction is that you are NOT allowed to set
+ *      SGA_END or SGA_REUSE for this command.  Intuition will not
+ *      stand for a gadget which goes inactive when you click in it.
+ *
+ *      You should always leave the SGA_REDISPLAY flag set, since Intuition
+ *      uses this processing when activating a string gadget.
+ }
+
+const
+  INTUITIONNAME : PChar = 'intuition.library';
+
+var 
+  intuitionbase : PIntuitionBase;
+
+
+procedure OpenIntuition;
+SysCall IntuitionBase 030;
+
+procedure Intuition(iEvent : pInputEvent location 'a0');
+SysCall IntuitionBase 036;
+
+function AddGadget(window : pWindow location 'a0'; gadget : pGadget location 'a1'; position : CARDINAL location 'd0') : Word;
+SysCall IntuitionBase 042;
+
+function ClearDMRequest(window : pWindow location 'a0') : BOOLEAN;
+SysCall IntuitionBase 048;
+
+procedure ClearMenuStrip(window : pWindow location 'a0');
+SysCall IntuitionBase 054;
+
+procedure ClearPointer(window : pWindow location 'a0');
+SysCall IntuitionBase 060;
+
+function CloseScreen(screen : pScreen location 'a0') : BOOLEAN;
+SysCall IntuitionBase 066;
+
+procedure CloseWindow(window : pWindow location 'a0');
+SysCall IntuitionBase 072;
+
+function CloseWorkBench : LongInt;
+SysCall IntuitionBase 078;
+
+procedure CurrentTime(VAR seconds : CARDINAL location 'a0'; VAR micros : CARDINAL location 'a1');
+SysCall IntuitionBase 084;
+
+function DisplayAlert(alertNumber : CARDINAL location 'd0'; string1 : PChar location 'a0'; height : CARDINAL location 'd1') : BOOLEAN;
+SysCall IntuitionBase 090;
+
+procedure DisplayBeep(screen : pScreen location 'a0');
+SysCall IntuitionBase 096;
+
+function DoubleClick(sSeconds : CARDINAL location 'd0'; sMicros : CARDINAL location 'd1'; cSeconds : CARDINAL location 'd2'; cMicros : CARDINAL location 'd3') : BOOLEAN;
+SysCall IntuitionBase 102;
+
+procedure DrawBorder(rp : pRastPort location 'a0'; border : pBorder location 'a1'; leftOffset : LongInt location 'd0'; topOffset : LongInt location 'd1');
+SysCall IntuitionBase 108;
+
+procedure DrawImage(rp : pRastPort location 'a0'; image : pImage location 'a1'; leftOffset : LongInt location 'd0'; topOffset : LongInt location 'd1');
+SysCall IntuitionBase 114;
+
+procedure EndRequest(requester : pRequester location 'a0'; window : pWindow location 'a1');
+SysCall IntuitionBase 120;
+
+function GetDefPrefs(preferences : pPreferences location 'a0'; size : LongInt location 'd0') : pPreferences;
+SysCall IntuitionBase 126;
+
+function GetPrefs(preferences : pPreferences location 'a0'; size : LongInt location 'd0') : pPreferences;
+SysCall IntuitionBase 132;
+
+procedure InitRequester(requester : pRequester location 'a0');
+SysCall IntuitionBase 138;
+
+function ItemAddress(menuStrip : pMenu location 'a0'; menuNumber : CARDINAL location 'd0') : pMenuItem;
+SysCall IntuitionBase 144;
+
+function ModifyIDCMP(window : pWindow location 'a0'; flags : CARDINAL location 'd0') : BOOLEAN;
+SysCall IntuitionBase 150;
+
+procedure ModifyProp(gadget : pGadget location 'a0'; window : pWindow location 'a1'; requester : pRequester location 'a2'; flags : CARDINAL location 'd0'; horizPot : CARDINAL location 'd1'; vertPot : CARDINAL location 'd2'; horizBody : CARDINAL location 'd3'; vertBody : CARDINAL location 'd4');
+SysCall IntuitionBase 156;
+
+procedure MoveScreen(screen : pScreen location 'a0'; dx : LongInt location 'd0'; dy : LongInt location 'd1');
+SysCall IntuitionBase 162;
+
+procedure MoveWindow(window : pWindow location 'a0'; dx : LongInt location 'd0'; dy : LongInt location 'd1');
+SysCall IntuitionBase 168;
+
+procedure OffGadget(gadget : pGadget location 'a0'; window : pWindow location 'a1'; requester : pRequester location 'a2');
+SysCall IntuitionBase 174;
+
+procedure OffMenu(window : pWindow location 'a0'; menuNumber : CARDINAL location 'd0');
+SysCall IntuitionBase 180;
+
+procedure OnGadget(gadget : pGadget location 'a0'; window : pWindow location 'a1'; requester : pRequester location 'a2');
+SysCall IntuitionBase 186;
+
+procedure OnMenu(window : pWindow location 'a0'; menuNumber : CARDINAL location 'd0');
+SysCall IntuitionBase 192;
+
+function OpenScreen(newScreen : pNewScreen location 'a0') : pScreen;
+SysCall IntuitionBase 198;
+
+function OpenWindow(newWindow : pNewWindow location 'a0') : pWindow;
+SysCall IntuitionBase 204;
+
+function OpenWorkBench : CARDINAL;
+SysCall IntuitionBase 210;
+
+procedure PrintIText(rp : pRastPort location 'a0'; iText : pIntuiText location 'a1'; left : LongInt location 'd0'; top : LongInt location 'd1');
+SysCall IntuitionBase 216;
+
+procedure RefreshGadgets(gadgets : pGadget location 'a0'; window : pWindow location 'a1'; requester : pRequester location 'a2');
+SysCall IntuitionBase 222;
+
+function RemoveGadget(window : pWindow location 'a0'; gadget : pGadget location 'a1') : Word;
+SysCall IntuitionBase 228;
+
+procedure ReportMouse(flag : LongInt location 'd0'; window : pWindow location 'a0');
+SysCall IntuitionBase 234;
+
+function Request(requester : pRequester location 'a0'; window : pWindow location 'a1') : BOOLEAN;
+SysCall IntuitionBase 240;
+
+procedure ScreenToBack(screen : pScreen location 'a0');
+SysCall IntuitionBase 246;
+
+procedure ScreenToFront(screen : pScreen location 'a0');
+SysCall IntuitionBase 252;
+
+function SetDMRequest(window : pWindow location 'a0'; requester : pRequester location 'a1') : BOOLEAN;
+SysCall IntuitionBase 258;
+
+function SetMenuStrip(window : pWindow location 'a0'; menu : pMenu location 'a1') : BOOLEAN;
+SysCall IntuitionBase 264;
+
+procedure SetPointer(window : pWindow location 'a0'; VAR pointer : Word location 'a1'; height : LongInt location 'd0'; width : LongInt location 'd1'; xOffset : LongInt location 'd2'; yOffset : LongInt location 'd3');
+SysCall IntuitionBase 270;
+
+procedure SetWindowTitles(window : pWindow location 'a0'; windowTitle : PChar location 'a1'; screenTitle : PChar location 'a2');
+SysCall IntuitionBase 276;
+
+procedure ShowTitle(screen : pScreen location 'a0'; showIt : LongInt location 'd0');
+SysCall IntuitionBase 282;
+
+procedure SizeWindow(window : pWindow location 'a0'; dx : LongInt location 'd0'; dy : LongInt location 'd1');
+SysCall IntuitionBase 288;
+
+function ViewAddress : pView;
+SysCall IntuitionBase 294;
+
+function ViewPortAddress(window : pWindow location 'a0') : pViewPort;
+SysCall IntuitionBase 300;
+
+procedure WindowToBack(window : pWindow location 'a0');
+SysCall IntuitionBase 306;
+
+procedure WindowToFront(window : pWindow location 'a0');
+SysCall IntuitionBase 312;
+
+function WindowLimits(window : pWindow location 'a0'; widthMin : LongInt location 'd0'; heightMin : LongInt location 'd1'; widthMax : CARDINAL location 'd2'; heightMax : CARDINAL location 'd3') : BOOLEAN;
+SysCall IntuitionBase 318;
+
+function SetPrefs(preferences : pPreferences location 'a0'; size : LongInt location 'd0'; inform : LongInt location 'd1') : pPreferences;
+SysCall IntuitionBase 324;
+
+function IntuiTextLength(iText : pIntuiText location 'a0') : LongInt;
+SysCall IntuitionBase 330;
+
+function WBenchToBack : BOOLEAN;
+SysCall IntuitionBase 336;
+
+function WBenchToFront : BOOLEAN;
+SysCall IntuitionBase 342;
+
+function AutoRequest(window : pWindow location 'a0'; body : pIntuiText location 'a1'; posText : pIntuiText location 'a2'; negText : pIntuiText location 'a3'; pFlag : CARDINAL location 'd0'; nFlag : CARDINAL location 'd1'; width : CARDINAL location 'd2'; height : CARDINAL location 'd3') : BOOLEAN;
+SysCall IntuitionBase 348;
+
+procedure BeginRefresh(window : pWindow location 'a0');
+SysCall IntuitionBase 354;
+
+function BuildSysRequest(window : pWindow location 'a0'; body : pIntuiText location 'a1'; posText : pIntuiText location 'a2'; negText : pIntuiText location 'a3'; flags : CARDINAL location 'd0'; width : CARDINAL location 'd1'; height : CARDINAL location 'd2') : pWindow;
+SysCall IntuitionBase 360;
+
+procedure EndRefresh(window : pWindow location 'a0'; complete : LongInt location 'd0');
+SysCall IntuitionBase 366;
+
+procedure FreeSysRequest(window : pWindow location 'a0');
+SysCall IntuitionBase 372;
+
+function MakeScreen(screen : pScreen location 'a0') : LongInt;
+SysCall IntuitionBase 378;
+
+function RemakeDisplay : LongInt;
+SysCall IntuitionBase 384;
+
+function RethinkDisplay : LongInt;
+SysCall IntuitionBase 390;
+
+function AllocRemember(var rememberKey : pRemember location 'a0'; size : CARDINAL location 'd0'; flags : CARDINAL location 'd1') : POINTER;
+SysCall IntuitionBase 396;
+
+procedure FreeRemember(var rememberKey : pRemember location 'a0'; reallyForget : LongInt location 'd0');
+SysCall IntuitionBase 408;
+
+function LockIBase(dontknow : CARDINAL location 'd0') : CARDINAL;
+SysCall IntuitionBase 414;
+
+procedure UnlockIBase(ibLock : CARDINAL location 'a0');
+SysCall IntuitionBase 420;
+
+function GetScreenData(buffer : POINTER location 'a0'; size : CARDINAL location 'd0'; type1 : CARDINAL location 'd1'; screen : pScreen location 'a1') : LongInt;
+SysCall IntuitionBase 426;
+
+procedure RefreshGList(gadgets : pGadget location 'a0'; window : pWindow location 'a1'; requester : pRequester location 'a2'; numGad : LongInt location 'd0');
+SysCall IntuitionBase 432;
+
+function AddGList(window : pWindow location 'a0'; gadget : pGadget location 'a1'; position : CARDINAL location 'd0'; numGad : LongInt location 'd1'; requester : pRequester location 'a2') : Word;
+SysCall IntuitionBase 438;
+
+function RemoveGList(remPtr : pWindow location 'a0'; gadget : pGadget location 'a1'; numGad : LongInt location 'd0') : Word;
+SysCall IntuitionBase 444;
+
+procedure ActivateWindow(window : pWindow location 'a0');
+SysCall IntuitionBase 450;
+
+procedure RefreshWindowFrame(window : pWindow location 'a0');
+SysCall IntuitionBase 456;
+
+function ActivateGadget(gadgets : pGadget location 'a0'; window : pWindow location 'a1'; requester : pRequester location 'a2') : BOOLEAN;
+SysCall IntuitionBase 462;
+
+procedure NewModifyProp(gadget : pGadget location 'a0'; window : pWindow location 'a1'; requester : pRequester location 'a2'; flags : CARDINAL location 'd0'; horizPot : CARDINAL location 'd1'; vertPot : CARDINAL location 'd2'; horizBody : CARDINAL location 'd3'; vertBody : CARDINAL location 'd4'; numGad : LongInt location 'd5');
+SysCall IntuitionBase 468;
+
+function QueryOverscan(displayID : CARDINAL location 'a0'; rect : pRectangle location 'a1'; oScanType : LongInt location 'd0') : LongInt;
+SysCall IntuitionBase 474;
+
+procedure MoveWindowInFrontOf(window : pWindow location 'a0'; behindWindow : pWindow location 'a1');
+SysCall IntuitionBase 480;
+
+procedure ChangeWindowBox(window : pWindow location 'a0'; left : LongInt location 'd0'; top : LongInt location 'd1'; width : LongInt location 'd2'; height : LongInt location 'd3');
+SysCall IntuitionBase 486;
+
+function SetEditHook(hook : pHook location 'a0') : pHook;
+SysCall IntuitionBase 492;
+
+function SetMouseQueue(window : pWindow location 'a0'; queueLength : CARDINAL location 'd0') : LongInt;
+SysCall IntuitionBase 498;
+
+procedure ZipWindow(window : pWindow location 'a0');
+SysCall IntuitionBase 504;
+
+function LockPubScreen(name : PChar location 'a0') : pScreen;
+SysCall IntuitionBase 510;
+
+procedure UnlockPubScreen(name : PChar location 'a0'; screen : pScreen location 'a1');
+SysCall IntuitionBase 516;
+
+function LockPubScreenList : pList;
+SysCall IntuitionBase 522;
+
+procedure UnlockPubScreenList;
+SysCall IntuitionBase 528;
+
+function NextPubScreen(screen : pScreen location 'a0'; namebuf : PChar location 'a1') : PChar;
+SysCall IntuitionBase 534;
+
+procedure SetDefaultPubScreen(name : PChar location 'a0');
+SysCall IntuitionBase 540;
+
+function SetPubScreenModes(modes : CARDINAL location 'd0') : Word;
+SysCall IntuitionBase 546;
+
+function PubScreenStatus(screen : pScreen location 'a0'; statusFlags : CARDINAL location 'd0') : Word;
+SysCall IntuitionBase 552;
+
+function ObtainGIRPort(gInfo : pGadgetInfo location 'a0') : pRastPort;
+SysCall IntuitionBase 558;
+
+procedure ReleaseGIRPort(rp : pRastPort location 'a0');
+SysCall IntuitionBase 564;
+
+procedure GadgetMouse(gadget : pGadget location 'a0'; gInfo : pGadgetInfo location 'a1'; VAR mousePoint : INTEGER location 'a2');
+SysCall IntuitionBase 570;
+
+procedure GetDefaultPubScreen(nameBuffer : PChar location 'a0');
+SysCall IntuitionBase 582;
+
+function EasyRequestArgs(window : pWindow location 'a0'; easyStruct : pEasyStruct location 'a1'; VAR idcmpPtr : CARDINAL location 'a2'; args : POINTER location 'a3') : LongInt;
+SysCall IntuitionBase 588;
+
+function BuildEasyRequestArgs(window : pWindow location 'a0'; easyStruct : pEasyStruct location 'a1'; idcmp : CARDINAL location 'd0'; args : POINTER location 'a3') : pWindow;
+SysCall IntuitionBase 594;
+
+function SysReqHandler(window : pWindow location 'a0'; VAR idcmpPtr : CARDINAL location 'a1'; waitInput : LongInt location 'd0') : LongInt;
+SysCall IntuitionBase 600;
+
+function OpenWindowTagList(newWindow : pNewWindow location 'a0'; tagList : pTagItem location 'a1') : pWindow;
+SysCall IntuitionBase 606;
+
+function OpenWindowTags(newWindow : pNewWindow; tagList : array of DWord) : pWindow; Inline;
+
+function OpenScreenTagList(newScreen : pNewScreen location 'a0'; tagList : pTagItem location 'a1') : pScreen;
+SysCall IntuitionBase 612;
+
+function OpenScreenTags(newScreen : pNewScreen; tagList : array of DWord) : pScreen; Inline;
+
+procedure DrawImageState(rp : pRastPort location 'a0'; image : pImage location 'a1'; leftOffset : LongInt location 'd0'; topOffset : LongInt location 'd1'; state : CARDINAL location 'd2'; drawInfo : pDrawInfo location 'a2');
+SysCall IntuitionBase 618;
+
+function PointInImage(point : CARDINAL location 'd0'; image : pImage location 'a0') : BOOLEAN;
+SysCall IntuitionBase 624;
+
+procedure EraseImage(rp : pRastPort location 'a0'; image : pImage location 'a1'; leftOffset : LongInt location 'd0'; topOffset : LongInt location 'd1');
+SysCall IntuitionBase 630;
+
+function NewObjectA(classPtr : pIClass location 'a0'; classID : PChar location 'a1'; tagList : pTagItem location 'a2') : POINTER;
+SysCall IntuitionBase 636;
+
+procedure DisposeObject(object1 : POINTER location 'a0');
+SysCall IntuitionBase 642;
+
+function SetAttrsA(object1 : POINTER location 'a0'; tagList : pTagItem location 'a1') : CARDINAL;
+SysCall IntuitionBase 648;
+
+function GetAttr(attrID : CARDINAL location 'd0'; object1 : POINTER location 'a0'; VAR storagePtr : CARDINAL location 'a1') : CARDINAL;
+SysCall IntuitionBase 654;
+
+function SetGadgetAttrsA(gadget : pGadget location 'a0'; window : pWindow location 'a1'; requester : pRequester location 'a2'; tagList : pTagItem location 'a3') : CARDINAL;
+SysCall IntuitionBase 660;
+
+function NextObject(objectPtrPtr : POINTER location 'a0') : POINTER;
+SysCall IntuitionBase 666;
+
+function MakeClass(classID : PChar location 'a0'; superClassID : PChar location 'a1'; superClassPtr : pIClass location 'a2'; instanceSize : CARDINAL location 'd0'; flags : CARDINAL location 'd1') : pIClass;
+SysCall IntuitionBase 678;
+
+procedure AddClass(classPtr : pIClass location 'a0');
+SysCall IntuitionBase 684;
+
+function GetScreenDrawInfo(screen : pScreen location 'a0') : pDrawInfo;
+SysCall IntuitionBase 690;
+
+procedure FreeScreenDrawInfo(screen : pScreen location 'a0'; drawInfo : pDrawInfo location 'a1');
+SysCall IntuitionBase 696;
+
+function ResetMenuStrip(window : pWindow location 'a0'; menu : pMenu location 'a1') : BOOLEAN;
+SysCall IntuitionBase 702;
+
+procedure RemoveClass(classPtr : pIClass location 'a0');
+SysCall IntuitionBase 708;
+
+function FreeClass(classPtr : pIClass location 'a0') : BOOLEAN;
+SysCall IntuitionBase 714;
+
+function AllocScreenBuffer(sc : pScreen location 'a0'; bm : pBitMap location 'a1'; flags : CARDINAL location 'd0') : pScreenBuffer;
+SysCall IntuitionBase 768;
+
+procedure FreeScreenBuffer(sc : pScreen location 'a0'; sb : pScreenBuffer location 'a1');
+SysCall IntuitionBase 774;
+
+function ChangeScreenBuffer(sc : pScreen location 'a0'; sb : pScreenBuffer location 'a1') : CARDINAL;
+SysCall IntuitionBase 780;
+
+procedure ScreenDepth(screen : pScreen location 'a0'; flags : CARDINAL location 'd0'; reserved : POINTER location 'a1');
+SysCall IntuitionBase 786;
+
+procedure ScreenPosition(screen : pScreen location 'a0'; flags : CARDINAL location 'd0'; x1 : LongInt location 'd1'; y1 : LongInt location 'd2'; x2 : LongInt location 'd3'; y2 : LongInt location 'd4');
+SysCall IntuitionBase 792;
+
+procedure ScrollWindowRaster(win : pWindow location 'a1'; dx : LongInt location 'd0'; dy : LongInt location 'd1'; xMin : LongInt location 'd2'; yMin : LongInt location 'd3'; xMax : LongInt location 'd4'; yMax : LongInt location 'd5');
+SysCall IntuitionBase 798;
+
+procedure LendMenus(fromwindow : pWindow location 'a0'; towindow : pWindow location 'a1');
+SysCall IntuitionBase 804;
+
+function DoGadgetMethodA(gad : pGadget location 'a0'; win : pWindow location 'a1'; req : pRequester location 'a2'; message : pLongInt location 'a3') : CARDINAL;
+SysCall IntuitionBase 810;
+
+procedure SetWindowPointerA(win : pWindow location 'a0'; taglist : pTagItem location 'a1');
+SysCall IntuitionBase 816;
+
+function TimedDisplayAlert(alertNumber : CARDINAL location 'd0'; string1 : PChar location 'a0'; height : CARDINAL location 'd1'; time : CARDINAL location 'a1') : BOOLEAN;
+SysCall IntuitionBase 822;
+
+procedure HelpControl(win : pWindow location 'a0'; flags : CARDINAL location 'd0');
+SysCall IntuitionBase 828;
+
+procedure ShowWindow(win : pWindow location 'a0');
+SysCall IntuitionBase 840;
+
+procedure HideWindow(win : pWindow location 'a0');
+SysCall IntuitionBase 846;
+
+function GetSkinInfoAttrA(drawinfo : pDrawInfo location 'a0'; attr : CARDINAL location 'd0'; taglist : pTagItem location 'a1') : CARDINAL;
+SysCall IntuitionBase 918;
+
+function GetDrawInfoAttr(drawinfo : pDrawInfo location 'a0'; attr : CARDINAL location 'd0'; VAR errorPtr : CARDINAL location 'a1') : CARDINAL;
+SysCall IntuitionBase 936;
+
+procedure WindowAction(window : pWindow location 'a0'; action : CARDINAL location 'd0'; tags : pTagItem location 'a1');
+SysCall IntuitionBase 942;
+
+function TransparencyControl(window : pWindow location 'a0'; method : CARDINAL location 'd0'; tags : pTagItem location 'a1') : BOOLEAN;
+SysCall IntuitionBase 948;
+
+procedure ScrollWindowRasterNoFill(win : pWindow location 'a1'; dx : LongInt location 'd0'; dy : LongInt location 'd1'; xMin : LongInt location 'd2'; yMin : LongInt location 'd3'; xMax : LongInt location 'd4'; yMax : LongInt location 'd5');
+SysCall IntuitionBase 954;
+
+
+{ Intuition macros }
+function INST_DATA (cl: pIClass; o: p_Object): Pointer;
+function SIZEOF_INSTANCE (cl: pIClass): Longint;
+function BASEOBJECT (o: p_Object): Pointer;
+function _OBJ(o: p_Object): p_Object;
+function __OBJECT (o: Pointer): p_Object;
+function OCLASS (o: Pointer): pIClass;
+function SHIFTITEM (n: smallint): word;
+function SHIFTMENU (n: smallint): word;
+function SHIFTSUB (n: smallint): word;
+function FULLMENUNUM (menu, item, sub: smallint): word;
+function IM_BGPEN (im: pImage): byte;
+function IM_BOX (im: pImage): pIBox;
+function IM_FGPEN (im: pImage): byte;
+function GADGET_BOX (g: pGadget): pIBox;
+function CUSTOM_HOOK (gadget: pGadget): pHook;
+function ITEMNUM( n : Word): Word;
+function MENUNUM( n : Word): Word;
+function SUBNUM( n : Word): Word;
+
+{
+FUNCTION DisplayAlert(alertNumber : Cardinal;string_ : string; height : Cardinal) : BOOLEAN;
+FUNCTION LockPubScreen(name : string) : pScreen;
+FUNCTION MakeClass(classID : string;superClassID : pCHAR;superClassPtr : pIClass; instanceSize : Cardinal; flags : Cardinal) : pIClass;
+FUNCTION MakeClass(classID : pCHAR;superClassID : string;superClassPtr : pIClass; instanceSize : Cardinal; flags : Cardinal) : pIClass;
+FUNCTION MakeClass(classID : string;superClassID : string;superClassPtr : pIClass; instanceSize : Cardinal; flags : Cardinal) : pIClass;
+FUNCTION NewObjectA(classPtr : pIClass;classID : string;tagList : pTagItem) : POINTER;
+PROCEDURE SetDefaultPubScreen(name : string);
+PROCEDURE SetWindowTitles(window : pWindow;windowTitle : string;screenTitle : pCHAR);
+PROCEDURE SetWindowTitles(window : pWindow;windowTitle : pCHAR;screenTitle : string);
+PROCEDURE SetWindowTitles(window : pWindow;windowTitle : string;screenTitle : string);
+FUNCTION TimedDisplayAlert(alertNumber : Cardinal;string_ : string; height : Cardinal; time : Cardinal) : BOOLEAN;
+PROCEDURE UnlockPubScreen(name : string; screen : pScreen);
+}
+
+{ Helper calls }
+function InitIntuitionLibrary : boolean;
+
+
+implementation
+
+{$WARNING Ugly workaround, this still needs support in the compiler}
+function OpenScreenTags(newScreen : pNewScreen; tagList : array of DWord) : pScreen; Inline;
+begin
+  OpenScreenTags:=OpenScreenTagList(newScreen,@tagList);
+end;
+
+function OpenWindowTags(newWindow : pNewWindow; tagList : array of DWord) : pWindow; Inline;
+begin
+  OpenWindowTags:=OpenWindowTagList(newWindow,@tagList);
+end;
+
+
+function INST_DATA (cl: pIClass; o: p_Object): Pointer;
+begin
+    INST_DATA := Pointer(Longint(o) + cl^.cl_InstOffset);
+end;
+
+function SIZEOF_INSTANCE (cl: pIClass): Longint;
+begin
+    SIZEOF_INSTANCE := cl^.cl_InstOffset + cl^.cl_InstSize + sizeof(t_Object);
+end;
+
+function BASEOBJECT (o: p_Object): Pointer;
+begin
+    BASEOBJECT := Pointer(Longint(o) + sizeof(t_Object));
+end;
+
+function _OBJ(o: p_Object): p_Object;
+begin
+     _OBJ := p_Object(o);
+END;
+
+function __OBJECT (o: Pointer): p_Object;
+begin
+    __OBJECT := p_Object(Longint(o) - sizeof(t_Object))
+end;
+
+function OCLASS (o: Pointer): pIClass;
+var
+    obj: p_Object;
+begin
+    obj := p_Object(Longint(o) - sizeof(t_Object));
+    OCLASS := obj^.o_Class;
+end;
+
+function SHIFTITEM (n: smallint): word;
+begin
+    SHIFTITEM := (n and $3f) shl 5
+end;
+
+function SHIFTMENU (n: smallint): word;
+begin
+    SHIFTMENU := n and $1f
+end;
+
+function SHIFTSUB (n: smallint): word;
+begin
+    SHIFTSUB := (n and $1f) shl 11
+end;
+
+function FULLMENUNUM (menu, item, sub: smallint): word;
+begin
+    FULLMENUNUM := ((sub and $1f) shl 11) or
+                    ((item and $3f) shl 5) or
+                      (menu and $1f)
+end;
+
+
+{ The next functons _BGPEN AND _FGPEN aren't a full replacement of the
+  C macros because the C preprocessor makes it possible to set the
+  A/BPen values of the image class objects as well. This can't work
+  in pascal, of course! }
+
+function IM_BGPEN (im: pImage): byte;
+begin
+    IM_BGPEN := im^.PlaneOnOff;
+end;
+
+function IM_BOX (im: pImage): pIBox;
+begin
+    IM_BOX := pIBox(@im^.LeftEdge);
+END;
+
+function IM_FGPEN (im: pImage): byte;
+begin
+    IM_FGPEN := im^.PlanePick;
+end;
+
+function GADGET_BOX (g: pGadget): pIBox;
+begin
+    GADGET_BOX := pIBox(@g^.LeftEdge);
+end;
+
+function CUSTOM_HOOK (gadget: pGadget): pHook;
+begin
+    CUSTOM_HOOK := pHook(gadget^.MutualExclude);
+end;
+
+function ITEMNUM( n : Word): Word;
+begin
+    ITEMNUM := (n shr 5) and $3F
+end;
+
+function MENUNUM( n : Word): Word;
+begin
+    MENUNUM := n and $1f
+end;
+
+function SUBNUM( n : Word): Word;
+begin
+    SUBNUM := (n shr 11) and $1f
+end;
+
+{
+FUNCTION DisplayAlert(alertNumber : Cardinal;string_ : string; height : Cardinal) : BOOLEAN;
+begin
+      DisplayAlert := DisplayAlert(alertNumber,pas2c(string_),height);
+end;
+
+FUNCTION LockPubScreen(name : string) : pScreen;
+begin
+      LockPubScreen := LockPubScreen(pas2c(name));
+end;
+
+FUNCTION MakeClass(classID : string;superClassID : pCHAR;superClassPtr : pIClass; instanceSize : Cardinal; flags : Cardinal) : pIClass;
+begin
+      MakeClass := MakeClass(pas2c(classID),superClassID,superClassPtr,instanceSize,flags);
+end;
+
+FUNCTION MakeClass(classID : pCHAR;superClassID : string;superClassPtr : pIClass; instanceSize : Cardinal; flags : Cardinal) : pIClass;
+begin
+      MakeClass := MakeClass(classID,pas2c(superClassID),superClassPtr,instanceSize,flags); 
+end;
+
+FUNCTION MakeClass(classID : string;superClassID : string;superClassPtr : pIClass; instanceSize : Cardinal; flags : Cardinal) : pIClass;
+begin
+      MakeClass := MakeClass(pas2c(classID),pas2c(superClassID),superClassPtr,instanceSize,flags);
+end;
+
+FUNCTION NewObjectA(classPtr : pIClass;classID : string;tagList : pTagItem) : POINTER;
+begin
+      NewObjectA := NewObjectA(classPtr,pas2c(classID),taglist);
+end;
+
+PROCEDURE SetDefaultPubScreen(name : string);
+begin
+      SetDefaultPubScreen(pas2c(name)); 
+end;
+
+PROCEDURE SetWindowTitles(window : pWindow;windowTitle : string;screenTitle : pCHAR);
+begin
+      SetWindowTitles(window,pas2c(windowTitle),screenTitle);
+end;
+
+PROCEDURE SetWindowTitles(window : pWindow;windowTitle : pCHAR;screenTitle : string);
+begin
+      SetWindowTitles(window,windowTitle,pas2c(screenTitle));
+end;
+
+PROCEDURE SetWindowTitles(window : pWindow;windowTitle : string;screenTitle : string);
+begin
+      SetWindowTitles(window,pas2c(windowTitle),pas2c(screenTitle));
+end;
+
+FUNCTION TimedDisplayAlert(alertNumber : Cardinal;string_ : string; height : Cardinal; time : Cardinal) : BOOLEAN;
+begin
+      TimedDisplayAlert := TimedDisplayAlert(alertNumber,pas2c(string_),height,time);
+end;
+
+PROCEDURE UnlockPubScreen(name : string; screen : pScreen);
+begin
+      UnlockPubScreen(pas2c(name),screen);
+end;
+}
+
+
+const
+  { Change VERSION and LIBVERSION to proper values }
+  VERSION : string[2] = '50';
+  LIBVERSION : longword = 50;
+
+var
+  intuition_exit : Pointer;
+
+procedure CloseIntuitionLibrary;
+begin
+  ExitProc := intuition_exit;
+  if IntuitionBase <> nil then begin
+    CloseLibrary(PLibrary(IntuitionBase));
+    IntuitionBase := nil;
+  end;
+end;
+
+function InitIntuitionLibrary : boolean;
+begin
+  IntuitionBase := nil;
+  IntuitionBase := OpenLibrary(INTUITIONNAME,LIBVERSION);
+  if IntuitionBase <> nil then begin
+    intuition_exit := ExitProc;
+    ExitProc := @CloseIntuitionLibrary;
+    InitIntuitionLibrary:=True;
+  end else begin
+    InitIntuitionLibrary:=False;
+  end;
+end;
+
+
+end. (* UNIT INTUITION *)
+
+{
+  $Log$
+  Revision 1.1  2004-12-07 19:30:13  karoly
+    * initial revision
+
+}