Features of V39 GadTools by Mark Ricci The V39 GadTools library has been upgraded with new features and capabilities that support the enhanced graphic capabilities of the AA chipset. Other improvements include support for IDCMP_GADGETHELP events, more support for IDCMP_GADGETUP events, scalable imagery and a new function, GT_GetGadgetAttrs(), to obtain the values of certain gadget attributes. This article assumes you are familiar with the previous version of the GadTools library. If not, you should refer to the ``GadTools Library'' chapter of the Amiga ROM Kernel Reference Manual: Libraries for an in-depth explanation of GadTools. You should also refer to the GadTools Autodoc for complete explanations of the GadTools functions. All tags and constants referenced in this article are defined in <libraries/gadtools.h> and <intuition/intuition.h>. The NewLook Menus For V37, Intuition received a facelift. V37 introduced the ``NewLook'' rendering scheme, which improved the appearance of most of the elements of the Amiga user interface (windows, system gadgets, standard Boopsi classes, etc.). One element of the Amiga's GUI that escaped the NewLook was the menu system. For V39, Intuition added the NewLook to its menus. When Intuition renders NewLook menus, it gets the colors for the menu from the Palette Preferences set by the user. Before V39, Intuition used the window's DetailPen and BlockPen to draw the menu and the colors of the MenuItems depended on the MenuItem's IntuiText or Image structure. GadTools fully supports Intuition's NewLook menus. To make GadTools use the NewLook color scheme for a window's menus, an application needs to do two things. First, it needs to tell Intuition that it wants NewLook menu imagery for the window. It does this when opening the window by passing the {WA_NewLookMenus, TRUE} tag/value pair to OpenWindowTags(). Second, the application needs to remind GadTools that the window uses NewLook imagery for its menus. The application does this by passing the {GTMN_NewLookMenus, TRUE} tag/value pair to LayoutMenus(): struct VisualInfo *vi; LayoutMenus(menusready, vi, GTMN_NewLookMenus, TRUE, TAG_END); Instead of using the GTMN_NewLookMenus tag, it's possible to set the menu colors yourself by using the GTMN_FrontPen tag to set the pen number for rendering menu text. In addition to this tag, you must set the screen's BARDETAILPEN and BARTRIMPEN to match the menu text pen and set the BARBLOCKPEN to the color you want for the title bar. However, you cannot control how Intuition complements menu items and you do not automatically get the user's menu color preferences, so you will not get as perfect NewLook menu as you would by leaving it to the system. Gadgets Most GadTools gadgets received new attributes in V39. These include new IDCMP events, the ability to specify rendering pens, and scalable imagery. IDCMP Events Button, integer and string gadgets can send IDCMP_GADGETDOWN events by setting the GA_Immediate tag to TRUE. Disabling MX and listview gadgets join the other GadTools gadgets in having a disable attribute. Set the GA_Disabled tag to TRUE to disable, and FALSE to re-enable. Scalable Imagery Checkbox and MX gadgets are no longer fixed in size. You can scale them to any width and height. If you do not specify scaling, GadTools uses its built-in default dimensions. These dimensions, which are defined in <libraries/gadtools.h> , are CHECKBOXWIDTH and CHECKBOXHEIGHT for checkbox gadgets, and MXWIDTH by MXHEIGHT for MX gadgets. To scale a checkbox gadget, set the GTCB_Scaled tag to TRUE, and set the desired width and height in the ng_Width and ng_Height fields of the NewGadget structure. The default value of GTCB_Scaled is FALSE, meaning use the default size of 26 by 11, the values of CHECKBOXWIDTH and CHECKBOXHEIGHT, respectively. To scale an MX gadget, set the GTMX_Scaled tag to TRUE, and set the desired width and height in the ng_Width and ng_Height fields of the NewGadget structure. The default value of GTMX_Scaled is FALSE, meaning use the default size of 17 by 9, the values of MXWIDTH by MXHEIGHT, respectively. If you scale MX gadgets, you must also set the GTMX_Spacing tag to NewGadget.ng_TextAttr->ta_YSize + 1 to properly space the buttons with respect to the font. Rendering Pens, Display Format, Justification, Clipping and Display Size Application writers use number, text, and to some degree, slider gadgets, to present information to the user. The new attributes for these gadgets improve the presentation of the information. You can specify any pen for rendering the foreground and the background of number and text gadgets. This allows you to use color for emphasis or aesthetics. For example, you might use red as the foreground color in a text gadget for emphasis. You can also use C-language-like formatting strings for the displays, e.g., %lx would give you hexadecimal output in a number gadget. The Exec RawDoFmt() function processes this string, so refer to that function for details. Text clipping is another new attribute. It clips the display to fit within the borders of the gadget. This prevents the text or number from running over the border of a gadget if it's too large for the gadget. Along with text clipping, the number, text and slider gadgets can left, center and right justify their displays. Finally, you can specify the size of the string buffer that number and slider gadgets use when formatting their text. This buffer must be large enough to hold the entire string generated by the gadget, as the gadget doesn't do any bounds checking on the buffer. Underestimating the size of the buffer will cause the gadget to overwrite the buffer, overwriting whatever happens to follow the buffer in memory. For number gadgets, the GTNM_FrontPen tag specifies the pen to use for rendering the number. The default is DrawInfo->dri_Pens[TEXTPEN]). GTNM_BackPen specifies the pen to use for rendering the background of the number. The default is to use the background color of the gadget's window. GTNM_Justification specifies the type of justification within the gadget box. GTJ_LEFT renders the number flush with the left side of the gadget, GTJ_RIGHT renders the number flush with the right side, and GTJ_CENTER centers the number. The default is GTJ_LEFT. GTNM_Format specifies the C-language-like formatting string used to display the number. You must use the ``l'' (long) modifier. The default is ``%ld''. The gadget passes the formatting string to the exec.library function RawDoFmt(), which generates the string that appears in the number gadget. See the Autodoc for RawDoFmt() for more information on the formatting string. If an application changes the default formatting string with the GTNM_Format tag, the string that the number gadget displays may become significantly longer. For example, if the application uses the format string ``my number is %ld'', when the gadget processes the formatting string with RawDoFmt(), RawDoFmt() generates a string at least 14 characters long. By default, the gadget sets aside a 10 byte buffer for RawDoFmt() to use, so the formatting string above is too long for the default buffer. The tag GTNM_MaxNumberLen sets the size of this buffer. GTNM_Clipped controls text clipping. The default behavior differs between number gadgets with borders and number gadgets without borders. For bordered number gadgets, the default is TRUE--clip the display to fit within the gadget borders. For gadgets without borders, the default is FALSE--no clipping. Text gadgets also have a new set of attributes that correspond to the new number gadget attributes. These corresponding tags are: GTTX_FrontPen, GTTX_BackPen, GTTX_Justification, and GTTX_Clipped. There is no corresponding text gadget tag for GTMN_MaxNumberLen or GTMN_Format. Slider gadgets use the GTSL_Justification tag with the constants listed above (GTJ_LEFT, GTJ_RIGHT, and GTJ_CENTER) to control justification of the gadgets numeric display. The GTSL_MaxPixelLen tag specifies the maximum pixel size of the level display for any value of the slider. This is primarily useful when dealing with proportional fonts. The default is the font's character width (from the font's TextFont->tf_XSize field) multiplied by the value in the GTSL_MaxLevelLen tag. New Gadget-Specific Attributes MX gadgets can now have titles. The gadget obtains its title from the ng_GadgetText field of the NewGadget structure. The GTMX_TitlePlace tag specifies where to place the title. The possible values are: PLACETEXT_LEFT Right-align text on left side PLACETEXT_RIGHT Left-align text on right side PLACETEXT_ABOVE Center text above PLACETEXT_BELOW Center text below For compatibility reasons, GadTools will not put a title on the MX gadget if the GTMX_TitlePlace tag is not present. Listviews Listview gadget improvements include forced display of an item, highlighting of the selected item in the listview and custom callback hooks. The GTLV_MakeVisible tag specifies the number of the item that should be forced into the viewing area. It overrides the GTLV_Top tag. In V37, a listview identified its currently selected item by displaying it in a text gadget beneath the listview. The tag GTLV_ShowSelected specifies how the listview indicates which item is the currently selected item. If set to NULL, the listview places a highlight bar over the currently selected item. If GTLV_ShowSelected points to a string gadget, the listview displays the selected item in the string gadget in addition to a highlight bar. You can use callback hooks to render a listview's items. The listview in the V39 Palette Preferences editor uses a callback hook to display the standard user interface pens. The callback hook makes it possible for each item to display the pen color in addition to the pen name. The pen color appears in a little box at the left edge of each item in the listview. Palette GTPA_NumColors sets the number of colors to display in the palette gadget. This overrides the GTPA_Depth tag and allows numbers that are not powers of 2 (which was a limitation of the V37 palette gadget). The default is 2. Palette gadgets can now have their own array of pen numbers. GTPA_ColorTable is a pointer to a array of pen numbers. The array must contain at least as many entries as there are colors displayed in the palette gadget. The default is NULL which causes a 1-to-1 mapping of pen numbers. That means if you don't specify this tag, your palette will use pen number 0 through pen n-1, where n is the number of colors you set in GTPA_NumColors. For example, if you set GTPA_NumColors to 6 and don't specify GTPA_ColorTable, you will get a pen array of pens 0, 1, 2, 3, 4, and 5. A pen array you specify looks like this: UBYTE colors[8]= {1,2,15,6,0,3,8}; Setting GTPA_ColorTable to this array indicates that the palette pens are 1, 2, 15, 6, 0, 3 and 8, respectively. Note that you have to allocate pens to be certain you can use them and control them. See the Amiga OS V39 Developer Release Notes for information on allocating and sharing pens. You cannot use the GTPA_ColorTable tag with the GTPA_ColorOffset tag. The GTPA_ColorOffset tag specifies which pen to use as the first pen of a palette. For example, if you set it to 4, the first pen used in the palette will be pen 4. If you use the GTPA_ColorTable tag, the GTPA_ColorOffset tag is ignored. However, you can do color offsets with a color table by setting the value of the GTPA_ColorTable tag to point to the color table plus the offset you want. In the table above, you could specify pen 6 (the fourth member of the table) as the first pen to use by setting GPTA_ColorTable in this manner: CreateGadget(PALETTE_KIND, gad, &ng, GTPA_ColorTable, &colors[3], TAG_END); Note that the GTPA_NumColors tag is not present in the call above. This will default the number of colors to two, so the palette gadget created above will be a two color gadget that uses pens 6 and 0, the fourth and fifth pens in the array. Obtaining Gadget Attributes Prior to V39, the only way to obtain the attributes of a GadTools gadget was through the Code field of an IDCMP_GADGETUP IntuiMessage. In addition to having to wait until the user clicked on a gadget, this method limited you to obtaining one attribute at a time. A new GadTools function, GT_GetGadgetAttrs() obtains a gadget's attributes. You may call the function at any time after creating a gadget and for as many attributes as the function supports for that gadget. GT_GetGadgetAttrs() accepts a taglist of the attributes to obtain. An application passes it the address of the gadget, the address of the window containing the gadget, a NULL field (this field is reserved for later use and must be NULL for now), and a taglist. Each attribute value pair in the taglist supplies the ID of the tag to get (in ti_Tag) and an address where GT_GetGadgetAttrs() can store the tag's value. Since all tag values are longwords, expect GT_GetGadgetAttrs() to copy a longword for each attribute you request. The function returns the number of attributes it obtained. LONG how_many, top_item = 0, selected_item = 0; how_many = GT_GetGadgetAttrs( listview_gad, win, NULL, GTLV_Top, &top_item, GTLV_Selected, &selected_item, TAG_DONE ); How_many contains the number of gadget attributes GT_GetGadgetAttrs() obtained. GT_GetGadgetAttrs() copies the value of the listview top and the selected item into top_item and selected_item, respectively. Use longword targets to hold the returned values. GT_GetGadgetAttrs() supports GA_Disabled (TRUE if the gadget is disabled; FALSE if the gadget is active) for all GadTools gadgets except text and number gadgets. Other attributes are specific to each gadget as follows: Checkbox - GTCB_Checked returns TRUE if the checkbox gadget is checked, or FALSE if the gadget is not checked. Cycle - GTCY_Active returns the ordinal number, counting up from zero, of the active choice. GTCY_Labels returns a pointer to the NULL-terminated array of choices. Integer - GTIN_Number returns the contents of the gadget. Listview - GTLV_Top returns the ordinal number, counting up from zero, of the top item. GTLV_Selected returns the ordinal number of the selected item. GTLV_Labels returns a pointer to the List structure associated with the gadget. MX - GTMX_Active returns the ordinal number, counting up from zero, of the active selection. Palette - GTPA_Color returns the ordinal number of the selected color. This number corresponds to the selected color's position in the palette's GTPA_ColorTable array. GTPA_ColorOffset returns the ordinal number of the first color used in the palette. GTPA_ColorTable returns a pointer to the table of pen numbers used for the gadget, if there is one. Scroller - GTSC_Top returns the number of the top line visible in the scroller. GTSC_Total returns the total number of lines in the scroller. GTSC_Visible returns the number of visible lines in the scroller. Slider - GTSL_Min returns the minimum value of the slider. GTSL_Max returns the maximum value of the slider. GTSL_Level returns the current level of the slider. String - GTST_String returns a pointer to the gadget's buffer. Text - GTTX_Text returns a pointer to the gadget's buffer. Message Handling - ExtIntuiMessage Structure For V39, the IntuiMessage structure has been extended to allow for tablet support. The GadTools message handling functions--GT_FilterIMsg(), GT_GetIMsg(), GT_PostFilterIMsg() and GT_ReplyIMsg()--work with the extended IntuiMessage structure, ExtIntuiMessage, but are backwards compatible with IntuiMessage. Gadget Help All GadTools gadgets support Intuition's gadget help feature. You enable this by calling the intuition.library function HelpControl(). Gadget help is either on or off for all GadTools gadgets in a window; you cannot selectively enable it for certain gadgets as you can with Intuition gadgets. For more information, refer to page IV-114 of the ``Boopsi in Release 3'' article in the January/February 1993 issue of Amiga Mail. Bevel Box Bevel boxes now come in three types that you specify with GTBB_FrameType. BBFT_BUTTON generates the type of box used around button gadgets. BBFT_RIDGE generates the type of box used for string gadgets. BBFT_ICONDROPBOX generates a box suitable for a standard icon drop box imagery. The default is BBFT_BUTTON. These frame types are similar to the Boopsi imageclass frame types FRAME_BUTTON, FRAME_RIDGE, and FRAME_ICONDROPBOX, that are pictured on page IV-120 of the ``Boopsi in Release 3'' article in the January/February 1993 issue of Amiga Mail. Example Code - NewGadgets.c The example code below is a demonstration of some of the V39 GadTools changes and how to specify them in your code. You'll notice that it lacks many of the features required to actually use the gadgets. This is by design. The intent is for you to modify an existing application using the example as a guide. NewGadgets.c NewGadgets.c produced the screen shot below. Figure 1 - Some New GadTools Features