workbench.library 44.99 (18.3.99)

- 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.99)

- 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.99)

- 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.99)

- 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.99)

- 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.99)

- 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.99)

- 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 desastrous 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.99)

- 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.


workbench.library 44.216 (25.3.99)

- 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.99)

- 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.99)

- All windows now support live scrolling.


workbench.library 44.256 (28.3.99)

- 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.99)

- 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.99)

- "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.99)

- 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.99)

- Removed some further unused variables in WBObjects.


workbench.library 44.388 (2.4.99)

- 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.99)

- 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.99)

- 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.99)

- ^\ 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.99)

- 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.99)

- 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.99)

- 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.99)

- 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.99)

- 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.99)

- 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.99)

- 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.99)

- 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.99)

- 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.99)

- 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 lauched.

  * [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.99)

- 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.99)

- "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.99)

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

- Switched over to 68k code with utility.libray 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.99)

- 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.99)

- 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.99)

- 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.99)

- 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.99)

- 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 lateron, when the node was to be
  removed again.


workbench.library 44.865 (1.5.99)

- 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.99)

- 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.99)

- 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.99)

- 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.99)

- 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.99)

- 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.99)

- 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.99)

- 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.99)

- 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.99)

- 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.99)

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


workbench.library 44.947 (21.6.99)

- 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.99)

- Updated and revised the autodocs.


workbench.library 44.952 (23.6.99)

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


workbench.library 44.954 (23.6.99)

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


workbench.library 44.964 (15.7.99)

- 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
  [Mario Cattaneo].

- Duplicating drawers and files now shows a proper progress
  requester [Michael Christoph].

- 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 [Jochen Becher].


workbench.library 44.966 (20.7.99)

- 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 [Mario Cattaneo].


workbench.library 44.974 (27.7.99)

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

- 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.99)

- Keyboard scrolling no longer works in borderless windows.


workbench.library 44.976 (4.8.99)

- 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.99)

- 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
  [Stefan Rupprecht].

- 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.99)

- 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.99)

- 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 [Mario Cattaneo].

  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.99)

- 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.99)

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


workbench.library 44.1051 (14.8.99)

- 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.99)

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


workbench.library 44.1054 (17.8.99)

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


workbench.library 44.1066 (17.8.99)

- 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.99)

- 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.99)

- 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.99)

- 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.99)

- 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.99)

- 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.99)

- 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.99)

- 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.99)

- 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.99)

- 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.99)

- 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.99)

- 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.99)

- 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.99)

- 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.99)

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


workbench.library 44.1338 (20.9.99)

- 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.99)

- More fixes for FastIPrefs compatibility in IPrefs V44.


workbench.library 44.1347 (21.9.99)

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


workbench.library 44.1349 (23.9.99)

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


workbench.library 44.1372 (25.9.99)

- 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.99)

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

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

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


workbench.library 44.1396 (26.9.99)

- 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.99)

- 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.99)

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


workbench.library 44.1406 (30.9.99)

- 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.99)

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


workbench.library 44.1414 (4.10.99)

- 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 [Mario Cattaneo].

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


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 [Oleg Sergeev
  and Thomas Richter].


workbench.library 44.1559 (8.9.2000)

- Left out icons can be deleted again [David Rey].


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 [Stephan Rupprecht]. Fixed.

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


workbench.library 45.99 (23.11.2000)

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

- 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 [Thomas Richter].

- 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 [Stephan Rupprecht].

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

- 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 [Francis Labrie].

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

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

- 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 [Niels Bache].

- 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
  [Martin Steigerwald].

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

- 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 [Thomas Richter].

- 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.
