Development Log for XaAES

It's a big job....but someone had to do it :)

[27/9/95]
o Began coding XaAES kernal. Where to begin?

[28/9/95]
o Coded alert parser (seemed an easy place to start)
o 3d sculpted dialogs.
o VDI calls from the auto folder/MiNT.CNF now work.
o Auto-folder detection.

OK, perhaps I should get the kernal stuff working before messing about in
the actual GUI bits....

[2/10/95]
o TRAP intercept now works and gets correct parameters from standard AES
  calls.

[3/10/95]
o TRAP intercept now returns values correctly.
o Can now do form_alert calls to XaAES in place of GEM.
o For testing, XaAES currently uses trap 3 instead of trap 2 to allow it to
  be debugged under MultiTOS (until I've got it working far enough to replace
  MultiTOS as my default enviroment).

[5/10/95]
o AES kernal now creates the XaAES.cmd command pipe & blocks waiting for
  instructions to arrive.

[7/10/95]
o appl_init() call now works from other process' and correctly creates
  a reply pipe for that application, then returns the application's AES id
  (which is (under XaAES) the same as the MiNT process id).

[8/10/95]
o Coded the kernal's opcode->function jump table structure.
o Client's now block waiting for reply from the AES server, and actually
  get the right replies. As soon as client blocks on the reply pipe,
  MiNT task switches, allowing the AES server to get in - and other
  process' as well :) .
o appl_exit() stub added.
o form_alert() now works via the XaAES pipes interface.
o Tested with XaAES as sole GUI server without MultiTOS - seems to work ok
  with two client applications at the same time.

[11/10/95]
o Mouse Server coded to handle mouse button clicks without busy waiting
  in the AES kernal - this also prevents clicks being missed (they may
  get delayed slightly, but never lost).
  XaAES spawns MOUSESRV at boot time, and MOUSESRV communicates with XaAES
  kernal via the standard XaAES.cmd pipe using a special op-code and
  AESCMD_NOREPLY mode (direct pipe access, not going via the trap interface).

Now that the bare-bones kernal is up & running and the trap-to-pipe interface
is working, I can get on and do the interesting bits :)

[12/10/95]
o Added evnt_button() code (allows multiple apps to wait on mouse events).

[13/10/95]
o Began coding windowing system. Not sure how to approach the look & feel
  here. I've got some funky sculpted 3D routines, so I'll use them until they
  get slammed for being to slow.

[18/10/95]
o Internal wind_find() now works
o Moved over to a special mouse packet format for communication between
  MOUSESRV & XaAES.
o MOUSESRV now reports coords, an double click timing is much better.
o evnt_button() now correctly returns mouse coords to client app.
o wind_create() and window_open() op-codes now supported.

[20/10/95]
o evnt_button() now only returns events for clicks on the client applications
  windows

[23/10/95]
o wind_close() now supported.
o graf_mouse() now fully supported.
o Mouse cursor enabled when XaAES run from the console without a standard
  Atari AES loaded.
o Client reply pipe is now opened as a local file handle for the client and
  the server (via a new XA_NEW_CLIENT op-code), instead of as a pair of
  global file handles. This allows loads more clients to run at once, as
  the limited number of global file handles isn't used up. I've managed
  30 concurrent applications with no slow-down at all!!!! This is looking
  faster than Geneva, and almost quick enough to catch MagiC (and pisses on
  AES4.1).
o Added an new op-code XA_CLIENT_EXIT to tell the server to close it's end
  of a client reply pipe (allows re-use of the file handle for a new process).

[24/10/95]
o Click on widgets no longer generates a button event to the application, it
  now calls the appropriate callback to handle the widget.

[25/10/95]
o graf_handle() now supported
o graf_mkstate() now supported
o Window dragging is now supported (with a nice custom mover mouse shape).

[30/10/95]
o wind_set() now supported

[1/11/95]
o Moved over to a faster (and simpler) system for handling clients waiting for
  different types of event. I used to use a queue system, now I just set a flag
  in the client descriptor.
o Coded AES messaging system.
o evnt_mesag() now supported

[3/11/95]
o Close widget now sends WM_CLOSED message to the client, and changes state
  when clicked on.
o Mover now sends WM_MOVED message to the client.
o wind_set(..,WF_CURRXYWH,...) in response to a WM_MOVED message now works.

[4/11/95]
o Rectangle list generation implemented.
o Background window moves work correctly.
o Click on title bar now tops a window correctly.

[5/11/95]
o Fixed most of the redraw bugs with windows.
o The client closedown routine now delete's all an apps open windows, and
  deletes pending AES messages.
o Multiple application tests work fine - got 10 programs with two windows each
  running - no slowdown at all, and all seems to work fine.

[6/11/95]
o Finally tried running on trap 2 instead of trap 3, and found I'd forgotten
  that the VDI and the AES share a trap - oops. Added code in the low-level
  handler to field VDI requests to the old trap2 vector. It's a little (well a
  lot) of a kludge
  - there's even a spot of self modifying code in there.....but it does work.
o Linked the test app with ordinary GEM libraries and test ran. The same
  executable definitely runs under AES4.1, TOS4.02 and XaAES without any
  problems - so it's looking good :).
o Stopped using trap 3 for testing now that enough of the system is working to
  interact with.
o wind_get() now supported.
o wind_set(..,WF_BOTTOM,...) added.
o wind_find() now supported.
o Windows can now only be moved if their MOVER attribute is set (even if they
  have a title bar).
o Coded screen and mouse locking.
o wind_update() now supported.
o Using wind_get(...,WF_FIRSTXYWH,...) to walk the rectangle list now works.
o Added compile time switch FORCE_WINDOWS. If set to 1 then user operations on
  windows are done immediately, and the client program is sent a message just
  to say that it has happened (allows windows from apps that are deep in
  thought to be shifted around while we wait for the app to get back to us).
o Added the resizer widget.

[7/11/95]
o Each client app can now have it's own totally seperate mouse cursor shape.
  The one that is actually used is determined by the owner of the top window
  - or if there are no windows open, then by the usual GEM free-for-all method.
  As soon as a window is opened, the owner's cursor takes over.
o wind_set(..,WF_NAME,...) now works (ish).

[8/11/95]
o WM_REDRAW messages are now sent to clients when a redraw is needed.

=================================================================
**                    MINIX PARTITION CRASHED                  **
** Gotta redo the AES messaging - I should backup more often.  **
=================================================================

[12/11/95]
o Got rid of the busy wait loop in the mouse server by using /dev/mouse to wait
  for the initial mouse click, then using VDI vectors to do the double click
  timing.

[13/11/95]
o Moved over to using /dev/mouse fully for the mouse handling.
o Added a bit of a hack (using a stable, compatible method so don't worry) to
  insert coordinates and button states from /dev/mouse into the VDI's internal
  mouse handling routines.

[14/11/95]
o Ditched /dev/mouse again 'coz it's to much hassle to use at the moment.
o graf_dragbox() now supported.
o graf_rubberbox() now supported.

[16/11/95]
o Sizer widget now sends a WM_SIZED message to the client.
o Fixed evnt_button() click to return correct keyboard shift status.
o Click on top window's title bar sends window to the back using a WM_BOTTOMED
  message.

[17/11/95]
o Now using animated colour bitmaps for the standard GEM window widgets.
  Very nice looking :) It's also a fair bit faster than drawing them by hand
  like I was before, but is a great deal nicer than just having a single
  character like in other AES's.
o User work area support added.
o wind_get(.., WF_WORKXYWH, ...) now works.
o Title bar highlighting for top window.
o XaAES logo added to title bar, selected when moving windows.
o Added FULLER widget.

[18/11/95]
o wind_get(.., WF_PREVXYWH, ...) now works
o wind_get(.., WF_FULLXYWH, ...) now works
o Click on FULLER widget now sends WF_FULLED message to client.

[22/11/95]
o Added horizontal and vertical scroll arrow widgets.

[23/11/95]
o Scroll widgets now send WM_ARROWED messages.
o Added an active/pending widget attribute to the client descriptor to help
  support repeated sends from a widget that is held down (ie. the scroll
  arrows).
o Fixed widget redraws when selecting in the background.

[26/11/95]
o Added slider bars to windows.
o Much to my suprise, I found that to a great extent XaAES works in all screen
  modes - I've tested these modes:
   ST-Low
   ST-high
   832*620 mono
   800*600 4 colour
   800*600 16 colour
  They all run, ST-Low is unusable - widgets are too big.
  The mono & 4 colour modes will need a little work, as all the 3D sculpting
  just comes out as black, but the widget bitmaps display OK (but in black
  & white) - a special mono version may be in order to make things more
  presentable.....

[27/11/95]
o Slider bars now actually slide :) - and they send the appropriate
  WM_HSLID/WM_VSLID messages to the client.

==============================================================================
I've now missed the first release date I promised - this is a definitely a
REAL atari program now ;)
(I could even go on to found Microsod Mk2 at this rate)
==============================================================================

[7/12/95]
o Added a XaAES logo displayed at startup (actually it's a seperate program
  spawned during the boot sequence). Not very constructive I know, but it does
  look quite pretty

[8/12/95]
o Ditched the slider bar handling as I wasn't happy with it, and coded a
  replacement.

[9/12/95]
o XaAES changes it's process priority to -20 on startup (ie. highest priority).
  This improves performance loads, and doesn't slow down other programs, as
  XaAES spends most of it's time blocked anyway...but when you need it, it
  responds faster now.

[10/12/95]
o Got the Atari Compendium....
o Fixed appl_init() to fill in the globl array correctly.
o Added wind_delete() call.
o Added wind_new() call.
o wind_get/set(.., WF_HSLIDE, ...) now works
o wind_get/set(.., WF_VSLIDE, ...) now works
o wind_get/set(.., WF_HSLSIZE, ...) now works
o wind_get/set(.., WF_VSLSIZE, ...) now works

==============================================================================
Definitely suffering from binary bloat - the Kernal is now a 51K binary...
==============================================================================

[13/12/95]
o Added info bar widget.
o wind_set(.., WF_INFO, ...) now works

[20/12/95]
o Added evnt_timer() handling via the MiNT SIGALRM signal.
  At the moment this only gives a resolution of one second, as I used the
  Talarm() function to implement it - I'll replace this with a custom
  vex_timv() routine that gives a better resolution at a later date as this
  makes things like LINES seem dead slow 'coz the shortest timeout from an
  evnt_multi() is 1 second.

[28/12/95]
o Added evnt_keybd() using the /dev/console device.
o Added use of Fselect() to block on the console device & the AES message pipe
  at the same time.
o Added evnt_multi().
o Added a 'xaaes.cnf' file parser (compatible with GEM.CNF) that allows
  programs to be auto-run by XaAES when it starts up.

[29/12/95]
o Added rsrc_load() based on the resource handler from Steve Sowerby's AGiLE
  library.
o Added rsrc_gaddr()
o Added rsrc_free()
o Debugged the keyboard handling & added a kludge to cope with the MiNT Fselect
  bug.

====================
New Year's......2 weeks drunk!!!
====================

[12/1/96]
o Bit of a gap there..... ;)
o Fixed the resource loader
o Added the basic objc_draw() tree handler routine.
o Added rsrc_obfix()
o Added some extra debugging facilities - a DEBUG command in the xaaes.cnf file
  allows xaaes' console output to be re-directed to any file or device (I use it
  to dump debug to my Wyse terminal via the serial port).

[16/1/96]
o Added objc_offset()
o Added wind_find()
o Finally got a 'real' GEM program to run on XaAES - Calapt by Atari....
o Changed widget sizing & placement to tidy things up a bit.

[17/1/96]
o Added objc_find()

[18/1/96]
o Added small font size support to object handler.
o Added support for AES4.1 style GDOS font's in object tree's.
o Made the default AES fonts & sizes a compile time option.
o Fixed objc_find
o Actually got some GEM programs to respond to their windowed dialogs!!!!

[19/1/96]
o Programs run from xaaes.cnf are now launched in their home directories.
o Added G_ICON support to the object handler.
o Fixed the fill styles to be correct for object tree display.

[21/1/96]
o Added G_CICON colour icon support to the object handler.
o Added G_IMAGE support to the object handler.

[23/1/96]
o Included a new root_window into the code - this is to provide support for
  a desktop via the existing window system.
o Added a new widget 'XAW_MENU' that any window can have - initially, only
  the root window has it & that behaves like the GEM menu (taking over the
  menu of the topped process).
o Lattice C almost runs under XaAES now (thank god).

[26/1/96]
o Coded the menu tree handler to go with the XAW_MENU widget.
o Moved the mouse data stream into it's own pipe, seperate from the AES
  command stream. This has improved mouse response a bit, as mouse
  packets now don't get bogged down in amongst the client data (if mouse
  & client packets arrive at the same time, they both get processed
  but the mouse gets done first).
o Modified the mouse server to use the new data pipe, and improved single
  click response.
o Added a check for mouse movement in the mouse server double click wait
  loop. Big improvement, click and drag now registers with no delay at all...
o Added menu_bar() function
o Added menu_tnormal()
o Added menu_icheck()
o Added menu_ienable()
o Added menu_text()
o Extened the XA_CLIENT structure to include a pointer to each client's standard
  GEM menu bar.
o Added appl_getinfo()

=====================================================================================
Big landmark here. I finally got Lattice C to load & run correctly under XaAES
- it's not a lot of use yet as I've not done a file selector or a lot of the
forms code....but the bloody thing at least gives me the menu's and an edit window.

Also, as I've managed to get to the bottom of the click-drag bug, the response time
is way up - faster than AES4.1 at any rate!!!!
=====================================================================================

[28/1/96]
o Added G_STRING,G_FTEXT & G_FBOXTEXT support to the object handler.
o Added form_dial() call.
o CTRL+ALT+TAB now swaps menu-bars between active clients.
o Improved menu handling a bit.
o Added menu_register().
o Added graf_growbox()/shrinkbox()
o Added graf_movebox()
o Added appl_find()
o My life is complete - Yukon (the solitaire game) runs under XaAES almost perfectly....

[29/1/96]
o Thanks to the MiNT mailling list for pointing out that there is a Tmalarm() call for
  millisecond resolution alarm signals....evnt_timer() is now much closer to the
  'real thing'.

[30/1/96]
o Improved wind_calc() to actually get borders right without messing about examining
  each individual widget.
o Small optimisation of the client redraw list handling to clip just to the work area
  instead of the window.
o Added support for selected objects in the object tree hander.
o Added support for 3D object flags in the object tree hander.
o Added SHADOW flag support in the object tree handler.
o Added G_BUTTON objects.

[31/1/96]
o Added graf_watchbox() function
o Added form_button() function (no text field support at the moment)
o appl_init() now supports the AES4.0 extended information about system font sizes.
o Added a kludge for the strange illegal / undocumented call that TOSWIN makes on
  startup (you can find it in HANDLER.C).

[1/2/96]
o Fixed the keyboard & mouse response problem when using evnt_multi() with a timer
  - the un-used timers were staying in the delta queue if they hadn't gone off when
  the first alternative event occurred, and then interfering with subsequent key/mouse
  events.

[5/2/96]
o Added a simple console window (to be honest it's a bit crap....)
o Added a new call 'short appl_pipe(void);' - this returns the file handle of the
  clients reply pipe so they can use non-blocking calls & handle piped replies
  themselves.
o Re-worked the keyboard handling (again) to try and fix the lost characters problem.
o The client reply pipe handle can now be found in the AES global array at global[12].

=====================================================================================
Well, no way to delay it any further.......techie beta 1 went out today.
=====================================================================================

[6/2/96]
o Fixed a bug in drawing shadowed objects.
o (ref:31/1/96) Thanks to Eric Smith for pointing out that the funny call that TOSWIN
  was making is in fact vq_gdos(), though why Atari had to add a special case call
  is beyond me......what was wrong with the ordinary VDI magic number?
o Added support in the low-level trap handler for the '$c9' method of testing for an
  installed AES.

[7/2/96]
o Object-Tree widgets now work for types other than menus.
o Added HIDETREE support to the tree display routines.
o Now got a nice set of pretty icons for alert boxes....
  These are currently loaded from an external resource file - I'll embedd them when
  things are a bit more settled.
o Re-worked the alert box handler (the other was just a debugging aid).
  Now supports all AES4.1 icons, and a couple more, returns the correct button,
  and uses proper 3D push buttons.
o Alerts now displayed in windows, and don't block other processes.
o AES owned windows now don't recieve topped/bottomed messages - they are done
  automatically. (eg. the AES owns alert windows, but doesn't need the messages, so
  we can just top & bottom the alert windows immediately)
o Extended window attribute NO_REDRAWS stops windows from generating WM_REDRAW messages.
o Added semaphore locking to the sensitive areas of the Trap handler (just in case).
o Another extended window attribute, STORE_BACK. If this is set, a window will preserve
  it's own background (like alerts do under normal GEM). Useful for alert windows,
  where the client is asleep & cann't respond to redraw messages, and also to provide
o Alerts use STORE_BACK window attribute.

[8/2/96]
o New search order for xaaes.cnf:
   .\xaaes.cnf
   u:\c\mint\xaaes.cnf
   u:\c\multitos\xaaes.cnf
   u:\c\xaaes.cnf
o New keyboard combo's
   ALT+CTRL+TAB   - swap app menus (not top app) (ok, that's an old one, but it's
                    documented now)
   ALT+CTRL+L     - list current clients to DIAGS/'debug device'
   ALT+CTRL+K     - tidy up: cleans up after any apps that died without calling
                    appl_exit()

[9/2/96]
o Added form_do() call (only creates & displays non-modal dialog window at the moment)

[10/2/96]
o Implemented the form_do() click handler. Doesn't know about editable text fields yet,
  but does do radio buttons, hidden, disabled, exit & touchexit.
o Added scrap_read() & scrap_write()
o New command CLIPBOARD in the xaaes.cnf file allows the default clipboard path to be
  set on startup.
o Modified the initialisation code so that apps that weren't launched with shell_write()
  don't crash xaaes when they call shell_read().
o Added a fix-up for menu trees, as some resource files don't have the right spacing &
  stuff (and my resource loader doesn't do them).
o Added objc_change() call.
o Form_dial(FMD_START) now creates the window to put a dialog in....this helps
  with programs that call FMD_START, then handle their own dialog interaction.
o Argggghhhhh. Where was all my memory going? Found (and fixed) a massive memory leak
  in the menu handler. Every time a menu was dropped down, a new buffer was allocated
  - but I never got round to freeing them......sorted it out now though.
o Fixed the transparent G_BOX problem in the object tree routines.
o Fixed vertical positioning problem with small texts in dialogs.
o The inherited default dialog background colour mode is now supported by the
  object tree routines.

=====================================================================================
Hmmm. Beta 1 was a bit of a disaster, very few people could make it work, and there
were a lot of real problems with it. Things are much better now though, with several
programs running perfectly (Z'Org for instance).
=====================================================================================

[11/2/96]
o Extended the applications list to include what apps are waiting for.
o Included a new ALT+CTRL+D key combo to dump system info.
o Re-coded the mouse clicks handler, so the app that owns the mouse lock
  gets all clicks, even those outside of it's own windos.
o Finished form_button()

=====================================================================================
The XaAES mailling list starts today.
Had a play with the competition (oAESis), and found it doesn't run as many programs
as XaAES does - but it does run some XaAES doesn't (like Lines for instance).
Got XaAES to run Pagestream today, which cheered me up.
Checked out the performance of XaAES compared to oAESis - oops....oAESis piss's
all over XaAES in terms of speed....
=====================================================================================

[12/2/96]
o Added a call_direct interface in the trap handler for functions that don't
  impact on main memory to any great extent.....this by passes the pipe's queue
  to call routines direct. I know, it's gonna be a pig to debug...but the performance
  gain you get from doing it is amazing - TOSWIN runs so fast I didn't believe it
  at first.... It doesn't have to be used for everything, just for common 'quickie'
  calls. NOTE: I've not used this generally at the moment to avoid memory ownership
  problems - and it makes things very unstable......
o Re-coded wind_update to use semaphores & call_direct....first big improvement
  from the new system.

[13/2/96]
o Nicked the rc_intersect code from oAESis - it was better than mine.
o Re-worked the rectangle list generation to use the above poached code.
o Added loads more semaphore locking on various ops (mostly in c_window.c).
o More work on the trap handler.
o Appl_init() now allocates a private stack for use during AES calls.

=====================================================================================
Got Johan's GCC diffs - gotta find time to include them (probably over the weekend).
Got Martin's Lattice diffs.
=====================================================================================

[14/2/96]
o Applied Martin Koehling's diffs - here's his summary of what got fixed....

----Quote----
This is my first take on hacking XaAES; a context diff (relative to
the beta1 release) is appended to this message. [CRAIG NOTE: I've applied
the diffs already.....]

Summary of changes (I hope I didn't forget anything):

a_handler.s:
        Modified the TRAP2 handler to use the XBRA protocol (no
        more self modifying code, too).
a_handler.s:
        BUGFIX: TRAP2 handler now saves *all* modified registers (AFAIK,
        GEM AES does the same, and some APPs/TSRs rely on this [undocumented]
        behaviour)
handler.c:
        Modified hook_into_vector to use Setexc() instead of directly
        hacking the exception vector table; patch_handler() is no longer
        needed. New function unhook_from_vector().
handler.c:
        Added __saveds keyword to XA_handler(), thus eliminating the need
        for `far' data.
appl_init.c:
        Removed a few `far' keywords.
resource.c:
        BUGFIX: improved obfix() to be more GEM AES compatible (fractional
        offsets, ob_width==80 special case).
std_widg.c:
        BUGFIX: wind->widgets[XAW_MENU].w wasn't initialized at all.
        NOTE: there seems to be still another missing-initialization bug
        lurking somewhere - when the FASTLOAD bit is *set*, xaaes.tos
        sometimes simply hangs when I start it from the desktop; this
        does *not* happen when xaaes.tos was started from mint.cnf
        (->clean memory) or when the FASTLOAD bit is *cleared*...
bootup.c:
        If there are less than 16 colors (or was that `colours'? ;-)) available
        (like on my monochrome monitor), initialize display.dial_colours
        differently; the display is still terribly ugly, but at least now
        I can *see* something besides black text on black ground... :-)
bootup.c:
        BUGFIX: use vqt_attributes() (instead of vqt_extend()) to initialize
        display.c_max_w/display.c_max_h - this yields the correct values
        8 and 16 for the `monochrome' system font.
bootup.c:
        BUGFIX: use obfix() in SYSTEM_MENU initialization; don't forget
        SYSTEM_MENU[16] :-).
bootup.c:
        Use a different method for AUTO folder detection: after an
        appl_init() call, check if global[0] (AES version) is still
        zero - this indicates that no AES is present...
        (This method has been documented and successfully used for
        years, and it's inituitively "cleaner" than the original one; in
        addition, it obviates the need for the isauto.s module.)
        (appl_init() should have been called anyway since graf_handle()
        is called later...)
bootup.c:
        New function `Cleanup()' that closes workstations, restores
        the TRAP vector, calls appl_exit()...
        Still quite incomplete (and currently unused anyway).
Others:
        Some changes to header files to reflect the above modifications.
        Added `#include <memory.h>' to a few modules to get rid of `No
        prototype declared for function' warning (some are still missing).
----Un-Quote----
  All of the above went in apart from the obfix() stuff and register save mod,
  which I'd already done.
  Seem's to have improved stability a lot, especially for call-direct ops, and
  there's a lot of other good stuff like the XBRA support in there as well.

[15/2/96]
o Fixed a bug in the draw_object_tree() routine (HIDETREE wasn't handled properly).
o Enabled direct call for more op-codes to improve performance.

[16/2/96]
o Included Mario Becroft's monochrome widget set as a compile time option.
o Tested XaAES in mono for the first time in ages....hmmm. Certainly works,
  but you cann't see windows except for the widgets. Needs some work I feel....

[17/2/96]
o Added shel_find() (uses the standard MiNT enviroment)
o Added shel_envrn()
o New keyboard combo ALT+CTRL+R - attempts to recover control of a hung system.
o Added mode 1 (SWM_LAUNCHNOW) support to shell_write().
o Added a SIGCHLD handler to spot exitting children.
o appl_exit now calls Pwait() to get the app exit status

[18/2/96]
o Removed all the delta-queue stuff, and replaced the timer events with a more
  advanced and versatile method based on Evan's idea of using Fselect time-outs instead
  of SIGALRM signals. This does away with having to maintain the delta queue & simplifies
  cancelling evnt_multi. It does mean that the trap handler is a bit more complex now...

=====================================================================================
Beta 2 released via Johan's ftp site today
=====================================================================================

[19/2/96]
o Added a check for missing system resource file (exit gracefully instead of bus error).
o Fixed a bug in the SIGCHLD handler (wasn't extracting the child pid correctly)
  - dieing children are now caught correctly and clean-up happens automatically.
o Added new 'About XaAES...' dialog.
o Added handler for clicks on the system default menubar - only 'About' is actually
  used at the moment, but at least the code is there now.
o Fixed the CTRL+ALT+TAB app switch so that you can always get to the system menu if you
  need to.

[20/2/96]
o Integrated Martin Koehling's 2nd set of diffs - here's Martin's list of changes:

----Quote----
bootup.c:
   Remove Semaphores in Cleanup().
   Print an error message and call Cleanup() & exit when opening of
   KBD_device failed.
   Ditto when LoadResources("system.rsc") failed.
   (The latter would have saved me two to three hours of bug-hunting
   yesterday...)
resource.c:
   Removed auto-freeing of existing resource in rsrc_load handler;
   under GEM AES, programs *can* have multiple resources.
   (This function still needs some more work - in particular,
   resource memory should *always* be owned by the APP!)
xa_aes.prj (separate file):
   Removed all local compiler options - apparently they had just
   accumulated over time and served no practical purpose...
   (problem of of the Lattice IDE)
   [CRAIGS NOTE: They are a side effect of how I locally turn on diagnostics output
    when I'm debugging: I only define GENERATE_DIAGS for the modules I'm working on...]
Others:
   Lots and lots of added #includes; XaAES should now compile without
   any warnings even with `Enforce function prototypes' enabled - this
   should make porting XaAES to other compilers (or changing the `int'
   size, or changing the parameter passing conventions) somewhat
   easier...
----Unquote----

...And yes, it does compile with no warnings even with Enforced prototypes.

o Added a new auto-redraw callback function to windows, to allow the work area
  to be redraw automatically without sending redraw messages or walking the
  rectangle list. This is mainly aimed at displaying the root window.....but it
  could be useful for other things?
o Added the desktop/root window object tree.
o Made the root window a NO_MESSAGES type window - we had a memory leak there, as
  the AES never checks for messages to itself, redraws were just building up...and
  it can redraw itself using auto-redraw, so there is no to send messages.
o Removed the erase_nontopped_window() function as the desktop support
  made it redundant.
o Changed the way window redraws are calculated in display_windows_below()
  to prevent all windows below being drawn even when they are obscured by
  other windows.

[21/2/96]
o Added wind_get(...,WF_NEWDESK,...)
o Added wind_set(...,WF_NEWDESK,...)
o Integrated Martin's bugfix for the semaphores version of wind_update() function
  (with a small fix to a bug in Martin's version).
o Added a new wind_set() mode WF_AUTOREDRAW. This allows a windows auto-redraw function
  to be set. Takes a pointer to a WindowCallback type function, passed in
  parm1 (hi word) & parm2 (low word):
   short my_redraw_function(XA_WINDOW *window)
   {
      /* Do the redraw, using the coords from the XA_WINDOW structure */
   }

   void set_a_redraw(void)
   {
      WindowCallback rd=&my_redraw_function;
      wind_set(my_window_handle, WF_AUTOREDRAW,
         (unsigned short)((rd&0xffff0000L)>>16), (unsigned short)(rd&0xffffL), 0,0);
   }
o Added PROGDEF support to the object tree handler.
o Went over most of the source replacing vs_clip() with set_clip() 'coz the
  PROGDEF's needed to know the current AES clipping rectangle :(
  (I'm dead pissed off about that, but cann't see a way round it).
o Added appl_write() function - direct result is that AV-PROTOCOL applications
  (GEMVIEW for example) now work under XaAES when run with Thing.

=====================================================================================
Hey!!! 'Thing' now display's it's desktop & directory windows properly, with colour
icons, backdrops, drag & drop onto the desktop....the works!!!

The redraw algorithm is still very iffy - the whole desktop gets redrawn far to
often.
=====================================================================================

[22/2/96]
o Improved the menu_xxx functions to prevent the redrawing of the whole desktop
  each time.
o Added wind_set(.., WF_STOREBACK, ...) to allow user programs to set their own
  store background property.

[24/2/96]
o Hacked around with the window redraws to get rid of some more root redraws.
o Fixed graf_handle() to give correct character cell sizes.
o Root window clicks now go to the current owner of the desktop (so clicking on
  Thing's desktop icons works).
o Fixed form_button() - Thing's dialogs work now.

[25/2/96]
o Ran Johan's xlcc2gcc program over the source tree to remove all C++ style
  comments.
o Applied about 2 thirds of Thomas' diffs.
  - most notable fix is that shel_wrt() works properly now (mode 0 at least).

[2/3/96]
o Sorted out some problems with window list locking, so that wind_get()
  could move over to direct call. This fixes the major speed problem
  XaAES had, and also seems to have made things a lot more stable (but I
  always say that don't I ?).
o Removed the funny sliders that everyone was complaining about.


[3/3/96]
o Added appl_search()
o Fixed problem with window slider paging (added a click behaviour to the widgets).
o Added drop shadows to windows.
o Reduced size of object shadows to 2 pixels to match GEM (some apps make assumptions
  about this when storing backgrounds).
o Object tree handler: CICON's will use nest best colour depth if an exact match cannot
  be found (eg. if there is a 16 colour icon, it will be used in 256 mode if there is no
  256 icons).

[4/3/96]
o Menu's only redraw sections that are changing rather than the whole menu.
o Changed to a more 'GEM' method of highlighting menu options.
o Fixed CICON's (again). Resource loader now uprates all CICON's to the current
  screen colour depth on loading (eg. 4 bit plane will convert to 8 bit plane when
  run in 256 colour mode). There's still some nasty bugs in this code....

[5/3/96]
o Applied Martin Koehling's appl_getinfo() patch.
  This fixed a couple of problems with one or two apps - notably, 7UP & Kandinsky
  work now because of this...

===============================================
HARDDRIVE CRASH
- Luck recovery....
===============================================

=====================================================================================
Beta 3 released.
=====================================================================================

[8/3/96]
o Fixed form_button() so that objects without their selectable attribute set still
  return if they are EXIT or TOUCHEXIT. This means that Thing's scrolling lists in
  dialogs now work correctly.

[9/3/96]
o Started adding underlying support for keyboard entry into forms.
o Added a new callback attribute for windows to handle keyboard entry. If an edit field
  is specified in form_do() then this attribute is set for the window containing the
  form.
o New ob_flag bit IS_EDIT tags the current edit field so that the object drawing
  routines know to show the cursor.

[10/3/96]
o Added support to the form click handler to change the current edit field if an EDITABLE
  object is clicked on.
o Fixed non-3D button drawing.
o Fixed radio button redraw.
o Fixed the CTRL+ALT+R 'recover control' combo so that XaAES doesn't crash when it's used.
o Fixed appl_search() to not return illegal values for AES id's.
o SIGCHLD handler doesn't try to do any clean-up now, it just sends the
  XA_CLIENT_EXIT message to the kernal, and the standard cleanup handles it.

[11/3/96]
o Fixed shel_write() TOS program launch to drop the correct info into the
  TOSRUN pipe for TOSWIN to run the TOS program for you.

[20/3/96]
o Applied 2 sets of diffs from Martin (see 5diff & 6diff).

[21/3/96]
o Coded the keyboard handler for form_do(). The following are supported:
  Field selection:
      TAB or DOWN-ARROW    - next field
      UP-ARROW             - previous field
      SHIFT+DOWN-ARROW     - last field
      SHIFT+UP-ARROW       - first field
   Cursor movement:
      RIGHT-ARROW          - cursor right
      LEFT-ARROW           - cursor left
      SHIFT+RIGHT-ARROW    - cursor to end of field
      SHIFT+LEFT-ARROR or
         CLR/HOME          - cursor to start of field
   Editting:
      ESCAPE               - clear field
      DEL                  - delete character under cursor
      BACKSPACE            - delete character behind cursor

   other keys go straight into the text field.


[22/3/96]
o Added the display function for the iconify widget.
o Appl_getinfo(11) modified to indicate presence of iconifier widget.
o Added wind_set(.., WF_ICONIFY, ...) support.
o Added wind_get(.., WF_ICONIFY, ...) support.
o Click on iconify widget now sends WM_ICONIFY message to client.

[23/3/96]
o Added wind_set(.., WF_UNICONIFY, ...) support.
o Added wind_get(.., WF_UNICONIFY, ...) support.
o Click on iconify widget of an iconified window now sends WM_UNICONIFY message
  to client.
o Double-click on title widget of an iconified window now also sends WM_UNICONIFY message
  to client.

=====================================================================================
After discussing it with Martin, we've decided to ditch the big clients[] array in
the near future. The use of the Martin's Pid2Client() macro is an interim thing. Once all
direct access to the clients[] array has been replaced with Pid2Client() we can replace
the array with a dynamic structure that doesn't swallow 120K of RAM to no good reason.
=====================================================================================

[24/3/96]
o Another big diff from Martin Koehling:

----Quote----
objects.c, objects.h, many *.c:
   BUGFIX:
   Changed parameter list for set_clip() from `x1,y1,x2,y2' to `x,y,w,h'.
   Changing all set_clip() calls accordingly removed many of the `+1'
   errors, and saved a few bytes, too.
objects.c:
   clear_clip() now doesn't really turn clipping off but only sets the
   clipping rectangle to the entire screen - this is safer since
   otherwise memory areas outside the screen might be overwritten by
   buggy code! (Probably depending on function called and VDI version...)
rectlist.c:
   BUGFIX:
   Since the redraw problems had actually gotten *worse* after the
   set_clip() changes (some bugs had apparently cancelled each other),
   I first replaced rc_intersect() with a time-proven version; but this
   wasn't the problem...
   (I kept the new version because it's more readable and actually
   about 50 bytes shorter than the original. :-))
   The *real* bugs were in generate_rect_list(): after removing
   several instances of `-1'/`+1', redraws work *much* better now...
   (There are still a few problems - I suspect bugs in the calculation
   of window work/border areas...)
shellwrt.c, new_clnt.c, bootup.c:
   BUGFIX:
   shel_write() used to free the command line and the command
   tail - much too early!
   Moved this to XA_client_exit().
wind_fns.c:
   Added test-and-set-mode to wind_update() (BEG_UPDATE|0x100,
   BEG_MCTRL|0x100); would somebody please try this out? ;-)
appl_ini.c:
   EXPERIMENTAL:
   Put AES version number 1.4 (instead of 4.1) into global[] array;
   possibly some programs are crashing because they expect MTOS (AES 4.x)
   features to be present that are not yet implemented???
   <CRAIG'S NOTE: This isn't such a good idea so I've #if'd it out of the binary>
getinfo.c:
   Some changes to info_tab[]:
   - mode 4: indicate that appl_search() is implemented
   - mode 10: indicate shel_write() modes supported
   - mode 11: indicate `wind_update() check and set present'
getinfo.c:
   BUGFIX:
   appl_find(NULL) should returns the AES process id of current
   process, *not* the menu bar owner - at least according to all
   documentation I have access to.
getinfo.c:
   appl_find("?AGI") now returns 0, indicating that appl_getinfo()
   is understood by the current AES - normally this function is
   only present in AES versions >= 4.0 (i.e. MTOS; old AES versions
   display an "Illegal Function" alert instead).
   The "?AGI" feature was invented by Martin Osieka for his
   AES extension WINX, which adds appl_getinfo() (and other
   things) to "old" AES versions; MagiC 4.0 (AES 3.99!) supports
   "?AGI", too.
   The proper way of checking for the presence of appl_getinfo()
   is:
   `has_appl_getinfo = (global[0]>=0x400) || (appl_find("?AGI")==0) ;'
appl_ini.c, c_window.c, new_clnt.c:
   Replaced direct accesses to clients[] array by Pid2Client() calls.

----UnQuote----

o There was one thing in that diff that Martin seems to have forgotten he did
  - if you hold down either shift key during startup, XaAES will swap to medium
  res if it was being started in Low Res. It's not quite the all singing all
  dancing res change we talked about on the mailling list yet, but it's sort of
  a start isn't it?
o Fixed window drop-shadow bug.

[27/3/96]
o Added objc_edit()
o Added form_keybd()

[28/3/96]
o Added Martin's appl_ini() patch to get round an apparent MiNT pipe deletion bug.
  (this is what was stopping lines.prg from working, see 8diff for details)
o Debugged objc_edit()
o Mono icons now display their text field correctly.
o BOXTEXT's now get border properly.


[29/3/96]
o Added falcon video mode switches to the command line:
      -video 0->3
   where:
      0 = 80 column, non-interlace, mono
      1 = 80 column, non-interlace, 4 colour
      2 = 80 column, non-interlace, 16 colour
      3 = 80 column, non-interlace, 256 colour
  These don't work very well at the moment, but do get round the NVDI2.5 problem.
o Added Shutdown option to the XaAES system menu. This isn't 100% yet, but it's a start...
  Shutdown will kill all clients, and exit XaAES - but you cann't get back into XaAES
  again at the moment, so I've obviously missed something....


[31/3/96]
o Added new functions (OBJECT*)CloneForm(OBJECT*) and (void)DeleteClone(OBJECT*) to
  create copies of the resource templates in SYSTEM.RSC (this stops multiple clients
  using alerts from interfering with one another).
o Alert box handler now uses the CloneForm/DeleteClone routines.
o Added proper XBRA unhook to restore the correst AES trap vector.
o Major change to the architecture of XaAES:
  The XaAES.cmd pipe is no longer a global file handle. The reason for this is to ensure
  that all XaAES's pipes get deleted when the system is shutdown - otherwise if you
  restarted XaAES without re-booting, the new server couldn't open the command pipe.
  The new approach is to have XaAES.cmd as opened by one process at a time, and then only
  during appl_init(). The process uses XaAES.cmd as an 'introduction pipe' to send an
  XA_NEW_CLIENT message, then closes it again. The main body of commands comes
  from what used to be the clients reply pipe (this is now a bi-directional pipe), and
  the kernal selects on all the client pipes at the same time.
  This is a pretty major change, and I've only done it because several people asked
  for a clean shutdown/restart procedure without having to reboot the machine. Ok, you've
  got it.
o 'Shutdown' works correctly, and XaAES can be re-started as many times as you like (only
  one server at a time though) without rebooting the machine (from a command line).
o MOUSESRV opens it's comms pipe as O_RDWR to allow it to be deleted again.
o SIGINT and SIGQUIT are now caught and cause a graceful shutdown (exactly like selecting
  the 'Shutdown' menu option).

=====================================================================================
Beta 4 released.
=====================================================================================

[2/4/96]
o Johan mailled me James Cox's MooseServ replacement for the MOUS_SRV mouse
  program (I missed it when he first posted it). It's a great improvement
  over the original that I wrote, a proper MiNT device, all coded in
  assembler - the full works. It's gotta become the standard XaAES mouse
  handler starting from now - mainly because it does away with the busy wait
  loop in the mouse handler, but also because double click response is
  much better than it was in my version.

[9/4/96]
o Fixed graf_watchbox() - sorry, that was an error in Atari Compendium
  as regards where parameters were passed (that was why Everest didn't work up to
  now).
o Added some code to not select objects that aren't selectable in
  form_butn().
o Added CH_EXIT message to the SIGCHLD handler. This is now sent to the 'AES parent'
  of an app. This is different to the MiNT parent - all client apps should be
  children of the XaAES server, bgut their 'AES parent' is the app that launched them
  with shel_write().
o Shel_write() mode 1 now blocks the client (as it should), and the SIGCHLD handler
  wakes it up again when the child exits.

[12/4/96]
o Johan found the problem with running MGIF, so I've fixed it - menu_text() was just
  changing the pointer to the menu text, instead of copying the text over the existing
  data (as it should have done).

[16/4/96]
o Fixed a bug in shel_write() - XaAES was corrupting the clients copy of the command
  when it launched the new program, so if the client attempted to re-use the command
  string it was invalid (this showed up when running AntMail 0.7.5).

[17/4/96]
o Added CHECKED & CROSSED support to the object display routines.
o Added the new XaAES/oAESis extended shel_write() stuff to allow explicit setting
  of user/group id's when a child is launched. Haven't done the UID/GID inheritance
  stuff yet (that will need a little more work).

[18/4/96]
o Added tear away menu bar's (CTRL+click on a menu to tear away). This isn't a final
  thing, it's just really to show how easy it is to add this sort of thing to XaAES.
o Added support for NO_WORK window attribute, so a window can have no work area at all.
o Alert box's & form_do() now use NO_WORK windows.
o Alert box default button set correctly (although the keypress is ignored at the moment).
o Disabled the OS_SPECIAL memory patch (new switch in XA_DEFS.H 'DODGY_MEMORY_PROTECTION')
  as I think it causes a massive memory leak in the MiNT kernal.

[19/4/96]
o Various fixes to the object tree drawing routines.
  - Finally sorted out the black bars problem.
  - Selected text is now highlighted.

[25/4/96]
o The owner of the screen update flag now recieves all mouse input even
  if it hasn't grabbed the mouse flag.
o The owner of the screen update flag now recieves all keyboard input
  as well. These two patches help several programs to work better
  with the Selectric fileselector (notabley, Egale works now).
o Replaced form_do.c, forms.c & objcedit.c with Johan's patched
  versions - the form handling should work a little better now.
o Added hide/show cursor to the objc_draw & objc_change functions
  - this gets rid of almost all the 'mouse droppings' that we were
  suffering.

[26/4/96]
o Got a new version of the Moose (mouse) server from James Cox. The actual device
  driver is now a MiNT loadable device (XDD) and remains loaded all the time. Eventually
  we'll scrap the mousesrv program and use the device directly :)

[27/4/96]
o All OS functions now return unsigned long instead of short.
o Removed the 16 tick minimum on event timeouts - you can now do a timeout with 1.
o appl_init() & appl_exit() now block the client until the server process recieves
  the (de)registration message.
o appl_init() & appl_exit() no longer special cased (that was leftover from before
  I added the call direct interface).

[30/4/96]
o Applied Martin's object display diffs:

---Quote---

xa_globl.h:
-  Added macros FirstClient() and NextClient() - useful for all
   functions traversing the entire client table (used in bootup.c
   only at the moment).

objects.c, draw_2d_box(): **************Martin's version of this is a bit duff [Craig]
-  Rewritten completely (outside/inside borders were reversed [IIRC],
   outside borders looked rather strange).

objects.c, display_object():
-  Lots and lots of changes - object appearance should match
   GEM AES much better now!
-  Rewrote SELECTED handling in mono (<16 colors) mode - this
   fixed the "object text in SELECTED objects vanishes in mono
   mode" problem.
-  Shadowing and outlining objects now works correctly.
-  Fixed colorword->opaque handling (which does only apply to
   text within an object, not to object body).
-  Slightly changed USERDEF handling: the user function is
   supposed to return the ob_state bits that still need to
   be handled by the AES; since all documentation on this
   topic is *very* vague (and earlier experiments weren't
   conclusive either), I'm not *quite* sure if my change
   is correct - but it doesn't appear to break anything!
-  Added support for object states CHECKED, CROSSED, DISABLED.

   ********* NOTE: *********
   I did *NOT* test all of this in ">=16 color" modes yet - but
   I hope my changes didn't break anything; 3D objects should be
   unchanged, too...
   COLOR USERS: PLEASE TEST THIS!

objects.c, draw_object_tree():
-  Added v_hide_c() and v_show_c() - the caller doesn't need to
   call this anymore.

form_do.c, click_object_widget():
-  It wasn't possible to de-select a SELECTED object by clicking
   on it - on the screen it was de-selected, but internally the
   SELECTED bit got set again!

forms.c, XA_form_button():
-  Fixed width/height parameters of a set_clip() call (overlooked
   last time).
-  Don't SELECT a TOUCHEXIT object if it isn't SELECTABLE, too.
   (Actually, there are still several other special cases not
   handled quite correctly - but I think this can wait...)

frm_alrt.c, do_form_alert():
-  Set interior color of alert box to "system background color"
   in "monochrome" (<16 colors) mode.
-  Make alert buttons 2D in monochrome mode (color buttons are
   still "black text on black background")

mousesrv.c:
-  Added a SIGTERM handler, allowing to restore interrupt vectors
   before termination.
   (I'm not quite sure why nobody reported any problems with the
   SHUTDOWN handling - I regularly had crashes after terminating
   XaAES if it was started from the DESKTOP; possibly some AES
   versions are more forgiving in this area than my AES 3.2
   (TOS 2.06)??) (I'm still having trouble if I restart XaAES
   after a SHUTDOWN - but at least it works most of the time...)

   BTW: James Cox' moose server probably presents a *major*
   problem in this regard - it installs a device driver, and
   MiNT has *no* way to cleanly de-install one of those... :-(
   (*PLEASE*: correct me if I'm worng!!:-))
   This means basically that the server must *never* be killed;
   in addition, there needs to be a way (Fcntl?) to disable
   the server when XaAES exits, and to re-enable it when XaAES
   is started again...

bootup.c:
-  Send SIGTERM instead of SIGKILL to the mouse server - SIGKILL
   can't be caught!
-  Wait for the mouse server's termination before proceeding
   (important!!!).
-  Send SIGTERM instead of SIGKILL to apps, too; probably XaAES
   *should* wait for the applications' termination, too - but I'll
   leave this alone for the moment...
-  Pass *physical* (not: virtual) workstation handle to mouse server;
   the docs are not very clear on this point - but this *seems* to
   be cleaner, since the VDI interrupt vectors are not a "per-
   vworkstation" resource...
-  Simplfied F_OS_SPECIAL setting: "u:\proc\.-1" refers to the
   current process (as documented in Appendix B of the MiNT 1.12
   docs).
   ********* BTW: re: "Why does XaAES still crash with memory
   protection on?"
   Craig: did you try setting the protection bits of MOUSESRV.TOS
   to SUPER? This is necessary since it contains interrupt handler
   code...

logo.c:
-  Added WM_BOTTOMED/WF_BOTTOM defs (not defined in my aes.h).

---UnQuote---

[3/5/96]
o Finally got things working properly again after putting in Martin & Johan's
  form & object patches.

[4/5/96]
o Added loads of memory allocation error checking to try and cut down on crashes
  - seems to have improved things a bit.
o Fixed Johan's objc_edit() and forms keyboard handling code to correctly interpret
  valid characters (was locking out some perectly admisable characters).
o Another small change to the client startup/shutdown stuff - CH_EXIT is now sent
  again (parent field was being invalidated to soon). Multiple shutdown/restart
  sequences seem to work pretty well now.
o Extended client list reporting (when debug enabled) to show more info on each client.

[5/5/96]
o Added support for Braodcast (mode 9) shel_write()
o Added support for Shutdown (mode4) shel_write()
o Added support for Desk Accessory loading in shel_write() (mode 3).
  - actually, I blagged a couple of lines of assembler from oAESis 0.70
  to trick accs into loading correctly. Accs load & seem to behave correctly,
  but you cann't open them yet (they aren't in the menu anywhere yet).
o House keeping now gets done after a 2second inactivity OR 5000 OS request.
  This helps find dead clients more reliably....

[6/5/96]
o Loaded applications & ACCs are displayed in the desk menu, with a tick next
  to the one that owns the current root window menubar.
o ACC's are autoloaded on bootup. New xaaes.cnf directive ACCPATH allows you to
  set the path that ACC's will be loaded from. (default is c:\)
o ACC's are tagged in the desk menu so you can see which they are.
o Clicking on an ACC's menu entry sends AC_OPEN to the it.
o Clicking on an APP's menu entry gives it the root window menu & desktop.

[7/5/96]
o Put in Johan's new rectangle list handling code.
  Here's Johan's comments on what he's done:

---Quote---
In 'rectlist.c' the old rc_intersect has been optimized a bit and there
are two other new static functions with almost the same function.

For external use there are two new functions:
create_work_list     -  Creates a second rectangle list, covering only the
                        parts that are within the window's work area.
invalidate_rect_list -  Marks all rectangle lists below a specified window
                        (including that one) as invalid. The rectangle
                        objects are deallocated, naturally.

Two other static functions take care of rectangle object allocation and
deallocation.

The diff files mostly remove unnecessary calls to generate_rect_list() and
add invalidate_rect_list() calls where needed.
---Unquote---

o Added the check for out of clip objects that Johan suggested in 
  draw_object().

=====================================================================================
Beta 5 released.
This is an obscenely fast release. It's now officially a shit load 
faster than AES4.1 (my original aim). This is all thanks to Johan's 
work on the rectangle lists and the object clip fix (in the case of 
Thing's directory window scrolling), as well as my re-vamped 
evnt_multi().
=====================================================================================

[8/5/96]
o Stopped root window redrawing when first real window is opened.
o Fixed display bug when topping windows.
o Stopped whole root window redrawing when last window is closed.
o Added undocumented entry in applications global[] array that the EGEM library
  relies on (naughty of them), so ESSDecode, LHAshell, et al should all work now.
  (thankyou to the oAESis guys (namely Christer G) for sorting that out).
  
[9/5/96]
o Fixed mouse click drop through when clicking on menus.
o Menu titles are un-highlighted after selection.
o STORE_BACK windows (ie. dialogs) now stay on top, and you cann't
  move windows that are behind them.
o Fixed NO_MESSAGES type windows (dialogs again) when used with 
  Johan's rectangle list code.
o NO_WORK windows don't have the window borders drawn, they just get a
  plain filled rectangle instead.

[10/5/96]
o Small patch to shel_write() to make detecting type of program to launch in mode 0
  work a little better.
o Can now move windows off screen.

[11/5/96]
o Applied Martin Koehling's latest diffs:
resource.c:
   FixColourIconData() had a serious bug: if
   c->num_planes > display.planes, the end of an Mxalloc'ed
   memory block was overwritten; this was probably responsible
   for spurious crashes in `lowcolor' resolutions - for example,
   on my Mega ST XaAES Beta 0.5 *always* crashed during initialization
   if it was run from MINT.CNF!
resource.c:
   FixColourIconData() had another bug: the destination MFDB
   wasn't properly initialized (fd_stand in one case, fd_addr
   in another one) before vr_trnfrm(); I can't explain how
   this code could work at all...
xa_defs.h:
   During bug hunting, I added:
      #define malloc(m) calloc(m,1)
   I think it's a good idea to have allocated memory blocks
   initialized to zero - at least during debugging!
xa_globl.h:
   Added a typecast to get rid of a syntax error (Pid2Client(pid)->...
   didn't work).
objects.c:
   draw_2d_box() still has problems with *outside* borders; I've
   added my version (which is modeled closely after Atari's own
   algorithm) for easier comparison - if any shift key is pressed,
   the old version is used, otherwise my version...
   (No, I don't propose to leave this in XaAES 1.0!;-))

NOTE: Martin's version of draw_2d_box() doesn't work, so I've not put it
in.

o Widget bitmaps are now stored as icons in the system.rsc file.
  This means that one version of XaAES runs in all colour modes, and that
  widgets now appear correctly in 256 colour modes :)
o Fixed converting selected images of colour icons from one colour depth
  to a higher one.

[9/6/96]
o After a month of fiddling, finally got XaAES to talk to /dev/moose directly,
  so the seperate mouse server program is no longer required. This speeds
  things up a little as well because the extra overhead for the mouse pipe
  is removed.
o Sorted out some (if not all) of the problems with Johan's rectangle list code.

[14/6/96]
o When you click to drop down a menu, you can point at others to pull them down
  as well.
o "Click...hold...select-on-release" type selections added to the menubar handler.
o More fixes to rectangle list & window redraws.

=====================================================================================
Memory protection almost works now. Something in shel_write() breaks 
it if you issue shel_write() from any program apart from XaAES. It's 
strange, because the initial shel_write() calls when parsing xaaes.cnf 
don't break memory protection, but if you try to run something from 
Thing, XaAES will violate memory protection?
=====================================================================================

[16/6/96]
o Re-worked the object display code to use a jump table to seperate
  routines for each object type instead of the massive switch() 
  statements that were used before. This makes it easier to add new 
  object types and makes things a great easier to maintain (the old 
  version of display_object() was a real mess).
o Started adding new object type G_SLIST (scrolling list). ob_spec 
  should point to a SCROLL_INFO structure, which describes the actual 
  list. New functions in scrlobjc.c provide creation/addition/deletion
  support for scrolling list entries (as there will never be a 
  resource editor that supports them). I'll add an AES call interface 
  to these routines later.

[9/7/96]
o Added 'real-time' scrolling when dragging window sliders. This is a fairly minor
  mod in SCRLWIDG.C that uses the same set_widget_active() method as the arrow
  widgets. This option can be disabled in XA_DEFS.H using the REALTIME_SCROLL switch.

[10/7/96]
o Left hand button is now 'real-time' scroll, right is standard GEM scroll.

  
[24/7/96]
o Finished debugging realtime scrolling.
o G_SLIST objects now display pretty much correctly (in colour).
o Added "Task Manager" window, partly as I think it'll be useful
  and partly to test the G_SLIST object type (list of current
  AES clients).
o ALT+CTRL+L now opens the Task Manager.

========================================================================
[2/8/96]
Got NVDI4 - argggh, now I know why people complain that XaAES
doesn't work very well with NVDI....stuff that worked with NVDI2.5
doesn't work at all with NVDI4.
========================================================================

[6/8/96]
o Fixed NVDI4 compatibility.
o Reworked video mode select switches. -video now does ST/TT modes,
  new switch -fvideo does falcon special modes (via VsetScreen).
  Falcon owners can now access a decent selection of modes (like,
  2/4/16/256 color & loads of res's).

========================================================================
[8/8/96]
Finally finished reboxing my falcon into an old Mac II box. They're a
perfect size to fit a falcon into.....now I can get back to doing some
serious work :)
========================================================================

[19/9/96]
o Bit of a boob here - I managed to delete the latest history file,
  so I've reverted to a backup (oops). So, a summary of what got done
  before now:
  - File selector (uses Tamminen Eero's directory code with my own
    wildcards + scroller)
  - Scroll list objects with icons
  - Task manager kill function
  - Launch app
  - lots of minor bugfixes (but I cann't remember what they were).

[23/9/96]
o Finally fixed the bug in shell_write() that was breaking the
  memory protection...you can now run XaAES with MiNT memory 
  protection active!!!
 
========================================================================
[16/10/96]
Deleted the history file by accident (again). Bugger. Here is a 
backup, with several of my most recent mods deleted.
========================================================================

[16/10/96]
o Finished a (very) wide ranging overhall of the rectangle list
  handling. Reasons being: 
  1) My original scheme did naughty things like calling malloc() as a 
  result of wind_get() when generating WF_FIRSTXYWH. Ok when the
  command pipe was used for everything, a real no-no when wind_get()
  is called via the CALL_DIRECT method to improve performance. And 
  worse, my original code was dog slow as it re-generated the lists
  every time they were used, and called malloc() for every entry
  in every list individually.
  2) Johan's rect handling scheme also suffered from dodgy malloc's 
  in wind_get(), but not to the same extent as my original code. It
  was quicker as it re-used lists instead of regenerating every time,
  and used a block allocation scheme for list storage. Much faster,
  but the display bugs from it were pretty bad (I never managed to 
  chase them all).
  
  The new rectangle list handler takes the best ideas from Johan's
  code and incorporates them into a new scheme. Features of
  the new scheme are:
  - Memory is block allocated for each list via a single malloc().
  - Lists are re-used.
  - Lists are only re-generated when they have to be. The regeneration
    is more intelligent than the old verion in Johan's code as it
    uses a changed rectangle test as well as the original lower
    window test to check which windows have invalid lists.
  - The display glitches that dogged the last release are (I hope)
    all gone now.
  - No lists are generated (hence no memory is allocated) from within
    wind_get() so there is no danger of wind_get() breaking memory
    protection.
  
  This has taken bloody ages to do....the rect list stuff is integral
  to almost every aspect of the system!!!

[16/10/96]
o MiNT memory protection compatibility. Hurray for our side. The
  wind_get() generate_rectlist() calls were what was killing XaAES
  with memory protection turned on (it resulted in clients mallocing
  memory that would be tied into OS level structures but owned by
  client processes). Ta Da :) it works.....now, gotta do some thinking
  about intercepting VA_PROTOCOL messages and copying them into
  global tagged memory buffers to stop VA_PROTOCOL from breaking
  mem protection.....

[17/10/96]
o Added new functions to c_window.c for move and close windows. Should
  have done it ages ago really.... XAwind_set(WF_CURRXYWH) now
  just calls move_window() and XAwind_close() calls close_window().

[19/10/96]
o Added blit support to the move_window() function - top window only,
  as handling the rect lists for non-top windows will need some 
  thought. It still makes things 'feel' much faster though as the
  most common window move is the top one....

========================================================================
[20/10/96]
Beta 6 Released
========================================================================

[6/11/96]
o Fixed the 'no parameters' bug. A physical workstation is now correctly opened
  to the current res if no -fvideo or -video switch is given.

[16/12/96]
o Menu's are now drawn as proper object trees - not quite debugged properly
  yet - Lattice C's IDE still crashes rather big time, but Thing works
  ok (you get the lines as seperators).
o Narrowed the window borders down 'coz everyone hated the old ones.

[25/2/97]
o Finally got my re-work of the menu's to work. Full object tree's
  are now used correctly (including progdefs in menu's as used in
  Lattice C's IDE).
o Added extra code check for already being in Supervisor mode in
  objects.src/progdef.c - this allowed me to turn CALL_DIRECT on again
  without Thing crashing.

========================================================================
Oops. Not been writing these down lately. Cann't rightly remember what
I've done to the code....luckily (if you can call it that) no-one else
has sent me any mods in ages so I've not got to describe anyone else's
work.
========================================================================

[16/5/97]
o Anyway, added new functionality in kernal to call 'active_function'
  with a given frequency if required (gonna use it for menu's).
o Added extra debug op-code to the API, for use with DU Debug
  (when I get round to adding the other end support).

[17/5/97]
o Menu's using the new non-blocking scheme work now.
o Fix to make menu bar width match screen width.
o Speeded up menu tracking response.

[19/5/97]
o Added a kludge version of mouse rectangle tracking, not at all
  good and I'll replace it ASAP.
o Fixed a memory leak in the AES messaging system.

[20/5/97]
o New version of moose.xdd that supports button release
  events as well as clicks.
o Added support to evnt_button & evnt_multi() for button
  release events.
o Tidied up the window work area calculation and display
  (removes display glitches in most window apps).
o Info widget now matches rest of the look & feel of the windows.
o Desktop size now returns correctly, so Lattice C
  will now work in 640*XXX modes (it always worked in higher
  res modes).
o Tagged backgrounds of system dialogs & alert boxes as colour 0,
  fill transparent + 3D attributes, making them system-dialog-background
  coloured. Now you can actually see them on a mono system.

[21/5/97]
o New Salert() (/pipe/ALERT) handling code, prevents screen corruption
  when a program exits and also lets you review error messages.
  What you get now when a program crashes is a nice alert box (like
  using the old MiNT ALERT.ACC program), and also a log window which
  keeps a list of Salert() messages that you can scroll through. This
  window is accessed via a new option on the XaAES system menu.

[22/5/97]
o It's now only possible to open one copy of the system alerts dialog
  and the task manager (it wasn't sensible to allow more).

[12/6/97]
o Replaced the polled from the main kernal mouse rectangle check with a
  multi-threaded checker instead.
