Major changes between TKWM-0.9 and TKWM-0.9.1:
----------------------------------------------

* Fixed some minor bugs that I let creap in just before the 0.9 release.

Major changes between TKWM-0.9 and TKWM-0.1a12:
-----------------------------------------------

* There is a contrib directory with contributed code.
  In particular there is Bill Burdick's contributed code for
  doing rooms.

Major changes between TKWM-0.1a12 and TKWM-0.1a11:
-------------------------------------------------

* Lots of minor bug fixes that should not be user visible.

* A spiffy new color editing widget in the preferences dialog. Let
  me know if you like/dislike the color selection mechanism.

* The old menu based rooms code is gone. There are two replacements
  you can choose from (or none). The first behaves pretty much
  like the old code, with some differences in iconization/initial
  room choice.

* Documentation!

* Shaped windows are now supported. Thanks to Bill Burdick for providing
  the code to do this.

* Button 1 pressed at arbitrary spots on the frame no longer pops up
  the menu. I found this too annoying.

Major changes between TKWM-0.1a11 and TKWM-0.1a10:
-------------------------------------------------

* The resources code has been entirely rewritten and in the processes
  the window resource hierarchy has been reorganized. Changes are
  pervasive throughout the code. Sorry if I've broken anyone's
  private code, but these changes were necessary. Features of the
  changes are:

  1) There is now a separate preferences editor program "stkwm_prefs".
     This is much more sophisticated than the previous preferences
     dialog, but it could still use some work. Please try it and let
     me know what you think. The dialog can be accessed both via
     the client menu on each window, and via the root menu bound to
     the right mouse button.

  2) The window hierarchy has been rearranged. A client with X id "123",
     resource name "foo" and resource class "Foo" now has the following
     organization within stkwm:

     Path Name				Class Name
     ===================================================================
     .123				Tk.Client
     .123.foo				Tk.Client.Foo
     .123.foo.decoration		Tk.Client.TkwmClientFrame
     .123.foo.icon			Tk.Client.Icon
     .123.foo.icon.decoration		Tk.Client.Icon.TkwmIconFrame

     A transient window client, is slightly different in that
     ".123.foo.decoration" is named ".123.foo.transient-decoration"
     instead in this case.
     To see the possible resources that can be set look at the
     tkwm_mono.appdefs and tkwm_color.appdefs files in the sample-wm
     directory.

     I am not entirely happy with this hierarchy yet, so be warned
     that things may still change.

  3) User specific resource files have changed names. The file ~/.tkwmdefaults
     used to contain user specific resource settings for stkwm.
     There are now two files, ~/.tkwm_mono.appdefs and ~/.tkwm_color.appdefs.
     The appropriate startup file is run depending on the X server's color
     capabilities. Note that user specific Tcl code is still in ~/.stkwmrc
     Please don't set resources in ~/.stkwmrc with "option add" unless
     you are absolutely sure you don't want to use the preferences editor.
     The preferences editor will read the contents of the ~/.tkwm_mono.appdefs
     or ~/.tkwm_color.appdefs file as appropriate and write modifications
     back into these files. Be warned that comments will be lost, and
     that blank lines must not appear in these files. (I know, easy to
     fix, I'm just a bit lazy right now.)

  4) The hooks mechanism for substituting values for resource lookups
     has changed somewhat. Fewer resources can be grabbed via the old
     style hooks, and the tcl names of the hooks have changed.
     The hooks that can currently be established are:

	hook.use_WM_STATE
	hook.OpaqueMove
	hook.constrained
	hook.OpaqueResize
	hook.icon.Bitmap
	hook.icon.Width
	hook.icon.Height
	hook.icon.OpaqueMove
	hook.icon.constrained
	hook.icon.OpaqueResize

     The hook is passed the name of the window the resource lookup is
     being done for, and the result of the resource database lookup for
     the resource in question. Hooks should be placed in your .stkwmrc file.

     In addition to the above hooks mechanism, a new mechanism has been
     provided for. When a client "123" is first mapped, if it has resource name
     "foo", it will be placed into a window hierarchy like:

     	.123
     	.123.plug
	.123.foo
	.123.foo.decoration
	.123.foo.icon
	.123.foo.icon.decoration

     This allows resources specific to the client to be specified in the
     resource database, e.g. 

	Tk.Client.xterm.decoration.titled: 0

     would turn off titlebars on windows with the resource name "xterm".
     The hook "resource_name.hook" can be provided to change the name
     under which a client window will be registered in the stkwm hierarchy.
     The procedure "resource_name.hook" gets two arguments, the name of
     toplevel window the client is being mapped under (e.g. .123) and
     the default resource name for that client. The hook code can then
     perform whatever computation it deems appropriate to determine
     a resource name for the client and return it. Decisions on what
     to do can be based on information found in the plug widget which
     will be present (e.g. as .123.plug).

     NOTE: the plug window for a window named "path" can be found
     at $path(root).plug, where $path is the global variable with the
     same name as the window. You will need to know this if you want to
     write hooks.

* The name of the stkwm interpreter is now "tkwm" instead of "stkwm.tcl".

* The stkwm "widgets in tcl code" has been revamped. This has also resulted
  in lots of little changes throughout the code. The new code is a little
  simpler, and slightly faster.

* The maximizing code now respects the client maximum size restrictions.
  Thanks to Hume Smith for contributing code for this.

* The tkwm_client_frame now has a configurable border width. This
  appears in the preferences editor.

* The method for declaring new buttons to appear in the frame titlebar
  has changed. Formerly there where two procedures,
  tkwm_client_frame::new_left_button and tkwm_client_frame::new_right_button,
  these have been replaced with a single procedure,
  tkwm_client_frame::new_button, which takes the same arguments
  as the old procedures. Declaring the button does not make it display
  by default. The tkwm_client_frame now has config style options to
  change the buttons displayed. Once you declare a button you can
  add it to the list of left or right buttons via the preferences editor
  or by editing the resource files directly.

Major changes between TKWM-0.1a9 and TKWM-0.1a10:
-------------------------------------------------

* Simplified the geometry code to deal with bugs in geometry
  management when clients changed their grid size without issuing
  a configure request. Geometry gridding of clients is no longer
  reflected in the geometry of the frame containing them. This also
  means that the geometry reported by "plugSpec geometry" is now
  always given in pixels. If you want the grid geometry you will
  have to compute it yourself using information provided by
  the "info" commands.

* Minor change to the core to allow old WM_STATE properties to be
  examined. This allows stkwm to iconify windows that were iconic
  before the current window manager startup (ala twm). This is
  controlled by the resource useClientState. It is true by default.

* Added "move" and "resize" to the client menus and to function keys.
  Move is on Meta-F7, resize is on Meta-F8.

* Lots of other new key bindings ala-Motif, courtesy of
  Dan Wallach <dwallach@cs.Princeton.EDU>. Look at the client menu.

* Resize only shows grid outlines that fit the clients grid.

* Opaque resizing and opaque moves are now a per window option.
  The controlling resources are "opaqueResize" and "opaqueMove".

* Constrained moves are now an option. The controlling resource
  is "constrained".

* Changes in the dispatching mechanism to control exclusive access
  to the pointer. These were needed so that dialogs that used the
  dispatch mechanism could be run from menus. Look in the file
  functions.tcl to see what's changed.

* A first hack at a per client preferences dialog. Look on the client
  menu. This isn't perfect yet, but give it a try and tell me what you think. 
  Also, do people think its a good idea in the first place?

Major changes between TKWM-0.1a8 and TKWM-0.1a9:
------------------------------------------------

* Added in code to allow resizing of error dialogs, and to mail error
  messages to the maintainer (schenk@cs.toronto.edu by default).
  Look in iframes.tcl and error.tcl to see the code. This should provide
  an example for people who want to write internal TKWM clients that
  can be treated like external clients.

* Added in a new core operation "tkwm reparent" that allows you to
  reparent toplevel windows as children of other windows, which
  then act as virtual root windows. This is intended to pave the way
  for a virtual root extension to stkwm, but I haven't actually made
  use of it yet. If anyone is interested in trying to write a
  virtual root package please get in touch with me.

Major changes between TKWM-0.1a7 and TKWM-0.1a8:
------------------------------------------------

* A complete rewrite of the colormap code. TKWM should now deal with
  clients that try to force load their own colormaps and should also
  deal correctly with clients with complex colormap demands.

* Many small bug fixes with respect to window placement.

* First pass at an *roff style manpage for tkwm. Look at doc/tkwm.n.
  I still need to write some documentation for stkwm.

* Added in "hooks" to allow control of appearance when the resource file
  method doesn't quite deal with things they way you want. Every value
  that is set from the resource file also checks for a hook procedure
  that can be used to determine the value. If the hook procedure exists
  it is passed the name of the client and the value obtained by the
  resource lookup for that client. The following hooks are available:
    client_manager_hook
    icon_manager_hook
    transients_titled_hook
    titled_hook
    icon_width_hook
    icon_bitmap_hook
    icon_height_hook
    icon_titled_hook
  As an example, here is a hook that makes windows with the name "CUSTOM"
  (as opposed to the resource name!) untitled, and otherwise returns
  the result found in the resource lookup.

  proc titled_hook {client result} {
    if {[$client.plug info name]=="CUSTOM"} {return "0"}
    return $result
  }

* Added in a first attempt at a mechanism to allow the user to define new
  titlebar buttons. This requires that the user add code to their .stkwmrc
  file. Buttons can be added on either the left of the right, and will be
  added in order of declaration toward the inside of the titlebar.

  For example a title buttons on the right might be added with the
  following command:

  tkwm_client_frame::new_right_button vzoom motif_button \
    {-command "vzoom $client" -geometry ${d}x$d -bitmap @~/lib/icons/zoomup}

  The variables $client and $d are guaranteed to be defined within the scope
  that the button configuration commands will be evaluated. Buttons
  on the left use the command tkwm_client_frame::new_left_button.

Major changes between TKWM-0.1a6 and TKWM-0.1a7:
------------------------------------------------

* TCL 7.3 and TK 3.6 are now the defaults. However, things should still
  work with anything after TCL 7.0 and TK 3.3.

* The patch to tkGrab.c is no longer needed by the sample window manager.
  I am continuing to distribute it for the moment just in case others
  have code that relies on it.

* Added a new notion of "geometry managers". Each window and icon has some
  defined manager to deal with its placement. Instances of managers
  must be declared in the TCL startup code, but which manager a window
  uses can be set in the defaults files. Look at sample-wm/managers.tcl
  to see the two managers I've provided so far, one that does nothing
  special, and one that packs a rectangular region.
  The user should define new instances in the .stkwmrc file.
  Look at sample-wm/custom.tcl to see how the default managers are set up.

  The current sample managers are not wonderful, but they function.
  If anyone wants to write better ones let me know, I'd love to have them.

  Also, the interaction between initial placement of a window and
  the manager needs some improvement. Ideally the initial placement
  should be dealt with by the manager, but right now I'm not quite
  sure how/if I want to do this.

  Note that this required lots of internal code changes in functions.tcl,
  icons.tcl, and frames.tcl. Some routines have disappeared, others
  have changed interfaces and or functions. Beware in particular
  of any code you wrote that directly uses wset_restore or wset_withdraw.
  
* Fixed a bug in the colormap code that was causing occasional core dumps.

* Modified the event grabbing code so that a window does not lose its
  focus when an event is grabbed from it.

* Modified grab procedures to prevent race conditions against
  other applications that do global grabs. This is just a TCL
  modification, no change to the TK core was required.

* Added a grab/ungrab pointer routine to the core.

* Modified the window positioning code so that only pointer events
  are grabbed, thus preventing keyboard events from being "lost"
  at the start of a positioning request.

* Finally bit the bullet and put server grabs into the sample manager.
  This means that outline "garbage" should no longer appear on windows.

* Modified the dispatch mechanism, along with resize, move and menu
  routines to prevent some races. These routines now perform mutual
  exclusion locking and only queue one copy at a time.

* Added in zoom functionality for the zoom button on the decorations.
  Also added zoom entries to the client menu. Vertical, horizontal and
  dual zooming is implemented.

Major changes between TKWM-0.1a5 and TKWM-0.1a6:
------------------------------------------------

* Added code to allow control colors, cursors, icon bitmaps, and titlebars
  using the options database. Look at the file sample-wm/tkwmdefaults-sample
  to see examples of how to use these controls.
  The window manager will read a base set of defaults from
  the file tkwm_mono.appdefs or tkwm_color.appdefs. Personal
  defaults are then read from ~/.tkwmdefaults and ~/.Xdefaults.

* Fixed bugs in the geometry management code that caused some windows
  to get mapped with a 0x0 size (and thus never appear). This was usually
  a problem with wish applications.

* Fixed some bugs in the colormap code that could cause core dumps on startup.

* Added a new core event, <FocusIn>, to allow accurate monitoring of
  clients requests to change focus between multiple windows. I hope this
  fixes the ongoing problems with colormap changes and focus border changes
  not registering correctly.

* Changed the focus code to respect the ICCCM.

* Added some code to the popup menus implementation to be sure
  that the TK defaults are properly overridden.

Major changes between TKWM-0.1a4 and TKWM-0.1a5:
------------------------------------------------

* Changed Makefile's to use tcl-7.1 and tk-3.4 by default.

* Fixed bugs in the dispatch mechanism.

* Added in error reporting code to (noisyCatch) to much of the
  sample window manager.

* Implemented decoration and motif button "widgets" that act like
  standard TCL widgets. Look in the files widgets.tcl, mbuttons.tcl,
  and decos.tcl. The client decoration is actually used by the
  window manager, but I haven't gotten around to making use of the
  icon decoration yet.

* Made the icon plug track changes in a clients icon_pixmap value.

* Fixed some bugs in the colormap handling code.

Major changes between TKWM-0.1a3 and TKWM-0.1a4:
------------------------------------------------

* Cleaned up compilation under X11R4. Warnings should now go away.

* Wrote a better colormap system. (??) This is completely untested
  because I have no color machines here.

* Wrote a dispatch mechanism to prevent multiple procedures from
  trying to interact with the user at the same time. In particular
  map requests that arrive during another interaction are a problem.
  Incorporated into menu code, mapping code, and moving and resizing code.
  Anything invoked from the menu will also exist inside an interaction
  block, but any code that does user interaction and is invoked from
  a binding outside of a menu should use the dispatch mechanism.
  See the procedures "dispatch" and "next-dispatch" in "functions.tcl"
  as well as the changes in "frames.tcl", "menus.tcl", "move.tcl"
  and "resize.tcl".

Major changes between TKWM-0.1a2 and TKWM-0.1a3:
------------------------------------------------

* Added some code to do client menus.

* Fixed more bugs, including one horrible bug introduced in TKWM-0.1a2
  that caused all client requests for geometry changes to be ignored.

* "tkwm grabevent" now accepts event names that match the possible
  event names in TK. These include Button, ButtonPress, ButtonRelease,
  Motion, Key, KeyPress and KeyRelease.

* The "move" and "resize" procedures now take an argument naming
  the event to watch for to end the move or resize. This should allow
  move or resize to be bound to any button, and perhaps even to
  keyboard bindings. (I haven't tried the later yet, but it seems
  to me it should work. Please report it if it does not.)

* Added code to warp the pointer. "tkwm pointer absolute x y" will set the
  pointer location to (x,y). "tkwm pointer relative xoff yoff" will offset
  the pointer from its current location by the specified amount.

* The menu handling code has been completely rewritten, with some kind
  hints from Roger Critchlow <rec@arris.com>. As a side effect the
  menu traversal code is now much faster.
  Also, cascades now work, as should binding menus to non-button events.
  Button releases still kill the menu.
  Keyboard traversal should work now, except there is no way to
  traverse down a cascade via the keyboard. Anyone know how Motif does this?
  To try keyboard bindings type <Shift-Esc> in a client window.
  Also, I am planning to add a "tear off" feature, but I haven't
  decided on the semantics. What event should cause the menu to "tear"? Is
  there a Motif standard?

  WARNING 1: In order for cascaded menus to work, the cascades must be
    children of their parent menus.
  WARNING 2: The name of the procedure to invoke a popup menu has changed
  from MenuPopupPost to tkwm_postmenu.

* Added the core command "tkwm iconsize" to set the WM_ICON_SIZE property on
  the root window. I don't actually use this in the sample manager, but I
  wanted to make the core complete.

Major changes between TKWM-0.1a1 and TKWM-0.1a2:
------------------------------------------------

* All hint structures are now accessible by the "tkwm info" and plug widget
  "info" interfaces.

* The queries to access a clients instance name and class name
  have been changed. Previously "tkwm info instance_name" returned
  the clients instance name and "tkwm info class_name" returned
  the clients class name. Now "tkwm info res_name" returns the
  clients instance name, and "tkwm info res_class" returns the
  clients class name. This change is so that the names of the
  queries match the structure names in the WM_CLASS hint structure.

* Stacking order of top level windows can now be fully controlled by the
  new "tkwm restack" command.

* Two new percent modifiers provide access to the detail and sibling fields
  of PropertyNotify events.

* Fixed most reported bugs in the core, excepting the reported failure
  of the core to work under X11R4.

* New configurized make files. Just configure it, make it and install it.
  Thanks go to David Zuhn for providing the initial makefiles for me to
  play with.

* Core support for the three protocols that a client can participate in
  under the ICCCM (WM_DELETE, WM_SAVE_YOURSELF and WM_TAKE_FOCUS).

* Bug fixes in the sample window manager.

* The sample window manager now respects min and max sizes for resizing
  purposes. 
