[Contents] [Index] [Help] [Retrace] [Browse <] [Browse >]


   NAME
        IconControlA -- Set and get icon and icon.library options (V44)

   SYNOPSIS
        processed = IconControlA(icon,tags);
        D0                       A0   A1

        ULONG IconControlA(struct diskobject *,struct tagitem *);

        processed = IconControl(icon,tag1,...);

        ULONG IconControl(struct diskobject *,tag tag1,...);

   FUNCTION

        This function is used to modify and query icon and icon.library
        options.

   INPUTS
        icon -- Pointer to a struct diskobject, or null if global
                options are to be modified/queried.
        tags -- Options to modify/query.

   TAGS
        ICONCTRLA_SetGlobalScreen (struct screen *) -- pointer to the
            screen to remap palette mapped icons to. This is commonly
            used by workbench.library after it has initialized itself
            and before/after screen open/close transitions. If the
            screen is set to NULL, the icon colour remapping strategy is
            changed: colours are no longer allocated from a screen
            and the colours to map to will come from a default colour
            colour table with four palette entries. Please note that
            once you select a screen to remap to, you cannot tell
            icon.library to use a different screen; you first need to
            tell icon.library to "let go" of the previously selected
            screen by passing a NULL ICONCTRLA_SetGlobalScreen parameter.
            You can set a different screen only after this is done.

        ICONCTRLA_GetGlobalScreen (struct screen **) -- pointer to the
            screen to remap palette mapped icons to.

        ICONCTRLA_SetGlobalPrecision (LONG) -- Set the global colour
            allocation precision used when remapping icons for
            display. Default is PRECISION_ICON.

        OBP_Precision (LONG) -- Can be used as an alias for the
            ICONCTRLA_SetGlobalPrecision tag.

        ICONCTRLA_GetGlobalPrecision (LONG *) -- Get the global colour
            allocation precision used when remapping icons for
            display.

        ICONCTRLA_SetGlobalEmbossRect (struct rectangle *) -- set the
            frame sizes used for drawing icons. The rectangle
            must be initialized as follows:

                Rectangle->MinX  Width of left edge border (negative),
                                 must be in the range [-255..-1]
                Rectangle->MinY  Height of top edge border (negative),
                                 must be in the range [-255..-1]
                Rectangle->MaxX  Width of right edge border (positive),
                                 must be in the range [1..255]
                Rectangle->MaxY  Height of bottom edge border (positive),
                                 must be in the range [1..255]

        ICONCTRLA_GetGlobalEmbossRect (struct rectangle *) -- get the
            frame sizes used for drawing icons.

        ICONCTRLA_SetGlobalFrameless (BOOL) -- Select whether icons
            should always be drawn without a surrounding frame.
            This option defaults to FALSE.

        ICONCTRLA_GetGlobalFrameless (LONG *) -- Query whether icons
            are always drawn without a surrounding frame.

        ICONCTRLA_SetGlobalIdentifyHook (struct hook *) -- set the
            hook that is invoked when trying to find an icon
            for a file/drawer/volume that does not have an
            icon associated with it. If set to NULL, no hook
            will be called. The hook will be called with the
            following parameters:

            hookFunc(hook,reserved,iim)
                      A0     A2    A1

            VOID hookFunc(struct hook *hook,aptr reserved,
                          struct iconidentifymsg *iim);

            The reserved parameter will be set to NULL (V44).

            The icon identification message contents are as follows:

                iim_SysBase
                iim_DOSBase
                iim_UtilityBase
                iim_IconBase
                    library base pointers set up for your use.

                iim_FileLock
                    A lock on the object to return an icon for.
                    This lock is guaranteed to be non-NULL.

                iim_ParentLock
                    A lock on the object's parent directory. This
                    may be NULL if iim_FileLock points to a volume's
                    root directory. In such a case you should return
                    a WBDISK type icon instead of a WBDRAWER icon.

                iim_FIB
                    An initialized fileinfoblock structure; prior
                    to passing iim_FIB to you, Examine(iim_FileLock,iim_FIB)
                    was called. Unlike the other members of this data
                    structure, you may modify the contents of iim_FIB.

                iim_FileHandle
                    If the object to return an icon for is a file,
                    this member will contain a file handle that can
                    be used to read() its contents. the file read
                    position will be set to the beginning of
                    the file. Note that this member can be NULL.

                iim_Tags
                    A copy of the tag item list passed to GetIconTagList();
                    if you are going to call geticontaglist() in your
                    hook, be sure to include this list as part of the
                    tag list you pass to it.

                    NOTE: This list does not include the tag
                          ICONA_FailIfUnavailable. Keep in mind that
                          the use of this tag can trigger a recursion
                          if the icon you tried to retrieve via
                          geticontaglist() does not exist: your hook
                          code will be invoked again.

            With the exception of iim_FIB, all members of the
            iconidentifymsg are read-only; you may pass them to
            functions like read(), examine(), etc. but you
            may not close() files, unlock() locks or perform
            other functions that may result in the data structures
            getting deallocated or trashed.

            When you manage to find the right icon type for the object
            to be examined, you should return a pointer to a
            struct diskobject that can be freed using freediskobject()
            lateron. Note that you cannot just return a pointer to a
            statically initialized data structure in your code, you
            must return a pointer to a diskobject allocated by icon.library
            itself, such as through geticontaglist(), dupdiskobjecta()
            or newdiskobject().

            The icon you return will be checked to make sure that its
            type matches the corresponding object. For example, returning
            a WBDRAWER icon for a volume root directory will cause that
            icon to be released and to be ignored.

        ICONCTRLA_GetGlobalIdentifyHook (struct hook **) -- get the
            hook that is invoked when trying to find an icon
            for a file/drawer/volume that does not have an
            icon associated with it.

        ICONCTRLA_SetGlobalMaxNameLength (LONG) -- icon.library has
            a built-in file name length limit that affects whether
            icon files are read and written. Currently, the default
            for this value is 25 characters. This is sufficient for
            an icon file name acceptable with the ROM filing system.
            This limit has two effects: if an icon file is to be
            written whose name would be longer than the limit,
            icon.library will silently abort the write attempt and
            pretend that the icon file has been written; this is done
            in order to avoid overwriting the original data file with
            the icon file. If an icon file was read that turns out to
            contain invalid icon data, another test is done in order to
            find out whether the file name was longer than the limit. If
            this is the case, it is assumed that the data was read from
            the original file rather than from the icon file. The library
            then pretends that the icon file was not found.

            This tag can be used to set this length limit. The limit
            must be in the range [8..255].

        ICONCTRLA_GetGlobalMaxNameLength (LONG *) -- Retrieve the
            file name length limit used by icon.library.

        ICONCTRLA_SetGlobalNewIconsSupport (BOOL) -- Select whether
            icon.libray should read and return coloured icon images stored
            in NewIcons format.
            This option defaults to TRUE.

        ICONCTRLA_GetGlobalNewIconsSupport (LONG *) -- Query whether
            icon.library will read and return coloured icon images
            stored in NewIcons format.

        ICONCTRLA_SetGlobalColorIconSupport (BOOL) -- Select whether
            icon.libray should read and return coloured icon images.
            This option defaults to TRUE.

        ICONCTRLA_GetGlobalColorIconSupport (LONG *) -- Query whether
            icon.library will read and return coloured icon images.

        ICONA_ErrorCode (LONG *) -- Pointer to a long word variable to
            store error codes in. Note that this variable will be
            initialized regardless of whether an error occured or not.
            Thus, you can check for an error condition by comparing the
            variable contents against 0; 0 indicates success, all other
            values are error codes as defined by dos.library.

        ICONA_ErrorTagItem (struct tagitem **) -- when an error occurs
            whilst processing the tag item list passed to IconControl(),
            you can have a pointer to the item that caused the error
            passed back via the ICONA_ErrorTagItem tag. Note that for
            tagitem lists allocated from the stack the address passed
            back to you may no longer be valid when control returns from
            IconControl().

        The following tags need a valid icon parameter to operate on.
        If the parameter is missing or invalid, it will be registered
        as an error.

        ICONCTRLA_GetImageMask1 (PLANEPTR *) -- Pointer to the mask plane
            for the regular icon image (icon->do_Gadget.GadgetRender).
            Note that this may be NULL.

        ICONCTRLA_GetImageMask2 (PLANEPTR *) -- Pointer to the mask plane
            for the alternate icon image (icon->do_Gadget.SelectRender).
            Note that this may be NULL.

        ICONCTRLA_SetTransparentColor1 (LONG) -- Set the transparent
            colour for a palette mapped icon image, in this case the
            regular icon image (icon->do_Gadget.GadgetRender). The
            colour must be among the valid palette entries, e.g. for
            a 16 colour image, the transparent colour may not be
            larger than 15. To make the icon image opaque, set its
            transparent colour to -1.

        ICONCTRLA_GetTransparentColor1 (LONG *) -- Get the transparent
            colour for a palette mapped icon image, in this case the
            regular icon image (icon->do_Gadget.GadgetRender). If
            the image is opaque, its "transparent colour" will be
            returned as -1. Note that this data is valid only for
            palette mapped icons; for other types, you may not
            receive any meaningful result.

        ICONCTRLA_SetTransparentColor2 (LONG) -- Set the transparent
            colour for a palette mapped icon image, in this case the
            alternate icon image (icon->do_Gadget.SelectRender). The
            colour must be among the valid palette entries, e.g. for
            a 16 colour image, the transparent colour may not be
            larger than 15. To make the icon image opaque, set its
            transparent colour to -1. Please note that you can set
            the alternate image transparent colour only if there is
            an alternate image.

        ICONCTRLA_GetTransparentColor2 (LONG *) -- Get the transparent
            colour for a palette mapped icon image, in this case the
            alternate icon image (icon->do_Gadget.SelectRender). If
            the image is opaque, its "transparent colour" will be
            returned as -1. Note that this data is valid only for
            palette mapped icons; for other types, you may not
            receive any meaningful result. Likewise, if there is
            no alternate image, no information may be available.

        ICONCTRLA_SetPalette1 (struct colorregister *) -- set the colour
            palette for a palette mapped icon image, in this case the
            regular icon image (icon->do_Gadget.GadgetRender).

        ICONCTRLA_GetPalette1 (struct colorregister **) -- get the colour
            palette for a palette mapped icon image, in this case the
            regular icon image (icon->do_Gadget.GadgetRender). Note
            that this data is valid only for palette mapped icons; for
            other types, you may not receive any meaningful result.
            Note that the number of palette entries in this table
            matches the number of colours in use when the icon
            was first created.

        ICONCTRLA_SetPalette2 (struct colorregister *) -- set the colour
            palette for a palette mapped icon image, in this case the
            alternate icon image (icon->do_Gadget.SelectRender).

        ICONCTRLA_GetPalette2 (struct colorregister **) -- get the colour
            palette for a palette mapped icon image, in this case the
            alternate icon image (icon->do_Gadget.SelectRender). Note
            that this data is valid only for palette mapped icons; for
            other types, you may not receive any meaningful result.
            If there is no alternate image, no information may be
            available.
            Note that the number of palette entries in this table
            matches the number of colours in use when the icon
            was first created.

        ICONCTRLA_SetPaletteSize1 (ULONG) -- Set the size of the colour
            palette to be used for a palette mapped icon image, in
            this case the regular icon image (icon->do_Gadget.GadgetRender).
            This value must be in the range [1..256].

        ICONCTRLA_GetPaletteSize1 (ULONG *) -- Get the size of the colour
            palette to be used for a palette mapped icon image, in
            this case the regular icon image (icon->do_Gadget.GadgetRender).
            Note that this data is valid only for palette mapped icons; for
            other types, you may not receive any meaningful result.

        ICONCTRLA_SetPaletteSize2 (ULONG) -- Set the size of the colour
            palette to be used for a palette mapped icon image, in
            this case the alternate icon image (icon->do_Gadget.SelectRender).
            This value must be in the range [1..256].

        ICONCTRLA_GetPaletteSize2 (ULONG *) -- Get the size of the colour
            palette to be used for a palette mapped icon image, in
            this case the alternate icon image (icon->do_Gadget.SelectRender).
            Note that this data is valid only for palette mapped icons; for
            other types, you may not receive any meaningful result.
            If there is no alternate image, no information may be
            available.

        ICONCTRLA_SetImageData1 (UBYTE *) -- Set the image data to be used for
            a palette mapped icon image, in this case the regular icon
            image (icon->do_Gadget.GadgetRender). There must be exactly
            as many bytes of image data as the image width multiplied
            by its height requires.

            To drop the palette mapped image data associated with an icon,
            use "ICONCTRLA_SetImageData1,NULL,".

        ICONCTRLA_GetImageData1 (UBYTE **) -- Get the image data to be used for
            a palette mapped icon image, in this case the regular icon
            image (icon->do_Gadget.GadgetRender). Note that this data is
            valid only for palette mapped icons; for other types, you may
            not receive any meaningful result.

        ICONCTRLA_SetImageData2 (UBYTE *) -- Set the image data to be used for
            a palette mapped icon image, in this case the alternate icon
            image (icon->do_Gadget.SelectRender). There must be exactly
            as many bytes of image data as the image width multiplied
            by its height requires.

            To drop the palette mapped image data associated with the alternate
            image of an icon, use "ICONCTRLA_SetImageData2,NULL,".

        ICONCTRLA_GetImageData2 (UBYTE **) -- Get the image data to be used for
            a palette mapped icon image, in this case the alternate icon
            image (icon->do_Gadget.SelectRender). Note that this data is
            valid only for palette mapped icons; for other types, you may
            not receive any meaningful result. If there is no alternate
            image, no information may be available.

        ICONCTRLA_SetFrameless (BOOL) -- Select whether the icon should be
            drawn without a frame. This option defaults to FALSE.

        ICONCTRLA_GetFrameless (LONG *) -- Query whether the icon should be
            drawn without a frame.

        ICONCTRLA_SetNewIconsSupport (BOOL) -- Select whether palette mapped
            icon images that were originally stored in NewIcons format
            should be written back in the same format. This option
            defaults to TRUE.

        ICONCTRLA_GetNewIconsSupport (LONG *) -- Query whether palette mapped
            icon images that were originally stored in NewIcons format
            should be written back in the same format.

        ICONCTRLA_SetAspectRatio (UBYTE) -- Set the icon aspect ratio; this
            consists of a numerator and a denominator packed into a
            single byte (the PACK_ICON_ASPECT_RATIO() macro can be used
            for encoding this parameter). If the icon aspect ratio is
            unknown, ICON_ASPECT_RATIO_UNKNOWN should be used.

        ICONCTRLA_GetAspectRatio (UBYTE *) -- Get the icon aspect ratio; this
            consists of a numerator and a denominator packed into a
            single byte (the UNPACK_ICON_ASPECT_RATIO() macro can be used
            for decoding this value). If the icon aspect ratio is unknown,
            ICON_ASPECT_RATIO_UNKNOWN will be returned.

        ICONCTRLA_SetWidth (ULONG) -- Select the palette mapped icon image
            width. This value must be in the range [1..256].

        ICONCTRLA_GetWidth (ULONG *) -- Query the palette mapped icon image
            width. Note that this data is valid only for palette mapped icons;
            for other types, you may not receive any meaningful result.

        ICONCTRLA_SetHeight (ULONG) -- Select the palette mapped icon image
            height. This value must be in the range [1..256].

        ICONCTRLA_GetHeight (ULONG *) -- Query the palette mapped icon image
            height. Note that this data is valid only for palette mapped icons;
            for other types, you may not receive any meaningful result.

        ICONCTRLA_IsPaletteMapped (LONG *) -- Query whether the icon is using
            palette mapped icon images.

        ICONCTRLA_IsNewIcon (LONG *) -- Query whether the icon is of the
            NewIcon type.

        ICONCTRLA_IsNativeIcon (LONG *) -- There is an important difference
            between struct diskobject icons allocated by icon.library itself
            (these are the so-called "native" icons) and statically initialized
            icons which consist solely of a simple struct diskobject which may
            be part of a program's static data area. For example, you can
            attach a palette mapped icon image to a "native" icon, which is
            something you cannot do with a statically allocated icon. To help
            you tell the two types apart, you can use the ICONCTRLA_IsNativeIcon
            query tag.

        ICONGETA_IsDefaultIcon (LONG *) -- Query whether this icon is associated
            with a file/drawer/volume or is a "fake" icon that was constructed
            for an object that has no icon associated with it.

        ICONCTRLA_GetScreen (struct screen **) -- get the screen this icon
            has been remapped to and whose colour map it uses. Note that this
            data is valid only for palette mapped icons; for other types, you
            may not receive any meaningful result.

            This tag may return NULL if the icon is not currently associated
            with a screen.

        ICONCTRLA_HasRealImage2 (LONG *) -- icon.library may generate an
            alternate image for palette mapped icons if there is no image
            data stored for this image. To find out whether an icon
            was generated or is part of the original icon image, use the
            ICONCTRLA_HasRealImage2 tag.

   RESULT
        processed -- Number of tags that were processed correctly, i.e.
            the number of tags whose parameters are in order, for which
            information could be returned, etc. If processing stops because of
            an error, the number returned by this function will be smaller
            than the number of tag items passed in. The same happens if
            the information you wanted to obtain is unavailable. In any
            case, check the error code this routine can set up for you.

   EXAMPLE
        /* Check if the icon is palette mapped. */
        long ispalettemapped;
        long errorcode;
        struct diskobject *icon;

        if(IconControl(icon,
            ICONCTRLA_IsPaletteMapped,&isPaletteMapped,
            ICONA_ErrorCode,&errorCode,
        TAG_DONE) == 1)
        {
            Printf("the icon %s palette mappedn",
                isPaletteMapped ? "is" : "is not");
        }
        else
        {
            Printf("could not query icon information;n");
            PrintFault(errorCode,NULL);
        }

        /* Set the icon colour remapping precision. */
        IconControl(NULL,
            ICONCTRLA_SetGlobalPrecision,PRECISION_EXACT,
        TAG_DONE);

        /* Query the embossing rectangle dimensions and
         * the identification hook.
         */
        struct rectangle rect;
        struct hook *hook;

        if(IconControl(NULL,
            ICONCTRLA_GetGlobalEmbossRect,&rect,
            ICONCTRLA_GetGlobalIdentifyHook,&hook,
        TAG_DONE) == 2)
        {
            Printf("embossing rect: %ld,%ld,%ld,%ldn",
                rect.MinX,rect.MaxX,rect.MinY,rect.MaxY);
            Printf("identification hook: 0x%08lxn",
                hook);
        }

   NOTES
        Changing an icon's palette or image data does not automatically
        produce a different icon image you can use. To do this, you
        must re-layout it using LayoutIcon().

        When querying parameters, make sure to always pass in a pointer
        to a long word variable to store the result in.

        Some get/set operations may cause additional memory to be
        allocated. This may fail; be prepared.

        IconControl() processes the tag item list in sequential order.
        This has consequences for several tags, such as the palette size
        and the transparent colour. For example, if you want to make
        colour #14 of an icon image transparent, make sure to have the
        palette size set to at least 15 colours before you try to change
        the transparent colour. Otherwise, IconControl() may refuse to
        set the transparent colour to #14 since it won't know that there
        should be more than 14 colours in that image at the time you try
        to set it. Therefore, if you wanted to change the palette size and
        the transparent colour in the same tag item list, make sure that the
        palette size change tag appears before the transparent colour change
        tag.

        As described above, some of the operations on icons are not
        supported for DiskObjects not allocated through icon.library. In
        such cases you will receive an error code ERROR_ACTION_NOT_KNOWN.

   SEE ALSO
        dos.library/ioerr
        icon.library/dupdiskobjecta
        icon.library/geticontaglist
        icon.library/LayoutIcon
        icon.library/newdiskobject
        graphics.library/bltmaskbitmaprastport
        graphics.library/obtainbestpena
        utility.library/callhookpkt
        graphics/view.h
        workbench/icon.h
        workbench/workbench.h