diff options
Diffstat (limited to 'rtl/aros/intuition.pas')
-rw-r--r-- | rtl/aros/intuition.pas | 6090 |
1 files changed, 6090 insertions, 0 deletions
diff --git a/rtl/aros/intuition.pas b/rtl/aros/intuition.pas new file mode 100644 index 0000000000..f0986ced48 --- /dev/null +++ b/rtl/aros/intuition.pas @@ -0,0 +1,6090 @@ +{ + This file is part of the Free Pascal run time library. + + A file in Amiga system run time library. + Copyright (c) 1998-2003 by Nils Sjoholm + member of the Amiga RTL development team. + + See the file COPYING.FPC, included in this distribution, + for details about the copyright. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + + **********************************************************************} + + +{ + History: + Changed tNewWindow.MaxHeigth and tNewWindow.MaxWidth + from Word to Integer. + 30 May 2000. + + Added overlay functions for Pchar->Strings, functions + and procedures. + 14 Jul 2000. + + Added functions and procedures with array of const. + For use with fpc 1.0.7 They are in systemvartags. + 05 Nov 2002. + + Removed amigaoverlays, use smartlink instead. + 05 Nov 2002. + + Added the define use_amiga_smartlink. + 13 Jan 2003. + + Update for AmigaOS 3.9. + New consts and new records. + 04 Feb 2003. + + Changed integer > smallint. + 09 Feb 2003. + + nils.sjoholm@mailbox.swipnet.se Nils Sjoholm + +} + +unit intuition; + +{$mode objfpc} + +interface + +uses + Exec, Utility, agraphics, inputevent, timer, layers; + +//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: LongWord; { 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: LongWord; { 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: LongWord; + + { Tablet range along each axis. For example, if td_TabletX + * can take values 0-999, td_RangeX should be 1000. + } + td_RangeX, td_RangeY: LongWord; + + { 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: LongWord; + + { 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: LongWord; + + { 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: LongWord; + + { 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: LongWord; { 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: LongWord; { 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: LongWord; + + RelLeftEdge: SmallInt; // relative coordinates of the window + RelTopEdge: SmallInt; + + FirstChild: PWindow; // pointer to first child + PrevChild: PWindow; // if window is a child of a window + NextChild: PWindow; // then they are concatenated here. + Parent2: PWindow; // parent of this window + {**** 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: LongWord; { User-selected IDCMP flags } + + Flags: LongWord; { 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 : LongWord; + Flags : LongWord; + 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 + TAG_USER = $80000000; + TAG_DONE = 0; { terminates array of TagItems. ti_Data unused } + TAG_END = TAG_DONE; + 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. + } +WA_ToolBox = (WA_Dummy + 58); + +// AROS specific tags + +WA_Priority = (WA_Dummy + 100); +WA_Parent = (WA_Dummy + 101); +WA_InFrontOf = (WA_Dummy + 102); +WA_Behind = (WA_Dummy + 103); +WA_Visible = (WA_Dummy + 104); +WA_Shape = (WA_Dummy + 105); +WA_ShapeHook = (WA_Dummy + 106); + + +{ 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: LongWord; + 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: LongWord; { should be sizeof (struct EasyStruct )} + es_Flags: LongWord; { 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: LongWord; { 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 LongWord; { 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: LongWord; { see definitions below } + MouseY, + MouseX: SmallInt; { mouse position relative to View } + + Seconds: LongWord; { timestamp of most current input event } + Micros: LongWord; { 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 LongWord; + 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_ = LongWord; + 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 + LongWord MethodID; + method-specific data follows, some examples below + *Msg; } + + PMsg = ^TMsg; + + TMsg = record + MethodID: LongWord; + 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: LongWord; + 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: LongWord; + opu_AttrList: PTagItem; { new attributes } + opu_GInfo: PGadgetInfo; { non-NULL when SetGadgetAttrs OR + * notification resulting from gadget + * input occurs. + } + opu_Flags: LongWord; { 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: LongWord; + opg_Storage: Pointer; { may be other types, but 'int' + * types are all LongWord + } + end; + + { OM_ADDTAIL } + + PopAddTail = ^TopAddTail; + + TopAddTail = record + MethodID: LongWord; + opat_List: pList; + end; + +{ OM_ADDMEMBER, OM_REMMEMBER } +type + + PopMember = ^TopMember; + + TopMember = record + MethodID: LongWord; + 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: LongWord; { 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: LongWord; { per-class data of your choice } + cl_SubclassCount: LongWord; + { how many direct subclasses? } + cl_ObjectCount: LongWord; + { how many objects created of this class? } + cl_Flags: LongWord; + 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: UWord; { 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: LongWord; + 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: LongWord; + 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: LongWord; + 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: LongWord; + gpgi_GInfo: PGadgetInfo; + + { V37 field only! DO NOT attempt to read under V36! } + gpgi_Abort: LongWord; { 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: LongWord; + gpl_GInfo: PGadgetInfo; + gpl_Initial: LongWord; {* 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: LongWord; + gpd_GInfo: PGadgetInfo; + gpd_RPort: PRastPort; { RastPort to layout for } + gpd_Which: LONG; + 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: LongWord; + gpkt_GInfo: PGadgetInfo; + gpkt_IMsg: PIntuiMessage; { The IntuiMessage that triggered this } + gpkt_VanillaKey: LongWord; + 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: LongWord; { GM_KEYGOACTIVE } + gpk_GInfo: PGadgetInfo; + gpk_IEvent: PInputEvent; + gpk_Termination: PLONG; + 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: LongWord; + gpki_GInfo: PGadgetInfo; + gpki_Abort: LongWord; + 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. + (LongWord) + } + + {* 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: LongWord; + imp_ContentsBox: PIBox; { input: relative box of contents } + imp_FrameBox: PIBox; { output: rel. box of encl frame } + imp_DrInfo: PDrawInfo; + imp_FrameFlags: LongWord; + end; + +const + FRAMEF_SPECIFY = (1); { Make do with the dimensions of FrameBox + * provided. + } + +{ IM_DRAW, IM_DRAWFRAME } +type + + PimpDraw = ^TimpDraw; + + TimpDraw = record + MethodID: LongWord; + imp_RPort: PRastPort; + imp_Offset: record + x: Word; + y: Word; + end; + imp_State: LongWord; + 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: LongWord; + 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: LongWord; + 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: LongWord; + imp_DrInfo: PDrawInfo; + imp_RPort: PRastPort; + imp_Which: Long; + 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 (LongWord) - designed width of the pointer in words + * POINTERA_XResolution (LongWord) - one of the POINTERXRESN_ flags below + * POINTERA_YResolution (LongWord) - 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: LongWord; { 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 LongWord; { 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: LongWord; { 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: LongWord; { 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. + } + +type + PNewDecorator = ^TNewDecorator; + TNewDecorator = record + nd_Node: TNode; + nd_Port: PMsgPort; + nd_cnt: LongWord; + nd_Pattern: PChar; + nd_IntPattern: PChar; + nd_Window: PObject_; + nd_Screen: PObject_; + nd_Menu: PObject_; + end; + + + + + +function ActivateGadget(Gadgets: PGadget; Window: PWindow; + Requester: PRequester): Boolean; +procedure ActivateWindow(Window: PWindow); +procedure AddClass(ClassPtr: PIClass); +function AddGadget(Window: PWindow; Gadget: PGadget; Position: LongWord): Word; +function AddGList(Window: PWindow; Gadget: PGadget; Position: LongWord; + NumGad: LongInt; Requester: PRequester): Word; +function AllocIntuiMessage(Window: PWindow): PIntuiMessage; +function AllocRemember(var RememberKey: PRemember; Size: LongWord; + Flags: LongWord): Pointer; +function AllocScreenBuffer(Sc: PScreen; Bm: PBitMap; Flags: LongWord): PScreenBuffer; +procedure AlohaWorkbench(MsgPort: PMsgPort); +function AutoRequest(Window: PWindow; const Body: PIntuiText; + const PosText: PIntuiText; const NegText: PIntuiText; PFlag: LongWord; + NFlag: LongWord; Width: LongWord; Height: LongWord): Boolean; +procedure BeginRefresh(Window: PWindow); +function BuildEasyRequestArgs(Window : PWindow;const easyStruct : PEasyStruct; idcmp : LongWord;const args : Pointer) : PWindow; +function BuildSysRequest(Window: PWindow; const Body: PIntuiText; + const PosText: PIntuiText; const NegText: PIntuiText; Flags: LongWord; + Width: LongWord; Height: LongWord): PWindow; +function ChangeScreenBuffer(Sc: PScreen; Sb: PScreenBuffer): LongWord; +procedure ChangeWindowBox(Window: PWindow; left: LongInt; top: LongInt; + Width: LongInt; Height: LongInt); +function ClearDMRequest(Window: PWindow): Boolean; +procedure ClearMenuStrip(Window: PWindow); +procedure ClearPointer(Window: PWindow); +procedure CloseScreen(Screen: PScreen); +procedure CloseWindow(Window: PWindow); +function CloseWorkBench: Boolean; +procedure ChangeDecoration(ID: LongWord; Decor: PNewDecorator); +function ChangeWindowShape(Window: PWindow; NewShape: PRegion; CallBack: PHook): PRegion; +procedure CurrentTime(var Seconds: LongWord; var Micros: LongWord); +function DisplayAlert(AlertNumber: LongWord; + const string_: PChar; Height: LongWord): Boolean; +procedure DisplayBeep(Screen: PScreen); +procedure DisposeObject(obj : Pointer); +function DoGadgetMethodA(Gad: PGadget; Win: PWindow; Req: PRequester; Message: TMsg): LongWord; +function DoNotify(Cl: PClass; O: PObject_; Ic: Pointer; Msg: TopUpdate): Pointer; +function DoubleClick(SSeconds: LongWord; SMicros: LongWord; + CSeconds: LongWord; CMicros: LongWord): Boolean; +procedure DrawBorder(Rp: PRastPort; + const Border: PBorder; LeftOffset: LongInt; TopOffset: LongInt); +procedure DrawImage(Rp: PRastPort; Image: PImage; LeftOffset: LongInt; + TopOffset: LongInt); +procedure DrawImageState(Rp : PRastPort; Image : PImage; LeftOffset : LongInt; TopOffset : LongInt; state : LongWord;const DrawInfo : PDrawInfo); +function EasyRequestArgs(Window: PWindow; + const EasyStruct: PEasyStruct; IdcmpPtr: PLongWord; const args: Pointer): LongInt; +procedure EndRefresh(Window: PWindow; Complete: Boolean); +procedure EndRequest(Requester: PRequester; Window: PWindow); +function EndScreenNotify(Notify: Pointer): Boolean; +procedure EraseImage(Rp : PRastPort; Image : PImage; LeftOffset : LongInt; TopOffset : LongInt); +function FindClass(ClassID: PChar): PIClass; +function FreeClass(ClassPtr : PIClass) : Boolean; +procedure FreeICData(ICData: Pointer); +procedure FreeIntuiMessage(IMsg: PIntuiMessage); +procedure FreeMonitorList(Obj: Pointer); +procedure FreeRemember(var RememberKey: PRemember; ReallyForget: LongInt); +procedure FreeScreenBuffer(Sc: PScreen; Sb: PScreenBuffer); +procedure FreeScreenDrawInfo(Screen : PScreen; DrawInfo : PDrawInfo); +procedure FreeSysRequest(Window: PWindow); +procedure GadgetMouse(Gadget: PGadget; gInfo: PGadgetInfo; mousePoint: psmallint); +function GetAttr(attrID: LongWord; obj: Pointer; storagePtr: PLongWord): LongWord; +procedure GetDefaultPubScreen(nameBuffer : PChar); +function GetDefPrefs(preferences: PPreferences; Size: LongInt): PPreferences; +function GetMonitorList(Tags: PTagItem): Pointer; +function GetPrefs(preferences: PPreferences; Size: LongInt): PPreferences; +function GetScreenData(buffer: Pointer; Size: LongWord; type_: LongWord; + const Screen: PScreen): Boolean; +function GetScreenDrawInfo(Screen : PScreen) : PDrawInfo; +procedure HelpControl(Win: PWindow; Flags: LongWord); +procedure HideWindow(Window: PWindow); +procedure InitRequester(Requester: PRequester); +function IntuiTextLength(const iText: PIntuiText): LongInt; +function ItemAddress(const menuStrip: pMenu; menuNumber: LongWord): PMenuItem; +function IsWindowVisible(Window: PWindow): LongWord; +procedure LendMenus(FromWindow: PWindow; ToWindow: PWindow); +function LockIBase(LockNumber: LongWord): LongWord; +function LockPubScreen(const Name: PChar): PScreen; +function LockPubScreenList: PList; +function MakeClass(const classID : PChar;const superClassID : PChar;const superClassPtr : PIClass; instanceSize : LongWord; Flags : LongWord) : PIClass; +function MakeScreen(Screen: PScreen): LongInt; +function ModifyIDCMP(Window: PWindow; Flags: LongWord): Boolean; +procedure ModifyProp(Gadget: PGadget; Window: PWindow; Requester: PRequester; + Flags: LongWord; HorizPot: LongWord; VertPot: LongWord; + HorizBody: LongWord; VertBody: LongWord); +procedure MoveScreen(Screen: PScreen; Dx: LongInt; Dy: LongInt); +procedure MoveWindow(Window: PWindow; Dx: LongInt; Dy: LongInt); +procedure MoveWindowInFrontOf(Window: PWindow; BehindWindow: PWindow); +procedure NewModifyProp(Gadget: PGadget; Window: PWindow; + Requester: PRequester; Flags: LongWord; HorizPot: LongWord; + VertPot: LongWord; HorizBody: LongWord; VertBody: LongWord; NumGad: LongInt); +function NewObjectA(ClassPtr : PIClass;const classID : PChar;const tagList : PTagItem) : Pointer; +function NextObject(ObjectPtrPtr: Pointer): PIClass; +function NextPubScreen(const Screen: PScreen; Namebuf: PChar): PChar; +function ObtainGIRPort(GInfo: PGadgetInfo): PRastPort; +procedure OffGadget(Gadget: PGadget; Window: PWindow; Requester: PRequester); +procedure OffMenu(Window: PWindow; MenuNumber: LongWord); +procedure OnGadget(Gadget: PGadget; Window: PWindow; Requester: PRequester); +procedure OnMenu(Window: PWindow; MenuNumber: LongWord); +function OpenScreen(const NewScreen: PNewScreen): PScreen; +function OpenScreenTagList(const NewScreen : PNewScreen;const tagList : PTagItem) : PScreen; +function OpenWindow(const NewWindow: PNewWindow): PWindow; +function OpenWindowTagList(const NewWindow: PNewWindow; + const TagList: PTagItem): PWindow; +function OpenWorkBench: LongWord; +function PointInImage(point : LongWord; Image : PImage) : Boolean; +procedure PrintIText(Rp: PRastPort; + const IText: PIntuiText; Left: LongInt; Top: LongInt); +function PubScreenStatus(Screen: PScreen; StatusFlags: LongWord): Word; +function QueryOverscan(DisplayID: LongWord; Rect: pRectangle; + OScanType: LongInt): LongInt; +procedure RefreshGadgets(Gadgets: PGadget; Window: PWindow; Requester: PRequester); +procedure RefreshGList(Gadgets: PGadget; Window: PWindow; + Requester: PRequester; NumGad: LongInt); +procedure RefreshWindowFrame(Window: PWindow); +procedure ReleaseGIRPort(Rp: PRastPort); +function RemakeDisplay: LongInt; +procedure RemoveClass(ClassPtr: PIClass); +function RemoveGadget(Window: PWindow; Gadget: PGadget): Word; +function RemoveGList(RemPtr: PWindow; Gadget: PGadget; NumGad: LongInt): Word; +procedure ReportMouse(flag: LongInt; Window: PWindow); +function Request(Requester: PRequester; Window: PWindow): Boolean; +function ResetMenuStrip(Window : PWindow; menu : pMenu) : Boolean; +function RethinkDisplay: LongInt; +procedure ScreenDepth(Screen: PScreen; Flags: LongWord; Reserved: Pointer); +procedure ScreenPosition(Screen: PScreen; Flags: LongWord; X1: LongInt; Y1: LongInt; X2: LongInt; Y2: LongInt); +procedure ScreenToBack(Screen: PScreen); +procedure ScreenToFront(Screen: PScreen); +procedure ScrollWindowRaster(Win: PWindow; Dx: LongInt; Dy: LongInt; XMin: LongInt; YMin: LongInt; XMax: LongInt; YMax: LongInt); +procedure ScrollWindowRasterNoFill(Window: PWindow; Dx, Dy, XMin, YMin, XMax, YMax: Word); +procedure SendIntuiMessage(Window: PWindow; IMsg: PIntuiMessage); +function SetAttrsA(obj: Pointer; const TagList: PTagItem): LongWord; +procedure SetDefaultPubScreen(const Name: PChar); +procedure SetDefaultScreenFont(TextFont: PTextFont); +function SetDMRequest(Window: PWindow; Requester: PRequester): Boolean; +function SetEditHook(hook: PHook): PHook; +function SetGadgetAttrsA(Gadget : PGadget; Window : PWindow; Requester : PRequester;const TagList : PTagItem) : LongWord; +function SetMenuStrip(Window: PWindow; menu: pMenu): Boolean; +function SetMouseQueue(Window: PWindow; queueLength: LongWord): LongInt; +procedure SetPointer(Window: PWindow; Pointer_: PWord; Height: LongInt; + Width: LongInt; XOffset: LongInt; YOffset: LongInt); +function SetPointerBounds(Screen: PScreen; Rect: TRectangle; Reserved: LongWord; Tags: PTagItem): LongWord; +function SetPrefs(const Preferences: PPreferences; Size: LongInt; + Inform: LongInt): PPreferences; +function SetPubScreenModes(modes: LongWord): Word; +procedure SetWindowPointerA(Win : PWindow;const Taglist : PTagItem); +procedure SetWindowTitles(Window: PWindow; const WindowTitle: PChar; + const ScreenTitle: PChar); +procedure ShowTitle(Screen: PScreen; showIt: LongInt); +procedure ShowWindow(Window: PWindow); +procedure SizeWindow(Window: PWindow; Dx: LongInt; Dy: LongInt); +function StartScreenNotifyTagList(Tags: PTagItem): Pointer; +function SysReqHandler(Window : PWindow; IdcmpPtr : PLongWord; waitInput : LongInt) : LongInt; +function TimedDisplayAlert(AlertNumber: LongWord;const String_: PChar; Height: LongWord; Time: LongWord): Boolean; +procedure UnlockIBase(LockNumber: LongWord); +procedure UnlockPubScreen(const Name: PChar; Screen: PScreen); +procedure UnlockPubScreenList; +function ViewAddress: PView; +function ViewPortAddress(const Window: PWindow): PViewPort; +function WBenchToBack: Boolean; +function WBenchToFront: Boolean; +procedure WindowAction(Window: PWindow; Action: LongWord; Tags: PTagItem); +function WindowLimits(Window: PWindow; WidthMin: LongInt; HeightMin: LongInt; + WidthMax: LongWord; HeightMax: LongWord): Boolean; +procedure WindowToBack(Window: PWindow); +procedure WindowToFront(Window: PWindow); +procedure ZipWindow(Window: PWindow); + +function SetAttrs(Obj: Pointer; const Tags: array of const): LongWord; + +function OCLASS(O: Pointer): PIClass; + +function Has_Children(Win: PWindow): Boolean; +function Is_Children(Win: PWindow): Boolean; + +{ 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 : LongWord;const String_ : string; Height : LongWord) : Boolean; +//function LockPubScreen(const Name : string) : PScreen; +//function MakeClass(const ClassID : string;const superClassID : PChar;const SuperClassPtr : PIClass; InstanceSize : LongWord; Flags : LongWord) : PIClass; +//function MakeClass(const ClassID : PChar;const superClassID : string;const SuperClassPtr : PIClass; InstanceSize : LongWord; Flags : LongWord) : PIClass; +//function MakeClass(const ClassID : string;const superClassID : string;const SuperClassPtr : PIClass; InstanceSize : LongWord; Flags : LongWord) : PIClass; +//function NewObjectA(ClassPtr : PIClass;const ClassID : string;const TagList : PTagItem) : Pointer; +//PROCEDURE SetDefaultPubScreen(const Name : string); +//PROCEDURE SetWindowTitles(Window : PWindow;const WindowTitle : string;const ScreenTitle : PChar); +//PROCEDURE SetWindowTitles(Window : PWindow;const WindowTitle : PChar;const ScreenTitle : string); +//PROCEDURE SetWindowTitles(Window : PWindow;const WindowTitle : string;const ScreenTitle : string); +//function TimedDisplayAlert(AlertNumber : LongWord;const String_ : string; Height : LongWord; Time : LongWord) : Boolean; +//PROCEDURE UnlockPubScreen(const Name : string; Screen : PScreen); + +implementation + +uses + tagsarray, longarray; + + +{ +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 : LongWord;const String_ : string; Height : LongWord) : Boolean; +begin + DisplayAlert := DisplayAlert(AlertNumber,pas2c(String_),Height); +end; + +function LockPubScreen(const Name : string) : PScreen; +begin + LockPubScreen := LockPubScreen(pas2c(Name)); +end; + +function MakeClass(const ClassID : string;const superClassID : PChar;const SuperClassPtr : PIClass; InstanceSize : LongWord; Flags : LongWord) : PIClass; +begin + MakeClass := MakeClass(pas2c(ClassID),superClassID,SuperClassPtr,InstanceSize,Flags); +end; + +function MakeClass(const ClassID : PChar;const superClassID : string;const SuperClassPtr : PIClass; InstanceSize : LongWord; Flags : LongWord) : PIClass; +begin + MakeClass := MakeClass(ClassID,pas2c(superClassID),SuperClassPtr,InstanceSize,Flags); +end; + +function MakeClass(const ClassID : string;const superClassID : string;const SuperClassPtr : PIClass; InstanceSize : LongWord; Flags : LongWord) : PIClass; +begin + MakeClass := MakeClass(pas2c(ClassID),pas2c(superClassID),SuperClassPtr,InstanceSize,Flags); +end; + +function NewObjectA(ClassPtr : PIClass;const ClassID : string;const TagList : PTagItem) : Pointer; +begin + NewObjectA := NewObjectA(ClassPtr,pas2c(ClassID),Taglist); +end; + +PROCEDURE SetDefaultPubScreen(const Name : string); +begin + SetDefaultPubScreen(pas2c(Name)); +end; + +PROCEDURE SetWindowTitles(Window : PWindow;const WindowTitle : string;const ScreenTitle : PChar); +begin + SetWindowTitles(Window,pas2c(WindowTitle),ScreenTitle); +end; + +PROCEDURE SetWindowTitles(Window : PWindow;const WindowTitle : PChar;const ScreenTitle : string); +begin + SetWindowTitles(Window,WindowTitle,pas2c(ScreenTitle)); +end; + +PROCEDURE SetWindowTitles(Window : PWindow;const WindowTitle : string;const ScreenTitle : string); +begin + SetWindowTitles(Window,pas2c(WindowTitle),pas2c(ScreenTitle)); +end; + +function TimedDisplayAlert(AlertNumber : LongWord;const String_ : string; Height : LongWord; Time : LongWord) : Boolean; +begin + TimedDisplayAlert := TimedDisplayAlert(AlertNumber,pas2c(String_),Height,Time); +end; + +PROCEDURE UnlockPubScreen(const Name : string; Screen : PScreen); +begin + UnlockPubScreen(pas2c(Name),Screen); +end; + } +var + IntuitionBase: Pointer; + + +function AddGadget(Window: PWindow; Gadget: PGadget; Position: LongWord): Word; +type + TLocalCall = function(Window: PWindow; Gadget: PGadget; Position: LongWord; + Base: Pointer): Word; cdecl; +var + Call: TLocalCall; +begin + Call := TLocalCall(GetLibAdress(IntuitionBase, 7)); + AddGadget := Call(Window, Gadget, Position, IntuitionBase); +end; + +function ClearDMRequest(Window: PWindow): Boolean; +type + TLocalCall = function(Window: PWindow; Base: Pointer): Boolean; cdecl; +var + Call: TLocalCall; +begin + Call := TLocalCall(GetLibAdress(IntuitionBase, 8)); + Result := Call(Window, IntuitionBase); +end; + +procedure ClearMenuStrip(Window: PWindow); +type + TLocalCall = procedure(Window: PWindow; Base: Pointer); cdecl; +var + Call: TLocalCall; +begin + Call := TLocalCall(GetLibAdress(IntuitionBase, 9)); + Call(Window, IntuitionBase); +end; + +procedure ClearPointer(Window: PWindow); +type + TLocalCall = procedure(Window: PWindow; Base: Pointer); cdecl; +var + Call: TLocalCall; +begin + Call := TLocalCall(GetLibAdress(IntuitionBase, 10)); + Call(Window, IntuitionBase); +end; + +procedure CloseScreen(Screen: PScreen); +type + TLocalCall = procedure(Screen: PScreen; Base: Pointer); cdecl; +var + Call: TLocalCall; +begin + Call := TLocalCall(GetLibAdress(IntuitionBase, 11)); + Call(Screen, IntuitionBase); +end; + +procedure CloseWindow(Window: PWindow); +type + TLocalCall = procedure(Window: PWindow; Base: Pointer); cdecl; +var + Call: TLocalCall; +begin + Call := TLocalCall(GetLibAdress(IntuitionBase, 12)); + Call(Window, IntuitionBase); +end; + +function CloseWorkBench: Boolean; +type + TLocalCall = function(Base: Pointer): Boolean; cdecl; +var + Call: TLocalCall; +begin + Call := TLocalCall(GetLibAdress(IntuitionBase, 13)); + Result := Call(IntuitionBase); +end; + +procedure CurrentTime(var Seconds: LongWord; var Micros: LongWord); +type + TLocalCall = procedure(var Seconds: LongWord; var Micros: LongWord; + Base: Pointer); cdecl; +var + Call: TLocalCall; +begin + Call := TLocalCall(GetLibAdress(IntuitionBase, 14)); + Call(Seconds, Micros, IntuitionBase); +end; + +function DisplayAlert(AlertNumber: LongWord; + const String_: PChar; Height: LongWord): Boolean; +type + TLocalCall = function(AlertNumber: LongWord; + const String_: PChar; Height: LongWord; Base: Pointer): Boolean; cdecl; +var + Call: TLocalCall; +begin + Call := TLocalCall(GetLibAdress(IntuitionBase, 15)); + Result := Call(AlertNumber, String_, Height, IntuitionBase); +end; + +procedure DisplayBeep(Screen: PScreen); +type + TLocalCall = procedure(Screen: PScreen; Base: Pointer); cdecl; +var + Call: TLocalCall; +begin + Call := TLocalCall(GetLibAdress(IntuitionBase, 16)); + Call(Screen, IntuitionBase); +end; + +function DoubleClick(SSeconds: LongWord; SMicros: LongWord; + CSeconds: LongWord; CMicros: LongWord): Boolean; +type + TLocalCall = function(SSeconds: LongWord; SMicros: LongWord; + CSeconds: LongWord; CMicros: LongWord; Base: Pointer): Boolean; cdecl; +var + Call: TLocalCall; +begin + Call := TLocalCall(GetLibAdress(IntuitionBase, 17)); + Result := Call(SSeconds, SMicros, CSeconds, CMicros, IntuitionBase); +end; + +procedure DrawBorder(Rp: PRastPort; + const Border: PBorder; LeftOffset: LongInt; TopOffset: LongInt); +type + TLocalCall = procedure(Rp: PRastPort; + const Border: PBorder; LeftOffset: LongInt; TopOffset: LongInt; + Base: Pointer); cdecl; +var + Call: TLocalCall; +begin + Call := TLocalCall(GetLibAdress(IntuitionBase, 18)); + Call(Rp, Border, LeftOffset, TopOffset, IntuitionBase); +end; + +procedure DrawImage(Rp: PRastPort; Image: PImage; LeftOffset: LongInt; + TopOffset: LongInt); +type + TLocalCall = procedure(Rp: PRastPort; Image: PImage; LeftOffset: LongInt; + TopOffset: LongInt; Base: Pointer); cdecl; +var + Call: TLocalCall; +begin + Call := TLocalCall(GetLibAdress(IntuitionBase, 19)); + Call(Rp, Image, LeftOffset, TopOffset, IntuitionBase); +end; + +procedure EndRequest(Requester: PRequester; Window: PWindow); +type + TLocalCall = procedure(Requester: PRequester; Window: PWindow; + Base: Pointer); cdecl; +var + Call: TLocalCall; +begin + Call := TLocalCall(GetLibAdress(IntuitionBase, 20)); + Call(Requester, Window, IntuitionBase); +end; + +function GetDefPrefs(Preferences: PPreferences; Size: LongInt): PPreferences; +type + TLocalCall = function(Preferences: PPreferences; Size: LongInt; + Base: Pointer): PPreferences; cdecl; +var + Call: TLocalCall; +begin + Call := TLocalCall(GetLibAdress(IntuitionBase, 21)); + Result := Call(Preferences, Size, IntuitionBase); +end; + +function GetPrefs(Preferences: PPreferences; Size: LongInt): PPreferences; +type + TLocalCall = function(Preferences: PPreferences; Size: LongInt; + Base: Pointer): PPreferences; cdecl; +var + Call: TLocalCall; +begin + Call := TLocalCall(GetLibAdress(IntuitionBase, 22)); + Result := Call(Preferences, Size, IntuitionBase); +end; + +procedure InitRequester(Requester: PRequester); +type + TLocalCall = procedure(Requester: PRequester; Base: Pointer); cdecl; +var + Call: TLocalCall; +begin + Call := TLocalCall(GetLibAdress(IntuitionBase, 23)); + Call(Requester, IntuitionBase); +end; + +function ItemAddress(const MenuStrip: PMenu; MenuNumber: LongWord): PMenuItem; +type + TLocalCall = function(const MenuStrip: PMenu; MenuNumber: LongWord; + Base: Pointer): PMenuItem; cdecl; +var + Call: TLocalCall; +begin + Call := TLocalCall(GetLibAdress(IntuitionBase, 24)); + Result := Call(MenuStrip, MenuNumber, IntuitionBase); +end; + +function ModifyIDCMP(Window: PWindow; Flags: LongWord): Boolean; +type + TLocalCall = function(Window: PWindow; Flags: LongWord; Base: Pointer): Boolean; + cdecl; +var + Call: TLocalCall; +begin + Call := TLocalCall(GetLibAdress(IntuitionBase, 25)); + Result := Call(Window, Flags, IntuitionBase); +end; + +procedure ModifyProp(Gadget: PGadget; Window: PWindow; Requester: PRequester; + Flags: LongWord; HorizPot: LongWord; VertPot: LongWord; + HorizBody: LongWord; VertBody: LongWord); +type + TLocalCall = procedure(Gadget: PGadget; Window: PWindow; + Requester: PRequester; Flags: LongWord; HorizPot: LongWord; + VertPot: LongWord; HorizBody: LongWord; VertBody: LongWord; Base: Pointer); cdecl; +var + Call: TLocalCall; +begin + Call := TLocalCall(GetLibAdress(IntuitionBase, 26)); + Call(Gadget, Window, Requester, Flags, HorizPot, VertPot, HorizBody, + VertBody, IntuitionBase); +end; + +procedure MoveScreen(Screen: PScreen; Dx: LongInt; Dy: LongInt); +type + TLocalCall = procedure(Screen: PScreen; Dx: LongInt; Dy: LongInt; + Base: Pointer); cdecl; +var + Call: TLocalCall; +begin + Call := TLocalCall(GetLibAdress(IntuitionBase, 27)); + Call(Screen, Dx, Dy, IntuitionBase); +end; + +procedure MoveWindow(Window: PWindow; Dx: LongInt; Dy: LongInt); +type + TLocalCall = procedure(Window: PWindow; Dx: LongInt; Dy: LongInt; + Base: Pointer); cdecl; +var + Call: TLocalCall; +begin + Call := TLocalCall(GetLibAdress(IntuitionBase, 28)); + Call(Window, Dx, Dy, IntuitionBase); +end; + +procedure OffGadget(Gadget: PGadget; Window: PWindow; Requester: PRequester); +type + TLocalCall = procedure(Gadget: PGadget; Window: PWindow; + Requester: PRequester; Base: Pointer); cdecl; +var + Call: TLocalCall; +begin + Call := TLocalCall(GetLibAdress(IntuitionBase, 29)); + Call(Gadget, Window, Requester, IntuitionBase); +end; + +procedure OffMenu(Window: PWindow; MenuNumber: LongWord); +type + TLocalCall = procedure(Window: PWindow; MenuNumber: LongWord; + Base: Pointer); cdecl; +var + Call: TLocalCall; +begin + Call := TLocalCall(GetLibAdress(IntuitionBase, 30)); + Call(Window, MenuNumber, IntuitionBase); +end; + +procedure OnGadget(Gadget: PGadget; Window: PWindow; Requester: PRequester); +type + TLocalCall = procedure(Gadget: PGadget; Window: PWindow; + Requester: PRequester; Base: Pointer); cdecl; +var + Call: TLocalCall; +begin + Call := TLocalCall(GetLibAdress(IntuitionBase, 31)); + Call(Gadget, Window, Requester, IntuitionBase); +end; + +procedure OnMenu(Window: PWindow; MenuNumber: LongWord); +type + TLocalCall = procedure(Window: PWindow; MenuNumber: LongWord; + Base: Pointer); cdecl; +var + Call: TLocalCall; +begin + Call := TLocalCall(GetLibAdress(IntuitionBase, 32)); + Call(Window, MenuNumber, IntuitionBase); +end; + +function OpenScreen(const NewScreen: PNewScreen): PScreen; +type + TLocalCall = function(const NewScreen: PNewScreen; Base: Pointer): PScreen; cdecl; +var + Call: TLocalCall; +begin + Call := TLocalCall(GetLibAdress(IntuitionBase, 33)); + Result := Call(NewScreen, IntuitionBase); +end; + +function OpenWindow(const NewWindow: PNewWindow): PWindow; +type + TLocalCall = function(const NewWindow: PNewWindow; Base: Pointer): PWindow; cdecl; +var + Call: TLocalCall; +begin + Call := TLocalCall(GetLibAdress(IntuitionBase, 34)); + Result := Call(NewWindow, IntuitionBase); +end; + +function OpenWorkBench: LongWord; +type + TLocalCall = function(Base: Pointer): LongWord; cdecl; +var + Call: TLocalCall; +begin + Call := TLocalCall(GetLibAdress(IntuitionBase, 35)); + Result := Call(IntuitionBase); +end; + +procedure PrintIText(Rp: PRastPort; + const IText: PIntuiText; Left: LongInt; Top: LongInt); +type + TLocalCall = procedure(Rp: PRastPort; + const IText: PIntuiText; Left: LongInt; Top: LongInt; Base: Pointer); cdecl; +var + Call: TLocalCall; +begin + Call := TLocalCall(GetLibAdress(IntuitionBase, 36)); + Call(Rp, IText, Left, Top, IntuitionBase); +end; + +procedure RefreshGadgets(gadgets: PGadget; Window: PWindow; Requester: PRequester); +type + TLocalCall = procedure(gadgets: PGadget; Window: PWindow; + Requester: PRequester; Base: Pointer); cdecl; +var + Call: TLocalCall; +begin + Call := TLocalCall(GetLibAdress(IntuitionBase, 37)); + Call(gadgets, Window, Requester, IntuitionBase); +end; + +function RemoveGadget(Window: PWindow; Gadget: PGadget): Word; +type + TLocalCall = function(Window: PWindow; Gadget: PGadget; Base: Pointer): Word; + cdecl; +var + Call: TLocalCall; +begin + Call := TLocalCall(GetLibAdress(IntuitionBase, 38)); + Result := Call(Window, Gadget, IntuitionBase); +end; + +procedure ReportMouse(flag: LongInt; Window: PWindow); +type + TLocalCall = procedure(flag: LongInt; Window: PWindow; Base: Pointer); cdecl; +var + Call: TLocalCall; +begin + Call := TLocalCall(GetLibAdress(IntuitionBase, 39)); + Call(flag, Window, IntuitionBase); +end; + +function Request(Requester: PRequester; Window: PWindow): Boolean; +type + TLocalCall = function(Requester: PRequester; Window: PWindow; + Base: Pointer): Boolean; cdecl; +var + Call: TLocalCall; +begin + Call := TLocalCall(GetLibAdress(IntuitionBase, 40)); + Result := Call(Requester, Window, IntuitionBase); +end; + +procedure ScreenToBack(Screen: PScreen); +type + TLocalCall = procedure(Screen: PScreen; Base: Pointer); cdecl; +var + Call: TLocalCall; +begin + Call := TLocalCall(GetLibAdress(IntuitionBase, 41)); + Call(Screen, IntuitionBase); +end; + +procedure ScreenToFront(Screen: PScreen); +type + TLocalCall = procedure(Screen: PScreen; Base: Pointer); cdecl; +var + Call: TLocalCall; +begin + Call := TLocalCall(GetLibAdress(IntuitionBase, 42)); + Call(Screen, IntuitionBase); +end; + +function SetDMRequest(Window: PWindow; Requester: PRequester): Boolean; +type + TLocalCall = function(Window: PWindow; Requester: PRequester; + Base: Pointer): Boolean; cdecl; +var + Call: TLocalCall; +begin + Call := TLocalCall(GetLibAdress(IntuitionBase, 43)); + Result := Call(Window, Requester, IntuitionBase); +end; + +function SetMenuStrip(Window: PWindow; Menu: pMenu): Boolean; +type + TLocalCall = function(Window: PWindow; Menu: pMenu; Base: Pointer): Boolean; cdecl; +var + Call: TLocalCall; +begin + Call := TLocalCall(GetLibAdress(IntuitionBase, 44)); + Result := Call(Window, Menu, IntuitionBase); +end; + +procedure SetPointer(Window: PWindow; Pointer_: PWord; Height: LongInt; + Width: LongInt; XOffset: LongInt; YOffset: LongInt); +type + TLocalCall = procedure(Window: PWindow; Pointer_: PWord; Height: LongInt; + Width: LongInt; XOffset: LongInt; YOffset: LongInt; Base: Pointer); cdecl; +var + Call: TLocalCall; +begin + Call := TLocalCall(GetLibAdress(IntuitionBase, 45)); + Call(Window, Pointer_, Height, Width, XOffset, YOffset, IntuitionBase); +end; + +procedure SetWindowTitles(Window: PWindow; const WindowTitle: PChar; + const ScreenTitle: PChar); +type + TLocalCall = procedure(Window: PWindow; const WindowTitle: PChar; + const ScreenTitle: PChar; Base: Pointer); cdecl; +var + Call: TLocalCall; +begin + Call := TLocalCall(GetLibAdress(IntuitionBase, 46)); + Call(Window, WindowTitle, ScreenTitle, IntuitionBase); +end; + +procedure ShowTitle(Screen: PScreen; showIt: LongInt); +type + TLocalCall = procedure(Screen: PScreen; showIt: LongInt; Base: Pointer); cdecl; +var + Call: TLocalCall; +begin + Call := TLocalCall(GetLibAdress(IntuitionBase, 47)); + Call(Screen, showit, IntuitionBase); +end; + +procedure SizeWindow(Window: PWindow; Dx: LongInt; Dy: LongInt); +type + TLocalCall = procedure(Window: PWindow; Dx: LongInt; Dy: LongInt; + Base: Pointer); cdecl; +var + Call: TLocalCall; +begin + Call := TLocalCall(GetLibAdress(IntuitionBase, 48)); + Call(Window, Dx, Dy, IntuitionBase); +end; + +function ViewAddress: PView; +type + TLocalCall = function(Base: Pointer): PView; cdecl; +var + Call: TLocalCall; +begin + Call := TLocalCall(GetLibAdress(IntuitionBase, 49)); + Result := Call(IntuitionBase); +end; + +function ViewPortAddress(const Window: PWindow): PViewPort; +type + TLocalCall = function(Window: PWindow; Base: Pointer): PViewPort; cdecl; +var + Call: TLocalCall; +begin + Call := TLocalCall(GetLibAdress(IntuitionBase, 50)); + Result := Call(Window, IntuitionBase); +end; + +procedure WindowToBack(Window: PWindow); +type + TLocalCall = procedure(Window: PWindow; Base: Pointer); cdecl; +var + Call: TLocalCall; +begin + Call := TLocalCall(GetLibAdress(IntuitionBase, 51)); + Call(Window, IntuitionBase); +end; + +procedure WindowToFront(Window: PWindow); +type + TLocalCall = procedure(Window: PWindow; Base: Pointer); cdecl; +var + Call: TLocalCall; +begin + Call := TLocalCall(GetLibAdress(IntuitionBase, 52)); + Call(Window, IntuitionBase); +end; + +function WindowLimits(Window: PWindow; WidthMin: LongInt; HeightMin: LongInt; + WidthMax: LongWord; HeightMax: LongWord): Boolean; +type + TLocalCall = function(Window: PWindow; WidthMin: LongInt; + HeightMin: LongInt; WidthMax: LongWord; HeightMax: LongWord; + Base: Pointer): Boolean; cdecl; +var + Call: TLocalCall; +begin + Call := TLocalCall(GetLibAdress(IntuitionBase, 53)); + Result := Call(Window, WidthMin, HeightMin, WidthMax, HeightMax, IntuitionBase); +end; + +function SetPrefs(const Preferences: PPreferences; Size: LongInt; + Inform: LongInt): PPreferences; +type + TLocalCall = function(const Preferences: PPreferences; Size: LongInt; + Inform: LongInt; Base: Pointer): PPreferences; cdecl; +var + Call: TLocalCall; +begin + Call := TLocalCall(GetLibAdress(IntuitionBase, 54)); + Result := Call(Preferences, Size, Inform, IntuitionBase); +end; + +function IntuiTextLength(const IText: PIntuiText): LongInt; +type + TLocalCall = function(const IText: PIntuiText; Base: Pointer): LongInt; cdecl; +var + Call: TLocalCall; +begin + Call := TLocalCall(GetLibAdress(IntuitionBase, 55)); + Result := Call(IText, IntuitionBase); +end; + +function WBenchToBack: Boolean; +type + TLocalCall = function(Base: Pointer): Boolean; cdecl; +var + Call: TLocalCall; +begin + Call := TLocalCall(GetLibAdress(IntuitionBase, 56)); + Result := Call(IntuitionBase); +end; + +function WBenchToFront: Boolean; +type + TLocalCall = function(Base: Pointer): Boolean; cdecl; +var + Call: TLocalCall; +begin + Call := TLocalCall(GetLibAdress(IntuitionBase, 57)); + Result := Call(IntuitionBase); +end; + +function AutoRequest(Window: PWindow; const Body: PIntuiText; + const PosText: PIntuiText; const NegText: PIntuiText; PFlag: LongWord; + NFlag: LongWord; Width: LongWord; Height: LongWord): Boolean; +type + TLocalCall = function(Window: PWindow; const Body: PIntuiText; + const PosText: PIntuiText; const NegText: PIntuiText; PFlag: LongWord; + NFlag: LongWord; Width: LongWord; Height: LongWord; Base: Pointer): Boolean; cdecl; +var + Call: TLocalCall; +begin + Call := TLocalCall(GetLibAdress(IntuitionBase, 58)); + Result := Call(Window, Body, PosText, NegText, PFlag, NFlag, Width, + Height, IntuitionBase); +end; + +procedure BeginRefresh(Window: PWindow); +type + TLocalCall = procedure(Window: PWindow; Base: Pointer); cdecl; +var + Call: TLocalCall; +begin + Call := TLocalCall(GetLibAdress(IntuitionBase, 59)); + Call(Window, IntuitionBase); +end; + +function BuildSysRequest(Window: PWindow; const Body: PIntuiText; + const PosText: PIntuiText; const NegText: PIntuiText; Flags: LongWord; + Width: LongWord; Height: LongWord): PWindow; +type + TLocalCall = function(Window: PWindow; const Body: PIntuiText; + const PosText: PIntuiText; const NegText: PIntuiText; Flags: LongWord; + Width: LongWord; Height: LongWord; Base: Pointer): PWindow; cdecl; +var + Call: TLocalCall; +begin + Call := TLocalCall(GetLibAdress(IntuitionBase, 60)); + Result := Call(Window, Body, PosText, NegText, Flags, Width, Height, IntuitionBase); +end; + +procedure EndRefresh(Window: PWindow; Complete: Boolean); +type + TLocalCall = procedure(Window: PWindow; Complete: Boolean; Base: Pointer); cdecl; +var + Call: TLocalCall; +begin + Call := TLocalCall(GetLibAdress(IntuitionBase, 61)); + Call(Window, Complete, IntuitionBase); +end; + +procedure FreeSysRequest(Window: PWindow); +type + TLocalCall = procedure(Window: PWindow; Base: Pointer); cdecl; +var + Call: TLocalCall; +begin + Call := TLocalCall(GetLibAdress(IntuitionBase, 62)); + Call(Window, IntuitionBase); +end; + +function MakeScreen(Screen: PScreen): LongInt; +type + TLocalCall = function(Screen: PScreen; Base: Pointer): LongInt; cdecl; +var + Call: TLocalCall; +begin + Call := TLocalCall(GetLibAdress(IntuitionBase, 63)); + Result := Call(Screen, IntuitionBase); +end; + +function RemakeDisplay: LongInt; +type + TLocalCall = function(Base: Pointer): LongInt; cdecl; +var + Call: TLocalCall; +begin + Call := TLocalCall(GetLibAdress(IntuitionBase, 64)); + Result := Call(IntuitionBase); +end; + +function RethinkDisplay: LongInt; +type + TLocalCall = function(Base: Pointer): LongInt; cdecl; +var + Call: TLocalCall; +begin + Call := TLocalCall(GetLibAdress(IntuitionBase, 65)); + Result := Call(IntuitionBase); +end; + +function AllocRemember(var RememberKey: PRemember; Size: LongWord; + Flags: LongWord): Pointer; +type + TLocalCall = function(var RememberKey: PRemember; Size: LongWord; + Flags: LongWord; Base: Pointer): Pointer; cdecl; +var + Call: TLocalCall; +begin + Call := TLocalCall(GetLibAdress(IntuitionBase, 66)); + Result := Call(RememberKey, Size, Flags, IntuitionBase); +end; + +procedure AlohaWorkbench(MsgPort: PMsgPort); +type + TLocalCall = procedure(MsgPort: PMsgPort; Base: Pointer); cdecl; +var + Call: TLocalCall; +begin + Call := TLocalCall(GetLibAdress(IntuitionBase, 67)); + Call(MsgPort, IntuitionBase); +end; + +procedure FreeRemember(var RememberKey: PRemember; ReallyForget: LongInt); +type + TLocalCall = procedure(var RememberKey: PRemember; ReallyForget: LongInt; + Base: Pointer); cdecl; +var + Call: TLocalCall; +begin + Call := TLocalCall(GetLibAdress(IntuitionBase, 68)); + Call(RememberKey, ReallyForget, IntuitionBase); +end; + +function LockIBase(LockNumber: LongWord): LongWord; +type + TLocalCall = function(LockNumber: LongWord; Base: Pointer): LongWord; cdecl; +var + Call: TLocalCall; +begin + Call := TLocalCall(GetLibAdress(IntuitionBase, 69)); + Result := Call(LockNumber, IntuitionBase); +end; + +procedure UnlockIBase(LockNumber: LongWord); +type + TLocalCall = procedure(LockNumber: LongWord; Base: Pointer); cdecl; +var + Call: TLocalCall; +begin + Call := TLocalCall(GetLibAdress(IntuitionBase, 70)); + Call(LockNumber, IntuitionBase); +end; + +function GetScreenData(buffer: Pointer; Size: LongWord; type_: LongWord; + const Screen: PScreen): Boolean; +type + TLocalCall = function(buffer: Pointer; Size: LongWord; type_: LongWord; + const Screen: PScreen; Base: Pointer): Boolean; cdecl; +var + Call: TLocalCall; +begin + Call := TLocalCall(GetLibAdress(IntuitionBase, 71)); + Result := Call(buffer, Size, type_, Screen, IntuitionBase); +end; + +procedure RefreshGList(gadgets: PGadget; Window: PWindow; + Requester: PRequester; NumGad: LongInt); +type + TLocalCall = procedure(gadgets: PGadget; Window: PWindow; + Requester: PRequester; NumGad: LongInt; Base: Pointer); cdecl; +var + Call: TLocalCall; +begin + Call := TLocalCall(GetLibAdress(IntuitionBase, 72)); + Call(gadgets, Window, Requester, NumGad, IntuitionBase); +end; + +function AddGList(Window: PWindow; Gadget: PGadget; Position: LongWord; + NumGad: LongInt; Requester: PRequester): Word; +type + TLocalCall = function(Window: PWindow; Gadget: PGadget; Position: LongWord; + NumGad: LongInt; Requester: PRequester; Base: Pointer): Word; cdecl; +var + Call: TLocalCall; +begin + Call := TLocalCall(GetLibAdress(IntuitionBase, 73)); + Result := Call(Window, Gadget, Position, NumGad, Requester, IntuitionBase); +end; + +function RemoveGList(RemPtr: PWindow; Gadget: PGadget; NumGad: LongInt): Word; +type + TLocalCall = function(RemPtr: PWindow; Gadget: PGadget; NumGad: LongInt; + Base: Pointer): Word; cdecl; +var + Call: TLocalCall; +begin + Call := TLocalCall(GetLibAdress(IntuitionBase, 74)); + Result := Call(RemPtr, Gadget, NumGad, IntuitionBase); +end; + +procedure ActivateWindow(Window: PWindow); +type + TLocalCall = procedure(Window: PWindow; Base: Pointer); cdecl; +var + Call: TLocalCall; +begin + Call := TLocalCall(GetLibAdress(IntuitionBase, 75)); + Call(Window, IntuitionBase); +end; + +procedure RefreshWindowFrame(Window: PWindow); +type + TLocalCall = procedure(Window: PWindow; Base: Pointer); cdecl; +var + Call: TLocalCall; +begin + Call := TLocalCall(GetLibAdress(IntuitionBase, 76)); + Call(Window, IntuitionBase); +end; + +function ActivateGadget(gadgets: PGadget; Window: PWindow; + Requester: PRequester): Boolean; +type + TLocalCall = function(gadgets: PGadget; Window: PWindow; + Requester: PRequester; Base: Pointer): Boolean; cdecl; +var + Call: TLocalCall; +begin + Call := TLocalCall(GetLibAdress(IntuitionBase, 77)); + Result := Call(gadgets, Window, Requester, IntuitionBase); +end; + +procedure NewModifyProp(Gadget: PGadget; Window: PWindow; + Requester: PRequester; Flags: LongWord; HorizPot: LongWord; + VertPot: LongWord; HorizBody: LongWord; VertBody: LongWord; NumGad: LongInt); +type + TLocalCall = procedure(Gadget: PGadget; Window: PWindow; + Requester: PRequester; Flags: LongWord; HorizPot: LongWord; + VertPot: LongWord; HorizBody: LongWord; VertBody: LongWord; + NumGad: LongInt; Base: Pointer); cdecl; +var + Call: TLocalCall; +begin + Call := TLocalCall(GetLibAdress(IntuitionBase, 78)); + Call(Gadget, Window, Requester, Flags, HorizPot, VertPot, HorizBody, + VertBody, NumGad, IntuitionBase); +end; + +function QueryOverscan(DisplayID: LongWord; Rect: pRectangle; + OScanType: LongInt): LongInt; +type + TLocalCall = function(DisplayID: LongWord; Rect: pRectangle; + OScanType: LongInt; Base: Pointer): LongInt; cdecl; +var + Call: TLocalCall; +begin + Call := TLocalCall(GetLibAdress(IntuitionBase, 79)); + Result := Call(DisplayID, Rect, OScanType, IntuitionBase); +end; + +procedure MoveWindowInFrontOf(Window: PWindow; BehindWindow: PWindow); +type + TLocalCall = procedure(Window: PWindow; BehindWindow: PWindow; + Base: Pointer); cdecl; +var + Call: TLocalCall; +begin + Call := TLocalCall(GetLibAdress(IntuitionBase, 80)); + Call(Window, BehindWindow, IntuitionBase); +end; + +procedure ChangeWindowBox(Window: PWindow; Left: LongInt; Top: LongInt; + Width: LongInt; Height: LongInt); +type + TLocalCall = procedure(Window: PWindow; Left: LongInt; Top: LongInt; + Width: LongInt; Height: LongInt; Base: Pointer); cdecl; +var + Call: TLocalCall; +begin + Call := TLocalCall(GetLibAdress(IntuitionBase, 81)); + Call(Window, Left, Top, Width, Height, IntuitionBase); +end; + +function SetEditHook(hook: PHook): PHook; +type + TLocalCall = function(hook: PHook; Base: Pointer): PHook; cdecl; +var + Call: TLocalCall; +begin + Call := TLocalCall(GetLibAdress(IntuitionBase, 82)); + Result := Call(hook, IntuitionBase); +end; + +function SetMouseQueue(Window: PWindow; queueLength: LongWord): LongInt; +type + TLocalCall = function(Window: PWindow; queueLength: LongWord; + Base: Pointer): LongInt; cdecl; +var + Call: TLocalCall; +begin + Call := TLocalCall(GetLibAdress(IntuitionBase, 83)); + Result := Call(Window, queueLength, IntuitionBase); +end; + +procedure ZipWindow(Window: PWindow); +type + TLocalCall = procedure(Window: PWindow; Base: Pointer); cdecl; +var + Call: TLocalCall; +begin + Call := TLocalCall(GetLibAdress(IntuitionBase, 84)); + Call(Window, IntuitionBase); +end; + +function LockPubScreen(const Name: PChar): PScreen; +type + TLocalCall = function(const Name: PChar; Base: Pointer): PScreen; cdecl; +var + Call: TLocalCall; +begin + Call := TLocalCall(GetLibAdress(IntuitionBase, 85)); + Result := Call(Name, IntuitionBase); +end; + +procedure UnlockPubScreen(const Name: PChar; Screen: PScreen); +type + TLocalCall = procedure(const Name: PChar; Screen: PScreen; Base: Pointer); cdecl; +var + Call: TLocalCall; +begin + Call := TLocalCall(GetLibAdress(IntuitionBase, 86)); + Call(Name, Screen, IntuitionBase); +end; + +function LockPubScreenList: pList; +type + TLocalCall = function(Base: Pointer): pList; cdecl; +var + Call: TLocalCall; +begin + Call := TLocalCall(GetLibAdress(IntuitionBase, 87)); + Result := Call(IntuitionBase); +end; + +procedure UnlockPubScreenList; +type + TLocalCall = procedure(Base: Pointer); cdecl; +var + Call: TLocalCall; +begin + Call := TLocalCall(GetLibAdress(IntuitionBase, 88)); + Call(IntuitionBase); +end; + +function NextPubScreen(const Screen: PScreen; Namebuf: PChar): PChar; +type + TLocalCall = function(const Screen: PScreen; Namebuf: PChar; + Base: Pointer): PChar; cdecl; +var + Call: TLocalCall; +begin + Call := TLocalCall(GetLibAdress(IntuitionBase, 89)); + Result := Call(Screen, Namebuf, IntuitionBase); +end; + +procedure SetDefaultPubScreen(const Name: PChar); +type + TLocalCall = procedure(const Name: PChar; Base: Pointer); cdecl; +var + Call: TLocalCall; +begin + Call := TLocalCall(GetLibAdress(IntuitionBase, 90)); + Call(Name, IntuitionBase); +end; + +function SetPubScreenModes(modes: LongWord): Word; +type + TLocalCall = function(modes: LongWord; Base: Pointer): Word; cdecl; +var + Call: TLocalCall; +begin + Call := TLocalCall(GetLibAdress(IntuitionBase, 91)); + Result := Call(modes, IntuitionBase); +end; + +function PubScreenStatus(Screen: PScreen; StatusFlags: LongWord): Word; +type + TLocalCall = function(Screen: PScreen; StatusFlags: LongWord; + Base: Pointer): Word; cdecl; +var + Call: TLocalCall; +begin + Call := TLocalCall(GetLibAdress(IntuitionBase, 92)); + Result := Call(Screen, StatusFlags, IntuitionBase); +end; + +function ObtainGIRPort(GInfo: PGadgetInfo): PRastPort; +type + TLocalCall = function(GInfo: PGadgetInfo; Base: Pointer): PRastPort; cdecl; +var + Call: TLocalCall; +begin + Call := TLocalCall(GetLibAdress(IntuitionBase, 93)); + Result := Call(GInfo, IntuitionBase); +end; + +procedure ReleaseGIRPort(Rp: PRastPort); +type + TLocalCall = procedure(Rp: PRastPort; Base: Pointer); cdecl; +var + Call: TLocalCall; +begin + Call := TLocalCall(GetLibAdress(IntuitionBase, 94)); + Call(Rp, IntuitionBase); +end; + +procedure GadgetMouse(Gadget: PGadget; GInfo: PGadgetInfo; mousePoint: psmallint); +type + TLocalCall = procedure(Gadget: PGadget; GInfo: PGadgetInfo; + mousePoint: psmallint; Base: Pointer); cdecl; +var + Call: TLocalCall; +begin + Call := TLocalCall(GetLibAdress(IntuitionBase, 95)); + Call(Gadget, GInfo, mousePoint, IntuitionBase); +end; + +function SetIPrefs(Data: Pointer; Length: LongWord; Typ: LongWord): LongWord; +type + TLocalCall = function(Data: Pointer; Length: LongWord; Typ: LongWord; Base: Pointer): LongWord; cdecl; +var + Call: TLocalCall; +begin + Call := TLocalCall(GetLibAdress(IntuitionBase, 96)); + Result := Call(Data, Length, Typ, IntuitionBase); +end; + +procedure GetDefaultPubScreen(NameBuffer: PChar); +type + TLocalCall = procedure(NameBuffer: PChar; Base: Pointer); cdecl; +var + Call: TLocalCall; +begin + Call := TLocalCall(GetLibAdress(IntuitionBase, 97)); + Call(NameBuffer, IntuitionBase); +end; + +function EasyRequestArgs(Window: PWindow; + const easyStruct: PEasyStruct; IdcmpPtr: PLongWord; const args: Pointer): LongInt; +type + TLocalCall = function(Window: PWindow; + const easyStruct: PEasyStruct; IdcmpPtr: PLongWord; + const args: Pointer; Base: Pointer): LongInt; cdecl; +var + Call: TLocalCall; +begin + Call := TLocalCall(GetLibAdress(IntuitionBase, 98)); + EasyRequestArgs := Call(Window, easyStruct, IdcmpPtr, args, IntuitionBase); +end; + +function BuildEasyRequestArgs(Window: PWindow;const EasyStruct: PEasyStruct; Idcmp: LongWord;const Args: Pointer): PWindow; +type + TLocalCall = function(Window: PWindow;const EasyStruct: PEasyStruct; Idcmp: LongWord;const Args: Pointer; Base: Pointer): PWindow; cdecl; +var + Call: TLocalCall; +begin + Call := TLocalCall(GetLibAdress(IntuitionBase, 99)); + Result := Call(Window, EasyStruct, Idcmp, Args, IntuitionBase); +end; + +function SysReqHandler(Window: PWindow; IdcmpPtr: PLongWord; WaitInput: LongInt): LongInt; +type + TLocalCall = function(Window: PWindow; IdcmpPtr: PLongWord; WaitInput: LongInt; Base: Pointer): LongWord; cdecl; +var + Call: TLocalCall; +begin + Call := TLocalCall(GetLibAdress(IntuitionBase, 100)); + Result := Call(Window, IdcmpPtr, WaitInput, IntuitionBase); +end; + +function OpenWindowTagList(const NewWindow: PNewWindow; + const TagList: PTagItem): PWindow; +type + TOpenWindowTagList = function(const NewWindow: PNewWindow; + const TagList: PTagItem; Base: Pointer): PWindow; cdecl; +var + Call: TOpenWindowTagList; +begin + Call := TOpenWindowTagList(GetLibAdress(IntuitionBase, 101)); + OpenWindowTagList := Call(NewWindow, TagList, IntuitionBase); +end; + +function OpenScreenTagList(const NewScreen: PNewScreen;const tagList: PTagItem): PScreen; +type + TLocalCall = function(const NewScreen: PNewScreen;const tagList: PTagItem; Base: Pointer): PScreen; cdecl; +var + Call: TLocalCall; +begin + Call := TLocalCall(GetLibAdress(IntuitionBase, 102)); + Result := Call(NewScreen, tagList, IntuitionBase); +end; + +procedure DrawImageState(Rp: PRastPort; Image: PImage; LeftOffset: LongInt; TopOffset: LongInt; State: LongWord;const DrawInfo: PDrawInfo); +type + TLocalCall = procedure(Rp: PRastPort; Image: PImage; LeftOffset: LongInt; TopOffset: LongInt; State: LongWord;const DrawInfo: PDrawInfo; Base: Pointer); cdecl; +var + Call: TLocalCall; +begin + Call := TLocalCall(GetLibAdress(IntuitionBase, 103)); + Call(Rp, Image, LeftOffset, TopOffset, State, DrawInfo, IntuitionBase); +end; + +function PointInImage(Point: LongWord; Image: PImage): Boolean; +type + TLocalCall = function(Point: LongWord; Image: PImage; Base: Pointer): Boolean; cdecl; +var + Call: TLocalCall; +begin + Call := TLocalCall(GetLibAdress(IntuitionBase, 104)); + Result := Call(Point, Image, IntuitionBase); +end; + +procedure EraseImage(Rp: PRastPort; Image: PImage; LeftOffset: LongInt; TopOffset: LongInt); +type + TLocalCall = procedure(Rp: PRastPort; Image: PImage; LeftOffset: LongInt; TopOffset: LongInt; Base: Pointer); cdecl; +var + Call: TLocalCall; +begin + Call := TLocalCall(GetLibAdress(IntuitionBase, 105)); + Call(Rp, Image, LeftOffset, TopOffset, IntuitionBase); +end; + +function NewObjectA(ClassPtr: PIClass;const ClassID: PChar;const TagList: PTagItem): Pointer; +type + TLocalCall = function(ClassPtr: PIClass;const ClassID: PChar; Base: Pointer): Pointer; cdecl; +var + Call: TLocalCall; +begin + Call := TLocalCall(GetLibAdress(IntuitionBase, 106)); + Result := Call(ClassPtr, ClassID, IntuitionBase); +end; + +procedure DisposeObject(Obj: Pointer); +type + TLocalCall = procedure(Obj: Pointer; Base: Pointer); cdecl; +var + Call: TLocalCall; +begin + Call := TLocalCall(GetLibAdress(IntuitionBase, 107)); + Call(Obj, IntuitionBase); +end; + +function SetAttrsA(Obj: Pointer; const TagList: PTagItem): LongWord; +type + TLocalCall = function(Obj: Pointer; + const TagList: PTagItem; Base: Pointer): LongWord; cdecl; +var + Call: TLocalCall; +begin + Call := TLocalCall(GetLibAdress(IntuitionBase, 108)); + Result := Call(Obj, TagList, IntuitionBase); +end; + +function GetAttr(attrID: LongWord; Obj: Pointer; storagePtr: PLongWord): LongWord; +type + TLocalCall = function(attrID: LongWord; Obj: Pointer; storagePtr: PLongWord; + Base: Pointer): LongWord; cdecl; +var + Call: TLocalCall; +begin + Call := TLocalCall(GetLibAdress(IntuitionBase, 109)); + Result := Call(attrID, Obj, storagePtr, IntuitionBase); +end; + +function SetGadgetAttrsA(Gadget: PGadget; Window: PWindow; Requester: PRequester;const TagList: PTagItem): LongWord; +type + TLocalCall = function(Gadget: PGadget; Window: PWindow; Requester: PRequester;const TagList: PTagItem; Base: Pointer): LongWord; cdecl; +var + Call: TLocalCall; +begin + Call := TLocalCall(GetLibAdress(IntuitionBase, 110)); + Result := Call(Gadget, Window, Requester, TagList, IntuitionBase); +end; + +function NextObject(ObjectPtrPtr: Pointer): PIClass; +type + TLocalCall = function(ObjectPtrPtr: Pointer; Base: Pointer): PIClass; cdecl; +var + Call: TLocalCall; +begin + Call := TLocalCall(GetLibAdress(IntuitionBase, 111)); + Result := Call(ObjectPtrPtr, IntuitionBase); +end; + +function FindClass(ClassID: PChar): PIClass; +type + TLocalCall = function(ClassID: PChar; Base: Pointer): PIClass; cdecl; +var + Call: TLocalCall; +begin + Call := TLocalCall(GetLibAdress(IntuitionBase, 112)); + Result := Call(ClassID, IntuitionBase); +end; + +function MakeClass(const ClassID: PChar;const SuperClassID: PChar;const SuperClassPtr: PIClass; InstanceSize: LongWord; Flags: LongWord): PIClass; +type + TLocalCall = function(const ClassID: PChar;const SuperClassID: PChar;const SuperClassPtr: PIClass; InstanceSize: LongWord; Flags: LongWord; Base: Pointer): PIClass; cdecl; +var + Call: TLocalCall; +begin + Call := TLocalCall(GetLibAdress(IntuitionBase, 113)); + Result := Call(ClassID, SuperClassID, SuperClassPtr, InstanceSize, Flags, IntuitionBase); +end; + +procedure AddClass(ClassPtr: PIClass); +type + TLocalCall = procedure(ClassPtr: PIClass; Base: Pointer); cdecl; +var + Call: TLocalCall; +begin + Call := TLocalCall(GetLibAdress(IntuitionBase, 114)); + Call(ClassPtr, IntuitionBase); +end; + +function GetScreenDrawInfo(Screen : PScreen) : PDrawInfo; +type + TLocalCall = function(Screen: PScreen; Base: Pointer): PDrawInfo; cdecl; +var + Call: TLocalCall; +begin + Call := TLocalCall(GetLibAdress(IntuitionBase, 115)); + Result := Call(Screen, IntuitionBase); +end; + +procedure FreeScreenDrawInfo(Screen : PScreen; DrawInfo : PDrawInfo); +type + TLocalCall = procedure(Screen : PScreen; DrawInfo : PDrawInfo; Base: Pointer); cdecl; +var + Call: TLocalCall; +begin + Call := TLocalCall(GetLibAdress(IntuitionBase, 116)); + Call(Screen, DrawInfo, IntuitionBase); +end; + +function ResetMenuStrip(Window: PWindow; Menu: PMenu) : Boolean; +type + TLocalCall = function(Window: PWindow; Menu: PMenu; Base: Pointer): Boolean; cdecl; +var + Call: TLocalCall; +begin + Call := TLocalCall(GetLibAdress(IntuitionBase, 117)); + Result := Call(Window, Menu, IntuitionBase); +end; + +procedure RemoveClass(ClassPtr : PIClass); +type + TLocalCall = procedure(ClassPtr: PIClass; Base: Pointer); cdecl; +var + Call: TLocalCall; +begin + Call := TLocalCall(GetLibAdress(IntuitionBase, 118)); + Call(ClassPtr, IntuitionBase); +end; + +function FreeClass(ClassPtr : PIClass) : Boolean; +type + TLocalCall = function(ClassPtr : PIClass; Base: Pointer): Boolean; cdecl; +var + Call: TLocalCall; +begin + Call := TLocalCall(GetLibAdress(IntuitionBase, 119)); + Result := Call(ClassPtr, IntuitionBase); +end; + +function AllocScreenBuffer(Sc: PScreen; Bm: PBitMap; Flags: LongWord): PScreenBuffer; +type + TLocalCall = function(Sc: PScreen; Bm: PBitMap; Flags: LongWord; Base: Pointer): PScreenBuffer; cdecl; +var + Call: TLocalCall; +begin + Call := TLocalCall(GetLibAdress(IntuitionBase, 128)); + Result := Call(Sc, Bm, Flags, IntuitionBase); +end; + +procedure FreeScreenBuffer(Sc: PScreen; Sb: PScreenBuffer); +type + TLocalCall = procedure(Sc: PScreen; Sb: PScreenBuffer; Base: Pointer); cdecl; +var + Call: TLocalCall; +begin + Call := TLocalCall(GetLibAdress(IntuitionBase, 129)); + Call(Sc, Sb, IntuitionBase); +end; + +function ChangeScreenBuffer(Sc: PScreen; Sb: PScreenBuffer): LongWord; +type + TLocalCall = function(Sc: PScreen; Sb: PScreenBuffer; Base: Pointer): LongWord; cdecl; +var + Call: TLocalCall; +begin + Call := TLocalCall(GetLibAdress(IntuitionBase, 130)); + Result := Call(Sc, Sb, IntuitionBase); +end; + +procedure ScreenDepth(Screen: PScreen; Flags: LongWord; Reserved: Pointer); +type + TLocalCall = procedure(Screen: PScreen; Flags: LongWord; Reserved: Pointer; Base: Pointer); cdecl; +var + Call: TLocalCall; +begin + Call := TLocalCall(GetLibAdress(IntuitionBase, 131)); + Call(Screen, Flags, Reserved, IntuitionBase); +end; + +procedure ScreenPosition(Screen: PScreen; Flags: LongWord; X1: LongInt; Y1: LongInt; X2: LongInt; Y2: LongInt); +type + TLocalCall = procedure(Screen: PScreen; Flags: LongWord; X1: LongInt; Y1: LongInt; X2: LongInt; Y2: LongInt; Base: Pointer); cdecl; +var + Call: TLocalCall; +begin + Call := TLocalCall(GetLibAdress(IntuitionBase, 132)); + Call(Screen, Flags, X1, Y1, X2, Y2, IntuitionBase); +end; + +procedure ScrollWindowRaster(Win: PWindow; Dx: LongInt; Dy: LongInt; XMin: LongInt; YMin: LongInt; XMax: LongInt; YMax: LongInt); +type + TLocalCall = procedure(Win: PWindow; Dx: LongInt; Dy: LongInt; XMin: LongInt; YMin: LongInt; XMax: LongInt; YMax: LongInt; Base: Pointer); cdecl; +var + Call: TLocalCall; +begin + Call := TLocalCall(GetLibAdress(IntuitionBase, 133)); + Call(Win, Dx, Dy, XMin, YMin, XMax, YMax, IntuitionBase); +end; + +procedure LendMenus(FromWindow: PWindow; ToWindow: PWindow); +type + TLocalCall = procedure(FromWindow: PWindow; ToWindow: PWindow; Base: Pointer); cdecl; +var + Call: TLocalCall; +begin + Call := TLocalCall(GetLibAdress(IntuitionBase, 134)); + Call(FromWindow, ToWindow, IntuitionBase); +end; + +function DoGadgetMethodA(Gad: PGadget; Win: PWindow; Req: PRequester; Message: TMsg): LongWord; +type + TLocalCall = function(Gad: PGadget; Win: PWindow; Req: PRequester; Message: TMsg; Base: Pointer): LongWord; cdecl; +var + Call: TLocalCall; +begin + Call := TLocalCall(GetLibAdress(IntuitionBase, 135)); + Result := Call(Gad, Win, Req, Message, IntuitionBase); +end; + +procedure SetWindowPointerA(Win: PWindow;const Taglist: PTagItem); +type + TLocalCall = procedure(Win: PWindow;const Taglist: PTagItem; Base: Pointer); cdecl; +var + Call: TLocalCall; +begin + Call := TLocalCall(GetLibAdress(IntuitionBase, 136)); + Call(Win, Taglist, IntuitionBase); +end; + +function TimedDisplayAlert(AlertNumber: LongWord;const String_: PChar; Height: LongWord; Time: LongWord): Boolean; +type + TLocalCall = function(AlertNumber: LongWord;const String_: PChar; Height: LongWord; Time: LongWord; Base: Pointer): Boolean; cdecl; +var + Call: TLocalCall; +begin + Call := TLocalCall(GetLibAdress(IntuitionBase, 137)); + Result := Call(AlertNumber, String_, Height, Time, IntuitionBase); +end; + +procedure HelpControl(Win: PWindow; Flags: LongWord); +type + TLocalCall = procedure(Win: PWindow; Flags: LongWord; Base: Pointer); cdecl; +var + Call: TLocalCall; +begin + Call := TLocalCall(GetLibAdress(IntuitionBase, 138)); + Call(Win, Flags, IntuitionBase); +end; + +function IsWindowVisible(Window: PWindow): LongWord; +type + TLocalCall = function(Window: PWindow; Base: Pointer): LongWord; cdecl; +var + Call: TLocalCall; +begin + Call := TLocalCall(GetLibAdress(IntuitionBase, 139)); + Result := Call(Window, IntuitionBase); +end; + +procedure ShowWindow(Window: PWindow); +type + TLocalCall = procedure(Window: PWindow; Base: Pointer); cdecl; +var + Call: TLocalCall; +begin + Call := TLocalCall(GetLibAdress(IntuitionBase, 140)); + Call(Window, IntuitionBase); +end; + +procedure HideWindow(Window: PWindow); +type + TLocalCall = procedure(Window: PWindow; Base: Pointer); cdecl; +var + Call: TLocalCall; +begin + Call := TLocalCall(GetLibAdress(IntuitionBase, 141)); + Call(Window, IntuitionBase); +end; + +function ChangeWindowShape(Window: PWindow; NewShape: PRegion; CallBack: PHook): PRegion; +type + TLocalCall = function(Window: PWindow; NewShape: PRegion; CallBack: PHook; Base: Pointer): PRegion; cdecl; +var + Call: TLocalCall; +begin + Call := TLocalCall(GetLibAdress(IntuitionBase, 143)); + Result := Call(Window, NewShape, CallBack, IntuitionBase); +end; + +procedure SetDefaultScreenFont(TextFont: PTextFont); +type + TLocalCall = procedure(TextFont: PTextFont; Base: Pointer); cdecl; +var + Call: TLocalCall; +begin + Call := TLocalCall(GetLibAdress(IntuitionBase, 144)); + Call(TextFont, IntuitionBase); +end; + +function DoNotify(Cl: PClass; O: PObject_; Ic: Pointer; Msg: TopUpdate): Pointer; +type + TLocalCall = function(Cl: PClass; O: PObject_; Ic: Pointer; Msg: TopUpdate; Base: Pointer): Pointer; cdecl; +var + Call: TLocalCall; +begin + Call := TLocalCall(GetLibAdress(IntuitionBase, 145)); + Result := Call(Cl, O, Ic, Msg, IntuitionBase); +end; + +procedure FreeICData(ICData: Pointer); +type + TLocalCall = procedure(ICData: Pointer; Base: Pointer); cdecl; +var + Call: TLocalCall; +begin + Call := TLocalCall(GetLibAdress(IntuitionBase, 146)); + Call(ICData, IntuitionBase); +end; + +function AllocIntuiMessage(Window: PWindow): PIntuiMessage; +type + TLocalCall = function(Window: PWindow; Base: Pointer): PIntuiMessage; cdecl; +var + Call: TLocalCall; +begin + Call := TLocalCall(GetLibAdress(IntuitionBase, 148)); + Result := Call(Window, IntuitionBase); +end; + +procedure FreeIntuiMessage(IMsg: PIntuiMessage); +type + TLocalCall = procedure(IMsg: PIntuiMessage; Base: Pointer); cdecl; +var + Call: TLocalCall; +begin + Call := TLocalCall(GetLibAdress(IntuitionBase, 149)); + Call(IMsg, IntuitionBase); +end; + +procedure SendIntuiMessage(Window: PWindow; IMsg: PIntuiMessage); +type + TLocalCall = procedure(Window: PWindow; IMsg: PIntuiMessage; Base: Pointer); cdecl; +var + Call: TLocalCall; +begin + Call := TLocalCall(GetLibAdress(IntuitionBase, 151)); + Call(Window, IMsg, IntuitionBase); +end; + +procedure ChangeDecoration(ID: LongWord; Decor: PNewDecorator); +type + TLocalCall = procedure(ID: LongWord; Decor: PNewDecorator; Base: Pointer); cdecl; +var + Call: TLocalCall; +begin + Call := TLocalCall(GetLibAdress(IntuitionBase, 153)); + Call(ID, Decor, IntuitionBase); +end; + +procedure WindowAction(Window: PWindow; Action: LongWord; Tags: PTagItem); +type + TLocalCall = procedure(Window: PWindow; Action: LongWord; Tags: PTagItem; Base: Pointer); cdecl; +var + Call: TLocalCall; +begin + Call := TLocalCall(GetLibAdress(IntuitionBase, 157)); + Call(Window, Action, Tags, IntuitionBase); +end; + +procedure ScrollWindowRasterNoFill(Window: PWindow; Dx, Dy, XMin, YMin, XMax, YMax: Word); +type + TLocalCall = procedure(Window: PWindow; Dx, Dy, XMin, YMin, XMax, YMax: Word; Base: Pointer); cdecl; +var + Call: TLocalCall; +begin + Call := TLocalCall(GetLibAdress(IntuitionBase, 159)); + Call(Window, Dx, Dy, XMin, YMin, XMax, YMax, IntuitionBase); +end; + +function SetPointerBounds(Screen: PScreen; Rect: TRectangle; Reserved: LongWord; Tags: PTagItem): LongWord; +type + TLocalCall = function(Screen: PScreen; Rect: TRectangle; Reserved: LongWord; Tags: PTagItem; Base: Pointer): LongWord; cdecl; +var + Call: TLocalCall; +begin + Call := TLocalCall(GetLibAdress(IntuitionBase, 160)); + Result := Call(Screen, Rect, Reserved, Tags, IntuitionBase); +end; + +function StartScreenNotifyTagList(Tags: PTagItem): Pointer; +type + TLocalCall = function(Tags: PTagItem; Base: Pointer): Pointer; cdecl; +var + Call: TLocalCall; +begin + Call := TLocalCall(GetLibAdress(IntuitionBase, 161)); + Result := Call(Tags, IntuitionBase); +end; + +function EndScreenNotify(Notify: Pointer): Boolean; +type + TLocalCall = function(Notify: Pointer; Base: Pointer): Boolean; cdecl; +var + Call: TLocalCall; +begin + Call := TLocalCall(GetLibAdress(IntuitionBase, 162)); + Result := Call(Notify, IntuitionBase); +end; + +function GetMonitorList(Tags: PTagItem): Pointer; +type + TLocalCall = function(Tags: PTagItem; Base: Pointer): Pointer; cdecl; +var + Call: TLocalCall; +begin + Call := TLocalCall(GetLibAdress(IntuitionBase, 163)); + Result := Call(Tags, IntuitionBase); +end; + +procedure FreeMonitorList(Obj: Pointer); +type + TLocalCall = procedure(Obj: Pointer; Base: Pointer); cdecl; +var + Call: TLocalCall; +begin + Call := TLocalCall(GetLibAdress(IntuitionBase, 163)); + Call(Obj, IntuitionBase); +end; + +function SetAttrs(Obj: Pointer; const Tags: array of const): LongWord; +begin + SetAttrs := SetAttrsA(Obj, readintags(Tags)); +end; + +function OCLASS(O: Pointer): PIClass; +var + Obj: P_Object; +begin + Obj := P_Object(PtrUInt(O) - sizeof(T_Object)); + OCLASS := Obj^.o_Class; +end; + + +function Has_Children(Win: PWindow): Boolean; +begin + Result := Assigned(Win^.FirstChild); +end; + +function Is_Children(Win: PWindow): Boolean; +begin + Result := Assigned(Win^.Parent2); +end; + + + +initialization + IntuitionBase := OpenLibrary('intuition.library', 36); + +finalization + CloseLibrary(IntuitionBase); + +end. (* UNIT INTUITION *) |