-------------------- AmigaOS 3.5/3.9 project -------------------------

workbench.library 44.99 (18.3.1999)

- Now written entirely in `C'.

- Removed all dead and unused code.

- Now requires Kickstart 3.1.

- Now specially adapted for the disk-loaded environment.

- Now uses proper function prototypes throughout the
  entire module.

- Parameter passing switched to registers.

- Removed all stub code.

- RemoveAppWindow/RemoveAppIcon/RemoveAppMenuItem now return
  a boolean value rather than the parameter passed in; we
  really have had enough trouble with routines that would
  return pointers in place of flags.

- About 2400 bytes larger than the ROM resident version in V40.

- Removed the hidden about message. We'll eventually have to
  put something in its place, though.

workbench.library 44.101 (18.3.1999)

- No longer uses GetIcon() to retrieve icon files. The whole
  code now uses GetDiskObject() throughout. As soon as the
  new icon.library LVOs are in place, this will have to
  change again, though.

- Now requires and supports icon.library V44.

workbench.library 44.111 (19.3.1999)

- All icon rendering operations now go through icon.library.

- Now prefers icon image masks generated by icon.library rather
  than its own.

- Now notifies icon.library when the Workbench is to be closed
  or reopened.

workbench.library 44.118 (20.3.1999)

- When reopening the display, Workbench no longer uses the
  old image data for icon dragging.

- The window and background pattern fill routine now obtains
  its locking semaphore (protects against pattern changes
  while rendering is being done) in shared mode.

- Changed over all icon reading and drawing routines to use
  the new icon.library code.

workbench.library 44.143 (20.3.1999)

- In the "Execute..." requester, Workbench now puts the cursor
  on the first parameter following the command name. Likewise,
  for CLI icons with a tool type set, Workbench will put both
  the default tool name and the name of the project file on
  the same command line, placing the cursor right behind the
  default tool's name.

- Fixed an Enforcer hit in the "Information..." window which
  could be triggered by one single memory allocation failure.

- Introduced limit checking for all strcpy() and strcat()
  operations. The new code will make sure not to overrun
  the string to copy to. This should make tool type
  editing *much* safer. Workbench is still chock full of
  fixed length name strings and certain assumptions about
  the maximum length of a file/drawer name. Can we fix that?
  Given enough time, probably.

- Now also does limit checking for sprintf() and vsprintf().

- Now does a WaitBlit() before starting to use the CPU
  with the icon mask contents that were just cleared
  using BltClear().

- The volume fill gauge display returns after ten years of
  absence. The gauge display follows the design of
  Jean-Michel Forgeas' "WBGauge" program.

workbench.library 44.165 (22.3.1999)

- AppIcons are now remapped during Workbench screen open/reopen
  transitions like any other regular palette mapped icons.

- Workbench now calls icon.library to find out how large the
  icon is the user may have clicked on.

- For all other operations that need to know how large an
  icon is, Workbench now talks to icon.library, too.

workbench.library 44.196 (24.3.1999)

- AppAppIconA() takes a parameter in A4, which is not such a
  good idea with the current SAS/C code generator. What exactly
  goes wrong is hard to tell, the result, however, is that register
  A6 gets cleared on the way, which has disastrous results. So for
  now we use the old stack based parameter passing for this routine
  and a small assembly language stub to pass the parameters around.

- The gauge display now resorts to showing a disk as completely
  full if the number of blocks that define the size of that disk
  is smaller than one.

- The "view by name/date/size" mode now prints file names using
  graphics.library/Text rather than the usual bunch of wacko
  Blt operations.

- For "view by name/date/size" mode, the icon image that gets
  created is now set up in such a way as to allow for fonts
  with negative kerning to be used without overwriting
  innocent memory.

- When finding the widest column in "view by name/date/size" mode,
  fonts with negative kerning are now taken into account.

- The marquee no longer leaves pixel droppings behind.

- In "view by name/date/size" mode, directory entries no longer
  change size, colour or shape when dragging them around.

- Workbench no longer creates or maintains its own icon
  image masks.

- The fill gauge now looks a bit better in 2 colour mode.

- The marquee no longer draws its complement pattern into
  all screen bitplanes. Drawing is now limited to the first
  two planes only.

workbench.library 44.208 (24.3.1999)

- Implemented notification for open drawers. It works like
  this: only drawers in "show all files" mode are monitored
  and drawer updates are done only if the last update was
  at least four seconds ago.

orkbench.library 44.216 (25.3.1999)

- Now uses IsFileSystem() to identify filing system devices as such.

- Retired the use of PutIcon(); PutIconTagList() is now used in
  its place.

- No longer sets up the DiskObject data structure header, version
  and identification data. This job is left to icon.library.

- Now does a LockDosList(LDF_DEVICES|LDF_VOLUMES|LDF_READ)
  instead of LockDosList(LDF_ALL|LDF_READ). The code never
  bothered with assignments anyway.

workbench.library 44.222 (27.3.1999)

- Now uses the proper way to obtain icons for drawer and files
  that don't have any. This finally makes the file identification
  hook in icon.library work.

- Previously, the "Execute Command" requester would open for all
  "fake" icons displayed in "Show All Files" mode. Now we do that
  only if the fake icon is a tool icon (can't be too careful)
  or a project icon without a default tool. In all other cases the
  fake icon goes straight into the regular Workbench launch
  procedure.

workbench.library 44.242 (27.3.1999)

- All windows now support live scrolling.

workbench.library 44.256 (28.3.1999)

- Moving and removing icons now doesn't visually refresh
  everything everywhere any more. The refresh still takes place,
  but is limited to the bits that need updating. This is most
  apparent when moving icons: they get updated one by one.
  This is because the overall refresh algorithm is still of the
  brute force type. Lots of room for improvement here.

workbench.library 44.279 (28.3.1999)

- Redid the menu localization, layout and setup code. This
  will make it much easier for us to make changes to the
  menus.

- AppMenuItems with a label text consisting entirely of the
  '-', '~' or '_' characters are now translated into proper
  menu bar labels.

workbench.library 44.299 (30.3.1999)

- "Execute command" now has the currently active drawer window
  as its current directory. If the active drawer window is the
  root window (also known as "backdrop" or "disk" window),
  then the current directory defaults to "RAM:".

- When creating a new drawer, the Workbench now names it according
  to the current locale settings rather than using the default
  built-in "Unnamed" string. Trouble is, this string is in the
  Workbench catalog database, but none of the existing catalog
  translations contains a localized version of it.

  Drawer names no longer start with "Unnamed1", but with
  "Unnamed". If that one exists, the next name will be "Unnamed1",
  etc.

- The logic that determines what actions are available for an icon
  no longer just keys off the fact that there is an icon selected
  but also takes the icon type and state into account.

- AppIcons can now respond to all actions defined in the "Icons"
  menu. You just have to tell AddAppIconA() which ones you support
  and you'll receive an AppMessage with the am_Class type set to
  the type of menu action invoked.

- Multiple "Information" windows now get tiled instead of opening
  all in the same spot.

- To keep SYS:WBStartup from getting scanned and processed, hold
  down any [Shift] key when LoadWB is invoked. LoadWB now also
  supports a switch to this effect ("loadwb skip").

- Snapshotting a fake icon now turns it into a real icon.

- Updating a drawer no longer resets the drawer origin position.

workbench.library 44.325 (31.3.1999)

- Added three new API functions OpenWorkbenchObjectA(),
  CloseWorkbenchObjectA() and WorkbenchControlA().

- Added a new tag to AddAppIconA() to allow the icon position
  to be backpropagated to the icon originally associated
  with the AppIcon.

- Added a hook to allow the creator of an AppIcon to render
  the icon under program control. This works together with
  a tag in WorkbenchControlA() that triggers an AppIcon
  refresh.

- Adding AppMenus now takes the maximum number of items
  in a menu into account and does not allow more than 62
  items to be added.

workbench.library 44.332 (31.3.1999)

- Removed some further unused variables in WBObjects.

workbench.library 44.388 (2.4.1999)

- The volume size calculation code now handles volume sizes
  larger than 4 GBytes properly. The calculation should be
  accurate for up to 2 PBytes (which is -- hopefully -- sufficient
  for the next ten years). Note: must put the same code
  into asl.library.

- All Workbench windows now close under keyboard control
  if ^\ is hit (which also closes Shell windows).

- New "Information..." code up and running.

- Added the new progress gauge code.

workbench.library 44.428 (3.4.1999)

- Rewrote the code for "Delete..." and "Empty Trash". Both now
  sport progress requesters.

- "Delete..." now uses a more refined confirmation requester.

- Redid the "New Drawer" requester; instead of creating a drawer
  and then prompting you to rename it, it now prompts you to
  enter the name of the drawer to create.

- Redid the "Execute Command" requester and all the code that
  depends upon it. The "Ok" button now reflects the action to
  perform and no longer just reads "Ok".

- The default name for an unnamed drawer is now "Rename_Me".

workbench.library 44.507 (4.4.1999)

- Fixed the usual bunch of bugs in the "Delete..." and "Empty Trash"
  code.

- Fixed a numeric conversion bug in the code that rounds media
  storage sizes.

- Retired Mike Sinz' asynchronous file copy code. While it was
  faster and probably more elegant than the code I have replaced
  it with, making it work with the process gauge would have been
  too difficult.

- AppIcon owners can now receive notification messages every time
  the icon select state changes.

- Fixed a real nasty lockup bug introduced when I added the
  ^\ window close code in the wrong place in incoming.c.

- In "view by text/size/date" mode, the file size is now printed
  using the default locale number formatting code %lD. The file name
  information string setup is also a bit more refined now.

- Now uses the locale default date format to present time and
  date stamps.

- Switched over the "view by text/size/date" sort code to use
  TreeLists, like in the updated asl.library. This yields a major
  speed increase, but due to how "Show All Files" mode works,
  it may not be obvious. In any case, the list update speed will
  increase logarithmically with size rather than exponentially.

workbench.library 44.512 (4.4.1999)

- ^\ didn't work that well in the root window. Fixed.

- The date conversion now substitutes dates by week days, if
  possible.

- The file copy code now uses asynchronous packet I/O.

- Stopping a copy process now keeps whatever was copied.
  This is probably a controversial item; on one hand, the
  "Stop" command implies an immediate action: once the
  brakes are pulled, you want the process to be stopped and
  no further actions to be taken, such as any incomplete
  files getting cleaned up. On the other hand, you probably
  don't want corrupt, incomplete data to be kept. This issue
  should be resolved predictably, i.e. it should not be made
  into a configurable option.

workbench.library 44.577 (5.4.1999)

- The "Wait until finished" switch was wired the wrong way
  round in the "Information..." requester. Fixed.

- In the "Information..." requester the protection bits now
  sit in a group labeled "Attributes:".

- The "Information..." window for volumes now sports
  two action buttons like the regular Save/Cancel pair,
  but in this pair the "Save" button label reads "Ok" and
  does the same as the "Cancel" button (because the information
  displayed is read-only). While this doesn't make great sense
  in terms of usefulness, it provides for visual consistency.

- The progress gauge now has a trigger action delay of one
  second; if the process the gauge monitors takes less than
  a second to complete, you won't see the gauge appear.

- Added keyboard control to all requesters (both info
  and execute/rename/etc.).

- The file copy code now dynamically adjusts the size of
  the buffer used for moving data around to the actual
  speed of the copying process. Thus, for faster devices
  larger writes will be done, for slower devices smaller
  writes will be used. This adjustment is done both to
  increase performance and to improve responsiveness: since
  the progress gauge is polled we don't want to check it
  in intervals much larger than one second.

- Hold down the [Ctrl] key and click on a drawer window close
  gadget to close all drawer windows.

- Hold down the [Ctrl] key and double-click on an icon to
  open that icon and close the drawer window it is in; note
  that if the icon won't open, the drawer window will still
  close!

- Hold down the [Ctrl] key and drag an icon into a drawer
  on the same volume to have it copied instead of moved.

- Hold down the [Ctrl] key and click on an info window close
  gadget to close all info windows.

- Workbench now no longer allows more than one info window
  per object.

- Press [Tab] to cycle through all currently open info
  windows.

- Press [Tab] to cycle through all currently open drawer
  windows.

- Workbench now requires that for a double-click on an icon
  to be accepted, the second click has to be on the same icon
  as the first click.

- Changed the way extended selection works:

  * To select an icon, click on it.

  * To select another icon, hold down any [Shift] key
    and click on it.

  * To unselect an icon, hold down any [Shift] key and
    click on it.

  * To unselect all icons, DON'T hold down a [Shift],
    [Alt] or [Ctrl] key and then click outside an icon.

  * To drag icons around, click on them and move the mouse.
    You don't need to hold down any [Shift] key.

- Changed the way drag selection works:

  * To unselect all icons inside the rectangle, hold down
    the [Ctrl] key when you let go of the mouse button.

  * To toggle the selection of all icons inside the rectangle,
    hold down any [Alt] key when you let go of the mouse button.

- AppMenus can now have keyboard shortcuts, provided the respective
  shortcut is not already in use by a different menu item/subitem.

- Disk types are now localized and (hopefully!) less cryptic than
  they used to be. The mapping goes like this:

      BUSY -> Busy
      NDOS -> Uninitialized
      BAD  -> Unreadable
      KICK -> Kickstart

  Other IDs are translated into a human-readable string, converting
  unprintable characters into octal numbers if necessary (well,
  maybe that's not really human-readable after all).

- Disabled the file notification code.

- Workbench now makes a difference between Kickstart disks and
  unreadable disks. Kickstart disks can be copied and formatted,
  unreadable disks can only be formatted. The default for a non-AmigaDOS,
  non-Kickstart icon is now a WBDEVICE icon.

- If Workbench fails to find the default tool of a project, it now
  prompts you to select a different one.

- The output and execute windows are now opened in such a way as to avoid
  overlapping the Workbench root window drag bar.

- The default Workbench output window size and position now takes the
  console font size into account.

workbench.library 44.586 (5.4.1999)

- The info window now is an AppWindow; the only purpose this has is to
  allow you to easily change the default tool of a project by dropping
  a program icon into the default tool string gadget.

- Added an API option to query the list of currently running
  Workbench programs.

workbench.library 44.629 (6.4.1999)

- Default WAIT time for icons in the WBStartup drawer is five seconds;
  the info window didn't handle this correctly. Fixed.

- Dropping a disk icon into a drawer now copies the contents of that
  disk into a newly created drawer of the same name.

- Doubled the info process stack size.

- The progress gauge now accurately reflects the progress of the
  copy/delete action currently in, well, progress. In some cases
  this involves scanning the contents of directories before any
  further action takes place, wasting some time. This is most
  apparent when operations are taking place on a slow filing
  system device, like a floppy disk drive. In other cases, the
  effect hardly has any impact.

- The task creation code used for the gauge would assign
  data structures to unaligned addresses. Fixed.

workbench.library 44.642 (7.4.1999)

- In an attempt to improve tolerance for soft links, I switched
  over all FileInfoBlock->fib_DirEntryType comparisons to use
  Ralph Babel's recommended macros.

- Revived the textedit clipboard support code I had commented
  out. This means, Amiga+C/Amiga+V now works again in the
  tool type editing field.

- Just like icon.library, the info window now tolerates tool
  type strings with blank spaces surrounding the "=" character.

- All icon height calculations now go through icon.library,
  I removed the last few references that would work by adding
  the font height manually.

- You could edit the default tool of a project file without
  an icon. Fixed.

- You couldn't edit the default tool of a project icon
  without a file. Fixed.

workbench.library 44.649 (8.4.1999)

- Changed the qualifiers for the drag select operation.
  Now [Shift] will toggle selection and [Alt] will
  remove. This comes close to how qualifiers affect
  clicks on icons.

- Workbench now copies icons without corresponding
  files/drawers again.

- Dropping a disk icon on a drawer now copies the contents
  of the disk into a newly created drawer inside the drawer
  dropped on, rather than creating a new drawer on the same
  level.

workbench.library 44.672 (11.4.1999)

- Window pattern rendering now takes the window border sizes into
  account.

- Hold down any [Alt] key and click on an icon to unselect it.
  This complements the drag select functionality.

- Now uses GetBitMapAttr() to query the screen depth and no
  longer uses more than 8 bit planes, whatever there may come.

- When over a window it can be dropped on, the icon being dragged
  now turns transparent.

- The "Empty Trash" and "Delete" functions now sport a new
  requester for those rare cases in which deletion goes wrong.
  That requester allows you to delete delete-protected files
  or to ignore delete errors altogether.

- The info window now updates volume information in regular
  intervals.

- The "Rename" code now sends an ACTION_RENAME_OBJECT packet
  rather than fiddling with temporary assignments.

- Renamed the "ROMWack" menu item; it now reads "SAD".

- Added a missing SetSignal() to the WBConfig LVO code.

workbench.library 44.686 (12.4.1999)

- The WBConfig code now waits for Workbench to accept the
  new configuration data instead of jamming it into place
  and then notifying Workbench that something has changed.
  This avoids uncoupled window pattern refresh problems.

- Added AmigaGuide support; hit the [Help] key and get the
  help text displayed. The current code does not yet provide
  a key as to what item the user needs help on. This should
  follow soon, though.

- Added new AddAppWindowDropZoneA() and RemoveAppWindowDropZone()
  API functions.

workbench.library 44.709 (13.4.1999)

- The code that checks whether an icon to be rendered will be
  visible is now quite a bit smarter and takes the label width
  into account.

- Fake icons always got turned into real icons, even while moving
  and copying. Fixed.

- The AmigaGuide help code now assigns a unique ID to every location
  a help text should be available for. A sample workbench.guide
  file is provided.

workbench.library 44.732 (14.4.1999)

- The window backfill pattern origin is no longer a function of
  the window position.

- [Alt] and [Shift] qualifiers work again in the text edit
  gadget used by the info window.

- The [Help] key now also works in requesters.

- When copying drawer A into drawer B that already has a drawer
  in it by the name of A, the contents are now stored in drawer
  B/A rather than in drawer B.

- During deletion, while a requester is up, the progress gauge
  is kept from making is appearance until after the requester
  has been answered.

- When filtering tool types, the info window code now calls
  icon.library/FindToolType rather than parsing the tool type
  list all on its own.

- Workbench now queries icon.library for the longest file name
  permitted. This removes a number of hard coded limits in the
  original code.

- The delete requester now sports a Retry button and only
  brings up the "Force Delete" option if the reason for
  the deletion failure was a delete protected file.

- Added keyboard shortcuts to "Show All Files/Only Icons"
  and "View by Icon/Name/Date/Size".

workbench.library 44.741 (15.4.1999)

- The "Replace All" and "Skip All" options now really affect all
  files involved and not just the drawer contents.

- During copying, while a requester is up, the progress gauge
  is kept from making is appearance until after the requester
  has been answered.

- The "Open Parent" menu item now also responds to the [Ctrl]
  key qualifier in that it closes the current drawer window
  after opening the parent drawer. Note that if the parent
  drawer does not open, the current drawer will still close!

- Redefined the use of the qualifier keys:

  * [Shift] will add icons to the selected list; this works
    both by clicking on icons and by using the marquee. It
    also works with the "Select Contents" menu item.

  * [Alt] will remove icons from the selected list; this
    works both by clicking on icons and by using the
    marquee.

  * [Ctrl] will toggle selection of icons; this works both
    by clicking on icons and by using the marquee.

  * [Right Amiga] will perform special functions, such as
    closing all windows when clicking on a window close
    gadget, copying files when held down while dropping
    icons, closing the parent drawer window of an icon
    double-clicked on and closing a drawer whose parent
    was just opened.

  Other purposes:

  * [Shift] will cause the WBStartup drawer not to be scanned
    when Workbench is launched.

  * [Shift]+[Tab] will cycle backwards through a list of
    windows/gadgets ([Tab] will cycle forwards).

  * Either [Shift] or [Tab] will exit from a string gadget
    without terminating input (such as in the Execute/Rename/New
    Drawer requester).

workbench.library 44.788 (18.4.1999)

- The [Right Amiga] qualifier now a has purpose while dragging icons.
  If held down, icon movement will be limited to the axis
  corresponding to the direction the mouse was moved. This is similar
  to how brush dragging works in Deluxe Paint (and Personal Paint,
  which uses the same model).

- "Put Away" now also "UnSnapshots" the icon in question.

- Changing the Workbench font no longer shuffles the contents
  of all drawers. I believe that this decision should be left to
  the user.

- Added new "Clean Up" options; you can now clean up the contents of
  your window by column (the old default), by name, by date, by size
  and by type. The latter four arrange the icons in rows instead of
  in columns.

workbench.library 44.797 (18.4.1999)

- "Clean Up By ..." did not work that well with drawers that only
  had a single row of icons in them. Fixed.

- Added new "Resize To Fit" menu item.

workbench.library 44.814 (19.4.1999)

- The fill gauge now refreshes completely, not just the currently
  active segment.

- Switched over to 68k code with utility.library math routines. Note
  that due to how the utility math code works, workbench.library
  is no longer romable.

- When stopping a copy process, the last incomplete file being copied
  now gets removed.

workbench.library 44.817 (20.4.1999)

- In the code that cleans up after icons have been dragged across the
  screen, replaced the RemIBob() call with a RemBob() macro invocation.
  This should be functionally identical (after all, all bobs are removed,
  not just a single one), but should involve less overhead and be actually
  The Right Thing (tm) to do.

- When dragging an icon into the backdrop window, Workbench now tries
  to put it where the user dropped it. It may still be repositioned if
  in danger of running off the end of the screen, but otherwise the code
  will try to use the position the user had in mind.

workbench.library 44.819 (21.4.1999)

- Doing a "Snapshot" or an "UnSnapshot" on an icon now only updates
  the icon position and nothing else. If the icon in question has
  a drawer window attached, it will still be stored completely.

workbench.library 44.837 (24.4.1999)

- Text insertion in the info window's tool type text entry field
  now properly updates the display even if new lines are added
  to the list.

- Snapshotting a fake icon is no longer permitted.

- Added a new tag to allow an icon drop zone to be highlighted
  when an icon is to be dropped on it.

workbench.library 44.846 (27.4.1999)

- Icons no longer overlap in the root window. This was changed and
  then changed back to allow the user to put icons into the root
  window without having their positions automatically readjusted.

- Clean up by name/date/size/type now also moves the icons a bit
  away from the window borders, just like the clean up by columns
  operation does.

- When switching between transparent/opaque mode for the active
  icon, the code now calls RemIBob(), changes the mask, then
  calls AddBob() again.

- Clean up by date/size/type now has a fall-back for objects that
  share the same date/size/type: they will get sorted by name.

workbench.library 44.856 (29.4.1999)

- Found the cause of the erratic system crashes that could occur
  after starting a program. One newly added node was getting added
  to the same list twice, wrecking both the list it was added to
  and causing even more trouble later on, when the node was to be
  removed again.

workbench.library 44.865 (1.5.1999)

- Copying a drawer which doesn't have an icon into a different
  drawer in "Show All Files" mode now also makes the copied
  drawer visible.

- Implemented support for a new option intended to keep old
  RTG systems from crashing. Since this option will disable
  new functionality (namely the AppWindow drop zones), it
  should be used only when necessary. Specifically, the
  "simple gels" mode makes Workbench do exactly one initial
  AddBob() call for all icons and exactly one RemIBob() call
  for each icon. This does not work perfectly, though. But it
  allows the user to double-click on an icon without bringing
  the system down. Consequence: update that old RTG system!

- Added a new API function to get a list of all currently
  selected icons.

workbench.library 44.875 (3.5.1999)

- I believe I've found a way to allow OpenWorkbenchObject()
  to open only the drawer specified and none of its parents.
  The approach is rather strange and hackish, but it might
  just work.

workbench.library 44.882 (4.5.1999)

- Fixed a memory alignment error in the copy code.

- The copy code would use far too much memory. Fixed.

- The progress gauge now refreshes properly.

- Added a new API function to get a list of all currently
  open drawers.

workbench.library 44.893 (6.5.1999)

- Changing the font preferences now also updates all icon
  labels (they get reprinted).

- Duplicating a file/drawer via the "Copy" menu item
  now works again. This also fixes a bug in the code that
  sets the drawer attributes after a successful copy.

- Copying and moving files and drawers can no longer leave
  icon duplicates in drawer windows.

workbench.library 44.899 (15.5.1999)

- In the info window, keyboard activation for checkboxes did not
  update the internal data structures properly. Fixed.

- The "Delete", "Empty Trash" and copying code now uses the
  gauge title bar to display which drawer/file they are
  currently working on.

- Limited the maximum amount of memory allocated for
  copying files to 32K. This should help certain "unreliable"
  SCSI hosts. The amount of memory to be used is configurable
  through WorkbenchControl() with private, undocumented tags.

workbench.library 44.901 (30.5.1999)

- Certain combinations of keyboard qualifiers no longer trigger
  special functionality. For example, an [Alt] key is registered
  only if none of the [Amiga] keys is currently being held down.
  This avoids clashes with operating system key combinations.

- Rewrote the code that rounds volume sizes.

workbench.library 44.909 (8.6.1999)

- Changed over all temporary memory allocations of FileInfoBlock
  data structures to allocate them from the stack.

- Added new control tags to define which devices Workbench should
  never show an icon for. This allows you to hide things like
  A-Max partitions or partitions you never ever access from
  Workbench.

- Verified that the few variables in WorkbenchBase that need to
  be aligned to a long word address are in fact properly aligned.

workbench.library 44.913 (12.6.1999)

- Added another WorkbenchControl() option to tell Workbench to
  tell icon.library to let go of its icon colours. This is
  used by IPrefs right before the screen palette is changed
  (after the palette.prefs file was modified).

workbench.library 44.932 (19.6.1999)

- The progress gauge display now sticks to the position the
  user dragged it to.

- The cursor keys can now be used to move around in a window.
  Hold down the [Ctrl] key to move in steps of one pixel.
  I also changed the behaviour of the [Shift] keys with the
  window scroller arrows: [Shift] now does nothing. To get
  the desired effect, hold down the [Ctrl] key. This was
  changed to be consistent with the cursor scrolling mode.

- Hold down any [Alt] key and select the "Select All" menu
  to unselect all icons.

- Regular keyboard input now selects icons and makes
  them visible. The first few characters will be sufficient
  to identify a file or drawer. To start over with a new
  file name, wait three seconds.

workbench.library 44.941 (20.6.1999)

- When selecting icons by keyboard, the menu would not get
  updated correctly (some items would stay ghosted). Fixed.

- The code that makes a selected icon visible is a tad
  smarter now. It no longer scrolls farther than it really
  needs to.

- The info window had a problem due to a missing "break;"
  line in the control centre. The "Wait" string gadget
  would cause the "Save" button to be triggered. Fixed.

workbench.library 44.942 (20.6.1999)

- The typing restart delay (formerly three seconds) is now
  a configurable option.

workbench.library 44.947 (21.6.1999)

- Selected AppIcons no longer show up in Workbench startup
  messages or AppMessages sent to AppWindows. Workbench
  originally put them into the same list as regular selected
  icons, but only included the AppIcon label and a NULL
  home directory pointer. Together, neither was particularly
  useful. The new code specifically avoids putting such
  useless drivel into the WBArg lists.

- Added new API functions to change the icon selection
  state and to make icons visible.

workbench.library 44.951 (22.6.1999)

- Updated and revised the autodocs.

workbench.library 44.952 (23.6.1999)

- The ChangeWorkbenchSelectionA() callback hook message
  now provides a little more information on the icon
  to be examined.

workbench.library 44.954 (23.6.1999)

- The ChangeWorkbenchSelectionA() code now sports an
  option to abort scanning altogether.

workbench.library 44.964 (15.7.1999)

- Holding down [Ctrl] or [Alt] when clicking on a selected
  icon no longer starts icon dragging. This could throw
  Enforcer hits if there was no icon left to be dragged.

- Duplicating drawers and files now shows a proper progress
  requester.

- In "Show all files" mode, memory allocation failures are now
  properly registered.

- In "Show all files" mode, Workbench no longer tries to keep
  the bookkeeping lists for files with and without icons sorted
  in alphabetical order. Apparently, nothing relied upon the
  files to be kept in this order.

- When finding new positions for yet unplaced icons, Workbench
  no longer attempts to keep the list of unplaced icons in
  alphabetical order. Apparently, nothing relied upon the
  icons to be kept in this order.

- Added another few private tags to control the type of memory
  image data is allocated from.

- All requesters now have keyboard shortcuts for all gadgets.

- Scrolling the tool types list no longer "blanks" the
  cursor if the cursor isn't currently visible.

workbench.library 44.966 (20.7.1999)

- To skip the WBStartup drawer being scanned at system startup
  time, hold down any [Alt] key.

- The [Help] key now triggers the online help only and only
  if none of the [Shift], [Alt], [Amiga] or [Ctrl] keys are
  being held.

- The Information window no longer has problems refreshing
  after the volume data has been updated once.

workbench.library 44.970

- No longer calls OpenDevice() with numeric name parameters.

- The information requester no longer filters special tool
  types that only make sense if the icon in question is located
  in the SYS:WBStartup drawer. Thus, you'll see tool types
  like DONOTWAIT appear in the list if an icon is found in a
  different drawer.

- When running the Workbench root window in backdrop mode,
  dragging icons off-screen no longer redraws them in the
  wrong location before pushing them back into the visible
  window area.

workbench.library 44.974 (27.7.1999)

- The "Snapshot icon" menu item now also "works" if there
  are fake icons selected.

- To leave the multi-line text input gadget used by the
  information window, hit [Shift]+[Return]; [Alt]+[Return]
  and [Ctrl]+[Return] will do the same.

- The information window no longer strips all tool types
  it handles internally. This allows for more than one
  special tool type to show up in the list (e.g. more than
  one "DONOTWAIT" tool type). When presenting the tool
  types list, only the first of each special type will
  be evaluated and hidden. The rest will remain untouched.

workbench.library 44.975 (31.7.1999)

- Keyboard scrolling no longer works in borderless windows.

workbench.library 44.976 (4.8.1999)

- Following a failed attempt to invoke a menu item by keyboard
  for which there isn't a keyboard shortcut, the resulting input
  event will no longer trigger icon selection.

workbench.library 44.1006 (7.8.1999)

- The drop zone management code now verifies that the AppWindow
  data structures passed to it were really allocated by workbench.library
  and not by replacement code, such as DirOpus.

- Redrawing an AppIcon now also requires its data structures to be
  created and maintained by workbench.library (and not by a patch like
  DirOpus).

- WorkbenchControl() now works (with a limited subset of control tags)
  even if the Workbench hasn't been opened yet.

- To change an icon's image, open the information requester on that icon
  and drop the new icon on the old icon's image, then save the old icon
  back to disk [Deryk Robosson].

- Added options to reenable the drawer notification code.

- Selecting an item from the "Icons" menu on an AppIcon now properly
  sets up the am_Class member of the AppMessage sent to its owner.

- The "Information..." window button "Ok", as displayed for a volume
  icon, now changes to "Save" once an icon has been dropped on the
  icon image.

- In the "Information..." window, the wait time gadget gets disabled
  if the "wait until finished" option is currently disabled.

- The hidden device list is now controlled both with internal and
  public tags. This helps IPrefs to tell those entries apart which
  it should and which it should not replace. The internal tags also
  have the effect of delaying a complete refresh of the root window
  until the list has been updated completely.

- icon.library now notifies workbench.library if the size of the
  icon embossing rectangle changes.

- Added another private tag to trigger a complete display update.

workbench.library 44.1007 (8.8.1999)

- The icon border sizes are now set up in the library init code
  rather than much later during library open. This solves a problem
  with the new code in icon.library that deals with the icon border
  sizes and which otherwise could have thrown the sizes out of
  sync.

workbench.library 44.1023 (8.8.1999)

- After inserting a disk and after Workbench has failed to find a
  valid "Disk.info" file in its root directory, Workbench now
  makes an attempt to find the "default icon" for the drive the
  disk was inserted into. This means for example, that if there is
  no file "CD0:Disk.info", Workbench will attempt to read a default
  "def_CD0.info" from ENV:sys. The same holds true for devices
  from which Workbench cannot read an icon file since they are
  not ready for reading, such as a drive DF0: that is currently
  in the process of formatting a disk.

  NOTE: the default icons must be of type WBDISK or they
        will not load!

- Changed the way disk icons are drawn which Workbench cannot
  open, such as Kickstart disks. Workbench now draws them as
  "disabled" by means of the icon.library code responsible for
  drawing the icons.

workbench.library 44.1033 (9.8.1999)

- A Workbench reset could cause the workbench.library and icon.library
  to end in a deadly embrace. Fixed.

- Cleaned up WorkbenchBase and removed a few more unused variables.

workbench.library 44.1044 (11.8.1999)

- The volume fill gauge now features tick marks, dividing the gauge
  into ten segments.

workbench.library 44.1051 (14.8.1999)

- When writing back an icon, the Information... requester code no longer
  adds the DONOTWAIT/STARTPRI/WAIT tool types unless it removed them in
  the first place.

- Dumped all the CurrentDir(currentDir = CurrentDir(ZERO)) tricks and
  switched them over to plain Lock("",SHARED_LOCK) calls.

- Error message display code no longer attempts to display a message
  for error code #0 (= no error).

- Fixed an Enforcer hit in the Information... window code.

- The Information... window is no longer opened quite that wide any
  more. Adjustments are still made if necessary, though.

- No longer displays the "Do not wait", etc. gadgets for drawers
  residing in the SYS:WBStartup drawer.

- Made the disk fill gauge tick marks quite a bit smaller.

workbench.library 44.1053 (15.8.1999)

- Changed the look of the disk fill gauge tick marks again.

workbench.library 44.1054 (17.8.1999)

- Cleaning up the window contents by name/size/date no longer
  mucks with the window origin.

workbench.library 44.1066 (17.8.1999)

- Removed an unnecessary window refresh right after a drawer
  is opened.

- Layer offset adjustments in window backfill hook code were
  unnecessary and could introduce errors with off-screen
  clipping rectangles. Fixed.

- No longer sends MTYPE_APPWINDOW type messages if an icon
  is dropped on an AppWindow that has drop zones attached
  and the icon was dropped on none of the zones.

workbench.library 44.1068 (22.8.1999)

- The "Can't open your tool ..." requester now has a window
  title (never had one to start with).

- In the Information... window disabled gadgets can no longer
  be activated by keyboard.

- Now also checks for project icons (without associated files)
  whether they reside in the SYS:WBStartup drawer and acts
  accordingly.

workbench.library 44.1106 (24.8.1999)

- The AddAppIcon() call now uses the new ICONDUPA_ActivateImageData
  tag to activate the palette mapped icon image data in the
  icon image that finally hits the screen as the AppIcon. This
  will magically work around the problem caused by older applications
  which use GetDiskObject() to retrieve icons and use them as AppIcons.
  In older workbench.library revisions those icons wouldn't appear
  as palette mapped icons at all.

- Added another gimmick to the Information... window. For drawer or
  volume, click the size display to start collecting information on
  drawer's contents. The scanning process will recursively search
  through the directory contents tree, collecting the number of
  drawers, files, bytes and blocks allocated for it.

- Added the ARexx interface.

workbench.library 44.1123 (25.8.1999)

- Trashcan icons can no longer be duplicated (since they can't be
  deleted either...).

- Copying files without icons can no longer end in a file system
  crash. The old Workbench code was trashing the Workbench Process
  current directory pointer without restoring it. I found the one
  that caused the crash, but there may be others :(

- No longer allows data to be copied to the trashcan. It doesn't
  complain if the attempt is made but it won't create the files
  in it. The only action supported now is to move data into the
  trashcan.

- Now updates the contents of the trashcan window after the
  trashcan has been emptied.

- Replacing a file that has an icon attached with a file which
  has no icon attached now preserves the original icon's file
  instead of deleting it, too.

workbench.library 44.1145 (30.8.1999)

- ARexx didn't clean up after the dos.library/ReadArgs parser. Fixed.

- The ARexx "WINDOW" command couldn't resize the window to the maximum
  position (due to negative integers in the relevant window data
  structures). Fixed.

- Added new ARexx command "INFO".

- Changed the way the GETATTR command puts its query strings and
  results together. While this allows for more flexibility it also
  means that some of the existing ARexx scripts will need to be
  rewritten since the names of the stem variables filled in have
  changed.

- Enhanced the GETATTR and ICON commands.

- Added new ARexx commands "UNZOOMWINDOW" and "ZOOMWINDOW".

workbench.library 44.1147 (31.8.1999)

- The info window now only is an AppWindow or will get all the
  drop zones added if the functionality behind it makes sense.
  For example, some of the options won't be enabled if the
  icon in question is a "fake" icon.

workbench.library 44.1167 (2.9.1999)

- Changed the way drawer windows are "locked", i.e. how the
  menu strip and the mouse pointer are changed when one of
  these windows is made "busy". This also affects input
  event processing.

- Added new ARexx commands "LOCKGUI" and "UNLOCKGUI".

- The ARexx command parser didn't handle commands properly
  which were given without arguments.

- Window maximum width and height as returned by the ARexx
  interface are now clipped to the size of the parent screen.

- When duplicating a file which has a fake icon attached,
  the duplicate's attributes will now get set prior to its
  fake icon getting reread. That way duplicates of project
  icons will come out properly.

- Added new ARexx commands "DELETE", "FAULT", "NEWDRAWER" and
  "RENAME".

- Found another case of stale locks left behind by an errant
  CurrentDir() call...

- After loading a Disk.info file which turned out to be not the
  type of icon expected, Workbench will no longer attempt to
  free memory twice.

workbench.library 44.1179 (4.9.1999)

- The disk fill gauge should be more robust now and less sensitive
  to numerical overflow.

- The progress gauge wouldn't handle keyboard input properly. Fixed.

- The info window no longer saves one extra blank line along
  with the tool types list.

- The "Unsnapshot" menu item is now enabled even for fake icons.

- The info window now allows a "real" icon to replace a "fake"
  icon.

- Added new GETATTR attributes (icon border sizes and fonts).

workbench.library 44.1199 (5.9.1999)

- Changed the way the [Tab] and cursor keys can be used to move
  around the icons and windows:

  [Tab]

      Move to the next icon, with the next icon being the one
      that would follow the currently selected icon in a list
      sorted by name. If the currently selected icon is the
      last in the list, restart at the top of the list. If no
      icon is currently selected, select the first visible
      icon closest to the top left corner of the window.

  [Shift]+[Tab]

      Works just like [Tab], but will select the previous icon.

  [Cursor up], [Cursor down], [Cursor left], [Cursor right]

      If no icon is currently selected, moves the window view
      in the direction indicated by the cursor key. If an icon
      is selected, will select the icon closest to it in the
      direction indicated by the cursor key.

  [Alt]+[Cursor up]

      Opens and/or activates the window associated with the
      current directory's parent directory.

  [Alt]+[Cursor down]

      If a drawer-like icon is currently selected (drawer, disk,
      trashcan), will open the drawer and/or make its window the
      active one.

  [Alt]+[Cursor left] and [Alt]+[Cursor right]

      Cycle through all currently open drawer windows.

  NOTE: The [Tab] key functionality will, due to how Workbench
        maintains its icon list, need to resort the icon list.
        This may take a while to complete, so please don't
        expect near-real-time performance.

- The ChangeWorkbenchSelectionA() routine can now be used to
  manipulate the positions of the icons it handles.

workbench.library 44.1226 (7.9.1999)

- Added new attributes for the GETATTR command (icon status).

- Workbench now attempts to resolve soft linked objects,
  querying the linked object's type, protection bits and size.
  While this does not really yield full soft link support, it's
  better than nothing at all.

- The copy process no longer attempts to copy soft links.

- Deleting the contents of a drawer will no longer descend into
  hard linked directories. The links are deleted instead.

- In the ARexx interface, renamed the "MENU" parameter of the
  "MENU" command to "INVOKE".

- AddAppMenuItem() didn't return NULL if there were already
  63 entries in the tools menu. Now it does.

- Added new ARexx command "KEYBOARD".

- Enhanced the ARexx "MENU" command.

- ARexx command "VIEW RIGHT" now scrolls right instead of
  down.

- Checked and fixed up all CurrentDir() calls. The new code
  should restore the Workbench process' current directory
  whenever necessary instead of changing it and rendering
  it invalid at times. I hope to have finally caught all
  these problems.

workbench.library 44.1248 (9.9.1999)

- The Workbench root window now allows icons to be selected
  by cursor keys even if it's in backdrop mode.

- When selecting icons with the [Tab] key or the cursor keys,
  Workbench will now make sure that only one single icon
  stays selected.

- When moving through a directory hierarchy with the [Alt]+Cursor
  key combinations, Workbench now makes sure that when the new
  drawer has been opened, at least one of the icons inside will be
  selected.

- Workbench is now a little smarter when selecting icons with
  the cursor keys. If Workbench cannot find an icon immediately
  next to the currently active one, as indicated by the cursor
  key pressed, it will start a second search attempt, looking
  for the icon closest to the one currently selected in the
  direction indicated by the cursor key.

- Added a new menu item to unselect all currently selected
  icons in a window.

- The info window now sports a new switch I had forgotten to
  add in the previous versions. That switch allows you to
  specify how a program/project is to be executed: it can
  be started from Workbench (the default), from Shell or
  from ARexx. This feature is really a wrapper for the
  "CLI" keyword Workbench 2.x has always supported. To
  support ARexx execution, too, I have added another one
  of these special tool types called "REXX". The "CLI" and
  "REXX" tool types are mutually exclusive. When a "REXX"
  type tool or project icon is double-clicked, it will bring
  up the familiar "Execute command" requester, placing the
  name of the file in the command line string gadget. Note:
  the CLI type projects are handled differently; their
  default tool is placed on the command line first. With the
  REXX type projects the default tool is ignored, since ARexx
  is more or less their "default" default tool.

- Added new ARexx command "RX", which completes the set. This
  means that the ARexx interface is finally finished, feature-wise.

workbench.library 44.1303 (12.9.1999)

- To cycle through all info windows, hit [Alt]+[Cursor left] or
  [Alt]+[Cursor right].

- [Alt]+[Cursor down] now opens the first selected drawer and
  not the first drawer around.

- The "Put away" menu item now also works on fake icons.

- In the ARexx interface, the GETATTR command will no longer
  throw Enforcer hits when checking the 0th element of an
  empty list.

- The ARexx "RENAME" command no longer insists that it also
  must be able to rename a file's icon.

- "Copy" now duplicates all selected files/drawers.

- "Unsnapshot" no longer stops as soon as it hits a fake
  icon; it now continues without trying to do anything
  to the fake icon.

- Closing a drawer window now has the effect of activating
  its parent drawer window, if that window is currently
  open.

- ARexx window resizing and depth arrangement commands no
  longer operate on backdrop windows.

- The [Alt]+cursor key events no longer cause backdrop
  windows to be depth arranged.

- In "View by text" mode, a trashcan is now reported
  as such.

- When browsing through the icon list displayed in the
  root window with the keyboard, the view no longer
  scrolls.

- When moving through a "View by text" mode drawer by
  keyboard, the view doesn't jump around horizontally
  any more.

- Cleaned up and simplified the code that displays the
  Workbench backdrop patterns.

- One easy way to crash Workbench was to change a file in
  a "View by text" mode drawer. Fixed [Frank Mariak].

workbench.library 44.1311 (13.9.1999)

- Updating a file's icon no longer causes its size to
  be reset to 0 in the "View by text" mode display.

workbench.library 44.1334 (17.9.1999)

- Icon drop zones in AppWindows were registered as being
  one pixel too narrow/small. Fixed.

- The ARexx commands WINDOW and ICON sport new parameters.

- The info window now sports a new switch "Prompt for input:",
  to be used for Shell programs and ARexx scripts. This
  switch corresponds to the new "DONOTPROMPT" tool type which
  will keep Workbench from showing the "Enter command and
  arguments" requester when a Shell program or ARexx script is
  to be executed. If the switch is in effect, Workbench will
  execute the command just as if the user had simply hit "Ok"
  in the requester.

  This new switch has several benefits. For example, you can 
  now write an ARexx script to rebind the keyboard shortcuts and
  menus and drop it into the WBStartup drawer. Workbench will
  quietly execute it (provided, of course, that the RexxMast
  program was started first) instead of prompting for additional
  command arguments which may not be needed in the first place.

- The ARexx interface didn't pass all 16 possible command line
  parameters to its commands (the last one was passed twice).
  Fixed.

- Cleaned up the code that handles keyboard driven icon
  selection and window view movement.

- Fixed an Enforcer hit in the info window keystroke activation
  code.

- Finally took out the workaround that made the cycle gadget
  keystroke activation code in the info window work, thereby
  removing the bug which it masked.

- Fixed a layout bug in the info window, which would cause the
  layout fallback code to fail for taking the sizes of gadgets
  into account that wouldn't go into the window.

- The code to invoke ARexx programs didn't properly clean up
  after itself when running a program without providing for
  an output console.

workbench.library 44.1336 (18.9.1999)

- The window backfill code used when the windows are opened
  now really does "nothing" at all.

workbench.library 44.1338 (20.9.1999)

- When rebuilding the library without internal header files,
  the linker pulled in stub code from amiga.lib, which caused
  Workbench to crash during startup. Ouch.

workbench.library 44.1345 (20.9.1999)

- More fixes for FastIPrefs compatibility in IPrefs V44.

workbench.library 44.1347 (21.9.1999)

- The "Start from:" option as used by the info requester didn't
  get set up properly. Fixed.

workbench.library 44.1349 (23.9.1999)

- Added six more previously unlocalized strings to the catalog
  descriptor.

workbench.library 44.1372 (25.9.1999)

- Workbench trashed one of its two temporary string buffers when
  rereading an icon that had just been written to disk. This was
  most visible with the "Copy" menu command. Fixed.

- The ARexx "RENAME" command could lose memory. Fixed.

- Workbench never acknowledged memory allocation failures when
  renaming a disk or when a new disk was inserted. Fixed.

- The GELs cleanup code left stale pointers in the Workbench icon
  object data structures, leading to illegal memory references
  lateron. Fixed.

workbench.library 44.1377 (26.9.1999)

- The file/drawer copy code lost a FileLock when copying data into
  a drawer that existed both in the source and the destination.

- When replacing a file or drawer, the copy code now restores the
  progress gauge title after deleting the object to be replaced.

- Updated the built-in catalog strings again, "normalized" the
  capitalization of certain words and removed one or another
  anthropomorphism.

workbench.library 44.1396 (26.9.1999)

- Fixed a very, very obscure memory leak in the info requester
  code. That was one of the most cleverly hidden bugs I ever
  had the "pleasure" to find and remove.

workbench.library 44.1401 (27.9.1999)

- The ARexx GETATTR command didn't complain if stem data was
  requested but no stem variable was provided. It should have
  done this, but a typo prevented it. It threw Enforcer
  hits instead...

- [Cursor down] when hit in a drawer window always moved the
  window view by a single pixel. It shouldn't have done that.
  Fixed.

- "Icon" size calculation was wrong in "view by text" mode.
  Fixed. This also solves the problem with the left/right
  cursor keys selecting unexpected icons.

workbench.library 44.1404 (29.9.1999)

- Added more sanity checks to test the active icon being
  dragged in the GELs code.

workbench.library 44.1406 (30.9.1999)

- Workbench crashed when trying to read the default icon for
  a volume which didn't have a device attached, such as is the
  case with NFS volumes mounted through Carsten Heyl's client
  software as shipped with AmiTCP. I changed the strategy for
  finding a corresponding icon for these kinds of volumes.
  Instead of looking for a "sys/def_<device>.info" icon
  file, Workbench now looks for a "sys/def_<volume>.info" icon
  file. Similarly, for devices to be hidden, the test now
  keys off the volume name if no matching device can be found.

workbench.library 44.1413 (30.9.1999)

- When dragging an icon through a drop zone, opaque/transparent
  icon image transitions could fail. Fixed.

workbench.library 44.1414 (4.10.1999)

- Miscellaneous changes.

workbench.library 44.1427 (7.11.1999)

- Holding down the right [Amiga] key whilst dragging an icon
  only limited the direction of movement to a specific axis if
  the mouse was moved downwards or to the right. Fixed.
  [19991106:1]

- When Workbench fails to load a program to be launched from
  the "SYS:WBStartup" drawer, it no longer attempts to start
  it either. [19991106:2]

- Using [Del] and [Backspace] in the tool types editor no longer
  leaves junk at the end of the list. [19991106:3]

- In "view by text" mode, when sorting by date, drawer contents
  are now sorted newest entries first. [19991106:4]

- The AddApp..() routines now verify that the Workbench is in fact
  open before they proceed to do something about windows, icons
  and menu items. [19991106:5]

workbench.library 44.1452 (13.11.1999)

- Closing a drawer could reference the drawer's parent, even if that
  drawer had been closed before. [19991110:1]

- Dragging an AppIcon which knows how to render itself would place
  the drag handle incorrectly. Fixed. [19991110:2]

- The chunk of memory allocated for copying file data can no longer
  end up allocating the largest available block of memory. [19991113:1]

- Simplified the handling of the progress gauge. [19991113:2]

- The file/drawer duplication code triggered by the Workbench "Copy"
  menu failed to update the progress gauge properly. [19991113:3]

- Simplified and clarified the code that used the gauge to
  track its progress, such as the code that deletes data or the
  copying code. [19991113:4]

workbench.library 44.1455 (20.11.1999)

- In the info window, icons with empty tool type lists did not get
  handled properly. [19991114:1]

- Rewrote the volume size calculation code to use 1024 as the base.

workbench.library 44.1479 (30.11.1999)

- Scanning and processing of "SYS:WBStartup" contents no longer
  clashes with OpenWorkbenchObject() start and cleanup operations.
  [19991128:1]/[19991129:1]

- The code didn't properly cache SysBase, leading to a slowdown. Fixed.

- Now allows the icons of volumes to be snapshot which don't have any
  disk icon to start with. [19991129:3]

- When dropping icons on an AppIcon, failing to build the entire list
  of parameters will cause the drop action to be stopped rather than
  executed. [19991129:4]

- The delete/copy/move/etc. progress gauge now finally fills properly.
  An optimization I had put in for the benefit of the file copy code
  caused drawers to be registered twice, which had the effect of
  making the gauge fill up much faster than expected.

- Instead of reallocating memory for every file and drawer to be copied
  Workbench now allocates the memory once when it begins copying, keeps
  using it for every file to be copied and eventually releases it when
  the process has completed. This has a drawback in that the memory
  alignment may not be optimal for every device involved, but then it
  wasn't optimal in the original design either: source and destination
  device may not share the same block size.

- When copying drawers, their icons will no longer change positions
  when the copying process has finished. A typo prevented the correct
  icon position from getting propagated. [19991130:1]

- Except for the few special cases that don't allow for any other
  options (e.g. creating Tasks and Processes) Workbench will no
  longer reference AbsExecBase.

- Workbench didn't properly remove its ARexx port. Fixed.
  [19991130:2]

workbench.library 44.1499 (24.12.1999)

- "Snapshot All" no longer triggers AppIcons. [19991205:1]

- Adding a nameless AppIcon, i.e. with a NULL name pointer, no longer
  throws Enforcer hits. Workbench will quietly convert the NULL pointer
  into a pointer to an empty string. [19991224:1]

- Workbench no longer caches DosList entries that may or may not still
  be attached to disk icons. In place of the DosList pointers we now
  use the VolumeNode associated with the lock on the disk's root
  directory. That should work around the mysterious tricks CrossDOS
  uses to update its volume data. [19991224:2]

- Fixed the "Workbench freeze" bug which would occur, for example, if
  the menus were displayed and an application was trying to remove
  an AppIcon: Workbench would freeze up as soon as the menus would
  be removed. The reason for the freeze was pretty embarrassing:
  elementary computer science! Never obtain locks in the wrong
  order...

- Calling "Update" on a "View by text" mode drawer no longer shoots
  the sorting order to hell. [19991224:3]

- When changing the protection flags of a file or drawer whose
  parent directory is currently being displays in "View by text"
  mode, Workbench will attempt to update the file information
  as soon as you hit the "Save" button of the information
  requester. Unfortunately, due to how Workbench works, this
  update won't take place unless the file/drawer whose protection
  bits you changed really has an icon attached. If there's no
  icon associated with the file, Workbench won't bother and update
  the display. [19991224:4]

- The ARexx "MENU .. INVOKE .." command now properly pays attention
  to whether the respective menu item is currently available or
  not. [19991224:5]

- Trying to drag a file or drawer into a trashcan on a different
  volume now produces an error. [19991224:6]

- Workbench no longer allows you to copy a drawer into itself or
  into one of its subdirectories. [19991224:7]

workbench.library 44.1501 (4.1.2000)

- Updated the german catalog file: the same keyboard shortcut
  was used twice in the "Information" requester.

- The "Rename" and "New Drawer" commands now make sure that the
  name entered is not longer than the filing system allows. That
  check used to be done right after the name was entered. I also added
  some new code that checks if the name entered contains directory
  control characters, in case somebody has forced them into the
  buffer [Thomas Richter].

workbench.library 44.1511 (11.1.2000)

- The AddAppMenuItem() function is now completely synchronous, i.e.
  it will return when the menu has been rebuilt or when the new menu
  item could not be added.

- The AddAppMenuItem() function now allows you to create sub menus
  and add sub items. The ARexx interface also supports this
  functionality.

workbench.library 44.1514 (14.4.2000)

- By public request, there is now a Workbench option which causes
  the Workbench title bar to be hidden. If the current day is a
  Tuesday, the mouse pointer will be hidden instead.

- The ARexx SIZEWINDOW command now properly changes the window
  size to the given dimensions.

- The ARexx MOVEWINDOW command now properly changes the window
  position to the given coordinates.

- The Scale() routine now tries to detect numeric overflows in a
  different fashion. [20000320:1]

- Put in another test to check for NIL: file handles in the
  copying code. Copying will be skipped. [20000403:1]

workbench.library 44.1527 (27.5.2000)

- Replace all the checks for multiplication overflow with a routine
  that really safely detects overflows. That was a tricky one...
  [20000515:1]

- Wrote my own special directory scanning code, intended to replace
  the use of MatchFirst() and friends. [20000516:1]

- Worked around a deadlock situation that could be triggered by
  AddAppMenuItem(). [20000516:2]

- Fixed a bug in the ARexx "INFO" command, which previously failed to
  display the icons of volumes. [20000527:1]

workbench.library 44.1540 (11.6.2000)

- Fixed a number of novel and interesting bugs in the directory scanning
  code I'd written. The credit for finding them goes, as so often, to
  Thomas Richter.

- The ARexx "MENU" command could end up freeing menu entries it should
  never have even modified, due to a loop counter being mistaken to
  point to a data structure in need of deallocation. Ouch. What a stupid
  mistake. On top of that, the code that should have cleaned up after
  a failed attempt to add a new menu didn't even check whether the
  temporarily allocated menu item was even initialized, and thus could
  cause Enforcer hits to be thrown. My, I must have been in some shape
  when I wrote that code! Fixed. [Nils Goers]

workbench.library 44.1547 (15.6.2000)

- The "Information..." window code that counts the number of files,
  drawers, blocks, bytes, etc. in a drawer or volume now knows how
  to deal with byte counts beyond 2^32-1. As usual, this "little"
  trick was more difficult to pull off than it originally appeared
  to be. Note that you need a new catalog to use this feature.

workbench.library 44.1551 (19.6.2000)

- No longer allows file, drawers or volumes to be named "*".

- Copying now skips files named "*".

- Now copies drawer icons again.

- Scrolling in "View by text" mode drawer windows no longer ends
  up omitting directory entries.

workbench.library 44.1552 (16.8.2000)

- You can now use multiple and drag selection to trigger 'Tools'
  menu items. I really wonder why that feature was always turned
  off in the code [2000-08-16:1].

workbench.library 44.1553 (6.9.2000)

- Copying code used to look for the largest fast memory block
  available. It shouldn't have done that. The code now looks for
  the largest memory block of any type available.

workbench.library 44.1558 (8.9.2000)

- Rescanning a directory that is in 'view by text' mode no longer
  crashes if that directory has any open children.

workbench.library 44.1559 (8.9.2000)

- Left out icons can be deleted again.

workbench.library 45.2 (5.10.2000)

- The menu event handling code now gracefully recovers should
  ItemAddress() return NULL [2000-10-05:1].

- Trying to close a drawer window via ARexx will no longer leave
  locks around that will go away only when the respective volume's
  top drawer is closed [2000-10-05:2].

- Duplicating drawers didn't work as it should, the drawer icons
  getting omitted on the way. The reason was that the copying code
  stumbled over the directory scanner's strange behaviour.
  Fixed [2000-10-05:3].

- Added the new hooks that allow you to replace the copying and
  deletion code and all other operations that make Workbench
  request input from the user.

workbench.library 45.38 (2.11.2000)

- Added new tags to OpenWorkbenchObjectA() to control the show/view
  mode of the drawer being opened.

- Added new menu item "Find" to 'Window' menu (*don't* ask why it ended
  up in that particular menu). This item is always available, and
  when selected will launch the program "SYS:System/Find" as a shell
  program (doing it any other way would have been too complicated).
  When launched, the Find program's current directory will correspond
  to the drawer associated with the then currently active window. This
  allows you to restrict find operations to the drawer they were invoked
  from.

- OpenWorkbenchObjectA() now supports file-less project icons.

- Added an evil mega monster kluge to work around OpenWorkbenchObjectA()
  crashing when freeing a WBStartup message. I hate this. But I hate it
  even more if after ten hours of searching there still doesn't seem to
  be anything wrong with the code!

workbench.library 45.49 (5.11.2000)

- When opening a tool with several other icons selected, including an
  AppIcon, the argument list to be prepared for the tool would overflow,
  resulting in memory getting trashed. Fixed [2000-11-5:1].

- I forgot to remove the debugging code I added to the OpenWorkbenchObjectA()
  launching routines, rendering this function essentially useless. Fixed.

- Another one bites the dust. Finally found the reason why it was almost
  guaranteed that a crash would follow a program getting launched by
  OpenWorkbenchObjectA(). Turned out that the bookkeeping information
  Workbench maintains for each running program was added *twice* for
  programs launched by OpenWorkbenchObjectA(), messing up the list in
  which it was stored. This led to no end of trouble lateron and was
  insanely difficult to track down. Nevertheless, found & fixed.

workbench.library 45.77 (8.11.2000)

- Found a couple of interesting and novel bugs in the AppMenu creation
  code. Items with submenus attached that had all their submenu items
  removed did not get deallocated. Fixed.

- Spent altogether far too much time trying to rewrite the remaining
  menu handling code to allow evil hacks such as ToolsDaemon to
  survive. Drew a complete blank. Found a possible way to add new
  menu titles to the strip, though, which is what you'll finally
  get with this version. And please, don't ask!

- "SYS:System/Find" is now launched as a Workbench process.

- Modified the delete and text input hook code to allow the
  respective actions to be skipped and the original Workbench
  code to be used in their places. Please consult the new
  autodocs as the hook function descriptions have changed
  significantly!

workbench.library 45.85 (14.11.2000)

- Workbench now maintains some sort of 'partial history' of
  which window used to be the last active one. This can be
  queried through the ARexx interface only, though.

- Discovered that the APPLICATION.LASTERROR ARexx attribute
  was never filled in. Fixed.

- In the Info requester, the 'readable' checkbox is no longer
  permanently enabled.

- The Info requester no longer retries saving an icon if the
  first attempt to make it writable failed.

- The copy code no longer allows you to replace and thereby
  delete left out icons. Problem is that the code responsible
  for cleaning up after left out icons to be deleted is so
  convoluted that I don't have the courage to venture into
  it any deeper. Maybe next time...

- Added hooks that allow code to be run just before Workbench
  shuts down and after it has initialized itself. This is,
  however, not what you may have expected. IPrefs has its
  own say in whether it allows the Workbench screen to be
  closed or not. So whatever windows your code may open on
  the Workbench screen will be included in IPrefs' tally,
  preventing IPrefs from allowing the screen to close
  unless you take special measures.

- Updated the assembly language header files.

workbench.library 45.96 (16.11.2000)

- The ARexx interface now allows you to add new menu titles
  beyond the "Tools" menu.

workbench.library 45.97 (18.11.2000)

- Text input hook invocation did not properly test the
  result code. Fixed.

- The 'Find' program was almost always launched with the wrong
  number of parameters. Fixed.

workbench.library 45.99 (23.11.2000)

- The "Execute..." requester no longer remains empty for the
  text input hook code.

- Made the UpdateWorkbench() function public.


workbench.library 45.101 (23.11.2000)

- The 'empty trash' hook code would release a drawer lock which
  subsequent calls would rely upon to stay intact. Result? Crash.
  Fixed.

- Similar problems in other sections involving callback hooks.
  Fixed.

- Fixed a nasty bug in ChangeWorkbenchSelectionA() and dumped some
  of the most obscure Workbench code that dealt with the list of
  selected icons in strange, mysterious and apparently utterly
  useless ways. Curse you, Neil!

workbench.library 45.102 (24.11.2000)

- More corrections in the hook invocation code, especially the one
  that takes care of emptying the trash can.

workbench.library 45.121 (8.2.2001)

- In 'WorkbenchControlA()' the 'WBCTRLA_IsOpen' tag no longer returns
  TRUE for volume icons unless the corresponding volume's drawer window
  is currently open.

- The built-in file/drawer copy code now skips hard linked directories
  altogether and avoids soft links, too.

- Trying to delete a hard or soft link to a directory no longer cleans
  out the contents of the directory linked to but rather removes the
  link itself.

- Workbench now indicates that a drawer or file is in fact a linked
  object by underlining the object's label text.

- In 'view by text' mode, drawers and file names are now printed
  in different colours.

- In 'view by text' mode the length of the size/type field is no
  longer hard coded but adjusted according to the strings being
  used.

- In 'view by text' mode the snapshot/unsnapshot menu items are
  now disabled. It was never really possible to snapshot/unsnapshot
  files and drawer icons in this mode anyway.

- Made the 'snapshot window' and 'snapshot all' menu items work even
  if the parent directory is not in 'view by icon' mode, provided that
  the icons to be snapshot have 'real' icons attached.

- The ARexx 'INFO' command no longer causes the main Workbench
  process to block.

- Project/tool icons without associated files no longer show up in
  'view by text' mode as files with the size of the icon file.
  Instead, a file size of zero is displayed. This was actually
  a fix for a kludge in the original Workbench code.

- If necessary, 'UpdateWorkbench()' now makes up an icon to show up
  in a drawer which is in 'show all files' mode [Stephan Rupprecht].

workbench.library 45.125 (15.2.2001)

- The copy code also counted linked directories and files, which
  the actual copying process skipped.

- A running ARexx process no longer delays Workbench prefs changes.

- Soft linked objects which do not allow themselves to be examined
  will no longer show up in the directory lists. Same thing for
  the initial scan of the WBStartup drawer.

- In the information window, the code that counts the number of
  directories now ignores linked directories.

workbench.library 45.127 (21.2.2001)

- Adding characters to the tool types text could cause the final
  NUL terminator to be lost, resulting in the displayed information
  to be trashed. Similarly, deleting from the end of the text could
  also cause the terminator to be removed. Both cases are fixed now.
  The code also plants a new NUL terminator at the end of the
  text every time a change is made.

------------------------- AmigaOS 4 project --------------------------

workbench.library 45.128 (28.2.2002)

- A maximum of 31 sub items can be added to a Workbench menu item,
  not 15 (as the autodocs say). Fixed.

workbench.library 45.134 (14.3.2002)

- Dropped some more unused code that nobody would want to use
  [20020314:1].

- Memory management for free lists now calls into icon.library rather
  than using the Workbench-private equivalent routines [20020314:2].

- The 'view by text' display now tries to waste less memory, if
  that's possible [20020314:3].

- If an AppMessage cannot be sent to an AppIcon or AppWindow, then
  the message itself will finally be deallocated rather than end
  up hanging around till the next reboot [20020314:4].

- Before a Workbench tool is launched from a project icon, the
  launcher now attempts to read the tool's icon (if there is one)
  and updates the amount of stack space the tool is to be started
  with. The old code fell back onto a default value if there was
  no proper stack size registered in the project icon. Still,
  that value may not have been enough, and the proper value would
  be stored with the tool's icon. The new code now increases the
  stack size, if that's what the tool icon suggests [20020314:5].

- When changing the icon selection list using [Ctrl]+Mouse click
  the menu strip contents were not updated in time, which led to
  all kinds of trouble, such as the "Delete..." menu item staying
  enabled even if there was no icon selected any more [20020314:6].

- The key conversion code that would allow you to select icons
  by entering the first few letters of their names could get
  letters wrong which required you to hold down any [Shift] key.
  This could cause some names to be unselectable or select
  icons with the wrong names [20020314:7].

- Even broken soft links now show up in the directory lists.
  They can be identified only in 'view by text' mode. For
  the icon view they will show up as links, but you won't be
  able to do anything with them other than deleting them
  [20020314:8].

- If the Workbench debug option is in effect, one less menu
  will fit into the Workbench main menu strip. This is finally
  taken into account for AddAppMenuItem() [20020314:9].

- Renaming an object now tries to get away with redrawing just
  the object that changed rather than having to redraw all the
  icons in the same drawer [20020314:10].

- The copying/moving code now checks specifically if the user
  is trying to put a directory into one of its subdirectory
  [20020314:11].

- Creating a new drawer in a view-by-text mode drawer no
  longer destroys the sort order. However, the newly
  created drawer may not be visible after creating it,
  on account of having been 'hidden' due to resorting
  the list [20020314:12].

- Changed the order in the steps are taken when a directory
  is to be created. Previously, the data structures required
  to display the directory were created before the directory
  itself was created [20020314:13].

- If a copy hook is installed, copying finally works for more
  than a single object. A weird function return code caused the
  entire operation to be aborted after the first object
  was processed. Fixed [20020314:14].

- The 'view by type' drawer display mode can now be snapshot and
  will not be reset to 'view by icon' [20020314:15].

workbench.library 45.142 (15.3.2002)

- Cleaned up the source code line indentation in the "app.c",
  "menus.c" and "incoming.c" files.

- Creating user menus through AddAppMenuItemA() would forget to
  store a pointer to the data structure that contained the
  menu and the administrative information. Thus, removing the
  menu through RemoveAppMenuItem() would fail to release all
  the memory allocated for it [20020315:1].

- Clicking on a drawer window scroller without moving it no longer
  has the effect of decrementing the scroller position. This was
  a side-effect of the new scroller position getting recalculated
  again, which was subject to roundoff errors [20020315:2].

- Looks like the asynchronous copying code is better off without
  the complex throughput/time scaling code I put into it. Let's
  wait and see how it works after the lobotomy... [20020315:3].

workbench.library 45.151 (15.3.2002)

- Found another cleverly-hidden bug in OpenWorkbenchObjectA().
  Finally, it should be possible to launch programs without
  having to specify a complete path name as long as the program
  is found somewhere on the shell search path. This should also
  work for relative path names, which didn't work so well
  before [20020315:4].


workbench.library 45.161 (15.3.2002)

- Broken soft links are now displayed like files rather than
  directories to match how asl.library treats them [20020315:5].

- Soft links to volumes could be displayed as disks, even inside
  drawer windows. That led to all kinds of trouble. The new
  code now checks the type of icon returned by icon.library,
  rejects disk icons for files/drawers and tries to find a
  better match for the type of object referred to [20020315:6].

workbench.library 45.165 (16.3.2002)

- Cleaned up the "runtool.c" source code.

- Implemented support for the $STACK: keyword embedded in
  program hunks [20020316:1].

workbench.library 45.166 (19.3.2002)

- Fixed a potential buffer overflow problem in the
  nstrcat() routine [20020319:1].
  
-------------------- AmigaOS 3.1.4.(1) project -----------------------

workbench.library 45.168 (10.6.2017)

- Moving a disk object into a subdirectory did not work
  because the check whether a directory is copied into
  itself was broken. Moving softlinks into directories is
  also always valid.
  
workbench.library 45.169 (24.7.2017)

- Copying soft- and hardlinks is now supported.

- In case the workbench can predict that the icon name
  or text is not readable due to the lack of screen pens,
  default pens are now used instead.
  
workbench.library 45.170 (24.9.2017)

- The workbench detects now itself whether it can put
  gels into fast or chip memory, the API call to set
  the memory type is obsolete.

workbench.library 45.171 (25.9.2017)

- The computation of the capacity of a device was needlessly
  clumsy, fixed.

- The computation of the filled percentage could overflow,
  then creating nonsense results.

- The computation and display of the full drawer size was
  needless cludgy, fixed.

workbench.library 45.172 (27.9.2017)

- Computation of the fill percentage was still wrong in another
  place, namely the window title. The formula is used three times,
  and three times wrong...

- Computation of the fill gauge level could overflow, and the
  overflow prevention mechanism was wrong, too.

- Setting the gauge level had a race condition in the sense that
  the gauge was potentially not correctly updated.

workbench.library 45.173 (28.9.2017)

- There was still a max() operation in the window title percentage
  fill level. Unfortunately, the block count is indicated as signed
  quantity (due to the BCPL legacy) and hence cannot cope with very
  large devices.

- The locales still use signed output for the block count, though
  the block count should be unsigned. This was fixed for the default
  locale.

workbench.library 45.174 (7.10.2017)

- Fixed a crash if the volume gauges were disabled, though the
  linkage of the disk object was not updated accordingly to
  reflect the change.
  
workbench.library 45.175 (12.10.2017)

- The workbench placed a couple of patterns for the shaded
  cursor, the background of the copy gauge and the shaded
  icons not in chip mem, hence causing graphical glitches
  if the system operated on the native graphics. Fixed.
  
workbench.library 45.176 (12.10.2017)

- This is an experimental release that was compiled in a different
  way to avoid reloading the library base every other instruction,
  hence giving more efficient and shorter code. Still requires
  careful testing.

workbench.library 45.177 (18.12.2017)

- Fixed an off-by-one error when copying file names from the
  file name input requester.
- Window tags for the execute/rename input window where
  initialized incorrectly, giving rise to a misplaced text that
  appeared incorrectly in the middle of the window title.
  
workbench.library 45.178 (6.1.2018)

- Added a workaround for file system that do not communicate the
  file system state correctly and instead report the partition
  type in the InfoData structure.
  
- Simplified the algorithm a bit that determines the memory type
  for the icon storage.

workbench.library 45.179 (6.1.2018)

- Reduced the stack usage of WBInfo() dramatically. Still, stack
  usage is still too high, but at least in reasonable dimensions.
  
workbench.library 45.181 (21.1.2018)

- A little bit of code cleanup and removal of legacy pre-ANSI C
function definitions.
  
workbench.library 45.182 (25.1.2018)

- If the screen estate is too small to render the info window, the
  icon drop zone and icon image is now removed from the window, and
  rendering is attempted again, with the standard topaz.8 font and
  a bare-bone layout. This seems to work even on NTSC.
  
workbench.library 45.183 (4.2.2018)

- The workbench uses now BumpRevisionLength() if it is available,
  allowing icon names longer than 30 characters if the file system
  supports it.
  
workbench.library 45.184 (17.2.2018)

- The copy gauge did not centre very well on autoscroll screens;
  this has been fixed. Centering execute/rename windows has currently
  been disabled. The mouse has to travel too far from the menu to
  the buttons, which makes this inconvenient. Instead, the window
  opens now top-left relative to the current position of the autoscroll
  screen.

workbench.library 45.185 (23.2.2018)

- Rebuild with the new locale build mechanism. As a result, wb became
  again shorter, and got a new locale, as well.

workbench.library 45.186 (5.4.2018)

- The workbench makes now several attempts to shorten the file names
  for making duplications of files. This is better than receiving a
  failure from the icon.library later.

workbench.library 45.187 (20.4.2018)

- Performed a bit of compiler cleanup and also renamed the "SAD"
  menu entry to "Debugger" which is more appropriate.

workbench.library 45.188 (4.5.2018)

- The workbench is a bit more careful now when selecting the pens for the
  icons and tries to work around faulty return codes when testing the
  bitplane depth of RTG screens.
- When moving objects, and moving the icon failed, the workbench now
  moves the object back to its original place. Previous versions could
  have created inconsistent states where the object was moved away, but
  the icon was not.

workbench.library 45.189 (6.5.2018)

- When allocating pens through the workbench Control function, the workbench
  was unaware that intuition already reserved pens at the upper end of the
  palette for our use, hence ObtainPen() failed, and hence the API call
  left the colors untouched. Workbench pokes now the colors using SetRGB32()
  since these pens are set aside for us anyhow.
- The workbench control function could have also set sprite colors. This is,
  however, undesired as they are not part of the GUI but controlled through
  the pointer preferences.
 
workbench.library 45.190 (20.5.2018)

- The Find menu item is now ghosted if SYS:System/Find does not exist.
- The Delete progress gauge was driven incorrectly top-level and hence
  caused situation where the gauge could run backwards.

workbench.library 45.191 (27.5.2018)

- Apparently, accepting arbitrary disk types as valid had side effects of
  unformatted partitions disappearing. This is just a bad idea. Instead,
  I now only accept DOS\x as valid file partitions and leave it to file
  system authors to fix up their mess.
- The workbench now accepts non-DOS\x types only if there is a non-zero
  volume node attached to the InfoData structure. Maybe this helps better.

workbench.library 45.192 (20.7.2018)

- Putting a device name on the hidden device list had the unforeseen
  side effect of mounting the hidden device, which was probably not intended.
  
workbench.library 45.193 (1.9.2018)

- Workbench uses now the V45 RVI interface in the rexxsyslib.library and no
  longer the statically linked version from amiga.lib.

workbench.library 45.194 (23.9.2018)

- There was still a potential race condition in LibOpen() that might have
  caused inconsistencies if two tasks opened the workbench right at the
  same time. This is because the intuition class creation code may break
  a Forbid(), and hence may allow another task to run into LibOpen().
  Highly unlikely, but let's make things right.
- Workbench no longer provides coordinates for the execute and rename window
  as intuition will provide them anyhow, and in case of v45, will even
  nicely move the window to the mouse pointer.

------------------------------ AmigaOS 3.2 project -------------------

workbench.library 45.197 (1.12.2018)

- In case an assign was listed (probably by pure chance) on the list of hidden
  devices, the corresponding device was hidden from the workbench, which was
  probably not intended as the assign was not shown in first place on this
  list.

workbench.library 46.1 (3.8.2019)

- Workbench now supports a configurable Screen Title Bar text. The title can
  be defined via Workbench Preferences Editor. It may contain numbers, text
  and Title Format Items. The following Title Format Items are currently being
  supported:

        - %e <envname>   : an environment variable
        - %m:              memory, can be further specified by up to three
                           additional chars. The next char defines the type
                           of memory.
          Memory type:
            c            : Chip Memory
            f            : Fast Memory

          Memory block:
            e            : free memory
            u            : used memory
            t            : total memory
	    l            : largest block available

          Memory unit:
            b            : bytes
            k            : kbytes
            m            : mbytes
            q            : percent of total

            Example: "%mcuq" would display the amount of ChipMemory in 
                             use as percentage of total.

workbench.library 46.2 (8.8.2019)

- The %vk token would take the kickstart revision from the wrong 
  source, which is now fixed. %vw did not work, but uses now the 
  version library for this job. By compile time decision, this is 
  always identical to the workbench library version.
  The following tokens were not documented before: %c is the CPU 
  version, and %f the FPU version.

workbench.library 46.3 (21.8.2019)

- Added a configurable time to support the preferences setting for the
  Screen Title Update Delay.

workbench.library 46.4 (24.8.2019)

- Replaced the Boyer-Moore search algorithm by a considerably faster
  implementation.

workbench.library 46.5 (24.8.2019)

- Added support for the following new Title Format Items:

        - %r             : Release Version Information
        - %i:            : System Information, can be further 
                           specified by an additional chars, which 
                           specifies the information item.
            p            : default Public Screen's name
            s            : number of open Screens
            d            : name of the active drawer
            i            : number of currently selected icons
            r            : number of running programs
            a            : number of active disks

            Example: "%ir" would display the number of running programs

- The machine's CPU name is now being stored in WorkbenchBase

workbench.library 46.6 (24.8.2019)

- Fixed a bug in CPU Title Format Item generation

workbench.library 46.7 (7.10.2019)

- While the workbench did update volumes of the doslist, it did not
  refresh devices. In case a device went away or changed its port,
  workbench did not update the entry in its ActiveDevice list to
  reflect such a change.

workbench.library 47.1 (13.10.2019)

- Bumped to 47.1 to avoid problems with FixRomLibs which would 
  otherwise remove the library from the resident list.

workbench.library 47.2 (1.11.2019)

- The %r format specifier would insert random characters in the screen
  title bar text if the "Versions/Release" environment variable wasn't
  defined, due to an uninitialized buffer (dos.library/GetVar() leaves
  the buffer unmodified in case of failure). Now fixed.

workbench.library 47.3 (17.11.2019)

- Sorting by size was using 32 bit signed difference, generating wrong
  results for files > 2GB.
- Printing the size of the a file in the "view by text" mode used %lD 
  as qualifier rather than %lU, generating negative numbers for files
  larger than 2GB.

workbench.library 47.4 (23.11.2019)

- The information window now also appears under the mouse cursor, 
  unless another information window is already open, in which case the 
  new window is staggered under the already present window.

workbench.library 47.5 (28.11.2019)

- In case the workbench screen was reopened with a smaller screen mode,
  the text of backdrop icons could have been positioned outside of the 
  visible screen.

workbench.library 47.6 (20.12.2019)

- The execute window of the workbench falls now back to topaz.8 in 
  case the window does not fit on the screen.

workbench.library 47.7 (30.12.2019)

- The information window edit class did not set the GMORE_SCROLLRASTER
  property and hence failed to refresh the gadget contents properly 
  when parts of the gadget were occluded.
- The version information of a file can now be retrieved from the 
  information window of the workbench by clicking on the file name.

workbench.library 47.8 (1.1.2020)

- Closing a drawer via menu could cause an illegal memory access since
  Workbench was referencing the drawer's parent after the operation,
  even if it had been closed and deallocated itself before. Now fixed.

- Activating the Information requester's tool type editing gadget via
  its label shortcut does no longer cause a byte read from address 4.

- Over the past 30 years, Workbench has been allocating eight times as
  much memory as actually needed for the file name icons displayed in
  view by text drawers. On a non-RTG machine, this could quickly drain
  CHIP memory when opening highly populated drawers. Now fixed.

- After a screen close/reopen transition, Workbench would (for a short
  time) reuse the menus that were built with a VisualInfo derived from
  the former screen; this might have ended up in referencing no longer
  valid memory (not possible with the current gadtools.library, but a
  potential issue with future versions). The reopened windows will now
  only get their menu strip once it's been rebuilt for the new screen.

- Added a protection against drawer icons reporting huge view origin
  coordinates, which could make the Workbench lock up or crash.

- Fixed a bug which would cause illegal memory accesses if a program
  tried to add an AppIcon while the Workbench screen was closed.

- When closing and reopening the screen, Workbench will not "forget"
  anymore to reopen some of the drawer windows that were closed during
  the transition (item B18455 in the old C= Amiga bug database).

- No longer brings up a confirmation requester when the user invokes
  the "Delete..." menu item on one or more AppIcons, unless some file
  or drawer icons are selected as well. In the latter case, the file
  count shown in the requester won't include the AppIcons (bug #579).

- A new "Open volume" submenu is now available in the "Workbench" menu,
  providing an alternative way to quickly access mounted volumes whose
  icons in the root (backdrop) window are covered by other windows.

- Optimized window scrolling a little, by not attempting to render any
  icons lying entirely within obscured cliprects.

- Slightly optimized window refresh, again by skipping any rendering
  of icons outside visible cliprects.

- Attempting to rename "foo" to "foo.info" with the built-in "Rename"
  requester does now work as expected, regardless of "foo" having an
  icon or not. It used to fail if the icon existed, and to change the
  file's name to "foo.info.info" if it didn't.

- Icons dropped over a drawer or disk icon ended up being snapshotted
  at position (0,0) if the target didn't have an open window, but any
  of its sub-drawers did. Now fixed.

- When dragging icons, the right [Amiga] key would always restrict the
  direction of movement to the same axis as the last time it was used,
  regardless of which way the mouse was moved, unless some free (i.e.
  non-restricted) dragging was made since then. Now fixed.

- The "Update" menu item can now be used also with the root window; in
  that case it will simply move any properly snapshotted icons back to
  their original position.

- If selected while keeping a [Shift] key pressed, the "Update" menu
  item will now once again reset the active drawer's origin position.

- The internal references to the last and current active drawer window
  weren't being updated when opening a new window. Now fixed.

- Calling UpdateWorkbench() to remove an icon from a text mode drawer
  was unnecessarily refreshing the drawer's contents three times after
  the operation. Now it only refreshes the contents once.

- The tags for the experimental disk info hook have been renumbered to
  avoid a conflict with the OS 4.x workbench.library API. However, for
  the time being the previous tag numbers are still supported in order
  to ease the transition. (This support will be removed very soon, so
  make sure to update your include files!)

- Moving the horizontal scrollbar of text mode windows all the way to
  the right does now reveal even the last bits of the text; previously
  a few pixels could be left out due to a row width miscalculation.

- An icon selected by typing the first letters of its name will now
  blink for a brief time, in order to make it easier for the eye to
  spot it in a window full of icons.

- Arrow buttons of drawer border scrollers, if kept pressed, no longer
  start repeating their action immediately, but rather only after a
  short delay just like the buttons of GadTools/ReAction scrollers.
  The previous behavior would often require a few attempts before the
  user could manage to scroll the window to the desired position.

- Icons without an associated file no longer pretend to be a file of
  zero bytes when appearing in text mode drawers; a dash ("-") is now
  displayed in the type/size field instead.

- When reopening an open drawer's parent window, if it belongs to a
  volume, its disk fill gauge is now updated immediately, rather than
  only after a few seconds.

- Happy New Year :-)

workbench.library 47.9 (2.1.2020)

- In case a file is renamed, but the target name is too long such
  that the icon name can no longer be represented faithfully, the
  rename operation now fails.

workbench.library 47.10 (3.1.2020)

- Due to the presence of the version tag in the version scanning 
  method, version could no longer find the version of the workbench. 
  Bummer!

workbench.library 47.11 (2.2.2020)

- Repositioning the cursor in the Information window's editing area
  always had the effect of redrawing the entire display, even when
  this was not really necessary. Fixed [fix by Olaf from V50.1].

- The maximum size of a window, as computed by the ARexx interface,
  is now bounded by the size of the screen. Previously, it could
  end up being much larger than the screen [fix by Olaf from V50.1].

- Replaced the WBStartup handling routines with Olaf's fixed version
  from workbench.library 50.48. The previous code would busy wait on
  PAL machines and could fail to correctly associate return messages
  to the corresponding launched tools, so that "wait until finished"
  behaved randomly when more than one tool was present in WBStartup,
  and at least one of them actually asked to wait.

- Replaced all instances in which WaitTOF() was used to produce a
  short delay with calls to Delay() [fix by Olaf from V50.48].

- Replaced direct modifications of RastPort write masks with calls
  to SetWriteMask() [fix by Olaf from V50.61].

- Broken links finally show up in the "view by text" listing [fix by
  Olaf from V50.78].

- Double-clicking on a broken link is now ignored [fix by Olaf from
  V50.78].

- When calculating the maximum 'view by text' size column length, the
  "Link" label is now taken into account [fix by Olaf from V50.92].

- Closing a drawer in the process of being rescanned (as a result of
  selecting the "Update" menu item) would cause a write operation to
  already freed memory if the drawer hadn't any open sub-drawers and
  its parent drawer was closed and hadn't any other open sub-drawers
  either. Now fixed.

- The RastPorts used internally by Workbench for measuring icon text
  size in "view by icon" and "view by text" mode were never properly
  set up via InitRastPort() before being used. They are now.

- An icon moved or copied by dropping it over a drawer or disk icon
  is now always unsnapshotted, regardless of whether the target has
  an open window or not. Previously it would get snapshotted at an
  unpredictable position if the target's window was open (bug #126).

- Dragging icons from a drawer in "view by text" mode to a drawer in
  "view by icon" mode no longer puts them in a vertical row with the
  same positions as their text representation in the source drawer;
  the icons are now unsnapshotted and repositioned automatically.

- Once again, snapshotting a fake icon now turns it into a real icon.
  To prevent undesired side effects, this only happens for explicit
  targets, i.e. "Snapshot All" will generate an .info file for the
  active drawer, but not for any fake icons inside it (bug #702).

- The "Unsnapshot" menu item, when applied to a drawer icon with an
  open window, had the side effect of snapshotting the position and
  size of the window; now that information is left unchanged.

- The "Snapshot Window" and "Snapshot All" items of the "Window" menu
  no longer snapshot also the position of the icon the active drawer
  belongs to, since that is not their intended purpose (bug #126).

- Snapshotting an icon living in the root window does now also make
  it automatically "left out", as the user will probably expect to
  find it still there after a reboot (why snapshot it otherwise?).

- The "UnSnapshot" menu item is now disabled when no icon among the
  selected ones is actually snapshotted.

- Icon dragging does now only start as soon as the mouse is actually
  moved; just clicking on an icon does no longer immediately display
  a bob on the screen.

- Drag selecting is now also deferred until the first mouse movement
  after clicking inside a drawer window, in order to avoid locking
  the layers unless it's really necessary.

- Icons which are just links and lack an associated file/drawer are
  now displayed with an underlined label [fix by Detlef from V51.25].

- Links appearing in a drawer window would get a label drawn without
  underlining if their associated (snapshotted) icon was found first
  during the drawer's scan. Now fixed [fix by Detlef from V51.25].

- UpdateWorkbench() does now check whether an added object is a link
  (rather than a file or drawer), and displays it with an underlined
  label if that's the case. Previously the added object didn't look
  like a link until a manual drawer update was performed.

- Link objects added via UpdateWorkbench() used to be displayed with
  the name of the object they pointed to, rather than their own name.
  Now fixed.

- Selecting "Leave out" for an icon living in the root window (but
  not already left out) would end up leaving a hanging lock on the
  icon's home directory, never to be released again. Now fixed.

- Selecting "Put away" for a left out icon would cause a byte read
  from unallocated memory in case that icon was the first entry in
  the ".backdrop" file. Now fixed [fix by Detlef from V51.39].

- "Leave out" now also works for fake icons.

- No longer performs a needless extra refresh after selecting "Show
  all files" for a drawer in "view by icon" mode.

- Dropping a fake icon over a drawer where a real icon with the same
  name exists no longer changes the real icon's position.

- Wherever it is relevant for display purposes, Workbench now tries
  to compensate for object coordinates being internally represented
  as 16-bit values; this could result in an integer overflow error,
  due to which icons that should have been very far out of view were
  instead appearing at random positions (second part of bug #1185).

- When switching to "view by icon" mode for a "view by text" drawer
  which had never been in "view by icon" mode before, the automatic
  placing algorithm for unsnapshotted icons (whether real or fake)
  would be run without an adequate setup. This caused its execution
  time to increase quadratically with the number of (unsnapshotted)
  icons involved. Now fixed (third part of bug #1185).

- The positions of any snapshotted icons living in Workbench's root
  window are now automatically updated after a screen mode change.
  Previously, if the screen was made smaller and then larger again,
  some icons could unnecessarily remain where they were moved to in
  order to fit in the smaller screen.

- It is now possible to scroll the contents of drawer windows using
  the mouse wheel. Note: this currently requires a mouse driver that
  issues "NewMouse"-style wheel events.

- Workbench's MOVEWINDOW and SIZEWINDOW ARexx commands will now try
  to compensate (to a reasonable extent) for the asynchronous nature
  of Intuition's window moving and sizing operations.

- Workbench's ARexx query "GETATTR WINDOW.ICONS.<type>.<n>.WIDTH" and
  the matching "GETATTR WINDOW.ICONS.<type>.<n>.HEIGHT" would return
  the wrong values for the icon size, as they weren't taking the size
  of the icon borders into consideration. Now fixed.

- ChangeWorkbenchSelectionA(), too, was passing wrong values for the
  icon size to its client's hook, as it wasn't taking the size of the
  icon borders into consideration. Now fixed.

workbench.library 47.12 (6.2.2020)

- Release version information is now being pulled only once when 
  opening workbench.library.
- Release version information is now displayed on the "About" 
  requester.

workbench.library 47.13 (16.02.2020)

- Added support for outlined and shadowed icon text, see icon.lib

workbench.library 47.15 (25.4.2020)

- Placing automatically the same icon two times in a row will now make 
  it end up both times at the same position, provided that nothing 
  else has changed in its window between one placement and the next. 
  This fixes an old problem where the AppIcon of an iconified program 
  would not return to the place it previously occupied, if the program 
  was deiconified and then iconified again. A side effect of this 
  change is that the vertical spacing between automatically placed 
  icons will now be greater by three pixels (i.e. will be equal to the 
  spacing used for "cleaned up" icons).

workbench.library 47.16 (24.5.2020)

- Replaced the locale string lookup code with a safer version which
  does not go off the rails if asked to look up a string ID value
  which is not stored in the local CatCompBlock data lump.

workbench.library 47.17 (03.jun.2020)

- Fixed the scrollwheel handling in the icon information window.

workbench.library 47.18 (9.7.2020)

- Added a small workaround to the icon dragging routines to avoid 
  crashes with CyberGraphX. Its SUPERGELS patch makes a few too many 
  assumptions about the way Workbench handles its GELs internally, and 
  a recent minor change in that area caused it to misbehave severely 
  as a result.

workbench.library 47.19 (10.7.2020)

- Fixed the API functions OpenWorkbenchObjectA(), CloseWorkbenchObjectA()
  and ChangeWorkbenchSelectionA() so that they no longer leave unreleased
  locks on several directories after finishing their job.

- Calling OpenWorkbenchObjectA() on a file with either "Start from Shell"
  or "Start from ARexx" set in its icon would leave a hanging lock on the
  opened object's parent directory; now fixed.

- OpenWorkbenchObjectA() now checks that an icon's default tool string is
  actually non-NULL before reading from it.

- OpenWorkbenchObjectA() now uses GetDiskObjectNew() instead of the plain
  GetDiskObject(). This allows the function to retrieve the default icon,
  and thus find out the appropriate default tool to use, when it's called
  to open a project file lacking a real icon.

- When attempting to get the icon of an object found in the system search
  path list, OpenWorkbenchObjectA() would temporarily change the current
  directory and then forget to restore the previous one. Now fixed.

- When calling OpenWorkbenchObjectA() to start a tool not residing in the
  current directory, a wrong lock would be left in the first entry of the
  Workbench argument array passed to the tool itself, therefore providing
  it misleading information about its own location. Now fixed.

- When calling OpenWorkbenchObjectA() to open a project file found in the
  system search path list (i.e. one without an absolute path and also not
  residing in the current directory), a wrong lock would be left in the
  first Workbench argument passed to the project's default tool, which in
  turn resulted in the tool being unable to find the project after it was
  launched. Now fixed.
  
- Opening a project file via OpenWorkbenchObjectA() would fail with error
  "file is not executable" in case the file's executable flag was not set
  and the file's icon asked for it to be started from Shell or ARexx. Now
  the executable flag for this kind of project file is ignored, just like
  it would happen if it were actually started from Shell or ARexx.

- OpenWorkbenchObjectA() can now run an object having spaces in its name,
  even when its icon specifies it should be started in Shell mode.

- When browsing the system search path list to locate a project or a tool
  not having an absolute path and not residing in the current directory,
  OpenWorkbenchObjectA() will now reject directories in case any is found
  having the same name as the object being sought.
  Previously this filter was missing, e.g. looking for "MultiView" could
  result in a "REXX:MultiView" directory being considered a valid match.

- The various issues with opening the parent drawer of objects opened via
  OpenWorkbenchObjectA(), such as missing entries or lockups, should now
  be fixed (please report).

- Hopefully fixed all known remaining OpenWorkbenchObjectA() issues which
  were related to opening drawers. The function will now try hard to take
  care of all that's needed to correctly set up Workbench's internal data
  structures in order to emulate a "real" drawer opening operation.

- Corrected one last inaccuracy in the computation of the minimum/maximum
  horizontal coordinates for entries of text mode drawers.

- Added a new API function, WhichWorkbenchObjectA(), that allows programs
  (e.g. commodities) to check if a mouse click at given coordinates would
  end up hitting a Workbench icon or window.

- It is now possible to select the sort order (forward/reverse) for items
  in text mode drawers, with a new "Sort order" item in the "Window" menu.
  The sort order is saved in the drawer's icon at snapshot time.

- You can now tell Workbench whether text mode drawers should show drawer
  names mixed with file names, all grouped together before file names, or
  all grouped together after file names.
  This requires at least Workbench (editor) 47.21 and IPrefs 47.15.

- The "Resize to fit" menu item is now enabled also for text mode drawers,
  albeit only affecting the window's width. It will make the window just
  wide enough to display a whole row of text.

- It is now possible to limit the scrolling in "view by text" drawers (by
  arrow buttons/keys or mouse wheel) so that their contents cannot scroll
  out of view when doing so would only bring empty space into view. This
  matches the behavior of regular GadTools/ReAction listviews.
  (Note: a control for this isn't present in the Workbench editor yet; it
  can only be changed programmatically via WorkbenchControlA() for now.)

- You can now choose the default ordering of dates for all drawer windows
  ("newest entries first" vs "oldest entries first"). This global setting
  affects both "Clean up by date" and "View by date"; in the latter case,
  it determines what you get when "Forward" is selected as the sort order
  for a "view by date" drawer.
  (Note: a control for this isn't present in the Workbench editor yet; it
  can only be changed programmatically via WorkbenchControlA() for now.)

workbench.library 47.20 (6.8.2020)

- Non-disk icons living in Workbench's root window are no longer moved to
  their snapshotted position after a screen mode change, which was rather
  undesirable for left out icons. The "Update" menu item will still reset
  the position of snapshotted left out icons, though (bug #1603).

- When launching a Workbench tool from a project icon, the launcher would
  fail to load the actual tool's icon (in order to read its stack size as
  well) in case the project's default tool had a relative path. Now fixed
  (bug #1712).

- Scrollers of Workbench drawers once again adjust themselves immediately
  to reflect the new extent of their window's contents when they are used
  to scroll empty space out of view (bug #638).

- Renaming an object would not update its drawer's horizontal scroller to
  reflect the new extent of the window contents. An icon label can become
  so long it no longer fits entirely in the visible window area, or short
  enough to fit again where it previously did not; whenever such a change
  occurs, the scroller is now adjusted accordingly.

- When (re)computing the extent of a drawer window's contents, a padding
  of two pixels around icons is now added to the calculation, for a more
  pleasing overall appearance. This prevents icons from ending up placed
  directly against window borders after moving a scroller all the way to
  one of its ends.

- The "Rename..." requester now places and sizes its gadgets correctly in
  the available space, even in case the window is too narrow for the name
  string to be displayed entirely (bug #1395).

- When launching a project having a default tool without an absolute path,
  the tool would receive a WBStartup message whose first WBArg's wa_Lock
  pointed to the home directory of the project, instead of the one of the
  tool itself. Now fixed, except when the default tool is AmigaBASIC, for
  compatibility reasons (bug B18354, first reported in 1992).

- If selected whilst holding a [Ctrl] key pressed, the "Update" menu item
  will now change the active drawer's origin position to the one saved in
  its icon (i.e. the one that drawer initially opened with).

- OpenWorkbenchObjectA() would still pass a tool an incorrect name in the
  first WBArg when used to open a project file having a default tool with
  a relative path. Now fixed.

- Doing an "Open parent" on the window of a left out drawer will now open
  the drawer's actual parent drawer, rather than activate the root window.

workbench.library 47.21 (27.8.2020)

- Dragging icons living in a "view by icon" drawer would redraw all other
  icons in the same window after each of the moved icons was erased from
  its previous location. This was done to restore the other icons in case
  they had been partly erased as well due to possible overlapping, and it
  usually didn't cause actual rendering to take place thanks to clipping;
  still, in most situations much unneeded work was being carried out.
  For instance, moving a group of 4 icons in a window with 10 icons would
  result in 36 superfluous DrawIconStateA() calls.
  Now Workbench won't even try to redraw any of the other icons unless it
  was actually damaged when erasing one of the moved ones.

- Now caches the results of GetIconRectangleA() for each icon, instead of
  recalculating them over and over every time that information is needed.
  The cached rectangles are first computed when icons are read from disk,
  and then only updated when required, e.g. when a file is renamed or the
  user changes the icon font or border size.
  This optimization may speed up icon layout a bit on slower machines, in
  particular when performing a "Clean up", or switching from text view to
  icon view, on drawers containing a large number of icons (please report
  if you notice any difference).

- The internal routine to render an icon was calling IconControl() before
  doing the drawing, to gather information which would then be completely
  ignored by the code. That redundant call has now been removed.

- The net result of all the above: moving an icon with the mouse, even by
  just a few pixels, could lead to several unnecessary icon.library calls
  (GetIconRectangleA(), IconControl(), DrawIconStateA()) being made after
  releasing the mouse button. In place of that, now only one icon.library
  call is performed, to render the moved icon in its new location.

- Moving or copying a file by dragging and dropping its icon would cause
  its source drawer to be refreshed twice if in "view by text" mode. Now
  it is refreshed only once.

- Copying a file by dragging and dropping its icon would cause the target
  drawer to be refreshed twice, too, if in "view by text" mode. Now it is
  refreshed only once.

- "Resize to fit" for drawers in "view by text" mode was doing nothing if
  the drawer's window was already wider than needed to display a full row
  of text; i.e. it could only enlarge but not shrink the width. Now fixed.

- Now preserves all known DrawerData flags as defined by OS 4.x, even the
  ones that are currently ignored by the OS 3.x Workbench. They would get
  lost when writing a disk or drawer icon back to disk, which is not very
  nice from an interoperability standpoint.

workbench.library 47.22 (29.8.2020)

- The cached icon rectangles for newly inserted volumes were being set up
  too early, before the actual icon label had been established; now fixed.

workbench.library 47.23 (3.9.2020)

- Upon receiving the initial preferences settings from IPrefs, all cached
  icon rectangles would be recalculated even if the Workbench process had
  not started yet, which caused a hit due to trying to access a list that
  was still uninitialized. Now fixed (bugs #1767, #1778).

workbench.library 47.24 (13.9.2020)

- Now the screen title defaults string is formatted like all the 
  formatted screen titles (as from the workbench prefs)

workbench.library 47.25 (15.9.2020)

- If a copy hook is installed, copying via "Icons / Copy" menu finally
  works for more than a single object. A weird function return code 
  caused the entire operation to be aborted after the first object was 
  processed.

workbench.library 47.26 (11.10.2020)

- Extra disk gronk was happening when a disk had been removed but the
  root drawer window was showing due to an attempt to updated the title
  bar text periodically. An extra test was added to see if the disk was
  already inserted first in that situation only which removed the
  unnecessary call to Info() causing the disk drive gronking.

workbench.library 47.27 (13.10.2020)

- Fixed a bug introduced in version 47.11 due to which the WBStartup code
  failed to notice a launched tool's termination and kept waiting for its
  startup message to be returned (bug #1387).

- The WBStartup code would read from already freed memory when processing
  a tool termination message; now fixed.

- Fixed NULL pointer access that was introduced in 47.26 (bug #1870).

workbench.library 47.28 (13.1.2021)

- Window refresh or resize events would cause an attempt to render icons
  in a "view by text" drawer even while it was still being scanned after
  having been opened. However, not enough information has been gathered
  yet at that stage to determine the correct width of the text icons, so
  Workbench could end up allocating too little memory for their image's
  data and then overrun its boundaries when writing the icon name to it,
  trashing other memory in the process.
  Now fixed by deferring any icon rendering in a text mode drawer until
  Workbench is done scanning its contents, which always was the intended
  behavior in the first place (bug #1933).

workbench.library 47.29 (18.1.2021)

- Now supports IDCMP_EXTENDEDMOUSE events for wheel scrolling. The same
  qualifiers available for cursor keys apply to these events as well.
  Legacy NewMouse IDCMP_RAWKEY events are still handled, in case an old
  (< V47) intuition.library is in use.

workbench.library 47.30 (7.3.2021)

- Changed the working of "Window/Update" when applied to the root window
  so that it tries to find a reasonable placement for all icons, instead
  of only resetting the position of snapshotted icons.

- "Window/Update" is now performed on the root window at startup time to
  prevent properly snapshotted disk icons from appearing out of place if
  some non-snapshotted icons (e.g. a CD) were added first while scanning
  the mounted volumes.

- Commented out some unused code.

- Desktop icons repositioned to stay within display bounds after closing
  the screen and reopening it at a smaller size would end up all grouped
  together (and overlapping each other) in the lower right screen corner,
  due to a bug introduced in version 47.8. Now fixed.

workbench.library 47.31 (08.03.2021)

- Localized KB, MB, GB... and added missing B in some places

workbench.library 47.32 (26.3.2021)

- When starting up, icons living in the root window will now only appear
  after their initial rearrangement (as introduced in version 47.30) has
  taken place.

- Performing "Window/Update" on the root window was needlessly redrawing
  all of its icons twice; now fixed.

workbench.library 47.33 (31.3.2021)

- The new rearranging code for desktop icons would misbehave and lock up
  the system when processing disk icons associated with invalid volumes.
  Now fixed (bug #2081).

