[← Home](../README.md) · [Libraries](README.md) # icon.library — Workbench Icons (.info Files) ## Overview Every Workbench-visible file has a companion `.info` file containing its icon imagery, tool types (key=value metadata), default tool, stack size, and position. `icon.library` provides reading, writing, and manipulating these structures. The `.info` file format is binary, not text. icon.library handles all serialization. ```mermaid flowchart LR subgraph "Disk" FILE["myapp"] INFO["myapp.info"] end subgraph "icon.library" GET["GetDiskObject"] --> DO["struct DiskObject"] DO --> IMG["Icon imagery
(selected + unselected)"] DO --> TT["ToolTypes
(key=value strings)"] DO --> DT["DefaultTool
(path to handler)"] DO --> POS["Position
(x, y on Workbench)"] end INFO --> GET style DO fill:#e8f4fd,stroke:#2196f3,color:#333 ``` --- ## struct DiskObject ```c /* workbench/workbench.h — NDK39 */ struct DiskObject { UWORD do_Magic; /* $E310 = WB_DISKMAGIC */ UWORD do_Version; /* WB_DISKVERSION (1) */ struct Gadget do_Gadget; /* the icon gadget (contains imagery) */ UBYTE do_Type; /* icon type: WBDISK, WBTOOL, etc. */ char *do_DefaultTool; /* default tool path */ char **do_ToolTypes; /* NULL-terminated string array */ LONG do_CurrentX; /* icon X position on Workbench */ LONG do_CurrentY; /* icon Y position */ BPTR do_DrawerData; /* drawer window position (BPTR) */ char *do_ToolWindow; /* tool window spec (CON: string) */ LONG do_StackSize; /* stack size for tool launch */ }; ``` --- ## Icon Types | Constant | Value | Description | Workbench Behavior | |---|---|---|---| | `WBDISK` | 1 | Disk/volume icon | Opens drawer showing disk contents | | `WBDRAWER` | 2 | Drawer (directory) | Opens drawer window | | `WBTOOL` | 3 | Executable tool | Launches the program | | `WBPROJECT` | 4 | Project (document) | Launches `do_DefaultTool` with this file as argument | | `WBGARBAGE` | 5 | Trashcan | Special drawer for deleted files | | `WBDEVICE` | 6 | Device | Shown in Workbench root | | `WBKICK` | 7 | Kickstart disk | ROM update disk | | `WBAPPICON` | 8 | AppIcon (OS 2.0+) | Application-registered dynamic icon | --- ## Reading Icons ```c struct Library *IconBase = OpenLibrary("icon.library", 0); /* Load a DiskObject from disk: */ struct DiskObject *dobj = GetDiskObject("SYS:Utilities/MultiView"); if (dobj) { Printf("Type: %ld\n", dobj->do_Type); Printf("Default tool: %s\n", dobj->do_DefaultTool ? dobj->do_DefaultTool : "(none)"); Printf("Stack: %ld bytes\n", dobj->do_StackSize); FreeDiskObject(dobj); } /* Get the default icon for a file type: */ struct DiskObject *defIcon = GetDefDiskObject(WBPROJECT); /* ... use defIcon ... */ FreeDiskObject(defIcon); ``` --- ## ToolTypes — Key/Value Metadata ToolTypes are the Amiga's equivalent of application-specific metadata. They're stored as a NULL-terminated array of strings in the `.info` file. ```c /* Example .info file ToolTypes: PUBSCREEN=Workbench NOBLITTER=YES DONOTWAIT CX_PRIORITY=0 (DISABLED_OPTION) */ struct DiskObject *dobj = GetDiskObject("myapp"); if (dobj) { /* Find a specific ToolType: */ char *screen = FindToolType(dobj->do_ToolTypes, "PUBSCREEN"); if (screen) Printf("Public screen: %s\n", screen); /* "Workbench" */ /* Check if a ToolType exists (no value): */ if (FindToolType(dobj->do_ToolTypes, "DONOTWAIT")) Printf("DONOTWAIT is set\n"); /* Check for a specific value within a multi-value ToolType: */ char *flags = FindToolType(dobj->do_ToolTypes, "FLAGS"); if (MatchToolValue(flags, "DEBUG")) Printf("Debug mode enabled\n"); /* Enumerate all ToolTypes: */ char **tt = dobj->do_ToolTypes; while (*tt) { Printf(" ToolType: %s\n", *tt); tt++; } FreeDiskObject(dobj); } ``` ### ToolType Conventions | Convention | Meaning | Example | |---|---|---| | `KEY=VALUE` | Named setting with value | `PUBSCREEN=Workbench` | | `KEY` (no value) | Boolean flag — presence = true | `DONOTWAIT` | | `(KEY)` | Disabled/commented out | `(CX_POPUP=NO)` | | `KEY=val1|val2` | Multi-value (check with `MatchToolValue`) | `FLAGS=DEBUG|VERBOSE` | --- ## Writing / Modifying Icons ```c /* Write a DiskObject to disk: */ PutDiskObject("myfile", dobj); /* Create a new icon programmatically: */ struct DiskObject *newIcon = GetDefDiskObject(WBPROJECT); newIcon->do_DefaultTool = "SYS:Utilities/MultiView"; newIcon->do_StackSize = 8192; char *toolTypes[] = { "PUBSCREEN=Workbench", "DONOTWAIT", NULL }; newIcon->do_ToolTypes = toolTypes; PutDiskObject("myfile", newIcon); FreeDiskObject(newIcon); ``` --- ## OS 3.5+ New-Style Icons AmigaOS 3.5 introduced **true-color icons** (PNG-based) alongside the legacy planar format. The `icon.library` v46+ handles both transparently — `GetDiskObject` returns the best available format. | Feature | Legacy (OS 1.x–3.1) | New-Style (OS 3.5+) | |---|---|---| | Format | Planar bitplane imagery | PNG/true-color embedded | | Colors | 4–16 (Workbench palette) | 24-bit true color | | Size | Fixed (standard sizes) | Scalable | | Transparency | 1-bit mask | 8-bit alpha channel | | Storage | `do_Gadget.GadgetRender` | Extended chunks in `.info` | --- ## References - NDK39: `workbench/workbench.h`, `workbench/icon.h` - ADCD 2.1: icon.library autodocs - See also: [workbench.md](workbench.md) — Workbench integration (AppIcon, AppWindow)