

    Changes from version 1.0 to 1.1
    -------------------------------


    1 - Correction of a few bugs

    2 - Add the OpaqueResize flag : similar to OpaqueMove, but redraw the window
	you are resizing at each motion event. Extremely resource consuming, but
	beautiful with fast server/client/network.

    3 - Now if you don't specify any background/foreground/pixmap indication for
	the  root window,  ctwm leave it  alone so you  can have  your own  root
        background pixmap.

    4 - You can now specify  on the command line a list of workspaces in which a
        new client opens. The syntaxe is :

          whatever_client -xrm 'ctwm.workspace: name1 name2 ... namen'
   or     whatever_client -xrm 'ctwm.workspace: all'

   where 'name1', 'name2', ..., 'namen' are names of workspaces and 'all' refers
to all workspaces.

    example : 

	xload -xrm 'ctwm.workspace : all'

    5 - Add the  OccupyAll command in  .ctwmrc, you can now specify at startup a
	list of windows that occupy all the workspaces.

    example :

OccupyAll {
    "xload"
    "xconsole"
    "xbiff"
}

    6 - Add the f.gotoworkspace function. It goes the workspace specified by its
	name.

    example :

"F1"      =    : root           : f.gotoworkspace "cognac"


    Changes from version 1.1 to 1.2
    -------------------------------


    1 - you  can  now  directly  edit  workspace names  in their  buttons.  only
	printable characters, delete and backspace keys are honored.

    2 - Ctwm  now handle  shaped colored  icons in  XPM  format. This  added the
	variable XPMIconDirectory, and slightly modified the syntax of the Icons
	command. The XPM icon file names should be prefixed by the character '@'
	to distinguished them from the ordinary bitmap files.

Example :

XPMIconDirectory  "/usr/lib/X11/X11/XPM"

Icons {
    "Axe"    "@xedit.xpm"
    "xterm"  "@xterm.xpm"
    "xrn"    "@xrn.xpm"
    "HPterm" "@hpterm.xpm"
    "XAlarm" "@datebook.xpm"
    "Xman"   "@xman.xpm"
}

  These above xpm pixmap are given.


    3 - Many bugs fixed :

	- Icon regions now works.
	- the absence of ShowIconManager is taken into account.
	- The -iconic flag is honored.
	- The -xrm 'ctwm.workspace' works as expected.
	- I think that f.warpto[to|ring] works correctly i.e warps.
	  also to the correct workspace if the destination window
	  doesn't occupy the current workspace.
	- A few minor bugs fixed.


    Changes from version 1.2 to 1.3
    -------------------------------


    1 - Many bugs fixed :

	- Partial geometry in the  WorkSpaceManagerGeometry  statement no longer
	  cause ctwm to core dump.

	- The occupy window name now is "Occupy Window" instead of "Occupy WIndow"
	  a typo on the uppercase I in window.

	- Several types problems that make good compilers to issue warnings.

	- The  icons of the WorkSpaceManager and Occupy Window windows now behave
	  correctly with ButtonPress.

	- UnknownIcon can now have Xpm icons specified.

	- f.showiconmgr no longer map empty icon managers.

	- The ctwm process is smaller (even smaller than twm).


    2 - Add the Occupy command in .ctwmrc, you can now specify at startup
        which window occupy which workspace.

    example :

Occupy {
              "xload"  {"all"}
    Window    "xterm"  {"here" "there" "elsewhere"}
              "xv"     {"images"}
    WorkSpace "images" {"xloadimage"}
}


    Changes from version 1.3 to 2.0
    -------------------------------

    1 - A few bugs fixed :

	- Resize at window creation with button2 works.

	- Some others i don't remember.

    2 - Better  support of  monochrome  displays  :  video inverse instead of 3d
	buttons.

    3 - WorkSpaceManager  and  Occupy Window are now resizable.  Don't forget to
	verify you have a powerful server before resizing the  workspace manager
	with OpaqueResize set.

    4 - X11R4 support with Imakefile.X11R4 (i didn't try so tell me).

    5 - The  visibility  of the workspace  manager  is now  consistant  with the
	visibility of the icon managers. This mean that by default the workspace
	manager is  *NOT*  visible at startup.  Use the  ShowWorkSpaceManager to
	make it visible at startup.

    6 - Two new functions :  f.showworkspacemgr and f.hideworkspacemgr have been
	added. They do what you imagine.

    7 - And now, the cherry on the cake. The workspace manager has now 2 states,
	the button state (the usual one) and the map state (the new one). In the
	map state  the buttons  are replaced  by windows displaying  a synthetic
	view of the  corresponding workspaces.  All the non-iconified windows of
	the workspace are shown as small windows with the  icon name  written in
	it.  It looks like  the virtual screen of  [t]vtwm, but, of course, much
	nicer.

	In this state, you can modify directly the occupation of your windows by
	manipulating these little windows.

	   - Button1 move a window from a workspace to another.
	   - Button2 copy a window from a workspace to another.
	   - Button3 remove a window from a workspace.

	Clicking in the  "root" of these windows warps you  to the corresponding
	workspace.  Clicking and releasing Button1 or Button2 quickly in a small
	window  go to the corresponding  workspace and warps  the pointer to the
	corresponding window.

	The Control-Key  (Press and Release)  in workspace  manager toggles  the
	buttons and map state.

	Four variables and Three functions manipulates this :

	    - StartInMapState : The map state is selected at startup, default is
	      buttons state.

	    - MapWindowCurrentWorkSpace : The aspect of the current workspace in
	      the map window.

	    - MapWindowDefaultWorkSpace :  Specify the aspect of the non-current
	      workspaces in the map window.

	    - MapWindowBackground :
	    - MapWindowForeground :  Specify the aspect of the small  windows in
	      the map window on a per-client basis.

	    - f.setbuttonsstate : You can guess.

	    - f.setmapstate : You can guess.

	    - f.togglestate : You can guess.


    8 - AutoRaise with RaiseDelay. Thanks to Johan Vromans (jv@mh.nl) who gave me
	this patch.  I think  Warren Jessop  (whj@cs.washington.edu) wrote it for
	twm.


    Changes from version 2.0 to 2.1
    -------------------------------

    1 - Cleanup code to make gcc happy.

    2 - Bugs fixed

	- IconMaskHint honored.
	- Workaround a bug on  HP7xx/8.07  servers for RaiseLower in  Map window.
	  The stacking  order in the MapWindow  was not correct on those servers.
	  use :

	  EXTRA_DEFINES = -DBUGGY_HP700_SERVER

	  in your Imakefile  if you plan to use this server.  It doesn't break on
	  others servers.

	- No longer core dump if  MapWindowCurrentWorkSpace or  MapWindowDefault-
	  WorkSpace are specified before WorkSpaces in .ctwmrc

	- Small windows  handling in  the WorkspaceMap  window works even  if the
	  Workspace  Manager  window  has a  title  (that  was not  the case with
	  ctwm-2.0).

	- ForceIcon works for Xpm icons.

	- Occupation of "transient for" window is correct.

	- RestartPreviousState  necessary to  keep previous  window occupation on
	  restart.

	- If a window  dies while  Occupy Window is mapped,  the Occupy Window is
	  correctly unmapped.

    3 - Ctwm now maintains the  WM_CURRENTWORKSPACE  property on the root  window
	and  WM_OCCUPATION  on every  windows.  They mean what  you think.  These
	properties  are string  properties  and are in  clear text  instead of an
	obscure mask.  If an external application changes  these properties  ctwm
	respond with the correct actions,  changing the current  workspace or the
	occupation of a window.  I give a small example  (gtw.c).  An application
	can manage its  occupation and it is  even possible to  write an external
	workspace manager. It is of course not ICCCM compliant because ICCCM says
	nothing on multiple workspaces. The special names "all" and "current" can
	be used.  And you can specify relative occupations if the workspace names
	list begin with a  '+' or '-' (ex:  +current adds a window to the current
	workspace).
	
    4 - 3 new functions :

	- f.pin : Pin/Unpin a menu on the screen. Only usable inside a root menu.

	- f.vanish : Remove  a window from  the current workspace.  Works only if
		     the window occupies at least one other workspace.

	- f.warphere "win-name" : Adds the window whose name matches  win-name to
			       the current workspace and warps the pointer to it.

    5 - And a new keyword : NoShowOccupyAll : tells ctwm not  to  show  OccupyAll
			windows in the WorkSpaceMap window.

    6 - All window names can now be specified as (shell-like) regular expressions.




    Changes from version 2.1 to 2.2
    -------------------------------


    1 - Bugs :

	- Redraw small windows when icon name changes.
	- Kill window from the title bar menu
	- Partial geometry on Workspace manager can core dump.
	- AutoRaise and tiny windows in the Workspace Map.

    2 - Transient windows and non group leader windows are now always on the top
	of their leader.

    3 - When an icon name changes, the icon itself changes automatically according
	the Icons list in your .ctwmrc. This is very useful for clients that have
	several states. For example xrn or some X mail readers can have two
	differents icons for new mail (news) / no new mail (news).

    4 - A new keyword : TransientHasOccupation has been added for people annoyed
	by the fact that since ctwm-2.1, transient-for non group-leader windows
	have the same occupation that their leader. If you specify this, these
	windows have their own occupation.

    5 - A new keyword : AutoOccupy. If specified, the occupation of a client is
	changed automatically when it's name or icon name changes, according to
	the Occupy list in your .ctwmrc. For example a mail reader can popup
	instantly in the current workspace when mail arrives.

    6 - A new keyword : DontPaintRootWindow. If specified, the root window is
	not painted, whatever you told in the Workspaces specification. This is
	useful to have pixmaps in the Workspace Map but not on the root window.

    7 - You can use XPM pixmaps for your background root window. Use xpm:filename
	instead of @filename. The latter is still accepted. Of course if your
	XPM file has transparent parts, there are not transparent on the root
	window, i.e. you dont see the electron gun through it.

    8 - XPMIconDirectory is replaced by PixmapDirectory. (XPMIconDirectory is
	still accepted).

    9 - You can now use colored root background pixmap and icons in many formats.
	Ctwm use the imconv library from the San Diego Supercomputer Center.
	To use these formats, specify : 'im:filename' for the pixmap name.

	- The following format are supported :

	     bmp    Microsoft Windows bitmap image file
	     cur    Microsoft Windows cursor image file
	     eps    Adobe Encapsulated PostScript file
	     gif    Compuserve Graphics image file
	     hdf    Hierarchical Data File
	     ico    Microsoft Windows icon image file
	     icon   Sun Icon and Cursor file
	     iff    Sun TAAC Image File Format
	     mpnt   Apple Macintosh MacPaint file
	     pbm    PBM Portable Bit Map file
	     pcx    ZSoft IBM PC Paintbrush file
	     pgm    PBM Portable Gray Map file
	     pic    PIXAR picture file
	     pict   Apple Macintosh QuickDraw/PICT file
	     pix    Alias image file
	     ppm    PBM Portable Pixel Map file
	     pnm    PBM Portable aNy Map file
	     ps     Adobe PostScript file
	     ras    Sun Rasterfile
	     rgb    SGI RGB image file
	     rla    Wavefront raster image file
	     rle    Utah Run length encoded image file
	     synu   SDSC Synu image file
	     tga    Truevision Targa image file
	     tiff   Tagged image file
	     viff   Khoros Visualization image file
	     x      AVS X image file
	     xbm    X11 bitmap file
	     xwd    X Window System window dump image file

	- You can find the imconv package at ftp.sdsc.edu. in the directory
	  /pub/sdsc/graphics/imtools.
	- If (width > screenwidth / 2) || (height > screenheight / 2) the image is
	  centered else it is tiled.
	- If you don't have the libim library or don't want to use it, undefine
	  IMCONV in Imakefile.


	But take care :

	- It is very memory consuming (on the server side).
	- It is very color cells consuming.
	- The ctwm executable is much larger executable.
	- Startup is much much slower (but not the workspace swap).
	- It works only for 8 planes pixmaps and 8 planes screens. If there is
	  an imconv specialist somewhere that can generelize this, he is 
	  welcome.

	

    10 - Two new functions : f.nextworkspace, f.prevworkspace.

    11 - Xpm examples files are now automatically installed in $(TWMDIR)

    12 - An example of .ctwmrc is given, showing some aspect of ctwm
	 (example.ctwmrc). It is not a complete .ctwmrc, only the ctwm
	 aspects are shown.

    13 - A new file PROBLEMS has been added that lists some problems you
	can have while using ctwm and some solutions.

 
Is there any good pixmap designer out there, that i can add beautiful
icons and background to the distribution. Don't use too many colors,
try to use the same few already used in the example icons.


    Changes from version 2.2 to 3.0
    -------------------------------

    1 - A few bugs fixes.

    2 - A 3D presentation of menus, titles and IconManagers can be selected with :
	UseThreeDMenus, UseThreeDTitles and UseThreeDIconManagers. If
	UseThreeDTitles is set the default values for TitleButtonBorderWidth,
	FramePadding, TitlePadding, ButtonIndent are set to 0 pixels. I am not
	that proud of the appearance of 3D titles but 3D menus look nice. If
	UseThreeDTitles is set the flag SunkFocusWindowTitle tells ctwm to sunk
	the title of the window that the focus. 3D features look ugly on
	monochrome displays, but I have no such display for testing purpose. If a
	monochrome display owner can have a look, he is welcome. The contrast
	of the clear and dark shadows can be tuned via the ClearShadowContrast
	and DarkShadowContrast parameters. These parameters are percentages.
	The formulas used are :

		clear.{RGB} = (65535 - color.{RGB}) * (ClearShadowContrast / 100),
		dark.{RGB}  = color.{RGB} * ((100 - DarkShadowContrast) / 100),

	If you choose UseThreeDIconManagers, icon titles are also 3D. By defaults
	new colors are allocated for shadows, but you can specify BeNiceToColormap
	to inform ctwm to use stipple instead of new colors, the effect is
	less beautiful, but acceptable.


    3 - A new keyword : NoIconTitle with an optionnal window list.

    4 - A new keyword : TransientOnTop with an integer parameter. This
	paramater is a percentage and tells ctwm to put transient (and
	non-group leader) windows always on top of their leader only if
	their surface is smaller than this fraction of the surface of
	their leader.

    5 - OpaqueMove and OpaqueResize now accept an optionnal list of windows
	as parameter. They also have their NoOpaqueMove and NoOpaqueResize
	counterpart with the same syntax.

    6 - Two new keywords : OpaqueMoveThreshold and OpaqueResizeThreshold
	with one integer parameter. The parameter represent a percentage of
	the screen surface. If Opaque{Move,Resize} is active for a window,
	(via point 4) the opaque {move, resize} is done only if the window
	surface is smaller than this percentage of the screen. The default
	is large enough.

    7 - Startup is optionally piped into m4 before ctwm parse it, ypu can
	now have a common startup file for ctwm, tvtwm, etc ... It can be
	disabled at compile time by undefining USEM4 in Imakefile. It can
	be disabled at execution time by using the -n option. Take care if
	you have backquotes (`) in your .ctwmrc file. This character is
	special to m4. In that case, put something like :

changequote(,)
changequote(``,'')

	at the beginning of your .ctwmrc.

    8 - The startup looks nicer (I think). If you use XPM and the file
	welcome.xpm is present in your PixmapDirectory, it is displayed
	while the startup is in progress. Unfortunately, the PixmapDirectory
	is known only after the .ctwmrc is loaded, and this loading is
	a large part of the startup time. So you can define the environnement
	variable CTWM_WELCOME_FILE to point to an XPM file, in which case
	it will be displayed very quickly.
	
    9 - A new function : f.separator, valid only in menus. The effect is to
	add a line separator between the previous and the following entry.
	The name selector part in the menu is not used. f.separator works
	only with conventionnal menus, not with 3D menus.

   10 - Thanks to bret@essex.ac.uk, the man page is integrated with the original
	twm one, and is of a much better quality.

   11 - While moving a window, the position is displayed in a similar way as
	the size when resizing.

   12 - The info window now display the compile time options of the current
	version of ctwm.

   13 - You can now specify xpm pixmap title buttons and TitleHighlight.
	There is 5 built-in scalable pixmap for buttons, :xpm:menu, :xpm:dot,
	:xpm:resize, :xpm:zoom and :xpm:bar.

   14 - Ctwm now restarts when receiving signal SIGHUP, so to restart it from
	a shell, use : kill -1 the_ctwm_pid

   15 - 2 New keywords : WMgrVertButtonIndent and WMgrHorizButtonIndent with
	1 parameter, specifying the vertical and horizontal space beetween
	buttons in the workspace manager.

   16 - Some more xpm files given. Among them several backgrounds.

   17 - Ctwm set the property WM_WORKSPACELIST (type STRING) on the root
	window, this property contains the null separated list of all the
	workspaces. Now the WM_OCCUPATION property on each window is a null
	separated list instead of a space separated list, it was wrong since
	workspace names can contain spaces. So, the first time you will start
	the this version, your windows will show up anywhere.

   18 - A new library libctwm.a and an include file ctwm.h are given. The
	library contains functions for an external program to have some
	control over ctwm. The functions are :

	Bool    CtwmIsRunning                   ();
	char    **CtwmWorkspaces                ();
	char    *CtwmCurrentWorkspace           ();
	int     CtwmChangeWorkspace             ();
	char    **CtwmCurrentOccupation         ();
	int     CtwmSetOccupation               ();
	int     CtwmAddToCurrentWorkspace       ();

	There is no documentation. A program demolib.c is given to help.



    Changes from version 3.0 to 3.1
    -------------------------------

    1 - Ctwm is moving. You can now have animated images for icons, root backgrounds,
	title buttons and focus window title image. This adds one new keyword :
	AnimationSpeed, and 4 new function :f.startanimation, f.stopanimation,
	f.speedupanimation and f.slowdownanimation. An image name is considered
	an animation if it contains the percent (%) character. In which case
	ctwm replaces this character by numbers starting a 1, and will play
	an animation with all these images. There is only 2 examples : ball%.xpm
	suitable for icons, and supman%.xbm suitable for title highlight.
	Another example (much more beautiful) can be found in the Mosaic
	distribution. There is also one built-in animation for title buttons :
	"%xpm:resize", for example :

RightTitleButton		"%xpm:resize" = f.resize

    2 - Add the WMgrButtonShadowDepth keyword to control the depth of the
	shadow of the workspace manager buttons.

    3 - The RandomPlacement command has now an optionnal parameter :
	"on", "off", "all" or "unmapped".

    4 - Three new keywords : ChangeWorkspaceFunction, IconifyFunction and
	DeIconifyFunction, the argument is the name of a function that is
	executed whenever the corresponding event occurs. Useful for sounds :

ChangeWorkspaceFunction !"cat /users/lecom/sounds/bom.au 2>/dev/null 1>/dev/audio&"

    5 - A new keyword : IconJustification with 1 argument, either :"left", "center"
	or "right". Tells ctwm how to justify the icon image on the icon title
	(if any).

    6 - flex is now supported.

    7 - The IconRegion keyword now support an optionnal winlist argument.
	Thanks to Mike Hoswell (hoswell@ncar.ucar.edu) for adding this.

    8 - f.separator now works (does something) with 3D menus.

    9 - The format xwd is now accepted for images (icons, background, ...). You
	have to prefix the image file name with xwd: to use this format.
	If the first character of an image file name is |, the filename is
	supposed to be a command that output a xwd image, and it is executed.
	For example, to use a gif file, use :

"|(giftoppm | pnmtoxwd) < /users/lecom/images/2010.gif"

   10 - A new keyword : MaxIconTitleWidth with an integer argument. If an icon
	title is larger than this integer, it is truncated.

   11 - A sound extension is supported. To use it you have to define USE_SOUND
	in the Imakefile (not defined by default). In order to use this option
	you need the rplay package. The documentation for this extension is in
	sounds.doc. Warning : this extension is not mine, and I don't use it, so
	don't expect a good support if you have problems with it.

   12 - A new keyword : NoBorder with a window list argument. These windows
	won't have borders. Thanks to J.P. Albers van der Linden
	(albers@pasichva.serigate.philips.nl) for this patch.

   13 - Ctwm has a new option selectable with the flag -w, if used, ctwm will
	not take over the whole screen(s), instead it will create a new window
	and manage it. The -w has an optional argument which is a window id
	of an existing window, if specified, ctwm will try to manage this window.
	This is totally useless, but I like it. The f.adoptwindow function can
	be used to capture an existing window into such a captive ctwm. A possible
	use of such mode can be to test new configuration file without restarting
	ctwm.

   14 - Now the welcome file can be of any type understood by ctwm. So
	it must be prefixed with its type. The default is xpm:welcome.xpm
	if the XPM option is compiled in, else it is xwd:welcome.xwd. You
	use for example :

setenv CTWM_WELCOME_FILE "|(giftoppm | pnmtoxwd) < ~/images/2010.gif"

   15 - You can now have 3D window borders with the keyword : UseThreeDBorders.
	In which case the 3D border witdh is given with : ThreeDBorderWidth.
	The default value is 6.  The color is BorderColor for the window that has
	focus and BorderTileBackground for all others windows. Note : The 3D
	borders do not merge very well with squeezed titles, as the top edge
	of the window where the title is missing does not get a 3d border.

   16 - Now, WindowRing can be specified without argument, in this case all the
	windows are in the ring. (Alec Wolman <wolman@blue.cs.washington.edu>)

   17 - New keyword : WarpRingOnScreen, if present, tells ctwm that f.warpring
	should warp pointer only to windows visible in the current workspace.


    Changes from version 3.1 to 3.2
    1994-11-13 (or earlier)
    -------------------------------

    1 - I have considerably reworked the focus handling. So I have probably
        introduced some problems.

    2 - New keyword : NoIconManagerFocus. Tells ctwm not to set focus on windows
        when the pointer is in an IconManager.

    3 - new option : -W. Tells ctwm not to display any welcome when starting.
        To be used on slow machines.

    4 - New keyword : StayUpMenus. Tells ctwm to use stayup menus. These menus
        will stay on the screen when ButtonUp, if either the menu has not
        yet been entered by the pointer, or the current item is a f.title.

    5 - Now ctwm tries to use welcome.xwd instead of welcome.xpm if it exists.
        On my machine the ctwm process size went from 2.3MB to 1MB when changing
        this. Xpm is very greedy.

    6 - New keyword : IconRegionJustification. Tells ctwm how to justify icons
        inside their place in the IconRegion. This keyword needs a string
        value. The acceptable values are : "left", "center", "right" and "border".
        If "border" is given, the justification will be "left" if the icon
        region gravity is "west" and "right" if the icon region gravity is "east".
        (clever, isn't it)

    7 - If you specify the -f filename option, ctwm will first try to load
        filename.scrnum, where scrnum is the screen number. If it fails, it will
        try to load filename as usual.

    8 - TitleButtons can now have different bindings for buttons with the
        following syntax :

LeftTitleButton ":xpm:menu" {
    Button1 : f.menu "WindowMenu"
    Button2 : f.zoom
    Button3 : f.hzoom
}
        The old syntax is of course accepted.
        Patch from Stefan Monnier (Stefan_Monnier@NIAGARA.NECTAR.CS.CMU.EDU).

    9 - A lot of new animated title buttons : "%xpm:menu-up", "%xpm:menu-down", 
        "%xpm:resize-out-top", "%xpm:resize-in-top", "%xpm:resize-out-bot", 
        "%xpm:resize-in-bot", "%xpm:maze-out", "%xpm:maze-in", "%xpm:zoom-out", 
        "%xpm:zoom-in" and "%xpm:zoom-inout". From Stefan Monnier
        (Stefan_Monnier@NIAGARA.NECTAR.CS.CMU.EDU).

   10 - 2 new builtin menus : TwmAllWindows and TwmWorkspaces. Guess what they
        do.

   11 - You can now bind menus to keys. When a menu is visible, you can
        navigate in it with the arrow keys. "Down" or space goes down, "Up"
        goes up, "Left" pops down the menu, and "Right" activates the current
        entry. The first letter of an entry name activates this entry (the first
        one if several entries match). If the first letter is ~ then
        Meta-the-second-letter activates it, if this first letter is ^ then
        Control-the-second-letter activates it, and if this first letter is space,
        then the second letter activates it.

   12 - Support for VMS. Patch from Peter Chang (peterc@v2.ph.man.ac.uk).
        Completely untested. If you have problems to build on VMS ask
        Peter Chang.

   13 - New keyword : MoveOffResistance. (idea borrowed to fvwm) : If you set
        MoveOffResistance to a positive (n) value, dontmoveoff will only prevent
        you from going off the edge if you're within n pixels off the edge. If you
        go further, dontmoveoff gives up and lets you go as far as you wish. 
        f.forcemove still allows you to totally ignore dontmoveoff. A negative value
        puts you back into "never moveoff" mode (it's the default).

   14 - The files background[1-7].xpm and background9.xpm have been removed from
        the distribution. Someone tells me that they are copyrighted. I tried to
        contact him in order to join his copyright, but his mail address is invalid.
        (desktop-textures@avernus.com). Most of these backgrounds and much more
        can be obtained in the AIcons package on ftp.x.org. Particularly in
        cl-bgnd/Textures : bg_blu.gif, concrete.gif, marble1.gif, sharks.gif
        bg_grn.gif, granite_dark.gif, marble2.gif, snails.gif, coarse.gif,
        granite_light.gif and pool.gif.

   15 - New keyword : BorderResizeCursors with no parameter. If used ctwm
	will put nice cursors when the cursor in on the window borders.
	To be used when you have bound a button to f.resize in the frame context.

   16 - The xpm files are now installed in $(TWMDIR)/images instead of $(TWMDIR).

   17 - Due to the many problems I had with signals being slightly different
	on different systems, I rewrote the animation handling without using
	signals anymore. I hope it is more portable. The old code is still
	available if you define USE_SIGNALS.


    Changes from version 3.2 to 3.3
    1995-02-11 (or earlier)
    -------------------------------

    1 - Better 3D borders with SqueezeTitle.

    2 - New keywords : BorderShadowDepth, TitleButtonShadowDepth,
        TitleShadowDepth, MenuShadowDepth and IconManagerShadowDepth. You can
        modify the depth of the 3D shadow of all the objects.

    3 - f.altcontext. a new context named "alter" is introduced. The next key
        or button event after a call to f.altcontext will be interpreted using
        the alternate context. To define bindings in the alternate context, use
        the keyword alter in the context field of the binding command.

    4 - f.altkeymap. Up to 5 alternate modifiers (a1 to a5). The next key
        or button event after a call to f.altkeymap will be interpreted with
        this alternate modifies set. To define bindings with an alternate
        modifier, use the keyword 'a' followed by the number of the modifier in
        the modifier field of the binding command. Only the root, window, icon
        and iconmgr context are allowed when an alternate modified is used.

    5 - Default menu entry : If a menu entry name begins with a '*' (star),
        this star won't be displayed and the corresponding entry will be the
        default entry for this menu. When a menu has a default entry and is used
        as a pull-right in another menu, this default entry action will be executed
        automatically when this submenu is selected without beeing displayed.
        It's hard to explain, but easy to understand.

    6 - New keywords : ReallyMoveInWorkspaceManager and
        AlwaysShowWindowWhenMovingFromWorkspaceManager.
        ReallyMoveInWorkspaceManager tells ctwm to move the actual window when
        the user is moving the small windows in the WorkSpaceMap window.
        AlwaysShowWindowWhenMovingFromWorkspaceManager tells ctwm to always
        map the actual window during the move, regardless of whether it crosses
        the current workspace or not. The Shift key toggles this behaviour.

    7 - 4 new functions :f.rightworkspace, f.leftworkspace, f.upworkspace
        and f.downworkspace. Do what you expect.

    8 - The function f.raiseicons (from Rickard Westman <ricwe@ida.liu.se>).
        Raises all icons.

    9 - A new keyword : IconRegionAlignement. Like IconRegionJustification
        but align vertically. The parameter is "top", "center", "bottom" or
        "border".

   10 - f.addtoworkspace, f.removefromworkspace and f.toggleoccupation. (idea
        from Kai Grossjohann <grossjoh@linus.informatik.uni-dortmund.de>). They
        take one argument that is a workspace name. When applied to a window,
        they add to, remove from, or toggle the occupation of this window in
        this workspace.

   11 - AlwaysOnTop (from Stefan Monnier <monnier@di.epfl.ch>). Accept a list
        of windows as argument. Ctwm will do it's best to keep these windows
        on top of the screen. Not perfect.

   12 - f.movepack, f.movepush, MovePackResistance. f.movepack is like f.move,
        but it tries to avoid overlapping of windows on the screen.  When the
        moving window begin to overlap with another window, the move is stopped.
        If you go too far over the other window (more that MovePackResistance
        pixels), the move is resumed and the moving window can overlap with
        the other window. Useful to pack windows closely. Instead of stopping
        the move, f.movepush tries to push the other window to avoid overlap.
        f.movepush is here mainly because I found it amusing to do it. Is is
        not very useful.

   13 - TitleJustification : Takes one string argument : "left", "center", or
        "right". Tells ctwm how to justify the window titles.


   14 - UseThreeDWMap : Tells ctwm to use 3D decorations for the small windows
	in the workspace map.


   15 - ReverseCurrentWorkspace : Tells ctwm to reverse the background and
	foreground colors in the small windows in the workspace map for the
	current workspace.

   16 - DontWarpCursorInWMap : Tells ctwm not to warp the cursor to the
	corresponding actual window when you click in a small window in the
	workspace map.

   17 - If there is neither MapWindowBackground, nor MapWindowForeground in the
	config file,the window title colors are used for the small windows in the
	workspace map.




    Changes from version 3.3 to 3.4
    1996-09-14 (or earlier)
    -------------------------------

    1 - 2 new keywords : XMoveGrid and YMoveGrid with an integer parameter.
        Constrains window moves so that its x and y coordinates are multiple
        of the specified values. Useful to align windows easily.

    2 - New function : f.deleteordestroy. First tries to delete the window
        (send it WM_DELETE_WINDOW message), or kills it, if the client doesn't
        accept such message.

    3 - New function : f.squeeze. It squeezes a window to a null vertical
        size. Works only for windows with either a title, or a 3D border
        (in order to have something left on the screen). If the window is
        already squeezed, it is unsqueezed.

    4 - New built-in title button : :xpm:vbar (a vertical bar).

    5 - CenterFeedbackWindow : The moving and resizing information window
        is centered in the middle of the screen instead of the top left
        corner.

    6 - 2 New options :

            -version : Ctwm just prints its version number and exits.
            -info    : Ctwm prints its detailed version and compile time
                       options.

    7 - WarpToDefaultMenuEntry (Useful only with StayUpMenus) : When using
        StayUpMenus, and a menu does stays up, the pointer is warped to
        the default entry of the menu. Try it. Can emulate double click.
        For example :

Button2 =	: icon		: f.menu "iconmenu"
menu "iconmenu" {
    "Actions"		f.title
    ""			f.separator
    "*Restore"		f.iconify
    "Move"		f.move
    "Squeeze"		f.squeeze
    "Occupy ..."	f.occupy
    "Occupy All"	f.occupyall
    ""			f.separator
    "Delete"		f.deleteordestroy
}
        will result in DoubleButton2 on an icon uniconifies it.


    8 - When you popup a menu that is constrained by the border of the screen
        the pointer is warped to the first entry. (Avoid exiting ctwm when you
        just want to refresh the screen).

    9 - When compiled with X11R6 defined, ctwm supports ICE session management.
        (the code has been stolen directly from the X11R6 twm, it has not been
        thoroughly tested, humm... actually, not tested at all).

   10 - SchrinkIconTitles : A la Motif schrinking of icon titles, and expansion
        when mouse is inside icon.

   11 - AutoRaiseIcons : Icons are raised when the cursor enters it. Useful
        with SchrinkIconTitles.


Patches from Matt Wormley <mwormley@airship.ardfa.calpoly.edu>

------------------

   12 - XPM files for title bars or buttons may include the following symbolic
        colors. These symbolic colors allow the possiblity of using the same
        3d XPM file with different colors for different titlebars.

        Background: The main color to be used by the title bar
        HiShadow:   The color to be used as the highlight
        LoShadow:   The color to be used as the dark shadow.

        Using these colors, I have built some 3d XPM files for various
        titlebars while still keeping the ability to change titlebar colors.

   13 - Added a keyword to the .ctwmrc file: "UseSunkTitlePixmap".  This
        makes it so the shadows are inversed for title pixmaps when focus is
        lost.  This is similar to having the SunkFocusWindowTitle, but it
        makes your 3d XPM sink instead of just the whole bar.

   14 - Added 3 new builtin 3d buttons for "Iconify", "Resize" and "Box". They
        are available with the :xpm: identifier in the .ctwmrc file.

   15 - Added another keyword to the .ctwmrc file: "WorkSpaceFont". This
        allows you to specify the font to use in the workspace manager.

   16 - 8 new xpm pixmaps for buttons, title highlite, etc... :
        3dcircle.xpm 3ddimple.xpm 3ddot.xpm 3dfeet.xpm 3dleopard.xpm 3dpie.xpm
        3dpyramid.xpm 3dslant.xpm


------------------


Patches from Scott Bolte <scottb@cirque.moneng.mei.com>

------------------

    17 - 2 new functions : f.forwmapiconmgr and f.backmapiconmgr, similar to
         f.forwiconmgr and f.backiconmgr but only stops on mapped windows.

------------------


   18 - Last minute : PixmapDirectory now accept a colon separated list of
        directories.

   19 - If you use m4, ctwm now defines TWM_VERSION which is the version in
        the form of floating point (e.g. 3.4).

   20 - I forgot to tell that IconRegion has now 3 more optionnal parameters
        iconjust, iconregjust and iconregalign. That can be used to give
        special values to IconJustification, IconRegionJustification and
        IconRegionAlignement for this IconRegion. The new syntax is :

IconRegion geomstring vgrav hgrav gridwidth gridheight [iconjust] [iconregjust] \
           [iconregalign] [{ win-list }]


    Changes from version 3.4 to 3.5
    1997-11-27 (or earlier)
    -------------------------------


    1 - f.pack direction
	Where direction is either : "right", "left", "top" or "bottom"
	The current window is moved in the specified direction until it reaches
	an obstacle (either another window, or the screen border). The pointer
	follows the window. Example :

"Right" = m   : window        : f.pack "right"
"Left"  = m   : window        : f.pack "left"
"Up"    = m   : window        : f.pack "top"
"Down"  = m   : window        : f.pack "bottom"

    2 - f.fill direction
	Where direction is either : "right", "left", "top" or "bottom"
	The current window is resized in the specified direction until it
	reaches an obstacle (either another window, or the screen border).

"Right" = s|m   : window        : f.fill "right"
"Left"  = s|m   : window        : f.fill "left"
"Up"    = s|m   : window        : f.fill "top"
"Down"  = s|m   : window        : f.fill "bottom"

    3 - f.savegeometry
	The geometry of the current window is saved. The next call to
	f.restoregeometry will restore this window to this geometry.
	
    4 - f.restoregeometry
	Restore the current window geometry to what was saved in the last
	call to f.savegeometry.

    5 - ShortAllWindowsMenus
	Don't show WorkSpaceManager and IconManagers in the TwmWindows and
	TwmAllWindows menus.

    6 - f.toggleworkspacemgr
	Toggle the presence of the WorkSpaceManager. If it is mapped, it will
	be unmapped and vice verça.

    7 - OpenWindowTimeout number
	number is an integer representing a number of second. When a window
	tries to open on an unattended display, it will be automatically
	mapped after this number of seconds.

    8 - DontSetInactive { win-list }
	These windows won't be set to InactiveState when they become invisible
	due to a change workspace. This has been added because some ill-behaved
	clients (Frame5) don't like this.

    9 - UnmapByMovingFarAway { win-list }
	These windows will be moved out of the screen instead of beeing
	unmapped when they become invisible due to a change workspace. This has
	been added because some ill-behaved clients (Frame5) don't like to be
	unmapped. Use this if point 8 doesn't work.

   10 - AutoSqueeze { win-list }
	These windows will be auto-squeezed. i.e. automatically unsqueezed when
	they get focus, and squeezed when they loose it. Useful for the
	workspace manager. (Note, it is not possible to AutoSqueeze icon managers).

   11 - StartSqueezed  { win-list }
	These windows will first show up squeezed.

   12 - RaiseWhenAutoUnSqueeze
	Windows are raised when auto-unsqueezed.

   13 - Now if the string "$currentworkspace" is present inside the string
	argument of f.exec, it will be substituated with the current workspace
	name. So it is possible to do something like :

	f.exec "someclient -xrm ctwm.workspace:$currentworkspace&"

	and the client will popus up in the workspace where the command was
	started even if you go elsewhere before it actually shows up.

   14 - Fixes the VMS version. From Richard Levitte - VMS Whacker
	<levitte@lp.se>.

   15 - Better I18N. From Toshiya Yasukawa <t-yasuka@dd.iij4u.or.jp>. (Define
	I18N in Imakefile to activate it).

   16 - Better Session Management interface. Patches from Matthew McNeill
	<M.R.McNeill@durham.ac.uk>.

   17 - new flag : -name, useful only for captive Ctwm. Sets the name of the
	captive root window. Useful too for next point. If no name is specified
	ctwm-n is used, where n is a number automatically generated.

   18 - Two new client resources are now handled by Ctwm :

ctwm.redirect: <captive_ctwm_name>

    The new client window is open in the captive Ctwm with name :
    <captive_ctwm_name>.

ctwm.rootWindow: <window_id>

    The new client window is reparented into <window_id> (whaa!!!).
    It is up to you to find any usefullness to this.

   19 - If the string "$redirect" is present inside the string
	argument of f.exec, it will be substituated with a redirection
	to the current captive Ctwm if any (or nothing if in a main Ctwm).
	So it is possible to do something like :

	f.exec "someclient $redirect&"

	and the client will popus up in the right captive Ctwm.

   20 - New function f.hypermove. With it, you can drag and drop a window
	between 2 captives Ctwm (or between a captive and the root Ctwm).

   21 - 2 new m4 variables defined in your startup file :

TWM_CAPTIVE : value "Yes" if Ctwm is captive, "No" else.
TWM_CAPTIVE_NAME : The name of the captive Ctwm, if captive.

   22 - RaiseOnClick : if present a window will be raised on top of others
	when clicked on, and the ButtonPress event will be correctly forwarded
	to the client that owns this window (if it asked to).

	RaiseOnClickButton <n> : Button number to use for RaiseOnClick.

   23 - IgnoreLockModifier : if present, all bindings (buttons and keys) will
	ignore the LockMask. Useful if you often use caps lock, and don't
	want to define twice all your bindings.

   24 - AutoFocusToTransients
	Transient windows get focus automatically when created.  Useful with 
	programs that have keyboard shortcuts that pop up windows.
	(patch from Kai Grossjohann <grossjohann@charly.cs.uni-dortmund.de>).

   25 - PackNewWindows
	Use f.movepack algorithm instead of f.move when opening a new window.



    Changes from version 3.5 to 3.5.1
    1999-05-02 (or earlier)
    ---------------------------------


    1 - f.initsize : resets a window to its initial size given by the
	WM_NORMAL_HINTS hints.

    2 - f.ring : Selects a window and adds it to the WarpRing, or removes it if
	it was already in the ring. This command makes f.warpring much more
	useful, by making its configuration dynamic (thanks to Philip Kizer
	<pckizer@tamu.edu>).

    3 - f.jumpleft, f.jumpright, f.jumpup, f.jumpdown : takes one integer
	argument (the step). These function are designed to be bound to keys,
	they move the current window (step * {X,Y}MoveGrid) pixels in the
	corresponding direction. stopping when the window encounters another
	window (ala f.pack).


    Changes from version 3.5.1 to 3.5.2
    1999-09-10 (or earlier)
    -----------------------------------


    1 - f.moveresize : Takes one string argument which is a geometry with the
	standard X geometry syntax (e.g. 200x300+150-0). Sets the current
	window to the specified geometry. The width and height are to be given
	in pixel, no base size or resize increment are used.

    2 - AutoLower et f.autolower : from Kai Großjohann
	(Kai.Grossjohann@CS.Uni-Dortmund.DE). Same as autoraise but with lower.

    3 - WindowRingExclude : Takes a window list as argument. All listed windows
	will be excluded from the WarpRing.

    4 - A new menu : 'TwmIcons' same as 'TwmWindows', but shows only iconified
	windows. I did this when I got bored of having icons. Now I have no
	icons and no icon managers. I use this menu to deiconify windows.
	When I was young, I liked to have brightly colored icons, but now that
	I am getting old(er), I prefer a bare desktop.


    Changes from version 3.5.2 to 3.6
    2002-08-08 (or earlier)
    ---------------------------------

    1 - Fix line numbers for errors when using m4 preprocessor. Send thanks
	to Josh Wilmes <josh@hitchhiker.org>.

    2 - Fix the way menu entries are selected with the keyboard. Now
	when you type a letter, the pointer moves to the next entry
	whose first letter is this letter, but does not activate it.
	The new keyword IgnoreCaseInMenuSelection, can be used to
	ignore case for this delection.

    3 - New keyword : DontSave, Takes a window list as argument. All listed
	windows won't have their characteristics saved for the session manager.
	Patch from Matthias Baake <Matthias.Baake@gmx.de>

    4 - Also from Matthias Baake <Matthias.Baake@gmx.de>. I let him speak :
	With the new keywords BorderLeft, BorderRight, BorderBottom and BorderTop
	(each of them is optional with a default value of 0 and takes a
	nonnegative integer as argument) you can declare a border "off limits" for
	f.move etc.. These borders act the same way as the real borders of the
	screen when moving windows; you can use f.forcemove to override them. 

    5 - Sloppy Focus added with keyword "SloppyFocus" in configuration file
	(DINH V. Hoa <dinh@enserb.fr>).

    6 - the keyword "ClickToFocus" has been correctly implemented
	(DINH V. Hoa <dinh@enserb.fr>).

    7 - the keyword "IgnoreModifier" has been added,
	to use this feature, you have to add a line
	"IgnoreModifier { lock m2 }" in the configuration file.
	All bindings (buttons and keys) will ignore the modifiers
	you specified. It is useful when you use caps locks or 
	num locks. You don't need IgnoreLockModifier any more with this option.
	(DINH V. Hoa <dinh@enserb.fr>).

    8 - New keyword : WindowBox : creates a new window called a box, where
        all the client windows that match the windows list are opened in,
	instead of the roor window. This is useful to group small windows
	in the same box (xload for instance) :

WindowBox "xloadbox" "320x100+0-0" {
    "xload"
}

    9 - New function : f.fittocontent. Can be used only with window boxes.
	The result is to have the box have the minimal size that contains
	all its children windows.

   10 - New keyword : WindowGeometries. Used to give a default geometry to some
	clients :

WindowGeometries {
    "Mozilla*"       "1000x800+10+10"
    "jpilot*"        "800x600-0-0"
}

   11 - New keyword : IconMenuDontShow. Don't show the name of these windows
	in the TwmIcons menu.

    And, as usual, a few bug fixes here and there.


    Changes from version 3.6 to 3.7
    2005-07-19
    -------------------------------

    1 - Workspace context (bkctwmws.patch)

	Makes it possible to bind keys specific to the workspace manager
	(by Björn Knutsson). Use the event context 'workspace' for this.

    2 - New keyword : AlwaysSqueezeToGravity

	If it is enabled, window squeezing always follows window gravity
	(instead of northward when the window has a title).
	(by Rudolph T. Maceyko).

    3 - TwmKeys and TwmVisible menus (dlctwmmenu.patch) :

	Adds TwmKeys (rootmenu listing all keybindings) and TWM Visible (rootmenu
	showing only deiconified windows) (by Dan Lilliehorn).


    4 - Preliminary GNOME compliance (see README.gnome and TODO.gnome)
	(by Nathan Dushman).

    5 - IconifyStyle : "normal" "mosaic" "zoomin" "zoomout" "sweep"

	A few 'fancy' graphical effects when you iconify windows, just for fun.

    6 - Jpeg images support : You can now use jpeg image files wherever you
	can use images. Use the jpeg:imagename syntaxe.

    7 - f.showbackground.

	Since we can now use fancy jpeg image for root backgrounds, this function
	unmaps all windows in the current workspace. This is a toggle function,
	if all windows are unmapped, they are all remapped. Better bind this
	function in the root context.

    8 - Preliminary support for Xinerama extention. You can define 'virtual'
	screens (it's better if they correspond to you actual screens). The
	thing is that you can see several workspaces at the sams time, one per
	virtual screen. Of course, you cannot view the same workspace (or the
	same window) in 2 vscreens at the same time. The syntax is :

VirtualScreens {
    "1280x1024+0+0"
    "1600x1200+1280+0"
}

	for 2 screens, the first one (on the left) is 1280x1024, the second one
	(on the right) is 1600x1200.

	This is preliminary, because this has not been extensively tested. I did
	this because I have now 2 screens, but I was unable to get them working
	properly, so I use only one.


    [ At this point, Claude has stopped working on CTWM, and the project
      is now in the hands of Richard Levitte <richard@levitte.org>. ]

    9 - Changed Imakefile to support a distribution target.

   10 - Changed :xpm:cross to become a bit larger and have a slightly more
	3D appearance, and is visible even in very dark configurations.

   11 - Make AlwaysSqueezeToGravity to work for all windows (if no window
	list is given).

   12 - New keyword: NoImagesInWorkSpaceManager

	If it's enabled, background images aren't displayed in the workspace
	map.

	This was contributed by Thomas Linden.

   13 - New command line option: -cfgchk

	If used, CTWM will only parse the configuration file and indicate
	if it found errors or not.

	This was contributed by Matthew D. Fuller.

   14 - DontMoveOff patch (by Björn Knutsson)

	Change the behavior of DontMoveOff/MoveOffResistance so that
	when you attempt to move a window off screen, it will not move
	at all until it's been moved #MoveOffResistance pixels (as
	before), but at this time it will no longer "snap", but
	instead it will start moving off screen. This means that you
	still have the old behavior of DontMoveOff, but now with the
	ability to move a window off screen less that
	#MoveOffResistance pixels.

   15 - Random placement and DontMoveOff patch (by Björn Knutsson, changed)

	When random placement was used, DontMoveOff wasn't honored.
	This behavior has now changed so a window will be kept within
	the screen when at all possible.  When the window is too
	large, it's top or left edge (or both) will be placed in
	coordinate 0.
	This change differs a little bit from Björns contribution by
	not using rand() at all.

   16 - f.warpring patch (by Björn Knutsson)

	If IconManagerFocus is set, there's no reason why the icon
	manager should get enter and leave events.  This fixes some
	disturbing in the warpring that would otherwise happen.

   17 - f.movetoprevworkspace,
	f.movetonextworkspace,
	f.movetoprevworkspaceandfollow,
	f.movetonextworkspaceandfollow patch (by Daniel Holmström)

	Makes it possible to move a window to the previous or next  
	workspace and, if you like, go to that workspace and focus 
	the moved window.

   18 - f.fill "vertical" patch (by Daniel Holmström)

	Expands the window vertically without overlapping any other window, 
	much like { f.fill "top" f.fill "bottom" } but with the exception 
	that it doesn't expand over window borders. It also sets the 
	windows 'zoomed' to F_FULLZOOM, so one can toggle between this 
	size, original and maximized.

   19 - RESIZEKEEPSFOCUS bugfix patch (by Daniel Holmström)

	If a window is maximized with togglemaximize and then restored 
	it might loose focus if the cursor is outside the restored window. 
	This hack puts the cursor at the left-top corner of the window.

   20 - f.zoom bugfix patch (by Daniel Holmström)

	f.zoom now doesn't move the window up (as it sometimes did before)

   21 - IgnoreTransient patch (by Peter Berg Larsen)

	New keyword with list of windows for which to ignore transients.

   22 - Workspace switch peformance optimization (by MC)

	Stops ctwm from redrawing windows that occupy all workspaces when
	switching from one workspace to another.

   23 - GTK "group leader" bugfix (by Olaf 'Rhialto' Seibert)

	Makes ctwm aware of the mysterious GTK group leader windows.

   24 - Resize cursor with non-3D-borders bugfix (by Olaf 'Rhialto' Seibert)

	BorderResizeCursors now works also for top and left borders when
	non-3D-borders are used.

   25 - Memory leak bugfix (by Simon Burge)

 	GetWMPropertyString in util.c no longer leaks memory.

   26 - Warpring bugfix (by Takahashi Youichirou)

	Solves these two problems when warping the pointer to the 
	next/previous mapped window:

	o Sometimes the pointer moved right too much and ended up outside
	  the title bar.

	o When the active window was closed and the pointer ended up on the
          root window, the pointer wouldn't warp until moved with the mouse. 

   27 - NoWarpToMenuTitle patch (by Julian Coleman)

	Fixes the sometimes annoying feature that the cursor is warped to the 
	menu title if the menu won't fit on the screen below the current 
	pointer position. 

	This patch introduces a new keyword "NoWarpToMenuTitle" keyword to 
	turn this off. 

   28 - Scr->workSpaceMgr.windowFont font init bugfix (by Martin Stjernholm)

	The Scr->workSpaceMgr.windowFont in workmgr.c is now initialized.

   29 - Full GNU regex patch (by Claude Lecommandeur)

	It is now possible to use full GNU regex for window or class names by
	defining USE_GNU_REGEX in Imakefile. It is disabled in the default
	Imakefile.

   30 - DontToggleWorkSpaceManagerState patch (by Dan 'dl' Lilliehorn)

        New keyword to turn off the feature toggling the workspace manager
	state to/from map/button state when you press ctrl and the workspace
	manager window is in focus.

   31 - TWMAllIcons patch (by Dan 'dl' Lilliehorn)

	Adds the TWMAllIcons menu, listing all iconified windows on all
	workspaces.

   32 - f.changesize patch (by Dan 'dl' Lilliehorn)

	Adds the function f.changesize which allows you to change the size
	of the focused window via menus and keybindings.

	Example:
	"Down"     = c|s: all           : f.changesize "bottom +10"

   33 - f.changesize bugfix and improvement (by Dan 'dl' Lilliehorn)

	Fixes focusproblems with f.changesize and adds the ability to set
	a new fixed size of a window.

	Example:
	"F1"       = c|s: all           : f.changesize "640x480"

   34 - When crashing, ctwm now refers to ctwm-bugs@free.lp.se instead of
	Claude.Lecommandeur@epfl.ch.

   35 - Changed all the code to use ANSI C prototypes instead of the old
	K&R style.
	[Richard Levitte]

   36 - Only use the DefaultFunction if no function was found.
	[Richard Levitte]

   37 - Correct DontMoveOff

	The DontMoveOff checks when calculating random placement
	wasn't satisfactory.  It ended up placing all windows that
	were small enough to fit in a random place at +50+50 with no
	exception.  The behavior has now been changed to only apply
	to very large windows (almost as large as or larger than the
	screen).  At the same time, the RandomPlacement algorithm and
	the DonMoveOff checks have been tweaked to keep the title
	height in mind, so centering and coordinates correspond to the
	realities of the rest of CTWM.
	[Richard Levitte]

   38 - Correct resizing from menu

	Choosing resize from the menu when not having 3D borders moved
	the target window down and right by a border width.  This was
	an error in window position calculations.
	[Richard Levitte]

   39 - Enhanced info window

	Added the outer geometry.  Added the 3D border width.
	[Richard Levitte]

   40 - Restart on subsequent SIGHUPs

	Reworked the code that catches a SIGHUP and has ctwm restart as
	a result.  The restarting code has moved from Restart() to the new
	DoRestart().  Restart() now only sets a flag, and CtwmNextEvent()
	has been changed to react to that flag and call DoRestart().  From
	now on, CtwmNextEvent() is always used to get the next event, even
	when no animations are going on.
	[Richard Levitte]

   41 - A number of VMS-related changes

	DEC/HP PC is a bit picky, the X11 environment is a little bit
	different, and there were some sign/unsigned conflicts and one
	too large symbol (the VMS linker truncates anything beyond the
	31 first characters of any symbol name), so some tweaks were
	needed to get CTWM to build cleanly on VMS.
	[Richard Levitte]

   42 - Allow gcc users to build with paranoia

	To make it easier to find possible problems, the Imakefile macro
	GCC_PEDANTIC can be defined in Imakefile.local.
	[Richard Levitte]

   43 - Allow spaces in sound files.

	The .ctwm-sounds file parser would clip sound files at the first
	spaces.  That won't do for sound libraries where file names may
	have spaces in them.  The parser now accepts spaces in file names,
	and will trim spaces from the beginning and the end of both file
	names and event tokens, allowing for a slightly more flexible
	format.
	[Richard Levitte]

   44 - ctwm.spec

        Added a specification file for RPM building.
	[Richard Levitte]

   45 - More info for m4

	The m4 subprocess now gets the variable PIXMAP_DIRECTORY, which
	is defined to the directory where the pixmaps are installed, and
	the new flags IMCONV, GNOME, SOUNDS, SESSION and I18N.
	[Richard Levitte]

   46 - Document sounds

	The sounds system is now documented in the man page.
	[Richard Levitte]

   47 - Build RPMs

	Added the target "rpm" to build an RPM directly from a distribution
	tarball.
	[Richard Levitte]

   48 - Make life easier for package builders

	Added the possibility to configure where some libraries can be found
	through the use of USER_* make variables in Imakefile.local.  Added
	a lot more commentary in Imakefile.local-template.
	[Richard Levitte]

   49 - Make it easier to configure on VMS

	Moved all the configuration definitions to descrip.local-template,
	and instruct the users to copy that file to descrip.local and make
	all needed changes there.
	[Richard Levitte]

   50 - Changed all relevant occurences of levitte@lp.se to
	richard@levitte.org.
	[Richard Levitte]


    Changes from version 3.7 to 3.8
    2007-02-16
    -------------------------------

    1 - Global cleanup

	There were some variables shadowing others, things not being
	safely initialized, that sort of thing.
	[Richard Levitte]

    2 - Fixed several memory leaks found by
	"Nadav Har'El" <nyh@math.technion.ac.il>.
	[Olaf "Rhialto" Seibert]

    3 - Merged in the f.movetitlebar command. By default this is bound to
        alt-left-click in the titlebar.
	[Olaf "Rhialto" Seibert]

    4 - Fixed the following issues:
	Poking at the code, it looks like InitVirtualScreens() is called
	before the configuration file is parsed which would explain what
	I see since there's no attempt to create them after the config
	file read.

	Moving the call after the config parsing causes things to work.

	I've run into a few other issues that I fixed with the attached
	patch:

		- shadow menus on the right screen open the shadow on
		  the left screen
		- shadow menus on the left screen open on top of the
		  window
		- windows on the right screen disappear after startup
	[Todd Kover]

    5 - Adjustments to ctwm.man:
	I noticed a couple of small errors.

	One is that the window list arguments for the opaque
	keywords are now optional, are listed with square brackets
	in the man page.  The other is that the two Threshold
	keywords are shown in the man page as requiring curly-
	brackets, but they are not required or accepted in
	configuration files.
	[Ross Combs]

    6 - improve algoritm to deal with mismatched geometry of virtual
	screens

      - allow windows to be dragged from one virtual screen to another and
	have them switch workspaces appropriately

      - handle restarts properly with virtual screens, including preserving
	where windows were placed within workspaces regardless of which
	virtual screen a window was on; preserve across restarts
	[Todd Kover]

    7 - WMapCreateCurrentBackGround() and WMapCreateDefaultBackGround() 
	would skip remaining virtual screens if not all parameters are present.

      - small type errors. [Olaf "Rhialto" Seibert].

    8 - There were some directives in the config file that wanted to set some
	setting for all virtual screens. However since that list is (now) only
	set up after parsing the config file, they failed to work.  Moreover,
	these settings were basically meant to be global to all virtual
	screens, so a better place for them is somewhere in *Scr.  They all
	related to the Workspace Manager, so I moved them from struct
	WorkSpaceWindow to struct WorkSpaceMgr.

	The affected directives are StartInMapState, WMgrVertButtonIndent,
	WMgrHorizButtonIndent, MapWindowCurrentWorkSpace,
	MapWindowDefaultWorkSpace.  The window and icon_name, even though not
	user-settable, were also moved.
	
	This is basically change #7 above done right.
	[Olaf "Rhialto" Seibert]

    9 - Re-introduced TwmWindow.oldvs, used to avoid calling
	XReparentWindow() when possibe (it messed up the stacking order
	of windows). However, maybe the use of .vs should be rethought a
	bit: in Vanish() it is now set to NULL with the old value kept
	in .oldvs.  However the window is still a child of the same vs.
	Maybe it is better not to set it to NULL and then, when *really*
	changing the virtual screen, .vs can be used instead of .oldvs.

	This whole "virtual screen" thing is unexplained in the manual,
	which even uses it as a synonym for "workspace" already in the
	introduction paragraph. (There also does not seem to be a way
	now to test virtual screens in captive windows) I suspect that
	all this causes lots of confusion, and when cleared up, can
	simplify the code a lot. 

	I also fixed up the horrible indentation in the functions
	where I changed something.
	[Olaf "Rhialto" Seibert]

   10 - Fixed interaction between "inner" and "outer" workspace
	selection with "captive" windows. This was because the Gnome
	"_WIN_WORKSPACE" property is used in 2 conflicting ways: for
	client windows it indicates which workspace they are in, for
	root windows it indicates which workspace they show. Captive
	windows are both. Also, the initially selected inner workspace
	is now the first, not the same as the outer workspace (this had
	a different cause).
	[Olaf "Rhialto" Seibert]

   11 - Introduce Scr->XineramaRoot to store the root window that
	encompasses all virtual screen rootwindows. This further reduces
	any need to use RealRoot and/or CaptiveRoot.
	Add a schematic drawing that clarifies the relation between the
	various root-type windows.
	[Olaf "Rhialto" Seibert]

   12 - Get rid of all non-locale code and make I18N the silent default
	(doesn't have to be mentioned any more).
	THIS WILL BREAK CTWM ON OLDER (PRE-LOCALE) ENVIRONMENTS.
	I strongly recommend an upgrade to "post-locale" standards.
	[Richard Levitte]

   13 - Enhance RandomPlacement with a displacement argument, so the
	pseudo-radomness can be of displacements other than +30+30.
	Here's an example for a pretty funky displacement:

		RandomPlacement "on" "-30-100"

	[Richard Levitte]

   14 - Extend the Info window with the geometry seen from the lower
	right corner as well.
	[Richard Levitte]

   15 - Extend the pointer button specification for title buttons
	to take modifiers.
	As part of this change, the following title pointer button
	specification is deprecated:

		Button {j} : {function}

	in favor of the following, for consistency:

		Button {j} = {function}

	The old way still works, but is considered bad form and will
	be removed in ctwm 4.0.
	[Richard Levitte]

   16 - Fix position of buttons in Occupy window, to make them centered.
	(and spread the remaining space evenly in 4).
	[Olaf "Rhialto" Seibert]

   17 - "TwmWindow.group" was once apparently set to 0 when a window had
	no group leader but this was changed to pointing to its own
	window.  This resulted however in many places checking for both
	conditions, and several checking only for 0 which could not
	occur anymore. Changed it back to 0 (so we can now distinguish
	again windows that really indicate themselves as group leader,
	if we wish) and this gave rise to some simplifications.

	Also, there were various loops through all TwmWindows looking
	for a group leader (or a transientfor), I replaced them with
	GetTwmWindow() which uses the Xlib function XFindContext() which
	uses a hash table lookup. This should be more efficient.

	When you change the occupation of a group member window, it is
	now applied to the group leader (which in turn affects all
	members).

	I tried this with ExMH, the only program that uses a real group
	leader that I could find. Iconifying the leader unmaps the
	members. What should "squeezing" do? ExMH also has an icon
	window (see ICCCM 4.1.9, 3rd option) which behaves weirdly; this
	may be a bug in ExMH (see exmh-2.7.2/exmh.BUGS) even though fvwm
	somehow handles it better.
	[Olaf "Rhialto" Seibert]

   18 - When Squeezing a window group leader, unmap the member windows,
	just like happens with iconification.
	[Olaf "Rhialto" Seibert]

   19 - Simplifications c.q. de-duplications of code regarding the
	WorkSpaceManager and Occupation windows. This includes coding
	the layout of these windows only once instead of twice (at
	initialisation and when resizing). If it's wrong now at least it
	should be consistent.
	When changing occupation via functions like
	f.movetonextworkspace, also move complete window groups (just
	like when you do it via the Occupation window).
	Also fixed changing the occupation of the Occupation window.
	Documented (so far) undocumented possibility to edit the labels
	of workspaces on the fly (what use this is, I'm not sure).
	Removed some unused variables.
	[Olaf "Rhialto" Seibert]

   20 - Get rid of the USE_SESSION and X11R6 macros and make them the
	silent default.  Also cleaned out a few references to the macro
	X11R4, which hasn't been used for ages.
	THIS WILL BREAK CTWM ON OLDER (PRE-X11R6) ENVIRONMENTS.
	I strongly recommend an upgrade to a newer X11 release.
	[Richard Levitte]

   21 - Modified the random placement so a negative X displacement has
	the first "random" window start near the right edge instead of
	the right and a negative Y displacement has the first "random"
	window start near the bottom edge instead of the top.
	[Richard Levitte]


    Changes from version 3.8 to 3.8.1
    2012-01-05
    ---------------------------------

    1 - Fix bug causing [de]iconified status of windows to not be
        maintained across workspaces.
        [Matthew Fuller]

    2 - Quite a bunch of compiler warnings.
        [Matthew Fuller]

    3 - Make sure we fully initialize our WorkSpaceWindow structure so
        we don't try to dereference uninitialized pointers later on.
        [Matthew Fuller]

    4 - Increased the number of supported mouse buttons again, having
	just heard of a mouse with 9 possible buttons...
	[Richard Levitte]

    5 - Fix a bug in the warping "next" function, where if there is a
	single window and the cursor is not on it, invoking 'f.warpring
	"next"' does nothing.
	[Martin Blais]

    6 - Introduce a new feature called "SaveWorkspaceFocus", which when
	enabled, makes ctwm remember which window has the focus within
	each virtual workspace. As you switch workspaces, the cursor is
	automatically warped to the window previous in focus in the
	workspace. This significantly reduces the amount of mouse use.
	[Martin Blais]

    7 - From Matthias Kretschmer <kretschm@cs.uni-bonn.de>:
	f.fill patch.
	Without the patch, you might get windows which are increased by
	two times the border width more than it should be.  Additionally
	if you place a window with no/not much size contrainst like
	firefox in the upper left corner and perform f.fill "top" or
	f.fill "left" the size of the window will increase by two times
	the border width in width and height without changing the
	top-left coordinate without the patch.  Of course in such a
	situation the size should not change at all...                 
	[via Olaf Seibert]


    Changes from version 3.8.1 to 3.8.2
    2014-??-??
    -----------------------------------

    1 - Various code cleanups.
	Cleanup re: raising and warping to windows (previous location of
	pointer in windows), SaveWorkspaceFocus. A few extra NULL
	pointer checks.
	Logical hasfocusvisible cleanup.
	Rename TwmWindow.list to iconmanagerlist, and various smaller
	cleanups.
	Eliminated TwmWindow TwmRoot from struct ScreenInfo. Mostly a
	mechanical change.
	I found some cases where the dummy TwmWindow was apparently
	mistakenly included in a loop. Replaced .next with TwmWindow
	*FirstWindow and .cmaps witn Colormaps RootColormaps. Other
	members were not used.

    2 - Fix a bug where insufficient validation of the size hints
        resulted in a division by zero when considering aspect ratio.

    3 - Lots of minor compiler warnings and build fixes, a few of which
        were real current or latent bugs.  Leave warnings enabled by
        default.  A few of the build system adjustments may break very
        old systems (e.g., those with original AT&T yacc).

    4 - Fix incorrect inclusion of $DESTDIR in some paths.

    5 - Update for new website and mailing list at ctwm.org.

    6 - Look at _MOTIF_WM_HINTS for titlebar-less or border-less
	windows.
