#ifndef INTUITION_INTUITION_H #define INTUITION_INTUITION_H TRUE /* ** $Filename: intuition/intuition.h $ ** $Release: 2.04 Includes, V37.4 $ ** $Revision: 36.51 $ ** $Date: 91/03/28 $ ** ** Interface definitions for Intuition applications. ** ** (C) Copyright 1985-1999 Amiga, Inc. ** All Rights Reserved */ #ifndef EXEC_TYPES_H #include <exec/types.h> #endif #ifndef GRAPHICS_GFX_H #include <graphics/gfx.h> #endif #ifndef GRAPHICS_CLIP_H #include <graphics/clip.h> #endif #ifndef GRAPHICS_VIEW_H #include <graphics/view.h> #endif #ifndef GRAPHICS_RASTPORT_H #include <graphics/rastport.h> #endif #ifndef GRAPHICS_LAYERS_H #include <graphics/layers.h> #endif #ifndef GRAPHICS_TEXT_H #include <graphics/text.h> #endif #ifndef EXEC_PORTS_H #include <exec/ports.h> #endif #ifndef DEVICES_INPUTEVENT_H #include <devices/inputevent.h> #endif #ifndef UTILITY_TAGITEM_H #include <utility/tagitem.h> #endif /* * NOTE: intuition/iobsolete.h is included at the END of this file! */ /* ======================================================================== */ /* === Menu =============================================================== */ /* ======================================================================== */ struct Menu { struct Menu *NextMenu; /* same level */ WORD LeftEdge, TopEdge; /* position of the select box */ WORD Width, Height; /* dimensions of the select box */ UWORD Flags; /* see flag definitions below */ BYTE *MenuName; /* text for this Menu Header */ struct MenuItem *FirstItem; /* pointer to first in chain */ /* these mysteriously-named variables are for internal use only */ WORD JazzX, JazzY, BeatX, BeatY; }; /* FLAGS SET BY BOTH THE APPLIPROG AND INTUITION */ #define MENUENABLED 0x0001 /* whether or not this menu is enabled */ /* FLAGS SET BY INTUITION */ #define MIDRAWN 0x0100 /* this menu's items are currently drawn */ /* ======================================================================== */ /* === MenuItem =========================================================== */ /* ======================================================================== */ struct MenuItem { struct MenuItem *NextItem; /* pointer to next in chained list */ WORD LeftEdge, TopEdge; /* position of the select box */ WORD Width, Height; /* dimensions of the select box */ UWORD Flags; /* see the defines below */ LONG MutualExclude; /* set bits mean this item excludes that */ APTR ItemFill; /* 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 */ APTR SelectFill; /* points to Image, IntuiText, or NULL */ BYTE Command; /* only if appliprog sets the COMMSEQ flag */ struct MenuItem *SubItem; /* if non-zero, points to MenuItem for submenu */ /* The NextSelect field represents the menu number of next selected * item (when user has drag-selected several items) */ UWORD NextSelect; }; /* FLAGS SET BY THE APPLIPROG */ #define CHECKIT 0x0001 /* set to indicate checkmarkable item */ #define ITEMTEXT 0x0002 /* set if textual, clear if graphical item */ #define COMMSEQ 0x0004 /* set if there's an command sequence */ #define MENUTOGGLE 0x0008 /* set for toggling checks (else mut. exclude) */ #define ITEMENABLED 0x0010 /* set if this item is enabled */ /* these are the SPECIAL HIGHLIGHT FLAG state meanings */ #define HIGHFLAGS 0x00C0 /* see definitions below for these bits */ #define HIGHIMAGE 0x0000 /* use the user's "select image" */ #define HIGHCOMP 0x0040 /* highlight by complementing the selectbox */ #define HIGHBOX 0x0080 /* highlight by "boxing" the selectbox */ #define HIGHNONE 0x00C0 /* don't highlight */ /* FLAGS SET BY BOTH APPLIPROG AND INTUITION */ #define CHECKED 0x0100 /* state of the checkmark */ /* FLAGS SET BY INTUITION */ #define ISDRAWN 0x1000 /* this item's subs are currently drawn */ #define HIGHITEM 0x2000 /* this item is currently highlighted */ #define MENUTOGGLED 0x4000 /* this item was already toggled */ /* ======================================================================== */ /* === Requester ========================================================== */ /* ======================================================================== */ struct Requester { struct Requester *OlderRequest; WORD LeftEdge, TopEdge; /* dimensions of the entire box */ WORD Width, Height; /* dimensions of the entire box */ WORD RelLeft, RelTop; /* for Pointer relativity offsets */ struct Gadget *ReqGadget; /* pointer to a list of Gadgets */ struct Border *ReqBorder; /* the box's border */ struct IntuiText *ReqText; /* the box's text */ UWORD Flags; /* see definitions below */ /* pen number for back-plane fill before draws */ UBYTE BackFill; /* Layer in place of clip rect */ struct Layer *ReqLayer; UBYTE ReqPad1[32]; /* If the BitMap plane pointers are non-zero, this tells the system * that the image comes pre-drawn (if the appliprog wants to define * its 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 */ struct BitMap *ImageBMap; /* points to the BitMap of PREDRAWN imagery */ struct Window *RWindow; /* added. points back to Window */ struct Image *ReqImage; /* new for V36: drawn if USEREQIMAGE set */ UBYTE ReqPad2[32]; }; /* FLAGS SET BY THE APPLIPROG */ #define POINTREL 0x0001 /* if POINTREL set, TopLeft is relative to pointer * for DMRequester, relative to window center * for Request(). */ #define PREDRAWN 0x0002 /* set if Requester.ImageBMap points to predrawn Requester imagery */ #define NOISYREQ 0x0004 /* if you don't want requester to filter input */ #define SIMPLEREQ 0x0010 /* to use SIMPLEREFRESH layer (recommended) */ /* New for V36 */ #define USEREQIMAGE 0x0020 /* render linked list ReqImage after BackFill * but before gadgets and text */ #define NOREQBACKFILL 0x0040 /* don't bother filling requester with Requester.BackFill pen */ /* FLAGS SET BY INTUITION */ #define REQOFFWINDOW 0x1000 /* part of one of the Gadgets was offwindow */ #define REQACTIVE 0x2000 /* this requester is active */ #define SYSREQUEST 0x4000 /* (unused) this requester caused by system */ #define DEFERREFRESH 0x8000 /* this Requester stops a Refresh broadcast */ /* ======================================================================== */ /* === Gadget ============================================================= */ /* ======================================================================== */ struct Gadget { struct Gadget *NextGadget; /* next gadget in the list */ WORD LeftEdge, TopEdge; /* "hit box" of gadget */ WORD Width, Height; /* "hit box" of gadget */ UWORD Flags; /* see below for list of defines */ UWORD Activation; /* see below for list of defines */ UWORD GadgetType; /* 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) */ APTR GadgetRender; /* appliprog can specify "highlighted" imagery rather than algorithmic * this can point to either Border or Image data */ APTR SelectRender; struct IntuiText *GadgetText; /* text for this gadget */ /* MutualExclude, never implemented, is now declared obsolete. * There are published examples of implementing a more general * and practical exclusion in your applications. * * Starting with V36, this field is used to point to a hook * for a custom gadget. * * Programs using this field for their own processing will * continue to work, as long as they don't try the * trick with custom gadgets. */ LONG MutualExclude; /* obsolete */ /* pointer to a structure of special data required by Proportional, * String and Integer Gadgets */ APTR SpecialInfo; UWORD GadgetID; /* user-definable ID field */ APTR UserData; /* ptr to general purpose User data (ignored by In) */ }; /* --- Gadget.Flags values --- */ /* combinations in these bits describe the highlight technique to be used */ #define GFLG_GADGHIGHBITS 0x0003 #define GFLG_GADGHCOMP 0x0000 /* Complement the select box */ #define GFLG_GADGHBOX 0x0001 /* Draw a box around the image */ #define GFLG_GADGHIMAGE 0x0002 /* Blast in this alternate image */ #define GFLG_GADGHNONE 0x0003 /* don't highlight */ #define GFLG_GADGIMAGE 0x0004 /* 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 */ #define GFLG_RELBOTTOM 0x0008 /* vert. pos. is relative to bottom edge */ #define GFLG_RELRIGHT 0x0010 /* horiz. pos. is relative to right edge */ #define GFLG_RELWIDTH 0x0020 /* width is relative to req/window */ #define GFLG_RELHEIGHT 0x0040 /* height is relative to req/window */ #define GFLG_SELECTED 0x0080 /* 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 */ #define GFLG_DISABLED 0x0100 /* 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. */ #define GFLG_LABELMASK 0x3000 #define GFLG_LABELITEXT 0x0000 /* GadgetText points to IntuiText */ #define GFLG_LABELSTRING 0x1000 /* GadgetText points to (UBYTE *) */ #define GFLG_LABELIMAGE 0x2000 /* GadgetText points to Image (object) */ /* New for V37: GFLG_TABCYCLE */ #define GFLG_TABCYCLE 0x0200 /* (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) */ #define GFLG_STRINGEXTEND 0x0400 /* this String Gadget has StringExtend */ /* --- 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. */ #define GACT_RELVERIFY 0x0001 /* 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 */ #define GACT_IMMEDIATE 0x0002 /* 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. */ #define GACT_ENDGADGET 0x0004 /* 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. * Note: boolean FOLLOWMOUSE gadgets require GACT_RELVERIFY to get * _any_ mouse movement events (this unusual behavior is a compatibility * hold-over from the old days). */ #define GACT_FOLLOWMOUSE 0x0008 /* 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 */ #define GACT_RIGHTBORDER 0x0010 #define GACT_LEFTBORDER 0x0020 #define GACT_TOPBORDER 0x0040 #define GACT_BOTTOMBORDER 0x0080 #define GACT_BORDERSNIFF 0x8000 /* neither set nor rely on this bit */ #define GACT_TOGGLESELECT 0x0100 /* this bit for toggle-select mode */ #define GACT_BOOLEXTEND 0x2000 /* this Boolean Gadget has a BoolInfo */ /* should properly be in StringInfo, but aren't */ #define GACT_STRINGLEFT 0x0000 /* NOTE WELL: that this has value zero */ #define GACT_STRINGCENTER 0x0200 #define GACT_STRINGRIGHT 0x0400 #define GACT_LONGINT 0x0800 /* this String Gadget is for Long Ints */ #define GACT_ALTKEYMAP 0x1000 /* this String has an alternate keymap */ #define GACT_STRINGEXTEND 0x2000 /* this String Gadget has StringExtend */ /* NOTE: NEVER SET GACT_STRINGEXTEND IF YOU * ARE RUNNING ON LESS THAN V36! SEE * GFLG_STRINGEXTEND (ABOVE) INSTEAD */ #define GACT_ACTIVEGADGET 0x4000 /* 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 0x8000 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 */ #define GTYP_GADGETTYPE 0xFC00 /* all Gadget Global Type flags (padded) */ #define GTYP_SYSGADGET 0x8000 /* 1 = Allocated by the system, 0 = by app. */ #define GTYP_SCRGADGET 0x4000 /* 1 = ScreenGadget, 0 = WindowGadget */ #define GTYP_GZZGADGET 0x2000 /* 1 = for WFLG_GIMMEZEROZERO borders */ #define GTYP_REQGADGET 0x1000 /* 1 = this is a Requester Gadget */ /* system gadgets */ #define GTYP_SIZING 0x0010 #define GTYP_WDRAGGING 0x0020 #define GTYP_SDRAGGING 0x0030 #define GTYP_WUPFRONT 0x0040 #define GTYP_SUPFRONT 0x0050 #define GTYP_WDOWNBACK 0x0060 #define GTYP_SDOWNBACK 0x0070 #define GTYP_CLOSE 0x0080 /* application gadgets */ #define GTYP_BOOLGADGET 0x0001 #define GTYP_GADGET0002 0x0002 #define GTYP_PROPGADGET 0x0003 #define GTYP_STRGADGET 0x0004 #define GTYP_CUSTOMGADGET 0x0005 #define GTYP_GTYPEMASK 0x0007 /* masks out to gadget class */ /* This bit in GadgetType is reserved for undocumented internal use * by the Gadget Toolkit, and cannot be used nor relied on by * applications: 0x0100 */ /* ======================================================================== */ /* === BoolInfo======================================================= */ /* ======================================================================== */ /* This is the special data needed by an Extended Boolean Gadget * Typically this structure will be pointed to by the Gadget field SpecialInfo */ struct BoolInfo { UWORD Flags; /* defined below */ UWORD *Mask; /* bit mask for highlighting and selecting * mask must follow the same rules as an Image * plane. Its width and height are determined * by the width and height of the gadget's * select box. (i.e. Gadget.Width and .Height). */ ULONG Reserved; /* set to 0 */ }; /* set BoolInfo.Flags to this flag bit. * in the future, additional bits might mean more stuff hanging * off of BoolInfo.Reserved. */ #define BOOLMASK 0x0001 /* 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 */ struct PropInfo { UWORD Flags; /* 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. */ UWORD HorizPot; /* 16-bit FixedPoint horizontal quantity percentage */ UWORD VertPot; /* 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(); */ UWORD HorizBody; /* horizontal Body */ UWORD VertBody; /* vertical Body */ /* these are the variables that Intuition sets and maintains */ UWORD CWidth; /* Container width (with any relativity absoluted) */ UWORD CHeight; /* Container height (with any relativity absoluted) */ UWORD HPotRes, VPotRes; /* pot increments */ UWORD LeftBorder; /* Container borders */ UWORD TopBorder; /* Container borders */ }; /* --- FLAG BITS ---------------------------------------------------------- */ #define AUTOKNOB 0x0001 /* 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. */ #define FREEHORIZ 0x0002 /* if set, the knob can move horizontally */ #define FREEVERT 0x0004 /* if set, the knob can move vertically */ #define PROPBORDERLESS 0x0008 /* if set, no border will be rendered */ #define KNOBHIT 0x0100 /* set when this Knob is hit */ #define PROPNEWLOOK 0x0010 /* set this if you want to get the new * V36 look */ #define KNOBHMIN 6 /* minimum horizontal size of the Knob */ #define KNOBVMIN 4 /* minimum vertical size of the Knob */ #define MAXBODY 0xFFFF /* maximum body value */ #define MAXPOT 0xFFFF /* 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 */ struct StringInfo { /* you initialize these variables, and then Intuition maintains them */ UBYTE *Buffer; /* the buffer containing the start and final string */ UBYTE *UndoBuffer; /* optional buffer for undoing current entry */ WORD BufferPos; /* character position in Buffer */ WORD MaxChars; /* max number of chars in Buffer (including NULL) */ WORD DispPos; /* Buffer position of first displayed character */ /* Intuition initializes and maintains these variables for you */ WORD UndoPos; /* character position in the undo buffer */ WORD NumChars; /* number of characters currently in Buffer */ WORD DispCount; /* number of whole characters visible in Container */ WORD CLeft, CTop; /* topleft offset of the container */ /* This unused field is changed to allow extended specification * of string gadget parameters. It is ignored unless the flag * GACT_STRINGEXTEND is set in the Gadget's Activation field * or the GFLG_STRINGEXTEND flag is set in the Gadget Flags field. * (See GFLG_STRINGEXTEND for an important note) */ /* struct Layer *LayerPtr; --- obsolete --- */ struct StringExtend *Extension; /* 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) */ LONG LongInt; /* If you want this Gadget to use your own Console keymapping, you * set the GACT_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 GACT_ALTKEYMAP, you'll get the standard ASCII keymapping. */ struct KeyMap *AltKeyMap; }; /* ======================================================================== */ /* === IntuiText ========================================================== */ /* ======================================================================== */ /* IntuiText is a series of strings that start with a location * (always relative to the upper-left corner of something) and then the * text of the string. The text is null-terminated. */ struct IntuiText { UBYTE FrontPen, BackPen; /* the pen numbers for the rendering */ UBYTE DrawMode; /* the mode for rendering the text */ WORD LeftEdge; /* relative start location for the text */ WORD TopEdge; /* relative start location for the text */ struct TextAttr *ITextFont; /* if NULL, you accept the default */ UBYTE *IText; /* pointer to null-terminated text */ struct IntuiText *NextText; /* pointer to another IntuiText to render */ }; /* ======================================================================== */ /* === 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 * on NextBorder */ struct Border { WORD LeftEdge, TopEdge; /* initial offsets from the origin */ UBYTE FrontPen, BackPen; /* pens numbers for rendering */ UBYTE DrawMode; /* mode for rendering */ BYTE Count; /* number of XY pairs */ WORD *XY; /* vector coordinate pairs rel to LeftTop */ struct Border *NextBorder; /* pointer to any other Border too */ }; /* ======================================================================== */ /* === Image ============================================================== */ /* ======================================================================== */ /* This is a brief image structure for very simple transfers of * image data to a RastPort */ struct Image { WORD LeftEdge; /* starting offset relative to some origin */ WORD TopEdge; /* starting offsets relative to some origin */ WORD Width; /* pixel size (though data is word-aligned) */ WORD Height; WORD Depth; /* >= 0, for images you create */ UWORD *ImageData; /* 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 one 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 avoids 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 = 0x02; * Gadget.PlaneOnOff = 0x01; * 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. * * NOTE: Intuition relies on PlanePick to know how many planes * of data are found in ImageData. There should be no more * '1'-bits in PlanePick than there are planes in ImageData. */ UBYTE PlanePick, PlaneOnOff; /* if the NextImage variable is not NULL, Intuition presumes that * it points to another Image structure with another Image to be * rendered */ struct Image *NextImage; }; /* ======================================================================== */ /* === IntuiMessage ======================================================= */ /* ======================================================================== */ struct IntuiMessage { struct Message ExecMessage; /* the Class bits correspond directly with the IDCMP Flags, except for the * special bit IDCMP_LONELYMESSAGE (defined below) */ ULONG Class; /* the Code field is for special values like MENU number */ UWORD Code; /* the Qualifier field is a copy of the current InputEvent's Qualifier */ UWORD Qualifier; /* IAddress contains particular addresses for Intuition functions, like * the pointer to the Gadget or the Screen */ APTR IAddress; /* 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 (WFLG_GIMMEZEROZERO * notwithstanding). If IDCMP_DELTAMOVE is set, these values will * be deltas from the last reported position. */ WORD MouseX, MouseY; /* the time values are copies of the current system clock time. Micros * are in units of microseconds, Seconds in seconds. */ ULONG Seconds, Micros; /* the IDCMPWindow variable will always have the address of the Window of * this IDCMP */ struct Window *IDCMPWindow; /* system-use variable */ struct IntuiMessage *SpecialLink; }; /* --- IDCMP Classes ------------------------------------------------------ */ /* Please refer to the Autodoc for OpenWindow() and to the Rom Kernel * Manual for full details on the IDCMP classes. */ #define IDCMP_SIZEVERIFY 0x00000001 #define IDCMP_NEWSIZE 0x00000002 #define IDCMP_REFRESHWINDOW 0x00000004 #define IDCMP_MOUSEBUTTONS 0x00000008 #define IDCMP_MOUSEMOVE 0x00000010 #define IDCMP_GADGETDOWN 0x00000020 #define IDCMP_GADGETUP 0x00000040 #define IDCMP_REQSET 0x00000080 #define IDCMP_MENUPICK 0x00000100 #define IDCMP_CLOSEWINDOW 0x00000200 #define IDCMP_RAWKEY 0x00000400 #define IDCMP_REQVERIFY 0x00000800 #define IDCMP_REQCLEAR 0x00001000 #define IDCMP_MENUVERIFY 0x00002000 #define IDCMP_NEWPREFS 0x00004000 #define IDCMP_DISKINSERTED 0x00008000 #define IDCMP_DISKREMOVED 0x00010000 #define IDCMP_WBENCHMESSAGE 0x00020000 /* System use only */ #define IDCMP_ACTIVEWINDOW 0x00040000 #define IDCMP_INACTIVEWINDOW 0x00080000 #define IDCMP_DELTAMOVE 0x00100000 #define IDCMP_VANILLAKEY 0x00200000 #define IDCMP_INTUITICKS 0x00400000 /* for notifications from "boopsi" gadgets */ #define IDCMP_IDCMPUPDATE 0x00800000 /* new for V36 */ /* for getting help key report during menu session */ #define IDCMP_MENUHELP 0x01000000 /* new for V36 */ /* for notification of any move/size/zoom/change window */ #define IDCMP_CHANGEWINDOW 0x02000000 /* new for V36 */ /* NOTEZ-BIEN: 0x80000000 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 */ #define IDCMP_LONELYMESSAGE 0x80000000 /* --- IDCMP Codes -------------------------------------------------------- */ /* This group of codes is for the IDCMP_MENUVERIFY function */ #define MENUHOT 0x0001 /* IntuiWants verification or MENUCANCEL */ #define MENUCANCEL 0x0002 /* HOT Reply of this cancels Menu operation */ #define MENUWAITING 0x0003 /* Intuition simply wants a ReplyMsg() ASAP */ /* These are internal tokens to represent state of verification attempts * shown here as a clue. */ #define OKOK MENUHOT /* guy didn't care */ #define OKABORT 0x0004 /* window rendered question moot */ #define OKCANCEL MENUCANCEL /* window sent cancel reply */ /* This group of codes is for the IDCMP_WBENCHMESSAGE messages */ #define WBENCHOPEN 0x0001 #define WBENCHCLOSE 0x0002 /* A data structure common in V36 Intuition processing */ struct IBox { WORD Left; WORD Top; WORD Width; WORD Height; }; /* ======================================================================== */ /* === Window ============================================================= */ /* ======================================================================== */ struct Window { struct Window *NextWindow; /* for the linked list in a screen */ WORD LeftEdge, TopEdge; /* screen dimensions of window */ WORD Width, Height; /* screen dimensions of window */ WORD MouseY, MouseX; /* relative to upper-left of window */ WORD MinWidth, MinHeight; /* minimum sizes */ UWORD MaxWidth, MaxHeight; /* maximum sizes */ ULONG Flags; /* see below for defines */ struct Menu *MenuStrip; /* the strip of Menu headers */ UBYTE *Title; /* the title text for this window */ struct Requester *FirstRequest; /* all active Requesters */ struct Requester *DMRequest; /* double-click Requester */ WORD ReqCount; /* count of reqs blocking Window */ struct Screen *WScreen; /* this Window's Screen */ struct RastPort *RPort; /* this Window's very own RastPort */ /* the border variables describe the window border. If you specify * WFLG_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 * WFLG_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 */ BYTE BorderLeft, BorderTop, BorderRight, BorderBottom; struct RastPort *BorderRPort; /* 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) */ struct Gadget *FirstGadget; /* these are for opening/closing the windows */ struct Window *Parent, *Descendant; /* sprite data information for your own Pointer * set these AFTER you Open the Window by calling SetPointer() */ UWORD *Pointer; /* sprite data */ BYTE PtrHeight; /* sprite height (not including sprite padding) */ BYTE PtrWidth; /* sprite width (must be less than or equal to 16) */ BYTE XOffset, YOffset; /* sprite offsets */ /* the IDCMP Flags and User's and Intuition's Message Ports */ ULONG IDCMPFlags; /* User-selected flags */ struct MsgPort *UserPort, *WindowPort; struct IntuiMessage *MessageKey; UBYTE DetailPen, BlockPen; /* 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 */ struct Image *CheckMark; UBYTE *ScreenTitle; /* if non-null, Screen title when Window is active */ /* These variables have the mouse coordinates relative to the * inner-Window of WFLG_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, WFLG_GIMMEZEROZERO * notwithstanding */ WORD GZZMouseX; WORD GZZMouseY; /* these variables contain the width and height of the inner-Window of * WFLG_GIMMEZEROZERO Windows */ WORD GZZWidth; WORD GZZHeight; UBYTE *ExtData; BYTE *UserData; /* general-purpose pointer to User data extension */ /** 11/18/85: this pointer keeps a duplicate of what * Window.RPort->Layer is _supposed_ to be pointing at */ struct Layer *WLayer; /* NEW 1.2: need to keep track of the font that * OpenWindow opened, in case user SetFont's into RastPort */ struct TextFont *IFont; /* (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. */ ULONG MoreFlags; /**** Data beyond this point are Intuition Private. DO NOT USE ****/ }; /* --- Flags requested at OpenWindow() time by the application --------- */ #define WFLG_SIZEGADGET 0x00000001 /* include sizing system-gadget? */ #define WFLG_DRAGBAR 0x00000002 /* include dragging system-gadget? */ #define WFLG_DEPTHGADGET 0x00000004 /* include depth arrangement gadget? */ #define WFLG_CLOSEGADGET 0x00000008 /* include close-box system-gadget? */ #define WFLG_SIZEBRIGHT 0x00000010 /* size gadget uses right border */ #define WFLG_SIZEBBOTTOM 0x00000020 /* size gadget uses bottom border */ /* --- refresh modes ------------------------------------------------------ */ /* combinations of the WFLG_REFRESHBITS select the refresh type */ #define WFLG_REFRESHBITS 0x000000C0 #define WFLG_SMART_REFRESH 0x00000000 #define WFLG_SIMPLE_REFRESH 0x00000040 #define WFLG_SUPER_BITMAP 0x00000080 #define WFLG_OTHER_REFRESH 0x000000C0 #define WFLG_BACKDROP 0x00000100 /* this is a backdrop window */ #define WFLG_REPORTMOUSE 0x00000200 /* to hear about every mouse move */ #define WFLG_GIMMEZEROZERO 0x00000400 /* a GimmeZeroZero window */ #define WFLG_BORDERLESS 0x00000800 /* to get a Window sans border */ #define WFLG_ACTIVATE 0x00001000 /* when Window opens, it's Active */ /* FLAGS SET BY INTUITION */ #define WFLG_WINDOWACTIVE 0x00002000 /* this window is the active one */ #define WFLG_INREQUEST 0x00004000 /* this window is in request mode */ #define WFLG_MENUSTATE 0x00008000 /* Window is active with Menus on */ /* --- Other User Flags --------------------------------------------------- */ #define WFLG_RMBTRAP 0x00010000 /* Catch RMB events for your own */ #define WFLG_NOCAREREFRESH 0x00020000 /* not to be bothered with REFRESH */ /* --- Other Intuition Flags ---------------------------------------------- */ #define WFLG_WINDOWREFRESH 0x01000000 /* Window is currently refreshing */ #define WFLG_WBENCHWINDOW 0x02000000 /* WorkBench tool ONLY Window */ #define WFLG_WINDOWTICKED 0x04000000 /* only one timer tick at a time */ /* - V36 new Flags which the programmer may specify in NewWindow.Flags */ #define WFLG_NW_EXTENDED 0x00040000 /* extension data provided */ /* see struct ExtNewWindow */ /* --- V36 Flags to be set only by Intuition ------------------------- */ #define WFLG_VISITOR 0x08000000 /* visitor window */ #define WFLG_ZOOMED 0x10000000 /* identifies "zoom state" */ #define WFLG_HASZOOM 0x20000000 /* windowhas a zoom gadget */ /* --- Other Window Values ---------------------------------------------- */ #define DEFAULTMOUSEQUEUE (5) /* no more mouse messages */ /* --- see struct IntuiMessage for the IDCMP Flag definitions ------------- */ /* ======================================================================== */ /* === NewWindow ========================================================== */ /* ======================================================================== */ /* * Note that the new extension fields have been removed. Use ExtNewWindow * structure below to make use of these fields */ struct NewWindow { WORD LeftEdge, TopEdge; /* screen dimensions of window */ WORD Width, Height; /* screen dimensions of window */ UBYTE DetailPen, BlockPen; /* for bar/border/gadget rendering */ ULONG IDCMPFlags; /* User-selected IDCMP flags */ ULONG Flags; /* 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) */ struct Gadget *FirstGadget; /* 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 */ struct Image *CheckMark; UBYTE *Title; /* 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. */ struct Screen *Screen; /* WFLG_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 */ struct BitMap *BitMap; /* the values describe the minimum and maximum sizes of your Windows. * these matter only if you've chosen the WFLG_SIZEGADGET 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. */ WORD MinWidth, MinHeight; /* minimums */ UWORD MaxWidth, MaxHeight; /* 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. */ UWORD Type; }; /* 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. */ struct ExtNewWindow { WORD LeftEdge, TopEdge; WORD Width, Height; UBYTE DetailPen, BlockPen; ULONG IDCMPFlags; ULONG Flags; struct Gadget *FirstGadget; struct Image *CheckMark; UBYTE *Title; struct Screen *Screen; struct BitMap *BitMap; WORD MinWidth, MinHeight; UWORD MaxWidth, MaxHeight; /* 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. */ UWORD Type; /* ------------------------------------------------------- * * 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. */ struct TagItem *Extension; }; /* * 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. */ #define WA_Dummy (TAG_USER + 99) /* 0x80000063 */ /* these tags simply override NewWindow parameters */ #define WA_Left (WA_Dummy + 0x01) #define WA_Top (WA_Dummy + 0x02) #define WA_Width (WA_Dummy + 0x03) #define WA_Height (WA_Dummy + 0x04) #define WA_DetailPen (WA_Dummy + 0x05) #define WA_BlockPen (WA_Dummy + 0x06) #define WA_IDCMP (WA_Dummy + 0x07) /* "bulk" initialization of NewWindow.Flags */ #define WA_Flags (WA_Dummy + 0x08) #define WA_Gadgets (WA_Dummy + 0x09) #define WA_Checkmark (WA_Dummy + 0x0A) #define WA_Title (WA_Dummy + 0x0B) /* means you don't have to call SetWindowTitles * after you open your window */ #define WA_ScreenTitle (WA_Dummy + 0x0C) #define WA_CustomScreen (WA_Dummy + 0x0D) #define WA_SuperBitMap (WA_Dummy + 0x0E) /* also implies WFLG_SUPER_BITMAP property */ #define WA_MinWidth (WA_Dummy + 0x0F) #define WA_MinHeight (WA_Dummy + 0x10) #define WA_MaxWidth (WA_Dummy + 0x11) #define WA_MaxHeight (WA_Dummy + 0x12) /* The following are specifications for new features */ #define WA_InnerWidth (WA_Dummy + 0x13) #define WA_InnerHeight (WA_Dummy + 0x14) /* 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. */ #define WA_PubScreenName (WA_Dummy + 0x15) /* declares that you want the window to open as * a visitor on the public screen whose name is * pointed to by (UBYTE *) ti_Data */ #define WA_PubScreen (WA_Dummy + 0x16) /* 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(). */ #define WA_PubScreenFallBack (WA_Dummy + 0x17) /* 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 */ #define WA_WindowName (WA_Dummy + 0x18) /* not implemented */ #define WA_Colors (WA_Dummy + 0x19) /* 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. */ #define WA_Zoom (WA_Dummy + 0x1A) /* 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. */ #define WA_MouseQueue (WA_Dummy + 0x1B) /* ti_Data contains initial value for the mouse * message backlog limit for this window. */ #define WA_BackFill (WA_Dummy + 0x1C) /* unimplemented at present: provides a "backfill * hook" for your window's layer. */ #define WA_RptQueue (WA_Dummy + 0x1D) /* initial value of repeat key backlog limit */ /* These Boolean tag items are alternatives to the NewWindow.Flags * boolean flags with similar names. */ #define WA_SizeGadget (WA_Dummy + 0x1E) #define WA_DragBar (WA_Dummy + 0x1F) #define WA_DepthGadget (WA_Dummy + 0x20) #define WA_CloseGadget (WA_Dummy + 0x21) #define WA_Backdrop (WA_Dummy + 0x22) #define WA_ReportMouse (WA_Dummy + 0x23) #define WA_NoCareRefresh (WA_Dummy + 0x24) #define WA_Borderless (WA_Dummy + 0x25) #define WA_Activate (WA_Dummy + 0x26) #define WA_RMBTrap (WA_Dummy + 0x27) #define WA_WBenchWindow (WA_Dummy + 0x28) /* PRIVATE!! */ #define WA_SimpleRefresh (WA_Dummy + 0x29) /* only specify if TRUE */ #define WA_SmartRefresh (WA_Dummy + 0x2A) /* only specify if TRUE */ #define WA_SizeBRight (WA_Dummy + 0x2B) #define WA_SizeBBottom (WA_Dummy + 0x2C) /* New Boolean properties */ #define WA_AutoAdjust (WA_Dummy + 0x2D) /* shift or squeeze the window's position and * dimensions to fit it on screen. */ #define WA_GimmeZeroZero (WA_Dummy + 0x2E) /* equiv. to NewWindow.Flags WFLG_GIMMEZEROZERO */ /* New for V37: WA_MenuHelp (ignored by V36) */ #define WA_MenuHelp (WA_Dummy + 0x2F) /* Enables IDCMP_MENUHELP: Pressing HELP during menus * will return IDCMP_MENUHELP message. */ #ifndef INTUITION_SCREENS_H #include <intuition/screens.h> #endif #ifndef INTUITION_PREFERENCES_H #include <intuition/preferences.h> #endif /* ======================================================================== */ /* === 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 */ struct Remember { struct Remember *NextRemember; ULONG RememberSize; UBYTE *Memory; }; /* === Color Spec ====================================================== */ /* How to tell Intuition about RGB values for a color table entry. */ struct ColorSpec { WORD ColorIndex; /* -1 terminates an array of ColorSpec */ UWORD Red; /* only 6 bits recognized in V36 */ UWORD Green; /* only 6 bits recognized in V36 */ UWORD Blue; /* only 6 bits recognized in V36 */ }; /* === Easy Requester Specification ======================================= */ /* see also autodocs for EasyRequest and BuildEasyRequest */ /* NOTE: This structure may grow in size in the future */ struct EasyStruct { ULONG es_StructSize; /* should be sizeof (struct EasyStruct )*/ ULONG es_Flags; /* should be 0 for now */ UBYTE *es_Title; /* title of requester window */ UBYTE *es_TextFormat; /* 'printf' style formatting string */ UBYTE *es_GadgetFormat; /* 'printf' style formatting string */ }; /* ======================================================================== */ /* === Miscellaneous ====================================================== */ /* ======================================================================== */ /* = MACROS ============================================================== */ #define MENUNUM(n) (n & 0x1F) #define ITEMNUM(n) ((n >> 5) & 0x003F) #define SUBNUM(n) ((n >> 11) & 0x001F) #define SHIFTMENU(n) (n & 0x1F) #define SHIFTITEM(n) ((n & 0x3F) << 5) #define SHIFTSUB(n) ((n & 0x1F) << 11) #define FULLMENUNUM( menu, item, sub ) \ ( SHIFTSUB(sub) | SHIFTITEM(item) | SHIFTMENU(menu) ) #define SRBNUM(n) (0x08 - (n >> 4)) /* SerRWBits -> read bits per char */ #define SWBNUM(n) (0x08 - (n & 0x0F))/* SerRWBits -> write bits per chr */ #define SSBNUM(n) (0x01 + (n >> 4)) /* SerStopBuf -> stop bits per chr */ #define SPARNUM(n) (n >> 4) /* SerParShk -> parity setting */ #define SHAKNUM(n) (n & 0x0F) /* SerParShk -> handshake mode */ /* = MENU STUFF =========================================================== */ #define NOMENU 0x001F #define NOITEM 0x003F #define NOSUB 0x001F #define MENUNULL 0xFFFF /* = =RJ='s peculiarities ================================================= */ #define FOREVER for(;;) #define SIGN(x) ( ((x) > 0) - ((x) < 0) ) #define NOT ! /* 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 */ #define CHECKWIDTH 19 #define COMMWIDTH 27 #define LOWCHECKWIDTH 13 #define 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 */ #define ALERT_TYPE 0x80000000 #define RECOVERY_ALERT 0x00000000 /* the system can recover from this */ #define DEADEND_ALERT 0x80000000 /* 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 */ #define AUTOFRONTPEN 0 #define AUTOBACKPEN 1 #define AUTODRAWMODE JAM2 #define AUTOLEFTEDGE 6 #define AUTOTOPEDGE 3 #define AUTOITEXTFONT NULL #define AUTONEXTTEXT NULL /* --- RAWMOUSE Codes and Qualifiers (Console OR IDCMP) ------------------- */ #define SELECTUP (IECODE_LBUTTON | IECODE_UP_PREFIX) #define SELECTDOWN (IECODE_LBUTTON) #define MENUUP (IECODE_RBUTTON | IECODE_UP_PREFIX) #define MENUDOWN (IECODE_RBUTTON) #define MIDDLEDOWN (IECODE_MBUTTON) #define MIDDLEUP (IECODE_MBUTTON | IECODE_UP_PREFIX) #define ALTLEFT (IEQUALIFIER_LALT) #define ALTRIGHT (IEQUALIFIER_RALT) #define AMIGALEFT (IEQUALIFIER_LCOMMAND) #define AMIGARIGHT (IEQUALIFIER_RCOMMAND) #define AMIGAKEYS (AMIGALEFT | AMIGARIGHT) #define CURSORUP 0x4C #define CURSORLEFT 0x4F #define CURSORRIGHT 0x4E #define CURSORDOWN 0x4D #define KEYCODE_Q 0x10 #define KEYCODE_Z 0x31 #define KEYCODE_X 0x32 #define KEYCODE_V 0x34 #define KEYCODE_B 0x35 #define KEYCODE_N 0x36 #define KEYCODE_M 0x37 #define KEYCODE_LESS 0x38 #define KEYCODE_GREATER 0x39 /* Include obsolete identifiers: */ #ifndef INTUITION_IOBSOLETE_H #include <intuition/iobsolete.h> #endif #endif