{ Intuition.i } {$I "Include:Exec/Types.i"} {$I "Include:Graphics/Gfx.i"} {$I "Include:Graphics/Clip.i"} {$I "Include:Graphics/View.i"} {$I "Include:Graphics/RastPort.i"} {$I "Include:Graphics/Layers.i"} {$I "Include:Graphics/Text.i"} {$I "Include:Exec/Ports.i"} {$I "Include:Devices/InputEvent.i"} {$I "Include:Utility/TagItem.i"} { * 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 IntuiText = record FrontPen, BackPen : Byte; { the pen numbers for the rendering } DrawMode : Byte; { the mode for rendering the text } LeftEdge : Short; { relative start location for the text } TopEdge : Short; { relative start location for the text } ITextFont : TextAttrPtr; { if NULL, you accept the default } IText : String; { pointer to null-terminated text } NextText : ^IntuiText; { continuation to TxWrite another text } end; IntuiTextPtr = ^IntuiText; { ======================================================================== } { === 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 Border = record LeftEdge, TopEdge : Short; { initial offsets from the origin } FrontPen, BackPen : Byte; { pens numbers for rendering } DrawMode : Byte; { mode for rendering } Count : Byte; { number of XY pairs } XY : Address; { vector coordinate pairs rel to LeftTop} NextBorder : ^Border; { pointer to any other Border too } end; BorderPtr = ^Border; Type { ======================================================================== } { === MenuItem =========================================================== } { ======================================================================== } Type MenuItem = record NextItem : ^MenuItem; { pointer to next in chained list } LeftEdge, TopEdge : Short; { position of the select box } Width, Height : Short; { dimensions of the select box } Flags : Short; { see the defines below } MutualExclude : Integer; { set bits mean this item excludes that } ItemFill : Address; { 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 : Address; { points to Image, IntuiText, or NULL } Command : Char; { only if appliprog sets the COMMSEQ flag } SubItem : ^MenuItem; { if non-zero, DrawMenu shows "->" } { The NextSelect field represents the menu number of next selected * item (when user has drag-selected several items) } NextSelect : Short; end; MenuItemPtr = ^MenuItem; 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 Menu = record NextMenu : ^Menu; { same level } LeftEdge, TopEdge : Short; { position of the select box } Width, Height : Short; { dimensions of the select box } Flags : Short; { see flag definitions below } MenuName : String; { text for this Menu Header } FirstItem : MenuItemPtr; { pointer to first in chain } { these mysteriously-named variables are for internal use only } JazzX, JazzY, BeatX, BeatY : Short; end; MenuPtr = ^Menu; 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 Gadget = record NextGadget : ^Gadget; { next gadget in the list } LeftEdge, TopEdge : Short; { "hit box" of gadget } Width, Height : Short; { "hit box" of gadget } Flags : Short; { see below for list of defines } Activation : Short; { see below for list of defines } GadgetType : Short; { 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 : Address; { appliprog can specify "highlighted" imagery rather than algorithmic * this can point to either Border or Image data } SelectRender : Address; GadgetText : IntuiTextPtr; { 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 : Integer; { set bits mean this gadget excludes that gadget } { pointer to a structure of special data required by Proportional, * String and Integer Gadgets } SpecialInfo : Address; GadgetID : Short; { user-definable ID field } UserData : Address; { ptr to general purpose User data (ignored by In) } end; GadgetPtr = ^Gadget; ExtGadget = Record { The first fields match struct Gadget exactly } NextGadget : ^ExtGadget; { Matches struct Gadget } LeftEdge, TopEdge, { Matches struct Gadget } Width, Height, { Matches struct Gadget } Flags, { Matches struct Gadget } Activation, { Matches struct Gadget } GadgetType : WORD; { Matches struct Gadget } GadgetRender, { Matches struct Gadget } SelectRender : Address; { Matches struct Gadget } GadgetText : IntuiTextPtr;{ Matches struct Gadget } MutualExclude : Integer; { Matches struct Gadget } SpecialInfo : Address; { Matches struct Gadget } GadgetID : WORD; { Matches struct Gadget } UserData : Address; { Matches struct Gadget } { These fields only exist under V39 and only if GFLG_EXTENDED is set } MoreFlags : Integer; { 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 : WORD; { coordinates as well. } end; ExtGadgetPtr = ^ExtGadget; 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 BoolInfo = record Flags : Short; { defined below } Mask : Address; { 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 : Integer; { set to 0 } end; BoolInfoPtr = ^BoolInfo; 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 PropInfo = record Flags : Short; { 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 : Short; { horizontal Body } VertBody : Short; { vertical Body } { these are the variables that Intuition sets and maintains } CWidth : Short; { Container width (with any relativity absoluted) } CHeight : Short; { Container height (with any relativity absoluted) } HPotRes, VPotRes : Short; { pot increments } LeftBorder : Short; { Container borders } TopBorder : Short; { Container borders } end; PropInfoPtr = ^PropInfo; 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 StringInfo = record { you initialize these variables, and then Intuition maintains them } Buffer : String; { the buffer containing the start and final string } UndoBuffer : String; { optional buffer for undoing current entry } BufferPos : Short; { character position in Buffer } MaxChars : Short; { max number of chars in Buffer (including NULL) } DispPos : Short; { Buffer position of first displayed character } { Intuition initializes and maintains these variables for you } UndoPos : Short; { character position in the undo buffer } NumChars : Short; { number of characters currently in Buffer } DispCount : Short; { number of whole characters visible in Container } CLeft, CTop : Short; { topleft offset of the container } Layer : LayerPtr; { the RastPort containing this Gadget } { you can initialize this variable before the gadget is submitted to * Intuition, and then examine it later to discover what integer * the user has entered (if the user never plays with the gadget, * the value will be unchanged from your initial setting) } LongInt : Integer; { 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 : Address; end; StringInfoPtr = ^StringInfo; { ======================================================================== } { === Requester ========================================================== } { ======================================================================== } Type Requester = record { the ClipRect and BitMap and used for rendering the requester } OlderRequest : ^Requester; LeftEdge, TopEdge : Short; { dimensions of the entire box } Width, Height : Short; { dimensions of the entire box } RelLeft, RelTop : Short; { for Pointer relativity offsets } ReqGadget : GadgetPtr; { pointer to a list of Gadgets } ReqBorder : BorderPtr; { the box's border } ReqText : IntuiTextPtr; { the box's text } Flags : Short; { see definitions below } { pen number for back-plane fill before draws } BackFill : Byte; { Layer in place of clip rect } ReqLayer : LayerPtr; 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 : BitMapPtr; { points to the BitMap of PREDRAWN imagery } RWindow : Address; { added. points back to Window } ReqPad2 : Array [0..35] of Byte; end; RequesterPtr = ^Requester; 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 Image = record LeftEdge : Short; { starting offset relative to some origin } TopEdge : Short; { starting offsets relative to some origin } Width : Short; { pixel size (though data is word-aligned) } Height, Depth : Short; { pixel sizes } ImageData : Address; { 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 : ^Image; end; ImagePtr = ^Image; { 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 integer. 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 integer. 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 integer. 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 integer. 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 integer 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 integer which * is the x-axis resolution in dots per inch. * * TABLETA_ResolutionY: ti_Data is an unsigned long integer 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 TabletData = 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 : Integer; { Tablet range along each axis. For example, if td_TabletX * can take values 0-999, td_RangeX should be 1000. } td_RangeX, td_RangeY : Integer; { Pointer to tag-list of additional tablet attributes. * See for the tag values. } td_TagList : Address; end; TabletDataPtr = ^TabletData; { 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. } TabletHookData = 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 : ScreenPtr; { The width and height (measured in pixels of the active screen) * that your are to scale to: } thd_Width, thd_Height : Integer; { Non-zero if the screen or something about the screen * changed since the last time you were invoked: } thd_ScreenChanged : Integer; end; TabletHookDataPtr = ^TabletHookData; { ======================================================================== } { === IntuiMessage ======================================================= } { ======================================================================== } Type IntuiMessage = record ExecMessage : Message; { the Class bits correspond directly with the IDCMP Flags, except for the * special bit LONELYMESSAGE (defined below) } Class : Integer; { the Code field is for special values like MENU number } Code : Short; { the Qualifier field is a copy of the current InputEvent's Qualifier } Qualifier : Short; { IAddress contains particular addresses for Intuition functions, like * the pointer to the Gadget or the Screen } IAddress : Address; { 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 : Short; { the time values are copies of the current system clock time. Micros * are in units of microseconds, Seconds in seconds. } Seconds, Micros : Integer; { the IDCMPWindow variable will always have the address of the Window of * this IDCMP } IDCMPWindow : Address; { system-use variable } SpecialLink : ^IntuiMessage; end; IntuiMessagePtr = ^IntuiMessage; { 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. } ExtIntuiMessage = Record eim_IntuiMessage : IntuiMessage; eim_TabletData : TabletDataPtr; end; ExtIntuiMessagePtr = ^ExtIntuiMessage; 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 IBox = Record Left, Top, Width, Height : Short; END; IBoxPtr = ^IBox; { ======================================================================== } { === Window ============================================================= } { ======================================================================== } Type Window = record NextWindow : ^Window; { for the linked list in a screen } LeftEdge, TopEdge : Short; { screen dimensions of window } Width, Height : Short; { screen dimensions of window } MouseY, MouseX : Short; { relative to upper-left of window } MinWidth, MinHeight : Short; { minimum sizes } MaxWidth, MaxHeight : Short; { maximum sizes } Flags : Integer; { see below for defines } MenuStrip : MenuPtr; { the strip of Menu headers } Title : String; { the title text for this window } FirstRequest : RequesterPtr; { all active Requesters } DMRequest : RequesterPtr; { double-click Requester } ReqCount : Short; { count of reqs blocking Window } WScreen : Address; { this Window's Screen } RPort : RastPortPtr; { 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 : Byte; BorderRPort : RastPortPtr; { 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 : GadgetPtr; { these are for opening/closing the windows } Parent, Descendant : ^Window; { sprite data information for your own Pointer * set these AFTER you Open the Window by calling SetPointer() } Pointer : Address; { sprite data } PtrHeight : Byte; { sprite height (not including sprite padding) } PtrWidth : Byte; { sprite width (must be less than or equal to 16) } XOffset, YOffset : Byte; { sprite offsets } { the IDCMP Flags and User's and Intuition's Message Ports } IDCMPFlags : Integer; { User-selected flags } UserPort, WindowPort : MsgPortPtr; MessageKey : IntuiMessagePtr; 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 : ImagePtr; ScreenTitle : String; { 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 : Short; GZZMouseY : Short; { these variables contain the width and height of the inner-Window of * GIMMEZEROZERO Windows } GZZWidth : Short; GZZHeight : Short; ExtData : Address; UserData : Address; { 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 : LayerPtr; { jimm: NEW 1.2: need to keep track of the font that * OpenWindow opened, in case user SetFont's into RastPort } IFont : TextFontPtr; {* (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 : Integer; {**** Data beyond this point are Intuition Private. DO NOT USE ****} end; WindowPtr = ^Window; 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 NewWindow = record LeftEdge, TopEdge : Short; { screen dimensions of window } Width, Height : Short; { screen dimensions of window } DetailPen, BlockPen : Byte; { for bar/border/gadget rendering } IDCMPFlags : Integer; { User-selected IDCMP flags } Flags : Integer; { 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 : GadgetPtr; { 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 : ImagePtr; Title : String; { 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 address of the * Custom Screen structure in this variable. Otherwise, this variable * is ignored and doesn't have to be initialized. } Screen : Address; { SUPER_BITMAP Window? If so, put the address of your BitMap structure * in this variable. If not, this variable is ignored and doesn't have * to be initialized } BitMap : BitMapPtr; { 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 : Short; { minimums } MaxWidth, MaxHeight : Short; { 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 : Short; { is "Type" in C includes } end; NewWindowPtr = ^NewWindow; { 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. } ExtNewWindow = Record LeftEdge, TopEdge : Short; Width, Height : Short; DetailPen, BlockPen : Byte; IDCMPFlags : Integer; Flags : Integer; FirstGadget : GadgetPtr; CheckMark : ImagePtr; Title : String; WScreen : Address; WBitMap : BitMapPtr; MinWidth, MinHeight : Short; MaxWidth, MaxHeight : Short; { 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 : Short; { ------------------------------------------------------- * * 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 : TagItemPtr; END; ExtNewWindowPtr = ^ExtNewWindow; { * The TagItem ID's (ti_Tag values) for OpenWindowTagList() follow. * They are values in a TagItem array passed as extension/replacement * values for the data in NewWindow. OpenWindowTagList() can actually * work well with a NULL NewWindow pointer. } CONST WA_Dummy = (TAG_USER + 99); { $80000063 } { these tags simply override NewWindow parameters } WA_Left = (WA_Dummy + $01); WA_Top = (WA_Dummy + $02); WA_Width = (WA_Dummy + $03); WA_Height = (WA_Dummy + $04); WA_DetailPen = (WA_Dummy + $05); WA_BlockPen = (WA_Dummy + $06); WA_IDCMP = (WA_Dummy + $07); { "bulk" initialization of NewWindow.Flags } WA_Flags = (WA_Dummy + $08); WA_Gadgets = (WA_Dummy + $09); WA_Checkmark = (WA_Dummy + $0A); WA_Title = (WA_Dummy + $0B); { means you don't have to call SetWindowTitles * after you open your window } WA_ScreenTitle = (WA_Dummy + $0C); WA_CustomScreen = (WA_Dummy + $0D); WA_SuperBitMap = (WA_Dummy + $0E); { also implies WFLG_SUPER_BITMAP property } WA_MinWidth = (WA_Dummy + $0F); WA_MinHeight = (WA_Dummy + $10); WA_MaxWidth = (WA_Dummy + $11); WA_MaxHeight = (WA_Dummy + $12); { The following are specifications for new features } WA_InnerWidth = (WA_Dummy + $13); WA_InnerHeight = (WA_Dummy + $14); { You can specify the dimensions of the interior * region of your window, independent of what * the border widths will be. You probably want * to also specify WA_AutoAdjust to allow * Intuition to move your window or even * shrink it so that it is completely on screen. } WA_PubScreenName = (WA_Dummy + $15); { declares that you want the window to open as * a visitor on the public screen whose name is * pointed to by (UBYTE *) ti_Data } WA_PubScreen = (WA_Dummy + $16); { open as a visitor window on the public screen * whose address 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 short, without * fear of a flashing pointer. * This tag may be passed to OpenWindowTags() * or SetWindowPointer(). } WA_TabletMessages = (WA_Dummy + $37); { ti_Data is a boolean. Set to TRUE to * request that tablet information be included * in IntuiMessages sent to your window. * Requires that something (i.e. a tablet driver) * feed IESUBCLASS_NEWTABLET InputEvents into * the system. For a pointer to the TabletData, * examine the ExtIntuiMessage->eim_TabletData * field. It is UNSAFE to check this field * when running on pre-V39 systems. It's always * safe to check this field under V39 and up, * though it may be NULL. } WA_HelpGroup = (WA_Dummy + $38); { When the active window has gadget help enabled, * other windows of the same HelpGroup number * will also get GadgetHelp. This allows GadgetHelp * to work for multi-windowed applications. * Use GetGroupID() to get an ID number. Pass * this number as ti_Data to all your windows. * See also the HelpControl() function. } WA_HelpGroupWindow = (WA_Dummy + $39); { When the active window has gadget help enabled, * other windows of the same HelpGroup will also get * GadgetHelp. This allows GadgetHelp to work * for multi-windowed applications. As an alternative * to WA_HelpGroup, you can pass a pointer to any * other window of the same group to join its help * group. Defaults to NULL, which has no effect. * See also the HelpControl() function. } { HelpControl() flags: * * HC_GADGETHELP - Set this flag to enable Gadget-Help for one or more * windows. } HC_GADGETHELP = 1; { ======================================================================== } { === Remember =========================================================== } { ======================================================================== } { this structure is used for remembering what memory has been allocated to * date by a given routine, so that a premature abort or systematic exit * can deallocate memory cleanly, easily, and completely } Type Remember = record NextRemember : ^Remember; RememberSize : Integer; Memory : Address; end; RememberPtr = ^Remember; { === Color Spec ====================================================== } { How to tell Intuition about RGB values for a color table entry. } ColorSpec = Record ColorIndex : Short; { -1 terminates an array of ColorSpec } Red : Short; { only the _bottom_ 4 bits recognized } Green : Short; { only the _bottom_ 4 bits recognized } Blue : Short; { only the _bottom_ 4 bits recognized } END; ColorSpecPtr = ^ColorSpec; { === Easy Requester Specification ======================================= } { see also autodocs for EasyRequest and BuildEasyRequest } { NOTE: This structure may grow in size in the future } EasyStruct = Record es_StructSize : Integer; { should be sizeof (struct EasyStruct )} es_Flags : Integer; { should be 0 for now } es_Title : String; { title of requester window } es_TextFormat : String; { 'printf' style formatting string } es_GadgetFormat : String; { 'printf' style formatting string } END; EasyStructPtr = ^EasyStruct; { ======================================================================== } { === 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; {$I "Include:Intuition/cgHooks.i"} {$I "Include:Intuition/Classes.i"} {$I "Include:Utility/Hooks.i"} {$I "Include:Intuition/Preferences.i"} {$I "Include:Intuition/Screens.i"} { Include obsolete identifiers: } {$I "Include:Intuition/iobsolete.i"} Function ActivateGadget(Gadget : GadgetPtr; Window : WindowPtr; Request : RequesterPtr) : Boolean; External; Procedure ActivateWindow(Window : WindowPtr); External; Function AddGadget(Window : WindowPtr; Gadget : GadgetPtr; Position : Short) : Short; External; Function AddGList(Window : WindowPtr; Gadget : GadgetPtr; Position : Short; Numgad : Short; Requester : RequesterPtr) : Short; External; Function AllocRemember(var RememberKey : RememberPtr; Size, Flags : Integer) : Address; External; Function AutoRequest(Window : WindowPtr; BodyText, PositiveText, NegativeText : IntuiTextPtr; PositiveFlags, NegativeFlags : Integer; Width, Height : Short) : Boolean; External; Procedure BeginRefresh(Window : WindowPtr); External; Function BuildSysRequest(window : WindowPtr; BodyText, PositiveText,NegativeText : IntuiTextPtr; IDCMPFlags : Integer; Width, Height : Short) : WindowPtr; External; Function ClearDMRequest(window : WindowPtr) : Boolean; External; Procedure ClearMenuStrip(window : WindowPtr); External; Procedure ClearPointer(window : WindowPtr); External; Procedure CloseScreen(screen : ScreenPtr); External; Procedure CloseWindow(window : WindowPtr); External; FUNCTION CloseWorkBench : Boolean; External; Procedure CurrentTime(var Seconds, Micros : Integer); External; Function DisplayAlert(AlertNumber : Integer; Str : String; Height : Short) : Boolean; External; Procedure DisplayBeep(screen : ScreenPtr); External; Function DoubleClick(StartSecs, StartMicros, CurrentSecs, CurrentMicros : Integer) : Boolean; External; Procedure DrawBorder(rastport : RastPortPtr; Border : BorderPtr; LeftOffset, TopOffset : Short); External; Procedure DrawImage(rastport : RastPortPtr; Image : ImagePtr; LeftOffset, TopOffset : Short); External; Procedure EndRefresh(window : WindowPtr; Complete : Boolean); External; Procedure EndRequest(requester : RequesterPtr; Window : WindowPtr); External; Procedure FreeRemember(var RememberKey : RememberPtr; ReallyForget : Boolean); External; Procedure FreeSysRequest(window : WindowPtr); External; Function GetDefPrefs(PrefBuffer : PreferencesPtr; Size : Short) : PreferencesPtr; External; Function GetPrefs(PrefBuffer : PreferencesPtr; Size : Short) : PreferencesPtr; External; Function GetScreenData(Buffer : Address; Size, SType : Short; Screen : ScreenPtr) : Boolean; External; Procedure InitRequester(requester : RequesterPtr); External; Function IntuiTextLength(IText : IntuiTextPtr) : Integer; External; Function ItemAddress(MenuStrip : MenuPtr; MenuNumber : Short) : MenuItemPtr; External; Function ItemNum(MenuNumber : Short) : Short; External; Function LockIBase(LockNumber : Integer) : Integer; External; Procedure MakeScreen(Screen : ScreenPtr); External; Function MenuNum(MenuNumber : Short) : Short; External; Procedure ModifyIDCMP(window : WindowPtr; IDCMPFlags : Integer); External; Procedure ModifyProp(gadget : GadgetPtr; window : WindowPtr; requester : RequesterPtr; Flags : Short; HorizPot, VertPot, HorizBody, VertBody : Short); External; Procedure MoveScreen(screen : ScreenPtr; DeltaX, DeltaY : Short); External; Procedure MoveWindow(window : WindowPtr; DeltaX, DeltaY : Short); External; Procedure NewModifyProp(gadget : GadgetPtr; window : WindowPtr; requester : RequesterPtr; Flags : Short; HorizPot, VertPot, HorizBody, VertBody : Short; NumGad : Integer); External; Procedure OffGadget(gadget : GadgetPtr; window : WindowPtr; requester : RequesterPtr); External; Procedure OffMenu(window : WindowPtr; MenuNumber : Short); External; Procedure OnGadget(gadget : GadgetPtr; window : WindowPtr; requester : RequesterPtr); External; Procedure OnMenu(window : WindowPtr; MenuNumber : Short); External; Function OpenScreen(newscreen : NewScreenPtr) : ScreenPtr; External; Function OpenWindow(newwindow : NewWindowPtr) : WindowPtr; External; Function OpenWorkBench : ScreenPtr; External; Procedure PrintIText(rastport : RastPortPtr; IText : IntuiTextPtr; LeftOffset, TopOffset : Short); External; Procedure RefreshGadgets(gadgets : GadgetPtr; window : WindowPtr; requester : RequesterPtr); External; Procedure RefreshGList(gadgets : GadgetPtr; window : WindowPtr; requester : RequesterPtr; NumGad : Short); External; Procedure RefreshWindowFrame(window : WindowPtr); External; Procedure RemakeDisplay; External; Function RemoveGadget(window : WindowPtr; gadget : GadgetPtr) : Short; External; Function RemoveGList(window : WindowPtr; gadget : GadgetPtr; NumGad : Short) : Short; External; Procedure ReportMouse(window : WindowPtr; DoIt : Boolean); External; Function Request(requester : RequesterPtr; window : WindowPtr) : Boolean; External; Procedure RethinkDisplay; External; Procedure ScreenToBack(screen : ScreenPtr); External; Procedure ScreenToFront(screen : ScreenPtr); External; Procedure SetDMRequest(window : WindowPtr; DMRequester : RequesterPtr); External; Function SetMenuStrip(window : WindowPtr; Menu : MenuPtr) : Boolean; External; Procedure SetPointer(window : WindowPtr; pointer : Address; Height, Width, XOffset, YOffset : Short); External; Function SetPrefs(PrefBuffer : PreferencesPtr; Size : Integer; Inform : Boolean) : PreferencesPtr; External; Procedure SetWindowTitles(window : WindowPtr; WindowTitle, ScreenTitle : String); External; Procedure ShowTitle(screen : ScreenPtr; ShowIt : Boolean); External; Procedure SizeWindow(window : WindowPtr; DeltaX, DeltaY : Short); External; Function SubNum(MenuNumber : Short) : Short; External; Procedure UnlockIBase(Lock : Integer); External; Function ViewAddress : ViewPtr; External; Function ViewPortAddress(window : WindowPtr) : ViewPortPtr; External; Function WBenchToBack : Boolean; External; Function WBenchToFront : Boolean; External; Function WindowLimits(window : WindowPtr; MinWidth, MinHeight, MaxWidth, MaxHeight : Short) : Boolean; External; Procedure WindowToBack(window : WindowPtr); External; Procedure WindowToFront(window : WindowPtr); External; { --- functions in V36 OR higher (distributed as Release 2.0) --- } FUNCTION QueryOverscan(DisplayID : Integer; rect : RectAnglePtr; oScanType : Short) : Integer; External; PROCEDURE MoveWindowInFrontOf(win : WindowPtr; behindWin : WindowPtr); External; PROCEDURE ChangeWindowBox(win : WindowPtr;left,top,width,height : Short); External; FUNCTION SetEditHook(h : HookPtr): HookPtr; External; FUNCTION SetMouseQueue(win : WindowPtr; queueLength : Short) : Integer; External; PROCEDURE ZipWindow(Win : windowPtr); External; FUNCTION LockPubScreen(name : String) : ScreenPtr; External; PROCEDURE UnlockPubScreen(name : String; Scr : screenPtr); External; FUNCTION LockPubScreenList : ListPtr; External; PROCEDURE UnlockPubScreenList; External; FUNCTION NextPubScreen(Scr : screenPtr; VAR namebuf : String) : String; External; PROCEDURE SetDefaultPubScreen(name : String); External; FUNCTION SetPubScreenModes(modes : Short) : Short; External; FUNCTION PubScreenStatus(Scr : screenPtr; statusFlags : Short) : Short; External; FUNCTION ObtainGIRPort(gInfo : GadgetInfoPtr) : RastPortPtr; External; PROCEDURE ReleaseGIRPort(rp : RastPortPtr); External; PROCEDURE GadgetMouse(gad : GadgetPtr;gInfo : GadgetInfoPtr; mousePoint : Short); External; PROCEDURE GetDefaultPubScreen(VAR nameBuffer : String); External; FUNCTION EasyRequestArgs(win : WindowPtr;ES : EasyStructPtr; idcmp : Integer; args: Address) : WindowPtr; External; FUNCTION BuildEasyRequestArgs(Win : WindowPtr;ES : easyStructPtr;idcmp : Integer; args : Address) : WindowPtr; External; FUNCTION SysReqHandler(Win : windowPtr; idcmp : Integer; waitInput : Boolean) : Integer; External; FUNCTION OpenWindowTagList(nw : newWindowPtr; TagList : Address) : WindowPtr; External; FUNCTION OpenScreenTagList(ns : newScreenPtr; tagList : Address) : ScreenPtr; External; PROCEDURE DrawImageState(rp : RastPortPtr; im : ImagePtr; leftOffset,topOffset : Short; state : Integer; di : Address); External; { DrawInfoPtr } FUNCTION PointInImage(p : point; im : imagePtr) : Boolean; External; PROCEDURE EraseImage(rp : RastPortPtr; im : imagePtr; leftOffset,topOffset : Short); External; FUNCTION NewObjectA(class : IClassPtr; classID : String; tagList : Address) : Address; External; PROCEDURE DisposeObject(object : Address); External; FUNCTION SetAttrsA(object : Address; tagList : Address) : Integer; External; FUNCTION GetAttr(attrID : Integer; object : Address; storage : Address) : Integer; External; FUNCTION SetGadgetAttrsA(Gad : gadgetPtr; Win : windowPtr; Req : requesterPtr; tagList : Address) : Integer; External; FUNCTION NextObject(object : Address) : Address; External; FUNCTION MakeClass(classID : String; superClassID : String; superClass : IClassPtr; instanceSize : Short; flags : Integer) : IClassPtr; External; PROCEDURE AddClass(class : IClassPtr); External; FUNCTION GetScreenDrawInfo(Scr : screenPtr) : Address; External; { DrawInfoPtr } PROCEDURE FreeScreenDrawInfo(Scr : screenPtr; di : Address); External; { DrawInfoPtr } FUNCTION ResetMenuStrip(Win : windowPtr; m : menuPtr) : Boolean; External; PROCEDURE RemoveClass(class : IClassPtr); External; FUNCTION FreeClass(class : IClassPtr) : Boolean; External; { --- functions in V39 or higher (Release 3) --- } FUNCTION AllocScreenBuffer(Scr : ScreenPtr; BM : BitMapPtr; flags : Integer) : ScreenBufferPtr; External; PROCEDURE FreeScreenBuffer(Scr : Screen; sb : ScreenBufferPtr); External; FUNCTION ChangeScreenBuffer(Scr : ScreenPtr; sb : ScreenBufferPtr) : Integer; External; PROCEDURE ScreenDepth(Scr : ScreenPtr; flags : Integer; Reserved : Address); External; PROCEDURE ScreenPosition(Scr : ScreenPtr; flags, x1, y1, x2, y2 : Integer); External; PROCEDURE LendMenus(FromWin, ToWin : WindowPtr); External; FUNCTION DoGadgetMethodA(Gad : GadgetPtr; Win : WindowPtr; Req : RequesterPtr; Msg : Message) : Integer; External; PROCEDURE SetWindowPointerA(Win : WindowPtr; TagList : Address); External; FUNCTION TimedDisplayAlert(Alertnumber : Integer; Str : String; height, time : Integer) : Boolean; External; PROCEDURE HelpControl(Win : WindowPtr; flags : Integer); External;